aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--README.md2
-rw-r--r--cmake/genrev.cmake16
-rw-r--r--cmake/macros/FindMySQL.cmake2
-rw-r--r--cmake/macros/FindOpenSSL.cmake2
-rw-r--r--dep/CMakeLists.txt1
-rw-r--r--dep/PackageList.txt4
-rw-r--r--dep/cppformat/CMakeLists.txt35
-rw-r--r--dep/cppformat/ChangeLog.rst335
-rw-r--r--dep/cppformat/LICENSE22
-rw-r--r--dep/cppformat/format.cc1224
-rw-r--r--dep/cppformat/format.h2680
-rw-r--r--dep/cppformat/posix.cc252
-rw-r--r--dep/cppformat/posix.h344
-rw-r--r--sql/updates/world/2015_01_30_00_world.sql32
-rw-r--r--sql/updates/world/2015_01_31_00_335.sql3
-rw-r--r--sql/updates/world/2015_02_02_00_world.sql16
-rw-r--r--sql/updates/world/2015_02_05_00_world.sql4
-rw-r--r--sql/updates/world/2015_02_06_00_world.sql27
-rw-r--r--sql/updates/world/2015_02_06_01_world.sql40
-rw-r--r--sql/updates/world/2015_02_06_02_world.sql33
-rw-r--r--sql/updates/world/2015_02_06_03_world.sql62
-rw-r--r--sql/updates/world/2015_02_06_04_world.sql32
-rw-r--r--sql/updates/world/2015_02_06_05_world.sql45
-rw-r--r--sql/updates/world/2015_02_06_06_world.sql2
-rw-r--r--sql/updates/world/2015_02_06_07_world.sql6
-rw-r--r--sql/updates/world/2015_02_06_08_world.sql4
-rw-r--r--sql/updates/world/2015_02_06_09_world.sql11
-rw-r--r--sql/updates/world/2015_02_06_10_world.sql2
-rw-r--r--sql/updates/world/2015_02_06_11_world.sql7
-rw-r--r--sql/updates/world/2015_02_06_12_world.sql2
-rw-r--r--sql/updates/world/2015_02_06_13_world_335.sql372
-rw-r--r--sql/updates/world/2015_02_07_00_world.sql14
-rw-r--r--sql/updates/world/2015_02_07_01_world.sql2
-rw-r--r--sql/updates/world/2015_02_09_00_world.sql10
-rw-r--r--sql/updates/world/2015_02_09_01_world.sql2
-rw-r--r--sql/updates/world/2015_02_09_02_world.sql2
-rw-r--r--sql/updates/world/2015_02_09_03_world.sql204
-rw-r--r--sql/updates/world/2015_02_09_04_world.sql85
-rw-r--r--sql/updates/world/2015_02_09_05_world.sql52
-rw-r--r--sql/updates/world/2015_02_09_06_world.sql340
-rw-r--r--sql/updates/world/2015_02_09_07_world.sql461
-rw-r--r--sql/updates/world/2015_02_09_08_world.sql2
-rw-r--r--sql/updates/world/2015_02_09_09_world.sql2
-rw-r--r--sql/updates/world/2015_02_09_10_world.sql32
-rw-r--r--sql/updates/world/2015_02_09_11_world.sql252
-rw-r--r--sql/updates/world/2015_02_09_12_world.sql2
-rw-r--r--sql/updates/world/2015_02_09_13_world.sql43
-rw-r--r--sql/updates/world/2015_02_09_14_world.sql2
-rw-r--r--sql/updates/world/2015_02_09_15_world.sql1
-rw-r--r--sql/updates/world/2015_02_10_00_world.sql18
-rw-r--r--sql/updates/world/2015_02_10_01_world.sql12
-rw-r--r--sql/updates/world/2015_02_10_02_world.sql41
-rw-r--r--sql/updates/world/2015_02_10_03_world.sql7
-rw-r--r--sql/updates/world/2015_02_10_04_world.sql15
-rw-r--r--sql/updates/world/2015_02_10_05_world.sql911
-rw-r--r--sql/updates/world/2015_02_10_06_world.sql58
-rw-r--r--sql/updates/world/2015_02_10_07_world.sql3
-rw-r--r--sql/updates/world/2015_02_10_08_world.sql3
-rw-r--r--sql/updates/world/2015_02_10_09_world.sql4
-rw-r--r--sql/updates/world/2015_02_11_00_world.sql12
-rw-r--r--sql/updates/world/2015_02_11_01_world.sql100
-rw-r--r--sql/updates/world/2015_02_11_02_world.sql153
-rw-r--r--sql/updates/world/2015_02_11_03_world.sql5
-rw-r--r--sql/updates/world/2015_02_11_04_world.sql44
-rw-r--r--sql/updates/world/2015_02_11_05_world.sql4
-rw-r--r--sql/updates/world/2015_02_12_00_world.sql2
-rw-r--r--sql/updates/world/2015_02_12_01_world.sql4
-rw-r--r--sql/updates/world/2015_02_12_02_world.sql6
-rw-r--r--sql/updates/world/2015_02_12_03_world.sql14
-rw-r--r--sql/updates/world/2015_02_12_04_world.sql4
-rw-r--r--sql/updates/world/2015_02_12_05_world.sql37
-rw-r--r--sql/updates/world/2015_02_12_06_world.sql2
-rw-r--r--sql/updates/world/2015_02_12_07_world.sql53
-rw-r--r--sql/updates/world/2015_02_12_08_world.sql68
-rw-r--r--sql/updates/world/2015_02_12_09_world.sql2
-rw-r--r--sql/updates/world/2015_02_12_10_world.sql62
-rw-r--r--sql/updates/world/2015_02_13_00_world.sql58
-rw-r--r--sql/updates/world/2015_02_13_01_world.sql66
-rw-r--r--sql/updates/world/2015_02_13_02_world.sql144
-rw-r--r--sql/updates/world/2015_02_13_03_world.sql12
-rw-r--r--sql/updates/world/2015_02_13_04_world.sql4
-rw-r--r--sql/updates/world/2015_02_13_05_world.sql74
-rw-r--r--sql/updates/world/2015_02_13_06_world.sql24
-rw-r--r--sql/updates/world/2015_02_13_07_world.sql34
-rw-r--r--sql/updates/world/2015_02_13_08_world.sql15
-rw-r--r--sql/updates/world/2015_02_13_09_world.sql3
-rw-r--r--sql/updates/world/2015_02_14_00_world.sql8
-rw-r--r--sql/updates/world/2015_02_14_01_world.sql163
-rw-r--r--sql/updates/world/2015_02_14_02_world.sql51
-rw-r--r--sql/updates/world/2015_02_14_03_world.sql1
-rw-r--r--sql/updates/world/2015_02_14_04_world.sql111
-rw-r--r--sql/updates/world/2015_02_14_05_world.sql51
-rw-r--r--sql/updates/world/2015_02_15_00_world.sql456
-rw-r--r--sql/updates/world/2015_02_15_01_world.sql7
-rw-r--r--sql/updates/world/2015_02_15_02_world.sql56
-rw-r--r--sql/updates/world/2015_02_15_03_world.sql53
-rw-r--r--sql/updates/world/2015_02_15_04_world.sql11
-rw-r--r--sql/updates/world/2015_02_15_05_world.sql27
-rw-r--r--sql/updates/world/2015_02_15_06_world.sql10
-rw-r--r--sql/updates/world/2015_02_15_07_world.sql4
-rw-r--r--sql/updates/world/2015_02_15_08_world.sql27
-rw-r--r--sql/updates/world/2015_02_15_09_world.sql10
-rw-r--r--sql/updates/world/2015_02_15_10_world.sql5
-rw-r--r--sql/updates/world/2015_02_15_11_world.sql9
-rw-r--r--sql/updates/world/2015_02_15_12_world.sql61
-rw-r--r--sql/updates/world/2015_02_15_13_world.sql84
-rw-r--r--sql/updates/world/2015_02_15_14_world.sql5
-rw-r--r--sql/updates/world/2015_02_16_00_world.sql2
-rw-r--r--sql/updates/world/2015_02_16_01_world.sql2
-rw-r--r--sql/updates/world/2015_02_16_02_world.sql5
-rw-r--r--sql/updates/world/2015_02_16_03_world.sql29
-rw-r--r--sql/updates/world/2015_02_16_04_world.sql10
-rw-r--r--sql/updates/world/2015_02_16_05_world.sql7
-rw-r--r--sql/updates/world/2015_02_16_06_world.sql405
-rw-r--r--sql/updates/world/2015_02_17_00_world.sql136
-rw-r--r--sql/updates/world/2015_02_17_01_world.sql35
-rw-r--r--sql/updates/world/2015_02_17_02_world.sql2
-rw-r--r--sql/updates/world/2015_02_17_03_world.sql12
-rw-r--r--sql/updates/world/2015_02_17_04_world.sql142
-rw-r--r--sql/updates/world/2015_02_17_05_world.sql1
-rw-r--r--sql/updates/world/2015_02_18_00_world.sql54
-rw-r--r--sql/updates/world/2015_02_18_01_world.sql11
-rw-r--r--sql/updates/world/2015_02_18_02_world.sql7
-rw-r--r--sql/updates/world/2015_02_18_03_world.sql4
-rw-r--r--sql/updates/world/2015_02_19_00_world.sql427
-rw-r--r--sql/updates/world/2015_02_20_00_world.sql10
-rw-r--r--sql/updates/world/2015_02_20_01_world.sql14
-rw-r--r--sql/updates/world/2015_02_20_02_world.sql80
-rw-r--r--sql/updates/world/2015_02_20_03_world.sql26
-rw-r--r--sql/updates/world/2015_02_20_04_world.sql10
-rw-r--r--sql/updates/world/2015_02_21_00_world.sql9
-rw-r--r--sql/updates/world/2015_02_22_00_world.sql809
-rw-r--r--sql/updates/world/2015_02_23_00_world.sql4
-rw-r--r--sql/updates/world/2015_02_23_01_world.sql3
-rw-r--r--sql/updates/world/2015_02_23_02_world.sql25
-rw-r--r--sql/updates/world/2015_02_23_03_world.sql3
-rw-r--r--sql/updates/world/2015_02_23_04_world.sql2
-rw-r--r--sql/updates/world/2015_02_23_05_world.sql109
-rw-r--r--sql/updates/world/2015_02_23_06_world.sql1
-rw-r--r--sql/updates/world/2015_02_23_07_world.sql18
-rw-r--r--sql/updates/world/2015_02_23_08_world.sql281
-rw-r--r--sql/updates/world/2015_02_23_09_world.sql5
-rw-r--r--sql/updates/world/2015_02_23_10_world.sql177
-rw-r--r--sql/updates/world/2015_02_24_00_world.sql3
-rw-r--r--sql/updates/world/2015_02_24_01_world.sql3
-rw-r--r--sql/updates/world/2015_02_25_00_world.sql25
-rw-r--r--sql/updates/world/2015_02_27_00_world.sql5
-rw-r--r--sql/updates/world/2015_02_27_01_world.sql3
-rw-r--r--sql/updates/world/2015_02_27_02_world.sql2
-rw-r--r--sql/updates/world/2015_03_01_00_world.sql30
-rw-r--r--sql/updates/world/2015_03_02_00_world.sql15
-rw-r--r--sql/updates/world/2015_03_02_01_world.sql2
-rw-r--r--sql/updates/world/2015_03_02_02_world.sql25
-rw-r--r--sql/updates/world/2015_03_02_03_world.sql48
-rw-r--r--sql/updates/world/2015_03_02_04_world.sql65
-rw-r--r--sql/updates/world/2015_03_02_05_world.sql136
-rw-r--r--sql/updates/world/2015_03_02_06_world.sql4
-rw-r--r--sql/updates/world/2015_03_07_00_world.sql1
-rw-r--r--sql/updates/world/2015_03_07_01_world.sql2
-rw-r--r--sql/updates/world/2015_03_07_02_world.sql5
-rw-r--r--sql/updates/world/2015_03_07_03_world.sql2
-rw-r--r--sql/updates/world/2015_03_08_00_world.sql3
-rw-r--r--sql/updates/world/2015_03_08_01_world.sql1
-rw-r--r--sql/updates/world/2015_03_10_00_world.sql4
-rw-r--r--sql/updates/world/2015_03_10_01_world.sql3
-rw-r--r--sql/updates/world/2015_03_10_02_world.sql2
-rw-r--r--sql/updates/world/2015_03_10_03_world.sql2
-rw-r--r--sql/updates/world/2015_03_10_04_world.sql33
-rw-r--r--sql/updates/world/2015_03_10_05_world.sql4
-rw-r--r--sql/updates/world/2015_03_10_06_world.sql5
-rw-r--r--sql/updates/world/2015_03_10_07_world.sql12
-rw-r--r--sql/updates/world/2015_03_10_08_world.sql8
-rw-r--r--sql/updates/world/2015_03_10_09_world.sql7
-rw-r--r--sql/updates/world/2015_03_10_10_world.sql55
-rw-r--r--sql/updates/world/2015_03_12_00_world.sql18
-rw-r--r--sql/updates/world/2015_03_12_01_world.sql14
-rw-r--r--sql/updates/world/2015_03_14_00_world.sql43
-rw-r--r--sql/updates/world/2015_03_14_01_world.sql3
-rw-r--r--sql/updates/world/2015_03_14_02_world.sql17
-rw-r--r--sql/updates/world/2015_03_15_00_world.sql316
-rw-r--r--sql/updates/world/2015_03_15_01_world.sql32
-rw-r--r--sql/updates/world/2015_03_15_02_world.sql37
-rw-r--r--sql/updates/world/2015_03_15_03_world.sql7
-rw-r--r--sql/updates/world/2015_03_15_04_world.sql48
-rw-r--r--sql/updates/world/2015_03_15_05_world.sql234
-rw-r--r--sql/updates/world/2015_03_15_06_world.sql24
-rw-r--r--sql/updates/world/2015_03_15_07_world.sql29
-rw-r--r--sql/updates/world/2015_03_15_08_world.sql81
-rw-r--r--sql/updates/world/2015_03_15_09_world.sql59
-rw-r--r--sql/updates/world/2015_03_15_10_world.sql3
-rw-r--r--sql/updates/world/2015_03_15_11_world.sql8
-rw-r--r--sql/updates/world/2015_03_15_12_world.sql13
-rw-r--r--sql/updates/world/2015_03_15_13_world.sql153
-rw-r--r--sql/updates/world/2015_03_15_14_world.sql8
-rw-r--r--sql/updates/world/2015_03_16_00_world.sql20
-rw-r--r--sql/updates/world/2015_03_16_01_world_335.sql2
-rw-r--r--sql/updates/world/2015_03_16_02_world.sql105
-rw-r--r--sql/updates/world/2015_03_16_03_world.sql223
-rw-r--r--sql/updates/world/2015_03_16_04_world.sql165
-rw-r--r--sql/updates/world/2015_03_16_05_world.sql173
-rw-r--r--sql/updates/world/2015_03_16_06_world.sql11
-rw-r--r--sql/updates/world/2015_03_17_00_world.sql342
-rw-r--r--sql/updates/world/2015_03_17_01_world.sql14
-rw-r--r--sql/updates/world/2015_03_17_02_world.sql35
-rw-r--r--sql/updates/world/2015_03_19_00_world.sql4
-rw-r--r--src/genrev/CMakeLists.txt4
-rw-r--r--src/server/authserver/CMakeLists.txt2
-rw-r--r--src/server/collision/CMakeLists.txt1
-rw-r--r--src/server/collision/Management/MMapManager.cpp14
-rw-r--r--src/server/collision/Maps/MapTree.cpp5
-rw-r--r--src/server/collision/Maps/TileAssembler.cpp12
-rw-r--r--src/server/collision/Models/GameObjectModel.cpp6
-rw-r--r--src/server/game/AI/CoreAI/UnitAI.cpp6
-rw-r--r--src/server/game/AI/ScriptedAI/ScriptedCreature.cpp5
-rw-r--r--src/server/game/AI/ScriptedAI/ScriptedCreature.h1
-rw-r--r--src/server/game/AI/SmartScripts/SmartScript.cpp4
-rw-r--r--src/server/game/Achievements/AchievementMgr.cpp1281
-rw-r--r--src/server/game/Achievements/AchievementMgr.h8
-rw-r--r--src/server/game/AuctionHouse/AuctionHouseMgr.cpp4
-rw-r--r--src/server/game/AuctionHouseBot/AuctionHouseBot.cpp20
-rw-r--r--src/server/game/AuctionHouseBot/AuctionHouseBot.h24
-rw-r--r--src/server/game/AuctionHouseBot/AuctionHouseBotBuyer.cpp569
-rw-r--r--src/server/game/AuctionHouseBot/AuctionHouseBotBuyer.h31
-rw-r--r--src/server/game/AuctionHouseBot/AuctionHouseBotSeller.cpp4
-rw-r--r--src/server/game/Battlegrounds/ArenaTeam.cpp2
-rw-r--r--src/server/game/Battlegrounds/Battleground.cpp2
-rw-r--r--src/server/game/CMakeLists.txt1
-rw-r--r--src/server/game/Chat/Chat.cpp32
-rw-r--r--src/server/game/Chat/Chat.h22
-rw-r--r--src/server/game/Chat/ChatLink.cpp2
-rw-r--r--src/server/game/Combat/ThreatManager.cpp2
-rw-r--r--src/server/game/Conditions/ConditionMgr.cpp23
-rw-r--r--src/server/game/Conditions/ConditionMgr.h3
-rw-r--r--src/server/game/DungeonFinding/LFG.cpp3
-rw-r--r--src/server/game/DungeonFinding/LFG.h4
-rw-r--r--src/server/game/DungeonFinding/LFGGroupData.cpp12
-rw-r--r--src/server/game/DungeonFinding/LFGGroupData.h4
-rw-r--r--src/server/game/DungeonFinding/LFGMgr.cpp43
-rw-r--r--src/server/game/DungeonFinding/LFGMgr.h3
-rw-r--r--src/server/game/DungeonFinding/LFGQueue.cpp2
-rw-r--r--src/server/game/Entities/Creature/Creature.cpp4
-rw-r--r--src/server/game/Entities/Object/Object.cpp39
-rw-r--r--src/server/game/Entities/Object/Object.h1
-rw-r--r--src/server/game/Entities/Object/ObjectGuid.h2
-rw-r--r--src/server/game/Entities/Pet/Pet.cpp2
-rw-r--r--src/server/game/Entities/Player/Player.cpp135
-rw-r--r--src/server/game/Entities/Player/Player.h2
-rw-r--r--src/server/game/Entities/Unit/Unit.cpp120
-rw-r--r--src/server/game/Globals/ObjectMgr.cpp69
-rw-r--r--src/server/game/Grids/Notifiers/GridNotifiers.cpp2
-rw-r--r--src/server/game/Grids/Notifiers/GridNotifiers.h2
-rw-r--r--src/server/game/Groups/Group.cpp2
-rw-r--r--src/server/game/Handlers/PetHandler.cpp22
-rw-r--r--src/server/game/Handlers/QuestHandler.cpp8
-rw-r--r--src/server/game/Handlers/SpellHandler.cpp2
-rw-r--r--src/server/game/Loot/LootMgr.cpp2
-rw-r--r--src/server/game/Maps/Map.cpp32
-rw-r--r--src/server/game/Miscellaneous/Language.h3
-rw-r--r--src/server/game/Miscellaneous/SharedDefines.h2
-rw-r--r--src/server/game/Movement/MotionMaster.cpp39
-rw-r--r--src/server/game/Movement/MotionMaster.h1
-rwxr-xr-xsrc/server/game/Movement/MovementGenerators/WaypointMovementGenerator.cpp4
-rw-r--r--src/server/game/Movement/Spline/MoveSpline.cpp2
-rw-r--r--src/server/game/Reputation/ReputationMgr.cpp2
-rw-r--r--src/server/game/Scripting/ScriptLoader.cpp8
-rw-r--r--src/server/game/Scripting/ScriptMgr.cpp3
-rw-r--r--src/server/game/Scripting/ScriptMgr.h2
-rw-r--r--src/server/game/Server/WorldSession.cpp18
-rw-r--r--src/server/game/Server/WorldSocket.cpp10
-rw-r--r--src/server/game/Server/WorldSocketMgr.cpp2
-rw-r--r--src/server/game/Spells/Auras/SpellAuraEffects.cpp54
-rw-r--r--src/server/game/Spells/Auras/SpellAuras.cpp13
-rw-r--r--src/server/game/Spells/Auras/SpellAuras.h4
-rw-r--r--src/server/game/Spells/Spell.cpp154
-rw-r--r--src/server/game/Spells/SpellEffects.cpp18
-rw-r--r--src/server/game/Spells/SpellInfo.cpp96
-rw-r--r--src/server/game/Spells/SpellInfo.h10
-rw-r--r--src/server/game/Spells/SpellMgr.cpp8
-rw-r--r--src/server/game/World/World.cpp10
-rw-r--r--src/server/scripts/CMakeLists.txt1
-rw-r--r--src/server/scripts/Commands/cs_debug.cpp2
-rw-r--r--src/server/scripts/Commands/cs_misc.cpp3
-rw-r--r--src/server/scripts/EasternKingdoms/Karazhan/karazhan.cpp6
-rw-r--r--src/server/scripts/EasternKingdoms/ScarletEnclave/chapter1.cpp2
-rw-r--r--src/server/scripts/EasternKingdoms/SunkenTemple/sunken_temple.cpp26
-rw-r--r--src/server/scripts/EasternKingdoms/SunwellPlateau/boss_muru.cpp2
-rw-r--r--src/server/scripts/EasternKingdoms/ZulAman/boss_hexlord.cpp81
-rw-r--r--src/server/scripts/EasternKingdoms/zone_redridge_mountains.cpp2
-rw-r--r--src/server/scripts/EasternKingdoms/zone_undercity.cpp242
-rw-r--r--src/server/scripts/Kalimdor/CMakeLists.txt1
-rw-r--r--src/server/scripts/Kalimdor/RazorfenKraul/razorfen_kraul.cpp124
-rw-r--r--src/server/scripts/Kalimdor/zone_bloodmyst_isle.cpp9
-rw-r--r--src/server/scripts/Kalimdor/zone_felwood.cpp37
-rw-r--r--src/server/scripts/Kalimdor/zone_mulgore.cpp306
-rw-r--r--src/server/scripts/Kalimdor/zone_the_barrens.cpp1
-rw-r--r--src/server/scripts/Northrend/CMakeLists.txt3
-rw-r--r--src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/instance_trial_of_the_crusader.cpp8
-rw-r--r--src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/trial_of_the_crusader.cpp18
-rw-r--r--src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/boss_bronjahm.cpp190
-rw-r--r--src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/boss_devourer_of_souls.cpp22
-rw-r--r--src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/forge_of_souls.h54
-rw-r--r--src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/instance_forge_of_souls.cpp15
-rw-r--r--src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/halls_of_reflection.cpp393
-rw-r--r--src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/halls_of_reflection.h23
-rw-r--r--src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/instance_halls_of_reflection.cpp52
-rw-r--r--src/server/scripts/Northrend/IcecrownCitadel/boss_professor_putricide.cpp2
-rw-r--r--src/server/scripts/Northrend/IcecrownCitadel/boss_rotface.cpp51
-rw-r--r--src/server/scripts/Northrend/IcecrownCitadel/boss_the_lich_king.cpp1
-rw-r--r--src/server/scripts/Northrend/Nexus/EyeOfEternity/boss_malygos.cpp43
-rw-r--r--src/server/scripts/Northrend/Nexus/Nexus/boss_commander_kolurg.cpp80
-rw-r--r--src/server/scripts/Northrend/Nexus/Nexus/boss_commander_stoutbeard.cpp72
-rw-r--r--src/server/scripts/Northrend/Nexus/Nexus/boss_nexus_commanders.cpp110
-rw-r--r--src/server/scripts/Northrend/Nexus/Nexus/nexus.h23
-rw-r--r--src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_volkhan.cpp243
-rw-r--r--src/server/scripts/Northrend/Ulduar/Ulduar/boss_yogg_saron.cpp21
-rw-r--r--src/server/scripts/Northrend/VioletHold/boss_zuramat.cpp9
-rw-r--r--src/server/scripts/Northrend/VioletHold/instance_violet_hold.cpp1
-rw-r--r--src/server/scripts/Northrend/zone_borean_tundra.cpp49
-rw-r--r--src/server/scripts/Northrend/zone_storm_peaks.cpp92
-rw-r--r--src/server/scripts/Northrend/zone_zuldrak.cpp2
-rw-r--r--src/server/scripts/Outland/BlackTemple/boss_shade_of_akama.cpp146
-rw-r--r--src/server/scripts/Outland/TempestKeep/arcatraz/arcatraz.cpp7
-rw-r--r--src/server/scripts/Outland/TempestKeep/arcatraz/boss_harbinger_skyriss.cpp5
-rw-r--r--src/server/shared/CMakeLists.txt2
-rw-r--r--src/server/shared/Cryptography/BigNumber.cpp7
-rw-r--r--src/server/shared/DataStores/DBCStore.h7
-rw-r--r--src/server/shared/Database/DatabaseWorkerPool.h9
-rw-r--r--src/server/shared/Database/Implementation/CharacterDatabase.cpp4
-rw-r--r--src/server/shared/Database/Implementation/CharacterDatabase.h2
-rw-r--r--src/server/shared/Database/MySQLConnection.cpp12
-rw-r--r--src/server/shared/Database/MySQLConnection.h2
-rw-r--r--src/server/shared/Database/Transaction.cpp12
-rw-r--r--src/server/shared/Database/Transaction.h1
-rw-r--r--src/server/shared/Debugging/Errors.h6
-rw-r--r--src/server/shared/Debugging/WheatyExceptionReport.cpp14
-rw-r--r--src/server/shared/Debugging/WheatyExceptionReport.h2
-rw-r--r--src/server/shared/Logging/Appender.cpp34
-rw-r--r--src/server/shared/Logging/Appender.h15
-rw-r--r--src/server/shared/Logging/AppenderConsole.cpp10
-rw-r--r--src/server/shared/Logging/AppenderConsole.h2
-rw-r--r--src/server/shared/Logging/AppenderDB.cpp12
-rw-r--r--src/server/shared/Logging/AppenderDB.h2
-rw-r--r--src/server/shared/Logging/AppenderFile.cpp14
-rw-r--r--src/server/shared/Logging/AppenderFile.h2
-rw-r--r--src/server/shared/Logging/Log.cpp51
-rw-r--r--src/server/shared/Logging/Log.h69
-rw-r--r--src/server/shared/Logging/LogOperation.cpp8
-rw-r--r--src/server/shared/Logging/LogOperation.h10
-rw-r--r--src/server/shared/Logging/Logger.cpp4
-rw-r--r--src/server/shared/Logging/Logger.h2
-rw-r--r--src/server/shared/Networking/Socket.h4
-rw-r--r--src/server/shared/Networking/SocketMgr.h2
-rw-r--r--src/server/shared/Utilities/StringFormat.h34
-rw-r--r--src/server/worldserver/CMakeLists.txt2
-rw-r--r--src/server/worldserver/RemoteAccess/RASession.h2
-rw-r--r--src/server/worldserver/worldserver.conf.dist60
356 files changed, 19156 insertions, 2961 deletions
diff --git a/README.md b/README.md
index 263339fc9dd..d92b3848c94 100644
--- a/README.md
+++ b/README.md
@@ -2,6 +2,8 @@
[![Coverity Scan Build Status](https://scan.coverity.com/projects/435/badge.svg)](https://scan.coverity.com/projects/435)
[![Bountysource](https://www.bountysource.com/badge/tracker?tracker_id=1310)](https://www.bountysource.com/trackers/1310-trinity-core?utm_source=1310&utm_medium=shield&utm_campaign=TRACKER_BADGE)
+[![Issue Stats](http://www.issuestats.com/github/TrinityCore/TrinityCore/badge/pr)](http://www.issuestats.com/github/TrinityCore/TrinityCore)
+[![Issue Stats](http://www.issuestats.com/github/TrinityCore/TrinityCore/badge/issue)](http://www.issuestats.com/github/TrinityCore/TrinityCore)
`6.x`: [![6.x Build Status](https://travis-ci.org/TrinityCore/TrinityCore.svg?branch=6.x)](https://travis-ci.org/TrinityCore/TrinityCore)
`4.3.4`: [![4.3.4 Build Status](https://travis-ci.org/TrinityCore/TrinityCore.svg?branch=4.3.4)](https://travis-ci.org/TrinityCore/TrinityCore)
`3.3.5`: [![3.3.5 Build Status](https://travis-ci.org/TrinityCore/TrinityCore.svg?branch=3.3.5)](https://travis-ci.org/TrinityCore/TrinityCore)
diff --git a/cmake/genrev.cmake b/cmake/genrev.cmake
index c34e9d75973..1f5f02ceeec 100644
--- a/cmake/genrev.cmake
+++ b/cmake/genrev.cmake
@@ -12,21 +12,19 @@
# This is done EACH compile so they can be alerted about the consequences.
if(NOT BUILDDIR)
- # Workaround for funny MSVC behaviour - this segment only run during compile
- set(NO_GIT ${WITHOUT_GIT})
- set(GIT_EXEC ${GIT_EXECUTABLE})
+ # Workaround for funny MSVC behaviour - this segment is only used when using cmake gui
set(BUILDDIR ${CMAKE_BINARY_DIR})
endif()
-if(NO_GIT)
+if(WITHOUT_GIT)
set(rev_date "1970-01-01 00:00:00 +0000")
set(rev_hash "unknown")
set(rev_branch "Archived")
else()
- if(GIT_EXEC)
+ if(GIT_EXECUTABLE)
# Create a revision-string that we can use
execute_process(
- COMMAND "${GIT_EXEC}" describe --match init --dirty=+ --abbrev=12
+ COMMAND "${GIT_EXECUTABLE}" describe --match init --dirty=+ --abbrev=12
WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}"
OUTPUT_VARIABLE rev_info
OUTPUT_STRIP_TRAILING_WHITESPACE
@@ -35,7 +33,7 @@ else()
# And grab the commits timestamp
execute_process(
- COMMAND "${GIT_EXEC}" show -s --format=%ci
+ COMMAND "${GIT_EXECUTABLE}" show -s --format=%ci
WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}"
OUTPUT_VARIABLE rev_date
OUTPUT_STRIP_TRAILING_WHITESPACE
@@ -44,7 +42,7 @@ else()
# Also retrieve branch name
execute_process(
- COMMAND "${GIT_EXEC}" rev-parse --abbrev-ref HEAD
+ COMMAND "${GIT_EXECUTABLE}" rev-parse --abbrev-ref HEAD
WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}"
OUTPUT_VARIABLE rev_branch
OUTPUT_STRIP_TRAILING_WHITESPACE
@@ -69,7 +67,7 @@ else()
endif()
# Create the actual revision.h file from the above params
-if(NOT "${rev_hash_cached}" MATCHES "${rev_hash}" OR NOT "${rev_branch_cached}" MATCHES "${rev_branch}")
+if(NOT "${rev_hash_cached}" MATCHES "${rev_hash}" OR NOT "${rev_branch_cached}" MATCHES "${rev_branch}" OR NOT EXISTS "${BUILDDIR}/revision.h")
configure_file(
"${CMAKE_SOURCE_DIR}/revision.h.in.cmake"
"${BUILDDIR}/revision.h"
diff --git a/cmake/macros/FindMySQL.cmake b/cmake/macros/FindMySQL.cmake
index 2c393463c47..990f4918d6a 100644
--- a/cmake/macros/FindMySQL.cmake
+++ b/cmake/macros/FindMySQL.cmake
@@ -94,6 +94,7 @@ find_path(MYSQL_INCLUDE_DIR
"$ENV{ProgramFiles}/MySQL/*/include"
"$ENV{SystemDrive}/MySQL/*/include"
"c:/msys/local/include"
+ "$ENV{MYSQL_ROOT}/include"
DOC
"Specify the directory containing mysql.h."
)
@@ -159,6 +160,7 @@ if( WIN32 )
"$ENV{ProgramFiles}/MySQL/*/lib/opt"
"$ENV{SystemDrive}/MySQL/*/lib/opt"
"c:/msys/local/include"
+ "$ENV{MYSQL_ROOT}/lib"
DOC "Specify the location of the mysql library here."
)
endif( WIN32 )
diff --git a/cmake/macros/FindOpenSSL.cmake b/cmake/macros/FindOpenSSL.cmake
index 1cc34b36a4c..7baa43274ab 100644
--- a/cmake/macros/FindOpenSSL.cmake
+++ b/cmake/macros/FindOpenSSL.cmake
@@ -186,7 +186,7 @@ if (OPENSSL_INCLUDE_DIR)
set(OPENSSL_VERSION "${_OPENSSL_VERSION}")
else (_OPENSSL_VERSION)
file(STRINGS "${OPENSSL_INCLUDE_DIR}/openssl/opensslv.h" openssl_version_str
- REGEX "^#define[\t ]+OPENSSL_VERSION_NUMBER[\t ]+0x[0-9][0-9][0-9][0-9][0-9][0-9].*")
+ REGEX "^# *define[\t ]+OPENSSL_VERSION_NUMBER[\t ]+0x[0-9][0-9][0-9][0-9][0-9][0-9].*")
# The version number is encoded as 0xMNNFFPPS: major minor fix patch status
# The status gives if this is a developer or prerelease and is ignored here.
diff --git a/dep/CMakeLists.txt b/dep/CMakeLists.txt
index f04c8580413..a38dcbe068d 100644
--- a/dep/CMakeLists.txt
+++ b/dep/CMakeLists.txt
@@ -35,6 +35,7 @@ if(SERVERS OR TOOLS)
endif()
if(SERVERS)
+ add_subdirectory(cppformat)
add_subdirectory(gsoap)
endif()
diff --git a/dep/PackageList.txt b/dep/PackageList.txt
index 4412df6ffa6..e10e6435f80 100644
--- a/dep/PackageList.txt
+++ b/dep/PackageList.txt
@@ -8,6 +8,10 @@ bzip2 (a freely available, patent free, high-quality data compressor)
http://www.bzip.org/
Version: 1.0.6
+cppformat (type safe format library)
+ https://github.com/cppformat/cppformat
+ Version: 1.1.0 bf8636c9596fbfddded3d0f5879abc7579c9f4dd
+
G3D (a commercial-grade C++ 3D engine available as Open Source (BSD License)
http://g3d.sourceforge.net/
Version: 9.0-Release r4036
diff --git a/dep/cppformat/CMakeLists.txt b/dep/cppformat/CMakeLists.txt
new file mode 100644
index 00000000000..ea02185811f
--- /dev/null
+++ b/dep/cppformat/CMakeLists.txt
@@ -0,0 +1,35 @@
+include(CheckCXXCompilerFlag)
+include(CheckSymbolExists)
+
+set(FMT_SOURCES format.cc format.h)
+
+# Use variadic templates
+add_definitions(-DFMT_VARIADIC_TEMPLATES=1)
+
+# Check if initializer lists are supported.
+check_cxx_source_compiles("
+ #include <initializer_list>
+ int main() {}" FMT_INITIALIZER_LIST)
+
+# Use delete
+add_definitions(-DFMT_USE_DELETED_FUNCTIONS=1)
+
+# Use static assert
+add_definitions(-DFMT_USE_STATIC_ASSERT=1)
+
+if (WIN32)
+ check_symbol_exists(open io.h HAVE_OPEN)
+else ()
+ check_symbol_exists(open fcntl.h HAVE_OPEN)
+endif ()
+if (HAVE_OPEN)
+ add_definitions(-DFMT_USE_FILE_DESCRIPTORS=1)
+ set(FMT_SOURCES ${FMT_SOURCES} posix.cc posix.h)
+endif ()
+
+add_library(format STATIC ${FMT_SOURCES})
+
+if (CMAKE_COMPILER_IS_GNUCXX)
+ set_target_properties(format PROPERTIES COMPILE_FLAGS
+ "-Wall -Wextra -Wshadow -pedantic")
+endif ()
diff --git a/dep/cppformat/ChangeLog.rst b/dep/cppformat/ChangeLog.rst
new file mode 100644
index 00000000000..fe780ae010c
--- /dev/null
+++ b/dep/cppformat/ChangeLog.rst
@@ -0,0 +1,335 @@
+1.1.0 - 2015-03-06
+------------------
+
+* Added ``BasicArrayWriter``, a class template that provides operations for
+ formatting and writing data into a fixed-size array
+ (`#105 <https://github.com/cppformat/cppformat/issues/105>`_ and
+ `#122 <https://github.com/cppformat/cppformat/issues/122>`_):
+
+ .. code:: c++
+
+ char buffer[100];
+ fmt::ArrayWriter w(buffer);
+ w.write("The answer is {}", 42);
+
+* Added `0 A.D. <http://play0ad.com/>`_ and `PenUltima Online (POL)
+ <http://www.polserver.com/>`_ to the list of notable projects using C++ Format.
+
+* C++ Format now uses MSVC intrinsics for better formatting performance
+ (`#115 <https://github.com/cppformat/cppformat/pull/115>`_,
+ `#116 <https://github.com/cppformat/cppformat/pull/116>`_,
+ `#118 <https://github.com/cppformat/cppformat/pull/118>`_ and
+ `#121 <https://github.com/cppformat/cppformat/pull/121>`_).
+ Previously these optimizations where only used on GCC and Clang.
+ Thanks to `@CarterLi <https://github.com/CarterLi>`_ and
+ `@objectx <https://github.com/objectx>`_.
+
+* CMake install target (`#119 <https://github.com/cppformat/cppformat/pull/119>`_).
+ Thanks to `@TrentHouliston <https://github.com/TrentHouliston>`_.
+
+ You can now install C++ Format with ``make install`` command.
+
+* Improved `Biicode <http://www.biicode.com/>`_ support
+ (`#98 <https://github.com/cppformat/cppformat/pull/98>`_ and
+ `#104 <https://github.com/cppformat/cppformat/pull/104>`_). Thanks to
+ `@MariadeAnton <https://github.com/MariadeAnton>`_ and
+ `@franramirez688 <https://github.com/franramirez688>`_.
+
+* Improved support for bulding with `Android NDK
+ <https://developer.android.com/tools/sdk/ndk/index.html>`_
+ (`#107 <https://github.com/cppformat/cppformat/pull/107>`_).
+ Thanks to `@newnon <https://github.com/newnon>`_.
+
+ The `android-ndk-example <https://github.com/cppformat/android-ndk-example>`_
+ repository provides and example of using C++ Format with Android NDK:
+
+ .. image:: https://raw.githubusercontent.com/cppformat/android-ndk-example/
+ master/screenshot.png
+
+* Improved documentation of ``SystemError`` and ``WindowsError``
+ (`#54 <https://github.com/cppformat/cppformat/issues/54>`_).
+
+* Various code improvements
+ (`#110 <https://github.com/cppformat/cppformat/pull/110>`_,
+ `#111 <https://github.com/cppformat/cppformat/pull/111>`_
+ `#112 <https://github.com/cppformat/cppformat/pull/112>`_).
+ Thanks to `@CarterLi <https://github.com/CarterLi>`_.
+
+* Improved compile-time errors when formatting wide into narrow strings
+ (`#117 <https://github.com/cppformat/cppformat/issues/117>`_).
+
+* Fixed ``BasicWriter::write`` without formatting arguments when C++11 support
+ is disabled (`#109 <https://github.com/cppformat/cppformat/issues/109>`_).
+
+* Fixed header-only build on OS X with GCC 4.9
+ (`#124 <https://github.com/cppformat/cppformat/issues/124>`_).
+
+* Fixed packaging issues (`#94 <https://github.com/cppformat/cppformat/issues/94>`_).
+
+* Fixed warnings in GCC, MSVC and Xcode/Clang
+ (`#95 <https://github.com/cppformat/cppformat/issues/95>`_,
+ `#96 <https://github.com/cppformat/cppformat/issues/96>`_ and
+ `#114 <https://github.com/cppformat/cppformat/pull/114>`_).
+
+* Added `changelog <https://github.com/cppformat/cppformat/edit/master/ChangeLog.rst>`_
+ (`#103 <https://github.com/cppformat/cppformat/issues/103>`_).
+
+1.0.0 - 2015-02-05
+------------------
+
+* Add support for a header-only configuration when ``FMT_HEADER_ONLY`` is
+ defined before including ``format.h``:
+
+ .. code:: c++
+
+ #define FMT_HEADER_ONLY
+ #include "format.h"
+
+* Compute string length in the constructor of ``BasicStringRef``
+ instead of the ``size`` method
+ (`#79 <https://github.com/cppformat/cppformat/issues/79>`_).
+ This eliminates size computation for string literals on reasonable optimizing
+ compilers.
+
+* Fix formatting of types with overloaded ``operator <<`` for ``std::wostream``
+ (`#86 <https://github.com/cppformat/cppformat/issues/86>`_):
+
+ .. code:: c++
+
+ fmt::format(L"The date is {0}", Date(2012, 12, 9));
+
+* Fix linkage of tests on Arch Linux
+ (`#89 <https://github.com/cppformat/cppformat/issues/89>`_).
+
+* Allow precision specifier for non-float arguments
+ (`#90 <https://github.com/cppformat/cppformat/issues/90>`_):
+
+ .. code:: c++
+
+ fmt::print("{:.3}\n", "Carpet"); // prints "Car"
+
+* Fix build on Android NDK
+ (`#93 <https://github.com/cppformat/cppformat/issues/93>`_)
+
+* Improvements to documentation build procedure.
+
+* Remove ``FMT_SHARED`` CMake variable in favor of standard `BUILD_SHARED_LIBS
+ <http://www.cmake.org/cmake/help/v3.0/variable/BUILD_SHARED_LIBS.html>`_.
+
+* Fix error handling in ``fmt::fprintf``.
+
+* Fix a number of warnings.
+
+0.12.0 - 2014-10-25
+-------------------
+
+* [Breaking] Improved separation between formatting and buffer management.
+ ``Writer`` is now a base class that cannot be instantiated directly.
+ The new ``MemoryWriter`` class implements the default buffer management
+ with small allocations done on stack. So ``fmt::Writer`` should be replaced
+ with ``fmt::MemoryWriter`` in variable declarations.
+
+ Old code:
+
+ .. code:: c++
+
+ fmt::Writer w;
+
+ New code:
+
+ .. code:: c++
+
+ fmt::MemoryWriter w;
+
+ If you pass ``fmt::Writer`` by reference, you can continue to do so:
+
+ .. code:: c++
+
+ void f(fmt::Writer &w);
+
+ This doesn't affect the formatting API.
+
+* Support for custom memory allocators
+ (`#69 <https://github.com/cppformat/cppformat/issues/69>`_)
+
+* Formatting functions now accept `signed char` and `unsigned char` strings as
+ arguments (`#73 <https://github.com/cppformat/cppformat/issues/73>`_):
+
+ .. code:: c++
+
+ auto s = format("GLSL version: {}", glGetString(GL_VERSION));
+
+* Reduced code bloat. According to the new `benchmark results
+ <https://github.com/cppformat/cppformat#compile-time-and-code-bloat>`_,
+ cppformat is close to ``printf`` and by the order of magnitude better than
+ Boost Format in terms of compiled code size.
+
+* Improved appearance of the documentation on mobile by using the `Sphinx
+ Bootstrap theme <http://ryan-roemer.github.io/sphinx-bootstrap-theme/>`_:
+
+ .. |old| image:: https://cloud.githubusercontent.com/assets/576385/4792130/
+ cd256436-5de3-11e4-9a62-c077d0c2b003.png
+
+ .. |new| image:: https://cloud.githubusercontent.com/assets/576385/4792131/
+ cd29896c-5de3-11e4-8f59-cac952942bf0.png
+
+ +-------+-------+
+ | Old | New |
+ +-------+-------+
+ | |old| | |new| |
+ +-------+-------+
+
+0.11.0 - 2014-08-21
+-------------------
+
+* Safe printf implementation with a POSIX extension for positional arguments:
+
+ .. code:: c++
+
+ fmt::printf("Elapsed time: %.2f seconds", 1.23);
+ fmt::printf("%1$s, %3$d %2$s", weekday, month, day);
+
+* Arguments of ``char`` type can now be formatted as integers
+ (Issue `#55 <https://github.com/cppformat/cppformat/issues/55>`_):
+
+ .. code:: c++
+
+ fmt::format("0x{0:02X}", 'a');
+
+* Deprecated parts of the API removed.
+
+* The library is now built and tested on MinGW with Appveyor in addition to
+ existing test platforms Linux/GCC, OS X/Clang, Windows/MSVC.
+
+0.10.0 - 2014-07-01
+-------------------
+
+**Improved API**
+
+* All formatting methods are now implemented as variadic functions instead
+ of using ``operator<<`` for feeding arbitrary arguments into a temporary
+ formatter object. This works both with C++11 where variadic templates are
+ used and with older standards where variadic functions are emulated by
+ providing lightweight wrapper functions defined with the ``FMT_VARIADIC``
+ macro. You can use this macro for defining your own portable variadic
+ functions:
+
+ .. code:: c++
+
+ void report_error(const char *format, const fmt::ArgList &args) {
+ fmt::print("Error: {}");
+ fmt::print(format, args);
+ }
+ FMT_VARIADIC(void, report_error, const char *)
+
+ report_error("file not found: {}", path);
+
+ Apart from a more natural syntax, this also improves performance as there
+ is no need to construct temporary formatter objects and control arguments'
+ lifetimes. Because the wrapper functions are very ligthweight, this doesn't
+ cause code bloat even in pre-C++11 mode.
+
+* Simplified common case of formatting an ``std::string``. Now it requires a
+ single function call:
+
+ .. code:: c++
+
+ std::string s = format("The answer is {}.", 42);
+
+ Previously it required 2 function calls:
+
+ .. code:: c++
+
+ std::string s = str(Format("The answer is {}.") << 42);
+
+ Instead of unsafe ``c_str`` function, ``fmt::Writer`` should be used directly
+ to bypass creation of ``std::string``:
+
+ .. code:: c++
+
+ fmt::Writer w;
+ w.write("The answer is {}.", 42);
+ w.c_str(); // returns a C string
+
+ This doesn't do dynamic memory allocation for small strings and is less error
+ prone as the lifetime of the string is the same as for ``std::string::c_str``
+ which is well understood (hopefully).
+
+* Improved consistency in naming functions that are a part of the public API.
+ Now all public functions are lowercase following the standard library
+ conventions. Previously it was a combination of lowercase and
+ CapitalizedWords.
+ Issue `#50 <https://github.com/cppformat/cppformat/issues/50>`_.
+
+* Old functions are marked as deprecated and will be removed in the next
+ release.
+
+**Other Changes**
+
+* Experimental support for printf format specifications (work in progress):
+
+ .. code:: c++
+
+ fmt::printf("The answer is %d.", 42);
+ std::string s = fmt::sprintf("Look, a %s!", "string");
+
+* Support for hexadecimal floating point format specifiers ``a`` and ``A``:
+
+ .. code:: c++
+
+ print("{:a}", -42.0); // Prints -0x1.5p+5
+ print("{:A}", -42.0); // Prints -0X1.5P+5
+
+* CMake option ``FMT_SHARED`` that specifies whether to build format as a
+ shared library (off by default).
+
+0.9.0 - 2014-05-13
+------------------
+
+* More efficient implementation of variadic formatting functions.
+
+* ``Writer::Format`` now has a variadic overload:
+
+ .. code:: c++
+
+ Writer out;
+ out.Format("Look, I'm {}!", "variadic");
+
+* For efficiency and consistency with other overloads, variadic overload of
+ the ``Format`` function now returns ``Writer`` instead of ``std::string``.
+ Use the ``str`` function to convert it to ``std::string``:
+
+ .. code:: c++
+
+ std::string s = str(Format("Look, I'm {}!", "variadic"));
+
+* Replaced formatter actions with output sinks: ``NoAction`` -> ``NullSink``,
+ ``Write`` -> ``FileSink``, ``ColorWriter`` -> ``ANSITerminalSink``.
+ This improves naming consistency and shouldn't affect client code unless
+ these classes are used directly which should be rarely needed.
+
+* Added ``ThrowSystemError`` function that formats a message and throws
+ ``SystemError`` containing the formatted message and system-specific error
+ description. For example, the following code
+
+ .. code:: c++
+
+ FILE *f = fopen(filename, "r");
+ if (!f)
+ ThrowSystemError(errno, "Failed to open file '{}'") << filename;
+
+ will throw ``SystemError`` exception with description
+ "Failed to open file '<filename>': No such file or directory" if file
+ doesn't exist.
+
+* Support for AppVeyor continuous integration platform.
+
+* ``Format`` now throws ``SystemError`` in case of I/O errors.
+
+* Improve test infrastructure. Print functions are now tested by redirecting
+ the output to a pipe.
+
+0.8.0 - 2014-04-14
+------------------
+
+* Initial release
diff --git a/dep/cppformat/LICENSE b/dep/cppformat/LICENSE
new file mode 100644
index 00000000000..2ee9ec93495
--- /dev/null
+++ b/dep/cppformat/LICENSE
@@ -0,0 +1,22 @@
+Copyright (c) 2014 - 2015, Victor Zverovich
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+1. Redistributions of source code must retain the above copyright notice, this
+ list of conditions and the following disclaimer.
+2. Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
+ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/dep/cppformat/format.cc b/dep/cppformat/format.cc
new file mode 100644
index 00000000000..86fac25a524
--- /dev/null
+++ b/dep/cppformat/format.cc
@@ -0,0 +1,1224 @@
+/*
+ Formatting library for C++
+
+ Copyright (c) 2012 - 2015, Victor Zverovich
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice, this
+ list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
+ ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "format.h"
+
+#include <string.h>
+
+#include <cctype>
+#include <cerrno>
+#include <climits>
+#include <cmath>
+#include <cstdarg>
+
+#ifdef _WIN32
+# ifdef __MINGW32__
+# include <cstring>
+# endif
+# include <windows.h>
+#endif
+
+using fmt::internal::Arg;
+
+// Check if exceptions are disabled.
+#if __GNUC__ && !__EXCEPTIONS
+# define FMT_EXCEPTIONS 0
+#endif
+#if _MSC_VER && !_HAS_EXCEPTIONS
+# define FMT_EXCEPTIONS 0
+#endif
+#ifndef FMT_EXCEPTIONS
+# define FMT_EXCEPTIONS 1
+#endif
+
+#if FMT_EXCEPTIONS
+# define FMT_TRY try
+# define FMT_CATCH(x) catch (x)
+#else
+# define FMT_TRY if (true)
+# define FMT_CATCH(x) if (false)
+#endif
+
+#ifndef FMT_THROW
+# if FMT_EXCEPTIONS
+# define FMT_THROW(x) throw x
+# else
+# ifndef NDEBUG
+# define FMT_THROW(x) assert(false && #x)
+# elif defined _MSC_VER
+# define FMT_THROW(x) __assume(0)
+# elif defined __clang__ || FMT_GCC_VERSION >= 405
+# define FMT_THROW(x) __builtin_unreachable()
+# else
+# define FMT_THROW(x) std::abort()
+# endif
+# endif
+#endif
+
+#ifndef FMT_NORETURN
+# if defined __GNUC__ || defined __clang__
+# define FMT_NORETURN __attribute__((__noreturn__))
+# elif defined _MSC_VER
+# define FMT_NORETURN __declspec(noreturn)
+# else
+# define FMT_NORETURN
+# endif
+#endif
+
+#ifdef FMT_HEADER_ONLY
+# define FMT_FUNC inline
+#else
+# define FMT_FUNC
+#endif
+
+#if _MSC_VER
+# pragma warning(push)
+# pragma warning(disable: 4127) // conditional expression is constant
+# pragma warning(disable: 4702) // unreachable code
+// Disable deprecation warning for strerror. The latter is not called but
+// MSVC fails to detect it.
+# pragma warning(disable: 4996)
+#endif
+
+// Dummy implementations of strerror_r and strerror_s called if corresponding
+// system functions are not available.
+static inline fmt::internal::None<> strerror_r(int, char *, ...) {
+ return fmt::internal::None<>();
+}
+static inline fmt::internal::None<> strerror_s(char *, std::size_t, ...) {
+ return fmt::internal::None<>();
+}
+
+namespace {
+
+#ifndef _MSC_VER
+# define FMT_SNPRINTF snprintf
+#else // _MSC_VER
+inline int fmt_snprintf(char *buffer, size_t size, const char *format, ...) {
+ va_list args;
+ va_start(args, format);
+ int result = vsnprintf_s(buffer, size, _TRUNCATE, format, args);
+ va_end(args);
+ return result;
+}
+# define FMT_SNPRINTF fmt_snprintf
+#endif // _MSC_VER
+
+#if defined(_WIN32) && defined(__MINGW32__) && !defined(__NO_ISOCEXT)
+# define FMT_SWPRINTF snwprintf
+#else
+# define FMT_SWPRINTF swprintf
+#endif // defined(_WIN32) && defined(__MINGW32__) && !defined(__NO_ISOCEXT)
+
+// Checks if a value fits in int - used to avoid warnings about comparing
+// signed and unsigned integers.
+template <bool IsSigned>
+struct IntChecker {
+ template <typename T>
+ static bool fits_in_int(T value) {
+ unsigned max = INT_MAX;
+ return value <= max;
+ }
+};
+
+template <>
+struct IntChecker<true> {
+ template <typename T>
+ static bool fits_in_int(T value) {
+ return value >= INT_MIN && value <= INT_MAX;
+ }
+};
+
+const char RESET_COLOR[] = "\x1b[0m";
+
+typedef void (*FormatFunc)(fmt::Writer &, int, fmt::StringRef);
+
+// Portable thread-safe version of strerror.
+// Sets buffer to point to a string describing the error code.
+// This can be either a pointer to a string stored in buffer,
+// or a pointer to some static immutable string.
+// Returns one of the following values:
+// 0 - success
+// ERANGE - buffer is not large enough to store the error message
+// other - failure
+// Buffer should be at least of size 1.
+int safe_strerror(
+ int error_code, char *&buffer, std::size_t buffer_size) FMT_NOEXCEPT {
+ assert(buffer != 0 && buffer_size != 0);
+
+ class StrError {
+ private:
+ int error_code_;
+ char *&buffer_;
+ std::size_t buffer_size_;
+
+ // Handle the result of XSI-compliant version of strerror_r.
+ int handle(int result) {
+ // glibc versions before 2.13 return result in errno.
+ return result == -1 ? errno : result;
+ }
+
+ // Handle the result of GNU-specific version of strerror_r.
+ int handle(char *message) {
+ // If the buffer is full then the message is probably truncated.
+ if (message == buffer_ && strlen(buffer_) == buffer_size_ - 1)
+ return ERANGE;
+ buffer_ = message;
+ return 0;
+ }
+
+ // Handle the case when strerror_r is not available.
+ int handle(fmt::internal::None<>) {
+ return fallback(strerror_s(buffer_, buffer_size_, error_code_));
+ }
+
+ // Fallback to strerror_s when strerror_r is not available.
+ int fallback(int result) {
+ // If the buffer is full then the message is probably truncated.
+ return result == 0 && strlen(buffer_) == buffer_size_ - 1 ?
+ ERANGE : result;
+ }
+
+ // Fallback to strerror if strerror_r and strerror_s are not available.
+ int fallback(fmt::internal::None<>) {
+ errno = 0;
+ buffer_ = strerror(error_code_);
+ return errno;
+ }
+
+ public:
+ StrError(int error_code, char *&buffer, std::size_t buffer_size)
+ : error_code_(error_code), buffer_(buffer), buffer_size_(buffer_size) {}
+
+ int run() { return handle(strerror_r(error_code_, buffer_, buffer_size_)); }
+ };
+ return StrError(error_code, buffer, buffer_size).run();
+}
+
+void format_error_code(fmt::Writer &out, int error_code,
+ fmt::StringRef message) FMT_NOEXCEPT {
+ // Report error code making sure that the output fits into
+ // INLINE_BUFFER_SIZE to avoid dynamic memory allocation and potential
+ // bad_alloc.
+ out.clear();
+ static const char SEP[] = ": ";
+ static const char _ERR[] = "error ";
+ fmt::internal::IntTraits<int>::MainType ec_value = error_code;
+ // Subtract 2 to account for terminating null characters in SEP and _ERR.
+ std::size_t error_code_size =
+ sizeof(SEP) + sizeof(_ERR) + fmt::internal::count_digits(ec_value) - 2;
+ if (message.size() <= fmt::internal::INLINE_BUFFER_SIZE - error_code_size)
+ out << message << SEP;
+ out << _ERR << error_code;
+ assert(out.size() <= fmt::internal::INLINE_BUFFER_SIZE);
+}
+
+void report_error(FormatFunc func,
+ int error_code, fmt::StringRef message) FMT_NOEXCEPT {
+ fmt::MemoryWriter full_message;
+ func(full_message, error_code, message);
+ // Use Writer::data instead of Writer::c_str to avoid potential memory
+ // allocation.
+ std::fwrite(full_message.data(), full_message.size(), 1, stderr);
+ std::fputc('\n', stderr);
+}
+
+// IsZeroInt::visit(arg) returns true iff arg is a zero integer.
+class IsZeroInt : public fmt::internal::ArgVisitor<IsZeroInt, bool> {
+ public:
+ template <typename T>
+ bool visit_any_int(T value) { return value == 0; }
+};
+
+// Parses an unsigned integer advancing s to the end of the parsed input.
+// This function assumes that the first character of s is a digit.
+template <typename Char>
+int parse_nonnegative_int(const Char *&s) {
+ assert('0' <= *s && *s <= '9');
+ unsigned value = 0;
+ do {
+ unsigned new_value = value * 10 + (*s++ - '0');
+ // Check if value wrapped around.
+ if (new_value < value) {
+ value = UINT_MAX;
+ break;
+ }
+ value = new_value;
+ } while ('0' <= *s && *s <= '9');
+ if (value > INT_MAX)
+ FMT_THROW(fmt::FormatError("number is too big"));
+ return value;
+}
+
+inline void require_numeric_argument(const Arg &arg, char spec) {
+ if (arg.type > Arg::LAST_NUMERIC_TYPE) {
+ std::string message =
+ fmt::format("format specifier '{}' requires numeric argument", spec);
+ FMT_THROW(fmt::FormatError(message));
+ }
+}
+
+template <typename Char>
+void check_sign(const Char *&s, const Arg &arg) {
+ char sign = static_cast<char>(*s);
+ require_numeric_argument(arg, sign);
+ if (arg.type == Arg::UINT || arg.type == Arg::ULONG_LONG) {
+ FMT_THROW(fmt::FormatError(fmt::format(
+ "format specifier '{}' requires signed argument", sign)));
+ }
+ ++s;
+}
+
+// Checks if an argument is a valid printf width specifier and sets
+// left alignment if it is negative.
+class WidthHandler : public fmt::internal::ArgVisitor<WidthHandler, unsigned> {
+ private:
+ fmt::FormatSpec &spec_;
+
+ FMT_DISALLOW_COPY_AND_ASSIGN(WidthHandler);
+
+ public:
+ explicit WidthHandler(fmt::FormatSpec &spec) : spec_(spec) {}
+
+ FMT_NORETURN
+ unsigned visit_unhandled_arg() {
+ FMT_THROW(fmt::FormatError("width is not integer"));
+ }
+
+ template <typename T>
+ unsigned visit_any_int(T value) {
+ typedef typename fmt::internal::IntTraits<T>::MainType UnsignedType;
+ UnsignedType width = value;
+ if (fmt::internal::is_negative(value)) {
+ spec_.align_ = fmt::ALIGN_LEFT;
+ width = 0 - width;
+ }
+ if (width > INT_MAX)
+ FMT_THROW(fmt::FormatError("number is too big"));
+ return static_cast<unsigned>(width);
+ }
+};
+
+class PrecisionHandler :
+ public fmt::internal::ArgVisitor<PrecisionHandler, int> {
+ public:
+ FMT_NORETURN
+ unsigned visit_unhandled_arg() {
+ FMT_THROW(fmt::FormatError("precision is not integer"));
+ }
+
+ template <typename T>
+ int visit_any_int(T value) {
+ if (!IntChecker<std::numeric_limits<T>::is_signed>::fits_in_int(value))
+ FMT_THROW(fmt::FormatError("number is too big"));
+ return static_cast<int>(value);
+ }
+};
+
+// Converts an integer argument to an integral type T for printf.
+template <typename T>
+class ArgConverter : public fmt::internal::ArgVisitor<ArgConverter<T>, void> {
+ private:
+ fmt::internal::Arg &arg_;
+ wchar_t type_;
+
+ FMT_DISALLOW_COPY_AND_ASSIGN(ArgConverter);
+
+ public:
+ ArgConverter(fmt::internal::Arg &arg, wchar_t type)
+ : arg_(arg), type_(type) {}
+
+ template <typename U>
+ void visit_any_int(U value) {
+ bool is_signed = type_ == 'd' || type_ == 'i';
+ using fmt::internal::Arg;
+ if (sizeof(T) <= sizeof(int)) {
+ // Extra casts are used to silence warnings.
+ if (is_signed) {
+ arg_.type = Arg::INT;
+ arg_.int_value = static_cast<int>(static_cast<T>(value));
+ } else {
+ arg_.type = Arg::UINT;
+ arg_.uint_value = static_cast<unsigned>(
+ static_cast<typename fmt::internal::MakeUnsigned<T>::Type>(value));
+ }
+ } else {
+ if (is_signed) {
+ arg_.type = Arg::LONG_LONG;
+ arg_.long_long_value =
+ static_cast<typename fmt::internal::MakeUnsigned<U>::Type>(value);
+ } else {
+ arg_.type = Arg::ULONG_LONG;
+ arg_.ulong_long_value =
+ static_cast<typename fmt::internal::MakeUnsigned<U>::Type>(value);
+ }
+ }
+ }
+};
+
+// Converts an integer argument to char for printf.
+class CharConverter : public fmt::internal::ArgVisitor<CharConverter, void> {
+ private:
+ fmt::internal::Arg &arg_;
+
+ FMT_DISALLOW_COPY_AND_ASSIGN(CharConverter);
+
+ public:
+ explicit CharConverter(fmt::internal::Arg &arg) : arg_(arg) {}
+
+ template <typename T>
+ void visit_any_int(T value) {
+ arg_.type = Arg::CHAR;
+ arg_.int_value = static_cast<char>(value);
+ }
+};
+
+// This function template is used to prevent compile errors when handling
+// incompatible string arguments, e.g. handling a wide string in a narrow
+// string formatter.
+template <typename Char>
+Arg::StringValue<Char> ignore_incompatible_str(Arg::StringValue<wchar_t>);
+
+template <>
+inline Arg::StringValue<char> ignore_incompatible_str(
+ Arg::StringValue<wchar_t>) { return Arg::StringValue<char>(); }
+
+template <>
+inline Arg::StringValue<wchar_t> ignore_incompatible_str(
+ Arg::StringValue<wchar_t> s) { return s; }
+} // namespace
+
+FMT_FUNC void fmt::SystemError::init(
+ int err_code, StringRef format_str, ArgList args) {
+ error_code_ = err_code;
+ MemoryWriter w;
+ internal::format_system_error(w, err_code, format(format_str, args));
+ std::runtime_error &base = *this;
+ base = std::runtime_error(w.str());
+}
+
+template <typename T>
+int fmt::internal::CharTraits<char>::format_float(
+ char *buffer, std::size_t size, const char *format,
+ unsigned width, int precision, T value) {
+ if (width == 0) {
+ return precision < 0 ?
+ FMT_SNPRINTF(buffer, size, format, value) :
+ FMT_SNPRINTF(buffer, size, format, precision, value);
+ }
+ return precision < 0 ?
+ FMT_SNPRINTF(buffer, size, format, width, value) :
+ FMT_SNPRINTF(buffer, size, format, width, precision, value);
+}
+
+template <typename T>
+int fmt::internal::CharTraits<wchar_t>::format_float(
+ wchar_t *buffer, std::size_t size, const wchar_t *format,
+ unsigned width, int precision, T value) {
+ if (width == 0) {
+ return precision < 0 ?
+ FMT_SWPRINTF(buffer, size, format, value) :
+ FMT_SWPRINTF(buffer, size, format, precision, value);
+ }
+ return precision < 0 ?
+ FMT_SWPRINTF(buffer, size, format, width, value) :
+ FMT_SWPRINTF(buffer, size, format, width, precision, value);
+}
+
+template <typename T>
+const char fmt::internal::BasicData<T>::DIGITS[] =
+ "0001020304050607080910111213141516171819"
+ "2021222324252627282930313233343536373839"
+ "4041424344454647484950515253545556575859"
+ "6061626364656667686970717273747576777879"
+ "8081828384858687888990919293949596979899";
+
+#define FMT_POWERS_OF_10(factor) \
+ factor * 10, \
+ factor * 100, \
+ factor * 1000, \
+ factor * 10000, \
+ factor * 100000, \
+ factor * 1000000, \
+ factor * 10000000, \
+ factor * 100000000, \
+ factor * 1000000000
+
+template <typename T>
+const uint32_t fmt::internal::BasicData<T>::POWERS_OF_10_32[] = {
+ 0, FMT_POWERS_OF_10(1)
+};
+
+template <typename T>
+const uint64_t fmt::internal::BasicData<T>::POWERS_OF_10_64[] = {
+ 0,
+ FMT_POWERS_OF_10(1),
+ FMT_POWERS_OF_10(fmt::ULongLong(1000000000)),
+ // Multiply several constants instead of using a single long long constant
+ // to avoid warnings about C++98 not supporting long long.
+ fmt::ULongLong(1000000000) * fmt::ULongLong(1000000000) * 10
+};
+
+FMT_FUNC void fmt::internal::report_unknown_type(char code, const char *type) {
+ (void)type;
+ if (std::isprint(static_cast<unsigned char>(code))) {
+ FMT_THROW(fmt::FormatError(
+ fmt::format("unknown format code '{}' for {}", code, type)));
+ }
+ FMT_THROW(fmt::FormatError(
+ fmt::format("unknown format code '\\x{:02x}' for {}",
+ static_cast<unsigned>(code), type)));
+}
+
+#ifdef _WIN32
+
+FMT_FUNC fmt::internal::UTF8ToUTF16::UTF8ToUTF16(fmt::StringRef s) {
+ int length = MultiByteToWideChar(
+ CP_UTF8, MB_ERR_INVALID_CHARS, s.c_str(), -1, 0, 0);
+ static const char ERROR_MSG[] = "cannot convert string from UTF-8 to UTF-16";
+ if (length == 0)
+ FMT_THROW(WindowsError(GetLastError(), ERROR_MSG));
+ buffer_.resize(length);
+ length = MultiByteToWideChar(
+ CP_UTF8, MB_ERR_INVALID_CHARS, s.c_str(), -1, &buffer_[0], length);
+ if (length == 0)
+ FMT_THROW(WindowsError(GetLastError(), ERROR_MSG));
+}
+
+FMT_FUNC fmt::internal::UTF16ToUTF8::UTF16ToUTF8(fmt::WStringRef s) {
+ if (int error_code = convert(s)) {
+ FMT_THROW(WindowsError(error_code,
+ "cannot convert string from UTF-16 to UTF-8"));
+ }
+}
+
+FMT_FUNC int fmt::internal::UTF16ToUTF8::convert(fmt::WStringRef s) {
+ int length = WideCharToMultiByte(CP_UTF8, 0, s.c_str(), -1, 0, 0, 0, 0);
+ if (length == 0)
+ return GetLastError();
+ buffer_.resize(length);
+ length = WideCharToMultiByte(
+ CP_UTF8, 0, s.c_str(), -1, &buffer_[0], length, 0, 0);
+ if (length == 0)
+ return GetLastError();
+ return 0;
+}
+
+FMT_FUNC void fmt::WindowsError::init(
+ int err_code, StringRef format_str, ArgList args) {
+ error_code_ = err_code;
+ MemoryWriter w;
+ internal::format_windows_error(w, err_code, format(format_str, args));
+ std::runtime_error &base = *this;
+ base = std::runtime_error(w.str());
+}
+
+#endif
+
+FMT_FUNC void fmt::internal::format_system_error(
+ fmt::Writer &out, int error_code,
+ fmt::StringRef message) FMT_NOEXCEPT {
+ FMT_TRY {
+ MemoryBuffer<char, INLINE_BUFFER_SIZE> buffer;
+ buffer.resize(INLINE_BUFFER_SIZE);
+ for (;;) {
+ char *system_message = &buffer[0];
+ int result = safe_strerror(error_code, system_message, buffer.size());
+ if (result == 0) {
+ out << message << ": " << system_message;
+ return;
+ }
+ if (result != ERANGE)
+ break; // Can't get error message, report error code instead.
+ buffer.resize(buffer.size() * 2);
+ }
+ } FMT_CATCH(...) {}
+ format_error_code(out, error_code, message);
+}
+
+#ifdef _WIN32
+FMT_FUNC void fmt::internal::format_windows_error(
+ fmt::Writer &out, int error_code,
+ fmt::StringRef message) FMT_NOEXCEPT {
+ class String {
+ private:
+ LPWSTR str_;
+
+ public:
+ String() : str_() {}
+ ~String() { LocalFree(str_); }
+ LPWSTR *ptr() { return &str_; }
+ LPCWSTR c_str() const { return str_; }
+ };
+ FMT_TRY {
+ String system_message;
+ if (FormatMessageW(FORMAT_MESSAGE_ALLOCATE_BUFFER |
+ FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, 0,
+ error_code, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
+ reinterpret_cast<LPWSTR>(system_message.ptr()), 0, 0)) {
+ UTF16ToUTF8 utf8_message;
+ if (utf8_message.convert(system_message.c_str()) == ERROR_SUCCESS) {
+ out << message << ": " << utf8_message;
+ return;
+ }
+ }
+ } FMT_CATCH(...) {}
+ format_error_code(out, error_code, message);
+}
+#endif
+
+// An argument formatter.
+template <typename Char>
+class fmt::internal::ArgFormatter :
+ public fmt::internal::ArgVisitor<fmt::internal::ArgFormatter<Char>, void> {
+ private:
+ fmt::BasicFormatter<Char> &formatter_;
+ fmt::BasicWriter<Char> &writer_;
+ fmt::FormatSpec &spec_;
+ const Char *format_;
+
+ FMT_DISALLOW_COPY_AND_ASSIGN(ArgFormatter);
+
+ public:
+ ArgFormatter(
+ fmt::BasicFormatter<Char> &f,fmt::FormatSpec &s, const Char *fmt)
+ : formatter_(f), writer_(f.writer()), spec_(s), format_(fmt) {}
+
+ template <typename T>
+ void visit_any_int(T value) { writer_.write_int(value, spec_); }
+
+ template <typename T>
+ void visit_any_double(T value) { writer_.write_double(value, spec_); }
+
+ void visit_char(int value) {
+ if (spec_.type_ && spec_.type_ != 'c') {
+ spec_.flags_ |= CHAR_FLAG;
+ writer_.write_int(value, spec_);
+ return;
+ }
+ if (spec_.align_ == ALIGN_NUMERIC || spec_.flags_ != 0)
+ FMT_THROW(FormatError("invalid format specifier for char"));
+ typedef typename fmt::BasicWriter<Char>::CharPtr CharPtr;
+ Char fill = static_cast<Char>(spec_.fill());
+ if (spec_.precision_ == 0) {
+ std::fill_n(writer_.grow_buffer(spec_.width_), spec_.width_, fill);
+ return;
+ }
+ CharPtr out = CharPtr();
+ if (spec_.width_ > 1) {
+ out = writer_.grow_buffer(spec_.width_);
+ if (spec_.align_ == fmt::ALIGN_RIGHT) {
+ std::fill_n(out, spec_.width_ - 1, fill);
+ out += spec_.width_ - 1;
+ } else if (spec_.align_ == fmt::ALIGN_CENTER) {
+ out = writer_.fill_padding(out, spec_.width_, 1, fill);
+ } else {
+ std::fill_n(out + 1, spec_.width_ - 1, fill);
+ }
+ } else {
+ out = writer_.grow_buffer(1);
+ }
+ *out = static_cast<Char>(value);
+ }
+
+ void visit_string(Arg::StringValue<char> value) {
+ writer_.write_str(value, spec_);
+ }
+ void visit_wstring(Arg::StringValue<wchar_t> value) {
+ writer_.write_str(ignore_incompatible_str<Char>(value), spec_);
+ }
+
+ void visit_pointer(const void *value) {
+ if (spec_.type_ && spec_.type_ != 'p')
+ fmt::internal::report_unknown_type(spec_.type_, "pointer");
+ spec_.flags_ = fmt::HASH_FLAG;
+ spec_.type_ = 'x';
+ writer_.write_int(reinterpret_cast<uintptr_t>(value), spec_);
+ }
+
+ void visit_custom(Arg::CustomValue c) {
+ c.format(&formatter_, c.value, &format_);
+ }
+};
+
+template <typename Char>
+void fmt::internal::FixedBuffer<Char>::grow(std::size_t) {
+ FMT_THROW(std::runtime_error("buffer overflow"));
+}
+
+template <typename Char>
+template <typename StrChar>
+void fmt::BasicWriter<Char>::write_str(
+ const Arg::StringValue<StrChar> &s, const FormatSpec &spec) {
+ // Check if StrChar is convertible to Char.
+ internal::CharTraits<Char>::convert(StrChar());
+ if (spec.type_ && spec.type_ != 's')
+ internal::report_unknown_type(spec.type_, "string");
+ const StrChar *str_value = s.value;
+ std::size_t str_size = s.size;
+ if (str_size == 0) {
+ if (!str_value)
+ FMT_THROW(FormatError("string pointer is null"));
+ if (*str_value)
+ str_size = std::char_traits<StrChar>::length(str_value);
+ }
+ std::size_t precision = spec.precision_;
+ if (spec.precision_ >= 0 && precision < str_size)
+ str_size = spec.precision_;
+ write_str(str_value, str_size, spec);
+}
+
+template <typename Char>
+inline Arg fmt::BasicFormatter<Char>::parse_arg_index(const Char *&s) {
+ const char *error = 0;
+ Arg arg = *s < '0' || *s > '9' ?
+ next_arg(error) : get_arg(parse_nonnegative_int(s), error);
+ if (error) {
+ FMT_THROW(FormatError(
+ *s != '}' && *s != ':' ? "invalid format string" : error));
+ }
+ return arg;
+}
+
+FMT_FUNC Arg fmt::internal::FormatterBase::do_get_arg(
+ unsigned arg_index, const char *&error) {
+ Arg arg = args_[arg_index];
+ if (arg.type == Arg::NONE)
+ error = "argument index out of range";
+ return arg;
+}
+
+inline Arg fmt::internal::FormatterBase::next_arg(const char *&error) {
+ if (next_arg_index_ >= 0)
+ return do_get_arg(next_arg_index_++, error);
+ error = "cannot switch from manual to automatic argument indexing";
+ return Arg();
+}
+
+inline Arg fmt::internal::FormatterBase::get_arg(
+ unsigned arg_index, const char *&error) {
+ if (next_arg_index_ <= 0) {
+ next_arg_index_ = -1;
+ return do_get_arg(arg_index, error);
+ }
+ error = "cannot switch from automatic to manual argument indexing";
+ return Arg();
+}
+
+template <typename Char>
+void fmt::internal::PrintfFormatter<Char>::parse_flags(
+ FormatSpec &spec, const Char *&s) {
+ for (;;) {
+ switch (*s++) {
+ case '-':
+ spec.align_ = ALIGN_LEFT;
+ break;
+ case '+':
+ spec.flags_ |= SIGN_FLAG | PLUS_FLAG;
+ break;
+ case '0':
+ spec.fill_ = '0';
+ break;
+ case ' ':
+ spec.flags_ |= SIGN_FLAG;
+ break;
+ case '#':
+ spec.flags_ |= HASH_FLAG;
+ break;
+ default:
+ --s;
+ return;
+ }
+ }
+}
+
+template <typename Char>
+Arg fmt::internal::PrintfFormatter<Char>::get_arg(
+ const Char *s, unsigned arg_index) {
+ (void)s;
+ const char *error = 0;
+ Arg arg = arg_index == UINT_MAX ?
+ next_arg(error) : FormatterBase::get_arg(arg_index - 1, error);
+ if (error)
+ FMT_THROW(FormatError(!*s ? "invalid format string" : error));
+ return arg;
+}
+
+template <typename Char>
+unsigned fmt::internal::PrintfFormatter<Char>::parse_header(
+ const Char *&s, FormatSpec &spec) {
+ unsigned arg_index = UINT_MAX;
+ Char c = *s;
+ if (c >= '0' && c <= '9') {
+ // Parse an argument index (if followed by '$') or a width possibly
+ // preceded with '0' flag(s).
+ unsigned value = parse_nonnegative_int(s);
+ if (*s == '$') { // value is an argument index
+ ++s;
+ arg_index = value;
+ } else {
+ if (c == '0')
+ spec.fill_ = '0';
+ if (value != 0) {
+ // Nonzero value means that we parsed width and don't need to
+ // parse it or flags again, so return now.
+ spec.width_ = value;
+ return arg_index;
+ }
+ }
+ }
+ parse_flags(spec, s);
+ // Parse width.
+ if (*s >= '0' && *s <= '9') {
+ spec.width_ = parse_nonnegative_int(s);
+ } else if (*s == '*') {
+ ++s;
+ spec.width_ = WidthHandler(spec).visit(get_arg(s));
+ }
+ return arg_index;
+}
+
+template <typename Char>
+void fmt::internal::PrintfFormatter<Char>::format(
+ BasicWriter<Char> &writer, BasicStringRef<Char> format_str,
+ const ArgList &args) {
+ const Char *start = format_str.c_str();
+ set_args(args);
+ const Char *s = start;
+ while (*s) {
+ Char c = *s++;
+ if (c != '%') continue;
+ if (*s == c) {
+ write(writer, start, s);
+ start = ++s;
+ continue;
+ }
+ write(writer, start, s - 1);
+
+ FormatSpec spec;
+ spec.align_ = ALIGN_RIGHT;
+
+ // Parse argument index, flags and width.
+ unsigned arg_index = parse_header(s, spec);
+
+ // Parse precision.
+ if (*s == '.') {
+ ++s;
+ if ('0' <= *s && *s <= '9') {
+ spec.precision_ = parse_nonnegative_int(s);
+ } else if (*s == '*') {
+ ++s;
+ spec.precision_ = PrecisionHandler().visit(get_arg(s));
+ }
+ }
+
+ Arg arg = get_arg(s, arg_index);
+ if (spec.flag(HASH_FLAG) && IsZeroInt().visit(arg))
+ spec.flags_ &= ~HASH_FLAG;
+ if (spec.fill_ == '0') {
+ if (arg.type <= Arg::LAST_NUMERIC_TYPE)
+ spec.align_ = ALIGN_NUMERIC;
+ else
+ spec.fill_ = ' '; // Ignore '0' flag for non-numeric types.
+ }
+
+ // Parse length and convert the argument to the required type.
+ switch (*s++) {
+ case 'h':
+ if (*s == 'h')
+ ArgConverter<signed char>(arg, *++s).visit(arg);
+ else
+ ArgConverter<short>(arg, *s).visit(arg);
+ break;
+ case 'l':
+ if (*s == 'l')
+ ArgConverter<fmt::LongLong>(arg, *++s).visit(arg);
+ else
+ ArgConverter<long>(arg, *s).visit(arg);
+ break;
+ case 'j':
+ ArgConverter<intmax_t>(arg, *s).visit(arg);
+ break;
+ case 'z':
+ ArgConverter<size_t>(arg, *s).visit(arg);
+ break;
+ case 't':
+ ArgConverter<ptrdiff_t>(arg, *s).visit(arg);
+ break;
+ case 'L':
+ // printf produces garbage when 'L' is omitted for long double, no
+ // need to do the same.
+ break;
+ default:
+ --s;
+ ArgConverter<int>(arg, *s).visit(arg);
+ }
+
+ // Parse type.
+ if (!*s)
+ FMT_THROW(FormatError("invalid format string"));
+ spec.type_ = static_cast<char>(*s++);
+ if (arg.type <= Arg::LAST_INTEGER_TYPE) {
+ // Normalize type.
+ switch (spec.type_) {
+ case 'i': case 'u':
+ spec.type_ = 'd';
+ break;
+ case 'c':
+ // TODO: handle wchar_t
+ CharConverter(arg).visit(arg);
+ break;
+ }
+ }
+
+ start = s;
+
+ // Format argument.
+ switch (arg.type) {
+ case Arg::INT:
+ writer.write_int(arg.int_value, spec);
+ break;
+ case Arg::UINT:
+ writer.write_int(arg.uint_value, spec);
+ break;
+ case Arg::LONG_LONG:
+ writer.write_int(arg.long_long_value, spec);
+ break;
+ case Arg::ULONG_LONG:
+ writer.write_int(arg.ulong_long_value, spec);
+ break;
+ case Arg::CHAR: {
+ if (spec.type_ && spec.type_ != 'c')
+ writer.write_int(arg.int_value, spec);
+ typedef typename BasicWriter<Char>::CharPtr CharPtr;
+ CharPtr out = CharPtr();
+ if (spec.width_ > 1) {
+ Char fill = ' ';
+ out = writer.grow_buffer(spec.width_);
+ if (spec.align_ != ALIGN_LEFT) {
+ std::fill_n(out, spec.width_ - 1, fill);
+ out += spec.width_ - 1;
+ } else {
+ std::fill_n(out + 1, spec.width_ - 1, fill);
+ }
+ } else {
+ out = writer.grow_buffer(1);
+ }
+ *out = static_cast<Char>(arg.int_value);
+ break;
+ }
+ case Arg::DOUBLE:
+ writer.write_double(arg.double_value, spec);
+ break;
+ case Arg::LONG_DOUBLE:
+ writer.write_double(arg.long_double_value, spec);
+ break;
+ case Arg::CSTRING:
+ arg.string.size = 0;
+ writer.write_str(arg.string, spec);
+ break;
+ case Arg::STRING:
+ writer.write_str(arg.string, spec);
+ break;
+ case Arg::WSTRING:
+ writer.write_str(ignore_incompatible_str<Char>(arg.wstring), spec);
+ break;
+ case Arg::POINTER:
+ if (spec.type_ && spec.type_ != 'p')
+ internal::report_unknown_type(spec.type_, "pointer");
+ spec.flags_= HASH_FLAG;
+ spec.type_ = 'x';
+ writer.write_int(reinterpret_cast<uintptr_t>(arg.pointer), spec);
+ break;
+ case Arg::CUSTOM: {
+ if (spec.type_)
+ internal::report_unknown_type(spec.type_, "object");
+ const void *str_format = "s";
+ arg.custom.format(&writer, arg.custom.value, &str_format);
+ break;
+ }
+ default:
+ assert(false);
+ break;
+ }
+ }
+ write(writer, start, s);
+}
+
+template <typename Char>
+const Char *fmt::BasicFormatter<Char>::format(
+ const Char *&format_str, const Arg &arg) {
+ const Char *s = format_str;
+ FormatSpec spec;
+ if (*s == ':') {
+ if (arg.type == Arg::CUSTOM) {
+ arg.custom.format(this, arg.custom.value, &s);
+ return s;
+ }
+ ++s;
+ // Parse fill and alignment.
+ if (Char c = *s) {
+ const Char *p = s + 1;
+ spec.align_ = ALIGN_DEFAULT;
+ do {
+ switch (*p) {
+ case '<':
+ spec.align_ = ALIGN_LEFT;
+ break;
+ case '>':
+ spec.align_ = ALIGN_RIGHT;
+ break;
+ case '=':
+ spec.align_ = ALIGN_NUMERIC;
+ break;
+ case '^':
+ spec.align_ = ALIGN_CENTER;
+ break;
+ }
+ if (spec.align_ != ALIGN_DEFAULT) {
+ if (p != s) {
+ if (c == '}') break;
+ if (c == '{')
+ FMT_THROW(FormatError("invalid fill character '{'"));
+ s += 2;
+ spec.fill_ = c;
+ } else ++s;
+ if (spec.align_ == ALIGN_NUMERIC)
+ require_numeric_argument(arg, '=');
+ break;
+ }
+ } while (--p >= s);
+ }
+
+ // Parse sign.
+ switch (*s) {
+ case '+':
+ check_sign(s, arg);
+ spec.flags_ |= SIGN_FLAG | PLUS_FLAG;
+ break;
+ case '-':
+ check_sign(s, arg);
+ spec.flags_ |= MINUS_FLAG;
+ break;
+ case ' ':
+ check_sign(s, arg);
+ spec.flags_ |= SIGN_FLAG;
+ break;
+ }
+
+ if (*s == '#') {
+ require_numeric_argument(arg, '#');
+ spec.flags_ |= HASH_FLAG;
+ ++s;
+ }
+
+ // Parse width and zero flag.
+ if ('0' <= *s && *s <= '9') {
+ if (*s == '0') {
+ require_numeric_argument(arg, '0');
+ spec.align_ = ALIGN_NUMERIC;
+ spec.fill_ = '0';
+ }
+ // Zero may be parsed again as a part of the width, but it is simpler
+ // and more efficient than checking if the next char is a digit.
+ spec.width_ = parse_nonnegative_int(s);
+ }
+
+ // Parse precision.
+ if (*s == '.') {
+ ++s;
+ spec.precision_ = 0;
+ if ('0' <= *s && *s <= '9') {
+ spec.precision_ = parse_nonnegative_int(s);
+ } else if (*s == '{') {
+ ++s;
+ const Arg &precision_arg = parse_arg_index(s);
+ if (*s++ != '}')
+ FMT_THROW(FormatError("invalid format string"));
+ ULongLong value = 0;
+ switch (precision_arg.type) {
+ case Arg::INT:
+ if (precision_arg.int_value < 0)
+ FMT_THROW(FormatError("negative precision"));
+ value = precision_arg.int_value;
+ break;
+ case Arg::UINT:
+ value = precision_arg.uint_value;
+ break;
+ case Arg::LONG_LONG:
+ if (precision_arg.long_long_value < 0)
+ FMT_THROW(FormatError("negative precision"));
+ value = precision_arg.long_long_value;
+ break;
+ case Arg::ULONG_LONG:
+ value = precision_arg.ulong_long_value;
+ break;
+ default:
+ FMT_THROW(FormatError("precision is not integer"));
+ }
+ if (value > INT_MAX)
+ FMT_THROW(FormatError("number is too big"));
+ spec.precision_ = static_cast<int>(value);
+ } else {
+ FMT_THROW(FormatError("missing precision specifier"));
+ }
+ if (arg.type < Arg::LAST_INTEGER_TYPE || arg.type == Arg::POINTER) {
+ FMT_THROW(FormatError(
+ fmt::format("precision not allowed in {} format specifier",
+ arg.type == Arg::POINTER ? "pointer" : "integer")));
+ }
+ }
+
+ // Parse type.
+ if (*s != '}' && *s)
+ spec.type_ = static_cast<char>(*s++);
+ }
+
+ if (*s++ != '}')
+ FMT_THROW(FormatError("missing '}' in format string"));
+ start_ = s;
+
+ // Format argument.
+ internal::ArgFormatter<Char>(*this, spec, s - 1).visit(arg);
+ return s;
+}
+
+template <typename Char>
+void fmt::BasicFormatter<Char>::format(
+ BasicStringRef<Char> format_str, const ArgList &args) {
+ const Char *s = start_ = format_str.c_str();
+ set_args(args);
+ while (*s) {
+ Char c = *s++;
+ if (c != '{' && c != '}') continue;
+ if (*s == c) {
+ write(writer_, start_, s);
+ start_ = ++s;
+ continue;
+ }
+ if (c == '}')
+ FMT_THROW(FormatError("unmatched '}' in format string"));
+ write(writer_, start_, s - 1);
+ Arg arg = parse_arg_index(s);
+ s = format(s, arg);
+ }
+ write(writer_, start_, s);
+}
+
+FMT_FUNC void fmt::report_system_error(
+ int error_code, fmt::StringRef message) FMT_NOEXCEPT {
+ report_error(internal::format_system_error, error_code, message);
+}
+
+#ifdef _WIN32
+FMT_FUNC void fmt::report_windows_error(
+ int error_code, fmt::StringRef message) FMT_NOEXCEPT {
+ report_error(internal::format_windows_error, error_code, message);
+}
+#endif
+
+FMT_FUNC void fmt::print(std::FILE *f, StringRef format_str, ArgList args) {
+ MemoryWriter w;
+ w.write(format_str, args);
+ std::fwrite(w.data(), 1, w.size(), f);
+}
+
+FMT_FUNC void fmt::print(StringRef format_str, ArgList args) {
+ print(stdout, format_str, args);
+}
+
+FMT_FUNC void fmt::print(std::ostream &os, StringRef format_str, ArgList args) {
+ MemoryWriter w;
+ w.write(format_str, args);
+ os.write(w.data(), w.size());
+}
+
+FMT_FUNC void fmt::print_colored(Color c, StringRef format, ArgList args) {
+ char escape[] = "\x1b[30m";
+ escape[3] = '0' + static_cast<char>(c);
+ std::fputs(escape, stdout);
+ print(format, args);
+ std::fputs(RESET_COLOR, stdout);
+}
+
+FMT_FUNC int fmt::fprintf(std::FILE *f, StringRef format, ArgList args) {
+ MemoryWriter w;
+ printf(w, format, args);
+ std::size_t size = w.size();
+ return std::fwrite(w.data(), 1, size, f) < size ? -1 : static_cast<int>(size);
+}
+
+#ifndef FMT_HEADER_ONLY
+
+// Explicit instantiations for char.
+
+template void fmt::internal::FixedBuffer<char>::grow(std::size_t);
+
+template const char *fmt::BasicFormatter<char>::format(
+ const char *&format_str, const fmt::internal::Arg &arg);
+
+template void fmt::BasicFormatter<char>::format(
+ BasicStringRef<char> format, const ArgList &args);
+
+template void fmt::internal::PrintfFormatter<char>::format(
+ BasicWriter<char> &writer, BasicStringRef<char> format, const ArgList &args);
+
+template int fmt::internal::CharTraits<char>::format_float(
+ char *buffer, std::size_t size, const char *format,
+ unsigned width, int precision, double value);
+
+template int fmt::internal::CharTraits<char>::format_float(
+ char *buffer, std::size_t size, const char *format,
+ unsigned width, int precision, long double value);
+
+// Explicit instantiations for wchar_t.
+
+template void fmt::internal::FixedBuffer<wchar_t>::grow(std::size_t);
+
+template const wchar_t *fmt::BasicFormatter<wchar_t>::format(
+ const wchar_t *&format_str, const fmt::internal::Arg &arg);
+
+template void fmt::BasicFormatter<wchar_t>::format(
+ BasicStringRef<wchar_t> format, const ArgList &args);
+
+template void fmt::internal::PrintfFormatter<wchar_t>::format(
+ BasicWriter<wchar_t> &writer, BasicStringRef<wchar_t> format,
+ const ArgList &args);
+
+template int fmt::internal::CharTraits<wchar_t>::format_float(
+ wchar_t *buffer, std::size_t size, const wchar_t *format,
+ unsigned width, int precision, double value);
+
+template int fmt::internal::CharTraits<wchar_t>::format_float(
+ wchar_t *buffer, std::size_t size, const wchar_t *format,
+ unsigned width, int precision, long double value);
+
+#endif // FMT_HEADER_ONLY
+
+#if _MSC_VER
+# pragma warning(pop)
+#endif
diff --git a/dep/cppformat/format.h b/dep/cppformat/format.h
new file mode 100644
index 00000000000..0a67f3f977d
--- /dev/null
+++ b/dep/cppformat/format.h
@@ -0,0 +1,2680 @@
+/*
+ Formatting library for C++
+
+ Copyright (c) 2012 - 2015, Victor Zverovich
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice, this
+ list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
+ ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef FMT_FORMAT_H_
+#define FMT_FORMAT_H_
+
+#include <stdint.h>
+
+#include <cassert>
+#include <cmath>
+#include <cstddef> // for std::ptrdiff_t
+#include <cstdio>
+#include <algorithm>
+#include <limits>
+#include <stdexcept>
+#include <string>
+#include <sstream>
+
+#if _SECURE_SCL
+# include <iterator>
+#endif
+
+#ifdef _MSC_VER
+# include <intrin.h> // _BitScanReverse, _BitScanReverse64
+
+namespace fmt {
+namespace internal {
+# pragma intrinsic(_BitScanReverse)
+inline uint32_t clz(uint32_t x) {
+ unsigned long r = 0;
+ _BitScanReverse(&r, x);
+ return 31 - r;
+}
+# define FMT_BUILTIN_CLZ(n) fmt::internal::clz(n)
+
+# ifdef _WIN64
+# pragma intrinsic(_BitScanReverse64)
+# endif
+
+inline uint32_t clzll(uint64_t x) {
+ unsigned long r = 0;
+# ifdef _WIN64
+ _BitScanReverse64(&r, x);
+# else
+ // Scan the high 32 bits.
+ if (_BitScanReverse(&r, static_cast<uint32_t>(x >> 32)))
+ return 63 - (r + 32);
+
+ // Scan the low 32 bits.
+ _BitScanReverse(&r, static_cast<uint32_t>(x));
+# endif
+ return 63 - r;
+}
+# define FMT_BUILTIN_CLZLL(n) fmt::internal::clzll(n)
+}
+}
+#endif
+
+#ifdef __GNUC__
+# define FMT_GCC_VERSION (__GNUC__ * 100 + __GNUC_MINOR__)
+# define FMT_GCC_EXTENSION __extension__
+# if FMT_GCC_VERSION >= 406
+# pragma GCC diagnostic push
+// Disable the warning about "long long" which is sometimes reported even
+// when using __extension__.
+# pragma GCC diagnostic ignored "-Wlong-long"
+// Disable the warning about declaration shadowing because it affects too
+// many valid cases.
+# pragma GCC diagnostic ignored "-Wshadow"
+# endif
+# if __cplusplus >= 201103L || defined __GXX_EXPERIMENTAL_CXX0X__
+# define FMT_HAS_GXX_CXX11 1
+# endif
+#else
+# define FMT_GCC_EXTENSION
+#endif
+
+#ifdef __clang__
+# pragma clang diagnostic ignored "-Wdocumentation"
+#endif
+
+#ifdef __GNUC_LIBSTD__
+# define FMT_GNUC_LIBSTD_VERSION (__GNUC_LIBSTD__ * 100 + __GNUC_LIBSTD_MINOR__)
+#endif
+
+#ifdef __has_feature
+# define FMT_HAS_FEATURE(x) __has_feature(x)
+#else
+# define FMT_HAS_FEATURE(x) 0
+#endif
+
+#ifdef __has_builtin
+# define FMT_HAS_BUILTIN(x) __has_builtin(x)
+#else
+# define FMT_HAS_BUILTIN(x) 0
+#endif
+
+#ifdef __has_cpp_attribute
+# define FMT_HAS_CPP_ATTRIBUTE(x) __has_cpp_attribute(x)
+#else
+# define FMT_HAS_CPP_ATTRIBUTE(x) 0
+#endif
+
+#ifndef FMT_USE_VARIADIC_TEMPLATES
+// Variadic templates are available in GCC since version 4.4
+// (http://gcc.gnu.org/projects/cxx0x.html) and in Visual C++
+// since version 2013.
+# define FMT_USE_VARIADIC_TEMPLATES \
+ (FMT_HAS_FEATURE(cxx_variadic_templates) || \
+ (FMT_GCC_VERSION >= 404 && FMT_HAS_GXX_CXX11) || _MSC_VER >= 1800)
+#endif
+
+#ifndef FMT_USE_RVALUE_REFERENCES
+// Don't use rvalue references when compiling with clang and an old libstdc++
+// as the latter doesn't provide std::move.
+# if defined(FMT_GNUC_LIBSTD_VERSION) && FMT_GNUC_LIBSTD_VERSION <= 402
+# define FMT_USE_RVALUE_REFERENCES 0
+# else
+# define FMT_USE_RVALUE_REFERENCES \
+ (FMT_HAS_FEATURE(cxx_rvalue_references) || \
+ (FMT_GCC_VERSION >= 403 && FMT_HAS_GXX_CXX11) || _MSC_VER >= 1600)
+# endif
+#endif
+
+#if FMT_USE_RVALUE_REFERENCES
+# include <utility> // for std::move
+#endif
+
+// Define FMT_USE_NOEXCEPT to make C++ Format use noexcept (C++11 feature).
+#if FMT_USE_NOEXCEPT || FMT_HAS_FEATURE(cxx_noexcept) || \
+ (FMT_GCC_VERSION >= 408 && FMT_HAS_GXX_CXX11)
+# define FMT_NOEXCEPT noexcept
+#else
+# define FMT_NOEXCEPT throw()
+#endif
+
+// A macro to disallow the copy constructor and operator= functions
+// This should be used in the private: declarations for a class
+#if FMT_USE_DELETED_FUNCTIONS || FMT_HAS_FEATURE(cxx_deleted_functions) || \
+ (FMT_GCC_VERSION >= 404 && FMT_HAS_GXX_CXX11) || _MSC_VER >= 1800
+# define FMT_DISALLOW_COPY_AND_ASSIGN(TypeName) \
+ TypeName(const TypeName&) = delete; \
+ TypeName& operator=(const TypeName&) = delete
+#else
+# define FMT_DISALLOW_COPY_AND_ASSIGN(TypeName) \
+ TypeName(const TypeName&); \
+ TypeName& operator=(const TypeName&)
+#endif
+
+namespace fmt {
+
+// Fix the warning about long long on older versions of GCC
+// that don't support the diagnostic pragma.
+FMT_GCC_EXTENSION typedef long long LongLong;
+FMT_GCC_EXTENSION typedef unsigned long long ULongLong;
+
+#if FMT_USE_RVALUE_REFERENCES
+using std::move;
+#endif
+
+template <typename Char>
+class BasicWriter;
+
+typedef BasicWriter<char> Writer;
+typedef BasicWriter<wchar_t> WWriter;
+
+template <typename Char>
+class BasicFormatter;
+
+template <typename Char, typename T>
+void format(BasicFormatter<Char> &f, const Char *&format_str, const T &value);
+
+/**
+ \rst
+ A string reference. It can be constructed from a C string or
+ ``std::string``.
+
+ You can use one of the following typedefs for common character types:
+
+ +------------+-------------------------+
+ | Type | Definition |
+ +============+=========================+
+ | StringRef | BasicStringRef<char> |
+ +------------+-------------------------+
+ | WStringRef | BasicStringRef<wchar_t> |
+ +------------+-------------------------+
+
+ This class is most useful as a parameter type to allow passing
+ different types of strings to a function, for example::
+
+ template <typename... Args>
+ std::string format(StringRef format_str, const Args & ... args);
+
+ format("{}", 42);
+ format(std::string("{}"), 42);
+ \endrst
+ */
+template <typename Char>
+class BasicStringRef {
+ private:
+ const Char *data_;
+ std::size_t size_;
+
+ public:
+ /**
+ Constructs a string reference object from a C string and a size.
+ */
+ BasicStringRef(const Char *s, std::size_t size) : data_(s), size_(size) {}
+
+ /**
+ Constructs a string reference object from a C string computing
+ the size with ``std::char_traits<Char>::length``.
+ */
+ BasicStringRef(const Char *s)
+ : data_(s), size_(std::char_traits<Char>::length(s)) {}
+
+ /**
+ Constructs a string reference from an `std::string` object.
+ */
+ BasicStringRef(const std::basic_string<Char> &s)
+ : data_(s.c_str()), size_(s.size()) {}
+
+ /**
+ Converts a string reference to an `std::string` object.
+ */
+ operator std::basic_string<Char>() const {
+ return std::basic_string<Char>(data_, size());
+ }
+
+ /**
+ Returns the pointer to a C string.
+ */
+ const Char *c_str() const { return data_; }
+
+ /**
+ Returns the string size.
+ */
+ std::size_t size() const { return size_; }
+
+ friend bool operator==(BasicStringRef lhs, BasicStringRef rhs) {
+ return lhs.data_ == rhs.data_;
+ }
+ friend bool operator!=(BasicStringRef lhs, BasicStringRef rhs) {
+ return lhs.data_ != rhs.data_;
+ }
+};
+
+typedef BasicStringRef<char> StringRef;
+typedef BasicStringRef<wchar_t> WStringRef;
+
+/**
+ A formatting error such as invalid format string.
+*/
+class FormatError : public std::runtime_error {
+ public:
+ explicit FormatError(StringRef message)
+ : std::runtime_error(message.c_str()) {}
+};
+
+namespace internal {
+
+// The number of characters to store in the MemoryBuffer object itself
+// to avoid dynamic memory allocation.
+enum { INLINE_BUFFER_SIZE = 500 };
+
+#if _SECURE_SCL
+// Use checked iterator to avoid warnings on MSVC.
+template <typename T>
+inline stdext::checked_array_iterator<T*> make_ptr(T *ptr, std::size_t size) {
+ return stdext::checked_array_iterator<T*>(ptr, size);
+}
+#else
+template <typename T>
+inline T *make_ptr(T *ptr, std::size_t) { return ptr; }
+#endif
+
+// A buffer for POD types. It supports a subset of std::vector's operations.
+template <typename T>
+class Buffer {
+ private:
+ FMT_DISALLOW_COPY_AND_ASSIGN(Buffer);
+
+ protected:
+ T *ptr_;
+ std::size_t size_;
+ std::size_t capacity_;
+
+ Buffer(T *ptr = 0, std::size_t capacity = 0)
+ : ptr_(ptr), size_(0), capacity_(capacity) {}
+
+ virtual void grow(std::size_t size) = 0;
+
+ public:
+ virtual ~Buffer() {}
+
+ // Returns the size of this buffer.
+ std::size_t size() const { return size_; }
+
+ // Returns the capacity of this buffer.
+ std::size_t capacity() const { return capacity_; }
+
+ // Resizes the buffer. If T is a POD type new elements are not initialized.
+ void resize(std::size_t new_size) {
+ if (new_size > capacity_)
+ grow(new_size);
+ size_ = new_size;
+ }
+
+ // Reserves space to store at least capacity elements.
+ void reserve(std::size_t capacity) {
+ if (capacity > capacity_)
+ grow(capacity);
+ }
+
+ void clear() FMT_NOEXCEPT { size_ = 0; }
+
+ void push_back(const T &value) {
+ if (size_ == capacity_)
+ grow(size_ + 1);
+ ptr_[size_++] = value;
+ }
+
+ // Appends data to the end of the buffer.
+ void append(const T *begin, const T *end);
+
+ T &operator[](std::size_t index) { return ptr_[index]; }
+ const T &operator[](std::size_t index) const { return ptr_[index]; }
+};
+
+template <typename T>
+void Buffer<T>::append(const T *begin, const T *end) {
+ std::ptrdiff_t num_elements = end - begin;
+ if (size_ + num_elements > capacity_)
+ grow(size_ + num_elements);
+ std::copy(begin, end, make_ptr(ptr_, capacity_) + size_);
+ size_ += num_elements;
+}
+
+// A memory buffer for POD types with the first SIZE elements stored in
+// the object itself.
+template <typename T, std::size_t SIZE, typename Allocator = std::allocator<T> >
+class MemoryBuffer : private Allocator, public Buffer<T> {
+ private:
+ T data_[SIZE];
+
+ // Free memory allocated by the buffer.
+ void free() {
+ if (this->ptr_ != data_) this->deallocate(this->ptr_, this->capacity_);
+ }
+
+ protected:
+ void grow(std::size_t size);
+
+ public:
+ explicit MemoryBuffer(const Allocator &alloc = Allocator())
+ : Allocator(alloc), Buffer<T>(data_, SIZE) {}
+ ~MemoryBuffer() { free(); }
+
+#if FMT_USE_RVALUE_REFERENCES
+ private:
+ // Move data from other to this buffer.
+ void move(MemoryBuffer &other) {
+ Allocator &this_alloc = *this, &other_alloc = other;
+ this_alloc = std::move(other_alloc);
+ this->size_ = other.size_;
+ this->capacity_ = other.capacity_;
+ if (other.ptr_ == other.data_) {
+ this->ptr_ = data_;
+ std::copy(other.data_,
+ other.data_ + this->size_, make_ptr(data_, this->capacity_));
+ } else {
+ this->ptr_ = other.ptr_;
+ // Set pointer to the inline array so that delete is not called
+ // when freeing.
+ other.ptr_ = other.data_;
+ }
+ }
+
+ public:
+ MemoryBuffer(MemoryBuffer &&other) {
+ move(other);
+ }
+
+ MemoryBuffer &operator=(MemoryBuffer &&other) {
+ assert(this != &other);
+ free();
+ move(other);
+ return *this;
+ }
+#endif
+
+ // Returns a copy of the allocator associated with this buffer.
+ Allocator get_allocator() const { return *this; }
+};
+
+template <typename T, std::size_t SIZE, typename Allocator>
+void MemoryBuffer<T, SIZE, Allocator>::grow(std::size_t size) {
+ std::size_t new_capacity =
+ (std::max)(size, this->capacity_ + this->capacity_ / 2);
+ T *new_ptr = this->allocate(new_capacity);
+ // The following code doesn't throw, so the raw pointer above doesn't leak.
+ std::copy(this->ptr_,
+ this->ptr_ + this->size_, make_ptr(new_ptr, new_capacity));
+ std::size_t old_capacity = this->capacity_;
+ T *old_ptr = this->ptr_;
+ this->capacity_ = new_capacity;
+ this->ptr_ = new_ptr;
+ // deallocate may throw (at least in principle), but it doesn't matter since
+ // the buffer already uses the new storage and will deallocate it in case
+ // of exception.
+ if (old_ptr != data_)
+ this->deallocate(old_ptr, old_capacity);
+}
+
+// A fixed-size buffer.
+template <typename Char>
+class FixedBuffer : public fmt::internal::Buffer<Char> {
+ public:
+ FixedBuffer(Char *array, std::size_t size)
+ : fmt::internal::Buffer<Char>(array, size) {}
+
+ protected:
+ void grow(std::size_t size);
+};
+
+#ifndef _MSC_VER
+// Portable version of signbit.
+inline int getsign(double x) {
+ // When compiled in C++11 mode signbit is no longer a macro but a function
+ // defined in namespace std and the macro is undefined.
+# ifdef signbit
+ return signbit(x);
+# else
+ return std::signbit(x);
+# endif
+}
+
+// Portable version of isinf.
+# ifdef isinf
+inline int isinfinity(double x) { return isinf(x); }
+inline int isinfinity(long double x) { return isinf(x); }
+# else
+inline int isinfinity(double x) { return std::isinf(x); }
+inline int isinfinity(long double x) { return std::isinf(x); }
+# endif
+#else
+inline int getsign(double value) {
+ if (value < 0) return 1;
+ if (value == value) return 0;
+ int dec = 0, sign = 0;
+ char buffer[2]; // The buffer size must be >= 2 or _ecvt_s will fail.
+ _ecvt_s(buffer, sizeof(buffer), value, 0, &dec, &sign);
+ return sign;
+}
+inline int isinfinity(double x) { return !_finite(x); }
+inline int isinfinity(long double x) { return !_finite(static_cast<double>(x)); }
+#endif
+
+template <typename Char>
+class BasicCharTraits {
+ public:
+#if _SECURE_SCL
+ typedef stdext::checked_array_iterator<Char*> CharPtr;
+#else
+ typedef Char *CharPtr;
+#endif
+};
+
+template <typename Char>
+class CharTraits;
+
+template <>
+class CharTraits<char> : public BasicCharTraits<char> {
+ private:
+ // Conversion from wchar_t to char is not allowed.
+ static char convert(wchar_t);
+
+public:
+ static char convert(char value) { return value; }
+
+ // Formats a floating-point number.
+ template <typename T>
+ static int format_float(char *buffer, std::size_t size,
+ const char *format, unsigned width, int precision, T value);
+};
+
+template <>
+class CharTraits<wchar_t> : public BasicCharTraits<wchar_t> {
+ public:
+ static wchar_t convert(char value) { return value; }
+ static wchar_t convert(wchar_t value) { return value; }
+
+ template <typename T>
+ static int format_float(wchar_t *buffer, std::size_t size,
+ const wchar_t *format, unsigned width, int precision, T value);
+};
+
+// Checks if a number is negative - used to avoid warnings.
+template <bool IsSigned>
+struct SignChecker {
+ template <typename T>
+ static bool is_negative(T value) { return value < 0; }
+};
+
+template <>
+struct SignChecker<false> {
+ template <typename T>
+ static bool is_negative(T) { return false; }
+};
+
+// Returns true if value is negative, false otherwise.
+// Same as (value < 0) but doesn't produce warnings if T is an unsigned type.
+template <typename T>
+inline bool is_negative(T value) {
+ return SignChecker<std::numeric_limits<T>::is_signed>::is_negative(value);
+}
+
+// Selects uint32_t if FitsIn32Bits is true, uint64_t otherwise.
+template <bool FitsIn32Bits>
+struct TypeSelector { typedef uint32_t Type; };
+
+template <>
+struct TypeSelector<false> { typedef uint64_t Type; };
+
+template <typename T>
+struct IntTraits {
+ // Smallest of uint32_t and uint64_t that is large enough to represent
+ // all values of T.
+ typedef typename
+ TypeSelector<std::numeric_limits<T>::digits <= 32>::Type MainType;
+};
+
+// MakeUnsigned<T>::Type gives an unsigned type corresponding to integer type T.
+template <typename T>
+struct MakeUnsigned { typedef T Type; };
+
+#define FMT_SPECIALIZE_MAKE_UNSIGNED(T, U) \
+ template <> \
+ struct MakeUnsigned<T> { typedef U Type; }
+
+FMT_SPECIALIZE_MAKE_UNSIGNED(char, unsigned char);
+FMT_SPECIALIZE_MAKE_UNSIGNED(signed char, unsigned char);
+FMT_SPECIALIZE_MAKE_UNSIGNED(short, unsigned short);
+FMT_SPECIALIZE_MAKE_UNSIGNED(int, unsigned);
+FMT_SPECIALIZE_MAKE_UNSIGNED(long, unsigned long);
+FMT_SPECIALIZE_MAKE_UNSIGNED(LongLong, ULongLong);
+
+void report_unknown_type(char code, const char *type);
+
+// Static data is placed in this class template to allow header-only
+// configuration.
+template <typename T = void>
+struct BasicData {
+ static const uint32_t POWERS_OF_10_32[];
+ static const uint64_t POWERS_OF_10_64[];
+ static const char DIGITS[];
+};
+
+typedef BasicData<> Data;
+
+#if FMT_GCC_VERSION >= 400 || FMT_HAS_BUILTIN(__builtin_clz)
+# define FMT_BUILTIN_CLZ(n) __builtin_clz(n)
+#endif
+
+#if FMT_GCC_VERSION >= 400 || FMT_HAS_BUILTIN(__builtin_clzll)
+# define FMT_BUILTIN_CLZLL(n) __builtin_clzll(n)
+#endif
+
+#ifdef FMT_BUILTIN_CLZLL
+// Returns the number of decimal digits in n. Leading zeros are not counted
+// except for n == 0 in which case count_digits returns 1.
+inline unsigned count_digits(uint64_t n) {
+ // Based on http://graphics.stanford.edu/~seander/bithacks.html#IntegerLog10
+ // and the benchmark https://github.com/localvoid/cxx-benchmark-count-digits.
+ unsigned t = (64 - FMT_BUILTIN_CLZLL(n | 1)) * 1233 >> 12;
+ return t - (n < Data::POWERS_OF_10_64[t]) + 1;
+}
+#else
+// Fallback version of count_digits used when __builtin_clz is not available.
+inline unsigned count_digits(uint64_t n) {
+ unsigned count = 1;
+ for (;;) {
+ // Integer division is slow so do it for a group of four digits instead
+ // of for every digit. The idea comes from the talk by Alexandrescu
+ // "Three Optimization Tips for C++". See speed-test for a comparison.
+ if (n < 10) return count;
+ if (n < 100) return count + 1;
+ if (n < 1000) return count + 2;
+ if (n < 10000) return count + 3;
+ n /= 10000u;
+ count += 4;
+ }
+}
+#endif
+
+#ifdef FMT_BUILTIN_CLZ
+// Optional version of count_digits for better performance on 32-bit platforms.
+inline unsigned count_digits(uint32_t n) {
+ uint32_t t = (32 - FMT_BUILTIN_CLZ(n | 1)) * 1233 >> 12;
+ return t - (n < Data::POWERS_OF_10_32[t]) + 1;
+}
+#endif
+
+// Formats a decimal unsigned integer value writing into buffer.
+template <typename UInt, typename Char>
+inline void format_decimal(Char *buffer, UInt value, unsigned num_digits) {
+ --num_digits;
+ while (value >= 100) {
+ // Integer division is slow so do it for a group of two digits instead
+ // of for every digit. The idea comes from the talk by Alexandrescu
+ // "Three Optimization Tips for C++". See speed-test for a comparison.
+ unsigned index = (value % 100) * 2;
+ value /= 100;
+ buffer[num_digits] = Data::DIGITS[index + 1];
+ buffer[num_digits - 1] = Data::DIGITS[index];
+ num_digits -= 2;
+ }
+ if (value < 10) {
+ *buffer = static_cast<char>('0' + value);
+ return;
+ }
+ unsigned index = static_cast<unsigned>(value * 2);
+ buffer[1] = Data::DIGITS[index + 1];
+ buffer[0] = Data::DIGITS[index];
+}
+
+#ifdef _WIN32
+// A converter from UTF-8 to UTF-16.
+// It is only provided for Windows since other systems support UTF-8 natively.
+class UTF8ToUTF16 {
+ private:
+ MemoryBuffer<wchar_t, INLINE_BUFFER_SIZE> buffer_;
+
+ public:
+ explicit UTF8ToUTF16(StringRef s);
+ operator WStringRef() const { return WStringRef(&buffer_[0], size()); }
+ size_t size() const { return buffer_.size() - 1; }
+ const wchar_t *c_str() const { return &buffer_[0]; }
+ std::wstring str() const { return std::wstring(&buffer_[0], size()); }
+};
+
+// A converter from UTF-16 to UTF-8.
+// It is only provided for Windows since other systems support UTF-8 natively.
+class UTF16ToUTF8 {
+ private:
+ MemoryBuffer<char, INLINE_BUFFER_SIZE> buffer_;
+
+ public:
+ UTF16ToUTF8() {}
+ explicit UTF16ToUTF8(WStringRef s);
+ operator StringRef() const { return StringRef(&buffer_[0], size()); }
+ size_t size() const { return buffer_.size() - 1; }
+ const char *c_str() const { return &buffer_[0]; }
+ std::string str() const { return std::string(&buffer_[0], size()); }
+
+ // Performs conversion returning a system error code instead of
+ // throwing exception on conversion error. This method may still throw
+ // in case of memory allocation error.
+ int convert(WStringRef s);
+};
+#endif
+
+void format_system_error(fmt::Writer &out, int error_code,
+ fmt::StringRef message) FMT_NOEXCEPT;
+
+#ifdef _WIN32
+void format_windows_error(fmt::Writer &out, int error_code,
+ fmt::StringRef message) FMT_NOEXCEPT;
+#endif
+
+// Computes max(Arg, 1) at compile time. It is used to avoid errors about
+// allocating an array of 0 size.
+template <unsigned Arg>
+struct NonZero {
+ enum { VALUE = Arg };
+};
+
+template <>
+struct NonZero<0> {
+ enum { VALUE = 1 };
+};
+
+// The value of a formatting argument. It is a POD type to allow storage in
+// internal::MemoryBuffer.
+struct Value {
+ template <typename Char>
+ struct StringValue {
+ const Char *value;
+ std::size_t size;
+ };
+
+ typedef void (*FormatFunc)(
+ void *formatter, const void *arg, void *format_str_ptr);
+
+ struct CustomValue {
+ const void *value;
+ FormatFunc format;
+ };
+
+ union {
+ int int_value;
+ unsigned uint_value;
+ LongLong long_long_value;
+ ULongLong ulong_long_value;
+ double double_value;
+ long double long_double_value;
+ const void *pointer;
+ StringValue<char> string;
+ StringValue<signed char> sstring;
+ StringValue<unsigned char> ustring;
+ StringValue<wchar_t> wstring;
+ CustomValue custom;
+ };
+};
+
+struct Arg : Value {
+ enum Type {
+ NONE,
+ // Integer types should go first,
+ INT, UINT, LONG_LONG, ULONG_LONG, CHAR, LAST_INTEGER_TYPE = CHAR,
+ // followed by floating-point types.
+ DOUBLE, LONG_DOUBLE, LAST_NUMERIC_TYPE = LONG_DOUBLE,
+ CSTRING, STRING, WSTRING, POINTER, CUSTOM
+ };
+ Type type;
+};
+
+template <typename T = void>
+struct None {};
+
+// A helper class template to enable or disable overloads taking wide
+// characters and strings in MakeValue.
+template <typename T, typename Char>
+struct WCharHelper {
+ typedef None<T> Supported;
+ typedef T Unsupported;
+};
+
+template <typename T>
+struct WCharHelper<T, wchar_t> {
+ typedef T Supported;
+ typedef None<T> Unsupported;
+};
+
+template <typename T>
+class IsConvertibleToInt {
+ private:
+ typedef char yes[1];
+ typedef char no[2];
+
+ static const T &get();
+
+ static yes &check(fmt::ULongLong);
+ static no &check(...);
+
+ public:
+ enum { value = (sizeof(check(get())) == sizeof(yes)) };
+};
+
+template<bool B, class T = void>
+struct EnableIf {};
+
+template<class T>
+struct EnableIf<true, T> { typedef T type; };
+
+// Makes a Value object from any type.
+template <typename Char>
+class MakeValue : public Value {
+ private:
+ // The following two methods are private to disallow formatting of
+ // arbitrary pointers. If you want to output a pointer cast it to
+ // "void *" or "const void *". In particular, this forbids formatting
+ // of "[const] volatile char *" which is printed as bool by iostreams.
+ // Do not implement!
+ template <typename T>
+ MakeValue(const T *value);
+ template <typename T>
+ MakeValue(T *value);
+
+ // The following methods are private to disallow formatting of wide
+ // characters and strings into narrow strings as in
+ // fmt::format("{}", L"test");
+ // To fix this, use a wide format string: fmt::format(L"{}", L"test").
+ MakeValue(typename WCharHelper<wchar_t, Char>::Unsupported);
+ MakeValue(typename WCharHelper<wchar_t *, Char>::Unsupported);
+ MakeValue(typename WCharHelper<const wchar_t *, Char>::Unsupported);
+ MakeValue(typename WCharHelper<const std::wstring &, Char>::Unsupported);
+ MakeValue(typename WCharHelper<WStringRef, Char>::Unsupported);
+
+ void set_string(StringRef str) {
+ string.value = str.c_str();
+ string.size = str.size();
+ }
+
+ void set_string(WStringRef str) {
+ wstring.value = str.c_str();
+ wstring.size = str.size();
+ }
+
+ // Formats an argument of a custom type, such as a user-defined class.
+ template <typename T>
+ static void format_custom_arg(
+ void *formatter, const void *arg, void *format_str_ptr) {
+ format(*static_cast<BasicFormatter<Char>*>(formatter),
+ *static_cast<const Char**>(format_str_ptr),
+ *static_cast<const T*>(arg));
+ }
+
+ public:
+ MakeValue() {}
+
+#define FMT_MAKE_VALUE(Type, field, TYPE) \
+ MakeValue(Type value) { field = value; } \
+ static uint64_t type(Type) { return Arg::TYPE; }
+
+ FMT_MAKE_VALUE(bool, int_value, INT)
+ FMT_MAKE_VALUE(short, int_value, INT)
+ FMT_MAKE_VALUE(unsigned short, uint_value, UINT)
+ FMT_MAKE_VALUE(int, int_value, INT)
+ FMT_MAKE_VALUE(unsigned, uint_value, UINT)
+
+ MakeValue(long value) {
+ // To minimize the number of types we need to deal with, long is
+ // translated either to int or to long long depending on its size.
+ if (sizeof(long) == sizeof(int))
+ int_value = static_cast<int>(value);
+ else
+ long_long_value = value;
+ }
+ static uint64_t type(long) {
+ return sizeof(long) == sizeof(int) ? Arg::INT : Arg::LONG_LONG;
+ }
+
+ MakeValue(unsigned long value) {
+ if (sizeof(unsigned long) == sizeof(unsigned))
+ uint_value = static_cast<unsigned>(value);
+ else
+ ulong_long_value = value;
+ }
+ static uint64_t type(unsigned long) {
+ return sizeof(unsigned long) == sizeof(unsigned) ?
+ Arg::UINT : Arg::ULONG_LONG;
+ }
+
+ FMT_MAKE_VALUE(LongLong, long_long_value, LONG_LONG)
+ FMT_MAKE_VALUE(ULongLong, ulong_long_value, ULONG_LONG)
+ FMT_MAKE_VALUE(float, double_value, DOUBLE)
+ FMT_MAKE_VALUE(double, double_value, DOUBLE)
+ FMT_MAKE_VALUE(long double, long_double_value, LONG_DOUBLE)
+ FMT_MAKE_VALUE(signed char, int_value, CHAR)
+ FMT_MAKE_VALUE(unsigned char, int_value, CHAR)
+ FMT_MAKE_VALUE(char, int_value, CHAR)
+
+ MakeValue(typename WCharHelper<wchar_t, Char>::Supported value) {
+ int_value = value;
+ }
+ static uint64_t type(wchar_t) { return Arg::CHAR; }
+
+#define FMT_MAKE_STR_VALUE(Type, TYPE) \
+ MakeValue(Type value) { set_string(value); } \
+ static uint64_t type(Type) { return Arg::TYPE; }
+
+ FMT_MAKE_VALUE(char *, string.value, CSTRING)
+ FMT_MAKE_VALUE(const char *, string.value, CSTRING)
+ FMT_MAKE_VALUE(const signed char *, sstring.value, CSTRING)
+ FMT_MAKE_VALUE(const unsigned char *, ustring.value, CSTRING)
+ FMT_MAKE_STR_VALUE(const std::string &, STRING)
+ FMT_MAKE_STR_VALUE(StringRef, STRING)
+
+#define FMT_MAKE_WSTR_VALUE(Type, TYPE) \
+ MakeValue(typename WCharHelper<Type, Char>::Supported value) { \
+ set_string(value); \
+ } \
+ static uint64_t type(Type) { return Arg::TYPE; }
+
+ FMT_MAKE_WSTR_VALUE(wchar_t *, WSTRING)
+ FMT_MAKE_WSTR_VALUE(const wchar_t *, WSTRING)
+ FMT_MAKE_WSTR_VALUE(const std::wstring &, WSTRING)
+ FMT_MAKE_WSTR_VALUE(WStringRef, WSTRING)
+
+ FMT_MAKE_VALUE(void *, pointer, POINTER)
+ FMT_MAKE_VALUE(const void *, pointer, POINTER)
+
+ template <typename T>
+ MakeValue(const T &value,
+ typename EnableIf<!IsConvertibleToInt<T>::value, int>::type = 0) {
+ custom.value = &value;
+ custom.format = &format_custom_arg<T>;
+ }
+
+ template <typename T>
+ MakeValue(const T &value,
+ typename EnableIf<IsConvertibleToInt<T>::value, int>::type = 0) {
+ int_value = value;
+ }
+
+ template <typename T>
+ static uint64_t type(const T &) {
+ return IsConvertibleToInt<T>::value ? Arg::INT : Arg::CUSTOM;
+ }
+};
+
+#define FMT_DISPATCH(call) static_cast<Impl*>(this)->call
+
+// An argument visitor.
+// To use ArgVisitor define a subclass that implements some or all of the
+// visit methods with the same signatures as the methods in ArgVisitor,
+// for example, visit_int(int).
+// Specify the subclass name as the Impl template parameter. Then calling
+// ArgVisitor::visit for some argument will dispatch to a visit method
+// specific to the argument type. For example, if the argument type is
+// double then visit_double(double) method of a subclass will be called.
+// If the subclass doesn't contain a method with this signature, then
+// a corresponding method of ArgVisitor will be called.
+//
+// Example:
+// class MyArgVisitor : public ArgVisitor<MyArgVisitor, void> {
+// public:
+// void visit_int(int value) { print("{}", value); }
+// void visit_double(double value) { print("{}", value ); }
+// };
+//
+// ArgVisitor uses the curiously recurring template pattern:
+// http://en.wikipedia.org/wiki/Curiously_recurring_template_pattern
+template <typename Impl, typename Result>
+class ArgVisitor {
+ public:
+ Result visit_unhandled_arg() { return Result(); }
+
+ Result visit_int(int value) {
+ return FMT_DISPATCH(visit_any_int(value));
+ }
+ Result visit_long_long(LongLong value) {
+ return FMT_DISPATCH(visit_any_int(value));
+ }
+ Result visit_uint(unsigned value) {
+ return FMT_DISPATCH(visit_any_int(value));
+ }
+ Result visit_ulong_long(ULongLong value) {
+ return FMT_DISPATCH(visit_any_int(value));
+ }
+ Result visit_char(int value) {
+ return FMT_DISPATCH(visit_any_int(value));
+ }
+ template <typename T>
+ Result visit_any_int(T) {
+ return FMT_DISPATCH(visit_unhandled_arg());
+ }
+
+ Result visit_double(double value) {
+ return FMT_DISPATCH(visit_any_double(value));
+ }
+ Result visit_long_double(long double value) {
+ return FMT_DISPATCH(visit_any_double(value));
+ }
+ template <typename T>
+ Result visit_any_double(T) {
+ return FMT_DISPATCH(visit_unhandled_arg());
+ }
+
+ Result visit_string(Arg::StringValue<char>) {
+ return FMT_DISPATCH(visit_unhandled_arg());
+ }
+ Result visit_wstring(Arg::StringValue<wchar_t>) {
+ return FMT_DISPATCH(visit_unhandled_arg());
+ }
+ Result visit_pointer(const void *) {
+ return FMT_DISPATCH(visit_unhandled_arg());
+ }
+ Result visit_custom(Arg::CustomValue) {
+ return FMT_DISPATCH(visit_unhandled_arg());
+ }
+
+ Result visit(const Arg &arg) {
+ switch (arg.type) {
+ default:
+ assert(false);
+ return Result();
+ case Arg::INT:
+ return FMT_DISPATCH(visit_int(arg.int_value));
+ case Arg::UINT:
+ return FMT_DISPATCH(visit_uint(arg.uint_value));
+ case Arg::LONG_LONG:
+ return FMT_DISPATCH(visit_long_long(arg.long_long_value));
+ case Arg::ULONG_LONG:
+ return FMT_DISPATCH(visit_ulong_long(arg.ulong_long_value));
+ case Arg::DOUBLE:
+ return FMT_DISPATCH(visit_double(arg.double_value));
+ case Arg::LONG_DOUBLE:
+ return FMT_DISPATCH(visit_long_double(arg.long_double_value));
+ case Arg::CHAR:
+ return FMT_DISPATCH(visit_char(arg.int_value));
+ case Arg::CSTRING: {
+ Value::StringValue<char> str = arg.string;
+ str.size = 0;
+ return FMT_DISPATCH(visit_string(str));
+ }
+ case Arg::STRING:
+ return FMT_DISPATCH(visit_string(arg.string));
+ case Arg::WSTRING:
+ return FMT_DISPATCH(visit_wstring(arg.wstring));
+ case Arg::POINTER:
+ return FMT_DISPATCH(visit_pointer(arg.pointer));
+ case Arg::CUSTOM:
+ return FMT_DISPATCH(visit_custom(arg.custom));
+ }
+ }
+};
+
+class RuntimeError : public std::runtime_error {
+ protected:
+ RuntimeError() : std::runtime_error("") {}
+};
+
+template <typename Char>
+class ArgFormatter;
+} // namespace internal
+
+/**
+ An argument list.
+ */
+class ArgList {
+ private:
+ uint64_t types_;
+ const internal::Value *values_;
+
+ public:
+ // Maximum number of arguments that can be passed in ArgList.
+ enum { MAX_ARGS = 16 };
+
+ ArgList() : types_(0) {}
+ ArgList(ULongLong types, const internal::Value *values)
+ : types_(types), values_(values) {}
+
+ /**
+ Returns the argument at specified index.
+ */
+ internal::Arg operator[](unsigned index) const {
+ using internal::Arg;
+ Arg arg;
+ if (index >= MAX_ARGS) {
+ arg.type = Arg::NONE;
+ return arg;
+ }
+ unsigned shift = index * 4;
+ uint64_t mask = 0xf;
+ Arg::Type type =
+ static_cast<Arg::Type>((types_ & (mask << shift)) >> shift);
+ arg.type = type;
+ if (type != Arg::NONE) {
+ internal::Value &value = arg;
+ value = values_[index];
+ }
+ return arg;
+ }
+};
+
+struct FormatSpec;
+
+namespace internal {
+
+class FormatterBase {
+ private:
+ ArgList args_;
+ int next_arg_index_;
+
+ // Returns the argument with specified index.
+ Arg do_get_arg(unsigned arg_index, const char *&error);
+
+ protected:
+ void set_args(const ArgList &args) {
+ args_ = args;
+ next_arg_index_ = 0;
+ }
+
+ // Returns the next argument.
+ Arg next_arg(const char *&error);
+
+ // Checks if manual indexing is used and returns the argument with
+ // specified index.
+ Arg get_arg(unsigned arg_index, const char *&error);
+
+ template <typename Char>
+ void write(BasicWriter<Char> &w, const Char *start, const Char *end) {
+ if (start != end)
+ w << BasicStringRef<Char>(start, end - start);
+ }
+};
+
+// A printf formatter.
+template <typename Char>
+class PrintfFormatter : private FormatterBase {
+ private:
+ void parse_flags(FormatSpec &spec, const Char *&s);
+
+ // Returns the argument with specified index or, if arg_index is equal
+ // to the maximum unsigned value, the next argument.
+ Arg get_arg(const Char *s,
+ unsigned arg_index = (std::numeric_limits<unsigned>::max)());
+
+ // Parses argument index, flags and width and returns the argument index.
+ unsigned parse_header(const Char *&s, FormatSpec &spec);
+
+ public:
+ void format(BasicWriter<Char> &writer,
+ BasicStringRef<Char> format_str, const ArgList &args);
+};
+} // namespace internal
+
+// A formatter.
+template <typename Char>
+class BasicFormatter : private internal::FormatterBase {
+ private:
+ BasicWriter<Char> &writer_;
+ const Char *start_;
+
+ FMT_DISALLOW_COPY_AND_ASSIGN(BasicFormatter);
+
+ // Parses argument index and returns corresponding argument.
+ internal::Arg parse_arg_index(const Char *&s);
+
+ public:
+ explicit BasicFormatter(BasicWriter<Char> &w) : writer_(w) {}
+
+ BasicWriter<Char> &writer() { return writer_; }
+
+ void format(BasicStringRef<Char> format_str, const ArgList &args);
+
+ const Char *format(const Char *&format_str, const internal::Arg &arg);
+};
+
+enum Alignment {
+ ALIGN_DEFAULT, ALIGN_LEFT, ALIGN_RIGHT, ALIGN_CENTER, ALIGN_NUMERIC
+};
+
+// Flags.
+enum {
+ SIGN_FLAG = 1, PLUS_FLAG = 2, MINUS_FLAG = 4, HASH_FLAG = 8,
+ CHAR_FLAG = 0x10 // Argument has char type - used in error reporting.
+};
+
+// An empty format specifier.
+struct EmptySpec {};
+
+// A type specifier.
+template <char TYPE>
+struct TypeSpec : EmptySpec {
+ Alignment align() const { return ALIGN_DEFAULT; }
+ unsigned width() const { return 0; }
+ int precision() const { return -1; }
+ bool flag(unsigned) const { return false; }
+ char type() const { return TYPE; }
+ char fill() const { return ' '; }
+};
+
+// A width specifier.
+struct WidthSpec {
+ unsigned width_;
+ // Fill is always wchar_t and cast to char if necessary to avoid having
+ // two specialization of WidthSpec and its subclasses.
+ wchar_t fill_;
+
+ WidthSpec(unsigned width, wchar_t fill) : width_(width), fill_(fill) {}
+
+ unsigned width() const { return width_; }
+ wchar_t fill() const { return fill_; }
+};
+
+// An alignment specifier.
+struct AlignSpec : WidthSpec {
+ Alignment align_;
+
+ AlignSpec(unsigned width, wchar_t fill, Alignment align = ALIGN_DEFAULT)
+ : WidthSpec(width, fill), align_(align) {}
+
+ Alignment align() const { return align_; }
+
+ int precision() const { return -1; }
+};
+
+// An alignment and type specifier.
+template <char TYPE>
+struct AlignTypeSpec : AlignSpec {
+ AlignTypeSpec(unsigned width, wchar_t fill) : AlignSpec(width, fill) {}
+
+ bool flag(unsigned) const { return false; }
+ char type() const { return TYPE; }
+};
+
+// A full format specifier.
+struct FormatSpec : AlignSpec {
+ unsigned flags_;
+ int precision_;
+ char type_;
+
+ FormatSpec(
+ unsigned width = 0, char type = 0, wchar_t fill = ' ')
+ : AlignSpec(width, fill), flags_(0), precision_(-1), type_(type) {}
+
+ bool flag(unsigned f) const { return (flags_ & f) != 0; }
+ int precision() const { return precision_; }
+ char type() const { return type_; }
+};
+
+// An integer format specifier.
+template <typename T, typename SpecT = TypeSpec<0>, typename Char = char>
+class IntFormatSpec : public SpecT {
+ private:
+ T value_;
+
+ public:
+ IntFormatSpec(T val, const SpecT &spec = SpecT())
+ : SpecT(spec), value_(val) {}
+
+ T value() const { return value_; }
+};
+
+// A string format specifier.
+template <typename T>
+class StrFormatSpec : public AlignSpec {
+ private:
+ const T *str_;
+
+ public:
+ StrFormatSpec(const T *str, unsigned width, wchar_t fill)
+ : AlignSpec(width, fill), str_(str) {}
+
+ const T *str() const { return str_; }
+};
+
+/**
+ Returns an integer format specifier to format the value in base 2.
+ */
+IntFormatSpec<int, TypeSpec<'b'> > bin(int value);
+
+/**
+ Returns an integer format specifier to format the value in base 8.
+ */
+IntFormatSpec<int, TypeSpec<'o'> > oct(int value);
+
+/**
+ Returns an integer format specifier to format the value in base 16 using
+ lower-case letters for the digits above 9.
+ */
+IntFormatSpec<int, TypeSpec<'x'> > hex(int value);
+
+/**
+ Returns an integer formatter format specifier to format in base 16 using
+ upper-case letters for the digits above 9.
+ */
+IntFormatSpec<int, TypeSpec<'X'> > hexu(int value);
+
+/**
+ \rst
+ Returns an integer format specifier to pad the formatted argument with the
+ fill character to the specified width using the default (right) numeric
+ alignment.
+
+ **Example**::
+
+ MemoryWriter out;
+ out << pad(hex(0xcafe), 8, '0');
+ // out.str() == "0000cafe"
+
+ \endrst
+ */
+template <char TYPE_CODE, typename Char>
+IntFormatSpec<int, AlignTypeSpec<TYPE_CODE>, Char> pad(
+ int value, unsigned width, Char fill = ' ');
+
+#define FMT_DEFINE_INT_FORMATTERS(TYPE) \
+inline IntFormatSpec<TYPE, TypeSpec<'b'> > bin(TYPE value) { \
+ return IntFormatSpec<TYPE, TypeSpec<'b'> >(value, TypeSpec<'b'>()); \
+} \
+ \
+inline IntFormatSpec<TYPE, TypeSpec<'o'> > oct(TYPE value) { \
+ return IntFormatSpec<TYPE, TypeSpec<'o'> >(value, TypeSpec<'o'>()); \
+} \
+ \
+inline IntFormatSpec<TYPE, TypeSpec<'x'> > hex(TYPE value) { \
+ return IntFormatSpec<TYPE, TypeSpec<'x'> >(value, TypeSpec<'x'>()); \
+} \
+ \
+inline IntFormatSpec<TYPE, TypeSpec<'X'> > hexu(TYPE value) { \
+ return IntFormatSpec<TYPE, TypeSpec<'X'> >(value, TypeSpec<'X'>()); \
+} \
+ \
+template <char TYPE_CODE> \
+inline IntFormatSpec<TYPE, AlignTypeSpec<TYPE_CODE> > pad( \
+ IntFormatSpec<TYPE, TypeSpec<TYPE_CODE> > f, unsigned width) { \
+ return IntFormatSpec<TYPE, AlignTypeSpec<TYPE_CODE> >( \
+ f.value(), AlignTypeSpec<TYPE_CODE>(width, ' ')); \
+} \
+ \
+/* For compatibility with older compilers we provide two overloads for pad, */ \
+/* one that takes a fill character and one that doesn't. In the future this */ \
+/* can be replaced with one overload making the template argument Char */ \
+/* default to char (C++11). */ \
+template <char TYPE_CODE, typename Char> \
+inline IntFormatSpec<TYPE, AlignTypeSpec<TYPE_CODE>, Char> pad( \
+ IntFormatSpec<TYPE, TypeSpec<TYPE_CODE>, Char> f, \
+ unsigned width, Char fill) { \
+ return IntFormatSpec<TYPE, AlignTypeSpec<TYPE_CODE>, Char>( \
+ f.value(), AlignTypeSpec<TYPE_CODE>(width, fill)); \
+} \
+ \
+inline IntFormatSpec<TYPE, AlignTypeSpec<0> > pad( \
+ TYPE value, unsigned width) { \
+ return IntFormatSpec<TYPE, AlignTypeSpec<0> >( \
+ value, AlignTypeSpec<0>(width, ' ')); \
+} \
+ \
+template <typename Char> \
+inline IntFormatSpec<TYPE, AlignTypeSpec<0>, Char> pad( \
+ TYPE value, unsigned width, Char fill) { \
+ return IntFormatSpec<TYPE, AlignTypeSpec<0>, Char>( \
+ value, AlignTypeSpec<0>(width, fill)); \
+}
+
+FMT_DEFINE_INT_FORMATTERS(int)
+FMT_DEFINE_INT_FORMATTERS(long)
+FMT_DEFINE_INT_FORMATTERS(unsigned)
+FMT_DEFINE_INT_FORMATTERS(unsigned long)
+FMT_DEFINE_INT_FORMATTERS(LongLong)
+FMT_DEFINE_INT_FORMATTERS(ULongLong)
+
+/**
+ \rst
+ Returns a string formatter that pads the formatted argument with the fill
+ character to the specified width using the default (left) string alignment.
+
+ **Example**::
+
+ std::string s = str(MemoryWriter() << pad("abc", 8));
+ // s == "abc "
+
+ \endrst
+ */
+template <typename Char>
+inline StrFormatSpec<Char> pad(
+ const Char *str, unsigned width, Char fill = ' ') {
+ return StrFormatSpec<Char>(str, width, fill);
+}
+
+inline StrFormatSpec<wchar_t> pad(
+ const wchar_t *str, unsigned width, char fill = ' ') {
+ return StrFormatSpec<wchar_t>(str, width, fill);
+}
+
+// Generates a comma-separated list with results of applying f to
+// numbers 0..n-1.
+# define FMT_GEN(n, f) FMT_GEN##n(f)
+# define FMT_GEN1(f) f(0)
+# define FMT_GEN2(f) FMT_GEN1(f), f(1)
+# define FMT_GEN3(f) FMT_GEN2(f), f(2)
+# define FMT_GEN4(f) FMT_GEN3(f), f(3)
+# define FMT_GEN5(f) FMT_GEN4(f), f(4)
+# define FMT_GEN6(f) FMT_GEN5(f), f(5)
+# define FMT_GEN7(f) FMT_GEN6(f), f(6)
+# define FMT_GEN8(f) FMT_GEN7(f), f(7)
+# define FMT_GEN9(f) FMT_GEN8(f), f(8)
+# define FMT_GEN10(f) FMT_GEN9(f), f(9)
+# define FMT_GEN11(f) FMT_GEN10(f), f(10)
+# define FMT_GEN12(f) FMT_GEN11(f), f(11)
+# define FMT_GEN13(f) FMT_GEN12(f), f(12)
+# define FMT_GEN14(f) FMT_GEN13(f), f(13)
+# define FMT_GEN15(f) FMT_GEN14(f), f(14)
+
+namespace internal {
+inline uint64_t make_type() { return 0; }
+
+template <typename T>
+inline uint64_t make_type(const T &arg) { return MakeValue<char>::type(arg); }
+
+#if FMT_USE_VARIADIC_TEMPLATES
+template <typename Arg, typename... Args>
+inline uint64_t make_type(const Arg &first, const Args & ... tail) {
+ return make_type(first) | (make_type(tail...) << 4);
+}
+#else
+
+struct ArgType {
+ uint64_t type;
+
+ ArgType() : type(0) {}
+
+ template <typename T>
+ ArgType(const T &arg) : type(make_type(arg)) {}
+};
+
+# define FMT_ARG_TYPE_DEFAULT(n) ArgType t##n = ArgType()
+
+inline uint64_t make_type(FMT_GEN15(FMT_ARG_TYPE_DEFAULT)) {
+ return t0.type | (t1.type << 4) | (t2.type << 8) | (t3.type << 12) |
+ (t4.type << 16) | (t5.type << 20) | (t6.type << 24) | (t7.type << 28) |
+ (t8.type << 32) | (t9.type << 36) | (t10.type << 40) | (t11.type << 44) |
+ (t12.type << 48) | (t13.type << 52) | (t14.type << 56);
+}
+#endif
+} // namespace internal
+
+# define FMT_MAKE_TEMPLATE_ARG(n) typename T##n
+# define FMT_MAKE_ARG_TYPE(n) T##n
+# define FMT_MAKE_ARG(n) const T##n &v##n
+# define FMT_MAKE_REF_char(n) fmt::internal::MakeValue<char>(v##n)
+# define FMT_MAKE_REF_wchar_t(n) fmt::internal::MakeValue<wchar_t>(v##n)
+
+#if FMT_USE_VARIADIC_TEMPLATES
+// Defines a variadic function returning void.
+# define FMT_VARIADIC_VOID(func, arg_type) \
+ template <typename... Args> \
+ void func(arg_type arg1, const Args & ... args) { \
+ const fmt::internal::Value values[ \
+ fmt::internal::NonZero<sizeof...(Args)>::VALUE] = { \
+ fmt::internal::MakeValue<Char>(args)... \
+ }; \
+ func(arg1, ArgList(fmt::internal::make_type(args...), values)); \
+ }
+
+// Defines a variadic constructor.
+# define FMT_VARIADIC_CTOR(ctor, func, arg0_type, arg1_type) \
+ template <typename... Args> \
+ ctor(arg0_type arg0, arg1_type arg1, const Args & ... args) { \
+ using fmt::internal::MakeValue; \
+ const fmt::internal::Value values[ \
+ fmt::internal::NonZero<sizeof...(Args)>::VALUE] = { \
+ MakeValue<Char>(args)... \
+ }; \
+ func(arg0, arg1, ArgList(fmt::internal::make_type(args...), values)); \
+ }
+
+#else
+
+# define FMT_MAKE_REF(n) fmt::internal::MakeValue<Char>(v##n)
+# define FMT_MAKE_REF2(n) v##n
+
+// Defines a wrapper for a function taking one argument of type arg_type
+// and n additional arguments of arbitrary types.
+# define FMT_WRAP1(func, arg_type, n) \
+ template <FMT_GEN(n, FMT_MAKE_TEMPLATE_ARG)> \
+ inline void func(arg_type arg1, FMT_GEN(n, FMT_MAKE_ARG)) { \
+ const fmt::internal::Value vals[] = {FMT_GEN(n, FMT_MAKE_REF)}; \
+ func(arg1, fmt::ArgList( \
+ fmt::internal::make_type(FMT_GEN(n, FMT_MAKE_REF2)), vals)); \
+ }
+
+// Emulates a variadic function returning void on a pre-C++11 compiler.
+# define FMT_VARIADIC_VOID(func, arg_type) \
+ inline void func(arg_type arg) { func(arg, fmt::ArgList()); } \
+ FMT_WRAP1(func, arg_type, 1) FMT_WRAP1(func, arg_type, 2) \
+ FMT_WRAP1(func, arg_type, 3) FMT_WRAP1(func, arg_type, 4) \
+ FMT_WRAP1(func, arg_type, 5) FMT_WRAP1(func, arg_type, 6) \
+ FMT_WRAP1(func, arg_type, 7) FMT_WRAP1(func, arg_type, 8) \
+ FMT_WRAP1(func, arg_type, 9) FMT_WRAP1(func, arg_type, 10)
+
+# define FMT_CTOR(ctor, func, arg0_type, arg1_type, n) \
+ template <FMT_GEN(n, FMT_MAKE_TEMPLATE_ARG)> \
+ ctor(arg0_type arg0, arg1_type arg1, FMT_GEN(n, FMT_MAKE_ARG)) { \
+ const fmt::internal::Value vals[] = {FMT_GEN(n, FMT_MAKE_REF)}; \
+ func(arg0, arg1, fmt::ArgList( \
+ fmt::internal::make_type(FMT_GEN(n, FMT_MAKE_REF2)), vals)); \
+ }
+
+// Emulates a variadic constructor on a pre-C++11 compiler.
+# define FMT_VARIADIC_CTOR(ctor, func, arg0_type, arg1_type) \
+ FMT_CTOR(ctor, func, arg0_type, arg1_type, 1) \
+ FMT_CTOR(ctor, func, arg0_type, arg1_type, 2) \
+ FMT_CTOR(ctor, func, arg0_type, arg1_type, 3) \
+ FMT_CTOR(ctor, func, arg0_type, arg1_type, 4) \
+ FMT_CTOR(ctor, func, arg0_type, arg1_type, 5) \
+ FMT_CTOR(ctor, func, arg0_type, arg1_type, 6) \
+ FMT_CTOR(ctor, func, arg0_type, arg1_type, 7) \
+ FMT_CTOR(ctor, func, arg0_type, arg1_type, 8) \
+ FMT_CTOR(ctor, func, arg0_type, arg1_type, 9) \
+ FMT_CTOR(ctor, func, arg0_type, arg1_type, 10)
+#endif
+
+// Generates a comma-separated list with results of applying f to pairs
+// (argument, index).
+#define FMT_FOR_EACH1(f, x0) f(x0, 0)
+#define FMT_FOR_EACH2(f, x0, x1) \
+ FMT_FOR_EACH1(f, x0), f(x1, 1)
+#define FMT_FOR_EACH3(f, x0, x1, x2) \
+ FMT_FOR_EACH2(f, x0 ,x1), f(x2, 2)
+#define FMT_FOR_EACH4(f, x0, x1, x2, x3) \
+ FMT_FOR_EACH3(f, x0, x1, x2), f(x3, 3)
+#define FMT_FOR_EACH5(f, x0, x1, x2, x3, x4) \
+ FMT_FOR_EACH4(f, x0, x1, x2, x3), f(x4, 4)
+#define FMT_FOR_EACH6(f, x0, x1, x2, x3, x4, x5) \
+ FMT_FOR_EACH5(f, x0, x1, x2, x3, x4), f(x5, 5)
+#define FMT_FOR_EACH7(f, x0, x1, x2, x3, x4, x5, x6) \
+ FMT_FOR_EACH6(f, x0, x1, x2, x3, x4, x5), f(x6, 6)
+#define FMT_FOR_EACH8(f, x0, x1, x2, x3, x4, x5, x6, x7) \
+ FMT_FOR_EACH7(f, x0, x1, x2, x3, x4, x5, x6), f(x7, 7)
+#define FMT_FOR_EACH9(f, x0, x1, x2, x3, x4, x5, x6, x7, x8) \
+ FMT_FOR_EACH8(f, x0, x1, x2, x3, x4, x5, x6, x7), f(x8, 8)
+#define FMT_FOR_EACH10(f, x0, x1, x2, x3, x4, x5, x6, x7, x8, x9) \
+ FMT_FOR_EACH9(f, x0, x1, x2, x3, x4, x5, x6, x7, x8), f(x9, 9)
+
+/**
+ An error returned by an operating system or a language runtime,
+ for example a file opening error.
+*/
+class SystemError : public internal::RuntimeError {
+ private:
+ void init(int err_code, StringRef format_str, ArgList args);
+
+ protected:
+ int error_code_;
+
+ typedef char Char; // For FMT_VARIADIC_CTOR.
+
+ SystemError() {}
+
+ public:
+ /**
+ \rst
+ Constructs a :class:`fmt::SystemError` object with the description
+ of the form
+
+ .. parsed-literal::
+ *<message>*: *<system-message>*
+
+ where *<message>* is the formatted message and *<system-message>* is
+ the system message corresponding to the error code.
+ *error_code* is a system error code as given by ``errno``.
+ If *error_code* is not a valid error code such as -1, the system message
+ may look like "Unknown error -1" and is platform-dependent.
+
+ **Example**::
+
+ // This throws a SystemError with the description
+ // cannot open file 'madeup': No such file or directory
+ // or similar (system message may vary).
+ const char *filename = "madeup";
+ std::FILE *file = std::fopen(filename, "r");
+ if (!file)
+ throw fmt::SystemError(errno, "cannot open file '{}'", filename);
+ \endrst
+ */
+ SystemError(int error_code, StringRef message) {
+ init(error_code, message, ArgList());
+ }
+ FMT_VARIADIC_CTOR(SystemError, init, int, StringRef)
+
+ int error_code() const { return error_code_; }
+};
+
+/**
+ \rst
+ This template provides operations for formatting and writing data into
+ a character stream. The output is stored in a buffer provided by a subclass
+ such as :class:`fmt::BasicMemoryWriter`.
+
+ You can use one of the following typedefs for common character types:
+
+ +---------+----------------------+
+ | Type | Definition |
+ +=========+======================+
+ | Writer | BasicWriter<char> |
+ +---------+----------------------+
+ | WWriter | BasicWriter<wchar_t> |
+ +---------+----------------------+
+
+ \endrst
+ */
+template <typename Char>
+class BasicWriter {
+ private:
+ // Output buffer.
+ internal::Buffer<Char> &buffer_;
+
+ FMT_DISALLOW_COPY_AND_ASSIGN(BasicWriter);
+
+ typedef typename internal::CharTraits<Char>::CharPtr CharPtr;
+
+#if _SECURE_SCL
+ // Returns pointer value.
+ static Char *get(CharPtr p) { return p.base(); }
+#else
+ static Char *get(Char *p) { return p; }
+#endif
+
+ // Fills the padding around the content and returns the pointer to the
+ // content area.
+ static CharPtr fill_padding(CharPtr buffer,
+ unsigned total_size, std::size_t content_size, wchar_t fill);
+
+ // Grows the buffer by n characters and returns a pointer to the newly
+ // allocated area.
+ CharPtr grow_buffer(std::size_t n) {
+ std::size_t size = buffer_.size();
+ buffer_.resize(size + n);
+ return internal::make_ptr(&buffer_[size], n);
+ }
+
+ // Prepare a buffer for integer formatting.
+ CharPtr prepare_int_buffer(unsigned num_digits,
+ const EmptySpec &, const char *prefix, unsigned prefix_size) {
+ unsigned size = prefix_size + num_digits;
+ CharPtr p = grow_buffer(size);
+ std::copy(prefix, prefix + prefix_size, p);
+ return p + size - 1;
+ }
+
+ template <typename Spec>
+ CharPtr prepare_int_buffer(unsigned num_digits,
+ const Spec &spec, const char *prefix, unsigned prefix_size);
+
+ // Formats an integer.
+ template <typename T, typename Spec>
+ void write_int(T value, Spec spec);
+
+ // Formats a floating-point number (double or long double).
+ template <typename T>
+ void write_double(T value, const FormatSpec &spec);
+
+ // Writes a formatted string.
+ template <typename StrChar>
+ CharPtr write_str(
+ const StrChar *s, std::size_t size, const AlignSpec &spec);
+
+ template <typename StrChar>
+ void write_str(
+ const internal::Arg::StringValue<StrChar> &str, const FormatSpec &spec);
+
+ // This following methods are private to disallow writing wide characters
+ // and strings to a char stream. If you want to print a wide string as a
+ // pointer as std::ostream does, cast it to const void*.
+ // Do not implement!
+ void operator<<(typename internal::WCharHelper<wchar_t, Char>::Unsupported);
+ void operator<<(
+ typename internal::WCharHelper<const wchar_t *, Char>::Unsupported);
+
+ // Appends floating-point length specifier to the format string.
+ // The second argument is only used for overload resolution.
+ void append_float_length(Char *&format_ptr, long double) {
+ *format_ptr++ = 'L';
+ }
+
+ template<typename T>
+ void append_float_length(Char *&, T) {}
+
+ friend class internal::ArgFormatter<Char>;
+ friend class internal::PrintfFormatter<Char>;
+
+ protected:
+ /**
+ Constructs a ``BasicWriter`` object.
+ */
+ explicit BasicWriter(internal::Buffer<Char> &b) : buffer_(b) {}
+
+ public:
+ /**
+ Destroys a ``BasicWriter`` object.
+ */
+ virtual ~BasicWriter() {}
+
+ /**
+ Returns the total number of characters written.
+ */
+ std::size_t size() const { return buffer_.size(); }
+
+ /**
+ Returns a pointer to the output buffer content. No terminating null
+ character is appended.
+ */
+ const Char *data() const FMT_NOEXCEPT { return &buffer_[0]; }
+
+ /**
+ Returns a pointer to the output buffer content with terminating null
+ character appended.
+ */
+ const Char *c_str() const {
+ std::size_t size = buffer_.size();
+ buffer_.reserve(size + 1);
+ buffer_[size] = '\0';
+ return &buffer_[0];
+ }
+
+ /**
+ Returns the content of the output buffer as an `std::string`.
+ */
+ std::basic_string<Char> str() const {
+ return std::basic_string<Char>(&buffer_[0], buffer_.size());
+ }
+
+ /**
+ \rst
+ Writes formatted data.
+
+ *args* is an argument list representing arbitrary arguments.
+
+ **Example**::
+
+ MemoryWriter out;
+ out.write("Current point:\n");
+ out.write("({:+f}, {:+f})", -3.14, 3.14);
+
+ This will write the following output to the ``out`` object:
+
+ .. code-block:: none
+
+ Current point:
+ (-3.140000, +3.140000)
+
+ The output can be accessed using :func:`data()`, :func:`c_str` or
+ :func:`str` methods.
+
+ See also :ref:`syntax`.
+ \endrst
+ */
+ void write(BasicStringRef<Char> format, ArgList args) {
+ BasicFormatter<Char>(*this).format(format, args);
+ }
+ FMT_VARIADIC_VOID(write, BasicStringRef<Char>)
+
+ BasicWriter &operator<<(int value) {
+ return *this << IntFormatSpec<int>(value);
+ }
+ BasicWriter &operator<<(unsigned value) {
+ return *this << IntFormatSpec<unsigned>(value);
+ }
+ BasicWriter &operator<<(long value) {
+ return *this << IntFormatSpec<long>(value);
+ }
+ BasicWriter &operator<<(unsigned long value) {
+ return *this << IntFormatSpec<unsigned long>(value);
+ }
+ BasicWriter &operator<<(LongLong value) {
+ return *this << IntFormatSpec<LongLong>(value);
+ }
+
+ /**
+ Formats *value* and writes it to the stream.
+ */
+ BasicWriter &operator<<(ULongLong value) {
+ return *this << IntFormatSpec<ULongLong>(value);
+ }
+
+ BasicWriter &operator<<(double value) {
+ write_double(value, FormatSpec());
+ return *this;
+ }
+
+ /**
+ Formats *value* using the general format for floating-point numbers
+ (``'g'``) and writes it to the stream.
+ */
+ BasicWriter &operator<<(long double value) {
+ write_double(value, FormatSpec());
+ return *this;
+ }
+
+ /**
+ Writes a character to the stream.
+ */
+ BasicWriter &operator<<(char value) {
+ buffer_.push_back(value);
+ return *this;
+ }
+
+ BasicWriter &operator<<(
+ typename internal::WCharHelper<wchar_t, Char>::Supported value) {
+ buffer_.push_back(value);
+ return *this;
+ }
+
+ /**
+ Writes *value* to the stream.
+ */
+ BasicWriter &operator<<(fmt::BasicStringRef<Char> value) {
+ const Char *str = value.c_str();
+ buffer_.append(str, str + value.size());
+ return *this;
+ }
+
+ template <typename T, typename Spec, typename FillChar>
+ BasicWriter &operator<<(IntFormatSpec<T, Spec, FillChar> spec) {
+ internal::CharTraits<Char>::convert(FillChar());
+ write_int(spec.value(), spec);
+ return *this;
+ }
+
+ template <typename StrChar>
+ BasicWriter &operator<<(const StrFormatSpec<StrChar> &spec) {
+ const StrChar *s = spec.str();
+ // TODO: error if fill is not convertible to Char
+ write_str(s, std::char_traits<Char>::length(s), spec);
+ return *this;
+ }
+
+ void clear() FMT_NOEXCEPT { buffer_.clear(); }
+};
+
+template <typename Char>
+template <typename StrChar>
+typename BasicWriter<Char>::CharPtr BasicWriter<Char>::write_str(
+ const StrChar *s, std::size_t size, const AlignSpec &spec) {
+ CharPtr out = CharPtr();
+ if (spec.width() > size) {
+ out = grow_buffer(spec.width());
+ Char fill = static_cast<Char>(spec.fill());
+ if (spec.align() == ALIGN_RIGHT) {
+ std::fill_n(out, spec.width() - size, fill);
+ out += spec.width() - size;
+ } else if (spec.align() == ALIGN_CENTER) {
+ out = fill_padding(out, spec.width(), size, fill);
+ } else {
+ std::fill_n(out + size, spec.width() - size, fill);
+ }
+ } else {
+ out = grow_buffer(size);
+ }
+ std::copy(s, s + size, out);
+ return out;
+}
+
+template <typename Char>
+typename BasicWriter<Char>::CharPtr
+ BasicWriter<Char>::fill_padding(
+ CharPtr buffer, unsigned total_size,
+ std::size_t content_size, wchar_t fill) {
+ std::size_t padding = total_size - content_size;
+ std::size_t left_padding = padding / 2;
+ Char fill_char = static_cast<Char>(fill);
+ std::fill_n(buffer, left_padding, fill_char);
+ buffer += left_padding;
+ CharPtr content = buffer;
+ std::fill_n(buffer + content_size, padding - left_padding, fill_char);
+ return content;
+}
+
+template <typename Char>
+template <typename Spec>
+typename BasicWriter<Char>::CharPtr
+ BasicWriter<Char>::prepare_int_buffer(
+ unsigned num_digits, const Spec &spec,
+ const char *prefix, unsigned prefix_size) {
+ unsigned width = spec.width();
+ Alignment align = spec.align();
+ Char fill = static_cast<Char>(spec.fill());
+ if (spec.precision() > static_cast<int>(num_digits)) {
+ // Octal prefix '0' is counted as a digit, so ignore it if precision
+ // is specified.
+ if (prefix_size > 0 && prefix[prefix_size - 1] == '0')
+ --prefix_size;
+ unsigned number_size = prefix_size + spec.precision();
+ AlignSpec subspec(number_size, '0', ALIGN_NUMERIC);
+ if (number_size >= width)
+ return prepare_int_buffer(num_digits, subspec, prefix, prefix_size);
+ buffer_.reserve(width);
+ unsigned fill_size = width - number_size;
+ if (align != ALIGN_LEFT) {
+ CharPtr p = grow_buffer(fill_size);
+ std::fill(p, p + fill_size, fill);
+ }
+ CharPtr result = prepare_int_buffer(
+ num_digits, subspec, prefix, prefix_size);
+ if (align == ALIGN_LEFT) {
+ CharPtr p = grow_buffer(fill_size);
+ std::fill(p, p + fill_size, fill);
+ }
+ return result;
+ }
+ unsigned size = prefix_size + num_digits;
+ if (width <= size) {
+ CharPtr p = grow_buffer(size);
+ std::copy(prefix, prefix + prefix_size, p);
+ return p + size - 1;
+ }
+ CharPtr p = grow_buffer(width);
+ CharPtr end = p + width;
+ if (align == ALIGN_LEFT) {
+ std::copy(prefix, prefix + prefix_size, p);
+ p += size;
+ std::fill(p, end, fill);
+ } else if (align == ALIGN_CENTER) {
+ p = fill_padding(p, width, size, fill);
+ std::copy(prefix, prefix + prefix_size, p);
+ p += size;
+ } else {
+ if (align == ALIGN_NUMERIC) {
+ if (prefix_size != 0) {
+ p = std::copy(prefix, prefix + prefix_size, p);
+ size -= prefix_size;
+ }
+ } else {
+ std::copy(prefix, prefix + prefix_size, end - size);
+ }
+ std::fill(p, end - size, fill);
+ p = end;
+ }
+ return p - 1;
+}
+
+template <typename Char>
+template <typename T, typename Spec>
+void BasicWriter<Char>::write_int(T value, Spec spec) {
+ unsigned prefix_size = 0;
+ typedef typename internal::IntTraits<T>::MainType UnsignedType;
+ UnsignedType abs_value = value;
+ char prefix[4] = "";
+ if (internal::is_negative(value)) {
+ prefix[0] = '-';
+ ++prefix_size;
+ abs_value = 0 - abs_value;
+ } else if (spec.flag(SIGN_FLAG)) {
+ prefix[0] = spec.flag(PLUS_FLAG) ? '+' : ' ';
+ ++prefix_size;
+ }
+ switch (spec.type()) {
+ case 0: case 'd': {
+ unsigned num_digits = internal::count_digits(abs_value);
+ CharPtr p = prepare_int_buffer(
+ num_digits, spec, prefix, prefix_size) + 1 - num_digits;
+ internal::format_decimal(get(p), abs_value, num_digits);
+ break;
+ }
+ case 'x': case 'X': {
+ UnsignedType n = abs_value;
+ if (spec.flag(HASH_FLAG)) {
+ prefix[prefix_size++] = '0';
+ prefix[prefix_size++] = spec.type();
+ }
+ unsigned num_digits = 0;
+ do {
+ ++num_digits;
+ } while ((n >>= 4) != 0);
+ Char *p = get(prepare_int_buffer(
+ num_digits, spec, prefix, prefix_size));
+ n = abs_value;
+ const char *digits = spec.type() == 'x' ?
+ "0123456789abcdef" : "0123456789ABCDEF";
+ do {
+ *p-- = digits[n & 0xf];
+ } while ((n >>= 4) != 0);
+ break;
+ }
+ case 'b': case 'B': {
+ UnsignedType n = abs_value;
+ if (spec.flag(HASH_FLAG)) {
+ prefix[prefix_size++] = '0';
+ prefix[prefix_size++] = spec.type();
+ }
+ unsigned num_digits = 0;
+ do {
+ ++num_digits;
+ } while ((n >>= 1) != 0);
+ Char *p = get(prepare_int_buffer(num_digits, spec, prefix, prefix_size));
+ n = abs_value;
+ do {
+ *p-- = '0' + (n & 1);
+ } while ((n >>= 1) != 0);
+ break;
+ }
+ case 'o': {
+ UnsignedType n = abs_value;
+ if (spec.flag(HASH_FLAG))
+ prefix[prefix_size++] = '0';
+ unsigned num_digits = 0;
+ do {
+ ++num_digits;
+ } while ((n >>= 3) != 0);
+ Char *p = get(prepare_int_buffer(num_digits, spec, prefix, prefix_size));
+ n = abs_value;
+ do {
+ *p-- = '0' + (n & 7);
+ } while ((n >>= 3) != 0);
+ break;
+ }
+ default:
+ internal::report_unknown_type(
+ spec.type(), spec.flag(CHAR_FLAG) ? "char" : "integer");
+ break;
+ }
+}
+
+template <typename Char>
+template <typename T>
+void BasicWriter<Char>::write_double(
+ T value, const FormatSpec &spec) {
+ // Check type.
+ char type = spec.type();
+ bool upper = false;
+ switch (type) {
+ case 0:
+ type = 'g';
+ break;
+ case 'e': case 'f': case 'g': case 'a':
+ break;
+ case 'F':
+#ifdef _MSC_VER
+ // MSVC's printf doesn't support 'F'.
+ type = 'f';
+#endif
+ // Fall through.
+ case 'E': case 'G': case 'A':
+ upper = true;
+ break;
+ default:
+ internal::report_unknown_type(type, "double");
+ break;
+ }
+
+ char sign = 0;
+ // Use getsign instead of value < 0 because the latter is always
+ // false for NaN.
+ if (internal::getsign(static_cast<double>(value))) {
+ sign = '-';
+ value = -value;
+ } else if (spec.flag(SIGN_FLAG)) {
+ sign = spec.flag(PLUS_FLAG) ? '+' : ' ';
+ }
+
+ if (value != value) {
+ // Format NaN ourselves because sprintf's output is not consistent
+ // across platforms.
+ std::size_t nan_size = 4;
+ const char *nan = upper ? " NAN" : " nan";
+ if (!sign) {
+ --nan_size;
+ ++nan;
+ }
+ CharPtr out = write_str(nan, nan_size, spec);
+ if (sign)
+ *out = sign;
+ return;
+ }
+
+ if (internal::isinfinity(value)) {
+ // Format infinity ourselves because sprintf's output is not consistent
+ // across platforms.
+ std::size_t inf_size = 4;
+ const char *inf = upper ? " INF" : " inf";
+ if (!sign) {
+ --inf_size;
+ ++inf;
+ }
+ CharPtr out = write_str(inf, inf_size, spec);
+ if (sign)
+ *out = sign;
+ return;
+ }
+
+ std::size_t offset = buffer_.size();
+ unsigned width = spec.width();
+ if (sign) {
+ buffer_.reserve(buffer_.size() + (std::max)(width, 1u));
+ if (width > 0)
+ --width;
+ ++offset;
+ }
+
+ // Build format string.
+ enum { MAX_FORMAT_SIZE = 10}; // longest format: %#-*.*Lg
+ Char format[MAX_FORMAT_SIZE];
+ Char *format_ptr = format;
+ *format_ptr++ = '%';
+ unsigned width_for_sprintf = width;
+ if (spec.flag(HASH_FLAG))
+ *format_ptr++ = '#';
+ if (spec.align() == ALIGN_CENTER) {
+ width_for_sprintf = 0;
+ } else {
+ if (spec.align() == ALIGN_LEFT)
+ *format_ptr++ = '-';
+ if (width != 0)
+ *format_ptr++ = '*';
+ }
+ if (spec.precision() >= 0) {
+ *format_ptr++ = '.';
+ *format_ptr++ = '*';
+ }
+
+ append_float_length(format_ptr, value);
+ *format_ptr++ = type;
+ *format_ptr = '\0';
+
+ // Format using snprintf.
+ Char fill = static_cast<Char>(spec.fill());
+ for (;;) {
+ std::size_t buffer_size = buffer_.capacity() - offset;
+#if _MSC_VER
+ // MSVC's vsnprintf_s doesn't work with zero size, so reserve
+ // space for at least one extra character to make the size non-zero.
+ // Note that the buffer's capacity will increase by more than 1.
+ if (buffer_size == 0) {
+ buffer_.reserve(offset + 1);
+ buffer_size = buffer_.capacity() - offset;
+ }
+#endif
+ Char *start = &buffer_[offset];
+ int n = internal::CharTraits<Char>::format_float(
+ start, buffer_size, format, width_for_sprintf, spec.precision(), value);
+ if (n >= 0 && offset + n < buffer_.capacity()) {
+ if (sign) {
+ if ((spec.align() != ALIGN_RIGHT && spec.align() != ALIGN_DEFAULT) ||
+ *start != ' ') {
+ *(start - 1) = sign;
+ sign = 0;
+ } else {
+ *(start - 1) = fill;
+ }
+ ++n;
+ }
+ if (spec.align() == ALIGN_CENTER &&
+ spec.width() > static_cast<unsigned>(n)) {
+ width = spec.width();
+ CharPtr p = grow_buffer(width);
+ std::copy(p, p + n, p + (width - n) / 2);
+ fill_padding(p, spec.width(), n, fill);
+ return;
+ }
+ if (spec.fill() != ' ' || sign) {
+ while (*start == ' ')
+ *start++ = fill;
+ if (sign)
+ *(start - 1) = sign;
+ }
+ grow_buffer(n);
+ return;
+ }
+ // If n is negative we ask to increase the capacity by at least 1,
+ // but as std::vector, the buffer grows exponentially.
+ buffer_.reserve(n >= 0 ? offset + n + 1 : buffer_.capacity() + 1);
+ }
+}
+
+/**
+ \rst
+ This class template provides operations for formatting and writing data
+ into a character stream. The output is stored in a memory buffer that grows
+ dynamically.
+
+ You can use one of the following typedefs for common character types
+ and the standard allocator:
+
+ +---------------+-----------------------------------------------------+
+ | Type | Definition |
+ +===============+=====================================================+
+ | MemoryWriter | BasicMemoryWriter<char, std::allocator<char>> |
+ +---------------+-----------------------------------------------------+
+ | WMemoryWriter | BasicMemoryWriter<wchar_t, std::allocator<wchar_t>> |
+ +---------------+-----------------------------------------------------+
+
+ **Example**::
+
+ MemoryWriter out;
+ out << "The answer is " << 42 << "\n";
+ out.write("({:+f}, {:+f})", -3.14, 3.14);
+
+ This will write the following output to the ``out`` object:
+
+ .. code-block:: none
+
+ The answer is 42
+ (-3.140000, +3.140000)
+
+ The output can be converted to an ``std::string`` with ``out.str()`` or
+ accessed as a C string with ``out.c_str()``.
+ \endrst
+ */
+template <typename Char, typename Allocator = std::allocator<Char> >
+class BasicMemoryWriter : public BasicWriter<Char> {
+ private:
+ internal::MemoryBuffer<Char, internal::INLINE_BUFFER_SIZE, Allocator> buffer_;
+
+ public:
+ explicit BasicMemoryWriter(const Allocator& alloc = Allocator())
+ : BasicWriter<Char>(buffer_), buffer_(alloc) {}
+
+#if FMT_USE_RVALUE_REFERENCES
+ /**
+ \rst
+ Constructs a :class:`fmt::BasicMemoryWriter` object moving the content
+ of the other object to it.
+ \endrst
+ */
+ BasicMemoryWriter(BasicMemoryWriter &&other)
+ : BasicWriter<Char>(buffer_), buffer_(std::move(other.buffer_)) {
+ }
+
+ /**
+ \rst
+ Moves the content of the other ``BasicMemoryWriter`` object to this one.
+ \endrst
+ */
+ BasicMemoryWriter &operator=(BasicMemoryWriter &&other) {
+ buffer_ = std::move(other.buffer_);
+ return *this;
+ }
+#endif
+};
+
+typedef BasicMemoryWriter<char> MemoryWriter;
+typedef BasicMemoryWriter<wchar_t> WMemoryWriter;
+
+/**
+ \rst
+ This class template provides operations for formatting and writing data
+ into a fixed-size array. For writing into a dynamically growing buffer
+ use :class:`fmt::BasicMemoryWriter`.
+
+ Any write method will throw ``std::runtime_error`` if the output doesn't fit
+ into the array.
+
+ You can use one of the following typedefs for common character types:
+
+ +--------------+---------------------------+
+ | Type | Definition |
+ +==============+===========================+
+ | ArrayWriter | BasicArrayWriter<char> |
+ +--------------+---------------------------+
+ | WArrayWriter | BasicArrayWriter<wchar_t> |
+ +--------------+---------------------------+
+ \endrst
+ */
+template <typename Char>
+class BasicArrayWriter : public BasicWriter<Char> {
+ private:
+ internal::FixedBuffer<Char> buffer_;
+
+ public:
+ /**
+ \rst
+ Constructs a :class:`fmt::BasicArrayWriter` object for *array* of the
+ given size.
+ \endrst
+ */
+ BasicArrayWriter(Char *array, std::size_t size)
+ : BasicWriter<Char>(buffer_), buffer_(array, size) {}
+
+ // FIXME: this is temporary undocumented due to a bug in Sphinx
+ /*
+ \rst
+ Constructs a :class:`fmt::BasicArrayWriter` object for *array* of the
+ size known at compile time.
+ \endrst
+ */
+ template <std::size_t SIZE>
+ explicit BasicArrayWriter(Char (&array)[SIZE])
+ : BasicWriter<Char>(buffer_), buffer_(array, SIZE) {}
+};
+
+typedef BasicArrayWriter<char> ArrayWriter;
+typedef BasicArrayWriter<wchar_t> WArrayWriter;
+
+// Formats a value.
+template <typename Char, typename T>
+void format(BasicFormatter<Char> &f, const Char *&format_str, const T &value) {
+ std::basic_ostringstream<Char> os;
+ os << value;
+ internal::Arg arg;
+ internal::Value &arg_value = arg;
+ std::basic_string<Char> str = os.str();
+ arg_value = internal::MakeValue<Char>(str);
+ arg.type = static_cast<internal::Arg::Type>(
+ internal::MakeValue<Char>::type(str));
+ format_str = f.format(format_str, arg);
+}
+
+// Reports a system error without throwing an exception.
+// Can be used to report errors from destructors.
+void report_system_error(int error_code, StringRef message) FMT_NOEXCEPT;
+
+#ifdef _WIN32
+
+/** A Windows error. */
+class WindowsError : public SystemError {
+ private:
+ void init(int error_code, StringRef format_str, ArgList args);
+
+ public:
+ /**
+ \rst
+ Constructs a :class:`fmt::WindowsError` object with the description
+ of the form
+
+ .. parsed-literal::
+ *<message>*: *<system-message>*
+
+ where *<message>* is the formatted message and *<system-message>* is the
+ system message corresponding to the error code.
+ *error_code* is a Windows error code as given by ``GetLastError``.
+ If *error_code* is not a valid error code such as -1, the system message
+ will look like "error -1".
+
+ **Example**::
+
+ // This throws a WindowsError with the description
+ // cannot open file 'madeup': The system cannot find the file specified.
+ // or similar (system message may vary).
+ const char *filename = "madeup";
+ LPOFSTRUCT of = LPOFSTRUCT();
+ HFILE file = OpenFile(filename, &of, OF_READ);
+ if (file == HFILE_ERROR) {
+ throw fmt::WindowsError(GetLastError(),
+ "cannot open file '{}'", filename);
+ }
+ \endrst
+ */
+ WindowsError(int error_code, StringRef message) {
+ init(error_code, message, ArgList());
+ }
+ FMT_VARIADIC_CTOR(WindowsError, init, int, StringRef)
+};
+
+// Reports a Windows error without throwing an exception.
+// Can be used to report errors from destructors.
+void report_windows_error(int error_code, StringRef message) FMT_NOEXCEPT;
+
+#endif
+
+enum Color { BLACK, RED, GREEN, YELLOW, BLUE, MAGENTA, CYAN, WHITE };
+
+/**
+ Formats a string and prints it to stdout using ANSI escape sequences
+ to specify color (experimental).
+ Example:
+ PrintColored(fmt::RED, "Elapsed time: {0:.2f} seconds") << 1.23;
+ */
+void print_colored(Color c, StringRef format, ArgList args);
+
+/**
+ \rst
+ Formats arguments and returns the result as a string.
+
+ **Example**::
+
+ std::string message = format("The answer is {}", 42);
+ \endrst
+*/
+inline std::string format(StringRef format_str, ArgList args) {
+ MemoryWriter w;
+ w.write(format_str, args);
+ return w.str();
+}
+
+inline std::wstring format(WStringRef format_str, ArgList args) {
+ WMemoryWriter w;
+ w.write(format_str, args);
+ return w.str();
+}
+
+/**
+ \rst
+ Prints formatted data to the file *f*.
+
+ **Example**::
+
+ print(stderr, "Don't {}!", "panic");
+ \endrst
+ */
+void print(std::FILE *f, StringRef format_str, ArgList args);
+
+/**
+ \rst
+ Prints formatted data to ``stdout``.
+
+ **Example**::
+
+ print("Elapsed time: {0:.2f} seconds", 1.23);
+ \endrst
+ */
+void print(StringRef format_str, ArgList args);
+
+/**
+ \rst
+ Prints formatted data to the stream *os*.
+
+ **Example**::
+
+ print(cerr, "Don't {}!", "panic");
+ \endrst
+ */
+void print(std::ostream &os, StringRef format_str, ArgList args);
+
+template <typename Char>
+void printf(BasicWriter<Char> &w, BasicStringRef<Char> format, ArgList args) {
+ internal::PrintfFormatter<Char>().format(w, format, args);
+}
+
+/**
+ \rst
+ Formats arguments and returns the result as a string.
+
+ **Example**::
+
+ std::string message = fmt::sprintf("The answer is %d", 42);
+ \endrst
+*/
+inline std::string sprintf(StringRef format, ArgList args) {
+ MemoryWriter w;
+ printf(w, format, args);
+ return w.str();
+}
+
+/**
+ \rst
+ Prints formatted data to the file *f*.
+
+ **Example**::
+
+ fmt::fprintf(stderr, "Don't %s!", "panic");
+ \endrst
+ */
+int fprintf(std::FILE *f, StringRef format, ArgList args);
+
+/**
+ \rst
+ Prints formatted data to ``stdout``.
+
+ **Example**::
+
+ fmt::printf("Elapsed time: %.2f seconds", 1.23);
+ \endrst
+ */
+inline int printf(StringRef format, ArgList args) {
+ return fprintf(stdout, format, args);
+}
+
+/**
+ Fast integer formatter.
+ */
+class FormatInt {
+ private:
+ // Buffer should be large enough to hold all digits (digits10 + 1),
+ // a sign and a null character.
+ enum {BUFFER_SIZE = std::numeric_limits<ULongLong>::digits10 + 3};
+ mutable char buffer_[BUFFER_SIZE];
+ char *str_;
+
+ // Formats value in reverse and returns the number of digits.
+ char *format_decimal(ULongLong value) {
+ char *buffer_end = buffer_ + BUFFER_SIZE - 1;
+ while (value >= 100) {
+ // Integer division is slow so do it for a group of two digits instead
+ // of for every digit. The idea comes from the talk by Alexandrescu
+ // "Three Optimization Tips for C++". See speed-test for a comparison.
+ unsigned index = (value % 100) * 2;
+ value /= 100;
+ *--buffer_end = internal::Data::DIGITS[index + 1];
+ *--buffer_end = internal::Data::DIGITS[index];
+ }
+ if (value < 10) {
+ *--buffer_end = static_cast<char>('0' + value);
+ return buffer_end;
+ }
+ unsigned index = static_cast<unsigned>(value * 2);
+ *--buffer_end = internal::Data::DIGITS[index + 1];
+ *--buffer_end = internal::Data::DIGITS[index];
+ return buffer_end;
+ }
+
+ void FormatSigned(LongLong value) {
+ ULongLong abs_value = static_cast<ULongLong>(value);
+ bool negative = value < 0;
+ if (negative)
+ abs_value = 0 - abs_value;
+ str_ = format_decimal(abs_value);
+ if (negative)
+ *--str_ = '-';
+ }
+
+ public:
+ explicit FormatInt(int value) { FormatSigned(value); }
+ explicit FormatInt(long value) { FormatSigned(value); }
+ explicit FormatInt(LongLong value) { FormatSigned(value); }
+ explicit FormatInt(unsigned value) : str_(format_decimal(value)) {}
+ explicit FormatInt(unsigned long value) : str_(format_decimal(value)) {}
+ explicit FormatInt(ULongLong value) : str_(format_decimal(value)) {}
+
+ /**
+ Returns the number of characters written to the output buffer.
+ */
+ std::size_t size() const { return buffer_ - str_ + BUFFER_SIZE - 1; }
+
+ /**
+ Returns a pointer to the output buffer content. No terminating null
+ character is appended.
+ */
+ const char *data() const { return str_; }
+
+ /**
+ Returns a pointer to the output buffer content with terminating null
+ character appended.
+ */
+ const char *c_str() const {
+ buffer_[BUFFER_SIZE - 1] = '\0';
+ return str_;
+ }
+
+ /**
+ Returns the content of the output buffer as an `std::string`.
+ */
+ std::string str() const { return std::string(str_, size()); }
+};
+
+// Formats a decimal integer value writing into buffer and returns
+// a pointer to the end of the formatted string. This function doesn't
+// write a terminating null character.
+template <typename T>
+inline void format_decimal(char *&buffer, T value) {
+ typename internal::IntTraits<T>::MainType abs_value = value;
+ if (internal::is_negative(value)) {
+ *buffer++ = '-';
+ abs_value = 0 - abs_value;
+ }
+ if (abs_value < 100) {
+ if (abs_value < 10) {
+ *buffer++ = static_cast<char>('0' + abs_value);
+ return;
+ }
+ unsigned index = static_cast<unsigned>(abs_value * 2);
+ *buffer++ = internal::Data::DIGITS[index];
+ *buffer++ = internal::Data::DIGITS[index + 1];
+ return;
+ }
+ unsigned num_digits = internal::count_digits(abs_value);
+ internal::format_decimal(buffer, abs_value, num_digits);
+ buffer += num_digits;
+}
+}
+
+#if FMT_GCC_VERSION
+// Use the system_header pragma to suppress warnings about variadic macros
+// because suppressing -Wvariadic-macros with the diagnostic pragma doesn't
+// work. It is used at the end because we want to suppress as little warnings
+// as possible.
+# pragma GCC system_header
+#endif
+
+// This is used to work around VC++ bugs in handling variadic macros.
+#define FMT_EXPAND(args) args
+
+// Returns the number of arguments.
+// Based on https://groups.google.com/forum/#!topic/comp.std.c/d-6Mj5Lko_s.
+#define FMT_NARG(...) FMT_NARG_(__VA_ARGS__, FMT_RSEQ_N())
+#define FMT_NARG_(...) FMT_EXPAND(FMT_ARG_N(__VA_ARGS__))
+#define FMT_ARG_N(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, N, ...) N
+#define FMT_RSEQ_N() 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0
+
+#define FMT_CONCAT(a, b) a##b
+#define FMT_FOR_EACH_(N, f, ...) \
+ FMT_EXPAND(FMT_CONCAT(FMT_FOR_EACH, N)(f, __VA_ARGS__))
+#define FMT_FOR_EACH(f, ...) \
+ FMT_EXPAND(FMT_FOR_EACH_(FMT_NARG(__VA_ARGS__), f, __VA_ARGS__))
+
+#define FMT_ADD_ARG_NAME(type, index) type arg##index
+#define FMT_GET_ARG_NAME(type, index) arg##index
+
+#if FMT_USE_VARIADIC_TEMPLATES
+# define FMT_VARIADIC_(Char, ReturnType, func, call, ...) \
+ template <typename... Args> \
+ ReturnType func(FMT_FOR_EACH(FMT_ADD_ARG_NAME, __VA_ARGS__), \
+ const Args & ... args) { \
+ using fmt::internal::Value; \
+ const Value values[fmt::internal::NonZero<sizeof...(Args)>::VALUE] = { \
+ fmt::internal::MakeValue<Char>(args)... \
+ }; \
+ call(FMT_FOR_EACH(FMT_GET_ARG_NAME, __VA_ARGS__), fmt::ArgList( \
+ fmt::internal::make_type(args...), values)); \
+ }
+#else
+// Defines a wrapper for a function taking __VA_ARGS__ arguments
+// and n additional arguments of arbitrary types.
+# define FMT_WRAP(Char, ReturnType, func, call, n, ...) \
+ template <FMT_GEN(n, FMT_MAKE_TEMPLATE_ARG)> \
+ inline ReturnType func(FMT_FOR_EACH(FMT_ADD_ARG_NAME, __VA_ARGS__), \
+ FMT_GEN(n, FMT_MAKE_ARG)) { \
+ const fmt::internal::Value vals[] = {FMT_GEN(n, FMT_MAKE_REF_##Char)}; \
+ call(FMT_FOR_EACH(FMT_GET_ARG_NAME, __VA_ARGS__), fmt::ArgList( \
+ fmt::internal::make_type(FMT_GEN(n, FMT_MAKE_REF2)), vals)); \
+ }
+
+# define FMT_VARIADIC_(Char, ReturnType, func, call, ...) \
+ inline ReturnType func(FMT_FOR_EACH(FMT_ADD_ARG_NAME, __VA_ARGS__)) { \
+ call(FMT_FOR_EACH(FMT_GET_ARG_NAME, __VA_ARGS__), fmt::ArgList()); \
+ } \
+ FMT_WRAP(Char, ReturnType, func, call, 1, __VA_ARGS__) \
+ FMT_WRAP(Char, ReturnType, func, call, 2, __VA_ARGS__) \
+ FMT_WRAP(Char, ReturnType, func, call, 3, __VA_ARGS__) \
+ FMT_WRAP(Char, ReturnType, func, call, 4, __VA_ARGS__) \
+ FMT_WRAP(Char, ReturnType, func, call, 5, __VA_ARGS__) \
+ FMT_WRAP(Char, ReturnType, func, call, 6, __VA_ARGS__) \
+ FMT_WRAP(Char, ReturnType, func, call, 7, __VA_ARGS__) \
+ FMT_WRAP(Char, ReturnType, func, call, 8, __VA_ARGS__) \
+ FMT_WRAP(Char, ReturnType, func, call, 9, __VA_ARGS__) \
+ FMT_WRAP(Char, ReturnType, func, call, 10, __VA_ARGS__) \
+ FMT_WRAP(Char, ReturnType, func, call, 11, __VA_ARGS__) \
+ FMT_WRAP(Char, ReturnType, func, call, 12, __VA_ARGS__) \
+ FMT_WRAP(Char, ReturnType, func, call, 13, __VA_ARGS__) \
+ FMT_WRAP(Char, ReturnType, func, call, 14, __VA_ARGS__) \
+ FMT_WRAP(Char, ReturnType, func, call, 15, __VA_ARGS__)
+#endif // FMT_USE_VARIADIC_TEMPLATES
+
+/**
+ \rst
+ Defines a variadic function with the specified return type, function name
+ and argument types passed as variable arguments to this macro.
+
+ **Example**::
+
+ void print_error(const char *file, int line, const char *format,
+ fmt::ArgList args) {
+ fmt::print("{}: {}: ", file, line);
+ fmt::print(format, args);
+ }
+ FMT_VARIADIC(void, print_error, const char *, int, const char *)
+
+ ``FMT_VARIADIC`` is used for compatibility with legacy C++ compilers that
+ don't implement variadic templates. You don't have to use this macro if
+ you don't need legacy compiler support and can use variadic templates
+ directly::
+
+ template <typename... Args>
+ void print_error(const char *file, int line, const char *format,
+ const Args & ... args) {
+ fmt::print("{}: {}: ", file, line);
+ fmt::print(format, args...);
+ }
+ \endrst
+ */
+#define FMT_VARIADIC(ReturnType, func, ...) \
+ FMT_VARIADIC_(char, ReturnType, func, return func, __VA_ARGS__)
+
+#define FMT_VARIADIC_W(ReturnType, func, ...) \
+ FMT_VARIADIC_(wchar_t, ReturnType, func, return func, __VA_ARGS__)
+
+namespace fmt {
+FMT_VARIADIC(std::string, format, StringRef)
+FMT_VARIADIC_W(std::wstring, format, WStringRef)
+FMT_VARIADIC(void, print, StringRef)
+FMT_VARIADIC(void, print, std::FILE *, StringRef)
+FMT_VARIADIC(void, print, std::ostream &, StringRef)
+FMT_VARIADIC(void, print_colored, Color, StringRef)
+FMT_VARIADIC(std::string, sprintf, StringRef)
+FMT_VARIADIC(int, printf, StringRef)
+FMT_VARIADIC(int, fprintf, std::FILE *, StringRef)
+}
+
+// Restore warnings.
+#if FMT_GCC_VERSION >= 406
+# pragma GCC diagnostic pop
+#endif
+
+#ifdef __clang__
+# pragma clang diagnostic pop
+#endif
+
+#ifdef FMT_HEADER_ONLY
+# include "format.cc"
+#endif
+
+#endif // FMT_FORMAT_H_
diff --git a/dep/cppformat/posix.cc b/dep/cppformat/posix.cc
new file mode 100644
index 00000000000..0efb5aff3d0
--- /dev/null
+++ b/dep/cppformat/posix.cc
@@ -0,0 +1,252 @@
+/*
+ A C++ interface to POSIX functions.
+
+ Copyright (c) 2014 - 2015, Victor Zverovich
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice, this
+ list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
+ ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+// Disable bogus MSVC warnings.
+#ifndef _CRT_SECURE_NO_WARNINGS
+# define _CRT_SECURE_NO_WARNINGS
+#endif
+
+#include "posix.h"
+
+#include <limits.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+
+#ifndef _WIN32
+# include <unistd.h>
+#else
+# include <windows.h>
+# include <io.h>
+
+# define O_CREAT _O_CREAT
+# define O_TRUNC _O_TRUNC
+
+# ifndef S_IRUSR
+# define S_IRUSR _S_IREAD
+# endif
+
+# ifndef S_IWUSR
+# define S_IWUSR _S_IWRITE
+# endif
+
+# ifdef __MINGW32__
+# define _SH_DENYNO 0x40
+# undef fileno
+# endif
+
+#endif // _WIN32
+
+namespace {
+#ifdef _WIN32
+// Return type of read and write functions.
+typedef int RWResult;
+
+// On Windows the count argument to read and write is unsigned, so convert
+// it from size_t preventing integer overflow.
+inline unsigned convert_rwcount(std::size_t count) {
+ return count <= UINT_MAX ? static_cast<unsigned>(count) : UINT_MAX;
+}
+#else
+// Return type of read and write functions.
+typedef ssize_t RWResult;
+
+inline std::size_t convert_rwcount(std::size_t count) { return count; }
+#endif
+}
+
+fmt::BufferedFile::~BufferedFile() FMT_NOEXCEPT {
+ if (file_ && FMT_SYSTEM(fclose(file_)) != 0)
+ fmt::report_system_error(errno, "cannot close file");
+}
+
+fmt::BufferedFile::BufferedFile(fmt::StringRef filename, fmt::StringRef mode) {
+ FMT_RETRY_VAL(file_, FMT_SYSTEM(fopen(filename.c_str(), mode.c_str())), 0);
+ if (!file_)
+ throw SystemError(errno, "cannot open file {}", filename);
+}
+
+void fmt::BufferedFile::close() {
+ if (!file_)
+ return;
+ int result = FMT_SYSTEM(fclose(file_));
+ file_ = 0;
+ if (result != 0)
+ throw SystemError(errno, "cannot close file");
+}
+
+// A macro used to prevent expansion of fileno on broken versions of MinGW.
+#define FMT_ARGS
+
+int fmt::BufferedFile::fileno() const {
+ int fd = FMT_POSIX_CALL(fileno FMT_ARGS(file_));
+ if (fd == -1)
+ throw SystemError(errno, "cannot get file descriptor");
+ return fd;
+}
+
+fmt::File::File(fmt::StringRef path, int oflag) {
+ int mode = S_IRUSR | S_IWUSR;
+#if defined(_WIN32) && !defined(__MINGW32__)
+ fd_ = -1;
+ FMT_POSIX_CALL(sopen_s(&fd_, path.c_str(), oflag, _SH_DENYNO, mode));
+#else
+ FMT_RETRY(fd_, FMT_POSIX_CALL(open(path.c_str(), oflag, mode)));
+#endif
+ if (fd_ == -1)
+ throw SystemError(errno, "cannot open file {}", path);
+}
+
+fmt::File::~File() FMT_NOEXCEPT {
+ // Don't retry close in case of EINTR!
+ // See http://linux.derkeiler.com/Mailing-Lists/Kernel/2005-09/3000.html
+ if (fd_ != -1 && FMT_POSIX_CALL(close(fd_)) != 0)
+ fmt::report_system_error(errno, "cannot close file");
+}
+
+void fmt::File::close() {
+ if (fd_ == -1)
+ return;
+ // Don't retry close in case of EINTR!
+ // See http://linux.derkeiler.com/Mailing-Lists/Kernel/2005-09/3000.html
+ int result = FMT_POSIX_CALL(close(fd_));
+ fd_ = -1;
+ if (result != 0)
+ throw SystemError(errno, "cannot close file");
+}
+
+fmt::LongLong fmt::File::size() const {
+#ifdef _WIN32
+ // Use GetFileSize instead of GetFileSizeEx for the case when _WIN32_WINNT
+ // is less than 0x0500 as is the case with some default MinGW builds.
+ // Both functions support large file sizes.
+ DWORD size_upper = 0;
+ HANDLE handle = reinterpret_cast<HANDLE>(_get_osfhandle(fd_));
+ DWORD size_lower = FMT_SYSTEM(GetFileSize(handle, &size_upper));
+ if (size_lower == INVALID_FILE_SIZE) {
+ DWORD error = GetLastError();
+ if (error != NO_ERROR)
+ throw WindowsError(GetLastError(), "cannot get file size");
+ }
+ fmt::ULongLong size = size_upper;
+ return (size << sizeof(DWORD) * CHAR_BIT) | size_lower;
+#else
+ typedef struct stat Stat;
+ Stat file_stat = Stat();
+ if (FMT_POSIX_CALL(fstat(fd_, &file_stat)) == -1)
+ throw SystemError(errno, "cannot get file attributes");
+ FMT_STATIC_ASSERT(sizeof(fmt::LongLong) >= sizeof(file_stat.st_size),
+ "return type of File::size is not large enough");
+ return file_stat.st_size;
+#endif
+}
+
+std::size_t fmt::File::read(void *buffer, std::size_t count) {
+ RWResult result = 0;
+ FMT_RETRY(result, FMT_POSIX_CALL(read(fd_, buffer, convert_rwcount(count))));
+ if (result < 0)
+ throw SystemError(errno, "cannot read from file");
+ return result;
+}
+
+std::size_t fmt::File::write(const void *buffer, std::size_t count) {
+ RWResult result = 0;
+ FMT_RETRY(result, FMT_POSIX_CALL(write(fd_, buffer, convert_rwcount(count))));
+ if (result < 0)
+ throw SystemError(errno, "cannot write to file");
+ return result;
+}
+
+fmt::File fmt::File::dup(int fd) {
+ // Don't retry as dup doesn't return EINTR.
+ // http://pubs.opengroup.org/onlinepubs/009695399/functions/dup.html
+ int new_fd = FMT_POSIX_CALL(dup(fd));
+ if (new_fd == -1)
+ throw SystemError(errno, "cannot duplicate file descriptor {}", fd);
+ return File(new_fd);
+}
+
+void fmt::File::dup2(int fd) {
+ int result = 0;
+ FMT_RETRY(result, FMT_POSIX_CALL(dup2(fd_, fd)));
+ if (result == -1) {
+ throw SystemError(errno,
+ "cannot duplicate file descriptor {} to {}", fd_, fd);
+ }
+}
+
+void fmt::File::dup2(int fd, ErrorCode &ec) FMT_NOEXCEPT {
+ int result = 0;
+ FMT_RETRY(result, FMT_POSIX_CALL(dup2(fd_, fd)));
+ if (result == -1)
+ ec = ErrorCode(errno);
+}
+
+void fmt::File::pipe(File &read_end, File &write_end) {
+ // Close the descriptors first to make sure that assignments don't throw
+ // and there are no leaks.
+ read_end.close();
+ write_end.close();
+ int fds[2] = {};
+#ifdef _WIN32
+ // Make the default pipe capacity same as on Linux 2.6.11+.
+ enum { DEFAULT_CAPACITY = 65536 };
+ int result = FMT_POSIX_CALL(pipe(fds, DEFAULT_CAPACITY, _O_BINARY));
+#else
+ // Don't retry as the pipe function doesn't return EINTR.
+ // http://pubs.opengroup.org/onlinepubs/009696799/functions/pipe.html
+ int result = FMT_POSIX_CALL(pipe(fds));
+#endif
+ if (result != 0)
+ throw SystemError(errno, "cannot create pipe");
+ // The following assignments don't throw because read_fd and write_fd
+ // are closed.
+ read_end = File(fds[0]);
+ write_end = File(fds[1]);
+}
+
+fmt::BufferedFile fmt::File::fdopen(const char *mode) {
+ // Don't retry as fdopen doesn't return EINTR.
+ FILE *f = FMT_POSIX_CALL(fdopen(fd_, mode));
+ if (!f)
+ throw SystemError(errno, "cannot associate stream with file descriptor");
+ BufferedFile file(f);
+ fd_ = -1;
+ return file;
+}
+
+long fmt::getpagesize() {
+#ifdef _WIN32
+ SYSTEM_INFO si;
+ GetSystemInfo(&si);
+ return si.dwPageSize;
+#else
+ long size = FMT_POSIX_CALL(sysconf(_SC_PAGESIZE));
+ if (size < 0)
+ throw SystemError(errno, "cannot get memory page size");
+ return size;
+#endif
+}
diff --git a/dep/cppformat/posix.h b/dep/cppformat/posix.h
new file mode 100644
index 00000000000..70a0db1a560
--- /dev/null
+++ b/dep/cppformat/posix.h
@@ -0,0 +1,344 @@
+/*
+ A C++ interface to POSIX functions.
+
+ Copyright (c) 2014 - 2015, Victor Zverovich
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice, this
+ list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
+ ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef FMT_POSIX_H_
+#define FMT_POSIX_H_
+
+#ifdef __MINGW32__
+// Workaround MinGW bug https://sourceforge.net/p/mingw/bugs/2024/.
+# undef __STRICT_ANSI__
+#endif
+
+#include <errno.h>
+#include <fcntl.h> // for O_RDONLY
+#include <stdio.h>
+
+#include <cstddef>
+
+#include "format.h"
+
+#ifdef FMT_INCLUDE_POSIX_TEST
+# include "test/posix-test.h"
+#endif
+
+#ifndef FMT_POSIX
+# if defined(_WIN32) && !defined(__MINGW32__)
+// Fix warnings about deprecated symbols.
+# define FMT_POSIX(call) _##call
+# else
+# define FMT_POSIX(call) call
+# endif
+#endif
+
+// Calls to system functions are wrapped in FMT_SYSTEM for testability.
+#ifdef FMT_SYSTEM
+# define FMT_POSIX_CALL(call) FMT_SYSTEM(call)
+#else
+# define FMT_SYSTEM(call) call
+# ifdef _WIN32
+// Fix warnings about deprecated symbols.
+# define FMT_POSIX_CALL(call) ::_##call
+# else
+# define FMT_POSIX_CALL(call) ::call
+# endif
+#endif
+
+#if FMT_GCC_VERSION >= 407
+# define FMT_UNUSED __attribute__((unused))
+#else
+# define FMT_UNUSED
+#endif
+
+#if FMT_USE_STATIC_ASSERT || FMT_HAS_CPP_ATTRIBUTE(cxx_static_assert) || \
+ (FMT_GCC_VERSION >= 403 && FMT_HAS_GXX_CXX11) || _MSC_VER >= 1600
+# define FMT_STATIC_ASSERT(cond, message) static_assert(cond, message)
+#else
+# define FMT_CONCAT_(a, b) FMT_CONCAT(a, b)
+# define FMT_STATIC_ASSERT(cond, message) \
+ typedef int FMT_CONCAT_(Assert, __LINE__)[(cond) ? 1 : -1] FMT_UNUSED
+#endif
+
+// Retries the expression while it evaluates to error_result and errno
+// equals to EINTR.
+#ifndef _WIN32
+# define FMT_RETRY_VAL(result, expression, error_result) \
+ do { \
+ result = (expression); \
+ } while (result == error_result && errno == EINTR)
+#else
+# define FMT_RETRY_VAL(result, expression, error_result) result = (expression)
+#endif
+
+#define FMT_RETRY(result, expression) FMT_RETRY_VAL(result, expression, -1)
+
+namespace fmt {
+
+// An error code.
+class ErrorCode {
+ private:
+ int value_;
+
+ public:
+ explicit ErrorCode(int value = 0) FMT_NOEXCEPT : value_(value) {}
+
+ int get() const FMT_NOEXCEPT { return value_; }
+};
+
+// A buffered file.
+class BufferedFile {
+ private:
+ FILE *file_;
+
+ friend class File;
+
+ explicit BufferedFile(FILE *f) : file_(f) {}
+
+ public:
+ // Constructs a BufferedFile object which doesn't represent any file.
+ BufferedFile() FMT_NOEXCEPT : file_(0) {}
+
+ // Destroys the object closing the file it represents if any.
+ ~BufferedFile() FMT_NOEXCEPT;
+
+#if !FMT_USE_RVALUE_REFERENCES
+ // Emulate a move constructor and a move assignment operator if rvalue
+ // references are not supported.
+
+ private:
+ // A proxy object to emulate a move constructor.
+ // It is private to make it impossible call operator Proxy directly.
+ struct Proxy {
+ FILE *file;
+ };
+
+public:
+ // A "move constructor" for moving from a temporary.
+ BufferedFile(Proxy p) FMT_NOEXCEPT : file_(p.file) {}
+
+ // A "move constructor" for for moving from an lvalue.
+ BufferedFile(BufferedFile &f) FMT_NOEXCEPT : file_(f.file_) {
+ f.file_ = 0;
+ }
+
+ // A "move assignment operator" for moving from a temporary.
+ BufferedFile &operator=(Proxy p) {
+ close();
+ file_ = p.file;
+ return *this;
+ }
+
+ // A "move assignment operator" for moving from an lvalue.
+ BufferedFile &operator=(BufferedFile &other) {
+ close();
+ file_ = other.file_;
+ other.file_ = 0;
+ return *this;
+ }
+
+ // Returns a proxy object for moving from a temporary:
+ // BufferedFile file = BufferedFile(...);
+ operator Proxy() FMT_NOEXCEPT {
+ Proxy p = {file_};
+ file_ = 0;
+ return p;
+ }
+
+#else
+ private:
+ FMT_DISALLOW_COPY_AND_ASSIGN(BufferedFile);
+
+ public:
+ BufferedFile(BufferedFile &&other) FMT_NOEXCEPT : file_(other.file_) {
+ other.file_ = 0;
+ }
+
+ BufferedFile& operator=(BufferedFile &&other) {
+ close();
+ file_ = other.file_;
+ other.file_ = 0;
+ return *this;
+ }
+#endif
+
+ // Opens a file.
+ BufferedFile(fmt::StringRef filename, fmt::StringRef mode);
+
+ // Closes the file.
+ void close();
+
+ // Returns the pointer to a FILE object representing this file.
+ FILE *get() const FMT_NOEXCEPT { return file_; }
+
+ // We place parentheses around fileno to workaround a bug in some versions
+ // of MinGW that define fileno as a macro.
+ int (fileno)() const;
+
+ void print(fmt::StringRef format_str, const ArgList &args) {
+ fmt::print(file_, format_str, args);
+ }
+ FMT_VARIADIC(void, print, fmt::StringRef)
+};
+
+// A file. Closed file is represented by a File object with descriptor -1.
+// Methods that are not declared with FMT_NOEXCEPT may throw
+// fmt::SystemError in case of failure. Note that some errors such as
+// closing the file multiple times will cause a crash on Windows rather
+// than an exception. You can get standard behavior by overriding the
+// invalid parameter handler with _set_invalid_parameter_handler.
+class File {
+ private:
+ int fd_; // File descriptor.
+
+ // Constructs a File object with a given descriptor.
+ explicit File(int fd) : fd_(fd) {}
+
+ public:
+ // Possible values for the oflag argument to the constructor.
+ enum {
+ RDONLY = FMT_POSIX(O_RDONLY), // Open for reading only.
+ WRONLY = FMT_POSIX(O_WRONLY), // Open for writing only.
+ RDWR = FMT_POSIX(O_RDWR) // Open for reading and writing.
+ };
+
+ // Constructs a File object which doesn't represent any file.
+ File() FMT_NOEXCEPT : fd_(-1) {}
+
+ // Opens a file and constructs a File object representing this file.
+ File(fmt::StringRef path, int oflag);
+
+#if !FMT_USE_RVALUE_REFERENCES
+ // Emulate a move constructor and a move assignment operator if rvalue
+ // references are not supported.
+
+ private:
+ // A proxy object to emulate a move constructor.
+ // It is private to make it impossible call operator Proxy directly.
+ struct Proxy {
+ int fd;
+ };
+
+ public:
+ // A "move constructor" for moving from a temporary.
+ File(Proxy p) FMT_NOEXCEPT : fd_(p.fd) {}
+
+ // A "move constructor" for for moving from an lvalue.
+ File(File &other) FMT_NOEXCEPT : fd_(other.fd_) {
+ other.fd_ = -1;
+ }
+
+ // A "move assignment operator" for moving from a temporary.
+ File &operator=(Proxy p) {
+ close();
+ fd_ = p.fd;
+ return *this;
+ }
+
+ // A "move assignment operator" for moving from an lvalue.
+ File &operator=(File &other) {
+ close();
+ fd_ = other.fd_;
+ other.fd_ = -1;
+ return *this;
+ }
+
+ // Returns a proxy object for moving from a temporary:
+ // File file = File(...);
+ operator Proxy() FMT_NOEXCEPT {
+ Proxy p = {fd_};
+ fd_ = -1;
+ return p;
+ }
+
+#else
+ private:
+ FMT_DISALLOW_COPY_AND_ASSIGN(File);
+
+ public:
+ File(File &&other) FMT_NOEXCEPT : fd_(other.fd_) {
+ other.fd_ = -1;
+ }
+
+ File& operator=(File &&other) {
+ close();
+ fd_ = other.fd_;
+ other.fd_ = -1;
+ return *this;
+ }
+#endif
+
+ // Destroys the object closing the file it represents if any.
+ ~File() FMT_NOEXCEPT;
+
+ // Returns the file descriptor.
+ int descriptor() const FMT_NOEXCEPT { return fd_; }
+
+ // Closes the file.
+ void close();
+
+ // Returns the file size.
+ fmt::LongLong size() const;
+
+ // Attempts to read count bytes from the file into the specified buffer.
+ std::size_t read(void *buffer, std::size_t count);
+
+ // Attempts to write count bytes from the specified buffer to the file.
+ std::size_t write(const void *buffer, std::size_t count);
+
+ // Duplicates a file descriptor with the dup function and returns
+ // the duplicate as a file object.
+ static File dup(int fd);
+
+ // Makes fd be the copy of this file descriptor, closing fd first if
+ // necessary.
+ void dup2(int fd);
+
+ // Makes fd be the copy of this file descriptor, closing fd first if
+ // necessary.
+ void dup2(int fd, ErrorCode &ec) FMT_NOEXCEPT;
+
+ // Creates a pipe setting up read_end and write_end file objects for reading
+ // and writing respectively.
+ static void pipe(File &read_end, File &write_end);
+
+ // Creates a BufferedFile object associated with this file and detaches
+ // this File object from the file.
+ BufferedFile fdopen(const char *mode);
+};
+
+// Returns the memory page size.
+long getpagesize();
+} // namespace fmt
+
+#if !FMT_USE_RVALUE_REFERENCES
+namespace std {
+// For compatibility with C++98.
+inline fmt::BufferedFile &move(fmt::BufferedFile &f) { return f; }
+inline fmt::File &move(fmt::File &f) { return f; }
+}
+#endif
+
+#endif // FMT_POSIX_H_
diff --git a/sql/updates/world/2015_01_30_00_world.sql b/sql/updates/world/2015_01_30_00_world.sql
new file mode 100644
index 00000000000..4393b38ddd2
--- /dev/null
+++ b/sql/updates/world/2015_01_30_00_world.sql
@@ -0,0 +1,32 @@
+DELETE FROM `creature_text` WHERE `entry` IN(37158,37704);
+DELETE FROM `creature_text` WHERE `entry`=37225 AND `groupid` > 15;
+INSERT INTO `creature_text` (`entry`, `groupid`, `id`, `text`, `type`, `language`, `probability`, `emote`, `duration`, `sound`, `comment`, `BroadcastTextID`) VALUES
+(37158, 0, 0, '%s prepares to attack!', 41, 0, 100, 0, 0, 0, 'Quel''Delar', 37211),
+(37704, 0, 0, 'Quel''Delar leaps to life in the presence of Frostmourne!', 41, 0, 100, 0, 0, 0, 'Frostmourne Altar Bunny (Quel''Delar)', 37645),
+-- Uther
+(37225, 16, 0, 'Halt! Do not carry that blade any further!', 14, 0, 100, 25, 0, 16675, 'Uther the Lightbringer', 37201),
+(37225, 17, 0, 'Do you realize what you''ve done?', 14, 0, 100, 5, 0, 16676, 'Uther the Lightbringer', 37202),
+(37225, 18, 0, 'You have forged this blade from saronite, the very blood of an old god. The power of the Lich King calls to this weapon.', 12, 0, 100, 1, 0, 16677, 'Uther the Lightbringer', 37204),
+(37225, 19, 0, 'Each moment you tarry here, Quel''Delar drinks in the evil of this place.', 12, 0, 100, 1, 0, 16678, 'Uther the Lightbringer', 38442),
+(37225, 20, 0, 'There is only one way to cleanse this sword. Make haste for the Sunwell and immerse the blade in its waters.', 12, 0, 100, 25, 0, 16679, 'Uther the Lightbringer', 37205),
+(37225, 21, 0, 'I can resist Frostmourne''s call no more...', 12, 0, 100, 1, 0, 16680, 'Uther the Lightbringer', 37206);
+
+UPDATE `creature_template` SET `unit_flags`=768, `flags_extra`=0, `ScriptName`='npc_quel_delar_sword', `InhabitType`=7 WHERE `entry`=37158;
+UPDATE `creature_template` SET `ScriptName`='npc_uther_quel_delar' WHERE `entry`=37225;
+
+DELETE FROM `areatrigger_scripts` WHERE `entry`=5660;
+INSERT INTO `areatrigger_scripts` (`entry`,`ScriptName`) VALUES
+(5660, 'at_hor_uther_quel_delar_start');
+
+DELETE FROM `spell_target_position` WHERE `id` IN(70719,70700);
+INSERT INTO `spell_target_position` (`id`,`target_map`,`target_position_x`,`target_position_y`,`target_position_z`,`target_orientation`) VALUES
+(70719, 668, 5302, 1989, 708, 0),
+(70700, 668, 5298, 1995, 708, 0);
+
+DELETE FROM `creature_loot_template` WHERE `entry` = 37158 AND `item` = 50254;
+INSERT INTO `creature_loot_template` (`Entry`, `Item`, `Chance`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`) VALUES
+(37158, 50254, 100, 1, 0, 1, 1);
+
+DELETE FROM `conditions` WHERE `SourceEntry` = 73035 AND `SourceTypeOrReferenceId` = 13;
+INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorType`, `ErrorTextId`, `Comment`) VALUES
+(13,1,73035,0,0,31,0,3,37704,0,0,0,0,'Essence of the Captured (73035) only hits Frostmourne Altar Bunny (Quel''Delar)');
diff --git a/sql/updates/world/2015_01_31_00_335.sql b/sql/updates/world/2015_01_31_00_335.sql
new file mode 100644
index 00000000000..8aaa026154a
--- /dev/null
+++ b/sql/updates/world/2015_01_31_00_335.sql
@@ -0,0 +1,3 @@
+DELETE FROM `gameobject_template` WHERE `entry` = 180856;
+INSERT INTO `gameobject_template` (`entry`, `type`, `displayId`, `name`, `data0`, `data1`, `data2`, `data3`, `size`, `VerifiedBuild`) VALUES
+(180856, 10, 6522, 'Firework Rocket, Type 1 Purple', 0, 0, 0, 3000, 1, -18019);
diff --git a/sql/updates/world/2015_02_02_00_world.sql b/sql/updates/world/2015_02_02_00_world.sql
new file mode 100644
index 00000000000..84d31ef7be1
--- /dev/null
+++ b/sql/updates/world/2015_02_02_00_world.sql
@@ -0,0 +1,16 @@
+DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=22 AND `SourceEntry` IN(29491,28994,28721,28725,33027,28727,28715,28714,28726,29523,28989,28997,28723,28718);
+INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorType`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES
+(22, 1, 29491, 0, 0, 31, 0, 4, 0, 0, 0, 0, 0, '', 'Karandonna - Only run SAI if invoker is player'),
+(22, 1, 28994, 0, 0, 31, 0, 4, 0, 0, 0, 0, 0, '', 'Abra Cadabra - Only run SAI if invoker is player'),
+(22, 1, 28721, 0, 0, 31, 0, 4, 0, 0, 0, 0, 0, '', 'Tiffany Cartier - Only run SAI if invoker is player'),
+(22, 1, 28725, 0, 0, 31, 0, 4, 0, 0, 0, 0, 0, '', 'Patricia Egan - Only run SAI if invoker is player'),
+(22, 1, 33027, 0, 0, 31, 0, 4, 0, 0, 0, 0, 0, '', 'Jessica Sellers - Only run SAI if invoker is player'),
+(22, 1, 28727, 0, 0, 31, 0, 4, 0, 0, 0, 0, 0, '', 'Edward Egan - Only run SAI if invoker is player'),
+(22, 1, 28714, 0, 0, 31, 0, 4, 0, 0, 0, 0, 0, '', 'Ildine Sorrowspear - Only run SAI if invoker is player'),
+(22, 1, 28715, 0, 0, 31, 0, 4, 0, 0, 0, 0, 0, '', 'Endora Moorehead - Only run SAI if invoker is player'),
+(22, 1, 28726, 0, 0, 31, 0, 4, 0, 0, 0, 0, 0, '', 'Dominique Stefano - Only run SAI if invoker is player'),
+(22, 1, 29523, 0, 0, 31, 0, 4, 0, 0, 0, 0, 0, '', 'Bragund Brightlink - Only run SAI if invoker is player'),
+(22, 1, 28997, 0, 0, 31, 0, 4, 0, 0, 0, 0, 0, '', 'Griselda Hunderland - Only run SAI if invoker is player'),
+(22, 1, 28989, 0, 0, 31, 0, 4, 0, 0, 0, 0, 0, '', 'Aemara - Only run SAI if invoker is player'),
+(22, 1, 28723, 0, 0, 31, 0, 4, 0, 0, 0, 0, 0, '', 'Larana Drome - Only run SAI if invoker is player'),
+(22, 1, 28718, 0, 0, 31, 0, 4, 0, 0, 0, 0, 0, '', 'Ranid Glowergold - Only run SAI if invoker is player');
diff --git a/sql/updates/world/2015_02_05_00_world.sql b/sql/updates/world/2015_02_05_00_world.sql
new file mode 100644
index 00000000000..77bc4fd8b53
--- /dev/null
+++ b/sql/updates/world/2015_02_05_00_world.sql
@@ -0,0 +1,4 @@
+--
+DELETE FROM `skill_fishing_base_level` WHERE `entry`=4710;
+INSERT INTO `skill_fishing_base_level` (`entry`, `skill`) VALUES
+(4710, 480);
diff --git a/sql/updates/world/2015_02_06_00_world.sql b/sql/updates/world/2015_02_06_00_world.sql
new file mode 100644
index 00000000000..96eb6a65f28
--- /dev/null
+++ b/sql/updates/world/2015_02_06_00_world.sql
@@ -0,0 +1,27 @@
+-- The Brewmaiden SAI
+SET @ENTRY := 36021;
+
+UPDATE `creature_template` SET `AIName`='SmartAI' WHERE `entry`=@ENTRY;
+
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY*100 AND `source_type`=9;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,0,0,0,22,0,100,0,101,0,0,0,11,48249,1,0,0,0,0,7,0,0,0,0,0,0,0,'The Brewmaiden - Received Emote 101 - Cast ''Brewfest Brew Toss''');
+
+DELETE FROM `creature_template_addon` WHERE `entry`=@ENTRY;
+INSERT INTO `creature_template_addon` (`entry`,`bytes2`,`auras`) VALUES
+(@ENTRY,0x1,'68269');
+
+
+-- The Brewmaiden SAI
+SET @ENTRY := 27166;
+
+UPDATE `creature_template` SET `AIName`='SmartAI' WHERE `entry`=@ENTRY;
+
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,0,0,0,22,0,100,0,101,0,0,0,11,48249,1,0,0,0,0,7,0,0,0,0,0,0,0,'The Brewmaiden - Received Emote 101 - Cast ''Brewfest Brew Toss''');
+
+DELETE FROM `creature_template_addon` WHERE `entry`=@ENTRY;
+INSERT INTO `creature_template_addon` (`entry`,`bytes2`,`auras`) VALUES
+(@ENTRY,0x1,'51847');
diff --git a/sql/updates/world/2015_02_06_01_world.sql b/sql/updates/world/2015_02_06_01_world.sql
new file mode 100644
index 00000000000..3b16d7a367c
--- /dev/null
+++ b/sql/updates/world/2015_02_06_01_world.sql
@@ -0,0 +1,40 @@
+-- Fel Portal Alarm SAI
+SET @ENTRY := 23310;
+UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,0,0,0,11,0,100,1,0,0,0,0,11,46907,0,0,0,0,0,1,0,0,0,0,0,0,0,"Fel Portal Alarm - On Respawn - Cast 'Boss Fel Portal State' (No Repeat)"),
+(@ENTRY,0,1,0,38,0,100,0,1,1,0,0,23,1,0,0,0,0,0,1,0,0,0,0,0,0,0,"Fel Portal Alarm - On Data Set 1 1 - Increment Phase"),
+(@ENTRY,0,2,3,1,32,100,0,1000,1000,0,0,12,25003,5,120000,0,0,0,1,0,0,0,0,0,0,0,"Fel Portal Alarm - Out of Combat - Summon Creature 'Emissary of Hate' (Phase 32)"),
+(@ENTRY,0,3,0,61,32,100,0,1000,1000,0,0,22,0,0,0,0,0,0,1,0,0,0,0,0,0,0,"Fel Portal Alarm - Out of Combat - Set Event Phase 0 (Phase 32)");
+
+DELETE FROM `creature` WHERE `id`=25003;
+
+-- Irespeaker SAI
+SET @ENTRY := 24999;
+UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,0,0,0,0,0,100,0,1500,3000,10000,15000,11,35913,0,0,0,0,0,2,0,0,0,0,0,0,0,"Irespeaker - In Combat - Cast 'Fel Fireball'"),
+(@ENTRY,0,1,0,0,0,100,0,13000,16000,20000,35000,11,18267,0,0,0,0,0,2,0,0,0,0,0,0,0,"Irespeaker - In Combat - Cast 'Curse of Weakness'"),
+(@ENTRY,0,2,0,6,0,100,1,0,0,0,0,33,0,0,0,0,0,0,7,0,0,0,0,0,0,0,"Irespeaker - On Just Died - Quest Credit 'Kanrethad's Quest' (No Repeat)"),
+(@ENTRY,0,3,0,6,0,100,0,5000,5000,10000,10000,45,1,1,0,0,0,0,10,79450,23310,0,0,0,0,0,"Irespeaker - On Just Died - Set Data 1 1");
+
+-- Unleashed Hellion SAI
+SET @ENTRY := 25002;
+UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,0,0,0,6,0,100,1,0,0,0,0,33,0,0,0,0,0,0,7,0,0,0,0,0,0,0,"Unleashed Hellion - On Just Died - Quest Credit 'Kanrethad's Quest' (No Repeat)"),
+(@ENTRY,0,1,0,0,0,100,0,4000,5000,18000,35000,11,11876,0,0,0,0,0,2,0,0,0,0,0,0,0,"Unleashed Hellion - In Combat - Cast 'War Stomp'"),
+(@ENTRY,0,2,0,0,0,100,0,6000,9000,12600,16000,11,20754,0,0,0,0,0,2,0,0,0,0,0,0,0,"Unleashed Hellion - In Combat - Cast 'Rain of Fire'"),
+(@ENTRY,0,3,0,6,0,100,0,0,0,0,0,45,1,1,0,0,0,0,10,79450,23310,0,0,0,0,0,"Unleashed Hellion - On Just Died - Set Data 1 1");
+
+-- Emissary of Hate SAI
+SET @ENTRY := 25003;
+UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,0,0,0,0,0,100,0,2000,5000,15000,20000,11,25003,0,0,0,0,0,2,0,0,0,0,0,0,0,"Emissary of Hate - In Combat - Cast 'Mortar'"),
+(@ENTRY,0,1,0,0,0,100,0,8000,10000,15000,20000,11,38611,0,0,0,0,0,2,0,0,0,0,0,0,0,"Emissary of Hate - In Combat - Cast 'Flame Wave'"),
+(@ENTRY,0,2,0,54,0,100,0,0,0,0,0,89,10,0,0,0,0,0,1,0,0,0,0,0,0,0,"Emissary of Hate - On Just Summoned - Start Random Movement");
diff --git a/sql/updates/world/2015_02_06_02_world.sql b/sql/updates/world/2015_02_06_02_world.sql
new file mode 100644
index 00000000000..4c514ea95d4
--- /dev/null
+++ b/sql/updates/world/2015_02_06_02_world.sql
@@ -0,0 +1,33 @@
+-- Master Gadrin SAI
+SET @ENTRY := 3188;
+UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,0,0,0,20,0,100,0,808,0,0,0,80,@ENTRY*100+00,2,0,0,0,0,1,0,0,0,0,0,0,0,"Master Gadrin - On Quest 'Minshina's Skull' Finished - Run Script");
+
+-- Actionlist SAI
+SET @ENTRY := 318800;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=9;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,9,0,0,0,0,100,0,2000,2000,0,0,12,3289,5,14000,0,0,0,8,0,0,0,-822.91,-4923.33,19.6365,3.41642,"Master Gadrin - On Script - Summon Creature 'Spirit of Minshina'"),
+(@ENTRY,9,1,0,0,0,100,0,2000,2000,0,0,66,0,0,0,0,0,0,21,20,0,0,0,0,0,0,"Master Gadrin - On Script - Set Orientation Closest Player"),
+(@ENTRY,9,2,0,0,0,100,0,3000,3000,0,0,1,0,0,0,0,0,0,21,20,0,0,0,0,0,0,"Master Gadrin - On Script - Say Line 0");
+
+-- Spirit of Minshina SAI
+SET @ENTRY := 3289;
+UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,0,0,0,54,0,100,0,0,0,0,0,80,@ENTRY*100+00,2,0,0,0,0,1,0,0,0,0,0,0,0,"Spirit of Minshina - On Just Summoned - Run Script");
+
+-- Actionlist SAI
+SET @ENTRY := 328900;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=9;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,9,0,0,0,0,100,0,2000,2000,0,0,66,0,0,0,0,0,0,21,20,0,0,0,0,0,0,"Spirit of Minshina - On Script - Set Orientation Closest Player"),
+(@ENTRY,9,1,0,0,0,100,0,2000,2000,0,0,5,2,0,0,0,0,0,1,2000,2000,0,0,0,0,0,"Spirit of Minshina - On Script - Play Emote 2"),
+(@ENTRY,9,2,0,0,0,100,0,11000,11000,0,0,41,1,0,0,0,0,0,1,0,0,0,0,0,0,0,"Spirit of Minshina - On Script - Despawn Instant");
+
+DELETE FROM `creature_text` WHERE `entry`=3188;
+INSERT INTO `creature_text` (`entry`, `groupid`, `id`, `text`, `type`, `language`, `probability`, `emote`, `duration`, `sound`, `comment`, `BroadcastTextID`) VALUES
+(3188, 0, 0, 'I thank you, $n. And my brother thanks you.', 12, 0, 100, 0, 0, 0, 'Master Gadrin', 983);
diff --git a/sql/updates/world/2015_02_06_03_world.sql b/sql/updates/world/2015_02_06_03_world.sql
new file mode 100644
index 00000000000..83aedd75069
--- /dev/null
+++ b/sql/updates/world/2015_02_06_03_world.sql
@@ -0,0 +1,62 @@
+--
+DELETE FROM `waypoints` WHERE `entry`=16856;
+INSERT INTO `waypoints` (`entry`, `pointid`, `position_x`, `position_y`, `position_z`, `point_comment`) VALUES
+(16856, 1,-807.327,2739.82,115.447, 'Caretaker Dilandrus'),
+(16856, 2,-798.86,2719.21,111.628, 'Caretaker Dilandrus'),
+(16856, 3,-785.502,2706.21,107.293, 'Caretaker Dilandrus'),
+(16856, 4,-785.546,2702.16,106.208, 'Caretaker Dilandrus'),
+(16856, 5,-787.652,2700.58,105.792, 'Caretaker Dilandrus'),
+(16856, 6,-791.771,2694.26,104.589, 'Caretaker Dilandrus'),
+(16856, 7,-793.482,2693.76,104.592, 'Caretaker Dilandrus'),
+(16856, 8,-794.696,2691.44,104.35, 'Caretaker Dilandrus'),
+(16856, 9,-797.951,2691.02,104.535, 'Caretaker Dilandrus'),
+(16856, 10,-798.984,2693.63,104.891, 'Caretaker Dilandrus'),
+(16856, 11,-797.778,2697.53,105.43, 'Caretaker Dilandrus'),
+(16856, 12,-792.678,2705.64,106.948, 'Caretaker Dilandrus'),
+(16856, 13,-792.409,2708.46,107.754, 'Caretaker Dilandrus'),
+(16856, 14,-794.25,2710.38,108.384, 'Caretaker Dilandrus'),
+(16856, 15,-799.924,2706.66,107.387, 'Caretaker Dilandrus'),
+(16856, 16,-807.92,2692.9,104.856, 'Caretaker Dilandrus'),
+(16856, 17,-811.612,2690.9,104.36, 'Caretaker Dilandrus'),
+(16856, 18,-814.837,2692.26,104.736, 'Caretaker Dilandrus'),
+(16856, 19,-814.33,2696.03,105.773, 'Caretaker Dilandrus'),
+(16856, 20,-809.779,2704.45,107.63, 'Caretaker Dilandrus'),
+(16856, 21,-801.425,2715.06,109.679, 'Caretaker Dilandrus'),
+(16856, 22,-801.359,2718.11,110.676, 'Caretaker Dilandrus'),
+(16856, 23,-804.433,2720.69,111.13, 'Caretaker Dilandrus'),
+(16856, 24,-810.324,2717.67,110.329, 'Caretaker Dilandrus'),
+(16856, 25,-814.433,2712.14,109.487, 'Caretaker Dilandrus'),
+(16856, 26,-820.17,2701.35,107.506, 'Caretaker Dilandrus'),
+(16856, 27,-823.067,2699.77,107.458, 'Caretaker Dilandrus'),
+(16856, 28,-824.921,2701.38,107.939, 'Caretaker Dilandrus'),
+(16856, 29,-824.739,2706.05,108.591, 'Caretaker Dilandrus'),
+(16856, 30,-820.185,2714.8,110.056, 'Caretaker Dilandrus'),
+(16856, 31,-814.476,2725.61,111.567, 'Caretaker Dilandrus'),
+(16856, 32,-807.327,2739.82,115.447, 'Caretaker Dilandrus'),
+(16856, 33,-807.327,2739.82,115.447, 'Caretaker Dilandrus');
+
+UPDATE `creature` SET `position_x`=-807.327, `position_y`=2739.82, `position_z`=115.447, `orientation`=2.611, `MovementType`=2 WHERE `guid`=58021;
+
+-- Caretaker Dilandrus SAI
+SET @ENTRY := 16856;
+UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,0,0,0,25,0,100,0,0,0,0,0,53,0,16856,1,0,0,0,1,0,0,0,0,0,0,0,"Caretaker Dilandrus - On Reset - Start Waypoint"),
+(@ENTRY,0,1,0,40,0,100,0,5,16856,0,0,80,@ENTRY*100+01,2,0,0,0,0,1,0,0,0,0,0,0,0,"Caretaker Dilandrus - On Waypoint 5 Reached - Run Script"),
+(@ENTRY,0,2,0,40,0,100,0,7,16856,0,0,80,@ENTRY*100+01,2,0,0,0,0,1,0,0,0,0,0,0,0,"Caretaker Dilandrus - On Waypoint 7 Reached - Run Script"),
+(@ENTRY,0,3,0,40,0,100,0,11,16856,0,0,80,@ENTRY*100+01,2,0,0,0,0,1,0,0,0,0,0,0,0,"Caretaker Dilandrus - On Waypoint 11 Reached - Run Script"),
+(@ENTRY,0,4,0,40,0,100,0,15,16856,0,0,80,@ENTRY*100+01,2,0,0,0,0,1,0,0,0,0,0,0,0,"Caretaker Dilandrus - On Waypoint 15 Reached - Run Script"),
+(@ENTRY,0,5,0,40,0,100,0,20,16856,0,0,80,@ENTRY*100+01,2,0,0,0,0,1,0,0,0,0,0,0,0,"Caretaker Dilandrus - On Waypoint 20 Reached - Run Script"),
+(@ENTRY,0,6,0,40,0,100,0,24,16856,0,0,80,@ENTRY*100+01,2,0,0,0,0,1,0,0,0,0,0,0,0,"Caretaker Dilandrus - On Waypoint 24 Reached - Run Script"),
+(@ENTRY,0,7,0,40,0,100,0,30,16856,0,0,80,@ENTRY*100+01,2,0,0,0,0,1,0,0,0,0,0,0,0,"Caretaker Dilandrus - On Waypoint 30 Reached - Run Script"),
+(@ENTRY,0,8,0,40,0,100,0,33,16856,0,0,54,300000,0,0,0,0,0,1,0,0,0,0,0,0,0,"Caretaker Dilandrus - On Waypoint 33 Reached - Pause Waypoint");
+
+-- Actionlist SAI
+SET @ENTRY := 1685601;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=9;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,9,0,0,0,0,100,0,0,0,0,0,54,10000,0,0,0,0,0,1,0,0,0,0,0,0,0,"Caretaker Dilandrus - On Script - Pause Waypoint"),
+(@ENTRY,9,1,0,0,0,100,0,0,0,0,0,66,0,0,0,0,0,0,1,0,0,0,0,0,0,2.75976,"Caretaker Dilandrus - On Script - Set Orientation Home Position"),
+(@ENTRY,9,2,0,0,0,100,0,3000,3000,0,0,5,66,0,0,0,0,0,1,0,0,0,0,0,0,0,"Caretaker Dilandrus - On Script - Play Emote 66"),
+(@ENTRY,9,3,0,0,0,100,0,3000,3000,0,0,5,68,0,0,0,0,0,0,0,0,0,0,0,0,0,"Caretaker Dilandrus - On Script - Play Emote 68");
diff --git a/sql/updates/world/2015_02_06_04_world.sql b/sql/updates/world/2015_02_06_04_world.sql
new file mode 100644
index 00000000000..1a4484df5a3
--- /dev/null
+++ b/sql/updates/world/2015_02_06_04_world.sql
@@ -0,0 +1,32 @@
+-- Areatrigger SAI
+SET @ENTRY := 1447;
+DELETE FROM `areatrigger_scripts` WHERE `entry`=@ENTRY;
+INSERT INTO `areatrigger_scripts` (`entry`,`ScriptName`) VALUES (@ENTRY,"SmartTrigger");
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=2;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,2,0,0,46,0,100,0,0,0,0,0,45,1,1,0,0,0,0,10,81519,8127,0,0,0,0,0,"Areatrigger - On Trigger - Set Data 1 1");
+
+-- Antu'sul SAI
+SET @ENTRY := 8127;
+UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,0,0,1,0,0,50,2,11600,11600,13300,21700,11,8376,0,0,0,0,0,1,0,0,0,0,0,0,0,"Antu'sul - In Combat - Cast 'Earthgrab Totem' (Normal Dungeon)"),
+(@ENTRY,0,1,0,61,0,50,3,11600,11600,13300,21700,11,11899,0,0,0,0,0,1,0,0,0,0,0,0,0,"Antu'sul - In Combat - Cast 'Healing Ward' (Normal Dungeon)"),
+(@ENTRY,0,2,6,4,0,100,3,0,0,0,0,11,11894,0,0,0,0,0,1,0,0,0,0,0,0,0,"Antu'sul - On Aggro - Cast 'Antu'sul's Minion' (No Repeat) (Normal Dungeon)"),
+(@ENTRY,0,3,0,2,0,100,3,0,20,0,0,11,11895,0,0,0,0,0,1,0,0,0,0,0,0,0,"Antu'sul - Between 0-20% Health - Cast 'Healing Wave of Antu'sul' (No Repeat) (Normal Dungeon)"),
+(@ENTRY,0,4,5,2,0,100,3,0,25,0,0,11,11894,0,0,0,0,0,1,0,0,0,0,0,0,0,"Antu'sul - Between 0-25% Health - Cast 'Antu'sul's Minion' (No Repeat) (Normal Dungeon)"),
+(@ENTRY,0,5,0,61,0,100,3,0,25,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,"Antu'sul - Between 0-25% Health - Say Line 0 (No Repeat) (Normal Dungeon)"),
+(@ENTRY,0,6,0,61,0,100,3,0,0,0,0,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,"Antu'sul - On Aggro - Say Line 1 (No Repeat) (Normal Dungeon)"),
+(@ENTRY,0,7,8,2,0,100,3,0,75,0,0,11,11894,0,0,0,0,0,1,0,0,0,0,0,0,0,"Antu'sul - Between 0-75% Health - Cast 'Antu'sul's Minion' (No Repeat) (Normal Dungeon)"),
+(@ENTRY,0,8,0,61,0,100,3,0,75,0,0,1,2,0,0,0,0,0,1,0,0,0,0,0,0,0,"Antu'sul - Between 0-75% Health - Say Line 2 (No Repeat) (Normal Dungeon)"),
+(@ENTRY,0,9,0,0,0,100,2,5000,5000,12000,14000,11,16006,0,0,0,0,0,5,0,0,0,0,0,0,0,"Antu'sul - In Combat - Cast 'Chain Lightning' (Normal Dungeon)"),
+(@ENTRY,0,10,0,0,0,100,2,3000,3000,9000,11000,11,15501,0,0,0,0,0,2,0,0,0,0,0,0,0,"Antu'sul - In Combat - Cast 'Earth Shock' (Normal Dungeon)"),
+(@ENTRY,0,11,0,38,0,100,0,1,1,0,0,49,0,0,0,0,0,0,21,100,0,0,0,0,0,0,"Antu'sul - On Data Set 1 1 - Start Attacking");
+
+SET @ENTRY := 8127;
+DELETE FROM `creature_text` WHERE `entry`=@ENTRY;
+INSERT INTO `creature_text` (`entry`, `groupid`, `id`, `text`, `type`, `language`, `probability`, `emote`, `duration`, `sound`, `BroadcastTextId`, `TextRange`, `comment`) VALUES
+(@ENTRY,0,0, 'The children of Sul will protect their master. Rise once more Sul\'lithuz!',14,0,100,0,0,0, 4178, 0, 'Antu\'sul'),
+(@ENTRY,1,0, 'Lunch has arrived, my beautiful children. Tear them to pieces!',14,0,100,0,0,0, 4166, 0, 'Antu\'sul'),
+(@ENTRY,2,0, 'Rise and defend your master!',14,0,100,0,0,0, 4177, 0, 'Antu\'sul');
diff --git a/sql/updates/world/2015_02_06_05_world.sql b/sql/updates/world/2015_02_06_05_world.sql
new file mode 100644
index 00000000000..bd04efd9c66
--- /dev/null
+++ b/sql/updates/world/2015_02_06_05_world.sql
@@ -0,0 +1,45 @@
+-- Commander Hogarth SAI
+SET @ENTRY := 19937;
+UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,0,0,0,11,0,100,1,0,0,0,0,11,33900,0,0,0,0,0,1,0,0,0,0,0,0,0,"Commander Hogarth - On Respawn - Cast 'Shroud of Death' (No Repeat)"),
+(@ENTRY,0,1,2,20,0,100,0,10258,0,0,0,12,20117,6,0,0,0,0,8,0,0,0,-1186.95,2608.81,27.702,5.38523,"Commander Hogarth - On Quest 'Honor the Fallen' Finished - Summon Creature 'Vengeful Unyielding Knight'"),
+(@ENTRY,0,2,3,61,0,100,0,10258,0,0,0,12,19863,6,0,0,0,0,8,0,0,0,-1192.14,2602.7,29.2625,0.0820243,"Commander Hogarth - On Quest 'Honor the Fallen' Finished - Summon Creature 'Vengeful Unyielding'"),
+(@ENTRY,0,3,4,61,0,100,0,10258,0,0,0,12,20117,6,0,0,0,0,8,0,0,0,-1181.95,2611.13,27.3004,4.61566,"Commander Hogarth - On Quest 'Honor the Fallen' Finished - Summon Creature 'Vengeful Unyielding Knight'"),
+(@ENTRY,0,4,5,61,0,100,0,10258,0,0,0,12,19863,6,0,0,0,0,8,0,0,0,-1183.65,2603.66,29.4927,6.09219,"Commander Hogarth - On Quest 'Honor the Fallen' Finished - Summon Creature 'Vengeful Unyielding'"),
+(@ENTRY,0,5,6,61,0,100,0,10258,0,0,0,12,19863,6,0,0,0,0,8,0,0,0,-1184.48,2609.26,27.7192,5.01103,"Commander Hogarth - On Quest 'Honor the Fallen' Finished - Summon Creature 'Vengeful Unyielding'"),
+(@ENTRY,0,6,7,61,0,100,0,10258,0,0,0,12,19863,6,0,0,0,0,8,0,0,0,-1175.39,2607.4,28.853,3.63473,"Commander Hogarth - On Quest 'Honor the Fallen' Finished - Summon Creature 'Vengeful Unyielding'"),
+(@ENTRY,0,7,8,61,0,100,0,10258,0,0,0,12,19863,6,0,0,0,0,8,0,0,0,-1178.36,2609.96,27.8814,4.12375,"Commander Hogarth - On Quest 'Honor the Fallen' Finished - Summon Creature 'Vengeful Unyielding'"),
+(@ENTRY,0,8,9,61,0,100,0,10258,0,0,0,12,19863,6,0,0,0,0,8,0,0,0,-1182.51,2608.35,28.1201,4.67383,"Commander Hogarth - On Quest 'Honor the Fallen' Finished - Summon Creature 'Vengeful Unyielding'"),
+(@ENTRY,0,9,10,61,0,100,0,10258,0,0,0,12,19863,6,0,0,0,0,8,0,0,0,-1189.12,2601.88,29.6988,0.242659,"Commander Hogarth - On Quest 'Honor the Fallen' Finished - Summon Creature 'Vengeful Unyielding'"),
+(@ENTRY,0,10,11,61,0,100,0,10258,0,0,0,12,19863,6,0,0,0,0,8,0,0,0,-1179.46,2606.03,29.0216,3.81031,"Commander Hogarth - On Quest 'Honor the Fallen' Finished - Summon Creature 'Vengeful Unyielding'"),
+(@ENTRY,0,11,12,61,0,100,0,10258,0,0,0,12,19863,6,0,0,0,0,8,0,0,0,-1180.6,2598.15,35.2317,1.94692,"Commander Hogarth - On Quest 'Honor the Fallen' Finished - Summon Creature 'Vengeful Unyielding'"),
+(@ENTRY,0,12,13,61,0,100,0,10258,0,0,0,12,20117,6,0,0,0,0,8,0,0,0,-1190.87,2607.06,27.9991,5.86898,"Commander Hogarth - On Quest 'Honor the Fallen' Finished - Summon Creature 'Vengeful Unyielding Knight'"),
+(@ENTRY,0,13,14,61,0,100,0,10258,0,0,0,12,19863,6,0,0,0,0,8,0,0,0,-1179.81,2603.43,29.8027,3.12637,"Commander Hogarth - On Quest 'Honor the Fallen' Finished - Summon Creature 'Vengeful Unyielding'"),
+(@ENTRY,0,14,15,61,0,100,0,10258,0,0,0,12,19863,6,0,0,0,0,8,0,0,0,-1184.47,2606.9,28.4442,5.18881,"Commander Hogarth - On Quest 'Honor the Fallen' Finished - Summon Creature 'Vengeful Unyielding'"),
+(@ENTRY,0,15,16,61,0,100,0,10258,0,0,0,12,19863,6,0,0,0,0,8,0,0,0,-1186.63,2605.58,28.7169,5.79079,"Commander Hogarth - On Quest 'Honor the Fallen' Finished - Summon Creature 'Vengeful Unyielding'"),
+(@ENTRY,0,16,17,61,0,100,0,10258,0,0,0,12,19863,6,0,0,0,0,8,0,0,0,-1189.03,2604.6,28.8694,6.10697,"Commander Hogarth - On Quest 'Honor the Fallen' Finished - Summon Creature 'Vengeful Unyielding'"),
+(@ENTRY,0,17,18,61,0,100,0,10258,0,0,0,12,19863,6,0,0,0,0,8,0,0,0,-1185.68,2603.39,29.4476,5.18881,"Commander Hogarth - On Quest 'Honor the Fallen' Finished - Summon Creature 'Vengeful Unyielding'"),
+(@ENTRY,0,18,0,61,0,100,0,10258,0,0,0,12,19863,6,0,0,0,0,8,0,0,0,-1181.97,2605.76,28.9476,4.40683,"Commander Hogarth - On Quest 'Honor the Fallen' Finished - Summon Creature 'Vengeful Unyielding'");
+
+DELETE FROM `creature_template_addon` WHERE `entry` IN (20117, 19863);
+INSERT INTO `creature_template_addon` (`entry`, `path_id`, `mount`, `bytes1`, `bytes2`, `emote`, `auras`) VALUES
+(20117, 0, 0, 0, 0, 0, '33900'),
+(19863, 0, 0, 0, 0, 0, '33900');
+
+-- Vengeful Unyielding Knight SAI
+SET @ENTRY := 20117;
+UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,0,0,0,54,0,100,0,0,0,0,0,41,15000,0,0,0,0,0,1,0,0,0,0,0,0,0,"Vengeful Unyielding Knight - On Just Summoned - Despawn In 15000 ms"),
+(@ENTRY,0,1,0,54,0,100,0,0,0,0,0,5,2,0,0,0,0,0,1,0,0,0,0,0,0,0,"Vengeful Unyielding Knight - On Just Summoned - Play Emote 2");
+
+-- Vengeful Unyielding SAI
+SET @ENTRY := 19863;
+UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,0,0,0,54,0,100,0,0,0,0,0,41,15000,0,0,0,0,0,1,0,0,0,0,0,0,0,"Vengeful Unyielding - On Just Summoned - Despawn In 15000 ms"),
+(@ENTRY,0,1,0,54,0,100,0,0,0,0,0,5,2,0,0,0,0,0,1,0,0,0,0,0,0,0,"Vengeful Unyielding - On Just Summoned - Play Emote 2");
diff --git a/sql/updates/world/2015_02_06_06_world.sql b/sql/updates/world/2015_02_06_06_world.sql
new file mode 100644
index 00000000000..0d7b75a72cc
--- /dev/null
+++ b/sql/updates/world/2015_02_06_06_world.sql
@@ -0,0 +1,2 @@
+--
+UPDATE `creature_questender` SET `id` =38017 WHERE `quest` =24880;
diff --git a/sql/updates/world/2015_02_06_07_world.sql b/sql/updates/world/2015_02_06_07_world.sql
new file mode 100644
index 00000000000..ab3eb6ae454
--- /dev/null
+++ b/sql/updates/world/2015_02_06_07_world.sql
@@ -0,0 +1,6 @@
+-- Tiny Snowman SAI
+SET @ENTRY := 15710;
+UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,0,0,0,22,0,100,0,34,0,0,0,5,94,0,0,0,0,0,1,0,0,0,0,0,0,0,"Tiny Snowman - Received Emote 34 - Play Emote 94");
diff --git a/sql/updates/world/2015_02_06_08_world.sql b/sql/updates/world/2015_02_06_08_world.sql
new file mode 100644
index 00000000000..e05c5e15c8e
--- /dev/null
+++ b/sql/updates/world/2015_02_06_08_world.sql
@@ -0,0 +1,4 @@
+--
+DELETE FROM `smart_scripts` WHERE `entryorguid`=20206 AND `source_type`=0;
+INSERT INTO `smart_scripts` (`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`, `comment`) VALUES
+(20206, 0, 0, 0, 20, 0, 100, 0, 10919, 0, 0, 0, 53, 0, 20206, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Fei Fei - On Quest \'Fei Fei\'s Treat\' Finished - Start Waypoint (Phase 1) (No Repeat)');
diff --git a/sql/updates/world/2015_02_06_09_world.sql b/sql/updates/world/2015_02_06_09_world.sql
new file mode 100644
index 00000000000..94696444dd4
--- /dev/null
+++ b/sql/updates/world/2015_02_06_09_world.sql
@@ -0,0 +1,11 @@
+--
+UPDATE `creature_template` SET `AIName`='SmartAI' WHERE `entry` IN (4131, 4133);
+DELETE FROM `smart_scripts` WHERE `entryorguid`=4131 AND `source_type`=0;
+INSERT INTO `smart_scripts` (`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`, `comment`) VALUES
+(4131, 0, 0, 0, 0, 0, 100, 1, 4000, 7000, 22000, 25000, 11, 6016, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 'Silithid Invader - IC - Cast Pierce Armor'),
+(4131, 0, 1, 0, 0, 0, 100, 1, 10000, 16000, 0, 0, 11, 8137, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 'Silithid Invader - IC - Cast Pierce Armor'),
+(4131, 0, 2, 0, 2, 0, 100, 1, 0, 15, 0, 0, 39, 20, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Silithid Invader - on hp below 15 % - call for help');
+
+DELETE FROM `smart_scripts` WHERE `entryorguid`=4133 AND `source_type`=0;
+INSERT INTO `smart_scripts` (`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`, `comment`) VALUES
+(4133, 0, 2, 0, 2, 0, 100, 1, 0, 15, 0, 0, 39, 20, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Silithid Hive Drone - on hp below 15 % - call for help');
diff --git a/sql/updates/world/2015_02_06_10_world.sql b/sql/updates/world/2015_02_06_10_world.sql
new file mode 100644
index 00000000000..428a0c7e8ca
--- /dev/null
+++ b/sql/updates/world/2015_02_06_10_world.sql
@@ -0,0 +1,2 @@
+--
+UPDATE creature_template SET mechanic_immune_mask = mechanic_immune_mask | 0x20 WHERE entry = 31464;
diff --git a/sql/updates/world/2015_02_06_11_world.sql b/sql/updates/world/2015_02_06_11_world.sql
new file mode 100644
index 00000000000..5a385218931
--- /dev/null
+++ b/sql/updates/world/2015_02_06_11_world.sql
@@ -0,0 +1,7 @@
+--
+DELETE FROM `disables` WHERE `entry` IN (649,650) AND `sourceType` = 7;
+DELETE FROM `disables` WHERE `entry` = 650 AND `sourceType` = 2;
+INSERT INTO `disables` (`sourceType`, `entry`, `flags`, `params_0`, `params_1`, `comment`) VALUES
+(7, 649, 0, '', '', 'Disable mmaps - Trial of the Crusader'),
+(7, 650, 0, '', '', 'Disable mmaps - Trial of the Champion'),
+(2, 650, 3, '', '', 'Disable Trial of the Champion, broken instance');
diff --git a/sql/updates/world/2015_02_06_12_world.sql b/sql/updates/world/2015_02_06_12_world.sql
new file mode 100644
index 00000000000..f6a95a7c010
--- /dev/null
+++ b/sql/updates/world/2015_02_06_12_world.sql
@@ -0,0 +1,2 @@
+--
+UPDATE `gameobject_template` SET `flags`=32 WHERE `entry` IN (175611,175612,175613,175614);
diff --git a/sql/updates/world/2015_02_06_13_world_335.sql b/sql/updates/world/2015_02_06_13_world_335.sql
new file mode 100644
index 00000000000..8cd8df2147e
--- /dev/null
+++ b/sql/updates/world/2015_02_06_13_world_335.sql
@@ -0,0 +1,372 @@
+UPDATE `locales_item` SET `description_loc6` = '', `description_loc7` = '' WHERE `entry` IN (42469, 42734, 42739, 42740, 42747, 42750, 43357, 43420, 43426, 43429);
+UPDATE `locales_item` SET `description_loc7` = `description_loc6` WHERE `entry` IN (40142, 40143, 40144, 40145, 40146, 40147, 40149, 40150, 40152, 40154, 40155, 40156, 40158, 40159, 40160, 40161, 40163);
+
+CREATE TEMPORARY TABLE `locales_update` (
+ `entry` mediumint(8) unsigned NOT NULL DEFAULT '0',
+ `name_loc6` varchar(100) NOT NULL DEFAULT '',
+ `name_loc7` varchar(100) NOT NULL DEFAULT '',
+ `description_loc6` varchar(255) DEFAULT NULL,
+ `description_loc7` varchar(255) DEFAULT NULL,
+ PRIMARY KEY (`entry`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+
+INSERT INTO `locales_update` (`entry`, `name_loc6`, `name_loc7`, `description_loc6`, `description_loc7`) VALUES
+ (40143, 'Ametrino con grabados', 'Ametrino con grabados', 'Encaja en una ranura de color rojo o amarillo.', 'Encaja en una ranura de color rojo o amarillo.'),
+ (40148, 'Ametrino destellante', 'Ametrino destellante', 'Encaja en una ranura de color rojo o amarillo.', 'Encaja en una ranura de color rojo o amarillo.'),
+ (40151, 'Ametrino luminoso', 'Ametrino luminoso', 'Encaja en una ranura de color rojo o amarillo.', 'Encaja en una ranura de color rojo o amarillo.'),
+ (40153, 'Ametrino velado', 'Ametrino velado', 'Encaja en una ranura de color rojo o amarillo.', 'Encaja en una ranura de color rojo o amarillo.'),
+ (40157, 'Ametrino prístino', 'Ametrino prístino', 'Encaja en una ranura de color rojo o amarillo.', 'Encaja en una ranura de color rojo o amarillo.'),
+ (40162, 'Ametrino de precisión', 'Ametrino de precisión', 'Encaja en una ranura de color rojo o amarillo.', 'Encaja en una ranura de color rojo o amarillo.'),
+ (46947, 'Boceto: ametrino luminoso', 'Boceto: ametrino luminoso', 'Te enseña a tallar un ametrino luminoso.', 'Te enseña a tallar un ametrino luminoso.'),
+ (46951, 'Boceto: ametrino velado', 'Boceto: ametrino velado', 'Te enseña a tallar un ametrino velado.', 'Te enseña a tallar un ametrino velado.'),
+ (46953, 'Boceto: ametrino con grabados', 'Boceto: ametrino con grabados', 'Te enseña a tallar un ametrino con grabados.', ' Te enseña a tallar un ametrino con grabados.'),
+ (46956, 'Boceto: ametrino prístino', 'Boceto: ametrino prístino', 'Te enseña a tallar un ametrino prístino.', ' Te enseña a tallar un ametrino prístino.'),
+ (47008, 'Boceto: ametrino destellante', 'Boceto: ametrino destellante', 'Te enseña a tallar un ametrino destellante.', ' Te enseña a tallar un ametrino destellante.'),
+ (47010, 'Boceto: ametrino de precisión', 'Boceto: ametrino de precisión', 'Te enseña a tallar un ametrino de precisión.', ' Te enseña a tallar un ametrino de precisión.'),
+ (46900, 'Boceto: ojo de Zul deslumbrante', 'Boceto: ojo de Zul deslumbrante', 'Te enseña a tallar un ojo de Zul deslumbrante.', 'Te enseña a tallar un ojo de Zul deslumbrante.'),
+ (46902, 'Boceto: ojo de Zul intemporal', 'Boceto: ojo de Zul intemporal', 'Te enseña a tallar un ojo de Zul intemporal.', 'Te enseña a tallar un ojo de Zul intemporal.'),
+ (46903, 'Boceto: ojo de Zul vidente', 'Boceto: ojo de Zul vidente', 'Te enseña a tallar un ojo de Zul vidente.', 'Te enseña a tallar un ojo de Zul vidente.'),
+ (41101,'Glifo de Escudo de vengador','Glifo de Escudo de vengador','',''),
+ (41107,'Glifo de Cólera vengativa','Glifo de Cólera vengativa','',''),
+ (45743,'Glifo de Tormenta divina','Glifo de Tormenta divina','',''),
+ (41105,'Glifo de Destello de Luz','Glifo de Destello de Luz','',''),
+ (41106,'Glifo de Luz Sagrada','Glifo de Luz Sagrada','',''),
+ (41100,'Glifo de Defensa recta','Glifo de Defensa recta','',''),
+ (41094,'Glifo de Sello de orden','Glifo de Sello de orden','',''),
+ (41110,'Glifo de Sello de Luz','Glifo de Sello de Luz','',''),
+ (43868,'Glifo de Sello de rectitud','Glifo de Sello de rectitud','',''),
+ (43869,'Glifo de Sello de venganza','Glifo de Sello de venganza','',''),
+ (41109,'Glifo de Sello de sabiduría','Glifo de Sello de sabiduría','',''),
+ (45744,'Glifo de Escudo de rectitud','Glifo de Escudo de rectitud','',''),
+ (45760,'Glifo de Supresión de dolor','Glifo de Supresión de dolor','',''),
+ (42407,'Glifo de sombra','Glifo de sombra','',''),
+ (42417,'Glifo de Espíritu redentor','Glifo de Espíritu redentor','',''),
+ (42965,'Glifo de Golpe fantasmal','Glifo de Golpe fantasmal','',''),
+ (45761,'Glifo de Hambre de sangre','Glifo de Hambre de sangre','',''),
+ (42971,'Glifo de vigor','Glifo de vigor','',''),
+ (43380,'Glifo de Esfumarse','Glifo de Esfumarse','',''),
+ (48720,'Glifo de Zarpa','Glifo de Zarpa','',''),
+ (40899,'Glifo de Bramido','Glifo de Bramido','',''),
+ (46372,'Glifo de Instintos de supervivencia','Glifo de Instintos de supervivencia','',''),
+ (50125,'Glifo de Rejuvenecimiento rápido','Glifo de Rejuvenecimiento rápido','',''),
+ (40903,'Glifo de Arañazo','Glifo de Arañazo','',''),
+ (45603,'Glifo de Nutrir','Glifo de Nutrir','',''),
+ (43335,'Glifo de lo Salvaje','Glifo de lo Salvaje','',''),
+ (42899,'Glifo de la bestia','Glifo de la bestia','',''),
+ (42901,'Glifo de Aspecto de la víbora','Glifo de Aspecto de la víbora','',''),
+ (45733,'Glifo de Trampa explosiva','Glifo de Trampa explosiva','',''),
+ (42906,'Glifo de Trampa de Escarcha','Glifo de Trampa de Escarcha','',''),
+ (42907,'Glifo de Marca del cazador','Glifo de Marca del cazador','',''),
+ (42909,'Glifo de halcón','Glifo de halcón','',''),
+ (42910,'Glifo de Multidisparo','Glifo de Multidisparo','',''),
+ (42915,'Glifo de Aura de disparo certero','Glifo de Aura de disparo certero','',''),
+ (42916,'Glifo de Salva','Glifo de Salva','',''),
+ (43350,'Glifo de Aliviar mascota','Glifo de Aliviar mascota','',''),
+ (43354,'Glifo de fuerza poseída','Glifo de fuerza poseída','',''),
+ (43355,'Glifo de la manada','Glifo de la manada','',''),
+ (42734,'Glifo de Deflagración Arcana','Glifo de Deflagración Arcana','',''),
+ (50045,'Glifo de Agua eterna','Glifo de Agua eterna','',''),
+ (42740,'Glifo de Explosión de Fuego','Glifo de Explosión de Fuego','',''),
+ (42743,'Glifo de Armadura de hielo','Glifo de Armadura de hielo','',''),
+ (42747,'Glifo de Agostar','Glifo de Agostar','',''),
+ (45737,'Glifo de Bomba viva','Glifo de Bomba viva','',''),
+ (42750,'Glifo de Gema de maná','Glifo de Gema de maná','',''),
+ (42753,'Glifo de Eliminar maldición','Glifo de Eliminar maldición','',''),
+ (42754,'Glifo de Elemental de agua','Glifo de Elemental de agua','',''),
+ (43339,'Glifo de Intelecto Arcano','Glifo de Intelecto Arcano','',''),
+ (43357,'Glifo de Resguardo contra el Fuego','Glifo de Resguardo contra el Fuego','',''),
+ (43359,'Glifo de Armadura de Escarcha','Glifo de Armadura de Escarcha','',''),
+ (43360,'Glifo de Resguardo contra la Escarcha','Glifo de Resguardo contra la Escarcha','',''),
+ (41096,'Glifo de Protección divina','Glifo de Protección divina','',''),
+ (43366,'Glifo de Bendición de sabiduría','Glifo de Bendición de sabiduría','',''),
+ (43368,'Glifo de Captar no-muertos','Glifo de Captar no-muertos','',''),
+ (43369,'Glifo del Sabio','Glifo del Sabio','',''),
+ (45758,'Glifo de Himno de esperanza','Glifo de Himno de esperanza','',''),
+ (42405,'Glifo de Control mental','Glifo de Control mental','',''),
+ (45757,'Glifo de Abrasamiento mental','Glifo de Abrasamiento mental','',''),
+ (41541,'Glifo de Maestría en Agua','Glifo de Maestría en Agua','',''),
+ (45776,'Glifo de Tótem de cólera','Glifo de Tótem de cólera','',''),
+ (41538,'Glifo de Tótem Marea de maná','Glifo de Tótem Marea de maná','',''),
+ (41535,'Glifo de Ola de sanación inferior','Glifo de Ola de sanación inferior','',''),
+ (41524,'Glifo de Lava','Glifo de Lava','',''),
+ (43386,'Glifo de Escudo de agua','Glifo de Escudo de agua','',''),
+ (42456,'Glifo de Maldición de agonía','Glifo de Maldición de agonía','',''),
+ (50077,'Glifo de descomposición presurosa','Glifo de descomposición presurosa','',''),
+ (42466,'Glifo de Dolor abrasador','Glifo de Dolor abrasador','',''),
+ (42469,'Glifo de Succionar vida','Glifo de Succionar vida','',''),
+ (43394,'Glifo de almas','Glifo de almas','',''),
+ (43391,'Glifo de Kilrogg','Glifo de Kilrogg','',''),
+ (43420,'Glifo de insultos barbáricos','Glifo de insultos barbáricos','',''),
+ (43425,'Glifo de Bloqueo','Glifo de Bloqueo','',''),
+ (43412,'Glifo de Sed de sangre','Glifo de Sed de sangre','',''),
+ (45794,'Glifo de Regeneración iracunda','Glifo de Regeneración iracunda','',''),
+ (43416,'Glifo de Ejecutar','Glifo de Ejecutar','',''),
+ (43417,'Glifo de Seccionar','Glifo de Seccionar','',''),
+ (43418,'Glifo de Golpe heroico','Glifo de Golpe heroico','',''),
+ (43426,'Glifo de Última carga','Glifo de Última carga','',''),
+ (43423,'Glifo de Desgarrar','Glifo de Desgarrar','',''),
+ (43429,'Glifo de Provocar','Glifo de Provocar','',''),
+ (45793,'Glifo de Vigilancia','Glifo de Vigilancia','',''),
+ (43432,'Glifo de Torbellino','Glifo de Torbellino','',''),
+ (43398,'Glifo de Falsa arremetida','Glifo de Falsa arremetida','',''),
+ (49084,'Glifo de orden','Glifo de orden','',''),
+ (43397,'Glifo de Cargar','Glifo de Cargar','',''),
+ (43396,'Glifo de Ira rabiosa','Glifo de Ira rabiosa','',''),
+ (40114,'Rubí cárdeno brillante','Rubí cárdeno brillante','Encaja en una ranura de color rojo.','Encaja en una ranura de color rojo.'),
+ (40117,'Rubí cárdeno fracturado','Rubí cárdeno fracturado','Encaja en una ranura de color rojo.','Encaja en una ranura de color rojo.'),
+ (40113,'Rubí cárdeno rúnico','Rubí cárdeno rúnico','Encaja en una ranura de color rojo.','Encaja en una ranura de color rojo.'),
+ (40115,'Rubí cárdeno sutil','Rubí cárdeno sutil','Encaja en una ranura de color rojo.','Encaja en una ranura de color rojo.'),
+ (32197,'Espinela carmesí brillante','Espinela carmesí brillante','Encaja en una ranura de color rojo.','Encaja en una ranura de color rojo.'),
+ (32196,'Espinela carmesí rúnica','Espinela carmesí rúnica','Encaja en una ranura de color rojo.','Encaja en una ranura de color rojo.'),
+ (32198,'Espinela carmesí sutil','Espinela carmesí sutil','Encaja en una ranura de color rojo.','Encaja en una ranura de color rojo.'),
+ (32195,'Lágrima de espinela carmesí','Lágrima de espinela carmesí','Encaja en una ranura de color rojo.','Encaja en una ranura de color rojo.'),
+ (39999,'Rubí escarlata brillante','Rubí escarlata brillante','Encaja en una ranura de color rojo.','Encaja en una ranura de color rojo.'),
+ (40002,'Rubí escarlata fracturado','Rubí escarlata fracturado','Encaja en una ranura de color rojo.','Encaja en una ranura de color rojo.'),
+ (39998,'Rubí escarlata rúnico','Rubí escarlata rúnico','Encaja en una ranura de color rojo.','Encaja en una ranura de color rojo.'),
+ (24031,'Rubí vivo brillante','Rubí vivo brillante','Encaja en una ranura de color rojo.','Encaja en una ranura de color rojo.'),
+ (24030,'Rubí vivo rúnico','Rubí vivo rúnico','Encaja en una ranura de color rojo.','Encaja en una ranura de color rojo.'),
+ (24032,'Rubí vivo sutil','Rubí vivo sutil','Encaja en una ranura de color rojo.','Encaja en una ranura de color rojo.'),
+ (24029,'Lágrima de rubí vivo','Lágrima de rubí vivo','Encaja en una ranura de color rojo.','Encaja en una ranura de color rojo.'),
+ (39907,'Sangrita sutil','Sangrita sutil','Encaja en una ranura de color rojo.','Encaja en una ranura de color rojo.'),
+ (39906,'Sangrita brillante','Sangrita brillante','Encaja en una ranura de color rojo.','Encaja en una ranura de color rojo.'),
+ (39909,'Sangrita fracturada','Sangrita fracturada','Encaja en una ranura de color rojo.','Encaja en una ranura de color rojo.'),
+ (39911,'Sangrita rúnica','Sangrita rúnica','Encaja en una ranura de color rojo.','Encaja en una ranura de color rojo.'),
+ (23096,'Granate de sangre rúnico','Granate de sangre rúnico','Encaja en una ranura de color rojo.','Encaja en una ranura de color rojo.'),
+ (28595,'Granate de sangre brillante','Granate de sangre brillante','Encaja en una ranura de color rojo.','Encaja en una ranura de color rojo.'),
+ (23094,'Lágrima de granate de sangre','Lágrima de granate de sangre','Encaja en una ranura de color rojo.','Encaja en una ranura de color rojo.'),
+ (40175,'Ojo de Zul deslumbrante','Ojo de Zul deslumbrante','Encaja en una ranura de color amarillo o azul.','Encaja en una ranura de color amarillo o azul.'),
+ (40167,'Ojo de Zul duradero','Ojo de Zul duradero','Encaja en una ranura de color amarillo o azul.','Encaja en una ranura de color amarillo o azul.'),
+ (40174,'Ojo de Zul intrincado','Ojo de Zul intrincado','Encaja en una ranura de color amarillo o azul.','Encaja en una ranura de color amarillo o azul.'),
+ (40165,'Ojo de Zul irregular','Ojo de Zul irregular','Encaja en una ranura de color amarillo o azul.','Encaja en una ranura de color amarillo o azul.'),
+ (40177,'Ojo de Zul luminiscente','Ojo de Zul luminiscente','Encaja en una ranura de color amarillo o azul.','Encaja en una ranura de color amarillo o azul.'),
+ (40178,'Ojo de Zul opaco','Ojo de Zul opaco','Encaja en una ranura de color amarillo o azul.','Encaja en una ranura de color amarillo o azul.'),
+ (40170,'Ojo de Zul vidente','Ojo de Zul vidente','Encaja en una ranura de color amarillo o azul.','Encaja en una ranura de color amarillo o azul.'),
+ (40172,'Ojo de Zul brillante','Ojo de Zul brillante','Encaja en una ranura de color amarillo o azul.','Encaja en una ranura de color amarillo o azul.'),
+ (40176,'Ojo de Zul hendido','Ojo de Zul hendido','Encaja en una ranura de color amarillo o azul.','Encaja en una ranura de color amarillo o azul.'),
+ (40181,'Ojo de Zul tenso','Ojo de Zul tenso','Encaja en una ranura de color amarillo o azul.','Encaja en una ranura de color amarillo o azul.'),
+ (40164,'Ojo de Zul intemporal','Ojo de Zul intemporal','Encaja en una ranura de color amarillo o azul.','Encaja en una ranura de color amarillo o azul.'),
+ (40166,'Ojo de Zul vívido','Ojo de Zul vívido','Encaja en una ranura de color amarillo o azul.','Encaja en una ranura de color amarillo o azul.'),
+ (32225,'Esmeralda de espuma marina deslumbrante','Esmeralda de espuma marina deslumbrante.','Encaja en una ranura de color amarillo o azul','Encaja en una ranura de color amarillo o azul.'),
+ (32223,'Esmeralda de espuma marina duradera','Esmeralda de espuma marina duradera.','Encaja en una ranura de color amarillo o azul','Encaja en una ranura de color amarillo o azul.'),
+ (32226,'Esmeralda de espuma marina irregular','Esmeralda de espuma marina irregular.','Encaja en una ranura de color amarillo o azul','Encaja en una ranura de color amarillo o azul.'),
+ (40094,'Esmeralda del bosque deslumbrante','Esmeralda del bosque deslumbrante','Encaja en una ranura de color amarillo o azul.','Encaja en una ranura de color amarillo o azul.'),
+ (40089,'Esmeralda del bosque duradera','Esmeralda del bosque duradera','Encaja en una ranura de color amarillo o azul.','Encaja en una ranura de color amarillo o azul.'),
+ (40104,'Esmeralda del bosque intrincada','Esmeralda del bosque intrincada','Encaja en una ranura de color amarillo o azul.','Encaja en una ranura de color amarillo o azul.'),
+ (40100,'Esmeralda del bosque luminiscente','Esmeralda del bosque luminiscente','Encaja en una ranura de color amarillo o azul.','Encaja en una ranura de color amarillo o azul.'),
+ (40103,'Esmeralda del bosque opaca','Esmeralda del bosque opaca','Encaja en una ranura de color amarillo o azul.','Encaja en una ranura de color amarillo o azul.'),
+ (40092,'Esmeralda del bosque de vidente','Esmeralda del bosque de vidente','Encaja en una ranura de color amarillo o azul.','Encaja en una ranura de color amarillo o azul.'),
+ (40099,'Esmeralda del bosque brillante','Esmeralda del bosque brillante','Encaja en una ranura de color amarillo o azul.','Encaja en una ranura de color amarillo o azul.'),
+ (40096,'Esmeralda del bosque hendida','Esmeralda del bosque hendida','Encaja en una ranura de color amarillo o azul.','Encaja en una ranura de color amarillo o azul.'),
+ (40101,'Esmeralda del bosque tensa','Esmeralda del bosque tensa','Encaja en una ranura de color amarillo o azul.','Encaja en una ranura de color amarillo o azul.'),
+ (40085,'Esmeralda del bosque intemporal','Esmeralda del bosque intemporal','Encaja en una ranura de color amarillo o azul.','Encaja en una ranura de color amarillo o azul.'),
+ (40088,'Esmeralda del bosque vívida','Esmeralda del bosque vívida','Encaja en una ranura de color amarillo o azul.','Encaja en una ranura de color amarillo o azul.'),
+ (24065,'Talasita deslumbrante','Talasita deslumbrante','Encaja en una ranura de color amarillo o azul.','Encaja en una ranura de color amarillo o azul.'),
+ (24062,'Talasita duradera','Talasita duradera','Encaja en una ranura de color amarillo o azul.','Encaja en una ranura de color amarillo o azul.'),
+ (24067,'Talasita irregular','Talasita irregular','Encaja en una ranura de color amarillo o azul.','Encaja en una ranura de color amarillo o azul.'),
+ (39984,'Jade oscuro deslumbrante','Jade oscuro deslumbrante','Encaja en una ranura de color amarillo o azul.','Encaja en una ranura de color amarillo o azul.'),
+ (39976,'Jade oscuro duradero','Jade oscuro duradero','Encaja en una ranura de color amarillo o azul.','Encaja en una ranura de color amarillo o azul.'),
+ (39983,'Jade oscuro intrincado','Jade oscuro intrincado','Encaja en una ranura de color amarillo o azul.','Encaja en una ranura de color amarillo o azul.'),
+ (39986,'Jade oscuro luminiscente','Jade oscuro luminiscente','Encaja en una ranura de color amarillo o azul.','Encaja en una ranura de color amarillo o azul.'),
+ (39988,'Jade oscuro opaco','Jade oscuro opaco','Encaja en una ranura de color amarillo o azul.','Encaja en una ranura de color amarillo o azul.'),
+ (39979,'Jade oscuro vidente','Jade oscuro vidente','Encaja en una ranura de color amarillo o azul.','Encaja en una ranura de color amarillo o azul.'),
+ (39981,'Jade oscuro brillante','Jade oscuro brillante','Encaja en una ranura de color amarillo o azul.','Encaja en una ranura de color amarillo o azul.'),
+ (39985,'Jade oscuro hendido','Jade oscuro hendido','Encaja en una ranura de color amarillo o azul.','Encaja en una ranura de color amarillo o azul.'),
+ (39991,'Jade oscuro tenso','Jade oscuro tenso','Encaja en una ranura de color amarillo o azul.','Encaja en una ranura de color amarillo o azul.'),
+ (39968,'Jade oscuro intemporal','Jade oscuro intemporal','Encaja en una ranura de color amarillo o azul.','Encaja en una ranura de color amarillo o azul.'),
+ (39975,'Jade oscuro vívido','Jade oscuro vívido','Encaja en una ranura de color amarillo o azul.','Encaja en una ranura de color amarillo o azul.'),
+ (23106,'Peridoto intenso deslumbrante','Peridoto intenso deslumbrante','Encaja en una ranura de color amarillo o azul.','Encaja en una ranura de color amarillo o azul.'),
+ (23105,'Peridoto intenso duradero','Peridoto intenso duradero','Encaja en una ranura de color amarillo o azul.','Encaja en una ranura de color amarillo o azul.'),
+ (23104,'Peridoto intenso irregular','Peridoto intenso irregular','Encaja en una ranura de color amarillo o azul.','Encaja en una ranura de color amarillo o azul.'),
+ (40154,'Ametrino durable','Ametrino durable','Encaja en una ranura de color rojo o amarillo.','Encaja en una ranura de color rojo o amarillo.'),
+ (40158,'Ametrino potenciado','Ametrino potenciado','Encaja en una ranura de color rojo o amarillo.','Encaja en una ranura de color rojo o amarillo.'),
+ (40161,'Ametrino de luz trémula','Ametrino de luz trémula','Encaja en una ranura de color rojo o amarillo.','Encaja en una ranura de color rojo o amarillo.'),
+ (40149,'Ametrino iluminado','Ametrino iluminado','Encaja en una ranura de color rojo o amarillo.','Encaja en una ranura de color rojo o amarillo.'),
+ (40145,'Ametrino resplandeciente','Ametrino resplandeciente','Encaja en una ranura de color rojo o amarillo.','Encaja en una ranura de color rojo o amarillo.'),
+ (40159,'Ametrino diestro','Ametrino diestro','Encaja en una ranura de color rojo o amarillo.','Encaja en una ranura de color rojo o amarillo.'),
+ (40156,'Ametrino maligno','Ametrino maligno','Encaja en una ranura de color rojo o amarillo.','Encaja en una ranura de color rojo o amarillo.'),
+ (32220,'Piropiedra destelleante','Piropiedra destelleante','Encaja en una ranura de color rojo o amarillo.','Encaja en una ranura de color rojo o amarillo.'),
+ (32219,'Piropiedra luminosa','Piropiedra luminosa','Encaja en una ranura de color rojo o amarillo.','Encaja en una ranura de color rojo o amarillo'),
+ (32221,'Piropiedra velada','Piropiedra velada','Encaja en una ranura de color rojo o amarillo.','Encaja en una ranura de color rojo o amarillo.'),
+ (32222,'Piropiedra maligna','Piropiedra maligna','Encaja en una ranura de color rojo o amarillo.','Encaja en una ranura de color rojo o amarillo.'),
+ (40058,'Topacio monarca de precisión','Topacio monarca de precisión','Encaja en una ranura de color rojo o amarillo.','Encaja en una ranura de color rojo o amarillo.'),
+ (40046,'Topacio monarca diestro','Topacio monarca diestro','Encaja en una ranura de color rojo o amarillo.','Encaja en una ranura de color rojo o amarillo.'),
+ (40050,'Topacio monarca durable','Topacio monarca durable','Encaja en una ranura de color rojo o amarillo.','Encaja en una ranura de color rojo o amarillo.'),
+ (40054,'Topacio monarca potenciado','Topacio monarca potenciado','Encaja en una ranura de color rojo o amarillo.','Encaja en una ranura de color rojo o amarillo.'),
+ (40038,'Topacio monarca grabado','Topacio monarca grabado','Encaja en una ranura de color rojo o amarillo.','Encaja en una ranura de color rojo o amarillo.'),
+ (40057,'Topacio monarca de luz trémula','Topacio monarca de luz trémula','Encaja en una ranura de color rojo o amarillo.','Encaja en una ranura de color rojo o amarillo.'),
+ (40044,'Topacio monarca destellante','Topacio monarca destellante','Encaja en una ranura de color rojo o amarillo.','Encaja en una ranura de color rojo o amarillo.'),
+ (40045,'Topacio monarca iluminado','Topacio monarca iluminado','Encaja en una ranura de color rojo o amarillo.','Encaja en una ranura de color rojo o amarillo.'),
+ (40047,'Topacio monarca luminoso','Topacio monarca luminoso','Encaja en una ranura de color rojo o amarillo.','Encaja en una ranura de color rojo o amarillo.'),
+ (40053,'Topacio monarca prístino','Topacio monarca prístino','Encaja en una ranura de color rojo o amarillo.','Encaja en una ranura de color rojo o amarillo.'),
+ (40055,'Topacio monarca completo','Topacio monarca completo','Encaja en una ranura de color rojo o amarillo.','Encaja en una ranura de color rojo o amarillo.'),
+ (40049,'Topacio monarca velado','Topacio monarca velado','Encaja en una ranura de color rojo o amarillo.','Encaja en una ranura de color rojo o amarillo.'),
+ (40052,'Topacio monarca maligno','Topacio monarca maligno','Encaja en una ranura de color rojo o amarillo.','Encaja en una ranura de color rojo o amarillo.'),
+ (24061,'Topacio noble destellante','Topacio noble destellante','Encaja en una ranura de color rojo o amarillo.','Encaja en una ranura de color rojo o amarillo.'),
+ (24060,'Topacio noble temerario','Topacio noble temerario','Encaja en una ranura de color rojo o amarillo.','Encaja en una ranura de color rojo o amarillo.'),
+ (31867,'Topacio noble velado','Topacio noble velado','Encaja en una ranura de color rojo o amarillo.','Encaja en una ranura de color rojo o amarillo.'),
+ (31868,'Topacio noble maligno','Topacio noble maligno','Encaja en una ranura de color rojo o amarillo.','Encaja en una ranura de color rojo o amarillo.'),
+ (39965,'Citrino enorme de luz trémula','Citrino enorme de luz trémula','Encaja en una ranura de color rojo o amarillo.','Encaja en una ranura de color rojo o amarillo.'),
+ (39966,'Citrino enorme de precisión','Citrino enorme de precisión','Encaja en una ranura de color rojo o amarillo.','Encaja en una ranura de color rojo o amarillo.'),
+ (39958,'Citrino enorme durable','Citrino enorme durable','Encaja en una ranura de color rojo o amarillo.','Encaja en una ranura de color rojo o amarillo.'),
+ (39962,'Citrino enorme potenciado','Citrino enorme potenciado','Encaja en una ranura de color rojo o amarillo.','Encaja en una ranura de color rojo o amarillo.'),
+ (39948,'Citrino enorme grabado','Citrino enorme grabado','Encaja en una ranura de color rojo o amarillo.','Encaja en una ranura de color rojo o amarillo.'),
+ (39953,'Citrino enorme destellante','Citrino enorme destellante','Encaja en una ranura de color rojo o amarillo.','Encaja en una ranura de color rojo o amarillo.'),
+ (39954,'Citrino enorme iluminado','Citrino enorme iluminado','Encaja en una ranura de color rojo o amarillo.','Encaja en una ranura de color rojo o amarillo.'),
+ (39946,'Citrino enorme luminoso','Citrino enorme luminoso','Encaja en una ranura de color rojo o amarillo.','Encaja en una ranura de color rojo o amarillo.'),
+ (39961,'Citrino enorme prístino','Citrino enorme prístino','Encaja en una ranura de color rojo o amarillo.','Encaja en una ranura de color rojo o amarillo.'),
+ (39963,'Citrino enorme completo','Citrino enorme completo','Encaja en una ranura de color rojo o amarillo.','Encaja en una ranura de color rojo o amarillo.'),
+ (39957,'Citrino enorme velado','Citrino enorme velado','Encaja en una ranura de color rojo o amarillo.','Encaja en una ranura de color rojo o amarillo.'),
+ (39960,'Citrino enorme maligno','Citrino enorme maligno','Encaja en una ranura de color rojo o amarillo.','Encaja en una ranura de color rojo o amarillo.'),
+ (31866,'Espesartita de llamas velada','Espesartita de llamas velada','Encaja en una ranura de color rojo o amarillo.','Encaja en una ranura de color rojo o amarillo.'),
+ (31869,'Espesartita de llamas maligna','Espesartita de llamas maligna','Encaja en una ranura de color rojo o amarillo.','Encaja en una ranura de color rojo o amarillo.'),
+ (23100,'Espesartita de llamas destellante','Espesartita de llamas destellante','Encaja en una ranura de color rojo o amarillo.','Encaja en una ranura de color rojo o amarillo.'),
+ (23099,'Espesartita de llamas luminosa','Espesartita de llamas luminosa','Encaja en una ranura de color rojo o amarillo.','Encaja en una ranura de color rojo o amarillo.'),
+ (40136,'Piedra de terror equilibrada','Piedra de terror equilibrada','Encaja en una ranura de color rojo o azul.','Encaja en una ranura de color rojo o azul.'),
+ (40132,'Piedra de terror resplandeciente','Piedra de terror resplandeciente','Encaja en una ranura de color rojo o azul.','Encaja en una ranura de color rojo o azul.'),
+ (40137,'Piedra de terror imbuida','Piedra de terror imbuida','Encaja en una ranura de color rojo o azul.','Encaja en una ranura de color rojo o azul.'),
+ (40138,'Piedra de terror regia','Piedra de terror regia','Encaja en una ranura de color rojo o azul.','Encaja en una ranura de color rojo o azul.'),
+ (40134,'Piedra de terror real','Piedra de terror real','Encaja en una ranura de color rojo o azul.','Encaja en una ranura de color rojo o azul.'),
+ (40131,'Piedra de terror de tenuidad','Piedra de terror de tenuidad','Encaja en una ranura de color rojo o azul.','Encaja en una ranura de color rojo o azul.'),
+ (32213,'Amatista Cantosombrío equilibrada','Amatista Cantosombrío equilibrada','Encaja en una ranura de color rojo o azul.','Encaja en una ranura de color rojo o azul.'),
+ (32215,'Amatista Cantosombrío resplandeciente','Amatista Cantosombrío resplandeciente','Encaja en una ranura de color rojo o azul.','Encaja en una ranura de color rojo o azul.'),
+ (32214,'Amatista Cantosombrío imbuida','Amatista Cantosombrío imbuida','Encaja en una ranura de color rojo o azul.','Encaja en una ranura de color rojo o azul.'),
+ (32216,'Amatista Cantosombrío real','Amatista Cantosombrío real','Encaja en una ranura de color rojo o azul.','Encaja en una ranura de color rojo o azul.'),
+ (40029,'Ópalo crepuscular equilibrado','Ópalo crepuscular equilibrado','Encaja en una ranura de color rojo o azul.','Encaja en una ranura de color rojo o azul.'),
+ (40025,'Ópalo crepuscular resplandeciente','Ópalo crepuscular resplandeciente','Encaja en una ranura de color rojo o azul.','Encaja en una ranura de color rojo o azul.'),
+ (40030,'Ópalo crepuscular imbuido','Ópalo crepuscular imbuido','Encaja en una ranura de color rojo o azul.','Encaja en una ranura de color rojo o azul.'),
+ (40033,'Ópalo crepuscular enjundioso','Ópalo crepuscular enjundioso','Encaja en una ranura de color rojo o azul.','Encaja en una ranura de color rojo o azul.'),
+ (40031,'Ópalo crepuscular regio','Ópalo crepuscular regio','Encaja en una ranura de color rojo o azul.','Encaja en una ranura de color rojo o azul.'),
+ (40027,'Ópalo crepuscular real','Ópalo crepuscular real','Encaja en una ranura de color rojo o azul.','Encaja en una ranura de color rojo o azul.'),
+ (40024,'Ópalo crepuscular de tenuidad','Ópalo crepuscular de tenuidad','Encaja en una ranura de color rojo o azul.','Encaja en una ranura de color rojo o azul.'),
+ (31863,'Ojo de noche equilibrado','Ojo de noche equilibrado','Encaja en una ranura de color rojo o azul.','Encaja en una ranura de color rojo o azul.'),
+ (24056,'Ojo de noche resplandeciente','Ojo de noche resplandeciente','Encaja en una ranura de color rojo o azul.','Encaja en una ranura de color rojo o azul.'),
+ (31865,'Ojo de noche imbuido','Ojo de noche imbuido','Encaja en una ranura de color rojo o azul.','Encaja en una ranura de color rojo o azul.'),
+ (35707,'Ojo de noche regio','Ojo de noche regio','Encaja en una ranura de color rojo o azul.','Encaja en una ranura de color rojo o azul.'),
+ (24057,'Ojo de noche real','Ojo de noche real','Encaja en una ranura de color rojo o azul.','Encaja en una ranura de color rojo o azul.'),
+ (39938,'Cristal de Sombras regio','Cristal de Sombras regio','Encaja en una ranura de color rojo o azul.','Encaja en una ranura de color rojo o azul.'),
+ (39937,'Cristal de Sombras equilibrado','Cristal de Sombras equilibrado','Encaja en una ranura de color rojo o azul.','Encaja en una ranura de color rojo o azul.'),
+ (39936,'Cristal de Sombras resplandeciente','Cristal de Sombras resplandeciente','Encaja en una ranura de color rojo o azul.','Encaja en una ranura de color rojo o azul.'),
+ (39944,'Cristal de Sombras imbuido','Cristal de Sombras imbuido','Encaja en una ranura de color rojo o azul.','Encaja en una ranura de color rojo o azul.'),
+ (39933,'Cristal de Sombras enjudioso','Cristal de Sombras enjudioso','Encaja en una ranura de color rojo o azul.','Encaja en una ranura de color rojo o azul.'),
+ (39943,'Cristal de Sombras real','Cristal de Sombras real','Encaja en una ranura de color rojo o azul.','Encaja en una ranura de color rojo o azul.'),
+ (39942,'Cristal de Sombras de tenuidad','Cristal de Sombras de tenuidad','Encaja en una ranura de color rojo o azul.','Encaja en una ranura de color rojo o azul.'),
+ (31862,'Draenita de Sombras equilibrada','Draenita de Sombras equilibrada','Encaja en una ranura de color rojo o azul.','Encaja en una ranura de color rojo o azul.'),
+ (31864,'Draenita de Sombras imbuida','Draenita de Sombras imbuida','Encaja en una ranura de color rojo o azul.','Encaja en una ranura de color rojo o azul.'),
+ (23109,'Draenita de Sombras real','Draenita de Sombras real','Encaja en una ranura de color rojo o azul.','Encaja en una ranura de color rojo o azul.'),
+ (23108,'Draenita de Sombras resplandeciente','Draenita de Sombras resplandeciente','Encaja en una ranura de color rojo o azul.','Encaja en una ranura de color rojo o azul.'),
+ (42701,'Perla encantada','Perla encantada','Encaja en una ranura de color rojo, amarillo o azul. Solo puedes encajar una en tu equipo.','Encaja en una ranura de color rojo, amarillo o azul. Solo puedes encajar una en tu equipo.'),
+ (36766,'Ojo de dragón brillante','Ojo de dragón brillante','Encaja en una ranura de color rojo.','Encaja en una ranura de color rojo.'),
+ (42153,'Ojo de dragón fracturado','Ojo de dragón fracturado','Encaja en una ranura de color rojo.','Encaja en una ranura de color rojo.'),
+ (42146,'Ojo de dragón lustroso','Ojo de dragón lustroso','Encaja en una ranura de color azul.','Encaja en una ranura de color azul.'),
+ (42144,'Ojo de dragón rúnico','Ojo de dragón rúnico','Encaja en una ranura de color rojo.','Encaja en una ranura de color rojo.'),
+ (42157,'Ojo de dragón grueso','Ojo de dragón grueso','Encaja en una ranura de color amarillo.','Encaja en una ranura de color amarillo.'),
+ (41377,'Diamante de llama celeste refulgente','Diamante de llama celeste refulgente','Solo encaja en una ranura de gema meta.','Solo encaja en una ranura de gema meta.'),
+ (32202,'Zafiro empíreo luciente','Zafiro empíreo luciente','Encaja en una ranura de color azul.','Encaja en una ranura de color azul.'),
+ (32200,'Zafiro empíreo sólido','Zafiro empíreo sólido','Encaja en una ranura de color azul.','Encaja en una ranura de color azul.'),
+ (40123,'Ámbar del rey luminoso','Ámbar del rey luminoso','Encaja en una ranura de color amarillo.','Encaja en una ranura de color amarillo.'),
+ (39349,'Vitela de arma','Vitela de arma','Se puede marcar como el objetivo de varios encantamientos de armas para almacenar el encantamiento y usarlo más tarde. Solo puede absorber encantamientos sin restricciones de nivel.','Se puede marcar como el objetivo de varios encantamientos de armas para almacenar el encantamiento y usarlo más tarde. Solo puede absorber encantamientos sin restricciones de nivel.'),
+ (39350,'Vitela de arma II','Vitela de arma II','Se puede marcar como el objetivo de varios encantamientos de armas para almacenar el encantamiento y usarlo más tarde. Solo puede absorber encantamientos con restricciones de nivel 35 o inferior.','Se puede marcar como el objetivo de varios encantamientos de armas para almacenar el encantamiento y usarlo más tarde. Solo puede absorber encantamientos con restricciones de nivel 35 o inferior.'),
+ (43146,'Vitela de arma III','Vitela de arma III','Se puede marcar como el objetivo de varios encantamientos de armas para almacenar el encantamiento y usarlo más tarde. Solo puede absorber encantamientos con restricciones de nivel 60 o inferior.','Se puede marcar como el objetivo de varios encantamientos de armas para almacenar el encantamiento y usarlo más tarde. Solo puede absorber encantamientos con restricciones de nivel 60 o inferior.'),
+ (38682,'Vitela de armadura','Vitela de armadura','Se puede marcar como el objetivo de varios encantamientos de armadura para almacenar el encantamiento y usarlo más tarde. Solo puede absorber encantamientos sin restricciones de nivel.','Se puede marcar como el objetivo de varios encantamientos de armadura para almacenar el encantamiento y usarlo más tarde. Solo puede absorber encantamientos sin restricciones de nivel.'),
+ (37602,'Vitela de armadura II','Vitela de armadura II','Se puede marcar como el objetivo de varios encantamientos de armadura para almacenar el encantamiento y usarlo más tarde. Solo puede absorber encantamientos con restricciones de nivel 35 o inferior.','Se puede marcar como el objetivo de varios encantamientos de armadura para almacenar el encantamiento y usarlo más tarde. Solo puede absorber encantamientos con restricciones de nivel 35 o inferior.'),
+ (43145,'Vitela de armadura III','Vitela de armadura III','Se puede marcar como el objetivo de varios encantamientos de armadura para almacenar el encantamiento y usarlo más tarde. Solo puede absorber encantamientos con restricciones de nivel 60 o inferior.','Se puede marcar como el objetivo de varios encantamientos de armadura para almacenar el encantamiento y usarlo más tarde. Solo puede absorber encantamientos con restricciones de nivel 60 o inferior.'),
+ (40121,'Circón majestuoso luciente','Circón majestuoso luciente','Encaja en una ranura de color azul.','Encaja en una ranura de color azul.'),
+ (40010,'Zafiro celestial luciente','Zafiro celestial luciente','Encaja en una ranura de color azul.','Encaja en una ranura de color azul.'),
+ (24037,'Estrella de Eluna luciente','Estrella de Eluna luciente','Encaja en una ranura de color azul.','Encaja en una ranura de color azul.'),
+ (39927,'Calcedonia lustrosa','Calcedonia lustrosa','Encaja en una ranura de color azul.','Encaja en una ranura de color azul.'),
+ (39920,'Calcedonia brillante','Calcedonia brillante','Encaja en una ranura de color azul.','Encaja en una ranura de color azul.'),
+ (23121,'Piedra lunar azur luciente','Piedra lunar azur luciente','Encaja en una ranura de color azul.','Encaja en una ranura de color azul.'),
+ (40125,'Ámbar del rey rígido','Ámbar del rey rígido','Encaja en una ranura de color amarillo.','Encaja en una ranura de color amarillo.'),
+ (40126,'Ámbar del rey grueso','Ámbar del rey grueso','Encaja en una ranura de color amarillo.','Encaja en una ranura de color amarillo.'),
+ (32204,'Ojo de león luminoso','Ojo de león luminoso','Encaja en una ranura de color amarillo.','Encaja en una ranura de color amarillo.'),
+ (32207,'Ojo de león reluciente','Ojo de león reluciente','Encaja en una ranura de color amarillo.','Encaja en una ranura de color amarillo.'),
+ (32210,'Gran ojo de león','Gran ojo de león','Encaja en una ranura de color amarillo.','Encaja en una ranura de color amarillo.'),
+ (32206,'Ojo de león rígido','Ojo de león rígido','Encaja en una ranura de color amarillo.','Encaja en una ranura de color amarillo.'),
+ (32208,'Ojo de león grueso','Ojo de león grueso','Encaja en una ranura de color amarillo.','Encaja en una ranura de color amarillo.'),
+ (40012,'Brillo de otoño luminoso','Brillo de otoño luminoso','Encaja en una ranura de color amarillo.','Encaja en una ranura de color amarillo.'),
+ (40014,'Brillo de otoño rígido','Brillo de otoño rígido','Encaja en una ranura de color amarillo.','Encaja en una ranura de color amarillo.'),
+ (40015,'Brillo de otoño grueso','Brillo de otoño grueso','Encaja en una ranura de color amarillo.','Encaja en una ranura de color amarillo.'),
+ (24047,'Piedra del alba luminosa','Piedra del alba luminosa','Encaja en una ranura de color amarillo.','Encaja en una ranura de color amarillo.'),
+ (24050,'Piedra del alba reluciente','Piedra del alba reluciente','Encaja en una ranura de color amarillo.','Encaja en una ranura de color amarillo.'),
+ (31861,'Gran piedra del alba ','Gran piedra del alba ','Encaja en una ranura de color amarillo.','Encaja en una ranura de color amarillo.'),
+ (24051,'Piedra del alba rígida','Piedra del alba rígida','Encaja en una ranura de color amarillo.','Encaja en una ranura de color amarillo.'),
+ (24052,'Piedra del alba gruesa','Piedra del alba gruesa','Encaja en una ranura de color amarillo.','Encaja en una ranura de color amarillo.'),
+ (39912,'Cristal de sol luminoso','Cristal de sol luminoso','Encaja en una ranura de color amarillo.','Encaja en una ranura de color amarillo.'),
+ (39915,'Cristal de sol rígido','Cristal de sol rígido','Encaja en una ranura de color amarillo.','Encaja en una ranura de color amarillo.'),
+ (39916,'Cristal de sol grueso','Cristal de sol grueso','Encaja en una ranura de color amarillo.','Encaja en una ranura de color amarillo.'),
+ (31860,'Gran draenita dorada','Gran draenita dorada','Encaja en una ranura de color amarillo.','Encaja en una ranura de color amarillo.'),
+ (23116,'Draenita dorada rígida','Draenita dorada rígida','Encaja en una ranura de color amarillo.','Encaja en una ranura de color amarillo.'),
+ (23115,'Draenita dorada gruesa','Draenita dorada gruesa','Encaja en una ranura de color amarillo.','Encaja en una ranura de color amarillo.'),
+ (23114,'Draenita dorada reluciente','Draenita dorada reluciente','Encaja en una ranura de color amarillo.','Encaja en una ranura de color amarillo.'),
+ (23113,'Draenita dorada luminosa','Draenita dorada luminosa','Encaja en una ranura de color amarillo.','Encaja en una ranura de color amarillo.');
+
+INSERT INTO `locales_update` (`entry`, `name_loc6`, `name_loc7`, `description_loc6`) VALUES
+ (41580,'Boceto: brillo de otoño rígido','Boceto: brillo de otoño rígido','Te enseña a tallar un brillo de otoño rígido.'),
+ (41581,'Boceto: zafiro celestial luciente','Boceto: zafiro celestial luciente','Te enseña a tallar un zafiro celestial luciente.'),
+ (41582,'Boceto: topacio monarca destellante','Boceto: topacio monarca destellante','Te enseña a tallar un topacio monarca destellante.'),
+ (41687,'Boceto: topacio monarca completo','Boceto: topacio monarca completo','Te enseña a tallar un topacio monarca completo.'),
+ (41688,'Boceto: topacio monarca velado','Boceto: topacio monarca velado','Te enseña a tallar un topacio monarca velado.'),
+ (41689,'Boceto: topacio monarca luminoso','Boceto: topacio monarca luminoso','Te enseña a tallar un topacio monarca luminoso.'),
+ (41696,'Boceto: esmeralda del bosque luminiscente','Boceto: esmeralda del bosque luminiscente','Te enseña a tallar una esmeralda del bosque luminiscente.'),
+ (41694,'Boceto: esmeralda del bosque intrincada','Boceto: esmeralda del bosque intrincada','Te enseña a tallar una esmeralda del bosque intrincada.'),
+ (40140,'Piedra de terror enjundiosa','Piedra de terror enjundiosa','Encaja en una ranura de color rojo o azul.'),
+ (41697,'Boceto: esmeralda del bosque duradera','Boceto: esmeralda del bosque duradera','Te enseña a tallar una esmeralda del bosque duradera.'),
+ (41699,'Boceto: esmeralda del bosque de vidente','Boceto: esmeralda del bosque de vidente','Te enseña a tallar una esmeralda del bosque de vidente.'),
+ (41701,'Boceto: ópalo crepuscular real','Boceto: ópalo crepuscular real','Te enseña a tallar un ópalo crepuscular real.'),
+ (41702,'Boceto: ópalo crepuscular enjundioso','Boceto: ópalo crepuscular enjundioso','Te enseña a tallar un ópalo crepuscular enjundioso.'),
+ (41703,'Boceto: ópalo crepuscular regio','Boceto: ópalo crepuscular regio','Te enseña a tallar un ópalo crepuscular regio.'),
+ (41705,'Boceto: diamante de llama celeste refulgente','Boceto: diamante de llama celeste refulgente','Te enseña a tallar un diamante de llama celeste refulgente.'),
+ (42299,'Boceto: ojo de dragón brillante','Boceto: ojo de dragón brillante','Te enseña a tallar un ojo de dragón brillante.'),
+ (42303,'Boceto: ojo de dragón fracturado','Boceto: ojo de dragón fracturado','Te enseña a tallar un ojo de dragón fracturado.'),
+ (42304,'Boceto: ojo de dragón lustroso','Boceto: ojo de dragón lustroso','Te enseña a tallar un ojo de dragón lustroso.'),
+ (42309,'Boceto: ojo de dragón rúnico','Boceto: ojo de dragón rúnico','Te enseña a tallar un ojo de dragón rúnico.'),
+ (42315,'Boceto: ojo de dragón grueso','Boceto: ojo de dragón grueso','Te enseña a tallar un ojo de dragón grueso.'),
+ (46934,'Boceto: piedra de terror equilibrada','Boceto: piedra de terror equilibrada','Te enseña a tallar una piedra de terror equilibrada.'),
+ (46952,'Boceto: ametrino durable','Boceto: ametrino durable','Te enseña a tallar un ametrino durable.'),
+ (47016,'Boceto: ametrino potenciado','Boceto: ametrino potenciado','Te enseña a tallar un ametrino potenciado.'),
+ (46921,'Boceto: rubí cárdeno fracturado','Boceto: rubí cárdeno fracturado','Te enseña a tallar un rubí cárdeno fracturado.'),
+ (47012,'Boceto: ametrino de luz trémula','Boceto: ametrino de luz trémula','Te enseña a tallar un ametrino de luz trémula.'),
+ (46945,'Boceto: piedra de terror imbuida','Boceto: piedra de terror imbuida','Te enseña a tallar una piedra de terror imbuida.'),
+ (46901,'Boceto: ojo de Zul irregular','Boceto: ojo de Zul irregular','Te enseña a tallar un ojo de Zul irregular.'),
+ (46909,'Boceto: ojo de Zul luminiscente','Boceto: ojo de Zul luminiscente','Te enseña a tallar un ojo de Zul luminiscente.'),
+ (47021,'Boceto: ametrino iluminado','Boceto: ametrino iluminado','Te enseña a tallar un ametrino iluminado.'),
+ (46927,'Boceto: circón majestuoso luciente','Boceto: circón majestuoso luciente','Te enseña a tallar un circón majestuoso luciente.'),
+ (49112,'Boceto: Lágrima de pesadilla','Boceto: Lágrima de pesadilla','Te enseña a tallar una Lágrima de pesadilla.'),
+ (46914,'Boceto: ojo de Zul opaco','Boceto: ojo de Zul opaco','Te enseña a tallar un ojo de Zul opaco.'),
+ (46944,'Boceto: piedra de terror enjundiosa','Boceto: piedra de terror enjundiosa','Te enseña a tallar una piedra de terror enjundiosa.'),
+ (46940,'Boceto: piedra de terror regia','Boceto: piedra de terror regia','Te enseña a tallar una piedra de terror regia.'),
+ (47018,'Boceto: ametrino resplandeciente','Boceto: ametrino resplandeciente','Te enseña a tallar un ametrino resplandeciente.'),
+ (46928,'Boceto: ámbar del rey rígido','Boceto: ámbar del rey rígido','Te enseña a tallar un ámbar del rey rígido.'),
+ (46939,'Boceto: piedra de terror real','Boceto: piedra de terror real','Te enseña a tallar una piedra de terror real.'),
+ (46916,'Boceto: rubí cárdeno rúnico','Boceto: rubí cárdeno rúnico','Te enseña a tallar un rubí cárdeno rúnico.'),
+ (46907,'Boceto: ojo de Zul brillante','Boceto: ojo de Zul brillante','Te enseña a tallar un ojo de Zul brillante.'),
+ (46922,'Boceto: rubí cárdeno sutil','Boceto: rubí cárdeno sutil','Te enseña a tallar un rubí cárdeno sutil.'),
+ (46906,'Boceto: ojo de Zul hendido','Boceto: ojo de Zul hendido','Te enseña a tallar un ojo de Zul hendido.'),
+ (46908,'Boceto: ojo de Zul tenso','Boceto: ojo de Zul tenso','Te enseña a tallar un ojo de Zul tenso.'),
+ (46946,'Boceto: piedra de terror de tenuidad','Boceto: piedra de terror de tenuidad','Te enseña a tallar una piedra de terror de tenuidad.'),
+ (46931,'Boceto: ámbar del rey grueso','Boceto: ámbar del rey grueso','Te enseña a tallar un ámbar del rey grueso.'),
+ (46899,'Boceto: ojo de Zul vívido','Boceto: ojo de Zul vívido','Te enseña a tallar un ojo de Zul vívido.'),
+ (47011,'Boceto: ametrino maligno','Boceto: ametrino maligno','Te enseña a tallar un ametrino maligno.'),
+ (52023,'Diseño: Flecha de hoja de hielo','Diseño: Flecha de hoja de hielo','Te enseña a hacer flechas de hoja de hielo.'),
+ (52022,'Diseño: Balas destrozadoras','Diseño: Balas destrozadoras','Te enseña a hacer balas destrozadoras.'),
+ (50166,'Técnica: Glifo de Agua eterna','Técnica: Glifo de Agua eterna','Te enseña a inscribir un Glifo de Agua eterna.'),
+ (50168,'Técnica: Glifo de descomposición presurosa','Técnica: Glifo de descomposición presurosa','Te enseña a inscribir un Glifo de descomposición presurosa.'),
+ (50167,'Técnica: Glifo de Rejuvenecimiento rápido','Técnica: Glifo de Rejuvenecimiento rápido','Te enseña a inscribir un Glifo de Rejuvenecimiento rápido.'),
+ (43826,'Glifo de Golpe sangriento','Glifo de Golpe sangriento',''),
+ (43538,'Glifo de Orden oscura','Glifo de Orden oscura',''),
+ (45804,'Glifo de muerte oscura','Glifo de muerte oscura',''),
+ (45805,'Glifo de enfermedad','Glifo de enfermedad',''),
+ (43545,'Glifo de Entereza ligada al hielo','Glifo de Entereza ligada al hielo',''),
+ (43548,'Glifo de Golpe de peste','Glifo de Golpe de peste',''),
+ (43549,'Glifo del necrófago','Glifo del necrófago',''),
+ (43553,'Glifo de Armadura inquebrantable','Glifo de Armadura inquebrantable',''),
+ (45803,'Glifo de Añublo profano','Glifo de Añublo profano',''),
+ (43671,'Glifo de Deflagración de cadáver','Glifo de Deflagración de cadáver',''),
+ (43672,'Glifo de Pestilencia','Glifo de Pestilencia',''),
+ (43673,'Glifo de Levantar a muerto','Glifo de Levantar a muerto','');
+
+UPDATE `locales_item`, `locales_update` SET `locales_item`.`name_loc6` = `locales_update`.`name_loc6`, `locales_item`.`name_loc7` = `locales_update`.`name_loc7`, `locales_item`.`description_loc6` = `locales_update`.`description_loc6`, `locales_item`.`description_loc7` = `locales_update`.`description_loc7`
+ WHERE `locales_item`.`entry` = `locales_update`.`entry`;
+
+DROP TABLE `locales_update`;
+UPDATE `locales_item` SET `description_loc7` = `description_loc6` WHERE `entry` IN (41580,41581,41582,41687,41688,41689,41696,41694,41697,41699,41701,41702,41703,41705,42299,42303,42304,42309,42315,46934,46952,47016,46921,47012,46945,46901,46909,47021,46927,49112,46914,46944,46940,47018,46928,46939,46916,46907,46922,46906,46908,46946,46931,46899,47011,52023,52022,50166,50168,50167,43826,43538,45804,45805,43545,43548,43549,43553,45803,43671,43672,43673);
diff --git a/sql/updates/world/2015_02_07_00_world.sql b/sql/updates/world/2015_02_07_00_world.sql
new file mode 100644
index 00000000000..c0616f833ea
--- /dev/null
+++ b/sql/updates/world/2015_02_07_00_world.sql
@@ -0,0 +1,14 @@
+-- A Friendly Chat... (24576, 24657)
+-- Snivel Rustrocket set gossip flag
+UPDATE `creature_template` SET `npcflag` = 1, `AIName`='SmartAI' WHERE `entry` = 37715;
+
+-- Quest credit SAI
+DELETE FROM `smart_scripts` WHERE (`entryorguid`=37715 AND `source_type`=0);
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(37715,0,0,0,62,0,100,0,10946,0,0,0,11,70646,2,0,0,0,0,7,0,0,0,0,0,0,0, "Snivel Rustrocket - on gosip 10947 - cast Love - Create Snivel's Ledger");
+
+-- Gossip option conditions
+DELETE FROM `conditions` WHERE (`SourceTypeOrReferenceId`=15 AND `SourceGroup`=10929);
+INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`ErrorTextId`,`ScriptName`,`Comment`) VALUES
+(15,10929,0,0,9,24576,0,0,0,'','Show gossip only if plaer have A Friendly Chat... Horde quest'),
+(15,10929,0,1,9,24657,0,0,0,'','Show gossip only if plaer have A Friendly Chat... Alliance quest');
diff --git a/sql/updates/world/2015_02_07_01_world.sql b/sql/updates/world/2015_02_07_01_world.sql
new file mode 100644
index 00000000000..742d833352e
--- /dev/null
+++ b/sql/updates/world/2015_02_07_01_world.sql
@@ -0,0 +1,2 @@
+--
+UPDATE `creature_template` SET `flags_extra`=0 WHERE `entry`=24938;
diff --git a/sql/updates/world/2015_02_09_00_world.sql b/sql/updates/world/2015_02_09_00_world.sql
new file mode 100644
index 00000000000..dcfd5ddf029
--- /dev/null
+++ b/sql/updates/world/2015_02_09_00_world.sql
@@ -0,0 +1,10 @@
+-- Irespeaker SAI
+SET @ENTRY := 24999;
+UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,0,0,0,0,0,100,0,1500,3000,10000,15000,11,35913,0,0,0,0,0,2,0,0,0,0,0,0,0,"Irespeaker - In Combat - Cast 'Fel Fireball'"),
+(@ENTRY,0,1,0,0,0,100,0,13000,16000,20000,35000,11,18267,0,0,0,0,0,2,0,0,0,0,0,0,0,"Irespeaker - In Combat - Cast 'Curse of Weakness'"),
+(@ENTRY,0,2,0,6,0,100,1,0,0,0,0,33,0,0,0,0,0,0,7,0,0,0,0,0,0,0,"Irespeaker - On Just Died - Quest Credit 'Kanrethad's Quest' (No Repeat)"),
+(@ENTRY,0,3,0,6,0,100,0,5000,5000,10000,10000,45,1,1,0,0,0,0,10,79450,23310,0,0,0,0,0,"Irespeaker - On Just Died - Set Data 1 1"),
+(@ENTRY,0,4,0,25,0,100,0,0,0,0,0,11,45023,0,0,0,0,0,19,25953,13,0,0,0,0,0,"Irespeaker - On Reset - Cast 'Fel Consumption'");
diff --git a/sql/updates/world/2015_02_09_01_world.sql b/sql/updates/world/2015_02_09_01_world.sql
new file mode 100644
index 00000000000..f844fcce5d0
--- /dev/null
+++ b/sql/updates/world/2015_02_09_01_world.sql
@@ -0,0 +1,2 @@
+--
+UPDATE `creature_text` SET `type`=14 WHERE `entry`=20977;
diff --git a/sql/updates/world/2015_02_09_02_world.sql b/sql/updates/world/2015_02_09_02_world.sql
new file mode 100644
index 00000000000..46ff767997f
--- /dev/null
+++ b/sql/updates/world/2015_02_09_02_world.sql
@@ -0,0 +1,2 @@
+--
+UPDATE `quest_template` SET `PrevQuestId`=3451 WHERE `Id`=3483;
diff --git a/sql/updates/world/2015_02_09_03_world.sql b/sql/updates/world/2015_02_09_03_world.sql
new file mode 100644
index 00000000000..2bef0c6b1f5
--- /dev/null
+++ b/sql/updates/world/2015_02_09_03_world.sql
@@ -0,0 +1,204 @@
+--
+UPDATE `creature` SET `position_x`=1772.803833, `position_y`=848.654846, `position_z`=123.192604, `orientation`=1.649258 WHERE `guid`=127067;
+UPDATE `creature` SET `position_x`=1772.699585, `position_y`=852.786560, `position_z`=123.192734, `orientation`=4.675874 WHERE `guid`=127068;
+
+DELETE FROM `creature_addon` WHERE `guid` IN (127051, 127062, 127065, 127059, 127047);
+INSERT INTO `creature_addon` (`guid`, `path_id`, `mount`, `bytes1`, `bytes2`, `emote`, `auras`) VALUES
+(127051, 0, 0, 0, 1, 4, ''),
+(127062, 0, 0, 0, 1, 4, ''),
+(127065, 0, 0, 0, 1, 4, ''),
+(127059, 0, 0, 0, 1, 4, ''),
+(127047, 0, 0, 0, 1, 4, '');
+
+DELETE FROM `creature_addon` WHERE `guid` IN (127067, 127068);
+INSERT INTO `creature_addon` (`guid`, `path_id`, `mount`, `bytes1`, `bytes2`, `emote`, `auras`) VALUES
+(127067, 0, 0, 0, 1, 36, ''),
+(127068, 0, 0, 0, 1, 36, '');
+
+UPDATE `creature_addon` SET `emote`=20 WHERE `guid`=127043;
+
+/* emotes for these creatures. http://pokit.org/get/?2ee8b0b514852adc528b2543f704fdcd.jpg*/
+
+-- Pathing for Entry: 29830 'TDB FORMAT'
+SET @NPC := 127079;
+SET @PATH := @NPC * 10;
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=1580.776,`position_y`=726.0986,`position_z`=143.0329 WHERE `guid`=@NPC;
+DELETE FROM `creature_addon` WHERE `guid`=@NPC;
+INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (@NPC,@PATH,0,0,1,0, '');
+DELETE FROM `waypoint_data` WHERE `id`=@PATH;
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES
+(@PATH,1,1580.776,726.0986,143.0329,0,0,0,0,100,0),
+(@PATH,2,1601.526,726.0986,143.0329,0,0,0,0,100,0),
+(@PATH,3,1580.776,726.0986,143.0329,0,0,0,0,100,0),
+(@PATH,4,1601.526,726.0986,143.0329,0,0,0,0,100,0);
+-- 0x1C3AE04B801D2180006CCE0002D7B1EE .go 1580.776 726.0986 143.0329
+
+-- Pathing for Entry: 29830 'TDB FORMAT'
+SET @NPC := 127077;
+SET @PATH := @NPC * 10;
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=1634.252,`position_y`=750.1481,`position_z`=143.0402 WHERE `guid`=@NPC;
+DELETE FROM `creature_addon` WHERE `guid`=@NPC;
+INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (@NPC,@PATH,0,0,1,0, '');
+DELETE FROM `waypoint_data` WHERE `id`=@PATH;
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES
+(@PATH,1,1634.252,750.1481,143.0402,0,0,0,0,100,0),
+(@PATH,2,1645.534,749.2593,143.062,0,0,0,0,100,0),
+(@PATH,3,1646.846,740.0786,143.036,0,0,0,0,100,0),
+(@PATH,4,1643.028,738.3261,143.0428,0,0,0,0,100,0),
+(@PATH,5,1634.346,729.3132,143.0253,0,0,0,0,100,0),
+(@PATH,6,1629.24,728.4056,143.036,0,0,0,0,100,0),
+(@PATH,7,1625.434,724.1005,143.033,0,0,0,0,100,0),
+(@PATH,8,1625.066,724.9523,143.0346,0,0,0,0,100,0),
+(@PATH,9,1633.39,728.2556,143.0207,0,0,0,0,100,0),
+(@PATH,10,1634.352,731.7579,143.036,0,0,0,0,100,0),
+(@PATH,11,1642.503,738.0968,143.036,0,0,0,0,100,0),
+(@PATH,12,1646.744,748.6193,143.0608,0,0,0,0,100,0);
+-- 0x1C3AE04B801D2180006CCE0003D7B1EE .go 1634.252 750.1481 143.0402
+
+-- Pathing for Entry: 29830 'TDB FORMAT'
+SET @NPC := 127078;
+SET @PATH := @NPC * 10;
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=1624.936,`position_y`=762.2312,`position_z`=143.0362 WHERE `guid`=@NPC;
+DELETE FROM `creature_addon` WHERE `guid`=@NPC;
+INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (@NPC,@PATH,0,0,1,0, '');
+DELETE FROM `waypoint_data` WHERE `id`=@PATH;
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES
+(@PATH,1,1624.936,762.2312,143.0362,0,0,0,0,100,0),
+(@PATH,2,1624.857,762.3463,143.0362,0,0,0,0,100,0),
+(@PATH,3,1616.904,760.4952,143.0778,0,0,0,0,100,0),
+(@PATH,4,1616.059,757.1263,143.036,0,0,0,0,100,0),
+(@PATH,5,1615.883,751.8171,143.036,0,0,0,0,100,0),
+(@PATH,6,1612.587,742.8907,143.036,0,0,0,0,100,0),
+(@PATH,7,1615.973,735.1326,143.036,0,0,0,0,100,0),
+(@PATH,8,1616.567,728.8411,143.0389,0,0,0,0,100,0),
+(@PATH,9,1616.565,728.8934,143.0389,0,0,0,0,100,0),
+(@PATH,10,1616.015,735.0688,143.036,0,0,0,0,100,0),
+(@PATH,11,1612.599,741.9441,143.036,0,0,0,0,100,0),
+(@PATH,12,1612.643,745.9359,143.036,0,0,0,0,100,0),
+(@PATH,13,1615.984,759.0609,143.0375,0,0,0,0,100,0),
+(@PATH,14,1620.861,760.4977,143.036,0,0,0,0,100,0),
+(@PATH,15,1624.961,762.2328,143.0362,0,0,0,0,100,0),
+(@PATH,16,1624.857,762.3463,143.0362,0,0,0,0,100,0),
+(@PATH,17,1616.904,760.5043,143.0776,0,0,0,0,100,0);
+-- 0x1C3AE04B801D2180006CCE000357B1EE .go 1624.936 762.2312 143.0362
+
+UPDATE `smart_scripts` SET `action_param1`=1 WHERE `entryorguid` IN (29774, 29820) AND `source_type`=0 AND `id`=0 AND `link`=1;
+-- Pathing for Entry: 29774 'TDB FORMAT'
+SET @NPC := 127023;
+SET @PATH := @NPC * 10;
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=1642.346,`position_y`=653.1481,`position_z`=125.2523 WHERE `guid`=@NPC;
+DELETE FROM `creature_addon` WHERE `guid`=@NPC;
+INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (@NPC,@PATH,0,0,1,0, '');
+DELETE FROM `waypoint_data` WHERE `id`=@PATH;
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES
+(@PATH,1,1642.346,653.1481,125.2523,0,0,0,0,100,0),
+(@PATH,2,1639.856,642.3232,125.6559,0,0,0,0,100,0),
+(@PATH,3,1642.258,637.7573,126.032,0,0,0,0,100,0),
+(@PATH,4,1647.147,632.4925,126.6323,0,0,0,0,100,0),
+(@PATH,5,1657.781,625.1252,128.0753,0,0,0,0,100,0),
+(@PATH,6,1664.838,624.4281,127.6226,0,0,0,0,100,0),
+(@PATH,7,1669.714,625.9705,127.4224,0,0,0,0,100,0),
+(@PATH,8,1674.736,633.4069,127.3273,0,0,0,0,100,0),
+(@PATH,9,1673.877,644.5715,126.3829,0,0,0,0,100,0),
+(@PATH,10,1668.756,649.8423,126.1618,0,0,0,0,100,0),
+(@PATH,11,1662.11,654.2892,125.6076,0,0,0,0,100,0),
+(@PATH,12,1655.857,656.4763,125.5904,0,0,0,0,100,0),
+(@PATH,13,1645.618,656.3919,125.2844,0,0,0,0,100,0),
+(@PATH,14,1642.373,653.2665,125.2903,0,0,0,0,100,0);
+-- 0x1C3AE04B801D1380006CCE0000D7B1EE .go 1642.346 653.1481 125.2523
+
+DELETE FROM `creature_formations` WHERE `leaderGUID`=127023;
+INSERT INTO `creature_formations` (`leaderGUID`, `memberGUID`, `dist`, `angle`, `groupAI`, `point_1`, `point_2`) VALUES
+(127023, 127023, 0, 0, 2, 0, 0),
+(127023, 127013, 4, 50, 2, 0, 0),
+(127023, 127024, 4, 310, 2, 0, 0);
+
+-- Pathing for Entry: 29829 'TDB FORMAT'
+SET @NPC := 127069;
+SET @PATH := @NPC * 10;
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=1592.818,`position_y`=817.3067,`position_z`=149.783 WHERE `guid`=@NPC;
+DELETE FROM `creature_addon` WHERE `guid`=@NPC;
+INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (@NPC,@PATH,0,0,1,0, '');
+DELETE FROM `waypoint_data` WHERE `id`=@PATH;
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES
+(@PATH,1,1592.818,817.3067,149.783,0,0,0,0,100,0),
+(@PATH,2,1601.493,805.8055,146.3105,0,0,0,0,100,0),
+(@PATH,3,1609.685,802.7231,145.2017,0,0,0,0,100,0),
+(@PATH,4,1623.651,794.6301,143.8499,0,0,0,0,100,0),
+(@PATH,5,1615.21,801.1007,144.687,0,0,0,0,100,0),
+(@PATH,6,1605.104,803.2402,145.5161,0,0,0,0,100,0),
+(@PATH,7,1597.137,810.431,147.7381,0,0,0,0,100,0),
+(@PATH,8,1591.998,822.5156,150.5477,0,0,0,0,100,0),
+(@PATH,9,1586.166,840.6243,153.7294,0,0,0,0,100,0),
+(@PATH,10,1584.692,843.8578,154.2673,0,0,0,0,100,0),
+(@PATH,11,1584.178,844.4227,154.4869,0,0,0,0,100,0),
+(@PATH,12,1590.102,830.2843,152.1621,0,0,0,0,100,0);
+-- 0x1C3AE04B801D2140006CCE0000D7B1EE .go 1592.818 817.3067 149.783
+
+-- Pathing for Entry: 29829 'TDB FORMAT'
+SET @NPC := 127070;
+SET @PATH := @NPC * 10;
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=1706.755,`position_y`=857.1785,`position_z`=129.9813 WHERE `guid`=@NPC;
+DELETE FROM `creature_addon` WHERE `guid`=@NPC;
+INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (@NPC,@PATH,0,0,1,0, '');
+DELETE FROM `waypoint_data` WHERE `id`=@PATH;
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES
+(@PATH,1,1706.755,857.1785,129.9813,0,0,0,0,100,0),
+(@PATH,2,1707.281,867.1033,130.2534,0,0,0,0,100,0),
+(@PATH,3,1704.177,879.5166,130.7884,0,0,0,0,100,0),
+(@PATH,4,1691.342,892.488,132.9258,0,0,0,0,100,0),
+(@PATH,5,1679.412,891.944,134.244,0,0,0,0,100,0),
+(@PATH,6,1668.286,882.3208,137.746,0,0,0,0,100,0),
+(@PATH,7,1673.63,888.4031,136.1639,0,0,0,0,100,0),
+(@PATH,8,1687.955,893.6246,133.4256,0,0,0,0,100,0),
+(@PATH,9,1701.138,885.8834,131.8191,0,0,0,0,100,0),
+(@PATH,10,1706.935,871.8005,130.679,0,0,0,0,100,0);
+-- 0x1C3AE04B801D2140006CCE000057B1EE .go 1706.755 857.1785 129.9813
+
+-- Pathing for Entry: 29820 'TDB FORMAT'
+SET @NPC := 127054;
+SET @PATH := @NPC * 10;
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=1627.05,`position_y`=895.2917,`position_z`=145.9627 WHERE `guid`=@NPC;
+DELETE FROM `creature_addon` WHERE `guid`=@NPC;
+INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (@NPC,@PATH,0,0,1,0, '');
+DELETE FROM `waypoint_data` WHERE `id`=@PATH;
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES
+(@PATH,1,1627.05,895.2917,145.9627,0,0,0,0,100,0),
+(@PATH,2,1641.819,895.4995,144.4391,0,0,0,0,100,0),
+(@PATH,3,1646.381,886.3206,142.0332,0,0,0,0,100,0),
+(@PATH,4,1648.376,877.1378,140.8607,0,0,0,0,100,0),
+(@PATH,5,1651.261,870.6509,139.9442,0,0,0,0,100,0),
+(@PATH,6,1648.879,874.7926,140.348,0,0,0,0,100,0),
+(@PATH,7,1648.431,879.759,140.6906,0,0,0,0,100,0),
+(@PATH,8,1643.23,894.2725,143.7524,0,0,0,0,100,0),
+(@PATH,9,1633.633,896.613,144.9795,0,0,0,0,100,0),
+(@PATH,10,1628.168,895.5144,145.8911,0,0,0,0,100,0),
+(@PATH,11,1608.678,886.468,148.1761,0,0,0,0,100,0),
+(@PATH,12,1600.244,880.922,149.9891,0,0,0,0,100,0),
+(@PATH,13,1583.596,870.7088,152.9289,0,0,0,0,100,0),
+(@PATH,14,1593.538,876.7352,151.3219,0,0,0,0,100,0),
+(@PATH,15,1606.508,885.0313,148.7535,0,0,0,0,100,0),
+(@PATH,16,1616.299,891.1467,147.5494,0,0,0,0,100,0),
+(@PATH,17,1627.23,895.3035,145.926,0,0,0,0,100,0),
+(@PATH,18,1641.784,895.3555,144.6143,0,0,0,0,100,0);
+-- 0x1C3AE04B801D1F00006CCE000257B1EE .go 1627.05 895.2917 145.9627
+
+DELETE FROM `creature_formations` WHERE `leaderGUID`=127054;
+INSERT INTO `creature_formations` (`leaderGUID`, `memberGUID`, `dist`, `angle`, `groupAI`, `point_1`, `point_2`) VALUES
+(127054, 127054, 0, 0, 2, 0, 0),
+(127054, 127064, 4, 90, 2, 0, 0);
+
+DELETE FROM `creature_addon` WHERE `guid` IN (127057, 127053, 127063, 127052, 127060, 127055, 127066, 127048, 127049, 127061, 127056, 127050);
+INSERT INTO `creature_addon` (`guid`, `path_id`, `mount`, `bytes1`, `bytes2`, `emote`, `auras`) VALUES
+(127057, 0, 0, 0, 1, 1, ''),
+(127053, 0, 0, 0, 1, 1, ''),
+(127063, 0, 0, 0, 1, 1, ''),
+(127052, 0, 0, 0, 1, 1, ''),
+(127060, 0, 0, 0, 1, 1, ''),
+(127055, 0, 0, 0, 1, 1, ''),
+(127066, 0, 0, 0, 1, 1, ''),
+(127048, 0, 0, 0, 1, 1, ''),
+(127049, 0, 0, 0, 1, 1, ''),
+(127061, 0, 0, 0, 1, 1, ''),
+(127056, 0, 0, 0, 1, 1, ''),
+(127050, 0, 0, 0, 1, 1, '');
diff --git a/sql/updates/world/2015_02_09_04_world.sql b/sql/updates/world/2015_02_09_04_world.sql
new file mode 100644
index 00000000000..7ad7c3411af
--- /dev/null
+++ b/sql/updates/world/2015_02_09_04_world.sql
@@ -0,0 +1,85 @@
+--
+UPDATE `smart_scripts` SET `action_param1`=1 WHERE `entryorguid`=27963 AND `source_type`=0 AND `id`=0 AND `link`=0;
+
+DELETE FROM `creature_formations` WHERE `leaderGUID`=126709;
+INSERT INTO `creature_formations` (`leaderGUID`, `memberGUID`, `dist`, `angle`, `groupAI`, `point_1`, `point_2`) VALUES
+(126709, 126709, 0, 0, 2, 0, 0),
+(126709, 126692, 4, 50, 2, 0, 0),
+(126709, 126693, 4, 310, 2, 0, 0);
+
+DELETE FROM `creature_formations` WHERE `leaderGUID`=126687;
+INSERT INTO `creature_formations` (`leaderGUID`, `memberGUID`, `dist`, `angle`, `groupAI`, `point_1`, `point_2`) VALUES
+(126687, 126687, 0, 0, 2, 0, 0),
+(126687, 126705, 3, 50, 2, 0, 0),
+(126687, 126700, 3, 310, 2, 0, 0);
+
+UPDATE `creature_addon` SET `path_id`=0 WHERE `guid` IN (126711, 126701, 126703);
+DELETE FROM `creature_formations` WHERE `leaderGUID`=126690;
+INSERT INTO `creature_formations` (`leaderGUID`, `memberGUID`, `dist`, `angle`, `groupAI`, `point_1`, `point_2`) VALUES
+(126690, 126690, 0, 0, 2, 0, 0),
+(126690, 126707, 3, 50, 2, 0, 0),
+(126690, 126701, 3, 310, 2, 0, 0);
+
+DELETE FROM `creature_formations` WHERE `leaderGUID`=126691;
+INSERT INTO `creature_formations` (`leaderGUID`, `memberGUID`, `dist`, `angle`, `groupAI`, `point_1`, `point_2`) VALUES
+(126691, 126691, 0, 0, 2, 0, 0),
+(126691, 126708, 3, 50, 2, 0, 0),
+(126691, 126702, 3, 310, 2, 0, 0);
+
+DELETE FROM `creature_formations` WHERE `leaderGUID`=126695;
+INSERT INTO `creature_formations` (`leaderGUID`, `memberGUID`, `dist`, `angle`, `groupAI`, `point_1`, `point_2`) VALUES
+(126695, 126695, 0, 0, 2, 0, 0),
+(126695, 126713, 3, 50, 2, 0, 0),
+(126695, 126703, 3, 310, 2, 0, 0);
+
+DELETE FROM `creature_formations` WHERE `leaderGUID`=126696;
+INSERT INTO `creature_formations` (`leaderGUID`, `memberGUID`, `dist`, `angle`, `groupAI`, `point_1`, `point_2`) VALUES
+(126696, 126696, 0, 0, 2, 0, 0),
+(126696, 126714, 3, 50, 2, 0, 0),
+(126696, 126704, 3, 310, 2, 0, 0);
+
+-- Pathing for Entry: 28582 'TDB FORMAT'
+SET @NPC := 126696;
+SET @PATH := @NPC * 10;
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2 WHERE `guid`=@NPC;
+DELETE FROM `creature_addon` WHERE `guid`=@NPC;
+INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (@NPC,@PATH,0,0,1,0, '');
+DELETE FROM `waypoint_data` WHERE `id`=@PATH;
+INSERT INTO `waypoint_data` (`id`, `point`, `position_x`, `position_y`, `position_z`, `orientation`, `delay`, `move_type`, `action`, `action_chance`, `wpguid`) VALUES
+(1266960, 1, 1180.73, 659.129, 196.233, 0, 0, 0, 0, 100, 3108493),
+(1266960, 2, 1181.3, 667.947, 196.233, 0, 0, 0, 0, 100, 3108495),
+(1266960, 3, 1180.7, 675.583, 196.235, 0, 0, 0, 0, 100, 3108497),
+(1266960, 4, 1177.06, 683.484, 196.235, 0, 0, 0, 0, 100, 3108499),
+(1266960, 7, 1180.73, 659.129, 196.233, 0, 0, 0, 0, 100, 3108493),
+(1266960, 6, 1181.3, 667.947, 196.233, 0, 0, 0, 0, 100, 3108495),
+(1266960, 5, 1180.7, 675.583, 196.235, 0, 0, 0, 0, 100, 3108497),
+(1266960, 8, 1177.75, 651.607, 196.235, 0, 0, 0, 0, 100, 3108501);
+
+DELETE FROM `creature_formations` WHERE `leaderGUID`=126715;
+INSERT INTO `creature_formations` (`leaderGUID`, `memberGUID`, `dist`, `angle`, `groupAI`, `point_1`, `point_2`) VALUES
+(126715, 126715, 0, 0, 2, 0, 0),
+(126715, 126716, 5, 270, 2, 0, 0);
+
+DELETE FROM `creature_formations` WHERE `leaderGUID`=126694;
+INSERT INTO `creature_formations` (`leaderGUID`, `memberGUID`, `dist`, `angle`, `groupAI`, `point_1`, `point_2`) VALUES
+(126694, 126694, 0, 0, 2, 0, 0),
+(126694, 126711, 3, 50, 2, 0, 0),
+(126694, 126712, 3, 310, 2, 0, 0);
+
+UPDATE `creature_template` SET `InhabitType`=4 WHERE `entry`=28055;
+-- Dark Rune Shaper SAI
+SET @ENTRY := 27965;
+UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0 AND `id`=14;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,0,14,0,1,0,100,0,2000,2000,4000,4000,11,50563,0,0,0,0,0,19,28055,50,0,0,0,0,0,"Dark Rune Shaper - On Reset - Cast 'Carve Stone'");
+
+DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=13 AND `SourceGroup`=1 AND `SourceEntry`=50563;
+INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorType`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES
+(13, 1, 50563, 0, 0, 31, 0, 3, 28055, 0, 0, 0, 0, '', 'Carve Stone - only targets Dummy');
+
+DELETE FROM `disables` WHERE `sourceType`=0 AND `entry`=50563;
+INSERT INTO `disables` (`sourceType`, `entry`, `flags`, `params_0`, `params_1`, `comment`) VALUES
+(0, 50563, 64, '', '', 'Ignore LOS for Carve Stone');
+
+UPDATE `creature` SET `spawndist`=8, `MovementType`=1 WHERE `guid` IN (126738, 126745, 126739, 126744);
diff --git a/sql/updates/world/2015_02_09_05_world.sql b/sql/updates/world/2015_02_09_05_world.sql
new file mode 100644
index 00000000000..2486927a2cf
--- /dev/null
+++ b/sql/updates/world/2015_02_09_05_world.sql
@@ -0,0 +1,52 @@
+-- Scourge Reanimator SAI
+SET @GUID := -127410;
+UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=26626;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@GUID AND `source_type`=0;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@GUID,0,0,1,6,0,100,0,0,0,0,0,45,1,1,0,0,0,0,10,127435,26635,0,0,0,0,0,"Scourge Reanimator - On Just Died - Set Data 1 1"),
+(@GUID,0,1,0,61,0,100,0,0,0,0,0,45,1,2,0,0,0,0,10,127426,26635,0,0,0,0,0,"Scourge Reanimator - On Just Died - Set Data 1 2");
+
+
+-- Risen Drakkari Warrior SAI
+SET @ENTRY := 26635;
+UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,0,0,0,0,0,100,6,1000,3000,5000,9500,11,36093,0,0,0,0,0,2,0,0,0,0,0,0,0,"Risen Drakkari Warrior - In Combat - Cast 'Ghost Strike' (Dungeon)"),
+(@ENTRY,0,1,0,0,0,100,6,1000,3000,7250,10000,11,33661,0,0,0,0,0,2,0,0,0,0,0,0,0,"Risen Drakkari Warrior - In Combat - Cast 'Crush Armor' (Dungeon)"),
+(@ENTRY,0,2,0,54,0,100,0,0,0,0,0,89,5,0,0,0,0,0,1,0,0,0,0,0,0,0,"Risen Drakkari Warrior - On Just Summoned - Start Random Movement"),
+(@ENTRY,0,3,7,38,0,100,0,1,1,0,0,53,1,@ENTRY*100+00,0,0,0,2,1,0,0,0,0,0,0,0,"Risen Drakkari Warrior - On Data Set 1 1 - Start Waypoint"),
+(@ENTRY,0,4,8,38,0,100,0,1,2,0,0,53,1,@ENTRY*100+01,0,0,0,2,1,0,0,0,0,0,0,0,"Risen Drakkari Warrior - On Data Set 1 2 - Start Waypoint"),
+(@ENTRY,0,5,0,40,0,100,0,9,@ENTRY*100+00,0,0,12,26635,3,600000,0,0,0,8,0,0,0,-358.38,-592.396,4.37907,3.71398,"Risen Drakkari Warrior - On Waypoint 9 Reached - Summon Creature 'Risen Drakkari Warrior'"),
+(@ENTRY,0,6,0,40,0,100,0,9,@ENTRY*100+01,0,0,12,26636,3,600000,0,0,0,8,0,0,0,-362.385162,-609.420288,2.467764,2.788083,"Risen Drakkari Warrior - On Waypoint 9 Reached - Summon Creature 'Risen Drakkari Soulmage'"),
+(@ENTRY,0,7,0,61,0,100,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Risen Drakkari Warrior - On Data Set 1 1 - Say Line 0"),
+(@ENTRY,0,8,0,61,0,100,0,1,2,0,0,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,"Risen Drakkari Warrior - On Data Set 1 2 - Say Line 1");
+
+DELETE FROM `waypoints` WHERE `entry`=2663500;
+INSERT INTO `waypoints` (`entry`, `pointid`, `position_x`, `position_y`, `position_z`, `point_comment`) VALUES
+(2663500, 1, -358.149, -591.396, 4.8929, 'Risen Drakkari Warrior'),
+(2663500, 2, -355.111, -588.661, 7.43521, 'Risen Drakkari Warrior'),
+(2663500, 3, -351.322, -585.026, 10.995, 'Risen Drakkari Warrior'),
+(2663500, 4, -345.376, -579.253, 11.012, 'Risen Drakkari Warrior'),
+(2663500, 5, -343.792, -579.642, 11.012, 'Risen Drakkari Warrior'),
+(2663500, 6, -346.169, -582.965, 11.012, 'Risen Drakkari Warrior'),
+(2663500, 7, -350.619, -586.543, 10.6995, 'Risen Drakkari Warrior'),
+(2663500, 8, -356.449, -591.583, 5.55874, 'Risen Drakkari Warrior'),
+(2663500, 9, -363.399, -595.822, 2.26113, 'Risen Drakkari Warrior');
+
+DELETE FROM `waypoints` WHERE `entry`=2663501;
+INSERT INTO `waypoints` (`entry`, `pointid`, `position_x`, `position_y`, `position_z`, `point_comment`) VALUES
+(2663501, 1, -361.498, -611.317, 2.82481, 'Risen Drakkari Warrior'),
+(2663501, 2, -358.749, -613.483, 4.91993, 'Risen Drakkari Warrior'),
+(2663501, 3, -351.531, -619.59, 11.0096, 'Risen Drakkari Warrior'),
+(2663501, 4, -349.112, -623.42, 11.0119, 'Risen Drakkari Warrior'),
+(2663501, 5, -347.686, -624.43, 11.0119, 'Risen Drakkari Warrior'),
+(2663501, 6, -346.433, -620.963, 11.0119, 'Risen Drakkari Warrior'),
+(2663501, 7, -350.655, -617.858, 10.8491, 'Risen Drakkari Warrior'),
+(2663501, 8, -356.367, -613.813, 6.09785, 'Risen Drakkari Warrior'),
+(2663501, 9, -366.529, -607.86, 2.26056, 'Risen Drakkari Warrior');
+
+DELETE FROM `creature_text` WHERE `entry`=26635;
+INSERT INTO `creature_text` (`entry`, `groupid`, `id`, `text`, `type`, `language`, `probability`, `emote`, `duration`, `sound`, `BroadcastTextId`, `TextRange`, `comment`) VALUES
+(26635, 0, 0, 'Help mon! There''s too many of dem!', 14, 0, 100, 0, 0, 0, 26538, 0, 'Risen Drakkari Warrior'),
+(26635, 1, 0, 'Backup! We need backup!', 14, 0, 100, 0, 0, 0, 26537, 0, 'Risen Drakkari Warrior');
diff --git a/sql/updates/world/2015_02_09_06_world.sql b/sql/updates/world/2015_02_09_06_world.sql
new file mode 100644
index 00000000000..f4dd026d790
--- /dev/null
+++ b/sql/updates/world/2015_02_09_06_world.sql
@@ -0,0 +1,340 @@
+--
+UPDATE `smart_scripts` SET `action_param1`=1 WHERE `entryorguid` IN (26626, 26637) AND `source_type`=0 AND `id`=0 AND `link`=1;
+UPDATE `creature` SET `spawndist`=5, `MovementType`=1 WHERE `id` IN (26636 ,26625);
+UPDATE `creature` SET `spawndist`=5, `MovementType`=1 WHERE `guid`=127430; /*31261 */
+
+UPDATE `creature_addon` SET `auras`='31261 49852' WHERE `guid` IN (127571, 127569, 127568, 127583, 127567, 127570, 127584);
+
+DELETE FROM `creature_template_addon` WHERE `entry`=26621;
+INSERT INTO `creature_template_addon` (`entry`, `path_id`, `mount`, `bytes1`, `bytes2`, `emote`, `auras`) VALUES
+(26621, 0, 0, 0, 1, 418, '');
+
+
+-- Pathing for Entry: 26624 'TDB FORMAT'
+SET @NPC := 127403;
+SET @PATH := @NPC * 10;
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=-321.1793,`position_y`=-660.2445,`position_z`=10.63094 WHERE `guid`=@NPC;
+DELETE FROM `creature_addon` WHERE `guid`=@NPC;
+INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (@NPC,@PATH,0,0,1,0, '');
+DELETE FROM `waypoint_data` WHERE `id`=@PATH;
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES
+(@PATH,1,-321.1793,-660.2445,10.63094,0,0,0,0,100,0),
+(@PATH,2,-314.265,-658.299,10.85989,0,0,0,0,100,0),
+(@PATH,3,-308.3121,-663.0262,10.8531,0,0,0,0,100,0),
+(@PATH,4,-312.3275,-667.5159,10.43025,0,0,0,0,100,0),
+(@PATH,5,-323.8721,-672.2502,11.15234,0,0,0,0,100,0),
+(@PATH,6,-325.2265,-672.576,11.07057,0,0,0,0,100,0),
+(@PATH,7,-324.1945,-665.3568,10.65234,0,0,0,0,100,0),
+(@PATH,8,-321.2054,-660.1317,10.51689,0,0,0,0,100,0),
+(@PATH,9,-314.2662,-658.2737,10.85989,0,0,0,0,100,0),
+(@PATH,10,-308.2971,-663.0308,10.85604,0,0,0,0,100,0),
+(@PATH,11,-312.3167,-667.5278,10.43211,0,0,0,0,100,0),
+(@PATH,12,-323.8912,-672.2682,11.15234,0,0,0,0,100,0),
+(@PATH,13,-325.2353,-672.5774,11.0714,0,0,0,0,100,0),
+(@PATH,14,-324.1946,-665.3556,10.65234,0,0,0,0,100,0),
+(@PATH,15,-321.2102,-660.1342,10.51981,0,0,0,0,100,0),
+(@PATH,16,-314.2662,-658.2732,10.85989,0,0,0,0,100,0),
+(@PATH,17,-308.2755,-663.0374,10.86023,0,0,0,0,100,0),
+(@PATH,18,-312.2948,-667.5519,10.43588,0,0,0,0,100,0),
+(@PATH,19,-323.9076,-672.2837,11.15234,0,0,0,0,100,0),
+(@PATH,20,-325.265,-672.582,11.07419,0,0,0,0,100,0);
+-- 0x1C16DC4B001A0000005B0C0000578386 .go -321.1793 -660.2445 10.63094
+
+-- Pathing for Entry: 26624 'TDB FORMAT'
+SET @NPC := 127404;
+SET @PATH := @NPC * 10;
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=-318.1556,`position_y`=-640.515,`position_z`=11.95144 WHERE `guid`=@NPC;
+DELETE FROM `creature_addon` WHERE `guid`=@NPC;
+INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (@NPC,@PATH,0,0,1,0, '');
+DELETE FROM `waypoint_data` WHERE `id`=@PATH;
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES
+(@PATH,1,-318.1556,-640.515,11.95144,0,0,0,0,100,0),
+(@PATH,2,-311.1296,-643.6861,11.3687,0,0,0,0,100,0),
+(@PATH,3,-306.9548,-646.1841,10.92374,0,0,0,0,100,0),
+(@PATH,4,-300.4054,-650.3721,11.09798,0,0,0,0,100,0),
+(@PATH,5,-298.4008,-658.082,10.63272,0,0,0,0,100,0),
+(@PATH,6,-298.8151,-659.7013,10.62173,0,0,0,0,100,0),
+(@PATH,7,-310.1207,-661.3427,10.63743,0,0,0,0,100,0),
+(@PATH,8,-314.2844,-659.1246,10.57358,0,0,0,0,100,0),
+(@PATH,9,-316.9409,-657.6439,10.68161,0,0,0,0,100,0),
+(@PATH,10,-325.1304,-655.4464,10.74956,0,0,0,0,100,0),
+(@PATH,11,-329.8129,-650.3148,12.10803,0,0,0,0,100,0),
+(@PATH,12,-329.9256,-647.5079,12.01005,0,0,0,0,100,0),
+(@PATH,13,-328.6924,-642.873,12.058,0,0,0,0,100,0);
+-- 0x1C16DC4B001A0000005B0C0000D78386 .go -318.1556 -640.515 11.95144
+
+-- Pathing for Entry: 26637 'TDB FORMAT'
+SET @NPC := 127444;
+SET @PATH := @NPC * 10;
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=-466.2595,`position_y`=-652.3038,`position_z`=28.78722 WHERE `guid`=@NPC;
+DELETE FROM `creature_addon` WHERE `guid`=@NPC;
+INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (@NPC,@PATH,6469,0,1,0, '');
+DELETE FROM `waypoint_data` WHERE `id`=@PATH;
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES
+(@PATH,1,-466.2595,-652.3038,28.78722,0,0,0,0,100,0),
+(@PATH,2,-478.2595,-652.0538,28.78722,0,0,0,0,100,0);
+
+DELETE FROM `creature_formations` WHERE `leaderGUID`=127444;
+INSERT INTO `creature_formations` (`leaderGUID`, `memberGUID`, `dist`, `angle`, `groupAI`, `point_1`, `point_2`) VALUES
+(127444, 127444, 0, 0, 2, 0, 0),
+(127444, 127456, 4, 90, 2, 0, 0),
+(127444, 127457, 4, 270, 2, 0, 0);
+
+-- Pathing for Entry: 26637 'TDB FORMAT'
+SET @NPC := 127442;
+SET @PATH := @NPC * 10;
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=-499.8308,`position_y`=-705.9434,`position_z`=30.6214 WHERE `guid`=@NPC;
+DELETE FROM `creature_addon` WHERE `guid`=@NPC;
+INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (@NPC,@PATH,6469,0,1,0, '');
+DELETE FROM `waypoint_data` WHERE `id`=@PATH;
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES
+(@PATH,1,-499.8308,-705.9434,30.6214,0,0,0,0,100,0),
+(@PATH,2,-502.4009,-683.0112,30.58796,0,0,0,0,100,0),
+(@PATH,3,-502.3382,-683.26,30.3714,0,0,0,0,100,0),
+(@PATH,4,-502.022,-683.1946,30.61549,0,0,0,0,100,0),
+(@PATH,5,-499.6927,-706.1716,30.6214,0,0,0,0,100,0),
+(@PATH,6,-496.0414,-714.49,30.6214,0,0,0,0,100,0),
+(@PATH,7,-496.3022,-714.5132,30.3714,0,0,0,0,100,0),
+(@PATH,8,-496.2182,-714.349,30.6214,0,0,0,0,100,0),
+(@PATH,9,-499.8963,-705.8741,30.6214,0,0,0,0,100,0);
+-- 0x1C16DC4B001A0340005B0C0000578386 .go -499.8308 -705.9434 30.6214
+
+DELETE FROM `creature_formations` WHERE `leaderGUID`=127442;
+INSERT INTO `creature_formations` (`leaderGUID`, `memberGUID`, `dist`, `angle`, `groupAI`, `point_1`, `point_2`) VALUES
+(127442, 127442, 0, 0, 2, 0, 0),
+(127442, 127443, 4, 90, 2, 0, 0);
+
+DELETE FROM `creature_addon` WHERE `guid` IN (127617, 127589, 127438, 127590, 127428, 127427, 127580, 127579, 127432, 127578, 127433);
+INSERT INTO `creature_addon` (`guid`, `path_id`, `mount`, `bytes1`, `bytes2`, `emote`, `auras`) VALUES
+(127427, 0, 0, 0, 1, 36, ''),
+(127428, 0, 0, 0, 1, 36, ''),
+(127432, 0, 0, 0, 1, 36, ''),
+(127433, 0, 0, 0, 1, 36, ''),
+(127578, 0, 0, 0, 1, 36, ''),
+(127579, 0, 0, 0, 1, 36, ''),
+(127580, 0, 0, 0, 1, 36, ''),
+(127589, 0, 0, 0, 1, 36, ''),
+(127590, 0, 0, 0, 1, 36, ''),
+(127617, 0, 0, 0, 1, 36, '');
+
+-- Pathing for Entry: 26637 'TDB FORMAT'
+SET @NPC := 127446;
+SET @PATH := @NPC * 10;
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=-458.184,`position_y`=-595.712,`position_z`=93.7567 WHERE `guid`=@NPC;
+DELETE FROM `creature_addon` WHERE `guid`=@NPC;
+INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (@NPC,@PATH,26751,0,1,0, '');
+DELETE FROM `waypoint_data` WHERE `id`=@PATH;
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES
+(@PATH, 1, -431.004, -599.244, 96.6243, 0, 0, 1, 0, 100, 0),
+(@PATH, 2, -397.542, -607.933, 89.8221, 0, 0, 1, 0, 100, 0),
+(@PATH, 3, -380.795, -608.944, 84.5094, 0, 0, 1, 0, 100, 0),
+(@PATH, 4, -366.926, -609.622, 86.2929, 0, 0, 1, 0, 100, 0),
+(@PATH, 5, -335.819, -610.248, 92.769, 0, 0, 1, 0, 100, 0),
+(@PATH, 6, -324.31, -610.248, 94.3711, 0, 0, 1, 0, 100, 0),
+(@PATH, 7, -313.428, -610.467, 95.2595, 0, 0, 1, 0, 100, 0),
+(@PATH, 8, -331.964, -610.102, 92.3899, 0, 0, 1, 0, 100, 0),
+(@PATH, 9, -343.592, -609.99, 90.6398, 0, 0, 1, 0, 100, 0),
+(@PATH, 10, -367.122, -609.527, 87.0978, 0, 0, 1, 0, 100, 0),
+(@PATH, 11, -381.21, -609.16, 84.9903, 0, 0, 1, 0, 100, 0),
+(@PATH, 12, -399.507, -608.891, 89.1199, 0, 0, 1, 0, 100, 0),
+(@PATH, 13, -428.922, -609.198, 91.8185, 0, 0, 1, 0, 100, 0);
+
+UPDATE `creature_template` SET `InhabitType`=4 WHERE `entry` IN (26638, 31351);
+
+-- Pathing for Entry: 29237 'TDB FORMAT'
+SET @NPC := 203549;
+SET @PATH := @NPC * 10;
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=6709.566,`position_y`=-4355.494,`position_z`=440.7194 WHERE `guid`=@NPC;
+DELETE FROM `creature_addon` WHERE `guid`=@NPC;
+INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (@NPC,@PATH,0,0,1,0, '');
+DELETE FROM `waypoint_data` WHERE `id`=@PATH;
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES
+(@PATH,1,6709.566,-4355.494,440.7194,0,0,0,0,100,0),
+(@PATH,2,6711.722,-4357.65,440.7194,0,0,0,0,100,0),
+(@PATH,3,6713.885,-4359.814,440.7194,0,0,0,0,100,0),
+(@PATH,4,6716.069,-4361.999,440.7194,0,0,0,0,100,0),
+(@PATH,5,6718.223,-4364.154,440.7194,0,0,0,0,100,0),
+(@PATH,6,6720.4,-4366.332,440.7194,0,0,0,0,100,0),
+(@PATH,7,6722.556,-4368.488,440.7025,0,0,0,0,100,0),
+(@PATH,8,6724.659,-4370.592,440.7025,0,0,0,0,100,0),
+(@PATH,9,6726.705,-4372.757,440.7025,0,0,0,0,100,0),
+(@PATH,10,6728.782,-4374.959,440.7025,0,0,0,0,100,0),
+(@PATH,11,6730.868,-4377.171,440.7025,0,0,0,0,100,0),
+(@PATH,12,6732.948,-4379.376,440.7025,0,0,0,0,100,0),
+(@PATH,13,6735.021,-4381.573,440.6158,0,0,0,0,100,0),
+(@PATH,14,6737.099,-4383.777,440.6158,0,0,0,0,100,0),
+(@PATH,15,6738.558,-4385.286,440.6158,0,0,0,0,100,0),
+(@PATH,16,6740.794,-4387.498,440.6158,0,0,0,0,100,0),
+(@PATH,17,6743.027,-4389.707,440.6158,0,0,0,0,100,0),
+(@PATH,18,6745.267,-4391.922,440.6158,0,0,0,0,100,0),
+(@PATH,19,6747.505,-4394.136,440.6158,0,0,0,0,100,0),
+(@PATH,20,6749.747,-4396.354,440.6158,0,0,0,0,100,0),
+(@PATH,21,6752.003,-4398.586,440.6158,0,0,0,0,100,0),
+(@PATH,22,6754.265,-4400.824,440.6158,0,0,0,0,100,0),
+(@PATH,23,6756.507,-4403.042,440.6158,0,0,0,0,100,0),
+(@PATH,24,6758.502,-4405.03,440.6158,0,0,0,0,100,0),
+(@PATH,25,6760.651,-4407.223,440.6158,0,0,0,0,100,0),
+(@PATH,26,6762.793,-4409.409,440.6158,0,0,0,0,100,0),
+(@PATH,27,6764.924,-4411.583,440.6158,0,0,0,0,100,0),
+(@PATH,28,6767.083,-4413.788,440.7194,0,0,0,0,100,0),
+(@PATH,29,6769.217,-4415.966,440.7194,0,0,0,0,100,0),
+(@PATH,30,6771.352,-4418.145,440.7194,0,0,0,0,100,0),
+(@PATH,31,6773.472,-4420.309,440.7194,0,0,0,0,100,0),
+(@PATH,32,6775.598,-4422.479,440.7194,0,0,0,0,100,0),
+(@PATH,33,6776.916,-4423.868,440.7194,0,0,0,0,100,0),
+(@PATH,34,6779.079,-4426.187,440.7194,0,0,0,0,100,0),
+(@PATH,35,6781.248,-4428.51,440.7194,0,0,0,0,100,0),
+(@PATH,36,6783.421,-4430.838,440.7194,0,0,0,0,100,0),
+(@PATH,37,6785.586,-4433.158,440.7194,0,0,0,0,100,0),
+(@PATH,38,6787.766,-4435.493,440.7009,0,0,0,0,100,0),
+(@PATH,39,6789.926,-4437.807,440.7009,0,0,0,0,100,0),
+(@PATH,40,6791.934,-4439.958,440.7009,0,0,0,0,100,0),
+(@PATH,41,6794.533,-4442.054,440.7009,0,0,0,0,100,0),
+(@PATH,42,6796.933,-4443.941,440.7009,0,0,0,0,100,0),
+(@PATH,43,6799.326,-4445.824,440.7009,0,0,0,0,100,0),
+(@PATH,44,6801.72,-4447.708,440.7194,0,0,0,0,100,0),
+(@PATH,45,6804.107,-4449.586,440.7194,0,0,0,0,100,0),
+(@PATH,46,6805.872,-4450.974,440.7194,0,0,0,0,100,0),
+(@PATH,47,6805.872,-4450.974,440.7194,0,0,0,0,100,0),
+(@PATH,48,6802.628,-4448.422,440.7194,0,0,0,0,100,0),
+(@PATH,49,6801.03,-4447.165,440.7194,0,0,0,0,100,0),
+(@PATH,50,6798.649,-4445.292,440.7009,0,0,0,0,100,0),
+(@PATH,51,6796.252,-4443.406,440.7009,0,0,0,0,100,0),
+(@PATH,52,6793.855,-4441.521,440.7009,0,0,0,0,100,0),
+(@PATH,53,6791.484,-4439.477,440.7009,0,0,0,0,100,0),
+(@PATH,54,6789.404,-4437.248,440.7009,0,0,0,0,100,0),
+(@PATH,55,6787.313,-4435.008,440.7009,0,0,0,0,100,0),
+(@PATH,56,6785.237,-4432.784,440.7194,0,0,0,0,100,0),
+(@PATH,57,6783.164,-4430.563,440.7194,0,0,0,0,100,0),
+(@PATH,58,6781.085,-4428.335,440.7194,0,0,0,0,100,0),
+(@PATH,59,6778.998,-4426.099,440.7194,0,0,0,0,100,0),
+(@PATH,60,6776.91,-4423.862,440.7194,0,0,0,0,100,0),
+(@PATH,61,6775.327,-4422.202,440.7194,0,0,0,0,100,0),
+(@PATH,62,6773.147,-4419.977,440.7194,0,0,0,0,100,0),
+(@PATH,63,6770.978,-4417.763,440.7194,0,0,0,0,100,0),
+(@PATH,64,6768.798,-4415.538,440.7194,0,0,0,0,100,0),
+(@PATH,65,6766.607,-4413.302,440.6158,0,0,0,0,100,0),
+(@PATH,66,6764.424,-4411.074,440.6158,0,0,0,0,100,0),
+(@PATH,67,6762.253,-4408.858,440.6158,0,0,0,0,100,0),
+(@PATH,68,6760.07,-4406.629,440.6158,0,0,0,0,100,0),
+(@PATH,69,6757.998,-4404.517,440.6158,0,0,0,0,100,0),
+(@PATH,70,6755.836,-4402.378,440.6158,0,0,0,0,100,0),
+(@PATH,71,6753.682,-4400.247,440.6158,0,0,0,0,100,0),
+(@PATH,72,6751.511,-4398.099,440.6158,0,0,0,0,100,0),
+(@PATH,73,6749.368,-4395.979,440.6158,0,0,0,0,100,0),
+(@PATH,74,6747.188,-4393.823,440.6158,0,0,0,0,100,0),
+(@PATH,75,6745.053,-4391.711,440.6158,0,0,0,0,100,0),
+(@PATH,76,6742.909,-4389.59,440.6158,0,0,0,0,100,0),
+(@PATH,77,6740.754,-4387.458,440.6158,0,0,0,0,100,0),
+(@PATH,78,6738.592,-4385.319,440.6158,0,0,0,0,100,0),
+(@PATH,79,6736.751,-4383.408,440.6158,0,0,0,0,100,0),
+(@PATH,80,6734.615,-4381.143,440.6158,0,0,0,0,100,0),
+(@PATH,81,6732.473,-4378.873,440.7025,0,0,0,0,100,0),
+(@PATH,82,6730.346,-4376.617,440.7025,0,0,0,0,100,0),
+(@PATH,83,6728.218,-4374.362,440.7025,0,0,0,0,100,0),
+(@PATH,84,6729.046,-4370.898,440.9525,0,0,0,0,100,0),
+(@PATH,85,6724.064,-4369.998,440.7025,0,0,0,0,100,0),
+(@PATH,86,6721.935,-4367.867,440.7025,0,0,0,0,100,0),
+(@PATH,87,6719.804,-4365.736,440.7194,0,0,0,0,100,0),
+(@PATH,88,6717.628,-4363.559,440.7194,0,0,0,0,100,0),
+(@PATH,89,6715.489,-4361.419,440.7194,0,0,0,0,100,0),
+(@PATH,90,6713.351,-4359.279,440.7194,0,0,0,0,100,0),
+(@PATH,91,6711.217,-4357.145,440.7194,0,0,0,0,100,0),
+(@PATH,92,6709.114,-4355.041,440.7194,0,0,0,0,100,0),
+(@PATH,93,6706.909,-4353.476,440.7194,0,0,0,0,100,0),
+(@PATH,94,6704.445,-4351.718,440.7194,0,0,0,0,100,0),
+(@PATH,95,6701.982,-4349.961,440.7194,0,0,0,0,100,0),
+(@PATH,96,6699.487,-4348.182,440.7194,0,0,0,0,100,0),
+(@PATH,97,6697.032,-4346.43,440.7194,0,0,0,0,100,0),
+(@PATH,98,6696.491,-4345.139,440.7194,0,0,0,0,100,0),
+(@PATH,99,6693.5,-4346.004,440.7194,0,0,0,0,100,0),
+(@PATH,100,6690.534,-4346.862,440.7194,0,0,0,0,100,0),
+(@PATH,101,6687.572,-4347.719,440.7582,0,0,0,0,100,0),
+(@PATH,102,6684.732,-4348.541,440.7194,0,0,0,0,100,0),
+(@PATH,103,6683.093,-4349.978,440.7194,0,0,0,0,100,0),
+(@PATH,104,6680.785,-4351.966,440.7194,0,0,0,0,100,0),
+(@PATH,105,6678.49,-4353.942,440.7194,0,0,0,0,100,0),
+(@PATH,106,6676.195,-4355.919,440.7194,0,0,0,0,100,0),
+(@PATH,107,6673.887,-4357.907,440.7194,0,0,0,0,100,0),
+(@PATH,108,6672.325,-4359.7,440.7194,0,0,0,0,100,0),
+(@PATH,109,6670.341,-4362.154,440.7194,0,0,0,0,100,0),
+(@PATH,110,6668.408,-4364.545,440.7194,0,0,0,0,100,0),
+(@PATH,111,6666.455,-4366.962,440.8546,0,0,0,0,100,0),
+(@PATH,112,6664.507,-4369.371,440.9098,0,0,0,0,100,0),
+(@PATH,113,6663.903,-4370.801,441.0089,0,0,0,0,100,0),
+(@PATH,114,6663.605,-4373.883,440.7194,0,0,0,0,100,0),
+(@PATH,115,6663.312,-4376.927,440.7194,0,0,0,0,100,0),
+(@PATH,116,6663.017,-4379.976,440.7194,0,0,0,0,100,0),
+(@PATH,117,6663.048,-4380.506,440.7194,0,0,0,0,100,0),
+(@PATH,118,6665.024,-4382.971,440.7194,0,0,0,0,100,0),
+(@PATH,119,6667.013,-4385.452,440.7194,0,0,0,0,100,0),
+(@PATH,120,6669.01,-4387.943,440.7194,0,0,0,0,100,0),
+(@PATH,121,6670.983,-4390.403,440.7194,0,0,0,0,100,0),
+(@PATH,122,6672.976,-4392.888,440.7194,0,0,0,0,100,0),
+(@PATH,123,6674.643,-4394.981,440.7194,0,0,0,0,100,0),
+(@PATH,124,6676.801,-4397.127,440.7194,0,0,0,0,100,0),
+(@PATH,125,6678.959,-4399.274,440.7194,0,0,0,0,100,0),
+(@PATH,126,6681.114,-4401.417,440.7194,0,0,0,0,100,0),
+(@PATH,127,6683.27,-4403.563,440.7194,0,0,0,0,100,0),
+(@PATH,128,6685.439,-4405.72,440.7194,0,0,0,0,100,0),
+(@PATH,129,6687.588,-4407.858,440.7194,0,0,0,0,100,0),
+(@PATH,130,6689.752,-4410.01,440.7194,0,0,0,0,100,0),
+(@PATH,131,6691.524,-4411.785,440.7194,0,0,0,0,100,0),
+(@PATH,132,6693.658,-4414.005,440.7194,0,0,0,0,100,0),
+(@PATH,133,6695.81,-4416.244,440.7194,0,0,0,0,100,0),
+(@PATH,134,6697.947,-4418.468,440.7194,0,0,0,0,100,0),
+(@PATH,135,6700.072,-4420.679,440.6158,0,0,0,0,100,0),
+(@PATH,136,6702.215,-4422.909,440.6158,0,0,0,0,100,0),
+(@PATH,137,6704.354,-4425.135,440.6158,0,0,0,0,100,0),
+(@PATH,138,6706.516,-4427.385,440.6158,0,0,0,0,100,0),
+(@PATH,139,6708.664,-4429.62,440.6158,0,0,0,0,100,0),
+(@PATH,140,6710.82,-4431.864,440.6158,0,0,0,0,100,0),
+(@PATH,141,6713.229,-4433.922,440.7194,0,0,0,0,100,0),
+(@PATH,142,6715.676,-4436.133,440.7194,0,0,0,0,100,0),
+(@PATH,143,6718.125,-4438.346,440.7194,0,0,0,0,100,0),
+(@PATH,144,6720.556,-4440.542,440.7194,0,0,0,0,100,0),
+(@PATH,145,6722.997,-4442.747,440.7194,0,0,0,0,100,0),
+(@PATH,146,6725.418,-4444.934,440.7194,0,0,0,0,100,0),
+(@PATH,147,6727.87,-4447.148,440.7194,0,0,0,0,100,0),
+(@PATH,148,6730.146,-4449.292,440.7194,0,0,0,0,100,0),
+(@PATH,149,6730.788,-4452.639,440.7194,0,0,0,0,100,0),
+(@PATH,150,6731.166,-4454.971,440.7194,0,0,0,0,100,0),
+(@PATH,151,6731.166,-4457.63,440.7194,0,0,0,0,100,0),
+(@PATH,152,6732.197,-4457.931,440.7194,0,0,0,0,100,0),
+(@PATH,153,6734.809,-4459.646,440.7194,0,0,0,0,100,0),
+(@PATH,154,6737.403,-4461.349,440.7194,0,0,0,0,100,0),
+(@PATH,155,6740.015,-4463.064,440.7194,0,0,0,0,100,0),
+(@PATH,156,6742.618,-4464.773,440.7194,0,0,0,0,100,0),
+(@PATH,157,6745.232,-4466.489,440.7194,0,0,0,0,100,0),
+(@PATH,158,6747.178,-4467.969,440.7194,0,0,0,0,100,0),
+(@PATH,159,6749.505,-4470.075,440.7194,0,0,0,0,100,0),
+(@PATH,160,6751.848,-4472.194,440.7194,0,0,0,0,100,0),
+(@PATH,161,6754.179,-4474.303,440.7194,0,0,0,0,100,0),
+(@PATH,162,6756.502,-4476.405,440.7194,0,0,0,0,100,0),
+(@PATH,163,6758.849,-4478.528,440.7194,0,0,0,0,100,0),
+(@PATH,164,6761.196,-4480.651,440.7194,0,0,0,0,100,0),
+(@PATH,165,6763.529,-4482.762,440.7194,0,0,0,0,100,0),
+(@PATH,166,6765.672,-4484.701,440.7194,0,0,0,0,100,0),
+(@PATH,167,6765.672,-4484.701,440.7194,0,0,0,0,100,0),
+(@PATH,168,6762.613,-4481.934,440.7194,0,0,0,0,100,0),
+(@PATH,169,6761.11,-4480.573,440.7194,0,0,0,0,100,0),
+(@PATH,170,6758.854,-4478.532,440.7194,0,0,0,0,100,0),
+(@PATH,171,6756.6,-4476.493,440.7194,0,0,0,0,100,0),
+(@PATH,172,6754.358,-4474.465,440.7194,0,0,0,0,100,0),
+(@PATH,173,6752.123,-4472.442,440.7194,0,0,0,0,100,0),
+(@PATH,174,6749.883,-4470.417,440.7194,0,0,0,0,100,0),
+(@PATH,175,6747.618,-4468.367,440.7194,0,0,0,0,100,0),
+(@PATH,176,6747.454,-4468.149,440.7194,0,0,0,0,100,0),
+(@PATH,177,6745.778,-4463.783,440.7194,0,0,0,0,100,0),
+(@PATH,178,6743.626,-4461.631,440.7194,0,0,0,0,100,0),
+(@PATH,179,6741.465,-4459.471,440.7194,0,0,0,0,100,0),
+(@PATH,180,6739.305,-4457.311,440.7194,0,0,0,0,100,0),
+(@PATH,181,6737.125,-4455.129,440.7194,0,0,0,0,100,0),
+(@PATH,182,6734.964,-4452.969,440.7194,0,0,0,0,100,0),
+(@PATH,183,6731.37,-4451.403,440.7194,0,0,0,0,100,0);
+-- 0x1C091047601C8D4000000B0000572225 .go 6709.566 -4355.494 440.7194
+
+DELETE FROM `creature_formations` WHERE `leaderGUID`=203549;
+INSERT INTO `creature_formations` (`leaderGUID`, `memberGUID`, `dist`, `angle`, `groupAI`, `point_1`, `point_2`) VALUES
+(203549, 203549, 0, 0, 2, 0, 0),
+(203549, 203562, 3, 270, 2, 0, 0);
diff --git a/sql/updates/world/2015_02_09_07_world.sql b/sql/updates/world/2015_02_09_07_world.sql
new file mode 100644
index 00000000000..89c125a9c2e
--- /dev/null
+++ b/sql/updates/world/2015_02_09_07_world.sql
@@ -0,0 +1,461 @@
+-- Pathing for Entry: 28582 'TDB FORMAT'
+SET @NPC := 126942;
+SET @PATH := @NPC * 10;
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2 WHERE `guid`=@NPC;
+DELETE FROM `creature_addon` WHERE `guid`=@NPC;
+INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (@NPC,@PATH,0,0,1,69, '');
+DELETE FROM `waypoint_data` WHERE `id`=@PATH;
+INSERT INTO `waypoint_data` (`id`, `point`, `position_x`, `position_y`, `position_z`, `orientation`, `delay`, `move_type`, `action`, `action_chance`, `wpguid`) VALUES
+(1269420, 1, 1336.35, 97.1842, 40.1805, 0, 0, 0, 0, 100, 0),
+(1269420, 2, 1337.76, 97.2226, 40.1805, 0, 0, 0, 0, 100, 0),
+(1269420, 3, 1339.43, 101.827, 40.1805, 0, 0, 0, 0, 100, 0),
+(1269420, 4, 1337.51, 102.338, 40.1805, 0, 0, 0, 0, 100, 0),
+(1269420, 5, 1337.45, 101.881, 40.1805, 0, 4000, 0, 0, 100, 0),
+(1269420, 6, 1327.41, 101.553, 40.1805, 0, 0, 0, 0, 100, 0),
+(1269420, 7, 1327.35, 100.975, 40.1805, 0, 4000, 0, 0, 100, 0),
+(1269420, 8, 1325.64, 100.623, 40.1805, 0, 0, 0, 0, 100, 0),
+(1269420, 9, 1325.01, 96.4632, 40.1805, 0, 0, 0, 0, 100, 0),
+(1269420, 10, 1327.11, 96.4808, 40.1805, 0, 0, 0, 0, 100, 0),
+(1269420, 11, 1327.07, 96.8291, 40.1805, 0, 4000, 0, 0, 100, 0);
+
+DELETE FROM `creature_template_addon` WHERE `entry` IN (28582, 30974);
+INSERT INTO `creature_template_addon` (`entry`, `path_id`, `mount`, `bytes1`, `bytes2`, `emote`, `auras`) VALUES
+(28582, 0, 0, 0, 0, 69, ''),
+(30974, 0, 0, 0, 0, 69, '');
+
+-- Pathing for Entry: 28582 'TDB FORMAT'
+SET @NPC := 126926;
+SET @PATH := @NPC * 10;
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2 WHERE `guid`=@NPC;
+DELETE FROM `creature_addon` WHERE `guid`=@NPC;
+INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (@NPC,@PATH,0,0,1,0, '');
+DELETE FROM `waypoint_data` WHERE `id`=@PATH;
+INSERT INTO `waypoint_data` (`id`, `point`, `position_x`, `position_y`, `position_z`, `orientation`, `delay`, `move_type`, `action`, `action_chance`, `wpguid`) VALUES
+(1269260, 1, 1377.28, 64.533, 48.8931, 0, 0, 0, 0, 100, 0),
+(1269260, 2, 1377.69, 64.9436, 48.8931, 0, 6000, 0, 0, 100, 0),
+(1269260, 3, 1359.25, 81.9585, 41.0455, 0, 0, 0, 0, 100, 0),
+(1269260, 4, 1359.68, 82.5069, 41.0204, 0, 6000, 0, 0, 100, 0);
+
+-- Pathing for Entry: 28582 'TDB FORMAT'
+SET @NPC := 126915;
+SET @PATH := @NPC * 10;
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2 WHERE `guid`=@NPC;
+DELETE FROM `creature_addon` WHERE `guid`=@NPC;
+INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (@NPC,@PATH,0,0,1,69, '');
+DELETE FROM `waypoint_data` WHERE `id`=@PATH;
+INSERT INTO `waypoint_data` (`id`, `point`, `position_x`, `position_y`, `position_z`, `orientation`, `delay`, `move_type`, `action`, `action_chance`, `wpguid`) VALUES
+(1269150, 1, 1393.45, 47.8648, 50.0383, 0, 6000, 0, 0, 100, 0),
+(1269150, 2, 1401.61, 46.3271, 50.0383, 0, 0, 0, 0, 100, 0),
+(1269150, 3, 1401.81, 45.7834, 50.0383, 0, 6000, 0, 0, 100, 0),
+(1269150, 4, 1394.37, 48.5111, 50.0383, 0, 0, 0, 0, 100, 0);
+
+-- Pathing for Entry: 28582 'TDB FORMAT'
+SET @NPC := 126925;
+SET @PATH := @NPC * 10;
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2 WHERE `guid`=@NPC;
+DELETE FROM `creature_addon` WHERE `guid`=@NPC;
+INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (@NPC,@PATH,0,0,1,69, '');
+DELETE FROM `waypoint_data` WHERE `id`=@PATH;
+INSERT INTO `waypoint_data` (`id`, `point`, `position_x`, `position_y`, `position_z`, `orientation`, `delay`, `move_type`, `action`, `action_chance`, `wpguid`) VALUES
+(1269250, 1, 1414.64, 32.7402, 50.2271, 0, 0, 0, 0, 100, 0),
+(1269250, 2, 1419.4, 32.7552, 53.1143, 0, 0, 0, 0, 100, 0),
+(1269250, 3, 1429.45, 32.845, 58.7644, 0, 0, 0, 0, 100, 0),
+(1269250, 4, 1433.53, 32.8176, 58.7671, 0, 0, 0, 0, 100, 0),
+(1269250, 5, 1434.02, 32.0269, 58.7671, 0, 6000, 0, 0, 100, 0),
+(1269250, 6, 1430.18, 32.2594, 58.7671, 0, 0, 0, 0, 100, 0),
+(1269250, 7, 1422.24, 32.287, 54.8356, 0, 0, 0, 0, 100, 0),
+(1269250, 8, 1414.43, 32.6758, 50.0945, 0, 0, 0, 0, 100, 0),
+(1269250, 9, 1407.78, 32.7916, 50.0383, 0, 0, 0, 0, 100, 0),
+(1269250, 10, 1406.76, 32.718, 50.0383, 0, 6000, 0, 0, 100, 0);
+
+-- Pathing for Entry: 28582 'TDB FORMAT'
+SET @NPC := 126924;
+SET @PATH := @NPC * 10;
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2 WHERE `guid`=@NPC;
+DELETE FROM `creature_addon` WHERE `guid`=@NPC;
+INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (@NPC,@PATH,0,0,1,69, '');
+DELETE FROM `waypoint_data` WHERE `id`=@PATH;
+INSERT INTO `waypoint_data` (`id`, `point`, `position_x`, `position_y`, `position_z`, `orientation`, `delay`, `move_type`, `action`, `action_chance`, `wpguid`) VALUES
+(1269240, 1, 1358.66, -8.12641, 41.1612, 0, 0, 0, 0, 100, 0),
+(1269240, 2, 1359.22, -8.72624, 41.1518, 0, 6000, 0, 0, 100, 0),
+(1269240, 3, 1376.27, 9.68446, 48.9541, 0, 0, 0, 0, 100, 0),
+(1269240, 4, 1376.68, 9.25245, 48.95, 0, 6000, 0, 0, 100, 0);
+
+-- Pathing for Entry: 28582 'TDB FORMAT'
+SET @NPC := 126933;
+SET @PATH := @NPC * 10;
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2 WHERE `guid`=@NPC;
+DELETE FROM `creature_addon` WHERE `guid`=@NPC;
+INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (@NPC,@PATH,0,0,1,69, '');
+DELETE FROM `waypoint_data` WHERE `id`=@PATH;
+INSERT INTO `waypoint_data` (`id`, `point`, `position_x`, `position_y`, `position_z`, `orientation`, `delay`, `move_type`, `action`, `action_chance`, `wpguid`) VALUES
+(1269330, 1, 1353.19, 3.42894, 42.4993, 0, 0, 0, 0, 100, 0),
+(1269330, 2, 1352.77, 3.83879, 42.4978, 0, 6000, 0, 0, 100, 0),
+(1269330, 3, 1368.11, 18.3238, 49.0597, 0, 0, 0, 0, 100, 0),
+(1269330, 4, 1367.63, 18.8363, 49.0662, 0, 6000, 0, 0, 100, 0);
+
+-- Pathing for Entry: 28582 'TDB FORMAT'
+SET @NPC := 126939;
+SET @PATH := @NPC * 10;
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2 WHERE `guid`=@NPC;
+DELETE FROM `creature_addon` WHERE `guid`=@NPC;
+INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (@NPC,@PATH,0,0,1,69, '');
+DELETE FROM `waypoint_data` WHERE `id`=@PATH;
+INSERT INTO `waypoint_data` (`id`, `point`, `position_x`, `position_y`, `position_z`, `orientation`, `delay`, `move_type`, `action`, `action_chance`, `wpguid`) VALUES
+(1269390, 1, 1324.11, -36.4178, 40.1806, 0, 0, 0, 0, 100, 0),
+(1269390, 2, 1320.59, -33.3142, 40.1806, 0, 0, 0, 0, 100, 0),
+(1269390, 3, 1322.34, -31.4373, 40.1806, 0, 0, 0, 0, 100, 0),
+(1269390, 4, 1323.13, -32.1258, 40.1806, 0, 6000, 0, 0, 100, 0),
+(1269390, 5, 1321.68, -35.1774, 40.1806, 0, 0, 0, 0, 100, 0),
+(1269390, 6, 1324.78, -37.6497, 40.1806, 0, 0, 0, 0, 100, 0),
+(1269390, 7, 1340.48, -36.3091, 40.1806, 0, 0, 0, 0, 100, 0),
+(1269390, 8, 1341.82, -34.5498, 40.1806, 0, 0, 0, 0, 100, 0),
+(1269390, 9, 1342.51, -31.7143, 40.1806, 0, 0, 0, 0, 100, 0),
+(1269390, 10, 1343.71, -26.8389, 40.1806, 0, 0, 0, 0, 100, 0),
+(1269390, 11, 1343.06, -26.1627, 40.1806, 0, 6000, 0, 0, 100, 0),
+(1269390, 12, 1341.99, -31.7877, 40.1806, 0, 0, 0, 0, 100, 0),
+(1269390, 13, 1341.6, -32.2199, 40.1806, 0, 6000, 0, 0, 100, 0),
+(1269390, 14, 1341.2, -36.4011, 40.1806, 0, 0, 0, 0, 100, 0),
+(1269390, 15, 1325.72, -38.8983, 40.1806, 0, 0, 0, 0, 100, 0);
+
+
+-- Pathing for Entry: 28582 'TDB FORMAT'
+SET @NPC := 126941;
+SET @PATH := @NPC * 10;
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2 WHERE `guid`=@NPC;
+DELETE FROM `creature_addon` WHERE `guid`=@NPC;
+INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (@NPC,@PATH,0,0,1,69, '');
+DELETE FROM `waypoint_data` WHERE `id`=@PATH;
+INSERT INTO `waypoint_data` (`id`, `point`, `position_x`, `position_y`, `position_z`, `orientation`, `delay`, `move_type`, `action`, `action_chance`, `wpguid`) VALUES
+(1269410, 1, 1267.08, -35.0841, 33.5057, 0, 6000, 0, 0, 100, 0),
+(1269410, 2, 1253.98, -31.204, 33.5057, 0, 0, 0, 0, 100, 0),
+(1269410, 3, 1252.76, -28.9487, 33.5057, 0, 6000, 0, 0, 100, 0),
+(1269410, 4, 1255.2, -33.8478, 33.5057, 0, 0, 0, 0, 100, 0),
+(1269410, 5, 1256.82, -34.5311, 33.5057, 0, 6000, 0, 0, 100, 0),
+(1269410, 6, 1256.49, -38.1348, 33.5057, 0, 0, 0, 0, 100, 0),
+(1269410, 7, 1259.85, -39.4856, 33.5057, 0, 0, 0, 0, 100, 0),
+(1269410, 8, 1264.16, -36.9788, 33.5057, 0, 0, 0, 0, 100, 0);
+
+-- Pathing for Entry: 28582 'TDB FORMAT'
+SET @NPC := 126917;
+SET @PATH := @NPC * 10;
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2 WHERE `guid`=@NPC;
+DELETE FROM `creature_addon` WHERE `guid`=@NPC;
+INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (@NPC,@PATH,0,0,1,0, '');
+DELETE FROM `waypoint_data` WHERE `id`=@PATH;
+INSERT INTO `waypoint_data` (`id`, `point`, `position_x`, `position_y`, `position_z`, `orientation`, `delay`, `move_type`, `action`, `action_chance`, `wpguid`) VALUES
+(1269170, 1, 1268.62, 32.3739, 33.5057, 0, 0, 0, 0, 100, 0),
+(1269170, 2, 1270.03, 32.3423, 33.5057, 0, 6000, 0, 0, 100, 0),
+(1269170, 3, 1269.46, 0.489199, 33.5057, 0, 0, 0, 0, 100, 0),
+(1269170, 4, 1269.81, 0.525176, 33.5057, 0, 6000, 0, 0, 100, 0);
+
+-- Pathing for Entry: 28582 'TDB FORMAT'
+SET @NPC := 126940;
+SET @PATH := @NPC * 10;
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2 WHERE `guid`=@NPC;
+DELETE FROM `creature_addon` WHERE `guid`=@NPC;
+INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (@NPC,@PATH,0,0,1,0, '');
+DELETE FROM `waypoint_data` WHERE `id`=@PATH;
+INSERT INTO `waypoint_data` (`id`, `point`, `position_x`, `position_y`, `position_z`, `orientation`, `delay`, `move_type`, `action`, `action_chance`, `wpguid`) VALUES
+(1269400, 1, 1269.07, 39.2463, 33.5055, 0, 0, 0, 0, 100, 0),
+(1269400, 2, 1269.94, 39.279, 33.5055, 0, 6000, 0, 0, 100, 0),
+(1269400, 3, 1269, 68.7823, 33.5055, 0, 0, 0, 0, 100, 0),
+(1269400, 4, 1269.8, 68.7924, 33.5055, 0, 6000, 0, 0, 100, 0);
+
+-- Pathing for Entry: 28582 'TDB FORMAT'
+SET @NPC := 126919;
+SET @PATH := @NPC * 10;
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2 WHERE `guid`=@NPC;
+DELETE FROM `creature_addon` WHERE `guid`=@NPC;
+INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (@NPC,@PATH,0,0,1,0, '');
+DELETE FROM `waypoint_data` WHERE `id`=@PATH;
+INSERT INTO `waypoint_data` (`id`, `point`, `position_x`, `position_y`, `position_z`, `orientation`, `delay`, `move_type`, `action`, `action_chance`, `wpguid`) VALUES
+(1269190, 1, 1254.43, 38.9632, 33.5056, 0, 0, 0, 0, 100, 0),
+(1269190, 2, 1254.33, 32.6571, 35.0186, 0, 0, 0, 0, 100, 0),
+(1269190, 3, 1254.73, 9.53858, 33.5056, 0, 0, 0, 0, 100, 0),
+(1269190, 4, 1254.26, 9.55597, 33.5056, 0, 6000, 0, 0, 100, 0),
+(1269190, 5, 1254.61, 28.5055, 33.8212, 0, 0, 0, 0, 100, 0),
+(1269190, 6, 1254.59, 33.0582, 35.0141, 0, 0, 0, 0, 100, 0),
+(1269190, 7, 1254.56, 55.7588, 33.5058, 0, 0, 0, 0, 100, 0),
+(1269190, 8, 1254.14, 55.7403, 33.5058, 0, 6000, 0, 0, 100, 0);
+
+-- Pathing for Entry: 28582 'TDB FORMAT'
+SET @NPC := 126918;
+SET @PATH := 1269180;
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2 WHERE `guid`=@NPC;
+DELETE FROM `creature_addon` WHERE `guid`=@NPC;
+INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (@NPC,@PATH,0,0,1,69, '');
+DELETE FROM `waypoint_data` WHERE `id`=@PATH;
+INSERT INTO `waypoint_data` (`id`, `point`, `position_x`, `position_y`, `position_z`, `orientation`, `delay`, `move_type`, `action`, `action_chance`, `wpguid`) VALUES
+(1269180, 1, 1252.42, 106.457, 33.5057, 0, 0, 0, 0, 100, 0),
+(1269180, 2, 1249.45, 101.782, 33.5057, 0, 0, 0, 0, 100, 0),
+(1269180, 3, 1250.39, 100.591, 33.5057, 0, 0, 0, 0, 100, 0),
+(1269180, 4, 1251.37, 101.803, 33.5057, 0, 6000, 0, 0, 100, 0),
+(1269180, 5, 1250.43, 104.446, 33.5057, 0, 0, 0, 0, 100, 0),
+(1269180, 6, 1259.91, 113.097, 33.5057, 0, 0, 0, 0, 100, 0),
+(1269180, 7, 1265.25, 112.968, 33.5057, 0, 0, 0, 0, 100, 0),
+(1269180, 8, 1273.82, 106.516, 33.5057, 0, 0, 0, 0, 100, 0),
+(1269180, 9, 1274.95, 101.531, 33.5057, 0, 0, 0, 0, 100, 0),
+(1269180, 10, 1272.59, 100.018, 33.5057, 0, 0, 0, 0, 100, 0),
+(1269180, 11, 1272.4, 100.808, 33.5057, 0, 6000, 0, 0, 100, 0),
+(1269180, 12, 1275.02, 103.29, 33.5057, 0, 0, 0, 0, 100, 0),
+(1269180, 13, 1273.92, 106.241, 33.5057, 0, 0, 0, 0, 100, 0),
+(1269180, 14, 1267.23, 108.337, 33.5057, 0, 0, 0, 0, 100, 0),
+(1269180, 15, 1264.99, 108.96, 33.5057, 0, 6000, 0, 0, 100, 0),
+(1269180, 16, 1263.4, 112.342, 33.5057, 0, 0, 0, 0, 100, 0);
+
+UPDATE `creature` SET `spawndist`=8, `MovementType`=1 WHERE `id`=28585;
+UPDATE `creature` SET `spawndist`=5, `MovementType`=1 WHERE `id` IN (28825, 28547, 28584, 28583);
+
+-- Pathing for Entry: 28583 'TDB FORMAT'
+SET @NPC := 126954;
+SET @PATH := @NPC * 10;
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=1311.234,`position_y`=-158.9818,`position_z`=52.27496 WHERE `guid`=@NPC;
+DELETE FROM `creature_addon` WHERE `guid`=@NPC;
+INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (@NPC,@PATH,0,0,1,0, '');
+DELETE FROM `waypoint_data` WHERE `id`=@PATH;
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES
+(@PATH,1,1311.234,-158.9818,52.27496,0,0,0,0,100,0),
+(@PATH,2,1312.317,-174.7872,52.27221,0,0,0,0,100,0),
+(@PATH,3,1328.705,-186.7419,52.27302,0,0,0,0,100,0),
+(@PATH,4,1341.044,-184.8856,52.27322,0,0,0,0,100,0),
+(@PATH,5,1354.387,-173.1809,52.27328,0,0,0,0,100,0),
+(@PATH,6,1354.742,-169.7169,52.27325,0,0,0,0,100,0),
+(@PATH,7,1348.927,-148.5091,52.27411,0,0,0,0,100,0),
+(@PATH,8,1335.543,-142.5214,52.27379,0,0,0,0,100,0),
+(@PATH,9,1318.144,-146.4185,52.31124,0,0,0,0,100,0),
+(@PATH,10,1311.167,-158.8409,52.27437,0,0,0,0,100,0);
+-- 0x1C307C4B401BE9C000021700025672BB .go 1311.234 -158.9818 52.27496
+
+DELETE FROM `creature_formations` WHERE `leaderGUID`=126954;
+INSERT INTO `creature_formations` (`leaderGUID`, `memberGUID`, `dist`, `angle`, `groupAI`, `point_1`, `point_2`) VALUES
+(126954, 126954, 0, 0, 2, 0, 0),
+(126954, 126955, 3, 0, 2, 0, 0);
+
+-- Pathing for Entry: 28583 'TDB FORMAT'
+SET @NPC := 76296;
+SET @PATH := @NPC * 10;
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2 WHERE `guid`=@NPC;
+DELETE FROM `creature_addon` WHERE `guid`=@NPC;
+INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (@NPC,@PATH,0,0,1,0, '');
+DELETE FROM `waypoint_data` WHERE `id`=@PATH;
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES
+(762960, 1, 1176.14, -298.09, 52.3436, 0, 0, 0, 0, 100, 0),
+(762960, 2, 1176.3, -246.576, 52.3528, 0, 0, 0, 0, 100, 0);
+
+-- Pathing for Entry: 28583 'TDB FORMAT'
+SET @NPC := 76297;
+SET @PATH := @NPC * 10;
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2 WHERE `guid`=@NPC;
+DELETE FROM `creature_addon` WHERE `guid`=@NPC;
+INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (@NPC,@PATH,0,0,1,0, '');
+DELETE FROM `waypoint_data` WHERE `id`=@PATH;
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES
+(762970, 1, 1180.57, -315.473, 52.3378, 0, 0, 0, 0, 100, 0),
+(762970, 2, 1171.95, -315.333, 52.3378, 0, 0, 0, 0, 100, 0),
+(762970, 3, 1171.02, -327.394, 52.6927, 0, 0, 0, 0, 100, 0),
+(762970, 4, 1183.75, -330.38, 52.3378, 0, 0, 0, 0, 100, 0),
+(762970, 5, 1183.62, -317.868, 52.3378, 0, 0, 0, 0, 100, 0);
+
+UPDATE `creature` SET `spawndist`=8,`MovementType`=1 WHERE `guid`=76298;
+UPDATE `smart_scripts` SET `action_param1`=1 WHERE `entryorguid`=28547 AND `source_type`=0 AND `id`=0 AND `link`=0;
+
+-- Pathing for Entry: 28583 'TDB FORMAT'
+SET @NPC := 126874;
+SET @PATH := @NPC * 10;
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2 WHERE `guid`=@NPC;
+DELETE FROM `creature_addon` WHERE `guid`=@NPC;
+INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (@NPC,@PATH,0,0,1,0, '');
+DELETE FROM `waypoint_data` WHERE `id`=@PATH;
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES
+(1268740, 1, 1118.22, -248.207, 56.8882, 0, 0, 1, 0, 100, 0),
+(1268740, 2, 1118.62, -274.988, 56.8831, 0, 0, 1, 0, 100, 0);
+
+DELETE FROM `creature_addon` WHERE `guid`=@NPC;
+INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (@NPC,@PATH,0,0,1,69, '');
+
+DELETE FROM `creature_addon` WHERE `guid` IN (126904, 126921, 126903, 126911, 126928, 126929, 126930, 126931, 126912);
+INSERT INTO `creature_addon` (`guid`, `path_id`, `mount`, `bytes1`, `bytes2`, `emote`, `auras`) VALUES
+(126911, 0, 0, 0, 1, 69, ''),
+(126928, 0, 0, 0, 1, 69, ''),
+(126929, 0, 0, 0, 1, 69, ''),
+(126930, 0, 0, 0, 1, 69, ''),
+(126931, 0, 0, 0, 1, 69, ''),
+(126912, 0, 0, 0, 1, 69, ''),
+(126903, 0, 0, 0, 1, 69, ''),
+(126921, 0, 0, 0, 1, 69, ''),
+(126904, 0, 0, 0, 1, 69, '');
+
+
+UPDATE `smart_scripts` SET `action_param1`=1 WHERE `entryorguid`=28838 AND `source_type`=0 AND `id`=0 AND `link`=1;
+-- Pathing for Entry: 28838 'TDB FORMAT'
+SET @NPC := 126938;
+SET @PATH := @NPC * 10;
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=1096.845,`position_y`=-166.1139,`position_z`=58.68692 WHERE `guid`=@NPC;
+DELETE FROM `creature_addon` WHERE `guid`=@NPC;
+INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (@NPC,@PATH,0,0,1,0, '');
+DELETE FROM `waypoint_data` WHERE `id`=@PATH;
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES
+(@PATH,1,1096.845,-166.1139,58.68692,0,0,0,0,100,0),
+(@PATH,2,1091.599,-152.8187,61.33255,0,0,0,0,100,0),
+(@PATH,3,1076.235,-141.8798,61.18824,0,0,0,0,100,0),
+(@PATH,4,1060.763,-145.9723,61.39173,0,0,0,0,100,0),
+(@PATH,5,1049.471,-171.0271,58.53773,0,0,0,0,100,0),
+(@PATH,6,1055.509,-189.0143,58.94555,0,0,0,0,100,0),
+(@PATH,7,1073.278,-198.3343,59.91864,0,0,0,0,100,0),
+(@PATH,8,1091.632,-153.0076,61.24912,0,0,0,0,100,0),
+(@PATH,9,1076.185,-141.7971,61.18842,0,0,0,0,100,0),
+(@PATH,10,1060.682,-145.9083,61.35257,0,0,0,0,100,0),
+(@PATH,11,1049.497,-171.1528,58.5324,0,0,0,0,100,0),
+(@PATH,12,1055.636,-188.8313,58.83115,0,0,0,0,100,0),
+(@PATH,13,1073.335,-198.4241,59.88276,0,0,0,0,100,0),
+(@PATH,14,1083.434,-195.9087,59.84556,0,0,0,0,100,0),
+(@PATH,15,1095.76,-180.6208,58.73315,0,0,0,0,100,0),
+(@PATH,16,1096.683,-166.0892,58.71755,0,0,0,0,100,0),
+(@PATH,17,1091.595,-152.9597,61.3679,0,0,0,0,100,0),
+(@PATH,18,1076.179,-141.7626,61.18819,0,0,0,0,100,0),
+(@PATH,19,1060.637,-145.9161,61.39425,0,0,0,0,100,0),
+(@PATH,20,1049.585,-171.0794,58.53699,0,0,0,0,100,0),
+(@PATH,21,1055.467,-188.91,58.98404,0,0,0,0,100,0),
+(@PATH,22,1073.328,-198.439,59.93514,0,0,0,0,100,0),
+(@PATH,23,1083.423,-195.8686,59.93195,0,0,0,0,100,0),
+(@PATH,24,1095.775,-180.6299,58.52916,0,0,0,0,100,0),
+(@PATH,25,1096.451,-166.0939,58.80622,0,0,0,0,100,0),
+(@PATH,26,1091.409,-152.9162,61.46411,0,0,0,0,100,0),
+(@PATH,27,1076.1,-141.8916,61.18857,0,0,0,0,100,0),
+(@PATH,28,1060.651,-145.9504,61.40473,0,0,0,0,100,0),
+(@PATH,29,1049.581,-171.0241,58.53423,0,0,0,0,100,0),
+(@PATH,30,1055.498,-188.95,59.02743,0,0,0,0,100,0),
+(@PATH,31,1073.29,-198.3899,60.07246,0,0,0,0,100,0),
+(@PATH,32,1083.527,-195.7341,59.79642,0,0,0,0,100,0),
+(@PATH,33,1095.63,-180.5483,58.69926,0,0,0,0,100,0),
+(@PATH,34,1096.488,-165.9498,58.67723,0,0,0,0,100,0),
+(@PATH,35,1091.622,-152.8619,61.2616,0,0,0,0,100,0),
+(@PATH,36,1076.115,-141.9001,61.18835,0,0,0,0,100,0),
+(@PATH,37,1060.789,-145.8449,61.36668,0,0,0,0,100,0),
+(@PATH,38,1049.622,-171.201,58.53172,0,0,0,0,100,0),
+(@PATH,39,1055.608,-188.9287,58.85689,0,0,0,0,100,0),
+(@PATH,40,1073.355,-198.4655,59.88638,0,0,0,0,100,0),
+(@PATH,41,1083.45,-195.9156,59.8475,0,0,0,0,100,0),
+(@PATH,42,1095.778,-180.6123,58.73478,0,0,0,0,100,0),
+(@PATH,43,1096.679,-166.0957,58.71638,0,0,0,0,100,0),
+(@PATH,44,1091.597,-152.9846,61.35995,0,0,0,0,100,0),
+(@PATH,45,1076.191,-141.7885,61.1882,0,0,0,0,100,0),
+(@PATH,46,1060.679,-145.9348,61.39341,0,0,0,0,100,0),
+(@PATH,47,1049.618,-171.0668,58.53717,0,0,0,0,100,0),
+(@PATH,48,1055.49,-188.8295,58.96278,0,0,0,0,100,0),
+(@PATH,49,1073.294,-198.3665,59.92146,0,0,0,0,100,0),
+(@PATH,50,1083.419,-195.9023,59.84375,0,0,0,0,100,0),
+(@PATH,51,1095.709,-180.6607,58.52328,0,0,0,0,100,0),
+(@PATH,52,1096.673,-166.108,58.71417,0,0,0,0,100,0),
+(@PATH,53,1091.596,-152.9702,61.36453,0,0,0,0,100,0),
+(@PATH,54,1076.134,-141.7107,61.1886,0,0,0,0,100,0),
+(@PATH,55,1060.718,-145.7299,61.40303,0,0,0,0,100,0),
+(@PATH,56,1049.66,-170.9935,58.53466,0,0,0,0,100,0),
+(@PATH,57,1055.598,-189.0659,59.09127,0,0,0,0,100,0),
+(@PATH,58,1073.295,-198.3694,59.92171,0,0,0,0,100,0),
+(@PATH,59,1083.648,-195.8578,59.9237,0,0,0,0,100,0),
+(@PATH,60,1095.808,-180.5819,58.69283,0,0,0,0,100,0),
+(@PATH,61,1096.681,-166.0555,58.68321,0,0,0,0,100,0),
+(@PATH,62,1091.416,-153.0063,61.45639,0,0,0,0,100,0),
+(@PATH,63,1076.171,-141.768,61.18841,0,0,0,0,100,0),
+(@PATH,64,1060.65,-145.894,61.35575,0,0,0,0,100,0),
+(@PATH,65,1049.462,-171.1664,58.5322,0,0,0,0,100,0),
+(@PATH,66,1055.634,-188.8381,58.83295,0,0,0,0,100,0),
+(@PATH,67,1073.464,-198.508,59.93453,0,0,0,0,100,0),
+(@PATH,68,1083.448,-195.6998,59.78678,0,0,0,0,100,0),
+(@PATH,69,1095.786,-180.5919,58.69092,0,0,0,0,100,0),
+(@PATH,70,1096.673,-166.0698,58.68402,0,0,0,0,100,0),
+(@PATH,71,1091.631,-152.9937,61.25031,0,0,0,0,100,0),
+(@PATH,72,1076.178,-141.7825,61.18841,0,0,0,0,100,0),
+(@PATH,73,1060.676,-145.9058,61.35313,0,0,0,0,100,0),
+(@PATH,74,1049.458,-171.1682,58.53218,0,0,0,0,100,0),
+(@PATH,75,1055.627,-188.8615,58.83912,0,0,0,0,100,0),
+(@PATH,76,1070.503,-200.296,61.23225,0,0,0,0,100,0);
+-- 0x1C16DC4B401C2980000A1E0001563CBC .go 1096.845 -166.1139 58.68692
+
+DELETE FROM `creature_formations` WHERE `leaderGUID`=126938;
+INSERT INTO `creature_formations` (`leaderGUID`, `memberGUID`, `dist`, `angle`, `groupAI`, `point_1`, `point_2`) VALUES
+(126938, 126938, 0, 0, 2, 0, 0),
+(126938, 126937, 5, 90, 2, 0, 0);
+
+-- Pathing for Entry: 28838 'TDB FORMAT'
+SET @NPC := 126935;
+SET @PATH := @NPC * 10;
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=1049.899,`position_y`=-99.5955,`position_z`=59.38226 WHERE `guid`=@NPC;
+DELETE FROM `creature_addon` WHERE `guid`=@NPC;
+INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (@NPC,@PATH,0,0,1,0, '');
+DELETE FROM `waypoint_data` WHERE `id`=@PATH;
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES
+(@PATH,1,1049.899,-99.5955,59.38226,0,0,0,0,100,0),
+(@PATH,2,1050.742,-83.34245,58.92643,0,0,0,0,100,0),
+(@PATH,3,1055.898,-75.28898,59.04939,0,0,0,0,100,0),
+(@PATH,4,1066.186,-64.55377,61.31993,0,0,0,0,100,0),
+(@PATH,5,1083.335,-68.16859,59.77402,0,0,0,0,100,0),
+(@PATH,6,1095.981,-92.44127,57.85799,0,0,0,0,100,0),
+(@PATH,7,1097.756,-106.9242,61.43462,0,0,0,0,100,0),
+(@PATH,8,1097.813,-109.0895,61.5177,0,0,0,0,100,0),
+(@PATH,9,1073.511,-124.8458,61.22898,0,0,0,0,100,0),
+(@PATH,10,1063.165,-119.7333,61.23046,0,0,0,0,100,0),
+(@PATH,11,1052.941,-108.3153,61.3854,0,0,0,0,100,0);
+-- 0x1C307C4B401C29800002170000D672BB .go 1049.899 -99.5955 59.38226
+
+DELETE FROM `creature_formations` WHERE `leaderGUID`=126935;
+INSERT INTO `creature_formations` (`leaderGUID`, `memberGUID`, `dist`, `angle`, `groupAI`, `point_1`, `point_2`) VALUES
+(126935, 126935, 0, 0, 2, 0, 0),
+(126935, 126936, 5, 270, 2, 0, 0);
+
+UPDATE `creature_template` SET `InhabitType`=4 WHERE `entry`=29048;
+UPDATE `creature` SET `spawndist`=40 WHERE `id`=29048;
+
+-- Pathing for Entry: 28835 'TDB FORMAT'
+SET @NPC := 126892;
+SET @PATH := @NPC * 10;
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=1053.155,`position_y`=78.30748,`position_z`=61.44365 WHERE `guid`=@NPC;
+DELETE FROM `creature_addon` WHERE `guid`=@NPC;
+INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (@NPC,@PATH,0,0,1,0, '');
+DELETE FROM `waypoint_data` WHERE `id`=@PATH;
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES
+(@PATH,1,1053.155,78.30748,61.44365,0,0,0,0,100,0),
+(@PATH,2,1050.469,75.66108,61.44365,0,0,0,0,100,0),
+(@PATH,3,1034.158,48.75368,59.26595,0,0,0,0,100,0),
+(@PATH,4,1033.885,12.18762,61.27556,0,0,0,0,100,0),
+(@PATH,5,1041.208,0.1274123,61.39244,0,0,0,0,100,0),
+(@PATH,6,1052.702,-9.815857,61.43917,0,0,0,0,100,0),
+(@PATH,7,1053.008,-10.01389,61.44186,0,0,0,0,100,0),
+(@PATH,8,1041.027,0.347192,61.39876,0,0,0,0,100,0),
+(@PATH,9,1032.457,20.25849,58.73366,0,0,0,0,100,0),
+(@PATH,10,1050.469,75.66108,61.44365,0,0,0,0,100,0),
+(@PATH,11,1034.158,48.75368,59.26595,0,0,0,0,100,0);
+-- 0x1C307C4B401C28C000021700015672BB .go 1053.155 78.30748 61.44365
+
+-- Pathing for Entry: 28920 'TDB FORMAT'
+SET @NPC := 126984;
+SET @PATH := @NPC * 10;
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=1098.968,`position_y`=19.55447,`position_z`=53.64101 WHERE `guid`=@NPC;
+DELETE FROM `creature_addon` WHERE `guid`=@NPC;
+INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (@NPC,@PATH,0,0,1,0, '');
+DELETE FROM `waypoint_data` WHERE `id`=@PATH;
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES
+(@PATH,1,1098.968,19.55447,53.64101,0,0,0,0,100,0),
+(@PATH,2,1080.878,7.88341,53.63377,0,0,0,0,100,0),
+(@PATH,3,1066.863,12.70812,53.63047,0,0,0,0,100,0),
+(@PATH,4,1078.049,8.259874,53.6311,0,0,0,0,100,0),
+(@PATH,5,1091.877,12.4073,53.63206,0,0,0,0,100,0);
+-- 0x1C307C4B401C3E0000021700005672BB .go 1098.968 19.55447 53.64101
+
+-- Pathing for Entry: 28920 'TDB FORMAT'
+SET @NPC := 126983;
+SET @PATH := @NPC * 10;
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=1098.049,`position_y`=54.05235,`position_z`=53.65234 WHERE `guid`=@NPC;
+DELETE FROM `creature_addon` WHERE `guid`=@NPC;
+INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (@NPC,@PATH,0,0,1,0, '');
+DELETE FROM `waypoint_data` WHERE `id`=@PATH;
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES
+(@PATH,1,1098.049,54.05235,53.65234,0,0,0,0,100,0),
+(@PATH,2,1085.831,60.05393,53.65328,0,0,0,0,100,0),
+(@PATH,3,1067.126,53.06633,53.64429,0,0,0,0,100,0),
+(@PATH,4,1068.714,55.26102,53.64336,0,0,0,0,100,0),
+(@PATH,5,1090.947,60.23857,53.65356,0,0,0,0,100,0),
+(@PATH,6,1100.346,51.25973,53.65813,0,0,0,0,100,0);
+-- 0x1C307C4B401C3E000002170000D672BB .go 1098.049 54.05235 53.65234
diff --git a/sql/updates/world/2015_02_09_08_world.sql b/sql/updates/world/2015_02_09_08_world.sql
new file mode 100644
index 00000000000..4699da2c181
--- /dev/null
+++ b/sql/updates/world/2015_02_09_08_world.sql
@@ -0,0 +1,2 @@
+--
+UPDATE `creature_template` SET `InhabitType`=4 WHERE `entry` IN (21440, 21438, 21437, 21436, 21439);
diff --git a/sql/updates/world/2015_02_09_09_world.sql b/sql/updates/world/2015_02_09_09_world.sql
new file mode 100644
index 00000000000..ef2b8bb9b1d
--- /dev/null
+++ b/sql/updates/world/2015_02_09_09_world.sql
@@ -0,0 +1,2 @@
+-- Update rotation of Ru'zah
+UPDATE `creature` SET `orientation`=5.026751 WHERE `guid`=74329;
diff --git a/sql/updates/world/2015_02_09_10_world.sql b/sql/updates/world/2015_02_09_10_world.sql
new file mode 100644
index 00000000000..67fd1112e47
--- /dev/null
+++ b/sql/updates/world/2015_02_09_10_world.sql
@@ -0,0 +1,32 @@
+--
+/* SAI for Burning Exile */
+UPDATE `creature_template` SET `AIName`='SmartAI' WHERE `entry`=2760;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=2760;
+INSERT INTO `smart_scripts` (`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`, `comment`) VALUES
+(2760, 0, 0, 0, 8, 0, 100, 0, 4130, 0, 0, 0, 41, 500, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Burning Exile - on spellhit - Despawn');
+
+/* SAI for Cresting Exile */
+UPDATE `creature_template` SET `AIName`='SmartAI' WHERE `entry`=2761;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=2761;
+INSERT INTO `smart_scripts` (`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`, `comment`) VALUES
+(2761, 0, 0, 0, 1, 0, 100, 1, 1000, 1000, 1800000, 1800000, 11, 12544, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Cresting Exile - Out Of Combat - Cast Frost Armor'),
+(2761, 0, 1, 0, 0, 0, 100, 0, 1400, 7300, 25600, 32300, 11, 865, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 'Cresting Exile - In Combat - Cast Frost Nova'),
+(2761, 0, 2, 0, 8, 0, 100, 0, 4131, 0, 0, 0, 41, 500, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Cresting Exile - on spellhit - Despawn');
+
+/* SAI for Thundering Exile */
+UPDATE `creature_template` SET `AIName`='SmartAI' WHERE `entry`=2762;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=2762;
+INSERT INTO `smart_scripts` (`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`, `comment`) VALUES
+(2762, 0, 0, 0, 1, 0, 100, 1, 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Thundering Exile - Out Of Combat - Allow Combat Movement'),
+(2762, 0, 1, 2, 4, 0, 100, 0, 0, 0, 0, 0, 11, 9532, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 'Thundering Exile - On Aggro - Cast Lightning Bolt'),
+(2762, 0, 2, 0, 61, 0, 100, 0, 0, 0, 0, 0, 23, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Thundering Exile - On Aggro - Increment Phase'),
+(2762, 0, 3, 0, 9, 0, 100, 0, 0, 40, 3300, 6600, 11, 9532, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 'Thundering Exile - At 0 - 40 Range - Cast Lightning Bolt'),
+(2762, 0, 4, 5, 3, 0, 100, 0, 0, 15, 0, 0, 21, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Thundering Exile - At 15% Mana - Allow Combat Movement'),
+(2762, 0, 5, 0, 61, 0, 100, 0, 0, 0, 0, 0, 23, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Thundering Exile - At 15% Mana - Increment Phase'),
+(2762, 0, 6, 0, 9, 0, 100, 1, 35, 80, 0, 0, 21, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Thundering Exile - At 35 - 80 Range - Allow Combat Movement'),
+(2762, 0, 7, 0, 9, 0, 100, 1, 0, 5, 0, 0, 21, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Thundering Exile - At 0 - 5 Range - Allow Combat Movement'),
+(2762, 0, 8, 0, 9, 0, 100, 0, 5, 15, 0, 0, 21, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Thundering Exile - At 5 - 15 Range - Allow Combat Movement'),
+(2762, 0, 9, 10, 3, 0, 100, 0, 30, 100, 0, 0, 21, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Thundering Exile - At 100% Mana - Allow Combat Movement'),
+(2762, 0, 10, 0, 61, 0, 100, 0, 0, 0, 0, 0, 23, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Thundering Exile - At 100% Mana - Increment Phase'),
+(2762, 0, 11, 0, 0, 0, 100, 0, 1600, 15100, 18900, 25400, 11, 11824, 1, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 'Thundering Exile - In Combat - Cast Shock'),
+(2762, 0, 12, 0, 8, 0, 100, 0, 4132, 0, 0, 0, 41, 500, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Thundering Exile - on spellhit - Despawn');
diff --git a/sql/updates/world/2015_02_09_11_world.sql b/sql/updates/world/2015_02_09_11_world.sql
new file mode 100644
index 00000000000..d0838a1b31d
--- /dev/null
+++ b/sql/updates/world/2015_02_09_11_world.sql
@@ -0,0 +1,252 @@
+-- Theradrim Shardling SAI
+SET @ENTRY := 11783;
+UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,0,0,0,9,0,50,0,0,5,7000,11000,11,13584,0,0,0,0,0,2,0,0,0,0,0,0,0,"Theradrim Shardling - Within 0-5 Range - Cast 'Strike'"),
+(@ENTRY,0,1,0,54,0,100,0,0,0,0,0,29,2,90,0,0,0,0,19,11784,10,0,0,0,0,0,"Theradrim Shardling - On Just Summoned - Start Follow Closest Creature 'Theradrim Guardian'");
+
+-- Theradrim Guardian SAI
+SET @ENTRY := 11784;
+UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,0,0,0,9,0,100,2,0,5,7000,12000,11,16790,0,0,0,0,0,2,0,0,0,0,0,0,0,"Theradrim Guardian - Within 0-5 Range - Cast 'Knockdown' (Normal Dungeon)"),
+(@ENTRY,0,1,0,1,0,100,3,1000,1000,0,0,11,21057,0,0,0,0,0,1,0,0,0,0,0,0,0,"Theradrim Guardian - Out of Combat - Cast 'Summon Theradrim Shardling' (No Repeat) (Normal Dungeon)");
+
+UPDATE `creature` SET `MovementType`=2 WHERE `guid`=55465;
+DELETE FROM `creature_addon` WHERE `guid`=55465;
+INSERT INTO `creature_addon` (`guid`, `path_id`, `mount`, `bytes1`, `bytes2`, `emote`, `auras`) VALUES
+(55465, 554650, 0, 0, 0, 0, '');
+DELETE FROM `waypoint_data` WHERE `id`=554650;
+INSERT INTO `waypoint_data` (`id`, `point`, `position_x`, `position_y`, `position_z`, `orientation`, `delay`, `move_type`, `action`, `action_chance`, `wpguid`) VALUES
+(554650, 1, 248.538, -93.024, -129.62, 0, 0, 0, 0, 100, 0),
+(554650, 2, 219.021, -92.1171, -129.607, 0, 0, 0, 0, 100, 0),
+(554650, 3, 258.14, -97.1733, -129.619, 0, 0, 0, 0, 100, 0),
+(554650, 4, 246.967, -145.304, -130.844, 0, 0, 0, 0, 100, 0),
+(554650, 5, 213.934, -199.873, -131.159, 0, 0, 0, 0, 100, 0),
+(554650, 6, 248.627, -140.739, -131.005, 0, 0, 0, 0, 100, 0),
+(554650, 7, 259.8, -98.2245, -129.619, 0, 0, 0, 0, 100, 0);
+
+DELETE FROM `creature` WHERE `guid` IN (55466, 56518, 56516, 56517, 56504, 56502, 56505, 56503, 56488, 56487, 56486, 88993, 88991, 88990, 88992, 56343, 56341, 55472);
+
+UPDATE `creature` SET `MovementType`=2 WHERE `guid`=55471;
+DELETE FROM `creature_addon` WHERE `guid`=55471;
+INSERT INTO `creature_addon` (`guid`, `path_id`, `mount`, `bytes1`, `bytes2`, `emote`, `auras`) VALUES
+(55471, 554710, 0, 0, 0, 0, '');
+DELETE FROM `waypoint_data` WHERE `id`=554710;
+INSERT INTO `waypoint_data` (`id`, `point`, `position_x`, `position_y`, `position_z`, `orientation`, `delay`, `move_type`, `action`, `action_chance`, `wpguid`) VALUES
+(554710, 1, 200.354, -133.505, -101.058, 0, 0, 0, 0, 100, 0),
+(554710, 2, 230.841, -109.688, -88.8687, 0, 0, 0, 0, 100, 0),
+(554710, 3, 278.173, -121.002, -83.4807, 0, 0, 0, 0, 100, 0),
+(554710, 4, 300.187, -149.075, -69.7502, 0, 0, 0, 0, 100, 0),
+(554710, 5, 298.76, -178.312, -59.8991, 0, 0, 0, 0, 100, 0),
+(554710, 6, 299.577, -148.794, -69.9433, 0, 0, 0, 0, 100, 0),
+(554710, 7, 276.408, -121.048, -83.6496, 0, 0, 0, 0, 100, 0),
+(554710, 8, 226.955, -112.811, -89.7437, 0, 0, 0, 0, 100, 0),
+(554710, 9, 199.686, -134.684, -101.541, 0, 0, 0, 0, 100, 0),
+(554710, 10, 183.329, -185.544, -111.375, 0, 0, 0, 0, 100, 0);
+
+UPDATE `creature` SET `MovementType`=2 WHERE `guid`=88989;
+DELETE FROM `creature_addon` WHERE `guid`=88989;
+INSERT INTO `creature_addon` (`guid`, `path_id`, `mount`, `bytes1`, `bytes2`, `emote`, `auras`) VALUES
+(88989, 889890, 0, 0, 0, 0, '');
+DELETE FROM `waypoint_data` WHERE `id`=889890;
+INSERT INTO `waypoint_data` (`id`, `point`, `position_x`, `position_y`, `position_z`, `orientation`, `delay`, `move_type`, `action`, `action_chance`, `wpguid`) VALUES
+(889890, 1, 109.037, -268.553, -108.677, 0, 0, 0, 0, 100, 0),
+(889890, 2, 151.884, -275.712, -108.677, 0, 0, 0, 0, 100, 0),
+(889890, 3, 143.666, -231.173, -108.852, 0, 0, 0, 0, 100, 0),
+(889890, 4, 156.17, -275.286, -108.676, 0, 0, 0, 0, 100, 0),
+(889890, 5, 138.876, -278.577, -108.676, 0, 0, 0, 0, 100, 0),
+(889890, 6, 79.5604, -259.988, -108.678, 0, 0, 0, 0, 100, 0),
+(889890, 7, 62.416, -207.188, -109.659, 0, 0, 0, 0, 100, 0),
+(889890, 8, 8.187, -127.348, -123.845, 0, 0, 0, 0, 100, 0),
+(889890, 9, 28.705, -38.025, -128.761, 0, 0, 0, 0, 100, 0),
+(889890, 10, 8.187, -127.348, -123.845, 0, 0, 0, 0, 100, 0),
+(889890, 11, 62.416, -207.188, -109.659, 0, 0, 0, 0, 100, 0),
+(889890, 12, 79.0383, -255.555, -108.677, 0, 0, 0, 0, 100, 0);
+
+UPDATE `creature` SET `MovementType`=2 WHERE `guid`=56485;
+DELETE FROM `creature_addon` WHERE `guid`=56485;
+INSERT INTO `creature_addon` (`guid`, `path_id`, `mount`, `bytes1`, `bytes2`, `emote`, `auras`) VALUES
+(56485, 564850, 0, 0, 0, 0, '');
+DELETE FROM `waypoint_data` WHERE `id`=564850;
+INSERT INTO `waypoint_data` (`id`, `point`, `position_x`, `position_y`, `position_z`, `orientation`, `delay`, `move_type`, `action`, `action_chance`, `wpguid`) VALUES
+(564850, 1, 150.49, -193.898, -171.747, 0, 0, 0, 0, 100, 0),
+(564850, 2, 152.233, -231.891, -170.382, 0, 0, 0, 0, 100, 0),
+(564850, 3, 125.841, -257.66, -168.113, 0, 0, 0, 0, 100, 0),
+(564850, 4, 155.987, -284.034, -168.989, 0, 0, 0, 0, 100, 0),
+(564850, 5, 148.455, -238.759, -169.543, 0, 0, 0, 0, 100, 0),
+(564850, 6, 155.062, -199.53, -171.957, 0, 0, 0, 0, 100, 0),
+(564850, 7, 104.937, -185.658, -167.457, 0, 0, 0, 0, 100, 0),
+(564850, 8, 100.198, -176.082, -167.457, 0, 0, 0, 0, 100, 0),
+(564850, 9, 111.893, -160.596, -167.328, 0, 0, 0, 0, 100, 0),
+(564850, 10, 121.304, -176.939, -167.457, 0, 0, 0, 0, 100, 0),
+(564850, 11, 128.284, -191.12, -168.26, 0, 0, 0, 0, 100, 0);
+
+UPDATE `creature` SET `MovementType`=2 WHERE `guid`=56501;
+DELETE FROM `creature_addon` WHERE `guid`=56501;
+INSERT INTO `creature_addon` (`guid`, `path_id`, `mount`, `bytes1`, `bytes2`, `emote`, `auras`) VALUES
+(56501, 565010, 0, 0, 0, 0, '');
+DELETE FROM `waypoint_data` WHERE `id`=565010;
+INSERT INTO `waypoint_data` (`id`, `point`, `position_x`, `position_y`, `position_z`, `orientation`, `delay`, `move_type`, `action`, `action_chance`, `wpguid`) VALUES
+(565010, 1, 177.079, -304.031, -172.328, 0, 0, 0, 0, 100, 0),
+(565010, 2, 146.519, -316.403, -174.591, 0, 0, 0, 0, 100, 0),
+(565010, 3, 153.733, -376.576, -175.003, 0, 0, 0, 0, 100, 0),
+(565010, 4, 211.381, -381.672, -160.691, 0, 0, 0, 0, 100, 0),
+(565010, 5, 156.615, -376.11, -175.002, 0, 0, 0, 0, 100, 0),
+(565010, 6, 148.461, -317.13, -174.589, 0, 0, 0, 0, 100, 0);
+
+
+UPDATE `creature` SET `MovementType`=2 WHERE `guid`=56515;
+DELETE FROM `creature_addon` WHERE `guid`=56515;
+INSERT INTO `creature_addon` (`guid`, `path_id`, `mount`, `bytes1`, `bytes2`, `emote`, `auras`) VALUES
+(56515, 565150, 0, 0, 0, 0, '');
+DELETE FROM `waypoint_data` WHERE `id`=565150;
+INSERT INTO `waypoint_data` (`id`, `point`, `position_x`, `position_y`, `position_z`, `orientation`, `delay`, `move_type`, `action`, `action_chance`, `wpguid`) VALUES
+(565150, 1, 312.737, -343.241, -117.348, 0, 0, 0, 0, 100, 0),
+(565150, 2, 328.91, -288.013, -118.069, 0, 0, 0, 0, 100, 0),
+(565150, 3, 320.637, -268.75, -117.912, 0, 0, 0, 0, 100, 0),
+(565150, 4, 337.697, -262.309, -118.049, 0, 0, 0, 0, 100, 0),
+(565150, 5, 345.634, -276.933, -117.941, 0, 0, 0, 0, 100, 0),
+(565150, 6, 331.665, -290.395, -118.061, 0, 0, 0, 0, 100, 0),
+(565150, 7, 317.848, -331.827, -116.777, 0, 0, 0, 0, 100, 0),
+(565150, 8, 325.14, -394.223, -124.867, 0, 0, 0, 0, 100, 0),
+(565150, 9, 250.345, -396.668, -139.555, 0, 0, 0, 0, 100, 0),
+(565150, 10, 256.965, -328.427, -140.451, 0, 0, 0, 0, 100, 0),
+(565150, 11, 251.778, -396.72, -139.555, 0, 0, 0, 0, 100, 0),
+(565150, 12, 319.125, -403.751, -124.866, 0, 0, 0, 0, 100, 0);
+
+SET @GUID := 160506;
+SET @ENTRY := 1211;
+-- Placed NPC 12237 (Meshlok the Harvester) into a pool with its placeholder
+DELETE FROM `pool_creature` WHERE `guid` IN (@GUID, @GUID +3, 54652);
+INSERT INTO `pool_creature` VALUES
+(@GUID, @ENTRY, 30, 'Meshlok the Harvester (Maraudon)'),
+(@GUID + 3, @ENTRY, 0, 'Meshlok the Harvester placeholder (Maraudon)'),
+(54652, @ENTRY, 0, 'Meshlok the Harvester placeholder (Maraudon)');
+
+DELETE FROM `pool_template` WHERE `entry` = @ENTRY;
+INSERT INTO `pool_template` VALUES
+(@ENTRY, 1, 'Meshlok the Harvester (Maraudon)');
+
+DELETE FROM `creature` WHERE `guid` BETWEEN @GUID AND @GUID + 7;
+INSERT INTO `creature` (`guid`, `id`, `map`, `zoneId`, `areaId`, `spawnMask`, `phaseMask`, `modelid`, `equipment_id`, `position_x`, `position_y`, `position_z`, `orientation`, `spawntimesecs`, `spawndist`, `currentwaypoint`, `curhealth`, `curmana`, `MovementType`, `npcflag`, `unit_flags`, `dynamicflags`, `VerifiedBuild`) VALUES
+(@GUID, 12237, 349, 0, 0, 1, 1, 0, 1, 632.101, -92.409, -57.4999, 3.49563, 7200, 0, 0, 5757, 0, 0, 0, 0, 0, 0),
+(@GUID + 1, 12224, 349, 0, 0, 1, 1, 0, 1, 748.725, -81.8362, -57.4696, 0.620471, 7200, 0, 0, 4434, 2301, 0, 0, 0, 0, 0),
+(@GUID + 2, 12224, 349, 0, 0, 1, 1, 0, 1, 632.101, -92.409, -57.4999, 3.49563, 7200, 0, 0, 4434, 2301, 0, 0, 0, 0, 0),
+(@GUID + 3, 12224, 349, 0, 0, 1, 1, 0, 1, 818.573, -215.097, -77.1489, 4.14281, 7200, 0, 0, 4434, 2301, 0, 0, 0, 0, 0),
+(@GUID + 4, 12224, 349, 0, 0, 1, 1, 0, 1, 813.453, -370.449, -59.2094, 6.02488, 7200, 0, 0, 4434, 2301, 0, 0, 0, 0, 0),
+(@GUID + 5, 12224, 349, 0, 0, 1, 1, 0, 1, 719.899, -83.8715, -57.2155, 3.48941, 7200, 0, 0, 4434, 2301, 0, 0, 0, 0, 0);
+
+UPDATE `creature` SET `MovementType`=2 WHERE `guid`=@GUID + 1;
+DELETE FROM `creature_addon` WHERE `guid`=@GUID + 1;
+INSERT INTO `creature_addon` (`guid`, `path_id`, `mount`, `bytes1`, `bytes2`, `emote`, `auras`) VALUES
+(@GUID+1, (@GUID+1) * 10, 0, 0, 0, 0, '');
+DELETE FROM `waypoint_data` WHERE `id`=(@GUID+1) * 10;
+INSERT INTO `waypoint_data` (`id`, `point`, `position_x`, `position_y`, `position_z`, `orientation`, `delay`, `move_type`, `action`, `action_chance`, `wpguid`) VALUES
+((@GUID+1) * 10, 1, 747.806, -79.9688, -57.4744, 0, 0, 0, 0, 100, 0),
+((@GUID+1) * 10, 2, 750.866, -86.8807, -57.4595, 0, 0, 0, 0, 100, 0),
+((@GUID+1) * 10, 3, 741.016, -94.8653, -57.4978, 0, 0, 0, 0, 100, 0),
+((@GUID+1) * 10, 4, 745.803, -84.0748, -57.4833, 0, 0, 0, 0, 100, 0),
+((@GUID+1) * 10, 5, 738.607, -70.5452, -57.4977, 0, 0, 0, 0, 100, 0),
+((@GUID+1) * 10, 6, 751.253, -70.6902, -57.3912, 0, 0, 0, 0, 100, 0),
+((@GUID+1) * 10, 7, 744.367, -78.7708, -57.4887, 0, 0, 0, 0, 100, 0),
+((@GUID+1) * 10, 8, 756.588, -80.4979, -57.3727, 0, 0, 0, 0, 100, 0),
+((@GUID+1) * 10, 9, 736.461, -89.3428, -57.4996, 0, 0, 0, 0, 100, 0),
+((@GUID+1) * 10, 10, 734.7, -80.3283, -57.4996, 0, 0, 0, 0, 100, 0),
+((@GUID+1) * 10, 11, 744.209, -79.5844, -57.4915, 0, 0, 0, 0, 100, 0),
+((@GUID+1) * 10, 12, 734.044, -71.701, -57.4977, 0, 0, 0, 0, 100, 0);
+
+UPDATE `creature` SET `MovementType`=2 WHERE `guid`=@GUID + 2;
+DELETE FROM `creature_addon` WHERE `guid`=@GUID + 2;
+INSERT INTO `creature_addon` (`guid`, `path_id`, `mount`, `bytes1`, `bytes2`, `emote`, `auras`) VALUES
+(@GUID+2, (@GUID+2) * 10, 0, 0, 0, 0, '');
+DELETE FROM `waypoint_data` WHERE `id`=(@GUID+2) * 10;
+INSERT INTO `waypoint_data` (`id`, `point`, `position_x`, `position_y`, `position_z`, `orientation`, `delay`, `move_type`, `action`, `action_chance`, `wpguid`) VALUES
+((@GUID+2) * 10, 1, 632.101, -92.409, -57.4999, 0, 0, 0, 0, 100, 0),
+((@GUID+2) * 10, 2, 642.895, -89.225, -57.4999, 0, 0, 0, 0, 100, 0),
+((@GUID+2) * 10, 3, 654.193, -88.5337, -57.4999, 0, 0, 0, 0, 100, 0),
+((@GUID+2) * 10, 4, 666.728, -91.7718, -57.4999, 0, 0, 0, 0, 100, 0),
+((@GUID+2) * 10, 5, 675.549, -93.9197, -57.4999, 0, 0, 0, 0, 100, 0),
+((@GUID+2) * 10, 6, 690.764, -89.7546, -57.4999, 0, 0, 0, 0, 100, 0),
+((@GUID+2) * 10, 7, 702.83, -84.753, -57.4631, 0, 0, 0, 0, 100, 0),
+((@GUID+2) * 10, 8, 715.159, -83.791, -57.1193, 0, 0, 0, 0, 100, 0),
+((@GUID+2) * 10, 9, 708.503, -83.9885, -57.2554, 0, 0, 0, 0, 100, 0),
+((@GUID+2) * 10, 10, 699.353, -86.647, -57.5, 0, 0, 0, 0, 100, 0),
+((@GUID+2) * 10, 11, 681.834, -93.4817, -57.5, 0, 0, 0, 0, 100, 0),
+((@GUID+2) * 10, 12, 674.938, -93.0037, -57.5, 0, 0, 0, 0, 100, 0),
+((@GUID+2) * 10, 13, 665.508, -90.6338, -57.5, 0, 0, 0, 0, 100, 0),
+((@GUID+2) * 10, 14, 652.935, -87.6942, -57.5, 0, 0, 0, 0, 100, 0),
+((@GUID+2) * 10, 15, 634.167, -92.0013, -57.5, 0, 0, 0, 0, 100, 0);
+
+UPDATE `creature` SET `MovementType`=2 WHERE `guid`=@GUID + 3;
+DELETE FROM `creature_addon` WHERE `guid`=@GUID + 3;
+INSERT INTO `creature_addon` (`guid`, `path_id`, `mount`, `bytes1`, `bytes2`, `emote`, `auras`) VALUES
+(@GUID+3, (@GUID+3) * 10, 0, 0, 0, 0, '');
+DELETE FROM `waypoint_data` WHERE `id`=(@GUID+3) * 10;
+INSERT INTO `waypoint_data` (`id`, `point`, `position_x`, `position_y`, `position_z`, `orientation`, `delay`, `move_type`, `action`, `action_chance`, `wpguid`) VALUES
+((@GUID+3) * 10, 1, 818.873, -216.343, -77.1489, 0, 0, 0, 0, 100, 0),
+((@GUID+3) * 10, 2, 813.487, -210.328, -77.1489, 0, 0, 0, 0, 100, 0),
+((@GUID+3) * 10, 3, 806.875, -204.634, -77.1489, 0, 0, 0, 0, 100, 0),
+((@GUID+3) * 10, 4, 804.811, -193.5, -77.1489, 0, 0, 0, 0, 100, 0),
+((@GUID+3) * 10, 5, 806.356, -184.124, -77.1489, 0, 0, 0, 0, 100, 0),
+((@GUID+3) * 10, 6, 813.319, -173.6, -77.2995, 0, 0, 0, 0, 100, 0),
+((@GUID+3) * 10, 7, 808.847, -175.006, -77.3074, 0, 0, 0, 0, 100, 0),
+((@GUID+3) * 10, 8, 805.501, -182.277, -77.1489, 0, 0, 0, 0, 100, 0),
+((@GUID+3) * 10, 9, 804.538, -193.051, -77.1489, 0, 0, 0, 0, 100, 0),
+((@GUID+3) * 10, 10, 807.906, -203.501, -77.1489, 0, 0, 0, 0, 100, 0);
+
+UPDATE `creature` SET `MovementType`=2 WHERE `guid`=203506;
+DELETE FROM `creature_addon` WHERE `guid`=203506;
+INSERT INTO `creature_addon` (`guid`, `path_id`, `mount`, `bytes1`, `bytes2`, `emote`, `auras`) VALUES
+(203506, 203506 * 10, 0, 0, 0, 0, '');
+DELETE FROM `waypoint_data` WHERE `id`=203506 * 10;
+INSERT INTO `waypoint_data` (`id`, `point`, `position_x`, `position_y`, `position_z`, `orientation`, `delay`, `move_type`, `action`, `action_chance`, `wpguid`) VALUES
+(203506 * 10, 1, 632.101, -92.409, -57.4999, 0, 0, 0, 0, 100, 0),
+(203506 * 10, 2, 642.895, -89.225, -57.4999, 0, 0, 0, 0, 100, 0),
+(203506 * 10, 3, 654.193, -88.5337, -57.4999, 0, 0, 0, 0, 100, 0),
+(203506 * 10, 4, 666.728, -91.7718, -57.4999, 0, 0, 0, 0, 100, 0),
+(203506 * 10, 5, 675.549, -93.9197, -57.4999, 0, 0, 0, 0, 100, 0),
+(203506 * 10, 6, 690.764, -89.7546, -57.4999, 0, 0, 0, 0, 100, 0),
+(203506 * 10, 7, 702.83, -84.753, -57.4631, 0, 0, 0, 0, 100, 0),
+(203506 * 10, 8, 715.159, -83.791, -57.1193, 0, 0, 0, 0, 100, 0),
+(203506 * 10, 9, 708.503, -83.9885, -57.2554, 0, 0, 0, 0, 100, 0),
+(203506 * 10, 10, 699.353, -86.647, -57.5, 0, 0, 0, 0, 100, 0),
+(203506 * 10, 11, 681.834, -93.4817, -57.5, 0, 0, 0, 0, 100, 0),
+(203506 * 10, 12, 674.938, -93.0037, -57.5, 0, 0, 0, 0, 100, 0),
+(203506 * 10, 13, 665.508, -90.6338, -57.5, 0, 0, 0, 0, 100, 0),
+(203506 * 10, 14, 652.935, -87.6942, -57.5, 0, 0, 0, 0, 100, 0),
+(203506 * 10, 15, 634.167, -92.0013, -57.5, 0, 0, 0, 0, 100, 0);
+
+UPDATE `creature_template` SET `speed_walk`=0.3, `speed_run`=0.4 WHERE `entry`=12222;
+
+UPDATE `creature` SET `MovementType`=2 WHERE `guid`=55118;
+DELETE FROM `creature_addon` WHERE `guid`=55118;
+INSERT INTO `creature_addon` (`guid`, `path_id`, `mount`, `bytes1`, `bytes2`, `emote`, `auras`) VALUES
+(55118, 55118 * 10, 0, 0, 0, 0, '');
+DELETE FROM `waypoint_data` WHERE `id`=55118 * 10;
+INSERT INTO `waypoint_data` (`id`, `point`, `position_x`, `position_y`, `position_z`, `orientation`, `delay`, `move_type`, `action`, `action_chance`, `wpguid`) VALUES
+(55118 * 10, 1, 560.44, 74.1416, -96.3128, 0, 0, 0, 0, 100, 0),
+(55118 * 10, 2, 556.001, 97.5598, -96.3128, 0, 0, 0, 0, 100, 0),
+(55118 * 10, 3, 562.821, 116.938, -96.3128, 0, 0, 0, 0, 100, 0),
+(55118 * 10, 4, 558.737, 80.2023, -96.3128, 0, 0, 0, 0, 100, 0),
+(55118 * 10, 5, 567.894, 47.7771, -96.3128, 0, 0, 0, 0, 100, 0),
+(55118 * 10, 6, 573.623, 24.1758, -96.3128, 0, 0, 0, 0, 100, 0),
+(55118 * 10, 7, 583.107, 6.90322, -96.3128, 0, 0, 0, 0, 100, 0),
+(55118 * 10, 8, 597.509, 5.07898, -96.3128, 0, 0, 0, 0, 100, 0),
+(55118 * 10, 9, 600.013, 21.6183, -96.3128, 0, 0, 0, 0, 100, 0),
+(55118 * 10, 10, 575.202, 46.2133, -96.3128, 0, 0, 0, 0, 100, 0);
+
+DELETE FROM `creature_formations` WHERE `leaderGUID`=55118;
+INSERT INTO `creature_formations` (`leaderGUID`, `memberGUID`, `dist`, `angle`, `groupAI`, `point_1`, `point_2`) VALUES
+(55118, 55118, 0, 0, 2, 0, 0),
+(55118, 55115, 3, 0, 2, 0, 0),
+(55118, 55116, 3, 70, 2, 0, 0),
+(55118, 55117, 3, 290, 2, 0, 0);
+
+DELETE FROM `creature_formations` WHERE `leaderGUID`=54579;
+INSERT INTO `creature_formations` (`leaderGUID`, `memberGUID`, `dist`, `angle`, `groupAI`, `point_1`, `point_2`) VALUES
+(54579, 54579, 0, 0, 2, 0, 0),
+(54579, 54675, 16, 270, 2, 0, 0),
+(54579, 54676, 16, 90, 2, 0, 0);
diff --git a/sql/updates/world/2015_02_09_12_world.sql b/sql/updates/world/2015_02_09_12_world.sql
new file mode 100644
index 00000000000..0306b11fa79
--- /dev/null
+++ b/sql/updates/world/2015_02_09_12_world.sql
@@ -0,0 +1,2 @@
+--
+DELETE FROM `creature` WHERE guid=85587 AND `id`=17318;
diff --git a/sql/updates/world/2015_02_09_13_world.sql b/sql/updates/world/2015_02_09_13_world.sql
new file mode 100644
index 00000000000..96d4237bd0d
--- /dev/null
+++ b/sql/updates/world/2015_02_09_13_world.sql
@@ -0,0 +1,43 @@
+--
+UPDATE `creature_template` SET `unit_flags`=0, `flags_extra`=0, `npcflag`=0 WHERE `entry`=17587;
+-- Timberstrider Fledgling SAI
+SET @ENTRY := 17372;
+UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,0,0,0,6,0,100,0,0,0,0,0,45,1,1,0,0,0,0,19,17587,10,0,0,0,0,0,"Timberstrider Fledgling - On Just Died - Set Data 1 1");
+
+-- Draenei Youngling SAI
+SET @ENTRY := 17587;
+UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,0,0,3,1,0,100,0,60000,60000,60000,60000,22,0,0,0,0,0,0,1,0,0,0,0,0,0,0,"Draenei Youngling - Out of Combat - Set Event Phase 0"),
+(@ENTRY,0,1,0,8,0,100,0,28880,0,0,0,22,1,0,0,0,0,0,1,0,0,0,0,0,0,0,"Draenei Youngling - On Spellhit 'Gift of the Naaru' - Set Event Phase 1"),
+(@ENTRY,0,2,0,38,1,100,0,1,1,0,0,81,2,0,0,0,0,0,1,0,0,0,0,0,0,0,"Draenei Youngling - On Data Set 1 1 - Set Npc Flag Questgiver (Phase 1)"),
+(@ENTRY,0,3,0,61,0,100,0,60000,60000,60000,60000,81,0,0,0,0,0,0,1,0,0,0,0,0,0,0,"Draenei Youngling - Out of Combat - Set Npc Flag "),
+(@ENTRY,0,5,0,8,0,100,0,59547,0,0,0,22,1,0,0,0,0,0,1,0,0,0,0,0,0,0,"Draenei Youngling - On Spellhit 'Gift of the Naaru' - Set Event Phase 1"),
+(@ENTRY,0,6,0,8,0,100,0,59545,0,0,0,22,1,0,0,0,0,0,1,0,0,0,0,0,0,0,"Draenei Youngling - On Spellhit 'Gift of the Naaru' - Set Event Phase 1"),
+(@ENTRY,0,7,0,8,0,100,0,59544,0,0,0,22,1,0,0,0,0,0,1,0,0,0,0,0,0,0,"Draenei Youngling - On Spellhit 'Gift of the Naaru' - Set Event Phase 1"),
+(@ENTRY,0,8,0,8,0,100,0,59542,0,0,0,22,1,0,0,0,0,0,1,0,0,0,0,0,0,0,"Draenei Youngling - On Spellhit 'Gift of the Naaru' - Set Event Phase 1"),
+(@ENTRY,0,9,0,8,0,100,0,59548,0,0,0,22,1,0,0,0,0,0,1,0,0,0,0,0,0,0,"Draenei Youngling - On Spellhit 'Gift of the Naaru' - Set Event Phase 1"),
+(@ENTRY,0,10,0,8,0,100,0,59543,0,0,0,22,1,0,0,0,0,0,1,0,0,0,0,0,0,0,"Draenei Youngling - On Spellhit 'Gift of the Naaru' - Set Event Phase 1");
+
+DELETE FROM `creature_text` WHERE `entry`IN (17587);
+INSERT INTO `creature_text` (`entry`,`groupid`,`id`,`text`,`type`,`language`,`probability`,`emote`,`duration`,`sound`,`comment`, `BroadcastTextID`) VALUES
+(17587,0,0, 'Help! I think this creature might be too tough for me to handle alone.',12,35,100,0,0,0, '17587',14167), -- player IC_LOS
+(17587,0,1, 'Can anyone hear me? I need help! This creature is going to kill me!',12,35,100,0,0,0, '17587',14168), -- player IC_LOS
+(17587,0,2, 'I can''t hold it off any longer! Tell the exarch that I gave it my best.',12,35,100,0,0,0, '17587',14169), -- player IC_LOS
+(17587,1,0, 'Thanks again!',12,35,100,0,0,0, '17587',14170), -- heal received
+(17587,1,1, 'Thanks for the heal, $n!',12,35,100,0,0,0, '17587',14166), -- heal received
+(17587,2,0, 'Another victory for the Draenei!',12,35,100,0,0,0, '17587',14171), -- target dies
+(17587,2,1, 'Another infected beast destroyed!',12,35,100,0,0,0, '17587',14172), -- target dies
+(17587,2,2, 'Hah! This is easy.',12,35,100,0,0,0, '17587',14174), -- target dies
+(17587,2,3, 'How could you think yourself a match for the draenei champion!',12,35,100,0,0,0, '17587',14173), -- target dies
+(17587,3,0, 'Kill as many infected nightstalkers as I can find... This should be easy.',12,35,100,0,0,0, '17587',14165), -- random ooc
+(17587,3,1, 'I''m supposed to be hunting infected nightstalkers... This should be easy.',12,35,100,0,0,0, '17587',14175), -- random ooc
+(17587,3,2, 'Where in the nether are these damnable lashers??',12,35,100,0,0,0, '17587',14176), -- random ooc
+(17587,3,3, 'Hrm, azure snapdragons? Where do they come up with these names? Daedal has gone mad!',12,35,100,0,0,0, '17587',14177), -- random ooc
+(17587,3,4, 'These stags look nothing like talbuks.',12,35,100,0,0,0, '17587',14178), -- random ooc
+(17587,3,5, 'I wonder what that little purple creature at the village is... It''s certainly beautiful.',12,35,100,0,0,0, '17587',14179), -- random ooc
+(17587,4,0, 'Time to meet your maker, $n!',12,35,100,0,0,0, '17587',14180); -- on aggro
diff --git a/sql/updates/world/2015_02_09_14_world.sql b/sql/updates/world/2015_02_09_14_world.sql
new file mode 100644
index 00000000000..4a2d1bba7df
--- /dev/null
+++ b/sql/updates/world/2015_02_09_14_world.sql
@@ -0,0 +1,2 @@
+--
+UPDATE `item_template` SET `HolidayId`=423, `ScriptName`='' WHERE `entry`=49867;
diff --git a/sql/updates/world/2015_02_09_15_world.sql b/sql/updates/world/2015_02_09_15_world.sql
new file mode 100644
index 00000000000..d2495cf0270
--- /dev/null
+++ b/sql/updates/world/2015_02_09_15_world.sql
@@ -0,0 +1 @@
+DELETE FROM `skill_discovery_template` WHERE `spellId`=54020 AND `reqSpell`=60893;
diff --git a/sql/updates/world/2015_02_10_00_world.sql b/sql/updates/world/2015_02_10_00_world.sql
new file mode 100644
index 00000000000..bfa25d8982b
--- /dev/null
+++ b/sql/updates/world/2015_02_10_00_world.sql
@@ -0,0 +1,18 @@
+-- Magmoth Shaman SAI
+SET @ENTRY := 25428;
+UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,0,0,0,4,0,5,1,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,"Magmoth Shaman - On Aggro - Say Line 0 (No Repeat)"),
+(@ENTRY,0,1,0,2,0,100,1,0,15,0,0,25,1,0,0,0,0,0,0,0,0,0,0,0,0,0,"Magmoth Shaman - Between 0-15% Health - Flee For Assist (No Repeat)"),
+(@ENTRY,0,2,0,25,0,100,0,0,0,0,0,11,45575,0,0,0,0,0,1,0,0,0,0,0,0,0,"Magmoth Shaman - On Reset - Cast 'Magmoth Fire Totem'");
+
+-- Magmoth Fire Totem SAI
+SET @ENTRY := 25444;
+UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,0,0,0,54,0,100,0,0,0,0,0,21,1,0,0,0,0,0,1,0,0,0,0,0,0,0,"Magmoth Fire Totem - On Just Summoned - Enable Combat Movement"),
+(@ENTRY,0,1,0,0,0,100,0,3000,4000,4000,4000,11,45580,0,0,0,0,0,2,0,0,0,0,0,0,0,"Magmoth Fire Totem - In Combat - Cast 'Fireball'"),
+(@ENTRY,0,2,0,1,0,100,0,100,100,20000,20000,11,45576,0,0,0,0,0,19,24021,30,0,0,0,0,0,"Magmoth Fire Totem - Out of Combat - Cast 'Cosmetic - New Fire Beam Channel (Mouth)'"),
+(@ENTRY,0,3,0,7,0,100,0,0,0,0,0,41,1,0,0,0,0,0,1,0,0,0,0,0,0,0,"Magmoth Fire Totem - On Evade - Despawn Instant");
diff --git a/sql/updates/world/2015_02_10_01_world.sql b/sql/updates/world/2015_02_10_01_world.sql
new file mode 100644
index 00000000000..835ac05343b
--- /dev/null
+++ b/sql/updates/world/2015_02_10_01_world.sql
@@ -0,0 +1,12 @@
+--
+DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=13 AND `SourceGroup`=1 AND `SourceEntry`=45465;
+INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorType`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES
+(13, 1, 45465, 0, 0, 31, 0, 3, 24862, 0, 0, 0, 0, '', 'Mage Hunter Channel - targets Bunny');
+
+-- Beryl Treasure Hunter SAI
+SET @ENTRY := 25353;
+UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,0,0,0,0,0,100,0,0,1000,12500,15500,11,50658,0,0,0,0,0,2,0,0,0,0,0,0,0,"Beryl Treasure Hunter - In Combat - Cast 'Focus Beam'"),
+(@ENTRY,0,1,0,1,0,100,0,5000,5000,15000,15000,11,45465,0,0,0,0,0,19,24862,60,0,0,0,0,0,"Beryl Treasure Hunter - Out of Combat - Cast 'Mage Hunter Channel'");
diff --git a/sql/updates/world/2015_02_10_02_world.sql b/sql/updates/world/2015_02_10_02_world.sql
new file mode 100644
index 00000000000..62c0f960123
--- /dev/null
+++ b/sql/updates/world/2015_02_10_02_world.sql
@@ -0,0 +1,41 @@
+-- Kvaldir Mist Lord SAI
+SET @GUID := -110298;
+UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=25496;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@GUID AND `source_type`=0;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@GUID,0,0,0,25,0,100,0,0,0,0,0,53,0,2549600,1,0,0,2,1,0,0,0,0,0,0,0,"Kvaldir Mist Lord - On Reset - Start Waypoint"),
+(@GUID,0,1,0,40,0,100,0,2,2549600,0,0,80,2549600,2,0,0,0,0,1,0,0,0,0,0,0,0,"Kvaldir Mist Lord - On Waypoint 2 Reached - Run Script"),
+(@GUID,0,2,0,40,0,100,0,4,2549600,0,0,80,2549600,2,0,0,0,0,1,0,0,0,0,0,0,0,"Kvaldir Mist Lord - On Waypoint 4 Reached - Run Script"),
+(@GUID,0,3,0,40,0,100,0,6,2549600,0,0,80,2549600,2,0,0,0,0,1,0,0,0,0,0,0,0,"Kvaldir Mist Lord - On Waypoint 6 Reached - Run Script"),
+(@GUID,0,4,0,40,0,100,0,8,2549600,0,0,80,2549600,2,0,0,0,0,1,0,0,0,0,0,0,0,"Kvaldir Mist Lord - On Waypoint 8 Reached - Run Script");
+
+-- Actionlist SAI
+SET @ENTRY := 2549600;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=9;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,9,0,0,0,0,100,0,0,0,0,0,54,7000,0,0,0,0,0,1,0,0,0,0,0,0,0,"Kvaldir Mist Lord - On Script - Pause Waypoint"),
+(@ENTRY,9,1,0,0,0,100,0,0,0,0,0,66,0,0,0,0,0,0,10,110382,25242,0,0,0,0,0,"Kvaldir Mist Lord - On Script - Set Orientation Closest Creature 'Warsong Battleguard'"),
+(@ENTRY,9,2,0,0,0,100,0,1000,1000,0,0,5,53,0,0,0,0,0,1,0,0,0,0,0,0,0,"Kvaldir Mist Lord - On Script - Play Emote 53"),
+(@ENTRY,9,3,0,0,0,100,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,"Kvaldir Mist Lord - On Script - Say Line 0"),
+(@ENTRY,9,4,0,0,0,100,0,0,0,0,0,11,45667,0,0,0,0,0,19,25244,50,0,0,0,0,0,"Kvaldir Mist Lord - On Script - Cast 'Torch Corpse'");
+
+DELETE FROM `waypoints` WHERE `entry`=2549600;
+INSERT INTO `waypoints` (`entry`, `pointid`, `position_x`, `position_y`, `position_z`, `point_comment`) VALUES
+(2549600, 1, 2943.3, 6805.71, 6.86362, 'Kvaldir Mist Lord'),
+(2549600, 2, 2946.38, 6808.99, 6.89997, 'Kvaldir Mist Lord'),
+(2549600, 3, 2952.22, 6815.03, 5.49191, 'Kvaldir Mist Lord'),
+(2549600, 4, 2956.26, 6811.33, 5.7004, 'Kvaldir Mist Lord'),
+(2549600, 5, 2959.27, 6809.55, 5.73998, 'Kvaldir Mist Lord'),
+(2549600, 6, 2958.56, 6804.6, 6.10027, 'Kvaldir Mist Lord'),
+(2549600, 7, 2958.36, 6799.58, 6.55177, 'Kvaldir Mist Lord'),
+(2549600, 8, 2953.32, 6798.66, 6.69609, 'Kvaldir Mist Lord');
+
+DELETE FROM `creature_text` WHERE `entry`=25496;
+INSERT INTO `creature_text` (`entry`, `groupid`, `id`, `text`, `type`, `language`, `probability`, `emote`, `duration`, `sound`, `BroadcastTextId`, `TextRange`, `comment`) VALUES
+(25496, 0, 0, 'You are dismissed, $n.', 12, 0, 100, 113, 0, 0, 1242, 0, 'Marshal McBride');
+
+DELETE FROM `creature_text` WHERE `entry`=25496;
+INSERT INTO `creature_text` (`entry`, `groupid`, `id`, `text`, `type`, `language`, `probability`, `emote`, `duration`, `sound`, `BroadcastTextID`, `comment`) VALUES
+(25496, 0, 0, 'Become ashes in the mist!', 12, 0, 50, 53, 0, 0, 24719, 'Kvaldir Mist Lord'),
+(25496, 0, 1, 'The subjugation of these people has only just begun... so much time for fun and games.', 12, 0, 50, 53, 0, 0, 24718, 'Kvaldir Mist Lord'),
+(25496, 0, 2, 'Burn, land dweller! BURN!', 12, 0, 50, 53, 0, 0, 24717, 'Kvaldir Mist Lord');
diff --git a/sql/updates/world/2015_02_10_03_world.sql b/sql/updates/world/2015_02_10_03_world.sql
new file mode 100644
index 00000000000..6b2ed183c1d
--- /dev/null
+++ b/sql/updates/world/2015_02_10_03_world.sql
@@ -0,0 +1,7 @@
+-- Fireguard Destroyer SAI
+SET @ENTRY := 8911;
+UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,0,0,0,9,0,100,2,0,30,9000,11000,11,15243,0,0,0,0,0,1,0,0,0,0,0,0,0,"Fireguard Destroyer - Within 0-30 Range - Cast 'Fireball Volley' (Normal Dungeon)"),
+(@ENTRY,0,1,0,0,0,100,0,5000,8000,5000,8000,11,16788,64,0,0,0,0,2,0,0,0,0,0,0,0,"Fireguard Destroyer - In Combat - Cast 'Fireball'");
diff --git a/sql/updates/world/2015_02_10_04_world.sql b/sql/updates/world/2015_02_10_04_world.sql
new file mode 100644
index 00000000000..27debf9fb46
--- /dev/null
+++ b/sql/updates/world/2015_02_10_04_world.sql
@@ -0,0 +1,15 @@
+--
+UPDATE `conditions` SET `ConditionValue1`=11332 WHERE `SourceTypeOrReferenceId`=15 AND `SourceGroup`=9546 AND `SourceEntry`=1 AND `SourceId`=0 AND `ElseGroup`=0 AND `ConditionTypeOrReference`=9 AND `ConditionTarget`=0 AND `ConditionValue1`=12298 AND `ConditionValue2`=0 AND `ConditionValue3`=0;
+UPDATE `gossip_menu_option` SET `npc_option_npcflag`=8195 WHERE `menu_id`=9546 AND `id`=1;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=23859;
+INSERT INTO `smart_scripts` (`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`, `comment`) VALUES
+(23859, 0, 0, 0, 4, 0, 100, 0, 0, 0, 0, 0, 80, 2385900, 2, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Greer Orehammer - On aggro - Run Script'),
+(23859, 0, 1, 0, 62, 0, 100, 0, 9546, 1, 0, 0, 56, 33634, 10, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'Greer Orehammer - On gossip option select - give player 10 Orehammer\'s Precision Bombs'),
+(23859, 0, 2, 0, 62, 0, 100, 0, 9546, 1, 0, 0, 52, 745, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'Greer Orehammer - On gossip option select - Plague This Taxi Start');
+
+-- New Agamand Plague Tank Bunny SAI
+SET @ENTRY := 24290;
+UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,0,0,0,8,0,100,0,43404,0,0,0,33,24290,0,0,0,0,0,7,0,0,0,0,0,0,0,"New Agamand Plague Tank Bunny - On Spellhit 'Mission: Plague This!: Orehammer's Precision Bombs Dummy' - Quest Credit 'Mission: Plague This!'");
diff --git a/sql/updates/world/2015_02_10_05_world.sql b/sql/updates/world/2015_02_10_05_world.sql
new file mode 100644
index 00000000000..20c36c24585
--- /dev/null
+++ b/sql/updates/world/2015_02_10_05_world.sql
@@ -0,0 +1,911 @@
+-- Pathing for Entry: 25979 'TDB FORMAT'
+SET @NPC := 107300;
+SET @PATH := @NPC * 10;
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=3289.213,`position_y`=5620.369,`position_z`=51.0953 WHERE `guid`=@NPC;
+DELETE FROM `creature_addon` WHERE `guid`=@NPC;
+INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (@NPC,@PATH,0,0,1,0, '');
+DELETE FROM `waypoint_data` WHERE `id`=@PATH;
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES
+(@PATH,1,3289.213,5620.369,51.0953,0,0,0,0,100,0),
+(@PATH,2,3289.156,5612.807,51.6523,0,0,0,0,100,0),
+(@PATH,3,3285.626,5645.205,51.53279,0,0,0,0,100,0),
+(@PATH,4,3283.541,5652.846,52.70237,0,0,0,0,100,0),
+(@PATH,5,3280.611,5683.929,54.8549,0,0,0,0,100,0),
+(@PATH,6,3303.37,5707.606,60.20351,0,0,0,0,100,0),
+(@PATH,7,3282.027,5687.42,56.04992,0,0,0,0,100,0),
+(@PATH,8,3279.962,5672.618,53.23326,0,0,0,0,100,0),
+(@PATH,9,3284.723,5649.133,52.33985,0,0,0,0,100,0);
+-- 0x1C09144760195EC000000C0000579A79 .go 3289.213 5620.369 51.0953
+-- Inquisitor Salrand SAI
+SET @ENTRY := 25584;
+UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0 AND `id`=6;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,0,6,0,1,0,100,0,5000,5000,10000,10000,11,45777,0,0,0,0,0,10,119586,25594,0,0,0,0,0,"Inquisitor Salrand - Out of Combat - Cast 'Salrand's Beam'");
+
+-- Pathing for Entry: 25217 'TDB FORMAT'
+SET @NPC := 122872;
+SET @PATH := @NPC * 10;
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=4113.013,`position_y`=6276.871,`position_z`=25.68058 WHERE `guid`=@NPC;
+DELETE FROM `creature_addon` WHERE `guid`=@NPC;
+INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (@NPC,@PATH,0,0,1,0, '');
+DELETE FROM `waypoint_data` WHERE `id`=@PATH;
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES
+(@PATH,1,4113.013,6276.871,25.68058,0,0,0,0,100,0),
+(@PATH,2,4090.676,6280.604,27.56935,0,0,0,0,100,0),
+(@PATH,3,4074.31,6276.669,26.26191,0,0,0,0,100,0),
+(@PATH,4,4063.338,6284.883,23.54415,0,0,0,0,100,0),
+(@PATH,5,4060.495,6308.033,24.63371,0,0,0,0,100,0),
+(@PATH,6,4064.796,6325.54,25.33357,0,0,0,0,100,0),
+(@PATH,7,4062.167,6349.621,24.96839,0,0,0,0,100,0),
+(@PATH,8,4055.423,6363.151,27.49203,0,0,0,0,100,0),
+(@PATH,9,4061.251,6351.451,25.36894,0,0,0,0,100,0),
+(@PATH,10,4064.368,6335.375,25.38478,0,0,0,0,100,0),
+(@PATH,11,4061.08,6310.811,24.90634,0,0,0,0,100,0),
+(@PATH,12,4059.284,6298.654,24.53846,0,0,0,0,100,0),
+(@PATH,13,4069.346,6279.003,24.92667,0,0,0,0,100,0),
+(@PATH,14,4084.886,6280.17,27.70065,0,0,0,0,100,0),
+(@PATH,15,4107.833,6280.248,25.45559,0,0,0,0,100,0);
+-- 0x1C0914476018A04000000C000057EEC0 .go 4113.013 6276.871 25.68058
+
+-- Pathing for Entry: 25611 'TDB FORMAT'
+SET @NPC := 57031;
+SET @PATH := @NPC * 10;
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=2797.154,`position_y`=6620.249,`position_z`=48.24942 WHERE `guid`=@NPC;
+DELETE FROM `creature_addon` WHERE `guid`=@NPC;
+INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (@NPC,@PATH,0,0,1,0, '');
+DELETE FROM `waypoint_data` WHERE `id`=@PATH;
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES
+(@PATH,1,2797.154,6620.249,48.24942,0,0,0,0,100,0),
+(@PATH,2,2807.472,6623.047,46.9419,0,0,0,0,100,0),
+(@PATH,3,2822.777,6620.003,48.07745,0,0,0,0,100,0),
+(@PATH,4,2828.091,6608.199,49.87174,0,0,0,0,100,0),
+(@PATH,5,2829.904,6600.112,50.43536,0,0,0,0,100,0),
+(@PATH,6,2825.405,6583.044,51.32146,0,0,0,0,100,0),
+(@PATH,7,2812.032,6576.637,50.3959,0,0,0,0,100,0),
+(@PATH,8,2808.558,6575.663,49.55042,0,0,0,0,100,0),
+(@PATH,9,2791.914,6578.114,49.39709,0,0,0,0,100,0),
+(@PATH,10,2790.871,6579.394,49.35609,0,0,0,0,100,0),
+(@PATH,11,2793.273,6598.499,49.21821,0,0,0,0,100,0),
+(@PATH,12,2797.287,6620.314,48.24408,0,0,0,0,100,0);
+-- 0x1C091447601902C000000C0000588B21 .go 2797.154 6620.249 48.24942
+
+-- Pathing for Entry: 25611 'TDB FORMAT'
+SET @NPC := 97489;
+SET @PATH := @NPC * 10;
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=2755.648,`position_y`=6516.167,`position_z`=52.22083 WHERE `guid`=@NPC;
+DELETE FROM `creature_addon` WHERE `guid`=@NPC;
+INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (@NPC,@PATH,0,0,1,0, '');
+DELETE FROM `waypoint_data` WHERE `id`=@PATH;
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES
+(@PATH,1,2755.648,6516.167,52.22083,0,0,0,0,100,0),
+(@PATH,2,2739.121,6534.617,51.25744,0,0,0,0,100,0),
+(@PATH,3,2736.37,6540.505,50.52654,0,0,0,0,100,0),
+(@PATH,4,2736.999,6568.931,49.45178,0,0,0,0,100,0),
+(@PATH,5,2745.165,6582.929,49.87815,0,0,0,0,100,0),
+(@PATH,6,2749.685,6588.33,49.43536,0,0,0,0,100,0),
+(@PATH,7,2764.539,6590.529,49.07096,0,0,0,0,100,0),
+(@PATH,8,2783.451,6578.873,49.38116,0,0,0,0,100,0),
+(@PATH,9,2790.408,6542.078,51.47867,0,0,0,0,100,0),
+(@PATH,10,2781.756,6526.21,53.26818,0,0,0,0,100,0),
+(@PATH,11,2759.35,6514.721,52.89858,0,0,0,0,100,0);
+-- 0x1C091447601902C000000C0001588AE6 .go 2755.648 6516.167 52.22083
+
+-- Pathing for Entry: 25611 'TDB FORMAT'
+SET @NPC := 97486;
+SET @PATH := @NPC * 10;
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=2959.18,`position_y`=6518.749,`position_z`=72.95694 WHERE `guid`=@NPC;
+DELETE FROM `creature_addon` WHERE `guid`=@NPC;
+INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (@NPC,@PATH,0,0,1,0, '');
+DELETE FROM `waypoint_data` WHERE `id`=@PATH;
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES
+(@PATH,1,2959.18,6518.749,72.95694,0,0,0,0,100,0),
+(@PATH,2,2943.816,6531.531,70.15851,0,0,0,0,100,0),
+(@PATH,3,2922.839,6548.202,66.36589,0,0,0,0,100,0),
+(@PATH,4,2905.143,6556.469,64.68446,0,0,0,0,100,0),
+(@PATH,5,2886.449,6562.177,61.95524,0,0,0,0,100,0),
+(@PATH,6,2870.039,6568.242,58.85592,0,0,0,0,100,0),
+(@PATH,7,2849.421,6573.922,54.75926,0,0,0,0,100,0),
+(@PATH,8,2864.578,6570.402,57.7508,0,0,0,0,100,0),
+(@PATH,9,2880.555,6564.39,60.65393,0,0,0,0,100,0),
+(@PATH,10,2900.065,6558.482,64.16826,0,0,0,0,100,0),
+(@PATH,11,2916.618,6552.232,65.66638,0,0,0,0,100,0),
+(@PATH,12,2939.966,6534.6,69.45979,0,0,0,0,100,0),
+(@PATH,13,2950.899,6526.294,71.31409,0,0,0,0,100,0),
+(@PATH,14,2978.666,6499.601,75.67303,0,0,0,0,100,0),
+(@PATH,15,2959.18,6518.749,72.95694,0,0,0,0,100,0);
+-- 0x1C091447601902C000000C00005893B1 .go 2959.18 6518.749 72.95694
+
+-- Pathing for Entry: 25611 'TDB FORMAT'
+SET @NPC := 97472;
+SET @PATH := @NPC * 10;
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=3132.141,`position_y`=6364.85,`position_z`=87.00642 WHERE `guid`=@NPC;
+DELETE FROM `creature_addon` WHERE `guid`=@NPC;
+INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (@NPC,@PATH,0,0,1,0, '');
+DELETE FROM `waypoint_data` WHERE `id`=@PATH;
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES
+(@PATH,1,3132.141,6364.85,87.00642,0,0,0,0,100,0),
+(@PATH,2,3145.254,6377.429,86.04013,0,0,0,0,100,0),
+(@PATH,3,3150.995,6384.529,85.66245,0,0,0,0,100,0),
+(@PATH,4,3150.954,6413.424,86.59067,0,0,0,0,100,0),
+(@PATH,5,3148.383,6418.564,87.16897,0,0,0,0,100,0),
+(@PATH,6,3127.888,6445.25,85.42545,0,0,0,0,100,0),
+(@PATH,7,3125.299,6448.726,84.63122,0,0,0,0,100,0),
+(@PATH,8,3098.482,6453.096,86.2816,0,0,0,0,100,0),
+(@PATH,9,3092.813,6430.465,86.18443,0,0,0,0,100,0),
+(@PATH,10,3092.439,6429.254,86.16457,0,0,0,0,100,0),
+(@PATH,11,3090.803,6416.944,86.47922,0,0,0,0,100,0),
+(@PATH,12,3080.703,6420.038,86.92494,0,0,0,0,100,0),
+(@PATH,13,3066.926,6403.042,89.00624,0,0,0,0,100,0),
+(@PATH,14,3071.34,6388.575,89.95999,0,0,0,0,100,0),
+(@PATH,15,3071.793,6387.598,89.86023,0,0,0,0,100,0),
+(@PATH,16,3092.656,6366.145,89.73042,0,0,0,0,100,0),
+(@PATH,17,3109.781,6356.525,88.38365,0,0,0,0,100,0),
+(@PATH,18,3114.204,6357.174,87.74312,0,0,0,0,100,0),
+(@PATH,19,3132.181,6364.944,87.00461,0,0,0,0,100,0);
+-- 0x1C091447601902C000000A000058AB81 .go 3132.141 6364.85 87.00642
+
+-- Pathing for Entry: 25475 'TDB FORMAT'
+SET @NPC := 107800;
+SET @PATH := @NPC * 10;
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=2814.188,`position_y`=6720.133,`position_z`=9.794792 WHERE `guid`=@NPC;
+DELETE FROM `creature_addon` WHERE `guid`=@NPC;
+INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (@NPC,@PATH,0,0,1,0, '');
+DELETE FROM `waypoint_data` WHERE `id`=@PATH;
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES
+(@PATH,1,2814.188,6720.133,9.794792,0,0,0,0,100,0),
+(@PATH,2,2810.317,6723.547,9.082146,0,0,0,0,100,0);
+-- 0x1C0914476018E0C000000C00005660EE .go 2814.188 6720.133 9.794792
+
+-- Pathing for Entry: 25496 'TDB FORMAT'
+SET @NPC := 110300;
+SET @PATH := @NPC * 10;
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=3067.602,`position_y`=6705.609,`position_z`=6.230121 WHERE `guid`=@NPC;
+DELETE FROM `creature_addon` WHERE `guid`=@NPC;
+INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (@NPC,@PATH,0,0,1,0, '');
+DELETE FROM `waypoint_data` WHERE `id`=@PATH;
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES
+(@PATH,1,3067.602,6705.609,6.230121,0,0,0,0,100,0),
+(@PATH,2,3051.766,6718.588,6.615577,0,0,0,0,100,0),
+(@PATH,3,3024.569,6720.975,9.706598,0,0,0,0,100,0),
+(@PATH,4,3031.904,6726.806,7.207738,0,0,0,0,100,0),
+(@PATH,5,3033.154,6727.66,6.58389,0,0,0,0,100,0),
+(@PATH,6,3068.976,6704.811,5.953619,0,0,0,0,100,0),
+(@PATH,7,3095.539,6680.229,6.846659,0,0,0,0,100,0),
+(@PATH,8,3095.83,6662.607,9.923321,0,0,0,0,100,0),
+(@PATH,9,3099.785,6674.892,7.75151,0,0,0,0,100,0),
+(@PATH,10,3090.089,6685.671,6.213068,0,0,0,0,100,0),
+(@PATH,11,3067.523,6705.942,6.221252,0,0,0,0,100,0);
+-- 0x1C0914476018E60000000C000058AEB8 .go 3067.602 6705.609 6.230121
+
+UPDATE `creature` SET `spawndist`=0, `MovementType`=0 WHERE `id` IN (25244);
+UPDATE `creature` SET `spawndist`=0, `MovementType`=0 WHERE `guid`=57067;
+
+-- Pathing for Entry: 25496 'TDB FORMAT'
+SET @NPC := 57066;
+SET @PATH := @NPC * 10;
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=2431.173,`position_y`=6827.691,`position_z`=4.434509 WHERE `guid`=@NPC;
+DELETE FROM `creature_addon` WHERE `guid`=@NPC;
+INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (@NPC,@PATH,0,0,1,0, '');
+DELETE FROM `waypoint_data` WHERE `id`=@PATH;
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES
+(@PATH,1,2431.173,6827.691,4.434509,0,0,0,0,100,0),
+(@PATH,2,2417.92,6818.268,3.808835,0,0,0,0,100,0),
+(@PATH,3,2401.83,6806.687,1.444491,0,0,0,0,100,0),
+(@PATH,4,2397.053,6803.022,1.261812,0,0,0,0,100,0),
+(@PATH,5,2415.603,6771.807,2.460288,0,0,0,0,100,0),
+(@PATH,6,2444.461,6781.449,6.446399,0,0,0,0,100,0),
+(@PATH,7,2448.987,6792.239,6.01413,0,0,0,0,100,0),
+(@PATH,8,2466.415,6808.424,4.947993,0,0,0,0,100,0),
+(@PATH,9,2479.129,6823.808,2.68948,0,0,0,0,100,0),
+(@PATH,10,2480.822,6831.567,1.405943,0,0,0,0,100,0),
+(@PATH,11,2481.074,6846.526,1.077314,0,0,0,0,100,0),
+(@PATH,12,2453.165,6857.935,1.077329,0,0,0,0,100,0),
+(@PATH,13,2438.796,6843.509,1.671256,0,0,0,0,100,0);
+-- 0x1C0914476018E60000000A0000586C4C .go 2431.173 6827.691 4.434509
+
+-- Pathing for Entry: 25496 'TDB FORMAT'
+SET @NPC := 57059;
+SET @PATH := @NPC * 10;
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=2414.351,`position_y`=6738.811,`position_z`=2.7648 WHERE `guid`=@NPC;
+DELETE FROM `creature_addon` WHERE `guid`=@NPC;
+INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (@NPC,@PATH,0,0,1,0, '');
+DELETE FROM `waypoint_data` WHERE `id`=@PATH;
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES
+(@PATH,1,2414.351,6738.811,2.7648,0,0,0,0,100,0),
+(@PATH,2,2411.604,6704.709,6.068311,0,0,0,0,100,0),
+(@PATH,3,2411.347,6702.018,6.760894,0,0,0,0,100,0),
+(@PATH,4,2452.357,6721.351,6.010249,0,0,0,0,100,0),
+(@PATH,5,2466.691,6738.082,6.927616,0,0,0,0,100,0),
+(@PATH,6,2495.109,6765.589,6.517776,0,0,0,0,100,0),
+(@PATH,7,2513.06,6790.916,4.482207,0,0,0,0,100,0),
+(@PATH,8,2523.949,6806.354,1.703682,0,0,0,0,100,0),
+(@PATH,9,2532.222,6817.983,1.145756,0,0,0,0,100,0),
+(@PATH,10,2546.355,6838.362,1.049538,0,0,0,0,100,0),
+(@PATH,11,2548.539,6846.931,0.8498411,0,0,0,0,100,0),
+(@PATH,12,2506.485,6784.912,5.38059,0,0,0,0,100,0),
+(@PATH,13,2483.945,6763.865,6.803366,0,0,0,0,100,0),
+(@PATH,14,2480.173,6760.685,6.7745,0,0,0,0,100,0),
+(@PATH,15,2419.531,6764.058,3.010518,0,0,0,0,100,0),
+(@PATH,16,2414.283,6738.649,2.879114,0,0,0,0,100,0);
+-- 0x1C0914476018E60000000C0000587988 .go 2414.351 6738.811 2.7648
+
+DELETE FROM `creature_addon` WHERE `guid` IN (110289,57070,57063, 57065, 57067,57064,57062,57068,57060,57058,57057, 57056,57061,110291,110301,110290,110285,57072);
+INSERT INTO `creature_addon` (`guid`, `path_id`, `mount`, `bytes1`, `bytes2`, `emote`, `auras`) VALUES
+(57063, 0, 0, 0, 0, 69, ''),
+(57065, 0, 0, 0, 0, 234, ''),
+(57067, 0, 0, 0, 0, 234, ''),
+(57064, 0, 0, 0, 0, 234, ''),
+(57062, 0, 0, 0, 0, 69, ''),
+(57068, 0, 0, 0, 0, 234, ''),
+(57060, 0, 0, 0, 0, 234, ''),
+(57058, 0, 0, 0, 0, 234, ''),
+(57057, 0, 0, 0, 0, 234, ''),
+(57056, 0, 0, 0, 0, 234, ''),
+(57061, 0, 0, 0, 0, 27, ''),
+(110291, 0, 0, 0, 0, 27, ''),
+(110301, 0, 0, 0, 0, 69, ''),
+(110290, 0, 0, 0, 0, 27, ''),
+(110285, 0, 0, 0, 0, 27, ''),
+(57072, 0, 0, 0, 0, 69, ''),
+(110289, 0, 0, 0, 0, 27, ''),
+(57070, 0, 0, 0, 0, 27, '');
+
+DELETE FROM `creature_addon` WHERE `guid` IN (112665,112663,112662,112660,112659,112666,112679,112673,112678,112671,112667,112672,56752,112741,56327,112661,112658,56325, 112668, 112670, 112669, 56322);
+INSERT INTO `creature_addon` (`guid`, `path_id`, `mount`, `bytes1`, `bytes2`, `emote`, `auras`) VALUES
+(56325, 0, 0, 0, 0, 4, ''),
+(112668, 0, 0, 0, 0, 4, ''),
+(112670, 0, 0, 0, 0, 4, ''),
+(112669, 0, 0, 0, 0, 4, ''),
+(56322, 0, 0, 0, 0, 4, ''),
+(112661, 0, 0, 0, 0, 234, ''),
+(112658, 0, 0, 0, 0, 234, ''),
+(56327, 0, 0, 0, 0, 234, ''),
+(112741, 0, 0, 0, 0, 27, ''),
+(56752, 0, 0, 0, 0, 27, ''),
+(112672, 0, 0, 1, 0, 0, ''),
+--
+(112678, 0, 0, 0, 0, 4, ''),
+(112671, 0, 0, 0, 0, 4, ''),
+(112667, 0, 0, 0, 0, 4, ''),
+--
+(112673, 0, 0, 1, 0, 0, ''),
+(112679, 0, 0, 1, 0, 0, ''),
+(112666, 0, 0, 0, 0, 234, ''),
+(112665, 0, 0, 0, 0, 234, ''),
+(112659, 0, 0, 0, 0, 234, ''),
+(112660, 0, 0, 0, 0, 234, ''),
+(112663, 0, 0, 0, 0, 234, ''),
+(112662, 0, 0, 0, 0, 234, '');
+
+-- Pathing for Entry: 25522 'TDB FORMAT'
+SET @NPC := 112755;
+SET @PATH := @NPC * 10;
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=1863.071,`position_y`=5721.263,`position_z`=0.5444731 WHERE `guid`=@NPC;
+DELETE FROM `creature_addon` WHERE `guid`=@NPC;
+INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (@NPC,@PATH,0,0,1,0, '');
+DELETE FROM `waypoint_data` WHERE `id`=@PATH;
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES
+(@PATH,1,1863.071,5721.263,0.5444731,0,0,0,0,100,0),
+(@PATH,2,1871.592,5727.264,0.5210824,0,0,0,0,100,0),
+(@PATH,3,1865.804,5766.675,0.8066133,0,0,0,0,100,0),
+(@PATH,4,1861.19,5769.085,0.636929,0,0,0,0,100,0),
+(@PATH,5,1853.291,5777.555,0.8031902,0,0,0,0,100,0),
+(@PATH,6,1838.134,5783.222,0.6275423,0,0,0,0,100,0),
+(@PATH,7,1838.138,5783.196,0.5076787,0,0,0,0,100,0),
+(@PATH,8,1838.279,5783.279,0.609849,0,0,0,0,100,0),
+(@PATH,9,1853.601,5777.178,0.8158144,0,0,0,0,100,0),
+(@PATH,10,1872.918,5754.421,0.8373558,0,0,0,0,100,0),
+(@PATH,11,1873.445,5750.554,0.7919877,0,0,0,0,100,0),
+(@PATH,12,1857.673,5717.76,0.05196175,0,0,0,0,100,0),
+(@PATH,13,1863.071,5721.263,0.5444731,0,0,0,0,100,0),
+(@PATH,14,1871.617,5727.281,0.5215871,0,0,0,0,100,0),
+(@PATH,15,1865.804,5766.67,0.806583,0,0,0,0,100,0),
+(@PATH,16,1861.121,5769.259,0.6014363,0,0,0,0,100,0),
+(@PATH,17,1853.309,5777.537,0.8029698,0,0,0,0,100,0),
+(@PATH,18,1838.146,5783.217,0.6276386,0,0,0,0,100,0),
+(@PATH,19,1838.138,5783.196,0.5076787,0,0,0,0,100,0),
+(@PATH,20,1838.511,5783.279,0.6102685,0,0,0,0,100,0),
+(@PATH,21,1853.596,5777.181,0.8157681,0,0,0,0,100,0),
+(@PATH,22,1872.897,5754.442,0.837615,0,0,0,0,100,0),
+(@PATH,23,1873.44,5750.595,0.7921225,0,0,0,0,100,0),
+(@PATH,24,1857.677,5717.557,0.05224757,0,0,0,0,100,0),
+(@PATH,25,1863.071,5721.263,0.5444731,0,0,0,0,100,0),
+(@PATH,26,1871.631,5727.291,0.5218816,0,0,0,0,100,0),
+(@PATH,27,1865.809,5766.73,0.8069472,0,0,0,0,100,0),
+(@PATH,28,1861.136,5769.112,0.6354876,0,0,0,0,100,0);
+-- 0x1C0914476018EC8000000B0000D90C39 .go 1863.071 5721.263 0.5444731
+
+-- Pathing for Entry: 25522 'TDB FORMAT'
+SET @NPC := 112671;
+SET @PATH := @NPC * 10;
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=1853.63,`position_y`=5846.966,`position_z`=2.740726 WHERE `guid`=@NPC;
+DELETE FROM `creature_addon` WHERE `guid`=@NPC;
+INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (@NPC,@PATH,0,0,1,0, '');
+DELETE FROM `waypoint_data` WHERE `id`=@PATH;
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES
+(@PATH,1,1853.63,5846.966,2.740726,0,0,0,0,100,0),
+(@PATH,2,1874.7,5836.919,4.813838,0,0,0,0,100,0),
+(@PATH,3,1876.592,5812.892,4.801723,0,0,0,0,100,0),
+(@PATH,4,1872.844,5797.556,3.118221,0,0,0,0,100,0),
+(@PATH,5,1875.815,5806.438,3.974422,0,0,0,0,100,0),
+(@PATH,6,1876.563,5816.451,5.334268,0,0,0,0,100,0),
+(@PATH,7,1877.032,5828.594,4.914,0,0,0,0,100,0),
+(@PATH,8,1862.273,5842.986,4.152772,0,0,0,0,100,0),
+(@PATH,9,1853.646,5846.958,2.74155,0,0,0,0,100,0),
+(@PATH,10,1849.364,5848.809,2.105818,0,0,0,0,100,0);
+-- 0x1C0914476018EC8000000B0000D90AF7 .go 1853.63 5846.966 2.740726
+
+
+-- Pathing for Entry: 25522 'TDB FORMAT'
+SET @NPC := 112766;
+SET @PATH := @NPC * 10;
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=1821.645,`position_y`=5874.956,`position_z`=2.705887 WHERE `guid`=@NPC;
+DELETE FROM `creature_addon` WHERE `guid`=@NPC;
+INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (@NPC,@PATH,0,0,1,0, '');
+DELETE FROM `waypoint_data` WHERE `id`=@PATH;
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES
+(@PATH,1,1821.645,5874.956,2.705887,0,0,0,0,100,0),
+(@PATH,2,1824.808,5874.413,2.800447,0,0,0,0,100,0),
+(@PATH,3,1827.45,5854.379,1.631521,0,0,0,0,100,0),
+(@PATH,4,1822.537,5840.488,1.119883,0,0,0,0,100,0),
+(@PATH,5,1819.79,5826.655,0.8782115,0,0,0,0,100,0),
+(@PATH,6,1816.417,5813.835,0.7204496,0,0,0,0,100,0),
+(@PATH,7,1816.219,5813.744,0.5043496,0,0,0,0,100,0),
+(@PATH,8,1816.581,5813.962,0.5907121,0,0,0,0,100,0),
+(@PATH,9,1820.05,5826.836,0.8006111,0,0,0,0,100,0),
+(@PATH,10,1828.175,5856.271,1.831071,0,0,0,0,100,0),
+(@PATH,11,1828.932,5859.332,2.491501,0,0,0,0,100,0),
+(@PATH,12,1816.584,5895.463,0.9250998,0,0,0,0,100,0),
+(@PATH,13,1821.645,5874.956,2.705887,0,0,0,0,100,0);
+-- 0x1C0914476018EC8000000B000159120F .go 1821.645 5874.956 2.705887
+
+UPDATE `creature` SET `spawndist`=10 WHERE `guid` IN (112682, 112762);
+
+-- Pathing for Entry: 25522 'TDB FORMAT'
+SET @NPC := 112761;
+SET @PATH := @NPC * 10;
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=1869.091,`position_y`=5953.953,`position_z`=6.38201 WHERE `guid`=@NPC;
+DELETE FROM `creature_addon` WHERE `guid`=@NPC;
+INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (@NPC,@PATH,0,0,1,0, '');
+DELETE FROM `waypoint_data` WHERE `id`=@PATH;
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES
+(@PATH,1,1869.091,5953.953,6.38201,0,0,0,0,100,0),
+(@PATH,2,1879.48,5943.066,7.114405,0,0,0,0,100,0),
+(@PATH,3,1905.42,5926.519,12.31866,0,0,0,0,100,0),
+(@PATH,4,1907.966,5924.864,12.90823,0,0,0,0,100,0),
+(@PATH,5,1907.694,5924.906,12.73229,0,0,0,0,100,0),
+(@PATH,6,1888.924,5936.15,8.416003,0,0,0,0,100,0),
+(@PATH,7,1885.86,5938.519,7.107553,0,0,0,0,100,0),
+(@PATH,8,1879.301,5943.302,7.06257,0,0,0,0,100,0),
+(@PATH,9,1863.642,5963.351,5.116355,0,0,0,0,100,0),
+(@PATH,10,1848.166,5986.37,2.711081,0,0,0,0,100,0),
+(@PATH,11,1856.702,5973.741,4.321182,0,0,0,0,100,0),
+(@PATH,12,1868.008,5955.694,6.300377,0,0,0,0,100,0),
+(@PATH,13,1869.092,5953.951,6.382379,0,0,0,0,100,0);
+-- 0x1C0914476018EC8000000B00005916B8 .go 1869.091 5953.953 6.38201
+
+-- Pathing for Entry: 25522 'TDB FORMAT'
+SET @NPC := 112764;
+SET @PATH := @NPC * 10;
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=1949.82,`position_y`=5779.809,`position_z`=10.0687 WHERE `guid`=@NPC;
+DELETE FROM `creature_addon` WHERE `guid`=@NPC;
+INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (@NPC,@PATH,0,0,1,0, '');
+DELETE FROM `waypoint_data` WHERE `id`=@PATH;
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES
+(@PATH,1,1949.82,5779.809,10.0687,0,0,0,0,100,0),
+(@PATH,2,1949.888,5780.269,10.04539,0,0,0,0,100,0),
+(@PATH,3,1959.407,5805.928,11.8103,0,0,0,0,100,0),
+(@PATH,4,1955.581,5821.07,13.57725,0,0,0,0,100,0),
+(@PATH,5,1949.136,5832.18,12.86915,0,0,0,0,100,0),
+(@PATH,6,1947.718,5833.966,12.66496,0,0,0,0,100,0),
+(@PATH,7,1944.919,5838.312,12.17096,0,0,0,0,100,0),
+(@PATH,8,1945.014,5838.031,12.05043,0,0,0,0,100,0),
+(@PATH,9,1945.333,5838.103,12.31259,0,0,0,0,100,0),
+(@PATH,10,1950.632,5829.593,14.2812,0,0,0,0,100,0),
+(@PATH,11,1959.209,5813.076,12.95494,0,0,0,0,100,0),
+(@PATH,12,1958.309,5800.833,11.20766,0,0,0,0,100,0),
+(@PATH,13,1953.69,5789.138,10.24553,0,0,0,0,100,0),
+(@PATH,14,1952.009,5763.52,9.059128,0,0,0,0,100,0),
+(@PATH,15,1949.82,5779.809,10.0687,0,0,0,0,100,0);
+-- 0x1C0914476018EC8000000B0001D91590 .go 1949.82 5779.809 10.0687
+
+-- Pathing for Entry: 25464 'TDB FORMAT'
+SET @NPC := 132708;
+SET @PATH := @NPC * 10;
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=2822.261,`position_y`=5519.366,`position_z`=53.74162 WHERE `guid`=@NPC;
+DELETE FROM `creature_addon` WHERE `guid`=@NPC;
+INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (@NPC,@PATH,0,0,1,0, '');
+DELETE FROM `waypoint_data` WHERE `id`=@PATH;
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES
+(@PATH,1,2822.261,5519.366,53.74162,0,0,0,0,100,0),
+(@PATH,2,2823.339,5522.105,53.3661,0,0,0,0,100,0),
+(@PATH,3,2816.756,5522.176,52.7483,0,0,0,0,100,0),
+(@PATH,4,2815.625,5523.958,52.19855,0,0,0,0,100,0),
+(@PATH,5,2815.16,5520.309,52.78535,0,0,0,0,100,0),
+(@PATH,6,2820.333,5521.584,53.39899,0,0,0,0,100,0),
+(@PATH,7,2824.778,5510.136,55.34394,0,0,0,0,100,0),
+(@PATH,8,2815.103,5518.417,53.53315,0,0,0,0,100,0),
+(@PATH,9,2819.598,5522.154,52.91368,0,0,0,0,100,0),
+(@PATH,10,2822.082,5521.53,53.60404,0,0,0,0,100,0),
+(@PATH,11,2818.371,5523.108,52.66743,0,0,0,0,100,0),
+(@PATH,12,2819.409,5516.978,53.96194,0,0,0,0,100,0),
+(@PATH,13,2823.384,5522.104,53.37409,0,0,0,0,100,0),
+(@PATH,14,2825.392,5523.739,52.87629,0,0,0,0,100,0),
+(@PATH,15,2815.691,5521.912,52.45197,0,0,0,0,100,0),
+(@PATH,16,2814.33,5518.599,52.92414,0,0,0,0,100,0),
+(@PATH,17,2815.653,5522.167,52.41706,0,0,0,0,100,0),
+(@PATH,18,2821.683,5522.525,53.24909,0,0,0,0,100,0),
+(@PATH,19,2822.436,5520.497,53.40412,0,0,0,0,100,0),
+(@PATH,20,2822.451,5523.602,53.0274,0,0,0,0,100,0),
+(@PATH,21,2815.243,5522.016,52.44831,0,0,0,0,100,0),
+(@PATH,22,2818.638,5521.292,53.17999,0,0,0,0,100,0),
+(@PATH,23,2822.181,5517.789,54.00129,0,0,0,0,100,0),
+(@PATH,24,2822.296,5519.241,53.7021,0,0,0,0,100,0),
+(@PATH,25,2816.71,5523.35,52.70033,0,0,0,0,100,0),
+(@PATH,26,2819.778,5520.425,53.55138,0,0,0,0,100,0),
+(@PATH,27,2824.004,5522.665,53.19855,0,0,0,0,100,0),
+(@PATH,28,2822.11,5517.678,54.01472,0,0,0,0,100,0),
+(@PATH,29,2823.61,5518.823,53.80622,0,0,0,0,100,0),
+(@PATH,30,2824.499,5512.02,55.12739,0,0,0,0,100,0),
+(@PATH,31,2824.968,5518.775,54.21228,0,0,0,0,100,0),
+(@PATH,32,2822.294,5517.814,53.99824,0,0,0,0,100,0),
+(@PATH,33,2818.368,5520.58,53.24421,0,0,0,0,100,0),
+(@PATH,34,2822.198,5523.147,52.89338,0,0,0,0,100,0),
+(@PATH,35,2819.597,5521.721,53.0246,0,0,0,0,100,0),
+(@PATH,36,2822.367,5519.021,53.98109,0,0,0,0,100,0),
+(@PATH,37,2826.401,5522.089,53.23542,0,0,0,0,100,0),
+(@PATH,38,2816.553,5521.619,52.96187,0,0,0,0,100,0),
+(@PATH,39,2825.091,5521.14,53.50007,0,0,0,0,100,0),
+(@PATH,40,2822.17,5524.09,52.63996,0,0,0,0,100,0),
+(@PATH,41,2823.85,5520.973,53.41511,0,0,0,0,100,0),
+(@PATH,42,2823.884,5524.132,52.88813,0,0,0,0,100,0),
+(@PATH,43,2823.595,5521.119,53.4554,0,0,0,0,100,0),
+(@PATH,44,2822.149,5521.591,53.26643,0,0,0,0,100,0),
+(@PATH,45,2825.091,5523.302,52.98078,0,0,0,0,100,0);
+-- 0x1C0914476018DE0000000B00005919F4 .go 2822.261 5519.366 53.74162
+
+-- Pathing for Entry: 25719 'TDB FORMAT'
+SET @NPC := 122683;
+SET @PATH := @NPC * 10;
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=3856.668,`position_y`=6592.438,`position_z`=165.8591 WHERE `guid`=@NPC;
+DELETE FROM `creature_addon` WHERE `guid`=@NPC;
+INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (@NPC,@PATH,0,0,1,0, '');
+DELETE FROM `waypoint_data` WHERE `id`=@PATH;
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES
+(@PATH,1,3856.668,6592.438,165.8591,0,0,0,0,100,0),
+(@PATH,2,3845.146,6580.313,167.2839,0,0,0,0,100,0),
+(@PATH,3,3819.979,6552.679,171.2212,0,0,0,0,100,0),
+(@PATH,4,3834.785,6568.925,168.5641,0,0,0,0,100,0),
+(@PATH,5,3856.229,6592.091,166.1844,0,0,0,0,100,0),
+(@PATH,6,3856.884,6592.668,166.1273,0,0,0,0,100,0),
+(@PATH,7,3856.668,6592.438,165.8591,0,0,0,0,100,0);
+-- 0x1C09144760191DC000000C00005923F6 .go 3856.668 6592.438 165.8591
+
+DELETE FROM `creature_formations` WHERE `leaderGUID`=122683;
+INSERT INTO `creature_formations` (`leaderGUID`, `memberGUID`, `dist`, `angle`, `groupAI`, `point_1`, `point_2`) VALUES
+(122683, 122683, 0, 0, 2, 0, 0),
+(122683, 122668, 4, 0, 2, 0, 0);
+
+-- Pathing for Entry: 25719 'TDB FORMAT'
+SET @NPC := 122679;
+SET @PATH := @NPC * 10;
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=3877.737,`position_y`=6617.055,`position_z`=165.4812 WHERE `guid`=@NPC;
+DELETE FROM `creature_addon` WHERE `guid`=@NPC;
+INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (@NPC,@PATH,0,0,1,0, '');
+DELETE FROM `waypoint_data` WHERE `id`=@PATH;
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES
+(@PATH,1,3877.737,6617.055,165.4812,0,0,0,0,100,0),
+(@PATH,2,3876.591,6615.319,165.2154,0,0,0,0,100,0),
+(@PATH,3,3876.513,6615.291,165.0491,0,0,0,0,100,0),
+(@PATH,4,3881.765,6622.608,165.9126,0,0,0,0,100,0),
+(@PATH,5,3887.004,6630.904,166.6272,0,0,0,0,100,0),
+(@PATH,6,3890.648,6642.739,166.3096,0,0,0,0,100,0),
+(@PATH,7,3895.043,6655.15,167.9105,0,0,0,0,100,0),
+(@PATH,8,3892.582,6650.448,166.6568,0,0,0,0,100,0),
+(@PATH,9,3890.725,6641.271,166.7931,0,0,0,0,100,0),
+(@PATH,10,3886.259,6630.026,166.4984,0,0,0,0,100,0),
+(@PATH,11,3877.767,6616.941,165.558,0,0,0,0,100,0),
+(@PATH,12,3876.568,6615.188,165.1826,0,0,0,0,100,0),
+(@PATH,13,3876.513,6615.291,165.0491,0,0,0,0,100,0),
+(@PATH,14,3881.689,6622.583,165.9073,0,0,0,0,100,0),
+(@PATH,15,3886.83,6631.109,166.6665,0,0,0,0,100,0),
+(@PATH,16,3890.699,6642.743,166.3585,0,0,0,0,100,0);
+-- 0x1C09144760191DC000000C00005923E0 .go 3877.737 6617.055 165.4812
+
+DELETE FROM `creature_formations` WHERE `leaderGUID`=122679;
+INSERT INTO `creature_formations` (`leaderGUID`, `memberGUID`, `dist`, `angle`, `groupAI`, `point_1`, `point_2`) VALUES
+(122679, 122679, 0, 0, 2, 0, 0),
+(122679, 122664, 4, 0, 2, 0, 0);
+
+-- Pathing for Entry: 25719 'TDB FORMAT'
+SET @NPC := 122682;
+SET @PATH := @NPC * 10;
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=3802.633,`position_y`=6610.85,`position_z`=160.9254 WHERE `guid`=@NPC;
+DELETE FROM `creature_addon` WHERE `guid`=@NPC;
+INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (@NPC,@PATH,0,0,1,0, '');
+DELETE FROM `waypoint_data` WHERE `id`=@PATH;
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES
+(@PATH,1,3802.633,6610.85,160.9254,0,0,0,0,100,0),
+(@PATH,2,3814.249,6608.161,162.6728,0,0,0,0,100,0),
+(@PATH,3,3817.92,6607.578,162.962,0,0,0,0,100,0),
+(@PATH,4,3817.757,6607.444,162.8091,0,0,0,0,100,0),
+(@PATH,5,3809.16,6609.176,161.7681,0,0,0,0,100,0),
+(@PATH,6,3794.561,6613.893,159.8145,0,0,0,0,100,0),
+(@PATH,7,3787.977,6622.479,157.1806,0,0,0,0,100,0),
+(@PATH,8,3777.748,6635.708,153.5259,0,0,0,0,100,0);
+-- 0x1C09144760191DC000000C000059215B .go 3802.633 6610.85 160.9254
+
+DELETE FROM `creature_formations` WHERE `leaderGUID`=122682;
+INSERT INTO `creature_formations` (`leaderGUID`, `memberGUID`, `dist`, `angle`, `groupAI`, `point_1`, `point_2`) VALUES
+(122682, 122682, 0, 0, 2, 0, 0),
+(122682, 122667, 4, 0, 2, 0, 0);
+
+-- Pathing for Entry: 25719 'TDB FORMAT'
+SET @NPC := 122671;
+SET @PATH := @NPC * 10;
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=3876.684,`position_y`=6542.924,`position_z`=175.354 WHERE `guid`=@NPC;
+DELETE FROM `creature_addon` WHERE `guid`=@NPC;
+INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (@NPC,@PATH,0,0,1,0, '');
+DELETE FROM `waypoint_data` WHERE `id`=@PATH;
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES
+(@PATH,1,3876.684,6542.924,175.354,0,0,0,0,100,0),
+(@PATH,2,3865.112,6532.595,176.6299,0,0,0,0,100,0),
+(@PATH,3,3868.344,6534.336,176.2356,0,0,0,0,100,0),
+(@PATH,4,3880.712,6554.647,173.5269,0,0,0,0,100,0),
+(@PATH,5,3880.566,6581.678,168.6076,0,0,0,0,100,0),
+(@PATH,6,3881.85,6561.938,171.8416,0,0,0,0,100,0),
+(@PATH,7,3876.725,6542.939,175.2055,0,0,0,0,100,0),
+(@PATH,8,3864.951,6532.556,176.746,0,0,0,0,100,0),
+(@PATH,9,3868.344,6534.336,176.2356,0,0,0,0,100,0);
+-- 0x1C09144760191DC000000C0000592014 .go 3876.684 6542.924 175.354
+
+DELETE FROM `creature_formations` WHERE `leaderGUID`=122671;
+INSERT INTO `creature_formations` (`leaderGUID`, `memberGUID`, `dist`, `angle`, `groupAI`, `point_1`, `point_2`) VALUES
+(122671, 122671, 0, 0, 2, 0, 0),
+(122671, 122660, 4, 0, 2, 0, 0);
+
+-- Pathing for Entry: 25719 'TDB FORMAT'
+SET @NPC := 122681;
+SET @PATH := @NPC * 10;
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=3856.668,`position_y`=6592.438,`position_z`=165.8591 WHERE `guid`=@NPC;
+DELETE FROM `creature_addon` WHERE `guid`=@NPC;
+INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (@NPC,@PATH,0,0,1,0, '');
+DELETE FROM `waypoint_data` WHERE `id`=@PATH;
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES
+(@PATH,1,3856.668,6592.438,165.8591,0,0,0,0,100,0),
+(@PATH,2,3845.146,6580.313,167.2839,0,0,0,0,100,0),
+(@PATH,3,3819.979,6552.679,171.2212,0,0,0,0,100,0),
+(@PATH,4,3834.785,6568.925,168.5641,0,0,0,0,100,0),
+(@PATH,5,3856.229,6592.091,166.1844,0,0,0,0,100,0),
+(@PATH,6,3856.884,6592.668,166.1273,0,0,0,0,100,0),
+(@PATH,7,3856.668,6592.438,165.8591,0,0,0,0,100,0);
+-- 0x1C09144760191DC000000C00005923F6 .go 3856.668 6592.438 165.8591
+
+DELETE FROM `creature_formations` WHERE `leaderGUID`=122681;
+INSERT INTO `creature_formations` (`leaderGUID`, `memberGUID`, `dist`, `angle`, `groupAI`, `point_1`, `point_2`) VALUES
+(122681, 122681, 0, 0, 2, 0, 0),
+(122681, 122666, 4, 0, 2, 0, 0);
+
+UPDATE `creature` SET `spawndist`=15 WHERE `guid`=122549;
+UPDATE `creature` SET `spawndist`=20 WHERE `guid`=122548;
+
+-- Pathing for Entry: 25719 'TDB FORMAT'
+SET @NPC := 122675;
+SET @PATH := @NPC * 10;
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=3772.382,`position_y`=6700.643,`position_z`=150.745 WHERE `guid`=@NPC;
+DELETE FROM `creature_addon` WHERE `guid`=@NPC;
+INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (@NPC,@PATH,0,0,1,0, '');
+DELETE FROM `waypoint_data` WHERE `id`=@PATH;
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES
+(@PATH,1,3772.382,6700.643,150.745,0,0,0,0,100,0),
+(@PATH,2,3765.955,6706.445,152.0959,0,0,0,0,100,0),
+(@PATH,3,3760.302,6711.588,152.1358,0,0,0,0,100,0),
+(@PATH,4,3750.747,6726.564,151.7103,0,0,0,0,100,0),
+(@PATH,5,3749.879,6729.181,151.658,0,0,0,0,100,0),
+(@PATH,6,3750.81,6726.225,151.6613,0,0,0,0,100,0),
+(@PATH,7,3771.484,6701.582,151.0565,0,0,0,0,100,0),
+(@PATH,8,3772.745,6700.572,150.9297,0,0,0,0,100,0),
+(@PATH,9,3772.382,6700.643,150.745,0,0,0,0,100,0);
+-- 0x1C09144760191DC000000C0000592493 .go 3772.382 6700.643 150.745
+
+DELETE FROM `creature_formations` WHERE `leaderGUID`=122675;
+INSERT INTO `creature_formations` (`leaderGUID`, `memberGUID`, `dist`, `angle`, `groupAI`, `point_1`, `point_2`) VALUES
+(122675, 122675, 0, 0, 2, 0, 0),
+(122675, 122661, 4, 0, 2, 0, 0);
+
+
+-- Pathing for Entry: 25719 'TDB FORMAT'
+SET @NPC := 122678;
+SET @PATH := @NPC * 10;
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=3765.189,`position_y`=6646.188,`position_z`=152.2007 WHERE `guid`=@NPC;
+DELETE FROM `creature_addon` WHERE `guid`=@NPC;
+INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (@NPC,@PATH,0,0,1,0, '');
+DELETE FROM `waypoint_data` WHERE `id`=@PATH;
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES
+(@PATH,1,3765.189,6646.188,152.2007,0,0,0,0,100,0),
+(@PATH,2,3761.339,6649.458,151.591,0,0,0,0,100,0),
+(@PATH,3,3761.412,6649.275,151.5081,0,0,0,0,100,0),
+(@PATH,4,3775.332,6638.132,152.7523,0,0,0,0,100,0),
+(@PATH,5,3784.681,6626.98,155.8878,0,0,0,0,100,0),
+(@PATH,6,3791.935,6616.86,158.9415,0,0,0,0,100,0),
+(@PATH,7,3802.772,6610.692,160.7068,0,0,0,0,100,0),
+(@PATH,8,3814.205,6608.264,162.5391,0,0,0,0,100,0),
+(@PATH,9,3817.96,6607.651,162.9075,0,0,0,0,100,0),
+(@PATH,10,3817.757,6607.444,162.8091,0,0,0,0,100,0),
+(@PATH,11,3809.104,6609.054,161.8425,0,0,0,0,100,0),
+(@PATH,12,3794.503,6613.823,159.8757,0,0,0,0,100,0),
+(@PATH,13,3788.144,6622.311,157.2462,0,0,0,0,100,0),
+(@PATH,14,3777.916,6635.792,153.5504,0,0,0,0,100,0),
+(@PATH,15,3765.363,6646.322,152.2002,0,0,0,0,100,0),
+(@PATH,16,3761.535,6649.459,151.5641,0,0,0,0,100,0),
+(@PATH,17,3761.412,6649.275,151.5081,0,0,0,0,100,0),
+(@PATH,18,3775.165,6638.005,152.7578,0,0,0,0,100,0),
+(@PATH,19,3784.59,6626.891,155.6862,0,0,0,0,100,0);
+-- 0x1C09144760191DC000000C0000592B08 .go 3765.189 6646.188 152.2007
+
+DELETE FROM `creature_formations` WHERE `leaderGUID`=122678;
+INSERT INTO `creature_formations` (`leaderGUID`, `memberGUID`, `dist`, `angle`, `groupAI`, `point_1`, `point_2`) VALUES
+(122678, 122678, 0, 0, 2, 0, 0),
+(122678, 122663, 4, 0, 2, 0, 0);
+
+-- Pathing for Entry: 25719 'TDB FORMAT'
+SET @NPC := 122684;
+SET @PATH := @NPC * 10;
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=3726.047,`position_y`=6604.721,`position_z`=171.6309 WHERE `guid` IN (@NPC, 122669);
+DELETE FROM `creature_addon` WHERE `guid`=@NPC;
+INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (@NPC,@PATH,0,0,1,0, '');
+DELETE FROM `waypoint_data` WHERE `id`=@PATH;
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES
+(@PATH,1,3726.047,6604.721,171.6309,0,0,0,0,100,0),
+(@PATH,2,3737.404,6582.727,172.9987,0,0,0,0,100,0),
+(@PATH,3,3752.602,6559.511,175.07,0,0,0,0,100,0),
+(@PATH,4,3757.825,6548.518,176.1503,0,0,0,0,100,0),
+(@PATH,5,3741.299,6576.517,173.8608,0,0,0,0,100,0),
+(@PATH,6,3731.644,6593.12,172.3642,0,0,0,0,100,0),
+(@PATH,7,3725.372,6606.514,171.4347,0,0,0,0,100,0),
+(@PATH,8,3726.047,6604.721,171.6309,0,0,0,0,100,0);
+-- 0x1C09144760191DC000000C0000592BE0 .go 3726.047 6604.721 171.6309
+
+DELETE FROM `creature_formations` WHERE `leaderGUID`=122684;
+INSERT INTO `creature_formations` (`leaderGUID`, `memberGUID`, `dist`, `angle`, `groupAI`, `point_1`, `point_2`) VALUES
+(122684, 122684, 0, 0, 2, 0, 0),
+(122684, 122669, 4, 0, 2, 0, 0);
+
+-- Coldarra Spellweaver SAI
+SET @ENTRY := 25722;
+UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,0,0,0,0,0,100,0,0,0,600,5300,11,34447,64,0,0,0,0,2,0,0,0,0,0,0,0,"Coldarra Spellweaver - In Combat - Cast 'Arcane Missiles'"),
+(@ENTRY,0,1,0,1,0,100,0,100,100,45000,45000,11,39550,0,0,0,0,0,1,0,0,0,0,0,0,0,"Coldarra Spellweaver - Out of Combat - Cast 'Arcane Channeling'");
+
+-- Coldarra Spellbinder SAI
+SET @ENTRY := 25719;
+UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,0,0,0,0,0,100,0,0,0,3900,5800,11,9672,64,0,0,0,0,2,0,0,0,0,0,0,0,"Coldarra Spellbinder - In Combat - Cast 'Frostbolt'"),
+(@ENTRY,0,1,0,0,0,100,0,1700,13500,172100,172100,11,50583,1,0,0,0,0,1,0,0,0,0,0,0,0,"Coldarra Spellbinder - In Combat - Cast 'Summon Frozen Spheres'"),
+(@ENTRY,0,2,0,1,0,100,0,100,100,45000,45000,11,39550,0,0,0,0,0,1,0,0,0,0,0,0,0,"Coldarra Spellbinder - Out of Combat - Cast 'Arcane Channeling'");
+
+-- Inquisitor Caleras SAI
+SET @ENTRY := 25720;
+UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,0,0,0,0,0,100,0,0,0,3400,6200,11,15043,64,0,0,0,0,2,0,0,0,0,0,0,0,"Inquisitor Caleras - In Combat - Cast 'Frostbolt'"),
+(@ENTRY,0,1,0,0,0,100,0,9800,21300,18400,18400,11,32192,1,0,0,0,0,1,0,0,0,0,0,0,0,"Inquisitor Caleras - In Combat - Cast 'Frost Nova'"),
+(@ENTRY,0,2,0,1,0,100,0,100,100,45000,45000,11,39550,0,0,0,0,0,1,0,0,0,0,0,0,0,"Inquisitor Caleras - Out of Combat - Cast 'Arcane Channeling'");
+
+-- Pathing for Entry: 25719 'TDB FORMAT'
+SET @NPC := 122676;
+SET @PATH := @NPC * 10;
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=3839.049,`position_y`=6746.131,`position_z`=150.8772 WHERE `guid`=@NPC;
+DELETE FROM `creature_addon` WHERE `guid`=@NPC;
+INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (@NPC,@PATH,0,0,1,0, '');
+DELETE FROM `waypoint_data` WHERE `id`=@PATH;
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES
+(@PATH,1,3839.049,6746.131,150.8772,0,0,0,0,100,0),
+(@PATH,2,3838.777,6746.075,150.6292,0,0,0,0,100,0),
+(@PATH,3,3838.793,6746.344,150.9143,0,0,0,0,100,0),
+(@PATH,4,3826.649,6753.63,150.9941,0,0,0,0,100,0),
+(@PATH,5,3811.169,6750.051,150.4951,0,0,0,0,100,0),
+(@PATH,6,3811.172,6750.112,150.299,0,0,0,0,100,0),
+(@PATH,7,3811.489,6750.411,150.5408,0,0,0,0,100,0),
+(@PATH,8,3826.923,6753.677,150.8951,0,0,0,0,100,0),
+(@PATH,9,3839.046,6746.012,150.8834,0,0,0,0,100,0),
+(@PATH,10,3838.777,6746.075,150.6292,0,0,0,0,100,0),
+(@PATH,11,3838.828,6746.229,150.9149,0,0,0,0,100,0),
+(@PATH,12,3826.723,6753.648,150.7468,0,0,0,0,100,0);
+-- 0x1C09144760191DC000000C00005924AC .go 3839.049 6746.131 150.8772
+
+DELETE FROM `creature_formations` WHERE `leaderGUID`=122676;
+INSERT INTO `creature_formations` (`leaderGUID`, `memberGUID`, `dist`, `angle`, `groupAI`, `point_1`, `point_2`) VALUES
+(122676, 122676, 0, 0, 2, 0, 0),
+(122676, 122662, 4, 0, 2, 0, 0);
+
+-- Pathing for Entry: 25719 'TDB FORMAT'
+SET @NPC := 122680;
+SET @PATH := @NPC * 10;
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=3863.127,`position_y`=6753.518,`position_z`=150.5189 WHERE `guid`=@NPC;
+DELETE FROM `creature_addon` WHERE `guid`=@NPC;
+INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (@NPC,@PATH,0,0,1,0, '');
+DELETE FROM `waypoint_data` WHERE `id`=@PATH;
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES
+(@PATH,1,3863.127,6753.518,150.5189,0,0,0,0,100,0),
+(@PATH,2,3860.453,6741.29,150.7381,0,0,0,0,100,0),
+(@PATH,3,3875.973,6736.009,151.0474,0,0,0,0,100,0),
+(@PATH,4,3886.431,6727.403,151.3167,0,0,0,0,100,0),
+(@PATH,5,3886.167,6727.198,151.1895,0,0,0,0,100,0),
+(@PATH,6,3886.265,6727.485,151.3074,0,0,0,0,100,0),
+(@PATH,7,3875.836,6736.28,151.0612,0,0,0,0,100,0),
+(@PATH,8,3860.38,6741.66,150.7448,0,0,0,0,100,0),
+(@PATH,9,3862.974,6753.514,150.6811,0,0,0,0,100,0),
+(@PATH,10,3867.98,6753.716,150.6562,0,0,0,0,100,0);
+-- 0x1C09144760191DC000000C00005924B3 .go 3863.127 6753.518 150.5189
+
+DELETE FROM `creature_formations` WHERE `leaderGUID`=122680;
+INSERT INTO `creature_formations` (`leaderGUID`, `memberGUID`, `dist`, `angle`, `groupAI`, `point_1`, `point_2`) VALUES
+(122680, 122680, 0, 0, 2, 0, 0),
+(122680, 122665, 4, 0, 2, 0, 0);
+
+-- Pathing for Entry: 25719 'TDB FORMAT'
+SET @NPC := 122685;
+SET @PATH := @NPC * 10;
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=3908.275,`position_y`=6757.146,`position_z`=150.8441 WHERE `guid`=@NPC;
+DELETE FROM `creature_addon` WHERE `guid`=@NPC;
+INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (@NPC,@PATH,0,0,1,0, '');
+DELETE FROM `waypoint_data` WHERE `id`=@PATH;
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES
+(@PATH,1,3908.275,6757.146,150.8441,0,0,0,0,100,0),
+(@PATH,2,3893.045,6770.693,150.8547,0,0,0,0,100,0),
+(@PATH,3,3880.528,6782.54,150.7091,0,0,0,0,100,0),
+(@PATH,4,3880.478,6782.537,150.6073,0,0,0,0,100,0),
+(@PATH,5,3880.76,6782.527,150.8653,0,0,0,0,100,0),
+(@PATH,6,3893.34,6770.562,150.8441,0,0,0,0,100,0),
+(@PATH,7,3908.603,6756.879,150.896,0,0,0,0,100,0),
+(@PATH,8,3925.911,6721.284,153.766,0,0,0,0,100,0),
+(@PATH,9,3920.531,6713.925,153.515,0,0,0,0,100,0),
+(@PATH,10,3906.757,6706.551,151.9455,0,0,0,0,100,0),
+(@PATH,11,3894.688,6701.577,151.5052,0,0,0,0,100,0),
+(@PATH,12,3894.756,6701.676,151.4043,0,0,0,0,100,0),
+(@PATH,13,3916.371,6709.826,152.6267,0,0,0,0,100,0),
+(@PATH,14,3921.297,6714.496,153.5745,0,0,0,0,100,0),
+(@PATH,15,3929.399,6745.379,151.6542,0,0,0,0,100,0),
+(@PATH,16,3919.581,6752.038,150.9705,0,0,0,0,100,0),
+(@PATH,17,3908.269,6757.149,150.8441,0,0,0,0,100,0),
+(@PATH,18,3893.047,6770.691,150.8547,0,0,0,0,100,0),
+(@PATH,19,3880.51,6782.556,150.7091,0,0,0,0,100,0);
+-- 0x1C09144760191DC000000C00005932EB .go 3908.275 6757.146 150.8441
+
+DELETE FROM `creature_formations` WHERE `leaderGUID`=122685;
+INSERT INTO `creature_formations` (`leaderGUID`, `memberGUID`, `dist`, `angle`, `groupAI`, `point_1`, `point_2`) VALUES
+(122685, 122685, 0, 0, 2, 0, 0),
+(122685, 122670, 4, 0, 2, 0, 0);
+
+UPDATE `creature` SET `spawndist`=20 WHERE `guid`=122550;
+
+UPDATE `creature` SET `spawndist`=15 WHERE `id`=25721;
+
+-- Pathing for Entry: 25717 'TDB FORMAT'
+SET @NPC := 122652;
+SET @PATH := @NPC * 10;
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=4071.958,`position_y`=7059.748,`position_z`=166.7365 WHERE `guid`=@NPC;
+DELETE FROM `creature_addon` WHERE `guid`=@NPC;
+INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (@NPC,@PATH,0,0,1,0, '');
+DELETE FROM `waypoint_data` WHERE `id`=@PATH;
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES
+(@PATH,1,4071.958,7059.748,166.7365,0,0,0,0,100,0),
+(@PATH,2,4072.932,7060.661,166.5419,0,0,0,0,100,0),
+(@PATH,3,4087.155,7066.582,166.7904,0,0,0,0,100,0),
+(@PATH,4,4086.809,7066.466,166.6568,0,0,0,0,100,0),
+(@PATH,5,4086.776,7066.416,166.7174,0,0,0,0,100,0),
+(@PATH,6,4062.645,7049.889,167.7236,0,0,0,0,100,0),
+(@PATH,7,4054.082,7027.509,166.672,0,0,0,0,100,0),
+(@PATH,8,4059.144,7041.778,167.9961,0,0,0,0,100,0),
+(@PATH,9,4071.981,7059.813,166.7345,0,0,0,0,100,0);
+-- 0x1C09144760191D4000000C00005932C9 .go 4071.958 7059.748 166.7365
+
+-- General Cerulean SAI
+SET @ENTRY := 25716;
+UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,0,0,0,0,0,100,0,10200,13600,10000,12000,11,15499,0,0,0,0,0,2,0,0,0,0,0,0,0,"General Cerulean - In Combat - Cast 'Frost Shock'"),
+(@ENTRY,0,1,0,1,0,100,0,100,100,45000,45000,11,39550,0,0,0,0,0,1,0,0,0,0,0,0,0,"General Cerulean - Out of Combat - Cast 'Arcane Channeling'");
+
+UPDATE `creature` SET `spawndist`=20 WHERE `guid` IN (122547, 122551);
+
+-- Pathing for Entry: 25713 'TDB FORMAT'
+SET @NPC := 122611;
+SET @PATH := @NPC * 10;
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=3820.672,`position_y`=7153.959,`position_z`=163.4258 WHERE `guid`=@NPC;
+DELETE FROM `creature_addon` WHERE `guid`=@NPC;
+INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (@NPC,@PATH,0,0,1,0, '');
+DELETE FROM `waypoint_data` WHERE `id`=@PATH;
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES
+(@PATH,1,3820.672,7153.959,163.4258,0,0,0,0,100,0),
+(@PATH,2,3816.873,7173.65,161.3409,0,0,0,0,100,0),
+(@PATH,3,3819.527,7160.829,162.4046,0,0,0,0,100,0),
+(@PATH,4,3821.152,7145.412,164.2622,0,0,0,0,100,0),
+(@PATH,5,3820.075,7133.457,165.5549,0,0,0,0,100,0),
+(@PATH,6,3819.108,7129.334,166.0357,0,0,0,0,100,0),
+(@PATH,7,3819.164,7129.457,165.8505,0,0,0,0,100,0),
+(@PATH,8,3820.722,7140.354,165.1108,0,0,0,0,100,0),
+(@PATH,9,3820.762,7154.072,163.3669,0,0,0,0,100,0),
+(@PATH,10,3816.832,7173.758,161.5131,0,0,0,0,100,0);
+-- 0x1C09144760191C4000000C0000590957 .go 3820.672 7153.959 163.4258
+
+-- Pathing for Entry: 25713 'TDB FORMAT'
+SET @NPC := 122643;
+SET @PATH := @NPC * 10;
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=3715.234,`position_y`=7159.224,`position_z`=160.5815 WHERE `guid`=@NPC;
+DELETE FROM `creature_addon` WHERE `guid`=@NPC;
+INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (@NPC,@PATH,0,0,1,0, '');
+DELETE FROM `waypoint_data` WHERE `id`=@PATH;
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES
+(@PATH,1,3715.234,7159.224,160.5815,0,0,0,0,100,0),
+(@PATH,2,3712.465,7168.071,160.3927,0,0,0,0,100,0),
+(@PATH,3,3711.697,7180.112,160.1553,0,0,0,0,100,0),
+(@PATH,4,3712.53,7195.874,160.5102,0,0,0,0,100,0),
+(@PATH,5,3712.202,7195.61,160.2491,0,0,0,0,100,0),
+(@PATH,6,3712.354,7195.505,160.5099,0,0,0,0,100,0),
+(@PATH,7,3711.637,7179.952,160.1052,0,0,0,0,100,0),
+(@PATH,8,3712.478,7167.976,160.2884,0,0,0,0,100,0),
+(@PATH,9,3715.501,7158.848,160.5296,0,0,0,0,100,0),
+(@PATH,10,3715.303,7158.94,160.4226,0,0,0,0,100,0),
+(@PATH,11,3715.255,7159.067,160.5904,0,0,0,0,100,0),
+(@PATH,12,3712.359,7168.119,160.3639,0,0,0,0,100,0),
+(@PATH,13,3711.62,7180.215,160.1398,0,0,0,0,100,0),
+(@PATH,14,3712.332,7195.925,160.5264,0,0,0,0,100,0);
+-- 0x1C09144760191C4000000C0000592DB7 .go 3715.234 7159.224 160.5815
+
+-- Warbringer Goredrak SAI
+SET @ENTRY := 25712;
+UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,0,0,0,0,0,100,0,0,200,16900,21200,11,50534,0,0,0,0,0,2,0,0,0,0,0,0,0,"Warbringer Goredrak - In Combat - Cast 'Power Sap'"),
+(@ENTRY,0,1,0,0,0,100,0,5900,6700,16800,21200,11,50545,1,0,0,0,0,2,0,0,0,0,0,0,0,"Warbringer Goredrak - In Combat - Cast 'Arcane Blast'"),
+(@ENTRY,0,2,0,1,0,100,0,100,100,45000,45000,11,39550,0,0,0,0,0,1,0,0,0,0,0,0,0,"Warbringer Goredrak - Out of Combat - Cast 'Arcane Channeling'");
+
+UPDATE `creature` SET `spawndist`=10 WHERE `guid`=122806;
+UPDATE `creature` SET `spawndist`=15 WHERE `guid` IN (122824, 122545);
+-- Pathing for Entry: 25709 'TDB FORMAT'
+SET @NPC := 122562;
+SET @PATH := @NPC * 10;
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=3821.72,`position_y`=7226.874,`position_z`=165.7941 WHERE `guid`=@NPC;
+DELETE FROM `creature_addon` WHERE `guid`=@NPC;
+INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (@NPC,@PATH,0,0,1,0, '');
+DELETE FROM `waypoint_data` WHERE `id`=@PATH;
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES
+(@PATH,1,3821.72,7226.874,165.7941,0,0,0,0,100,0),
+(@PATH,2,3840.45,7225.532,167.5351,0,0,0,0,100,0),
+(@PATH,3,3854.693,7219.692,168.801,0,0,0,0,100,0),
+(@PATH,4,3872.789,7201.074,168.0432,0,0,0,0,100,0),
+(@PATH,5,3877.849,7192.911,167.4686,0,0,0,0,100,0),
+(@PATH,6,3853.227,7162.686,166.2984,0,0,0,0,100,0),
+(@PATH,7,3831.403,7190.82,162.3192,0,0,0,0,100,0),
+(@PATH,8,3821.685,7226.815,165.7664,0,0,0,0,100,0);
+-- 0x1C09144760191B4000000C00005929B2 .go 3821.72 7226.874 165.7941
+
+-- Pathing for Entry: 25717 'TDB FORMAT'
+SET @NPC := 122655;
+SET @PATH := @NPC * 10;
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=4158.797,`position_y`=7025.598,`position_z`=165.7506 WHERE `guid`=@NPC;
+DELETE FROM `creature_addon` WHERE `guid`=@NPC;
+INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (@NPC,@PATH,0,0,1,0, '');
+DELETE FROM `waypoint_data` WHERE `id`=@PATH;
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES
+(@PATH,1,4158.797,7025.598,165.7506,0,0,0,0,100,0),
+(@PATH,2,4158.771,7025.846,166.0288,0,0,0,0,100,0),
+(@PATH,3,4149.362,7040.18,166.0216,0,0,0,0,100,0),
+(@PATH,4,4141.375,7046.86,165.9186,0,0,0,0,100,0),
+(@PATH,5,4128.7,7050.973,165.6986,0,0,0,0,100,0),
+(@PATH,6,4128.795,7050.833,165.5718,0,0,0,0,100,0),
+(@PATH,7,4129.043,7050.743,165.6772,0,0,0,0,100,0),
+(@PATH,8,4141.438,7046.565,166.0175,0,0,0,0,100,0),
+(@PATH,9,4149.486,7040.006,166.0294,0,0,0,0,100,0),
+(@PATH,10,4159.022,7025.654,165.9743,0,0,0,0,100,0);
+-- 0x1C09144760191D4000000C000059272B .go 4158.797 7025.598 165.7506
diff --git a/sql/updates/world/2015_02_10_06_world.sql b/sql/updates/world/2015_02_10_06_world.sql
new file mode 100644
index 00000000000..bcd42994ee2
--- /dev/null
+++ b/sql/updates/world/2015_02_10_06_world.sql
@@ -0,0 +1,58 @@
+--
+SET @NPC:= 25968;
+UPDATE `creature_template` SET `VehicleId`=30 WHERE `entry`=@NPC;
+DELETE FROM `vehicle_template_accessory` where `entry` in (@NPC) AND `accessory_entry` IN (25801);
+INSERT INTO `vehicle_template_accessory` (`entry`,`accessory_entry`,`seat_id`,`minion`,`description`,`summontype`,`summontimer`) VALUES
+(@NPC,25801,0,0,'Lunchbox',8,0);
+DELETE FROM `npc_spellclick_spells` WHERE `npc_entry` = @NPC;
+INSERT INTO `npc_spellclick_spells` (`npc_entry`, `spell_id`, `cast_flags`, `user_type`) VALUES
+(@NPC, 46598, 1, 0);
+
+-- Nedar, Lord of Rhinos SAI
+SET @ENTRY := 25801;
+UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,0,0,0,4,0,100,1,0,0,0,0,22,1,0,0,0,0,0,1,0,0,0,0,0,0,0,"Nedar, Lord of Rhinos - On Aggro - Set Event Phase 1 (No Repeat)"),
+(@ENTRY,0,1,0,4,1,100,1,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,"Nedar, Lord of Rhinos - On Aggro - Say Line 0 (Phase 1) (No Repeat)"),
+(@ENTRY,0,2,0,4,1,100,1,0,0,0,0,21,0,0,0,0,0,0,1,0,0,0,0,0,0,0,"Nedar, Lord of Rhinos - On Aggro - Disable Combat Movement (Phase 1) (No Repeat)"),
+(@ENTRY,0,3,0,4,1,100,1,0,0,0,0,11,41440,0,0,0,0,0,2,0,0,0,0,0,0,0,"Nedar, Lord of Rhinos - On Aggro - Cast 'Shoot' (Phase 1) (No Repeat)"),
+(@ENTRY,0,4,0,9,1,100,0,5,30,3500,4100,11,41440,0,0,0,0,0,2,0,0,0,0,0,0,0,"Nedar, Lord of Rhinos - Within 5-30 Range - Cast 'Shoot' (Phase 1)"),
+(@ENTRY,0,5,0,9,1,100,0,30,100,0,0,21,1,0,0,0,0,0,1,0,0,0,0,0,0,0,"Nedar, Lord of Rhinos - Within 30-100 Range - Enable Combat Movement (Phase 1)"),
+(@ENTRY,0,6,0,9,1,100,0,9,15,0,0,21,0,0,0,0,0,0,1,0,0,0,0,0,0,0,"Nedar, Lord of Rhinos - Within 9-15 Range - Disable Combat Movement (Phase 1)"),
+(@ENTRY,0,7,0,9,1,100,0,0,5,0,0,21,1,0,0,0,0,0,1,0,0,0,0,0,0,0,"Nedar, Lord of Rhinos - Within 0-5 Range - Enable Combat Movement (Phase 1)"),
+(@ENTRY,0,8,0,9,1,100,0,5,30,0,0,21,0,0,0,0,0,0,1,0,0,0,0,0,0,0,"Nedar, Lord of Rhinos - Within 5-30 Range - Disable Combat Movement (Phase 1)");
+-- Complete the Broadcast_text
+DELETE FROM `creature_text` WHERE `entry` IN (@ENTRY);
+INSERT INTO `creature_text` (`entry`, `groupid`, `id`, `text`, `type`, `language`, `probability`, `emote`, `duration`, `sound`, `comment`, `BroadcastTextID`) VALUES
+(@ENTRY, 0, 0, 'Your impetuousness will be your end!', 12, 0, 100, 0, 0, 0, 'Nedar', 25103),
+(@ENTRY, 0, 1, 'You dare challenge Nedar, lord of the tundral!?', 12, 0, 100, 0, 0, 0, 'Nedar', 25102),
+(@ENTRY, 0, 2, 'You don''t stand a chance!', 12, 0, 100, 0, 0, 0, 'Nedar', 25104);
+
+-- Pathing for Entry: 25968 'TDB FORMAT'
+SET @NPC := 106302;
+SET @PATH := @NPC * 10;
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=3170.232,`position_y`=5968.757,`position_z`=96.36165 WHERE `guid`=@NPC;
+DELETE FROM `creature_addon` WHERE `guid`=@NPC;
+INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (@NPC,@PATH,0,0,1,0, '');
+DELETE FROM `waypoint_data` WHERE `id`=@PATH;
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES
+(@PATH,1,3170.232,5968.757,96.36165,0,0,0,0,100,0),
+(@PATH,2,3159.33,5950.815,95.96857,0,0,0,0,100,0),
+(@PATH,3,3162.685,5902.838,96.0918,0,0,0,0,100,0),
+(@PATH,4,3169.452,5888.983,97.71611,0,0,0,0,100,0),
+(@PATH,5,3204.079,5874.618,97.02065,0,0,0,0,100,0),
+(@PATH,6,3238.726,5868.98,94.07452,0,0,0,0,100,0),
+(@PATH,7,3266.804,5867.507,86.87187,0,0,0,0,100,0),
+(@PATH,8,3300.308,5874.12,83.72194,0,0,0,0,100,0),
+(@PATH,9,3328.993,5853.078,78.86817,0,0,0,0,100,0),
+(@PATH,10,3344.677,5812.18,67.82541,0,0,0,0,100,0),
+(@PATH,11,3341.184,5774.667,61.2993,0,0,0,0,100,0),
+(@PATH,12,3357.205,5767.466,65.42284,0,0,0,0,100,0),
+(@PATH,13,3357.227,5799.264,67.74834,0,0,0,0,100,0),
+(@PATH,14,3359.967,5824.072,71.90356,0,0,0,0,100,0),
+(@PATH,15,3354.479,5873.997,76.9686,0,0,0,0,100,0),
+(@PATH,16,3341.863,5907.724,79.92758,0,0,0,0,100,0),
+(@PATH,17,3316.034,5925.089,85.70946,0,0,0,0,100,0),
+(@PATH,18,3293.812,5947.116,82.76896,0,0,0,0,100,0);
+-- 0x2009144760195C0000000C000057E949 .go 3170.232 5968.757 96.36165
diff --git a/sql/updates/world/2015_02_10_07_world.sql b/sql/updates/world/2015_02_10_07_world.sql
new file mode 100644
index 00000000000..87a59e4440e
--- /dev/null
+++ b/sql/updates/world/2015_02_10_07_world.sql
@@ -0,0 +1,3 @@
+--
+UPDATE `creature` SET `MovementType`=0 WHERE `guid` IN (126701,126703,126711);
+UPDATE `creature` SET `equipment_id`=0 WHERE `id` IN (12237, 12224);
diff --git a/sql/updates/world/2015_02_10_08_world.sql b/sql/updates/world/2015_02_10_08_world.sql
new file mode 100644
index 00000000000..647e89253f5
--- /dev/null
+++ b/sql/updates/world/2015_02_10_08_world.sql
@@ -0,0 +1,3 @@
+--
+UPDATE `creature` SET `MovementType`=0 WHERE `guid` = 58021;
+UPDATE `creature` SET `MovementType`=1 WHERE `guid` IN (122545, 122824);
diff --git a/sql/updates/world/2015_02_10_09_world.sql b/sql/updates/world/2015_02_10_09_world.sql
new file mode 100644
index 00000000000..9ba05c77e41
--- /dev/null
+++ b/sql/updates/world/2015_02_10_09_world.sql
@@ -0,0 +1,4 @@
+--
+UPDATE `creature_template` SET `unit_class`=4 WHERE `entry`=32535;
+UPDATE `creature_template_addon` SET`auras`="" WHERE`entry` IN (26608, 31306); -- vehicle auras appear only when the npc ride a vehicle or when he's mounted
+UPDATE `creature_template` SET `npcflag`=16777216 WHERE `entry`=35427;
diff --git a/sql/updates/world/2015_02_11_00_world.sql b/sql/updates/world/2015_02_11_00_world.sql
new file mode 100644
index 00000000000..271a5b8be94
--- /dev/null
+++ b/sql/updates/world/2015_02_11_00_world.sql
@@ -0,0 +1,12 @@
+--
+DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=13 AND `SourceGroup`=1 AND `SourceEntry`=49947;
+INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorType`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES
+(13, 1, 49947, 0, 0, 31, 0, 3, 19871, 0, 0, 0, 0, '', 'Laser - only targets Bunny');
+
+-- Scavenge-bot 004-A8 SAI
+SET @ENTRY := 25752;
+UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0 AND `id` >=3;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,0,3,0,1,0,100,0,5000,5000,15000,20000,11,49947,0,0,0,0,0,19,19871,25,0,0,0,0,0,"Scavenge-bot 004-A8 - Out of Combat - Cast 'Cutting Laser'"),
+(@ENTRY,0,4,0,1,0,100,0,20000,25000,35000,40000,5,35,0,0,0,0,0,1,0,0,0,0,0,0,0,"Scavenge-bot 004-A8 - Out of Combat - Play Emote 35");
diff --git a/sql/updates/world/2015_02_11_01_world.sql b/sql/updates/world/2015_02_11_01_world.sql
new file mode 100644
index 00000000000..5932d48ef5e
--- /dev/null
+++ b/sql/updates/world/2015_02_11_01_world.sql
@@ -0,0 +1,100 @@
+-- Pathing for Stonebreaker Grunt Entry: 18973 'TDB FORMAT'
+SET @NPC := 68131;
+SET @PATH := @NPC * 10;
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=-2562.284,`position_y`=4397.473,`position_z`=58.68661 WHERE `guid`=@NPC;
+DELETE FROM `creature_addon` WHERE `guid`=@NPC;
+INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (@NPC,@PATH,0,0,1,0, '');
+DELETE FROM `waypoint_data` WHERE `id`=@PATH;
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES
+(@PATH,1,-2562.284,4397.473,58.68661,0,0,0,0,100,0),
+(@PATH,2,-2551.224,4407.652,53.44283,0,0,0,0,100,0),
+(@PATH,3,-2547.335,4405.842,52.35535,0,0,0,0,100,0),
+(@PATH,4,-2543.202,4397.742,52.17545,0,0,0,0,100,0),
+(@PATH,5,-2547.734,4388.876,52.18408,0,0,0,0,100,0),
+(@PATH,6,-2556.611,4386.977,52.1886,0,0,0,0,100,0),
+(@PATH,7,-2556.627,4386.753,51.9386,0,0,0,0,100,0),
+(@PATH,8,-2556.481,4387.06,52.1886,0,0,0,0,100,0),
+(@PATH,9,-2543.486,4397,52.17455,0,0,0,0,100,0),
+(@PATH,10,-2547.152,4405.732,52.17457,0,0,0,0,100,0),
+(@PATH,11,-2558.628,4405.742,57.89645,0,0,0,0,100,0),
+(@PATH,12,-2562.429,4397.533,58.73559,0,0,0,0,100,0),
+(@PATH,13,-2562.816,4394.701,58.72124,0,0,0,0,100,0),
+(@PATH,14,-2547.645,4388.162,58.39926,0,0,0,0,100,0),
+(@PATH,15,-2545.306,4391.472,58.38942,0,0,0,0,100,0),
+(@PATH,16,-2543.268,4397.77,58.69866,0,0,0,0,100,0),
+(@PATH,17,-2543.174,4397.481,58.44216,0,0,0,0,100,0),
+(@PATH,18,-2545.374,4391.247,58.40757,0,0,0,0,100,0),
+(@PATH,19,-2554.22,4387.671,58.65759,0,0,0,0,100,0),
+(@PATH,20,-2562.223,4394.01,58.45053,0,0,0,0,100,0),
+(@PATH,21,-2562.396,4397.497,58.69535,0,0,0,0,100,0),
+(@PATH,22,-2551.103,4407.721,53.44612,0,0,0,0,100,0),
+(@PATH,23,-2547.447,4405.818,52.24909,0,0,0,0,100,0),
+(@PATH,24,-2543.19,4397.657,52.17642,0,0,0,0,100,0),
+(@PATH,25,-2547.777,4388.548,52.18584,0,0,0,0,100,0),
+(@PATH,26,-2556.725,4387.103,52.1886,0,0,0,0,100,0),
+(@PATH,27,-2556.627,4386.753,51.9386,0,0,0,0,100,0),
+(@PATH,28,-2556.351,4386.949,52.1886,0,0,0,0,100,0),
+(@PATH,29,-2543.485,4397.102,52.17455,0,0,0,0,100,0),
+(@PATH,30,-2547.133,4405.784,52.17457,0,0,0,0,100,0),
+(@PATH,31,-2558.618,4405.514,57.89614,0,0,0,0,100,0),
+(@PATH,32,-2562.308,4397.42,58.72334,0,0,0,0,100,0),
+(@PATH,33,-2562.909,4394.518,58.71896,0,0,0,0,100,0),
+(@PATH,34,-2547.697,4388.187,58.39987,0,0,0,0,100,0),
+(@PATH,35,-2545.525,4391.353,58.41209,0,0,0,0,100,0),
+(@PATH,36,-2543.177,4397.777,58.7028,0,0,0,0,100,0),
+(@PATH,37,-2543.174,4397.481,58.44216,0,0,0,0,100,0),
+(@PATH,38,-2545.295,4391.392,58.40459,0,0,0,0,100,0),
+(@PATH,39,-2554.367,4387.682,58.65977,0,0,0,0,100,0),
+(@PATH,40,-2562.382,4393.967,58.45837,0,0,0,0,100,0);
+-- 0x1C3930424012874000002C0003BF2EBC .go -2562.284 4397.473 58.68661
+
+-- Pathing for Stonebreaker Grunt Entry: 18973 'TDB FORMAT'
+SET @NPC := 68132;
+SET @PATH := @NPC * 10;
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=-2582.699,`position_y`=4367.507,`position_z`=27.14433 WHERE `guid`=@NPC;
+DELETE FROM `creature_addon` WHERE `guid`=@NPC;
+INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (@NPC,@PATH,0,0,1,0, '');
+DELETE FROM `waypoint_data` WHERE `id`=@PATH;
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES
+(@PATH,1,-2582.699,4367.507,27.14433,240000,0,0,0,100,0),
+(@PATH,2,-2595.828,4382.915,29.9575,0,0,0,0,100,0),
+(@PATH,3,-2613.849,4391.314,33.12907,0,0,0,0,100,0),
+(@PATH,4,-2632.729,4386.462,35.28672,0,0,0,0,100,0),
+(@PATH,5,-2636.813,4385.448,35.57519,0,0,0,0,100,0),
+(@PATH,6,-2667.237,4407.722,35.60794,0,0,0,0,100,0),
+(@PATH,7,-2701.92,4386.847,28.3668,0,0,0,0,100,0),
+(@PATH,8,-2708.737,4383.311,26.62656,0,0,0,0,100,0),
+(@PATH,9,-2671.687,4406.917,35.27893,0,0,0,0,100,0),
+(@PATH,10,-2638.984,4412.332,35.20811,0,0,0,0,100,0),
+(@PATH,11,-2613.415,4394.945,33.2278,0,0,0,0,100,0),
+(@PATH,12,-2591.59,4381.07,29.3395,0,0,0,0,100,0);
+-- 0x1C3930424012874000002C00023F2EBA .go -2582.699 4367.507 27.14433
+
+-- Pathing for Stonebreaker Peon Entry: 19048 'TDB FORMAT'
+SET @NPC := 68353;
+SET @PATH := @NPC * 10;
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=-2607.763,`position_y`=4381.312,`position_z`=33.58602 WHERE `guid`=@NPC;
+DELETE FROM `creature_addon` WHERE `guid`=@NPC;
+INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (@NPC,@PATH,0,0,1,69, '');
+DELETE FROM `waypoint_data` WHERE `id`=@PATH;
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES
+(@PATH,1,-2607.763,4381.312,33.58602,0,0,0,0,100,0),
+(@PATH,2,-2633.11,4379.769,35.77549,0,0,0,0,100,0),
+(@PATH,3,-2634.318,4379.514,35.83887,0,0,0,0,100,0),
+(@PATH,4,-2647.237,4382.08,36.08328,0,240000,0,0,100,0),
+(@PATH,5,-2642.319,4381.9,35.72264,0,0,0,0,100,0),
+(@PATH,6,-2642.08,4381.872,35.9688,0,0,0,0,100,0),
+(@PATH,7,-2607.333,4387.602,31.9885,0,0,0,0,100,0),
+(@PATH,8,-2603.056,4389.318,31.18134,0,0,0,0,100,0),
+(@PATH,9,-2598.985,4391.519,30.64458,0,240000,0,0,100,0),
+(@PATH,10,-2592.19,4391.983,30.50177,0,240000,0,0,100,0),
+(@PATH,11,-2568.814,4388.118,33.5708,0,0,0,0,100,0),
+(@PATH,12,-2567.081,4387.359,34.20564,0,240000,0,0,100,0);
+-- 0x1C39304240129A0000002C00023F2EBC .go -2607.763 4381.312 33.58602
+
+-- Update Keb'ezil's movement, he should be running around as an imp.
+UPDATE `creature` SET `MovementType`=1 WHERE `guid`=66944;
+UPDATE `creature` SET `spawndist`=5 WHERE `guid`=66944;
+
+-- Update coordinates of Ru'zah
+UPDATE `creature` SET `position_x`=-2627.9, `position_y`=4486.034, `position_z`=36.21471 WHERE `guid`=74329;
diff --git a/sql/updates/world/2015_02_11_02_world.sql b/sql/updates/world/2015_02_11_02_world.sql
new file mode 100644
index 00000000000..8db79bc0c8f
--- /dev/null
+++ b/sql/updates/world/2015_02_11_02_world.sql
@@ -0,0 +1,153 @@
+-- Urdak SAI
+SET @ENTRY := 18541;
+UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,0,0,0,1,0,100,1,0,0,0,0,21,1,0,0,0,0,0,1,0,0,0,0,0,0,0,"Urdak - Out of Combat - Enable Combat Movement (No Repeat)"),
+(@ENTRY,0,1,0,0,0,100,1,0,0,0,0,11,32924,1,0,0,0,0,1,0,0,0,0,0,0,0,"Urdak - In Combat - Cast 'Power of Kran'aish' (No Repeat)"),
+(@ENTRY,0,2,3,4,0,100,1,0,0,0,0,11,38465,0,0,0,0,0,2,0,0,0,0,0,0,0,"Urdak - On Aggro - Cast 'Lightning Bolt' (No Repeat)"),
+(@ENTRY,0,3,0,61,0,100,0,0,0,0,0,23,1,0,0,0,0,0,1,0,0,0,0,0,0,0,"Urdak - On Aggro - Increment Phase By 1 (No Repeat)"),
+(@ENTRY,0,4,0,9,1,100,0,0,40,2400,3800,11,38465,0,0,0,0,0,2,0,0,0,0,0,0,0,"Urdak - Within 0-40 Range - Cast 'Lightning Bolt' (No Repeat)"),
+(@ENTRY,0,5,6,3,1,100,1,0,15,0,0,21,1,0,0,0,0,0,1,0,0,0,0,0,0,0,"Urdak - Between 0-15% Mana - Enable Combat Movement (Phase 1) (No Repeat)"),
+(@ENTRY,0,6,0,61,1,100,0,0,0,0,0,23,1,0,0,0,0,0,1,0,0,0,0,0,0,0,"Urdak - Between 0-15% Mana - Increment Phase By 1 (Phase 1) (No Repeat)"),
+(@ENTRY,0,7,0,9,1,100,1,35,80,0,0,21,1,0,0,0,0,0,1,0,0,0,0,0,0,0,"Urdak - Within 35-80 Range - Enable Combat Movement (Phase 1) (No Repeat)"),
+(@ENTRY,0,8,0,9,1,100,1,5,15,0,0,21,0,0,0,0,0,0,1,0,0,0,0,0,0,0,"Urdak - Within 5-15 Range - Disable Combat Movement (Phase 1) (No Repeat)"),
+(@ENTRY,0,9,0,9,1,100,1,0,5,0,0,21,1,0,0,0,0,0,1,0,0,0,0,0,0,0,"Urdak - Within 0-5 Range - Enable Combat Movement (Phase 1) (No Repeat)"),
+(@ENTRY,0,10,0,3,2,100,0,30,100,100,100,23,0,1,0,0,0,0,1,0,0,0,0,0,0,0,"Urdak - Between 30-100% Mana - Decrement Phase By 1 (Phase 1) (No Repeat)"),
+(@ENTRY,0,11,0,0,0,100,0,6000,10000,12000,16000,11,32907,1,0,0,0,0,2,0,0,0,0,0,0,0,"Urdak - In Combat - Cast 'Arakkoa Blast' (Phase 1) (No Repeat)"),
+(@ENTRY,0,12,0,0,0,100,0,10000,14000,18000,25000,11,6728,1,0,0,0,0,6,0,0,0,0,0,0,0,"Urdak - In Combat - Cast 'Enveloping Winds' (Phase 1) (No Repeat)"),
+(@ENTRY,0,13,14,2,0,100,1,0,15,0,0,22,3,0,0,0,0,0,1,0,0,0,0,0,0,0,"Urdak - Between 0-15% Health - Set Event Phase 3 (No Repeat)"),
+(@ENTRY,0,14,15,61,0,100,0,0,0,0,0,21,1,0,0,0,0,0,1,0,0,0,0,0,0,0,"Urdak - Between 0-15% Health - Enable Combat Movement (No Repeat)"),
+(@ENTRY,0,15,0,61,0,100,0,0,0,0,0,25,1,0,0,0,0,0,0,0,0,0,0,0,0,0,"Urdak - Between 0-15% Health - Flee For Assist (No Repeat)");
+
+-- Pathing for Urdak Entry: 18541 'TDB FORMAT'
+SET @NPC := 66701;
+SET @PATH := @NPC * 10;
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=-2531.757,`position_y`=5367.723,`position_z`=27.48038 WHERE `guid`=@NPC;
+DELETE FROM `creature_addon` WHERE `guid`=@NPC;
+INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (@NPC,@PATH,0,0,1,0, '');
+DELETE FROM `waypoint_data` WHERE `id`=@PATH;
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES
+(@PATH,1,-2531.757,5367.723,27.48038,0,0,0,0,100,0),
+(@PATH,2,-2522.244,5363.866,27.5043,0,0,0,0,100,0),
+(@PATH,3,-2511.568,5370.136,27.19551,0,0,0,0,100,0),
+(@PATH,4,-2509.842,5376.426,27.17996,0,0,0,0,100,0),
+(@PATH,5,-2514.843,5388.665,27.42471,0,0,0,0,100,0),
+(@PATH,6,-2525.896,5389.706,27.21724,0,0,0,0,100,0),
+(@PATH,7,-2531.956,5386.355,27.44649,0,0,0,0,100,0),
+(@PATH,8,-2535.825,5377.078,27.48491,0,0,0,0,100,0);
+-- 0x1C39304240121B400000D00000395D5F .go -2531.757 5367.723 27.48038
+
+DELETE FROM `creature_formations` WHERE `leaderGUID`=66960;
+INSERT INTO `creature_formations` (`leaderGUID`, `memberGUID`, `dist`, `angle`, `groupAI`) VALUES
+(66960, 66960, 0, 0, 2),
+(66960, 57334, 3, 270, 2);
+
+-- Pathing for Shadowy Hunter Entry: 18718 'TDB FORMAT'
+SET @NPC := 66960;
+SET @PATH := @NPC * 10;
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=-2399.251,`position_y`=4948.647,`position_z`=33.51818 WHERE `guid`=@NPC;
+DELETE FROM `creature_addon` WHERE `guid`=@NPC;
+INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (@NPC,@PATH,0,0,1,0, '');
+DELETE FROM `waypoint_data` WHERE `id`=@PATH;
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES
+(@PATH,1,-2399.251,4948.647,33.51818,0,0,0,0,100,0),
+(@PATH,2,-2382.013,4957.111,36.26661,0,0,0,0,100,0),
+(@PATH,3,-2386.387,4964.082,33.5477,0,0,0,0,100,0),
+(@PATH,4,-2396.421,4967.332,32.63216,0,0,0,0,100,0),
+(@PATH,5,-2404.207,4968.344,32.13279,0,0,0,0,100,0),
+(@PATH,6,-2411.476,4973.782,31.9511,0,0,0,0,100,0),
+(@PATH,7,-2419.75,5004.045,29.51139,0,0,0,0,100,0),
+(@PATH,8,-2423.043,5009.497,29.88427,0,0,0,0,100,0),
+(@PATH,9,-2425.305,5012.542,29.87346,0,0,0,0,100,0),
+(@PATH,10,-2452.268,5014.185,28.21556,0,0,0,0,100,0),
+(@PATH,11,-2455.99,5026.977,25.38416,0,0,0,0,100,0),
+(@PATH,12,-2461.66,5046.541,20.78516,0,0,0,0,100,0),
+(@PATH,13,-2468.601,5062.008,17.91999,0,0,0,0,100,0),
+(@PATH,14,-2471.484,5074.755,15.08363,0,0,0,0,100,0),
+(@PATH,15,-2462.648,5034.314,23.94722,0,0,0,0,100,0),
+(@PATH,16,-2458.38,5013.544,27.85468,0,0,0,0,100,0),
+(@PATH,17,-2460.833,5004.856,28.65945,0,0,0,0,100,0),
+(@PATH,18,-2468.316,4978.999,31.72539,0,0,0,0,100,0),
+(@PATH,19,-2469.694,4960.631,33.31852,0,0,0,0,100,0),
+(@PATH,20,-2466.243,4944.808,34.89827,0,0,0,0,100,0),
+(@PATH,21,-2466.676,4930.218,36.72472,0,0,0,0,100,0),
+(@PATH,22,-2473.81,4922.928,38.69386,0,0,0,0,100,0),
+(@PATH,23,-2476.339,4921.196,39.03951,0,0,0,0,100,0),
+(@PATH,24,-2486.696,4911.087,38.99028,0,0,0,0,100,0),
+(@PATH,25,-2488.085,4899.312,39.16518,0,0,0,0,100,0),
+(@PATH,26,-2466.59,4887.837,36.24532,0,0,0,0,100,0),
+(@PATH,27,-2459.039,4893.131,34.30416,0,0,0,0,100,0),
+(@PATH,28,-2456.6,4895.325,33.89172,0,0,0,0,100,0),
+(@PATH,29,-2455.763,4912.572,33.6131,0,0,0,0,100,0),
+(@PATH,30,-2459.973,4922.549,33.84817,0,0,0,0,100,0),
+(@PATH,31,-2454.409,4941.216,34.89568,0,0,0,0,100,0),
+(@PATH,32,-2453.032,4942.258,34.88249,0,0,0,0,100,0),
+(@PATH,33,-2441.288,4944.204,34.91498,0,0,0,0,100,0),
+(@PATH,34,-2424.706,4957.187,34.11639,0,0,0,0,100,0),
+(@PATH,35,-2420.334,4960.088,33.7532,0,0,0,0,100,0),
+(@PATH,36,-2399.827,4949.04,33.55933,0,0,0,0,100,0);
+-- 0x1C393042401247800000D80000395139 .go -2399.251 4948.647 33.51818
+
+DELETE FROM `creature_formations` WHERE `leaderGUID`=66959;
+INSERT INTO `creature_formations` (`leaderGUID`, `memberGUID`, `dist`, `angle`, `groupAI`) VALUES
+(66959, 66959, 0, 0, 2),
+(66959, 57324, 3, 270, 2);
+
+-- Pathing for Shadowy Hunter Entry: 18718 'TDB FORMAT'
+SET @NPC := 66959;
+SET @PATH := @NPC * 10;
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=-2458.59,`position_y`=4883.933,`position_z`=34.63649 WHERE `guid`=@NPC;
+DELETE FROM `creature_addon` WHERE `guid`=@NPC;
+INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (@NPC,@PATH,0,0,1,0, '');
+DELETE FROM `waypoint_data` WHERE `id`=@PATH;
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES
+(@PATH,1,-2458.59,4883.933,34.63649,0,0,0,0,100,0),
+(@PATH,2,-2454.139,4881.942,34.18031,0,0,0,0,100,0),
+(@PATH,3,-2441.338,4867.939,34.96668,0,0,0,0,100,0),
+(@PATH,4,-2447.259,4881.18,33.54724,0,0,0,0,100,0),
+(@PATH,5,-2454.204,4888.805,33.82166,0,0,0,0,100,0),
+(@PATH,6,-2455.784,4897.667,33.77719,0,0,0,0,100,0),
+(@PATH,7,-2455.145,4910.682,33.57897,0,0,0,0,100,0),
+(@PATH,8,-2459.188,4921.684,33.73078,0,0,0,0,100,0),
+(@PATH,9,-2455.591,4939.817,34.61909,0,0,0,0,100,0),
+(@PATH,10,-2453.116,4941.684,35.0243,0,0,0,0,100,0),
+(@PATH,11,-2443.437,4943.616,34.76263,0,0,0,0,100,0),
+(@PATH,12,-2431.095,4940.732,36.18304,0,0,0,0,100,0),
+(@PATH,13,-2422.104,4931.316,35.36322,0,0,0,0,100,0),
+(@PATH,14,-2418.187,4924.916,36.3769,0,0,0,0,100,0),
+(@PATH,15,-2425.994,4937.722,36.55001,0,0,0,0,100,0),
+(@PATH,16,-2430.061,4945.802,35.26893,0,0,0,0,100,0),
+(@PATH,17,-2429.3,4947.917,34.86908,0,0,0,0,100,0),
+(@PATH,18,-2424.078,4963.271,33.09982,0,0,0,0,100,0),
+(@PATH,19,-2421.393,4974.704,31.43381,0,0,0,0,100,0),
+(@PATH,20,-2421.332,4975.644,31.21901,0,0,0,0,100,0),
+(@PATH,21,-2418.137,5000.565,30.00104,0,0,0,0,100,0),
+(@PATH,22,-2417.527,5002.019,29.37036,0,0,0,0,100,0),
+(@PATH,23,-2416.402,5010.205,29.2325,0,0,0,0,100,0),
+(@PATH,24,-2417.669,5014.722,28.97691,0,0,0,0,100,0),
+(@PATH,25,-2428.226,5012.224,29.9898,0,0,0,0,100,0),
+(@PATH,26,-2444.966,5008.044,29.51899,0,0,0,0,100,0),
+(@PATH,27,-2453.993,5013.485,28.19345,0,0,0,0,100,0),
+(@PATH,28,-2456.664,5023.554,26.07574,0,0,0,0,100,0),
+(@PATH,29,-2459.761,5038.568,22.79576,0,0,0,0,100,0),
+(@PATH,30,-2465.731,5053.402,19.17121,0,0,0,0,100,0),
+(@PATH,31,-2467.348,5032.213,24.09672,0,0,0,0,100,0),
+(@PATH,32,-2467.405,5023.126,25.73068,0,0,0,0,100,0),
+(@PATH,33,-2467.814,5012.714,28.07976,0,0,0,0,100,0),
+(@PATH,34,-2470.525,4997.041,29.28029,0,0,0,0,100,0),
+(@PATH,35,-2471.126,4980.461,31.38793,0,0,0,0,100,0),
+(@PATH,36,-2477.811,4974.808,32.3695,0,0,0,0,100,0),
+(@PATH,37,-2497.777,4966.848,35.28411,0,0,0,0,100,0),
+(@PATH,38,-2506.064,4953.317,38.70324,0,0,0,0,100,0),
+(@PATH,39,-2510.001,4942.142,39.95487,0,0,0,0,100,0),
+(@PATH,40,-2510.834,4938.938,40.30884,0,0,0,0,100,0),
+(@PATH,41,-2510.035,4921.547,39.56293,0,0,0,0,100,0),
+(@PATH,42,-2510.577,4918.453,39.31087,0,0,0,0,100,0),
+(@PATH,43,-2507.691,4905.567,39.31522,0,0,0,0,100,0),
+(@PATH,44,-2500.221,4899.546,39.09933,0,0,0,0,100,0),
+(@PATH,45,-2490.795,4896.659,39.47167,0,0,0,0,100,0);
+-- 0x1C393042401247800000D800003955BB .go -2458.59 4883.933 34.63649
+
+-- Remove 1 too many 'Shadowy Executioner'
+DELETE FROM `creature` WHERE `guid`=57323;
diff --git a/sql/updates/world/2015_02_11_03_world.sql b/sql/updates/world/2015_02_11_03_world.sql
new file mode 100644
index 00000000000..d748355d624
--- /dev/null
+++ b/sql/updates/world/2015_02_11_03_world.sql
@@ -0,0 +1,5 @@
+--
+DELETE FROM `disables` WHERE `sourceType` =0 AND `entry` IN (71599, 71024) AND `flags`=64;
+INSERT INTO `disables` (`sourceType`, `entry`, `flags`, `params_0`, `params_1`, `comment`) VALUES
+(0, 71599, 64, '', '', 'Ignore LOS for Cosmetic - Explosion (Chemical Wagon)'),
+(0, 71024, 64, '', '', 'Ignore LOS for Throw Bomb');
diff --git a/sql/updates/world/2015_02_11_04_world.sql b/sql/updates/world/2015_02_11_04_world.sql
new file mode 100644
index 00000000000..f94edb80882
--- /dev/null
+++ b/sql/updates/world/2015_02_11_04_world.sql
@@ -0,0 +1,44 @@
+--
+DELETE FROM `npc_spellclick_spells` WHERE `npc_entry`=26191;
+INSERT INTO `npc_spellclick_spells` (`npc_entry`, `spell_id`, `cast_flags`, `user_type`) VALUES
+(26191, 46978, 2, 0);
+
+DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=18 AND `SourceGroup`=26191 AND `SourceEntry`=46978;
+INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorType`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES
+(18, 26191, 46978, 0, 0, 9, 0, 11956, 0, 0, 0, 0, 0, '', 'Required quest ''Finding the Phylactery'' active for spellclick');
+
+UPDATE `creature_template` SET `minlevel`=80, `maxlevel`=80, `rank`=3, `speed_walk`=2.5, `speed_run`=2.5 WHERE `entry`=28182;
+
+-- Dusk SAI
+SET @ENTRY := 28182;
+UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,0,0,0,54,0,100,0,0,0,0,0,53,1,28182,0,0,0,0,1,0,0,0,0,0,0,0,"Dusk - On Just Summoned - Start Waypoint"),
+(@ENTRY,0,1,0,40,0,100,0,21,28182,0,0,41,1,0,0,0,0,0,1,0,0,0,0,0,0,0,"Dusk - On Waypoint 21 Reached - Despawn Instant"),
+(@ENTRY,0,2,0,54,0,100,0,0,0,0,0,8,0,0,0,0,0,0,1,0,0,0,0,0,0,0,"Dusk - On Just Summoned - Set Reactstate Passive"),
+(@ENTRY,0,3,0,28,0,100,0,0,0,0,0,41,1,0,0,0,0,0,1,0,0,0,0,0,0,0,"Dusk - On Passenger Removed - Despawn Instant");
+
+DELETE FROM `waypoints` WHERE `entry`=28182;
+INSERT INTO `waypoints` (`entry`, `pointid`, `position_x`, `position_y`, `position_z`, `point_comment`) VALUES
+(28182, 1,3137.103,3835.605,23.80482, 'Dusk'),
+(28182, 2,3151.105,3841.837,26.15598, 'Dusk'),
+(28182, 3,3190.882,3844.668,28.8679, 'Dusk'),
+(28182, 4,3232.1,3838.992,27.33721, 'Dusk'),
+(28182, 5,3282.762,3832.855,27.20968, 'Dusk'),
+(28182, 6,3307.908,3829.667,28.43119, 'Dusk'),
+(28182, 7,3340.627,3826.012,25.35527, 'Dusk'),
+(28182, 8,3352.079,3823.348,27.22523, 'Dusk'),
+(28182, 9,3399.218,3818.613,27.66385, 'Dusk'),
+(28182, 10,3439.386,3828.509,27.79152, 'Dusk'),
+(28182, 11,3456.517,3835.027,29.58427, 'Dusk'),
+(28182, 12,3482.749,3841.445,32.40864, 'Dusk'),
+(28182, 13,3531.002,3843.39,33.53048, 'Dusk'),
+(28182, 14,3549.508,3830.051,39.22393, 'Dusk'),
+(28182, 15,3561.163,3818.268,40.28746, 'Dusk'),
+(28182, 16,3573.922,3785.856,36.752, 'Dusk'),
+(28182, 17,3574.622,3781.316,36.74898, 'Dusk'),
+(28182, 18,3583.712,3758.963,36.55262, 'Dusk'),
+(28182, 19,3603.148,3712.664,36.74012, 'Dusk'),
+(28182, 20,3605.655,3702.697,36.80239, 'Dusk'),
+(28182, 21,3618.601,3670.745,35.97186, 'Dusk');
diff --git a/sql/updates/world/2015_02_11_05_world.sql b/sql/updates/world/2015_02_11_05_world.sql
new file mode 100644
index 00000000000..3f0d52d3054
--- /dev/null
+++ b/sql/updates/world/2015_02_11_05_world.sql
@@ -0,0 +1,4 @@
+DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=10 AND `SourceGroup`=10016 AND `SourceEntry`=46004;
+INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorType`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES
+(10, 10016, 46004, 0, 0, 8, 0, 13845, 0, 0, 1, 0, 0, '', 'Sealed vial of poison only drops if player is not rewarded for quest sealed vial of poison');
+UPDATE `gossip_menu_option` SET `npc_option_npcflag`=1 WHERE `menu_id`=9546 AND `id`=1;
diff --git a/sql/updates/world/2015_02_12_00_world.sql b/sql/updates/world/2015_02_12_00_world.sql
new file mode 100644
index 00000000000..ee05a6eb020
--- /dev/null
+++ b/sql/updates/world/2015_02_12_00_world.sql
@@ -0,0 +1,2 @@
+--
+UPDATE `smart_scripts` SET `target_type`=2 WHERE `entryorguid`=28557 AND `source_type`=0 AND `id`=0;
diff --git a/sql/updates/world/2015_02_12_01_world.sql b/sql/updates/world/2015_02_12_01_world.sql
new file mode 100644
index 00000000000..8ce5742c7a3
--- /dev/null
+++ b/sql/updates/world/2015_02_12_01_world.sql
@@ -0,0 +1,4 @@
+-- Fix 'Teleport to Lake Wintergrasp'
+DELETE FROM `spell_scripts` WHERE `id`=58622;
+INSERT INTO `spell_scripts` (`id`, `effIndex`, `delay`, `command`, `datalong`, `datalong2`, `dataint`, `x`, `y`, `z`, `o`) VALUES
+(58622, 0, 1, 6, 571, 0, 0, 5386.05, 2840.97, 418.675, 3.14159);
diff --git a/sql/updates/world/2015_02_12_02_world.sql b/sql/updates/world/2015_02_12_02_world.sql
new file mode 100644
index 00000000000..8b9ed71efea
--- /dev/null
+++ b/sql/updates/world/2015_02_12_02_world.sql
@@ -0,0 +1,6 @@
+-- Magnataur Huntress SAI
+SET @ENTRY := 24469;
+UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0 AND `id`=2;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,0,2,0,8,0,100,0,46012,0,0,0,36,25788,0,0,0,0,0,1,0,0,0,0,0,0,0,"Magnataur Huntress - On Spellhit 'Bloodspore Poison' - Update Template To 'Weakened Magnataur Huntress'");
diff --git a/sql/updates/world/2015_02_12_03_world.sql b/sql/updates/world/2015_02_12_03_world.sql
new file mode 100644
index 00000000000..e8759e9037a
--- /dev/null
+++ b/sql/updates/world/2015_02_12_03_world.sql
@@ -0,0 +1,14 @@
+-- Festering Corpse SAI
+SET @ENTRY := 31130;
+UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,0,0,0,8,0,100,1,58641,0,0,0,80,@ENTRY*100+00,0,0,0,0,0,1,0,0,0,0,0,0,0,"Festering Corpse - On Spellhit 'Olakin's Torch' - Run Script (No Repeat)");
+
+-- Actionlist SAI
+SET @ENTRY := 3113000;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=9;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,9,0,0,0,0,100,0,0,0,0,0,11,59216,0,0,0,0,0,1,0,0,0,0,0,0,0,"Festering Corpse - On Script - Cast 'Burning Corpse'"),
+(@ENTRY,9,1,0,0,0,100,0,1000,1000,0,0,33,31130,0,0,0,0,0,7,0,0,0,0,0,0,0,"Festering Corpse - On Script - Quest Credit 'By Fire Be Purged'"),
+(@ENTRY,9,2,0,0,0,100,0,6000,9000,0,0,41,0,0,0,0,0,0,1,0,0,0,0,0,0,0,"Festering Corpse - On Script - Despawn Instant");
diff --git a/sql/updates/world/2015_02_12_04_world.sql b/sql/updates/world/2015_02_12_04_world.sql
new file mode 100644
index 00000000000..d841e98f914
--- /dev/null
+++ b/sql/updates/world/2015_02_12_04_world.sql
@@ -0,0 +1,4 @@
+--
+DELETE FROM `event_scripts` WHERE `id` = 14394;
+INSERT INTO `event_scripts` (`id`,`delay`,`command`,`datalong`,`datalong2`,`dataint`,`x`,`y`,`z`,`o`) VALUES
+(14394,0,8,22395,0,0,0,0,0,0);
diff --git a/sql/updates/world/2015_02_12_05_world.sql b/sql/updates/world/2015_02_12_05_world.sql
new file mode 100644
index 00000000000..1d7d3bb3cf7
--- /dev/null
+++ b/sql/updates/world/2015_02_12_05_world.sql
@@ -0,0 +1,37 @@
+--
+UPDATE `creature_template` SET `npcflag`=16777217, `InhabitType`=4 WHERE `entry`=27923;
+
+DELETE FROM `npc_spellclick_spells` WHERE `npc_entry`=27923;
+INSERT INTO `npc_spellclick_spells` (`npc_entry`,`spell_id`,`cast_flags`,`user_type`) VALUES
+(27923,46598,1,1);
+
+DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=15 AND `SourceGroup`=9045 AND `SourceEntry`=0 AND `SourceId`=0 AND `ElseGroup`=0 AND `ConditionTypeOrReference`=8 AND `ConditionTarget`=0 AND `ConditionValue1`=11509 AND `ConditionValue2`=0 AND `ConditionValue3`=0;
+DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=15 AND `SourceGroup`=9045 AND `SourceEntry`=0 AND `SourceId`=0 AND `ElseGroup`=1 AND `ConditionTypeOrReference`=28 AND `ConditionTarget`=0 AND `ConditionValue1`=11509 AND `ConditionValue2`=0 AND `ConditionValue3`=0;
+INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorType`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES (15, 9045, 0, 0, 0, 8, 0, 11509, 0, 0, 0, 0, 0, '', 'Lou the Cabin Boy - Show gossip option only if player has taken quest 11509');
+INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorType`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES (15, 9045, 0, 0, 1, 28, 0, 11509, 0, 0, 0, 0, 0, '', 'Lou the Cabin Boy - Show gossip option only if player has taken quest 11509');
+
+-- Lou the Cabin Boy SAI
+SET @ENTRY := 27923;
+UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,0,0,0,54,0,100,0,0,0,0,0,53,1,27923,0,0,0,0,1,0,0,0,0,0,0,0,"Lou the Cabin Boy - On Just Summoned - Start Waypoint"),
+(@ENTRY,0,1,0,28,0,100,0,0,0,0,0,41,0,0,0,0,0,0,1,0,0,0,0,0,0,0,"Lou the Cabin Boy - On Passenger Removed - Despawn Instant"),
+(@ENTRY,0,2,0,54,0,100,0,0,0,0,0,8,0,0,0,0,0,0,1,0,0,0,0,0,0,0,"Lou the Cabin Boy - On Just Summoned - Set Reactstate Passive"),
+(@ENTRY,0,3,0,40,0,100,0,13,27923,0,0,41,0,0,0,0,0,0,1,0,0,0,0,0,0,0,"Lou the Cabin Boy - On Waypoint 13 Reached - Despawn Instant");
+
+DELETE FROM `waypoints` WHERE `entry`=27923;
+INSERT INTO `waypoints` (`entry`, `pointid`, `position_x`, `position_y`, `position_z`, `point_comment`) VALUES
+(27923, 1, 556.8802, -2811.598, -0.076807, 'Lou'),
+(27923, 2, 482.0306, -2834.213, -0.049029, 'Lou'),
+(27923, 3, 454.4951, -2891.859, -0.049029, 'Lou'),
+(27923, 4, 335.4129, -2946.441, -0.049029, 'Lou'),
+(27923, 5, 262.8804, -3016.949, -0.021251, 'Lou'),
+(27923, 6, 147.2193, -3176.037, -0.049029, 'Lou'),
+(27923, 7, 86.28928, -3239.844, -0.021251, 'Lou'),
+(27923, 8, -22.49794, -3241.448, -0.076807, 'Lou'),
+(27923, 9, -151.2886, -3296.966, 0.006526, 'Lou'),
+(27923, 10, -195.9667, -3366.19, -0.132362, 'Lou'),
+(27923, 11, -255.5049, -3519.14, -0.021251, 'Lou'),
+(27923, 12, -217.6928, -3555.593, -0.076807, 'Lou'),
+(27923, 13, -201.783, -3548.484, -0.021251, 'Lou');
diff --git a/sql/updates/world/2015_02_12_06_world.sql b/sql/updates/world/2015_02_12_06_world.sql
new file mode 100644
index 00000000000..d6eaf64d14e
--- /dev/null
+++ b/sql/updates/world/2015_02_12_06_world.sql
@@ -0,0 +1,2 @@
+--
+UPDATE `creature_template` SET `spell1`=52331,`spell2`=52358,`spell3`=53032,`spell4`=52327,`spell5`=52321 WHERE `entry`=28115;
diff --git a/sql/updates/world/2015_02_12_07_world.sql b/sql/updates/world/2015_02_12_07_world.sql
new file mode 100644
index 00000000000..7fc438ed015
--- /dev/null
+++ b/sql/updates/world/2015_02_12_07_world.sql
@@ -0,0 +1,53 @@
+-- Dawnblade Marksman SAI
+SET @ENTRY := 24979;
+UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,0,0,0,10,0,100,0,0,70,7000,13000,11,45101,0,0,0,0,0,7,0,0,0,0,0,0,0,"Dawnblade Marksman - Within 0-70 Range Out of Combat LoS - Cast 'Flaming Arrow'"),
+(@ENTRY,0,1,0,1,0,100,0,3000,3000,5000,5000,11,45101,0,0,0,0,0,19,5202,26,0,0,0,0,0,"Dawnblade Marksman - Out of Combat - Cast 'Flaming Arrow'");
+
+-- Pathing for Entry: 25001 'TDB FORMAT'
+SET @NPC := 93967;
+SET @PATH := @NPC * 10;
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=12616.02,`position_y`=-6826.477,`position_z`=13.30631 WHERE `guid`=@NPC;
+DELETE FROM `creature_addon` WHERE `guid`=@NPC;
+INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (@NPC,@PATH,0,0,1,0, '');
+DELETE FROM `waypoint_data` WHERE `id`=@PATH;
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES
+(@PATH,1,12616.02,-6826.477,13.30631,0,0,0,0,100,0),
+(@PATH,2,12615.95,-6826.547,13.58466,0,0,0,0,100,0),
+(@PATH,3,12607.38,-6830.652,13.76608,0,0,0,0,100,0),
+(@PATH,4,12591.51,-6834.896,13.87594,0,0,0,0,100,0),
+(@PATH,5,12566.56,-6827.448,16.54662,0,0,0,0,100,0),
+(@PATH,6,12579.94,-6832.642,14.98803,0,0,0,0,100,0),
+(@PATH,7,12584.21,-6834.116,14.20888,0,0,0,0,100,0),
+(@PATH,8,12591.75,-6834.886,13.74139,0,0,0,0,100,0),
+(@PATH,9,12607.81,-6830.203,13.69277,0,0,0,0,100,0),
+(@PATH,10,12616.39,-6826.547,13.49831,0,0,0,0,100,0),
+(@PATH,11,12616.02,-6826.477,13.30631,0,0,0,0,100,0),
+(@PATH,12,12615.95,-6826.547,13.5846,0,0,0,0,100,0),
+(@PATH,13,12607.6,-6830.664,13.76679,0,0,0,0,100,0),
+(@PATH,14,12591.65,-6834.927,13.87652,0,0,0,0,100,0),
+(@PATH,15,12566.47,-6827.438,16.55291,0,0,0,0,100,0),
+(@PATH,16,12579.94,-6832.642,14.98803,0,0,0,0,100,0),
+(@PATH,17,12584.21,-6834.114,14.20937,0,0,0,0,100,0),
+(@PATH,18,12591.73,-6834.884,13.74244,0,0,0,0,100,0),
+(@PATH,19,12607.78,-6830.21,13.69292,0,0,0,0,100,0),
+(@PATH,20,12616.38,-6826.549,13.49841,0,0,0,0,100,0),
+(@PATH,21,12616.02,-6826.477,13.30631,0,0,0,0,100,0),
+(@PATH,22,12615.95,-6826.547,13.58466,0,0,0,0,100,0),
+(@PATH,23,12607.59,-6830.418,13.76704,0,0,0,0,100,0);
+-- 0x1C09084240186A4000002E000055E86A .go 12616.02 -6826.477 13.30631
+
+-- Pathing for Entry: 25001 'TDB FORMAT'
+SET @NPC := 93966;
+SET @PATH := @NPC * 10;
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=12488.71,`position_y`=-6887.34,`position_z`=16.40788 WHERE `guid`=@NPC;
+DELETE FROM `creature_addon` WHERE `guid`=@NPC;
+INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (@NPC,@PATH,0,0,1,0, '');
+DELETE FROM `waypoint_data` WHERE `id`=@PATH;
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES
+(@PATH,1,12488.71,-6887.34,16.40788,0,0,0,0,100,0),
+(@PATH,2,12495.96,-6887.744,16.62086,0,0,0,0,100,0),
+(@PATH,3,12491.32,-6874.924,17.07642,0,0,0,0,100,0);
+-- 0x1C09084240186A4000002E0000558FDB .go 12488.71 -6887.34 16.40788
diff --git a/sql/updates/world/2015_02_12_08_world.sql b/sql/updates/world/2015_02_12_08_world.sql
new file mode 100644
index 00000000000..70c51199c8c
--- /dev/null
+++ b/sql/updates/world/2015_02_12_08_world.sql
@@ -0,0 +1,68 @@
+--
+SET @Ameer :=20482; -- Image of Commander Ameer
+SET @SpellSummon:=35679; -- Summons Protectorate.
+SET @Protectorate:=20802; -- Protectorate Demolitionist
+SET @Cleave :=30619; -- Protectorate Demolitionist's Cleave
+SET @Hamstring :=31553; -- Protectorate Demolitionist's Hamstring
+SET @Strike :=16856; -- Protectorate Demolitionist's Mortal Striket
+SET @Stalker :=20474; -- Ethereum Nexus-Stalker
+SET @Sshadowtouched:=36515; -- Ethereum Nexus-Stalker's Shadowtouched
+SET @Sshadowsurge:=36517; -- Ethereum Nexus-Stalker's Shadowsurge
+
+UPDATE `creature_template` SET `AIName`='SmartAI' WHERE `entry` IN (@Ameer,@Protectorate,@Stalker);
+DELETE FROM `smart_scripts` WHERE `source_type`=0 AND `entryorguid`= @Ameer AND id IN (5,6);
+DELETE FROM `smart_scripts` WHERE `source_type`=0 AND `entryorguid` IN (@Protectorate,@Stalker);
+DELETE FROM `smart_scripts` WHERE `source_type`=9 AND `entryorguid` IN (@Protectorate*100);
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@Ameer,0,5,0,19,0,100,0,10406,0,0,0,85,@SpellSummon,2,0,0,0,0,7,0,0,0,0,0,0,0,'Image of Commander Ameer - On Quest 10406 accepted - Cast Summon Protectorate Demolitionist'),
+(@Ameer,0,6,0,20,0,100,0,10406,0,0,0,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,'Image of Commander Ameer - On Quest 10406 accepted - Cast Summon Protectorate Demolitionist'),
+(@Protectorate,0,0,0,54,0,100,0,0,0,0,0,1,0,4000,0,0,0,0,1,0,0,0,0,0,0,0,'Protectorate Demolitionist - Just Summoned - Say 0'),
+(@Protectorate,0,1,0,52,0,100,0,0,@Protectorate,0,0,53,0,@Protectorate,0,0,0,0,1,0,0,0,0,0,0,0,'Protectorate Demolitionist - Text Over - Start Wp'),
+(@Protectorate,0,2,3,40,0,100,0,3,@Protectorate,0,0,54,4000,0,0,0,0,0,1,0,0,0,0,0,0,0,'Protectorate Demolitionist - Reached WP 3 - Pause Wp'),
+(@Protectorate,0,3,0,61,0,100,0,0,0,0,0,1,1,5000,0,0,0,0,1,0,0,0,0,0,0,0,'Protectorate Demolitionist - Link Event - Say 1'),
+(@Protectorate,0,4,5,40,0,100,0,5,@Protectorate,0,0,54,4000,0,0,0,0,0,1,0,0,0,0,0,0,0,'Protectorate Demolitionist - Reached WP 5 - Pause Wp'),
+(@Protectorate,0,5,0,61,0,100,0,0,0,0,0,1,2,4000,0,0,0,0,1,0,0,0,0,0,0,0,'Protectorate Demolitionist - Link Event - Say 2'),
+(@Protectorate,0,6,7,40,0,100,0,7,@Protectorate,0,0,54,10000,0,0,0,0,0,1,0,0,0,0,0,0,0,'Protectorate Demolitionist - Reached WP 7 - Pause Wp'),
+(@Protectorate*100,9,0,0,0,0,100,0,0,0,0,0,1,3,14000,0,0,0,0,1,0,0,0,0,0,0,0,'Protectorate Demolitionist - Script - Say 3'),
+(@Protectorate*100,9,1,0,0,0,100,0,500,500,0,0,5,28,0,0,0,0,0,1,0,0,0,0,0,0,0,'Protectorate Demolitionist - Script - Emote Work'),
+(@Protectorate*100,9,2,0,0,0,100,0,3500,3500,0,0,12,@Stalker,2,30000,1,0,0,8,0,0,0,3866.837402,2321.753418,113.736206,0.120686,'Protectorate Demolitionist - Script - Summon Nexus-Stalker'),
+(@Protectorate*100,9,3,0,0,0,100,0,0,0,0,0,12,@Stalker,2,30000,1,0,0,8,0,0,0,3879.268799,2321.939209,115.065338,3.137270,'Protectorate Demolitionist - Script - Summon Nexus-Stalker'),
+(@Protectorate*100,9,4,0,0,0,100,0,6000,6000,0,0,1,4,4000,0,0,0,0,1,0,0,0,0,0,0,0,'Protectorate Demolitionist - Script - Say 4'),
+(@Protectorate*100,9,5,0,0,0,100,0,0,0,0,0,59,1,0,0,0,0,0,1,0,0,0,0,0,0,0,'Protectorate Demolitionist - Script - Run'),
+(@Protectorate*100,9,6,0,0,0,100,0,0,0,0,0,65,0,0,0,0,0,0,1,0,0,0,0,0,0,0,'Protectorate Demolitionist - Script - Resume WP'),
+(@Protectorate*100,9,7,0,0,0,100,0,0,0,0,0,5,0,0,0,0,0,0,1,0,0,0,0,0,0,0,'Protectorate Demolitionist - Script - Emote Work'),
+(@Protectorate,0,7,0,61,0,100,0,0,0,0,0,80,@Protectorate*100,0,0,0,0,0,1,0,0,0,0,0,0,0,'Protectorate Demolitionist - Link - Start Script'),
+(@Protectorate,0,8,9,40,0,100,0,8,@Protectorate,0,0,54,10000,0,0,0,0,0,1,0,0,0,0,0,0,0,'Protectorate Demolitionist - Reached WP 8 - Pause Wp'),
+(@Protectorate,0,9,10,61,0,100,0,0,0,0,0,1,5,6000,0,0,0,0,1,0,0,0,0,0,0,0,'Protectorate Demolitionist - Link - Say 5'),
+(@Protectorate,0,10,0,61,0,100,0,0,0,0,0,15,10406,0,0,0,0,0,21,15,0,0,0,0,0,0,'Protectorate Demolitionist - Link - Complete Quest'),
+(@Protectorate,0,11,12,52,0,100,0,5,@Protectorate,0,0,11,35517,0,0,0,0,0,1,0,0,0,0,0,0,0,'Protectorate Demolitionist - Text Over - cast teleportaion visual'),
+(@Protectorate,0,12,0,61,0,100,0,0,0,0,0,41,2000,0,0,0,0,0,1,0,0,0,0,0,0,0,'Protectorate Demolitionist - Text Over - despawn'),
+(@Protectorate,0,13,0,4,0,100,0,0,0,0,0,1,6,0,0,0,0,0,1,0,0,0,0,0,0,0,'Protectorate Demolitionist - On aggro - talk'),
+(@Stalker,0,0,0,54,0,100,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,'Ethereum Nexus-Stalker - On respawn - Say 0'),
+(@Stalker,0,1,0,0,0,100,0,200,200,5000,5000,11,@Sshadowtouched,0,0,0,0,0,1,0,0,0,0,0,0,0,'Ethereum Nexus-Stalker - IC - Cast Shadowtouched'),
+(@Stalker,0,2,0,0,0,100,0,500,2000,10000,12000,11,@Sshadowsurge,0,0,0,0,0,2,0,0,0,0,0,0,0,'Ethereum Nexus-Stalker -IC - Cast Shadowsurge');
+
+DELETE FROM `creature_text` WHERE `entry` IN (@Protectorate,@Stalker, @Ameer);
+INSERT INTO `creature_text` (`entry`,`groupid`,`id`,`text`,`type`,`language`,`probability`,`emote`,`duration`,`sound`,`comment`,`BroadcastTextID`) VALUES
+(@Protectorate,0,0,'Let''s do this... Just keep me covered and I''ll deliver the package.',12,0,100,0,0,0,'Protectorate Demolitionist - Comienza escort', 18432),
+(@Protectorate,1,0,'By the second sun of K''aresh, look at this place! I can only imagine what Salhadaar is planning. Come on, let''s keep going.',12,0,100,0,0,0,'Protectorate Demolitionist - Waypoint 1', 18433),
+(@Protectorate,2,0,'Look there, fleshling! Salhadaar''s conduits! He''s keeping well fed...',12,0,100,0,0,0,'Protectorate Demolitionist - Waypoint 4', 18435),
+(@Protectorate,3,0,'Alright, keep me protected while I plant this disruptor. This shouldn''t take very long..',12,0,100,0,0,0,'Protectorate Demolitionist - Waypoint 6', 18436),
+(@Protectorate,4,0,'Done! Back up! Back up!',12,0,100,0,0,0,'Protectorate Demolitionist - Disruptor', 18437),
+(@Protectorate,5,0,'Looks like my work here is done. Report to the holo-image of Ameer over at the transporter.',12,0,100,0,0,0,'Protectorate Demolitionist - Waypoint 7', 18442),
+(@Protectorate,6,0,'I''m under attack! I repeat, I am under attack!',12,0,100,0,0,0,'Protectorate Demolitionist - Being attacked', 18439),
+(@Protectorate,6,1,'Keep these things off me!',12,0,100,0,0,0,'Protectorate Demolitionist - Being attacked', 18438),
+(@Stalker,0,0,'Protect the conduit! Stop the intruders!',12,0,100,0,0,0,'Ethereum Nexus-Stalker - Protect Conduct',18441),
+(@Ameer,0,0,'Hostiles detected. Ending transmission.',12,0,100,15,0,0,'Image of Commander Ameer - On aggro', 18190),
+(@Ameer,1,0,'Protectorate transmission complete.',12,0,100,0,0,0,'Ameer - Quest rewarded',18191);
+
+DELETE FROM `waypoints` WHERE `entry`=@Protectorate;
+INSERT INTO `waypoints` (`entry`, `pointid`, `position_x`, `position_y`, `position_z`, `point_comment`) VALUES
+(@Protectorate,1,4006.368652,2323.582520,111.407501,'Protectorate Demolitionist'),
+(@Protectorate,2,3946.502441,2329.601074,113.647179,'Protectorate Demolitionist'),
+(@Protectorate,3,3934.442383,2333.215088,110.971733,'Protectorate Demolitionist'),
+(@Protectorate,4,3912.811035,2339.968018,113.876434,'Protectorate Demolitionist'),
+(@Protectorate,5,3887.416748,2408.539063,113.081406,'Protectorate Demolitionist'),
+(@Protectorate,6,3863.596191,2348.160645,115.446754,'Protectorate Demolitionist'),
+(@Protectorate,7,3872.944580,2321.384766,114.501541,'Protectorate Demolitionist'),
+(@Protectorate,8,3859.826416,2360.402588,114.603340,'Protectorate Demolitionist');
diff --git a/sql/updates/world/2015_02_12_09_world.sql b/sql/updates/world/2015_02_12_09_world.sql
new file mode 100644
index 00000000000..36c11d35ee8
--- /dev/null
+++ b/sql/updates/world/2015_02_12_09_world.sql
@@ -0,0 +1,2 @@
+--
+UPDATE creature_template SET npcflag=0 WHERE entry=6776;
diff --git a/sql/updates/world/2015_02_12_10_world.sql b/sql/updates/world/2015_02_12_10_world.sql
new file mode 100644
index 00000000000..cb8f0e95b39
--- /dev/null
+++ b/sql/updates/world/2015_02_12_10_world.sql
@@ -0,0 +1,62 @@
+--
+UPDATE `creature_template` SET `ScriptName`='' WHERE `entry`=2983;
+-- The Plains Vision SAI
+SET @ENTRY := 2983;
+UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,0,0,0,54,0,100,0,0,0,0,0,53,1,2983,0,0,0,0,1,0,0,0,0,0,0,0,"The Plains Vision - On Just Summoned - Start Waypoint"),
+(@ENTRY,0,1,0,40,0,100,0,50,2983,0,0,41,1000,0,0,0,0,0,1,0,0,0,0,0,0,0,"The Plains Vision - On Waypoint 50 Reached - Despawn In 1000 ms");
+
+DELETE FROM `waypoints` WHERE `entry`=@ENTRY;
+INSERT INTO `waypoints` (`entry`, `pointid`, `position_x`, `position_y`, `position_z`, `point_comment`) VALUES
+(@ENTRY, 1, -2226.32, -408.095, -9.36235, 'The Plains Vision'),
+(@ENTRY, 2, -2203.04, -437.212, -5.72498, 'The Plains Vision'),
+(@ENTRY, 3, -2163.91, -457.851, -7.09049, 'The Plains Vision'),
+(@ENTRY, 4, -2123.87, -448.137, -9.29591, 'The Plains Vision'),
+(@ENTRY, 5, -2104.66, -427.166, -6.49513, 'The Plains Vision'),
+(@ENTRY, 6, -2101.48, -422.826, -5.3567, 'The Plains Vision'),
+(@ENTRY, 7, -2097.56, -417.083, -7.16716, 'The Plains Vision'),
+(@ENTRY, 8, -2084.87, -398.626, -9.88973, 'The Plains Vision'),
+(@ENTRY, 9, -2072.71, -382.324, -10.2488, 'The Plains Vision'),
+(@ENTRY, 10, -2054.05, -356.728, -6.22468, 'The Plains Vision'),
+(@ENTRY, 11, -2051.8, -353.645, -5.35791, 'The Plains Vision'),
+(@ENTRY, 12, -2049.08, -349.912, -6.15723, 'The Plains Vision'),
+(@ENTRY, 13, -2030.6, -310.724, -9.59302, 'The Plains Vision'),
+(@ENTRY, 14, -2002.15, -249.308, -10.8124, 'The Plains Vision'),
+(@ENTRY, 15, -1972.85, -195.811, -10.6316, 'The Plains Vision'),
+(@ENTRY, 16, -1940.93, -147.652, -11.7055, 'The Plains Vision'),
+(@ENTRY, 17, -1888.06, -81.943, -11.4404, 'The Plains Vision'),
+(@ENTRY, 18, -1837.05, -34.0109, -12.258, 'The Plains Vision'),
+(@ENTRY, 19, -1796.12, -14.6462, -10.3581, 'The Plains Vision'),
+(@ENTRY, 20, -1732.61, -4.27746, -10.0213, 'The Plains Vision'),
+(@ENTRY, 21, -1688.94, -0.829945, -11.7103, 'The Plains Vision'),
+(@ENTRY, 22, -1681.32, 13.0313, -9.48056, 'The Plains Vision'),
+(@ENTRY, 23, -1677.04, 36.8349, -7.10318, 'The Plains Vision'),
+(@ENTRY, 24, -1675.2, 68.559, -8.95384, 'The Plains Vision'),
+(@ENTRY, 25, -1676.57, 89.023, -9.65104, 'The Plains Vision'),
+(@ENTRY, 26, -1678.16, 110.939, -10.1782, 'The Plains Vision'),
+(@ENTRY, 27, -1677.86, 128.681, -5.73869, 'The Plains Vision'),
+(@ENTRY, 28, -1675.27, 144.324, -3.47916, 'The Plains Vision'),
+(@ENTRY, 29, -1671.7, 163.169, -1.23098, 'The Plains Vision'),
+(@ENTRY, 30, -1666.61, 181.584, 5.26145, 'The Plains Vision'),
+(@ENTRY, 31, -1661.51, 196.154, 8.95252, 'The Plains Vision'),
+(@ENTRY, 32, -1655.47, 210.811, 8.38727, 'The Plains Vision'),
+(@ENTRY, 33, -1647.07, 226.947, 5.27755, 'The Plains Vision'),
+(@ENTRY, 34, -1621.65, 232.91, 2.69579, 'The Plains Vision'),
+(@ENTRY, 35, -1600.23, 237.641, 2.98539, 'The Plains Vision'),
+(@ENTRY, 36, -1576.07, 242.546, 4.66541, 'The Plains Vision'),
+(@ENTRY, 37, -1554.57, 248.494, 6.60377, 'The Plains Vision'),
+(@ENTRY, 38, -1547.53, 259.302, 10.6741, 'The Plains Vision'),
+(@ENTRY, 39, -1541.7, 269.847, 16.4418, 'The Plains Vision'),
+(@ENTRY, 40, -1539.83, 278.989, 21.0597, 'The Plains Vision'),
+(@ENTRY, 41, -1540.16, 290.219, 27.8247, 'The Plains Vision'),
+(@ENTRY, 42, -1538.99, 298.983, 34.0032, 'The Plains Vision'),
+(@ENTRY, 43, -1540.38, 307.337, 41.3557, 'The Plains Vision'),
+(@ENTRY, 44, -1536.61, 314.884, 48.0179, 'The Plains Vision'),
+(@ENTRY, 45, -1532.42, 323.277, 55.6667, 'The Plains Vision'),
+(@ENTRY, 46, -1528.77, 329.774, 61.1525, 'The Plains Vision'),
+(@ENTRY, 47, -1525.65, 333.18, 63.2161, 'The Plains Vision'),
+(@ENTRY, 48, -1517.01, 350.713, 62.4286, 'The Plains Vision'),
+(@ENTRY, 49, -1511.39, 362.537, 62.4539, 'The Plains Vision'),
+(@ENTRY, 50, -1508.68, 366.822, 62.733, 'The Plains Vision');
diff --git a/sql/updates/world/2015_02_13_00_world.sql b/sql/updates/world/2015_02_13_00_world.sql
new file mode 100644
index 00000000000..c36958c180d
--- /dev/null
+++ b/sql/updates/world/2015_02_13_00_world.sql
@@ -0,0 +1,58 @@
+SET @NPC_BLACK_KNIGHT := 33785;
+SET @NPC_CAVIN := 33522;
+SET @SPELL_CHARGE := 63003;
+SET @SPELL_SHIELD_BREAKER := 65147;
+SET @SPELL_DARK_SHIELD := 64505;
+SET @SPELL_BLACK_NIGHT_TRANSFORM := 64490; -- Apply Aura: Change Model (34104)
+SET @SPELL_BLACK_NIGHT_TRANSFORM_2 := 64498; -- Apply Aura: Increase Max Health
+SET @SPELL_FULL_HEAL := 25840;
+SET @GOSSIP := 10383;
+
+UPDATE `creature_template` SET `AIName`='SmartAI' WHERE `entry` IN (@NPC_BLACK_KNIGHT, @NPC_CAVIN);
+DELETE FROM `smart_scripts` WHERE `source_type`=0 AND `entryorguid`=@NPC_BLACK_KNIGHT;
+DELETE FROM `smart_scripts` WHERE `source_type`=9 AND `entryorguid`=@NPC_BLACK_KNIGHT*100;
+DELETE FROM `smart_scripts` WHERE `source_type`=9 AND `entryorguid`=@NPC_BLACK_KNIGHT*100+1;
+DELETE FROM `smart_scripts` WHERE `source_type`=0 AND `entryorguid`=@NPC_CAVIN;
+DELETE FROM `smart_scripts` WHERE `source_type`=9 AND `entryorguid`=@NPC_CAVIN*100;
+INSERT INTO `smart_scripts` (`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`, `comment`) VALUES
+(@NPC_CAVIN,0,0,1,62,0,100,0,@GOSSIP,0,0,0,80,@NPC_CAVIN*100,0,2,0,0,0,1,0,0,0,0,0,0,0,'Cavin - On gossip option select - Run script'),
+(@NPC_CAVIN,0,1,2,61,0,100,0,0,0,0,0,12,@NPC_BLACK_KNIGHT,1,120000,0,0,0,8,0,0,0,8482.370117, 964.506653, 547.292908, 3.253865,'Cavin - On gossip option select - Summon the Black Knight'),
+(@NPC_CAVIN,0,2,0,61,0,100,0,0,0,0,0,72,0,0,0,0,0,0,7,0,0,0,0,0,0,0,'Cavin - On gossip option select - Close gossip'),
+(@NPC_CAVIN*100,9,0,0,0,0,100,0,0,0,0,0,81,0,0,0,0,0,0,1,0,0,0,0,0,0,0,'Cavin - On Script - Turn off Gossip & Gossip flags'),
+(@NPC_CAVIN*100,9,1,0,0,0,100,0,0,0,0,0,1,0,0,0,0,0,0,7,0,0,0,0,0,0,0,'Cavin - On Script - Say text 0'),
+(@NPC_CAVIN*100,9,2,0,0,0,100,0,5000,5000,0,0,1,1,0,0,0,0,0,7,0,0,0,0,0,0,0,'Cavin - On Script - Say text 1'),
+(@NPC_BLACK_KNIGHT,0,0,0,54,0,100,1,0,0,0,0,80,@NPC_BLACK_KNIGHT*100+1,0,0,0,0,0,1,0,0,0,0,0,0,0,'Blackknight - Just Summoned - Mount to entry'),
+(@NPC_BLACK_KNIGHT*100+1,9,0,0,0,0,100,0,0,0,0,0,69,0,0,0,0,0,0,8,0,0,0,8426.153320, 962.307861, 544.675293, 6.273711,'Blackknight - On Script - MOVE TO POS'),
+(@NPC_BLACK_KNIGHT*100+1,9,1,0,0,0,100,0,10000,10000,0,0,19,256,0,0,0,0,0,1,0,0,0,0,0,0,0,'Blackknight - On Script - REMOVE IMMUNE TO PC'),
+(@NPC_BLACK_KNIGHT*100+1,9,2,0,0,0,100,0,0,0,0,0,8,2,0,0,0,0,0,1,0,0,0,0,0,0,0,'Blackknight - On Script - REMOVE IMMUNE TO PC'),
+(@NPC_BLACK_KNIGHT*100+1,9,3,0,0,0,100,0,0,0,0,0,49,0,0,0,0,0,0,19,33782,25,0,0,0,0,0,'Blackknight - On Script - attack'),
+(@NPC_BLACK_KNIGHT,0,1,0,4,0,100,0,0,0,0,0,11,@SPELL_CHARGE,0,0,0,0,0,2,0,0,0,0,0,0,0,'Blackknight - On Aggro - Cast Charge'),
+(@NPC_BLACK_KNIGHT,0,2,0,4,0,100,0,0,0,0,0,22,1,0,0,0,0,0,1,0,0,0,0,0,0,0,'Blackknight - On Aggro - Set Phase 1'),
+(@NPC_BLACK_KNIGHT,0,3,0,0,1,100,0,10000,10000,15000,15000,25,0,0,0,0,0,0,1,0,0,0,0,0,0,0,'Blackknight - In Phase 1 - Flee for assist'),
+(@NPC_BLACK_KNIGHT,0,4,0,9,1,100,0,5,30,1000,1000,11,@SPELL_CHARGE,0,0,0,0,0,2,0,0,0,0,0,0,0,'Blackknight - In Phase 1& On Range - Cast Charge'),
+(@NPC_BLACK_KNIGHT,0,5,0,9,1,100,0,3,30,1500,2000,11,@SPELL_SHIELD_BREAKER,0,0,0,0,0,2,0,0,0,0,0,0,0,'Blackknight - In Phase 1 & On Range - Cast Shield Breaker'),
+(@NPC_BLACK_KNIGHT,0,6,0,6,0,100,0,0,0,0,0,81,1,0,0,0,0,0,10,85140,@NPC_CAVIN,0,0,0,0,0,'Blackknight - On Death - Turn on Gossip & Gossip flags on Cavin'),
+(@NPC_BLACK_KNIGHT,0,7,8,1,0,100,0,20000,20000,20000,20000,41,0,0,0,0,0,0,1,0,0,0,0,0,0,0,'Blackknight - Out Of Combat after 20s - Despawn'),
+(@NPC_BLACK_KNIGHT,0,8,0,61,0,100,0,0,0,0,0,81,1,0,0,0,0,0,10,85140,@NPC_CAVIN,0,0,0,0,0,'Blackknight - Out Of Combat after 20s - Turn on Gossip & Gossip flags on Cavin'),
+(@NPC_BLACK_KNIGHT,0,9,0,2,1,100,1,0,25,0,0,80,@NPC_BLACK_KNIGHT*100,2,0,0,0,0,1,0,0,0,0,0,0,0,'Blackknight - On 25% health - Run script'),
+(@NPC_BLACK_KNIGHT*100,9,0,0,0,0,100,0,0,0,0,0,8,0,0,0,0,0,0,1,0,0,0,0,0,0,0,'Blackknight - On Script - State passive'),
+(@NPC_BLACK_KNIGHT*100,9,1,0,0,0,100,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,'Blackknight - On Script - Say text 0'),
+(@NPC_BLACK_KNIGHT*100,9,2,0,0,0,100,0,0,0,0,0,43,0,0,0,0,0,0,1,0,0,0,0,0,0,0,'Blackknight - On Script - Unmount'),
+(@NPC_BLACK_KNIGHT*100,9,3,0,0,0,100,0,0,0,0,0,51,0,0,0,0,0,0,19,33782,30,0,0,0,0,0,'Blackknight - On Script - Unmount player'),
+(@NPC_BLACK_KNIGHT*100,9,4,0,0,0,100,0,0,0,0,0,11,@SPELL_DARK_SHIELD,2,0,0,0,0,1,0,0,0,0,0,0,0,'Blackknight - On Script - Cast Dark Shield'),
+(@NPC_BLACK_KNIGHT*100,9,5,0,0,0,100,0,0,0,0,0,22,0,0,0,0,0,0,1,0,0,0,0,0,0,0,'Blackknight - On Aggro - Set Phase 0'),
+(@NPC_BLACK_KNIGHT*100,9,6,0,0,0,100,0,6000,6000,0,0,11,@SPELL_BLACK_NIGHT_TRANSFORM,2,0,0,0,0,1,0,0,0,0,0,0,0,'Blackknight - On Script - Apply Aura'),
+(@NPC_BLACK_KNIGHT*100,9,7,0,0,0,100,0,0,0,0,0,11,@SPELL_FULL_HEAL,2,0,0,0,0,1,0,0,0,0,0,0,0,'Blackknight - On Script - Full hp'),
+(@NPC_BLACK_KNIGHT*100,9,8,0,0,0,100,0,1000,1000,0,0,11,@SPELL_BLACK_NIGHT_TRANSFORM_2,2,0,0,0,0,1,0,0,0,0,0,0,0,'Blackknight - On Script - Increase Max Health'),
+(@NPC_BLACK_KNIGHT*100,9,9,0,0,0,100,0,0,0,0,0,8,2,0,0,0,0,0,1,0,0,0,0,0,0,0,'Blackknight - On Script - State Aggresive'),
+(@NPC_BLACK_KNIGHT*100,9,10,0,0,0,100,0,1000,1000,0,0,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,'Blackknight - On Script - Say text 1'),
+(@NPC_BLACK_KNIGHT*100,9,11,0,0,0,100,0,0,0,0,0,49,0,0,0,0,0,0,21,15,0,0,0,0,0,0,'Blackknight - On Script - Start Attack');
+
+DELETE FROM `creature_text` WHERE `entry`IN (@NPC_BLACK_KNIGHT, @NPC_CAVIN);
+INSERT INTO `creature_text` (`entry`,`groupid`,`id`,`text`,`type`,`language`,`probability`,`emote`,`duration`,`sound`,`comment`,`BroadcastTextID`) VALUES
+(@NPC_BLACK_KNIGHT,0,0,'Get off that horse and fight me man-to-man!',14,0,100,0,0,0,'yell',34169),
+(@NPC_BLACK_KNIGHT,1,0,'I will not fail you, master!',14,0,100,0,0,0,'yell',34185),
+(@NPC_CAVIN,0,0,'$N challenges the Black Knight to trial by combat!',14,0,100,0,0,0,'yell',33803),
+(@NPC_CAVIN,1,0,'Good luck, $N.',12,0,100,0,0,0,'say',33804);
+
+UPDATE `conditions` SET `ConditionValue2`=1 WHERE `SourceTypeOrReferenceId`=15 AND `SourceGroup`=10383 AND `SourceEntry`=0 AND `ElseGroup`=0 AND `ConditionTypeOrReference`=1 AND `ConditionValue1`=63663;
diff --git a/sql/updates/world/2015_02_13_01_world.sql b/sql/updates/world/2015_02_13_01_world.sql
new file mode 100644
index 00000000000..03b117efc12
--- /dev/null
+++ b/sql/updates/world/2015_02_13_01_world.sql
@@ -0,0 +1,66 @@
+--
+SET @KC_FIRST_PROPHECY := 22798;
+SET @KC_SECOND_PROPHECY := 22799;
+SET @KC_THIRD_PROPHECY := 22800;
+SET @KC_FOURTH_PROPHECY := 22801;
+SET @QUEST_WHISPERS_RAVEN_GOD := 10607;
+SET @NPC_VISION_RAVEN_GOD := 21861;
+SET @SPELL_UNDERSTANDING_RAVENSPEECH := 37466;
+SET @AURA_UNDERSTANDING_RAVENSPEECH := 37642;
+SET @Falconwing := 19988;
+SET @Harbinger := 19989;
+SET @Scorncrow := 19990;
+
+UPDATE `creature_template` SET `exp`='1', `minlevel`='67', `maxlevel`='67', `unit_flags`='768', `type`='7' WHERE `entry`=@NPC_VISION_RAVEN_GOD;
+
+DELETE FROM `creature_text` WHERE `entry`=@NPC_VISION_RAVEN_GOD;
+INSERT INTO `creature_text` (`entry`, `groupid`, `id`, `text`, `type`, `language`, `probability`, `emote`, `duration`, `sound`, `comment`, `BroadcastTextId`) VALUES
+(@NPC_VISION_RAVEN_GOD,0,0,'From the darkest night shall rise again the raven, shall take flight in the shadows, shall reveal the nature of its kind. Prepare yourself for its coming, for the faithful shall be elevated to take flight with the raven, the rest be forgotten to walk upon the ground, clipped wings and shame.',15,0,100,0,0,0,'The Voice of the Raven God - The First Prophecy', 19475),
+(@NPC_VISION_RAVEN_GOD,1,0,'Steel your minds and guard your thoughts. The dark wings will cloud and consume the minds of the weak, a flock of thralls whose feet may never leave the ground.', 15,0,100,0,0,0,'The Voice of the Raven God - The Second Prophecy', 19476),
+(@NPC_VISION_RAVEN_GOD,2,0,'The Old blood will flow once again with the coming of the raven, the return of the darkness in the skies. Scarlet night, and the rise of the old.', 15,0,100,0,0,0,'The Voice of the Raven God - The Third Prophecy', 19477),
+(@NPC_VISION_RAVEN_GOD,3,0,'The raven was struck down once for flying too high, unready. The eons have prepared the Dark Watcher for its ascent, to draw the dark cloak across the horizon.', 15,0,100,0,0,0,'The Voice of the Raven God - The Fourth Prophecy', 19478);
+
+UPDATE creature_template SET AIName="SmartAI" WHERE entry IN (@Falconwing, @Harbinger, @Scorncrow,@NPC_VISION_RAVEN_GOD);
+UPDATE `gameobject_template` SET `AIName`='SmartGameObjectAI' WHERE `entry` IN (184950,184967,184968,184969);
+DELETE FROM `smart_scripts` WHERE `entryorguid` IN (@Falconwing, @Harbinger, @Scorncrow,@NPC_VISION_RAVEN_GOD) AND `source_type`=0; -- Npcs
+DELETE FROM `smart_scripts` WHERE `entryorguid` IN (184950,184967,184968,184969) AND `source_type`=1; -- Gameobjects (totems)
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+-- Npcs a matar para que te den el buff
+(@Falconwing,0,0,0,0,0,100,0,2500,5500,10000,11000,11,37587,0,0,0,0,0,2,0,0,0,0.0,0.0,0.0,0.0,"Grishna Falconwing - In Combat - Cast Bestial Wrath"),
+(@Falconwing,0,1,0,6,0,35,0,0,0,0,0,85,@SPELL_UNDERSTANDING_RAVENSPEECH,2,0,0,0,0,7,0,0,0,0.0,0.0,0.0,0.0,"Grishna Falconwing - On Death - Cast Understanding Ravenspeech"),
+(@Harbinger,0,0,0,0,0,100,0,2500,5500,20000,21000,11,37589,0,0,0,0,0,2,0,0,0,0.0,0.0,0.0,0.0,"Grishna Harbinger - In Combat - Cast Shriveling Gaze"),
+(@Harbinger,0,1,0,0,0,100,0,1000,6000,10000,15000,11,9532,0,0,0,0,0,2,0,0,0,0.0,0.0,0.0,0.0,"Grishna Harbinger - In Combat - Cast Lightning Bolt"),
+(@Harbinger,0,2,0,6,0,35,0,0,0,0,0,85,@SPELL_UNDERSTANDING_RAVENSPEECH,2,0,0,0,0,7,0,0,0,0.0,0.0,0.0,0.0,"Grishna Harbringer - On Death - Cast Understanding Ravenspeech"),
+(@Scorncrow,0,0,0,0,0,100,0,2500,5500,10000,11000,11,35321,0,0,0,0,0,2,0,0,0,0.0,0.0,0.0,0.0,"Grishna Scorncrow - In Combat - Cast Gushing Wound"),
+(@Scorncrow,0,1,0,6,0,35,0,0,0,0,0,85,@SPELL_UNDERSTANDING_RAVENSPEECH,2,0,0,0,0,7,0,0,0,0.0,0.0,0.0,0.0,"Grishna Scorncrow - On Death - Cast Understanding Ravenspeech"),
+-- Vision Of Raven God
+(@NPC_VISION_RAVEN_GOD,0,0,1,38,0,100,0,1,1,0,0,33,@KC_FIRST_PROPHECY,0,0,0,0,0,21,20,0,0,0.0,0.0,0.0,0.0,"Vision of Raven God - On Data Set 4 - Call Killedmonster"),
+(@NPC_VISION_RAVEN_GOD,0,1,0,61,0,100,0,0,0,0,0,1,0,0,0,0,0,0,21,20,0,0,0.0,0.0,0.0,0.0,"Vision of Raven God - Link - Say 0"),
+(@NPC_VISION_RAVEN_GOD,0,2,3,38,0,100,0,1,2,0,0,33,@KC_SECOND_PROPHECY,0,0,0,0,0,21,20,0,0,0.0,0.0,0.0,0.0,"Vision of Raven God - On Data Set 4 - Call Killedmonster"),
+(@NPC_VISION_RAVEN_GOD,0,3,0,61,0,100,0,0,0,0,0,1,1,0,0,0,0,0,21,20,0,0,0.0,0.0,0.0,0.0,"Vision of Raven God - Link - Say 1"),
+(@NPC_VISION_RAVEN_GOD,0,4,5,38,0,100,0,1,3,0,0,33,@KC_THIRD_PROPHECY ,0,0,0,0,0,21,20,0,0,0.0,0.0,0.0,0.0,"Vision of Raven God - On Data Set 4 - Call Killedmonster"),
+(@NPC_VISION_RAVEN_GOD,0,5,0,61,0,100,0,0,0,0,0,1,2,0,0,0,0,0,21,20,0,0,0.0,0.0,0.0,0.0,"Vision of Raven God - Link - Say 2"),
+(@NPC_VISION_RAVEN_GOD,0,6,7,38,0,100,0,1,4,0,0,33,@KC_FOURTH_PROPHECY,0,0,0,0,0,21,20,0,0,0.0,0.0,0.0,0.0,"Vision of Raven God - On Data Set 4 - Call Killedmonster"),
+(@NPC_VISION_RAVEN_GOD,0,7,0,61,0,100,0,0,0,0,0,1,3,0,0,0,0,0,21,20,0,0,0.0,0.0,0.0,0.0,"Vision of Raven God - Link - Say 3"),
+-- GOB Totems
+(184950,1,0,1,64,0,100,0,0,0,0,0,12,@NPC_VISION_RAVEN_GOD,3,6000,0,0,0,8,0,0,0,3779.987061,6729.603027,180.498413,5.71490,"First Prophecy - On Gossip Hello - Summon Whisper Raven God"),
+(184950,1,1,0,61,0,100,0,0,0,0,0,45,1,1,0,0,0,0,11,@NPC_VISION_RAVEN_GOD,20,0,0,0,0,0,"First Prophecy - Link - Set Data 1 to Raven God"),
+(184967,1,0,1,64,0,100,0,0,0,0,0,12,@NPC_VISION_RAVEN_GOD,3,6000,0,0,0,8,0,0,0,3629.285889,6542.140137,155.004669,2.56267,"Second Prophecy - On Gossip Hello - Summon Whisper Raven God"),
+(184967,1,1,0,61,0,100,0,0,0,0,0,45,1,2,0,0,0,0,11,@NPC_VISION_RAVEN_GOD,20,0,0,0,0,0,"Second Prophecy - Link - Set Data 2 to Raven God"),
+(184968,1,0,1,64,0,100,0,0,0,0,0,12,@NPC_VISION_RAVEN_GOD,3,6000,0,0,0,8,0,0,0,3736.950439,6640.749023,133.674530,3.33629,"Third Prophecy - On Gossip Hello - Summon Whisper Raven God"),
+(184968,1,1,0,61,0,100,0,0,0,0,0,45,1,3,0,0,0,0,11,@NPC_VISION_RAVEN_GOD,20,0,0,0,0,0,"Third Prophecy - Link - Set Data 3 to Raven God"),
+(184969,1,0,1,64,0,100,0,0,0,0,0,12,@NPC_VISION_RAVEN_GOD,3,6000,0,0,0,8,0,0,0,3572.574219,6669.196289,128.455444,5.62290,"Four Prophecy - On Gossip Hello - Summon Whisper Raven God"),
+(184969,1,1,0,61,0,100,0,0,0,0,0,45,1,4,0,0,0,0,11,@NPC_VISION_RAVEN_GOD,20,0,0,0,0,0,"Fourth Prophecy - Link - Set Data 4 to Raven God");
+
+DELETE FROM `conditions` WHERE `ConditionValue1`=@AURA_UNDERSTANDING_RAVENSPEECH AND `sourcetypeorreferenceid`=22;
+DELETE FROM `conditions` WHERE `ConditionValue1`=@NPC_VISION_RAVEN_GOD AND `sourcetypeorreferenceid`=22;
+DELETE FROM `conditions` WHERE `SourceEntry`=@NPC_VISION_RAVEN_GOD AND `sourcetypeorreferenceid`=22;
+INSERT INTO `conditions` (SourceTypeOrReferenceId,SourceGroup,SourceEntry,SourceId,ElseGroup,ConditionTypeOrReference,ConditionTarget,ConditionValue1,ConditionValue2,ConditionValue3,NegativeCondition,ErrorType,ErrorTextId,ScriptName,`Comment`) VALUES
+(22,1,184950,1,0,1 ,0,@AURA_UNDERSTANDING_RAVENSPEECH,0,0,0,0,0,'','GOb First Prophecy - SAI 1, only if player has aura Understanding Ravenspeech'),
+(22,1,184950,1,0,29,0,@NPC_VISION_RAVEN_GOD,20,0,1,0,0,'','GOb First Prophecy - SAI 1, only if Raven God is not near'),
+(22,1,184967,1,0,1 ,0,@AURA_UNDERSTANDING_RAVENSPEECH,0,0,0,0,0,'','GOb Second Prophecy - SAI 1, only if player has aura Understanding Ravenspeech'),
+(22,1,184967,1,0,29,0,@NPC_VISION_RAVEN_GOD,20,0,1,0,0,'','GOb Second Prophecy - SAI 1, only if Raven God is not near'),
+(22,1,184968,1,0,1 ,0,@AURA_UNDERSTANDING_RAVENSPEECH,0,0,0,0,0,'','GOb Third Prophecy - SAI 1, only if player has aura Understanding Ravenspeech'),
+(22,1,184968,1,0,29,0,@NPC_VISION_RAVEN_GOD,20,0,1,0,0,'','GOb Third Prophecy - SAI 1, only if Raven God is not near'),
+(22,1,184969,1,0,1 ,0,@AURA_UNDERSTANDING_RAVENSPEECH,0,0,0,0,0,'','GOb Fourth Prophecy - SAI 1, only if player has aura Understanding Ravenspeech'),
+(22,1,184969,1,0,29,0,@NPC_VISION_RAVEN_GOD,20,0,1,0,0,'','GOb Fourth Prophecy - SAI 1, only if Raven God is not near');
diff --git a/sql/updates/world/2015_02_13_02_world.sql b/sql/updates/world/2015_02_13_02_world.sql
new file mode 100644
index 00000000000..1780a238dca
--- /dev/null
+++ b/sql/updates/world/2015_02_13_02_world.sql
@@ -0,0 +1,144 @@
+--
+DELETE FROM `areatrigger_scripts` WHERE `ScriptName` IN ('at_twiggy_flathead','at_madrigosa','at_eye_of_eternity_improvised_floor');
+
+UPDATE `gameobject_template` SET `ScriptName`='' WHERE `ScriptName` IN ('go_defias_cannon','go_door_lever_dm','go_kael_orb','go_movie_orb');
+
+UPDATE `item_template` SET `ScriptName`='' WHERE `ScriptName`='internalitemhandler';
+
+UPDATE `creature_template` SET `ScriptName`='' WHERE `ScriptName` IN ('do_nothing','npc_aran_blizzard','npc_bladespire_ogre','npc_blaze','npc_crystalline_tangler','npc_demon_fire','npc_flame_crash','npc_generic_harpoon_cannon','npc_homunculus','npc_invis_legion_teleporter','npc_magnetic_core','npc_mindless_skeleton','npc_nether_vapor','npc_novos_minion','npc_sliver','npc_thuzadin_acolyte','npc_tracy_proudwell','npc_vereth_the_cunning','npc_void_zone','npc_yauj_brood');
+
+DELETE FROM `spell_script_names` WHERE `scriptname` IN ('spell_ex_463', 'spell_ex_5581', 'spell_ex_66244', 'spell_ex_absorb_aura', 'spell_mimiron_flame_suppressant');
+
+UPDATE `smart_scripts` SET `link`=0 WHERE `entryorguid`=37120 AND `source_type`=0 AND `id`=3 AND `link`=7;
+
+-- Grand Necrolord Antiok SAI
+SET @ENTRY := 28006;
+UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,0,0,0,0,0,100,0,7000,7000,18000,18000,11,32863,0,0,0,0,0,2,0,0,0,0,0,0,0,"Grand Necrolord Antiok - In Combat - Cast 'Seed of Corruption'"),
+(@ENTRY,0,1,0,0,0,100,0,1100,1100,20000,20000,11,50455,0,0,0,0,0,2,0,0,0,0,0,0,0,"Grand Necrolord Antiok - In Combat - Cast 'Shadow Bolt'"),
+(@ENTRY,0,2,0,1,0,100,0,10000,10000,40000,40000,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,"Grand Necrolord Antiok - Out of Combat - Say Line 1"),
+(@ENTRY,0,3,0,2,0,100,1,0,25,0,0,11,50497,1,0,0,0,0,2,0,0,0,0,0,0,0,"Grand Necrolord Antiok - Between 0-25% Health - Cast 'Scream of Chaos' (No Repeat)"),
+(@ENTRY,0,4,0,6,0,100,0,0,0,0,0,11,50472,0,0,0,0,0,1,0,0,0,0,0,0,0,"Grand Necrolord Antiok - On Just Died - Cast 'Drop Scythe of Antiok'"),
+(@ENTRY,0,5,6,4,0,100,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,"Grand Necrolord Antiok - On Aggro - Say Line 0"),
+(@ENTRY,0,6,0,61,0,100,0,0,0,0,0,11,55984,1,0,0,0,0,2,0,0,0,0,0,0,0,"Grand Necrolord Antiok - On Aggro - Cast 'Shadow Bolt'"),
+(@ENTRY,0,7,8,4,0,100,0,0,0,0,0,51,0,0,0,0,0,0,19,27996,20,0,0,0,0,0,"Grand Necrolord Antiok - On Aggro - Kill Target"),
+(@ENTRY,0,8,0,61,0,100,0,0,0,0,0,28,50494,0,0,0,0,0,1,0,0,0,0,0,0,0,"Grand Necrolord Antiok - On Aggro - Remove Aura 'Shroud of Lightning'");
+
+UPDATE `smart_scripts` SET `link`=0 WHERE `entryorguid`=27987 AND `source_type`=0 AND `id`=0 AND `link`=1;
+UPDATE `smart_scripts` SET `link`=11 WHERE `entryorguid`=27788 AND `source_type`=0 AND `id`=2 AND `link`=12;
+UPDATE `smart_scripts` SET `link`=0 WHERE `entryorguid`=26701 AND `source_type`=0 AND `id`=0 AND `link`=1;
+UPDATE `smart_scripts` SET `link`=0 WHERE `entryorguid`=24035 AND `source_type`=0 AND `id`=0 AND `link`=1;
+
+-- Ara Technician SAI
+SET @ENTRY := 20438;
+UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,0,0,1,38,0,100,0,4,4,0,0,8,1,0,0,0,0,0,1,0,0,0,0,0,0,0,"Ara Technician - On Data Set 4 4 - Set Reactstate Defensive"),
+(@ENTRY,0,1,0,61,0,100,0,4,4,0,0,87,2043900,2043901,0,0,0,0,1,0,0,0,0,0,0,0,"Ara Technician - On Data Set 4 4 - Run Random Script"),
+(@ENTRY,0,2,0,1,1,100,1,12000,12000,0,0,45,1,1,0,0,0,0,20,184312,0,0,0,0,0,0,"Ara Technician - Out of Combat - Set Data 1 1 (Phase 1) (No Repeat)"),
+(@ENTRY,0,3,4,40,0,100,0,1,0,0,0,11,35176,0,0,0,0,0,1,0,0,0,0,0,0,0,"Ara Technician - On Waypoint 1 Reached - Cast 'Interrupt Shutdown'"),
+(@ENTRY,0,4,0,61,0,100,0,1,0,0,0,22,1,0,0,0,0,0,1,0,0,0,0,0,0,0,"Ara Technician - On Waypoint 1 Reached - Set Event Phase 1"),
+(@ENTRY,0,5,6,4,0,100,0,1,0,0,0,22,0,0,0,0,0,0,1,0,0,0,0,0,0,0,"Ara Technician - On Aggro - Set Event Phase 0"),
+(@ENTRY,0,6,7,61,0,100,0,1,0,0,0,8,2,0,0,0,0,0,1,0,0,0,0,0,0,0,"Ara Technician - On Aggro - Set Reactstate Aggressive"),
+(@ENTRY,0,7,8,61,0,100,0,1,0,0,0,20,1,0,0,0,0,0,1,0,0,0,0,0,0,0,"Ara Technician - On Aggro - Start Attacking"),
+(@ENTRY,0,8,0,61,0,100,0,1,0,0,0,21,1,0,0,0,0,0,1,0,0,0,0,0,0,0,"Ara Technician - On Aggro - Enable Combat Movement"),
+(@ENTRY,0,9,0,7,0,100,0,0,0,0,0,45,1,1,0,0,0,0,20,184312,0,0,0,0,0,0,"Ara Technician - On Evade - Set Data 1 1");
+
+-- Audrid SAI
+SET @ENTRY := 18903;
+UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,0,0,0,11,0,100,0,0,0,0,0,53,0,18903,1,0,0,0,1,0,0,0,0,0,0,0,"Audrid - On Respawn - Start Waypoint"),
+(@ENTRY,0,1,11,40,0,100,0,4,18903,0,0,54,60000,0,0,0,0,0,1,0,0,0,0,0,0,0,"Audrid - On Waypoint 4 Reached - Pause Waypoint"),
+(@ENTRY,0,2,12,40,0,100,0,9,18903,0,0,54,60000,0,0,0,0,0,1,0,0,0,0,0,0,0,"Audrid - On Waypoint 9 Reached - Pause Waypoint"),
+(@ENTRY,0,3,13,40,0,100,0,11,18903,0,0,54,60000,0,0,0,0,0,1,0,0,0,0,0,0,0,"Audrid - On Waypoint 11 Reached - Pause Waypoint"),
+(@ENTRY,0,4,14,40,0,100,0,12,18903,0,0,54,60000,0,0,0,0,0,1,0,0,0,0,0,0,0,"Audrid - On Waypoint 12 Reached - Pause Waypoint"),
+(@ENTRY,0,5,15,40,0,100,0,13,18903,0,0,54,60000,0,0,0,0,0,1,0,0,0,0,0,0,0,"Audrid - On Waypoint 13 Reached - Pause Waypoint"),
+(@ENTRY,0,6,16,40,0,100,0,14,18903,0,0,54,60000,0,0,0,0,0,1,0,0,0,0,0,0,0,"Audrid - On Waypoint 14 Reached - Pause Waypoint"),
+(@ENTRY,0,7,17,40,0,100,0,17,18903,0,0,54,60000,0,0,0,0,0,1,0,0,0,0,0,0,0,"Audrid - On Waypoint 17 Reached - Pause Waypoint"),
+(@ENTRY,0,8,18,40,0,100,0,22,18903,0,0,54,60000,0,0,0,0,0,1,0,0,0,0,0,0,0,"Audrid - On Waypoint 22 Reached - Pause Waypoint"),
+(@ENTRY,0,9,19,40,0,100,0,25,18903,0,0,54,60000,0,0,0,0,0,1,0,0,0,0,0,0,0,"Audrid - On Waypoint 25 Reached - Pause Waypoint"),
+(@ENTRY,0,10,20,40,0,100,0,28,18903,0,0,54,60000,0,0,0,0,0,1,0,0,0,0,0,0,0,"Audrid - On Waypoint 28 Reached - Pause Waypoint"),
+(@ENTRY,0,11,21,61,0,100,0,4,18903,0,0,80,@ENTRY*100+00,2,0,0,0,0,1,0,0,0,0,0,0,0,"Audrid - On Waypoint 4 Reached - Run Script"),
+(@ENTRY,0,12,22,61,0,100,0,9,18903,0,0,80,@ENTRY*100+01,2,0,0,0,0,1,0,0,0,0,0,0,0,"Audrid - On Waypoint 9 Reached - Run Script"),
+(@ENTRY,0,13,22,61,0,100,0,11,18903,0,0,80,@ENTRY*100+02,2,0,0,0,0,1,0,0,0,0,0,0,0,"Audrid - On Waypoint 11 Reached - Run Script"),
+(@ENTRY,0,14,23,61,0,100,0,12,18903,0,0,80,@ENTRY*100+03,2,0,0,0,0,1,0,0,0,0,0,0,0,"Audrid - On Waypoint 12 Reached - Run Script"),
+(@ENTRY,0,15,21,61,0,100,0,13,18903,0,0,80,@ENTRY*100+04,2,0,0,0,0,1,0,0,0,0,0,0,0,"Audrid - On Waypoint 13 Reached - Run Script"),
+(@ENTRY,0,16,24,61,0,100,0,14,18903,0,0,80,@ENTRY*100+05,2,0,0,0,0,1,0,0,0,0,0,0,0,"Audrid - On Waypoint 14 Reached - Run Script"),
+(@ENTRY,0,17,22,61,0,100,0,17,18903,0,0,80,@ENTRY*100+06,2,0,0,0,0,1,0,0,0,0,0,0,0,"Audrid - On Waypoint 17 Reached - Run Script"),
+(@ENTRY,0,18,21,61,0,100,0,22,18903,0,0,80,@ENTRY*100+07,2,0,0,0,0,1,0,0,0,0,0,0,0,"Audrid - On Waypoint 22 Reached - Run Script"),
+(@ENTRY,0,19,21,61,0,100,0,25,18903,0,0,80,@ENTRY*100+08,2,0,0,0,0,1,0,0,0,0,0,0,0,"Audrid - On Waypoint 25 Reached - Run Script"),
+(@ENTRY,0,20,21,61,0,100,0,28,18903,0,0,80,@ENTRY*100+09,2,0,0,0,0,1,0,0,0,0,0,0,0,"Audrid - On Waypoint 28 Reached - Run Script"),
+(@ENTRY,0,21,0,61,0,100,0,4,18903,0,0,66,0,0,0,0,0,0,8,0,0,0,0,0,0,1.5,"Audrid - On Waypoint 4 Reached - Set Orientation 1,5"),
+(@ENTRY,0,22,0,61,0,100,0,9,18903,0,0,66,0,0,0,0,0,0,8,0,0,0,0,0,0,3,"Audrid - On Waypoint 9 Reached - Set Orientation 3"),
+(@ENTRY,0,23,0,61,0,100,0,12,18903,0,0,66,0,0,0,0,0,0,8,0,0,0,0,0,0,4.5,"Audrid - On Waypoint 12 Reached - Set Orientation 4,5"),
+(@ENTRY,0,24,0,61,0,100,0,14,18903,0,0,66,0,0,0,0,0,0,8,0,0,0,0,0,0,6,"Audrid - On Waypoint 14 Reached - Set Orientation 6");
+
+UPDATE `smart_scripts` SET `event_type`=61 WHERE `entryorguid`=26670 AND `source_type`=0 AND `id`=19 AND `link`=20;
+UPDATE `smart_scripts` SET `link`=20 WHERE `entryorguid`=17892 AND `source_type`=0 AND `id`=19 AND `link`=0;
+UPDATE `smart_scripts` SET `link`=7 WHERE `entryorguid`=17892 AND `source_type`=0 AND `id`=6 AND `link`=0;
+UPDATE `smart_scripts` SET `link`=0 WHERE `entryorguid`=37952 AND `source_type`=0 AND `id`=1 AND `link`=2;
+UPDATE `smart_scripts` SET `link`=0 WHERE `entryorguid`=26787 AND `source_type`=0 AND `id`=0 AND `link`=1;
+
+-- Mad Voidwalker SAI
+SET @ENTRY := 15146;
+UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,0,0,0,11,0,100,0,0,0,0,0,89,10,0,0,0,0,0,1,0,0,0,0,0,0,0,"Mad Voidwalker - On Respawn - Start Random Movement"),
+(@ENTRY,0,1,0,0,0,100,2,7000,9000,11000,13000,11,24614,0,0,0,0,0,2,0,0,0,0,0,0,0,"Mad Voidwalker - In Combat - Cast 'Consuming Shadows' (Normal Dungeon)"),
+(@ENTRY,0,2,0,0,0,100,2,3000,4000,8000,8000,11,24616,0,0,0,0,0,2,0,0,0,0,0,0,0,"Mad Voidwalker - In Combat - Cast 'Shadow Shock' (Normal Dungeon)"),
+(@ENTRY,0,3,0,1,0,100,0,0,0,0,0,41,180000,0,0,0,0,0,1,0,0,0,0,0,0,0,"Mad Voidwalker - Out of Combat - Despawn In 180000 ms");
+
+UPDATE `smart_scripts` SET `link`=9 WHERE `entryorguid`=12236 AND `source_type`=0 AND `id`=8 AND `link`=0;
+UPDATE `smart_scripts` SET `link`=9 WHERE `entryorguid`=13196 AND `source_type`=0 AND `id`=8 AND `link`=0;
+
+-- Scarlet Curate SAI
+SET @ENTRY := 9450;
+UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,0,0,0,9,0,100,0,0,40,3400,4800,11,25054,64,0,0,0,0,2,0,0,0,0,0,0,0,"Scarlet Curate - Within 0-40 Range - Cast 'Holy Smite'"),
+(@ENTRY,0,1,0,15,0,100,1,0,0,30,0,11,17201,1,0,0,0,0,7,0,0,0,0,0,0,0,"Scarlet Curate - On Friendly Crowd Controlled - Cast 'Dispel Magic' (No Repeat)"),
+(@ENTRY,0,2,0,74,0,100,0,0,40,25000,35000,11,17201,1,0,0,0,0,9,0,0,0,0,0,0,0,"Scarlet Curate - On Friendly Between 0-40% Health - Cast 'Dispel Magic'"),
+(@ENTRY,0,3,0,2,0,100,1,0,15,0,0,25,1,0,0,0,0,0,1,0,0,0,0,0,0,0,"Scarlet Curate - Between 0-15% Health - Flee For Assist (No Repeat)");
+
+UPDATE `smart_scripts` SET `link`=25 WHERE `entryorguid`=4880 AND `source_type`=0 AND `id`=24 AND `link`=26;
+UPDATE `smart_scripts` SET `link`=22, `event_type`=61 WHERE `entryorguid`=4880 AND `source_type`=0 AND `id`=21 AND `link`=0;
+UPDATE `smart_scripts` SET `link`=16 WHERE `entryorguid`=31279 AND `source_type`=0 AND `id`=15 AND `link`=0;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=1535 AND `source_type`=0 AND `id`=0 AND `link`=0;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=2719 AND `source_type`=0 AND `id`=0 AND `link`=0;
+UPDATE `smart_scripts` SET `action_type`=5, `action_param1`=1 WHERE `entryorguid`=4484 AND `source_type`=0 AND `id`=24 AND `link`=25;
+UPDATE `smart_scripts` SET `action_type`=5, `action_param1`=1 WHERE `entryorguid`=13601 AND `source_type`=0 AND `id`=2 AND `link`=0;
+
+-- Short John Mithril SAI
+SET @ENTRY := 14508;
+UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,0,0,0,68,0,100,0,16,0,0,0,53,0,14508,0,0,0,0,1,0,0,0,0,0,0,0,"Short John Mithril - On Game Event 16 Started - Start Waypoint"),
+(@ENTRY,0,1,0,40,0,100,0,1,14508,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,"Short John Mithril - On Waypoint 1 Reached - Say Line 0"),
+(@ENTRY,0,2,3,40,0,100,0,16,14508,0,0,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,"Short John Mithril - On Waypoint 16 Reached - Say Line 1"),
+(@ENTRY,0,3,0,61,0,100,0,16,14508,0,0,11,23176,0,0,0,0,0,1,0,0,0,0,0,0,0,"Short John Mithril - On Waypoint 16 Reached - Cast 'Summon Pirate Booty (DND)'"),
+(@ENTRY,0,4,0,40,0,100,0,33,14508,0,0,66,0,0,0,0,0,0,8,0,0,0,0,0,0,4.41568,"Short John Mithril - On Waypoint 33 Reached - Set Orientation 4,41568");
+
+UPDATE `smart_scripts` SET `action_type`=5, `action_param1`=1 WHERE `entryorguid`=15324 AND `source_type`=0 AND `id`=3 AND `link`=0;
+UPDATE `smart_scripts` SET `action_type`=5, `action_param1`=1 WHERE `entryorguid`=15526 AND `source_type`=0 AND `id`=2 AND `link`=0;
+UPDATE `smart_scripts` SET `action_type`=5, `action_param1`=1 WHERE `entryorguid`=17397 AND `source_type`=0 AND `id`=0 AND `link`=0;
+UPDATE `smart_scripts` SET `action_type`=5, `action_param1`=1 WHERE `entryorguid`=18554 AND `source_type`=0 AND `id`=9 AND `link`=0;
+UPDATE `smart_scripts` SET `action_type`=5, `action_param1`=1 WHERE `entryorguid`=18554 AND `source_type`=0 AND `id`=13 AND `link`=0;
+UPDATE `smart_scripts` SET `action_type`=5, `action_param1`=1 WHERE `entryorguid`=18554 AND `source_type`=0 AND `id`=14 AND `link`=0;
+UPDATE `smart_scripts` SET `action_type`=5, `action_param1`=1 WHERE `entryorguid`=18938 AND `source_type`=0 AND `id`=2 AND `link`=0;
+UPDATE `smart_scripts` SET `action_type`=5 WHERE `entryorguid`=19354 AND `source_type`=0 AND `id`=4 AND `link`=0;
+UPDATE `smart_scripts` SET `action_type`=5, `action_param1`=1 WHERE `entryorguid`=23669 AND `source_type`=0 AND `id`=3 AND `link`=0;
+UPDATE `smart_scripts` SET `action_type`=5, `action_param1`=1 WHERE `entryorguid`=24198 AND `source_type`=0 AND `id`=3 AND `link`=4;
+UPDATE `smart_scripts` SET `action_type`=11, `action_param1`=55036 WHERE `entryorguid`=29903 AND `source_type`=0 AND `id`=6 AND `link`=7;
+UPDATE `smart_scripts` SET `action_type`=11, `action_param1`=58190 WHERE `entryorguid`=30894 AND `source_type`=0 AND `id`=2 AND `link`=3;
+UPDATE `smart_scripts` SET `action_type`=5, `action_param1`=1 WHERE `entryorguid`=30945 AND `source_type`=0 AND `id`=9 AND `link`=0;
+
+UPDATE `creature_template_addon` SET`auras`="" WHERE`entry` IN (26608, 31306); -- vehicle auras appear only when the npc ride a vehicle or when he's mounted
+UPDATE `creature_template` SET `npcflag`=16777216 WHERE `entry`=35427;
diff --git a/sql/updates/world/2015_02_13_03_world.sql b/sql/updates/world/2015_02_13_03_world.sql
new file mode 100644
index 00000000000..0b0548c3f78
--- /dev/null
+++ b/sql/updates/world/2015_02_13_03_world.sql
@@ -0,0 +1,12 @@
+DELETE FROM `gameobject_loot_template` WHERE `entry`IN (1414,1415,1417,1418,1419,1420,1421,1733,1734,2513) AND `item`=5056;
+INSERT INTO `gameobject_loot_template` (`Entry`, `Item`, `Reference`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES
+(1414, 5056, 0, 100, 1, 1, 0, 1, 1, NULL),
+(1415, 5056, 0, 100, 1, 1, 0, 1, 1, NULL),
+(1417, 5056, 0, 100, 1, 1, 0, 1, 1, NULL),
+(1418, 5056, 0, 100, 1, 1, 0, 1, 1, NULL),
+(1419, 5056, 0, 100, 1, 1, 0, 1, 1, NULL),
+(1420, 5056, 0, 100, 1, 1, 0, 1, 1, NULL),
+(1421, 5056, 0, 100, 1, 1, 0, 1, 1, NULL),
+(1733, 5056, 0, 100, 1, 1, 0, 1, 1, NULL),
+(1734, 5056, 0, 100, 1, 1, 0, 1, 1, NULL),
+(2513, 5056, 0, 100, 1, 1, 0, 1, 1, NULL);
diff --git a/sql/updates/world/2015_02_13_04_world.sql b/sql/updates/world/2015_02_13_04_world.sql
new file mode 100644
index 00000000000..96db7cbf845
--- /dev/null
+++ b/sql/updates/world/2015_02_13_04_world.sql
@@ -0,0 +1,4 @@
+--
+UPDATE `smart_scripts` SET `target_o`=0 WHERE `entryorguid`=177490 AND `source_type`=1 AND `id`=0;
+UPDATE `smart_scripts` SET `target_o`=0 WHERE `entryorguid`=177490 AND `source_type`=1 AND `id`=2;
+UPDATE `smart_scripts` SET `target_o`=0 WHERE `entryorguid`=2749200 AND `source_type`=9 AND `id`=5;
diff --git a/sql/updates/world/2015_02_13_05_world.sql b/sql/updates/world/2015_02_13_05_world.sql
new file mode 100644
index 00000000000..ca9b648d5eb
--- /dev/null
+++ b/sql/updates/world/2015_02_13_05_world.sql
@@ -0,0 +1,74 @@
+--
+UPDATE `creature_template` SET `ScriptName`='' WHERE `entry`=23616;
+UPDATE `creature` SET `MovementType`=0 WHERE `guid`=24762;
+DELETE FROM `creature_addon` WHERE `guid`=24762;
+DELETE FROM `waypoint_data` WHERE `id`=247620;
+DELETE FROM `waypoints` WHERE `entry`=23616;
+INSERT INTO `waypoints` (`entry`, `pointid`, `position_x`, `position_y`, `position_z`, `point_comment`) VALUES
+(23616, 1, -2454.94, -482.136, -8.97948, 'Kyle'),
+(23616, 2, -2445.34, -476.395, -8.92086, 'Kyle'),
+(23616, 3, -2433.79, -468.785, -9.20522, 'Kyle'),
+(23616, 4, -2422.01, -460.858, -9.1759, 'Kyle'),
+(23616, 5, -2407.47, -451.07, -8.70993, 'Kyle'),
+(23616, 6, -2395.98, -443.42, -8.42222, 'Kyle'),
+(23616, 7, -2383.8, -436.212, -8.78844, 'Kyle'),
+(23616, 8, -2367.83, -425.967, -9.38671, 'Kyle'),
+(23616, 9, -2355.15, -413.835, -9.75652, 'Kyle'),
+(23616, 10, -2345.39, -403.032, -8.87064, 'Kyle'),
+(23616, 11, -2338.73, -387.213, -7.97681, 'Kyle'),
+(23616, 12, -2330.27, -374.08, -8.37519, 'Kyle'),
+(23616, 13, -2314.64, -365.663, -9.41672, 'Kyle'),
+(23616, 14, -2295.45, -360.874, -9.42468, 'Kyle'),
+(23616, 15, -2279.85, -357.148, -9.42468, 'Kyle'),
+(23616, 16, -2263.83, -363.376, -9.42468, 'Kyle'),
+(23616, 17, -2248.52, -370.238, -9.42468, 'Kyle'),
+(23616, 18, -2226.43, -386.156, -9.42468, 'Kyle'),
+(23616, 19, -2232.14, -416.578, -9.42205, 'Kyle'),
+(23616, 20, -2247.29, -439.615, -9.42475, 'Kyle'),
+(23616, 21, -2252.91, -448.416, -9.09973, 'Kyle'),
+(23616, 22, -2257.71, -455.921, -8.15442, 'Kyle'),
+(23616, 23, -2271.66, -475.713, -7.80418, 'Kyle'),
+(23616, 24, -2293.85, -483.264, -7.86093, 'Kyle'),
+(23616, 25, -2302.71, -490.694, -7.92982, 'Kyle'),
+(23616, 26, -2306.74, -494.585, -8.44247, 'Kyle'),
+(23616, 27, -2324.17, -516.494, -9.32393, 'Kyle'),
+(23616, 28, -2340.11, -535.209, -9.2326, 'Kyle'),
+(23616, 29, -2357.69, -538.25, -9.158, 'Kyle'),
+(23616, 30, -2372.68, -528.41, -9.15687, 'Kyle'),
+(23616, 31, -2391.28, -518.477, -8.4459, 'Kyle'),
+(23616, 32, -2404.81, -514.866, -7.4283, 'Kyle'),
+(23616, 33, -2418.06, -510.431, -6.09458, 'Kyle'),
+(23616, 34, -2431.22, -505.672, -6.06301, 'Kyle'),
+(23616, 35, -2443.9, -499.738, -7.60161, 'Kyle'),
+(23616, 36, -2462.4, -488.247, -9.27003, 'Kyle');
+
+SET @ENTRY := 23616;
+SET @Friendly:= 23622;
+UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`IN (@ENTRY, @Friendly);
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@Friendly AND `source_type`=0;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@Friendly*100 AND `source_type`=9;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,0,0,0,25,0,100,0,0,0,0,0,53,1,23616,1,0,0,0,1,0,0,0,0,0,0,0,"Kyle the Frenzied - On Reset - Start Waypoint"),
+(@ENTRY,0,1,2,8,0,100,0,42222,0,55000,55000,64,1,0,0,0,0,0,7,0,0,0,0,0,0,0,"Kyle the Frenzied - On Spellhit 'Lunch for Kyle' - Store Targetlist"),
+(@ENTRY,0,2,0,61,0,100,0,0,0,0,0,80,@ENTRY*100+00,2,0,0,0,0,1,0,0,0,0,0,0,0,"Kyle the Frenzied - On Spellhit 'Lunch for Kyle' - Run Script");
+
+-- Actionlist SAI
+SET @ENTRY := 2361600;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=9;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,9,0,0,0,0,100,0,0,0,0,0,54,55000,0,0,0,0,0,1,186265,50,0,0,0,0,0,"Kyle the Frenzied - On Script - Pause Waypoint"),
+(@ENTRY,9,1,0,0,0,100,1,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,"Kyle the Frenzied - On Script - Say Line 0 (No Repeat)"),
+(@ENTRY,9,2,0,0,0,100,0,0,0,0,0,17,393,0,0,0,0,0,1,0,0,0,0,0,0,0,"Kyle the Frenzied - On Script - Set Emote State 393"),
+(@ENTRY,9,3,0,0,0,100,0,5000,5000,0,0,69,0,0,0,0,0,0,20,186265,50,0,0,0,0,0,"Kyle the Frenzied - On Script - Move To Closest Gameobject 'Kyle's Lunch'"),
+(@ENTRY,9,4,0,0,0,100,0,3000,3000,0,0,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,"Kyle the Frenzied - On Script - Say Line 1"),
+(@ENTRY,9,5,0,0,0,100,0,0,0,0,0,17,69,0,0,0,0,0,1,0,0,0,0,0,0,0,"Kyle the Frenzied - On Script - Set Emote State 69"),
+(@ENTRY,9,6,0,0,0,100,0,4000,4000,0,0,12,@Friendly,8,0,0,0,0,1,0,0,0,0,0,0,0,"On Script - Summon Kyle the Friendly"),
+(@ENTRY,9,7,0,0,0,100,0,0,0,0,0,41,0,0,0,0,0,0,1,0,0,0,0,0,0,0,"On Script - Despawn"),
+
+(@Friendly,0,0,0,25,0,100,0,0,0,0,0,80,@Friendly*100,2,0,0,0,0,1,0,0,0,0,0,0,0,"Kyle the Friendly - On Reset - Run Script"),
+(@Friendly*100,9,0,0,0,0,100,0,5000,5000,0,0,1,2,0,0,0,0,0,1,0,0,0,0,0,0,0,"Kyle the Friendly - On Script - Say Line 2"),
+(@Friendly*100,9,1,0,0,0,100,0,0,0,0,0,17,400,0,0,0,0,0,1,0,0,0,0,0,0,0,"Kyle the Friendly - On Script - Set Emote State 400"),
+(@Friendly*100,9,2,0,0,0,100,0,0,0,0,0,33,23616,0,0,0,0,0,21,10,0,0,0,0,0,0,"Kyle the Friendly - On Script - Quest Credit 'Kyle's Gone Missing!'"),
+(@Friendly*100,9,3,0,0,0,100,0,30000,30000,0,0,70,0,0,0,0,0,0,10,24762,23616,0,0,0,0,0,"Kyle the Friendly - On Script - respawn Kyle the Frenzied"),
+(@Friendly*100,9,4,0,0,0,100,0,0,0,0,0,41,0,0,0,0,0,0,1,0,0,0,0,0,0,0,"Kyle the Friendly -On Script - Despawn");
diff --git a/sql/updates/world/2015_02_13_06_world.sql b/sql/updates/world/2015_02_13_06_world.sql
new file mode 100644
index 00000000000..8cc87843ad1
--- /dev/null
+++ b/sql/updates/world/2015_02_13_06_world.sql
@@ -0,0 +1,24 @@
+--
+DELETE FROM `npc_spellclick_spells` WHERE `npc_entry`=34935;
+INSERT INTO `npc_spellclick_spells` (`npc_entry`,`spell_id`,`cast_flags`,`user_type`) VALUES
+(34935,43671,1,0); -- Horde Gunship Cannon - Ride Vehicle
+
+SET @NPC_VISION_RAVEN_GOD := 21861;
+DELETE FROM `smart_scripts` WHERE `entryorguid` IN (@NPC_VISION_RAVEN_GOD) AND `source_type`=0;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@NPC_VISION_RAVEN_GOD,0,0,1,38,0,100,0,1,1,0,0,11,39426,0,0,0,0,0,21,20,0,0,0.0,0.0,0.0,0.0,"Vision of Raven God - On Data Set 4 - Cast credit"),
+(@NPC_VISION_RAVEN_GOD,0,1,0,61,0,100,0,0,0,0,0,1,0,0,0,0,0,0,21,20,0,0,0.0,0.0,0.0,0.0,"Vision of Raven God - Link - Say 0"),
+(@NPC_VISION_RAVEN_GOD,0,2,3,38,0,100,0,1,2,0,0,11,39428,0,0,0,0,0,21,20,0,0,0.0,0.0,0.0,0.0,"Vision of Raven God - On Data Set 4 - Cast credit"),
+(@NPC_VISION_RAVEN_GOD,0,3,0,61,0,100,0,0,0,0,0,1,1,0,0,0,0,0,21,20,0,0,0.0,0.0,0.0,0.0,"Vision of Raven God - Link - Say 1"),
+(@NPC_VISION_RAVEN_GOD,0,4,5,38,0,100,0,1,3,0,0,11,39430,0,0,0,0,0,21,20,0,0,0.0,0.0,0.0,0.0,"Vision of Raven God - On Data Set 4 - Cast credit"),
+(@NPC_VISION_RAVEN_GOD,0,5,0,61,0,100,0,0,0,0,0,1,2,0,0,0,0,0,21,20,0,0,0.0,0.0,0.0,0.0,"Vision of Raven God - Link - Say 2"),
+(@NPC_VISION_RAVEN_GOD,0,6,7,38,0,100,0,1,4,0,0,11,39431,0,0,0,0,0,21,20,0,0,0.0,0.0,0.0,0.0,"Vision of Raven God - On Data Set 4 - Cast credit"),
+(@NPC_VISION_RAVEN_GOD,0,7,0,61,0,100,0,0,0,0,0,1,3,0,0,0,0,0,21,20,0,0,0.0,0.0,0.0,0.0,"Vision of Raven God - Link - Say 3");
+
+SET @ENTRY := 24290;
+UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,0,0,0,8,0,100,0,43404,0,0,0,11,43419,0,0,0,0,0,7,0,0,0,0,0,0,0,"New Agamand Plague Tank Bunny - On Spellhit 'Mission: Plague This!: Orehammer's Precision Bombs Dummy' - Quest Credit 'Mission: Plague This!'");
+
+UPDATE `smart_scripts` SET `action_param1`=25068 WHERE `entryorguid`=24999 AND `source_type`=0 AND `id`=2 AND `link`=0;
diff --git a/sql/updates/world/2015_02_13_07_world.sql b/sql/updates/world/2015_02_13_07_world.sql
new file mode 100644
index 00000000000..a46884162f4
--- /dev/null
+++ b/sql/updates/world/2015_02_13_07_world.sql
@@ -0,0 +1,34 @@
+--
+SET @Zuluhed := 11980;
+SET @Portal := 22336;
+SET @Arcubus := 22338;
+SET @Infusion := 38853;
+SET @SummonPortal := 38876;
+SET @Rain := 19717;
+SET @SummonArcubus := 38877;
+
+UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry` IN (@Zuluhed, @Portal, @Arcubus);
+
+DELETE FROM `creature_text` WHERE `entry`=@Zuluhed;
+INSERT INTO `creature_text` (`entry`, `groupid`, `id`, `text`, `type`, `language`, `probability`, `emote`, `duration`, `sound`, `comment`, `BroadcastTextId`) VALUES
+(@Zuluhed,0,0,'Indeed, the time has come to end this charade.',14,0,100,0,0,0,'Zuluhed the Whacked', 20128),
+(@Zuluhed,1,0,'Destroy them! Destroy them all!', 14,0,100,0,0,0,'Zuluhed the Whacked', 20129),
+(@Zuluhed,2,0,'Foolish mortals. Did you think that I would not strike you down for your transgressions?', 14,0,100,0,0,0,'Zuluhed the Whacked', 20127),
+(@Zuluhed,3,0,'Lord Illidan, bless me with the power of the flight!', 14,0,100,0,0,0,'Zuluhed the Whacked', 20126);
+
+DELETE FROM `smart_scripts` WHERE `entryorguid` IN (@Zuluhed, @Portal, @Arcubus) AND `source_type`=0;
+DELETE FROM `smart_scripts` WHERE `entryorguid` IN (@Zuluhed*100, @Zuluhed*100+1, @Portal*100) AND `source_type`=9;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@Zuluhed,0,0,0,54,0,100,0,0,0,0,0,80,@Zuluhed*100,2,0,0,0,0,1,0,0,0,0.0,0.0,0.0,0.0,"Zuluhed the Whacked - Just Summoned - action list"),
+(@Zuluhed*100,9,0,0,0,0,100,0,0,0,0,0,1,2,0,0,0,0,0,1,0,0,0,0.0,0.0,0.0,0.0,"Zuluhed the Whacked - action list - text"),
+(@Zuluhed*100,9,1,0,0,0,100,0,5000,5000,0,0,1,0,0,0,0,0,0,1,0,0,0,0.0,0.0,0.0,0.0,"Zuluhed the Whacked - action list - text"),
+(@Zuluhed*100,9,2,0,0,0,100,0,4000,4000,0,0,1,1,0,0,0,0,0,1,0,0,0,0.0,0.0,0.0,0.0,"Zuluhed the Whacked - action list - text"),
+(@Zuluhed,0,1,0,0,0,100,0,12000,12000,12000,12000,11,@Rain,0,0,0,0,0,5,0,0,0,0.0,0.0,0.0,0.0,"Zuluhed the Whacked - IC - Cast rain"),
+(@Zuluhed,0,2,0,0,0,100,0,30000,30000,60000,60000,11,@SummonPortal,0,0,0,0,0,1,0,0,0,0.0,0.0,0.0,0.0,"Zuluhed the Whacked - IC - Summon portal"),
+(@Zuluhed,0,3,0,2,0,100,1,0,25,0,0,80,@Zuluhed*100+1,2,0,0,0,0,1,0,0,0,0,0,0,0,'Zuluhed the Whacked - On 25% health - ActionList'),
+(@Zuluhed*100+1,9,0,0,0,0,100,0,0,0,0,0,11,@Infusion,0,0,0,0,0,1,0,0,0,0,0,0,0,'Zuluhed the Whacked - ActionList - Cast Infusion'),
+(@Zuluhed*100+1,9,1,0,0,0,100,0,0,0,0,0,1,3,0,0,0,0,0,1,0,0,0,0,0,0,0,'Zuluhed the Whacked - ActionList - Text'),
+(@Arcubus,0,0,0,54,0,100,0,0,0,0,0,49,0,0,0,0,0,0,21,10,0,0,0.0,0.0,0.0,0.0,"Zuluhed the Whacked - Just Summoned - Attack player on 10 yards"),
+(@Portal,0,0,0,54,0,100,1,0,0,0,0,80,@Portal*100,2,0,0,0,0,1,0,0,0,0.0,0.0,0.0,0.0,"Portal - Just Summoned - action list"),
+(@Portal*100,9,0,0,0,0,100,0,0,0,0,0,103,1,0,0,0,0,0,1,0,0,0,0,0,0,0,'Portal - ActionList - SET_ROOT'),
+(@Portal*100,9,1,0,0,0,100,0,15000,15000,0,0,11,@SummonArcubus,0,0,0,0,0,1,0,0,0,0,0,0,0,'Portal - ActionList - Cast SummonArcubus');
diff --git a/sql/updates/world/2015_02_13_08_world.sql b/sql/updates/world/2015_02_13_08_world.sql
new file mode 100644
index 00000000000..7043a9cdff8
--- /dev/null
+++ b/sql/updates/world/2015_02_13_08_world.sql
@@ -0,0 +1,15 @@
+--
+UPDATE `smart_scripts` SET `action_param1`=25068 WHERE `entryorguid`=25002 AND `source_type`=0 AND `id`=0 AND `link`=0;
+
+DELETE FROM `npc_spellclick_spells` WHERE `npc_entry`=35427;
+INSERT INTO `npc_spellclick_spells` (`npc_entry`,`spell_id`,`cast_flags`,`user_type`) VALUES
+(35427,43671,1,0);
+
+UPDATE `smart_scripts` SET `action_type`=11, `action_param1`=38162 WHERE `entryorguid`=19937 AND `source_type`=0 AND `id` IN (1, 3, 12);
+UPDATE `smart_scripts` SET `action_type`=11, `action_param1`=70606 WHERE `entryorguid`=37826 AND `source_type`=0 AND `id` = 0;
+UPDATE `smart_scripts` SET `link`=0 WHERE `entryorguid`=25359 AND `source_type`=0 AND `id`=1;
+UPDATE `smart_scripts` SET `link`=6 WHERE `entryorguid`=25335 AND `source_type`=0 AND `id`=5;
+UPDATE `smart_scripts` SET `link`=10 WHERE `entryorguid`=25335 AND `source_type`=0 AND `id`=9;
+UPDATE `smart_scripts` SET `event_type`=61, `link`=0 WHERE `entryorguid`=4880 AND `source_type`=0 AND `id`=21;
+UPDATE `smart_scripts` SET `event_param1`=0 WHERE `entryorguid`=4880 AND `source_type`=0 AND `id`=23;
+UPDATE `smart_scripts` SET `link`=16 WHERE `entryorguid`=28122 AND `source_type`=0 AND `id`=15;
diff --git a/sql/updates/world/2015_02_13_09_world.sql b/sql/updates/world/2015_02_13_09_world.sql
new file mode 100644
index 00000000000..7ed85568830
--- /dev/null
+++ b/sql/updates/world/2015_02_13_09_world.sql
@@ -0,0 +1,3 @@
+DELETE FROM `achievement_criteria_data` WHERE `criteria_id` = 12752 AND `type` = 11;
+INSERT INTO `achievement_criteria_data` (`criteria_id`, `type`, `value1`, `value2`, `ScriptName`) VALUES
+(12752, 11, 0, 0, 'achievement_bronjahm_soul_power');
diff --git a/sql/updates/world/2015_02_14_00_world.sql b/sql/updates/world/2015_02_14_00_world.sql
new file mode 100644
index 00000000000..727aaf91e6f
--- /dev/null
+++ b/sql/updates/world/2015_02_14_00_world.sql
@@ -0,0 +1,8 @@
+--
+UPDATE `conditions` SET `ConditionValue3`=0 WHERE `SourceTypeOrReferenceId`=17 AND `SourceGroup`=0 AND `SourceEntry`=48363 AND `SourceId`=0 AND `ElseGroup`=0 AND `ConditionTypeOrReference`=29 AND `ConditionTarget`=0 AND `ConditionValue1`=27315 AND `ConditionValue2`=5 AND `ConditionValue3`=1;
+UPDATE `conditions` SET `ConditionValue3`=0 WHERE `SourceTypeOrReferenceId`=17 AND `SourceGroup`=0 AND `SourceEntry`=48363 AND `SourceId`=0 AND `ElseGroup`=1 AND `ConditionTypeOrReference`=29 AND `ConditionTarget`=0 AND `ConditionValue1`=27336 AND `ConditionValue2`=5 AND `ConditionValue3`=1;
+UPDATE `conditions` SET `ConditionValue3`=0 WHERE `SourceTypeOrReferenceId`=17 AND `SourceGroup`=0 AND `SourceEntry`=48397 AND `SourceId`=0 AND `ElseGroup`=0 AND `ConditionTypeOrReference`=29 AND `ConditionTarget`=0 AND `ConditionValue1`=27315 AND `ConditionValue2`=5 AND `ConditionValue3`=1;
+UPDATE `conditions` SET `ConditionValue3`=0 WHERE `SourceTypeOrReferenceId`=17 AND `SourceGroup`=0 AND `SourceEntry`=48397 AND `SourceId`=0 AND `ElseGroup`=1 AND `ConditionTypeOrReference`=29 AND `ConditionTarget`=0 AND `ConditionValue1`=27336 AND `ConditionValue2`=5 AND `ConditionValue3`=1;
+UPDATE `conditions` SET `ConditionTypeOrReference`=29, `ConditionValue1`=37852, `ConditionValue2`=10 WHERE `SourceTypeOrReferenceId`=17 AND `SourceGroup`=0 AND `SourceEntry`=70586 AND `SourceId`=0 AND `ElseGroup`=0 AND `ConditionTypeOrReference`=18 AND `ConditionTarget`=0 AND `ConditionValue1`=1 AND `ConditionValue2`=37852 AND `ConditionValue3`=0;
+UPDATE `conditions` SET `ConditionValue2`=0 WHERE `SourceTypeOrReferenceId`=1 AND `SourceGroup`=23286 AND `SourceEntry`=32726 AND `SourceId`=0 AND `ElseGroup`=2 AND `ConditionTypeOrReference`=9 AND `ConditionTarget`=0 AND `ConditionValue1`=11081 AND `ConditionValue2`=1 AND `ConditionValue3`=0;
+UPDATE `conditions` SET `ConditionValue2`=0 WHERE `SourceTypeOrReferenceId`=1 AND `SourceGroup`=23324 AND `SourceEntry`=32726 AND `SourceId`=0 AND `ElseGroup`=2 AND `ConditionTypeOrReference`=9 AND `ConditionTarget`=0 AND `ConditionValue1`=11081 AND `ConditionValue2`=1 AND `ConditionValue3`=0;
diff --git a/sql/updates/world/2015_02_14_01_world.sql b/sql/updates/world/2015_02_14_01_world.sql
new file mode 100644
index 00000000000..460f6b1a76f
--- /dev/null
+++ b/sql/updates/world/2015_02_14_01_world.sql
@@ -0,0 +1,163 @@
+--
+DELETE FROM `creature_formations` WHERE `leaderGUID`=57528;
+INSERT INTO `creature_formations` (`leaderGUID`, `memberGUID`, `dist`, `angle`, `groupAI`) VALUES
+(57528, 57528, 0, 0, 2),
+(57528, 57527, 3, 90, 2);
+
+-- Pathing for Thrallmar Grunt Entry: 16580 'TDB FORMAT'
+SET @NPC := 57528;
+SET @PATH := @NPC * 10;
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=132.3433,`position_y`=2762.987,`position_z`=102.3826 WHERE `guid`=@NPC;
+DELETE FROM `creature_addon` WHERE `guid`=@NPC;
+INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (@NPC,@PATH,0,0,1,0, '');
+DELETE FROM `waypoint_data` WHERE `id`=@PATH;
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES
+(@PATH,1,132.3433,2762.987,102.3826,0,0,0,0,100,0),
+(@PATH,2,121.0521,2749.356,98.25848,0,0,0,0,100,0),
+(@PATH,3,109.0274,2741.556,94.49025,0,0,0,0,100,0),
+(@PATH,4,95.7988,2726.423,89.95798,0,0,0,0,100,0),
+(@PATH,5,83.33932,2712.466,86.36182,0,0,0,0,100,0),
+(@PATH,6,75.62203,2702.179,84.19798,0,0,0,0,100,0),
+(@PATH,7,68.19456,2688.539,81.85039,0,0,0,0,100,0),
+(@PATH,8,66.99038,2685.902,81.33047,0,0,0,0,100,0),
+(@PATH,9,82.17162,2678.548,81.62874,0,0,0,0,100,0),
+(@PATH,10,96.37463,2678.292,82.75209,0,0,0,0,100,0),
+(@PATH,11,112.1558,2676.275,83.38298,0,0,0,0,100,0),
+(@PATH,12,119.6769,2675.056,83.7209,0,0,0,0,100,0),
+(@PATH,13,111.278,2648.706,80.93124,0,0,0,0,100,0),
+(@PATH,14,109.0044,2646.347,80.20769,0,0,0,0,100,0),
+(@PATH,15,116.2792,2653.762,81.89182,0,0,0,0,100,0),
+(@PATH,16,122.4159,2660.933,84.18261,0,0,0,0,100,0),
+(@PATH,17,123.3134,2662.276,84.17096,0,0,0,0,100,0),
+(@PATH,18,103.6847,2670.964,83.00417,0,0,0,0,100,0),
+(@PATH,19,80.54628,2673.75,81.59075,0,0,0,0,100,0),
+(@PATH,20,73.74189,2676.277,80.69298,0,0,0,0,100,0),
+(@PATH,21,69.13676,2697.863,83.02922,0,0,0,0,100,0),
+(@PATH,22,75.02055,2712.901,85.39117,0,0,0,0,100,0),
+(@PATH,23,87.82365,2724.378,88.41669,0,0,0,0,100,0),
+(@PATH,24,104.5768,2742.848,93.40324,0,0,0,0,100,0),
+(@PATH,25,117.3608,2752.192,97.77188,0,0,0,0,100,0),
+(@PATH,26,129.486,2763.919,102.3025,0,0,0,0,100,0);
+-- 0x1C09E4424010310000002C00015AED53 .go 132.3433 2762.987 102.3826
+
+DELETE FROM `creature_formations` WHERE `leaderGUID`=57506;
+INSERT INTO `creature_formations` (`leaderGUID`, `memberGUID`, `dist`, `angle`, `groupAI`) VALUES
+(57506, 57506, 0, 0, 2),
+(57506, 57507, 3, 90, 2);
+
+-- Pathing for Thrallmar Grunt Entry: 16580 'TDB FORMAT'
+SET @NPC := 57506;
+SET @PATH := @NPC * 10;
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=160.0679,`position_y`=2783.137,`position_z`=111.3373 WHERE `guid`=@NPC;
+DELETE FROM `creature_addon` WHERE `guid`=@NPC;
+INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (@NPC,@PATH,0,0,1,0, '');
+DELETE FROM `waypoint_data` WHERE `id`=@PATH;
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES
+(@PATH,1,160.0679,2783.137,111.3373,0,0,0,0,100,0),
+(@PATH,2,162.4358,2778.617,110.5461,0,0,0,0,100,0),
+(@PATH,3,172.7094,2774.508,110.6423,0,0,0,0,100,0),
+(@PATH,4,186.6513,2777.03,113.5835,0,0,0,0,100,0),
+(@PATH,5,200.0523,2782.693,116.7996,0,0,0,0,100,0),
+(@PATH,6,209.4241,2784.837,118.5891,0,0,0,0,100,0),
+(@PATH,7,222.8512,2785.429,121.0061,0,0,0,0,100,0),
+(@PATH,8,233.1155,2787.613,123.6816,0,0,0,0,100,0),
+(@PATH,9,237.861,2791.877,125.6136,0,0,0,0,100,0),
+(@PATH,10,239.1323,2799.748,127.3235,0,0,0,0,100,0),
+(@PATH,11,239.1207,2795.199,126.621,0,0,0,0,100,0),
+(@PATH,12,235.6156,2789.706,124.6459,0,0,0,0,100,0),
+(@PATH,13,227.0757,2786.192,122.1876,0,0,0,0,100,0),
+(@PATH,14,212.622,2785.389,119.2345,0,0,0,0,100,0),
+(@PATH,15,205.132,2784.269,117.806,0,0,0,0,100,0),
+(@PATH,16,188.0606,2777.626,114.1675,0,0,0,0,100,0),
+(@PATH,17,175.7908,2774.627,111.4541,0,0,0,0,100,0),
+(@PATH,18,168.39,2775.401,110.4383,0,0,0,0,100,0),
+(@PATH,19,160.1083,2782.976,111.366,0,0,0,0,100,0);
+-- 0x1C09E4424010310000002C00015AED54 .go 160.0679 2783.137 111.3373
+
+DELETE FROM `creature_formations` WHERE `leaderGUID`=57965;
+INSERT INTO `creature_formations` (`leaderGUID`, `memberGUID`, `dist`, `angle`, `groupAI`) VALUES
+(57594, 57594, 0, 0, 2),
+(57594, 57595, 5, 0, 2),
+(57594, 57596, 10, 0, 2),
+(57594, 57597, 15, 0, 2);
+
+-- Pathing for Thrallmar Wolf Rider Entry: 16599 'TDB FORMAT'
+SET @NPC := 57594;
+SET @PATH := @NPC * 10;
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=196.28,`position_y`=2781.241,`position_z`=115.9637 WHERE `guid`=@NPC;
+DELETE FROM `creature_addon` WHERE `guid`=@NPC;
+INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (@NPC,@PATH,14334,0,1,0, '');
+DELETE FROM `waypoint_data` WHERE `id`=@PATH;
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES
+(@PATH,1,196.28,2781.241,115.9637,0,0,1,0,100,0),
+(@PATH,2,173.7009,2773.865,111.0617,0,0,1,0,100,0),
+(@PATH,3,144.2007,2764.989,105.126,0,0,1,0,100,0),
+(@PATH,4,113.7401,2748.569,96.21298,0,0,1,0,100,0),
+(@PATH,5,94.41273,2728.12,89.81252,0,0,1,0,100,0),
+(@PATH,6,65.77112,2693.39,82.38187,0,0,1,0,100,0),
+(@PATH,7,36.76459,2661.932,76.78915,0,0,1,0,100,0),
+(@PATH,8,17.91903,2638.404,72.61198,0,0,1,0,100,0),
+(@PATH,9,5.355525,2605.847,68.47747,0,0,1,0,100,0),
+(@PATH,10,8.97837,2575.031,65.2146,0,0,1,0,100,0),
+(@PATH,11,18.05011,2542.307,61.65181,0,0,1,0,100,0),
+(@PATH,12,20.63871,2501.002,57.12801,0,0,1,0,100,0),
+(@PATH,13,14.14331,2460.918,53.1017,0,0,1,0,100,0),
+(@PATH,14,7.45386,2419.164,52.73537,0,0,1,0,100,0),
+(@PATH,15,-14.25867,2395.82,52.69493,0,0,1,0,100,0),
+(@PATH,16,-31.19849,2384.302,53.77038,0,0,1,0,100,0),
+(@PATH,17,0.05626106,2409.986,52.19868,0,0,1,0,100,0),
+(@PATH,18,13.30882,2456.084,52.34318,0,0,1,0,100,0),
+(@PATH,19,20.00414,2492.995,56.18382,0,0,1,0,100,0),
+(@PATH,20,19.18841,2536.792,60.81985,0,0,1,0,100,0),
+(@PATH,21,11.05238,2567.616,64.15677,0,0,1,0,100,0),
+(@PATH,22,4.750309,2601.44,67.78731,0,0,1,0,100,0),
+(@PATH,23,13.32799,2630.8,71.16357,0,0,1,0,100,0),
+(@PATH,24,32.40791,2656.75,75.65665,0,0,1,0,100,0),
+(@PATH,25,62.52131,2689.98,81.53972,0,0,1,0,100,0),
+(@PATH,26,92.98247,2726.685,89.31989,0,0,1,0,100,0),
+(@PATH,27,109.4178,2744.999,94.76643,0,0,1,0,100,0),
+(@PATH,28,142.0419,2764.24,104.1994,0,0,1,0,100,0),
+(@PATH,29,171.1686,2772.708,110.2985,0,0,1,0,100,0);
+-- 0x1C09E442401035C000002C00005AED54 .go 196.28 2781.241 115.9637
+
+-- Pathing for Thrallmar Peon Entry: 16591 'TDB FORMAT'
+SET @NPC := 57575;
+SET @PATH := @NPC * 10;
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=55.27306,`position_y`=2654.043,`position_z`=78.42071 WHERE `guid`=@NPC;
+DELETE FROM `creature_addon` WHERE `guid`=@NPC;
+INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (@NPC,@PATH,0,0,1,69, '');
+DELETE FROM `waypoint_data` WHERE `id`=@PATH;
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES
+(@PATH,1,55.27306,2654.043,78.42071,0,0,0,0,100,0),
+(@PATH,2,60.95808,2657.462,79.7836,0,0,0,0,100,0),
+(@PATH,3,64.60378,2660.895,80.497,0,0,0,0,100,0),
+(@PATH,4,66.75615,2663.12,80.74207,0,0,0,0,100,0),
+(@PATH,5,65.12799,2682.579,80.74263,0,0,0,0,100,0),
+(@PATH,6,65.82681,2693.285,82.36795,0,0,0,0,100,0),
+(@PATH,7,75.21483,2707.858,84.6664,0,0,0,0,100,0),
+(@PATH,8,84.96182,2718.535,87.05235,0,0,0,0,100,0),
+(@PATH,9,95.03929,2728.742,90.13913,0,0,0,0,100,0),
+(@PATH,10,106.4619,2744.316,94.00992,0,0,0,0,100,0),
+(@PATH,11,123.8118,2755.292,99.37874,0,0,0,0,100,0),
+(@PATH,12,135.8948,2760.833,102.7533,0,0,0,0,100,0),
+(@PATH,13,155.0525,2769.579,107.7352,0,0,0,0,100,0),
+(@PATH,14,158.3794,2773.243,108.8904,0,0,0,0,100,0),
+(@PATH,15,159.9402,2783.268,111.4848,0,0,0,0,100,0),
+(@PATH,16,161.3573,2786.643,112.5604,0,0,0,0,100,0),
+(@PATH,17,165.1619,2790.098,113.5347,0,120000,0,0,100,0),
+(@PATH,18,165.2408,2775.052,109.6661,3,0,0,0,100,0),
+(@PATH,19,161.6743,2781.431,111.1523,0,0,0,0,100,0),
+(@PATH,20,161.0955,2772.586,109.2963,0,0,0,0,100,0),
+(@PATH,21,143.7382,2764.468,104.6033,0,0,0,0,100,0),
+(@PATH,22,122.8,2754.483,99.03847,0,0,0,0,100,0),
+(@PATH,23,109.0177,2745.05,94.75985,0,0,0,0,100,0),
+(@PATH,24,96.74924,2729.785,90.4996,0,0,0,0,100,0),
+(@PATH,25,83.87657,2715.537,86.72665,0,0,0,0,100,0),
+(@PATH,26,75.78943,2705.43,84.61099,0,0,0,0,100,0),
+(@PATH,27,64.73528,2690.525,81.81812,0,0,0,0,100,0),
+(@PATH,28,62.68444,2679.1,80.26672,0,0,0,0,100,0),
+(@PATH,29,62.20171,2674.227,80.11406,0,0,0,0,100,0),
+(@PATH,30,62.53893,2659.067,79.85791,0,0,0,0,100,0),
+(@PATH,31,53.87121,2650.147,77.64667,0,0,0,0,100,0),
+(@PATH,32,52.78874,2648.066,76.98107,0,120000,0,0,100,0);
+-- 0x1C09E442401033C000002C00005AED55 .go 55.27306 2654.043 78.42071
diff --git a/sql/updates/world/2015_02_14_02_world.sql b/sql/updates/world/2015_02_14_02_world.sql
new file mode 100644
index 00000000000..1978c7ff184
--- /dev/null
+++ b/sql/updates/world/2015_02_14_02_world.sql
@@ -0,0 +1,51 @@
+-- Shakes O'Breen SAI
+SET @ENTRY := 2610;
+UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0;
+UPDATE `gameobject_template` SET `AIName`='SmartGameObjectAI', ScriptName='' WHERE `entry`=113531;
+DELETE FROM `smart_scripts` WHERE `entryorguid` = 113531 AND `source_type` = 1;
+
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,0,0,3,19,0,100,0,667,0,0,0,80,@ENTRY*100+00,2,0,0,0,0,1,0,0,0,0,0,0,0,"Shakes O'Breen - On Quest 'Death From Below' Taken - Run Script"),
+(@ENTRY,0,1,0,6,0,100,0,0,0,0,0,6,667,0,0,0,0,0,18,30,0,0,0,0,0,0,"Shakes O'Breen - On Just Died - Fail Quest 'Death From Below'"),
+(@ENTRY,0,2,0,11,0,100,0,0,0,0,0,82,2,0,0,0,0,0,1,0,0,0,0,0,0,0,"Shakes O'Breen - On Respawn - Add Npc Flag Questgiver"),
+(@ENTRY,0,3,4,61,0,100,0,667,0,0,0,83,2,0,0,0,0,0,1,0,0,0,0,0,0,0,"Shakes O'Breen - On Quest 'Death From Below' Taken - Remove Npc Flag Questgiver"),
+(@ENTRY,0,4,0,61,0,100,0,0,0,0,0,8,2,0,0,0,0,0,1,0,0,0,0,0,0,0,"Shakes O'Breen - On Just Created - react agressive"),
+(113531,1,0,0,64,0,100,0,0,0,0,0,51,0,0,0,0,0,0,11,2775,50,0,0,0,0,0,"Shakes O'Breen - On gossip hello - kill");
+
+-- Actionlist SAI
+SET @ENTRY := 261000;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=9;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,9,0,0,0,0,100,0,1000,1000,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,"Shakes O'Breen - On Script - Say Line 0"),
+(@ENTRY,9,1,0,0,0,100,0,0,0,0,0,106,4,0,0,0,0,0,14,210721,113531,0,0,0,0,0,"Shakes O'Breen - On Script - remove flag from gob "),
+(@ENTRY,9,2,0,0,0,100,0,9000,9000,0,0,12,2775,1,60000,0,0,0,8,0,0,0,-2158.637939, -1967.593628, 15.347894, 5.525547,"Shakes O'Breen - On Script - Summon Creature 'Daggerspine Marauder'"),
+(@ENTRY,9,3,0,0,0,100,0,0,0,0,0,12,2775,1,60000,0,0,0,8,0,0,0,-2161.894531, -1968.629517, 15.641345, 5.462712,"Shakes O'Breen - On Script - Summon Creature 'Daggerspine Marauder'"),
+(@ENTRY,9,4,0,0,0,100,0,0,0,0,0,12,2775,1,60000,0,0,0,8,0,0,0,-2158.246582, -1965.681763, 15.063377, 5.600158,"Shakes O'Breen - On Script - Summon Creature 'Daggerspine Marauder'"),
+(@ENTRY,9,5,0,0,0,100,0,0,0,0,0,12,2775,1,60000,0,0,0,8,0,0,0,-2158.358643, -1971.417480, 15.596241, 4.967206,"Shakes O'Breen - On Script - Summon Creature 'Daggerspine Marauder'"),
+(@ENTRY,9,6,0,0,0,100,0,20000,20000,0,0,12,2775,1,60000,0,0,0,8,0,0,0,-2158.637939, -1967.593628, 15.347894, 5.525547,"Shakes O'Breen - On Script - Summon Creature 'Daggerspine Marauder'"),
+(@ENTRY,9,7,0,0,0,100,0,0,0,0,0,12,2775,1,60000,0,0,0,8,0,0,0,-2161.894531, -1968.629517, 15.641345, 5.462712,"Shakes O'Breen - On Script - Summon Creature 'Daggerspine Marauder'"),
+(@ENTRY,9,8,0,0,0,100,0,0,0,0,0,12,2775,1,60000,0,0,0,8,0,0,0,-2158.246582, -1965.681763, 15.063377, 5.600158,"Shakes O'Breen - On Script - Summon Creature 'Daggerspine Marauder'"),
+(@ENTRY,9,9,0,0,0,100,0,3000,3000,0,0,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,"Shakes O'Breen - On Script - Say Line 1"),
+(@ENTRY,9,10,0,0,0,100,0,15000,15000,0,0,12,2775,1,60000,0,0,0,8,0,0,0,-2158.637939, -1967.593628, 15.347894, 5.525547,"Shakes O'Breen - On Script - Summon Creature 'Daggerspine Marauder'"),
+(@ENTRY,9,11,0,0,0,100,0,0,0,0,0,12,2775,1,60000,0,0,0,8,0,0,0,-2161.894531, -1968.629517, 15.641345, 5.462712,"Shakes O'Breen - On Script - Summon Creature 'Daggerspine Marauder'"),
+(@ENTRY,9,12,0,0,0,100,0,0,0,0,0,105,4,0,0,0,0,0,14,210721,113531,0,0,0,0,0,"Shakes O'Breen - On Script - Add Flag to gob "),
+(@ENTRY,9,13,0,0,0,100,0,30000,30000,0,0,15,667,0,0,0,0,0,17,0,100,0,0,0,0,0,"Shakes O'Breen - On Script - Quest Credit 'Death From Below'"),
+(@ENTRY,9,14,0,0,0,100,0,30000,30000,0,0,82,2,0,0,0,0,0,1,0,0,0,0,0,0,0,"Shakes O'Breen - On Script - Add Npc Flag ");
+
+-- Daggerspine Marauder SAI
+SET @ENTRY := 2775;
+UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,0,0,0,63,0,30,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,"Daggerspine Marauder - On Just Created - Say Line 0"),
+(@ENTRY,0,1,0,63,0,100,0,0,0,0,0,69,0,0,0,0,0,0,8,0,0,0,-2086.070068, -2028.859985, 3.220880, 2.670350,"Daggerspine Marauder - On Just Created - go to pos"),
+(@ENTRY,0,2,0,63,0,100,0,0,0,0,0,8,2,0,0,0,0,0,1,0,0,0,0,0,0,0,"Daggerspine Marauder - On Just Created - react agressive"),
+(@ENTRY,0,3,0,10,0,100,0,0,30,3000,3000,49,0,0,0,0,0,0,19,2610,30,0,0,0,0,0,"Daggerspine Marauder - OOCLOS - Attack start");
+
+DELETE FROM `creature_text` WHERE `entry` IN (2775, 2610);
+INSERT INTO `creature_text` (`entry`, `groupid`, `id`, `text`, `type`, `language`, `probability`, `emote`, `duration`, `sound`, `BroadcastTextId`, `TextRange`, `comment`) VALUES
+(2775, 0, 0, 'Nothing will stop us! You will die!', 14, 0, 100, 0, 0, 0, 855, 0, 'Daggerspine Marauder'),
+(2775, 0, 1, 'You''ve plundered our treasures too long. Prepare to meet your watery grave!', 14, 0, 100, 0, 0, 0, 854, 0, 'Daggerspine Marauder'),
+(2610, 0, 0, 'All hands to battle stations! Naga incoming!', 14, 0, 100, 0, 0, 0, 6372, 0, 'Shakes Breen'),
+(2610, 1, 0, 'If we can just hold them now, I am sure we will be in the clear.', 12, 0, 100, 0, 0, 0, 863, 0, 'Shakes Breen');
diff --git a/sql/updates/world/2015_02_14_03_world.sql b/sql/updates/world/2015_02_14_03_world.sql
new file mode 100644
index 00000000000..e4add1c22bf
--- /dev/null
+++ b/sql/updates/world/2015_02_14_03_world.sql
@@ -0,0 +1 @@
+UPDATE `item_template` SET `BuyCount`=5 WHERE `entry`IN(22218,49856,49857,49858,49859,49860,49861,22200,50163);
diff --git a/sql/updates/world/2015_02_14_04_world.sql b/sql/updates/world/2015_02_14_04_world.sql
new file mode 100644
index 00000000000..be552ca6125
--- /dev/null
+++ b/sql/updates/world/2015_02_14_04_world.sql
@@ -0,0 +1,111 @@
+--
+UPDATE `creature_template` SET `vehicleId`=196 WHERE `entry`=30108;
+DELETE FROM `vehicle_template_accessory` WHERE `entry`=30108 AND `accessory_entry` IN (30401);
+INSERT INTO `vehicle_template_accessory` (`entry`,`accessory_entry`,`seat_id`,`minion`,`description`,`summontype`,`summontimer`)VALUES
+(30108,30401,1,1,'Stormcrest Eagle',8,0);
+
+UPDATE `creature_template` SET `ScriptName` = 'npc_stormcrest_eagle' WHERE `entry` = 30108;
+DELETE FROM `gossip_menu_option` WHERE `menu_id`=9891 AND `id`=0;
+INSERT INTO `gossip_menu_option` (`menu_id`, `id`, `option_icon`, `option_text`, `OptionBroadcastTextID`, `option_id`, `npc_option_npcflag`, `action_menu_id`, `action_poi_id`, `box_coded`, `box_money`, `box_text`, `BoxBroadcastTextID`) VALUES
+(9891, 0, 0, 'King Stormheart sent me to be tested as a frostborn would. I am ready for my test, Fjorlin', 32929, 1, 1, 0, 0, 0, 0, '',0);
+DELETE FROM `conditions` WHERE `SourceTypeOrReferenceID`=15 AND `SourceEntry`=0 AND `SourceGroup`=9891;
+INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`ConditionTypeOrReference`,`elseGroup`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`ErrorTextId`,`Comment`) VALUES
+(15,9891,0,9,0,12874,0,0,0,'show gossip on quest 12874 taken');
+
+-- Fjorlin Frostbrow SAI
+SET @ENTRY := 29732;
+UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,0,0,1,62,0,100,0,9891,1,0,0,11,56411,0,0,0,0,0,7,0,0,0,0,0,0,0,"Fjorlin Frostbrow - On Gossip Option 1 Selected - Cast 'Forcecast Summon Scripted Eagle'"),
+(@ENTRY,0,1,0,61,0,100,0,9891,1,0,0,72,0,0,0,0,0,0,7,0,0,0,0,0,0,0,"Fjorlin Frostbrow - On Gossip Option 1 Selected - Close Gossip"),
+(@ENTRY,0,2,3,62,0,100,0,9891,0,0,0,85,55942,2,0,0,0,0,7,0,0,0,0,0,0,0,"Fjorlin Frostbrow - On Gossip Option 0 Selected - Invoker Cast 'Summon Battle Eagle'"),
+(@ENTRY,0,3,0,61,0,100,0,9891,0,0,0,72,0,0,0,0,0,0,7,0,0,0,0,0,0,0,"Fjorlin Frostbrow - On Gossip Option 0 Selected - Close Gossip");
+
+DELETE FROM `npc_spellclick_spells` WHERE `npc_entry`=30108;
+INSERT INTO `npc_spellclick_spells` (`npc_entry`, `spell_id`, `cast_flags`, `user_type`) VALUES
+(30108,46598,1,0);
+
+UPDATE `creature_template` SET `ScriptName`='', `InhabitType`=4 WHERE `entry`=30108;
+
+DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=22 AND `SourceEntry`=30108;
+INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorType`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES
+(22, 1, 30108, 0, 0, 9, 0, 12874, 0, 0, 0, 0, 0, '', 'SAI triggers only if player on quest 12874');
+
+DELETE FROM `creature_text` WHERE `entry`=30401;
+INSERT INTO `creature_text` (`entry`, `groupid`, `id`, `text`, `type`, `language`, `probability`, `emote`, `duration`, `sound`, `comment`,`BroadcastTextId`) VALUES
+(30401, 0, 0, 'King Stormheart is putting you to the test, eh? He must see something in you to begin with or I doubt he''d put you through such a sacred ritual.', 12, 0, 100, 0, 0, 0, 'Velog Icebellow',30942),
+(30401, 1, 0, 'I know you''re new to our kind, so I''ll catch you up a bit while we''re on our way over.', 12, 0, 100, 0, 0, 0, 'Velog Icebellow',30943),
+(30401, 2, 0, 'Years back, my father and several other frostborn were returning from a trek across Dragonblight. There was a heavy blizzard... far worse than we''ve ever seen since.', 12, 0, 100, 0, 0, 0, 'Velog Icebellow',30944),
+(30401, 3, 0, 'They crossed a trail of blood-soaked snow and followed it to find a dwarf wandering and speaking in a dialect they couldn''t make out... and not a dwarf of our kind mind you, but a mountain dwarf - something our kind had never seen before.', 12, 0, 100, 0, 0, 0, 'Velog Icebellow',30945),
+(30401, 4, 0, 'The dwarf seemed lost, having no memory of where he came from, or even of his own name. Not being the kind to leave a dwarven cousin to die in the snow, my father''s party took him in and continued back towards Frosthold.', 12, 0, 100, 0, 0, 0, 'Velog Icebellow',30946),
+(30401, 5, 0, 'Not long later, out of nowhere, the snow burst before them and a jormungar the size of Veranus herself came down upon their party... one of them was swallowed whole before they even had time to react.', 12, 0, 100, 0, 0, 0, 'Velog Icebellow',30947),
+(30401, 6, 0, 'My father thought they were all doomed... but behind him, a furious roar rumbled across the snow, and he turned to see the mountain dwarf growing in size, his skin taking on a stone-like texture, and his hands sizzling with lightning.', 12, 0, 100, 0, 0, 0, 'Velog Icebellow',30948),
+(30401, 7, 0, 'The dwarf barreled forward with a sound like rolling thunder and hurled a shining metal hammer, lightning coursing over its surface, directly into the jormungar''s throat.', 12, 0, 100, 0, 0, 0, 'Velog Icebellow',30949),
+(30401, 8, 0, 'The jormungar collapsed instantly, its head barely still attached to its convulsing body. My father turned to the dwarf in awe and raised a fist in praise...', 12, 0, 100, 0, 0, 0, 'Velog Icebellow',30950),
+(30401, 9, 0, 'The stranger having no name of his own, my father deemed \"Yorg,\" a name reserved for champions of legend. Years later, he now stands before us as Yorg Stormheart, King of the Frostborn.', 12, 0, 100, 0, 0, 0, 'Velog Icebellow',30952),
+(30401, 10, 0, 'King Stormheart has trained us well... turned us into even more fearsome warriors than we could have boasted during the time of our war with the Frost Giants.', 12, 0, 100, 0, 0, 0, 'Velog Icebellow',30953),
+(30401, 11, 0, 'And as one of the fiercest tests put upon a warrior of the frostborn, we are made to face a creature far larger than ourselves--giants, dragons, jormungar--as a testament to the fact that size will never be our weakness.', 12, 0, 100, 0, 0, 0, 'Velog Icebellow',30955),
+(30401, 12, 0, 'This is the test put before you this day. Return to us only once The Iron Watcher is dead, and be revered as a warrior of the frostborn.', 14, 0, 100, 0, 0, 0, 'Velog Icebellow',30956),
+(30401, 13, 0, 'He is slow from the rust of the ages... be quick on your feet and he will not best you. You have King Stormheart''s favor - do not disappoint.', 14, 0, 100, 0, 0, 0, 'Velog Icebellow',31343);
+
+DELETE FROM `creature_template_addon` WHERE `entry`=30108;
+INSERT INTO `creature_template_addon` (`entry`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES
+(30108,0,0,0,1,0,'52211'); -- Flight Aura
+
+DELETE FROM `spell_target_position` WHERE id=55942;
+INSERT INTO `spell_target_position` (`id`,`target_map`,`target_position_x`,`target_position_y`,`target_position_z`,`target_orientation`) VALUES
+(55942, 571, 6610.838379, -280.558685, 984.428772, 3.598404);
+
+-- Stormcrest Eagle SAI
+SET @ENTRY := 30108;
+UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,0,0,0,27,0,100,0,0,0,0,0,53,1,30108,0,0,0,0,1,0,0,0,0,0,0,0,"Stormcrest Eagle - On Passenger Boarded - Start Waypoint"),
+(@ENTRY,0,1,0,40,0,100,0,1,30108,0,0,1,0,0,0,0,0,0,19,30401,10,0,0,0,0,0,"Stormcrest Eagle - On Waypoint 1 Reached - Say Line 0"),
+(@ENTRY,0,2,0,40,0,100,0,2,30108,0,0,1,1,0,0,0,0,0,19,30401,10,0,0,0,0,0,"Stormcrest Eagle - On Waypoint 2 Reached - Say Line 1"),
+(@ENTRY,0,3,0,40,0,100,0,4,30108,0,0,1,2,0,0,0,0,0,19,30401,10,0,0,0,0,0,"Stormcrest Eagle - On Waypoint 4 Reached - Say Line 2"),
+(@ENTRY,0,4,0,40,0,100,0,6,30108,0,0,1,3,0,0,0,0,0,19,30401,10,0,0,0,0,0,"Stormcrest Eagle - On Waypoint 6 Reached - Say Line 3"),
+(@ENTRY,0,5,0,40,0,100,0,8,30108,0,0,1,4,0,0,0,0,0,19,30401,10,0,0,0,0,0,"Stormcrest Eagle - On Waypoint 8 Reached - Say Line 4"),
+(@ENTRY,0,6,0,40,0,100,0,10,30108,0,0,1,5,0,0,0,0,0,19,30401,10,0,0,0,0,0,"Stormcrest Eagle - On Waypoint 10 Reached - Say Line 5"),
+(@ENTRY,0,7,0,40,0,100,0,12,30108,0,0,1,6,0,0,0,0,0,19,30401,10,0,0,0,0,0,"Stormcrest Eagle - On Waypoint 12 Reached - Say Line 6"),
+(@ENTRY,0,8,0,40,0,100,0,14,30108,0,0,1,7,0,0,0,0,0,19,30401,10,0,0,0,0,0,"Stormcrest Eagle - On Waypoint 14 Reached - Say Line 7"),
+(@ENTRY,0,9,0,40,0,100,0,16,30108,0,0,1,8,0,0,0,0,0,19,30401,10,0,0,0,0,0,"Stormcrest Eagle - On Waypoint 16 Reached - Say Line 8"),
+(@ENTRY,0,10,0,40,0,100,0,18,30108,0,0,1,9,0,0,0,0,0,19,30401,10,0,0,0,0,0,"Stormcrest Eagle - On Waypoint 18 Reached - Say Line 9"),
+(@ENTRY,0,12,0,40,0,100,0,22,30108,0,0,1,10,0,0,0,0,0,19,30401,10,0,0,0,0,0,"Stormcrest Eagle - On Waypoint 22 Reached - Say Line 10"),
+(@ENTRY,0,13,0,40,0,100,0,24,30108,0,0,1,11,0,0,0,0,0,19,30401,10,0,0,0,0,0,"Stormcrest Eagle - On Waypoint 24 Reached - Say Line 11"),
+(@ENTRY,0,14,0,40,0,100,0,25,30108,0,0,1,12,0,0,0,0,0,19,30401,10,0,0,0,0,0,"Stormcrest Eagle - On Waypoint 25 Reached - Say Line 12"),
+(@ENTRY,0,15,0,40,0,100,0,26,30108,0,0,1,13,0,0,0,0,0,19,30401,10,0,0,0,0,0,"Stormcrest Eagle - On Waypoint 26 Reached - Say Line 13"),
+(@ENTRY,0,16,0,40,0,100,0,28,30108,0,0,41,0,0,0,0,0,0,1,0,0,0,0,0,0,0,"Stormcrest Eagle - On Waypoint 28 Reached - Despawn Instant");
+
+DELETE FROM `waypoints` WHERE `entry`=30108;
+INSERT INTO `waypoints` (`entry`, `pointid`, `position_x`, `position_y`, `position_z`, `point_comment`) VALUES
+(30108, 1, 6586.2, -294.997, 989.82, 'Eagle'),
+(30108, 2, 6519.83, -384.722, 994.117, 'Eagle'),
+(30108, 3, 6519.97, -524.613, 986.315, 'Eagle'),
+(30108, 4, 6582.99, -676.868, 973.055, 'Eagle'),
+(30108, 5, 6687.48, -733.39, 964.698, 'Eagle'),
+(30108, 6, 6855.16, -744.853, 961.192, 'Eagle'),
+(30108, 7, 6994.31, -760.115, 959.543, 'Eagle'),
+(30108, 8, 7119.54, -785.058, 970.552, 'Eagle'),
+(30108, 9, 7245.46, -832.456, 982.112, 'Eagle'),
+(30108, 10, 7372.43, -884.75, 992.92, 'Eagle'),
+(30108, 11, 7451.38, -912.608, 999.791, 'Eagle'),
+(30108, 12, 7550.54, -946.482, 1008.39, 'Eagle'),
+(30108, 13, 7627.06, -969.296, 1025.31, 'Eagle'),
+(30108, 14, 7701.49, -991.429, 1041.78, 'Eagle'),
+(30108, 15, 7767.2, -1011.33, 1056.82, 'Eagle'),
+(30108, 16, 7837.09, -1032.49, 1072.82, 'Eagle'),
+(30108, 17, 7898.99, -1053.29, 1090.37, 'Eagle'),
+(30108, 18, 7944.64, -1070.18, 1112.88, 'Eagle'),
+(30108, 19, 7995.38, -1111.07, 1138.38, 'Eagle'),
+(30108, 20, 8075.38, -1184.51, 1180.87, 'Eagle'),
+(30108, 21, 8133, -1259.6, 1214.29, 'Eagle'),
+(30108, 22, 8221.79, -1381.51, 1271, 'Eagle'),
+(30108, 23, 8300.22, -1485.87, 1321.57, 'Eagle'),
+(30108, 24, 8367.07, -1592.58, 1382.36, 'Eagle'),
+(30108, 25, 8414.48, -1701.68, 1449.03, 'Eagle'),
+(30108, 26, 8456.78, -1783.6, 1462.78, 'Eagle'),
+(30108, 27, 8482.2, -1838.47, 1470, 'Eagle'),
+(30108, 28, 8526.7, -1956.21, 1473.59, 'Eagle');
diff --git a/sql/updates/world/2015_02_14_05_world.sql b/sql/updates/world/2015_02_14_05_world.sql
new file mode 100644
index 00000000000..bb81873bf4b
--- /dev/null
+++ b/sql/updates/world/2015_02_14_05_world.sql
@@ -0,0 +1,51 @@
+SET @Guid := 29727;
+
+UPDATE `creature_template` SET `ainame`='SmartAI', `scriptname`='' WHERE `entry`=4781;
+UPDATE `gameobject_template` SET `AIName`= 'SmartGameObjectAI' WHERE`entry` =20920;
+DELETE FROM `smart_scripts` WHERE `entryorguid` =20920 AND `source_type`=1;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=4781 AND `source_type`=0;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=478100 AND `source_type`=9;
+
+INSERT INTO `smart_scripts` (`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`, `comment`) VALUES
+(4781,0,0,1,54,0,100,0,0,0,0,0,1,0,0,0,0,0,0,23,0,0,0,0,0,0,0,'Snufflenose Gopher - On Just Summoned - Say Line 0'),
+(4781,0,1,0,61,0,100,0,0,0,0,0,29,1,0,0,0,0,0,23,0,0,0,0,0,0,0,'Snufflenose Gopher - On Just Summoned - Follow Summoner'),
+(4781,0,2,3,38,0,100,0,1,1,10000,10000,29,0,0,0,0,0,0,1,0,0,0,0,0,0,0,'Snufflenose Gopher - On Data Set - Stop Following Invoker'),
+(4781,0,3,4,61,0,100,0,0,0,0,0,69,0,0,0,0,0,0,20,20920,0,0,0,0,0,0,'Snufflenose Gopher - On Data Set - Move to Blueleaf Tuber'),
+(4781,0,4,5,61,0,100,0,0,0,0,0,80,478100,2,0,0,0,0,1,0,0,0,0,0,0,0,'Snufflenose Gopher - On Data Set - Run Script'),
+(4781,0,5,6,61,0,100,0,0,0,0,0,1,1,0,0,0,0,0,23,0,0,0,0,0,0,0,'Snufflenose Gopher - On Data Set - Say Line 1'),
+(4781,0,6,0,61,0,100,0,0,0,0,0,8,0,0,0,0,0,0,23,0,0,0,0,0,0,0,'Snufflenose Gopher - On Data Set - Set Passive'),
+(4781,0,7,0,8,0,100,0,8283,0,10000,10000,45,1,1,0,0,0,0,20,20920,40,0,0,0,0,0,'Snufflenose Gopher - On Spellhit (Snufflenose Command) - Set Data Blueleaf Tuber'),
+(478100,9,0,0,0,0,100,0,5000,5000,0,0,1,2,0,0,0,0,0,23,0,0,0,0,0,0,0,'Snufflenose Gopher - Script - Say Line 2'),
+(478100,9,1,0,0,0,100,0,0,0,0,0,104,0,0,0,0,0,0,20,20920,10,0,0,0,0,0,'Snufflenose Gopher - Script - Set Flags on Blueleaf Tuber'),
+(478100,9,2,0,0,0,100,0,0,0,0,0,70,300,0,0,0,0,0,20,20920,10,0,0,0,0,0,'Snufflenose Gopher - Script - Respawn Blueleaf Tuber'),
+(478100,9,3,0,0,0,100,0,5000,5000,0,0,29,1,0,0,0,0,0,23,0,0,0,0,0,0,0,'Snufflenose Gopher - Script - Follow Summoner'),
+(478100,9,4,0,0,0,100,0,0,0,0,0,8,2,0,0,0,0,0,1,0,0,0,0,0,0,0,'Snufflenose Gopher - Script - Set Hostile'),
+
+(20920,1,0,0,11,0,100,0,0,0,0,0,22,1,0,0,0,0,0,1,0,0,0,0,0,0,0,'Blueleaf Tuber - On Spawn - Set Phase 1'),
+(20920,1,1,2,38,1,100,0,1,1,0,0,45,1,1,0,0,0,0,19,4781,0,0,0,0,0,0,'Blueleaf Tuber - On Data Set (Phase 1) - Set Data Snufflenose Gopher'),
+(20920,1,2,0,61,0,100,0,0,0,0,0,22,2,0,0,0,0,0,1,0,0,0,0,0,0,0,'Blueleaf Tuber - On Data Set (Phase 1) - Set Phase 2'),
+(20920,1,3,0,1,0,100,0,300000,300000,300000,300000,22,1,0,0,0,0,0,1,0,0,0,0,0,0,0,'Blueleaf Tuber - OOC (Phase 2) - Set Phase 1');
+
+DELETE FROM `creature_text` WHERE `entry`=4781;
+INSERT INTO `creature_text` (`entry`, `groupid`, `id`, `text`, `type`, `language`, `probability`, `emote`, `duration`, `sound`, `BroadcastTextId`, `TextRange`, `comment`) VALUES
+(4781, 0, 0, '%s nervously crawls from the crate.', 16, 0, 100, 0, 0, 0, 1638, 0, 'Snufflenose Gopher'),
+(4781, 1, 0, '%s wiggles his whiskers at $n.', 16, 0, 100, 0, 0, 0, 1591, 0, 'Snufflenose Gopher'),
+(4781, 2, 0, '%s sniffs at the ground...', 16, 0, 100, 0, 0, 0, 1592, 0, 'Snufflenose Gopher');
+
+DELETE FROM `gameobject` WHERE `id`=20919;
+INSERT INTO `gameobject` (`guid`, `id`, `map`, `zoneId`, `areaId`, `spawnMask`, `phaseMask`, `position_x`, `position_y`, `position_z`, `orientation`, `rotation0`, `rotation1`, `rotation2`, `rotation3`, `spawntimesecs`, `animprogress`, `state`, `VerifiedBuild`) VALUES
+(@Guid+0, 20919, 47, 0, 0, 1, 1, 2082.74, 1671.82, 61.2396, 3.66079, 0, 0, 0.966493, -0.256693, -43200, 100, 1, 0),
+(@Guid+1, 20919, 47, 0, 0, 1, 1, 2159.43, 1687.49, 57.5433, 3.66079, 0, 0, 0.966493, -0.256693, -43200, 100, 1, 0),
+(@Guid+2, 20919, 47, 0, 0, 1, 1, 2080.89, 1703.36, 56.6447, 0.553757, 0, 0, 0.273354, 0.961913, -43200, 100, 1, 0),
+(@Guid+3, 20919, 47, 0, 0, 1, 1, 2055.28, 1767.7, 58.4559, 2.98378, 0, 0, 0.996889, 0.0788245, -43200, 100, 1, 0),
+(@Guid+4, 20919, 47, 0, 0, 1, 1, 2196.64, 1827.96, 61.4706, 2.11277, 0, 0, 0.870583, 0.492022, -43200, 100, 1, 0),
+(@Guid+5, 20919, 47, 0, 0, 1, 1, 2030.32, 1867.61, 56.2866, 5.6777, 0, 0, 0.298139, -0.954522, -43200, 100, 1, 0),
+(@Guid+6, 20919, 47, 0, 0, 1, 1, 2091.33, 1861.73, 51.0341, 1.25355, 0, 0, 0.586536, 0.809923, -43200, 100, 1, 0),
+(@Guid+7, 20919, 47, 0, 0, 1, 1, 2200.15, 1897.64, 71.3191, 2.6492, 0, 0, 0.969846, 0.243717, -43200, 100, 1, 0),
+(@Guid+8, 20919, 47, 0, 0, 1, 1, 2075.75, 1742.04, 76.7184, 1.33994, 0, 0, 0.620962, 0.78384, -43200, 100, 1, 0),
+(@Guid+9, 20919, 47, 0, 0, 1, 1, 2126, 1661.15, 82.4824, 0.0220437, 0, 0, 0.0110216, 0.999939, -43200, 100, 1, 0),
+(@Guid+10, 20919, 47, 0, 0, 1, 1, 2207.92, 1596.91, 80.7375, 3.60582, 0, 0, 0.973182, -0.230035, -43200, 100, 1, 0),
+(@Guid+11, 20919, 47, 0, 0, 1, 1, 2156.98, 1542.26, 72.849, 2.43086, 0, 0, 0.937519, 0.347934, -43200, 100, 1, 0),
+(@Guid+12, 20919, 47, 0, 0, 1, 1, 2179.95, 1514.06, 69.0709, 0.778385, 0, 0, 0.379441, 0.925216, -43200, 100, 1, 0),
+(@Guid+13, 20919, 47, 0, 0, 1, 1, 2000.85, 1533.93, 80.3971, 4.919, 0, 0, 0.630419, -0.776255, -43200, 100, 1, 0),
+(@Guid+14, 20919, 47, 0, 0, 1, 1, 1991.49, 1608.53, 81.1601, 1.1004, 0, 0, 0.522858, 0.85242, -43200, 100, 1, 0);
diff --git a/sql/updates/world/2015_02_15_00_world.sql b/sql/updates/world/2015_02_15_00_world.sql
new file mode 100644
index 00000000000..ba302a01484
--- /dev/null
+++ b/sql/updates/world/2015_02_15_00_world.sql
@@ -0,0 +1,456 @@
+-- Fix up formation from last commit
+-- https://github.com/TrinityCore/TrinityCore/commit/bbcf8f58e69d361c3df1c37fa79d1efa3e52bc54
+DELETE FROM `creature_formations` WHERE `leaderGUID`=57594;
+INSERT INTO `creature_formations` (`leaderGUID`, `memberGUID`, `dist`, `angle`, `groupAI`) VALUES
+(57594, 57594, 0, 0, 2),
+(57594, 57595, 5, 0, 2),
+(57594, 57596, 10, 0, 2),
+(57594, 57597, 15, 0, 2);
+
+DELETE FROM `creature_formations` WHERE `leaderGUID`=57965;
+INSERT INTO `creature_formations` (`leaderGUID`, `memberGUID`, `dist`, `angle`, `groupAI`) VALUES
+(57965, 57965, 0, 0, 2),
+(57965, 57966, 5, 0, 2),
+(57965, 57967, 10, 0, 2),
+(57965, 57968, 15, 0, 2);
+
+-- Pathing for Bonechewer Raider Entry: 16925 'TDB FORMAT'
+SET @NPC := 58706;
+SET @PATH := @NPC * 10;
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=-372.7111,`position_y`=2839.348,`position_z`=3.085857 WHERE `guid`=@NPC;
+DELETE FROM `creature_addon` WHERE `guid`=@NPC;
+INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (@NPC,@PATH,17408,0,1,0, '');
+DELETE FROM `waypoint_data` WHERE `id`=@PATH;
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES
+(@PATH,1,-372.7111,2839.348,3.085857,0,0,0,0,100,0),
+(@PATH,2,-369.1973,2833.291,3.833567,0,0,0,0,100,0),
+(@PATH,3,-366.1855,2828.1,4.404455,0,0,0,0,100,0),
+(@PATH,4,-364.1777,2824.639,5.029455,0,0,0,0,100,0),
+(@PATH,5,-363.1738,2822.908,5.654455,0,0,0,0,100,0),
+(@PATH,6,-361.668,2820.313,6.279455,0,0,0,0,100,0),
+(@PATH,7,-360.6641,2818.582,7.029455,0,0,0,0,100,0),
+(@PATH,8,-357.6523,2813.391,7.904455,0,0,0,0,100,0),
+(@PATH,9,-354.6406,2808.199,8.654455,0,0,0,0,100,0),
+(@PATH,10,-352.1309,2803.873,9.279455,0,0,0,0,100,0);
+-- 0x1C09E4424010874000002C0000212A8F .go -372.7111 2839.348 3.085857
+
+-- Pathing for Bonechewer Raider Entry: 16925 'TDB FORMAT'
+SET @NPC := 58710;
+SET @PATH := @NPC * 10;
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=-173.5004,`position_y`=2340.303,`position_z`=60.07005 WHERE `guid`=@NPC;
+DELETE FROM `creature_addon` WHERE `guid`=@NPC;
+INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (@NPC,@PATH,17408,0,1,0, '');
+DELETE FROM `waypoint_data` WHERE `id`=@PATH;
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES
+(@PATH,1,-173.5004,2340.303,60.07005,0,0,0,0,100,0),
+(@PATH,2,-167.5776,2345.781,59.66853,0,0,0,0,100,0),
+(@PATH,3,-168.3658,2358.138,57.73066,0,0,0,0,100,0),
+(@PATH,4,-170.6648,2371.729,55.37167,0,0,0,0,100,0),
+(@PATH,5,-176.5131,2386.787,51.77451,0,0,0,0,100,0),
+(@PATH,6,-179.7427,2391.649,50.90343,0,0,0,0,100,0),
+(@PATH,7,-179.451,2411.232,48.48401,0,0,0,0,100,0),
+(@PATH,8,-181.9889,2397.549,50.08649,0,0,0,0,100,0),
+(@PATH,9,-179.687,2391.666,50.90021,0,0,0,0,100,0),
+(@PATH,10,-172.3989,2376.937,54.03761,0,0,0,0,100,0),
+(@PATH,11,-168.9601,2362.579,56.66465,0,0,0,0,100,0),
+(@PATH,12,-167.4705,2349.302,59.07915,0,0,0,0,100,0);
+-- 0x1C09E4424010874000002C000021381E .go -173.5004 2340.303 60.07005
+
+-- Pathing for Bonechewer Raider Entry: 16925 'TDB FORMAT'
+SET @NPC := 58709;
+SET @PATH := @NPC * 10;
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=-280.5386,`position_y`=2385.487,`position_z`=49.5167 WHERE `guid`=@NPC;
+DELETE FROM `creature_addon` WHERE `guid`=@NPC;
+INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (@NPC,@PATH,17408,0,1,0, '');
+DELETE FROM `waypoint_data` WHERE `id`=@PATH;
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES
+(@PATH,1,-280.5386,2385.487,49.5167,0,0,0,0,100,0),
+(@PATH,2,-274.4911,2399.897,49.77866,0,0,0,0,100,0),
+(@PATH,3,-282.391,2415.943,47.12805,0,0,0,0,100,0),
+(@PATH,4,-292.0588,2418.96,45.69984,0,0,0,0,100,0),
+(@PATH,5,-296.9233,2425.813,44.45638,0,0,0,0,100,0),
+(@PATH,6,-288.1144,2443.262,43.60903,0,0,0,0,100,0),
+(@PATH,7,-293.5082,2451.608,42.39658,0,0,0,0,100,0),
+(@PATH,8,-297.1542,2466.072,41.27671,0,0,0,0,100,0),
+(@PATH,9,-296.9443,2470.941,40.92609,0,0,0,0,100,0),
+(@PATH,10,-284.6176,2477.495,40.50471,0,0,0,0,100,0),
+(@PATH,11,-290.6595,2483.031,40.95429,0,0,0,0,100,0),
+(@PATH,12,-284.6285,2477.351,40.70044,0,0,0,0,100,0),
+(@PATH,13,-297.5089,2457.768,41.62237,0,0,0,0,100,0),
+(@PATH,14,-289.9194,2446.963,43.04158,0,0,0,0,100,0),
+(@PATH,15,-287.7819,2443.668,43.38817,0,0,0,0,100,0),
+(@PATH,16,-296.9543,2424.329,44.54842,0,0,0,0,100,0),
+(@PATH,17,-284.9567,2418.073,46.32718,0,0,0,0,100,0),
+(@PATH,18,-276.5181,2404.314,49.4864,0,0,0,0,100,0),
+(@PATH,19,-280.4977,2385.4,49.48282,0,0,0,0,100,0);
+-- 0x1C09E4424010874000002C0000213910 .go -280.5386 2385.487 49.5167
+
+-- Pathing for Bonechewer Raider Entry: 16925 'TDB FORMAT'
+SET @NPC := 58708;
+SET @PATH := @NPC * 10;
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=-314.1599,`position_y`=2611.343,`position_z`=41.12054 WHERE `guid`=@NPC;
+DELETE FROM `creature_addon` WHERE `guid`=@NPC;
+INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (@NPC,@PATH,17408,0,1,0, '');
+DELETE FROM `waypoint_data` WHERE `id`=@PATH;
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES
+(@PATH,1,-314.1599,2611.343,41.12054,0,0,0,0,100,0),
+(@PATH,2,-302.6028,2572.273,41.00031,0,0,0,0,100,0),
+(@PATH,3,-297.84,2550.173,41.36596,0,0,0,0,100,0),
+(@PATH,4,-303.8246,2525.236,42.58739,0,0,0,0,100,0),
+(@PATH,5,-297.9362,2545.895,41.70477,0,0,0,0,100,0),
+(@PATH,6,-300.882,2566.604,41.32217,0,0,0,0,100,0),
+(@PATH,7,-306.6208,2578.347,41.52526,0,0,0,0,100,0),
+(@PATH,8,-312.7142,2588.381,41.36144,0,0,0,0,100,0);
+-- 0x1C09E4424010874000002C00002139B5 .go -314.1599 2611.343 41.12054
+
+-- Add missing Bonechewer Raider
+DELETE FROM `creature` WHERE `guid`=29980;
+INSERT INTO `creature` (`guid`, `id`, `map`, `equipment_id`, `position_x`, `position_y`, `position_z`, `orientation`, `spawntimesecs`, `curhealth`, `MovementType`) VALUES
+(29980, 16925, 530, 1, -354.3998, 2663.006, 41.72623, 0, 300, 3989, 2);
+
+-- Pathing for Bonechewer Raider Entry: 16925 'TDB FORMAT'
+SET @NPC := 29980;
+SET @PATH := @NPC * 10;
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=-354.3998,`position_y`=2663.006,`position_z`=41.72623 WHERE `guid`=@NPC;
+DELETE FROM `creature_addon` WHERE `guid`=@NPC;
+INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (@NPC,@PATH,17408,0,1,0, '');
+DELETE FROM `waypoint_data` WHERE `id`=@PATH;
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES
+(@PATH,1,-354.3998,2663.006,41.72623,0,0,0,0,100,0),
+(@PATH,2,-346.7007,2672.114,38.15508,0,0,0,0,100,0),
+(@PATH,3,-332.8381,2681.229,34.02082,0,0,0,0,100,0),
+(@PATH,4,-319.6889,2687.015,31.10067,0,0,0,0,100,0),
+(@PATH,5,-318.0042,2694.25,29.72155,0,0,0,0,100,0),
+(@PATH,6,-324.0378,2716.413,25.33266,0,0,0,0,100,0),
+(@PATH,7,-319.7849,2729.284,23.22117,0,0,0,0,100,0),
+(@PATH,8,-322.0183,2746.254,18.96142,0,0,0,0,100,0),
+(@PATH,9,-322.4724,2747.062,18.86184,0,0,0,0,100,0),
+(@PATH,10,-322.3822,2746.857,18.3417,0,0,0,0,100,0),
+(@PATH,11,-319.7568,2733.282,22.47406,0,0,0,0,100,0),
+(@PATH,12,-323.8112,2718.555,24.77036,0,0,0,0,100,0),
+(@PATH,13,-317.9898,2696.302,28.92368,0,0,0,0,100,0),
+(@PATH,14,-318.5087,2690.603,30.36932,0,0,0,0,100,0),
+(@PATH,15,-329.6577,2682.807,32.7053,0,0,0,0,100,0),
+(@PATH,16,-344.2849,2674.339,36.96185,0,0,0,0,100,0);
+-- 0x1C09E4424010874000002C0000213896 .go -354.3998 2663.006 41.72623
+
+-- Only one Tagar Spinebreaker should be spawned
+DELETE FROM `creature` WHERE `guid`=85990;
+
+-- Pathing for Tagar Spinebreaker Entry: 19443 'TDB FORMAT'
+SET @NPC := 85987;
+SET @PATH := @NPC * 10;
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=-179.7917,`position_y`=2839.993,`position_z`=23.64687 WHERE `guid`=@NPC;
+DELETE FROM `creature_addon` WHERE `guid`=@NPC;
+INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (@NPC,@PATH,0,0,1,0, '');
+DELETE FROM `waypoint_data` WHERE `id`=@PATH;
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES
+(@PATH,1,-179.7917,2839.993,23.64687,0,0,0,0,100,0),
+(@PATH,2,-168.0662,2837.727,26.36559,0,0,0,0,100,0),
+(@PATH,3,-149.3422,2826.91,33.67762,0,0,0,0,100,0),
+(@PATH,4,-149.3403,2813.561,35.25396,0,0,0,0,100,0),
+(@PATH,5,-160.4427,2807.621,32.6923,0,0,0,0,100,0),
+(@PATH,6,-172.6706,2803.528,29.62396,0,0,0,0,100,0),
+(@PATH,7,-185.5681,2808.792,25.53679,0,0,0,0,100,0),
+(@PATH,8,-186.3388,2797.655,26.33011,0,0,0,0,100,0),
+(@PATH,9,-153.882,2788.701,36.85746,0,0,0,0,100,0),
+(@PATH,10,-134.5498,2778.104,41.05849,0,0,0,0,100,0),
+(@PATH,11,-120.4556,2753.937,49.37396,0,0,0,0,100,0),
+(@PATH,12,-110.122,2737.952,52.16914,0,0,0,0,100,0),
+(@PATH,13,-108.798,2709.016,51.00445,0,0,0,0,100,0),
+(@PATH,14,-125.7525,2695.987,46.92542,0,0,0,0,100,0),
+(@PATH,15,-165.7749,2686.863,43.39313,0,0,0,0,100,0),
+(@PATH,16,-166.924,2686.502,43.27299,0,0,0,0,100,0),
+(@PATH,17,-170.6192,2661.56,42.24799,0,0,0,0,100,0),
+(@PATH,18,-166.9141,2633.801,41.55241,0,0,0,0,100,0),
+(@PATH,19,-165.2749,2618.521,40.12231,0,0,0,0,100,0),
+(@PATH,20,-164.5241,2612.235,40.08208,0,0,0,0,100,0),
+(@PATH,21,-162.7764,2603.097,40.06981,0,0,0,0,100,0),
+(@PATH,22,-165.0483,2590.722,39.90811,0,0,0,0,100,0),
+(@PATH,23,-144.7979,2569.513,41.10892,0,0,0,0,100,0),
+(@PATH,24,-146.1405,2544.73,40.98074,0,0,0,0,100,0),
+(@PATH,25,-156.8518,2539.49,42.95174,0,0,0,0,100,0),
+(@PATH,26,-170.4912,2527.817,41.62189,0,0,0,0,100,0),
+(@PATH,27,-177.3363,2516.895,41.11181,0,0,0,0,100,0),
+(@PATH,28,-176.3846,2510.593,41.94983,0,0,0,0,100,0),
+(@PATH,29,-168.8438,2501.025,43.79488,0,0,0,0,100,0),
+(@PATH,30,-145.8467,2499.76,45.61186,0,0,0,0,100,0),
+(@PATH,31,-131.4405,2495.996,46.55548,0,0,0,0,100,0),
+(@PATH,32,-124.8685,2492.812,46.93701,0,0,0,0,100,0),
+(@PATH,33,-118.3926,2470.393,46.95731,0,0,0,0,100,0),
+(@PATH,34,-134.5914,2450.625,46.18983,0,0,0,0,100,0),
+(@PATH,35,-139.636,2439.596,48.65514,0,0,0,0,100,0),
+(@PATH,36,-153.0726,2420.765,44.33873,0,0,0,0,100,0),
+(@PATH,37,-164.3153,2415.917,48.36614,0,0,0,0,100,0),
+(@PATH,38,-176.0278,2408.138,48.95763,0,0,0,0,100,0),
+(@PATH,39,-181.3092,2397.231,50.16575,0,0,0,0,100,0),
+(@PATH,40,-174.2651,2386.537,51.88837,0,0,0,0,100,0),
+(@PATH,41,-171.3092,2382.064,53.20797,0,0,0,0,100,0),
+(@PATH,42,-168.7256,2366.751,56.15277,0,0,0,0,100,0),
+(@PATH,43,-168.0793,2352.929,58.49963,0,0,0,0,100,0),
+(@PATH,44,-168.3409,2341.554,60.14597,0,0,0,0,100,0),
+(@PATH,45,-175.721,2327.79,62.15151,0,0,0,0,100,0),
+(@PATH,46,-193.0925,2317.189,56.10988,0,0,0,0,100,0),
+(@PATH,47,-211.1901,2312.889,49.67965,0,0,0,0,100,0),
+(@PATH,48,-243.0014,2311.802,51.36759,0,0,0,0,100,0),
+(@PATH,49,-257.705,2324.297,56.98617,0,0,0,0,100,0),
+(@PATH,50,-267.8463,2334.503,54.92202,0,0,0,0,100,0),
+(@PATH,51,-284.0244,2347.267,51.85397,0,0,0,0,100,0),
+(@PATH,52,-285.5917,2348.854,51.30281,0,0,0,0,100,0),
+(@PATH,53,-277.6388,2384.371,49.04704,0,0,0,0,100,0),
+(@PATH,54,-277.4207,2389,49.55646,0,0,0,0,100,0),
+(@PATH,55,-282.4726,2415.647,47.11025,0,0,0,0,100,0),
+(@PATH,56,-290.6383,2417.861,45.76169,0,0,0,0,100,0),
+(@PATH,57,-296.9912,2425.083,44.68782,0,0,0,0,100,0),
+(@PATH,58,-297.4091,2429.13,44.28957,0,0,0,0,100,0),
+(@PATH,59,-292.8183,2446.393,42.99865,0,0,0,0,100,0),
+(@PATH,60,-297.4739,2458.016,41.8229,0,0,0,0,100,0),
+(@PATH,61,-299.0847,2461.294,41.30234,0,0,0,0,100,0),
+(@PATH,62,-291.5309,2472.148,40.82636,0,0,0,0,100,0),
+(@PATH,63,-315.7325,2479.059,38.88892,0,0,0,0,100,0),
+(@PATH,64,-333.1553,2479.061,30.43475,0,0,0,0,100,0),
+(@PATH,65,-362.027,2481.302,26.76814,0,0,0,0,100,0),
+(@PATH,66,-381.832,2489.02,35.44767,0,0,0,0,100,0),
+(@PATH,67,-383.683,2499.09,43.07095,0,0,0,0,100,0),
+(@PATH,68,-373.0249,2518.307,44.52934,0,0,0,0,100,0),
+(@PATH,69,-356.4537,2524.72,43.92796,0,0,0,0,100,0),
+(@PATH,70,-341.8646,2517.716,42.69872,0,0,0,0,100,0),
+(@PATH,71,-325.4874,2514.352,39.74596,0,0,0,0,100,0),
+(@PATH,72,-317.6911,2517.743,42.27646,0,0,0,0,100,0),
+(@PATH,73,-307.9288,2522.574,42.47154,0,0,0,0,100,0),
+(@PATH,74,-303.3547,2545.351,42.88755,0,0,0,0,100,0),
+(@PATH,75,-313.6268,2562.334,44.01721,0,0,0,0,100,0),
+(@PATH,76,-319.8146,2564.861,44.6563,0,0,0,0,100,0),
+(@PATH,77,-315.3898,2592.442,41.60535,0,0,0,0,100,0),
+(@PATH,78,-315.032,2593.062,41.37146,0,0,0,0,100,0),
+(@PATH,79,-333.1518,2616.684,42.40425,0,0,0,0,100,0),
+(@PATH,80,-352.777,2633.742,40.45049,0,0,0,0,100,0),
+(@PATH,81,-360.1994,2656.165,43.72129,0,0,0,0,100,0),
+(@PATH,82,-344.7037,2680.905,36.1579,0,0,0,0,100,0),
+(@PATH,83,-334.6349,2700.036,30.34241,0,0,0,0,100,0),
+(@PATH,84,-324.9058,2712.125,26.43651,0,0,0,0,100,0),
+(@PATH,85,-322.9779,2724.364,23.96236,0,0,0,0,100,0),
+(@PATH,86,-326.3518,2734.545,22.44383,0,0,0,0,100,0),
+(@PATH,87,-342.5912,2742.288,22.4451,0,0,0,0,100,0),
+(@PATH,88,-368.7488,2739.919,27.63747,0,0,0,0,100,0),
+(@PATH,89,-392.2097,2734.005,34.55191,0,0,0,0,100,0),
+(@PATH,90,-414.4307,2741.14,39.55831,0,0,0,0,100,0),
+(@PATH,91,-436.1942,2742.233,45.3562,0,0,0,0,100,0),
+(@PATH,92,-462.9823,2756.808,49.85812,0,0,0,0,100,0),
+(@PATH,93,-480.5942,2778.588,50.47923,0,0,0,0,100,0),
+(@PATH,94,-476.0007,2799.573,45.95654,0,0,0,0,100,0),
+(@PATH,95,-458.507,2835.351,35.33127,0,0,0,0,100,0),
+(@PATH,96,-431.757,2863.309,23.74757,0,0,0,0,100,0),
+(@PATH,97,-413.4223,2892.728,17.20714,0,0,0,0,100,0),
+(@PATH,98,-419.2291,2905.467,19.51181,0,0,0,0,100,0),
+(@PATH,99,-443.1462,2933.887,17.85199,0,0,0,0,100,0),
+(@PATH,100,-438.8401,2966.167,8.723536,0,0,0,0,100,0),
+(@PATH,101,-444.0433,2936.331,17.40722,0,0,0,0,100,0),
+(@PATH,102,-432.5814,2918.56,19.31524,0,0,0,0,100,0),
+(@PATH,103,-411.3571,2898.61,17.23361,0,0,0,0,100,0),
+(@PATH,104,-429.0982,2867.209,22.665,0,0,0,0,100,0),
+(@PATH,105,-457.4272,2836.473,34.75057,0,0,0,0,100,0),
+(@PATH,106,-474.1913,2804.114,44.81591,0,0,0,0,100,0),
+(@PATH,107,-481.0764,2783.36,50.09081,0,0,0,0,100,0),
+(@PATH,108,-465.5521,2759.48,50.03743,0,0,0,0,100,0),
+(@PATH,109,-440.5409,2744.546,46.12499,0,0,0,0,100,0),
+(@PATH,110,-420.0836,2742.421,41.1034,0,0,0,0,100,0),
+(@PATH,111,-397.9436,2734.918,35.90202,0,0,0,0,100,0),
+(@PATH,112,-372.9858,2738.609,28.64789,0,0,0,0,100,0),
+(@PATH,113,-348.4457,2742.212,23.42384,0,0,0,0,100,0),
+(@PATH,114,-333.7679,2740.035,21.81408,0,0,0,0,100,0),
+(@PATH,115,-324.9037,2731.125,22.83686,0,0,0,0,100,0),
+(@PATH,116,-323.9969,2714.816,25.20854,0,0,0,0,100,0),
+(@PATH,117,-332.7059,2702.867,29.4334,0,0,0,0,100,0),
+(@PATH,118,-343.4227,2683.021,35.1899,0,0,0,0,100,0),
+(@PATH,119,-359.6221,2658.229,43.55175,0,0,0,0,100,0),
+(@PATH,120,-353.887,2635.825,39.48611,0,0,0,0,100,0),
+(@PATH,121,-344.0572,2624.184,43.10011,0,0,0,0,100,0),
+(@PATH,122,-325.4768,2613.256,41.99747,0,0,0,0,100,0),
+(@PATH,123,-315.0096,2608.486,41.19632,0,0,0,0,100,0),
+(@PATH,124,-325.0719,2578.15,44.60706,0,0,0,0,100,0),
+(@PATH,125,-325.6835,2576.813,44.85286,0,0,0,0,100,0),
+(@PATH,126,-313.8424,2562.751,43.86629,0,0,0,0,100,0),
+(@PATH,127,-306.6296,2559.59,43.31482,0,0,0,0,100,0),
+(@PATH,128,-303.079,2544.062,42.30245,0,0,0,0,100,0),
+(@PATH,129,-324.1274,2514.437,40.29177,0,0,0,0,100,0),
+(@PATH,130,-333.2019,2515.876,41.902,0,0,0,0,100,0),
+(@PATH,131,-354.4488,2524.19,43.33042,0,0,0,0,100,0),
+(@PATH,132,-359.7796,2523.489,44.53107,0,0,0,0,100,0),
+(@PATH,133,-378.1317,2510.007,43.7447,0,0,0,0,100,0),
+(@PATH,134,-382.583,2491,37.3352,0,0,0,0,100,0),
+(@PATH,135,-368.7838,2483.057,28.09278,0,0,0,0,100,0),
+(@PATH,136,-337.7688,2479.346,28.95182,0,0,0,0,100,0),
+(@PATH,137,-318.8761,2478.915,37.70119,0,0,0,0,100,0),
+(@PATH,138,-301.9458,2480.981,40.5145,0,0,0,0,100,0),
+(@PATH,139,-300.0336,2481.129,40.53691,0,0,0,0,100,0),
+(@PATH,140,-291.6542,2471.877,40.91128,0,0,0,0,100,0),
+(@PATH,141,-295.2729,2454.313,42.07068,0,0,0,0,100,0),
+(@PATH,142,-291.9165,2442.606,43.58534,0,0,0,0,100,0),
+(@PATH,143,-290.83,2436.461,44.0534,0,0,0,0,100,0),
+(@PATH,144,-296.628,2422.13,44.75555,0,0,0,0,100,0),
+(@PATH,145,-284.9365,2416.829,46.52535,0,0,0,0,100,0),
+(@PATH,146,-277.901,2404.396,49.46965,0,0,0,0,100,0),
+(@PATH,147,-276.7875,2401.742,49.57491,0,0,0,0,100,0),
+(@PATH,148,-275.867,2368.15,50.02176,0,0,0,0,100,0),
+(@PATH,149,-280.12,2358.433,51.42045,0,0,0,0,100,0),
+(@PATH,150,-271.6628,2337.664,53.90419,0,0,0,0,100,0),
+(@PATH,151,-260.8519,2327.604,56.16253,0,0,0,0,100,0),
+(@PATH,152,-246.7255,2313.879,53.0292,0,0,0,0,100,0),
+(@PATH,153,-233.4331,2311.107,50.28912,0,0,0,0,100,0),
+(@PATH,154,-194.8462,2316.223,54.13938,0,0,0,0,100,0),
+(@PATH,155,-184.3219,2321.592,61.90179,0,0,0,0,100,0),
+(@PATH,156,-169.6792,2336.901,61.27917,0,0,0,0,100,0),
+(@PATH,157,-167.8382,2348.53,59.15134,0,0,0,0,100,0),
+(@PATH,158,-168.2972,2362.321,57.01959,0,0,0,0,100,0),
+(@PATH,159,-169.3826,2376.633,54.4596,0,0,0,0,100,0),
+(@PATH,160,-171.8145,2382.753,52.97548,0,0,0,0,100,0),
+(@PATH,161,-180.183,2392.34,51.01487,0,0,0,0,100,0),
+(@PATH,162,-181.2741,2398.439,49.99238,0,0,0,0,100,0),
+(@PATH,163,-175.461,2408.534,48.88574,0,0,0,0,100,0),
+(@PATH,164,-157.5141,2417.718,45.03862,0,0,0,0,100,0),
+(@PATH,165,-146.3332,2426.921,48.30313,0,0,0,0,100,0),
+(@PATH,166,-137.9598,2445.376,46.12595,0,0,0,0,100,0),
+(@PATH,167,-118.3926,2470.393,46.95731,0,0,0,0,100,0),
+(@PATH,168,-124.8685,2492.812,46.93701,0,0,0,0,100,0),
+(@PATH,169,-131.4405,2495.996,46.55548,0,0,0,0,100,0),
+(@PATH,170,-145.8467,2499.76,45.61186,0,0,0,0,100,0),
+(@PATH,171,-168.8438,2501.025,43.79488,0,0,0,0,100,0),
+(@PATH,172,-176.3846,2510.593,41.94983,0,0,0,0,100,0),
+(@PATH,173,-177.3363,2516.895,41.11181,0,0,0,0,100,0),
+(@PATH,174,-170.4912,2527.817,41.62189,0,0,0,0,100,0),
+(@PATH,175,-156.8518,2539.49,42.95174,0,0,0,0,100,0),
+(@PATH,176,-146.1405,2544.73,40.98074,0,0,0,0,100,0),
+(@PATH,177,-144.7979,2569.513,41.10892,0,0,0,0,100,0),
+(@PATH,178,-165.0483,2590.722,39.90811,0,0,0,0,100,0),
+(@PATH,179,-162.7764,2603.097,40.06981,0,0,0,0,100,0),
+(@PATH,180,-164.5241,2612.235,40.08208,0,0,0,0,100,0),
+(@PATH,181,-165.2749,2618.521,40.12231,0,0,0,0,100,0),
+(@PATH,182,-166.9141,2633.801,41.55241,0,0,0,0,100,0),
+(@PATH,183,-170.6192,2661.56,42.24799,0,0,0,0,100,0),
+(@PATH,184,-166.924,2686.502,43.27299,0,0,0,0,100,0),
+(@PATH,185,-165.7749,2686.863,43.39313,0,0,0,0,100,0),
+(@PATH,186,-125.7525,2695.987,46.92542,0,0,0,0,100,0),
+(@PATH,187,-108.798,2709.016,51.00445,0,0,0,0,100,0),
+(@PATH,188,-110.122,2737.952,52.16914,0,0,0,0,100,0),
+(@PATH,189,-120.4556,2753.937,49.37396,0,0,0,0,100,0),
+(@PATH,190,-134.5498,2778.104,41.05849,0,0,0,0,100,0),
+(@PATH,191,-153.882,2788.701,36.85746,0,0,0,0,100,0),
+(@PATH,192,-186.3388,2797.655,26.33011,0,0,0,0,100,0),
+(@PATH,193,-185.5681,2808.792,25.53679,0,0,0,0,100,0),
+(@PATH,194,-172.6706,2803.528,29.62396,0,0,0,0,100,0),
+(@PATH,195,-160.4427,2807.621,32.6923,0,0,0,0,100,0),
+(@PATH,196,-149.3403,2813.561,35.25396,0,0,0,0,100,0),
+(@PATH,197,-149.3422,2826.91,33.67762,0,0,0,0,100,0),
+(@PATH,198,-168.0662,2837.727,26.36559,0,0,0,0,100,0),
+(@PATH,199,-179.7917,2839.993,23.64687,0,0,0,0,100,0);
+-- 0x1C09E4424012FCC000002C00005FBF34 .go -179.7917 2839.993 23.64687
+
+-- Pathing for Bonechewer Raider Entry: 16925 'TDB FORMAT'
+SET @NPC := 58704;
+SET @PATH := @NPC * 10;
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=-404.7873,`position_y`=2895.921,`position_z`=13.85265 WHERE `guid`=@NPC;
+DELETE FROM `creature_addon` WHERE `guid`=@NPC;
+INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (@NPC,@PATH,17408,0,1,0, '');
+DELETE FROM `waypoint_data` WHERE `id`=@PATH;
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES
+(@PATH,1,-404.7873,2895.921,13.85265,0,0,0,0,100,0),
+(@PATH,2,-404.2322,2900.299,14.15039,0,0,0,0,100,0),
+(@PATH,3,-428.3772,2914.106,19.38362,0,0,0,0,100,0),
+(@PATH,4,-439.7838,2928.416,18.55647,0,0,0,0,100,0),
+(@PATH,5,-445.6255,2946.441,15.33809,0,0,0,0,100,0),
+(@PATH,6,-439.2244,2964.096,9.26938,0,0,0,0,100,0),
+(@PATH,7,-454.467,2971.035,9.009753,0,0,0,0,100,0),
+(@PATH,8,-467.3622,2966.943,12.50773,0,0,0,0,100,0),
+(@PATH,9,-482.1766,2976.099,11.32469,0,0,0,0,100,0),
+(@PATH,10,-471.1085,2966.682,13.06236,0,0,0,0,100,0),
+(@PATH,11,-456.4288,2970.18,9.417983,0,0,0,0,100,0),
+(@PATH,12,-450.4304,2969.706,9.393501,0,0,0,0,100,0),
+(@PATH,13,-446.038,2951.119,14.24401,0,0,0,0,100,0),
+(@PATH,14,-442.8287,2934.824,17.44841,0,0,0,0,100,0),
+(@PATH,15,-435.4904,2921.99,19.82334,0,0,0,0,100,0),
+(@PATH,16,-404.6763,2913.004,15.59055,0,0,0,0,100,0);
+-- 0x1C09E4424010874000002C00005FACA1 .go -404.7873 2895.921 13.85265
+
+-- Pathing for Bonechewer Raider Entry: 16925 'TDB FORMAT'
+SET @NPC := 58705;
+SET @PATH := @NPC * 10;
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=-394.2339,`position_y`=2891.354,`position_z`=8.341909 WHERE `guid`=@NPC;
+DELETE FROM `creature_addon` WHERE `guid`=@NPC;
+INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (@NPC,@PATH,17408,0,1,0, '');
+DELETE FROM `waypoint_data` WHERE `id`=@PATH;
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES
+(@PATH,1,-394.2339,2891.354,8.341909,0,0,0,0,100,0),
+(@PATH,2,-404.354,2907.934,14.82262,0,0,0,0,100,0),
+(@PATH,3,-420.1548,2911.418,19.02849,0,0,0,0,100,0),
+(@PATH,4,-434.6948,2920.658,19.59609,0,0,0,0,100,0),
+(@PATH,5,-443.507,2937.645,16.52073,0,0,0,0,100,0),
+(@PATH,6,-438.1014,2952.321,11.34356,0,0,0,0,100,0),
+(@PATH,7,-445.5783,2967.97,9.331216,0,0,0,0,100,0),
+(@PATH,8,-438.8247,2958.072,10.36737,0,0,0,0,100,0),
+(@PATH,9,-442.9203,2943.862,15.03016,0,0,0,0,100,0),
+(@PATH,10,-440.1529,2925.814,19.82526,0,0,0,0,100,0),
+(@PATH,11,-430.9389,2917.94,18.84661,0,0,0,0,100,0),
+(@PATH,12,-407.8214,2910.193,16.49719,0,0,0,0,100,0);
+-- 0x1C09E4424010874000002C00005FACD2 .go -394.2339 2891.354 8.341909
+
+-- Pathing for Bonechewer Raider Entry: 16925 'TDB FORMAT'
+SET @NPC := 58703;
+SET @PATH := @NPC * 10;
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=-173.0258,`position_y`=2784.179,`position_z`=31.73058 WHERE `guid`=@NPC;
+DELETE FROM `creature_addon` WHERE `guid`=@NPC;
+INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (@NPC,@PATH,17408,0,1,0, '');
+DELETE FROM `waypoint_data` WHERE `id`=@PATH;
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES
+(@PATH,1,-184.2477,2841.474,22.17058,0,0,0,0,100,0),
+(@PATH,2,-186.5912,2837.849,21.70995,0,0,0,0,100,0),
+(@PATH,3,-186.0354,2821.816,23.10514,0,0,0,0,100,0),
+(@PATH,4,-190.4859,2804.101,24.46144,0,0,0,0,100,0),
+(@PATH,5,-190.1222,2800.265,25.05125,0,0,0,0,100,0),
+(@PATH,6,-185.8087,2784.323,28.49104,0,0,0,0,100,0),
+(@PATH,7,-173.0258,2784.179,31.73058,0,0,0,0,100,0),
+(@PATH,8,-153.8195,2788.142,37.07464,0,0,0,0,100,0),
+(@PATH,9,-146.762,2781.243,39.44977,0,0,0,0,100,0),
+(@PATH,10,-150.9473,2773.002,39.19555,0,0,0,0,100,0),
+(@PATH,11,-165.231,2763.583,36.20363,0,0,0,0,100,0),
+(@PATH,12,-181.1507,2755.388,30.1041,0,0,0,0,100,0),
+(@PATH,13,-168.6309,2761.67,34.94637,0,0,0,0,100,0),
+(@PATH,14,-157.0087,2768.504,38.33034,0,0,0,0,100,0),
+(@PATH,15,-147.9143,2776.101,39.64468,0,0,0,0,100,0),
+(@PATH,16,-148.772,2785.843,38.60817,0,0,0,0,100,0),
+(@PATH,17,-167.8991,2784.874,33.46256,0,0,0,0,100,0),
+(@PATH,18,-185.8087,2784.323,28.49104,0,0,0,0,100,0),
+(@PATH,19,-190.1222,2800.265,25.05125,0,0,0,0,100,0),
+(@PATH,20,-190.4859,2804.101,24.46144,0,0,0,0,100,0),
+(@PATH,21,-186.0354,2821.816,23.10514,0,0,0,0,100,0),
+(@PATH,22,-186.5912,2837.849,21.70995,0,0,0,0,100,0),
+(@PATH,23,-184.2477,2841.474,22.17058,0,0,0,0,100,0);
+-- 0x1C09E4424010874000002C00005FBE47 .go -173.0258 2784.179 31.73058
+
+-- Pathing for Bonechewer Raider Entry: 16925 'TDB FORMAT'
+SET @NPC := 58707;
+SET @PATH := @NPC * 10;
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=-180.3116,`position_y`=2686.223,`position_z`=40.81258 WHERE `guid`=@NPC;
+DELETE FROM `creature_addon` WHERE `guid`=@NPC;
+INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (@NPC,@PATH,17408,0,1,0, '');
+DELETE FROM `waypoint_data` WHERE `id`=@PATH;
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES
+(@PATH,1,-180.3116,2686.223,40.81258,0,0,0,0,100,0),
+(@PATH,2,-175.7397,2679.259,42.18403,0,0,0,0,100,0),
+(@PATH,3,-171.9714,2660.608,42.08878,0,0,0,0,100,0),
+(@PATH,4,-170.7084,2658.794,42.01125,0,0,0,0,100,0),
+(@PATH,5,-171.3484,2640.479,41.27383,0,0,0,0,100,0),
+(@PATH,6,-171.948,2638.051,41.02221,0,0,0,0,100,0),
+(@PATH,7,-165.7785,2619.644,40.29411,0,0,0,0,100,0),
+(@PATH,8,-166.9228,2612.098,39.69428,0,0,0,0,100,0),
+(@PATH,9,-169.5662,2594.979,39.33304,0,0,0,0,100,0),
+(@PATH,10,-170.6965,2594.06,39.20753,0,0,0,0,100,0),
+(@PATH,11,-170.8916,2594.003,38.98936,0,0,0,0,100,0),
+(@PATH,12,-166.2133,2597.965,39.64554,0,0,0,0,100,0),
+(@PATH,13,-163.8443,2600.274,39.8479,0,0,0,0,100,0),
+(@PATH,14,-165.4025,2621.016,40.56765,0,0,0,0,100,0),
+(@PATH,15,-164.8262,2624.799,41.17817,0,0,0,0,100,0),
+(@PATH,16,-170.1738,2643.713,41.53741,0,0,0,0,100,0),
+(@PATH,17,-169.1673,2647.221,41.99223,0,0,0,0,100,0),
+(@PATH,18,-171.7151,2670.958,42.49662,0,0,0,0,100,0);
+-- 0x1C09E4424010874000002C00005FBFA9 .go -180.3116 2686.223 40.81258
diff --git a/sql/updates/world/2015_02_15_01_world.sql b/sql/updates/world/2015_02_15_01_world.sql
new file mode 100644
index 00000000000..63deab73f54
--- /dev/null
+++ b/sql/updates/world/2015_02_15_01_world.sql
@@ -0,0 +1,7 @@
+-- Darnassian Scout SAI
+SET @ENTRY := 15968;
+UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,0,0,0,25,0,100,0,0,0,0,0,75,30831,0,0,0,0,0,1,0,0,0,0,0,0,0,"Darnassian Scout - On Reset - Cast 'Stealth'"),
+(@ENTRY,0,1,0,4,0,100,0,0,0,0,0,28,30831,0,0,0,0,0,1,0,0,0,0,0,0,0,"Darnassian Scout - On Aggro - Remove Aura 'Stealth'");
diff --git a/sql/updates/world/2015_02_15_02_world.sql b/sql/updates/world/2015_02_15_02_world.sql
new file mode 100644
index 00000000000..34a27d468b7
--- /dev/null
+++ b/sql/updates/world/2015_02_15_02_world.sql
@@ -0,0 +1,56 @@
+-- Nexus-King Salhadaar SAI
+SET @ENTRY := 20454;
+UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,0,0,1,1,3,100,1,1000,1000,1000,1000,19,33554432,0,0,0,0,0,1,0,0,0,0,0,0,0,"Nexus-King Salhadaar - Out of Combat - Remove Flag Not Selectable (Phase 4) (No Repeat)"),
+(@ENTRY,0,1,2,61,0,100,1,1000,1000,1000,1000,2,1796,0,0,0,0,0,1,0,0,0,0,0,0,0,"Nexus-King Salhadaar - Out of Combat - Set Faction 1796 (Phase 4) (No Repeat)"),
+(@ENTRY,0,2,0,61,0,100,1,1,1,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,"Nexus-King Salhadaar - Out of Combat - Say Line 0 (Phase 4)"),
+(@ENTRY,0,3,0,0,0,100,0,5000,10000,15000,25000,11,36533,0,0,0,0,0,1,0,0,0,0,0,0,0,"Nexus-King Salhadaar - In Combat - Cast 'Gravity Flux'"),
+(@ENTRY,0,4,5,2,0,100,1,5,25,0,0,11,36848,0,0,0,0,0,1,0,0,0,0,0,0,0,"Nexus-King Salhadaar - Between 5-25% Health - Cast 'Mirror Image' (No Repeat)"),
+(@ENTRY,0,5,0,61,0,100,0,5,25,0,0,11,36847,0,0,0,0,0,1,0,0,0,0,0,0,0,"Nexus-King Salhadaar - Between 5-25% Health - Cast 'Mirror Image' (No Repeat)"),
+(@ENTRY,0,6,0,0,0,100,0,15000,25000,10000,30000,11,36527,0,0,0,0,0,5,0,0,0,0,0,0,0,"Nexus-King Salhadaar - In Combat - Cast 'Stasis'"),
+(@ENTRY,0,7,8,7,0,100,0,0,0,0,0,2,35,0,0,0,0,0,1,0,0,0,0,0,0,0,"Nexus-King Salhadaar - On Evade - Set Faction 35"),
+(@ENTRY,0,8,10,61,0,100,0,0,0,0,0,45,1,1,0,0,0,0,11,21425,20,0,0,0,0,0,"Nexus-King Salhadaar - On Evade - Set Data 1 1"),
+(@ENTRY,0,9,0,38,0,100,0,1,1,0,0,23,1,0,0,0,0,0,1,0,0,0,0,0,0,0,"Nexus-King Salhadaar - On Data Set 1 1 - Increment Phase"),
+(@ENTRY,0,10,0,61,0,100,0,0,0,0,0,22,0,0,0,0,0,0,1,0,0,0,0,0,0,0,"Nexus-King Salhadaar - On Evade - Set Event Phase 0");
+
+-- Nexus-King Salhadaar SAI
+SET @ENTRY := 21425;
+UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,0,0,0,54,0,100,0,0,0,0,0,49,0,0,0,0,0,0,21,20,0,0,0,0,0,0,"Nexus-King Salhadaar - On Just Summoned - Start Attacking"),
+(@ENTRY,0,1,0,38,0,100,0,1,1,0,0,41,0,0,0,0,0,0,1,0,0,0,0,0,0,0,"Nexus-King Salhadaar - On Data Set 1 1 - Despawn Instant");
+
+-- remove randmmovement
+UPDATE `creature` SET `spawndist`=0, `MovementType`=0 WHERE `guid` IN (73277, 73278, 73279);
+
+-- Salaadin's Energy Ball SAI
+SET @ENTRY := 20769;
+UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,0,0,0,11,0,100,1,0,0,0,0,11,32566,0,0,0,0,0,1,0,0,0,0,0,0,0,"Salaadin's Energy Ball - On Respawn - Cast 'Purple Banish State' (No Repeat)"),
+(@ENTRY,0,1,0,1,0,100,0,5000,5000,0,0,11,35515,0,0,0,0,0,9,20454,0,200,0,0,0,0,"Salaadin's Energy Ball - Out of Combat - Cast 'Salaadin's Tesla'"),
+(@ENTRY,0,2,0,38,0,100,0,1,1,0,0,41,100,0,0,0,0,0,1,0,0,0,0,0,0,0,"Salaadin's Energy Ball - On Data Set 1 1 - Despawn In 100 ms");
+
+-- Protectorate Disruptor SAI
+SET @ENTRY := 184561;
+UPDATE `gameobject_template` SET `AIName`="SmartGameObjectAI" WHERE `entry`=@ENTRY;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=1;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,1,0,0,1,0,100,1,0,0,0,0,45,1,1,0,0,0,0,19,20769,10,0,0,0,0,0,"Protectorate Disruptor - Out of Combat - Set Data 1 1 (No Repeat)"),
+(@ENTRY,1,1,0,1,0,100,1,1000,1000,0,0,45,1,1,0,0,0,0,10,72462,20454,0,0,0,0,0,"Protectorate Disruptor - Out of Combat - Set Data 1 1 (No Repeat)");
+
+DELETE FROM `creature_text` WHERE `entry` = 20454 AND `groupid` = 0;
+INSERT INTO `creature_text` (`entry`,`groupid`,`id`,`text`,`type`,`language`,`probability`,`comment`, `BroadcastTextId`) VALUES
+(20454, 0, 0, "Prepare to enter oblivion, meddlers. You have unleashed a god!", 14, 0, 100, "Nexus-King Salhadaar", 18443);
+
+DELETE FROM `creature_text` WHERE `entry` = 20454 AND `groupid` = 0;
+INSERT INTO `creature_text` (`entry`,`groupid`,`id`,`text`,`type`,`language`,`probability`,`comment`, `BroadcastTextID`) VALUES
+(20454, 0, 0, "Prepare to enter oblivion, meddlers. You have unleashed a god!", 14, 0, 100, "Nexus-King Salhadaar", 18443);
+
+DELETE FROM `disables` WHERE `sourceType`=0 AND `entry`=35515;
+INSERT INTO `disables`(`sourceType`,`entry`,`flags`,`comment`) VALUES
+(0,35515,64,'Ignore LOS on Salaadin\'s Tesla');
diff --git a/sql/updates/world/2015_02_15_03_world.sql b/sql/updates/world/2015_02_15_03_world.sql
new file mode 100644
index 00000000000..64e7fe6c50a
--- /dev/null
+++ b/sql/updates/world/2015_02_15_03_world.sql
@@ -0,0 +1,53 @@
+-- Plagueborn Horror SAI
+SET @ENTRY := 36879;
+UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,0,0,0,0,0,100,2,5000,5000,10000,10000,11,69581,0,0,0,0,0,5,0,0,0,0,0,0,0,"Plagueborn Horror - In Combat - Cast 'Pustulant Flesh' (Normal Dungeon)"),
+(@ENTRY,0,1,0,0,0,100,4,5000,5000,10000,10000,11,70273,0,0,0,0,0,5,0,0,0,0,0,0,0,"Plagueborn Horror - In Combat - Cast 'Pustulant Flesh' (Heroic Dungeon)"),
+(@ENTRY,0,2,0,0,0,100,6,8000,8000,8000,8000,11,70274,0,0,0,0,0,5,0,0,0,0,0,0,0,"Plagueborn Horror - In Combat - Cast 'Toxic Waste' (Dungeon)"),
+(@ENTRY,0,3,0,2,0,100,6,15,15,0,0,11,69582,0,0,0,0,0,1,0,0,0,0,0,0,0,"Plagueborn Horror - Between 15-15% Health - Cast 'Blight Bomb' (Dungeon)"),
+(@ENTRY,0,4,5,1,0,100,0,0,0,120000,120000,11,58051,2,0,0,0,0,1,0,0,0,0,0,0,0,"Plagueborn Horror - Out of Combat - Cast 'Summon Scourge Package'"),
+(@ENTRY,0,5,0,61,0,100,0,0,0,120000,120000,11,69702,2,0,0,0,0,9,30887,0,4,0,0,0,0,"Plagueborn Horror - Out of Combat - Cast 'Rope'"),
+(@ENTRY,0,6,0,4,0,100,0,0,0,0,0,45,1,1,0,0,0,0,9,30887,0,10,0,0,0,0,"Plagueborn Horror - On Aggro - Set Data 1 1"),
+(@ENTRY,0,7,8,25,0,100,0,0,0,0,0,11,58051,2,0,0,0,0,1,0,0,0,0,0,0,0,"Plagueborn Horror - On Reset - Cast 'Summon Scourge Package'"),
+(@ENTRY,0,8,0,61,0,100,0,0,0,0,0,11,63413,2,0,0,0,0,9,30887,0,5,0,0,0,0,"Plagueborn Horror - On Reset - Cast 'Rope Beam'");
+
+UPDATE `creature` SET `spawndist`=15, `MovementType`=1 WHERE `guid` IN (201981, 201833, 202236, 201903);
+
+-- Scourge Package SAI
+SET @ENTRY := 30887;
+UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,0,0,0,54,0,100,0,0,0,0,0,29,3,40,0,0,0,0,7,0,0,0,0,0,0,0,"Scourge Package - On Just Summoned - Start Follow Invoker"),
+(@ENTRY,0,1,0,54,0,100,0,0,0,0,0,87,@ENTRY*100+00,@ENTRY*100+01,@ENTRY*100+02,@ENTRY*100+03,0,0,1,0,0,0,0,0,0,0,"Scourge Package - On Just Summoned - Run Random Script"),
+(@ENTRY,0,2,0,38,0,100,0,1,1,0,0,41,1000,0,0,0,0,0,1,0,0,0,0,0,0,0,"Scourge Package - On Data Set 1 1 - Despawn In 1000 ms");
+
+-- Actionlist SAI
+SET @ENTRY := 3088700;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=9;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,9,0,0,0,0,100,0,0,0,0,0,11,58016,2,0,0,0,0,1,0,0,0,0,0,0,0,"Scourge Package - On Script - Cast 'Scourge Package Visual'"),
+(@ENTRY,9,1,0,0,0,100,0,0,0,0,0,2,35,0,0,0,0,0,1,0,0,0,0,0,0,0,"Scourge Package - On Script - Set Faction 35");
+
+-- Actionlist SAI
+SET @ENTRY := 3088701;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=9;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,9,0,0,0,0,100,0,0,0,0,0,11,58022,2,0,0,0,0,1,0,0,0,0,0,0,0,"On Script - Cast 'Scourge Package Visual'"),
+(@ENTRY,9,1,0,0,0,100,0,0,0,0,0,2,35,0,0,0,0,0,1,0,0,0,0,0,0,0,"Scourge Package - On Script - Set Faction 35");
+
+-- Actionlist SAI
+SET @ENTRY := 3088702;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=9;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,9,0,0,0,0,100,0,0,0,0,0,11,58020,2,0,0,0,0,1,0,0,0,0,0,0,0,"On Script - Cast 'Scourge Package Visual'"),
+(@ENTRY,9,1,0,0,0,100,0,0,0,0,0,2,35,0,0,0,0,0,1,0,0,0,0,0,0,0,"Scourge Package - On Script - Set Faction 35");
+
+-- Actionlist SAI
+SET @ENTRY := 3088703;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=9;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,9,0,0,0,0,100,0,0,0,0,0,11,58023,2,0,0,0,0,1,0,0,0,0,0,0,0,"On Script - Cast 'Scourge Package Visual'"),
+(@ENTRY,9,1,0,0,0,100,0,0,0,0,0,2,35,0,0,0,0,0,1,0,0,0,0,0,0,0,"Scourge Package - On Script - Set Faction 35");
diff --git a/sql/updates/world/2015_02_15_04_world.sql b/sql/updates/world/2015_02_15_04_world.sql
new file mode 100644
index 00000000000..56212e2873c
--- /dev/null
+++ b/sql/updates/world/2015_02_15_04_world.sql
@@ -0,0 +1,11 @@
+--
+DELETE FROM `areatrigger_scripts` WHERE `entry`=3587;
+INSERT INTO `areatrigger_scripts` (`entry`, `ScriptName`) VALUES
+(3587, 'at_ancient_leaf');
+DELETE FROM `creature` WHERE `id` IN (14524, 14525, 14526);
+
+DELETE FROM `creature_summon_groups` WHERE `summonerId`=1;
+INSERT INTO `creature_summon_groups` (`summonerId`, `summonerType`, `groupId`, `entry`, `position_x`, `position_y`, `position_z`, `orientation`, `summonType`, `summonTime`) VALUES
+(1, 2, 1, 14524, 6204.051758, -1172.575684, 370.079224, 0.86052, 3, 100000),
+(1, 2, 1, 14525, 6246.953613, -1155.985718, 366.182953, 2.90269, 3, 100000),
+(1, 2, 1, 14526, 6193.449219, -1137.834106, 366.260529, 5.77332, 3, 100000);
diff --git a/sql/updates/world/2015_02_15_05_world.sql b/sql/updates/world/2015_02_15_05_world.sql
new file mode 100644
index 00000000000..033d6f1d4b6
--- /dev/null
+++ b/sql/updates/world/2015_02_15_05_world.sql
@@ -0,0 +1,27 @@
+-- Volcor SAI
+SET @ENTRY := 3692;
+UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,0,0,0,19,0,100,0,994,0,0,0,80,@ENTRY*100+00,0,0,0,0,0,1,0,0,0,0,0,0,0,"Volcor - On Quest 'Escape Through Force' Taken - Run Script"),
+(@ENTRY,0,1,0,19,0,100,0,995,0,0,0,80,@ENTRY*100+01,0,0,0,0,0,1,0,0,0,0,0,0,0,"Volcor - On Quest 'Escape Through Stealth' Taken - Run Script"),
+(@ENTRY,0,2,0,40,0,100,0,15,3692,0,0,41,0,0,0,0,0,0,1,0,0,0,0,0,0,0,"Volcor - On Waypoint 15 Reached - Despawn Instant"),
+(@ENTRY,0,3,0,4,0,100,0,0,0,0,0,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,"Volcor - On Aggro - Say Line 1");
+
+-- Actionlist SAI
+SET @ENTRY := 369200;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=9;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,9,0,0,0,0,100,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,"Volcor - On Script - Say Line 0"),
+(@ENTRY,9,1,0,0,0,100,0,0,0,0,0,53,0,3692,0,0,0,2,1,0,0,0,0,0,0,0,"Volcor - On Script - Start Waypoint"),
+(@ENTRY,9,2,0,0,0,100,0,110000,110000,0,0,1,2,0,0,0,0,0,7,0,0,0,0,0,0,0,"Volcor - On Script - Say Line 2"),
+(@ENTRY,9,3,0,0,0,100,0,0,0,0,0,15,994,0,0,0,0,0,7,0,0,0,0,0,0,0,"Volcor - On Script - Quest Credit 'Escape Through Force'");
+
+-- Actionlist SAI
+SET @ENTRY := 369201;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=9;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,9,0,0,0,0,100,0,0,0,0,0,1,0,0,0,0,0,0,1,3,0,0,0,0,0,0,"Volcor - On Script - Say Line 0"),
+(@ENTRY,9,1,0,0,0,100,0,0,0,0,0,53,0,3692,0,0,0,2,1,0,0,0,0,0,0,0,"Volcor - On Script - Start Waypoint"),
+(@ENTRY,9,2,0,0,0,100,0,110000,110000,0,0,1,3,0,0,0,0,0,7,0,0,0,0,0,0,0,"Volcor - On Script - Say Line 3"),
+(@ENTRY,9,3,0,0,0,100,0,0,0,0,0,15,995,0,0,0,0,0,7,0,0,0,0,0,0,0,"Volcor - On Script - Quest Credit 'Escape Through Stealth'");
diff --git a/sql/updates/world/2015_02_15_06_world.sql b/sql/updates/world/2015_02_15_06_world.sql
new file mode 100644
index 00000000000..84d6730666f
--- /dev/null
+++ b/sql/updates/world/2015_02_15_06_world.sql
@@ -0,0 +1,10 @@
+--
+DELETE FROM `areatrigger_scripts` WHERE `entry` = 4479;
+INSERT INTO `areatrigger_scripts` (`entry`, `ScriptName`) VALUES
+(4479, 'SmartTrigger');
+DELETE FROM `smart_scripts` WHERE `entryorguid` = 4479 AND `source_type` = 2;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(4479, 2, 0, 0, 46, 0, 100, 0, 4479, 0, 0, 0, 85, 33728, 2, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'Areatrigger - On Trigger - Cast Teleport Shattrath');
+DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId` = 22 AND `SourceEntry` = 4479 AND `SourceId` = 2;
+INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES
+(22, 1, 4479, 2, 0, 28, 0, 10280, 0, 0, 0, 0, '', 'Teleport only on Quest "Special Delivery to Shattrath City"');
diff --git a/sql/updates/world/2015_02_15_07_world.sql b/sql/updates/world/2015_02_15_07_world.sql
new file mode 100644
index 00000000000..afbbc3817ef
--- /dev/null
+++ b/sql/updates/world/2015_02_15_07_world.sql
@@ -0,0 +1,4 @@
+--
+DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=14 AND `SourceGroup`=24 AND `SourceEntry`=522;
+INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorType`, `ErrorTextId`, `Comment`) VALUES
+(14, 24, 522, 0, 0, 8, 0, 770, 0, 0, 1, 0, 0, 'Show gossip text if player do not has quest 770 completed');
diff --git a/sql/updates/world/2015_02_15_08_world.sql b/sql/updates/world/2015_02_15_08_world.sql
new file mode 100644
index 00000000000..db2f5e1b59a
--- /dev/null
+++ b/sql/updates/world/2015_02_15_08_world.sql
@@ -0,0 +1,27 @@
+-- Infiltrator Marksen SAI
+SET @ENTRY := 5416;
+UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,0,0,0,20,0,100,0,1391,0,0,0,80,@ENTRY*100+00,2,0,0,0,0,1,0,0,0,0,0,0,0,"Infiltrator Marksen - On Quest 'Nothing But The Truth' Finished - Run Script"),
+(@ENTRY,0,1,0,6,0,100,0,0,0,0,0,1,4,0,0,0,0,0,1,0,0,0,0,0,0,0,"Infiltrator Marksen - On Just Died - Say Line 4");
+
+-- Actionlist SAI
+SET @ENTRY := 541600;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=9;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,9,0,0,0,0,100,0,2000,2000,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,"Infiltrator Marksen - On Script - Say Line 0"),
+(@ENTRY,9,1,0,0,0,100,0,2000,2000,0,0,1,1,4000,0,0,0,0,1,0,0,0,0,0,0,0,"Infiltrator Marksen - On Script - Say Line 1"),
+(@ENTRY,9,2,0,0,0,100,0,4000,4000,0,0,1,2,0,0,0,0,0,1,0,0,0,0,0,0,0,"Infiltrator Marksen - On Script - Say Line 2"),
+(@ENTRY,9,3,0,0,0,100,0,3000,3000,0,0,1,3,0,0,0,0,0,1,0,0,0,0,0,0,0,"Infiltrator Marksen - On Script - Say Line 3"),
+(@ENTRY,9,4,0,0,0,100,0,1000,1000,0,0,3,0,10973,0,0,0,0,1,0,0,0,0,0,0,0,"Infiltrator Marksen - On Script - Morph To Model 10973"),
+(@ENTRY,9,5,0,0,0,100,0,100,100,0,0,89,3,0,0,0,0,0,1,0,0,0,0,0,0,0,"Infiltrator Marksen - On Script - Start Random Movement"),
+(@ENTRY,9,6,0,0,0,100,0,5000,5000,0,0,37,0,0,0,0,0,0,1,0,0,0,0,0,0,0,"Infiltrator Marksen - On Script - Kill Self");
+
+DELETE FROM `creature_text` WHERE `entry`=5416;
+INSERT INTO `creature_text` (`entry`, `groupid`, `id`, `text`, `type`, `language`, `probability`, `emote`, `duration`, `sound`, `comment`, `BroadcastTextID`) VALUES
+(5416, 0, 0, '%s takes a big swig of ale.', 16, 0, 100, 0, 0, 0, 'Infiltrator Marksen',18019),
+(5416, 1, 0, 'That was refreshing. Now there\'s information that needs to be told...', 12, 0, 100, 1, 0, 0, 'Infiltrator Marksen',18019),
+(5416, 2, 0, 'I believe the Forsaken are misleading the allies of the Horde.... wait... I feel so... dizzy...', 12, 0, 100, 1, 0, 0, 'Infiltrator Marksen',18019),
+(5416, 3, 0, '%s writhes in pain.', 16, 0, 100, 0, 0, 0, 'Infiltrator Marksen',18019),
+(5416, 4, 0, 'AAAAAAAAAAAAAAAAARGH!', 12, 0, 100, 0, 0, 0, 'Infiltrator Marksen',18019);
diff --git a/sql/updates/world/2015_02_15_09_world.sql b/sql/updates/world/2015_02_15_09_world.sql
new file mode 100644
index 00000000000..1e2ca3b9f1c
--- /dev/null
+++ b/sql/updates/world/2015_02_15_09_world.sql
@@ -0,0 +1,10 @@
+--
+DELETE FROM `gossip_menu` WHERE `entry`=40060;
+INSERT INTO `gossip_menu` (`entry`, `text_id`) VALUES
+(40060, 2494),
+(40060, 2493);
+
+DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=14 AND `SourceGroup`=40060 AND `SourceEntry` IN (2494, 2493);
+INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorType`, `ErrorTextId`, `Comment`) VALUES
+(14, 40060, 2494, 0, 0, 8, 0, 4023, 0, 0, 1, 0, 0, 'Show gossip text if player do not has quest 4023 completed'),
+(14, 40060, 2493, 0, 1, 8, 0, 4022, 0, 0, 1, 0, 0, 'Show gossip text if player do not has quest 4022 completed');
diff --git a/sql/updates/world/2015_02_15_10_world.sql b/sql/updates/world/2015_02_15_10_world.sql
new file mode 100644
index 00000000000..d9506211550
--- /dev/null
+++ b/sql/updates/world/2015_02_15_10_world.sql
@@ -0,0 +1,5 @@
+--
+SET @newestguid := 45208;
+DELETE FROM `creature` WHERE `guid`=@newestguid AND `id`=25654;
+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
+(@newestguid, 25654, 571, 1, 1, 0, 0, 4207.15, 4057.02, 91.6273, 1.38362, 300, 0, 0, 42, 0, 0, 0, 0, 0);
diff --git a/sql/updates/world/2015_02_15_11_world.sql b/sql/updates/world/2015_02_15_11_world.sql
new file mode 100644
index 00000000000..458a23a77cf
--- /dev/null
+++ b/sql/updates/world/2015_02_15_11_world.sql
@@ -0,0 +1,9 @@
+--
+SET @CGUID := 45212;
+DELETE FROM `creature` WHERE `guid` IN (@CGUID);
+INSERT INTO `creature` (`guid`, `id`, `map`, `spawnMask`, `phaseMask`, `position_x`, `position_y`, `position_z`, `orientation`, `spawntimesecs`, `spawndist`, `MovementType`) VALUES
+(@CGUID, 30082, 571, 1, 4, 7271.656, -878.8148, 926.0092, 5.532694, 600, 0, 0);
+
+DELETE FROM `spell_area` WHERE `spell`=55783 AND `area`=4432;
+INSERT INTO `spell_area` (`spell`, `area`, `quest_start`, `quest_end`, `aura_spell`, `racemask`, `gender`, `autocast`, `quest_start_status`, `quest_end_status`) VALUES
+(55783, 4432, 12879, 12973, 0, 0, 2, 1, 66, 1);
diff --git a/sql/updates/world/2015_02_15_12_world.sql b/sql/updates/world/2015_02_15_12_world.sql
new file mode 100644
index 00000000000..cb4c2b9150c
--- /dev/null
+++ b/sql/updates/world/2015_02_15_12_world.sql
@@ -0,0 +1,61 @@
+--
+SET @CGUID := 45761;
+
+DELETE FROM `creature` WHERE `id`=26265;
+INSERT INTO `creature` (`guid`, `id`, `map`, `zoneId`, `areaId`, `spawnMask`, `phaseMask`, `modelid`, `equipment_id`, `position_x`, `position_y`, `position_z`, `orientation`, `spawntimesecs`, `spawndist`, `currentwaypoint`, `curhealth`, `curmana`, `MovementType`, `npcflag`, `unit_flags`, `dynamicflags`, `VerifiedBuild`) VALUES
+(@CGUID, 26265, 571, 0, 0, 1, 1, 0, 0, 4031.15, 7326.39, 635.972, 4.26247, 300, 0, 0, 1, 0, 0, 0, 0, 0,0);
+
+UPDATE `creature_template` SET `ScriptName`='', `npcflag`=`npcflag`|1 WHERE `entry`=26206;
+-- Keristrasza SAI
+SET @ENTRY := 26206;
+UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,0,0,1,62,0,100,0,9262,0,0,0,11,46772,0,0,0,0,0,7,0,0,0,0,0,0,0,"Keristrasza - On Gossip Option 0 Selected - Cast 'Teleport'"),
+(@ENTRY,0,1,0,61,0,100,0,9262,0,0,0,72,0,0,0,0,0,0,7,0,0,0,0,0,0,0,"Keristrasza - On Gossip Option 0 Selected - Close Gossip"),
+(@ENTRY,0,2,3,62,0,100,0,9262,1,0,0,11,46824,0,0,0,0,0,7,0,0,0,0,0,0,0,"Keristrasza - On Gossip Option 1 Selected - Cast 'Teleport'"),
+(@ENTRY,0,3,0,61,0,100,0,9262,1,0,0,72,0,0,0,0,0,0,7,0,0,0,0,0,0,0,"Keristrasza - On Gossip Option 1 Selected - Close Gossip");
+
+DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=15 AND `SourceGroup`=9262 AND `SourceEntry` IN (0, 1);
+INSERT INTO `conditions` VALUES
+(15, 9262, 0, 0, 0, 9, 0, 11957, 0, 0, 0, 0, 0, '', 'Only show gossip if player has quest 11957'),
+(15, 9262, 1, 0, 0, 2, 0, 35709, 1, 0, 0, 0, 0, '', 'Only show gossip if player has item 35709');
+
+-- Saragosa's End Invisman SAI
+SET @ENTRY := 26265;
+UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,0,0,1,8,0,100,0,46793,0,0,0,12,26231,5,0,0,0,0,8,0,0,0,4050.19,7329.25,635.97,3.34,"Saragosa's End Invisman - On Spellhit 'Activate Power Focus' - Summon Creature 'Saragosa'"),
+(@ENTRY,0,1,0,61,0,100,0,46793,0,0,0,11,46789,0,0,0,0,0,1,0,0,0,0,0,0,0,"Saragosa's End Invisman - On Spellhit 'Activate Power Focus' - Cast 'Blue Power Focus'");
+
+DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=22 AND `SourceGroup`=1 AND `SourceEntry`=26265;
+INSERT INTO `conditions` VALUES
+(22, 1, 26265, 0, 0, 29, 0, 26231, 40, 0, 1, 0, 0, '', 'Only summon Saragosa if there is not already one in range'),
+(22, 1, 26265, 0, 0, 29, 0, 26232, 40, 0, 1, 0, 0, '', 'Only summon Saragosa if there is not already one in range');
+
+-- Activate Power Focus (46793)
+DELETE FROM `event_scripts` WHERE `id`=17452;
+
+DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=13 AND `SourceGroup`=1 AND `SourceEntry`=46793;
+INSERT INTO `conditions` VALUES
+(13, 1, 46793, 0, 0, 31, 0, 3, 26265, 0, 0, 0, 0, '', 'Target needs to be Saragosa''s End Invisman');
+
+UPDATE `creature_template` SET `ScriptName`='', `unit_flags`=`unit_flags`|768, `flags_extra`=`flags_extra`|2 WHERE `entry`=26231;
+-- Saragosa SAI
+SET @ENTRY := 26231;
+UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,0,0,0,1,0,100,1,6000,6000,0,0,28,46789,0,0,0,0,0,19,26265,40,0,0,0,0,0,"Saragosa - Out of Combat - Remove Aura 'Blue Power Focus' (No Repeat)"),
+(@ENTRY,0,1,2,1,0,100,1,12000,12000,0,0,12,26232,1,120000,0,0,0,1,0,0,0,0,0,0,0,"Saragosa - Out of Combat - Summon Creature 'Saragosa' (No Repeat)"),
+(@ENTRY,0,2,0,61,0,100,0,12000,12000,0,0,41,0,0,0,0,0,0,1,0,0,0,0,0,0,0,"Saragosa - Out of Combat - Despawn Instant (No Repeat)");
+
+UPDATE `creature_template` SET `ScriptName`='', `flags_extra`=`flags_extra`|2 WHERE `entry`=26232;
+-- Saragosa SAI
+SET @ENTRY := 26232;
+UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,0,0,0,0,0,100,0,0,40,3400,6200,11,51779,0,0,0,0,0,2,0,0,0,0,0,0,0,"Saragosa - In Combat - Cast 'Frostfire Bolt'"),
+(@ENTRY,0,1,0,0,0,100,0,8500,17500,20100,40100,11,15063,0,0,0,0,0,2,0,0,0,0,0,0,0,"Saragosa - In Combat - Cast 'Frost Nova'");
diff --git a/sql/updates/world/2015_02_15_13_world.sql b/sql/updates/world/2015_02_15_13_world.sql
new file mode 100644
index 00000000000..8e1b4629085
--- /dev/null
+++ b/sql/updates/world/2015_02_15_13_world.sql
@@ -0,0 +1,84 @@
+--
+SET @CGUID := 56502; -- needs 3
+DELETE FROM `creature` WHERE `guid` IN (@CGUID+0, @CGUID+1, @CGUID+2);
+INSERT INTO `creature` (`guid`, `id`, `map`, `spawnMask`, `phaseMask`, `position_x`, `position_y`, `position_z`, `orientation`, `spawntimesecs`, `spawndist`, `MovementType`) VALUES
+(@CGUID+0, 26620, 600, 3, 1, -522.7039, -605.9083, 1.299988, 2.6529, 7200, 0, 0), -- 26620 (Area: 4196) (Auras: 47503 - 47503)
+(@CGUID+1, 26620, 600, 3, 1, -518.0062, -599.1102, 1.10835, 3.054326, 7200, 0, 0), -- 26620 (Area: 4196) (Auras: 47503 - 47503)
+(@CGUID+2, 26626, 600, 3, 1, -511.0887, -602.5585, 2.56744, 3.193953, 7200, 0, 0); -- 26626 (Area: 4196)
+
+DELETE FROM `creature_addon` WHERE `guid` IN (@CGUID+0, @CGUID+1);
+INSERT INTO `creature_addon` (`guid`, `path_id`, `mount`, `bytes1`, `bytes2`, `emote`, `auras`) VALUES
+(@CGUID+0, 0, 0, 0, 0, 0, '47503'),
+(@CGUID+1, 0, 0, 0, 0, 0, '47503');
+
+UPDATE `smart_scripts` SET `action_param1`=1 WHERE `entryorguid`=26626 AND `source_type`=0 AND `id`=0 AND `link`=1;
+
+-- Scourge Reanimator SAI
+SET @GUID := -@CGUID+2;
+UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=26626;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@GUID AND `source_type`=0;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@GUID,0,0,2,25,0,100,1,0,0,0,0,80,2662600,2,0,0,0,0,1,0,0,0,0,0,0,0,"Scourge Reanimator - On Reset - Run Script (No Repeat)"),
+(@GUID,0,1,0,40,0,100,0,1,2662600,0,0,80,2662601,2,0,0,0,0,1,0,0,0,0,0,0,0,"Scourge Reanimator - On Waypoint 1 Reached - Run Script");
+
+-- Actionlist SAI
+SET @ENTRY := 2662600;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=9;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,9,0,0,0,0,100,0,2000,2000,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,"Scourge Reanimator - On Script - Say Line 0"),
+(@ENTRY,9,1,0,0,0,100,0,3000,3000,0,0,53,1,2662600,0,0,0,0,1,0,0,0,0,0,0,0,"Scourge Reanimator - On Script - Start Waypoint");
+
+-- Actionlist SAI
+SET @ENTRY := 2662601;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=9;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,9,0,0,0,0,100,0,0,0,0,0,45,1,1,0,0,0,0,10,@CGUID,26620,0,0,0,0,0,"Scourge Reanimator - On Script - Set Data 1 1"),
+(@ENTRY,9,1,0,0,0,100,0,0,0,0,0,45,1,1,0,0,0,0,10,@CGUID+1,26620,0,0,0,0,0,"Scourge Reanimator - On Script - Set Data 1 1"),
+(@ENTRY,9,2,0,0,0,100,0,2000,2000,0,0,11,48597,0,0,0,0,0,10,@CGUID+1,26620,0,0,0,0,0,"Scourge Reanimator - On Script - Cast 'Raise Dead'"),
+(@ENTRY,9,3,0,0,0,100,0,2000,2000,0,0,12,26635,3,600000,0,0,0,8,0,0,0,-536.830505,-578.793091,1.91333,1.774444,"Scourge Reanimator - On Script - Summon Creature 'Risen Drakkari Warrior'"),
+(@ENTRY,9,4,0,0,0,100,0,3000,3000,0,0,11,48597,0,0,0,0,0,10,@CGUID,26620,0,0,0,0,0,"Scourge Reanimator - On Script - Cast 'Raise Dead'"),
+(@ENTRY,9,5,0,0,0,100,0,2000,2000,0,0,12,26635,3,600000,0,0,0,8,0,0,0,-543.121582,-582.083313,1.025425,2.120673,"Scourge Reanimator - On Script - Summon Creature 'Risen Drakkari Warrior'"),
+(@ENTRY,9,6,0,0,0,100,0,4000,4000,0,0,1,2,0,0,0,0,0,1,0,0,0,0,0,0,0,"Scourge Reanimator - On Script - Say Line 2"),
+(@ENTRY,9,7,0,0,0,100,0,0,0,0,0,11,47506,0,0,0,0,0,1,0,0,0,0,0,0,0,"Scourge Reanimator - On Script - Cast 'Teleport'"),
+(@ENTRY,9,8,0,0,0,100,0,1500,1500,0,0,41,1,0,0,0,0,0,1,0,0,0,0,0,0,0,"Scourge Reanimator - On Script - Despawn Instant");
+
+DELETE FROM `waypoints` WHERE `entry`=2662600;
+INSERT INTO `waypoints` (`entry`, `pointid`, `position_x`, `position_y`, `position_z`, `point_comment`) VALUES
+(2662600, 1, -533.262695, -591.052856, 2.484161, 'Scourge Reanimator');
+
+-- Drakkari Guardian SAI
+SET @GUID := -@CGUID;
+UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=26620;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@GUID AND `source_type`=0;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@GUID,0,0,0,1,0,100,1,2000,2000,0,0,69,0,0,0,0,0,0,8,0,0,0,-543.121582,-582.083313,1.025425,2.120673,"Drakkari Guardian - Out of Combat - Move To Position (No Repeat)"),
+(@GUID,0,1,0,38,0,100,0,1,1,0,0,37,0,0,0,0,0,0,1,0,0,0,0,0,0,0,"Drakkari Guardian - On Data Set 1 1 - Kill Self");
+
+-- Drakkari Guardian SAI
+SET @GUID := -@CGUID+1;
+UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=26620;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@GUID AND `source_type`=0;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@GUID,0,0,0,1,0,100,1,2000,2000,0,0,69,0,0,0,0,0,0,8,0,0,0,-536.830505,-578.793091,1.913330,1.774444,"Drakkari Guardian - Out of Combat - Move To Position (No Repeat)"),
+(@GUID,0,1,0,38,0,100,0,1,1,0,0,37,0,0,0,0,0,0,1,0,0,0,0,0,0,0,"Drakkari Guardian - On Data Set 1 1 - Kill Self");
+
+-- Risen Drakkari Warrior SAI
+SET @ENTRY := 26635;
+UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,0,0,0,0,0,100,6,1000,3000,5000,9500,11,36093,0,0,0,0,0,2,0,0,0,0,0,0,0,"Risen Drakkari Warrior - In Combat - Cast 'Ghost Strike' (Dungeon)"),
+(@ENTRY,0,1,0,0,0,100,6,1000,3000,7250,10000,11,33661,0,0,0,0,0,2,0,0,0,0,0,0,0,"Risen Drakkari Warrior - In Combat - Cast 'Crush Armor' (Dungeon)"),
+(@ENTRY,0,2,0,54,0,100,0,0,0,0,0,89,5,0,0,0,0,0,1,0,0,0,0,0,0,0,"Risen Drakkari Warrior - On Just Summoned - Start Random Movement");
+
+DELETE FROM `creature_text` WHERE `entry`=26626;
+INSERT INTO `creature_text` (`entry`, `groupid`, `id`, `text`, `type`, `language`, `probability`, `emote`, `duration`, `sound`, `BroadcastTextId`, `TextRange`, `comment`) VALUES
+(26626, 0, 0, 'Don''t be so quick to escape! I have a parting gift....', 14, 0, 100, 0, 0, 0, 26474, 0, 'Scourge Reanimator'),
+(26626, 1, 0, 'Rise my warriors and fight for your new liege!', 14, 0, 100, 0, 0, 0, 26464, 0, 'Scourge Reanimator'),
+(26626, 2, 0, 'Please enjoy their company, the Lich King sends his regards!', 14, 0, 100, 0, 0, 0, 26473, 0, 'Scourge Reanimator');
+
+DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=13 AND `SourceGroup`=1 AND `SourceEntry`=48597;
+INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorType`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES
+(13, 1, 48597, 0, 0, 31, 0, 3, 26620, 0, 0, 0, 0, '', 'Raise Dead - only targets Drakkari Guardian');
+
+DELETE FROM `creature` WHERE `guid` IN (127436, 127437);
diff --git a/sql/updates/world/2015_02_15_14_world.sql b/sql/updates/world/2015_02_15_14_world.sql
new file mode 100644
index 00000000000..7e387b9df5a
--- /dev/null
+++ b/sql/updates/world/2015_02_15_14_world.sql
@@ -0,0 +1,5 @@
+--
+DELETE FROM `creature_addon` WHERE `guid` IN (127436, 127437);
+DELETE FROM `linked_respawn` WHERE `guid` IN (127436, 127437);
+DELETE FROM `spell_script_names` WHERE `spell_id`=8283 AND `ScriptName`='spell_snufflenose_command';
+UPDATE `creature_template` SET `ScriptName`='' WHERE `entry`=26206;
diff --git a/sql/updates/world/2015_02_16_00_world.sql b/sql/updates/world/2015_02_16_00_world.sql
new file mode 100644
index 00000000000..f6ea0ed5a0e
--- /dev/null
+++ b/sql/updates/world/2015_02_16_00_world.sql
@@ -0,0 +1,2 @@
+--
+UPDATE `smart_scripts` SET `action_param1`=1 WHERE `entryorguid`=83600 AND `source_type`=9 AND `id`=2 AND `link`=0;
diff --git a/sql/updates/world/2015_02_16_01_world.sql b/sql/updates/world/2015_02_16_01_world.sql
new file mode 100644
index 00000000000..0d130f32f7b
--- /dev/null
+++ b/sql/updates/world/2015_02_16_01_world.sql
@@ -0,0 +1,2 @@
+--
+DELETE FROM `spell_target_position` WHERE `id` in (50859);
diff --git a/sql/updates/world/2015_02_16_02_world.sql b/sql/updates/world/2015_02_16_02_world.sql
new file mode 100644
index 00000000000..3f67ae7ac1b
--- /dev/null
+++ b/sql/updates/world/2015_02_16_02_world.sql
@@ -0,0 +1,5 @@
+--
+DELETE FROM `gameobject_template` WHERE `entry` IN (193977,193978);
+INSERT INTO `gameobject_template` (`entry`, `type`, `displayId`, `name`, `IconName`, `castBarCaption`, `unk1`, `faction`, `flags`, `size`, `questItem1`, `questItem2`, `questItem3`, `questItem4`, `questItem5`, `questItem6`, `data0`, `data1`, `data2`, `data3`, `data4`, `data5`, `data6`, `data7`, `data8`, `data9`, `data10`, `data11`, `data12`, `data13`, `data14`, `data15`, `data16`, `data17`, `data18`, `data19`, `data20`, `data21`, `data22`, `data23`, `AIName`, `ScriptName`, `VerifiedBuild`) VALUES
+(193977, 22, 8532, 'Bottle of Peaked Dalaran Red', '', '', '', 0, 0, 1, 0, 0, 0, 0, 0, 0, 61064, 5, 1, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, '', '', -18019),
+(193978, 22, 8531, 'Cask of Peaked Dalaran Red', '', '', '', 0, 0, 0.8, 0, 0, 0, 0, 0, 0, 61064, 25, 1, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, '', '', -18019);
diff --git a/sql/updates/world/2015_02_16_03_world.sql b/sql/updates/world/2015_02_16_03_world.sql
new file mode 100644
index 00000000000..35f17a761cd
--- /dev/null
+++ b/sql/updates/world/2015_02_16_03_world.sql
@@ -0,0 +1,29 @@
+--
+SET @CGUID := 56502;
+
+UPDATE `creature_template` SET `AIName`='SmartAI' WHERE `entry`=11789;
+UPDATE `smart_scripts` SET `link`=0 WHERE `entryorguid`=-56500 AND `source_type`=0 AND `id`=0 AND `link`=2;
+
+-- Scourge Reanimator SAI
+SET @GUID := -(@CGUID+2);
+UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=26626;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@GUID AND `source_type`=0;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@GUID,0,0,0,25,0,100,1,0,0,0,0,80,2662600,2,0,0,0,0,1,0,0,0,0,0,0,0,"Scourge Reanimator - On Reset - Run Script (No Repeat)"),
+(@GUID,0,1,0,40,0,100,0,1,2662600,0,0,80,2662601,2,0,0,0,0,1,0,0,0,0,0,0,0,"Scourge Reanimator - On Waypoint 1 Reached - Run Script");
+
+-- Drakkari Guardian SAI
+SET @GUID := -(@CGUID);
+UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=26620;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@GUID AND `source_type`=0;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@GUID,0,0,0,1,0,100,1,2000,2000,0,0,69,0,0,0,0,0,0,8,0,0,0,-543.121582,-582.083313,1.025425,2.120673,"Drakkari Guardian - Out of Combat - Move To Position (No Repeat)"),
+(@GUID,0,1,0,38,0,100,0,1,1,0,0,37,0,0,0,0,0,0,1,0,0,0,0,0,0,0,"Drakkari Guardian - On Data Set 1 1 - Kill Self");
+
+-- Drakkari Guardian SAI
+SET @GUID := -(@CGUID+1);
+UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=26620;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@GUID AND `source_type`=0;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@GUID,0,0,0,1,0,100,1,2000,2000,0,0,69,0,0,0,0,0,0,8,0,0,0,-536.830505,-578.793091,1.913330,1.774444,"Drakkari Guardian - Out of Combat - Move To Position (No Repeat)"),
+(@GUID,0,1,0,38,0,100,0,1,1,0,0,37,0,0,0,0,0,0,1,0,0,0,0,0,0,0,"Drakkari Guardian - On Data Set 1 1 - Kill Self");
diff --git a/sql/updates/world/2015_02_16_04_world.sql b/sql/updates/world/2015_02_16_04_world.sql
new file mode 100644
index 00000000000..b358aad4eb2
--- /dev/null
+++ b/sql/updates/world/2015_02_16_04_world.sql
@@ -0,0 +1,10 @@
+--
+-- Tome of Mel'Thandris SAI
+SET @ENTRY := 19027;
+UPDATE `gameobject_template` SET `AIName`="SmartGameObjectAI" WHERE `entry`=@ENTRY;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=1;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,1,0,0,70,0,100,0,2,0,0,0,12,3946,2,40000,0,0,0,8,0,0,0,3169.15,-1211.71,216.95,4.59,"Tome of Mel'Thandris - On Gameobject State Changed - Summon Creature 'Velinde Starsong'");
+
+UPDATE `creature_template` SET `AIName`='' WHERE `entry`=11789;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=-56500;
diff --git a/sql/updates/world/2015_02_16_05_world.sql b/sql/updates/world/2015_02_16_05_world.sql
new file mode 100644
index 00000000000..beb4e14f3af
--- /dev/null
+++ b/sql/updates/world/2015_02_16_05_world.sql
@@ -0,0 +1,7 @@
+--
+-- King Mrgl-Mrgl SAI
+SET @ENTRY := 25197;
+UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0 AND `id`=1;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,0,1,0,19,0,100,0,11571,0,0,0,11,45328,0,0,0,0,0,7,0,0,0,0,0,0,0,"King Mrgl-Mrgl - On Quest 'Learning to Communicate' Taken - Cast 'Water Breathing'");
diff --git a/sql/updates/world/2015_02_16_06_world.sql b/sql/updates/world/2015_02_16_06_world.sql
new file mode 100644
index 00000000000..b8f7294216d
--- /dev/null
+++ b/sql/updates/world/2015_02_16_06_world.sql
@@ -0,0 +1,405 @@
+--
+DELETE FROM `creature_addon` WHERE `guid` IN (126051,125886,126038,125888,125891,125887,125967,125956,125971,125962,125960,125965,24084,125964,125963,125973,125968,125961,125954,125972,125957,125955,125970,125969,125966,125958,125897, 125902, 125900, 125899, 125894, 125895, 125898);
+INSERT INTO `creature_addon` (`guid`, `path_id`, `mount`, `bytes1`, `bytes2`, `emote`, `auras`) VALUES
+--
+(126038, 0, 0, 0, 1, 133, NULL),
+(125888, 0, 0, 0, 1, 133, NULL),
+(125891, 0, 0, 0, 1, 133, NULL),
+(125887, 0, 0, 0, 1, 133, NULL),
+(125886, 0, 0, 0, 1, 133, NULL),
+(126051, 0, 0, 0, 1, 133, NULL),
+--
+(24084, 0, 0, 0, 1, 7, NULL),
+(125964, 0, 0, 0, 1, 7, NULL),
+(125963, 0, 0, 0, 1, 7, NULL),
+(125973, 0, 0, 0, 1, 7, NULL),
+(125968, 0, 0, 0, 1, 7, NULL),
+(125961, 0, 0, 0, 1, 7, NULL),
+(125954, 0, 0, 0, 1, 7, NULL),
+(125972, 0, 0, 0, 1, 7, NULL),
+(125957, 0, 0, 0, 1, 7, NULL),
+(125955, 0, 0, 0, 1, 7, NULL),
+(125970, 0, 0, 0, 1, 7, NULL),
+(125969, 0, 0, 0, 1, 7, NULL),
+(125966, 0, 0, 0, 1, 7, NULL),
+(125958, 0, 0, 0, 1, 7, NULL),
+(125965, 0, 0, 0, 1, 7, NULL),
+(125960, 0, 0, 0, 1, 7, NULL),
+(125962, 0, 0, 0, 1, 7, NULL),
+(125971, 0, 0, 0, 1, 7, NULL),
+(125956, 0, 0, 0, 1, 7, NULL),
+(125967, 0, 0, 0, 1, 7, NULL),
+--
+(125897, 0, 0, 0, 1, 234, NULL),
+(125902, 0, 0, 0, 1, 234, NULL),
+(125898, 0, 0, 0, 1, 234, NULL),
+(125900, 0, 0, 0, 1, 234, NULL),
+(125899, 0, 0, 0, 1, 234, NULL),
+(125894, 0, 0, 0, 1, 234, NULL),
+(125895, 0, 0, 0, 1, 234, NULL);
+
+-- update some addons
+UPDATE `creature_addon` SET `emote`=7 WHERE `guid` IN (126027, 126043, 126034);
+UPDATE `creature_addon` SET `emote`=1 WHERE `guid` IN (125889, 125892);
+
+-- remove unneeded double spawned NPCs
+DELETE FROM `creature` WHERE `guid` IN (125930,125917,125932,125921,125920,125918,125915,125927,125931,125914,125922,125913);
+DELETE FROM `creature_addon` WHERE `guid` IN (125913,125922,125917,125918,125921,125920,125927,125930,125931,125932,125915,125914);
+DELETE FROM `linked_respawn` WHERE `guid`=125913;
+
+-- Pathing for Entry: 24080 'TDB FORMAT'
+SET @NPC := 125909;
+SET @PATH := @NPC * 10;
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=344.5201,`position_y`=-55.29842,`position_z`=23.00489 WHERE `guid`=@NPC;
+DELETE FROM `creature_addon` WHERE `guid`=@NPC;
+INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (@NPC,@PATH,0,0,1,0, '');
+DELETE FROM `waypoint_data` WHERE `id`=@PATH;
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES
+(@PATH,1,344.5201,-55.29842,23.00489,0,0,0,0,100,0),
+(@PATH,2,344.8939,-55.7041,23.00489,0,0,0,0,100,0),
+(@PATH,3,320.806,-36.86301,23.00489,0,0,0,0,100,0),
+(@PATH,4,302.7466,-35.83545,24.96675,0,0,0,0,100,0),
+(@PATH,5,299.0615,-36.53833,24.92923,0,0,0,0,100,0),
+(@PATH,6,301.0684,-37.2436,24.67861,0,0,0,0,100,0),
+(@PATH,7,314.7549,-36.4743,23.21675,0,0,0,0,100,0),
+(@PATH,8,337.0555,-52.25382,23.00652,0,0,0,0,100,0);
+-- 0x1C16DC47C0178400002225000161EB2E .go 344.5201 -55.29842 23.00489
+
+-- Pathing for Entry: 24080 'TDB FORMAT'
+SET @NPC := 125906;
+SET @PATH := @NPC * 10;
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=257.9562,`position_y`=-66.89291,`position_z`=24.67863 WHERE `guid`=@NPC;
+DELETE FROM `creature_addon` WHERE `guid`=@NPC;
+INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (@NPC,@PATH,0,0,1,133, '');
+DELETE FROM `waypoint_data` WHERE `id`=@PATH;
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES
+(@PATH,1,257.9562,-66.89291,24.67863,0,0,0,0,100,0),
+(@PATH,2,250.1216,-42.76279,24.92863,0,0,0,0,100,0),
+(@PATH,3,249.5976,-35.35291,24.92862,0,15000,0,0,100,0),
+(@PATH,4,249.2954,-37.17996,24.92863,0,0,0,0,100,0),
+(@PATH,5,257.3498,-63.88337,24.92863,0,0,0,0,100,0),
+(@PATH,6,258.2347,-66.07593,24.92863,0,15000,0,0,100,0);
+-- 0x1C16DC47C0178400002225000061EB2E .go 257.9562 -66.89291 24.67863
+
+-- Pathing for Entry: 24080 'TDB FORMAT'
+SET @NPC := 125908;
+SET @PATH := @NPC * 10;
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2 WHERE `guid`=@NPC;
+DELETE FROM `creature_addon` WHERE `guid`=@NPC;
+INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (@NPC,@PATH,0,0,1,133, '');
+DELETE FROM `waypoint_data` WHERE `id`=@PATH;
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES
+(@PATH, 1, 258.921, -35.9238, 24.6786, 0, 15000, 0, 0, 100, 0),
+(@PATH, 2, 260.677, -43.4207, 24.6786, 0, 0, 0, 0, 100, 0),
+(@PATH, 3, 278.781, -38.9278, 24.6786, 0, 0, 0, 0, 100, 0),
+(@PATH, 4, 278.542, -38.2699, 24.6786, 0, 15000, 0, 0, 100, 0),
+(@PATH, 5, 264.293, -43.8186, 24.6786, 0, 0, 0, 0, 100, 0);
+
+-- Pathing for Entry: 24080 'TDB FORMAT'
+SET @NPC := 125907;
+SET @PATH := @NPC * 10;
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2 WHERE `guid`=@NPC;
+DELETE FROM `creature_addon` WHERE `guid`=@NPC;
+INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (@NPC,@PATH,0,0,1,133, '');
+DELETE FROM `waypoint_data` WHERE `id`=@PATH;
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES
+(@PATH, 1, 267.265, -61.16, 24.6786, 0, 15000, 0, 0, 100, 0),
+(@PATH, 2, 265.899, -54.8942, 24.6786, 0, 0, 0, 0, 100, 0),
+(@PATH, 3, 280.857, -49.5784, 24.6786, 0, 0, 0, 0, 100, 0),
+(@PATH, 4, 281.25, -50.5522, 24.6786, 0, 15000, 0, 0, 100, 0),
+(@PATH, 5, 266.912, -55.2328, 24.6786, 0, 0, 0, 0, 100, 0);
+
+-- Dragonflayer Weaponsmith SAI
+SET @ENTRY := 24080;
+UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0 AND `id`=3;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,0,3,0,4,0,50,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,"Dragonflayer Weaponsmith - On Aggro - Say Line 1");
+
+DELETE FROM `creature_text` WHERE `entry`=24080;
+INSERT INTO `creature_text` (`entry`, `groupid`, `id`, `text`, `type`, `language`, `probability`, `emote`, `duration`, `sound`, `BroadcastTextId`, `TextRange`, `comment`) VALUES
+(24080, 0, 0, 'I spit on you!', 12, 0, 100, 0, 0, 0, 30503, 0, 'Dragonflayer Weaponsmith');
+
+-- remove dublicated mounts
+UPDATE `creature_template_addon` SET `mount`=0 WHERE `entry`=24849;
+
+DELETE FROM `creature_formations` WHERE `leaderGUID`=126042;
+INSERT INTO `creature_formations` (`leaderGUID`, `memberGUID`, `dist`, `angle`, `groupAI`, `point_1`, `point_2`) VALUES
+(126042, 126042, 0, 0, 2, 0, 0),
+(126042, 126046, 0, 0, 2, 0, 0),
+(126042, 126032, 0, 0, 2, 0, 0),
+(126042, 126041, 0, 0, 2, 0, 0);
+
+-- Pathing for Entry: 23953 'TDB FORMAT'
+SET @NPC :=126025;
+SET @PATH := @NPC * 10;
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2 WHERE `guid`=@NPC;
+DELETE FROM `creature_addon` WHERE `guid`=@NPC;
+INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (@NPC,@PATH,0,0,1,5, '');
+DELETE FROM `waypoint_data` WHERE `id`=@PATH;
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES
+(@PATH, 1, 188.578, 217.181, 40.8161, 0, 0, 0, 0, 100, 0),
+(@PATH, 2, 189.28, 217.307, 40.8161, 0, 5000, 0, 0, 100, 0),
+(@PATH, 3, 189.676, 207.039, 40.8161, 0, 0, 0, 0, 100, 0),
+(@PATH, 4, 196.131, 196.306, 40.8161, 0, 0, 0, 0, 100, 0),
+(@PATH, 5, 196.648, 196.778, 40.8161, 0, 5000, 0, 0, 100, 0);
+
+-- Pathing for Entry: 24085 'TDB FORMAT'
+SET @NPC := 125976;
+SET @PATH := @NPC * 10;
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=91.42882,`position_y`=136.3092,`position_z`=65.76968 WHERE `guid`=@NPC;
+DELETE FROM `creature_addon` WHERE `guid`=@NPC;
+INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (@NPC,@PATH,0,0,1,0, '');
+DELETE FROM `waypoint_data` WHERE `id`=@PATH;
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES
+(@PATH,1,91.42882,136.3092,65.76968,0,0,0,0,100,0),
+(@PATH,2,103.4925,101.8953,65.53214,0,0,0,0,100,0),
+(@PATH,3,134.187,65.97398,65.85297,0,0,0,0,100,0);
+-- 0x1C16DC47C0178540002225000061EB2F .go 91.42882 136.3092 65.76968
+
+-- Pathing for Entry: 28419 'TDB FORMAT'
+SET @NPC := 125874;
+SET @PATH := @NPC * 10;
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=121.963,`position_y`=76.88269,`position_z`=109.2261 WHERE `guid`=@NPC;
+DELETE FROM `creature_addon` WHERE `guid`=@NPC;
+INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (@NPC,@PATH,0,0,1,0, '');
+DELETE FROM `waypoint_data` WHERE `id`=@PATH;
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES
+(@PATH,1,121.963,76.88269,109.2261,0,0,1,0,100,0),
+(@PATH,2,120.63,69.04591,109.1783,0,0,1,0,100,0),
+(@PATH,3,104.7298,55.60048,109.2639,0,0,1,0,100,0),
+(@PATH,4,97.1344,52.90959,109.2572,0,0,1,0,100,0),
+(@PATH,5,111.4303,57.28569,109.2564,0,0,1,0,100,0),
+(@PATH,6,122.7686,70.0456,109.2553,0,0,1,0,100,0),
+(@PATH,7,119.7332,84.98322,104.3059,0,0,1,0,100,0),
+(@PATH,8,115.1914,99.77232,93.62556,0,0,1,0,100,0),
+(@PATH,9,112.8705,109.7669,87.9285,0,0,1,0,100,0),
+(@PATH,10,102.7546,111.7725,87.55014,0,0,1,0,100,0),
+(@PATH,11,91.52882,102.3952,87.59012,0,0,1,0,100,0),
+(@PATH,12,96.81816,85.65864,78.54314,0,0,1,0,100,0),
+(@PATH,13,98.63879,73.78115,70.11957,0,0,1,0,100,0),
+(@PATH,14,104.1278,66.31367,66.21651,0,0,1,0,100,0),
+(@PATH,15,116.6431,60.78297,65.94734,0,0,1,0,100,0),
+(@PATH,16,122.0239,71.59913,65.95915,0,0,1,0,100,0),
+(@PATH,17,110.5408,86.22773,65.63712,0,0,1,0,100,0),
+(@PATH,18,101.1147,100.7187,65.54391,0,0,1,0,100,0),
+(@PATH,19,94.89072,118.4349,65.71883,0,0,1,0,100,0),
+(@PATH,20,89.14192,135.3132,65.73074,0,0,1,0,100,0),
+(@PATH,21,84.60493,149.5575,59.07762,0,0,1,0,100,0),
+(@PATH,22,79.19835,165.6029,51.65039,0,0,1,0,100,0),
+(@PATH,23,78.87008,184.8075,49.66129,0,0,1,0,100,0),
+(@PATH,24,81.16812,201.4986,49.43202,0,0,1,0,100,0),
+(@PATH,25,82.937,212.6811,49.61001,0,0,1,0,100,0),
+(@PATH,26,87.64849,237.4446,45.35562,0,0,1,0,100,0),
+(@PATH,27,98.99787,249.9266,43.19844,0,0,1,0,100,0),
+(@PATH,28,117.071,260.0121,43.11768,0,0,1,0,100,0),
+(@PATH,29,117.3428,259.8461,43.11845,0,0,1,0,100,0),
+(@PATH,30,98.82381,251.8302,43.11781,0,0,1,0,100,0),
+(@PATH,31,97.55148,251.2241,43.11774,0,0,1,0,100,0),
+(@PATH,32,112.3071,256.5493,43.11781,0,0,1,0,100,0),
+--
+(@PATH,63,120.63,69.04591,109.1783,0,0,1,0,100,0),
+(@PATH,62,104.7298,55.60048,109.2639,0,0,1,0,100,0),
+(@PATH,61,97.1344,52.90959,109.2572,0,0,1,0,100,0),
+(@PATH,60,111.4303,57.28569,109.2564,0,0,1,0,100,0),
+(@PATH,59,122.7686,70.0456,109.2553,0,0,1,0,100,0),
+(@PATH,58,119.7332,84.98322,104.3059,0,0,1,0,100,0),
+(@PATH,57,115.1914,99.77232,93.62556,0,0,1,0,100,0),
+(@PATH,56,112.8705,109.7669,87.9285,0,0,1,0,100,0),
+(@PATH,55,102.7546,111.7725,87.55014,0,0,1,0,100,0),
+(@PATH,54,91.52882,102.3952,87.59012,0,0,1,0,100,0),
+(@PATH,53,96.81816,85.65864,78.54314,0,0,1,0,100,0),
+(@PATH,52,98.63879,73.78115,70.11957,0,0,1,0,100,0),
+(@PATH,51,104.1278,66.31367,66.21651,0,0,1,0,100,0),
+(@PATH,50,116.6431,60.78297,65.94734,0,0,1,0,100,0),
+(@PATH,49,122.0239,71.59913,65.95915,0,0,1,0,100,0),
+(@PATH,48,110.5408,86.22773,65.63712,0,0,1,0,100,0),
+(@PATH,47,101.1147,100.7187,65.54391,0,0,1,0,100,0),
+(@PATH,46,94.89072,118.4349,65.71883,0,0,1,0,100,0),
+(@PATH,45,89.14192,135.3132,65.73074,0,0,1,0,100,0),
+(@PATH,44,84.60493,149.5575,59.07762,0,0,1,0,100,0),
+(@PATH,43,79.19835,165.6029,51.65039,0,0,1,0,100,0),
+(@PATH,42,78.87008,184.8075,49.66129,0,0,1,0,100,0),
+(@PATH,41,81.16812,201.4986,49.43202,0,0,1,0,100,0),
+(@PATH,40,82.937,212.6811,49.61001,0,0,1,0,100,0),
+(@PATH,39,87.64849,237.4446,45.35562,0,0,1,0,100,0),
+(@PATH,38,98.99787,249.9266,43.19844,0,0,1,0,100,0),
+(@PATH,37,117.071,260.0121,43.11768,0,0,1,0,100,0),
+(@PATH,36,117.3428,259.8461,43.11845,0,0,1,0,100,0),
+(@PATH,35,98.82381,251.8302,43.11781,0,0,1,0,100,0),
+(@PATH,34,97.55148,251.2241,43.11774,0,0,1,0,100,0),
+(@PATH,33,112.3071,256.5493,43.11781,0,0,1,0,100,0);
+-- 0x1C16DC47C01BC0C00022250002E1EB2E .go 121.963 76.88269 109.2261
+
+DELETE FROM `creature_formations` WHERE `leaderGUID`=125874;
+INSERT INTO `creature_formations` (`leaderGUID`, `memberGUID`, `dist`, `angle`, `groupAI`, `point_1`, `point_2`) VALUES
+(125874, 125874, 0, 0, 2, 0, 0),
+(125874, 125876, 3, 90, 2, 0, 0),
+(125874, 125875, 3, 270, 2, 0, 0);
+
+-- Pathing for Entry: 24085 'TDB FORMAT'
+SET @NPC := 125974;
+SET @PATH := @NPC * 10;
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2 WHERE `guid`=@NPC;
+DELETE FROM `creature_addon` WHERE `guid`=@NPC;
+INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (@NPC,@PATH,0,0,1,0, '');
+DELETE FROM `waypoint_data` WHERE `id`=@PATH;
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES
+(@PATH, 1, 139.312, 280.748, 42.8666, 0, 0, 0, 0, 100, 0),
+(@PATH, 2, 150.295, 273.444, 42.8666, 0, 0, 0, 0, 100, 0),
+(@PATH, 3, 138.731, 281.758, 42.8666, 0, 0, 0, 0, 100, 0),
+(@PATH, 4, 129.301, 272.882, 42.8666, 0, 0, 0, 0, 100, 0);
+
+-- Pathing for Entry: 24085 'TDB FORMAT'
+SET @NPC := 125977;
+SET @PATH := @NPC * 10;
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2 WHERE `guid`=@NPC;
+DELETE FROM `creature_addon` WHERE `guid`=@NPC;
+INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (@NPC,@PATH,0,0,1,0, '');
+DELETE FROM `waypoint_data` WHERE `id`=@PATH;
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES
+(@PATH, 1, 75.2556, 249.779, 42.8657, 0, 0, 0, 0, 100, 0),
+(@PATH, 2, 83.8848, 256.364, 42.866, 0, 0, 0, 0, 100, 0),
+(@PATH, 3, 99.3102, 261.128, 42.8661, 0, 0, 0, 0, 100, 0),
+(@PATH, 4, 84.1909, 256.288, 42.8661, 0, 0, 0, 0, 100, 0);
+
+SET @NPC := 125883;
+SET @PATH := @NPC * 10;
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2 WHERE `guid`=@NPC;
+DELETE FROM `creature_addon` WHERE `guid`=@NPC;
+INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (@NPC,@PATH,0,0,1,0, '');
+DELETE FROM `waypoint_data` WHERE `id`=@PATH;
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES
+(@PATH, 1, 77.3519, 205.89, 49.34, 0, 0, 1, 0, 100, 0),
+(@PATH, 2, 86.5749, 199.366, 49.3541, 0, 0, 1, 0, 100, 0),
+(@PATH, 3, 92.7536, 202.35, 49.3631, 0, 0, 1, 0, 100, 0),
+(@PATH, 4, 94.5927, 208.849, 49.37, 0, 0, 1, 0, 100, 0),
+(@PATH, 5, 86.0534, 216.692, 49.3855, 0, 0, 1, 0, 100, 0),
+(@PATH, 6, 75.9458, 214.115, 49.361, 0, 0, 1, 0, 100, 0);
+
+DELETE FROM `creature_formations` WHERE `leaderGUID`=125883;
+INSERT INTO `creature_formations` (`leaderGUID`, `memberGUID`, `dist`, `angle`, `groupAI`, `point_1`, `point_2`) VALUES
+(125883, 125883, 0, 0, 2, 0, 0),
+(125883, 125885, 5, 90, 2, 0, 0),
+(125883, 125884, 5, 270, 2, 0, 0);
+
+SET @NPC := 125975;
+SET @PATH := @NPC * 10;
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2 WHERE `guid`=@NPC;
+DELETE FROM `creature_addon` WHERE `guid`=@NPC;
+INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (@NPC,@PATH,0,0,1,0, '');
+DELETE FROM `waypoint_data` WHERE `id`=@PATH;
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES
+(@PATH, 1, 97.1818, 193.375, 49.3721, 0, 0, 0, 0, 100, 0),
+(@PATH, 2, 97.6578, 205.356, 49.375, 0, 0, 0, 0, 100, 0),
+(@PATH, 3, 96.4575, 193.39, 49.372, 0, 0, 0, 0, 100, 0),
+(@PATH, 4, 96.9237, 185.571, 49.3659, 0, 0, 0, 0, 100, 0);
+
+-- Pathing for Entry: 24085 'TDB FORMAT'
+SET @NPC := 125976;
+SET @PATH := @NPC * 10;
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=108.85,`position_y`=88.22916,`position_z`=65.88628 WHERE `guid`=@NPC;
+DELETE FROM `creature_addon` WHERE `guid`=@NPC;
+INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (@NPC,@PATH,0,0,1,0, '');
+DELETE FROM `waypoint_data` WHERE `id`=@PATH;
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES
+(@PATH, 1, 104.324, 101.477, 65.4325, 0, 0, 0, 0, 100, 0),
+(@PATH, 2, 99.6436, 114.531, 65.4742, 0, 0, 0, 0, 100, 0),
+(@PATH, 3, 93.3592, 132.058, 65.5217, 0, 0, 0, 0, 100, 0),
+(@PATH, 4, 91.2544, 138.023, 65.5074, 0, 0, 0, 0, 100, 0),
+(@PATH, 5, 89.0365, 144.514, 61.6515, 0, 0, 0, 0, 100, 0),
+(@PATH, 6, 83.6051, 160.412, 54.041, 0, 0, 0, 0, 100, 0),
+(@PATH, 7, 80.7065, 169.333, 49.6367, 0, 0, 0, 0, 100, 0),
+(@PATH, 8, 78.4122, 180.724, 49.3771, 0, 0, 0, 0, 100, 0),
+(@PATH, 9, 80.8062, 169.721, 49.4824, 0, 0, 0, 0, 100, 0),
+(@PATH, 10, 84.2462, 158.583, 54.9073, 0, 0, 0, 0, 100, 0),
+(@PATH, 11, 89.1532, 144.915, 61.4908, 0, 0, 0, 0, 100, 0),
+(@PATH, 12, 91.498, 137.939, 65.5082, 0, 0, 0, 0, 100, 0),
+(@PATH, 13, 96.5665, 122.362, 65.495, 0, 0, 0, 0, 100, 0),
+(@PATH, 14, 101.592, 106.919, 65.4531, 0, 0, 0, 0, 100, 0),
+(@PATH, 15, 108.985, 87.2638, 65.5996, 0, 0, 0, 0, 100, 0),
+(@PATH, 16, 119.016, 74.4927, 65.7037, 0, 0, 0, 0, 100, 0),
+(@PATH, 17, 129.481, 61.1712, 65.6985, 0, 0, 0, 0, 100, 0),
+(@PATH, 18, 136.363, 63.0702, 65.6985, 0, 0, 0, 0, 100, 0),
+(@PATH, 19, 145.165, 65.8833, 65.6865, 0, 0, 0, 0, 100, 0),
+(@PATH, 20, 154.484, 68.9137, 65.6788, 0, 0, 0, 0, 100, 0),
+(@PATH, 21, 134.651, 62.0119, 65.6977, 0, 0, 0, 0, 100, 0),
+(@PATH, 22, 121.026, 71.1032, 65.7021, 0, 0, 0, 0, 100, 0),
+(@PATH, 23, 115.277, 81.3625, 65.7034, 0, 0, 0, 0, 100, 0);
+
+UPDATE `smart_scripts` SET `action_param1`=1 WHERE `entryorguid`=23956 AND `source_type`=0 AND `id`=0 AND `link`=1;
+SET @NPC := 126033;
+SET @PATH := @NPC * 10;
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2 WHERE `guid`=@NPC;
+DELETE FROM `creature_addon` WHERE `guid`=@NPC;
+INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (@NPC,@PATH,0,0,1,0, '');
+DELETE FROM `waypoint_data` WHERE `id`=@PATH;
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES
+(@PATH, 1, 92.0074, 91.8776, 83.1133, 0, 0, 0, 0, 100, 0),
+(@PATH, 2, 94.4268, 84.0678, 77.4261, 0, 0, 0, 0, 100, 0),
+(@PATH, 3, 97.4964, 75.2498, 71.1212, 0, 0, 0, 0, 100, 0),
+(@PATH, 4, 100.256, 67.5835, 65.7404, 0, 0, 0, 0, 100, 0),
+(@PATH, 5, 104.253, 56.1223, 65.7013, 0, 0, 0, 0, 100, 0),
+(@PATH, 6, 99.9233, 68.46, 66.1115, 0, 0, 0, 0, 100, 0),
+(@PATH, 7, 96.7413, 77.7433, 72.8654, 0, 0, 0, 0, 100, 0),
+(@PATH, 8, 93.4206, 87.9519, 80.2184, 0, 0, 0, 0, 100, 0),
+(@PATH, 9, 89.9479, 97.6074, 87.0594, 0, 0, 0, 0, 100, 0),
+(@PATH, 10, 85.3204, 111.309, 87.294, 0, 0, 0, 0, 100, 0),
+(@PATH, 11, 109.086, 121.066, 87.308, 0, 0, 0, 0, 100, 0),
+(@PATH, 12, 114.25, 108.563, 87.465, 0, 0, 0, 0, 100, 0),
+(@PATH, 13, 117.378, 100.272, 93.3328, 0, 0, 0, 0, 100, 0),
+(@PATH, 14, 119.976, 92.7572, 98.707, 0, 0, 0, 0, 100, 0),
+(@PATH, 15, 122.256, 85.8878, 103.744, 0, 0, 0, 0, 100, 0),
+(@PATH, 16, 124.757, 78.354, 108.636, 0, 0, 0, 0, 100, 0),
+(@PATH, 17, 129.66, 64.2292, 109.023, 0, 0, 0, 0, 100, 0),
+(@PATH, 18, 131.063, 60.2705, 109.027, 0, 0, 0, 0, 100, 0),
+(@PATH, 19, 108.086, 53.1456, 108.988, 0, 0, 0, 0, 100, 0),
+(@PATH, 20, 131.63, 61.4828, 109.027, 0, 0, 0, 0, 100, 0),
+(@PATH, 21, 125.35, 78.8325, 108.65, 0, 0, 0, 0, 100, 0),
+(@PATH, 22, 121.873, 88.5025, 101.93, 0, 0, 0, 0, 100, 0),
+(@PATH, 23, 117.766, 99.9247, 93.6416, 0, 0, 0, 0, 100, 0),
+(@PATH, 24, 114.768, 108.264, 87.5181, 0, 0, 0, 0, 100, 0),
+(@PATH, 25, 110.429, 120.332, 87.3079, 0, 0, 0, 0, 100, 0),
+(@PATH, 26, 85.4045, 112.781, 87.2894, 0, 0, 0, 0, 100, 0),
+(@PATH, 27, 88.3241, 102.455, 87.3183, 0, 0, 0, 0, 100, 0);
+
+DELETE FROM `creature_formations` WHERE `leaderGUID`=126033;
+INSERT INTO `creature_formations` (`leaderGUID`, `memberGUID`, `dist`, `angle`, `groupAI`, `point_1`, `point_2`) VALUES
+(126033, 126033, 0, 0, 2, 0, 0),
+(126033, 125998, 2, 270, 2, 0, 0);
+
+SET @NPC := 125879;
+SET @PATH := @NPC * 10;
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2 WHERE `guid`=@NPC;
+DELETE FROM `creature_addon` WHERE `guid`=@NPC;
+INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (@NPC,@PATH,0,0,1,0, '');
+DELETE FROM `waypoint_data` WHERE `id`=@PATH;
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES
+(@PATH, 1, 53.1848, 39.7439, 115.029, 0, 0, 1, 0, 100, 0),
+(@PATH, 2, 43.585, 41.2652, 115.029, 0, 0, 1, 0, 100, 0),
+(@PATH, 3, 45.878, 32.8663, 115.029, 0, 0, 1, 0, 100, 0),
+(@PATH, 4, 54.3001, 30.387, 115.029, 0, 0, 1, 0, 100, 0);
+
+DELETE FROM `creature_formations` WHERE `leaderGUID`=125879;
+INSERT INTO `creature_formations` (`leaderGUID`, `memberGUID`, `dist`, `angle`, `groupAI`, `point_1`, `point_2`) VALUES
+(125879, 125879, 0, 0, 2, 0, 0),
+(125879, 125878, 3, 90, 2, 0, 0),
+(125879, 125877, 2, 270, 2, 0, 0);
+
+SET @NPC := 125882;
+SET @PATH := @NPC * 10;
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2 WHERE `guid`=@NPC;
+DELETE FROM `creature_addon` WHERE `guid`=@NPC;
+INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (@NPC,@PATH,0,0,1,0, '');
+DELETE FROM `waypoint_data` WHERE `id`=@PATH;
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES
+(@PATH, 1, 40.6954, -7.59713, 118.542, 0, 0, 1, 0, 100, 0),
+(@PATH, 2, 41.5325, -16.0661, 118.775, 0, 0, 1, 0, 100, 0),
+(@PATH, 3, 47.1018, -17.7693, 118.775, 0, 0, 1, 0, 100, 0),
+(@PATH, 4, 46.6655, -3.88553, 118.775, 0, 0, 1, 0, 100, 0);
+
+DELETE FROM `creature_formations` WHERE `leaderGUID`=125882;
+INSERT INTO `creature_formations` (`leaderGUID`, `memberGUID`, `dist`, `angle`, `groupAI`, `point_1`, `point_2`) VALUES
+(125882, 125882, 0, 0, 2, 0, 0),
+(125882, 125880, 3, 90, 2, 0, 0),
+(125882, 125881, 2, 270, 2, 0, 0);
diff --git a/sql/updates/world/2015_02_17_00_world.sql b/sql/updates/world/2015_02_17_00_world.sql
new file mode 100644
index 00000000000..11f5eca484e
--- /dev/null
+++ b/sql/updates/world/2015_02_17_00_world.sql
@@ -0,0 +1,136 @@
+
+DELETE FROM `creature_text` WHERE `entry` IN(18927,19171,19175,19177,19173,19172,19176,19148,19178,19169,20102) AND `groupid`=0;
+INSERT INTO `creature_text` (`entry`, `groupid`, `id`, `text`, `type`, `language`, `probability`, `emote`, `duration`, `sound`, `BroadcastTextID`, `comment`) VALUES
+(19178, 0, 0, 'Have you seen the fireworks? This is the best time of year to buy them.', 12, 1, 100, 0, 0, 0, 24334, 'Forsaken Commoner to Forsaken Commoner'),
+(19178, 0, 1, 'During the Lunar Festival, we should take time to seek out our elders and consider their wisdom.', 12, 1, 100, 0, 0, 0, 24333, 'Forsaken Commoner to Forsaken Commoner'),
+(19178, 0, 2, 'The druids of Nighthaven are holding a great celebration in Moonglade for the Lunar Festival.', 12, 1, 100, 0, 0, 0, 24335, 'Forsaken Commoner to Forsaken Commoner'),
+(19178, 0, 3, 'During the Lunar Festival, we should take time to seek out our elders and consider their wisdom.', 12, 1, 100, 396, 0, 0, 24333, 'Forsaken Commoner to Forsaken Commoner'),
+(19178, 0, 4, 'Legend says that the great beast Omen sleeps in the waters of Lake Elune''ara in Moonglade, only to appear once a year. But that''s just a legend.', 12, 1, 100, 0, 0, 0, 24332, 'Forsaken Commoner to Forsaken Commoner'),
+(19178, 0, 5, 'Legend says that the great beast Omen sleeps in the waters of Lake Elune''ara in Moonglade, only to appear once a year. But that''s just a legend.', 12, 1, 100, 6, 0, 0, 24332, 'Forsaken Commoner to Forsaken Commoner'),
+(19169, 0, 0, 'Legend says that the great beast Omen sleeps in the waters of Lake Elune''ara in Moonglade, only to appear once a year. But that''s just a legend.', 12, 1, 100, 0, 0, 0, 24332, 'Blood Elf Commoner to Blood Elf Commoner'),
+(19169, 0, 1, 'Have you seen the fireworks? This is the best time of year to buy them.', 12, 1, 100, 0, 0, 0, 24334, 'Blood Elf Commoner to Blood Elf Commoner'),
+(19169, 0, 2, 'During the Lunar Festival, we should take time to seek out our elders and consider their wisdom.', 12, 1, 100, 0, 0, 0, 24333, 'Blood Elf Commoner to Blood Elf Commoner'),
+(19169, 0, 3, 'The druids of Nighthaven are holding a great celebration in Moonglade for the Lunar Festival.', 12, 1, 100, 0, 0, 0, 24335, 'Blood Elf Commoner to Blood Elf Commoner'),
+(19169, 0, 4, 'The festival of the moon was ever more important to the kaldorei. The great festival of the druids is surely in full swing.', 12, 1, 100, 0, 0, 0, 16171, 'Blood Elf Commoner to Blood Elf Commoner'),
+(19176, 0, 0, 'During the Lunar Festival, we should take time to seek out our elders and consider their wisdom.', 12, 1, 100, 0, 0, 0, 24333, 'Tauren Commoner to Tauren Commoner'),
+(19176, 0, 1, 'Legend says that the great beast Omen sleeps in the waters of Lake Elune''ara in Moonglade, only to appear once a year. But that''s just a legend.', 12, 1, 100, 0, 0, 0, 24332, 'Tauren Commoner to Tauren Commoner'),
+(19176, 0, 2, 'The druids of Nighthaven are holding a great celebration in Moonglade for the Lunar Festival.', 12, 1, 100, 0, 0, 0, 24335, 'Tauren Commoner to Tauren Commoner'),
+(19176, 0, 3, 'Have you seen the fireworks? This is the best time of year to buy them.', 12, 1, 100, 0, 0, 0, 24334, 'Tauren Commoner to Tauren Commoner'),
+(19175, 0, 0, 'Legend says that the great beast Omen sleeps in the waters of Lake Elune''ara in Moonglade, only to appear once a year. But that''s just a legend.', 12, 1, 100, 0, 0, 0, 24332, 'Orc Commoner to Orc Commoner'),
+(19175, 0, 1, 'The druids of Nighthaven are holding a great celebration in Moonglade for the Lunar Festival.', 12, 1, 100, 0, 0, 0, 24335, 'Orc Commoner to Orc Commoner'),
+(19175, 0, 2, 'During the Lunar Festival, we should take time to seek out our elders and consider their wisdom.', 12, 1, 100, 0, 0, 0, 24333, 'Orc Commoner to Orc Commoner'),
+(19175, 0, 3, 'Have you seen the fireworks? This is the best time of year to buy them.', 12, 1, 100, 274, 0, 0, 24334, 'Orc Commoner to Orc Commoner'),
+(19175, 0, 4, 'The druids of Nighthaven are holding a great celebration in Moonglade for the Lunar Festival.', 12, 1, 100, 274, 0, 0, 24335, 'Orc Commoner to Orc Commoner'),
+(19177, 0, 0, 'During the Lunar Festival, we should take time to seek out our elders and consider their wisdom.', 12, 1, 100, 0, 0, 0, 24333, 'Troll Commoner to Troll Commoner'),
+(19177, 0, 1, 'Have you seen the fireworks? This is the best time of year to buy them.', 12, 1, 100, 0, 0, 0, 24334, 'Troll Commoner to Troll Commoner'),
+(19177, 0, 2, 'We should go to Moonglade to see the druids'' great festival of the moon.', 12, 1, 100, 0, 0, 0, 0, 'Troll Commoner to Troll Commoner'),
+(19177, 0, 3, 'The druids of Nighthaven are holding a great celebration in Moonglade for the Lunar Festival.', 12, 1, 100, 0, 0, 0, 24335, 'Troll Commoner to Troll Commoner'),
+(19172, 0, 0, 'Have you seen the fireworks? This is the best time of year to buy them.', 12, 7, 100, 0, 0, 0, 24351, 'Gnome Commoner to Gnome Commoner'),
+(19172, 0, 1, 'During the Lunar Festival, we should take time to seek out our elders and consider their wisdom.', 12, 7, 100, 0, 0, 0, 24350, 'Gnome Commoner to Gnome Commoner'),
+(19172, 0, 2, 'Lunar Festival is the best time of year for fireworks!', 12, 7, 100, 0, 0, 0, 0, 'Gnome Commoner to Gnome Commoner'),
+(19172, 0, 3, 'The druids of Nighthaven are holding a great celebration in Moonglade for the Lunar Festival.', 12, 7, 100, 0, 0, 0, 24352, 'Gnome Commoner to Gnome Commoner'),
+(19171, 0, 0, 'It is no surprise that the people of this land hold a great festival of the moon. I should very much like to go to Moonglade to attend it.', 12, 7, 100, 6, 0, 0, 17428, 'Draenei Commoner to Draenei Commoner'),
+(19171, 0, 1, 'Have you seen the fireworks? This is the best time of year to buy them.', 12, 7, 100, 274, 0, 0, 24351, 'Draenei Commoner to Draenei Commoner'),
+(19171, 0, 2, 'Have you seen the fireworks? This is the best time of year to buy them.', 12, 7, 100, 0, 0, 0, 24351, 'Draenei Commoner to Draenei Commoner'),
+(19171, 0, 3, 'The druids of Nighthaven are holding a great celebration in Moonglade for the Lunar Festival.', 12, 7, 100, 0, 0, 0, 24352, 'Draenei Commoner to Draenei Commoner'),
+(19171, 0, 4, 'Have you seen the fireworks? This is the best time of year to buy them.', 12, 7, 100, 273, 0, 0, 24351, 'Draenei Commoner to Draenei Commoner'),
+(19171, 0, 5, 'It is no surprise that the people of this land hold a great festival of the moon. I should very much like to go to Moonglade to attend it.', 12, 7, 100, 273, 0, 0, 17428, 'Draenei Commoner to Draenei Commoner'),
+(19171, 0, 6, 'During the Lunar Festival, we should take time to seek out our elders and consider their wisdom.', 12, 7, 100, 0, 0, 0, 24350, 'Draenei Commoner to Draenei Commoner'),
+(19173, 0, 0, 'During the Lunar Festival, we should take time to seek out our elders and consider their wisdom.', 12, 7, 100, 0, 0, 0, 24350, 'Night Elf Commoner to Night Elf Commoner'),
+(19173, 0, 1, 'Have you seen the fireworks? This is the best time of year to buy them.', 12, 7, 100, 0, 0, 0, 24351, 'Night Elf Commoner to Night Elf Commoner'),
+(19173, 0, 2, 'The Lunar Festival holds special meaning for the night elves. We seek out the wisdom of our elders across the world.', 12, 7, 100, 396, 0, 0, 16156, 'Night Elf Commoner to Night Elf Commoner'),
+(19173, 0, 3, 'The Lunar Festival holds special meaning for the night elves. We seek out the wisdom of our elders across the world.', 12, 7, 100, 0, 0, 0, 16156, 'Night Elf Commoner to Night Elf Commoner'),
+(19173, 0, 4, 'Legend says that the great beast Omen sleeps in the waters of Lake Elune''ara in Moonglade, only to appear once a year. But that''s just a legend.', 12, 7, 100, 0, 0, 0, 24349, 'Night Elf Commoner to Night Elf Commoner'),
+(18927, 0, 0, 'Legend says that the great beast Omen sleeps in the waters of Lake Elune''ara in Moonglade, only to appear once a year. But that''s just a legend.', 12, 7, 100, 0, 0, 0, 24349, 'Human Commoner to Human Commoner'),
+(18927, 0, 1, 'Have you seen the fireworks? This is the best time of year to buy them.', 12, 7, 100, 0, 0, 0, 24351, 'Human Commoner to Human Commoner'),
+(18927, 0, 2, 'The druids of Nighthaven are holding a great celebration in Moonglade for the Lunar Festival.', 12, 7, 100, 0, 0, 0, 24352, 'Human Commoner to Human Commoner'),
+(18927, 0, 3, 'Legend says that the great beast Omen sleeps in the waters of Lake Elune''ara in Moonglade, only to appear once a year. But that''s just a legend.', 12, 7, 100, 274, 0, 0, 24349, 'Human Commoner to Human Commoner'),
+(18927, 0, 4, 'The druids of Nighthaven are holding a great celebration in Moonglade for the Lunar Festival.', 12, 7, 100, 274, 0, 0, 24352, 'Human Commoner to Human Commoner'),
+(18927, 0, 5, 'During the Lunar Festival, we should take time to seek out our elders and consider their wisdom.', 12, 7, 100, 0, 0, 0, 24350, 'Human Commoner to Human Commoner'),
+(19148, 0, 0, 'The druids of Nighthaven are holding a great celebration in Moonglade for the Lunar Festival.', 12, 7, 100, 396, 0, 0, 24352, 'Dwarf Commoner to Dwarf Commoner'),
+(19148, 0, 1, 'The Lunar Festival is a special time for us. We seek out our ancient elders, the Earthen, and pay homage to them.', 12, 7, 100, 396, 0, 0, 16153, 'Dwarf Commoner to Dwarf Commoner'),
+(19148, 0, 2, 'Have you seen the fireworks? This is the best time of year to buy them.', 12, 7, 100, 0, 0, 0, 0, 'Dwarf Commoner to Dwarf Commoner'),
+(19148, 0, 3, 'Legend says that the great beast Omen sleeps in the waters of Lake Elune''ara in Moonglade, only to appear once a year. But that''s just a legend.', 12, 7, 100, 0, 0, 0, 24349, 'Dwarf Commoner to Dwarf Commoner'),
+(19148, 0, 4, 'The druids of Nighthaven are holding a great celebration in Moonglade for the Lunar Festival.', 12, 7, 100, 0, 0, 0, 24352, 'Dwarf Commoner to Dwarf Commoner'),
+(19148, 0, 5, 'The Lunar Festival is a special time for us. We seek out our ancient elders, the Earthen, and pay homage to them.', 12, 7, 100, 0, 0, 0, 16153, 'Dwarf Commoner to Dwarf Commoner'),
+(19148, 0, 6, 'During the Lunar Festival, we should take time to seek out our elders and consider their wisdom.', 12, 7, 100, 0, 0, 0, 24350, 'Dwarf Commoner to Dwarf Commoner'),
+(20102, 0, 0, 'During the Lunar Festival, we should take time to seek out our elders and consider their wisdom.', 12, 0, 100, 0, 0, 0, 16466, 'Goblin Commoner to Goblin Commoner'),
+(20102, 0, 1, 'Legend says that the great beast Omen sleeps in the waters of Lake Elune''ara in Moonglade, only to appear once a year. But that''s just a legend.', 12, 0, 100, 0, 0, 0, 16465, 'Goblin Commoner to Goblin Commoner'),
+(20102, 0, 2, 'Have you seen the fireworks? This is the best time of year to buy them.', 12, 0, 100, 0, 0, 0, 16467, 'Goblin Commoner to Goblin Commoner'),
+(20102, 0, 3, 'The druids of Nighthaven are holding a great celebration in Moonglade for the Lunar Festival.', 12, 0, 100, 0, 0, 0, 16468, 'Goblin Commoner to Goblin Commoner');
+
+
+DELETE FROM `smart_scripts` WHERE `entryorguid`IN(18927,19171,19175,19177,19173,19172,19176,19148,19169,19178,20102) AND `source_type`=0 AND `id`IN(0,10);
+
+INSERT INTO `smart_scripts` (`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`, `comment`) VALUES
+(18927,0,0,0,1,0,100,0,3000,15000,45000,90000,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,'Human Commoner - OOC - Say'),
+(19171,0,0,0,1,0,100,0,3000,15000,45000,90000,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,'Dreani Commoner - OOC - Say'),
+(19175,0,0,0,1,0,100,0,3000,15000,45000,90000,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,'Orc Commoner - OOC - Say'),
+(19177,0,0,0,1,0,100,0,3000,15000,45000,90000,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,'Troll Commoner - OOC - Say'),
+(19173,0,0,0,1,0,100,0,3000,15000,45000,90000,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,'Night Elf Commoner - OOC - Say'),
+(19172,0,0,0,1,0,100,0,3000,15000,45000,90000,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,'Gnome Commoner - OOC - Say'),
+(19176,0,0,0,1,0,100,0,3000,15000,45000,90000,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,'Tauren Commoner - OOC - Say'),
+(19148,0,0,0,1,0,100,0,3000,15000,45000,90000,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,'Dwarf Commoner - OOC - Say'),
+(20102,0,0,0,1,0,100,0,3000,15000,45000,90000,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,'Goblin Commoner - OOC - Say'),
+(19178,0,0,0,1,0,100,0,3000,15000,45000,90000,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,'Forsaken Commoner - OOC - Say'),
+(19169,0,0,0,1,0,100,0,3000,15000,45000,90000,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,'Blood Elf Commoner - OOC - Say'),
+
+(18927,0,10,0,64,0,100,0,0,0,0,0,98,7898, 9662,0,0,0,0,7,0,0,0,0,0,0,0,'Human Commoner - On Gossip Hello - Send Gossip Menu'),
+(19148,0,10,0,64,0,100,0,0,0,0,0,98,7923, 9688,0,0,0,0,7,0,0,0,0,0,0,0,'Dwarf Commoner - On Gossip Hello - Send Gossip Menu'),
+(19169,0,10,0,64,0,100,0,0,0,0,0,98,7921, 9700,0,0,0,0,7,0,0,0,0,0,0,0,'Blood Elf Commoner - On Gossip Hello - Send Gossip Menu'),
+(19171,0,10,0,64,0,100,0,0,0,0,0,98,7922, 9696,0,0,0,0,7,0,0,0,0,0,0,0,'Draeni Commoner - On Gossip Hello - Send Gossip Menu'),
+(19172,0,10,0,64,0,100,0,0,0,0,0,98,7931, 1915,0,0,0,0,7,0,0,0,0,0,0,0,'Gnome Commoner - On Gossip Hello - Send Gossip Menu'),
+(19173,0,10,0,64,0,100,0,0,0,0,0,98,7924, 9692,0,0,0,0,7,0,0,0,0,0,0,0,'Night Elf Commoner - On Gossip Hello - Send Gossip Menu'),
+(19175,0,10,0,64,0,100,0,0,0,0,0,98,7925, 9704,0,0,0,0,7,0,0,0,0,0,0,0,'Orc Commoner - On Gossip Hello - Send Gossip Menu'),
+(19176,0,10,0,64,0,100,0,0,0,0,0,98,7926, 9708,0,0,0,0,7,0,0,0,0,0,0,0,'Tauren Commoner - On Gossip Hello - Send Gossip Menu'),
+(19177,0,10,0,64,0,100,0,0,0,0,0,98,7935, 9716,0,0,0,0,7,0,0,0,0,0,0,0,'Troll Commoner - On Gossip Hello - Send Gossip Menu'),
+(19178,0,10,0,64,0,100,0,0,0,0,0,98,7927, 9712,0,0,0,0,7,0,0,0,0,0,0,0,'Forsaken Commoner - On Gossip Hello - Send Gossip Menu'),
+(20102,0,10,0,64,0,100,0,0,0,0,0,98,8064, 9964,0,0,0,0,7,0,0,0,0,0,0,0,'Goblin Commoner - On Gossip Hello - Send Gossip Menu');
+
+
+
+DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=22 AND `SourceEntry` in(18927,19171,19175,19177,19173,19172,19176,19148,19169,19178,20102) AND `SourceGroup` IN(1,11);
+INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorType`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES
+(22, 1, 18927, 0, 0, 12, 1, 7, 0, 0, 0, 0, 0, '', 'Commoner - Luna Festival must be active'),
+(22, 1, 19148, 0, 0, 12, 1, 7, 0, 0, 0, 0, 0, '', 'Commoner - Luna Festival must be active'),
+(22, 1, 19169, 0, 0, 12, 1, 7, 0, 0, 0, 0, 0, '', 'Commoner - Luna Festival must be active'),
+(22, 1, 19171, 0, 0, 12, 1, 7, 0, 0, 0, 0, 0, '', 'Commoner - Luna Festival must be active'),
+(22, 1, 19172, 0, 0, 12, 1, 7, 0, 0, 0, 0, 0, '', 'Commoner - Luna Festival must be active'),
+(22, 1, 19173, 0, 0, 12, 1, 7, 0, 0, 0, 0, 0, '', 'Commoner - Luna Festival must be active'),
+(22, 1, 19175, 0, 0, 12, 1, 7, 0, 0, 0, 0, 0, '', 'Commoner - Luna Festival must be active'),
+(22, 1, 19176, 0, 0, 12, 1, 7, 0, 0, 0, 0, 0, '', 'Commoner - Luna Festival must be active'),
+(22, 1, 19177, 0, 0, 12, 1, 7, 0, 0, 0, 0, 0, '', 'Commoner - Luna Festival must be active'),
+(22, 1, 19178, 0, 0, 12, 1, 7, 0, 0, 0, 0, 0, '', 'Commoner - Luna Festival must be active'),
+(22, 1, 20102, 0, 0, 12, 1, 7, 0, 0, 0, 0, 0, '', 'Commoner - Luna Festival must be active'),
+
+(22, 11, 18927, 0, 0, 12, 1, 7, 0, 0, 0, 0, 0, '', 'Commoner - Luna Festival must be active'),
+(22, 11, 19148, 0, 0, 12, 1, 7, 0, 0, 0, 0, 0, '', 'Commoner - Luna Festival must be active'),
+(22, 11, 19169, 0, 0, 12, 1, 7, 0, 0, 0, 0, 0, '', 'Commoner - Luna Festival must be active'),
+(22, 11, 19171, 0, 0, 12, 1, 7, 0, 0, 0, 0, 0, '', 'Commoner - Luna Festival must be active'),
+(22, 11, 19172, 0, 0, 12, 1, 7, 0, 0, 0, 0, 0, '', 'Commoner - Luna Festival must be active'),
+(22, 11, 19173, 0, 0, 12, 1, 7, 0, 0, 0, 0, 0, '', 'Commoner - Luna Festival must be active'),
+(22, 11, 19175, 0, 0, 12, 1, 7, 0, 0, 0, 0, 0, '', 'Commoner - Luna Festival must be active'),
+(22, 11, 19176, 0, 0, 12, 1, 7, 0, 0, 0, 0, 0, '', 'Commoner - Luna Festival must be active'),
+(22, 11, 19177, 0, 0, 12, 1, 7, 0, 0, 0, 0, 0, '', 'Commoner - Luna Festival must be active'),
+(22, 11, 19178, 0, 0, 12, 1, 7, 0, 0, 0, 0, 0, '', 'Commoner - Luna Festival must be active'),
+(22, 11, 20102, 0, 0, 12, 1, 7, 0, 0, 0, 0, 0, '', 'Commoner - Luna Festival must be active');
+
+DELETE FROM `gossip_menu` WHERE `entry` IN(7931,7926,7925,7924,7898,7923,7921,7927,7935,7922,8064);
+INSERT INTO `gossip_menu` (`entry`, `text_id`) VALUES
+(7931, 1915), -- 19172
+(7926, 9708), -- 19176
+(7925, 9704), -- 19175*
+(7924, 9692), -- 19173*
+(7898, 9662), -- 18927*
+(7923, 9688), -- 19148*
+(7921, 9700), -- 19169*
+(7927, 9712), -- 19178*
+(7935, 9716), -- 19177*
+(7922, 9696), -- 19171*
+(8064, 9964); -- 20102*
+
+DELETE FROM `npc_text` WHERE `ID` IN(9715,9708);
+INSERT INTO `npc_text` (`ID`, `text0_0`, `text0_1`, `BroadcastTextID0`, `lang0`, `prob0`, `em0_0`, `em0_1`, `em0_2`, `em0_3`, `em0_4`, `em0_5`, `text1_0`, `text1_1`, `BroadcastTextID1`, `lang1`, `prob1`, `em1_0`, `em1_1`, `em1_2`, `em1_3`, `em1_4`, `em1_5`, `text2_0`, `text2_1`, `BroadcastTextID2`, `lang2`, `prob2`, `em2_0`, `em2_1`, `em2_2`, `em2_3`, `em2_4`, `em2_5`, `text3_0`, `text3_1`, `BroadcastTextID3`, `lang3`, `prob3`, `em3_0`, `em3_1`, `em3_2`, `em3_3`, `em3_4`, `em3_5`, `text4_0`, `text4_1`, `BroadcastTextID4`, `lang4`, `prob4`, `em4_0`, `em4_1`, `em4_2`, `em4_3`, `em4_4`, `em4_5`, `text5_0`, `text5_1`, `BroadcastTextID5`, `lang5`, `prob5`, `em5_0`, `em5_1`, `em5_2`, `em5_3`, `em5_4`, `em5_5`, `text6_0`, `text6_1`, `BroadcastTextID6`, `lang6`, `prob6`, `em6_0`, `em6_1`, `em6_2`, `em6_3`, `em6_4`, `em6_5`, `text7_0`, `text7_1`, `BroadcastTextID7`, `lang7`, `prob7`, `em7_0`, `em7_1`, `em7_2`, `em7_3`, `em7_4`, `em7_5`, `VerifiedBuild`) VALUES
+(9715, 'Go to Ironforge''s Mystic Ward and speak with the night elf druids there. They can transport you to Moonglade to join in the Lunar Festival celebration.', 'Go to Ironforge''s Mystic Ward and speak with the night elf druids there. They can transport you to Moonglade to join in the Lunar Festival celebration.', 16214, 0, 1, 0, 0, 0, 0, 0, 0, '', '', 0, 0, 0, 0, 0, 0, 0, 0, 0, '', '', 0, 0, 0, 0, 0, 0, 0, 0, 0, '', '', 0, 0, 0, 0, 0, 0, 0, 0, 0, '', '', 0, 0, 0, 0, 0, 0, 0, 0, 0, '', '', 0, 0, 0, 0, 0, 0, 0, 0, 0, '', '', 0, 0, 0, 0, 0, 0, 0, 0, 0, '', '', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
+(9708, 'The largest celebration of the Lunar Festival takes place in Moonglade. Druids will transport you there from the Elder Rise of Thunder Bluff.', 'The largest celebration of the Lunar Festival takes place in Moonglade. Druids will transport you there from the Elder Rise of Thunder Bluff.', 16201, 0, 1, 0, 0, 0, 0, 0, 0, '', '', 0, 0, 0, 0, 0, 0, 0, 0, 0, '', '', 0, 0, 0, 0, 0, 0, 0, 0, 0, '', '', 0, 0, 0, 0, 0, 0, 0, 0, 0, '', '', 0, 0, 0, 0, 0, 0, 0, 0, 0, '', '', 0, 0, 0, 0, 0, 0, 0, 0, 0, '', '', 0, 0, 0, 0, 0, 0, 0, 0, 0, '', '', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+
diff --git a/sql/updates/world/2015_02_17_01_world.sql b/sql/updates/world/2015_02_17_01_world.sql
new file mode 100644
index 00000000000..bcd15597b70
--- /dev/null
+++ b/sql/updates/world/2015_02_17_01_world.sql
@@ -0,0 +1,35 @@
+--
+DELETE FROM `smart_scripts` WHERE `entryorguid` IN (2248200,2203800) AND `source_type`=9 AND `id` IN (2, 3, 4);
+INSERT INTO `smart_scripts` (`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`, `comment`) VALUES
+(2248200, 9, 2, 0, 0, 0, 100, 0, 2000, 2000, 0, 0, 8, 2, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Mature Bone Sifter - Script - Set Agressive'),
+(2248200, 9, 3, 0, 0, 0, 100, 0, 0, 0, 0, 0, 19, 33554432, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Mature Bone Sifter - Script - Remove UnitFlag'),
+(2248200, 9, 4, 0, 0, 0, 100, 0, 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Mature Bone Sifter - Script - Root'),
+(2203800, 9, 2, 0, 0, 0, 100, 0, 2000, 2000, 0, 0, 8, 2, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Hai shulud <The Bone Emperor> - Script - Set Agressive'),
+(2203800, 9, 3, 0, 0, 0, 100, 0, 0, 0, 0, 0, 19, 33554432, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Hai shulud <The Bone Emperor> - Script - Remove UnitFlag'),
+(2203800, 9, 4, 0, 0, 0, 100, 0, 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Hai shulud <The Bone Emperor> - Script - Root');
+
+DELETE FROM `smart_scripts` WHERE `entryorguid`=16968 AND `source_type`=0;
+INSERT INTO `smart_scripts` (`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`, `comment`) VALUES
+(16968,0,0,1,4,0,100,0,0,0,0,0,19,33554432,0,0,0,0,0,1,0,0,0,0,0,0,0,'Tunneler - On Aggro - Remove UNIT_FLAG_NOT_SELECTABLE'),
+(16968,0,1,2,61,0,100,0,0,0,0,0,28,29147,0,0,0,0,0,1,0,0,0,0,0,0,0,'Tunneler - Link With Previous - Remove Tunnel Bore Passive'),
+(16968,0,2,3,61,0,100,0,0,0,0,0,11,37752,0,0,0,0,0,1,0,0,0,0,0,0,0,'Tunneler - Link With Previous - Cast Stand'),
+(16968,0,3,0,61,0,100,0,0,0,0,0,21,0,0,0,0,0,0,1,0,0,0,0,0,0,0,'Tunneler - Link With Previous - Root'),
+(16968,0,4,5,25,0,100,0,0,0,0,0,11,29147,0,0,0,0,0,1,0,0,0,0,0,0,0,'Tunneler - Spawn/Respawn/OOC - Cast Tunnel Bore Passive'),
+(16968,0,5,6,61,0,100,0,0,0,0,0,18,33554432,0,0,0,0,0,1,0,0,0,0,0,0,0,'Tunneler - Link With Previous Set UNIT_FLAG_NOT_SELECTABLE'),
+(16968,0,6,0,61,0,100,0,0,0,0,0,11,37751,0,0,0,0,0,1,0,0,0,0,0,0,0,'Tunneler - Link With Previous - Cast Submerge'),
+(16968,0,7,0,0,0,100,0,1000,1000,2100,4500,11,31747,0,0,0,0,0,2,0,0,0,0,0,0,0,'Tunneler - In Combat - Cast Poison'),
+(16968,0,8,0,0,0,100,0,10400,10400,45000,50000,11,32738,0,0,0,0,0,2,0,0,0,0,0,0,0,'Tunneler - In Combat - Cast Bore'),
+(16968,0,9,0,2,0,100,0,0,30,8000,8000,11,32714,1,0,0,0,0,1,0,0,0,0,0,0,0,"Tunneler - Between 0-30% Health - Cast 8599");
+
+UPDATE `creature_template` SET `AIName`='SmartAI' WHERE `entry`=21849;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=21849 AND `source_type`=0;
+INSERT INTO `smart_scripts` (`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`, `comment`) VALUES
+(21849,0,0,1,4,0,100,0,0,0,0,0,19,33554432,0,0,0,0,0,1,0,0,0,0,0,0,0,'Bone Crawler - On Aggro - Remove UNIT_FLAG_NOT_SELECTABLE'),
+(21849,0,1,2,61,0,100,0,0,0,0,0,28,38885,0,0,0,0,0,1,0,0,0,0,0,0,0,'Bone Crawler - Link With Previous - Remove Tunnel Bore Passive'),
+(21849,0,2,3,61,0,100,0,0,0,0,0,11,37752,0,0,0,0,0,1,0,0,0,0,0,0,0,'Bone Crawler - Link With Previous - Cast Stand'),
+(21849,0,3,0,61,0,100,0,0,0,0,0,21,0,0,0,0,0,0,1,0,0,0,0,0,0,0,'Bone Crawler - Link With Previous - Root'),
+(21849,0,4,5,25,0,100,0,0,0,0,0,11,38885,0,0,0,0,0,1,0,0,0,0,0,0,0,'Bone Crawler - Spawn/Respawn/OOC - Cast Tunnel Bore Passive'),
+(21849,0,5,6,61,0,100,0,0,0,0,0,18,33554432,0,0,0,0,0,1,0,0,0,0,0,0,0,'Bone Crawler - Link With Previous Set UNIT_FLAG_NOT_SELECTABLE'),
+(21849,0,6,0,61,0,100,0,0,0,0,0,11,37751,0,0,0,0,0,1,0,0,0,0,0,0,0,'Bone Crawler - Link With Previous - Cast Submerge'),
+(21849,0,7,0,0,0,100,0,1000,1000,2100,4500,11,31747,0,0,0,0,0,2,0,0,0,0,0,0,0,'Bone Crawler - In Combat - Cast Poison'),
+(21849,0,8,0,0,0,100,0,10400,10400,45000,50000,11,32738,0,0,0,0,0,2,0,0,0,0,0,0,0,'Bone Crawler - In Combat - Cast Bore');
diff --git a/sql/updates/world/2015_02_17_02_world.sql b/sql/updates/world/2015_02_17_02_world.sql
new file mode 100644
index 00000000000..4bbcde642e7
--- /dev/null
+++ b/sql/updates/world/2015_02_17_02_world.sql
@@ -0,0 +1,2 @@
+--
+DELETE FROM `smart_scripts` WHERE `entryorguid`=-56501;
diff --git a/sql/updates/world/2015_02_17_03_world.sql b/sql/updates/world/2015_02_17_03_world.sql
new file mode 100644
index 00000000000..5ef13948b75
--- /dev/null
+++ b/sql/updates/world/2015_02_17_03_world.sql
@@ -0,0 +1,12 @@
+--
+SET @CGUID := 49137;
+DELETE FROM `creature` WHERE `guid` IN (@CGUID);
+INSERT INTO `creature` (`guid`, `id`, `map`, `spawnMask`, `phaseMask`, `position_x`, `position_y`, `position_z`, `orientation`, `spawntimesecs`, `spawndist`, `MovementType`) VALUES
+(@CGUID, 30142, 571, 1, 1, 8392.7, -1970.14, 1461.84, 0.0948219, 600, 0, 0);
+
+SET @OGUID := 5501;
+DELETE FROM `gameobject` WHERE `guid`= @OGUID;
+INSERT INTO `gameobject` (`guid`, `id`, `map`, `spawnMask`, `phaseMask`, `position_x`, `position_y`, `position_z`, `orientation`, `spawntimesecs`, `rotation2`, `rotation3`, `animprogress`, `state`) VALUES
+(@OGUID, 192243, 571, 1, 1, 8531.9, -1971.44, 1467.57, -0.837757, 300, -0.406736, 0.913546, 100, 1);
+
+UPDATE `creature_template` SET `unit_flags`=32832 WHERE `entry`=29730;
diff --git a/sql/updates/world/2015_02_17_04_world.sql b/sql/updates/world/2015_02_17_04_world.sql
new file mode 100644
index 00000000000..68c1268eec2
--- /dev/null
+++ b/sql/updates/world/2015_02_17_04_world.sql
@@ -0,0 +1,142 @@
+--
+SET @CGUID := 49141;
+
+SET @Loken := 30396;
+SET @Thorim := 30399;
+SET @Veranus:= 30420;
+SET @Servant:= 30429;
+
+UPDATE `creature_template` SET `gossip_menu_id`=9928, `minlevel`=82, `maxlevel`=82, `npcflag`=1, `speed_walk`=4.8, `speed_run`=3.142857, `rank`=3, `unit_flags`=320, `unit_flags2`=2099200, `AIName`='SmartAI', `type_flags`=0 WHERE `entry`=@Thorim; -- thorim
+UPDATE `creature_template` SET `faction`=14, `speed_walk`=1.6, `speed_run`=1.857143, `unit_flags`=320, `unit_flags2`=2099200, `AIName`='SmartAI' WHERE `entry`=@Loken; -- loken
+UPDATE `creature_template` SET `speed_walk`=3.2, `speed_run`=1.428571, `unit_flags`=33088, `unit_flags2`=2099200, `AIName`='SmartAI', `HoverHeight`=2.1, `InhabitType`=4 WHERE `entry`=@Veranus;
+UPDATE `creature_template` SET `faction`=2102, `unit_flags`=320,`AIName`='SmartAI' WHERE `entry`=@Servant;
+
+DELETE FROM `smart_scripts` WHERE `entryorguid` IN(@Thorim*100,@Loken*100) AND `source_type`=9;
+DELETE FROM `smart_scripts` WHERE `entryorguid`IN(@Thorim,@Loken,@Veranus,@Servant) AND `source_type`=0;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@Loken,0,0,1,38,0,100,0,1,1,0,0,91,1,0,0,0,0,0,1,0,0,0,0,0,0,0,"Loken - On Data Set 1 1 - Set Bytes 1"),
+(@Loken,0,1,0,61,0,100,0,0,0,0,0,80,@Loken*100,2,0,0,0,0,1,0,0,0,0,0,0,0,"Loken - On Data Set 1 1 - Run Script"),
+(@Veranus,0,0,0,38,0,100,0,1,1,0,0,69,0,0,0,0,0,0,8,0,0,0,8609.171875, -636.665955, 967.317383, 2.124008,"Veranus - On Data Set 1 1 - move to pos"),
+(@Veranus,0,1,2,38,0,100,0,2,2,0,0,11,34427,0,0,0,0,0,1,0,0,0,0,0,0,0,"Veranus - On Data Set 2 2 - Cast Ethereal Teleport"),
+(@Veranus,0,2,0,61,0,100,0,0,0,0,0,41,1000,0,0,0,0,0,1,0,0,0,0,0,0,0,"Veranus - On Data Set 2 2 - Despawn After 1 Seconds"),
+(@Veranus,0,3,0,1,0,100,0,160000,160000,160000,160000,70,0,0,0,0,0,0,10,@CGUID,@Thorim,0,0,0,0,0,"Veranus - Ooc - respawn target"),
+(@Servant,0,0,1,38,0,100,0,2,2,0,0,11,34427,0,0,0,0,0,1,0,0,0,0,0,0,0,"Runeforged Servant <Servant of Loken> - On Data Set 2 2 - Cast Ethereal Teleport"),
+(@Servant,0,1,2,61,0,100,0,0,0,0,0,41,0,0,0,0,0,0,10,@CGUID,@Thorim,0,0,0,0,0,"Runeforged Servant <Servant of Loken> - On Data Set 2 2 - Despawn After 1 Seconds"),
+(@Servant,0,2,3,61,0,100,0,0,0,0,0,41,0,0,0,0,0,0,19,@Loken,30,0,0,0,0,0,"Runeforged Servant <Servant of Loken> - On Data Set 2 2 - Despawn After 1 Seconds"),
+(@Servant,0,3,0,61,0,100,0,0,0,0,0,41,1000,0,0,0,0,0,1,0,0,0,0,0,0,0,"Runeforged Servant <Servant of Loken> - On Data Set 2 2 - Despawn After 1 Seconds"),
+(@Thorim,0,0,1,62,0,100,0,9928,0,0,0,64,1,0,0,0,0,0,7,0,0,0,0,0,0,0,"Thorim - On Gossip Option select - Store Targetlist"),
+(@Thorim,0,1,2,61,0,100,0,0,0,0,0,72,0,0,0,0,0,0,7,0,0,0,0,0,0,0,"Thorim - On Gossip Option select - Close Gossip"),
+(@Thorim,0,2,3,61,0,100,0,0,0,0,0,28,54503,0,0,0,0,0,1,0,0,0,0,0,0,0,"Thorim - On Gossip Option select - remove aura"),
+(@Thorim,0,3,0,61,0,100,0,0,0,0,0,80,@Thorim*100,2,0,0,0,0,1,0,0,0,0,0,0,0,"Thorim - On Gossip Option select - Run Script"),
+(@Thorim,0,4,0,40,0,100,0,2,@Thorim,0,0,1,1,0,0,0,0,0,19,@Loken,30,0,0,0,0,0,"Thorim - On Reached WP2 - Say Line 2"),
+(@Thorim,0,5,0,40,0,100,0,3,@Thorim,0,0,101,0,0,0,0,0,0,1,0,0,0,0,0,0,0,"Thorim - On Reached WP3 - Set Home Position"),
+(@Thorim,0,6,0,8,0,100,0,56696,0,0,0,100,1,0,0,0,0,0,19,@Loken,30,0,0,0,0,0,"Thorim - On Spellhit (Loken - Defeat Thorim) - Send Target List to Loken"),
+(@Thorim,0,7,0,9,0,100,0,0,0,0,0,42,1,0,0,0,0,0,1,0,0,0,0,0,0,0,"Thorim - On Spawn - Set Invincibility hp"),
+(@Thorim,0,8,0,25,0,100,0,1,1,0,0,75,54503,0,0,0,0,0,1,0,0,0,0,0,0,0,"Thorim - On Reset - Add aura"),
+(@Loken*100,9,0,0,0,0,100,0,0,0,0,0,59,1,0,0,0,0,0,1,0,0,0,0,0,0,0,"Loken - Script - Set Run On"),
+(@Loken*100,9,1,0,0,0,100,0,0,0,0,0,17,30,0,0,0,0,0,1,0,0,0,0,0,0,0,"Loken - Script - set stand none"),
+(@Loken*100,9,2,0,0,0,100,0,2000,2000,0,0,11,56677,0,0,0,0,0,19,@Thorim,30,0,0,0,0,0,"Loken - Script - Cast Loken's Knockback"),
+(@Loken*100,9,3,0,0,0,100,0,3000,3000,0,0,69,0,0,0,0,0,0,8,0,0,0,8591.518555, -610.456604, 925.558228, 5.241327,"Loken - Script - Say Line 1"),
+(@Loken*100,9,5,0,0,0,100,0,5000,5000,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,"Loken - Script - Say Line 1"),
+(@Loken*100,9,6,0,0,0,100,0,1000,1000,0,0,5,25,0,0,0,0,0,1,0,0,0,0,0,0,0,"Loken - Script - Play emote 25"),
+(@Loken*100,9,7,0,0,0,100,0,5000,5000,0,0,69,0,0,0,0,0,0,8,0,0,0,8577.214844, -596.050659, 925.558289, 5.372476,"Loken - Script - Say Line 1"),
+(@Loken*100,9,8,0,0,0,100,0,7000,7000,0,0,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,"Loken - Script - Say Line 2"),
+(@Loken*100,9,9,0,0,0,100,0,7000,7000,0,0,1,2,0,0,0,0,0,1,0,0,0,0,0,0,0,"Loken - Script - Say Line 3"),
+(@Loken*100,9,10,0,0,0,100,0,6000,6000,0,0,1,3,0,0,0,0,0,1,0,0,0,0,0,0,0,"Loken - Script - Say Line 4"),
+(@Loken*100,9,11,0,0,0,100,0,1000,1000,0,0,75,56696,0,0,0,0,0,10,@CGUID,@Thorim,0,0,0,0,0,"Loken - Script - Cast Loken - Defeat Thorim"),
+(@Loken*100,9,12,0,0,0,100,0,0,0,0,0,11,46846,0,0,0,0,0,10,@CGUID,@Thorim,0,0,0,0,0,"Loken - Script - Cast Loken - Defeat Thorim"),
+(@Loken*100,9,13,0,0,0,100,0,1000,1000,0,0,45,1,1,0,0,0,0,10,@CGUID+1,@Veranus,0,0,0,0,0,"Loken - Script - Set Data 1 1 to Veranus"),
+(@Loken*100,9,14,0,0,0,100,0,5000,5000,0,0,1,4,0,0,0,0,0,1,0,0,0,0,0,0,0,"Loken - Script - Say Line 5"),
+(@Loken*100,9,15,0,0,0,100,0,7000,7000,0,0,1,5,0,0,0,0,0,1,0,0,0,0,0,0,0,"Loken - Script - Say Line 6"),
+(@Loken*100,9,16,0,0,0,100,0,0,0,0,0,12,@Servant,1,60000,0,0,0,8,0,0,0,8622.837,-605.7887,926.2864,4.433136,"Loken - Script - Spawn Runeforged Servant <Servant of Loken>"),
+(@Loken*100,9,17,0,0,0,100,0,0,0,0,0,12,@Servant,1,60000,0,0,0,8,0,0,0,8586.867,-564.764,925.6412,5.166174,"Loken - Script - Spawn Runeforged Servant <Servant of Loken>"),
+(@Loken*100,9,18,0,0,0,100,0,7000,7000,0,0,1,6,0,0,0,0,0,21,50,0,0,0,0,0,0,"Loken - Script - Say Line 7"),
+(@Loken*100,9,19,0,0,0,100,0,7000,7000,0,0,1,7,0,0,0,0,0,21,50,0,0,0,0,0,0,"Loken - Script - Say Line 8"),
+(@Loken*100,9,20,0,0,0,100,0,0,0,0,0,28,46846,0,0,0,0,0,10,@CGUID,@Thorim,0,0,0,0,0,"Loken - Script - Say Line 1"),
+(@Loken*100,9,21,0,0,0,100,0,5000,5000,0,0,11,56941,0,0,0,0,0,1,0,0,0,0,0,0,0,"Loken - Script - Cast Witness the Reckoning"),
+(@Loken*100,9,22,0,0,0,100,0,0,0,0,0,45,2,2,0,0,0,0,10,@CGUID+1,@Veranus,0,0,0,0,0,"Loken - Script - Set Data 2 2 to Veranus"),
+(@Loken*100,9,23,0,0,0,100,0,0,0,0,0,45,2,2,0,0,0,0,9,30429,0,200,0,0,0,0,"Loken - Script - Set Data 2 2 to Runeforged Servant <Servant of Loken>"),
+(@Thorim*100,9,0,0,0,0,100,0,0,0,0,0,81,0,0,0,0,0,0,1,0,0,0,0,0,0,0,"Thorim - Script - Set NPC Flags"),
+(@Thorim*100,9,1,0,0,0,100,0,0,0,0,0,12,@Loken,1,180000,0,0,0,8,0,0,0,8564.411,-580.366,925.6412,5.5676,"Thorim - Script - Spawn Loken"),
+(@Thorim*100,9,2,0,0,0,100,0,0,0,0,0,1,0,0,0,0,0,0,7,0,0,0,0,0,0,0,"Thorim - Script - Say Line 1"),
+(@Thorim*100,9,3,0,0,0,100,0,3000,3000,0,0,53,0,@Thorim,0,0,0,0,1,0,0,0,0,0,0,0,"Thorim - Script - Start WP"),
+(@Thorim*100,9,4,0,0,0,100,0,15000,15000,0,0,1,2,0,0,0,0,0,1,0,0,0,0,0,0,0,"Thorim - Script - Say Line 3"),
+(@Thorim*100,9,5,0,0,0,100,0,2000,2000,0,0,5,333,0,0,0,0,0,1,0,0,0,0,0,0,0,"Thorim - Script - Play Emote 333"),
+(@Thorim*100,9,6,0,0,0,100,0,4000,4000,0,0,45,1,1,0,0,0,0,19,@Loken,30,0,0,0,0,0,"Thorim - Script - Set Data 1 1 to Loken"),
+(@Thorim*100,9,7,0,0,0,100,0,6000,6000,0,0,59,1,0,0,0,0,0,1,0,0,0,0,0,0,0,"Thorim - Script - Set Run On"),
+(@Thorim*100,9,8,0,0,0,100,0,0,0,0,0,46,20,0,0,0,0,0,1,0,0,0,0,0,0,0,"Thorim - Script - Cast Move to Loken"),
+(@Thorim*100,9,9,0,0,0,100,0,6000,6000,0,0,11,56688,0,0,0,0,0,19,@Loken,30,0,0,0,0,0,"Thorim - Script - Cast Thorim's Knockback"),
+(@Thorim*100,9,10,0,0,0,100,0,2000,2000,0,0,1,3,0,0,0,0,0,1,0,0,0,0,0,0,0,"Thorim - Script - Say Line 4"),
+(@Thorim*100,9,11,0,0,0,100,0,2000,2000,0,0,1,4,0,0,0,0,0,1,0,0,0,0,0,0,0,"Thorim - Script - Say Line 5"),
+(@Thorim*100,9,12,0,0,0,100,0,2000,2000,0,0,1,5,0,0,0,0,0,1,0,0,0,0,0,0,0,"Thorim - Script - Say Line 6"),
+(@Thorim*100,9,13,0,0,0,100,0,1000,1000,0,0,11,56694,0,0,0,0,0,19,@Loken,30,0,0,0,0,0,"Thorim - Script - Cast Lightning Fury"),
+(@Thorim*100,9,14,0,0,0,100,0,3000,3000,0,0,11,56695,0,0,0,0,0,19,@Loken,30,0,0,0,0,0,"Thorim - Script - Cast Thorim's Hammer");
+
+DELETE FROM `spell_area` WHERE `spell`=54504 AND `area` IN(4543,4445);
+INSERT INTO `spell_area` (`spell`, `area`, `quest_start`, `quest_end`, `aura_spell`, `racemask`, `gender`, `autocast`, `quest_start_status`, `quest_end_status`) VALUES
+(54504, 4543, 13047, 13047, 0, 0, 2, 1, 8, 11),
+(54504, 4445, 13047, 13047, 0, 0, 2, 1, 8, 11);
+
+DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=15 AND `SourceGroup`=9928;
+INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorType`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES
+(15, 9928, 0, 0, 0, 9, 0, 13047, 0, 0, 0, 0, 0, '', 'Gossip option requires the reckoning taken');
+
+DELETE from `conditions` WHERE `SourceTypeOrReferenceId`=13 AND `SourceEntry`=56677;
+INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES
+(13, 1, 56677, 0, 31, 3, @Thorim, 0, 0, '', 'Loken''s Knockback');
+
+DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=13 AND `SourceEntry`=56688;
+INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES
+(13, 1, 56688, 0, 31, 3, @Loken, 0, 0, '', 'Thorim''s Knockback');
+
+DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=13 AND `SourceEntry`=56694;
+INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES
+(13, 3, 56694, 0, 31, 3, @Loken, 0, 0, '', 'Thorim''s Knockback');
+
+DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=13 AND `SourceEntry`=56695;
+INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES
+(13, 1, 56695, 0, 31, 3, @Loken, 0, 0, '', 'Thorim''s hammer');
+
+DELETE FROM `creature_text` WHERE `entry` IN(@Thorim,@Loken);
+INSERT INTO `creature_text` (`entry`, `groupid`, `id`, `text`, `type`, `language`, `probability`, `emote`, `duration`, `sound`, `comment`, `BroadcastTextId`) VALUES
+(@Thorim, 0, 0, 'It is time I put an end to my brother''s madness.', 12, 0, 100, 0, 0, 0, 'Thorim', 31078),
+(@Thorim, 1, 0, 'Loken!!', 14, 0, 100, 15, 0, 0, 'Thorim', 31079),
+(@Thorim, 2, 0, 'Stand up and fight me, you worthless traitor! ', 14, 0, 100, 53, 0, 0, 'Thorim', 31080),
+(@Thorim, 3, 0, 'Do not dare...', 12, 0, 100, 0, 0, 0, 'Thorim', 31083),
+(@Thorim, 4, 0, 'Speak...', 12, 0, 100, 0, 0, 0, 'Thorim', 31116),
+(@Thorim, 5, 0, 'Her name!!', 12, 0, 100, 0, 0, 0, 'Thorim', 31117),
+(@Loken, 0, 0, 'You seem eager to join your beloved Sif, brother.', 12, 0, 100, 0, 0, 0, 'Loken', 31082),
+(@Loken, 1, 0, 'ENOUGH!', 14, 0, 100, 15, 0, 0, 'Loken', 31126),
+(@Loken, 2, 0, 'Looks like you can still best me in a fair fight, little brother.', 12, 0, 100, 1, 0, 0, 'Loken', 31110),
+(@Loken, 3, 0, 'Unfortunately for you.... this fight is anything but fair!', 12, 0, 100, 1, 0, 0, 'Loken', 31111),
+(@Loken, 4, 0, 'Thanks to your little friend, you''ve left the Temple of Storms, where you were at your strongest. Instead we fight closer to my master''s power.', 12, 0, 100, 0, 0, 0, 'Loken', 31112),
+(@Loken, 5, 0, 'Minions! Take my brother and his drake to their new dwellings. Make sure the beast makes it alive. I have special plans for the broodmother.', 12, 0, 100, 0, 0, 0, 'Loken', 31128),
+(@Loken, 6, 0, 'As for your life, mortal. I will be generous. After all... why would I destroy my most useful servant? I waited for you for weeks inside that Hyldnir mine.', 12, 0, 100, 0, 0, 0, 'Loken', 31127),
+(@Loken, 7, 0, 'The shape wasn''t mine, of course. And had you not been so reckless, you would''ve seen past my illusion. But you came through for me, and for that... I must thank you!', 12, 0, 100, 0, 0, 0, 'Loken', 31133);
+
+DELETE FROM `creature_template_addon` WHERE `entry` IN(@Thorim,@Loken,@Veranus);
+INSERT INTO `creature_template_addon` (`entry`, `mount`, `bytes1`, `bytes2`, `auras`) VALUES
+(@Thorim, 0, 0x10000, 0x1, '54503'), -- 30399 - 54503
+(@Loken, 0, 0x1, 0x1, ''), -- 30396
+(@Veranus, 0, 0x3010000, 0x1, '54503'); -- 30420 - 54503
+
+DELETE FROM `creature` WHERE `id` IN(@Thorim,@Veranus);
+INSERT INTO `creature` (`guid`, `id`, `map`, `spawnMask`, `phaseMask`, `position_x`, `position_y`, `position_z`, `orientation`, `spawntimesecs`, `spawndist`, `MovementType`) VALUES
+(@CGUID+0, @Thorim, 571, 1, 1, 8703.806, -714.0443, 934.9764, 2.321288, 120, 0, 0), -- 30399 (Area: 67)
+(@CGUID+1, @Veranus, 571, 1, 1, 8711.395, -754.7941, 955.1224, 2.338741, 120, 0, 0); -- 30420 (Area: 67)
+
+DELETE FROM `gossip_menu` WHERE `entry`=9928;
+INSERT INTO `gossip_menu` (`entry`, `text_id`) VALUES
+(9928, 13800); -- 30399
+
+DELETE FROM `gossip_menu_option` WHERE `menu_id`=9928;
+INSERT INTO `gossip_menu_option` (`menu_id`, `id`, `option_icon`, `option_text`, `OptionBroadcastTextID`, `option_id`, `npc_option_npcflag`, `action_menu_id`, `action_poi_id`, `box_coded`, `box_money`, `box_text`, `BoxBroadcastTextID`) VALUES
+(9928, 0, 0, 'I''m with you, Thorim.', 0, 1, 1, 0, 0, 0, 0, '', 31225);
+
+DELETE FROM `waypoints` WHERE `entry` IN(@Thorim);
+INSERT INTO `waypoints` (`entry`, `pointid`, `position_x`, `position_y`, `position_z`, `point_comment`) VALUES
+(@Thorim, 1,8695.301, -703.0229, 933.7817, 'Thorim'),
+(@Thorim, 2,8665.801, -675.7729, 927.5317, 'Thorim'),
+(@Thorim, 3,8573.930664, -591.286133, 925.558167 , 'Thorim');
+
+UPDATE creature_template SET InhabitType=4 WHERE entry IN (29747, 29790);
diff --git a/sql/updates/world/2015_02_17_05_world.sql b/sql/updates/world/2015_02_17_05_world.sql
new file mode 100644
index 00000000000..807f4f81a5d
--- /dev/null
+++ b/sql/updates/world/2015_02_17_05_world.sql
@@ -0,0 +1 @@
+UPDATE `gossip_menu` SET `text_id`=9715 WHERE `entry`=7931 AND `text_id`=1915;
diff --git a/sql/updates/world/2015_02_18_00_world.sql b/sql/updates/world/2015_02_18_00_world.sql
new file mode 100644
index 00000000000..edf6aae06f0
--- /dev/null
+++ b/sql/updates/world/2015_02_18_00_world.sql
@@ -0,0 +1,54 @@
+-- Mug'gok SAI
+SET @ENTRY := 18475;
+UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY*100+00 AND `source_type`=9;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,0,0,0,25,0,100,0,0,0,0,0,53,0,18475,1,0,0,2,1,0,0,0,0,0,0,0,"Mug'gok - On Reset - Start Waypoint"),
+(@ENTRY,0,1,0,40,0,100,0,1,18475,0,0,80,@ENTRY*100+00,2,0,0,0,0,1,0,0,0,0,0,0,0,"Mug'gok - On Waypoint 1 Reached - Run Script"),
+(@ENTRY,0,2,0,40,0,100,0,1,18475,0,0,54,10000,0,0,0,0,0,1,0,0,0,0,0,0,0,"Mug'gok - On Waypoint 1 Reached - Pause Waypoint"),
+(@ENTRY*100+00,9,0,0,0,0,100,0,2000,2000,0,0,1,0,3000,0,0,0,0,1,0,0,0,0,0,0,0,"Mug'gok - On Script - Say Line 0"),
+(@ENTRY*100+00,9,1,0,0,0,100,0,2000,2000,0,0,1,1,3000,0,0,0,0,1,0,0,0,0,0,0,0,"Mug'gok - On Script - Say Line 1"),
+(@ENTRY*100+00,9,3,0,0,0,100,0,2000,2000,0,0,1,2,3000,0,0,0,0,1,0,0,0,0,0,0,0,"Mug'gok - On Script - Say Line 2");
+
+-- Add text
+DELETE FROM `creature_text` WHERE `entry`=18475;
+INSERT INTO `creature_text` (`entry`, `groupid`, `id`, `text`, `type`, `language`, `probability`, `emote`, `duration`, `sound`, `comment`, `BroadcastTextID`) VALUES
+(18475, 0, 0, 'Come out, little birdies! Mug''gok want to play!', 14, 0, 100, 0, 0, 0, 'Muggok', 15463),
+(18475, 1, 0, 'No hurt Mug''gok''s feelings, bird-men!', 14, 0, 100, 0, 0, 0, 'Muggok', 15464),
+(18475, 2, 0, 'Fine! Birdies be dat way! Mug''gok find new friends!', 14, 0, 100, 14, 0, 0, 'Muggok', 15465);
+
+-- Add waypoints
+DELETE FROM `waypoints` WHERE `entry`=18475;
+INSERT INTO `waypoints` (`entry`, `pointid`, `position_x`, `position_y`, `position_z`, `point_comment`) VALUES
+(18475, 1, -3586.119,5789.734,-4.249763, 'Muggok'),
+(18475, 2, -3607.362,5802.457,-4.015522, 'Muggok'),
+(18475, 3, -3611.601,5813.162,-4.286913, 'Muggok'),
+(18475, 4, -3620.696,5832.479,0.1701524, 'Muggok'),
+(18475, 5, -3632.274,5845.131,-0.2069848, 'Muggok'),
+(18475, 6, -3644.935,5868.452,-4.990351, 'Muggok'),
+(18475, 7, -3637.306,5910.221,-21.84441, 'Muggok'),
+(18475, 8, -3641.046,5941.752,-30.85709, 'Muggok'),
+(18475, 9, -3638.008,5970.188,-22.30242, 'Muggok'),
+(18475, 10, -3625.294,5984.689,-19.98056, 'Muggok'),
+(18475, 11, -3593.81,5984.915,-30.74051, 'Muggok'),
+(18475, 12, -3560.429,5994.253,-34.44781, 'Muggok'),
+(18475, 13, -3533.398,6024.583,-24.52451, 'Muggok'),
+(18475, 14, -3525.008,6048.768,-20.22229, 'Muggok'),
+(18475, 15, -3509.135,6060.514,-15.46761, 'Muggok'),
+(18475, 16, -3465.905,6061.523,-15.65, 'Muggok'),
+(18475, 17, -3455.743,6054.097,-12.08964, 'Muggok'),
+(18475, 18, -3452,6032.292,-14.2308, 'Muggok'),
+(18475, 19, -3449.686,6012.386,-17.47238, 'Muggok'),
+(18475, 20, -3443.185,5993.315,-23.15056, 'Muggok'),
+(18475, 21, -3440.388,5986.851,-24.24662, 'Muggok'),
+(18475, 22, -3435.465,5956.201,-24.91395, 'Muggok'),
+(18475, 23, -3446.49,5924.918,-33.08622, 'Muggok'),
+(18475, 24, -3466.203,5894.721,-28.9427, 'Muggok'),
+(18475, 25, -3483.424,5870.367,-23.49757, 'Muggok'),
+(18475, 26, -3495.208,5849.559,-15.93699, 'Muggok'),
+(18475, 27, -3507.46,5820.458,-12.90878, 'Muggok'),
+(18475, 28, -3519.906,5799.604,-7.427849, 'Muggok'),
+(18475, 29, -3532.312,5789.58,-6.70218, 'Muggok'),
+(18475, 30, -3553.792,5784.59,-4.330991, 'Muggok'),
+(18475, 31, -3562.554,5785.313,-1.650567, 'Muggok');
diff --git a/sql/updates/world/2015_02_18_01_world.sql b/sql/updates/world/2015_02_18_01_world.sql
new file mode 100644
index 00000000000..5c6c879a83a
--- /dev/null
+++ b/sql/updates/world/2015_02_18_01_world.sql
@@ -0,0 +1,11 @@
+--
+SET @ENTRY := 178905;
+SET @Scion:= 13696;
+UPDATE `gameobject_template` SET `AIName`="SmartGameObjectAI" WHERE `entry`=@ENTRY;
+UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry` IN (@Scion);
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=1;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@Scion AND `source_type`=0;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,1,0,0,64,0,100,0,0,0,0,0,12,13696,2,60000,0,0,0,1,0,0,0,0,0,0,0,"Vylestem Vine - On Gossip Hello - Summon Creature 'Noxxious Scion'"),
+(@Scion,0,0,0,4,0,100,1,0,0,0,0,11,21883,0,0,0,0,0,1,0,0,0,0,0,0,0,"Noxxious Scion - On Aggro -Cast 21883"),
+(@Scion,0,1,0,63,0,100,0,0,0,0,0,49,0,0,0,0,0,0,21,20,0,0,0,0,0,0,"Noxxious Scion - On Just created - Attack");
diff --git a/sql/updates/world/2015_02_18_02_world.sql b/sql/updates/world/2015_02_18_02_world.sql
new file mode 100644
index 00000000000..66d7951d719
--- /dev/null
+++ b/sql/updates/world/2015_02_18_02_world.sql
@@ -0,0 +1,7 @@
+--
+UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry` IN (31198, 31150);
+DELETE FROM `smart_scripts` WHERE `entryorguid` IN (31198, 31150) AND `source_type`=0;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(31150,0,0,0,0,0,100,0,2000,8000,12000,15000,11,60678,0,0,0,0,0,2,0,0,0,0.0,0.0,0.0,0.0,"Plagued Fiend - IC - Plague Bite"),
+(31198,0,0,0,0,0,100,0,2000,2000,15000,20000,11,38971,0,0,0,0,0,2,0,0,0,0.0,0.0,0.0,0.0,"Coprous the Defiled - IC - Cast Acid Geyser"),
+(31198,0,1,0,0,0,100,0,5000,5000,10000,10000,11,5164,0,0,0,0,0,2,0,0,0,0.0,0.0,0.0,0.0,"Coprous the Defiled - IC - Cast Knockdown");
diff --git a/sql/updates/world/2015_02_18_03_world.sql b/sql/updates/world/2015_02_18_03_world.sql
new file mode 100644
index 00000000000..6a4c12347a3
--- /dev/null
+++ b/sql/updates/world/2015_02_18_03_world.sql
@@ -0,0 +1,4 @@
+--
+DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=13 AND `SourceGroup`=1 AND `SourceEntry`=52654;
+INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorType`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES
+(13, 1, 52654, 0, 0, 31, 0, 3, 28823, 0, 0, 0, 0, '', 'Temper only target Volkhan\'s Anvil');
diff --git a/sql/updates/world/2015_02_19_00_world.sql b/sql/updates/world/2015_02_19_00_world.sql
new file mode 100644
index 00000000000..d0411d68c66
--- /dev/null
+++ b/sql/updates/world/2015_02_19_00_world.sql
@@ -0,0 +1,427 @@
+--
+DELETE FROM `creature_template_addon` WHERE `entry` IN (25760, 25622, 25615);
+INSERT INTO `creature_template_addon` (`entry`, `path_id`, `mount`, `bytes1`, `bytes2`, `emote`, `auras`) VALUES
+(25760, 0, 0, 0, 0, 45, NULL),
+(25622, 0, 0, 0, 0, 173, NULL),
+(25615, 0, 0, 0, 0, 0, '45797');
+
+UPDATE `creature_addon` SET `emote`=36 WHERE `guid`=102838;
+
+UPDATE `creature` SET `spawndist`=9, `MovementType`=1 WHERE `id` IN (26202, 25715, 25668, 25791, 25792);
+
+UPDATE `creature` SET `spawndist`=9, `MovementType`=1 WHERE `id` IN (26126);
+
+UPDATE `creature` SET `spawndist`=13, `MovementType`=1 WHERE `id` IN (25452, 25615);
+
+UPDATE `creature` SET `MovementType`=0 WHERE `guid`=122669;
+
+DELETE FROM `creature_formations` WHERE `leaderGUID`=111466;
+INSERT INTO `creature_formations` (`leaderGUID`, `memberGUID`, `dist`, `angle`, `groupAI`, `point_1`, `point_2`) VALUES
+(111466, 111466, 0, 0, 0, 0, 0),
+(111466, 111467, 5, 10, 0, 0, 0);
+
+-- Pathing for Entry: 26790 'TDB FORMAT'
+SET @NPC := 111466;
+SET @PATH := @NPC * 10;
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=3269.226,`position_y`=4429.583,`position_z`=25.58942 WHERE `guid`=@NPC;
+DELETE FROM `creature_addon` WHERE `guid`=@NPC;
+INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (@NPC,@PATH,0,0,1,0, '');
+DELETE FROM `waypoint_data` WHERE `id`=@PATH;
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES
+(@PATH,1,3269.226,4429.583,25.58942,0,0,0,0,100,0),
+(@PATH,2,3267.759,4388,25.7008,0,0,0,0,100,0),
+(@PATH,3,3267.792,4381.39,25.73712,0,0,0,0,100,0),
+(@PATH,4,3278.066,4307.007,24.88556,0,0,0,0,100,0),
+(@PATH,5,3279.909,4296.206,24.66411,0,0,0,0,100,0),
+(@PATH,6,3295.526,4235.11,26.38262,0,0,0,0,100,0),
+(@PATH,7,3300.244,4216.931,27.75196,0,0,0,0,100,0),
+(@PATH,8,3318.573,4152.362,27.67955,0,0,0,0,100,0),
+(@PATH,9,3325.382,4131.279,26.32579,0,0,0,0,100,0),
+(@PATH,10,3332.996,4089.244,27.17685,0,0,0,0,100,0),
+(@PATH,11,3343.786,4049.672,25.98749,0,0,0,0,100,0),
+(@PATH,12,3363.78,4008.359,26.03116,0,0,0,0,100,0),
+(@PATH,13,3366.464,4003.271,25.94505,0,0,0,0,100,0),
+(@PATH,14,3425.143,4003.964,27.52853,0,0,0,0,100,0),
+(@PATH,15,3476.093,4013.513,26.82531,0,0,0,0,100,0),
+(@PATH,16,3515.465,4026.42,22.9796,0,0,0,0,100,0),
+(@PATH,17,3530.343,4051.534,21.97854,0,0,0,0,100,0),
+(@PATH,18,3552.293,4122.889,21.95212,0,0,0,0,100,0),
+(@PATH,19,3590.191,4148.155,21.84193,0,0,0,0,100,0),
+(@PATH,20,3620.669,4159.591,25.41138,0,0,0,0,100,0),
+(@PATH,21,3659.4,4169.95,25.3229,0,0,0,0,100,0),
+(@PATH,22,3700.533,4186.467,24.96351,0,0,0,0,100,0),
+(@PATH,23,3743.046,4216.556,24.08723,0,0,0,0,100,0),
+(@PATH,24,3771.806,4239.74,25.29598,0,0,0,0,100,0),
+(@PATH,25,3820.626,4241.001,27.25442,0,0,0,0,100,0),
+(@PATH,26,3848.42,4209.31,28.84864,0,0,0,0,100,0),
+(@PATH,27,3840.634,4170.563,28.2758,0,0,0,0,100,0),
+(@PATH,28,3804.119,4155.879,27.68908,0,0,0,0,100,0),
+(@PATH,29,3767.293,4171.405,26.47837,0,0,0,0,100,0),
+(@PATH,30,3739.984,4183.705,24.70092,0,0,0,0,100,0),
+(@PATH,31,3695.544,4177.419,25.40162,0,0,0,0,100,0),
+(@PATH,32,3690.549,4175.297,25.46773,0,0,0,0,100,0),
+(@PATH,33,3664.658,4165.97,25.39618,0,0,0,0,100,0),
+(@PATH,34,3608.881,4156.498,24.01619,0,0,0,0,100,0),
+(@PATH,35,3562.48,4159.697,23.3773,0,0,0,0,100,0),
+(@PATH,36,3545.413,4159.953,22.43779,0,0,0,0,100,0),
+(@PATH,37,3526.568,4167.223,15.17734,0,0,0,0,100,0),
+(@PATH,38,3522.761,4171.347,12.94395,0,0,0,0,100,0),
+(@PATH,39,3513.761,4183.413,12.85036,0,0,0,0,100,0),
+(@PATH,40,3521.258,4190.762,12.85036,0,0,0,0,100,0),
+(@PATH,41,3529.055,4194.656,12.85036,0,0,0,0,100,0),
+(@PATH,42,3537.065,4186.435,12.85036,0,0,0,0,100,0),
+(@PATH,43,3549.637,4182.573,12.84298,0,0,0,0,100,0),
+(@PATH,44,3560.2,4184.638,12.84456,0,0,0,0,100,0),
+(@PATH,45,3551.881,4191.742,12.85036,0,0,0,0,100,0),
+(@PATH,46,3552.376,4284.875,12.60797,0,0,0,0,100,0),
+(@PATH,47,3537.689,4185.746,12.85036,0,0,0,0,100,0),
+(@PATH,48,3535.854,4184.324,12.85036,0,0,0,0,100,0),
+(@PATH,49,3526.616,4197.904,12.85036,0,0,0,0,100,0),
+(@PATH,50,3514.75,4185.95,12.85036,0,0,0,0,100,0),
+(@PATH,51,3487.793,4170.192,17.39668,0,0,0,0,100,0),
+(@PATH,52,3474.217,4172.794,17.44868,0,0,0,0,100,0),
+(@PATH,53,3466.45,4161.327,17.44301,0,0,0,0,100,0),
+(@PATH,54,3463.186,4144.002,17.44657,0,0,0,0,100,0),
+(@PATH,55,3461.733,4133.489,15.50942,0,0,0,0,100,0),
+(@PATH,56,3461.425,4131.252,15.57042,0,0,0,0,100,0),
+(@PATH,57,3440.413,4107.955,16.253,0,0,0,0,100,0),
+(@PATH,58,3439.38,4106.382,16.33916,0,0,0,0,100,0),
+(@PATH,59,3384.195,4062.901,19.78522,0,0,0,0,100,0),
+(@PATH,60,3350.907,4085.523,26.59955,0,0,0,0,100,0),
+(@PATH,61,3336.268,4101.299,25.10432,0,0,0,0,100,0),
+(@PATH,62,3313.968,4123.463,25.70841,0,0,0,0,100,0),
+(@PATH,63,3298.833,4136.27,25.76038,0,0,0,0,100,0),
+(@PATH,64,3284.301,4171.881,25.73615,0,0,0,0,100,0),
+(@PATH,65,3260.152,4249.911,26.19264,0,0,0,0,100,0),
+(@PATH,66,3265.231,4272.233,25.12194,0,0,0,0,100,0),
+(@PATH,67,3267.608,4324.161,25.83903,0,0,0,0,100,0),
+(@PATH,68,3266.102,4333.994,26.12407,0,0,0,0,100,0),
+(@PATH,69,3269.841,4402.301,25.18758,0,0,0,0,100,0),
+(@PATH,70,3287.93,4442.964,24.90842,0,0,0,0,100,0),
+(@PATH,71,3330.486,4488.953,25.63785,0,0,0,0,100,0),
+(@PATH,72,3346.958,4513.736,25.21837,0,0,0,0,100,0),
+(@PATH,73,3370.701,4574.729,28.1356,0,0,0,0,100,0),
+(@PATH,74,3329.835,4909.289,31.98566,0,0,0,0,100,0),
+(@PATH,75,3260.729,4889.575,31.59256,0,0,0,0,100,0),
+(@PATH,76,3254.577,4883.116,30.8572,0,0,0,0,100,0),
+(@PATH,77,3244.599,4836.884,30.49381,0,0,0,0,100,0),
+(@PATH,78,3274.862,4794.816,31.06407,0,0,0,0,100,0),
+(@PATH,79,3312.659,4774.863,32.49248,0,0,0,0,100,0),
+(@PATH,80,3349.351,4758.671,31.47926,0,0,0,0,100,0),
+(@PATH,81,3287.93,4442.964,24.90842,0,0,0,0,100,0),
+(@PATH,82,3330.486,4488.953,25.63785,0,0,0,0,100,0),
+(@PATH,83,3346.958,4513.736,25.21837,0,0,0,0,100,0),
+(@PATH,84,3370.701,4574.729,28.1356,0,0,0,0,100,0);
+-- 0x1C39AC47601A298000000B00005AED7E .go 3269.226 4429.583 25.58942
+
+-- Pathing for Entry: 25793 'TDB FORMAT'
+SET @NPC := 57171;
+SET @PATH := @NPC * 10;
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=3561.628,`position_y`=5005.68,`position_z`=-1.416187 WHERE `guid`=@NPC;
+DELETE FROM `creature_addon` WHERE `guid`=@NPC;
+INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (@NPC,@PATH,0,0,1,0, '');
+DELETE FROM `waypoint_data` WHERE `id`=@PATH;
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES
+(@PATH,1,3561.628,5005.68,-1.416187,0,0,0,0,100,0),
+(@PATH,2,3561.647,5005.603,-1.154766,0,0,0,0,100,0),
+(@PATH,3,3548.455,4987.43,-1.165261,0,0,0,0,100,0),
+(@PATH,4,3548.445,4987.507,-1.393345,0,0,0,0,100,0),
+(@PATH,5,3548.703,4987.758,-1.156939,0,0,0,0,100,0),
+(@PATH,6,3561.752,5006.026,-1.164443,0,0,0,0,100,0),
+(@PATH,7,3561.628,5005.68,-1.416187,0,0,0,0,100,0);
+-- 0x1C39AC47601930400000A3000065B380 .go 3561.628 5005.68 -1.416187
+
+-- Pathing for Entry: 25619 'TDB FORMAT'
+SET @NPC := 57156;
+SET @PATH := @NPC * 10;
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=3653.617,`position_y`=4706.431,`position_z`=-12.93513 WHERE `guid`=@NPC;
+DELETE FROM `creature_addon` WHERE `guid`=@NPC;
+INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (@NPC,@PATH,0,0,1,0, '');
+DELETE FROM `waypoint_data` WHERE `id`=@PATH;
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES
+(@PATH,1,3653.617,4706.431,-12.93513,0,0,0,0,100,0),
+(@PATH,2,3644.772,4705.505,-13.09717,0,0,0,0,100,0),
+(@PATH,3,3650.718,4705.053,-12.68797,0,0,0,0,100,0),
+(@PATH,4,3657.83,4709.773,-12.6719,0,0,0,0,100,0),
+(@PATH,5,3662.773,4713.923,-12.66263,0,0,0,0,100,0),
+(@PATH,6,3683.912,4744.512,-13.18753,0,0,0,0,100,0),
+(@PATH,7,3684.609,4746.4,-13.26137,0,0,0,0,100,0),
+(@PATH,8,3681.26,4750.936,-12.83029,0,0,0,0,100,0),
+(@PATH,9,3677.817,4771.657,-12.96236,0,0,0,0,100,0),
+(@PATH,10,3677.802,4771.346,-13.06311,0,0,0,0,100,0),
+(@PATH,11,3678.06,4771.458,-12.99139,0,0,0,0,100,0),
+(@PATH,12,3683.749,4747.838,-13.2233,0,0,0,0,100,0),
+(@PATH,13,3683.588,4743.549,-12.92916,0,0,0,0,100,0),
+(@PATH,14,3676.425,4727.065,-12.68113,0,0,0,0,100,0),
+(@PATH,15,3653.484,4706.284,-12.93378,0,0,0,0,100,0),
+(@PATH,16,3644.924,4705.583,-13.21565,0,0,0,0,100,0);
+-- 0x1C39AC47601904C000000C00006399A7 .go 3653.617 4706.431 -12.93513
+
+-- Pathing for Entry: 25619 'TDB FORMAT'
+SET @NPC := 57154;
+SET @PATH := @NPC * 10;
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=3668.695,`position_y`=4852.459,`position_z`=-12.74998 WHERE `guid`=@NPC;
+DELETE FROM `creature_addon` WHERE `guid`=@NPC;
+INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (@NPC,@PATH,0,0,1,0, '');
+DELETE FROM `waypoint_data` WHERE `id`=@PATH;
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES
+(@PATH,1,3668.695,4852.459,-12.74998,0,0,0,0,100,0),
+(@PATH,2,3664.671,4872.002,-12.99413,0,0,0,0,100,0),
+(@PATH,3,3664.699,4871.859,-13.07822,0,0,0,0,100,0),
+(@PATH,4,3665.02,4871.801,-13.02737,0,0,0,0,100,0),
+(@PATH,5,3675.036,4847.65,-13.24574,0,0,0,0,100,0),
+(@PATH,6,3689.288,4839.663,-12.73423,0,0,0,0,100,0),
+(@PATH,7,3700.295,4827.3,-13.29157,0,0,0,0,100,0),
+(@PATH,8,3702.61,4824.848,-13.29076,0,0,0,0,100,0),
+(@PATH,9,3702.303,4824.782,-13.54672,0,0,0,0,100,0),
+(@PATH,10,3696.016,4832.376,-12.71317,0,0,0,0,100,0),
+(@PATH,11,3684.51,4841.927,-13.23423,0,0,0,0,100,0),
+(@PATH,12,3671.438,4849.996,-12.73423,0,0,0,0,100,0),
+(@PATH,13,3668.495,4852.239,-12.74998,0,0,0,0,100,0);
+-- 0x1C39AC47601904C000000C00006398F7 .go 3668.695 4852.459 -12.74998
+
+-- Pathing for Entry: 25619 'TDB FORMAT'
+SET @NPC := 97940;
+SET @PATH := @NPC * 10;
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=3580.309,`position_y`=4549.389,`position_z`=-11.17193 WHERE `guid`=@NPC;
+DELETE FROM `creature_addon` WHERE `guid`=@NPC;
+INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (@NPC,@PATH,0,0,1,0, '');
+DELETE FROM `waypoint_data` WHERE `id`=@PATH;
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES
+(@PATH,1,3580.309,4549.389,-11.17193,0,0,0,0,100,0),
+(@PATH,2,3578.376,4553.744,-12.42194,0,0,0,0,100,0),
+(@PATH,3,3568.719,4586.03,-13.21303,0,0,0,0,100,0),
+(@PATH,4,3580.922,4608.78,-13.29673,0,0,0,0,100,0),
+(@PATH,5,3569.915,4581.717,-12.73434,0,0,0,0,100,0),
+(@PATH,6,3580.182,4549.349,-11.17194,0,0,0,0,100,0);
+-- 0x1C39AC47601904C000000C0000635FEA .go 3580.309 4549.389 -11.17193
+
+-- Pathing for Entry: 25619 'TDB FORMAT'
+SET @NPC := 97945;
+SET @PATH := @NPC * 10;
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=3638.907,`position_y`=4590.849,`position_z`=-12.90129 WHERE `guid`=@NPC;
+DELETE FROM `creature_addon` WHERE `guid`=@NPC;
+INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (@NPC,@PATH,0,0,1,0, '');
+DELETE FROM `waypoint_data` WHERE `id`=@PATH;
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES
+(@PATH,1,3638.907,4590.849,-12.90129,0,0,0,0,100,0),
+(@PATH,2,3639.077,4591.158,-12.65275,0,0,0,0,100,0),
+(@PATH,3,3657.039,4597.404,-12.65622,0,0,0,0,100,0),
+(@PATH,4,3674.552,4584.037,-12.69051,0,0,0,0,100,0),
+(@PATH,5,3691.104,4575.537,-12.92792,0,0,0,0,100,0),
+(@PATH,6,3700.628,4561.468,-12.65065,0,0,0,0,100,0),
+(@PATH,7,3700.406,4561.409,-12.89539,0,0,0,0,100,0),
+(@PATH,8,3700.436,4561.741,-12.6833,0,0,0,0,100,0),
+(@PATH,9,3690.878,4575.947,-12.68227,0,0,0,0,100,0),
+(@PATH,10,3674.272,4584.251,-12.66346,0,0,0,0,100,0),
+(@PATH,11,3656.891,4597.556,-12.65173,0,0,0,0,100,0),
+(@PATH,12,3638.816,4591.054,-12.67964,0,0,0,0,100,0),
+(@PATH,13,3638.907,4590.849,-12.90129,0,0,0,0,100,0);
+-- 0x1C39AC47601904C000000C000063960F .go 3638.907 4590.849 -12.90129
+
+-- Pathing for Entry: 25619 'TDB FORMAT'
+SET @NPC := 57150;
+SET @PATH := @NPC * 10;
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=3540.325,`position_y`=4553.921,`position_z`=-11.9877 WHERE `guid`=@NPC;
+DELETE FROM `creature_addon` WHERE `guid`=@NPC;
+INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (@NPC,@PATH,0,0,1,0, '');
+DELETE FROM `waypoint_data` WHERE `id`=@PATH;
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES
+(@PATH,1,3540.325,4553.921,-11.9877,0,0,0,0,100,0),
+(@PATH,2,3551.097,4546.824,-12.09515,0,0,0,0,100,0),
+(@PATH,3,3556.957,4542.564,-12.71872,0,0,0,0,100,0),
+(@PATH,4,3572.592,4519.032,-12.57456,0,0,0,0,100,0),
+(@PATH,5,3611.974,4514.621,-11.45239,0,0,0,0,100,0),
+(@PATH,6,3596.514,4512.68,-11.4117,0,0,0,0,100,0),
+(@PATH,7,3591.572,4513.184,-12.59506,0,0,0,0,100,0),
+(@PATH,8,3572.187,4519.236,-12.62936,0,0,0,0,100,0),
+(@PATH,9,3542.318,4553.094,-11.18209,0,0,0,0,100,0),
+(@PATH,10,3538.412,4553.636,-12.23789,0,0,0,0,100,0),
+(@PATH,11,3540.325,4553.921,-11.9877,0,0,0,0,100,0),
+(@PATH,12,3551.078,4546.787,-12.28936,0,0,0,0,100,0);
+-- 0x1C39AC47601904C00000A30000661A2D .go 3540.325 4553.921 -11.9877
+
+
+-- Pathing for Entry: 25619 'TDB FORMAT'
+SET @NPC := 57149;
+SET @PATH := @NPC * 10;
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=3440.258,`position_y`=4514.217,`position_z`=-12.88582 WHERE `guid`=@NPC;
+DELETE FROM `creature_addon` WHERE `guid`=@NPC;
+INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (@NPC,@PATH,0,0,1,0, '');
+DELETE FROM `waypoint_data` WHERE `id`=@PATH;
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES
+(@PATH,1,3440.258,4514.217,-12.88582,2,0,0,0,100,0),
+(@PATH,2,3440.258,4514.217,-12.88582,2,0,0,0,100,0),
+(@PATH,3,3440.896,4516.193,-12.89167,3,0,0,0,100,0),
+(@PATH,4,3442.607,4496.93,-12.91095,0,0,0,0,100,0),
+(@PATH,5,3447.15,4488.138,-12.65823,0,0,0,0,100,0),
+(@PATH,6,3452.752,4476.723,-12.68911,0,0,0,0,100,0),
+(@PATH,7,3476.311,4474.729,-12.71476,0,0,0,0,100,0),
+(@PATH,8,3494.302,4476.382,-12.71264,0,0,0,0,100,0),
+(@PATH,9,3494.728,4476.228,-12.96695,3,0,0,0,100,0),
+(@PATH,10,3511.506,4473.141,-12.958,0,0,0,0,100,0),
+(@PATH,11,3494.125,4476.339,-12.96727,0,0,0,0,100,0),
+(@PATH,12,3494.088,4476.244,-12.71688,0,0,0,0,100,0),
+(@PATH,13,3476.16,4474.544,-12.68911,0,0,0,0,100,0),
+(@PATH,14,3444.08,4494.611,-12.66572,0,0,0,0,100,0),
+(@PATH,15,3442.532,4497.133,-12.64838,0,0,0,0,100,0),
+(@PATH,16,3440.716,4522.266,-12.63575,0,0,0,0,100,0),
+(@PATH,17,3440.376,4522.044,-12.88582,0,0,0,0,100,0),
+(@PATH,18,3440.543,4522.067,-12.6481,0,0,0,0,100,0),
+(@PATH,19,3447.229,4487.997,-12.65975,0,0,0,0,100,0),
+(@PATH,20,3452.721,4477.046,-12.68911,0,0,0,0,100,0);
+-- 0x1C39AC47601904C000000A000063A957 .go 3440.258 4514.217 -12.88582
+
+-- Pathing for Entry: 25700 'TDB FORMAT'
+SET @NPC := 104890;
+SET @PATH := @NPC * 10;
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=3649.046,`position_y`=3947.566,`position_z`=25.10987 WHERE `guid`=@NPC;
+DELETE FROM `creature_addon` WHERE `guid`=@NPC;
+INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (@NPC,@PATH,0,0,1,0, '');
+DELETE FROM `waypoint_data` WHERE `id`=@PATH;
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES
+(@PATH,1,3649.046,3947.566,25.10987,0,0,0,0,100,0),
+(@PATH,2,3670.215,3953.261,27.32766,0,0,0,0,100,0),
+(@PATH,3,3661.302,3951.949,25.85034,0,0,0,0,100,0),
+(@PATH,4,3647.474,3946.993,24.98032,0,0,0,0,100,0),
+(@PATH,5,3631.758,3945.262,25.08576,0,0,0,0,100,0),
+(@PATH,6,3635.313,3944.982,24.81682,0,0,0,0,100,0),
+(@PATH,7,3649.313,3947.802,25.10083,0,0,0,0,100,0),
+(@PATH,8,3670.304,3953.393,27.30864,0,0,0,0,100,0);
+-- 0x1C39AC47601919000000A3000065CBC5 .go 3649.046 3947.566 25.10987
+
+-- Pathing for Entry: 25700 'TDB FORMAT'
+SET @NPC := 104873;
+SET @PATH := @NPC * 10;
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=3612.053,`position_y`=3969.457,`position_z`=25.79908 WHERE `guid`=@NPC;
+DELETE FROM `creature_addon` WHERE `guid`=@NPC;
+INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (@NPC,@PATH,0,0,1,0, '');
+DELETE FROM `waypoint_data` WHERE `id`=@PATH;
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES
+(@PATH,1,3612.053,3969.457,25.79908,0,0,0,0,100,0),
+(@PATH,2,3612.913,3949.386,26.9285,0,0,0,0,100,0),
+(@PATH,3,3606.506,3943.484,27.81473,0,0,0,0,100,0),
+(@PATH,4,3599.383,3941.598,27.42816,0,0,0,0,100,0),
+(@PATH,5,3613.519,3957.487,25.68642,0,0,0,0,100,0),
+(@PATH,6,3610.85,3975.829,26.71345,0,0,0,0,100,0),
+(@PATH,7,3610.689,3977.498,26.90823,0,0,0,0,100,0);
+-- 0x1C39AC47601919000000A3000065CBB6 .go 3612.053 3969.457 25.79908
+
+-- Pathing for Entry: 25700 'TDB FORMAT'
+SET @NPC := 104885;
+SET @PATH := @NPC * 10;
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=3547.306,`position_y`=3938.455,`position_z`=28.18571 WHERE `guid`=@NPC;
+DELETE FROM `creature_addon` WHERE `guid`=@NPC;
+INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (@NPC,@PATH,0,0,1,0, '');
+DELETE FROM `waypoint_data` WHERE `id`=@PATH;
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES
+(@PATH,1,3547.306,3938.455,28.18571,0,0,0,0,100,0),
+(@PATH,2,3547.207,3940.361,28.20439,0,0,0,0,100,0),
+(@PATH,3,3549.885,3950.133,28.27749,0,0,0,0,100,0),
+(@PATH,4,3547.638,3926.375,28.40306,0,0,0,0,100,0),
+(@PATH,5,3546.562,3908.686,26.7371,0,0,0,0,100,0);
+-- 0x1C39AC47601919000000990000649C8A .go 3547.306 3938.455 28.18571
+
+-- Pathing for Entry: 25700 'TDB FORMAT'
+SET @NPC := 104894;
+SET @PATH := @NPC * 10;
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=3778.342,`position_y`=3912.803,`position_z`=29.24027 WHERE `guid`=@NPC;
+DELETE FROM `creature_addon` WHERE `guid`=@NPC;
+INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (@NPC,@PATH,0,0,1,0, '');
+DELETE FROM `waypoint_data` WHERE `id`=@PATH;
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES
+(@PATH,1,3778.342,3912.803,29.24027,0,0,0,0,100,0),
+(@PATH,2,3759.181,3931.342,27.90885,0,0,0,0,100,0),
+(@PATH,3,3753.393,3933.303,27.37968,0,0,0,0,100,0),
+(@PATH,4,3753.327,3933.25,27.1396,0,0,0,0,100,0),
+(@PATH,5,3770.313,3927.754,29.42538,0,0,0,0,100,0),
+(@PATH,6,3771.412,3927.011,29.40953,0,0,0,0,100,0),
+(@PATH,7,3778.897,3901.917,30.91071,0,0,0,0,100,0);
+-- 0x1C39AC476019190000000A00005F9DDF .go 3778.342 3912.803 29.24027
+
+
+-- Pathing for Entry: 25615 'TDB FORMAT'
+SET @NPC := 97719;
+SET @PATH := @NPC * 10;
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=3952.9,`position_y`=3970.767,`position_z`=60.06356 WHERE `guid`=@NPC;
+DELETE FROM `creature_addon` WHERE `guid`=@NPC;
+INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (@NPC,@PATH,0,0,1,0, '45797');
+DELETE FROM `waypoint_data` WHERE `id`=@PATH;
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES
+(@PATH,1,3952.9,3970.767,60.06356,0,0,0,0,100,0),
+(@PATH,2,3978.35,3999.136,62.92397,0,0,0,0,100,0),
+(@PATH,3,4018.881,4028.354,68.87595,0,0,0,0,100,0),
+(@PATH,4,4054.792,4041.589,78.42586,0,0,0,0,100,0),
+(@PATH,5,4079.642,4057.923,86.41113,0,0,0,0,100,0),
+(@PATH,6,4109.986,4083.86,91.92527,0,0,0,0,100,0),
+(@PATH,7,4146.447,4095.262,94.97155,0,0,0,0,100,0),
+(@PATH,8,4116.737,4088.786,92.95302,0,0,0,0,100,0),
+(@PATH,9,4085.337,4060.936,87.70323,0,0,0,0,100,0),
+(@PATH,10,4058.099,4043.569,79.66705,0,0,0,0,100,0),
+(@PATH,11,4020.782,4029.594,69.42237,0,0,0,0,100,0),
+(@PATH,12,3994.482,4012.06,64.00913,0,0,0,0,100,0),
+(@PATH,13,3968.87,3988.12,59.70909,0,0,0,0,100,0),
+(@PATH,14,3929.95,3947.708,63.23425,0,0,0,0,100,0),
+(@PATH,15,3911.141,3924.254,62.15401,0,0,0,0,100,0),
+(@PATH,16,3873.239,3894.211,53.25244,0,0,0,0,100,0),
+(@PATH,17,3906.264,3919.628,61.43396,0,0,0,0,100,0),
+(@PATH,18,3928.859,3946.259,63.19824,0,0,0,0,100,0),
+(@PATH,19,3952.789,3970.748,60.02489,0,0,0,0,100,0);
+-- 0x1C39AC47601903C00000FB00006640F7 .go 3952.9 3970.767 60.06356
+
+-- Pathing for Entry: 25684 'TDB FORMAT'
+SET @NPC := 103453;
+SET @PATH := @NPC * 10;
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=4426.675,`position_y`=4548.689,`position_z`=105.0451 WHERE `guid`=@NPC;
+DELETE FROM `creature_addon` WHERE `guid`=@NPC;
+INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (@NPC,@PATH,0,0,1,0, '');
+DELETE FROM `waypoint_data` WHERE `id`=@PATH;
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES
+(@PATH,1,4426.675,4548.689,105.0451,0,0,0,0,100,0),
+(@PATH,2,4426.097,4567.237,105.0696,0,0,0,0,100,0),
+(@PATH,3,4427.304,4550.866,105.1948,0,0,0,0,100,0),
+(@PATH,4,4424.215,4542.484,104.0657,0,0,0,0,100,0),
+(@PATH,5,4408.765,4527.845,109.2442,0,0,0,0,100,0),
+(@PATH,6,4417.008,4531.223,106.1703,0,0,0,0,100,0),
+(@PATH,7,4426.797,4548.548,105.0981,0,0,0,0,100,0),
+(@PATH,8,4426.019,4567.411,105.0588,0,0,0,0,100,0);
+-- 0x1C39AC47601915000000F80000663747 .go 4426.675 4548.689 105.0451
+
+-- Cult Plaguebringer SAI
+SET @ENTRY := 24957;
+UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,0,0,0,1,0,100,0,1000,900000,500000,700000,11,45850,2,0,0,0,0,1,0,0,0,0,0,0,0,"Cult Plaguebringer - Out of Combat - Cast 'Ghoul Summons'"),
+(@ENTRY,0,1,0,11,0,100,0,0,0,0,0,11,45820,0,0,0,0,0,9,24021,0,30,0,0,0,0,"Cult Plaguebringer - On Respawn - Cast 'Plague Cauldron Beam'"),
+(@ENTRY,0,2,0,0,0,30,0,1100,6300,8800,13800,11,50356,0,0,0,0,0,2,0,0,0,0,0,0,0,"Cult Plaguebringer - In Combat - Cast 'Inject Plague'"),
+(@ENTRY,0,3,0,21,0,100,0,0,0,0,0,11,45820,0,0,0,0,0,9,24021,0,30,0,0,0,0,"Cult Plaguebringer - On Reached Home - Cast 'Plague Cauldron Beam'"),
+(@ENTRY,0,4,0,1,0,100,0,5000,10000,10000,15000,11,45864,0,0,0,0,0,19,23837,20,0,0,0,0,0,"Cult Plaguebringer - Out of Combat - Cast 'Soul Missile'");
+
+DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=13 AND `SourceGroup`=1 AND `SourceEntry`=45864;
+INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorType`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES
+(13, 1, 45864, 0, 0, 31, 0, 3, 23837, 0, 0, 0, 0, '', 'Visual - ony targets Dummy');
+
+DELETE FROM `waypoints` WHERE `entry`=965560;
+INSERT INTO `waypoints` (`entry`, `pointid`, `position_x`, `position_y`, `position_z`, `point_comment`) VALUES
+(965560, 1,3882.081,3605.613,47.20867, 'Darkfallen Bloodbearer'),
+(965560, 2,3880.675,3604.947,46.98143, 'Darkfallen Bloodbearer'),
+(965560, 3,3873.556,3605.217,47.1648, 'Darkfallen Bloodbearer'),
+(965560, 4,3864.232,3594.599,46.89387, 'Darkfallen Bloodbearer'),
+(965560, 5,3863.215,3593.009,46.80249, 'Darkfallen Bloodbearer'),
+(965560, 6,3857.541,3589.546,46.89201, 'Darkfallen Bloodbearer'),
+(965560, 7,3849.738,3589.315,47.19809, 'Darkfallen Bloodbearer'),
+(965560, 8,3841.684,3593.68,47.05273, 'Darkfallen Bloodbearer'),
+(965560, 9,3835.923,3599.622,47.26691, 'Darkfallen Bloodbearer'),
+(965560, 10,3828.859,3599.792,47.14082, 'Darkfallen Bloodbearer'),
+(965560, 11,3821.26,3598.35,46.8344, 'Darkfallen Bloodbearer'),
+(965560, 12,3806.117,3590.271,48.67004, 'Darkfallen Bloodbearer'),
+(965560, 13,3801.333,3586.158,49.71964, 'Darkfallen Bloodbearer');
+
+-- Darkfallen Bloodbearer SAI
+SET @GUID := -96556;
+UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=26115;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@GUID AND `source_type`=0;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@GUID,0,0,0,25,0,100,0,0,0,0,0,53,0,965560,0,0,0,0,1,0,0,0,0,0,0,0,"Darkfallen Bloodbearer - On Reset - Start Waypoint"),
+(@GUID,0,1,0,40,0,100,0,13,965560,0,0,41,2000,0,0,0,0,0,1,0,0,0,0,0,0,0,"Darkfallen Bloodbearer - On Waypoint 13 Reached - Despawn In 2000 ms");
diff --git a/sql/updates/world/2015_02_20_00_world.sql b/sql/updates/world/2015_02_20_00_world.sql
new file mode 100644
index 00000000000..918ed39cba1
--- /dev/null
+++ b/sql/updates/world/2015_02_20_00_world.sql
@@ -0,0 +1,10 @@
+--
+DELETE FROM `conditions` WHERE `SourceEntry`=56727;
+DELETE FROM `conditions` WHERE `SourceEntry`=36546 AND `SourceGroup`=1;
+DELETE FROM `conditions` WHERE `SourceEntry`=58118;
+DELETE FROM `conditions` WHERE `SourceEntry`=48397 AND `SourceTypeOrReferenceId`=13;
+DELETE FROM `conditions` WHERE `SourceEntry`= 44997 AND `SourceTypeOrReferenceId`=13;
+DELETE FROM `conditions` WHERE `SourceEntry`= 70529;
+UPDATE `conditions` SET `SourceGroup`=1 WHERE `SourceEntry`=70471;
+UPDATE `conditions` SET `SourceGroup`=1 WHERE `SourceEntry`=71310;
+UPDATE `smart_scripts` SET `action_param2`=9715 WHERE `entryorguid`=19172 AND `source_type`=0 AND `id`=10 AND `link`=0;
diff --git a/sql/updates/world/2015_02_20_01_world.sql b/sql/updates/world/2015_02_20_01_world.sql
new file mode 100644
index 00000000000..b4702d55177
--- /dev/null
+++ b/sql/updates/world/2015_02_20_01_world.sql
@@ -0,0 +1,14 @@
+--
+UPDATE `creature_template` SET `npcflag`=2 WHERE `entry`=17587;
+SET @ENTRY := 17587;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0 AND `id` IN (11, 12, 13, 14, 15, 16);
+INSERT INTO `smart_scripts` (`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`, `comment`) VALUES
+(@ENTRY, 0, 11, 0, 26, 0, 100, 0, 1, 15, 60000, 60000, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Draenei Youngling - IC_LOS - TALK'),
+(@ENTRY, 0, 12, 0, 53, 0, 100, 0, 1, 200000, 20000, 20000, 1, 1, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'Draenei Youngling - RECEIVE_HEAL - TALK'),
+(@ENTRY, 0, 13, 0, 5, 0, 100, 0, 30000, 30000, 0, 0, 1, 2, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Draenei Youngling - KILL - TALK'),
+(@ENTRY, 0, 14, 0, 1, 0, 100, 0, 60000, 60000, 60000, 60000, 1, 3, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Draenei Youngling - OOC - TALK'),
+(@ENTRY, 0, 15, 0, 4, 0, 100, 0, 0, 0, 0, 0, 1, 4, 0, 0, 0, 0, 0, 25, 15, 0, 0, 0, 0, 0, 0, 'Draenei Youngling - AGGRO - TALK'),
+(@ENTRY,0,16,0,11,0,100,0,0,0,0,0,81,0,0,0,0,0,0,1,0,0,0,0,0,0,0,"Draenei Youngling - On Respawn ' Remove npcflag");
+DELETE FROM smart_scripts WHERE `entryorguid`=24178 AND `id`=3;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(24178,0,3,0,8,0,0,0,43209,0,0,0,19,256,0,0,0,0,0,1,0,0,0,0,0,0,0,'Shatterhorn - On Place Meat spellhit remove unit flags');
diff --git a/sql/updates/world/2015_02_20_02_world.sql b/sql/updates/world/2015_02_20_02_world.sql
new file mode 100644
index 00000000000..2fc118ac1f3
--- /dev/null
+++ b/sql/updates/world/2015_02_20_02_world.sql
@@ -0,0 +1,80 @@
+--
+-- Keritose Bloodblade SAI
+SET @ENTRY := 30946;
+UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,0,0,0,62,0,100,0,10110,0,0,0,85,58698,0,0,0,0,0,7,0,0,0,0,0,0,0,"Keritose Bloodblade - On Gossip Option 0 Selected - Invoker Cast 'Possessed Skeletal Assault Gryphon'");
+
+DELETE FROM `conditions` WHERE `SourceTypeOrReferenceID`=15 AND `SourceEntry`=0 AND `SourceGroup`=10110;
+INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`ConditionTypeOrReference`,`elseGroup`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`ErrorTextId`,`Comment`) VALUES
+(15,10110,0,9,0,13172,0,0,0,'show gossip on quest 13172 taken');
+
+-- Restless Lookout SAI
+SET @ENTRY := 30951;
+UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,0,0,0,8,0,100,0,45254,0,0,0,33,30951,0,0,0,0,0,21,50,0,0,0,0,0,0,"Restless Lookout - On Spellhit 'Suicide' - Quest Credit 'Honor is for the Weak'"),
+(@ENTRY,0,2,0,8,0,100,0,59234,0,0,0,33,31555,0,0,0,0,0,7,0,0,0,0,0,0,0,"Restless Lookout - On Spellhit 'Firebomb' - Quest Credit 'Seeds of Chaos'");
+
+-- Risen Laborer SAI
+SET @ENTRY := 30949;
+UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,0,0,0,8,0,100,0,59234,0,0,0,33,31555,0,0,0,0,0,7,0,0,0,0,0,0,0,"Risen Laborer - On Spellhit 'Firebomb' - Quest Credit 'Seeds of Chaos'");
+
+/* gryphon */
+DELETE FROM `creature_template_addon` WHERE `entry`=31157;
+INSERT INTO `creature_template_addon` (`entry`, `path_id`, `mount`, `bytes1`, `bytes2`, `emote`, `auras`) VALUES
+(31157, 0, 0, 33554432, 0, 0, '55971');
+UPDATE `creature_template` SET `InhabitType`=4, `spell1`= 59234 WHERE `entry`=31157;
+
+-- Skeletal Assault Gryphon SAI
+SET @ENTRY := 31157;
+UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,0,0,0,54,0,100,0,0,0,0,0,53,1,31157,0,0,0,0,1,0,0,0,0,0,0,0,"Skeletal Assault Gryphon - On Just Summoned - Start Waypoint"),
+(@ENTRY,0,1,2,40,0,100,0,35,31157,0,0,11,50630,2,0,0,0,0,1,0,0,0,0,0,0,0,"Skeletal Assault Gryphon - On Waypoint 35 Reached - Cast 'Eject All Passengers'"),
+(@ENTRY,0,2,0,61,0,100,0,36,31157,0,0,41,1000,0,0,0,0,0,1,0,0,0,0,0,0,0,"Skeletal Assault Gryphon - On Waypoint 36 Reached - Despawn In 1000 ms");
+
+DELETE FROM `waypoints` WHERE `entry`=31157;
+INSERT INTO `waypoints` (`entry`, `pointid`, `position_x`, `position_y`, `position_z`, `point_comment`) VALUES
+(31157, 1, 8397.621, 2683.953, 657.3679, 'Skeletal Assault Gryphon'),
+(31157, 2, 8370.314, 2727.218, 664.7281, 'Skeletal Assault Gryphon'),
+(31157, 3, 8335.474, 2760.751, 670.5891, 'Skeletal Assault Gryphon'),
+(31157, 4, 8289.219, 2785.704, 674.7277, 'Skeletal Assault Gryphon'),
+(31157, 5, 8212.881, 2826.851, 661.2293, 'Skeletal Assault Gryphon'),
+(31157, 6, 8070.518, 2879.992, 614.7838, 'Skeletal Assault Gryphon'),
+(31157, 7, 7950.946, 2893.043, 570.5617, 'Skeletal Assault Gryphon'),
+(31157, 8, 7859.049, 2925.734, 547.0621, 'Skeletal Assault Gryphon'),
+(31157, 9, 7804.694, 2973.792, 558.8955, 'Skeletal Assault Gryphon'),
+(31157, 10, 7725.221, 3051.099, 570.2289, 'Skeletal Assault Gryphon'),
+(31157, 11, 7658.346, 3084.103, 576.8101, 'Skeletal Assault Gryphon'),
+(31157, 12, 7591.941, 3146.263, 587.5597, 'Skeletal Assault Gryphon'),
+(31157, 13, 7576.145, 3203.526, 598.5592, 'Skeletal Assault Gryphon'),
+(31157, 14, 7622.536, 3240.809, 611.8931, 'Skeletal Assault Gryphon'),
+(31157, 15, 7703.133, 3210.107, 613.2822, 'Skeletal Assault Gryphon'),
+(31157, 16, 7796.588, 3149.966, 615.9203, 'Skeletal Assault Gryphon'),
+(31157, 17, 7889.656, 3088.229, 614.7259, 'Skeletal Assault Gryphon'),
+(31157, 18, 7983.687, 3018.498, 597.3369, 'Skeletal Assault Gryphon'),
+(31157, 19, 8053.703, 2943.441, 588.1163, 'Skeletal Assault Gryphon'),
+(31157, 20, 8076.742, 2864.08, 582.1427, 'Skeletal Assault Gryphon'),
+(31157, 21, 8005.022, 2790.798, 556.4193, 'Skeletal Assault Gryphon'),
+(31157, 22, 7897.278, 2831.605, 550.6705, 'Skeletal Assault Gryphon'),
+(31157, 23, 7847.702, 2963.348, 561.8926, 'Skeletal Assault Gryphon'),
+(31157, 24, 7792.906, 3089.349, 590.8646, 'Skeletal Assault Gryphon'),
+(31157, 25, 7735.124, 3173.07, 604.7814, 'Skeletal Assault Gryphon'),
+(31157, 26, 7620.355, 3179.519, 599.2814, 'Skeletal Assault Gryphon'),
+(31157, 27, 7590.6, 3106.805, 591.0317, 'Skeletal Assault Gryphon'),
+(31157, 28, 7650.019, 3055.191, 581.8378, 'Skeletal Assault Gryphon'),
+(31157, 29, 7734.892, 3021.323, 573.1149, 'Skeletal Assault Gryphon'),
+(31157, 30, 7862.496, 2979.27, 572.5039, 'Skeletal Assault Gryphon'),
+(31157, 31, 7956.528, 2972.131, 575.9482, 'Skeletal Assault Gryphon'),
+(31157, 32, 8039.022, 2947.35, 576.0869, 'Skeletal Assault Gryphon'),
+(31157, 33, 8155.893, 2883.776, 606.1532, 'Skeletal Assault Gryphon'),
+(31157, 34, 8239.198, 2805.797, 654.0699, 'Skeletal Assault Gryphon'),
+(31157, 35, 8290.536, 2766.505, 682.2192, 'Skeletal Assault Gryphon'),
+(31157, 36, 8353.981, 2708.914, 714.5253, 'Skeletal Assault Gryphon');
diff --git a/sql/updates/world/2015_02_20_03_world.sql b/sql/updates/world/2015_02_20_03_world.sql
new file mode 100644
index 00000000000..225719a435d
--- /dev/null
+++ b/sql/updates/world/2015_02_20_03_world.sql
@@ -0,0 +1,26 @@
+--
+UPDATE `creature_template` SET `ainame`='SmartAI' WHERE entry IN (29364,29365);
+UPDATE `creature_template` SET `unit_flags`=`unit_flags`|33554560 WHERE `entry`=29365;
+UPDATE `creature_template` SET `flags_extra`=`flags_extra`|2 WHERE `entry`=29364;
+
+-- Void Sentry SAI
+SET @ENTRY := 29365;
+UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,0,0,2,25,0,100,2,0,0,0,0,11,54342,0,0,0,0,0,1,0,0,0,0,0,0,0,"Void Sentry - On Reset - Cast 'Zuramat Add 2' (Normal Dungeon)"),
+(@ENTRY,0,1,2,25,0,100,4,0,0,0,0,11,59747,0,0,0,0,0,1,0,0,0,0,0,0,0,"Void Sentry - On Reset - Cast 'Zuramat Add 2' (Heroic Dungeon)"),
+(@ENTRY,0,2,0,61,0,100,0,0,0,0,0,11,54351,0,0,0,0,0,1,0,0,0,0,0,0,0,"Void Sentry - On Reset - Cast 'Zuramat Add' (Normal Dungeon)"),
+(@ENTRY,0,3,0,0,0,100,0,0,0,0,0,21,0,0,0,0,0,0,1,0,0,0,0,0,0,0,"Void Sentry - In Combat - Disable Combat Movement"),
+(@ENTRY,0,4,0,38,0,100,0,1,1,0,0,41,0,0,0,0,0,0,1,0,0,0,0,0,0,0,"Void Sentry - On Data Set 1 1 - Despawn Instant");
+
+-- Void Sentry SAI
+SET @ENTRY := 29364;
+UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,0,0,0,0,0,100,0,0,0,0,0,21,0,0,0,0,0,0,1,0,0,0,0,0,0,0,"Void Sentry - In Combat - Disable Combat Movement"),
+(@ENTRY,0,1,2,25,0,100,0,0,0,0,0,11,54341,0,0,0,0,0,1,0,0,0,0,0,0,0,"Void Sentry - On Reset - Cast 'Zuramat Add'"),
+(@ENTRY,0,2,0,61,0,100,0,0,0,0,0,11,54351,0,0,0,0,0,1,0,0,0,0,0,0,0,"Void Sentry - On Reset - Cast 'Zuramat Add'"),
+(@ENTRY,0,3,0,11,0,100,0,0,0,0,0,11,58650,0,0,0,0,0,1,0,0,0,0,0,0,0,"Void Sentry - On Respawn - Cast 'Summon Void Sentry Ball'"),
+(@ENTRY,0,4,0,6,0,100,0,0,0,0,0,45,1,1,0,0,0,0,19,29365,10,0,0,0,0,0,"Void Sentry - On Just Died - Set Data 1 1");
diff --git a/sql/updates/world/2015_02_20_04_world.sql b/sql/updates/world/2015_02_20_04_world.sql
new file mode 100644
index 00000000000..1560b983859
--- /dev/null
+++ b/sql/updates/world/2015_02_20_04_world.sql
@@ -0,0 +1,10 @@
+--
+DELETE FROM `creature` WHERE `id` = 29498;
+DELETE FROM `vehicle_template_accessory` WHERE `entry` IN (29500) AND `accessory_entry` IN (29498);
+INSERT INTO `vehicle_template_accessory` (`entry`,`accessory_entry`,`seat_id`,`minion`,`description`,`summontype`,`summontimer`)VALUES
+(29500,29498,0,1,'Brunnhildar Warbear',8,0);
+
+DELETE FROM `creature` WHERE `id` = 30175;
+DELETE FROM `vehicle_template_accessory` WHERE `entry` IN (30174) AND `accessory_entry` IN (30175);
+INSERT INTO `vehicle_template_accessory` (`entry`,`accessory_entry`,`seat_id`,`minion`,`description`,`summontype`,`summontimer`)VALUES
+(30174,30175,0,1,'Hyldsmeet Warbear',8,0);
diff --git a/sql/updates/world/2015_02_21_00_world.sql b/sql/updates/world/2015_02_21_00_world.sql
new file mode 100644
index 00000000000..7e71235703c
--- /dev/null
+++ b/sql/updates/world/2015_02_21_00_world.sql
@@ -0,0 +1,9 @@
+DELETE FROM `achievement_criteria_data` WHERE `criteria_id` in(6626,6627,6628,6629,6630);
+
+INSERT INTO `achievement_criteria_data` (`criteria_id`, `type`, `value1`, `value2`, `ScriptName`) VALUES
+(6626, 20, 30, 0, ''), -- Alterac Valley
+(6627, 20, 529, 0, ''), -- Arathi Basin
+(6628, 20, 489, 0, ''), -- Warsong Glutch
+(6629, 20, 607, 0, ''), -- Strand of the Ancients
+(6630, 20, 566, 0, ''); -- Eye of the Storm
+
diff --git a/sql/updates/world/2015_02_22_00_world.sql b/sql/updates/world/2015_02_22_00_world.sql
new file mode 100644
index 00000000000..fef42379e0b
--- /dev/null
+++ b/sql/updates/world/2015_02_22_00_world.sql
@@ -0,0 +1,809 @@
+-- Pathing for Monstrous Kaliri Entry: 23051 'TDB FORMAT'
+SET @NPC := 132553;
+SET @PATH := @NPC * 10;
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=-3852.509,`position_y`=3183.065,`position_z`=439.9884 WHERE `guid`=@NPC;
+DELETE FROM `creature_addon` WHERE `guid`=@NPC;
+INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (@NPC,@PATH,0,0,1,0, '');
+DELETE FROM `waypoint_data` WHERE `id`=@PATH;
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES
+(@PATH,1,-3852.509,3183.065,439.9884,0,0,0,0,100,0),
+(@PATH,2,-3819.889,3184.794,439.9884,0,0,0,0,100,0),
+(@PATH,3,-3782.827,3181.228,439.9884,0,0,0,0,100,0),
+(@PATH,4,-3750.342,3182.072,439.9884,0,0,0,0,100,0),
+(@PATH,5,-3722.763,3185.583,439.9884,0,0,0,0,100,0),
+(@PATH,6,-3686.632,3214.135,439.9884,0,0,0,0,100,0),
+(@PATH,7,-3656.386,3240.646,439.9884,0,0,0,0,100,0),
+(@PATH,8,-3626.851,3272.052,439.9884,0,0,0,0,100,0),
+(@PATH,9,-3614.448,3315.655,439.9884,0,0,0,0,100,0),
+(@PATH,10,-3607.889,3352.559,439.9884,0,0,0,0,100,0),
+(@PATH,11,-3585.032,3376.603,439.9884,0,0,0,0,100,0),
+(@PATH,12,-3587.389,3402.663,439.9884,0,0,0,0,100,0),
+(@PATH,13,-3579.043,3438.117,439.9884,0,0,0,0,100,0),
+(@PATH,14,-3548.228,3462.314,439.9884,0,0,0,0,100,0),
+(@PATH,15,-3537.522,3491.375,439.9884,0,0,0,0,100,0),
+(@PATH,16,-3536.816,3529.879,439.9884,0,0,0,0,100,0),
+(@PATH,17,-3531.781,3565.558,439.9884,0,0,0,0,100,0),
+(@PATH,18,-3534.733,3584.761,439.9884,0,0,0,0,100,0),
+(@PATH,19,-3540.309,3619.033,439.9884,0,0,0,0,100,0),
+(@PATH,20,-3548.71,3648.066,439.9884,0,0,0,0,100,0),
+(@PATH,21,-3565.15,3673.789,439.9884,0,0,0,0,100,0),
+(@PATH,22,-3593.257,3700.032,439.9884,0,0,0,0,100,0),
+(@PATH,23,-3629.609,3714.834,439.9884,0,0,0,0,100,0),
+(@PATH,24,-3663.73,3728.198,439.9884,0,0,0,0,100,0),
+(@PATH,25,-3699.584,3743.161,439.9884,0,0,0,0,100,0),
+(@PATH,26,-3730.971,3758.693,439.9884,0,0,0,0,100,0),
+(@PATH,27,-3763.805,3764.051,439.9884,0,0,0,0,100,0),
+(@PATH,28,-3796.277,3791.6,439.9884,0,0,0,0,100,0),
+(@PATH,29,-3829.475,3825.91,439.9884,0,0,0,0,100,0),
+(@PATH,30,-3866.195,3833.057,439.9884,0,0,0,0,100,0),
+(@PATH,31,-3901.688,3854.476,439.9884,0,0,0,0,100,0),
+(@PATH,32,-3932.767,3851.711,439.9884,0,0,0,0,100,0),
+(@PATH,33,-3965.585,3849.424,439.9884,0,0,0,0,100,0),
+(@PATH,34,-3999.315,3846.842,439.9884,0,0,0,0,100,0),
+(@PATH,35,-4034.047,3812.782,439.9884,0,0,0,0,100,0),
+(@PATH,36,-4053.754,3766.908,439.9884,0,0,0,0,100,0),
+(@PATH,37,-4065.977,3737.402,439.9884,0,0,0,0,100,0),
+(@PATH,38,-4097.885,3717.781,439.9884,0,0,0,0,100,0),
+(@PATH,39,-4102.042,3680.511,439.9884,0,0,0,0,100,0),
+(@PATH,40,-4104.036,3655.926,439.9884,0,0,0,0,100,0),
+(@PATH,41,-4101.168,3611.585,439.9884,0,0,0,0,100,0),
+(@PATH,42,-4102.894,3574.591,439.9884,0,0,0,0,100,0),
+(@PATH,43,-4103.932,3544.913,439.9884,0,0,0,0,100,0),
+(@PATH,44,-4104.642,3508.564,439.9884,0,0,0,0,100,0),
+(@PATH,45,-4106.799,3476.665,439.9884,0,0,0,0,100,0),
+(@PATH,46,-4107.433,3449.932,439.9884,0,0,0,0,100,0),
+(@PATH,47,-4104.114,3418.243,439.9884,0,0,0,0,100,0),
+(@PATH,48,-4089.375,3376.191,439.9884,0,0,0,0,100,0),
+(@PATH,49,-4055.623,3343.717,446.405,0,0,0,0,100,0),
+(@PATH,50,-4011.469,3341.788,448.6551,0,0,0,0,100,0),
+(@PATH,51,-3975.74,3311.974,446.6827,0,0,0,0,100,0),
+(@PATH,52,-3947.277,3278.158,445.544,0,0,0,0,100,0),
+(@PATH,53,-3922.814,3246.151,445.7939,0,0,0,0,100,0),
+(@PATH,54,-3886.357,3212.919,439.9884,0,0,0,0,100,0);
+-- 0x1C393042401682C000002B0003B619B4 .go -3852.509 3183.065 439.9884
+
+-- Pathing for Monstrous Kaliri Entry: 23051 'TDB FORMAT'
+SET @NPC := 86115;
+SET @PATH := @NPC * 10;
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=-3844.01,`position_y`=3755.452,`position_z`=357.5598 WHERE `guid`=@NPC;
+DELETE FROM `creature_addon` WHERE `guid`=@NPC;
+INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (@NPC,@PATH,0,0,1,0, '');
+DELETE FROM `waypoint_data` WHERE `id`=@PATH;
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES
+(@PATH,1,-3844.01,3755.452,357.5598,0,0,0,0,100,0),
+(@PATH,2,-3852.51,3791.215,357.0599,0,0,0,0,100,0),
+(@PATH,3,-3890.182,3810.264,355.8931,0,0,0,0,100,0),
+(@PATH,4,-3916.092,3784.685,356.5043,0,0,0,0,100,0),
+(@PATH,5,-3923.033,3754.531,361.0602,0,0,0,0,100,0),
+(@PATH,6,-3922.995,3732.825,381.1874,0,0,0,0,100,0),
+(@PATH,7,-3926.192,3702.992,389.9645,0,0,0,0,100,0),
+(@PATH,8,-3920.217,3670.407,389.9645,0,0,0,0,100,0),
+(@PATH,9,-3902.139,3652.927,389.9645,0,0,0,0,100,0),
+(@PATH,10,-3881.576,3654.323,389.9645,0,0,0,0,100,0),
+(@PATH,11,-3865.405,3672.89,381.4647,0,0,0,0,100,0),
+(@PATH,12,-3862.587,3682.567,374.4212,0,0,0,0,100,0),
+(@PATH,13,-3856.335,3709.221,366.0322,0,0,0,0,100,0);
+-- 0x1C393042401682C000002C00003804ED .go -3844.01 3755.452 357.5598
+
+-- Pathing for Monstrous Kaliri Entry: 23051 'TDB FORMAT'
+SET @NPC := 79017;
+SET @PATH := @NPC * 10;
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=-3712.47,`position_y`=3449.822,`position_z`=329.5283 WHERE `guid`=@NPC;
+DELETE FROM `creature_addon` WHERE `guid`=@NPC;
+INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (@NPC,@PATH,0,0,1,0, '');
+DELETE FROM `waypoint_data` WHERE `id`=@PATH;
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES
+(@PATH,1,-3712.47,3449.822,329.5283,0,0,0,0,100,0),
+(@PATH,2,-3692.213,3483.701,323.2226,0,0,0,0,100,0),
+(@PATH,3,-3682.306,3518.447,319.0838,0,0,0,0,100,0),
+(@PATH,4,-3686.292,3551.121,328.0282,0,0,0,0,100,0),
+(@PATH,5,-3704.019,3589.462,327.0838,0,0,0,0,100,0),
+(@PATH,6,-3720.923,3618.094,323.1671,0,0,0,0,100,0),
+(@PATH,7,-3746.331,3629.958,322.9449,0,0,0,0,100,0),
+(@PATH,8,-3788.036,3651.199,328.056,0,0,0,0,100,0),
+(@PATH,9,-3829.155,3656.951,343.6671,0,0,0,0,100,0),
+(@PATH,10,-3864.913,3641.72,343.6671,0,0,0,0,100,0),
+(@PATH,11,-3899.767,3634.007,334.5004,0,0,0,0,100,0),
+(@PATH,12,-3932.793,3625.805,327.7227,0,0,0,0,100,0),
+(@PATH,13,-3965.984,3604.831,323.5561,0,0,0,0,100,0),
+(@PATH,14,-3994.316,3568.82,324.0004,0,0,0,0,100,0),
+(@PATH,15,-4020.807,3533.474,321.6671,0,0,0,0,100,0),
+(@PATH,16,-4017.46,3505.427,320.4171,0,0,0,0,100,0),
+(@PATH,17,-4012.915,3469.437,318.2504,0,0,0,0,100,0),
+(@PATH,18,-4008.829,3443.473,322.9727,0,0,0,0,100,0),
+(@PATH,19,-3987.128,3409.836,320.0283,0,0,0,0,100,0),
+(@PATH,20,-3956.549,3381.68,323.2782,0,0,0,0,100,0),
+(@PATH,21,-3917.093,3373.904,324.1949,0,0,0,0,100,0),
+(@PATH,22,-3879.394,3373.863,331.1393,0,0,0,0,100,0),
+(@PATH,23,-3846.889,3379.781,335.556,0,0,0,0,100,0),
+(@PATH,24,-3815.72,3383.242,336.0282,0,0,0,0,100,0),
+(@PATH,25,-3785.73,3387.147,333.7504,0,0,0,0,100,0),
+(@PATH,26,-3745.971,3412.045,331.7226,0,0,0,0,100,0);
+-- 0x1C393042401682C00000D80000384658 .go -3712.47 3449.822 329.5283
+
+-- Pathing for Monstrous Kaliri Entry: 23051 'TDB FORMAT'
+SET @NPC := 132567;
+SET @PATH := @NPC * 10;
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=-3800.044,`position_y`=3329.872,`position_z`=342.0992 WHERE `guid`=@NPC;
+DELETE FROM `creature_addon` WHERE `guid`=@NPC;
+INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (@NPC,@PATH,0,0,1,0, '');
+DELETE FROM `waypoint_data` WHERE `id`=@PATH;
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES
+(@PATH,1,-3800.044,3329.872,342.0992,0,0,0,0,100,0),
+(@PATH,2,-3820.034,3366.339,344.5435,0,0,0,0,100,0),
+(@PATH,3,-3848.72,3382.158,349.6544,0,0,0,0,100,0),
+(@PATH,4,-3866.445,3399.19,356.9323,0,0,0,0,100,0),
+(@PATH,5,-3892.608,3428.64,364.4878,0,0,0,0,100,0),
+(@PATH,6,-3875.494,3457.741,364.4878,0,0,0,0,100,0),
+(@PATH,7,-3846.305,3462.793,364.4878,0,0,0,0,100,0),
+(@PATH,8,-3835.524,3455.278,363.4879,0,0,0,0,100,0),
+(@PATH,9,-3826.342,3432.901,363.4879,0,0,0,0,100,0),
+(@PATH,10,-3833.529,3403.362,349.9602,0,0,0,0,100,0),
+(@PATH,11,-3849.905,3384.756,348.2379,0,0,0,0,100,0),
+(@PATH,12,-3869.018,3342.68,345.9046,0,0,0,0,100,0),
+(@PATH,13,-3866.873,3308.942,344.5435,0,0,0,0,100,0),
+(@PATH,14,-3833.351,3299.779,344.5435,0,0,0,0,100,0);
+-- 0x1C393042401682C00000D80000389A53 .go -3800.044 3329.872 342.0992
+
+-- Pathing for Monstrous Kaliri Entry: 23051 'TDB FORMAT'
+SET @NPC := 132557;
+SET @PATH := @NPC * 10;
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=-4027.127,`position_y`=3236.136,`position_z`=342.3879 WHERE `guid`=@NPC;
+DELETE FROM `creature_addon` WHERE `guid`=@NPC;
+INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (@NPC,@PATH,0,0,1,0, '');
+DELETE FROM `waypoint_data` WHERE `id`=@PATH;
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES
+(@PATH,1,-4027.127,3236.136,342.3879,0,0,0,0,100,0),
+(@PATH,2,-4050.725,3247.826,342.3879,0,0,0,0,100,0),
+(@PATH,3,-4074.902,3254.402,339.4433,0,0,0,0,100,0),
+(@PATH,4,-4099.817,3279.177,340.388,0,0,0,0,100,0),
+(@PATH,5,-4090.614,3300.566,342.3879,0,0,0,0,100,0),
+(@PATH,6,-4066.256,3322.034,342.3879,0,0,0,0,100,0),
+(@PATH,7,-4034.025,3315.976,340.4436,0,0,0,0,100,0),
+(@PATH,8,-4000.627,3300.234,340.7216,0,0,0,0,100,0),
+(@PATH,9,-3962.779,3269.458,342.3879,0,0,0,0,100,0),
+(@PATH,10,-3932.333,3241.691,350.61,0,0,0,0,100,0),
+(@PATH,11,-3924.384,3214.195,353.11,0,0,0,0,100,0),
+(@PATH,12,-3948.188,3192.575,352.915,0,0,0,0,100,0),
+(@PATH,13,-3975.502,3190.098,351.4991,0,0,0,0,100,0),
+(@PATH,14,-4002.08,3217.684,348.0821,0,0,0,0,100,0);
+-- 0x1C393042401682C00000D800003947B4 .go -4027.127 3236.136 342.3879
+
+-- Pathing for Monstrous Kaliri Entry: 23051 'TDB FORMAT'
+SET @NPC := 86099;
+SET @PATH := @NPC * 10;
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=-3617.656,`position_y`=3768.498,`position_z`=321.4414 WHERE `guid`=@NPC;
+DELETE FROM `creature_addon` WHERE `guid`=@NPC;
+INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (@NPC,@PATH,0,0,1,0, '');
+DELETE FROM `waypoint_data` WHERE `id`=@PATH;
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES
+(@PATH,1,-3617.656,3768.498,321.4414,0,0,0,0,100,0),
+(@PATH,2,-3621.72,3753.039,319.025,0,0,0,0,100,0),
+(@PATH,3,-3619.644,3727.897,309.8305,0,0,0,0,100,0),
+(@PATH,4,-3627.178,3681.108,308.5527,0,0,0,0,100,0),
+(@PATH,5,-3656.429,3650.599,304.2195,0,0,0,0,100,0),
+(@PATH,6,-3696.808,3638.603,303.0528,0,0,0,0,100,0),
+(@PATH,7,-3734.566,3654.597,302.6361,0,0,0,0,100,0),
+(@PATH,8,-3766.324,3670.245,301.1362,0,0,0,0,100,0),
+(@PATH,9,-3799.271,3684.971,303.1361,0,0,0,0,100,0),
+(@PATH,10,-3832.15,3705.031,308.4691,0,0,0,0,100,0),
+(@PATH,11,-3868.131,3721.502,318.4415,0,0,0,0,100,0),
+(@PATH,12,-3909.399,3735.214,328.5527,0,0,0,0,100,0),
+(@PATH,13,-3931.017,3766.784,334.3581,0,0,0,0,100,0),
+(@PATH,14,-3917.445,3807.967,334.4695,0,0,0,0,100,0),
+(@PATH,15,-3890.349,3823.759,327.1638,0,0,0,0,100,0),
+(@PATH,16,-3849.03,3819.391,319.025,0,0,0,0,100,0),
+(@PATH,17,-3822.998,3781.306,314.3583,0,0,0,0,100,0),
+(@PATH,18,-3792.191,3762.3,302.9972,0,0,0,0,100,0),
+(@PATH,19,-3753.88,3777.921,300.1917,0,0,0,0,100,0),
+(@PATH,20,-3738.559,3813.297,304.1084,0,0,0,0,100,0),
+(@PATH,21,-3707.912,3826.754,304.9972,0,0,0,0,100,0),
+(@PATH,22,-3666.76,3801.158,304.9972,0,0,0,0,100,0),
+(@PATH,23,-3632.452,3787.691,313.8025,0,0,0,0,100,0);
+-- 0x1C393042401682C00000D800003950AB .go -3617.656 3768.498 321.4414
+
+-- Pathing for Monstrous Kaliri Entry: 23051 'TDB FORMAT'
+SET @NPC := 132562;
+SET @PATH := @NPC * 10;
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=-3740.354,`position_y`=3781.2,`position_z`=318.1236 WHERE `guid`=@NPC;
+DELETE FROM `creature_addon` WHERE `guid`=@NPC;
+INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (@NPC,@PATH,0,0,1,0, '');
+DELETE FROM `waypoint_data` WHERE `id`=@PATH;
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES
+(@PATH,1,-3740.354,3781.2,318.1236,0,0,0,0,100,0),
+(@PATH,2,-3733.342,3800.063,318.5958,0,0,0,0,100,0),
+(@PATH,3,-3700.761,3815.838,314.9293,0,0,0,0,100,0),
+(@PATH,4,-3684.377,3790.57,311.3183,0,0,0,0,100,0),
+(@PATH,5,-3673.302,3755.679,311.3183,0,0,0,0,100,0),
+(@PATH,6,-3654.191,3733.858,317.7345,0,0,0,0,100,0),
+(@PATH,7,-3627.812,3735.349,321.0125,0,0,0,0,100,0),
+(@PATH,8,-3620.85,3745.508,318.7352,0,0,0,0,100,0),
+(@PATH,9,-3616.733,3766.586,318.0404,0,0,0,0,100,0),
+(@PATH,10,-3633.59,3782.3,318.1792,0,0,0,0,100,0),
+(@PATH,11,-3666.707,3773.215,316.2348,0,0,0,0,100,0),
+(@PATH,12,-3699.968,3755.006,317.2626,0,0,0,0,100,0),
+(@PATH,13,-3728.831,3766.574,318.1514,0,0,0,0,100,0);
+-- 0x1C393042401682C00000D800003955EA .go -3740.354 3781.2 318.1236
+
+-- Pathing for Monstrous Kaliri Entry: 23051 'TDB FORMAT'
+SET @NPC := 132558;
+SET @PATH := @NPC * 10;
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=-3889.631,`position_y`=3647.446,`position_z`=379.841 WHERE `guid`=@NPC;
+DELETE FROM `creature_addon` WHERE `guid`=@NPC;
+INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (@NPC,@PATH,0,0,1,0, '');
+DELETE FROM `waypoint_data` WHERE `id`=@PATH;
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES
+(@PATH,1,-3889.631,3647.446,379.841,0,0,0,0,100,0),
+(@PATH,2,-3867.698,3661.597,374.2303,0,0,0,0,100,0),
+(@PATH,3,-3829.105,3657.187,352.5638,0,0,0,0,100,0),
+(@PATH,4,-3781.735,3660.671,339.2026,0,0,0,0,100,0),
+(@PATH,5,-3733.907,3659.38,326.0082,0,0,0,0,100,0),
+(@PATH,6,-3700.169,3654.304,306.0638,0,0,0,0,100,0),
+(@PATH,7,-3666.533,3646.272,305.6747,0,0,0,0,100,0),
+(@PATH,8,-3633.503,3666.819,305.6747,0,0,0,0,100,0),
+(@PATH,9,-3615.833,3700.001,308.675,0,0,0,0,100,0),
+(@PATH,10,-3612.93,3733.396,310.8136,0,0,0,0,100,0),
+(@PATH,11,-3620.4,3766.181,312.2859,0,0,0,0,100,0),
+(@PATH,12,-3633.891,3791.979,308.6469,0,0,0,0,100,0),
+(@PATH,13,-3672.738,3787.063,303.5358,0,0,0,0,100,0),
+(@PATH,14,-3699.661,3766.161,308.3416,0,0,0,0,100,0),
+(@PATH,15,-3722.004,3734.262,307.3692,0,0,0,0,100,0),
+(@PATH,16,-3758.981,3700.716,303.9804,0,0,0,0,100,0),
+(@PATH,17,-3780.951,3669.244,307.3969,0,0,0,0,100,0),
+(@PATH,18,-3823.718,3662.368,306.5638,0,0,0,0,100,0),
+(@PATH,19,-3855.767,3696.363,309.2023,0,0,0,0,100,0),
+(@PATH,20,-3888.813,3716.222,313.5079,0,0,0,0,100,0),
+(@PATH,21,-3922.735,3736.949,316.8968,0,0,0,0,100,0),
+(@PATH,22,-3932.095,3764.875,321.5081,0,0,0,0,100,0),
+(@PATH,23,-3910.485,3799.088,334.758,0,0,0,0,100,0),
+(@PATH,24,-3868.099,3812.761,342.1745,0,0,0,0,100,0),
+(@PATH,25,-3842.411,3793.997,354.0078,0,0,0,0,100,0),
+(@PATH,26,-3820.221,3754.304,346.8967,0,0,0,0,100,0),
+(@PATH,27,-3833.732,3709.265,337.0357,0,0,0,0,100,0),
+(@PATH,28,-3851.1,3670.116,337.0357,0,0,0,0,100,0),
+(@PATH,29,-3880.107,3634.346,337.0357,0,0,0,0,100,0),
+(@PATH,30,-3922.091,3616.533,325.3135,0,0,0,0,100,0),
+(@PATH,31,-3965.485,3605.971,311.0912,0,0,0,0,100,0),
+(@PATH,32,-3990.204,3580.163,305.9802,0,0,0,0,100,0),
+(@PATH,33,-4011.796,3540.719,305.9802,0,0,0,0,100,0),
+(@PATH,34,-4011.68,3508.126,305.9802,0,0,0,0,100,0),
+(@PATH,35,-3987.115,3486.282,305.9802,0,0,0,0,100,0),
+(@PATH,36,-3945.38,3469.3,318.369,0,0,0,0,100,0),
+(@PATH,37,-3915.382,3492.937,334.7857,0,0,0,0,100,0),
+(@PATH,38,-3903.774,3531.629,345.4246,0,0,0,0,100,0),
+(@PATH,39,-3920.156,3565.949,365.369,0,0,0,0,100,0),
+(@PATH,40,-3933.356,3594.115,376.4244,0,0,0,0,100,0),
+(@PATH,41,-3912.393,3631.522,376.4244,0,0,0,0,100,0);
+-- 0x1C393042401682C00000D8000039560D .go -3889.631 3647.446 379.841
+
+-- Pathing for Monstrous Kaliri Entry: 23051 'TDB FORMAT'
+SET @NPC := 86116;
+SET @PATH := @NPC * 10;
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=-3876.833,`position_y`=3314.512,`position_z`=379.5609 WHERE `guid`=@NPC;
+DELETE FROM `creature_addon` WHERE `guid`=@NPC;
+INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (@NPC,@PATH,0,0,1,0, '');
+DELETE FROM `waypoint_data` WHERE `id`=@PATH;
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES
+(@PATH,1,-3876.833,3314.512,379.5609,0,0,0,0,100,0),
+(@PATH,2,-3886.097,3325.345,379.5609,0,0,0,0,100,0),
+(@PATH,3,-3911.672,3347.092,379.5609,0,0,0,0,100,0),
+(@PATH,4,-3945.02,3355.806,379.5609,0,0,0,0,100,0),
+(@PATH,5,-3972.972,3374.654,379.5609,0,0,0,0,100,0),
+(@PATH,6,-4009.497,3393.97,379.5609,0,0,0,0,100,0),
+(@PATH,7,-4038.995,3394.833,379.5609,0,0,0,0,100,0),
+(@PATH,8,-4084.306,3383.78,379.5609,0,0,0,0,100,0),
+(@PATH,9,-4114.101,3348.398,379.5609,0,0,0,0,100,0),
+(@PATH,10,-4121.285,3315.157,359.6998,0,0,0,0,100,0),
+(@PATH,11,-4133.357,3269.041,344.6721,0,0,0,0,100,0),
+(@PATH,12,-4127.872,3224.243,336.2553,0,0,0,0,100,0),
+(@PATH,13,-4088.58,3195.296,338.8943,0,0,0,0,100,0),
+(@PATH,14,-4068.468,3153.282,341.0054,0,0,0,0,100,0),
+(@PATH,15,-4070.876,3123.454,342.6997,0,0,0,0,100,0),
+(@PATH,16,-4097.591,3094.782,347.3387,0,0,0,0,100,0),
+(@PATH,17,-4122.666,3063.981,348.1721,0,0,0,0,100,0),
+(@PATH,18,-4162.276,3056.197,349.6165,0,0,0,0,100,0),
+(@PATH,19,-4202.113,3083.117,358.5054,0,0,0,0,100,0),
+(@PATH,20,-4214.216,3116.871,357.2553,0,0,0,0,100,0),
+(@PATH,21,-4193.599,3157.323,355.2832,0,0,0,0,100,0),
+(@PATH,22,-4155.592,3185.045,347.0332,0,0,0,0,100,0),
+(@PATH,23,-4111.882,3181.491,345.0887,0,0,0,0,100,0),
+(@PATH,24,-4062.104,3179.68,348.9498,0,0,0,0,100,0),
+(@PATH,25,-4020.427,3179.234,361.4219,0,0,0,0,100,0),
+(@PATH,26,-3982.672,3180.415,363.0051,0,0,0,0,100,0),
+(@PATH,27,-3951.448,3159.866,363.561,0,0,0,0,100,0),
+(@PATH,28,-3937.524,3133.349,370.6444,0,0,0,0,100,0),
+(@PATH,29,-3931.404,3105.327,376.0884,0,0,0,0,100,0),
+(@PATH,30,-3933.873,3066.744,379.5609,0,0,0,0,100,0),
+(@PATH,31,-3940.64,3017.597,385.5607,0,0,0,0,100,0),
+(@PATH,32,-3962.612,2986.642,387.3109,0,0,0,0,100,0),
+(@PATH,33,-3987.704,2976.624,388.1721,0,0,0,0,100,0),
+(@PATH,34,-4028.228,2974.074,379.5609,0,0,0,0,100,0),
+(@PATH,35,-4068.643,2997.102,369.2554,0,0,0,0,100,0),
+(@PATH,36,-4093.04,3026.769,367.2279,0,0,0,0,100,0),
+(@PATH,37,-4081.151,3058.765,357.4498,0,0,0,0,100,0),
+(@PATH,38,-4050.25,3086.566,362.8388,0,0,0,0,100,0),
+(@PATH,39,-4009.628,3109.691,361.9498,0,0,0,0,100,0),
+(@PATH,40,-3962.259,3115.2,365.2273,0,0,0,0,100,0),
+(@PATH,41,-3931.493,3131.271,371.1159,0,0,0,0,100,0),
+(@PATH,42,-3901.853,3157.168,376.1166,0,0,0,0,100,0),
+(@PATH,43,-3882.195,3190.008,374.5609,0,0,0,0,100,0),
+(@PATH,44,-3907.507,3233.704,369.0056,0,0,0,0,100,0),
+(@PATH,45,-3930.386,3264.117,346.8111,0,0,0,0,100,0),
+(@PATH,46,-3952.398,3305.412,329.4775,0,0,0,0,100,0),
+(@PATH,47,-3949.958,3344.656,317.033,0,0,0,0,100,0),
+(@PATH,48,-3933.078,3390.3,316.2833,0,0,0,0,100,0),
+(@PATH,49,-3924.384,3438.506,320.0887,0,0,0,0,100,0),
+(@PATH,50,-3908.001,3480.083,321.7832,0,0,0,0,100,0),
+(@PATH,51,-3881.964,3513.231,323.2551,0,0,0,0,100,0),
+(@PATH,52,-3844.591,3536.472,335.8942,0,0,0,0,100,0),
+(@PATH,53,-3822.905,3535.266,339.8388,0,0,0,0,100,0),
+(@PATH,54,-3792.544,3507.122,337.1997,0,0,0,0,100,0),
+(@PATH,55,-3760.572,3487.132,351.5052,0,0,0,0,100,0),
+(@PATH,56,-3744.966,3453.418,364.5887,0,0,0,0,100,0),
+(@PATH,57,-3744.307,3416.908,367.4221,0,0,0,0,100,0),
+(@PATH,58,-3740.536,3368.536,367.0887,0,0,0,0,100,0),
+(@PATH,59,-3734.622,3321.623,379.5609,0,0,0,0,100,0),
+(@PATH,60,-3731.181,3282.171,379.5609,0,0,0,0,100,0),
+(@PATH,61,-3694.877,3249.842,379.5609,0,0,0,0,100,0),
+(@PATH,62,-3655.565,3261.063,379.5609,0,0,0,0,100,0),
+(@PATH,63,-3641.669,3284.071,367.7832,0,0,0,0,100,0),
+(@PATH,64,-3641.303,3315.587,364.9221,0,0,0,0,100,0),
+(@PATH,65,-3654.031,3343.666,369.4221,0,0,0,0,100,0),
+(@PATH,66,-3680.551,3352.762,367.6165,0,0,0,0,100,0),
+(@PATH,67,-3714.793,3358.927,363.9776,0,0,0,0,100,0),
+(@PATH,68,-3753.792,3357.834,379.5609,0,0,0,0,100,0),
+(@PATH,69,-3787.513,3323.292,384.7554,0,0,0,0,100,0),
+(@PATH,70,-3817.402,3284.448,390.9497,0,0,0,0,100,0),
+(@PATH,71,-3855.805,3289.496,379.5609,0,0,0,0,100,0);
+-- 0x1C393042401682C00000D80000395FE7 .go -3876.833 3314.512 379.5609
+
+-- Pathing for Monstrous Kaliri Entry: 23051 'TDB FORMAT'
+SET @NPC := 132564;
+SET @PATH := @NPC * 10;
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=-3811.575,`position_y`=3318.012,`position_z`=350.0489 WHERE `guid`=@NPC;
+DELETE FROM `creature_addon` WHERE `guid`=@NPC;
+INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (@NPC,@PATH,0,0,1,0, '');
+DELETE FROM `waypoint_data` WHERE `id`=@PATH;
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES
+(@PATH,1,-3811.575,3318.012,350.0489,0,0,0,0,100,0),
+(@PATH,2,-3839.544,3360.737,346.5213,0,0,0,0,100,0),
+(@PATH,3,-3844.532,3382.859,327.4657,0,0,0,0,100,0),
+(@PATH,4,-3824.744,3421.51,330.4099,0,0,0,0,100,0),
+(@PATH,5,-3815.863,3458.307,331.2989,0,0,0,0,100,0),
+(@PATH,6,-3810.683,3497.717,331.2989,0,0,0,0,100,0),
+(@PATH,7,-3813.658,3530.778,320.3824,0,0,0,0,100,0),
+(@PATH,8,-3816.187,3562.303,309.2156,0,0,0,0,100,0),
+(@PATH,9,-3807.29,3592.113,304.2435,0,0,0,0,100,0),
+(@PATH,10,-3785.319,3618.569,304.2435,0,0,0,0,100,0),
+(@PATH,11,-3745.147,3632.447,304.2435,0,0,0,0,100,0),
+(@PATH,12,-3709.023,3627.542,304.2435,0,0,0,0,100,0),
+(@PATH,13,-3675.768,3604.466,304.2435,0,0,0,0,100,0),
+(@PATH,14,-3671.146,3576.667,304.2435,0,0,0,0,100,0),
+(@PATH,15,-3681.459,3543.929,304.2435,0,0,0,0,100,0),
+(@PATH,16,-3683.946,3516.303,304.2435,0,0,0,0,100,0),
+(@PATH,17,-3690.97,3482.81,304.2435,0,0,0,0,100,0),
+(@PATH,18,-3718.609,3446.152,304.2435,0,0,0,0,100,0),
+(@PATH,19,-3752.872,3415.494,304.2435,0,0,0,0,100,0),
+(@PATH,20,-3787.441,3393.248,306.6046,0,0,0,0,100,0),
+(@PATH,21,-3819.708,3391.489,304.2435,0,0,0,0,100,0),
+(@PATH,22,-3843.183,3389.003,306.9379,0,0,0,0,100,0),
+(@PATH,23,-3878.647,3381.219,308.4658,0,0,0,0,100,0),
+(@PATH,24,-3917.604,3385.046,313.9101,0,0,0,0,100,0),
+(@PATH,25,-3948.888,3388.875,314.6601,0,0,0,0,100,0),
+(@PATH,26,-3981.859,3411.407,311.4101,0,0,0,0,100,0),
+(@PATH,27,-4006.548,3451.265,312.8823,0,0,0,0,100,0),
+(@PATH,28,-4013.026,3483.869,313.6044,0,0,0,0,100,0),
+(@PATH,29,-4007.704,3522.086,312.9934,0,0,0,0,100,0),
+(@PATH,30,-3979.958,3551.535,309.1602,0,0,0,0,100,0),
+(@PATH,31,-3949.836,3557.036,311.2711,0,0,0,0,100,0),
+(@PATH,32,-3916.583,3556.782,310.1602,0,0,0,0,100,0),
+(@PATH,33,-3878.491,3547.684,308.91,0,0,0,0,100,0),
+(@PATH,34,-3848.358,3529.306,308.3823,0,0,0,0,100,0),
+(@PATH,35,-3810.661,3519.969,310.9657,0,0,0,0,100,0),
+(@PATH,36,-3788.128,3509.623,314.0764,0,0,0,0,100,0),
+(@PATH,37,-3746.377,3484.105,314.4373,0,0,0,0,100,0),
+(@PATH,38,-3720.415,3453.266,311.1879,0,0,0,0,100,0),
+(@PATH,39,-3711.39,3414.835,316.1873,0,0,0,0,100,0),
+(@PATH,40,-3695.241,3382.754,310.2711,0,0,0,0,100,0),
+(@PATH,41,-3690.628,3349.262,309.5486,0,0,0,0,100,0),
+(@PATH,42,-3707.501,3320.029,317.0488,0,0,0,0,100,0),
+(@PATH,43,-3743.783,3305.247,330.9655,0,0,0,0,100,0),
+(@PATH,44,-3787.108,3314.23,339.9933,0,0,0,0,100,0);
+-- 0x1C393042401682C00000D80000397863 .go -3811.575 3318.012 350.0489
+
+-- Pathing for Monstrous Kaliri Entry: 23051 'TDB FORMAT'
+SET @NPC := 132554;
+SET @PATH := @NPC * 10;
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=-4096.788,`position_y`=3033.959,`position_z`=360.6063 WHERE `guid`=@NPC;
+DELETE FROM `creature_addon` WHERE `guid`=@NPC;
+INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (@NPC,@PATH,0,0,1,0, '');
+DELETE FROM `waypoint_data` WHERE `id`=@PATH;
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES
+(@PATH,1,-4096.788,3033.959,360.6063,0,0,0,0,100,0),
+(@PATH,2,-4104.214,3041.3,359.5785,0,0,0,0,100,0),
+(@PATH,3,-4125.444,3052.258,358.9676,0,0,0,0,100,0),
+(@PATH,4,-4159.867,3033.596,358.9952,0,0,0,0,100,0),
+(@PATH,5,-4186.089,3020.478,361.662,0,0,0,0,100,0),
+(@PATH,6,-4216.206,3023.308,363.8009,0,0,0,0,100,0),
+(@PATH,7,-4219.776,3049.481,362.9398,0,0,0,0,100,0),
+(@PATH,8,-4205.974,3076.206,360.8285,0,0,0,0,100,0),
+(@PATH,9,-4175.602,3071.705,356.4121,0,0,0,0,100,0),
+(@PATH,10,-4149.558,3039.067,356.4121,0,0,0,0,100,0),
+(@PATH,11,-4139.287,3016.167,361.1343,0,0,0,0,100,0),
+(@PATH,12,-4115.834,2995.427,363.3842,0,0,0,0,100,0),
+(@PATH,13,-4089.456,3009.014,362.3842,0,0,0,0,100,0);
+-- 0x1C393042401682C00000D80000397B33 .go -4096.788 3033.959 360.6063
+
+-- Pathing for Monstrous Kaliri Entry: 23051 'TDB FORMAT'
+SET @NPC := 83238;
+SET @PATH := @NPC * 10;
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=-3740.354,`position_y`=3781.2,`position_z`=318.1236 WHERE `guid`=@NPC;
+DELETE FROM `creature_addon` WHERE `guid`=@NPC;
+INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (@NPC,@PATH,0,0,1,0, '');
+DELETE FROM `waypoint_data` WHERE `id`=@PATH;
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES
+(@PATH,1,-3740.354,3781.2,318.1236,0,0,0,0,100,0),
+(@PATH,2,-3733.342,3800.063,318.5958,0,0,0,0,100,0),
+(@PATH,3,-3700.761,3815.838,314.9293,0,0,0,0,100,0),
+(@PATH,4,-3684.377,3790.57,311.3183,0,0,0,0,100,0),
+(@PATH,5,-3673.302,3755.679,311.3183,0,0,0,0,100,0),
+(@PATH,6,-3654.191,3733.858,317.7345,0,0,0,0,100,0),
+(@PATH,7,-3627.812,3735.349,321.0125,0,0,0,0,100,0),
+(@PATH,8,-3620.85,3745.508,318.7352,0,0,0,0,100,0),
+(@PATH,9,-3616.733,3766.586,318.0404,0,0,0,0,100,0),
+(@PATH,10,-3633.59,3782.3,318.1792,0,0,0,0,100,0),
+(@PATH,11,-3666.707,3773.215,316.2348,0,0,0,0,100,0),
+(@PATH,12,-3699.968,3755.006,317.2626,0,0,0,0,100,0),
+(@PATH,13,-3728.831,3766.574,318.1514,0,0,0,0,100,0);
+-- 0x1C393042401682C00000D800003989DF .go -3740.354 3781.2 318.1236
+
+-- Pathing for Monstrous Kaliri Entry: 23051 'TDB FORMAT'
+SET @NPC := 132566;
+SET @PATH := @NPC * 10;
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=-3671.494,`position_y`=3402.642,`position_z`=324.4617 WHERE `guid`=@NPC;
+DELETE FROM `creature_addon` WHERE `guid`=@NPC;
+INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (@NPC,@PATH,0,0,1,0, '');
+DELETE FROM `waypoint_data` WHERE `id`=@PATH;
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES
+(@PATH,1,-3671.494,3402.642,324.4617,0,0,0,0,100,0),
+(@PATH,2,-3675.101,3400.796,324.5731,0,0,0,0,100,0),
+(@PATH,3,-3695.996,3378.851,323.7954,0,0,0,0,100,0),
+(@PATH,4,-3677.757,3333.374,329.4622,0,0,0,0,100,0),
+(@PATH,5,-3671.793,3306.185,341.9066,0,0,0,0,100,0),
+(@PATH,6,-3691.331,3277.393,341.9066,0,0,0,0,100,0),
+(@PATH,7,-3714.71,3287.554,341.9066,0,0,0,0,100,0),
+(@PATH,8,-3715.633,3314.267,336.4897,0,0,0,0,100,0),
+(@PATH,9,-3681.489,3340.859,327.934,0,0,0,0,100,0),
+(@PATH,10,-3648.484,3360.056,326.1562,0,0,0,0,100,0),
+(@PATH,11,-3641.23,3384.09,325.4897,0,0,0,0,100,0),
+(@PATH,12,-3655.433,3406.725,325.0451,0,0,0,0,100,0);
+-- 0x1C393042401682C00000DE000039182E .go -3671.494 3402.642 324.4617
+
+-- Pathing for Monstrous Kaliri Entry: 23051 'TDB FORMAT'
+SET @NPC := 132556;
+SET @PATH := @NPC * 10;
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=-4209.313,`position_y`=3165.873,`position_z`=345.6776 WHERE `guid`=@NPC;
+DELETE FROM `creature_addon` WHERE `guid`=@NPC;
+INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (@NPC,@PATH,0,0,1,0, '');
+DELETE FROM `waypoint_data` WHERE `id`=@PATH;
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES
+(@PATH,1,-4209.313,3165.873,345.6776,0,0,0,0,100,0),
+(@PATH,2,-4209.917,3166.669,345.6776,0,0,0,0,100,0),
+(@PATH,3,-4214.472,3180.67,347.2502,0,0,0,0,100,0),
+(@PATH,4,-4216.52,3213.613,345.6775,0,0,0,0,100,0),
+(@PATH,5,-4208.682,3255.884,339.0109,0,0,0,0,100,0),
+(@PATH,6,-4189.062,3300.134,333.0109,0,0,0,0,100,0),
+(@PATH,7,-4149.259,3324.875,328.7887,0,0,0,0,100,0),
+(@PATH,8,-4108.452,3350.17,317.011,0,0,0,0,100,0),
+(@PATH,9,-4062.702,3352.578,312.0665,0,0,0,0,100,0),
+(@PATH,10,-4014.43,3348.026,315.1498,0,0,0,0,100,0),
+(@PATH,11,-3986.476,3375.022,322.1496,0,0,0,0,100,0),
+(@PATH,12,-3981.146,3423.131,315.4276,0,0,0,0,100,0),
+(@PATH,13,-3984.354,3463.035,318.9552,0,0,0,0,100,0),
+(@PATH,14,-3983.076,3512.558,312.2053,0,0,0,0,100,0),
+(@PATH,15,-3966.213,3540.754,323.3442,0,0,0,0,100,0),
+(@PATH,16,-3949.22,3584.559,328.372,0,0,0,0,100,0),
+(@PATH,17,-3913.326,3616.715,336.8163,0,0,0,0,100,0),
+(@PATH,18,-3871.808,3634.682,342.0666,0,0,0,0,100,0),
+(@PATH,19,-3845.71,3666.634,355.0107,0,0,0,0,100,0),
+(@PATH,20,-3851.377,3715.548,351.7607,0,0,0,0,100,0),
+(@PATH,21,-3821.307,3750.763,351.2052,0,0,0,0,100,0),
+(@PATH,22,-3795.161,3777.228,334.7328,0,0,0,0,100,0),
+(@PATH,23,-3763.429,3800.694,324.3996,0,0,0,0,100,0),
+(@PATH,24,-3732.729,3778.102,316.9553,0,0,0,0,100,0),
+(@PATH,25,-3699.662,3753.815,315.6498,0,0,0,0,100,0),
+(@PATH,26,-3666.87,3741.209,315.7607,0,0,0,0,100,0),
+(@PATH,27,-3634.06,3717.237,319.2329,0,0,0,0,100,0),
+(@PATH,28,-3613.867,3678.084,317.8165,0,0,0,0,100,0),
+(@PATH,29,-3622.779,3632.821,322.9277,0,0,0,0,100,0),
+(@PATH,30,-3620.368,3590.816,320.0942,0,0,0,0,100,0),
+(@PATH,31,-3625.737,3551.353,323.3442,0,0,0,0,100,0),
+(@PATH,32,-3626.56,3508.485,328.3718,0,0,0,0,100,0),
+(@PATH,33,-3652.823,3477.152,326.2332,0,0,0,0,100,0),
+(@PATH,34,-3666.577,3433.208,328.844,0,0,0,0,100,0),
+(@PATH,35,-3689.016,3394.729,323.7608,0,0,0,0,100,0),
+(@PATH,36,-3716.738,3363.748,323.2885,0,0,0,0,100,0),
+(@PATH,37,-3754.879,3351.833,332.8161,0,0,0,0,100,0),
+(@PATH,38,-3795.422,3366.06,336.0938,0,0,0,0,100,0),
+(@PATH,39,-3839.274,3378.524,336.0663,0,0,0,0,100,0),
+(@PATH,40,-3884.272,3383.12,331.8162,0,0,0,0,100,0),
+(@PATH,41,-3923.974,3361.845,329.0664,0,0,0,0,100,0),
+(@PATH,42,-3938.367,3317.121,327.0108,0,0,0,0,100,0),
+(@PATH,43,-3970.304,3289.182,332.4276,0,0,0,0,100,0),
+(@PATH,44,-4001.49,3256,340.0942,0,0,0,0,100,0),
+(@PATH,45,-4017.281,3211.053,337.8997,0,0,0,0,100,0),
+(@PATH,46,-4034.001,3168.051,336.3162,0,0,0,0,100,0),
+(@PATH,47,-4060.109,3128.304,345.6775,0,0,0,0,100,0),
+(@PATH,48,-4089.788,3088.067,342.4553,0,0,0,0,100,0),
+(@PATH,49,-4130.021,3082.164,339.8998,0,0,0,0,100,0),
+(@PATH,50,-4161.369,3103.56,345.6775,0,0,0,0,100,0);
+-- 0x1C393042401682C00000DE0000391BB1 .go -4209.313 3165.873 345.6776
+
+-- Pathing for Monstrous Kaliri Entry: 23051 'TDB FORMAT'
+SET @NPC := 132565;
+SET @PATH := @NPC * 10;
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=-3700.187,`position_y`=3268.531,`position_z`=332.5694 WHERE `guid`=@NPC;
+DELETE FROM `creature_addon` WHERE `guid`=@NPC;
+INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (@NPC,@PATH,0,0,1,0, '');
+DELETE FROM `waypoint_data` WHERE `id`=@PATH;
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES
+(@PATH,1,-3700.187,3268.531,332.5694,0,0,0,0,100,0),
+(@PATH,2,-3712.445,3309.058,332.5694,0,0,0,0,100,0),
+(@PATH,3,-3731.05,3347.229,317.6805,0,0,0,0,100,0),
+(@PATH,4,-3716.804,3386.164,312.5971,0,0,0,0,100,0),
+(@PATH,5,-3714.796,3416.085,310.3194,0,0,0,0,100,0),
+(@PATH,6,-3726.431,3460.464,311.0414,0,0,0,0,100,0),
+(@PATH,7,-3753.865,3482.538,314.9584,0,0,0,0,100,0),
+(@PATH,8,-3788.998,3508.942,314.9305,0,0,0,0,100,0),
+(@PATH,9,-3824.704,3524.107,309.9028,0,0,0,0,100,0),
+(@PATH,10,-3848.736,3512.536,316.0972,0,0,0,0,100,0),
+(@PATH,11,-3888.76,3485.173,326.2916,0,0,0,0,100,0),
+(@PATH,12,-3912.334,3450.138,334.236,0,0,0,0,100,0),
+(@PATH,13,-3915.319,3410.722,336.7916,0,0,0,0,100,0),
+(@PATH,14,-3881.387,3385.134,337.5138,0,0,0,0,100,0),
+(@PATH,15,-3847.486,3374.93,332.5694,0,0,0,0,100,0),
+(@PATH,16,-3805.386,3361.039,326.6804,0,0,0,0,100,0),
+(@PATH,17,-3773.776,3364.174,321.6806,0,0,0,0,100,0),
+(@PATH,18,-3746.576,3378.93,320.8195,0,0,0,0,100,0),
+(@PATH,19,-3711.678,3399.851,324.7638,0,0,0,0,100,0),
+(@PATH,20,-3677.318,3417.94,324.6248,0,0,0,0,100,0),
+(@PATH,21,-3633.113,3400.247,323.4301,0,0,0,0,100,0),
+(@PATH,22,-3626.553,3376.975,323.0689,0,0,0,0,100,0),
+(@PATH,23,-3616.881,3334.872,332.5694,0,0,0,0,100,0),
+(@PATH,24,-3627.39,3296.557,332.5694,0,0,0,0,100,0),
+(@PATH,25,-3664.143,3265.263,332.5694,0,0,0,0,100,0);
+-- 0x1C393042401682C00000DE0000391D86 .go -3700.187 3268.531 332.5694
+
+-- Pathing for Monstrous Kaliri Entry: 23051 'TDB FORMAT'
+SET @NPC := 132555;
+SET @PATH := @NPC * 10;
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=-3910.414,`position_y`=2965.875,`position_z`=390.4576 WHERE `guid`=@NPC;
+DELETE FROM `creature_addon` WHERE `guid`=@NPC;
+INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (@NPC,@PATH,0,0,1,0, '');
+DELETE FROM `waypoint_data` WHERE `id`=@PATH;
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES
+(@PATH,1,-3910.414,2965.875,390.4576,0,0,0,0,100,0),
+(@PATH,2,-3933.329,2966.657,390.4576,0,0,0,0,100,0),
+(@PATH,3,-3954.885,2975.502,382.291,0,0,0,0,100,0),
+(@PATH,4,-3963.788,3013.65,381.3741,0,0,0,0,100,0),
+(@PATH,5,-3969.197,3050.419,375.9853,0,0,0,0,100,0),
+(@PATH,6,-3984.531,3090.169,372.0131,0,0,0,0,100,0),
+(@PATH,7,-3972.277,3135.571,367.5407,0,0,0,0,100,0),
+(@PATH,8,-3947.474,3178.757,362.0132,0,0,0,0,100,0),
+(@PATH,9,-3930.654,3222.331,346.0132,0,0,0,0,100,0),
+(@PATH,10,-3944.785,3269.054,337.6526,0,0,0,0,100,0),
+(@PATH,11,-3988.984,3283.474,328.0133,0,0,0,0,100,0),
+(@PATH,12,-4020.175,3305.831,332.7634,0,0,0,0,100,0),
+(@PATH,13,-4043.304,3338.783,339.9855,0,0,0,0,100,0),
+(@PATH,14,-4076.572,3375.872,343.2631,0,0,0,0,100,0),
+(@PATH,15,-4067.485,3424.765,347.1243,0,0,0,0,100,0),
+(@PATH,16,-4037.804,3458.173,351.3187,0,0,0,0,100,0),
+(@PATH,17,-4007.092,3452.119,341.2909,0,0,0,0,100,0),
+(@PATH,18,-3969.205,3437.343,334.1797,0,0,0,0,100,0),
+(@PATH,19,-3932.203,3431.731,332.2077,0,0,0,0,100,0),
+(@PATH,20,-3896.705,3421.381,327.7629,0,0,0,0,100,0),
+(@PATH,21,-3871.978,3389.38,331.041,0,0,0,0,100,0),
+(@PATH,22,-3827.513,3390.714,332.2075,0,0,0,0,100,0),
+(@PATH,23,-3802.128,3368.306,336.7633,0,0,0,0,100,0),
+(@PATH,24,-3790.874,3332.89,343.6242,0,0,0,0,100,0),
+(@PATH,25,-3808.656,3291.044,352.0409,0,0,0,0,100,0),
+(@PATH,26,-3817.205,3243.875,361.9853,0,0,0,0,100,0),
+(@PATH,27,-3841.924,3206.913,365.2077,0,0,0,0,100,0),
+(@PATH,28,-3882.906,3183.564,363.3185,0,0,0,0,100,0),
+(@PATH,29,-3903.045,3142.097,372.3742,0,0,0,0,100,0),
+(@PATH,30,-3883.694,3111.339,382.5131,0,0,0,0,100,0),
+(@PATH,31,-3856.857,3076.734,390.4576,0,0,0,0,100,0),
+(@PATH,32,-3843.808,3035.878,390.4576,0,0,0,0,100,0),
+(@PATH,33,-3833.452,2993.256,390.4576,0,0,0,0,100,0),
+(@PATH,34,-3866.545,2965.673,390.4576,0,0,0,0,100,0),
+(@PATH,35,-3910.414,2965.875,390.4576,0,0,0,0,100,0),
+(@PATH,36,-3933.329,2966.657,390.4576,0,0,0,0,100,0),
+(@PATH,37,-3954.885,2975.502,382.291,0,0,0,0,100,0);
+-- 0x1C393042401682C00000DE0000393AF6 .go -3910.414 2965.875 390.4576
+
+-- Pathing for Monstrous Kaliri Entry: 23051 'TDB FORMAT'
+SET @NPC := 132560;
+SET @PATH := @NPC * 10;
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=-4210.051,`position_y`=3036.035,`position_z`=359.2715 WHERE `guid`=@NPC;
+DELETE FROM `creature_addon` WHERE `guid`=@NPC;
+INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (@NPC,@PATH,0,0,1,0, '');
+DELETE FROM `waypoint_data` WHERE `id`=@PATH;
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES
+(@PATH,1,-4210.051,3036.035,359.2715,0,0,0,0,100,0),
+(@PATH,2,-4197.814,3024.344,366.188,0,0,0,0,100,0),
+(@PATH,3,-4166.595,3015.782,353.327,0,0,0,0,100,0),
+(@PATH,4,-4119.361,3000.518,350.3828,0,0,0,0,100,0),
+(@PATH,5,-4078.058,3004.437,346.7713,0,0,0,0,100,0),
+(@PATH,6,-4047.495,3033.212,346.8269,0,0,0,0,100,0),
+(@PATH,7,-4037.817,3075.937,350.9382,0,0,0,0,100,0),
+(@PATH,8,-4037.221,3122.487,345.1326,0,0,0,0,100,0),
+(@PATH,9,-4020.077,3150.257,329.8825,0,0,0,0,100,0),
+(@PATH,10,-3983.114,3172.777,330.1326,0,0,0,0,100,0),
+(@PATH,11,-3945.796,3163.176,338.4935,0,0,0,0,100,0),
+(@PATH,12,-3906.744,3138.077,347.0493,0,0,0,0,100,0),
+(@PATH,13,-3872.958,3116.541,357.4377,0,0,0,0,100,0),
+(@PATH,14,-3857.695,3086.127,367.6046,0,0,0,0,100,0),
+(@PATH,15,-3866.051,3043.046,372.1045,0,0,0,0,100,0),
+(@PATH,16,-3902.363,3025,374.7159,0,0,0,0,100,0),
+(@PATH,17,-3939.945,3047.438,368.138,0,0,0,0,100,0),
+(@PATH,18,-3976.81,3075.321,357.9659,0,0,0,0,100,0),
+(@PATH,19,-4015.781,3101.057,352.3272,0,0,0,0,100,0),
+(@PATH,20,-4057.297,3120.64,344.0215,0,0,0,0,100,0),
+(@PATH,21,-4093.992,3151.9,340.0216,0,0,0,0,100,0),
+(@PATH,22,-4133.575,3148.626,338.077,0,0,0,0,100,0),
+(@PATH,23,-4161.596,3113.013,348.6326,0,0,0,0,100,0),
+(@PATH,24,-4193.336,3081.118,359.2715,0,0,0,0,100,0),
+(@PATH,25,-4214.105,3060.078,359.2715,0,0,0,0,100,0);
+-- 0x1C393042401682C00000DE0000393F44 .go -4210.051 3036.035 359.2715
+
+-- Pathing for Monstrous Kaliri Entry: 23051 'TDB FORMAT'
+SET @NPC := 86117;
+SET @PATH := @NPC * 10;
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=-3894.564,`position_y`=3430.655,`position_z`=372.4708 WHERE `guid`=@NPC;
+DELETE FROM `creature_addon` WHERE `guid`=@NPC;
+INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (@NPC,@PATH,0,0,1,0, '');
+DELETE FROM `waypoint_data` WHERE `id`=@PATH;
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES
+(@PATH,1,-3894.564,3430.655,372.4708,0,0,0,0,100,0),
+(@PATH,2,-3857.21,3447.031,372.4708,0,0,0,0,100,0),
+(@PATH,3,-3823.56,3471.693,372.4708,0,0,0,0,100,0),
+(@PATH,4,-3784.599,3479.697,372.4708,0,0,0,0,100,0),
+(@PATH,5,-3742.468,3490.947,353.0265,0,0,0,0,100,0),
+(@PATH,6,-3709.652,3520.501,345.0263,0,0,0,0,100,0),
+(@PATH,7,-3664.314,3533.171,334.0263,0,0,0,0,100,0),
+(@PATH,8,-3616.403,3539.115,323.9706,0,0,0,0,100,0),
+(@PATH,9,-3582.801,3553.028,325.193,0,0,0,0,100,0),
+(@PATH,10,-3589.008,3587.388,329.9429,0,0,0,0,100,0),
+(@PATH,11,-3636.932,3603.025,325.1376,0,0,0,0,100,0),
+(@PATH,12,-3663.247,3624.526,321.2208,0,0,0,0,100,0),
+(@PATH,13,-3704.071,3625.825,318.6652,0,0,0,0,100,0),
+(@PATH,14,-3750.566,3629.281,322.7488,0,0,0,0,100,0),
+(@PATH,15,-3785.251,3646.629,322.5265,0,0,0,0,100,0),
+(@PATH,16,-3821.648,3660.992,332.4431,0,0,0,0,100,0),
+(@PATH,17,-3844.523,3693.082,347.1931,0,0,0,0,100,0),
+(@PATH,18,-3873.079,3712.225,349.1932,0,0,0,0,100,0),
+(@PATH,19,-3903.724,3693.448,347.4153,0,0,0,0,100,0),
+(@PATH,20,-3935.185,3680.15,346.9429,0,0,0,0,100,0),
+(@PATH,21,-3961.531,3655.501,345.2486,0,0,0,0,100,0),
+(@PATH,22,-3966.79,3606.822,348.2763,0,0,0,0,100,0),
+(@PATH,23,-3973.929,3571.161,341.0261,0,0,0,0,100,0),
+(@PATH,24,-3980.9,3522.605,335.8875,0,0,0,0,100,0),
+(@PATH,25,-4004.451,3487.919,317.9431,0,0,0,0,100,0),
+(@PATH,26,-4001.448,3441.261,334.3042,0,0,0,0,100,0),
+(@PATH,27,-3966.929,3406.75,330.5819,0,0,0,0,100,0),
+(@PATH,28,-3922.993,3396.193,351.9707,0,0,0,0,100,0);
+-- 0x1C393042401682C00000DE00003946C7 .go -3894.564 3430.655 372.4708
+
+-- Pathing for Monstrous Kaliri Entry: 23051 'TDB FORMAT'
+SET @NPC := 86131;
+SET @PATH := @NPC * 10;
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=-3884.442,`position_y`=3113.831,`position_z`=389.185 WHERE `guid`=@NPC;
+DELETE FROM `creature_addon` WHERE `guid`=@NPC;
+INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (@NPC,@PATH,0,0,1,0, '');
+DELETE FROM `waypoint_data` WHERE `id`=@PATH;
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES
+(@PATH,1,-3884.442,3113.831,389.185,0,0,0,0,100,0),
+(@PATH,2,-3869.677,3093.181,392.3522,0,0,0,0,100,0),
+(@PATH,3,-3876.115,3078.8,392.3522,0,0,0,0,100,0),
+(@PATH,4,-3900.006,3066.922,392.3522,0,0,0,0,100,0),
+(@PATH,5,-3934.172,3083.277,392.3522,0,0,0,0,100,0),
+(@PATH,6,-3942.406,3108.275,392.3522,0,0,0,0,100,0),
+(@PATH,7,-3955.406,3132.591,392.3522,0,0,0,0,100,0),
+(@PATH,8,-3983.802,3151.235,400.1577,0,0,0,0,100,0),
+(@PATH,9,-4018.729,3167.318,408.8244,0,0,0,0,100,0),
+(@PATH,10,-4048.56,3146.723,397.5466,0,0,0,0,100,0),
+(@PATH,11,-4034.677,3106.917,375.3246,0,0,0,0,100,0),
+(@PATH,12,-3999.241,3105.82,364.3524,0,0,0,0,100,0),
+(@PATH,13,-3976.743,3112.321,363.4634,0,0,0,0,100,0),
+(@PATH,14,-3934.065,3120.998,373.4079,0,0,0,0,100,0),
+(@PATH,15,-3904.763,3124.439,386.7683,0,0,0,0,100,0);
+-- 0x1C393042401682C00000DE0000394785 .go -3884.442 3113.831 389.185
+
+-- Pathing for Monstrous Kaliri Entry: 23051 'TDB FORMAT'
+SET @NPC := 83237;
+SET @PATH := @NPC * 10;
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=-3620.779,`position_y`=3761.98,`position_z`=319.1757 WHERE `guid`=@NPC;
+DELETE FROM `creature_addon` WHERE `guid`=@NPC;
+INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (@NPC,@PATH,0,0,1,0, '');
+DELETE FROM `waypoint_data` WHERE `id`=@PATH;
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES
+(@PATH,1,-3620.779,3761.98,319.1757,0,0,0,0,100,0),
+(@PATH,2,-3621.137,3762.914,319.1757,0,0,0,0,100,0),
+(@PATH,3,-3621.72,3753.039,319.025,0,0,0,0,100,0),
+(@PATH,4,-3619.644,3727.897,309.8305,0,0,0,0,100,0),
+(@PATH,5,-3627.178,3681.108,308.5527,0,0,0,0,100,0),
+(@PATH,6,-3656.429,3650.599,304.2195,0,0,0,0,100,0),
+(@PATH,7,-3696.808,3638.603,303.0528,0,0,0,0,100,0),
+(@PATH,8,-3734.566,3654.597,302.6361,0,0,0,0,100,0),
+(@PATH,9,-3766.324,3670.245,301.1362,0,0,0,0,100,0),
+(@PATH,10,-3799.271,3684.971,303.1361,0,0,0,0,100,0),
+(@PATH,11,-3832.15,3705.031,308.4691,0,0,0,0,100,0),
+(@PATH,12,-3868.131,3721.502,318.4415,0,0,0,0,100,0),
+(@PATH,13,-3909.399,3735.214,328.5527,0,0,0,0,100,0),
+(@PATH,14,-3931.017,3766.784,334.3581,0,0,0,0,100,0),
+(@PATH,15,-3917.445,3807.967,334.4695,0,0,0,0,100,0),
+(@PATH,16,-3890.349,3823.759,327.1638,0,0,0,0,100,0),
+(@PATH,17,-3849.03,3819.391,319.025,0,0,0,0,100,0),
+(@PATH,18,-3822.998,3781.306,314.3583,0,0,0,0,100,0),
+(@PATH,19,-3792.191,3762.3,302.9972,0,0,0,0,100,0),
+(@PATH,20,-3753.88,3777.921,300.1917,0,0,0,0,100,0),
+(@PATH,21,-3738.559,3813.297,304.1084,0,0,0,0,100,0),
+(@PATH,22,-3707.912,3826.754,304.9972,0,0,0,0,100,0),
+(@PATH,23,-3666.76,3801.158,304.9972,0,0,0,0,100,0),
+(@PATH,24,-3632.452,3787.691,313.8025,0,0,0,0,100,0);
+-- 0x1C393042401682C00000DE00003981C1 .go -3620.779 3761.98 319.1757
+
+-- Pathing for Monstrous Kaliri Entry: 23051 'TDB FORMAT'
+SET @NPC := 86133;
+SET @PATH := @NPC * 10;
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=-4210.051,`position_y`=3036.035,`position_z`=359.2715 WHERE `guid`=@NPC;
+DELETE FROM `creature_addon` WHERE `guid`=@NPC;
+INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (@NPC,@PATH,0,0,1,0, '');
+DELETE FROM `waypoint_data` WHERE `id`=@PATH;
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES
+(@PATH,1,-4210.051,3036.035,359.2715,0,0,0,0,100,0),
+(@PATH,2,-4197.814,3024.344,366.188,0,0,0,0,100,0),
+(@PATH,3,-4166.595,3015.782,353.327,0,0,0,0,100,0),
+(@PATH,4,-4119.361,3000.518,350.3828,0,0,0,0,100,0),
+(@PATH,5,-4078.058,3004.437,346.7713,0,0,0,0,100,0),
+(@PATH,6,-4047.495,3033.212,346.8269,0,0,0,0,100,0),
+(@PATH,7,-4037.817,3075.937,350.9382,0,0,0,0,100,0),
+(@PATH,8,-4037.221,3122.487,345.1326,0,0,0,0,100,0),
+(@PATH,9,-4020.077,3150.257,329.8825,0,0,0,0,100,0),
+(@PATH,10,-3983.114,3172.777,330.1326,0,0,0,0,100,0),
+(@PATH,11,-3945.796,3163.176,338.4935,0,0,0,0,100,0),
+(@PATH,12,-3906.744,3138.077,347.0493,0,0,0,0,100,0),
+(@PATH,13,-3872.958,3116.541,357.4377,0,0,0,0,100,0),
+(@PATH,14,-3857.695,3086.127,367.6046,0,0,0,0,100,0),
+(@PATH,15,-3866.051,3043.046,372.1045,0,0,0,0,100,0),
+(@PATH,16,-3902.363,3025,374.7159,0,0,0,0,100,0),
+(@PATH,17,-3939.945,3047.438,368.138,0,0,0,0,100,0),
+(@PATH,18,-3976.81,3075.321,357.9659,0,0,0,0,100,0),
+(@PATH,19,-4015.781,3101.057,352.3272,0,0,0,0,100,0),
+(@PATH,20,-4057.297,3120.64,344.0215,0,0,0,0,100,0),
+(@PATH,21,-4093.992,3151.9,340.0216,0,0,0,0,100,0),
+(@PATH,22,-4133.575,3148.626,338.077,0,0,0,0,100,0),
+(@PATH,23,-4161.596,3113.013,348.6326,0,0,0,0,100,0),
+(@PATH,24,-4193.336,3081.118,359.2715,0,0,0,0,100,0),
+(@PATH,25,-4214.105,3060.078,359.2715,0,0,0,0,100,0);
+-- 0x1C393042401682C00000DE00003985F0 .go -4210.051 3036.035 359.2715
+
+UPDATE `waypoint_data` SET `move_type`=1 WHERE `id` IN (132553 * 10, 86115 * 10, 79017 * 10, 132567 * 10, 132557 * 10, 86099 * 10, 132562 * 10, 132558 * 10, 86116 * 10, 132564 * 10, 132554 * 10, 83238 * 10, 132566 * 10, 132556 * 10, 132565 * 10, 132555 * 10, 132560 * 10, 86117 * 10, 86131 * 10, 83237 * 10, 86133 * 10);
+
+-- Pathing for Bonechewer Devastator Entry: 16772 'TDB FORMAT'
+SET @NPC := 57784;
+SET @PATH := @NPC * 10;
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=-2979.448,`position_y`=3526.724,`position_z`=-5.101617 WHERE `guid`=@NPC;
+DELETE FROM `creature_addon` WHERE `guid`=@NPC;
+INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (@NPC,@PATH,0,0,1,0, '');
+DELETE FROM `waypoint_data` WHERE `id`=@PATH;
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES
+(@PATH,1,-2979.448,3526.724,-5.101617,0,0,0,0,100,0),
+(@PATH,2,-2986.465,3536.819,-4.151853,0,0,0,0,100,0),
+(@PATH,3,-2999.478,3533.506,-2.088938,0,0,0,0,100,0),
+(@PATH,4,-3001.169,3532.58,-1.651159,0,0,0,0,100,0),
+(@PATH,5,-3001.333,3532.634,-1.814128,0,0,0,0,100,0),
+(@PATH,6,-2988.259,3537.786,-3.722197,0,0,0,0,100,0),
+(@PATH,7,-2983.174,3532.755,-5.044437,0,0,0,0,100,0),
+(@PATH,8,-2984.85,3516.351,-3.515834,0,0,0,0,100,0);
+-- 0x1C393042401061000000DE0000397551 .go -2979.448 3526.724 -5.101617
diff --git a/sql/updates/world/2015_02_23_00_world.sql b/sql/updates/world/2015_02_23_00_world.sql
new file mode 100644
index 00000000000..c84da7b2c84
--- /dev/null
+++ b/sql/updates/world/2015_02_23_00_world.sql
@@ -0,0 +1,4 @@
+DELETE FROM `achievement_criteria_data` WHERE `criteria_id` IN (6847, 7849);
+INSERT INTO `achievement_criteria_data` (`criteria_id`, `type`, `value1`, `value2`, `ScriptName`) VALUES
+(6847, 12, 0, 0, ''),
+(7849, 12, 1, 0, '');
diff --git a/sql/updates/world/2015_02_23_01_world.sql b/sql/updates/world/2015_02_23_01_world.sql
new file mode 100644
index 00000000000..e475f2f2f6b
--- /dev/null
+++ b/sql/updates/world/2015_02_23_01_world.sql
@@ -0,0 +1,3 @@
+DELETE FROM `spell_proc_event` WHERE `entry` IN (33953);
+INSERT INTO `spell_proc_event` (`entry`,`SchoolMask`,`SpellFamilyName`,`SpellFamilyMask0`,`SpellFamilyMask1`,`SpellFamilyMask2`,`procFlags`,`procEx`,`ppmRate`,`CustomChance`,`Cooldown`) VALUES
+(33953, 0x00, 0x00, 0x00000000, 0x00000000, 0x00000000, 0x00004400, 0x00000000, 0, 0, 45);
diff --git a/sql/updates/world/2015_02_23_02_world.sql b/sql/updates/world/2015_02_23_02_world.sql
new file mode 100644
index 00000000000..51d998b98b4
--- /dev/null
+++ b/sql/updates/world/2015_02_23_02_world.sql
@@ -0,0 +1,25 @@
+-- Actionlist SAI
+SET @ENTRY := 6192700;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=9;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,9,1,0,0,0,100,0,60000,60000,0,0,12,2202,3,120000,0,0,0,8,0,0,0,4988.25,568.897,3.15542,5,"Bonfire - On Script - Summon Creature 'Greymist Coastrunner'"),
+(@ENTRY,9,2,0,0,0,100,0,0,0,0,0,12,2202,3,120000,0,0,0,8,0,0,0,4998.76,568.891,3.21375,5,"Bonfire - On Script - Summon Creature 'Greymist Coastrunner'"),
+(@ENTRY,9,3,0,0,0,100,0,0,0,0,0,12,2202,3,120000,0,0,0,8,0,0,0,4994.69,573.448,2.4842,5,"Bonfire - On Script - Summon Creature 'Greymist Coastrunner'"),
+(@ENTRY,9,4,0,0,0,100,0,60000,60000,0,0,12,2205,3,120000,0,0,0,8,0,0,0,4988.25,568.897,3.15542,5,"Bonfire - On Script - Summon Creature 'Greymist Warrior'"),
+(@ENTRY,9,5,0,0,0,100,0,0,0,0,0,12,2205,3,120000,0,0,0,8,0,0,0,4998.76,568.891,3.21375,5,"Bonfire - On Script - Summon Creature 'Greymist Warrior'"),
+(@ENTRY,9,6,0,0,0,100,0,60000,60000,0,0,12,2206,3,120000,0,0,0,8,0,0,0,4998.76,568.891,3.21375,5,"Bonfire - On Script - Summon Creature 'Greymist Hunter'"),
+(@ENTRY,9,7,0,0,0,100,0,0,0,0,0,12,10323,3,120000,0,0,0,8,0,0,0,4994.69,573.448,2.4842,5,"Bonfire - On Script - Summon Creature 'Murkdeep'");
+
+-- Bonfire SAI
+SET @ENTRY := 61927;
+UPDATE `gameobject_template` SET `AIName`="SmartGameObjectAI" WHERE `entry`=@ENTRY;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=1;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,1,0,0,38,0,100,0,0,1,0,0,80,6192700,0,0,0,0,0,1,0,0,0,0,0,0,0,"Bonfire - On Data Set 0 1 - Run Script");
+
+-- Greymist Hunter SAI
+SET @GUID := -37989;
+UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=2206;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@GUID AND `source_type`=0;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@GUID,0,0,0,6,0,100,0,0,1,0,0,45,0,1,0,0,0,0,14,48515,61927,0,0,0,0,0,"Greymist Hunter - On Just Died -Set Data 0 1");
diff --git a/sql/updates/world/2015_02_23_03_world.sql b/sql/updates/world/2015_02_23_03_world.sql
new file mode 100644
index 00000000000..468af7088b4
--- /dev/null
+++ b/sql/updates/world/2015_02_23_03_world.sql
@@ -0,0 +1,3 @@
+DELETE FROM `spell_group` WHERE `id`=1 AND `spell_id`=63729;
+INSERT INTO `spell_group` (`id`, `spell_id`) VALUES
+(1, 63729);
diff --git a/sql/updates/world/2015_02_23_04_world.sql b/sql/updates/world/2015_02_23_04_world.sql
new file mode 100644
index 00000000000..b4e68f47825
--- /dev/null
+++ b/sql/updates/world/2015_02_23_04_world.sql
@@ -0,0 +1,2 @@
+-- Delete wrong data for achiev Flirt With Disaster
+DELETE FROM `player_factionchange_achievement` WHERE `alliance_id`=1280 AND `horde_id`=1279;
diff --git a/sql/updates/world/2015_02_23_05_world.sql b/sql/updates/world/2015_02_23_05_world.sql
new file mode 100644
index 00000000000..41b0a9f120d
--- /dev/null
+++ b/sql/updates/world/2015_02_23_05_world.sql
@@ -0,0 +1,109 @@
+SET @gob:=192492;
+SET @spell:=56649;
+SET @Veranus:=30393;
+SET @Thorim:= 30390;
+SET @Jokkum:=30331;
+
+UPDATE `creature_template` SET `AIName`='SmartAI' WHERE `entry` IN (@Veranus, @Thorim, @Jokkum);
+UPDATE `creature_template` SET `AIName`='SmartAI' WHERE `entry` IN (@Veranus, @Thorim, @Jokkum);
+UPDATE `creature_template` SET `ScriptName`="", `MovementType`=2 WHERE `entry`=@Jokkum;
+
+DELETE FROM `creature_template_addon` WHERE `entry`=@Veranus;
+INSERT INTO `creature_template_addon` (`entry`, `path_id`, `mount`, `bytes1`, `bytes2`, `emote`, `auras`) VALUES
+(@Veranus, 0, 0, 33554432, 0, 0, '55971');
+
+DELETE FROM `vehicle_template_accessory` where `entry` IN (@Veranus) AND `accessory_entry` in (@Thorim);
+INSERT INTO `vehicle_template_accessory` (`entry`,`accessory_entry`,`seat_id`,`minion`,`description`,`summontype`,`summontimer`)VALUES
+(@Veranus,@Thorim,0,0,'Veranus',8,0);
+
+DELETE FROM `npc_spellclick_spells` WHERE `npc_entry` IN (@Veranus);
+INSERT INTO `npc_spellclick_spells` (`npc_entry`, `spell_id`, `cast_flags`, `user_type`) VALUES
+(@Veranus, 46598, 1, 0);
+
+DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=15 AND `SourceGroup`=9900;
+INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES
+(15,9900,0,0,0,9,0,13010,0,0,0,0,'','Show gossip if player has quest completed'),
+(15,9900,0,0,0,5,0,1119,704,0,0,0,'','Show gossip if player is at least friendly');
+
+DELETE FROM `smart_scripts` WHERE `entryorguid` = @Jokkum AND `source_type` = 0;
+DELETE FROM `smart_scripts` WHERE `entryorguid` = @Thorim AND `source_type` = 0;
+DELETE FROM `smart_scripts` WHERE `entryorguid` = @Veranus AND `source_type` = 0;
+DELETE FROM `smart_scripts` WHERE `entryorguid` = @Jokkum*100 AND `source_type` = 9;
+DELETE FROM `smart_scripts` WHERE `entryorguid` = @Thorim*100 AND `source_type` = 9;
+DELETE FROM `smart_scripts` WHERE `entryorguid` = @Thorim*100+1 AND `source_type` = 9;
+DELETE FROM `smart_scripts` WHERE `entryorguid` = @Thorim*100+2 AND `source_type` = 9;
+
+INSERT INTO `smart_scripts` (`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`, `comment`) VALUES
+(@Jokkum, 0, 0, 1, 54, 0, 100, 0, 0, 0, 0, 0, 53, 1, @Jokkum*100, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Jokkum - JustSummoned - Start WP'),
+(@Jokkum, 0, 1, 2, 61, 0, 100, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Jokkum - JustSummoned - Talk1'),
+(@Jokkum, 0, 2, 0, 61, 0, 100, 0, 0, 0, 0, 0, 18, 768, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Jokkum - JustSummoned - Add unit flag'),
+(@Jokkum, 0, 3, 0, 40, 0, 100, 0, 22, @Jokkum*100, 0, 0, 80, @Jokkum*100, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Jokkum - On way pont 22 - Actionlist'),
+(@Jokkum*100, 9, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 11, @spell, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Jokkum - ActionList - Cast spell to summon'),
+(@Jokkum*100, 9, 1, 0, 0, 0, 100, 0, 0, 0, 0, 0, 103, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Jokkum - ActionList - Root'),
+(@Jokkum*100, 9, 2, 0, 0, 0, 100, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Jokkum - ActionList - Talk2'),
+(@Jokkum*100, 9, 3, 0, 0, 0, 100, 0, 0, 0, 0, 0, 5, 53, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Jokkum - ActionList - Emote'),
+(@Jokkum*100, 9, 4, 0, 0, 0, 100, 0, 24000, 24000, 0, 0, 1, 0, 0, 0, 0, 0, 0, 19, @Thorim, 30, 0, 0, 0, 0, 0, 'Jokkum - ActionList - talk'),
+(@Jokkum*100, 9, 5, 0, 0, 0, 100, 0, 5000, 5000, 0, 0, 1, 2, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'Jokkum - ActionList - talk'),
+(@Jokkum*100, 9, 6, 0, 0, 0, 100, 0, 7000, 7000, 0, 0, 1, 1, 0, 0, 0, 0, 0, 19, @Thorim, 30, 0, 0, 0, 0, 0, 'Jokkum - ActionList - talk'),
+(@Jokkum*100, 9, 7, 0, 0, 0, 100, 0, 7000, 7000, 0, 0, 1, 2, 0, 0, 0, 0, 0, 19, @Thorim, 30, 0, 0, 0, 0, 0, 'Jokkum - ActionList - talk'),
+(@Jokkum*100, 9, 8, 0, 0, 0, 100, 0, 9000, 9000, 0, 0, 1, 3, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Jokkum - ActionList - talk'),
+(@Jokkum*100, 9, 9, 0, 0, 0, 100, 0, 0, 0, 0, 0, 28, 68442, 0, 0, 0, 0, 0, 19, @Thorim, 30, 0, 0, 0, 0, 0, 'Jokkum - ActionList - remove kneel'),
+(@Jokkum*100, 9, 10, 0, 0, 0, 100, 0, 8000, 8000, 0, 0, 1, 4, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Jokkum - ActionList - talk'),
+(@Jokkum*100, 9, 11, 0, 0, 0, 100, 0, 9000, 9000, 0, 0, 1, 5, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Jokkum - ActionList - talk'),
+(@Jokkum*100, 9, 12, 0, 0, 0, 100, 0, 2000, 2000, 0, 0, 80, @Thorim*100+1, 0, 0, 0, 0, 0, 19, @Thorim, 30, 0, 0, 0, 0, 0, 'Jokkum - ActionList - Actionlist'),
+(@Jokkum*100, 9, 13, 0, 0, 0, 100, 0, 4000, 4000, 0, 0, 1, 6, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Jokkum - ActionList - talk'),
+(@Jokkum*100, 9, 14, 0, 0, 0, 100, 0, 5000, 5000, 0, 0, 1, 3, 0, 0, 0, 0, 0, 19, @Thorim, 30, 0, 0, 0, 0, 0, 'Jokkum - ActionList - talk'),
+(@Jokkum*100, 9, 15, 0, 0, 0, 100, 0, 9000, 9000, 0, 0, 1, 7, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Jokkum - ActionList - talk'),
+(@Jokkum*100, 9, 16, 0, 0, 0, 100, 0, 5000, 5000, 0, 0, 1, 8, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Jokkum - ActionList - talk'),
+(@Jokkum*100, 9, 17, 0, 0, 0, 100, 0, 0, 0, 0, 0, 11, 56545, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'Jokkum - ActionList - Cast credit'),
+(@Jokkum*100, 9, 18, 0, 0, 0, 100, 0, 4000, 4000, 0, 0, 11, 50630, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Jokkum - ActionList - Cast eject passenger'),
+(@Jokkum*100, 9, 19, 0, 0, 0, 100, 0, 0, 0, 0, 0, 103, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Jokkum - ActionList - remove root'),
+(@Jokkum*100, 9, 20, 0, 0, 0, 100, 0, 1000, 1000, 0, 0, 53, 1, @Jokkum*100+1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Jokkum - ActionList - Start WP2'),
+(@Thorim*100+1, 9, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 50, @gob, 400000, 0, 0, 0, 0, 8, 0, 0, 0, 7867.189453, -3255.752930, 853.379700, 2.321934, 'Thorim - ActionList - Spawn gob'),
+(@Thorim*100+1, 9, 1, 0, 0, 0, 100, 0, 0, 0, 0, 0, 50, 188142, 400000, 0, 0, 0, 0, 8, 0, 0, 0, 7867.189453, -3255.752930, 850.467590, 2.321934, 'Thorim - ActionList - Spawn gob'),
+(@Thorim, 0, 0, 0, 63, 0, 100, 0, 0, 0, 0, 0, 80, @Thorim*100, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Thorim - Just created - actionlist'),
+(@Thorim*100, 9, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 59, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Thorim - ActionList - set run ON'),
+(@Thorim*100, 9, 1, 0, 0, 0, 100, 0, 18000, 18000, 0, 0, 69, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 7886.027344, -3239.358887, 849.435791, 3.769581, 'Thorim - ActionList - go to pos'),
+(@Thorim*100, 9, 2, 0, 0, 0, 100, 0, 5000, 5000, 0, 0, 75, 68442, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Thorim - ActionList - Aura state kneel'),
+(@Thorim*100, 9, 3, 0, 0, 0, 100, 0, 460000, 460000, 0, 0, 41, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Thorim - ActionList - Aura state kneel'),
+(@Thorim, 0, 1, 0, 19, 0, 100, 0, 13057, 0, 0, 0, 80, @Thorim*100+2, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Thorim - Just created - actionlist'),
+(@Thorim*100+2, 9, 0, 0, 0, 0, 100, 0, 30000, 30000, 0, 0, 41, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Thorim - ActionList - Aura state kneel'),
+(@Veranus, 0, 0, 1, 54, 0, 100, 0, 0, 0, 0, 0, 53, 1, @Veranus*100, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Veranus - JustSummoned - Start WP'),
+(@Veranus, 0, 1, 0, 61, 0, 100, 0, 0, 0, 0, 0, 18, 33554432, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Veranus - JustSummoned - Set unit_flag not selectable'),
+(@Veranus, 0, 2, 0, 40, 0, 100, 0, 2, 0, 0, 0, 11, 50630, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Veranus - On waypoint 2 - Eject passenger');
+
+DELETE FROM `waypoint_data` WHERE `id` IN (2072200, 2072201);
+
+DELETE FROM `waypoints` WHERE `entry`IN (@Jokkum*100+1, @Jokkum*100, @Veranus*100);
+INSERT INTO `waypoints` (`entry`,`pointid`,`position_x`,`position_y`,`position_z`,`point_comment`) VALUES
+(@Jokkum*100+1,1,7837.09, -3235.54, 853.878, '@Jokkum'),
+(@Jokkum*100+1,2,7828.62, -3230.38, 855.915, '@Jokkum'),
+(@Jokkum*100+1,3,7793.78, -3219.74, 861.146, '@Jokkum'),
+(@Jokkum*100+1,4,7765.22, -3225.37, 864.083, '@Jokkum'),
+(@Jokkum*100+1,5,7736.73, -3226.5, 861.458, '@Jokkum'),
+(@Jokkum*100,1,7357.09,-2865.4,803.501, '@Jokkum'),
+(@Jokkum*100,2,7355.18,-2904.32,821.008, '@Jokkum'),
+(@Jokkum*100,3,7355.47,-2946.65,833.092, '@Jokkum'),
+(@Jokkum*100,4,7358.79,-2974.21,845.018, '@Jokkum'),
+(@Jokkum*100,5,7360.87,-2994.78,845.989, '@Jokkum'),
+(@Jokkum*100,6,7378.76,-3035.89,840.6, '@Jokkum'),
+(@Jokkum*100,7,7411.66,-3072.21,837.577, '@Jokkum'),
+(@Jokkum*100,8,7454,-3088.7,837.577, '@Jokkum'),
+(@Jokkum*100,9,7496.08,-3113.92,837.583, '@Jokkum'),
+(@Jokkum*100,10,7536.84,-3136.49,837.581, '@Jokkum'),
+(@Jokkum*100,11,7564.74,-3145.14,844.831, '@Jokkum'),
+(@Jokkum*100,12,7604.36,-3171.26,850.887, '@Jokkum'),
+(@Jokkum*100,13,7635.47,-3207.21,857.19, '@Jokkum'),
+(@Jokkum*100,14,7657.86,-3219.26,863.19, '@Jokkum'),
+(@Jokkum*100,15,7685.42,-3218.98,867.141, '@Jokkum'),
+(@Jokkum*100,16,7706.54,-3219.74,864.333, '@Jokkum'),
+(@Jokkum*100,17,7747.33,-3226.99,862.458, '@Jokkum'),
+(@Jokkum*100,18,7796.66,-3221.78,860.646, '@Jokkum'),
+(@Jokkum*100,19,7827.6, -3229.27,856.415, '@Jokkum'),
+(@Jokkum*100,20,7846.17,-3253.24,852.128, '@Jokkum'),
+(@Jokkum*100,21,7849.41,-3270.86,854.538, '@Jokkum'),
+(@Jokkum*100,22,7853.12,-3268.03,853.50, '@Jokkum'),
+(@Veranus*100,1, 7915.017578, -3202.903076, 899.580872, '@Veranus'),
+(@Veranus*100,2, 7889.363770, -3236.394043, 899.580872, '@Veranus'),
+(@Veranus*100,3, 7865.838867, -3266.453369, 899.580872, '@Veranus'),
+(@Veranus*100,4, 7929.517578, -3369.971191, 899.580872, '@Veranus');
diff --git a/sql/updates/world/2015_02_23_06_world.sql b/sql/updates/world/2015_02_23_06_world.sql
new file mode 100644
index 00000000000..7bb0e20cc14
--- /dev/null
+++ b/sql/updates/world/2015_02_23_06_world.sql
@@ -0,0 +1 @@
+UPDATE `spell_area` SET `quest_end`='13157', `quest_end_status`='1' WHERE `spell`='57674' and`area`='4504' and`quest_start`='13086' and`aura_spell`='0' and`racemask`='0' and`gender`='2';
diff --git a/sql/updates/world/2015_02_23_07_world.sql b/sql/updates/world/2015_02_23_07_world.sql
new file mode 100644
index 00000000000..01ab70e6981
--- /dev/null
+++ b/sql/updates/world/2015_02_23_07_world.sql
@@ -0,0 +1,18 @@
+-- North Sea Kraken SAI
+SET @ENTRY := 34925;
+UPDATE `creature_template` SET `AIName`='SmartAI' WHERE `entry`=@ENTRY;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY*100 AND `source_type`=9;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,0,0,0,0,0,100,0,6000,9000,7000,9000,11,66514,0,0,0,0,0,1,0,0,0,0,0,0,0,'North Sea Kraken - IC - Cast Frost Breath'),
+(@ENTRY,0, 1,0,8,0,25,0,66588,0,0,0,80,@ENTRY*100,2,0,0,0,0,1,0,0,0,0,0,0,0,'North Sea Kraken - On Spell hit Flaming Sphere - actionList'),
+(@ENTRY*100,9,0,0,0,0,100,0,0,0,0,0,11,66717,0,0,0,0,0,7,0,0,0,0,0,0,0,'North Sea Kraken - actionList - Cast 66717'),
+(@ENTRY*100,9,1,0,0,0,100,0,0,0,0,0,11,50142,2,0,0,0,0,1,0,0,0,0,0,0,0,'North Sea Kraken - actionList - Cast 50142'),
+(@ENTRY*100,9,2,0,0,0,100,0,3000,3000,0,0,47,0,0,0,0,0,0,1,0,0,0,0,0,0,0,'North Sea Kraken - actionList - Turn Invisible'),
+(@ENTRY*100,9,3,0,0,0,100,0,0,0,0,0,24,0,0,0,0,0,0,1,0,0,0,0,0,0,0,'North Sea Kraken - actionList - Evade'),
+(@ENTRY, 0, 2, 0, 1, 0, 100, 0, 30000, 30000, 30000, 30000, 47, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Northsea Kraken - OOC - Make Visible'),
+(@ENTRY, 0, 3, 4, 2, 0, 100, 1, 1, 6, 0, 0, 11, 66994, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 'Northsea Kraken - On Between 1 and 6% HP - Cast Kraken Tooth Explosion'),
+(@ENTRY, 0, 4, 5, 61, 0, 100, 0, 0, 0, 0, 0, 11, 66717, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 'Northsea Kraken - Linked with previous event - Give quest credit'),
+(@ENTRY, 0, 5, 0, 61, 0, 100, 0, 0, 0, 0, 0, 37, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Northsea Kraken - Linked With Previous Event die'),
+(@ENTRY, 0, 6, 0, 1, 0, 100, 0, 30000, 30000, 30000, 30000, 11, 68909, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Northsea Kraken - OOC - Cast Submerge '),
+(@ENTRY, 0, 7, 0, 0, 0, 100, 0, 15000, 20000, 15000, 20000, 11, 66511, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 'Northsea Kraken - IC - Whirl');
diff --git a/sql/updates/world/2015_02_23_08_world.sql b/sql/updates/world/2015_02_23_08_world.sql
new file mode 100644
index 00000000000..28f50fde9dd
--- /dev/null
+++ b/sql/updates/world/2015_02_23_08_world.sql
@@ -0,0 +1,281 @@
+SET @Defender := 10948; -- Darrowshire Defender
+SET @Skeleton := 10952; -- Maraudin Skeleton
+SET @Corpse := 10951; -- Marauding Corpse
+SET @Silver := 10949; -- Silver hand disciple
+SET @Sevant := 10953; -- Sevant of Horgus
+SET @Lightfire := 10944; -- Davil Lightfire
+SET @Horgus := 10946; -- Horgus the Ravager
+SET @Betrayer := 10947; -- Darrowshire Betrayer
+SET @Redpath := 10937; -- Captain Redpath
+SET @Bloodletter := 10954; -- Bloodletter
+SET @Marduk := 10939; -- Marduk the Black
+SET @CorruptedRed := 10938; -- Redpath the Corrupted
+SET @Joseph := 10936; -- Joseph Redpath
+SET @Davil := 10945; -- Davil Crokford
+SET @Pamela := 10926; -- Pamela Redpath
+SET @Relic := 177526; -- Relic Bundle, spell:=18987
+
+DELETE FROM `creature_template_addon` WHERE `entry` IN(@Silver ,@Lightfire, @Defender, @Joseph, @Davil, @Pamela, @Horgus);
+INSERT INTO `creature_template_addon` (`entry`, `mount`, `bytes1`, `bytes2`, `auras`) VALUES
+(@Silver, 0, 0, 0, '17327'),
+(@Lightfire, 0, 0, 0, '17327'),
+(@Defender, 0, 0, 0, '17327'),
+(@Joseph, 0, 0, 0, '17327'),
+(@Davil, 0, 0, 0, '17327'),
+(@Pamela, 0, 0, 0, '17327'),
+(@Horgus, 0, 0, 0, '17467');
+
+UPDATE `creature_template` SET `AIName`='SmartAI' WHERE `entry` IN (@Defender, @Skeleton, @Corpse, @Sevant, @Lightfire, @Horgus, @Betrayer, @Redpath, @Bloodletter, @Marduk, @CorruptedRed, @Joseph, @Pamela, @Davil, @CorruptedRed);
+UPDATE `gameobject_template` SET `AIName`='SmartGameObjectAI' WHERE `entry`=@Relic;
+UPDATE `gameobject` SET `position_x`=1439.81, `position_y`=-3702.22, `position_z`=77.12 WHERE `guid`=99891;
+UPDATE `creature` SET `Orientation`=2.276223 WHERE `id`=@Pamela;
+
+DELETE FROM `creature_summon_groups` WHERE `summonerid`=@Redpath;
+INSERT INTO `creature_summon_groups` (`summonerId`, `summonerType`, `groupId`, `entry`, `position_x`, `position_y`, `position_z`, `orientation`, `summonType`, `summonTime`) VALUES
+(@Redpath,0,0,@Defender,1484.442993, -3676.545410, 79.871506, 0.169049,8,0),
+(@Redpath,0,0,@Defender,1497.560669, -3637.805176, 85.364410, 3.957781,8,0),
+(@Redpath,0,0,@Defender,1509.516357, -3640.667969, 88.113441, 4.707833,8,0),
+(@Redpath,0,0,@Defender,1511.495483, -3650.671631, 88.055191, 1.052592,8,0),
+(@Redpath,0,0,@Defender,1503.856812, -3664.068359, 83.389610, 1.052592,8,0),
+(@Redpath,0,0,@Defender,1494.220215, -3656.542725, 83.329399, 0.954417,8,0),
+(@Redpath,0,0,@Defender,1495.856445, -3684.522461, 80.549515, 0.002224,8,0),
+(@Redpath,0,0,@Defender,1494.905640, -3678.563477, 80.728012, 6.140110,8,0),
+(@Redpath,0,0,@Defender,1494.013916, -3671.843262, 81.187721, 0.139665,8,0),
+(@Redpath,0,0,@Defender,1493.794922, -3665.639893, 81.787727, 5.719919,8,0),
+(@Redpath,0,0,@Defender,1513.222290, -3693.317627, 84.312233, 2.388256,8,0),
+(@Redpath,0,0,@Defender,1508.203369, -3701.367188, 81.152023, 1.888743,8,0),
+(@Redpath,0,0,@Defender,1516.244263, -3706.704346, 82.785568, 5.756826,8,0),
+(@Redpath,0,0,@Defender,1511.111084, -3709.822998, 82.240448, 2.073311,8,0),
+(@Redpath,0,0,@Defender,1504.386353, -3709.648193, 81.169960, 0.557490,8,0),
+(@Redpath,0,1,@Skeleton, 1497.560669, -3637.805176, 85.364410, 3.957781,8,0), -- phase 1
+(@Redpath,0,1,@Corpse, 1509.516357, -3640.667969, 88.113441, 4.707833,8,0),
+(@Redpath,0,1,@Skeleton ,1511.495483, -3650.671631, 88.055191, 1.052592,8,0),
+(@Redpath,0,1,@Corpse, 1503.856812, -3664.068359, 83.389610, 1.052592,8,0),
+(@Redpath,0,1,@Skeleton ,1494.220215, -3656.542725, 83.329399, 0.954417,8,0),
+(@Redpath,0,1,@Skeleton, 1495.856445, -3684.522461, 80.549515, 0.002224,8,0),
+(@Redpath,0,1,@Corpse, 1494.905640, -3678.563477, 80.728012, 6.140110,8,0),
+(@Redpath,0,1,@Skeleton, 1494.013916, -3671.843262, 81.187721, 0.139665,8,0),
+(@Redpath,0,1,@Corpse, 1493.794922, -3665.639893, 81.787727, 5.719919,8,0),
+(@Redpath,0,1,@Skeleton, 1513.222290, -3693.317627, 84.312233, 2.388256,8,0),
+(@Redpath,0,1,@Corpse, 1508.203369, -3701.367188, 81.152023, 1.888743,8,0),
+(@Redpath,0,1,@Skeleton, 1516.244263, -3706.704346, 82.785568, 5.756826,8,0),
+(@Redpath,0,1,@Corpse, 1511.111084, -3709.822998, 82.240448, 2.073311,8,0),
+(@Redpath,0,1,@Skeleton, 1504.386353, -3709.648193, 81.169960, 0.557490,8,0),
+(@Redpath,0,2,@Sevant, 1497.560669, -3637.805176, 85.364410, 3.957781,8,0), -- phase 2
+(@Redpath,0,2,@Sevant, 1509.516357, -3640.667969, 88.113441, 4.707833,8,0),
+(@Redpath,0,2,@Sevant, 1511.495483, -3650.671631, 88.055191, 1.052592,8,0),
+(@Redpath,0,2,@Sevant, 1503.856812, -3664.068359, 83.389610, 1.052592,8,0),
+(@Redpath,0,2,@Sevant, 1494.220215, -3656.542725, 83.329399, 0.954417,8,0),
+(@Redpath,0,2,@Sevant, 1495.856445, -3684.522461, 80.549515, 0.002224,8,0),
+(@Redpath,0,2,@Sevant, 1494.905640, -3678.563477, 80.728012, 6.140110,8,0),
+(@Redpath,0,2,@Sevant, 1494.013916, -3671.843262, 81.187721, 0.139665,8,0),
+(@Redpath,0,2,@Sevant, 1493.794922, -3665.639893, 81.787727, 5.719919,8,0),
+(@Redpath,0,2,@Sevant, 1513.222290, -3693.317627, 84.312233, 2.388256,8,0),
+(@Redpath,0,2,@Sevant, 1508.203369, -3701.367188, 81.152023, 1.888743,8,0),
+(@Redpath,0,2,@Sevant, 1516.244263, -3706.704346, 82.785568, 5.756826,8,0),
+(@Redpath,0,2,@Sevant, 1511.111084, -3709.822998, 82.240448, 2.073311,8,0),
+(@Redpath,0,2,@Sevant, 1504.386353, -3709.648193, 81.169960, 0.557490,8,0),
+(@Redpath,0,3,@Silver,1495.857910, -3682.440674,80.630501, 0.022911,8,0),
+(@Redpath,0,3,@Silver,1490.361938, -3684.647705, 80.350754, 0.285233,8,0),
+(@Redpath,0,3,@Silver,1495.075928, -3670.077148, 81.964828, 0.846651,8,0),
+(@Redpath,0,3,@Silver,1489.382568, -3666.546875, 81.307182, 0.058259,8,0),
+(@Redpath,0,4,@Betrayer, 1497.560669, -3637.805176, 85.364410, 3.957781,8,0), -- phase3
+(@Redpath,0,4,@Betrayer, 1509.516357, -3640.667969, 88.113441, 4.707833,8,0),
+(@Redpath,0,4,@Betrayer, 1511.495483, -3650.671631, 88.055191, 1.052592,8,0),
+(@Redpath,0,4,@Betrayer, 1503.856812, -3664.068359, 83.389610, 1.052592,8,0),
+(@Redpath,0,4,@Betrayer, 1494.220215, -3656.542725, 83.329399, 0.954417,8,0),
+(@Redpath,0,4,@Bloodletter, 1495.856445, -3684.522461, 80.549515, 0.002224,8,0),
+(@Redpath,0,4,@Bloodletter, 1494.905640, -3678.563477, 80.728012, 6.140110,8,0),
+(@Redpath,0,4,@Bloodletter, 1494.013916, -3671.843262, 81.187721, 0.139665,8,0),
+(@Redpath,0,4,@Bloodletter, 1493.794922, -3665.639893, 81.787727, 5.719919,8,0),
+(@Redpath,0,4,@Betrayer, 1513.222290, -3693.317627, 84.312233, 2.388256,8,0),
+(@Redpath,0,4,@Betrayer, 1508.203369, -3701.367188, 81.152023, 1.888743,8,0),
+(@Redpath,0,4,@Betrayer, 1516.244263, -3706.704346, 82.785568, 5.756826,8,0),
+(@Redpath,0,4,@Betrayer, 1511.111084, -3709.822998, 82.240448, 2.073311,8,0),
+(@Redpath,0,4,@Betrayer, 1504.386353, -3709.648193, 81.169960, 0.557490,8,0);
+
+DELETE FROM `smart_scripts` WHERE `entryorguid` = @Relic AND `source_type` = 1;
+DELETE FROM `smart_scripts` WHERE `entryorguid` = @Relic*100 AND `source_type` = 9;
+DELETE FROM `smart_scripts` WHERE `entryorguid` = @Lightfire AND `source_type` = 0;
+DELETE FROM `smart_scripts` WHERE `entryorguid` = @Lightfire *100 AND `source_type` = 9;
+DELETE FROM `smart_scripts` WHERE `entryorguid` = @Defender AND `source_type` = 0;
+DELETE FROM `smart_scripts` WHERE `entryorguid` = @Defender *100 AND `source_type` = 9;
+DELETE FROM `smart_scripts` WHERE `entryorguid` = @Marduk AND `source_type` = 0;
+DELETE FROM `smart_scripts` WHERE `entryorguid` = @Marduk*100 AND `source_type` = 9;
+DELETE FROM `smart_scripts` WHERE `entryorguid` = @Horgus AND `source_type` = 0;
+DELETE FROM `smart_scripts` WHERE `entryorguid` = @Horgus*100 AND `source_type` = 9;
+DELETE FROM `smart_scripts` WHERE `entryorguid` = @Redpath AND `source_type` = 0;
+DELETE FROM `smart_scripts` WHERE `entryorguid` = @Redpath*100 AND `source_type` = 9;
+DELETE FROM `smart_scripts` WHERE `entryorguid` = @Redpath*100+1 AND `source_type` = 9;
+DELETE FROM `smart_scripts` WHERE `entryorguid` = @CorruptedRed AND `source_type` = 0;
+DELETE FROM `smart_scripts` WHERE `entryorguid` = @CorruptedRed*100 AND `source_type` = 9;
+DELETE FROM `smart_scripts` WHERE `entryorguid` = @Davil AND `source_type` = 0;
+DELETE FROM `smart_scripts` WHERE `entryorguid` = @Joseph AND `source_type` = 0;
+DELETE FROM `smart_scripts` WHERE `entryorguid` = @Joseph*100 AND `source_type` = 9;
+DELETE FROM `smart_scripts` WHERE `entryorguid` = @Joseph*100+1 AND `source_type` = 9;
+
+INSERT INTO `smart_scripts` (`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`, `comment`) VALUES
+(@Relic, 1, 0, 0, 63, 0, 100, 0, 0, 0, 0, 0, 80, @Relic*100, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Relic - On spawn - action list'),
+(@Relic*100, 9, 0, 0, 0, 0, 100, 0, 2000, 2000, 0, 0, 12, @Redpath, 6, 6000, 0, 0, 0, 8, 0, 0, 0, 1453.091431, -3693.156494, 76.784241, 0.486776, 'Relic - action list - spawn Redpath'),
+(@Redpath, 0, 0, 0, 63, 0, 100, 0, 0, 0, 0, 0, 80, @Redpath*100, 2, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Redpath - On spawn - action list'),
+(@Redpath*100, 9, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 47, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Redpath - Set invisible - action list'),
+(@Redpath*100, 9, 1, 0, 0, 0, 100, 0, 5000, 5000, 0, 0, 107, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Redpath - Spawn groupe 1 - action list'),
+(@Redpath*100, 9, 2, 0, 0, 0, 100, 0, 4000, 4000, 0, 0, 1, 0, 0, 0, 0, 0, 0, 19, @Defender, 40, 0, 0, 0, 0, 0, 'Defender - talk1 - action list'),
+(@Redpath*100, 9, 3, 0, 0, 0, 100, 0, 7000, 7000, 0, 0, 107, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Redpath - Spawn g2 wave1- action list'),
+(@Redpath*100, 9, 4, 0, 0, 0, 100, 0, 25000, 25000, 0, 0, 107, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Redpath - Spawn g2 wave2 - action list'),
+(@Redpath*100, 9, 5, 0, 0, 0, 100, 0, 25000, 25000, 0, 0, 12, @Lightfire, 6, 6000, 0, 0, 0, 8, 0, 0, 0, 1453.091431, -3693.156494, 76.784241, 0.486776, 'Redpath - spawn Lightfire - action list'),
+(@Redpath*100, 9, 6, 0, 0, 0, 100, 0, 0, 0, 0, 0, 12, @Davil, 8, 600000, 0, 0, 0, 8, 0, 0, 0, 1464.515991, -3678.878418, 78.043877, 0.577881, 'Redpath - Spawn Davil - action list'),
+(@Redpath*100, 9, 7, 0, 0, 0, 100, 0, 0, 0, 0, 0, 107, 3, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Redpath - Spawn g3 wave1 - action list'),
+(@Redpath*100, 9, 8, 0, 0, 0, 100, 0, 5000, 5000, 0, 0, 107, 2, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Redpath - Spawn g4 wave1 - action list'),
+(@Redpath*100, 9, 9, 0, 0, 0, 100, 0, 25000, 25000, 0, 0, 107, 2, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Redpath - Spawn g4 wave2 - action list'),
+(@Redpath*100, 9, 10, 0, 0, 0, 100, 0, 0, 0, 0, 0, 12, @Horgus, 6, 6000, 0, 0, 0, 8, 0, 0, 0, 1501.275024, -3675.826172, 81.447624, 3.300069, 'Redpath - Spawn Horgus - action list'),
+(@Redpath*100, 9, 11, 0, 0, 0, 100, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 19, @Horgus, 100, 0, 0, 0, 0, 0, 'Horgus - talk1 - action list'),
+(@Horgus, 0, 0, 0, 63, 0, 100, 0, 0, 0, 0, 0, 11, 29060, 1, 0, 0, 0, 0, 19, @Lightfire, 100, 0, 0, 0, 0, 0, 'Horgus - On spawn - cast spell 29060'),
+(@Lightfire, 0, 0, 0, 63, 0, 100, 0, 0, 0, 0, 0, 53, 1,@Lightfire, 0, 0, 9000000, 2, 1, 0, 0, 0, 0, 0, 0, 0, 'Lightfire - On spawn - waypoint1'),
+(@Lightfire, 0, 1, 0, 63, 0, 100, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Lightfire - On spawn - texte1'),
+(@Davil, 0, 0, 0, 63, 0, 100, 0, 0, 0, 0, 0, 47, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Redpath - On spawn - action list'),
+(@Davil, 0, 1, 0, 63, 0, 100, 0, 0, 0, 0, 0, 1, 2, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Lightfire - On spawn - texte2'),
+(@Joseph, 0, 0, 0, 63, 0, 100, 0, 0, 0, 0, 0, 80, @Joseph*100, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Joseph - On spawn - action list'),
+(@Joseph*100, 9, 0, 0, 0, 0, 100, 0, 30000, 30000, 0, 0, 41, 0, 0, 0, 0, 0, 0, 19, @Davil, 100, 0, 0, 0, 0, 0, 'Davil - despawn - action list'),
+(@Joseph*100, 9, 1, 0, 0, 0, 100, 0, 0, 0, 0, 0, 53, 0, @Joseph, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Joseph - Start Script - waypoint '),
+(@Joseph*100, 9, 2, 0, 0, 0, 100, 0, 0, 0, 0, 0, 81, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Joseph - Start Script - remove npcflag'),
+(@Joseph, 0, 1, 0, 40, 0, 100, 0, 4, 0, 0, 0, 80, @Joseph*100+1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Joseph - On waypoint4 - Start Script'),
+(@Joseph*100+1, 9, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Joseph - On Script - Talk1'),
+(@Joseph*100+1, 9, 1, 0, 0, 0, 100, 0, 4000, 4000, 0, 0, 1, 0, 0, 0, 0, 0, 0, 19, @Pamela, 10, 0, 0, 0, 0, 0, 'Pamela - On Script - Talk1'),
+(@Joseph*100+1, 9, 2, 0, 0, 0, 100, 0, 4000, 4000, 0, 0, 1, 1, 0, 0, 0, 0, 0, 19, @Pamela, 10, 0, 0, 0, 0, 0, 'Pamela - On Script - Talk2'),
+(@Joseph*100+1, 9, 3, 0, 0, 0, 100, 0, 4000, 4000, 0, 0, 1, 2, 0, 0, 0, 0, 0, 19, @Pamela, 10, 0, 0, 0, 0, 0, 'Pamela - On Script - Talk3'),
+(@Joseph*100+1, 9, 4, 0, 0, 0, 100, 0, 6000, 6000, 0, 0, 1, 3, 0, 0, 0, 0, 0, 19, @Pamela, 10, 0, 0, 0, 0, 0, 'Pamela - On Script - Talk4'),
+(@Joseph*100+1, 9, 5, 0, 0, 0, 100, 0, 4000, 4000, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Joseph - On Script - Talk2'),
+(@Joseph*100+1, 9, 6, 0, 0, 0, 100, 0, 5000, 5000, 0, 0, 41, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Joseph - despawn - action list'),
+(@Joseph, 0, 2, 0, 64, 0, 100, 0, 0, 0, 0, 0, 33, @Joseph, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'Joseph - On waypoint4 - Start Script'),
+(@Horgus, 0, 1, 0, 6, 0, 100, 0, 0, 0, 0, 0, 80, @Horgus*100, 2, 0, 0, 0, 0, 19, @Redpath, 100, 0, 0, 0, 0, 0, 'Horgus - On death - action list'),
+(@Horgus*100, 9, 0, 0, 0, 0, 100, 0, 1000, 1000, 0, 0, 1, 1, 0, 0, 0, 0, 0, 19, @Lightfire, 100, 0, 0, 0, 0, 0, 'Lightfire - talk 2 - action list'),
+(@Horgus*100, 9, 1, 0, 0, 0, 100, 0, 3000, 3000, 0, 0, 1, 1, 0, 0, 0, 0, 0, 19, @Defender, 100, 0, 0, 0, 0, 0, 'Defender - talk 2 - action list'),
+(@Horgus*100, 9, 2, 0, 0, 0, 100, 0, 3000, 3000, 0, 0, 1, 2, 0, 0, 0, 0, 0, 19, @Lightfire, 100, 0, 0, 0, 0, 0, 'Lightfire - talk 3 - action list'),
+(@Horgus*100, 9, 3, 0, 0, 0, 100, 0, 0, 0, 0, 0, 1, 3, 0, 0, 0, 0, 0, 19, @Lightfire, 100, 0, 0, 0, 0, 0, 'Lightfire - talk 3 - action list'),
+(@Horgus*100, 9, 4, 0, 0, 0, 100, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 19, @Lightfire, 100, 0, 0, 0, 0, 0, 'Lightfire - On Script - Set React Passive'),
+(@Horgus*100, 9, 5, 0, 0, 0, 100, 0, 0, 0, 0, 0, 18, 512, 0, 0, 0, 0, 0,19, @Lightfire, 100, 0, 0, 0, 0, 0, 'Lightfire - On Script - Set Immune To NPC'),
+(@Horgus*100, 9, 6, 0, 0, 0, 100, 0, 0, 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 19, @Lightfire, 100, 0, 0, 0, 0, 0, 'Lightfire - On Script - evade'),
+(@Horgus*100, 9, 7, 0, 0, 0, 100, 0, 0, 0, 0, 0, 5, 65, 0, 0, 0, 0, 0, 19, @Lightfire, 100, 0, 0, 0, 0, 0, 'Lightfire - play emote - action list'),
+(@Horgus*100, 9, 8, 0, 0, 0, 100, 0, 0, 0, 0, 0, 41, 0, 0, 0, 0, 0, 0, 19, @Lightfire, 100, 0, 0, 0, 0, 0, 'Lightfire - despawn - action list'),
+(@Horgus*100, 9, 9, 0, 0, 0, 100, 0, 3000, 3000, 0, 0, 47, 1, 0, 0, 0, 0, 0, 19, @Redpath, 100, 0, 0, 0, 0, 0, 'Redpath - Visible On - action list'),
+(@Horgus*100, 9, 10, 0, 0, 0, 100, 0, 3000, 3000, 0, 0, 53, 1, @Redpath, 0, 0, 0, 2, 19, @Redpath, 100, 0, 0, 0, 0, 0, 'Redpath - waypoint 1 - action list'),
+(@Horgus*100, 9, 11, 0, 0, 0, 100, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 19, @Redpath, 100, 0, 0, 0, 0, 0, 'Redpath - talk 1 - action list'),
+(@Horgus*100, 9, 12, 0, 0, 0, 100, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 19, @Davil, 100, 0, 0, 0, 0, 0, 'Redpath - talk 2 - action list'),
+(@Horgus*100, 9, 13, 0, 0, 0, 100, 0, 5000, 5000, 0, 0, 107, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Redpath - Spawn g1 wave3 - action list'),
+(@Horgus*100, 9, 14, 0, 0, 0, 100, 0, 25000, 25000, 0, 0, 107, 4, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Redpath - Spawn g4 wave1 - action list'),
+(@Horgus*100, 9, 15, 0, 0, 0, 100, 0, 25000, 25000, 0, 0, 107, 4, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Redpath - Spawn g4 wave2 - action list'),
+(@Horgus*100, 9, 16, 0, 0, 0, 100, 0, 10000, 10000, 0, 0, 86, 18650, 2, 19, @Redpath, 50, 0, 19, @Redpath, 50, 0, 0, 0, 0, 0, 'Redpath - Spawn Marduk - action list'),
+(@Horgus*100, 9, 17, 0, 0, 0, 100, 0, 2000, 2000, 0, 0, 1, 0, 0, 0, 0, 0, 0, 19, @Marduk, 100, 0, 0, 0, 0, 0, 'Marduk - talk 1 - action list'),
+(@Horgus*100, 9, 18, 0, 0, 0, 100, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 19, @Redpath, 100, 0, 0, 0, 0, 0, 'Redpath - On Script - Set React Passive'),
+(@Horgus*100, 9, 19, 0, 0, 0, 100, 0, 0, 0, 0, 0, 18, 512, 0, 0, 0, 0, 0,19, @Redpath, 100, 0, 0, 0, 0, 0, 'Redpath - On Script - Set Immune To NPC'),
+(@Horgus*100, 9, 20, 0, 0, 0, 100, 0, 0, 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 19, @Redpath, 100, 0, 0, 0, 0, 0, 'Redpath - On Script - evade'),
+(@Horgus*100, 9, 21, 0, 0, 0, 100, 0, 0, 0, 0, 0, 47, 0, 0, 0, 0, 0, 0, 19, @Redpath, 100, 0, 0, 0, 0, 0, 'Redpath - set visible off - action list'),
+(@Horgus*100, 9, 22, 0, 0, 0, 100, 0, 1000, 1000, 0, 0, 12, @CorruptedRed, 6, 60000, 0, 0, 0, 8, 0, 0, 0, 1494.081055, -3676.041748,80.846764, 6.269975, 'Redpath - Spawn CorruptedRed - action list'),
+(@Horgus*100, 9, 23, 0, 0, 0, 100, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 19, @CorruptedRed, 40, 0, 0, 0, 0, 0, 'CorruptedRed - talk 1 - action list'),
+(@Horgus*100, 9, 24, 0, 0, 0, 100, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 19, @CorruptedRed, 40, 0, 0, 0, 0, 0, 'CorruptedRed - On talk 2 - action list'),
+(@Horgus*100, 9, 25, 0, 0, 0, 100, 0, 5000, 5000, 0, 0, 41, 2, 0, 0, 0, 0, 0, 19, @Marduk, 40, 0, 0, 0, 0, 0, 'Marduk - Despawn - action list'),
+(@Marduk, 0, 0, 0, 63, 0, 100, 0, 0, 0, 0, 0, 80, @Marduk*100, 2, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Horgus - On spawn - ActionList'),
+(@Marduk*100, 9, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Marduk - On Script - Root'),
+(@Marduk*100, 9, 1, 0, 0, 0, 100, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Marduk - On Script - Set React Passive'),
+(@Marduk*100, 9, 2, 0, 0, 0, 100, 0, 0, 0, 0, 0, 18, 2, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Marduk - On Script - Unit flag non attackable'),
+(@Marduk*100, 9, 3, 0, 0, 0, 100, 0, 0, 0, 0, 0, 18, 512, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Redpath - On Script - Set Immune To NPC'),
+(@Marduk*100, 9, 4, 0, 0, 0, 100, 0, 0, 0, 0, 0, 18, 131072, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Redpath - On Script - Set PACIFIED'),
+(@CorruptedRed, 0, 0, 0, 6, 0, 100, 0, 0, 0, 0, 0, 80, @CorruptedRed*100, 2, 0, 0, 0, 0, 19, @Davil, 100, 0, 0, 0, 0, 0, 'CorruptedRed - On death - action list'),
+(@CorruptedRed*100, 9, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 12, @Joseph, 8, 60000, 0, 0, 0, 8, 0, 0, 0, 1444.337891, -3702.661133, 77.368271, 0.860624, 'Joseph - Spawn - action list'),
+(@CorruptedRed*100, 9, 1, 0, 0, 0, 100, 0, 1000, 1000, 0, 0, 1, 2, 0, 0, 0, 0, 0, 19, @Defender, 100, 0, 0, 0, 0, 0, 'Defender - talk3 - action list'),
+(@CorruptedRed*100, 9, 2, 0, 0, 0, 100, 0, 3000, 3000, 0, 0, 1, 3, 0, 0, 0, 0, 0, 19, @Defender, 100, 0, 0, 0, 0, 0, 'Defender - talk4 - action list'),
+(@CorruptedRed*100, 9, 3, 0, 0, 0, 100, 0, 1000, 1000, 0, 0, 1, 4, 0, 0, 0, 0, 0, 19, @Defender, 100, 0, 0, 0, 0, 0, 'Defender - talk5 - action list'),
+(@CorruptedRed*100, 9, 4, 0, 0, 0, 100, 0, 0, 0, 0, 0, 47, 1, 0, 0, 0, 0, 0, 19, @Davil, 100, 0, 0, 0, 0, 0, 'Davil - Set visible - action list'),
+(@CorruptedRed*100, 9, 5, 0, 0, 0, 100, 0, 10000, 10000, 0, 0, 41, 0, 0, 0, 0, 0, 0, 11, @Defender, 100, 0, 0, 0, 0, 0, 'Defender - despawn - action list'),
+(@CorruptedRed*100, 9, 6, 0, 0, 0, 100, 0, 0, 0, 0, 0, 41, 0, 0, 0, 0, 0, 0, 11, @Silver, 100, 0, 0, 0, 0, 0, 'Silver - despawn - action list'),
+(@CorruptedRed*100, 9, 7, 0, 0, 0, 100, 0, 0, 0, 0, 0, 41, 0, 0, 0, 0, 0, 0, 11, @Redpath, 100, 0, 0, 0, 0, 0, 'Redpath - despawn - action list'),
+(@CorruptedRed*100, 9, 8, 0, 0, 0, 100, 0, 0, 0, 0, 0, 41, 0, 0, 0, 0, 0, 0, 11, @Betrayer, 100, 0, 0, 0, 0, 0, 'Silver - despawn - action list'),
+(@Lightfire, 0, 3, 0, 6, 0, 100, 0, 0, 0, 0, 0, 80, @Lightfire*100, 2, 0, 0, 0, 0, 19, @Davil, 100, 0, 0, 0, 0, 0, 'Lightfire - On death - action list'),
+(@Lightfire*100, 9, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 1, 3, 0, 0, 0, 0, 0, 19, @Davil, 100, 0, 0, 0, 0, 0, 'Davil - talk4 - action list'),
+(@Lightfire*100, 9, 1, 0, 0, 0, 100, 0, 0, 0, 0, 0, 6, 5721, 0, 0, 0, 0, 0, 18, 100, 0, 0, 0, 0, 0, 0, 'Player - Quest failed - action list'),
+(@Lightfire*100, 9, 2, 0, 0, 0, 100, 0, 0, 0, 0, 0, 41, 0, 0, 0, 0, 0, 0, 11, @Defender, 100, 0, 0, 0, 0, 0, 'Defender - despawn - action list'),
+(@Lightfire*100, 9, 3, 0, 0, 0, 100, 0, 0, 0, 0, 0, 41, 0, 0, 0, 0, 0, 0, 11, @Silver, 100, 0, 0, 0, 0, 0, 'Silver - despawn - action list'),
+(@Lightfire*100, 9, 4, 0, 0, 0, 100, 0, 0, 0, 0, 0, 41, 0, 0, 0, 0, 0, 0, 11, @CorruptedRed, 100, 0, 0, 0, 0, 0, 'CorruptedRed - despawn - action list'),
+(@Lightfire*100, 9, 5, 0, 0, 0, 100, 0, 0, 0, 0, 0, 41, 0, 0, 0, 0, 0, 0, 11, @Betrayer, 100, 0, 0, 0, 0, 0, 'Betrayer - despawn - action list'),
+(@Lightfire*100, 9, 6, 0, 0, 0, 100, 0, 0, 0, 0, 0, 41, 0, 0, 0, 0, 0, 0, 11, @Bloodletter, 100, 0, 0, 0, 0, 0, 'Bloodletter - despawn - action list'),
+(@Lightfire*100, 9, 7, 0, 0, 0, 100, 0, 0, 0, 0, 0, 41, 0, 0, 0, 0, 0, 0, 11, @Sevant, 100, 0, 0, 0, 0, 0, 'Sevant - despawn - action list'),
+(@Lightfire*100, 9, 8, 0, 0, 0, 100, 0, 0, 0, 0, 0, 41, 0, 0, 0, 0, 0, 0, 11, @Horgus, 100, 0, 0, 0, 0, 0, 'Horgus - despawn - action list'),
+(@Lightfire*100, 9, 9, 0, 0, 0, 100, 0, 0, 0, 0, 0, 41, 0, 0, 0, 0, 0, 0, 11, @Skeleton, 100, 0, 0, 0, 0, 0, 'Skeleton - despawn - action list'),
+(@Lightfire*100, 9, 10, 0, 0, 0, 100, 0, 0, 0, 0, 0, 41, 0, 0, 0, 0, 0, 0, 11, @Corpse, 100, 0, 0, 0, 0, 0, 'Corpse - despawn - action list'),
+(@Lightfire*100, 9, 11, 0, 0, 0, 100, 0, 4000, 4000, 0, 0, 41, 0, 0, 0, 0, 0, 0, 19, @Redpath, 100, 0, 0, 0, 0, 0, 'Redpath - despawn - action list'),
+(@Lightfire*100, 9, 12, 0, 0, 0, 100, 0, 1000, 4000, 0, 0, 41, 0, 0, 0, 0, 0, 0, 19, @Davil, 100, 0, 0, 0, 0, 0, 'Davil - despawn - action list'),
+(@Redpath, 0, 1, 0, 6, 0, 100, 0, 0, 0, 0, 0, 80, @Redpath*100+1, 2, 0, 0, 0, 0, 19, @Davil, 100, 0, 0, 0, 0, 0, 'Redpath - On death - action list'),
+(@Redpath*100+1, 9, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 19, @Davil, 100, 0, 0, 0, 0, 0, 'Davil - talk1 - action list'),
+(@Redpath*100+1, 9, 1, 0, 0, 0, 100, 0, 0, 0, 0, 0, 6, 5721, 0, 0, 0, 0, 0, 18, 100, 0, 0, 0, 0, 0, 0, 'Player - quest failed - action list'),
+(@Redpath*100+1, 9, 2, 0, 0, 0, 100, 0, 0, 0, 0, 0, 41, 0, 0, 0, 0, 0, 0, 11, @Defender, 100, 0, 0, 0, 0, 0, 'Defender - despawn - action list'),
+(@Redpath*100+1, 9, 3, 0, 0, 0, 100, 0, 0, 0, 0, 0, 41, 0, 0, 0, 0, 0, 0, 11, @Silver, 100, 0, 0, 0, 0, 0, 'Silver - despawn - action list'),
+(@Redpath*100+1, 9, 4, 0, 0, 0, 100, 0, 0, 0, 0, 0, 41, 0, 0, 0, 0, 0, 0, 11, @CorruptedRed, 100, 0, 0, 0, 0, 0, 'CorruptedRed - despawn - action list'),
+(@Redpath*100+1, 9, 5, 0, 0, 0, 100, 0, 0, 0, 0, 0, 41, 0, 0, 0, 0, 0, 0, 11, @Betrayer, 100, 0, 0, 0, 0, 0, 'Betrayer - despawn - action list'),
+(@Redpath*100+1, 9, 6, 0, 0, 0, 100, 0, 0, 0, 0, 0, 41, 0, 0, 0, 0, 0, 0, 11, @Bloodletter, 100, 0, 0, 0, 0, 0, 'Bloodletter - despawn - action list'),
+(@Redpath*100+1, 9, 7, 0, 0, 0, 100, 0, 0, 0, 0, 0, 41, 0, 0, 0, 0, 0, 0, 11, @Sevant, 100, 0, 0, 0, 0, 0, 'Sevant - despawn - action list'),
+(@Redpath*100+1, 9, 8, 0, 0, 0, 100, 0, 0, 0, 0, 0, 41, 0, 0, 0, 0, 0, 0, 11, @Horgus, 100, 0, 0, 0, 0, 0, 'Horgus - despawn - action list'),
+(@Redpath*100+1, 9, 9, 0, 0, 0, 100, 0, 0, 0, 0, 0, 41, 0, 0, 0, 0, 0, 0, 11, @Skeleton, 100, 0, 0, 0, 0, 0, 'Skeleton - despawn - action list'),
+(@Redpath*100+1, 9, 10, 0, 0, 0, 100, 0, 0, 0, 0, 0, 41, 0, 0, 0, 0, 0, 0, 11, @Corpse, 100, 0, 0, 0, 0, 0, 'Corpse - despawn - action list'),
+(@Redpath*100+1, 9, 11, 0, 0, 0, 100, 0, 4000, 4000, 0, 0, 41, 0, 0, 0, 0, 0, 0, 19, @Davil, 100, 0, 0, 0, 0, 0, 'Davil - despawn - action list'),
+(@Defender,0,0,0,0,0,100,0,3000,5000,5000,8000,11,11976,0,0,0,0,0,2,0,0,0,0,0,0,0,'Darrowshire Defender - In Combat - Cast Strike'),
+(@Defender,0,1,0,0,0,100,0,5000,7000,7000,10000,11,12169,1,0,0,0,0,1,0,0,0,0,0,0,0,'Darrowshire Defender - In Combat - Cast Shield Block'),
+(@Lightfire,0,4,0,4,0,100,1,0,0,0,0,11,17232,0,0,0,0,0,1,0,0,0,0,0,0,0,'Davil Lightfire - On Aggro - Cast Devotion Aura'),
+(@Lightfire,0,5,0,0,0,100,0,5000,7000,8000,10000,11,17284,0,0,0,0,0,2,0,0,0,0,0,0,0,'Davil Lightfire - In Combat - Cast Holy Strike'),
+(@Lightfire,0,6,0,0,0,100,0,8000,11000,15000,20000,11,13005,0,0,0,0,0,5,0,0,0,0,0,0,0,'Davil Lightfire - In Combat - Cast Hammer of Justice'),
+(@Redpath,0,2,0,0,0,100,0,5000,7000,8000,10000,11,15284,0,0,0,0,0,2,0,0,0,0,0,0,0,'Captain Redpath - In Combat - Cast Cleave'),
+(@Redpath,0,3,0,0,0,100,0,8000,10000,14000,18000,11,6253,0,0,0,0,0,2,0,0,0,0,0,0,0,'Captain Redpath - In Combat - Cast Backhand'),
+(@Redpath,0,4,0,0,0,100,0,3000,5000,15000,20000,11,9128,0,0,0,0,0,1,0,0,0,0,0,0,0,'Captain Redpath - In Combat - Cast Battle Shout'),
+(@Horgus,0,2,0,0,0,100,0,3000,5000,6000,8000,11,3391,0,0,0,0,0,1,0,0,0,0,0,0,0,'Horgus the Ravager - In Combat - Cast Thrash'),
+(@Horgus,0,3,0,0,0,100,0,8000,11000,9000,12000,11,15608,1,0,0,0,0,2,0,0,0,0,0,0,0,'Horgus the Ravager - In Combat - Cast Ravenous Claw'),
+(@CorruptedRed,0,1,0,0,0,100,0,3000,5000,5000,7000,11,15580,0,0,0,0,0,2,0,0,0,0,0,0,0,'Redpath the Corrupted - In Combat - Cast Strike'),
+(@CorruptedRed,0,2,0,0,0,100,0,8000,10000,14000,18000,11,6253,0,0,0,0,0,2,0,0,0,0,0,0,0,'Redpath the Corrupted - In Combat - Cast Backhand'),
+(@CorruptedRed,0,3,0,0,0,100,0,3000,5000,15000,20000,11,16244,0,0,0,0,0,1,0,0,0,0,0,0,0,'Redpath the Corrupted - In Combat - Cast Demoralizing Shout'),
+(@CorruptedRed,0,4,0,0,0,100,0,5000,7000,9000,14000,11,12542,1,0,0,0,0,6,0,0,0,0,0,0,0,'Redpath the Corrupted - In Combat - Cast Fear');
+
+DELETE FROM `waypoints` WHERE `entry` IN (@Lightfire, @Redpath, @Joseph);
+INSERT INTO `waypoints` (`entry`,`pointid`,`position_x`,`position_y`,`position_z`,`point_comment`) VALUES
+(@Lightfire,1, 1501.275024, -3675.826172, 81.447624,'Lightfire'),
+(@joseph,1, 1433.060059, -3682.163086, 76.364197 , 'Joseph'),
+(@joseph,2, 1433.873169, -3640.699707, 78.194763, 'Joseph'),
+(@joseph,3, 1454.325439, -3595.439941, 86.951950, 'Joseph'),
+(@joseph,4, 1455.368286, -3596.347900, 86.950905, 'Joseph'),
+(@Redpath,1, 1501.275024, -3675.826172, 81.447624,'Redpath');
+
+UPDATE `npc_text` SET `BroadcastTextID0`=7454 WHERE `ID`=4777;
+DELETE FROM `gossip_menu` WHERE `entry`=3922 AND `text_id`=4777;
+INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (3922,4777);
+UPDATE `creature_template` SET `gossip_menu_id`=3922 WHERE `entry`=10945;
+UPDATE `creature_template` SET `npcflag`=1 WHERE `entry`=10945;
+UPDATE `npc_text` SET `BroadcastTextID0`=7455 WHERE `ID`=4778;
+DELETE FROM `gossip_menu` WHERE `entry`=3861 AND `text_id`=4778;
+INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (3861,4778);
+UPDATE `creature_template` SET `gossip_menu_id`=3861 WHERE `entry`=10936;
+UPDATE `creature_template` SET `npcflag`=1 WHERE `entry`=10936;
+
+DELETE FROM `creature_text` WHERE `entry` IN (@Defender, @Lightfire, @Horgus, @Redpath, @Marduk, @CorruptedRed, @Joseph, @Pamela, @Davil) ;
+INSERT INTO `creature_text` (`entry`, `groupid`, `id`, `text`, `type`, `language`, `probability`, `emote`, `duration`, `sound`, `comment`, `BroadcastTextID`) VALUES
+(@Defender, 0, 0, 'Darrowshire, to arms! The Scourge approach!', 14, 0, 100, 0, 0, 0, 'Defender1', 7358),
+(@Lightfire, 0, 0, 'Do not lose hope, Darrowshire! We will not fall!', 14, 0, 100, 0, 0, 0, 'Lightfire1', 7343),
+(@Horgus, 0, 0, 'The light burns bright in you, Davil, I will enjoy snuffing it out.', 14, 0, 100, 0, 0, 0, 'Horgus', 7344),
+(@Lightfire, 1, 0, 'Horgus, your nightmare ends! Now!', 14, 0, 100, 0, 0, 0, 'Lightfire2', 7346),
+(@Defender, 1, 0, 'Horgus is slain! Take heat, defenders of Darrowshire.', 14, 0, 100, 0, 0, 0, 'Defender2', 7368),
+(@Lightfire, 2, 0, 'Ah! My wounds are too severe. Defenders, fight on without me!', 12, 0, 100, 0, 0, 0, 'Lightfire2', 7227),
+(@Lightfire, 3, 0, 'Davil Lightfire has succumbed to his wounds!', 16, 0, 100, 0, 0, 0, 'Lightfire2', 7367),
+(@Redpath, 0, 0, 'Defenders of Darrowshire! Rally! we must prevail!', 14, 0, 100, 0, 0, 0, 'Redpath1', 7355),
+(@Davil, 1, 0, 'Captain Redpath has appeared on the battlefield! Protect him!', 41, 0, 100, 0, 0, 0, 'Redpath2', 45683),
+(@Davil, 0, 0, 'Captain Redpath! How could you forsake us!', 41, 0, 100, 0, 0, 0, 'Redpath3', 7212),
+(@Davil, 2, 0, 'Protect Davil Lightfire!', 41, 0, 100, 0, 0, 0, 'Lightfire1', 45681),
+(@Davil, 3, 0, 'Davil Lightfire is defeated! Darrowshire is lost!', 41, 0, 100, 0, 0, 0, 'Redpath4', 7366),
+(@Marduk, 0, 0, 'Redpath! Your life ends, here and now!', 12, 0, 100, 0, 0, 0, 'Marduk1', 7471),
+(@CorruptedRed, 0, 0, 'Darrowshire! Your are doomed!', 14, 0, 100, 0, 0, 0, 'CorruptedRed1', 7356),
+(@CorruptedRed, 1, 0, 'Captain Joseph Redpath has been corrupted! Kill him quickly!', 41, 0, 100, 0, 0, 0, 'CorruptedRed2', 45684),
+(@Defender, 2, 0, 'Captain Redpath is slain!', 14, 0, 100, 0, 0, 0, 'Defender3', 7369),
+(@Defender, 3, 0, 'The Scourge are defeated! Darrowshire is saved!', 14, 0, 100, 0, 0, 0, 'Defender4', 7407),
+(@Defender, 4, 0, 'Speak with Joseph Redpath in the center of Darrowshire.', 41, 0, 100, 0, 0, 0, 'Defender5', 45685),
+(@Joseph, 0, 0, 'Pamela? Are you there, honey?', 12, 0, 100, 0, 0, 0, 'Joseph1', 7397),
+(@Pamela, 0, 0, 'Daddy!', 12, 0, 100, 0, 0, 0, 'Pamela1', 7399),
+(@Pamela, 1, 0, 'Daddy! You''re back!', 12, 0, 100, 0, 0, 0, 'Pamela2', 7400),
+(@Pamela, 2, 0, 'Let''s go play! No, tell me a story, Daddy! No... let''s go pick flowers! And play tea time! I found my dollie, did I tell you?', 12, 0, 100, 0, 0, 0, 'Pamela3', 7401),
+(@Pamela, 3, 0, 'I missed you so much, Daddy!', 12, 0, 100, 0, 0, 0, 'Pamela4', 7402),
+(@Joseph, 1, 0, 'I missed you too, honey. And I''m finally home...', 12, 0, 100, 0, 0, 0, 'Joseph2', 7403);
diff --git a/sql/updates/world/2015_02_23_09_world.sql b/sql/updates/world/2015_02_23_09_world.sql
new file mode 100644
index 00000000000..f96d3d42a1b
--- /dev/null
+++ b/sql/updates/world/2015_02_23_09_world.sql
@@ -0,0 +1,5 @@
+DELETE FROM `spell_scripts` WHERE `id`= 66477;
+INSERT INTO `spell_scripts` (`id`, `effIndex`, `delay`, `command`, `datalong`, `datalong2`, `dataint`, `x`, `y`, `z`, `o`) VALUES
+(66477, 0, 0, 15, 66622, 2, 1, 0, 0, 0, 0),
+(66477, 0, 0, 15, 66478, 2, 1, 0, 0, 0, 0),
+(66477, 0, 0, 15, 66041, 2, 1, 0, 0, 0, 0);
diff --git a/sql/updates/world/2015_02_23_10_world.sql b/sql/updates/world/2015_02_23_10_world.sql
new file mode 100644
index 00000000000..e5b7bf5242d
--- /dev/null
+++ b/sql/updates/world/2015_02_23_10_world.sql
@@ -0,0 +1,177 @@
+-- A Distraction For Akama
+SET @Maiev := 22989; -- Maev
+SET @Akama := 22990; -- Akama
+SET @Vagath := 23152; -- Vagath
+SET @IllidariShadow := 22988; -- IllidariShadow
+SET @Ashtongue := 21701; -- Ashtongue
+SET @FanOfBlades := 39954; -- Maev spell
+SET @Stealth := 34189; -- Maev spell
+SET @ChainLightning := 39945; -- Akama spell
+SET @Xiri := 18528; -- XI'RI
+SET @IllidariRavag := 22857; -- Illidari Ravager
+SET @LightOfTheNaa1 := 39829; -- XI'RI spell
+SET @LightOfTheNaa2 := 39831; -- XI'RI spell
+SET @FyraDawnstar := 22864; -- FyraDawnstar
+SET @Caalen := 22862; -- Anachorete Caalen
+SET @Lightsworn := 22861; -- Lightsworn Vindicator
+SET @Magister := 22863; -- Seasoned Magister
+SET @ID := 8650; -- Gossip Menu
+
+UPDATE `creature_template` SET `AIName`='SmartAI' WHERE `entry` IN (22989, 22990, 23152, 22988, 21701, 18528, 22857, 22864, 22863, 22862, 22861);
+UPDATE `creature_template` SET `npcflag`=0 where `entry`=22990;
+DELETE FROM creature_summon_groups WHERE summonerid=@Xiri;
+INSERT INTO `creature_summon_groups` (`summonerId`, `summonerType`, `groupId`, `entry`, `position_x`, `position_y`, `position_z`, `orientation`, `summonType`, `summonTime`) VALUES
+(@Xiri,0,0,@Akama,-3557.775635,624.185852,6.244853,4.687259,3,300000),
+(@Xiri,0,0,@Maiev,-3563.998047,623.326050,6.134195,4.687259,3,300000),
+(@Xiri,0,0,@Ashtongue,-3568.963867,627.467407,5.477327,4.742220,3,300000),
+(@Xiri,0,0,@Ashtongue,-3565.453125,627.804199,5.458982,4.801125,3,300000),
+(@Xiri,0,0,@Ashtongue,-3561.734375,628.002930,5.536494,4.76578,3,300000),
+(@Xiri,0,0,@Ashtongue,-3557.638428,628.221863,5.681130,4.76578,3,300000),
+(@Xiri,0,0,@Ashtongue,-3554.038574,628.414246,5.853768,4.76578,3,300000),
+(@Xiri,0,0,@Ashtongue,-3557.367188,632.975952,5.016828,4.830713,3,300000),
+(@Xiri,0,0,@Ashtongue,-3561.433350,632.492554,4.889128,4.830713,3,300000),
+(@Xiri,0,0,@Ashtongue,-3565.568848,632.000916,4.862391,4.830713,3,300000),
+(@Xiri,0,0,@Vagath,-3564.023438,406.373199,29.640791,1.577282,3,300000),
+(@Xiri,0,0,@IllidariRavag,-3570.985840,408.893219,29.715797,1.529191,3,300000),
+(@Xiri,0,0,@IllidariRavag,-3556.721924,409.166534,29.495508,1.599877,3,300000),
+(@Xiri,0,0,@IllidariShadow,-3571.129395,418.261780,28.846333,1.556680,3,300000),
+(@Xiri,0,0,@IllidariShadow,-3581.750977,417.807861,30.357321,1.560607,3,300000),
+(@Xiri,0,0,@IllidariShadow,-3576.343506,424.403748,28.781679,1.482065,3,300000),
+(@Xiri,0,0,@IllidariShadow,-3568.493652,427.238312,28.031080,1.609870,3,300000),
+(@Xiri,0,0,@IllidariShadow,-3559.938232,428.418793,27.697611,1.641286,3,300000),
+(@Xiri,0,0,@IllidariShadow,-3564.919678,432.020447,27.485765,1.633432,3,300000);
+
+DELETE FROM `creature_text` WHERE `entry` IN (@Akama, @FyraDawnstar, @Caalen, @Vagath, @Maiev, @Xiri) ;
+INSERT INTO `creature_text` (`entry`, `groupid`, `id`, `text`, `type`, `language`, `probability`, `emote`, `duration`, `sound`, `comment`, `BroadcastTextId`) VALUES
+(@FyraDawnstar, 0, 0, 'Onward, Scryers! Show Illidan''s lackeys the temper of our steel!', 14, 0, 100, 0, 0, 0, 'Fyra Downstar', 20696),
+(@Caalen, 0, 0, 'Come closer, demon! Death awaits!', 12, 0, 100, 0, 0, 0, 'Caalen', 20670),
+(@Caalen, 0, 1, 'Illidan''s lapdogs! Destroy them all!', 12, 0, 100, 0, 0, 0, 'Caalen', 20669),
+(@Caalen, 0, 2, 'I''ve a message for your master, scum!', 12, 0, 100, 0, 0, 0, 'Caalen', 20672),
+(@Caalen, 0, 3, 'Pathetic worm... your master''s days are over!', 12, 0, 100, 0, 0, 0, 'Caalen', 20671),
+(@Caalen, 0, 4, 'For Xi''ri! For the Sha''tar!', 12, 0, 100, 0, 0, 0, 'Caalen', 20667),
+(@Caalen, 0, 5, 'Your end is at hand, Illidari!', 12, 0, 100, 0, 0, 0, 'Caalen', 20668),
+(@Vagath, 0, 0, 'Pitiful wretches. You dared invade Illidan''s temple? Very well, I shall make it your death bed!', 14, 0, 100, 0, 0, 0, 'Vagath', 20719),
+(@Akama, 0, 0, 'Now is the time, Maiev! Unleash your wrath!', 14, 0, 100, 0, 0, 0, 'Akama', 20742),
+(@Maiev, 0, 0, 'I''ve waited for this moment for years. Illidan and his lapdogs will be destroyed!', 14, 0, 100, 0, 0, 0, 'Maiev', 20743),
+(@Akama, 1, 0, 'Slay all who see us! Word must not get back to Illidan.', 14, 0, 100, 0, 0, 0, 'Akama', 20744),
+(@Maiev, 1, 0, 'Meet your end, demon!', 12, 0, 100, 0, 0, 0, 'Maiev', 0),
+(@Vagath, 1, 0, 'You''ve sealed you fate, Akama. The Master will learn from your betrayal!', 14, 0, 100, 0, 0, 0, 'Vagath', 20745),
+(@Akama, 2, 0, 'Akama has no master, not anymore.', 12, 0, 100, 0, 0, 0, 'Akama', 20746),
+(@Akama, 3, 0, 'Our plans are in danger already. It appears Maiev''s decided to do things her own way.', 12, 0, 100, 0, 0, 0, 'Akama', 20748),
+(@Akama, 4, 0, '%s''s attention shifts to a crack along the temple''s southern wall.', 16, 0, 100, 0, 0, 0, 'Akama', 20749),
+(@Akama, 5, 0, 'We must carry on with or without Maiev. Inside! Quickly!', 12, 0, 100, 0, 0, 0, 'Akama', 20750),
+(@Xiri, 0, 0, '%s falls silent and a quiet tension falls over nearby Sha''tar forces as Xi''ri makes his decision.', 16, 0, 100, 0, 0, 0, 'Xiri', 20737),
+(@Xiri, 1, 0, '%s begins channeling the powers of the light.', 16, 0, 100, 0, 0, 0, 'Xiri', 20693);
+
+DELETE FROM `gossip_menu_option` WHERE `menu_id` = 8650 AND `id` = 0;
+INSERT INTO `gossip_menu_option` (`menu_id`, `id`, `option_icon`, `option_text`, `option_id`, `npc_option_npcflag`, `action_menu_id`, `action_poi_id`, `box_coded`, `box_money`, `box_text`, `OptionBroadcastTextID`) VALUES
+(8650,0,0, 'I am ready to join you for the battle, Xi''ri.',1,1,0,0,0,0, '', 21003);
+
+DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=15 AND `SourceGroup`=@ID;
+INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`, `ErrorTextId`,`ScriptName`,`Comment`) VALUES
+(15,@ID,0,0,9,10985,0,0,0,'','Show gossip menu if player accept the quest A distraction for Akama');
+
+DELETE FROM `smart_scripts` WHERE `entryorguid` = @Akama AND `source_type` = 0;
+DELETE FROM `smart_scripts` WHERE `entryorguid` = @Akama*100 AND `source_type` = 9;
+DELETE FROM `smart_scripts` WHERE `entryorguid` = @Maiev AND `source_type` = 0;
+DELETE FROM `smart_scripts` WHERE `entryorguid` = @Maiev*100 AND `source_type` = 9;
+DELETE FROM `smart_scripts` WHERE `entryorguid` = @Xiri AND `source_type` = 0;
+DELETE FROM `smart_scripts` WHERE `entryorguid` = @Xiri*100 AND `source_type` = 9;
+DELETE FROM `smart_scripts` WHERE `entryorguid` = @Xiri*100+1 AND `source_type` = 9;
+DELETE FROM `smart_scripts` WHERE `entryorguid` = @Xiri*100+2 AND `source_type` = 9;
+DELETE FROM `smart_scripts` WHERE `entryorguid` = @Ashtongue AND `source_type` = 0;
+DELETE FROM `smart_scripts` WHERE `entryorguid` = @Vagath AND `source_type` = 0;
+DELETE FROM `smart_scripts` WHERE `entryorguid` = @Lightsworn AND `source_type` = 0;
+DELETE FROM `smart_scripts` WHERE `entryorguid` = @Magister AND `source_type` = 0;
+
+INSERT INTO `smart_scripts` (`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`, `comment`) VALUES
+(@Xiri, 0, 0, 0, 62, 0, 100, 0, 8650, 0, 0, 0, 80, @Xiri*100, 2, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Xiri - On Gossip use - ActionList'),
+(@Xiri*100, 9, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 72, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'Xiri - ActionList - Close gossip'),
+(@Xiri*100, 9, 1, 0, 0, 0, 100, 0, 0, 0, 0, 0, 83, 3, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Xiri - ActionList - Remove npcflag'),
+(@Xiri*100, 9, 2, 0, 0, 0, 100, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Xiri - ActionList - Talk'),
+(@Xiri*100, 9, 3, 0, 0, 0, 100, 0, 5000, 5000, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Xiri - ActionList - Talk'),
+(@Xiri*100, 9, 4, 0, 0, 0, 100, 0, 0, 0, 0, 0, 11, 39828, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Xiri - ActionList - Cast'),
+(@Xiri*100, 9, 5, 0, 0, 0, 100, 0, 12000, 12000, 0, 0, 107, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Xiri - ActionList - Summon Group'),
+(@Xiri*100, 9, 6, 0, 0, 0, 100, 0, 4000, 4000, 0, 0, 1, 0, 0, 0, 0, 0, 0, 19, @Caalen, 60, 0, 0, 0, 0, 0, 'Caalen - On Gossip use - Talk'),
+(@Xiri*100, 9, 7, 0, 0, 0, 100, 0, 2000, 2000, 0, 0, 1, 0, 0, 0, 0, 0, 0, 19, @FyraDawnstar, 60, 0, 0, 0, 0, 0, 'Caalen - On Gossip use - Talk'),
+(@Xiri*100, 9, 8, 0, 0, 0, 100, 0, 0, 0, 0, 0, 11, 39831, 0, 0, 0, 0, 0, 11, 0, 100, 0, 0, 0, 0, 0, 'Xiri - ActionList - Cast'),
+(@Xiri*100, 9, 9, 0, 0, 0, 100, 0, 40000, 40000, 0, 0, 82, 3, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Xiri - ActionList - Add npcflag'),
+(@Akama, 0, 0, 0, 63, 0, 100, 0, 0, 0, 0, 0, 53, 1, @Akama, 0, 0, 1, 2, 1, 0, 0, 0, 0, 0, 0, 0, 'Akama - On Gossip use - Start Waypoint'),
+(@Ashtongue, 0, 0, 0, 63, 0, 100, 0, 0, 0, 0, 0, 53, 1, @Ashtongue, 0, 0, 1, 2, 1, 0, 0, 0, 0, 0, 0, 0, 'Ashtongue - On Gossip use - Start Waypoint'),
+(@Maiev, 0, 0, 0, 63, 0, 100, 0, 0, 0, 0, 0, 53, 1, @Maiev, 0, 0, 1, 2, 1, 0, 0, 0, 0, 0, 0, 0, 'Ashtongue - On Gossip use - Start Waypoint'),
+(@Xiri, 0, 1, 0, 62, 0, 100, 0, 8650, 0, 0, 0, 80, @Xiri*100+1, 2, 0, 0, 0, 0, 11, @Lightsworn, 80, 0, 0, 0, 0, 0, 'Xiri - On Gossip use - Start waypoint'),
+(@Xiri*100+1, 9, 0, 0, 0, 0, 100, 0, 27000, 27000, 0, 0, 53, 1, @Lightsworn, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 'Xiri - On Gossip use - Start waypoint'),
+(@Xiri, 0, 2, 0, 62, 0, 100, 0, 8650, 0, 0, 0, 80, @Xiri*100+2, 2, 0, 0, 0, 0, 11, @Magister, 80, 0, 0, 0, 0, 0, 'Xiri - On Gossip use - Start waypoint'),
+(@Xiri*100+2, 9, 0, 0, 0, 0, 100, 0, 27000, 27000, 0, 0, 53, 1, @Magister, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 'Xiri - On Gossip use - Start waypoint'),
+(@Maiev, 0, 1, 0, 40, 0, 100, 0, 1, 0, 0, 0, 80, @Maiev*100, 2, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Vagath - On waypoint1 - Start Script'),
+(@Maiev*100, 9, 0, 0, 0, 0, 100, 0, 2000, 2000, 0, 0, 1, 0, 0, 0, 0, 0, 0, 19, @Vagath, 80, 0, 0, 0, 0, 0, 'Vagath - On Script - Talk1'),
+(@Maiev*100, 9, 1, 0, 0, 0, 100, 0, 5000, 5000, 0, 0, 1, 0, 0, 0, 0, 0, 0, 19, @Akama, 20, 0, 0, 0, 0, 0, 'Akama - On Script - Talk1'),
+(@Maiev*100, 9, 2, 0, 0, 0, 100, 0, 4000, 4000, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Maiev - On Script - Talk1'),
+(@Maiev*100, 9, 3, 0, 0, 0, 100, 0, 2500, 2500, 0, 0, 1, 1, 0, 0, 0, 0, 0, 19, @Akama, 20, 0, 0, 0, 0, 0, 'Akama - On Script - Talk2'),
+(@Maiev*100, 9, 4, 0, 0, 0, 100, 0, 3000, 3000, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Maiev - On Script - Talk2'),
+(@Maiev*100, 9, 5, 0, 0, 0, 100, 0, 15000, 15000, 0, 0, 8, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Maiev - On Script - Set React Passive'),
+(@Maiev*100, 9, 6, 0, 0, 0, 100, 0, 0, 0, 0, 0, 18, 512, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Maiev - On Script - Set Immune To NPC'),
+(@Maiev*100, 9, 7, 0, 0, 0, 100, 0, 0, 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Maiev - On Script - evade'),
+(@Maiev*100, 9, 8, 0, 0, 0, 100, 0, 2000, 2000, 0, 0, 11, 34189, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Maiev - On Script - Stealth'),
+(@Vagath, 0, 0, 0, 4, 0, 100, 0, 0, 0, 0, 0, 1, 1, 14000, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Vagath - On aggro - Talk2'),
+(@Vagath, 0, 1, 0, 6, 0, 100, 0, 0, 0, 0, 0, 1, 2, 14000, 0, 0, 0, 0, 19, @Akama, 20, 0, 0, 0, 0, 0, 'Akama - On Vagath death - Talk3'),
+(@Akama, 0, 1, 0, 40, 0, 100, 0, 2, 0, 0, 0, 80, @Akama*100, 2, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Akama - On waypoint2 - Start Script'),
+(@Akama*100, 9, 1, 0, 0, 0, 100, 0, 0, 0, 0, 0, 54, 12000, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Akama - On Script - pause Waypoint'),
+(@Akama*100, 9, 2, 0, 0, 0, 100, 0, 4000, 4000, 0, 0, 1, 3, 5000, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Akama - On Script - Talk4'),
+(@Akama*100, 9, 3, 0, 0, 0, 100, 0, 6000, 6000, 0, 0, 1, 4, 5000, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Akama - On Script - Talk5'),
+(@Akama*100, 9, 4, 0, 0, 0, 100, 0, 8000, 8000, 0, 0, 1, 5, 5000, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Akama - On Script - Talk6'),
+(@Ashtongue, 0, 1, 0, 40, 0, 100, 0, 2, 0, 0, 0, 54, 23000, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Akama - On waypoint2 - event'),
+(@Akama, 0, 2, 0, 40, 0, 100, 0, 6, 0, 0, 0, 11, 39932, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Akama - On waypoint3 - Cast Spell'),
+(@Akama, 0, 3, 0, 0, 0, 100, 0, 1000, 1000, 4000, 4000, 11, @ChainLightning, 2, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 'Akama - IC - Cast Spell'),
+(@Maiev, 0, 2, 0, 0, 0, 100, 0, 1000, 1000, 3000, 3000, 11, @FanOfBlades, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 'Maiev - IC - Cast Spell'),
+(@Magister, 0, 0, 0, 75, 0, 100, 0, 0, @IllidariRavag, 10, 5000, 49, 0, 0, 0, 0, 0, 0, 19, @IllidariRavag, 10, 0, 0, 0, 0, 0, 'Magister - On los ooc - Attack'),
+(@Lightsworn, 0, 0, 0, 75, 0, 100, 0, 0, @IllidariRavag, 10, 5000, 49, 0, 0, 0, 0, 0, 0, 19, @IllidariRavag, 10, 0, 0, 0, 0, 0, 'Lightsworn - On los ooc - Attacka'),
+(@Magister, 0, 1, 0, 75, 0, 100, 0, 0, @IllidariShadow, 10, 5000, 49, 0, 0, 0, 0, 0, 0, 19, @IllidariShadow, 10, 0, 0, 0, 0, 0, 'Magister - On los ooc - Attack'),
+(@Lightsworn, 0, 1, 0, 75, 0, 100, 0, 0, @IllidariShadow, 10, 5000, 49, 0, 0, 0, 0, 0, 0, 19, @IllidariShadow, 10, 0, 0, 0, 0, 0, 'Lightsworn - On los ooc - Attacka'),
+(@Magister, 0, 2, 0, 0, 0, 100, 0, 1000, 1000, 4000, 4000, 11, 9053, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 'Akama - IC - Cast Spell'),
+(@Lightsworn, 0, 2, 0, 0, 0, 100, 0, 1000, 1000, 4000, 4000, 11, 33632, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 'Akama - IC - Cast Spell'),
+(@Lightsworn, 0, 3, 0, 0, 0, 100, 0, 5000, 5000, 10000, 10000, 11, 13005, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 'Akama - IC - Cast Spell'),
+(@Lightsworn, 0, 4, 0, 0, 0, 100, 0, 3000, 8000, 5000, 8000, 11, 13952, 0, 0, 0, 0, 0, 26, 10, 0, 0, 0, 0, 0, 0, 'Akama - IC - Cast Spell');
+
+DELETE FROM `waypoints` WHERE entry in (@Akama, @Maiev, @Ashtongue, @Lightsworn, @Magister);
+INSERT INTO `waypoints` (`entry`,`pointid`,`position_x`,`position_y`,`position_z`,`point_comment`) VALUES
+(@Akama,1,-3562.123291, 486.208344, 22.091547,'Akama1'),
+(@Akama,2,-3569.400879, 408.074738, 29.698217,'Akama2'),
+(@Akama,3,-3578.632568, 353.128601, 35.888973,'Ashtongue3'),
+(@Akama,4,-3600.931885, 322.053955, 39.085770,'Ashtongue3'),
+(@Akama,5,-3617.203125, 320.658691, 39.697262,'Ashtongue3'),
+(@Akama,6,-3651.692627, 317.280975, 35.914421,'Akama3'),
+(@Maiev,1,-3567.418457, 485.073334, 22.376778,'Maiev1'),
+(@Maiev,2,-3567.913086, 400.602386, 30.253670,'Maiev2'),
+(@Maiev,3,-3567.458740, 371.282898, 32.955494,'Maiev3'),
+(@Maiev,4,-3651.692627, 317.280975, 35.914421,'Maiev4'),
+(@Lightsworn,1,-3562.123291, 486.208344, 22.091547,'Lightsworn1'),
+(@Lightsworn,2,-3569.400879, 408.074738, 29.698217,'Lightsworn2'),
+(@Magister,1,-3562.123291, 486.208344, 22.091547,'Magister1'),
+(@Magister,2,-3569.400879, 408.074738, 29.698217,'Magister2'),
+(@Ashtongue,1,-3562.123291, 486.208344, 22.091547,'Ashtongue1'),
+(@Ashtongue,2,-3569.400879, 408.074738, 29.698217,'Ashtongue2'),
+(@Ashtongue,3,-3578.632568, 353.128601, 35.888973,'Ashtongue3'),
+(@Ashtongue,4,-3600.931885, 322.053955, 39.085770,'Ashtongue3'),
+(@Ashtongue,5,-3617.203125, 320.658691, 39.697262,'Ashtongue3'),
+(@Ashtongue,6,-3651.692627, 317.280975, 35.914421,'Ashtongue3');
+
+DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId` = 13 AND `SourceEntry` = 39831;
+INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES
+(13, 3, 39831, 0, 31, 3, @Ashtongue, 0, 0, '', NULL),
+(13, 3, 39831, 1, 31, 3, @Akama, 0, 0, '', NULL),
+(13, 3, 39831, 2, 31, 3, @Maiev, 0, 0, '', NULL),
+(13, 3, 39831, 3, 31, 3, @Lightsworn, 0, 0, '', NULL),
+(13, 3, 39831, 4, 31, 3, @Magister, 0, 0, '', NULL);
+
+DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId` = 13 AND `SourceEntry` = 39832;
+INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES
+(13, 3, 39832, 0, 31, 3, @Ashtongue, 0, 0, '', NULL),
+(13, 3, 39832, 1, 31, 3, @Akama, 0, 0, '', NULL),
+(13, 3, 39832, 2, 31, 3, @Maiev, 0, 0, '', NULL),
+(13, 3, 39832, 3, 31, 3, @Lightsworn, 0, 0, '', NULL),
+(13, 3, 39832, 4, 31, 3, @Magister, 0, 0, '', NULL);
+
+DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId` = 13 AND `SourceEntry` = 39932;
+INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES
+(13, 2, 39932, 0, 8, 13429 , 0, 0, 0, '', 'Eye of the Witness Distraction for Akama');
diff --git a/sql/updates/world/2015_02_24_00_world.sql b/sql/updates/world/2015_02_24_00_world.sql
new file mode 100644
index 00000000000..e0b1a44286e
--- /dev/null
+++ b/sql/updates/world/2015_02_24_00_world.sql
@@ -0,0 +1,3 @@
+DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId` =17 AND `SourceEntry`=56448;
+INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorType`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES
+(17, 0, 56448, 0, 0, 31, 1, 3, 30142, 0, 0, 0, 0, '', 'Storm Hammer only targets only The Iron Watcher');
diff --git a/sql/updates/world/2015_02_24_01_world.sql b/sql/updates/world/2015_02_24_01_world.sql
new file mode 100644
index 00000000000..3db370ac965
--- /dev/null
+++ b/sql/updates/world/2015_02_24_01_world.sql
@@ -0,0 +1,3 @@
+DELETE FROM `disables` WHERE `sourceType`=0 AND `entry`=35113;
+INSERT INTO `disables` (`sourceType`, `entry`, `flags`, `params_0`, `params_1`, `comment`) VALUES
+(0, 35113, 64, '', '', 'Ignore LOS on Warp Measurement');
diff --git a/sql/updates/world/2015_02_25_00_world.sql b/sql/updates/world/2015_02_25_00_world.sql
new file mode 100644
index 00000000000..0d72b108502
--- /dev/null
+++ b/sql/updates/world/2015_02_25_00_world.sql
@@ -0,0 +1,25 @@
+--
+DELETE FROM `gossip_menu` WHERE `entry`=9821 AND `text_id`=13557;
+INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (9821,13557);
+UPDATE `creature_template` SET `gossip_menu_id`=9821 WHERE `entry`=9977;
+
+DELETE FROM `gossip_menu` WHERE `entry`=4841 AND `text_id`=5894;
+INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (4841,5894);
+UPDATE `creature_template` SET `gossip_menu_id`=4841 WHERE `entry`=12997;
+
+DELETE FROM `gossip_menu` WHERE `entry`=4845 AND `text_id`=5920;
+INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (4845,5920);
+UPDATE `creature_template` SET `gossip_menu_id`=4845 WHERE `entry`=13018;
+
+DELETE FROM `gossip_menu` WHERE `entry`=10631 AND `text_id`=14724;
+INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (10631,14724);
+UPDATE `creature_template` SET `gossip_menu_id`=10631 WHERE `entry`=35073;
+
+DELETE FROM `gossip_menu` WHERE `entry`=3501 AND `text_id`=4253;
+INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (3501,4253);
+UPDATE `creature_template` SET `gossip_menu_id`=3501 WHERE `entry`=1694;
+
+UPDATE `creature_template` SET `npcflag`=0 WHERE `entry`=13076;
+
+DELETE FROM `gossip_menu` WHERE `entry`=9027 AND `text_id` IN (12198);
+INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (9027,12198);
diff --git a/sql/updates/world/2015_02_27_00_world.sql b/sql/updates/world/2015_02_27_00_world.sql
new file mode 100644
index 00000000000..92d1bd55c8a
--- /dev/null
+++ b/sql/updates/world/2015_02_27_00_world.sql
@@ -0,0 +1,5 @@
+--
+DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=15 AND `SourceGroup`=9900;
+INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES
+(15,9900,0,0,0,9,0,13010,0,0,0,0,'','Show gossip if player has quest completed'),
+(15,9900,0,0,0,5,0,1119,240,0,0,0,'','Show gossip if player is at least friendly');
diff --git a/sql/updates/world/2015_02_27_01_world.sql b/sql/updates/world/2015_02_27_01_world.sql
new file mode 100644
index 00000000000..30f02d9900e
--- /dev/null
+++ b/sql/updates/world/2015_02_27_01_world.sql
@@ -0,0 +1,3 @@
+--
+Update `smart_scripts` SET `action_type`=85, `target_type`=7 WHERE `entryorguid`= 3177300 AND `source_type`=9 AND `id`=0;
+Update `smart_scripts` SET `action_type`=85, `target_type`=7 WHERE `entryorguid`= 3244200 AND `source_type`=9 AND `id`=0;
diff --git a/sql/updates/world/2015_02_27_02_world.sql b/sql/updates/world/2015_02_27_02_world.sql
new file mode 100644
index 00000000000..1298bc54674
--- /dev/null
+++ b/sql/updates/world/2015_02_27_02_world.sql
@@ -0,0 +1,2 @@
+--
+UPDATE `smart_scripts` SET `action_type`=85 WHERE `entryorguid`=28298 AND `source_type`=0 AND `id` =0;
diff --git a/sql/updates/world/2015_03_01_00_world.sql b/sql/updates/world/2015_03_01_00_world.sql
new file mode 100644
index 00000000000..5fa2dc8de28
--- /dev/null
+++ b/sql/updates/world/2015_03_01_00_world.sql
@@ -0,0 +1,30 @@
+--
+DELETE FROM `creature_addon` WHERE `guid` IN (SELECT `guid` FROM `creature` WHERE `id` = 2586);
+DELETE FROM `creature_template_addon` WHERE `entry`=2586;
+INSERT INTO `creature_template_addon` (`entry`, `path_id`, `mount`, `bytes1`, `bytes2`, `emote`, `auras`) VALUES
+(2586, 0, 0, 131072, 1, 0, "");
+
+UPDATE `creature_template_addon` SET `bytes1`=131072, `bytes2`=1 WHERE `entry` IN ( 6035, 22060, 18116, 16928, 16170, 11792, 6886, 4798, 2522, 25484, 4850, 1040, 579, 4834, 215, 1713, 938, 768, 17949);
+
+DELETE FROM `creature_addon` WHERE `guid` IN (SELECT `guid` FROM `creature` WHERE `id` = 11792);
+DELETE FROM `creature_addon` WHERE `guid` IN (SELECT `guid` FROM `creature` WHERE `id` = 4798);
+
+DELETE FROM `creature_addon` WHERE `guid` IN (SELECT `guid` FROM `creature` WHERE `id` = 2242);
+DELETE FROM `creature_template_addon` WHERE `entry`=2242;
+INSERT INTO `creature_template_addon` (`entry`, `path_id`, `mount`, `bytes1`, `bytes2`, `emote`, `auras`) VALUES
+(2242, 0, 0, 131072, 1, 0, "");
+
+DELETE FROM `creature_addon` WHERE `guid` IN (SELECT `guid` FROM `creature` WHERE `id` = 2246);
+DELETE FROM `creature_template_addon` WHERE `entry`=2246;
+INSERT INTO `creature_template_addon` (`entry`, `path_id`, `mount`, `bytes1`, `bytes2`, `emote`, `auras`) VALUES
+(2246, 0, 0, 131072, 1, 0, "");
+
+DELETE FROM `creature_addon` WHERE `guid` IN (SELECT `guid` FROM `creature` WHERE `id` = 2926);
+DELETE FROM `creature_template_addon` WHERE `entry`=2926;
+INSERT INTO `creature_template_addon` (`entry`, `path_id`, `mount`, `bytes1`, `bytes2`, `emote`, `auras`) VALUES
+(2926, 0, 0, 131072, 1, 0, "");
+
+DELETE FROM `creature_addon` WHERE `guid` IN (SELECT `guid` FROM `creature` WHERE `id` = 7110);
+DELETE FROM `creature_template_addon` WHERE `entry`=7110;
+INSERT INTO `creature_template_addon` (`entry`, `path_id`, `mount`, `bytes1`, `bytes2`, `emote`, `auras`) VALUES
+(7110, 0, 0, 131072, 1, 0, "");
diff --git a/sql/updates/world/2015_03_02_00_world.sql b/sql/updates/world/2015_03_02_00_world.sql
new file mode 100644
index 00000000000..a76b40e2212
--- /dev/null
+++ b/sql/updates/world/2015_03_02_00_world.sql
@@ -0,0 +1,15 @@
+UPDATE `quest_template` SET `PrevQuestId`=0 WHERE `Id`=13308;
+DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId` IN(19,20) AND `SourceEntry`=13308;
+INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorType`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES
+(19, 0, 13308, 0, 0, 8, 0, 13224, 0, 0, 0, 0, 0, '', 'Mind Tricks Requires Orgrims Hammer Rewarded or'),
+(20, 0, 13308, 0, 0, 8, 0, 13224, 0, 0, 0, 0, 0, '', 'Mind Tricks Requires Orgrims Hammer Rewarded or'),
+(19, 0, 13308, 0, 1, 9, 0, 13224, 0, 0, 0, 0, 0, '', 'Mind Tricks Requires Orgrims Hammer Taken or'),
+(20, 0, 13308, 0, 1, 9, 0, 13224, 0, 0, 0, 0, 0, '', 'Mind Tricks Requires Orgrims Hammer Taken or'),
+(19, 0, 13308, 0, 2, 28, 0, 13224, 0, 0, 0, 0, 0, '', 'Mind Tricks Requires Orgrims Hammer Complete or'),
+(20, 0, 13308, 0, 2, 28, 0, 13224, 0, 0, 0, 0, 0, '', 'Mind Tricks Requires Orgrims Hammer Complete or'),
+(19, 0, 13308, 0, 3, 8, 0, 13225, 0, 0, 0, 0, 0, '', 'Mind Tricks Requires The Skybreaker Rewarded or'),
+(20, 0, 13308, 0, 3, 8, 0, 13225, 0, 0, 0, 0, 0, '', 'Mind Tricks Requires The Skybreaker Rewarded or'),
+(19, 0, 13308, 0, 4, 9, 0, 13225, 0, 0, 0, 0, 0, '', 'Mind Tricks Requires The Skybreaker Taken or'),
+(20, 0, 13308, 0, 4, 9, 0, 13225, 0, 0, 0, 0, 0, '', 'Mind Tricks Requires The Skybreaker Taken or'),
+(19, 0, 13308, 0, 5, 28, 0, 13225, 0, 0, 0, 0, 0, '', 'Mind Tricks Requires The Skybreaker Complete or'),
+(20, 0, 13308, 0, 5, 28, 0, 13225, 0, 0, 0, 0, 0, '', 'Mind Tricks Requires The Skybreaker Complete or');
diff --git a/sql/updates/world/2015_03_02_01_world.sql b/sql/updates/world/2015_03_02_01_world.sql
new file mode 100644
index 00000000000..45c43161ac9
--- /dev/null
+++ b/sql/updates/world/2015_03_02_01_world.sql
@@ -0,0 +1,2 @@
+--
+UPDATE `gameobject` SET `position_z`=402.410004 WHERE `guid`=99956;
diff --git a/sql/updates/world/2015_03_02_02_world.sql b/sql/updates/world/2015_03_02_02_world.sql
new file mode 100644
index 00000000000..99f00a1be47
--- /dev/null
+++ b/sql/updates/world/2015_03_02_02_world.sql
@@ -0,0 +1,25 @@
+-- Quest - Iron Rune Constructs and You: Collecting Data
+
+SET @GUID := 49220; -- Set by TC
+SET @SUMMON := 49986;
+SET @GOLEM := 24821;
+SET @BENCH := 186958;
+DELETE FROM `spell_target_position` WHERE `id` in (49988);
+INSERT INTO `spell_target_position` (`id`,`target_map`,`target_position_x`,`target_position_y`,`target_position_z`,`target_orientation`) VALUES
+(49988, 571, 478.951782, -5941.529297, 308.749969, 0.419872);
+
+UPDATE `creature_template` SET `spell1`=44550, `AIName`='SmartAI' WHERE `entry`=@GOLEM;
+
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@GOLEM AND `source_type`=0;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@BENCH AND `source_type`=1 AND `id` IN (2,3);
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@BENCH,1,2,3,62,0,100,0,9024,1,0,0,72,0,0,0,0,0,0,7,0,0,0,0,0,0,0,'Work Bench - Gossip select - Close gossip'),
+(@BENCH,1,3,0,61,0,100,0,0,0,0,0,85,@SUMMON,2,0,0,0,0,7,0,0,0,0,0,0,0,'Work Bench - Gossip select - Summon Iron Rune Construct');
+
+DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=13 AND `SourceEntry`=44550;
+INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES
+(13, 1, 44550, 0, 31, 3, 24820, 0, 0, '', 'Collect Data target');
+
+DELETE FROM `creature` WHERE `id`=24820;
+INSERT INTO `creature` (`guid`, `id`, `map`, `spawnMask`, `phaseMask`, `position_x`, `position_y`, `position_z`, `orientation`, `spawntimesecs`) VALUES
+(@GUID, 24820, 571, 1, 1, 466.754089, -5921.273926, 309.139404, 0.751123, 120);
diff --git a/sql/updates/world/2015_03_02_03_world.sql b/sql/updates/world/2015_03_02_03_world.sql
new file mode 100644
index 00000000000..00240288b25
--- /dev/null
+++ b/sql/updates/world/2015_03_02_03_world.sql
@@ -0,0 +1,48 @@
+SET @SUMMON := 49989;
+SET @GOLEM := 24823;
+SET @BENCH := 186958;
+SET @Lebronski := 24718;
+
+DELETE FROM `spell_target_position` WHERE `id` IN (49990);
+INSERT INTO `spell_target_position` (`id`,`target_map`,`target_position_x`,`target_position_y`,`target_position_z`,`target_orientation`) VALUES
+(49990, 571, 478.951782, -5941.529297, 308.749969, 0.419872);
+
+UPDATE `creature_template` SET `spell1`=44562, `AIName`='SmartAI' WHERE `entry`=@GOLEM;
+UPDATE `creature_template` SET `AIName`='SmartAI' WHERE `entry`=@Lebronski;
+
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@GOLEM*100 AND `source_type`=9;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@Lebronski AND `source_type`=0;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@Lebronski*100 AND `source_type`=9;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@Lebronski*100+1 AND `source_type`=9;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@BENCH AND `source_type`=1 AND `id` IN (4,5);
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@BENCH,1,4,5,62,0,100,0,9024,2,0,0,72,0,0,0,0,0,0,7,0,0,0,0,0,0,0,'Work Bench - Gossip select - Close gossip'),
+(@BENCH,1,5,0,61,0,100,0,0,0,0,0,85,@SUMMON,2,0,0,0,0,7,0,0,0,0,0,0,0,'Work Bench - Gossip select - Summon Iron Rune Construct'),
+(@Lebronski,0,0,0,10,0,100,0,1,5,60000,60000,80,@Lebronski*100,0,0,0,0,0,1,0,0,0,0,0,0,0,'Turd - LOS - Action list'),
+(@Lebronski*100,9,0,0,0,0,100,0,0,0,0,0,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,'Stanwad - Action list - TALK'),
+(@Lebronski*100,9,1,0,0,0,100,0,0,0,0,0,22,1,0,0,0,0,0,1,0,0,0,0,0,0,0,'Stanwad - Action list - Set Event phase1'),
+(@Lebronski*100,9,2,0,0,0,100,0,0,0,0,0,103,1,0,0,0,0,0,1,0,0,0,0,0,0,0,'Stanwad - Action list - Root'),
+(@Lebronski*100,9,3,0,0,0,100,0,0,0,0,0,66,0,0,0,0,0,0,19,@GOLEM,20,0,0,0,0,0,'Stanwad - Action list - Set Orientation'),
+(@Lebronski*100,9,4,0,0,0,100,0,30000,30000,0,0,103,0,0,0,0,0,0,1,0,0,0,0,0,0,0,'Stanwad - Action list - remove root'),
+(@Lebronski,0,1,0,8,1,100,0,44562,0,0,0,80,@Lebronski*100+1,0,0,0,0,0,1,0,0,0,0,0,0,0,'Lebronski - spell hit - action list'),
+(@Lebronski*100+1,9,0,0,0,0,100,0,0,0,0,0,22,0,0,0,0,0,0,1,0,0,0,0,0,0,0,'Stanwad - Action list - Set Event phase 0'),
+(@Lebronski*100+1,9,1,0,0,0,100,0,0,0,0,0,1,0,0,0,0,0,0,19,@GOLEM,20,0,0,0,0,0,'Stanwad - Action list - TALK'),
+(@Lebronski*100+1,9,2,0,0,0,100,0,5000,5000,0,0,1,2,0,0,0,0,0,1,0,0,0,0,0,0,0,'Stanwad - Action list - TALK'),
+(@Lebronski*100+1,9,3,0,0,0,100,0,0,0,0,0,80,@GOLEM*100,0,0,0,0,0,19,@GOLEM,20,0,0,0,0,0,'Stanwad - Action list - Action list'),
+(@Lebronski*100+1,9,4,0,0,0,100,0,10000,10000,0,0,103,0,0,0,0,0,0,1,0,0,0,0,0,0,0,'Stanwad - Action list - Pause wp'),
+(@GOLEM*100,9,0,0,0,0,100,0,0,0,0,0,11,44569,0,0,0,0,0,23,0,0,0,0,0,0,0,'Stanwad - Action list - Cast Credit');
+
+DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=22 AND `SourceGroup`=1 AND `SourceEntry`=@Lebronski;
+INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`, `ErrorTextId`,`ScriptName`,`Comment`) VALUES
+(22,1,@Lebronski,0,31,3,24823,0,0,'','event require npc 24823');
+
+DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=13 AND `SourceEntry`=44562;
+INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES
+(13, 1, 44562, 0, 31, 3, 24718, 0, 0, '', 'Bluff target');
+
+DELETE FROM `creature_text` WHERE `entry`IN (@GOLEM);
+DELETE FROM `creature_text` WHERE `entry`IN (@Lebronski) AND `groupid` IN (1, 2);
+INSERT INTO `creature_text` (`entry`,`groupid`,`id`,`text`,`type`,`language`,`probability`,`emote`,`duration`,`sound`,`comment`, `BroadcastTextID`) VALUES
+(@GOLEM,0,0,"Model U-9207 Iron Rune Construct does not appreciate your tone of voice. Commencing total annihilation of your rug, Lebronski.",12,0,100,0,0,0,'Iron Rune Construct', 23892),
+(@Lebronski,1,0,"What do you think you're doing, man? Lebronski does NOT appreciate you dragging your loose metal parts all over his rug.",12,7,100,0,0,0,'Lebronski', 23890),
+(@Lebronski,2,0,"Far out, man. This bucket of bolts might make it after all...",12,7,100,0,0,0,'Lebronski', 23891);
diff --git a/sql/updates/world/2015_03_02_04_world.sql b/sql/updates/world/2015_03_02_04_world.sql
new file mode 100644
index 00000000000..557d6cb6792
--- /dev/null
+++ b/sql/updates/world/2015_03_02_04_world.sql
@@ -0,0 +1,65 @@
+-- Quest - Iron Rune Constructs and You: Rocket Jumping
+SET @SUMMON := 49985;
+SET @GOLEM := 24806;
+SET @RUNE := 186956;
+SET @BENCH := 186958;
+SET @Stanwad := 24717;
+SET @Gwendolyn := 24719;
+SET @Needlemeyer := 24720;
+SET @Walt := 24807;
+SET @Lebronski := 24718;
+
+DELETE FROM `spell_target_position` WHERE `id` in (49984);
+INSERT INTO `spell_target_position` (`id`,`target_map`,`target_position_x`,`target_position_y`,`target_position_z`,`target_orientation`) VALUES
+(49984, 571, 478.951782, -5941.529297, 308.749969, 0.419872);
+
+UPDATE `creature_template` SET `spell1`=44498, `AIName`='SmartAI', `InhabitType`=5 WHERE `entry`=@GOLEM;
+UPDATE `creature_template` SET `AIName`='SmartAI' WHERE `entry`=@Stanwad;
+UPDATE `gameobject_template` SET `AIName`='SmartGameObjectAI' WHERE `entry`=@BENCH;
+
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@GOLEM AND `source_type`=0;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@Stanwad*100 AND `source_type`=9;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@BENCH AND `source_type`=1 AND `id` IN (0,1);
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@BENCH,1,0,1,62,0,100,0,9024,0,0,0,72,0,0,0,0,0,0,7,0,0,0,0,0,0,0,'Work Bench - Gossip select - Close gossip'),
+(@BENCH,1,1,0,61,0,100,0,0,0,0,0,85,@SUMMON,2,0,0,0,0,7,0,0,0,0,0,0,0,'Work Bench - Gossip select - Summon Iron Rune Construct'),
+(@GOLEM,0,0,1,25,0,100,0,0,0,0,0,22,1,0,0,0,0,0,1,0,0,0,0,0,0,0,'Iron Rune Construct - Just Summoned - Set phase 1'),
+(@GOLEM,0,1,0,61,0,100,0,0,0,0,0,50,186952,60,0,0,0,0,1,0,0,0,0,0,0,0,'Iron Rune Construct - Just Summoned - SummonGob'),
+(@GOLEM,0,2,3,8,1,100,0,44498,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,'Iron Rune Construct - spell hit - Say text'),
+(@GOLEM,0,3,4,61,0,100,0,0,0,0,0,22,2,0,0,0,0,0,1,0,0,0,0,0,0,0,'Iron Rune Construct - spell hit - Set phase 2'),
+(@GOLEM,0,4,5,61,0,100,0,0,0,0,0,60,1,0,0,0,0,0,1,0,0,0,0,0,0,0,'Iron Rune Construct - spell hit - Set fly'),
+(@GOLEM,0,5,6,61,0,100,0,0,0,0,0,53,1,@GOLEM,0,0,0,0,1,0,0,0,0,0,0,0,'Iron Rune Construct - spell hit - WP start'),
+(@GOLEM,0,6,7,61,0,100,0,0,0,0,0,9,0,0,0,0,0,0,14,65653,@RUNE,0,0,0,0,0,'Iron Rune Construct - spell hit - Activate Gobject'),
+(@GOLEM,0,7,0,61,0,100,0,0,0,0,0,80,@Stanwad*100,0,0,0,0,0,19,@Stanwad,30,0,0,0,0,0,'Iron Rune Construct - spell hit - ActionList'),
+(@GOLEM,0,8,9,40,0,100,0,5,@GOLEM,0,0,11,44499,0,0,0,0,0,23,0,0,0,0,0,0,0,'Iron Rune Construct - Waypoint reached - cast credit spell'),
+(@GOLEM,0,9,10,61,0,100,0,0,0,0,0,22,3,0,0,0,0,0,1,0,0,0,0,0,0,0,'Iron Rune Construct - Waypoint reached - Set phase 3'),
+(@GOLEM,0,10,0,61,0,100,0,0,0,0,0,9,0,0,0,0,0,0,14,65654,186957,0,0,0,0,0,'Iron Rune Construct - Just Summoned - Activate gob'),
+(@GOLEM,0,11,0,1,4,100,1,7000,7000,0,0,28,46598,0,0,0,0,0,1,0,0,0,0,0,0,0,'Iron Rune Construct - OOC (phase 3) - Remove Vehicle aura'),
+(@Stanwad*100,9,0,0,0,0,100,0,3000,3000,0,0,1,0,0,0,0,0,0,19,@Walt,20,0,0,0,0,0,'Stanwad - Action list - TALK'),
+(@Stanwad*100,9,1,0,0,0,100,0,3000,3000,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,'Stanwad - Action list - TALK'),
+(@Stanwad*100,9,2,0,0,0,100,0,12000,12000,0,0,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,'Stanwad - Action list - TALK'),
+(@Stanwad*100,9,3,0,0,0,100,0,1000,1000,0,0,1,2,0,0,0,0,0,1,0,0,0,0,0,0,0,'Stanwad - Action list - TALK'),
+(@Stanwad*100,9,4,0,0,0,100,0,6000,6000,0,0,1,0,0,0,0,0,0,19,@Gwendolyn,20,0,0,0,0,0,'Stanwad - Action list - TALK'),
+(@Stanwad*100,9,5,0,0,0,100,0,6000,6000,0,0,1,0,0,0,0,0,0,19,@Needlemeyer,20,0,0,0,0,0,'Stanwad - Action list - TALK'),
+(@Stanwad*100,9,6,0,0,0,100,0,6000,6000,0,0,1,0,0,0,0,0,0,19,@Lebronski,20,0,0,0,0,0,'Stanwad - Action list - TALK'),
+(@Stanwad*100,9,7,0,0,0,100,0,7000,7000,0,0,1,1,0,0,0,0,0,19,@Walt,20,0,0,0,0,0,'Stanwad - Action list - TALK');
+
+DELETE FROM `creature_text` WHERE `entry`IN (@GOLEM, @Walt, @Stanwad, @Gwendolyn, @Needlemeyer, @Lebronski);
+INSERT INTO `creature_text` (`entry`,`groupid`,`id`,`text`,`type`,`language`,`probability`,`emote`,`duration`,`sound`,`comment`, `BroadcastTextID`) VALUES
+(@GOLEM,0,0,"Launching.",12,0,100,0,0,0,'Iron Rune Construct', 23860),
+(@Walt,0,0,"Behold my perfect creation!",12,7,100,0,0,0,'Walt', 23873),
+(@Stanwad,0,0,"WHOA, WHOA, WHOA! Hold everything fellas!",12,7,100,0,0,0,'Stanwad', 23875),
+(@Stanwad,1,0,"Oh dear lords of stone and steel, what... I repeat... WHAT are ya gonna do with that?",12,7,100,0,0,0,'Stanwad', 23878),
+(@Stanwad,2,0,"The dwarves all burst out in laughter.",16,7,100,0,0,0,'Stanwad', 23876),
+(@Gwendolyn,0,0,"I'm cryin' here! Please, make the funny stop!",12,7,100,0,0,0,'Gwendolyn', 23885),
+(@Needlemeyer,0,0,"If only our pappy were alive to see this!",12,0,100,0,0,0,'Needlemeyer', 23889),
+(@Lebronski,0,0,"Man, that will never work. The iron dwarves are never gonna fall for that hunk o' junk!",12,7,100,0,0,0,'Lebronski', 23880),
+(@Walt,1,0,"You're out of your element, Lebronski! Uncalled for! Those iron dwarves won't know what hit 'em! Now why don't you get back to uncovering the mystery of the gigantic turd on your rug and leave the real scientists to their work! ",12,7,100,0,0,0,'Walt', 23883);
+
+DELETE FROM `waypoints` WHERE `entry`=@GOLEM;
+INSERT INTO `waypoints` (`entry`,`pointid`,`position_x`,`position_y`,`position_z`,`point_comment`) VALUES
+(@GOLEM,1, 479.1233, -5941.48, 316.7,'Iron Rune Construct'),
+(@GOLEM,2, 479.1461, -5941.515, 339.7554,'Iron Rune Construct'),
+(@GOLEM,3, 496.1333, -5940.065, 344.5331,'Iron Rune Construct'),
+(@GOLEM,4, 511.516, -5936.729, 339.7554,'Iron Rune Construct'),
+(@GOLEM,5, 514.5781, -5936.898, 314.1444,'Iron Rune Construct');
diff --git a/sql/updates/world/2015_03_02_05_world.sql b/sql/updates/world/2015_03_02_05_world.sql
new file mode 100644
index 00000000000..31eca7f0310
--- /dev/null
+++ b/sql/updates/world/2015_03_02_05_world.sql
@@ -0,0 +1,136 @@
+UPDATE `creature_addon` SET `mount`=0 WHERE `guid`=97508;
+
+/* questgiver */
+-- Warmage Anzim SAI
+SET @ENTRY := 25356;
+UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,0,0,1,19,0,100,0,11681,0,0,0,85,45883,0,0,0,0,0,7,0,0,0,0,0,0,0,"Warmage Anzim - On Quest 'Rescuing Evanor' Taken - Invoker Cast 'Amber Ledge to Beryl Point'"),
+(@ENTRY,0,1,0,61,0,100,0,11681,0,0,0,80,@ENTRY*100+00,2,0,0,0,0,1,0,0,0,0,0,0,0,"Warmage Anzim - On Quest 'Rescuing Evanor' Taken - Run Script");
+
+-- Actionlist SAI
+SET @ENTRY := 2535600;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=9;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,9,0,0,0,0,100,0,0,0,0,0,83,2,0,0,0,0,0,1,0,0,0,0,0,0,0,"Warmage Anzim - On Script - Remove Npc Flag Questgiver"),
+(@ENTRY,9,1,0,0,0,100,0,0,0,0,0,45,1,1,0,0,0,0,10,118574,27888,0,0,0,0,0,"Warmage Anzim - On Script - Set Data 1 1"),
+(@ENTRY,9,2,0,0,0,100,0,0,0,0,0,45,1,1,0,0,0,0,10,107998,25732,0,0,0,0,0,"Warmage Anzim - On Script - Set Data 1 1"),
+(@ENTRY,9,3,0,0,0,100,0,0,0,0,0,45,1,1,0,0,0,0,10,108027,25733,0,0,0,0,0,"Warmage Anzim - On Script - Set Data 1 1"),
+(@ENTRY,9,4,0,0,0,100,0,0,0,0,0,45,1,1,0,0,0,0,10,107602,25727,0,0,0,0,0,"Warmage Anzim - On Script - Set Data 1 1"),
+(@ENTRY,9,5,0,0,0,100,0,180000,180000,0,0,82,2,0,0,0,0,0,1,0,0,0,0,0,0,0,"Warmage Anzim - On Script - Add Npc Flag Questgiver");
+
+/* dragons */
+
+-- Warmage Archus SAI
+SET @ENTRY := 27888;
+UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,0,0,1,38,0,100,0,1,1,0,0,53,1,@ENTRY,0,0,0,0,1,0,0,0,0,0,0,0,"Warmage Archus - On Data Set 1 1 - Start Waypoint"),
+(@ENTRY,0,1,0,61,0,100,0,1,1,0,0,48,1,0,0,0,0,0,1,0,0,0,0,0,0,0,"Warmage Archus - On Data Set 1 1 - Set Active On"),
+(@ENTRY,0,2,0,40,0,100,0,1,@ENTRY,0,0,54,10000,0,0,0,0,0,1,0,0,0,0,0,0,0,"Warmage Moran - On Waypoint 1 Reached - Pause Waypoint");
+
+-- Warmage Preston SAI
+SET @ENTRY := 25732;
+UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,0,0,1,38,0,100,0,1,1,0,0,53,1,@ENTRY,0,0,0,0,1,0,0,0,0,0,0,0,"Warmage Preston - On Data Set 1 1 - Start Waypoint"),
+(@ENTRY,0,1,0,61,0,100,0,1,1,0,0,48,1,0,0,0,0,0,1,0,0,0,0,0,0,0,"Warmage Preston - On Data Set 1 1 - Set Active On"),
+(@ENTRY,0,2,0,40,0,100,0,1,@ENTRY,0,0,54,10000,0,0,0,0,0,1,0,0,0,0,0,0,0,"Warmage Moran - On Waypoint 1 Reached - Pause Waypoint");
+
+-- Warmage Austin SAI
+SET @ENTRY := 25733;
+UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,0,0,1,38,0,100,0,1,1,0,0,53,1,@ENTRY,0,0,0,0,1,0,0,0,0,0,0,0,"Warmage Austin - On Data Set 1 1 - Start Waypoint"),
+(@ENTRY,0,1,0,61,0,100,0,1,1,0,0,48,1,0,0,0,0,0,1,0,0,0,0,0,0,0,"Warmage Austin - On Data Set 1 1 - Set Active On"),
+(@ENTRY,0,2,0,40,0,100,0,1,@ENTRY,0,0,54,10000,0,0,0,0,0,1,0,0,0,0,0,0,0,"Warmage Moran - On Waypoint 1 Reached - Pause Waypoint");
+
+-- Warmage Moran SAI
+SET @ENTRY := 25727;
+UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,0,0,1,38,0,100,0,1,1,0,0,53,1,25727,0,0,0,0,1,0,0,0,0,0,0,0,"Warmage Moran - On Data Set 1 1 - Start Waypoint"),
+(@ENTRY,0,1,0,61,0,100,0,1,1,0,0,48,1,0,0,0,0,0,1,0,0,0,0,0,0,0,"Warmage Moran - On Data Set 1 1 - Set Active On"),
+(@ENTRY,0,2,3,40,0,100,0,1,25727,0,0,54,10000,0,0,0,0,0,1,0,0,0,0,0,0,0,"Warmage Moran - On Waypoint 1 Reached - Pause Waypoint"),
+(@ENTRY,0,3,0,61,0,100,0,1,25727,0,0,75,42726,0,0,0,0,0,9,25724,0,100,0,0,0,0,"Warmage Moran - On Waypoint 1 Reached - Add Aura 'Cosmetic - Immolation (Whole Body)'");
+
+-- Ascended Mage Hunter SAI
+SET @ENTRY := 25724;
+UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,0,0,0,11,0,100,0,0,0,0,0,8,0,0,0,0,0,0,1,0,0,0,0,0,0,0,"Ascended Mage Hunter - On Respawn - Set Reactstate Passive"),
+(@ENTRY,0,1,0,1,0,100,1,1000,1000,1000,1000,11,45940,0,0,0,0,0,9,25594,0,10,0,0,0,0,"Ascended Mage Hunter - Out of Combat - Cast 'Evanor's Prison Chains' (No Repeat)"),
+(@ENTRY,0,2,3,23,0,100,1,42726,1,0,0,89,5,0,0,0,0,0,1,0,0,0,0,0,0,0,"Ascended Mage Hunter - On Has Aura 'Cosmetic - Immolation (Whole Body)' - Start Random Movement (No Repeat)"),
+(@ENTRY,0,3,0,61,0,100,1,42726,1,0,0,80,@ENTRY*100+00,2,0,0,0,0,1,0,0,0,0,0,0,0,"Ascended Mage Hunter - On Has Aura 'Cosmetic - Immolation (Whole Body)' - Run Script (No Repeat)"),
+(@ENTRY,0,4,0,6,0,100,0,0,0,0,0,45,1,1,0,0,0,0,10,114368,24771,0,0,0,0,0,"Ascended Mage Hunter - On Just Died - Set Data 1 1");
+
+-- Actionlist SAI
+SET @ENTRY := 2572400;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=9;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,9,0,0,0,0,100,0,3000,3000,0,0,37,0,0,0,0,0,0,1,0,0,0,0,0,0,0,"On Script - Kill Self");
+
+-- Coldarra Invisman SAI
+SET @ENTRY := 24771;
+UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,0,0,0,38,0,100,0,1,1,0,0,80,@ENTRY*100+00,0,0,0,0,0,1,0,0,0,0,0,0,0,"Coldarra Invisman - On Data Set 1 1 - Run Script (No Repeat)");
+
+-- Actionlist SAI
+SET @ENTRY := 2477100;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=9;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,9,0,0,0,0,100,0,4000,4000,0,0,9,0,0,0,0,0,0,20,187884,20,0,0,0,0,0,"Coldarra Invisman - On Script - activate Game Object"),
+(@ENTRY,9,1,0,0,0,100,0,4000,4000,0,0,11,46013,2,0,0,0,0,1,0,0,0,0,0,0,0,"Coldarra Invisman - On Script - Cast 'Summon Lady Evanor'");
+
+-- Archmage Evanor SAI
+SET @ENTRY := 25784;
+UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,0,0,0,54,0,100,0,0,0,0,0,80,@ENTRY*100+00,2,0,0,0,0,1,0,0,0,0,0,0,0,"Archmage Evanor - On Just Summoned - Run Script");
+
+-- Actionlist SAI
+SET @ENTRY := 2578400;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=9;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,9,0,0,0,0,100,0,1000,1000,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,"Archmage Evanor - On Script - Say Line 0"),
+(@ENTRY,9,1,0,0,0,100,0,3000,3000,0,0,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,"Archmage Evanor - On Script - Say Line 1"),
+(@ENTRY,9,2,0,0,0,100,0,0,0,0,0,11,46018,0,0,0,0,0,1,0,0,0,0,0,0,0,"Archmage Evanor - On Script - Cast 'Teleport'"),
+(@ENTRY,9,3,0,0,0,100,0,8000,8000,0,0,41,1,0,0,0,0,0,1,0,0,0,0,0,0,0,"Archmage Evanor - On Script - Despawn Instant");
+
+DELETE FROM `creature_text` WHERE `entry`=25784;
+INSERT INTO `creature_text` (`entry`, `groupid`, `id`, `text`, `type`, `language`, `probability`, `emote`, `duration`, `sound`, `BroadcastTextId`, `TextRange`, `comment`) VALUES
+(25784, 0, 0, 'I thank you, friend of Dalaran.', 12, 0, 100, 0, 0, 0, 24995, 0, 'Archmage Evanor'),
+(25784, 1, 0, 'We mustn''t tarry here... stay close - I''ll take us somewhere safe.', 12, 0, 100, 0, 0, 0, 24996, 0, 'Archmage Evanor');
+
+DELETE FROM `spell_target_position` WHERE `id`=46018;
+INSERT INTO `spell_target_position` (`id`, `effIndex`, `target_map`, `target_position_x`, `target_position_y`, `target_position_z`, `target_orientation`, `VerifiedBuild`) VALUES
+(46018, 0, 571, 3646.895, 5893.2773, 174.48, 0.674, 0);
+
+/* waypoint datas */
+DELETE FROM `waypoints` WHERE `entry`=25727;
+INSERT INTO `waypoints` (`entry`, `pointid`, `position_x`, `position_y`, `position_z`, `point_comment`) VALUES
+(25727, 1,3195.641,6102.673,147.5568, 'Warmage Moran'),
+(25727, 2,3437.590576,5915.928711,145.554291, 'Warmage Moran');
+DELETE FROM `waypoints` WHERE `entry`=25733;
+INSERT INTO `waypoints` (`entry`, `pointid`, `position_x`, `position_y`, `position_z`, `point_comment`) VALUES
+(25733, 1,3224.336,6105.71,146.7791, 'Warmage Austin'),
+(25733, 2,3435.270,5889.899,151.063, 'Warmage Austin');
+DELETE FROM `waypoints` WHERE `entry`=25732;
+INSERT INTO `waypoints` (`entry`, `pointid`, `position_x`, `position_y`, `position_z`, `point_comment`) VALUES
+(25732, 1,3224.749,6083.038,147.5568, 'Warmage Preston'),
+(25732, 2,3460.500,5877.4399,149.537, 'Warmage Preston');
+DELETE FROM `waypoints` WHERE `entry`=27888;
+INSERT INTO `waypoints` (`entry`, `pointid`, `position_x`, `position_y`, `position_z`, `point_comment`) VALUES
+(27888, 1,3200.99,6074.898,144.9736, 'Warmage Archus'),
+(27888, 2,3457.750,5892.669,147.380, 'Warmage Archus');
+
+UPDATE `creature_template` SET `InhabitType`=4 WHERE `entry` IN (25727, 25733, 25732, 27888);
diff --git a/sql/updates/world/2015_03_02_06_world.sql b/sql/updates/world/2015_03_02_06_world.sql
new file mode 100644
index 00000000000..585c6482366
--- /dev/null
+++ b/sql/updates/world/2015_03_02_06_world.sql
@@ -0,0 +1,4 @@
+--
+DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=20 AND `SourceEntry`=1789;
+INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES
+(20, 0, 1789, 0, 9, 1783, 0, 0, 0, '', 'Show the quest if 1783 is taken');
diff --git a/sql/updates/world/2015_03_07_00_world.sql b/sql/updates/world/2015_03_07_00_world.sql
new file mode 100644
index 00000000000..4cc5d647e1a
--- /dev/null
+++ b/sql/updates/world/2015_03_07_00_world.sql
@@ -0,0 +1 @@
+DELETE FROM `spell_linked_spell` WHERE `spell_effect`=69706;
diff --git a/sql/updates/world/2015_03_07_01_world.sql b/sql/updates/world/2015_03_07_01_world.sql
new file mode 100644
index 00000000000..40df9138eb4
--- /dev/null
+++ b/sql/updates/world/2015_03_07_01_world.sql
@@ -0,0 +1,2 @@
+-- 3.3.5 - 6.x
+DELETE FROM `spell_linked_spell` WHERE `spell_trigger`=49889;
diff --git a/sql/updates/world/2015_03_07_02_world.sql b/sql/updates/world/2015_03_07_02_world.sql
new file mode 100644
index 00000000000..5b48fd9779e
--- /dev/null
+++ b/sql/updates/world/2015_03_07_02_world.sql
@@ -0,0 +1,5 @@
+--
+DELETE FROM `creature_addon` WHERE `guid` IN (26310,54733);
+INSERT INTO `creature_addon` (`guid`, `path_id`) VALUES
+(26310, 263100),
+(54733, 547330);
diff --git a/sql/updates/world/2015_03_07_03_world.sql b/sql/updates/world/2015_03_07_03_world.sql
new file mode 100644
index 00000000000..8d8fe3be881
--- /dev/null
+++ b/sql/updates/world/2015_03_07_03_world.sql
@@ -0,0 +1,2 @@
+UPDATE `creature_template` SET `AIName`='', `ScriptName`='boss_nexus_commanders' WHERE `entry` IN(26796,26798);
+DELETE FROM `smart_scripts` WHERE `entryorguid` IN(26796,26798) AND `source_type`=0;
diff --git a/sql/updates/world/2015_03_08_00_world.sql b/sql/updates/world/2015_03_08_00_world.sql
new file mode 100644
index 00000000000..3bf1b2410ce
--- /dev/null
+++ b/sql/updates/world/2015_03_08_00_world.sql
@@ -0,0 +1,3 @@
+DELETE FROM `spell_bonus_data` WHERE `entry`=3607;
+INSERT INTO `spell_bonus_data` (`entry`, `direct_bonus`, `dot_bonus`, `ap_bonus`, `ap_dot_bonus`, `comments`) VALUES
+(3607, 0, 0, 0, 0, 'Yenniku Soul Gem');
diff --git a/sql/updates/world/2015_03_08_01_world.sql b/sql/updates/world/2015_03_08_01_world.sql
new file mode 100644
index 00000000000..ddbc46739b1
--- /dev/null
+++ b/sql/updates/world/2015_03_08_01_world.sql
@@ -0,0 +1 @@
+DELETE FROM `creature` WHERE `id`=23450;
diff --git a/sql/updates/world/2015_03_10_00_world.sql b/sql/updates/world/2015_03_10_00_world.sql
new file mode 100644
index 00000000000..ade4e39c13b
--- /dev/null
+++ b/sql/updates/world/2015_03_10_00_world.sql
@@ -0,0 +1,4 @@
+UPDATE `creature_template` SET `vehicleid`=60 WHERE `entry`=30159;
+UPDATE `smart_scripts` SET `action_param2`=0 WHERE `entryorguid`=31242 AND `source_type`=0 AND `id`=14;
+UPDATE `creature_template_addon` SET `mount`=0 WHERE `entry`=31242;
+UPDATE `creature_text` SET `BroadcastTextId`=16227 WHERE `entry`=18292 AND `groupid`=0 AND `id`=0;
diff --git a/sql/updates/world/2015_03_10_01_world.sql b/sql/updates/world/2015_03_10_01_world.sql
new file mode 100644
index 00000000000..e2e945eb86d
--- /dev/null
+++ b/sql/updates/world/2015_03_10_01_world.sql
@@ -0,0 +1,3 @@
+--
+UPDATE `creature_template` SET `faction`=2007 WHERE `entry` IN (35496,35498);
+UPDATE `creature` SET `position_x`=5957.267, `position_y`=566.4926 WHERE `guid`=116668 AND `id` = 29657;
diff --git a/sql/updates/world/2015_03_10_02_world.sql b/sql/updates/world/2015_03_10_02_world.sql
new file mode 100644
index 00000000000..c692d88825f
--- /dev/null
+++ b/sql/updates/world/2015_03_10_02_world.sql
@@ -0,0 +1,2 @@
+--
+UPDATE `npc_trainer` SET `spell`=2154 WHERE `entry`=201029 AND `spell`=3104;
diff --git a/sql/updates/world/2015_03_10_03_world.sql b/sql/updates/world/2015_03_10_03_world.sql
new file mode 100644
index 00000000000..4028abb8fdc
--- /dev/null
+++ b/sql/updates/world/2015_03_10_03_world.sql
@@ -0,0 +1,2 @@
+--
+UPDATE `quest_template` SET `SpecialFlags`=2 WHERE `Id`=1560;
diff --git a/sql/updates/world/2015_03_10_04_world.sql b/sql/updates/world/2015_03_10_04_world.sql
new file mode 100644
index 00000000000..9fa686c09ec
--- /dev/null
+++ b/sql/updates/world/2015_03_10_04_world.sql
@@ -0,0 +1,33 @@
+--
+SET @Geant:=24385;
+SET @Megalithe:=24381;
+
+UPDATE `event_scripts` SET `x`=2406.492188 , `y`=-5738.995605, `z`=274.020172 , `o`=0.703918 WHERE `id`=15939;
+UPDATE `creature_template` SET `unit_flags`=33600, `AIName`='SmartAI' WHERE `entry` IN (@Geant,@Megalithe);
+
+DELETE FROM `smart_scripts` WHERE `source_type`=0 AND `entryorguid` IN (@Geant,@Megalithe);
+DELETE FROM `smart_scripts` WHERE `source_type`=9 AND `entryorguid` IN (@Geant*100,@Megalithe*100);
+
+INSERT INTO `smart_scripts` (`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`, `comment`) VALUES
+(@Megalithe, 0, 0, 0, 54, 0, 100, 0, 0, 0, 0, 0, 80, @Megalithe*100, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Megalithe - On Just summoned - action list'),
+(@Megalithe*100, 9, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 12, 24385, 7, 0, 0, 0, 0, 8, 0, 0, 0, 2410.138184, -5727.264648, 270.985870, 4.287692, 'Megalithe - action liste -Summon'),
+(@Megalithe*100, 9, 1, 0, 0, 0, 100, 0, 0, 0, 0, 0, 12, 24385, 7, 0, 0, 0, 0, 8, 0, 0, 0, 2414.860596, -5729.499512, 272.095459, 3.982957, 'Megalithe - action liste -Summon'),
+(@Megalithe*100, 9, 2, 0, 0, 0, 100, 0, 0, 0, 0, 0, 12, 24385, 7, 0, 0, 0, 0, 8, 0, 0, 0, 2417.339844, -5733.230957, 273.028992, 3.603609, 'Megalithe - action liste -Summon'),
+(@Megalithe*100, 9, 3, 0, 0, 0, 100, 0, 0, 0, 0, 0, 12, 24385, 7, 0, 0, 0, 0, 8, 0, 0, 0, 2419.397705, -5738.032227, 274.121246, 3.241538, 'Megalithe - action liste -Summon'),
+(@Megalithe*100, 9, 4, 0, 0, 0, 100, 0, 4000, 4000, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Megalithe - action liste - Talk'),
+(@Megalithe*100, 9, 5, 0, 0, 0, 100, 0, 4000, 4000, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Megalithe - action liste - Talk'),
+(@Megalithe*100, 9, 6, 0, 0, 0, 100, 0, 5000, 5000, 0, 0, 1, 2, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Megalithe - action liste - Talk'),
+(@Megalithe*100, 9, 7, 0, 0, 0, 100, 0, 2000, 2000, 0, 0, 80, @Geant*100, 0, 0, 0, 0, 0, 11, @Geant, 30, 0, 0, 0, 0, 0, 'Megalithe - action liste - Action List'),
+(@Megalithe*100, 9, 8, 0, 0, 0, 100, 0, 0, 0, 0, 0, 11, 43693, 0, 0, 0, 0, 0, 21, 40, 0, 0, 0, 0, 0, 0, 'Megalithe - action liste - Cast Credit Quest'),
+(@Megalithe*100, 9, 9, 0, 0, 0, 100, 0, 3000, 3000, 0, 0, 1, 3, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Megalithe - action liste - Talk'),
+(@Megalithe*100, 9, 10, 0, 0, 0, 100, 0, 3000, 3000, 0, 0, 41, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Megalithe - action liste - Talk'),
+(@Geant*100, 9, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 59, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Geant - action liste - Run off'),
+(@Geant*100, 9, 1, 0, 0, 0, 100, 0, 0, 0, 0, 0, 69, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 2515.453369, -5670.358398, 298.778076, 0.618311, 'Geant - action liste - Gotopos'),
+(@Geant*100, 9, 2, 0, 0, 0, 100, 0, 7000, 7000, 0, 0, 41, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Geant - action liste - Despawnn');
+
+DELETE FROM `creature_text` WHERE `entry` IN (@Megalithe);
+INSERT INTO `creature_text` (`entry`, `groupid`, `id`, `text`, `type`, `language`, `probability`, `emote`, `duration`, `sound`, `comment`, `BroadcastTextID`) VALUES
+(@Megalithe, 0, 0, 'Arise from the earth, my brothers!', 12, 0, 100, 0, 0, 0, 'Megalithe', 23311),
+(@Megalithe, 1, 0, 'Our iron masters have a mission for us!', 12, 0, 100, 0, 0, 0, 'Megalithe', 23312),
+(@Megalithe, 2, 0, 'Follow me into the mountains to carry out the plan of the masters!', 12, 0, 100, 0, 0, 0, 'Megalithe', 23315),
+(@Megalithe, 3, 0, 'We will not fail!', 12, 0, 100, 0, 0, 0, 'Megalithe', 23332);
diff --git a/sql/updates/world/2015_03_10_05_world.sql b/sql/updates/world/2015_03_10_05_world.sql
new file mode 100644
index 00000000000..55cb5f9006a
--- /dev/null
+++ b/sql/updates/world/2015_03_10_05_world.sql
@@ -0,0 +1,4 @@
+--
+DELETE FROM `smart_scripts` WHERE `entryorguid`=20234 AND `source_type`=0 AND `id`=3;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(20234,0,3,0,19,0,100,0,10344,0,0,0,11,35237,0,0,0,0,0,7,0,0,0,0,0,0,0,"Runetog Wildhammer - On Quest accept - Cast spell");
diff --git a/sql/updates/world/2015_03_10_06_world.sql b/sql/updates/world/2015_03_10_06_world.sql
new file mode 100644
index 00000000000..2a943f00037
--- /dev/null
+++ b/sql/updates/world/2015_03_10_06_world.sql
@@ -0,0 +1,5 @@
+--
+DELETE FROM `smart_scripts` WHERE `entryorguid`= 39712 AND `source_type`=0 AND `id` IN (6, 7);
+INSERT INTO `smart_scripts` (`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`, `comment`) VALUES
+(39712, 0, 6, 7, 63, 0, 100, 0, 0, 0, 0, 0, 11, 74206, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'High Tinker Mekkatorque - Just created - cast spell'),
+(39712, 0, 7, 0, 61, 0, 100, 0, 0, 0, 0, 0, 11, 44816, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'High Tinker Mekkatorque - Just created - cast spell');
diff --git a/sql/updates/world/2015_03_10_07_world.sql b/sql/updates/world/2015_03_10_07_world.sql
new file mode 100644
index 00000000000..cd2023ea5b8
--- /dev/null
+++ b/sql/updates/world/2015_03_10_07_world.sql
@@ -0,0 +1,12 @@
+--
+UPDATE `creature_template` SET `AIName`='SmartAI' WHERE `entry` IN (4331, 4329);
+DELETE FROM `smart_scripts` WHERE `entryorguid`= 4328 AND `source_type`=0 AND `id` IN (3);
+DELETE FROM `smart_scripts` WHERE `entryorguid`= 4331 AND `source_type`=0;
+DELETE FROM `smart_scripts` WHERE `entryorguid`= 4329 AND `source_type`=0;
+INSERT INTO `smart_scripts` (`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`, `comment`) VALUES
+(4328, 0, 3, 0, 8, 0, 100, 0, 42411, 0, 0, 0, 41, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Firemane Scalebane - On spell hit - Despawn'),
+(4331, 0, 0, 0, 8, 0, 100, 0, 42411, 0, 0, 0, 41, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Firemane Ash Tail - On spell hit - Despawn'),
+(4331, 0, 1, 0, 0, 0, 100, 0, 4000, 6000, 6000, 8000, 11, 11969, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 'Firemane Ash Tail - Icc - Cast Fire Nova'),
+(4331, 0, 2, 0, 4, 0, 100, 0, 0, 0, 0, 0, 11, 18968, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Firemane Ash Tail - On aggr - cast Fire Shield'),
+(4329, 0, 0, 0, 8, 0, 100, 0, 42411, 0, 0, 0, 41, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Firemane Scout - On spell hit - Despawn'),
+(4329, 0, 1, 0, 4, 0, 100, 0, 0, 0, 0, 0, 11, 18968, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Firemane Scout - On aggr - cast Fire Shield');
diff --git a/sql/updates/world/2015_03_10_08_world.sql b/sql/updates/world/2015_03_10_08_world.sql
new file mode 100644
index 00000000000..2992a858dc6
--- /dev/null
+++ b/sql/updates/world/2015_03_10_08_world.sql
@@ -0,0 +1,8 @@
+-- Add missing gossip for entry 7766
+DELETE FROM `gossip_menu` WHERE `entry`=1761;
+INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (1761,2393),(1761,2394);
+UPDATE `creature_template` SET `gossip_menu_id`=1761 WHERE entry=7766;
+
+DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=14 AND `SourceGroup`=1761;
+INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`, `NegativeCondition`, `ErrorTextId`,`ScriptName`,`Comment`) VALUES
+(14,1761,2394,0,9,434,0,0,0,0,'','Show gossip menu text if quest 434 is taken');
diff --git a/sql/updates/world/2015_03_10_09_world.sql b/sql/updates/world/2015_03_10_09_world.sql
new file mode 100644
index 00000000000..fd50bbb5037
--- /dev/null
+++ b/sql/updates/world/2015_03_10_09_world.sql
@@ -0,0 +1,7 @@
+--
+UPDATE creature_template SET InhabitType=4, unit_flags=64 WHERE Entry=17592;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=17592 AND `source_type`=0 AND `id`IN(5, 6, 7);
+INSERT INTO `smart_scripts` (`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`, `comment`) VALUES
+(17592, 0, 5, 6, 40, 0, 100, 0, 10, 17592, 0, 0, 101, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Razormaw - On Waypoint 10 Reached - Set Home Position'),
+(17592, 0, 6, 0, 61, 0, 100, 0, 0, 0, 0, 0, 8, 2, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Razormaw - On Waypoint 10 Reached - Set Agressive'),
+(17592, 0, 7, 0, 11, 0, 100, 0, 0, 0, 0, 0, 18, 256, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Razormaw - On Respawn - Add unit_flag');
diff --git a/sql/updates/world/2015_03_10_10_world.sql b/sql/updates/world/2015_03_10_10_world.sql
new file mode 100644
index 00000000000..d3e1220006e
--- /dev/null
+++ b/sql/updates/world/2015_03_10_10_world.sql
@@ -0,0 +1,55 @@
+-- Anton waypoints
+
+DELETE FROM `creature_addon` WHERE `guid`=117689;
+INSERT INTO `creature_addon` (`guid`, `path_id`, `mount`, `bytes1`, `bytes2`, `emote`, `auras`) VALUES
+(117689, 1176890, 0, 131072, 1, 0, "");
+UPDATE `creature` SET `MovementType`=2 WHERE `guid`=117689;
+DELETE FROM `waypoint_data` WHERE `id`=1176890;
+INSERT INTO `waypoint_data` (`id`, `point`, `position_x`, `position_y`, `position_z`, `orientation`, `delay`, `move_type`, `action`, `action_chance`, `wpguid`) VALUES
+(1176890, 1, 153.249817, -4549.366211, 261.364685, 0, 0, 0, 0, 100, 0),
+(1176890, 2, 156.098114, -4532.821289, 258.803101, 0, 0, 0, 0, 100, 0),
+(1176890, 3, 156.068008, -4517.755371, 257.193939, 0, 0, 0, 0, 100, 0),
+(1176890, 4, 144.178497, -4462.812500, 253.617325, 0, 0, 0, 0, 100, 0),
+(1176890, 5, 141.329361, -4455.471191, 253.578766, 0, 0, 0, 0, 100, 0),
+(1176890, 6, 125.436966, -4434.860840, 254.323639, 0, 0, 0, 0, 100, 0),
+(1176890, 7, 122.155800, -4418.455566, 255.509537, 0, 0, 0, 0, 100, 0),
+(1176890, 8, 121.316132, -4389.046387, 257.141205, 0, 0, 0, 0, 100, 0),
+(1176890, 9, 124.869438, -4371.796875, 258.335938, 0, 0, 0, 0, 100, 0),
+(1176890, 10, 128.642212, -4362.238281, 258.747375, 0, 0, 0, 0, 100, 0),
+(1176890, 11, 141.832169, -4345.334473, 257.867676, 0, 0, 0, 0, 100, 0),
+(1176890, 12, 150.246857, -4335.993652, 257.498810, 0, 0, 0, 0, 100, 0),
+(1176890, 13, 160.376022, -4316.970703, 256.535919, 0, 0, 0, 0, 100, 0),
+(1176890, 14, 168.596313, -4308.797363, 254.645386, 0, 0, 0, 0, 100, 0),
+(1176890, 15, 178.860077, -4304.438477, 252.472916, 0, 0, 0, 0, 100, 0),
+(1176890, 16, 195.836517, -4286.464355, 248.749603, 0, 0, 0, 0, 100, 0),
+(1176890, 17, 213.626450, -4276.384766, 248.502441, 0, 0, 0, 0, 100, 0),
+(1176890, 18, 238.895004, -4276.655762, 248.606018, 0, 0, 0, 0, 100, 0),
+(1176890, 19, 245.764877, -4272.171387, 248.920975, 0, 0, 0, 0, 100, 0),
+(1176890, 20, 264.235840, -4250.840332, 250.916733, 0, 0, 0, 0, 100, 0),
+(1176890, 21, 282.604492, -4236.683594, 252.033737, 0, 0, 0, 0, 100, 0),
+(1176890, 22, 288.971344, -4223.116211, 252.916443, 0, 0, 0, 0, 100, 0),
+(1176890, 23, 291.303375, -4196.310547, 254.307571, 0, 0, 0, 0, 100, 0),
+(1176890, 24, 294.156342, -4189.324707, 254.992859, 0, 0, 0, 0, 100, 0),
+(1176890, 25, 291.303375, -4196.310547, 254.307571, 0, 0, 0, 0, 100, 0),
+(1176890, 26, 288.971344, -4223.116211, 252.916443, 0, 0, 0, 0, 100, 0),
+(1176890, 27, 282.604492, -4236.683594, 252.033737, 0, 0, 0, 0, 100, 0),
+(1176890, 28, 264.235840, -4250.840332, 250.916733, 0, 0, 0, 0, 100, 0),
+(1176890, 29, 245.764877, -4272.171387, 248.920975, 0, 0, 0, 0, 100, 0),
+(1176890, 30, 238.895004, -4276.655762, 248.606018, 0, 0, 0, 0, 100, 0),
+(1176890, 31, 213.626450, -4276.384766, 248.502441, 0, 0, 0, 0, 100, 0),
+(1176890, 32, 195.836517, -4286.464355, 248.749603, 0, 0, 0, 0, 100, 0),
+(1176890, 33, 178.860077, -4304.438477, 252.472916, 0, 0, 0, 0, 100, 0),
+(1176890, 34, 168.596313, -4308.797363, 254.645386, 0, 0, 0, 0, 100, 0),
+(1176890, 35, 160.376022, -4316.970703, 256.535919, 0, 0, 0, 0, 100, 0),
+(1176890, 36, 150.246857, -4335.993652, 257.498810, 0, 0, 0, 0, 100, 0),
+(1176890, 37, 141.832169, -4345.334473, 257.867676, 0, 0, 0, 0, 100, 0),
+(1176890, 38, 128.642212, -4362.238281, 258.747375, 0, 0, 0, 0, 100, 0),
+(1176890, 39, 124.869438, -4371.796875, 258.335938, 0, 0, 0, 0, 100, 0),
+(1176890, 40, 121.316132, -4389.046387, 257.141205, 0, 0, 0, 0, 100, 0),
+(1176890, 41, 122.155800, -4418.455566, 255.509537, 0, 0, 0, 0, 100, 0),
+(1176890, 42, 125.436966, -4434.860840, 254.323639, 0, 0, 0, 0, 100, 0),
+(1176890, 43, 141.329361, -4455.471191, 253.578766, 0, 0, 0, 0, 100, 0),
+(1176890, 44, 144.178497, -4462.812500, 253.617325, 0, 0, 0, 0, 100, 0),
+(1176890, 45, 156.068008, -4517.755371, 257.193939, 0, 0, 0, 0, 100, 0),
+(1176890, 46, 156.098114, -4532.821289, 258.803101, 0, 0, 0, 0, 100, 0),
+(1176890, 47, 153.249817, -4549.366211, 261.364685, 0, 0, 0, 0, 100, 0);
diff --git a/sql/updates/world/2015_03_12_00_world.sql b/sql/updates/world/2015_03_12_00_world.sql
new file mode 100644
index 00000000000..f8251f9b2b4
--- /dev/null
+++ b/sql/updates/world/2015_03_12_00_world.sql
@@ -0,0 +1,18 @@
+UPDATE `creature_template` SET `gossip_menu_id`=8443 WHERE `entry`=21769;
+DELETE FROM `gossip_menu` WHERE `entry`=8443;
+INSERT INTO `gossip_menu` (`entry`, `text_id`) VALUES
+(8443, 10549); -- 21769
+DELETE FROM `gossip_menu_option` WHERE `menu_id`=8443;
+INSERT INTO `gossip_menu_option` (`menu_id`, `id`, `option_icon`, `option_text`, `OptionBroadcastTextID`, `option_id`, `npc_option_npcflag`, `action_menu_id`, `action_poi_id`, `box_coded`, `box_money`, `box_text`, `BoxBroadcastTextID`) VALUES
+(8443, 0, 0, 'I''ve lost my Kor''kron Flare Gun, sir. May I have another?', 19708, 1, 1, 0, 0, 0, 0, '', 0);
+
+DELETE FROM `smart_scripts` WHERE `entryorguid`=21769 AND `source_type`=0 AND `id` IN(3,4);
+INSERT INTO `smart_scripts` (`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`, `comment`) VALUES
+(21769, 0, 3, 4, 62, 0, 100, 0, 8443, 0, 0, 0, 72, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'Overlord Or\'barokh - On Gossip Option 0 Selected - Close Gossip'),
+(21769, 0, 4, 0, 61, 0, 100, 0, 0, 0, 0, 0, 85, 38172, 2, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'Overlord Or\'barokh - On Gossip Option 0 Selected - Cast Create Kor''kron Flare Gun');
+
+DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=15 AND `SourceGroup`=8443;
+INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorType`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES
+(15, 8443, 0, 0, 0, 8, 0, 10750, 0, 0, 0, 0, 0, '', 'Show gossip option if player has the path of conquest rewarded'),
+(15, 8443, 0, 0, 0, 8, 0, 10769, 0, 0, 1, 0, 0, '', 'Show gossip option if player does not have Dissension Amongst the Ranks rewarded'),
+(15, 8443, 0, 0, 0, 2, 0, 31108, 1, 0, 1, 0, 0, '', 'Show gossip option if player does not have Kor''Kron Flare Gun');
diff --git a/sql/updates/world/2015_03_12_01_world.sql b/sql/updates/world/2015_03_12_01_world.sql
new file mode 100644
index 00000000000..8c6dc8fe248
--- /dev/null
+++ b/sql/updates/world/2015_03_12_01_world.sql
@@ -0,0 +1,14 @@
+DELETE FROM `gossip_menu_option` WHERE `menu_id`=8457;
+INSERT INTO `gossip_menu_option` (`menu_id`, `id`, `option_icon`, `option_text`, `OptionBroadcastTextID`, `option_id`, `npc_option_npcflag`, `action_menu_id`, `action_poi_id`, `box_coded`, `box_money`, `box_text`, `BoxBroadcastTextID`) VALUES
+(8457, 0, 0, 'I need another Wildhammer Flare Gun, Thane.', 19747, 1, 1, 0, 0, 0, 0, '', 0);
+
+DELETE FROM `smart_scripts` WHERE `entryorguid`=21773 AND `source_type`=0 AND `id` IN(1,2);
+INSERT INTO `smart_scripts` (`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`, `comment`) VALUES
+(21773, 0, 1, 2, 62, 0, 100, 0, 8457, 0, 0, 0, 72, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'Thane Yoregar - On Gossip Option 0 Selected - Close Gossip'),
+(21773, 0, 2, 0, 61, 0, 100, 0, 0, 0, 0, 0, 85, 38251, 2, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'Thane Yoregar - On Gossip Option 0 Selected - Cast Create Wildhammer Flare Gun');
+
+DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=15 AND `SourceGroup`=8457;
+INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorType`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES
+(15, 8457, 0, 0, 0, 8, 0, 10772, 0, 0, 0, 0, 0, '', 'Show gossip option if player has the path of conquest rewarded'),
+(15, 8457, 0, 0, 0, 8, 0, 10776, 0, 0, 1, 0, 0, '', 'Show gossip option if player does not have Dissension Amongst the Ranks rewarded'),
+(15, 8457, 0, 0, 0, 2, 0, 31310, 1, 0, 1, 0, 0, '', 'Show gossip option if player does not have Wildhammer Flare Gun');
diff --git a/sql/updates/world/2015_03_14_00_world.sql b/sql/updates/world/2015_03_14_00_world.sql
new file mode 100644
index 00000000000..71a17359756
--- /dev/null
+++ b/sql/updates/world/2015_03_14_00_world.sql
@@ -0,0 +1,43 @@
+SET @CGUID := 76001;
+UPDATE `gameobject_template` SET `AIName`='SmartGameObjectAI' WHERE `entry`=177746;
+UPDATE `gameobject` SET `position_x`=-2288.696777, `position_y`=1345.580078, `position_z`=66.123787 WHERE `guid`=99892;
+
+UPDATE `creature_template` SET `AIName`='SmartAI' WHERE `entry` IN (11560);
+DELETE FROM `creature_template_addon` WHERE `entry`=11560;
+INSERT INTO `creature_template_addon` (`entry`,`bytes2`,`auras`) VALUES
+(11560,1,17327);
+
+DELETE FROM `smart_scripts` WHERE `entryorguid` IN (11560, 1156000, 177746, 17774600);
+INSERT INTO `smart_scripts` (`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`, `comment`) VALUES
+(177746, 1, 0, 0, 1, 0, 100, 1, 6000, 6000, 6000, 6000, 50, 177749, 180000, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Ghost Magnet - OOC no repeat - Summon gob'), -- A gob cannot summon a gob
+(177746, 1, 1, 0, 1, 0, 100, 0, 6000, 6000, 6000, 6000, 45, 0, 1, 0, 0, 0, 0, 19, 11560, 70, 0, 0, 0, 0, 0, 'Ghost Magnet - ActionList - Set data 0'),
+(11560, 0, 0, 1, 38, 0, 100, 1, 0, 1, 0, 0, 28, 34426, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Magrami Spectre - On dataset 0 1 - remove aura'),
+(11560, 0, 1, 2, 61, 0, 100, 1, 0, 0, 0, 0, 80, 1156000, 2, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Magrami Spectre - on link - Start script'),
+(1156000, 9, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 59, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Magrami Spectre - On script - Set run off'),
+(1156000, 9, 1, 0, 0, 0, 100, 0, 0, 0, 0, 0, 69, 0, 0, 0, 0, 0, 0, 20, 177746, 70, 0, 0, 0, 0, 0, 'Magrami Spectre - On script - move to pos'),
+(1156000, 9, 2, 0, 0, 0, 100, 0, 7000, 7000, 0, 0, 49, 0, 0, 0, 0, 0, 0, 21, 30, 0, 0, 0, 0, 0, 0, 'Magrami Spectre - On script - ATTACK'),
+(11560, 0, 2, 0, 61, 0, 100, 0, 0, 0, 0, 0, 41, 70000, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Magrami Spectre - On Link - Despawn'),
+(11560, 0, 2, 3, 25, 0, 100, 1, 0, 0, 0, 0, 11, 34426, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Magrami Spectre - on Reset - add aura'),
+(11560, 0, 3, 0, 61, 0, 100, 0, 0, 0, 0, 0, 11, 17327, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Magrami Spectre - on Reset - add aura'),
+(11560, 0, 4, 0, 0, 0, 100, 1, 5000, 5000, 0, 0, 11, 18159, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 'Magrami Spectre - on script - add aura'),
+(11560, 0, 5, 0, 0, 0, 100, 0, 2000, 2000, 7000, 7000, 11, 12531, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 'Magrami Spectre - on script - add aura');
+
+DELETE FROM `creature` WHERE `guid` BETWEEN @CGUID+0 AND @CGUID+16;
+INSERT INTO `creature` (`guid`, `id`, `map`, `spawnMask`, `phaseMask`, `position_x`, `position_y`, `position_z`, `orientation`, `spawntimesecs`, `spawndist`, `MovementType`) VALUES
+(@CGUID+0, 11560, 1, 1, 1, -2254.859, 1330.685, 63.67144, 5.253441, 120, 0, 0),
+(@CGUID+1, 11560, 1, 1, 1, -2288.117, 1333.648, 63.67144, 5.427974, 120, 0, 0),
+(@CGUID+2, 11560, 1, 1, 1, -2317.772, 1378.803, 63.67144, 2.548181, 120, 0, 0),
+(@CGUID+3, 11560, 1, 1, 1, -2245.802, 1315.414, 63.67144, 3.176499, 120, 0, 0),
+(@CGUID+4, 11560, 1, 1, 1, -2276.162, 1328.752, 63.82001, 5.811946, 120, 0, 0),
+(@CGUID+5, 11560, 1, 1, 1, -2281.066, 1339.434, 63.67144, 2.426008, 120, 0, 0),
+(@CGUID+6, 11560, 1, 1, 1, -2265.949, 1334.62, 63.67144, 3.874631, 120, 0, 0),
+(@CGUID+7, 11560, 1, 1, 1, -2266.548, 1308.922, 64.06808, 2.09432, 120, 0, 0),
+(@CGUID+8, 11560, 1, 1, 1, -2275.962, 1315.779, 63.94889, 5.846853, 120, 0, 0),
+(@CGUID+9, 11560, 1, 1, 1, -2285.754, 1323.675, 63.68898, 5.707227, 120, 0, 0),
+(@CGUID+10, 11560, 1, 1, 1, -2311.181, 1387.165, 63.67143, 4.39823, 120, 0, 0),
+(@CGUID+11, 11560, 1, 1, 1, -2255.519, 1311.52, 63.72472, 5.969026, 120, 0, 0),
+(@CGUID+12, 11560, 1, 1, 1, -2292.626, 1380.353, 63.68015, 3.001966, 120, 0, 0),
+(@CGUID+13, 11560, 1, 1, 1, -2309.959, 1347.675, 63.67144, 1.216367, 120, 0, 0),
+(@CGUID+14, 11560, 1, 1, 1, -2295.897, 1361.538, 63.6894, 2.80998, 120, 0, 0),
+(@CGUID+15, 11560, 1, 1, 1, -2305.648, 1359.731, 63.69492, 4.485496, 120, 0, 0),
+(@CGUID+16, 11560, 1, 1, 1, -2256.498, 1321.57, 63.67144, 5.148721, 120, 0, 0);
diff --git a/sql/updates/world/2015_03_14_01_world.sql b/sql/updates/world/2015_03_14_01_world.sql
new file mode 100644
index 00000000000..f99651da7b9
--- /dev/null
+++ b/sql/updates/world/2015_03_14_01_world.sql
@@ -0,0 +1,3 @@
+UPDATE `creature_template` SET `gossip_menu_id`=1285 WHERE `entry`=8436;
+UPDATE `smart_scripts` SET `event_param1`=1286 WHERE `entryorguid`=8436 AND `source_type`=0 AND `id`=0;
+UPDATE `gossip_menu_option` SET `action_menu_id`=0 WHERE `menu_id`=1286;
diff --git a/sql/updates/world/2015_03_14_02_world.sql b/sql/updates/world/2015_03_14_02_world.sql
new file mode 100644
index 00000000000..0c9f0154dec
--- /dev/null
+++ b/sql/updates/world/2015_03_14_02_world.sql
@@ -0,0 +1,17 @@
+UPDATE `creature` SET `guid`=76001 WHERE `guid`=214003;
+UPDATE `creature` SET `guid`=76002 WHERE `guid`=214004;
+UPDATE `creature` SET `guid`=76003 WHERE `guid`=214005;
+UPDATE `creature` SET `guid`=76004 WHERE `guid`=214006;
+UPDATE `creature` SET `guid`=76005 WHERE `guid`=214007;
+UPDATE `creature` SET `guid`=76006 WHERE `guid`=214008;
+UPDATE `creature` SET `guid`=76007 WHERE `guid`=214009;
+UPDATE `creature` SET `guid`=76008 WHERE `guid`=214010;
+UPDATE `creature` SET `guid`=76009 WHERE `guid`=214011;
+UPDATE `creature` SET `guid`=76010 WHERE `guid`=214012;
+UPDATE `creature` SET `guid`=76011 WHERE `guid`=214013;
+UPDATE `creature` SET `guid`=76012 WHERE `guid`=214014;
+UPDATE `creature` SET `guid`=76013 WHERE `guid`=214015;
+UPDATE `creature` SET `guid`=76014 WHERE `guid`=214016;
+UPDATE `creature` SET `guid`=76015 WHERE `guid`=214017;
+UPDATE `creature` SET `guid`=76016 WHERE `guid`=214018;
+UPDATE `creature` SET `guid`=76017 WHERE `guid`=214019;
diff --git a/sql/updates/world/2015_03_15_00_world.sql b/sql/updates/world/2015_03_15_00_world.sql
new file mode 100644
index 00000000000..659d167e552
--- /dev/null
+++ b/sql/updates/world/2015_03_15_00_world.sql
@@ -0,0 +1,316 @@
+SET @GUID:=14830; -- 6 free GO guid required (spell focus)
+SET @SUMMON := 49991;
+SET @GOLEM := 24825;
+SET @BENCH := 186958;
+SET @Relic := 24824;
+SET @Triggger :=24845;
+SET @IronDwarf :=24846;
+SET @LOKEN := 24847;
+SET @Ouvrier:= 23672;
+SET @Maitre:=23675;
+SET @Garde:=23673;
+SET @IRONGolem:=24271;
+SET @Earth:=24340;
+SET @A1A2:=24826;
+SET @B1B2:=24827;
+SET @C1C2:=24828;
+SET @D1:=24831;
+SET @D2:=24829;
+SET @D3:=24832;
+
+DELETE FROM `spell_target_position` WHERE `id` in (49992);
+INSERT INTO `spell_target_position` (`id`,`target_map`,`target_position_x`,`target_position_y`,`target_position_z`,`target_orientation`) VALUES
+(49992, 571, 478.951782, -5941.529297, 308.749969, 0.419872);
+
+UPDATE `creature_template` SET `spell1`=44608, `spell2`=44610, `spell3`=44609,`AIName`='SmartAI', `InhabitType`=5 WHERE `entry`=@GOLEM;
+UPDATE `creature_template` SET `AIName`='SmartAI' WHERE `entry` IN (@LOKEN, @IronDwarf, @Triggger, @Relic, @Ouvrier, @Maitre, @Garde, @IRONGolem, @Earth, @A1A2, @B1B2, @C1C2, @D1, @D2, @D3);
+UPDATE `creature_template` SET `faction`= 1954 WHERE `entry`=@LOKEN;
+UPDATE `creature_template` SET `flags_extra`= 0 WHERE `entry`=@Triggger;
+
+DELETE FROM `creature` WHERE `id` IN (24846, 24847);
+DELETE FROM `creature_addon` WHERE `guid` =97731;
+UPDATE `creature` SET `spawndist`=0, `MovementType`=0 WHERE `id`= @Triggger;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@GOLEM AND `source_type`=0;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@Relic AND `source_type`=0;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@BENCH AND `source_type`=1 AND `id` IN (6,7);
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@Triggger AND `source_type`=0;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@Triggger*100 AND `source_type`=9;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@IronDwarf AND `source_type`=0;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@IronDwarf*100 AND `source_type`=9;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@LOKEN AND `source_type`=0;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@LOKEN*100 AND `source_type`=9;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@Garde AND `source_type`=0;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@Garde*100 AND `source_type`=9;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@Garde*100+1 AND `source_type`=9;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@Ouvrier AND `source_type`=0;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@Ouvrier*100 AND `source_type`=9;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@Ouvrier*100+1 AND `source_type`=9;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@Earth AND `source_type`=0;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@Maitre AND `source_type`=0;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@Maitre*100 AND `source_type`=9;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@Maitre*100+1 AND `source_type`=9;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@IRONGolem AND `source_type`=0;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@IRONGolem*100 AND `source_type`=9;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@IRONGolem*100+1 AND `source_type`=9;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@A1A2*100 AND `source_type`=9;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@B1B2*100 AND `source_type`=9;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@C1C2*100 AND `source_type`=9;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@D1*100 AND `source_type`=9;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@D2*100 AND `source_type`=9;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@D3*100 AND `source_type`=9;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@BENCH,1,6,7,62,0,100,0,9024,3,0,0,72,0,0,0,0,0,0,7,0,0,0,0,0,0,0,'Work Bench - Gossip select - Close gossip'),
+(@BENCH,1,7,0,61,0,100,0,0,0,0,0,85,@SUMMON,2,0,0,0,0,7,0,0,0,0,0,0,0,'Work Bench - Gossip select - Summon Iron Rune Construct'),
+(@GOLEM,0,0,0,54,0,100,0,0,0,0,0,75,44643,0,0,0,0,0,23,0,0,0,0,0,0,0,'Iron Rune Construct - Just Summoned - Add aura to owner'),
+(@GOLEM,0,1,0,28,0,100,0,0,0,0,0,28,44643,0,0,0,0,0,23,0,0,0,0,0,0,0,'Iron Rune Construct - Passenger removed - remove aura from owner'),
+(@Relic,0,0,0,8,0,100,0,44610,0,0,0,41,5000,0,0,0,0,0,1,0,0,0,0,0,0,0,'Relict - SpellHit - Despawn'),
+(@Triggger,0,0,0,10,0,100,0,1,20,180000,180000,80,@Triggger*100,2,0,0,0,0,1,0,0,0,0,0,0,0,'Triggger - LOS - Action list'),
+(@Triggger*100,9,0,0,0,0,100,0,0,0,0,0,12,@IronDwarf,5,0,0,0,0,8,0,0,0,306.098907, -5706.150391, 102.435051, 4.96977,'Triggger - Action list - Summon'),
+(@Triggger*100,9,1,0,0,0,100,0,0,0,0,0,12,@IronDwarf,5,0,0,0,0,8,0,0,0,311.025482, -5702.801270, 101.934959, 5.187225,'Triggger - Action list - Summon'),
+(@Triggger*100,9,2,0,0,0,100,0,0,0,0,0,12,@IronDwarf,5,0,0,0,0,8,0,0,0,309.754456, -5703.156250, 102.070854, 5.187225,'Triggger - Action list - Summon'),
+(@Triggger*100,9,3,0,0,0,100,0,0,0,0,0,12,@IronDwarf,5,0,0,0,0,8,0,0,0,308.222504, -5703.797363, 102.231758, 5.187225,'Triggger - Action list - Summon'),
+(@Triggger*100,9,4,0,0,0,100,0,0,0,0,0,12,@IronDwarf,5,0,0,0,0,8,0,0,0,307.043610, -5704.315430, 102.356087, 5.187225,'Triggger - Action list - Summon'),
+(@Triggger*100,9,5,0,0,0,100,0,0,0,0,0,12,@IronDwarf,5,0,0,0,0,8,0,0,0,304.169464, -5706.838379, 102.696602, 5.187225,'Triggger - Action list - Summon'),
+(@Triggger*100,9,6,0,0,0,100,0,0,0,0,0,12,@IronDwarf,5,0,0,0,0,8,0,0,0,303.129547, -5707.277344, 102.978165, 5.187225,'Triggger - Action list - Summon'),
+(@Triggger*100,9,7,0,0,0,100,0,0,0,0,0,12,@IronDwarf,5,0,0,0,0,8,0,0,0,297.246,-5726.82,96.2681,0.347607,'Triggger - Action list - Summon'),
+(@Triggger*100,9,8,0,0,0,100,0,0,0,0,0,12,@IronDwarf,5,0,0,0,0,8,0,0,0,292.82,-5726.04,96.5843,0.347607,'Triggger - Action list - Summon'),
+(@Triggger*100,9,9,0,0,0,100,0,0,0,0,0,12,@IronDwarf,5,0,0,0,0,8,0,0,0,292.562,-5728.57,96.5857,0.347607,'Triggger - Action list - Summon'),
+(@Triggger*100,9,10,0,0,0,100,0,0,0,0,0,12,@IronDwarf,5,0,0,0,0,8,0,0,0,292.15,-5727.42,96.5874,0.347607,'Triggger - Action list - Summon'),
+(@Triggger*100,9,11,0,0,0,100,0,0,0,0,0,12,@IronDwarf,5,0,0,0,0,8,0,0,0,294.578,-5730.09,96.2958,0.347607,'Triggger - Action list - Summon'),
+(@Triggger*100,9,12,0,0,0,100,0,0,0,0,0,12,@IronDwarf,5,0,0,0,0,8,0,0,0,296.196,-5730.17,96.0082,0.347607,'Triggger - Action list - Summon'),
+(@Triggger*100,9,13,0,0,0,100,0,0,0,0,0,12,@IronDwarf,5,0,0,0,0,8,0,0,0,297.603,-5730.79,95.6955,0.347607,'Triggger - Action list - Summon'),
+(@Triggger*100,9,14,0,0,0,100,0,0,0,0,0,12,@IronDwarf,5,0,0,0,0,8,0,0,0,299.397,-5729.56,95.7274,0.347607,'Triggger - Action list - Summon'),
+(@Triggger*100,9,15,0,0,0,100,0,0,0,0,0,12,@LOKEN,5,0,0,0,0,8,0,0,0,315.101,-5723.06,96.2541,3.05433,'Triggger - Action list - Summon'),
+(@Triggger*100,9,16,0,0,0,100,0,70000,70000,0,0,41,0,0,0,0,0,0,11,@IronDwarf,40,0,0,0,0,0,'Triggger - Action List - Despawn'),
+(@Triggger,0,1,0,25,0,100,0,0,0,0,0,47,0,0,0,0,0,0,1,0,0,0,0,0,0,0,'Triggger - On reset - set Invisible'),
+(@IronDwarf,0,0,0,54,0,100,0,0,0,0,0,80,@IronDwarf*100,2,0,0,0,0,1,0,0,0,0,0,0,0,'IronDwarf - Just Summoned - Action List'),
+(@IronDwarf*100,9,0,0,0,0,100,0,0,0,0,0,59,0,0,0,0,0,0,1,0,0,0,0,0,0,0,'IronDwarf - Action List - Set run off'),
+(@IronDwarf*100,9,1,0,0,0,100,0,0,0,0,0,46,8,0,0,0,0,0,1,0,0,0,0,0,0,0,'IronDwarf - Action List - Move forward'),
+(@IronDwarf*100,9,2,0,0,0,100,0,4000,4000,0,0,11,68442,0,0,0,0,0,1,0,0,0,0,0,0,0,'IronDwarf - Action List - Cast Kneels'),
+(@LOKEN,0,0,0,54,0,100,0,0,0,0,0,80,@LOKEN*100,2,0,0,0,0,1,0,0,0,0,0,0,0,'LOKEN - Just Summoned - Action List'),
+(@LOKEN*100,9,0,0,0,0,100,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,'LOKEN - Action List - Talk'),
+(@LOKEN*100,9,1,0,0,0,100,0,6000,6000,0,0,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,'LOKEN - Action List - Talk'),
+(@LOKEN*100,9,2,0,0,0,100,0,6000,6000,0,0,1,2,0,0,0,0,0,1,0,0,0,0,0,0,0,'LOKEN - Action List - Talk'),
+(@LOKEN*100,9,3,0,0,0,100,0,8000,8000,0,0,1,3,0,0,0,0,0,1,0,0,0,0,0,0,0,'LOKEN - Action List - Talk'),
+(@LOKEN*100,9,4,0,0,0,100,0,9000,9000,0,0,1,4,0,0,0,0,0,1,0,0,0,0,0,0,0,'LOKEN - Action List - Talk'),
+(@LOKEN*100,9,5,0,0,0,100,0,9000,9000,0,0,1,5,0,0,0,0,0,1,0,0,0,0,0,0,0,'LOKEN - Action List - Talk'),
+(@LOKEN*100,9,6,0,0,0,100,0,7000,7000,0,0,1,6,0,0,0,0,0,1,0,0,0,0,0,0,0,'LOKEN - Action List - Talk'),
+(@LOKEN*100,9,7,0,0,0,100,0,0,0,0,0,11,44682,0,0,0,0,0,21,30,0,0,0,0,0,0,'LOKEN - Action List - Cast Credit'),
+(@LOKEN*100,9,8,0,0,0,100,0,2000,2000,0,0,41,0,0,0,0,0,0,11,@IronDwarf,40,0,0,0,0,0,'LOKEN - Action List - Despawn Dwarfs'),
+(@LOKEN*100,9,9,0,0,0,100,0,0,0,0,0,41,0,0,0,0,0,0,1,0,0,0,0,0,0,0,'LOKEN - Action List - Despawn'),
+(@IronDwarf,0,1,0,4,0,100,0,0,0,0,0,41,0,0,0,0,0,0,1,0,0,0,0,0,0,0,'IronDwarf - On aggro - despawn'),
+(@LOKEN,0,1,0,4,0,100,0,0,0,0,0,41,0,0,0,0,0,0,1,0,0,0,0,0,0,0,'LOKEN - On aggro - despawn'),
+(@Garde,0,0,0,10,0,20,0,1,9,60000,60000,80,@Garde*100,0,0,0,0,0,1,0,0,0,0,0,0,0,'Garde - LOS - Action list'),
+(@Garde*100,9,0,0,0,0,100,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,'Garde - Action list - TALK'),
+(@Garde*100,9,1,0,0,0,100,0,0,0,0,0,22,1,0,0,0,0,0,1,0,0,0,0,0,0,0,'Garde - Action list - Set Event phase1'),
+(@Garde*100,9,2,0,0,0,100,0,0,0,0,0,103,1,0,0,0,0,0,1,0,0,0,0,0,0,0,'Garde - Action list - Root'),
+(@Garde*100,9,3,0,0,0,100,0,0,0,0,0,66,0,0,0,0,0,0,19,@GOLEM,20,0,0,0,0,0,'Garde - Action list - Set Orientation'),
+(@Garde*100,9,4,0,0,0,100,0,10000,10000,0,0,103,0,0,0,0,0,0,1,0,0,0,0,0,0,0,'Garde - Action list - remove root'),
+(@Garde*100,9,5,0,0,1,100,0,0,0,0,0,28,44643,0,0,0,0,0,21,50,0,0,0,0,0,0,'Garde - Action list - remove Aura'),
+(@Garde*100,9,6,0,0,1,100,0,0,0,0,0,1,2,0,0,0,0,0,0,0,0,0,0,0,0,0,'Garde - Action list - Talk'),
+(@Garde,0,1,0,8,1,100,0,44609,0,0,0,80,@Garde*100+1,0,0,0,0,0,1,0,0,0,0,0,0,0,'Garde - spell hit - action list'),
+(@Garde*100+1,9,0,0,0,0,100,0,0,0,0,0,22,0,0,0,0,0,0,1,0,0,0,0,0,0,0,'Garde - Action list - Set Event phase 0'),
+(@Garde*100+1,9,1,0,0,0,100,0,0,0,0,0,1,0,0,0,0,0,0,19,@GOLEM,20,0,0,0,0,0,'Garde - Action list - TALK'),
+(@Garde*100+1,9,2,0,0,0,100,0,5000,5000,0,0,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,'Garde - Action list - TALK'),
+(@Garde,0,2,0,0,0,100,0,5000,5000,30000,30000,11,42580,0,0,0,0,0,2,0,0,0,0,0,0,0,'Garde - IC - Cast'),
+(@Garde,0,3,0,4,0,100,0,0,0,0,0,11,49758,0,0,0,0,0,2,0,0,0,0,0,0,0,'Garde - On aggro - Cast'),
+(@Ouvrier,0,0,0,10,0,20,0,1,9,60000,60000,80,@Ouvrier*100,0,0,0,0,0,1,0,0,0,0,0,0,0,'Ouvrier - LOS - Action list'),
+(@Ouvrier*100,9,0,0,0,0,100,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,'Ouvrier - Action list - TALK'),
+(@Ouvrier*100,9,1,0,0,0,100,0,0,0,0,0,22,1,0,0,0,0,0,1,0,0,0,0,0,0,0,'Ouvrier - Action list - Set Event phase1'),
+(@Ouvrier*100,9,2,0,0,0,100,0,0,0,0,0,103,1,0,0,0,0,0,1,0,0,0,0,0,0,0,'Ouvrier - Action list - Root'),
+(@Ouvrier*100,9,3,0,0,0,100,0,0,0,0,0,66,0,0,0,0,0,0,19,@GOLEM,20,0,0,0,0,0,'Ouvrier - Action list - Set Orientation'),
+(@Ouvrier*100,9,4,0,0,0,100,0,10000,10000,0,0,103,0,0,0,0,0,0,1,0,0,0,0,0,0,0,'Ouvrier - Action list - remove root'),
+(@Ouvrier*100,9,5,0,0,1,100,0,0,0,0,0,28,44643,0,0,0,0,0,21,50,0,0,0,0,0,0,'Ouvrier - Action list - remove Aura'),
+(@Ouvrier*100,9,6,0,0,1,100,0,0,0,0,0,1,2,0,0,0,0,0,0,0,0,0,0,0,0,0,'Ouvrier - Action list - Talk'),
+(@Ouvrier,0,1,0,8,1,100,0,44609,0,0,0,80,@Ouvrier*100+1,0,0,0,0,0,1,0,0,0,0,0,0,0,'Ouvrier - spell hit - action list'),
+(@Ouvrier*100+1,9,0,0,0,0,100,0,0,0,0,0,22,0,0,0,0,0,0,1,0,0,0,0,0,0,0,'Ouvrier - Action list - Set Event phase 0'),
+(@Ouvrier*100+1,9,1,0,0,0,100,0,0,0,0,0,1,0,0,0,0,0,0,19,@GOLEM,20,0,0,0,0,0,'Ouvrier - Action list - TALK'),
+(@Ouvrier*100+1,9,2,0,0,0,100,0,5000,5000,0,0,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,'Ouvrier - Action list - TALK'),
+(@Ouvrier,0,2,0,0,0,100,0,5000,5000,5000,8000,11,49749,0,0,0,0,0,2,0,0,0,0,0,0,0,'Ouvrier - IC - Cast'),
+(@Maitre,0,0,0,10,0,20,0,1,9,60000,60000,80,@Maitre*100,0,0,0,0,0,1,0,0,0,0,0,0,0,'Maitre - LOS - Action list'),
+(@Maitre*100,9,0,0,0,0,100,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,'Maitre - Action list - TALK'),
+(@Maitre*100,9,1,0,0,0,100,0,0,0,0,0,22,1,0,0,0,0,0,1,0,0,0,0,0,0,0,'Maitre - Action list - Set Event phase1'),
+(@Maitre*100,9,2,0,0,0,100,0,0,0,0,0,103,1,0,0,0,0,0,1,0,0,0,0,0,0,0,'Maitre - Action list - Root'),
+(@Maitre*100,9,3,0,0,0,100,0,0,0,0,0,66,0,0,0,0,0,0,19,@GOLEM,20,0,0,0,0,0,'Maitre - Action list - Set Orientation'),
+(@Maitre*100,9,4,0,0,0,100,0,10000,10000,0,0,103,0,0,0,0,0,0,1,0,0,0,0,0,0,0,'Maitre - Action list - remove root'),
+(@Maitre*100,9,5,0,0,1,100,0,0,0,0,0,28,44643,0,0,0,0,0,21,50,0,0,0,0,0,0,'Maitre - Action list - remove Aura'),
+(@Maitre*100,9,6,0,0,1,100,0,0,0,0,0,1,2,0,0,0,0,0,0,0,0,0,0,0,0,0,'Maitre - Action list - Talk'),
+(@Maitre,0,1,0,8,1,100,0,44609,0,0,0,80,@Maitre*100+1,0,0,0,0,0,1,0,0,0,0,0,0,0,'Maitre - spell hit - action list'),
+(@Maitre*100+1,9,0,0,0,0,100,0,0,0,0,0,22,0,0,0,0,0,0,1,0,0,0,0,0,0,0,'Maitre - Action list - Set Event phase 0'),
+(@Maitre*100+1,9,1,0,0,0,100,0,0,0,0,0,1,0,0,0,0,0,0,19,@GOLEM,20,0,0,0,0,0,'Maitre - Action list - TALK'),
+(@Maitre*100+1,9,2,0,0,0,100,0,5000,5000,0,0,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,'Maitre - Action list - TALK'),
+(@Maitre,0,2,0,0,0,100,0,5000,5000,7000,10000,11,49753,0,0,0,0,0,2,0,0,0,0,0,0,0,'Garde - IC - Cast'),
+(@IRONGolem,0,0,0,10,0,20,0,1,9,60000,60000,80,@IRONGolem*100,0,0,0,0,0,1,0,0,0,0,0,0,0,'IRONGolem - LOS - Action list'),
+(@IRONGolem*100,9,0,0,0,0,100,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,'IRONGolem - Action list - TALK'),
+(@IRONGolem*100,9,1,0,0,0,100,0,0,0,0,0,22,1,0,0,0,0,0,1,0,0,0,0,0,0,0,'IRONGolem - Action list - Set Event phase1'),
+(@IRONGolem*100,9,2,0,0,0,100,0,0,0,0,0,103,1,0,0,0,0,0,1,0,0,0,0,0,0,0,'IRONGolem - Action list - Root'),
+(@IRONGolem*100,9,3,0,0,0,100,0,0,0,0,0,66,0,0,0,0,0,0,19,@GOLEM,20,0,0,0,0,0,'IRONGolem - Action list - Set Orientation'),
+(@IRONGolem*100,9,4,0,0,0,100,0,10000,10000,0,0,103,0,0,0,0,0,0,1,0,0,0,0,0,0,0,'IRONGolem - Action list - remove root'),
+(@IRONGolem*100,9,5,0,0,1,100,0,0,0,0,0,28,44643,0,0,0,0,0,21,50,0,0,0,0,0,0,'IRONGolem - Action list - remove Aura'),
+(@IRONGolem*100,9,6,0,0,1,100,0,0,0,0,0,1,2,0,0,0,0,0,0,0,0,0,0,0,0,0,'IRONGolem - Action list - talk'),
+(@IRONGolem,0,1,0,8,1,100,0,44609,0,0,0,80,@IRONGolem*100+1,0,0,0,0,0,1,0,0,0,0,0,0,0,'IRONGolem - spell hit - action list'),
+(@IRONGolem*100+1,9,0,0,0,0,100,0,0,0,0,0,22,0,0,0,0,0,0,1,0,0,0,0,0,0,0,'IRONGolem - Action list - Set Event phase 0'),
+(@IRONGolem*100+1,9,1,0,0,0,100,0,0,0,0,0,1,0,0,0,0,0,0,19,@GOLEM,20,0,0,0,0,0,'IRONGolem - Action list - TALK'),
+(@IRONGolem*100+1,9,2,0,0,0,100,0,5000,5000,0,0,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,'IRONGolem - Action list - TALK'),
+(@IRONGolem,0,2,0,0,0,100,0,5000,5000,7000,10000,11,49729,0,0,0,0,0,2,0,0,0,0,0,0,0,'IRONGolem - IC - Cast'),
+(@IRONGolem,0,3,0,1,0,100,0,50000,60000,60000,90000,1,3,0,0,0,0,0,1,0,0,0,0,0,0,0,'IRONGolem - ooc - talk'),
+(@Earth,0,0,0,0,0,100,0,2000,5000,6000,8000,11,49742,0,0,0,0,0,2,0,0,0,0,0,0,0,'IRONGolem - IC - Cast'),
+(@GOLEM,0,2,0,8,0,100,0,44626,0,5000,5000,80,@A1A2*100,0,0,0,0,0,19,@A1A2,1,0,0,0,0,0,'Iron Rune Construct - On spellhit - Action List'),
+(@A1A2*100,9,0,0,0,0,100,0,0,0,0,0,9,0,0,0,0,0,0,14,57776,186953,0,0,0,0,0,'A1A2 - Action list - Activate Gobject'),
+(@A1A2*100,9,1,0,0,0,100,0,0,0,0,0,45,0,1,0,0,0,0,19,@GOLEM,10,0,0,0,0,0,'A1A2 - Action list - SetData'),
+(@GOLEM,0,3,0,8,0,100,0,44626,0,5000,5000,80,@B1B2*100,0,0,0,0,0,19,@B1B2,1,0,0,0,0,0,'Iron Rune Construct - On spellhit - Action List'),
+(@B1B2*100,9,0,0,0,0,100,0,0,0,0,0,9,0,0,0,0,0,0,14,57915,186960,0,0,0,0,0,'B1B2 - Action list - Activate Gobject'),
+(@B1B2*100,9,1,0,0,0,100,0,0,0,0,0,45,0,2,0,0,0,0,19,@GOLEM,10,0,0,0,0,0,'B1B2 - Action list - SetData'),
+(@GOLEM,0,4,0,8,0,100,0,44626,0,5000,5000,80,@C1C2*100,0,0,0,0,0,19,@C1C2,1,0,0,0,0,0,'Iron Rune Construct - On spellhit - Action List'),
+(@C1C2*100,9,0,0,0,0,100,0,0,0,0,0,9,0,0,0,0,0,0,14,57963,186961,0,0,0,0,0,'C1C2 - Action list - Activate Gobject'),
+(@C1C2*100,9,1,0,0,0,100,0,0,0,0,0,45,0,3,0,0,0,0,19,@GOLEM,10,0,0,0,0,0,'C1C2 - Action list - SetData'),
+(@GOLEM,0,5,0,8,0,100,0,44626,0,5000,5000,80,@D1*100,0,0,0,0,0,19,@D1,1,0,0,0,0,0,'Iron Rune Construct - On spellhit - Action List'),
+(@D1*100,9,0,0,0,0,100,0,0,0,0,0,9,0,0,0,0,0,0,14,57972,186962,0,0,0,0,0,'D1 - Action list - Activate Gobject'),
+(@D1*100,9,1,0,0,0,100,0,0,0,0,0,45,0,4,0,0,0,0,19,@GOLEM,10,0,0,0,0,0,'D1 - Action list - SetData'),
+(@GOLEM,0,6,0,8,0,100,0,44626,0,5000,5000,80,@D2*100,0,0,0,0,0,19,@D2,1,0,0,0,0,0,'Iron Rune Construct - On spellhit - Action List'),
+(@D2*100,9,0,0,0,0,100,0,0,0,0,0,9,0,0,0,0,0,0,14,57988,186963,0,0,0,0,0,'D2 - Action list - Activate Gobject'),
+(@D2*100,9,1,0,0,0,100,0,0,0,0,0,45,0,5,0,0,0,0,19,@GOLEM,10,0,0,0,0,0,'D2 - Action list - SetData'),
+(@GOLEM,0,7,0,8,0,100,0,44626,0,5000,5000,80,@D3*100,0,0,0,0,0,19,@D3,1,0,0,0,0,0,'Iron Rune Construct - On spellhit - Action List'),
+(@D3*100,9,0,0,0,0,100,0,0,0,0,0,9,0,0,0,0,0,0,14,66097,186964,0,0,0,0,0,'D3 - Action list - Activate Gobject'),
+(@D3*100,9,1,0,0,0,100,0,0,0,0,0,45,0,6,0,0,0,0,19,@GOLEM,10,0,0,0,0,0,'D3 - Action list - SetData'),
+(@GOLEM,0,8,0,38,0,100,0,0,1,0,0,53,1,@A1A2,0,0,0,0,1,0,0,0,0,0,0,0,'Iron Rune Construct - On data set - Start waypoint'),
+(@GOLEM,0,9,0,38,0,100,0,0,2,0,0,53,1,@B1B2,0,0,0,0,1,0,0,0,0,0,0,0,'Iron Rune Construct - On data set - Start waypoint'),
+(@GOLEM,0,10,0,38,0,100,0,0,3,0,0,53,1,@C1C2,0,0,0,0,1,0,0,0,0,0,0,0,'Iron Rune Construct - On data set - Start waypoint'),
+(@GOLEM,0,11,0,38,0,100,0,0,4,0,0,53,1,@D1,0,0,0,0,1,0,0,0,0,0,0,0,'Iron Rune Construct - On data set - Start waypoint'),
+(@GOLEM,0,12,0,38,0,100,0,0,5,0,0,53,1,@D2,0,0,0,0,1,0,0,0,0,0,0,0,'Iron Rune Construct - On data set - Start waypoint'),
+(@GOLEM,0,13,0,38,0,100,0,0,6,0,0,53,1,@D3,0,0,0,0,1,0,0,0,0,0,0,0,'Iron Rune Construct - On data set - Start waypoint'),
+(@GOLEM,0,14,0,58,0,100,0,0,0,0,0,28,44626,0,0,0,0,0,1,0,0,0,0,0,0,0,'Iron Rune Construct - On waypoint end - Remove aura');
+
+DELETE FROM `waypoints` WHERE `entry` IN (@C1C2, @B1B2, @A1A2, @D1, @D2, @D3);
+INSERT INTO `waypoints` (`entry`,`pointid`,`position_x`,`position_y`,`position_z`,`point_comment`) VALUES
+(@C1C2,1, 250.667023, -5770.241699, 252.249847,'Iron Rune Construct'),
+(@C1C2,2, 158.802368, -5823.064941, 7.080285,'Iron Rune Construct'),
+(@B1B2,1, 268.167053, -5814.819824, 282.507080,'Iron Rune Construct'),
+(@B1B2,2, 255.435913, -5891.186035, 83.068146,'Iron Rune Construct'),
+(@A1A2,1, 221.699432, -5736.851074, 289.626099,'Iron Rune Construct'),
+(@A1A2,2, 157.139877, -5712.004883, 189.551346,'Iron Rune Construct'),
+(@D1,1, 212.711884, -5808.783691, 297.261902,'Iron Rune Construct'),
+(@D1,2, 276.179016, -5755.332031, 268.456543,'Iron Rune Construct'),
+(@D2,1, 228.848938, -5740.563477, 283.448700,'Iron Rune Construct'),
+(@D2,2, 278.266785, -5758.165039, 268.454834,'Iron Rune Construct'),
+(@D3,1, 266.918884, -5837.802246, 304.154144,'Iron Rune Construct'),
+(@D3,2, 280.913208, -5761.616699, 268.456696,'Iron Rune Construct');
+
+DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=22 AND `SourceGroup`=1 AND `SourceEntry`=@Triggger;
+INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`, `ErrorTextId`,`ScriptName`,`Comment`) VALUES
+(22,1,@Triggger,0,31,3,24825,0,0,'','event require npc 24825');
+DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=22 AND `SourceGroup`=1 AND `SourceEntry`=@IRONGolem;
+INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`, `ErrorTextId`,`ScriptName`,`Comment`) VALUES
+(22,1,@IRONGolem,0,31,3,24825,0,0,'','event require npc 24825');
+DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=22 AND `SourceGroup`=1 AND `SourceEntry`=@Garde;
+INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`, `ErrorTextId`,`ScriptName`,`Comment`) VALUES
+(22,1,@Garde,0,31,3,24825,0,0,'','event require npc 24825');
+DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=22 AND `SourceGroup`=1 AND `SourceEntry`=@Maitre;
+INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`, `ErrorTextId`,`ScriptName`,`Comment`) VALUES
+(22,1,@Maitre,0,31,3,24825,0,0,'','event require npc 24825');
+DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=22 AND `SourceGroup`=1 AND `SourceEntry`=@Ouvrier;
+INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`, `ErrorTextId`,`ScriptName`,`Comment`) VALUES
+(22,1,@Ouvrier,0,31,3,24825,0,0,'','event require npc 24825');
+
+DELETE FROM `creature_text` WHERE `entry`IN (@LOKEN, @GOLEM, @Garde, @Ouvrier, @Maitre, @IRONGolem);
+INSERT INTO `creature_text` (`entry`,`groupid`,`id`,`text`,`type`,`language`,`probability`,`emote`,`duration`,`sound`,`comment`, `BroadcastTextID`) VALUES
+(@LOKEN,0,0,"The sound of thunder roars throughout the cavern.",41,9,100,0,0,0,'LOKEN', 23927),
+(@LOKEN,1,0,"Come, minions! Your master calls!",14,9,100,0,0,0,'LOKEN', 23922),
+(@LOKEN,2,0,"The work of your brothers in the Storm Peaks has reached a frenzied pace. Soon, Father will be freed.",14,9,100,0,0,0,'LOKEN', 23923),
+(@LOKEN,3,0,"Your brothers to the north have subjugated the stone behemoths and set them on the path to Ulduar. Soon, the remaining defenses of the Pantheon will be neutralized.",14,9,100,0,0,0,'LOKEN', 23924),
+(@LOKEN,4,0,"The three fissures opened by the mortals of this region must be silenced. The earth hears and sees what we do and will continue to interfere with our efforts if the way is not closed.",14,9,100,0,0,0,'LOKEN', 23925),
+(@LOKEN,5,0,"Bury this place! Your master demands it!",14,9,100,0,0,0,'LOKEN', 23926),
+(@LOKEN,6,0,"The sound of thunder dissipates.",41,9,100,0,0,0,'LOKEN', 23928),
+(@GOLEM,0,0,"Alert! Alert! Construct senses that enemies have breeched our defenses. Increase pace.",12,9,100,0,0,0,'GOLEM', 23895),
+(@GOLEM,0,1,"Construct class carrier reporting for duty. Primary function: Overseeing.",12,9,100,0,0,0,'GOLEM', 23896),
+(@GOLEM,0,2,"There is nothing to see here. Proceed with your mandated duties.",12,9,100,0,0,0,'GOLEM', 23897),
+(@GOLEM,0,3,"To interfere with construct's function results in termination. Move along.",12,9,100,0,0,0,'GOLEM', 23899),
+(@GOLEM,0,4,"Construct must not be questioned by iron dwarf servant. Commence deconstruction.",12,9,100,0,0,0,'GOLEM', 23900),
+(@GOLEM,0,5,"Construct is not authorized to communicate with lesser beings. Being must double their efforts.",12,9,100,0,0,0,'GOLEM', 23901),
+(@GOLEM,0,6,"Did you lose your wallet? Construct has found wallet with overabundance of currency.",12,9,100,0,0,0,'GOLEM', 23902),
+(@Garde,0,0,"Halt! Identify yourself immediately!",12,9,100,0,0,0,'Garde', 23903),
+(@Garde,0,1,"This section is off-limits!",12,9,100,0,0,0,'Garde', 23904),
+(@Garde,0,2,"I've never seen one of you around here.",12,9,100,0,0,0,'Garde', 23905),
+(@Garde,0,3,"Hold it! Stop!",12,9,100,0,0,0,'Garde', 23906),
+(@Garde,0,4,"Stop!! Stop!!! Scrap metal moves itself now?",12,9,100,0,0,0,'Garde', 23907),
+(@Garde,1,2,"Right... my bad. Now where was I?",12,9,100,0,0,0,'Garde', 23910),
+(@Garde,1,3,"All hail the great creator!",12,9,100,0,0,0,'Garde', 23911),
+(@Garde,1,4,"You're right, of course. Carry on.",12,9,100,0,0,0,'Garde', 23912),
+(@Garde,1,5,"Forgive my insolence!",12,9,100,0,0,0,'Garde', 23913),
+(@Garde,1,6,"We will double our efforts!",12,9,100,0,0,0,'Garde', 23915),
+(@Garde,2,0,"Destroy earthen infestation.",12,9,100,0,0,0,'Garde', 23921),
+(@Garde,2,1,"Wrong answer!",12,9,100,0,0,0,'Garde', 23908),
+(@Ouvrier,0,0,"Halt! Identify yourself immediately!",12,9,100,0,0,0,'Garde', 23903),
+(@Ouvrier,0,1,"This section is off-limits!",12,9,100,0,0,0,'Garde', 23904),
+(@Ouvrier,0,2,"I've never seen one of you around here.",12,9,100,0,0,0,'Garde', 23905),
+(@Ouvrier,0,3,"Hold it! Stop!",12,9,100,0,0,0,'Garde', 23906),
+(@Ouvrier,0,4,"Stop!! Stop!!! Scrap metal moves itself now?",12,9,100,0,0,0,'Garde', 23907),
+(@Ouvrier,1,2,"Right... my bad. Now where was I?",12,9,100,0,0,0,'Garde', 23910),
+(@Ouvrier,1,3,"All hail the great creator!",12,9,100,0,0,0,'Garde', 23911),
+(@Ouvrier,1,4,"You're right, of course. Carry on.",12,9,100,0,0,0,'Garde', 23912),
+(@Ouvrier,1,5,"Forgive my insolence!",12,9,100,0,0,0,'Garde', 23913),
+(@Ouvrier,1,6,"We will double our efforts!",12,9,100,0,0,0,'Garde', 23915),
+(@Ouvrier,2,0,"Destroy earthen infestation.",12,9,100,0,0,0,'Garde', 23921),
+(@Ouvrier,2,1,"Wrong answer!",12,9,100,0,0,0,'Garde', 23908),
+(@Maitre,0,0,"Halt! Identify yourself immediately!",12,9,100,0,0,0,'Garde', 23903),
+(@Maitre,0,1,"This section is off-limits!",12,9,100,0,0,0,'Garde', 23904),
+(@Maitre,0,2,"I've never seen one of you around here.",12,9,100,0,0,0,'Garde', 23905),
+(@Maitre,0,3,"Hold it! Stop!",12,9,100,0,0,0,'Garde', 23906),
+(@Maitre,0,4,"Stop!! Stop!!! Scrap metal moves itself now?",12,9,100,0,0,0,'Garde', 23907),
+(@Maitre,1,2,"Right... my bad. Now where was I?",12,9,100,0,0,0,'Garde', 23910),
+(@Maitre,1,3,"All hail the great creator!",12,9,100,0,0,0,'Garde', 23911),
+(@Maitre,1,4,"You're right, of course. Carry on.",12,9,100,0,0,0,'Garde', 23912),
+(@Maitre,1,5,"Forgive my insolence!",12,9,100,0,0,0,'Garde', 23913),
+(@Maitre,1,6,"We will double our efforts!",12,9,100,0,0,0,'Garde', 23915),
+(@Maitre,2,0,"Destroy earthen infestation.",12,9,100,0,0,0,'Garde', 23921),
+(@Maitre,2,1,"Wrong answer!",12,9,100,0,0,0,'Garde', 23908),
+(@IRONGolem,0,0,"Halt! Identify yourself immediately!",12,9,100,0,0,0,'Garde', 23903),
+(@IRONGolem,0,1,"This section is off-limits!",12,9,100,0,0,0,'Garde', 23904),
+(@IRONGolem,0,2,"I've never seen one of you around here.",12,9,100,0,0,0,'Garde', 23905),
+(@IRONGolem,0,3,"Hold it! Stop!",12,9,100,0,0,0,'Garde', 23906),
+(@IRONGolem,0,4,"Stop!! Stop!!! Scrap metal moves itself now?",12,9,100,0,0,0,'Garde', 23907),
+(@IRONGolem,1,2,"Right... my bad. Now where was I?",12,9,100,0,0,0,'Garde', 23910),
+(@IRONGolem,1,3,"All hail the great creator!",12,9,100,0,0,0,'Garde', 23911),
+(@IRONGolem,1,4,"You're right, of course. Carry on.",12,9,100,0,0,0,'Garde', 23912),
+(@IRONGolem,1,5,"Forgive my insolence!",12,9,100,0,0,0,'Garde', 23913),
+(@IRONGolem,1,6,"We will double our efforts!",12,9,100,0,0,0,'Garde', 23915),
+(@IRONGolem,2,0,"Destroy earthen infestation.",12,9,100,0,0,0,'Garde', 23921),
+(@IRONGolem,2,1,"Wrong answer!",12,9,100,0,0,0,'Garde', 23908),
+(@IRONGolem,3,0,"Continue deconstruction.",12,9,100,0,0,0,'Garde', 23919),
+(@IRONGolem,3,1,"Do not loiter.",12,9,100,0,0,0,'Garde', 23918),
+(@IRONGolem,3,2,"Work must continue. Double your efforts.",12,9,100,0,0,0,'Garde', 23916),
+(@IRONGolem,3,3,"Brontes sees all.",12,9,100,0,0,0,'Garde', 23917),
+(@IRONGolem,3,4,"Reinforcements en route. Function must be unabated.",12,9,100,0,0,0,'Garde', 23920),
+(@IRONGolem,3,5,"Do you bring word from the creator?",12,9,100,0,0,0,'Garde', 23914),
+(@IRONGolem,3,6,"All hail the great creator.",12,9,100,0,0,0,'Garde', 23898);
+
+DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=13 AND `SourceEntry`=44609;
+INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES
+(13, 1, 44609, 0, 31, 3, 24271, 0, 0, '', 'Bluff target'),
+(13, 1, 44609, 1, 31, 3, 23673, 0, 0, '', 'Bluff target'),
+(13, 1, 44609, 2, 31, 3, 23672, 0, 0, '', 'Bluff target'),
+(13, 1, 44609, 3, 31, 3, 23675, 0, 0, '', 'Bluff target');
+
+SET @ID := 9024;
+DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=15 AND `SourceGroup`=@ID AND `SourceEntry`=3;
+INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`ErrorTextId`,`ScriptName`,`Comment`) VALUES
+(15,@ID,3,0,9,11495,0,0,0,'','Show gossip option if player has quest The Delicate Sound of Thunder'),
+(15,@ID,3,1,9,11494,0,0,0,'','Show gossip option if player has quest Lightning Infused Relics');
+
+DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=13 AND `SourceEntry`=44610;
+INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES
+(13, 1, 44610, 0, 31, 3, 24824, 0, 0, '', 'Collect Data target');
+
+DELETE FROM `gameobject` WHERE `guid` in (@GUID+0, @GUID+1, @GUID+2, @GUID+3, @GUID+4, @GUID+5);
+INSERT INTO `gameobject` (`guid`,`id`,`map`,`spawnMask`,`phaseMask`,`position_x`,`position_y`,`position_z`,`orientation`,`rotation0`,`rotation1`,`rotation2`,`rotation3`,`spawntimesecs`,`animprogress`,`state`) VALUES
+(@GUID+0,186959,571,1,1,276.169006, -5755.250000, 268.455994,0,0,0,0,1,120,255,1),
+(@GUID+1,186959,571,1,1,278.528992, -5758.350098, 268.455994,0,0,0,0,1,120,255,1),
+(@GUID+2,186959,571,1,1,280.851990, -5761.399902, 268.455994,0,0,0,0,1,120,255,1),
+(@GUID+3,186959,571,1,1,158.707001, -5823.319824, 7.006820,0,0,0,0,1,120,255,1),
+(@GUID+4,186959,571,1,1,157.201996, -5712.160156, 189.315002,0,0,0,0,1,120,255,1),
+(@GUID+5,186959,571,1,1,255.533997, -5891.359863, 82.992897,0,0,0,0,1,120,255,1);
+
+UPDATE `creature` SET `spawndist`=0, `MovementType`=0 WHERE `id` IN (24828, 24829, 24831, 24832, 24826, 24827);
+
+DELETE FROM `spell_linked_spell` WHERE `spell_trigger` = 44608;
+INSERT INTO `spell_linked_spell` VALUES (44608, 44626, 0, 'Rocket Jump');
diff --git a/sql/updates/world/2015_03_15_01_world.sql b/sql/updates/world/2015_03_15_01_world.sql
new file mode 100644
index 00000000000..3df79d26dad
--- /dev/null
+++ b/sql/updates/world/2015_03_15_01_world.sql
@@ -0,0 +1,32 @@
+-- scriptsupport for questaccept of [Q] Eranikus, Tyrant of the Dream
+-- Malfurion Stormrage SAI
+SET @ENTRY := 15362;
+UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,0,0,1,54,0,100,0,0,0,0,0,83,2,0,0,0,0,0,1,0,0,0,0,0,0,0,"Malfurion Stormrage - On Just Summoned - Remove Npc Flag Questgiver"),
+(@ENTRY,0,1,0,61,0,100,0,0,0,0,0,80,@ENTRY*100+00,2,0,0,0,0,1,0,0,0,0,0,0,0,"Malfurion Stormrage - On Just Summoned - Run Script");
+
+-- Actionlist SAI
+SET @ENTRY := 1536200;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=9;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,9,0,0,0,0,100,0,3000,3000,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,"On Script - Say Line 0"),
+(@ENTRY,9,1,0,0,0,100,0,1500,1500,0,0,5,2,0,0,0,0,0,1,0,0,0,0,0,0,0,"On Script - Play Emote 2"),
+(@ENTRY,9,2,0,0,0,100,0,2000,2000,0,0,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,"On Script - Say Line 1"),
+(@ENTRY,9,3,0,0,0,100,0,1000,1000,0,0,1,2,0,0,0,0,0,1,0,0,0,0,0,0,0,"On Script - Say Line 2"),
+(@ENTRY,9,4,0,0,0,100,0,2000,2000,0,0,1,3,0,0,0,0,0,1,0,0,0,0,0,0,0,"On Script - Say Line 3"),
+(@ENTRY,9,5,0,0,0,100,0,2000,2000,0,0,1,4,0,0,0,0,0,1,0,0,0,0,0,0,0,"On Script - Say Line 4"),
+(@ENTRY,9,6,0,0,0,100,0,0,0,0,0,82,2,0,0,0,0,0,1,0,0,0,0,0,0,0,"On Script - Add Npc Flag Questgiver");
+
+DELETE FROM `creature_text` WHERE `entry`=15362;
+INSERT INTO `creature_text` (`entry`, `groupid`, `id`, `text`, `type`, `language`, `probability`, `emote`, `duration`, `sound`, `BroadcastTextId`, `TextRange`, `comment`) VALUES
+(15362, 0, 0, 'The walls of the chamber tremble. Something is happening...', 16, 0, 100, 0, 0, 0, 11191, 0, 'Malfurion Stormrage'),
+(15362, 1, 0, 'Be steadfast, champion. I know why it is that you are here and I know what it is that you seek. Eranikus will not give up the shard freely. He has been twisted... twisted by the same force that you seek to destroy.', 12, 0, 100, 0, 0, 0, 11193, 0, 'Malfurion Stormrage'),
+(15362, 2, 0, 'Are you really surprised? Is it hard to believe that the power of an Old God could reach even inside the Dream? It is true - Eranikus, Tyrant of the Dream, wages a battle against us all. The Nightmare follows in his wake of destruction.', 12, 0, 100, 0, 0, 0, 11194, 0, 'Malfurion Stormrage'),
+(15362, 3, 0, 'Understand this, Eranikus wants nothing more than to be brought to Azeroth from the Dream. Once he is out, he will stop at nothing to destroy my physical manifestation. This, however, is the only way in which you could recover the scepter shard.', 12, 0, 100, 0, 0, 0, 11195, 0, 'Malfurion Stormrage'),
+(15362, 4, 0, 'You will bring him back into this world, champion.', 12, 0, 100, 0, 0, 0, 11196, 0, 'Malfurion Stormrage');
+
+DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=22 AND `SourceGroup`=1 AND `SourceEntry`=15362;
+INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorType`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES
+(22, 1, 15362, 0, 0, 23, 0, 1477, 0, 0, 0, 0, 0, '', 'Malfurion Stormrage - Only run SAI in the Sunken Temple');
diff --git a/sql/updates/world/2015_03_15_02_world.sql b/sql/updates/world/2015_03_15_02_world.sql
new file mode 100644
index 00000000000..0038b6a8927
--- /dev/null
+++ b/sql/updates/world/2015_03_15_02_world.sql
@@ -0,0 +1,37 @@
+--
+-- William Pestle SAI
+SET @ENTRY := 253;
+UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,0,0,0,20,0,100,0,112,0,0,0,80,@ENTRY*100+00,0,2,0,0,0,1,0,0,0,0,0,0,0,"William Pestle - On Quest 'Collecting Kelp' Finished - Run Script");
+
+-- Actionlist SAI
+SET @ENTRY := 25300;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=9;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,9,0,0,0,0,100,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,"William Pestle - On Script - Say Line 0"),
+(@ENTRY,9,1,0,0,0,100,0,1000,1000,0,0,66,0,0,0,0,0,0,8,0,0,0,0,0,0,1.45219,"William Pestle - On Script - Set Orientation 1,45219"),
+(@ENTRY,9,2,0,0,0,100,0,1000,1000,0,0,5,69,0,0,0,0,0,1,0,0,0,0,0,0,0,"William Pestle - On Script - Play Emote 69"),
+(@ENTRY,9,3,0,0,0,100,0,3000,3000,0,0,66,0,0,0,0,0,0,21,10,0,0,0,0,0,0,"William Pestle - On Script - Set Orientation Closest Player"),
+(@ENTRY,9,4,0,0,0,100,0,1000,1000,0,0,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,"William Pestle - On Script - Say Line 1");
+
+-- Maybell Maclure SAI
+SET @ENTRY := 251;
+UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,0,0,0,20,0,100,0,114,0,0,0,80,@ENTRY*100+00,2,0,0,0,0,1,0,0,0,0,0,0,0,"Maybell Maclure - On Quest 'The Escape' Finished - Run Script");
+
+-- Actionlist SAI
+SET @ENTRY := 25100;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=9;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,9,0,0,0,0,100,0,0,0,0,0,66,0,0,0,0,0,0,8,0,0,0,0,0,0,5.39307,"On Script - Set Orientation 5,39307"),
+(@ENTRY,9,1,0,0,0,100,0,2000,2000,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,"On Script - Say Line 0"),
+(@ENTRY,9,2,0,0,0,100,0,2000,2000,0,0,5,7,0,0,0,0,0,1,0,0,0,0,0,0,0,"On Script - Play Emote 7"),
+(@ENTRY,9,3,0,0,0,100,0,4000,4000,0,0,41,1,0,0,0,0,0,1,0,0,0,0,0,0,0,"On Script - Despawn Instant");
+
+DELETE FROM `creature_text` WHERE `entry`=251;
+INSERT INTO `creature_text` (`entry`, `groupid`, `id`, `text`, `type`, `language`, `probability`, `emote`, `duration`, `sound`, `BroadcastTextId`, `TextRange`, `comment`) VALUES
+(251, 0, 0, 'Here goes nothing...', 12, 0, 100, 0, 0, 0, 1862, 0, 'Maybell Maclure');
diff --git a/sql/updates/world/2015_03_15_03_world.sql b/sql/updates/world/2015_03_15_03_world.sql
new file mode 100644
index 00000000000..b9b4ea7a247
--- /dev/null
+++ b/sql/updates/world/2015_03_15_03_world.sql
@@ -0,0 +1,7 @@
+--
+-- Tortured Skeleton SAI
+SET @ENTRY := 18797;
+UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,0,0,0,4,0,100,0,0,0,0,0,91,7,0,0,0,0,0,1,0,0,0,0,0,0,0,"Tortured Skeleton - On Aggro - Remove Flag Standstate Dead");
diff --git a/sql/updates/world/2015_03_15_04_world.sql b/sql/updates/world/2015_03_15_04_world.sql
new file mode 100644
index 00000000000..b439d0f3a78
--- /dev/null
+++ b/sql/updates/world/2015_03_15_04_world.sql
@@ -0,0 +1,48 @@
+--
+-- Senetil Selarin spawn after completition of quest=995 or quest=994
+UPDATE `creature_template` SET `speed_walk`=1 WHERE `entry`=3694;
+UPDATE `quest_template` SET `PrevQuestId`=0 WHERE `Id`=990;
+-- Terenthis SAI
+SET @ENTRY := 3693;
+UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,0,0,0,20,0,100,0,995,0,0,0,12,3694,6,180000,0,0,0,8,0,0,0,6339.14,341.764,24.3387,0.498114,"Terenthis - On Quest 'Escape Through Stealth' Finished - Summon Creature 'Sentinel Selarin'"),
+(@ENTRY,0,1,0,20,0,100,0,994,0,0,0,12,3694,6,180000,0,0,0,8,0,0,0,6339.14,341.764,24.3387,0.498114,"Terenthis - On Quest 'Escape Through Force' Finished - Summon Creature 'Sentinel Selarin'");
+
+-- Sentinel Selarin SAI
+SET @ENTRY := 3694;
+UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,0,0,2,54,0,100,0,0,0,0,0,53,1,3694,0,0,0,0,1,0,0,0,0,0,0,0,"Sentinel Selarin - On Just Summoned - Start Waypoint"),
+(@ENTRY,0,1,0,40,0,100,0,23,3694,0,0,41,1,0,0,0,0,0,1,0,0,0,0,0,0,0,"Sentinel Selarin - On Waypoint 23 Reached - Despawn Instant"),
+(@ENTRY,0,2,0,61,0,100,0,0,0,0,0,48,1,0,0,0,0,0,1,0,0,0,0,0,0,0,"Sentinel Selarin - On Just Summoned - Set Active On"),
+(@ENTRY,0,3,0,40,0,100,0,1,3694,0,0,54,1000,0,0,0,0,0,1,0,0,0,0,0,0,0,"Sentinel Selarin - On Waypoint 1 Reached - Pause Waypoint"),
+(@ENTRY,0,4,0,40,0,100,0,12,3694,0,0,54,120000,0,0,0,0,0,1,0,0,0,0,0,0,0,"Sentinel Selarin - On Waypoint 12 Reached - Pause Waypoint");
+
+DELETE FROM `waypoints` WHERE `entry`=3694;
+INSERT INTO `waypoints` (`entry`, `pointid`, `position_x`, `position_y`, `position_z`, `point_comment`) VALUES
+(3694, 1, 6339.14,341.764,24.3387, 'Sentinel Selarin'),
+(3694, 2, 6353.39,354.557,22.3779, 'Sentinel Selarin'),
+(3694, 3, 6368.99,357.894,21.5712, 'Sentinel Selarin'),
+(3694, 4, 6387.81,359.455,18.9899, 'Sentinel Selarin'),
+(3694, 5, 6398.12,363.588,17.366, 'Sentinel Selarin'),
+(3694, 6, 6403.68,370.92,15.6815, 'Sentinel Selarin'),
+(3694, 7, 6416.57,392.998,12.0215, 'Sentinel Selarin'),
+(3694, 8, 6424.95,399.193,10.9586, 'Sentinel Selarin'),
+(3694, 9, 6428.93,396.971,11.1736, 'Sentinel Selarin'),
+(3694, 10, 6432,388.708,13.7662, 'Sentinel Selarin'),
+(3694, 11, 6436.71,375.264,13.9403, 'Sentinel Selarin'),
+(3694, 12, 6434.92,367.203,13.9403, 'Sentinel Selarin'),
+(3694, 13, 6436.9,374.833,13.9403, 'Sentinel Selarin'),
+(3694, 14, 6431.63,389.723,13.5875, 'Sentinel Selarin'),
+(3694, 15, 6428.84,397.45,11.0941, 'Sentinel Selarin'),
+(3694, 16, 6424,400.084,10.9784, 'Sentinel Selarin'),
+(3694, 17, 6413.76,392.804,12.2825, 'Sentinel Selarin'),
+(3694, 18, 6401.4,368.195,16.4249, 'Sentinel Selarin'),
+(3694, 19, 6393.69,360.887,18.1549, 'Sentinel Selarin'),
+(3694, 20, 6377.21,357.731,20.6589, 'Sentinel Selarin'),
+(3694, 21, 6358.35,357.353,22.2106, 'Sentinel Selarin'),
+(3694, 22, 6348.45,352.662,22.6056, 'Sentinel Selarin'),
+(3694, 23, 6322.42,326.649,25.3338, 'Sentinel Selarin');
diff --git a/sql/updates/world/2015_03_15_05_world.sql b/sql/updates/world/2015_03_15_05_world.sql
new file mode 100644
index 00000000000..8aed78b7305
--- /dev/null
+++ b/sql/updates/world/2015_03_15_05_world.sql
@@ -0,0 +1,234 @@
+-- Dread Tactician
+-- Pathing for Entry: 16959 'TDB FORMAT'
+SET @NPC := 59170;
+SET @PATH := @NPC * 10;
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=-306.8688,`position_y`=1556.233,`position_z`=41.73843 WHERE `guid`=@NPC;
+DELETE FROM `creature_addon` WHERE `guid`=@NPC;
+INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (@NPC,@PATH,0,0,1,0, '');
+DELETE FROM `waypoint_data` WHERE `id`=@PATH;
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES
+(@PATH,1,-306.8688,1556.233,41.73843,0,0,0,0,100,0),
+(@PATH,2,-303.8688,1555.983,40.73843,0,0,0,0,100,0),
+(@PATH,3,-299.8688,1555.483,40.23843,0,0,0,0,100,0),
+(@PATH,4,-297.8688,1555.233,39.48843,0,0,0,0,100,0),
+(@PATH,5,-295.1188,1554.983,38.73843,0,0,0,0,100,0),
+(@PATH,6,-292.1188,1554.483,38.48843,0,0,0,0,100,0),
+(@PATH,7,-289.1188,1554.233,37.73843,0,0,0,0,100,0),
+(@PATH,8,-287.1188,1553.983,37.23843,0,0,0,0,100,0),
+(@PATH,9,-284.1188,1553.983,36.48843,0,0,0,0,100,0),
+(@PATH,10,-283.8904,1553.79,36.20832,0,0,0,0,100,0),
+(@PATH,11,-281.8904,1553.54,35.95832,0,0,0,0,100,0),
+(@PATH,12,-275.6404,1556.04,35.70832,0,0,0,0,100,0),
+(@PATH,13,-269.0029,1558.513,35.23201,0,0,0,0,100,0),
+(@PATH,14,-270.5029,1562.263,35.98201,0,0,0,0,100,0),
+(@PATH,15,-271.7529,1565.013,36.48201,0,0,0,0,100,0),
+(@PATH,16,-272.7529,1567.513,36.98201,0,0,0,0,100,0),
+(@PATH,17,-274.0029,1570.263,37.73201,0,0,0,0,100,0),
+(@PATH,18,-275.0029,1573.013,38.48201,0,0,0,0,100,0),
+(@PATH,19,-276.4716,1576.198,39.42199,0,0,0,0,100,0),
+(@PATH,20,-278.2216,1576.948,39.92199,0,0,0,0,100,0),
+(@PATH,21,-280.9716,1578.448,40.92199,0,0,0,0,100,0),
+(@PATH,22,-283.7216,1579.698,41.67199,0,0,0,0,100,0),
+(@PATH,23,-285.4716,1580.448,42.17199,0,0,0,0,100,0),
+(@PATH,24,-287.9716,1581.698,42.92199,0,0,0,0,100,0),
+(@PATH,25,-289.7216,1582.448,43.67199,0,0,0,0,100,0),
+(@PATH,26,-291.4716,1583.448,44.42199,0,0,0,0,100,0),
+(@PATH,27,-294.2216,1584.698,45.17199,0,0,0,0,100,0),
+(@PATH,28,-294.3971,1584.785,45.42167,0,0,0,0,100,0),
+(@PATH,29,-295.1471,1585.035,45.42167,0,0,0,0,100,0),
+(@PATH,30,-304.3971,1576.535,45.92167,0,0,0,0,100,0),
+(@PATH,31,-312.2731,1568.967,46.45709,0,0,0,0,100,0),
+(@PATH,32,-318.7731,1561.467,45.70709,0,0,0,0,100,0),
+(@PATH,33,-333.8887,1543.732,45.3224,0,0,0,0,100,0),
+(@PATH,34,-333.6387,1540.732,44.5724,0,0,0,0,100,0),
+(@PATH,35,-333.3887,1538.732,43.8224,0,0,0,0,100,0),
+(@PATH,36,-333.3887,1536.732,43.3224,0,0,0,0,100,0),
+(@PATH,37,-333.1387,1533.732,42.5724,0,0,0,0,100,0),
+(@PATH,38,-332.8887,1531.732,41.8224,0,0,0,0,100,0),
+(@PATH,39,-332.8887,1529.732,41.0724,0,0,0,0,100,0),
+(@PATH,40,-332.6387,1527.732,40.5724,0,0,0,0,100,0),
+(@PATH,41,-332.3887,1525.732,39.8224,0,0,0,0,100,0),
+(@PATH,42,-332.3887,1523.732,39.3224,0,0,0,0,100,0),
+(@PATH,43,-332.1387,1521.982,38.8224,0,0,0,0,100,0),
+(@PATH,44,-331.8887,1518.982,38.3224,0,0,0,0,100,0),
+(@PATH,45,-331.8887,1516.982,37.5724,0,0,0,0,100,0),
+(@PATH,46,-331.8887,1513.982,36.8224,0,0,0,0,100,0),
+(@PATH,47,-331.6387,1510.982,36.3224,0,0,0,0,100,0),
+(@PATH,48,-331.3887,1508.232,35.5724,0,0,0,0,100,0),
+(@PATH,49,-331.1387,1505.232,34.8224,0,0,0,0,100,0),
+(@PATH,50,-330.8887,1502.232,34.3224,0,0,0,0,100,0),
+(@PATH,51,-330.4729,1499.82,33.45189,0,0,0,0,100,0),
+(@PATH,52,-325.4729,1496.82,32.70189,0,0,0,0,100,0),
+(@PATH,53,-320.9729,1494.32,31.95189,0,0,0,0,100,0),
+(@PATH,54,-316.2229,1491.57,31.45189,0,0,0,0,100,0),
+(@PATH,55,-311.7229,1489.07,30.95189,0,0,0,0,100,0),
+(@PATH,56,-307.4729,1486.57,30.20189,0,0,0,0,100,0),
+(@PATH,57,-307.3154,1486.395,29.88731,0,0,0,0,100,0),
+(@PATH,58,-305.8154,1485.645,29.63731,0,0,0,0,100,0),
+(@PATH,59,-299.8154,1485.645,28.88731,0,0,0,0,100,0),
+(@PATH,60,-294.0654,1485.395,28.38731,0,0,0,0,100,0),
+(@PATH,61,-287.0654,1485.395,27.88731,0,0,0,0,100,0),
+(@PATH,62,-281.0654,1485.395,27.38731,0,0,0,0,100,0),
+(@PATH,63,-280.6106,1485.449,27.23963,0,0,0,0,100,0),
+(@PATH,64,-278.6106,1485.199,27.23963,0,0,0,0,100,0),
+(@PATH,65,-270.6106,1498.699,27.48963,0,0,0,0,100,0),
+(@PATH,66,-268.6106,1502.199,27.98963,0,0,0,0,100,0),
+(@PATH,67,-268.5272,1502.318,28.20654,0,0,0,0,100,0),
+(@PATH,68,-267.5272,1503.818,28.20654,0,0,0,0,100,0),
+(@PATH,69,-270.5272,1504.568,28.70654,0,0,0,0,100,0),
+(@PATH,70,-274.2772,1505.568,29.20654,0,0,0,0,100,0),
+(@PATH,71,-278.5582,1506.635,29.73862,0,0,0,0,100,0),
+(@PATH,72,-290.8082,1500.885,30.23862,0,0,0,0,100,0),
+(@PATH,73,-296.4533,1498.203,30.9129,0,0,0,0,100,0),
+(@PATH,74,-300.2033,1498.953,31.4129,0,0,0,0,100,0),
+(@PATH,75,-304.2033,1499.703,31.9129,0,0,0,0,100,0),
+(@PATH,76,-307.9533,1500.453,32.4129,0,0,0,0,100,0),
+(@PATH,77,-313.7033,1501.203,33.1629,0,0,0,0,100,0),
+(@PATH,78,-317.4067,1502.011,33.47455,0,0,0,0,100,0),
+(@PATH,79,-319.6567,1504.011,33.97455,0,0,0,0,100,0),
+(@PATH,80,-322.1567,1506.511,34.47455,0,0,0,0,100,0),
+(@PATH,81,-325.2614,1509.541,35.46749,0,0,0,0,100,0),
+(@PATH,82,-325.7614,1512.541,35.96749,0,0,0,0,100,0),
+(@PATH,83,-326.0114,1515.541,36.71749,0,0,0,0,100,0),
+(@PATH,84,-326.2614,1517.541,37.21749,0,0,0,0,100,0),
+(@PATH,85,-326.2614,1520.541,38.21749,0,0,0,0,100,0),
+(@PATH,86,-326.5114,1522.541,38.71749,0,0,0,0,100,0),
+(@PATH,87,-326.7614,1525.291,39.46749,0,0,0,0,100,0),
+(@PATH,88,-327.0114,1527.291,39.96749,0,0,0,0,100,0),
+(@PATH,89,-327.2614,1529.291,40.71749,0,0,0,0,100,0),
+(@PATH,90,-327.7614,1533.291,41.46749,0,0,0,0,100,0),
+(@PATH,91,-328.0114,1535.041,41.96749,0,0,0,0,100,0),
+(@PATH,92,-328.2614,1538.041,42.71749,0,0,0,0,100,0);
+-- 0x1C39AC4240108FC00000210000037184 .go -306.8688 1556.233 41.73843
+
+
+-- Pathing for Entry: 16959 'TDB FORMAT'
+SET @NPC := 59171;
+SET @PATH := @NPC * 10;
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=-110.5204,`position_y`=1566.893,`position_z`=42.31397 WHERE `guid`=@NPC;
+DELETE FROM `creature_addon` WHERE `guid`=@NPC;
+INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (@NPC,@PATH,0,0,1,0, '');
+DELETE FROM `waypoint_data` WHERE `id`=@PATH;
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES
+(@PATH,1,-110.5204,1566.893,42.31397,0,0,0,0,100,0),
+(@PATH,2,-120.2704,1568.393,41.81397,0,0,0,0,100,0),
+(@PATH,3,-127.0204,1569.893,41.31397,0,0,0,0,100,0),
+(@PATH,4,-134.6927,1571.43,40.71382,0,0,0,0,100,0),
+(@PATH,5,-139.6927,1571.68,40.21382,0,0,0,0,100,0),
+(@PATH,6,-144.6927,1571.93,39.46382,0,0,0,0,100,0),
+(@PATH,7,-149.4427,1572.18,38.71382,0,0,0,0,100,0),
+(@PATH,8,-152.4427,1572.43,38.21382,0,0,0,0,100,0),
+(@PATH,9,-155.4427,1572.68,37.71382,0,0,0,0,100,0),
+(@PATH,10,-158.4427,1572.68,36.96382,0,0,0,0,100,0),
+(@PATH,11,-161.4427,1572.93,36.46382,0,0,0,0,100,0),
+(@PATH,12,-163.4427,1573.18,35.71382,0,0,0,0,100,0),
+(@PATH,13,-163.4854,1573.449,35.89986,0,0,0,0,100,0),
+(@PATH,14,-164.2354,1573.449,35.64986,0,0,0,0,100,0),
+(@PATH,15,-163.9854,1576.449,36.39986,0,0,0,0,100,0),
+(@PATH,16,-163.7824,1580.185,36.84877,0,0,0,0,100,0),
+(@PATH,17,-161.7824,1580.435,37.59877,0,0,0,0,100,0),
+(@PATH,18,-159.0324,1580.935,38.34877,0,0,0,0,100,0),
+(@PATH,19,-155.0324,1581.935,38.84877,0,0,0,0,100,0),
+(@PATH,20,-152.2824,1582.685,39.59877,0,0,0,0,100,0),
+(@PATH,21,-148.5324,1583.435,40.34877,0,0,0,0,100,0),
+(@PATH,22,-145.5324,1584.185,41.09877,0,0,0,0,100,0),
+(@PATH,23,-145.3761,1584.15,41.32778,0,0,0,0,100,0),
+(@PATH,24,-144.1261,1584.4,41.57778,0,0,0,0,100,0),
+(@PATH,25,-139.1261,1583.9,42.32778,0,0,0,0,100,0),
+(@PATH,26,-135.1261,1583.65,43.07778,0,0,0,0,100,0),
+(@PATH,27,-130.1261,1583.15,43.57778,0,0,0,0,100,0),
+(@PATH,28,-126.3761,1582.65,44.07778,0,0,0,0,100,0),
+(@PATH,29,-123.3761,1582.4,44.82778,0,0,0,0,100,0),
+(@PATH,30,-117.3761,1582.15,45.32778,0,0,0,0,100,0),
+(@PATH,31,-113.3761,1581.65,46.07778,0,0,0,0,100,0),
+(@PATH,32,-109.0603,1580.944,46.36949,0,0,0,0,100,0),
+(@PATH,33,-84.0918,1569.51,46.44577,0,0,0,0,100,0),
+(@PATH,34,-82.3418,1566.01,45.44577,0,0,0,0,100,0),
+(@PATH,35,-81.3418,1564.26,44.94577,0,0,0,0,100,0),
+(@PATH,36,-80.0918,1561.51,44.19577,0,0,0,0,100,0),
+(@PATH,37,-79.0918,1559.76,43.69577,0,0,0,0,100,0),
+(@PATH,38,-78.0918,1558.01,42.94577,0,0,0,0,100,0),
+(@PATH,39,-76.5918,1554.76,42.19577,0,0,0,0,100,0),
+(@PATH,40,-75.8418,1553.01,41.69577,0,0,0,0,100,0),
+(@PATH,41,-74.8418,1551.26,41.19577,0,0,0,0,100,0),
+(@PATH,42,-73.3418,1548.51,40.44577,0,0,0,0,100,0),
+(@PATH,43,-72.5918,1546.76,39.94577,0,0,0,0,100,0),
+(@PATH,44,-71.5918,1545.01,39.19577,0,0,0,0,100,0),
+(@PATH,45,-70.3418,1542.26,38.69577,0,0,0,0,100,0),
+(@PATH,46,-70.29829,1541.94,38.42153,0,0,0,0,100,0),
+(@PATH,47,-69.29829,1540.19,37.67153,0,0,0,0,100,0),
+(@PATH,48,-69.54829,1538.19,37.17153,0,0,0,0,100,0),
+(@PATH,49,-70.04829,1535.19,36.17153,0,0,0,0,100,0),
+(@PATH,50,-70.04829,1533.44,35.67153,0,0,0,0,100,0),
+(@PATH,51,-70.54829,1529.44,35.17153,0,0,0,0,100,0),
+(@PATH,52,-71.04829,1525.69,34.42153,0,0,0,0,100,0),
+(@PATH,53,-71.54829,1521.69,33.92153,0,0,0,0,100,0),
+(@PATH,54,-71.54829,1518.69,33.17153,0,0,0,0,100,0),
+(@PATH,55,-72.10271,1515.561,32.53027,0,0,0,0,100,0),
+(@PATH,56,-73.35271,1512.811,31.53027,0,0,0,0,100,0),
+(@PATH,57,-74.35271,1511.061,30.78027,0,0,0,0,100,0),
+(@PATH,58,-75.10271,1509.311,30.28027,0,0,0,0,100,0),
+(@PATH,59,-76.35271,1506.561,29.78027,0,0,0,0,100,0),
+(@PATH,60,-78.10271,1502.811,29.03027,0,0,0,0,100,0),
+(@PATH,61,-79.10271,1500.311,30.03027,0,0,0,0,100,0),
+(@PATH,62,-82.35271,1493.061,29.28027,0,0,0,0,100,0),
+(@PATH,63,-84.10271,1489.561,28.53027,0,0,0,0,100,0),
+(@PATH,64,-84.42598,1489.16,28.3833,0,0,0,0,100,0),
+(@PATH,65,-85.17598,1487.41,28.1333,0,0,0,0,100,0),
+(@PATH,66,-102.3677,1477.751,27.65215,0,0,0,0,100,0),
+(@PATH,67,-123.1177,1477.501,26.90215,0,0,0,0,100,0),
+(@PATH,68,-137.5984,1477.31,26.80837,0,0,0,0,100,0),
+(@PATH,69,-145.5984,1482.56,27.05837,0,0,0,0,100,0),
+(@PATH,70,-153.8199,1488.331,27.38618,0,0,0,0,100,0),
+(@PATH,71,-178.7361,1511.036,27.3082,0,0,0,0,100,0),
+(@PATH,72,-185.2269,1510.27,27.05297,0,0,0,0,100,0),
+(@PATH,73,-182.9769,1508.27,27.05297,0,0,0,0,100,0),
+(@PATH,74,-172.9769,1500.02,26.80297,0,0,0,0,100,0),
+(@PATH,75,-170.7269,1498.27,27.05297,0,0,0,0,100,0),
+(@PATH,76,-169.2269,1496.02,27.05297,0,0,0,0,100,0),
+(@PATH,77,-167.7269,1494.02,26.80297,0,0,0,0,100,0),
+(@PATH,78,-167.7269,1492.02,26.80297,0,0,0,0,100,0),
+(@PATH,79,-167.7269,1489.77,26.80297,0,0,0,0,100,0),
+(@PATH,80,-167.4919,1489.571,26.64043,0,0,0,0,100,0),
+(@PATH,81,-168.4919,1488.071,26.64043,0,0,0,0,100,0),
+(@PATH,82,-158.2419,1482.071,26.14043,0,0,0,0,100,0),
+(@PATH,83,-147.591,1475.386,26.25293,0,0,0,0,100,0),
+(@PATH,84,-139.841,1477.636,27.00293,0,0,0,0,100,0),
+(@PATH,85,-132.341,1479.636,27.25293,0,0,0,0,100,0),
+(@PATH,86,-125.591,1481.386,28.00293,0,0,0,0,100,0),
+(@PATH,87,-121.841,1482.636,28.50293,0,0,0,0,100,0),
+(@PATH,88,-120.2695,1483.081,29.04744,0,0,0,0,100,0),
+(@PATH,89,-118.5195,1484.081,29.54744,0,0,0,0,100,0),
+(@PATH,90,-115.7695,1485.331,30.29744,0,0,0,0,100,0),
+(@PATH,91,-115.0195,1485.831,31.04744,0,0,0,0,100,0),
+(@PATH,92,-113.0195,1486.831,32.04744,0,0,0,0,100,0),
+(@PATH,93,-107.0195,1489.581,31.29744,0,0,0,0,100,0),
+(@PATH,94,-95.5195,1495.331,30.79744,0,0,0,0,100,0),
+(@PATH,95,-95.16714,1495.663,31.08524,0,0,0,0,100,0),
+(@PATH,96,-94.66714,1495.913,31.08524,0,0,0,0,100,0),
+(@PATH,97,-93.66714,1499.913,31.33524,0,0,0,0,100,0),
+(@PATH,98,-92.16714,1506.413,31.83524,0,0,0,0,100,0),
+(@PATH,99,-90.66714,1512.163,32.58524,0,0,0,0,100,0),
+(@PATH,100,-89.91714,1514.913,31.83524,0,0,0,0,100,0),
+(@PATH,101,-89.75613,1515.401,32.07003,0,0,0,0,100,0),
+(@PATH,102,-89.25613,1516.401,31.82003,0,0,0,0,100,0),
+(@PATH,103,-89.25613,1523.401,32.57003,0,0,0,0,100,0),
+(@PATH,104,-89.25613,1524.401,33.32003,0,0,0,0,100,0),
+(@PATH,105,-89.25613,1525.401,34.07003,0,0,0,0,100,0),
+(@PATH,106,-89.00613,1526.401,34.57003,0,0,0,0,100,0),
+(@PATH,107,-89.00613,1528.401,35.82003,0,0,0,0,100,0),
+(@PATH,108,-89.00613,1529.401,36.07003,0,0,0,0,100,0),
+(@PATH,109,-88.75613,1533.151,36.82003,0,0,0,0,100,0),
+(@PATH,110,-88.75613,1535.151,37.32003,0,0,0,0,100,0),
+(@PATH,111,-88.50613,1538.151,38.07003,0,0,0,0,100,0),
+(@PATH,112,-88.50613,1541.151,38.82003,0,0,0,0,100,0),
+(@PATH,113,-88.25613,1544.151,39.57003,0,0,0,0,100,0),
+(@PATH,114,-88.1545,1544.429,39.72079,0,0,0,0,100,0),
+(@PATH,115,-88.1545,1545.429,39.97079,0,0,0,0,100,0),
+(@PATH,116,-91.1545,1548.179,40.47079,0,0,0,0,100,0),
+(@PATH,117,-94.6545,1551.679,40.97079,0,0,0,0,100,0),
+(@PATH,118,-99.4045,1556.429,41.72079,0,0,0,0,100,0),
+(@PATH,119,-110.481,1566.873,42.2832,0,0,0,0,100,0),
+(@PATH,120,-120.231,1568.623,41.7832,0,0,0,0,100,0),
+(@PATH,121,-126.981,1569.873,41.2832,0,0,0,0,100,0);
+-- 0x1C39AC4240108FC000002100007FC923 .go -110.5204 1566.893 42.31397
diff --git a/sql/updates/world/2015_03_15_06_world.sql b/sql/updates/world/2015_03_15_06_world.sql
new file mode 100644
index 00000000000..4fc3ab011ab
--- /dev/null
+++ b/sql/updates/world/2015_03_15_06_world.sql
@@ -0,0 +1,24 @@
+--
+DELETE FROM `event_scripts` WHERE `id`=2313;
+INSERT INTO `event_scripts` (`id`, `delay`, `command`, `datalong`, `datalong2`, `dataint`, `x`, `y`, `z`, `o`) VALUES
+(2313, 0, 10, 7411, 3000000, 0, 9639.5,2528.97,1331.72,5.28395);
+
+-- Spirit of Sathrah SAI
+SET @ENTRY := 7411;
+UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,0,0,0,54,0,100,0,0,0,0,0,53,0,7411,0,0,0,0,1,0,0,0,0,0,0,0,"Spirit of Sathrah - On Just Summoned - Start Waypoint"),
+(@ENTRY,0,1,0,40,0,100,0,9,7411,0,0,41,3000,0,0,0,0,0,1,0,0,0,0,0,0,0,"Spirit of Sathrah - On Waypoint 9 Reached - Despawn In 3000 ms");
+
+DELETE FROM `waypoints` WHERE `entry`=7411;
+INSERT INTO `waypoints` (`entry`, `pointid`, `position_x`, `position_y`, `position_z`, `point_comment`) VALUES
+(7411, 1, 9642.47,2523.25,1331.54, 'Spirit of Sathrah'),
+(7411, 2, 9640.32,2517.43,1331.57, 'Spirit of Sathrah'),
+(7411, 3, 9635.62,2514.35,1331.4, 'Spirit of Sathrah'),
+(7411, 4, 9630.91,2515.59,1331.72, 'Spirit of Sathrah'),
+(7411, 5, 9626.52,2520.1,1331.73, 'Spirit of Sathrah'),
+(7411, 6, 9625.02,2526.36,1331.61, 'Spirit of Sathrah'),
+(7411, 7, 9630.56,2532.58,1331.39, 'Spirit of Sathrah'),
+(7411, 8, 9636.59,2532.65,1331.73, 'Spirit of Sathrah'),
+(7411, 9, 9640.05,2529.06,1331.77, 'Spirit of Sathrah');
diff --git a/sql/updates/world/2015_03_15_07_world.sql b/sql/updates/world/2015_03_15_07_world.sql
new file mode 100644
index 00000000000..64f813d2c59
--- /dev/null
+++ b/sql/updates/world/2015_03_15_07_world.sql
@@ -0,0 +1,29 @@
+--
+-- Portal Burn Action
+-- Portal Kruul SAI
+SET @ENTRY := 184289;
+UPDATE `gameobject_template` SET `AIName`="SmartGameObjectAI" WHERE `entry`=@ENTRY;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=1;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,1,0,0,70,0,100,0,2,0,0,0,50,183816,30,0,0,0,0,8,0,0,0,147.0184, 1717.341, 37.46404,0,"Portal Kruul - On Gameobject State Changed - Summon Gameobject 'Hellfire Fire'");
+
+-- Portal Xilus SAI
+SET @ENTRY := 184290;
+UPDATE `gameobject_template` SET `AIName`="SmartGameObjectAI" WHERE `entry`=@ENTRY;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=1;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,1,0,0,70,0,100,0,2,0,0,0,50,183816,30,0,0,0,0,8,0,0,0,-84.5415, 1881.739, 73.82645,5.782852,"Portal Xilus - On Gameobject State Changed - Summon Gameobject 'Hellfire Fire'");
+
+-- Portal Grimh SAI
+SET @ENTRY := 184414;
+UPDATE `gameobject_template` SET `AIName`="SmartGameObjectAI" WHERE `entry`=@ENTRY;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=1;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,1,0,0,70,0,100,0,2,0,0,0,50,183816,30,0,0,0,0,8,0,0,0,-418.627, 1847.49, 80.7808,0,"Portal Grimh - On Gameobject State Changed - Summon Gameobject 'Hellfire Fire'");
+
+-- Portal Kaalez SAI
+SET @ENTRY := 184415;
+UPDATE `gameobject_template` SET `AIName`="SmartGameObjectAI" WHERE `entry`=@ENTRY;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=1;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,1,0,0,70,0,100,0,2,0,0,0,50,183816,30,0,0,0,0,8,0,0,0,-545.2587, 1781.167, 56.22634,0,"Portal Kaalez - On Gameobject State Changed - Summon Gameobject 'Hellfire Fire'");
diff --git a/sql/updates/world/2015_03_15_08_world.sql b/sql/updates/world/2015_03_15_08_world.sql
new file mode 100644
index 00000000000..e7acf61bbd6
--- /dev/null
+++ b/sql/updates/world/2015_03_15_08_world.sql
@@ -0,0 +1,81 @@
+--
+-- Pathing for Entry: 22410 'TDB FORMAT'
+SET @NPC := 78754;
+SET @PATH := @NPC * 10;
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=3009.127,`position_y`=5920.842,`position_z`=130.9854 WHERE `guid`=@NPC;
+DELETE FROM `creature_addon` WHERE `guid`=@NPC;
+INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (@NPC,@PATH,14332,0,4097,0, '');
+DELETE FROM `waypoint_data` WHERE `id`=@PATH;
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES
+(@PATH,1,3009.127,5920.842,130.9854,0,0,1,0,100,0),
+(@PATH,2,3018.56,5944.067,131.0012,0,0,1,0,100,0),
+(@PATH,3,3028.687,5971.723,131.0047,0,0,1,0,100,0),
+(@PATH,4,3039.209,5998.325,130.9491,0,0,1,0,100,0),
+(@PATH,5,3041.459,6004.325,130.9491,0,0,1,0,100,0),
+(@PATH,6,3042.709,6007.575,130.9491,0,0,1,0,100,0),
+(@PATH,7,3043.459,6009.825,130.9491,0,0,1,0,100,0),
+(@PATH,8,3048.21,6021.786,130.8358,0,0,1,0,100,0),
+(@PATH,9,3058.211,6046.689,130.7168,0,0,1,0,100,0),
+(@PATH,10,3065.155,6064.995,130.614,0,0,1,0,100,0),
+(@PATH,11,3078.91,6073.112,130.3709,0,0,1,0,100,0),
+(@PATH,12,3084.571,6056.194,130.4195,0,0,1,0,100,0),
+(@PATH,13,3079.821,6040.444,130.6695,0,0,1,0,100,0),
+(@PATH,14,3079.655,6040.126,130.764,0,0,1,0,100,0),
+(@PATH,15,3079.405,6039.626,130.764,0,0,1,0,100,0),
+(@PATH,16,3078.905,6038.126,130.764,0,0,1,0,100,0),
+(@PATH,17,3069.25,6014.667,130.9082,0,0,1,0,100,0),
+(@PATH,18,3064,6000.667,130.9082,0,0,1,0,100,0),
+(@PATH,19,3060.452,5991.971,130.99,0,0,1,0,100,0),
+(@PATH,20,3050.27,5967.535,130.9908,0,0,1,0,100,0),
+(@PATH,21,3045.52,5954.535,130.9908,0,0,1,0,100,0),
+(@PATH,22,3039.294,5938.282,130.9514,0,0,1,0,100,0),
+(@PATH,23,3028.456,5913.517,130.8795,0,0,1,0,100,0),
+(@PATH,24,3019.764,5891.665,130.7868,0,0,1,0,100,0),
+(@PATH,25,3016.764,5884.415,130.7868,0,0,1,0,100,0),
+(@PATH,26,3012.264,5873.915,130.7868,0,0,1,0,100,0),
+(@PATH,27,3009.264,5866.915,130.7868,0,0,1,0,100,0),
+(@PATH,28,3012.196,5873.788,130.7515,0,0,1,0,100,0),
+(@PATH,29,3008.946,5866.788,130.7515,0,0,1,0,100,0),
+(@PATH,30,3008.446,5865.038,130.7515,0,0,1,0,100,0),
+(@PATH,31,2995.446,5836.038,130.5015,0,0,1,0,100,0),
+(@PATH,32,2995.104,5835.657,130.3808,0,0,1,0,100,0),
+(@PATH,33,2991.854,5828.407,130.6308,0,0,1,0,100,0),
+(@PATH,34,2990.604,5827.907,130.3808,0,0,1,0,100,0),
+(@PATH,35,2976.186,5821.571,130.1743,0,0,1,0,100,0),
+(@PATH,36,2970.518,5837.316,130.481,0,0,1,0,100,0),
+(@PATH,37,2971.768,5840.066,130.481,0,0,1,0,100,0),
+(@PATH,38,2980.487,5859.262,131.0515,0,0,1,0,100,0),
+(@PATH,39,2983.987,5866.762,131.0515,0,0,1,0,100,0),
+(@PATH,40,2989.237,5876.512,131.3015,0,0,1,0,100,0);
+-- 0x1C3998424015E28000002300007FC920 .go 3009.127 5920.842 130.9854
+
+DELETE FROM `creature_formations` WHERE `leaderGUID`=78754;
+INSERT INTO `creature_formations` (`leaderGUID`, `memberGUID`, `dist`, `angle`, `groupAI`, `point_1`, `point_2`) VALUES
+(78754, 78754, 0, 0, 2, 0, 0),
+(78754, 78755, 7, 0, 0, 0, 0);
+
+-- Expedition Warden SAI
+SET @GUID := -63549;
+UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=17855;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@GUID AND `source_type`=0;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@GUID,0,0,0,1,0,100,0,100,200,5000,10000,5,1,0,0,0,0,0,1,0,0,0,0,0,0,0,"Expedition Warden - Out of Combat - Play Emote 1");
+
+-- Expedition Warden SAI
+SET @GUID := -63548;
+UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=17855;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@GUID AND `source_type`=0;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@GUID,0,0,0,1,0,100,0,100,200,10000,40000,5,1,0,0,0,0,0,1,0,0,0,0,0,0,0,"Expedition Warden - Out of Combat - Play Emote 1");
+
+-- Pathing for Entry: 17855 'TDB FORMAT'
+SET @NPC := 63550;
+SET @PATH := @NPC * 10;
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=3022.651,`position_y`=5963.609,`position_z`=130.7766 WHERE `guid`=@NPC;
+DELETE FROM `creature_addon` WHERE `guid`=@NPC;
+INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (@NPC,@PATH,0,0,1,0, '');
+DELETE FROM `waypoint_data` WHERE `id`=@PATH;
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES
+(@PATH,1,3022.651,5963.609,130.7766,0,6000,0,0,100,0),
+(@PATH,2,3032.096,5959.558,130.6869,0,6000,0,0,100,0);
+-- 0x1C39984240116FC000002300027FC920 .go 3022.651 5963.609 130.7766
diff --git a/sql/updates/world/2015_03_15_09_world.sql b/sql/updates/world/2015_03_15_09_world.sql
new file mode 100644
index 00000000000..cb453b9b4a6
--- /dev/null
+++ b/sql/updates/world/2015_03_15_09_world.sql
@@ -0,0 +1,59 @@
+--
+-- Pathing for Entry: 2802 'TDB FORMAT'
+SET @NPC := 38101;
+SET @PATH := @NPC * 10;
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=1442.487,`position_y`=36.32697,`position_z`=-62.02626 WHERE `guid`=@NPC;
+DELETE FROM `creature_addon` WHERE `guid`=@NPC;
+INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (@NPC,@PATH,0,0,1,0, '');
+DELETE FROM `waypoint_data` WHERE `id`=@PATH;
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES
+(@PATH,1,1442.487,36.32697,-62.02626,0,0,0,0,100,0),
+(@PATH,2,1435.487,32.07697,-62.02626,0,0,0,0,100,0),
+(@PATH,3,1416.445,21.46703,-62.02588,0,0,0,0,100,0),
+(@PATH,4,1405.551,23.91475,-62.0261,0,0,0,0,100,0),
+(@PATH,5,1402.301,26.41475,-62.0261,0,0,0,0,100,0),
+(@PATH,6,1387.127,36.88569,-62.02647,0,0,0,0,100,0),
+(@PATH,7,1381.627,49.88569,-62.02647,0,0,0,0,100,0),
+(@PATH,8,1379.005,56.32278,-62.02669,0,0,0,0,100,0),
+(@PATH,9,1379.755,60.82278,-62.02669,0,0,0,0,100,0),
+(@PATH,10,1383.399,83.51677,-62.03289,0,0,0,0,100,0),
+(@PATH,11,1388.399,87.51677,-62.03289,0,0,0,0,100,0),
+(@PATH,12,1395.899,94.01677,-62.28289,0,0,0,0,100,0),
+(@PATH,13,1400.163,97.49232,-62.05746,0,0,0,0,100,0),
+(@PATH,14,1412.663,127.9923,-62.05746,0,0,0,0,100,0),
+(@PATH,15,1413.663,130.2423,-62.05746,0,0,0,0,100,0),
+(@PATH,16,1415.163,134.2423,-62.05746,0,0,0,0,100,0),
+(@PATH,17,1418.154,141.2391,-62.04066,0,0,0,0,100,0),
+(@PATH,18,1423.404,143.7391,-62.04066,0,0,0,0,100,0),
+(@PATH,19,1434.169,149.9652,-62.03992,0,0,0,0,100,0),
+(@PATH,20,1435.669,148.4652,-62.03992,0,0,0,0,100,0),
+(@PATH,21,1445.419,139.4652,-62.03992,0,0,0,0,100,0),
+(@PATH,22,1447.836,137.2073,-61.75176,0,0,0,0,100,0),
+(@PATH,23,1450.836,133.7073,-61.75176,0,0,0,0,100,0),
+(@PATH,24,1452.086,132.4573,-61.75176,0,0,0,0,100,0),
+(@PATH,25,1453.836,130.4573,-60.00176,0,0,0,0,100,0),
+(@PATH,26,1456.336,127.4573,-60.00176,0,0,0,0,100,0),
+(@PATH,27,1462.008,120.8724,-59.94119,0,0,0,0,100,0),
+(@PATH,28,1465.152,111.2505,-59.94151,0,0,0,0,100,0),
+(@PATH,29,1471.402,105.7505,-59.94151,0,0,0,0,100,0),
+(@PATH,30,1479.847,98.11646,-59.9706,0,0,0,0,100,0),
+(@PATH,31,1480.847,97.36646,-59.9706,0,0,0,0,100,0),
+(@PATH,32,1482.847,96.11646,-61.4706,0,0,0,0,100,0),
+(@PATH,33,1484.347,95.11646,-61.7206,0,0,0,0,100,0),
+(@PATH,34,1483.158,95.78064,-61.62843,0,0,0,0,100,0),
+(@PATH,35,1484.658,94.78064,-61.87843,0,0,0,0,100,0),
+(@PATH,36,1485.158,94.53064,-61.87843,0,0,0,0,100,0),
+(@PATH,37,1489.658,90.78064,-61.87843,0,0,0,0,100,0),
+(@PATH,38,1499.658,82.28064,-61.87843,0,0,0,0,100,0),
+(@PATH,39,1499.686,82.06802,-62.047,0,0,0,0,100,0),
+(@PATH,40,1500.436,81.31802,-62.047,0,0,0,0,100,0),
+(@PATH,41,1494.936,71.31802,-62.047,0,0,0,0,100,0),
+(@PATH,42,1481.826,47.66472,-62.03592,0,0,0,0,100,0),
+(@PATH,43,1469.576,44.16472,-62.03592,0,0,0,0,100,0),
+(@PATH,44,1466.576,43.41472,-62.03592,0,0,0,0,100,0),
+(@PATH,45,1464.826,42.91472,-62.03592,0,0,0,0,100,0),
+(@PATH,46,1452.326,39.16472,-62.03592,0,0,0,0,100,0),
+(@PATH,47,1442.51,36.29097,-62.02619,0,0,0,0,100,0),
+(@PATH,48,1435.51,32.29097,-62.02619,0,0,0,0,100,0),
+(@PATH,49,1416.5,21.42531,-62.02593,0,0,0,0,100,0);
+-- 0x1C191C000002BC80000028000002D330 .go 1442.487 36.32697 -62.02626
diff --git a/sql/updates/world/2015_03_15_10_world.sql b/sql/updates/world/2015_03_15_10_world.sql
new file mode 100644
index 00000000000..b639c813766
--- /dev/null
+++ b/sql/updates/world/2015_03_15_10_world.sql
@@ -0,0 +1,3 @@
+--
+DELETE FROM `gossip_menu` WHERE `entry`=5004;
+INSERT INTO `gossip_menu` (`entry`, `text_id`) VALUES (5004, 6062);
diff --git a/sql/updates/world/2015_03_15_11_world.sql b/sql/updates/world/2015_03_15_11_world.sql
new file mode 100644
index 00000000000..3330613ef6c
--- /dev/null
+++ b/sql/updates/world/2015_03_15_11_world.sql
@@ -0,0 +1,8 @@
+--
+-- Scarlet Initiate SAI
+SET @ENTRY := 1507;
+UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,0,7,0,0,0,100,0,0,0,3500,5000,11,20793,64,0,0,0,0,2,0,0,0,0,0,0,0,"Scarlet Initiate - In Combat - Cast 'Fireball'"),
+(@ENTRY,0,10,0,23,0,100,0,12544,0,5000,10000,11,12544,0,0,0,0,0,1,0,0,0,0,0,0,0,"Scarlet Initiate - On Has Aura 'Frost Armor' - Cast 'Frost Armor'");
diff --git a/sql/updates/world/2015_03_15_12_world.sql b/sql/updates/world/2015_03_15_12_world.sql
new file mode 100644
index 00000000000..7eb2c704211
--- /dev/null
+++ b/sql/updates/world/2015_03_15_12_world.sql
@@ -0,0 +1,13 @@
+--
+-- Keryn Sylvius SAI
+SET @ENTRY := 917;
+UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,0,0,0,62,0,100,0,381,4,0,0,11,21100,0,0,0,0,0,7,0,0,0,0,0,0,0,"Keryn Sylvius - On Gossip Option 4 Selected - Cast 'Conjure Elegant Letter'");
+
+DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=15 AND `SourceGroup`=381 AND `SourceEntry`=4;
+INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorType`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES
+(15, 381, 4, 0, 0, 15, 0, 8, 0, 0, 0, 0, 0, '', 'Show gossip text if player is a rogue'),
+(15, 381, 4, 0, 0, 27, 0, 24, 3, 0, 0, 0, 0, '', 'Show gossip text if level >= 24'),
+(15, 381, 4, 0, 0, 2, 0, 17126, 1, 0, 1, 0, 0, '', 'Show gossip option if player does not have Elegant Letter');
diff --git a/sql/updates/world/2015_03_15_13_world.sql b/sql/updates/world/2015_03_15_13_world.sql
new file mode 100644
index 00000000000..f88dd641542
--- /dev/null
+++ b/sql/updates/world/2015_03_15_13_world.sql
@@ -0,0 +1,153 @@
+-- A Crew Under Fire
+UPDATE `creature_template` SET `ScriptName`='' WHERE `entry`=8380;
+UPDATE `quest_template` SET `SpecialFlags`=2 WHERE `Id`=3382;
+UPDATE `creature_template` SET `ScriptName`='' WHERE `entry` IN (12205, 12204);
+UPDATE `creature` SET orientation = 2.43043 WHERE guid = 35899;
+
+-- Captain Vanessa Beltis SAI
+SET @ENTRY := 8380;
+UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,0,0,1,19,0,100,0,3382,0,0,0,80,@ENTRY*100+00,2,0,0,0,0,1,0,0,0,0,0,0,0,"Captain Vanessa Beltis - On Quest 'A Crew Under Fire' Taken - Run Script"),
+(@ENTRY,0,1,4,61,0,100,0,3382,0,0,0,2,250,0,0,0,0,0,1,0,0,0,0,0,0,0,"Captain Vanessa Beltis - On Quest 'A Crew Under Fire' Taken - Set Faction 250"),
+(@ENTRY,0,2,5,11,0,100,0,0,0,0,0,2,35,0,0,0,0,0,1,0,0,0,0,0,0,0,"Captain Vanessa Beltis - On Respawn - Set Faction 35"),
+(@ENTRY,0,3,0,6,0,100,0,0,0,0,0,6,3382,0,0,0,0,0,17,0,50,0,0,0,0,0,"Captain Vanessa Beltis - On Just Died - Fail Quest 'A Crew Under Fire'"),
+(@ENTRY,0,4,0,61,0,100,0,3382,0,0,0,82,0,0,0,0,0,0,1,0,0,0,0,0,0,0,"Captain Vanessa Beltis - On Quest 'A Crew Under Fire' Taken - Add Npc Flag "),
+(@ENTRY,0,5,0,61,0,100,0,0,0,0,0,82,3,0,0,0,0,0,1,0,0,0,0,0,0,0,"Captain Vanessa Beltis - On Respawn - Add Npc Flags Gossip & Questgiver");
+
+-- Spitelash Witch SAI
+SET @ENTRY := 12205;
+UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,0,0,0,8,0,100,0,118,0,8000,8000,80,@ENTRY*100+00,2,0,0,0,0,1,0,0,0,0,0,0,0,"Spitelash Witch - On Spellhit 'Polymorph' - Run Script"),
+(@ENTRY,0,1,0,8,0,100,0,12824,0,8000,8000,80,@ENTRY*100+00,2,0,0,0,0,1,0,0,0,0,0,0,0,"Spitelash Witch - On Spellhit 'Polymorph' - Run Script"),
+(@ENTRY,0,2,0,8,0,100,0,12825,0,8000,8000,80,@ENTRY*100+00,2,0,0,0,0,1,0,0,0,0,0,0,0,"Spitelash Witch - On Spellhit 'Polymorph' - Run Script"),
+(@ENTRY,0,3,0,8,0,100,0,12826,0,8000,8000,80,@ENTRY*100+00,2,0,0,0,0,1,0,0,0,0,0,0,0,"Spitelash Witch - On Spellhit 'Polymorph' - Run Script"),
+(@ENTRY,0,4,0,54,0,100,0,0,0,0,0,53,1,12205,0,0,0,2,1,0,0,0,0,0,0,0,"Spitelash Witch - On Just Summoned - Start Waypoint"),
+(@ENTRY,0,5,0,1,0,100,0,1000,1000,60000,60000,11,12550,2,0,0,0,0,1,0,0,0,0,0,0,0,"Spitelash Witch - Out of Combat - Cast 'Lightning Shield'"),
+(@ENTRY,0,6,0,0,0,100,0,2000,2000,4000,5000,11,9672,0,0,0,0,0,2,0,0,0,0,0,0,0,"Spitelash Witch - In Combat - Cast 'Frostbolt'");
+
+DELETE FROM `waypoints` WHERE `entry`=12205;
+INSERT INTO `waypoints` (`entry`, `pointid`, `position_x`, `position_y`, `position_z`, `point_comment`) VALUES
+(12205, 1, 2370.83,-5893.06,10.6607, 'Spitelash Witch'),
+(12205, 2, 2377.23,-5904.07,11.067, 'Spitelash Witch'),
+(12205, 3, 2378.04,-5915.15,10.7378, 'Spitelash Witch'),
+(12205, 4, 2374.96,-5932,9.66682, 'Spitelash Witch'),
+(12205, 5, 2374.06,-5963.62,9.89577, 'Spitelash Witch');
+
+-- Spitelash Raider SAI
+SET @ENTRY := 12204;
+UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,0,0,0,8,0,100,0,118,0,8000,8000,80,@ENTRY*100+00,2,0,0,0,0,1,0,0,0,0,0,0,0,"Spitelash Raider - On Spellhit 'Polymorph' - Run Script"),
+(@ENTRY,0,1,0,8,0,100,0,12824,0,8000,8000,80,@ENTRY*100+00,2,0,0,0,0,1,0,0,0,0,0,0,0,"Spitelash Raider - On Spellhit 'Polymorph' - Run Script"),
+(@ENTRY,0,2,0,8,0,100,0,12825,0,8000,8000,80,@ENTRY*100+00,2,0,0,0,0,1,0,0,0,0,0,0,0,"Spitelash Raider - On Spellhit 'Polymorph' - Run Script"),
+(@ENTRY,0,3,0,8,0,100,0,12826,0,8000,8000,80,@ENTRY*100+00,2,0,0,0,0,1,0,0,0,0,0,0,0,"Spitelash Raider - On Spellhit 'Polymorph' - Run Script"),
+(@ENTRY,0,4,0,54,0,100,0,0,0,0,0,53,1,12204,0,0,0,2,1,0,0,0,0,0,0,0,"Spitelash Raider - On Just Summoned - Start Waypoint"),
+(@ENTRY,0,5,0,0,0,100,0,40,1000,6500,9000,11,12545,0,0,0,0,0,2,0,0,0,0,0,0,0,"Spitelash Raider - In Combat - Cast 'Spitelash'"),
+(@ENTRY,0,6,0,0,0,100,0,1000,2500,11000,15000,11,12548,0,0,0,0,0,2,0,0,0,0,0,0,0,"Spitelash Raider - In Combat - Cast 'Frost Shock'");
+
+DELETE FROM `waypoints` WHERE `entry`=12204;
+INSERT INTO `waypoints` (`entry`, `pointid`, `position_x`, `position_y`, `position_z`, `point_comment`) VALUES
+(12204, 1, 2370.83,-5893.06,10.6607, 'Spitelash Raider'),
+(12204, 2, 2379.97,-5904.9,10.7712, 'Spitelash Raider'),
+(12204, 3, 2376.15,-5924.8,9.84824, 'Spitelash Raider'),
+(12204, 4, 2373.41,-5962.79,9.70075, 'Spitelash Raider');
+
+-- Actionlist SAI
+SET @ENTRY := 1220500;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=9;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,9,0,0,0,0,100,0,0,0,0,0,11,29124,0,0,0,0,0,1,0,0,0,0,0,0,0,"On Script - Cast 'Polymorph'"),
+(@ENTRY,9,1,0,0,0,100,0,5000,5000,0,0,11,28406,0,0,0,0,0,1,0,0,0,0,0,0,0,"On Script - Cast 'Polymorph Backfire'"),
+(@ENTRY,9,2,0,0,0,100,0,0,0,0,0,11,6924,0,0,0,0,0,1,0,0,0,0,0,0,0,"On Script - Cast 'Remove Polymorph'"),
+(@ENTRY,9,3,0,0,0,100,0,1000,1000,0,0,41,1,0,0,0,0,0,1,0,0,0,0,0,0,0,"On Script - Despawn Instant");
+
+-- Actionlist SAI
+SET @ENTRY := 838000;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=9;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,9,0,0,0,0,100,0,0,0,0,0,48,1,0,0,0,0,0,1,0,0,0,0,0,0,0,"Captain Vanessa Beltis - On Script - Set Active On"),
+(@ENTRY,9,1,0,0,0,100,0,1000,1000,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,"Captain Vanessa Beltis - On Script - Say Line 0"),
+(@ENTRY,9,2,0,0,0,100,0,0,0,0,0,45,1,1,0,0,0,0,9,0,0,50,0,0,0,0,"Captain Vanessa Beltis - On Script - Set Data 1 1"),
+-- 1. wave
+(@ENTRY,9,3,0,0,0,100,0,4000,4000,0,0,12,12205,6,300000,0,0,0,8,0,0,0,2370.83,-5893.06,-5893.06,5.45564,"Captain Vanessa Beltis - On Script - Summon Creature 'Spitelash Witch'"),
+(@ENTRY,9,4,0,0,0,100,0,0,0,0,0,12,12204,6,300000,0,0,0,8,0,0,0,2367.58,-5889.81,11.3931,5.36209,"Captain Vanessa Beltis - On Script - Summon Creature 'Spitelash Raider'"),
+(@ENTRY,9,5,0,0,0,100,0,0,0,0,0,12,12204,6,300000,0,0,0,8,0,0,0,2369.53,-5888.84,11.2888,5.23643,"Captain Vanessa Beltis - On Script - Summon Creature 'Spitelash Raider'"),
+(@ENTRY,9,6,0,0,0,100,0,0,0,0,0,12,12204,6,300000,0,0,0,8,0,0,0,2366.15,-5891.65,11.72,5.46812,"Captain Vanessa Beltis - On Script - Summon Creature 'Spitelash Raider'"),
+-- 2nd wave
+(@ENTRY,9,7,0,0,0,100,0,50000,50000,0,0,12,12204,6,300000,0,0,0,8,0,0,0,2370.83,-5893.06,10.6607,5.45564,"Captain Vanessa Beltis - On Script - Summon Creature 'Spitelash Raider'"),
+(@ENTRY,9,8,0,0,0,100,0,1000,1000,0,0,12,12204,6,300000,0,0,0,8,0,0,0,2367.58,-5889.81,11.3931,5.36209,"Captain Vanessa Beltis - On Script - Summon Creature 'Spitelash Raider'"),
+(@ENTRY,9,9,0,0,0,100,0,0,0,0,0,12,12205,6,300000,0,0,0,8,0,0,0,2369.53,-5888.84,11.2888,5.23643,"Captain Vanessa Beltis - On Script - Summon Creature 'Spitelash Witch'"),
+(@ENTRY,9,10,0,0,0,100,0,1000,1000,0,0,12,12204,6,300000,0,0,0,8,0,0,0,2366.15,-5891.65,11.72,5.46812,"Captain Vanessa Beltis - On Script - Summon Creature 'Spitelash Raider'"),
+-- 3. wave
+(@ENTRY,9,11,0,0,0,100,0,52000,52000,0,0,12,12204,6,300000,0,0,0,8,0,0,0,2370.83,-5893.06,10.6607,5.45564,"Captain Vanessa Beltis - On Script - Summon Creature 'Spitelash Raider'"),
+(@ENTRY,9,12,0,0,0,100,0,1000,1000,0,0,12,12205,6,300000,0,0,0,8,0,0,0,2367.58,-5889.81,11.3931,5.36209,"Captain Vanessa Beltis - On Script - Summon Creature 'Spitelash Witch'"),
+(@ENTRY,9,13,0,0,0,100,0,0,0,0,0,12,12204,6,300000,0,0,0,8,0,0,0,2369.53,-5888.84,11.2888,5.23643,"Captain Vanessa Beltis - On Script - Summon Creature 'Spitelash Raider'"),
+(@ENTRY,9,14,0,0,0,100,0,0,0,0,0,12,12204,6,300000,0,0,0,8,0,0,0,2366.15,-5891.65,11.72,5.46812,"Captain Vanessa Beltis - On Script - Summon Creature 'Spitelash Raider'"),
+-- 4. wave
+(@ENTRY,9,15,0,0,0,100,0,54000,54000,0,0,12,12204,6,300000,0,0,0,8,0,0,0,2370.83,-5893.06,10.6607,5.45564,"Captain Vanessa Beltis - On Script - Summon Creature 'Spitelash Raider'"),
+(@ENTRY,9,16,0,0,0,100,0,1000,1000,0,0,12,12204,6,300000,0,0,0,8,0,0,0,2367.58,-5889.81,11.3931,5.36209,"Captain Vanessa Beltis - On Script - Summon Creature 'Spitelash Raider'"),
+(@ENTRY,9,17,0,0,0,100,0,0,0,0,0,12,12204,6,300000,0,0,0,8,0,0,0,2369.53,-5888.84,11.2888,5.23643,"Captain Vanessa Beltis - On Script - Summon Creature 'Spitelash Raider'"),
+(@ENTRY,9,18,0,0,0,100,0,0,0,0,0,12,12205,6,300000,0,0,0,8,0,0,0,2366.15,-5891.65,11.72,5.46812,"Captain Vanessa Beltis - On Script - Summon Creature 'Spitelash Witch'"),
+-- 5. wave
+(@ENTRY,9,19,0,0,0,100,0,55000,55000,0,0,12,12205,6,300000,0,0,0,8,0,0,0,2370.83,-5893.06,10.6607,5.45564,"Captain Vanessa Beltis - On Script - Summon Creature 'Spitelash Witch'"),
+(@ENTRY,9,20,0,0,0,100,0,1000,1000,0,0,12,12204,6,300000,0,0,0,8,0,0,0,2367.58,-5889.81,11.3931,5.36209,"Captain Vanessa Beltis - On Script - Summon Creature 'Spitelash Raider'"),
+(@ENTRY,9,21,0,0,0,100,0,0,0,0,0,12,12204,6,300000,0,0,0,8,0,0,0,2369.53,-5888.84,11.2888,5.23643,"Captain Vanessa Beltis - On Script - Summon Creature 'Spitelash Raider'"),
+(@ENTRY,9,22,0,0,0,100,0,0,0,0,0,12,12205,6,300000,0,0,0,8,0,0,0,2366.15,-5891.65,11.72,5.46812,"Captain Vanessa Beltis - On Script - Summon Creature 'Spitelash Witch'"),
+-- 6. wave
+(@ENTRY,9,23,0,0,0,100,0,55000,55000,0,0,12,12205,6,300000,0,0,0,8,0,0,0,2370.83,-5893.06,10.6607,5.45564,"Captain Vanessa Beltis - On Script - Summon Creature 'Spitelash Witch'"),
+(@ENTRY,9,24,0,0,0,100,0,1000,1000,0,0,12,12204,6,300000,0,0,0,8,0,0,0,2367.58,-5889.81,11.3931,5.36209,"Captain Vanessa Beltis - On Script - Summon Creature 'Spitelash Raider'"),
+(@ENTRY,9,25,0,0,0,100,0,0,0,0,0,12,12204,6,300000,0,0,0,8,0,0,0,2369.53,-5888.84,11.2888,5.23643,"Captain Vanessa Beltis - On Script - Summon Creature 'Spitelash Raider'"),
+(@ENTRY,9,26,0,0,0,100,0,0,0,0,0,12,12205,6,300000,0,0,0,8,0,0,0,2366.15,-5891.65,11.72,5.46812,"Captain Vanessa Beltis - On Script - Summon Creature 'Spitelash Witch'"),
+(@ENTRY,9,27,0,0,0,100,0,10000,10000,0,0,15,3382,0,0,0,0,0,17,0,30,0,0,0,0,0,"Captain Vanessa Beltis - On Script - Quest Credit 'A Crew Under Fire'"),
+(@ENTRY,9,28,0,0,0,100,0,0,0,0,0,48,0,0,0,0,0,0,1,0,0,0,0,0,0,0,"Captain Vanessa Beltis - On Script - Set Active Off"),
+(@ENTRY,9,29,0,0,0,100,0,0,0,0,0,45,2,2,0,0,0,0,9,0,0,50,0,0,0,0,"Captain Vanessa Beltis - On Script - Set Data 2 2"),
+(@ENTRY,9,30,0,0,0,100,0,0,0,0,0,2,35,0,0,0,0,0,1,0,0,0,0,0,0,0,"Captain Vanessa Beltis - On Script - Set Faction 35"),
+(@ENTRY,9,31,0,0,0,100,0,0,0,0,0,82,3,0,0,0,0,0,1,0,0,0,0,0,0,0,"Captain Vanessa Beltis - On Script - set NPC-Flag");
+
+DELETE FROM `creature_text` WHERE `entry`=8380;
+INSERT INTO `creature_text` (`entry`, `groupid`, `id`, `text`, `type`, `language`, `probability`, `emote`, `duration`, `sound`, `comment`, `BroadcastTextId`) VALUES
+(8380, 0, 0, 'Stand Prepared! The naga won\'t wait long to press their advantage once they know we\'re alive.', 12, 0, 100, 0, 0, 0, 'Captain Vanessa Beltis', 4658);
+
+-- Lindros SAI
+SET @ENTRY := 8381;
+UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,0,0,0,38,0,100,0,1,1,0,0,2,250,0,0,0,0,0,1,0,0,0,0,0,0,0,"Lindros - On Data Set 1 1 - Set Faction 250"),
+(@ENTRY,0,1,0,38,0,100,0,2,2,0,0,2,35,0,0,0,0,0,1,0,0,0,0,0,0,0,"Lindros - On Data Set 2 2 - Set Faction 35"),
+(@ENTRY,0,2,0,4,0,100,0,0,0,0,0,11,11975,0,0,0,0,0,2,0,0,0,0,0,0,0,"Lindros - On Aggro - Cast 'Arcane Explosion'"),
+(@ENTRY,0,3,0,0,0,100,0,1000,4000,3000,4000,11,20823,0,0,0,0,0,2,0,0,0,0,0,0,0,"Lindros - In Combat - Cast 'Fireball'");
+
+-- Alexandra Blazen SAI
+SET @ENTRY := 8378;
+UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,0,0,0,38,0,100,0,1,1,0,0,2,250,0,0,0,0,0,1,0,0,0,0,0,0,0,"Alexandra Blazen - On Data Set 1 1 - Set Faction 250"),
+(@ENTRY,0,1,0,38,0,100,0,2,2,0,0,2,35,0,0,0,0,0,1,0,0,0,0,0,0,0,"Alexandra Blazen - On Data Set 2 2 - Set Faction 35"),
+(@ENTRY,0,2,0,4,0,100,0,0,0,0,0,11,1006,2,0,0,0,0,1,0,0,0,0,0,0,0,"Alexandra Blazen - On Aggro - Cast 'Inner Fire'"),
+(@ENTRY,0,3,0,2,0,100,0,0,0,20000,20000,11,11640,0,0,0,0,0,1,0,0,0,0,0,0,0,"Alexandra Blazen - Between 0-0% Health - Cast 'Renew'");
+
+-- Patrick Mills SAI
+SET @ENTRY := 8382;
+UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,0,0,0,38,0,100,0,1,1,0,0,2,250,0,0,0,0,0,1,0,0,0,0,0,0,0,"Patrick Mills - On Data Set 1 1 - Set Faction 250"),
+(@ENTRY,0,1,0,38,0,100,0,2,2,0,0,2,35,0,0,0,0,0,1,0,0,0,0,0,0,0,"Patrick Mills - On Data Set 2 2 - Set Faction 35"),
+(@ENTRY,0,2,0,4,0,100,0,0,0,0,0,11,1032,2,0,0,0,0,1,0,0,0,0,0,0,0,"Patrick Mills - On Aggro - Cast 'Devotion Aura'"),
+(@ENTRY,0,3,0,0,0,100,0,2000,2000,4000,4000,11,17143,0,0,0,0,0,2,0,0,0,0,0,0,0,"Patrick Mills - In Combat - Cast 'Holy Strike'");
+
+-- Horizon Scout Crewman SAI
+SET @ENTRY := 8386;
+UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,0,0,0,38,0,100,0,1,1,0,0,2,250,0,0,0,0,0,1,0,0,0,0,0,0,0,"Horizon Scout Crewman - On Data Set 1 1 - Set Faction 250"),
+(@ENTRY,0,1,0,38,0,100,0,2,2,0,0,2,35,0,0,0,0,0,1,0,0,0,0,0,0,0,"Horizon Scout Crewman - On Data Set 2 2 - Set Faction 35"),
+(@ENTRY,0,2,0,0,0,100,0,2000,2000,4000,4000,11,6660,2,0,0,0,0,2,0,0,0,0,0,0,0,"Horizon Scout Crewman - In Combat - Cast 'Shoot'");
diff --git a/sql/updates/world/2015_03_15_14_world.sql b/sql/updates/world/2015_03_15_14_world.sql
new file mode 100644
index 00000000000..a74f3f67554
--- /dev/null
+++ b/sql/updates/world/2015_03_15_14_world.sql
@@ -0,0 +1,8 @@
+--
+DELETE FROM `creature_text` WHERE `entry`=18209;
+INSERT INTO `creature_text` (`entry`, `groupid`, `id`, `text`, `type`, `language`, `probability`, `emote`, `duration`, `sound`, `BroadcastTextId`, `TextRange`, `comment`) VALUES
+(18209, 0, 0, 'It''s an ambush! Defend yourself!', 12, 0, 100, 0, 0, 0, 15044, 0, 'Kurenai Captive'),
+(18209, 1, 0, 'More of them coming! Watch out!', 12, 0, 100, 0, 0, 0, 15000, 0, 'Kurenai Captive'),
+(18209, 2, 0, 'Ride the lightning, filth!', 12, 1, 100, 0, 0, 0, 15006, 0, 'Kurenai Captive'),
+(18209, 3, 0, 'We are surrounded!', 14, 0, 100, 0, 0, 0, 15047, 0, 'Kurenai Captive'),
+(18209, 4, 0, 'Up ahead is the road to Telaar. We will split up when we reach the fork as they will surely send more Murkblood after us. Hopefully one of us makes it back to Telaar alive.', 14, 7, 100, 0, 0, 0, 15048, 0, 'Kurenai Captive');
diff --git a/sql/updates/world/2015_03_16_00_world.sql b/sql/updates/world/2015_03_16_00_world.sql
new file mode 100644
index 00000000000..9fc5a435615
--- /dev/null
+++ b/sql/updates/world/2015_03_16_00_world.sql
@@ -0,0 +1,20 @@
+-- Portal Kruul SAI
+SET @ENTRY := 184289;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=1;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,1,0,0,70,0,100,0,2,0,0,0,11,34386,0,0,0,0,0,19,19652,10,0,0,0,0,0,"Portal Kruul - On Gameobject State Changed - Cast spell 'Hellfire Fire'");
+-- Portal Xilus SAI
+SET @ENTRY := 184290;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=1;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,1,0,0,70,0,100,0,2,0,0,0,11,34386,0,0,0,0,0,19,19717,10,0,0,0,0,0,"Portal Xilus - On Gameobject State Changed - Cast spell 'Hellfire Fire'");
+-- Portal Grimh SAI
+SET @ENTRY := 184414;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=1;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,1,0,0,70,0,100,0,2,0,0,0,11,34386,0,0,0,0,0,19,19652,10,0,0,0,0,0,"Portal Grimh - On Gameobject State Changed - Cast spell 'Hellfire Fire'");
+-- Portal Kaalez SAI
+SET @ENTRY := 184415;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=1;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,1,0,0,70,0,100,0,2,0,0,0,11,34386,0,0,0,0,0,19,19717,10,0,0,0,0,0,"Portal Kaalez - On Gameobject State Changed - Cast spell 'Hellfire Fire'");
diff --git a/sql/updates/world/2015_03_16_01_world_335.sql b/sql/updates/world/2015_03_16_01_world_335.sql
new file mode 100644
index 00000000000..2a0886c6ece
--- /dev/null
+++ b/sql/updates/world/2015_03_16_01_world_335.sql
@@ -0,0 +1,2 @@
+--
+UPDATE `creature_template` SET `faction` = 1576 WHERE `entry` = 8564;
diff --git a/sql/updates/world/2015_03_16_02_world.sql b/sql/updates/world/2015_03_16_02_world.sql
new file mode 100644
index 00000000000..60b305829cb
--- /dev/null
+++ b/sql/updates/world/2015_03_16_02_world.sql
@@ -0,0 +1,105 @@
+-- Azure Spellweaver SAI
+SET @ENTRY := 31403;
+UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,0,0,0,0,0,100,0,0,0,2400,3800,11,34447,64,0,0,0,0,2,0,0,0,0,0,0,0,"Azure Spellweaver - Combat CMC - Cast 'Arcane Missiles'");
+
+-- Gatekeeper Melindra SAI
+SET @ENTRY := 32373;
+UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,0,0,0,1,0,100,0,1000,1000,1800000,1800000,11,12544,1,0,0,0,0,1,0,0,0,0,0,0,0,"Gatekeeper Melindra - Out of Combat - Cast 'Frost Armor'"),
+(@ENTRY,0,1,0,0,0,100,0,0,0,3400,4800,11,17290,64,0,0,0,0,2,0,0,0,0,0,0,0,"Gatekeeper Melindra - Combat CMC - Cast 'Fireball'"),
+(@ENTRY,0,2,0,0,0,100,0,8000,11000,19000,25000,11,12738,1,0,0,0,0,2,0,0,0,0,0,0,0,"Gatekeeper Melindra - In Combat - Cast 'Amplify Damage'");
+
+-- Syreian the Bonecarver SAI
+SET @ENTRY := 32438;
+UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,0,0,3,4,0,100,1,0,0,0,0,11,38952,64,0,0,0,0,2,0,0,0,0,0,0,0,"Syreian the Bonecarver - On Aggro CMC - Cast 'Frost Arrow' (No Repeat)"),
+(@ENTRY,0,1,0,0,0,100,0,2300,3900,2300,3900,11,50092,64,0,0,0,0,2,0,0,0,0,0,0,0,"Syreian the Bonecarver - Combat CMC - Cast 'Shoot'"),
+(@ENTRY,0,2,0,0,0,100,0,12000,15000,11000,14000,11,38952,1,0,0,0,0,2,0,0,0,0,0,0,0,"Syreian the Bonecarver - In Combat - Cast 'Frost Arrow'"),
+(@ENTRY,0,3,0,9,0,100,0,0,5,12000,16000,11,47168,1,0,0,0,0,2,0,0,0,0,0,0,0,"Syreian the Bonecarver - Within 0-5 Range - Cast 'Improved Wing Clip'");
+
+-- Unbound Seer SAI
+SET @ENTRY := 33422;
+UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,0,0,0,0,0,100,0,0,0,3400,4800,11,38204,64,0,0,0,0,2,0,0,0,0,0,0,0,"Unbound Seer - Combat CMC - Cast 'Arcane Bolt'"),
+(@ENTRY,0,1,0,0,0,100,0,9000,12000,12000,15000,11,58667,33,0,0,0,0,5,0,0,0,0,0,0,0,"Unbound Seer - In Combat - Cast 'Ley Curse'");
+
+-- Mistcaller Yngvar SAI
+SET @ENTRY := 34965;
+UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,0,0,0,1,0,100,1,1000,1000,0,0,11,45658,1,0,0,0,0,1,0,0,0,0,0,0,0,"Mistcaller Yngvar - Out of Combat - Cast 'Call of the Mist'"),
+(@ENTRY,0,1,0,0,0,100,0,0,0,3400,4800,11,9532,64,0,0,0,0,2,0,0,0,0,0,0,0,"Mistcaller Yngvar - Combat CMC - Cast 'Lightning Bolt'"),
+(@ENTRY,0,2,0,0,0,100,0,6000,9000,12000,17000,11,49816,0,0,0,0,0,5,0,0,0,0,0,0,0,"Mistcaller Yngvar - Combat - Cast 'Mist of Strangulation'"),
+(@ENTRY,0,3,0,2,0,100,0,0,30,120000,120000,11,49871,1,0,0,0,0,1,0,0,0,0,0,0,0,"Mistcaller Yngvar - 0-30% Health - Cast 'Rune of Retribution'");
+
+-- Drottinn Hrothgar SAI
+SET @ENTRY := 34980;
+UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,0,0,0,1,0,100,1,0,0,0,0,11,66625,1,0,0,0,0,1,0,0,0,0,0,0,0,"Drottinn Hrothgar - Out of Combat - Cast 'Cloud Aura' (No Repeat)"),
+(@ENTRY,0,1,0,1,0,100,1,1500,1500,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,"Drottinn Hrothgar - Out of Combat - Say Line 0 (No Repeat)"),
+(@ENTRY,0,2,0,9,0,100,0,0,5,5000,7000,11,15496,0,0,0,0,0,2,0,0,0,0,0,0,0,"Drottinn Hrothgar - Within 0-5 Range - Cast 'Cleave'"),
+(@ENTRY,0,3,0,0,0,100,0,12000,16000,15000,21000,11,67038,1,0,0,0,0,1,0,0,0,0,0,0,0,"Drottinn Hrothgar - In Combat - Cast 'Smash'");
+
+-- Ornolf the Scarred SAI
+SET @ENTRY := 35012;
+UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,0,0,0,0,0,100,0,1000,1000,8000,11000,11,38557,0,0,0,0,0,2,0,0,0,0,0,0,0,"Ornolf the Scarred - Combat - Cast 'Throw'"),
+(@ENTRY,0,1,0,9,0,100,0,0,5,5000,7000,11,43410,0,0,0,0,0,2,0,0,0,0,0,0,0,"Ornolf the Scarred - Within 0-5 Range - Cast 'Chop'"),
+(@ENTRY,0,2,0,0,0,100,0,8000,11000,8000,11000,11,67037,1,0,0,0,0,1,0,0,0,0,0,0,0,"Ornolf the Scarred - Combat - Cast 'Whirlwind'"),
+(@ENTRY,0,3,0,2,0,100,0,0,30,40000,40000,11,3019,1,0,0,0,0,1,0,0,0,0,0,0,0,"Ornolf the Scarred - 0-30% Health - Cast 'Frenzy'");
+
+-- Kul the Reckless SAI
+SET @ENTRY := 34956;
+UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,0,0,0,8,0,100,0,66531,0,0,0,80,3495600,0,0,0,0,0,1,0,0,0,0,0,0,0,"Kul the Reckless - On Spellhit 'Open Black Cage' - Run Script");
+
+-- Kvaldir Harpooner SAI
+SET @ENTRY := 34907;
+UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,0,0,0,0,0,100,0,0,0,2300,3900,11,66489,64,0,0,0,0,2,0,0,0,0,0,0,0,"Kvaldir Harpooner - Combat CMC - Cast 'Spear Throw'");
+
+-- Deep Jormungar SAI
+SET @ENTRY := 34920;
+UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,0,0,1,1,0,100,1,0,0,500,500,11,56503,0,0,0,0,0,1,0,0,0,0,0,0,0,"Deep Jormungar - Out of Combat - Cast 'Submerge' (No Repeat)"),
+(@ENTRY,0,1,0,61,0,100,0,0,0,0,0,18,33554434,0,0,0,0,0,1,0,0,0,0,0,0,0,"Deep Jormungar - Out of Combat - Set Flags Not Attackable & Not Selectable (No Repeat)"),
+(@ENTRY,0,2,3,4,0,100,1,0,0,0,0,28,56503,0,0,0,0,0,1,0,0,0,0,0,0,0,"Deep Jormungar - On Aggro - Remove Aura 'Submerge' (No Repeat)"),
+(@ENTRY,0,3,4,61,0,100,0,0,0,0,0,28,29147,0,0,0,0,0,1,0,0,0,0,0,0,0,"Deep Jormungar - On Aggro - Remove Aura 'Tunnel Bore Passive' (No Repeat)"),
+(@ENTRY,0,4,5,61,0,100,0,0,0,0,0,11,37752,0,0,0,0,0,1,0,0,0,0,0,0,0,"Deep Jormungar - On Aggro - Cast 'Stand' (No Repeat)"),
+(@ENTRY,0,5,6,61,0,100,0,0,0,0,0,21,0,0,0,0,0,0,1,0,0,0,0,0,0,0,"Deep Jormungar - On Aggro - Disable Combat Movement (No Repeat)"),
+(@ENTRY,0,6,0,61,0,100,0,0,0,0,0,19,33554434,0,0,0,0,0,1,0,0,0,0,0,0,0,"Deep Jormungar - On Aggro - Remove Flags Not Attackable & Not Selectable (No Repeat)"),
+(@ENTRY,0,7,0,0,0,100,0,1000,1000,3000,5000,11,61597,64,0,0,0,0,2,0,0,0,0,0,0,0,"Deep Jormungar - In Combat CMC - Cast 'Acid Spit'"),
+(@ENTRY,0,8,0,0,0,100,0,11000,16000,15000,20000,11,61598,1,0,0,0,0,1,0,0,0,0,0,0,0,"Deep Jormungar - In Combat - Cast 'Sweep'"),
+(@ENTRY,0,9,0,0,0,100,0,10000,20000,45000,50000,11,32738,0,0,0,0,0,2,0,0,0,0,0,0,0,"Deep Jormungar - In Combat - Cast 'Bore'"),
+(@ENTRY,0,10,11,9,0,100,1,30,60,0,0,11,56503,0,0,0,0,0,1,0,0,0,0,0,0,0,"Deep Jormungar - Within 30-60 Range - Cast 'Submerge' (No Repeat)"),
+(@ENTRY,0,11,0,61,0,100,0,0,0,0,0,11,29147,0,0,0,0,0,1,0,0,0,0,0,0,0,"Deep Jormungar - Within 30-60 Range - Cast 'Tunnel Bore Passive' (No Repeat)"),
+(@ENTRY,0,12,13,9,0,100,1,0,8,0,0,28,56503,0,0,0,0,0,1,0,0,0,0,0,0,0,"Deep Jormungar - Within 0-8 Range - Remove Aura 'Submerge' (No Repeat)"),
+(@ENTRY,0,13,14,61,0,100,0,0,0,0,0,28,29147,0,0,0,0,0,1,0,0,0,0,0,0,0,"Deep Jormungar - Within 0-8 Range - Remove Aura 'Tunnel Bore Passive' (No Repeat)"),
+(@ENTRY,0,14,15,61,0,100,0,0,0,0,0,11,37752,0,0,0,0,0,1,0,0,0,0,0,0,0,"Deep Jormungar - Within 0-8 Range - Cast 'Stand' (No Repeat)"),
+(@ENTRY,0,15,16,61,0,100,0,0,0,0,0,21,0,0,0,0,0,0,1,0,0,0,0,0,0,0,"Deep Jormungar - Within 0-8 Range - Disable Combat Movement (No Repeat)"),
+(@ENTRY,0,16,0,61,0,100,0,0,0,0,0,19,33554434,0,0,0,0,0,1,0,0,0,0,0,0,0,"Deep Jormungar - Within 0-8 Range - Remove Flags Not Attackable & Not Selectable (No Repeat)"),
+(@ENTRY,0,17,18,7,0,100,1,0,0,0,0,11,56503,0,0,0,0,0,1,0,0,0,0,0,0,0,"Deep Jormungar - On Evade - Cast 'Submerge' (No Repeat)"),
+(@ENTRY,0,18,19,61,0,100,0,0,0,0,0,22,1,0,0,0,0,0,1,0,0,0,0,0,0,0,"Deep Jormungar - On Evade - Set Event Phase 1 (No Repeat)"),
+(@ENTRY,0,19,20,61,0,100,0,0,0,0,0,11,29147,0,0,0,0,0,1,0,0,0,0,0,0,0,"Deep Jormungar - On Evade - Cast 'Tunnel Bore Passive' (No Repeat)"),
+(@ENTRY,0,20,21,61,0,100,0,0,0,0,0,14,0,100,0,0,0,0,1,0,0,0,0,0,0,0,"Deep Jormungar - On Evade - Set All Threat 0-100 (No Repeat)"),
+(@ENTRY,0,21,0,61,0,100,0,0,0,0,0,18,33554434,0,0,0,0,0,1,0,0,0,0,0,0,0,"Deep Jormungar - On Evade - Set Flags Not Attackable & Not Selectable (No Repeat)");
diff --git a/sql/updates/world/2015_03_16_03_world.sql b/sql/updates/world/2015_03_16_03_world.sql
new file mode 100644
index 00000000000..98bd8be7da1
--- /dev/null
+++ b/sql/updates/world/2015_03_16_03_world.sql
@@ -0,0 +1,223 @@
+-- Gnarlhide SAI
+SET @ENTRY := 30003;
+UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,0,0,0,0,0,100,0,0,0,3400,4800,11,38391,64,0,0,0,0,2,0,0,0,0,0,0,0,"Gnarlhide - Combat CMC - Cast 'Scorch'"),
+(@ENTRY,0,1,0,0,0,100,0,3000,6000,20000,25000,11,60290,1,0,0,0,0,2,0,0,0,0,0,0,0,"Gnarlhide - Combat - Cast 'Blast Wave'"),
+(@ENTRY,0,2,0,0,0,100,0,9000,12000,19000,24000,11,35250,1,0,0,0,0,1,0,0,0,0,0,0,0,"Gnarlhide - Combat - Cast 'Dragon's Breath'"),
+(@ENTRY,0,3,0,0,0,100,0,5000,8000,9000,12000,11,20832,0,0,0,0,0,5,0,0,0,0,0,0,0,"Gnarlhide - Combat - Cast 'Fire Blast'");
+
+-- Yulda the Stormspeaker SAI
+SET @ENTRY := 30046;
+UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,0,0,0,0,0,100,0,0,0,3400,4800,11,32018,64,0,0,0,0,2,0,0,0,0,0,0,0,"Yulda the Stormspeaker - Combat CMC - Cast 'Call Lightning'"),
+(@ENTRY,0,1,0,0,0,100,0,9000,12000,15000,18000,11,55087,0,0,0,0,0,2,0,0,0,0,0,0,0,"Yulda the Stormspeaker - Combat - Cast 'Typhoon'");
+
+-- Sigrid Iceborn SAI
+SET @ENTRY := 30086;
+UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,0,0,0,0,0,100,0,0,0,3500,4100,11,61168,64,0,0,0,0,2,0,0,0,0,0,0,0,"Sigrid Iceborn - Combat CMC - Cast 'Throw'"),
+(@ENTRY,0,1,0,0,0,100,0,3000,7000,13000,16700,11,61164,0,0,0,0,0,2,0,0,0,0,0,0,0,"Sigrid Iceborn - Combat - Cast 'Impale'"),
+(@ENTRY,0,2,0,13,0,100,0,12000,18000,0,0,11,57635,0,0,0,0,0,6,1,0,0,0,0,0,0,"Sigrid Iceborn - Target Casting - Cast 'Disengage'"),
+(@ENTRY,0,3,0,1,0,100,0,500,1000,600000,600000,11,61165,0,0,0,0,0,1,0,0,0,0,0,0,0,"Sigrid Iceborn - Out of Combat - Cast 'Frostbite Weapon'"),
+(@ENTRY,0,4,5,62,0,100,0,9870,0,0,0,72,0,0,0,0,0,0,7,0,0,0,0,0,0,0,"Sigrid Iceborn - On Gossip Option 0 Selected - Close Gossip"),
+(@ENTRY,0,5,6,61,0,100,0,0,0,0,0,42,1,0,0,0,0,0,1,0,0,0,0,0,0,0,"Sigrid Iceborn - On Gossip Option 0 Selected - Set Invincibility Hp 1"),
+(@ENTRY,0,6,7,61,0,100,0,0,0,0,0,19,768,0,0,0,0,0,1,0,0,0,0,0,0,0,"Sigrid Iceborn - On Gossip Option 0 Selected - Remove Flags Immune To Players & Immune To NPC's"),
+(@ENTRY,0,7,8,61,0,100,0,0,0,0,0,2,14,0,0,0,0,0,1,0,0,0,0,0,0,0,"Sigrid Iceborn - On Gossip Option 0 Selected - Set Faction 14"),
+(@ENTRY,0,8,0,61,0,100,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,"Sigrid Iceborn - On Gossip Option 0 Selected - Say Line 0"),
+(@ENTRY,0,9,10,2,0,100,0,0,1,0,0,33,30086,0,0,0,0,0,7,0,0,0,0,0,0,0,"Sigrid Iceborn - Between 0-1% Health - Quest Credit 'Eliminate the Competition'"),
+(@ENTRY,0,10,11,61,0,100,0,0,0,0,0,2,0,0,0,0,0,0,1,0,0,0,0,0,0,0,"Sigrid Iceborn - Between 0-1% Health - Set Faction 0"),
+(@ENTRY,0,11,12,61,0,100,0,0,0,0,0,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,"Sigrid Iceborn - Between 0-1% Health - Say Line 1"),
+(@ENTRY,0,12,0,61,0,100,0,0,0,0,0,24,0,0,0,0,0,0,1,0,0,0,0,0,0,0,"Sigrid Iceborn - Between 0-1% Health - Evade");
+
+-- Twilight Worshipper SAI
+SET @ENTRY := 30111;
+UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,0,0,0,0,0,100,2,0,0,3400,4800,11,17290,64,0,0,0,0,2,0,0,0,0,0,0,0,"Twilight Worshipper - Combat CMC - Cast 'Fireball' (Normal Dungeon)"),
+(@ENTRY,0,1,0,0,0,100,4,0,0,5000,8000,11,61567,64,0,0,0,0,5,0,0,0,0,0,0,0,"Twilight Worshipper - Combat CMC - Cast 'Fireball' (Heroic Dungeon)"),
+(@ENTRY,0,2,0,0,0,100,2,9000,12000,14000,17000,11,56858,1,0,0,0,0,5,0,0,0,0,0,0,0,"Twilight Worshipper - Combat - Cast 'Flamestrike' (Normal Dungeon)"),
+(@ENTRY,0,3,0,0,0,100,4,9000,12000,14000,17000,11,61568,1,0,0,0,0,5,0,0,0,0,0,0,0,"Twilight Worshipper - Combat - Cast 'Flamestrike' (Heroic Dungeon)");
+
+-- Onu'zun SAI
+SET @ENTRY := 30180;
+UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,0,0,0,1,0,100,0,500,1000,600000,600000,11,18100,0,0,0,0,0,1,0,0,0,0,0,0,0,"Onu'zun - Out of Combat - Cast 'Frost Armor'"),
+(@ENTRY,0,1,0,0,0,100,0,0,0,3400,4700,11,15242,64,0,0,0,0,2,0,0,0,0,0,0,0,"Onu'zun - Combat CMC - Cast 'Fireball'"),
+(@ENTRY,0,2,0,0,0,100,0,5000,5000,14500,17800,11,15244,0,0,0,0,0,2,0,0,0,0,0,0,0,"Onu'zun - Combat - Cast 'Cone of Cold'"),
+(@ENTRY,0,3,0,13,0,100,0,12000,18000,0,0,11,15122,0,0,0,0,0,6,1,0,0,0,0,0,0,"Onu'zun - Target Casting - Cast 'Counterspell'"),
+(@ENTRY,0,4,5,62,0,100,0,9878,0,0,0,72,0,0,0,0,0,0,7,0,0,0,0,0,0,0,"Onu'zun - On Gossip Option 0 Selected - Close Gossip"),
+(@ENTRY,0,5,6,61,0,100,0,0,0,0,0,42,1,0,0,0,0,0,1,0,0,0,0,0,0,0,"Onu'zun - On Gossip Option 0 Selected - Set Invincibility Hp 1"),
+(@ENTRY,0,6,7,61,0,100,0,0,0,0,0,19,768,0,0,0,0,0,1,0,0,0,0,0,0,0,"Onu'zun - On Gossip Option 0 Selected - Remove Flags Immune To Players & Immune To NPC's"),
+(@ENTRY,0,7,8,61,0,100,0,0,0,0,0,2,14,0,0,0,0,0,1,0,0,0,0,0,0,0,"Onu'zun - On Gossip Option 0 Selected - Set Faction 14"),
+(@ENTRY,0,8,0,61,0,100,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,"Onu'zun - On Gossip Option 0 Selected - Say Line 0"),
+(@ENTRY,0,9,10,2,0,100,0,0,1,0,0,33,30180,0,0,0,0,0,7,0,0,0,0,0,0,0,"Onu'zun - Between 0-1% Health - Quest Credit 'Eliminate the Competition'"),
+(@ENTRY,0,10,11,61,0,100,0,0,0,0,0,2,0,0,0,0,0,0,1,0,0,0,0,0,0,0,"Onu'zun - Between 0-1% Health - Set Faction 0"),
+(@ENTRY,0,11,0,61,0,100,0,0,0,0,0,24,0,0,0,0,0,0,1,0,0,0,0,0,0,0,"Onu'zun - Between 0-1% Health - Evade");
+
+-- Sunreaver Scout SAI
+SET @ENTRY := 30233;
+UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,0,0,0,0,0,100,0,0,0,2300,3900,11,6660,64,0,0,0,0,2,0,0,0,0,0,0,0,"Sunreaver Scout - Combat CMC - Cast 'Shoot'"),
+(@ENTRY,0,1,0,9,0,100,0,5,30,8000,13000,11,17174,0,0,0,0,0,2,0,0,0,0,0,0,0,"Sunreaver Scout - Within 5-30 Range - Cast 'Concussive Shot'"),
+(@ENTRY,0,2,0,9,0,100,0,5,30,15000,25000,11,14443,0,0,0,0,0,2,0,0,0,0,0,0,0,"Sunreaver Scout - Within 5-30 Range - Cast 'Multi-Shot'");
+
+-- Silver Covenant Scout SAI
+SET @ENTRY := 30238;
+UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,0,0,0,0,0,100,0,0,0,2300,3900,11,6660,64,0,0,0,0,2,0,0,0,0,0,0,0,"Silver Covenant Scout - Combat CMC - Cast 'Shoot'"),
+(@ENTRY,0,1,0,9,0,100,0,5,30,8000,13000,11,17174,0,0,0,0,0,2,0,0,0,0,0,0,0,"Silver Covenant Scout - Within 5-30 Range - Cast 'Concussive Shot'"),
+(@ENTRY,0,2,0,9,0,100,0,5,30,15000,25000,11,14443,0,0,0,0,0,2,0,0,0,0,0,0,0,"Silver Covenant Scout - Within 5-30 Range - Cast 'Multi-Shot'");
+
+-- Silver Covenant Horseman SAI
+SET @ENTRY := 30263;
+UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,0,0,0,0,0,100,0,0,0,2300,3900,11,6660,64,0,0,0,0,2,0,0,0,0,0,0,0,"Silver Covenant Horseman - Combat CMC - Cast 'Shoot'"),
+(@ENTRY,0,1,0,9,0,100,0,5,30,8000,13000,11,17174,0,0,0,0,0,2,0,0,0,0,0,0,0,"Silver Covenant Horseman - Within 5-30 Range - Cast 'Concussive Shot'"),
+(@ENTRY,0,2,0,9,0,100,0,5,30,15000,25000,11,14443,0,0,0,0,0,2,0,0,0,0,0,0,0,"Silver Covenant Horseman - Within 5-30 Range - Cast 'Multi-Shot'");
+
+-- Sunreaver Hawkrider SAI
+SET @ENTRY := 30265;
+UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,0,0,0,0,0,100,0,0,0,2300,3900,11,6660,64,0,0,0,0,2,0,0,0,0,0,0,0,"Sunreaver Hawkrider - Combat CMC - Cast 'Shoot'"),
+(@ENTRY,0,1,0,9,0,100,0,5,30,8000,13000,11,17174,0,0,0,0,0,2,0,0,0,0,0,0,0,"Sunreaver Hawkrider - Within 5-30 Range - Cast 'Concussive Shot'"),
+(@ENTRY,0,2,0,9,0,100,0,5,30,15000,25000,11,14443,0,0,0,0,0,2,0,0,0,0,0,0,0,"Sunreaver Hawkrider - Within 5-30 Range - Cast 'Multi-Shot'");
+
+-- Ahn'kahar Spell Flinger SAI
+SET @ENTRY := 30278;
+UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,0,0,0,0,0,100,2,0,0,23000,27000,11,56698,64,0,0,0,0,2,0,0,0,0,0,0,0,"Ahn'kahar Spell Flinger - Combat CMC - Cast 'Shadow Blast' (Normal Dungeon)"),
+(@ENTRY,0,1,0,0,0,100,4,0,0,23000,27000,11,59102,64,0,0,0,0,2,0,0,0,0,0,0,0,"Ahn'kahar Spell Flinger - Combat CMC - Cast 'Shadow Blast' (Heroic Dungeon)"),
+(@ENTRY,0,2,0,0,0,100,2,10000,14000,13000,16000,11,56702,65,0,0,0,0,1,0,0,0,0,0,0,0,"Ahn'kahar Spell Flinger - Combat CMC - Cast 'Shadow Sickle' (Normal Dungeon)"),
+(@ENTRY,0,3,0,0,0,100,4,10000,14000,13000,16000,11,59103,65,0,0,0,0,1,0,0,0,0,0,0,0,"Ahn'kahar Spell Flinger - Combat CMC - Cast 'Shadow Sickle' (Heroic Dungeon)");
+
+-- Eye of Taldaram SAI
+SET @ENTRY := 30285;
+UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,0,0,0,0,0,100,2,0,0,3400,4800,11,17439,64,0,0,0,0,2,0,0,0,0,0,0,0,"Eye of Taldaram - Combat CMC - Cast 'Shadow Shock' (Normal Dungeon)"),
+(@ENTRY,0,1,0,0,0,100,4,0,0,3400,4800,11,17289,64,0,0,0,0,2,0,0,0,0,0,0,0,"Eye of Taldaram - Combat CMC - Cast 'Shadow Shock' (Heroic Dungeon)"),
+(@ENTRY,0,2,0,13,0,100,3,0,0,0,0,11,56730,0,0,0,0,0,7,0,0,0,0,0,0,0,"Eye of Taldaram - Target Casting - Cast 'Dark Counterspell' (No Repeat) (Normal Dungeon)"),
+(@ENTRY,0,3,0,13,0,100,5,0,0,0,0,11,59111,0,0,0,0,0,7,0,0,0,0,0,0,0,"Eye of Taldaram - Target Casting - Cast 'Dark Counterspell' (No Repeat) (Heroic Dungeon)"),
+(@ENTRY,0,4,0,0,0,100,6,15000,19000,23000,27000,11,56728,1,0,0,0,0,2,0,0,0,0,0,0,0,"Eye of Taldaram - Combat - Cast 'Eyes in the Dark' (Dungeon)"),
+(@ENTRY,0,5,0,6,0,100,3,0,0,0,0,11,56733,7,0,0,0,0,2,0,0,0,0,0,0,0,"Eye of Taldaram - Just Died - Cast 'Shadowfury' (No Repeat) (Normal Dungeon)"),
+(@ENTRY,0,6,0,6,0,100,5,0,0,0,0,11,61463,7,0,0,0,0,2,0,0,0,0,0,0,0,"Eye of Taldaram - Just Died - Cast 'Shadowfury' (No Repeat) (Heroic Dungeon)");
+
+-- Frostbringer SAI
+SET @ENTRY := 30286;
+UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,0,0,0,0,0,100,2,0,0,3400,4800,11,57825,64,0,0,0,0,2,0,0,0,0,0,0,0,"Frostbringer - Combat CMC - Cast 'Frostbolt' (Normal Dungeon)"),
+(@ENTRY,0,1,0,0,0,100,4,0,0,3400,4800,11,61461,64,0,0,0,0,2,0,0,0,0,0,0,0,"Frostbringer - Combat CMC - Cast 'Frostbolt' (Heroic Dungeon)"),
+(@ENTRY,0,2,0,0,0,100,2,9000,12000,15000,18000,11,15063,1,0,0,0,0,1,0,0,0,0,0,0,0,"Frostbringer - Combat - Cast 'Frost Nova' (Normal Dungeon)"),
+(@ENTRY,0,3,0,0,0,100,4,9000,12000,15000,18000,11,61462,1,0,0,0,0,1,0,0,0,0,0,0,0,"Frostbringer - Combat - Cast 'Frost Nova' (Heroic Dungeon)"),
+(@ENTRY,0,4,0,2,0,100,6,0,30,120000,130000,11,56716,0,0,0,0,0,1,0,0,0,0,0,0,0,"Frostbringer - 0-30% Health - Cast 'Icy Winds' (Dungeon)");
+
+-- Stormforged Amplifier SAI
+SET @ENTRY := 30591;
+UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,0,0,0,0,0,100,0,0,0,3400,4800,11,9532,64,0,0,0,0,2,0,0,0,0,0,0,0,"Stormforged Amplifier - Combat CMC - Cast 'Lightning Bolt'");
+
+-- Veteran Mage Hunter SAI
+SET @ENTRY := 30665;
+UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,0,0,0,1,0,100,7,1000,1000,0,0,11,58040,0,0,0,0,0,1,0,0,0,0,0,0,0,"Veteran Mage Hunter - Out of Combat - Cast 'Destroy Door Seal' (Dungeon)"),
+(@ENTRY,0,1,0,4,0,100,6,0,0,0,0,30,1,2,3,0,0,0,1,0,0,0,0,0,0,0,"Veteran Mage Hunter - Aggro - Set Random Phase(1, 2, 3) (Dungeon)"),
+(@ENTRY,0,2,0,0,1,100,2,0,0,2400,3800,11,15043,64,0,0,0,0,2,0,0,0,0,0,0,0,"Veteran Mage Hunter - Combat CMC - Cast 'Frostbolt' (Phase 1) (Normal Dungeon)"),
+(@ENTRY,0,3,0,0,1,100,4,0,0,2400,3800,11,20822,64,0,0,0,0,2,0,0,0,0,0,0,0,"Veteran Mage Hunter - Combat CMC - Cast 'Frostbolt' (Phase 1) (Heroic Dungeon)"),
+(@ENTRY,0,4,0,9,2,100,2,0,0,2400,3800,11,12466,64,0,0,0,0,2,0,0,0,0,0,0,0,"Veteran Mage Hunter - Combat CMC - Cast 'Fireball' (Phase 2) (Normal Dungeon)"),
+(@ENTRY,0,5,0,9,2,100,4,0,0,2400,3800,11,20823,64,0,0,0,0,2,0,0,0,0,0,0,0,"Veteran Mage Hunter - Combat CMC - Cast 'Fireball' (Phase 2) (Heroic Dungeon)"),
+(@ENTRY,0,6,0,9,4,100,2,0,0,2400,3800,11,13748,64,0,0,0,0,2,0,0,0,0,0,0,0,"Veteran Mage Hunter - Combat CMC - Cast 'Arcane Bolt' (Phase 3) (Normal Dungeon)"),
+(@ENTRY,0,7,0,9,4,100,4,0,0,2400,3800,11,20829,64,0,0,0,0,2,0,0,0,0,0,0,0,"Veteran Mage Hunter - Combat CMC - Cast 'Arcane Bolt' (Phase 3) (Heroic Dungeon)"),
+(@ENTRY,0,8,0,2,0,100,7,0,15,0,0,25,1,0,0,0,0,0,1,0,0,0,0,0,0,0,"Veteran Mage Hunter - Between 0-15% Health - Flee For Assist (No Repeat) (Dungeon)");
+
+-- Portal Keeper SAI
+SET @ENTRY := 30695;
+UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,0,0,0,0,0,100,2,0,0,6000,8000,11,58531,64,0,0,0,0,2,0,0,0,0,0,0,0,"Portal Keeper - Combat CMC - Cast 'Arcane Missiles' (Normal Dungeon)"),
+(@ENTRY,0,1,0,0,0,100,4,0,0,6000,8000,11,61593,64,0,0,0,0,2,0,0,0,0,0,0,0,"Portal Keeper - Combat CMC - Cast 'Arcane Missiles' (Heroic Dungeon)"),
+(@ENTRY,0,2,0,9,0,100,2,0,8,13000,19000,11,58532,1,0,0,0,0,1,0,0,0,0,0,0,0,"Portal Keeper - 0-8 Range - Cast 'Frostbolt Volley' (Normal Dungeon)"),
+(@ENTRY,0,3,0,9,0,100,4,0,8,13000,19000,11,61594,1,0,0,0,0,1,0,0,0,0,0,0,0,"Portal Keeper - 0-8 Range - Cast 'Frostbolt Volley' (Heroic Dungeon)"),
+(@ENTRY,0,4,0,0,0,100,6,0,8,9000,14000,11,58534,1,0,0,0,0,6,0,0,0,0,0,0,0,"Portal Keeper - Combat - Cast 'Deep Freeze' (Dungeon)");
+
+-- Nesingwary Game Warden SAI
+SET @ENTRY := 30737;
+UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,0,0,0,0,0,100,0,0,0,2300,3900,11,16100,64,0,0,0,0,2,0,0,0,0,0,0,0,"Nesingwary Game Warden - Combat CMC - Cast 'Shoot'"),
+(@ENTRY,0,1,0,9,0,100,0,0,20,9000,13000,11,6533,1,0,0,0,0,2,0,0,0,0,0,0,0,"Nesingwary Game Warden - 0-20 Range - Cast 'Net'"),
+(@ENTRY,0,2,0,9,0,100,0,5,30,8000,10000,11,31942,0,0,0,0,0,5,0,0,0,0,0,0,0,"Nesingwary Game Warden - 5-30 Range - Cast 'Multi-Shot'"),
+(@ENTRY,0,3,0,9,0,100,0,0,45,7000,9000,11,23337,1,0,0,0,0,6,0,0,0,0,0,0,0,"Nesingwary Game Warden - 0-45 Range - Cast 'Shoot'");
+
+-- Unbound Dryad SAI
+SET @ENTRY := 30860;
+UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,0,0,0,0,0,100,0,0,0,2300,3900,11,55217,64,0,0,0,0,2,0,0,0,0,0,0,0,"Unbound Dryad - Combat CMC - Cast 'Throw Spear'"),
+(@ENTRY,0,1,0,0,0,100,0,3000,9000,9000,13000,11,11976,0,0,0,0,0,2,0,0,0,0,0,0,0,"Unbound Dryad - In Combat - Cast 'Strike'");
+
+-- Shandaral Hunter Spirit SAI
+SET @ENTRY := 30864;
+UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,0,0,0,0,0,100,0,0,0,2300,3900,11,6660,64,0,0,0,0,2,0,0,0,0,0,0,0,"Shandaral Hunter Spirit - Combat CMC - Cast 'Shoot'"),
+(@ENTRY,0,1,0,0,0,100,0,4000,8000,9000,14000,11,54615,1,0,0,0,0,2,0,0,0,0,0,0,0,"Shandaral Hunter Spirit - Combat - Cast 'Aimed Shot'"),
+(@ENTRY,0,2,0,0,0,100,0,9000,15000,15000,22000,11,47168,0,0,0,0,0,5,0,0,0,0,0,0,0,"Shandaral Hunter Spirit - Combat - Cast 'Improved Wing Clip'");
+
+-- Unbound Corrupter SAI
+SET @ENTRY := 30868;
+UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,0,0,0,0,0,100,0,0,0,3400,5400,11,38204,64,0,0,0,0,2,0,0,0,0,0,0,0,"Unbound Corrupter - Combat CMC - Cast 'Arcane Bolt'"),
+(@ENTRY,0,1,0,0,0,100,0,20000,30000,45000,60000,11,58667,1,0,0,0,0,2,0,0,0,0,0,0,0,"Unbound Corrupter - Combat - Cast 'Ley Curse'"),
+(@ENTRY,0,2,0,2,0,100,0,0,30,30000,35000,11,58270,1,0,0,0,0,1,0,0,0,0,0,0,0,"Unbound Corrupter - 0-30% Health - Cast 'Transferred Power'");
+
+-- Portal Keeper SAI
+SET @ENTRY := 30893;
+UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,0,0,0,0,0,100,2,0,45,6000,8000,11,58536,64,0,0,0,0,2,0,0,0,0,0,0,0,"Portal Keeper - Combat CMC - Cast 'Arcane Volley' (Normal Dungeon)"),
+(@ENTRY,0,1,0,0,0,100,4,0,45,6000,8000,11,61591,64,0,0,0,0,2,0,0,0,0,0,0,0,"Portal Keeper - Combat CMC - Cast 'Arcane Volley' (Heroic Dungeon)"),
+(@ENTRY,0,2,0,9,0,100,2,0,45,13000,19000,11,58535,0,0,0,0,0,5,0,0,0,0,0,0,0,"Portal Keeper - 0-45 Range - Cast 'Frostbolt' (Normal Dungeon)"),
+(@ENTRY,0,3,0,9,0,100,4,0,45,13000,19000,11,61590,0,0,0,0,0,5,0,0,0,0,0,0,0,"Portal Keeper - 0-45 Range - Cast 'Frostbolt' (Heroic Dungeon)"),
+(@ENTRY,0,4,0,0,0,100,6,0,8,9000,14000,11,58537,1,0,0,0,0,6,0,0,0,0,0,0,0,"Portal Keeper - Combat - Cast 'Polymorph' (Dungeon)");
+
+-- Azure Binder SAI
+SET @ENTRY := 31007;
+UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,0,0,0,0,0,100,6,0,0,3400,4800,11,58456,64,0,0,0,0,2,0,0,0,0,0,0,0,"Azure Binder - Combat CMC - Cast 'Arcane Barrage' (Dungeon)"),
+(@ENTRY,0,1,0,9,0,100,2,0,8,9000,15000,11,58455,1,0,0,0,0,1,0,0,0,0,0,0,0,"Azure Binder - 0-8 Range - Cast 'Arcane Explosion' (Normal Dungeon)"),
+(@ENTRY,0,2,0,9,0,100,4,0,8,9000,15000,11,59257,1,0,0,0,0,1,0,0,0,0,0,0,0,"Azure Binder - 0-8 Range - Cast 'Arcane Blast' (Heroic Dungeon)");
diff --git a/sql/updates/world/2015_03_16_04_world.sql b/sql/updates/world/2015_03_16_04_world.sql
new file mode 100644
index 00000000000..6cd793dd55f
--- /dev/null
+++ b/sql/updates/world/2015_03_16_04_world.sql
@@ -0,0 +1,165 @@
+-- Spirit of Koosu SAI
+SET @ENTRY := 29034;
+UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,0,0,0,0,0,100,0,0,0,3500,4100,11,21971,64,0,0,0,0,2,0,0,0,0,0,0,0,"Spirit of Koosu - Combat CMC - Cast 'Poison Bolt'");
+
+-- Anub'ar Necromancer SAI
+SET @ENTRY := 29064;
+UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,0,0,0,0,0,100,6,0,0,4000,6000,11,53333,64,0,0,0,0,2,0,0,0,0,0,0,0,"Anub'ar Necromancer - Combat CMC - Cast 'Shadow Bolt' (Dungeon)"),
+(@ENTRY,0,1,0,0,0,100,6,14000,17000,23000,27000,11,53334,1,0,0,0,0,1,0,0,0,0,0,0,0,"Anub'ar Necromancer - Combat - Cast 'Animate Bones' (Dungeon)");
+
+-- Anub'ar Necromancer SAI
+SET @ENTRY := 29098;
+UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,0,0,0,0,0,100,6,0,0,4000,6000,11,53333,64,0,0,0,0,2,0,0,0,0,0,0,0,"Anub'ar Necromancer - Combat CMC - Cast 'Shadow Bolt' (Dungeon)"),
+(@ENTRY,0,1,0,0,0,100,6,14000,17000,23000,27000,11,53334,1,0,0,0,0,1,0,0,0,0,0,0,0,"Anub'ar Necromancer - Combat - Cast 'Animate Bones' (Dungeon)");
+
+
+-- Anub'ar Prime Guard SAI
+SET @ENTRY := 29128;
+UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,0,0,0,0,0,100,2,0,0,10000,13000,11,54309,64,0,0,0,0,5,0,0,0,0,0,0,0,"Anub'ar Prime Guard - Combat CMC - Cast 'Mark of Darkness' (Normal Dungeon)"),
+(@ENTRY,0,1,0,0,0,100,4,0,0,10000,13000,11,59352,64,0,0,0,0,5,0,0,0,0,0,0,0,"Anub'ar Prime Guard - Combat CMC - Cast 'Mark of Darkness' (Heroic Dungeon)"),
+(@ENTRY,0,2,0,9,0,100,7,0,5,0,0,11,54314,33,0,0,0,0,1,0,0,0,0,0,0,0,"Anub'ar Prime Guard - 0-5 Range - Cast 'Drain Power' (No Repeat) (Dungeon)");
+
+
+-- Lost Drakkari Spirit SAI
+SET @ENTRY := 29129;
+UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,0,0,0,23,0,100,0,17327,0,2000,2000,11,17327,0,0,0,0,0,1,0,0,0,0,0,0,0,"Lost Drakkari Spirit - On Has Aura 'Spirit Particles' - Cast 'Spirit Particles'"),
+(@ENTRY,0,1,0,0,0,100,0,0,0,1500,1500,11,37361,65,0,0,0,0,2,0,0,0,0,0,0,0,"Lost Drakkari Spirit - Combat CMC - Cast 'Arcane Bolt'"),
+(@ENTRY,0,2,0,0,0,100,0,10000,16000,15000,18000,11,24050,1,0,0,0,0,2,0,0,0,0,0,0,0,"Lost Drakkari Spirit - In Combat - Cast 'Spirit Burst'");
+
+-- Onslaught Harbor Guard SAI
+SET @ENTRY := 29330;
+UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,0,0,0,0,0,100,0,0,0,3400,4700,11,6660,64,0,0,0,0,2,0,0,0,0,0,0,0,"Onslaught Harbor Guard - Combat CMC - Cast 'Shoot'"),
+(@ENTRY,0,1,0,0,0,100,0,8000,8000,12000,14000,11,50750,0,0,0,0,0,1,0,0,0,0,0,0,0,"Onslaught Harbor Guard - Combat - Cast 'Raven Heal'");
+
+-- Sifreldar Runekeeper SAI
+SET @ENTRY := 29331;
+UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,0,0,0,0,0,100,0,0,0,3400,4800,11,20792,64,0,0,0,0,2,0,0,0,0,0,0,0,"Sifreldar Runekeeper - Combat CMC - Cast 'Frostbolt'"),
+(@ENTRY,0,1,0,2,0,100,1,0,30,15000,22000,11,52714,1,0,0,0,0,1,0,0,0,0,0,0,0,"Sifreldar Runekeeper - 0-30% Health - Cast 'Revitalizing Rune' (No Repeat)");
+
+-- Onslaught Raven Bishop SAI
+SET @ENTRY := 29338;
+UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,0,0,0,0,0,100,0,0,0,3400,4700,11,50740,64,0,0,0,0,2,0,0,0,0,0,0,0,"Onslaught Raven Bishop - Combat CMC - Cast 'Raven Flock'"),
+(@ENTRY,0,1,0,2,0,100,1,10,50,2000,8000,11,50750,0,0,0,0,0,2,0,0,0,0,0,0,0,"Onslaught Raven Bishop - 10-50% Health - Cast 'Raven Heal' (No Repeat)");
+
+-- Savage Hill Scavenger SAI
+SET @ENTRY := 29404;
+UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,0,0,0,0,0,100,0,0,0,5000,8000,11,50403,64,0,0,0,0,5,0,0,0,0,0,0,0,"Savage Hill Scavenger - Combat CMC - Cast 'Bone Toss'");
+
+-- Savage Hill Mystic SAI
+SET @ENTRY := 29622;
+UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,0,0,0,0,0,100,0,0,0,4400,5800,11,50273,64,0,0,0,0,2,0,0,0,0,0,0,0,"Savage Hill Mystic - Combat CMC - Cast 'Arcane Barrage'"),
+(@ENTRY,0,1,0,2,0,100,1,0,15,0,0,25,1,0,0,0,0,0,1,0,0,0,0,0,0,0,"Savage Hill Mystic - 0-15% Health - Flee For Assist");
+
+-- Stormforged Tracker SAI
+SET @ENTRY := 29652;
+UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,0,0,0,0,0,100,0,0,0,2300,3900,11,6660,64,0,0,0,0,2,0,0,0,0,0,0,0,"Stormforged Tracker - Combat CMC - Cast 'Shoot'"),
+(@ENTRY,0,1,0,0,0,100,0,9000,12000,9000,12000,11,46982,1,0,0,0,0,5,0,0,0,0,0,0,0,"Stormforged Tracker - Combat - Cast 'Lightning Gun Shot'");
+
+-- Spitting Cobra SAI
+SET @ENTRY := 29774;
+UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,0,0,0,0,0,100,2,0,0,12000,15000,11,32860,64,0,0,0,0,2,0,0,0,0,0,0,0,"Spitting Cobra - Combat CMC - Cast 'Shadow Bolt' (Normal Dungeon)"),
+(@ENTRY,0,1,0,0,0,100,4,0,0,12000,15000,11,38378,64,0,0,0,0,2,0,0,0,0,0,0,0,"Spitting Cobra - Combat CMC - Cast 'Shadow Bolt' (Heroic Dungeon)"),
+(@ENTRY,0,2,0,0,0,100,2,5000,10000,17000,20000,11,55703,64,0,0,0,0,2,0,0,0,0,0,0,0,"Spitting Cobra - Combat CMC - Cast 'Cobra Strike' (Normal Dungeon)"),
+(@ENTRY,0,3,0,0,0,100,4,5000,10000,17000,20000,11,59020,64,0,0,0,0,2,0,0,0,0,0,0,0,"Spitting Cobra - Combat CMC - Cast 'Cobra Strike' (Heroic Dungeon)");
+
+-- Drakkari God Hunter SAI
+SET @ENTRY := 29820;
+UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,0,0,0,0,0,100,2,0,0,2300,5000,11,35946,64,0,0,0,0,2,0,0,0,0,0,0,0,"Drakkari God Hunter - Combat CMC - Cast 'Shoot' (Normal Dungeon)"),
+(@ENTRY,0,1,0,0,0,100,4,0,0,2300,5000,11,59146,64,0,0,0,0,2,0,0,0,0,0,0,0,"Drakkari God Hunter - Combat CMC - Cast 'Shoot' (Heroic Dungeon)"),
+(@ENTRY,0,2,0,0,0,100,2,7000,10000,12000,15000,11,55624,1,0,0,0,0,5,0,0,0,0,0,0,0,"Drakkari God Hunter - Combat - Cast 'Arcane Shot' (Normal Dungeon)"),
+(@ENTRY,0,3,0,0,0,100,4,7000,10000,12000,15000,11,58973,1,0,0,0,0,5,0,0,0,0,0,0,0,"Drakkari God Hunter - Combat - Cast 'Arcane Shot' (Heroic Dungeon)"),
+(@ENTRY,0,4,0,0,0,100,6,3000,5000,33000,37000,11,55798,1,0,0,0,0,1,0,0,0,0,0,0,0,"Drakkari God Hunter - Combat - Cast 'Flare' (Dungeon)"),
+(@ENTRY,0,5,0,0,0,100,6,18000,21000,19000,23000,11,55625,0,0,0,0,0,5,0,0,0,0,0,0,0,"Drakkari God Hunter - Combat - Cast 'Tranquillizing Shot' (Dungeon)"),
+(@ENTRY,0,6,0,2,0,100,6,0,30,12000,15000,11,31567,1,0,0,0,0,1,0,0,0,0,0,0,0,"Drakkari God Hunter - 0-30% Health - Cast 'Deterrence' (Dungeon)");
+
+-- Drakkari Fire Weaver SAI
+SET @ENTRY := 29822;
+UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,0,0,0,0,0,100,2,0,0,8000,9000,11,55659,64,0,0,0,0,2,0,0,0,0,0,0,0,"Drakkari Fire Weaver - Combat CMC - Cast 'Lava Burst' (Normal Dungeon)"),
+(@ENTRY,0,1,0,0,0,100,4,0,0,8000,9000,11,58972,64,0,0,0,0,2,0,0,0,0,0,0,0,"Drakkari Fire Weaver - Combat CMC - Cast 'Lava Burst' (Heroic Dungeon)"),
+(@ENTRY,0,2,0,0,0,100,2,4000,7000,12000,15000,11,55613,65,0,0,0,0,5,0,0,0,0,0,0,0,"Drakkari Fire Weaver - Combat CMC - Cast 'Flame Shock' (Normal Dungeon)"),
+(@ENTRY,0,3,0,0,0,100,4,4000,7000,10000,14000,11,58971,65,0,0,0,0,5,0,0,0,0,0,0,0,"Drakkari Fire Weaver - Combat CMC - Cast 'Flame Shock' (Heroic Dungeon)"),
+(@ENTRY,0,4,0,9,0,100,6,0,5,10000,16000,11,61362,1,0,0,0,0,1,0,0,0,0,0,0,0,"Drakkari Fire Weaver - 0-5 Range - Cast 'Blast Wave' (Dungeon)");
+
+-- Drakkari Battle Rider SAI
+SET @ENTRY := 29836;
+UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,0,0,0,0,0,100,2,0,0,5000,7000,11,55348,64,0,0,0,0,2,0,0,0,0,0,0,0,"Drakkari Battle Rider - Combat CMC - Cast 'Throw' (Normal Dungeon)"),
+(@ENTRY,0,1,0,0,0,100,4,0,0,5000,7000,11,58966,64,0,0,0,0,2,0,0,0,0,0,0,0,"Drakkari Battle Rider - Combat CMC - Cast 'Throw' (Heroic Dungeon)"),
+(@ENTRY,0,2,0,0,0,100,2,12000,15000,16000,22000,11,55521,33,0,0,0,0,6,0,0,0,0,0,0,0,"Drakkari Battle Rider - Combat - Cast 'Poisoned Spear' (Normal Dungeon)"),
+(@ENTRY,0,3,0,0,0,100,4,12000,15000,16000,22000,11,58967,33,0,0,0,0,6,0,0,0,0,0,0,0,"Drakkari Battle Rider - Combat - Cast 'Poisoned Spear' (Heroic Dungeon)");
+
+-- Mildred the Cruel SAI
+SET @ENTRY := 29885;
+UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,0,0,0,0,0,100,0,0,30,3400,4800,11,15587,64,0,0,0,0,2,0,0,0,0,0,0,0,"Mildred the Cruel - Combat CMC - Cast 'Mind Blast'"),
+(@ENTRY,0,1,0,0,0,100,0,7000,11000,12000,15000,11,14032,0,0,0,0,0,5,0,0,0,0,0,0,0,"Mildred the Cruel - Combat - Cast 'Shadow Word: Pain'"),
+(@ENTRY,0,2,0,2,0,100,0,0,15,10000,15000,11,47697,1,0,0,0,0,5,0,0,0,0,0,0,0,"Mildred the Cruel - 0-15% Health - Cast 'Shadow Word: Death'");
+
+-- K3 Bruiser SAI
+SET @ENTRY := 29910;
+UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,0,0,0,9,0,100,1,0,20,11000,16000,11,12024,1,0,0,0,0,2,0,0,0,0,0,0,0,"K3 Bruiser - Within 0-20 Range - Cast 'Net' (No Repeat)"),
+(@ENTRY,0,1,0,0,0,100,0,0,0,2300,3900,11,23337,64,0,0,0,0,2,0,0,0,0,0,0,0,"K3 Bruiser - Combat CMC - Cast 'Shoot'");
+
+-- Earthen Stoneguard SAI
+SET @ENTRY := 29960;
+UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,0,0,0,9,0,100,1,0,20,11000,16000,11,12024,1,0,0,0,0,2,0,0,0,0,0,0,0,"Earthen Stoneguard - Within 0-20 Range - Cast 'Net' (No Repeat)"),
+(@ENTRY,0,1,0,0,0,100,0,0,0,2300,3900,11,23337,64,0,0,0,0,2,0,0,0,0,0,0,0,"Earthen Stoneguard - Combat CMC - Cast 'Shoot'");
+
+-- Iron Dwarf Magus SAI
+SET @ENTRY := 29979;
+UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,0,0,0,0,0,100,0,0,30,3400,4800,11,12058,64,0,0,0,0,2,0,0,0,0,0,0,0,"Iron Dwarf Magus - Combat CMC - Cast 'Chain Lightning'");
diff --git a/sql/updates/world/2015_03_16_05_world.sql b/sql/updates/world/2015_03_16_05_world.sql
new file mode 100644
index 00000000000..fa123614224
--- /dev/null
+++ b/sql/updates/world/2015_03_16_05_world.sql
@@ -0,0 +1,173 @@
+-- Wastes Scavenger SAI
+SET @ENTRY := 28005;
+UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,0,0,0,0,0,100,0,0,0,3000,5000,11,50403,64,0,0,0,0,2,0,0,0,0,0,0,0,"Wastes Scavenger - Combat CMC - Cast 'Bone Toss'"),
+(@ENTRY,0,1,0,8,0,100,0,50430,0,0,0,80,2800500,2,0,0,0,0,1,0,0,0,0,0,0,0,"Wastes Scavenger - On spellhit Devour Ghoul - Run script");
+
+-- Emperor Cobra SAI
+SET @ENTRY := 28011;
+UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,0,0,0,0,0,100,0,0,0,3400,4800,11,32093,32,0,0,0,0,2,0,0,0,0,0,0,0,"Emperor Cobra - Combat CMC - Cast 'Poison Spit'");
+
+-- Rainspeaker Oracle SAI
+SET @ENTRY := 28025;
+UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,0,0,0,0,0,100,0,0,0,6000,8000,11,15305,64,0,0,0,0,2,0,0,0,0,0,0,0,"Rainspeaker Oracle - Combat CMC - Cast 'Chain Lightning'"),
+(@ENTRY,0,1,0,0,0,100,0,3000,6000,12000,15000,11,54919,1,0,0,0,0,5,0,0,0,0,0,0,0,"Rainspeaker Oracle - Combat - Cast 'Warped Armor'");
+
+-- Frenzyheart Tracker SAI
+SET @ENTRY := 28077;
+UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,0,0,1,54,0,100,0,0,0,0,0,66,0,0,0,0,0,0,21,50,0,0,0,0,0,0,"Frenzyheart Tracker - On Just Summoned - Set Orientation"),
+(@ENTRY,0,1,2,61,0,100,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,"Frenzyheart Tracker - On Just Summoned - Say Line 1"),
+(@ENTRY,0,2,0,61,0,100,0,0,0,0,0,41,8000,0,0,0,0,0,1,0,0,0,0,0,0,0,"Frenzyheart Tracker - On Just Summoned - Despawn After 8 seconds"),
+(@ENTRY,0,3,0,0,0,100,0,0,0,3000,5000,11,22907,64,0,0,0,0,2,0,0,0,0,0,0,0,"Frenzyheart Tracker - Combat CMC - Cast 'Shoot'"),
+(@ENTRY,0,4,0,0,0,100,0,10000,14000,60000,65000,11,53432,1,0,0,0,0,1,0,0,0,0,0,0,0,"Frenzyheart Tracker - Combat - Cast 'Bear Trap'");
+
+-- Frenzyheart Hunter SAI
+SET @ENTRY := 28079;
+UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,0,0,0,0,0,100,0,0,0,2300,3900,11,15547,64,0,0,0,0,2,0,0,0,0,0,0,0,"Frenzyheart Hunter - Combat CMC - Cast 'Shoot'"),
+(@ENTRY,0,1,0,0,0,100,0,8000,11000,12000,15000,11,52270,1,0,0,0,0,5,0,0,0,0,0,0,0,"Frenzyheart Hunter - Combat - Cast 'Multi-Shot'");
+
+-- Frenzyheart Scavenger SAI
+SET @ENTRY := 28081;
+UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,0,0,0,0,0,100,0,0,0,2300,3900,11,54617,64,0,0,0,0,2,0,0,0,0,0,0,0,"Frenzyheart Scavenger - Combat CMC - Cast 'Throw Spear'");
+
+-- Sparktouched Oracle SAI
+SET @ENTRY := 28112;
+UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,0,0,0,0,0,100,0,0,0,3400,4800,11,54916,64,0,0,0,0,2,0,0,0,0,0,0,0,"Sparktouched Oracle - Combat CMC - Cast 'Lightning Burst'"),
+(@ENTRY,0,1,0,9,0,100,0,0,30,9000,12000,11,12549,1,0,0,0,0,2,0,0,0,0,0,0,0,"Sparktouched Oracle - Within 0-30 Range - Cast 'Forked Lightning'");
+
+-- Don Carlos SAI
+SET @ENTRY := 28132;
+UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,0,0,0,1,0,100,7,1000,1000,0,0,11,50736,1,0,0,0,0,1,0,0,0,0,0,0,0,"Don Carlos - Out of Combat - Cast 'Summon Guerrero' (No Repeat) (Dungeon)"),
+(@ENTRY,0,1,0,0,0,100,2,0,0,2300,5000,11,16100,64,0,0,0,0,2,0,0,0,0,0,0,0,"Don Carlos - Combat CMC - Cast 'Shoot' (Normal Dungeon)"),
+(@ENTRY,0,2,0,0,0,100,4,0,0,2300,5000,11,16496,64,0,0,0,0,2,0,0,0,0,0,0,0,"Don Carlos - Combat CMC - Cast 'Shoot' (Heroic Dungeon)"),
+(@ENTRY,0,3,0,0,0,100,2,9000,14000,22000,26000,11,12024,1,0,0,0,0,5,0,0,0,0,0,0,0,"Don Carlos - In Combat - Cast 'Net' (Normal Dungeon)"),
+(@ENTRY,0,4,0,0,0,100,4,9000,14000,22000,26000,11,50762,1,0,0,0,0,5,0,0,0,0,0,0,0,"Don Carlos - In Combat - Cast 'Net' (Heroic Dungeon)");
+
+-- Snowflake SAI
+SET @ENTRY := 28153;
+UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,0,0,0,0,0,100,2,0,0,3400,4800,11,50721,64,0,0,0,0,2,0,0,0,0,0,0,0,"Snowflake - Combat CMC - Cast 'Frostbolt' (Normal Dungeon)"),
+(@ENTRY,0,1,0,0,0,100,4,0,0,3400,4800,11,59280,64,0,0,0,0,2,0,0,0,0,0,0,0,"Snowflake - Combat CMC - Cast 'Frostbolt' (Heroic Dungeon)"),
+(@ENTRY,0,2,0,0,0,100,7,5000,9000,0,0,11,44604,0,0,0,0,0,1,0,0,0,0,0,0,0,"Snowflake - In Combat - Cast 'Enchantment of Spell Haste' (No Repeat) (Dungeon)");
+
+-- Dark Necromancer SAI
+SET @ENTRY := 28200;
+UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,0,0,0,0,0,100,2,0,0,5000,7000,11,15537,64,0,0,0,0,2,0,0,0,0,0,0,0,"Dark Necromancer - Combat CMC - Cast 'Shadow Bolt' (Normal Dungeon)"),
+(@ENTRY,0,1,0,0,0,100,4,0,0,5000,7000,11,61558,64,0,0,0,0,2,0,0,0,0,0,0,0,"Dark Necromancer - Combat CMC - Cast 'Shadow Bolt' (Heroic Dungeon)"),
+(@ENTRY,0,2,0,0,0,100,2,7000,11000,21000,25000,11,20812,1,0,0,0,0,2,0,0,0,0,0,0,0,"Dark Necromancer - Combat - Cast 'Cripple' (Normal Dungeon)"),
+(@ENTRY,0,3,0,0,0,100,4,7000,11000,21000,25000,11,52498,1,0,0,0,0,2,0,0,0,0,0,0,0,"Dark Necromancer - Combat - Cast 'Cripple' (Heroic Dungeon)"),
+(@ENTRY,0,4,0,0,0,100,2,14000,18000,15000,21000,11,58772,1,0,0,0,0,6,0,0,0,0,0,0,0,"Dark Necromancer - Combat - Cast 'Drain Mana' (Normal Dungeon)"),
+(@ENTRY,0,5,0,0,0,100,4,14000,18000,15000,21000,11,58770,1,0,0,0,0,6,0,0,0,0,0,0,0,"Dark Necromancer - Combat - Cast 'Drain Mana' (Heroic Dungeon)");
+
+-- Drakkari Water Binder SAI
+SET @ENTRY := 28303;
+UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,0,0,0,0,0,100,0,0,0,2400,3800,11,9532,64,0,0,0,0,2,0,0,0,0,0,0,0,"Drakkari Water Binder - Combat CMC - Cast 'Lightning Bolt'"),
+(@ENTRY,0,1,0,0,0,100,0,8000,16000,25000,30000,11,54399,1,0,0,0,0,2,0,0,0,0,0,0,0,"Drakkari Water Binder - Combat - Cast 'Water Bubble'");
+
+-- Ymirjar Necromancer SAI
+SET @ENTRY := 28368;
+UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,0,0,0,0,0,100,2,0,0,5000,7000,11,51432,64,0,0,0,0,2,0,0,0,0,0,0,0,"Ymirjar Necromancer - Combat CMC - Cast 'Shadow Bolt' (Normal Dungeon)"),
+(@ENTRY,0,1,0,0,0,100,4,0,0,5000,7000,11,59254,64,0,0,0,0,2,0,0,0,0,0,0,0,"Ymirjar Necromancer - Combat CMC - Cast 'Shadow Bolt' (Heroic Dungeon)"),
+(@ENTRY,0,2,0,0,0,100,2,9000,14000,18000,22000,11,49205,0,0,0,0,0,5,0,0,0,0,0,0,0,"Ymirjar Necromancer - Combat - Cast 'Shadow Bolt Volley' (Normal Dungeon)"),
+(@ENTRY,0,3,0,0,0,100,4,9000,14000,18000,22000,11,59255,0,0,0,0,0,5,0,0,0,0,0,0,0,"Ymirjar Necromancer - Combat - Cast 'Shadow Bolt Volley' (Heroic Dungeon)");
+
+-- Har'koan Subduer SAI
+SET @ENTRY := 28403;
+UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,0,0,0,1,0,100,0,2000,20000,40000,60000,80,2840300,2,0,0,0,0,1,0,0,0,0,0,0,0,"Har'koan Subduer - Out of Combat - Run Script"),
+(@ENTRY,0,1,0,0,0,100,0,0,0,2800,3500,11,20822,64,0,0,0,0,2,0,0,0,0,0,0,0,"Har'koan Subduer - Combat CMC - Cast 'Frostbolt'"),
+(@ENTRY,0,2,0,2,0,100,1,0,15,0,0,25,1,0,0,0,0,0,1,0,0,0,0,0,0,0,"Har'koan Subduer - 0-15% Health - Flee For Assist (No Repeat)");
+
+-- Dragonflayer Spiritualist SAI
+SET @ENTRY := 28410;
+UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,0,0,0,0,0,100,6,0,0,2400,3800,11,51587,64,0,0,0,0,2,0,0,0,0,0,0,0,"Dragonflayer Spiritualist - Combat CMC - Cast 'Lightning Bolt' (Dungeon)"),
+(@ENTRY,0,1,0,0,0,100,6,1500,4000,8000,10000,11,51588,1,0,0,0,0,2,0,0,0,0,0,0,0,"Dragonflayer Spiritualist - Combat - Cast 'Flame Shock' (Dungeon)"),
+(@ENTRY,0,2,0,14,0,100,6,7000,100,7000,7000,11,51586,1,0,0,0,0,7,0,0,0,0,0,0,0,"Dragonflayer Spiritualist - Friendly At 7000 Health - Cast 'Healing Wave' (Dungeon)");
+
+-- Hath'ar Broodmaster SAI
+SET @ENTRY := 28412;
+UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,0,0,0,0,0,100,0,0,0,2400,3800,11,9613,64,0,0,0,0,2,0,0,0,0,0,0,0,"Hath'ar Broodmaster - Combat CMC - Cast 'Shadow Bolt'"),
+(@ENTRY,0,1,0,0,0,100,0,3000,5000,15000,25000,11,54453,1,0,0,0,0,2,0,0,0,0,0,0,0,"Hath'ar Broodmaster - Combat - Cast 'Web Wrap'");
+
+-- Hemet Nesingwary SAI
+SET @ENTRY := 28451;
+UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,0,0,0,0,0,100,0,0,0,2300,3900,11,51742,64,0,0,0,0,2,0,0,0,0,0,0,0,"Hemet Nesingwary - Combat CMC - Cast 'Arcane Shot'");
+
+-- Storming Vortex SAI
+SET @ENTRY := 28547;
+UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,0,0,0,0,0,100,2,0,0,3400,4800,11,53044,64,0,0,0,0,2,0,0,0,0,0,0,0,"Storming Vortex - Combat CMC - Cast 'Lightning Bolt' (Normal Dungeon)"),
+(@ENTRY,0,1,0,0,0,100,4,0,0,3400,4800,11,59169,64,0,0,0,0,2,0,0,0,0,0,0,0,"Storming Vortex - Combat CMC - Cast 'Lightning Bolt' (Heroic Dungeon)"),
+(@ENTRY,0,2,0,9,0,100,6,0,5,9000,18000,11,60236,0,0,0,0,0,6,0,0,0,0,0,0,0,"Storming Vortex - Within 0-5 Range - Cast 'Cyclone' (Dungeon)");
+
+-- Hardened Steel Skycaller SAI
+SET @ENTRY := 28580;
+UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,0,0,0,0,0,100,2,0,0,2300,5000,11,16100,64,0,0,0,0,2,0,0,0,0,0,0,0,"Hardened Steel Skycaller - Combat CMC - Cast 'Shoot' (Normal Dungeon)"),
+(@ENTRY,0,1,0,0,0,100,4,0,0,2300,5000,11,61515,64,0,0,0,0,2,0,0,0,0,0,0,0,"Hardened Steel Skycaller - Combat CMC - Cast 'Shoot' (Heroic Dungeon)"),
+(@ENTRY,0,2,0,0,0,100,2,9000,12000,15000,20000,11,52754,0,0,0,0,0,5,0,0,0,0,0,0,0,"Hardened Steel Skycaller - Combat - Cast 'Impact Shot' (Normal Dungeon)"),
+(@ENTRY,0,3,0,0,0,100,2,7000,12000,12000,18000,11,52775,0,0,0,0,0,5,0,0,0,0,0,0,0,"Hardened Steel Skycaller - Combat - Cast 'Impact Multi-Shot' (Normal Dungeon)"),
+(@ENTRY,0,4,0,0,0,100,4,9000,12000,15000,20000,11,59148,0,0,0,0,0,5,0,0,0,0,0,0,0,"Hardened Steel Skycaller - Combat - Cast 'Impact Shot' (Heroic Dungeon)"),
+(@ENTRY,0,5,0,0,0,100,4,7000,12000,12000,18000,11,59147,0,0,0,0,0,5,0,0,0,0,0,0,0,"Hardened Steel Skycaller - Combat - Cast 'Impact Multi-Shot' (Heroic Dungeon)"),
+(@ENTRY,0,6,0,9,0,100,6,0,5,6000,9000,11,61507,0,0,0,0,0,1,0,0,0,0,0,0,0,"Hardened Steel Skycaller - 0-5 Range - Cast 'Disengage' (Dungeon)");
+
+-- Titanium Vanguard SAI
+SET @ENTRY := 28838;
+UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,0,0,0,0,0,100,3,0,0,0,0,11,53059,0,0,0,0,0,2,0,0,0,0,0,0,0,"Titanium Vanguard - On Aggro - Cast 'Poison Tipped Spear' (No Repeat) (Normal Dungeon)"),
+(@ENTRY,0,1,0,9,0,100,2,5,30,14000,21000,11,53059,0,0,0,0,0,2,0,0,0,0,0,0,0,"Titanium Vanguard - Within 5-30 Range - Cast 'Poison Tipped Spear' (Normal Dungeon)"),
+(@ENTRY,0,2,0,0,0,100,5,0,0,0,0,11,59178,0,0,0,0,0,2,0,0,0,0,0,0,0,"Titanium Vanguard - On Aggro - Cast 'Poison Tipped Spear' (No Repeat) (Heroic Dungeon)"),
+(@ENTRY,0,3,0,9,0,100,4,5,30,14000,21000,11,59178,0,0,0,0,0,2,0,0,0,0,0,0,0,"Titanium Vanguard - Within 5-30 Range - Cast 'Poison Tipped Spear' (Heroic Dungeon)"),
+(@ENTRY,0,4,0,0,0,100,7,4000,6000,0,0,11,58619,0,0,0,0,0,2,0,0,0,0,0,0,0,"Titanium Vanguard - In Combat - Cast 'Charge' (No Repeat) (Dungeon)"),
+(@ENTRY,0,5,0,0,0,100,6,12000,15000,12000,15000,11,58619,0,0,0,0,0,6,0,0,0,0,0,0,0,"Titanium Vanguard - In Combat - Cast 'Charge' (Dungeon)");
diff --git a/sql/updates/world/2015_03_16_06_world.sql b/sql/updates/world/2015_03_16_06_world.sql
new file mode 100644
index 00000000000..237bbe658ce
--- /dev/null
+++ b/sql/updates/world/2015_03_16_06_world.sql
@@ -0,0 +1,11 @@
+--
+DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=17 AND `SourceEntry`=46104;
+INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`SourceId`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionTarget`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`NegativeCondition`,`ErrorType`,`ErrorTextId`,`ScriptName`,`Comment`) VALUES
+(17,0,46104,0,0,31,1,3,25835,0,0,0,0,'','Nesingwary Trapper can be killed by the Trapped!');
+
+DELETE FROM `creature_text` WHERE `entry` IN (25835) ;
+INSERT INTO `creature_text` (`entry`, `groupid`, `id`, `text`, `type`, `language`, `probability`, `emote`, `duration`, `sound`, `comment`, `BroadcastTextID`) VALUES
+(25835, 0, 0, 'It''s a miracle! The beast skinned itself!', 12, 0, 100, 0, 0, 0, 'Nesingwary Trapper', 25029),
+(25835, 0, 1, 'Jackpot!', 12, 0, 100, 0, 0, 0, 'Nesingwary Trapper', 25034),
+(25835, 0, 2, 'Stupid beasts!', 12, 0, 100, 0, 0, 0, 'Nesingwary Trapper', 25030),
+(25835, 0, 3, 'This is the last one that I need for the set of Nesingwary steak knives!', 12, 0, 100, 0, 0, 0, 'Nesingwary Trapper', 25031);
diff --git a/sql/updates/world/2015_03_17_00_world.sql b/sql/updates/world/2015_03_17_00_world.sql
new file mode 100644
index 00000000000..20167f615b6
--- /dev/null
+++ b/sql/updates/world/2015_03_17_00_world.sql
@@ -0,0 +1,342 @@
+-- Prince Raze SAI
+SET @ENTRY := 10647;
+UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,0,0,0,0,0,100,0,0,0,4700,5800,11,9053,64,0,0,0,0,2,0,0,0,0,0,0,0,"Prince Raze - Combat CMC - Cast 'Fireball'"),
+(@ENTRY,0,1,0,9,0,100,0,0,40,13000,16000,11,16570,1,0,0,0,0,5,0,0,0,0,0,0,0,"Prince Raze - 0-40 Range - Cast 'Charged Arcane Bolt'"),
+(@ENTRY,0,2,0,9,0,100,0,0,8,12000,18000,11,11969,1,0,0,0,0,1,0,0,0,0,0,0,0,"Prince Raze - 0-8 Range - Cast 'Fire Nova'"),
+(@ENTRY,0,3,4,2,0,100,1,0,15,0,0,25,1,0,0,0,0,0,1,0,0,0,0,0,0,0,"Prince Raze - 0-15% Health - Flee For Assist (No Repeat)"),
+(@ENTRY,0,4,0,61,0,100,0,0,0,0,0,11,6925,1,0,0,0,0,1,0,0,0,0,0,0,0,"Prince Raze - 0-15% Health - Cast 'Gift of the Xavian' (No Repeat)");
+
+-- Summoned Blackhand Dreadweaver SAI
+SET @ENTRY := 10680;
+UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,0,0,0,1,0,100,3,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,"Summoned Blackhand Dreadweaver - Out of Combat - Say Line 0 (No Repeat) (Normal Dungeon)"),
+(@ENTRY,0,1,0,0,0,100,2,0,0,2400,6400,11,12739,64,0,0,0,0,2,0,0,0,0,0,0,0,"Summoned Blackhand Dreadweaver - Combat CMC - Cast 'Shadow Bolt' (Normal Dungeon)"),
+(@ENTRY,0,2,0,0,0,100,2,14500,19200,27600,39600,11,7068,0,0,0,0,0,2,0,0,0,0,0,0,0,"Summoned Blackhand Dreadweaver - Combat - Cast 'Veil of Shadow' (Normal Dungeon)"),
+(@ENTRY,0,3,0,2,0,100,3,0,15,0,0,25,1,0,0,0,0,0,0,0,0,0,0,0,0,0,"Summoned Blackhand Dreadweaver - Between 0-15% Health - Flee For Assist (No Repeat) (Normal Dungeon)"),
+(@ENTRY,0,4,0,1,0,100,2,10000,10000,0,0,37,0,0,0,0,0,0,1,0,0,0,0,0,0,0,"Summoned Blackhand Dreadweaver - Out of Combat - Kill Self (No Repeat) (Normal Dungeon)");
+
+-- Duggan Wildhammer SAI
+SET @ENTRY := 10817;
+UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,0,0,0,0,0,100,0,0,0,2300,3900,11,15547,64,0,0,0,0,2,0,0,0,0,0,0,0,"Duggan Wildhammer - Combat CMC - Cast 'Shoot'"),
+(@ENTRY,0,1,0,9,0,100,0,0,5,6000,9000,11,15284,1,0,0,0,0,2,0,0,0,0,0,0,0,"Duggan Wildhammer - 0-5 Range - Cast 'Cleave'"),
+(@ENTRY,0,2,0,2,0,100,0,0,15,0,0,25,1,0,0,0,0,0,1,0,0,0,0,0,0,0,"Duggan Wildhammer - 0-15% Health - Flee For Assist");
+
+-- Death-Hunter Hawkspear SAI
+SET @ENTRY := 10824;
+UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,0,0,0,9,0,100,0,0,5,2300,3900,11,12057,0,0,0,0,0,2,0,0,0,0,0,0,0,"Ranger Lord Hawkspear - 0-5 Range - Cast 'Strike'"),
+(@ENTRY,0,1,0,9,0,100,0,0,5,7000,9000,11,11978,1,0,0,0,0,2,0,0,0,0,0,0,0,"Ranger Lord Hawkspear - 0-5 Range - Cast 'Kick'");
+
+-- Deathspeaker Selendre SAI
+SET @ENTRY := 10827;
+UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,0,0,0,0,0,100,0,0,0,3000,5000,11,12471,64,0,0,0,0,2,0,0,0,0,0,0,0,"Deathspeaker Selendre - Combat CMC - Cast 'Shadow Bolt'"),
+(@ENTRY,0,1,0,0,0,100,0,3000,5000,15000,18000,11,12889,1,0,0,0,0,2,0,0,0,0,0,0,0,"Deathspeaker Selendre - Combat - Cast 'Curse of Tongues'"),
+(@ENTRY,0,2,0,2,0,100,0,0,30,12000,19000,11,17238,0,0,0,0,0,2,0,0,0,0,0,0,0,"Deathspeaker Selendre - 0-30% Health - Cast 'Drain Life'");
+
+-- Risen Rifleman SAI
+SET @ENTRY := 11054;
+UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,0,0,0,0,0,100,2,0,0,2300,3900,11,17353,64,0,0,0,0,2,0,0,0,0,0,0,0,"Crimson Rifleman - Combat CMC - Cast 'Shoot' (Normal Dungeon)");
+
+-- Ragefire Shaman SAI
+SET @ENTRY := 11319;
+UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,0,0,0,0,0,100,2,0,0,2400,3800,11,9532,64,0,0,0,0,2,0,0,0,0,0,0,0,"Ragefire Shaman - Combat CMC - Cast 'Lightning Bolt' (Normal Dungeon)"),
+(@ENTRY,0,1,0,74,0,100,3,0,40,30000,35000,11,11986,1,0,0,0,0,9,0,0,0,0,0,0,0,"Ragefire Shaman - On Friendly Between 0-40% Health - Cast 'Healing Wave' (No Repeat) (Normal Dungeon)"),
+(@ENTRY,0,2,0,2,0,100,3,0,15,0,0,25,1,0,0,0,0,0,1,0,0,0,0,0,0,0,"Ragefire Shaman - Between 0-15% Health - Flee For Assist (No Repeat) (Normal Dungeon)");
+
+-- Searing Blade Warlock SAI
+SET @ENTRY := 11324;
+UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,0,0,0,1,0,100,3,1000,1000,0,0,11,12746,0,0,0,0,0,1,0,0,0,0,0,0,0,"Searing Blade Warlock - Out of Combat - Cast 'Summon Voidwalker' (No Repeat) (Normal Dungeon)"),
+(@ENTRY,0,1,0,0,0,100,2,0,0,3400,6500,11,20791,64,0,0,0,0,2,0,0,0,0,0,0,0,"Searing Blade Warlock - Combat CMC - Cast 'Shadow Bolt' (Normal Dungeon)"),
+(@ENTRY,0,2,0,2,0,100,3,0,15,0,0,25,1,0,0,0,0,0,1,0,0,0,0,0,0,0,"Searing Blade Warlock - Between 0-15% Health - Flee For Assist (No Repeat) (Normal Dungeon)");
+
+-- Gordok Ogre-Mage SAI
+SET @ENTRY := 11443;
+UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,0,0,0,4,0,20,1,0,0,0,0,1,0,0,0,0,0,0,7,0,0,0,0,0,0,0,"Gordok Ogre-Mage - On Aggro - Say Line 0 (No Repeat)"),
+(@ENTRY,0,1,0,0,0,100,0,0,0,2400,3800,11,20823,64,0,0,0,0,2,0,0,0,0,0,0,0,"Gordok Ogre-Mage - Combat CMC - Cast 'Fireball'"),
+(@ENTRY,0,2,0,0,0,100,0,5000,12000,35000,45000,11,6742,1,0,0,0,0,1,0,0,0,0,0,0,0,"Gordok Ogre-Mage - Combat - Cast 'Bloodlust'"),
+(@ENTRY,0,3,0,4,0,20,3,0,0,0,0,1,0,0,0,0,0,0,7,0,0,0,0,0,0,0,"Gordok Ogre-Mage - On Aggro - Say Line 0 (No Repeat) (Normal Dungeon)"),
+(@ENTRY,0,4,0,0,0,100,2,0,0,2400,3800,11,20823,64,0,0,0,0,2,0,0,0,0,0,0,0,"Gordok Ogre-Mage - Combat CMC - Cast 'Fireball' (Normal Dungeon)"),
+(@ENTRY,0,5,0,0,0,100,2,5000,12000,35000,45000,11,6742,1,0,0,0,0,1,0,0,0,0,0,0,0,"Gordok Ogre-Mage - Combat - Cast 'Bloodlust' (Normal Dungeon)");
+
+-- Gordok Mage-Lord SAI
+SET @ENTRY := 11444;
+UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,0,0,0,4,0,20,3,0,0,0,0,1,0,0,0,0,0,0,7,0,0,0,0,0,0,0,"Gordok Mage-Lord - On Aggro - Say Line 0 (No Repeat) (Normal Dungeon)"),
+(@ENTRY,0,1,0,0,0,100,2,0,0,2400,3800,11,15530,64,0,0,0,0,2,0,0,0,0,0,0,0,"Gordok Mage-Lord - Combat CMC - Cast 'Frostbolt' (Normal Dungeon)"),
+(@ENTRY,0,2,0,0,0,100,2,7000,14000,12000,15000,11,14145,0,0,0,0,0,2,0,0,0,0,0,0,0,"Gordok Mage-Lord - Combat - Cast 'Fire Blast' (Normal Dungeon)"),
+(@ENTRY,0,3,0,0,0,100,2,12000,17000,19000,25000,11,16102,0,0,0,0,0,5,0,0,0,0,0,0,0,"Gordok Mage-Lord - Combat - Cast 'Flamestrike' (Normal Dungeon)"),
+(@ENTRY,0,4,0,0,0,100,2,7000,9000,16000,20000,11,13323,1,0,0,0,0,6,0,0,0,0,0,0,0,"Gordok Mage-Lord - Combat - Cast 'Polymorph' (Normal Dungeon)"),
+(@ENTRY,0,5,6,2,0,100,3,0,30,0,0,11,16170,1,0,0,0,0,1,0,0,0,0,0,0,0,"Gordok Mage-Lord - Between 0-30% Health - Cast 'Bloodlust' (No Repeat) (Normal Dungeon)"),
+(@ENTRY,0,6,0,61,0,100,3,0,30,0,0,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,"Gordok Mage-Lord - Between 0-30% Health - Say Line 1 (No Repeat) (Normal Dungeon)");
+
+-- Gordok Warlock SAI
+SET @ENTRY := 11448;
+UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,0,0,0,1,0,100,2,1000,1000,1800000,1800000,11,13787,0,0,0,0,0,1,0,0,0,0,0,0,0,"Gordok Warlock - Out of Combat - Cast 'Demon Armor' (Normal Dungeon)"),
+(@ENTRY,0,1,0,1,0,100,3,3000,3000,0,0,11,22865,0,0,0,0,0,1,0,0,0,0,0,0,0,"Gordok Warlock - Out of Combat - Cast 'Summon Doomguard' (No Repeat) (Normal Dungeon)"),
+(@ENTRY,0,2,0,4,0,20,3,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,"Gordok Warlock - On Aggro - Say Line 0 (No Repeat) (Normal Dungeon)"),
+(@ENTRY,0,3,0,0,0,100,2,0,0,2400,3800,11,15232,64,0,0,0,0,2,0,0,0,0,0,0,0,"Gordok Warlock - Combat CMC - Cast 'Shadow Bolt' (Normal Dungeon)"),
+(@ENTRY,0,4,0,0,0,100,2,9000,15000,26000,30000,11,17883,1,0,0,0,0,2,0,0,0,0,0,0,0,"Gordok Warlock - Combat - Cast 'Immolate' (Normal Dungeon)"),
+(@ENTRY,0,5,0,0,0,100,2,5000,9000,20000,25000,11,13338,0,0,0,0,0,5,0,0,0,0,0,0,0,"Gordok Warlock - Combat - Cast 'Curse of Tongues' (Normal Dungeon)"),
+(@ENTRY,0,6,0,0,0,100,2,7000,15000,20000,26000,11,8994,1,0,0,0,0,6,0,0,0,0,0,0,0,"Gordok Warlock - Combat - Cast 'Banish' (Normal Dungeon)");
+
+-- Wildspawn Betrayer SAI
+SET @ENTRY := 11454;
+UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,0,0,0,0,0,100,2,0,0,2300,3900,11,16100,64,0,0,0,0,2,0,0,0,0,0,0,0,"Wildspawn Betrayer - Combat CMC - Cast 'Shoot' (Normal Dungeon)"),
+(@ENTRY,0,1,0,9,0,100,2,5,30,7800,11400,11,18649,40,0,0,0,0,2,0,0,0,0,0,0,0,"Wildspawn Betrayer - 5-30 Range - Cast 'Shadow Shot' (Normal Dungeon)"),
+(@ENTRY,0,2,0,9,0,100,2,5,30,9900,13600,11,7896,40,0,0,0,0,2,0,0,0,0,0,0,0,"Wildspawn Betrayer - 5-30 Range - Cast 'Exploding Shot' (Normal Dungeon)"),
+(@ENTRY,0,3,0,9,0,100,2,0,5,6000,11000,11,11428,0,0,0,0,0,2,0,0,0,0,0,0,0,"Wildspawn Betrayer - 0-5 Range - Cast 'Knockdown' (Normal Dungeon)"),
+(@ENTRY,0,4,0,2,0,100,3,0,15,0,0,25,1,0,0,0,0,0,1,0,0,0,0,0,0,0,"Wildspawn Betrayer - Between 0-15% Health - Flee For Assist (No Repeat) (Normal Dungeon)");
+
+-- Wildspawn Felsworn SAI
+SET @ENTRY := 11455;
+UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,0,0,0,1,0,100,2,1000,1000,1800000,1800000,11,12542,0,0,0,0,0,1,0,0,0,0,0,0,0,"Wildspawn Felsworn - Out of Combat - Cast 'Fear' (Normal Dungeon)"),
+(@ENTRY,0,1,0,0,0,100,2,0,0,2400,3800,11,15537,64,0,0,0,0,2,0,0,0,0,0,0,0,"Wildspawn Felsworn - Combat CMC - Cast 'Shadow Bolt' (Normal Dungeon)"),
+(@ENTRY,0,2,0,0,0,100,2,7000,12000,38000,45000,11,22417,1,0,0,0,0,1,0,0,0,0,0,0,0,"Wildspawn Felsworn - Combat - Cast 'Shadow Shield' (Normal Dungeon)"),
+(@ENTRY,0,3,0,0,1,100,2,11000,17000,23000,30000,11,15654,0,0,0,0,0,2,0,0,0,0,0,0,0,"Wildspawn Felsworn - Combat - Cast 'Shadow Word: Pain' (Normal Dungeon)"),
+(@ENTRY,0,4,0,0,0,100,2,6000,10000,10000,15000,11,12542,1,0,0,0,0,5,0,0,0,0,0,0,0,"Wildspawn Felsworn - Combat - Cast 'Fear' (Normal Dungeon)");
+
+-- Wildspawn Hellcaller SAI
+SET @ENTRY := 11457;
+UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,0,0,0,0,0,100,2,0,0,2400,3800,11,15228,64,0,0,0,0,2,0,0,0,0,0,0,0,"Wildspawn Hellcaller - Combat CMC - Cast 'Fireball' (Normal Dungeon)"),
+(@ENTRY,0,1,0,0,0,100,2,8000,14000,18000,25000,11,20754,3,0,0,0,0,2,0,0,0,0,0,0,0,"Wildspawn Hellcaller - Combat - Cast 'Rain of Fire' (Normal Dungeon)"),
+(@ENTRY,0,2,0,2,0,100,3,0,15,0,0,25,1,0,0,0,0,0,1,0,0,0,0,0,0,0,"Wildspawn Hellcaller - 0-15% Health - Flee For Assist (No Repeat) (Normal Dungeon)");
+
+-- Highborne Summoner SAI
+SET @ENTRY := 11466;
+UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,0,0,0,0,0,100,2,0,0,2400,3800,11,12466,64,0,0,0,0,2,0,0,0,0,0,0,0,"Highborne Summoner - Combat CMC - Cast 'Fireball' (Normal Dungeon)"),
+(@ENTRY,0,1,0,0,0,100,2,8000,11000,9000,12000,11,13341,0,0,0,0,0,5,0,0,0,0,0,0,0,"Highborne Summoner - Combat - Cast 'Fire Blast' (Normal Dungeon)"),
+(@ENTRY,0,2,0,0,0,100,2,12000,16000,18000,22000,11,15063,1,0,0,0,0,1,0,0,0,0,0,0,0,"Highborne Summoner - Combat - Cast 'Frost Nova' (Normal Dungeon)");
+
+-- Eldreth Apparition SAI
+SET @ENTRY := 11471;
+UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,0,0,0,1,0,100,2,1000,1000,1800000,1800000,11,18100,1,0,0,0,0,1,0,0,0,0,0,0,0,"Eldreth Apparition - Out of Combat - Cast 'Frost Armor' (Normal Dungeon)"),
+(@ENTRY,0,1,0,0,0,100,2,0,0,2400,3800,11,16799,64,0,0,0,0,2,0,0,0,0,0,0,0,"Eldreth Apparition - Combat CMC - Cast 'Frostbolt' (Normal Dungeon)"),
+(@ENTRY,0,2,0,0,0,100,2,7000,12000,20000,27500,11,22744,1,0,0,0,0,6,0,0,0,0,0,0,0,"Eldreth Apparition - Combat - Cast 'Chains of Ice' (Normal Dungeon)"),
+(@ENTRY,0,3,0,0,0,100,2,11000,14000,20000,30000,11,15244,1,0,0,0,0,2,0,0,0,0,0,0,0,"Eldreth Apparition - Combat - Cast 'Cone of Cold' (Normal Dungeon)");
+
+-- Irondeep Shaman SAI
+SET @ENTRY := 11600;
+UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,0,0,0,0,0,100,2,0,0,3400,4800,11,15801,64,0,0,0,0,2,0,0,0,0,0,0,0,"Irondeep Shaman - Combat CMC - Cast 'Lightning Bolt' (Normal Dungeon)"),
+(@ENTRY,0,1,0,0,0,100,2,7000,9000,55000,65000,11,15786,1,0,0,0,0,1,0,0,0,0,0,0,0,"Irondeep Shaman - Combat - Cast 'Earthbind Totem' (Normal Dungeon)"),
+(@ENTRY,0,2,0,2,0,100,2,0,50,15000,20000,11,12492,1,0,0,0,0,1,0,0,0,0,0,0,0,"Irondeep Shaman - 0-50% Health - Cast 'Healing Wave' (Normal Dungeon)"),
+(@ENTRY,0,3,0,2,0,100,3,0,15,0,0,25,1,0,0,0,0,0,1,0,0,0,0,0,0,0,"Irondeep Shaman - 0-15% Health - Flee For Assist (No Repeat) (Normal Dungeon)");
+
+-- Whitewhisker Geomancer SAI
+SET @ENTRY := 11604;
+UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,0,0,0,0,0,100,2,0,0,3400,4800,11,15228,64,0,0,0,0,2,0,0,0,0,0,0,0,"Whitewhisker Geomancer - Combat CMC - Cast 'Fireball' (Normal Dungeon)"),
+(@ENTRY,0,1,0,0,0,100,2,500,1000,600000,600000,11,18968,1,0,0,0,0,1,0,0,0,0,0,0,0,"Whitewhisker Geomancer - Combat - Cast 'Fire Shield' (Normal Dungeon)"),
+(@ENTRY,0,2,0,2,0,100,3,0,15,0,0,25,1,0,0,0,0,0,1,0,0,0,0,0,0,0,"Whitewhisker Geomancer - 0-15% Health - Flee For Assist (No Repeat) (Normal Dungeon)");
+
+-- Morloch SAI
+SET @ENTRY := 11657;
+UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,0,0,0,0,0,100,2,0,0,3400,4800,11,15537,64,0,0,0,0,2,0,0,0,0,0,0,0,"Morloch - Combat CMC - Cast 'Shadow Bolt' (Normal Dungeon)"),
+(@ENTRY,0,1,0,0,0,100,2,6000,9000,120000,130000,11,12741,1,0,0,0,0,2,0,0,0,0,0,0,0,"Morloch - Combat - Cast 'Curse of Weakness' (Normal Dungeon)"),
+(@ENTRY,0,2,0,0,0,100,2,11000,14000,9000,15000,11,17228,0,0,0,0,0,2,0,0,0,0,0,0,0,"Morloch - Combat - Cast 'Shadow Bolt Volley' (Normal Dungeon)");
+
+-- Snowblind Windcaller SAI
+SET @ENTRY := 11675;
+UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,0,0,0,0,0,100,2,0,0,3400,4800,11,9532,64,0,0,0,0,2,0,0,0,0,0,0,0,"Snowblind Windcaller - Combat CMC - Cast 'Lightning Bolt' (Normal Dungeon)"),
+(@ENTRY,0,1,0,0,0,100,2,5000,8000,12000,16000,11,9532,1,0,0,0,0,6,0,0,0,0,0,0,0,"Snowblind Windcaller - Combat - Cast 'Lightning Bolt' (Normal Dungeon)");
+
+-- Horde Scout SAI
+SET @ENTRY := 11680;
+UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,0,0,0,4,0,15,1,0,0,0,0,1,0,0,0,0,0,0,7,0,0,0,0,0,0,0,"Horde Scout - On Aggro - Say Line 0 (No Repeat)"),
+(@ENTRY,0,1,0,0,0,100,0,0,0,2300,3900,11,6660,64,0,0,0,0,2,0,0,0,0,0,0,0,"Horde Scout - Combat CMC - Cast 'Shoot'"),
+(@ENTRY,0,2,0,9,0,100,0,5,30,12000,15000,11,18545,0,0,0,0,0,2,0,0,0,0,0,0,0,"Horde Scout - Within 5-30 Range - Cast 'Scorpid Sting'"),
+(@ENTRY,0,3,0,2,0,100,1,0,15,0,0,25,1,0,0,0,0,0,1,0,0,0,0,0,0,0,"Horde Scout - 0-15% Health - Flee For Assist (No Repeat)");
+
+-- Warsong Shaman SAI
+SET @ENTRY := 11683;
+UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,0,0,0,0,0,100,0,0,0,3400,4800,11,20805,64,0,0,0,0,2,0,0,0,0,0,0,0,"Warsong Shaman - Combat CMC - Cast 'Lightning Bolt'"),
+(@ENTRY,0,1,0,2,0,100,0,0,30,30000,35000,11,6742,1,0,0,0,0,1,0,0,0,0,0,0,0,"Warsong Shaman - 0-30% Health - Cast 'Bloodlust'"),
+(@ENTRY,0,2,0,2,0,100,1,0,15,0,0,25,1,0,0,0,0,0,1,0,0,0,0,0,0,0,"Warsong Shaman - 0-15% Health - Flee For Assist (No Repeat)");
+
+-- Wildpaw Mystic SAI
+SET @ENTRY := 11838;
+UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,0,0,0,0,0,100,2,0,0,3400,4800,11,37361,64,0,0,0,0,2,0,0,0,0,0,0,0,"Wildpaw Mystic - Combat CMC - Cast 'Arcane Bolt' (Normal Dungeon)"),
+(@ENTRY,0,1,0,0,0,100,2,6000,9000,16000,19000,11,12058,1,0,0,0,0,2,0,0,0,0,0,0,0,"Wildpaw Mystic - Combat - Cast 'Chain Lightning' (Normal Dungeon)"),
+(@ENTRY,0,2,0,2,0,100,2,0,50,12000,16000,11,11986,1,0,0,0,0,1,0,0,0,0,0,0,0,"Wildpaw Mystic - 0-50% Health - Cast 'Healing Wave' (Normal Dungeon)");
+
+-- Nathanos Blightcaller SAI
+SET @ENTRY := 11878;
+UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,0,0,0,0,0,100,0,0,0,2300,3900,11,6660,64,0,0,0,0,2,0,0,0,0,0,0,0,"Nathanos Blightcaller - Combat CMC - Cast 'Shoot'"),
+(@ENTRY,0,1,0,0,0,100,0,4000,6000,8000,11000,11,18651,0,0,0,0,0,5,0,0,0,0,0,0,0,"Nathanos Blightcaller - Combat - Cast 'Multi-Shot'"),
+(@ENTRY,0,2,0,9,0,100,0,0,5,7000,9000,11,6253,1,0,0,0,0,2,0,0,0,0,0,0,0,"Nathanos Blightcaller - 0-5 Range - Cast 'Backhand'"),
+(@ENTRY,0,3,0,15,0,100,1,0,0,10,0,11,13704,1,0,0,0,0,1,0,0,0,0,0,0,0,"Nathanos Blightcaller - Friendly Crowd Controlled - Cast 'Psychic Scream'");
+
+-- Lord Vyletongue SAI
+SET @ENTRY := 12236;
+UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,0,0,0,0,0,100,2,0,0,2300,3900,11,16100,64,0,0,0,0,2,0,0,0,0,0,0,0,"Lord Vyletongue - Combat CMC - Cast 'Shoot'"),
+(@ENTRY,0,1,0,9,0,100,2,5,30,7000,9500,11,21390,1,0,0,0,0,2,0,0,0,0,0,0,0,"Lord Vyletongue - 5-30 Range - Cast 'Multi-Shot'"),
+(@ENTRY,0,2,0,0,0,100,2,20000,30000,20000,30000,11,21655,1,0,0,0,0,1,0,0,0,0,0,0,0,"Lord Vyletongue - Combat - Cast 'Blink'"),
+(@ENTRY,0,3,0,0,0,100,2,8000,12000,14000,18000,11,7964,0,0,0,0,0,1,0,0,0,0,0,0,0,"Lord Vyletongue - Combat - Cast 'Smoke Bomb'");
+
+-- Quel'Lithien Protector SAI
+SET @ENTRY := 12322;
+UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,0,0,0,0,0,100,0,0,0,2300,3900,11,15547,64,0,0,0,0,2,0,0,0,0,0,0,0,"Quel'Lithien Protector - Combat CMC - Cast 'Shoot'"),
+(@ENTRY,0,1,0,9,0,100,0,0,5,5000,7000,11,12057,0,0,0,0,0,2,0,0,0,0,0,0,0,"Quel'Lithien Protector - 0-5 Range - Cast 'Strike'"),
+(@ENTRY,0,2,0,9,0,100,0,0,5,8000,13000,11,11978,0,0,0,0,0,2,0,0,0,0,0,0,0,"Quel'Lithien Protector - 0-5 Range - Cast 'Kick'"),
+(@ENTRY,0,3,0,2,0,100,1,0,15,0,0,25,1,0,0,0,0,0,1,0,0,0,0,0,0,0,"Quel'Lithien Protector - 0-15% Health - Flee For Assist (No Repeat)");
+
+-- Damned Soul SAI
+SET @ENTRY := 12378;
+UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,0,0,0,0,0,100,0,0,0,3400,4800,11,20825,64,0,0,0,0,2,0,0,0,0,0,0,0,"Damned Soul - Combat CMC - Cast 'Shadow Bolt'"),
+(@ENTRY,0,1,0,0,0,100,0,7000,9000,7000,9000,11,13748,0,0,0,0,0,2,0,0,0,0,0,0,0,"Damned Soul - Combat - Cast 'Arcane Bolt'");
+
+-- Mastok Wrilehiss SAI
+SET @ENTRY := 12737;
+UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,0,0,0,0,0,100,0,0,0,2300,3900,11,15620,64,0,0,0,0,2,0,0,0,0,0,0,0,"Mastok Wrilehiss - Combat CMC - Cast 'Shoot'"),
+(@ENTRY,0,1,0,9,0,100,0,0,5,5000,7000,11,15284,0,0,0,0,0,2,0,0,0,0,0,0,0,"Mastok Wrilehiss - 0-5 Range - Cast 'Cleave'"),
+(@ENTRY,0,2,0,0,0,100,0,9000,15000,14000,18000,11,23600,1,0,0,0,0,1,0,0,0,0,0,0,0,"Mastok Wrilehiss - Combat - Cast 'Piercing Howl'"),
+(@ENTRY,0,3,4,2,0,100,0,0,30,120000,130000,11,8599,1,0,0,0,0,1,0,0,0,0,0,0,0,"Mastok Wrilehiss - 0-30% Health - Cast 'Enrage'"),
+(@ENTRY,0,4,0,61,0,100,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,"Mastok Wrilehiss - 0-30% Health - Say 0");
+
+DELETE FROM `creature_text` WHERE `entry` IN (12737);
+INSERT INTO `creature_text` (`entry`,`groupid`,`id`,`text`,`type`,`language`,`probability`,`emote`,`duration`,`sound`,`BroadcastTextId`,`comment`) VALUES
+(12737,0,0,'$s becomes enraged!',16,0,100,0,0,0,24144,'Mastok Wrilehiss enrage at 30%');
+
+-- Ashenvale Outrunner SAI
+SET @ENTRY := 12856;
+UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,0,0,0,0,0,100,0,0,0,2300,3900,11,6660,64,0,0,0,0,2,0,0,0,0,0,0,0,"Ashenvale Outrunner - Combat CMC - Cast 'Shoot'"),
+(@ENTRY,0,1,0,9,0,100,0,5,30,35900,52300,11,18545,1,0,0,0,0,2,0,0,0,0,0,0,0,"Ashenvale Outrunner - Within 5-30 Range - Cast 'Scorpid Sting'"),
+(@ENTRY,0,2,0,9,0,100,0,0,5,7100,15300,11,8646,0,0,0,0,0,2,0,0,0,0,0,0,0,"Ashenvale Outrunner - Within 0-5 Range - Cast 'Snap Kick'");
+
+-- Warsong Scout SAI
+SET @ENTRY := 12862;
+UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,0,0,0,0,0,100,0,0,0,2300,3900,11,6660,64,0,0,0,0,2,0,0,0,0,0,0,0,"Warsong Scout - Combat CMC - Cast 'Shoot'"),
+(@ENTRY,0,1,0,2,0,100,1,0,15,0,0,25,1,0,0,0,0,0,1,0,0,0,0,0,0,0,"Warsong Scout - 0-15% Health - Flee For Assist (No Repeat)");
+
+-- Warsong Runner SAI
+SET @ENTRY := 12863;
+UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,0,0,0,0,0,100,0,0,0,2300,3900,11,6660,64,0,0,0,0,2,0,0,0,0,0,0,0,"Warsong Runner - Combat CMC - Cast 'Shoot'"),
+(@ENTRY,0,1,0,2,0,100,1,0,15,0,0,25,1,0,0,0,0,0,1,0,0,0,0,0,0,0,"Warsong Runner - 0-15% Health - Flee For Assist (No Repeat)");
+
+-- Warsong Outrider SAI
+SET @ENTRY := 12864;
+UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,0,0,0,0,0,100,0,0,0,2300,3900,11,6660,64,0,0,0,0,2,0,0,0,0,0,0,0,"Warsong Outrider - Combat CMC - Cast 'Shoot'"),
+(@ENTRY,0,1,0,9,0,100,0,5,30,35900,52300,11,18545,1,0,0,0,0,2,0,0,0,0,0,0,0,"Warsong Outrider - Within 5-30 Range - Cast 'Scorpid Sting'");
+
+-- Ambassador Malcin SAI
+SET @ENTRY := 12865;
+UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,0,0,0,0,0,100,0,0,0,2400,3800,11,9613,64,0,0,0,0,2,0,0,0,0,0,0,0,"Ambassador Malcin - Combat CMC - Cast 'Shadow Bolt'"),
+(@ENTRY,0,1,0,0,0,100,0,5000,9000,15000,25000,11,8282,32,0,0,0,0,2,0,0,0,0,0,0,0,"Ambassador Malcin - Combat - Cast 'Curse of Blood'");
+
+-- Silverwing Sentinel SAI
+SET @ENTRY := 12896;
+UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,0,0,0,0,0,100,0,0,0,2300,3900,11,6660,64,0,0,0,0,2,0,0,0,0,0,0,0,"Silverwing Sentinel - Combat CMC - Cast 'Shoot'"),
+(@ENTRY,0,1,0,2,0,100,1,0,15,0,0,25,1,0,0,0,0,0,1,0,0,0,0,0,0,0,"Silverwing Sentinel - 0-15% Health - Flee For Assist (No Repeat)");
+
+-- Lorgus Jett SAI
+SET @ENTRY := 12902;
+UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,0,0,0,1,0,100,2,1000,1000,600000,600000,11,12550,1,0,0,0,0,1,0,0,0,0,0,0,0,"Lorgus Jett - Out of Combat - Cast 'Lightning Shield' (Normal Dungeon)"),
+(@ENTRY,0,1,0,0,0,100,2,0,0,2400,3800,11,12167,64,0,0,0,0,2,0,0,0,0,0,0,0,"Lorgus Jett - Combat CMC - Cast 'Lightning Bolt' (Normal Dungeon)");
+
+-- Mounted Ironforge Mountaineer SAI
+SET @ENTRY := 12996;
+UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0;
+INSERT INTO `smart_scripts` (`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`,`comment`) VALUES
+(@ENTRY,0,0,0,0,0,100,0,0,0,2300,3900,11,6660,64,0,0,0,0,2,0,0,0,0,0,0,0,"Mounted Ironforge Mountaineer - Combat CMC - Cast 'Shoot'"),
+(@ENTRY,0,1,0,2,0,100,1,0,15,0,0,25,1,0,0,0,0,0,1,0,0,0,0,0,0,0,"Mounted Ironforge Mountaineer - 0-15% Health - Flee For Assist (No Repeat)");
diff --git a/sql/updates/world/2015_03_17_01_world.sql b/sql/updates/world/2015_03_17_01_world.sql
new file mode 100644
index 00000000000..8b91179bb48
--- /dev/null
+++ b/sql/updates/world/2015_03_17_01_world.sql
@@ -0,0 +1,14 @@
+DELETE FROM `smart_scripts` WHERE `entryorguid`=202443 AND `source_type`=1;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=20244300 AND `source_type`=9;
+INSERT INTO `smart_scripts` (`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`, `comment`) VALUES
+(202443, 1, 0, 1, 64, 0, 100, 0, 0, 0, 0, 0, 64, 1, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'Dedication of Honor - On Gossip Hello - Store Targetlist'),
+(202443, 1, 1, 0, 61, 0, 100, 0, 0, 0, 0, 0, 80, 20244300, 2, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Dedication of Honor - On Gossip Hello - Run Script'),
+(202443, 1, 2, 0, 1, 0, 100, 1, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 14, 151164, 202616, 0, 0, 0, 0, 0, 'Dedication of Honor - OOC - Activate Go (No Repeat)'),
+(20244300, 9, 0, 0, 0, 0, 100, 0, 1000, 1000, 0, 0, 68, 16, 0, 0, 0, 0, 0, 12, 1, 0, 0, 0, 0, 0, 0, 'Dedication of Honor - On Script - Play Movie 16');
+DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=22 AND `SourceEntry`=202443 and `SourceId`=1;
+INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorType`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES
+(22, 1, 202443, 1, 0, 17, 0, 4530, 0, 0, 0, 0, 0, '', 'Only run SAI if Player has achievement'),
+(22, 1, 202443, 1, 1, 17, 0, 4597, 0, 0, 0, 0, 0, '', 'Only run SAI if Player has achievement'),
+(22, 3, 202443, 1, 0, 40, 1, 4576, 0, 0, 0, 0, 0, '', 'Only run SAI if realm first rewarded');
+UPDATE `gameobject` SET `state`=1 WHERE `guid`=151164;
+UPDATE `gameobject_template` SET `flags`=32 WHERE `entry`=202616;
diff --git a/sql/updates/world/2015_03_17_02_world.sql b/sql/updates/world/2015_03_17_02_world.sql
new file mode 100644
index 00000000000..79d0b382d12
--- /dev/null
+++ b/sql/updates/world/2015_03_17_02_world.sql
@@ -0,0 +1,35 @@
+DELETE FROM `creature_text` WHERE `entry` = 16287 AND `groupid`= 0;
+DELETE FROM `creature_text` WHERE `entry` = 10181 AND `groupid` = 2;
+INSERT INTO `creature_text` (`entry`, `groupid`, `id`, `text`, `type`, `language`, `probability`, `emote`, `duration`, `sound`, `BroadcastTextId`, `TextRange`, `comment`) VALUES
+(16287, 0, 0, 'That could have gone better. $n, come here, please. I have something I need you to take care of for me.', 15, 0, 100, 0, 0, 0, 12157, 0, 'Ambassador Sunsorrow SAY_SUNSORROW_WHISPER'),
+(10181, 2, 0, '%s looks down at the discarded necklace. In her sadness, the lady incants a glamour, which beckons forth Highborne spirits. The chamber resonates with their ancient song about the Sin''dorei...', 16, 0, 100, 0, 0, 0, 19197, 0, 'Lady Sylvanas Windrunner EMOTE_LAMENT');
+
+DELETE FROM `gossip_menu_option` WHERE `menu_id` = 7178 AND `id`= 0;
+INSERT INTO `gossip_menu_option` (`menu_id`, `id`, `option_icon`, `option_text`, `OptionBroadcastTextID`, `option_id`, `npc_option_npcflag`, `action_menu_id`, `action_poi_id`, `box_coded`, `box_money`, `box_text`, `BoxBroadcastTextId`) VALUES
+(7178, 0, 0, 'What is it that you have for me, ambassador?', 19205, 1, 1, 7178, 0, 0, 0, '', 0);
+
+UPDATE `creature_template` SET `AIName` = 'SmartAI' WHERE `entry` = 16287;
+DELETE FROM `smart_scripts` WHERE `entryorguid` = 16287 AND `source_type` = 0 AND `id` IN (0, 1, 2);
+INSERT INTO `smart_scripts` (`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`, `comment`) VALUES
+(16287,0,0,1,62,0,100,0,7178,0,0,0,11,37084,1,0,0,0,0,7,0,0,0,0,0,0,0,'Ambassador Sunsorrow - On Gossip Option 0 Selected - Create Item \'Lament of the Highborne\''),
+(16287,0,1,0,61,0,100,0,0,0,0,0,98,7178,10378,0,0,0,0,7,0,0,0,0,0,0,0,'Ambassador Sunsorrow - On Gossip Option 0 Selected - SEND_GOSSIP_MENU TEXT'),
+(16287,0,2,0,64,0,100,0,0,0,0,0,98,7178,8458,0,0,0,0,7,0,0,0,0,0,0,0,'Ambassador Sunsorrow - On Gossip Hello - SEND_GOSSIP_MENU TEXT');
+
+DELETE FROM `npc_text` WHERE `id` IN (10378, 8458);
+INSERT INTO `npc_text` (`id`, `text0_0`, `text0_1`, `prob0`, `em0_1`, `BroadcastTextID0`) VALUES
+(8458, "Greetings, $r. I am Ambassador Sunsorrow of the sin'dorei, or blood elves as we are commonly known. I have high hopes that this new bond between us and the Horde will be mutually beneficial.", "Greetings, $r. I am Ambassador Sunsorrow of the sin'dorei, or blood elves as we are commonly known. I have high hopes that this new bond between us and the Horde will be mutually beneficial.", 1, 2, 12161),
+(10378, "Just a small songbook that I thought you might like to have. It contains the lyrics to a song known as the Lament of the Highborne; the one that Lady Sylvanas glamoured from the air.", "", 1, 1, 19206);
+
+DELETE FROM `gossip_menu` WHERE `entry`=7178 AND `text_id` IN (10378, 8458, 8740);
+INSERT INTO `gossip_menu` (`entry`, `text_id`) VALUES
+(7178,10378),
+(7178,8740),
+(7178,8458);
+
+DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId` = 15 AND `SourceGroup` = 7178 AND `SourceEntry` = 0 AND `SourceId` = 0;
+INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorType`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES
+(15, 7178, 0, 0, 0, 8, 0, 9180, 0, 0, 0, 0, 0, '', 'Ambassador Sunsorrow show gossip only if quest Journey to Undercity is rewarded'),
+(15, 7178, 0, 0, 0, 16, 0, 512, 0, 0, 0, 0, 0, '', 'Ambassador Sunsorrow show gossip only if player is Blood Elf'),
+(15, 7178, 0, 0, 0, 2, 0, 30632, 1, 0, 1, 0, 0, '', 'Ambassador Sunsorrow show gossip only if player doesn\'t have item Lament of Highborn');
+
+UPDATE `creature_text` SET `type` = 12 WHERE `entry` = 10181 AND `groupid` = 1;
diff --git a/sql/updates/world/2015_03_19_00_world.sql b/sql/updates/world/2015_03_19_00_world.sql
new file mode 100644
index 00000000000..1d87dafb9f1
--- /dev/null
+++ b/sql/updates/world/2015_03_19_00_world.sql
@@ -0,0 +1,4 @@
+UPDATE `trinity_string` SET `content_default` = 'Map: %u (%s) Zone: %u (%s) Area: %u (%s) Phase: %u\nX: %f Y: %f Z: %f Orientation: %f' WHERE `entry` = 101;
+DELETE FROM `trinity_string` WHERE `entry` = 178;
+INSERT INTO `trinity_string` (`entry`, `content_default`) VALUES
+(178, 'grid[%u,%u]cell[%u,%u] InstanceID: %u\n ZoneX: %f ZoneY: %f\nGroundZ: %f FloorZ: %f Have height data (Map: %u VMap: %u MMap: %u)');
diff --git a/src/genrev/CMakeLists.txt b/src/genrev/CMakeLists.txt
index 8ab3494cd70..e72643c6a6b 100644
--- a/src/genrev/CMakeLists.txt
+++ b/src/genrev/CMakeLists.txt
@@ -10,6 +10,6 @@
# Need to pass old ${CMAKE_BINARY_DIR} as param because its different at build stage
add_custom_target(revision.h ALL
- COMMAND ${CMAKE_COMMAND} -DNO_GIT=${WITHOUT_GIT} -DGIT_EXEC=${GIT_EXECUTABLE} -DBUILDDIR=${CMAKE_BINARY_DIR} -P ${CMAKE_SOURCE_DIR}/cmake/genrev.cmake
- WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
+ COMMAND "${CMAKE_COMMAND}" -DBUILDDIR="${CMAKE_BINARY_DIR}" -P "${CMAKE_SOURCE_DIR}/cmake/genrev.cmake" "${CMAKE_BINARY_DIR}"
+ WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}"
)
diff --git a/src/server/authserver/CMakeLists.txt b/src/server/authserver/CMakeLists.txt
index edd87a5c347..077cd15404b 100644
--- a/src/server/authserver/CMakeLists.txt
+++ b/src/server/authserver/CMakeLists.txt
@@ -43,6 +43,7 @@ endif()
include_directories(
${CMAKE_BINARY_DIR}
+ ${CMAKE_SOURCE_DIR}/dep/cppformat
${CMAKE_SOURCE_DIR}/src/server/shared
${CMAKE_SOURCE_DIR}/src/server/shared/Configuration
${CMAKE_SOURCE_DIR}/src/server/shared/Database
@@ -78,6 +79,7 @@ endif()
target_link_libraries(authserver
shared
+ format
${MYSQL_LIBRARY}
${OPENSSL_LIBRARIES}
${CMAKE_THREAD_LIBS_INIT}
diff --git a/src/server/collision/CMakeLists.txt b/src/server/collision/CMakeLists.txt
index e3c77736d5e..150c32a15a3 100644
--- a/src/server/collision/CMakeLists.txt
+++ b/src/server/collision/CMakeLists.txt
@@ -35,6 +35,7 @@ include_directories(
${CMAKE_SOURCE_DIR}/dep/g3dlite/include
${CMAKE_SOURCE_DIR}/dep/recastnavigation/Detour
${CMAKE_SOURCE_DIR}/dep/recastnavigation/Detour/Include
+ ${CMAKE_SOURCE_DIR}/dep/cppformat
${CMAKE_SOURCE_DIR}/src/server/shared
${CMAKE_SOURCE_DIR}/src/server/shared/Configuration
${CMAKE_SOURCE_DIR}/src/server/shared/Debugging
diff --git a/src/server/collision/Management/MMapManager.cpp b/src/server/collision/Management/MMapManager.cpp
index 170350d4de4..847b7bbd001 100644
--- a/src/server/collision/Management/MMapManager.cpp
+++ b/src/server/collision/Management/MMapManager.cpp
@@ -73,7 +73,7 @@ namespace MMAP
delete [] fileName;
- TC_LOG_INFO("maps", "MMAP:loadMapData: Loaded %03i.mmap", mapId);
+ TC_LOG_DEBUG("maps", "MMAP:loadMapData: Loaded %03i.mmap", mapId);
// store inside our map list
MMapData* mmap_data = new MMapData(mesh);
@@ -156,7 +156,7 @@ namespace MMAP
{
mmap->mmapLoadedTiles.insert(std::pair<uint32, dtTileRef>(packedGridPos, tileRef));
++loadedTiles;
- TC_LOG_INFO("maps", "MMAP:loadMap: Loaded mmtile %03i[%02i, %02i] into %03i[%02i, %02i]", mapId, x, y, mapId, header->x, header->y);
+ TC_LOG_DEBUG("maps", "MMAP:loadMap: Loaded mmtile %03i[%02i, %02i] into %03i[%02i, %02i]", mapId, x, y, mapId, header->x, header->y);
return true;
}
else
@@ -205,7 +205,7 @@ namespace MMAP
{
mmap->mmapLoadedTiles.erase(packedGridPos);
--loadedTiles;
- TC_LOG_INFO("maps", "MMAP:unloadMap: Unloaded mmtile %03i[%02i, %02i] from %03i", mapId, x, y, mapId);
+ TC_LOG_DEBUG("maps", "MMAP:unloadMap: Unloaded mmtile %03i[%02i, %02i] from %03i", mapId, x, y, mapId);
return true;
}
@@ -232,13 +232,13 @@ namespace MMAP
else
{
--loadedTiles;
- TC_LOG_INFO("maps", "MMAP:unloadMap: Unloaded mmtile %03i[%02i, %02i] from %03i", mapId, x, y, mapId);
+ TC_LOG_DEBUG("maps", "MMAP:unloadMap: Unloaded mmtile %03i[%02i, %02i] from %03i", mapId, x, y, mapId);
}
}
delete mmap;
loadedMMaps.erase(mapId);
- TC_LOG_INFO("maps", "MMAP:unloadMap: Unloaded %03i.mmap", mapId);
+ TC_LOG_DEBUG("maps", "MMAP:unloadMap: Unloaded %03i.mmap", mapId);
return true;
}
@@ -264,7 +264,7 @@ namespace MMAP
dtFreeNavMeshQuery(query);
mmap->navMeshQueries.erase(instanceId);
- TC_LOG_INFO("maps", "MMAP:unloadMapInstance: Unloaded mapId %03u instanceId %u", mapId, instanceId);
+ TC_LOG_DEBUG("maps", "MMAP:unloadMapInstance: Unloaded mapId %03u instanceId %u", mapId, instanceId);
return true;
}
@@ -295,7 +295,7 @@ namespace MMAP
return NULL;
}
- TC_LOG_INFO("maps", "MMAP:GetNavMeshQuery: created dtNavMeshQuery for mapId %03u instanceId %u", mapId, instanceId);
+ TC_LOG_DEBUG("maps", "MMAP:GetNavMeshQuery: created dtNavMeshQuery for mapId %03u instanceId %u", mapId, instanceId);
mmap->navMeshQueries.insert(std::pair<uint32, dtNavMeshQuery*>(instanceId, query));
}
diff --git a/src/server/collision/Maps/MapTree.cpp b/src/server/collision/Maps/MapTree.cpp
index 72435594ad0..b493ec18f5f 100644
--- a/src/server/collision/Maps/MapTree.cpp
+++ b/src/server/collision/Maps/MapTree.cpp
@@ -386,13 +386,12 @@ namespace VMAP
{
if (!iLoadedSpawns.count(referencedVal))
{
-#ifdef VMAP_DEBUG
if (referencedVal > iNTreeValues)
{
- TC_LOG_DEBUG("maps", "StaticMapTree::LoadMapTile() : invalid tree element (%u/%u)", referencedVal, iNTreeValues);
+ VMAP_ERROR_LOG("maps", "StaticMapTree::LoadMapTile() : invalid tree element (%u/%u) referenced in tile %s", referencedVal, iNTreeValues, tilefile.c_str());
continue;
}
-#endif
+
iTreeValues[referencedVal] = ModelInstance(spawn, model);
iLoadedSpawns[referencedVal] = 1;
}
diff --git a/src/server/collision/Maps/TileAssembler.cpp b/src/server/collision/Maps/TileAssembler.cpp
index 06540ecdc61..ee978211577 100644
--- a/src/server/collision/Maps/TileAssembler.cpp
+++ b/src/server/collision/Maps/TileAssembler.cpp
@@ -391,6 +391,18 @@ namespace VMAP
}
}
+ if (bounds.isEmpty())
+ {
+ std::cout << "\nModel " << std::string(buff, name_length) << " has empty bounding box" << std::endl;
+ continue;
+ }
+
+ if (!bounds.isFinite())
+ {
+ std::cout << "\nModel " << std::string(buff, name_length) << " has invalid bounding box" << std::endl;
+ continue;
+ }
+
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);
diff --git a/src/server/collision/Models/GameObjectModel.cpp b/src/server/collision/Models/GameObjectModel.cpp
index 993c298941c..05bd5d360c6 100644
--- a/src/server/collision/Models/GameObjectModel.cpp
+++ b/src/server/collision/Models/GameObjectModel.cpp
@@ -78,6 +78,12 @@ void LoadGameObjectModelList()
break;
}
+ if (v1.isNaN() || v2.isNaN())
+ {
+ VMAP_ERROR_LOG("misc", "File '%s' Model '%s' has invalid v1%s v2%s values!", VMAP::GAMEOBJECT_MODELS, std::string(buff, name_length).c_str(), v1.toString().c_str(), v2.toString().c_str());
+ continue;
+ }
+
model_list.insert
(
ModelList::value_type( displayId, GameobjectModelData(std::string(buff, name_length), AABox(v1, v2)) )
diff --git a/src/server/game/AI/CoreAI/UnitAI.cpp b/src/server/game/AI/CoreAI/UnitAI.cpp
index e7d39d715eb..5aa6ea8ea7a 100644
--- a/src/server/game/AI/CoreAI/UnitAI.cpp
+++ b/src/server/game/AI/CoreAI/UnitAI.cpp
@@ -141,7 +141,7 @@ void UnitAI::DoCast(uint32 spellId)
{
if (SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId))
{
- bool playerOnly = (spellInfo->AttributesEx3 & SPELL_ATTR3_ONLY_TARGET_PLAYERS) != 0;
+ bool playerOnly = spellInfo->HasAttribute(SPELL_ATTR3_ONLY_TARGET_PLAYERS);
target = SelectTarget(SELECT_TARGET_RANDOM, 0, spellInfo->GetMaxRange(false), playerOnly);
}
break;
@@ -156,7 +156,7 @@ void UnitAI::DoCast(uint32 spellId)
{
if (SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId))
{
- bool playerOnly = (spellInfo->AttributesEx3 & SPELL_ATTR3_ONLY_TARGET_PLAYERS) != 0;
+ bool playerOnly = spellInfo->HasAttribute(SPELL_ATTR3_ONLY_TARGET_PLAYERS);
float range = spellInfo->GetMaxRange(false);
DefaultTargetSelector targetSelector(me, range, playerOnly, -(int32)spellId);
@@ -213,7 +213,7 @@ void UnitAI::FillAISpellInfo()
if (!spellInfo)
continue;
- if (spellInfo->Attributes & SPELL_ATTR0_CASTABLE_WHILE_DEAD)
+ if (spellInfo->HasAttribute(SPELL_ATTR0_CASTABLE_WHILE_DEAD))
AIInfo->condition = AICOND_DIE;
else if (spellInfo->IsPassive() || spellInfo->GetDuration() == -1)
AIInfo->condition = AICOND_AGGRO;
diff --git a/src/server/game/AI/ScriptedAI/ScriptedCreature.cpp b/src/server/game/AI/ScriptedAI/ScriptedCreature.cpp
index b00a24129c3..135a0fcee93 100644
--- a/src/server/game/AI/ScriptedAI/ScriptedCreature.cpp
+++ b/src/server/game/AI/ScriptedAI/ScriptedCreature.cpp
@@ -663,3 +663,8 @@ void GetGameObjectListWithEntryInGrid(std::list<GameObject*>& list, WorldObject*
{
source->GetGameObjectListWithEntryInGrid(list, entry, maxSearchRange);
}
+
+void GetPlayerListInGrid(std::list<Player*>& list, WorldObject* source, float maxSearchRange)
+{
+ source->GetPlayerListInGrid(list, maxSearchRange);
+}
diff --git a/src/server/game/AI/ScriptedAI/ScriptedCreature.h b/src/server/game/AI/ScriptedAI/ScriptedCreature.h
index cff628a847e..1a4c3064a59 100644
--- a/src/server/game/AI/ScriptedAI/ScriptedCreature.h
+++ b/src/server/game/AI/ScriptedAI/ScriptedCreature.h
@@ -425,5 +425,6 @@ Creature* GetClosestCreatureWithEntry(WorldObject* source, uint32 entry, float m
GameObject* GetClosestGameObjectWithEntry(WorldObject* source, uint32 entry, float maxSearchRange);
void GetCreatureListWithEntryInGrid(std::list<Creature*>& list, WorldObject* source, uint32 entry, float maxSearchRange);
void GetGameObjectListWithEntryInGrid(std::list<GameObject*>& list, WorldObject* source, uint32 entry, float maxSearchRange);
+void GetPlayerListInGrid(std::list<Player*>& list, WorldObject* source, float maxSearchRange);
#endif // SCRIPTEDCREATURE_H_
diff --git a/src/server/game/AI/SmartScripts/SmartScript.cpp b/src/server/game/AI/SmartScripts/SmartScript.cpp
index e7e5f53f7a2..58b25781035 100644
--- a/src/server/game/AI/SmartScripts/SmartScript.cpp
+++ b/src/server/game/AI/SmartScripts/SmartScript.cpp
@@ -3167,7 +3167,7 @@ void SmartScript::ProcessEvent(SmartScriptHolder& e, Unit* unit, uint32 var0, ui
std::list<Creature*> list;
me->GetCreatureListWithEntryInGrid(list, e.event.distance.entry, (float)e.event.distance.dist);
- if (list.size() > 0)
+ if (!list.empty())
creature = list.front();
}
@@ -3198,7 +3198,7 @@ void SmartScript::ProcessEvent(SmartScriptHolder& e, Unit* unit, uint32 var0, ui
std::list<GameObject*> list;
me->GetGameObjectListWithEntryInGrid(list, e.event.distance.entry, (float)e.event.distance.dist);
- if (list.size() > 0)
+ if (!list.empty())
gameobject = list.front();
}
diff --git a/src/server/game/Achievements/AchievementMgr.cpp b/src/server/game/Achievements/AchievementMgr.cpp
index c1fde9f53d3..51106d7cfe1 100644
--- a/src/server/game/Achievements/AchievementMgr.cpp
+++ b/src/server/game/Achievements/AchievementMgr.cpp
@@ -55,6 +55,7 @@ bool AchievementCriteriaData::IsValid(AchievementCriteriaEntry const* criteria)
case ACHIEVEMENT_CRITERIA_TYPE_KILL_CREATURE:
case ACHIEVEMENT_CRITERIA_TYPE_KILL_CREATURE_TYPE:
case ACHIEVEMENT_CRITERIA_TYPE_WIN_BG:
+ case ACHIEVEMENT_CRITERIA_TYPE_DEATH_IN_DUNGEON:
case ACHIEVEMENT_CRITERIA_TYPE_FALL_WITHOUT_DYING:
case ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_QUEST: // only hardcoded list
case ACHIEVEMENT_CRITERIA_TYPE_CAST_SPELL:
@@ -700,58 +701,100 @@ void AchievementMgr::CheckAllAchievementCriteria()
}
static const uint32 achievIdByArenaSlot[MAX_ARENA_SLOT] = { 1057, 1107, 1108 };
-static const uint32 achievIdForDungeon[][4] =
-{
- // ach_cr_id, is_dungeon, is_raid, is_heroic_dungeon
- { 321, true, true, true },
- { 916, false, true, false },
- { 917, false, true, false },
- { 918, true, false, false },
- { 2219, false, false, true },
- { 0, false, false, false }
-};
/**
* this function will be called whenever the user might have done a criteria relevant action
*/
void AchievementMgr::UpdateAchievementCriteria(AchievementCriteriaTypes type, uint32 miscValue1 /*= 0*/, uint32 miscValue2 /*= 0*/, Unit* unit /*= NULL*/)
{
- TC_LOG_DEBUG("achievement", "AchievementMgr::UpdateAchievementCriteria(%u, %u, %u)", type, miscValue1, miscValue2);
+ if (type >= ACHIEVEMENT_CRITERIA_TYPE_TOTAL)
+ {
+ TC_LOG_DEBUG("achievement", "UpdateAchievementCriteria: Wrong criteria type %u", type);
+ return;
+ }
// disable for gamemasters with GM-mode enabled
if (m_player->IsGameMaster())
+ {
+ TC_LOG_DEBUG("achievement", "UpdateAchievementCriteria: [Player %s GM mode on] %s, %s (%u), %u, %u"
+ , m_player->GetName().c_str(), m_player->GetGUID().ToString().c_str(), AchievementGlobalMgr::GetCriteriaTypeString(type), type, miscValue1, miscValue2);
return;
+ }
+
+ TC_LOG_DEBUG("achievement", "UpdateAchievementCriteria: %s, %s (%u), %u, %u"
+ , m_player->GetGUID().ToString().c_str(), AchievementGlobalMgr::GetCriteriaTypeString(type), type, miscValue1, miscValue2);
AchievementCriteriaEntryList const& achievementCriteriaList = sAchievementMgr->GetAchievementCriteriaByType(type);
- for (AchievementCriteriaEntryList::const_iterator i = achievementCriteriaList.begin(); i != achievementCriteriaList.end(); ++i)
+ for (AchievementCriteriaEntry const* achievementCriteria : achievementCriteriaList)
{
- AchievementCriteriaEntry const* achievementCriteria = (*i);
AchievementEntry const* achievement = sAchievementMgr->GetAchievement(achievementCriteria->referredAchievement);
if (!achievement)
continue;
- if (!CanUpdateCriteria(achievementCriteria, achievement))
+ if (!CanUpdateCriteria(achievementCriteria, achievement, miscValue1, miscValue2, unit))
continue;
switch (type)
{
+ // special cases, db data is checked later
+ case ACHIEVEMENT_CRITERIA_TYPE_WIN_RATED_ARENA:
+ case ACHIEVEMENT_CRITERIA_TYPE_ROLL_NEED_ON_LOOT:
+ case ACHIEVEMENT_CRITERIA_TYPE_ROLL_GREED_ON_LOOT:
+ break;
+ default:
+ if (AchievementCriteriaDataSet const* data = sAchievementMgr->GetCriteriaDataSet(achievementCriteria))
+ if (!data->Meets(GetPlayer(), unit, miscValue1))
+ continue;
+ break;
+ }
+
+ switch (type)
+ {
// std. case: increment at 1
+ case ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_DAILY_QUEST:
+ case ACHIEVEMENT_CRITERIA_TYPE_DEATH_AT_MAP:
+ case ACHIEVEMENT_CRITERIA_TYPE_DEATH:
+ case ACHIEVEMENT_CRITERIA_TYPE_DEATH_IN_DUNGEON:
+ case ACHIEVEMENT_CRITERIA_TYPE_KILLED_BY_CREATURE:
+ case ACHIEVEMENT_CRITERIA_TYPE_KILLED_BY_PLAYER:
+ case ACHIEVEMENT_CRITERIA_TYPE_DEATHS_FROM:
+ case ACHIEVEMENT_CRITERIA_TYPE_BE_SPELL_TARGET:
+ case ACHIEVEMENT_CRITERIA_TYPE_CAST_SPELL:
+ case ACHIEVEMENT_CRITERIA_TYPE_BG_OBJECTIVE_CAPTURE:
+ case ACHIEVEMENT_CRITERIA_TYPE_HONORABLE_KILL_AT_AREA:
+ case ACHIEVEMENT_CRITERIA_TYPE_WIN_ARENA: // This also behaves like ACHIEVEMENT_CRITERIA_TYPE_WIN_RATED_ARENA
+ case ACHIEVEMENT_CRITERIA_TYPE_HONORABLE_KILL:
+ case ACHIEVEMENT_CRITERIA_TYPE_USE_ITEM:
+ case ACHIEVEMENT_CRITERIA_TYPE_HK_CLASS:
+ case ACHIEVEMENT_CRITERIA_TYPE_HK_RACE:
+ case ACHIEVEMENT_CRITERIA_TYPE_DO_EMOTE:
+ case ACHIEVEMENT_CRITERIA_TYPE_GET_KILLING_BLOWS:
case ACHIEVEMENT_CRITERIA_TYPE_NUMBER_OF_TALENT_RESETS:
+ case ACHIEVEMENT_CRITERIA_TYPE_USE_GAMEOBJECT:
+ case ACHIEVEMENT_CRITERIA_TYPE_BE_SPELL_TARGET2:
+ case ACHIEVEMENT_CRITERIA_TYPE_SPECIAL_PVP_KILL:
+ case ACHIEVEMENT_CRITERIA_TYPE_FISH_IN_GAMEOBJECT:
+ case ACHIEVEMENT_CRITERIA_TYPE_ON_LOGIN:
+ case ACHIEVEMENT_CRITERIA_TYPE_WIN_DUEL:
case ACHIEVEMENT_CRITERIA_TYPE_LOSE_DUEL:
case ACHIEVEMENT_CRITERIA_TYPE_CREATE_AUCTION:
- case ACHIEVEMENT_CRITERIA_TYPE_WON_AUCTIONS: /* FIXME: for online player only currently */
+ case ACHIEVEMENT_CRITERIA_TYPE_WON_AUCTIONS: /* FIXME: for online player only currently */
+ case ACHIEVEMENT_CRITERIA_TYPE_LOOT_EPIC_ITEM:
+ case ACHIEVEMENT_CRITERIA_TYPE_RECEIVE_EPIC_ITEM:
case ACHIEVEMENT_CRITERIA_TYPE_ROLL_NEED:
case ACHIEVEMENT_CRITERIA_TYPE_ROLL_GREED:
case ACHIEVEMENT_CRITERIA_TYPE_QUEST_ABANDONED:
case ACHIEVEMENT_CRITERIA_TYPE_FLIGHT_PATHS_TAKEN:
+ case ACHIEVEMENT_CRITERIA_TYPE_CAST_SPELL2:
case ACHIEVEMENT_CRITERIA_TYPE_ACCEPTED_SUMMONINGS:
case ACHIEVEMENT_CRITERIA_TYPE_USE_LFD_TO_GROUP_WITH_PLAYERS:
- // AchievementMgr::UpdateAchievementCriteria might also be called on login - skip in this case
- if (!miscValue1)
- continue;
SetCriteriaProgress(achievementCriteria, 1, PROGRESS_ACCUMULATE);
break;
// std case: increment at miscvalue1
+ case ACHIEVEMENT_CRITERIA_TYPE_WIN_BG:
+ case ACHIEVEMENT_CRITERIA_TYPE_DAMAGE_DONE:
+ case ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_BATTLEGROUND:
+ case ACHIEVEMENT_CRITERIA_TYPE_HEALING_DONE:
case ACHIEVEMENT_CRITERIA_TYPE_MONEY_FROM_VENDORS:
case ACHIEVEMENT_CRITERIA_TYPE_GOLD_SPENT_FOR_TALENTS:
case ACHIEVEMENT_CRITERIA_TYPE_MONEY_FROM_QUEST_REWARD:
@@ -759,14 +802,19 @@ void AchievementMgr::UpdateAchievementCriteria(AchievementCriteriaTypes type, ui
case ACHIEVEMENT_CRITERIA_TYPE_GOLD_SPENT_AT_BARBER:
case ACHIEVEMENT_CRITERIA_TYPE_GOLD_SPENT_FOR_MAIL:
case ACHIEVEMENT_CRITERIA_TYPE_LOOT_MONEY:
- case ACHIEVEMENT_CRITERIA_TYPE_GOLD_EARNED_BY_AUCTIONS:/* FIXME: for online player only currently */
+ case ACHIEVEMENT_CRITERIA_TYPE_GOLD_EARNED_BY_AUCTIONS: /* FIXME: for online player only currently */
case ACHIEVEMENT_CRITERIA_TYPE_TOTAL_DAMAGE_RECEIVED:
case ACHIEVEMENT_CRITERIA_TYPE_TOTAL_HEALING_RECEIVED:
- // AchievementMgr::UpdateAchievementCriteria might also be called on login - skip in this case
- if (!miscValue1)
- continue;
SetCriteriaProgress(achievementCriteria, miscValue1, PROGRESS_ACCUMULATE);
break;
+ // std case: increment at miscvalue2
+ case ACHIEVEMENT_CRITERIA_TYPE_KILL_CREATURE:
+ case ACHIEVEMENT_CRITERIA_TYPE_OWN_ITEM:
+ case ACHIEVEMENT_CRITERIA_TYPE_LOOT_ITEM:
+ case ACHIEVEMENT_CRITERIA_TYPE_KILL_CREATURE_TYPE:
+ case ACHIEVEMENT_CRITERIA_TYPE_LOOT_TYPE:
+ SetCriteriaProgress(achievementCriteria, miscValue2, PROGRESS_ACCUMULATE);
+ break;
// std case: high value at miscvalue1
case ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_AUCTION_BID:
case ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_AUCTION_SOLD: /* FIXME: for online player only currently */
@@ -774,92 +822,27 @@ void AchievementMgr::UpdateAchievementCriteria(AchievementCriteriaTypes type, ui
case ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_HIT_RECEIVED:
case ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_HEAL_CAST:
case ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_HEALING_RECEIVED:
- // AchievementMgr::UpdateAchievementCriteria might also be called on login - skip in this case
- if (!miscValue1)
- continue;
SetCriteriaProgress(achievementCriteria, miscValue1, PROGRESS_HIGHEST);
break;
-
- // specialized cases
- case ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_DAILY_QUEST:
- {
- // AchievementMgr::UpdateAchievementCriteria might also be called on login - skip in this case
- if (!miscValue1)
- continue;
-
- if (achievement->categoryId == CATEGORY_CHILDRENS_WEEK)
- {
- AchievementCriteriaDataSet const* data = sAchievementMgr->GetCriteriaDataSet(achievementCriteria);
- if (!data || !data->Meets(GetPlayer(), NULL))
- continue;
- }
-
- SetCriteriaProgress(achievementCriteria, 1, PROGRESS_ACCUMULATE);
- break;
- }
- case ACHIEVEMENT_CRITERIA_TYPE_WIN_BG:
- {
- // AchievementMgr::UpdateAchievementCriteria might also be called on login - skip in this case
- if (!miscValue1)
- continue;
- if (achievementCriteria->win_bg.bgMapID != GetPlayer()->GetMapId())
- continue;
-
- // those requirements couldn't be found in the dbc
- AchievementCriteriaDataSet const* data = sAchievementMgr->GetCriteriaDataSet(achievementCriteria);
- if (!data || !data->Meets(GetPlayer(), unit))
- continue;
-
- SetCriteriaProgress(achievementCriteria, miscValue1, PROGRESS_ACCUMULATE);
- break;
- }
- case ACHIEVEMENT_CRITERIA_TYPE_KILL_CREATURE:
- {
- // AchievementMgr::UpdateAchievementCriteria might also be called on login - skip in this case
- if (!miscValue1)
- continue;
- if (achievementCriteria->kill_creature.creatureID != miscValue1)
- continue;
-
- // those requirements couldn't be found in the dbc
- AchievementCriteriaDataSet const* data = sAchievementMgr->GetCriteriaDataSet(achievementCriteria);
- if (!data || !data->Meets(GetPlayer(), unit))
- continue;
-
- SetCriteriaProgress(achievementCriteria, miscValue2, PROGRESS_ACCUMULATE);
+ // std. case: set at 1
+ case ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_QUEST:
+ case ACHIEVEMENT_CRITERIA_TYPE_LEARN_SPELL:
+ case ACHIEVEMENT_CRITERIA_TYPE_EXPLORE_AREA:
+ case ACHIEVEMENT_CRITERIA_TYPE_VISIT_BARBER_SHOP:
+ case ACHIEVEMENT_CRITERIA_TYPE_EQUIP_EPIC_ITEM:
+ case ACHIEVEMENT_CRITERIA_TYPE_EQUIP_ITEM:
+ SetCriteriaProgress(achievementCriteria, 1, PROGRESS_SET);
break;
- }
- case ACHIEVEMENT_CRITERIA_TYPE_KILL_CREATURE_TYPE:
- {
- // AchievementMgr::UpdateAchievementCriteria might also be called on login - skip in this case
- if (!miscValue2)
- continue;
-
- // those requirements couldn't be found in the dbc
- AchievementCriteriaDataSet const* data = sAchievementMgr->GetCriteriaDataSet(achievementCriteria);
- if (!data || !data->Meets(GetPlayer(), unit, miscValue1))
- continue;
- SetCriteriaProgress(achievementCriteria, miscValue2, PROGRESS_ACCUMULATE);
- break;
- }
+ // specialized cases
case ACHIEVEMENT_CRITERIA_TYPE_REACH_LEVEL:
- if (AchievementCriteriaDataSet const* data = sAchievementMgr->GetCriteriaDataSet(achievementCriteria))
- if (!data->Meets(GetPlayer(), unit))
- continue;
SetCriteriaProgress(achievementCriteria, GetPlayer()->getLevel());
break;
case ACHIEVEMENT_CRITERIA_TYPE_REACH_SKILL_LEVEL:
- // update at loading or specific skill update
- if (miscValue1 && miscValue1 != achievementCriteria->reach_skill_level.skillID)
- continue;
if (uint32 skillvalue = GetPlayer()->GetBaseSkillValue(achievementCriteria->reach_skill_level.skillID))
SetCriteriaProgress(achievementCriteria, skillvalue);
break;
case ACHIEVEMENT_CRITERIA_TYPE_LEARN_SKILL_LEVEL:
- // update at loading or specific skill update
- if (miscValue1 && miscValue1 != achievementCriteria->learn_skill_level.skillID)
- continue;
if (uint32 maxSkillvalue = GetPlayer()->GetPureMaxSkillValue(achievementCriteria->learn_skill_level.skillID))
SetCriteriaProgress(achievementCriteria, maxSkillvalue);
break;
@@ -868,14 +851,12 @@ void AchievementMgr::UpdateAchievementCriteria(AchievementCriteriaTypes type, ui
SetCriteriaProgress(achievementCriteria, 1);
break;
case ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_QUEST_COUNT:
- {
SetCriteriaProgress(achievementCriteria, GetPlayer()->GetRewardedQuestCount());
break;
- }
case ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_DAILY_QUEST_DAILY:
{
time_t nextDailyResetTime = sWorld->GetNextDailyQuestsResetTime();
- CriteriaProgress *progress = GetCriteriaProgress(achievementCriteria);
+ CriteriaProgress const* progress = GetCriteriaProgress(achievementCriteria);
if (!miscValue1) // Login case.
{
@@ -904,10 +885,6 @@ void AchievementMgr::UpdateAchievementCriteria(AchievementCriteriaTypes type, ui
}
case ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_QUESTS_IN_ZONE:
{
- // speedup for non-login case
- if (miscValue1 && miscValue1 != achievementCriteria->complete_quests_in_zone.zoneID)
- continue;
-
uint32 counter = 0;
const RewardedQuestSet &rewQuests = GetPlayer()->getRewardedQuests();
@@ -920,231 +897,11 @@ void AchievementMgr::UpdateAchievementCriteria(AchievementCriteriaTypes type, ui
SetCriteriaProgress(achievementCriteria, counter);
break;
}
- case ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_BATTLEGROUND:
- // AchievementMgr::UpdateAchievementCriteria might also be called on login - skip in this case
- if (!miscValue1)
- continue;
- if (GetPlayer()->GetMapId() != achievementCriteria->complete_battleground.mapID)
- continue;
- SetCriteriaProgress(achievementCriteria, miscValue1, PROGRESS_ACCUMULATE);
- break;
- case ACHIEVEMENT_CRITERIA_TYPE_DEATH_AT_MAP:
- // AchievementMgr::UpdateAchievementCriteria might also be called on login - skip in this case
- if (!miscValue1)
- continue;
- if (GetPlayer()->GetMapId() != achievementCriteria->death_at_map.mapID)
- continue;
- SetCriteriaProgress(achievementCriteria, 1, PROGRESS_ACCUMULATE);
- break;
- case ACHIEVEMENT_CRITERIA_TYPE_DEATH:
- {
- // AchievementMgr::UpdateAchievementCriteria might also be called on login - skip in this case
- if (!miscValue1)
- continue;
- // skip wrong arena achievements, if not achievIdByArenaSlot then normal total death counter
- bool notfit = false;
- for (int j = 0; j < MAX_ARENA_SLOT; ++j)
- {
- if (achievIdByArenaSlot[j] == achievement->ID)
- {
- Battleground* bg = GetPlayer()->GetBattleground();
- if (!bg || !bg->isArena() || ArenaTeam::GetSlotByType(bg->GetArenaType()) != j)
- notfit = true;
-
- break;
- }
- }
- if (notfit)
- continue;
-
- SetCriteriaProgress(achievementCriteria, 1, PROGRESS_ACCUMULATE);
- break;
- }
- case ACHIEVEMENT_CRITERIA_TYPE_DEATH_IN_DUNGEON:
- {
- // AchievementMgr::UpdateAchievementCriteria might also be called on login - skip in this case
- if (!miscValue1)
- continue;
-
- Map const* map = GetPlayer()->IsInWorld() ? GetPlayer()->GetMap() : sMapMgr->FindMap(GetPlayer()->GetMapId(), GetPlayer()->GetInstanceId());
- if (!map || !map->IsDungeon())
- continue;
-
- // search case
- bool found = false;
- for (int j = 0; achievIdForDungeon[j][0]; ++j)
- {
- if (achievIdForDungeon[j][0] == achievement->ID)
- {
- if (map->IsRaid())
- {
- // if raid accepted (ignore difficulty)
- if (!achievIdForDungeon[j][2])
- break; // for
- }
- else if (GetPlayer()->GetDungeonDifficulty() == DUNGEON_DIFFICULTY_NORMAL)
- {
- // dungeon in normal mode accepted
- if (!achievIdForDungeon[j][1])
- break; // for
- }
- else
- {
- // dungeon in heroic mode accepted
- if (!achievIdForDungeon[j][3])
- break; // for
- }
-
- found = true;
- break; // for
- }
- }
- if (!found)
- continue;
-
- //FIXME: work only for instances where max == min for players
- if (map->ToInstanceMap()->GetMaxPlayers() != achievementCriteria->death_in_dungeon.manLimit)
- continue;
- SetCriteriaProgress(achievementCriteria, 1, PROGRESS_ACCUMULATE);
- break;
-
- }
- case ACHIEVEMENT_CRITERIA_TYPE_KILLED_BY_CREATURE:
- // AchievementMgr::UpdateAchievementCriteria might also be called on login - skip in this case
- if (!miscValue1)
- continue;
- if (miscValue1 != achievementCriteria->killed_by_creature.creatureEntry)
- continue;
- SetCriteriaProgress(achievementCriteria, 1, PROGRESS_ACCUMULATE);
- break;
- case ACHIEVEMENT_CRITERIA_TYPE_KILLED_BY_PLAYER:
- // AchievementMgr::UpdateAchievementCriteria might also be called on login - skip in this case
- if (!miscValue1)
- continue;
-
- // if team check required: must kill by opposition faction
- if (achievement->ID == 318 && miscValue2 == GetPlayer()->GetTeam())
- continue;
-
- SetCriteriaProgress(achievementCriteria, 1, PROGRESS_ACCUMULATE);
- break;
case ACHIEVEMENT_CRITERIA_TYPE_FALL_WITHOUT_DYING:
- {
- // AchievementMgr::UpdateAchievementCriteria might also be called on login - skip in this case
- if (!miscValue1)
- continue;
-
- // those requirements couldn't be found in the dbc
- AchievementCriteriaDataSet const* data = sAchievementMgr->GetCriteriaDataSet(achievementCriteria);
- if (!data || !data->Meets(GetPlayer(), unit))
- continue;
-
// miscvalue1 is the ingame fallheight*100 as stored in dbc
SetCriteriaProgress(achievementCriteria, miscValue1);
break;
- }
- case ACHIEVEMENT_CRITERIA_TYPE_DEATHS_FROM:
- // AchievementMgr::UpdateAchievementCriteria might also be called on login - skip in this case
- if (!miscValue1)
- continue;
- if (miscValue2 != achievementCriteria->death_from.type)
- continue;
- SetCriteriaProgress(achievementCriteria, 1, PROGRESS_ACCUMULATE);
- break;
- case ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_QUEST:
- {
- // if miscvalues != 0, it contains the questID.
- if (miscValue1)
- {
- if (miscValue1 != achievementCriteria->complete_quest.questID)
- continue;
- }
- else
- {
- // login case.
- if (!GetPlayer()->GetQuestRewardStatus(achievementCriteria->complete_quest.questID))
- continue;
- }
-
- if (AchievementCriteriaDataSet const* data = sAchievementMgr->GetCriteriaDataSet(achievementCriteria))
- if (!data->Meets(GetPlayer(), unit))
- continue;
-
- SetCriteriaProgress(achievementCriteria, 1);
- break;
- }
- case ACHIEVEMENT_CRITERIA_TYPE_BE_SPELL_TARGET:
- case ACHIEVEMENT_CRITERIA_TYPE_BE_SPELL_TARGET2:
- {
- if (!miscValue1 || miscValue1 != achievementCriteria->be_spell_target.spellID)
- continue;
-
- // those requirements couldn't be found in the dbc
- AchievementCriteriaDataSet const* data = sAchievementMgr->GetCriteriaDataSet(achievementCriteria);
- if (!data)
- continue;
-
- if (!data->Meets(GetPlayer(), unit))
- continue;
-
- SetCriteriaProgress(achievementCriteria, 1, PROGRESS_ACCUMULATE);
- break;
- }
- case ACHIEVEMENT_CRITERIA_TYPE_CAST_SPELL:
- case ACHIEVEMENT_CRITERIA_TYPE_CAST_SPELL2:
- {
- if (!miscValue1 || miscValue1 != achievementCriteria->cast_spell.spellID)
- continue;
-
- // those requirements couldn't be found in the dbc
- AchievementCriteriaDataSet const* data = sAchievementMgr->GetCriteriaDataSet(achievementCriteria);
- if (!data)
- continue;
-
- if (!data->Meets(GetPlayer(), unit))
- continue;
-
- SetCriteriaProgress(achievementCriteria, 1, PROGRESS_ACCUMULATE);
- break;
- }
- case ACHIEVEMENT_CRITERIA_TYPE_LEARN_SPELL:
- if (miscValue1 && miscValue1 != achievementCriteria->learn_spell.spellID)
- continue;
-
- if (GetPlayer()->HasSpell(achievementCriteria->learn_spell.spellID))
- SetCriteriaProgress(achievementCriteria, 1);
- break;
- case ACHIEVEMENT_CRITERIA_TYPE_LOOT_TYPE:
- {
- // miscvalue1=loot_type (note: 0 = LOOT_CORPSE and then it ignored)
- // miscvalue2=count of item loot
- if (!miscValue1 || !miscValue2)
- continue;
- if (miscValue1 != achievementCriteria->loot_type.lootType)
- continue;
-
- // zone specific
- if (achievementCriteria->loot_type.lootTypeCount == 1)
- {
- // those requirements couldn't be found in the dbc
- AchievementCriteriaDataSet const* data = sAchievementMgr->GetCriteriaDataSet(achievementCriteria);
- if (!data || !data->Meets(GetPlayer(), unit))
- continue;
- }
-
- SetCriteriaProgress(achievementCriteria, miscValue2, PROGRESS_ACCUMULATE);
- break;
- }
- case ACHIEVEMENT_CRITERIA_TYPE_OWN_ITEM:
- // speedup for non-login case
- if (miscValue1 && achievementCriteria->own_item.itemID != miscValue1)
- continue;
- SetCriteriaProgress(achievementCriteria, miscValue2, PROGRESS_ACCUMULATE);
- break;
case ACHIEVEMENT_CRITERIA_TYPE_WIN_RATED_ARENA:
- if (!miscValue1) // no update at login
- continue;
-
// additional requirements
if (achievementCriteria->additionalRequirements[0].additionalRequirement_type == ACHIEVEMENT_CRITERIA_CONDITION_NO_LOSE)
{
@@ -1160,198 +917,36 @@ void AchievementMgr::UpdateAchievementCriteria(AchievementCriteriaTypes type, ui
SetCriteriaProgress(achievementCriteria, 1, PROGRESS_ACCUMULATE);
break;
- case ACHIEVEMENT_CRITERIA_TYPE_USE_ITEM:
- // AchievementMgr::UpdateAchievementCriteria might also be called on login - skip in this case
- if (!miscValue1)
- continue;
-
- if (achievementCriteria->use_item.itemID != miscValue1)
- continue;
-
- // Children's Week achievements have extra requirements
- if (achievement->categoryId == CATEGORY_CHILDRENS_WEEK)
- {
- AchievementCriteriaDataSet const* data = sAchievementMgr->GetCriteriaDataSet(achievementCriteria);
- if (!data || !data->Meets(GetPlayer(), NULL))
- continue;
- }
-
- SetCriteriaProgress(achievementCriteria, 1, PROGRESS_ACCUMULATE);
- break;
- case ACHIEVEMENT_CRITERIA_TYPE_LOOT_ITEM:
- // You _have_ to loot that item, just owning it when logging in does _not_ count!
- if (!miscValue1)
- continue;
- if (miscValue1 != achievementCriteria->own_item.itemID)
- continue;
- SetCriteriaProgress(achievementCriteria, miscValue2, PROGRESS_ACCUMULATE);
- break;
- case ACHIEVEMENT_CRITERIA_TYPE_EXPLORE_AREA:
- {
- WorldMapOverlayEntry const* worldOverlayEntry = sWorldMapOverlayStore.LookupEntry(achievementCriteria->explore_area.areaReference);
- if (!worldOverlayEntry)
- break;
-
- bool matchFound = false;
- for (int j = 0; j < MAX_WORLD_MAP_OVERLAY_AREA_IDX; ++j)
- {
- uint32 area_id = worldOverlayEntry->areatableID[j];
- if (!area_id) // array have 0 only in empty tail
- break;
-
- int32 exploreFlag = GetAreaFlagByAreaID(area_id);
- if (exploreFlag < 0)
- continue;
-
- uint32 playerIndexOffset = uint32(exploreFlag) / 32;
- uint32 mask = 1<< (uint32(exploreFlag) % 32);
-
- if (GetPlayer()->GetUInt32Value(PLAYER_EXPLORED_ZONES_1 + playerIndexOffset) & mask)
- {
- matchFound = true;
- break;
- }
- }
-
- if (matchFound)
- SetCriteriaProgress(achievementCriteria, 1);
- break;
- }
case ACHIEVEMENT_CRITERIA_TYPE_BUY_BANK_SLOT:
SetCriteriaProgress(achievementCriteria, GetPlayer()->GetBankBagSlotCount());
break;
case ACHIEVEMENT_CRITERIA_TYPE_GAIN_REPUTATION:
{
- // skip faction check only at loading
- if (miscValue1 && miscValue1 != achievementCriteria->gain_reputation.factionID)
- continue;
-
int32 reputation = GetPlayer()->GetReputationMgr().GetReputation(achievementCriteria->gain_reputation.factionID);
if (reputation > 0)
SetCriteriaProgress(achievementCriteria, reputation);
break;
}
case ACHIEVEMENT_CRITERIA_TYPE_GAIN_EXALTED_REPUTATION:
- {
SetCriteriaProgress(achievementCriteria, GetPlayer()->GetReputationMgr().GetExaltedFactionCount());
break;
- }
- case ACHIEVEMENT_CRITERIA_TYPE_VISIT_BARBER_SHOP:
- {
- // skip for login case
- if (!miscValue1)
- continue;
- SetCriteriaProgress(achievementCriteria, 1);
- break;
- }
- case ACHIEVEMENT_CRITERIA_TYPE_EQUIP_EPIC_ITEM:
- {
- // miscvalue1 = itemid
- // miscvalue2 = itemSlot
- if (!miscValue1)
- continue;
-
- if (miscValue2 != achievementCriteria->equip_epic_item.itemSlot)
- continue;
-
- // check item level and quality via achievement_criteria_data
- AchievementCriteriaDataSet const* data = sAchievementMgr->GetCriteriaDataSet(achievementCriteria);
- if (!data || !data->Meets(GetPlayer(), nullptr, miscValue1))
- continue;
-
- SetCriteriaProgress(achievementCriteria, 1);
- break;
- }
case ACHIEVEMENT_CRITERIA_TYPE_ROLL_NEED_ON_LOOT:
case ACHIEVEMENT_CRITERIA_TYPE_ROLL_GREED_ON_LOOT:
{
- // miscvalue1 = itemid
- // miscvalue2 = diced value
- if (!miscValue1)
- continue;
- if (miscValue2 != achievementCriteria->roll_greed_on_loot.rollValue)
- continue;
-
- ItemTemplate const* pProto = sObjectMgr->GetItemTemplate(miscValue1);
- if (!pProto)
+ ItemTemplate const* proto = sObjectMgr->GetItemTemplate(miscValue1);
+ if (!proto)
continue;
// check item level via achievement_criteria_data
AchievementCriteriaDataSet const* data = sAchievementMgr->GetCriteriaDataSet(achievementCriteria);
- if (!data || !data->Meets(GetPlayer(), nullptr, pProto->ItemLevel))
- continue;
-
- SetCriteriaProgress(achievementCriteria, 1, PROGRESS_ACCUMULATE);
- break;
- }
- case ACHIEVEMENT_CRITERIA_TYPE_DO_EMOTE:
- {
- // miscvalue1 = emote
- if (!miscValue1)
- continue;
- if (miscValue1 != achievementCriteria->do_emote.emoteID)
+ if (!data || !data->Meets(GetPlayer(), nullptr, proto->ItemLevel))
continue;
- if (achievementCriteria->do_emote.count)
- {
- // those requirements couldn't be found in the dbc
- AchievementCriteriaDataSet const* data = sAchievementMgr->GetCriteriaDataSet(achievementCriteria);
- if (!data || !data->Meets(GetPlayer(), unit))
- continue;
- }
SetCriteriaProgress(achievementCriteria, 1, PROGRESS_ACCUMULATE);
break;
}
- case ACHIEVEMENT_CRITERIA_TYPE_DAMAGE_DONE:
- case ACHIEVEMENT_CRITERIA_TYPE_HEALING_DONE:
- {
- if (!miscValue1)
- continue;
-
- if (achievementCriteria->additionalRequirements[0].additionalRequirement_type == ACHIEVEMENT_CRITERIA_CONDITION_BG_MAP)
- {
- if (GetPlayer()->GetMapId() != achievementCriteria->additionalRequirements[0].additionalRequirement_value)
- continue;
-
- // map specific case (BG in fact) expected player targeted damage/heal
- if (!unit || unit->GetTypeId() != TYPEID_PLAYER)
- continue;
- }
-
- SetCriteriaProgress(achievementCriteria, miscValue1, PROGRESS_ACCUMULATE);
- break;
- }
- case ACHIEVEMENT_CRITERIA_TYPE_EQUIP_ITEM:
- // miscvalue1 = item_id
- if (!miscValue1)
- continue;
- if (miscValue1 != achievementCriteria->equip_item.itemID)
- continue;
-
- SetCriteriaProgress(achievementCriteria, 1);
- break;
- case ACHIEVEMENT_CRITERIA_TYPE_USE_GAMEOBJECT:
- // miscvalue1 = go entry
- if (!miscValue1)
- continue;
- if (miscValue1 != achievementCriteria->use_gameobject.goEntry)
- continue;
-
- SetCriteriaProgress(achievementCriteria, 1, PROGRESS_ACCUMULATE);
- break;
- case ACHIEVEMENT_CRITERIA_TYPE_FISH_IN_GAMEOBJECT:
- if (!miscValue1)
- continue;
- if (miscValue1 != achievementCriteria->fish_in_gameobject.goEntry)
- continue;
-
- SetCriteriaProgress(achievementCriteria, 1, PROGRESS_ACCUMULATE);
- break;
case ACHIEVEMENT_CRITERIA_TYPE_LEARN_SKILLLINE_SPELLS:
{
- if (miscValue1 && miscValue1 != achievementCriteria->learn_skillline_spell.skillLine)
- continue;
-
uint32 spellCount = 0;
for (PlayerSpellMap::const_iterator spellIter = GetPlayer()->GetSpellMap().begin();
spellIter != GetPlayer()->GetSpellMap().end();
@@ -1367,24 +962,6 @@ void AchievementMgr::UpdateAchievementCriteria(AchievementCriteriaTypes type, ui
SetCriteriaProgress(achievementCriteria, spellCount);
break;
}
- case ACHIEVEMENT_CRITERIA_TYPE_WIN_DUEL:
- // AchievementMgr::UpdateAchievementCriteria might also be called on login - skip in this case
- if (!miscValue1)
- continue;
-
- if (achievementCriteria->win_duel.duelCount)
- {
- // those requirements couldn't be found in the dbc
- AchievementCriteriaDataSet const* data = sAchievementMgr->GetCriteriaDataSet(achievementCriteria);
- if (!data)
- continue;
-
- if (!data->Meets(GetPlayer(), unit))
- continue;
- }
-
- SetCriteriaProgress(achievementCriteria, 1, PROGRESS_ACCUMULATE);
- break;
case ACHIEVEMENT_CRITERIA_TYPE_GAIN_REVERED_REPUTATION:
SetCriteriaProgress(achievementCriteria, GetPlayer()->GetReputationMgr().GetReveredFactionCount());
break;
@@ -1394,23 +971,8 @@ void AchievementMgr::UpdateAchievementCriteria(AchievementCriteriaTypes type, ui
case ACHIEVEMENT_CRITERIA_TYPE_KNOWN_FACTIONS:
SetCriteriaProgress(achievementCriteria, GetPlayer()->GetReputationMgr().GetVisibleFactionCount());
break;
- case ACHIEVEMENT_CRITERIA_TYPE_LOOT_EPIC_ITEM:
- case ACHIEVEMENT_CRITERIA_TYPE_RECEIVE_EPIC_ITEM:
- {
- // AchievementMgr::UpdateAchievementCriteria might also be called on login - skip in this case
- if (!miscValue1)
- continue;
- ItemTemplate const* proto = sObjectMgr->GetItemTemplate(miscValue1);
- if (!proto || proto->Quality < ITEM_QUALITY_EPIC)
- continue;
- SetCriteriaProgress(achievementCriteria, 1, PROGRESS_ACCUMULATE);
- break;
- }
case ACHIEVEMENT_CRITERIA_TYPE_LEARN_SKILL_LINE:
{
- if (miscValue1 && miscValue1 != achievementCriteria->learn_skill_line.skillLine)
- continue;
-
uint32 spellCount = 0;
for (PlayerSpellMap::const_iterator spellIter = GetPlayer()->GetSpellMap().begin();
spellIter != GetPlayer()->GetSpellMap().end();
@@ -1427,72 +989,21 @@ void AchievementMgr::UpdateAchievementCriteria(AchievementCriteriaTypes type, ui
case ACHIEVEMENT_CRITERIA_TYPE_EARN_HONORABLE_KILL:
SetCriteriaProgress(achievementCriteria, GetPlayer()->GetUInt32Value(PLAYER_FIELD_LIFETIME_HONORABLE_KILLS));
break;
- case ACHIEVEMENT_CRITERIA_TYPE_HK_CLASS:
- if (!miscValue1 || miscValue1 != achievementCriteria->hk_class.classID)
- continue;
-
- SetCriteriaProgress(achievementCriteria, 1, PROGRESS_ACCUMULATE);
- break;
- case ACHIEVEMENT_CRITERIA_TYPE_HK_RACE:
- if (!miscValue1 || miscValue1 != achievementCriteria->hk_race.raceID)
- continue;
-
- SetCriteriaProgress(achievementCriteria, 1, PROGRESS_ACCUMULATE);
- break;
case ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_GOLD_VALUE_OWNED:
SetCriteriaProgress(achievementCriteria, GetPlayer()->GetMoney(), PROGRESS_HIGHEST);
break;
case ACHIEVEMENT_CRITERIA_TYPE_EARN_ACHIEVEMENT_POINTS:
- {
if (!miscValue1)
{
uint32 points = 0;
- for (CompletedAchievementMap::iterator itr = m_completedAchievements.begin(); itr != m_completedAchievements.end(); ++itr)
- if (AchievementEntry const* pAchievement = sAchievementMgr->GetAchievement(itr->first))
- points += pAchievement->points;
+ for (CompletedAchievementMap::const_iterator itr = m_completedAchievements.begin(); itr != m_completedAchievements.end(); ++itr)
+ if (AchievementEntry const* completedAchievements = sAchievementMgr->GetAchievement(itr->first))
+ points += completedAchievements->points;
SetCriteriaProgress(achievementCriteria, points, PROGRESS_SET);
}
else
SetCriteriaProgress(achievementCriteria, miscValue1, PROGRESS_ACCUMULATE);
break;
- }
- case ACHIEVEMENT_CRITERIA_TYPE_BG_OBJECTIVE_CAPTURE:
- {
- if (!miscValue1 || miscValue1 != achievementCriteria->bg_objective.objectiveId)
- continue;
-
- // those requirements couldn't be found in the dbc
- AchievementCriteriaDataSet const* data = sAchievementMgr->GetCriteriaDataSet(achievementCriteria);
- if (!data || !data->Meets(GetPlayer(), unit))
- continue;
-
- SetCriteriaProgress(achievementCriteria, 1, PROGRESS_ACCUMULATE);
- break;
- }
- case ACHIEVEMENT_CRITERIA_TYPE_HONORABLE_KILL:
- case ACHIEVEMENT_CRITERIA_TYPE_SPECIAL_PVP_KILL:
- case ACHIEVEMENT_CRITERIA_TYPE_GET_KILLING_BLOWS:
- {
- // skip login update
- if (!miscValue1)
- continue;
-
- // those requirements couldn't be found in the dbc
- AchievementCriteriaDataSet const* data = sAchievementMgr->GetCriteriaDataSet(achievementCriteria);
- if (!data || !data->Meets(GetPlayer(), unit))
- continue;
-
- SetCriteriaProgress(achievementCriteria, 1, PROGRESS_ACCUMULATE);
- break;
- }
- case ACHIEVEMENT_CRITERIA_TYPE_HONORABLE_KILL_AT_AREA:
- {
- if (!miscValue1 || miscValue1 != achievementCriteria->honorable_kill_at_area.areaID)
- continue;
-
- SetCriteriaProgress(achievementCriteria, 1, PROGRESS_ACCUMULATE);
- break;
- }
case ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_TEAM_RATING:
{
uint32 reqTeamType = achievementCriteria->highest_team_rating.teamtype;
@@ -1504,7 +1015,7 @@ void AchievementMgr::UpdateAchievementCriteria(AchievementCriteriaTypes type, ui
SetCriteriaProgress(achievementCriteria, miscValue1, PROGRESS_HIGHEST);
}
- else // login case
+ else // login case
{
for (uint32 arena_slot = 0; arena_slot < MAX_ARENA_SLOT; ++arena_slot)
{
@@ -1520,7 +1031,6 @@ void AchievementMgr::UpdateAchievementCriteria(AchievementCriteriaTypes type, ui
break;
}
}
-
break;
}
case ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_PERSONAL_RATING:
@@ -1534,7 +1044,7 @@ void AchievementMgr::UpdateAchievementCriteria(AchievementCriteriaTypes type, ui
SetCriteriaProgress(achievementCriteria, miscValue1, PROGRESS_HIGHEST);
}
- else // login case
+ else // login case
{
for (uint32 arena_slot = 0; arena_slot < MAX_ARENA_SLOT; ++arena_slot)
{
@@ -1556,27 +1066,6 @@ void AchievementMgr::UpdateAchievementCriteria(AchievementCriteriaTypes type, ui
break;
}
- case ACHIEVEMENT_CRITERIA_TYPE_WIN_ARENA: // This also behaves like ACHIEVEMENT_CRITERIA_TYPE_WIN_RATED_ARENA
- {
- // Check map id requirement
- if (miscValue1 == achievementCriteria->win_arena.mapID)
- SetCriteriaProgress(achievementCriteria, 1, PROGRESS_ACCUMULATE);
- break;
- }
- case ACHIEVEMENT_CRITERIA_TYPE_ON_LOGIN:
- {
- // This criteria is only called directly after login - with expected miscvalue1 == 1
- if (!miscValue1)
- continue;
-
- // They have no proper requirements in dbc
- AchievementCriteriaDataSet const* data = sAchievementMgr->GetCriteriaDataSet(achievementCriteria);
- if (!data || !data->Meets(GetPlayer(), unit))
- continue;
-
- SetCriteriaProgress(achievementCriteria, 1, PROGRESS_ACCUMULATE);
- break;
- }
// std case: not exist in DBC, not triggered in code as result
case ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_HEALTH:
case ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_SPELLPOWER:
@@ -2019,7 +1508,7 @@ void AchievementMgr::CompletedAchievement(AchievementEntry const* achievement)
if (achievement->flags & ACHIEVEMENT_FLAG_COUNTER || HasAchieved(achievement->ID))
return;
- TC_LOG_INFO("achievement", "AchievementMgr::CompletedAchievement(%u). Player: %s (%u)",
+ TC_LOG_DEBUG("achievement", "AchievementMgr::CompletedAchievement(%u). Player: %s (%u)",
achievement->ID, m_player->GetName().c_str(), m_player->GetGUIDLow());
SendAchievementEarned(achievement);
@@ -2140,18 +1629,53 @@ bool AchievementMgr::HasAchieved(uint32 achievementId) const
return m_completedAchievements.find(achievementId) != m_completedAchievements.end();
}
-bool AchievementMgr::CanUpdateCriteria(AchievementCriteriaEntry const* criteria, AchievementEntry const* achievement)
+bool AchievementMgr::CanUpdateCriteria(AchievementCriteriaEntry const* criteria, AchievementEntry const* achievement, uint32 miscValue1, uint32 miscValue2, Unit const* unit)
{
- if (DisableMgr::IsDisabledFor(DISABLE_TYPE_ACHIEVEMENT_CRITERIA, criteria->ID, NULL))
+ if (DisableMgr::IsDisabledFor(DISABLE_TYPE_ACHIEVEMENT_CRITERIA, criteria->ID, nullptr))
+ {
+ TC_LOG_TRACE("achievement", "CanUpdateCriteria: (Id: %u Type %s) Disabled",
+ criteria->ID, AchievementGlobalMgr::GetCriteriaTypeString(criteria->requiredType));
return false;
+ }
if (achievement->mapID != -1 && GetPlayer()->GetMapId() != uint32(achievement->mapID))
+ {
+ TC_LOG_TRACE("achievement", "CanUpdateCriteria: (Id: %u Type %s Achievement %u) Wrong map",
+ criteria->ID, AchievementGlobalMgr::GetCriteriaTypeString(criteria->requiredType), achievement->ID);
return false;
+ }
if ((achievement->requiredFaction == ACHIEVEMENT_FACTION_HORDE && GetPlayer()->GetTeam() != HORDE) ||
(achievement->requiredFaction == ACHIEVEMENT_FACTION_ALLIANCE && GetPlayer()->GetTeam() != ALLIANCE))
+ {
+ TC_LOG_TRACE("achievement", "CanUpdateCriteria: (Id: %u Type %s Achievement %u) Wrong faction",
+ criteria->ID, AchievementGlobalMgr::GetCriteriaTypeString(criteria->requiredType), achievement->ID);
return false;
+ }
+
+ if (!RequirementsSatisfied(criteria, achievement, miscValue1, miscValue2, unit))
+ {
+ TC_LOG_TRACE("achievement", "CanUpdateCriteria: (Id: %u Type %s) Requirements not satisfied",
+ criteria->ID, AchievementGlobalMgr::GetCriteriaTypeString(criteria->requiredType));
+ return false;
+ }
+ if (!ConditionsSatisfied(criteria))
+ {
+ TC_LOG_TRACE("achievement", "CanUpdateCriteria: (Id: %u Type %s) Conditions not satisfied",
+ criteria->ID, AchievementGlobalMgr::GetCriteriaTypeString(criteria->requiredType));
+ return false;
+ }
+
+ // don't update already completed criteria
+ if (IsCompletedCriteria(criteria, achievement))
+ return false;
+
+ return true;
+}
+
+bool AchievementMgr::ConditionsSatisfied(AchievementCriteriaEntry const* criteria) const
+{
for (uint32 i = 0; i < MAX_CRITERIA_REQUIREMENTS; ++i)
{
if (!criteria->additionalRequirements[i].additionalRequirement_type)
@@ -2172,13 +1696,558 @@ bool AchievementMgr::CanUpdateCriteria(AchievementCriteriaEntry const* criteria,
}
}
- // don't update already completed criteria
- if (IsCompletedCriteria(criteria, achievement))
- return false;
+ return true;
+}
+
+bool AchievementMgr::RequirementsSatisfied(AchievementCriteriaEntry const* achievementCriteria, AchievementEntry const* achievement, uint32 miscValue1, uint32 miscValue2, Unit const* unit) const
+{
+ switch (AchievementCriteriaTypes(achievementCriteria->requiredType))
+ {
+ case ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_DAILY_QUEST:
+ case ACHIEVEMENT_CRITERIA_TYPE_FALL_WITHOUT_DYING:
+ case ACHIEVEMENT_CRITERIA_TYPE_HONORABLE_KILL:
+ case ACHIEVEMENT_CRITERIA_TYPE_WIN_RATED_ARENA:
+ case ACHIEVEMENT_CRITERIA_TYPE_VISIT_BARBER_SHOP:
+ case ACHIEVEMENT_CRITERIA_TYPE_GET_KILLING_BLOWS:
+ case ACHIEVEMENT_CRITERIA_TYPE_MONEY_FROM_VENDORS:
+ case ACHIEVEMENT_CRITERIA_TYPE_GOLD_SPENT_FOR_TALENTS:
+ case ACHIEVEMENT_CRITERIA_TYPE_NUMBER_OF_TALENT_RESETS:
+ case ACHIEVEMENT_CRITERIA_TYPE_MONEY_FROM_QUEST_REWARD:
+ case ACHIEVEMENT_CRITERIA_TYPE_GOLD_SPENT_FOR_TRAVELLING:
+ case ACHIEVEMENT_CRITERIA_TYPE_GOLD_SPENT_AT_BARBER:
+ case ACHIEVEMENT_CRITERIA_TYPE_GOLD_SPENT_FOR_MAIL:
+ case ACHIEVEMENT_CRITERIA_TYPE_LOOT_MONEY:
+ case ACHIEVEMENT_CRITERIA_TYPE_SPECIAL_PVP_KILL:
+ case ACHIEVEMENT_CRITERIA_TYPE_ON_LOGIN:
+ case ACHIEVEMENT_CRITERIA_TYPE_WIN_DUEL:
+ case ACHIEVEMENT_CRITERIA_TYPE_LOSE_DUEL:
+ case ACHIEVEMENT_CRITERIA_TYPE_KILL_CREATURE_TYPE:
+ case ACHIEVEMENT_CRITERIA_TYPE_GOLD_EARNED_BY_AUCTIONS:
+ case ACHIEVEMENT_CRITERIA_TYPE_CREATE_AUCTION:
+ case ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_AUCTION_BID:
+ case ACHIEVEMENT_CRITERIA_TYPE_WON_AUCTIONS:
+ case ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_AUCTION_SOLD:
+ case ACHIEVEMENT_CRITERIA_TYPE_ROLL_NEED:
+ case ACHIEVEMENT_CRITERIA_TYPE_ROLL_GREED:
+ case ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_HIT_DEALT:
+ case ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_HIT_RECEIVED:
+ case ACHIEVEMENT_CRITERIA_TYPE_TOTAL_DAMAGE_RECEIVED:
+ case ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_HEAL_CAST:
+ case ACHIEVEMENT_CRITERIA_TYPE_TOTAL_HEALING_RECEIVED:
+ case ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_HEALING_RECEIVED:
+ case ACHIEVEMENT_CRITERIA_TYPE_QUEST_ABANDONED:
+ case ACHIEVEMENT_CRITERIA_TYPE_FLIGHT_PATHS_TAKEN:
+ case ACHIEVEMENT_CRITERIA_TYPE_ACCEPTED_SUMMONINGS:
+ case ACHIEVEMENT_CRITERIA_TYPE_USE_LFD_TO_GROUP_WITH_PLAYERS:
+ if (!miscValue1)
+ return false;
+ break;
+ case ACHIEVEMENT_CRITERIA_TYPE_REACH_LEVEL:
+ case ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_ACHIEVEMENT:
+ case ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_QUEST_COUNT:
+ case ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_DAILY_QUEST_DAILY:
+ case ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_TEAM_RATING:
+ case ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_PERSONAL_RATING:
+ case ACHIEVEMENT_CRITERIA_TYPE_BUY_BANK_SLOT:
+ case ACHIEVEMENT_CRITERIA_TYPE_GAIN_EXALTED_REPUTATION:
+ case ACHIEVEMENT_CRITERIA_TYPE_GAIN_REVERED_REPUTATION:
+ case ACHIEVEMENT_CRITERIA_TYPE_GAIN_HONORED_REPUTATION:
+ case ACHIEVEMENT_CRITERIA_TYPE_KNOWN_FACTIONS:
+ case ACHIEVEMENT_CRITERIA_TYPE_EARN_HONORABLE_KILL:
+ case ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_GOLD_VALUE_OWNED:
+ case ACHIEVEMENT_CRITERIA_TYPE_EARN_ACHIEVEMENT_POINTS:
+ break;
+
+ // specialized cases
+ case ACHIEVEMENT_CRITERIA_TYPE_WIN_BG:
+ if (!miscValue1)
+ return false;
+ if (achievementCriteria->win_bg.bgMapID != GetPlayer()->GetMapId())
+ return false;
+ break;
+ case ACHIEVEMENT_CRITERIA_TYPE_KILL_CREATURE:
+ if (!miscValue1)
+ return false;
+ if (achievementCriteria->kill_creature.creatureID != miscValue1)
+ return false;
+ break;
+ case ACHIEVEMENT_CRITERIA_TYPE_REACH_SKILL_LEVEL:
+ if (miscValue1 && miscValue1 != achievementCriteria->reach_skill_level.skillID)
+ return false;
+ break;
+ case ACHIEVEMENT_CRITERIA_TYPE_LEARN_SKILL_LEVEL:
+ if (miscValue1 && miscValue1 != achievementCriteria->learn_skill_level.skillID)
+ return false;
+ break;
+ case ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_QUESTS_IN_ZONE:
+ if (miscValue1 && miscValue1 != achievementCriteria->complete_quests_in_zone.zoneID)
+ return false;
+ break;
+ case ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_BATTLEGROUND:
+ if (!miscValue1)
+ return false;
+ if (GetPlayer()->GetMapId() != achievementCriteria->complete_battleground.mapID)
+ return false;
+ break;
+ case ACHIEVEMENT_CRITERIA_TYPE_DEATH_AT_MAP:
+ if (!miscValue1)
+ return false;
+ if (GetPlayer()->GetMapId() != achievementCriteria->death_at_map.mapID)
+ return false;
+ break;
+ case ACHIEVEMENT_CRITERIA_TYPE_DEATH:
+ if (!miscValue1)
+ return false;
+ for (uint8 j = 0; j < MAX_ARENA_SLOT; ++j)
+ {
+ if (achievIdByArenaSlot[j] == achievement->ID)
+ {
+ Battleground* bg = GetPlayer()->GetBattleground();
+ if (!bg || !bg->isArena() || ArenaTeam::GetSlotByType(bg->GetArenaType()) != j)
+ return false;
+ break;
+ }
+ }
+ break;
+ case ACHIEVEMENT_CRITERIA_TYPE_DEATH_IN_DUNGEON:
+ {
+ if (!miscValue1)
+ return false;
+
+ Map const* map = GetPlayer()->IsInWorld() ? GetPlayer()->GetMap() : sMapMgr->FindMap(GetPlayer()->GetMapId(), GetPlayer()->GetInstanceId());
+ if (!map || !map->IsDungeon())
+ return false;
+
+ //FIXME: work only for instances where max == min for players
+ if (map->ToInstanceMap()->GetMaxPlayers() != achievementCriteria->death_in_dungeon.manLimit)
+ return false;
+ break;
+ }
+ case ACHIEVEMENT_CRITERIA_TYPE_KILLED_BY_CREATURE:
+ if (!miscValue1)
+ return false;
+ if (miscValue1 != achievementCriteria->killed_by_creature.creatureEntry)
+ return false;
+ break;
+ case ACHIEVEMENT_CRITERIA_TYPE_KILLED_BY_PLAYER:
+ if (!miscValue1)
+ return false;
+ // if team check required: must kill by opposition faction
+ if (achievement->ID == 318 && miscValue2 == GetPlayer()->GetTeam())
+ return false;
+ break;
+ case ACHIEVEMENT_CRITERIA_TYPE_DEATHS_FROM:
+ if (!miscValue1)
+ return false;
+ if (miscValue2 != achievementCriteria->death_from.type)
+ return false;
+ break;
+ case ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_QUEST:
+ // if miscvalues != 0, it contains the questID.
+ if (miscValue1)
+ {
+ if (miscValue1 != achievementCriteria->complete_quest.questID)
+ return false;
+ }
+ else
+ {
+ // login case.
+ if (!GetPlayer()->GetQuestRewardStatus(achievementCriteria->complete_quest.questID))
+ return false;
+ }
+ break;
+ case ACHIEVEMENT_CRITERIA_TYPE_BE_SPELL_TARGET:
+ case ACHIEVEMENT_CRITERIA_TYPE_BE_SPELL_TARGET2:
+ if (!miscValue1 || miscValue1 != achievementCriteria->be_spell_target.spellID)
+ return false;
+ break;
+ case ACHIEVEMENT_CRITERIA_TYPE_CAST_SPELL:
+ case ACHIEVEMENT_CRITERIA_TYPE_CAST_SPELL2:
+ if (!miscValue1 || miscValue1 != achievementCriteria->cast_spell.spellID)
+ return false;
+ break;
+ case ACHIEVEMENT_CRITERIA_TYPE_LEARN_SPELL:
+ if (miscValue1 && miscValue1 != achievementCriteria->learn_spell.spellID)
+ return false;
+ if (!GetPlayer()->HasSpell(achievementCriteria->learn_spell.spellID))
+ return false;
+ break;
+ case ACHIEVEMENT_CRITERIA_TYPE_LOOT_TYPE:
+ // miscvalue1=loot_type (note: 0 = LOOT_CORPSE and then it ignored)
+ // miscvalue2=count of item loot
+ if (!miscValue1 || !miscValue2)
+ return false;
+ if (miscValue1 != achievementCriteria->loot_type.lootType)
+ return false;
+ break;
+ case ACHIEVEMENT_CRITERIA_TYPE_OWN_ITEM:
+ if (miscValue1 && achievementCriteria->own_item.itemID != miscValue1)
+ return false;
+ break;
+ case ACHIEVEMENT_CRITERIA_TYPE_USE_ITEM:
+ if (!miscValue1)
+ return false;
+ if (achievementCriteria->use_item.itemID != miscValue1)
+ return false;
+ break;
+ case ACHIEVEMENT_CRITERIA_TYPE_LOOT_ITEM:
+ if (!miscValue1)
+ return false;
+ if (miscValue1 != achievementCriteria->own_item.itemID)
+ return false;
+ break;
+ case ACHIEVEMENT_CRITERIA_TYPE_EXPLORE_AREA:
+ {
+ WorldMapOverlayEntry const* worldOverlayEntry = sWorldMapOverlayStore.LookupEntry(achievementCriteria->explore_area.areaReference);
+ if (!worldOverlayEntry)
+ return false;
+
+ bool matchFound = false;
+ for (int j = 0; j < MAX_WORLD_MAP_OVERLAY_AREA_IDX; ++j)
+ {
+ uint32 area_id = worldOverlayEntry->areatableID[j];
+ if (!area_id) // array have 0 only in empty tail
+ break;
+
+ int32 exploreFlag = GetAreaFlagByAreaID(area_id);
+ if (exploreFlag < 0)
+ continue;
+
+ uint32 playerIndexOffset = uint32(exploreFlag) / 32;
+ uint32 mask = 1 << (uint32(exploreFlag) % 32);
+
+ if (GetPlayer()->GetUInt32Value(PLAYER_EXPLORED_ZONES_1 + playerIndexOffset) & mask)
+ {
+ matchFound = true;
+ break;
+ }
+ }
+
+ if (!matchFound)
+ return false;
+ break;
+ }
+ case ACHIEVEMENT_CRITERIA_TYPE_GAIN_REPUTATION:
+ if (miscValue1 && miscValue1 != achievementCriteria->gain_reputation.factionID)
+ return false;
+ break;
+ case ACHIEVEMENT_CRITERIA_TYPE_EQUIP_EPIC_ITEM:
+ // miscvalue1 = itemid
+ // miscvalue2 = itemSlot
+ if (!miscValue1)
+ return false;
+ if (miscValue2 != achievementCriteria->equip_epic_item.itemSlot)
+ return false;
+ break;
+ case ACHIEVEMENT_CRITERIA_TYPE_ROLL_NEED_ON_LOOT:
+ case ACHIEVEMENT_CRITERIA_TYPE_ROLL_GREED_ON_LOOT:
+ // miscvalue1 = itemid
+ // miscvalue2 = diced value
+ if (!miscValue1)
+ return false;
+ if (miscValue2 != achievementCriteria->roll_greed_on_loot.rollValue)
+ return false;
+ break;
+ case ACHIEVEMENT_CRITERIA_TYPE_DO_EMOTE:
+ // miscvalue1 = emote
+ if (!miscValue1)
+ return false;
+ if (miscValue1 != achievementCriteria->do_emote.emoteID)
+ return false;
+ break;
+ case ACHIEVEMENT_CRITERIA_TYPE_DAMAGE_DONE:
+ case ACHIEVEMENT_CRITERIA_TYPE_HEALING_DONE:
+ if (!miscValue1)
+ return false;
+
+ if (achievementCriteria->additionalRequirements[0].additionalRequirement_type == ACHIEVEMENT_CRITERIA_CONDITION_BG_MAP)
+ {
+ if (GetPlayer()->GetMapId() != achievementCriteria->additionalRequirements[0].additionalRequirement_value)
+ return false;
+
+ // map specific case (BG in fact) expected player targeted damage/heal
+ if (!unit || unit->GetTypeId() != TYPEID_PLAYER)
+ return false;
+ }
+ break;
+ case ACHIEVEMENT_CRITERIA_TYPE_EQUIP_ITEM:
+ if (!miscValue1)
+ return false;
+ if (miscValue1 != achievementCriteria->equip_item.itemID)
+ return false;
+ break;
+ case ACHIEVEMENT_CRITERIA_TYPE_USE_GAMEOBJECT:
+ if (!miscValue1)
+ return false;
+ if (miscValue1 != achievementCriteria->use_gameobject.goEntry)
+ return false;
+ break;
+ case ACHIEVEMENT_CRITERIA_TYPE_FISH_IN_GAMEOBJECT:
+ if (!miscValue1)
+ return false;
+ if (miscValue1 != achievementCriteria->fish_in_gameobject.goEntry)
+ return false;
+ break;
+ case ACHIEVEMENT_CRITERIA_TYPE_LEARN_SKILLLINE_SPELLS:
+ if (miscValue1 && miscValue1 != achievementCriteria->learn_skillline_spell.skillLine)
+ return false;
+ break;
+ case ACHIEVEMENT_CRITERIA_TYPE_LOOT_EPIC_ITEM:
+ case ACHIEVEMENT_CRITERIA_TYPE_RECEIVE_EPIC_ITEM:
+ {
+ if (!miscValue1)
+ return false;
+ ItemTemplate const* proto = sObjectMgr->GetItemTemplate(miscValue1);
+ if (!proto || proto->Quality < ITEM_QUALITY_EPIC)
+ return false;
+ break;
+ }
+ case ACHIEVEMENT_CRITERIA_TYPE_LEARN_SKILL_LINE:
+ if (miscValue1 && miscValue1 != achievementCriteria->learn_skill_line.skillLine)
+ return false;
+ break;
+ case ACHIEVEMENT_CRITERIA_TYPE_HK_CLASS:
+ if (!miscValue1 || miscValue1 != achievementCriteria->hk_class.classID)
+ return false;
+ break;
+ case ACHIEVEMENT_CRITERIA_TYPE_HK_RACE:
+ if (!miscValue1 || miscValue1 != achievementCriteria->hk_race.raceID)
+ return false;
+ break;
+ case ACHIEVEMENT_CRITERIA_TYPE_BG_OBJECTIVE_CAPTURE:
+ if (!miscValue1 || miscValue1 != achievementCriteria->bg_objective.objectiveId)
+ return false;
+ break;
+ case ACHIEVEMENT_CRITERIA_TYPE_HONORABLE_KILL_AT_AREA:
+ if (!miscValue1 || miscValue1 != achievementCriteria->honorable_kill_at_area.areaID)
+ return false;
+ break;
+ case ACHIEVEMENT_CRITERIA_TYPE_WIN_ARENA:
+ if (miscValue1 != achievementCriteria->win_arena.mapID)
+ return false;
+ break;
+ default:
+ break;
+ }
return true;
}
+char const* AchievementGlobalMgr::GetCriteriaTypeString(uint32 type)
+{
+ return GetCriteriaTypeString(AchievementCriteriaTypes(type));
+}
+
+char const* AchievementGlobalMgr::GetCriteriaTypeString(AchievementCriteriaTypes type)
+{
+ switch (type)
+ {
+ case ACHIEVEMENT_CRITERIA_TYPE_KILL_CREATURE:
+ return "KILL_CREATURE";
+ case ACHIEVEMENT_CRITERIA_TYPE_WIN_BG:
+ return "TYPE_WIN_BG";
+ case ACHIEVEMENT_CRITERIA_TYPE_REACH_LEVEL:
+ return "REACH_LEVEL";
+ case ACHIEVEMENT_CRITERIA_TYPE_REACH_SKILL_LEVEL:
+ return "REACH_SKILL_LEVEL";
+ case ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_ACHIEVEMENT:
+ return "COMPLETE_ACHIEVEMENT";
+ case ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_QUEST_COUNT:
+ return "COMPLETE_QUEST_COUNT";
+ case ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_DAILY_QUEST_DAILY:
+ return "COMPLETE_DAILY_QUEST_DAILY";
+ case ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_QUESTS_IN_ZONE:
+ return "COMPLETE_QUESTS_IN_ZONE";
+ case ACHIEVEMENT_CRITERIA_TYPE_DAMAGE_DONE:
+ return "DAMAGE_DONE";
+ case ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_DAILY_QUEST:
+ return "COMPLETE_DAILY_QUEST";
+ case ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_BATTLEGROUND:
+ return "COMPLETE_BATTLEGROUND";
+ case ACHIEVEMENT_CRITERIA_TYPE_DEATH_AT_MAP:
+ return "DEATH_AT_MAP";
+ case ACHIEVEMENT_CRITERIA_TYPE_DEATH:
+ return "DEATH";
+ case ACHIEVEMENT_CRITERIA_TYPE_DEATH_IN_DUNGEON:
+ return "DEATH_IN_DUNGEON";
+ case ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_RAID:
+ return "COMPLETE_RAID";
+ case ACHIEVEMENT_CRITERIA_TYPE_KILLED_BY_CREATURE:
+ return "KILLED_BY_CREATURE";
+ case ACHIEVEMENT_CRITERIA_TYPE_KILLED_BY_PLAYER:
+ return "KILLED_BY_PLAYER";
+ case ACHIEVEMENT_CRITERIA_TYPE_FALL_WITHOUT_DYING:
+ return "FALL_WITHOUT_DYING";
+ case ACHIEVEMENT_CRITERIA_TYPE_DEATHS_FROM:
+ return "DEATHS_FROM";
+ case ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_QUEST:
+ return "COMPLETE_QUEST";
+ case ACHIEVEMENT_CRITERIA_TYPE_BE_SPELL_TARGET:
+ return "BE_SPELL_TARGET";
+ case ACHIEVEMENT_CRITERIA_TYPE_CAST_SPELL:
+ return "CAST_SPELL";
+ case ACHIEVEMENT_CRITERIA_TYPE_BG_OBJECTIVE_CAPTURE:
+ return "BG_OBJECTIVE_CAPTURE";
+ case ACHIEVEMENT_CRITERIA_TYPE_HONORABLE_KILL_AT_AREA:
+ return "HONORABLE_KILL_AT_AREA";
+ case ACHIEVEMENT_CRITERIA_TYPE_WIN_ARENA:
+ return "WIN_ARENA";
+ case ACHIEVEMENT_CRITERIA_TYPE_PLAY_ARENA:
+ return "PLAY_ARENA";
+ case ACHIEVEMENT_CRITERIA_TYPE_LEARN_SPELL:
+ return "LEARN_SPELL";
+ case ACHIEVEMENT_CRITERIA_TYPE_HONORABLE_KILL:
+ return "HONORABLE_KILL";
+ case ACHIEVEMENT_CRITERIA_TYPE_OWN_ITEM:
+ return "OWN_ITEM";
+ case ACHIEVEMENT_CRITERIA_TYPE_WIN_RATED_ARENA:
+ return "WIN_RATED_ARENA";
+ case ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_TEAM_RATING:
+ return "HIGHEST_TEAM_RATING";
+ case ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_PERSONAL_RATING:
+ return "HIGHEST_PERSONAL_RATING";
+ case ACHIEVEMENT_CRITERIA_TYPE_LEARN_SKILL_LEVEL:
+ return "LEARN_SKILL_LEVEL";
+ case ACHIEVEMENT_CRITERIA_TYPE_USE_ITEM:
+ return "USE_ITEM";
+ case ACHIEVEMENT_CRITERIA_TYPE_LOOT_ITEM:
+ return "LOOT_ITEM";
+ case ACHIEVEMENT_CRITERIA_TYPE_EXPLORE_AREA:
+ return "EXPLORE_AREA";
+ case ACHIEVEMENT_CRITERIA_TYPE_OWN_RANK:
+ return "OWN_RANK";
+ case ACHIEVEMENT_CRITERIA_TYPE_BUY_BANK_SLOT:
+ return "BUY_BANK_SLOT";
+ case ACHIEVEMENT_CRITERIA_TYPE_GAIN_REPUTATION:
+ return "GAIN_REPUTATION";
+ case ACHIEVEMENT_CRITERIA_TYPE_GAIN_EXALTED_REPUTATION:
+ return "GAIN_EXALTED_REPUTATION";
+ case ACHIEVEMENT_CRITERIA_TYPE_VISIT_BARBER_SHOP:
+ return "VISIT_BARBER_SHOP";
+ case ACHIEVEMENT_CRITERIA_TYPE_EQUIP_EPIC_ITEM:
+ return "EQUIP_EPIC_ITEM";
+ case ACHIEVEMENT_CRITERIA_TYPE_ROLL_NEED_ON_LOOT:
+ return "ROLL_NEED_ON_LOOT";
+ case ACHIEVEMENT_CRITERIA_TYPE_ROLL_GREED_ON_LOOT:
+ return "GREED_ON_LOOT";
+ case ACHIEVEMENT_CRITERIA_TYPE_HK_CLASS:
+ return "HK_CLASS";
+ case ACHIEVEMENT_CRITERIA_TYPE_HK_RACE:
+ return "HK_RACE";
+ case ACHIEVEMENT_CRITERIA_TYPE_DO_EMOTE:
+ return "DO_EMOTE";
+ case ACHIEVEMENT_CRITERIA_TYPE_HEALING_DONE:
+ return "HEALING_DONE";
+ case ACHIEVEMENT_CRITERIA_TYPE_GET_KILLING_BLOWS:
+ return "GET_KILLING_BLOWS";
+ case ACHIEVEMENT_CRITERIA_TYPE_EQUIP_ITEM:
+ return "EQUIP_ITEM";
+ case ACHIEVEMENT_CRITERIA_TYPE_MONEY_FROM_VENDORS:
+ return "MONEY_FROM_VENDORS";
+ case ACHIEVEMENT_CRITERIA_TYPE_GOLD_SPENT_FOR_TALENTS:
+ return "GOLD_SPENT_FOR_TALENTS";
+ case ACHIEVEMENT_CRITERIA_TYPE_NUMBER_OF_TALENT_RESETS:
+ return "NUMBER_OF_TALENT_RESETS";
+ case ACHIEVEMENT_CRITERIA_TYPE_MONEY_FROM_QUEST_REWARD:
+ return "MONEY_FROM_QUEST_REWARD";
+ case ACHIEVEMENT_CRITERIA_TYPE_GOLD_SPENT_FOR_TRAVELLING:
+ return "GOLD_SPENT_FOR_TRAVELLING";
+ case ACHIEVEMENT_CRITERIA_TYPE_GOLD_SPENT_AT_BARBER:
+ return "GOLD_SPENT_AT_BARBER";
+ case ACHIEVEMENT_CRITERIA_TYPE_GOLD_SPENT_FOR_MAIL:
+ return "GOLD_SPENT_FOR_MAIL";
+ case ACHIEVEMENT_CRITERIA_TYPE_LOOT_MONEY:
+ return "LOOT_MONEY";
+ case ACHIEVEMENT_CRITERIA_TYPE_USE_GAMEOBJECT:
+ return "USE_GAMEOBJECT";
+ case ACHIEVEMENT_CRITERIA_TYPE_BE_SPELL_TARGET2:
+ return "BE_SPELL_TARGET2";
+ case ACHIEVEMENT_CRITERIA_TYPE_SPECIAL_PVP_KILL:
+ return "SPECIAL_PVP_KILL";
+ case ACHIEVEMENT_CRITERIA_TYPE_FISH_IN_GAMEOBJECT:
+ return "FISH_IN_GAMEOBJECT";
+ case ACHIEVEMENT_CRITERIA_TYPE_ON_LOGIN:
+ return "ON_LOGIN";
+ case ACHIEVEMENT_CRITERIA_TYPE_LEARN_SKILLLINE_SPELLS:
+ return "LEARN_SKILLLINE_SPELLS";
+ case ACHIEVEMENT_CRITERIA_TYPE_WIN_DUEL:
+ return "WIN_DUEL";
+ case ACHIEVEMENT_CRITERIA_TYPE_LOSE_DUEL:
+ return "LOSE_DUEL";
+ case ACHIEVEMENT_CRITERIA_TYPE_KILL_CREATURE_TYPE:
+ return "KILL_CREATURE_TYPE";
+ case ACHIEVEMENT_CRITERIA_TYPE_GOLD_EARNED_BY_AUCTIONS:
+ return "GOLD_EARNED_BY_AUCTIONS";
+ case ACHIEVEMENT_CRITERIA_TYPE_CREATE_AUCTION:
+ return "CREATE_AUCTION";
+ case ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_AUCTION_BID:
+ return "HIGHEST_AUCTION_BID";
+ case ACHIEVEMENT_CRITERIA_TYPE_WON_AUCTIONS:
+ return "WON_AUCTIONS";
+ case ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_AUCTION_SOLD:
+ return "HIGHEST_AUCTION_SOLD";
+ case ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_GOLD_VALUE_OWNED:
+ return "HIGHEST_GOLD_VALUE_OWNED";
+ case ACHIEVEMENT_CRITERIA_TYPE_GAIN_REVERED_REPUTATION:
+ return "GAIN_REVERED_REPUTATION";
+ case ACHIEVEMENT_CRITERIA_TYPE_GAIN_HONORED_REPUTATION:
+ return "GAIN_HONORED_REPUTATION";
+ case ACHIEVEMENT_CRITERIA_TYPE_KNOWN_FACTIONS:
+ return "KNOWN_FACTIONS";
+ case ACHIEVEMENT_CRITERIA_TYPE_LOOT_EPIC_ITEM:
+ return "LOOT_EPIC_ITEM";
+ case ACHIEVEMENT_CRITERIA_TYPE_RECEIVE_EPIC_ITEM:
+ return "RECEIVE_EPIC_ITEM";
+ case ACHIEVEMENT_CRITERIA_TYPE_ROLL_NEED:
+ return "ROLL_NEED";
+ case ACHIEVEMENT_CRITERIA_TYPE_ROLL_GREED:
+ return "ROLL_GREED";
+ case ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_HEALTH:
+ return "HIGHEST_HEALTH";
+ case ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_POWER:
+ return "HIGHEST_POWER";
+ case ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_STAT:
+ return "HIGHEST_STAT";
+ case ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_SPELLPOWER:
+ return "HIGHEST_SPELLPOWER";
+ case ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_ARMOR:
+ return "HIGHEST_ARMOR";
+ case ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_RATING:
+ return "HIGHEST_RATING";
+ case ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_HIT_DEALT:
+ return "HIT_DEALT";
+ case ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_HIT_RECEIVED:
+ return "HIT_RECEIVED";
+ case ACHIEVEMENT_CRITERIA_TYPE_TOTAL_DAMAGE_RECEIVED:
+ return "TOTAL_DAMAGE_RECEIVED";
+ case ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_HEAL_CAST:
+ return "HIGHEST_HEAL_CAST";
+ case ACHIEVEMENT_CRITERIA_TYPE_TOTAL_HEALING_RECEIVED:
+ return "TOTAL_HEALING_RECEIVED";
+ case ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_HEALING_RECEIVED:
+ return "HIGHEST_HEALING_RECEIVED";
+ case ACHIEVEMENT_CRITERIA_TYPE_QUEST_ABANDONED:
+ return "QUEST_ABANDONED";
+ case ACHIEVEMENT_CRITERIA_TYPE_FLIGHT_PATHS_TAKEN:
+ return "FLIGHT_PATHS_TAKEN";
+ case ACHIEVEMENT_CRITERIA_TYPE_LOOT_TYPE:
+ return "LOOT_TYPE";
+ case ACHIEVEMENT_CRITERIA_TYPE_CAST_SPELL2:
+ return "CAST_SPELL2";
+ case ACHIEVEMENT_CRITERIA_TYPE_LEARN_SKILL_LINE:
+ return "LEARN_SKILL_LINE";
+ case ACHIEVEMENT_CRITERIA_TYPE_EARN_HONORABLE_KILL:
+ return "EARN_HONORABLE_KILL";
+ case ACHIEVEMENT_CRITERIA_TYPE_ACCEPTED_SUMMONINGS:
+ return "ACCEPTED_SUMMONINGS";
+ case ACHIEVEMENT_CRITERIA_TYPE_EARN_ACHIEVEMENT_POINTS:
+ return "EARN_ACHIEVEMENT_POINTS";
+ case ACHIEVEMENT_CRITERIA_TYPE_USE_LFD_TO_GROUP_WITH_PLAYERS:
+ return "USE_LFD_TO_GROUP_WITH_PLAYERS";
+ }
+ return "MISSING_TYPE";
+}
+
//==========================================================
void AchievementGlobalMgr::LoadAchievementCriteriaList()
{
@@ -2357,7 +2426,7 @@ void AchievementGlobalMgr::LoadAchievementCriteriaData()
AchievementEntry const* achievement = sAchievementMgr->GetAchievement(criteria->referredAchievement);
if (!achievement)
continue;
- if (achievement->categoryId != CATEGORY_CHILDRENS_WEEK)
+ if (achievement->categoryId != CATEGORY_CHILDRENS_WEEK && achievement->ID != 1785)
continue;
break;
}
diff --git a/src/server/game/Achievements/AchievementMgr.h b/src/server/game/Achievements/AchievementMgr.h
index f8869757e50..078229ea4c8 100644
--- a/src/server/game/Achievements/AchievementMgr.h
+++ b/src/server/game/Achievements/AchievementMgr.h
@@ -293,9 +293,12 @@ class AchievementMgr
void CompletedCriteriaFor(AchievementEntry const* achievement);
bool IsCompletedCriteria(AchievementCriteriaEntry const* achievementCriteria, AchievementEntry const* achievement);
bool IsCompletedAchievement(AchievementEntry const* entry);
- bool CanUpdateCriteria(AchievementCriteriaEntry const* criteria, AchievementEntry const* achievement);
+ bool CanUpdateCriteria(AchievementCriteriaEntry const* criteria, AchievementEntry const* achievement, uint32 miscValue1, uint32 miscValue2, Unit const* unit);
void BuildAllDataPacket(WorldPacket* data) const;
+ bool ConditionsSatisfied(AchievementCriteriaEntry const* criteria) const;
+ bool RequirementsSatisfied(AchievementCriteriaEntry const* criteria, AchievementEntry const* achievement, uint32 miscValue1, uint32 miscValue2, Unit const* unit) const;
+
Player* m_player;
CriteriaProgressMap m_criteriaProgress;
CompletedAchievementMap m_completedAchievements;
@@ -309,6 +312,9 @@ class AchievementGlobalMgr
~AchievementGlobalMgr() { }
public:
+ static char const* GetCriteriaTypeString(AchievementCriteriaTypes type);
+ static char const* GetCriteriaTypeString(uint32 type);
+
static AchievementGlobalMgr* instance()
{
static AchievementGlobalMgr instance;
diff --git a/src/server/game/AuctionHouse/AuctionHouseMgr.cpp b/src/server/game/AuctionHouse/AuctionHouseMgr.cpp
index ac2ceb78346..0235aa7e8b6 100644
--- a/src/server/game/AuctionHouse/AuctionHouseMgr.cpp
+++ b/src/server/game/AuctionHouse/AuctionHouseMgr.cpp
@@ -440,8 +440,6 @@ bool AuctionHouseObject::RemoveAuction(AuctionEntry* auction)
// we need to delete the entry, it is not referenced any more
delete auction;
- auction = NULL;
-
return wasInMap;
}
@@ -469,7 +467,7 @@ void AuctionHouseObject::Update()
continue;
///- Either cancel the auction if there was no bidder
- if (auction->bidder == 0)
+ if (auction->bidder == 0 && auction->bid == 0)
{
sAuctionMgr->SendAuctionExpiredMail(auction, trans);
sScriptMgr->OnAuctionExpire(this, auction);
diff --git a/src/server/game/AuctionHouseBot/AuctionHouseBot.cpp b/src/server/game/AuctionHouseBot/AuctionHouseBot.cpp
index 7e8ccb4bb23..c0c753100bc 100644
--- a/src/server/game/AuctionHouseBot/AuctionHouseBot.cpp
+++ b/src/server/game/AuctionHouseBot/AuctionHouseBot.cpp
@@ -204,14 +204,24 @@ void AuctionBotConfig::GetConfigFromFile()
SetConfig(CONFIG_AHBOT_MINTIME, "AuctionHouseBot.MinTime", 1);
SetConfig(CONFIG_AHBOT_MAXTIME, "AuctionHouseBot.MaxTime", 72);
- SetConfigMinMax(CONFIG_AHBOT_BUYER_CHANCE_RATIO_ALLIANCE, "AuctionHouseBot.Buyer.Alliance.Chance.Ratio", 3, 1, 100);
- SetConfigMinMax(CONFIG_AHBOT_BUYER_CHANCE_RATIO_HORDE, "AuctionHouseBot.Buyer.Horde.Chance.Ratio", 3, 1, 100);
- SetConfigMinMax(CONFIG_AHBOT_BUYER_CHANCE_RATIO_NEUTRAL, "AuctionHouseBot.Buyer.Neutral.Chance.Ratio", 3, 1, 100);
SetConfigMinMax(CONFIG_AHBOT_BUYER_RECHECK_INTERVAL, "AuctionHouseBot.Buyer.Recheck.Interval", 20, 1, DAY / MINUTE);
+ SetConfig(CONFIG_AHBOT_BUYER_BASEPRICE_GRAY, "AuctionHouseBot.Buyer.Baseprice.Gray", 3504);
+ SetConfig(CONFIG_AHBOT_BUYER_BASEPRICE_WHITE, "AuctionHouseBot.Buyer.Baseprice.White", 5429);
+ SetConfig(CONFIG_AHBOT_BUYER_BASEPRICE_GREEN, "AuctionHouseBot.Buyer.Baseprice.Green", 21752);
+ SetConfig(CONFIG_AHBOT_BUYER_BASEPRICE_BLUE, "AuctionHouseBot.Buyer.Baseprice.Blue", 36463);
+ SetConfig(CONFIG_AHBOT_BUYER_BASEPRICE_PURPLE, "AuctionHouseBot.Buyer.Baseprice.Purple", 87124);
+ SetConfig(CONFIG_AHBOT_BUYER_BASEPRICE_ORANGE, "AuctionHouseBot.Buyer.Baseprice.Orange", 214347);
+ SetConfig(CONFIG_AHBOT_BUYER_BASEPRICE_YELLOW, "AuctionHouseBot.Buyer.Baseprice.Yellow", 407406);
+ SetConfig(CONFIG_AHBOT_BUYER_CHANCEMULTIPLIER_GRAY, "AuctionHouseBot.Buyer.ChanceMultiplier.Gray", 100);
+ SetConfig(CONFIG_AHBOT_BUYER_CHANCEMULTIPLIER_WHITE, "AuctionHouseBot.Buyer.ChanceMultiplier.White", 100);
+ SetConfig(CONFIG_AHBOT_BUYER_CHANCEMULTIPLIER_GREEN, "AuctionHouseBot.Buyer.ChanceMultiplier.Green", 100);
+ SetConfig(CONFIG_AHBOT_BUYER_CHANCEMULTIPLIER_BLUE, "AuctionHouseBot.Buyer.ChanceMultiplier.Blue", 100);
+ SetConfig(CONFIG_AHBOT_BUYER_CHANCEMULTIPLIER_PURPLE, "AuctionHouseBot.Buyer.ChanceMultiplier.Purple", 100);
+ SetConfig(CONFIG_AHBOT_BUYER_CHANCEMULTIPLIER_ORANGE, "AuctionHouseBot.Buyer.ChanceMultiplier.Orange", 100);
+ SetConfig(CONFIG_AHBOT_BUYER_CHANCEMULTIPLIER_YELLOW, "AuctionHouseBot.Buyer.ChanceMultiplier.Yellow", 100);
SetConfig(CONFIG_AHBOT_SELLER_ENABLED, "AuctionHouseBot.Seller.Enabled", false);
SetConfig(CONFIG_AHBOT_BUYER_ENABLED, "AuctionHouseBot.Buyer.Enabled", false);
- SetConfig(CONFIG_AHBOT_BUYPRICE_BUYER, "AuctionHouseBot.Buyer.Buyprice", true);
SetConfig(CONFIG_AHBOT_CLASS_MISC_MOUNT_MIN_REQ_LEVEL, "AuctionHouseBot.Class.Misc.Mount.ReqLevel.Min", 0);
SetConfig(CONFIG_AHBOT_CLASS_MISC_MOUNT_MAX_REQ_LEVEL, "AuctionHouseBot.Class.Misc.Mount.ReqLevel.Max", 0);
@@ -229,7 +239,7 @@ void AuctionBotConfig::GetConfigFromFile()
char const* AuctionBotConfig::GetHouseTypeName(AuctionHouseType houseType)
{
- static char const* names[MAX_AUCTION_HOUSE_TYPE] = { "Alliance", "Horde", "Neutral" };
+ static char const* names[MAX_AUCTION_HOUSE_TYPE] = { "Neutral", "Alliance", "Horde" };
return names[houseType];
}
diff --git a/src/server/game/AuctionHouseBot/AuctionHouseBot.h b/src/server/game/AuctionHouseBot/AuctionHouseBot.h
index 964262579e6..d7570c37d44 100644
--- a/src/server/game/AuctionHouseBot/AuctionHouseBot.h
+++ b/src/server/game/AuctionHouseBot/AuctionHouseBot.h
@@ -39,9 +39,9 @@ enum AuctionQuality
enum AuctionHouseType
{
- AUCTION_HOUSE_ALLIANCE = 0,
- AUCTION_HOUSE_HORDE = 1,
- AUCTION_HOUSE_NEUTRAL = 2
+ AUCTION_HOUSE_NEUTRAL = 0,
+ AUCTION_HOUSE_ALLIANCE = 1,
+ AUCTION_HOUSE_HORDE = 2
};
#define MAX_AUCTION_HOUSE_TYPE 3
@@ -110,10 +110,21 @@ enum AuctionBotConfigUInt32Values
CONFIG_AHBOT_CLASS_PERMANENT_PRICE_RATIO,
CONFIG_AHBOT_CLASS_MISC_PRICE_RATIO,
CONFIG_AHBOT_CLASS_GLYPH_PRICE_RATIO,
- CONFIG_AHBOT_BUYER_CHANCE_RATIO_ALLIANCE,
- CONFIG_AHBOT_BUYER_CHANCE_RATIO_HORDE,
- CONFIG_AHBOT_BUYER_CHANCE_RATIO_NEUTRAL,
CONFIG_AHBOT_BUYER_RECHECK_INTERVAL,
+ CONFIG_AHBOT_BUYER_BASEPRICE_GRAY,
+ CONFIG_AHBOT_BUYER_BASEPRICE_WHITE,
+ CONFIG_AHBOT_BUYER_BASEPRICE_GREEN,
+ CONFIG_AHBOT_BUYER_BASEPRICE_BLUE,
+ CONFIG_AHBOT_BUYER_BASEPRICE_PURPLE,
+ CONFIG_AHBOT_BUYER_BASEPRICE_ORANGE,
+ CONFIG_AHBOT_BUYER_BASEPRICE_YELLOW,
+ CONFIG_AHBOT_BUYER_CHANCEMULTIPLIER_GRAY,
+ CONFIG_AHBOT_BUYER_CHANCEMULTIPLIER_WHITE,
+ CONFIG_AHBOT_BUYER_CHANCEMULTIPLIER_GREEN,
+ CONFIG_AHBOT_BUYER_CHANCEMULTIPLIER_BLUE,
+ CONFIG_AHBOT_BUYER_CHANCEMULTIPLIER_PURPLE,
+ CONFIG_AHBOT_BUYER_CHANCEMULTIPLIER_ORANGE,
+ CONFIG_AHBOT_BUYER_CHANCEMULTIPLIER_YELLOW,
CONFIG_AHBOT_CLASS_MISC_MOUNT_MIN_REQ_LEVEL,
CONFIG_AHBOT_CLASS_MISC_MOUNT_MAX_REQ_LEVEL,
CONFIG_AHBOT_CLASS_MISC_MOUNT_MIN_SKILL_RANK,
@@ -143,7 +154,6 @@ enum AuctionBotConfigBoolValues
CONFIG_AHBOT_BIND_USE,
CONFIG_AHBOT_BIND_QUEST,
CONFIG_AHBOT_BUYPRICE_SELLER,
- CONFIG_AHBOT_BUYPRICE_BUYER,
CONFIG_AHBOT_SELLER_ENABLED,
CONFIG_AHBOT_BUYER_ENABLED,
CONFIG_AHBOT_LOCKBOX_ENABLED,
diff --git a/src/server/game/AuctionHouseBot/AuctionHouseBotBuyer.cpp b/src/server/game/AuctionHouseBot/AuctionHouseBotBuyer.cpp
index af60316cbec..64463948574 100644
--- a/src/server/game/AuctionHouseBot/AuctionHouseBotBuyer.cpp
+++ b/src/server/game/AuctionHouseBot/AuctionHouseBotBuyer.cpp
@@ -20,7 +20,7 @@
#include "ItemPrototype.h"
#include "AuctionHouseBotBuyer.h"
-AuctionBotBuyer::AuctionBotBuyer(): _checkInterval(20)
+AuctionBotBuyer::AuctionBotBuyer() : _checkInterval(20 * MINUTE)
{
// Define faction for our main data class.
for (int i = 0; i < MAX_AUCTION_HOUSE_TYPE; ++i)
@@ -48,391 +48,394 @@ bool AuctionBotBuyer::Initialize()
if (!activeHouse)
return false;
- //load Check interval
+ // load Check interval
_checkInterval = sAuctionBotConfig->GetConfig(CONFIG_AHBOT_BUYER_RECHECK_INTERVAL) * MINUTE;
- TC_LOG_DEBUG("ahbot", "AHBot buyer interval between 2 check = %u", _checkInterval);
+ TC_LOG_DEBUG("ahbot", "AHBot buyer interval is %u minutes", _checkInterval / MINUTE);
return true;
}
-void AuctionBotBuyer::LoadBuyerValues(BuyerConfiguration& config)
+void AuctionBotBuyer::LoadConfig()
{
- uint32 factionChance;
-
- switch (config.GetHouseType())
+ for (int i = 0; i < MAX_AUCTION_HOUSE_TYPE; ++i)
{
- case AUCTION_HOUSE_ALLIANCE:
- config.BuyerPriceRatio = sAuctionBotConfig->GetConfig(CONFIG_AHBOT_ALLIANCE_PRICE_RATIO) + 50;
- factionChance = sAuctionBotConfig->GetConfig(CONFIG_AHBOT_BUYER_CHANCE_RATIO_ALLIANCE);
- break;
- case AUCTION_HOUSE_HORDE:
- config.BuyerPriceRatio = sAuctionBotConfig->GetConfig(CONFIG_AHBOT_HORDE_PRICE_RATIO) + 50;
- factionChance = sAuctionBotConfig->GetConfig(CONFIG_AHBOT_BUYER_CHANCE_RATIO_HORDE);
- break;
- default:
- config.BuyerPriceRatio = sAuctionBotConfig->GetConfig(CONFIG_AHBOT_NEUTRAL_PRICE_RATIO) + 50;
- factionChance = sAuctionBotConfig->GetConfig(CONFIG_AHBOT_BUYER_CHANCE_RATIO_NEUTRAL);
- break;
+ _houseConfig[i].BuyerEnabled = sAuctionBotConfig->GetConfigBuyerEnabled(AuctionHouseType(i));
+ if (_houseConfig[i].BuyerEnabled)
+ LoadBuyerValues(_houseConfig[i]);
}
+}
+
+void AuctionBotBuyer::LoadBuyerValues(BuyerConfiguration& /* config */)
+{
- config.FactionChance = 5000 * factionChance;
}
-void AuctionBotBuyer::LoadConfig()
+// Makes an AHbot buyer cycle for AH type if necessary
+bool AuctionBotBuyer::Update(AuctionHouseType houseType)
{
- for (int i = 0; i < MAX_AUCTION_HOUSE_TYPE; ++i)
+ if (!sAuctionBotConfig->GetConfigBuyerEnabled(houseType))
+ return false;
+
+ TC_LOG_DEBUG("ahbot", "AHBot: %s buying ...", AuctionBotConfig::GetHouseTypeName(houseType));
+
+ BuyerConfiguration& config = _houseConfig[houseType];
+ uint32 eligibleItems = GetItemInformation(config);
+ if (eligibleItems)
{
- _houseConfig[i].BuyerEnabled = sAuctionBotConfig->GetConfigBuyerEnabled(AuctionHouseType(i));
- if (_houseConfig[i].BuyerEnabled)
- LoadBuyerValues(_houseConfig[i]);
+ // Prepare list of items to bid or buy - remove old items
+ PrepareListOfEntry(config);
+ // Process buying and bidding items
+ BuyAndBidItems(config);
}
+
+ return true;
}
-uint32 AuctionBotBuyer::GetBuyableEntry(BuyerConfiguration& config)
+// Collects information about item counts and minimum prices to SameItemInfo and updates EligibleItems - a list with new items eligible for bot to buy and bid
+// Returns count of items in AH that were eligible for being bought or bidded on by ahbot buyer (EligibleItems size)
+uint32 AuctionBotBuyer::GetItemInformation(BuyerConfiguration& config)
{
config.SameItemInfo.clear();
- uint32 count = 0;
time_t now = time(nullptr);
+ uint32 count = 0;
AuctionHouseObject* house = sAuctionMgr->GetAuctionsMap(config.GetHouseType());
for (AuctionHouseObject::AuctionEntryMap::const_iterator itr = house->GetAuctionsBegin(); itr != house->GetAuctionsEnd(); ++itr)
{
AuctionEntry* entry = itr->second;
Item* item = sAuctionMgr->GetAItem(entry->itemGUIDLow);
- if (item)
+ if (!item)
+ continue;
+
+ BuyerItemInfo& itemInfo = config.SameItemInfo[item->GetEntry()];
+
+ // Update item entry's count and total bid prices
+ // This can be used later to determine the prices and chances to bid
+ uint32 itemBidPrice = entry->startbid / item->GetCount();
+ itemInfo.TotalBidPrice = itemInfo.TotalBidPrice + itemBidPrice;
+ itemInfo.BidItemCount++;
+
+ // Set minimum bid price
+ if (!itemInfo.MinBidPrice)
+ itemInfo.MinBidPrice = itemBidPrice;
+ else
+ itemBidPrice = std::min(itemInfo.MinBidPrice, itemBidPrice);
+
+ // Set minimum buyout price if item has buyout
+ if (entry->buyout)
+ {
+ // Update item entry's count and total buyout prices
+ // This can be used later to determine the prices and chances to buyout
+ uint32 itemBuyPrice = entry->buyout / item->GetCount();
+ itemInfo.TotalBuyPrice = itemInfo.TotalBuyPrice + itemBuyPrice;
+ itemInfo.BuyItemCount++;
+
+ if (!itemInfo.MinBuyPrice)
+ itemInfo.MinBuyPrice = itemBuyPrice;
+ else
+ itemInfo.MinBuyPrice = std::min(itemInfo.MinBuyPrice, itemBuyPrice);
+ }
+
+ // Add/update to EligibleItems if:
+ // has a bid by player or
+ // has no bids and not owned by bot
+ if ((entry->bid && entry->bidder) || (entry->owner && !entry->bid))
{
- ItemTemplate const * prototype = item->GetTemplate();
- if (prototype)
- {
- ++config.SameItemInfo[item->GetEntry()].ItemCount; // Structure constructor will make sure Element are correctly initialized if entry is created here.
- config.SameItemInfo[item->GetEntry()].BuyPrice = config.SameItemInfo[item->GetEntry()].BuyPrice + (itr->second->buyout / item->GetCount());
- config.SameItemInfo[item->GetEntry()].BidPrice = config.SameItemInfo[item->GetEntry()].BidPrice + (itr->second->startbid / item->GetCount());
- if (itr->second->buyout != 0)
- {
- if (itr->second->buyout / item->GetCount() < config.SameItemInfo[item->GetEntry()].MinBuyPrice)
- config.SameItemInfo[item->GetEntry()].MinBuyPrice = itr->second->buyout / item->GetCount();
- else if (config.SameItemInfo[item->GetEntry()].MinBuyPrice == 0)
- config.SameItemInfo[item->GetEntry()].MinBuyPrice = itr->second->buyout / item->GetCount();
- }
- if (itr->second->startbid / item->GetCount() < config.SameItemInfo[item->GetEntry()].MinBidPrice)
- config.SameItemInfo[item->GetEntry()].MinBidPrice = itr->second->startbid / item->GetCount();
- else if (config.SameItemInfo[item->GetEntry()].MinBidPrice == 0)
- config.SameItemInfo[item->GetEntry()].MinBidPrice = itr->second->startbid / item->GetCount();
-
- if (!entry->owner)
- {
-
- if (entry->bid != 0 && entry->bidder) // Add bid by player
- {
- config.CheckedEntry[entry->Id].LastExist = now;
- config.CheckedEntry[entry->Id].AuctionId = entry->Id;
- ++count;
- }
- }
- else
- {
- if (entry->bid != 0)
- {
- if (entry->bidder)
- {
- config.CheckedEntry[entry->Id].LastExist = now;
- config.CheckedEntry[entry->Id].AuctionId = entry->Id;
- ++count;
- }
- }
- else
- {
- config.CheckedEntry[entry->Id].LastExist = now;
- config.CheckedEntry[entry->Id].AuctionId = entry->Id;
- ++count;
- }
- }
- }
+ config.EligibleItems[entry->Id].LastExist = now;
+ config.EligibleItems[entry->Id].AuctionId = entry->Id;
+ ++count;
}
}
- TC_LOG_DEBUG("ahbot", "AHBot: %u items added to buyable vector for ah type: %u", count, config.GetHouseType());
+ TC_LOG_DEBUG("ahbot", "AHBot: %u items added to buyable/biddable vector for ah type: %u", count, config.GetHouseType());
TC_LOG_DEBUG("ahbot", "AHBot: SameItemInfo size = %u", (uint32)config.SameItemInfo.size());
return count;
}
-void AuctionBotBuyer::PrepareListOfEntry(BuyerConfiguration& config)
+// ahInfo can be NULL
+bool AuctionBotBuyer::RollBuyChance(const BuyerItemInfo* ahInfo, const Item* item, const AuctionEntry* auction, uint32 /*bidPrice*/)
{
- time_t now = time(nullptr) - 5;
+ if (!auction->buyout)
+ return false;
- for (CheckEntryMap::iterator itr = config.CheckedEntry.begin(); itr != config.CheckedEntry.end();)
- {
- if (itr->second.LastExist < (now - 5))
- config.CheckedEntry.erase(itr++);
- else
- ++itr;
- }
+ uint32 itemBuyPrice = auction->buyout / item->GetCount();
+ uint32 itemPrice = item->GetTemplate()->SellPrice ? item->GetTemplate()->SellPrice : GetVendorPrice(item->GetTemplate()->Quality);
+ // The AH cut needs to be added to the price, but we dont want a 100% chance to buy if the price is exactly AH default
+ itemPrice *= 1.4f;
- TC_LOG_DEBUG("ahbot", "AHBot: CheckedEntry size = %u", (uint32)config.CheckedEntry.size());
-}
+ // This value is between 0 and 100 and is used directly as the chance to buy or bid
+ // Value equal or above 100 means 100% chance and value below 0 means 0% chance
+ float chance = 100 / sqrt(itemBuyPrice / float(itemPrice));
-bool AuctionBotBuyer::IsBuyableEntry(uint32 buyoutPrice, double inGameBuyPrice, uint32 maxBuyablePrice, uint32 minBuyPrice, uint32 maxChance, uint32 chanceRatio)
-{
- double ratio = 0;
- uint32 chance = 0;
+ // If a player has bidded on item, have fifth of normal chance
+ if (auction->bidder)
+ chance = chance / 5;
- if (buyoutPrice <= minBuyPrice)
+ if (ahInfo)
{
- if (buyoutPrice <= maxBuyablePrice)
- chance = maxChance;
- else
- {
+ float avgBuyPrice = ahInfo->TotalBuyPrice / float(ahInfo->BuyItemCount);
- if (buyoutPrice > 0 && maxBuyablePrice > 0)
- {
- ratio = double(buyoutPrice) / double(maxBuyablePrice);
- if (ratio < 10)
- chance = maxChance - (ratio * maxChance / 10);
- else
- chance = 1;
- }
- }
- }
- else if (buyoutPrice <= inGameBuyPrice)
- {
- if (buyoutPrice <= maxBuyablePrice)
- chance = maxChance / 5;
- else
- {
+ TC_LOG_DEBUG("ahbot", "AHBot: buyout average: %.1f items with buyout: %u", avgBuyPrice, ahInfo->BuyItemCount);
- if (buyoutPrice > 0 && maxBuyablePrice > 0)
- {
- ratio = double(buyoutPrice) / double(maxBuyablePrice);
- if (ratio < 10)
- chance = (maxChance / 5) - (ratio * maxChance / 50);
- else
- chance = 1;
- }
- }
- }
- else if (buyoutPrice <= maxBuyablePrice)
- chance = maxChance / 10;
- else
- {
- if (buyoutPrice > 0 && maxBuyablePrice > 0)
+ // If there are more than 5 items on AH of this entry, try weigh in the average buyout price
+ if (ahInfo->BuyItemCount > 5)
{
- ratio = double(buyoutPrice) / double(maxBuyablePrice);
- if (ratio < 10)
- chance = (maxChance / 5) - (ratio* maxChance / 50);
- else
- chance = 0;
+ chance *= 1 / sqrt(itemBuyPrice / avgBuyPrice);
}
- else
- chance = 0;
}
- if (urand(1, chanceRatio) <= chance)
- {
- TC_LOG_DEBUG("ahbot", "AHBot: WIN BUY! Chance = %u, num = %u.", chance, chanceRatio);
- return true;
- }
- else
- {
- TC_LOG_DEBUG("ahbot", "AHBot: LOOSE BUY! Chance = %u, num = %u.", chance, chanceRatio);
- return false;
- }
+ // Add config weigh in for quality
+ chance *= GetChanceMultiplier(item->GetTemplate()->Quality) / 100.0f;
+
+ float rand = frand(0, 100);
+ bool win = rand <= chance;
+ TC_LOG_DEBUG("ahbot", "AHBot: %s BUY! chance = %.2f, price = %u, buyprice = %u.", win ? "WIN" : "LOSE", chance, itemPrice, itemBuyPrice);
+ return win;
}
-bool AuctionBotBuyer::IsBidableEntry(uint32 bidPrice, double inGameBuyPrice, double maxBidablePrice, uint32 minBidPrice, uint32 maxChance, uint32 chanceRatio)
+// ahInfo can be NULL
+bool AuctionBotBuyer::RollBidChance(const BuyerItemInfo* ahInfo, const Item* item, const AuctionEntry* auction, uint32 bidPrice)
{
- double ratio = 0;
- uint32 chance = 0;
+ uint32 itemBidPrice = bidPrice / item->GetCount();
+ uint32 itemPrice = item->GetTemplate()->SellPrice ? item->GetTemplate()->SellPrice : GetVendorPrice(item->GetTemplate()->Quality);
+ // The AH cut needs to be added to the price, but we dont want a 100% chance to buy if the price is exactly AH default
+ itemPrice *= 1.4f;
- if (bidPrice <= minBidPrice)
- {
- if (inGameBuyPrice != 0 && bidPrice < inGameBuyPrice - (inGameBuyPrice / 30))
- chance = maxChance;
- else
- {
- if (bidPrice < maxBidablePrice)
- {
- ratio = maxBidablePrice / bidPrice;
- if (ratio < 3)
- chance = maxChance / 500 * ratio;
- else
- chance = maxChance / 500;
- }
- }
- }
- else if (bidPrice < (inGameBuyPrice - (inGameBuyPrice / 30)))
- chance = (maxChance / 10);
- else
+ // This value is between 0 and 100 and is used directly as the chance to buy or bid
+ // Value equal or above 100 means 100% chance and value below 0 means 0% chance
+ float chance = 100 / sqrt(itemBidPrice / float(itemPrice));
+
+ if (ahInfo)
{
- if (bidPrice < maxBidablePrice)
+ float avgBidPrice = ahInfo->TotalBidPrice / float(ahInfo->BidItemCount);
+
+ TC_LOG_DEBUG("ahbot", "AHBot: Bid average: %.1f biddable item count: %u", avgBidPrice, ahInfo->BidItemCount);
+
+ // If there are more than 5 items on AH of this entry, try weigh in the average bid price
+ if (ahInfo->BidItemCount >= 5)
{
- ratio = maxBidablePrice / bidPrice;
- if (ratio < 4)
- chance = maxChance / 1000 * ratio;
- else
- chance = maxChance / 1000;
+ chance *= 1 / sqrt(itemBidPrice / avgBidPrice);
}
}
- if (urand(1, chanceRatio) <= chance)
- {
- TC_LOG_DEBUG("ahbot", "AHBot: WIN BID! Chance = %u, num = %u.", chance, chanceRatio);
- return true;
- }
- else
- {
- TC_LOG_DEBUG("ahbot", "AHBot: LOOSE BID! Chance = %u, num = %u.", chance, chanceRatio);
- return false;
- }
-}
+ // If a player has bidded on item, have fifth of normal chance
+ if (auction->bidder)
+ chance = chance / 5;
-void AuctionBotBuyer::PlaceBidToEntry(AuctionEntry* auction, uint32 bidPrice)
-{
- TC_LOG_DEBUG("ahbot", "AHBot: Bid placed to entry %u, %.2fg", auction->Id, float(bidPrice) / 10000.0f);
- auction->bid = bidPrice;
+ // Add config weigh in for quality
+ chance *= GetChanceMultiplier(item->GetTemplate()->Quality) / 100.0f;
+
+ float rand = frand(0, 100);
+ bool win = rand <= chance;
+ TC_LOG_DEBUG("ahbot", "AHBot: %s BID! chance = %.2f, price = %u, bidprice = %u.", win ? "WIN" : "LOSE", chance, itemPrice, itemBidPrice);
+ return win;
}
-void AuctionBotBuyer::BuyEntry(AuctionEntry* auction)
+// Removes items from EligibleItems that we shouldnt buy or bid on
+// The last existed time on them should be older than now
+void AuctionBotBuyer::PrepareListOfEntry(BuyerConfiguration& config)
{
- TC_LOG_DEBUG("ahbot", "AHBot: Entry %u bought at %.2fg", auction->Id, float(auction->buyout) / 10000.0f);
- auction->bid = auction->buyout;
+ // now - 5 seconds to leave out all old entries but keep the ones just updated a moment ago
+ time_t now = time(nullptr) - 5;
+
+ for (CheckEntryMap::iterator itr = config.EligibleItems.begin(); itr != config.EligibleItems.end();)
+ {
+ if (itr->second.LastExist < now)
+ config.EligibleItems.erase(itr++);
+ else
+ ++itr;
+ }
+
+ TC_LOG_DEBUG("ahbot", "AHBot: EligibleItems size = %u", (uint32)config.EligibleItems.size());
}
-void AuctionBotBuyer::AddNewAuctionBuyerBotBid(BuyerConfiguration& config)
+// Tries to bid and buy items based on their prices and chances set in configs
+void AuctionBotBuyer::BuyAndBidItems(BuyerConfiguration& config)
{
+ time_t now = time(nullptr);
AuctionHouseObject* auctionHouse = sAuctionMgr->GetAuctionsMap(config.GetHouseType());
+ CheckEntryMap& items = config.EligibleItems;
- PrepareListOfEntry(config);
-
- time_t now = time(nullptr);
- uint32 buyCycles;
- if (config.CheckedEntry.size() > sAuctionBotConfig->GetItemPerCycleBoost())
+ // Max amount of items to buy or bid
+ uint32 cycles = sAuctionBotConfig->GetItemPerCycleNormal();
+ if (items.size() > sAuctionBotConfig->GetItemPerCycleBoost())
{
- buyCycles = sAuctionBotConfig->GetItemPerCycleBoost();
+ // set more cycles if there is a huge influx of items
+ cycles = sAuctionBotConfig->GetItemPerCycleBoost();
TC_LOG_DEBUG("ahbot", "AHBot: Boost value used for Buyer! (if this happens often adjust both ItemsPerCycle in worldserver.conf)");
}
- else
- buyCycles = sAuctionBotConfig->GetItemPerCycleNormal();
- for (CheckEntryMap::iterator itr = config.CheckedEntry.begin(); itr != config.CheckedEntry.end();)
+ // Process items eligible to be bidded or bought
+ CheckEntryMap::iterator itr = items.begin();
+ while (cycles && itr != items.end())
{
AuctionEntry* auction = auctionHouse->GetAuction(itr->second.AuctionId);
- if (!auction) // is auction not active now
+ if (!auction)
{
- TC_LOG_DEBUG("ahbot", "AHBot: Entry %u doesn't exists, perhaps bought already?",
- itr->second.AuctionId);
-
- config.CheckedEntry.erase(itr++);
+ TC_LOG_DEBUG("ahbot", "AHBot: Entry %u doesn't exists, perhaps bought already?", itr->second.AuctionId);
+ items.erase(itr++);
continue;
}
- if (itr->second.LastChecked != 0 && (now - itr->second.LastChecked) <= _checkInterval)
+ // Check if the item has been checked once before
+ // If it has been checked and it was recently, skip it
+ if (itr->second.LastChecked && (now - itr->second.LastChecked) <= _checkInterval)
{
TC_LOG_DEBUG("ahbot", "AHBot: In time interval wait for entry %u!", auction->Id);
++itr;
continue;
}
- if (buyCycles == 0)
- break;
-
- uint32 maxChance = 5000;
-
Item* item = sAuctionMgr->GetAItem(auction->itemGUIDLow);
- if (!item) // auction item not accessible, possible auction in payment pending mode
+ if (!item)
{
- config.CheckedEntry.erase(itr++);
+ // auction item not accessible, possible auction in payment pending mode
+ items.erase(itr++);
continue;
}
- ItemTemplate const* prototype = item->GetTemplate();
-
- uint32 basePrice = sAuctionBotConfig->GetConfig(CONFIG_AHBOT_BUYPRICE_BUYER) ? prototype->BuyPrice : prototype->SellPrice;
- basePrice *= item->GetCount();
-
- uint32 maxBuyablePrice = (basePrice * config.BuyerPriceRatio) / 100;
- BuyerItemInfoMap::iterator sameItemItr = config.SameItemInfo.find(item->GetEntry());
- uint32 buyoutPrice = auction->buyout / item->GetCount();
-
+ // price to bid if bidding
uint32 bidPrice;
- uint32 bidPriceByItem;
- uint32 minBidPrice;
- uint32 minBuyPrice;
if (auction->bid >= auction->startbid)
{
- bidPrice = auction->GetAuctionOutBid();
- bidPriceByItem = auction->bid / item->GetCount();
+ // get bid price to outbid previous bidder
+ bidPrice = auction->bid + auction->GetAuctionOutBid();
}
else
{
+ // no previous bidders - use starting bid
bidPrice = auction->startbid;
- bidPriceByItem = auction->startbid / item->GetCount();
}
- double inGameBuyPrice;
- double inGameBidPrice;
- if (sameItemItr == config.SameItemInfo.end())
- {
- inGameBuyPrice = 0;
- inGameBidPrice = 0;
- minBidPrice = 0;
- minBuyPrice = 0;
- }
- else
- {
- if (sameItemItr->second.ItemCount == 1)
- maxBuyablePrice = maxBuyablePrice * 5; // if only one item exist can be bought if the price is high too.
- inGameBuyPrice = sameItemItr->second.BuyPrice / sameItemItr->second.ItemCount;
- inGameBidPrice = sameItemItr->second.BidPrice / sameItemItr->second.ItemCount;
- minBidPrice = sameItemItr->second.MinBidPrice;
- minBuyPrice = sameItemItr->second.MinBuyPrice;
- }
+ const BuyerItemInfo* ahInfo = nullptr;
+ BuyerItemInfoMap::const_iterator sameItemItr = config.SameItemInfo.find(item->GetEntry());
+ if (sameItemItr != config.SameItemInfo.end())
+ ahInfo = &sameItemItr->second;
- uint32 maxBidablePrice = maxBuyablePrice - (maxBuyablePrice / 30); // Max Bidable price defined to 70% of max buyable price
+ TC_LOG_DEBUG("ahbot", "AHBot: Rolling for AHentry %u:", auction->Id);
- TC_LOG_DEBUG("ahbot", "AHBot: Auction added with data:");
- TC_LOG_DEBUG("ahbot", "AHBot: MaxPrice of Entry %u is %.1fg.", itr->second.AuctionId, double(maxBuyablePrice) / 10000.0);
- TC_LOG_DEBUG("ahbot", "AHBot: GamePrice buy=%.1fg, bid=%.1fg.", inGameBuyPrice / 10000, inGameBidPrice / 10000);
- TC_LOG_DEBUG("ahbot", "AHBot: Minimal price see in AH Buy=%ug, Bid=%ug.",
- minBuyPrice / 10000, minBidPrice / 10000);
- TC_LOG_DEBUG("ahbot", "AHBot: Actual Entry price, Buy=%ug, Bid=%ug.", buyoutPrice / 10000, bidPrice / 10000);
+ // Roll buy and bid chances
+ bool successBuy = RollBuyChance(ahInfo, item, auction, bidPrice);
+ bool successBid = RollBidChance(ahInfo, item, auction, bidPrice);
- if (!auction->owner) // Original auction owner
- maxChance = maxChance / 5; // if Owner is AHBot this mean player placed bid on this auction. We divide by 5 chance for AhBuyer to place bid on it. (This make more challenge than ignore entry)
- if (auction->buyout != 0) // Is the item directly buyable?
- {
- if (IsBuyableEntry(buyoutPrice, inGameBuyPrice, maxBuyablePrice, minBuyPrice, maxChance, config.FactionChance))
- {
- if (IsBidableEntry(bidPriceByItem, inGameBuyPrice, maxBidablePrice, minBidPrice, maxChance / 2, config.FactionChance))
- {
- if (urand(0, 5) == 0)
- PlaceBidToEntry(auction, bidPrice);
- else
- BuyEntry(auction);
- }
- else
- BuyEntry(auction);
- }
- else if (IsBidableEntry(bidPriceByItem, inGameBuyPrice, maxBidablePrice, minBidPrice, maxChance / 2, config.FactionChance))
- PlaceBidToEntry(auction, bidPrice);
- }
- else if (IsBidableEntry(bidPriceByItem, inGameBuyPrice, maxBidablePrice, minBidPrice, maxChance, config.FactionChance))
- PlaceBidToEntry(auction, bidPrice);
+ // If roll bidding succesfully and bid price is above buyout -> buyout
+ // If roll for buying was successful but not for bid, buyout directly
+ // If roll bidding was also successful, buy the entry with 20% chance
+ // - Better bid than buy since the item is bought by bot if no player bids after
+ // Otherwise bid if roll for bid was successful
+ if ((auction->buyout && successBid && bidPrice >= auction->buyout) ||
+ (successBuy && (!successBid || urand(1, 5) == 1)))
+ BuyEntry(auction, auctionHouse); // buyout
+ else if (successBid)
+ PlaceBidToEntry(auction, bidPrice); // bid
itr->second.LastChecked = now;
- --buyCycles;
-
+ --cycles;
++itr;
}
+
+ // Clear not needed entries
+ config.SameItemInfo.clear();
}
-bool AuctionBotBuyer::Update(AuctionHouseType houseType)
+uint32 AuctionBotBuyer::GetVendorPrice(uint32 quality)
{
- if (sAuctionBotConfig->GetConfigBuyerEnabled(houseType))
+ switch (quality)
{
- TC_LOG_DEBUG("ahbot", "AHBot: %s buying ...", AuctionBotConfig::GetHouseTypeName(houseType));
- if (GetBuyableEntry(_houseConfig[houseType]) > 0)
- AddNewAuctionBuyerBotBid(_houseConfig[houseType]);
- return true;
+ case ITEM_QUALITY_POOR:
+ return sAuctionBotConfig->GetConfig(CONFIG_AHBOT_BUYER_BASEPRICE_GRAY);
+ case ITEM_QUALITY_NORMAL:
+ return sAuctionBotConfig->GetConfig(CONFIG_AHBOT_BUYER_BASEPRICE_WHITE);
+ case ITEM_QUALITY_UNCOMMON:
+ return sAuctionBotConfig->GetConfig(CONFIG_AHBOT_BUYER_BASEPRICE_GREEN);
+ case ITEM_QUALITY_RARE:
+ return sAuctionBotConfig->GetConfig(CONFIG_AHBOT_BUYER_BASEPRICE_BLUE);
+ case ITEM_QUALITY_EPIC:
+ return sAuctionBotConfig->GetConfig(CONFIG_AHBOT_BUYER_BASEPRICE_PURPLE);
+ case ITEM_QUALITY_LEGENDARY:
+ return sAuctionBotConfig->GetConfig(CONFIG_AHBOT_BUYER_BASEPRICE_ORANGE);
+ case ITEM_QUALITY_ARTIFACT:
+ return sAuctionBotConfig->GetConfig(CONFIG_AHBOT_BUYER_BASEPRICE_YELLOW);
+ default:
+ return 1 * SILVER;
}
+}
+
+uint32 AuctionBotBuyer::GetChanceMultiplier(uint32 quality)
+{
+ switch (quality)
+ {
+ case ITEM_QUALITY_POOR:
+ return sAuctionBotConfig->GetConfig(CONFIG_AHBOT_BUYER_CHANCEMULTIPLIER_GRAY);
+ case ITEM_QUALITY_NORMAL:
+ return sAuctionBotConfig->GetConfig(CONFIG_AHBOT_BUYER_CHANCEMULTIPLIER_WHITE);
+ case ITEM_QUALITY_UNCOMMON:
+ return sAuctionBotConfig->GetConfig(CONFIG_AHBOT_BUYER_CHANCEMULTIPLIER_GREEN);
+ case ITEM_QUALITY_RARE:
+ return sAuctionBotConfig->GetConfig(CONFIG_AHBOT_BUYER_CHANCEMULTIPLIER_BLUE);
+ case ITEM_QUALITY_EPIC:
+ return sAuctionBotConfig->GetConfig(CONFIG_AHBOT_BUYER_CHANCEMULTIPLIER_PURPLE);
+ case ITEM_QUALITY_LEGENDARY:
+ return sAuctionBotConfig->GetConfig(CONFIG_AHBOT_BUYER_CHANCEMULTIPLIER_ORANGE);
+ case ITEM_QUALITY_ARTIFACT:
+ return sAuctionBotConfig->GetConfig(CONFIG_AHBOT_BUYER_CHANCEMULTIPLIER_YELLOW);
+ default:
+ return 100;
+ }
+}
+
+// Buys the auction and does necessary actions to complete the buyout
+void AuctionBotBuyer::BuyEntry(AuctionEntry* auction, AuctionHouseObject* auctionHouse)
+{
+ TC_LOG_DEBUG("ahbot", "AHBot: Entry %u bought at %.2fg", auction->Id, float(auction->buyout) / GOLD);
+
+ SQLTransaction trans = CharacterDatabase.BeginTransaction();
+
+ // Send mail to previous bidder if any
+ if (auction->bidder)
+ sAuctionMgr->SendAuctionOutbiddedMail(auction, auction->buyout, NULL, trans);
+
+ // Set bot as bidder and set new bid amount
+ auction->bidder = 0;
+ auction->bid = auction->buyout;
+
+ // Mails must be under transaction control too to prevent data loss
+ sAuctionMgr->SendAuctionSalePendingMail(auction, trans);
+ sAuctionMgr->SendAuctionSuccessfulMail(auction, trans);
+ sAuctionMgr->SendAuctionWonMail(auction, trans);
+
+ // Delete auction from DB
+ auction->DeleteFromDB(trans);
+
+ // Remove auction item and auction from memory
+ sAuctionMgr->RemoveAItem(auction->itemGUIDLow);
+ auctionHouse->RemoveAuction(auction);
+
+ // Run SQLs
+ CharacterDatabase.CommitTransaction(trans);
+}
+
+// Bids on the auction and does the necessary actions for bidding
+void AuctionBotBuyer::PlaceBidToEntry(AuctionEntry* auction, uint32 bidPrice)
+{
+ TC_LOG_DEBUG("ahbot", "AHBot: Bid placed to entry %u, %.2fg", auction->Id, float(bidPrice) / GOLD);
+
+ SQLTransaction trans = CharacterDatabase.BeginTransaction();
+
+ // Send mail to previous bidder if any
+ if (auction->bidder)
+ sAuctionMgr->SendAuctionOutbiddedMail(auction, bidPrice, NULL, trans);
+
+ // Set bot as bidder and set new bid amount
+ auction->bidder = 0;
+ auction->bid = bidPrice;
+
+ // Update auction to DB
+ PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_AUCTION_BID);
+ stmt->setUInt32(0, auction->bidder);
+ stmt->setUInt32(1, auction->bid);
+ stmt->setUInt32(2, auction->Id);
+ trans->Append(stmt);
- return false;
+ // Run SQLs
+ CharacterDatabase.CommitTransaction(trans);
}
diff --git a/src/server/game/AuctionHouseBot/AuctionHouseBotBuyer.h b/src/server/game/AuctionHouseBot/AuctionHouseBotBuyer.h
index bd8d6e46f0e..c030731cb40 100644
--- a/src/server/game/AuctionHouseBot/AuctionHouseBotBuyer.h
+++ b/src/server/game/AuctionHouseBot/AuctionHouseBotBuyer.h
@@ -24,7 +24,7 @@
struct BuyerAuctionEval
{
- BuyerAuctionEval(): AuctionId(0), LastChecked(0), LastExist(0) {}
+ BuyerAuctionEval() : AuctionId(0), LastChecked(0), LastExist(0) { }
uint32 AuctionId;
time_t LastChecked;
@@ -33,13 +33,14 @@ struct BuyerAuctionEval
struct BuyerItemInfo
{
- BuyerItemInfo(): ItemCount(0), BuyPrice(0), BidPrice(0), MinBuyPrice(0), MinBidPrice(0) {}
+ BuyerItemInfo() : BidItemCount(0), BuyItemCount(0), MinBuyPrice(0), MinBidPrice(0), TotalBuyPrice(0), TotalBidPrice(0) { }
- uint32 ItemCount;
- double BuyPrice;
- double BidPrice;
+ uint32 BidItemCount;
+ uint32 BuyItemCount;
uint32 MinBuyPrice;
uint32 MinBidPrice;
+ double TotalBuyPrice;
+ double TotalBidPrice;
};
typedef std::map<uint32, BuyerItemInfo> BuyerItemInfoMap;
@@ -47,7 +48,7 @@ typedef std::map<uint32, BuyerAuctionEval> CheckEntryMap;
struct BuyerConfiguration
{
- BuyerConfiguration(): FactionChance(3), BuyerEnabled(false), BuyerPriceRatio(100), _houseType(AUCTION_HOUSE_NEUTRAL) {}
+ BuyerConfiguration() : BuyerEnabled(false), _houseType(AUCTION_HOUSE_NEUTRAL) { }
void Initialize(AuctionHouseType houseType)
{
@@ -57,10 +58,8 @@ struct BuyerConfiguration
AuctionHouseType GetHouseType() const { return _houseType; }
BuyerItemInfoMap SameItemInfo;
- CheckEntryMap CheckedEntry;
- uint32 FactionChance;
+ CheckEntryMap EligibleItems;
bool BuyerEnabled;
- uint32 BuyerPriceRatio;
private:
AuctionHouseType _houseType;
@@ -78,19 +77,23 @@ public:
bool Update(AuctionHouseType houseType) override;
void LoadConfig();
- void AddNewAuctionBuyerBotBid(BuyerConfiguration& config);
+ void BuyAndBidItems(BuyerConfiguration& config);
private:
uint32 _checkInterval;
BuyerConfiguration _houseConfig[MAX_AUCTION_HOUSE_TYPE];
void LoadBuyerValues(BuyerConfiguration& config);
- bool IsBuyableEntry(uint32 buyoutPrice, double inGameBuyPrice, uint32 maxBuyablePrice, uint32 minBuyPrice, uint32 maxChance, uint32 chanceRatio);
- bool IsBidableEntry(uint32 bidPrice, double inGameBuyPrice, double maxBidablePrice, uint32 minBidPrice, uint32 maxChance, uint32 chanceRatio);
+
+ // ahInfo can be NULL
+ bool RollBuyChance(const BuyerItemInfo* ahInfo, const Item* item, const AuctionEntry* auction, uint32 bidPrice);
+ bool RollBidChance(const BuyerItemInfo* ahInfo, const Item* item, const AuctionEntry* auction, uint32 bidPrice);
void PlaceBidToEntry(AuctionEntry* auction, uint32 bidPrice);
- void BuyEntry(AuctionEntry* auction);
+ void BuyEntry(AuctionEntry* auction, AuctionHouseObject* auctionHouse);
void PrepareListOfEntry(BuyerConfiguration& config);
- uint32 GetBuyableEntry(BuyerConfiguration& config);
+ uint32 GetItemInformation(BuyerConfiguration& config);
+ uint32 GetVendorPrice(uint32 quality);
+ uint32 GetChanceMultiplier(uint32 quality);
};
#endif
diff --git a/src/server/game/AuctionHouseBot/AuctionHouseBotSeller.cpp b/src/server/game/AuctionHouseBot/AuctionHouseBotSeller.cpp
index dff4077d569..733bd5e9ec8 100644
--- a/src/server/game/AuctionHouseBot/AuctionHouseBotSeller.cpp
+++ b/src/server/game/AuctionHouseBot/AuctionHouseBotSeller.cpp
@@ -44,14 +44,14 @@ bool AuctionBotSeller::Initialize()
{
std::stringstream includeStream(sAuctionBotConfig->GetAHBotIncludes());
std::string temp;
- while (getline(includeStream, temp, ','))
+ while (std::getline(includeStream, temp, ','))
includeItems.push_back(atoi(temp.c_str()));
}
{
std::stringstream excludeStream(sAuctionBotConfig->GetAHBotExcludes());
std::string temp;
- while (getline(excludeStream, temp, ','))
+ while (std::getline(excludeStream, temp, ','))
excludeItems.push_back(atoi(temp.c_str()));
}
diff --git a/src/server/game/Battlegrounds/ArenaTeam.cpp b/src/server/game/Battlegrounds/ArenaTeam.cpp
index 7ed05205f39..3b7e9ac3f33 100644
--- a/src/server/game/Battlegrounds/ArenaTeam.cpp
+++ b/src/server/game/Battlegrounds/ArenaTeam.cpp
@@ -179,7 +179,7 @@ bool ArenaTeam::AddMember(ObjectGuid playerGuid)
player->SetArenaTeamInfoField(GetSlot(), ARENA_TEAM_MEMBER, 1);
}
- TC_LOG_INFO("bg.arena", "Player: %s [%s] joined arena team type: %u [Id: %u, Name: %s].", playerName.c_str(), playerGuid.ToString().c_str(), GetType(), GetId(), GetName().c_str());
+ TC_LOG_DEBUG("bg.arena", "Player: %s [%s] joined arena team type: %u [Id: %u, Name: %s].", playerName.c_str(), playerGuid.ToString().c_str(), GetType(), GetId(), GetName().c_str());
return true;
}
diff --git a/src/server/game/Battlegrounds/Battleground.cpp b/src/server/game/Battlegrounds/Battleground.cpp
index e091df160a3..03b4fe3dea6 100644
--- a/src/server/game/Battlegrounds/Battleground.cpp
+++ b/src/server/game/Battlegrounds/Battleground.cpp
@@ -510,7 +510,7 @@ inline void Battleground::_ProcessJoin(uint32 diff)
if (!aura->IsPermanent()
&& aura->GetDuration() <= 30*IN_MILLISECONDS
&& aurApp->IsPositive()
- && (!(aura->GetSpellInfo()->Attributes & SPELL_ATTR0_UNAFFECTED_BY_INVULNERABILITY))
+ && (!aura->GetSpellInfo()->HasAttribute(SPELL_ATTR0_UNAFFECTED_BY_INVULNERABILITY))
&& (!aura->HasEffectType(SPELL_AURA_MOD_INVISIBILITY)))
player->RemoveAura(iter);
else
diff --git a/src/server/game/CMakeLists.txt b/src/server/game/CMakeLists.txt
index eb8627efa44..2f7bc4a9c69 100644
--- a/src/server/game/CMakeLists.txt
+++ b/src/server/game/CMakeLists.txt
@@ -110,6 +110,7 @@ include_directories(
${CMAKE_SOURCE_DIR}/dep/recastnavigation/Recast/Include
${CMAKE_SOURCE_DIR}/dep/g3dlite/include
${CMAKE_SOURCE_DIR}/dep/SFMT
+ ${CMAKE_SOURCE_DIR}/dep/cppformat
${CMAKE_SOURCE_DIR}/dep/zlib
${CMAKE_SOURCE_DIR}/src/server/collision
${CMAKE_SOURCE_DIR}/src/server/collision/Management
diff --git a/src/server/game/Chat/Chat.cpp b/src/server/game/Chat/Chat.cpp
index 44df1097dd4..3195de9b6bd 100644
--- a/src/server/game/Chat/Chat.cpp
+++ b/src/server/game/Chat/Chat.cpp
@@ -104,17 +104,6 @@ ChatCommand* ChatHandler::getCommandTable()
return commandTableCache;
}
-std::string ChatHandler::PGetParseString(uint32 entry, ...) const
-{
- const char *format = GetTrinityString(entry);
- char str[1024];
- va_list ap;
- va_start(ap, entry);
- vsnprintf(str, 1024, format, ap);
- va_end(ap);
- return std::string(str);
-}
-
char const* ChatHandler::GetTrinityString(uint32 entry) const
{
return m_session->GetTrinityString(entry);
@@ -258,27 +247,6 @@ void ChatHandler::SendSysMessage(uint32 entry)
SendSysMessage(GetTrinityString(entry));
}
-void ChatHandler::PSendSysMessage(uint32 entry, ...)
-{
- const char *format = GetTrinityString(entry);
- va_list ap;
- char str [2048];
- va_start(ap, entry);
- vsnprintf(str, 2048, format, ap);
- va_end(ap);
- SendSysMessage(str);
-}
-
-void ChatHandler::PSendSysMessage(const char *format, ...)
-{
- va_list ap;
- char str [2048];
- va_start(ap, format);
- vsnprintf(str, 2048, format, ap);
- va_end(ap);
- SendSysMessage(str);
-}
-
bool ChatHandler::ExecuteCommandInTable(ChatCommand* table, const char* text, std::string const& fullcmd)
{
char const* oldtext = text;
diff --git a/src/server/game/Chat/Chat.h b/src/server/game/Chat/Chat.h
index d712740bd7d..ba59245cdaa 100644
--- a/src/server/game/Chat/Chat.h
+++ b/src/server/game/Chat/Chat.h
@@ -20,6 +20,7 @@
#define TRINITYCORE_CHAT_H
#include "SharedDefines.h"
+#include "StringFormat.h"
#include "WorldSession.h"
#include "RBAC.h"
@@ -68,9 +69,24 @@ class ChatHandler
virtual void SendSysMessage(char const* str);
void SendSysMessage(uint32 entry);
- void PSendSysMessage(char const* format, ...) ATTR_PRINTF(2, 3);
- void PSendSysMessage(uint32 entry, ...);
- std::string PGetParseString(uint32 entry, ...) const;
+
+ template<typename... Args>
+ void PSendSysMessage(const char* fmt, Args const&... args)
+ {
+ SendSysMessage(Trinity::StringFormat(fmt, args...).c_str());
+ }
+
+ template<typename... Args>
+ void PSendSysMessage(uint32 entry, Args const&... args)
+ {
+ SendSysMessage(PGetParseString(entry, args...).c_str());
+ }
+
+ template<typename... Args>
+ std::string PGetParseString(uint32 entry, Args const&... args) const
+ {
+ return Trinity::StringFormat(GetTrinityString(entry), args...);
+ }
bool ParseCommands(const char* text);
diff --git a/src/server/game/Chat/ChatLink.cpp b/src/server/game/Chat/ChatLink.cpp
index 1eb330cc9e1..732a770645b 100644
--- a/src/server/game/Chat/ChatLink.cpp
+++ b/src/server/game/Chat/ChatLink.cpp
@@ -285,7 +285,7 @@ bool SpellChatLink::ValidateName(char* buffer, const char* context)
ChatLink::ValidateName(buffer, context);
// spells with that flag have a prefix of "$PROFESSION: "
- if (_spell->Attributes & SPELL_ATTR0_TRADESPELL)
+ if (_spell->HasAttribute(SPELL_ATTR0_TRADESPELL))
{
SkillLineAbilityMapBounds bounds = sSpellMgr->GetSkillLineAbilityMapBounds(_spell->Id);
if (bounds.first == bounds.second)
diff --git a/src/server/game/Combat/ThreatManager.cpp b/src/server/game/Combat/ThreatManager.cpp
index 43057409b9b..cd108e54b9f 100644
--- a/src/server/game/Combat/ThreatManager.cpp
+++ b/src/server/game/Combat/ThreatManager.cpp
@@ -79,7 +79,7 @@ bool ThreatCalcHelper::isValidProcess(Unit* hatedUnit, Unit* hatingUnit, SpellIn
return false;
// spell not causing threat
- if (threatSpell && threatSpell->AttributesEx & SPELL_ATTR1_NO_THREAT)
+ if (threatSpell && threatSpell->HasAttribute(SPELL_ATTR1_NO_THREAT))
return false;
ASSERT(hatingUnit->GetTypeId() == TYPEID_UNIT);
diff --git a/src/server/game/Conditions/ConditionMgr.cpp b/src/server/game/Conditions/ConditionMgr.cpp
index eb3d1708675..8400e4cee00 100644
--- a/src/server/game/Conditions/ConditionMgr.cpp
+++ b/src/server/game/Conditions/ConditionMgr.cpp
@@ -99,7 +99,8 @@ ConditionMgr::ConditionTypeInfo const ConditionMgr::StaticConditionTypeData[COND
{ "Distance", true, true, true },
{ "Alive", false, false, false },
{ "Health Value", true, true, false },
- { "Health Pct", true, true, false }
+ { "Health Pct", true, true, false },
+ { "Realm Achievement", true, false, false }
};
// Checks if object meets the condition
@@ -416,6 +417,13 @@ bool Condition::Meets(ConditionSourceInfo& sourceInfo)
condMeets = creature->GetCreatureTemplate()->type == ConditionValue1;
break;
}
+ case CONDITION_REALM_ACHIEVEMENT:
+ {
+ AchievementEntry const* achievement = sAchievementMgr->GetAchievement(ConditionValue1);
+ if (achievement && sAchievementMgr->IsRealmCompleted(achievement, std::numeric_limits<uint32>::max()))
+ condMeets = true;
+ break;
+ }
default:
condMeets = false;
break;
@@ -580,6 +588,9 @@ uint32 Condition::GetSearcherTypeMaskForCondition()
case CONDITION_CREATURE_TYPE:
mask |= GRID_MAP_TYPE_MASK_CREATURE;
break;
+ case CONDITION_REALM_ACHIEVEMENT:
+ mask |= GRID_MAP_TYPE_MASK_ALL;
+ break;
default:
ASSERT(false && "Condition::GetSearcherTypeMaskForCondition - missing condition handling!");
break;
@@ -2056,6 +2067,16 @@ bool ConditionMgr::isConditionTypeValid(Condition* cond)
case CONDITION_PHASEMASK:
case CONDITION_ALIVE:
break;
+ case CONDITION_REALM_ACHIEVEMENT:
+ {
+ AchievementEntry const* achievement = sAchievementMgr->GetAchievement(cond->ConditionValue1);
+ if (!achievement)
+ {
+ TC_LOG_ERROR("sql.sql", "%s has non existing realm first achivement id (%u), skipped.", cond->ToString(true).c_str(), cond->ConditionValue1);
+ return false;
+ }
+ break;
+ }
default:
break;
}
diff --git a/src/server/game/Conditions/ConditionMgr.h b/src/server/game/Conditions/ConditionMgr.h
index 4ca27f0d986..1fdd011633e 100644
--- a/src/server/game/Conditions/ConditionMgr.h
+++ b/src/server/game/Conditions/ConditionMgr.h
@@ -72,7 +72,8 @@ enum ConditionTypes
CONDITION_ALIVE = 36, // 0 0 0 true if unit is alive
CONDITION_HP_VAL = 37, // hpVal ComparisonType 0 true if unit's hp matches given value
CONDITION_HP_PCT = 38, // hpPct ComparisonType 0 true if unit's hp matches given pct
- CONDITION_MAX = 39 // MAX
+ CONDITION_REALM_ACHIEVEMENT = 39, // achievement_id 0 0 true if realm achievement is complete
+ CONDITION_MAX = 40 // MAX
};
/*! Documentation on implementing a new ConditionSourceType:
diff --git a/src/server/game/DungeonFinding/LFG.cpp b/src/server/game/DungeonFinding/LFG.cpp
index ab06eff7148..8ec638128d8 100644
--- a/src/server/game/DungeonFinding/LFG.cpp
+++ b/src/server/game/DungeonFinding/LFG.cpp
@@ -91,9 +91,6 @@ std::string GetStateString(LfgState state)
case LFG_STATE_DUNGEON:
entry = LANG_LFG_STATE_DUNGEON;
break;
- case LFG_STATE_BOOT:
- entry = LANG_LFG_STATE_BOOT;
- break;
case LFG_STATE_FINISHED_DUNGEON:
entry = LANG_LFG_STATE_FINISHED_DUNGEON;
break;
diff --git a/src/server/game/DungeonFinding/LFG.h b/src/server/game/DungeonFinding/LFG.h
index 6145a2324b1..84a25ee49ad 100644
--- a/src/server/game/DungeonFinding/LFG.h
+++ b/src/server/game/DungeonFinding/LFG.h
@@ -64,8 +64,8 @@ enum LfgState
LFG_STATE_ROLECHECK, // Rolecheck active
LFG_STATE_QUEUED, // Queued
LFG_STATE_PROPOSAL, // Proposal active
- LFG_STATE_BOOT, // Vote kick active
- LFG_STATE_DUNGEON, // In LFG Group, in a Dungeon
+ //LFG_STATE_BOOT, // Vote kick active
+ LFG_STATE_DUNGEON = 5, // In LFG Group, in a Dungeon
LFG_STATE_FINISHED_DUNGEON, // In LFG Group, in a finished Dungeon
LFG_STATE_RAIDBROWSER // Using Raid finder
};
diff --git a/src/server/game/DungeonFinding/LFGGroupData.cpp b/src/server/game/DungeonFinding/LFGGroupData.cpp
index 2ab1e0b1e7e..aa6916a39a4 100644
--- a/src/server/game/DungeonFinding/LFGGroupData.cpp
+++ b/src/server/game/DungeonFinding/LFGGroupData.cpp
@@ -22,7 +22,7 @@ namespace lfg
{
LfgGroupData::LfgGroupData(): m_State(LFG_STATE_NONE), m_OldState(LFG_STATE_NONE),
- m_Leader(), m_Dungeon(0), m_KicksLeft(LFG_GROUP_MAX_KICKS)
+ m_Leader(), m_Dungeon(0), m_KicksLeft(LFG_GROUP_MAX_KICKS), m_VoteKickActive(false)
{ }
LfgGroupData::~LfgGroupData()
@@ -126,4 +126,14 @@ uint8 LfgGroupData::GetKicksLeft() const
return m_KicksLeft;
}
+void LfgGroupData::SetVoteKick(bool active)
+{
+ m_VoteKickActive = active;
+}
+
+bool LfgGroupData::IsVoteKickActive() const
+{
+ return m_VoteKickActive;
+}
+
} // namespace lfg
diff --git a/src/server/game/DungeonFinding/LFGGroupData.h b/src/server/game/DungeonFinding/LFGGroupData.h
index 8d8f1dc0f3d..b573e7c309e 100644
--- a/src/server/game/DungeonFinding/LFGGroupData.h
+++ b/src/server/game/DungeonFinding/LFGGroupData.h
@@ -66,6 +66,9 @@ class LfgGroupData
// VoteKick
uint8 GetKicksLeft() const;
+ void SetVoteKick(bool active);
+ bool IsVoteKickActive() const;
+
private:
// General
LfgState m_State; ///< State if group in LFG
@@ -76,6 +79,7 @@ class LfgGroupData
uint32 m_Dungeon; ///< Dungeon entry
// Vote Kick
uint8 m_KicksLeft; ///< Number of kicks left
+ bool m_VoteKickActive;
};
} // namespace lfg
diff --git a/src/server/game/DungeonFinding/LFGMgr.cpp b/src/server/game/DungeonFinding/LFGMgr.cpp
index d670e0a2949..93ebeca9780 100644
--- a/src/server/game/DungeonFinding/LFGMgr.cpp
+++ b/src/server/game/DungeonFinding/LFGMgr.cpp
@@ -311,9 +311,8 @@ void LFGMgr::Update(uint32 diff)
ObjectGuid pguid = itVotes->first;
if (pguid != boot.victim)
SendLfgBootProposalUpdate(pguid, boot);
- SetState(pguid, LFG_STATE_DUNGEON);
}
- SetState(itBoot->first, LFG_STATE_DUNGEON);
+ SetVoteKick(itBoot->first, false);
BootsStore.erase(itBoot);
}
}
@@ -643,7 +642,6 @@ void LFGMgr::LeaveLfg(ObjectGuid guid)
break;
case LFG_STATE_DUNGEON:
case LFG_STATE_FINISHED_DUNGEON:
- case LFG_STATE_BOOT:
if (guid != gguid) // Player
SetState(guid, LFG_STATE_NONE);
break;
@@ -755,7 +753,7 @@ void LFGMgr::GetCompatibleDungeons(LfgDungeonSet& dungeons, GuidSet const& playe
{
ObjectGuid guid = (*it);
LfgLockMap const& cachedLockMap = GetLockedDungeons(guid);
- Player* player = ObjectAccessor::FindPlayer(guid);
+ Player* player = ObjectAccessor::FindConnectedPlayer(guid);
for (LfgLockMap::const_iterator it2 = cachedLockMap.begin(); it2 != cachedLockMap.end() && !dungeons.empty(); ++it2)
{
uint32 dungeonId = (it2->first & 0x00FFFFFF); // Compare dungeon ids
@@ -893,7 +891,7 @@ void LFGMgr::MakeNewGroup(LfgProposal const& proposal)
for (GuidList::const_iterator it = players.begin(); it != players.end(); ++it)
{
ObjectGuid pguid = (*it);
- Player* player = ObjectAccessor::FindPlayer(pguid);
+ Player* player = ObjectAccessor::FindConnectedPlayer(pguid);
if (!player)
continue;
@@ -1156,7 +1154,7 @@ void LFGMgr::RemoveProposal(LfgProposalContainer::iterator itProposal, LfgUpdate
*/
void LFGMgr::InitBoot(ObjectGuid gguid, ObjectGuid kicker, ObjectGuid victim, std::string const& reason)
{
- SetState(gguid, LFG_STATE_BOOT);
+ SetVoteKick(gguid, true);
LfgPlayerBoot& boot = BootsStore[gguid];
boot.inProgress = true;
@@ -1170,7 +1168,6 @@ void LFGMgr::InitBoot(ObjectGuid gguid, ObjectGuid kicker, ObjectGuid victim, st
for (GuidSet::const_iterator itr = players.begin(); itr != players.end(); ++itr)
{
ObjectGuid guid = (*itr);
- SetState(guid, LFG_STATE_BOOT);
boot.votes[guid] = LFG_ANSWER_PENDING;
}
@@ -1227,13 +1224,10 @@ void LFGMgr::UpdateBoot(ObjectGuid guid, bool accept)
{
ObjectGuid pguid = itVotes->first;
if (pguid != boot.victim)
- {
- SetState(pguid, LFG_STATE_DUNGEON);
SendLfgBootProposalUpdate(pguid, boot);
- }
}
- SetState(gguid, LFG_STATE_DUNGEON);
+ SetVoteKick(gguid, false);
if (agreeNum == LFG_GROUP_KICK_VOTES_NEEDED) // Vote passed - Kick player
{
if (Group* group = sGroupMgr->GetGroupByGUID(gguid.GetCounter()))
@@ -1495,12 +1489,12 @@ LfgState LFGMgr::GetState(ObjectGuid guid)
if (guid.IsGroup())
{
state = GroupsStore[guid].GetState();
- TC_LOG_TRACE("lfg.data.group.state.get", "Group: %s, State: %u", guid.ToString().c_str(), state);
+ TC_LOG_TRACE("lfg.data.group.state.get", "Group: %s, State: %s", guid.ToString().c_str(), GetStateString(state).c_str());
}
else
{
state = PlayersStore[guid].GetState();
- TC_LOG_TRACE("lfg.data.player.state.get", "Player: %s, State: %u", guid.ToString().c_str(), state);
+ TC_LOG_TRACE("lfg.data.player.state.get", "Player: %s, State: %s", guid.ToString().c_str(), GetStateString(state).c_str());
}
return state;
@@ -1523,6 +1517,16 @@ LfgState LFGMgr::GetOldState(ObjectGuid guid)
return state;
}
+bool LFGMgr::IsVoteKickActive(ObjectGuid gguid)
+{
+ ASSERT(gguid.IsGroup());
+
+ bool active = GroupsStore[gguid].IsVoteKickActive();
+ TC_LOG_TRACE("lfg.data.group.votekick.get", "Group: %s, Active: %d", gguid.ToString().c_str(), active);
+
+ return active;
+}
+
uint32 LFGMgr::GetDungeon(ObjectGuid guid, bool asId /*= true */)
{
uint32 dungeon = GroupsStore[guid].GetDungeon(asId);
@@ -1566,7 +1570,7 @@ LfgLockMap const LFGMgr::GetLockedDungeons(ObjectGuid guid)
{
TC_LOG_TRACE("lfg.data.player.dungeons.locked.get", "Player: %s, LockedDungeons.", guid.ToString().c_str());
LfgLockMap lock;
- Player* player = ObjectAccessor::FindPlayer(guid);
+ Player* player = ObjectAccessor::FindConnectedPlayer(guid);
if (!player)
{
TC_LOG_WARN("lfg.data.player.dungeons.locked.get", "Player: %s not ingame while retrieving his LockedDungeons.", guid.ToString().c_str());
@@ -1683,6 +1687,17 @@ void LFGMgr::SetState(ObjectGuid guid, LfgState state)
}
}
+void LFGMgr::SetVoteKick(ObjectGuid gguid, bool active)
+{
+ ASSERT(gguid.IsGroup());
+
+ LfgGroupData& data = GroupsStore[gguid];
+ TC_LOG_TRACE("lfg.data.group.votekick.set", "Group: %s, New state: %d, Previous: %d",
+ gguid.ToString().c_str(), active, data.IsVoteKickActive());
+
+ data.SetVoteKick(active);
+}
+
void LFGMgr::SetDungeon(ObjectGuid guid, uint32 dungeon)
{
TC_LOG_TRACE("lfg.data.group.dungeon.set", "Group: %s, Dungeon: %u", guid.ToString().c_str(), dungeon);
diff --git a/src/server/game/DungeonFinding/LFGMgr.h b/src/server/game/DungeonFinding/LFGMgr.h
index 0e5fadc85cc..fda9a8b7ce9 100644
--- a/src/server/game/DungeonFinding/LFGMgr.h
+++ b/src/server/game/DungeonFinding/LFGMgr.h
@@ -322,6 +322,8 @@ class LFGMgr
LfgDungeonSet const& GetSelectedDungeons(ObjectGuid guid);
/// Get current lfg state
LfgState GetState(ObjectGuid guid);
+ /// Get current vote kick state
+ bool IsVoteKickActive(ObjectGuid gguid);
/// Get current dungeon
uint32 GetDungeon(ObjectGuid guid, bool asId = true);
/// Get the map id of the current dungeon
@@ -425,6 +427,7 @@ class LFGMgr
void SetSelectedDungeons(ObjectGuid guid, LfgDungeonSet const& dungeons);
void DecreaseKicksLeft(ObjectGuid guid);
void SetState(ObjectGuid guid, LfgState state);
+ void SetVoteKick(ObjectGuid gguid, bool active);
void RemovePlayerData(ObjectGuid guid);
void GetCompatibleDungeons(LfgDungeonSet& dungeons, GuidSet const& players, LfgLockPartyMap& lockMap, bool isContinue);
void _SaveToDB(ObjectGuid guid, uint32 db_guid);
diff --git a/src/server/game/DungeonFinding/LFGQueue.cpp b/src/server/game/DungeonFinding/LFGQueue.cpp
index 683590cebe8..a7c0a1cfa67 100644
--- a/src/server/game/DungeonFinding/LFGQueue.cpp
+++ b/src/server/game/DungeonFinding/LFGQueue.cpp
@@ -377,7 +377,7 @@ LfgCompatibility LFGQueue::CheckCompatibility(GuidList check)
// Group with less that MAXGROUPSIZE members always compatible
if (check.size() == 1 && numPlayers != MAXGROUPSIZE)
{
- TC_LOG_DEBUG("lfg.queue.match.compatibility.check", "Guids: (%s) sigle group. Compatibles", strGuids.c_str());
+ TC_LOG_DEBUG("lfg.queue.match.compatibility.check", "Guids: (%s) single group. Compatibles", strGuids.c_str());
LfgQueueDataContainer::iterator itQueue = QueueDataStore.find(check.front());
LfgCompatibilityData data(LFG_COMPATIBLES_WITH_LESS_PLAYERS);
diff --git a/src/server/game/Entities/Creature/Creature.cpp b/src/server/game/Entities/Creature/Creature.cpp
index a44ca68f79b..a3ce6d919c9 100644
--- a/src/server/game/Entities/Creature/Creature.cpp
+++ b/src/server/game/Entities/Creature/Creature.cpp
@@ -2697,7 +2697,7 @@ void Creature::FocusTarget(Spell const* focusSpell, WorldObject const* target)
_focusSpell = focusSpell;
SetGuidValue(UNIT_FIELD_TARGET, target->GetGUID());
- if (focusSpell->GetSpellInfo()->AttributesEx5 & SPELL_ATTR5_DONT_TURN_DURING_CAST)
+ if (focusSpell->GetSpellInfo()->HasAttribute(SPELL_ATTR5_DONT_TURN_DURING_CAST))
AddUnitState(UNIT_STATE_ROTATING);
// Set serverside orientation if needed (needs to be after attribute check)
@@ -2716,7 +2716,7 @@ void Creature::ReleaseFocus(Spell const* focusSpell)
else
SetGuidValue(UNIT_FIELD_TARGET, ObjectGuid::Empty);
- if (focusSpell->GetSpellInfo()->AttributesEx5 & SPELL_ATTR5_DONT_TURN_DURING_CAST)
+ if (focusSpell->GetSpellInfo()->HasAttribute(SPELL_ATTR5_DONT_TURN_DURING_CAST))
ClearUnitState(UNIT_STATE_ROTATING);
}
diff --git a/src/server/game/Entities/Object/Object.cpp b/src/server/game/Entities/Object/Object.cpp
index b5bcbfd221f..0b97499fc05 100644
--- a/src/server/game/Entities/Object/Object.cpp
+++ b/src/server/game/Entities/Object/Object.cpp
@@ -1072,32 +1072,32 @@ ByteBuffer& operator<<(ByteBuffer& buf, Position::PositionXYZOStreamer const& st
void MovementInfo::OutDebug()
{
- TC_LOG_INFO("misc", "MOVEMENT INFO");
- TC_LOG_INFO("misc", "%s", guid.ToString().c_str());
- TC_LOG_INFO("misc", "flags %u", flags);
- TC_LOG_INFO("misc", "flags2 %u", flags2);
- TC_LOG_INFO("misc", "time %u current time " UI64FMTD "", flags2, uint64(::time(NULL)));
- TC_LOG_INFO("misc", "position: `%s`", pos.ToString().c_str());
+ TC_LOG_DEBUG("misc", "MOVEMENT INFO");
+ TC_LOG_DEBUG("misc", "%s", guid.ToString().c_str());
+ TC_LOG_DEBUG("misc", "flags %u", flags);
+ TC_LOG_DEBUG("misc", "flags2 %u", flags2);
+ TC_LOG_DEBUG("misc", "time %u current time " UI64FMTD "", flags2, uint64(::time(NULL)));
+ TC_LOG_DEBUG("misc", "position: `%s`", pos.ToString().c_str());
if (flags & MOVEMENTFLAG_ONTRANSPORT)
{
- TC_LOG_INFO("misc", "TRANSPORT:");
- TC_LOG_INFO("misc", "%s", transport.guid.ToString().c_str());
- TC_LOG_INFO("misc", "position: `%s`", transport.pos.ToString().c_str());
- TC_LOG_INFO("misc", "seat: %i", transport.seat);
- TC_LOG_INFO("misc", "time: %u", transport.time);
+ TC_LOG_DEBUG("misc", "TRANSPORT:");
+ TC_LOG_DEBUG("misc", "%s", transport.guid.ToString().c_str());
+ TC_LOG_DEBUG("misc", "position: `%s`", transport.pos.ToString().c_str());
+ TC_LOG_DEBUG("misc", "seat: %i", transport.seat);
+ TC_LOG_DEBUG("misc", "time: %u", transport.time);
if (flags2 & MOVEMENTFLAG2_INTERPOLATED_MOVEMENT)
- TC_LOG_INFO("misc", "time2: %u", transport.time2);
+ TC_LOG_DEBUG("misc", "time2: %u", transport.time2);
}
if ((flags & (MOVEMENTFLAG_SWIMMING | MOVEMENTFLAG_FLYING)) || (flags2 & MOVEMENTFLAG2_ALWAYS_ALLOW_PITCHING))
- TC_LOG_INFO("misc", "pitch: %f", pitch);
+ TC_LOG_DEBUG("misc", "pitch: %f", pitch);
- TC_LOG_INFO("misc", "fallTime: %u", fallTime);
+ TC_LOG_DEBUG("misc", "fallTime: %u", fallTime);
if (flags & MOVEMENTFLAG_FALLING)
- TC_LOG_INFO("misc", "j_zspeed: %f j_sinAngle: %f j_cosAngle: %f j_xyspeed: %f", jump.zspeed, jump.sinAngle, jump.cosAngle, jump.xyspeed);
+ TC_LOG_DEBUG("misc", "j_zspeed: %f j_sinAngle: %f j_cosAngle: %f j_xyspeed: %f", jump.zspeed, jump.sinAngle, jump.cosAngle, jump.xyspeed);
if (flags & MOVEMENTFLAG_SPLINE_ELEVATION)
- TC_LOG_INFO("misc", "splineElevation: %f", splineElevation);
+ TC_LOG_DEBUG("misc", "splineElevation: %f", splineElevation);
}
WorldObject::WorldObject(bool isWorldObject) : WorldLocation(), LastUsedScriptID(0),
@@ -2255,6 +2255,13 @@ void WorldObject::GetCreatureListWithEntryInGrid(std::list<Creature*>& creatureL
cell.Visit(pair, visitor, *(this->GetMap()), *this, maxSearchRange);
}
+void WorldObject::GetPlayerListInGrid(std::list<Player*>& playerList, float maxSearchRange) const
+{
+ Trinity::AnyPlayerInObjectRangeCheck checker(this, maxSearchRange);
+ Trinity::PlayerListSearcher<Trinity::AnyPlayerInObjectRangeCheck> searcher(this, playerList, checker);
+ this->VisitNearbyWorldObject(maxSearchRange, searcher);
+}
+
/*
namespace Trinity
{
diff --git a/src/server/game/Entities/Object/Object.h b/src/server/game/Entities/Object/Object.h
index 2aa1704f7d2..c48d8ff4d18 100644
--- a/src/server/game/Entities/Object/Object.h
+++ b/src/server/game/Entities/Object/Object.h
@@ -683,6 +683,7 @@ class WorldObject : public Object, public WorldLocation
void GetGameObjectListWithEntryInGrid(std::list<GameObject*>& lList, uint32 uiEntry, float fMaxSearchRange) const;
void GetCreatureListWithEntryInGrid(std::list<Creature*>& lList, uint32 uiEntry, float fMaxSearchRange) const;
+ void GetPlayerListInGrid(std::list<Player*>& lList, float fMaxSearchRange) const;
void DestroyForNearbyPlayers();
virtual void UpdateObjectVisibility(bool forced = true);
diff --git a/src/server/game/Entities/Object/ObjectGuid.h b/src/server/game/Entities/Object/ObjectGuid.h
index be292751811..36dbdd72069 100644
--- a/src/server/game/Entities/Object/ObjectGuid.h
+++ b/src/server/game/Entities/Object/ObjectGuid.h
@@ -23,6 +23,7 @@
#include "ByteBuffer.h"
#include <functional>
+#include <unordered_set>
enum TypeID
{
@@ -202,6 +203,7 @@ typedef std::set<ObjectGuid> GuidSet;
typedef std::list<ObjectGuid> GuidList;
typedef std::deque<ObjectGuid> GuidDeque;
typedef std::vector<ObjectGuid> GuidVector;
+typedef std::unordered_set<ObjectGuid> GuidUnorderedSet;
// minimum buffer size for packed guid is 9 bytes
#define PACKED_GUID_MIN_BUFFER_SIZE 9
diff --git a/src/server/game/Entities/Pet/Pet.cpp b/src/server/game/Entities/Pet/Pet.cpp
index 5084031880d..fdfd1fa3d4d 100644
--- a/src/server/game/Entities/Pet/Pet.cpp
+++ b/src/server/game/Entities/Pet/Pet.cpp
@@ -1314,7 +1314,7 @@ void Pet::_LoadAuras(uint32 timediff)
}
aura->SetLoadedState(maxduration, remaintime, remaincharges, stackcount, recalculatemask, &damage[0]);
aura->ApplyForTargets();
- TC_LOG_INFO("entities.pet", "Added aura spellid %u, effectmask %u", spellInfo->Id, effmask);
+ TC_LOG_DEBUG("entities.pet", "Added aura spellid %u, effectmask %u", spellInfo->Id, effmask);
}
}
while (result->NextRow());
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp
index 161fca432b4..e46448df133 100644
--- a/src/server/game/Entities/Player/Player.cpp
+++ b/src/server/game/Entities/Player/Player.cpp
@@ -3902,7 +3902,7 @@ bool Player::IsNeedCastPassiveSpellAtLearn(SpellInfo const* spellInfo) const
// talent dependent passives activated at form apply have proper stance data
ShapeshiftForm form = GetShapeshiftForm();
bool need_cast = (!spellInfo->Stances || (form && (spellInfo->Stances & (1 << (form - 1)))) ||
- (!form && (spellInfo->AttributesEx2 & SPELL_ATTR2_NOT_NEED_SHAPESHIFT)));
+ (!form && spellInfo->HasAttribute(SPELL_ATTR2_NOT_NEED_SHAPESHIFT)));
//Check CasterAuraStates
return need_cast && (!spellInfo->CasterAuraState || HasAuraState(AuraStateType(spellInfo->CasterAuraState)));
@@ -4218,7 +4218,7 @@ void Player::RemoveSpellCategoryCooldown(uint32 cat, bool update /* = false */)
void Player::RemoveArenaSpellCooldowns(bool removeActivePetCooldowns)
{
- // remove cooldowns on spells that have <= 10 min CD
+ // remove cooldowns on spells that have < 10 min CD
SpellCooldowns::iterator itr, next;
for (itr = m_spellCooldowns.begin(); itr != m_spellCooldowns.end(); itr = next)
@@ -4226,10 +4226,10 @@ void Player::RemoveArenaSpellCooldowns(bool removeActivePetCooldowns)
next = itr;
++next;
SpellInfo const* entry = sSpellMgr->GetSpellInfo(itr->first);
- // check if spellentry is present and if the cooldown is less or equal to 10 min
+ // check if spellentry is present and if the cooldown is less than 10 min
if (entry &&
- entry->RecoveryTime <= 10 * MINUTE * IN_MILLISECONDS &&
- entry->CategoryRecoveryTime <= 10 * MINUTE * IN_MILLISECONDS)
+ entry->RecoveryTime < 10 * MINUTE * IN_MILLISECONDS &&
+ entry->CategoryRecoveryTime < 10 * MINUTE * IN_MILLISECONDS)
{
// remove & notify
RemoveSpellCooldown(itr->first, true);
@@ -4830,10 +4830,22 @@ void Player::DeleteFromDB(ObjectGuid playerguid, uint32 accountId, bool updateRe
stmt->setUInt32(0, guid);
trans->Append(stmt);
+ stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHARACTER_ARENA_STATS);
+ stmt->setUInt32(0, guid);
+ trans->Append(stmt);
+
stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_AURA);
stmt->setUInt32(0, guid);
trans->Append(stmt);
+ stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_PLAYER_BGDATA);
+ stmt->setUInt32(0, guid);
+ trans->Append(stmt);
+
+ stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_BATTLEGROUND_RANDOM);
+ stmt->setUInt32(0, guid);
+ trans->Append(stmt);
+
stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_GIFT);
stmt->setUInt32(0, guid);
trans->Append(stmt);
@@ -4923,10 +4935,6 @@ void Player::DeleteFromDB(ObjectGuid playerguid, uint32 accountId, bool updateRe
stmt->setUInt32(0, guid);
trans->Append(stmt);
- stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_PLAYER_BGDATA);
- stmt->setUInt32(0, guid);
- trans->Append(stmt);
-
stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_GLYPHS);
stmt->setUInt32(0, guid);
trans->Append(stmt);
@@ -4955,6 +4963,10 @@ void Player::DeleteFromDB(ObjectGuid playerguid, uint32 accountId, bool updateRe
stmt->setUInt32(0, guid);
trans->Append(stmt);
+ stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_STATS);
+ stmt->setUInt32(0, guid);
+ trans->Append(stmt);
+
CharacterDatabase.CommitTransaction(trans);
break;
}
@@ -5002,7 +5014,7 @@ void Player::DeleteOldCharacters()
*/
void Player::DeleteOldCharacters(uint32 keepDays)
{
- TC_LOG_INFO("entities.player", "Player::DeleteOldChars: Deleting all characters which have been deleted %u days before...", keepDays);
+ TC_LOG_INFO("entities.player", "Player::DeleteOldChars: Removing characters older than %u day(s)", keepDays);
PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_CHAR_OLD_CHARS);
stmt->setUInt32(0, uint32(time(NULL) - time_t(keepDays * DAY)));
@@ -5010,7 +5022,7 @@ void Player::DeleteOldCharacters(uint32 keepDays)
if (result)
{
- TC_LOG_DEBUG("entities.player", "Player::DeleteOldChars: Found " UI64FMTD " character(s) to delete", result->GetRowCount());
+ TC_LOG_DEBUG("entities.player", "Player::DeleteOldChars: " UI64FMTD " character(s) to remove", result->GetRowCount());
do
{
Field* fields = result->Fetch();
@@ -6636,20 +6648,20 @@ void Player::SendActionButtons(uint32 state) const
}
GetSession()->SendPacket(&data);
- TC_LOG_INFO("network", "SMSG_ACTION_BUTTONS sent '%u' spec '%u' Sent", GetGUIDLow(), m_activeSpec);
+ TC_LOG_DEBUG("network", "SMSG_ACTION_BUTTONS sent '%u' spec '%u' Sent", GetGUIDLow(), m_activeSpec);
}
bool Player::IsActionButtonDataValid(uint8 button, uint32 action, uint8 type)
{
if (button >= MAX_ACTION_BUTTONS)
{
- TC_LOG_ERROR("entities.player", "Action %u not added into button %u for player %s (GUID: %u): button must be < %u", action, button, GetName().c_str(), GetGUIDLow(), MAX_ACTION_BUTTONS );
+ TC_LOG_DEBUG("entities.player", "Action %u not added into button %u for player %s (GUID: %u): button must be < %u", action, button, GetName().c_str(), GetGUIDLow(), MAX_ACTION_BUTTONS );
return false;
}
if (action >= MAX_ACTION_BUTTON_ACTION_VALUE)
{
- TC_LOG_ERROR("entities.player", "Action %u not added into button %u for player %s (GUID: %u): action must be < %u", action, button, GetName().c_str(), GetGUIDLow(), MAX_ACTION_BUTTON_ACTION_VALUE);
+ TC_LOG_DEBUG("entities.player", "Action %u not added into button %u for player %s (GUID: %u): action must be < %u", action, button, GetName().c_str(), GetGUIDLow(), MAX_ACTION_BUTTON_ACTION_VALUE);
return false;
}
@@ -6658,20 +6670,20 @@ bool Player::IsActionButtonDataValid(uint8 button, uint32 action, uint8 type)
case ACTION_BUTTON_SPELL:
if (!sSpellMgr->GetSpellInfo(action))
{
- TC_LOG_ERROR("entities.player", "Spell action %u not added into button %u for player %s (GUID: %u): spell not exist", action, button, GetName().c_str(), GetGUIDLow());
+ TC_LOG_DEBUG("entities.player", "Spell action %u not added into button %u for player %s (GUID: %u): spell not exist", action, button, GetName().c_str(), GetGUIDLow());
return false;
}
if (!HasSpell(action))
{
- TC_LOG_ERROR("entities.player", "Spell action %u not added into button %u for player %s (GUID: %u): player don't known this spell", action, button, GetName().c_str(), GetGUIDLow());
+ TC_LOG_DEBUG("entities.player", "Spell action %u not added into button %u for player %s (GUID: %u): player don't known this spell", action, button, GetName().c_str(), GetGUIDLow());
return false;
}
break;
case ACTION_BUTTON_ITEM:
if (!sObjectMgr->GetItemTemplate(action))
{
- TC_LOG_ERROR("entities.player", "Item action %u not added into button %u for player %s (GUID: %u): item not exist", action, button, GetName().c_str(), GetGUIDLow());
+ TC_LOG_DEBUG("entities.player", "Item action %u not added into button %u for player %s (GUID: %u): item not exist", action, button, GetName().c_str(), GetGUIDLow());
return false;
}
break;
@@ -6681,7 +6693,7 @@ bool Player::IsActionButtonDataValid(uint8 button, uint32 action, uint8 type)
case ACTION_BUTTON_EQSET:
break;
default:
- TC_LOG_ERROR("entities.player", "Unknown action type %u", type);
+ TC_LOG_DEBUG("entities.player", "Unknown action type %u", type);
return false; // other cases not checked at this moment
}
@@ -6883,7 +6895,7 @@ void Player::CheckAreaExploreAndOutdoor()
GiveXP(XP, NULL);
SendExplorationExperience(area, XP);
}
- TC_LOG_INFO("entities.player", "Player %u discovered a new area: %u", GetGUIDLow(), area);
+ TC_LOG_DEBUG("entities.player", "Player %u discovered a new area: %u", GetGUIDLow(), area);
}
}
}
@@ -7763,7 +7775,7 @@ void Player::_ApplyItemMods(Item* item, uint8 slot, bool apply)
if (item->IsBroken())
return;
- TC_LOG_INFO("entities.player.items", "applying mods for item %u ", item->GetGUIDLow());
+ TC_LOG_DEBUG("entities.player.items", "applying mods for item %u ", item->GetGUIDLow());
uint8 attacktype = Player::GetAttackBySlot(slot);
@@ -9774,7 +9786,7 @@ uint32 Player::GetXPRestBonus(uint32 xp)
SetRestBonus(GetRestBonus() - rested_bonus);
- TC_LOG_INFO("entities.player", "Player gain %u xp (+ %u Rested Bonus). Rested points=%f", xp+rested_bonus, rested_bonus, GetRestBonus());
+ TC_LOG_DEBUG("entities.player", "Player gain %u xp (+ %u Rested Bonus). Rested points=%f", xp+rested_bonus, rested_bonus, GetRestBonus());
return rested_bonus;
}
@@ -17999,7 +18011,7 @@ void Player::_LoadAuras(PreparedQueryResult result, uint32 timediff)
aura->SetLoadedState(maxduration, remaintime, remaincharges, stackcount, recalculatemask, &damage[0]);
aura->ApplyForTargets();
- TC_LOG_INFO("entities.player", "Added aura spellid %u, effectmask %u", spellInfo->Id, effmask);
+ TC_LOG_DEBUG("entities.player", "Added aura spellid %u, effectmask %u", spellInfo->Id, effmask);
}
}
while (result->NextRow());
@@ -19086,7 +19098,7 @@ bool Player::Satisfy(AccessRequirement const* ar, uint32 target_map, bool report
else if (mapDiff->hasErrorMessage) // if (missingAchievement) covered by this case
SendTransferAborted(target_map, TRANSFER_ABORT_DIFFICULTY, target_difficulty);
else if (missingItem)
- GetSession()->SendAreaTriggerMessage(GetSession()->GetTrinityString(LANG_LEVEL_MINREQUIRED_AND_ITEM), LevelMin, sObjectMgr->GetItemTemplate(missingItem)->Name1.c_str());
+ GetSession()->SendAreaTriggerMessage(GetSession()->GetTrinityString(LANG_LEVEL_MINREQUIRED_AND_ITEM), LevelMin, ASSERT_NOTNULL(sObjectMgr->GetItemTemplate(missingItem))->Name1.c_str());
else if (LevelMin)
GetSession()->SendAreaTriggerMessage(GetSession()->GetTrinityString(LANG_LEVEL_MINREQUIRED), LevelMin);
}
@@ -19732,6 +19744,7 @@ void Player::_SaveInventory(SQLTransaction& trans)
m_itemUpdateQueue.clear();
}
+
void Player::_SaveMail(SQLTransaction& trans)
{
if (!m_mailsLoaded)
@@ -20670,8 +20683,6 @@ void Player::PetSpellInitialize()
if (!pet)
return;
- TC_LOG_DEBUG("entities.pet", "Pet Spells Groups");
-
CharmInfo* charmInfo = pet->GetCharmInfo();
WorldPacket data(SMSG_PET_SPELLS, 8+2+4+4+4*MAX_UNIT_ACTION_BAR_INDEX+1+1);
@@ -20682,6 +20693,8 @@ void Player::PetSpellInitialize()
data << uint8(charmInfo->GetCommandState());
data << uint16(0); // Flags, mostly unknown
+ TC_LOG_DEBUG("entities.pet", "Player::PetspellInitialize: Creating spellgroups for summoned pet");
+
// action bar loop
charmInfo->BuildActionBar(&data);
@@ -22043,7 +22056,7 @@ void Player::AddSpellAndCategoryCooldowns(SpellInfo const* spellInfo, uint32 ite
if (rec > 0)
ApplySpellMod(spellInfo->Id, SPELLMOD_COOLDOWN, rec, spell);
- if (catrec > 0 && !(spellInfo->AttributesEx6 & SPELL_ATTR6_IGNORE_CATEGORY_COOLDOWN_MODS))
+ if (catrec > 0 && !spellInfo->HasAttribute(SPELL_ATTR6_IGNORE_CATEGORY_COOLDOWN_MODS))
ApplySpellMod(spellInfo->Id, SPELLMOD_COOLDOWN, catrec, spell);
if (int32 cooldownMod = GetTotalAuraModifier(SPELL_AURA_MOD_COOLDOWN))
@@ -22138,6 +22151,34 @@ void Player::SendCooldownEvent(SpellInfo const* spellInfo, uint32 itemId /*= 0*/
data << uint32(spellInfo->Id);
data << uint64(GetGUID());
SendDirectMessage(&data);
+
+ uint32 cat = spellInfo->GetCategory();
+ if (cat && spellInfo->CategoryRecoveryTime)
+ {
+ SpellCategoryStore::const_iterator ct = sSpellsByCategoryStore.find(cat);
+ if (ct != sSpellsByCategoryStore.end())
+ {
+ SpellCategorySet const& catSet = ct->second;
+ for (SpellCooldowns::const_iterator i = m_spellCooldowns.begin(); i != m_spellCooldowns.end(); ++i)
+ {
+ if (i->first == spellInfo->Id) // skip main spell, already handled above
+ continue;
+
+ SpellInfo const* spellInfo2 = sSpellMgr->GetSpellInfo(i->first);
+ if (!spellInfo2 || !spellInfo2->IsCooldownStartedOnEvent())
+ continue;
+
+ if (catSet.find(i->first) != catSet.end())
+ {
+ // Send activate cooldown timer (possible 0) at client side
+ WorldPacket data(SMSG_COOLDOWN_EVENT, 4 + 8);
+ data << uint32(i->first);
+ data << uint64(GetGUID());
+ SendDirectMessage(&data);
+ }
+ }
+ }
+ }
}
void Player::UpdatePotionCooldown(Spell* spell)
@@ -22532,13 +22573,13 @@ bool Player::IsVisibleGloballyFor(Player const* u) const
}
template<class T>
-inline void UpdateVisibilityOf_helper(GuidSet& s64, T* target, std::set<Unit*>& /*v*/)
+inline void UpdateVisibilityOf_helper(GuidUnorderedSet& s64, T* target, std::set<Unit*>& /*v*/)
{
s64.insert(target->GetGUID());
}
template<>
-inline void UpdateVisibilityOf_helper(GuidSet& s64, GameObject* target, std::set<Unit*>& /*v*/)
+inline void UpdateVisibilityOf_helper(GuidUnorderedSet& s64, GameObject* target, std::set<Unit*>& /*v*/)
{
// @HACK: This is to prevent objects like deeprun tram from disappearing when player moves far from its spawn point while riding it
if ((target->GetGOInfo()->type != GAMEOBJECT_TYPE_TRANSPORT))
@@ -22546,14 +22587,14 @@ inline void UpdateVisibilityOf_helper(GuidSet& s64, GameObject* target, std::set
}
template<>
-inline void UpdateVisibilityOf_helper(GuidSet& s64, Creature* target, std::set<Unit*>& v)
+inline void UpdateVisibilityOf_helper(GuidUnorderedSet& s64, Creature* target, std::set<Unit*>& v)
{
s64.insert(target->GetGUID());
v.insert(target);
}
template<>
-inline void UpdateVisibilityOf_helper(GuidSet& s64, Player* target, std::set<Unit*>& v)
+inline void UpdateVisibilityOf_helper(GuidUnorderedSet& s64, Player* target, std::set<Unit*>& v)
{
s64.insert(target->GetGUID());
v.insert(target);
@@ -22615,7 +22656,7 @@ void Player::UpdateTriggerVisibility()
UpdateData udata;
WorldPacket packet;
- for (GuidSet::iterator itr = m_clientGUIDs.begin(); itr != m_clientGUIDs.end(); ++itr)
+ for (auto itr = m_clientGUIDs.begin(); itr != m_clientGUIDs.end(); ++itr)
{
if (itr->IsCreature())
{
@@ -23674,7 +23715,7 @@ void Player::UpdateForQuestWorldObjects()
UpdateData udata;
WorldPacket packet;
- for (GuidSet::iterator itr = m_clientGUIDs.begin(); itr != m_clientGUIDs.end(); ++itr)
+ for (auto itr = m_clientGUIDs.begin(); itr != m_clientGUIDs.end(); ++itr)
{
if (itr->IsGameObject())
{
@@ -23863,7 +23904,7 @@ bool Player::HasItemFitToSpellRequirements(SpellInfo const* spellInfo, Item cons
bool Player::CanNoReagentCast(SpellInfo const* spellInfo) const
{
// don't take reagents for spells with SPELL_ATTR5_NO_REAGENT_WHILE_PREP
- if (spellInfo->AttributesEx5 & SPELL_ATTR5_NO_REAGENT_WHILE_PREP &&
+ if (spellInfo->HasAttribute(SPELL_ATTR5_NO_REAGENT_WHILE_PREP) &&
HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_PREPARATION))
return true;
@@ -24166,18 +24207,6 @@ void Player::UpdateAreaDependentAuras(uint32 newArea)
if (itr->second->autocast && itr->second->IsFitToRequirements(this, m_zoneUpdateId, newArea))
if (!HasAura(itr->second->spellId))
CastSpell(this, itr->second->spellId, true);
-
- if (newArea == 4273 && GetVehicleCreatureBase() && GetPositionX() > 400) // Ulduar
- {
- switch (GetVehicleBase()->GetEntry())
- {
- case 33062:
- case 33109:
- case 33060:
- GetVehicleCreatureBase()->DespawnOrUnsummon();
- break;
- }
- }
}
uint32 Player::GetCorpseReclaimDelay(bool pvp) const
@@ -24308,7 +24337,7 @@ PartyResult Player::CanUninviteFromGroup(ObjectGuid guidMember) const
return ERR_PARTY_LFG_BOOT_LIMIT;
lfg::LfgState state = sLFGMgr->GetState(gguid);
- if (state == lfg::LFG_STATE_BOOT)
+ if (sLFGMgr->IsVoteKickActive(gguid))
return ERR_PARTY_LFG_BOOT_IN_PROGRESS;
if (grp->GetMembersCount() <= lfg::LFG_GROUP_KICK_VOTES_NEEDED)
@@ -24815,7 +24844,7 @@ void Player::RestoreBaseRune(uint8 index)
{
AuraEffect const* aura = m_runes->runes[index].ConvertAura;
// If rune was converted by a non-pasive aura that still active we should keep it converted
- if (aura && !(aura->GetSpellInfo()->Attributes & SPELL_ATTR0_PASSIVE))
+ if (aura && !aura->GetSpellInfo()->HasAttribute(SPELL_ATTR0_PASSIVE))
return;
ConvertRune(index, GetBaseRune(index));
SetRuneConvertAura(index, NULL);
@@ -25047,6 +25076,7 @@ void Player::_LoadSkills(PreparedQueryResult result)
// SetPQuery(PLAYER_LOGIN_QUERY_LOADSKILLS, "SELECT skill, value, max FROM character_skills WHERE guid = '%u'", GUID_LOPART(m_guid));
uint32 count = 0;
+ std::unordered_map<uint32, uint32> loadedSkillValues;
if (result)
{
do
@@ -25114,8 +25144,7 @@ void Player::_LoadSkills(PreparedQueryResult result)
SetUInt32Value(PLAYER_SKILL_BONUS_INDEX(count), 0);
mSkillStatus.insert(SkillStatusMap::value_type(skill, SkillStatusData(count, SKILL_UNCHANGED)));
-
- LearnSkillRewardedSpells(skill, value);
+ loadedSkillValues[skill] = value;
++count;
@@ -25128,6 +25157,10 @@ void Player::_LoadSkills(PreparedQueryResult result)
while (result->NextRow());
}
+ // Learn skill rewarded spells after all skills have been loaded to prevent learning a skill from them before its loaded with proper value from DB
+ for (auto& skill : loadedSkillValues)
+ LearnSkillRewardedSpells(skill.first, skill.second);
+
for (; count < PLAYER_MAX_SKILLS; ++count)
{
SetUInt32Value(PLAYER_SKILL_INDEX(count), 0);
@@ -25429,7 +25462,7 @@ void Player::LearnTalent(uint32 talentId, uint32 talentRank)
LearnSpell(spellid, false);
AddTalent(spellid, m_activeSpec, true);
- TC_LOG_INFO("entities.player", "TalentID: %u Rank: %u Spell: %u Spec: %u\n", talentId, talentRank, spellid, m_activeSpec);
+ TC_LOG_DEBUG("entities.player", "TalentID: %u Rank: %u Spell: %u Spec: %u\n", talentId, talentRank, spellid, m_activeSpec);
// update free talent points
SetFreeTalentPoints(CurTalentPoints - (talentRank - curtalent_maxrank + 1));
@@ -25564,7 +25597,7 @@ void Player::LearnPetTalent(ObjectGuid petGuid, uint32 talentId, uint32 talentRa
// learn! (other talent ranks will unlearned at learning)
pet->learnSpell(spellid);
- TC_LOG_INFO("entities.player", "PetTalentID: %u Rank: %u Spell: %u\n", talentId, talentRank, spellid);
+ TC_LOG_DEBUG("entities.player", "PetTalentID: %u Rank: %u Spell: %u\n", talentId, talentRank, spellid);
// update free talent points
pet->SetFreeTalentPoints(CurTalentPoints - (talentRank - curtalent_maxrank + 1));
diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h
index 61141192cd1..1e928c80f3c 100644
--- a/src/server/game/Entities/Player/Player.h
+++ b/src/server/game/Entities/Player/Player.h
@@ -2170,7 +2170,7 @@ class Player : public Unit, public GridObject<Player>
WorldLocation GetStartPosition() const;
// currently visible objects at player client
- GuidSet m_clientGUIDs;
+ GuidUnorderedSet m_clientGUIDs;
bool HaveAtClient(WorldObject const* u) const;
diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp
index fdd91368704..f44c14a12dd 100644
--- a/src/server/game/Entities/Unit/Unit.cpp
+++ b/src/server/game/Entities/Unit/Unit.cpp
@@ -589,7 +589,7 @@ uint32 Unit::DealDamage(Unit* victim, uint32 damage, CleanDamage const* cleanDam
// interrupting auras with AURA_INTERRUPT_FLAG_DAMAGE before checking !damage (absorbed damage breaks that type of auras)
if (spellProto)
{
- if (!(spellProto->AttributesEx4 & SPELL_ATTR4_DAMAGE_DOESNT_BREAK_AURAS))
+ if (!spellProto->HasAttribute(SPELL_ATTR4_DAMAGE_DOESNT_BREAK_AURAS))
victim->RemoveAurasWithInterruptFlags(AURA_INTERRUPT_FLAG_TAKE_DAMAGE, spellProto->Id);
}
else
@@ -777,7 +777,7 @@ uint32 Unit::DealDamage(Unit* victim, uint32 damage, CleanDamage const* cleanDam
if (damagetype != NODAMAGE && damage)
{
if (victim != this && victim->GetTypeId() == TYPEID_PLAYER && // does not support creature push_back
- (!spellProto || !(spellProto->AttributesEx7 & SPELL_ATTR7_NO_PUSHBACK_ON_DAMAGE)))
+ (!spellProto || !spellProto->HasAttribute(SPELL_ATTR7_NO_PUSHBACK_ON_DAMAGE)))
{
if (damagetype != DOT)
if (Spell* spell = victim->m_currentSpells[CURRENT_GENERIC_SPELL])
@@ -981,7 +981,7 @@ void Unit::CalculateSpellDamageTaken(SpellNonMeleeDamage* damageInfo, int32 dama
uint32 crTypeMask = victim->GetCreatureTypeMask();
// Spells with SPELL_ATTR4_FIXED_DAMAGE ignore resilience because their damage is based off another spell's damage.
- if (!(spellInfo->AttributesEx4 & SPELL_ATTR4_FIXED_DAMAGE))
+ if (!spellInfo->HasAttribute(SPELL_ATTR4_FIXED_DAMAGE))
{
if (IsDamageReducedByArmor(damageSchoolMask, spellInfo))
damage = CalcArmorReducedDamage(victim, damage, spellInfo, attackType);
@@ -1459,7 +1459,7 @@ bool Unit::IsDamageReducedByArmor(SpellSchoolMask schoolMask, SpellInfo const* s
if (spellInfo)
{
// there are spells with no specific attribute but they have "ignores armor" in tooltip
- if (spellInfo->AttributesCu & SPELL_ATTR0_CU_IGNORE_ARMOR)
+ if (spellInfo->HasAttribute(SPELL_ATTR0_CU_IGNORE_ARMOR))
return false;
// bleeding effects are not reduced by armor
@@ -1560,7 +1560,7 @@ uint32 Unit::CalcSpellResistance(Unit* victim, SpellSchoolMask schoolMask, Spell
return 0;
// Ignore spells that can't be resisted
- if (spellInfo && spellInfo->AttributesEx4 & SPELL_ATTR4_IGNORE_RESISTANCES)
+ if (spellInfo && spellInfo->HasAttribute(SPELL_ATTR4_IGNORE_RESISTANCES))
return 0;
uint32 const BOSS_LEVEL = 83;
@@ -2234,15 +2234,15 @@ void Unit::SendMeleeAttackStop(Unit* victim)
TC_LOG_DEBUG("entities.unit", "WORLD: Sent SMSG_ATTACKSTOP");
if (victim)
- TC_LOG_INFO("entities.unit", "%s %u stopped attacking %s %u", (GetTypeId() == TYPEID_PLAYER ? "Player" : "Creature"), GetGUIDLow(), (victim->GetTypeId() == TYPEID_PLAYER ? "player" : "creature"), victim->GetGUIDLow());
+ TC_LOG_DEBUG("entities.unit", "%s %u stopped attacking %s %u", (GetTypeId() == TYPEID_PLAYER ? "Player" : "Creature"), GetGUIDLow(), (victim->GetTypeId() == TYPEID_PLAYER ? "player" : "creature"), victim->GetGUIDLow());
else
- TC_LOG_INFO("entities.unit", "%s %u stopped attacking", (GetTypeId() == TYPEID_PLAYER ? "Player" : "Creature"), GetGUIDLow());
+ TC_LOG_DEBUG("entities.unit", "%s %u stopped attacking", (GetTypeId() == TYPEID_PLAYER ? "Player" : "Creature"), GetGUIDLow());
}
bool Unit::isSpellBlocked(Unit* victim, SpellInfo const* spellProto, WeaponAttackType attackType)
{
// These spells can't be blocked
- if (spellProto && spellProto->Attributes & SPELL_ATTR0_IMPOSSIBLE_DODGE_PARRY_BLOCK)
+ if (spellProto && spellProto->HasAttribute(SPELL_ATTR0_IMPOSSIBLE_DODGE_PARRY_BLOCK))
return false;
if (victim->HasAuraType(SPELL_AURA_IGNORE_HIT_DIRECTION) || victim->HasInArc(float(M_PI), this))
@@ -2309,7 +2309,7 @@ SpellMissInfo Unit::MeleeSpellHitResult(Unit* victim, SpellInfo const* spellInfo
{
// Spells with SPELL_ATTR3_IGNORE_HIT_RESULT will additionally fully ignore
// resist and deflect chances
- if (spellInfo->AttributesEx3 & SPELL_ATTR3_IGNORE_HIT_RESULT)
+ if (spellInfo->HasAttribute(SPELL_ATTR3_IGNORE_HIT_RESULT))
return SPELL_MISS_NONE;
WeaponAttackType attType = BASE_ATTACK;
@@ -2357,10 +2357,10 @@ SpellMissInfo Unit::MeleeSpellHitResult(Unit* victim, SpellInfo const* spellInfo
bool canDodge = true;
bool canParry = true;
- bool canBlock = (spellInfo->AttributesEx3 & SPELL_ATTR3_BLOCKABLE_SPELL) != 0;
+ bool canBlock = spellInfo->HasAttribute(SPELL_ATTR3_BLOCKABLE_SPELL);
// Same spells cannot be parry/dodge
- if (spellInfo->Attributes & SPELL_ATTR0_IMPOSSIBLE_DODGE_PARRY_BLOCK)
+ if (spellInfo->HasAttribute(SPELL_ATTR0_IMPOSSIBLE_DODGE_PARRY_BLOCK))
return SPELL_MISS_NONE;
// Chance resist mechanic
@@ -2400,7 +2400,7 @@ SpellMissInfo Unit::MeleeSpellHitResult(Unit* victim, SpellInfo const* spellInfo
}
else // Only deterrence as of 3.3.5
{
- if (spellInfo->AttributesCu & SPELL_ATTR0_CU_REQ_CASTER_BEHIND_TARGET)
+ if (spellInfo->HasAttribute(SPELL_ATTR0_CU_REQ_CASTER_BEHIND_TARGET))
canParry = false;
}
}
@@ -2491,7 +2491,7 @@ SpellMissInfo Unit::MeleeSpellHitResult(Unit* victim, SpellInfo const* spellInfo
SpellMissInfo Unit::MagicSpellHitResult(Unit* victim, SpellInfo const* spellInfo)
{
// Can`t miss on dead target (on skinning for example)
- if ((!victim->IsAlive() && victim->GetTypeId() != TYPEID_PLAYER) || spellInfo->AttributesEx3 & SPELL_ATTR3_IGNORE_HIT_RESULT)
+ if ((!victim->IsAlive() && victim->GetTypeId() != TYPEID_PLAYER) || spellInfo->HasAttribute(SPELL_ATTR3_IGNORE_HIT_RESULT))
return SPELL_MISS_NONE;
SpellSchoolMask schoolMask = spellInfo->GetSchoolMask();
@@ -3089,7 +3089,7 @@ bool Unit::IsNonMeleeSpellCast(bool withDelayed, bool skipChanneled, bool skipAu
{
if (!skipInstant || m_currentSpells[CURRENT_GENERIC_SPELL]->GetCastTime())
{
- if (!isAutoshoot || !(m_currentSpells[CURRENT_GENERIC_SPELL]->m_spellInfo->AttributesEx2 & SPELL_ATTR2_NOT_RESET_AUTO_ACTIONS))
+ if (!isAutoshoot || !(m_currentSpells[CURRENT_GENERIC_SPELL]->m_spellInfo->HasAttribute(SPELL_ATTR2_NOT_RESET_AUTO_ACTIONS)))
return true;
}
}
@@ -3097,7 +3097,7 @@ bool Unit::IsNonMeleeSpellCast(bool withDelayed, bool skipChanneled, bool skipAu
if (!skipChanneled && m_currentSpells[CURRENT_CHANNELED_SPELL] &&
(m_currentSpells[CURRENT_CHANNELED_SPELL]->getState() != SPELL_STATE_FINISHED))
{
- if (!isAutoshoot || !(m_currentSpells[CURRENT_CHANNELED_SPELL]->m_spellInfo->AttributesEx2 & SPELL_ATTR2_NOT_RESET_AUTO_ACTIONS))
+ if (!isAutoshoot || !(m_currentSpells[CURRENT_CHANNELED_SPELL]->m_spellInfo->HasAttribute(SPELL_ATTR2_NOT_RESET_AUTO_ACTIONS)))
return true;
}
// autorepeat spells may be finished or delayed, but they are still considered cast
@@ -3232,7 +3232,7 @@ Aura* Unit::_TryStackingOrRefreshingExistingAura(SpellInfo const* newAura, uint8
castItemGUID = castItem->GetGUID();
// find current aura from spell and change it's stackamount, or refresh it's duration
- if (Aura* foundAura = GetOwnedAura(newAura->Id, casterGUID, (newAura->AttributesCu & SPELL_ATTR0_CU_ENCHANT_PROC) ? castItemGUID : ObjectGuid::Empty, 0))
+ if (Aura* foundAura = GetOwnedAura(newAura->Id, casterGUID, newAura->HasAttribute(SPELL_ATTR0_CU_ENCHANT_PROC) ? castItemGUID : ObjectGuid::Empty, 0))
{
// effect masks do not match
// extremely rare case
@@ -3743,7 +3743,7 @@ void Unit::RemoveAurasDueToSpellByDispel(uint32 spellId, uint32 dispellerSpellId
// Call OnDispel hook on AuraScript
aura->CallScriptDispel(&dispelInfo);
- if (aura->GetSpellInfo()->AttributesEx7 & SPELL_ATTR7_DISPEL_CHARGES)
+ if (aura->GetSpellInfo()->HasAttribute(SPELL_ATTR7_DISPEL_CHARGES))
aura->ModCharges(-dispelInfo.GetRemovedCharges(), AURA_REMOVE_BY_ENEMY_SPELL);
else
aura->ModStackAmount(-dispelInfo.GetRemovedCharges(), AURA_REMOVE_BY_ENEMY_SPELL);
@@ -3788,7 +3788,7 @@ void Unit::RemoveAurasDueToSpellBySteal(uint32 spellId, ObjectGuid casterGUID, U
}
}
- bool stealCharge = (aura->GetSpellInfo()->AttributesEx7 & SPELL_ATTR7_DISPEL_CHARGES) != 0;
+ bool stealCharge = aura->GetSpellInfo()->HasAttribute(SPELL_ATTR7_DISPEL_CHARGES);
// Cast duration to unsigned to prevent permanent aura's such as Righteous Fury being permanently added to caster
uint32 dur = std::min(2u * MINUTE * IN_MILLISECONDS, uint32(aura->GetDuration()));
@@ -4046,9 +4046,9 @@ void Unit::RemoveArenaAuras()
{
AuraApplication const* aurApp = iter->second;
Aura const* aura = aurApp->GetBase();
- if (!(aura->GetSpellInfo()->AttributesEx4 & SPELL_ATTR4_UNK21) // don't remove stances, shadowform, pally/hunter auras
+ if (!aura->GetSpellInfo()->HasAttribute(SPELL_ATTR4_UNK21) // don't remove stances, shadowform, pally/hunter auras
&& !aura->IsPassive() // don't remove passive auras
- && (aurApp->IsPositive() || !(aura->GetSpellInfo()->AttributesEx3 & SPELL_ATTR3_DEATH_PERSISTENT))) // not negative death persistent auras
+ && (aurApp->IsPositive() || !aura->GetSpellInfo()->HasAttribute(SPELL_ATTR3_DEATH_PERSISTENT))) // not negative death persistent auras
RemoveAura(iter);
else
++iter;
@@ -4308,7 +4308,7 @@ void Unit::GetDispellableAuraList(Unit* caster, uint32 dispelMask, DispelCharges
// The charges / stack amounts don't count towards the total number of auras that can be dispelled.
// Ie: A dispel on a target with 5 stacks of Winters Chill and a Polymorph has 1 / (1 + 1) -> 50% chance to dispell
// Polymorph instead of 1 / (5 + 1) -> 16%.
- bool dispel_charges = (aura->GetSpellInfo()->AttributesEx7 & SPELL_ATTR7_DISPEL_CHARGES) != 0;
+ bool dispel_charges = aura->GetSpellInfo()->HasAttribute(SPELL_ATTR7_DISPEL_CHARGES);
uint8 charges = dispel_charges ? aura->GetCharges() : aura->GetStackAmount();
if (charges > 0)
dispelList.push_back(std::make_pair(aura, charges));
@@ -9602,7 +9602,7 @@ bool Unit::IsMagnet() const
Unit* Unit::GetMagicHitRedirectTarget(Unit* victim, SpellInfo const* spellInfo)
{
// Patch 1.2 notes: Spell Reflection no longer reflects abilities
- if (spellInfo->Attributes & SPELL_ATTR0_ABILITY || spellInfo->AttributesEx & SPELL_ATTR1_CANT_BE_REDIRECTED || spellInfo->Attributes & SPELL_ATTR0_UNAFFECTED_BY_INVULNERABILITY)
+ if (spellInfo->HasAttribute(SPELL_ATTR0_ABILITY) || spellInfo->HasAttribute(SPELL_ATTR1_CANT_BE_REDIRECTED) || spellInfo->HasAttribute(SPELL_ATTR0_UNAFFECTED_BY_INVULNERABILITY))
return victim;
Unit::AuraEffectList const& magnetAuras = victim->GetAuraEffectsByType(SPELL_AURA_SPELL_MAGNET);
@@ -9854,7 +9854,7 @@ uint32 Unit::SpellDamageBonusDone(Unit* victim, SpellInfo const* spellProto, uin
return pdamage;
// Some spells don't benefit from done mods
- if (spellProto->AttributesEx3 & SPELL_ATTR3_NO_DONE_BONUS)
+ if (spellProto->HasAttribute(SPELL_ATTR3_NO_DONE_BONUS))
return pdamage;
// For totems get damage bonus from owner
@@ -9985,7 +9985,7 @@ float Unit::SpellDamagePctDone(Unit* victim, SpellInfo const* spellProto, Damage
return 1.0f;
// Some spells don't benefit from pct done mods
- if (spellProto->AttributesEx6 & SPELL_ATTR6_NO_DONE_PCT_DAMAGE_MODS)
+ if (spellProto->HasAttribute(SPELL_ATTR6_NO_DONE_PCT_DAMAGE_MODS))
return 1.0f;
// For totems pct done mods are calculated when its calculation is run on the player in SpellDamageBonusDone.
@@ -10009,7 +10009,7 @@ float Unit::SpellDamagePctDone(Unit* victim, SpellInfo const* spellProto, Damage
{
if ((*i)->GetSpellInfo()->EquippedItemClass == -1)
AddPct(DoneTotalMod, (*i)->GetAmount());
- else if (!((*i)->GetSpellInfo()->AttributesEx5 & SPELL_ATTR5_SPECIAL_ITEM_CLASS_CHECK) && ((*i)->GetSpellInfo()->EquippedItemSubClassMask == 0))
+ else if (!(*i)->GetSpellInfo()->HasAttribute(SPELL_ATTR5_SPECIAL_ITEM_CLASS_CHECK) && ((*i)->GetSpellInfo()->EquippedItemSubClassMask == 0))
AddPct(DoneTotalMod, (*i)->GetAmount());
else if (ToPlayer() && ToPlayer()->HasItemFitToSpellRequirements((*i)->GetSpellInfo()))
AddPct(DoneTotalMod, (*i)->GetAmount());
@@ -10324,7 +10324,7 @@ uint32 Unit::SpellDamageBonusTaken(Unit* caster, SpellInfo const* spellProto, ui
}
}
// Spells with SPELL_ATTR4_FIXED_DAMAGE should only benefit from mechanic damage mod auras.
- if (!(spellProto->AttributesEx4 & SPELL_ATTR4_FIXED_DAMAGE))
+ if (!spellProto->HasAttribute(SPELL_ATTR4_FIXED_DAMAGE))
{
// get all auras from caster that allow the spell to ignore resistance (sanctified wrath)
AuraEffectList const& IgnoreResistAuras = caster->GetAuraEffectsByType(SPELL_AURA_MOD_IGNORE_TARGET_RESIST);
@@ -10454,7 +10454,7 @@ float Unit::GetUnitSpellCriticalChance(Unit* victim, SpellInfo const* spellProto
return 0.0f;
// not critting spell
- if ((spellProto->AttributesEx2 & SPELL_ATTR2_CANT_CRIT))
+ if (spellProto->HasAttribute(SPELL_ATTR2_CANT_CRIT))
return 0.0f;
float crit_chance = 0.0f;
@@ -11063,7 +11063,7 @@ bool Unit::IsImmunedToDamage(SpellSchoolMask shoolMask) const
bool Unit::IsImmunedToDamage(SpellInfo const* spellInfo) const
{
- if (spellInfo->Attributes & SPELL_ATTR0_UNAFFECTED_BY_INVULNERABILITY)
+ if (spellInfo->HasAttribute(SPELL_ATTR0_UNAFFECTED_BY_INVULNERABILITY))
return false;
uint32 shoolMask = spellInfo->GetSchoolMask();
@@ -11096,7 +11096,7 @@ bool Unit::IsImmunedToSpell(SpellInfo const* spellInfo) const
if (itr->type == spellInfo->Id)
return true;
- if (spellInfo->Attributes & SPELL_ATTR0_UNAFFECTED_BY_INVULNERABILITY)
+ if (spellInfo->HasAttribute(SPELL_ATTR0_UNAFFECTED_BY_INVULNERABILITY))
return false;
if (spellInfo->Dispel)
@@ -11154,7 +11154,7 @@ bool Unit::IsImmunedToSpellEffect(SpellInfo const* spellInfo, uint32 index) cons
if (!spellInfo || !spellInfo->Effects[index].IsEffect())
return false;
- if (spellInfo->Attributes & SPELL_ATTR0_UNAFFECTED_BY_INVULNERABILITY)
+ if (spellInfo->HasAttribute(SPELL_ATTR0_UNAFFECTED_BY_INVULNERABILITY))
return false;
// If m_immuneToEffect type contain this effect type, IMMUNE effect.
@@ -11177,7 +11177,7 @@ bool Unit::IsImmunedToSpellEffect(SpellInfo const* spellInfo, uint32 index) cons
SpellImmuneList const& list = m_spellImmune[IMMUNITY_STATE];
for (SpellImmuneList::const_iterator itr = list.begin(); itr != list.end(); ++itr)
if (itr->type == aura)
- if (!(spellInfo->AttributesEx3 & SPELL_ATTR3_IGNORE_HIT_RESULT))
+ if (!spellInfo->HasAttribute(SPELL_ATTR3_IGNORE_HIT_RESULT))
return true;
// Check for immune to application of harmful magical effects
@@ -11252,7 +11252,7 @@ uint32 Unit::MeleeDamageBonusDone(Unit* victim, uint32 pdamage, WeaponAttackType
// Some spells don't benefit from pct done mods
if (spellProto)
- if (!(spellProto->AttributesEx6 & SPELL_ATTR6_NO_DONE_PCT_DAMAGE_MODS))
+ if (!spellProto->HasAttribute(SPELL_ATTR6_NO_DONE_PCT_DAMAGE_MODS))
{
AuraEffectList const& mModDamagePercentDone = GetAuraEffectsByType(SPELL_AURA_MOD_DAMAGE_PERCENT_DONE);
for (AuraEffectList::const_iterator i = mModDamagePercentDone.begin(); i != mModDamagePercentDone.end(); ++i)
@@ -11261,7 +11261,7 @@ uint32 Unit::MeleeDamageBonusDone(Unit* victim, uint32 pdamage, WeaponAttackType
{
if ((*i)->GetSpellInfo()->EquippedItemClass == -1)
AddPct(DoneTotalMod, (*i)->GetAmount());
- else if (!((*i)->GetSpellInfo()->AttributesEx5 & SPELL_ATTR5_SPECIAL_ITEM_CLASS_CHECK) && ((*i)->GetSpellInfo()->EquippedItemSubClassMask == 0))
+ else if (!(*i)->GetSpellInfo()->HasAttribute(SPELL_ATTR5_SPECIAL_ITEM_CLASS_CHECK) && ((*i)->GetSpellInfo()->EquippedItemSubClassMask == 0))
AddPct(DoneTotalMod, (*i)->GetAmount());
else if (ToPlayer() && ToPlayer()->HasItemFitToSpellRequirements((*i)->GetSpellInfo()))
AddPct(DoneTotalMod, (*i)->GetAmount());
@@ -11523,7 +11523,7 @@ void Unit::ApplySpellDispelImmunity(const SpellInfo* spellProto, DispelType type
{
ApplySpellImmune(spellProto->Id, IMMUNITY_DISPEL, type, apply);
- if (apply && spellProto->AttributesEx & SPELL_ATTR1_DISPEL_AURAS_ON_IMMUNITY)
+ if (apply && spellProto->HasAttribute(SPELL_ATTR1_DISPEL_AURAS_ON_IMMUNITY))
{
// Create dispel mask by dispel type
uint32 dispelMask = SpellInfo::GetDispelMask(type);
@@ -11864,7 +11864,7 @@ bool Unit::_IsValidAttackTarget(Unit const* target, SpellInfo const* bySpell, Wo
return false;
// can't attack invisible (ignore stealth for aoe spells) also if the area being looked at is from a spell use the dynamic object created instead of the casting unit.
- if ((!bySpell || !(bySpell->AttributesEx6 & SPELL_ATTR6_CAN_TARGET_INVISIBLE)) && (obj ? !obj->CanSeeOrDetect(target, bySpell && bySpell->IsAffectingArea()) : !CanSeeOrDetect(target, bySpell && bySpell->IsAffectingArea())))
+ if ((!bySpell || !bySpell->HasAttribute(SPELL_ATTR6_CAN_TARGET_INVISIBLE)) && (obj ? !obj->CanSeeOrDetect(target, bySpell && bySpell->IsAffectingArea()) : !CanSeeOrDetect(target, bySpell && bySpell->IsAffectingArea())))
return false;
// can't attack dead
@@ -11872,7 +11872,7 @@ bool Unit::_IsValidAttackTarget(Unit const* target, SpellInfo const* bySpell, Wo
return false;
// can't attack untargetable
- if ((!bySpell || !(bySpell->AttributesEx6 & SPELL_ATTR6_CAN_TARGET_UNTARGETABLE))
+ if ((!bySpell || !bySpell->HasAttribute(SPELL_ATTR6_CAN_TARGET_UNTARGETABLE))
&& target->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE))
return false;
@@ -11981,7 +11981,7 @@ bool Unit::_IsValidAssistTarget(Unit const* target, SpellInfo const* bySpell) co
return false;
// can't assist invisible
- if ((!bySpell || !(bySpell->AttributesEx6 & SPELL_ATTR6_CAN_TARGET_INVISIBLE)) && !CanSeeOrDetect(target, bySpell && bySpell->IsAffectingArea()))
+ if ((!bySpell || !bySpell->HasAttribute(SPELL_ATTR6_CAN_TARGET_INVISIBLE)) && !CanSeeOrDetect(target, bySpell && bySpell->IsAffectingArea()))
return false;
// can't assist dead
@@ -11989,11 +11989,11 @@ bool Unit::_IsValidAssistTarget(Unit const* target, SpellInfo const* bySpell) co
return false;
// can't assist untargetable
- if ((!bySpell || !(bySpell->AttributesEx6 & SPELL_ATTR6_CAN_TARGET_UNTARGETABLE))
+ if ((!bySpell || !bySpell->HasAttribute(SPELL_ATTR6_CAN_TARGET_UNTARGETABLE))
&& target->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE))
return false;
- if (!bySpell || !(bySpell->AttributesEx6 & SPELL_ATTR6_ASSIST_IGNORE_IMMUNE_FLAG))
+ if (!bySpell || !bySpell->HasAttribute(SPELL_ATTR6_ASSIST_IGNORE_IMMUNE_FLAG))
{
if (HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_PVP_ATTACKABLE))
{
@@ -12040,7 +12040,7 @@ bool Unit::_IsValidAssistTarget(Unit const* target, SpellInfo const* bySpell) co
// PvC case - player can assist creature only if has specific type flags
// !target->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_PVP_ATTACKABLE) &&
else if (HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_PVP_ATTACKABLE)
- && (!bySpell || !(bySpell->AttributesEx6 & SPELL_ATTR6_ASSIST_IGNORE_IMMUNE_FLAG))
+ && (!bySpell || !bySpell->HasAttribute(SPELL_ATTR6_ASSIST_IGNORE_IMMUNE_FLAG))
&& !((target->GetByteValue(UNIT_FIELD_BYTES_2, 1) & UNIT_BYTE2_FLAG_PVP)))
{
if (Creature const* creatureTarget = target->ToCreature())
@@ -12822,7 +12822,7 @@ int32 Unit::ModSpellDuration(SpellInfo const* spellProto, Unit const* target, in
return duration;
// some auras are not affected by duration modifiers
- if (spellProto->AttributesEx7 & SPELL_ATTR7_IGNORE_DURATION_MODS)
+ if (spellProto->HasAttribute(SPELL_ATTR7_IGNORE_DURATION_MODS))
return duration;
// cut duration only of negative effects
@@ -12926,17 +12926,17 @@ void Unit::ModSpellCastTime(SpellInfo const* spellInfo, int32 & castTime, Spell*
if (!spellInfo || castTime < 0)
return;
- if (spellInfo->IsChanneled() && !(spellInfo->AttributesEx5 & SPELL_ATTR5_HASTE_AFFECT_DURATION))
+ if (spellInfo->IsChanneled() && !spellInfo->HasAttribute(SPELL_ATTR5_HASTE_AFFECT_DURATION))
return;
// called from caster
if (Player* modOwner = GetSpellModOwner())
modOwner->ApplySpellMod(spellInfo->Id, SPELLMOD_CASTING_TIME, castTime, spell);
- if (!((spellInfo->Attributes & (SPELL_ATTR0_ABILITY | SPELL_ATTR0_TRADESPELL)) || (spellInfo->AttributesEx3 & SPELL_ATTR3_NO_DONE_BONUS)) &&
+ if (!(spellInfo->HasAttribute(SPELL_ATTR0_ABILITY) || spellInfo->HasAttribute(SPELL_ATTR0_TRADESPELL) || spellInfo->HasAttribute(SPELL_ATTR0_TRADESPELL) || spellInfo->HasAttribute(SPELL_ATTR3_NO_DONE_BONUS)) &&
((GetTypeId() == TYPEID_PLAYER && spellInfo->SpellFamilyName) || GetTypeId() == TYPEID_UNIT))
castTime = int32(float(castTime) * GetFloatValue(UNIT_MOD_CAST_SPEED));
- else if (spellInfo->Attributes & SPELL_ATTR0_REQ_AMMO && !(spellInfo->AttributesEx2 & SPELL_ATTR2_AUTOREPEAT_FLAG))
+ else if (spellInfo->HasAttribute(SPELL_ATTR0_REQ_AMMO) && !spellInfo->HasAttribute(SPELL_ATTR2_AUTOREPEAT_FLAG))
castTime = int32(float(castTime) * m_modAttackSpeedPct[RANGED_ATTACK]);
else if (spellInfo->SpellVisual[0] == 3881 && HasAura(67556)) // cooking with Chef Hat.
castTime = 500;
@@ -13711,7 +13711,7 @@ void CharmInfo::InitPossessCreateSpells()
{
uint32 spellId = _unit->ToCreature()->m_spells[i];
SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId);
- if (spellInfo && !(spellInfo->Attributes & SPELL_ATTR0_CASTABLE_WHILE_DEAD))
+ if (spellInfo && !spellInfo->HasAttribute(SPELL_ATTR0_CASTABLE_WHILE_DEAD))
{
if (spellInfo->IsPassive())
_unit->CastSpell(_unit, spellInfo, true);
@@ -13739,7 +13739,7 @@ void CharmInfo::InitCharmCreateSpells()
uint32 spellId = _unit->ToCreature()->m_spells[x];
SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId);
- if (!spellInfo || spellInfo->Attributes & SPELL_ATTR0_CASTABLE_WHILE_DEAD)
+ if (!spellInfo || spellInfo->HasAttribute(SPELL_ATTR0_CASTABLE_WHILE_DEAD))
{
_charmspells[x].SetActionAndType(spellId, ACT_DISABLED);
continue;
@@ -14126,7 +14126,7 @@ void Unit::ProcDamageAndSpellFor(bool isVictim, Unit* target, uint32 procFlag, u
continue;
// Triggered spells not triggering additional spells
- bool triggered = !(spellProto->AttributesEx3 & SPELL_ATTR3_CAN_PROC_WITH_TRIGGERED) ?
+ bool triggered = !spellProto->HasAttribute(SPELL_ATTR3_CAN_PROC_WITH_TRIGGERED) ?
(procExtra & PROC_EX_INTERNAL_TRIGGERED && !(procFlag & PROC_FLAG_DONE_TRAP_ACTIVATION)) : false;
for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
@@ -14183,7 +14183,7 @@ void Unit::ProcDamageAndSpellFor(bool isVictim, Unit* target, uint32 procFlag, u
cooldown = i->spellProcEvent->cooldown;
// Note: must SetCantProc(false) before return
- if (spellInfo->AttributesEx3 & SPELL_ATTR3_DISABLE_PROC)
+ if (spellInfo->HasAttribute(SPELL_ATTR3_DISABLE_PROC))
SetCantProc(true);
bool handled = i->aura->CallScriptProcHandlers(aurApp, eventInfo);
@@ -14378,7 +14378,7 @@ void Unit::ProcDamageAndSpellFor(bool isVictim, Unit* target, uint32 procFlag, u
i->aura->CallScriptAfterProcHandlers(aurApp, eventInfo);
- if (spellInfo->AttributesEx3 & SPELL_ATTR3_DISABLE_PROC)
+ if (spellInfo->HasAttribute(SPELL_ATTR3_DISABLE_PROC))
SetCantProc(false);
}
@@ -15053,7 +15053,7 @@ bool Unit::IsTriggeredAtSpellProcEvent(Unit* victim, Aura* aura, SpellInfo const
// Additional checks for triggered spells (ignore trap casts)
if (procExtra & PROC_EX_INTERNAL_TRIGGERED && !(procFlag & PROC_FLAG_DONE_TRAP_ACTIVATION))
{
- if (!(spellProto->AttributesEx3 & SPELL_ATTR3_CAN_PROC_WITH_TRIGGERED))
+ if (!spellProto->HasAttribute(SPELL_ATTR3_CAN_PROC_WITH_TRIGGERED))
return false;
}
@@ -16213,7 +16213,7 @@ Aura* Unit::AddAura(uint32 spellId, Unit* target)
if (!spellInfo)
return NULL;
- if (!target->IsAlive() && !(spellInfo->Attributes & SPELL_ATTR0_PASSIVE) && !(spellInfo->AttributesEx2 & SPELL_ATTR2_CAN_TARGET_DEAD))
+ if (!target->IsAlive() && !spellInfo->HasAttribute(SPELL_ATTR0_PASSIVE) && !spellInfo->HasAttribute(SPELL_ATTR2_CAN_TARGET_DEAD))
return NULL;
return AddAura(spellInfo, MAX_EFFECT_MASK, target);
@@ -17316,30 +17316,30 @@ void Unit::StopAttackFaction(uint32 faction_id)
void Unit::OutDebugInfo() const
{
TC_LOG_ERROR("entities.unit", "Unit::OutDebugInfo");
- TC_LOG_INFO("entities.unit", "%s name %s", GetGUID().ToString().c_str(), GetName().c_str());
- TC_LOG_INFO("entities.unit", "Owner %s, Minion %s, Charmer %s, Charmed %s", GetOwnerGUID().ToString().c_str(), GetMinionGUID().ToString().c_str(), GetCharmerGUID().ToString().c_str(), GetCharmGUID().ToString().c_str());
- TC_LOG_INFO("entities.unit", "In world %u, unit type mask %u", (uint32)(IsInWorld() ? 1 : 0), m_unitTypeMask);
+ TC_LOG_DEBUG("entities.unit", "%s name %s", GetGUID().ToString().c_str(), GetName().c_str());
+ TC_LOG_DEBUG("entities.unit", "Owner %s, Minion %s, Charmer %s, Charmed %s", GetOwnerGUID().ToString().c_str(), GetMinionGUID().ToString().c_str(), GetCharmerGUID().ToString().c_str(), GetCharmGUID().ToString().c_str());
+ TC_LOG_DEBUG("entities.unit", "In world %u, unit type mask %u", (uint32)(IsInWorld() ? 1 : 0), m_unitTypeMask);
if (IsInWorld())
- TC_LOG_INFO("entities.unit", "Mapid %u", GetMapId());
+ TC_LOG_DEBUG("entities.unit", "Mapid %u", GetMapId());
std::ostringstream o;
o << "Summon Slot: ";
for (uint32 i = 0; i < MAX_SUMMON_SLOT; ++i)
o << m_SummonSlot[i].ToString() << ", ";
- TC_LOG_INFO("entities.unit", "%s", o.str().c_str());
+ TC_LOG_DEBUG("entities.unit", "%s", o.str().c_str());
o.str("");
o << "Controlled List: ";
for (ControlList::const_iterator itr = m_Controlled.begin(); itr != m_Controlled.end(); ++itr)
o << (*itr)->GetGUID().ToString() << ", ";
- TC_LOG_INFO("entities.unit", "%s", o.str().c_str());
+ TC_LOG_DEBUG("entities.unit", "%s", o.str().c_str());
o.str("");
o << "Aura List: ";
for (AuraApplicationMap::const_iterator itr = m_appliedAuras.begin(); itr != m_appliedAuras.end(); ++itr)
o << itr->first << ", ";
- TC_LOG_INFO("entities.unit", "%s", o.str().c_str());
+ TC_LOG_DEBUG("entities.unit", "%s", o.str().c_str());
o.str("");
if (IsVehicle())
@@ -17348,11 +17348,11 @@ void Unit::OutDebugInfo() const
for (SeatMap::iterator itr = GetVehicleKit()->Seats.begin(); itr != GetVehicleKit()->Seats.end(); ++itr)
if (Unit* passenger = ObjectAccessor::GetUnit(*GetVehicleBase(), itr->second.Passenger.Guid))
o << passenger->GetGUID().ToString() << ", ";
- TC_LOG_INFO("entities.unit", "%s", o.str().c_str());
+ TC_LOG_DEBUG("entities.unit", "%s", o.str().c_str());
}
if (GetVehicle())
- TC_LOG_INFO("entities.unit", "On vehicle %u.", GetVehicleBase()->GetEntry());
+ TC_LOG_DEBUG("entities.unit", "On vehicle %u.", GetVehicleBase()->GetEntry());
}
uint32 Unit::GetRemainingPeriodicAmount(ObjectGuid caster, uint32 spellId, AuraType auraType, uint8 effectIndex) const
diff --git a/src/server/game/Globals/ObjectMgr.cpp b/src/server/game/Globals/ObjectMgr.cpp
index d07ec212d0c..1db9183fbe4 100644
--- a/src/server/game/Globals/ObjectMgr.cpp
+++ b/src/server/game/Globals/ObjectMgr.cpp
@@ -3893,6 +3893,8 @@ void ObjectMgr::BuildPlayerLevelInfo(uint8 race, uint8 _class, uint8 level, Play
}
}
+int32 const ReputationMgr::Reputation_Cap;
+
void ObjectMgr::LoadQuests()
{
uint32 oldMSTime = getMSTime();
@@ -7078,6 +7080,7 @@ void ObjectMgr::LoadReputationSpilloverTemplate()
continue;
}
+ bool invalidSpilloverFaction = false;
for (uint32 i = 0; i < MAX_SPILLOVER_FACTIONS; ++i)
{
if (repTemplate.faction[i])
@@ -7087,47 +7090,28 @@ void ObjectMgr::LoadReputationSpilloverTemplate()
if (!factionSpillover)
{
TC_LOG_ERROR("sql.sql", "Spillover faction (faction.dbc) %u does not exist but is used in `reputation_spillover_template` for faction %u, skipping", repTemplate.faction[i], factionId);
- continue;
+ invalidSpilloverFaction = true;
+ break;
}
if (factionSpillover->reputationListID < 0)
{
TC_LOG_ERROR("sql.sql", "Spillover faction (faction.dbc) %u for faction %u in `reputation_spillover_template` can not be listed for client, and then useless, skipping", repTemplate.faction[i], factionId);
- continue;
+ invalidSpilloverFaction = true;
+ break;
}
if (repTemplate.faction_rank[i] >= MAX_REPUTATION_RANK)
{
TC_LOG_ERROR("sql.sql", "Rank %u used in `reputation_spillover_template` for spillover faction %u is not valid, skipping", repTemplate.faction_rank[i], repTemplate.faction[i]);
- continue;
+ invalidSpilloverFaction = true;
+ break;
}
}
}
- FactionEntry const* factionEntry0 = sFactionStore.LookupEntry(repTemplate.faction[0]);
- if (repTemplate.faction[0] && !factionEntry0)
- {
- TC_LOG_ERROR("sql.sql", "Faction (faction.dbc) %u does not exist but is used in `reputation_spillover_template`", repTemplate.faction[0]);
- continue;
- }
- FactionEntry const* factionEntry1 = sFactionStore.LookupEntry(repTemplate.faction[1]);
- if (repTemplate.faction[1] && !factionEntry1)
- {
- TC_LOG_ERROR("sql.sql", "Faction (faction.dbc) %u does not exist but is used in `reputation_spillover_template`", repTemplate.faction[1]);
- continue;
- }
- FactionEntry const* factionEntry2 = sFactionStore.LookupEntry(repTemplate.faction[2]);
- if (repTemplate.faction[2] && !factionEntry2)
- {
- TC_LOG_ERROR("sql.sql", "Faction (faction.dbc) %u does not exist but is used in `reputation_spillover_template`", repTemplate.faction[2]);
- continue;
- }
- FactionEntry const* factionEntry3 = sFactionStore.LookupEntry(repTemplate.faction[3]);
- if (repTemplate.faction[3] && !factionEntry3)
- {
- TC_LOG_ERROR("sql.sql", "Faction (faction.dbc) %u does not exist but is used in `reputation_spillover_template`", repTemplate.faction[3]);
+ if (invalidSpilloverFaction)
continue;
- }
_repSpilloverTemplateStore[factionId] = repTemplate;
@@ -8619,7 +8603,6 @@ void ObjectMgr::LoadBroadcastTexts()
}
_broadcastTextStore.rehash(result->GetRowCount());
- uint32 count = 0;
do
{
@@ -8645,26 +8628,23 @@ void ObjectMgr::LoadBroadcastTexts()
{
if (!sSoundEntriesStore.LookupEntry(bct.SoundId))
{
- TC_LOG_INFO("sql.sql", "BroadcastText (Id: %u) in table `broadcast_text` has SoundId %u but sound does not exist. Skipped.", bct.Id, bct.SoundId);
- // don't load bct of higher expansions
- continue;
+ TC_LOG_DEBUG("broadcasttext", "BroadcastText (Id: %u) in table `broadcast_text` has SoundId %u but sound does not exist.", bct.Id, bct.SoundId);
+ bct.SoundId = 0;
}
}
if (!GetLanguageDescByID(bct.Language))
{
- TC_LOG_INFO("sql.sql", "BroadcastText (Id: %u) in table `broadcast_text` using Language %u but Language does not exist. Skipped.", bct.Id, bct.Language);
- // don't load bct of higher expansions
- continue;
+ TC_LOG_DEBUG("broadcasttext", "BroadcastText (Id: %u) in table `broadcast_text` using Language %u but Language does not exist.", bct.Id, bct.Language);
+ bct.Language = LANG_UNIVERSAL;
}
if (bct.EmoteId0)
{
if (!sEmotesStore.LookupEntry(bct.EmoteId0))
{
- TC_LOG_INFO("sql.sql", "BroadcastText (Id: %u) in table `broadcast_text` has EmoteId0 %u but emote does not exist. Skipped.", bct.Id, bct.EmoteId0);
- // don't load bct of higher expansions
- continue;
+ TC_LOG_DEBUG("broadcasttext", "BroadcastText (Id: %u) in table `broadcast_text` has EmoteId0 %u but emote does not exist.", bct.Id, bct.EmoteId0);
+ bct.EmoteId0 = 0;
}
}
@@ -8672,9 +8652,8 @@ void ObjectMgr::LoadBroadcastTexts()
{
if (!sEmotesStore.LookupEntry(bct.EmoteId1))
{
- TC_LOG_INFO("sql.sql", "BroadcastText (Id: %u) in table `broadcast_text` has EmoteId1 %u but emote does not exist. Skipped.", bct.Id, bct.EmoteId1);
- // don't load bct of higher expansions
- continue;
+ TC_LOG_DEBUG("broadcasttext", "BroadcastText (Id: %u) in table `broadcast_text` has EmoteId1 %u but emote does not exist.", bct.Id, bct.EmoteId1);
+ bct.EmoteId1 = 0;
}
}
@@ -8682,19 +8661,16 @@ void ObjectMgr::LoadBroadcastTexts()
{
if (!sEmotesStore.LookupEntry(bct.EmoteId2))
{
- TC_LOG_INFO("sql.sql", "BroadcastText (Id: %u) in table `broadcast_text` has EmoteId2 %u but emote does not exist. Skipped.", bct.Id, bct.EmoteId2);
- // don't load bct of higher expansions
- continue;
+ TC_LOG_DEBUG("broadcasttext", "BroadcastText (Id: %u) in table `broadcast_text` has EmoteId2 %u but emote does not exist.", bct.Id, bct.EmoteId2);
+ bct.EmoteId2 = 0;
}
}
_broadcastTextStore[bct.Id] = bct;
-
- ++count;
}
while (result->NextRow());
- TC_LOG_INFO("server.loading", ">> Loaded %u broadcast texts in %u ms", count, GetMSTimeDiffToNow(oldMSTime));
+ TC_LOG_INFO("server.loading", ">> Loaded " SZFMTD " broadcast texts in %u ms", _broadcastTextStore.size(), GetMSTimeDiffToNow(oldMSTime));
}
void ObjectMgr::LoadBroadcastTextLocales()
@@ -8720,8 +8696,7 @@ void ObjectMgr::LoadBroadcastTextLocales()
BroadcastTextContainer::iterator bct = _broadcastTextStore.find(id);
if (bct == _broadcastTextStore.end())
{
- TC_LOG_INFO("sql.sql", "BroadcastText (Id: %u) in table `locales_broadcast_text` does not exist or is incompatible. Skipped!", id);
- // don't load bct of higher expansions
+ TC_LOG_ERROR("sql.sql", "BroadcastText (Id: %u) in table `locales_broadcast_text` does not exist. Skipped!", id);
continue;
}
diff --git a/src/server/game/Grids/Notifiers/GridNotifiers.cpp b/src/server/game/Grids/Notifiers/GridNotifiers.cpp
index e14910bdf5e..abe302d2d3d 100644
--- a/src/server/game/Grids/Notifiers/GridNotifiers.cpp
+++ b/src/server/game/Grids/Notifiers/GridNotifiers.cpp
@@ -65,7 +65,7 @@ void VisibleNotifier::SendToSelf()
}
}
- for (GuidSet::const_iterator it = vis_guids.begin(); it != vis_guids.end(); ++it)
+ for (auto it = vis_guids.begin(); it != vis_guids.end(); ++it)
{
i_player.m_clientGUIDs.erase(*it);
i_data.AddOutOfRangeGUID(*it);
diff --git a/src/server/game/Grids/Notifiers/GridNotifiers.h b/src/server/game/Grids/Notifiers/GridNotifiers.h
index 5eb726084b3..ccf9748e67a 100644
--- a/src/server/game/Grids/Notifiers/GridNotifiers.h
+++ b/src/server/game/Grids/Notifiers/GridNotifiers.h
@@ -43,7 +43,7 @@ namespace Trinity
Player &i_player;
UpdateData i_data;
std::set<Unit*> i_visibleNow;
- GuidSet vis_guids;
+ GuidUnorderedSet vis_guids;
VisibleNotifier(Player &player) : i_player(player), vis_guids(player.m_clientGUIDs) { }
template<class T> void Visit(GridRefManager<T> &m);
diff --git a/src/server/game/Groups/Group.cpp b/src/server/game/Groups/Group.cpp
index d9124551c63..5664cbb6e4b 100644
--- a/src/server/game/Groups/Group.cpp
+++ b/src/server/game/Groups/Group.cpp
@@ -1808,7 +1808,7 @@ GroupJoinBattlegroundResult Group::CanJoinBattlegroundQueue(Battleground const*
return ERR_BATTLEGROUND_NONE; // ERR_GROUP_JOIN_BATTLEGROUND_TOO_MANY handled on client side
// get a player as reference, to compare other players' stats to (arena team id, queue id based on level, etc.)
- Player* reference = GetFirstMember()->GetSource();
+ Player* reference = ASSERT_NOTNULL(GetFirstMember())->GetSource();
// no reference found, can't join this way
if (!reference)
return ERR_BATTLEGROUND_JOIN_FAILED;
diff --git a/src/server/game/Handlers/PetHandler.cpp b/src/server/game/Handlers/PetHandler.cpp
index 0fcaa47a5e2..9ff2041ee92 100644
--- a/src/server/game/Handlers/PetHandler.cpp
+++ b/src/server/game/Handlers/PetHandler.cpp
@@ -70,7 +70,7 @@ void WorldSession::HandlePetAction(WorldPacket& recvData)
// used also for charmed creature
Unit* pet = ObjectAccessor::GetUnit(*_player, guid1);
- TC_LOG_INFO("network", "HandlePetAction: %s - flag: %u, spellid: %u, target: %s.", guid1.ToString().c_str(), uint32(flag), spellid, guid2.ToString().c_str());
+ TC_LOG_DEBUG("network", "HandlePetAction: %s - flag: %u, spellid: %u, target: %s.", guid1.ToString().c_str(), uint32(flag), spellid, guid2.ToString().c_str());
if (!pet)
{
@@ -89,7 +89,7 @@ void WorldSession::HandlePetAction(WorldPacket& recvData)
SpellInfo const* spell = (flag == ACT_ENABLED || flag == ACT_PASSIVE) ? sSpellMgr->GetSpellInfo(spellid) : NULL;
if (!spell)
return;
- if (!(spell->Attributes & SPELL_ATTR0_CASTABLE_WHILE_DEAD))
+ if (!spell->HasAttribute(SPELL_ATTR0_CASTABLE_WHILE_DEAD))
return;
}
@@ -398,7 +398,7 @@ void WorldSession::HandlePetActionHelper(Unit* pet, ObjectGuid guid1, uint32 spe
void WorldSession::HandlePetNameQuery(WorldPacket& recvData)
{
- TC_LOG_INFO("network", "HandlePetNameQuery. CMSG_PET_NAME_QUERY");
+ TC_LOG_DEBUG("network", "WORLD: Received CMSG_PET_NAME_QUERY");
uint32 petnumber;
ObjectGuid petguid;
@@ -465,7 +465,7 @@ bool WorldSession::CheckStableMaster(ObjectGuid guid)
void WorldSession::HandlePetSetAction(WorldPacket& recvData)
{
- TC_LOG_INFO("network", "HandlePetSetAction. CMSG_PET_SET_ACTION");
+ TC_LOG_DEBUG("network", "WORLD: Received CMSG_PET_SET_ACTION");
ObjectGuid petguid;
uint8 count;
@@ -545,7 +545,7 @@ void WorldSession::HandlePetSetAction(WorldPacket& recvData)
uint32 spell_id = UNIT_ACTION_BUTTON_ACTION(data[i]);
uint8 act_state = UNIT_ACTION_BUTTON_TYPE(data[i]);
- TC_LOG_INFO("network", "Player %s has changed pet spell action. Position: %u, Spell: %u, State: 0x%X",
+ TC_LOG_DEBUG("network", "Player %s has changed pet spell action. Position: %u, Spell: %u, State: 0x%X",
_player->GetName().c_str(), position[i], spell_id, uint32(act_state));
//if it's act for spell (en/disable/cast) and there is a spell given (0 = remove spell) which pet doesn't know, don't add
@@ -582,7 +582,7 @@ void WorldSession::HandlePetSetAction(WorldPacket& recvData)
void WorldSession::HandlePetRename(WorldPacket& recvData)
{
- TC_LOG_INFO("network", "HandlePetRename. CMSG_PET_RENAME");
+ TC_LOG_DEBUG("network", "WORLD: Received CMSG_PET_RENAME");
ObjectGuid petguid;
uint8 isdeclined;
@@ -670,7 +670,7 @@ void WorldSession::HandlePetAbandon(WorldPacket& recvData)
{
ObjectGuid guid;
recvData >> guid; //pet guid
- TC_LOG_INFO("network", "HandlePetAbandon. CMSG_PET_ABANDON %s", guid.ToString().c_str());
+ TC_LOG_DEBUG("network", "WORLD: Received CMSG_PET_ABANDON %s", guid.ToString().c_str());
if (!_player->IsInWorld())
return;
@@ -696,7 +696,7 @@ void WorldSession::HandlePetAbandon(WorldPacket& recvData)
void WorldSession::HandlePetSpellAutocastOpcode(WorldPacket& recvPacket)
{
- TC_LOG_INFO("network", "CMSG_PET_SPELL_AUTOCAST");
+ TC_LOG_DEBUG("network", "WORLD: Received CMSG_PET_SPELL_AUTOCAST");
ObjectGuid guid;
uint32 spellid;
uint8 state; //1 for on, 0 for off
@@ -744,7 +744,7 @@ void WorldSession::HandlePetSpellAutocastOpcode(WorldPacket& recvPacket)
void WorldSession::HandlePetCastSpellOpcode(WorldPacket& recvPacket)
{
- TC_LOG_DEBUG("network", "WORLD: CMSG_PET_CAST_SPELL");
+ TC_LOG_DEBUG("network", "WORLD: Received CMSG_PET_CAST_SPELL");
ObjectGuid guid;
uint8 castCount;
@@ -846,7 +846,7 @@ void WorldSession::SendPetNameInvalid(uint32 error, const std::string& name, Dec
void WorldSession::HandlePetLearnTalent(WorldPacket& recvData)
{
- TC_LOG_DEBUG("network", "WORLD: CMSG_PET_LEARN_TALENT");
+ TC_LOG_DEBUG("network", "WORLD: Received CMSG_PET_LEARN_TALENT");
ObjectGuid guid;
uint32 talentId, requestedRank;
@@ -858,7 +858,7 @@ void WorldSession::HandlePetLearnTalent(WorldPacket& recvData)
void WorldSession::HandleLearnPreviewTalentsPet(WorldPacket& recvData)
{
- TC_LOG_DEBUG("network", "CMSG_LEARN_PREVIEW_TALENTS_PET");
+ TC_LOG_DEBUG("network", "WORLD: Received CMSG_LEARN_PREVIEW_TALENTS_PET");
ObjectGuid guid;
recvData >> guid;
diff --git a/src/server/game/Handlers/QuestHandler.cpp b/src/server/game/Handlers/QuestHandler.cpp
index d6d7e3b9876..3c6258b2d7c 100644
--- a/src/server/game/Handlers/QuestHandler.cpp
+++ b/src/server/game/Handlers/QuestHandler.cpp
@@ -458,6 +458,12 @@ void WorldSession::HandleQuestConfirmAccept(WorldPacket& recvData)
if (!_player->IsInSameRaidWith(originalPlayer))
return;
+ if (!originalPlayer->CanShareQuest(questId))
+ return;
+
+ if (!_player->CanTakeQuest(quest, true))
+ return;
+
if (_player->CanAddQuest(quest, true))
_player->AddQuestAndCheckCompletion(quest, NULL); // NULL, this prevent DB script from duplicate running
@@ -621,7 +627,7 @@ void WorldSession::HandleQuestgiverStatusMultipleQuery(WorldPacket& /*recvPacket
WorldPacket data(SMSG_QUESTGIVER_STATUS_MULTIPLE, 4);
data << uint32(count); // placeholder
- for (GuidSet::const_iterator itr = _player->m_clientGUIDs.begin(); itr != _player->m_clientGUIDs.end(); ++itr)
+ for (auto itr = _player->m_clientGUIDs.begin(); itr != _player->m_clientGUIDs.end(); ++itr)
{
uint32 questStatus = DIALOG_STATUS_NONE;
diff --git a/src/server/game/Handlers/SpellHandler.cpp b/src/server/game/Handlers/SpellHandler.cpp
index c4bd892d3cf..fede3e30211 100644
--- a/src/server/game/Handlers/SpellHandler.cpp
+++ b/src/server/game/Handlers/SpellHandler.cpp
@@ -417,7 +417,7 @@ void WorldSession::HandleCancelAuraOpcode(WorldPacket& recvPacket)
return;
// not allow remove spells with attr SPELL_ATTR0_CANT_CANCEL
- if (spellInfo->Attributes & SPELL_ATTR0_CANT_CANCEL)
+ if (spellInfo->HasAttribute(SPELL_ATTR0_CANT_CANCEL))
return;
// channeled spell case (it currently cast then)
diff --git a/src/server/game/Loot/LootMgr.cpp b/src/server/game/Loot/LootMgr.cpp
index db6a2c98379..52b866850a6 100644
--- a/src/server/game/Loot/LootMgr.cpp
+++ b/src/server/game/Loot/LootMgr.cpp
@@ -1832,7 +1832,7 @@ void LoadLootTemplates_Spell()
{
// not report about not trainable spells (optionally supported by DB)
// ignore 61756 (Northrend Inscription Research (FAST QA VERSION) for example
- if (!(spellInfo->Attributes & SPELL_ATTR0_NOT_SHAPESHIFT) || (spellInfo->Attributes & SPELL_ATTR0_TRADESPELL))
+ if (!spellInfo->HasAttribute(SPELL_ATTR0_NOT_SHAPESHIFT) || spellInfo->HasAttribute(SPELL_ATTR0_TRADESPELL))
{
LootTemplates_Spell.ReportNonExistingId(spell_id, "Spell", spellInfo->Id);
}
diff --git a/src/server/game/Maps/Map.cpp b/src/server/game/Maps/Map.cpp
index 49f7bc86081..b4066b2257e 100644
--- a/src/server/game/Maps/Map.cpp
+++ b/src/server/game/Maps/Map.cpp
@@ -80,7 +80,10 @@ bool Map::ExistMap(uint32 mapid, int gx, int gy)
FILE* pf = fopen(fileName, "rb");
if (!pf)
- TC_LOG_ERROR("maps", "Map file '%s': does not exist!", fileName);
+ {
+ TC_LOG_ERROR("maps", "Map file '%s' does not exist!", fileName);
+ TC_LOG_ERROR("maps", "Please place MAP-files (*.map) in the appropriate directory (%s), or correct the DataDir setting in your worldserver.conf file.", (sWorld->GetDataPath()+"maps/").c_str());
+ }
else
{
map_fileheader header;
@@ -109,7 +112,8 @@ bool Map::ExistVMap(uint32 mapid, int gx, int gy)
if (!exists)
{
std::string name = vmgr->getDirFileName(mapid, gx, gy);
- TC_LOG_ERROR("maps", "VMap file '%s' is missing or points to wrong version of vmap file. Redo vmaps with latest version of vmap_assembler.exe.", (sWorld->GetDataPath()+"vmaps/"+name).c_str());
+ TC_LOG_ERROR("maps", "VMap file '%s' does not exist", (sWorld->GetDataPath()+"vmaps/"+name).c_str());
+ TC_LOG_ERROR("maps", "Please place VMAP-files (*.vmtree and *.vmtile) in the vmap-directory (%s), or correct the DataDir setting in your worldserver.conf file.", (sWorld->GetDataPath()+"vmaps/").c_str());
return false;
}
}
@@ -126,9 +130,9 @@ void Map::LoadMMap(int gx, int gy)
bool mmapLoadResult = MMAP::MMapFactory::createOrGetMMapManager()->loadMap((sWorld->GetDataPath() + "mmaps").c_str(), GetId(), gx, gy);
if (mmapLoadResult)
- TC_LOG_INFO("maps", "MMAP loaded name:%s, id:%d, x:%d, y:%d (mmap rep.: x:%d, y:%d)", GetMapName(), GetId(), gx, gy, gx, gy);
+ TC_LOG_DEBUG("maps", "MMAP loaded name:%s, id:%d, x:%d, y:%d (mmap rep.: x:%d, y:%d)", GetMapName(), GetId(), gx, gy, gx, gy);
else
- TC_LOG_INFO("maps", "Could not load MMAP name:%s, id:%d, x:%d, y:%d (mmap rep.: x:%d, y:%d)", GetMapName(), GetId(), gx, gy, gx, gy);
+ TC_LOG_ERROR("maps", "Could not load MMAP name:%s, id:%d, x:%d, y:%d (mmap rep.: x:%d, y:%d)", GetMapName(), GetId(), gx, gy, gx, gy);
}
void Map::LoadVMap(int gx, int gy)
@@ -140,10 +144,10 @@ void Map::LoadVMap(int gx, int gy)
switch (vmapLoadResult)
{
case VMAP::VMAP_LOAD_RESULT_OK:
- TC_LOG_INFO("maps", "VMAP loaded name:%s, id:%d, x:%d, y:%d (vmap rep.: x:%d, y:%d)", GetMapName(), GetId(), gx, gy, gx, gy);
+ TC_LOG_DEBUG("maps", "VMAP loaded name:%s, id:%d, x:%d, y:%d (vmap rep.: x:%d, y:%d)", GetMapName(), GetId(), gx, gy, gx, gy);
break;
case VMAP::VMAP_LOAD_RESULT_ERROR:
- TC_LOG_INFO("maps", "Could not load VMAP name:%s, id:%d, x:%d, y:%d (vmap rep.: x:%d, y:%d)", GetMapName(), GetId(), gx, gy, gx, gy);
+ TC_LOG_ERROR("maps", "Could not load VMAP name:%s, id:%d, x:%d, y:%d (vmap rep.: x:%d, y:%d)", GetMapName(), GetId(), gx, gy, gx, gy);
break;
case VMAP::VMAP_LOAD_RESULT_IGNORED:
TC_LOG_DEBUG("maps", "Ignored VMAP name:%s, id:%d, x:%d, y:%d (vmap rep.: x:%d, y:%d)", GetMapName(), GetId(), gx, gy, gx, gy);
@@ -173,7 +177,7 @@ void Map::LoadMap(int gx, int gy, bool reload)
//map already load, delete it before reloading (Is it necessary? Do we really need the ability the reload maps during runtime?)
if (GridMaps[gx][gy])
{
- TC_LOG_INFO("maps", "Unloading previously loaded map %u before reloading.", GetId());
+ TC_LOG_DEBUG("maps", "Unloading previously loaded map %u before reloading.", GetId());
sScriptMgr->OnUnloadGridMap(this, GridMaps[gx][gy], gx, gy);
delete (GridMaps[gx][gy]);
@@ -185,7 +189,7 @@ void Map::LoadMap(int gx, int gy, bool reload)
int len = sWorld->GetDataPath().length() + strlen("maps/%03u%02u%02u.map") + 1;
tmp = new char[len];
snprintf(tmp, len, (char *)(sWorld->GetDataPath() + "maps/%03u%02u%02u.map").c_str(), GetId(), gx, gy);
- TC_LOG_INFO("maps", "Loading map %s", tmp);
+ TC_LOG_DEBUG("maps", "Loading map %s", tmp);
// loading data
GridMaps[gx][gy] = new GridMap();
if (!GridMaps[gx][gy]->loadData(tmp))
@@ -2497,7 +2501,7 @@ void Map::UpdateObjectsVisibilityFor(Player* player, Cell cell, CellCoord cellpa
void Map::SendInitSelf(Player* player)
{
- TC_LOG_INFO("maps", "Creating player data for himself %u", player->GetGUIDLow());
+ TC_LOG_DEBUG("maps", "Creating player data for himself %u", player->GetGUIDLow());
UpdateData data;
@@ -2849,7 +2853,7 @@ bool InstanceMap::CanEnter(Player* player)
uint32 maxPlayers = GetMaxPlayers();
if (GetPlayersCountExceptGMs() >= maxPlayers)
{
- TC_LOG_INFO("maps", "MAP: Instance '%u' of map '%s' cannot have more than '%u' players. Player '%s' rejected", GetInstanceId(), GetMapName(), maxPlayers, player->GetName().c_str());
+ TC_LOG_WARN("maps", "MAP: Instance '%u' of map '%s' cannot have more than '%u' players. Player '%s' rejected", GetInstanceId(), GetMapName(), maxPlayers, player->GetName().c_str());
player->SendTransferAborted(GetId(), TRANSFER_ABORT_MAX_PLAYERS);
return false;
}
@@ -2918,7 +2922,7 @@ bool InstanceMap::AddPlayerToMap(Player* player)
InstanceSave* mapSave = sInstanceSaveMgr->GetInstanceSave(GetInstanceId());
if (!mapSave)
{
- TC_LOG_INFO("maps", "InstanceMap::Add: creating instance save for map %d spawnmode %d with instance id %d", GetId(), GetSpawnMode(), GetInstanceId());
+ TC_LOG_DEBUG("maps", "InstanceMap::Add: creating instance save for map %d spawnmode %d with instance id %d", GetId(), GetSpawnMode(), GetInstanceId());
mapSave = sInstanceSaveMgr->AddInstanceSave(GetId(), GetInstanceId(), Difficulty(GetSpawnMode()), 0, true);
}
@@ -2994,7 +2998,7 @@ bool InstanceMap::AddPlayerToMap(Player* player)
// first player enters (no players yet)
SetResetSchedule(false);
- TC_LOG_INFO("maps", "MAP: Player '%s' entered instance '%u' of map '%s'", player->GetName().c_str(), GetInstanceId(), GetMapName());
+ TC_LOG_DEBUG("maps", "MAP: Player '%s' entered instance '%u' of map '%s'", player->GetName().c_str(), GetInstanceId(), GetMapName());
// initialize unload state
m_unloadTimer = 0;
m_resetAfterUnload = false;
@@ -3020,7 +3024,7 @@ void InstanceMap::Update(const uint32 t_diff)
void InstanceMap::RemovePlayerFromMap(Player* player, bool remove)
{
- TC_LOG_INFO("maps", "MAP: Removing player '%s' from instance '%u' of map '%s' before relocating to another map", player->GetName().c_str(), GetInstanceId(), GetMapName());
+ TC_LOG_DEBUG("maps", "MAP: Removing player '%s' from instance '%u' of map '%s' before relocating to another map", player->GetName().c_str(), GetInstanceId(), GetMapName());
//if last player set unload timer
if (!m_unloadTimer && m_mapRefManager.getSize() == 1)
m_unloadTimer = m_unloadWhenEmpty ? MIN_UNLOAD_DELAY : std::max(sWorld->getIntConfig(CONFIG_INSTANCE_UNLOAD_DELAY), (uint32)MIN_UNLOAD_DELAY);
@@ -3253,7 +3257,7 @@ bool BattlegroundMap::AddPlayerToMap(Player* player)
void BattlegroundMap::RemovePlayerFromMap(Player* player, bool remove)
{
- TC_LOG_INFO("maps", "MAP: Removing player '%s' from bg '%u' of map '%s' before relocating to another map", player->GetName().c_str(), GetInstanceId(), GetMapName());
+ TC_LOG_DEBUG("maps", "MAP: Removing player '%s' from bg '%u' of map '%s' before relocating to another map", player->GetName().c_str(), GetInstanceId(), GetMapName());
Map::RemovePlayerFromMap(player, remove);
}
diff --git a/src/server/game/Miscellaneous/Language.h b/src/server/game/Miscellaneous/Language.h
index 8131984224f..9bae8fbdfae 100644
--- a/src/server/game/Miscellaneous/Language.h
+++ b/src/server/game/Miscellaneous/Language.h
@@ -207,7 +207,8 @@ enum TrinityStrings
LANG_LIQUID_STATUS = 175,
LANG_INVALID_GAMEOBJECT_TYPE = 176,
LANG_GAMEOBJECT_DAMAGED = 177,
- // Room for more level 1 178-199 not used
+ LANG_GRID_POSITION = 178,
+ // Room for more level 1 179-199 not used
// level 2 chat
LANG_NO_SELECTION = 200,
diff --git a/src/server/game/Miscellaneous/SharedDefines.h b/src/server/game/Miscellaneous/SharedDefines.h
index 0775a9a299a..685bcd338a9 100644
--- a/src/server/game/Miscellaneous/SharedDefines.h
+++ b/src/server/game/Miscellaneous/SharedDefines.h
@@ -427,7 +427,7 @@ enum SpellAttr4
SPELL_ATTR4_UNK4 = 0x00000010, // 4 This will no longer cause guards to attack on use??
SPELL_ATTR4_UNK5 = 0x00000020, // 5
SPELL_ATTR4_NOT_STEALABLE = 0x00000040, // 6 although such auras might be dispellable, they cannot be stolen
- SPELL_ATTR4_TRIGGERED = 0x00000080, // 7 spells forced to be triggered
+ SPELL_ATTR4_CAN_CAST_WHILE_CASTING = 0x00000080, // 7 Can be cast while another cast is in progress - see CanCastWhileCasting(SpellRec const*,CGUnit_C *,int &)
SPELL_ATTR4_FIXED_DAMAGE = 0x00000100, // 8 Ignores resilience and any (except mechanic related) damage or % damage taken auras on target.
SPELL_ATTR4_TRIGGER_ACTIVATE = 0x00000200, // 9 initially disabled / trigger activate from event (Execute, Riposte, Deep Freeze end other)
SPELL_ATTR4_SPELL_VS_EXTEND_COST = 0x00000400, // 10 Rogue Shiv have this flag
diff --git a/src/server/game/Movement/MotionMaster.cpp b/src/server/game/Movement/MotionMaster.cpp
index 298e534d58e..bda3ad851c8 100644
--- a/src/server/game/Movement/MotionMaster.cpp
+++ b/src/server/game/Movement/MotionMaster.cpp
@@ -387,6 +387,43 @@ void MotionMaster::MoveJump(float x, float y, float z, float speedXY, float spee
Mutate(new EffectMovementGenerator(id), MOTION_SLOT_CONTROLLED);
}
+void MotionMaster::MoveCirclePath(float x, float y, float z, float radius, bool clockwise, uint8 stepCount)
+{
+ float step = 2 * float(M_PI) / stepCount * (clockwise ? -1.0f : 1.0f);
+ Position const& pos = { x, y, z, 0.0f };
+ float angle = pos.GetAngle(_owner->GetPositionX(), _owner->GetPositionY());
+
+ Movement::MoveSplineInit init(_owner);
+
+ for (uint8 i = 0; i < stepCount; angle += step, ++i)
+ {
+ G3D::Vector3 point;
+ point.x = x + radius * cosf(angle);
+ point.y = y + radius * sinf(angle);
+
+ if (_owner->IsFlying())
+ point.z = z;
+ else
+ point.z = _owner->GetMap()->GetHeight(_owner->GetPhaseMask(), point.x, point.y, z);
+
+ init.Path().push_back(point);
+ }
+
+ if (_owner->IsFlying())
+ {
+ init.SetFly();
+ init.SetCyclic();
+ init.SetAnimation(Movement::ToFly);
+ }
+ else
+ {
+ init.SetWalk(true);
+ init.SetCyclic();
+ }
+
+ init.Launch();
+}
+
void MotionMaster::MoveFall(uint32 id /*=0*/)
{
// use larger distance for vmap height search than in most other cases
@@ -647,7 +684,7 @@ void MotionMaster::DirectDelete(_Ty curr)
void MotionMaster::DelayedDelete(_Ty curr)
{
- TC_LOG_FATAL("misc", "Unit (Entry %u) is trying to delete its updating MG (Type %u)!", _owner->GetEntry(), curr->GetMovementGeneratorType());
+ TC_LOG_FATAL("misc", "Unit (Entry %u) is trying to delete its updating Movement Generator (Type %u)!", _owner->GetEntry(), curr->GetMovementGeneratorType());
if (isStatic(curr))
return;
if (!_expList)
diff --git a/src/server/game/Movement/MotionMaster.h b/src/server/game/Movement/MotionMaster.h
index 2821cd5a59b..0b547d96e7f 100644
--- a/src/server/game/Movement/MotionMaster.h
+++ b/src/server/game/Movement/MotionMaster.h
@@ -184,6 +184,7 @@ class MotionMaster //: private std::stack<MovementGenerator *>
void MoveJump(Position const& pos, float speedXY, float speedZ, uint32 id = EVENT_JUMP)
{ MoveJump(pos.m_positionX, pos.m_positionY, pos.m_positionZ, speedXY, speedZ, id); };
void MoveJump(float x, float y, float z, float speedXY, float speedZ, uint32 id = EVENT_JUMP);
+ void MoveCirclePath(float x, float y, float z, float radius, bool clockwise, uint8 stepCount);
void MoveFall(uint32 id = 0);
void MoveSeekAssistance(float x, float y, float z);
diff --git a/src/server/game/Movement/MovementGenerators/WaypointMovementGenerator.cpp b/src/server/game/Movement/MovementGenerators/WaypointMovementGenerator.cpp
index ed1ea7f4b17..a382bf9547e 100755
--- a/src/server/game/Movement/MovementGenerators/WaypointMovementGenerator.cpp
+++ b/src/server/game/Movement/MovementGenerators/WaypointMovementGenerator.cpp
@@ -379,9 +379,9 @@ void FlightPathMovementGenerator::PreloadEndGrid()
// Load the grid
if (endMap)
{
- TC_LOG_INFO("misc", "Preloading rid (%f, %f) for map %u at node index %u/%u", _endGridX, _endGridY, _endMapId, _preloadTargetNode, (uint32)(i_path->size()-1));
+ TC_LOG_DEBUG("misc", "Preloading rid (%f, %f) for map %u at node index %u/%u", _endGridX, _endGridY, _endMapId, _preloadTargetNode, (uint32)(i_path->size()-1));
endMap->LoadGrid(_endGridX, _endGridY);
}
else
- TC_LOG_INFO("misc", "Unable to determine map to preload flightmaster grid");
+ TC_LOG_DEBUG("misc", "Unable to determine map to preload flightmaster grid");
}
diff --git a/src/server/game/Movement/Spline/MoveSpline.cpp b/src/server/game/Movement/Spline/MoveSpline.cpp
index d3fa03c1238..1beeebbbad3 100644
--- a/src/server/game/Movement/Spline/MoveSpline.cpp
+++ b/src/server/game/Movement/Spline/MoveSpline.cpp
@@ -147,7 +147,7 @@ void MoveSpline::init_spline(const MoveSplineInitArgs& args)
/// @todo what to do in such cases? problem is in input data (all points are at same coords)
if (spline.length() < minimal_duration)
{
- TC_LOG_ERROR("misc", "MoveSpline::init_spline: zero length spline, wrong input data?");
+ TC_LOG_DEBUG("misc", "MoveSpline::init_spline: zero length spline, wrong input data?");
spline.set_length(spline.last(), spline.isCyclic() ? 1000 : 1);
}
point_Idx = spline.first();
diff --git a/src/server/game/Reputation/ReputationMgr.cpp b/src/server/game/Reputation/ReputationMgr.cpp
index ad71381a1de..b99cb677ba0 100644
--- a/src/server/game/Reputation/ReputationMgr.cpp
+++ b/src/server/game/Reputation/ReputationMgr.cpp
@@ -297,7 +297,7 @@ bool ReputationMgr::SetReputation(FactionEntry const* factionEntry, int32 standi
{
// bonuses are already given, so just modify standing by rate
int32 spilloverRep = int32(standing * repTemplate->faction_rate[i]);
- SetOneFactionReputation(sFactionStore.LookupEntry(repTemplate->faction[i]), spilloverRep, incremental);
+ SetOneFactionReputation(sFactionStore.AssertEntry(repTemplate->faction[i]), spilloverRep, incremental);
}
}
}
diff --git a/src/server/game/Scripting/ScriptLoader.cpp b/src/server/game/Scripting/ScriptLoader.cpp
index 025184ff6ef..8be5da91c32 100644
--- a/src/server/game/Scripting/ScriptLoader.cpp
+++ b/src/server/game/Scripting/ScriptLoader.cpp
@@ -356,7 +356,6 @@ void AddSC_dustwallow_marsh();
void AddSC_felwood();
void AddSC_feralas();
void AddSC_moonglade();
-void AddSC_mulgore();
void AddSC_orgrimmar();
void AddSC_silithus();
void AddSC_stonetalon_mountains();
@@ -426,7 +425,8 @@ void AddSC_boss_heigan();
void AddSC_boss_gothik();
void AddSC_boss_thaddius();
void AddSC_instance_naxxramas();
-void AddSC_boss_magus_telestra(); //The Nexus Nexus
+void AddSC_boss_nexus_commanders(); // The Nexus Nexus
+void AddSC_boss_magus_telestra();
void AddSC_boss_anomalus();
void AddSC_boss_ormorok();
void AddSC_boss_keristrasza();
@@ -1061,7 +1061,6 @@ void AddKalimdorScripts()
AddSC_felwood();
AddSC_feralas();
AddSC_moonglade();
- AddSC_mulgore();
AddSC_orgrimmar();
AddSC_silithus();
AddSC_stonetalon_mountains();
@@ -1255,7 +1254,8 @@ void AddNorthrendScripts()
AddSC_boss_gothik();
AddSC_boss_thaddius();
AddSC_instance_naxxramas();
- AddSC_boss_magus_telestra(); //The Nexus Nexus
+ AddSC_boss_nexus_commanders(); // The Nexus Nexus
+ AddSC_boss_magus_telestra();
AddSC_boss_anomalus();
AddSC_boss_ormorok();
AddSC_boss_keristrasza();
diff --git a/src/server/game/Scripting/ScriptMgr.cpp b/src/server/game/Scripting/ScriptMgr.cpp
index 628452d120c..aed829a7b57 100644
--- a/src/server/game/Scripting/ScriptMgr.cpp
+++ b/src/server/game/Scripting/ScriptMgr.cpp
@@ -182,9 +182,8 @@ struct TSpellSummary
uint8 Effects; // set of enum SelectEffect
} *SpellSummary;
-ScriptMgr::ScriptMgr() : _scriptCount(0)
+ScriptMgr::ScriptMgr() : _scriptCount(0), _scheduledScripts(0)
{
- _scheduledScripts = 0;
}
ScriptMgr::~ScriptMgr() { }
diff --git a/src/server/game/Scripting/ScriptMgr.h b/src/server/game/Scripting/ScriptMgr.h
index e290b13c635..a226f1b7ed2 100644
--- a/src/server/game/Scripting/ScriptMgr.h
+++ b/src/server/game/Scripting/ScriptMgr.h
@@ -1142,7 +1142,7 @@ class ScriptMgr
uint32 _scriptCount;
//atomic op counter for active scripts amount
- std::atomic_long _scheduledScripts;
+ std::atomic<uint32> _scheduledScripts;
};
#endif
diff --git a/src/server/game/Server/WorldSession.cpp b/src/server/game/Server/WorldSession.cpp
index b6b1a4992af..fa50fd56576 100644
--- a/src/server/game/Server/WorldSession.cpp
+++ b/src/server/game/Server/WorldSession.cpp
@@ -218,8 +218,8 @@ void WorldSession::SendPacket(WorldPacket* packet)
{
uint64 minTime = uint64(cur_time - lastTime);
uint64 fullTime = uint64(lastTime - firstTime);
- TC_LOG_INFO("misc", "Send all time packets count: " UI64FMTD " bytes: " UI64FMTD " avr.count/sec: %f avr.bytes/sec: %f time: %u", sendPacketCount, sendPacketBytes, float(sendPacketCount)/fullTime, float(sendPacketBytes)/fullTime, uint32(fullTime));
- TC_LOG_INFO("misc", "Send last min packets count: " UI64FMTD " bytes: " UI64FMTD " avr.count/sec: %f avr.bytes/sec: %f", sendLastPacketCount, sendLastPacketBytes, float(sendLastPacketCount)/minTime, float(sendLastPacketBytes)/minTime);
+ TC_LOG_DEBUG("misc", "Send all time packets count: " UI64FMTD " bytes: " UI64FMTD " avr.count/sec: %f avr.bytes/sec: %f time: %u", sendPacketCount, sendPacketBytes, float(sendPacketCount)/fullTime, float(sendPacketBytes)/fullTime, uint32(fullTime));
+ TC_LOG_DEBUG("misc", "Send last min packets count: " UI64FMTD " bytes: " UI64FMTD " avr.count/sec: %f avr.bytes/sec: %f", sendLastPacketCount, sendLastPacketBytes, float(sendLastPacketCount)/minTime, float(sendLastPacketBytes)/minTime);
lastTime = cur_time;
sendLastPacketCount = 1;
@@ -981,7 +981,7 @@ void WorldSession::ReadAddonsInfo(WorldPacket &data)
addonInfo >> enabled >> crc >> unk1;
- TC_LOG_INFO("misc", "ADDON: Name: %s, Enabled: 0x%x, CRC: 0x%x, Unknown2: 0x%x", addonName.c_str(), enabled, crc, unk1);
+ TC_LOG_DEBUG("misc", "ADDON: Name: %s, Enabled: 0x%x, CRC: 0x%x, Unknown2: 0x%x", addonName.c_str(), enabled, crc, unk1);
AddonInfo addon(addonName, enabled, crc, 2, true);
@@ -989,15 +989,15 @@ void WorldSession::ReadAddonsInfo(WorldPacket &data)
if (savedAddon)
{
if (addon.CRC != savedAddon->CRC)
- TC_LOG_INFO("misc", "ADDON: %s was known, but didn't match known CRC (0x%x)!", addon.Name.c_str(), savedAddon->CRC);
+ TC_LOG_ERROR("misc", "ADDON: %s was known, but didn't match known CRC (0x%x)!", addon.Name.c_str(), savedAddon->CRC);
else
- TC_LOG_INFO("misc", "ADDON: %s was known, CRC is correct (0x%x)", addon.Name.c_str(), savedAddon->CRC);
+ TC_LOG_DEBUG("misc", "ADDON: %s was known, CRC is correct (0x%x)", addon.Name.c_str(), savedAddon->CRC);
}
else
{
AddonMgr::SaveAddon(addon);
- TC_LOG_INFO("misc", "ADDON: %s (0x%x) was not known, saving...", addon.Name.c_str(), addon.CRC);
+ TC_LOG_DEBUG("misc", "ADDON: %s (0x%x) was not known, saving...", addon.Name.c_str(), addon.CRC);
}
/// @todo Find out when to not use CRC/pubkey, and other possible states.
@@ -1048,7 +1048,7 @@ void WorldSession::SendAddonsInfo()
data << uint8(usepk);
if (usepk) // if CRC is wrong, add public key (client need it)
{
- TC_LOG_INFO("misc", "ADDON: CRC (0x%x) for addon %s is wrong (does not match expected 0x%x), sending pubkey",
+ TC_LOG_DEBUG("misc", "ADDON: CRC (0x%x) for addon %s is wrong (does not match expected 0x%x), sending pubkey",
itr->CRC, itr->Name.c_str(), STANDARD_ADDON_CRC);
data.append(addonPublicKey, sizeof(addonPublicKey));
@@ -1262,7 +1262,7 @@ bool WorldSession::DosProtection::EvaluateOpcode(WorldPacket& p, time_t time) co
return true;
case POLICY_KICK:
{
- TC_LOG_INFO("network", "AntiDOS: Player kicked!");
+ TC_LOG_WARN("network", "AntiDOS: Player kicked!");
Session->KickPlayer();
return false;
}
@@ -1278,7 +1278,7 @@ bool WorldSession::DosProtection::EvaluateOpcode(WorldPacket& p, time_t time) co
case BAN_IP: nameOrIp = Session->GetRemoteAddress(); break;
}
sWorld->BanAccount(bm, nameOrIp, duration, "DOS (Packet Flooding/Spoofing", "Server: AutoDOS");
- TC_LOG_INFO("network", "AntiDOS: Player automatically banned for %u seconds.", duration);
+ TC_LOG_WARN("network", "AntiDOS: Player automatically banned for %u seconds.", duration);
Session->KickPlayer();
return false;
}
diff --git a/src/server/game/Server/WorldSocket.cpp b/src/server/game/Server/WorldSocket.cpp
index 5b1d9497953..0bb864de0ed 100644
--- a/src/server/game/Server/WorldSocket.cpp
+++ b/src/server/game/Server/WorldSocket.cpp
@@ -146,14 +146,12 @@ bool WorldSocket::ReadDataHandler()
uint16 opcode = uint16(header->cmd);
- std::string opcodeName = GetOpcodeNameForLogging(opcode);
-
WorldPacket packet(opcode, std::move(_packetBuffer));
if (sPacketLog->CanLogPacket())
sPacketLog->LogPacket(packet, CLIENT_TO_SERVER, GetRemoteIpAddress(), GetRemotePort());
- TC_LOG_TRACE("network.opcode", "C->S: %s %s", (_worldSession ? _worldSession->GetPlayerInfo() : GetRemoteIpAddress().to_string()).c_str(), opcodeName.c_str());
+ TC_LOG_TRACE("network.opcode", "C->S: %s %s", (_worldSession ? _worldSession->GetPlayerInfo() : GetRemoteIpAddress().to_string()).c_str(), GetOpcodeNameForLogging(opcode).c_str());
switch (opcode)
{
@@ -170,7 +168,7 @@ bool WorldSocket::ReadDataHandler()
HandleAuthSession(packet);
break;
case CMSG_KEEP_ALIVE:
- TC_LOG_DEBUG("network", "%s", opcodeName.c_str());
+ TC_LOG_DEBUG("network", "%s", GetOpcodeNameForLogging(opcode).c_str());
sScriptMgr->OnPacketReceive(_worldSession, packet);
break;
default:
@@ -257,7 +255,7 @@ void WorldSocket::HandleAuthSession(WorldPacket& recvPacket)
recvPacket >> unk4;
recvPacket.read(digest, 20);
- TC_LOG_INFO("network", "WorldSocket::HandleAuthSession: client %u, serverId %u, account %s, loginServerType %u, clientseed %u, realmIndex %u",
+ TC_LOG_DEBUG("network", "WorldSocket::HandleAuthSession: client %u, serverId %u, account %s, loginServerType %u, clientseed %u, realmIndex %u",
clientBuild,
serverId,
account.c_str(),
@@ -429,7 +427,7 @@ void WorldSocket::HandleAuthSession(WorldPacket& recvPacket)
if (allowedAccountType > SEC_PLAYER && AccountTypes(security) < allowedAccountType)
{
SendAuthResponseError(AUTH_UNAVAILABLE);
- TC_LOG_INFO("network", "WorldSocket::HandleAuthSession: User tries to login but his security level is not enough");
+ TC_LOG_DEBUG("network", "WorldSocket::HandleAuthSession: User tries to login but his security level is not enough");
sScriptMgr->OnFailedAccountLogin(id);
DelayedCloseSocket();
return;
diff --git a/src/server/game/Server/WorldSocketMgr.cpp b/src/server/game/Server/WorldSocketMgr.cpp
index 947bd62860c..e83d39cb922 100644
--- a/src/server/game/Server/WorldSocketMgr.cpp
+++ b/src/server/game/Server/WorldSocketMgr.cpp
@@ -46,6 +46,8 @@ WorldSocketMgr::WorldSocketMgr() : BaseSocketMgr(), _socketSendBufferSize(-1), m
{
}
+int const boost::asio::socket_base::max_connections;
+
bool WorldSocketMgr::StartNetwork(boost::asio::io_service& service, std::string const& bindIp, uint16 port)
{
_tcpNoDelay = sConfigMgr->GetBoolDefault("Network.TcpNodelay", true);
diff --git a/src/server/game/Spells/Auras/SpellAuraEffects.cpp b/src/server/game/Spells/Auras/SpellAuraEffects.cpp
index e5b8cd111bc..5366326a022 100644
--- a/src/server/game/Spells/Auras/SpellAuraEffects.cpp
+++ b/src/server/game/Spells/Auras/SpellAuraEffects.cpp
@@ -542,11 +542,11 @@ void AuraEffect::CalculatePeriodic(Unit* caster, bool create, bool load)
// Haste modifies periodic time of channeled spells
if (m_spellInfo->IsChanneled())
{
- if (m_spellInfo->AttributesEx5 & SPELL_ATTR5_HASTE_AFFECT_DURATION)
+ if (m_spellInfo->HasAttribute(SPELL_ATTR5_HASTE_AFFECT_DURATION))
caster->ModSpellCastTime(m_spellInfo, m_amplitude);
}
// and periodic time of auras affected by SPELL_AURA_PERIODIC_HASTE
- else if (caster->HasAuraTypeWithAffectMask(SPELL_AURA_PERIODIC_HASTE, m_spellInfo) || m_spellInfo->AttributesEx5 & SPELL_ATTR5_HASTE_AFFECT_DURATION)
+ else if (caster->HasAuraTypeWithAffectMask(SPELL_AURA_PERIODIC_HASTE, m_spellInfo) || m_spellInfo->HasAttribute(SPELL_ATTR5_HASTE_AFFECT_DURATION))
m_amplitude = int32(m_amplitude * caster->GetFloatValue(UNIT_MOD_CAST_SPEED));
}
}
@@ -555,7 +555,7 @@ void AuraEffect::CalculatePeriodic(Unit* caster, bool create, bool load)
{
m_tickNumber = m_amplitude ? GetBase()->GetDuration() / m_amplitude : 0;
m_periodicTimer = m_amplitude ? GetBase()->GetDuration() % m_amplitude : 0;
- if (m_spellInfo->AttributesEx5 & SPELL_ATTR5_START_PERIODIC_AT_APPLY)
+ if (m_spellInfo->HasAttribute(SPELL_ATTR5_START_PERIODIC_AT_APPLY))
++m_tickNumber;
}
else // aura just created or reapplied
@@ -571,7 +571,7 @@ void AuraEffect::CalculatePeriodic(Unit* caster, bool create, bool load)
{
m_periodicTimer = 0;
// Start periodic on next tick or at aura apply
- if (m_amplitude && !(m_spellInfo->AttributesEx5 & SPELL_ATTR5_START_PERIODIC_AT_APPLY))
+ if (m_amplitude && !m_spellInfo->HasAttribute(SPELL_ATTR5_START_PERIODIC_AT_APPLY))
m_periodicTimer += m_amplitude;
}
}
@@ -1133,7 +1133,7 @@ void AuraEffect::HandleShapeshiftBoosts(Unit* target, bool apply) const
continue;
SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(itr->first);
- if (!spellInfo || !(spellInfo->Attributes & (SPELL_ATTR0_PASSIVE | SPELL_ATTR0_HIDDEN_CLIENTSIDE)))
+ if (!spellInfo || !(spellInfo->HasAttribute(SPELL_ATTR0_PASSIVE) || spellInfo->HasAttribute(SPELL_ATTR0_HIDDEN_CLIENTSIDE)))
continue;
if (spellInfo->Stances & (1<<(GetMiscValue()-1)))
@@ -1148,7 +1148,7 @@ void AuraEffect::HandleShapeshiftBoosts(Unit* target, bool apply) const
if (GlyphPropertiesEntry const* glyph = sGlyphPropertiesStore.LookupEntry(glyphId))
{
SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(glyph->SpellId);
- if (!spellInfo || !(spellInfo->Attributes & (SPELL_ATTR0_PASSIVE | SPELL_ATTR0_HIDDEN_CLIENTSIDE)))
+ if (!spellInfo || !(spellInfo->HasAttribute(SPELL_ATTR0_PASSIVE) || spellInfo->HasAttribute(SPELL_ATTR0_HIDDEN_CLIENTSIDE)))
continue;
if (spellInfo->Stances & (1<<(GetMiscValue()-1)))
target->CastSpell(target, glyph->SpellId, true, NULL, this);
@@ -3243,7 +3243,7 @@ void AuraEffect::HandleModStateImmunityMask(AuraApplication const* aurApp, uint8
for (std::list <AuraType>::iterator iter = aura_immunity_list.begin(); iter != aura_immunity_list.end(); ++iter)
target->ApplySpellImmune(GetId(), IMMUNITY_STATE, *iter, apply);
- if (apply && GetSpellInfo()->AttributesEx & SPELL_ATTR1_DISPEL_AURAS_ON_IMMUNITY)
+ if (apply && GetSpellInfo()->HasAttribute(SPELL_ATTR1_DISPEL_AURAS_ON_IMMUNITY))
{
target->RemoveAurasWithMechanic(mechanic_immunity_list, AURA_REMOVE_BY_DEFAULT, GetId());
for (std::list <AuraType>::iterator iter = aura_immunity_list.begin(); iter != aura_immunity_list.end(); ++iter)
@@ -3300,7 +3300,7 @@ void AuraEffect::HandleModMechanicImmunity(AuraApplication const* aurApp, uint8
break;
}
- if (apply && GetSpellInfo()->AttributesEx & SPELL_ATTR1_DISPEL_AURAS_ON_IMMUNITY)
+ if (apply && GetSpellInfo()->HasAttribute(SPELL_ATTR1_DISPEL_AURAS_ON_IMMUNITY))
target->RemoveAurasWithMechanic(mechanic, AURA_REMOVE_BY_DEFAULT, GetId());
}
@@ -3336,7 +3336,7 @@ void AuraEffect::HandleAuraModStateImmunity(AuraApplication const* aurApp, uint8
target->ApplySpellImmune(GetId(), IMMUNITY_STATE, GetMiscValue(), apply);
- if (apply && GetSpellInfo()->AttributesEx & SPELL_ATTR1_DISPEL_AURAS_ON_IMMUNITY)
+ if (apply && GetSpellInfo()->HasAttribute(SPELL_ATTR1_DISPEL_AURAS_ON_IMMUNITY))
target->RemoveAurasByType(AuraType(GetMiscValue()), ObjectGuid::Empty, GetBase());
}
@@ -3372,13 +3372,13 @@ void AuraEffect::HandleAuraModSchoolImmunity(AuraApplication const* aurApp, uint
target->RemoveAurasWithInterruptFlags(AURA_INTERRUPT_FLAG_IMMUNE_OR_LOST_SELECTION);
// remove all flag auras (they are positive, but they must be removed when you are immune)
- if (GetSpellInfo()->AttributesEx & SPELL_ATTR1_DISPEL_AURAS_ON_IMMUNITY
- && GetSpellInfo()->AttributesEx2 & SPELL_ATTR2_DAMAGE_REDUCED_SHIELD)
+ if (GetSpellInfo()->HasAttribute(SPELL_ATTR1_DISPEL_AURAS_ON_IMMUNITY)
+ && GetSpellInfo()->HasAttribute(SPELL_ATTR2_DAMAGE_REDUCED_SHIELD))
target->RemoveAurasWithInterruptFlags(AURA_INTERRUPT_FLAG_IMMUNE_OR_LOST_SELECTION);
/// @todo optimalize this cycle - use RemoveAurasWithInterruptFlags call or something else
if ((apply)
- && GetSpellInfo()->AttributesEx & SPELL_ATTR1_DISPEL_AURAS_ON_IMMUNITY
+ && GetSpellInfo()->HasAttribute(SPELL_ATTR1_DISPEL_AURAS_ON_IMMUNITY)
&& GetSpellInfo()->IsPositive()) //Only positive immunity removes auras
{
uint32 school_mask = GetMiscValue();
@@ -3759,7 +3759,7 @@ void AuraEffect::HandleModTotalPercentStat(AuraApplication const* aurApp, uint8
// recalculate current HP/MP after applying aura modifications (only for spells with SPELL_ATTR0_UNK4 0x00000010 flag)
// this check is total bullshit i think
- if (GetMiscValue() == STAT_STAMINA && (m_spellInfo->Attributes & SPELL_ATTR0_ABILITY))
+ if (GetMiscValue() == STAT_STAMINA && m_spellInfo->HasAttribute(SPELL_ATTR0_ABILITY))
target->SetHealth(std::max<uint32>(uint32(healthPct * target->GetMaxHealth() * 0.01f), (alive ? 1 : 0)));
}
@@ -5901,7 +5901,7 @@ void AuraEffect::HandlePeriodicDamageAurasTick(Unit* target, Unit* caster) const
else
damage = uint32(target->CountPctFromMaxHealth(damage));
- if (!(m_spellInfo->AttributesEx4 & SPELL_ATTR4_FIXED_DAMAGE))
+ if (!m_spellInfo->HasAttribute(SPELL_ATTR4_FIXED_DAMAGE))
if (m_spellInfo->Effects[m_effIndex].IsTargetingArea() || isAreaAura)
{
damage = int32(float(damage) * target->GetTotalAuraMultiplierByMiscMask(SPELL_AURA_MOD_AOE_DAMAGE_AVOIDANCE, m_spellInfo->SchoolMask));
@@ -5918,13 +5918,13 @@ void AuraEffect::HandlePeriodicDamageAurasTick(Unit* target, Unit* caster) const
damage = caster->SpellCriticalDamageBonus(m_spellInfo, damage, target);
int32 dmg = damage;
- if (!(GetSpellInfo()->AttributesEx4 & SPELL_ATTR4_FIXED_DAMAGE))
+ if (!GetSpellInfo()->HasAttribute(SPELL_ATTR4_FIXED_DAMAGE))
caster->ApplyResilience(target, NULL, &dmg, crit, CR_CRIT_TAKEN_SPELL);
damage = dmg;
caster->CalcAbsorbResist(target, GetSpellInfo()->GetSchoolMask(), DOT, damage, &absorb, &resist, GetSpellInfo());
- TC_LOG_INFO("spells", "PeriodicTick: %s attacked %s for %u dmg inflicted by %u absorb is %u",
+ TC_LOG_DEBUG("spells.periodic", "PeriodicTick: %s attacked %s for %u dmg inflicted by %u absorb is %u",
GetCasterGUID().ToString().c_str(), target->GetGUID().ToString().c_str(), damage, GetId(), absorb);
caster->DealDamageMods(target, damage, &absorb);
@@ -5979,7 +5979,7 @@ void AuraEffect::HandlePeriodicHealthLeechAuraTick(Unit* target, Unit* caster) c
damage = caster->SpellDamageBonusDone(target, GetSpellInfo(), damage, DOT, GetBase()->GetStackAmount()) * caster->SpellDamagePctDone(target, m_spellInfo, DOT);
else
damage = std::max(int32(damage * GetDonePct()), 0);
-
+
damage = target->SpellDamageBonusTaken(caster, GetSpellInfo(), damage, DOT, GetBase()->GetStackAmount());
// Calculate armor mitigation
@@ -5990,7 +5990,7 @@ void AuraEffect::HandlePeriodicHealthLeechAuraTick(Unit* target, Unit* caster) c
damage = damageReductedArmor;
}
- if (!(m_spellInfo->AttributesEx4 & SPELL_ATTR4_FIXED_DAMAGE))
+ if (!m_spellInfo->HasAttribute(SPELL_ATTR4_FIXED_DAMAGE))
if (m_spellInfo->Effects[m_effIndex].IsTargetingArea() || isAreaAura)
{
damage = uint32(float(damage) * target->GetTotalAuraMultiplierByMiscMask(SPELL_AURA_MOD_AOE_DAMAGE_AVOIDANCE, m_spellInfo->SchoolMask));
@@ -6007,7 +6007,7 @@ void AuraEffect::HandlePeriodicHealthLeechAuraTick(Unit* target, Unit* caster) c
damage = caster->SpellCriticalDamageBonus(m_spellInfo, damage, target);
int32 dmg = damage;
- if (!(GetSpellInfo()->AttributesEx4 & SPELL_ATTR4_FIXED_DAMAGE))
+ if (!GetSpellInfo()->HasAttribute(SPELL_ATTR4_FIXED_DAMAGE))
caster->ApplyResilience(target, NULL, &dmg, crit, CR_CRIT_TAKEN_SPELL);
damage = dmg;
@@ -6016,7 +6016,7 @@ void AuraEffect::HandlePeriodicHealthLeechAuraTick(Unit* target, Unit* caster) c
if (target->GetHealth() < damage)
damage = uint32(target->GetHealth());
- TC_LOG_INFO("spells", "PeriodicTick: %s health leech of %s for %u dmg inflicted by %u abs is %u",
+ TC_LOG_DEBUG("spells.periodic", "PeriodicTick: %s health leech of %s for %u dmg inflicted by %u abs is %u",
GetCasterGUID().ToString().c_str(), target->GetGUID().ToString().c_str(), damage, GetId(), absorb);
caster->SendSpellNonMeleeDamageLog(target, GetId(), damage, GetSpellInfo()->GetSchoolMask(), absorb, resist, false, 0, crit);
@@ -6083,7 +6083,7 @@ void AuraEffect::HandlePeriodicHealAurasTick(Unit* target, Unit* caster) const
}
// heal for caster damage (must be alive)
- if (target != caster && GetSpellInfo()->AttributesEx2 & SPELL_ATTR2_HEALTH_FUNNEL && !caster->IsAlive())
+ if (target != caster && GetSpellInfo()->HasAttribute(SPELL_ATTR2_HEALTH_FUNNEL) && !caster->IsAlive())
return;
// don't regen when permanent aura target has full power
@@ -6160,7 +6160,7 @@ void AuraEffect::HandlePeriodicHealAurasTick(Unit* target, Unit* caster) const
if (crit)
damage = caster->SpellCriticalHealingBonus(m_spellInfo, damage, target);
- TC_LOG_INFO("spells", "PeriodicTick: %s heal of %s for %u health inflicted by %u",
+ TC_LOG_DEBUG("spells.periodic", "PeriodicTick: %s heal of %s for %u health inflicted by %u",
GetCasterGUID().ToString().c_str(), target->GetGUID().ToString().c_str(), damage, GetId());
uint32 absorb = 0;
@@ -6177,7 +6177,7 @@ void AuraEffect::HandlePeriodicHealAurasTick(Unit* target, Unit* caster) const
// Health Funnel
// damage caster for heal amount
- if (target != caster && GetSpellInfo()->AttributesEx2 & SPELL_ATTR2_HEALTH_FUNNEL)
+ if (target != caster && GetSpellInfo()->HasAttribute(SPELL_ATTR2_HEALTH_FUNNEL))
{
uint32 funnelDamage = GetSpellInfo()->ManaPerSecond; // damage is not affected by spell power
@@ -6231,7 +6231,7 @@ void AuraEffect::HandlePeriodicManaLeechAuraTick(Unit* target, Unit* caster) con
drainAmount = maxmana;
}
- TC_LOG_INFO("spells", "PeriodicTick: %s power leech of %s for %u dmg inflicted by %u",
+ TC_LOG_DEBUG("spells.periodic", "PeriodicTick: %s power leech of %s for %u dmg inflicted by %u",
GetCasterGUID().ToString().c_str(), target->GetGUID().ToString().c_str(), drainAmount, GetId());
// resilience reduce mana draining effect at spell crit damage reduction (added in 2.4)
@@ -6292,7 +6292,7 @@ void AuraEffect::HandleObsModPowerAuraTick(Unit* target, Unit* caster) const
// ignore negative values (can be result apply spellmods to aura damage
uint32 amount = std::max(m_amount, 0) * target->GetMaxPower(powerType) /100;
- TC_LOG_INFO("spells", "PeriodicTick: %s energize %s for %u dmg inflicted by %u",
+ TC_LOG_DEBUG("spells.periodic", "PeriodicTick: %s energize %s for %u dmg inflicted by %u",
GetCasterGUID().ToString().c_str(), target->GetGUID().ToString().c_str(), amount, GetId());
SpellPeriodicAuraLogInfo pInfo(this, amount, 0, 0, 0, 0.0f, false);
@@ -6308,7 +6308,7 @@ void AuraEffect::HandlePeriodicEnergizeAuraTick(Unit* target, Unit* caster) cons
{
Powers powerType = Powers(GetMiscValue());
- if (target->GetTypeId() == TYPEID_PLAYER && target->getPowerType() != powerType && !(m_spellInfo->AttributesEx7 & SPELL_ATTR7_CAN_RESTORE_SECONDARY_POWER))
+ if (target->GetTypeId() == TYPEID_PLAYER && target->getPowerType() != powerType && !m_spellInfo->HasAttribute(SPELL_ATTR7_CAN_RESTORE_SECONDARY_POWER))
return;
if (!target->IsAlive() || !target->GetMaxPower(powerType))
@@ -6330,7 +6330,7 @@ void AuraEffect::HandlePeriodicEnergizeAuraTick(Unit* target, Unit* caster) cons
SpellPeriodicAuraLogInfo pInfo(this, amount, 0, 0, 0, 0.0f, false);
target->SendPeriodicAuraLog(&pInfo);
- TC_LOG_INFO("spells", "PeriodicTick: %s energize %s for %u dmg inflicted by %u",
+ TC_LOG_DEBUG("spells.periodic", "PeriodicTick: %s energize %s for %u dmg inflicted by %u",
GetCasterGUID().ToString().c_str(), target->GetGUID().ToString().c_str(), amount, GetId());
int32 gain = target->ModifyPower(powerType, amount);
diff --git a/src/server/game/Spells/Auras/SpellAuras.cpp b/src/server/game/Spells/Auras/SpellAuras.cpp
index 93a4c96b92f..0ba059b1952 100644
--- a/src/server/game/Spells/Auras/SpellAuras.cpp
+++ b/src/server/game/Spells/Auras/SpellAuras.cpp
@@ -191,7 +191,7 @@ void AuraApplication::BuildUpdatePacket(ByteBuffer& data, bool remove) const
Aura const* aura = GetBase();
data << uint32(aura->GetId());
uint32 flags = _flags;
- if (aura->GetMaxDuration() > 0 && !(aura->GetSpellInfo()->AttributesEx5 & SPELL_ATTR5_HIDE_DURATION))
+ if (aura->GetMaxDuration() > 0 && !aura->GetSpellInfo()->HasAttribute(SPELL_ATTR5_HIDE_DURATION))
flags |= AFLAG_DURATION;
data << uint8(flags);
data << uint8(aura->GetCasterLevel());
@@ -749,12 +749,13 @@ void Aura::SetDuration(int32 duration, bool withMods)
void Aura::RefreshDuration(bool withMods)
{
- if (withMods)
+ Unit* caster = GetCaster();
+ if (withMods && caster)
{
int32 duration = m_spellInfo->GetMaxDuration();
// Calculate duration of periodics affected by haste.
- if (GetCaster()->HasAuraTypeWithAffectMask(SPELL_AURA_PERIODIC_HASTE, m_spellInfo) || m_spellInfo->AttributesEx5 & SPELL_ATTR5_HASTE_AFFECT_DURATION)
- duration = int32(duration * GetCaster()->GetFloatValue(UNIT_MOD_CAST_SPEED));
+ if (caster->HasAuraTypeWithAffectMask(SPELL_AURA_PERIODIC_HASTE, m_spellInfo) || m_spellInfo->HasAttribute(SPELL_ATTR5_HASTE_AFFECT_DURATION))
+ duration = int32(duration * caster->GetFloatValue(UNIT_MOD_CAST_SPEED));
SetMaxDuration(duration);
SetDuration(duration);
@@ -1813,7 +1814,7 @@ bool Aura::CanStackWith(Aura const* existingAura) const
if (existingAura->GetSpellInfo()->IsChanneled())
return true;
- if (m_spellInfo->AttributesEx3 & SPELL_ATTR3_STACK_FOR_DIFF_CASTERS)
+ if (m_spellInfo->HasAttribute(SPELL_ATTR3_STACK_FOR_DIFF_CASTERS))
return true;
// check same periodic auras
@@ -1865,7 +1866,7 @@ bool Aura::CanStackWith(Aura const* existingAura) const
if (m_spellInfo->IsMultiSlotAura() && !IsArea())
return true;
if (GetCastItemGUID() && existingAura->GetCastItemGUID())
- if (GetCastItemGUID() != existingAura->GetCastItemGUID() && (m_spellInfo->AttributesCu & SPELL_ATTR0_CU_ENCHANT_PROC))
+ if (GetCastItemGUID() != existingAura->GetCastItemGUID() && m_spellInfo->HasAttribute(SPELL_ATTR0_CU_ENCHANT_PROC))
return true;
// same spell with same caster should not stack
return false;
diff --git a/src/server/game/Spells/Auras/SpellAuras.h b/src/server/game/Spells/Auras/SpellAuras.h
index ac45461b333..6abcd578411 100644
--- a/src/server/game/Spells/Auras/SpellAuras.h
+++ b/src/server/game/Spells/Auras/SpellAuras.h
@@ -161,8 +161,8 @@ class Aura
{
return GetCasterGUID() == target->GetGUID()
&& m_spellInfo->Stances
- && !(m_spellInfo->AttributesEx2 & SPELL_ATTR2_NOT_NEED_SHAPESHIFT)
- && !(m_spellInfo->Attributes & SPELL_ATTR0_NOT_SHAPESHIFT);
+ && !m_spellInfo->HasAttribute(SPELL_ATTR2_NOT_NEED_SHAPESHIFT)
+ && !m_spellInfo->HasAttribute(SPELL_ATTR0_NOT_SHAPESHIFT);
}
bool CanBeSaved() const;
diff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp
index 8e415b06745..c31386cd496 100644
--- a/src/server/game/Spells/Spell.cpp
+++ b/src/server/game/Spells/Spell.cpp
@@ -482,23 +482,23 @@ void SpellCastTargets::Update(Unit* caster)
void SpellCastTargets::OutDebug() const
{
if (!m_targetMask)
- TC_LOG_INFO("spells", "No targets");
+ TC_LOG_DEBUG("spells", "No targets");
- TC_LOG_INFO("spells", "target mask: %u", m_targetMask);
+ TC_LOG_DEBUG("spells", "target mask: %u", m_targetMask);
if (m_targetMask & (TARGET_FLAG_UNIT_MASK | TARGET_FLAG_CORPSE_MASK | TARGET_FLAG_GAMEOBJECT_MASK))
- TC_LOG_INFO("spells", "Object target: %s", m_objectTargetGUID.ToString().c_str());
+ TC_LOG_DEBUG("spells", "Object target: %s", m_objectTargetGUID.ToString().c_str());
if (m_targetMask & TARGET_FLAG_ITEM)
- TC_LOG_INFO("spells", "Item target: %s", m_itemTargetGUID.ToString().c_str());
+ TC_LOG_DEBUG("spells", "Item target: %s", m_itemTargetGUID.ToString().c_str());
if (m_targetMask & TARGET_FLAG_TRADE_ITEM)
- TC_LOG_INFO("spells", "Trade item target: %s", m_itemTargetGUID.ToString().c_str());
+ TC_LOG_DEBUG("spells", "Trade item target: %s", m_itemTargetGUID.ToString().c_str());
if (m_targetMask & TARGET_FLAG_SOURCE_LOCATION)
- TC_LOG_INFO("spells", "Source location: transport guid:%s trans offset: %s position: %s", m_src._transportGUID.ToString().c_str(), m_src._transportOffset.ToString().c_str(), m_src._position.ToString().c_str());
+ TC_LOG_DEBUG("spells", "Source location: transport guid:%s trans offset: %s position: %s", m_src._transportGUID.ToString().c_str(), m_src._transportOffset.ToString().c_str(), m_src._position.ToString().c_str());
if (m_targetMask & TARGET_FLAG_DEST_LOCATION)
- TC_LOG_INFO("spells", "Destination location: transport guid:%s trans offset: %s position: %s", m_dst._transportGUID.ToString().c_str(), m_dst._transportOffset.ToString().c_str(), m_dst._position.ToString().c_str());
+ TC_LOG_DEBUG("spells", "Destination location: transport guid:%s trans offset: %s position: %s", m_dst._transportGUID.ToString().c_str(), m_dst._transportOffset.ToString().c_str(), m_dst._position.ToString().c_str());
if (m_targetMask & TARGET_FLAG_STRING)
- TC_LOG_INFO("spells", "String: %s", m_strTarget.c_str());
- TC_LOG_INFO("spells", "speed: %f", m_speed);
- TC_LOG_INFO("spells", "elevation: %f", m_elevation);
+ TC_LOG_DEBUG("spells", "String: %s", m_strTarget.c_str());
+ TC_LOG_DEBUG("spells", "speed: %f", m_speed);
+ TC_LOG_DEBUG("spells", "elevation: %f", m_elevation);
}
SpellValue::SpellValue(SpellInfo const* proto)
@@ -512,7 +512,7 @@ SpellValue::SpellValue(SpellInfo const* proto)
Spell::Spell(Unit* caster, SpellInfo const* info, TriggerCastFlags triggerFlags, ObjectGuid originalCasterGUID, bool skipCheck) :
m_spellInfo(sSpellMgr->GetSpellForDifficultyFromSpell(info, caster)),
-m_caster((info->AttributesEx6 & SPELL_ATTR6_CAST_BY_CHARMER && caster->GetCharmerOrOwner()) ? caster->GetCharmerOrOwner() : caster)
+m_caster((info->HasAttribute(SPELL_ATTR6_CAST_BY_CHARMER) && caster->GetCharmerOrOwner()) ? caster->GetCharmerOrOwner() : caster)
, m_spellValue(new SpellValue(m_spellInfo)), m_preGeneratedPath(PathGenerator(m_caster))
{
m_customError = SPELL_CUSTOM_ERROR_NONE;
@@ -533,7 +533,7 @@ m_caster((info->AttributesEx6 & SPELL_ATTR6_CAST_BY_CHARMER && caster->GetCharme
switch (m_spellInfo->DmgClass)
{
case SPELL_DAMAGE_CLASS_MELEE:
- if (m_spellInfo->AttributesEx3 & SPELL_ATTR3_REQ_OFFHAND)
+ if (m_spellInfo->HasAttribute(SPELL_ATTR3_REQ_OFFHAND))
m_attackType = OFF_ATTACK;
else
m_attackType = BASE_ATTACK;
@@ -543,7 +543,7 @@ m_caster((info->AttributesEx6 & SPELL_ATTR6_CAST_BY_CHARMER && caster->GetCharme
break;
default:
// Wands
- if (m_spellInfo->AttributesEx2 & SPELL_ATTR2_AUTOREPEAT_FLAG)
+ if (m_spellInfo->HasAttribute(SPELL_ATTR2_AUTOREPEAT_FLAG))
m_attackType = RANGED_ATTACK;
else
m_attackType = BASE_ATTACK;
@@ -574,8 +574,8 @@ m_caster((info->AttributesEx6 & SPELL_ATTR6_CAST_BY_CHARMER && caster->GetCharme
m_spellState = SPELL_STATE_NULL;
_triggeredCastFlags = triggerFlags;
- if (info->AttributesEx4 & SPELL_ATTR4_TRIGGERED)
- _triggeredCastFlags = TriggerCastFlags(TRIGGERED_FULL_MASK & ~TRIGGERED_IGNORE_EQUIPPED_ITEM_REQUIREMENT);
+ if (info->HasAttribute(SPELL_ATTR4_CAN_CAST_WHILE_CASTING))
+ _triggeredCastFlags = TriggerCastFlags(uint32(_triggeredCastFlags) | TRIGGERED_IGNORE_CAST_IN_PROGRESS | TRIGGERED_CAST_DIRECTLY);
m_CastItem = NULL;
m_castItemGUID.Clear();
@@ -615,8 +615,8 @@ m_caster((info->AttributesEx6 & SPELL_ATTR6_CAST_BY_CHARMER && caster->GetCharme
// Determine if spell can be reflected back to the caster
// Patch 1.2 notes: Spell Reflection no longer reflects abilities
- m_canReflect = m_spellInfo->DmgClass == SPELL_DAMAGE_CLASS_MAGIC && !(m_spellInfo->Attributes & SPELL_ATTR0_ABILITY)
- && !(m_spellInfo->AttributesEx & SPELL_ATTR1_CANT_BE_REFLECTED) && !(m_spellInfo->Attributes & SPELL_ATTR0_UNAFFECTED_BY_INVULNERABILITY)
+ m_canReflect = m_spellInfo->DmgClass == SPELL_DAMAGE_CLASS_MAGIC && !m_spellInfo->HasAttribute(SPELL_ATTR0_ABILITY)
+ && !m_spellInfo->HasAttribute(SPELL_ATTR1_CANT_BE_REFLECTED) && !m_spellInfo->HasAttribute(SPELL_ATTR0_UNAFFECTED_BY_INVULNERABILITY)
&& !m_spellInfo->IsPassive() && !m_spellInfo->IsPositive();
CleanupTargetList();
@@ -1749,11 +1749,11 @@ uint32 Spell::GetSearcherTypeMask(SpellTargetObjectTypes objType, ConditionList*
default:
break;
}
- if (!(m_spellInfo->AttributesEx2 & SPELL_ATTR2_CAN_TARGET_DEAD))
+ if (!m_spellInfo->HasAttribute(SPELL_ATTR2_CAN_TARGET_DEAD))
retMask &= ~GRID_MAP_TYPE_MASK_CORPSE;
- if (m_spellInfo->AttributesEx3 & SPELL_ATTR3_ONLY_TARGET_PLAYERS)
+ if (m_spellInfo->HasAttribute(SPELL_ATTR3_ONLY_TARGET_PLAYERS))
retMask &= GRID_MAP_TYPE_MASK_CORPSE | GRID_MAP_TYPE_MASK_PLAYER;
- if (m_spellInfo->AttributesEx3 & SPELL_ATTR3_ONLY_TARGET_GHOSTS)
+ if (m_spellInfo->HasAttribute(SPELL_ATTR3_ONLY_TARGET_GHOSTS))
retMask &= GRID_MAP_TYPE_MASK_PLAYER;
if (condList)
@@ -1843,7 +1843,7 @@ void Spell::SearchChainTargets(std::list<WorldObject*>& targets, uint32 chainTar
}
// chain lightning/heal spells and similar - allow to jump at larger distance and go out of los
- bool isBouncingFar = (m_spellInfo->AttributesEx4 & SPELL_ATTR4_AREA_TARGET_CHAIN
+ bool isBouncingFar = (m_spellInfo->HasAttribute(SPELL_ATTR4_AREA_TARGET_CHAIN)
|| m_spellInfo->DmgClass == SPELL_DAMAGE_CLASS_NONE
|| m_spellInfo->DmgClass == SPELL_DAMAGE_CLASS_MAGIC);
@@ -1944,7 +1944,7 @@ void Spell::prepareDataForTriggerSystem(AuraEffect const* /*triggeredByAura*/)
break;
case SPELL_DAMAGE_CLASS_RANGED:
// Auto attack
- if (m_spellInfo->AttributesEx2 & SPELL_ATTR2_AUTOREPEAT_FLAG)
+ if (m_spellInfo->HasAttribute(SPELL_ATTR2_AUTOREPEAT_FLAG))
{
m_procAttacker = PROC_FLAG_DONE_RANGED_AUTO_ATTACK;
m_procVictim = PROC_FLAG_TAKEN_RANGED_AUTO_ATTACK;
@@ -1958,7 +1958,7 @@ void Spell::prepareDataForTriggerSystem(AuraEffect const* /*triggeredByAura*/)
default:
if (m_spellInfo->EquippedItemClass == ITEM_CLASS_WEAPON &&
m_spellInfo->EquippedItemSubClassMask & (1<<ITEM_SUBCLASS_WEAPON_WAND)
- && m_spellInfo->AttributesEx2 & SPELL_ATTR2_AUTOREPEAT_FLAG) // Wands auto attack
+ && m_spellInfo->HasAttribute(SPELL_ATTR2_AUTOREPEAT_FLAG)) // Wands auto attack
{
m_procAttacker = PROC_FLAG_DONE_RANGED_AUTO_ATTACK;
m_procVictim = PROC_FLAG_TAKEN_RANGED_AUTO_ATTACK;
@@ -1990,8 +1990,8 @@ void Spell::prepareDataForTriggerSystem(AuraEffect const* /*triggeredByAura*/)
if (!(m_procAttacker & PROC_FLAG_DONE_RANGED_AUTO_ATTACK))
{
if (_triggeredCastFlags & TRIGGERED_DISALLOW_PROC_EVENTS &&
- (m_spellInfo->AttributesEx2 & SPELL_ATTR2_TRIGGERED_CAN_TRIGGER_PROC ||
- m_spellInfo->AttributesEx3 & SPELL_ATTR3_TRIGGERED_CAN_TRIGGER_PROC_2))
+ (m_spellInfo->HasAttribute(SPELL_ATTR2_TRIGGERED_CAN_TRIGGER_PROC) ||
+ m_spellInfo->HasAttribute(SPELL_ATTR3_TRIGGERED_CAN_TRIGGER_PROC_2)))
m_procEx |= PROC_EX_INTERNAL_CANT_PROC;
else if (_triggeredCastFlags & TRIGGERED_DISALLOW_PROC_EVENTS)
m_procEx |= PROC_EX_INTERNAL_TRIGGERED;
@@ -2275,7 +2275,7 @@ void Spell::DoAllEffectOnTarget(TargetInfo* target)
m_spellAura = NULL; // Set aura to null for every target-make sure that pointer is not used for unit without aura applied
//Spells with this flag cannot trigger if effect is cast on self
- bool canEffectTrigger = !(m_spellInfo->AttributesEx3 & SPELL_ATTR3_CANT_TRIGGER_PROC) && unitTarget->CanProc() && (CanExecuteTriggersOnHit(mask) || missInfo == SPELL_MISS_IMMUNE || missInfo == SPELL_MISS_IMMUNE2);
+ bool canEffectTrigger = !m_spellInfo->HasAttribute(SPELL_ATTR3_CANT_TRIGGER_PROC) && unitTarget->CanProc() && (CanExecuteTriggersOnHit(mask) || missInfo == SPELL_MISS_IMMUNE || missInfo == SPELL_MISS_IMMUNE2);
Unit* spellHitTarget = NULL;
if (missInfo == SPELL_MISS_NONE) // In case spell hit target, do all effect on that target
@@ -2395,7 +2395,7 @@ void Spell::DoAllEffectOnTarget(TargetInfo* target)
if (canEffectTrigger && missInfo != SPELL_MISS_REFLECT)
{
caster->ProcDamageAndSpell(unitTarget, procAttacker, procVictim, procEx, damageInfo.damage, m_attackType, m_spellInfo, m_triggeredByAuraSpell);
- if (caster->GetTypeId() == TYPEID_PLAYER && (m_spellInfo->Attributes & SPELL_ATTR0_STOP_ATTACK_TARGET) == 0 &&
+ if (caster->GetTypeId() == TYPEID_PLAYER && m_spellInfo->HasAttribute(SPELL_ATTR0_STOP_ATTACK_TARGET) == 0 &&
(m_spellInfo->DmgClass == SPELL_DAMAGE_CLASS_MELEE || m_spellInfo->DmgClass == SPELL_DAMAGE_CLASS_RANGED))
caster->ToPlayer()->CastItemCombatSpell(unitTarget, m_attackType, procVictim, procEx);
}
@@ -2415,7 +2415,7 @@ void Spell::DoAllEffectOnTarget(TargetInfo* target)
caster->ProcDamageAndSpell(unit, procAttacker, procVictim, procEx, 0, m_attackType, m_spellInfo, m_triggeredByAuraSpell);
// Failed Pickpocket, reveal rogue
- if (missInfo == SPELL_MISS_RESIST && m_spellInfo->AttributesCu & SPELL_ATTR0_CU_PICKPOCKET && unitTarget->GetTypeId() == TYPEID_UNIT)
+ if (missInfo == SPELL_MISS_RESIST && m_spellInfo->HasAttribute(SPELL_ATTR0_CU_PICKPOCKET) && unitTarget->GetTypeId() == TYPEID_UNIT)
{
m_caster->RemoveAurasWithInterruptFlags(AURA_INTERRUPT_FLAG_TALK);
if (unitTarget->ToCreature()->IsAIEnabled)
@@ -2425,9 +2425,9 @@ void Spell::DoAllEffectOnTarget(TargetInfo* target)
if (missInfo != SPELL_MISS_EVADE && !m_caster->IsFriendlyTo(unit) && (!m_spellInfo->IsPositive() || m_spellInfo->HasEffect(SPELL_EFFECT_DISPEL)))
{
- m_caster->CombatStart(unit, !(m_spellInfo->AttributesEx3 & SPELL_ATTR3_NO_INITIAL_AGGRO));
+ m_caster->CombatStart(unit, !m_spellInfo->HasAttribute(SPELL_ATTR3_NO_INITIAL_AGGRO));
- if (m_spellInfo->AttributesCu & SPELL_ATTR0_CU_AURA_CC)
+ if (m_spellInfo->HasAttribute(SPELL_ATTR0_CU_AURA_CC))
if (!unit->IsStandState())
unit->SetStandState(UNIT_STAND_STATE_STAND);
}
@@ -2514,7 +2514,7 @@ SpellMissInfo Spell::DoSpellHitOnUnit(Unit* unit, uint32 effectMask, bool scaleA
{
unit->RemoveAurasWithInterruptFlags(AURA_INTERRUPT_FLAG_HITBYSPELL);
/// @todo This is a hack. But we do not know what types of stealth should be interrupted by CC
- if ((m_spellInfo->AttributesCu & SPELL_ATTR0_CU_AURA_CC) && unit->IsControlledByPlayer())
+ if (m_spellInfo->HasAttribute(SPELL_ATTR0_CU_AURA_CC) && unit->IsControlledByPlayer())
unit->RemoveAurasByType(SPELL_AURA_MOD_STEALTH);
}
else if (m_caster->IsFriendlyTo(unit))
@@ -2532,7 +2532,7 @@ SpellMissInfo Spell::DoSpellHitOnUnit(Unit* unit, uint32 effectMask, bool scaleA
if (m_caster->GetTypeId() == TYPEID_PLAYER)
m_caster->ToPlayer()->UpdatePvP(true);
}
- if (unit->IsInCombat() && !(m_spellInfo->AttributesEx3 & SPELL_ATTR3_NO_INITIAL_AGGRO))
+ if (unit->IsInCombat() && !m_spellInfo->HasAttribute(SPELL_ATTR3_NO_INITIAL_AGGRO))
{
m_caster->SetInCombatState(unit->GetCombatTimer() > 0, unit);
unit->getHostileRefManager().threatAssist(m_caster, 0.0f);
@@ -2625,7 +2625,7 @@ SpellMissInfo Spell::DoSpellHitOnUnit(Unit* unit, uint32 effectMask, bool scaleA
if (m_spellInfo->IsChanneled())
m_originalCaster->ModSpellCastTime(aurSpellInfo, duration, this);
// and duration of auras affected by SPELL_AURA_PERIODIC_HASTE
- else if (m_originalCaster->HasAuraTypeWithAffectMask(SPELL_AURA_PERIODIC_HASTE, aurSpellInfo) || m_spellInfo->AttributesEx5 & SPELL_ATTR5_HASTE_AFFECT_DURATION)
+ else if (m_originalCaster->HasAuraTypeWithAffectMask(SPELL_AURA_PERIODIC_HASTE, aurSpellInfo) || m_spellInfo->HasAttribute(SPELL_ATTR5_HASTE_AFFECT_DURATION))
duration = int32(duration * m_originalCaster->GetFloatValue(UNIT_MOD_CAST_SPEED));
if (duration != m_spellAura->GetMaxDuration())
@@ -3192,7 +3192,7 @@ void Spell::cast(bool skipCheck)
SendSpellGo();
// Okay, everything is prepared. Now we need to distinguish between immediate and evented delayed spells
- if ((m_spellInfo->Speed > 0.0f && !m_spellInfo->IsChanneled()) || m_spellInfo->AttributesEx4 & SPELL_ATTR4_UNK4)
+ if ((m_spellInfo->Speed > 0.0f && !m_spellInfo->IsChanneled()) || m_spellInfo->HasAttribute(SPELL_ATTR4_UNK4))
{
// Remove used for cast item if need (it can be already NULL after TakeReagents call
// in case delayed spell remove item at cast delay start
@@ -3592,7 +3592,7 @@ void Spell::finish(bool ok)
break;
}
}
- if (!found && !(m_spellInfo->AttributesEx2 & SPELL_ATTR2_NOT_RESET_AUTO_ACTIONS))
+ if (!found && !m_spellInfo->HasAttribute(SPELL_ATTR2_NOT_RESET_AUTO_ACTIONS))
{
m_caster->resetAttackTimer(BASE_ATTACK);
if (m_caster->haveOffhandWeapon())
@@ -3618,7 +3618,7 @@ void Spell::finish(bool ok)
}
// Stop Attack for some spells
- if (m_spellInfo->Attributes & SPELL_ATTR0_STOP_ATTACK_TARGET)
+ if (m_spellInfo->HasAttribute(SPELL_ATTR0_STOP_ATTACK_TARGET))
m_caster->AttackStop();
}
@@ -3783,7 +3783,7 @@ void Spell::SendSpellStart()
if ((IsTriggered() && !m_spellInfo->IsAutoRepeatRangedSpell()) || m_triggeredByAuraSpell)
castFlags |= CAST_FLAG_PENDING;
- if (m_spellInfo->Attributes & SPELL_ATTR0_REQ_AMMO)
+ if (m_spellInfo->HasAttribute(SPELL_ATTR0_REQ_AMMO))
castFlags |= CAST_FLAG_AMMO;
if ((m_caster->GetTypeId() == TYPEID_PLAYER ||
(m_caster->GetTypeId() == TYPEID_UNIT && m_caster->ToCreature()->IsPet()))
@@ -3836,7 +3836,7 @@ void Spell::SendSpellGo()
if ((IsTriggered() && !m_spellInfo->IsAutoRepeatRangedSpell()) || m_triggeredByAuraSpell)
castFlags |= CAST_FLAG_PENDING;
- if (m_spellInfo->Attributes & SPELL_ATTR0_REQ_AMMO)
+ if (m_spellInfo->HasAttribute(SPELL_ATTR0_REQ_AMMO))
castFlags |= CAST_FLAG_AMMO; // arrows/bullets visual
if ((m_caster->GetTypeId() == TYPEID_PLAYER ||
@@ -4230,7 +4230,7 @@ void Spell::SendResurrectRequest(Player* target)
data << uint8(m_caster->GetTypeId() == TYPEID_PLAYER ? 0 : 1); // "you'll be afflicted with resurrection sickness"
// override delay sent with SMSG_CORPSE_RECLAIM_DELAY, set instant resurrection for spells with this attribute
- if (m_spellInfo->AttributesEx3 & SPELL_ATTR3_IGNORE_RESURRECTION_TIMER)
+ if (m_spellInfo->HasAttribute(SPELL_ATTR3_IGNORE_RESURRECTION_TIMER))
data << uint32(0);
target->GetSession()->SendPacket(&data);
}
@@ -4561,8 +4561,8 @@ void Spell::HandleThreatSpells()
if (m_UniqueTargetInfo.empty())
return;
- if ((m_spellInfo->AttributesEx & SPELL_ATTR1_NO_THREAT) ||
- (m_spellInfo->AttributesEx3 & SPELL_ATTR3_NO_INITIAL_AGGRO))
+ if (m_spellInfo->HasAttribute(SPELL_ATTR1_NO_THREAT) ||
+ m_spellInfo->HasAttribute(SPELL_ATTR3_NO_INITIAL_AGGRO))
return;
float threat = 0.0f;
@@ -4573,7 +4573,7 @@ void Spell::HandleThreatSpells()
threat += threatEntry->flatMod;
}
- else if ((m_spellInfo->AttributesCu & SPELL_ATTR0_CU_NO_INITIAL_THREAT) == 0)
+ else if (m_spellInfo->HasAttribute(SPELL_ATTR0_CU_NO_INITIAL_THREAT) == 0)
threat += m_spellInfo->SpellLevel;
// past this point only multiplicative effects occur
@@ -4634,11 +4634,11 @@ void Spell::HandleEffects(Unit* pUnitTarget, Item* pItemTarget, GameObject* pGOT
SpellCastResult Spell::CheckCast(bool strict)
{
// check death state
- if (!m_caster->IsAlive() && !(m_spellInfo->Attributes & SPELL_ATTR0_PASSIVE) && !((m_spellInfo->Attributes & SPELL_ATTR0_CASTABLE_WHILE_DEAD) || (IsTriggered() && !m_triggeredByAuraSpell)))
+ if (!m_caster->IsAlive() && !m_spellInfo->HasAttribute(SPELL_ATTR0_PASSIVE) && !(m_spellInfo->HasAttribute(SPELL_ATTR0_CASTABLE_WHILE_DEAD) || (IsTriggered() && !m_triggeredByAuraSpell)))
return SPELL_FAILED_CASTER_DEAD;
// check cooldowns to prevent cheating
- if (m_caster->GetTypeId() == TYPEID_PLAYER && !(m_spellInfo->Attributes & SPELL_ATTR0_PASSIVE))
+ if (m_caster->GetTypeId() == TYPEID_PLAYER && !m_spellInfo->HasAttribute(SPELL_ATTR0_PASSIVE))
{
//can cast triggered (by aura only?) spells while have this flag
if (!(_triggeredCastFlags & TRIGGERED_IGNORE_CASTER_AURASTATE) && m_caster->ToPlayer()->HasFlag(PLAYER_FLAGS, PLAYER_ALLOW_ONLY_ABILITY))
@@ -4657,7 +4657,7 @@ SpellCastResult Spell::CheckCast(bool strict)
return SPELL_FAILED_NOT_READY;
}
- if (m_spellInfo->AttributesEx7 & SPELL_ATTR7_IS_CHEAT_SPELL && !m_caster->HasFlag(UNIT_FIELD_FLAGS_2, UNIT_FLAG2_ALLOW_CHEAT_SPELLS))
+ if (m_spellInfo->HasAttribute(SPELL_ATTR7_IS_CHEAT_SPELL) && !m_caster->HasFlag(UNIT_FIELD_FLAGS_2, UNIT_FLAG2_ALLOW_CHEAT_SPELLS))
{
m_customError = SPELL_CUSTOM_ERROR_GM_ONLY;
return SPELL_FAILED_CUSTOM_ERROR;
@@ -4675,11 +4675,11 @@ SpellCastResult Spell::CheckCast(bool strict)
if (m_caster->GetTypeId() == TYPEID_PLAYER && VMAP::VMapFactory::createOrGetVMapManager()->isLineOfSightCalcEnabled())
{
- if (m_spellInfo->Attributes & SPELL_ATTR0_OUTDOORS_ONLY &&
+ if (m_spellInfo->HasAttribute(SPELL_ATTR0_OUTDOORS_ONLY) &&
!m_caster->GetMap()->IsOutdoors(m_caster->GetPositionX(), m_caster->GetPositionY(), m_caster->GetPositionZ()))
return SPELL_FAILED_ONLY_OUTDOORS;
- if (m_spellInfo->Attributes & SPELL_ATTR0_INDOORS_ONLY &&
+ if (m_spellInfo->HasAttribute(SPELL_ATTR0_INDOORS_ONLY) &&
m_caster->GetMap()->IsOutdoors(m_caster->GetPositionX(), m_caster->GetPositionY(), m_caster->GetPositionZ()))
return SPELL_FAILED_ONLY_INDOORS;
}
@@ -4705,7 +4705,7 @@ SpellCastResult Spell::CheckCast(bool strict)
if (shapeError != SPELL_CAST_OK)
return shapeError;
- if ((m_spellInfo->Attributes & SPELL_ATTR0_ONLY_STEALTHED) && !(m_caster->HasStealthAura()))
+ if (m_spellInfo->HasAttribute(SPELL_ATTR0_ONLY_STEALTHED) && !(m_caster->HasStealthAura()))
return SPELL_FAILED_ONLY_STEALTHED;
}
}
@@ -4791,7 +4791,7 @@ SpellCastResult Spell::CheckCast(bool strict)
// those spells may have incorrect target entries or not filled at all (for example 15332)
// such spells when learned are not targeting anyone using targeting system, they should apply directly to caster instead
// also, such casts shouldn't be sent to client
- if (!((m_spellInfo->Attributes & SPELL_ATTR0_PASSIVE) && (!m_targets.GetUnitTarget() || m_targets.GetUnitTarget() == m_caster)))
+ if (!(m_spellInfo->HasAttribute(SPELL_ATTR0_PASSIVE) && (!m_targets.GetUnitTarget() || m_targets.GetUnitTarget() == m_caster)))
{
// Check explicit target for m_originalCaster - todo: get rid of such workarounds
SpellCastResult castResult = m_spellInfo->CheckExplicitTarget(m_originalCaster ? m_originalCaster : m_caster, m_targets.GetObjectTarget(), m_targets.GetItemTarget());
@@ -4808,11 +4808,11 @@ SpellCastResult Spell::CheckCast(bool strict)
if (target != m_caster)
{
// Must be behind the target
- if ((m_spellInfo->AttributesCu & SPELL_ATTR0_CU_REQ_CASTER_BEHIND_TARGET) && target->HasInArc(static_cast<float>(M_PI), m_caster))
+ if (m_spellInfo->HasAttribute(SPELL_ATTR0_CU_REQ_CASTER_BEHIND_TARGET) && target->HasInArc(static_cast<float>(M_PI), m_caster))
return SPELL_FAILED_NOT_BEHIND;
// Target must be facing you
- if ((m_spellInfo->AttributesCu & SPELL_ATTR0_CU_REQ_TARGET_FACING_CASTER) && !target->HasInArc(static_cast<float>(M_PI), m_caster))
+ if (m_spellInfo->HasAttribute(SPELL_ATTR0_CU_REQ_TARGET_FACING_CASTER) && !target->HasInArc(static_cast<float>(M_PI), m_caster))
return SPELL_FAILED_NOT_INFRONT;
if (m_caster->GetEntry() != WORLD_TRIGGER) // Ignore LOS for gameobjects casts (wrongly cast by a trigger)
@@ -4822,7 +4822,7 @@ SpellCastResult Spell::CheckCast(bool strict)
if (DynamicObject* dynObj = m_caster->GetDynObject(m_triggeredByAuraSpell->Id))
losTarget = dynObj;
- if (!(m_spellInfo->AttributesEx2 & SPELL_ATTR2_CAN_TARGET_NOT_IN_LOS) && !DisableMgr::IsDisabledFor(DISABLE_TYPE_SPELL, m_spellInfo->Id, NULL, SPELL_DISABLE_LOS) && !target->IsWithinLOSInMap(losTarget))
+ if (!m_spellInfo->HasAttribute(SPELL_ATTR2_CAN_TARGET_NOT_IN_LOS) && !DisableMgr::IsDisabledFor(DISABLE_TYPE_SPELL, m_spellInfo->Id, NULL, SPELL_DISABLE_LOS) && !target->IsWithinLOSInMap(losTarget))
return SPELL_FAILED_LINE_OF_SIGHT;
}
}
@@ -4834,7 +4834,7 @@ SpellCastResult Spell::CheckCast(bool strict)
float x, y, z;
m_targets.GetDstPos()->GetPosition(x, y, z);
- if (!(m_spellInfo->AttributesEx2 & SPELL_ATTR2_CAN_TARGET_NOT_IN_LOS) && !DisableMgr::IsDisabledFor(DISABLE_TYPE_SPELL, m_spellInfo->Id, NULL, SPELL_DISABLE_LOS) && !m_caster->IsWithinLOS(x, y, z))
+ if (!m_spellInfo->HasAttribute(SPELL_ATTR2_CAN_TARGET_NOT_IN_LOS) && !DisableMgr::IsDisabledFor(DISABLE_TYPE_SPELL, m_spellInfo->Id, NULL, SPELL_DISABLE_LOS) && !m_caster->IsWithinLOS(x, y, z))
return SPELL_FAILED_LINE_OF_SIGHT;
}
@@ -4855,15 +4855,15 @@ SpellCastResult Spell::CheckCast(bool strict)
}
// Spell cast only in battleground
- if ((m_spellInfo->AttributesEx3 & SPELL_ATTR3_BATTLEGROUND) && m_caster->GetTypeId() == TYPEID_PLAYER)
+ if (m_spellInfo->HasAttribute(SPELL_ATTR3_BATTLEGROUND) && m_caster->GetTypeId() == TYPEID_PLAYER)
if (!m_caster->ToPlayer()->InBattleground())
return SPELL_FAILED_ONLY_BATTLEGROUNDS;
// do not allow spells to be cast in arenas
// - with greater than 10 min CD without SPELL_ATTR4_USABLE_IN_ARENA flag
// - with SPELL_ATTR4_NOT_USABLE_IN_ARENA flag
- if ((m_spellInfo->AttributesEx4 & SPELL_ATTR4_NOT_USABLE_IN_ARENA) ||
- (m_spellInfo->GetRecoveryTime() > 10 * MINUTE * IN_MILLISECONDS && !(m_spellInfo->AttributesEx4 & SPELL_ATTR4_USABLE_IN_ARENA)))
+ if (m_spellInfo->HasAttribute(SPELL_ATTR4_NOT_USABLE_IN_ARENA) ||
+ (m_spellInfo->GetRecoveryTime() > 10 * MINUTE * IN_MILLISECONDS && !m_spellInfo->HasAttribute(SPELL_ATTR4_USABLE_IN_ARENA)))
if (MapEntry const* mapEntry = sMapStore.LookupEntry(m_caster->GetMapId()))
if (mapEntry->IsBattleArena())
return SPELL_FAILED_NOT_IN_ARENA;
@@ -4881,7 +4881,7 @@ SpellCastResult Spell::CheckCast(bool strict)
// not let players cast spells at mount (and let do it to creatures)
if (m_caster->IsMounted() && m_caster->GetTypeId() == TYPEID_PLAYER && !(_triggeredCastFlags & TRIGGERED_IGNORE_CASTER_MOUNTED_OR_ON_VEHICLE) &&
- !m_spellInfo->IsPassive() && !(m_spellInfo->Attributes & SPELL_ATTR0_CASTABLE_WHILE_MOUNTED))
+ !m_spellInfo->IsPassive() && !m_spellInfo->HasAttribute(SPELL_ATTR0_CASTABLE_WHILE_MOUNTED))
{
if (m_caster->IsInFlight())
return SPELL_FAILED_NOT_ON_TAXI;
@@ -4938,7 +4938,7 @@ SpellCastResult Spell::CheckCast(bool strict)
for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
if (m_spellInfo->Effects[i].Effect == SPELL_EFFECT_DISPEL)
{
- if (m_spellInfo->Effects[i].IsTargetingArea() || m_spellInfo->AttributesEx & SPELL_ATTR1_MELEE_COMBAT_START)
+ if (m_spellInfo->Effects[i].IsTargetingArea() || m_spellInfo->HasAttribute(SPELL_ATTR1_MELEE_COMBAT_START))
{
hasDispellableAura = true;
break;
@@ -5522,7 +5522,7 @@ SpellCastResult Spell::CheckPetCast(Unit* target)
SpellCastResult Spell::CheckCasterAuras() const
{
// spells totally immuned to caster auras (wsg flag drop, give marks etc)
- if (m_spellInfo->AttributesEx6 & SPELL_ATTR6_IGNORE_CASTER_AURAS)
+ if (m_spellInfo->HasAttribute(SPELL_ATTR6_IGNORE_CASTER_AURAS))
return SPELL_CAST_OK;
uint8 school_immune = 0;
@@ -5531,7 +5531,7 @@ SpellCastResult Spell::CheckCasterAuras() const
// Check if the spell grants school or mechanic immunity.
// We use bitmasks so the loop is done only once and not on every aura check below.
- if (m_spellInfo->AttributesEx & SPELL_ATTR1_DISPEL_AURAS_ON_IMMUNITY)
+ if (m_spellInfo->HasAttribute(SPELL_ATTR1_DISPEL_AURAS_ON_IMMUNITY))
{
for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
{
@@ -5547,7 +5547,7 @@ SpellCastResult Spell::CheckCasterAuras() const
mechanic_immune = IMMUNE_TO_MOVEMENT_IMPAIRMENT_AND_LOSS_CONTROL_MASK;
}
- bool usableInStun = (m_spellInfo->AttributesEx5 & SPELL_ATTR5_USABLE_WHILE_STUNNED) != 0;
+ bool usableInStun = m_spellInfo->HasAttribute(SPELL_ATTR5_USABLE_WHILE_STUNNED);
// Glyph of Pain Suppression
// there is no other way to handle it
@@ -5579,9 +5579,9 @@ SpellCastResult Spell::CheckCasterAuras() const
else
prevented_reason = SPELL_FAILED_STUNNED;
}
- else if (unitflag & UNIT_FLAG_CONFUSED && !(m_spellInfo->AttributesEx5 & SPELL_ATTR5_USABLE_WHILE_CONFUSED))
+ else if (unitflag & UNIT_FLAG_CONFUSED && !m_spellInfo->HasAttribute(SPELL_ATTR5_USABLE_WHILE_CONFUSED))
prevented_reason = SPELL_FAILED_CONFUSED;
- else if (unitflag & UNIT_FLAG_FLEEING && !(m_spellInfo->AttributesEx5 & SPELL_ATTR5_USABLE_WHILE_FEARED))
+ else if (unitflag & UNIT_FLAG_FLEEING && !m_spellInfo->HasAttribute(SPELL_ATTR5_USABLE_WHILE_FEARED))
prevented_reason = SPELL_FAILED_FLEEING;
else if (unitflag & UNIT_FLAG_SILENCED && m_spellInfo->PreventionType == SPELL_PREVENTION_TYPE_SILENCE)
prevented_reason = SPELL_FAILED_SILENCED;
@@ -5601,7 +5601,7 @@ SpellCastResult Spell::CheckCasterAuras() const
SpellInfo const* auraInfo = aura->GetSpellInfo();
if (auraInfo->GetAllEffectsMechanicMask() & mechanic_immune)
continue;
- if (auraInfo->GetSchoolMask() & school_immune && !(auraInfo->AttributesEx & SPELL_ATTR1_UNAFFECTED_BY_SCHOOL_IMMUNE))
+ if (auraInfo->GetSchoolMask() & school_immune && !auraInfo->HasAttribute(SPELL_ATTR1_UNAFFECTED_BY_SCHOOL_IMMUNE))
continue;
if (auraInfo->GetDispelMask() & dispel_immune)
continue;
@@ -5619,11 +5619,11 @@ SpellCastResult Spell::CheckCasterAuras() const
return SPELL_FAILED_STUNNED;
break;
case SPELL_AURA_MOD_CONFUSE:
- if (!(m_spellInfo->AttributesEx5 & SPELL_ATTR5_USABLE_WHILE_CONFUSED))
+ if (!m_spellInfo->HasAttribute(SPELL_ATTR5_USABLE_WHILE_CONFUSED))
return SPELL_FAILED_CONFUSED;
break;
case SPELL_AURA_MOD_FEAR:
- if (!(m_spellInfo->AttributesEx5 & SPELL_ATTR5_USABLE_WHILE_FEARED))
+ if (!m_spellInfo->HasAttribute(SPELL_ATTR5_USABLE_WHILE_FEARED))
return SPELL_FAILED_FLEEING;
break;
case SPELL_AURA_MOD_SILENCE:
@@ -6260,7 +6260,7 @@ SpellCastResult Spell::CheckItems()
if (!(_triggeredCastFlags & TRIGGERED_IGNORE_EQUIPPED_ITEM_REQUIREMENT) && m_spellInfo->EquippedItemClass >=0)
{
// main hand weapon required
- if (m_spellInfo->AttributesEx3 & SPELL_ATTR3_MAIN_HAND)
+ if (m_spellInfo->HasAttribute(SPELL_ATTR3_MAIN_HAND))
{
Item* item = m_caster->ToPlayer()->GetWeaponForAttack(BASE_ATTACK);
@@ -6274,7 +6274,7 @@ SpellCastResult Spell::CheckItems()
}
// offhand hand weapon required
- if (m_spellInfo->AttributesEx3 & SPELL_ATTR3_REQ_OFFHAND)
+ if (m_spellInfo->HasAttribute(SPELL_ATTR3_REQ_OFFHAND))
{
Item* item = m_caster->ToPlayer()->GetWeaponForAttack(OFF_ATTACK);
@@ -6324,7 +6324,7 @@ void Spell::Delayed() // only called in DealDamage()
else
m_timer += delaytime;
- TC_LOG_INFO("spells", "Spell %u partially interrupted for (%d) ms at damage", m_spellInfo->Id, delaytime);
+ TC_LOG_DEBUG("spells", "Spell %u partially interrupted for (%d) ms at damage", m_spellInfo->Id, delaytime);
WorldPacket data(SMSG_SPELL_DELAYED, 8+4);
data << m_caster->GetPackGUID();
@@ -6463,11 +6463,11 @@ bool Spell::CheckEffectTarget(Unit const* target, uint32 eff, Position const* lo
}
// check for ignore LOS on the effect itself
- if (m_spellInfo->AttributesEx2 & SPELL_ATTR2_CAN_TARGET_NOT_IN_LOS || DisableMgr::IsDisabledFor(DISABLE_TYPE_SPELL, m_spellInfo->Id, NULL, SPELL_DISABLE_LOS))
+ if (m_spellInfo->HasAttribute(SPELL_ATTR2_CAN_TARGET_NOT_IN_LOS) || DisableMgr::IsDisabledFor(DISABLE_TYPE_SPELL, m_spellInfo->Id, NULL, SPELL_DISABLE_LOS))
return true;
// if spell is triggered, need to check for LOS disable on the aura triggering it and inherit that behaviour
- if (IsTriggered() && m_triggeredByAuraSpell && (m_triggeredByAuraSpell->AttributesEx2 & SPELL_ATTR2_CAN_TARGET_NOT_IN_LOS || DisableMgr::IsDisabledFor(DISABLE_TYPE_SPELL, m_triggeredByAuraSpell->Id, NULL, SPELL_DISABLE_LOS)))
+ if (IsTriggered() && m_triggeredByAuraSpell && (m_triggeredByAuraSpell->HasAttribute(SPELL_ATTR2_CAN_TARGET_NOT_IN_LOS) || DisableMgr::IsDisabledFor(DISABLE_TYPE_SPELL, m_triggeredByAuraSpell->Id, NULL, SPELL_DISABLE_LOS)))
return true;
/// @todo shit below shouldn't be here, but it's temporary
@@ -6518,7 +6518,7 @@ bool Spell::CheckEffectTarget(Unit const* target, uint32 eff, Position const* lo
bool Spell::IsNextMeleeSwingSpell() const
{
- return (m_spellInfo->Attributes & SPELL_ATTR0_ON_NEXT_SWING) != 0;
+ return m_spellInfo->HasAttribute(SPELL_ATTR0_ON_NEXT_SWING);
}
bool Spell::IsAutoActionResetSpell() const
@@ -6697,7 +6697,7 @@ void Spell::HandleLaunchPhase()
if (m_applyMultiplierMask & (1 << i))
multiplier[i] = m_spellInfo->Effects[i].CalcDamageMultiplier(m_originalCaster, this);
- bool usesAmmo = (m_spellInfo->AttributesCu & SPELL_ATTR0_CU_DIRECT_DAMAGE) != 0;
+ bool usesAmmo = m_spellInfo->HasAttribute(SPELL_ATTR0_CU_DIRECT_DAMAGE);
Unit::AuraEffectList const& Auras = m_caster->GetAuraEffectsByType(SPELL_AURA_ABILITY_CONSUME_NO_AMMO);
for (Unit::AuraEffectList::const_iterator j = Auras.begin(); j != Auras.end(); ++j)
{
@@ -7140,7 +7140,7 @@ void Spell::CallScriptDestinationTargetSelectHandlers(SpellDestination& target,
bool Spell::CheckScriptEffectImplicitTargets(uint32 effIndex, uint32 effIndexToCheck)
{
// Skip if there are not any script
- if (!m_loadedScripts.size())
+ if (m_loadedScripts.empty())
return true;
for (std::list<SpellScript*>::iterator itr = m_loadedScripts.begin(); itr != m_loadedScripts.end(); ++itr)
@@ -7162,7 +7162,7 @@ bool Spell::CheckScriptEffectImplicitTargets(uint32 effIndex, uint32 effIndexToC
bool Spell::CanExecuteTriggersOnHit(uint8 effMask, SpellInfo const* triggeredByAura) const
{
- bool only_on_caster = (triggeredByAura && (triggeredByAura->AttributesEx4 & SPELL_ATTR4_PROC_ONLY_ON_CASTER));
+ bool only_on_caster = (triggeredByAura && triggeredByAura->HasAttribute(SPELL_ATTR4_PROC_ONLY_ON_CASTER));
// If triggeredByAura has SPELL_ATTR4_PROC_ONLY_ON_CASTER then it can only proc on a cast spell with TARGET_UNIT_CASTER
for (uint8 i = 0;i < MAX_SPELL_EFFECTS; ++i)
{
@@ -7401,12 +7401,12 @@ WorldObjectSpellConeTargetCheck::WorldObjectSpellConeTargetCheck(float coneAngle
bool WorldObjectSpellConeTargetCheck::operator()(WorldObject* target)
{
- if (_spellInfo->AttributesCu & SPELL_ATTR0_CU_CONE_BACK)
+ if (_spellInfo->HasAttribute(SPELL_ATTR0_CU_CONE_BACK))
{
if (!_caster->isInBack(target, _coneAngle))
return false;
}
- else if (_spellInfo->AttributesCu & SPELL_ATTR0_CU_CONE_LINE)
+ else if (_spellInfo->HasAttribute(SPELL_ATTR0_CU_CONE_LINE))
{
if (!_caster->HasInLine(target, _caster->GetObjectSize()))
return false;
diff --git a/src/server/game/Spells/SpellEffects.cpp b/src/server/game/Spells/SpellEffects.cpp
index 651f28d3590..7a2f15b3370 100644
--- a/src/server/game/Spells/SpellEffects.cpp
+++ b/src/server/game/Spells/SpellEffects.cpp
@@ -324,7 +324,7 @@ void Spell::EffectSchoolDMG(SpellEffIndex effIndex)
case SPELLFAMILY_GENERIC:
{
// Meteor like spells (divided damage to targets)
- if (m_spellInfo->AttributesCu & SPELL_ATTR0_CU_SHARE_DAMAGE)
+ if (m_spellInfo->HasAttribute(SPELL_ATTR0_CU_SHARE_DAMAGE))
{
uint32 count = 0;
for (std::list<TargetInfo>::iterator ihit= m_UniqueTargetInfo.begin(); ihit != m_UniqueTargetInfo.end(); ++ihit)
@@ -1755,7 +1755,7 @@ void Spell::EffectEnergize(SpellEffIndex effIndex)
Powers power = Powers(m_spellInfo->Effects[effIndex].MiscValue);
- if (unitTarget->GetTypeId() == TYPEID_PLAYER && unitTarget->getPowerType() != power && !(m_spellInfo->AttributesEx7 & SPELL_ATTR7_CAN_RESTORE_SECONDARY_POWER))
+ if (unitTarget->GetTypeId() == TYPEID_PLAYER && unitTarget->getPowerType() != power && !m_spellInfo->HasAttribute(SPELL_ATTR7_CAN_RESTORE_SECONDARY_POWER))
return;
if (unitTarget->GetMaxPower(power) == 0)
@@ -1870,7 +1870,7 @@ void Spell::EffectEnergizePct(SpellEffIndex effIndex)
Powers power = Powers(m_spellInfo->Effects[effIndex].MiscValue);
- if (unitTarget->GetTypeId() == TYPEID_PLAYER && unitTarget->getPowerType() != power && !(m_spellInfo->AttributesEx7 & SPELL_ATTR7_CAN_RESTORE_SECONDARY_POWER))
+ if (unitTarget->GetTypeId() == TYPEID_PLAYER && unitTarget->getPowerType() != power && !m_spellInfo->HasAttribute(SPELL_ATTR7_CAN_RESTORE_SECONDARY_POWER))
return;
uint32 maxPower = unitTarget->GetMaxPower(power);
@@ -4226,7 +4226,7 @@ void Spell::EffectStuck(SpellEffIndex /*effIndex*/)
return;
TC_LOG_DEBUG("spells", "Spell Effect: Stuck");
- TC_LOG_INFO("spells", "Player %s (guid %u) used auto-unstuck future at map %u (%f, %f, %f)", player->GetName().c_str(), player->GetGUIDLow(), player->GetMapId(), player->GetPositionX(), player->GetPositionY(), player->GetPositionZ());
+ TC_LOG_DEBUG("spells", "Player %s (guid %u) used auto-unstuck future at map %u (%f, %f, %f)", player->GetName().c_str(), player->GetGUIDLow(), player->GetMapId(), player->GetPositionX(), player->GetPositionY(), player->GetPositionZ());
if (player->IsInFlight())
return;
@@ -4819,8 +4819,8 @@ void Spell::EffectLeapBack(SpellEffIndex effIndex)
if (!unitTarget)
return;
- float speedxy = float(m_spellInfo->Effects[effIndex].MiscValue)/10;
- float speedz = float(damage/10);
+ float speedxy = m_spellInfo->Effects[effIndex].MiscValue / 10.f;
+ float speedz = damage/ 10.f;
//1891: Disengage
m_caster->JumpTo(speedxy, speedz, m_spellInfo->SpellIconID != 1891);
}
@@ -5344,13 +5344,13 @@ void Spell::EffectStealBeneficialBuff(SpellEffIndex effIndex)
if ((aura->GetSpellInfo()->GetDispelMask()) & dispelMask)
{
// Need check for passive? this
- if (!aurApp->IsPositive() || aura->IsPassive() || aura->GetSpellInfo()->AttributesEx4 & SPELL_ATTR4_NOT_STEALABLE)
+ if (!aurApp->IsPositive() || aura->IsPassive() || aura->GetSpellInfo()->HasAttribute(SPELL_ATTR4_NOT_STEALABLE))
continue;
// The charges / stack amounts don't count towards the total number of auras that can be dispelled.
// Ie: A dispel on a target with 5 stacks of Winters Chill and a Polymorph has 1 / (1 + 1) -> 50% chance to dispell
// Polymorph instead of 1 / (5 + 1) -> 16%.
- bool dispel_charges = (aura->GetSpellInfo()->AttributesEx7 & SPELL_ATTR7_DISPEL_CHARGES) != 0;
+ bool dispel_charges = aura->GetSpellInfo()->HasAttribute(SPELL_ATTR7_DISPEL_CHARGES);
uint8 charges = dispel_charges ? aura->GetCharges() : aura->GetStackAmount();
if (charges > 0)
steal_list.push_back(std::make_pair(aura, charges));
@@ -5852,7 +5852,7 @@ void Spell::EffectCastButtons(SpellEffIndex effIndex)
if (!p_caster->HasSpell(spell_id) || p_caster->HasSpellCooldown(spell_id))
continue;
- if (!(spellInfo->AttributesEx7 & SPELL_ATTR7_SUMMON_PLAYER_TOTEM))
+ if (!spellInfo->HasAttribute(SPELL_ATTR7_SUMMON_PLAYER_TOTEM))
continue;
uint32 cost = spellInfo->CalcPowerCost(m_caster, spellInfo->GetSchoolMask());
diff --git a/src/server/game/Spells/SpellInfo.cpp b/src/server/game/Spells/SpellInfo.cpp
index 6215f8cfa0a..862521a068c 100644
--- a/src/server/game/Spells/SpellInfo.cpp
+++ b/src/server/game/Spells/SpellInfo.cpp
@@ -453,7 +453,7 @@ int32 SpellEffectInfo::CalcValue(Unit const* caster, int32 const* bp, Unit const
// amount multiplication based on caster's level
if (!caster->IsControlledByPlayer() &&
_spellInfo->SpellLevel && _spellInfo->SpellLevel != caster->getLevel() &&
- !basePointsPerLevel && (_spellInfo->Attributes & SPELL_ATTR0_LEVEL_DAMAGE_CALCULATION))
+ !basePointsPerLevel && _spellInfo->HasAttribute(SPELL_ATTR0_LEVEL_DAMAGE_CALCULATION))
{
bool canEffectScale = false;
switch (Effect)
@@ -1049,14 +1049,14 @@ bool SpellInfo::NeedsToBeTriggeredByCaster(SpellInfo const* triggeringSpell) con
bool SpellInfo::IsPassive() const
{
- return (Attributes & SPELL_ATTR0_PASSIVE) != 0;
+ return HasAttribute(SPELL_ATTR0_PASSIVE);
}
bool SpellInfo::IsAutocastable() const
{
- if (Attributes & SPELL_ATTR0_PASSIVE)
+ if (HasAttribute(SPELL_ATTR0_PASSIVE))
return false;
- if (AttributesEx & SPELL_ATTR1_UNAUTOCASTABLE_BY_PET)
+ if (HasAttribute(SPELL_ATTR1_UNAUTOCASTABLE_BY_PET))
return false;
return true;
}
@@ -1107,37 +1107,37 @@ bool SpellInfo::IsMultiSlotAura() const
bool SpellInfo::IsStackableOnOneSlotWithDifferentCasters() const
{
/// TODO: Re-verify meaning of SPELL_ATTR3_STACK_FOR_DIFF_CASTERS and update conditions here
- return StackAmount > 1 && !IsChanneled() && !(AttributesEx3 & SPELL_ATTR3_STACK_FOR_DIFF_CASTERS);
+ return StackAmount > 1 && !IsChanneled() && !HasAttribute(SPELL_ATTR3_STACK_FOR_DIFF_CASTERS);
}
bool SpellInfo::IsCooldownStartedOnEvent() const
{
- return Attributes & SPELL_ATTR0_DISABLED_WHILE_ACTIVE || (CategoryEntry && CategoryEntry->Flags & SPELL_CATEGORY_FLAG_COOLDOWN_STARTS_ON_EVENT);
+ return HasAttribute(SPELL_ATTR0_DISABLED_WHILE_ACTIVE) || (CategoryEntry && CategoryEntry->Flags & SPELL_CATEGORY_FLAG_COOLDOWN_STARTS_ON_EVENT);
}
bool SpellInfo::IsDeathPersistent() const
{
- return (AttributesEx3 & SPELL_ATTR3_DEATH_PERSISTENT) != 0;
+ return HasAttribute(SPELL_ATTR3_DEATH_PERSISTENT);
}
bool SpellInfo::IsRequiringDeadTarget() const
{
- return (AttributesEx3 & SPELL_ATTR3_ONLY_TARGET_GHOSTS) != 0;
+ return HasAttribute(SPELL_ATTR3_ONLY_TARGET_GHOSTS);
}
bool SpellInfo::IsAllowingDeadTarget() const
{
- return AttributesEx2 & SPELL_ATTR2_CAN_TARGET_DEAD || Targets & (TARGET_FLAG_CORPSE_ALLY | TARGET_FLAG_CORPSE_ENEMY | TARGET_FLAG_UNIT_DEAD);
+ return HasAttribute(SPELL_ATTR2_CAN_TARGET_DEAD) || Targets & (TARGET_FLAG_CORPSE_ALLY | TARGET_FLAG_CORPSE_ENEMY | TARGET_FLAG_UNIT_DEAD);
}
bool SpellInfo::CanBeUsedInCombat() const
{
- return !(Attributes & SPELL_ATTR0_CANT_USED_IN_COMBAT);
+ return !HasAttribute(SPELL_ATTR0_CANT_USED_IN_COMBAT);
}
bool SpellInfo::IsPositive() const
{
- return !(AttributesCu & SPELL_ATTR0_CU_NEGATIVE);
+ return !HasAttribute(SPELL_ATTR0_CU_NEGATIVE);
}
bool SpellInfo::IsPositiveEffect(uint8 effIndex) const
@@ -1146,27 +1146,27 @@ bool SpellInfo::IsPositiveEffect(uint8 effIndex) const
{
default:
case 0:
- return !(AttributesCu & SPELL_ATTR0_CU_NEGATIVE_EFF0);
+ return !HasAttribute(SPELL_ATTR0_CU_NEGATIVE_EFF0);
case 1:
- return !(AttributesCu & SPELL_ATTR0_CU_NEGATIVE_EFF1);
+ return !HasAttribute(SPELL_ATTR0_CU_NEGATIVE_EFF1);
case 2:
- return !(AttributesCu & SPELL_ATTR0_CU_NEGATIVE_EFF2);
+ return !HasAttribute(SPELL_ATTR0_CU_NEGATIVE_EFF2);
}
}
bool SpellInfo::IsChanneled() const
{
- return (AttributesEx & (SPELL_ATTR1_CHANNELED_1 | SPELL_ATTR1_CHANNELED_2)) != 0;
+ return HasAttribute(SPELL_ATTR1_CHANNELED_1) || HasAttribute(SPELL_ATTR1_CHANNELED_2);
}
bool SpellInfo::NeedsComboPoints() const
{
- return (AttributesEx & (SPELL_ATTR1_REQ_COMBO_POINTS1 | SPELL_ATTR1_REQ_COMBO_POINTS2)) != 0;
+ return HasAttribute(SPELL_ATTR1_REQ_COMBO_POINTS1) || HasAttribute(SPELL_ATTR1_REQ_COMBO_POINTS2);
}
bool SpellInfo::IsBreakingStealth() const
{
- return !(AttributesEx & SPELL_ATTR1_NOT_BREAK_STEALTH);
+ return !HasAttribute(SPELL_ATTR1_NOT_BREAK_STEALTH);
}
bool SpellInfo::IsRangedWeaponSpell() const
@@ -1177,12 +1177,12 @@ bool SpellInfo::IsRangedWeaponSpell() const
bool SpellInfo::IsAutoRepeatRangedSpell() const
{
- return (AttributesEx2 & SPELL_ATTR2_AUTOREPEAT_FLAG) != 0;
+ return HasAttribute(SPELL_ATTR2_AUTOREPEAT_FLAG);
}
bool SpellInfo::IsAffectedBySpellMods() const
{
- return !(AttributesEx3 & SPELL_ATTR3_NO_DONE_BONUS);
+ return !HasAttribute(SPELL_ATTR3_NO_DONE_BONUS);
}
bool SpellInfo::IsAffectedBySpellMod(SpellModifier const* mod) const
@@ -1205,11 +1205,11 @@ bool SpellInfo::IsAffectedBySpellMod(SpellModifier const* mod) const
bool SpellInfo::CanPierceImmuneAura(SpellInfo const* aura) const
{
// these spells pierce all avalible spells (Resurrection Sickness for example)
- if (Attributes & SPELL_ATTR0_UNAFFECTED_BY_INVULNERABILITY)
+ if (HasAttribute(SPELL_ATTR0_UNAFFECTED_BY_INVULNERABILITY))
return true;
// these spells (Cyclone for example) can pierce all... // ...but not these (Divine shield, Ice block, Cyclone and Banish for example)
- if ((AttributesEx & SPELL_ATTR1_UNAFFECTED_BY_SCHOOL_IMMUNE) && !(aura && (aura->Mechanic == MECHANIC_IMMUNE_SHIELD || aura->Mechanic == MECHANIC_INVULNERABILITY || aura->Mechanic == MECHANIC_BANISH)))
+ if ((HasAttribute(SPELL_ATTR1_UNAFFECTED_BY_SCHOOL_IMMUNE)) && !(aura && (aura->Mechanic == MECHANIC_IMMUNE_SHIELD || aura->Mechanic == MECHANIC_INVULNERABILITY || aura->Mechanic == MECHANIC_BANISH)))
return true;
return false;
@@ -1218,15 +1218,15 @@ bool SpellInfo::CanPierceImmuneAura(SpellInfo const* aura) const
bool SpellInfo::CanDispelAura(SpellInfo const* aura) const
{
// These spells (like Mass Dispel) can dispell all auras, except death persistent ones (like Dungeon and Battleground Deserter)
- if (Attributes & SPELL_ATTR0_UNAFFECTED_BY_INVULNERABILITY && !aura->IsDeathPersistent())
+ if (HasAttribute(SPELL_ATTR0_UNAFFECTED_BY_INVULNERABILITY) && !aura->IsDeathPersistent())
return true;
// These auras (like Divine Shield) can't be dispelled
- if (aura->Attributes & SPELL_ATTR0_UNAFFECTED_BY_INVULNERABILITY)
+ if (aura->HasAttribute(SPELL_ATTR0_UNAFFECTED_BY_INVULNERABILITY))
return false;
// These auras (Cyclone for example) are not dispelable
- if (aura->AttributesEx & SPELL_ATTR1_UNAFFECTED_BY_SCHOOL_IMMUNE)
+ if (aura->HasAttribute(SPELL_ATTR1_UNAFFECTED_BY_SCHOOL_IMMUNE))
return false;
return true;
@@ -1235,7 +1235,7 @@ bool SpellInfo::CanDispelAura(SpellInfo const* aura) const
bool SpellInfo::IsSingleTarget() const
{
// all other single target spells have if it has AttributesEx5
- if (AttributesEx5 & SPELL_ATTR5_SINGLE_TARGET_SPELL)
+ if (HasAttribute(SPELL_ATTR5_SINGLE_TARGET_SPELL))
return true;
switch (GetSpellSpecific())
@@ -1332,7 +1332,7 @@ SpellCastResult SpellInfo::CheckShapeshift(uint32 form) const
if (actAsShifted)
{
- if (Attributes & SPELL_ATTR0_NOT_SHAPESHIFT) // not while shapeshifted
+ if (HasAttribute(SPELL_ATTR0_NOT_SHAPESHIFT)) // not while shapeshifted
return SPELL_FAILED_NOT_SHAPESHIFT;
else if (Stances != 0) // needs other shapeshift
return SPELL_FAILED_ONLY_SHAPESHIFT;
@@ -1340,7 +1340,7 @@ SpellCastResult SpellInfo::CheckShapeshift(uint32 form) const
else
{
// needs shapeshift
- if (!(AttributesEx2 & SPELL_ATTR2_NOT_NEED_SHAPESHIFT) && Stances != 0)
+ if (!HasAttribute(SPELL_ATTR2_NOT_NEED_SHAPESHIFT) && Stances != 0)
return SPELL_FAILED_ONLY_SHAPESHIFT;
}
@@ -1379,7 +1379,7 @@ SpellCastResult SpellInfo::CheckLocation(uint32 map_id, uint32 zone_id, uint32 a
}
// continent limitation (virtual continent)
- if (AttributesEx4 & SPELL_ATTR4_CAST_ONLY_IN_OUTLAND)
+ if (HasAttribute(SPELL_ATTR4_CAST_ONLY_IN_OUTLAND))
{
uint32 v_map = GetVirtualMapForMapAndZone(map_id, zone_id);
MapEntry const* mapEntry = sMapStore.LookupEntry(v_map);
@@ -1388,7 +1388,7 @@ SpellCastResult SpellInfo::CheckLocation(uint32 map_id, uint32 zone_id, uint32 a
}
// raid instance limitation
- if (AttributesEx6 & SPELL_ATTR6_NOT_IN_RAID_INSTANCE)
+ if (HasAttribute(SPELL_ATTR6_NOT_IN_RAID_INSTANCE))
{
MapEntry const* mapEntry = sMapStore.LookupEntry(map_id);
if (!mapEntry || mapEntry->IsRaid())
@@ -1493,11 +1493,11 @@ SpellCastResult SpellInfo::CheckLocation(uint32 map_id, uint32 zone_id, uint32 a
SpellCastResult SpellInfo::CheckTarget(Unit const* caster, WorldObject const* target, bool implicit) const
{
- if (AttributesEx & SPELL_ATTR1_CANT_TARGET_SELF && caster == target)
+ if (HasAttribute(SPELL_ATTR1_CANT_TARGET_SELF) && caster == target)
return SPELL_FAILED_BAD_TARGETS;
// check visibility - ignore stealth for implicit (area) targets
- if (!(AttributesEx6 & SPELL_ATTR6_CAN_TARGET_INVISIBLE) && !caster->CanSeeOrDetect(target, implicit))
+ if (!HasAttribute(SPELL_ATTR6_CAN_TARGET_INVISIBLE) && !caster->CanSeeOrDetect(target, implicit))
return SPELL_FAILED_BAD_TARGETS;
Unit const* unitTarget = target->ToUnit();
@@ -1505,7 +1505,7 @@ SpellCastResult SpellInfo::CheckTarget(Unit const* caster, WorldObject const* ta
// creature/player specific target checks
if (unitTarget)
{
- if (AttributesEx & SPELL_ATTR1_CANT_TARGET_IN_COMBAT)
+ if (HasAttribute(SPELL_ATTR1_CANT_TARGET_IN_COMBAT))
{
if (unitTarget->IsInCombat())
return SPELL_FAILED_TARGET_AFFECTING_COMBAT;
@@ -1517,9 +1517,9 @@ SpellCastResult SpellInfo::CheckTarget(Unit const* caster, WorldObject const* ta
}
// only spells with SPELL_ATTR3_ONLY_TARGET_GHOSTS can target ghosts
- if (((AttributesEx3 & SPELL_ATTR3_ONLY_TARGET_GHOSTS) != 0) != unitTarget->HasAuraType(SPELL_AURA_GHOST))
+ if (HasAttribute(SPELL_ATTR3_ONLY_TARGET_GHOSTS) != unitTarget->HasAuraType(SPELL_AURA_GHOST))
{
- if (AttributesEx3 & SPELL_ATTR3_ONLY_TARGET_GHOSTS)
+ if (HasAttribute(SPELL_ATTR3_ONLY_TARGET_GHOSTS))
return SPELL_FAILED_TARGET_NOT_GHOST;
else
return SPELL_FAILED_BAD_TARGETS;
@@ -1530,12 +1530,12 @@ SpellCastResult SpellInfo::CheckTarget(Unit const* caster, WorldObject const* ta
if (caster->GetTypeId() == TYPEID_PLAYER)
{
// Do not allow these spells to target creatures not tapped by us (Banish, Polymorph, many quest spells)
- if (AttributesEx2 & SPELL_ATTR2_CANT_TARGET_TAPPED)
+ if (HasAttribute(SPELL_ATTR2_CANT_TARGET_TAPPED))
if (Creature const* targetCreature = unitTarget->ToCreature())
if (targetCreature->hasLootRecipient() && !targetCreature->isTappedBy(caster->ToPlayer()))
return SPELL_FAILED_CANT_CAST_ON_TAPPED;
- if (AttributesCu & SPELL_ATTR0_CU_PICKPOCKET)
+ if (HasAttribute(SPELL_ATTR0_CU_PICKPOCKET))
{
if (unitTarget->GetTypeId() == TYPEID_PLAYER)
return SPELL_FAILED_BAD_TARGETS;
@@ -1575,21 +1575,21 @@ SpellCastResult SpellInfo::CheckTarget(Unit const* caster, WorldObject const* ta
else return SPELL_CAST_OK;
// corpseOwner and unit specific target checks
- if (AttributesEx3 & SPELL_ATTR3_ONLY_TARGET_PLAYERS && !unitTarget->ToPlayer())
+ if (HasAttribute(SPELL_ATTR3_ONLY_TARGET_PLAYERS) && !unitTarget->ToPlayer())
return SPELL_FAILED_TARGET_NOT_PLAYER;
if (!IsAllowingDeadTarget() && !unitTarget->IsAlive())
return SPELL_FAILED_TARGETS_DEAD;
// check this flag only for implicit targets (chain and area), allow to explicitly target units for spells like Shield of Righteousness
- if (implicit && AttributesEx6 & SPELL_ATTR6_CANT_TARGET_CROWD_CONTROLLED && !unitTarget->CanFreeMove())
+ if (implicit && HasAttribute(SPELL_ATTR6_CANT_TARGET_CROWD_CONTROLLED) && !unitTarget->CanFreeMove())
return SPELL_FAILED_BAD_TARGETS;
// checked in Unit::IsValidAttack/AssistTarget, shouldn't be checked for ENTRY targets
- //if (!(AttributesEx6 & SPELL_ATTR6_CAN_TARGET_UNTARGETABLE) && target->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE))
+ //if (!HasAttribute(SPELL_ATTR6_CAN_TARGET_UNTARGETABLE) && target->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE))
// return SPELL_FAILED_BAD_TARGETS;
- //if (!(AttributesEx6 & SPELL_ATTR6_CAN_TARGET_POSSESSED_FRIENDS)
+ //if (!HasAttribute(SPELL_ATTR6_CAN_TARGET_POSSESSED_FRIENDS)
if (!CheckTargetCreatureType(unitTarget))
{
@@ -1705,7 +1705,7 @@ SpellCastResult SpellInfo::CheckVehicle(Unit const* caster) const
checkMask = VEHICLE_SEAT_FLAG_CAN_ATTACK;
VehicleSeatEntry const* vehicleSeat = vehicle->GetSeatForPassenger(caster);
- if (!(AttributesEx6 & SPELL_ATTR6_CASTABLE_WHILE_ON_VEHICLE) && !(Attributes & SPELL_ATTR0_CASTABLE_WHILE_MOUNTED)
+ if (!HasAttribute(SPELL_ATTR6_CASTABLE_WHILE_ON_VEHICLE) && !HasAttribute(SPELL_ATTR0_CASTABLE_WHILE_MOUNTED)
&& (vehicleSeat->m_flags & checkMask) != checkMask)
return SPELL_FAILED_CANT_DO_THAT_RIGHT_NOW;
@@ -2106,7 +2106,7 @@ uint32 SpellInfo::CalcCastTime(Spell* spell /*= NULL*/) const
if (spell)
spell->GetCaster()->ModSpellCastTime(this, castTime, spell);
- if (Attributes & SPELL_ATTR0_REQ_AMMO && (!IsAutoRepeatRangedSpell()))
+ if (HasAttribute(SPELL_ATTR0_REQ_AMMO) && (!IsAutoRepeatRangedSpell()))
castTime += 500;
return (castTime > 0) ? uint32(castTime) : 0;
@@ -2147,7 +2147,7 @@ uint32 SpellInfo::GetRecoveryTime() const
int32 SpellInfo::CalcPowerCost(Unit const* caster, SpellSchoolMask schoolMask) const
{
// Spell drain all exist power on cast (Only paladin lay of Hands)
- if (AttributesEx & SPELL_ATTR1_DRAIN_ALL_POWER)
+ if (HasAttribute(SPELL_ATTR1_DRAIN_ALL_POWER))
{
// If power type - health drain all
if (PowerType == POWER_HEALTH)
@@ -2193,7 +2193,7 @@ int32 SpellInfo::CalcPowerCost(Unit const* caster, SpellSchoolMask schoolMask) c
powerCost += caster->GetInt32Value(UNIT_FIELD_POWER_COST_MODIFIER + school);
// Shiv - costs 20 + weaponSpeed*10 energy (apply only to non-triggered spell with energy cost)
- if (AttributesEx4 & SPELL_ATTR4_SPELL_VS_EXTEND_COST)
+ if (HasAttribute(SPELL_ATTR4_SPELL_VS_EXTEND_COST))
{
uint32 speed = 0;
if (SpellShapeshiftEntry const* ss = sSpellShapeshiftStore.LookupEntry(caster->GetShapeshiftForm()))
@@ -2201,7 +2201,7 @@ int32 SpellInfo::CalcPowerCost(Unit const* caster, SpellSchoolMask schoolMask) c
else
{
WeaponAttackType slot = BASE_ATTACK;
- if (AttributesEx3 & SPELL_ATTR3_REQ_OFFHAND)
+ if (HasAttribute(SPELL_ATTR3_REQ_OFFHAND))
slot = OFF_ATTACK;
speed = caster->GetAttackTime(slot);
@@ -2216,7 +2216,7 @@ int32 SpellInfo::CalcPowerCost(Unit const* caster, SpellSchoolMask schoolMask) c
if (!caster->IsControlledByPlayer())
{
- if (Attributes & SPELL_ATTR0_LEVEL_DAMAGE_CALCULATION)
+ if (HasAttribute(SPELL_ATTR0_LEVEL_DAMAGE_CALCULATION))
{
GtNPCManaCostScalerEntry const* spellScaler = sGtNPCManaCostScalerStore.LookupEntry(SpellLevel - 1);
GtNPCManaCostScalerEntry const* casterScaler = sGtNPCManaCostScalerStore.LookupEntry(caster->getLevel() - 1);
@@ -2361,7 +2361,7 @@ void SpellInfo::_InitializeExplicitTargetMask()
bool SpellInfo::_IsPositiveEffect(uint8 effIndex, bool deep) const
{
// not found a single positive spell with this attribute
- if (Attributes & SPELL_ATTR0_NEGATIVE_1)
+ if (HasAttribute(SPELL_ATTR0_NEGATIVE_1))
return false;
switch (SpellFamilyName)
@@ -2542,7 +2542,7 @@ bool SpellInfo::_IsPositiveEffect(uint8 effIndex, bool deep) const
if (Effects[effIndex].TargetA.GetTarget() != TARGET_UNIT_CASTER)
return false;
// but not this if this first effect (didn't find better check)
- if (Attributes & SPELL_ATTR0_NEGATIVE_1 && effIndex == 0)
+ if (HasAttribute(SPELL_ATTR0_NEGATIVE_1) && effIndex == 0)
return false;
break;
case SPELL_AURA_MECHANIC_IMMUNITY:
diff --git a/src/server/game/Spells/SpellInfo.h b/src/server/game/Spells/SpellInfo.h
index d9c062e77fd..f2808a089e1 100644
--- a/src/server/game/Spells/SpellInfo.h
+++ b/src/server/game/Spells/SpellInfo.h
@@ -376,6 +376,16 @@ public:
bool HasAura(AuraType aura) const;
bool HasAreaAuraEffect() const;
+ inline bool HasAttribute(SpellAttr0 attribute) const { return !!(Attributes & attribute); }
+ inline bool HasAttribute(SpellAttr1 attribute) const { return !!(AttributesEx & attribute); }
+ inline bool HasAttribute(SpellAttr2 attribute) const { return !!(AttributesEx2 & attribute); }
+ inline bool HasAttribute(SpellAttr3 attribute) const { return !!(AttributesEx3 & attribute); }
+ inline bool HasAttribute(SpellAttr4 attribute) const { return !!(AttributesEx4 & attribute); }
+ inline bool HasAttribute(SpellAttr5 attribute) const { return !!(AttributesEx5 & attribute); }
+ inline bool HasAttribute(SpellAttr6 attribute) const { return !!(AttributesEx6 & attribute); }
+ inline bool HasAttribute(SpellAttr7 attribute) const { return !!(AttributesEx7 & attribute); }
+ inline bool HasAttribute(SpellCustomAttributes customAttribute) const { return !!(AttributesCu & customAttribute); }
+
bool IsExplicitDiscovery() const;
bool IsLootCrafting() const;
bool IsQuestTame() const;
diff --git a/src/server/game/Spells/SpellMgr.cpp b/src/server/game/Spells/SpellMgr.cpp
index db16a7312ea..b9f046670cc 100644
--- a/src/server/game/Spells/SpellMgr.cpp
+++ b/src/server/game/Spells/SpellMgr.cpp
@@ -2238,7 +2238,7 @@ void SpellMgr::LoadEnchantCustomAttr()
continue;
/// @todo find a better check
- if (!(spellInfo->AttributesEx2 & SPELL_ATTR2_PRESERVE_ENCHANT_IN_ARENA) || !(spellInfo->Attributes & SPELL_ATTR0_NOT_SHAPESHIFT))
+ if (!spellInfo->HasAttribute(SPELL_ATTR2_PRESERVE_ENCHANT_IN_ARENA) || !spellInfo->HasAttribute(SPELL_ATTR0_NOT_SHAPESHIFT))
continue;
for (uint32 j = 0; j < MAX_SPELL_EFFECTS; ++j)
@@ -2959,6 +2959,8 @@ void SpellMgr::LoadSpellInfoCorrections()
switch (spellInfo->Id)
{
case 53096: // Quetz'lun's Judgment
+ case 70743: // AoD Special
+ case 70614: // AoD Special - Vegard
spellInfo->MaxAffectedTargets = 1;
break;
case 42436: // Drink! (Brewfest)
@@ -3729,7 +3731,7 @@ void SpellMgr::LoadSpellInfoCorrections()
case 45440: // Steam Tonk Controller
case 60256: // Collect Sample
// Crashes client on pressing ESC
- spellInfo->AttributesEx4 &= ~SPELL_ATTR4_TRIGGERED;
+ spellInfo->AttributesEx4 &= ~SPELL_ATTR4_CAN_CAST_WHILE_CASTING;
break;
// ISLE OF CONQUEST SPELLS
//
@@ -3746,7 +3748,7 @@ void SpellMgr::LoadSpellInfoCorrections()
{
case SPELLFAMILY_PALADIN:
// Seals of the Pure should affect Seal of Righteousness
- if (spellInfo->SpellIconID == 25 && spellInfo->Attributes & SPELL_ATTR0_PASSIVE)
+ if (spellInfo->SpellIconID == 25 && spellInfo->HasAttribute(SPELL_ATTR0_PASSIVE))
spellInfo->Effects[EFFECT_0].SpellClassMask[1] |= 0x20000000;
break;
case SPELLFAMILY_DEATHKNIGHT:
diff --git a/src/server/game/World/World.cpp b/src/server/game/World/World.cpp
index 555f89aad8f..84f22f2f1a9 100644
--- a/src/server/game/World/World.cpp
+++ b/src/server/game/World/World.cpp
@@ -940,6 +940,12 @@ void World::LoadConfigSettings(bool reload)
}
m_bool_configs[CONFIG_SAVE_RESPAWN_TIME_IMMEDIATELY] = sConfigMgr->GetBoolDefault("SaveRespawnTimeImmediately", true);
+ if (!m_bool_configs[CONFIG_SAVE_RESPAWN_TIME_IMMEDIATELY])
+ {
+ TC_LOG_WARN("server.loading", "SaveRespawnTimeImmediately triggers assertions when disabled, overridden to Enabled");
+ m_bool_configs[CONFIG_SAVE_RESPAWN_TIME_IMMEDIATELY] = true;
+ }
+
m_bool_configs[CONFIG_WEATHER] = sConfigMgr->GetBoolDefault("ActivateWeather", true);
m_int_configs[CONFIG_DISABLE_BREATHING] = sConfigMgr->GetIntDefault("DisableWaterBreath", SEC_CONSOLE);
@@ -1334,7 +1340,7 @@ void World::SetInitialWorldSettings()
!MapManager::ExistMapAndVMap(530, 10349.6f, -6357.29f) ||
!MapManager::ExistMapAndVMap(530, -3961.64f, -13931.2f))))
{
- TC_LOG_ERROR("server.loading", "Correct *.map files not found in path '%smaps' or *.vmtree/*.vmtile files in '%svmaps'. Please place *.map/*.vmtree/*.vmtile files in appropriate directories or correct the DataDir value in the worldserver.conf file.", m_dataPath.c_str(), m_dataPath.c_str());
+ TC_LOG_FATAL("server.loading", "Unable to load critical files - server shutting down !!!");
exit(1);
}
@@ -3018,7 +3024,7 @@ void World::ResetRandomBG()
{
TC_LOG_INFO("misc", "Random BG status reset for all characters.");
- PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_BATTLEGROUND_RANDOM);
+ PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_BATTLEGROUND_RANDOM_ALL);
CharacterDatabase.Execute(stmt);
for (SessionMap::const_iterator itr = m_sessions.begin(); itr != m_sessions.end(); ++itr)
diff --git a/src/server/scripts/CMakeLists.txt b/src/server/scripts/CMakeLists.txt
index e7d08d69805..8bf84c32447 100644
--- a/src/server/scripts/CMakeLists.txt
+++ b/src/server/scripts/CMakeLists.txt
@@ -50,6 +50,7 @@ include_directories(
${CMAKE_SOURCE_DIR}/dep/recastnavigation/Recast/Include
${CMAKE_SOURCE_DIR}/dep/g3dlite/include
${CMAKE_SOURCE_DIR}/dep/SFMT
+ ${CMAKE_SOURCE_DIR}/dep/cppformat
${CMAKE_SOURCE_DIR}/dep/zlib
${CMAKE_SOURCE_DIR}/src/server/shared
${CMAKE_SOURCE_DIR}/src/server/shared/Configuration
diff --git a/src/server/scripts/Commands/cs_debug.cpp b/src/server/scripts/Commands/cs_debug.cpp
index 5d6cdb3fb63..ccd82aa3ef9 100644
--- a/src/server/scripts/Commands/cs_debug.cpp
+++ b/src/server/scripts/Commands/cs_debug.cpp
@@ -299,7 +299,7 @@ public:
else if (commentToken[1] == '/')
{
std::string str;
- getline(ifs, str);
+ std::getline(ifs, str);
continue;
}
// regular data
diff --git a/src/server/scripts/Commands/cs_misc.cpp b/src/server/scripts/Commands/cs_misc.cpp
index 0e86823aa7c..dea2a5216e7 100644
--- a/src/server/scripts/Commands/cs_misc.cpp
+++ b/src/server/scripts/Commands/cs_misc.cpp
@@ -237,7 +237,8 @@ public:
zoneId, (zoneEntry ? zoneEntry->area_name[handler->GetSessionDbcLocale()] : unknown),
areaId, (areaEntry ? areaEntry->area_name[handler->GetSessionDbcLocale()] : unknown),
object->GetPhaseMask(),
- object->GetPositionX(), object->GetPositionY(), object->GetPositionZ(), object->GetOrientation(),
+ object->GetPositionX(), object->GetPositionY(), object->GetPositionZ(), object->GetOrientation());
+ handler->PSendSysMessage(LANG_GRID_POSITION,
cell.GridX(), cell.GridY(), cell.CellX(), cell.CellY(), object->GetInstanceId(),
zoneX, zoneY, groundZ, floorZ, haveMap, haveVMap, haveMMap);
diff --git a/src/server/scripts/EasternKingdoms/Karazhan/karazhan.cpp b/src/server/scripts/EasternKingdoms/Karazhan/karazhan.cpp
index 59f2ce1a2c9..92c3f83034d 100644
--- a/src/server/scripts/EasternKingdoms/Karazhan/karazhan.cpp
+++ b/src/server/scripts/EasternKingdoms/Karazhan/karazhan.cpp
@@ -360,17 +360,17 @@ public:
case GOSSIP_ACTION_INFO_DEF+3:
player->CLOSE_GOSSIP_MENU();
pBarnesAI->m_uiEventId = EVENT_OZ;
- TC_LOG_INFO("scripts", "player (%s) manually set Opera event to EVENT_OZ", player->GetGUID().ToString().c_str());
+ TC_LOG_DEBUG("scripts", "player (%s) manually set Opera event to EVENT_OZ", player->GetGUID().ToString().c_str());
break;
case GOSSIP_ACTION_INFO_DEF+4:
player->CLOSE_GOSSIP_MENU();
pBarnesAI->m_uiEventId = EVENT_HOOD;
- TC_LOG_INFO("scripts", "player (%s) manually set Opera event to EVENT_HOOD", player->GetGUID().ToString().c_str());
+ TC_LOG_DEBUG("scripts", "player (%s) manually set Opera event to EVENT_HOOD", player->GetGUID().ToString().c_str());
break;
case GOSSIP_ACTION_INFO_DEF+5:
player->CLOSE_GOSSIP_MENU();
pBarnesAI->m_uiEventId = EVENT_RAJ;
- TC_LOG_INFO("scripts", "player (%s) manually set Opera event to EVENT_RAJ", player->GetGUID().ToString().c_str());
+ TC_LOG_DEBUG("scripts", "player (%s) manually set Opera event to EVENT_RAJ", player->GetGUID().ToString().c_str());
break;
}
diff --git a/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter1.cpp b/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter1.cpp
index 3db0e1092fd..326360428d2 100644
--- a/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter1.cpp
+++ b/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter1.cpp
@@ -174,7 +174,7 @@ public:
anchor->GetContactPoint(me, anchorX, anchorY, z, 1.0f);
playerGUID = target->GetGUID();
- Talk(SAY_EVENT_START);
+ Talk(SAY_EVENT_START, target);
}
void UpdateAI(uint32 diff) override
diff --git a/src/server/scripts/EasternKingdoms/SunkenTemple/sunken_temple.cpp b/src/server/scripts/EasternKingdoms/SunkenTemple/sunken_temple.cpp
index 3ced85f09a2..97be139cefe 100644
--- a/src/server/scripts/EasternKingdoms/SunkenTemple/sunken_temple.cpp
+++ b/src/server/scripts/EasternKingdoms/SunkenTemple/sunken_temple.cpp
@@ -36,19 +36,27 @@ EndContentData */
# at_malfurion_Stormrage_trigger
#####*/
-class at_malfurion_stormrage : public AreaTriggerScript
+enum MalfurionMisc
{
-public:
- at_malfurion_stormrage() : AreaTriggerScript("at_malfurion_stormrage") { }
+ NPC_MALFURION_STORMRAGE = 15362,
+ QUEST_ERANIKUS_TYRANT_OF_DREAMS = 8733,
+ QUEST_THE_CHARGE_OF_DRAGONFLIGHTS = 8555,
+};
- bool OnTrigger(Player* player, const AreaTriggerEntry* /*at*/) override
- {
- if (player->GetInstanceScript() && !player->FindNearestCreature(15362, 15))
- player->SummonCreature(15362, player->GetPositionX(), player->GetPositionY(), player->GetPositionZ(), -1.52f, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 100000);
- return false;
- }
+class at_malfurion_stormrage : public AreaTriggerScript
+{
+ public:
+ at_malfurion_stormrage() : AreaTriggerScript("at_malfurion_stormrage") { }
+ bool OnTrigger(Player* player, const AreaTriggerEntry* /*at*/) override
+ {
+ if (player->GetInstanceScript() && !player->FindNearestCreature(NPC_MALFURION_STORMRAGE, 15.0f) &&
+ player->GetQuestStatus(QUEST_THE_CHARGE_OF_DRAGONFLIGHTS) == QUEST_STATUS_REWARDED && player->GetQuestStatus(QUEST_ERANIKUS_TYRANT_OF_DREAMS) != QUEST_STATUS_REWARDED)
+ player->SummonCreature(NPC_MALFURION_STORMRAGE, player->GetPositionX(), player->GetPositionY(), player->GetPositionZ(), -1.52f, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 100000);
+ return false;
+ }
};
+
/*#####
# go_atalai_statue
#####*/
diff --git a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_muru.cpp b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_muru.cpp
index ea56494f0f9..421f3d771a0 100644
--- a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_muru.cpp
+++ b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_muru.cpp
@@ -207,7 +207,7 @@ public:
void DamageTaken(Unit* /*done_by*/, uint32 &damage) override
{
- if (damage > me->GetHealth() && events.IsInPhase(PHASE_ONE))
+ if (damage >= me->GetHealth() && events.IsInPhase(PHASE_ONE))
{
damage = 0;
me->RemoveAllAuras();
diff --git a/src/server/scripts/EasternKingdoms/ZulAman/boss_hexlord.cpp b/src/server/scripts/EasternKingdoms/ZulAman/boss_hexlord.cpp
index 01ac3920082..1a98c081570 100644
--- a/src/server/scripts/EasternKingdoms/ZulAman/boss_hexlord.cpp
+++ b/src/server/scripts/EasternKingdoms/ZulAman/boss_hexlord.cpp
@@ -689,54 +689,57 @@ class boss_alyson_antille : public CreatureScript
}
};
-struct boss_gazakrothAI : public boss_hexlord_addAI
+class boss_gazakroth : public CreatureScript
{
- boss_gazakrothAI(Creature* creature) : boss_hexlord_addAI(creature)
- {
- Initialize();
- }
-
- void Initialize()
- {
- firebolt_timer = 2000;
- }
+ public:
- uint32 firebolt_timer;
+ boss_gazakroth() : CreatureScript("boss_gazakroth") { }
+
+ struct boss_gazakrothAI : public boss_hexlord_addAI
+ {
+ boss_gazakrothAI(Creature* creature) : boss_hexlord_addAI(creature)
+ {
+ Initialize();
+ }
- void Reset() override
- {
- Initialize();
- boss_hexlord_addAI::Reset();
- }
+ void Initialize()
+ {
+ firebolt_timer = 2 * IN_MILLISECONDS;
+ }
+
+ void Reset() override
+ {
+ Initialize();
+ boss_hexlord_addAI::Reset();
+ }
- void AttackStart(Unit* who) override
- {
- if (!who)
- return;
+ void AttackStart(Unit* who) override
+ {
+ AttackStartCaster(who, 20.0f);
+ }
- if (who->isTargetableForAttack())
- {
- if (me->Attack(who, false))
+ void UpdateAI(uint32 diff) override
{
- me->GetMotionMaster()->MoveChase(who, 20);
- me->AddThreat(who, 0.0f);
+ if (!UpdateVictim())
+ return;
+
+ if (firebolt_timer <= diff)
+ {
+ DoCastVictim(SPELL_FIREBOLT, false);
+ firebolt_timer = 0.7 * IN_MILLISECONDS;
+ } else firebolt_timer -= diff;
+
+ boss_hexlord_addAI::UpdateAI(diff);
}
- }
- }
- void UpdateAI(uint32 diff) override
- {
- if (!UpdateVictim())
- return;
+ private:
+ uint32 firebolt_timer;
+ };
- if (firebolt_timer <= diff)
+ CreatureAI* GetAI(Creature* creature) const override
{
- DoCastVictim(SPELL_FIREBOLT, false);
- firebolt_timer = 700;
- } else firebolt_timer -= diff;
-
- boss_hexlord_addAI::UpdateAI(diff);
- }
+ return GetInstanceAI<boss_gazakrothAI>(creature);
+ }
};
class boss_lord_raadan : public CreatureScript
@@ -1062,7 +1065,7 @@ void AddSC_boss_hex_lord_malacrass()
{
new boss_hexlord_malacrass();
new boss_thurg();
- // new boss_gazakroth();
+ new boss_gazakroth();
new boss_lord_raadan();
new boss_darkheart();
new boss_slither();
diff --git a/src/server/scripts/EasternKingdoms/zone_redridge_mountains.cpp b/src/server/scripts/EasternKingdoms/zone_redridge_mountains.cpp
index 898e3f9a2cb..ecfd705cf4d 100644
--- a/src/server/scripts/EasternKingdoms/zone_redridge_mountains.cpp
+++ b/src/server/scripts/EasternKingdoms/zone_redridge_mountains.cpp
@@ -92,7 +92,7 @@ public:
me->SetWalk(false);
break;
case 115:
- player->AreaExploredOrEventHappens(QUEST_MISSING_IN_ACTION);
+ player->GroupEventHappens(QUEST_MISSING_IN_ACTION, me);
timer = 2000;
phase = 4;
break;
diff --git a/src/server/scripts/EasternKingdoms/zone_undercity.cpp b/src/server/scripts/EasternKingdoms/zone_undercity.cpp
index 9ce694fb76c..ca281bab60a 100644
--- a/src/server/scripts/EasternKingdoms/zone_undercity.cpp
+++ b/src/server/scripts/EasternKingdoms/zone_undercity.cpp
@@ -40,25 +40,44 @@ EndContentData */
enum Sylvanas
{
- QUEST_JOURNEY_TO_UNDERCITY = 9180,
- EMOTE_LAMENT_END = 0,
- SAY_LAMENT_END = 1,
+ QUEST_JOURNEY_TO_UNDERCITY = 9180,
- SOUND_CREDIT = 10896,
- ENTRY_HIGHBORNE_LAMENTER = 21628,
- ENTRY_HIGHBORNE_BUNNY = 21641,
+ EMOTE_LAMENT_END = 0,
+ SAY_LAMENT_END = 1,
+ EMOTE_LAMENT = 2,
- SPELL_HIGHBORNE_AURA = 37090,
- SPELL_SYLVANAS_CAST = 36568,
- SPELL_RIBBON_OF_SOULS = 34432, // the real one to use might be 37099
+ // Ambassador Sunsorrow
+ SAY_SUNSORROW_WHISPER = 0,
+
+ SOUND_CREDIT = 10896,
+
+ NPC_HIGHBORNE_LAMENTER = 21628,
+ NPC_HIGHBORNE_BUNNY = 21641,
+ NPC_AMBASSADOR_SUNSORROW = 16287,
+
+ SPELL_HIGHBORNE_AURA = 37090,
+ SPELL_SYLVANAS_CAST = 36568,
+ //SPELL_RIBBON_OF_SOULS = 34432, the real one to use might be 37099
+ SPELL_RIBBON_OF_SOULS = 37099,
// Combat spells
- SPELL_BLACK_ARROW = 59712,
- SPELL_FADE = 20672,
- SPELL_FADE_BLINK = 29211,
- SPELL_MULTI_SHOT = 59713,
- SPELL_SHOT = 59710,
- SPELL_SUMMON_SKELETON = 59711
+ SPELL_BLACK_ARROW = 59712,
+ SPELL_FADE = 20672,
+ SPELL_FADE_BLINK = 29211,
+ SPELL_MULTI_SHOT = 59713,
+ SPELL_SHOT = 59710,
+ SPELL_SUMMON_SKELETON = 59711,
+
+ // Events
+ EVENT_FADE = 1,
+ EVENT_SUMMON_SKELETON = 2,
+ EVENT_BLACK_ARROW = 3,
+ EVENT_SHOOT = 4,
+ EVENT_MULTI_SHOT = 5,
+ EVENT_LAMENT_OF_THE_HIGHBORN = 6,
+ EVENT_SUNSORROW_WHISPER = 7,
+
+ GUID_EVENT_INVOKER = 1,
};
float HighborneLoc[4][3]=
@@ -77,26 +96,14 @@ class npc_lady_sylvanas_windrunner : public CreatureScript
public:
npc_lady_sylvanas_windrunner() : CreatureScript("npc_lady_sylvanas_windrunner") { }
- bool OnQuestReward(Player* /*player*/, Creature* creature, const Quest *_Quest, uint32 /*slot*/) override
+ bool OnQuestReward(Player* player, Creature* creature, const Quest *_Quest, uint32 /*slot*/) override
{
if (_Quest->GetQuestId() == QUEST_JOURNEY_TO_UNDERCITY)
- {
- ENSURE_AI(npc_lady_sylvanas_windrunner::npc_lady_sylvanas_windrunnerAI, creature->AI())->LamentEvent = true;
- ENSURE_AI(npc_lady_sylvanas_windrunner::npc_lady_sylvanas_windrunnerAI, creature->AI())->DoPlaySoundToSet(creature, SOUND_CREDIT);
- creature->CastSpell(creature, SPELL_SYLVANAS_CAST, false);
-
- for (uint8 i = 0; i < 4; ++i)
- creature->SummonCreature(ENTRY_HIGHBORNE_LAMENTER, HighborneLoc[i][0], HighborneLoc[i][1], HIGHBORNE_LOC_Y, HighborneLoc[i][2], TEMPSUMMON_TIMED_DESPAWN, 160000);
- }
+ creature->AI()->SetGUID(player->GetGUID(), GUID_EVENT_INVOKER);
return true;
}
- CreatureAI* GetAI(Creature* creature) const override
- {
- return new npc_lady_sylvanas_windrunnerAI(creature);
- }
-
struct npc_lady_sylvanas_windrunnerAI : public ScriptedAI
{
npc_lady_sylvanas_windrunnerAI(Creature* creature) : ScriptedAI(creature)
@@ -106,41 +113,51 @@ public:
void Initialize()
{
- LamentEventTimer = 5000;
LamentEvent = false;
targetGUID.Clear();
-
- FadeTimer = 30000;
- SummonSkeletonTimer = 20000;
- BlackArrowTimer = 15000;
- ShotTimer = 8000;
- MultiShotTimer = 10000;
+ playerGUID.Clear();
}
- uint32 LamentEventTimer;
- bool LamentEvent;
- ObjectGuid targetGUID;
-
- uint32 FadeTimer;
- uint32 SummonSkeletonTimer;
- uint32 BlackArrowTimer;
- uint32 ShotTimer;
- uint32 MultiShotTimer;
-
void Reset() override
{
Initialize();
+ _events.Reset();
}
- void EnterCombat(Unit* /*who*/) override { }
+ void EnterCombat(Unit* /*who*/) override
+ {
+ _events.ScheduleEvent(EVENT_FADE, 30000);
+ _events.ScheduleEvent(EVENT_SUMMON_SKELETON, 20000);
+ _events.ScheduleEvent(EVENT_BLACK_ARROW, 15000);
+ _events.ScheduleEvent(EVENT_SHOOT, 8000);
+ _events.ScheduleEvent(EVENT_MULTI_SHOT, 10000);
+ }
+
+ void SetGUID(ObjectGuid guid, int32 type) override
+ {
+ if (type == GUID_EVENT_INVOKER)
+ {
+ Talk(EMOTE_LAMENT);
+ DoPlaySoundToSet(me, SOUND_CREDIT);
+ DoCast(me, SPELL_SYLVANAS_CAST, false);
+ playerGUID = guid;
+ LamentEvent = true;
+
+ for (uint8 i = 0; i < 4; ++i)
+ me->SummonCreature(NPC_HIGHBORNE_LAMENTER, HighborneLoc[i][0], HighborneLoc[i][1], HIGHBORNE_LOC_Y, HighborneLoc[i][2], TEMPSUMMON_TIMED_DESPAWN, 160000);
+
+ _events.ScheduleEvent(EVENT_LAMENT_OF_THE_HIGHBORN, 2000);
+ _events.ScheduleEvent(EVENT_SUNSORROW_WHISPER, 10000);
+ }
+ }
void JustSummoned(Creature* summoned) override
{
- if (summoned->GetEntry() == ENTRY_HIGHBORNE_BUNNY)
+ if (summoned->GetEntry() == NPC_HIGHBORNE_BUNNY)
{
if (Creature* target = ObjectAccessor::GetCreature(*summoned, targetGUID))
{
- target->MonsterMoveWithSpeed(target->GetPositionX(), target->GetPositionY(), me->GetPositionZ()+15.0f, 0);
+ target->GetMotionMaster()->MoveJump(target->GetPositionX(), target->GetPositionY(), me->GetPositionZ() + 15.0f, 0);
target->SetPosition(target->GetPositionX(), target->GetPositionY(), me->GetPositionZ()+15.0f, 0.0f);
summoned->CastSpell(target, SPELL_RIBBON_OF_SOULS, false);
}
@@ -152,75 +169,86 @@ public:
void UpdateAI(uint32 diff) override
{
- if (LamentEvent)
- {
- if (LamentEventTimer <= diff)
- {
- DoSummon(ENTRY_HIGHBORNE_BUNNY, me, 10.0f, 3000, TEMPSUMMON_TIMED_DESPAWN);
-
- LamentEventTimer = 2000;
- if (!me->HasAura(SPELL_SYLVANAS_CAST))
- {
- Talk(SAY_LAMENT_END);
- Talk(EMOTE_LAMENT_END);
- LamentEvent = false;
- }
- } else LamentEventTimer -= diff;
- }
-
- if (!UpdateVictim())
+ if (!UpdateVictim() && !LamentEvent)
return;
- // Combat spells
-
- if (FadeTimer <= diff)
- {
- DoCast(me, SPELL_FADE);
- // add a blink to simulate a stealthed movement and reappearing elsewhere
- DoCast(me, SPELL_FADE_BLINK);
- FadeTimer = 30000 + rand32() % 5000;
- // if the victim is out of melee range she cast multi shot
- if (Unit* victim = me->GetVictim())
- if (me->GetDistance(victim) > 10.0f)
- DoCast(victim, SPELL_MULTI_SHOT);
- } else FadeTimer -= diff;
-
- if (SummonSkeletonTimer <= diff)
- {
- DoCast(me, SPELL_SUMMON_SKELETON);
- SummonSkeletonTimer = 20000 + rand32() % 10000;
- } else SummonSkeletonTimer -= diff;
-
- if (BlackArrowTimer <= diff)
- {
- if (Unit* victim = me->GetVictim())
- {
- DoCast(victim, SPELL_BLACK_ARROW);
- BlackArrowTimer = 15000 + rand32() % 5000;
- }
- } else BlackArrowTimer -= diff;
+ _events.Update(diff);
- if (ShotTimer <= diff)
- {
- if (Unit* victim = me->GetVictim())
- {
- DoCast(victim, SPELL_SHOT);
- ShotTimer = 8000 + rand32() % 2000;
- }
- } else ShotTimer -= diff;
+ if (me->HasUnitState(UNIT_STATE_CASTING))
+ return;
- if (MultiShotTimer <= diff)
+ while (uint32 eventId = _events.ExecuteEvent())
{
- if (Unit* victim = me->GetVictim())
+ switch (eventId)
{
- DoCast(victim, SPELL_MULTI_SHOT);
- MultiShotTimer = 10000 + rand32() % 3000;
+ case EVENT_FADE:
+ DoCast(me, SPELL_FADE);
+ // add a blink to simulate a stealthed movement and reappearing elsewhere
+ DoCast(me, SPELL_FADE_BLINK);
+ // if the victim is out of melee range she cast multi shot
+ if (Unit* victim = me->GetVictim())
+ if (me->GetDistance(victim) > 10.0f)
+ DoCast(victim, SPELL_MULTI_SHOT);
+ _events.ScheduleEvent(EVENT_FADE, urand(30000, 35000));
+ break;
+ case EVENT_SUMMON_SKELETON:
+ DoCast(me, SPELL_SUMMON_SKELETON);
+ _events.ScheduleEvent(EVENT_SUMMON_SKELETON, urand(20000, 30000));
+ break;
+ case EVENT_BLACK_ARROW:
+ if (Unit* victim = me->GetVictim())
+ DoCast(victim, SPELL_BLACK_ARROW);
+ _events.ScheduleEvent(EVENT_BLACK_ARROW, urand(15000, 20000));
+ break;
+ case EVENT_SHOOT:
+ if (Unit* victim = me->GetVictim())
+ DoCast(victim, SPELL_SHOT);
+ _events.ScheduleEvent(EVENT_SHOOT, urand(8000, 10000));
+ break;
+ case EVENT_MULTI_SHOT:
+ if (Unit* victim = me->GetVictim())
+ DoCast(victim, SPELL_MULTI_SHOT);
+ _events.ScheduleEvent(EVENT_MULTI_SHOT, urand(10000, 13000));
+ break;
+ case EVENT_LAMENT_OF_THE_HIGHBORN:
+ if (!me->HasAura(SPELL_SYLVANAS_CAST))
+ {
+ Talk(SAY_LAMENT_END);
+ Talk(EMOTE_LAMENT_END);
+ LamentEvent = false;
+ me->HandleEmoteCommand(EMOTE_ONESHOT_KNEEL);
+ Reset();
+ }
+ else
+ {
+ DoSummon(NPC_HIGHBORNE_BUNNY, me, 10.0f, 3000, TEMPSUMMON_TIMED_DESPAWN);
+ _events.ScheduleEvent(EVENT_LAMENT_OF_THE_HIGHBORN, 2000);
+ }
+ break;
+ case EVENT_SUNSORROW_WHISPER:
+ if (Creature* ambassador = me->FindNearestCreature(NPC_AMBASSADOR_SUNSORROW, 20.0f))
+ if (Player* player = ObjectAccessor::GetPlayer(*me, playerGUID))
+ ambassador->AI()->Talk(SAY_SUNSORROW_WHISPER, player);
+ break;
+ default:
+ break;
}
- } else MultiShotTimer -= diff;
+ }
DoMeleeAttackIfReady();
}
+
+ private:
+ EventMap _events;
+ bool LamentEvent;
+ ObjectGuid targetGUID;
+ ObjectGuid playerGUID;
};
+
+ CreatureAI* GetAI(Creature* creature) const override
+ {
+ return new npc_lady_sylvanas_windrunnerAI(creature);
+ }
};
/*######
diff --git a/src/server/scripts/Kalimdor/CMakeLists.txt b/src/server/scripts/Kalimdor/CMakeLists.txt
index 9a68973b8d1..ce8d0cfbcfd 100644
--- a/src/server/scripts/Kalimdor/CMakeLists.txt
+++ b/src/server/scripts/Kalimdor/CMakeLists.txt
@@ -92,7 +92,6 @@ set(scripts_STAT_SRCS
Kalimdor/RuinsOfAhnQiraj/boss_moam.cpp
Kalimdor/RuinsOfAhnQiraj/ruins_of_ahnqiraj.h
Kalimdor/RuinsOfAhnQiraj/boss_kurinnaxx.cpp
- Kalimdor/zone_mulgore.cpp
Kalimdor/zone_bloodmyst_isle.cpp
Kalimdor/zone_thunder_bluff.cpp
Kalimdor/zone_azshara.cpp
diff --git a/src/server/scripts/Kalimdor/RazorfenKraul/razorfen_kraul.cpp b/src/server/scripts/Kalimdor/RazorfenKraul/razorfen_kraul.cpp
index a7c17a9df3e..f4a7e1f4185 100644
--- a/src/server/scripts/Kalimdor/RazorfenKraul/razorfen_kraul.cpp
+++ b/src/server/scripts/Kalimdor/RazorfenKraul/razorfen_kraul.cpp
@@ -136,131 +136,7 @@ public:
}
};
-enum SnufflenoseGopher
-{
- NPC_SNUFFLENOSE_GOPHER = 4781,
- GO_BLUELEAF_TUBBER = 20920,
- ACTION_FIND_NEW_TUBBER = 0,
- POINT_TUBBER = 0
-};
-
-struct npc_snufflenose_gopher : public CreatureScript
-{
-public:
- npc_snufflenose_gopher() : CreatureScript("npc_snufflenose_gopher") { }
-
- CreatureAI* GetAI(Creature* creature) const override
- {
- return new npc_snufflenose_gopherAI(creature);
- }
-
- struct npc_snufflenose_gopherAI : public PetAI
- {
- npc_snufflenose_gopherAI(Creature* creature) : PetAI(creature)
- {
- IsMovementActive = false;
- }
-
- void Reset() override
- {
- IsMovementActive = false;
- TargetTubberGUID.Clear();
- }
-
- void MovementInform(uint32 type, uint32 id) override
- {
- if (type == POINT_MOTION_TYPE && id == POINT_TUBBER)
- {
- if (GameObject* go = me->GetMap()->GetGameObject(TargetTubberGUID))
- {
- go->SetRespawnTime(5 * MINUTE);
- go->Refresh();
- go->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_INTERACT_COND);
- }
-
- IsMovementActive = false;
- }
- else
- PetAI::MovementInform(type, id);
- }
-
- void DoFindNewTubber()
- {
- std::list<GameObject*> tubbersInRange;
- GetGameObjectListWithEntryInGrid(tubbersInRange, me, GO_BLUELEAF_TUBBER, 40.0f);
-
- if (tubbersInRange.empty())
- return;
-
- tubbersInRange.remove_if([](GameObject* go)
- {
- return go->isSpawned() || !go->HasFlag(GAMEOBJECT_FLAGS, GO_FLAG_INTERACT_COND);
- });
-
- tubbersInRange.sort(Trinity::ObjectDistanceOrderPred(me));
-
- GameObject* nearestTubber = tubbersInRange.front();
- if (!nearestTubber)
- return;
-
- TargetTubberGUID = nearestTubber->GetGUID();
-
- // XFurry was wrong...
- me->GetMotionMaster()->MovePoint(POINT_TUBBER, nearestTubber->GetPositionX(),
- nearestTubber->GetPositionY(),
- nearestTubber->GetPositionZ());
- IsMovementActive = true;
- }
-
- void UpdateAI(uint32 diff) override
- {
- if (!IsMovementActive)
- PetAI::UpdateAI(diff);
- }
-
- void DoAction(int32 action) override
- {
- if (action == ACTION_FIND_NEW_TUBBER)
- DoFindNewTubber();
- }
-
-
- bool IsMovementActive;
- ObjectGuid TargetTubberGUID;
- };
-};
-
-class spell_snufflenose_command : public SpellScriptLoader
-{
- public:
- spell_snufflenose_command() : SpellScriptLoader("spell_snufflenose_command") { }
-
- class spell_snufflenose_commandSpellScript : public SpellScript
- {
- PrepareSpellScript(spell_snufflenose_commandSpellScript);
-
- void HandleEffect(SpellEffIndex /*effIndex*/)
- {
- if (Creature* target = GetHitCreature())
- if (target->GetEntry() == NPC_SNUFFLENOSE_GOPHER)
- target->AI()->DoAction(ACTION_FIND_NEW_TUBBER);
- }
-
- void Register() override
- {
- OnEffectHitTarget += SpellEffectFn(spell_snufflenose_commandSpellScript::HandleEffect, EFFECT_0, SPELL_EFFECT_DUMMY);
- }
- };
-
- SpellScript* GetSpellScript() const override
- {
- return new spell_snufflenose_commandSpellScript();
- }
-};
-
void AddSC_razorfen_kraul()
{
- new npc_snufflenose_gopher();
new npc_willix();
- new spell_snufflenose_command();
}
diff --git a/src/server/scripts/Kalimdor/zone_bloodmyst_isle.cpp b/src/server/scripts/Kalimdor/zone_bloodmyst_isle.cpp
index 390fd3e529f..ca5e4697c35 100644
--- a/src/server/scripts/Kalimdor/zone_bloodmyst_isle.cpp
+++ b/src/server/scripts/Kalimdor/zone_bloodmyst_isle.cpp
@@ -29,6 +29,7 @@ EndContentData */
#include "ScriptMgr.h"
#include "ScriptedCreature.h"
+#include "PassiveAI.h"
#include "Player.h"
/*######
@@ -48,14 +49,18 @@ class npc_webbed_creature : public CreatureScript
public:
npc_webbed_creature() : CreatureScript("npc_webbed_creature") { }
- struct npc_webbed_creatureAI : public ScriptedAI
+ struct npc_webbed_creatureAI : public NullCreatureAI
{
- npc_webbed_creatureAI(Creature* creature) : ScriptedAI(creature) { }
+ npc_webbed_creatureAI(Creature* creature) : NullCreatureAI(creature) { }
void Reset() override { }
void EnterCombat(Unit* /*who*/) override { }
+ void AttackStart(Unit* /*who*/) override { }
+
+ void MoveInLineOfSight(Unit* /*who*/) override { }
+
void JustDied(Unit* killer) override
{
uint32 spawnCreatureID = 0;
diff --git a/src/server/scripts/Kalimdor/zone_felwood.cpp b/src/server/scripts/Kalimdor/zone_felwood.cpp
index cdf04b1d4cc..91b9ce08010 100644
--- a/src/server/scripts/Kalimdor/zone_felwood.cpp
+++ b/src/server/scripts/Kalimdor/zone_felwood.cpp
@@ -100,7 +100,44 @@ public:
}
};
+/*######
+## at_ancient_leaf
+######*/
+
+enum AncientMisc
+{
+ QUEST_ANCIENT_LEAF = 7632,
+ NPC_VARTRUS = 14524,
+ NPC_STOMA = 14525,
+ NPC_HASTAT = 14526,
+ CREATURE_GROUP_ANCIENTS = 1
+};
+
+class at_ancient_leaf : public AreaTriggerScript
+{
+ public:
+ at_ancient_leaf() : AreaTriggerScript("at_ancient_leaf") { }
+
+ bool OnTrigger(Player* player, AreaTriggerEntry const* /*trigger*/) override
+ {
+ if (player->IsGameMaster() || !player->IsAlive())
+ return false;
+
+ // Handle Call Ancients event start - The area trigger summons 3 ancients
+ if ((player->GetQuestStatus(QUEST_ANCIENT_LEAF) == QUEST_STATUS_COMPLETE) || (player->GetQuestStatus(QUEST_ANCIENT_LEAF) == QUEST_STATUS_REWARDED))
+ {
+ // If ancients are already spawned, skip the rest
+ if (GetClosestCreatureWithEntry(player, NPC_VARTRUS, 50.0f) || GetClosestCreatureWithEntry(player, NPC_STOMA, 50.0f) || GetClosestCreatureWithEntry(player, NPC_HASTAT, 50.0f))
+ return true;
+
+ player->GetMap()->SummonCreatureGroup(CREATURE_GROUP_ANCIENTS);
+ }
+ return false;
+ }
+};
+
void AddSC_felwood()
{
new npcs_riverbreeze_and_silversky();
+ new at_ancient_leaf();
}
diff --git a/src/server/scripts/Kalimdor/zone_mulgore.cpp b/src/server/scripts/Kalimdor/zone_mulgore.cpp
deleted file mode 100644
index 0d0ef218885..00000000000
--- a/src/server/scripts/Kalimdor/zone_mulgore.cpp
+++ /dev/null
@@ -1,306 +0,0 @@
-/*
- * Copyright (C) 2008-2015 TrinityCore <http://www.trinitycore.org/>
- * Copyright (C) 2006-2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
- *
- * 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/>.
- */
-
-/* ScriptData
-SDName: Mulgore
-SD%Complete: 100
-SDComment: Support for quest: 11129, 772
-SDCategory: Mulgore
-EndScriptData */
-
-/* ContentData
-npc_kyle_frenzied
-npc_plains_vision
-EndContentData */
-
-#include "ScriptMgr.h"
-#include "ScriptedCreature.h"
-#include "ScriptedGossip.h"
-#include "Player.h"
-#include "SpellInfo.h"
-
-/*#####
-# npc_kyle_frenzied
-######*/
-
-enum KyleFrenzied
-{
- EMOTE_SEE_LUNCH = 0,
- EMOTE_EAT_LUNCH = 1,
- EMOTE_DANCE = 2,
-
- SPELL_LUNCH = 42222,
- NPC_KYLE_FRENZIED = 23616,
- NPC_KYLE_FRIENDLY = 23622,
- POINT_ID = 1
-};
-
-class npc_kyle_frenzied : public CreatureScript
-{
-public:
- npc_kyle_frenzied() : CreatureScript("npc_kyle_frenzied") { }
-
- CreatureAI* GetAI(Creature* creature) const override
- {
- return new npc_kyle_frenziedAI(creature);
- }
-
- struct npc_kyle_frenziedAI : public ScriptedAI
- {
- npc_kyle_frenziedAI(Creature* creature) : ScriptedAI(creature)
- {
- Initialize();
- }
-
- void Initialize()
- {
- EventActive = false;
- IsMovingToLunch = false;
- PlayerGUID.Clear();
- EventTimer = 5000;
- EventPhase = 0;
- }
-
- bool EventActive;
- bool IsMovingToLunch;
- ObjectGuid PlayerGUID;
- uint32 EventTimer;
- uint8 EventPhase;
-
- void Reset() override
- {
- Initialize();
-
- if (me->GetEntry() == NPC_KYLE_FRIENDLY)
- me->UpdateEntry(NPC_KYLE_FRENZIED);
- }
-
- void SpellHit(Unit* Caster, SpellInfo const* Spell) override
- {
- if (!me->GetVictim() && !EventActive && Spell->Id == SPELL_LUNCH)
- {
- if (Caster->GetTypeId() == TYPEID_PLAYER)
- PlayerGUID = Caster->GetGUID();
-
- if (me->GetMotionMaster()->GetCurrentMovementGeneratorType() == WAYPOINT_MOTION_TYPE)
- {
- me->GetMotionMaster()->MovementExpired();
- me->GetMotionMaster()->MoveIdle();
- me->StopMoving();
- }
-
- EventActive = true;
- Talk(EMOTE_SEE_LUNCH);
- me->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_ONESHOT_CREATURE_SPECIAL);
- }
- }
-
- void MovementInform(uint32 Type, uint32 PointId) override
- {
- if (Type != POINT_MOTION_TYPE || !EventActive)
- return;
-
- if (PointId == POINT_ID)
- IsMovingToLunch = false;
- }
-
- void UpdateAI(uint32 diff) override
- {
- if (EventActive)
- {
- if (IsMovingToLunch)
- return;
-
- if (EventTimer <= diff)
- {
- EventTimer = 5000;
- ++EventPhase;
-
- switch (EventPhase)
- {
- case 1:
- if (Unit* unit = ObjectAccessor::GetUnit(*me, PlayerGUID))
- {
- if (GameObject* go = unit->GetGameObject(SPELL_LUNCH))
- {
- IsMovingToLunch = true;
- me->GetMotionMaster()->MovePoint(POINT_ID, go->GetPositionX(), go->GetPositionY(), go->GetPositionZ());
- }
- }
- break;
- case 2:
- Talk(EMOTE_EAT_LUNCH);
- me->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_STATE_USE_STANDING);
- break;
- case 3:
- if (Player* unit = ObjectAccessor::GetPlayer(*me, PlayerGUID))
- unit->TalkedToCreature(me->GetEntry(), me->GetGUID());
-
- me->UpdateEntry(NPC_KYLE_FRIENDLY);
- break;
- case 4:
- EventTimer = 30000;
- Talk(EMOTE_DANCE);
- me->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_STATE_DANCESPECIAL);
- break;
- case 5:
- me->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_STATE_NONE);
- Reset();
- me->GetMotionMaster()->Clear();
- break;
- }
- }
- else
- EventTimer -= diff;
- }
- }
- };
-
-};
-
-/*#####
-# npc_plains_vision
-######*/
-
-Position const wpPlainVision[50] =
-{
- {-2226.32f, -408.095f, -9.36235f, 0.0f},
- {-2203.04f, -437.212f, -5.72498f, 0.0f},
- {-2163.91f, -457.851f, -7.09049f, 0.0f},
- {-2123.87f, -448.137f, -9.29591f, 0.0f},
- {-2104.66f, -427.166f, -6.49513f, 0.0f},
- {-2101.48f, -422.826f, -5.3567f, 0.0f},
- {-2097.56f, -417.083f, -7.16716f, 0.0f},
- {-2084.87f, -398.626f, -9.88973f, 0.0f},
- {-2072.71f, -382.324f, -10.2488f, 0.0f},
- {-2054.05f, -356.728f, -6.22468f, 0.0f},
- {-2051.8f, -353.645f, -5.35791f, 0.0f},
- {-2049.08f, -349.912f, -6.15723f, 0.0f},
- {-2030.6f, -310.724f, -9.59302f, 0.0f},
- {-2002.15f, -249.308f, -10.8124f, 0.0f},
- {-1972.85f, -195.811f, -10.6316f, 0.0f},
- {-1940.93f, -147.652f, -11.7055f, 0.0f},
- {-1888.06f, -81.943f, -11.4404f, 0.0f},
- {-1837.05f, -34.0109f, -12.258f, 0.0f},
- {-1796.12f, -14.6462f, -10.3581f, 0.0f},
- {-1732.61f, -4.27746f, -10.0213f, 0.0f},
- {-1688.94f, -0.829945f, -11.7103f, 0.0f},
- {-1681.32f, 13.0313f, -9.48056f, 0.0f},
- {-1677.04f, 36.8349f, -7.10318f, 0.0f},
- {-1675.2f, 68.559f, -8.95384f, 0.0f},
- {-1676.57f, 89.023f, -9.65104f, 0.0f},
- {-1678.16f, 110.939f, -10.1782f, 0.0f},
- {-1677.86f, 128.681f, -5.73869f, 0.0f},
- {-1675.27f, 144.324f, -3.47916f, 0.0f},
- {-1671.7f, 163.169f, -1.23098f, 0.0f},
- {-1666.61f, 181.584f, 5.26145f, 0.0f},
- {-1661.51f, 196.154f, 8.95252f, 0.0f},
- {-1655.47f, 210.811f, 8.38727f, 0.0f},
- {-1647.07f, 226.947f, 5.27755f, 0.0f},
- {-1621.65f, 232.91f, 2.69579f, 0.0f},
- {-1600.23f, 237.641f, 2.98539f, 0.0f},
- {-1576.07f, 242.546f, 4.66541f, 0.0f},
- {-1554.57f, 248.494f, 6.60377f, 0.0f},
- {-1547.53f, 259.302f, 10.6741f, 0.0f},
- {-1541.7f, 269.847f, 16.4418f, 0.0f},
- {-1539.83f, 278.989f, 21.0597f, 0.0f},
- {-1540.16f, 290.219f, 27.8247f, 0.0f},
- {-1538.99f, 298.983f, 34.0032f, 0.0f},
- {-1540.38f, 307.337f, 41.3557f, 0.0f},
- {-1536.61f, 314.884f, 48.0179f, 0.0f},
- {-1532.42f, 323.277f, 55.6667f, 0.0f},
- {-1528.77f, 329.774f, 61.1525f, 0.0f},
- {-1525.65f, 333.18f, 63.2161f, 0.0f},
- {-1517.01f, 350.713f, 62.4286f, 0.0f},
- {-1511.39f, 362.537f, 62.4539f, 0.0f},
- {-1508.68f, 366.822f, 62.733f, 0.0f}
-};
-
-class npc_plains_vision : public CreatureScript
-{
-public:
- npc_plains_vision() : CreatureScript("npc_plains_vision") { }
-
- CreatureAI* GetAI(Creature* creature) const override
- {
- return new npc_plains_visionAI(creature);
- }
-
- struct npc_plains_visionAI : public ScriptedAI
- {
- npc_plains_visionAI(Creature* creature) : ScriptedAI(creature)
- {
- Initialize();
- }
-
- void Initialize()
- {
- WayPointId = 0;
- newWaypoint = true;
- amountWP = 49;
- }
-
- bool newWaypoint;
- uint8 WayPointId;
- uint8 amountWP;
-
- void Reset() override
- {
- Initialize();
- }
-
- void EnterCombat(Unit* /*who*/) override { }
-
- void MovementInform(uint32 type, uint32 id) override
- {
- if (type != POINT_MOTION_TYPE)
- return;
-
- if (id < amountWP)
- {
- ++WayPointId;
- newWaypoint = true;
- }
- else
- {
- me->setDeathState(JUST_DIED);
- me->RemoveCorpse();
- }
- }
-
- void UpdateAI(uint32 /*diff*/) override
- {
- if (newWaypoint)
- {
- me->GetMotionMaster()->MovePoint(WayPointId, wpPlainVision[WayPointId]);
- newWaypoint = false;
- }
- }
- };
-
-};
-
-/*#####
-#
-######*/
-
-void AddSC_mulgore()
-{
- new npc_kyle_frenzied();
- new npc_plains_vision();
-}
diff --git a/src/server/scripts/Kalimdor/zone_the_barrens.cpp b/src/server/scripts/Kalimdor/zone_the_barrens.cpp
index c167bc700f7..eab104d8df2 100644
--- a/src/server/scripts/Kalimdor/zone_the_barrens.cpp
+++ b/src/server/scripts/Kalimdor/zone_the_barrens.cpp
@@ -659,6 +659,7 @@ public:
if (quest->GetQuestId() == QUEST_ESCAPE)
{
creature->setFaction(FACTION_RATCHET);
+ creature->AI()->Talk(SAY_START);
if (npc_escortAI* pEscortAI = CAST_AI(npc_wizzlecrank_shredder::npc_wizzlecrank_shredderAI, creature->AI()))
pEscortAI->Start(true, false, player->GetGUID());
}
diff --git a/src/server/scripts/Northrend/CMakeLists.txt b/src/server/scripts/Northrend/CMakeLists.txt
index e04dcf0ec96..66d9021223f 100644
--- a/src/server/scripts/Northrend/CMakeLists.txt
+++ b/src/server/scripts/Northrend/CMakeLists.txt
@@ -78,8 +78,7 @@ set(scripts_STAT_SRCS
Northrend/Nexus/Oculus/boss_urom.cpp
Northrend/Nexus/Oculus/oculus.cpp
Northrend/Nexus/Oculus/instance_oculus.cpp
- Northrend/Nexus/Nexus/boss_commander_kolurg.cpp
- Northrend/Nexus/Nexus/boss_commander_stoutbeard.cpp
+ Northrend/Nexus/Nexus/boss_nexus_commanders.cpp
Northrend/Nexus/Nexus/boss_ormorok.cpp
Northrend/Nexus/Nexus/boss_magus_telestra.cpp
Northrend/Nexus/Nexus/instance_nexus.cpp
diff --git a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/instance_trial_of_the_crusader.cpp b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/instance_trial_of_the_crusader.cpp
index 4f883fd7e90..23bfd773a9b 100644
--- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/instance_trial_of_the_crusader.cpp
+++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/instance_trial_of_the_crusader.cpp
@@ -255,12 +255,6 @@ class instance_trial_of_the_crusader : public InstanceMapScript
if (GetBossState(BOSS_VALKIRIES) == SPECIAL)
state = DONE;
break;
- case DONE:
- if (instance->GetPlayers().getFirst()->GetSource()->GetTeam() == ALLIANCE)
- EventStage = 4020;
- else
- EventStage = 4030;
- break;
default:
break;
}
@@ -336,7 +330,7 @@ class instance_trial_of_the_crusader : public InstanceMapScript
if (type < MAX_ENCOUNTERS)
{
- TC_LOG_INFO("scripts", "[ToCr] BossState(type %u) %u = state %u;", type, GetBossState(type), state);
+ TC_LOG_DEBUG("scripts", "[ToCr] BossState(type %u) %u = state %u;", type, GetBossState(type), state);
if (state == FAIL)
{
if (instance->IsHeroic())
diff --git a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/trial_of_the_crusader.cpp b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/trial_of_the_crusader.cpp
index 16526b694e9..974bd4672f1 100644
--- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/trial_of_the_crusader.cpp
+++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/trial_of_the_crusader.cpp
@@ -133,7 +133,7 @@ class npc_announcer_toc10 : public CreatureScript
char const* _message = "We are ready!";
- if (player->IsInCombat() || instance->IsEncounterInProgress() || instance->GetData(TYPE_EVENT))
+ if (player->IsInCombat() || instance->IsEncounterInProgress())
return true;
uint8 i = 0;
@@ -199,17 +199,11 @@ class npc_announcer_toc10 : public CreatureScript
}
else if (instance->GetBossState(BOSS_LICH_KING) != DONE)
{
- if (GameObject* floor = ObjectAccessor::GetGameObject(*player, instance->GetGuidData(GO_ARGENT_COLISEUM_FLOOR)))
- floor->SetDestructibleState(GO_DESTRUCTIBLE_DAMAGED);
-
- creature->CastSpell(creature, SPELL_CORPSE_TELEPORT, false);
- creature->CastSpell(creature, SPELL_DESTROY_FLOOR_KNOCKUP, false);
-
- if (!ObjectAccessor::GetCreature(*creature, instance->GetGuidData(NPC_ANUBARAK)))
- creature->SummonCreature(NPC_ANUBARAK, AnubarakLoc[0], TEMPSUMMON_CORPSE_TIMED_DESPAWN, DESPAWN_TIME);
-
- if (creature->IsVisible())
- creature->SetVisible(false);
+ if (creature->GetMap()->GetPlayers().getFirst()->GetSource()->GetTeam() == ALLIANCE)
+ instance->SetData(TYPE_EVENT, 4020);
+ else
+ instance->SetData(TYPE_EVENT, 4030);
+ instance->SetBossState(BOSS_LICH_KING, NOT_STARTED);
}
creature->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP);
return true;
diff --git a/src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/boss_bronjahm.cpp b/src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/boss_bronjahm.cpp
index 97c4372f0e6..0b829c2c6dd 100644
--- a/src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/boss_bronjahm.cpp
+++ b/src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/boss_bronjahm.cpp
@@ -27,7 +27,7 @@ enum Yells
SAY_SLAY = 1,
SAY_DEATH = 2,
SAY_SOUL_STORM = 3,
- SAY_CORRUPT_SOUL = 4,
+ SAY_CORRUPT_SOUL = 4
};
enum Spells
@@ -39,9 +39,9 @@ enum Spells
SPELL_TELEPORT = 68988,
SPELL_FEAR = 68950,
SPELL_SOULSTORM = 68872,
- SPELL_SOULSTORM_CHANNEL = 69008, // pre-fight
- SPELL_SOULSTORM_VISUAL = 68870, // pre-cast soulstorm
- SPELL_PURPLE_BANISH_VISUAL = 68862 // Used by Soul Fragment (Aura)
+ SPELL_SOULSTORM_CHANNEL = 69008, // Pre-fight
+ SPELL_SOULSTORM_VISUAL = 68870, // Pre-cast Soulstorm
+ SPELL_PURPLE_BANISH_VISUAL = 68862 // Used by Soul Fragment (Aura)
};
enum Events
@@ -50,7 +50,7 @@ enum Events
EVENT_SHADOW_BOLT = 2,
EVENT_CORRUPT_SOUL = 3,
EVENT_SOULSTORM = 4,
- EVENT_FEAR = 5,
+ EVENT_FEAR = 5
};
enum CombatPhases
@@ -59,6 +59,11 @@ enum CombatPhases
PHASE_2 = 2
};
+enum Misc
+{
+ DATA_SOUL_POWER = 1
+};
+
class boss_bronjahm : public CreatureScript
{
public:
@@ -73,33 +78,30 @@ class boss_bronjahm : public CreatureScript
void Reset() override
{
- events.Reset();
+ _Reset();
events.SetPhase(PHASE_1);
events.ScheduleEvent(EVENT_SHADOW_BOLT, 2000);
events.ScheduleEvent(EVENT_MAGIC_BANE, urand(8000, 20000));
events.ScheduleEvent(EVENT_CORRUPT_SOUL, urand(25000, 35000), 0, PHASE_1);
-
- instance->SetBossState(DATA_BRONJAHM, NOT_STARTED);
}
- void JustReachedHome() override
- {
- DoCast(me, SPELL_SOULSTORM_CHANNEL, true);
- }
+ void JustReachedHome() override
+ {
+ _JustReachedHome();
+ DoCast(me, SPELL_SOULSTORM_CHANNEL, true);
+ }
void EnterCombat(Unit* /*who*/) override
{
+ _EnterCombat();
Talk(SAY_AGGRO);
me->RemoveAurasDueToSpell(SPELL_SOULSTORM_CHANNEL);
-
- instance->SetBossState(DATA_BRONJAHM, IN_PROGRESS);
}
void JustDied(Unit* /*killer*/) override
{
+ _JustDied();
Talk(SAY_DEATH);
-
- instance->SetBossState(DATA_BRONJAHM, DONE);
}
void KilledUnit(Unit* who) override
@@ -128,6 +130,23 @@ class boss_bronjahm : public CreatureScript
summon->CastSpell(summon, SPELL_PURPLE_BANISH_VISUAL, true);
}
+ uint32 GetData(uint32 type) const override
+ {
+ if (type == DATA_SOUL_POWER)
+ {
+ uint32 count = 0;
+ for (ObjectGuid const& guid : summons)
+ {
+ if (Creature* summon = ObjectAccessor::GetCreature(*me, guid))
+ if (summon->GetEntry() == NPC_CORRUPTED_SOUL_FRAGMENT && summon->IsAlive())
+ ++count;
+ }
+ return count;
+ }
+
+ return 0;
+ }
+
void UpdateAI(uint32 diff) override
{
if (!UpdateVictim())
@@ -143,13 +162,21 @@ class boss_bronjahm : public CreatureScript
switch (eventId)
{
case EVENT_MAGIC_BANE:
- DoCastVictim(SPELL_MAGIC_S_BANE);
+ DoCastAOE(SPELL_MAGIC_S_BANE);
events.ScheduleEvent(EVENT_MAGIC_BANE, urand(8000, 20000));
break;
case EVENT_SHADOW_BOLT:
- if (!me->IsWithinMeleeRange(me->GetVictim()))
+ if (events.IsInPhase(PHASE_2))
+ {
DoCastVictim(SPELL_SHADOW_BOLT);
- events.ScheduleEvent(EVENT_SHADOW_BOLT, 2000);
+ events.ScheduleEvent(EVENT_SHADOW_BOLT, urand(1, 2) * IN_MILLISECONDS);
+ }
+ else
+ {
+ if (!me->IsWithinMeleeRange(me->GetVictim()))
+ DoCastVictim(SPELL_SHADOW_BOLT);
+ events.ScheduleEvent(EVENT_SHADOW_BOLT, 2 * IN_MILLISECONDS);
+ }
break;
case EVENT_CORRUPT_SOUL:
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1, 0.0f, true))
@@ -165,8 +192,7 @@ class boss_bronjahm : public CreatureScript
me->CastSpell(me, SPELL_SOULSTORM, false);
break;
case EVENT_FEAR:
- if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1, 0.0f, true))
- me->CastCustomSpell(SPELL_FEAR, SPELLVALUE_MAX_TARGETS, 1, target, false);
+ me->CastCustomSpell(SPELL_FEAR, SPELLVALUE_MAX_TARGETS, 1, nullptr, false);
events.ScheduleEvent(EVENT_FEAR, urand(8000, 12000), 0, PHASE_2);
break;
default:
@@ -174,7 +200,8 @@ class boss_bronjahm : public CreatureScript
}
}
- DoMeleeAttackIfReady();
+ if (!events.IsInPhase(PHASE_2))
+ DoMeleeAttackIfReady();
}
};
@@ -201,17 +228,11 @@ class npc_corrupted_soul_fragment : public CreatureScript
if (type != CHASE_MOTION_TYPE)
return;
- if (TempSummon* summ = me->ToTempSummon())
- {
- ObjectGuid BronjahmGUID(instance->GetGuidData(DATA_BRONJAHM));
- if (BronjahmGUID.GetCounter() != id)
- return;
-
- if (Creature* bronjahm = ObjectAccessor::GetCreature(*me, BronjahmGUID))
- me->CastSpell(bronjahm, SPELL_CONSUME_SOUL, true);
+ if (instance->GetGuidData(DATA_BRONJAHM).GetCounter() != id)
+ return;
- summ->UnSummon();
- }
+ me->CastSpell((Unit*)nullptr, SPELL_CONSUME_SOUL, true);
+ me->DespawnOrUnsummon();
}
private:
@@ -220,7 +241,7 @@ class npc_corrupted_soul_fragment : public CreatureScript
CreatureAI* GetAI(Creature* creature) const override
{
- return GetInstanceAI<npc_corrupted_soul_fragmentAI>(creature);
+ return GetInstanceAI<npc_corrupted_soul_fragmentAI>(creature, FoSScriptName);
}
};
@@ -238,12 +259,10 @@ class spell_bronjahm_magic_bane : public SpellScriptLoader
if (GetHitUnit()->getPowerType() != POWER_MANA)
return;
- const int32 maxDamage = GetCaster()->GetMap()->GetSpawnMode() == 1 ? 15000 : 10000;
- int32 newDamage = GetHitDamage();
- newDamage += GetHitUnit()->GetMaxPower(POWER_MANA)/2;
- newDamage = std::min<int32>(maxDamage, newDamage);
+ int32 const maxDamage = GetCaster()->GetMap()->IsHeroic() ? 15000 : 10000;
+ int32 newDamage = GetHitDamage() + (GetHitUnit()->GetMaxPower(POWER_MANA) / 2);
- SetHitDamage(newDamage);
+ SetHitDamage(std::min<int32>(maxDamage, newDamage));
}
void Register() override
@@ -261,7 +280,7 @@ class spell_bronjahm_magic_bane : public SpellScriptLoader
class spell_bronjahm_consume_soul : public SpellScriptLoader
{
public:
- spell_bronjahm_consume_soul() : SpellScriptLoader("spell_bronjahm_consume_soul") { }
+ spell_bronjahm_consume_soul() : SpellScriptLoader("spell_bronjahm_consume_soul") { }
class spell_bronjahm_consume_soul_SpellScript : public SpellScript
{
@@ -285,38 +304,22 @@ class spell_bronjahm_consume_soul : public SpellScriptLoader
}
};
-class spell_bronjahm_soulstorm_channel : public SpellScriptLoader
+static uint32 const SoulstormVisualSpells[] =
{
- public:
- spell_bronjahm_soulstorm_channel() : SpellScriptLoader("spell_bronjahm_soulstorm_channel") { }
-
- class spell_bronjahm_soulstorm_channel_AuraScript : public AuraScript
- {
- PrepareAuraScript(spell_bronjahm_soulstorm_channel_AuraScript);
-
- void HandlePeriodicTick(AuraEffect const* /*aurEff*/)
- {
- PreventDefaultAction();
- for (uint32 i = 68904; i <= 68907; ++i)
- GetTarget()->CastSpell(GetTarget(), i, true);
- }
-
- void Register() override
- {
- OnEffectPeriodic += AuraEffectPeriodicFn(spell_bronjahm_soulstorm_channel_AuraScript::HandlePeriodicTick, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY);
- }
- };
-
- AuraScript* GetAuraScript() const override
- {
- return new spell_bronjahm_soulstorm_channel_AuraScript();
- }
+ 68904,
+ 68886,
+ 68905,
+ 68896,
+ 68906,
+ 68897,
+ 68907,
+ 68898
};
class spell_bronjahm_soulstorm_visual : public SpellScriptLoader
{
public:
- spell_bronjahm_soulstorm_visual() : SpellScriptLoader("spell_bronjahm_soulstorm_visual") { }
+ spell_bronjahm_soulstorm_visual(char const* scriptName) : SpellScriptLoader(scriptName) { }
class spell_bronjahm_soulstorm_visual_AuraScript : public AuraScript
{
@@ -325,11 +328,7 @@ class spell_bronjahm_soulstorm_visual : public SpellScriptLoader
void HandlePeriodicTick(AuraEffect const* aurEff)
{
PreventDefaultAction();
- if (aurEff->GetTickNumber()%5)
- return;
- GetTarget()->CastSpell(GetTarget(), 68886, true);
- for (uint32 i = 68896; i <= 68898; ++i)
- GetTarget()->CastSpell(GetTarget(), i, true);
+ GetTarget()->CastSpell(GetTarget(), SoulstormVisualSpells[aurEff->GetTickNumber() % 8], true);
}
void Register() override
@@ -344,21 +343,6 @@ class spell_bronjahm_soulstorm_visual : public SpellScriptLoader
}
};
-class DistanceCheck
-{
- public:
- explicit DistanceCheck(Unit* _caster) : caster(_caster) { }
-
- bool operator() (WorldObject* unit) const
- {
- if (caster->GetExactDist2d(unit) <= 10.0f)
- return true;
- return false;
- }
-
- Unit* caster;
-};
-
class spell_bronjahm_soulstorm_targeting : public SpellScriptLoader
{
public:
@@ -368,25 +352,19 @@ class spell_bronjahm_soulstorm_targeting : public SpellScriptLoader
{
PrepareSpellScript(spell_bronjahm_soulstorm_targeting_SpellScript);
- void FilterTargetsInitial(std::list<WorldObject*>& targets)
- {
- targets.remove_if(DistanceCheck(GetCaster()));
- sharedTargets = targets;
- }
-
- // use the same target for first and second effect
- void FilterTargetsSubsequent(std::list<WorldObject*>& targets)
+ void FilterTargets(std::list<WorldObject*>& targets)
{
- targets = sharedTargets;
+ Unit* caster = GetCaster();
+ targets.remove_if([caster](WorldObject* target)
+ {
+ return caster->GetExactDist2d(target) <= 10.0f;
+ });
}
void Register() override
{
- OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_bronjahm_soulstorm_targeting_SpellScript::FilterTargetsInitial, EFFECT_1, TARGET_UNIT_DEST_AREA_ENEMY);
- OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_bronjahm_soulstorm_targeting_SpellScript::FilterTargetsSubsequent, EFFECT_2, TARGET_UNIT_DEST_AREA_ENEMY);
+ OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_bronjahm_soulstorm_targeting_SpellScript::FilterTargets, EFFECT_ALL, TARGET_UNIT_DEST_AREA_ENEMY);
}
-
- std::list<WorldObject*> sharedTargets;
};
SpellScript* GetSpellScript() const override
@@ -395,13 +373,25 @@ class spell_bronjahm_soulstorm_targeting : public SpellScriptLoader
}
};
+class achievement_bronjahm_soul_power : public AchievementCriteriaScript
+{
+ public:
+ achievement_bronjahm_soul_power() : AchievementCriteriaScript("achievement_bronjahm_soul_power") { }
+
+ bool OnCheck(Player* /*source*/, Unit* target) override
+ {
+ return target && target->GetAI()->GetData(DATA_SOUL_POWER) >= 4;
+ }
+};
+
void AddSC_boss_bronjahm()
{
new boss_bronjahm();
new npc_corrupted_soul_fragment();
new spell_bronjahm_magic_bane();
new spell_bronjahm_consume_soul();
- new spell_bronjahm_soulstorm_channel();
- new spell_bronjahm_soulstorm_visual();
+ new spell_bronjahm_soulstorm_visual("spell_bronjahm_soulstorm_channel");
+ new spell_bronjahm_soulstorm_visual("spell_bronjahm_soulstorm_visual");
new spell_bronjahm_soulstorm_targeting();
+ new achievement_bronjahm_soul_power();
}
diff --git a/src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/boss_devourer_of_souls.cpp b/src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/boss_devourer_of_souls.cpp
index 2f1d4943019..d5f00757039 100644
--- a/src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/boss_devourer_of_souls.cpp
+++ b/src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/boss_devourer_of_souls.cpp
@@ -128,7 +128,7 @@ class boss_devourer_of_souls : public CreatureScript
struct boss_devourer_of_soulsAI : public BossAI
{
- boss_devourer_of_soulsAI(Creature* creature) : BossAI(creature, DATA_DEVOURER_EVENT)
+ boss_devourer_of_soulsAI(Creature* creature) : BossAI(creature, DATA_DEVOURER_OF_SOULS)
{
Initialize();
beamAngle = 0.f;
@@ -143,20 +143,17 @@ class boss_devourer_of_souls : public CreatureScript
void Reset() override
{
+ _Reset();
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_DISABLE_MOVE);
me->SetDisplayId(DISPLAY_ANGER);
me->SetReactState(REACT_AGGRESSIVE);
- events.Reset();
- summons.DespawnAll();
-
Initialize();
-
- instance->SetData(DATA_DEVOURER_EVENT, NOT_STARTED);
}
void EnterCombat(Unit* /*who*/) override
{
+ _EnterCombat();
Talk(SAY_FACE_AGGRO);
if (!me->FindNearestCreature(NPC_CRUCIBLE_OF_SOULS, 60)) // Prevent double spawn
@@ -166,8 +163,6 @@ class boss_devourer_of_souls : public CreatureScript
events.ScheduleEvent(EVENT_WELL_OF_SOULS, 30000);
events.ScheduleEvent(EVENT_UNLEASHED_SOULS, 20000);
events.ScheduleEvent(EVENT_WAILING_SOULS, urand(60000, 70000));
-
- instance->SetData(DATA_DEVOURER_EVENT, IN_PROGRESS);
}
void KilledUnit(Unit* victim) override
@@ -175,7 +170,7 @@ class boss_devourer_of_souls : public CreatureScript
if (victim->GetTypeId() != TYPEID_PLAYER)
return;
- int32 textId = 0;
+ uint8 textId = 0;
switch (me->GetDisplayId())
{
case DISPLAY_ANGER:
@@ -197,14 +192,12 @@ class boss_devourer_of_souls : public CreatureScript
void JustDied(Unit* /*killer*/) override
{
- summons.DespawnAll();
+ _JustDied();
Position spawnPoint = {5618.139f, 2451.873f, 705.854f, 0};
Talk(SAY_FACE_DEATH);
- instance->SetData(DATA_DEVOURER_EVENT, DONE);
-
int32 entryIndex;
if (instance->GetData(DATA_TEAM_IN_INSTANCE) == ALLIANCE)
entryIndex = 0;
@@ -402,11 +395,6 @@ class spell_devourer_of_souls_mirrored_soul_proc : public SpellScriptLoader
return true;
}
- bool Load() override
- {
- return true;
- }
-
bool CheckProc(ProcEventInfo& /*eventInfo*/)
{
return GetCaster() && GetCaster()->IsAlive();
diff --git a/src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/forge_of_souls.h b/src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/forge_of_souls.h
index 054e5d5a7bd..ddbc117e7fd 100644
--- a/src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/forge_of_souls.h
+++ b/src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/forge_of_souls.h
@@ -15,38 +15,44 @@
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-#ifndef DEF_FORGE_OF_SOULS_H
-#define DEF_FORGE_OF_SOULS_H
+#ifndef FORGE_OF_SOULS_H_
+#define FORGE_OF_SOULS_H_
#define FoSScriptName "instance_forge_of_souls"
#define DataHeader "FOS"
+uint32 const EncounterCount = 2;
+
enum Data
{
- DATA_BRONJAHM = 0,
- DATA_DEVOURER = 1,
- DATA_DEVOURER_EVENT = 2,
- DATA_TEAM_IN_INSTANCE = 3,
+ // Encounter states and GUIDs
+ DATA_BRONJAHM = 0,
+ DATA_DEVOURER_OF_SOULS = 1,
+
+ // Additional Data
+ DATA_TEAM_IN_INSTANCE = 2
};
enum Creatures
{
- CREATURE_BRONJAHM = 36497,
- CREATURE_DEVOURER = 36502,
-
- NPC_SYLVANAS_PART1 = 37596,
- NPC_SYLVANAS_PART2 = 38161,
- NPC_JAINA_PART1 = 37597,
- NPC_JAINA_PART2 = 38160,
- NPC_KALIRA = 37583,
- NPC_ELANDRA = 37774,
- NPC_LORALEN = 37779,
- NPC_KORELN = 37582,
- NPC_CHAMPION_1_HORDE = 37584,
- NPC_CHAMPION_2_HORDE = 37587,
- NPC_CHAMPION_3_HORDE = 37588,
- NPC_CHAMPION_1_ALLIANCE = 37496,
- NPC_CHAMPION_2_ALLIANCE = 37497,
- NPC_CRUCIBLE_OF_SOULS = 37094,
+ NPC_BRONJAHM = 36497,
+ NPC_DEVOURER = 36502,
+ NPC_CORRUPTED_SOUL_FRAGMENT = 36535,
+
+ NPC_SYLVANAS_PART1 = 37596,
+ NPC_SYLVANAS_PART2 = 38161,
+ NPC_JAINA_PART1 = 37597,
+ NPC_JAINA_PART2 = 38160,
+ NPC_KALIRA = 37583,
+ NPC_ELANDRA = 37774,
+ NPC_LORALEN = 37779,
+ NPC_KORELN = 37582,
+ NPC_CHAMPION_1_HORDE = 37584,
+ NPC_CHAMPION_2_HORDE = 37587,
+ NPC_CHAMPION_3_HORDE = 37588,
+ NPC_CHAMPION_1_ALLIANCE = 37496,
+ NPC_CHAMPION_2_ALLIANCE = 37497,
+ NPC_CRUCIBLE_OF_SOULS = 37094
};
-#endif
+
+#endif // FORGE_OF_SOULS_H_
diff --git a/src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/instance_forge_of_souls.cpp b/src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/instance_forge_of_souls.cpp
index 8b586ea7fc2..db7628ebada 100644
--- a/src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/instance_forge_of_souls.cpp
+++ b/src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/instance_forge_of_souls.cpp
@@ -20,13 +20,6 @@
#include "forge_of_souls.h"
#include "Player.h"
-#define MAX_ENCOUNTER 2
-
-/* Forge of Souls encounters:
-0- Bronjahm, The Godfather of Souls
-1- The Devourer of Souls
-*/
-
class instance_forge_of_souls : public InstanceMapScript
{
public:
@@ -37,7 +30,7 @@ class instance_forge_of_souls : public InstanceMapScript
instance_forge_of_souls_InstanceScript(Map* map) : InstanceScript(map)
{
SetHeaders(DataHeader);
- SetBossNumber(MAX_ENCOUNTER);
+ SetBossNumber(EncounterCount);
teamInInstance = 0;
}
@@ -60,10 +53,10 @@ class instance_forge_of_souls : public InstanceMapScript
switch (creature->GetEntry())
{
- case CREATURE_BRONJAHM:
+ case NPC_BRONJAHM:
bronjahm = creature->GetGUID();
break;
- case CREATURE_DEVOURER:
+ case NPC_DEVOURER:
devourerOfSouls = creature->GetGUID();
break;
case NPC_SYLVANAS_PART1:
@@ -100,7 +93,7 @@ class instance_forge_of_souls : public InstanceMapScript
{
case DATA_BRONJAHM:
return bronjahm;
- case DATA_DEVOURER:
+ case DATA_DEVOURER_OF_SOULS:
return devourerOfSouls;
default:
break;
diff --git a/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/halls_of_reflection.cpp b/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/halls_of_reflection.cpp
index 7b80db7dd39..927ebfbc55c 100644
--- a/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/halls_of_reflection.cpp
+++ b/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/halls_of_reflection.cpp
@@ -21,6 +21,7 @@
#include "SpellScript.h"
#include "Transport.h"
#include "Player.h"
+#include "MoveSplineInit.h"
#include "halls_of_reflection.h"
enum Text
@@ -342,6 +343,20 @@ class npc_jaina_or_sylvanas_intro_hor : public CreatureScript
public:
npc_jaina_or_sylvanas_intro_hor() : CreatureScript("npc_jaina_or_sylvanas_intro_hor") { }
+ bool OnGossipHello(Player* player, Creature* creature) override
+ {
+ // override default gossip
+ if (InstanceScript* instance = creature->GetInstanceScript())
+ if (instance->GetData(DATA_QUEL_DELAR_EVENT) == IN_PROGRESS || instance->GetData(DATA_QUEL_DELAR_EVENT) == SPECIAL)
+ {
+ player->PlayerTalkClass->ClearMenus();
+ return true;
+ }
+
+ // load default gossip
+ return false;
+ }
+
struct npc_jaina_or_sylvanas_intro_horAI : public ScriptedAI
{
npc_jaina_or_sylvanas_intro_horAI(Creature* creature) : ScriptedAI(creature)
@@ -1998,6 +2013,13 @@ class at_hor_intro_start : public AreaTriggerScript
if (_instance->GetData(DATA_INTRO_EVENT) == NOT_STARTED)
_instance->SetData(DATA_INTRO_EVENT, IN_PROGRESS);
+ if (player->HasAura(SPELL_QUEL_DELAR_COMPULSION) && (player->GetQuestStatus(QUEST_HALLS_OF_REFLECTION_ALLIANCE) == QUEST_STATUS_INCOMPLETE ||
+ player->GetQuestStatus(QUEST_HALLS_OF_REFLECTION_HORDE) == QUEST_STATUS_INCOMPLETE) && _instance->GetData(DATA_QUEL_DELAR_EVENT) == NOT_STARTED)
+ {
+ _instance->SetData(DATA_QUEL_DELAR_EVENT, IN_PROGRESS);
+ _instance->SetGuidData(DATA_QUEL_DELAR_INVOKER, player->GetGUID());
+ }
+
return true;
}
};
@@ -2330,6 +2352,374 @@ class npc_lumbering_abomination : public CreatureScript
}
};
+enum QuelDelarUther
+{
+ ACTION_UTHER_START_SCREAM = 1,
+ ACTION_UTHER_OUTRO = 2,
+
+ EVENT_UTHER_1 = 1,
+ EVENT_UTHER_2 = 2,
+ EVENT_UTHER_3 = 3,
+ EVENT_UTHER_4 = 4,
+ EVENT_UTHER_5 = 5,
+ EVENT_UTHER_6 = 6,
+ EVENT_UTHER_7 = 7,
+ EVENT_UTHER_8 = 8,
+ EVENT_UTHER_9 = 9,
+ EVENT_UTHER_10 = 10,
+ EVENT_UTHER_11 = 11,
+ EVENT_UTHER_FACING = 12,
+ EVENT_UTHER_KNEEL = 13,
+
+ SAY_UTHER_QUEL_DELAR_1 = 16,
+ SAY_UTHER_QUEL_DELAR_2 = 17,
+ SAY_UTHER_QUEL_DELAR_3 = 18,
+ SAY_UTHER_QUEL_DELAR_4 = 19,
+ SAY_UTHER_QUEL_DELAR_5 = 20,
+ SAY_UTHER_QUEL_DELAR_6 = 21,
+
+ SPELL_ESSENCE_OF_CAPTURED_1 = 73036
+};
+
+enum QuelDelarSword
+{
+ SPELL_WHIRLWIND_VISUAL = 70300,
+ SPELL_HEROIC_STRIKE = 29426,
+ SPELL_WHIRLWIND = 67716,
+ SPELL_BLADESTORM = 67541,
+
+ NPC_QUEL_DELAR = 37158,
+ POINT_TAKE_OFF = 1,
+
+ EVENT_QUEL_DELAR_INIT = 1,
+ EVENT_QUEL_DELAR_FLIGHT_INIT = 2,
+ EVENT_QUEL_DELAR_FLIGHT = 3,
+ EVENT_QUEL_DELAR_LAND = 4,
+ EVENT_QUEL_DELAR_FIGHT = 5,
+ EVENT_QUEL_DELAR_BLADESTORM = 6,
+ EVENT_QUEL_DELAR_HEROIC_STRIKE = 7,
+ EVENT_QUEL_DELAR_WHIRLWIND = 8,
+
+ SAY_QUEL_DELAR_SWORD = 0
+};
+
+enum QuelDelarMisc
+{
+ SAY_FROSTMOURNE_BUNNY = 0,
+ SPELL_QUEL_DELAR_WILL = 70698
+};
+
+Position const QuelDelarCenterPos = { 5309.259f, 2006.390f, 718.046f, 0.0f };
+Position const QuelDelarSummonPos = { 5298.473f, 1994.852f, 709.424f, 3.979351f };
+Position const QuelDelarMovement[] =
+{
+ { 5292.870f, 1998.950f, 718.046f, 0.0f },
+ { 5295.819f, 1991.912f, 707.707f, 0.0f },
+ { 5295.301f, 1989.782f, 708.696f, 0.0f }
+};
+
+Position const UtherQuelDelarMovement[] =
+{
+ { 5336.830f, 1981.700f, 709.319f, 0.0f },
+ { 5314.350f, 1993.440f, 707.726f, 0.0f }
+};
+
+class npc_uther_quel_delar : public CreatureScript
+{
+ public:
+ npc_uther_quel_delar() : CreatureScript("npc_uther_quel_delar") { }
+
+ struct npc_uther_quel_delarAI : public ScriptedAI
+ {
+ npc_uther_quel_delarAI(Creature* creature) : ScriptedAI(creature)
+ {
+ _instance = me->GetInstanceScript();
+ }
+
+ void Reset() override
+ {
+ // Prevent to break Uther in intro event during instance encounter
+ if (_instance->GetData(DATA_QUEL_DELAR_EVENT) != IN_PROGRESS && _instance->GetData(DATA_QUEL_DELAR_EVENT) != SPECIAL)
+ return;
+
+ _events.Reset();
+ _events.ScheduleEvent(EVENT_UTHER_1, 1);
+ }
+
+ void DamageTaken(Unit* /*attacker*/, uint32& damage) override
+ {
+ if (damage >= me->GetHealth())
+ damage = me->GetHealth() - 1;
+ }
+
+ void DoAction(int32 action) override
+ {
+ switch (action)
+ {
+ case ACTION_UTHER_START_SCREAM:
+ _instance->SetData(DATA_QUEL_DELAR_EVENT, SPECIAL);
+ _events.ScheduleEvent(EVENT_UTHER_2, 0);
+ break;
+ case ACTION_UTHER_OUTRO:
+ _events.ScheduleEvent(EVENT_UTHER_6, 0);
+ break;
+ default:
+ break;
+ }
+ }
+
+ void MovementInform(uint32 /*type*/, uint32 pointId) override
+ {
+ switch (pointId)
+ {
+ case 1:
+ _events.ScheduleEvent(EVENT_UTHER_FACING, 1000);
+ break;
+ default:
+ break;
+ }
+ }
+
+ void UpdateAI(uint32 diff) override
+ {
+ // Prevent to break Uther in intro event during instance encounter
+ if (_instance->GetData(DATA_QUEL_DELAR_EVENT) != IN_PROGRESS && _instance->GetData(DATA_QUEL_DELAR_EVENT) != SPECIAL)
+ return;
+
+ _events.Update(diff);
+
+ while (uint32 eventId = _events.ExecuteEvent())
+ {
+ switch (eventId)
+ {
+ case EVENT_UTHER_1:
+ Talk(SAY_UTHER_QUEL_DELAR_1);
+ break;
+ case EVENT_UTHER_2:
+ if (Creature* bunny = ObjectAccessor::GetCreature(*me, _instance->GetGuidData(DATA_FROSTMOURNE_ALTAR_BUNNY)))
+ if (Unit* target = ObjectAccessor::GetPlayer(*me, _instance->GetGuidData(DATA_QUEL_DELAR_INVOKER)))
+ bunny->CastSpell(target, SPELL_QUEL_DELAR_WILL, true);
+ _events.ScheduleEvent(EVENT_UTHER_3, 2000);
+ break;
+ case EVENT_UTHER_3:
+ me->SummonCreature(NPC_QUEL_DELAR, QuelDelarSummonPos);
+ _events.ScheduleEvent(EVENT_UTHER_4, 2000);
+ break;
+ case EVENT_UTHER_4:
+ Talk(SAY_UTHER_QUEL_DELAR_2);
+ _events.ScheduleEvent(EVENT_UTHER_5, 8000);
+ break;
+ case EVENT_UTHER_5:
+ me->GetMotionMaster()->MovePoint(1, UtherQuelDelarMovement[0]);
+ break;
+ case EVENT_UTHER_6:
+ me->SetWalk(true);
+ me->GetMotionMaster()->MovePoint(0, UtherQuelDelarMovement[1]);
+ _events.ScheduleEvent(EVENT_UTHER_7, 5000);
+ break;
+ case EVENT_UTHER_7:
+ Talk(SAY_UTHER_QUEL_DELAR_3);
+ _events.ScheduleEvent(EVENT_UTHER_8, 12000);
+ break;
+ case EVENT_UTHER_8:
+ Talk(SAY_UTHER_QUEL_DELAR_4);
+ _events.ScheduleEvent(EVENT_UTHER_9, 7000);
+ break;
+ case EVENT_UTHER_9:
+ Talk(SAY_UTHER_QUEL_DELAR_5);
+ _events.ScheduleEvent(EVENT_UTHER_10, 10000);
+ break;
+ case EVENT_UTHER_10:
+ Talk(SAY_UTHER_QUEL_DELAR_6);
+ _events.ScheduleEvent(EVENT_UTHER_11, 5000);
+ break;
+ case EVENT_UTHER_11:
+ DoCast(me, SPELL_ESSENCE_OF_CAPTURED_1, true);
+ me->DespawnOrUnsummon(3000);
+ _instance->SetData(DATA_QUEL_DELAR_EVENT, DONE);
+ break;
+ case EVENT_UTHER_FACING:
+ if (Creature* bunny = ObjectAccessor::GetCreature(*me, _instance->GetGuidData(DATA_FROSTMOURNE_ALTAR_BUNNY)))
+ me->SetFacingToObject(bunny);
+ _events.ScheduleEvent(EVENT_UTHER_KNEEL, 1000);
+ break;
+ case EVENT_UTHER_KNEEL:
+ me->HandleEmoteCommand(EMOTE_STATE_KNEEL);
+ break;
+ default:
+ break;
+ }
+ }
+ }
+
+ private:
+ EventMap _events;
+ InstanceScript* _instance;
+ };
+
+ CreatureAI* GetAI(Creature* creature) const override
+ {
+ return GetHallsOfReflectionAI<npc_uther_quel_delarAI>(creature);
+ }
+};
+
+class npc_quel_delar_sword : public CreatureScript
+{
+ public:
+ npc_quel_delar_sword() : CreatureScript("npc_quel_delar_sword") { }
+
+ struct npc_quel_delar_swordAI : public ScriptedAI
+ {
+ npc_quel_delar_swordAI(Creature* creature) : ScriptedAI(creature)
+ {
+ _instance = me->GetInstanceScript();
+ me->SetDisplayId(me->GetCreatureTemplate()->Modelid2);
+ _intro = true;
+ }
+
+ void Reset() override
+ {
+ _events.Reset();
+ me->SetSpeed(MOVE_FLIGHT, 4.5f, true);
+ DoCast(SPELL_WHIRLWIND_VISUAL);
+ if (_intro)
+ _events.ScheduleEvent(EVENT_QUEL_DELAR_INIT, 0);
+ else
+ me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_IMMUNE_TO_NPC);
+ }
+
+ void EnterCombat(Unit* /*victim*/) override
+ {
+ _events.ScheduleEvent(EVENT_QUEL_DELAR_HEROIC_STRIKE, 4000);
+ _events.ScheduleEvent(EVENT_QUEL_DELAR_BLADESTORM, 6000);
+ _events.ScheduleEvent(EVENT_QUEL_DELAR_WHIRLWIND, 6000);
+ }
+
+ void JustDied(Unit* /*killer*/) override
+ {
+ if (Creature* uther = ObjectAccessor::GetCreature(*me, _instance->GetGuidData(DATA_UTHER_QUEL_DELAR)))
+ uther->AI()->DoAction(ACTION_UTHER_OUTRO);
+ }
+
+ void MovementInform(uint32 type, uint32 pointId) override
+ {
+ if (type != EFFECT_MOTION_TYPE)
+ return;
+
+ switch (pointId)
+ {
+ case POINT_TAKE_OFF:
+ _events.ScheduleEvent(EVENT_QUEL_DELAR_FLIGHT, 0);
+ break;
+ default:
+ break;
+ }
+ }
+
+ void UpdateAI(uint32 diff) override
+ {
+ _events.Update(diff);
+
+ if (me->HasUnitState(UNIT_STATE_CASTING))
+ return;
+
+ if (!UpdateVictim())
+ {
+ while (uint32 eventId = _events.ExecuteEvent())
+ {
+ switch (eventId)
+ {
+ case EVENT_QUEL_DELAR_INIT:
+ if (Creature* bunny = ObjectAccessor::GetCreature(*me, _instance->GetGuidData(DATA_FROSTMOURNE_ALTAR_BUNNY)))
+ bunny->AI()->Talk(SAY_FROSTMOURNE_BUNNY);
+ _intro = false;
+ _events.ScheduleEvent(EVENT_QUEL_DELAR_FLIGHT_INIT, 2500);
+ break;
+ case EVENT_QUEL_DELAR_FLIGHT_INIT:
+ me->GetMotionMaster()->MoveTakeoff(POINT_TAKE_OFF, QuelDelarMovement[0]);
+ break;
+ case EVENT_QUEL_DELAR_FLIGHT:
+ {
+ me->GetMotionMaster()->MoveCirclePath(QuelDelarCenterPos.GetPositionX(), QuelDelarCenterPos.GetPositionY(), 718.046f, 18.0f, true, 16);
+ _events.ScheduleEvent(EVENT_QUEL_DELAR_LAND, 15000);
+ break;
+ }
+ case EVENT_QUEL_DELAR_LAND:
+ me->StopMoving();
+ me->GetMotionMaster()->Clear();
+ me->GetMotionMaster()->MoveLand(0, QuelDelarMovement[1]);
+ _events.ScheduleEvent(EVENT_QUEL_DELAR_FIGHT, 6000);
+ break;
+ case EVENT_QUEL_DELAR_FIGHT:
+ Talk(SAY_QUEL_DELAR_SWORD);
+ me->GetMotionMaster()->MovePoint(0, QuelDelarMovement[2]);
+ me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_IMMUNE_TO_NPC);
+ break;
+ default:
+ break;
+ }
+ }
+ }
+ else
+ {
+ while (uint32 eventId = _events.ExecuteEvent())
+ {
+ switch (eventId)
+ {
+ case EVENT_QUEL_DELAR_BLADESTORM:
+ DoCast(me, SPELL_BLADESTORM);
+ _events.ScheduleEvent(EVENT_QUEL_DELAR_BLADESTORM, 10000);
+ break;
+ case EVENT_QUEL_DELAR_HEROIC_STRIKE:
+ DoCastVictim(SPELL_HEROIC_STRIKE);
+ _events.ScheduleEvent(EVENT_QUEL_DELAR_HEROIC_STRIKE, 6000);
+ break;
+ case EVENT_QUEL_DELAR_WHIRLWIND:
+ DoCastAOE(SPELL_WHIRLWIND);
+ _events.ScheduleEvent(EVENT_QUEL_DELAR_WHIRLWIND, 1000);
+ break;
+ default:
+ break;
+ }
+ }
+
+ DoMeleeAttackIfReady();
+ }
+ }
+
+ private:
+ EventMap _events;
+ InstanceScript* _instance;
+ bool _intro;
+ };
+
+ CreatureAI* GetAI(Creature* creature) const override
+ {
+ return GetHallsOfReflectionAI<npc_quel_delar_swordAI>(creature);
+ }
+};
+
+// 5660
+class at_hor_uther_quel_delar_start : public AreaTriggerScript
+{
+ public:
+ at_hor_uther_quel_delar_start() : AreaTriggerScript("at_hor_uther_quel_delar_start") { }
+
+ bool OnTrigger(Player* player, AreaTriggerEntry const* /*trigger*/) override
+ {
+ if (player->IsGameMaster())
+ return true;
+
+ InstanceScript* _instance = player->GetInstanceScript();
+
+ if (_instance->GetData(DATA_QUEL_DELAR_EVENT) == IN_PROGRESS)
+ if (Creature* uther = ObjectAccessor::GetCreature(*player, _instance->GetGuidData(DATA_UTHER_QUEL_DELAR)))
+ uther->AI()->DoAction(ACTION_UTHER_START_SCREAM);
+
+ return true;
+ }
+};
+
// 72900 - Start Halls of Reflection Quest AE
class spell_hor_start_halls_of_reflection_quest_ae : public SpellScriptLoader
{
@@ -2447,6 +2837,7 @@ void AddSC_halls_of_reflection()
new at_hor_waves_restarter();
new at_hor_impenetrable_door();
new at_hor_shadow_throne();
+ new at_hor_uther_quel_delar_start();
new npc_jaina_or_sylvanas_intro_hor();
new npc_jaina_or_sylvanas_escape_hor();
new npc_the_lich_king_escape_hor();
@@ -2461,6 +2852,8 @@ void AddSC_halls_of_reflection()
new npc_raging_ghoul();
new npc_risen_witch_doctor();
new npc_lumbering_abomination();
+ new npc_uther_quel_delar();
+ new npc_quel_delar_sword();
new spell_hor_start_halls_of_reflection_quest_ae();
new spell_hor_evasion();
new spell_hor_gunship_cannon_fire();
diff --git a/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/halls_of_reflection.h b/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/halls_of_reflection.h
index 9594617fa9a..d2f9ab5d262 100644
--- a/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/halls_of_reflection.h
+++ b/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/halls_of_reflection.h
@@ -46,7 +46,13 @@ enum DataTypes
DATA_ESCAPE_LEADER = 10,
DATA_ICEWALL = 11,
DATA_ICEWALL_TARGET = 12,
- DATA_GUNSHIP = 13
+ DATA_GUNSHIP = 13,
+
+ // Quest stuff
+ DATA_QUEL_DELAR_EVENT = 14,
+ DATA_FROSTMOURNE_ALTAR_BUNNY = 15,
+ DATA_UTHER_QUEL_DELAR = 16,
+ DATA_QUEL_DELAR_INVOKER = 17
};
enum CreatureIds
@@ -131,7 +137,8 @@ enum InstanceEvents
EVENT_NEXT_WAVE = 2,
EVENT_DO_WIPE = 3,
EVENT_ADD_WAVE = 4,
- EVENT_SPAWN_ESCAPE_EVENT = 5
+ EVENT_SPAWN_ESCAPE_EVENT = 5,
+ EVENT_QUEL_DELAR_SUMMON_UTHER = 6
};
enum InstanceEventIds
@@ -160,7 +167,17 @@ enum InstanceSpells
// Gunship
SPELL_GUNSHIP_CANNON_FIRE = 70017,
SPELL_GUNSHIP_CANNON_FIRE_MISSILE_ALLIANCE = 70021,
- SPELL_GUNSHIP_CANNON_FIRE_MISSILE_HORDE = 70246
+ SPELL_GUNSHIP_CANNON_FIRE_MISSILE_HORDE = 70246,
+
+ // Halls of Reflection quest
+ SPELL_QUEL_DELAR_COMPULSION = 70013,
+ SPELL_ESSENCE_OF_CAPTURED = 70720
+};
+
+enum InstanceQuests
+{
+ QUEST_HALLS_OF_REFLECTION_ALLIANCE = 24480,
+ QUEST_HALLS_OF_REFLECTION_HORDE = 24561
};
enum InstanceWorldStates
diff --git a/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/instance_halls_of_reflection.cpp b/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/instance_halls_of_reflection.cpp
index ea2a1539f1c..660a639487f 100644
--- a/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/instance_halls_of_reflection.cpp
+++ b/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/instance_halls_of_reflection.cpp
@@ -73,6 +73,8 @@ Position const SpawnPos[] =
{ 5299.250f, 2035.998f, 707.7781f, 5.026548f }
};
+Position const UtherQuelDalarPos = { 5302.001f, 1988.698f, 707.7781f, 3.700098f };
+
class instance_halls_of_reflection : public InstanceMapScript
{
public:
@@ -89,6 +91,7 @@ class instance_halls_of_reflection : public InstanceMapScript
_waveCount = 0;
_introState = NOT_STARTED;
_frostswornGeneralState = NOT_STARTED;
+ _quelDelarState = NOT_STARTED;
events.Reset();
}
@@ -159,6 +162,9 @@ class instance_halls_of_reflection : public InstanceMapScript
case NPC_ICE_WALL_TARGET:
IcewallTargetGUID = creature->GetGUID();
break;
+ case NPC_UTHER:
+ UtherGUID = creature->GetGUID();
+ break;
default:
break;
}
@@ -439,6 +445,18 @@ class instance_halls_of_reflection : public InstanceMapScript
HandleGameObject(ShadowThroneDoorGUID, true);
_frostswornGeneralState = data;
break;
+ case DATA_QUEL_DELAR_EVENT:
+ if (data == IN_PROGRESS)
+ {
+ if (_quelDelarState == NOT_STARTED)
+ {
+ if (Creature* bunny = instance->GetCreature(FrostmourneAltarBunnyGUID))
+ bunny->CastSpell((Unit*)NULL, SPELL_ESSENCE_OF_CAPTURED);
+ events.ScheduleEvent(EVENT_QUEL_DELAR_SUMMON_UTHER, 2000);
+ }
+ }
+ _quelDelarState = data;
+ break;
default:
break;
}
@@ -446,6 +464,18 @@ class instance_halls_of_reflection : public InstanceMapScript
SaveToDB();
}
+ void SetGuidData(uint32 type, ObjectGuid data) override
+ {
+ switch (type)
+ {
+ case DATA_QUEL_DELAR_INVOKER:
+ QuelDelarInvokerGUID = data;
+ break;
+ default:
+ break;
+ }
+ }
+
// wave scheduling, checked when wave npcs die
void OnUnitDeath(Unit* unit) override
{
@@ -491,6 +521,9 @@ class instance_halls_of_reflection : public InstanceMapScript
case EVENT_SPAWN_ESCAPE_EVENT:
SpawnEscapeEvent();
break;
+ case EVENT_QUEL_DELAR_SUMMON_UTHER:
+ instance->SummonCreature(NPC_UTHER, UtherQuelDalarPos);
+ break;
}
}
@@ -649,6 +682,8 @@ class instance_halls_of_reflection : public InstanceMapScript
return _introState;
case DATA_FROSTSWORN_GENERAL:
return _frostswornGeneralState;
+ case DATA_QUEL_DELAR_EVENT:
+ return _quelDelarState;
default:
break;
}
@@ -682,6 +717,12 @@ class instance_halls_of_reflection : public InstanceMapScript
return IcewallGUID;
case DATA_ICEWALL_TARGET:
return IcewallTargetGUID;
+ case DATA_FROSTMOURNE_ALTAR_BUNNY:
+ return FrostmourneAltarBunnyGUID;
+ case DATA_UTHER_QUEL_DELAR:
+ return UtherGUID;
+ case DATA_QUEL_DELAR_INVOKER:
+ return QuelDelarInvokerGUID;
default:
break;
}
@@ -691,7 +732,7 @@ class instance_halls_of_reflection : public InstanceMapScript
void WriteSaveDataMore(std::ostringstream& data) override
{
- data << _introState << ' ' << _frostswornGeneralState;
+ data << _introState << ' ' << _frostswornGeneralState << ' ' << _quelDelarState;
}
void ReadSaveDataMore(std::istringstream& data) override
@@ -708,6 +749,12 @@ class instance_halls_of_reflection : public InstanceMapScript
SetData(DATA_FROSTSWORN_GENERAL, DONE);
else
SetData(DATA_FROSTSWORN_GENERAL, NOT_STARTED);
+
+ data >> temp;
+ if (temp == DONE)
+ SetData(DATA_QUEL_DELAR_EVENT, DONE);
+ else
+ SetData(DATA_QUEL_DELAR_EVENT, NOT_STARTED);
}
private:
@@ -731,6 +778,7 @@ class instance_halls_of_reflection : public InstanceMapScript
uint32 _waveCount;
uint32 _introState;
uint32 _frostswornGeneralState;
+ uint32 _quelDelarState;
EventMap events;
GuidSet waveGuidList[8];
@@ -740,6 +788,8 @@ class instance_halls_of_reflection : public InstanceMapScript
ObjectGuid CaptainGUID;
ObjectGuid IcewallGUID;
ObjectGuid IcewallTargetGUID;
+ ObjectGuid QuelDelarInvokerGUID;
+ ObjectGuid UtherGUID;
GuidSet GunshipCannonGUIDs;
GuidSet GunshipStairGUIDs;
diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_professor_putricide.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_professor_putricide.cpp
index 4c6fd0f2fcc..63082808e03 100644
--- a/src/server/scripts/Northrend/IcecrownCitadel/boss_professor_putricide.cpp
+++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_professor_putricide.cpp
@@ -1259,7 +1259,7 @@ class spell_putricide_mutated_plague : public SpellScriptLoader
return;
uint32 triggerSpell = GetSpellInfo()->Effects[aurEff->GetEffIndex()].TriggerSpell;
- SpellInfo const* spell = sSpellMgr->GetSpellInfo(triggerSpell);
+ SpellInfo const* spell = sSpellMgr->EnsureSpellInfo(triggerSpell);
spell = sSpellMgr->GetSpellForDifficultyFromSpell(spell, caster);
int32 damage = spell->Effects[EFFECT_0].CalcValue(caster);
diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_rotface.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_rotface.cpp
index 4d7b9ec42b4..d56a3f80f75 100644
--- a/src/server/scripts/Northrend/IcecrownCitadel/boss_rotface.cpp
+++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_rotface.cpp
@@ -18,7 +18,7 @@
#include "ObjectMgr.h"
#include "ScriptMgr.h"
#include "ScriptedCreature.h"
-#include "SpellAuras.h"
+#include "SpellAuraEffects.h"
#include "GridNotifiers.h"
#include "icecrown_citadel.h"
@@ -213,7 +213,7 @@ class boss_rotface : public CreatureScript
}
break;
case EVENT_MUTATED_INFECTION:
- me->CastCustomSpell(SPELL_MUTATED_INFECTION, SPELLVALUE_MAX_TARGETS, 1, NULL, false);
+ DoCastAOE(SPELL_MUTATED_INFECTION);
events.ScheduleEvent(EVENT_MUTATED_INFECTION, infectionCooldown);
break;
case EVENT_VILE_GAS:
@@ -509,13 +509,6 @@ class spell_rotface_mutated_infection : public SpellScriptLoader
{
PrepareSpellScript(spell_rotface_mutated_infection_SpellScript);
- public:
- spell_rotface_mutated_infection_SpellScript()
- {
- _target = nullptr;
- }
-
- private:
void FilterTargets(std::list<WorldObject*>& targets)
{
// remove targets with this aura already
@@ -527,14 +520,6 @@ class spell_rotface_mutated_infection : public SpellScriptLoader
WorldObject* target = Trinity::Containers::SelectRandomContainerElement(targets);
targets.clear();
targets.push_back(target);
- _target = target;
- }
-
- void ReplaceTargets(std::list<WorldObject*>& targets)
- {
- targets.clear();
- if (_target)
- targets.push_back(_target);
}
void NotifyTargets()
@@ -546,19 +531,43 @@ class spell_rotface_mutated_infection : public SpellScriptLoader
void Register() override
{
- OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_rotface_mutated_infection_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY);
- OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_rotface_mutated_infection_SpellScript::ReplaceTargets, EFFECT_1, TARGET_UNIT_SRC_AREA_ENEMY);
- OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_rotface_mutated_infection_SpellScript::ReplaceTargets, EFFECT_2, TARGET_UNIT_SRC_AREA_ENEMY);
+ OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_rotface_mutated_infection_SpellScript::FilterTargets, EFFECT_ALL, TARGET_UNIT_SRC_AREA_ENEMY);
AfterHit += SpellHitFn(spell_rotface_mutated_infection_SpellScript::NotifyTargets);
}
+ };
+
+ class spell_rotface_mutated_infection_AuraScript : public AuraScript
+ {
+ PrepareAuraScript(spell_rotface_mutated_infection_AuraScript);
- WorldObject* _target;
+ bool Validate(SpellInfo const* spellInfo) override
+ {
+ if (!sSpellMgr->GetSpellInfo(uint32(spellInfo->Effects[EFFECT_2].CalcValue())))
+ return false;
+ return true;
+ }
+
+ void HandleEffectRemove(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/)
+ {
+ Unit* target = GetTarget();
+ target->CastSpell(target, uint32(GetSpellInfo()->Effects[EFFECT_2].CalcValue()), true, nullptr, aurEff, GetCasterGUID());
+ }
+
+ void Register() override
+ {
+ AfterEffectRemove += AuraEffectRemoveFn(spell_rotface_mutated_infection_AuraScript::HandleEffectRemove, EFFECT_0, SPELL_AURA_PERIODIC_DAMAGE, AURA_EFFECT_HANDLE_REAL);
+ }
};
SpellScript* GetSpellScript() const override
{
return new spell_rotface_mutated_infection_SpellScript();
}
+
+ AuraScript* GetAuraScript() const override
+ {
+ return new spell_rotface_mutated_infection_AuraScript();
+ }
};
class spell_rotface_little_ooze_combine : public SpellScriptLoader
diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_the_lich_king.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_the_lich_king.cpp
index ae0e00cb849..07816ebbe39 100644
--- a/src/server/scripts/Northrend/IcecrownCitadel/boss_the_lich_king.cpp
+++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_the_lich_king.cpp
@@ -2417,6 +2417,7 @@ class spell_the_lich_king_defile : public SpellScriptLoader
void CorrectRange(std::list<WorldObject*>& targets)
{
targets.remove_if(ExactDistanceCheck(GetCaster(), 10.0f * GetCaster()->GetObjectScale()));
+ targets.remove_if(Trinity::UnitAuraCheck(true, SPELL_HARVEST_SOUL_VALKYR));
}
void ChangeDamageAndGrow()
diff --git a/src/server/scripts/Northrend/Nexus/EyeOfEternity/boss_malygos.cpp b/src/server/scripts/Northrend/Nexus/EyeOfEternity/boss_malygos.cpp
index 43069f10464..6c3b2187325 100644
--- a/src/server/scripts/Northrend/Nexus/EyeOfEternity/boss_malygos.cpp
+++ b/src/server/scripts/Northrend/Nexus/EyeOfEternity/boss_malygos.cpp
@@ -520,11 +520,7 @@ public:
_despawned = false;
break;
case ACTION_CYCLIC_MOVEMENT:
- Movement::MoveSplineInit init(me);
- FillCirclePath(MalygosPositions[3], 120.0f, 283.2763f, init.Path(), true);
- init.SetFly();
- init.SetCyclic();
- init.Launch();
+ me->GetMotionMaster()->MoveCirclePath(MalygosPositions[3].GetPositionX(), MalygosPositions[3].GetPositionY(), 283.2763f, 120.0f, true, 16);
break;
}
}
@@ -1020,22 +1016,6 @@ public:
}
private:
- // Used to generate perfect cyclic movements (Enter Circle).
- void FillCirclePath(Position const& centerPos, float radius, float z, Movement::PointsArray& path, bool clockwise)
- {
- float step = clockwise ? float(-M_PI) / 8.0f : float(M_PI) / 8.0f;
- float angle = centerPos.GetAngle(me->GetPositionX(), me->GetPositionY());
-
- for (uint8 i = 0; i < 16; angle += step, ++i)
- {
- G3D::Vector3 point;
- point.x = centerPos.GetPositionX() + radius * cosf(angle);
- point.y = centerPos.GetPositionY() + radius * sinf(angle);
- point.z = z; // Don't use any height getters unless all bugs are fixed.
- path.push_back(point);
- }
- }
-
uint8 _phase; // Counter for phases used with a getter.
uint8 _summonDeaths; // Keeps count of arcane trash.
uint8 _preparingPulsesChecker; // In retail they use 2 preparing pulses with 7 sec CD, after they pass 2 seconds.
@@ -1326,11 +1306,7 @@ public:
{
if (action < ACTION_DELAYED_DESPAWN)
{
- Movement::MoveSplineInit init(me);
- FillCirclePath(MalygosPositions[3], 35.0f, 282.3402f, init.Path(), true);
- init.SetFly();
- init.SetCyclic();
- init.Launch();
+ me->GetMotionMaster()->MoveCirclePath(MalygosPositions[3].GetPositionX(), MalygosPositions[3].GetPositionY(), 282.3402f, 35.0f, true, 16);
}
else
{
@@ -1339,21 +1315,6 @@ public:
}
private:
- void FillCirclePath(Position const& centerPos, float radius, float z, Movement::PointsArray& path, bool clockwise)
- {
- float step = clockwise ? float(-M_PI) / 9.0f : float(M_PI) / 9.0f;
- float angle = centerPos.GetAngle(me->GetPositionX(), me->GetPositionY());
-
- for (uint8 i = 0; i < 18; angle += step, ++i)
- {
- G3D::Vector3 point;
- point.x = centerPos.GetPositionX() + radius * cosf(angle);
- point.y = centerPos.GetPositionY() + radius * sinf(angle);
- point.z = z; // Don't use any height getters unless all bugs are fixed.
- path.push_back(point);
- }
- }
-
InstanceScript* _instance;
};
diff --git a/src/server/scripts/Northrend/Nexus/Nexus/boss_commander_kolurg.cpp b/src/server/scripts/Northrend/Nexus/Nexus/boss_commander_kolurg.cpp
deleted file mode 100644
index fc56f541a4b..00000000000
--- a/src/server/scripts/Northrend/Nexus/Nexus/boss_commander_kolurg.cpp
+++ /dev/null
@@ -1,80 +0,0 @@
-/*
- * Copyright (C) 2008-2015 TrinityCore <http://www.trinitycore.org/>
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License as published by the
- * Free Software Foundation; either version 2 of the License, or (at your
- * option) any later version.
- *
- * This program is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
- * more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-
-/* Script Data Start
-SDName: Boss Commander Kolurg
-SDAuthor: LordVanMartin
-SD%Complete:
-SDComment: Only Alliance Heroic
-SDCategory:
-Script Data End */
-
-#include "ScriptMgr.h"
-#include "ScriptedCreature.h"
-
-enum Spells
-{
- SPELL_BATTLE_SHOUT = 31403,
- SPELL_CHARGE = 60067,
- SPELL_FRIGHTENING_SHOUT = 19134,
- SPELL_WHIRLWIND_1 = 38619,
- SPELL_WHIRLWIND_2 = 38618
-
-};
-
-//not used
-//Yell
-#define SAY_AGGRO -1576024
-#define SAY_KILL -1576025
-#define SAY_DEATH -1576026
-
-class boss_commander_kolurg : public CreatureScript
-{
-public:
- boss_commander_kolurg() : CreatureScript("boss_commander_kolurg") { }
-
- CreatureAI* GetAI(Creature* creature) const override
- {
- return new boss_commander_kolurgAI(creature);
- }
-
- struct boss_commander_kolurgAI : public ScriptedAI
- {
- boss_commander_kolurgAI(Creature* creature) : ScriptedAI(creature) { }
-
- void Reset() override { }
- void EnterCombat(Unit* /*who*/) override { }
- void AttackStart(Unit* /*who*/) override { }
- void MoveInLineOfSight(Unit* /*who*/) override { }
-
- void UpdateAI(uint32 /*diff*/) override
- {
- //Return since we have no target
- if (!UpdateVictim())
- return;
-
- DoMeleeAttackIfReady();
- }
- void JustDied(Unit* /*killer*/) override { }
- };
-
-};
-
-void AddSC_boss_commander_kolurg()
-{
- new boss_commander_kolurg();
-}
diff --git a/src/server/scripts/Northrend/Nexus/Nexus/boss_commander_stoutbeard.cpp b/src/server/scripts/Northrend/Nexus/Nexus/boss_commander_stoutbeard.cpp
deleted file mode 100644
index ff08038d898..00000000000
--- a/src/server/scripts/Northrend/Nexus/Nexus/boss_commander_stoutbeard.cpp
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- * Copyright (C) 2008-2015 TrinityCore <http://www.trinitycore.org/>
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License as published by the
- * Free Software Foundation; either version 2 of the License, or (at your
- * option) any later version.
- *
- * This program is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
- * more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-
-/* Script Data Start
-SDName: Boss Commander Stoutbeard
-SDAuthor: LordVanMartin
-SD%Complete:
-SDComment: Only Horde Heroic
-SDCategory:
-Script Data End */
-
-#include "ScriptMgr.h"
-#include "ScriptedCreature.h"
-
-enum CommanderStoutbeard
-{
- SPELL_BATTLE_SHOUT = 31403,
- SPELL_CHARGE = 60067,
- SPELL_FRIGHTENING_SHOUT = 19134,
- SPELL_WHIRLWIND_1 = 38619,
- SPELL_WHIRLWIND_2 = 38618
-};
-
-
-class boss_commander_stoutbeard : public CreatureScript
-{
-public:
- boss_commander_stoutbeard() : CreatureScript("boss_commander_stoutbeard") { }
-
- CreatureAI* GetAI(Creature* creature) const override
- {
- return new boss_commander_stoutbeardAI(creature);
- }
-
- struct boss_commander_stoutbeardAI : public ScriptedAI
- {
- boss_commander_stoutbeardAI(Creature* creature) : ScriptedAI(creature) { }
-
- void Reset() override { }
- void AttackStart(Unit* /*who*/) override { }
- void MoveInLineOfSight(Unit* /*who*/) override { }
-
- void UpdateAI(uint32 /*diff*/) override
- {
- //Return since we have no target
- if (!UpdateVictim())
- return;
-
- DoMeleeAttackIfReady();
- }
- };
-
-};
-
-void AddSC_boss_commander_stoutbeard()
-{
- new boss_commander_stoutbeard();
-}
diff --git a/src/server/scripts/Northrend/Nexus/Nexus/boss_nexus_commanders.cpp b/src/server/scripts/Northrend/Nexus/Nexus/boss_nexus_commanders.cpp
new file mode 100644
index 00000000000..d40f9fecc6a
--- /dev/null
+++ b/src/server/scripts/Northrend/Nexus/Nexus/boss_nexus_commanders.cpp
@@ -0,0 +1,110 @@
+/*
+ * Copyright (C) 2008-2015 TrinityCore <http://www.trinitycore.org/>
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; either version 2 of the License, or (at your
+ * option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "ScriptMgr.h"
+#include "ScriptedCreature.h"
+#include "nexus.h"
+
+enum Spells
+{
+ SPELL_BATTLE_SHOUT = 31403,
+ SPELL_CHARGE = 60067,
+ SPELL_FRIGHTENING_SHOUT = 19134,
+ SPELL_WHIRLWIND = 38618,
+ SPELL_FROZEN_PRISON = 47543
+};
+
+enum Yells
+{
+ SAY_AGGRO = 0,
+ SAY_KILL = 1,
+ SAY_DEATH = 2
+};
+
+enum Events
+{
+ EVENT_CHARGE_COMMANDER = 1,
+ EVENT_WHIRLWIND,
+ EVENT_FRIGHTENING_SHOUT
+};
+
+class boss_nexus_commanders : public CreatureScript
+{
+ public:
+ boss_nexus_commanders() : CreatureScript("boss_nexus_commanders") { }
+
+ struct boss_nexus_commandersAI : public BossAI
+ {
+ boss_nexus_commandersAI(Creature* creature) : BossAI(creature, DATA_COMMANDER) { }
+
+ void EnterCombat(Unit* /*who*/) override
+ {
+ _EnterCombat();
+ Talk(SAY_AGGRO);
+ me->RemoveAurasDueToSpell(SPELL_FROZEN_PRISON);
+ DoCast(me, SPELL_BATTLE_SHOUT);
+
+ events.ScheduleEvent(EVENT_CHARGE_COMMANDER, urand(3000, 4000));
+ events.ScheduleEvent(EVENT_WHIRLWIND, urand(6000, 8000));
+ events.ScheduleEvent(EVENT_FRIGHTENING_SHOUT, urand(13000, 15000));
+ }
+
+ void ExecuteEvent(uint32 eventId) override
+ {
+ switch (eventId)
+ {
+ case EVENT_CHARGE_COMMANDER:
+ if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100.0f, true))
+ DoCast(target, SPELL_CHARGE);
+ events.ScheduleEvent(EVENT_CHARGE_COMMANDER, urand(11000, 15000));
+ break;
+ case EVENT_WHIRLWIND:
+ DoCast(me, SPELL_WHIRLWIND);
+ events.ScheduleEvent(EVENT_WHIRLWIND, urand(19500, 25000));
+ break;
+ case EVENT_FRIGHTENING_SHOUT:
+ DoCastAOE(SPELL_FRIGHTENING_SHOUT);
+ events.ScheduleEvent(EVENT_FRIGHTENING_SHOUT, urand(45000, 55000));
+ break;
+ default:
+ break;
+ }
+ }
+
+ void JustDied(Unit* /*killer*/) override
+ {
+ _JustDied();
+ Talk(SAY_DEATH);
+ }
+
+ void KilledUnit(Unit* who) override
+ {
+ if (who->GetTypeId() == TYPEID_PLAYER)
+ Talk(SAY_KILL);
+ }
+ };
+
+ CreatureAI* GetAI(Creature* creature) const override
+ {
+ return GetInstanceAI<boss_nexus_commandersAI>(creature);
+ }
+};
+
+void AddSC_boss_nexus_commanders()
+{
+ new boss_nexus_commanders();
+}
diff --git a/src/server/scripts/Northrend/Nexus/Nexus/nexus.h b/src/server/scripts/Northrend/Nexus/Nexus/nexus.h
index 90866ea83f8..c48c7323301 100644
--- a/src/server/scripts/Northrend/Nexus/Nexus/nexus.h
+++ b/src/server/scripts/Northrend/Nexus/Nexus/nexus.h
@@ -21,32 +21,33 @@
#define NexusScriptName "instance_nexus"
#define DataHeader "NEX"
-uint32 const EncounterCount = 4;
+uint32 const EncounterCount = 5;
enum DataTypes
{
- DATA_MAGUS_TELESTRA = 0,
- DATA_ANOMALUS = 1,
- DATA_ORMOROK = 2,
- DATA_KERISTRASZA = 3,
+ DATA_COMMANDER = 0,
+ DATA_MAGUS_TELESTRA = 1,
+ DATA_ANOMALUS = 2,
+ DATA_ORMOROK = 3,
+ DATA_KERISTRASZA = 4,
- ANOMALUS_CONTAINMET_SPHERE = 4,
- ORMOROKS_CONTAINMET_SPHERE = 5,
- TELESTRAS_CONTAINMET_SPHERE = 6
+ ANOMALUS_CONTAINMET_SPHERE = 5,
+ ORMOROKS_CONTAINMET_SPHERE = 6,
+ TELESTRAS_CONTAINMET_SPHERE = 7
};
enum CreatureIds
{
NPC_ANOMALUS = 26763,
NPC_KERISTRASZA = 26723,
-
+
// Alliance
NPC_ALLIANCE_BERSERKER = 26800,
NPC_ALLIANCE_RANGER = 26802,
NPC_ALLIANCE_CLERIC = 26805,
NPC_ALLIANCE_COMMANDER = 27949,
NPC_COMMANDER_STOUTBEARD = 26796,
-
+
// Horde
NPC_HORDE_BERSERKER = 26799,
NPC_HORDE_RANGER = 26801,
@@ -59,7 +60,7 @@ enum GameObjectIds
{
GO_ANOMALUS_CONTAINMET_SPHERE = 188527,
GO_ORMOROKS_CONTAINMET_SPHERE = 188528,
- GO_TELESTRAS_CONTAINMET_SPHERE = 188526
+ GO_TELESTRAS_CONTAINMET_SPHERE = 188526
};
#endif
diff --git a/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_volkhan.cpp b/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_volkhan.cpp
index 7bc8a5300f4..536cae08483 100644
--- a/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_volkhan.cpp
+++ b/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_volkhan.cpp
@@ -29,7 +29,7 @@ EndScriptData */
#include "Player.h"
#include "SpellInfo.h"
-enum Enums
+enum Texts
{
SAY_AGGRO = 0,
SAY_FORGE = 1,
@@ -38,29 +38,50 @@ enum Enums
SAY_DEATH = 4,
EMOTE_TO_ANVIL = 5,
EMOTE_SHATTER = 6,
+};
+enum Spells
+{
SPELL_HEAT = 52387,
SPELL_SHATTERING_STOMP = 52237,
-
SPELL_TEMPER = 52238,
SPELL_TEMPER_DUMMY = 52654,
-
SPELL_SUMMON_MOLTEN_GOLEM = 52405,
+ SPELL_FORGE_VISUAL = 52654,
// Molten Golem
SPELL_BLAST_WAVE = 23113,
SPELL_IMMOLATION_STRIKE = 52433,
SPELL_SHATTER = 52429,
+};
+enum Events
+{
+ EVENT_PAUSE = 1,
+ EVENT_SHATTERING_STOMP = 2,
+ EVENT_SHATTER = 3,
+ EVENT_FORGE_CAST = 4,
+
+ // Molten Golem
+ EVENT_BLAST = 5,
+ EVENT_IMMOLATION = 6
+};
+
+enum Npcs
+{
NPC_VOLKHAN_ANVIL = 28823,
NPC_MOLTEN_GOLEM = 28695,
NPC_BRITTLE_GOLEM = 28681,
-
MAX_GOLEM = 2,
-
DATA_SHATTER_RESISTANT = 2042
};
+enum Phases
+{
+ PHASE_INTRO = 1,
+ PHASE_NORMAL
+};
+
/*######
## Boss Volkhan
######*/
@@ -68,68 +89,44 @@ class boss_volkhan : public CreatureScript
{
public:
boss_volkhan() : CreatureScript("boss_volkhan") { }
-
- CreatureAI* GetAI(Creature* creature) const override
- {
- return GetInstanceAI<boss_volkhanAI>(creature);
- }
-
- struct boss_volkhanAI : public ScriptedAI
+
+ struct boss_volkhanAI : public BossAI
{
- boss_volkhanAI(Creature* creature) : ScriptedAI(creature)
+ boss_volkhanAI(Creature* creature) : BossAI(creature, DATA_VOLKHAN)
{
Initialize();
- instance = creature->GetInstanceScript();
}
void Initialize()
{
- m_bIsStriking = false;
- m_bHasTemper = false;
+ m_bIsStriking = false;
+ m_bHasTemper = false;
m_bCanShatterGolem = false;
-
- m_uiPause_Timer = 3500;
- m_uiShatteringStomp_Timer = 0;
- m_uiShatter_Timer = 5000;
- m_uiDelay_Timer = 1000;
- m_uiSummonPhase = 0;
- GolemsShattered = 0;
+ m_uiDelay_Timer = 1000;
+ m_uiSummonPhase = 0;
+ GolemsShattered = 0;
m_uiHealthAmountModifier = 1;
}
- InstanceScript* instance;
-
- GuidList m_lGolemGUIDList;
-
- bool m_bHasTemper;
- bool m_bIsStriking;
- bool m_bCanShatterGolem;
-
- uint8 GolemsShattered;
- uint32 m_uiPause_Timer;
- uint32 m_uiShatteringStomp_Timer;
- uint32 m_uiShatter_Timer;
- uint32 m_uiDelay_Timer;
- uint32 m_uiSummonPhase;
-
- uint32 m_uiHealthAmountModifier;
-
void Reset() override
{
Initialize();
-
+ _Reset();
DespawnGolem();
m_lGolemGUIDList.clear();
-
- instance->SetBossState(DATA_VOLKHAN, NOT_STARTED);
+ events.SetPhase(PHASE_INTRO);
+ events.ScheduleEvent(EVENT_FORGE_CAST, 2 * IN_MILLISECONDS, 0, PHASE_INTRO);
}
void EnterCombat(Unit* /*who*/) override
{
Talk(SAY_AGGRO);
-
- instance->SetBossState(DATA_VOLKHAN, IN_PROGRESS);
+ events.SetPhase(PHASE_NORMAL);
+ events.ScheduleEvent(EVENT_PAUSE, 3.5 * IN_MILLISECONDS, 0, PHASE_NORMAL);
+ events.ScheduleEvent(EVENT_SHATTERING_STOMP, 0 * IN_MILLISECONDS, 0, PHASE_NORMAL);
+ events.ScheduleEvent(EVENT_SHATTER, 5 * IN_MILLISECONDS, 0, PHASE_NORMAL);
+ _EnterCombat();
}
void AttackStart(Unit* who) override
@@ -150,7 +147,7 @@ public:
Talk(SAY_DEATH);
DespawnGolem();
- instance->SetBossState(DATA_VOLKHAN, DONE);
+ _JustDied();
}
void KilledUnit(Unit* who) override
@@ -224,59 +221,61 @@ public:
return 0;
}
- void UpdateAI(uint32 uiDiff) override
+ void UpdateAI(uint32 diff) override
{
- if (!UpdateVictim())
+ // Return since we have no target and are in CombatPhase
+ if (events.IsInPhase(PHASE_NORMAL) && !UpdateVictim())
return;
- if (m_bIsStriking)
- {
- if (m_uiPause_Timer <= uiDiff)
- {
- if (me->GetMotionMaster()->GetCurrentMovementGeneratorType() != CHASE_MOTION_TYPE)
- if (me->GetVictim())
- me->GetMotionMaster()->MoveChase(me->GetVictim());
-
- m_bHasTemper = false;
- m_bIsStriking = false;
- m_uiPause_Timer = 3500;
- }
- else
- m_uiPause_Timer -= uiDiff;
+ events.Update(diff);
+ if (me->HasUnitState(UNIT_STATE_CASTING))
return;
- }
- // When to start shatter? After 60, 40 or 20% hp?
- if (!m_bHasTemper && m_uiHealthAmountModifier >= 3)
+ while (uint32 eventId = events.ExecuteEvent())
{
- if (m_uiShatteringStomp_Timer <= uiDiff)
+ switch (eventId)
{
- // Should he stomp even if he has no brittle golem to shatter?
- Talk(SAY_STOMP);
-
- DoCast(me, SPELL_SHATTERING_STOMP);
+ case EVENT_PAUSE:
+ if (m_bIsStriking)
+ {
+ if (me->GetMotionMaster()->GetCurrentMovementGeneratorType() != CHASE_MOTION_TYPE)
+ if (me->GetVictim())
+ me->GetMotionMaster()->MoveChase(me->GetVictim());
- Talk(EMOTE_SHATTER);
+ m_bHasTemper = false;
+ m_bIsStriking = false;
+ events.ScheduleEvent(EVENT_PAUSE, 3.5 * IN_MILLISECONDS, 0, PHASE_NORMAL);
+ }
+ break;
+ case EVENT_SHATTERING_STOMP:
+ if (!m_bHasTemper && m_uiHealthAmountModifier >= 3)
+ {
+ // Should he stomp even if he has no brittle golem to shatter?
+ Talk(SAY_STOMP);
- m_uiShatteringStomp_Timer = 30000;
- m_bCanShatterGolem = true;
- }
- else
- m_uiShatteringStomp_Timer -= uiDiff;
- }
+ DoCast(me, SPELL_SHATTERING_STOMP);
- // Shatter Golems 3 seconds after Shattering Stomp
- if (m_bCanShatterGolem)
- {
- if (m_uiShatter_Timer <= uiDiff)
- {
- ShatterGolem();
- m_uiShatter_Timer = 3000;
- m_bCanShatterGolem = false;
+ Talk(EMOTE_SHATTER);
+ events.ScheduleEvent(EVENT_SHATTERING_STOMP, 30 * IN_MILLISECONDS, 0, PHASE_NORMAL);
+ m_bCanShatterGolem = true;
+ }
+ break;
+ case EVENT_SHATTER:
+ if (m_bCanShatterGolem)
+ {
+ ShatterGolem();
+ events.ScheduleEvent(EVENT_SHATTER, 3 * IN_MILLISECONDS, 0, PHASE_NORMAL);
+ m_bCanShatterGolem = false;
+ }
+ break;
+ case EVENT_FORGE_CAST:
+ DoCast(me, SPELL_FORGE_VISUAL);
+ events.ScheduleEvent(EVENT_FORGE_CAST, 15 * IN_MILLISECONDS, 0, PHASE_INTRO);
+ break;
+ default:
+ break;
}
- else
- m_uiShatter_Timer -= uiDiff;
}
// Health check
@@ -302,12 +301,10 @@ public:
me->GetMotionMaster()->MoveTargetedHome();
m_uiSummonPhase = 2; // Set Next Phase
break;
-
case 2:
// 2 - Check if reached Anvil
// This is handled in: void JustReachedHome() override
break;
-
case 3:
// 3 - Cast Temper on the Anvil
if (Unit* target = GetClosestCreatureWithEntry(me, NPC_VOLKHAN_ANVIL, 1000.0f, true))
@@ -319,10 +316,9 @@ public:
m_uiDelay_Timer = 1000; // Delay 2 seconds before next phase can begin
m_uiSummonPhase = 4; // Set Next Phase
break;
-
case 4:
// 4 - Wait for delay to expire
- if (m_uiDelay_Timer <= uiDiff)
+ if (m_uiDelay_Timer <= diff)
{
if (Unit* target = SelectTarget(SELECT_TARGET_TOPAGGRO, 0))
{
@@ -333,9 +329,8 @@ public:
m_uiSummonPhase = 5;
}
else
- m_uiDelay_Timer -= uiDiff;
+ m_uiDelay_Timer -= diff;
break;
-
case 5:
// 5 - Spawn the Golems
if (Creature* creatureTarget = GetClosestCreatureWithEntry(me, NPC_VOLKHAN_ANVIL, 1000.0f, true))
@@ -349,13 +344,30 @@ public:
DoMeleeAttackIfReady();
}
+
+ private:
+ GuidList m_lGolemGUIDList;
+ uint32 m_uiHealthAmountModifier;
+ uint8 GolemsShattered;
+ uint32 m_uiDelay_Timer;
+ uint32 m_uiSummonPhase;
+
+ bool m_bHasTemper;
+ bool m_bIsStriking;
+ bool m_bCanShatterGolem;
};
+ CreatureAI* GetAI(Creature* creature) const override
+ {
+ return GetInstanceAI<boss_volkhanAI>(creature);
+ }
+
};
/*######
## npc_molten_golem
######*/
+
class npc_molten_golem : public CreatureScript
{
public:
@@ -376,18 +388,12 @@ public:
void Initialize()
{
m_bIsFrozen = false;
-
- m_uiBlast_Timer = 20000;
- m_uiDeathDelay_Timer = 0;
- m_uiImmolation_Timer = 5000;
+ events.ScheduleEvent(EVENT_BLAST, 20 * IN_MILLISECONDS);
+ events.ScheduleEvent(EVENT_IMMOLATION, 5 * IN_MILLISECONDS);
}
bool m_bIsFrozen;
- uint32 m_uiBlast_Timer;
- uint32 m_uiDeathDelay_Timer;
- uint32 m_uiImmolation_Timer;
-
void Reset() override
{
Initialize();
@@ -433,30 +439,39 @@ public:
me->DespawnOrUnsummon();
}
- void UpdateAI(uint32 uiDiff) override
+ void UpdateAI(uint32 diff) override
{
// Return since we have no target or if we are frozen
if (!UpdateVictim() || m_bIsFrozen)
return;
- if (m_uiBlast_Timer <= uiDiff)
- {
- DoCast(me, SPELL_BLAST_WAVE);
- m_uiBlast_Timer = 20000;
- }
- else
- m_uiBlast_Timer -= uiDiff;
+ events.Update(diff);
+
+ if (me->HasUnitState(UNIT_STATE_CASTING))
+ return;
- if (m_uiImmolation_Timer <= uiDiff)
+ while (uint32 eventId = events.ExecuteEvent())
{
- DoCastVictim(SPELL_IMMOLATION_STRIKE);
- m_uiImmolation_Timer = 5000;
+ switch (eventId)
+ {
+ case EVENT_BLAST:
+ DoCast(me, SPELL_BLAST_WAVE);
+ events.ScheduleEvent(EVENT_BLAST, 20 * IN_MILLISECONDS);
+ break;
+ case EVENT_IMMOLATION:
+ DoCastVictim(SPELL_IMMOLATION_STRIKE);
+ events.ScheduleEvent(EVENT_BLAST, 5 * IN_MILLISECONDS);
+ break;
+ default:
+ break;
+ }
}
- else
- m_uiImmolation_Timer -= uiDiff;
DoMeleeAttackIfReady();
}
+
+ private:
+ EventMap events;
};
};
diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_yogg_saron.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_yogg_saron.cpp
index a682e405d08..a7a9f8dde88 100644
--- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_yogg_saron.cpp
+++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_yogg_saron.cpp
@@ -1126,30 +1126,11 @@ class npc_ominous_cloud : public CreatureScript
DoCast(me, SPELL_OMINOUS_CLOUD_VISUAL);
}
- void FillCirclePath(Position const& centerPos, float radius, float z, Movement::PointsArray& path, bool clockwise)
- {
- float step = clockwise ? float(-M_PI) / 8.0f : float(M_PI) / 8.0f;
- float angle = centerPos.GetAngle(me->GetPositionX(), me->GetPositionY());
-
- for (uint8 i = 0; i < 16; angle += step, ++i)
- {
- G3D::Vector3 point;
- point.x = centerPos.GetPositionX() + radius * cosf(angle);
- point.y = centerPos.GetPositionY() + radius * sinf(angle);
- point.z = me->GetMap()->GetHeight(me->GetPhaseMask(), point.x, point.y, z + 5.0f);
- path.push_back(point);
- }
- }
-
void UpdateAI(uint32 /*diff*/) override { }
void DoAction(int32 action) override
{
- Movement::MoveSplineInit init(me);
- FillCirclePath(YoggSaronSpawnPos, me->GetDistance2d(YoggSaronSpawnPos.GetPositionX(), YoggSaronSpawnPos.GetPositionY()), me->GetPositionZ(), init.Path(), action != 0);
- init.SetWalk(true);
- init.SetCyclic();
- init.Launch();
+ me->GetMotionMaster()->MoveCirclePath(YoggSaronSpawnPos.GetPositionX(), YoggSaronSpawnPos.GetPositionY(), me->GetPositionZ() + 5.0f, me->GetDistance2d(YoggSaronSpawnPos.GetPositionX(), YoggSaronSpawnPos.GetPositionY()), true, 16);
}
};
diff --git a/src/server/scripts/Northrend/VioletHold/boss_zuramat.cpp b/src/server/scripts/Northrend/VioletHold/boss_zuramat.cpp
index d1df244b733..90fd936e853 100644
--- a/src/server/scripts/Northrend/VioletHold/boss_zuramat.cpp
+++ b/src/server/scripts/Northrend/VioletHold/boss_zuramat.cpp
@@ -26,9 +26,6 @@ enum Spells
SPELL_SUMMON_VOID_SENTRY = 54369,
SPELL_VOID_SHIFT = 54361,
H_SPELL_VOID_SHIFT = 59743,
-
- SPELL_ZURAMAT_ADD_2 = 54342,
- H_SPELL_ZURAMAT_ADD_2 = 59747
};
enum Creatures
@@ -192,12 +189,6 @@ public:
Talk(SAY_SLAY);
}
- void JustSummoned(Creature* summon) override
- {
- summon->AI()->AttackStart(me->GetVictim());
- summon->CastSpell((Unit*)NULL, SPELL_ZURAMAT_ADD_2);
- summon->SetPhaseMask(17, true);
- }
};
};
diff --git a/src/server/scripts/Northrend/VioletHold/instance_violet_hold.cpp b/src/server/scripts/Northrend/VioletHold/instance_violet_hold.cpp
index 3e3ce5cde75..a462c68e084 100644
--- a/src/server/scripts/Northrend/VioletHold/instance_violet_hold.cpp
+++ b/src/server/scripts/Northrend/VioletHold/instance_violet_hold.cpp
@@ -133,6 +133,7 @@ public:
uiCyanigosaEventTimer = 3 * IN_MILLISECONDS;
bActive = false;
+ bWiped = false;
bIsDoorSpellCast = false;
bCrystalActivated = false;
defenseless = true;
diff --git a/src/server/scripts/Northrend/zone_borean_tundra.cpp b/src/server/scripts/Northrend/zone_borean_tundra.cpp
index 9a577516126..4aea36e3fe7 100644
--- a/src/server/scripts/Northrend/zone_borean_tundra.cpp
+++ b/src/server/scripts/Northrend/zone_borean_tundra.cpp
@@ -29,7 +29,6 @@ npc_corastrasza
npc_sinkhole_kill_credit
npc_khunok_the_behemoth
npc_nerubar_victim
-npc_keristrasza
npc_nesingwary_trapper
npc_lurgglbr
npc_nexus_drake_hatchling
@@ -223,48 +222,6 @@ public:
};
/*######
-## npc_keristrasza
-######*/
-
-enum Keristrasza
-{
- SPELL_TELEPORT_TO_SARAGOSA = 46772
-};
-
-#define GOSSIP_HELLO_KERI "I am prepared to face Saragosa!"
-
-class npc_keristrasza : public CreatureScript
-{
-public:
- npc_keristrasza() : CreatureScript("npc_keristrasza") { }
-
- bool OnGossipHello(Player* player, Creature* creature) override
- {
- if (creature->IsQuestGiver())
- player->PrepareQuestMenu(creature->GetGUID());
-
- if (player->GetQuestStatus(11957) == QUEST_STATUS_INCOMPLETE)
- player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_HELLO_KERI, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1);
-
- player->SEND_GOSSIP_MENU(player->GetGossipTextId(creature), creature->GetGUID());
-
- return true;
- }
-
- bool OnGossipSelect(Player* player, Creature* /*creature*/, uint32 /*sender*/, uint32 action) override
- {
- player->PlayerTalkClass->ClearMenus();
- if (action == GOSSIP_ACTION_INFO_DEF + 1)
- {
- player->CLOSE_GOSSIP_MENU();
- player->CastSpell(player, SPELL_TELEPORT_TO_SARAGOSA, true);
- }
-
- return true;
- }
-};
-
-/*######
## npc_corastrasza
######*/
@@ -438,6 +395,9 @@ enum NesingwaryTrapper
GO_CARIBOU_TRAP_15 = 188008,
SPELL_TRAPPED = 46104,
+
+ // Texts
+ SAY_NESINGWARY_1 = 0
};
#define CaribouTrapsNum 15
@@ -514,7 +474,7 @@ public:
phase = 3;
break;
case 3:
- //Talk(SAY_NESINGWARY_1);
+ Talk(SAY_NESINGWARY_1);
phaseTimer = 2000;
phase = 4;
break;
@@ -2488,7 +2448,6 @@ void AddSC_borean_tundra()
{
new npc_sinkhole_kill_credit();
new npc_khunok_the_behemoth();
- new npc_keristrasza();
new npc_corastrasza();
new npc_iruk();
new npc_nerubar_victim();
diff --git a/src/server/scripts/Northrend/zone_storm_peaks.cpp b/src/server/scripts/Northrend/zone_storm_peaks.cpp
index bfdea4a1435..bb1e88ce158 100644
--- a/src/server/scripts/Northrend/zone_storm_peaks.cpp
+++ b/src/server/scripts/Northrend/zone_storm_peaks.cpp
@@ -641,97 +641,6 @@ enum JokkumScriptcast
EVENT_KROLMIR_9 = 24,
};
-class npc_king_jokkum_vehicle : public CreatureScript
-{
-public:
- npc_king_jokkum_vehicle() : CreatureScript("npc_king_jokkum_vehicle") { }
-
- struct npc_king_jokkum_vehicleAI : public VehicleAI
- {
- npc_king_jokkum_vehicleAI(Creature* creature) : VehicleAI(creature)
- {
- pathEnd = false;
- }
-
- void Reset() override
- {
- playerGUID.Clear();
- pathEnd = false;
- }
-
- void OnCharmed(bool /*apply*/) override { }
-
- void PassengerBoarded(Unit* who, int8 /*seat*/, bool apply) override
- {
- if (apply)
- {
- playerGUID = who->GetGUID();
- Talk(SAY_HOLD_ON, who);
- me->CastSpell(who, SPELL_JOKKUM_KILL_CREDIT, true);
- me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_NPC);
- me->GetMotionMaster()->MovePath(PATH_JOKKUM, false);
- }
- }
-
- void MovementInform(uint32 type, uint32 id) override
- {
- if (type != WAYPOINT_MOTION_TYPE)
- return;
-
- if (pathEnd)
- {
- if (id == 4)
- {
-
- }
- }
- else
- {
- if (id == 19)
- {
- pathEnd = true;
- me->SetFacingTo(0.418879f);
- Talk(SAY_JOKKUM_1);
- if (Player* player = ObjectAccessor::GetPlayer(*me, playerGUID))
- me->CastSpell(player, SPELL_PLAYER_CAST_VERANUS_SUMMON);
- me->CastSpell(me, SPELL_EJECT_ALL_PASSENGERS);
-
- }
- }
- }
-
- void UpdateAI(uint32 diff) override
- {
- if (!pathEnd)
- return;
-
- events.Update(diff);
-
- while (uint32 eventId = events.ExecuteEvent())
- {
- switch (eventId)
- {
- case EVENT_KROLMIR_1:
- Talk(SAY_JOKKUM_2);
- events.ScheduleEvent(EVENT_KROLMIR_2, 4000);
- break;
- }
- }
- }
-
- private:
- EventMap events;
- ObjectGuid playerGUID;
- bool pathEnd;
-
- };
-
- CreatureAI* GetAI(Creature* creature) const override
- {
- return new npc_king_jokkum_vehicleAI(creature);
- }
-};
-
class spell_jokkum_scriptcast : public SpellScriptLoader
{
public: spell_jokkum_scriptcast() : SpellScriptLoader("spell_jokkum_scriptcast") { }
@@ -855,7 +764,6 @@ void AddSC_storm_peaks()
new npc_icefang();
new npc_hyldsmeet_protodrake();
new npc_brann_bronzebeard_keystone();
- new npc_king_jokkum_vehicle();
new spell_jokkum_scriptcast();
new spell_veranus_summon();
new spell_close_rift();
diff --git a/src/server/scripts/Northrend/zone_zuldrak.cpp b/src/server/scripts/Northrend/zone_zuldrak.cpp
index f73930181f0..91c796a6e69 100644
--- a/src/server/scripts/Northrend/zone_zuldrak.cpp
+++ b/src/server/scripts/Northrend/zone_zuldrak.cpp
@@ -313,7 +313,7 @@ public:
{
player->KilledMonsterCredit(gymerDummy->GetEntry(), gymerDummy->GetGUID());
gymerDummy->CastSpell(gymerDummy, SPELL_GYMER_LOCK_EXPLOSION, true);
- gymerDummy->DespawnOrUnsummon();
+ gymerDummy->DespawnOrUnsummon(4 * IN_MILLISECONDS);
}
}
return true;
diff --git a/src/server/scripts/Outland/BlackTemple/boss_shade_of_akama.cpp b/src/server/scripts/Outland/BlackTemple/boss_shade_of_akama.cpp
index 728b164cc04..e4369f0348d 100644
--- a/src/server/scripts/Outland/BlackTemple/boss_shade_of_akama.cpp
+++ b/src/server/scripts/Outland/BlackTemple/boss_shade_of_akama.cpp
@@ -93,15 +93,12 @@ enum Factions
FACTION_COMBAT = 1868
};
-enum SetData
+enum Actions
{
- SETDATA_DATA = 1,
- SETDATA_RESET = 1,
- SETDATA_CHANNELER_DIED = 2,
- SETDATA_START_SPAWNING = 3,
- SETDATA_STOP_SPAWNING = 4,
- SETDATA_DESPAWN_ALL_SPAWNS = 5,
- SETDATA_START_ATTACK_AKAMA = 6
+ ACTION_CHANNELER_DIED = 1,
+ ACTION_START_SPAWNING = 2,
+ ACTION_STOP_SPAWNING = 3,
+ ACTION_DESPAWN_ALL_SPAWNS = 4,
};
enum Events
@@ -158,12 +155,11 @@ class boss_shade_of_akama : public CreatureScript
public:
boss_shade_of_akama() : CreatureScript("boss_shade_of_akama") { }
- struct boss_shade_of_akamaAI : public ScriptedAI
+ struct boss_shade_of_akamaAI : public BossAI
{
- boss_shade_of_akamaAI(Creature* creature) : ScriptedAI(creature)
+ boss_shade_of_akamaAI(Creature* creature) : BossAI(creature, DATA_SHADE_OF_AKAMA)
{
Initialize();
- instance = creature->GetInstanceScript();
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
}
@@ -177,6 +173,7 @@ public:
void Reset() override
{
+ _Reset();
if (!HasKilledAkamaAndReseting)
{
for (GuidList::const_iterator itr = Channelers.begin(); itr != Channelers.end(); ++itr)
@@ -185,7 +182,7 @@ public:
for (GuidList::const_iterator itr = Spawners.begin(); itr != Spawners.end(); ++itr)
if (Creature* Spawner = ObjectAccessor::GetCreature(*me, *itr))
- Spawner->AI()->SetData(SETDATA_DATA, SETDATA_DESPAWN_ALL_SPAWNS);
+ Spawner->AI()->DoAction(ACTION_DESPAWN_ALL_SPAWNS);
events.ScheduleEvent(EVENT_FIND_CHANNELERS_SPAWNERS, 3000);
events.ScheduleEvent(EVENT_RESET_ENCOUNTER, 5000);
@@ -197,11 +194,6 @@ public:
Initialize();
}
- void JustDied(Unit* /*killer*/) override
- {
- instance->SetBossState(DATA_SHADE_OF_AKAMA, DONE);
- }
-
void EnterCombat(Unit* /*who*/) override { }
void AttackStart(Unit* who) override
@@ -216,9 +208,9 @@ public:
ScriptedAI::AttackStart(who);
}
- void SetData(uint32 data, uint32 value) override
+ void DoAction(int32 actionId) override
{
- if (data == SETDATA_DATA && value == SETDATA_CHANNELER_DIED)
+ if (actionId == ACTION_CHANNELER_DIED)
me->RemoveAuraFromStack(SPELL_SHADE_SOUL_CHANNEL_2);
UpdateSpeed();
@@ -314,7 +306,7 @@ public:
for (GuidList::const_iterator itr = Spawners.begin(); itr != Spawners.end(); ++itr)
if (Creature* Spawner = ObjectAccessor::GetCreature(*me, *itr))
- Spawner->AI()->SetData(SETDATA_DATA, SETDATA_START_SPAWNING);
+ Spawner->AI()->DoAction(ACTION_START_SPAWNING);
break;
}
case EVENT_START_ATTACK_AKAMA:
@@ -353,7 +345,7 @@ public:
for (GuidList::const_iterator itr = Spawners.begin(); itr != Spawners.end(); ++itr)
if (Creature* Spawner = ObjectAccessor::GetCreature(*me, *itr))
- Spawner->AI()->SetData(SETDATA_DATA, SETDATA_DESPAWN_ALL_SPAWNS);
+ Spawner->AI()->DoAction(ACTION_DESPAWN_ALL_SPAWNS);
events.ScheduleEvent(EVENT_FIND_CHANNELERS_SPAWNERS, 10000);
events.ScheduleEvent(EVENT_RESET_ENCOUNTER, 20000);
@@ -378,7 +370,7 @@ public:
for (GuidList::const_iterator itr = Spawners.begin(); itr != Spawners.end(); ++itr)
if (Creature* Spawner = ObjectAccessor::GetCreature(*me, *itr))
- Spawner->AI()->SetData(SETDATA_DATA, SETDATA_STOP_SPAWNING);
+ Spawner->AI()->DoAction(ACTION_STOP_SPAWNING);
}
}
}
@@ -390,8 +382,6 @@ public:
public:
bool HasKilledAkama;
private:
- InstanceScript* instance;
- EventMap events;
GuidList Channelers;
GuidList Spawners;
bool akamaReached;
@@ -433,9 +423,11 @@ public:
void Reset() override
{
me->setFaction(FACTION_FRIENDLY);
- me->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP);
DoCast(me, SPELL_STEALTH);
Initialize();
+
+ if (instance->GetBossState(DATA_SHADE_OF_AKAMA) != DONE)
+ me->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP);
}
void JustDied(Unit* /*killer*/) override
@@ -581,7 +573,7 @@ public:
void JustDied(Unit* /*killer*/) override
{
if (Creature* Shade = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_SHADE_OF_AKAMA)))
- Shade->AI()->SetData(SETDATA_DATA, SETDATA_CHANNELER_DIED);
+ Shade->AI()->DoAction(ACTION_CHANNELER_DIED);
}
void EnterCombat(Unit* /*who*/) override { }
@@ -603,7 +595,7 @@ public:
else
{
me->InterruptSpell(CURRENT_CHANNELED_SPELL);
- Shade->AI()->SetData(SETDATA_DATA, SETDATA_CHANNELER_DIED);
+ Shade->AI()->DoAction(ACTION_CHANNELER_DIED);
}
}
events.ScheduleEvent(EVENT_CHANNEL, 2000);
@@ -663,36 +655,33 @@ public:
Summons.Summon(summon);
}
- void SetData(uint32 data, uint32 value) override
+ void DoAction(int32 actionId) override
{
- if (data == SETDATA_DATA)
- {
- doSpawning = true;
+ doSpawning = true;
- switch (value)
- {
- case SETDATA_START_SPAWNING:
- if (leftSide)
- {
- events.ScheduleEvent(EVENT_SPAWN_WAVE_B, 100);
- events.ScheduleEvent(EVENT_SUMMON_ASHTONGUE_SORCERER, urand(2000, 5000));
- }
- else
- {
- events.ScheduleEvent(EVENT_SPAWN_WAVE_B, 10000);
- events.ScheduleEvent(EVENT_SUMMON_ASHTONGUE_DEFENDER, urand(2000, 5000));
- }
- break;
- case SETDATA_STOP_SPAWNING:
- doSpawning = false;
- break;
- case SETDATA_DESPAWN_ALL_SPAWNS:
- doSpawning = false;
- Summons.DespawnAll();
- break;
- default:
- break;
- }
+ switch (actionId)
+ {
+ case ACTION_START_SPAWNING:
+ if (leftSide)
+ {
+ events.ScheduleEvent(EVENT_SPAWN_WAVE_B, 100);
+ events.ScheduleEvent(EVENT_SUMMON_ASHTONGUE_SORCERER, urand(2000, 5000));
+ }
+ else
+ {
+ events.ScheduleEvent(EVENT_SPAWN_WAVE_B, 10000);
+ events.ScheduleEvent(EVENT_SUMMON_ASHTONGUE_DEFENDER, urand(2000, 5000));
+ }
+ break;
+ case ACTION_STOP_SPAWNING:
+ doSpawning = false;
+ break;
+ case ACTION_DESPAWN_ALL_SPAWNS:
+ doSpawning = false;
+ Summons.DespawnAll();
+ break;
+ default:
+ break;
}
}
@@ -778,23 +767,16 @@ public:
}
}
- summonerGuid.Clear();
Initialize();
}
void JustDied(Unit* /*killer*/) override
{
if (Creature* Shade = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_SHADE_OF_AKAMA)))
- Shade->AI()->SetData(SETDATA_DATA, SETDATA_CHANNELER_DIED);
+ Shade->AI()->DoAction(ACTION_CHANNELER_DIED);
me->DespawnOrUnsummon(5000);
}
- void IsSummonedBy(Unit* /*summoner*/) override
- {
- if (Creature* summoner = (ObjectAccessor::GetCreature((*me), summonerGuid)))
- ENSURE_AI(npc_creature_generator_akama::npc_creature_generator_akamaAI, summoner->AI())->JustSummoned(me);
- }
-
void EnterCombat(Unit* /*who*/) override { }
void AttackStart(Unit* who) override
@@ -824,7 +806,7 @@ public:
else
{
me->InterruptSpell(CURRENT_CHANNELED_SPELL);
- Shade->AI()->SetData(SETDATA_DATA, SETDATA_CHANNELER_DIED);
+ Shade->AI()->DoAction(ACTION_CHANNELER_DIED);
switchToCombat = true;
if (Unit* target = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_AKAMA_SHADE)))
AttackStart(target);
@@ -855,7 +837,6 @@ public:
private:
InstanceScript* instance;
EventMap events;
- ObjectGuid summonerGuid;
bool startedBanishing;
bool switchToCombat;
};
@@ -884,8 +865,6 @@ public:
void Reset() override
{
- summonerGuid.Clear();
-
if (Unit* target = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_AKAMA_SHADE)))
AttackStart(target);
}
@@ -895,12 +874,6 @@ public:
me->DespawnOrUnsummon(5000);
}
- void IsSummonedBy(Unit* /*summoner*/) override
- {
- if (Creature* summoner = (ObjectAccessor::GetCreature((*me), summonerGuid)))
- ENSURE_AI(npc_creature_generator_akama::npc_creature_generator_akamaAI, summoner->AI())->JustSummoned(me);
- }
-
void EnterCombat(Unit* /*who*/) override
{
events.ScheduleEvent(EVENT_HEROIC_STRIKE, 5000);
@@ -947,7 +920,6 @@ public:
private:
InstanceScript* instance;
EventMap events;
- ObjectGuid summonerGuid;
};
CreatureAI* GetAI(Creature* creature) const override
@@ -974,8 +946,6 @@ public:
void Reset() override
{
- summonerGuid.Clear();
-
if (Unit* target = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_AKAMA_SHADE)))
AttackStart(target);
}
@@ -985,12 +955,6 @@ public:
me->DespawnOrUnsummon(5000);
}
- void IsSummonedBy(Unit* /*summoner*/) override
- {
- if (Creature* summoner = (ObjectAccessor::GetCreature((*me), summonerGuid)))
- ENSURE_AI(npc_creature_generator_akama::npc_creature_generator_akamaAI, summoner->AI())->JustSummoned(me);
- }
-
void EnterCombat(Unit* /*who*/) override
{
events.ScheduleEvent(EVENT_DEBILITATING_POISON, urand(500, 2000));
@@ -1027,7 +991,6 @@ public:
private:
InstanceScript* instance;
EventMap events;
- ObjectGuid summonerGuid;
};
CreatureAI* GetAI(Creature* creature) const override
@@ -1054,8 +1017,6 @@ public:
void Reset() override
{
- summonerGuid.Clear();
-
if (Unit* target = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_AKAMA_SHADE)))
AttackStart(target);
}
@@ -1065,12 +1026,6 @@ public:
me->DespawnOrUnsummon(5000);
}
- void IsSummonedBy(Unit* /*summoner*/) override
- {
- if (Creature* summoner = (ObjectAccessor::GetCreature((*me), summonerGuid)))
- ENSURE_AI(npc_creature_generator_akama::npc_creature_generator_akamaAI, summoner->AI())->JustSummoned(me);
- }
-
void EnterCombat(Unit* /*who*/) override
{
events.ScheduleEvent(EVENT_RAIN_OF_FIRE, 18000);
@@ -1107,7 +1062,6 @@ public:
private:
InstanceScript* instance;
EventMap events;
- ObjectGuid summonerGuid;
};
CreatureAI* GetAI(Creature* creature) const override
@@ -1137,7 +1091,6 @@ public:
{
spiritMend = false;
chainHeal = false;
- summonerGuid.Clear();
}
void Reset() override
@@ -1153,12 +1106,6 @@ public:
me->DespawnOrUnsummon(5000);
}
- void IsSummonedBy(Unit* /*summoner*/) override
- {
- if (Creature* summoner = (ObjectAccessor::GetCreature((*me), summonerGuid)))
- ENSURE_AI(npc_creature_generator_akama::npc_creature_generator_akamaAI, summoner->AI())->JustSummoned(me);
- }
-
void EnterCombat(Unit* /*who*/) override
{
events.ScheduleEvent(EVENT_SPIRIT_HEAL, urand (5000, 6000));
@@ -1208,7 +1155,6 @@ public:
private:
InstanceScript* instance;
EventMap events;
- ObjectGuid summonerGuid;
bool spiritMend;
bool chainHeal;
};
diff --git a/src/server/scripts/Outland/TempestKeep/arcatraz/arcatraz.cpp b/src/server/scripts/Outland/TempestKeep/arcatraz/arcatraz.cpp
index 2407f3980de..9ffc151b3b9 100644
--- a/src/server/scripts/Outland/TempestKeep/arcatraz/arcatraz.cpp
+++ b/src/server/scripts/Outland/TempestKeep/arcatraz/arcatraz.cpp
@@ -338,6 +338,13 @@ class npc_warden_mellichar : public CreatureScript
IsRunning = true;
}
+ void JustSummoned(Creature* summon) override
+ {
+ DoZoneInCombat(summon);
+ if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100.0f, true))
+ summon->AI()->AttackStart(target);
+ }
+
bool CanProgress()
{
if (Phase == 7 && instance->GetData(DATA_WARDEN_4) == DONE)
diff --git a/src/server/scripts/Outland/TempestKeep/arcatraz/boss_harbinger_skyriss.cpp b/src/server/scripts/Outland/TempestKeep/arcatraz/boss_harbinger_skyriss.cpp
index 50b77aac410..213f31b280f 100644
--- a/src/server/scripts/Outland/TempestKeep/arcatraz/boss_harbinger_skyriss.cpp
+++ b/src/server/scripts/Outland/TempestKeep/arcatraz/boss_harbinger_skyriss.cpp
@@ -283,7 +283,10 @@ class boss_harbinger_skyriss_illusion : public CreatureScript
{
boss_harbinger_skyriss_illusionAI(Creature* creature) : ScriptedAI(creature) { }
- void Reset() override { }
+ void Reset() override
+ {
+ me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
+ }
void EnterCombat(Unit* /*who*/) override { }
};
diff --git a/src/server/shared/CMakeLists.txt b/src/server/shared/CMakeLists.txt
index fb86ac7db18..5f319191c14 100644
--- a/src/server/shared/CMakeLists.txt
+++ b/src/server/shared/CMakeLists.txt
@@ -59,7 +59,7 @@ include_directories(
${CMAKE_BINARY_DIR}
${CMAKE_SOURCE_DIR}/dep/recastnavigation/Detour
${CMAKE_SOURCE_DIR}/dep/SFMT
- ${CMAKE_SOURCE_DIR}/dep/sockets/include
+ ${CMAKE_SOURCE_DIR}/dep/cppformat
${CMAKE_SOURCE_DIR}/dep/utf8cpp
${CMAKE_SOURCE_DIR}/src/server
${CMAKE_CURRENT_SOURCE_DIR}
diff --git a/src/server/shared/Cryptography/BigNumber.cpp b/src/server/shared/Cryptography/BigNumber.cpp
index 434268097fe..7b353eb5616 100644
--- a/src/server/shared/Cryptography/BigNumber.cpp
+++ b/src/server/shared/Cryptography/BigNumber.cpp
@@ -171,19 +171,20 @@ bool BigNumber::isZero() const
std::unique_ptr<uint8[]> BigNumber::AsByteArray(int32 minSize, bool littleEndian)
{
- int length = (minSize >= GetNumBytes()) ? minSize : GetNumBytes();
+ int numBytes = GetNumBytes();
+ int length = (minSize >= numBytes) ? minSize : numBytes;
uint8* array = new uint8[length];
// If we need more bytes than length of BigNumber set the rest to 0
- if (length > GetNumBytes())
+ if (length > numBytes)
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);
+ std::reverse(array, array + numBytes);
std::unique_ptr<uint8[]> ret(array);
return ret;
diff --git a/src/server/shared/DataStores/DBCStore.h b/src/server/shared/DataStores/DBCStore.h
index 10d4ff1bec9..1cb67a4235e 100644
--- a/src/server/shared/DataStores/DBCStore.h
+++ b/src/server/shared/DataStores/DBCStore.h
@@ -87,6 +87,13 @@ class DBCStorage
return (id >= nCount) ? NULL : indexTable.asT[id];
}
+ T const* AssertEntry(uint32 id) const
+ {
+ T const* entry = LookupEntry(id);
+ ASSERT(entry);
+ return entry;
+ }
+
uint32 GetNumRows() const { return nCount; }
char const* GetFormat() const { return fmt; }
uint32 GetFieldCount() const { return fieldCount; }
diff --git a/src/server/shared/Database/DatabaseWorkerPool.h b/src/server/shared/Database/DatabaseWorkerPool.h
index 5a06ad69a1d..f0ddbe91ad8 100644
--- a/src/server/shared/Database/DatabaseWorkerPool.h
+++ b/src/server/shared/Database/DatabaseWorkerPool.h
@@ -29,6 +29,8 @@
#include "QueryHolder.h"
#include "AdhocStatement.h"
+#include <mysqld_error.h>
+
#define MIN_MYSQL_SERVER_VERSION 50100u
#define MIN_MYSQL_CLIENT_VERSION 50100u
@@ -368,7 +370,8 @@ class DatabaseWorkerPool
void DirectCommitTransaction(SQLTransaction& transaction)
{
T* con = GetFreeConnection();
- if (con->ExecuteTransaction(transaction))
+ int errorCode = con->ExecuteTransaction(transaction);
+ if (!errorCode)
{
con->Unlock(); // OK, operation succesful
return;
@@ -376,12 +379,12 @@ class DatabaseWorkerPool
//! Handle MySQL Errno 1213 without extending deadlock to the core itself
/// @todo More elegant way
- if (con->GetLastError() == 1213)
+ if (errorCode == ER_LOCK_DEADLOCK)
{
uint8 loopBreaker = 5;
for (uint8 i = 0; i < loopBreaker; ++i)
{
- if (con->ExecuteTransaction(transaction))
+ if (!con->ExecuteTransaction(transaction))
break;
}
}
diff --git a/src/server/shared/Database/Implementation/CharacterDatabase.cpp b/src/server/shared/Database/Implementation/CharacterDatabase.cpp
index 265b0578841..c8632b8a3c2 100644
--- a/src/server/shared/Database/Implementation/CharacterDatabase.cpp
+++ b/src/server/shared/Database/Implementation/CharacterDatabase.cpp
@@ -60,7 +60,8 @@ void CharacterDatabaseConnection::DoPrepareStatements()
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_BATTLEGROUND_RANDOM, "DELETE FROM character_battleground_random", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_BATTLEGROUND_RANDOM_ALL, "DELETE FROM character_battleground_random", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_BATTLEGROUND_RANDOM, "DELETE FROM character_battleground_random WHERE guid = ?", CONNECTION_ASYNC);
PrepareStatement(CHAR_INS_BATTLEGROUND_RANDOM, "INSERT INTO character_battleground_random (guid) VALUES (?)", CONNECTION_ASYNC);
PrepareStatement(CHAR_SEL_CHARACTER, "SELECT guid, account, name, race, class, gender, level, xp, money, playerBytes, playerBytes2, playerFlags, "
@@ -300,6 +301,7 @@ void CharacterDatabaseConnection::DoPrepareStatements()
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_DEL_CHARACTER_ARENA_STATS, "DELETE FROM character_arena_stats WHERE guid = ?", CONNECTION_ASYNC);
PrepareStatement(CHAR_REP_CHARACTER_ARENA_STATS, "REPLACE INTO character_arena_stats (guid, slot, matchMakerRating) 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);
PrepareStatement(CHAR_UPD_ARENA_TEAM_NAME, "UPDATE arena_team SET name = ? WHERE arenaTeamId = ?", CONNECTION_ASYNC);
diff --git a/src/server/shared/Database/Implementation/CharacterDatabase.h b/src/server/shared/Database/Implementation/CharacterDatabase.h
index f7ff5b9186e..e56a24d6865 100644
--- a/src/server/shared/Database/Implementation/CharacterDatabase.h
+++ b/src/server/shared/Database/Implementation/CharacterDatabase.h
@@ -72,6 +72,7 @@ enum CharacterDatabaseStatements
CHAR_SEL_CHAR_POSITION_XYZ,
CHAR_SEL_CHAR_POSITION,
+ CHAR_DEL_BATTLEGROUND_RANDOM_ALL,
CHAR_DEL_BATTLEGROUND_RANDOM,
CHAR_INS_BATTLEGROUND_RANDOM,
@@ -253,6 +254,7 @@ enum CharacterDatabaseStatements
CHAR_DEL_ARENA_TEAM_MEMBER,
CHAR_UPD_ARENA_TEAM_STATS,
CHAR_UPD_ARENA_TEAM_MEMBER,
+ CHAR_DEL_CHARACTER_ARENA_STATS,
CHAR_REP_CHARACTER_ARENA_STATS,
CHAR_SEL_PLAYER_ARENA_TEAMS,
CHAR_UPD_ARENA_TEAM_NAME,
diff --git a/src/server/shared/Database/MySQLConnection.cpp b/src/server/shared/Database/MySQLConnection.cpp
index bea229df184..1a9f973d47b 100644
--- a/src/server/shared/Database/MySQLConnection.cpp
+++ b/src/server/shared/Database/MySQLConnection.cpp
@@ -359,11 +359,11 @@ void MySQLConnection::CommitTransaction()
Execute("COMMIT");
}
-bool MySQLConnection::ExecuteTransaction(SQLTransaction& transaction)
+int MySQLConnection::ExecuteTransaction(SQLTransaction& transaction)
{
std::list<SQLElementData> const& queries = transaction->m_queries;
if (queries.empty())
- return false;
+ return -1;
BeginTransaction();
@@ -380,8 +380,9 @@ bool MySQLConnection::ExecuteTransaction(SQLTransaction& transaction)
if (!Execute(stmt))
{
TC_LOG_WARN("sql.sql", "Transaction aborted. %u queries not executed.", (uint32)queries.size());
+ int errorCode = GetLastError();
RollbackTransaction();
- return false;
+ return errorCode;
}
}
break;
@@ -392,8 +393,9 @@ bool MySQLConnection::ExecuteTransaction(SQLTransaction& transaction)
if (!Execute(sql))
{
TC_LOG_WARN("sql.sql", "Transaction aborted. %u queries not executed.", (uint32)queries.size());
+ int errorCode = GetLastError();
RollbackTransaction();
- return false;
+ return errorCode;
}
}
break;
@@ -406,7 +408,7 @@ bool MySQLConnection::ExecuteTransaction(SQLTransaction& transaction)
// and not while iterating over every element.
CommitTransaction();
- return true;
+ return 0;
}
MySQLPreparedStatement* MySQLConnection::GetPreparedStatement(uint32 index)
diff --git a/src/server/shared/Database/MySQLConnection.h b/src/server/shared/Database/MySQLConnection.h
index 33f17d02228..d486f5b4679 100644
--- a/src/server/shared/Database/MySQLConnection.h
+++ b/src/server/shared/Database/MySQLConnection.h
@@ -86,7 +86,7 @@ class MySQLConnection
void BeginTransaction();
void RollbackTransaction();
void CommitTransaction();
- bool ExecuteTransaction(SQLTransaction& transaction);
+ int ExecuteTransaction(SQLTransaction& transaction);
operator bool () const { return m_Mysql != NULL; }
void Ping() { mysql_ping(m_Mysql); }
diff --git a/src/server/shared/Database/Transaction.cpp b/src/server/shared/Database/Transaction.cpp
index 3dee865267b..9f36d198bde 100644
--- a/src/server/shared/Database/Transaction.cpp
+++ b/src/server/shared/Database/Transaction.cpp
@@ -17,6 +17,9 @@
#include "DatabaseEnv.h"
#include "Transaction.h"
+#include <mysqld_error.h>
+
+std::mutex TransactionTask::_deadlockLock;
//- Append a raw ad-hoc query to the transaction
void Transaction::Append(const char* sql)
@@ -74,14 +77,17 @@ void Transaction::Cleanup()
bool TransactionTask::Execute()
{
- if (m_conn->ExecuteTransaction(m_trans))
+ int errorCode = m_conn->ExecuteTransaction(m_trans);
+ if (!errorCode)
return true;
- if (m_conn->GetLastError() == 1213)
+ if (errorCode == ER_LOCK_DEADLOCK)
{
+ // Make sure only 1 async thread retries a transaction so they don't keep dead-locking each other
+ std::lock_guard<std::mutex> lock(_deadlockLock);
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))
+ if (!m_conn->ExecuteTransaction(m_trans))
return true;
}
diff --git a/src/server/shared/Database/Transaction.h b/src/server/shared/Database/Transaction.h
index cf6aa98b386..83d59006ddc 100644
--- a/src/server/shared/Database/Transaction.h
+++ b/src/server/shared/Database/Transaction.h
@@ -66,6 +66,7 @@ class TransactionTask : public SQLOperation
bool Execute() override;
SQLTransaction m_trans;
+ static std::mutex _deadlockLock;
};
#endif
diff --git a/src/server/shared/Debugging/Errors.h b/src/server/shared/Debugging/Errors.h
index df770c2aa47..4d4624b63dd 100644
--- a/src/server/shared/Debugging/Errors.h
+++ b/src/server/shared/Debugging/Errors.h
@@ -49,4 +49,10 @@ namespace Trinity
#define ASSERT WPAssert
+template <typename T> inline T* ASSERT_NOTNULL(T* pointer)
+{
+ ASSERT(pointer);
+ return pointer;
+}
+
#endif
diff --git a/src/server/shared/Debugging/WheatyExceptionReport.cpp b/src/server/shared/Debugging/WheatyExceptionReport.cpp
index e9f4f9ca9ac..f8f641a9ea7 100644
--- a/src/server/shared/Debugging/WheatyExceptionReport.cpp
+++ b/src/server/shared/Debugging/WheatyExceptionReport.cpp
@@ -1068,7 +1068,7 @@ bool logChildren)
{
case btChar:
case btStdString:
- FormatOutputValue(buffer, basicType, length, (PVOID)offset, sizeof(buffer));
+ FormatOutputValue(buffer, basicType, length, (PVOID)offset, sizeof(buffer), elementsCount);
symbolDetails.top().Value = buffer;
break;
default:
@@ -1196,7 +1196,8 @@ void WheatyExceptionReport::FormatOutputValue(char * pszCurrBuffer,
BasicType basicType,
DWORD64 length,
PVOID pAddress,
-size_t bufferSize)
+size_t bufferSize,
+size_t countOverride)
{
__try
{
@@ -1204,10 +1205,15 @@ size_t bufferSize)
{
case btChar:
{
- if (strlen((char*)pAddress) > bufferSize - 6)
+ // Special case handling for char[] type
+ if (countOverride != 0)
+ length = countOverride;
+ else
+ length = strlen((char*)pAddress);
+ if (length > bufferSize - 6)
pszCurrBuffer += sprintf(pszCurrBuffer, "\"%.*s...\"", bufferSize - 6, (char*)pAddress);
else
- pszCurrBuffer += sprintf(pszCurrBuffer, "\"%s\"", (char*)pAddress);
+ pszCurrBuffer += sprintf(pszCurrBuffer, "\"%.*s\"", length, (char*)pAddress);
break;
}
case btStdString:
diff --git a/src/server/shared/Debugging/WheatyExceptionReport.h b/src/server/shared/Debugging/WheatyExceptionReport.h
index 9137b91aac9..b7731daaa2b 100644
--- a/src/server/shared/Debugging/WheatyExceptionReport.h
+++ b/src/server/shared/Debugging/WheatyExceptionReport.h
@@ -172,7 +172,7 @@ class WheatyExceptionReport
static char * DumpTypeIndex(char *, DWORD64, DWORD, unsigned, DWORD_PTR, bool &, const char*, char*, bool, bool);
- static void FormatOutputValue(char * pszCurrBuffer, BasicType basicType, DWORD64 length, PVOID pAddress, size_t bufferSize);
+ static void FormatOutputValue(char * pszCurrBuffer, BasicType basicType, DWORD64 length, PVOID pAddress, size_t bufferSize, size_t countOverride = 0);
static BasicType GetBasicType(DWORD typeIndex, DWORD64 modBase);
static DWORD_PTR DereferenceUnsafePointer(DWORD_PTR address);
diff --git a/src/server/shared/Logging/Appender.cpp b/src/server/shared/Logging/Appender.cpp
index dff931e3da8..ca40a857419 100644
--- a/src/server/shared/Logging/Appender.cpp
+++ b/src/server/shared/Logging/Appender.cpp
@@ -18,6 +18,10 @@
#include "Appender.h"
#include "Common.h"
#include "Util.h"
+#include "StringFormat.h"
+
+#include <utility>
+#include <sstream>
std::string LogMessage::getTimeStr(time_t time)
{
@@ -68,38 +72,36 @@ void Appender::setLogLevel(LogLevel _level)
level = _level;
}
-void Appender::write(LogMessage& message)
+void Appender::write(LogMessage* message)
{
- if (!level || level > message.level)
+ if (!level || level > message->level)
return;
- message.prefix.clear();
+ std::ostringstream ss;
+
if (flags & APPENDER_FLAGS_PREFIX_TIMESTAMP)
- message.prefix.append(message.getTimeStr());
+ ss << message->getTimeStr();
if (flags & APPENDER_FLAGS_PREFIX_LOGLEVEL)
{
- if (!message.prefix.empty())
- message.prefix.push_back(' ');
+ if (ss.rdbuf()->in_avail() == 0)
+ ss << ' ';
- char text[MAX_QUERY_LEN];
- snprintf(text, MAX_QUERY_LEN, "%-5s", Appender::getLogLevelString(message.level));
- message.prefix.append(text);
+ ss << Trinity::StringFormat("%-5s", Appender::getLogLevelString(message->level));
}
if (flags & APPENDER_FLAGS_PREFIX_LOGFILTERTYPE)
{
- if (!message.prefix.empty())
- message.prefix.push_back(' ');
+ if (ss.rdbuf()->in_avail() == 0)
+ ss << ' ';
- message.prefix.push_back('[');
- message.prefix.append(message.type);
- message.prefix.push_back(']');
+ ss << '[' << message->type << ']';
}
- if (!message.prefix.empty())
- message.prefix.push_back(' ');
+ if (ss.rdbuf()->in_avail() == 0)
+ ss << ' ';
+ message->prefix = std::move(ss.str());
_write(message);
}
diff --git a/src/server/shared/Logging/Appender.h b/src/server/shared/Logging/Appender.h
index 6f38eb6aaf7..38c45b3bcf1 100644
--- a/src/server/shared/Logging/Appender.h
+++ b/src/server/shared/Logging/Appender.h
@@ -21,6 +21,7 @@
#include <unordered_map>
#include <string>
#include <time.h>
+#include <type_traits>
#include "Define.h"
// Values assigned have their equivalent in enum ACE_Log_Priority
@@ -57,16 +58,16 @@ enum AppenderFlags
struct LogMessage
{
- LogMessage(LogLevel _level, std::string const& _type, std::string const& _text)
- : level(_level), type(_type), text(_text), mtime(time(NULL))
+ LogMessage(LogLevel _level, std::string const& _type, std::string&& _text)
+ : level(_level), type(_type), text(std::forward<std::string>(_text)), mtime(time(NULL))
{ }
static std::string getTimeStr(time_t time);
std::string getTimeStr();
- LogLevel level;
- std::string type;
- std::string text;
+ LogLevel const level;
+ std::string const type;
+ std::string const text;
std::string prefix;
std::string param1;
time_t mtime;
@@ -91,11 +92,11 @@ class Appender
AppenderFlags getFlags() const;
void setLogLevel(LogLevel);
- void write(LogMessage& message);
+ void write(LogMessage* message);
static const char* getLogLevelString(LogLevel level);
private:
- virtual void _write(LogMessage const& /*message*/) = 0;
+ virtual void _write(LogMessage const* /*message*/) = 0;
uint8 id;
std::string name;
diff --git a/src/server/shared/Logging/AppenderConsole.cpp b/src/server/shared/Logging/AppenderConsole.cpp
index ae27337fb9a..2efa4db4d2e 100644
--- a/src/server/shared/Logging/AppenderConsole.cpp
+++ b/src/server/shared/Logging/AppenderConsole.cpp
@@ -158,14 +158,14 @@ void AppenderConsole::ResetColor(bool stdout_stream)
#endif
}
-void AppenderConsole::_write(LogMessage const& message)
+void AppenderConsole::_write(LogMessage const* message)
{
- bool stdout_stream = !(message.level == LOG_LEVEL_ERROR || message.level == LOG_LEVEL_FATAL);
+ bool stdout_stream = !(message->level == LOG_LEVEL_ERROR || message->level == LOG_LEVEL_FATAL);
if (_colored)
{
uint8 index;
- switch (message.level)
+ switch (message->level)
{
case LOG_LEVEL_TRACE:
index = 5;
@@ -189,9 +189,9 @@ void AppenderConsole::_write(LogMessage const& message)
}
SetColor(stdout_stream, _colors[index]);
- utf8printf(stdout_stream ? stdout : stderr, "%s%s", message.prefix.c_str(), message.text.c_str());
+ utf8printf(stdout_stream ? stdout : stderr, "%s%s\n", message->prefix.c_str(), message->text.c_str());
ResetColor(stdout_stream);
}
else
- utf8printf(stdout_stream ? stdout : stderr, "%s%s", message.prefix.c_str(), message.text.c_str());
+ utf8printf(stdout_stream ? stdout : stderr, "%s%s\n", message->prefix.c_str(), message->text.c_str());
}
diff --git a/src/server/shared/Logging/AppenderConsole.h b/src/server/shared/Logging/AppenderConsole.h
index 0f9536b3111..0acf7636e35 100644
--- a/src/server/shared/Logging/AppenderConsole.h
+++ b/src/server/shared/Logging/AppenderConsole.h
@@ -51,7 +51,7 @@ class AppenderConsole: public Appender
private:
void SetColor(bool stdout_stream, ColorTypes color);
void ResetColor(bool stdout_stream);
- void _write(LogMessage const& message) override;
+ void _write(LogMessage const* message) override;
bool _colored;
ColorTypes _colors[MaxLogLevels];
};
diff --git a/src/server/shared/Logging/AppenderDB.cpp b/src/server/shared/Logging/AppenderDB.cpp
index d297d6d08d3..8a329ea3a0f 100644
--- a/src/server/shared/Logging/AppenderDB.cpp
+++ b/src/server/shared/Logging/AppenderDB.cpp
@@ -23,18 +23,18 @@ AppenderDB::AppenderDB(uint8 id, std::string const& name, LogLevel level)
AppenderDB::~AppenderDB() { }
-void AppenderDB::_write(LogMessage const& message)
+void AppenderDB::_write(LogMessage const* message)
{
// Avoid infinite loop, PExecute triggers Logging with "sql.sql" type
- if (!enabled || !message.type.find("sql"))
+ if (!enabled || (message->type.find("sql") != std::string::npos))
return;
PreparedStatement* stmt = LoginDatabase.GetPreparedStatement(LOGIN_INS_LOG);
- stmt->setUInt64(0, message.mtime);
+ stmt->setUInt64(0, message->mtime);
stmt->setUInt32(1, realmId);
- stmt->setString(2, message.type);
- stmt->setUInt8(3, uint8(message.level));
- stmt->setString(4, message.text);
+ stmt->setString(2, message->type);
+ stmt->setUInt8(3, uint8(message->level));
+ stmt->setString(4, message->text);
LoginDatabase.Execute(stmt);
}
diff --git a/src/server/shared/Logging/AppenderDB.h b/src/server/shared/Logging/AppenderDB.h
index e20ceaf77b4..09affdb46f1 100644
--- a/src/server/shared/Logging/AppenderDB.h
+++ b/src/server/shared/Logging/AppenderDB.h
@@ -31,7 +31,7 @@ class AppenderDB: public Appender
private:
uint32 realmId;
bool enabled;
- void _write(LogMessage const& message) override;
+ void _write(LogMessage const* message) override;
};
#endif
diff --git a/src/server/shared/Logging/AppenderFile.cpp b/src/server/shared/Logging/AppenderFile.cpp
index 07a88a367ae..3892adbe3be 100644
--- a/src/server/shared/Logging/AppenderFile.cpp
+++ b/src/server/shared/Logging/AppenderFile.cpp
@@ -43,21 +43,21 @@ AppenderFile::~AppenderFile()
CloseFile();
}
-void AppenderFile::_write(LogMessage const& message)
+void AppenderFile::_write(LogMessage const* message)
{
- bool exceedMaxSize = maxFileSize > 0 && (fileSize.load() + message.Size()) > maxFileSize;
+ bool exceedMaxSize = maxFileSize > 0 && (fileSize.load() + message->Size()) > maxFileSize;
if (dynamicName)
{
char namebuf[TRINITY_PATH_MAX];
- snprintf(namebuf, TRINITY_PATH_MAX, filename.c_str(), message.param1.c_str());
+ snprintf(namebuf, TRINITY_PATH_MAX, filename.c_str(), message->param1.c_str());
// always use "a" with dynamic name otherwise it could delete the log we wrote in last _write() call
FILE* file = OpenFile(namebuf, "a", backup || exceedMaxSize);
if (!file)
return;
- fprintf(file, "%s%s", message.prefix.c_str(), message.text.c_str());
+ fprintf(file, "%s%s", message->prefix.c_str(), message->text.c_str());
fflush(file);
- fileSize += uint64(message.Size());
+ fileSize += uint64(message->Size());
fclose(file);
return;
}
@@ -67,9 +67,9 @@ void AppenderFile::_write(LogMessage const& message)
if (!logfile)
return;
- fprintf(logfile, "%s%s", message.prefix.c_str(), message.text.c_str());
+ fprintf(logfile, "%s%s\n", message->prefix.c_str(), message->text.c_str());
fflush(logfile);
- fileSize += uint64(message.Size());
+ fileSize += uint64(message->Size());
}
FILE* AppenderFile::OpenFile(std::string const &filename, std::string const &mode, bool backup)
diff --git a/src/server/shared/Logging/AppenderFile.h b/src/server/shared/Logging/AppenderFile.h
index 23651fc1129..36afdd23ad1 100644
--- a/src/server/shared/Logging/AppenderFile.h
+++ b/src/server/shared/Logging/AppenderFile.h
@@ -30,7 +30,7 @@ class AppenderFile: public Appender
private:
void CloseFile();
- void _write(LogMessage const& message) override;
+ void _write(LogMessage const* message) override;
FILE* logfile;
std::string filename;
std::string logDir;
diff --git a/src/server/shared/Logging/Log.cpp b/src/server/shared/Logging/Log.cpp
index 4bf4dacb302..c9a4432039f 100644
--- a/src/server/shared/Logging/Log.cpp
+++ b/src/server/shared/Logging/Log.cpp
@@ -199,6 +199,9 @@ void Log::CreateLoggerFromConfig(std::string const& appenderName)
return;
}
+ if (level < lowestLogLevel)
+ lowestLogLevel = level;
+
logger.Create(name, level);
//fprintf(stdout, "Log::CreateLoggerFromConfig: Created Logger %s, Level %u\n", name.c_str(), level);
@@ -261,30 +264,18 @@ void Log::ReadLoggersFromConfig()
}
}
-void Log::vlog(std::string const& filter, LogLevel level, char const* str, va_list argptr)
-{
- char text[MAX_QUERY_LEN];
- vsnprintf(text, MAX_QUERY_LEN, str, argptr);
- write(new LogMessage(level, filter, text));
-}
-
-void Log::write(LogMessage* msg) const
+void Log::write(std::unique_ptr<LogMessage>&& msg) const
{
Logger const* logger = GetLoggerByType(msg->type);
- msg->text.append("\n");
if (_ioService)
{
- auto logOperation = std::shared_ptr<LogOperation>(new LogOperation(logger, msg));
+ auto logOperation = std::shared_ptr<LogOperation>(new LogOperation(logger, std::forward<std::unique_ptr<LogMessage>>(msg)));
_ioService->post(_strand->wrap([logOperation](){ logOperation->call(); }));
-
}
else
- {
- logger->write(*msg);
- delete msg;
- }
+ logger->write(msg.get());
}
std::string Log::GetTimestampStr()
@@ -321,6 +312,9 @@ bool Log::SetLogLevel(std::string const& name, const char* newLevelc, bool isLog
return false;
it->second.setLogLevel(newLevel);
+
+ if (newLevel != LOG_LEVEL_DISABLED && newLevel < lowestLogLevel)
+ lowestLogLevel = newLevel;
}
else
{
@@ -343,40 +337,20 @@ void Log::outCharDump(char const* str, uint32 accountId, uint64 guid, char const
ss << "== START DUMP == (account: " << accountId << " guid: " << guid << " name: " << name
<< ")\n" << str << "\n== END DUMP ==\n";
- LogMessage* msg = new LogMessage(LOG_LEVEL_INFO, "entities.player.dump", ss.str());
+ std::unique_ptr<LogMessage> msg(new LogMessage(LOG_LEVEL_INFO, "entities.player.dump", ss.str()));
std::ostringstream param;
param << guid << '_' << name;
msg->param1 = param.str();
- write(msg);
-}
-
-void Log::outCommand(uint32 account, const char * str, ...)
-{
- if (!str || !ShouldLog("commands.gm", LOG_LEVEL_INFO))
- return;
-
- va_list ap;
- va_start(ap, str);
- char text[MAX_QUERY_LEN];
- vsnprintf(text, MAX_QUERY_LEN, str, ap);
- va_end(ap);
-
- LogMessage* msg = new LogMessage(LOG_LEVEL_INFO, "commands.gm", text);
-
- std::ostringstream ss;
- ss << account;
- msg->param1 = ss.str();
-
- write(msg);
+ write(std::move(msg));
}
void Log::SetRealmId(uint32 id)
{
for (AppenderMap::iterator it = appenders.begin(); it != appenders.end(); ++it)
if (it->second && it->second->getType() == APPENDER_DB)
- ((AppenderDB *)it->second)->setRealmId(id);
+ static_cast<AppenderDB*>(it->second)->setRealmId(id);
}
void Log::Close()
@@ -394,6 +368,7 @@ void Log::LoadFromConfig()
{
Close();
+ lowestLogLevel = LOG_LEVEL_FATAL;
AppenderId = 0;
m_logsDir = sConfigMgr->GetStringDefault("LogsDir", "");
if (!m_logsDir.empty())
diff --git a/src/server/shared/Logging/Log.h b/src/server/shared/Logging/Log.h
index 1d67ff87f76..20d83d2dcf0 100644
--- a/src/server/shared/Logging/Log.h
+++ b/src/server/shared/Logging/Log.h
@@ -22,12 +22,14 @@
#include "Define.h"
#include "Appender.h"
#include "Logger.h"
-#include <stdarg.h>
+#include "StringFormat.h"
#include <boost/asio/io_service.hpp>
#include <boost/asio/strand.hpp>
+#include <stdarg.h>
#include <unordered_map>
#include <string>
+#include <memory>
#define LOGGER_ROOT "root"
@@ -59,17 +61,34 @@ class Log
bool ShouldLog(std::string const& type, LogLevel level) const;
bool SetLogLevel(std::string const& name, char const* level, bool isLogger = true);
- void outMessage(std::string const& f, LogLevel level, char const* str, ...) ATTR_PRINTF(4, 5);
+ template<typename... Args>
+ inline void outMessage(std::string const& filter, LogLevel const level, const char* fmt, Args const&... args)
+ {
+ write(std::move(std::unique_ptr<LogMessage>(new LogMessage(level, filter, std::move(Trinity::StringFormat(fmt, args...))))));
+ }
+
+ template<typename... Args>
+ void outCommand(uint32 account, const char* fmt, Args const&... args)
+ {
+ if (!ShouldLog("commands.gm", LOG_LEVEL_INFO))
+ return;
+
+ std::unique_ptr<LogMessage> msg(new LogMessage(LOG_LEVEL_INFO, "commands.gm", std::move(Trinity::StringFormat(fmt, args...))));
+
+ std::ostringstream ss;
+ ss << account;
+ msg->param1 = ss.str();
+
+ write(std::move(msg));
+ }
- void outCommand(uint32 account, const char * str, ...) ATTR_PRINTF(3, 4);
void outCharDump(char const* str, uint32 account_id, uint64 guid, char const* name);
void SetRealmId(uint32 id);
private:
static std::string GetTimestampStr();
- void vlog(std::string const& f, LogLevel level, char const* str, va_list argptr);
- void write(LogMessage* msg) const;
+ void write(std::unique_ptr<LogMessage>&& msg) const;
Logger const* GetLoggerByType(std::string const& type) const;
Appender* GetAppenderByName(std::string const& name);
@@ -82,6 +101,7 @@ class Log
AppenderMap appenders;
LoggerMap loggers;
uint8 AppenderId;
+ LogLevel lowestLogLevel;
std::string m_logsDir;
std::string m_logsTimestamp;
@@ -113,6 +133,10 @@ inline bool Log::ShouldLog(std::string const& type, LogLevel level) const
// Speed up in cases where requesting "Type.sub1.sub2" but only configured
// Logger "Type"
+ // Don't even look for a logger if the LogLevel is lower than lowest log levels across all loggers
+ if (level < lowestLogLevel)
+ return false;
+
Logger const* logger = GetLoggerByType(type);
if (!logger)
return false;
@@ -121,23 +145,34 @@ inline bool Log::ShouldLog(std::string const& type, LogLevel level) const
return logLevel != LOG_LEVEL_DISABLED && logLevel <= level;
}
-inline void Log::outMessage(std::string const& filter, LogLevel level, const char * str, ...)
-{
- va_list ap;
- va_start(ap, str);
-
- vlog(filter, level, str, ap);
-
- va_end(ap);
-}
-
#define sLog Log::instance()
+#define LOG_EXCEPTION_FREE(filterType__, level__, ...) \
+ { \
+ try \
+ { \
+ sLog->outMessage(filterType__, level__, __VA_ARGS__); \
+ } \
+ catch (std::exception& e) \
+ { \
+ sLog->outMessage("server", LOG_LEVEL_ERROR, "Wrong format occurred (%s) at %s:%u.", \
+ e.what(), __FILE__, __LINE__); \
+ } \
+ }
+
#if PLATFORM != PLATFORM_WINDOWS
+void check_args(const char* format, ...) ATTR_PRINTF(1, 2);
+
+// This will catch format errors on build time
#define TC_LOG_MESSAGE_BODY(filterType__, level__, ...) \
do { \
if (sLog->ShouldLog(filterType__, level__)) \
- sLog->outMessage(filterType__, level__, __VA_ARGS__); \
+ { \
+ if (false) \
+ check_args(__VA_ARGS__); \
+ \
+ LOG_EXCEPTION_FREE(filterType__, level__, __VA_ARGS__); \
+ } \
} while (0)
#else
#define TC_LOG_MESSAGE_BODY(filterType__, level__, ...) \
@@ -145,7 +180,7 @@ inline void Log::outMessage(std::string const& filter, LogLevel level, const cha
__pragma(warning(disable:4127)) \
do { \
if (sLog->ShouldLog(filterType__, level__)) \
- sLog->outMessage(filterType__, level__, __VA_ARGS__); \
+ LOG_EXCEPTION_FREE(filterType__, level__, __VA_ARGS__); \
} while (0) \
__pragma(warning(pop))
#endif
diff --git a/src/server/shared/Logging/LogOperation.cpp b/src/server/shared/Logging/LogOperation.cpp
index 9afb28a49c2..bcd923c705e 100644
--- a/src/server/shared/Logging/LogOperation.cpp
+++ b/src/server/shared/Logging/LogOperation.cpp
@@ -18,14 +18,8 @@
#include "LogOperation.h"
#include "Logger.h"
-LogOperation::~LogOperation()
-{
- delete msg;
-}
-
int LogOperation::call()
{
- if (logger && msg)
- logger->write(*msg);
+ logger->write(msg.get());
return 0;
}
diff --git a/src/server/shared/Logging/LogOperation.h b/src/server/shared/Logging/LogOperation.h
index b8655413273..ffdd35c3c09 100644
--- a/src/server/shared/Logging/LogOperation.h
+++ b/src/server/shared/Logging/LogOperation.h
@@ -18,23 +18,25 @@
#ifndef LOGOPERATION_H
#define LOGOPERATION_H
+#include <memory>
+
class Logger;
struct LogMessage;
class LogOperation
{
public:
- LogOperation(Logger const* _logger, LogMessage* _msg)
- : logger(_logger), msg(_msg)
+ LogOperation(Logger const* _logger, std::unique_ptr<LogMessage>&& _msg)
+ : logger(_logger), msg(std::forward<std::unique_ptr<LogMessage>>(_msg))
{ }
- ~LogOperation();
+ ~LogOperation() { }
int call();
protected:
Logger const* logger;
- LogMessage* msg;
+ std::unique_ptr<LogMessage> msg;
};
#endif
diff --git a/src/server/shared/Logging/Logger.cpp b/src/server/shared/Logging/Logger.cpp
index 615732deb30..3b02eb47575 100644
--- a/src/server/shared/Logging/Logger.cpp
+++ b/src/server/shared/Logging/Logger.cpp
@@ -50,9 +50,9 @@ void Logger::setLogLevel(LogLevel _level)
level = _level;
}
-void Logger::write(LogMessage& message) const
+void Logger::write(LogMessage* message) const
{
- if (!level || level > message.level || message.text.empty())
+ if (!level || level > message->level || message->text.empty())
{
//fprintf(stderr, "Logger::write: Logger %s, Level %u. Msg %s Level %u WRONG LEVEL MASK OR EMPTY MSG\n", getName().c_str(), getLogLevel(), message.text.c_str(), message.level);
return;
diff --git a/src/server/shared/Logging/Logger.h b/src/server/shared/Logging/Logger.h
index a81ee8d7bd2..1aee75c5d72 100644
--- a/src/server/shared/Logging/Logger.h
+++ b/src/server/shared/Logging/Logger.h
@@ -32,7 +32,7 @@ class Logger
std::string const& getName() const;
LogLevel getLogLevel() const;
void setLogLevel(LogLevel level);
- void write(LogMessage& message) const;
+ void write(LogMessage* message) const;
private:
std::string name;
diff --git a/src/server/shared/Networking/Socket.h b/src/server/shared/Networking/Socket.h
index f6bf3976b85..f7a1b954cb0 100644
--- a/src/server/shared/Networking/Socket.h
+++ b/src/server/shared/Networking/Socket.h
@@ -34,7 +34,9 @@
using boost::asio::ip::tcp;
#define READ_BLOCK_SIZE 4096
-#define TC_SOCKET_USE_IOCP BOOST_ASIO_HAS_IOCP
+#ifdef BOOST_ASIO_HAS_IOCP
+#define TC_SOCKET_USE_IOCP
+#endif
template<class T>
class Socket : public std::enable_shared_from_this<T>
diff --git a/src/server/shared/Networking/SocketMgr.h b/src/server/shared/Networking/SocketMgr.h
index df57baf257e..2078ae90c62 100644
--- a/src/server/shared/Networking/SocketMgr.h
+++ b/src/server/shared/Networking/SocketMgr.h
@@ -99,7 +99,7 @@ public:
}
catch (boost::system::system_error const& err)
{
- TC_LOG_INFO("network", "Failed to retrieve client's remote address %s", err.what());
+ TC_LOG_WARN("network", "Failed to retrieve client's remote address %s", err.what());
}
}
diff --git a/src/server/shared/Utilities/StringFormat.h b/src/server/shared/Utilities/StringFormat.h
new file mode 100644
index 00000000000..70d9aefb14d
--- /dev/null
+++ b/src/server/shared/Utilities/StringFormat.h
@@ -0,0 +1,34 @@
+/*
+ * Copyright (C) 2008-2015 TrinityCore <http://www.trinitycore.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * 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 TRINITYCORE_STRING_FORMAT_H
+#define TRINITYCORE_STRING_FORMAT_H
+
+#include <format.h>
+
+namespace Trinity
+{
+ //! Default TC string format function
+ template<typename... Args>
+ inline std::string StringFormat(const char* fmt, Args const&... args)
+ {
+ return fmt::sprintf(fmt, args...);
+ }
+}
+
+#endif
diff --git a/src/server/worldserver/CMakeLists.txt b/src/server/worldserver/CMakeLists.txt
index 97180fb36a0..ce9ae8d5219 100644
--- a/src/server/worldserver/CMakeLists.txt
+++ b/src/server/worldserver/CMakeLists.txt
@@ -47,6 +47,7 @@ include_directories(
${CMAKE_SOURCE_DIR}/dep/gsoap
${CMAKE_SOURCE_DIR}/dep/sockets/include
${CMAKE_SOURCE_DIR}/dep/SFMT
+ ${CMAKE_SOURCE_DIR}/dep/cppformat
${CMAKE_SOURCE_DIR}/src/server/collision
${CMAKE_SOURCE_DIR}/src/server/collision/Management
${CMAKE_SOURCE_DIR}/src/server/collision/Models
@@ -168,6 +169,7 @@ target_link_libraries(worldserver
g3dlib
gsoap
Detour
+ format
${JEMALLOC_LIBRARY}
${READLINE_LIBRARY}
${TERMCAP_LIBRARY}
diff --git a/src/server/worldserver/RemoteAccess/RASession.h b/src/server/worldserver/RemoteAccess/RASession.h
index d272f323c6a..efd2106fdd1 100644
--- a/src/server/worldserver/RemoteAccess/RASession.h
+++ b/src/server/worldserver/RemoteAccess/RASession.h
@@ -30,8 +30,6 @@ using boost::asio::ip::tcp;
const size_t bufferSize = 4096;
-#define BUFFER_SIZE 4096
-
class RASession : public std::enable_shared_from_this <RASession>
{
public:
diff --git a/src/server/worldserver/worldserver.conf.dist b/src/server/worldserver/worldserver.conf.dist
index eaef902addc..ecb5824b1c5 100644
--- a/src/server/worldserver/worldserver.conf.dist
+++ b/src/server/worldserver/worldserver.conf.dist
@@ -3029,33 +3029,54 @@ AuctionHouseBot.Buyer.Horde.Enabled = 0
AuctionHouseBot.Buyer.Neutral.Enabled = 0
#
-# AuctionHouseBot.BuyPrice.Buyer
-# Description: Should the Buyer use BuyPrice or SellPrice to determine Bid Prices
-# Default: 1 - (use BuyPrice)
-# 0 - (use SellPrice)
-
-AuctionHouseBot.Buyer.Buyprice = 1
+# AuctionHouseBot.Buyer.Baseprice.QUALITY
+# Description: Base sellprices in copper for non priced items for each quality.
+# The default values are based on average item prices of each quality.
+# Defaults: Gray 3504
+# White 5429
+# Green 21752
+# Blue 36463
+# Purple 87124
+# Orange 214347
+# Yellow 407406
+
+AuctionHouseBot.Buyer.Baseprice.Gray = 3504
+AuctionHouseBot.Buyer.Baseprice.White = 5429
+AuctionHouseBot.Buyer.Baseprice.Green = 21752
+AuctionHouseBot.Buyer.Baseprice.Blue = 36463
+AuctionHouseBot.Buyer.Baseprice.Purple = 87124
+AuctionHouseBot.Buyer.Baseprice.Orange = 214347
+AuctionHouseBot.Buyer.Baseprice.Yellow = 407406
+
+#
+# AuctionHouseBot.Buyer.ChanceMultiplier.QUALITY
+# Description: Multipliers for the buy/bid chances for each quality. 100 means the chance is 100% of the original,
+# 1 would mean 1 % of the original and 200 would mean 200% of the original chance.
+# Defaults: Gray 100
+# White 100
+# Green 100
+# Blue 100
+# Purple 100
+# Orange 100
+# Yellow 100
+
+AuctionHouseBot.Buyer.ChanceMultiplier.Gray = 100
+AuctionHouseBot.Buyer.ChanceMultiplier.White = 100
+AuctionHouseBot.Buyer.ChanceMultiplier.Green = 100
+AuctionHouseBot.Buyer.ChanceMultiplier.Blue = 100
+AuctionHouseBot.Buyer.ChanceMultiplier.Purple = 100
+AuctionHouseBot.Buyer.ChanceMultiplier.Orange = 100
+AuctionHouseBot.Buyer.ChanceMultiplier.Yellow = 100
#
# AuctionHouseBot.Buyer.Recheck.Interval
-# Description: This specifies the time interval (in minutes) between two evaluations of the same selled item.
-# The lesser this value is, the more chances you give for item to be bought by ahbot.
+# Description: This specifies the time interval (in minutes) between two evaluations of the same sold item.
+# The smaller this value is, the more chances you give for an item to be bought by ahbot.
# Default: 20 (20min.)
AuctionHouseBot.Buyer.Recheck.Interval = 20
#
-# AuctionHouseBot.Buyer.Alliance.Chance.Ratio
-# Description: Chance ratio for the buyer to buy an item. Higher the value, lesser the probability
-# Example: 3 (1 out of 3 change, that is, 33%).
-# Default: 3
-#
-
-AuctionHouseBot.Buyer.Alliance.Chance.Ratio = 3
-AuctionHouseBot.Buyer.Horde.Chance.Ratio = 3
-AuctionHouseBot.Buyer.Neutral.Chance.Ratio = 3
-
-#
###################################################################################################
###################################################################################################
@@ -3192,6 +3213,7 @@ Logger.sql.sql=5,Console DBErrors
#Logger.scripts.ai=3,Console Server
#Logger.server.authserver=3,Console Server
#Logger.spells=3,Console Server
+#Logger.spells.periodic=3,Console Server
#Logger.sql.dev=3,Console Server
#Logger.sql.driver=3,Console Server
#Logger.warden=3,Console Server