aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sql/updates/world/2012_01_05_00_world_sai.sql8
-rw-r--r--sql/updates/world/2012_12_20_00_world_skeram.sql5
-rw-r--r--sql/updates/world/2013_01_01_00_item_template_restore.sql646
-rw-r--r--sql/updates/world/2013_01_01_01_world_creature_text.sql30
-rw-r--r--sql/updates/world/2013_01_02_00_world_misc.sql7
-rw-r--r--sql/updates/world/2013_01_02_01_world_spell_script.sql3
-rw-r--r--sql/updates/world/2013_01_02_02_world_instance_template.sql1
-rw-r--r--sql/updates/world/2013_01_02_03_world_sai.sql18
-rw-r--r--sql/updates/world/2013_01_02_04_world_creature.sql1
-rw-r--r--sql/updates/world/2013_01_02_05_eye_of_eternity.sql27
-rw-r--r--sql/updates/world/2013_01_02_06_world_sai.sql9
-rw-r--r--sql/updates/world/2013_01_02_06_world_waypoints.sql283
-rw-r--r--sql/updates/world/2013_01_02_07_world_waypoints.sql157
-rw-r--r--sql/updates/world/2013_01_02_08_world_sai.sql392
-rw-r--r--sql/updates/world/2013_01_02_09_world_waypoints.sql138
-rw-r--r--sql/updates/world/2013_01_02_10_world_sai.sql2
-rw-r--r--sql/updates/world/2013_01_02_11_world_sai.sql34
-rw-r--r--sql/updates/world/2013_01_02_12_world_go_script.sql11
-rw-r--r--sql/updates/world/2013_01_02_12_world_waypoints.sql218
-rw-r--r--sql/updates/world/2013_01_03_00_world_gameobject_scripts.sql6
-rw-r--r--sql/updates/world/2013_01_03_01_world_sai.sql7
-rw-r--r--sql/updates/world/2013_01_03_02_world_sai.sql10
-rw-r--r--sql/updates/world/2013_01_03_03_world_spelldifficulty_dbc.sql3
-rw-r--r--sql/updates/world/2013_01_03_04_world_sai.sql14
-rw-r--r--sql/updates/world/2013_01_03_05_world_sai.sql8
-rw-r--r--sql/updates/world/2013_01_03_06_world_sai.sql11
-rw-r--r--sql/updates/world/2013_01_03_07_world_sai.sql6
-rw-r--r--sql/updates/world/2013_01_03_08_world_misc.sql2
-rw-r--r--sql/updates/world/2013_01_03_09_world_sai.sql81
-rw-r--r--sql/updates/world/2013_01_03_10_world_gameobject.sql4
-rw-r--r--sql/updates/world/2013_01_03_11_world_item_template.sql2
-rw-r--r--sql/updates/world/2013_01_03_12_world_gameobject_scripts.sql2
-rw-r--r--sql/updates/world/2013_01_03_12_world_misc.sql3
-rw-r--r--sql/updates/world/2013_01_03_13_world_quest_template.sql3
-rw-r--r--sql/updates/world/2013_01_03_14_world_spell_area.sql4
-rw-r--r--sql/updates/world/2013_01_03_15_world_various_fixes.sql73
-rw-r--r--sql/updates/world/2013_01_03_16_world_various_fixes.sql8
-rw-r--r--sql/updates/world/2013_01_04_00_world_creature_text.sql3
-rw-r--r--sql/updates/world/2013_01_04_01_world_sai.sql38
-rw-r--r--sql/updates/world/2013_01_04_02_world_misc.sql29
-rw-r--r--sql/updates/world/2013_01_04_02_world_novos_the_summoner.sql63
-rw-r--r--sql/updates/world/2013_01_05_00_world_waypoints.sql10
-rw-r--r--sql/updates/world/2013_01_06_00_world_creature_addon.sql10
-rw-r--r--sql/updates/world/2013_01_06_00_world_creature_template.sql4
-rw-r--r--sql/updates/world/2013_01_06_01_world_waypoints.sql18
-rw-r--r--sql/updates/world/2013_01_06_02_world_misc.sql12
-rw-r--r--sql/updates/world/2013_01_06_03_world_sai.sql3
-rw-r--r--sql/updates/world/2013_01_06_04_world_misc.sql34
-rw-r--r--sql/updates/world/2013_01_07_00_world_sai.sql24
-rw-r--r--sql/updates/world/2013_01_07_01_world_creature_addon.sql30
-rw-r--r--sql/updates/world/2013_01_07_02_world_creature_text.sql15
-rw-r--r--sql/updates/world/2013_01_07_03_world_creature_text.sql10
-rw-r--r--sql/updates/world/2013_01_07_04_world_creature_text.sql7
-rw-r--r--sql/updates/world/2013_01_07_05_world_creature_text.sql4
-rw-r--r--sql/updates/world/2013_01_07_06_world_creature_text.sql4
-rw-r--r--sql/updates/world/2013_01_07_07_world_creature_text.sql9
-rw-r--r--sql/updates/world/2013_01_07_08_world_creature_text.sql14
-rw-r--r--src/server/collision/BoundingIntervalHierarchy.cpp2
-rw-r--r--src/server/collision/Management/VMapFactory.cpp92
-rw-r--r--src/server/collision/Management/VMapFactory.h3
-rw-r--r--src/server/game/AI/CoreAI/PetAI.cpp7
-rw-r--r--src/server/game/AI/CoreAI/UnitAI.cpp22
-rw-r--r--src/server/game/AI/CreatureAI.cpp88
-rw-r--r--src/server/game/AI/CreatureAIImpl.h192
-rw-r--r--src/server/game/AI/EventAI/CreatureEventAI.cpp9
-rw-r--r--src/server/game/AI/EventAI/CreatureEventAI.h2
-rw-r--r--src/server/game/AI/SmartScripts/SmartScript.cpp36
-rw-r--r--src/server/game/AI/SmartScripts/SmartScriptMgr.h4
-rw-r--r--src/server/game/Achievements/AchievementMgr.cpp5
-rw-r--r--src/server/game/Addons/AddonMgr.h3
-rw-r--r--src/server/game/Battlefield/Battlefield.cpp1
-rw-r--r--src/server/game/Battlegrounds/ArenaTeam.cpp2
-rw-r--r--src/server/game/Battlegrounds/BattlegroundMgr.cpp3
-rw-r--r--src/server/game/Battlegrounds/Zones/BattlegroundAB.cpp1
-rw-r--r--src/server/game/Conditions/ConditionMgr.cpp2
-rw-r--r--src/server/game/Conditions/ConditionMgr.h3
-rw-r--r--src/server/game/Conditions/DisableMgr.cpp2
-rw-r--r--src/server/game/Conditions/DisableMgr.h4
-rw-r--r--src/server/game/DungeonFinding/LFGMgr.cpp16
-rw-r--r--src/server/game/DungeonFinding/LFGQueue.cpp4
-rw-r--r--src/server/game/Entities/GameObject/GameObject.cpp6
-rw-r--r--src/server/game/Entities/Object/ObjectDefines.h229
-rw-r--r--src/server/game/Entities/Pet/Pet.cpp3
-rw-r--r--src/server/game/Entities/Player/Player.cpp55
-rw-r--r--src/server/game/Entities/Unit/StatSystem.cpp8
-rw-r--r--src/server/game/Entities/Unit/Unit.cpp138
-rw-r--r--src/server/game/Entities/Unit/Unit.h12
-rw-r--r--src/server/game/Entities/Vehicle/Vehicle.cpp56
-rw-r--r--src/server/game/Entities/Vehicle/Vehicle.h19
-rw-r--r--src/server/game/Globals/ObjectMgr.cpp54
-rw-r--r--src/server/game/Globals/ObjectMgr.h19
-rw-r--r--src/server/game/Groups/Group.cpp20
-rw-r--r--src/server/game/Groups/Group.h1
-rw-r--r--src/server/game/Handlers/CharacterHandler.cpp3
-rw-r--r--src/server/game/Instances/InstanceSaveMgr.cpp8
-rw-r--r--src/server/game/Instances/InstanceScript.cpp25
-rw-r--r--src/server/game/Instances/InstanceScript.h2
-rw-r--r--src/server/game/Loot/LootMgr.cpp2
-rw-r--r--src/server/game/Maps/MapManager.cpp1
-rw-r--r--src/server/game/Miscellaneous/SharedDefines.h10
-rw-r--r--src/server/game/Movement/Spline/MoveSplineInit.cpp4
-rw-r--r--src/server/game/Movement/Spline/MoveSplineInit.h11
-rw-r--r--src/server/game/Scripting/ScriptLoader.cpp8
-rw-r--r--src/server/game/Scripting/ScriptMgr.cpp5
-rw-r--r--src/server/game/Scripting/ScriptMgr.h4
-rw-r--r--src/server/game/Server/WorldSocketMgr.cpp2
-rw-r--r--src/server/game/Spells/Auras/SpellAuras.cpp19
-rw-r--r--src/server/game/Spells/Spell.cpp19
-rw-r--r--src/server/game/Spells/Spell.h2
-rw-r--r--src/server/game/Spells/SpellEffects.cpp16
-rw-r--r--src/server/game/Spells/SpellInfo.cpp8
-rw-r--r--src/server/game/Spells/SpellInfo.h4
-rw-r--r--src/server/game/Spells/SpellMgr.cpp22
-rw-r--r--src/server/game/Warden/WardenWin.cpp2
-rw-r--r--src/server/game/World/World.cpp5
-rw-r--r--src/server/scripts/Commands/cs_lookup.cpp2
-rw-r--r--src/server/scripts/Commands/cs_reload.cpp22
-rw-r--r--src/server/scripts/EasternKingdoms/CMakeLists.txt49
-rw-r--r--src/server/scripts/EasternKingdoms/MagistersTerrace/boss_vexallus.cpp11
-rw-r--r--src/server/scripts/EasternKingdoms/ScarletEnclave/chapter1.cpp92
-rw-r--r--src/server/scripts/EasternKingdoms/ScarletEnclave/zone_the_scarlet_enclave.cpp (renamed from src/server/scripts/EasternKingdoms/ScarletEnclave/the_scarlet_enclave.cpp)14
-rw-r--r--src/server/scripts/EasternKingdoms/Scholomance/boss_kirtonos_the_herald.cpp299
-rw-r--r--src/server/scripts/EasternKingdoms/Scholomance/instance_scholomance.cpp43
-rw-r--r--src/server/scripts/EasternKingdoms/Scholomance/scholomance.h36
-rw-r--r--src/server/scripts/EasternKingdoms/Stratholme/boss_baron_rivendare.cpp95
-rw-r--r--src/server/scripts/EasternKingdoms/Uldaman/boss_archaedas.cpp41
-rw-r--r--src/server/scripts/EasternKingdoms/ZulAman/boss_akilzon.cpp63
-rw-r--r--src/server/scripts/EasternKingdoms/ZulAman/boss_zuljin.cpp180
-rw-r--r--src/server/scripts/EasternKingdoms/ZulAman/instance_zulaman.cpp126
-rw-r--r--src/server/scripts/EasternKingdoms/ZulAman/zulaman.cpp288
-rw-r--r--src/server/scripts/EasternKingdoms/ZulAman/zulaman.h48
-rw-r--r--src/server/scripts/EasternKingdoms/zone_alterac_mountains.cpp (renamed from src/server/scripts/EasternKingdoms/alterac_mountains.cpp)0
-rw-r--r--src/server/scripts/EasternKingdoms/zone_arathi_highlands.cpp (renamed from src/server/scripts/EasternKingdoms/arathi_highlands.cpp)0
-rw-r--r--src/server/scripts/EasternKingdoms/zone_blasted_lands.cpp (renamed from src/server/scripts/EasternKingdoms/blasted_lands.cpp)0
-rw-r--r--src/server/scripts/EasternKingdoms/zone_burning_steppes.cpp (renamed from src/server/scripts/EasternKingdoms/burning_steppes.cpp)0
-rw-r--r--src/server/scripts/EasternKingdoms/zone_duskwood.cpp (renamed from src/server/scripts/EasternKingdoms/duskwood.cpp)0
-rw-r--r--src/server/scripts/EasternKingdoms/zone_eastern_plaguelands.cpp (renamed from src/server/scripts/EasternKingdoms/eastern_plaguelands.cpp)0
-rw-r--r--src/server/scripts/EasternKingdoms/zone_eversong_woods.cpp (renamed from src/server/scripts/EasternKingdoms/eversong_woods.cpp)0
-rw-r--r--src/server/scripts/EasternKingdoms/zone_ghostlands.cpp (renamed from src/server/scripts/EasternKingdoms/ghostlands.cpp)0
-rw-r--r--src/server/scripts/EasternKingdoms/zone_hinterlands.cpp (renamed from src/server/scripts/EasternKingdoms/hinterlands.cpp)0
-rw-r--r--src/server/scripts/EasternKingdoms/zone_ironforge.cpp (renamed from src/server/scripts/EasternKingdoms/ironforge.cpp)0
-rw-r--r--src/server/scripts/EasternKingdoms/zone_isle_of_queldanas.cpp (renamed from src/server/scripts/EasternKingdoms/isle_of_queldanas.cpp)0
-rw-r--r--src/server/scripts/EasternKingdoms/zone_loch_modan.cpp (renamed from src/server/scripts/EasternKingdoms/loch_modan.cpp)0
-rw-r--r--src/server/scripts/EasternKingdoms/zone_redridge_mountains.cpp (renamed from src/server/scripts/EasternKingdoms/redridge_mountains.cpp)0
-rw-r--r--src/server/scripts/EasternKingdoms/zone_silvermoon_city.cpp (renamed from src/server/scripts/EasternKingdoms/silvermoon_city.cpp)0
-rw-r--r--src/server/scripts/EasternKingdoms/zone_silverpine_forest.cpp (renamed from src/server/scripts/EasternKingdoms/silverpine_forest.cpp)0
-rw-r--r--src/server/scripts/EasternKingdoms/zone_stormwind_city.cpp (renamed from src/server/scripts/EasternKingdoms/stormwind_city.cpp)0
-rw-r--r--src/server/scripts/EasternKingdoms/zone_stranglethorn_vale.cpp (renamed from src/server/scripts/EasternKingdoms/stranglethorn_vale.cpp)0
-rw-r--r--src/server/scripts/EasternKingdoms/zone_swamp_of_sorrows.cpp (renamed from src/server/scripts/EasternKingdoms/swamp_of_sorrows.cpp)0
-rw-r--r--src/server/scripts/EasternKingdoms/zone_tirisfal_glades.cpp (renamed from src/server/scripts/EasternKingdoms/tirisfal_glades.cpp)0
-rw-r--r--src/server/scripts/EasternKingdoms/zone_undercity.cpp (renamed from src/server/scripts/EasternKingdoms/undercity.cpp)0
-rw-r--r--src/server/scripts/EasternKingdoms/zone_western_plaguelands.cpp (renamed from src/server/scripts/EasternKingdoms/western_plaguelands.cpp)0
-rw-r--r--src/server/scripts/EasternKingdoms/zone_westfall.cpp (renamed from src/server/scripts/EasternKingdoms/westfall.cpp)0
-rw-r--r--src/server/scripts/EasternKingdoms/zone_wetlands.cpp (renamed from src/server/scripts/EasternKingdoms/wetlands.cpp)0
-rw-r--r--src/server/scripts/Kalimdor/CMakeLists.txt44
-rw-r--r--src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_ayamiss.cpp14
-rw-r--r--src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_skeram.cpp384
-rw-r--r--src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_viscidus.cpp2
-rw-r--r--src/server/scripts/Kalimdor/zone_ashenvale.cpp (renamed from src/server/scripts/Kalimdor/ashenvale.cpp)0
-rw-r--r--src/server/scripts/Kalimdor/zone_azshara.cpp (renamed from src/server/scripts/Kalimdor/azshara.cpp)0
-rw-r--r--src/server/scripts/Kalimdor/zone_azuremyst_isle.cpp (renamed from src/server/scripts/Kalimdor/azuremyst_isle.cpp)0
-rw-r--r--src/server/scripts/Kalimdor/zone_bloodmyst_isle.cpp (renamed from src/server/scripts/Kalimdor/bloodmyst_isle.cpp)0
-rw-r--r--src/server/scripts/Kalimdor/zone_darkshore.cpp (renamed from src/server/scripts/Kalimdor/darkshore.cpp)0
-rw-r--r--src/server/scripts/Kalimdor/zone_desolace.cpp (renamed from src/server/scripts/Kalimdor/desolace.cpp)0
-rw-r--r--src/server/scripts/Kalimdor/zone_durotar.cpp (renamed from src/server/scripts/Kalimdor/durotar.cpp)0
-rw-r--r--src/server/scripts/Kalimdor/zone_dustwallow_marsh.cpp (renamed from src/server/scripts/Kalimdor/dustwallow_marsh.cpp)0
-rw-r--r--src/server/scripts/Kalimdor/zone_felwood.cpp (renamed from src/server/scripts/Kalimdor/felwood.cpp)0
-rw-r--r--src/server/scripts/Kalimdor/zone_feralas.cpp (renamed from src/server/scripts/Kalimdor/feralas.cpp)0
-rw-r--r--src/server/scripts/Kalimdor/zone_moonglade.cpp (renamed from src/server/scripts/Kalimdor/moonglade.cpp)0
-rw-r--r--src/server/scripts/Kalimdor/zone_mulgore.cpp (renamed from src/server/scripts/Kalimdor/mulgore.cpp)0
-rw-r--r--src/server/scripts/Kalimdor/zone_orgrimmar.cpp (renamed from src/server/scripts/Kalimdor/orgrimmar.cpp)0
-rw-r--r--src/server/scripts/Kalimdor/zone_silithus.cpp (renamed from src/server/scripts/Kalimdor/silithus.cpp)0
-rw-r--r--src/server/scripts/Kalimdor/zone_stonetalon_mountains.cpp (renamed from src/server/scripts/Kalimdor/stonetalon_mountains.cpp)0
-rw-r--r--src/server/scripts/Kalimdor/zone_tanaris.cpp (renamed from src/server/scripts/Kalimdor/tanaris.cpp)0
-rw-r--r--src/server/scripts/Kalimdor/zone_teldrassil.cpp (renamed from src/server/scripts/Kalimdor/teldrassil.cpp)0
-rw-r--r--src/server/scripts/Kalimdor/zone_the_barrens.cpp (renamed from src/server/scripts/Kalimdor/the_barrens.cpp)0
-rw-r--r--src/server/scripts/Kalimdor/zone_thousand_needles.cpp (renamed from src/server/scripts/Kalimdor/thousand_needles.cpp)0
-rw-r--r--src/server/scripts/Kalimdor/zone_thunder_bluff.cpp (renamed from src/server/scripts/Kalimdor/thunder_bluff.cpp)0
-rw-r--r--src/server/scripts/Kalimdor/zone_ungoro_crater.cpp (renamed from src/server/scripts/Kalimdor/ungoro_crater.cpp)0
-rw-r--r--src/server/scripts/Kalimdor/zone_winterspring.cpp (renamed from src/server/scripts/Kalimdor/winterspring.cpp)0
-rw-r--r--src/server/scripts/Northrend/CMakeLists.txt26
-rw-r--r--src/server/scripts/Northrend/DraktharonKeep/boss_novos.cpp476
-rw-r--r--src/server/scripts/Northrend/DraktharonKeep/drak_tharon_keep.h9
-rw-r--r--src/server/scripts/Northrend/DraktharonKeep/instance_drak_tharon_keep.cpp143
-rw-r--r--src/server/scripts/Northrend/Nexus/EyeOfEternity/boss_malygos.cpp144
-rw-r--r--src/server/scripts/Northrend/Nexus/Nexus/boss_commander_kolurg.cpp (renamed from src/server/scripts/Northrend/Nexus/Nexus/commander_kolurg.cpp)0
-rw-r--r--src/server/scripts/Northrend/Nexus/Nexus/boss_commander_stoutbeard.cpp (renamed from src/server/scripts/Northrend/Nexus/Nexus/commander_stoutbeard.cpp)0
-rw-r--r--src/server/scripts/Northrend/VaultOfArchavon/boss_archavon.cpp6
-rw-r--r--src/server/scripts/Northrend/zone_borean_tundra.cpp (renamed from src/server/scripts/Northrend/borean_tundra.cpp)0
-rw-r--r--src/server/scripts/Northrend/zone_crystalsong_forest.cpp (renamed from src/server/scripts/Northrend/crystalsong_forest.cpp)0
-rw-r--r--src/server/scripts/Northrend/zone_dalaran.cpp (renamed from src/server/scripts/Northrend/dalaran.cpp)0
-rw-r--r--src/server/scripts/Northrend/zone_dragonblight.cpp (renamed from src/server/scripts/Northrend/dragonblight.cpp)0
-rw-r--r--src/server/scripts/Northrend/zone_grizzly_hills.cpp (renamed from src/server/scripts/Northrend/grizzly_hills.cpp)0
-rw-r--r--src/server/scripts/Northrend/zone_howling_fjord.cpp (renamed from src/server/scripts/Northrend/howling_fjord.cpp)0
-rw-r--r--src/server/scripts/Northrend/zone_icecrown.cpp (renamed from src/server/scripts/Northrend/icecrown.cpp)0
-rw-r--r--src/server/scripts/Northrend/zone_sholazar_basin.cpp (renamed from src/server/scripts/Northrend/sholazar_basin.cpp)0
-rw-r--r--src/server/scripts/Northrend/zone_storm_peaks.cpp (renamed from src/server/scripts/Northrend/storm_peaks.cpp)0
-rw-r--r--src/server/scripts/Northrend/zone_wintergrasp.cpp (renamed from src/server/scripts/Northrend/wintergrasp.cpp)0
-rw-r--r--src/server/scripts/Northrend/zone_zuldrak.cpp (renamed from src/server/scripts/Northrend/zuldrak.cpp)0
-rw-r--r--src/server/scripts/Outland/CMakeLists.txt20
-rw-r--r--src/server/scripts/Outland/TempestKeep/botanica/boss_commander_sarannis.cpp186
-rw-r--r--src/server/scripts/Outland/TempestKeep/botanica/boss_high_botanist_freywinn.cpp9
-rw-r--r--src/server/scripts/Outland/TempestKeep/botanica/boss_laj.cpp9
-rw-r--r--src/server/scripts/Outland/TempestKeep/botanica/boss_thorngrin_the_tender.cpp152
-rw-r--r--src/server/scripts/Outland/TempestKeep/botanica/boss_warp_splinter.cpp9
-rw-r--r--src/server/scripts/Outland/TempestKeep/botanica/instance_the_botanica.cpp164
-rw-r--r--src/server/scripts/Outland/TempestKeep/botanica/the_botanica.h42
-rw-r--r--src/server/scripts/Outland/zone_blades_edge_mountains.cpp (renamed from src/server/scripts/Outland/blades_edge_mountains.cpp)0
-rw-r--r--src/server/scripts/Outland/zone_hellfire_peninsula.cpp (renamed from src/server/scripts/Outland/hellfire_peninsula.cpp)0
-rw-r--r--src/server/scripts/Outland/zone_nagrand.cpp (renamed from src/server/scripts/Outland/nagrand.cpp)0
-rw-r--r--src/server/scripts/Outland/zone_netherstorm.cpp (renamed from src/server/scripts/Outland/netherstorm.cpp)0
-rw-r--r--src/server/scripts/Outland/zone_shadowmoon_valley.cpp (renamed from src/server/scripts/Outland/shadowmoon_valley.cpp)0
-rw-r--r--src/server/scripts/Outland/zone_shattrath_city.cpp (renamed from src/server/scripts/Outland/shattrath_city.cpp)0
-rw-r--r--src/server/scripts/Outland/zone_terokkar_forest.cpp (renamed from src/server/scripts/Outland/terokkar_forest.cpp)0
-rw-r--r--src/server/scripts/Outland/zone_zangarmarsh.cpp (renamed from src/server/scripts/Outland/zangarmarsh.cpp)0
-rw-r--r--src/server/shared/Database/Field.h5
-rw-r--r--src/server/shared/Database/Implementation/CharacterDatabase.cpp961
-rw-r--r--src/server/shared/Database/Implementation/CharacterDatabase.h66
-rw-r--r--src/server/shared/Database/Implementation/LoginDatabase.cpp130
-rw-r--r--src/server/shared/Database/Implementation/WorldDatabase.cpp140
-rw-r--r--src/server/shared/Database/Implementation/WorldDatabase.h2
-rw-r--r--src/server/shared/Database/MySQLConnection.cpp7
-rw-r--r--src/server/shared/Database/MySQLConnection.h4
-rw-r--r--src/server/shared/Database/PreparedStatement.cpp80
-rw-r--r--src/server/shared/Database/PreparedStatement.h7
-rw-r--r--src/server/shared/Database/Transaction.h5
-rw-r--r--src/server/shared/Dynamic/LinkedReference/Reference.h4
-rw-r--r--src/server/shared/Dynamic/TypeContainerVisitor.h2
-rw-r--r--src/server/shared/Utilities/Util.cpp7
-rw-r--r--src/server/shared/Utilities/Util.h9
-rw-r--r--src/server/worldserver/RemoteAccess/RARunnable.cpp2
-rw-r--r--src/server/worldserver/worldserver.conf.dist9
-rw-r--r--src/tools/vmap4_extractor/model.cpp6
233 files changed, 6247 insertions, 2330 deletions
diff --git a/sql/updates/world/2012_01_05_00_world_sai.sql b/sql/updates/world/2012_01_05_00_world_sai.sql
new file mode 100644
index 00000000000..bfa06980983
--- /dev/null
+++ b/sql/updates/world/2012_01_05_00_world_sai.sql
@@ -0,0 +1,8 @@
+-- Fixup some runtime errors, linked events that were not SMART_EVENT_LINK
+UPDATE `smart_scripts` SET `event_type`=61 WHERE `entryorguid`=38017 AND `id`=1 AND `source_type`=0;
+UPDATE `smart_scripts` SET `event_type`=61 WHERE `entryorguid`=1443 AND `id`=1 AND `source_type`=0;
+UPDATE `smart_scripts` SET `event_type`=61 WHERE `entryorguid`=3448 AND `id` IN (1, 2, 3) AND `source_type`=0;
+UPDATE `smart_scripts` SET `event_type`=61 WHERE `entryorguid`=3616 AND `id` IN (1, 2) AND `source_type`=0;
+UPDATE `smart_scripts` SET `event_type`=61 WHERE `entryorguid`=4049 AND `id`=1 AND `source_type`=0;
+UPDATE `smart_scripts` SET `event_type`=61 WHERE `entryorguid`=305400 AND `id` IN (1, 2) AND `source_type`=9;
+UPDATE `smart_scripts` SET `event_type`=61 WHERE `entryorguid`=83600 AND `id` IN (1, 2, 3) AND `source_type`=9;
diff --git a/sql/updates/world/2012_12_20_00_world_skeram.sql b/sql/updates/world/2012_12_20_00_world_skeram.sql
new file mode 100644
index 00000000000..fb62da5e994
--- /dev/null
+++ b/sql/updates/world/2012_12_20_00_world_skeram.sql
@@ -0,0 +1,5 @@
+DELETE FROM `spell_target_position` WHERE id IN (4801,8195,20449);
+INSERT INTO `spell_target_position` VALUES
+(4801,531,-8306.68,2060.84,133.062,0),
+(8195,531,-8344.97,2081.36,125.649,0),
+(20449,531,-8330.63,2123.14,133.062,0);
diff --git a/sql/updates/world/2013_01_01_00_item_template_restore.sql b/sql/updates/world/2013_01_01_00_item_template_restore.sql
new file mode 100644
index 00000000000..dc18ff71fe8
--- /dev/null
+++ b/sql/updates/world/2013_01_01_00_item_template_restore.sql
@@ -0,0 +1,646 @@
+UPDATE `item_template` SET `armor`=2163 WHERE `entry`=1169;
+UPDATE `item_template` SET `armor`=278 WHERE `entry`=1717;
+UPDATE `item_template` SET `armor`=131 WHERE `entry`=3835;
+UPDATE `item_template` SET `armor`=358 WHERE `entry`=3844;
+UPDATE `item_template` SET `armor`=1101 WHERE `entry`=4070;
+UPDATE `item_template` SET `armor`=513 WHERE `entry`=6447;
+UPDATE `item_template` SET `armor`=775 WHERE `entry`=6725;
+UPDATE `item_template` SET `armor`=198 WHERE `entry`=6731;
+UPDATE `item_template` SET `armor`=234 WHERE `entry`=6742;
+UPDATE `item_template` SET `armor`=311 WHERE `entry`=6907;
+UPDATE `item_template` SET `armor`=363 WHERE `entry`=7919;
+UPDATE `item_template` SET `armor`=502 WHERE `entry`=7921;
+UPDATE `item_template` SET `armor`=421 WHERE `entry`=7922;
+UPDATE `item_template` SET `armor`=536 WHERE `entry`=7930;
+UPDATE `item_template` SET `armor`=382 WHERE `entry`=7933;
+UPDATE `item_template` SET `armor`=469 WHERE `entry`=7934;
+UPDATE `item_template` SET `armor`=341 WHERE `entry`=7963;
+UPDATE `item_template` SET `armor`=165 WHERE `entry`=9409;
+UPDATE `item_template` SET `armor`=391 WHERE `entry`=9625;
+UPDATE `item_template` SET `armor`=193 WHERE `entry`=10783;
+UPDATE `item_template` SET `armor`=817 WHERE `entry`=11604;
+UPDATE `item_template` SET `armor`=514 WHERE `entry`=11605;
+UPDATE `item_template` SET `armor`=433 WHERE `entry`=11606;
+UPDATE `item_template` SET `armor`=1903 WHERE `entry`=11631;
+UPDATE `item_template` SET `armor`=50 WHERE `entry`=11669;
+UPDATE `item_template` SET `armor`=484 WHERE `entry`=11703;
+UPDATE `item_template` SET `armor`=742 WHERE `entry`=11927;
+UPDATE `item_template` SET `armor`=150 WHERE `entry`=12544;
+UPDATE `item_template` SET `armor`=190 WHERE `entry`=12551;
+UPDATE `item_template` SET `armor`=553 WHERE `entry`=12557;
+UPDATE `item_template` SET `armor`=527 WHERE `entry`=12610;
+UPDATE `item_template` SET `armor`=492 WHERE `entry`=12611;
+UPDATE `item_template` SET `armor`=621 WHERE `entry`=12612;
+UPDATE `item_template` SET `armor`=738 WHERE `entry`=12613;
+UPDATE `item_template` SET `armor`=665 WHERE `entry`=12614;
+UPDATE `item_template` SET `armor`=629 WHERE `entry`=12633;
+UPDATE `item_template` SET `armor`=611 WHERE `entry`=12641;
+UPDATE `item_template` SET `armor`=711 WHERE `entry`=13079;
+UPDATE `item_template` SET `armor`=185 WHERE `entry`=13252;
+UPDATE `item_template` SET `armor`=207 WHERE `entry`=13258;
+UPDATE `item_template` SET `armor`=519 WHERE `entry`=13502;
+UPDATE `item_template` SET `armor`=688 WHERE `entry`=13955;
+UPDATE `item_template` SET `armor`=267 WHERE `entry`=35496;
+UPDATE `item_template` SET `armor`=268 WHERE `entry`=15053;
+UPDATE `item_template` SET `armor`=204 WHERE `entry`=15054;
+UPDATE `item_template` SET `armor`=167 WHERE `entry`=15055;
+UPDATE `item_template` SET `armor`=807 WHERE `entry`=15413;
+UPDATE `item_template` SET `armor`=96 WHERE `entry`=16341;
+UPDATE `item_template` SET `armor`=115 WHERE `entry`=16342;
+UPDATE `item_template` SET `armor`=125 WHERE `entry`=16437;
+UPDATE `item_template` SET `armor`=118 WHERE `entry`=16440;
+UPDATE `item_template` SET `armor`=175 WHERE `entry`=16441;
+UPDATE `item_template` SET `armor`=169 WHERE `entry`=16442;
+UPDATE `item_template` SET `armor`=199 WHERE `entry`=16443;
+UPDATE `item_template` SET `armor`=147 WHERE `entry`=16444;
+UPDATE `item_template` SET `armor`=207 WHERE `entry`=16446;
+UPDATE `item_template` SET `armor`=192 WHERE `entry`=16448;
+UPDATE `item_template` SET `armor`=238 WHERE `entry`=16449;
+UPDATE `item_template` SET `armor`=242 WHERE `entry`=16450;
+UPDATE `item_template` SET `armor`=234 WHERE `entry`=16451;
+UPDATE `item_template` SET `armor`=291 WHERE `entry`=16452;
+UPDATE `item_template` SET `armor`=291 WHERE `entry`=16453;
+UPDATE `item_template` SET `armor`=212 WHERE `entry`=16454;
+UPDATE `item_template` SET `armor`=254 WHERE `entry`=16455;
+UPDATE `item_template` SET `armor`=262 WHERE `entry`=16456;
+UPDATE `item_template` SET `armor`=238 WHERE `entry`=16457;
+UPDATE `item_template` SET `armor`=197 WHERE `entry`=16459;
+UPDATE `item_template` SET `armor`=405 WHERE `entry`=16462;
+UPDATE `item_template` SET `armor`=363 WHERE `entry`=16463;
+UPDATE `item_template` SET `armor`=486 WHERE `entry`=16465;
+UPDATE `item_template` SET `armor`=587 WHERE `entry`=16466;
+UPDATE `item_template` SET `armor`=502 WHERE `entry`=16467;
+UPDATE `item_template` SET `armor`=453 WHERE `entry`=16468;
+UPDATE `item_template` SET `armor`=994 WHERE `entry`=16477;
+UPDATE `item_template` SET `armor`=815 WHERE `entry`=16478;
+UPDATE `item_template` SET `armor`=842 WHERE `entry`=16479;
+UPDATE `item_template` SET `armor`=670 WHERE `entry`=16483;
+UPDATE `item_template` SET `armor`=603 WHERE `entry`=16484;
+UPDATE `item_template` SET `armor`=175 WHERE `entry`=16533;
+UPDATE `item_template` SET `armor`=169 WHERE `entry`=16534;
+UPDATE `item_template` SET `armor`=199 WHERE `entry`=16535;
+UPDATE `item_template` SET `armor`=147 WHERE `entry`=16536;
+UPDATE `item_template` SET `armor`=125 WHERE `entry`=16539;
+UPDATE `item_template` SET `armor`=118 WHERE `entry`=16540;
+UPDATE `item_template` SET `armor`=994 WHERE `entry`=16541;
+UPDATE `item_template` SET `armor`=815 WHERE `entry`=16542;
+UPDATE `item_template` SET `armor`=842 WHERE `entry`=16543;
+UPDATE `item_template` SET `armor`=670 WHERE `entry`=16545;
+UPDATE `item_template` SET `armor`=603 WHERE `entry`=16548;
+UPDATE `item_template` SET `armor`=291 WHERE `entry`=16549;
+UPDATE `item_template` SET `armor`=234 WHERE `entry`=16550;
+UPDATE `item_template` SET `armor`=238 WHERE `entry`=16551;
+UPDATE `item_template` SET `armor`=242 WHERE `entry`=16552;
+UPDATE `item_template` SET `armor`=197 WHERE `entry`=16554;
+UPDATE `item_template` SET `armor`=192 WHERE `entry`=16555;
+UPDATE `item_template` SET `armor`=212 WHERE `entry`=16560;
+UPDATE `item_template` SET `armor`=254 WHERE `entry`=16561;
+UPDATE `item_template` SET `armor`=238 WHERE `entry`=16562;
+UPDATE `item_template` SET `armor`=291 WHERE `entry`=16563;
+UPDATE `item_template` SET `armor`=262 WHERE `entry`=16564;
+UPDATE `item_template` SET `armor`=587 WHERE `entry`=16565;
+UPDATE `item_template` SET `armor`=486 WHERE `entry`=16566;
+UPDATE `item_template` SET `armor`=502 WHERE `entry`=16567;
+UPDATE `item_template` SET `armor`=453 WHERE `entry`=16568;
+UPDATE `item_template` SET `armor`=405 WHERE `entry`=16569;
+UPDATE `item_template` SET `armor`=363 WHERE `entry`=16571;
+UPDATE `item_template` SET `armor`=393 WHERE `entry`=16574;
+UPDATE `item_template` SET `armor`=863 WHERE `entry`=17013;
+UPDATE `item_template` SET `armor`=436 WHERE `entry`=17014;
+UPDATE `item_template` SET `armor`=124 WHERE `entry`=17107;
+UPDATE `item_template` SET `armor`=145 WHERE `entry`=17578;
+UPDATE `item_template` SET `armor`=149 WHERE `entry`=17579;
+UPDATE `item_template` SET `armor`=127 WHERE `entry`=17580;
+UPDATE `item_template` SET `armor`=169 WHERE `entry`=17581;
+UPDATE `item_template` SET `armor`=145 WHERE `entry`=17583;
+UPDATE `item_template` SET `armor`=145 WHERE `entry`=17586;
+UPDATE `item_template` SET `armor`=127 WHERE `entry`=17590;
+UPDATE `item_template` SET `armor`=145 WHERE `entry`=17591;
+UPDATE `item_template` SET `armor`=169 WHERE `entry`=17592;
+UPDATE `item_template` SET `armor`=149 WHERE `entry`=17593;
+UPDATE `item_template` SET `armor`=175 WHERE `entry`=17602;
+UPDATE `item_template` SET `armor`=179 WHERE `entry`=17603;
+UPDATE `item_template` SET `armor`=157 WHERE `entry`=17604;
+UPDATE `item_template` SET `armor`=199 WHERE `entry`=17605;
+UPDATE `item_template` SET `armor`=135 WHERE `entry`=17607;
+UPDATE `item_template` SET `armor`=128 WHERE `entry`=17608;
+UPDATE `item_template` SET `armor`=135 WHERE `entry`=17618;
+UPDATE `item_template` SET `armor`=128 WHERE `entry`=17620;
+UPDATE `item_template` SET `armor`=157 WHERE `entry`=17622;
+UPDATE `item_template` SET `armor`=175 WHERE `entry`=17623;
+UPDATE `item_template` SET `armor`=199 WHERE `entry`=17624;
+UPDATE `item_template` SET `armor`=179 WHERE `entry`=17625;
+UPDATE `item_template` SET `armor`=683 WHERE `entry`=17734;
+UPDATE `item_template` SET `armor`=2916 WHERE `entry`=18168;
+UPDATE `item_template` SET `armor`=383 WHERE `entry`=18351;
+UPDATE `item_template` SET `armor`=538 WHERE `entry`=18383;
+UPDATE `item_template` SET `armor`=214 WHERE `entry`=18413;
+UPDATE `item_template` SET `armor`=66 WHERE `entry`=18427;
+UPDATE `item_template` SET `armor`=66 WHERE `entry`=18440;
+UPDATE `item_template` SET `armor`=96 WHERE `entry`=18441;
+UPDATE `item_template` SET `armor`=115 WHERE `entry`=18461;
+UPDATE `item_template` SET `armor`=777 WHERE `entry`=18503;
+UPDATE `item_template` SET `armor`=552 WHERE `entry`=18521;
+UPDATE `item_template` SET `armor`=2106 WHERE `entry`=18535;
+UPDATE `item_template` SET `armor`=114 WHERE `entry`=18689;
+UPDATE `item_template` SET `armor`=696 WHERE `entry`=18690;
+UPDATE `item_template` SET `armor`=371 WHERE `entry`=18712;
+UPDATE `item_template` SET `armor`=584 WHERE `entry`=18718;
+UPDATE `item_template` SET `armor`=711 WHERE `entry`=18806;
+UPDATE `item_template` SET `armor`=447 WHERE `entry`=18829;
+UPDATE `item_template` SET `armor`=834 WHERE `entry`=18861;
+UPDATE `item_template` SET `armor`=110 WHERE `entry`=18879;
+UPDATE `item_template` SET `armor`=845 WHERE `entry`=19148;
+UPDATE `item_template` SET `armor`=238 WHERE `entry`=19149;
+UPDATE `item_template` SET `armor`=310 WHERE `entry`=19381;
+UPDATE `item_template` SET `armor`=177 WHERE `entry`=19386;
+UPDATE `item_template` SET `armor`=424 WHERE `entry`=19405;
+UPDATE `item_template` SET `armor`=237 WHERE `entry`=19509;
+UPDATE `item_template` SET `armor`=736 WHERE `entry`=19693;
+UPDATE `item_template` SET `armor`=722 WHERE `entry`=19694;
+UPDATE `item_template` SET `armor`=932 WHERE `entry`=19822;
+UPDATE `item_template` SET `armor`=315 WHERE `entry`=19838;
+UPDATE `item_template` SET `armor`=180 WHERE `entry`=19839;
+UPDATE `item_template` SET `armor`=133 WHERE `entry`=19840;
+UPDATE `item_template` SET `armor`=240 WHERE `entry`=19877;
+UPDATE `item_template` SET `armor`=140 WHERE `entry`=19888;
+UPDATE `item_template` SET `armor`=184 WHERE `entry`=19892;
+UPDATE `item_template` SET `armor`=201 WHERE `entry`=19928;
+UPDATE `item_template` SET `armor`=741 WHERE `entry`=20039;
+UPDATE `item_template` SET `armor`=159 WHERE `entry`=20045;
+UPDATE `item_template` SET `armor`=159 WHERE `entry`=20046;
+UPDATE `item_template` SET `armor`=150 WHERE `entry`=20047;
+UPDATE `item_template` SET `armor`=181 WHERE `entry`=20052;
+UPDATE `item_template` SET `armor`=181 WHERE `entry`=20053;
+UPDATE `item_template` SET `armor`=161 WHERE `entry`=20054;
+UPDATE `item_template` SET `armor`=279 WHERE `entry`=20059;
+UPDATE `item_template` SET `armor`=279 WHERE `entry`=20060;
+UPDATE `item_template` SET `armor`=196 WHERE `entry`=20061;
+UPDATE `item_template` SET `armor`=100 WHERE `entry`=20069;
+UPDATE `item_template` SET `armor`=40 WHERE `entry`=20070;
+UPDATE `item_template` SET `armor`=132 WHERE `entry`=20094;
+UPDATE `item_template` SET `armor`=103 WHERE `entry`=20095;
+UPDATE `item_template` SET `armor`=84 WHERE `entry`=20096;
+UPDATE `item_template` SET `armor`=113 WHERE `entry`=20097;
+UPDATE `item_template` SET `armor`=105 WHERE `entry`=20098;
+UPDATE `item_template` SET `armor`=88 WHERE `entry`=20099;
+UPDATE `item_template` SET `armor`=145 WHERE `entry`=20100;
+UPDATE `item_template` SET `armor`=129 WHERE `entry`=20101;
+UPDATE `item_template` SET `armor`=104 WHERE `entry`=20102;
+UPDATE `item_template` SET `armor`=136 WHERE `entry`=20103;
+UPDATE `item_template` SET `armor`=113 WHERE `entry`=20104;
+UPDATE `item_template` SET `armor`=91 WHERE `entry`=20105;
+UPDATE `item_template` SET `armor`=145 WHERE `entry`=20112;
+UPDATE `item_template` SET `armor`=129 WHERE `entry`=20113;
+UPDATE `item_template` SET `armor`=104 WHERE `entry`=20114;
+UPDATE `item_template` SET `armor`=136 WHERE `entry`=20115;
+UPDATE `item_template` SET `armor`=113 WHERE `entry`=20116;
+UPDATE `item_template` SET `armor`=91 WHERE `entry`=20117;
+UPDATE `item_template` SET `armor`=161 WHERE `entry`=20159;
+UPDATE `item_template` SET `armor`=132 WHERE `entry`=20160;
+UPDATE `item_template` SET `armor`=103 WHERE `entry`=20161;
+UPDATE `item_template` SET `armor`=84 WHERE `entry`=20162;
+UPDATE `item_template` SET `armor`=150 WHERE `entry`=20163;
+UPDATE `item_template` SET `armor`=88 WHERE `entry`=20164;
+UPDATE `item_template` SET `armor`=113 WHERE `entry`=20165;
+UPDATE `item_template` SET `armor`=105 WHERE `entry`=20166;
+UPDATE `item_template` SET `armor`=181 WHERE `entry`=20167;
+UPDATE `item_template` SET `armor`=129 WHERE `entry`=20168;
+UPDATE `item_template` SET `armor`=104 WHERE `entry`=20169;
+UPDATE `item_template` SET `armor`=145 WHERE `entry`=20170;
+UPDATE `item_template` SET `armor`=159 WHERE `entry`=20171;
+UPDATE `item_template` SET `armor`=91 WHERE `entry`=20172;
+UPDATE `item_template` SET `armor`=113 WHERE `entry`=20173;
+UPDATE `item_template` SET `armor`=136 WHERE `entry`=20174;
+UPDATE `item_template` SET `armor`=279 WHERE `entry`=20175;
+UPDATE `item_template` SET `armor`=196 WHERE `entry`=20176;
+UPDATE `item_template` SET `armor`=181 WHERE `entry`=20186;
+UPDATE `item_template` SET `armor`=129 WHERE `entry`=20187;
+UPDATE `item_template` SET `armor`=104 WHERE `entry`=20188;
+UPDATE `item_template` SET `armor`=145 WHERE `entry`=20189;
+UPDATE `item_template` SET `armor`=159 WHERE `entry`=20190;
+UPDATE `item_template` SET `armor`=91 WHERE `entry`=20191;
+UPDATE `item_template` SET `armor`=113 WHERE `entry`=20192;
+UPDATE `item_template` SET `armor`=136 WHERE `entry`=20193;
+UPDATE `item_template` SET `armor`=279 WHERE `entry`=20194;
+UPDATE `item_template` SET `armor`=40 WHERE `entry`=20214;
+UPDATE `item_template` SET `armor`=100 WHERE `entry`=20220;
+UPDATE `item_template` SET `armor`=173 WHERE `entry`=20259;
+UPDATE `item_template` SET `armor`=220 WHERE `entry`=20476;
+UPDATE `item_template` SET `armor`=308 WHERE `entry`=20477;
+UPDATE `item_template` SET `armor`=485 WHERE `entry`=20478;
+UPDATE `item_template` SET `armor`=322 WHERE `entry`=20627;
+UPDATE `item_template` SET `armor`=99 WHERE `entry`=20693;
+UPDATE `item_template` SET `armor`=512 WHERE `entry`=20710;
+UPDATE `item_template` SET `armor`=30 WHERE `entry`=20907;
+UPDATE `item_template` SET `armor`=164 WHERE `entry`=21348;
+UPDATE `item_template` SET `armor`=123 WHERE `entry`=21349;
+UPDATE `item_template` SET `armor`=132 WHERE `entry`=21350;
+UPDATE `item_template` SET `armor`=201 WHERE `entry`=21351;
+UPDATE `item_template` SET `armor`=173 WHERE `entry`=21352;
+UPDATE `item_template` SET `armor`=143 WHERE `entry`=21456;
+UPDATE `item_template` SET `armor`=287 WHERE `entry`=21467;
+UPDATE `item_template` SET `armor`=182 WHERE `entry`=21501;
+UPDATE `item_template` SET `armor`=494 WHERE `entry`=21503;
+UPDATE `item_template` SET `armor`=100 WHERE `entry`=21601;
+UPDATE `item_template` SET `armor`=269 WHERE `entry`=21605;
+UPDATE `item_template` SET `armor`=238 WHERE `entry`=21645;
+UPDATE `item_template` SET `armor`=204 WHERE `entry`=21675;
+UPDATE `item_template` SET `armor`=224 WHERE `entry`=21682;
+UPDATE `item_template` SET `armor`=276 WHERE `entry`=21693;
+UPDATE `item_template` SET `armor`=727 WHERE `entry`=21706;
+UPDATE `item_template` SET `armor`=198 WHERE `entry`=21888;
+UPDATE `item_template` SET `armor`=219 WHERE `entry`=22301;
+UPDATE `item_template` SET `armor`=203 WHERE `entry`=22302;
+UPDATE `item_template` SET `armor`=207 WHERE `entry`=22303;
+UPDATE `item_template` SET `armor`=144 WHERE `entry`=22304;
+UPDATE `item_template` SET `armor`=155 WHERE `entry`=22305;
+UPDATE `item_template` SET `armor`=139 WHERE `entry`=22306;
+UPDATE `item_template` SET `armor`=150 WHERE `entry`=22311;
+UPDATE `item_template` SET `armor`=108 WHERE `entry`=22313;
+UPDATE `item_template` SET `armor`=311 WHERE `entry`=22410;
+UPDATE `item_template` SET `armor`=257 WHERE `entry`=22740;
+UPDATE `item_template` SET `armor`=287 WHERE `entry`=22741;
+UPDATE `item_template` SET `armor`=200 WHERE `entry`=22747;
+UPDATE `item_template` SET `armor`=257 WHERE `entry`=22749;
+UPDATE `item_template` SET `armor`=287 WHERE `entry`=22750;
+UPDATE `item_template` SET `armor`=200 WHERE `entry`=22752;
+UPDATE `item_template` SET `armor`=166 WHERE `entry`=22856;
+UPDATE `item_template` SET `armor`=104 WHERE `entry`=22860;
+UPDATE `item_template` SET `armor`=155 WHERE `entry`=22864;
+UPDATE `item_template` SET `armor`=98 WHERE `entry`=22869;
+UPDATE `item_template` SET `armor`=98 WHERE `entry`=22870;
+UPDATE `item_template` SET `armor`=218 WHERE `entry`=22877;
+UPDATE `item_template` SET `armor`=215 WHERE `entry`=22878;
+UPDATE `item_template` SET `armor`=248 WHERE `entry`=22879;
+UPDATE `item_template` SET `armor`=225 WHERE `entry`=22880;
+UPDATE `item_template` SET `armor`=144 WHERE `entry`=22882;
+UPDATE `item_template` SET `armor`=144 WHERE `entry`=22883;
+UPDATE `item_template` SET `armor`=156 WHERE `entry`=22885;
+UPDATE `item_template` SET `armor`=156 WHERE `entry`=22886;
+UPDATE `item_template` SET `armor`=212 WHERE `entry`=22938;
+UPDATE `item_template` SET `armor`=140 WHERE `entry`=23018;
+UPDATE `item_template` SET `armor`=3994 WHERE `entry`=23043;
+UPDATE `item_template` SET `armor`=467 WHERE `entry`=23069;
+UPDATE `item_template` SET `armor`=446 WHERE `entry`=23226;
+UPDATE `item_template` SET `armor`=198 WHERE `entry`=23253;
+UPDATE `item_template` SET `armor`=206 WHERE `entry`=23254;
+UPDATE `item_template` SET `armor`=238 WHERE `entry`=23257;
+UPDATE `item_template` SET `armor`=196 WHERE `entry`=23258;
+UPDATE `item_template` SET `armor`=131 WHERE `entry`=23261;
+UPDATE `item_template` SET `armor`=115 WHERE `entry`=23262;
+UPDATE `item_template` SET `armor`=141 WHERE `entry`=23263;
+UPDATE `item_template` SET `armor`=135 WHERE `entry`=23264;
+UPDATE `item_template` SET `armor`=155 WHERE `entry`=23284;
+UPDATE `item_template` SET `armor`=166 WHERE `entry`=23285;
+UPDATE `item_template` SET `armor`=98 WHERE `entry`=23288;
+UPDATE `item_template` SET `armor`=98 WHERE `entry`=23290;
+UPDATE `item_template` SET `armor`=104 WHERE `entry`=23291;
+UPDATE `item_template` SET `armor`=218 WHERE `entry`=23294;
+UPDATE `item_template` SET `armor`=215 WHERE `entry`=23295;
+UPDATE `item_template` SET `armor`=248 WHERE `entry`=23298;
+UPDATE `item_template` SET `armor`=225 WHERE `entry`=23299;
+UPDATE `item_template` SET `armor`=144 WHERE `entry`=23302;
+UPDATE `item_template` SET `armor`=156 WHERE `entry`=23303;
+UPDATE `item_template` SET `armor`=144 WHERE `entry`=23304;
+UPDATE `item_template` SET `armor`=156 WHERE `entry`=23305;
+UPDATE `item_template` SET `armor`=198 WHERE `entry`=23308;
+UPDATE `item_template` SET `armor`=206 WHERE `entry`=23309;
+UPDATE `item_template` SET `armor`=238 WHERE `entry`=23312;
+UPDATE `item_template` SET `armor`=196 WHERE `entry`=23313;
+UPDATE `item_template` SET `armor`=131 WHERE `entry`=23316;
+UPDATE `item_template` SET `armor`=115 WHERE `entry`=23317;
+UPDATE `item_template` SET `armor`=141 WHERE `entry`=23318;
+UPDATE `item_template` SET `armor`=135 WHERE `entry`=23319;
+UPDATE `item_template` SET `armor`=943 WHERE `entry`=23517;
+UPDATE `item_template` SET `armor`=1257 WHERE `entry`=23518;
+UPDATE `item_template` SET `armor`=1284 WHERE `entry`=23519;
+UPDATE `item_template` SET `armor`=1366 WHERE `entry`=23535;
+UPDATE `item_template` SET `armor`=223 WHERE `entry`=23825;
+UPDATE `item_template` SET `armor`=349 WHERE `entry`=24258;
+UPDATE `item_template` SET `armor`=271 WHERE `entry`=24379;
+UPDATE `item_template` SET `armor`=181 WHERE `entry`=26030;
+UPDATE `item_template` SET `armor`=184 WHERE `entry`=27645;
+UPDATE `item_template` SET `armor`=284 WHERE `entry`=27648;
+UPDATE `item_template` SET `armor`=205 WHERE `entry`=27768;
+UPDATE `item_template` SET `armor`=216 WHERE `entry`=27988;
+UPDATE `item_template` SET `armor`=283 WHERE `entry`=28126;
+UPDATE `item_template` SET `armor`=356 WHERE `entry`=28127;
+UPDATE `item_template` SET `armor`=400 WHERE `entry`=28128;
+UPDATE `item_template` SET `armor`=331 WHERE `entry`=28129;
+UPDATE `item_template` SET `armor`=429 WHERE `entry`=28130;
+UPDATE `item_template` SET `armor`=283 WHERE `entry`=28136;
+UPDATE `item_template` SET `armor`=356 WHERE `entry`=28137;
+UPDATE `item_template` SET `armor`=400 WHERE `entry`=28138;
+UPDATE `item_template` SET `armor`=331 WHERE `entry`=28139;
+UPDATE `item_template` SET `armor`=429 WHERE `entry`=28140;
+UPDATE `item_template` SET `armor`=143 WHERE `entry`=28211;
+UPDATE `item_template` SET `armor`=390 WHERE `entry`=28256;
+UPDATE `item_template` SET `armor`=234 WHERE `entry`=28301;
+UPDATE `item_template` SET `armor`=259 WHERE `entry`=28443;
+UPDATE `item_template` SET `armor`=307 WHERE `entry`=28444;
+UPDATE `item_template` SET `armor`=213 WHERE `entry`=28445;
+UPDATE `item_template` SET `armor`=259 WHERE `entry`=28446;
+UPDATE `item_template` SET `armor`=307 WHERE `entry`=28447;
+UPDATE `item_template` SET `armor`=187 WHERE `entry`=28448;
+UPDATE `item_template` SET `armor`=248 WHERE `entry`=28574;
+UPDATE `item_template` SET `armor`=248 WHERE `entry`=28575;
+UPDATE `item_template` SET `armor`=213 WHERE `entry`=28618;
+UPDATE `item_template` SET `armor`=267 WHERE `entry`=28619;
+UPDATE `item_template` SET `armor`=306 WHERE `entry`=28620;
+UPDATE `item_template` SET `armor`=249 WHERE `entry`=28622;
+UPDATE `item_template` SET `armor`=322 WHERE `entry`=28623;
+UPDATE `item_template` SET `armor`=385 WHERE `entry`=28660;
+UPDATE `item_template` SET `armor`=223 WHERE `entry`=28675;
+UPDATE `item_template` SET `armor`=213 WHERE `entry`=28719;
+UPDATE `item_template` SET `armor`=267 WHERE `entry`=28720;
+UPDATE `item_template` SET `armor`=306 WHERE `entry`=28721;
+UPDATE `item_template` SET `armor`=249 WHERE `entry`=28722;
+UPDATE `item_template` SET `armor`=322 WHERE `entry`=28723;
+UPDATE `item_template` SET `armor`=213 WHERE `entry`=28811;
+UPDATE `item_template` SET `armor`=267 WHERE `entry`=28812;
+UPDATE `item_template` SET `armor`=306 WHERE `entry`=28813;
+UPDATE `item_template` SET `armor`=249 WHERE `entry`=28814;
+UPDATE `item_template` SET `armor`=322 WHERE `entry`=28815;
+UPDATE `item_template` SET `armor`=213 WHERE `entry`=28871;
+UPDATE `item_template` SET `armor`=267 WHERE `entry`=28872;
+UPDATE `item_template` SET `armor`=306 WHERE `entry`=28873;
+UPDATE `item_template` SET `armor`=249 WHERE `entry`=28874;
+UPDATE `item_template` SET `armor`=322 WHERE `entry`=28875;
+UPDATE `item_template` SET `armor`=259 WHERE `entry`=28976;
+UPDATE `item_template` SET `armor`=307 WHERE `entry`=28977;
+UPDATE `item_template` SET `armor`=213 WHERE `entry`=28978;
+UPDATE `item_template` SET `armor`=259 WHERE `entry`=29004;
+UPDATE `item_template` SET `armor`=307 WHERE `entry`=29005;
+UPDATE `item_template` SET `armor`=187 WHERE `entry`=29006;
+UPDATE `item_template` SET `armor`=294 WHERE `entry`=29276;
+UPDATE `item_template` SET `armor`=350 WHERE `entry`=29277;
+UPDATE `item_template` SET `armor`=371 WHERE `entry`=29278;
+UPDATE `item_template` SET `armor`=392 WHERE `entry`=29279;
+UPDATE `item_template` SET `armor`=294 WHERE `entry`=29384;
+UPDATE `item_template` SET `armor`=267 WHERE `entry`=29385;
+UPDATE `item_template` SET `armor`=393 WHERE `entry`=29607;
+UPDATE `item_template` SET `armor`=262 WHERE `entry`=29777;
+UPDATE `item_template` SET `armor`=489 WHERE `entry`=30069;
+UPDATE `item_template` SET `armor`=257 WHERE `entry`=30931;
+UPDATE `item_template` SET `armor`=195 WHERE `entry`=30932;
+UPDATE `item_template` SET `armor`=283 WHERE `entry`=31375;
+UPDATE `item_template` SET `armor`=356 WHERE `entry`=31376;
+UPDATE `item_template` SET `armor`=400 WHERE `entry`=31377;
+UPDATE `item_template` SET `armor`=331 WHERE `entry`=31378;
+UPDATE `item_template` SET `armor`=429 WHERE `entry`=31379;
+UPDATE `item_template` SET `armor`=213 WHERE `entry`=31584;
+UPDATE `item_template` SET `armor`=267 WHERE `entry`=31585;
+UPDATE `item_template` SET `armor`=306 WHERE `entry`=31586;
+UPDATE `item_template` SET `armor`=249 WHERE `entry`=31587;
+UPDATE `item_template` SET `armor`=322 WHERE `entry`=31588;
+UPDATE `item_template` SET `armor`=213 WHERE `entry`=31589;
+UPDATE `item_template` SET `armor`=267 WHERE `entry`=31590;
+UPDATE `item_template` SET `armor`=306 WHERE `entry`=31591;
+UPDATE `item_template` SET `armor`=249 WHERE `entry`=31592;
+UPDATE `item_template` SET `armor`=322 WHERE `entry`=31593;
+UPDATE `item_template` SET `armor`=259 WHERE `entry`=31594;
+UPDATE `item_template` SET `armor`=307 WHERE `entry`=31595;
+UPDATE `item_template` SET `armor`=259 WHERE `entry`=31596;
+UPDATE `item_template` SET `armor`=307 WHERE `entry`=31597;
+UPDATE `item_template` SET `armor`=187 WHERE `entry`=31598;
+UPDATE `item_template` SET `armor`=187 WHERE `entry`=31599;
+UPDATE `item_template` SET `armor`=324 WHERE `entry`=31967;
+UPDATE `item_template` SET `armor`=404 WHERE `entry`=31968;
+UPDATE `item_template` SET `armor`=417 WHERE `entry`=31969;
+UPDATE `item_template` SET `armor`=377 WHERE `entry`=31971;
+UPDATE `item_template` SET `armor`=498 WHERE `entry`=31972;
+UPDATE `item_template` SET `armor`=283 WHERE `entry`=31973;
+UPDATE `item_template` SET `armor`=395 WHERE `entry`=31974;
+UPDATE `item_template` SET `armor`=410 WHERE `entry`=31975;
+UPDATE `item_template` SET `armor`=311 WHERE `entry`=31976;
+UPDATE `item_template` SET `armor`=438 WHERE `entry`=31977;
+UPDATE `item_template` SET `armor`=311 WHERE `entry`=31979;
+UPDATE `item_template` SET `armor`=395 WHERE `entry`=31980;
+UPDATE `item_template` SET `armor`=283 WHERE `entry`=31981;
+UPDATE `item_template` SET `armor`=438 WHERE `entry`=31982;
+UPDATE `item_template` SET `armor`=410 WHERE `entry`=31983;
+UPDATE `item_template` SET `armor`=310 WHERE `entry`=31987;
+UPDATE `item_template` SET `armor`=390 WHERE `entry`=31988;
+UPDATE `item_template` SET `armor`=417 WHERE `entry`=31989;
+UPDATE `item_template` SET `armor`=377 WHERE `entry`=31990;
+UPDATE `item_template` SET `armor`=470 WHERE `entry`=31991;
+UPDATE `item_template` SET `armor`=283 WHERE `entry`=32015;
+UPDATE `item_template` SET `armor`=395 WHERE `entry`=32016;
+UPDATE `item_template` SET `armor`=410 WHERE `entry`=32017;
+UPDATE `item_template` SET `armor`=311 WHERE `entry`=32018;
+UPDATE `item_template` SET `armor`=438 WHERE `entry`=32019;
+UPDATE `item_template` SET `armor`=283 WHERE `entry`=32034;
+UPDATE `item_template` SET `armor`=395 WHERE `entry`=32035;
+UPDATE `item_template` SET `armor`=410 WHERE `entry`=32036;
+UPDATE `item_template` SET `armor`=311 WHERE `entry`=32037;
+UPDATE `item_template` SET `armor`=438 WHERE `entry`=32038;
+UPDATE `item_template` SET `armor`=310 WHERE `entry`=32056;
+UPDATE `item_template` SET `armor`=390 WHERE `entry`=32057;
+UPDATE `item_template` SET `armor`=431 WHERE `entry`=32058;
+UPDATE `item_template` SET `armor`=363 WHERE `entry`=32059;
+UPDATE `item_template` SET `armor`=470 WHERE `entry`=32060;
+UPDATE `item_template` SET `armor`=336 WHERE `entry`=32786;
+UPDATE `item_template` SET `armor`=336 WHERE `entry`=32788;
+UPDATE `item_template` SET `armor`=336 WHERE `entry`=32796;
+UPDATE `item_template` SET `armor`=283 WHERE `entry`=32798;
+UPDATE `item_template` SET `armor`=283 WHERE `entry`=32800;
+UPDATE `item_template` SET `armor`=283 WHERE `entry`=32808;
+UPDATE `item_template` SET `armor`=216 WHERE `entry`=32810;
+UPDATE `item_template` SET `armor`=216 WHERE `entry`=32812;
+UPDATE `item_template` SET `armor`=216 WHERE `entry`=32821;
+UPDATE `item_template` SET `armor`=295 WHERE `entry`=33054;
+UPDATE `item_template` SET `armor`=293 WHERE `entry`=33759;
+UPDATE `item_template` SET `armor`=471 WHERE `entry`=33702;
+UPDATE `item_template` SET `armor`=343 WHERE `entry`=33700;
+UPDATE `item_template` SET `armor`=409 WHERE `entry`=33677;
+UPDATE `item_template` SET `armor`=409 WHERE `entry`=33718;
+UPDATE `item_template` SET `armor`=293 WHERE `entry`=33717;
+UPDATE `item_template` SET `armor`=409 WHERE `entry`=33745;
+UPDATE `item_template` SET `armor`=443 WHERE `entry`=33673;
+UPDATE `item_template` SET `armor`=409 WHERE `entry`=33758;
+UPDATE `item_template` SET `armor`=346 WHERE `entry`=33593;
+UPDATE `item_template` SET `armor`=424 WHERE `entry`=33761;
+UPDATE `item_template` SET `armor`=329 WHERE `entry`=33690;
+UPDATE `item_template` SET `armor`=293 WHERE `entry`=33676;
+UPDATE `item_template` SET `armor`=529 WHERE `entry`=33675;
+UPDATE `item_template` SET `armor`=454 WHERE `entry`=33680;
+UPDATE `item_template` SET `armor`=443 WHERE `entry`=33701;
+UPDATE `item_template` SET `armor`=238 WHERE `entry`=33914;
+UPDATE `item_template` SET `armor`=173 WHERE `entry`=33913;
+UPDATE `item_template` SET `armor`=454 WHERE `entry`=33721;
+UPDATE `item_template` SET `armor`=208 WHERE `entry`=33900;
+UPDATE `item_template` SET `armor`=454 WHERE `entry`=33760;
+UPDATE `item_template` SET `armor`=529 WHERE `entry`=33704;
+UPDATE `item_template` SET `armor`=409 WHERE `entry`=33683;
+UPDATE `item_template` SET `armor`=238 WHERE `entry`=33884;
+UPDATE `item_template` SET `armor`=208 WHERE `entry`=33912;
+UPDATE `item_template` SET `armor`=293 WHERE `entry`=33684;
+UPDATE `item_template` SET `armor`=173 WHERE `entry`=33901;
+UPDATE `item_template` SET `armor`=424 WHERE `entry`=33678;
+UPDATE `item_template` SET `armor`=208 WHERE `entry`=33882;
+UPDATE `item_template` SET `armor`=173 WHERE `entry`=33883;
+UPDATE `item_template` SET `armor`=293 WHERE `entry`=33744;
+UPDATE `item_template` SET `armor`=300 WHERE `entry`=33879;
+UPDATE `item_template` SET `armor`=343 WHERE `entry`=33671;
+UPDATE `item_template` SET `armor`=415 WHERE `entry`=33691;
+UPDATE `item_template` SET `armor`=501 WHERE `entry`=33694;
+UPDATE `item_template` SET `armor`=300 WHERE `entry`=33885;
+UPDATE `item_template` SET `armor`=357 WHERE `entry`=33886;
+UPDATE `item_template` SET `armor`=236 WHERE `entry`=33887;
+UPDATE `item_template` SET `armor`=238 WHERE `entry`=33902;
+UPDATE `item_template` SET `armor`=429 WHERE `entry`=33672;
+UPDATE `item_template` SET `armor`=236 WHERE `entry`=33881;
+UPDATE `item_template` SET `armor`=424 WHERE `entry`=33686;
+UPDATE `item_template` SET `armor`=454 WHERE `entry`=33685;
+UPDATE `item_template` SET `armor`=443 WHERE `entry`=33692;
+UPDATE `item_template` SET `armor`=424 WHERE `entry`=33719;
+UPDATE `item_template` SET `armor`=454 WHERE `entry`=33748;
+UPDATE `item_template` SET `armor`=357 WHERE `entry`=33880;
+UPDATE `item_template` SET `armor`=236 WHERE `entry`=33917;
+UPDATE `item_template` SET `armor`=329 WHERE `entry`=33767;
+UPDATE `item_template` SET `armor`=457 WHERE `entry`=33769;
+UPDATE `item_template` SET `armor`=357 WHERE `entry`=33916;
+UPDATE `item_template` SET `armor`=415 WHERE `entry`=33768;
+UPDATE `item_template` SET `armor`=501 WHERE `entry`=33771;
+UPDATE `item_template` SET `armor`=300 WHERE `entry`=33915;
+UPDATE `item_template` SET `armor`=424 WHERE `entry`=33746;
+UPDATE `item_template` SET `armor`=323 WHERE `entry`=33679;
+UPDATE `item_template` SET `armor`=323 WHERE `entry`=33682;
+UPDATE `item_template` SET `armor`=400 WHERE `entry`=33693;
+UPDATE `item_template` SET `armor`=400 WHERE `entry`=33674;
+UPDATE `item_template` SET `armor`=386 WHERE `entry`=33770;
+UPDATE `item_template` SET `armor`=323 WHERE `entry`=33747;
+UPDATE `item_template` SET `armor`=323 WHERE `entry`=33720;
+UPDATE `item_template` SET `armor`=400 WHERE `entry`=33703;
+UPDATE `item_template` SET `armor`=323 WHERE `entry`=33757;
+UPDATE `item_template` SET `armor`=252 WHERE `entry`=34706;
+UPDATE `item_template` SET `armor`=387 WHERE `entry`=34810;
+UPDATE `item_template` SET `armor`=392 WHERE `entry`=34888;
+UPDATE `item_template` SET `armor`=213 WHERE `entry`=35356;
+UPDATE `item_template` SET `armor`=267 WHERE `entry`=35357;
+UPDATE `item_template` SET `armor`=306 WHERE `entry`=35358;
+UPDATE `item_template` SET `armor`=249 WHERE `entry`=35359;
+UPDATE `item_template` SET `armor`=322 WHERE `entry`=35360;
+UPDATE `item_template` SET `armor`=213 WHERE `entry`=35361;
+UPDATE `item_template` SET `armor`=267 WHERE `entry`=35362;
+UPDATE `item_template` SET `armor`=306 WHERE `entry`=35363;
+UPDATE `item_template` SET `armor`=249 WHERE `entry`=35364;
+UPDATE `item_template` SET `armor`=322 WHERE `entry`=35365;
+UPDATE `item_template` SET `armor`=213 WHERE `entry`=35371;
+UPDATE `item_template` SET `armor`=267 WHERE `entry`=35372;
+UPDATE `item_template` SET `armor`=306 WHERE `entry`=35373;
+UPDATE `item_template` SET `armor`=249 WHERE `entry`=35374;
+UPDATE `item_template` SET `armor`=322 WHERE `entry`=35375;
+UPDATE `item_template` SET `armor`=322 WHERE `entry`=35469;
+UPDATE `item_template` SET `armor`=249 WHERE `entry`=35470;
+UPDATE `item_template` SET `armor`=213 WHERE `entry`=35471;
+UPDATE `item_template` SET `armor`=308 WHERE `entry`=34213;
+UPDATE `item_template` SET `armor`=306 WHERE `entry`=35003;
+UPDATE `item_template` SET `armor`=354 WHERE `entry`=35022;
+UPDATE `item_template` SET `armor`=478 WHERE `entry`=35024;
+UPDATE `item_template` SET `armor`=430 WHERE `entry`=35025;
+UPDATE `item_template` SET `armor`=541 WHERE `entry`=35026;
+UPDATE `item_template` SET `armor`=447 WHERE `entry`=35023;
+UPDATE `item_template` SET `armor`=430 WHERE `entry`=35001;
+UPDATE `item_template` SET `armor`=569 WHERE `entry`=35002;
+UPDATE `item_template` SET `armor`=461 WHERE `entry`=34999;
+UPDATE `item_template` SET `armor`=368 WHERE `entry`=34998;
+UPDATE `item_template` SET `armor`=478 WHERE `entry`=35000;
+UPDATE `item_template` SET `armor`=416 WHERE `entry`=35114;
+UPDATE `item_template` SET `armor`=541 WHERE `entry`=35115;
+UPDATE `item_template` SET `armor`=447 WHERE `entry`=35112;
+UPDATE `item_template` SET `armor`=354 WHERE `entry`=35111;
+UPDATE `item_template` SET `armor`=492 WHERE `entry`=35113;
+UPDATE `item_template` SET `armor`=476 WHERE `entry`=35099;
+UPDATE `item_template` SET `armor`=442 WHERE `entry`=35100;
+UPDATE `item_template` SET `armor`=306 WHERE `entry`=35098;
+UPDATE `item_template` SET `armor`=339 WHERE `entry`=35096;
+UPDATE `item_template` SET `armor`=426 WHERE `entry`=35097;
+UPDATE `item_template` SET `armor`=368 WHERE `entry`=35032;
+UPDATE `item_template` SET `armor`=569 WHERE `entry`=35036;
+UPDATE `item_template` SET `armor`=475 WHERE `entry`=35033;
+UPDATE `item_template` SET `armor`=430 WHERE `entry`=35035;
+UPDATE `item_template` SET `armor`=506 WHERE `entry`=35034;
+UPDATE `item_template` SET `armor`=442 WHERE `entry`=35005;
+UPDATE `item_template` SET `armor`=476 WHERE `entry`=35007;
+UPDATE `item_template` SET `armor`=339 WHERE `entry`=35006;
+UPDATE `item_template` SET `armor`=426 WHERE `entry`=35004;
+UPDATE `item_template` SET `armor`=339 WHERE `entry`=35009;
+UPDATE `item_template` SET `armor`=306 WHERE `entry`=35011;
+UPDATE `item_template` SET `armor`=476 WHERE `entry`=35012;
+UPDATE `item_template` SET `armor`=426 WHERE `entry`=35010;
+UPDATE `item_template` SET `armor`=442 WHERE `entry`=35013;
+UPDATE `item_template` SET `armor`=219 WHERE `entry`=35153;
+UPDATE `item_template` SET `armor`=219 WHERE `entry`=35159;
+UPDATE `item_template` SET `armor`=306 WHERE `entry`=35053;
+UPDATE `item_template` SET `armor`=219 WHERE `entry`=35164;
+UPDATE `item_template` SET `armor`=322 WHERE `entry`=35165;
+UPDATE `item_template` SET `armor`=322 WHERE `entry`=35152;
+UPDATE `item_template` SET `armor`=253 WHERE `entry`=35167;
+UPDATE `item_template` SET `armor`=322 WHERE `entry`=35154;
+UPDATE `item_template` SET `armor`=183 WHERE `entry`=35168;
+UPDATE `item_template` SET `armor`=183 WHERE `entry`=35174;
+UPDATE `item_template` SET `armor`=442 WHERE `entry`=35055;
+UPDATE `item_template` SET `armor`=183 WHERE `entry`=35179;
+UPDATE `item_template` SET `armor`=385 WHERE `entry`=35139;
+UPDATE `item_template` SET `armor`=253 WHERE `entry`=35169;
+UPDATE `item_template` SET `armor`=476 WHERE `entry`=35057;
+UPDATE `item_template` SET `armor`=426 WHERE `entry`=35054;
+UPDATE `item_template` SET `armor`=442 WHERE `entry`=35085;
+UPDATE `item_template` SET `armor`=476 WHERE `entry`=35087;
+UPDATE `item_template` SET `armor`=339 WHERE `entry`=35086;
+UPDATE `item_template` SET `armor`=426 WHERE `entry`=35084;
+UPDATE `item_template` SET `armor`=306 WHERE `entry`=35083;
+UPDATE `item_template` SET `armor`=339 WHERE `entry`=35056;
+UPDATE `item_template` SET `armor`=253 WHERE `entry`=35149;
+UPDATE `item_template` SET `armor`=253 WHERE `entry`=35180;
+UPDATE `item_template` SET `armor`=385 WHERE `entry`=35150;
+UPDATE `item_template` SET `armor`=385 WHERE `entry`=35137;
+UPDATE `item_template` SET `armor`=253 WHERE `entry`=35138;
+UPDATE `item_template` SET `armor`=253 WHERE `entry`=35144;
+UPDATE `item_template` SET `armor`=170 WHERE `entry`=6733;
+UPDATE `item_template` SET `armor`=605 WHERE `entry`=15141;
+UPDATE `item_template` SET `armor`=504 WHERE `entry`=37084;
+UPDATE `item_template` SET `armor`=486 WHERE `entry`=39225;
+UPDATE `item_template` SET `armor`=490 WHERE `entry`=40252;
+UPDATE `item_template` SET `armor`=1788 WHERE `entry`=41190;
+UPDATE `item_template` SET `armor`=337 WHERE `entry`=41238;
+UPDATE `item_template` SET `armor`=1438 WHERE `entry`=42826;
+UPDATE `item_template` SET `armor`=2880 WHERE `entry`=45267;
+UPDATE `item_template` SET `armor`=3500 WHERE `entry`=49904;
+UPDATE `item_template` SET `armor`=737 WHERE `entry`=50466;
+UPDATE `item_template` SET `armor`=1735 WHERE `entry`=50802;
+UPDATE `item_template` SET `armor`=2461 WHERE `entry`=50849;
+UPDATE `item_template` SET `armor`=3590 WHERE `entry`=50850;
+UPDATE `item_template` SET `armor`=2461 WHERE `entry`=50856;
+UPDATE `item_template` SET `armor`=3590 WHERE `entry`=50857;
+UPDATE `item_template` SET `armor`=2461 WHERE `entry`=50863;
+UPDATE `item_template` SET `armor`=3817 WHERE `entry`=50968;
+UPDATE `item_template` SET `armor`=2658 WHERE `entry`=50978;
+UPDATE `item_template` SET `armor`=2143 WHERE `entry`=50991;
+UPDATE `item_template` SET `armor`=2658 WHERE `entry`=51172;
+UPDATE `item_template` SET `armor`=3831 WHERE `entry`=51174;
+UPDATE `item_template` SET `armor`=2658 WHERE `entry`=51217;
+UPDATE `item_template` SET `armor`=3590 WHERE `entry`=50864;
+UPDATE `item_template` SET `armor`=2658 WHERE `entry`=51132;
+UPDATE `item_template` SET `armor`=3831 WHERE `entry`=51219;
+UPDATE `item_template` SET `armor`=4100 WHERE `entry`=51220;
+UPDATE `item_template` SET `armor`=2871 WHERE `entry`=51222;
+UPDATE `item_template` SET `armor`=3831 WHERE `entry`=51134;
+UPDATE `item_template` SET `armor`=4100 WHERE `entry`=51265;
+UPDATE `item_template` SET `armor`=2871 WHERE `entry`=51267;
+UPDATE `item_template` SET `armor`=4100 WHERE `entry`=51305;
+UPDATE `item_template` SET `armor`=2871 WHERE `entry`=51307;
+UPDATE `item_template` SET `armor`=1869 WHERE `entry`=51901;
+UPDATE `item_template` SET `armor`=649 WHERE `entry`=54801;
+UPDATE `item_template` SET `armor`=283 WHERE `entry`=42680;
+UPDATE `item_template` SET `armor`=356 WHERE `entry`=42681;
+UPDATE `item_template` SET `armor`=400 WHERE `entry`=42682;
+UPDATE `item_template` SET `armor`=331 WHERE `entry`=42683;
+UPDATE `item_template` SET `armor`=429 WHERE `entry`=42684;
+UPDATE `item_template` SET `armor`=283 WHERE `entry`=42685;
+UPDATE `item_template` SET `armor`=356 WHERE `entry`=42686;
+UPDATE `item_template` SET `armor`=400 WHERE `entry`=42687;
+UPDATE `item_template` SET `armor`=331 WHERE `entry`=42688;
+UPDATE `item_template` SET `armor`=429 WHERE `entry`=42689;
diff --git a/sql/updates/world/2013_01_01_01_world_creature_text.sql b/sql/updates/world/2013_01_01_01_world_creature_text.sql
new file mode 100644
index 00000000000..c0055f8e1d0
--- /dev/null
+++ b/sql/updates/world/2013_01_01_01_world_creature_text.sql
@@ -0,0 +1,30 @@
+-- NPC talk text convert from creature_ai_text. Moving boss to cpp.
+UPDATE `creature_template` SET `AIName`= '', `ScriptName`= 'boss_commander_sarannis' WHERE `entry`=17976;
+DELETE FROM `creature_ai_scripts` WHERE `creature_id`=17976;
+DELETE FROM `creature_ai_texts` WHERE `entry` BETWEEN -39 AND -34;
+DELETE FROM `creature_text` WHERE `entry` IN (17976);
+INSERT INTO `creature_text` (`entry`,`groupid`,`id`,`text`,`type`,`language`,`probability`,`emote`,`duration`,`sound`,`comment`) VALUES
+(17976,0,0, 'Step forward! I will see that you are properly welcomed.',14,0,100,0,0,11071, 'Commander Sarannis - On Aggro Say'),
+(17976,1,0, 'Oh stop your whimpering.',14,0,100,0,0,11072, 'Commander Sarannis - On Player Death Say'),
+(17976,1,1, 'Mission accomplished.',14,0,100,0,0,11073, 'Commander Sarannis - On Player Death Say'),
+(17976,2,0, 'You are no longer dealing with some underling.',14,0,100,0,0,11076, 'Commander Sarannis - On Cast Arcane Resonance Say'),
+(17976,3,0, 'Band''or shorel''aran!',14,0,100,0,0,11077, 'Commander Sarannis - On Cast Arcane Devastation Say'),
+(17976,4,0, '%s calls for reinforcements.',16,0,100,0,0,0, 'Commander Sarannis - On HP@50% Summon emote'),
+(17976,5,0, 'Guards! Come and kill these intruders!',14,0,100,0,0,11078, 'Commander Sarannis - On HP@50% Summon Say'),
+(17976,6,0, 'I have not yet... begun to...',14,0,100,0,0,11079, 'Commander Sarannis - On Death Say');
+
+-- NPC talk text convert from creature_ai_text. Moving boss to cpp.
+UPDATE `creature_template` SET `AIName`= '', `ScriptName`= 'thorngrin_the_tender' WHERE `entry`=17978;
+DELETE FROM `creature_ai_scripts` WHERE `creature_id`=17978;
+DELETE FROM `creature_ai_texts` WHERE entry BETWEEN -16 AND -9;
+DELETE FROM `creature_text` WHERE `entry` IN (17978);
+INSERT INTO `creature_text` (`entry`,`groupid`,`id`,`text`,`type`,`language`,`probability`,`emote`,`duration`,`sound`,`comment`) VALUES
+(17978,0,0, 'What aggravation is this? You will die!',14,0,100,0,0,11205, 'Thorngrin the Tender - Aggro Say'),
+(17978,1,0, 'You seek a prize, eh? How about death?',14,0,100,0,0,11206, 'Thorngrin the Tender - 20% Health Say'),
+(17978,2,0, 'I hate to say I told you so...',14,0,100,0,0,11207, 'Thorngrin the Tender - Player Death Say'),
+(17978,3,0, 'Your life will be mine!',14,0,100,0,0,11208, 'Thorngrin the Tender - Cast Sacrifice Say'),
+(17978,4,0, 'I revel in your pain!',14,0,100,0,0,11209, 'Thorngrin the Tender - 50% Health Say'),
+(17978,5,0, 'I''ll incinerate you!',14,0,100,0,0,11210, 'Thorngrin the Tender - Cast Hellfire Say'),
+(17978,5,1, 'Scream while you burn!',14,0,100,0,0,11211, 'Thorngrin the Tender - Cast Hellfire Say'),
+(17978,6,0, 'You won''t... get far.',14,0,100,0,0,11212, 'Thorngrin the Tender - On Death Say'),
+(17978,7,0, '%s becomes enraged!',16,0,100,0,0,0, 'Thorngrin the Tender - On Enrage Say');
diff --git a/sql/updates/world/2013_01_02_00_world_misc.sql b/sql/updates/world/2013_01_02_00_world_misc.sql
new file mode 100644
index 00000000000..8527b8ab145
--- /dev/null
+++ b/sql/updates/world/2013_01_02_00_world_misc.sql
@@ -0,0 +1,7 @@
+DELETE FROM `creature_template_addon` WHERE `entry`=32535;
+INSERT INTO `creature_template_addon` (`entry`, `path_id`, `mount`, `bytes1`, `bytes2`, `emote`, `auras`) VALUES
+(32535, 0, 0, 0x3020400, 0x1, 0, '60534');
+
+DELETE FROM `npc_spellclick_spells` WHERE `npc_entry`=32535;
+INSERT INTO `npc_spellclick_spells` (`npc_entry`, `spell_id`, `cast_flags`, `user_type`) VALUE
+(32535, 61245, 1, 0);
diff --git a/sql/updates/world/2013_01_02_01_world_spell_script.sql b/sql/updates/world/2013_01_02_01_world_spell_script.sql
new file mode 100644
index 00000000000..a839ca6dc7b
--- /dev/null
+++ b/sql/updates/world/2013_01_02_01_world_spell_script.sql
@@ -0,0 +1,3 @@
+DELETE FROM `spell_script_names` WHERE `spell_id`=34803;
+INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES
+(34803,'spell_commander_sarannis_summon_reinforcements');
diff --git a/sql/updates/world/2013_01_02_02_world_instance_template.sql b/sql/updates/world/2013_01_02_02_world_instance_template.sql
new file mode 100644
index 00000000000..f63a2c3ba2e
--- /dev/null
+++ b/sql/updates/world/2013_01_02_02_world_instance_template.sql
@@ -0,0 +1 @@
+UPDATE `instance_template` SET `script`='instance_the_botanica' WHERE `map`=553;
diff --git a/sql/updates/world/2013_01_02_03_world_sai.sql b/sql/updates/world/2013_01_02_03_world_sai.sql
new file mode 100644
index 00000000000..6f6318b55bd
--- /dev/null
+++ b/sql/updates/world/2013_01_02_03_world_sai.sql
@@ -0,0 +1,18 @@
+-- Summoned Bloodwarder Mender SAI
+SET @ENTRY := 20083;
+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,100,7,0,0,0,0,11,34815,0,0,0,0,0,1,0,0,0,0,0,0,0,'Summoned Bloodwarder Mender - Just Created - Cast Teleport Effect'),
+(@ENTRY,0,1,0,0,0,100,6,5000,5000,185000,185000,11,34809,0,0,0,0,0,1,0,0,0,0,0,0,0,'Summoned Bloodwarder Mender - Combat - Cast Holy Fury'),
+(@ENTRY,0,2,0,0,0,100,2,8000,8000,10000,14000,11,17194,0,0,0,0,0,2,0,0,0,0,0,0,0,'Summoned Bloodwarder Mender (Normal) - Combat - Cast Mind Blast'),
+(@ENTRY,0,3,0,0,0,100,4,8000,8000,10000,14000,11,17287,0,0,0,0,0,2,0,0,0,0,0,0,0,'Summoned Bloodwarder Mender (Heroic) - Combat - Cast Mind Blast'),
+(@ENTRY,0,4,0,2,0,100,7,0,30,0,0,11,35096,0,0,0,0,0,1,0,0,0,0,0,0,0,"Summoned Bloodwarder Mender - At 30% Health - Cast Greater Heal");
+
+-- Summoned Bloodwarder Reservist SAI
+SET @ENTRY := 20078;
+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,100,7,0,0,0,0,11,34815,0,0,0,0,0,1,0,0,0,0,0,0,0,'Summoned Bloodwarder Mender - Just Created - Cast Teleport Effect'),
+(@ENTRY,0,1,0,0,0,100,6,4000,8000,10000,12000,11,34820,0,0,0,0,0,2,0,0,0,0,0,0,0,'Summoned Bloodwarder Mender - Combat - Cast Arcane Strike');
diff --git a/sql/updates/world/2013_01_02_04_world_creature.sql b/sql/updates/world/2013_01_02_04_world_creature.sql
new file mode 100644
index 00000000000..686909ce57e
--- /dev/null
+++ b/sql/updates/world/2013_01_02_04_world_creature.sql
@@ -0,0 +1 @@
+DELETE FROM `creature` WHERE `id`=28318; -- Grand Apothecary Putress
diff --git a/sql/updates/world/2013_01_02_05_eye_of_eternity.sql b/sql/updates/world/2013_01_02_05_eye_of_eternity.sql
new file mode 100644
index 00000000000..89cc8f08cce
--- /dev/null
+++ b/sql/updates/world/2013_01_02_05_eye_of_eternity.sql
@@ -0,0 +1,27 @@
+-- Add missing text and update old one
+-- Malygos
+UPDATE `creature_text` SET `probability`=100 WHERE `entry`=28859; -- Was at 0 for some reason
+UPDATE `creature_text` SET `text`='Unthinkable! The mortals will destroy... everything! My sister, what have you...',`sound`=14540 WHERE `entry`=28859 AND `groupid`=14 AND `id`=0;
+DELETE FROM `creature_text` WHERE `entry`=28859 AND `groupid` IN (15,16);
+DELETE FROM `creature_text` WHERE `entry`=30084;
+INSERT INTO `creature_text` (`entry`,`groupid`,`text`,`type`,`probability`,`sound`,`comment`) VALUES
+(28859,15, '%s fixes his eyes on you!', 42,100,0, 'Malygos'),
+(28859,16, 'I am without limits here. The rules of your cherished reality do not apply. In this realm, I am in control!',14,100,14515, 'Malygos'),
+(30084,0, 'A Power Spark forms from a nearby rift!',41,100,14522, 'Power spark to portal');
+-- Alexstrasza, add missing sounds
+UPDATE `creature_text` SET `probability`=100,`sound`=14406 WHERE `entry`=32295 AND `groupid`=0 AND `id`=0;
+UPDATE `creature_text` SET `probability`=100,`sound`=14407 WHERE `entry`=32295 AND `groupid`=1 AND `id`=0;
+UPDATE `creature_text` SET `probability`=100,`sound`=14408 WHERE `entry`=32295 AND `groupid`=2 AND `id`=0;
+UPDATE `creature_text` SET `probability`=100,`sound`=14409 WHERE `entry`=32295 AND `groupid`=3 AND `id`=0;
+
+-- Update portal InhabitType, otherwise it falls on summon
+UPDATE `creature_template` SET `InhabitType`=4 WHERE `entry`=30118;
+
+-- Update drakes templates
+UPDATE `creature_template` SET `unit_flags`=8,`InhabitType`=4 WHERE `entry`=30161; -- no fly aura present only enabled gravity in sniffs
+
+-- Addon data
+DELETE FROM `creature_template_addon` WHERE `entry` IN (30084,30161);
+INSERT INTO `creature_template_addon` (`entry`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES
+(30084,0,0,50331648,1,0,'55845'), -- Power Spark
+(30161,0,0,50331648,1,0,'60534'); -- Wyrmrest Skytalon (uses no fly aura)
diff --git a/sql/updates/world/2013_01_02_06_world_sai.sql b/sql/updates/world/2013_01_02_06_world_sai.sql
new file mode 100644
index 00000000000..2ce089188d6
--- /dev/null
+++ b/sql/updates/world/2013_01_02_06_world_sai.sql
@@ -0,0 +1,9 @@
+DELETE FROM `gameobject_scripts` WHERE `id`=12148;
+UPDATE `gameobject_template` SET `AIName`='SmartGameObjectAI' WHERE `entry` IN (17156,17157);
+DELETE FROM `smart_scripts` WHERE `entryorguid` IN (17156,17157) 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
+-- Stonewraught Gate
+(17156,1,0,0,70,0,100,0,2,0,0,0,9,0,0,0,0,0,0,14,30084,150138,0,0,0,0,0,'Door lever - On activate - Activate Door'), -- autoclose is set to 3s, old script suggested 15s !?
+(17157,1,0,0,70,0,100,0,2,0,0,0,9,0,0,0,0,0,0,14, 6943,150137,0,0,0,0,0,'Door lever - On activate - Activate Door'); -- autoclose is set to 3s, old script suggested 15s !?
+-- uldaman shit
+DELETE FROM `gameobject_scripts` where `id` =14393; -- the keystone already has a cpp, if the door doesnt open, then add it there!
diff --git a/sql/updates/world/2013_01_02_06_world_waypoints.sql b/sql/updates/world/2013_01_02_06_world_waypoints.sql
new file mode 100644
index 00000000000..c7302a457a2
--- /dev/null
+++ b/sql/updates/world/2013_01_02_06_world_waypoints.sql
@@ -0,0 +1,283 @@
+-- Pathing for Commander Sarannis Entry: 17976
+SET @NPC := 82986;
+SET @PATH := @NPC * 10;
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=125.7293,`position_y`=321.185,`position_z`=-3.635947 WHERE `guid`=@NPC;
+DELETE FROM `creature_template_addon` WHERE `entry`=17976;
+INSERT INTO `creature_template_addon` (`entry`,`path_id`,`bytes2`,`mount`,`auras`) VALUES (17976,@PATH,1,0, '19818');
+DELETE FROM `waypoint_data` WHERE `id`=@PATH;
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`delay`,`move_flag`,`action`,`action_chance`,`wpguid`) VALUES
+(@PATH,1,125.7293,321.185,-3.635947,1000,0,0,100,0),
+(@PATH,2,135.6253,311.316,-1.57836,0,0,0,100,0),
+(@PATH,3,150.9637,296.034,-4.566956,1000,0,0,100,0),
+(@PATH,4,135.6253,311.316,-1.57836,0,0,0,100,0);
+
+-- Pathing for High Botanist Freywinn Entry: 17975
+SET @NPC := 82987;
+SET @PATH := @NPC * 10;
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=116.3259,`position_y`=455.5696,`position_z`=-4.941401 WHERE `guid`=@NPC;
+DELETE FROM `creature_template_addon` WHERE `entry`=17975;
+INSERT INTO `creature_template_addon` (`entry`,`path_id`,`bytes2`,`mount`,`auras`) VALUES (17975,@PATH,1,0, '');
+DELETE FROM `waypoint_data` WHERE `id`=@PATH;
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_flag`,`action`,`action_chance`,`wpguid`) VALUES
+(@PATH,1,116.3259,455.5696,-4.941401,3.385939,20000,0,0,100,0),
+(@PATH,2,120.164,450.6817,-4.894922,0,500,0,0,100,0),
+(@PATH,3,120.164,450.6817,-4.894922,4.555309,20000,0,0,100,0),
+(@PATH,4,116.3259,455.5696,-4.941401,0,500,0,0,100,0);
+
+-- Pathing for Bloodwarder Greenkeeper Entry: 18419
+SET @NPC := 82994;
+SET @PATH := @NPC * 10;
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=-4.453328,`position_y`=252.8713,`position_z`=-5.396591 WHERE `guid`=@NPC;
+DELETE FROM `creature_addon` WHERE `guid`=@NPC;
+INSERT INTO `creature_addon` (`guid`,`path_id`,`bytes2`,`mount`,`auras`) VALUES (@NPC,@PATH,1,0, '');
+DELETE FROM `waypoint_data` WHERE `id`=@PATH;
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_flag`,`action`,`action_chance`,`wpguid`) VALUES
+(@PATH,1,-4.453328,252.8713,-5.396591,0.06981317,10000,0,49,100,0),
+(@PATH,2,-4.453328,252.8713,-5.396591,2.146755,19000,0,476,100,0);
+
+-- Pathing for Bloodwarder Greenkeeper Entry: 18419
+SET @NPC := 82993;
+SET @PATH := @NPC * 10;
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=3.139327,`position_y`=253.476,`position_z`=-5.392399 WHERE `guid`=@NPC;
+DELETE FROM `creature_addon` WHERE `guid`=@NPC;
+INSERT INTO `creature_addon` (`guid`,`path_id`,`bytes2`,`mount`,`auras`) VALUES (@NPC,@PATH,1,0, '');
+DELETE FROM `waypoint_data` WHERE `id`=@PATH;
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_flag`,`action`,`action_chance`,`wpguid`) VALUES
+(@PATH,1,3.139327,253.476,-5.392399,3.141593,10000,0,49,100,0),
+(@PATH,2,3.139327,253.476,-5.392399,0.9773844,19000,0,476,100,0);
+
+DELETE FROM `waypoint_scripts` WHERE `id`=49;
+INSERT INTO `waypoint_scripts` (`id`,`delay`,`command`,`datalong`,`datalong2`,`guid`) VALUES
+(49,1,1,378,1,68);
+
+-- Pathing for Bloodwarder Greenkeeper Entry: 18419
+SET @NPC := 82983;
+SET @PATH := @NPC * 10;
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=2.213146,`position_y`=163.0322,`position_z`=-5.54038 WHERE `guid`=@NPC;
+DELETE FROM `creature_addon` WHERE `guid`=@NPC;
+INSERT INTO `creature_addon` (`guid`,`path_id`,`bytes2`,`mount`,`auras`) VALUES (@NPC,@PATH,1,0, '');
+DELETE FROM `waypoint_data` WHERE `id`=@PATH;
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_flag`,`action`,`action_chance`,`wpguid`) VALUES
+(@PATH,1,2.213146,163.0322,-5.54038,2.251475,26000,0,0,100,0),
+(@PATH,2,-0.7086419,160.2672,-5.540373,0,0,0,0,100,0),
+(@PATH,3,-4.294355,161.2607,-5.540364,0,0,0,0,100,0),
+(@PATH,4,-6.205455,163.514,-5.54036,0,0,0,0,100,0),
+(@PATH,5,-6.24241,166.6921,-5.540361,0,0,0,0,100,0),
+(@PATH,6,-6.24241,166.6921,-5.540361,1.780236,18000,0,0,100,0),
+(@PATH,7,-3.464332,161.0224,-5.540366,0,0,0,0,100,0),
+(@PATH,8,0.992403,160.6039,-5.540379,0,0,0,0,100,0),
+(@PATH,9,2.213146,163.0322,-5.54038,0,0,0,0,100,0);
+
+-- Pathing for Bloodwarder Greenkeeper Entry: 18419
+SET @NPC := 82977;
+SET @PATH := @NPC * 10;
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=13.11812,`position_y`=198.4727,`position_z`=-5.54039 WHERE `guid`=@NPC;
+DELETE FROM `creature_addon` WHERE `guid`=@NPC;
+INSERT INTO `creature_addon` (`guid`,`path_id`,`bytes2`,`mount`,`auras`) VALUES (@NPC,@PATH,1,0, '');
+DELETE FROM `waypoint_data` WHERE `id`=@PATH;
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_flag`,`action`,`action_chance`,`wpguid`) VALUES
+(@PATH,1,13.11812,198.4727,-5.54039,0,0,0,0,100,0),
+(@PATH,2,13.11812,198.4727,-5.54039,0.8552113,7000,0,0,100,0),
+(@PATH,3,13.77349,194.1652,-5.540394,0,0,0,0,100,0),
+(@PATH,4,17.34217,193.0448,-5.540406,0,0,0,0,100,0),
+(@PATH,5,17.34217,193.0448,-5.540406,0.9424778,18000,0,0,100,0),
+(@PATH,6,13.03814,196.0347,-5.540391,0,0,0,0,100,0);
+
+-- Pathing for Bloodwarder Greenkeeper Entry: 18419
+SET @NPC := 82981;
+SET @PATH := @NPC * 10;
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=-8.21974,`position_y`=204.3309,`position_z`=-5.540359 WHERE `guid`=@NPC;
+DELETE FROM `creature_addon` WHERE `guid`=@NPC;
+INSERT INTO `creature_addon` (`guid`,`path_id`,`bytes2`,`mount`,`auras`) VALUES (@NPC,@PATH,1,0, '');
+DELETE FROM `waypoint_data` WHERE `id`=@PATH;
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_flag`,`action`,`action_chance`,`wpguid`) VALUES
+(@PATH,1,-8.21974,204.3309,-5.540359,3.560472,26000,0,0,100,0),
+(@PATH,2,-7.085683,202.0462,-5.540362,0,0,0,0,100,0),
+(@PATH,3,-10.7415,199.8233,-5.540348,0,0,0,0,100,0),
+(@PATH,4,-12.49067,195.6114,-5.540347,0,0,0,0,100,0),
+(@PATH,5,-16.42434,194.2959,-5.540349,0,0,0,0,100,0),
+(@PATH,6,-19.61755,196.9462,-5.540346,0,0,0,0,100,0),
+(@PATH,7,-19.61755,196.9462,-5.540346,1.361357,22000,0,0,100,0),
+(@PATH,8,-16.42434,194.2959,-5.540349,0,0,0,0,100,0),
+(@PATH,9,-10.83238,198.4772,-5.540348,0,0,0,0,100,0),
+(@PATH,10,-7.085683,202.0462,-5.540362,0,0,0,0,100,0),
+(@PATH,11,-8.21974,204.3309,-5.540359,0,0,0,0,100,0);
+
+-- Pathing for Tempest-Forge Peacekeeper Entry: 18405
+SET @NPC := 82992;
+SET @PATH := @NPC * 10;
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=14.39464,`position_y`=191.6226,`position_z`=-5.540398 WHERE `guid`=@NPC;
+DELETE FROM `creature_addon` WHERE `guid`=@NPC;
+INSERT INTO `creature_addon` (`guid`,`path_id`,`bytes2`,`mount`,`auras`) VALUES (@NPC,@PATH,1,0, '');
+DELETE FROM `waypoint_data` WHERE `id`=@PATH;
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`delay`,`move_flag`,`action`,`action_chance`,`wpguid`) VALUES
+(@PATH,1,14.39464,191.6226,-5.540398,0,0,0,100,0),
+(@PATH,2,14.18493,177.3456,-5.540413,0,0,0,100,0),
+(@PATH,3,14.39464,191.6226,-5.540398,0,0,0,100,0),
+(@PATH,4,9.744885,197.8509,-5.540387,0,0,0,100,0),
+(@PATH,5,-0.7083383,202.6878,-5.540373,0,0,0,100,0),
+(@PATH,6,-0.863688,242.4021,-5.575537,0,0,0,100,0),
+(@PATH,7,-0.771556,202.717,-5.540379,0,0,0,100,0),
+(@PATH,8,9.744885,197.8509,-5.540387,0,0,0,100,0);
+
+-- Pathing for Bloodfalcon Entry: 18155
+SET @NPC := 83010;
+SET @PATH := @NPC * 10;
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=100.8468,`position_y`=280.3725,`position_z`=-6.887547 WHERE `guid`=@NPC;
+DELETE FROM `creature_addon` WHERE `guid`=@NPC;
+INSERT INTO `creature_addon` (`guid`,`path_id`,`bytes2`,`mount`,`auras`) VALUES (@NPC,@PATH,1,0, '');
+DELETE FROM `waypoint_data` WHERE `id`=@PATH;
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`delay`,`move_flag`,`action`,`action_chance`,`wpguid`) VALUES
+(@PATH,1,100.8468,280.3725,-6.887547,0,0,0,100,0),
+(@PATH,2,77.20944,279.0805,-5.444278,0,0,0,100,0),
+(@PATH,3,84.07146,264.8167,-5.424605,0,0,0,100,0),
+(@PATH,4,92.04115,267.708,-5.393034,0,0,0,100,0),
+(@PATH,5,99.9794,272.1951,-6.974396,0,0,0,100,0);
+
+-- Pathing for Bloodfalcon Entry: 18155
+SET @NPC := 83009;
+SET @PATH := @NPC * 10;
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=109.3741,`position_y`=279.2442,`position_z`=-6.94078 WHERE `guid`=@NPC;
+DELETE FROM `creature_addon` WHERE `guid`=@NPC;
+INSERT INTO `creature_addon` (`guid`,`path_id`,`bytes2`,`mount`,`auras`) VALUES (@NPC,@PATH,1,0, '');
+DELETE FROM `waypoint_data` WHERE `id`=@PATH;
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`delay`,`move_flag`,`action`,`action_chance`,`wpguid`) VALUES
+(@PATH,1,109.3741,279.2442,-6.94078,0,0,0,100,0),
+(@PATH,2,106.6039,296.3932,-6.736755,0,0,0,100,0),
+(@PATH,3,114.8603,296.713,-5.403351,0,0,0,100,0),
+(@PATH,4,120.5567,289.947,-5.410193,0,0,0,100,0),
+(@PATH,5,119.7589,278.0228,-5.423053,0,0,0,100,0),
+(@PATH,6,114.742,276.3138,-6.998993,0,0,0,100,0);
+
+-- Pathing for Bloodfalcon Entry: 18155
+SET @NPC := 83008;
+SET @PATH := @NPC * 10;
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=101.2185,`position_y`=295.671,`position_z`=-6.719101 WHERE `guid`=@NPC;
+DELETE FROM `creature_addon` WHERE `guid`=@NPC;
+INSERT INTO `creature_addon` (`guid`,`path_id`,`bytes2`,`mount`,`auras`) VALUES (@NPC,@PATH,1,0, '');
+DELETE FROM `waypoint_data` WHERE `id`=@PATH;
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`delay`,`move_flag`,`action`,`action_chance`,`wpguid`) VALUES
+(@PATH,1,101.2185,295.671,-6.719101,0,0,0,100,0),
+(@PATH,2,101.0785,294.0834,-6.736097,0,0,0,100,0),
+(@PATH,3,99.73528,294.2418,-6.727928,0,0,0,100,0),
+(@PATH,4,99.9539,294.9124,-6.721509,0,0,0,100,0),
+(@PATH,5,101.4649,294.7929,-6.730046,0,0,0,100,0),
+(@PATH,6,97.40523,292.5155,-6.736019,0,0,0,100,0),
+(@PATH,7,99.61896,292.5375,-6.746336,0,0,0,100,0),
+(@PATH,8,99.74017,296.1521,-6.706696,0,0,0,100,0),
+(@PATH,9,98.21532,295.972,-6.701425,0,0,0,100,0),
+(@PATH,10,100.0779,295.0646,-6.720407,0,0,0,100,0),
+(@PATH,11,101.4872,291.8169,-6.763266,0,0,0,100,0),
+(@PATH,12,99.03914,291.6151,-6.753832,0,0,0,100,0),
+(@PATH,13,100.0113,293.701,-6.735262,0,0,0,100,0),
+(@PATH,14,99.75899,294.4994,-6.725174,0,0,0,100,0),
+(@PATH,15,99.56416,293.6588,-6.733598,0,0,0,100,0),
+(@PATH,16,99.97965,293.2847,-6.739742,0,0,0,100,0);
+
+-- Pathing for Bloodwarder Falconer Entry: 17994
+SET @NPC := 83007;
+SET @PATH := @NPC * 10;
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=102.2101,`position_y`=287.5207,`position_z`=-6.814517 WHERE `guid`=@NPC;
+DELETE FROM `creature_addon` WHERE `guid`=@NPC;
+INSERT INTO `creature_addon` (`guid`,`path_id`,`bytes2`,`mount`,`auras`) VALUES (@NPC,@PATH,1,0, '');
+DELETE FROM `waypoint_data` WHERE `id`=@PATH;
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_flag`,`action`,`action_chance`,`wpguid`) VALUES
+(@PATH,1,102.2101,287.5207,-6.814517,0,0,0,0,100,0),
+(@PATH,2,102.5804,286.6708,-6.825739,0,0,0,0,100,0),
+(@PATH,3,102.1126,287.9805,-6.808935,0,0,0,0,100,0),
+(@PATH,4,103.0655,288.2263,-6.810746,0,0,0,0,100,0),
+(@PATH,5,102.2138,287.1823,-6.818299,0,0,0,0,100,0),
+(@PATH,6,100.6942,286.5314,-6.818292,0,0,0,0,100,0),
+(@PATH,7,101.7873,287.9028,-6.808247,0,0,0,0,100,0),
+(@PATH,8,101.8391,289.0352,-6.795895,0,0,0,0,100,0),
+(@PATH,9,102.7853,288.8042,-6.802979,0,0,0,0,100,0),
+(@PATH,10,102.7853,288.8042,-6.802979,0.8377581,3000,0,50,100,0),
+(@PATH,11,102.208,288.0875,-6.808199,0,0,0,0,100,0),
+(@PATH,12,103.2457,288.6324,-6.807087,0,0,0,0,100,0),
+(@PATH,13,101.3874,289.0022,-6.794107,0,0,0,0,100,0),
+(@PATH,14,102.0153,287.4591,-6.814272,0,0,0,0,100,0),
+(@PATH,15,101.6863,285.8949,-6.830106,0,0,0,0,100,0),
+(@PATH,16,103.6638,286.2337,-6.83577,0,0,0,0,100,0),
+(@PATH,17,103.6638,286.2337,-6.83577,0.8377581,3000,0,50,100,0),
+(@PATH,18,101.7167,286.4881,-6.823652,0,0,0,0,100,0),
+(@PATH,19,102.2377,286.9568,-6.820922,0,0,0,0,100,0),
+(@PATH,20,102.3838,285.2078,-6.841079,0,0,0,0,100,0),
+(@PATH,21,102.3838,285.2078,-6.841079,0.8377581,3000,0,50,100,0);
+
+DELETE FROM `waypoint_scripts` WHERE `id`=50;
+INSERT INTO `waypoint_scripts` (`id`,`delay`,`command`,`datalong`,`datalong2`,`guid`) VALUES
+(50,0,1,25,0,69);
+
+-- Pathing for Sunseeker Researcher Entry: 18421
+SET @NPC := 83052;
+SET @PATH := @NPC * 10;
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=158.1747,`position_y`=496.2738,`position_z`=-3.868253 WHERE `guid`=@NPC;
+DELETE FROM `creature_addon` WHERE `guid`=@NPC;
+INSERT INTO `creature_addon` (`guid`,`path_id`,`bytes2`,`mount`,`auras`) VALUES (@NPC,@PATH,1,0, '');
+DELETE FROM `waypoint_data` WHERE `id`=@PATH;
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`delay`,`move_flag`,`action`,`action_chance`,`wpguid`) VALUES
+(@PATH,1,158.1747,496.2738,-3.868253,0,0,0,100,0),
+(@PATH,2,156.1526,489.3673,-4.857466,0,0,0,100,0),
+(@PATH,3,150.5289,483.8496,-4.521907,0,0,0,100,0),
+(@PATH,4,138.1562,471.4412,-1.710583,0,0,0,100,0),
+(@PATH,5,125.0919,458.282,-4.002612,25000,0,0,100,0),
+(@PATH,6,136.7875,469.6367,-1.535325,0,0,0,100,0),
+(@PATH,7,143.6099,477.3061,-2.875249,0,0,0,100,0),
+(@PATH,8,151.2965,484.3168,-4.559049,0,0,0,100,0),
+(@PATH,9,157.2852,490.9466,-4.815495,0,0,0,100,0),
+(@PATH,10,159.9993,499.248,-2.327699,0,0,0,100,0),
+(@PATH,11,164.1381,501.6526,-2.169621,25000,0,0,100,0);
+
+-- Pathing for Sunseeker Botanist Entry: 18422
+SET @NPC := 83017;
+SET @PATH := @NPC * 10;
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=161.3267,`position_y`=377.6318,`position_z`=-5.38641 WHERE `guid`=@NPC;
+DELETE FROM `creature_addon` WHERE `guid`=@NPC;
+INSERT INTO `creature_addon` (`guid`,`path_id`,`bytes2`,`mount`,`auras`) VALUES (@NPC,@PATH,1,0, '');
+DELETE FROM `waypoint_data` WHERE `id`=@PATH;
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_flag`,`action`,`action_chance`,`wpguid`) VALUES
+(@PATH,1,161.3267,377.6318,-5.38641,0,0,0,0,100,0),
+(@PATH,2,161.3267,377.6318,-5.38641,3.892084,25000,0,0,100,0),
+(@PATH,3,164.7352,383.6933,-5.386415,0,0,0,0,100,0),
+(@PATH,4,164.0884,388.1612,-5.386421,0,0,0,0,100,0),
+(@PATH,5,161.8422,392.5251,-5.386427,0,0,0,0,100,0),
+(@PATH,6,159.0437,394.9259,-5.386432,0,0,0,0,100,0),
+(@PATH,7,154.6845,398.0776,-5.386438,0,0,0,0,100,0),
+(@PATH,8,153.9412,401.8906,-5.386443,0,0,0,0,100,0),
+(@PATH,9,153.9412,401.8906,-5.386443,0.9424778,25000,0,0,100,0),
+(@PATH,10,155.4246,397.5377,-5.386436,0,0,0,0,100,0),
+(@PATH,11,157.8206,395.4006,-5.386433,0,0,0,0,100,0),
+(@PATH,12,160.7398,392.5124,-5.386428,0,0,0,0,100,0),
+(@PATH,13,163.7198,388.017,-5.386421,0,0,0,0,100,0),
+(@PATH,14,163.845,385.0679,-5.386418,0,0,0,0,100,0),
+(@PATH,15,163.1142,380.8199,-5.386413,0,0,0,0,100,0);
+-- 0xF13047F60000354E .go 161.3267 377.6318 -5.38641
+
+-- Pathing for Sunseeker Botanist Entry: 18422
+SET @NPC := 83030;
+SET @PATH := @NPC * 10;
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=185.3934,`position_y`=384.4199,`position_z`=-5.391479 WHERE `guid`=@NPC;
+DELETE FROM `creature_addon` WHERE `guid`=@NPC;
+INSERT INTO `creature_addon` (`guid`,`path_id`,`bytes2`,`mount`,`auras`) VALUES (@NPC,@PATH,1,0, '');
+DELETE FROM `waypoint_data` WHERE `id`=@PATH;
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_flag`,`action`,`action_chance`,`wpguid`) VALUES
+(@PATH,1,185.3934,384.4199,-5.391479,0,0,0,0,100,0),
+(@PATH,2,191.3777,384.4846,-5.404879,0,0,0,0,100,0),
+(@PATH,3,191.3777,384.4846,-5.404879,0.7679449,25000,0,0,100,0),
+(@PATH,4,186.8178,385.4778,-5.394615,0,0,0,0,100,0),
+(@PATH,5,183.8889,388.4998,-5.3879,0,0,0,0,100,0),
+(@PATH,6,182.7735,392.4268,-5.386416,0,0,0,0,100,0),
+(@PATH,7,181.8264,397.8481,-5.386423,0,0,0,0,100,0),
+(@PATH,8,177.4602,402.4377,-5.386431,0,0,0,0,100,0),
+(@PATH,9,169.0016,404.7528,-5.386438,0,0,0,0,100,0),
+(@PATH,10,161.5859,402.9305,-5.38644,0,0,0,0,100,0),
+(@PATH,11,161.5859,402.9305,-5.38644,2.268928,25000,0,0,100,0),
+(@PATH,12,165.1373,399.9031,-5.386434,0,0,0,0,100,0),
+(@PATH,13,168.7618,399.839,-5.386432,0,0,0,0,100,0),
+(@PATH,14,172.8151,400.5747,-5.386431,0,0,0,0,100,0),
+(@PATH,15,177.9102,400.0075,-5.386427,0,0,0,0,100,0),
+(@PATH,16,181.755,397.4692,-5.386423,0,0,0,0,100,0),
+(@PATH,17,182.4747,393.0989,-5.386417,0,0,0,0,100,0),
+(@PATH,18,183.0329,388.3197,-5.386411,0,0,0,0,100,0);
+
+DELETE FROM `creature` WHERE `guid` IN (83022,83027,83023,83026);
diff --git a/sql/updates/world/2013_01_02_07_world_waypoints.sql b/sql/updates/world/2013_01_02_07_world_waypoints.sql
new file mode 100644
index 00000000000..b49fd0b28a6
--- /dev/null
+++ b/sql/updates/world/2013_01_02_07_world_waypoints.sql
@@ -0,0 +1,157 @@
+-- Pathing for Hath'ar Necromagus Entry: 28257
+SET @NPC := 104622;
+SET @PATH := @NPC * 10;
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=5019.215,`position_y`=-3688.894,`position_z`=320.5594 WHERE `guid`=@NPC;
+DELETE FROM `creature_addon` WHERE `guid`=@NPC;
+INSERT INTO `creature_addon` (`guid`,`path_id`,`bytes2`,`mount`,`auras`) VALUES (@NPC,@PATH,1,0, '');
+DELETE FROM `waypoint_data` WHERE `id`=@PATH;
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`delay`,`move_flag`,`action`,`action_chance`,`wpguid`) VALUES
+(@PATH,1,5019.215,-3688.894,320.5594,0,0,0,100,0),
+(@PATH,2,5002.956,-3658.76,323.2104,0,0,0,100,0),
+(@PATH,3,4992.721,-3643.726,324.9065,0,0,0,100,0),
+(@PATH,4,5002.956,-3658.76,323.2104,0,0,0,100,0),
+(@PATH,5,5019.215,-3688.894,320.5594,0,0,0,100,0),
+(@PATH,6,5019.668,-3703.462,320.5379,0,0,0,100,0);
+
+-- Pathing for Hath'ar Necromagus Entry: 28257
+SET @NPC := 104614;
+SET @PATH := @NPC * 10;
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=5025.362,`position_y`=-3604.257,`position_z`=349.464 WHERE `guid`=@NPC;
+DELETE FROM `creature_addon` WHERE `guid`=@NPC;
+INSERT INTO `creature_addon` (`guid`,`path_id`,`bytes2`,`mount`,`auras`) VALUES (@NPC,@PATH,1,0, '');
+DELETE FROM `waypoint_data` WHERE `id`=@PATH;
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`delay`,`move_flag`,`action`,`action_chance`,`wpguid`) VALUES
+(@PATH,1,5025.362,-3604.257,349.464,0,0,0,100,0),
+(@PATH,2,5041.33,-3605.005,352.8885,0,0,0,100,0),
+(@PATH,3,5052.726,-3607.239,355.7938,0,0,0,100,0),
+(@PATH,4,5066.022,-3605.421,360.1152,0,0,0,100,0),
+(@PATH,5,5080.014,-3609.861,362.831,0,0,0,100,0),
+(@PATH,6,5095.403,-3626.727,359.9017,0,0,0,100,0),
+(@PATH,7,5109.978,-3643.893,366.1679,0,0,0,100,0),
+(@PATH,8,5115.737,-3659.64,372.9412,0,0,0,100,0),
+(@PATH,9,5119.728,-3671.96,375.7362,0,0,0,100,0),
+(@PATH,10,5115.737,-3659.64,372.9412,0,0,0,100,0),
+(@PATH,11,5110.043,-3644.025,366.2568,0,0,0,100,0),
+(@PATH,12,5095.57,-3627.037,360.0706,0,0,0,100,0),
+(@PATH,13,5080.014,-3609.861,362.831,0,0,0,100,0),
+(@PATH,14,5066.022,-3605.421,360.1152,0,0,0,100,0),
+(@PATH,15,5052.726,-3607.239,355.7938,0,0,0,100,0),
+(@PATH,16,5041.33,-3605.005,352.8885,0,0,0,100,0);
+
+-- Pathing for Hath'ar Necromagus Entry: 28257
+SET @NPC := 104619;
+SET @PATH := @NPC * 10;
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=5071.903,`position_y`=-3665.457,`position_z`=295.4549 WHERE `guid`=@NPC;
+DELETE FROM `creature_addon` WHERE `guid`=@NPC;
+INSERT INTO `creature_addon` (`guid`,`path_id`,`bytes2`,`mount`,`auras`) VALUES (@NPC,@PATH,1,0, '');
+DELETE FROM `waypoint_data` WHERE `id`=@PATH;
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`delay`,`move_flag`,`action`,`action_chance`,`wpguid`) VALUES
+(@PATH,1,5071.903,-3665.457,295.4549,0,0,0,100,0),
+(@PATH,2,5059.392,-3682.827,295.5384,0,0,0,100,0),
+(@PATH,3,5037.78,-3681.667,299.7601,0,0,0,100,0),
+(@PATH,4,5028.569,-3670.129,300.9308,0,0,0,100,0),
+(@PATH,5,5026.874,-3657.909,301.366,0,0,0,100,0),
+(@PATH,6,5035.031,-3642.29,299.8145,0,0,0,100,0),
+(@PATH,7,5053.08,-3636.957,297.5071,0,0,0,100,0),
+(@PATH,8,5067.131,-3644.62,295.7921,0,0,0,100,0);
+
+-- Pathing for Drakuru's Guard Entry: 28803
+SET @NPC := 107821;
+SET @PATH := @NPC * 10;
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=6114.339,`position_y`=-2034.41,`position_z`=417.6801 WHERE `guid`=@NPC;
+DELETE FROM `creature_addon` WHERE `guid`=@NPC;
+INSERT INTO `creature_addon` (`guid`,`path_id`,`bytes2`,`mount`,`auras`) VALUES (@NPC,@PATH,1,0, '');
+DELETE FROM `waypoint_data` WHERE `id`=@PATH;
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`delay`,`move_flag`,`action`,`action_chance`,`wpguid`) VALUES
+(@PATH,1,6114.339,-2034.41,417.6801,0,0,0,100,0),
+(@PATH,2,6129.907,-2060.738,417.5455,0,0,0,100,0),
+(@PATH,3,6144.443,-2073.784,417.6692,0,0,0,100,0),
+(@PATH,4,6171.715,-2080.903,417.5605,0,0,0,100,0),
+(@PATH,5,6185.524,-2080.392,417.5476,0,0,0,100,0),
+(@PATH,6,6171.715,-2080.903,417.5605,0,0,0,100,0),
+(@PATH,7,6144.443,-2073.784,417.6692,0,0,0,100,0),
+(@PATH,8,6129.907,-2060.738,417.5455,0,0,0,100,0);
+
+-- Pathing for Drakuru's Guard Entry: 28803
+SET @NPC := 107817;
+SET @PATH := @NPC * 10;
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=6194.729,`position_y`=-2078.011,`position_z`=417.6379 WHERE `guid`=@NPC;
+DELETE FROM `creature_addon` WHERE `guid`=@NPC;
+INSERT INTO `creature_addon` (`guid`,`path_id`,`bytes2`,`mount`,`auras`) VALUES (@NPC,@PATH,1,0, '');
+DELETE FROM `waypoint_data` WHERE `id`=@PATH;
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`delay`,`move_flag`,`action`,`action_chance`,`wpguid`) VALUES
+(@PATH,1,6194.729,-2078.011,417.6379,0,0,0,100,0),
+(@PATH,2,6217.196,-2064.708,417.5335,0,0,0,100,0),
+(@PATH,3,6232.834,-2048.468,417.6579,0,0,0,100,0),
+(@PATH,4,6240.251,-2020.826,417.5575,0,0,0,100,0),
+(@PATH,5,6238.296,-2002.501,417.7368,0,0,0,100,0),
+(@PATH,6,6240.251,-2020.826,417.5575,0,0,0,100,0),
+(@PATH,7,6232.834,-2048.468,417.6579,0,0,0,100,0),
+(@PATH,8,6217.196,-2064.708,417.5335,0,0,0,100,0);
+
+-- Pathing for Drakuru's Guard Entry: 28803
+SET @NPC := 107836;
+SET @PATH := @NPC * 10;
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=6236.967,`position_y`=-1995.491,`position_z`=417.6333 WHERE `guid`=@NPC;
+DELETE FROM `creature_addon` WHERE `guid`=@NPC;
+INSERT INTO `creature_addon` (`guid`,`path_id`,`bytes2`,`mount`,`auras`) VALUES (@NPC,@PATH,1,0, '');
+DELETE FROM `waypoint_data` WHERE `id`=@PATH;
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`delay`,`move_flag`,`action`,`action_chance`,`wpguid`) VALUES
+(@PATH,1,6236.967,-1995.491,417.6333,0,0,0,100,0),
+(@PATH,2,6228.093,-1980.412,417.5516,0,0,0,100,0),
+(@PATH,3,6215.869,-1967.486,417.5413,0,0,0,100,0),
+(@PATH,4,6196.992,-1955.543,417.5889,0,0,0,100,0),
+(@PATH,5,6174.948,-1953.596,417.5572,0,0,0,100,0),
+(@PATH,6,6164.511,-1955.177,417.5472,0,0,0,100,0),
+(@PATH,7,6174.948,-1953.596,417.5572,0,0,0,100,0),
+(@PATH,8,6196.992,-1955.543,417.5889,0,0,0,100,0),
+(@PATH,9,6215.869,-1967.486,417.5413,0,0,0,100,0),
+(@PATH,10,6228.093,-1980.412,417.5516,0,0,0,100,0);
+
+-- Pathing for Drakuru's Guard Entry: 28803
+SET @NPC := 107821;
+SET @PATH := @NPC * 10;
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=6119.209,`position_y`=-1985.834,`position_z`=417.6736 WHERE `guid`=@NPC;
+DELETE FROM `creature_addon` WHERE `guid`=@NPC;
+INSERT INTO `creature_addon` (`guid`,`path_id`,`bytes2`,`mount`,`auras`) VALUES (@NPC,@PATH,1,0, '');
+DELETE FROM `waypoint_data` WHERE `id`=@PATH;
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`delay`,`move_flag`,`action`,`action_chance`,`wpguid`) VALUES
+(@PATH,1,6119.209,-1985.834,417.6736,0,0,0,100,0),
+(@PATH,2,6109.752,-2008.77,417.5636,0,0,0,100,0),
+(@PATH,3,6113.512,-2033.001,417.7308,0,0,0,100,0),
+(@PATH,4,6109.752,-2008.77,417.5636,0,0,0,100,0);
+
+-- Pathing for Drakuru's Guard Entry: 28803
+SET @NPC := 107837;
+SET @PATH := @NPC * 10;
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=6194.729,`position_y`=-2078.011,`position_z`=417.6379 WHERE `guid`=@NPC;
+DELETE FROM `creature_addon` WHERE `guid`=@NPC;
+INSERT INTO `creature_addon` (`guid`,`path_id`,`bytes2`,`mount`,`auras`) VALUES (@NPC,@PATH,1,0, '');
+DELETE FROM `waypoint_data` WHERE `id`=@PATH;
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`delay`,`move_flag`,`action`,`action_chance`,`wpguid`) VALUES
+(@PATH,1,6194.729,-2078.011,417.6379,0,0,0,100,0),
+(@PATH,2,6217.196,-2064.708,417.5335,0,0,0,100,0),
+(@PATH,3,6232.834,-2048.468,417.6579,0,0,0,100,0),
+(@PATH,4,6240.251,-2020.826,417.5575,0,0,0,100,0),
+(@PATH,5,6238.296,-2002.501,417.7368,0,0,0,100,0),
+(@PATH,6,6240.251,-2020.826,417.5575,0,0,0,100,0),
+(@PATH,7,6232.834,-2048.468,417.6579,0,0,0,100,0),
+(@PATH,8,6217.196,-2064.708,417.5335,0,0,0,100,0);
+
+-- Pathing for Shalewing Guard Entry: 28879
+SET @NPC := 115429;
+SET @PATH := @NPC * 10;
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=6184.199,`position_y`=-1985.717,`position_z`=434.6442 WHERE `guid`=@NPC;
+DELETE FROM `creature_addon` WHERE `guid`=@NPC;
+INSERT INTO `creature_addon` (`guid`,`path_id`,`bytes2`,`mount`,`auras`) VALUES (@NPC,@PATH,1,0, '');
+DELETE FROM `waypoint_data` WHERE `id`=@PATH;
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`delay`,`move_flag`,`action`,`action_chance`,`wpguid`) VALUES
+(@PATH,1,6184.199,-1985.717,434.6442,0,0,0,100,0),
+(@PATH,2,6205.602,-1997.712,423.9775,0,0,0,100,0),
+(@PATH,3,6209.002,-2021.652,426.0051,0,0,0,100,0),
+(@PATH,4,6191.328,-2043.418,431.6164,0,0,0,100,0),
+(@PATH,5,6172.321,-2047.748,423.9775,0,0,0,100,0),
+(@PATH,6,6159.705,-2039.765,423.9775,0,0,0,100,0),
+(@PATH,7,6151.034,-2030.29,423.9775,0,0,0,100,0),
+(@PATH,8,6148.249,-2012.318,427.6442,0,0,0,100,0),
+(@PATH,9,6160.55,-1991.355,423.9775,0,0,0,100,0);
diff --git a/sql/updates/world/2013_01_02_08_world_sai.sql b/sql/updates/world/2013_01_02_08_world_sai.sql
new file mode 100644
index 00000000000..a3f0dde4658
--- /dev/null
+++ b/sql/updates/world/2013_01_02_08_world_sai.sql
@@ -0,0 +1,392 @@
+-- SAI for Mummified Atal''ai
+SET @ENTRY := 5263;
+UPDATE `smart_scripts` SET `event_flags`=2 WHERE `entryorguid`=5263 AND `id`=0;
+DELETE FROM `smart_scripts` WHERE `source_type`=0 AND `entryorguid`=@ENTRY 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,0,0,100,0,8000,15000,4000,10000,11,16186,32,0,0,0,0,2,0,0,0,0,0,0,0,'Mummified Atal''ai - In Combat - Cast Fevered Plague');
+
+UPDATE `smart_scripts` SET `event_flags`=1 WHERE `entryorguid` IN (824,5243);
+UPDATE `smart_scripts` SET `event_flags`=0 WHERE `entryorguid` IN (5261);
+
+DELETE FROM `linked_respawn` WHERE `guid` IN (83022,83027,83023,83026);
+
+-- Winterskorn Tribesman SAI
+SET @ENTRY := 23661;
+UPDATE `creature_template` SET `AIName`='SmartAI' WHERE `entry`=@ENTRY;
+DELETE FROM `creature_ai_scripts` WHERE `creature_id`=@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,11,0,100,0,0,0,0,0,22,0,0,0,0,0,0,1,0,0,0,0,0,0,0,"Winterskorn Tribesman - On Respawn - Set Phase 0"),
+(@ENTRY,0,1,0,61,0,100,0,0,0,0,0,28,43059,0,0,0,0,0,1,0,0,0,0,0,0,0,"Winterskorn Tribesman - On Respawn - Remove Aura Gruesome, But Necessary: Vrykul On Dismember"),
+(@ENTRY,0,2,0,6,0,100,1,0,0,0,0,22,1,0,0,0,0,0,1,0,0,0,0,0,0,0,"Winterskorn Tribesman - On Death - Set Phase 1"),
+(@ENTRY,0,3,4,8,1,100,0,43036,0,0,0,11,43059,16,0,0,0,0,1,0,0,0,0,0,0,0,"Winterskorn Tribesman - On Spellhit Dismembering Corpse - Cast Gruesome, But Necessary: Vrykul On Dismember"),
+(@ENTRY,0,4,5,61,1,100,0,0,0,0,0,11,43037,16,0,0,0,0,7,0,0,0,0,0,0,0,"Winterskorn Tribesman - On Spellhit Dismembering Corpse - Cast Gruesome, But Necessary: Kill Credit"),
+(@ENTRY,0,5,0,61,1,100,0,0,0,0,0,22,2,0,0,0,0,0,1,0,0,0,0,0,0,0,"Winterskorn Tribesman - On Spellhit Dismembering Corpse - Set Phase 2");
+
+-- Winterskorn Woodsman SAI
+SET @ENTRY := 23662;
+UPDATE `creature_template` SET `AIName`='SmartAI' WHERE `entry`=@ENTRY;
+DELETE FROM `creature_ai_scripts` WHERE `creature_id`=@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,11,0,100,0,0,0,0,0,22,0,0,0,0,0,0,1,0,0,0,0,0,0,0,"Winterskorn Woodsman - On Respawn - Set Phase 0"),
+(@ENTRY,0,1,0,61,0,100,0,0,0,0,0,28,43059,0,0,0,0,0,1,0,0,0,0,0,0,0,"Winterskorn Woodsman - On Respawn - Remove Aura Gruesome, But Necessary: Vrykul On Dismember"),
+(@ENTRY,0,2,0,6,0,100,1,0,0,0,0,22,1,0,0,0,0,0,1,0,0,0,0,0,0,0,"Winterskorn Woodsman - On Death - Set Phase 1"),
+(@ENTRY,0,3,4,8,1,100,0,43036,0,0,0,11,43059,16,0,0,0,0,1,0,0,0,0,0,0,0,"Winterskorn Woodsman - On Spellhit Dismembering Corpse - Cast Gruesome, But Necessary: Vrykul On Dismember"),
+(@ENTRY,0,4,5,61,1,100,0,0,0,0,0,11,43037,16,0,0,0,0,7,0,0,0,0,0,0,0,"Winterskorn Woodsman - On Spellhit Dismembering Corpse - Cast Gruesome, But Necessary: Kill Credit"),
+(@ENTRY,0,5,0,61,1,100,0,0,0,0,0,22,2,0,0,0,0,0,1,0,0,0,0,0,0,0,"Winterskorn Woodsman - On Spellhit Dismembering Corpse - Set Phase 2");
+
+-- Winterskorn Shield-Maiden SAI
+SET @ENTRY := 23663;
+UPDATE `creature_template` SET `AIName`='SmartAI' WHERE `entry`=@ENTRY;
+DELETE FROM `creature_ai_scripts` WHERE `creature_id`=@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,11,0,100,0,0,0,0,0,22,0,0,0,0,0,0,1,0,0,0,0,0,0,0,"Winterskorn Shield-Maiden - On Respawn - Set Phase 0"),
+(@ENTRY,0,1,0,61,0,100,0,0,0,0,0,28,43059,0,0,0,0,0,1,0,0,0,0,0,0,0,"Winterskorn Shield-Maiden - On Respawn - Remove Aura Gruesome, But Necessary: Vrykul On Dismember"),
+(@ENTRY,0,2,0,6,0,100,1,0,0,0,0,22,1,0,0,0,0,0,1,0,0,0,0,0,0,0,"Winterskorn Shield-Maiden - On Death - Set Phase 1"),
+(@ENTRY,0,3,4,8,1,100,0,43036,0,0,0,11,43059,16,0,0,0,0,1,0,0,0,0,0,0,0,"Winterskorn Shield-Maiden - On Spellhit Dismembering Corpse - Cast Gruesome, But Necessary: Vrykul On Dismember"),
+(@ENTRY,0,4,5,61,1,100,0,0,0,0,0,11,43037,16,0,0,0,0,7,0,0,0,0,0,0,0,"Winterskorn Shield-Maiden - On Spellhit Dismembering Corpse - Cast Gruesome, But Necessary: Kill Credit"),
+(@ENTRY,0,5,0,61,1,100,0,0,0,0,0,22,2,0,0,0,0,0,1,0,0,0,0,0,0,0,"Winterskorn Shield-Maiden - On Spellhit Dismembering Corpse - Set Phase 2");
+
+-- Winterskorn Warrior SAI
+SET @ENTRY := 23664;
+UPDATE `creature_template` SET `AIName`='SmartAI' WHERE `entry`=@ENTRY;
+DELETE FROM `creature_ai_scripts` WHERE `creature_id`=@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,11,0,100,0,0,0,0,0,22,0,0,0,0,0,0,1,0,0,0,0,0,0,0,"Winterskorn Warrior - On Respawn - Set Phase 0"),
+(@ENTRY,0,1,0,61,0,100,0,0,0,0,0,28,43059,0,0,0,0,0,1,0,0,0,0,0,0,0,"Winterskorn Warrior - On Respawn - Remove Aura Gruesome, But Necessary: Vrykul On Dismember"),
+(@ENTRY,0,2,0,6,0,100,1,0,0,0,0,22,1,0,0,0,0,0,1,0,0,0,0,0,0,0,"Winterskorn Warrior - On Death - Set Phase 1"),
+(@ENTRY,0,3,4,8,1,100,0,43036,0,0,0,11,43059,16,0,0,0,0,1,0,0,0,0,0,0,0,"Winterskorn Warrior - On Spellhit Dismembering Corpse - Cast Gruesome, But Necessary: Vrykul On Dismember"),
+(@ENTRY,0,4,5,61,1,100,0,0,0,0,0,11,43037,16,0,0,0,0,7,0,0,0,0,0,0,0,"Winterskorn Warrior - On Spellhit Dismembering Corpse - Cast Gruesome, But Necessary: Kill Credit"),
+(@ENTRY,0,5,0,61,1,100,0,0,0,0,0,22,2,0,0,0,0,0,1,0,0,0,0,0,0,0,"Winterskorn Warrior - On Spellhit Dismembering Corpse - Set Phase 2");
+
+-- Winterskorn Raider SAI
+SET @ENTRY := 23665;
+UPDATE `creature_template` SET `AIName`='SmartAI' WHERE `entry`=@ENTRY;
+DELETE FROM `creature_ai_scripts` WHERE `creature_id`=@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,11,0,100,0,0,0,0,0,22,0,0,0,0,0,0,1,0,0,0,0,0,0,0,"Winterskorn Raider - On Respawn - Set Phase 0"),
+(@ENTRY,0,1,0,61,0,100,0,0,0,0,0,28,43059,0,0,0,0,0,1,0,0,0,0,0,0,0,"Winterskorn Raider - On Respawn - Remove Aura Gruesome, But Necessary: Vrykul On Dismember"),
+(@ENTRY,0,2,0,6,0,100,1,0,0,0,0,22,1,0,0,0,0,0,1,0,0,0,0,0,0,0,"Winterskorn Raider - On Death - Set Phase 1"),
+(@ENTRY,0,3,4,8,1,100,0,43036,0,0,0,11,43059,16,0,0,0,0,1,0,0,0,0,0,0,0,"Winterskorn Raider - On Spellhit Dismembering Corpse - Cast Gruesome, But Necessary: Vrykul On Dismember"),
+(@ENTRY,0,4,5,61,1,100,0,0,0,0,0,11,43037,16,0,0,0,0,7,0,0,0,0,0,0,0,"Winterskorn Raider - On Spellhit Dismembering Corpse - Cast Gruesome, But Necessary: Kill Credit"),
+(@ENTRY,0,5,0,61,1,100,0,0,0,0,0,22,2,0,0,0,0,0,1,0,0,0,0,0,0,0,"Winterskorn Raider - On Spellhit Dismembering Corpse - Set Phase 2");
+
+-- Winterskorn Berserker SAI
+SET @ENTRY := 23666;
+UPDATE `creature_template` SET `AIName`='SmartAI' WHERE `entry`=@ENTRY;
+DELETE FROM `creature_ai_scripts` WHERE `creature_id`=@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,11,0,100,0,0,0,0,0,22,0,0,0,0,0,0,1,0,0,0,0,0,0,0,"Winterskorn Berserker - On Respawn - Set Phase 0"),
+(@ENTRY,0,1,0,61,0,100,0,0,0,0,0,28,43059,0,0,0,0,0,1,0,0,0,0,0,0,0,"Winterskorn Berserker - On Respawn - Remove Aura Gruesome, But Necessary: Vrykul On Dismember"),
+(@ENTRY,0,2,0,6,0,100,1,0,0,0,0,22,1,0,0,0,0,0,1,0,0,0,0,0,0,0,"Winterskorn Berserker - On Death - Set Phase 1"),
+(@ENTRY,0,3,4,8,1,100,0,43036,0,0,0,11,43059,16,0,0,0,0,1,0,0,0,0,0,0,0,"Winterskorn Berserker - On Spellhit Dismembering Corpse - Cast Gruesome, But Necessary: Vrykul On Dismember"),
+(@ENTRY,0,4,5,61,1,100,0,0,0,0,0,11,43037,16,0,0,0,0,7,0,0,0,0,0,0,0,"Winterskorn Berserker - On Spellhit Dismembering Corpse - Cast Gruesome, But Necessary: Kill Credit"),
+(@ENTRY,0,5,0,61,1,100,0,0,0,0,0,22,2,0,0,0,0,0,1,0,0,0,0,0,0,0,"Winterskorn Berserker - On Spellhit Dismembering Corpse - Set Phase 2");
+
+-- Winterskorn Rune-Seer SAI
+SET @ENTRY := 23667;
+UPDATE `creature_template` SET `AIName`='SmartAI' WHERE `entry`=@ENTRY;
+DELETE FROM `creature_ai_scripts` WHERE `creature_id`=@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,11,0,100,0,0,0,0,0,22,0,0,0,0,0,0,1,0,0,0,0,0,0,0,"Winterskorn Rune-Seer - On Respawn - Set Phase 0"),
+(@ENTRY,0,1,0,61,0,100,0,0,0,0,0,28,43059,0,0,0,0,0,1,0,0,0,0,0,0,0,"Winterskorn Rune-Seer - On Respawn - Remove Aura Gruesome, But Necessary: Vrykul On Dismember"),
+(@ENTRY,0,2,0,6,0,100,1,0,0,0,0,22,1,0,0,0,0,0,1,0,0,0,0,0,0,0,"Winterskorn Rune-Seer - On Death - Set Phase 1"),
+(@ENTRY,0,3,4,8,1,100,0,43036,0,0,0,11,43059,16,0,0,0,0,1,0,0,0,0,0,0,0,"Winterskorn Rune-Seer - On Spellhit Dismembering Corpse - Cast Gruesome, But Necessary: Vrykul On Dismember"),
+(@ENTRY,0,4,5,61,1,100,0,0,0,0,0,11,43037,16,0,0,0,0,7,0,0,0,0,0,0,0,"Winterskorn Rune-Seer - On Spellhit Dismembering Corpse - Cast Gruesome, But Necessary: Kill Credit"),
+(@ENTRY,0,5,0,61,1,100,0,0,0,0,0,22,2,0,0,0,0,0,1,0,0,0,0,0,0,0,"Winterskorn Rune-Seer - On Spellhit Dismembering Corpse - Set Phase 2");
+
+-- Winterskorn Rune-Caster SAI
+SET @ENTRY := 23668;
+UPDATE `creature_template` SET `AIName`='SmartAI' WHERE `entry`=@ENTRY;
+DELETE FROM `creature_ai_scripts` WHERE `creature_id`=@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,11,0,100,0,0,0,0,0,22,0,0,0,0,0,0,1,0,0,0,0,0,0,0,"Winterskorn Rune-Caster - On Respawn - Set Phase 0"),
+(@ENTRY,0,1,0,61,0,100,0,0,0,0,0,28,43059,0,0,0,0,0,1,0,0,0,0,0,0,0,"Winterskorn Rune-Caster - On Respawn - Remove Aura Gruesome, But Necessary: Vrykul On Dismember"),
+(@ENTRY,0,2,0,6,0,100,1,0,0,0,0,22,1,0,0,0,0,0,1,0,0,0,0,0,0,0,"Winterskorn Rune-Caster - On Death - Set Phase 1"),
+(@ENTRY,0,3,4,8,1,100,0,43036,0,0,0,11,43059,16,0,0,0,0,1,0,0,0,0,0,0,0,"Winterskorn Rune-Caster - On Spellhit Dismembering Corpse - Cast Gruesome, But Necessary: Vrykul On Dismember"),
+(@ENTRY,0,4,5,61,1,100,0,0,0,0,0,11,43037,16,0,0,0,0,7,0,0,0,0,0,0,0,"Winterskorn Rune-Caster - On Spellhit Dismembering Corpse - Cast Gruesome, But Necessary: Kill Credit"),
+(@ENTRY,0,5,0,61,1,100,0,0,0,0,0,22,2,0,0,0,0,0,1,0,0,0,0,0,0,0,"Winterskorn Rune-Caster - On Spellhit Dismembering Corpse - Set Phase 2");
+
+-- Winterskorn Oracle SAI
+SET @ENTRY := 23669;
+UPDATE `creature_template` SET `AIName`='SmartAI' WHERE `entry`=@ENTRY;
+DELETE FROM `creature_ai_scripts` WHERE `creature_id`=@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,11,0,100,0,0,0,0,0,22,0,0,0,0,0,0,1,0,0,0,0,0,0,0,"Winterskorn Oracle - On Respawn - Set Phase 0"),
+(@ENTRY,0,1,0,61,0,100,0,0,0,0,0,28,43059,0,0,0,0,0,1,0,0,0,0,0,0,0,"Winterskorn Oracle - On Respawn - Remove Aura Gruesome, But Necessary: Vrykul On Dismember"),
+(@ENTRY,0,2,0,6,0,100,1,0,0,0,0,22,1,0,0,0,0,0,1,0,0,0,0,0,0,0,"Winterskorn Oracle - On Death - Set Phase 1"),
+(@ENTRY,0,3,4,8,1,100,0,43036,0,0,0,11,43059,16,0,0,0,0,1,0,0,0,0,0,0,0,"Winterskorn Oracle - On Spellhit Dismembering Corpse - Cast Gruesome, But Necessary: Vrykul On Dismember"),
+(@ENTRY,0,4,5,61,1,100,0,0,0,0,0,11,43037,16,0,0,0,0,7,0,0,0,0,0,0,0,"Winterskorn Oracle - On Spellhit Dismembering Corpse - Cast Gruesome, But Necessary: Kill Credit"),
+(@ENTRY,0,5,0,61,1,100,0,0,0,0,0,22,2,0,0,0,0,0,1,0,0,0,0,0,0,0,"Winterskorn Oracle - On Spellhit Dismembering Corpse - Set Phase 2");
+
+-- Illidari Heartseeker SAI
+SET @ENTRY := 23339;
+UPDATE `creature_template` SET `AIName`='SmartAI' WHERE `entry`=@ENTRY;
+DELETE FROM `creature_ai_scripts` WHERE `creature_id`=@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,3,0,0,0,0,21,0,0,0,0,0,0,1,0,0,0,0,0,0,0,"Illidari Heartseeker - Out Of Combat - Allow Combat Movement"),
+(@ENTRY,0,1,0,61,0,100,0,0,0,0,0,20,0,0,0,0,0,0,1,0,0,0,0,0,0,0,"Illidari Heartseeker - Out Of Combat - Start Auto Attack"),
+(@ENTRY,0,2,3,4,0,100,3,0,0,0,0,11,41169,0,0,0,0,0,2,0,0,0,0,0,0,0,"Illidari Heartseeker - On Aggro - Cast Shoot"),
+(@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,"Illidari Heartseeker - On Aggro - Increment Phase"),
+(@ENTRY,0,4,5,9,1,100,2,5,30,3900,5900,11,41169,0,0,0,0,0,2,0,0,0,0,0,0,0,"Illidari Heartseeker - At 5 - 30 Range - Cast Shoot"),
+(@ENTRY,0,5,0,61,1,100,0,0,0,0,0,40,2,0,0,0,0,0,1,0,0,0,0,0,0,0,"Illidari Heartseeker - At 5 - 30 Range - Display ranged weapon"),
+(@ENTRY,0,6,7,9,1,100,3,25,80,0,0,21,1,0,0,0,0,0,1,0,0,0,0,0,0,0,"Illidari Heartseeker - At 25 - 80 Range - Allow Combat Movement"),
+(@ENTRY,0,7,0,61,1,100,0,0,0,0,0,20,1,0,0,0,0,0,1,0,0,0,0,0,0,0,"Illidari Heartseeker - At 25 - 80 Range - Start Auto Attack"),
+(@ENTRY,0,8,9,9,1,100,3,0,5,0,0,21,1,0,0,0,0,0,1,0,0,0,0,0,0,0,"Illidari Heartseeker - At 0 - 5 Range - Allow Combat Movement"),
+(@ENTRY,0,9,10,9,1,100,3,0,0,0,0,40,1,0,0,0,0,0,1,0,0,0,0,0,0,0,"Illidari Heartseeker - At 0 - 5 Range - Display melee weapon"),
+(@ENTRY,0,10,0,61,1,100,0,0,0,0,0,20,1,0,0,0,0,0,1,0,0,0,0,0,0,0,"Illidari Heartseeker - At 0 - 5 Range - Start Auto Attack"),
+(@ENTRY,0,11,12,9,1,100,3,5,15,0,0,21,0,0,0,0,0,0,1,0,0,0,0,0,0,0,"Illidari Heartseeker - At 5 - 15 Range - Allow Combat Movement"),
+(@ENTRY,0,12,0,61,1,100,0,0,0,0,0,20,0,0,0,0,0,0,1,0,0,0,0,0,0,0,"Illidari Heartseeker - At 5 - 15 Range - Start Auto Attack"),
+(@ENTRY,0,13,0,0,0,100,2,7000,11000,19000,25000,11,41173,1,0,0,0,0,1,0,0,0,0,0,0,0,"Illidari Heartseeker - In Combat - Cast Rapid Shot"),
+(@ENTRY,0,14,0,0,0,100,2,45000,60000,60000,75000,11,41171,1,0,0,0,0,2,0,0,0,0,0,0,0,"Illidari Heartseeker - In Combat - Cast Skeleton Shot"),
+(@ENTRY,0,15,0,2,0,100,3,0,50,0,0,11,41170,1,0,0,0,0,2,0,0,0,0,0,0,0,"Illidari Heartseeker - At 50% HP - Cast Curse of the Bleakheart"),
+(@ENTRY,0,16,0,7,0,100,0,0,0,0,0,40,1,0,0,0,0,0,1,0,0,0,0,0,0,0,"Illidari Heartseeker - On Evade - Display melee weapon");
+
+-- Ashtongue Stormcaller SAI
+SET @ENTRY := 22846;
+UPDATE `creature_template` SET `AIName`='SmartAI' WHERE `entry`=@ENTRY;
+DELETE FROM `creature_ai_scripts` WHERE `creature_id`=@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,21,0,0,0,0,0,0,1,0,0,0,0,0,0,0,"Ashtongue Stormcaller - Out Of Combat - Allow Combat Movement"),
+(@ENTRY,0,1,0,1,0,100,3,1000,1000,0,0,11,39534,1,0,0,0,0,1,0,0,0,0,0,0,0,"Ashtongue Stormcaller - Out Of Combat - Cast Summon Storm Fury"),
+(@ENTRY,0,2,3,4,0,100,3,0,0,0,0,11,41151,1,0,0,0,0,1,0,0,0,0,0,0,0,"Ashtongue Stormcaller - On Aggro - Cast Lightning Shield"),
+(@ENTRY,0,3,4,61,0,100,0,0,0,0,0,11,20793,0,0,0,0,0,2,0,0,0,0,0,0,0,"Ashtongue Stormcaller - On Aggro - Cast Fireball"),
+(@ENTRY,0,4,0,61,0,100,0,0,0,0,0,23,1,0,0,0,0,0,1,0,0,0,0,0,0,0,"Ashtongue Stormcaller - On Aggro - Increment Phase"),
+(@ENTRY,0,5,0,9,1,100,2,0,40,3800,5200,11,41184,0,0,0,0,0,2,0,0,0,0,0,0,0,"Ashtongue Stormcaller - At 0 - 40 Range - Cast Lightning Bolt"),
+(@ENTRY,0,6,7,3,1,100,3,0,15,0,0,21,1,0,0,0,0,0,1,0,0,0,0,0,0,0,"Ashtongue Stormcaller - At 15% Mana - Allow Combat Movement"),
+(@ENTRY,0,7,0,61,1,100,0,0,0,0,0,23,1,0,0,0,0,0,1,0,0,0,0,0,0,0,"Ashtongue Stormcaller - At 15% Mana - Increment Phase"),
+(@ENTRY,0,8,0,9,1,100,3,35,80,0,0,21,1,0,0,0,0,0,1,0,0,0,0,0,0,0,"Ashtongue Stormcaller - At 35 - 80 Range - Allow Combat Movement"),
+(@ENTRY,0,9,0,9,1,100,3,5,15,0,0,21,0,0,0,0,0,0,1,0,0,0,0,0,0,0,"Ashtongue Stormcaller - At 5 - 15 Range - Allow Combat Movement"),
+(@ENTRY,0,10,0,9,1,100,3,0,5,0,0,21,1,0,0,0,0,0,1,0,0,0,0,0,0,0,"Ashtongue Stormcaller - At 0 - 5 Range - Allow Combat Movement"),
+(@ENTRY,0,11,0,3,2,100,2,30,100,100,100,23,0,1,0,0,0,0,1,0,0,0,0,0,0,0,"Ashtongue Stormcaller - At Mana +30% - Decrement Phase"),
+(@ENTRY,0,12,0,0,0,100,2,12000,18000,22000,28000,11,41183,1,0,0,0,0,5,0,0,0,0,0,0,0,"Ashtongue Stormcaller - In Combat - Cast Chain Lightning");
+
+-- Sandfury Acolyte SAI
+SET @ENTRY := 8876;
+UPDATE `creature_template` SET `AIName`='SmartAI' WHERE `entry`=@ENTRY;
+DELETE FROM `creature_ai_scripts` WHERE `creature_id`=@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,3,0,0,0,0,79,15,0,0,0,0,0,1,0,0,0,0,0,0,0,"Sandfury Acolyte - On Respawn - Set Ranged Movement"),
+(@ENTRY,0,1,2,4,0,100,3,0,0,0,0,11,9613,0,0,0,0,0,2,0,0,0,0,0,0,0,"Sandfury Acolyte - On Aggro - Cast Shadow Bolt"),
+(@ENTRY,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,"Sandfury Acolyte - On Aggro - Increment Phase"),
+(@ENTRY,0,3,0,9,1,100,2,0,40,2400,3800,11,9613,0,0,0,0,0,2,0,0,0,0,0,0,0,"Sandfury Acolyte - At 0 - 40 Range - Cast Shadow Bolt"),
+(@ENTRY,0,4,5,3,1,100,2,0,15,0,0,21,1,0,0,0,0,0,1,0,0,0,0,0,0,0,"Sandfury Acolyte - At 15% Mana - Allow Combat Movement"),
+(@ENTRY,0,5,0,61,1,100,0,0,0,0,0,23,1,0,0,0,0,0,1,0,0,0,0,0,0,0,"Sandfury Acolyte - At 15% Mana - Increment Phase"),
+(@ENTRY,0,6,0,9,1,100,3,35,80,0,0,21,1,0,0,0,0,0,1,0,0,0,0,0,0,0,"Sandfury Acolyte - At 35 - 80 Range - Allow Combat Movement"),
+(@ENTRY,0,7,0,9,1,100,3,5,15,0,0,79,15,0,0,0,0,0,1,0,0,0,0,0,0,0,"Sandfury Acolyte - At 5 - 15 Range - Set Ranged Movement"),
+(@ENTRY,0,8,0,9,1,100,3,0,5,0,0,21,1,0,0,0,0,0,1,0,0,0,0,0,0,0,"Sandfury Acolyte - At 0 - 5 Range - Allow Combat Movement"),
+(@ENTRY,0,9,0,3,2,100,2,30,100,100,100,23,0,1,0,0,0,0,1,0,0,0,0,0,0,0,"Sandfury Acolyte - At 30% Mana - Decrement Phase"),
+(@ENTRY,0,10,0,0,0,100,2,8000,10000,25000,31000,11,11639,1,0,0,0,0,2,0,0,0,0,0,0,0,"Sandfury Acolyte - In Combat - Cast Shadow Word: Pain"),
+(@ENTRY,0,11,0,0,0,100,2,4000,6000,120000,135000,11,11980,1,0,0,0,0,2,0,0,0,0,0,0,0,"Sandfury Acolyte - In Combat - Cast Curse of Weakness"),
+(@ENTRY,0,12,0,0,0,100,2,5000,6000,15000,22000,11,11981,1,0,0,0,0,5,0,0,0,0,0,0,0,"Sandfury Acolyte - In Combat - Cast Mana Burn");
+
+-- Oro Eyegouge SAI
+SET @ENTRY := 7606;
+UPDATE `creature_template` SET `AIName`='SmartAI' WHERE `entry`=@ENTRY;
+DELETE FROM `creature_ai_scripts` WHERE `creature_id`=@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,3,0,0,0,0,79,15,0,0,0,0,0,1,0,0,0,0,0,0,0,"Oro Eyegouge - On Respawn - Set Ranged Movement"),
+(@ENTRY,0,1,2,4,0,100,3,0,0,0,0,11,12741,0,0,0,0,0,1,0,0,0,0,0,0,0,"Oro Eyegouge - On Aggro - Cast Curse of Weakness"),
+(@ENTRY,0,2,3,61,0,100,0,0,0,0,0,11,9613,0,0,0,0,0,2,0,0,0,0,0,0,0,"Oro Eyegouge - On Aggro - Cast Shadow Bolt"),
+(@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,"Oro Eyegouge - On Aggro - Increment Phase"),
+(@ENTRY,0,4,0,9,1,100,2,0,40,2400,3800,11,9613,0,0,0,0,0,2,0,0,0,0,0,0,0,"Oro Eyegouge - At 0 - 40 Range - Cast Shadow Bolt"),
+(@ENTRY,0,5,6,3,1,100,2,0,15,0,0,21,1,0,0,0,0,0,1,0,0,0,0,0,0,0,"Oro Eyegouge - At 15% Mana - Allow Combat Movement"),
+(@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,"Oro Eyegouge - At 15% Mana - Increment Phase"),
+(@ENTRY,0,7,0,9,1,100,3,35,80,0,0,21,1,0,0,0,0,0,1,0,0,0,0,0,0,0,"Oro Eyegouge - At 35 - 80 Range - Allow Combat Movement"),
+(@ENTRY,0,8,0,9,1,100,3,5,15,0,0,79,15,0,0,0,0,0,1,0,0,0,0,0,0,0,"Oro Eyegouge - At 5 - 15 Range - Set Ranged Movement"),
+(@ENTRY,0,9,0,9,1,100,3,0,5,0,0,21,1,0,0,0,0,0,1,0,0,0,0,0,0,0,"Oro Eyegouge - At 0 - 5 Range - Allow Combat Movement"),
+(@ENTRY,0,10,0,3,2,100,2,30,100,100,100,23,0,1,0,0,0,0,1,0,0,0,0,0,0,0,"Oro Eyegouge - At 30% Mana - Decrement Phase"),
+(@ENTRY,0,11,0,0,0,80,2,5000,7000,23000,27000,11,11962,0,0,0,0,0,2,0,0,0,0,0,0,0,"Oro Eyegouge - In Combat - Cast Immolate"),
+(@ENTRY,0,12,0,0,0,80,2,8000,10000,15000,18250,11,11990,0,0,0,0,0,2,0,0,0,0,0,0,0,"Oro Eyegouge - In Combat - Cast Rain of Fire");
+
+-- Sandfury Shadowhunter SAI
+SET @ENTRY := 7246;
+UPDATE `creature_template` SET `AIName`='SmartAI' WHERE `entry`=@ENTRY;
+DELETE FROM `creature_ai_scripts` WHERE `creature_id`=@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,2,0,0,0,0,21,0,0,0,0,0,0,1,0,0,0,0,0,0,0,"Sandfury Shadowhunter - Out Of Combat - Allow Combat Movement"),
+(@ENTRY,0,1,0,61,0,100,0,0,0,0,0,20,0,0,0,0,0,0,1,0,0,0,0,0,0,0,"Sandfury Shadowhunter - Out Of Combat - Start Auto Attack"),
+(@ENTRY,0,2,3,4,0,100,2,0,0,0,0,11,15547,0,0,0,0,0,2,0,0,0,0,0,0,0,"Sandfury Shadowhunter - On Aggro - Cast Shoot"),
+(@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,"Sandfury Shadowhunter - On Aggro - Increment Phase"),
+(@ENTRY,0,4,5,9,1,100,2,5,30,2300,3900,11,15547,0,0,0,0,0,2,0,0,0,0,0,0,0,"Sandfury Shadowhunter - At 5 - 30 Range - Cast Shoot"),
+(@ENTRY,0,5,0,61,1,100,0,0,0,0,0,40,2,0,0,0,0,0,1,0,0,0,0,0,0,0,"Sandfury Shadowhunter - At 5 - 30 Range - Display ranged weapon"),
+(@ENTRY,0,6,7,9,1,100,2,25,80,0,0,21,1,0,0,0,0,0,1,0,0,0,0,0,0,0,"Sandfury Shadowhunter - At 25 - 80 Range - Allow Combat Movement"),
+(@ENTRY,0,7,0,61,1,100,0,0,0,0,0,20,1,0,0,0,0,0,1,0,0,0,0,0,0,0,"Sandfury Shadowhunter - At 25 - 80 Range - Start Auto Attack"),
+(@ENTRY,0,8,9,9,1,100,2,0,5,0,0,21,1,0,0,0,0,0,1,0,0,0,0,0,0,0,"Sandfury Shadowhunter - At 0 - 5 Range - Allow Combat Movement"),
+(@ENTRY,0,9,10,61,1,100,0,0,0,0,0,40,1,0,0,0,0,0,1,0,0,0,0,0,0,0,"Sandfury Shadowhunter - At 0 - 5 Range - Display melee weapon"),
+(@ENTRY,0,10,0,61,1,100,0,0,0,0,0,20,1,0,0,0,0,0,1,0,0,0,0,0,0,0,"Sandfury Shadowhunter - At 0 - 5 Range - Start Auto Attack"),
+(@ENTRY,0,11,12,9,1,100,2,5,15,0,0,21,0,0,0,0,0,0,1,0,0,0,0,0,0,0,"Sandfury Shadowhunter - At 5 - 15 Range - Allow Combat Movement"),
+(@ENTRY,0,12,0,61,1,100,0,0,0,0,0,20,0,0,0,0,0,0,1,0,0,0,0,0,0,0,"Sandfury Shadowhunter - At 5 - 15 Range - Start Auto Attack"),
+(@ENTRY,0,13,0,0,0,100,2,7000,12000,18000,25000,11,11641,1,0,0,0,0,6,0,0,0,0,0,0,0,"Sandfury Shadowhunter - In Combat - Cast Hex"),
+(@ENTRY,0,14,0,2,0,100,3,0,15,0,0,23,1,0,0,0,0,0,1,0,0,0,0,0,0,0,"Sandfury Shadowhunter - At 15% HP - Increment Phase"),
+(@ENTRY,0,15,16,2,2,100,2,0,15,0,0,21,1,0,0,0,0,0,1,0,0,0,0,0,0,0,"Sandfury Shadowhunter - At 15% HP - Allow Combat Movement"),
+(@ENTRY,0,16,0,61,2,100,0,0,0,0,0,25,1,0,0,0,0,0,0,0,0,0,0,0,0,0,"Sandfury Shadowhunter - At 15% HP - Flee For Assist"),
+(@ENTRY,0,17,0,7,0,100,2,0,0,0,0,40,1,0,0,0,0,0,1,0,0,0,0,0,0,0,"Sandfury Shadowhunter - On Evade - Display melee weapon");
+
+-- Sandfury Shadowcaster SAI
+SET @ENTRY := 5648;
+UPDATE `creature_template` SET `AIName`='SmartAI' WHERE `entry`=@ENTRY;
+DELETE FROM `creature_ai_scripts` WHERE `creature_id`=@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,21,0,0,0,0,0,0,1,0,0,0,0,0,0,0,"Sandfury Shadowcaster - Out Of Combat - Allow Combat Movement"),
+(@ENTRY,0,1,0,1,0,100,2,1000,1000,1800000,1800000,11,20798,1,0,0,0,0,1,0,0,0,0,0,0,0,"Sandfury Shadowcaster - Out Of Combat - Cast Demon Skin"),
+(@ENTRY,0,2,3,4,0,100,2,0,0,0,0,11,12471,0,0,0,0,0,2,0,0,0,0,0,0,0,"Sandfury Shadowcaster - On Aggro - Cast Shadow Bolt"),
+(@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,"Sandfury Shadowcaster - On Aggro - Increment Phase"),
+(@ENTRY,0,4,0,9,1,100,2,0,40,2400,3800,11,12471,0,0,0,0,0,2,0,0,0,0,0,0,0,"Sandfury Shadowcaster - At 0 - 40 Range - Cast Shadow Bolt"),
+(@ENTRY,0,5,6,3,1,100,2,0,15,0,0,21,1,0,0,0,0,0,1,0,0,0,0,0,0,0,"Sandfury Shadowcaster - At 15% Mana - Allow Combat Movement"),
+(@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,"Sandfury Shadowcaster - At 15% Mana - Increment Phase"),
+(@ENTRY,0,7,0,9,1,100,3,35,80,0,0,21,1,0,0,0,0,0,1,0,0,0,0,0,0,0,"Sandfury Shadowcaster - At 35 - 80 Range - Allow Combat Movement"),
+(@ENTRY,0,8,0,9,1,100,3,5,15,0,0,21,0,0,0,0,0,0,1,0,0,0,0,0,0,0,"Sandfury Shadowcaster - At 5 - 15 Range - Allow Combat Movement"),
+(@ENTRY,0,9,0,9,1,100,3,0,5,0,0,21,1,0,0,0,0,0,1,0,0,0,0,0,0,0,"Sandfury Shadowcaster - At 0 - 5 Range - Allow Combat Movement"),
+(@ENTRY,0,10,0,3,4,100,2,30,100,100,100,23,0,1,0,0,0,0,1,0,0,0,0,0,0,0,"Sandfury Shadowcaster - At 30% Mana - Decrement Phase"),
+(@ENTRY,0,11,0,0,0,100,2,6000,9000,23000,28000,11,14032,1,0,0,0,0,5,0,0,0,0,0,0,0,"Sandfury Shadowcaster - In Combat - Cast Shadow Word: Pain"),
+(@ENTRY,0,12,0,2,2,100,3,0,15,0,0,22,3,0,0,0,0,0,1,0,0,0,0,0,0,0,"Sandfury Shadowcaster - At 15% HP - Set Phase 3"),
+(@ENTRY,0,13,14,2,2,100,2,0,15,0,0,21,1,0,0,0,0,0,1,0,0,0,0,0,0,0,"Sandfury Shadowcaster - At 15% HP - Allow Combat Movement"),
+(@ENTRY,0,14,0,61,0,100,0,0,0,0,0,25,1,0,0,0,0,0,0,0,0,0,0,0,0,0,"Sandfury Shadowcaster - At 15% HP - Flee For Assist");
+
+-- Druid of the Fang SAI
+SET @ENTRY := 3840;
+UPDATE `creature_template` SET `AIName`='SmartAI' WHERE `entry`=@ENTRY;
+DELETE FROM `creature_ai_scripts` WHERE `creature_id`=@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,21,0,0,0,0,0,0,1,0,0,0,0,0,0,0,"Druid of the Fang - Out Of Combat - Allow Combat Movement"),
+(@ENTRY,0,1,2,4,0,100,2,0,0,0,0,11,9532,0,0,0,0,0,2,0,0,0,0,0,0,0,"Druid of the Fang - On Aggro - Cast Lightning Bolt"),
+(@ENTRY,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,"Druid of the Fang - On Aggro - Increment Phase"),
+(@ENTRY,0,3,0,9,1,100,2,0,40,2400,3800,11,9532,0,0,0,0,0,2,0,0,0,0,0,0,0,"Druid of the Fang - At 0 - 40 Range - Cast Lightning Bolt"),
+(@ENTRY,0,4,5,3,1,100,2,0,15,0,0,21,1,0,0,0,0,0,1,0,0,0,0,0,0,0,"Druid of the Fang - At 15% Mana - Allow Combat Movement"),
+(@ENTRY,0,5,0,61,1,100,0,0,0,0,0,23,1,0,0,0,0,0,1,0,0,0,0,0,0,0,"Druid of the Fang - At 15% Mana - Increment Phase"),
+(@ENTRY,0,6,0,9,1,100,3,35,80,0,0,21,1,0,0,0,0,0,1,0,0,0,0,0,0,0,"Druid of the Fang - At 35 - 80 Range - Allow Combat Movement"),
+(@ENTRY,0,7,0,9,1,100,3,5,15,0,0,21,0,0,0,0,0,0,1,0,0,0,0,0,0,0,"Druid of the Fang - At 5 - 15 Range - Allow Combat Movement"),
+(@ENTRY,0,8,0,9,1,100,3,0,5,0,0,21,1,0,0,0,0,0,1,0,0,0,0,0,0,0,"Druid of the Fang - At 0 - 5 Range - Allow Combat Movement"),
+(@ENTRY,0,9,0,0,1,100,2,8000,11000,10000,20000,11,8040,33,0,0,0,0,6,0,0,0,0,0,0,0,"Druid of the Fang - In Combat - Cast Druid's Slumber"),
+(@ENTRY,0,10,0,14,1,100,2,0,40,12000,18000,11,5187,1,0,0,0,0,7,0,0,0,0,0,0,0,"Druid of the Fang - On Friendly Unit At 0 - 40% Health - Cast Healing Touch"),
+(@ENTRY,0,11,0,3,2,100,2,30,100,100,100,23,0,1,0,0,0,0,1,0,0,0,0,0,0,0,"Druid of the Fang - At 30% Mana - Decrement Phase"),
+(@ENTRY,0,12,13,2,0,100,2,0,50,20000,25000,11,8041,1,0,0,0,0,1,0,0,0,0,0,0,0,"Druid of the Fang - At 50% HP - Cast Serpent Form"),
+(@ENTRY,0,13,14,61,0,100,0,0,0,0,0,21,1,0,0,0,0,0,1,0,0,0,0,0,0,0,"Druid of the Fang - At 50% HP - Allow Combat Movement"),
+(@ENTRY,0,14,0,61,0,100,0,0,0,0,0,22,3,0,0,0,0,0,1,0,0,0,0,0,0,0,"Druid of the Fang - At 50% HP - Set Phase 3"),
+(@ENTRY,0,15,16,16,0,100,2,8041,5,0,0,21,0,0,0,0,0,0,1,0,0,0,0,0,0,0,"Druid of the Fang - On Friendly Buff Missing - Allow Combat Movement"),
+(@ENTRY,0,16,0,61,0,100,0,0,0,0,0,22,1,0,0,0,0,0,1,0,0,0,0,0,0,0,"Druid of the Fang - On Friendly Buff Missing - Set Phase 1");
+
+-- Ymirjar Necromancer SAI
+SET @ENTRY := 28368;
+UPDATE `creature_template` SET `AIName`='SmartAI' WHERE `entry`=@ENTRY;
+DELETE FROM `creature_ai_scripts` WHERE `creature_id`=@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,7,0,0,0,0,21,0,0,0,0,0,0,1,0,0,0,0,0,0,0,"Ymirjar Necromancer - Out Of Combat - Allow Combat Movement"),
+(@ENTRY,0,1,0,61,0,100,0,0,0,0,0,22,0,0,0,0,0,0,1,0,0,0,0,0,0,0,"Ymirjar Necromancer - Out Of Combat - Set Phase 0"),
+(@ENTRY,0,2,3,4,0,100,3,0,0,0,0,11,51432,0,0,0,0,0,2,0,0,0,0,0,0,0,"Ymirjar Necromancer (Normal) - On Aggro - Cast Shadow Bolt"),
+(@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,"Ymirjar Necromancer (Normal) - On Aggro - Increment Phase"),
+(@ENTRY,0,4,0,9,1,100,2,0,40,5000,7000,11,51432,0,0,0,0,0,2,0,0,0,0,0,0,0,"Ymirjar Necromancer (Normal) - At 0 - 40 Range - Cast Shadow Bolt"),
+(@ENTRY,0,5,6,4,0,100,5,0,0,0,0,11,59254,0,0,0,0,0,2,0,0,0,0,0,0,0,"Ymirjar Necromancer (Heroic) - On Aggro - Cast Shadow Bolt"),
+(@ENTRY,0,6,0,61,0,100,0,0,0,0,0,23,1,0,0,0,0,0,1,0,0,0,0,0,0,0,"Ymirjar Necromancer (Heroic) - On Aggro - Increment Phase"),
+(@ENTRY,0,7,0,9,1,100,4,0,40,5000,7000,11,59254,0,0,0,0,0,2,0,0,0,0,0,0,0,"Ymirjar Necromancer (Heroic) - At 0 - 40 Range - Cast Shadow Bolt"),
+(@ENTRY,0,8,9,3,1,100,6,0,7,0,0,21,1,0,0,0,0,0,1,0,0,0,0,0,0,0,"Ymirjar Necromancer - At 7% Mana - Allow Combat Movement"),
+(@ENTRY,0,9,0,61,0,100,0,0,0,0,0,23,1,0,0,0,0,0,1,0,0,0,0,0,0,0,"Ymirjar Necromancer - At 7% Mana - Increment Phase"),
+(@ENTRY,0,10,0,9,1,100,7,35,80,0,0,21,1,0,0,0,0,0,1,0,0,0,0,0,0,0,"Ymirjar Necromancer - At 35 - 80 Range - Allow Combat Movement"),
+(@ENTRY,0,11,0,9,1,100,7,5,15,0,0,21,0,0,0,0,0,0,1,0,0,0,0,0,0,0,"Ymirjar Necromancer - At 5 - 15 Range - Allow Combat Movement"),
+(@ENTRY,0,12,0,9,1,100,7,0,5,0,0,21,1,0,0,0,0,0,1,0,0,0,0,0,0,0,"Ymirjar Necromancer - At 0 - 5 Range - Allow Combat Movement"),
+(@ENTRY,0,13,0,3,2,100,6,15,100,100,100,23,0,1,0,0,0,0,1,0,0,0,0,0,0,0,"Ymirjar Necromancer - At 15% Mana - Decrement Phase"),
+(@ENTRY,0,14,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 (Normal) - In Combat - Cast Shadow Bolt Volley"),
+(@ENTRY,0,15,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 (Heroic) - In Combat - Cast Shadow Bolt Volley"),
+(@ENTRY,0,16,0,2,0,100,7,0,15,0,0,22,3,0,0,0,0,0,1,0,0,0,0,0,0,0,"Ymirjar Necromancer - At 15% HP - Set Phase 3"),
+(@ENTRY,0,17,18,2,4,100,6,0,15,0,0,21,1,0,0,0,0,0,1,0,0,0,0,0,0,0,"Ymirjar Necromancer - At 15% HP - Allow Combat Movement"),
+(@ENTRY,0,18,0,61,0,100,0,0,0,0,0,25,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Ymirjar Necromancer - At 15% HP - Flee For Assist");
+
+-- Ymirjar Flesh Hunter SAI
+SET @ENTRY := 26670;
+UPDATE `creature_template` SET `AIName`='SmartAI' WHERE `entry`=@ENTRY;
+DELETE FROM `creature_ai_scripts` WHERE `creature_id`=@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,6,0,0,0,0,21,0,0,0,0,0,0,1,0,0,0,0,0,0,0,"Ymirjar Flesh Hunter - Out Of Combat - Allow Combat Movement"),
+(@ENTRY,0,1,0,61,0,100,0,0,0,0,0,20,0,0,0,0,0,0,1,0,0,0,0,0,0,0,"Ymirjar Flesh Hunter - Out Of Combat - Start Auto Attack"),
+(@ENTRY,0,2,0,4,0,15,7,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,"Ymirjar Flesh Hunter - On Aggro - Say Line 0"),
+(@ENTRY,0,3,4,4,0,100,3,0,0,0,0,11,48854,0,0,0,0,0,2,0,0,0,0,0,0,0,"Ymirjar Flesh Hunter (Normal) - On Aggro - Cast Shoot"),
+(@ENTRY,0,4,0,61,0,100,0,0,0,0,0,23,1,0,0,0,0,0,1,0,0,0,0,0,0,0,"Ymirjar Flesh Hunter (Normal) - On Aggro - Increment Phase"),
+(@ENTRY,0,5,6,9,1,100,2,5,30,5000,8000,11,48854,0,0,0,0,0,2,0,0,0,0,0,0,0,"Ymirjar Flesh Hunter (Normal) - At 5 - 30 Range - Cast Shoot"),
+(@ENTRY,0,6,0,61,0,100,0,0,0,0,0,40,2,0,0,0,0,0,1,0,0,0,0,0,0,0,"Ymirjar Flesh Hunter (Normal) - At 5 - 30 Range - Display ranged weapon"),
+(@ENTRY,0,7,8,4,0,100,5,0,0,0,0,11,59241,0,0,0,0,0,2,0,0,0,0,0,0,0,"Ymirjar Flesh Hunter (Heroic) - On Aggro - Cast Shoot"),
+(@ENTRY,0,8,0,61,0,100,0,0,0,0,0,23,1,0,0,0,0,0,1,0,0,0,0,0,0,0,"Ymirjar Flesh Hunter (Heroic) - On Aggro - Increment Phase"),
+(@ENTRY,0,9,10,9,1,100,4,5,30,5000,8000,11,59241,0,0,0,0,0,2,0,0,0,0,0,0,0,"Ymirjar Flesh Hunter (Heroic) - At 5 - 30 Range - Cast Shoot"),
+(@ENTRY,0,10,0,61,0,100,0,0,0,0,0,40,2,0,0,0,0,0,1,0,0,0,0,0,0,0,"Ymirjar Flesh Hunter (Heroic) - At 5 - 30 Range - Display ranged weapon"),
+(@ENTRY,0,11,12,9,1,100,6,25,80,0,0,21,1,0,0,0,0,0,1,0,0,0,0,0,0,0,"Ymirjar Flesh Hunter - At 25 - 80 Range - Allow Combat Movement"),
+(@ENTRY,0,12,0,61,0,100,0,0,0,0,0,20,1,0,0,0,0,0,1,0,0,0,0,0,0,0,"Ymirjar Flesh Hunter - At 25 - 80 Range - Start Auto Attack"),
+(@ENTRY,0,13,14,9,1,100,6,0,5,0,0,21,1,0,0,0,0,0,1,0,0,0,0,0,0,0,"Ymirjar Flesh Hunter - At 0 - 5 Range - Allow Combat Movement"),
+(@ENTRY,0,14,15,61,0,100,0,0,0,0,0,40,1,0,0,0,0,0,1,0,0,0,0,0,0,0,"Ymirjar Flesh Hunter - At 0 - 5 Range - Display melee weapon"),
+(@ENTRY,0,15,0,61,0,100,0,0,0,0,0,20,1,0,0,0,0,0,1,0,0,0,0,0,0,0,"Ymirjar Flesh Hunter - At 0 - 5 Range - Start Auto Attack"),
+(@ENTRY,0,16,17,9,1,100,6,5,15,0,0,21,0,0,0,0,0,0,1,0,0,0,0,0,0,0,"Ymirjar Flesh Hunter - At 5 - 15 Range - Allow Combat Movement"),
+(@ENTRY,0,17,0,61,0,100,0,0,0,0,0,20,0,0,0,0,0,0,1,0,0,0,0,0,0,0,"Ymirjar Flesh Hunter - At 5 - 15 Range - Start Auto Attack"),
+(@ENTRY,0,18,19,0,0,100,2,9000,14000,22000,26000,11,48871,0,0,0,0,0,5,0,0,0,0,0,0,0,"Ymirjar Flesh Hunter (Normal) - In Combat - Cast Aimed Shot"),
+(@ENTRY,0,19,0,61,0,100,0,0,0,0,0,40,2,0,0,0,0,0,1,0,0,0,0,0,0,0,"Ymirjar Flesh Hunter (Normal) - In Combat - Display ranged weapon"),
+(@ENTRY,0,20,21,0,0,100,4,9000,14000,22000,26000,11,59243,0,0,0,0,0,5,0,0,0,0,0,0,0,"Ymirjar Flesh Hunter (Heroic) - In Combat - Cast Aimed Shot"),
+(@ENTRY,0,21,0,61,0,100,0,0,0,0,0,40,2,0,0,0,0,0,1,0,0,0,0,0,0,0,"Ymirjar Flesh Hunter (Heroic) - In Combat - Display ranged weapon"),
+(@ENTRY,0,22,23,0,0,100,2,14000,17000,24000,27000,11,48872,1,0,0,0,0,6,0,0,0,0,0,0,0,"Ymirjar Flesh Hunter (Normal) - In Combat - Cast Multi-Shot"),
+(@ENTRY,0,23,0,61,0,100,0,0,0,0,0,40,2,0,0,0,0,0,1,0,0,0,0,0,0,0,"Ymirjar Flesh Hunter (Normal) - In Combat - Display ranged weapon"),
+(@ENTRY,0,24,25,0,0,100,4,14000,17000,24000,27000,11,59244,1,0,0,0,0,6,0,0,0,0,0,0,0,"Ymirjar Flesh Hunter (Heroic) - In Combat - Cast Multi-Shot"),
+(@ENTRY,0,25,0,61,0,100,0,0,0,0,0,40,2,0,0,0,0,0,1,0,0,0,0,0,0,0,"Ymirjar Flesh Hunter (Heroic) - In Combat - Display ranged weapon"),
+(@ENTRY,0,26,0,2,0,100,7,0,15,0,0,23,1,0,0,0,0,0,1,0,0,0,0,0,0,0,"Ymirjar Flesh Hunter - At 15% HP - Increment Phase"),
+(@ENTRY,0,27,28,2,2,100,6,0,15,0,0,21,1,0,0,0,0,0,1,0,0,0,0,0,0,0,"Ymirjar Flesh Hunter - At 15% HP - Allow Combat Movement"),
+(@ENTRY,0,28,0,61,0,100,0,0,0,0,0,25,1,0,0,0,0,0,0,0,0,0,0,0,0,0,"Ymirjar Flesh Hunter - At 15% HP - Flee For Assist"),
+(@ENTRY,0,29,0,7,0,100,6,0,0,0,0,40,1,0,0,0,0,0,1,0,0,0,0,0,0,0,"Ymirjar Flesh Hunter - On Evade - Display melee weapon");
+
+-- Dragonflayer Seer SAI
+SET @ENTRY := 26554;
+UPDATE `creature_template` SET `AIName`='SmartAI' WHERE `entry`=@ENTRY;
+DELETE FROM `creature_ai_scripts` WHERE `creature_id`=@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,6,0,0,0,0,21,0,0,0,0,0,0,1,0,0,0,0,0,0,0,"Dragonflayer Seer - Out Of Combat - Allow Combat Movement"),
+(@ENTRY,0,1,0,61,0,100,0,0,0,0,0,22,0,0,0,0,0,0,1,0,0,0,0,0,0,0,"Dragonflayer Seer - Out Of Combat - Set Phase 0"),
+(@ENTRY,0,2,3,4,0,100,3,0,0,0,0,11,48698,0,0,0,0,0,2,0,0,0,0,0,0,0,"Dragonflayer Seer (Normal) - On Aggro - Cast Lightning Bolt"),
+(@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,"Dragonflayer Seer (Normal) - On Aggro - Increment Phase"),
+(@ENTRY,0,4,0,9,1,100,2,0,40,7000,11000,11,48698,0,0,0,0,0,2,0,0,0,0,0,0,0,"Dragonflayer Seer (Normal) - At 0 - 40 Range - Cast Lightning Bolt"),
+(@ENTRY,0,5,6,4,0,100,5,0,0,0,0,11,59081,0,0,0,0,0,2,0,0,0,0,0,0,0,"Dragonflayer Seer (Heroic) - On Aggro - Cast Lightning Bolt"),
+(@ENTRY,0,6,0,61,0,100,0,0,0,0,0,23,1,0,0,0,0,0,1,0,0,0,0,0,0,0,"Dragonflayer Seer (Heroic) - On Aggro - Increment Phase"),
+(@ENTRY,0,7,0,9,1,100,4,0,40,7000,11000,11,59081,0,0,0,0,0,2,0,0,0,0,0,0,0,"Dragonflayer Seer (Heroic) - At 0 - 40 Range - Cast Lightning Bolt"),
+(@ENTRY,0,8,9,3,1,100,6,0,7,0,0,21,1,0,0,0,0,0,1,0,0,0,0,0,0,0,"Dragonflayer Seer - At 7% Mana - Allow Combat Movement"),
+(@ENTRY,0,9,0,61,1,100,0,0,0,0,0,23,1,0,0,0,0,0,1,0,0,0,0,0,0,0,"Dragonflayer Seer - At 7% Mana - Increment Phase"),
+(@ENTRY,0,10,0,9,1,100,7,35,80,0,0,21,1,0,0,0,0,0,1,0,0,0,0,0,0,0,"Dragonflayer Seer - At 35 - 80 Range - Allow Combat Movement"),
+(@ENTRY,0,11,0,9,1,100,7,5,15,0,0,21,0,0,0,0,0,0,1,0,0,0,0,0,0,0,"Dragonflayer Seer - At 5 - 15 Range - Allow Combat Movement"),
+(@ENTRY,0,12,0,9,1,100,7,0,5,0,0,21,1,0,0,0,0,0,1,0,0,0,0,0,0,0,"Dragonflayer Seer - At 0 - 5 Range - Allow Combat Movement"),
+(@ENTRY,0,13,0,3,2,100,6,15,100,100,100,23,0,1,0,0,0,0,1,0,0,0,0,0,0,0,"Dragonflayer Seer - At 15% Mana - Decrement Phase"),
+(@ENTRY,0,14,0,0,0,100,2,4000,7000,12000,15000,11,48699,0,0,0,0,0,5,0,0,0,0,0,0,0,"Dragonflayer Seer (Normal) - In Combat - Cast Chain Lightning"),
+(@ENTRY,0,15,0,0,0,100,4,4000,7000,12000,15000,11,59082,0,0,0,0,0,5,0,0,0,0,0,0,0,"Dragonflayer Seer (Heroic) - In Combat - Cast Chain Lightning"),
+(@ENTRY,0,16,0,14,0,100,2,0,30,18000,21000,11,48700,0,0,0,0,0,7,0,0,0,0,0,0,0,"Dragonflayer Seer (Normal) - On Friendly Unit At 0 - 30% Health - Cast Healing Wave"),
+(@ENTRY,0,17,0,14,0,100,4,0,30,18000,21000,11,59083,0,0,0,0,0,7,0,0,0,0,0,0,0,"Dragonflayer Seer (Heroic) - On Friendly Unit At 0 - 30% Health - Cast Healing Wave");
+
+-- Dark Rune Shaper SAI
+SET @ENTRY := 27965;
+UPDATE `creature_template` SET `AIName`='SmartAI' WHERE `entry`=@ENTRY;
+DELETE FROM `creature_ai_scripts` WHERE `creature_id`=@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,7,0,0,0,0,21,0,0,0,0,0,0,1,0,0,0,0,0,0,0,"Dark Rune Shaper - Out Of Combat - Allow Combat Movement"),
+(@ENTRY,0,1,0,61,0,100,0,0,0,0,0,22,0,0,0,0,0,0,1,0,0,0,0,0,0,0,"Dark Rune Shaper - Out Of Combat - Set Phase 0"),
+(@ENTRY,0,2,3,4,0,100,3,0,0,0,0,11,51496,0,0,0,0,0,2,0,0,0,0,0,0,0,"Dark Rune Shaper (Normal) - On Aggro - Cast Chiseling Ray"),
+(@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,"Dark Rune Shaper (Normal) - On Aggro - Increment Phase"),
+(@ENTRY,0,4,0,9,1,100,2,0,40,6000,9000,11,51496,0,0,0,0,0,2,0,0,0,0,0,0,0,"Dark Rune Shaper (Normal) - At 0 - 40 Range - Cast Chiseling Ray"),
+(@ENTRY,0,5,6,4,0,100,5,0,0,0,0,11,59034,0,0,0,0,0,2,0,0,0,0,0,0,0,"Dark Rune Shaper (Heroic) - On Aggro - Cast Chiseling Ray"),
+(@ENTRY,0,6,0,61,0,100,0,0,0,0,0,23,1,0,0,0,0,0,1,0,0,0,0,0,0,0,"Dark Rune Shaper (Heroic) - On Aggro - Increment Phase"),
+(@ENTRY,0,7,0,9,1,100,4,0,40,6000,9000,11,59034,0,0,0,0,0,2,0,0,0,0,0,0,0,"Dark Rune Shaper (Heroic) - At 0 - 40 Range - Cast Chiseling Ray"),
+(@ENTRY,0,8,9,3,1,100,7,0,7,0,0,21,1,0,0,0,0,0,1,0,0,0,0,0,0,0,"Dark Rune Shaper - At 7% Mana - Allow Combat Movement"),
+(@ENTRY,0,9,0,61,1,100,0,0,0,0,0,23,1,0,0,0,0,0,1,0,0,0,0,0,0,0,"Dark Rune Shaper - At 7% Mana - Increment Phase"),
+(@ENTRY,0,10,0,9,1,100,7,35,80,0,0,21,1,0,0,0,0,0,1,0,0,0,0,0,0,0,"Dark Rune Shaper - At 35 - 80 Range - Allow Combat Movement"),
+(@ENTRY,0,11,0,9,1,100,7,5,15,0,0,21,0,0,0,0,0,0,1,0,0,0,0,0,0,0,"Dark Rune Shaper - At 5 - 15 Range - Allow Combat Movement"),
+(@ENTRY,0,12,0,9,1,100,7,0,5,0,0,21,1,0,0,0,0,0,1,0,0,0,0,0,0,0,"Dark Rune Shaper - At 0 - 5 Range - Allow Combat Movement"),
+(@ENTRY,0,13,0,3,2,100,6,15,100,100,100,23,0,1,0,0,0,0,1,0,0,0,0,0,0,0,"Dark Rune Shaper - At 15% Mana - Decrement Phase");
diff --git a/sql/updates/world/2013_01_02_09_world_waypoints.sql b/sql/updates/world/2013_01_02_09_world_waypoints.sql
new file mode 100644
index 00000000000..1c2492fcce8
--- /dev/null
+++ b/sql/updates/world/2013_01_02_09_world_waypoints.sql
@@ -0,0 +1,138 @@
+-- Pathing for Thrym Entry: 28243
+SET @NPC := 103290;
+SET @PATH := @NPC * 10;
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=5448.966,`position_y`=-1600.008,`position_z`=248.3331 WHERE `guid`=@NPC;
+DELETE FROM `creature_addon` WHERE `guid`=@NPC;
+INSERT INTO `creature_addon` (`guid`,`path_id`,`bytes2`,`mount`,`auras`) VALUES (@NPC,@PATH,1,0, '');
+DELETE FROM `waypoint_data` WHERE `id`=@PATH;
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`delay`,`move_flag`,`action`,`action_chance`,`wpguid`) VALUES
+(@PATH,1,5448.966,-1600.008,248.3331,0,0,0,100,0),
+(@PATH,2,5447.655,-1631.053,248.3331,0,0,0,100,0),
+(@PATH,3,5447.865,-1663.079,248.3032,0,0,0,100,0),
+(@PATH,4,5446.966,-1704.903,248.2398,0,0,0,100,0),
+(@PATH,5,5446.957,-1736.751,248.3335,0,0,0,100,0),
+(@PATH,6,5445.319,-1773.959,248.2313,0,0,0,100,0),
+(@PATH,7,5443.451,-1814.034,248.2451,0,0,0,100,0),
+(@PATH,8,5443.122,-1860.167,248.2451,0,0,0,100,0),
+(@PATH,9,5442.573,-1896.295,248.2961,0,0,0,100,0),
+(@PATH,10,5444.602,-1934.296,248.3471,0,0,0,100,0),
+(@PATH,11,5445.959,-1975.212,248.3471,0,0,0,100,0),
+(@PATH,12,5448.557,-2015.833,248.3328,0,0,0,100,0),
+(@PATH,13,5450.393,-2055.615,248.3471,0,0,0,100,0),
+(@PATH,14,5452.368,-2095.424,248.3471,0,0,0,100,0),
+(@PATH,15,5450.376,-2130.012,248.3557,0,0,0,100,0),
+(@PATH,16,5448.958,-2154.166,248.3565,0,0,0,100,0),
+(@PATH,17,5450.228,-2193.794,248.4327,0,0,0,100,0),
+(@PATH,18,5449.065,-2155.135,248.3565,0,0,0,100,0),
+(@PATH,19,5451.041,-2130.209,248.3557,0,0,0,100,0),
+(@PATH,20,5452.368,-2095.424,248.3471,0,0,0,100,0),
+(@PATH,21,5450.393,-2055.615,248.3471,0,0,0,100,0),
+(@PATH,22,5448.557,-2015.833,248.3328,0,0,0,100,0),
+(@PATH,23,5445.959,-1975.212,248.3471,0,0,0,100,0),
+(@PATH,24,5444.602,-1934.296,248.3471,0,0,0,100,0),
+(@PATH,25,5442.573,-1896.295,248.2961,0,0,0,100,0),
+(@PATH,26,5443.122,-1860.167,248.2451,0,0,0,100,0),
+(@PATH,27,5443.451,-1814.034,248.2451,0,0,0,100,0),
+(@PATH,28,5445.319,-1773.959,248.2313,0,0,0,100,0),
+(@PATH,29,5446.957,-1736.751,248.3335,0,0,0,100,0),
+(@PATH,30,5446.966,-1704.903,248.2398,0,0,0,100,0),
+(@PATH,31,5447.865,-1663.079,248.3032,0,0,0,100,0),
+(@PATH,32,5447.655,-1631.053,248.3331,0,0,0,100,0),
+(@PATH,33,5448.966,-1600.008,248.3331,0,0,0,100,0),
+(@PATH,34,5448.563,-1572.11,248.3242,0,0,0,100,0),
+(@PATH,35,5448.359,-1535.512,248.3503,0,0,0,100,0),
+(@PATH,36,5446.37,-1496.475,248.3165,0,0,0,100,0),
+(@PATH,37,5445.602,-1454.377,248.3085,0,0,0,100,0),
+(@PATH,38,5445.826,-1433.070,248.4012,0,0,0,100,0),
+(@PATH,39,5446.118,-1417.052,239.2611,0,0,0,100,0),
+(@PATH,40,5446.015,-1411.64,239.3458,0,0,0,100,0),
+(@PATH,41,5446.15,-1372.373,239.3458,0,0,0,100,0),
+(@PATH,42,5445.78,-1326.04,239.2721,0,0,0,100,0),
+(@PATH,43,5446.15,-1372.373,239.3458,0,0,0,100,0),
+(@PATH,44,5446.015,-1411.64,239.3458,0,0,0,100,0),
+(@PATH,45,5446.118,-1417.052,239.2611,0,0,0,100,0),
+(@PATH,46,5445.826,-1433.070,248.4012,0,0,0,100,0),
+(@PATH,47,5445.602,-1454.377,248.3085,0,0,0,100,0),
+(@PATH,48,5446.37,-1496.475,248.3165,0,0,0,100,0),
+(@PATH,49,5448.359,-1535.512,248.3503,0,0,0,100,0),
+(@PATH,50,5448.563,-1572.11,248.3242,0,0,0,100,0);
+
+-- Pathing for Mam'toth Disciple Entry: 28861
+SET @NPC := 113829;
+SET @PATH := @NPC * 10;
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=6405.855,`position_y`=-4262.899,`position_z`=455.5814 WHERE `guid`=@NPC;
+DELETE FROM `creature_addon` WHERE `guid`=@NPC;
+INSERT INTO `creature_addon` (`guid`,`path_id`,`bytes2`,`mount`,`auras`) VALUES (@NPC,@PATH,1,0, '52574');
+DELETE FROM `waypoint_data` WHERE `id`=@PATH;
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`delay`,`move_flag`,`action`,`action_chance`,`wpguid`) VALUES
+(@PATH,1,6405.855,-4262.899,455.5814,0,0,0,100,0),
+(@PATH,2,6406.651,-4247.01,454.8314,0,0,0,100,0),
+(@PATH,3,6411.053,-4230.215,456.8571,0,0,0,100,0),
+(@PATH,4,6407.01,-4207.069,461.7675,0,0,0,100,0),
+(@PATH,5,6385.251,-4191.354,460.4738,0,0,0,100,0),
+(@PATH,6,6367.858,-4193.421,459.0136,0,0,0,100,0),
+(@PATH,7,6367.621,-4216.292,458.9676,0,0,0,100,0),
+(@PATH,8,6359.056,-4238.381,458.9309,0,0,0,100,0),
+(@PATH,9,6368.265,-4261.602,458.9691,0,0,0,100,0),
+(@PATH,10,6368.305,-4284.628,458.8995,0,0,0,100,0),
+(@PATH,11,6390.221,-4289.859,461.7745,0,0,0,100,0),
+(@PATH,12,6402.944,-4284.963,457.5383,0,0,0,100,0);
+
+-- Pathing for Segacedi Entry: 32664
+SET @NPC := 110306;
+SET @PATH := @NPC * 10;
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=5924.809,`position_y`=564.5653,`position_z`=601.5578 WHERE `guid`=@NPC;
+DELETE FROM `creature_addon` WHERE `guid`=@NPC;
+INSERT INTO `creature_addon` (`guid`,`path_id`,`bytes2`,`mount`,`auras`) VALUES (@NPC,@PATH,1,0, '');
+DELETE FROM `waypoint_data` WHERE `id`=@PATH;
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`delay`,`move_flag`,`action`,`action_chance`,`wpguid`) VALUES
+(@PATH,1,5924.809,564.5653,601.5578,0,0,0,100,0),
+(@PATH,2,5917.506,559.5457,599.975,0,0,0,100,0),
+(@PATH,3,5924.809,564.5653,601.5578,0,0,0,100,0),
+(@PATH,4,5923.932,570.1338,603.1688,0,0,0,100,0),
+(@PATH,5,5926.551,575.4876,602.0579,0,0,0,100,0),
+(@PATH,6,5930.981,574.3068,602.5855,0,0,0,100,0),
+(@PATH,7,5933.025,569.929,601.4746,0,0,0,100,0),
+(@PATH,8,5932.214,563.8223,600.2523,0,0,0,100,0),
+(@PATH,9,5929.565,561.0128,602.0024,0,0,0,100,0),
+(@PATH,10,5925.193,559.6426,603.4468,0,0,0,100,0),
+(@PATH,11,5922.899,557.1088,603.3078,0,0,0,100,0),
+(@PATH,12,5918.246,557.59,603.447,0,0,0,100,0),
+(@PATH,13,5914.375,559.9744,603.5861,0,0,0,100,0),
+(@PATH,14,5906.045,566.9766,602.8636,0,0,0,100,0),
+(@PATH,15,5911.538,571.5968,603.2217,0,0,0,100,0),
+(@PATH,16,5919.368,574.7385,603.5026,0,0,0,100,0),
+(@PATH,17,5911.538,571.5968,603.2217,0,0,0,100,0),
+(@PATH,18,5906.045,566.9766,602.8636,0,0,0,100,0),
+(@PATH,19,5914.375,559.9744,603.5861,0,0,0,100,0),
+(@PATH,20,5918.246,557.59,603.447,0,0,0,100,0),
+(@PATH,21,5922.899,557.1088,603.3078,0,0,0,100,0),
+(@PATH,22,5925.193,559.6426,603.4468,0,0,0,100,0),
+(@PATH,23,5929.565,561.0128,602.0024,0,0,0,100,0),
+(@PATH,24,5932.214,563.8223,600.2523,0,0,0,100,0),
+(@PATH,25,5933.025,569.929,601.4746,0,0,0,100,0),
+(@PATH,26,5930.981,574.3068,602.5855,0,0,0,100,0),
+(@PATH,27,5926.551,575.4876,602.0579,0,0,0,100,0),
+(@PATH,28,5923.932,570.1338,603.1688,0,0,0,100,0);
+
+-- Pathing for Claw of Har'koa Entry: 28402
+SET @NPC := 88732;
+SET @PATH := @NPC * 10;
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=5475.932,`position_y`=-3943.574,`position_z`=362.062 WHERE `guid`=@NPC;
+DELETE FROM `creature_addon` WHERE `guid`=@NPC;
+INSERT INTO `creature_addon` (`guid`,`path_id`,`bytes2`,`mount`,`auras`) VALUES (@NPC,@PATH,1,0, '');
+DELETE FROM `waypoint_data` WHERE `id`=@PATH;
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`delay`,`move_flag`,`action`,`action_chance`,`wpguid`) VALUES
+(@PATH,1,5475.932,-3943.574,362.062,0,0,0,100,0),
+(@PATH,2,5496.939,-3933.918,362.062,0,0,0,100,0),
+(@PATH,3,5503.387,-3912.114,362.0851,0,0,0,100,0),
+(@PATH,4,5505.28,-3887.115,362.0851,0,0,0,100,0),
+(@PATH,5,5494.267,-3863.793,362.0794,0,0,0,100,0),
+(@PATH,6,5474.92,-3854.984,362.0794,0,0,0,100,0),
+(@PATH,7,5449.384,-3848.412,362.0686,0,0,0,100,0),
+(@PATH,8,5429.913,-3847.965,362.0359,0,0,0,100,0),
+(@PATH,9,5409.766,-3868.374,361.9735,0,0,0,100,0),
+(@PATH,10,5407.17,-3903.612,362.0776,0,0,0,100,0),
+(@PATH,11,5407.908,-3925.006,362.0776,0,0,0,100,0),
+(@PATH,12,5433.907,-3945.061,362.062,0,0,0,100,0),
+(@PATH,13,5449.745,-3949.848,362.062,0,0,0,100,0);
diff --git a/sql/updates/world/2013_01_02_10_world_sai.sql b/sql/updates/world/2013_01_02_10_world_sai.sql
new file mode 100644
index 00000000000..0be2c5c2d6b
--- /dev/null
+++ b/sql/updates/world/2013_01_02_10_world_sai.sql
@@ -0,0 +1,2 @@
+-- Gameobject Type 3 does NOT support gameobject_scripts
+DELETE FROM `gameobject_scripts` WHERE `id` BETWEEN 35843 AND 35848;
diff --git a/sql/updates/world/2013_01_02_11_world_sai.sql b/sql/updates/world/2013_01_02_11_world_sai.sql
new file mode 100644
index 00000000000..7496a765470
--- /dev/null
+++ b/sql/updates/world/2013_01_02_11_world_sai.sql
@@ -0,0 +1,34 @@
+UPDATE `gameobject_template` SET `AIName`='SmartGameObjectAI' WHERE `entry` IN (176346,176349,176350,176351,176352,176353);
+DELETE FROM `smart_scripts` WHERE `entryorguid`IN (176346,176349,176350,176351,176352,176353) AND `source_type`=1;
+DELETE FROM `smart_scripts` WHERE `entryorguid`IN (17634600,17634900,17635000,17635100,17635200,17635300) 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
+(176346,1,0,0,70,0,100,0,2,0,0,0,80,17634600,0,0,0,0,0,1,0,0,0,0,0,0,0, 'Market Row Postbox - On Activate - Start Script'),
+(176349,1,0,0,70,0,100,0,2,0,0,0,80,17634900,0,0,0,0,0,1,0,0,0,0,0,0,0, 'Crusaders Square Postbox - On Activate - Start Script'),
+(176350,1,0,0,70,0,100,0,2,0,0,0,80,17635000,0,0,0,0,0,1,0,0,0,0,0,0,0, 'Festival Lane Postbox - On Activate - Start Script'),
+(176351,1,0,0,70,0,100,0,2,0,0,0,80,17635100,0,0,0,0,0,1,0,0,0,0,0,0,0, 'Elders Square Postbox - On Activate - Start Script'),
+(176352,1,0,0,70,0,100,0,2,0,0,0,80,17635200,0,0,0,0,0,1,0,0,0,0,0,0,0, 'Kings Square Postbox - On Activate - Start Script'),
+(176353,1,0,0,70,0,100,0,2,0,0,0,80,17635300,0,0,0,0,0,1,0,0,0,0,0,0,0, 'Fras Siabis Postbox - On Activate - Start Script'),
+-- Market Row Postbox Script
+(17634600,9,0,0,0,0,100,0,2000,2000,0,0,12,11142,1,300000,0,1,0,8,0,0,0,3675.35,-3395.92,132.86,5.83,'MR Postbox Script - After 2s - Summon Undead Postman'),
+(17634600,9,1,0,0,0,100,0,2000,2000,0,0,12,11142,1,300000,0,1,0,8,0,0,0,3679.93,-3408.58,133.18,1.04,'MR Postbox Script - After 2s - Summon Undead Postman'),
+(17634600,9,2,0,0,0,100,0,2000,2000,0,0,12,11142,1,300000,0,1,0,8,0,0,0,3687.89,-3410.59,133.04,1.64,'MR Postbox Script - After 2s - Summon Undead Postman'),
+-- Crusaders' Square Postbox Script
+(17634900,9,0,0,0,0,100,0,2000,2000,0,0,12,11142,1,300000,0,1,0,8,0,0,0,3664.55,-3176.47,126.42,2.20,'CS Postbox Script - After 2s - Summon Undead Postman'),
+(17634900,9,1,0,0,0,100,0,2000,2000,0,0,12,11142,1,300000,0,1,0,8,0,0,0,3656.82,-3160.63,129.03,4.84,'CS Postbox Script - After 2s - Summon Undead Postman'),
+(17634900,9,2,0,0,0,100,0,2000,2000,0,0,12,11142,1,300000,0,1,0,8,0,0,0,3644.62,-3168.25,128.52,5.93,'CS Postbox Script - After 2s - Summon Undead Postman'),
+-- Festival Lane Postbox Script
+(17635000,9,0,0,0,0,100,0,2000,2000,0,0,12,11142,1,300000,0,1,0,8,0,0,0,3651.67,-3477.88,138.05,5.59,'FL Postbox Script - After 2s - Summon Undead Postman'),
+(17635000,9,1,0,0,0,100,0,2000,2000,0,0,12,11142,1,300000,0,1,0,8,0,0,0,3657.14,-3475.36,138.70,4.91,'FL Postbox Script - After 2s - Summon Undead Postman'),
+(17635000,9,2,0,0,0,100,0,2000,2000,0,0,12,11142,1,300000,0,1,0,8,0,0,0,3669.61,-3478.49,137.49,3.39,'FL Postbox Script - After 2s - Summon Undead Postman'),
+-- Elders' Square Postbox Script
+(17635100,9,0,0,0,0,100,0,2000,2000,0,0,12,11142,1,300000,0,1,0,8,0,0,0,3659.46,-3634.96,138.33,1.28,'ES Postbox Script - After 2s - Summon Undead Postman'),
+(17635100,9,1,0,0,0,100,0,2000,2000,0,0,12,11142,1,300000,0,1,0,8,0,0,0,3656.25,-3635.08,138.36,1.02,'ES Postbox Script - After 2s - Summon Undead Postman'),
+(17635100,9,2,0,0,0,100,0,2000,2000,0,0,12,11142,1,300000,0,1,0,8,0,0,0,3661.24,-3621.00,138.40,3.58,'ES Postbox Script - After 2s - Summon Undead Postman'),
+-- King's Square Postbox Script
+(17635200,9,0,0,0,0,100,0,2000,2000,0,0,12,11142,1,300000,0,1,0,8,0,0,0,3568.50,-3356.91,131.06,2.07,'KS Postbox Script - After 2s - Summon Undead Postman'),
+(17635200,9,1,0,0,0,100,0,2000,2000,0,0,12,11142,1,300000,0,1,0,8,0,0,0,3570.91,-3351.01,130.57,2.71,'KS Postbox Script - After 2s - Summon Undead Postman'),
+(17635200,9,2,0,0,0,100,0,2000,2000,0,0,12,11142,1,300000,0,1,0,8,0,0,0,3562.79,-3353.38,130.78,0.81,'KS Postbox Script - After 2s - Summon Undead Postman'),
+-- Fras Siabi's Postbox Script
+(17635300,9,0,0,0,0,100,0,2000,2000,0,0,12,11142,1,300000,0,1,0,8,0,0,0,3493.00,-3300.28,130.47,0.07,'FS Postbox Script - After 2s - Summon Undead Postman'),
+(17635300,9,1,0,0,0,100,0,2000,2000,0,0,12,11142,1,300000,0,1,0,8,0,0,0,3503.16,-3294.90,131.09,4.28,'FS Postbox Script - After 2s - Summon Undead Postman'),
+(17635300,9,2,0,0,0,100,0,2000,2000,0,0,12,11142,1,300000,0,1,0,8,0,0,0,3496.26,-3295.40,130.98,5.34,'FS Postbox Script - After 2s - Summon Undead Postman');
diff --git a/sql/updates/world/2013_01_02_12_world_go_script.sql b/sql/updates/world/2013_01_02_12_world_go_script.sql
new file mode 100644
index 00000000000..aea0a67c47e
--- /dev/null
+++ b/sql/updates/world/2013_01_02_12_world_go_script.sql
@@ -0,0 +1,11 @@
+-- remove the summoning of the herald and closing of the gate via the brazier
+-- this is an instance encounter and should be handled via cpp, reopen the door if npc is dead
+DELETE FROM `gameobject_scripts` WHERE `id`=43208;
+
+-- This script will NOT work untill CPP changes are made, this UNSUPPORTS Scarlet Monestry Cathedral wing!
+DELETE FROM `gameobject_scripts` WHERE `id` IN (11881,11894);
+UPDATE `gameobject_template` SET `AIName`='SmartGameObjectAI' WHERE `entry` IN (104589,97701);
+DELETE FROM `smart_scripts` WHERE `entryorguid` IN (104589,97701) 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
+(104589,1,0,0,70,0,100,0,2,0,0,0,9,0,0,0,0,0,0,14,11875,104591,0,0,0,0,0,'Lever - On activate - Activate Chapel Door'),
+( 97701,1,0,0,70,0,100,0,2,0,0,0,9,0,0,0,0,0,0,14,11876, 97700,0,0,0,0,0,'Torch - On activate - Activate Secret Door');
diff --git a/sql/updates/world/2013_01_02_12_world_waypoints.sql b/sql/updates/world/2013_01_02_12_world_waypoints.sql
new file mode 100644
index 00000000000..6ec7875d8ef
--- /dev/null
+++ b/sql/updates/world/2013_01_02_12_world_waypoints.sql
@@ -0,0 +1,218 @@
+-- Pathing for Dark Ritualist Entry: 34734
+SET @NPC := 63124;
+SET @PATH := @NPC * 10;
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=8508.912,`position_y`=1423.379,`position_z`=642.1677 WHERE `guid`=@NPC;
+DELETE FROM `creature_addon` WHERE `guid`=@NPC;
+INSERT INTO `creature_addon` (`guid`,`path_id`,`bytes2`,`mount`,`auras`) VALUES (@NPC,@PATH,1,0, '');
+DELETE FROM `waypoint_data` WHERE `id`=@PATH;
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`delay`,`move_flag`,`action`,`action_chance`,`wpguid`) VALUES
+(@PATH,1,8508.912,1423.379,642.1677,0,0,0,100,0),
+(@PATH,2,8515.332,1430.247,642.2927,0,0,0,100,0),
+(@PATH,3,8523.013,1437.788,642.3946,0,0,0,100,0),
+(@PATH,4,8526.778,1446.524,642.3687,0,0,0,100,0),
+(@PATH,5,8530.59,1452.149,642.3568,0,0,0,100,0),
+(@PATH,6,8534.38,1456.161,642.9715,0,0,0,100,0),
+(@PATH,7,8530.59,1452.149,642.3568,0,0,0,100,0),
+(@PATH,8,8526.778,1446.524,642.3687,0,0,0,100,0),
+(@PATH,9,8523.013,1437.788,642.3946,0,0,0,100,0),
+(@PATH,10,8515.332,1430.247,642.2927,0,0,0,100,0);
+
+-- Pathing for Dark Ritualist Entry: 34734
+SET @NPC := 62889;
+SET @PATH := @NPC * 10;
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=8514.877,`position_y`=1673.441,`position_z`=646.5894 WHERE `guid`=@NPC;
+DELETE FROM `creature_addon` WHERE `guid`=@NPC;
+INSERT INTO `creature_addon` (`guid`,`path_id`,`bytes2`,`mount`,`auras`) VALUES (@NPC,@PATH,1,0, '');
+DELETE FROM `waypoint_data` WHERE `id`=@PATH;
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`delay`,`move_flag`,`action`,`action_chance`,`wpguid`) VALUES
+(@PATH,1,8514.877,1673.441,646.5894,0,0,0,100,0),
+(@PATH,2,8518.864,1693.484,645.4977,0,0,0,100,0),
+(@PATH,3,8515.326,1712.451,643.958,0,0,0,100,0),
+(@PATH,4,8518.864,1693.484,645.4977,0,0,0,100,0),
+(@PATH,5,8514.877,1673.441,646.5894,0,0,0,100,0),
+(@PATH,6,8510.175,1661.057,647.1356,0,0,0,100,0),
+(@PATH,7,8504.302,1654.377,647.6522,0,0,0,100,0),
+(@PATH,8,8499.16,1651.429,649.0247,0,0,0,100,0),
+(@PATH,9,8504.302,1654.377,647.6522,0,0,0,100,0),
+(@PATH,10,8510.175,1661.057,647.1356,0,0,0,100,0);
+
+-- Pathing for Dark Ritualist Entry: 34734
+SET @NPC := 62178;
+SET @PATH := @NPC * 10;
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=8561.401,`position_y`=1416.401,`position_z`=643.1947 WHERE `guid`=@NPC;
+DELETE FROM `creature_addon` WHERE `guid`=@NPC;
+INSERT INTO `creature_addon` (`guid`,`path_id`,`bytes2`,`mount`,`auras`) VALUES (@NPC,@PATH,1,0, '');
+DELETE FROM `waypoint_data` WHERE `id`=@PATH;
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`delay`,`move_flag`,`action`,`action_chance`,`wpguid`) VALUES
+(@PATH,1,8561.401,1416.401,643.1947,0,0,0,100,0),
+(@PATH,2,8559.43,1405.359,643.6021,0,0,0,100,0),
+(@PATH,3,8561.401,1416.401,643.1947,0,0,0,100,0),
+(@PATH,4,8559.165,1427.087,642.582,0,0,0,100,0),
+(@PATH,5,8558.565,1438.543,642.76,0,0,0,100,0),
+(@PATH,6,8563.757,1448.488,643.133,0,0,0,100,0),
+(@PATH,7,8558.565,1438.543,642.76,0,0,0,100,0),
+(@PATH,8,8559.165,1427.087,642.582,0,0,0,100,0);
+
+-- Pathing for Dark Ritualist Entry: 34734
+SET @NPC := 62886;
+SET @PATH := @NPC * 10;
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=8558.849,`position_y`=1638.248,`position_z`=642.7181 WHERE `guid`=@NPC;
+DELETE FROM `creature_addon` WHERE `guid`=@NPC;
+INSERT INTO `creature_addon` (`guid`,`path_id`,`bytes2`,`mount`,`auras`) VALUES (@NPC,@PATH,1,0, '');
+DELETE FROM `waypoint_data` WHERE `id`=@PATH;
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`delay`,`move_flag`,`action`,`action_chance`,`wpguid`) VALUES
+(@PATH,1,8558.849,1638.248,642.7181,0,0,0,100,0),
+(@PATH,2,8569.741,1643.606,643.0836,0,0,0,100,0),
+(@PATH,3,8580.118,1650.653,643.5215,0,0,0,100,0),
+(@PATH,4,8569.741,1643.606,643.0836,0,0,0,100,0),
+(@PATH,5,8558.849,1638.248,642.7181,0,0,0,100,0),
+(@PATH,6,8543.526,1634.698,642.6174,0,0,0,100,0),
+(@PATH,7,8527.557,1636.082,642.7275,0,0,0,100,0),
+(@PATH,8,8543.526,1634.698,642.6174,0,0,0,100,0);
+
+-- Pathing for Swift Alliance Steed Entry: 35808
+SET @NPC := 85115;
+SET @PATH := @NPC * 10;
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=8541.001,`position_y`=980.2708,`position_z`=547.4177 WHERE `guid`=@NPC;
+DELETE FROM `creature_addon` WHERE `guid`=@NPC;
+INSERT INTO `creature_addon` (`guid`,`path_id`,`bytes2`,`mount`,`auras`) VALUES (@NPC,@PATH,1,0, '');
+DELETE FROM `waypoint_data` WHERE `id`=@PATH;
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_flag`,`action`,`action_chance`,`wpguid`) VALUES
+(@PATH,1,8541.001,980.2708,547.4177,0,1000,0,0,100,0),
+(@PATH,2,8541.001,980.2708,547.4177,1.064651,21000,0,0,100,0),
+(@PATH,3,8538.89,981.222,547.4177,0,13000,0,51,100,0);
+
+DELETE FROM `waypoint_scripts` WHERE `id`=51;
+INSERT INTO `waypoint_scripts` (`id`,`delay`,`command`,`datalong`,`datalong2`,`guid`) VALUES
+(51,1,1,402,0,70);
+
+-- Missing spawns Swift Horde Wolf
+SET @GUID := 83022;
+DELETE FROM `creature` WHERE `guid` IN (@GUID,@GUID+1);
+INSERT INTO `creature` (`guid`,`id`,`map`,`spawnMask`,`phaseMask`,`modelid`,`equipment_id`,`position_x`,`position_y`,`position_z`,`orientation`,`spawntimesecs`,`spawndist`,`currentwaypoint`,`curhealth`,`curmana`,`MovementType`) VALUES
+(@GUID,36223,571,1,1,0,0,8540.497,986.4167,547.4177,0.01343229,120,0,0,1,0,0),
+(@GUID+1,36223,571,1,1,0,0,8533.108,985.1597,547.3926,0.6806784,120,0,0,1,0,0);
+
+-- Pathing for Swift Horde Wolf Entry: 36223
+SET @NPC := 83022;
+SET @PATH := @NPC * 10;
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=8537.03,`position_y`=986.37,`position_z`=547.4177 WHERE `guid`=@NPC;
+DELETE FROM `creature_addon` WHERE `guid`=@NPC;
+INSERT INTO `creature_addon` (`guid`,`path_id`,`bytes2`,`mount`,`auras`) VALUES (@NPC,@PATH,1,0, '');
+DELETE FROM `waypoint_data` WHERE `id`=@PATH;
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_flag`,`action`,`action_chance`,`wpguid`) VALUES
+(@PATH,1,8537.03,986.37,547.4177,0,13000,0,52,100,0),
+(@PATH,2,8540.497,986.4167,547.4177,0,0,0,0,100,0),
+(@PATH,3,8540.497,986.4167,547.4177,5.462881,37000,0,0,100,0);
+
+DELETE FROM `waypoint_scripts` WHERE `id`=52;
+INSERT INTO `waypoint_scripts` (`id`,`delay`,`command`,`datalong`,`datalong2`,`guid`) VALUES
+(52,2,1,418,1,71),
+(52,10,1,0,1,72);
+
+-- Pathing for Argent Custodian Entry: 36069
+SET @NPC := 85131;
+SET @PATH := @NPC * 10;
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=8515.2,`position_y`=746.3889,`position_z`=575.785 WHERE `guid`=@NPC;
+DELETE FROM `creature_addon` WHERE `guid`=@NPC;
+INSERT INTO `creature_addon` (`guid`,`path_id`,`bytes2`,`mount`,`auras`) VALUES (@NPC,@PATH,1,0, '');
+DELETE FROM `waypoint_data` WHERE `id`=@PATH;
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`delay`,`move_flag`,`action`,`action_chance`,`wpguid`) VALUES
+(@PATH,1,8515.2,746.3889,575.785,0,0,0,100,0),
+(@PATH,2,8497.708,749.8507,575.7857,0,0,0,100,0);
+
+-- Pathing for Argent Custodian Entry: 36069
+SET @NPC := 85130;
+SET @PATH := @NPC * 10;
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=8481.823,`position_y`=791.7691,`position_z`=558.5565 WHERE `guid`=@NPC;
+DELETE FROM `creature_addon` WHERE `guid`=@NPC;
+INSERT INTO `creature_addon` (`guid`,`path_id`,`bytes2`,`mount`,`auras`) VALUES (@NPC,@PATH,1,0, '');
+DELETE FROM `waypoint_data` WHERE `id`=@PATH;
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`delay`,`move_flag`,`action`,`action_chance`,`wpguid`) VALUES
+(@PATH,1,8481.823,791.7691,558.5565,0,0,0,100,0),
+(@PATH,2,8485.347,778.4419,558.5739,0,0,0,100,0),
+(@PATH,3,8490.990,769.2891,558.5689,0,0,0,100,0),
+(@PATH,4,8502.299,762.0498,558.5673,0,0,0,100,0),
+(@PATH,5,8515.458,759.0677,558.5405,0,0,0,100,0),
+(@PATH,6,8528.095,762.0035,558.5671,0,0,0,100,0),
+(@PATH,7,8539.435,769.0851,558.5685,0,0,0,100,0),
+(@PATH,8,8545.628,779.4549,558.5715,0,0,0,100,0),
+(@PATH,9,8548.36,792.8768,558.5598,0,0,0,100,0),
+(@PATH,10,8545.584,805.2761,558.5731,0,0,0,100,0),
+(@PATH,11,8537.013,818.8125,558.5636,0,0,0,100,0),
+(@PATH,12,8515.279,820.3889,558.1152,0,0,0,100,0),
+(@PATH,13,8493.552,818.8524,558.5643,0,0,0,100,0),
+(@PATH,14,8484.993,804.7049,558.5677,0,0,0,100,0);
+
+-- Pathing for Kvaldir Reaver Entry: 34838
+SET @NPC := 52604;
+SET @PATH := @NPC * 10;
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=10213.43,`position_y`=785.3785,`position_z`=65.56143 WHERE `guid`=@NPC;
+DELETE FROM `creature_addon` WHERE `guid`=@NPC;
+INSERT INTO `creature_addon` (`guid`,`path_id`,`bytes2`,`mount`,`auras`) VALUES (@NPC,@PATH,1,0, '');
+DELETE FROM `waypoint_data` WHERE `id`=@PATH;
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`delay`,`move_flag`,`action`,`action_chance`,`wpguid`) VALUES
+(@PATH,1,10213.43,785.3785,65.56143,0,0,0,100,0),
+(@PATH,2,10203.03,791.2552,62.39041,0,0,0,100,0),
+(@PATH,3,10192.28,799.4097,57.93019,0,0,0,100,0),
+(@PATH,4,10181.2,816.316,52.61528,0,0,0,100,0),
+(@PATH,5,10170.49,831.2708,47.18571,0,0,0,100,0),
+(@PATH,6,10181.2,816.316,52.61528,0,0,0,100,0),
+(@PATH,7,10192.28,799.4097,57.93019,0,0,0,100,0),
+(@PATH,8,10203.03,791.2552,62.39041,0,0,0,100,0),
+(@PATH,9,10213.43,785.3785,65.56143,0,0,0,100,0),
+(@PATH,10,10224.06,785.1649,68.88577,0,0,0,100,0);
+
+-- Missing spawns Mam'toth Disciple & Claw of Har'koa
+SET @GUID := 83026;
+DELETE FROM `creature` WHERE `guid` IN (@GUID,@GUID+1);
+INSERT INTO `creature` (`guid`,`id`,`map`,`spawnMask`,`phaseMask`,`modelid`,`equipment_id`,`position_x`,`position_y`,`position_z`,`orientation`,`spawntimesecs`,`spawndist`,`currentwaypoint`,`curhealth`,`curmana`,`MovementType`) VALUES
+(@GUID,28861,571,1,1,0,0,6320.923,-4130.368,458.9318,0.01343229,120,0,0,1,0,0),
+(@GUID+1,28402,571,1,1,0,0,5493.606,-3712.333,362.6227,0.6806784,120,0,0,1,0,0);
+
+-- Pathing for Mam'toth Disciple Entry: 28861
+SET @NPC := 83026;
+SET @PATH := @NPC * 10;
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=6320.923,`position_y`=-4130.368,`position_z`=458.9318 WHERE `guid`=@NPC;
+DELETE FROM `creature_addon` WHERE `guid`=@NPC;
+INSERT INTO `creature_addon` (`guid`,`path_id`,`bytes2`,`mount`,`auras`) VALUES (@NPC,@PATH,1,0, '52574');
+DELETE FROM `waypoint_data` WHERE `id`=@PATH;
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`delay`,`move_flag`,`action`,`action_chance`,`wpguid`) VALUES
+(@PATH,1,6320.923,-4130.368,458.9318,0,0,0,100,0),
+(@PATH,2,6303.191,-4100.656,458.9318,0,0,0,100,0),
+(@PATH,3,6275.148,-4083.311,458.9212,0,0,0,100,0),
+(@PATH,4,6237.833,-4079.906,459.0136,0,0,0,100,0),
+(@PATH,5,6215.262,-4070.717,459.0136,0,0,0,100,0),
+(@PATH,6,6190.383,-4078.323,459.0136,0,0,0,100,0),
+(@PATH,7,6174.816,-4074.354,459.0981,0,0,0,100,0),
+(@PATH,8,6190.383,-4078.323,459.0136,0,0,0,100,0),
+(@PATH,9,6215.262,-4070.717,459.0136,0,0,0,100,0),
+(@PATH,10,6237.833,-4079.906,459.0136,0,0,0,100,0),
+(@PATH,11,6275.148,-4083.311,458.9212,0,0,0,100,0),
+(@PATH,12,6303.191,-4100.656,458.9318,0,0,0,100,0);
+
+-- Pathing for Claw of Har'koa Entry: 28402
+SET @NPC := 83027;
+SET @PATH := @NPC * 10;
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=5493.606,`position_y`=-3712.333,`position_z`=362.6227 WHERE `guid`=@NPC;
+DELETE FROM `creature_addon` WHERE `guid`=@NPC;
+INSERT INTO `creature_addon` (`guid`,`path_id`,`bytes2`,`mount`,`auras`) VALUES (@NPC,@PATH,1,0, '');
+DELETE FROM `waypoint_data` WHERE `id`=@PATH;
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`delay`,`move_flag`,`action`,`action_chance`,`wpguid`) VALUES
+(@PATH,1,5493.606,-3712.333,362.6227,0,0,0,100,0),
+(@PATH,2,5488.515,-3736.998,361.9892,0,0,0,100,0),
+(@PATH,3,5476.753,-3750.571,361.9892,0,0,0,100,0),
+(@PATH,4,5461.006,-3767.059,362.002,0,0,0,100,0),
+(@PATH,5,5443.998,-3774.203,361.9609,0,0,0,100,0),
+(@PATH,6,5421.117,-3781.667,361.9677,0,0,0,100,0),
+(@PATH,7,5398.986,-3767.582,361.9875,0,0,0,100,0),
+(@PATH,8,5370.875,-3741.746,360.2243,0,0,0,100,0),
+(@PATH,9,5354.693,-3725.205,360.0981,0,0,0,100,0),
+(@PATH,10,5326.64,-3697.498,362.1892,0,0,0,100,0),
+(@PATH,11,5322.16,-3670.425,362.0858,0,0,0,100,0),
+(@PATH,12,5332.216,-3656.184,361.9609,0,0,0,100,0),
+(@PATH,13,5356.117,-3639.557,361.9609,0,0,0,100,0),
+(@PATH,14,5390.954,-3622.599,361.9609,0,0,0,100,0),
+(@PATH,15,5416.427,-3639.384,361.9608,0,0,0,100,0),
+(@PATH,16,5440.461,-3661.758,361.9644,0,0,0,100,0),
+(@PATH,17,5468.425,-3688.130,361.9646,0,0,0,100,0);
diff --git a/sql/updates/world/2013_01_03_00_world_gameobject_scripts.sql b/sql/updates/world/2013_01_03_00_world_gameobject_scripts.sql
new file mode 100644
index 00000000000..32faf4b03a0
--- /dev/null
+++ b/sql/updates/world/2013_01_03_00_world_gameobject_scripts.sql
@@ -0,0 +1,6 @@
+-- the brazier should summon multiple bosses, this is part of
+-- an instance encounter and should be handled via cpp
+DELETE FROM `gameobject_scripts` WHERE `id` IN (28704,21608,21609,21610);
+DELETE FROM gameobject WHERE guid IN (21608,21609,21610);
+-- while at it, fix startup issue with npc 3939
+UPDATE `creature` SET `MovementType`=0 WHERE `id`=3939;
diff --git a/sql/updates/world/2013_01_03_01_world_sai.sql b/sql/updates/world/2013_01_03_01_world_sai.sql
new file mode 100644
index 00000000000..9e0e56eb645
--- /dev/null
+++ b/sql/updates/world/2013_01_03_01_world_sai.sql
@@ -0,0 +1,7 @@
+DELETE FROM `gameobject_scripts` WHERE `id`=47301;
+UPDATE `gameobject_template` SET `AIName`='SmartGameObjectAI' WHERE `entry`=185512;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=185512 AND `source_type`=1;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=18551200 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
+(185512,1,0,0,70,0,100,0,2,0,0,0,80,18551200,0,0,0,0,0,1,0,0,0,0,0,0,0, 'Stasis Chamber Alpha - On Activate - Start Script'),
+(18551200,9,0,0,0,0,100,0,10000,10000,0,0,12,22920,1,300000,0,1,0,8,0,0,0,3989.02,6071.37,266.41,3.72,'Script - After 10s - Summon Thuk the Defiant');
diff --git a/sql/updates/world/2013_01_03_02_world_sai.sql b/sql/updates/world/2013_01_03_02_world_sai.sql
new file mode 100644
index 00000000000..ecd84c96800
--- /dev/null
+++ b/sql/updates/world/2013_01_03_02_world_sai.sql
@@ -0,0 +1,10 @@
+DELETE FROM `gameobject_scripts` WHERE `id` IN (43177,44809,44811,45625,45428,61664);
+UPDATE `gameobject_template` SET `AIName`='SmartGameObjectAI' WHERE `entry` IN (193020,175432,176767,101852,101853,177385);
+DELETE FROM `smart_scripts` WHERE `entryorguid` IN (193020,175432,176767,101852,101853,177385) 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
+(193020,1,0,0,70,0,100,0,2,0,0,0,9,0,0,0,0,0,0,14,61606,193019,0,0,0,0,0, 'Lever - On activate - Activate The Violet Hold'),
+(175432,1,0,0,70,0,100,0,2,0,0,0,9,0,0,0,0,0,0,14,45626,175369,0,0,0,0,0, ' - On activate - Activate Elders Square Service Entrance'),
+(176767,1,0,0,70,0,100,0,2,0,0,0,9,0,0,0,0,0,0,14,45427,174626,0,0,0,0,0, 'Torch - On activate - Activate Scholomance Door'),
+(101852,1,0,0,70,0,100,0,2,0,0,0,9,0,0,0,0,0,0,14,15013,101851,0,0,0,0,0, 'Lever - On activate - Activate Armory Door'),
+(101853,1,0,0,70,0,100,0,2,0,0,0,9,0,0,0,0,0,0,14,15012,101850,0,0,0,0,0, 'Lever - On activate - Activate Cathedral Door'),
+(177385,1,0,0,70,0,100,0,2,0,0,0,9,0,0,0,0,0,0,14,43178,175610,0,0,0,0,0, 'Torch - On activate - Activate Door');
diff --git a/sql/updates/world/2013_01_03_03_world_spelldifficulty_dbc.sql b/sql/updates/world/2013_01_03_03_world_spelldifficulty_dbc.sql
new file mode 100644
index 00000000000..6a41f705491
--- /dev/null
+++ b/sql/updates/world/2013_01_03_03_world_spelldifficulty_dbc.sql
@@ -0,0 +1,3 @@
+DELETE FROM `spelldifficulty_dbc` WHERE `id`=62166 OR `spellid0`=62166;
+INSERT INTO `spelldifficulty_dbc`(`id`,`spellid0`,`spellid1`) VALUES
+(62166,62166,63981); -- Stone Grip
diff --git a/sql/updates/world/2013_01_03_04_world_sai.sql b/sql/updates/world/2013_01_03_04_world_sai.sql
new file mode 100644
index 00000000000..ccac9266af2
--- /dev/null
+++ b/sql/updates/world/2013_01_03_04_world_sai.sql
@@ -0,0 +1,14 @@
+UPDATE `gameobject` SET `position_x`=-113.4616,`position_y`=2165.083,`position_z`=156.7546,`orientation`=1.195702,`rotation0`=0.6946974,`rotation1`=-0.1318922,`rotation2`=0.6946964,`rotation3`=0.1318972,`spawntimesecs`=7200,`animprogress`=255 WHERE `guid`=32480;
+
+DELETE FROM `gameobject_scripts` WHERE `id` IN (32260,32378,32480,32625,32442,32443,32444,34006);
+UPDATE `gameobject_template` SET `AIName`='SmartGameObjectAI' WHERE `entry` IN (18900,18901,18899,90567,101811,101812,101855,185501);
+DELETE FROM `smart_scripts` WHERE `entryorguid` IN (18900,18901,18899,90567,101811,101812,101855,185501) 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
+( 18900,1,0,0,70,0,100,0,2,0,0,0,9,0,0,0,0,0,0,14,32445,18934,0,0,0,0,0, 'Lever - On activate - Activate Cell Door'),
+( 18901,1,0,0,70,0,100,0,2,0,0,0,9,0,0,0,0,0,0,14,33219,18936,0,0,0,0,0, 'Lever - On activate - Activate Cell Door'),
+( 18899,1,0,0,70,0,100,0,2,0,0,0,9,0,0,0,0,0,0,14,33241,18971,0,0,0,0,0, 'Lever - On activate - Activate Arugals Lair'),
+( 90567,1,0,0,70,0,100,0,2,0,0,0,9,0,0,0,0,0,0,14,32373,90566,0,0,0,0,0, 'Lever - On activate - Activate Workshop Door'),
+(101811,1,0,0,70,0,100,0,2,0,0,0,9,0,0,0,0,0,0,14,32446,18935,0,0,0,0,0, 'Lever - On activate - Activate Cell Door'),
+(101812,1,0,0,70,0,100,0,2,0,0,0,9,0,0,0,0,0,0,14,20835,18895,0,0,0,0,0, 'Lever - On activate - Activate Courtyard Door'),
+(101855,1,0,0,70,0,100,0,2,0,0,0,9,0,0,0,0,0,0,14,32250,101854,0,0,0,0,0, 'Lever - On activate - Activate Herods Door'),
+(185501,1,0,0,70,0,100,0,2,0,0,0,9,0,0,0,0,0,0,14,25064,184212,0,0,0,0,0, 'Waterfall Control Console - On activate - Activate Waterfall');
diff --git a/sql/updates/world/2013_01_03_05_world_sai.sql b/sql/updates/world/2013_01_03_05_world_sai.sql
new file mode 100644
index 00000000000..9e5537835ff
--- /dev/null
+++ b/sql/updates/world/2013_01_03_05_world_sai.sql
@@ -0,0 +1,8 @@
+DELETE FROM `gameobject_scripts` WHERE `id`=15351;
+UPDATE `gameobject_template` SET `AIName`='SmartGameObjectAI' WHERE `entry`=161460;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=161460 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
+(161460,1,0,1,70,0,100,0,2,0,0,0,9,0,0,0,0,0,0,14,15639,161461,0,0,0,0,0, 'Shadowforge Lock - On Activate - Open the Giant Door Mechanism'),
+(161460,1,1,2,61,0,100,0,0,0,0,0,9,0,0,0,0,0,0,14,15576,157923,0,0,0,0,0, 'Shadowforge Lock - On Activate - Close the Giant Doors'),
+(161460,1,2,3,61,0,100,0,0,0,0,0,9,0,0,0,0,0,0,14,15640,161462,0,0,0,0,0, 'Shadowforge Lock - On Activate - Remove the great invisible wall'),
+(161460,1,3,0,61,0,100,0,0,0,0,0,9,0,0,0,0,0,0,14,15352,161516,0,0,0,0,0, 'Shadowforge Lock - On Activate - Remove the invisible wall on top');
diff --git a/sql/updates/world/2013_01_03_06_world_sai.sql b/sql/updates/world/2013_01_03_06_world_sai.sql
new file mode 100644
index 00000000000..e77122e908e
--- /dev/null
+++ b/sql/updates/world/2013_01_03_06_world_sai.sql
@@ -0,0 +1,11 @@
+DELETE FROM `gameobject_scripts` WHERE `id` IN (24397,24398,25980,26188,26192);
+UPDATE `gameobject_template` SET `AIName`='SmartGameObjectAI' WHERE `entry` IN (101831,101832,101833,101834,183517,183518,185123);
+DELETE FROM `smart_scripts` WHERE `entryorguid` IN (101831,101832,101833,101834,183517,183518,185123) 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
+(101831,1,0,0,70,0,100,0,2,0,0,0,9,0,0,0,0,0,0,14,30533,13965,0,0,0,0,0, 'Door Lever - On activate - Activate Factory Door'),
+(101832,1,0,0,70,0,100,0,2,0,0,0,9,0,0,0,0,0,0,14,26185,17153,0,0,0,0,0, 'Door Lever - On activate - Activate Heavy Door'),
+(101833,1,0,0,70,0,100,0,2,0,0,0,9,0,0,0,0,0,0,14,30534,16397,0,0,0,0,0, 'Door Lever - On activate - Activate Iron Clad Door'),
+(101834,1,0,0,70,0,100,0,2,0,0,0,9,0,0,0,0,0,0,14,26182,17153,0,0,0,0,0, 'Door Lever - On activate - Activate Heavy Door'),
+(183517,1,0,0,70,0,100,0,2,0,0,0,9,0,0,0,0,0,0,14,25826,184912,0,0,0,0,0, 'Lever - On activate - Activate The Shattered Halls'),
+(183518,1,0,0,70,0,100,0,2,0,0,0,9,0,0,0,0,0,0,14,24141,183294,0,0,0,0,0, 'Lever - On activate - Activate The Shadow Labyrinth'),
+(185123,1,0,0,70,0,100,0,2,0,0,0,9,0,0,0,0,0,0,14,25083,184246,0,0,0,0,0, 'Lever - On activate - Activate Heavy Iron Portcullis');
diff --git a/sql/updates/world/2013_01_03_07_world_sai.sql b/sql/updates/world/2013_01_03_07_world_sai.sql
new file mode 100644
index 00000000000..35a03b9078c
--- /dev/null
+++ b/sql/updates/world/2013_01_03_07_world_sai.sql
@@ -0,0 +1,6 @@
+DELETE FROM `gameobject_scripts` WHERE `id` IN (12609,26185,30534);
+DELETE FROM `smart_scripts` WHERE `entryorguid`=177673 AND `source_type`=1;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=17767300 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
+(177673,1,0,0,70,0,100,0,2,0,0,0,80,17767300,2,0,0,0,0,1,0,0,0,0,0,0,0, 'Serpent Statue - On activate - Start Script'),
+(17767300,9,0,0,1,0,100,0,2000,2000,0,0,12,12369,1,300000,0,1,0,8,0,0,0,251.381,2962.47,2.76527,0.860446, 'Serpent Statue - After 2s - Summon Lord Kragaru');
diff --git a/sql/updates/world/2013_01_03_08_world_misc.sql b/sql/updates/world/2013_01_03_08_world_misc.sql
new file mode 100644
index 00000000000..816b4b4dcf6
--- /dev/null
+++ b/sql/updates/world/2013_01_03_08_world_misc.sql
@@ -0,0 +1,2 @@
+-- remove the leverscript not non-existing doorscripts!
+DELETE FROM `gameobject_scripts` WHERE `id` IN (26206,26197);
diff --git a/sql/updates/world/2013_01_03_09_world_sai.sql b/sql/updates/world/2013_01_03_09_world_sai.sql
new file mode 100644
index 00000000000..c15eeb88843
--- /dev/null
+++ b/sql/updates/world/2013_01_03_09_world_sai.sql
@@ -0,0 +1,81 @@
+-- Servant of the Throne [SAI]
+SET @ENTRY := 36724;
+SET @SOURCETYPE := 0;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=@SOURCETYPE;
+UPDATE creature_template SET AIName='SmartAI' WHERE entry=@ENTRY LIMIT 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,@SOURCETYPE,3,0,0,0,100,30,5000,7000,5000,9000,11,70980,0,0,0,0,0,4,0,0,0,0,0,0,0, 'Cast Web Wrap'),
+(@ENTRY,@SOURCETYPE,1,0,0,0,100,0,3000,6000,6000,12000,11,71029,0,0,0,0,0,2,0,0,0,0.0,0.0,0.0,0.0,'Cast Glacial Blast');
+-- Ancient Skeletal Soldier
+SET @ENTRY := 37012;
+SET @SOURCETYPE := 0;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=@SOURCETYPE;
+UPDATE creature_template SET AIName='SmartAI' WHERE entry=@ENTRY LIMIT 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,3,0,0,0,100,30,5000,7000,5000,9000,11,70980,0,0,0,0,0,4,0,0,0,0,0,0,0, 'Cast Web Wrap'),
+(@ENTRY,@SOURCETYPE,0,0,0,0,100,0,3000,6000,6000,8000,11,70964,2,0,0,0,0,2,0,0,0,0.0,0.0,0.0,0.0,'Cast Shield Bash(70964)');
+-- Nerub'ar Broodkeeper
+SET @ENTRY := 36725;
+SET @SOURCETYPE :=0;
+UPDATE creature_template SET AIName='SmartAI', ScriptName='' WHERE entry=@ENTRY;
+DELETE FROM creature_ai_scripts WHERE creature_id=@ENTRY;
+DELETE FROM smart_scripts WHERE source_type=0 AND entryorguid=@ENTRY;
+INSERT INTO smart_scripts (entryorguid,source_type,id,link,event_type,event_phase_mask,event_chance,event_flags,event_param1,event_param2,event_param3,event_param4,action_type,action_param1,action_param2,action_param3,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,@SOURCETYPE,1,0,10,0,100,30,1,60,1000,1000,38,0,0,0,0,0,0,1,0,0,0,0,0,0,0, 'Nerub''ar Broodkeeper - On LOS - Zone Combat Pulse'),
+(@ENTRY,@SOURCETYPE,2,0,0,0,100,30,5000,7000,5000,9000,11,70965,0,0,0,0,0,4,0,0,0,0,0,0,0, 'Nerub''ar Broodkeeper - In Combat - Cast Crypt Scarabs'),
+(@ENTRY,@SOURCETYPE,3,0,0,0,100,30,5000,7000,5000,9000,11,70980,0,0,0,0,0,4,0,0,0,0,0,0,0, 'Nerub''ar Broodkeeper - In Combat - Cast Web Wrap'),
+(@ENTRY,@SOURCETYPE,4,0,14,0,100,30,5000,30,8000,13000,11,36725,0,0,0,0,0,7,0,0,0,0,0,0,0, 'Nerub''ar Broodkeeper - In Combat - Cast Dark Mending on Friendlies');
+-- Deathbound Ward
+SET @ENTRY := 37007;
+SET @SOURCETYPE := 0;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=@SOURCETYPE;
+UPDATE creature_template SET AIName='SmartAI' WHERE entry=@ENTRY LIMIT 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,@SOURCETYPE,0,0,0,0,100,0,3000,6000,6000,8000,11,71021,2,0,0,0,0,2,0,0,0,0.0,0.0,0.0,0.0,'Saber Lash'),
+(@ENTRY,@SOURCETYPE,1,0,0,0,100,0,6000,8000,6000,12000,11,71022,2,0,0,0,0,2,0,0,0,0.0,0.0,0.0,0.0,'Disrupting Shout');
+-- Entrance Mobs End
+-- ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+-- ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+-- Starting Mobs infront Lady Deathwhisper
+-- Deathspeaker Zealot
+SET @ENTRY := 36808;
+SET @SOURCETYPE := 0;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=@SOURCETYPE;
+UPDATE creature_template SET AIName='SmartAI' WHERE entry=@ENTRY LIMIT 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,@SOURCETYPE,0,0,0,0,100,0,3000,6000,6000,8000,11,69492,2,0,0,0,0,2,0,0,0,0.0,0.0,0.0,0.0,'Shadow Cleave');
+-- Deathspeaker Servant
+SET @ENTRY := 36805;
+SET @SOURCETYPE := 0;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=@SOURCETYPE;
+UPDATE creature_template SET AIName='SmartAI' WHERE entry=@ENTRY LIMIT 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,@SOURCETYPE,0,0,0,0,100,0,3000,6000,6000,8000,11,69576,0,0,0,0,0,2,0,0,0,0.0,0.0,0.0,0.0,'Chaos Bolt'),
+(@ENTRY,@SOURCETYPE,1,0,0,0,100,0,3000,6000,6000,8000,11,69405,0,0,0,0,0,2,0,0,0,0.0,0.0,0.0,0.0,'Consuming Shadows'),
+(@ENTRY,@SOURCETYPE,2,0,0,0,100,0,3000,6000,6000,8000,11,69404,0,0,0,0,0,2,0,0,0,0.0,0.0,0.0,0.0,'Curse of Agony');
+-- Deathspeaker Attendant
+SET @ENTRY := 36811;
+SET @SOURCETYPE := 0;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=@SOURCETYPE;
+UPDATE creature_template SET AIName='SmartAI' WHERE entry=@ENTRY LIMIT 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,@SOURCETYPE,0,0,0,0,100,0,3000,6000,6000,8000,11,69387,0,0,0,0,0,2,0,0,0,0.0,0.0,0.0,0.0,'Cast Shadow Bolt'),
+(@ENTRY,@SOURCETYPE,1,0,0,0,100,0,3000,6000,6000,8000,11,69355,0,0,0,0,0,18,15,0,0,0.0,0.0,0.0,0.0,'Cast Shadow Nova on 15 yard distance');
+-- Deathspeaker Disciple
+DELETE FROM smart_scripts WHERE entryorguid = 36807 AND source_type = 0;
+SET @ENTRY := 36807;
+SET @SOURCETYPE := 0;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=@SOURCETYPE;
+UPDATE creature_template SET AIName='SmartAI' WHERE entry=@ENTRY LIMIT 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, @SOURCETYPE, 0, 0, 0, 0, 100, 30, 0, 3000, 4000, 6000, 11, 69387, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 'Deathspeaker Disciple - Cast Shadow Bolt'),
+(@ENTRY, @SOURCETYPE, 1, 0, 16, 0, 100, 30, 69391, 40, 15000, 20000, 11, 69391, 1, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'Deathspeaker Disciple - Cast Dark Blessing'),
+(@ENTRY, @SOURCETYPE, 2, 0, 14, 0, 100, 30, 90000, 40, 15000, 20000, 11, 69389, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'Deathspeaker Disciple - Cast Shadow Mend');
+-- Deathspeaker High Priest [SAI]
+SET @ENTRY := 36829;
+SET @SOURCETYPE := 0;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=@SOURCETYPE;
+UPDATE creature_template SET AIName='SmartAI' WHERE entry=@ENTRY LIMIT 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,@SOURCETYPE,0,0,0,0,100,0,3000,6000,10000,15000,11,69483,2,0,0,0,0,2,0,0,0,0.0,0.0,0.0,0.0,'Cast Dark Reckoning'),
+(@ENTRY,@SOURCETYPE,1,0,32,0,100,1,0,10000,0,0,11,69491,2,0,0,0,0,1,0,0,0,0.0,0.0,0.0,0.0,'Cast Aura of Darkness On Self'); -- when combat starts
diff --git a/sql/updates/world/2013_01_03_10_world_gameobject.sql b/sql/updates/world/2013_01_03_10_world_gameobject.sql
new file mode 100644
index 00000000000..11700da1dc9
--- /dev/null
+++ b/sql/updates/world/2013_01_03_10_world_gameobject.sql
@@ -0,0 +1,4 @@
+-- Issue 8693 Invincible Grave Plaque
+DELETE FROM `gameobject` WHERE `guid`=364;
+INSERT INTO `gameobject` (`guid`,`id`,`map`,`spawnMask`,`phaseMask`,`position_x`,`position_y`,`position_z`,`orientation`,`rotation0`,`rotation1`,`rotation2`,`rotation3`,`spawntimesecs`,`animprogress`,`state`) VALUES
+(364,192835,0,1,1,2044.38,-520.9688,46.01406,-3.097385,0,0,0,1,120,255,1);
diff --git a/sql/updates/world/2013_01_03_11_world_item_template.sql b/sql/updates/world/2013_01_03_11_world_item_template.sql
new file mode 100644
index 00000000000..df0bd5cd1e7
--- /dev/null
+++ b/sql/updates/world/2013_01_03_11_world_item_template.sql
@@ -0,0 +1,2 @@
+-- make sure timers are real-time via flagsCustom
+UPDATE `item_template` SET `flagsCustom`=`flagsCustom`|1 WHERE `entry` IN(39878,44623,44625,44626,44632,44717);
diff --git a/sql/updates/world/2013_01_03_12_world_gameobject_scripts.sql b/sql/updates/world/2013_01_03_12_world_gameobject_scripts.sql
new file mode 100644
index 00000000000..aede83aa0c8
--- /dev/null
+++ b/sql/updates/world/2013_01_03_12_world_gameobject_scripts.sql
@@ -0,0 +1,2 @@
+DROP TABLE `gameobject_scripts`;
+DELETE FROM `command` WHERE `name`='reload gameobject_scripts';
diff --git a/sql/updates/world/2013_01_03_12_world_misc.sql b/sql/updates/world/2013_01_03_12_world_misc.sql
new file mode 100644
index 00000000000..79d2e2daea9
--- /dev/null
+++ b/sql/updates/world/2013_01_03_12_world_misc.sql
@@ -0,0 +1,3 @@
+-- Fix startup errors:
+-- Set correct questid for Many Wyrm
+UPDATE `smart_scripts` SET `action_param1`=8346 WHERE `entryorguid` IN (15273,15274,15294,15298) AND `source_type`=0 AND `id` IN (0,1);
diff --git a/sql/updates/world/2013_01_03_13_world_quest_template.sql b/sql/updates/world/2013_01_03_13_world_quest_template.sql
new file mode 100644
index 00000000000..12adb1e94ba
--- /dev/null
+++ b/sql/updates/world/2013_01_03_13_world_quest_template.sql
@@ -0,0 +1,3 @@
+UPDATE `quest_template` SET `PrevQuestId`=7022 WHERE `Id`=7025; -- Treats for Greatfather Winter (7025) Alliance version
+UPDATE `quest_template` SET `RequiredRaces`=690,`PrevQuestId`=7021 WHERE `Id`=6962; -- Treats for Great-father Winter (6962) Horde version
+UPDATE `quest_template` SET `ExclusiveGroup`=7021 WHERE `Id`=6961; -- Great-father Winter is Here!
diff --git a/sql/updates/world/2013_01_03_14_world_spell_area.sql b/sql/updates/world/2013_01_03_14_world_spell_area.sql
new file mode 100644
index 00000000000..352fe0e9d85
--- /dev/null
+++ b/sql/updates/world/2013_01_03_14_world_spell_area.sql
@@ -0,0 +1,4 @@
+-- add aura to be able to hand in quests
+DELETE FROM `spell_area` WHERE `spell`=52217;
+INSERT INTO `spell_area` (`spell`,`area`,`quest_start`,`quest_end`,`aura_spell`,`racemask`,`gender`,`autocast`,`quest_start_status`,`quest_end_status`) VALUES
+(52217,4306,12574,0,0,0,2,1,1,64);
diff --git a/sql/updates/world/2013_01_03_15_world_various_fixes.sql b/sql/updates/world/2013_01_03_15_world_various_fixes.sql
new file mode 100644
index 00000000000..d3db9afa6e5
--- /dev/null
+++ b/sql/updates/world/2013_01_03_15_world_various_fixes.sql
@@ -0,0 +1,73 @@
+-- Issue 7541: Shambling Horror immunities
+UPDATE `creature_template` SET `mechanic_immune_mask`=`mechanic_immune_mask`|1|2|4|8|16|64|512|1024|4096|8192|65536|131072|524288|4194304|536870912 WHERE `entry`=37698;
+
+-- Issue 7436: Ground bound Highperch
+-- Highperch Soarer
+SET @NPC := 21708;
+SET @PATH := @NPC*10;
+UPDATE `creature_template` SET `InhabitType`=4 WHERE `entry`=6139;
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=-5155.09,`position_y`=-1194.89,`position_z`=73.70869 WHERE `guid`=@NPC;
+UPDATE `creature_addon` SET `path_id`=@PATH WHERE `guid`=@NPC;
+DELETE FROM `waypoint_data` WHERE `id`=@PATH;
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`delay`,`move_flag`,`action`,`action_chance`,`wpguid`) VALUES
+(@PATH,1,-5155.09,-1194.89,73.70869,0,0,0,100,0),
+(@PATH,2,-5155.986,-1199.748,81.49023,0,0,0,100,0),
+(@PATH,3,-5166.314,-1220.043,81.76808,0,0,0,100,0),
+(@PATH,4,-5170.551,-1226.347,76.71234,0,0,0,100,0),
+(@PATH,5,-5178.024,-1237.037,72.43468,0,0,0,100,0),
+(@PATH,6,-5190.296,-1239.181,71.90687,0,0,0,100,0),
+(@PATH,7,-5215.796,-1225.133,69.76797,0,0,0,100,0),
+(@PATH,8,-5221.52,-1209.387,67.79574,0,0,0,100,0),
+(@PATH,9,-5219.366,-1194.92,67.15694,0,0,0,100,0),
+(@PATH,10,-5209.852,-1187.224,65.96239,0,0,0,100,0),
+(@PATH,11,-5194.886,-1188.915,70.71236,0,0,0,100,0),
+(@PATH,12,-5181.055,-1199.332,60.29574,0,0,0,100,0),
+(@PATH,13,-5158.846,-1213.597,57.6291,0,0,0,100,0),
+(@PATH,14,-5122.129,-1222.279,42.46242,0,0,0,100,0),
+(@PATH,15,-5110.988,-1230.767,15.32349,0,0,0,100,0),
+(@PATH,16,-5084.673,-1227.625,-11.81538,0,0,0,100,0),
+(@PATH,17,-5065.282,-1209.691,-34.89864,0,0,0,100,0),
+(@PATH,18,-5052.477,-1181.261,-39.42649,0,0,0,100,0),
+(@PATH,19,-5025.058,-1165.288,-32.56528,0,0,0,100,0),
+(@PATH,20,-5004.282,-1140.431,-38.3154,0,0,0,100,0),
+(@PATH,21,-4984.813,-1123.683,-38.17639,0,0,0,100,0),
+(@PATH,22,-4971.478,-1109.776,-38.17639,0,0,0,100,0),
+(@PATH,23,-4949.74,-1096.296,-32.42633,0,0,0,100,0),
+(@PATH,24,-4927.954,-1090.275,-24.84298,0,0,0,100,0),
+(@PATH,25,-4909.837,-1080.728,-14.0652,0,0,0,100,0),
+(@PATH,26,-4914.713,-1066.641,-7.898551,0,0,0,100,0),
+(@PATH,27,-4927.922,-1056.954,-3.352009,0,0,0,100,0),
+(@PATH,28,-4942.696,-1055.217,8.220422,0,0,0,100,0),
+(@PATH,29,-4951.954,-1049.145,14.62554,0,0,0,100,0),
+(@PATH,30,-4960.176,-1028.92,20.03323,0,0,0,100,0),
+(@PATH,31,-4970.474,-1008.432,22.08879,0,0,0,100,0),
+(@PATH,32,-4980.969,-992.9671,23.42848,0,0,0,100,0),
+(@PATH,33,-4993.734,-980.054,23.75917,0,0,0,100,0),
+(@PATH,34,-5012.753,-967.9377,24.0925,0,0,0,100,0),
+(@PATH,35,-5032.862,-971.138,30.92584,0,0,0,100,0),
+(@PATH,36,-5052.127,-982.1085,39.0092,0,0,0,100,0),
+(@PATH,37,-5060.675,-991.1913,52.28708,0,0,0,100,0),
+(@PATH,38,-5072.277,-1008.99,67.84268,0,0,0,100,0),
+(@PATH,39,-5090.256,-1005.558,79.18673,0,0,0,100,0),
+(@PATH,40,-5106.005,-1004.311,73.88409,0,0,0,100,0);
+
+-- Issue 8639: Eyes of the Eagle
+-- Talonshrike's Egg
+SET @ENTRY := 186814;
+SET @SOURCETYPE := 1;
+UPDATE gameobject_template SET AIName="SmartGameObjectAI" WHERE entry IN(186814,190283);
+UPDATE creature_template SET AIName="SmartAI" WHERE entry=24518;
+DELETE FROM `smart_scripts` WHERE `entryorguid`IN(186814,190283) AND `source_type`=1;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=24518 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
+-- first egg
+(186814,1,0,0,70,0,100,0,2,0,0,0,45,0,1,0,0,0,0,11,24518,500,0,0.0,0.0,0.0,0.0,"ON egg USE notify Talonshrike"),
+(186814,1,1,0,70,0,100,0,2,0,0,0,45,0,2,0,0,0,0,11,24518,500,0,0.0,0.0,0.0,0.0,"ON egg USE notify Talonshrike to set attackable"),
+-- second egg
+(190283,1,0,0,70,0,100,0,2,0,0,0,45,0,1,0,0,0,0,11,24518,500,0,0.0,0.0,0.0,0.0,"ON egg USE notify Talonshrike"),
+(190283,1,1,0,70,0,100,0,2,0,0,0,45,0,2,0,0,0,0,11,24518,500,0,0.0,0.0,0.0,0.0,"ON egg USE notify Talonshrike to set attackable"),
+-- Talonshrike
+(24518,0,0,0,38,0,100,0,0,1,0,0,69,0,0,0,0,0,0,8,0,0,0,1597.4,-3903.79,79.702,0.0,"ON notification fly TO nest"),
+(24518,0,1,0,0,0,100,0,5000,5000,10000,12000,11,49865,0,0,0,0,0,2,0,0,0,0.0,0.0,0.0,0.0," USE Eye Peck"),
+(24518,0,2,0,0,0,100,0,3000,3000,5000,7000,11,32909,0,0,0,0,0,2,0,0,0,0.0,0.0,0.0,0.0," USE Talon Strike"),
+(24518,0,3,0,38,0,100,0,0,2,0,0,19,256,0,0,0,0,0,1, 0, 0, 0, 0, 0, 0, 0, "Talonshrike - On notification - Remove UNIT_FLAG_IMMUNE_TO_PC");
diff --git a/sql/updates/world/2013_01_03_16_world_various_fixes.sql b/sql/updates/world/2013_01_03_16_world_various_fixes.sql
new file mode 100644
index 00000000000..bc5f4f4b6ec
--- /dev/null
+++ b/sql/updates/world/2013_01_03_16_world_various_fixes.sql
@@ -0,0 +1,8 @@
+-- NPC talk text convert from creature_ai_text. Moving boss to cpp.
+UPDATE `creature_template` SET `minlevel`=63,`maxlevel`=63,`InhabitType`=5,`AIName`= '', `ScriptName`= 'boss_kirtonos_the_herald' WHERE `entry`=10506;
+UPDATE `gameobject_template` SET `AIName`= '', `ScriptName`= 'go_brazier_of_the_herald' WHERE `entry`=175564;
+DELETE FROM `creature_ai_scripts` WHERE `creature_id`=10506;
+DELETE FROM `creature_ai_texts` WHERE `entry`=-448;
+DELETE FROM `creature_text` WHERE `entry` IN (10506);
+INSERT INTO `creature_text` (`entry`,`groupid`,`id`,`text`,`type`,`language`,`probability`,`emote`,`duration`,`sound`,`comment`) VALUES
+(10506,0,0, '%s lets out a shrill cry.',16,0,100,0,0,0, 'Kirtonos The Herald - Emote');
diff --git a/sql/updates/world/2013_01_04_00_world_creature_text.sql b/sql/updates/world/2013_01_04_00_world_creature_text.sql
new file mode 100644
index 00000000000..ae38180e1ac
--- /dev/null
+++ b/sql/updates/world/2013_01_04_00_world_creature_text.sql
@@ -0,0 +1,3 @@
+DELETE FROM `creature_text` WHERE `entry`=4295;
+INSERT INTO `creature_text`(`entry`,`text`,`type`,`language`,`comment`) VALUES
+(4295,"There is no escape for you. The Crusade shall destroy all who carry the scourge's taint.",12,7,"Scarlet Myrmidon - Talk on low HP");
diff --git a/sql/updates/world/2013_01_04_01_world_sai.sql b/sql/updates/world/2013_01_04_01_world_sai.sql
new file mode 100644
index 00000000000..8e7127e5728
--- /dev/null
+++ b/sql/updates/world/2013_01_04_01_world_sai.sql
@@ -0,0 +1,38 @@
+-- Arcane Wraith SAI
+SET @ENTRY := 15273;
+UPDATE `creature_template` SET `AIName`='SmartAI' WHERE `entry`=@ENTRY;
+DELETE FROM `creature_ai_scripts` WHERE `creature_id`=@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,28730,0,0,0,27,15468,28730,0,0,0,0,7,0,0,0,0,0,0,0,"Arcane Wraith - On Spellhit Arcane Torrent - Quest Credit"),
+(@ENTRY,0,1,0,8,0,100,1,25046,0,0,0,27,15468,28730,0,0,0,0,7,0,0,0,0,0,0,0,"Arcane Wraith - On Spellhit Arcane Torrent - Quest Credit"),
+(@ENTRY,0,2,0,0,0,100,0,10100,16500,12700,24800,11,37361,0,0,0,0,0,2,0,0,0,0,0,0,0,"Arcane Wraith - In Combat - Cast Arcane Bolt");
+
+-- Mana Wyrm SAI
+SET @ENTRY := 15274;
+UPDATE `creature_template` SET `AIName`='SmartAI' WHERE `entry`=@ENTRY;
+DELETE FROM `creature_ai_scripts` WHERE `creature_id`=@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,28730,0,0,0,27,15468,28730,0,0,0,0,7,0,0,0,0,0,0,0,"Mana Wyrm - On Spellhit Arcane Torrent - Quest Credit"),
+(@ENTRY,0,1,0,8,0,100,1,25046,0,0,0,27,15468,28730,0,0,0,0,7,0,0,0,0,0,0,0,"Mana Wyrm - On Spellhit Arcane Torrent - Quest Credit");
+
+-- Feral Tender SAI
+SET @ENTRY := 15294;
+UPDATE `creature_template` SET `AIName`='SmartAI' WHERE `entry`=@ENTRY;
+DELETE FROM `creature_ai_scripts` WHERE `creature_id`=@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,28730,0,0,0,27,15468,28730,0,0,0,0,7,0,0,0,0,0,0,0,"Feral Tender - On Spellhit Arcane Torrent - Quest Credit"),
+(@ENTRY,0,1,0,8,0,100,1,25046,0,0,0,27,15468,28730,0,0,0,0,7,0,0,0,0,0,0,0,"Feral Tender - On Spellhit Arcane Torrent - Quest Credit"),
+(@ENTRY,0,2,0,2,0,100,0,0,50,15300,22900,11,31325,0,0,0,0,0,1,0,0,0,0,0,0,0,"Feral Tender - At 50% HP - Cast Renew");
+
+-- Tainted Arcane Wraith SAI
+SET @ENTRY := 15298;
+UPDATE `creature_template` SET `AIName`='SmartAI' WHERE `entry`=@ENTRY;
+DELETE FROM `creature_ai_scripts` WHERE `creature_id`=@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,28730,0,0,0,27,15468,28730,0,0,0,0,7,0,0,0,0,0,0,0,"Tainted Arcane Wraith - On Spellhit Arcane Torrent - Quest Credit"),
+(@ENTRY,0,1,0,8,0,100,1,25046,0,0,0,27,15468,28730,0,0,0,0,7,0,0,0,0,0,0,0,"Tainted Arcane Wraith - On Spellhit Arcane Torrent - Quest Credit"),
+(@ENTRY,0,2,0,0,0,100,0,9000,18800,21100,32200,11,25603,0,0,0,0,0,2,0,0,0,0,0,0,0,"Tainted Arcane Wraith - In Combat - Cast Slow");
diff --git a/sql/updates/world/2013_01_04_02_world_misc.sql b/sql/updates/world/2013_01_04_02_world_misc.sql
new file mode 100644
index 00000000000..6833a22ff23
--- /dev/null
+++ b/sql/updates/world/2013_01_04_02_world_misc.sql
@@ -0,0 +1,29 @@
+-- Add Gossip for Harrison Jones
+UPDATE `creature_template` SET `gossip_menu_id`=8932 WHERE `entry`=24358;
+DELETE FROM `gossip_menu` WHERE `entry`=8932 AND `text_id`=12135;
+INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (8932,12135);
+DELETE FROM `gossip_menu_option` WHERE `menu_id`=8932 AND `id`=0;
+INSERT INTO `gossip_menu_option` (`menu_id`,`id`,`option_icon`,`option_text`,`option_id`,`npc_option_npcflag`) VALUES
+(8932,0,0, 'Thanks for the concern, but we intend to explore Zul''Aman.',1,1);
+
+-- Pathing for Harrison Jones Entry: 24358
+SET @NPC := 86177;
+SET @PATH := @NPC * 10;
+DELETE FROM `waypoint_data` WHERE `id`IN (@PATH,@PATH+1,@PATH+2);
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`delay`,`move_flag`,`action`,`action_chance`,`wpguid`) VALUES
+(@PATH,1,112.1772,1670.18,42.02158,0,0,0,100,0),
+(@PATH,2,82.44975,1655.312,42.02155,0,0,0,100,0),
+(@PATH,3,114.1627,1661.469,42.02158,0,0,0,100,0),
+(@PATH,4,131.8243,1644.853,42.0216,0,0,0,100,0),
+(@PATH+1,1,121.897,1639.106,42.19081,0,0,0,100,0),
+(@PATH+1,2,120.8522,1637.931,42.37172,0,0,0,100,0),
+(@PATH+1,3,120.7898,1609.063,43.49005,0,0,0,100,0),
+(@PATH+2,1,120.6967,1603.713,43.4503,0,0,0,100,0);
+
+-- Text for Harrison Jones from sniff
+DELETE FROM `creature_text` WHERE `entry` IN (24358);
+INSERT INTO `creature_text` (`entry`,`groupid`,`id`,`text`,`type`,`language`,`probability`,`emote`,`duration`,`sound`,`comment`) VALUES
+(24358,0,0, 'Suit yourself. At least five of you must assist me if we''re to get inside. Follow me....',14,0,100,1,0,0, 'Harrison Jones - Gong Event Say 0'),
+(24358,1,0, 'According to my calculations, if enough of us bang the gong at once the seal on these doors will break and we can enter.',14,0,100,1,0,0, 'Harrison Jones - Gong Event Say 1'),
+(24358,2,0, 'I''ve researched this site extensively and I won''t allow any dim-witted treasure hunters to swoop in and steal what belongs in a museum. I''ll lead this charge...',14,0,100,0,0,0, 'Harrison Jones - Gong Event Say 2'),
+(24358,3,0, 'In fact, it would be best if you just stay here. You''d only get in my way....',14,0,100,0,0,0, 'Harrison Jones - Gong Event Say 3');
diff --git a/sql/updates/world/2013_01_04_02_world_novos_the_summoner.sql b/sql/updates/world/2013_01_04_02_world_novos_the_summoner.sql
new file mode 100644
index 00000000000..49f8b21e3a7
--- /dev/null
+++ b/sql/updates/world/2013_01_04_02_world_novos_the_summoner.sql
@@ -0,0 +1,63 @@
+-- Summon minions
+DELETE FROM `spell_script_names` WHERE `spell_id`=59910;
+INSERT INTO `spell_script_names`(`spell_id`,`ScriptName`) VALUE
+(59910,'spell_summon_minions');
+
+-- Heroic spells
+DELETE FROM `spelldifficulty_dbc` WHERE `id` IN (49198,49034,49037,50089,49668,51363) OR `spellid0` IN (49198,49034,49037,50089,49668,51363);
+INSERT INTO `spelldifficulty_dbc`(`id`,`spellid0`,`spellid1`) VALUES
+(49198,49198,59909), -- Arcance Blast
+(49034,49034,59854), -- Blizzard
+(49037,49037,59855), -- Frostbolt
+(50089,50089,59856), -- Wrath of Misery
+(49668,49668,59004), -- Flash of Darkness
+(51363,51363,59016); -- Shadow Bolt
+
+-- Script assignment for summoners
+UPDATE `creature_template` SET `ScriptName`='npc_crystal_channel_target',`AIName`='' WHERE `entry`=26712;
+
+-- Spawn summoner for Crystal Handlers
+SET @GUID = 40153;
+DELETE FROM `creature` WHERE `guid`=@GUID;
+INSERT INTO `creature` (`guid`, `id`, `map`, `spawnMask`, `modelid`, `position_x`, `position_y`, `position_z`, `orientation`, `spawntimesecs`, `curhealth`) VALUE
+(@GUID,26712,600,3,17188,-341.31,-724.4,28.57,3.78,3600,8982);
+
+-- Check instance script for achievement Oh Novos
+DELETE FROM `achievement_criteria_data` WHERE `criteria_id`=7361;
+INSERT INTO `achievement_criteria_data`(`criteria_id`,`type`,`ScriptName`) VALUE
+(7361,11,'achievement_oh_novos');
+
+-- Waypoints for summoned adds
+DELETE FROM `waypoint_data` WHERE `id` IN(2759700,2759800,2760000,2662700);
+INSERT INTO `waypoint_data`(`id`,`point`,`position_x`,`position_y`,`position_z`) VALUES
+(2759700,1,-379.473,-810.974,59.7612),
+(2759700,2,-379.449,-791.535,44.1756),
+(2759700,3,-379.448,-790.328,44.1756),
+(2759700,4,-379.426,-772.338,28.5884),
+(2759700,5,-379.415,-763.518,28.5884),
+(2760000,1,-376.571,-810.681,59.6673),
+(2760000,2,-375.627,-791.874,44.1756),
+(2760000,3,-375.629,-790.273,44.1434),
+(2760000,4,-375.402,-771.145,28.5895),
+(2760000,5,-375.337,-765.027,28.5895),
+(2759800,1,-382.303,-810.815,59.7628),
+(2759800,2,-382.324,-791.595,44.1756),
+(2759800,3,-382.326,-790.331,44.1746),
+(2759800,4,-383.037,-770.382,28.5884),
+(2759800,5,-383.140,-765.399,28.5884),
+(2662700,1,-346.977,-733.319,28.5838),
+(2662700,2,-363.009,-765.202,28.5907),
+(2662700,3,-378.269,-765.701,28.5893);
+
+-- SAI for Crystal Handlers and Risen Shadowcasters
+UPDATE `creature_template` SET `AIName`='SmartAI',`ScriptName`='' WHERE `entry` IN (26627,27600);
+DELETE FROM `smart_scripts` WHERE `entryorguid` IN (26627,27600) AND `source_type`=0;
+INSERT INTO `smart_scripts`(`entryorguid`,`event_type`,`event_param1`,`event_param2`,`event_param3`,`event_param4`,`action_type`,`action_param1`,`target_type`,`comment`) VALUES
+(26627,0,1000,1000,5000,5000,11,49668,2,'Crystal Handler - In fight - After 1s then every 5s - Cast Flash of Darkness - On victim'),
+(27600,0,1000,1000,5000,5000,11,51363,2,'Risen Shadowcaster - In fight - After 1s then every 5s - Cast Shadow Bolt - On victim');
+
+-- Conditions for beam spell
+DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=13 AND `SourceEntry`=52106;
+INSERT INTO `conditions`(`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`ConditionTypeOrReference`,`ConditionTarget`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`Comment`) VALUES
+(13,1,52106,31,0,3,26712,0,'Beam Channel target has to be Crystal Channel Target'),
+(13,1,52106,35,1,0, 18,1,'Beam Channel target must not be self');
diff --git a/sql/updates/world/2013_01_05_00_world_waypoints.sql b/sql/updates/world/2013_01_05_00_world_waypoints.sql
new file mode 100644
index 00000000000..4a2d273c552
--- /dev/null
+++ b/sql/updates/world/2013_01_05_00_world_waypoints.sql
@@ -0,0 +1,10 @@
+-- Pathing for Harrison Jones Entry: 24358
+SET @NPC := 86177;
+SET @PATH := @NPC * 10;
+DELETE FROM `waypoint_data` WHERE `id`IN (@PATH,@PATH+1,@PATH+2);
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`delay`,`move_flag`,`action`,`action_chance`,`wpguid`) VALUES
+(@PATH,1,131.8243,1644.853,42.0216,0,0,0,100,0),
+(@PATH+1,1,121.897,1639.106,42.19081,0,0,0,100,0),
+(@PATH+1,2,120.8522,1637.931,42.37172,0,0,0,100,0),
+(@PATH+1,3,120.7898,1609.063,43.49005,0,0,0,100,0),
+(@PATH+2,1,120.6967,1603.713,43.4503,0,0,0,100,0);
diff --git a/sql/updates/world/2013_01_06_00_world_creature_addon.sql b/sql/updates/world/2013_01_06_00_world_creature_addon.sql
new file mode 100644
index 00000000000..e4412241dce
--- /dev/null
+++ b/sql/updates/world/2013_01_06_00_world_creature_addon.sql
@@ -0,0 +1,10 @@
+-- Cleanup creature_addon and creature_template_addon
+-- we had 83 duplicate aura definitions in those
+-- Glacier Penguin (51 rows)
+DELETE FROM `creature_addon` WHERE `guid` IN (134996,134997,134998,134999,135000,135001,135002,135004,135005,135006,135007,135008,135009,135010,135011,135012,135013,135014,135015,135016,135017,135018,135025,135026,135027,135028,135029,135030,135031,135032,135033,135034,135035,135036,135037,135038,135039,135040,135041,53884,53885,53886,53887,53888,53889,53890,53891,53892,54042,54043,54044);
+-- Plagued Dragonflayer Tribesman (21 rows)
+DELETE FROM `creature_addon` WHERE `guid` IN (97517,97518,97519,97520,97521,97522,97523,97524,97526,97527,97528,97529,97530,97531,97532,97534,97535,97537,97538,97539,97541);
+DELETE FROM `creature_addon` WHERE `guid` IN (
+85036, -- Sir Marcus Barlowe
+85038, -- Captain Joseph Holley
+85053); -- Marshal Jacob Alerius
diff --git a/sql/updates/world/2013_01_06_00_world_creature_template.sql b/sql/updates/world/2013_01_06_00_world_creature_template.sql
new file mode 100644
index 00000000000..023dc88c870
--- /dev/null
+++ b/sql/updates/world/2013_01_06_00_world_creature_template.sql
@@ -0,0 +1,4 @@
+-- Add cpp script to Harrison Jones Entry: 24358
+UPDATE `creature_template` SET `AIName`= '', `ScriptName`= 'npc_harrison_jones' WHERE `entry`=24358;
+-- Remove cpp script from Strange Gong
+UPDATE `gameobject_template` SET `AIName`= '', `ScriptName`= '' WHERE `entry`=187359;
diff --git a/sql/updates/world/2013_01_06_01_world_waypoints.sql b/sql/updates/world/2013_01_06_01_world_waypoints.sql
new file mode 100644
index 00000000000..a460d33b086
--- /dev/null
+++ b/sql/updates/world/2013_01_06_01_world_waypoints.sql
@@ -0,0 +1,18 @@
+-- Pathing for Kirtonos the Herald Entry: 10506
+SET @PATH := 105061;
+DELETE FROM `waypoint_data` WHERE `id`IN (@PATH,@PATH+1,@PATH+2);
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`delay`,`move_flag`,`action`,`action_chance`,`wpguid`) VALUES
+(@PATH,1,316.7087,71.26834,104.5843,0,0,0,100,0),
+(@PATH,2,321.1605,72.80973,104.6676,0,0,0,100,0),
+(@PATH,3,332.3713,77.98991,105.8621,0,0,0,100,0),
+(@PATH,4,333.3254,86.60159,106.6399,0,0,0,100,0),
+(@PATH,5,334.1263,101.6836,106.8343,0,0,0,100,0),
+(@PATH,6,331.0458,114.5935,106.3621,0,0,0,100,0),
+(@PATH,7,329.5439,126.7019,106.1399,0,0,0,100,0),
+(@PATH,8,335.2471,136.546,105.7232,0,0,0,100,0),
+(@PATH,9,343.21,139.9459,107.6399,0,0,0,100,0),
+(@PATH,10,364.3288,140.9012,109.9454,0,0,0,100,0),
+(@PATH,11,362.676,115.6384,110.3065,0,0,0,100,0),
+(@PATH,12,341.7896,91.9439,107.1676,0,0,0,100,0),
+(@PATH,13,313.4945,93.45945,104.0565,0,0,0,100,0),
+(@PATH,14,306.3839,93.61675,104.0565,0,0,0,100,0);
diff --git a/sql/updates/world/2013_01_06_02_world_misc.sql b/sql/updates/world/2013_01_06_02_world_misc.sql
new file mode 100644
index 00000000000..8c24975754a
--- /dev/null
+++ b/sql/updates/world/2013_01_06_02_world_misc.sql
@@ -0,0 +1,12 @@
+-- Small fix to pathing for Harrison Jones
+UPDATE `waypoint_data` SET `position_y`=1642.853 WHERE `id`=861770 AND `point`=1;
+
+-- Text for Amani'shi Guardian from sniff
+DELETE FROM `creature_text` WHERE `entry` IN (23597);
+INSERT INTO `creature_text` (`entry`,`groupid`,`id`,`text`,`type`,`language`,`probability`,`emote`,`duration`,`sound`,`comment`) VALUES
+(23597,0,0, 'More intruders! Sound da alarm!',14,0,100,25,0,12104, 'Amani''shi Guardian - Gong Event Say');
+
+-- Spell condition for Cosmetic - Spear Throw
+DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=13 AND `SourceEntry`=43647;
+INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorType`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES
+(13,1,43647,0,0,31,0,3,24358,0,0,0,0, '', 'Cosmetic - Spear Throw - Harrison Jones');
diff --git a/sql/updates/world/2013_01_06_03_world_sai.sql b/sql/updates/world/2013_01_06_03_world_sai.sql
new file mode 100644
index 00000000000..1cc0962781b
--- /dev/null
+++ b/sql/updates/world/2013_01_06_03_world_sai.sql
@@ -0,0 +1,3 @@
+-- Some SAI Event flag fixes
+UPDATE `smart_scripts` SET `event_flags`=`event_flags` &~2 WHERE `entryorguid` IN (594,2529,3631,3632,3633,3655,11777,11778,11781,11782,11785,11786,12239,12240,12241,14284,14285,16354,16355,24819,25471,25472,25473,29186,29190,29199,29200,29204,29219,29454,29455,29468,32501);
+UPDATE `smart_scripts` SET `event_flags`=`event_flags` &~4 WHERE `entryorguid` IN (32501);
diff --git a/sql/updates/world/2013_01_06_04_world_misc.sql b/sql/updates/world/2013_01_06_04_world_misc.sql
new file mode 100644
index 00000000000..fb1e256fa1b
--- /dev/null
+++ b/sql/updates/world/2013_01_06_04_world_misc.sql
@@ -0,0 +1,34 @@
+-- Spell condition for Cosmetic - Spear Throw
+DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=13 AND `SourceEntry`=43647;
+INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorType`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES
+(13,1,43647,0,0,31,0,3,24375,0,0,0,0, '', 'Cosmetic - Spear Throw - Harrison Jones');
+
+-- Text for Harrison Jones from sniff
+DELETE FROM `creature_text` WHERE `entry` IN (24358,24375);
+INSERT INTO `creature_text` (`entry`,`groupid`,`id`,`text`,`type`,`language`,`probability`,`emote`,`duration`,`sound`,`comment`) VALUES
+(24358,0,0, 'Suit yourself. At least five of you must assist me if we''re to get inside. Follow me....',14,0,100,1,0,0, 'Harrison Jones - Gong Event Say 0'),
+(24358,1,0, 'According to my calculations, if enough of us bang the gong at once the seal on these doors will break and we can enter.',14,0,100,1,0,0, 'Harrison Jones - Gong Event Say 1'),
+(24375,0,0, 'I''ve researched this site extensively and I won''t allow any dim-witted treasure hunters to swoop in and steal what belongs in a museum. I''ll lead this charge...',14,0,100,0,0,0, 'Harrison Jones - Gong Event Say 2'),
+(24375,1,0, 'In fact, it would be best if you just stay here. You''d only get in my way....',14,0,100,0,0,0, 'Harrison Jones - Gong Event Say 3');
+
+-- Add spell script for banging the gong
+DELETE FROM `spell_script_names` WHERE `spell_id`=45226;
+INSERT INTO `spell_script_names` (`spell_id`,`ScriptName`) VALUES
+(45226, 'spell_banging_the_gong');
+
+-- Remove creature from db
+DELETE FROM `creature` WHERE id=24358;
+DELETE FROM `creature_addon` WHERE guid=86177;
+UPDATE `creature_template` SET `equipment_id`=0 WHERE `entry`=24358;
+
+-- Pathing for Harrison Jones Entry: 24358
+SET @NPC := 86044;
+SET @PATH := @NPC * 10;
+DELETE FROM `waypoint_data` WHERE `id`IN (861770,861771,861772);
+DELETE FROM `waypoint_data` WHERE `id`IN (@PATH,@PATH+1,@PATH+2);
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`delay`,`move_flag`,`action`,`action_chance`,`wpguid`) VALUES
+(@PATH,1,131.8243,1642.853,42.0216,0,0,0,100,0),
+(@PATH+1,1,121.897,1639.106,42.19081,0,0,0,100,0),
+(@PATH+1,2,120.8522,1637.931,42.37172,0,0,0,100,0),
+(@PATH+1,3,120.7898,1609.063,43.49005,0,0,0,100,0),
+(@PATH+2,1,120.6967,1603.713,43.4503,0,0,0,100,0);
diff --git a/sql/updates/world/2013_01_07_00_world_sai.sql b/sql/updates/world/2013_01_07_00_world_sai.sql
new file mode 100644
index 00000000000..e289130ddef
--- /dev/null
+++ b/sql/updates/world/2013_01_07_00_world_sai.sql
@@ -0,0 +1,24 @@
+-- SAI for Amani'shi Guardian
+SET @ENTRY := 23597;
+DELETE FROM `smart_scripts` WHERE `source_type`=0 AND `entryorguid`=@ENTRY 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,2,0,38,0,100,2,0,1,0,0,22,1,0,0,0,0,0,1,0,0,0,0,0,0,0, 'Amani''shi Guardian - On data set 1 - Set Phase 1'),
+(@ENTRY,0,3,0,38,0,100,2,0,2,0,0,22,2,0,0,0,0,0,1,0,0,0,0,0,0,0, 'Amani''shi Guardian - On data set 2 - Set Phase 2'),
+-- Script 0
+(@ENTRY,0,4,0,1,1,100,3,0,0,0,0,45,0,0,0,0,0,0,1,0,0,0,0,0,0,0, 'Amani''shi Guardian - Script - Set data 0'),
+(@ENTRY,0,5,0,1,1,100,3,0,0,0,0,59,1,0,0,0,0,0,1,0,0,0,0,0,0,0, 'Amani''shi Guardian - Script - Set Run on'),
+(@ENTRY,0,6,0,1,1,100,3,2000,2000,2000,2000,69,0,0,0,0,0,0,8,0,0,0,138.2242,1586.994,43.5488,0, 'Amani''shi Guardian - Script - Move to'),
+(@ENTRY,0,7,0,1,1,100,3,3000,3000,3000,3000,69,0,0,0,0,0,0,8,0,0,0,131.8407,1590.247,43.61384,0, 'Amani''shi Guardian - Script - Move to'),
+(@ENTRY,0,8,0,1,1,100,3,4000,4000,4000,4000,66,0,0,0,0,0,0,8,0,0,0,0,0,0,2.024582, 'Amani''shi Guardian - Script - Turn to'),
+(@ENTRY,0,9,0,1,1,100,3,5000,5000,5000,5000,11,43647,0,0,0,0,0,1,0,0,0,0,0,0,0, 'Amani''shi Guardian - Script - Cast'),
+(@ENTRY,0,10,0,1,1,100,3,5200,5200,5200,5200,71,0,1,33979,0,0,0,1,0,0,0,0,0,0,0, 'Amani''shi Guardian - Script - Change equipment'),
+(@ENTRY,0,11,0,1,1,100,3,6000,6000,6000,6000,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0, 'Amani''shi Guardian - Script - Say 0'),
+(@ENTRY,0,12,0,1,1,100,3,6200,6200,6200,6200,19,256,0,0,0,0,0,1,0,0,0,0,0,0,0, 'Amani''shi Guardian - Script - Remove Unit Flag'),
+(@ENTRY,0,13,0,1,1,100,3,7000,7000,7000,7000,49,0,0,0,0,0,0,21,50,0,0,0,0,0,0, 'Amani''shi Guardian - Script - Attack Cloest player'),
+-- Script 1
+(@ENTRY,0,14,0,1,2,100,3,0,0,0,0,45,0,0,0,0,0,0,1,0,0,0,0,0,0,0, 'Amani''shi Guardian - Script - Set data 0'),
+(@ENTRY,0,15,0,1,2,100,3,0,0,0,0,59,1,0,0,0,0,0,1,0,0,0,0,0,0,0, 'Amani''shi Guardian - Script - Set Run on'),
+(@ENTRY,0,16,0,1,2,100,3,6000,6000,6000,6000,69,0,0,0,0,0,0,8,0,0,0,107.7912,1586.498,43.61609,0, 'Amani''shi Guardian - Script - Move to'),
+(@ENTRY,0,17,0,1,2,100,3,6800,6800,6800,6800,66,0,0,0,0,0,0,8,0,0,0,0,0,0,1.047198, 'Amani''shi Guardian - Script - Turn to'),
+(@ENTRY,0,18,0,1,2,100,3,7600,7600,7600,7600,19,256,0,0,0,0,0,1,0,0,0,0,0,0,0, 'Amani''shi Guardian - Script - Remove Unit Flag'),
+(@ENTRY,0,19,0,1,2,100,3,7800,7800,7800,7800,49,0,0,0,0,0,0,21,50,0,0,0,0,0,0, 'Amani''shi Guardian - Script - Attack Cloest player');
diff --git a/sql/updates/world/2013_01_07_01_world_creature_addon.sql b/sql/updates/world/2013_01_07_01_world_creature_addon.sql
new file mode 100644
index 00000000000..a83bd028343
--- /dev/null
+++ b/sql/updates/world/2013_01_07_01_world_creature_addon.sql
@@ -0,0 +1,30 @@
+DELETE FROM `creature_addon` WHERE `guid` IN (
+ -- Defias Evoker
+79171,79177,79281,79360,79374,
+ -- Defias Squallshaper
+79302,79306,79313,79322,79327,79329,79335,79338,79351,79352,79354,79355,
+ -- Defias Rogue Wizard
+80383,80389,80390,80744,81105,81170,81173,81176,
+ -- Shadowfang Whitescalp
+3479,3480,3482,3483,11514,18308,18313,
+ -- Defias Enchanter
+4279,4321,4874,
+ -- Skeletal Mage
+5992,5996,5997,6000,6003,6004,
+ -- Defias Pillager
+45549,53862,53962,54439,89667,90286,90291,90334,90356,
+ -- Mosshide Mistweaver
+9822,9868,10490,10620,
+ -- Drywhisker Surveyor
+11944,11946,11955,
+ -- Magistrate Henry Maleb
+15322,
+ -- Hillsbrad Councilman
+15642,15751,15957,15967,15986,15988,15989,15995,
+ -- Syndicate Wizard
+16959,17007,17011,17012,17015,17016,17022,17023,17024,17025,17027,
+ -- Dalaran Wizard
+17608,17609,17742,17743,17749,17750,17751,17753,17754,17837,17840,17843,17847,17852,17995,18009,18010,18122,18123,18124,18351,18357,18363,18368,18369,19213,19215,28321,28378,28409,
+-- Vile Fin Tidehunter
+17615,17616,17640,17668,17694,17715,17716,17728,17737,17764,17766,17805,17806,17818,17819,17820,17900,17932,17933,18213,18215,19043,19045,19054);
+
diff --git a/sql/updates/world/2013_01_07_02_world_creature_text.sql b/sql/updates/world/2013_01_07_02_world_creature_text.sql
new file mode 100644
index 00000000000..3e916464615
--- /dev/null
+++ b/sql/updates/world/2013_01_07_02_world_creature_text.sql
@@ -0,0 +1,15 @@
+-- Texts for Valkyr Battle Maiden
+DELETE FROM `creature_text` WHERE `entry`= 28534;
+INSERT INTO `creature_text` (`entry`,`groupid`,`id`,`text`,`type`,`language`,`probability`,`emote`,`duration`,`sound`,`comment`) VALUES
+(28534,0,0, 'It is not yet your time, champion. Rise! Rise and fight once more!',15,0,100,0,0,0, 'Valkyr Battle Maiden');
+
+-- Texts for Dark Rider of Acherus
+DELETE FROM `creature_text` WHERE `entry`= 28654;
+INSERT INTO `creature_text` (`entry`,`groupid`,`id`,`text`,`type`,`language`,`probability`,`emote`,`duration`,`sound`,`comment`) VALUES
+(28654,0,0, 'The realm of shadows awaits...',12,0,100,0,0,0, 'Dark Rider of Acherus');
+
+-- Texts for Scarlet Miner
+DELETE FROM `creature_text` WHERE `entry`= 28841;
+INSERT INTO `creature_text` (`entry`,`groupid`,`id`,`text`,`type`,`language`,`probability`,`emote`,`duration`,`sound`,`comment`) VALUES
+(28841,0,0, 'Where''d this come from? I better get this down to the ships before the foreman sees it!',12,0,100,0,0,0, 'Scarlet Miner'),
+(28841,1,0, "Now I can have a rest!",12,0,100,0,0,0, 'Scarlet Miner');
diff --git a/sql/updates/world/2013_01_07_03_world_creature_text.sql b/sql/updates/world/2013_01_07_03_world_creature_text.sql
new file mode 100644
index 00000000000..c006dc5ef99
--- /dev/null
+++ b/sql/updates/world/2013_01_07_03_world_creature_text.sql
@@ -0,0 +1,10 @@
+-- Texts for Akil'zon
+DELETE FROM `creature_text` WHERE `entry`= 23574;
+INSERT INTO `creature_text` (`entry`,`groupid`,`id`,`text`,`type`,`language`,`probability`,`emote`,`duration`,`sound`,`comment`) VALUES
+(23574,0,0, 'I be da predator! You da prey...',14,0,100,0,0,12013, 'Akil''zon On Aggro'),
+(23574,1,0, 'Feed, me bruddahs!',14,0,100,0,0,12014, 'Akil''zon On Summon'),
+(23574,2,0, 'Your death gonna be quick, strangers. You shoulda never have come to this place...',14,0,100,0,0,12015, 'Akil''zon Intro'),
+(23574,3,0, 'All you be doing is wasting my time!',14,0,100,0,0,12016, 'Akil''zon On Enrage'),
+(23574,4,0, 'Ya got nothin''!',14,0,100,0,0,12017, 'Akil''zon On Player Kill'),
+(23574,4,1, 'Stop your cryin''!',14,0,100,0,0,12018, 'Akil''zon On Player Kill'),
+(23574,5,0, 'You can''t... kill... me spirit!',14,0,100,0,0,12019, 'Akil''zon On Dearh');
diff --git a/sql/updates/world/2013_01_07_04_world_creature_text.sql b/sql/updates/world/2013_01_07_04_world_creature_text.sql
new file mode 100644
index 00000000000..6fd1d3b95a7
--- /dev/null
+++ b/sql/updates/world/2013_01_07_04_world_creature_text.sql
@@ -0,0 +1,7 @@
+-- Texts for Archaedas
+DELETE FROM `creature_text` WHERE `entry`= 2748;
+INSERT INTO `creature_text` (`entry`,`groupid`,`id`,`text`,`type`,`language`,`probability`,`emote`,`duration`,`sound`,`comment`) VALUES
+(2748,0,0, 'Who dares awaken Archaedas? Who dares the wrath of the makers!',14,0,100,0,0,5855, 'Archaedas On Aggro'),
+(2748,1,0, 'Awake ye servants, defend the discs!',14,0,100,0,0,5856, 'Archaedas On Summon Guardians'),
+(2748,2,0, 'To my side, brothers. For the makers!',14,0,100,0,0,5857, 'Archaedas On Summon Vault Walkers'),
+(2748,3,0, 'Reckless mortal.',14,0,100,0,0,5858, 'Archaedas On Player Kill');
diff --git a/sql/updates/world/2013_01_07_05_world_creature_text.sql b/sql/updates/world/2013_01_07_05_world_creature_text.sql
new file mode 100644
index 00000000000..d9d91e784ba
--- /dev/null
+++ b/sql/updates/world/2013_01_07_05_world_creature_text.sql
@@ -0,0 +1,4 @@
+-- Texts for Archavon the Stone Watcher
+DELETE FROM `creature_text` WHERE `entry`= 31125 AND `groupid`=1;
+INSERT INTO `creature_text` (`entry`,`groupid`,`id`,`text`,`type`,`language`,`probability`,`emote`,`duration`,`sound`,`comment`) VALUES
+(31125,1,0, 'Archavon the Stone Watcher lunges for $N!',16,0,100,0,0,0, 'Archavon the Stone Watcher Leap Emote');
diff --git a/sql/updates/world/2013_01_07_06_world_creature_text.sql b/sql/updates/world/2013_01_07_06_world_creature_text.sql
new file mode 100644
index 00000000000..5c7d09f9887
--- /dev/null
+++ b/sql/updates/world/2013_01_07_06_world_creature_text.sql
@@ -0,0 +1,4 @@
+-- Texts for Ayamiss the Hunter
+DELETE FROM `creature_text` WHERE `entry`= 15369;
+INSERT INTO `creature_text` (`entry`,`groupid`,`id`,`text`,`type`,`language`,`probability`,`emote`,`duration`,`sound`,`comment`) VALUES
+(15369,0,0, '%s goes into a frenzy!',16,0,100,0,0,0, 'Ayamiss the Hunter Frenzy Emote');
diff --git a/sql/updates/world/2013_01_07_07_world_creature_text.sql b/sql/updates/world/2013_01_07_07_world_creature_text.sql
new file mode 100644
index 00000000000..6f6a0b75713
--- /dev/null
+++ b/sql/updates/world/2013_01_07_07_world_creature_text.sql
@@ -0,0 +1,9 @@
+-- Texts for Baron Rivendare (Strathhome)
+DELETE FROM `creature_text` WHERE `entry`= 15369;
+INSERT INTO `creature_text` (`entry`,`groupid`,`id`,`text`,`type`,`language`,`probability`,`emote`,`duration`,`sound`,`comment`) VALUES
+(15369,0,0, 'Intruders! More pawns of the Argent Dawn, no doubt. I already count one of their number among my prisoners. Withdraw from my domain before she is executed!',14,0,100,0,0,0, 'Baron Rivendare - Baron Run Start'),
+(15369,1,0, 'You''re still here? Your foolishness is amusing! The Argent Dawn wench needn''t suffer in vain. Leave at once and she shall be spared!',14,0,100,0,0,0, 'Baron Rivendare - Baron Run in progress random'),
+(15369,1,1, 'I shall take great pleasure in taking this poor wretch''s life! It''s not too late, she needn''t suffer in vain. Turn back and her death shall be merciful!',14,0,100,0,0,0, 'Baron Rivendare - Baron Run in progress random'),
+(15369,2,0, 'May this prisoner''s death serve as a warning. None shall defy the Scourge and live!',14,0,100,0,0,0, 'Baron Rivendare - Baron Run Fail'),
+(15369,3,0, 'So you see fit to toy with the Lich King''s creations? Ramstein, be sure to give the intruders a proper greeting.',14,0,100,0,0,0, 'Baron Rivendare - Event Ramstein'),
+(15369,4,0, 'Time to take matters into my own hands. Come. Enter my domain and challenge the might of the Scourge!',14,0,100,0,0,0, 'Baron Rivendare - Event Baron');
diff --git a/sql/updates/world/2013_01_07_08_world_creature_text.sql b/sql/updates/world/2013_01_07_08_world_creature_text.sql
new file mode 100644
index 00000000000..94ab4d925ee
--- /dev/null
+++ b/sql/updates/world/2013_01_07_08_world_creature_text.sql
@@ -0,0 +1,14 @@
+-- Texts for Zul'jin
+DELETE FROM `creature_text` WHERE `entry`= 23863;
+INSERT INTO `creature_text` (`entry`,`groupid`,`id`,`text`,`type`,`language`,`probability`,`emote`,`duration`,`sound`,`comment`) VALUES
+(23863,0,0, 'Everybody always wanna take from us. Now we gonna start takin'' back. Anybody who get in our way...gonna drown in their own blood! De Amani empire be back now...seekin'' vengeance. And we gonna start...with you!',14,0,100,0,0,12090, 'Zul''jin YELL_INTRO'),
+(23863,1,0, 'Nobody badduh dan me!',14,0,100,0,0,12091, 'Zul''jin YELL_AGGRO'),
+(23863,2,0, 'Got me some new tricks...like me bruddah bear!',14,0,100,0,0,12092, 'Zul''jin YELL_TRANSFORM_TO_BEAR'),
+(23863,3,0, 'Dere be no hidin'' from da eagle!',14,0,100,0,0,12093, 'Zul''jin YELL_TRANSFORM_TO_EAGLE'),
+(23863,4,0, 'Let me introduce to you my new bruddahs: fang and claw!',14,0,100,0,0,12094, 'Zul''jin YELL_TRANSFORM_TO_LYNX'),
+(23863,5,0, 'Ya don'' have to look to da sky to see da dragonhawk!',14,0,100,0,0,12095, 'Zul''jin YELL_TRANSFORM_TO_DRAGONHAWK'),
+(23863,6,0, 'Fire kill you just as quick!',14,0,100,0,0,12096, 'Zul''jin YELL_FIRE_BREATH'),
+(23863,7,0, 'You too slow! Me too strong!',14,0,100,0,0,12097, 'Zul''jin YELL_BERSERK'),
+(23863,8,0, 'Da Amani de chuka!',14,0,100,0,0,12098, 'Zul''jin YELL_KILL'),
+(23863,8,1, 'Lot more gonna fall like you!',14,0,100,0,0,12099, 'Zul''jin YELL_KILL'),
+(23863,9,0, 'Mebbe me fall...but da Amani empire...never gonna die...',14,0,100,0,0,12100, 'Zul''jin YELL_DEATH');
diff --git a/src/server/collision/BoundingIntervalHierarchy.cpp b/src/server/collision/BoundingIntervalHierarchy.cpp
index 76218936879..ad3753ea3c9 100644
--- a/src/server/collision/BoundingIntervalHierarchy.cpp
+++ b/src/server/collision/BoundingIntervalHierarchy.cpp
@@ -241,7 +241,7 @@ void BIH::subdivide(int left, int right, std::vector<uint32> &tempTree, buildDat
bool BIH::writeToFile(FILE* wf) const
{
uint32 treeSize = tree.size();
- uint32 check=0, count=0;
+ uint32 check=0, count;
check += fwrite(&bounds.low(), sizeof(float), 3, wf);
check += fwrite(&bounds.high(), sizeof(float), 3, wf);
check += fwrite(&treeSize, sizeof(uint32), 1, wf);
diff --git a/src/server/collision/Management/VMapFactory.cpp b/src/server/collision/Management/VMapFactory.cpp
index 428ef320f5d..4d3719cf288 100644
--- a/src/server/collision/Management/VMapFactory.cpp
+++ b/src/server/collision/Management/VMapFactory.cpp
@@ -16,99 +16,12 @@
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-#include <sys/types.h>
#include "VMapFactory.h"
#include "VMapManager2.h"
-#include "G3D/Table.h"
-
-using namespace G3D;
namespace VMAP
{
- void chompAndTrim(std::string& str)
- {
- while (str.length() >0)
- {
- char lc = str[str.length()-1];
- if (lc == '\r' || lc == '\n' || lc == ' ' || lc == '"' || lc == '\'')
- {
- str = str.substr(0, str.length()-1);
- }
- else
- {
- break;
- }
- }
- while (str.length() >0)
- {
- char lc = str[0];
- if (lc == ' ' || lc == '"' || lc == '\'')
- {
- str = str.substr(1, str.length()-1);
- }
- else
- {
- break;
- }
- }
- }
-
- IVMapManager* gVMapManager = 0;
- Table<unsigned int, bool>* iIgnoreSpellIds=0;
-
- //===============================================
- // result false, if no more id are found
-
- bool getNextId(const std::string& pString, unsigned int& pStartPos, unsigned int& pId)
- {
- bool result = false;
- unsigned int i;
- for (i=pStartPos;i<pString.size(); ++i)
- {
- if (pString[i] == ',')
- {
- break;
- }
- }
- if (i>pStartPos)
- {
- std::string idString = pString.substr(pStartPos, i-pStartPos);
- pStartPos = i+1;
- chompAndTrim(idString);
- pId = atoi(idString.c_str());
- result = true;
- }
- return(result);
- }
-
- //===============================================
- /**
- parameter: String of map ids. Delimiter = ","
- */
-
- void VMapFactory::preventSpellsFromBeingTestedForLoS(const char* pSpellIdString)
- {
- if (!iIgnoreSpellIds)
- iIgnoreSpellIds = new Table<unsigned int, bool>();
- if (pSpellIdString != NULL)
- {
- unsigned int pos =0;
- unsigned int id;
- std::string confString(pSpellIdString);
- chompAndTrim(confString);
- while (getNextId(confString, pos, id))
- {
- iIgnoreSpellIds->set(id, true);
- }
- }
- }
-
- //===============================================
-
- bool VMapFactory::checkSpellForLoS(unsigned int pSpellId)
- {
- return(!iIgnoreSpellIds->containsKey(pSpellId));
- }
+ IVMapManager* gVMapManager = NULL;
//===============================================
// just return the instance
@@ -123,9 +36,6 @@ namespace VMAP
// delete all internal data structures
void VMapFactory::clear()
{
- delete iIgnoreSpellIds;
- iIgnoreSpellIds = NULL;
-
delete gVMapManager;
gVMapManager = NULL;
}
diff --git a/src/server/collision/Management/VMapFactory.h b/src/server/collision/Management/VMapFactory.h
index 05fdc193c74..1545a8f6977 100644
--- a/src/server/collision/Management/VMapFactory.h
+++ b/src/server/collision/Management/VMapFactory.h
@@ -34,9 +34,6 @@ namespace VMAP
public:
static IVMapManager* createOrGetVMapManager();
static void clear();
-
- static void preventSpellsFromBeingTestedForLoS(const char* pSpellIdString);
- static bool checkSpellForLoS(unsigned int pSpellId);
};
}
diff --git a/src/server/game/AI/CoreAI/PetAI.cpp b/src/server/game/AI/CoreAI/PetAI.cpp
index 14839196da8..a8d2a2248ad 100644
--- a/src/server/game/AI/CoreAI/PetAI.cpp
+++ b/src/server/game/AI/CoreAI/PetAI.cpp
@@ -130,7 +130,6 @@ void PetAI::UpdateAI(const uint32 diff)
}
else
HandleReturnMovement();
-
}
// Autocast (casted only in combat or persistent spells in any state)
@@ -252,6 +251,12 @@ void PetAI::UpdateAI(const uint32 diff)
for (TargetSpellList::const_iterator itr = targetSpellStore.begin(); itr != targetSpellStore.end(); ++itr)
delete itr->second;
}
+
+ // Update speed as needed to prevent dropping too far behind and despawning
+ me->UpdateSpeed(MOVE_RUN, true);
+ me->UpdateSpeed(MOVE_WALK, true);
+ me->UpdateSpeed(MOVE_FLIGHT, true);
+
}
void PetAI::UpdateAllies()
diff --git a/src/server/game/AI/CoreAI/UnitAI.cpp b/src/server/game/AI/CoreAI/UnitAI.cpp
index 81e32a2f8b6..a3cb57b3332 100644
--- a/src/server/game/AI/CoreAI/UnitAI.cpp
+++ b/src/server/game/AI/CoreAI/UnitAI.cpp
@@ -162,6 +162,28 @@ void UnitAI::DoCast(uint32 spellId)
me->CastSpell(target, spellId, false);
}
+void UnitAI::DoCast(Unit* victim, uint32 spellId, bool triggered)
+{
+ if (!victim || (me->HasUnitState(UNIT_STATE_CASTING) && !triggered))
+ return;
+
+ me->CastSpell(victim, spellId, triggered);
+}
+
+void UnitAI::DoCastVictim(uint32 spellId, bool triggered)
+{
+ // Why don't we check for casting unit_state and existing target as we do in DoCast(.. ?
+ me->CastSpell(me->getVictim(), spellId, triggered);
+}
+
+void UnitAI::DoCastAOE(uint32 spellId, bool triggered)
+{
+ if (!triggered && me->HasUnitState(UNIT_STATE_CASTING))
+ return;
+
+ me->CastSpell((Unit*)NULL, spellId, triggered);
+}
+
#define UPDATE_TARGET(a) {if (AIInfo->target<a) AIInfo->target=a;}
void UnitAI::FillAISpellInfo()
diff --git a/src/server/game/AI/CreatureAI.cpp b/src/server/game/AI/CreatureAI.cpp
index 8491a055516..427818fe571 100644
--- a/src/server/game/AI/CreatureAI.cpp
+++ b/src/server/game/AI/CreatureAI.cpp
@@ -174,3 +174,91 @@ void CreatureAI::EnterEvadeMode()
if (!me->getVictim())
AttackStart(attacker);
}*/
+
+void CreatureAI::SetGazeOn(Unit* target)
+{
+ if (me->IsValidAttackTarget(target))
+ {
+ AttackStart(target);
+ me->SetReactState(REACT_PASSIVE);
+ }
+}
+
+bool CreatureAI::UpdateVictimWithGaze()
+{
+ if (!me->isInCombat())
+ return false;
+
+ if (me->HasReactState(REACT_PASSIVE))
+ {
+ if (me->getVictim())
+ return true;
+ else
+ me->SetReactState(REACT_AGGRESSIVE);
+ }
+
+ if (Unit* victim = me->SelectVictim())
+ AttackStart(victim);
+ return me->getVictim();
+}
+
+bool CreatureAI::UpdateVictim()
+{
+ if (!me->isInCombat())
+ return false;
+
+ if (!me->HasReactState(REACT_PASSIVE))
+ {
+ if (Unit* victim = me->SelectVictim())
+ AttackStart(victim);
+ return me->getVictim();
+ }
+ else if (me->getThreatManager().isThreatListEmpty())
+ {
+ EnterEvadeMode();
+ return false;
+ }
+
+ return true;
+}
+
+bool CreatureAI::_EnterEvadeMode()
+{
+ if (!me->isAlive())
+ return false;
+
+ // dont remove vehicle auras, passengers arent supposed to drop off the vehicle
+ me->RemoveAllAurasExceptType(SPELL_AURA_CONTROL_VEHICLE);
+
+ // sometimes bosses stuck in combat?
+ me->DeleteThreatList();
+ me->CombatStop(true);
+ me->LoadCreaturesAddon();
+ me->SetLootRecipient(NULL);
+ me->ResetPlayerDamageReq();
+
+ if (me->IsInEvadeMode())
+ return false;
+
+ return true;
+}
+
+Creature* CreatureAI::DoSummon(uint32 entry, const Position& pos, uint32 despawnTime, TempSummonType summonType)
+{
+ return me->SummonCreature(entry, pos, summonType, despawnTime);
+}
+
+Creature* CreatureAI::DoSummon(uint32 entry, WorldObject* obj, float radius, uint32 despawnTime, TempSummonType summonType)
+{
+ Position pos;
+ obj->GetRandomNearPosition(pos, radius);
+ return me->SummonCreature(entry, pos, summonType, despawnTime);
+}
+
+Creature* CreatureAI::DoSummonFlyer(uint32 entry, WorldObject* obj, float flightZ, float radius, uint32 despawnTime, TempSummonType summonType)
+{
+ Position pos;
+ obj->GetRandomNearPosition(pos, radius);
+ pos.m_positionZ += flightZ;
+ return me->SummonCreature(entry, pos, summonType, despawnTime);
+}
diff --git a/src/server/game/AI/CreatureAIImpl.h b/src/server/game/AI/CreatureAIImpl.h
index b2b02882e9b..559240c4a3f 100644
--- a/src/server/game/AI/CreatureAIImpl.h
+++ b/src/server/game/AI/CreatureAIImpl.h
@@ -311,8 +311,10 @@ const T& RAND(const T& v1, const T& v2, const T& v3, const T& v4, const T& v5, c
}
}
-class EventMap : private std::map<uint32, uint32>
+class EventMap
{
+ typedef std::map<uint32, uint32> StorageType;
+
public:
EventMap() : _time(0), _phase(0) {}
@@ -320,13 +322,16 @@ class EventMap : private std::map<uint32, uint32>
uint32 GetTimer() const { return _time; }
// Removes all events and clears phase
- void Reset() { clear(); _time = 0; _phase = 0; }
+ void Reset()
+ {
+ _eventMap.clear(); _time = 0; _phase = 0;
+ }
void Update(uint32 time) { _time += time; }
uint32 GetPhaseMask() const { return (_phase >> 24) & 0xFF; }
- bool Empty() const { return empty(); }
+ bool Empty() const { return _eventMap.empty(); }
// Sets event phase, must be in range 1 - 8
void SetPhase(uint32 phase)
@@ -346,14 +351,14 @@ class EventMap : private std::map<uint32, uint32>
eventId |= (1 << (groupId + 16));
if (phase && phase < 8)
eventId |= (1 << (phase + 24));
- const_iterator itr = find(time);
- while (itr != end())
+ StorageType::const_iterator itr = _eventMap.find(time);
+ while (itr != _eventMap.end())
{
++time;
- itr = find(time);
+ itr = _eventMap.find(time);
}
- insert(std::make_pair(time, eventId));
+ _eventMap.insert(StorageType::value_type(time, eventId));
}
// Removes event with specified id and creates new entry for it
@@ -366,41 +371,43 @@ class EventMap : private std::map<uint32, uint32>
// Reschedules closest event
void RepeatEvent(uint32 time)
{
- if (empty())
+ if (_eventMap.empty())
return;
- uint32 eventId = begin()->second;
- erase(begin());
+ uint32 eventId = _eventMap.begin()->second;
+ _eventMap.erase(_eventMap.begin());
time += _time;
- const_iterator itr = find(time);
- while (itr != end())
+ StorageType::const_iterator itr = _eventMap.find(time);
+ while (itr != _eventMap.end())
{
++time;
- itr = find(time);
+ itr = _eventMap.find(time);
}
- insert(std::make_pair(time, eventId));
+ _eventMap.insert(StorageType::value_type(time, eventId));
}
// Removes first event
void PopEvent()
{
- erase(begin());
+ if (!_eventMap.empty())
+ _eventMap.erase(_eventMap.begin());
}
// Gets next event id to execute and removes it from map
uint32 ExecuteEvent()
{
- while (!empty())
+ while (!_eventMap.empty())
{
- if (begin()->first > _time)
+ StorageType::iterator itr = _eventMap.begin();
+ if (itr->first > _time)
return 0;
- else if (_phase && (begin()->second & 0xFF000000) && !(begin()->second & _phase))
- erase(begin());
+ else if (_phase && (itr->second & 0xFF000000) && !(itr->second & _phase))
+ _eventMap.erase(itr);
else
{
- uint32 eventId = (begin()->second & 0x0000FFFF);
- erase(begin());
+ uint32 eventId = (itr->second & 0x0000FFFF);
+ _eventMap.erase(itr);
return eventId;
}
}
@@ -410,14 +417,15 @@ class EventMap : private std::map<uint32, uint32>
// Gets next event id to execute
uint32 GetEvent()
{
- while (!empty())
+ while (!_eventMap.empty())
{
- if (begin()->first > _time)
+ StorageType::iterator itr = _eventMap.begin();
+ if (itr->first > _time)
return 0;
- else if (_phase && (begin()->second & 0xFF000000) && !(begin()->second & _phase))
- erase(begin());
+ else if (_phase && (itr->second & 0xFF000000) && !(itr->second & _phase))
+ _eventMap.erase(itr);
else
- return (begin()->second & 0x0000FFFF);
+ return (itr->second & 0x0000FFFF);
}
return 0;
@@ -437,13 +445,13 @@ class EventMap : private std::map<uint32, uint32>
{
uint32 nextTime = _time + delay;
uint32 groupMask = (1 << (groupId + 16));
- for (iterator itr = begin(); itr != end() && itr->first < nextTime;)
+ for (StorageType::iterator itr = _eventMap.begin(); itr != _eventMap.end() && itr->first < nextTime;)
{
if (itr->second & groupMask)
{
ScheduleEvent(itr->second, itr->first - _time + delay);
- erase(itr);
- itr = begin();
+ _eventMap.erase(itr);
+ itr = _eventMap.begin();
}
else
++itr;
@@ -453,12 +461,12 @@ class EventMap : private std::map<uint32, uint32>
// Cancel events with specified id
void CancelEvent(uint32 eventId)
{
- for (iterator itr = begin(); itr != end();)
+ for (StorageType::iterator itr = _eventMap.begin(); itr != _eventMap.end();)
{
if (eventId == (itr->second & 0x0000FFFF))
{
- erase(itr);
- itr = begin();
+ _eventMap.erase(itr);
+ itr = _eventMap.begin();
}
else
++itr;
@@ -470,12 +478,12 @@ class EventMap : private std::map<uint32, uint32>
{
uint32 groupMask = (1 << (groupId + 16));
- for (iterator itr = begin(); itr != end();)
+ for (StorageType::iterator itr = _eventMap.begin(); itr != _eventMap.end();)
{
if (itr->second & groupMask)
{
- erase(itr);
- itr = begin();
+ _eventMap.erase(itr);
+ itr = _eventMap.begin();
}
else
++itr;
@@ -486,7 +494,7 @@ class EventMap : private std::map<uint32, uint32>
// To get how much time remains substract _time
uint32 GetNextEventTime(uint32 eventId) const
{
- for (const_iterator itr = begin(); itr != end(); ++itr)
+ for (StorageType::const_iterator itr = _eventMap.begin(); itr != _eventMap.end(); ++itr)
if (eventId == (itr->second & 0x0000FFFF))
return itr->first;
@@ -496,6 +504,8 @@ class EventMap : private std::map<uint32, uint32>
private:
uint32 _time;
uint32 _phase;
+
+ StorageType _eventMap;
};
enum AITarget
@@ -530,115 +540,5 @@ struct AISpellInfoType
AISpellInfoType* GetAISpellInfo(uint32 i);
-inline void CreatureAI::SetGazeOn(Unit* target)
-{
- if (me->IsValidAttackTarget(target))
- {
- AttackStart(target);
- me->SetReactState(REACT_PASSIVE);
- }
-}
-
-inline bool CreatureAI::UpdateVictimWithGaze()
-{
- if (!me->isInCombat())
- return false;
-
- if (me->HasReactState(REACT_PASSIVE))
- {
- if (me->getVictim())
- return true;
- else
- me->SetReactState(REACT_AGGRESSIVE);
- }
-
- if (Unit* victim = me->SelectVictim())
- AttackStart(victim);
- return me->getVictim();
-}
-
-inline bool CreatureAI::UpdateVictim()
-{
- if (!me->isInCombat())
- return false;
-
- if (!me->HasReactState(REACT_PASSIVE))
- {
- if (Unit* victim = me->SelectVictim())
- AttackStart(victim);
- return me->getVictim();
- }
- else if (me->getThreatManager().isThreatListEmpty())
- {
- EnterEvadeMode();
- return false;
- }
-
- return true;
-}
-
-inline bool CreatureAI::_EnterEvadeMode()
-{
- if (!me->isAlive())
- return false;
-
- // dont remove vehicle auras, passengers arent supposed to drop off the vehicle
- me->RemoveAllAurasExceptType(SPELL_AURA_CONTROL_VEHICLE);
-
- // sometimes bosses stuck in combat?
- me->DeleteThreatList();
- me->CombatStop(true);
- me->LoadCreaturesAddon();
- me->SetLootRecipient(NULL);
- me->ResetPlayerDamageReq();
-
- if (me->IsInEvadeMode())
- return false;
-
- return true;
-}
-
-inline void UnitAI::DoCast(Unit* victim, uint32 spellId, bool triggered)
-{
- if (!victim || (me->HasUnitState(UNIT_STATE_CASTING) && !triggered))
- return;
-
- me->CastSpell(victim, spellId, triggered);
-}
-
-inline void UnitAI::DoCastVictim(uint32 spellId, bool triggered)
-{
- // Why don't we check for casting unit_state and existing target as we do in DoCast(.. ?
- me->CastSpell(me->getVictim(), spellId, triggered);
-}
-
-inline void UnitAI::DoCastAOE(uint32 spellId, bool triggered)
-{
- if (!triggered && me->HasUnitState(UNIT_STATE_CASTING))
- return;
-
- me->CastSpell((Unit*)NULL, spellId, triggered);
-}
-
-inline Creature* CreatureAI::DoSummon(uint32 entry, const Position& pos, uint32 despawnTime, TempSummonType summonType)
-{
- return me->SummonCreature(entry, pos, summonType, despawnTime);
-}
-
-inline Creature* CreatureAI::DoSummon(uint32 entry, WorldObject* obj, float radius, uint32 despawnTime, TempSummonType summonType)
-{
- Position pos;
- obj->GetRandomNearPosition(pos, radius);
- return me->SummonCreature(entry, pos, summonType, despawnTime);
-}
-
-inline Creature* CreatureAI::DoSummonFlyer(uint32 entry, WorldObject* obj, float flightZ, float radius, uint32 despawnTime, TempSummonType summonType)
-{
- Position pos;
- obj->GetRandomNearPosition(pos, radius);
- pos.m_positionZ += flightZ;
- return me->SummonCreature(entry, pos, summonType, despawnTime);
-}
-
#endif
diff --git a/src/server/game/AI/EventAI/CreatureEventAI.cpp b/src/server/game/AI/EventAI/CreatureEventAI.cpp
index 43f6a91242a..7172a187504 100644
--- a/src/server/game/AI/EventAI/CreatureEventAI.cpp
+++ b/src/server/game/AI/EventAI/CreatureEventAI.cpp
@@ -746,15 +746,12 @@ void CreatureEventAI::ProcessAction(CreatureEventAI_Action const& action, uint32
break;
case ACTION_T_SUMMON_GO:
{
- GameObject* object = NULL;
-
float x, y, z;
me->GetPosition(x, y, z);
- object = me->SummonGameObject(action.raw.param1, x, y, z, 0, 0, 0, 0, 0, action.raw.param2);
+ GameObject* object = me->SummonGameObject(action.raw.param1, x, y, z, 0, 0, 0, 0, 0, action.raw.param2);
if (!object)
- {
sLog->outError(LOG_FILTER_TSCR, "EventAI failed to spawn object %u. Spawn event %d is on creature %d", action.raw.param1, eventId, me->GetEntry());
- }
+
break;
}
case ACTION_T_SET_SHEATH:
@@ -1268,7 +1265,7 @@ bool CreatureEventAI::CanCast(Unit* target, SpellInfo const* spell, bool trigger
return false;
//Check for power
- if (!triggered && me->GetPower((Powers)spell->PowerType) < spell->CalcPowerCost(me, spell->GetSchoolMask()))
+ if (!triggered && me->GetPower((Powers)spell->PowerType) < uint32(spell->CalcPowerCost(me, spell->GetSchoolMask())))
return false;
//Unit is out of range of this spell
diff --git a/src/server/game/AI/EventAI/CreatureEventAI.h b/src/server/game/AI/EventAI/CreatureEventAI.h
index 5d7b4acabfa..fa4b2a709a6 100644
--- a/src/server/game/AI/EventAI/CreatureEventAI.h
+++ b/src/server/game/AI/EventAI/CreatureEventAI.h
@@ -81,7 +81,7 @@ enum EventAI_ActionType
ACTION_T_THREAT_SINGLE_PCT = 13, // Threat%, Target
ACTION_T_THREAT_ALL_PCT = 14, // Threat%
ACTION_T_QUEST_EVENT = 15, // QuestID, Target
- ACTION_T_CAST_EVENT = 16, // QuestID, SpellId, Target - must be removed as hack?
+ ACTION_T_CAST_EVENT = 16, // CreatureId, SpellId, Target - must be removed as hack?
ACTION_T_SET_UNIT_FIELD = 17, // Field_Number, Value, Target
ACTION_T_SET_UNIT_FLAG = 18, // Flags (may be more than one field OR'd together), Target
ACTION_T_REMOVE_UNIT_FLAG = 19, // Flags (may be more than one field OR'd together), Target
diff --git a/src/server/game/AI/SmartScripts/SmartScript.cpp b/src/server/game/AI/SmartScripts/SmartScript.cpp
index 4b147e080e2..e68c8c27194 100644
--- a/src/server/game/AI/SmartScripts/SmartScript.cpp
+++ b/src/server/game/AI/SmartScripts/SmartScript.cpp
@@ -2260,46 +2260,30 @@ ObjectList* SmartScript::GetTargets(SmartScriptHolder const& e, Unit* invoker /*
case SMART_TARGET_CREATURE_GUID:
{
Creature* target = NULL;
- if (e.target.unitGUID.entry)
+ if (!trigger && !GetBaseObject())
{
- uint64 guid = MAKE_NEW_GUID(e.target.unitGUID.guid, e.target.unitGUID.entry, HIGHGUID_UNIT);
- target = HashMapHolder<Creature>::Find(guid);
+ sLog->outError(LOG_FILTER_SQL, "SMART_TARGET_CREATURE_GUID can not be used without invoker");
+ break;
}
- else
- {
- if (!trigger && !GetBaseObject())
- {
- sLog->outError(LOG_FILTER_SQL, "SMART_TARGET_CREATURE_GUID can not be used without invoker and without entry");
- break;
- }
- target = FindCreatureNear(trigger ? trigger : GetBaseObject(), e.target.unitGUID.guid);
- }
+ target = FindCreatureNear(trigger ? trigger : GetBaseObject(), e.target.unitGUID.dbGuid);
- if (target)
+ if (target && (!e.target.unitGUID.entry || target->GetEntry() == e.target.unitGUID.entry))
l->push_back(target);
break;
}
case SMART_TARGET_GAMEOBJECT_GUID:
{
GameObject* target = NULL;
- if (e.target.unitGUID.entry)
+ if (!trigger && !GetBaseObject())
{
- uint64 guid = MAKE_NEW_GUID(e.target.goGUID.guid, e.target.goGUID.entry, HIGHGUID_GAMEOBJECT);
- target = HashMapHolder<GameObject>::Find(guid);
+ sLog->outError(LOG_FILTER_SQL, "SMART_TARGET_GAMEOBJECT_GUID can not be used without invoker");
+ break;
}
- else
- {
- if (!trigger && !GetBaseObject())
- {
- sLog->outError(LOG_FILTER_SQL, "SMART_TARGET_GAMEOBJECT_GUID can not be used without invoker and without entry");
- break;
- }
- target = FindGameObjectNear(trigger ? trigger : GetBaseObject(), e.target.goGUID.guid);
- }
+ target = FindGameObjectNear(trigger ? trigger : GetBaseObject(), e.target.goGUID.dbGuid);
- if (target)
+ if (target && (!e.target.goGUID.entry || target->GetEntry() == e.target.goGUID.entry))
l->push_back(target);
break;
}
diff --git a/src/server/game/AI/SmartScripts/SmartScriptMgr.h b/src/server/game/AI/SmartScripts/SmartScriptMgr.h
index b6690e35944..c70e78d5395 100644
--- a/src/server/game/AI/SmartScripts/SmartScriptMgr.h
+++ b/src/server/game/AI/SmartScripts/SmartScriptMgr.h
@@ -996,7 +996,7 @@ struct SmartTarget
struct
{
- uint32 guid;
+ uint32 dbGuid;
uint32 entry;
} unitGUID;
@@ -1031,7 +1031,7 @@ struct SmartTarget
struct
{
- uint32 guid;
+ uint32 dbGuid;
uint32 entry;
} goGUID;
diff --git a/src/server/game/Achievements/AchievementMgr.cpp b/src/server/game/Achievements/AchievementMgr.cpp
index 4caee8bfd6c..2fd55ac29ef 100644
--- a/src/server/game/Achievements/AchievementMgr.cpp
+++ b/src/server/game/Achievements/AchievementMgr.cpp
@@ -2032,8 +2032,6 @@ void AchievementMgr::RemoveTimedAchievement(AchievementCriteriaTimedTypes type,
void AchievementMgr::CompletedAchievement(AchievementEntry const* achievement)
{
- sLog->outInfo(LOG_FILTER_ACHIEVEMENTSYS, "AchievementMgr::CompletedAchievement(%u)", achievement->ID);
-
// disable for gamemasters with GM-mode enabled
if (m_player->isGameMaster())
return;
@@ -2041,6 +2039,9 @@ void AchievementMgr::CompletedAchievement(AchievementEntry const* achievement)
if (achievement->flags & ACHIEVEMENT_FLAG_COUNTER || HasAchieved(achievement->ID))
return;
+ sLog->outInfo(LOG_FILTER_ACHIEVEMENTSYS, "AchievementMgr::CompletedAchievement(%u). Player: %s (%u)",
+ achievement->ID, m_player->GetName().c_str(), m_player->GetGUIDLow());
+
SendAchievementEarned(achievement);
CompletedAchievementData& ca = m_completedAchievements[achievement->ID];
ca.date = time(NULL);
diff --git a/src/server/game/Addons/AddonMgr.h b/src/server/game/Addons/AddonMgr.h
index 5893b79165f..4d387fcfd4c 100644
--- a/src/server/game/Addons/AddonMgr.h
+++ b/src/server/game/Addons/AddonMgr.h
@@ -37,9 +37,8 @@ struct AddonInfo
struct SavedAddon
{
- SavedAddon(const std::string& name, uint32 crc)
+ SavedAddon(const std::string& name, uint32 crc) : Name(name)
{
- Name = name;
CRC = crc;
}
diff --git a/src/server/game/Battlefield/Battlefield.cpp b/src/server/game/Battlefield/Battlefield.cpp
index 837fa1039f3..32f71822737 100644
--- a/src/server/game/Battlefield/Battlefield.cpp
+++ b/src/server/game/Battlefield/Battlefield.cpp
@@ -41,6 +41,7 @@ Battlefield::Battlefield()
m_TypeId = 0;
m_BattleId = 0;
m_ZoneId = 0;
+ m_Map = NULL;
m_MapId = 0;
m_MaxPlayer = 0;
m_MinPlayer = 0;
diff --git a/src/server/game/Battlegrounds/ArenaTeam.cpp b/src/server/game/Battlegrounds/ArenaTeam.cpp
index 9a7d2e58bb0..1b0955fb670 100644
--- a/src/server/game/Battlegrounds/ArenaTeam.cpp
+++ b/src/server/game/Battlegrounds/ArenaTeam.cpp
@@ -337,7 +337,7 @@ void ArenaTeam::Disband(WorldSession* session)
// Broadcast update
if (session)
{
- BroadcastEvent(ERR_ARENA_TEAM_DISBANDED_S, 0, 2, session->GetPlayerName().c_str(), GetName(), "");
+ BroadcastEvent(ERR_ARENA_TEAM_DISBANDED_S, 0, 2, session->GetPlayerName(), GetName(), "");
if (Player* player = session->GetPlayer())
sLog->outDebug(LOG_FILTER_ARENAS, "Player: %s [GUID: %u] disbanded arena team type: %u [Id: %u].", player->GetName().c_str(), player->GetGUIDLow(), GetType(), GetId());
diff --git a/src/server/game/Battlegrounds/BattlegroundMgr.cpp b/src/server/game/Battlegrounds/BattlegroundMgr.cpp
index 6145ed3b6c2..71ac8cf8180 100644
--- a/src/server/game/Battlegrounds/BattlegroundMgr.cpp
+++ b/src/server/game/Battlegrounds/BattlegroundMgr.cpp
@@ -1135,9 +1135,8 @@ BattlegroundTypeId BattlegroundMgr::GetRandomBG(BattlegroundTypeId bgTypeId)
if (weight)
{
- uint32 selectedWeight = 0;
// Select a random value
- selectedWeight = urand(0, weight - 1);
+ uint32 selectedWeight = urand(0, weight - 1);
// Select the correct bg (if we have in DB A(10), B(20), C(10), D(15) --> [0---A---9|10---B---29|30---C---39|40---D---54])
weight = 0;
for (BattlegroundSelectionWeightMap::const_iterator it = selectionWeights.begin(); it != selectionWeights.end(); ++it)
diff --git a/src/server/game/Battlegrounds/Zones/BattlegroundAB.cpp b/src/server/game/Battlegrounds/Zones/BattlegroundAB.cpp
index 1082ad7df66..61c68bca121 100644
--- a/src/server/game/Battlegrounds/Zones/BattlegroundAB.cpp
+++ b/src/server/game/Battlegrounds/Zones/BattlegroundAB.cpp
@@ -30,6 +30,7 @@
BattlegroundAB::BattlegroundAB()
{
+ m_IsInformedNearVictory = false;
m_BuffChange = true;
BgObjects.resize(BG_AB_OBJECT_MAX);
BgCreatures.resize(BG_AB_ALL_NODES_COUNT + 5);//+5 for aura triggers
diff --git a/src/server/game/Conditions/ConditionMgr.cpp b/src/server/game/Conditions/ConditionMgr.cpp
index 2116a7dfe94..0526c9276f9 100644
--- a/src/server/game/Conditions/ConditionMgr.cpp
+++ b/src/server/game/Conditions/ConditionMgr.cpp
@@ -489,6 +489,7 @@ uint32 Condition::GetMaxAvailableConditionTargets()
case CONDITION_SOURCE_TYPE_GOSSIP_MENU_OPTION:
case CONDITION_SOURCE_TYPE_SMART_EVENT:
case CONDITION_SOURCE_TYPE_NPC_VENDOR:
+ case CONDITION_SOURCE_TYPE_SPELL_PROC:
return 2;
default:
return 1;
@@ -1403,6 +1404,7 @@ bool ConditionMgr::isSourceTypeValid(Condition* cond)
break;
}
case CONDITION_SOURCE_TYPE_SPELL:
+ case CONDITION_SOURCE_TYPE_SPELL_PROC:
{
SpellInfo const* spellProto = sSpellMgr->GetSpellInfo(cond->SourceEntry);
if (!spellProto)
diff --git a/src/server/game/Conditions/ConditionMgr.h b/src/server/game/Conditions/ConditionMgr.h
index 77d13c37bc1..fec5cd6fc95 100644
--- a/src/server/game/Conditions/ConditionMgr.h
+++ b/src/server/game/Conditions/ConditionMgr.h
@@ -128,7 +128,8 @@ enum ConditionSourceType
CONDITION_SOURCE_TYPE_VEHICLE_SPELL = 21,
CONDITION_SOURCE_TYPE_SMART_EVENT = 22,
CONDITION_SOURCE_TYPE_NPC_VENDOR = 23,
- CONDITION_SOURCE_TYPE_MAX = 24 // MAX
+ CONDITION_SOURCE_TYPE_SPELL_PROC = 24,
+ CONDITION_SOURCE_TYPE_MAX = 25 // MAX
};
enum ComparisionType
diff --git a/src/server/game/Conditions/DisableMgr.cpp b/src/server/game/Conditions/DisableMgr.cpp
index 8cd36827ab9..fefb51323c4 100644
--- a/src/server/game/Conditions/DisableMgr.cpp
+++ b/src/server/game/Conditions/DisableMgr.cpp
@@ -310,6 +310,8 @@ bool IsDisabledFor(DisableType type, uint32 entry, Unit const* unit, uint8 flags
}
else if (spellFlags & SPELL_DISABLE_DEPRECATED_SPELL) // call not from spellcast
return true;
+ else if (flags & SPELL_DISABLE_LOS)
+ return spellFlags & SPELL_DISABLE_LOS;
break;
}
diff --git a/src/server/game/Conditions/DisableMgr.h b/src/server/game/Conditions/DisableMgr.h
index e84f3347df8..89761931048 100644
--- a/src/server/game/Conditions/DisableMgr.h
+++ b/src/server/game/Conditions/DisableMgr.h
@@ -42,8 +42,10 @@ enum SpellDisableTypes
SPELL_DISABLE_DEPRECATED_SPELL = 0x8,
SPELL_DISABLE_MAP = 0x10,
SPELL_DISABLE_AREA = 0x20,
+ SPELL_DISABLE_LOS = 0x40,
MAX_SPELL_DISABLE_TYPE = ( SPELL_DISABLE_PLAYER | SPELL_DISABLE_CREATURE | SPELL_DISABLE_PET |
- SPELL_DISABLE_DEPRECATED_SPELL | SPELL_DISABLE_MAP | SPELL_DISABLE_AREA)
+ SPELL_DISABLE_DEPRECATED_SPELL | SPELL_DISABLE_MAP | SPELL_DISABLE_AREA |
+ SPELL_DISABLE_LOS)
};
enum VmapDisableTypes
diff --git a/src/server/game/DungeonFinding/LFGMgr.cpp b/src/server/game/DungeonFinding/LFGMgr.cpp
index 3b57f02bf7c..2550f909a8b 100644
--- a/src/server/game/DungeonFinding/LFGMgr.cpp
+++ b/src/server/game/DungeonFinding/LFGMgr.cpp
@@ -51,7 +51,7 @@ void LFGMgr::_LoadFromDB(Field* fields, uint64 guid)
if (!fields)
return;
- if (!IS_GROUP(guid))
+ if (!IS_GROUP_GUID(guid))
return;
SetLeader(guid, MAKE_NEW_GUID(fields[0].GetUInt32(), 0, HIGHGUID_PLAYER));
@@ -77,7 +77,7 @@ void LFGMgr::_LoadFromDB(Field* fields, uint64 guid)
void LFGMgr::_SaveToDB(uint64 guid, uint32 db_guid)
{
- if (!IS_GROUP(guid))
+ if (!IS_GROUP_GUID(guid))
return;
PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_LFG_DATA);
@@ -758,7 +758,7 @@ void LFGMgr::LeaveLfg(uint64 guid)
{
sLog->outDebug(LOG_FILTER_LFG, "LFGMgr::LeaveLfg: [" UI64FMTD "]", guid);
- uint64 gguid = IS_GROUP(guid) ? guid : GetGroup(guid);
+ uint64 gguid = IS_GROUP_GUID(guid) ? guid : GetGroup(guid);
LfgState state = GetState(guid);
switch (state)
{
@@ -1624,7 +1624,7 @@ LfgType LFGMgr::GetDungeonType(uint32 dungeonId)
LfgState LFGMgr::GetState(uint64 guid)
{
LfgState state;
- if (IS_GROUP(guid))
+ if (IS_GROUP_GUID(guid))
state = GroupsStore[guid].GetState();
else
state = PlayersStore[guid].GetState();
@@ -1696,7 +1696,7 @@ uint8 LFGMgr::GetKicksLeft(uint64 guid)
void LFGMgr::RestoreState(uint64 guid, char const *debugMsg)
{
- if (IS_GROUP(guid))
+ if (IS_GROUP_GUID(guid))
{
LfgGroupData& data = GroupsStore[guid];
if (sLog->ShouldLog(LOG_FILTER_LFG, LOG_LEVEL_DEBUG))
@@ -1725,7 +1725,7 @@ void LFGMgr::RestoreState(uint64 guid, char const *debugMsg)
void LFGMgr::SetState(uint64 guid, LfgState state)
{
- if (IS_GROUP(guid))
+ if (IS_GROUP_GUID(guid))
{
LfgGroupData& data = GroupsStore[guid];
if (sLog->ShouldLog(LOG_FILTER_LFG, LOG_LEVEL_DEBUG))
@@ -1932,13 +1932,13 @@ void LFGMgr::SendLfgQueueStatus(uint64 guid, LfgQueueStatusData const& data)
bool LFGMgr::IsLfgGroup(uint64 guid)
{
- return guid && IS_GROUP(guid) && GroupsStore[guid].IsLfgGroup();
+ return guid && IS_GROUP_GUID(guid) && GroupsStore[guid].IsLfgGroup();
}
LFGQueue& LFGMgr::GetQueue(uint64 guid)
{
uint8 queueId = 0;
- if (IS_GROUP(guid))
+ if (IS_GROUP_GUID(guid))
{
const LfgGuidSet& players = GetPlayers(guid);
uint64 pguid = players.empty() ? 0 : (*players.begin());
diff --git a/src/server/game/DungeonFinding/LFGQueue.cpp b/src/server/game/DungeonFinding/LFGQueue.cpp
index 81c9705704d..dae789b2eb4 100644
--- a/src/server/game/DungeonFinding/LFGQueue.cpp
+++ b/src/server/game/DungeonFinding/LFGQueue.cpp
@@ -358,7 +358,7 @@ LfgCompatibility LFGQueue::CheckCompatibility(LfgGuidList check)
// Store group so we don't need to call Mgr to get it later (if it's player group will be 0 otherwise would have joined as group)
for (LfgRolesMap::const_iterator it2 = itQueue->second.roles.begin(); it2 != itQueue->second.roles.end(); ++it2)
- proposalGroups[it2->first] = IS_GROUP(itQueue->first) ? itQueue->first : 0;
+ proposalGroups[it2->first] = IS_GROUP_GUID(itQueue->first) ? itQueue->first : 0;
numPlayers += itQueue->second.roles.size();
@@ -601,7 +601,7 @@ std::string LFGQueue::DumpQueueInfo() const
for (LfgGuidList::const_iterator it = queue.begin(); it != queue.end(); ++it)
{
uint64 guid = *it;
- if (IS_GROUP(guid))
+ if (IS_GROUP_GUID(guid))
{
groups++;
playersInGroup += sLFGMgr->GetPlayerCount(guid);
diff --git a/src/server/game/Entities/GameObject/GameObject.cpp b/src/server/game/Entities/GameObject/GameObject.cpp
index bab2eaa4186..bf0fbb4199d 100644
--- a/src/server/game/Entities/GameObject/GameObject.cpp
+++ b/src/server/game/Entities/GameObject/GameObject.cpp
@@ -270,7 +270,7 @@ void GameObject::Update(uint32 diff)
} else
AI()->UpdateAI(diff);
- if (IS_MO_TRANSPORT(GetGUID()))
+ if (IS_MO_TRANSPORT_GUID(GetGUID()))
{
//((Transport*)this)->Update(p_time);
return;
@@ -1098,11 +1098,7 @@ void GameObject::Use(Unit* user)
case GAMEOBJECT_TYPE_BUTTON: //1
//doors/buttons never really despawn, only reset to default state/flags
UseDoorOrButton(0, false, user);
-
- // activate script
- GetMap()->ScriptsStart(sGameObjectScripts, GetDBTableGUIDLow(), spellCaster, this);
return;
-
case GAMEOBJECT_TYPE_QUESTGIVER: //2
{
if (user->GetTypeId() != TYPEID_PLAYER)
diff --git a/src/server/game/Entities/Object/ObjectDefines.h b/src/server/game/Entities/Object/ObjectDefines.h
index c9ee1cd2dc6..d0b9819b0a3 100644
--- a/src/server/game/Entities/Object/ObjectDefines.h
+++ b/src/server/game/Entities/Object/ObjectDefines.h
@@ -21,64 +21,195 @@
#include "Define.h"
-// used for creating values for respawn for example
-#define MAKE_PAIR64(l, h) uint64(uint32(l) | (uint64(h) << 32))
-#define PAIR64_HIPART(x) (uint32)((uint64(x) >> 32) & UI64LIT(0x00000000FFFFFFFF))
-#define PAIR64_LOPART(x) (uint32)(uint64(x) & UI64LIT(0x00000000FFFFFFFF))
-
-#define MAKE_PAIR16(l, h) uint16(uint8(l) | (uint16(h) << 8))
-#define MAKE_PAIR32(l, h) uint32(uint16(l) | (uint32(h) << 16))
-#define PAIR32_HIPART(x) (uint16)((uint32(x) >> 16) & 0x0000FFFF)
-#define PAIR32_LOPART(x) (uint16)(uint32(x) & 0x0000FFFF)
-
enum HighGuid
{
- HIGHGUID_ITEM = 0x4000, // blizz 4000
- HIGHGUID_CONTAINER = 0x4000, // blizz 4000
- HIGHGUID_PLAYER = 0x0000, // blizz 0000
- HIGHGUID_GAMEOBJECT = 0xF110, // blizz F110
- HIGHGUID_TRANSPORT = 0xF120, // blizz F120 (for GAMEOBJECT_TYPE_TRANSPORT)
- HIGHGUID_UNIT = 0xF130, // blizz F130
- HIGHGUID_PET = 0xF140, // blizz F140
- HIGHGUID_VEHICLE = 0xF150, // blizz F550
- HIGHGUID_DYNAMICOBJECT = 0xF100, // blizz F100
- HIGHGUID_CORPSE = 0xF101, // blizz F100
- HIGHGUID_MO_TRANSPORT = 0x1FC0, // blizz 1FC0 (for GAMEOBJECT_TYPE_MO_TRANSPORT)
+ HIGHGUID_ITEM = 0x4000, // blizz 4000
+ HIGHGUID_CONTAINER = 0x4000, // blizz 4000
+ HIGHGUID_PLAYER = 0x0000, // blizz 0000
+ HIGHGUID_GAMEOBJECT = 0xF110, // blizz F110
+ HIGHGUID_TRANSPORT = 0xF120, // blizz F120 (for GAMEOBJECT_TYPE_TRANSPORT)
+ HIGHGUID_UNIT = 0xF130, // blizz F130
+ HIGHGUID_PET = 0xF140, // blizz F140
+ HIGHGUID_VEHICLE = 0xF150, // blizz F550
+ HIGHGUID_DYNAMICOBJECT = 0xF100, // blizz F100
+ HIGHGUID_CORPSE = 0xF101, // blizz F100
+ HIGHGUID_MO_TRANSPORT = 0x1FC0, // blizz 1FC0 (for GAMEOBJECT_TYPE_MO_TRANSPORT)
HIGHGUID_GROUP = 0x1F50
};
-#define IS_EMPTY_GUID(Guid) (Guid == 0)
-
-#define IS_CREATURE_GUID(Guid) (GUID_HIPART(Guid) == HIGHGUID_UNIT)
-#define IS_PET_GUID(Guid) (GUID_HIPART(Guid) == HIGHGUID_PET)
-#define IS_VEHICLE_GUID(Guid) (GUID_HIPART(Guid) == HIGHGUID_VEHICLE)
-#define IS_CRE_OR_VEH_GUID(Guid) (IS_CREATURE_GUID(Guid) || IS_VEHICLE_GUID(Guid))
-#define IS_CRE_OR_VEH_OR_PET_GUID(Guid)(IS_CRE_OR_VEH_GUID(Guid) || IS_PET_GUID(Guid))
-#define IS_PLAYER_GUID(Guid) (GUID_HIPART(Guid) == HIGHGUID_PLAYER && Guid != 0)
-#define IS_UNIT_GUID(Guid) (IS_CRE_OR_VEH_OR_PET_GUID(Guid) || IS_PLAYER_GUID(Guid))
- // special case for empty guid need check
-#define IS_ITEM_GUID(Guid) (GUID_HIPART(Guid) == HIGHGUID_ITEM)
-#define IS_GAMEOBJECT_GUID(Guid) (GUID_HIPART(Guid) == HIGHGUID_GAMEOBJECT)
-#define IS_DYNAMICOBJECT_GUID(Guid) (GUID_HIPART(Guid) == HIGHGUID_DYNAMICOBJECT)
-#define IS_CORPSE_GUID(Guid) (GUID_HIPART(Guid) == HIGHGUID_CORPSE)
-#define IS_TRANSPORT(Guid) (GUID_HIPART(Guid) == HIGHGUID_TRANSPORT)
-#define IS_MO_TRANSPORT(Guid) (GUID_HIPART(Guid) == HIGHGUID_MO_TRANSPORT)
-#define IS_GROUP(Guid) (GUID_HIPART(Guid) == HIGHGUID_GROUP)
+// used for creating values for respawn for example
+inline uint64 MAKE_PAIR64(uint32 l, uint32 h);
+inline uint32 PAIR64_HIPART(uint64 x);
+inline uint32 PAIR64_LOPART(uint64 x);
+inline uint16 MAKE_PAIR16(uint8 l, uint8 h);
+inline uint32 MAKE_PAIR32(uint16 l, uint16 h);
+inline uint16 PAIR32_HIPART(uint32 x);
+inline uint16 PAIR32_LOPART(uint32 x);
+
+inline bool IS_EMPTY_GUID(uint64 guid);
+inline bool IS_CREATURE_GUID(uint64 guid);
+inline bool IS_PET_GUID(uint64 guid);
+inline bool IS_VEHICLE_GUID(uint64 guid);
+inline bool IS_CRE_OR_VEH_GUID(uint64 guid);
+inline bool IS_CRE_OR_VEH_OR_PET_GUID(uint64 guid);
+inline bool IS_PLAYER_GUID(uint64 guid);
+inline bool IS_UNIT_GUID(uint64 guid);
+inline bool IS_ITEM_GUID(uint64 guid);
+inline bool IS_GAMEOBJECT_GUID(uint64 guid);
+inline bool IS_DYNAMICOBJECT_GUID(uint64 guid);
+inline bool IS_CORPSE_GUID(uint64 guid);
+inline bool IS_TRANSPORT_GUID(uint64 guid);
+inline bool IS_MO_TRANSPORT_GUID(uint64 guid);
+inline bool IS_GROUP_GUID(uint64 guid);
// l - OBJECT_FIELD_GUID
// e - OBJECT_FIELD_ENTRY for GO (except GAMEOBJECT_TYPE_MO_TRANSPORT) and creatures or UNIT_FIELD_PETNUMBER for pets
// h - OBJECT_FIELD_GUID + 1
-#define MAKE_NEW_GUID(l, e, h) uint64(uint64(l) | (uint64(e) << 24) | (uint64(h) << 48))
+inline uint64 MAKE_NEW_GUID(uint32 l, uint32 e, uint32 h);
+
+//#define GUID_HIPART(x) (uint32)((uint64(x) >> 52)) & 0x0000FFFF)
+inline uint32 GUID_HIPART(uint64 guid);
+inline uint32 GUID_ENPART(uint64 x);
+inline uint32 GUID_LOPART(uint64 x);
+
+inline bool IsGuidHaveEnPart(uint64 guid);
+inline char const* GetLogNameForGuid(uint64 guid);
+
+uint64 MAKE_PAIR64(uint32 l, uint32 h)
+{
+ return uint64(l | (uint64(h) << 32));
+}
+
+uint32 PAIR64_HIPART(uint64 x)
+{
+ return (uint32)((x >> 32) & UI64LIT(0x00000000FFFFFFFF));
+}
-#define GUID_HIPART(x) (uint32)((uint64(x) >> 48) & 0x0000FFFF)
+uint32 PAIR64_LOPART(uint64 x)
+{
+ return (uint32)(x & UI64LIT(0x00000000FFFFFFFF));
+}
-// We have different low and middle part size for different guid types
-#define _GUID_ENPART_2(x) 0
-#define _GUID_ENPART_3(x) (uint32)((uint64(x) >> 24) & UI64LIT(0x0000000000FFFFFF))
-#define _GUID_LOPART_2(x) (uint32)(uint64(x) & UI64LIT(0x00000000FFFFFFFF))
-#define _GUID_LOPART_3(x) (uint32)(uint64(x) & UI64LIT(0x0000000000FFFFFF))
+uint16 MAKE_PAIR16(uint8 l, uint8 h)
+{
+ return uint16(l | (uint16(h) << 8));
+}
-inline bool IsGuidHaveEnPart(uint64 guid)
+uint32 MAKE_PAIR32(uint16 l, uint16 h)
+{
+ return uint32(l | (uint32(h) << 16));
+}
+
+uint16 PAIR32_HIPART(uint32 x)
+{
+ return (uint16)((x >> 16) & 0x0000FFFF);
+}
+
+uint16 PAIR32_LOPART(uint32 x)
+{
+ return (uint16)(x & 0x0000FFFF);
+}
+
+bool IS_EMPTY_GUID(uint64 guid)
+{
+ return guid == 0;
+}
+
+bool IS_CREATURE_GUID(uint64 guid)
+{
+ return GUID_HIPART(guid) == HIGHGUID_UNIT;
+}
+
+bool IS_PET_GUID(uint64 guid)
+{
+ return GUID_HIPART(guid) == HIGHGUID_PET;
+}
+
+bool IS_VEHICLE_GUID(uint64 guid)
+{
+ return GUID_HIPART(guid) == HIGHGUID_VEHICLE;
+}
+
+bool IS_CRE_OR_VEH_GUID(uint64 guid)
+{
+ return IS_CREATURE_GUID(guid) || IS_VEHICLE_GUID(guid);
+}
+
+bool IS_CRE_OR_VEH_OR_PET_GUID(uint64 guid)
+{
+ return IS_CRE_OR_VEH_GUID(guid) || IS_PET_GUID(guid);
+}
+
+bool IS_PLAYER_GUID(uint64 guid)
+{
+ return guid != 0 && GUID_HIPART(guid) == HIGHGUID_PLAYER;
+}
+
+bool IS_UNIT_GUID(uint64 guid)
+{
+ return IS_CRE_OR_VEH_OR_PET_GUID(guid) || IS_PLAYER_GUID(guid);
+}
+
+bool IS_ITEM_GUID(uint64 guid)
+{
+ return GUID_HIPART(guid) == HIGHGUID_ITEM;
+}
+
+bool IS_GAMEOBJECT_GUID(uint64 guid)
+{
+ return GUID_HIPART(guid) == HIGHGUID_GAMEOBJECT;
+}
+
+bool IS_DYNAMICOBJECT_GUID(uint64 guid)
+{
+ return GUID_HIPART(guid) == HIGHGUID_DYNAMICOBJECT;
+}
+
+bool IS_CORPSE_GUID(uint64 guid)
+{
+ return GUID_HIPART(guid) == HIGHGUID_CORPSE;
+}
+
+bool IS_TRANSPORT_GUID(uint64 guid)
+{
+ return GUID_HIPART(guid) == HIGHGUID_TRANSPORT;
+}
+
+bool IS_MO_TRANSPORT_GUID(uint64 guid)
+{
+ return GUID_HIPART(guid) == HIGHGUID_MO_TRANSPORT;
+}
+
+bool IS_GROUP_GUID(uint64 guid)
+{
+ return GUID_HIPART(guid) == HIGHGUID_GROUP;
+}
+
+uint64 MAKE_NEW_GUID(uint32 l, uint32 e, uint32 h)
+{
+ return uint64(uint64(l) | (uint64(e) << 24) | (uint64(h) << 48));
+}
+
+uint32 GUID_HIPART(uint64 guid)
+{
+ return (uint32)((uint64(guid) >> 48) & 0x0000FFFF);
+}
+
+uint32 GUID_ENPART(uint64 x)
+{
+ return IsGuidHaveEnPart(x)
+ ? (uint32)((x >> 24) & UI64LIT(0x0000000000FFFFFF))
+ : 0;
+}
+
+uint32 GUID_LOPART(uint64 x)
+{
+ return IsGuidHaveEnPart(x)
+ ? (uint32)(x & UI64LIT(0x0000000000FFFFFF))
+ : (uint32)(x & UI64LIT(0x00000000FFFFFFFF));
+}
+
+bool IsGuidHaveEnPart(uint64 guid)
{
switch (GUID_HIPART(guid))
{
@@ -99,10 +230,7 @@ inline bool IsGuidHaveEnPart(uint64 guid)
}
}
-#define GUID_ENPART(x) (IsGuidHaveEnPart(x) ? _GUID_ENPART_3(x) : _GUID_ENPART_2(x))
-#define GUID_LOPART(x) (IsGuidHaveEnPart(x) ? _GUID_LOPART_3(x) : _GUID_LOPART_2(x))
-
-inline char const* GetLogNameForGuid(uint64 guid)
+char const* GetLogNameForGuid(uint64 guid)
{
switch (GUID_HIPART(guid))
{
@@ -121,4 +249,5 @@ inline char const* GetLogNameForGuid(uint64 guid)
return "<unknown>";
}
}
+
#endif
diff --git a/src/server/game/Entities/Pet/Pet.cpp b/src/server/game/Entities/Pet/Pet.cpp
index fcfd6523812..d11f6d94734 100644
--- a/src/server/game/Entities/Pet/Pet.cpp
+++ b/src/server/game/Entities/Pet/Pet.cpp
@@ -1775,8 +1775,7 @@ void Pet::resetTalentsForAllPetsOf(Player* owner, Pet* online_pet /*= NULL*/)
ss << id;
need_comma = true;
- }
- while (resultPets->NextRow());
+ } while (resultPets->NextRow());
ss << ") AND spell IN (";
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp
index 66e37a2e10f..e501471b688 100644
--- a/src/server/game/Entities/Player/Player.cpp
+++ b/src/server/game/Entities/Player/Player.cpp
@@ -1753,7 +1753,8 @@ void Player::Update(uint32 p_time)
{
if (p_time >= m_nextSave)
{
- // m_nextSave reseted in SaveToDB call
+ // m_nextSave reset in SaveToDB call
+ sScriptMgr->OnPlayerSave(this);
SaveToDB();
sLog->outDebug(LOG_FILTER_PLAYER, "Player '%s' (GUID: %u) saved", GetName().c_str(), GetGUIDLow());
}
@@ -7957,8 +7958,12 @@ void Player::_ApplyItemBonuses(ItemTemplate const* proto, uint8 slot, bool apply
// If set ScalingStatValue armor get it or use item armor
uint32 armor = proto->Armor;
if (ssv)
+ {
if (uint32 ssvarmor = ssv->getArmorMod(proto->ScalingStatValue))
armor = ssvarmor;
+ }
+ else if (armor && proto->ArmorDamageModifier)
+ armor -= uint32(proto->ArmorDamageModifier);
if (armor)
{
@@ -8216,8 +8221,8 @@ void Player::ApplyEquipSpell(SpellInfo const* spellInfo, Item* item, bool apply,
if (form_change) // check aura active state from other form
{
- AuraApplicationMap const& auras = GetAppliedAuras();
- for (AuraApplicationMap::const_iterator itr = auras.lower_bound(spellInfo->Id); itr != auras.upper_bound(spellInfo->Id); ++itr)
+ AuraApplicationMapBounds range = GetAppliedAuras().equal_range(spellInfo->Id);
+ for (AuraApplicationMap::const_iterator itr = range.first; itr != range.second; ++itr)
if (!item || itr->second->GetBase()->GetCastItemGUID() == item->GetGUID())
return;
}
@@ -8236,7 +8241,7 @@ void Player::ApplyEquipSpell(SpellInfo const* spellInfo, Item* item, bool apply,
}
if (item)
- RemoveAurasDueToItemSpell(item, spellInfo->Id); // un-apply all spells, not only at-equipped
+ RemoveAurasDueToItemSpell(spellInfo->Id, item->GetGUID()); // un-apply all spells, not only at-equipped
else
RemoveAurasDueToSpell(spellInfo->Id); // un-apply spell (item set case)
}
@@ -13847,7 +13852,7 @@ void Player::ApplyEnchantment(Item* item, EnchantmentSlot slot, bool apply, bool
CastSpell(this, enchant_spell_id, true, item);
}
else
- RemoveAurasDueToItemSpell(item, enchant_spell_id);
+ RemoveAurasDueToItemSpell(enchant_spell_id, item->GetGUID());
}
break;
case ITEM_ENCHANTMENT_TYPE_RESISTANCE:
@@ -15356,14 +15361,14 @@ bool Player::SatisfyQuestPreviousQuest(Quest const* qInfo, bool msg)
// each-from-all exclusive group (< 0)
// can be start if only all quests in prev quest exclusive group completed and rewarded
- ObjectMgr::ExclusiveQuestGroups::iterator iter2 = sObjectMgr->mExclusiveQuestGroups.lower_bound(qPrevInfo->GetExclusiveGroup());
- ObjectMgr::ExclusiveQuestGroups::iterator end = sObjectMgr->mExclusiveQuestGroups.upper_bound(qPrevInfo->GetExclusiveGroup());
+ ObjectMgr::ExclusiveQuestGroupsBounds range(sObjectMgr->mExclusiveQuestGroups.equal_range(qPrevInfo->GetExclusiveGroup()));
- ASSERT(iter2 != end); // always must be found if qPrevInfo->ExclusiveGroup != 0
+ // always must be found if qPrevInfo->ExclusiveGroup != 0
+ ASSERT(range.first != range.second);
- for (; iter2 != end; ++iter2)
+ for (; range.first != range.second; ++range.first)
{
- uint32 exclude_Id = iter2->second;
+ uint32 exclude_Id = range.first->second;
// skip checked quest id, only state of other quests in group is interesting
if (exclude_Id == prevId)
@@ -15389,14 +15394,14 @@ bool Player::SatisfyQuestPreviousQuest(Quest const* qInfo, bool msg)
// each-from-all exclusive group (< 0)
// can be start if only all quests in prev quest exclusive group active
- ObjectMgr::ExclusiveQuestGroups::iterator iter2 = sObjectMgr->mExclusiveQuestGroups.lower_bound(qPrevInfo->GetExclusiveGroup());
- ObjectMgr::ExclusiveQuestGroups::iterator end = sObjectMgr->mExclusiveQuestGroups.upper_bound(qPrevInfo->GetExclusiveGroup());
+ ObjectMgr::ExclusiveQuestGroupsBounds range(sObjectMgr->mExclusiveQuestGroups.equal_range(qPrevInfo->GetExclusiveGroup()));
- ASSERT(iter2 != end); // always must be found if qPrevInfo->ExclusiveGroup != 0
+ // always must be found if qPrevInfo->ExclusiveGroup != 0
+ ASSERT(range.first != range.second);
- for (; iter2 != end; ++iter2)
+ for (; range.first != range.second; ++range.first)
{
- uint32 exclude_Id = iter2->second;
+ uint32 exclude_Id = range.first->second;
// skip checked quest id, only state of other quests in group is interesting
if (exclude_Id == prevId)
@@ -15527,14 +15532,14 @@ bool Player::SatisfyQuestExclusiveGroup(Quest const* qInfo, bool msg)
if (qInfo->GetExclusiveGroup() <= 0)
return true;
- ObjectMgr::ExclusiveQuestGroups::iterator iter = sObjectMgr->mExclusiveQuestGroups.lower_bound(qInfo->GetExclusiveGroup());
- ObjectMgr::ExclusiveQuestGroups::iterator end = sObjectMgr->mExclusiveQuestGroups.upper_bound(qInfo->GetExclusiveGroup());
+ ObjectMgr::ExclusiveQuestGroupsBounds range(sObjectMgr->mExclusiveQuestGroups.equal_range(qInfo->GetExclusiveGroup()));
- ASSERT(iter != end); // always must be found if qInfo->ExclusiveGroup != 0
+ // always must be found if qInfo->ExclusiveGroup != 0
+ ASSERT(range.first != range.second);
- for (; iter != end; ++iter)
+ for (; range.first != range.second; ++range.first)
{
- uint32 exclude_Id = iter->second;
+ uint32 exclude_Id = range.first->second;
// skip checked quest id, only state of other quests in group is interesting
if (exclude_Id == qInfo->GetQuestId())
@@ -15542,7 +15547,7 @@ bool Player::SatisfyQuestExclusiveGroup(Quest const* qInfo, bool msg)
// not allow have daily quest if daily quest from exclusive group already recently completed
Quest const* Nquest = sObjectMgr->GetQuestTemplate(exclude_Id);
- if (!SatisfyQuestDay(Nquest, false) || !SatisfyQuestWeek(Nquest, false) || !SatisfyQuestSeasonal(Nquest,false))
+ if (!SatisfyQuestDay(Nquest, false) || !SatisfyQuestWeek(Nquest, false) || !SatisfyQuestSeasonal(Nquest, false))
{
if (msg)
SendCanTakeQuestResponse(INVALIDREASON_DONT_HAVE_REQ);
@@ -16003,6 +16008,8 @@ void Player::ItemRemovedQuestCheck(uint32 entry, uint32 count)
void Player::KilledMonster(CreatureTemplate const* cInfo, uint64 guid)
{
+ ASSERT(cInfo);
+
if (cInfo->Entry)
KilledMonsterCredit(cInfo->Entry, guid);
@@ -16155,6 +16162,12 @@ void Player::CastedCreatureOrGO(uint32 entry, uint64 guid, uint32 spell_id)
if (reqTarget != entry) // if entry doesn't match, check for killcredits referenced in template
{
CreatureTemplate const* cinfo = sObjectMgr->GetCreatureTemplate(entry);
+ if (!cinfo)
+ {
+ sLog->outError(LOG_FILTER_PLAYER, "Player::CastedCreatureOrGO: GetCreatureTemplate failed for entry %u. Skipping.", entry);
+ continue;
+ }
+
for (uint8 k = 0; k < MAX_KILL_CREDIT; ++k)
if (cinfo->KillCredit[k] == reqTarget)
entry = cinfo->KillCredit[k];
diff --git a/src/server/game/Entities/Unit/StatSystem.cpp b/src/server/game/Entities/Unit/StatSystem.cpp
index 1bd7c1b217d..5cf0550905c 100644
--- a/src/server/game/Entities/Unit/StatSystem.cpp
+++ b/src/server/game/Entities/Unit/StatSystem.cpp
@@ -200,10 +200,9 @@ void Player::UpdateResistances(uint32 school)
void Player::UpdateArmor()
{
- float value = 0.0f;
UnitMods unitMod = UNIT_MOD_ARMOR;
- value = GetModifierValue(unitMod, BASE_VALUE); // base armor (from items)
+ float value = GetModifierValue(unitMod, BASE_VALUE); // base armor (from items)
value *= GetModifierValue(unitMod, BASE_PCT); // armor percent from items
value += GetStat(STAT_AGILITY) * 2.0f; // armor bonus from stats
value += GetModifierValue(unitMod, TOTAL_VALUE);
@@ -1091,10 +1090,9 @@ bool Guardian::UpdateStats(Stats stat)
case STAT_STRENGTH: mod = 0.7f; break; // Default Owner's Strength scale
default: break;
}
- // Ravenous Dead
- AuraEffect const* aurEff = NULL;
+
// Check just if owner has Ravenous Dead since it's effect is not an aura
- aurEff = owner->GetAuraEffect(SPELL_AURA_MOD_TOTAL_STAT_PERCENTAGE, SPELLFAMILY_DEATHKNIGHT, 3010, 0);
+ AuraEffect const* aurEff = owner->GetAuraEffect(SPELL_AURA_MOD_TOTAL_STAT_PERCENTAGE, SPELLFAMILY_DEATHKNIGHT, 3010, 0);
if (aurEff)
{
SpellInfo const* spellInfo = aurEff->GetSpellInfo(); // Then get the SpellProto and add the dummy effect value
diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp
index 9af42f786ef..d383b92c5ff 100644
--- a/src/server/game/Entities/Unit/Unit.cpp
+++ b/src/server/game/Entities/Unit/Unit.cpp
@@ -3401,8 +3401,11 @@ void Unit::_UnapplyAura(AuraApplication * aurApp, AuraRemoveMode removeMode)
{
// aura can be removed from unit only if it's applied on it, shouldn't happen
ASSERT(aurApp->GetBase()->GetApplicationOfTarget(GetGUID()) == aurApp);
+
uint32 spellId = aurApp->GetBase()->GetId();
- for (AuraApplicationMap::iterator iter = m_appliedAuras.lower_bound(spellId); iter != m_appliedAuras.upper_bound(spellId);)
+ AuraApplicationMapBoundsNonConst range = m_appliedAuras.equal_range(spellId);
+
+ for (AuraApplicationMap::iterator iter = range.first; iter != range.second;)
{
if (iter->second == aurApp)
{
@@ -3492,20 +3495,33 @@ void Unit::RemoveOwnedAura(Aura* aura, AuraRemoveMode removeMode)
ASSERT(aura->GetOwner() == this);
uint32 spellId = aura->GetId();
- for (AuraMap::iterator itr = m_ownedAuras.lower_bound(spellId); itr != m_ownedAuras.upper_bound(spellId); ++itr)
+ AuraMapBoundsNonConst range = m_ownedAuras.equal_range(spellId);
+
+ for (AuraMap::iterator itr = range.first; itr != range.second; ++itr)
+ {
if (itr->second == aura)
{
RemoveOwnedAura(itr, removeMode);
return;
}
+ }
+
ASSERT(false);
}
Aura* Unit::GetOwnedAura(uint32 spellId, uint64 casterGUID, uint64 itemCasterGUID, uint8 reqEffMask, Aura* except) const
{
- for (AuraMap::const_iterator itr = m_ownedAuras.lower_bound(spellId); itr != m_ownedAuras.upper_bound(spellId); ++itr)
- if (((itr->second->GetEffectMask() & reqEffMask) == reqEffMask) && (!casterGUID || itr->second->GetCasterGUID() == casterGUID) && (!itemCasterGUID || itr->second->GetCastItemGUID() == itemCasterGUID) && (!except || except != itr->second))
+ AuraMapBounds range = m_ownedAuras.equal_range(spellId);
+ for (AuraMap::const_iterator itr = range.first; itr != range.second; ++itr)
+ {
+ if (((itr->second->GetEffectMask() & reqEffMask) == reqEffMask)
+ && (!casterGUID || itr->second->GetCasterGUID() == casterGUID)
+ && (!itemCasterGUID || itr->second->GetCastItemGUID() == itemCasterGUID)
+ && (!except || except != itr->second))
+ {
return itr->second;
+ }
+ }
return NULL;
}
@@ -3524,11 +3540,12 @@ void Unit::RemoveAura(AuraApplicationMap::iterator &i, AuraRemoveMode mode)
void Unit::RemoveAura(uint32 spellId, uint64 caster, uint8 reqEffMask, AuraRemoveMode removeMode)
{
- for (AuraApplicationMap::iterator iter = m_appliedAuras.lower_bound(spellId); iter != m_appliedAuras.upper_bound(spellId);)
+ AuraApplicationMapBoundsNonConst range = m_appliedAuras.equal_range(spellId);
+ for (AuraApplicationMap::iterator iter = range.first; iter != range.second;)
{
Aura const* aura = iter->second->GetBase();
if (((aura->GetEffectMask() & reqEffMask) == reqEffMask)
- && (!caster || aura->GetCasterGUID() == caster))
+ && (!caster || aura->GetCasterGUID() == caster))
{
RemoveAura(iter, removeMode);
return;
@@ -3557,8 +3574,11 @@ void Unit::RemoveAura(AuraApplication * aurApp, AuraRemoveMode mode)
// no need to remove
if (aurApp->GetBase()->GetApplicationOfTarget(GetGUID()) != aurApp || aurApp->GetBase()->IsRemoved())
return;
+
uint32 spellId = aurApp->GetBase()->GetId();
- for (AuraApplicationMap::iterator iter = m_appliedAuras.lower_bound(spellId); iter != m_appliedAuras.upper_bound(spellId);)
+ AuraApplicationMapBoundsNonConst range = m_appliedAuras.equal_range(spellId);
+
+ for (AuraApplicationMap::iterator iter = range.first; iter != range.second;)
{
if (aurApp == iter->second)
{
@@ -3596,11 +3616,12 @@ void Unit::RemoveAurasDueToSpell(uint32 spellId, uint64 casterGUID, uint8 reqEff
void Unit::RemoveAuraFromStack(uint32 spellId, uint64 casterGUID, AuraRemoveMode removeMode)
{
- for (AuraMap::iterator iter = m_ownedAuras.lower_bound(spellId); iter != m_ownedAuras.upper_bound(spellId);)
+ AuraMapBoundsNonConst range = m_ownedAuras.equal_range(spellId);
+ for (AuraMap::iterator iter = range.first; iter != range.second;)
{
Aura* aura = iter->second;
if ((aura->GetType() == UNIT_AURA_TYPE)
- && (!casterGUID || aura->GetCasterGUID() == casterGUID))
+ && (!casterGUID || aura->GetCasterGUID() == casterGUID))
{
aura->ModStackAmount(-1, removeMode);
return;
@@ -3612,7 +3633,8 @@ void Unit::RemoveAuraFromStack(uint32 spellId, uint64 casterGUID, AuraRemoveMode
void Unit::RemoveAurasDueToSpellByDispel(uint32 spellId, uint32 dispellerSpellId, uint64 casterGUID, Unit* dispeller, uint8 chargesRemoved/*= 1*/)
{
- for (AuraMap::iterator iter = m_ownedAuras.lower_bound(spellId); iter != m_ownedAuras.upper_bound(spellId);)
+ AuraMapBoundsNonConst range = m_ownedAuras.equal_range(spellId);
+ for (AuraMap::iterator iter = range.first; iter != range.second;)
{
Aura* aura = iter->second;
if (aura->GetCasterGUID() == casterGUID)
@@ -3639,7 +3661,8 @@ void Unit::RemoveAurasDueToSpellByDispel(uint32 spellId, uint32 dispellerSpellId
void Unit::RemoveAurasDueToSpellBySteal(uint32 spellId, uint64 casterGUID, Unit* stealer)
{
- for (AuraMap::iterator iter = m_ownedAuras.lower_bound(spellId); iter != m_ownedAuras.upper_bound(spellId);)
+ AuraMapBoundsNonConst range = m_ownedAuras.equal_range(spellId);
+ for (AuraMap::iterator iter = range.first; iter != range.second;)
{
Aura* aura = iter->second;
if (aura->GetCasterGUID() == casterGUID)
@@ -3712,14 +3735,14 @@ void Unit::RemoveAurasDueToSpellBySteal(uint32 spellId, uint64 casterGUID, Unit*
}
}
-void Unit::RemoveAurasDueToItemSpell(Item* castItem, uint32 spellId)
+void Unit::RemoveAurasDueToItemSpell(uint32 spellId, uint64 castItemGuid)
{
for (AuraApplicationMap::iterator iter = m_appliedAuras.lower_bound(spellId); iter != m_appliedAuras.upper_bound(spellId);)
{
- if (!castItem || iter->second->GetBase()->GetCastItemGUID() == castItem->GetGUID())
+ if (iter->second->GetBase()->GetCastItemGUID() == castItemGuid)
{
RemoveAura(iter);
- iter = m_appliedAuras.upper_bound(spellId); // overwrite by more appropriate
+ iter = m_appliedAuras.lower_bound(spellId);
}
else
++iter;
@@ -3999,9 +4022,10 @@ void Unit::RemoveAllAurasExceptType(AuraType type)
void Unit::DelayOwnedAuras(uint32 spellId, uint64 caster, int32 delaytime)
{
- for (AuraMap::iterator iter = m_ownedAuras.lower_bound(spellId); iter != m_ownedAuras.upper_bound(spellId);++iter)
+ AuraMapBoundsNonConst range = m_ownedAuras.equal_range(spellId);
+ for (; range.first != range.second; ++range.first)
{
- Aura* aura = iter->second;
+ Aura* aura = range.first->second;
if (!caster || aura->GetCasterGUID() == caster)
{
if (aura->GetDuration() < delaytime)
@@ -4030,9 +4054,15 @@ void Unit::_ApplyAllAuraStatMods()
AuraEffect* Unit::GetAuraEffect(uint32 spellId, uint8 effIndex, uint64 caster) const
{
- for (AuraApplicationMap::const_iterator itr = m_appliedAuras.lower_bound(spellId); itr != m_appliedAuras.upper_bound(spellId); ++itr)
- if (itr->second->HasEffect(effIndex) && (!caster || itr->second->GetBase()->GetCasterGUID() == caster))
+ AuraApplicationMapBounds range = m_appliedAuras.equal_range(spellId);
+ for (AuraApplicationMap::const_iterator itr = range.first; itr != range.second; ++itr)
+ {
+ if (itr->second->HasEffect(effIndex)
+ && (!caster || itr->second->GetBase()->GetCasterGUID() == caster))
+ {
return itr->second->GetBase()->GetEffect(effIndex);
+ }
+ }
return NULL;
}
@@ -4080,11 +4110,19 @@ AuraEffect* Unit::GetAuraEffect(AuraType type, SpellFamilyNames family, uint32 f
AuraApplication * Unit::GetAuraApplication(uint32 spellId, uint64 casterGUID, uint64 itemCasterGUID, uint8 reqEffMask, AuraApplication * except) const
{
- for (AuraApplicationMap::const_iterator itr = m_appliedAuras.lower_bound(spellId); itr != m_appliedAuras.upper_bound(spellId); ++itr)
+ AuraApplicationMapBounds range = m_appliedAuras.equal_range(spellId);
+ for (; range.first != range.second; ++range.first)
{
- Aura const* aura = itr->second->GetBase();
- if (((aura->GetEffectMask() & reqEffMask) == reqEffMask) && (!casterGUID || aura->GetCasterGUID() == casterGUID) && (!itemCasterGUID || aura->GetCastItemGUID() == itemCasterGUID) && (!except || except != itr->second))
- return itr->second;
+ AuraApplication* app = range.first->second;
+ Aura const* aura = app->GetBase();
+
+ if (((aura->GetEffectMask() & reqEffMask) == reqEffMask)
+ && (!casterGUID || aura->GetCasterGUID() == casterGUID)
+ && (!itemCasterGUID || aura->GetCastItemGUID() == itemCasterGUID)
+ && (!except || except != app))
+ {
+ return app;
+ }
}
return NULL;
}
@@ -4154,22 +4192,31 @@ void Unit::GetDispellableAuraList(Unit* caster, uint32 dispelMask, DispelCharges
bool Unit::HasAuraEffect(uint32 spellId, uint8 effIndex, uint64 caster) const
{
- for (AuraApplicationMap::const_iterator itr = m_appliedAuras.lower_bound(spellId); itr != m_appliedAuras.upper_bound(spellId); ++itr)
- if (itr->second->HasEffect(effIndex) && (!caster || itr->second->GetBase()->GetCasterGUID() == caster))
+ AuraApplicationMapBounds range = m_appliedAuras.equal_range(spellId);
+ for (AuraApplicationMap::const_iterator itr = range.first; itr != range.second; ++itr)
+ {
+ if (itr->second->HasEffect(effIndex)
+ && (!caster || itr->second->GetBase()->GetCasterGUID() == caster))
+ {
return true;
+ }
+ }
return false;
}
uint32 Unit::GetAuraCount(uint32 spellId) const
{
uint32 count = 0;
- for (AuraApplicationMap::const_iterator itr = m_appliedAuras.lower_bound(spellId); itr != m_appliedAuras.upper_bound(spellId); ++itr)
+ AuraApplicationMapBounds range = m_appliedAuras.equal_range(spellId);
+
+ for (AuraApplicationMap::const_iterator itr = range.first; itr != range.second; ++itr)
{
- if (!itr->second->GetBase()->GetStackAmount())
- count++;
+ if (itr->second->GetBase()->GetStackAmount() == 0)
+ ++count;
else
count += (uint32)itr->second->GetBase()->GetStackAmount();
}
+
return count;
}
@@ -9682,7 +9729,8 @@ bool Unit::HasAuraState(AuraStateType flag, SpellInfo const* spellProto, Unit co
// If aura with aurastate by caster not found return false
if ((1<<(flag-1)) & PER_CASTER_AURA_STATE_MASK)
{
- for (AuraStateAurasMap::const_iterator itr = m_auraStateAuras.lower_bound(flag); itr != m_auraStateAuras.upper_bound(flag); ++itr)
+ AuraStateAurasMapBounds range = m_auraStateAuras.equal_range(flag);
+ for (AuraStateAurasMap::const_iterator itr = range.first; itr != range.second; ++itr)
if (itr->second->GetBase()->GetCasterGUID() == Caster->GetGUID())
return true;
return false;
@@ -12664,9 +12712,27 @@ void Unit::UpdateSpeed(UnitMoveType mtype, bool forced)
case MOVE_SWIM:
case MOVE_FLIGHT:
{
- // Set creature speed rate from CreatureInfo
+ // Set creature speed rate
if (GetTypeId() == TYPEID_UNIT)
- speed *= ToCreature()->GetCreatureTemplate()->speed_run; // at this point, MOVE_WALK is never reached
+ {
+ Unit* pOwner = GetCharmerOrOwner();
+ if ((isPet() || isGuardian()) && !isInCombat() && pOwner) // Must check for owner or crash on "Tame Beast"
+ {
+ // For every yard over 5, increase speed by 0.01
+ // to help prevent pet from lagging behind and despawning
+ float dist = GetDistance(pOwner);
+ float base_rate = 1.00f; // base speed is 100% of owner speed
+
+ if (dist < 5)
+ dist = 5;
+
+ float mult = base_rate + ((dist - 5) * 0.01f);
+
+ speed *= pOwner->GetSpeedRate(mtype) * mult; // pets derive speed from owner when not in combat
+ }
+ else
+ speed *= ToCreature()->GetCreatureTemplate()->speed_run; // at this point, MOVE_WALK is never reached
+ }
// Normalize speed by 191 aura SPELL_AURA_USE_NORMAL_MOVEMENT_SPEED if need
// TODO: possible affect only on MOVE_RUN
@@ -14382,6 +14448,12 @@ void Unit::ProcDamageAndSpellFor(bool isVictim, Unit* target, uint32 procFlag, u
}
}
+ Unit* actor = isVictim ? target : this;
+ Unit* actionTarget = !isVictim ? target : this;
+
+ DamageInfo damageInfo = DamageInfo(actor, actionTarget, damage, procSpell, procSpell ? SpellSchoolMask(procSpell->SchoolMask) : SPELL_SCHOOL_MASK_NORMAL, SPELL_DIRECT_DAMAGE);
+ ProcEventInfo eventInfo = ProcEventInfo(actor, actionTarget, target, procFlag, 0, 0, procExtra, NULL, &damageInfo, NULL /*HealInfo*/);
+
ProcTriggeredList procTriggered;
// Fill procTriggered list
for (AuraApplicationMap::const_iterator itr = GetAppliedAuras().begin(); itr!= GetAppliedAuras().end(); ++itr)
@@ -14405,6 +14477,12 @@ void Unit::ProcDamageAndSpellFor(bool isVictim, Unit* target, uint32 procFlag, u
if (!IsTriggeredAtSpellProcEvent(target, triggerData.aura, procSpell, procFlag, procExtra, attType, isVictim, active, triggerData.spellProcEvent))
continue;
+ // do checks using conditions table
+ ConditionList conditions = sConditionMgr->GetConditionsForNotGroupedEntry(CONDITION_SOURCE_TYPE_SPELL_PROC, spellProto->Id);
+ ConditionSourceInfo condInfo = ConditionSourceInfo(eventInfo.GetActor(), eventInfo.GetActionTarget());
+ if (!sConditionMgr->IsObjectMeetToConditions(condInfo, conditions))
+ continue;
+
// Triggered spells not triggering additional spells
bool triggered = !(spellProto->AttributesEx3 & SPELL_ATTR3_CAN_PROC_WITH_TRIGGERED) ?
(procExtra & PROC_EX_INTERNAL_TRIGGERED && !(procFlag & PROC_FLAG_DONE_TRAP_ACTIVATION)) : false;
diff --git a/src/server/game/Entities/Unit/Unit.h b/src/server/game/Entities/Unit/Unit.h
index f1fe661a5cc..c714303e8c7 100644
--- a/src/server/game/Entities/Unit/Unit.h
+++ b/src/server/game/Entities/Unit/Unit.h
@@ -1201,10 +1201,18 @@ class Unit : public WorldObject
public:
typedef std::set<Unit*> AttackerSet;
typedef std::set<Unit*> ControlList;
- typedef std::pair<uint32, uint8> spellEffectPair;
+
typedef std::multimap<uint32, Aura*> AuraMap;
+ typedef std::pair<AuraMap::const_iterator, AuraMap::const_iterator> AuraMapBounds;
+ typedef std::pair<AuraMap::iterator, AuraMap::iterator> AuraMapBoundsNonConst;
+
typedef std::multimap<uint32, AuraApplication*> AuraApplicationMap;
+ typedef std::pair<AuraApplicationMap::const_iterator, AuraApplicationMap::const_iterator> AuraApplicationMapBounds;
+ typedef std::pair<AuraApplicationMap::iterator, AuraApplicationMap::iterator> AuraApplicationMapBoundsNonConst;
+
typedef std::multimap<AuraStateType, AuraApplication*> AuraStateAurasMap;
+ typedef std::pair<AuraStateAurasMap::const_iterator, AuraStateAurasMap::const_iterator> AuraStateAurasMapBounds;
+
typedef std::list<AuraEffect*> AuraEffectList;
typedef std::list<Aura*> AuraList;
typedef std::list<AuraApplication *> AuraApplicationList;
@@ -1764,7 +1772,7 @@ class Unit : public WorldObject
void RemoveAuraFromStack(uint32 spellId, uint64 casterGUID = 0, AuraRemoveMode removeMode = AURA_REMOVE_BY_DEFAULT);
void RemoveAurasDueToSpellByDispel(uint32 spellId, uint32 dispellerSpellId, uint64 casterGUID, Unit* dispeller, uint8 chargesRemoved = 1);
void RemoveAurasDueToSpellBySteal(uint32 spellId, uint64 casterGUID, Unit* stealer);
- void RemoveAurasDueToItemSpell(Item* castItem, uint32 spellId);
+ void RemoveAurasDueToItemSpell(uint32 spellId, uint64 castItemGuid);
void RemoveAurasByType(AuraType auraType, uint64 casterGUID = 0, Aura* except = NULL, bool negative = true, bool positive = true);
void RemoveNotOwnSingleTargetAuras(uint32 newPhase = 0x0);
void RemoveAurasWithInterruptFlags(uint32 flag, uint32 except = 0);
diff --git a/src/server/game/Entities/Vehicle/Vehicle.cpp b/src/server/game/Entities/Vehicle/Vehicle.cpp
index 550cc03f995..a3be443d014 100644
--- a/src/server/game/Entities/Vehicle/Vehicle.cpp
+++ b/src/server/game/Entities/Vehicle/Vehicle.cpp
@@ -31,7 +31,8 @@
#include "MoveSplineInit.h"
#include "TemporarySummon.h"
-Vehicle::Vehicle(Unit* unit, VehicleEntry const* vehInfo, uint32 creatureEntry) : _me(unit), _vehicleInfo(vehInfo), _usableSeatNum(0), _creatureEntry(creatureEntry)
+Vehicle::Vehicle(Unit* unit, VehicleEntry const* vehInfo, uint32 creatureEntry) :
+_me(unit), _vehicleInfo(vehInfo), _usableSeatNum(0), _creatureEntry(creatureEntry), _status(STATUS_NONE)
{
for (uint32 i = 0; i < MAX_VEHICLE_SEATS; ++i)
{
@@ -49,6 +50,8 @@ Vehicle::Vehicle(Unit* unit, VehicleEntry const* vehInfo, uint32 creatureEntry)
Vehicle::~Vehicle()
{
+ /// @Uninstall must be called before this.
+ ASSERT(_status == STATUS_UNINSTALLING);
for (SeatMap::const_iterator itr = Seats.begin(); itr != Seats.end(); ++itr)
ASSERT(!itr->second.Passenger);
}
@@ -92,6 +95,7 @@ void Vehicle::Install()
}
}
+ _status = STATUS_INSTALLED;
if (GetBase()->GetTypeId() == TYPEID_UNIT)
sScriptMgr->OnInstall(this);
}
@@ -112,6 +116,14 @@ void Vehicle::InstallAllAccessories(bool evading)
void Vehicle::Uninstall()
{
+ /// @Prevent recursive uninstall call. (Bad script in OnUninstall/OnRemovePassenger/PassengerBoarded hook.)
+ if (_status == STATUS_UNINSTALLING)
+ {
+ sLog->outError(LOG_FILTER_VEHICLES, "Vehicle GuidLow: %u, Entry: %u attempts to uninstall, but already has STATUS_UNINSTALLING! "
+ "Check Uninstall/PassengerBoarded script hooks for errors.", _me->GetGUIDLow(), _me->GetEntry());
+ return;
+ }
+ _status = STATUS_UNINSTALLING;
sLog->outDebug(LOG_FILTER_VEHICLES, "Vehicle::Uninstall Entry: %u, GuidLow: %u", _creatureEntry, _me->GetGUIDLow());
RemoveAllPassengers();
@@ -250,6 +262,14 @@ int8 Vehicle::GetNextEmptySeat(int8 seatId, bool next) const
void Vehicle::InstallAccessory(uint32 entry, int8 seatId, bool minion, uint8 type, uint32 summonTime)
{
+ /// @Prevent adding accessories when vehicle is uninstalling. (Bad script in OnUninstall/OnRemovePassenger/PassengerBoarded hook.)
+ if (_status == STATUS_UNINSTALLING)
+ {
+ sLog->outError(LOG_FILTER_VEHICLES, "Vehicle GuidLow: %u, Entry: %u attempts to install accessory Entry: %u on seat %d with STATUS_UNINSTALLING! "
+ "Check Uninstall/PassengerBoarded script hooks for errors.", _me->GetGUIDLow(), _me->GetEntry(), entry, (int32)seatId);
+ return;
+ }
+
sLog->outDebug(LOG_FILTER_VEHICLES, "Vehicle: Installing accessory entry %u on vehicle entry %u (seat:%i)", entry, GetCreatureEntry(), seatId);
if (Unit* passenger = GetPassenger(seatId))
{
@@ -279,14 +299,6 @@ void Vehicle::InstallAccessory(uint32 entry, int8 seatId, bool minion, uint8 typ
return;
}
- // this cannot be checked instantly like this
- // spellsystem is delaying everything to next update tick
- //if (!accessory->IsOnVehicle(me))
- //{
- // accessory->UnSummon();
- // return; // Something went wrong in the spellsystem
- //}
-
if (GetBase()->GetTypeId() == TYPEID_UNIT)
sScriptMgr->OnInstallAccessory(this, accessory);
}
@@ -294,6 +306,14 @@ void Vehicle::InstallAccessory(uint32 entry, int8 seatId, bool minion, uint8 typ
bool Vehicle::AddPassenger(Unit* unit, int8 seatId)
{
+ /// @Prevent adding passengers when vehicle is uninstalling. (Bad script in OnUninstall/OnRemovePassenger/PassengerBoarded hook.)
+ if (_status == STATUS_UNINSTALLING)
+ {
+ sLog->outError(LOG_FILTER_VEHICLES, "Passenger GuidLow: %u, Entry: %u, attempting to board vehicle GuidLow: %u, Entry: %u during uninstall! SeatId: %i",
+ unit->GetGUIDLow(), unit->GetEntry(), _me->GetGUIDLow(), _me->GetEntry(), (int32)seatId);
+ return false;
+ }
+
if (unit->GetVehicle() != this)
return false;
@@ -353,13 +373,9 @@ bool Vehicle::AddPassenger(Unit* unit, int8 seatId)
unit->m_movementInfo.t_seat = seat->first;
unit->m_movementInfo.t_guid = _me->GetGUID();
- if (_me->GetTypeId() == TYPEID_UNIT
- && unit->GetTypeId() == TYPEID_PLAYER
- && seat->first == 0 && seat->second.SeatInfo->m_flags & VEHICLE_SEAT_FLAG_CAN_CONTROL)
- {
- if (!_me->SetCharmedBy(unit, CHARM_TYPE_VEHICLE))
- ASSERT(false);
- }
+ if (_me->GetTypeId() == TYPEID_UNIT && unit->GetTypeId() == TYPEID_PLAYER &&
+ seat->second.SeatInfo->m_flags & VEHICLE_SEAT_FLAG_CAN_CONTROL)
+ ASSERT(_me->SetCharmedBy(unit, CHARM_TYPE_VEHICLE))
if (_me->IsInWorld())
{
@@ -415,7 +431,7 @@ void Vehicle::RemovePassenger(Unit* unit)
unit->ClearUnitState(UNIT_STATE_ONVEHICLE);
- if (_me->GetTypeId() == TYPEID_UNIT && unit->GetTypeId() == TYPEID_PLAYER && seat->first == 0 && seat->second.SeatInfo->m_flags & VEHICLE_SEAT_FLAG_CAN_CONTROL)
+ if (_me->GetTypeId() == TYPEID_UNIT && unit->GetTypeId() == TYPEID_PLAYER && seat->second.SeatInfo->m_flags & VEHICLE_SEAT_FLAG_CAN_CONTROL)
_me->RemoveCharmedBy(unit);
if (_me->IsInWorld())
@@ -426,13 +442,13 @@ void Vehicle::RemovePassenger(Unit* unit)
unit->m_movementInfo.t_seat = 0;
}
- if (_me->GetTypeId() == TYPEID_UNIT && _me->ToCreature()->IsAIEnabled)
- _me->ToCreature()->AI()->PassengerBoarded(unit, seat->first, false);
-
// only for flyable vehicles
if (unit->IsFlying())
_me->CastSpell(unit, VEHICLE_SPELL_PARACHUTE, true);
+ if (_me->GetTypeId() == TYPEID_UNIT && _me->ToCreature()->IsAIEnabled)
+ _me->ToCreature()->AI()->PassengerBoarded(unit, seat->first, false);
+
if (GetBase()->GetTypeId() == TYPEID_UNIT)
sScriptMgr->OnRemovePassenger(this, unit);
}
diff --git a/src/server/game/Entities/Vehicle/Vehicle.h b/src/server/game/Entities/Vehicle/Vehicle.h
index 5ae08bd7109..823fb72b8a8 100644
--- a/src/server/game/Entities/Vehicle/Vehicle.h
+++ b/src/server/game/Entities/Vehicle/Vehicle.h
@@ -22,6 +22,7 @@
#include "ObjectDefines.h"
#include "Object.h"
#include "VehicleDefines.h"
+#include "Unit.h"
struct VehicleEntry;
@@ -32,9 +33,6 @@ typedef std::set<uint64> GuidSet;
class Vehicle : public TransportBase
{
public:
- explicit Vehicle(Unit* unit, VehicleEntry const* vehInfo, uint32 creatureEntry);
- virtual ~Vehicle();
-
void Install();
void Uninstall();
void Reset(bool evading = false);
@@ -67,7 +65,20 @@ class Vehicle : public TransportBase
VehicleSeatEntry const* GetSeatForPassenger(Unit* passenger);
+ protected:
+ friend bool Unit::CreateVehicleKit(uint32 id, uint32 creatureEntry);
+ Vehicle(Unit* unit, VehicleEntry const* vehInfo, uint32 creatureEntry);
+ friend void Unit::RemoveVehicleKit();
+ ~Vehicle();
+
private:
+ enum Status
+ {
+ STATUS_NONE,
+ STATUS_INSTALLED,
+ STATUS_UNINSTALLING,
+ };
+
SeatMap::iterator GetSeatIteratorForPassenger(Unit* passenger);
void InitMovementInfoForBase();
@@ -82,7 +93,7 @@ class Vehicle : public TransportBase
GuidSet vehiclePlayers;
uint32 _usableSeatNum; // Number of seats that match VehicleSeatEntry::UsableByPlayer, used for proper display flags
uint32 _creatureEntry; // Can be different than me->GetBase()->GetEntry() in case of players
-
+ Status _status;
Position m_lastShootPos;
};
#endif
diff --git a/src/server/game/Globals/ObjectMgr.cpp b/src/server/game/Globals/ObjectMgr.cpp
index 4b876456e28..b41b61904e6 100644
--- a/src/server/game/Globals/ObjectMgr.cpp
+++ b/src/server/game/Globals/ObjectMgr.cpp
@@ -50,7 +50,6 @@
#include "World.h"
ScriptMapMap sSpellScripts;
-ScriptMapMap sGameObjectScripts;
ScriptMapMap sEventScripts;
ScriptMapMap sWaypointScripts;
@@ -60,7 +59,6 @@ std::string GetScriptsTableNameByType(ScriptsType type)
switch (type)
{
case SCRIPTS_SPELL: res = "spell_scripts"; break;
- case SCRIPTS_GAMEOBJECT: res = "gameobject_scripts"; break;
case SCRIPTS_EVENT: res = "event_scripts"; break;
case SCRIPTS_WAYPOINT: res = "waypoint_scripts"; break;
default: break;
@@ -74,7 +72,6 @@ ScriptMapMap* GetScriptsMapByType(ScriptsType type)
switch (type)
{
case SCRIPTS_SPELL: res = &sSpellScripts; break;
- case SCRIPTS_GAMEOBJECT: res = &sGameObjectScripts; break;
case SCRIPTS_EVENT: res = &sEventScripts; break;
case SCRIPTS_WAYPOINT: res = &sWaypointScripts; break;
default: break;
@@ -118,7 +115,7 @@ std::string GetScriptCommandName(ScriptCommands command)
default:
{
char sz[32];
- sprintf(sz, "Unknown command: %u", command);
+ sprintf(sz, "Unknown command: %d", command);
res = sz;
break;
}
@@ -4667,18 +4664,6 @@ void ObjectMgr::LoadScripts(ScriptsType type)
sLog->outInfo(LOG_FILTER_SERVER_LOADING, ">> Loaded %u script definitions in %u ms", count, GetMSTimeDiffToNow(oldMSTime));
}
-void ObjectMgr::LoadGameObjectScripts()
-{
- LoadScripts(SCRIPTS_GAMEOBJECT);
-
- // check ids
- for (ScriptMapMap::const_iterator itr = sGameObjectScripts.begin(); itr != sGameObjectScripts.end(); ++itr)
- {
- if (!GetGOData(itr->first))
- sLog->outError(LOG_FILTER_SQL, "Table `gameobject_scripts` has not existing gameobject (GUID: %u) as script id", itr->first);
- }
-}
-
void ObjectMgr::LoadSpellScripts()
{
LoadScripts(SCRIPTS_SPELL);
@@ -5655,12 +5640,11 @@ WorldSafeLocsEntry const* ObjectMgr::GetClosestGraveYard(float x, float y, float
// then check faction
// if mapId != graveyard.mapId (ghost in instance) and search any graveyard associated
// then check faction
- GraveYardContainer::const_iterator graveLow = GraveYardStore.lower_bound(zoneId);
- GraveYardContainer::const_iterator graveUp = GraveYardStore.upper_bound(zoneId);
+ GraveYardMapBounds range = GraveYardStore.equal_range(zoneId);
MapEntry const* map = sMapStore.LookupEntry(MapId);
- // not need to check validity of map object; MapId _MUST_ be valid here
- if (graveLow == graveUp && !map->IsBattleArena())
+ // not need to check validity of map object; MapId _MUST_ be valid here
+ if (range.first == range.second && !map->IsBattleArena())
{
sLog->outError(LOG_FILTER_SQL, "Table `game_graveyard_zone` incomplete: Zone %u Team %u does not have a linked graveyard.", zoneId, team);
return GetDefaultGraveYard(team);
@@ -5681,9 +5665,9 @@ WorldSafeLocsEntry const* ObjectMgr::GetClosestGraveYard(float x, float y, float
MapEntry const* mapEntry = sMapStore.LookupEntry(MapId);
- for (GraveYardContainer::const_iterator itr = graveLow; itr != graveUp; ++itr)
+ for (; range.first != range.second; ++range.first)
{
- GraveYardData const& data = itr->second;
+ GraveYardData const& data = range.first->second;
WorldSafeLocsEntry const* entry = sWorldSafeLocsStore.LookupEntry(data.safeLocId);
if (!entry)
@@ -5761,15 +5745,13 @@ WorldSafeLocsEntry const* ObjectMgr::GetClosestGraveYard(float x, float y, float
GraveYardData const* ObjectMgr::FindGraveYardData(uint32 id, uint32 zoneId)
{
- GraveYardContainer::const_iterator graveLow = GraveYardStore.lower_bound(zoneId);
- GraveYardContainer::const_iterator graveUp = GraveYardStore.upper_bound(zoneId);
-
- for (GraveYardContainer::const_iterator itr = graveLow; itr != graveUp; ++itr)
+ GraveYardMapBounds range = GraveYardStore.equal_range(zoneId);
+ for (; range.first != range.second; ++range.first)
{
- if (itr->second.safeLocId == id)
- return &itr->second;
+ GraveYardData const& data = range.first->second;
+ if (data.safeLocId == id)
+ return &data;
}
-
return NULL;
}
@@ -5802,9 +5784,8 @@ bool ObjectMgr::AddGraveYardLink(uint32 id, uint32 zoneId, uint32 team, bool per
void ObjectMgr::RemoveGraveYardLink(uint32 id, uint32 zoneId, uint32 team, bool persist /*= false*/)
{
- GraveYardContainer::iterator graveLow = GraveYardStore.lower_bound(zoneId);
- GraveYardContainer::iterator graveUp = GraveYardStore.upper_bound(zoneId);
- if (graveLow == graveUp)
+ GraveYardMapBoundsNonConst range = GraveYardStore.equal_range(zoneId);
+ if (range.first == range.second)
{
//sLog->outError(LOG_FILTER_SQL, "Table `game_graveyard_zone` incomplete: Zone %u Team %u does not have a linked graveyard.", zoneId, team);
return;
@@ -5812,11 +5793,10 @@ void ObjectMgr::RemoveGraveYardLink(uint32 id, uint32 zoneId, uint32 team, bool
bool found = false;
- GraveYardContainer::iterator itr;
- for (itr = graveLow; itr != graveUp; ++itr)
+ for (; range.first != range.second; ++range.first)
{
- GraveYardData & data = itr->second;
+ GraveYardData & data = range.first->second;
// skip not matching safezone id
if (data.safeLocId != id)
@@ -5836,7 +5816,7 @@ void ObjectMgr::RemoveGraveYardLink(uint32 id, uint32 zoneId, uint32 team, bool
return;
// remove from links
- GraveYardStore.erase(itr);
+ GraveYardStore.erase(range.first);
// remove link from DB
if (persist)
@@ -8203,7 +8183,7 @@ void ObjectMgr::AddVendorItem(uint32 entry, uint32 item, int32 maxcount, uint32
if (persist)
{
- PreparedStatement* stmt = WorldDatabase.GetPreparedStatement(WORLD_INS_NPC_VENODR);
+ PreparedStatement* stmt = WorldDatabase.GetPreparedStatement(WORLD_INS_NPC_VENDOR);
stmt->setUInt32(0, entry);
stmt->setUInt32(1, item);
diff --git a/src/server/game/Globals/ObjectMgr.h b/src/server/game/Globals/ObjectMgr.h
index 8c341b8da0b..9339684964c 100644
--- a/src/server/game/Globals/ObjectMgr.h
+++ b/src/server/game/Globals/ObjectMgr.h
@@ -128,7 +128,6 @@ enum ScriptsType
SCRIPTS_FIRST = 1,
SCRIPTS_SPELL = SCRIPTS_FIRST,
- SCRIPTS_GAMEOBJECT,
SCRIPTS_EVENT,
SCRIPTS_WAYPOINT,
@@ -361,7 +360,6 @@ typedef std::map<uint32, ScriptMap > ScriptMapMap;
typedef std::multimap<uint32, uint32> SpellScriptsContainer;
typedef std::pair<SpellScriptsContainer::iterator, SpellScriptsContainer::iterator> SpellScriptsBounds;
extern ScriptMapMap sSpellScripts;
-extern ScriptMapMap sGameObjectScripts;
extern ScriptMapMap sEventScripts;
extern ScriptMapMap sWaypointScripts;
@@ -564,6 +562,8 @@ struct GraveYardData
};
typedef std::multimap<uint32, GraveYardData> GraveYardContainer;
+typedef std::pair<GraveYardContainer::const_iterator, GraveYardContainer::const_iterator> GraveYardMapBounds;
+typedef std::pair<GraveYardContainer::iterator, GraveYardContainer::iterator> GraveYardMapBoundsNonConst;
typedef UNORDERED_MAP<uint32, VendorItemData> CacheVendorItemContainer;
typedef UNORDERED_MAP<uint32, TrainerSpellData> CacheTrainerSpellContainer;
@@ -861,7 +861,6 @@ class ObjectMgr
return _creatureQuestInvolvedRelations.equal_range(creature_entry);
}
- void LoadGameObjectScripts();
void LoadEventScripts();
void LoadSpellScripts();
void LoadWaypointScripts();
@@ -960,6 +959,8 @@ class ObjectMgr
uint32 GeneratePetNumber();
typedef std::multimap<int32, uint32> ExclusiveQuestGroups;
+ typedef std::pair<ExclusiveQuestGroups::const_iterator, ExclusiveQuestGroups::const_iterator> ExclusiveQuestGroupsBounds;
+
ExclusiveQuestGroups mExclusiveQuestGroups;
MailLevelReward const* GetMailLevelReward(uint32 level, uint32 raceMask)
@@ -1114,7 +1115,7 @@ class ObjectMgr
VendorItemData const* GetNpcVendorItemList(uint32 entry) const
{
- CacheVendorItemContainer::const_iterator iter = _cacheVendorItemStore.find(entry);
+ CacheVendorItemContainer::const_iterator iter = _cacheVendorItemStore.find(entry);
if (iter == _cacheVendorItemStore.end())
return NULL;
@@ -1131,26 +1132,26 @@ class ObjectMgr
SpellClickInfoMapBounds GetSpellClickInfoMapBounds(uint32 creature_id) const
{
- return SpellClickInfoMapBounds(_spellClickInfoStore.lower_bound(creature_id), _spellClickInfoStore.upper_bound(creature_id));
+ return _spellClickInfoStore.equal_range(creature_id);
}
GossipMenusMapBounds GetGossipMenusMapBounds(uint32 uiMenuId) const
{
- return GossipMenusMapBounds(_gossipMenusStore.lower_bound(uiMenuId), _gossipMenusStore.upper_bound(uiMenuId));
+ return _gossipMenusStore.equal_range(uiMenuId);
}
GossipMenusMapBoundsNonConst GetGossipMenusMapBoundsNonConst(uint32 uiMenuId)
{
- return GossipMenusMapBoundsNonConst(_gossipMenusStore.lower_bound(uiMenuId), _gossipMenusStore.upper_bound(uiMenuId));
+ return _gossipMenusStore.equal_range(uiMenuId);
}
GossipMenuItemsMapBounds GetGossipMenuItemsMapBounds(uint32 uiMenuId) const
{
- return GossipMenuItemsMapBounds(_gossipMenuItemsStore.lower_bound(uiMenuId), _gossipMenuItemsStore.upper_bound(uiMenuId));
+ return _gossipMenuItemsStore.equal_range(uiMenuId);
}
GossipMenuItemsMapBoundsNonConst GetGossipMenuItemsMapBoundsNonConst(uint32 uiMenuId)
{
- return GossipMenuItemsMapBoundsNonConst(_gossipMenuItemsStore.lower_bound(uiMenuId), _gossipMenuItemsStore.upper_bound(uiMenuId));
+ return _gossipMenuItemsStore.equal_range(uiMenuId);
}
// for wintergrasp only
diff --git a/src/server/game/Groups/Group.cpp b/src/server/game/Groups/Group.cpp
index 7c4da5c6741..734a1bfbaad 100644
--- a/src/server/game/Groups/Group.cpp
+++ b/src/server/game/Groups/Group.cpp
@@ -1993,28 +1993,24 @@ InstanceGroupBind* Group::GetBoundInstance(Map* aMap)
{
// Currently spawn numbering not different from map difficulty
Difficulty difficulty = GetDifficulty(aMap->IsRaid());
-
- // some instances only have one difficulty
- GetDownscaledMapDifficultyData(aMap->GetId(), difficulty);
-
- BoundInstancesMap::iterator itr = m_boundInstances[difficulty].find(aMap->GetId());
- if (itr != m_boundInstances[difficulty].end())
- return &itr->second;
- else
- return NULL;
+ return GetBoundInstance(difficulty, aMap->GetId());
}
InstanceGroupBind* Group::GetBoundInstance(MapEntry const* mapEntry)
{
- if (!mapEntry)
+ if (!mapEntry || !mapEntry->IsDungeon())
return NULL;
Difficulty difficulty = GetDifficulty(mapEntry->IsRaid());
+ return GetBoundInstance(difficulty, mapEntry->MapID);
+}
+InstanceGroupBind* Group::GetBoundInstance(Difficulty difficulty, uint32 mapId)
+{
// some instances only have one difficulty
- GetDownscaledMapDifficultyData(mapEntry->MapID, difficulty);
+ GetDownscaledMapDifficultyData(mapId, difficulty);
- BoundInstancesMap::iterator itr = m_boundInstances[difficulty].find(mapEntry->MapID);
+ BoundInstancesMap::iterator itr = m_boundInstances[difficulty].find(mapId);
if (itr != m_boundInstances[difficulty].end())
return &itr->second;
else
diff --git a/src/server/game/Groups/Group.h b/src/server/game/Groups/Group.h
index bf9eed7eff5..e81afe78513 100644
--- a/src/server/game/Groups/Group.h
+++ b/src/server/game/Groups/Group.h
@@ -301,6 +301,7 @@ class Group
InstanceGroupBind* GetBoundInstance(Player* player);
InstanceGroupBind* GetBoundInstance(Map* aMap);
InstanceGroupBind* GetBoundInstance(MapEntry const* mapEntry);
+ InstanceGroupBind* GetBoundInstance(Difficulty difficulty, uint32 mapId);
BoundInstancesMap& GetBoundInstances(Difficulty difficulty);
// FG: evil hacks
diff --git a/src/server/game/Handlers/CharacterHandler.cpp b/src/server/game/Handlers/CharacterHandler.cpp
index 886303c9b9c..d8e50be11f0 100644
--- a/src/server/game/Handlers/CharacterHandler.cpp
+++ b/src/server/game/Handlers/CharacterHandler.cpp
@@ -67,9 +67,8 @@ bool LoginQueryHolder::Initialize()
bool res = true;
uint32 lowGuid = GUID_LOPART(m_guid);
- PreparedStatement* stmt = NULL;
- stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_CHARACTER);
+ PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_CHARACTER);
stmt->setUInt32(0, lowGuid);
res &= SetPreparedQuery(PLAYER_LOGIN_QUERY_LOAD_FROM, stmt);
diff --git a/src/server/game/Instances/InstanceSaveMgr.cpp b/src/server/game/Instances/InstanceSaveMgr.cpp
index ca09a570beb..81b148d8eaf 100644
--- a/src/server/game/Instances/InstanceSaveMgr.cpp
+++ b/src/server/game/Instances/InstanceSaveMgr.cpp
@@ -295,6 +295,7 @@ void InstanceSaveManager::LoadResetTimes()
// index instance ids by map/difficulty pairs for fast reset warning send
typedef std::multimap<uint32 /*PAIR32(map, difficulty)*/, uint32 /*instanceid*/ > ResetTimeMapDiffInstances;
+ typedef std::pair<ResetTimeMapDiffInstances::const_iterator, ResetTimeMapDiffInstances::const_iterator> ResetTimeMapDiffInstancesBounds;
ResetTimeMapDiffInstances mapDiffResetInstances;
QueryResult result = CharacterDatabase.Query("SELECT id, map, difficulty, resettime FROM instance ORDER BY id ASC");
@@ -378,8 +379,6 @@ void InstanceSaveManager::LoadResetTimes()
} while (result->NextRow());
}
- ResetTimeMapDiffInstances::const_iterator in_itr;
-
// calculate new global reset times for expired instances and those that have never been reset yet
// add the global reset times to the priority queue
for (MapDifficultyMap::const_iterator itr = sMapDifficultyMap.begin(); itr != sMapDifficultyMap.end(); ++itr)
@@ -423,8 +422,9 @@ void InstanceSaveManager::LoadResetTimes()
ScheduleReset(true, t - ResetTimeDelay[type-1], InstResetEvent(type, mapid, difficulty, 0));
- for (in_itr = mapDiffResetInstances.lower_bound(map_diff_pair); in_itr != mapDiffResetInstances.upper_bound(map_diff_pair); ++in_itr)
- ScheduleReset(true, t - ResetTimeDelay[type-1], InstResetEvent(type, mapid, difficulty, in_itr->second));
+ ResetTimeMapDiffInstancesBounds range = mapDiffResetInstances.equal_range(map_diff_pair);
+ for (; range.first != range.second; ++range.first)
+ ScheduleReset(true, t - ResetTimeDelay[type-1], InstResetEvent(type, mapid, difficulty, range.first->second));
}
}
diff --git a/src/server/game/Instances/InstanceScript.cpp b/src/server/game/Instances/InstanceScript.cpp
index 399c9d9ae5e..3deec5a880a 100644
--- a/src/server/game/Instances/InstanceScript.cpp
+++ b/src/server/game/Instances/InstanceScript.cpp
@@ -108,24 +108,24 @@ void InstanceScript::UpdateMinionState(Creature* minion, EncounterState state)
void InstanceScript::UpdateDoorState(GameObject* door)
{
- DoorInfoMap::iterator lower = doors.lower_bound(door->GetEntry());
- DoorInfoMap::iterator upper = doors.upper_bound(door->GetEntry());
- if (lower == upper)
+ DoorInfoMapBounds range = doors.equal_range(door->GetEntry());
+ if (range.first == range.second)
return;
bool open = true;
- for (DoorInfoMap::iterator itr = lower; itr != upper && open; ++itr)
+ for (; range.first != range.second && open; ++range.first)
{
- switch (itr->second.type)
+ DoorInfo const& info = range.first->second;
+ switch (info.type)
{
case DOOR_TYPE_ROOM:
- open = (itr->second.bossInfo->state != IN_PROGRESS);
+ open = (info.bossInfo->state != IN_PROGRESS);
break;
case DOOR_TYPE_PASSAGE:
- open = (itr->second.bossInfo->state == DONE);
+ open = (info.bossInfo->state == DONE);
break;
case DOOR_TYPE_SPAWN_HOLE:
- open = (itr->second.bossInfo->state == IN_PROGRESS);
+ open = (info.bossInfo->state == IN_PROGRESS);
break;
default:
break;
@@ -137,14 +137,13 @@ void InstanceScript::UpdateDoorState(GameObject* door)
void InstanceScript::AddDoor(GameObject* door, bool add)
{
- DoorInfoMap::iterator lower = doors.lower_bound(door->GetEntry());
- DoorInfoMap::iterator upper = doors.upper_bound(door->GetEntry());
- if (lower == upper)
+ DoorInfoMapBounds range = doors.equal_range(door->GetEntry());
+ if (range.first == range.second)
return;
- for (DoorInfoMap::iterator itr = lower; itr != upper; ++itr)
+ for (; range.first != range.second; ++range.first)
{
- DoorInfo const& data = itr->second;
+ DoorInfo const& data = range.first->second;
if (add)
{
diff --git a/src/server/game/Instances/InstanceScript.h b/src/server/game/Instances/InstanceScript.h
index 0432db57da8..609e318c82c 100644
--- a/src/server/game/Instances/InstanceScript.h
+++ b/src/server/game/Instances/InstanceScript.h
@@ -126,6 +126,8 @@ struct MinionInfo
};
typedef std::multimap<uint32 /*entry*/, DoorInfo> DoorInfoMap;
+typedef std::pair<DoorInfoMap::const_iterator, DoorInfoMap::const_iterator> DoorInfoMapBounds;
+
typedef std::map<uint32 /*entry*/, MinionInfo> MinionInfoMap;
class InstanceScript : public ZoneScript
diff --git a/src/server/game/Loot/LootMgr.cpp b/src/server/game/Loot/LootMgr.cpp
index b1db7f6563f..a64e8117ce9 100644
--- a/src/server/game/Loot/LootMgr.cpp
+++ b/src/server/game/Loot/LootMgr.cpp
@@ -664,7 +664,7 @@ void Loot::DeleteLootItemFromContainerItemDB(uint32 itemID)
CharacterDatabase.Execute(stmt);
// Mark the item looted to prevent resaving
- for (LootItemList::iterator _itr = items.begin(); _itr != items.end(); _itr++)
+ for (LootItemList::iterator _itr = items.begin(); _itr != items.end(); ++_itr)
{
if (_itr->itemid != itemID)
continue;
diff --git a/src/server/game/Maps/MapManager.cpp b/src/server/game/Maps/MapManager.cpp
index a7b7e4044b8..755d443091a 100644
--- a/src/server/game/Maps/MapManager.cpp
+++ b/src/server/game/Maps/MapManager.cpp
@@ -179,6 +179,7 @@ bool MapManager::CanPlayerEnter(uint32 mapid, Player* player, bool loginCheck)
else // attempt to downscale
mapDiff = GetDownscaledMapDifficultyData(entry->MapID, targetDifficulty);
}
+ // FIXME: mapDiff is never used
//Bypass checks for GMs
if (player->isGameMaster())
diff --git a/src/server/game/Miscellaneous/SharedDefines.h b/src/server/game/Miscellaneous/SharedDefines.h
index ac225a46838..05696694033 100644
--- a/src/server/game/Miscellaneous/SharedDefines.h
+++ b/src/server/game/Miscellaneous/SharedDefines.h
@@ -418,7 +418,7 @@ enum SpellAttr4
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_UNK8 = 0x00000100, // 8 ignores taken percent damage mods?
+ SPELL_ATTR4_FIXED_DAMAGE = 0x00000100, // 8 ignores taken percent damage mods?
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
SPELL_ATTR4_UNK11 = 0x00000800, // 11
@@ -546,10 +546,10 @@ enum SpellAttr7
SPELL_ATTR7_UNK25 = 0x02000000, // 25
SPELL_ATTR7_UNK26 = 0x04000000, // 26
SPELL_ATTR7_UNK27 = 0x08000000, // 27 Not set
- SPELL_ATTR7_UNK28 = 0x10000000, // 28 related to player positive buff
+ SPELL_ATTR7_BENEFIT_FROM_SPELLMOD = 0x10000000, // 28 Non-permanent, non-passive buffs that may benefit from spellmods
SPELL_ATTR7_UNK29 = 0x20000000, // 29 only 69028, 71237
SPELL_ATTR7_UNK30 = 0x40000000, // 30 Burning Determination, Divine Sacrifice, Earth Shield, Prayer of Mending
- SPELL_ATTR7_UNK31 = 0x80000000 // 31 only 70769
+ SPELL_ATTR7_CLIENT_INDICATOR = 0x80000000
};
#define MIN_TALENT_SPEC 0
@@ -767,7 +767,7 @@ enum SpellEffects
SPELL_EFFECT_SUMMON_OBJECT_SLOT3 = 106,
SPELL_EFFECT_SUMMON_OBJECT_SLOT4 = 107,
SPELL_EFFECT_DISPEL_MECHANIC = 108,
- SPELL_EFFECT_SUMMON_DEAD_PET = 109,
+ SPELL_EFFECT_RESURRECT_PET = 109,
SPELL_EFFECT_DESTROY_ALL_TOTEMS = 110,
SPELL_EFFECT_DURABILITY_DAMAGE = 111,
SPELL_EFFECT_112 = 112,
@@ -789,7 +789,7 @@ enum SpellEffects
SPELL_EFFECT_APPLY_AREA_AURA_FRIEND = 128,
SPELL_EFFECT_APPLY_AREA_AURA_ENEMY = 129,
SPELL_EFFECT_REDIRECT_THREAT = 130,
- SPELL_EFFECT_131 = 131,
+ SPELL_EFFECT_PLAY_SOUND = 131,
SPELL_EFFECT_PLAY_MUSIC = 132,
SPELL_EFFECT_UNLEARN_SPECIALIZATION = 133,
SPELL_EFFECT_KILL_CREDIT2 = 134,
diff --git a/src/server/game/Movement/Spline/MoveSplineInit.cpp b/src/server/game/Movement/Spline/MoveSplineInit.cpp
index df0b3e3944f..b327d0d0cd6 100644
--- a/src/server/game/Movement/Spline/MoveSplineInit.cpp
+++ b/src/server/game/Movement/Spline/MoveSplineInit.cpp
@@ -162,9 +162,11 @@ namespace Movement
{
if (_transformForTransport)
{
- float unused = 0.0f;
if (TransportBase* transport = _owner.GetDirectTransport())
+ {
+ float unused = 0.0f; // need reference
transport->CalculatePassengerOffset(input.x, input.y, input.z, unused);
+ }
}
return input;
diff --git a/src/server/game/Movement/Spline/MoveSplineInit.h b/src/server/game/Movement/Spline/MoveSplineInit.h
index cae9f1321d2..8ebac4aec06 100644
--- a/src/server/game/Movement/Spline/MoveSplineInit.h
+++ b/src/server/game/Movement/Spline/MoveSplineInit.h
@@ -141,15 +141,15 @@ namespace Movement
};
inline void MoveSplineInit::SetFly() { args.flags.EnableFlying(); }
- inline void MoveSplineInit::SetWalk(bool enable) { args.flags.walkmode = enable;}
- inline void MoveSplineInit::SetSmooth() { args.flags.EnableCatmullRom();}
- inline void MoveSplineInit::SetCyclic() { args.flags.cyclic = true;}
+ inline void MoveSplineInit::SetWalk(bool enable) { args.flags.walkmode = enable; }
+ inline void MoveSplineInit::SetSmooth() { args.flags.EnableCatmullRom(); }
+ inline void MoveSplineInit::SetCyclic() { args.flags.cyclic = true; }
inline void MoveSplineInit::SetFall() { args.flags.EnableFalling();}
inline void MoveSplineInit::SetVelocity(float vel) { args.velocity = vel; args.HasVelocity = true; }
inline void MoveSplineInit::SetOrientationInversed() { args.flags.orientationInversed = true;}
inline void MoveSplineInit::SetTransportEnter() { args.flags.EnableTransportEnter(); }
inline void MoveSplineInit::SetTransportExit() { args.flags.EnableTransportExit(); }
- inline void MoveSplineInit::SetOrientationFixed(bool enable) { args.flags.orientationFixed = enable;}
+ inline void MoveSplineInit::SetOrientationFixed(bool enable) { args.flags.orientationFixed = enable; }
inline void MoveSplineInit::MovebyPath(const PointsArray& controls, int32 path_offset)
{
@@ -160,8 +160,7 @@ namespace Movement
inline void MoveSplineInit::MoveTo(float x, float y, float z)
{
- Vector3 v(x, y, z);
- MoveTo(v);
+ MoveTo(G3D::Vector3(x, y, z));
}
inline void MoveSplineInit::SetParabolic(float amplitude, float time_shift)
diff --git a/src/server/game/Scripting/ScriptLoader.cpp b/src/server/game/Scripting/ScriptLoader.cpp
index 31e3adb976a..479979f177f 100644
--- a/src/server/game/Scripting/ScriptLoader.cpp
+++ b/src/server/game/Scripting/ScriptLoader.cpp
@@ -192,6 +192,7 @@ void AddSC_boss_lorekeeperpolkelt();
void AddSC_boss_rasfrost();
void AddSC_boss_theravenian();
void AddSC_boss_vectus();
+void AddSC_boss_kirtonos_the_herald();
void AddSC_instance_scholomance();
void AddSC_shadowfang_keep(); //Shadowfang keep
void AddSC_instance_shadowfang_keep();
@@ -579,6 +580,9 @@ void AddSC_instance_arcatraz();
void AddSC_boss_high_botanist_freywinn(); //TK Botanica
void AddSC_boss_laj();
void AddSC_boss_warp_splinter();
+void AddSC_boss_thorngrin_the_tender();
+void AddSC_boss_commander_sarannis();
+void AddSC_instance_the_botanica();
void AddSC_boss_alar(); //TK The Eye
void AddSC_boss_kaelthas();
void AddSC_boss_void_reaver();
@@ -823,6 +827,7 @@ void AddEasternKingdomsScripts()
AddSC_boss_rasfrost();
AddSC_boss_theravenian();
AddSC_boss_vectus();
+ AddSC_boss_kirtonos_the_herald();
AddSC_instance_scholomance();
AddSC_shadowfang_keep(); //Shadowfang keep
AddSC_instance_shadowfang_keep();
@@ -1058,6 +1063,9 @@ void AddOutlandScripts()
AddSC_boss_high_botanist_freywinn(); //TK Botanica
AddSC_boss_laj();
AddSC_boss_warp_splinter();
+ AddSC_boss_thorngrin_the_tender();
+ AddSC_boss_commander_sarannis();
+ AddSC_instance_the_botanica();
AddSC_boss_alar(); //TK The Eye
AddSC_boss_kaelthas();
AddSC_boss_void_reaver();
diff --git a/src/server/game/Scripting/ScriptMgr.cpp b/src/server/game/Scripting/ScriptMgr.cpp
index 6a5bccc743c..cae8ea9d2d5 100644
--- a/src/server/game/Scripting/ScriptMgr.cpp
+++ b/src/server/game/Scripting/ScriptMgr.cpp
@@ -1241,6 +1241,11 @@ void ScriptMgr::OnPlayerDelete(uint64 guid)
FOREACH_SCRIPT(PlayerScript)->OnDelete(guid);
}
+void ScriptMgr::OnPlayerSave(Player* player)
+{
+ FOREACH_SCRIPT(PlayerScript)->OnSave(player);
+}
+
void ScriptMgr::OnPlayerBindToInstance(Player* player, Difficulty difficulty, uint32 mapid, bool permanent)
{
FOREACH_SCRIPT(PlayerScript)->OnBindToInstance(player, difficulty, mapid, permanent);
diff --git a/src/server/game/Scripting/ScriptMgr.h b/src/server/game/Scripting/ScriptMgr.h
index bf032b84379..7f140cfffe0 100644
--- a/src/server/game/Scripting/ScriptMgr.h
+++ b/src/server/game/Scripting/ScriptMgr.h
@@ -746,6 +746,9 @@ class PlayerScript : public UnitScript
// Called when a player is deleted.
virtual void OnDelete(uint64 /*guid*/) { }
+ // Called when a player is about to be saved.
+ virtual void OnSave(Player* /*player*/) { }
+
// Called when a player is bound to an instance
virtual void OnBindToInstance(Player* /*player*/, Difficulty /*difficulty*/, uint32 /*mapId*/, bool /*permanent*/) { }
@@ -1022,6 +1025,7 @@ class ScriptMgr
void OnPlayerLogout(Player* player);
void OnPlayerCreate(Player* player);
void OnPlayerDelete(uint64 guid);
+ void OnPlayerSave(Player* player);
void OnPlayerBindToInstance(Player* player, Difficulty difficulty, uint32 mapid, bool permanent);
void OnPlayerUpdateZone(Player* player, uint32 newZone, uint32 newArea);
diff --git a/src/server/game/Server/WorldSocketMgr.cpp b/src/server/game/Server/WorldSocketMgr.cpp
index 7876ad2cb66..15025bf893d 100644
--- a/src/server/game/Server/WorldSocketMgr.cpp
+++ b/src/server/game/Server/WorldSocketMgr.cpp
@@ -60,7 +60,7 @@ class ReactorRunnable : protected ACE_Task_Base
m_Connections(0),
m_ThreadId(-1)
{
- ACE_Reactor_Impl* imp = 0;
+ ACE_Reactor_Impl* imp;
#if defined (ACE_HAS_EVENT_POLL) || defined (ACE_HAS_DEV_POLL)
diff --git a/src/server/game/Spells/Auras/SpellAuras.cpp b/src/server/game/Spells/Auras/SpellAuras.cpp
index b5cabba8929..b33546ee988 100644
--- a/src/server/game/Spells/Auras/SpellAuras.cpp
+++ b/src/server/game/Spells/Auras/SpellAuras.cpp
@@ -910,8 +910,16 @@ bool Aura::CanBeSaved() const
// Incanter's Absorbtion - considering the minimal duration and problems with aura stacking
// we skip saving this aura
- if (GetId() == 44413)
- return false;
+ // Also for some reason other auras put as MultiSlot crash core on keeping them after restart,
+ // so put here only these for which you are sure they get removed
+ switch (GetId())
+ {
+ case 44413: // Incanter's Absorption
+ case 40075: // Fel Flak Fire
+ case 55849: // Power Spark
+ return false;
+ break;
+ }
// don't save auras removed by proc system
if (IsUsingCharges() && !GetCharges())
@@ -1972,8 +1980,13 @@ bool Aura::IsProcTriggeredOnEvent(AuraApplication* aurApp, ProcEventInfo& eventI
if (!sSpellMgr->CanSpellTriggerProcOnEvent(*procEntry, eventInfo))
return false;
+ // do checks using conditions table
+ ConditionList conditions = sConditionMgr->GetConditionsForNotGroupedEntry(CONDITION_SOURCE_TYPE_SPELL_PROC, GetSpellInfo()->Id);
+ ConditionSourceInfo condInfo = ConditionSourceInfo(eventInfo.GetActor(), eventInfo.GetActionTarget());
+ if (!sConditionMgr->IsObjectMeetToConditions(condInfo, conditions))
+ return false;
+
// TODO:
- // - do checks using conditions table for eventInfo->GetActor() and eventInfo->GetActionTarget()
// - add DoCheckProc() AuraScript hook
// to allow additional requirements for procs
// this is needed because this is the last moment in which you can prevent aura charge drop on proc
diff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp
index 70d918b4534..af6ed55ed58 100644
--- a/src/server/game/Spells/Spell.cpp
+++ b/src/server/game/Spells/Spell.cpp
@@ -817,11 +817,16 @@ void Spell::SelectEffectImplicitTargets(SpellEffIndex effIndex, SpellImplicitTar
return;
// choose which targets we can select at once
for (uint32 j = effIndex + 1; j < MAX_SPELL_EFFECTS; ++j)
- if (GetSpellInfo()->Effects[effIndex].TargetA.GetTarget() == GetSpellInfo()->Effects[j].TargetA.GetTarget() &&
- GetSpellInfo()->Effects[effIndex].TargetB.GetTarget() == GetSpellInfo()->Effects[j].TargetB.GetTarget() &&
- GetSpellInfo()->Effects[effIndex].ImplicitTargetConditions == GetSpellInfo()->Effects[j].ImplicitTargetConditions &&
- GetSpellInfo()->Effects[effIndex].CalcRadius(m_caster) == GetSpellInfo()->Effects[j].CalcRadius(m_caster))
+ {
+ SpellEffectInfo const* effects = GetSpellInfo()->Effects;
+ if (effects[effIndex].TargetA.GetTarget() == effects[j].TargetA.GetTarget() &&
+ effects[effIndex].TargetB.GetTarget() == effects[j].TargetB.GetTarget() &&
+ effects[effIndex].ImplicitTargetConditions == effects[j].ImplicitTargetConditions &&
+ effects[effIndex].CalcRadius(m_caster) == effects[j].CalcRadius(m_caster))
+ {
effectMask |= 1 << j;
+ }
+ }
processedEffectMask |= effectMask;
break;
default:
@@ -4909,7 +4914,7 @@ SpellCastResult Spell::CheckCast(bool strict)
return SPELL_FAILED_NOT_INFRONT;
if (m_caster->GetEntry() != WORLD_TRIGGER) // Ignore LOS for gameobjects casts (wrongly casted by a trigger)
- if (!(m_spellInfo->AttributesEx2 & SPELL_ATTR2_CAN_TARGET_NOT_IN_LOS) && VMAP::VMapFactory::checkSpellForLoS(m_spellInfo->Id) && !m_caster->IsWithinLOSInMap(target))
+ 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->IsWithinLOSInMap(target))
return SPELL_FAILED_LINE_OF_SIGHT;
}
}
@@ -4920,7 +4925,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) && VMAP::VMapFactory::checkSpellForLoS(m_spellInfo->Id) && !m_caster->IsWithinLOS(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))
return SPELL_FAILED_LINE_OF_SIGHT;
}
@@ -5243,7 +5248,7 @@ SpellCastResult Spell::CheckCast(bool strict)
}
break;
}
- case SPELL_EFFECT_SUMMON_DEAD_PET:
+ case SPELL_EFFECT_RESURRECT_PET:
{
Creature* pet = m_caster->GetGuardianPet();
diff --git a/src/server/game/Spells/Spell.h b/src/server/game/Spells/Spell.h
index dc5e2bae990..1fe8affc407 100644
--- a/src/server/game/Spells/Spell.h
+++ b/src/server/game/Spells/Spell.h
@@ -333,7 +333,7 @@ class Spell
void EffectPlayMusic(SpellEffIndex effIndex);
void EffectSpecCount(SpellEffIndex effIndex);
void EffectActivateSpec(SpellEffIndex effIndex);
- void EffectPlayerNotification(SpellEffIndex effIndex);
+ void EffectPlaySound(SpellEffIndex effIndex);
void EffectRemoveAura(SpellEffIndex effIndex);
void EffectCastButtons(SpellEffIndex effIndex);
void EffectRechargeManaGem(SpellEffIndex effIndex);
diff --git a/src/server/game/Spells/SpellEffects.cpp b/src/server/game/Spells/SpellEffects.cpp
index fa5cec3db6a..8913cf2ac20 100644
--- a/src/server/game/Spells/SpellEffects.cpp
+++ b/src/server/game/Spells/SpellEffects.cpp
@@ -198,7 +198,7 @@ pEffect SpellEffects[TOTAL_SPELL_EFFECTS]=
&Spell::EffectApplyAreaAura, //128 SPELL_EFFECT_APPLY_AREA_AURA_FRIEND
&Spell::EffectApplyAreaAura, //129 SPELL_EFFECT_APPLY_AREA_AURA_ENEMY
&Spell::EffectRedirectThreat, //130 SPELL_EFFECT_REDIRECT_THREAT
- &Spell::EffectPlayerNotification, //131 SPELL_EFFECT_PLAYER_NOTIFICATION sound id in misc value (SoundEntries.dbc)
+ &Spell::EffectPlaySound, //131 SPELL_EFFECT_PLAY_SOUND sound id in misc value (SoundEntries.dbc)
&Spell::EffectPlayMusic, //132 SPELL_EFFECT_PLAY_MUSIC sound id in misc value (SoundEntries.dbc)
&Spell::EffectUnlearnSpecialization, //133 SPELL_EFFECT_UNLEARN_SPECIALIZATION unlearn profession specialization
&Spell::EffectKillCredit, //134 SPELL_EFFECT_KILL_CREDIT misc value is creature entry
@@ -2010,7 +2010,6 @@ void Spell::SendLoot(uint64 guid, LootType loottype)
case GAMEOBJECT_TYPE_DOOR:
case GAMEOBJECT_TYPE_BUTTON:
gameObjTarget->UseDoorOrButton(0, false, player);
- player->GetMap()->ScriptsStart(sGameObjectScripts, gameObjTarget->GetDBTableGUIDLow(), player, gameObjTarget);
return;
case GAMEOBJECT_TYPE_QUESTGIVER:
@@ -6141,7 +6140,7 @@ void Spell::EffectActivateSpec(SpellEffIndex /*effIndex*/)
unitTarget->ToPlayer()->ActivateSpec(damage-1); // damage is 1 or 2, spec is 0 or 1
}
-void Spell::EffectPlayerNotification(SpellEffIndex effIndex)
+void Spell::EffectPlaySound(SpellEffIndex effIndex)
{
if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT_TARGET)
return;
@@ -6154,20 +6153,21 @@ void Spell::EffectPlayerNotification(SpellEffIndex effIndex)
case 58730: // Restricted Flight Area
case 58600: // Restricted Flight Area
unitTarget->ToPlayer()->GetSession()->SendNotification(LANG_ZONE_NOFLYZONE);
- unitTarget->PlayDirectSound(9417); // Fel Reaver sound
+ break;
+ default:
break;
}
- uint32 soundid = m_spellInfo->Effects[effIndex].MiscValue;
+ uint32 soundId = m_spellInfo->Effects[effIndex].MiscValue;
- if (!sSoundEntriesStore.LookupEntry(soundid))
+ if (!sSoundEntriesStore.LookupEntry(soundId))
{
- sLog->outError(LOG_FILTER_SPELLS_AURAS, "EffectPlayerNotification: Sound (Id: %u) not exist in spell %u.", soundid, m_spellInfo->Id);
+ sLog->outError(LOG_FILTER_SPELLS_AURAS, "EffectPlayerSound: Sound (Id: %u) not exist in spell %u.", soundId, m_spellInfo->Id);
return;
}
WorldPacket data(SMSG_PLAY_SOUND, 4);
- data << uint32(soundid);
+ data << uint32(soundId);
unitTarget->ToPlayer()->GetSession()->SendPacket(&data);
}
diff --git a/src/server/game/Spells/SpellInfo.cpp b/src/server/game/Spells/SpellInfo.cpp
index 06c861bd388..afbf85a0a13 100644
--- a/src/server/game/Spells/SpellInfo.cpp
+++ b/src/server/game/Spells/SpellInfo.cpp
@@ -684,7 +684,7 @@ SpellEffectInfo::StaticData SpellEffectInfo::_data[TOTAL_SPELL_EFFECTS] =
{EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 128 SPELL_EFFECT_APPLY_AREA_AURA_FRIEND
{EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 129 SPELL_EFFECT_APPLY_AREA_AURA_ENEMY
{EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 130 SPELL_EFFECT_REDIRECT_THREAT
- {EFFECT_IMPLICIT_TARGET_NONE, TARGET_OBJECT_TYPE_UNIT}, // 131 SPELL_EFFECT_131
+ {EFFECT_IMPLICIT_TARGET_NONE, TARGET_OBJECT_TYPE_UNIT}, // 131 SPELL_EFFECT_PLAY_SOUND
{EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 132 SPELL_EFFECT_PLAY_MUSIC
{EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 133 SPELL_EFFECT_UNLEARN_SPECIALIZATION
{EFFECT_IMPLICIT_TARGET_NONE, TARGET_OBJECT_TYPE_UNIT}, // 134 SPELL_EFFECT_KILL_CREDIT2
@@ -1027,7 +1027,7 @@ bool SpellInfo::IsPassiveStackableWithRanks() const
bool SpellInfo::IsMultiSlotAura() const
{
- return IsPassive() || Id == 40075 || Id == 44413; // No other way to make 40075 have more than 1 copy of aura
+ return IsPassive() || Id == 55849 || Id == 40075 || Id == 44413; // Power Spark, Fel Flak Fire, Incanter's Absorption
}
bool SpellInfo::IsDeathPersistent() const
@@ -1100,7 +1100,7 @@ bool SpellInfo::IsAffectedBySpellMods() const
return !(AttributesEx3 & SPELL_ATTR3_NO_DONE_BONUS);
}
-bool SpellInfo::IsAffectedBySpellMod(SpellModifier* mod) const
+bool SpellInfo::IsAffectedBySpellMod(SpellModifier const* mod) const
{
if (!IsAffectedBySpellMods())
return false;
@@ -2019,7 +2019,7 @@ uint32 SpellInfo::GetRecoveryTime() const
return RecoveryTime > CategoryRecoveryTime ? RecoveryTime : CategoryRecoveryTime;
}
-uint32 SpellInfo::CalcPowerCost(Unit const* caster, SpellSchoolMask schoolMask) 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)
diff --git a/src/server/game/Spells/SpellInfo.h b/src/server/game/Spells/SpellInfo.h
index 1113b01b14c..23682c3d48f 100644
--- a/src/server/game/Spells/SpellInfo.h
+++ b/src/server/game/Spells/SpellInfo.h
@@ -405,7 +405,7 @@ public:
bool IsAutoRepeatRangedSpell() const;
bool IsAffectedBySpellMods() const;
- bool IsAffectedBySpellMod(SpellModifier* mod) const;
+ bool IsAffectedBySpellMod(SpellModifier const* mod) const;
bool CanPierceImmuneAura(SpellInfo const* aura) const;
bool CanDispelAura(SpellInfo const* aura) const;
@@ -445,7 +445,7 @@ public:
uint32 CalcCastTime(Unit* caster = NULL, Spell* spell = NULL) const;
uint32 GetRecoveryTime() const;
- uint32 CalcPowerCost(Unit const* caster, SpellSchoolMask schoolMask) const;
+ int32 CalcPowerCost(Unit const* caster, SpellSchoolMask schoolMask) const;
bool IsRanked() const;
uint8 GetRank() const;
diff --git a/src/server/game/Spells/SpellMgr.cpp b/src/server/game/Spells/SpellMgr.cpp
index 6d56bc591f5..582f13284bb 100644
--- a/src/server/game/Spells/SpellMgr.cpp
+++ b/src/server/game/Spells/SpellMgr.cpp
@@ -573,12 +573,12 @@ uint32 SpellMgr::GetSpellWithRank(uint32 spell_id, uint32 rank, bool strict) con
SpellRequiredMapBounds SpellMgr::GetSpellsRequiredForSpellBounds(uint32 spell_id) const
{
- return SpellRequiredMapBounds(mSpellReq.lower_bound(spell_id), mSpellReq.upper_bound(spell_id));
+ return mSpellReq.equal_range(spell_id);
}
SpellsRequiringSpellMapBounds SpellMgr::GetSpellsRequiringSpellBounds(uint32 spell_id) const
{
- return SpellsRequiringSpellMapBounds(mSpellsReqSpell.lower_bound(spell_id), mSpellsReqSpell.upper_bound(spell_id));
+ return mSpellsReqSpell.equal_range(spell_id);
}
bool SpellMgr::IsSpellRequiringSpell(uint32 spellid, uint32 req_spellid) const
@@ -618,7 +618,7 @@ SpellLearnSkillNode const* SpellMgr::GetSpellLearnSkill(uint32 spell_id) const
SpellLearnSpellMapBounds SpellMgr::GetSpellLearnSpellMapBounds(uint32 spell_id) const
{
- return SpellLearnSpellMapBounds(mSpellLearnSpells.lower_bound(spell_id), mSpellLearnSpells.upper_bound(spell_id));
+ return mSpellLearnSpells.equal_range(spell_id);
}
bool SpellMgr::IsSpellLearnSpell(uint32 spell_id) const
@@ -646,7 +646,7 @@ SpellTargetPosition const* SpellMgr::GetSpellTargetPosition(uint32 spell_id) con
SpellSpellGroupMapBounds SpellMgr::GetSpellSpellGroupMapBounds(uint32 spell_id) const
{
spell_id = GetFirstSpellInChain(spell_id);
- return SpellSpellGroupMapBounds(mSpellSpellGroup.lower_bound(spell_id), mSpellSpellGroup.upper_bound(spell_id));
+ return mSpellSpellGroup.equal_range(spell_id);
}
bool SpellMgr::IsSpellMemberOfSpellGroup(uint32 spellid, SpellGroup groupid) const
@@ -662,7 +662,7 @@ bool SpellMgr::IsSpellMemberOfSpellGroup(uint32 spellid, SpellGroup groupid) con
SpellGroupSpellMapBounds SpellMgr::GetSpellGroupSpellMapBounds(SpellGroup group_id) const
{
- return SpellGroupSpellMapBounds(mSpellGroupSpell.lower_bound(group_id), mSpellGroupSpell.upper_bound(group_id));
+ return mSpellGroupSpell.equal_range(group_id);
}
void SpellMgr::GetSetOfSpellsInSpellGroup(SpellGroup group_id, std::set<uint32>& foundSpells) const
@@ -1012,7 +1012,7 @@ SpellThreatEntry const* SpellMgr::GetSpellThreatEntry(uint32 spellID) const
SkillLineAbilityMapBounds SpellMgr::GetSkillLineAbilityMapBounds(uint32 spell_id) const
{
- return SkillLineAbilityMapBounds(mSkillLineAbilityMap.lower_bound(spell_id), mSkillLineAbilityMap.upper_bound(spell_id));
+ return mSkillLineAbilityMap.equal_range(spell_id);
}
PetAura const* SpellMgr::GetPetAura(uint32 spell_id, uint8 eff)
@@ -1062,27 +1062,27 @@ PetDefaultSpellsEntry const* SpellMgr::GetPetDefaultSpellsEntry(int32 id) const
SpellAreaMapBounds SpellMgr::GetSpellAreaMapBounds(uint32 spell_id) const
{
- return SpellAreaMapBounds(mSpellAreaMap.lower_bound(spell_id), mSpellAreaMap.upper_bound(spell_id));
+ return mSpellAreaMap.equal_range(spell_id);
}
SpellAreaForQuestMapBounds SpellMgr::GetSpellAreaForQuestMapBounds(uint32 quest_id) const
{
- return SpellAreaForQuestMapBounds(mSpellAreaForQuestMap.lower_bound(quest_id), mSpellAreaForQuestMap.upper_bound(quest_id));
+ return mSpellAreaForQuestMap.equal_range(quest_id);
}
SpellAreaForQuestMapBounds SpellMgr::GetSpellAreaForQuestEndMapBounds(uint32 quest_id) const
{
- return SpellAreaForQuestMapBounds(mSpellAreaForQuestEndMap.lower_bound(quest_id), mSpellAreaForQuestEndMap.upper_bound(quest_id));
+ return mSpellAreaForQuestEndMap.equal_range(quest_id);
}
SpellAreaForAuraMapBounds SpellMgr::GetSpellAreaForAuraMapBounds(uint32 spell_id) const
{
- return SpellAreaForAuraMapBounds(mSpellAreaForAuraMap.lower_bound(spell_id), mSpellAreaForAuraMap.upper_bound(spell_id));
+ return mSpellAreaForAuraMap.equal_range(spell_id);
}
SpellAreaForAreaMapBounds SpellMgr::GetSpellAreaForAreaMapBounds(uint32 area_id) const
{
- return SpellAreaForAreaMapBounds(mSpellAreaForAreaMap.lower_bound(area_id), mSpellAreaForAreaMap.upper_bound(area_id));
+ return mSpellAreaForAreaMap.equal_range(area_id);
}
bool SpellArea::IsFitToRequirements(Player const* player, uint32 newZone, uint32 newArea) const
diff --git a/src/server/game/Warden/WardenWin.cpp b/src/server/game/Warden/WardenWin.cpp
index ed7a10b8cb0..bff12280d89 100644
--- a/src/server/game/Warden/WardenWin.cpp
+++ b/src/server/game/Warden/WardenWin.cpp
@@ -453,8 +453,8 @@ void WardenWin::HandleData(ByteBuffer &buff)
if (luaStrLen != 0)
{
char *str = new char[luaStrLen + 1];
- memset(str, 0, luaStrLen + 1);
memcpy(str, buff.contents() + buff.rpos(), luaStrLen);
+ str[luaStrLen] = '\0'; // null terminator
sLog->outDebug(LOG_FILTER_WARDEN, "Lua string: %s", str);
delete[] str;
}
diff --git a/src/server/game/World/World.cpp b/src/server/game/World/World.cpp
index 855d576a2dd..d232920418d 100644
--- a/src/server/game/World/World.cpp
+++ b/src/server/game/World/World.cpp
@@ -1134,15 +1134,13 @@ void World::LoadConfigSettings(bool reload)
bool enableLOS = ConfigMgr::GetBoolDefault("vmap.enableLOS", true);
bool enableHeight = ConfigMgr::GetBoolDefault("vmap.enableHeight", true);
bool enablePetLOS = ConfigMgr::GetBoolDefault("vmap.petLOS", true);
- std::string ignoreSpellIds = ConfigMgr::GetStringDefault("vmap.ignoreSpellIds", "");
if (!enableHeight)
sLog->outError(LOG_FILTER_SERVER_LOADING, "VMap height checking disabled! Creatures movements and other various things WILL be broken! Expect no support.");
VMAP::VMapFactory::createOrGetVMapManager()->setEnableLineOfSightCalc(enableLOS);
VMAP::VMapFactory::createOrGetVMapManager()->setEnableHeightCalc(enableHeight);
- VMAP::VMapFactory::preventSpellsFromBeingTestedForLoS(ignoreSpellIds.c_str());
- sLog->outInfo(LOG_FILTER_SERVER_LOADING, "VMap support included. LineOfSight:%i, getHeight:%i, indoorCheck:%i PetLOS:%i", enableLOS, enableHeight, enableIndoor, enablePetLOS);
+ sLog->outInfo(LOG_FILTER_SERVER_LOADING, "VMap support included. LineOfSight: %i, getHeight: %i, indoorCheck: %i PetLOS: %i", enableLOS, enableHeight, enableIndoor, enablePetLOS);
sLog->outInfo(LOG_FILTER_SERVER_LOADING, "VMap data directory is: %svmaps", m_dataPath.c_str());
m_int_configs[CONFIG_MAX_WHO] = ConfigMgr::GetIntDefault("MaxWhoListReturns", 49);
@@ -1648,7 +1646,6 @@ void World::SetInitialWorldSettings()
///- Load and initialize scripts
sObjectMgr->LoadSpellScripts(); // must be after load Creature/Gameobject(Template/Data)
- sObjectMgr->LoadGameObjectScripts(); // must be after load Creature/Gameobject(Template/Data)
sObjectMgr->LoadEventScripts(); // must be after load Creature/Gameobject(Template/Data)
sObjectMgr->LoadWaypointScripts();
diff --git a/src/server/scripts/Commands/cs_lookup.cpp b/src/server/scripts/Commands/cs_lookup.cpp
index 3395047c720..2130e61cb47 100644
--- a/src/server/scripts/Commands/cs_lookup.cpp
+++ b/src/server/scripts/Commands/cs_lookup.cpp
@@ -1033,7 +1033,7 @@ public:
found = true;
}
}
-
+
if (!found)
handler->SendSysMessage(LANG_COMMAND_NOSPELLFOUND);
diff --git a/src/server/scripts/Commands/cs_reload.cpp b/src/server/scripts/Commands/cs_reload.cpp
index ef1fc681a31..43c2001fbf7 100644
--- a/src/server/scripts/Commands/cs_reload.cpp
+++ b/src/server/scripts/Commands/cs_reload.cpp
@@ -97,7 +97,6 @@ public:
{ "gameobject_involvedrelation", SEC_ADMINISTRATOR, true, &HandleReloadGOQuestInvRelationsCommand, "", NULL },
{ "gameobject_loot_template", SEC_ADMINISTRATOR, true, &HandleReloadLootTemplatesGameobjectCommand, "", NULL },
{ "gameobject_questrelation", SEC_ADMINISTRATOR, true, &HandleReloadGOQuestRelationsCommand, "", NULL },
- { "gameobject_scripts", SEC_ADMINISTRATOR, true, &HandleReloadGameObjectScriptsCommand, "", NULL },
{ "gm_tickets", SEC_ADMINISTRATOR, true, &HandleReloadGMTicketsCommand, "", NULL },
{ "gossip_menu", SEC_ADMINISTRATOR, true, &HandleReloadGossipMenuCommand, "", NULL },
{ "gossip_menu_option", SEC_ADMINISTRATOR, true, &HandleReloadGossipMenuOptionCommand, "", NULL },
@@ -260,7 +259,6 @@ public:
}
sLog->outInfo(LOG_FILTER_GENERAL, "Re-Loading Scripts...");
- HandleReloadGameObjectScriptsCommand(handler, "a");
HandleReloadEventScriptsCommand(handler, "a");
HandleReloadSpellScriptsCommand(handler, "a");
handler->SendGlobalGMSysMessage("DB tables `*_scripts` reloaded.");
@@ -951,26 +949,6 @@ public:
return true;
}
- static bool HandleReloadGameObjectScriptsCommand(ChatHandler* handler, const char* args)
- {
- if (sScriptMgr->IsScriptScheduled())
- {
- handler->SendSysMessage("DB scripts used currently, please attempt reload later.");
- handler->SetSentErrorMessage(true);
- return false;
- }
-
- if (*args != 'a')
- sLog->outInfo(LOG_FILTER_GENERAL, "Re-Loading Scripts from `gameobject_scripts`...");
-
- sObjectMgr->LoadGameObjectScripts();
-
- if (*args != 'a')
- handler->SendGlobalGMSysMessage("DB table `gameobject_scripts` reloaded.");
-
- return true;
- }
-
static bool HandleReloadEventScriptsCommand(ChatHandler* handler, const char* args)
{
if (sScriptMgr->IsScriptScheduled())
diff --git a/src/server/scripts/EasternKingdoms/CMakeLists.txt b/src/server/scripts/EasternKingdoms/CMakeLists.txt
index 854124ee05c..f581baa31fa 100644
--- a/src/server/scripts/EasternKingdoms/CMakeLists.txt
+++ b/src/server/scripts/EasternKingdoms/CMakeLists.txt
@@ -10,8 +10,8 @@
set(scripts_STAT_SRCS
${scripts_STAT_SRCS}
- EasternKingdoms/ghostlands.cpp
- EasternKingdoms/eversong_woods.cpp
+ EasternKingdoms/zone_ghostlands.cpp
+ EasternKingdoms/zone_eversong_woods.cpp
EasternKingdoms/AlteracValley/boss_galvangar.cpp
EasternKingdoms/AlteracValley/boss_balinda.cpp
EasternKingdoms/AlteracValley/boss_drekthar.cpp
@@ -31,7 +31,8 @@ set(scripts_STAT_SRCS
EasternKingdoms/Scholomance/instance_scholomance.cpp
EasternKingdoms/Scholomance/boss_lorekeeper_polkelt.cpp
EasternKingdoms/Scholomance/boss_ras_frostwhisper.cpp
- EasternKingdoms/isle_of_queldanas.cpp
+ EasternKingdoms/Scholomance/boss_kirtonos_the_herald.cpp
+ EasternKingdoms/zone_isle_of_queldanas.cpp
EasternKingdoms/boss_kruul.cpp
EasternKingdoms/ZulGurub/boss_hakkar.cpp
EasternKingdoms/ZulGurub/boss_mandokir.cpp
@@ -48,12 +49,12 @@ set(scripts_STAT_SRCS
EasternKingdoms/ZulGurub/boss_jindo.cpp
EasternKingdoms/ZulGurub/boss_wushoolay.cpp
EasternKingdoms/ZulGurub/boss_thekal.cpp
- EasternKingdoms/wetlands.cpp
- EasternKingdoms/arathi_highlands.cpp
+ EasternKingdoms/zone_wetlands.cpp
+ EasternKingdoms/zone_arathi_highlands.cpp
EasternKingdoms/Gnomeregan/instance_gnomeregan.cpp
EasternKingdoms/Gnomeregan/gnomeregan.cpp
EasternKingdoms/Gnomeregan/gnomeregan.h
- EasternKingdoms/redridge_mountains.cpp
+ EasternKingdoms/zone_redridge_mountains.cpp
EasternKingdoms/BlackrockDepths/boss_high_interrogator_gerstahn.cpp
EasternKingdoms/BlackrockDepths/boss_gorosh_the_dervish.cpp
EasternKingdoms/BlackrockDepths/blackrock_depths.cpp
@@ -67,12 +68,12 @@ set(scripts_STAT_SRCS
EasternKingdoms/BlackrockDepths/blackrock_depths.h
EasternKingdoms/BlackrockDepths/boss_emperor_dagran_thaurissan.cpp
EasternKingdoms/BlackrockDepths/boss_magmus.cpp
- EasternKingdoms/ironforge.cpp
+ EasternKingdoms/zone_ironforge.cpp
EasternKingdoms/ScarletEnclave/chapter2.cpp
EasternKingdoms/ScarletEnclave/chapter5.cpp
EasternKingdoms/ScarletEnclave/chapter1.cpp
- EasternKingdoms/ScarletEnclave/the_scarlet_enclave.cpp
- EasternKingdoms/eastern_plaguelands.cpp
+ EasternKingdoms/ScarletEnclave/zone_the_scarlet_enclave.cpp
+ EasternKingdoms/zone_eastern_plaguelands.cpp
EasternKingdoms/MoltenCore/boss_gehennas.cpp
EasternKingdoms/MoltenCore/boss_lucifron.cpp
EasternKingdoms/MoltenCore/boss_golemagg.cpp
@@ -99,7 +100,7 @@ set(scripts_STAT_SRCS
EasternKingdoms/Stratholme/boss_postmaster_malown.cpp
EasternKingdoms/Stratholme/stratholme.h
EasternKingdoms/Stratholme/stratholme.cpp
- EasternKingdoms/tirisfal_glades.cpp
+ EasternKingdoms/zone_tirisfal_glades.cpp
EasternKingdoms/SunkenTemple/sunken_temple.cpp
EasternKingdoms/SunkenTemple/sunken_temple.h
EasternKingdoms/SunkenTemple/instance_sunken_temple.cpp
@@ -115,7 +116,7 @@ set(scripts_STAT_SRCS
EasternKingdoms/Uldaman/uldaman.h
EasternKingdoms/Uldaman/instance_uldaman.cpp
EasternKingdoms/Uldaman/boss_archaedas.cpp
- EasternKingdoms/swamp_of_sorrows.cpp
+ EasternKingdoms/zone_swamp_of_sorrows.cpp
EasternKingdoms/BlackrockSpire/boss_pyroguard_emberseer.cpp
EasternKingdoms/BlackrockSpire/boss_drakkisath.cpp
EasternKingdoms/BlackrockSpire/boss_warmaster_voone.cpp
@@ -139,12 +140,12 @@ set(scripts_STAT_SRCS
EasternKingdoms/SunwellPlateau/boss_brutallus.cpp
EasternKingdoms/SunwellPlateau/sunwell_plateau.cpp
EasternKingdoms/SunwellPlateau/boss_felmyst.cpp
- EasternKingdoms/stranglethorn_vale.cpp
+ EasternKingdoms/zone_stranglethorn_vale.cpp
EasternKingdoms/Deadmines/deadmines.h
EasternKingdoms/Deadmines/deadmines.cpp
EasternKingdoms/Deadmines/boss_mr_smite.cpp
EasternKingdoms/Deadmines/instance_deadmines.cpp
- EasternKingdoms/duskwood.cpp
+ EasternKingdoms/zone_duskwood.cpp
EasternKingdoms/ScarletMonastery/boss_azshir_the_sleepless.cpp
EasternKingdoms/ScarletMonastery/boss_mograine_and_whitemane.cpp
EasternKingdoms/ScarletMonastery/boss_bloodmage_thalnos.cpp
@@ -157,13 +158,13 @@ set(scripts_STAT_SRCS
EasternKingdoms/ScarletMonastery/boss_arcanist_doan.cpp
EasternKingdoms/ScarletMonastery/boss_herod.cpp
EasternKingdoms/ScarletMonastery/boss_scorn.cpp
- EasternKingdoms/undercity.cpp
- EasternKingdoms/silvermoon_city.cpp
- EasternKingdoms/loch_modan.cpp
+ EasternKingdoms/zone_undercity.cpp
+ EasternKingdoms/zone_silvermoon_city.cpp
+ EasternKingdoms/zone_loch_modan.cpp
EasternKingdoms/ShadowfangKeep/shadowfang_keep.cpp
EasternKingdoms/ShadowfangKeep/instance_shadowfang_keep.cpp
EasternKingdoms/ShadowfangKeep/shadowfang_keep.h
- EasternKingdoms/burning_steppes.cpp
+ EasternKingdoms/zone_burning_steppes.cpp
EasternKingdoms/BlackwingLair/boss_chromaggus.cpp
EasternKingdoms/BlackwingLair/boss_razorgore.cpp
EasternKingdoms/BlackwingLair/boss_firemaw.cpp
@@ -174,8 +175,8 @@ set(scripts_STAT_SRCS
EasternKingdoms/BlackwingLair/boss_nefarian.cpp
EasternKingdoms/BlackwingLair/boss_flamegor.cpp
EasternKingdoms/BlackwingLair/boss_victor_nefarius.cpp
- EasternKingdoms/blasted_lands.cpp
- EasternKingdoms/stormwind_city.cpp
+ EasternKingdoms/zone_blasted_lands.cpp
+ EasternKingdoms/zone_stormwind_city.cpp
EasternKingdoms/ZulAman/boss_halazzi.cpp
EasternKingdoms/ZulAman/boss_hexlord.cpp
EasternKingdoms/ZulAman/boss_zuljin.cpp
@@ -185,11 +186,11 @@ set(scripts_STAT_SRCS
EasternKingdoms/ZulAman/boss_nalorakk.cpp
EasternKingdoms/ZulAman/zulaman.cpp
EasternKingdoms/ZulAman/zulaman.h
- EasternKingdoms/hinterlands.cpp
- EasternKingdoms/western_plaguelands.cpp
- EasternKingdoms/alterac_mountains.cpp
- EasternKingdoms/westfall.cpp
- EasternKingdoms/silverpine_forest.cpp
+ EasternKingdoms/zone_hinterlands.cpp
+ EasternKingdoms/zone_western_plaguelands.cpp
+ EasternKingdoms/zone_alterac_mountains.cpp
+ EasternKingdoms/zone_westfall.cpp
+ EasternKingdoms/zone_silverpine_forest.cpp
EasternKingdoms/Karazhan/instance_karazhan.cpp
EasternKingdoms/Karazhan/boss_nightbane.cpp
EasternKingdoms/Karazhan/karazhan.cpp
diff --git a/src/server/scripts/EasternKingdoms/MagistersTerrace/boss_vexallus.cpp b/src/server/scripts/EasternKingdoms/MagistersTerrace/boss_vexallus.cpp
index 19b717fa6ea..85a113ec495 100644
--- a/src/server/scripts/EasternKingdoms/MagistersTerrace/boss_vexallus.cpp
+++ b/src/server/scripts/EasternKingdoms/MagistersTerrace/boss_vexallus.cpp
@@ -70,9 +70,9 @@ public:
return new boss_vexallusAI (creature);
};
- struct boss_vexallusAI : public ScriptedAI
+ struct boss_vexallusAI : public BossAI
{
- boss_vexallusAI(Creature* creature) : ScriptedAI(creature)
+ boss_vexallusAI(Creature* creature) : BossAI(creature, DATA_VEXALLUS_EVENT)
{
instance = creature->GetInstanceScript();
}
@@ -87,6 +87,7 @@ public:
void Reset()
{
+ summons.DespawnAll();
ChainLightningTimer = 8000;
ArcaneShockTimer = 5000;
OverloadTimer = 1200;
@@ -104,6 +105,7 @@ public:
void JustDied(Unit* /*killer*/)
{
+ summons.DespawnAll();
if (instance)
instance->SetData(DATA_VEXALLUS_EVENT, DONE);
}
@@ -206,7 +208,10 @@ public:
struct mob_pure_energyAI : public ScriptedAI
{
- mob_pure_energyAI(Creature* creature) : ScriptedAI(creature) {}
+ mob_pure_energyAI(Creature* creature) : ScriptedAI(creature)
+ {
+ me->SetDisplayId(me->GetCreatureTemplate()->Modelid2);
+ }
void Reset() {}
diff --git a/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter1.cpp b/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter1.cpp
index c22cec65ab7..97fe57c5434 100644
--- a/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter1.cpp
+++ b/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter1.cpp
@@ -146,7 +146,7 @@ public:
me->CastSpell(me, SPELL_DK_INITIATE_VISUAL, true);
if (Player* starter = Unit::GetPlayer(*me, playerGUID))
- sCreatureTextMgr->SendChat(me, SAY_EVENT_ATTACK, 0, CHAT_MSG_ADDON, LANG_ADDON, TEXT_RANGE_NORMAL, 0, TEAM_OTHER, false, starter);
+ Talk(SAY_EVENT_ATTACK);
phase = PHASE_TO_ATTACK;
}
@@ -165,7 +165,7 @@ public:
anchor->GetContactPoint(me, anchorX, anchorY, z, 1.0f);
playerGUID = target->GetGUID();
- sCreatureTextMgr->SendChat(me, SAY_EVENT_START, 0, CHAT_MSG_ADDON, LANG_ADDON, TEXT_RANGE_NORMAL, 0, TEAM_OTHER, false, target);
+ Talk(SAY_EVENT_START);
}
void UpdateAI(const uint32 diff)
@@ -330,15 +330,21 @@ public:
#define GOSSIP_ACCEPT_DUEL "I challenge you, death knight!"
-enum eDuelEnums
+enum Spells_DKI
{
- SAY_DUEL = 0,
-
SPELL_DUEL = 52996,
//SPELL_DUEL_TRIGGERED = 52990,
SPELL_DUEL_VICTORY = 52994,
SPELL_DUEL_FLAG = 52991,
+};
+
+enum Says_VBM
+{
+ SAY_DUEL = 0,
+};
+enum Misc_VBN
+{
QUEST_DEATH_CHALLENGE = 12733,
FACTION_HOSTILE = 2068
};
@@ -501,8 +507,15 @@ public:
## npc_dark_rider_of_acherus
######*/
-#define DESPAWN_HORSE 52267
-#define SAY_DARK_RIDER "The realm of shadows awaits..."
+enum Spells_DR
+{
+ SPELL_DESPAWN_HORSE = 51918
+};
+
+enum Says_DR
+{
+ SAY_DARK_RIDER = 0
+};
class npc_dark_rider_of_acherus : public CreatureScript
{
@@ -547,7 +560,7 @@ public:
break;
case 1:
if (Unit* target = Unit::GetUnit(*me, TargetGUID))
- DoCast(target, DESPAWN_HORSE, true);
+ DoCast(target, SPELL_DESPAWN_HORSE, true);
PhaseTimer = 3000;
Phase = 2;
break;
@@ -587,13 +600,13 @@ public:
## npc_salanar_the_horseman
######*/
-enum eSalanar
+enum Spells_Salanar
{
- REALM_OF_SHADOWS = 52693,
- EFFECT_STOLEN_HORSE = 52263,
- DELIVER_STOLEN_HORSE = 52264,
- CALL_DARK_RIDER = 52266,
- SPELL_EFFECT_OVERTAKE = 52349
+ SPELL_REALM_OF_SHADOWS = 52693,
+ SPELL_EFFECT_STOLEN_HORSE = 52263,
+ SPELL_DELIVER_STOLEN_HORSE = 52264,
+ SPELL_CALL_DARK_RIDER = 52266,
+ SPELL_EFFECT_OVERTAKE = 52349
};
class npc_salanar_the_horseman : public CreatureScript
@@ -612,18 +625,18 @@ public:
void SpellHit(Unit* caster, const SpellInfo* spell)
{
- if (spell->Id == DELIVER_STOLEN_HORSE)
+ if (spell->Id == SPELL_DELIVER_STOLEN_HORSE)
{
if (caster->GetTypeId() == TYPEID_UNIT && caster->IsVehicle())
{
if (Unit* charmer = caster->GetCharmer())
{
- if (charmer->HasAura(EFFECT_STOLEN_HORSE))
+ if (charmer->HasAura(SPELL_EFFECT_STOLEN_HORSE))
{
- charmer->RemoveAurasDueToSpell(EFFECT_STOLEN_HORSE);
+ charmer->RemoveAurasDueToSpell(SPELL_EFFECT_STOLEN_HORSE);
caster->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_SPELLCLICK);
caster->setFaction(35);
- DoCast(caster, CALL_DARK_RIDER, true);
+ DoCast(caster, SPELL_CALL_DARK_RIDER, true);
if (Creature* Dark_Rider = me->FindNearestCreature(28654, 15))
CAST_AI(npc_dark_rider_of_acherus::npc_dark_rider_of_acherusAI, Dark_Rider->AI())->InitDespawnHorse(caster);
}
@@ -651,8 +664,8 @@ public:
//CAST_CRE(who)->Respawn(true);
}
- if (CAST_PLR(charmer)->HasAura(REALM_OF_SHADOWS))
- charmer->RemoveAurasDueToSpell(REALM_OF_SHADOWS);
+ if (CAST_PLR(charmer)->HasAura(SPELL_REALM_OF_SHADOWS))
+ charmer->RemoveAurasDueToSpell(SPELL_REALM_OF_SHADOWS);
}
}
}
@@ -715,10 +728,10 @@ public:
};
// correct way: 52312 52314 52555 ...
-enum SG
+enum Creatures_SG
{
- GHOULS = 28845,
- GHOSTS = 28846,
+ NPC_GHOULS = 28845,
+ NPC_GHOSTS = 28846,
};
class npc_dkc1_gothik : public CreatureScript
{
@@ -738,7 +751,7 @@ public:
{
ScriptedAI::MoveInLineOfSight(who);
- if (who->GetEntry() == GHOULS && me->IsWithinDistInMap(who, 10.0f))
+ if (who->GetEntry() == NPC_GHOULS && me->IsWithinDistInMap(who, 10.0f))
{
if (Unit* owner = who->GetOwner())
{
@@ -753,7 +766,7 @@ public:
CAST_CRE(who)->DespawnOrUnsummon();
if (CAST_PLR(owner)->GetQuestStatus(12698) == QUEST_STATUS_COMPLETE)
- owner->RemoveAllMinionsByEntry(GHOULS);
+ owner->RemoveAllMinionsByEntry(NPC_GHOSTS);
}
}
}
@@ -786,7 +799,7 @@ public:
void FindMinions(Unit* owner)
{
std::list<Creature*> MinionList;
- owner->GetAllMinionsByEntry(MinionList, GHOULS);
+ owner->GetAllMinionsByEntry(MinionList, NPC_GHOULS);
if (!MinionList.empty())
{
@@ -812,7 +825,7 @@ public:
Player* plrOwner = owner->ToPlayer();
if (plrOwner && plrOwner->isInCombat())
{
- if (plrOwner->getAttackerForHelper() && plrOwner->getAttackerForHelper()->GetEntry() == GHOSTS)
+ if (plrOwner->getAttackerForHelper() && plrOwner->getAttackerForHelper()->GetEntry() == NPC_GHOSTS)
AttackStart(plrOwner->getAttackerForHelper());
else
FindMinions(owner);
@@ -825,7 +838,7 @@ public:
//ScriptedAI::UpdateAI(diff);
//Check if we have a current target
- if (me->getVictim()->GetEntry() == GHOSTS)
+ if (me->getVictim()->GetEntry() == NPC_GHOSTS)
{
if (me->isAttackReady())
{
@@ -846,8 +859,11 @@ public:
## npc_scarlet_miner_cart
####*/
-#define SPELL_CART_CHECK 54173
-#define SPELL_CART_DRAG 52465
+enum Spells_SM
+{
+ SPELL_CART_CHECK = 54173,
+ SPELL_CART_DRAG = 52465
+};
class npc_scarlet_miner_cart : public CreatureScript
{
@@ -902,8 +918,11 @@ public:
## npc_scarlet_miner
####*/
-#define SAY_SCARLET_MINER1 "Where'd this come from? I better get this down to the ships before the foreman sees it!"
-#define SAY_SCARLET_MINER2 "Now I can have a rest!"
+enum Says_SM
+{
+ SAY_SCARLET_MINER_0 = 0,
+ SAY_SCARLET_MINER_1 = 1
+};
class npc_scarlet_miner : public CreatureScript
{
@@ -984,7 +1003,7 @@ public:
me->SetInFront(car);
me->SendMovementFlagUpdate();
}
- me->MonsterSay(SAY_SCARLET_MINER1, LANG_UNIVERSAL, 0);
+ Talk(SAY_SCARLET_MINER_0);
SetRun(true);
IntroTimer = 4000;
IntroPhase = 1;
@@ -998,7 +1017,7 @@ public:
car->StopMoving();
car->RemoveAura(SPELL_CART_DRAG);
}
- me->MonsterSay(SAY_SCARLET_MINER2, LANG_UNIVERSAL, 0);
+ Talk(SAY_SCARLET_MINER_1);
break;
default:
break;
@@ -1036,7 +1055,10 @@ public:
## go_inconspicuous_mine_car
######*/
-#define SPELL_CART_SUMM 52463
+enum Spells_Cart
+{
+ SPELL_CART_SUMM = 52463
+};
class go_inconspicuous_mine_car : public GameObjectScript
{
diff --git a/src/server/scripts/EasternKingdoms/ScarletEnclave/the_scarlet_enclave.cpp b/src/server/scripts/EasternKingdoms/ScarletEnclave/zone_the_scarlet_enclave.cpp
index a86b15a7f5c..32ce484f715 100644
--- a/src/server/scripts/EasternKingdoms/ScarletEnclave/the_scarlet_enclave.cpp
+++ b/src/server/scripts/EasternKingdoms/ScarletEnclave/zone_the_scarlet_enclave.cpp
@@ -23,8 +23,16 @@
/*####
## npc_valkyr_battle_maiden
####*/
-#define SPELL_REVIVE 51918
-#define VALK_WHISPER "It is not yet your time, champion. Rise! Rise and fight once more!"
+
+enum Spells_VBM
+{
+ SPELL_REVIVE = 51918
+};
+
+enum Says_VBM
+{
+ WHISPER_REVIVE = 0
+};
class npc_valkyr_battle_maiden : public CreatureScript
{
@@ -96,7 +104,7 @@ public:
{
me->HandleEmoteCommand(EMOTE_ONESHOT_CUSTOM_SPELL_01);
DoCast(player, SPELL_REVIVE, true);
- me->MonsterWhisper(VALK_WHISPER, player->GetGUID());
+ Talk(WHISPER_REVIVE,player->GetGUID());
}
FlyBackTimer = 5000;
break;
diff --git a/src/server/scripts/EasternKingdoms/Scholomance/boss_kirtonos_the_herald.cpp b/src/server/scripts/EasternKingdoms/Scholomance/boss_kirtonos_the_herald.cpp
new file mode 100644
index 00000000000..14ef18aba58
--- /dev/null
+++ b/src/server/scripts/EasternKingdoms/Scholomance/boss_kirtonos_the_herald.cpp
@@ -0,0 +1,299 @@
+/*
+ * Copyright (C) 2008-2013 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 "scholomance.h"
+#include "MoveSplineInit.h"
+#include "GameObjectAI.h"
+#include "Player.h"
+
+enum Says
+{
+ EMOTE_SUMMONED = 0
+};
+
+enum Spells
+{
+ SPELL_SWOOP = 18144,
+ SPELL_WING_FLAP = 12882,
+ SPELL_PIERCE_ARMOR = 6016,
+ SPELL_DISARM = 8379,
+ SPELL_KIRTONOS_TRANSFORM = 16467,
+ SPELL_SHADOW_BOLT = 17228,
+ SPELL_CURSE_OF_TONGUES = 12889,
+ SPELL_DOMINATE_MIND = 14515
+};
+
+enum Events
+{
+ INTRO_1 = 1,
+ INTRO_2 = 2,
+ INTRO_3 = 3,
+ INTRO_4 = 4,
+ INTRO_5 = 5,
+ INTRO_6 = 6,
+ EVENT_SWOOP = 7,
+ EVENT_WING_FLAP = 8,
+ EVENT_PIERCE_ARMOR = 9,
+ EVENT_DISARM = 10,
+ EVENT_SHADOW_BOLT = 11,
+ EVENT_CURSE_OF_TONGUES = 12,
+ EVENT_DOMINATE_MIND = 13,
+ EVENT_KIRTONOS_TRANSFORM = 14
+};
+
+enum Misc
+{
+ WEAPON_KIRTONOS_STAFF = 11365,
+ POINT_KIRTONOS_LAND = 13,
+ KIRTONOS_PATH = 105061
+};
+
+class boss_kirtonos_the_herald : public CreatureScript
+{
+ public: boss_kirtonos_the_herald() : CreatureScript("boss_kirtonos_the_herald") { }
+
+ struct boss_kirtonos_the_heraldAI : public BossAI
+ {
+ boss_kirtonos_the_heraldAI(Creature* creature) : BossAI(creature, TYPE_KIRTONOS) { }
+
+ void Reset()
+ {
+ _introEvent = 0;
+ _introTimer = 0;
+ _Reset();
+ }
+
+ void EnterCombat(Unit* /*who*/)
+ {
+ _introTimer = 0;
+ _introEvent = 0;
+ events.ScheduleEvent(EVENT_SWOOP, urand(8000, 8000));
+ events.ScheduleEvent(EVENT_WING_FLAP, urand(15000, 15000));
+ events.ScheduleEvent(EVENT_PIERCE_ARMOR, urand(18000, 18000));
+ events.ScheduleEvent(EVENT_DISARM, urand(22000, 22000));
+ events.ScheduleEvent(EVENT_SHADOW_BOLT, urand(42000, 42000));
+ events.ScheduleEvent(EVENT_CURSE_OF_TONGUES, urand(53000, 53000));
+ events.ScheduleEvent(EVENT_DOMINATE_MIND, urand(34000, 48000));
+ events.ScheduleEvent(EVENT_KIRTONOS_TRANSFORM, urand(20000, 20000));
+ _EnterCombat();
+ }
+
+ void JustDied(Unit* /*killer*/)
+ {
+ if (GameObject* gate = me->GetMap()->GetGameObject(instance->GetData64(GO_GATE_KIRTONOS)))
+ gate->SetGoState(GO_STATE_ACTIVE);
+ if (GameObject* brazier = me->GetMap()->GetGameObject(instance->GetData64(GO_BRAZIER_OF_THE_HERALD)))
+ {
+ brazier->ResetDoorOrButton();
+ brazier->SetGoState(GO_STATE_READY);
+ }
+ _JustDied();
+ }
+
+ void EnterEvadeMode()
+ {
+ if (GameObject* gate = me->GetMap()->GetGameObject(instance->GetData64(GO_GATE_KIRTONOS)))
+ gate->SetGoState(GO_STATE_ACTIVE);
+ if (GameObject* brazier = me->GetMap()->GetGameObject(instance->GetData64(GO_BRAZIER_OF_THE_HERALD)))
+ {
+ brazier->ResetDoorOrButton();
+ brazier->SetGoState(GO_STATE_READY);
+ }
+ me->DespawnOrUnsummon(5000);
+ }
+
+ void IsSummonedBy(Unit* /*summoner*/)
+ {
+ me->SetDisableGravity(true);
+ me->SetReactState(REACT_PASSIVE);
+ me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE|UNIT_FLAG_NOT_SELECTABLE);
+ _introEvent = INTRO_1;
+ _introTimer = 1;
+ _currentPoint = 0;
+ Talk(EMOTE_SUMMONED);
+ }
+
+ void JustSummoned(Creature* summon)
+ {
+ BossAI::JustSummoned(summon);
+ }
+
+ void MovementInform(uint32 type, uint32 id)
+ {
+ if (type == WAYPOINT_MOTION_TYPE && id == POINT_KIRTONOS_LAND)
+ {
+ _introTimer = 1500;
+ _introEvent = INTRO_2;
+ }
+ }
+
+ void UpdateAI(uint32 const diff)
+ {
+ if (_introEvent)
+ {
+ if (_introTimer <= diff)
+ {
+ switch (_introEvent)
+ {
+ case INTRO_1:
+ me->GetMotionMaster()->MovePath(KIRTONOS_PATH,false);
+ _introEvent = 0;
+ break;
+ case INTRO_2:
+ me->GetMotionMaster()->MovePoint(0, 299.4884f, 92.76137f, 105.6335f);
+ _introTimer = 1000;
+ _introEvent = INTRO_3;
+ break;
+ case INTRO_3:
+ if (GameObject* gate = me->GetMap()->GetGameObject(instance->GetData64(GO_GATE_KIRTONOS)))
+ gate->SetGoState(GO_STATE_READY);
+ me->SetFacingTo(0.01745329f);
+ _introTimer = 3000;
+ _introEvent = INTRO_4;
+ break;
+ case INTRO_4:
+ if (GameObject* brazier = me->GetMap()->GetGameObject(instance->GetData64(GO_BRAZIER_OF_THE_HERALD)))
+ brazier->SetGoState(GO_STATE_READY);
+ me->SetWalk(true);
+ me->SetDisableGravity(false);
+ DoCast(me, SPELL_KIRTONOS_TRANSFORM);
+ _introTimer = 1000;
+ _introEvent = INTRO_5;
+ break;
+ case INTRO_5:
+ me->HandleEmoteCommand(EMOTE_ONESHOT_ROAR);
+ me->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + 0, uint32(WEAPON_KIRTONOS_STAFF));
+ me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE|UNIT_FLAG_NOT_SELECTABLE);
+ me->SetReactState(REACT_AGGRESSIVE);
+ _introTimer = 5000;
+ _introEvent = INTRO_6;
+ case INTRO_6:
+ // I don't know how to make him not swim across screen here. Tell me and I will fix.
+ me->GetMotionMaster()->MovePoint(0, 314.8673f, 90.3021f, 101.6459f);
+ _introTimer = 0;
+ _introEvent = 0;
+ break;
+ }
+ }
+ else
+ _introTimer -= diff;
+ }
+
+ if (!UpdateVictim())
+ return;
+
+ events.Update(diff);
+
+ if (me->HasUnitState(UNIT_STATE_CASTING))
+ return;
+
+ while (uint32 eventId = events.ExecuteEvent())
+ {
+ switch (eventId)
+ {
+ case EVENT_SWOOP:
+ DoCast(me, SPELL_SWOOP);
+ events.ScheduleEvent(EVENT_SWOOP, 15000);
+ break;
+ case EVENT_WING_FLAP:
+ DoCast(me, SPELL_WING_FLAP);
+ events.ScheduleEvent(EVENT_WING_FLAP, 13000);
+ break;
+ case EVENT_PIERCE_ARMOR:
+ DoCastVictim(SPELL_PIERCE_ARMOR, true);
+ events.ScheduleEvent(EVENT_PIERCE_ARMOR, 12000);
+ break;
+ case EVENT_DISARM:
+ DoCastVictim(SPELL_DISARM, true);
+ events.ScheduleEvent(EVENT_DISARM, 11000);
+ break;
+ case EVENT_SHADOW_BOLT:
+ DoCastVictim(SPELL_SHADOW_BOLT, true);
+ events.ScheduleEvent(EVENT_SHADOW_BOLT, 42000);
+ break;
+ case EVENT_CURSE_OF_TONGUES:
+ DoCastVictim(SPELL_CURSE_OF_TONGUES, true);
+ events.ScheduleEvent(EVENT_CURSE_OF_TONGUES, 35000);
+ break;
+ case EVENT_DOMINATE_MIND:
+ DoCastVictim(SPELL_DOMINATE_MIND, true);
+ events.ScheduleEvent(EVENT_DOMINATE_MIND, urand(44000, 48000));
+ break;
+ case EVENT_KIRTONOS_TRANSFORM:
+ if (me->HasAura(SPELL_KIRTONOS_TRANSFORM))
+ {
+ me->RemoveAura(SPELL_KIRTONOS_TRANSFORM);
+ me->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + 0, uint32(0));
+ }
+ else
+ {
+ DoCast(me, SPELL_KIRTONOS_TRANSFORM);
+ me->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + 0, uint32(WEAPON_KIRTONOS_STAFF));
+ }
+ events.ScheduleEvent(EVENT_KIRTONOS_TRANSFORM, urand(16000, 18000));
+ break;
+ default:
+ break;
+ }
+ }
+
+ DoMeleeAttackIfReady();
+ }
+
+ private:
+ uint8 _introEvent;
+ uint32 _introTimer;
+ uint32 _currentPoint;
+ };
+
+ CreatureAI* GetAI(Creature* creature) const
+ {
+ return new boss_kirtonos_the_heraldAI(creature);
+ }
+};
+
+/*######
+## go_brazier_of_the_herald
+######*/
+
+enum Brazier_Of_The_Herald
+{
+ NPC_KIRTONOS = 10506,
+ SOUND_SCREECH = 557
+};
+
+class go_brazier_of_the_herald : public GameObjectScript
+{
+ public:
+ go_brazier_of_the_herald() : GameObjectScript("go_brazier_of_the_herald") { }
+
+ bool OnGossipHello(Player* player, GameObject* go)
+ {
+ go->UseDoorOrButton();
+ go->PlayDirectSound(SOUND_SCREECH, 0);
+ player->SummonCreature(NPC_KIRTONOS, 315.028f, 70.53845f, 102.1496f, 0.3859715f, TEMPSUMMON_DEAD_DESPAWN, 900000);
+ return true;
+ }
+};
+
+void AddSC_boss_kirtonos_the_herald()
+{
+ new boss_kirtonos_the_herald();
+ new go_brazier_of_the_herald;
+}
diff --git a/src/server/scripts/EasternKingdoms/Scholomance/instance_scholomance.cpp b/src/server/scripts/EasternKingdoms/Scholomance/instance_scholomance.cpp
index 583b9074433..fc966c4bbb9 100644
--- a/src/server/scripts/EasternKingdoms/Scholomance/instance_scholomance.cpp
+++ b/src/server/scripts/EasternKingdoms/Scholomance/instance_scholomance.cpp
@@ -27,17 +27,6 @@ EndScriptData */
#include "InstanceScript.h"
#include "scholomance.h"
-#define GO_GATE_KIRTONOS 175570
-#define GO_GATE_GANDLING 177374
-#define GO_GATE_MALICIA 177375
-#define GO_GATE_THEOLEN 177377
-#define GO_GATE_POLKELT 177376
-#define GO_GATE_RAVENIAN 177372
-#define GO_GATE_BAROV 177373
-#define GO_GATE_ILLUCIA 177371
-
-#define MAX_ENCOUNTER 2
-
class instance_scholomance : public InstanceMapScript
{
public:
@@ -64,6 +53,7 @@ public:
uint64 GateRavenianGUID;
uint64 GateBarovGUID;
uint64 GateIlluciaGUID;
+ uint64 BrazierOfTheHeraldGUID;
void Initialize()
{
@@ -77,6 +67,7 @@ public:
GateRavenianGUID = 0;
GateBarovGUID = 0;
GateIlluciaGUID = 0;
+ BrazierOfTheHeraldGUID = 0;
for (uint8 i = 0; i < 6; ++i)
IsBossDied[i] = false;
@@ -86,14 +77,15 @@ public:
{
switch (go->GetEntry())
{
- case GO_GATE_KIRTONOS: GateKirtonosGUID = go->GetGUID(); break;
- case GO_GATE_GANDLING: GateGandlingGUID = go->GetGUID(); break;
- case GO_GATE_MALICIA: GateMiliciaGUID = go->GetGUID(); break;
- case GO_GATE_THEOLEN: GateTheolenGUID = go->GetGUID(); break;
- case GO_GATE_POLKELT: GatePolkeltGUID = go->GetGUID(); break;
- case GO_GATE_RAVENIAN: GateRavenianGUID = go->GetGUID(); break;
- case GO_GATE_BAROV: GateBarovGUID = go->GetGUID(); break;
- case GO_GATE_ILLUCIA: GateIlluciaGUID = go->GetGUID(); break;
+ case GO_GATE_KIRTONOS: GateKirtonosGUID = go->GetGUID(); break;
+ case GO_GATE_GANDLING: GateGandlingGUID = go->GetGUID(); break;
+ case GO_GATE_MALICIA: GateMiliciaGUID = go->GetGUID(); break;
+ case GO_GATE_THEOLEN: GateTheolenGUID = go->GetGUID(); break;
+ case GO_GATE_POLKELT: GatePolkeltGUID = go->GetGUID(); break;
+ case GO_GATE_RAVENIAN: GateRavenianGUID = go->GetGUID(); break;
+ case GO_GATE_BAROV: GateBarovGUID = go->GetGUID(); break;
+ case GO_GATE_ILLUCIA: GateIlluciaGUID = go->GetGUID(); break;
+ case GO_BRAZIER_OF_THE_HERALD: BrazierOfTheHeraldGUID = go->GetGUID(); break;
}
}
@@ -135,6 +127,19 @@ public:
IsBossDied[3] && IsBossDied[4] && IsBossDied[5])
? IN_PROGRESS : 0;
}
+
+ uint64 GetData64(uint32 type) const
+ {
+ switch (type)
+ {
+ case GO_GATE_KIRTONOS:
+ return GateKirtonosGUID;
+ case GO_BRAZIER_OF_THE_HERALD:
+ return BrazierOfTheHeraldGUID;
+ }
+
+ return 0;
+ }
};
};
diff --git a/src/server/scripts/EasternKingdoms/Scholomance/scholomance.h b/src/server/scripts/EasternKingdoms/Scholomance/scholomance.h
index bae7c8c8efc..20b782fd43a 100644
--- a/src/server/scripts/EasternKingdoms/Scholomance/scholomance.h
+++ b/src/server/scripts/EasternKingdoms/Scholomance/scholomance.h
@@ -19,13 +19,31 @@
#ifndef DEF_SCHOLOMANCE_H
#define DEF_SCHOLOMANCE_H
-#define TYPE_GANDLING 1
-#define DATA_DOCTORTHEOLENKRASTINOV_DEATH 2
-#define DATA_INSTRUCTORMALICIA_DEATH 3
-#define DATA_LADYILLUCIABAROV_DEATH 4
-#define DATA_LORDALEXEIBAROV_DEATH 5
-#define DATA_LOREKEEPERPOLKELT_DEATH 6
-#define DATA_THERAVENIAN_DEATH 7
-#define TYPE_KIRTONOS 8
-#endif
+uint32 const MAX_ENCOUNTER = 2;
+
+enum DataTypes
+{
+ TYPE_GANDLING = 1,
+ DATA_DOCTORTHEOLENKRASTINOV_DEATH = 2,
+ DATA_INSTRUCTORMALICIA_DEATH = 3,
+ DATA_LADYILLUCIABAROV_DEATH = 4,
+ DATA_LORDALEXEIBAROV_DEATH = 5,
+ DATA_LOREKEEPERPOLKELT_DEATH = 6,
+ DATA_THERAVENIAN_DEATH = 7,
+ TYPE_KIRTONOS = 8
+};
+enum GameobjectIds
+{
+ GO_GATE_KIRTONOS = 175570,
+ GO_GATE_GANDLING = 177374,
+ GO_GATE_MALICIA = 177375,
+ GO_GATE_THEOLEN = 177377,
+ GO_GATE_POLKELT = 177376,
+ GO_GATE_RAVENIAN = 177372,
+ GO_GATE_BAROV = 177373,
+ GO_GATE_ILLUCIA = 177371,
+ GO_BRAZIER_OF_THE_HERALD = 175564
+};
+
+#endif
diff --git a/src/server/scripts/EasternKingdoms/Stratholme/boss_baron_rivendare.cpp b/src/server/scripts/EasternKingdoms/Stratholme/boss_baron_rivendare.cpp
index 3517bc0e223..2357f59b65d 100644
--- a/src/server/scripts/EasternKingdoms/Stratholme/boss_baron_rivendare.cpp
+++ b/src/server/scripts/EasternKingdoms/Stratholme/boss_baron_rivendare.cpp
@@ -27,56 +27,39 @@ EndScriptData */
#include "ScriptedCreature.h"
#include "stratholme.h"
-#define SAY_0 "Intruders! More pawns of the Argent Dawn, no doubt. I already count one of their number among my prisoners. Withdraw from my domain before she is executed!"
-#define SAY_1 "You're still here? Your foolishness is amusing! The Argent Dawn wench needn't suffer in vain. Leave at once and she shall be spared!"
-#define SAY_2 "I shall take great pleasure in taking this poor wretch's life! It's not too late, she needn't suffer in vain. Turn back and her death shall be merciful!"
-#define SAY_3 "May this prisoner's death serve as a warning. None shall defy the Scourge and live!"
-#define SAY_4 "So you see fit to toy with the Lich King's creations? Ramstein, be sure to give the intruders a proper greeting."
-#define SAY_5 "Time to take matters into my own hands. Come. Enter my domain and challenge the might of the Scourge!"
-
-#define ADD_1X 4017.403809f
-#define ADD_1Y -3339.703369f
-#define ADD_1Z 115.057655f
-#define ADD_1O 5.487860f
-
-#define ADD_2X 4013.189209f
-#define ADD_2Y -3351.808350f
-#define ADD_2Z 115.052254f
-#define ADD_2O 0.134280f
-
-#define ADD_3X 4017.738037f
-#define ADD_3Y -3363.478016f
-#define ADD_3Z 115.057274f
-#define ADD_3O 0.723313f
-
-#define ADD_4X 4048.877197f
-#define ADD_4Y -3363.223633f
-#define ADD_4Z 115.054253f
-#define ADD_4O 3.627735f
-
-#define ADD_5X 4051.777588f
-#define ADD_5Y -3350.893311f
-#define ADD_5Z 115.055351f
-#define ADD_5O 3.066176f
-
-#define ADD_6X 4048.375977f
-#define ADD_6Y -3339.966309f
-#define ADD_6Z 115.055222f
-#define ADD_6O 2.457497f
-
-#define SPELL_SHADOWBOLT 17393
-#define SPELL_CLEAVE 15284
-#define SPELL_MORTALSTRIKE 15708
-
-#define SPELL_UNHOLY_AURA 17467
-#define SPELL_RAISEDEAD 17473 //triggers death pact (17471)
-
-#define SPELL_RAISE_DEAD1 17475
-#define SPELL_RAISE_DEAD2 17476
-#define SPELL_RAISE_DEAD3 17477
-#define SPELL_RAISE_DEAD4 17478
-#define SPELL_RAISE_DEAD5 17479
-#define SPELL_RAISE_DEAD6 17480
+enum Says
+{
+ SAY_BARON_RUN_START = 0,
+ SAY_BARON_RUN_BOSS_KILL = 1,
+ SAY_BARON_RUN_FAIL = 2,
+ SAY_EVENT_RAMSTEIN = 3,
+ SAY_EVENT_BARON = 4
+};
+
+enum Spells
+{
+ SPELL_SHADOWBOLT = 17393,
+ SPELL_CLEAVE = 15284,
+ SPELL_MORTALSTRIKE = 15708,
+
+ SPELL_UNHOLY_AURA = 15284,
+ SPELL_RAISEDEAD = 15708, //triggers death pact (17471)
+
+ SPELL_RAISE_DEAD1 = 17475,
+ SPELL_RAISE_DEAD2 = 17476,
+ SPELL_RAISE_DEAD3 = 17477,
+ SPELL_RAISE_DEAD4 = 17478,
+ SPELL_RAISE_DEAD5 = 17479,
+ SPELL_RAISE_DEAD6 = 17480,
+};
+
+// Define Add positions
+Position const ADD_POS_1 = {4017.403809f, -3339.703369f, 115.057655f, 5.487860f};
+Position const ADD_POS_2 = {4013.189209f, -3351.808350f, 115.052254f, 0.134280f};
+Position const ADD_POS_3 = {4017.738037f, -3363.478016f, 115.057274f, 0.723313f};
+Position const ADD_POS_4 = {4048.877197f, -3363.223633f, 115.054253f, 3.627735f};
+Position const ADD_POS_5 = {4051.777588f, -3350.893311f, 115.055351f, 3.066176f};
+Position const ADD_POS_6 = {4048.375977f, -3339.966309f, 115.055222f, 2.457497f};
class boss_baron_rivendare : public CreatureScript
{
@@ -172,12 +155,12 @@ public:
//SummonSkeletons
if (SummonSkeletons_Timer <= diff)
{
- me->SummonCreature(11197, ADD_1X, ADD_1Y, ADD_1Z, ADD_1O, TEMPSUMMON_TIMED_DESPAWN, 29000);
- me->SummonCreature(11197, ADD_2X, ADD_2Y, ADD_2Z, ADD_2O, TEMPSUMMON_TIMED_DESPAWN, 29000);
- me->SummonCreature(11197, ADD_3X, ADD_3Y, ADD_3Z, ADD_3O, TEMPSUMMON_TIMED_DESPAWN, 29000);
- me->SummonCreature(11197, ADD_4X, ADD_4Y, ADD_4Z, ADD_4O, TEMPSUMMON_TIMED_DESPAWN, 29000);
- me->SummonCreature(11197, ADD_5X, ADD_5Y, ADD_5Z, ADD_5O, TEMPSUMMON_TIMED_DESPAWN, 29000);
- me->SummonCreature(11197, ADD_6X, ADD_6Y, ADD_6Z, ADD_6O, TEMPSUMMON_TIMED_DESPAWN, 29000);
+ me->SummonCreature(11197, ADD_POS_1, TEMPSUMMON_TIMED_DESPAWN, 29000);
+ me->SummonCreature(11197, ADD_POS_2, TEMPSUMMON_TIMED_DESPAWN, 29000);
+ me->SummonCreature(11197, ADD_POS_3, TEMPSUMMON_TIMED_DESPAWN, 29000);
+ me->SummonCreature(11197, ADD_POS_4, TEMPSUMMON_TIMED_DESPAWN, 29000);
+ me->SummonCreature(11197, ADD_POS_5, TEMPSUMMON_TIMED_DESPAWN, 29000);
+ me->SummonCreature(11197, ADD_POS_6, TEMPSUMMON_TIMED_DESPAWN, 29000);
//34 seconds until we should cast this again
SummonSkeletons_Timer = 40000;
diff --git a/src/server/scripts/EasternKingdoms/Uldaman/boss_archaedas.cpp b/src/server/scripts/EasternKingdoms/Uldaman/boss_archaedas.cpp
index 6d555a52eec..87301f43745 100644
--- a/src/server/scripts/EasternKingdoms/Uldaman/boss_archaedas.cpp
+++ b/src/server/scripts/EasternKingdoms/Uldaman/boss_archaedas.cpp
@@ -31,19 +31,15 @@ EndScriptData */
#include "uldaman.h"
#include "Player.h"
-#define SAY_AGGRO "Who dares awaken Archaedas? Who dares the wrath of the makers!"
-#define SOUND_AGGRO 5855
-
-#define SAY_SUMMON "Awake ye servants, defend the discs!"
-#define SOUND_SUMMON 5856
-
-#define SAY_SUMMON2 "To my side, brothers. For the makers!"
-#define SOUND_SUMMON2 5857
-
-#define SAY_KILL "Reckless mortal."
-#define SOUND_KILL 5858
+enum Says
+{
+ SAY_AGGRO = 0,
+ SAY_SUMMON_GUARDIANS = 1,
+ SAY_SUMMON_VAULT_WALKERS = 2,
+ SAY_KILL = 3
+};
-enum eSpells
+enum Spells
{
SPELL_GROUND_TREMOR = 6524,
SPELL_ARCHAEDAS_AWAKEN = 10347,
@@ -52,6 +48,7 @@ enum eSpells
SPELL_SUB_BOSS_AGGRO = 11568,
SPELL_AWAKEN_VAULT_WALKER = 10258,
SPELL_AWAKEN_EARTHEN_GUARDIAN = 10252,
+ SPELL_SELF_DESTRUCT = 9874
};
class boss_archaedas : public CreatureScript
@@ -122,8 +119,7 @@ class boss_archaedas : public CreatureScript
// Being woken up from the altar, start the awaken sequence
if (spell == sSpellMgr->GetSpellInfo(SPELL_ARCHAEDAS_AWAKEN))
{
- me->MonsterYell(SAY_AGGRO, LANG_UNIVERSAL, 0);
- DoPlaySoundToSet(me, SOUND_AGGRO);
+ Talk(SAY_AGGRO);
iAwakenTimer = 4000;
bWakingUp = true;
}
@@ -131,8 +127,7 @@ class boss_archaedas : public CreatureScript
void KilledUnit(Unit* /*victim*/)
{
- me->MonsterYell(SAY_KILL, LANG_UNIVERSAL, 0);
- DoPlaySoundToSet(me, SOUND_KILL);
+ Talk(SAY_KILL);
}
void UpdateAI(const uint32 uiDiff)
@@ -172,8 +167,7 @@ class boss_archaedas : public CreatureScript
ActivateMinion(instance->GetData64(8), true); // EarthenGuardian4
ActivateMinion(instance->GetData64(9), true); // EarthenGuardian5
ActivateMinion(instance->GetData64(10), false); // EarthenGuardian6
- me->MonsterYell(SAY_SUMMON, LANG_UNIVERSAL, 0);
- DoPlaySoundToSet(me, SOUND_SUMMON);
+ Talk(SAY_SUMMON_GUARDIANS);
bGuardiansAwake = true;
}
@@ -184,8 +178,7 @@ class boss_archaedas : public CreatureScript
ActivateMinion(instance->GetData64(2), true); // VaultWalker2
ActivateMinion(instance->GetData64(3), true); // VaultWalker3
ActivateMinion(instance->GetData64(4), false); // VaultWalker4
- me->MonsterYell(SAY_SUMMON2, LANG_UNIVERSAL, 0);
- DoPlaySoundToSet(me, SOUND_SUMMON2);
+ Talk(SAY_SUMMON_VAULT_WALKERS);
bVaultWalkersAwake = true;
}
@@ -224,8 +217,6 @@ SDComment: These mobs are initially frozen until Archaedas awakens them
one at a time.
EndScriptData */
-#define SPELL_ARCHAEDAS_AWAKEN 10347
-
class mob_archaedas_minions : public CreatureScript
{
public:
@@ -323,8 +314,6 @@ SDComment: After activating the altar of the keepers, the stone keepers will
wake up one by one.
EndScriptData */
-#define SPELL_SELF_DESTRUCT 9874
-
class mob_stonekeepers : public CreatureScript
{
public:
@@ -388,8 +377,6 @@ SDComment: Needs 1 person to activate the Archaedas script
SDCategory: Uldaman
EndScriptData */
-#define SPELL_BOSS_OBJECT_VISUAL 11206
-
class go_altar_of_archaedas : public GameObjectScript
{
public:
@@ -419,8 +406,6 @@ SDComment: Need 1 person to activate to open the altar. One by one the StoneKee
SDCategory: Uldaman
EndScriptData */
-#define SPELL_BOSS_OBJECT_VISUAL 11206
-
class go_altar_of_the_keepers : public GameObjectScript
{
public:
diff --git a/src/server/scripts/EasternKingdoms/ZulAman/boss_akilzon.cpp b/src/server/scripts/EasternKingdoms/ZulAman/boss_akilzon.cpp
index 89b14ff0f4d..1b2512ccf63 100644
--- a/src/server/scripts/EasternKingdoms/ZulAman/boss_akilzon.cpp
+++ b/src/server/scripts/EasternKingdoms/ZulAman/boss_akilzon.cpp
@@ -38,7 +38,7 @@ enum Spells
{
SPELL_STATIC_DISRUPTION = 43622,
SPELL_STATIC_VISUAL = 45265,
- SPELL_CALL_LIGHTNING = 43661, //Missing timer
+ SPELL_CALL_LIGHTNING = 43661, // Missing timer
SPELL_GUST_OF_WIND = 43621,
SPELL_ELECTRICAL_STORM = 43648,
SPELL_BERSERK = 45078,
@@ -46,25 +46,24 @@ enum Spells
SPELL_EAGLE_SWOOP = 44732
};
-//"Your death gonna be quick, strangers. You shoulda never have come to this place..."
-#define SAY_ONAGGRO "I be da predator! You da prey..."
-#define SAY_ONDEATH "You can't... kill... me spirit!"
-#define SAY_ONSLAY1 "Ya got nothin'!"
-#define SAY_ONSLAY2 "Stop your cryin'!"
-#define SAY_ONSUMMON "Feed, me bruddahs!"
-#define SAY_ONENRAGE "All you be doing is wasting my time!"
-#define SOUND_ONAGGRO 12013
-#define SOUND_ONDEATH 12019
-#define SOUND_ONSLAY1 12017
-#define SOUND_ONSLAY2 12018
-#define SOUND_ONSUMMON 12014
-#define SOUND_ONENRAGE 12016
-
-#define MOB_SOARING_EAGLE 24858
-#define SE_LOC_X_MAX 400
-#define SE_LOC_X_MIN 335
-#define SE_LOC_Y_MAX 1435
-#define SE_LOC_Y_MIN 1370
+enum Says
+{
+ SAY_AGGRO = 0,
+ SAY_SUMMON = 1,
+ SAY_INTRO = 2, // Not used in script
+ SAY_ENRAGE = 3,
+ SAY_KILL = 4,
+ SAY_DEATH = 5
+};
+
+enum Misc
+{
+ MOB_SOARING_EAGLE = 24858,
+ SE_LOC_X_MAX = 400,
+ SE_LOC_X_MIN = 335,
+ SE_LOC_Y_MAX = 1435,
+ SE_LOC_Y_MIN = 1370
+};
class boss_akilzon : public CreatureScript
{
@@ -130,8 +129,7 @@ class boss_akilzon : public CreatureScript
void EnterCombat(Unit* /*who*/)
{
- me->MonsterYell(SAY_ONAGGRO, LANG_UNIVERSAL, 0);
- DoPlaySoundToSet(me, SOUND_ONAGGRO);
+ Talk(SAY_AGGRO);
//DoZoneInCombat();
if (instance)
instance->SetData(DATA_AKILZONEVENT, IN_PROGRESS);
@@ -139,8 +137,7 @@ class boss_akilzon : public CreatureScript
void JustDied(Unit* /*killer*/)
{
- me->MonsterYell(SAY_ONDEATH, LANG_UNIVERSAL, 0);
- DoPlaySoundToSet(me, SOUND_ONDEATH);
+ Talk(SAY_DEATH);
if (instance)
instance->SetData(DATA_AKILZONEVENT, DONE);
DespawnSummons();
@@ -148,17 +145,7 @@ class boss_akilzon : public CreatureScript
void KilledUnit(Unit* /*victim*/)
{
- switch (urand(0, 1))
- {
- case 0:
- me->MonsterYell(SAY_ONSLAY1, LANG_UNIVERSAL, 0);
- DoPlaySoundToSet(me, SOUND_ONSLAY1);
- break;
- case 1:
- me->MonsterYell(SAY_ONSLAY2, LANG_UNIVERSAL, 0);
- DoPlaySoundToSet(me, SOUND_ONSLAY2);
- break;
- }
+ Talk(SAY_KILL);
}
void DespawnSummons()
@@ -276,8 +263,7 @@ class boss_akilzon : public CreatureScript
if (Enrage_Timer <= diff)
{
- me->MonsterYell(SAY_ONENRAGE, LANG_UNIVERSAL, 0);
- DoPlaySoundToSet(me, SOUND_ONENRAGE);
+ Talk(SAY_ENRAGE);
DoCast(me, SPELL_BERSERK, true);
Enrage_Timer = 600000;
} else Enrage_Timer -= diff;
@@ -351,8 +337,7 @@ class boss_akilzon : public CreatureScript
if (SummonEagles_Timer <= diff)
{
- me->MonsterYell(SAY_ONSUMMON, LANG_UNIVERSAL, 0);
- DoPlaySoundToSet(me, SOUND_ONSUMMON);
+ Talk(SAY_SUMMON);
float x, y, z;
me->GetPosition(x, y, z);
diff --git a/src/server/scripts/EasternKingdoms/ZulAman/boss_zuljin.cpp b/src/server/scripts/EasternKingdoms/ZulAman/boss_zuljin.cpp
index a7764fc4c4c..2305c360fd2 100644
--- a/src/server/scripts/EasternKingdoms/ZulAman/boss_zuljin.cpp
+++ b/src/server/scripts/EasternKingdoms/ZulAman/boss_zuljin.cpp
@@ -27,86 +27,68 @@ EndScriptData */
#include "zulaman.h"
#include "SpellInfo.h"
-//Speech
-const char* YELL_TRANSFORM_TO_LYNX = "Let me introduce to you my new bruddahs: fang and claw!";
-#define SOUND_TRANSFORM_TO_LYNX 12094
-
-const char* YELL_TRANSFORM_TO_BEAR = "Got me some new tricks...like me bruddah bear!";
-#define SOUND_TRANSFORM_TO_BEAR 12092
-
-const char* YELL_TRANSFORM_TO_DRAGONHAWK = "Ya don' have to look to da sky to see da dragonhawk!";
-#define SOUND_TRANSFORM_TO_DRAGONHAWK 12095
-
-const char* YELL_TRANSFORM_TO_EAGLE = "Dere be no hidin' from da eagle!";
-#define SOUND_TRANSFORM_TO_EAGLE 12093
-
-#define YELL_KILL_ONE "Da Amani de chuka!"
-#define SOUND_KILL_ONE 12098
-
-#define YELL_KILL_TWO "Lot more gonna fall like you!"
-#define SOUND_KILL_TWO 12099
-
-#define YELL_FIRE_BREATH "Fire kill you just as quick!"
-#define SOUND_FIRE_BRETH 12096
-
-#define YELL_AGGRO "Nobody badduh dan me!"
-#define SOUND_AGGRO 12091
-
-#define YELL_BERSERK "You too slow! Me too strong!"
-#define SOUND_BERSERK 12097
-
-#define YELL_DEATH "Mebbe me fall...but da Amani empire...never gonna die..."
-#define SOUND_DEATH 12100
-
-//Still not used, need more info
-#define YELL_INTRO "Everybody always wanna take from us. Now we gonna start takin' back. Anybody who get in our way...gonna drown in their own blood! De Amani empire be back now...seekin' vengeance. And we gonna start...with you!"
-#define SOUND_INTRO 12090
-
-//Spells:
-//====== Troll Form
-#define SPELL_WHIRLWIND 17207
-#define SPELL_GRIEVOUS_THROW 43093 // remove debuff after full healed
-//====== Bear Form
-#define SPELL_CREEPING_PARALYSIS 43095 // should cast on the whole raid
-#define SPELL_OVERPOWER 43456 // use after melee attack dodged
-//====== Eagle Form
-#define SPELL_ENERGY_STORM 43983 // enemy area aura, trigger 42577
-#define SPELL_ZAP_INFORM 42577
-#define SPELL_ZAP_DAMAGE 43137 // 1250 damage
-#define SPELL_SUMMON_CYCLONE 43112 // summon four feather vortex
-#define CREATURE_FEATHER_VORTEX 24136
-#define SPELL_CYCLONE_VISUAL 43119 // trigger 43147 visual
-#define SPELL_CYCLONE_PASSIVE 43120 // trigger 43121 (4y aoe) every second
-//Lynx Form
-#define SPELL_CLAW_RAGE_HASTE 42583
-#define SPELL_CLAW_RAGE_TRIGGER 43149
-#define SPELL_CLAW_RAGE_DAMAGE 43150
-#define SPELL_LYNX_RUSH_HASTE 43152
-#define SPELL_LYNX_RUSH_DAMAGE 43153
-//Dragonhawk Form
-#define SPELL_FLAME_WHIRL 43213 // trigger two spells
-#define SPELL_FLAME_BREATH 43215
-#define SPELL_SUMMON_PILLAR 43216 // summon 24187
-#define CREATURE_COLUMN_OF_FIRE 24187
-#define SPELL_PILLAR_TRIGGER 43218 // trigger 43217
-
-//cosmetic
-#define SPELL_SPIRIT_AURA 42466
-#define SPELL_SIPHON_SOUL 43501
-
-//Transforms:
-#define SPELL_SHAPE_OF_THE_BEAR 42594 // 15% dmg
-#define SPELL_SHAPE_OF_THE_EAGLE 42606
-#define SPELL_SHAPE_OF_THE_LYNX 42607 // haste melee 30%
-#define SPELL_SHAPE_OF_THE_DRAGONHAWK 42608
-
-#define SPELL_BERSERK 45078
-
-#define PHASE_BEAR 0
-#define PHASE_EAGLE 1
-#define PHASE_LYNX 2
-#define PHASE_DRAGONHAWK 3
-#define PHASE_TROLL 4
+enum Says
+{
+ YELL_INTRO = 0,
+ YELL_AGGRO = 1,
+ YELL_TRANSFORM_TO_BEAR = 2,
+ YELL_TRANSFORM_TO_EAGLE = 3,
+ YELL_TRANSFORM_TO_LYNX = 4,
+ YELL_TRANSFORM_TO_DRAGONHAWK = 5,
+ YELL_FIRE_BREATH = 6,
+ YELL_BERSERK = 7,
+ YELL_KILL = 8,
+ YELL_DEATH = 9
+};
+
+enum Spells
+{
+ // Troll Form
+ SPELL_WHIRLWIND = 17207,
+ SPELL_GRIEVOUS_THROW = 43093, // remove debuff after full healed
+ // Bear Form
+ SPELL_CREEPING_PARALYSIS = 43095, // should cast on the whole raid
+ SPELL_OVERPOWER = 43456, // use after melee attack dodged
+ // Eagle Form
+ SPELL_ENERGY_STORM = 43983, // enemy area aura, trigger 42577
+ SPELL_ZAP_INFORM = 42577,
+ SPELL_ZAP_DAMAGE = 43137, // 1250 damage
+ SPELL_SUMMON_CYCLONE = 43112, // summon four feather vortex
+ CREATURE_FEATHER_VORTEX = 24136,
+ SPELL_CYCLONE_VISUAL = 43119, // trigger 43147 visual
+ SPELL_CYCLONE_PASSIVE = 43120, // trigger 43121 (4y aoe) every second
+ // Lynx Form
+ SPELL_CLAW_RAGE_HASTE = 42583,
+ SPELL_CLAW_RAGE_TRIGGER = 43149,
+ SPELL_CLAW_RAGE_DAMAGE = 43150,
+ SPELL_LYNX_RUSH_HASTE = 43152,
+ SPELL_LYNX_RUSH_DAMAGE = 43153,
+ // Dragonhawk Form
+ SPELL_FLAME_WHIRL = 43213, // trigger two spells
+ SPELL_FLAME_BREATH = 43215,
+ SPELL_SUMMON_PILLAR = 43216, // summon 24187
+ CREATURE_COLUMN_OF_FIRE = 24187,
+ SPELL_PILLAR_TRIGGER = 43218, // trigger 43217
+ // Cosmetic
+ SPELL_SPIRIT_AURA = 42466,
+ SPELL_SIPHON_SOUL = 43501,
+ // Transforms:
+ SPELL_SHAPE_OF_THE_BEAR = 42594, // 15% dmg
+ SPELL_SHAPE_OF_THE_EAGLE = 42606,
+ SPELL_SHAPE_OF_THE_LYNX = 42607, // haste melee 30%
+ SPELL_SHAPE_OF_THE_DRAGONHAWK = 42608,
+
+ SPELL_BERSERK = 45078
+};
+
+enum Phase
+{
+ PHASE_BEAR = 0,
+ PHASE_EAGLE = 1,
+ PHASE_LYNX = 2,
+ PHASE_DRAGONHAWK = 3,
+ PHASE_TROLL = 4
+};
//coords for going for changing form
#define CENTER_X 120.148811f
@@ -129,17 +111,16 @@ static SpiritInfoStruct SpiritInfo[4] =
struct TransformStruct
{
- uint32 sound;
- std::string text;
+ uint8 text;
uint32 spell, unaura;
};
static TransformStruct Transform[4] =
{
- {SOUND_TRANSFORM_TO_BEAR, YELL_TRANSFORM_TO_BEAR, SPELL_SHAPE_OF_THE_BEAR, SPELL_WHIRLWIND},
- {SOUND_TRANSFORM_TO_EAGLE, YELL_TRANSFORM_TO_EAGLE, SPELL_SHAPE_OF_THE_EAGLE, SPELL_SHAPE_OF_THE_BEAR},
- {SOUND_TRANSFORM_TO_LYNX, YELL_TRANSFORM_TO_LYNX, SPELL_SHAPE_OF_THE_LYNX, SPELL_SHAPE_OF_THE_EAGLE},
- {SOUND_TRANSFORM_TO_DRAGONHAWK, YELL_TRANSFORM_TO_DRAGONHAWK, SPELL_SHAPE_OF_THE_DRAGONHAWK, SPELL_SHAPE_OF_THE_LYNX}
+ {YELL_TRANSFORM_TO_BEAR, SPELL_SHAPE_OF_THE_BEAR, SPELL_WHIRLWIND},
+ {YELL_TRANSFORM_TO_EAGLE, SPELL_SHAPE_OF_THE_EAGLE, SPELL_SHAPE_OF_THE_BEAR},
+ {YELL_TRANSFORM_TO_LYNX, SPELL_SHAPE_OF_THE_LYNX, SPELL_SHAPE_OF_THE_EAGLE},
+ {YELL_TRANSFORM_TO_DRAGONHAWK, SPELL_SHAPE_OF_THE_DRAGONHAWK, SPELL_SHAPE_OF_THE_LYNX}
};
class boss_zuljin : public CreatureScript
@@ -230,8 +211,7 @@ class boss_zuljin : public CreatureScript
DoZoneInCombat();
- me->MonsterYell(YELL_INTRO, LANG_UNIVERSAL, 0);
- DoPlaySoundToSet(me, SOUND_INTRO);
+ Talk(YELL_INTRO);
SpawnAdds();
EnterPhase(0);
}
@@ -241,17 +221,7 @@ class boss_zuljin : public CreatureScript
if (Intro_Timer)
return;
- switch (urand(0, 1))
- {
- case 0:
- me->MonsterYell(YELL_KILL_ONE, LANG_UNIVERSAL, 0);
- DoPlaySoundToSet(me, SOUND_KILL_ONE);
- break;
- case 1:
- me->MonsterYell(YELL_KILL_TWO, LANG_UNIVERSAL, 0);
- DoPlaySoundToSet(me, SOUND_KILL_TWO);
- break;
- }
+ Talk(YELL_KILL);
}
void JustDied(Unit* /*killer*/)
@@ -259,8 +229,7 @@ class boss_zuljin : public CreatureScript
if (instance)
instance->SetData(DATA_ZULJINEVENT, DONE);
- me->MonsterYell(YELL_DEATH, LANG_UNIVERSAL, 0);
- DoPlaySoundToSet(me, SOUND_DEATH);
+ Talk(YELL_DEATH);
Summons.DespawnEntry(CREATURE_COLUMN_OF_FIRE);
if (Unit* Temp = Unit::GetUnit(*me, SpiritGUID[3]))
@@ -353,8 +322,7 @@ class boss_zuljin : public CreatureScript
me->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID, 0);
me->RemoveAurasDueToSpell(Transform[Phase].unaura);
DoCast(me, Transform[Phase].spell);
- me->MonsterYell(Transform[Phase].text.c_str(), LANG_UNIVERSAL, 0);
- DoPlaySoundToSet(me, Transform[Phase].sound);
+ Talk(Transform[Phase].text);
if (Phase > 0)
{
if (Unit* Temp = Unit::GetUnit(*me, SpiritGUID[Phase - 1]))
@@ -409,8 +377,7 @@ class boss_zuljin : public CreatureScript
if (Berserk_Timer <= diff)
{
DoCast(me, SPELL_BERSERK, true);
- me->MonsterYell(YELL_BERSERK, LANG_UNIVERSAL, 0);
- DoPlaySoundToSet(me, SOUND_BERSERK);
+ Talk(YELL_BERSERK);
Berserk_Timer = 60000;
} else Berserk_Timer -= diff;
@@ -421,8 +388,7 @@ class boss_zuljin : public CreatureScript
{
if (Intro_Timer <= diff)
{
- me->MonsterYell(YELL_AGGRO, LANG_UNIVERSAL, 0);
- DoPlaySoundToSet(me, SOUND_AGGRO);
+ Talk(YELL_AGGRO);
Intro_Timer = 0;
} else Intro_Timer -= diff;
}
diff --git a/src/server/scripts/EasternKingdoms/ZulAman/instance_zulaman.cpp b/src/server/scripts/EasternKingdoms/ZulAman/instance_zulaman.cpp
index 372811b8a8c..abd6b468b07 100644
--- a/src/server/scripts/EasternKingdoms/ZulAman/instance_zulaman.cpp
+++ b/src/server/scripts/EasternKingdoms/ZulAman/instance_zulaman.cpp
@@ -29,13 +29,14 @@ EndScriptData */
#include "Player.h"
#include "TemporarySummon.h"
-#define MAX_ENCOUNTER 6
-#define RAND_VENDOR 2
+enum Misc
+{
+ MAX_ENCOUNTER = 7,
+ RAND_VENDOR = 2,
+ WORLDSTATE_SHOW_TIMER = 3104,
+ WORLDSTATE_TIME_TO_SACRIFICE = 3106
+};
-//187021 //Harkor's Satchel
-//186648 //Tanzar's Trunk
-//186672 //Ashli's Bag
-//186667 //Kraz's Package
// Chests spawn at bear/eagle/dragonhawk/lynx bosses
// The loots depend on how many bosses have been killed, but not the entries of the chests
// But we cannot add loots to gameobject, so we have to use the fixed loot_template
@@ -51,9 +52,10 @@ static SHostageInfo HostageInfo[] =
{23999, 187021, 400, 1414, 74.36f, 3.3f}, // eagle
{24001, 186672, -35, 1134, 18.71f, 1.9f}, // dragonhawk
{24024, 186667, 413, 1117, 6.32f, 3.1f} // lynx
-
};
+Position const HarrisonJonesLoc = {120.687f, 1674.0f, 42.0217f, 1.59044f};
+
class instance_zulaman : public InstanceMapScript
{
public:
@@ -70,9 +72,11 @@ class instance_zulaman : public InstanceMapScript
uint64 TanzarsTrunkGUID;
uint64 AshlisBagGUID;
uint64 KrazsPackageGUID;
+ uint64 StrangeGongGUID;
uint64 HexLordGateGUID;
uint64 ZulJinGateGUID;
+ uint64 MassiveGateGUID;
uint64 AkilzonDoorGUID;
uint64 ZulJinDoorGUID;
uint64 HalazziDoorGUID;
@@ -93,20 +97,24 @@ class instance_zulaman : public InstanceMapScript
TanzarsTrunkGUID = 0;
AshlisBagGUID = 0;
KrazsPackageGUID = 0;
-
+ StrangeGongGUID = 0;
HexLordGateGUID = 0;
ZulJinGateGUID = 0;
+ MassiveGateGUID = 0;
AkilzonDoorGUID = 0;
HalazziDoorGUID = 0;
ZulJinDoorGUID = 0;
QuestTimer = 0;
- QuestMinute = 21;
+ QuestMinute = 0;
BossKilled = 0;
ChestLooted = 0;
for (uint8 i = 0; i < RAND_VENDOR; ++i)
RandVendor[i] = NOT_STARTED;
+
+ m_auiEncounter[DATA_GONGEVENT] = NOT_STARTED;
+ instance->SummonCreature(NPC_HARRISON_JONES, HarrisonJonesLoc);
}
bool IsEncounterInProgress() const
@@ -122,11 +130,11 @@ class instance_zulaman : public InstanceMapScript
{
switch (creature->GetEntry())
{
- case 23578://janalai
- case 23863://zuljin
- case 24239://hexlord
- case 23577://halazzi
- case 23576://nalorakk
+ case NPC_JANALAI:
+ case NPC_ZULJIN:
+ case NPC_HEXLORD:
+ case NPC_HALAZZI:
+ case NPC_NALORAKK:
default: break;
}
}
@@ -135,18 +143,19 @@ class instance_zulaman : public InstanceMapScript
{
switch (go->GetEntry())
{
- case 186303: HalazziDoorGUID = go->GetGUID(); break;
- case 186304: ZulJinGateGUID = go->GetGUID(); break;
- case 186305: HexLordGateGUID = go->GetGUID(); break;
- case 186858: AkilzonDoorGUID = go->GetGUID(); break;
- case 186859: ZulJinDoorGUID = go->GetGUID(); break;
-
- case 187021: HarkorsSatchelGUID = go->GetGUID(); break;
- case 186648: TanzarsTrunkGUID = go->GetGUID(); break;
- case 186672: AshlisBagGUID = go->GetGUID(); break;
- case 186667: KrazsPackageGUID = go->GetGUID(); break;
+ case GO_DOOR_HALAZZI: HalazziDoorGUID = go->GetGUID(); break;
+ case GO_GATE_ZULJIN: ZulJinGateGUID = go->GetGUID(); break;
+ case GO_GATE_HEXLORD: HexLordGateGUID = go->GetGUID(); break;
+ case GO_MASSIVE_GATE: MassiveGateGUID = go->GetGUID(); break;
+ case GO_DOOR_AKILZON: AkilzonDoorGUID = go->GetGUID(); break;
+ case GO_DOOR_ZULJIN: ZulJinDoorGUID = go->GetGUID(); break;
+
+ case GO_HARKORS_SATCHEL: HarkorsSatchelGUID = go->GetGUID(); break;
+ case GO_TANZARS_TRUNK: TanzarsTrunkGUID = go->GetGUID(); break;
+ case GO_ASHLIS_BAG: AshlisBagGUID = go->GetGUID(); break;
+ case GO_KRAZS_PACKAGE: KrazsPackageGUID = go->GetGUID(); break;
+ case GO_STRANGE_GONG: StrangeGongGUID = go->GetGUID(); break;
default: break;
-
}
CheckInstanceStatus();
}
@@ -173,10 +182,10 @@ class instance_zulaman : public InstanceMapScript
void CheckInstanceStatus()
{
- if (BossKilled >= 4)
+ if (BossKilled >= DATA_HALAZZIEVENT)
HandleGameObject(HexLordGateGUID, true);
- if (BossKilled >= 5)
+ if (BossKilled >= DATA_HEXLORDEVENT)
HandleGameObject(ZulJinGateGUID, true);
}
@@ -214,49 +223,57 @@ class instance_zulaman : public InstanceMapScript
{
switch (type)
{
+ case DATA_GONGEVENT:
+ m_auiEncounter[DATA_GONGEVENT] = data;
+ if (data == IN_PROGRESS)
+ SaveToDB();
+ else if (data == DONE)
+ QuestMinute = 21;
+ break;
case DATA_NALORAKKEVENT:
- m_auiEncounter[0] = data;
+ m_auiEncounter[DATA_NALORAKKEVENT] = data;
if (data == DONE)
{
if (QuestMinute)
{
QuestMinute += 15;
- DoUpdateWorldState(3106, QuestMinute);
+ DoUpdateWorldState(WORLDSTATE_TIME_TO_SACRIFICE, QuestMinute);
}
SummonHostage(0);
}
break;
case DATA_AKILZONEVENT:
- m_auiEncounter[1] = data;
+ m_auiEncounter[DATA_AKILZONEVENT] = data;
HandleGameObject(AkilzonDoorGUID, data != IN_PROGRESS);
if (data == DONE)
{
if (QuestMinute)
{
QuestMinute += 10;
- DoUpdateWorldState(3106, QuestMinute);
+ DoUpdateWorldState(WORLDSTATE_TIME_TO_SACRIFICE, QuestMinute);
}
SummonHostage(1);
}
break;
case DATA_JANALAIEVENT:
- m_auiEncounter[2] = data;
- if (data == DONE) SummonHostage(2);
+ m_auiEncounter[DATA_JANALAIEVENT] = data;
+ if (data == DONE)
+ SummonHostage(2);
break;
case DATA_HALAZZIEVENT:
- m_auiEncounter[3] = data;
+ m_auiEncounter[DATA_HALAZZIEVENT] = data;
HandleGameObject(HalazziDoorGUID, data != IN_PROGRESS);
if (data == DONE) SummonHostage(3);
break;
case DATA_HEXLORDEVENT:
- m_auiEncounter[4] = data;
+ m_auiEncounter[DATA_HEXLORDEVENT] = data;
if (data == IN_PROGRESS)
HandleGameObject(HexLordGateGUID, false);
else if (data == NOT_STARTED)
CheckInstanceStatus();
break;
case DATA_ZULJINEVENT:
- m_auiEncounter[5] = data;
+ m_auiEncounter[DATA_ZULJINEVENT] = data;
HandleGameObject(ZulJinDoorGUID, data != IN_PROGRESS);
break;
case DATA_CHESTLOOTED:
@@ -274,10 +291,10 @@ class instance_zulaman : public InstanceMapScript
if (data == DONE)
{
++BossKilled;
- if (QuestMinute && BossKilled >= 4)
+ if (QuestMinute && BossKilled >= DATA_HALAZZIEVENT)
{
QuestMinute = 0;
- DoUpdateWorldState(3104, 0);
+ DoUpdateWorldState(WORLDSTATE_SHOW_TIMER, 0);
}
CheckInstanceStatus();
SaveToDB();
@@ -288,12 +305,13 @@ class instance_zulaman : public InstanceMapScript
{
switch (type)
{
- case DATA_NALORAKKEVENT: return m_auiEncounter[0];
- case DATA_AKILZONEVENT: return m_auiEncounter[1];
- case DATA_JANALAIEVENT: return m_auiEncounter[2];
- case DATA_HALAZZIEVENT: return m_auiEncounter[3];
- case DATA_HEXLORDEVENT: return m_auiEncounter[4];
- case DATA_ZULJINEVENT: return m_auiEncounter[5];
+ case DATA_GONGEVENT: return m_auiEncounter[DATA_GONGEVENT];
+ case DATA_NALORAKKEVENT: return m_auiEncounter[DATA_NALORAKKEVENT];
+ case DATA_AKILZONEVENT: return m_auiEncounter[DATA_AKILZONEVENT];
+ case DATA_JANALAIEVENT: return m_auiEncounter[DATA_JANALAIEVENT];
+ case DATA_HALAZZIEVENT: return m_auiEncounter[DATA_HALAZZIEVENT];
+ case DATA_HEXLORDEVENT: return m_auiEncounter[DATA_HEXLORDEVENT];
+ case DATA_ZULJINEVENT: return m_auiEncounter[DATA_ZULJINEVENT];
case DATA_CHESTLOOTED: return ChestLooted;
case TYPE_RAND_VENDOR_1: return RandVendor[0];
case TYPE_RAND_VENDOR_2: return RandVendor[1];
@@ -312,13 +330,27 @@ class instance_zulaman : public InstanceMapScript
QuestTimer += 60000;
if (QuestMinute)
{
- DoUpdateWorldState(3104, 1);
- DoUpdateWorldState(3106, QuestMinute);
- } else DoUpdateWorldState(3104, 0);
+ DoUpdateWorldState(WORLDSTATE_SHOW_TIMER, 1);
+ DoUpdateWorldState(WORLDSTATE_TIME_TO_SACRIFICE, QuestMinute);
+ } else DoUpdateWorldState(WORLDSTATE_SHOW_TIMER, 0);
}
QuestTimer -= diff;
}
}
+
+ uint64 GetData64(uint32 type) const
+ {
+ switch (type)
+ {
+ case GO_STRANGE_GONG:
+ return StrangeGongGUID;
+ case GO_MASSIVE_GATE:
+ return MassiveGateGUID;
+ }
+
+ return 0;
+ }
+
};
InstanceScript* GetInstanceScript(InstanceMap* map) const
diff --git a/src/server/scripts/EasternKingdoms/ZulAman/zulaman.cpp b/src/server/scripts/EasternKingdoms/ZulAman/zulaman.cpp
index 660f144c2dd..59997ebaa31 100644
--- a/src/server/scripts/EasternKingdoms/ZulAman/zulaman.cpp
+++ b/src/server/scripts/EasternKingdoms/ZulAman/zulaman.cpp
@@ -33,6 +33,7 @@ EndContentData */
#include "zulaman.h"
#include "Player.h"
#include "SpellInfo.h"
+#include "SpellScript.h"
/*######
## npc_forest_frog
@@ -199,9 +200,294 @@ class npc_zulaman_hostage : public CreatureScript
}
};
+/*######
+## npc_harrison_jones
+######*/
+
+enum Says
+{
+ SAY_HARRISON_0 = 0,
+ SAY_HARRISON_1 = 1,
+ SAY_HARRISON_2 = 0,
+ SAY_HARRISON_3 = 1
+};
+
+enum Spells
+{
+ SPELL_BANGING_THE_GONG = 45225,
+ SPELL_STEALTH = 34189,
+ SPELL_COSMETIC_SPEAR_THROW = 43647
+};
+
+enum Events
+{
+ GONG_EVENT_1 = 1,
+ GONG_EVENT_2 = 2,
+ GONG_EVENT_3 = 3,
+ GONG_EVENT_4 = 4,
+ GONG_EVENT_5 = 5,
+ GONG_EVENT_6 = 6,
+ GONG_EVENT_7 = 7,
+ GONG_EVENT_8 = 8,
+ GONG_EVENT_9 = 9,
+ GONG_EVENT_10 = 10,
+ GONG_EVENT_11 = 11
+};
+
+enum Waypoints
+{
+ HARRISON_MOVE_1 = 860440,
+ HARRISON_MOVE_2 = 860441,
+ HARRISON_MOVE_3 = 860442
+};
+
+enum DisplayIds
+{
+ MODEL_HARRISON_JONES_0 = 22340,
+ MODEL_HARRISON_JONES_1 = 22354,
+ MODEL_HARRISON_JONES_2 = 22347
+};
+
+enum EntryIds
+{
+ NPC_HARRISON_JONES_1 = 24375,
+ NPC_HARRISON_JONES_2 = 24365,
+ NPC_AMANISHI_GUARDIAN = 23597,
+};
+
+enum Weapons
+{
+ WEAPON_MACE = 5301,
+ WEAPON_SPEAR = 13631
+};
+
+class npc_harrison_jones : public CreatureScript
+{
+ public:
+
+ npc_harrison_jones()
+ : CreatureScript("npc_harrison_jones")
+ {
+ }
+
+ struct npc_harrison_jonesAI : public ScriptedAI
+ {
+ npc_harrison_jonesAI(Creature* creature) : ScriptedAI(creature)
+ {
+ instance = creature->GetInstanceScript();
+ }
+
+ InstanceScript* instance;
+
+ uint8 _gongEvent;
+ uint32 _gongTimer;
+ uint64 uiTargetGUID;
+
+ void Reset()
+ {
+ _gongEvent = 0;
+ _gongTimer = 0;
+ uiTargetGUID = 0;
+ }
+
+ void EnterCombat(Unit* /*who*/) {}
+
+ void sGossipSelect(Player* player, uint32 sender, uint32 action)
+ {
+ if (me->GetCreatureTemplate()->GossipMenuId == sender && !action)
+ {
+ player->CLOSE_GOSSIP_MENU();
+ me->SetInFront(player);
+ me->SendMovementFlagUpdate(true);
+ me->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP);
+ Talk(SAY_HARRISON_0);
+ _gongEvent = GONG_EVENT_1;
+ _gongTimer = 4000;
+ }
+ }
+
+ void SpellHit(Unit*, const SpellInfo* spell)
+ {
+ if (spell->Id == SPELL_COSMETIC_SPEAR_THROW)
+ {
+ me->RemoveAllAuras();
+ me->SetEntry(NPC_HARRISON_JONES_2);
+ me->SetDisplayId(MODEL_HARRISON_JONES_2);
+ me->SetTarget(0);
+ me->SetByteValue(UNIT_FIELD_BYTES_1,0,UNIT_STAND_STATE_DEAD);
+ me->SetFlag(UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_DEAD);
+ if (instance)
+ instance->SetData(DATA_GONGEVENT, DONE);
+ }
+ }
+
+ void UpdateAI(uint32 const diff)
+ {
+ if (_gongEvent)
+ {
+ if (_gongTimer <= diff)
+ {
+ switch (_gongEvent)
+ {
+ case GONG_EVENT_1:
+ me->GetMotionMaster()->MovePath(HARRISON_MOVE_1,false);
+ _gongEvent = GONG_EVENT_2;
+ _gongTimer = 12000;
+ break;
+ case GONG_EVENT_2:
+ me->SetFacingTo(6.235659f);
+ Talk(SAY_HARRISON_1);
+ DoCast(me, SPELL_BANGING_THE_GONG);
+ me->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + 0, uint32(WEAPON_MACE));
+ me->SetSheath(SHEATH_STATE_MELEE);
+ _gongEvent = GONG_EVENT_3;
+ _gongTimer = 4000;
+ break;
+ case GONG_EVENT_3:
+ if (GameObject* gong = me->GetMap()->GetGameObject(instance->GetData64(GO_STRANGE_GONG)))
+ gong->RemoveFlag(GAMEOBJECT_FLAGS,GO_FLAG_NOT_SELECTABLE);
+ _gongEvent = GONG_EVENT_4;
+ _gongTimer = 105000;
+ break;
+ case GONG_EVENT_4:
+ me->RemoveAura(SPELL_BANGING_THE_GONG);
+ if (GameObject* gong = me->GetMap()->GetGameObject(instance->GetData64(GO_STRANGE_GONG)))
+ gong->SetFlag(GAMEOBJECT_FLAGS,GO_FLAG_NOT_SELECTABLE);
+
+ // trigger or gong will need to be scripted to set IN_PROGRESS after enough hits.
+ // This is temp workaround.
+ if (instance)
+ instance->SetData(DATA_GONGEVENT, IN_PROGRESS); // to be removed.
+
+ if (instance->GetData(DATA_GONGEVENT) == IN_PROGRESS)
+ {
+ // Players are Now Saved to instance at SPECIAL (Player should be notified?)
+ me->GetMotionMaster()->MovePath(HARRISON_MOVE_2,false);
+ _gongEvent = GONG_EVENT_5;
+ _gongTimer = 5000;
+ }
+ else
+ {
+ _gongTimer = 1000;
+ _gongEvent = GONG_EVENT_9;
+ }
+ break;
+ case GONG_EVENT_5:
+ me->SetEntry(NPC_HARRISON_JONES_1);
+ me->SetDisplayId(MODEL_HARRISON_JONES_1);
+ Talk(SAY_HARRISON_2);
+ _gongTimer = 12000;
+ _gongEvent = GONG_EVENT_6;
+ break;
+ case GONG_EVENT_6:
+ me->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_STATE_USE_STANDING);
+ Talk(SAY_HARRISON_3);
+ _gongTimer = 7000;
+ _gongEvent = GONG_EVENT_7;
+ break;
+ case GONG_EVENT_7:
+ if (!uiTargetGUID)
+ {
+ std::list<Creature*> targetList;
+ GetCreatureListWithEntryInGrid(targetList, me, NPC_AMANISHI_GUARDIAN, 26.0f);
+ if (!targetList.empty())
+ {
+ for (std::list<Creature*>::const_iterator itr = targetList.begin(); itr != targetList.end(); ++itr)
+ {
+ if (Creature* ptarget = *itr)
+ {
+ if (ptarget->GetPositionX() > 120)
+ {
+ ptarget->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + 0, uint32(WEAPON_SPEAR));
+ ptarget->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC);
+ ptarget->SetReactState(REACT_PASSIVE);
+ ptarget->AI()->SetData(0,1);
+ }
+ else
+ ptarget->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC);
+ ptarget->SetReactState(REACT_PASSIVE);
+ ptarget->AI()->SetData(0,2);
+ }
+ }
+ }
+ }
+
+ if (GameObject* gate = me->GetMap()->GetGameObject(instance->GetData64(GO_MASSIVE_GATE)))
+ gate->SetGoState(GO_STATE_ACTIVE);
+ _gongTimer = 2000;
+ _gongEvent = GONG_EVENT_8;
+ break;
+ case GONG_EVENT_8:
+ DoCast(me, SPELL_STEALTH);
+ me->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + 0, uint32(0));
+ me->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_ONESHOT_NONE);
+ me->GetMotionMaster()->MovePath(HARRISON_MOVE_3,false);
+ _gongTimer = 1000;
+ _gongEvent = 0;
+ break;
+ case GONG_EVENT_9:
+ me->GetMotionMaster()->MovePoint(0, 120.687f, 1674.0f, 42.0217f);
+ _gongTimer = 12000;
+ _gongEvent = GONG_EVENT_10;
+ break;
+ case GONG_EVENT_10:
+ me->SetFacingTo(1.59044f);
+ _gongEvent = 11;
+ _gongTimer = 6000;
+ break;
+ case GONG_EVENT_11:
+ me->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP);
+ if (instance)
+ instance->SetData(DATA_GONGEVENT, NOT_STARTED);
+ _gongEvent = 0;
+ _gongTimer = 1000;
+ break;
+ }
+ }
+ else
+ _gongTimer -= diff;
+ }
+ }
+ };
+
+ CreatureAI* GetAI(Creature* creature) const
+ {
+ return new npc_harrison_jonesAI(creature);
+ }
+};
+
+class spell_banging_the_gong : public SpellScriptLoader
+{
+ public:
+ spell_banging_the_gong() : SpellScriptLoader("spell_banging_the_gong") { }
+
+ class spell_banging_the_gong_SpellScript : public SpellScript
+ {
+ PrepareSpellScript(spell_banging_the_gong_SpellScript);
+
+ void Activate(SpellEffIndex index)
+ {
+ PreventHitDefaultEffect(index);
+ GetHitGObj()->SendCustomAnim(0);
+ }
+
+ void Register()
+ {
+ OnEffectHitTarget += SpellEffectFn(spell_banging_the_gong_SpellScript::Activate, EFFECT_1, SPELL_EFFECT_ACTIVATE_OBJECT);
+ }
+ };
+
+ SpellScript* GetSpellScript() const
+ {
+ return new spell_banging_the_gong_SpellScript();
+ }
+};
+
+
void AddSC_zulaman()
{
new npc_forest_frog();
new npc_zulaman_hostage();
+ new npc_harrison_jones();
+ new spell_banging_the_gong();
}
-
diff --git a/src/server/scripts/EasternKingdoms/ZulAman/zulaman.h b/src/server/scripts/EasternKingdoms/ZulAman/zulaman.h
index 7227dfaedf4..c3386f8c996 100644
--- a/src/server/scripts/EasternKingdoms/ZulAman/zulaman.h
+++ b/src/server/scripts/EasternKingdoms/ZulAman/zulaman.h
@@ -19,15 +19,43 @@
#ifndef DEF_ZULAMAN_H
#define DEF_ZULAMAN_H
-#define DATA_NALORAKKEVENT 1
-#define DATA_AKILZONEVENT 2
-#define DATA_JANALAIEVENT 3
-#define DATA_HALAZZIEVENT 4
-#define DATA_HEXLORDEVENT 5
-#define DATA_ZULJINEVENT 6
-#define DATA_CHESTLOOTED 7
-#define TYPE_RAND_VENDOR_1 8
-#define TYPE_RAND_VENDOR_2 9
+enum DataTypes
+{
+ DATA_GONGEVENT = 0,
+ DATA_NALORAKKEVENT = 1,
+ DATA_AKILZONEVENT = 2,
+ DATA_JANALAIEVENT = 3,
+ DATA_HALAZZIEVENT = 4,
+ DATA_HEXLORDEVENT = 5,
+ DATA_ZULJINEVENT = 6,
+ DATA_CHESTLOOTED = 7,
+ TYPE_RAND_VENDOR_1 = 8,
+ TYPE_RAND_VENDOR_2 = 9
+};
-#endif
+enum CreatureIds
+{
+ NPC_HARRISON_JONES = 24358,
+ NPC_JANALAI = 23578,
+ NPC_ZULJIN = 23863,
+ NPC_HEXLORD = 24239,
+ NPC_HALAZZI = 23577,
+ NPC_NALORAKK = 23576
+};
+
+enum GameobjectIds
+{
+ GO_DOOR_HALAZZI = 186303,
+ GO_GATE_ZULJIN = 186304,
+ GO_GATE_HEXLORD = 186305,
+ GO_MASSIVE_GATE = 186728,
+ GO_DOOR_AKILZON = 186858,
+ GO_DOOR_ZULJIN = 186859,
+ GO_HARKORS_SATCHEL = 187021,
+ GO_TANZARS_TRUNK = 186648,
+ GO_ASHLIS_BAG = 186672,
+ GO_KRAZS_PACKAGE = 186667,
+ GO_STRANGE_GONG = 187359
+};
+#endif
diff --git a/src/server/scripts/EasternKingdoms/alterac_mountains.cpp b/src/server/scripts/EasternKingdoms/zone_alterac_mountains.cpp
index 9b9af494554..9b9af494554 100644
--- a/src/server/scripts/EasternKingdoms/alterac_mountains.cpp
+++ b/src/server/scripts/EasternKingdoms/zone_alterac_mountains.cpp
diff --git a/src/server/scripts/EasternKingdoms/arathi_highlands.cpp b/src/server/scripts/EasternKingdoms/zone_arathi_highlands.cpp
index d638a435936..d638a435936 100644
--- a/src/server/scripts/EasternKingdoms/arathi_highlands.cpp
+++ b/src/server/scripts/EasternKingdoms/zone_arathi_highlands.cpp
diff --git a/src/server/scripts/EasternKingdoms/blasted_lands.cpp b/src/server/scripts/EasternKingdoms/zone_blasted_lands.cpp
index 4f76edf4406..4f76edf4406 100644
--- a/src/server/scripts/EasternKingdoms/blasted_lands.cpp
+++ b/src/server/scripts/EasternKingdoms/zone_blasted_lands.cpp
diff --git a/src/server/scripts/EasternKingdoms/burning_steppes.cpp b/src/server/scripts/EasternKingdoms/zone_burning_steppes.cpp
index b6899c534e4..b6899c534e4 100644
--- a/src/server/scripts/EasternKingdoms/burning_steppes.cpp
+++ b/src/server/scripts/EasternKingdoms/zone_burning_steppes.cpp
diff --git a/src/server/scripts/EasternKingdoms/duskwood.cpp b/src/server/scripts/EasternKingdoms/zone_duskwood.cpp
index 1ce83d31a63..1ce83d31a63 100644
--- a/src/server/scripts/EasternKingdoms/duskwood.cpp
+++ b/src/server/scripts/EasternKingdoms/zone_duskwood.cpp
diff --git a/src/server/scripts/EasternKingdoms/eastern_plaguelands.cpp b/src/server/scripts/EasternKingdoms/zone_eastern_plaguelands.cpp
index a2522fd9495..a2522fd9495 100644
--- a/src/server/scripts/EasternKingdoms/eastern_plaguelands.cpp
+++ b/src/server/scripts/EasternKingdoms/zone_eastern_plaguelands.cpp
diff --git a/src/server/scripts/EasternKingdoms/eversong_woods.cpp b/src/server/scripts/EasternKingdoms/zone_eversong_woods.cpp
index 432768a51de..432768a51de 100644
--- a/src/server/scripts/EasternKingdoms/eversong_woods.cpp
+++ b/src/server/scripts/EasternKingdoms/zone_eversong_woods.cpp
diff --git a/src/server/scripts/EasternKingdoms/ghostlands.cpp b/src/server/scripts/EasternKingdoms/zone_ghostlands.cpp
index 9e00ceb2aa5..9e00ceb2aa5 100644
--- a/src/server/scripts/EasternKingdoms/ghostlands.cpp
+++ b/src/server/scripts/EasternKingdoms/zone_ghostlands.cpp
diff --git a/src/server/scripts/EasternKingdoms/hinterlands.cpp b/src/server/scripts/EasternKingdoms/zone_hinterlands.cpp
index ffd31937677..ffd31937677 100644
--- a/src/server/scripts/EasternKingdoms/hinterlands.cpp
+++ b/src/server/scripts/EasternKingdoms/zone_hinterlands.cpp
diff --git a/src/server/scripts/EasternKingdoms/ironforge.cpp b/src/server/scripts/EasternKingdoms/zone_ironforge.cpp
index f9e8d4d16c6..f9e8d4d16c6 100644
--- a/src/server/scripts/EasternKingdoms/ironforge.cpp
+++ b/src/server/scripts/EasternKingdoms/zone_ironforge.cpp
diff --git a/src/server/scripts/EasternKingdoms/isle_of_queldanas.cpp b/src/server/scripts/EasternKingdoms/zone_isle_of_queldanas.cpp
index bfd4d24cec6..bfd4d24cec6 100644
--- a/src/server/scripts/EasternKingdoms/isle_of_queldanas.cpp
+++ b/src/server/scripts/EasternKingdoms/zone_isle_of_queldanas.cpp
diff --git a/src/server/scripts/EasternKingdoms/loch_modan.cpp b/src/server/scripts/EasternKingdoms/zone_loch_modan.cpp
index 30f12718d64..30f12718d64 100644
--- a/src/server/scripts/EasternKingdoms/loch_modan.cpp
+++ b/src/server/scripts/EasternKingdoms/zone_loch_modan.cpp
diff --git a/src/server/scripts/EasternKingdoms/redridge_mountains.cpp b/src/server/scripts/EasternKingdoms/zone_redridge_mountains.cpp
index 5ff95f83f25..5ff95f83f25 100644
--- a/src/server/scripts/EasternKingdoms/redridge_mountains.cpp
+++ b/src/server/scripts/EasternKingdoms/zone_redridge_mountains.cpp
diff --git a/src/server/scripts/EasternKingdoms/silvermoon_city.cpp b/src/server/scripts/EasternKingdoms/zone_silvermoon_city.cpp
index e750faefbf5..e750faefbf5 100644
--- a/src/server/scripts/EasternKingdoms/silvermoon_city.cpp
+++ b/src/server/scripts/EasternKingdoms/zone_silvermoon_city.cpp
diff --git a/src/server/scripts/EasternKingdoms/silverpine_forest.cpp b/src/server/scripts/EasternKingdoms/zone_silverpine_forest.cpp
index 290f7fa6882..290f7fa6882 100644
--- a/src/server/scripts/EasternKingdoms/silverpine_forest.cpp
+++ b/src/server/scripts/EasternKingdoms/zone_silverpine_forest.cpp
diff --git a/src/server/scripts/EasternKingdoms/stormwind_city.cpp b/src/server/scripts/EasternKingdoms/zone_stormwind_city.cpp
index e81567a1a7a..e81567a1a7a 100644
--- a/src/server/scripts/EasternKingdoms/stormwind_city.cpp
+++ b/src/server/scripts/EasternKingdoms/zone_stormwind_city.cpp
diff --git a/src/server/scripts/EasternKingdoms/stranglethorn_vale.cpp b/src/server/scripts/EasternKingdoms/zone_stranglethorn_vale.cpp
index 6e14ef840a3..6e14ef840a3 100644
--- a/src/server/scripts/EasternKingdoms/stranglethorn_vale.cpp
+++ b/src/server/scripts/EasternKingdoms/zone_stranglethorn_vale.cpp
diff --git a/src/server/scripts/EasternKingdoms/swamp_of_sorrows.cpp b/src/server/scripts/EasternKingdoms/zone_swamp_of_sorrows.cpp
index f686de5d88f..f686de5d88f 100644
--- a/src/server/scripts/EasternKingdoms/swamp_of_sorrows.cpp
+++ b/src/server/scripts/EasternKingdoms/zone_swamp_of_sorrows.cpp
diff --git a/src/server/scripts/EasternKingdoms/tirisfal_glades.cpp b/src/server/scripts/EasternKingdoms/zone_tirisfal_glades.cpp
index f36220dec0f..f36220dec0f 100644
--- a/src/server/scripts/EasternKingdoms/tirisfal_glades.cpp
+++ b/src/server/scripts/EasternKingdoms/zone_tirisfal_glades.cpp
diff --git a/src/server/scripts/EasternKingdoms/undercity.cpp b/src/server/scripts/EasternKingdoms/zone_undercity.cpp
index 2c3017a2f1a..2c3017a2f1a 100644
--- a/src/server/scripts/EasternKingdoms/undercity.cpp
+++ b/src/server/scripts/EasternKingdoms/zone_undercity.cpp
diff --git a/src/server/scripts/EasternKingdoms/western_plaguelands.cpp b/src/server/scripts/EasternKingdoms/zone_western_plaguelands.cpp
index ee22b766154..ee22b766154 100644
--- a/src/server/scripts/EasternKingdoms/western_plaguelands.cpp
+++ b/src/server/scripts/EasternKingdoms/zone_western_plaguelands.cpp
diff --git a/src/server/scripts/EasternKingdoms/westfall.cpp b/src/server/scripts/EasternKingdoms/zone_westfall.cpp
index 1b93cf1be71..1b93cf1be71 100644
--- a/src/server/scripts/EasternKingdoms/westfall.cpp
+++ b/src/server/scripts/EasternKingdoms/zone_westfall.cpp
diff --git a/src/server/scripts/EasternKingdoms/wetlands.cpp b/src/server/scripts/EasternKingdoms/zone_wetlands.cpp
index c8a1fc2b2b4..c8a1fc2b2b4 100644
--- a/src/server/scripts/EasternKingdoms/wetlands.cpp
+++ b/src/server/scripts/EasternKingdoms/zone_wetlands.cpp
diff --git a/src/server/scripts/Kalimdor/CMakeLists.txt b/src/server/scripts/Kalimdor/CMakeLists.txt
index ee091c96309..5c44cd7ef27 100644
--- a/src/server/scripts/Kalimdor/CMakeLists.txt
+++ b/src/server/scripts/Kalimdor/CMakeLists.txt
@@ -10,9 +10,9 @@
set(scripts_STAT_SRCS
${scripts_STAT_SRCS}
- Kalimdor/stonetalon_mountains.cpp
- Kalimdor/silithus.cpp
- Kalimdor/moonglade.cpp
+ Kalimdor/zone_stonetalon_mountains.cpp
+ Kalimdor/zone_silithus.cpp
+ Kalimdor/zone_moonglade.cpp
Kalimdor/RazorfenDowns/razorfen_downs.cpp
Kalimdor/RazorfenDowns/instance_razorfen_downs.cpp
Kalimdor/RazorfenDowns/boss_amnennar_the_coldbringer.cpp
@@ -58,10 +58,10 @@ set(scripts_STAT_SRCS
Kalimdor/BlackfathomDeeps/blackfathom_deeps.cpp
Kalimdor/BlackfathomDeeps/boss_aku_mai.cpp
Kalimdor/BlackfathomDeeps/blackfathom_deeps.h
- Kalimdor/azuremyst_isle.cpp
- Kalimdor/orgrimmar.cpp
- Kalimdor/desolace.cpp
- Kalimdor/feralas.cpp
+ Kalimdor/zone_azuremyst_isle.cpp
+ Kalimdor/zone_orgrimmar.cpp
+ Kalimdor/zone_desolace.cpp
+ Kalimdor/zone_feralas.cpp
Kalimdor/Maraudon/boss_princess_theradras.cpp
Kalimdor/Maraudon/boss_landslide.cpp
Kalimdor/Maraudon/boss_celebras_the_cursed.cpp
@@ -78,7 +78,7 @@ set(scripts_STAT_SRCS
Kalimdor/TempleOfAhnQiraj/boss_skeram.cpp
Kalimdor/TempleOfAhnQiraj/boss_ouro.cpp
Kalimdor/TempleOfAhnQiraj/boss_bug_trio.cpp
- Kalimdor/darkshore.cpp
+ Kalimdor/zone_darkshore.cpp
Kalimdor/RuinsOfAhnQiraj/boss_buru.cpp
Kalimdor/RuinsOfAhnQiraj/instance_ruins_of_ahnqiraj.cpp
Kalimdor/RuinsOfAhnQiraj/boss_rajaxx.cpp
@@ -87,27 +87,27 @@ set(scripts_STAT_SRCS
Kalimdor/RuinsOfAhnQiraj/boss_moam.cpp
Kalimdor/RuinsOfAhnQiraj/ruins_of_ahnqiraj.h
Kalimdor/RuinsOfAhnQiraj/boss_kurinnaxx.cpp
- Kalimdor/mulgore.cpp
- Kalimdor/bloodmyst_isle.cpp
- Kalimdor/thunder_bluff.cpp
- Kalimdor/azshara.cpp
+ Kalimdor/zone_mulgore.cpp
+ Kalimdor/zone_bloodmyst_isle.cpp
+ Kalimdor/zone_thunder_bluff.cpp
+ Kalimdor/zone_azshara.cpp
Kalimdor/RazorfenKraul/razorfen_kraul.h
Kalimdor/RazorfenKraul/instance_razorfen_kraul.cpp
Kalimdor/RazorfenKraul/razorfen_kraul.cpp
- Kalimdor/the_barrens.cpp
- Kalimdor/ungoro_crater.cpp
+ Kalimdor/zone_the_barrens.cpp
+ Kalimdor/zone_ungoro_crater.cpp
Kalimdor/WailingCaverns/wailing_caverns.h
Kalimdor/WailingCaverns/instance_wailing_caverns.cpp
Kalimdor/WailingCaverns/wailing_caverns.cpp
- Kalimdor/durotar.cpp
- Kalimdor/felwood.cpp
+ Kalimdor/zone_durotar.cpp
+ Kalimdor/zone_felwood.cpp
Kalimdor/boss_azuregos.cpp
- Kalimdor/tanaris.cpp
- Kalimdor/dustwallow_marsh.cpp
- Kalimdor/winterspring.cpp
- Kalimdor/thousand_needles.cpp
- Kalimdor/ashenvale.cpp
- Kalimdor/teldrassil.cpp
+ Kalimdor/zone_tanaris.cpp
+ Kalimdor/zone_dustwallow_marsh.cpp
+ Kalimdor/zone_winterspring.cpp
+ Kalimdor/zone_thousand_needles.cpp
+ Kalimdor/zone_ashenvale.cpp
+ Kalimdor/zone_teldrassil.cpp
Kalimdor/OnyxiasLair/boss_onyxia.cpp
Kalimdor/OnyxiasLair/onyxias_lair.h
Kalimdor/OnyxiasLair/instance_onyxias_lair.cpp
diff --git a/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_ayamiss.cpp b/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_ayamiss.cpp
index 2ff0bc61448..e72e6dff9cf 100644
--- a/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_ayamiss.cpp
+++ b/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_ayamiss.cpp
@@ -21,20 +21,22 @@
#include "ScriptedCreature.h"
#include "ruins_of_ahnqiraj.h"
-enum eAyamiss
+enum Spells
{
SPELL_STINGERSPRAY = 25749,
- SPELL_POISONSTINGER = 25748, //only used in phase1
+ SPELL_POISONSTINGER = 25748, // Only used in phase 1
SPELL_PARALYZE = 25725,
SPELL_TRASH = 3391,
- SPELL_FRENZY = 8269,
+ SPELL_FRENZY = 8269, // Not used
SPELL_LASH = 25852,
-
- EMOTE_FRENZY = -1000002,
-
SPELL_FEED = 25721,
};
+enum Says
+{
+ EMOTE_FRENZY = 0 // Not used
+};
+
class boss_ayamiss : public CreatureScript
{
public:
diff --git a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_skeram.cpp b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_skeram.cpp
index 9573d495524..d32a19e4020 100644
--- a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_skeram.cpp
+++ b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_skeram.cpp
@@ -16,287 +16,225 @@
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-/* ScriptData
-SDName: Boss_Skeram
-SD%Complete: 75
-SDComment: Mind Control buggy.
-SDCategory: Temple of Ahn'Qiraj
-EndScriptData */
-
#include "ScriptMgr.h"
#include "ScriptedCreature.h"
#include "temple_of_ahnqiraj.h"
-#include "Group.h"
-#include "Player.h"
-enum Skeram
+enum Yells
{
SAY_AGGRO = 0,
SAY_SLAY = 1,
SAY_SPLIT = 2,
SAY_DEATH = 3,
+};
- SPELL_ARCANE_EXPLOSION = 25679,
+enum Spells
+{
+ SPELL_ARCANE_EXPLOSION = 26192,
SPELL_EARTH_SHOCK = 26194,
SPELL_TRUE_FULFILLMENT = 785,
- SPELL_BLINK = 28391
+ SPELL_INITIALIZE_IMAGE = 3730,
+ SPELL_SUMMON_IMAGES = 747
};
-class ov_mycoordinates
+enum Events
{
- public:
- float x, y, z, r;
- ov_mycoordinates(float cx, float cy, float cz, float cr)
- {
- x = cx; y = cy; z = cz; r = cr;
- }
+ EVENT_ARCANE_EXPLOSION = 0,
+ EVENT_FULLFILMENT = 1,
+ EVENT_BLINK = 2,
+ EVENT_EARTH_SHOCK = 3
};
+uint32 const BlinkSpells[3] = { 4801, 8195, 20449 };
+
class boss_skeram : public CreatureScript
{
-public:
- boss_skeram() : CreatureScript("boss_skeram") { }
-
- CreatureAI* GetAI(Creature* creature) const
- {
- return new boss_skeramAI (creature);
- }
-
- struct boss_skeramAI : public ScriptedAI
- {
- boss_skeramAI(Creature* creature) : ScriptedAI(creature)
- {
- IsImage = false;
- }
-
- uint32 ArcaneExplosion_Timer;
- uint32 EarthShock_Timer;
- uint32 FullFillment_Timer;
- uint32 Blink_Timer;
- uint32 Invisible_Timer;
-
- bool Images75;
- bool Images50;
- bool Images25;
- bool IsImage;
- bool Invisible;
-
- void Reset()
- {
- ArcaneExplosion_Timer = urand(6000, 12000);
- EarthShock_Timer = 2000;
- FullFillment_Timer = 15000;
- Blink_Timer = urand(8000, 20000);
- Invisible_Timer = 500;
-
- Images75 = false;
- Images50 = false;
- Images25 = false;
- Invisible = false;
-
- me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
- me->SetVisible(true);
-
- if (IsImage)
- me->setDeathState(JUST_DIED);
- }
-
- void KilledUnit(Unit* /*victim*/)
- {
- Talk(SAY_SLAY);
- }
-
- void JustDied(Unit* /*killer*/)
- {
- if (!IsImage)
- Talk(SAY_DEATH);
- }
-
- void EnterCombat(Unit* /*who*/)
- {
- if (IsImage || Images75)
- return;
- Talk(SAY_AGGRO);
- }
+ public:
+ boss_skeram() : CreatureScript("boss_skeram") { }
- void UpdateAI(const uint32 diff)
+ struct boss_skeramAI : public BossAI
{
- //Return since we have no target
- if (!UpdateVictim())
- return;
+ boss_skeramAI(Creature* creature) : BossAI(creature, DATA_SKERAM) { }
- //ArcaneExplosion_Timer
- if (ArcaneExplosion_Timer <= diff)
+ void Reset()
{
- DoCast(me->getVictim(), SPELL_ARCANE_EXPLOSION);
- ArcaneExplosion_Timer = urand(8000, 18000);
- } else ArcaneExplosion_Timer -= diff;
+ _flag = 0;
+ _hpct = 75.0f;
+ me->SetVisible(true);
+ }
- //If we are within range melee the target
- if (me->IsWithinMeleeRange(me->getVictim()))
+ void KilledUnit(Unit* /*victim*/)
{
- //Make sure our attack is ready and we arn't currently casting
- if (me->isAttackReady() && !me->IsNonMeleeSpellCasted(false))
- {
- me->AttackerStateUpdate(me->getVictim());
- me->resetAttackTimer();
- }
- }else
+ Talk(SAY_SLAY);
+ }
+
+ void EnterEvadeMode()
{
- //EarthShock_Timer
- if (EarthShock_Timer <= diff)
- {
- DoCast(me->getVictim(), SPELL_EARTH_SHOCK);
- EarthShock_Timer = 1000;
- } else EarthShock_Timer -= diff;
+ ScriptedAI::EnterEvadeMode();
+ if (me->isSummon())
+ ((TempSummon*)me)->UnSummon();
}
- //Blink_Timer
- if (Blink_Timer <= diff)
+ void JustSummoned(Creature* creature)
{
- //DoCast(me, SPELL_BLINK);
- switch (urand(0, 2))
+ // Shift the boss and images (Get it? *Shift*?)
+ uint8 Rand;
+ if (_flag != 0)
{
- case 0:
- me->SetPosition(-8340.782227f, 2083.814453f, 125.648788f, 0.0f);
- DoResetThreat();
- break;
- case 1:
- me->SetPosition(-8341.546875f, 2118.504639f, 133.058151f, 0.0f);
- DoResetThreat();
- break;
- case 2:
- me->SetPosition(-8318.822266f, 2058.231201f, 133.058151f, 0.0f);
- DoResetThreat();
- break;
+ while (_flag & (1 << Rand))
+ Rand = urand(0, 2);
+ DoCast(me, BlinkSpells[Rand]);
+ _flag |= (1 << Rand);
+ _flag |= (1 << 7);
}
- DoStopAttack();
-
- Blink_Timer= urand(20000, 40000);
- } else Blink_Timer -= diff;
- int procent = (int) (me->GetHealthPct() + 0.5f);
-
- //Summoning 2 Images and teleporting to a random position on 75% health
- if ((!Images75 && !IsImage) && (procent <= 75 && procent > 70))
- DoSplit(75);
-
- //Summoning 2 Images and teleporting to a random position on 50% health
- if ((!Images50 && !IsImage) && (procent <= 50 && procent > 45))
- DoSplit(50);
-
- //Summoning 2 Images and teleporting to a random position on 25% health
- if ((!Images25 && !IsImage) && (procent <= 25 && procent > 20))
- DoSplit(25);
+ while (_flag & (1 << Rand))
+ Rand = urand(0, 2);
+ creature->CastSpell(creature, BlinkSpells[Rand]);
+ _flag |= (1 << Rand);
+
+ if (_flag & (1 << 7))
+ _flag = 0;
+
+ if (Unit* Target = SelectTarget(SELECT_TARGET_RANDOM))
+ creature->AI()->AttackStart(Target);
+
+ float ImageHealthPct;
+
+ if (me->GetHealthPct() < 25.0f)
+ ImageHealthPct = 0.50f;
+ else if (me->GetHealthPct() < 50.0f)
+ ImageHealthPct = 0.20f;
+ else
+ ImageHealthPct = 0.10f;
+
+ creature->SetMaxHealth(me->GetMaxHealth() * ImageHealthPct);
+ creature->SetHealth(creature->GetMaxHealth() * (me->GetHealthPct() / 100.0f));
+ }
- //Invisible_Timer
- if (Invisible)
+ void JustDied(Unit* /*killer*/)
{
- if (Invisible_Timer <= diff)
- {
- //Making Skeram visible after telporting
- me->SetVisible(true);
- me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
-
- Invisible_Timer = 2500;
- Invisible = false;
- } else Invisible_Timer -= diff;
+ if (!me->isSummon())
+ Talk(SAY_DEATH);
+ else
+ me->RemoveCorpse();
}
- DoMeleeAttackIfReady();
- }
-
- void DoSplit(int atPercent /* 75 50 25 */)
- {
- Talk(SAY_SPLIT);
-
- ov_mycoordinates *place1 = new ov_mycoordinates(-8340.782227f, 2083.814453f, 125.648788f, 0);
- ov_mycoordinates *place2 = new ov_mycoordinates(-8341.546875f, 2118.504639f, 133.058151f, 0);
- ov_mycoordinates *place3 = new ov_mycoordinates(-8318.822266f, 2058.231201f, 133.058151f, 0);
+ void EnterCombat(Unit* /*who*/)
+ {
+ _EnterCombat();
+ events.Reset();
- ov_mycoordinates *bossc=place1, *i1=place2, *i2=place3;
+ events.ScheduleEvent(EVENT_ARCANE_EXPLOSION, urand(6000, 12000));
+ events.ScheduleEvent(EVENT_FULLFILMENT, 15000);
+ events.ScheduleEvent(EVENT_BLINK, urand(30000, 45000));
+ events.ScheduleEvent(EVENT_EARTH_SHOCK, 2000);
- switch (urand(0, 2))
- {
- case 0:
- bossc=place1;
- i1=place2;
- i2=place3;
- break;
- case 1:
- bossc=place2;
- i1=place1;
- i2=place3;
- break;
- case 2:
- bossc=place3;
- i1=place1;
- i2=place2;
- break;
+ Talk(SAY_AGGRO);
}
- for (uint16 i = 0; i < 41; ++i)
+ void UpdateAI(uint32 const diff)
{
- if (Player* target = CAST_PLR(SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true)))
+ if (!UpdateVictim())
+ return;
+
+ events.Update(diff);
+
+ while (uint32 eventId = events.ExecuteEvent())
{
- if (Group* pGrp = target->GetGroup())
- for (uint8 ico = 0; ico < TARGETICONCOUNT; ++ico)
- {
- //if (grp->m_targetIcons[ico] == me->GetGUID()) -- private member :(
- pGrp->SetTargetIcon(ico, 0, 0);
- }
+ switch (eventId)
+ {
+ case EVENT_ARCANE_EXPLOSION:
+ DoCastAOE(SPELL_ARCANE_EXPLOSION, true);
+ events.ScheduleEvent(EVENT_ARCANE_EXPLOSION, urand(8000, 18000));
+ break;
+ case EVENT_FULLFILMENT:
+ // TODO: For some weird reason boss does not cast this
+ // Spell actually works, tested in duel
+ DoCast(SelectTarget(SELECT_TARGET_RANDOM, 0, 0.0f, true), SPELL_TRUE_FULFILLMENT, true);
+ events.ScheduleEvent(EVENT_FULLFILMENT, urand(20000, 30000));
+ break;
+ case EVENT_BLINK:
+ DoCast(me, BlinkSpells[urand(0, 2)]);
+ DoResetThreat();
+ me->SetVisible(true);
+ events.ScheduleEvent(EVENT_BLINK, urand(10000, 30000));
+ break;
+ case EVENT_EARTH_SHOCK:
+ DoCastVictim(SPELL_EARTH_SHOCK);
+ events.ScheduleEvent(EVENT_EARTH_SHOCK, 2000);
+ break;
+ }
+ }
- break;
+ if (!me->isSummon() && me->GetHealthPct() < _hpct)
+ {
+ DoCast(me, SPELL_SUMMON_IMAGES);
+ Talk(SAY_SPLIT);
+ _hpct -= 25.0f;
+ me->SetVisible(false);
+ events.RescheduleEvent(EVENT_BLINK, 2000);
+ }
+
+ if (me->IsWithinMeleeRange(me->getVictim()))
+ {
+ events.RescheduleEvent(EVENT_EARTH_SHOCK, 2000);
+ DoMeleeAttackIfReady();
}
}
+
+ private:
+ float _hpct;
+ uint8 _flag;
+ };
+
+ CreatureAI* GetAI(Creature* creature) const
+ {
+ return new boss_skeramAI(creature);
+ }
+};
- me->RemoveAllAuras();
- me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
- me->SetVisible(false);
- me->SetPosition(bossc->x, bossc->y, bossc->z, bossc->r);
- Invisible = true;
- DoResetThreat();
- DoStopAttack();
+class PlayerOrPetCheck
+{
+ public:
+ bool operator()(WorldObject* object) const
+ {
+ if (object->GetTypeId() != TYPEID_PLAYER)
+ if (!object->ToCreature()->isPet())
+ return true;
- switch (atPercent)
- {
- case 75: Images75 = true; break;
- case 50: Images50 = true; break;
- case 25: Images25 = true; break;
- }
+ return false;
+ }
+};
- Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0);
+class spell_skeram_arcane_explosion : public SpellScriptLoader
+{
+ public:
+ spell_skeram_arcane_explosion() : SpellScriptLoader("spell_skeram_arcane_explosion") { }
+
+ class spell_skeram_arcane_explosion_SpellScript : public SpellScript
+ {
+ PrepareSpellScript(spell_skeram_arcane_explosion_SpellScript);
- Creature* Image1 = me->SummonCreature(15263, i1->x, i1->y, i1->z, i1->r, TEMPSUMMON_CORPSE_DESPAWN, 30000);
- if (Image1)
+ void FilterTargets(std::list<WorldObject*>& targets)
{
- Image1->SetMaxHealth(me->GetMaxHealth() / 5);
- Image1->SetHealth(me->GetHealth() / 5);
- if (target)
- Image1->AI()->AttackStart(target);
- CAST_AI(boss_skeram::boss_skeramAI, Image1->AI())->IsImage = true;
+ targets.remove_if(PlayerOrPetCheck());
}
- Creature* Image2 = me->SummonCreature(15263, i2->x, i2->y, i2->z, i2->r, TEMPSUMMON_CORPSE_DESPAWN, 30000);
- if (Image2)
+ void Register()
{
- Image2->SetMaxHealth(me->GetMaxHealth() / 5);
- Image2->SetHealth(me->GetHealth() / 5);
- if (target)
- Image2->AI()->AttackStart(target);
- CAST_AI(boss_skeram::boss_skeramAI, Image2->AI())->IsImage = true;
+ OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_skeram_arcane_explosion_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY);
}
- Invisible = true;
- delete place1;
- delete place2;
- delete place3;
- }
-
- };
+ };
+ SpellScript* GetSpellScript() const
+ {
+ return new spell_skeram_arcane_explosion_SpellScript();
+ }
};
void AddSC_boss_skeram()
{
new boss_skeram();
+ new spell_skeram_arcane_explosion();
}
diff --git a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_viscidus.cpp b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_viscidus.cpp
index 5649253fa4e..fcbe3a84d62 100644
--- a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_viscidus.cpp
+++ b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_viscidus.cpp
@@ -279,7 +279,7 @@ class npc_glob_of_viscidus : public CreatureScript
else
{
Viscidus->SetHealth(Viscidus->GetHealth() - Viscidus->GetMaxHealth() / 20);
- Viscidus->GetAI()->DoCast(Viscidus, SPELL_VISCIDUS_SHRINKS);
+ Viscidus->CastSpell(Viscidus, SPELL_VISCIDUS_SHRINKS);
}
}
}
diff --git a/src/server/scripts/Kalimdor/ashenvale.cpp b/src/server/scripts/Kalimdor/zone_ashenvale.cpp
index 94c68a1d3ec..94c68a1d3ec 100644
--- a/src/server/scripts/Kalimdor/ashenvale.cpp
+++ b/src/server/scripts/Kalimdor/zone_ashenvale.cpp
diff --git a/src/server/scripts/Kalimdor/azshara.cpp b/src/server/scripts/Kalimdor/zone_azshara.cpp
index 44f7e1e8172..44f7e1e8172 100644
--- a/src/server/scripts/Kalimdor/azshara.cpp
+++ b/src/server/scripts/Kalimdor/zone_azshara.cpp
diff --git a/src/server/scripts/Kalimdor/azuremyst_isle.cpp b/src/server/scripts/Kalimdor/zone_azuremyst_isle.cpp
index 4b03cd65cad..4b03cd65cad 100644
--- a/src/server/scripts/Kalimdor/azuremyst_isle.cpp
+++ b/src/server/scripts/Kalimdor/zone_azuremyst_isle.cpp
diff --git a/src/server/scripts/Kalimdor/bloodmyst_isle.cpp b/src/server/scripts/Kalimdor/zone_bloodmyst_isle.cpp
index 102a9494a65..102a9494a65 100644
--- a/src/server/scripts/Kalimdor/bloodmyst_isle.cpp
+++ b/src/server/scripts/Kalimdor/zone_bloodmyst_isle.cpp
diff --git a/src/server/scripts/Kalimdor/darkshore.cpp b/src/server/scripts/Kalimdor/zone_darkshore.cpp
index 09f061148d3..09f061148d3 100644
--- a/src/server/scripts/Kalimdor/darkshore.cpp
+++ b/src/server/scripts/Kalimdor/zone_darkshore.cpp
diff --git a/src/server/scripts/Kalimdor/desolace.cpp b/src/server/scripts/Kalimdor/zone_desolace.cpp
index 8f55bb6102c..8f55bb6102c 100644
--- a/src/server/scripts/Kalimdor/desolace.cpp
+++ b/src/server/scripts/Kalimdor/zone_desolace.cpp
diff --git a/src/server/scripts/Kalimdor/durotar.cpp b/src/server/scripts/Kalimdor/zone_durotar.cpp
index fa6b830c1ae..fa6b830c1ae 100644
--- a/src/server/scripts/Kalimdor/durotar.cpp
+++ b/src/server/scripts/Kalimdor/zone_durotar.cpp
diff --git a/src/server/scripts/Kalimdor/dustwallow_marsh.cpp b/src/server/scripts/Kalimdor/zone_dustwallow_marsh.cpp
index 37941227c78..37941227c78 100644
--- a/src/server/scripts/Kalimdor/dustwallow_marsh.cpp
+++ b/src/server/scripts/Kalimdor/zone_dustwallow_marsh.cpp
diff --git a/src/server/scripts/Kalimdor/felwood.cpp b/src/server/scripts/Kalimdor/zone_felwood.cpp
index e23eaa961bb..e23eaa961bb 100644
--- a/src/server/scripts/Kalimdor/felwood.cpp
+++ b/src/server/scripts/Kalimdor/zone_felwood.cpp
diff --git a/src/server/scripts/Kalimdor/feralas.cpp b/src/server/scripts/Kalimdor/zone_feralas.cpp
index b2326de86ab..b2326de86ab 100644
--- a/src/server/scripts/Kalimdor/feralas.cpp
+++ b/src/server/scripts/Kalimdor/zone_feralas.cpp
diff --git a/src/server/scripts/Kalimdor/moonglade.cpp b/src/server/scripts/Kalimdor/zone_moonglade.cpp
index e41ffae03e6..e41ffae03e6 100644
--- a/src/server/scripts/Kalimdor/moonglade.cpp
+++ b/src/server/scripts/Kalimdor/zone_moonglade.cpp
diff --git a/src/server/scripts/Kalimdor/mulgore.cpp b/src/server/scripts/Kalimdor/zone_mulgore.cpp
index aca55284b67..aca55284b67 100644
--- a/src/server/scripts/Kalimdor/mulgore.cpp
+++ b/src/server/scripts/Kalimdor/zone_mulgore.cpp
diff --git a/src/server/scripts/Kalimdor/orgrimmar.cpp b/src/server/scripts/Kalimdor/zone_orgrimmar.cpp
index 42ef9843a4e..42ef9843a4e 100644
--- a/src/server/scripts/Kalimdor/orgrimmar.cpp
+++ b/src/server/scripts/Kalimdor/zone_orgrimmar.cpp
diff --git a/src/server/scripts/Kalimdor/silithus.cpp b/src/server/scripts/Kalimdor/zone_silithus.cpp
index 58665224bdd..58665224bdd 100644
--- a/src/server/scripts/Kalimdor/silithus.cpp
+++ b/src/server/scripts/Kalimdor/zone_silithus.cpp
diff --git a/src/server/scripts/Kalimdor/stonetalon_mountains.cpp b/src/server/scripts/Kalimdor/zone_stonetalon_mountains.cpp
index 26c92c7404c..26c92c7404c 100644
--- a/src/server/scripts/Kalimdor/stonetalon_mountains.cpp
+++ b/src/server/scripts/Kalimdor/zone_stonetalon_mountains.cpp
diff --git a/src/server/scripts/Kalimdor/tanaris.cpp b/src/server/scripts/Kalimdor/zone_tanaris.cpp
index 0648e40416d..0648e40416d 100644
--- a/src/server/scripts/Kalimdor/tanaris.cpp
+++ b/src/server/scripts/Kalimdor/zone_tanaris.cpp
diff --git a/src/server/scripts/Kalimdor/teldrassil.cpp b/src/server/scripts/Kalimdor/zone_teldrassil.cpp
index d7983c2cbe6..d7983c2cbe6 100644
--- a/src/server/scripts/Kalimdor/teldrassil.cpp
+++ b/src/server/scripts/Kalimdor/zone_teldrassil.cpp
diff --git a/src/server/scripts/Kalimdor/the_barrens.cpp b/src/server/scripts/Kalimdor/zone_the_barrens.cpp
index 8f7ab09260b..8f7ab09260b 100644
--- a/src/server/scripts/Kalimdor/the_barrens.cpp
+++ b/src/server/scripts/Kalimdor/zone_the_barrens.cpp
diff --git a/src/server/scripts/Kalimdor/thousand_needles.cpp b/src/server/scripts/Kalimdor/zone_thousand_needles.cpp
index 9c47991a5d5..9c47991a5d5 100644
--- a/src/server/scripts/Kalimdor/thousand_needles.cpp
+++ b/src/server/scripts/Kalimdor/zone_thousand_needles.cpp
diff --git a/src/server/scripts/Kalimdor/thunder_bluff.cpp b/src/server/scripts/Kalimdor/zone_thunder_bluff.cpp
index 0d915dc7c44..0d915dc7c44 100644
--- a/src/server/scripts/Kalimdor/thunder_bluff.cpp
+++ b/src/server/scripts/Kalimdor/zone_thunder_bluff.cpp
diff --git a/src/server/scripts/Kalimdor/ungoro_crater.cpp b/src/server/scripts/Kalimdor/zone_ungoro_crater.cpp
index e72c82bee97..e72c82bee97 100644
--- a/src/server/scripts/Kalimdor/ungoro_crater.cpp
+++ b/src/server/scripts/Kalimdor/zone_ungoro_crater.cpp
diff --git a/src/server/scripts/Kalimdor/winterspring.cpp b/src/server/scripts/Kalimdor/zone_winterspring.cpp
index 06f01033a25..06f01033a25 100644
--- a/src/server/scripts/Kalimdor/winterspring.cpp
+++ b/src/server/scripts/Kalimdor/zone_winterspring.cpp
diff --git a/src/server/scripts/Northrend/CMakeLists.txt b/src/server/scripts/Northrend/CMakeLists.txt
index 233d49192e6..1da1e4ab178 100644
--- a/src/server/scripts/Northrend/CMakeLists.txt
+++ b/src/server/scripts/Northrend/CMakeLists.txt
@@ -10,9 +10,9 @@
set(scripts_STAT_SRCS
${scripts_STAT_SRCS}
- Northrend/wintergrasp.cpp
+ Northrend/zone_wintergrasp.cpp
Northrend/isle_of_conquest.cpp
- Northrend/storm_peaks.cpp
+ Northrend/zone_storm_peaks.cpp
Northrend/Ulduar/HallsOfLightning/instance_halls_of_lightning.cpp
Northrend/Ulduar/HallsOfLightning/boss_bjarngrim.cpp
Northrend/Ulduar/HallsOfLightning/halls_of_lightning.h
@@ -78,8 +78,8 @@ set(scripts_STAT_SRCS
Northrend/Nexus/Oculus/boss_urom.cpp
Northrend/Nexus/Oculus/oculus.cpp
Northrend/Nexus/Oculus/instance_oculus.cpp
- Northrend/Nexus/Nexus/commander_kolurg.cpp
- Northrend/Nexus/Nexus/commander_stoutbeard.cpp
+ Northrend/Nexus/Nexus/boss_commander_kolurg.cpp
+ Northrend/Nexus/Nexus/boss_commander_stoutbeard.cpp
Northrend/Nexus/Nexus/boss_ormorok.cpp
Northrend/Nexus/Nexus/boss_magus_telestra.cpp
Northrend/Nexus/Nexus/instance_nexus.cpp
@@ -117,14 +117,14 @@ set(scripts_STAT_SRCS
Northrend/Naxxramas/instance_naxxramas.cpp
Northrend/Naxxramas/boss_grobbulus.cpp
Northrend/Naxxramas/boss_noth.cpp
- Northrend/crystalsong_forest.cpp
+ Northrend/zone_crystalsong_forest.cpp
Northrend/VaultOfArchavon/boss_archavon.cpp
Northrend/VaultOfArchavon/boss_koralon.cpp
Northrend/VaultOfArchavon/vault_of_archavon.h
Northrend/VaultOfArchavon/instance_vault_of_archavon.cpp
Northrend/VaultOfArchavon/boss_emalon.cpp
Northrend/VaultOfArchavon/boss_toravon.cpp
- Northrend/sholazar_basin.cpp
+ Northrend/zone_sholazar_basin.cpp
Northrend/UtgardeKeep/UtgardePinnacle/boss_palehoof.cpp
Northrend/UtgardeKeep/UtgardePinnacle/boss_svala.cpp
Northrend/UtgardeKeep/UtgardePinnacle/instance_pinnacle.cpp
@@ -137,8 +137,8 @@ set(scripts_STAT_SRCS
Northrend/UtgardeKeep/UtgardeKeep/instance_utgarde_keep.cpp
Northrend/UtgardeKeep/UtgardeKeep/boss_keleseth.cpp
Northrend/UtgardeKeep/UtgardeKeep/utgarde_keep.cpp
- Northrend/dragonblight.cpp
- Northrend/grizzly_hills.cpp
+ Northrend/zone_dragonblight.cpp
+ Northrend/zone_grizzly_hills.cpp
Northrend/AzjolNerub/AzjolNerub/azjol_nerub.h
Northrend/AzjolNerub/AzjolNerub/instance_azjol_nerub.cpp
Northrend/AzjolNerub/AzjolNerub/boss_krikthir_the_gatewatcher.cpp
@@ -176,8 +176,8 @@ set(scripts_STAT_SRCS
Northrend/IcecrownCitadel/boss_valithria_dreamwalker.cpp
Northrend/IcecrownCitadel/boss_sindragosa.cpp
Northrend/IcecrownCitadel/boss_the_lich_king.cpp
- Northrend/zuldrak.cpp
- Northrend/icecrown.cpp
+ Northrend/zone_zuldrak.cpp
+ Northrend/zone_icecrown.cpp
Northrend/Gundrak/boss_slad_ran.cpp
Northrend/Gundrak/instance_gundrak.cpp
Northrend/Gundrak/boss_drakkari_colossus.cpp
@@ -185,9 +185,9 @@ set(scripts_STAT_SRCS
Northrend/Gundrak/boss_gal_darah.cpp
Northrend/Gundrak/boss_moorabi.cpp
Northrend/Gundrak/boss_eck.cpp
- Northrend/borean_tundra.cpp
- Northrend/howling_fjord.cpp
- Northrend/dalaran.cpp
+ Northrend/zone_borean_tundra.cpp
+ Northrend/zone_howling_fjord.cpp
+ Northrend/zone_dalaran.cpp
Northrend/DraktharonKeep/boss_trollgore.cpp
Northrend/DraktharonKeep/instance_drak_tharon_keep.cpp
Northrend/DraktharonKeep/boss_novos.cpp
diff --git a/src/server/scripts/Northrend/DraktharonKeep/boss_novos.cpp b/src/server/scripts/Northrend/DraktharonKeep/boss_novos.cpp
index 6d33efb4515..e99128fbbf9 100644
--- a/src/server/scripts/Northrend/DraktharonKeep/boss_novos.cpp
+++ b/src/server/scripts/Northrend/DraktharonKeep/boss_novos.cpp
@@ -16,229 +16,245 @@
*/
#include "ScriptMgr.h"
+#include "SpellScript.h"
#include "ScriptedCreature.h"
#include "drak_tharon_keep.h"
-enum Spells
+enum Misc
{
- SPELL_ARCANE_BLAST = 49198,
- H_SPELL_ARCANE_BLAST = 59909,
- SPELL_ARCANE_FIELD = 47346,
- SPELL_BLIZZARD = 49034,
- H_SPELL_BLIZZARD = 59854,
- SPELL_FROSTBOLT = 49037,
- H_SPELL_FROSTBOLT = 59855,
- SPELL_WRATH_OF_MISERY = 50089,
- H_SPELL_WRATH_OF_MISERY = 59856,
- SPELL_SUMMON_MINIONS = 59910 //Summons an army of Fetid Troll Corpses to assist the caster.
+ ACTION_RESET_CRYSTALS,
+ ACTION_ACTIVATE_CRYSTAL,
+ ACTION_DEACTIVATE,
+ EVENT_ATTACK,
+ EVENT_SUMMON_MINIONS,
+ DATA_NOVOS_ACHIEV
};
-//not in db
-enum Yells
+enum Creatures
{
- SAY_AGGRO = 0,
- SAY_KILL = 1,
- SAY_DEATH = 2,
- SAY_NECRO_ADD = 3,
- SAY_REUBBLE = 4
+ NPC_CRYSTAL_CHANNEL_TARGET = 26712,
+ NPC_FETID_TROLL_CORPSE = 27597,
+ NPC_RISEN_SHADOWCASTER = 27600,
+ NPC_HULKING_CORPSE = 27597
};
-enum Creatures
+enum Spells
{
- CREATURE_RISEN_SHADOWCASTER = 27600,
- CREATURE_FETID_TROLL_CORPSE = 27598,
- CREATURE_HULKING_CORPSE = 27597,
- CREATURE_CRYSTAL_HANDLER = 26627
+ SPELL_BEAM_CHANNEL = 52106,
+ SPELL_ARCANE_FIELD = 47346,
+
+ SPELL_SUMMON_RISEN_SHADOWCASTER = 49105,
+ SPELL_SUMMON_FETID_TROLL_CORPSE = 49103,
+ SPELL_SUMMON_HULKING_CORPSE = 49104,
+ SPELL_SUMMON_CRYSTAL_HANDLER = 49179,
+
+ SPELL_ARCANE_BLAST = 49198,
+ SPELL_BLIZZARD = 49034,
+ SPELL_FROSTBOLT = 49037,
+ SPELL_WRATH_OF_MISERY = 50089,
+ SPELL_SUMMON_MINIONS = 59910
};
-enum CombatPhase
+struct SummonerInfo
{
- IDLE,
- PHASE_1,
- PHASE_2
+ uint32 data, spell, timer;
};
-#define ACTION_MINION_REACHED 1
-#define DATA_OH_NOVOS 2
+const SummonerInfo summoners[] =
+{
+ { DATA_NOVOS_SUMMONER_1, SPELL_SUMMON_RISEN_SHADOWCASTER, 15000 },
+ { DATA_NOVOS_SUMMONER_2, SPELL_SUMMON_FETID_TROLL_CORPSE, 5000 },
+ { DATA_NOVOS_SUMMONER_3, SPELL_SUMMON_HULKING_CORPSE, 30000 },
+ { DATA_NOVOS_SUMMONER_4, SPELL_SUMMON_CRYSTAL_HANDLER, 30000 }
+};
-static Position AddSpawnPoint = { -379.20f, -816.76f, 59.70f, 0.0f };
-static Position CrystalHandlerSpawnPoint = { -326.626343f, -709.956604f, 27.813314f, 0.0f };
-static Position AddDestinyPoint = { -379.314545f, -772.577637f, 28.58837f, 0.0f };
+#define MAX_Y_COORD_OH_NOVOS -771.95f
class boss_novos : public CreatureScript
{
public:
boss_novos() : CreatureScript("boss_novos") { }
- struct boss_novosAI : public Scripted_NoMovementAI
+ struct boss_novosAI : public BossAI
{
- boss_novosAI(Creature* creature) : Scripted_NoMovementAI(creature), lSummons(me)
+ boss_novosAI(Creature* creature) : BossAI(creature, DATA_NOVOS_EVENT) {}
+
+ void Reset()
{
- instance = creature->GetInstanceScript();
+ events.Reset();
+ summons.DespawnAll();
+ instance->SetData(DATA_NOVOS_EVENT, NOT_STARTED);
+
+ _ohNovos = true;
+ _crystalHandlerCount = 0;
+ SetCrystalsStatus(false);
+ SetSummonerStatus(false);
+ SetBubbled(false);
}
- uint32 uiTimer;
- uint32 uiCrystalHandlerTimer;
- uint8 crystalHandlerAmount;
+ void EnterCombat(Unit* /* victim */)
+ {
+ me->setActive(true);
+ DoZoneInCombat();
+ instance->SetData(DATA_NOVOS_EVENT, IN_PROGRESS);
- bool ohNovos;
+ SetCrystalsStatus(true);
+ SetSummonerStatus(true);
+ SetBubbled(true);
+ }
- SummonList lSummons;
+ void AttackStart(Unit* target)
+ {
+ if (!target)
+ return;
- std::list<uint64> luiCrystals;
+ if (me->Attack(target, true))
+ DoStartNoMovement(target);
+ }
- CombatPhase Phase;
+ void UpdateAI(const uint32 diff)
+ {
+ if (!UpdateVictim() || _bubbled)
+ return;
- InstanceScript* instance;
+ events.Update(diff);
- void Reset()
- {
- Phase = IDLE;
- luiCrystals.clear();
- ohNovos = true;
- me->CastStop();
- lSummons.DespawnAll();
- crystalHandlerAmount = 0;
-
- if (me->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC))
- me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC);
- if (me->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE))
- me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
- if (me->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE))
- me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
-
- if (instance)
- {
- instance->SetData(DATA_NOVOS_EVENT, NOT_STARTED);
- for (uint8 n = 0; n < 4; ++n)
- luiCrystals.push_back(instance->GetData64(DATA_NOVOS_CRYSTAL_1 + n));
- for (std::list<uint64>::const_iterator itr = luiCrystals.begin(); itr != luiCrystals.end(); ++itr)
- {
- if (GameObject* temp = instance->instance->GetGameObject(*itr))
- temp->SetGoState(GO_STATE_READY);
- }
- }
- }
+ if (me->HasUnitState(UNIT_STATE_CASTING))
+ return;
- void EnterCombat(Unit* /*who*/)
- {
- Talk(SAY_AGGRO);
- Phase = PHASE_1;
- uiCrystalHandlerTimer = 30*IN_MILLISECONDS;
- uiTimer = 1*IN_MILLISECONDS;
- DoCast(SPELL_ARCANE_FIELD);
- if (instance)
+ if (uint32 eventId = events.ExecuteEvent())
{
- for (std::list<uint64>::const_iterator itr = luiCrystals.begin(); itr != luiCrystals.end(); ++itr)
+ switch (eventId)
{
- if (GameObject* temp = instance->instance->GetGameObject(*itr))
- temp->SetGoState(GO_STATE_ACTIVE);
+ case EVENT_SUMMON_MINIONS:
+ DoCast(SPELL_SUMMON_MINIONS);
+ events.ScheduleEvent(EVENT_SUMMON_MINIONS, 15000);
+ break;
+ case EVENT_ATTACK:
+ if (Unit* victim = SelectTarget(SELECT_TARGET_RANDOM))
+ DoCast(victim, RAND(SPELL_ARCANE_BLAST, SPELL_BLIZZARD, SPELL_FROSTBOLT, SPELL_WRATH_OF_MISERY));
+ events.ScheduleEvent(EVENT_ATTACK, 3000);
+ break;
+ default:
+ break;
}
- instance->SetData(DATA_NOVOS_EVENT, IN_PROGRESS);
}
- me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC);
- me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
- me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
}
- void UpdateAI(const uint32 diff)
+ void DoAction(int32 const action)
{
- switch (Phase)
- {
- case PHASE_1:
- if (uiTimer <= diff)
- {
- Creature* summon = me->SummonCreature(RAND(CREATURE_FETID_TROLL_CORPSE, CREATURE_HULKING_CORPSE, CREATURE_RISEN_SHADOWCASTER), AddSpawnPoint, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 20*IN_MILLISECONDS);
- summon->GetMotionMaster()->MovePoint(0, AddDestinyPoint);
- //If spell is casted stops casting arcane field so no spell casting
- //DoCast(me, SPELL_SUMMON_MINIONS);
- uiTimer = 3*IN_MILLISECONDS;
- } else uiTimer -= diff;
- if (crystalHandlerAmount < 4)
- {
- if (uiCrystalHandlerTimer <= diff)
- {
- Talk(SAY_NECRO_ADD);
- Creature* pCrystalHandler = me->SummonCreature(CREATURE_CRYSTAL_HANDLER, CrystalHandlerSpawnPoint, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 20*IN_MILLISECONDS);
- pCrystalHandler->GetMotionMaster()->MovePoint(0, AddDestinyPoint);
- uiCrystalHandlerTimer = urand(20*IN_MILLISECONDS, 30*IN_MILLISECONDS);
- } else uiCrystalHandlerTimer -= diff;
- }
- break;
- case PHASE_2:
- if (uiTimer <= diff)
- {
- if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true))
- DoCast(target, DUNGEON_MODE(RAND(SPELL_ARCANE_BLAST, SPELL_BLIZZARD, SPELL_FROSTBOLT, SPELL_WRATH_OF_MISERY),
- RAND(H_SPELL_ARCANE_BLAST, H_SPELL_BLIZZARD, H_SPELL_FROSTBOLT, H_SPELL_WRATH_OF_MISERY)));
- uiTimer = urand(1*IN_MILLISECONDS, 3*IN_MILLISECONDS);
- } else uiTimer -= diff;
- break;
- default:
- break;
- }
+ if (action == ACTION_CRYSTAL_HANDLER_DIED)
+ CrystalHandlerDied();
}
- void JustDied(Unit* /*killer*/)
+
+ void MoveInLineOfSight(Unit* who)
{
- Talk(SAY_DEATH);
- if (instance)
- instance->SetData(DATA_NOVOS_EVENT, DONE);
- lSummons.DespawnAll();
+ BossAI::MoveInLineOfSight(who);
+
+ if (!_ohNovos || !who || who->GetTypeId() != TYPEID_UNIT || who->GetPositionY() > MAX_Y_COORD_OH_NOVOS)
+ return;
+
+ uint32 entry = who->GetEntry();
+ if (entry == NPC_HULKING_CORPSE || entry == NPC_RISEN_SHADOWCASTER || entry == NPC_FETID_TROLL_CORPSE)
+ _ohNovos = false;
}
- void KilledUnit(Unit* victim)
+ uint32 GetData(uint32 type) const
{
- if (victim == me)
- return;
- Talk(SAY_KILL);
+ return type == DATA_NOVOS_ACHIEV && _ohNovos ? 1 : 0;
}
void JustSummoned(Creature* summon)
{
- if (summon->GetEntry() == CREATURE_CRYSTAL_HANDLER)
- crystalHandlerAmount++;
-
- lSummons.Summon(summon);
+ summons.Summon(summon);
}
- void DoAction(int32 const action)
+ private:
+ void SetBubbled(bool state)
{
- if (action == ACTION_MINION_REACHED)
- ohNovos = false;
+ _bubbled = state;
+ if (!state)
+ {
+ if (me->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE))
+ me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
+ if (me->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC))
+ me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC);
+ if (me->HasUnitState(UNIT_STATE_CASTING))
+ me->CastStop();
+ }
+ else
+ {
+ if (!me->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE))
+ me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
+ if (!me->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC))
+ me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC);
+ DoCast(SPELL_ARCANE_FIELD);
+ }
}
- uint32 GetData(uint32 type) const
+ void SetSummonerStatus(bool active)
{
- if (type == DATA_OH_NOVOS)
- return ohNovos ? 1 : 0;
+ for (uint8 i = 0; i < 4; i++)
+ if (uint64 guid = instance->GetData64(summoners[i].data))
+ if (Creature* crystalChannelTarget = instance->instance->GetCreature(guid))
+ {
+ if (active)
+ crystalChannelTarget->AI()->SetData(summoners[i].spell, summoners[i].timer);
+ else
+ crystalChannelTarget->AI()->Reset();
+ }
+ }
- return 0;
+ void SetCrystalsStatus(bool active)
+ {
+ for (uint8 i = 0; i < 4; i++)
+ if (uint64 guid = instance->GetData64(DATA_NOVOS_CRYSTAL_1 + i))
+ if (GameObject* crystal = instance->instance->GetGameObject(guid))
+ SetCrystalStatus(crystal, active);
}
- void RemoveCrystal()
+ void SetCrystalStatus(GameObject* crystal, bool active)
{
- if (!luiCrystals.empty())
- {
- if (instance)
- if (GameObject* temp = instance->instance->GetGameObject(luiCrystals.back()))
- temp->SetGoState(GO_STATE_READY);
- luiCrystals.pop_back();
- }
- if (luiCrystals.empty())
+ if (!crystal)
+ return;
+
+ crystal->SetGoState(active ? GO_STATE_ACTIVE : GO_STATE_READY);
+ if (Creature* crystalChannelTarget = crystal->FindNearestCreature(NPC_CRYSTAL_CHANNEL_TARGET, 5.0f))
{
- me->CastStop();
- me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC);
- me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
- me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
- Phase = PHASE_2;
- uiTimer = 1*IN_MILLISECONDS;
+ if (active)
+ crystalChannelTarget->AI()->DoCastAOE(SPELL_BEAM_CHANNEL);
+ else if (crystalChannelTarget->HasUnitState(UNIT_STATE_CASTING))
+ crystalChannelTarget->CastStop();
}
}
- Unit* GetRandomTarget()
+ void CrystalHandlerDied()
{
- return SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true);
+ for (uint8 i = 0; i < 4; i++)
+ if (uint64 guid = instance->GetData64(DATA_NOVOS_CRYSTAL_1 + i))
+ if (GameObject* crystal = instance->instance->GetGameObject(guid))
+ if (crystal->GetGoState() == GO_STATE_ACTIVE)
+ {
+ SetCrystalStatus(crystal, false);
+ break;
+ }
+
+ if (++_crystalHandlerCount >= 4)
+ {
+ SetSummonerStatus(false);
+ SetBubbled(false);
+ events.ScheduleEvent(EVENT_ATTACK, 3000);
+ if (IsHeroic())
+ events.ScheduleEvent(EVENT_SUMMON_MINIONS, 15000);
+ }
+ else if (uint64 guid = instance->GetData64(DATA_NOVOS_SUMMONER_4))
+ if (Creature* crystalChannelTarget = instance->instance->GetCreature(guid))
+ crystalChannelTarget->AI()->SetData(SPELL_SUMMON_CRYSTAL_HANDLER, 15000);
}
+
+ uint8 _crystalHandlerCount;
+ bool _ohNovos;
+ bool _bubbled;
};
CreatureAI* GetAI(Creature* creature) const
@@ -247,126 +263,116 @@ public:
}
};
-enum CrystalHandlerSpells
-{
- SPELL_FLASH_OF_DARKNESS = 49668,
- H_SPELL_FLASH_OF_DARKNESS = 59004
-};
-
-class mob_crystal_handler : public CreatureScript
+class npc_crystal_channel_target : public CreatureScript
{
public:
- mob_crystal_handler() : CreatureScript("mob_crystal_handler") { }
+ npc_crystal_channel_target() : CreatureScript("npc_crystal_channel_target") {}
- struct mob_crystal_handlerAI : public ScriptedAI
+ struct npc_crystal_channel_targetAI : public ScriptedAI
{
- mob_crystal_handlerAI(Creature* creature) : ScriptedAI(creature)
+ npc_crystal_channel_targetAI(Creature* creature) : ScriptedAI(creature) {}
+
+ void Reset()
{
- instance = creature->GetInstanceScript();
+ _spell = 0;
+ _timer = 0;
+ _temp = 0;
}
- uint32 uiFlashOfDarknessTimer;
-
- InstanceScript* instance;
-
- void Reset()
+ void UpdateAI(const uint32 diff)
{
- uiFlashOfDarknessTimer = 5*IN_MILLISECONDS;
+ if (_spell)
+ {
+ if (_temp <= diff)
+ {
+ DoCast(_spell);
+ _temp = _timer;
+ }
+ else
+ _temp -= diff;
+ }
}
- void JustDied(Unit* /*killer*/)
+ void SetData(uint32 id, uint32 value)
{
- if (Creature* pNovos = Unit::GetCreature(*me, instance ? instance->GetData64(DATA_NOVOS) : 0))
- CAST_AI(boss_novos::boss_novosAI, pNovos->AI())->RemoveCrystal();
+ _spell = id;
+ _timer = value;
+ _temp = value;
}
- void UpdateAI(const uint32 diff)
+ void JustSummoned(Creature* summon)
{
- if (!UpdateVictim())
- return;
+ if (InstanceScript* instance = me->GetInstanceScript())
+ if (uint64 guid = instance->GetData64(DATA_NOVOS))
+ if (Creature* novos = Creature::GetCreature(*me, guid))
+ novos->AI()->JustSummoned(summon);
- if (uiFlashOfDarknessTimer <= diff)
- {
- DoCast(me->getVictim(), DUNGEON_MODE(SPELL_FLASH_OF_DARKNESS, H_SPELL_FLASH_OF_DARKNESS));
- uiFlashOfDarknessTimer = 5*IN_MILLISECONDS;
- } else uiFlashOfDarknessTimer -= diff;
+ if (summon)
+ summon->GetMotionMaster()->MovePath(summon->GetEntry() * 100, false);
- DoMeleeAttackIfReady();
+ if (_spell == SPELL_SUMMON_CRYSTAL_HANDLER)
+ Reset();
}
- void MovementInform(uint32 type, uint32 id)
- {
- if (type != POINT_MOTION_TYPE || id != 0)
- return;
- if (Creature* pNovos = Unit::GetCreature(*me, instance ? instance->GetData64(DATA_NOVOS) : 0))
- if (Unit* target = CAST_AI(boss_novos::boss_novosAI, pNovos->AI())->GetRandomTarget())
- AttackStart(target);
- }
+ private:
+ uint32 _spell;
+ uint32 _timer;
+ uint32 _temp;
};
CreatureAI* GetAI(Creature* creature) const
{
- return new mob_crystal_handlerAI(creature);
+ return new npc_crystal_channel_targetAI(creature);
}
};
-class mob_novos_minion : public CreatureScript
+class achievement_oh_novos : public AchievementCriteriaScript
{
public:
- mob_novos_minion() : CreatureScript("mob_novos_minion") { }
+ achievement_oh_novos() : AchievementCriteriaScript("achievement_oh_novos") {}
- struct mob_novos_minionAI : public ScriptedAI
+ bool OnCheck(Player* /*player*/, Unit* target)
{
- mob_novos_minionAI(Creature* creature) : ScriptedAI(creature)
- {
- instance = creature->GetInstanceScript();
- }
+ return target && target->GetTypeId() == TYPEID_UNIT && target->ToCreature()->AI()->GetData(DATA_NOVOS_ACHIEV);
+ }
+};
- InstanceScript* instance;
+enum SummonMinions
+{
+ SPELL_COPY_OF_SUMMON_MINIONS = 59933
+};
- void MovementInform(uint32 type, uint32 id)
- {
- if (type != POINT_MOTION_TYPE || id !=0)
- return;
- if (Creature* Novos = ObjectAccessor::GetCreature(*me, instance ? instance->GetData64(DATA_NOVOS) : 0))
- {
- Novos->AI()->DoAction(ACTION_MINION_REACHED);
- if (Unit* target = CAST_AI(boss_novos::boss_novosAI, Novos->AI())->GetRandomTarget())
- AttackStart(target);
- }
- }
- };
+class spell_summon_minions : public SpellScriptLoader
+{
+public:
+ spell_summon_minions() : SpellScriptLoader("spell_summon_minions") { }
- CreatureAI* GetAI(Creature* creature) const
+ class spell_summon_minions_SpellScript : public SpellScript
{
- return new mob_novos_minionAI(creature);
- }
-};
+ PrepareSpellScript(spell_summon_minions_SpellScript);
-class achievement_oh_novos : public AchievementCriteriaScript
-{
- public:
- achievement_oh_novos() : AchievementCriteriaScript("achievement_oh_novos")
+ void HandleScript(SpellEffIndex /*effIndex*/)
{
+ GetCaster()->CastSpell((Unit*)NULL, SPELL_COPY_OF_SUMMON_MINIONS, true);
+ GetCaster()->CastSpell((Unit*)NULL, SPELL_COPY_OF_SUMMON_MINIONS, true);
}
- bool OnCheck(Player* /*player*/, Unit* target)
+ void Register()
{
- if (!target)
- return false;
-
- if (Creature* Novos = target->ToCreature())
- if (Novos->AI()->GetData(DATA_OH_NOVOS))
- return true;
-
- return false;
+ OnEffectHitTarget += SpellEffectFn(spell_summon_minions_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
}
+ };
+
+ SpellScript* GetSpellScript() const
+ {
+ return new spell_summon_minions_SpellScript();
+ }
};
void AddSC_boss_novos()
{
new boss_novos();
- new mob_crystal_handler();
- new mob_novos_minion();
+ new npc_crystal_channel_target();
+ new spell_summon_minions();
new achievement_oh_novos();
}
diff --git a/src/server/scripts/Northrend/DraktharonKeep/drak_tharon_keep.h b/src/server/scripts/Northrend/DraktharonKeep/drak_tharon_keep.h
index dc8428f9104..e17cba4bccd 100644
--- a/src/server/scripts/Northrend/DraktharonKeep/drak_tharon_keep.h
+++ b/src/server/scripts/Northrend/DraktharonKeep/drak_tharon_keep.h
@@ -31,9 +31,16 @@ enum Data64
DATA_NOVOS,
DATA_DRED,
DATA_THARON_JA,
+
DATA_NOVOS_CRYSTAL_1,
DATA_NOVOS_CRYSTAL_2,
DATA_NOVOS_CRYSTAL_3,
- DATA_NOVOS_CRYSTAL_4
+ DATA_NOVOS_CRYSTAL_4,
+ DATA_NOVOS_SUMMONER_1,
+ DATA_NOVOS_SUMMONER_2,
+ DATA_NOVOS_SUMMONER_3,
+ DATA_NOVOS_SUMMONER_4,
+
+ ACTION_CRYSTAL_HANDLER_DIED
};
#endif
diff --git a/src/server/scripts/Northrend/DraktharonKeep/instance_drak_tharon_keep.cpp b/src/server/scripts/Northrend/DraktharonKeep/instance_drak_tharon_keep.cpp
index 52c5c9eab8e..28bea60fb87 100644
--- a/src/server/scripts/Northrend/DraktharonKeep/instance_drak_tharon_keep.cpp
+++ b/src/server/scripts/Northrend/DraktharonKeep/instance_drak_tharon_keep.cpp
@@ -16,6 +16,7 @@
*/
#include "ScriptMgr.h"
+#include "ScriptedCreature.h"
#include "InstanceScript.h"
#include "drak_tharon_keep.h"
@@ -30,17 +31,23 @@
enum Creatures
{
- NPC_TROLLGORE = 26630,
- NPC_NOVOS = 26631,
- NPC_KING_DRED = 27483,
- NPC_THARON_JA = 26632
+ NPC_TROLLGORE = 26630,
+ NPC_NOVOS = 26631,
+ NPC_KING_DRED = 27483,
+ NPC_THARON_JA = 26632,
+ NPC_CRYSTAL_CHANNEL_TARGET = 26712,
+ NPC_CRYSTAL_HANDLER = 26627
};
enum GameObjects
{
- GO_NOVOS_CRYSTAL_1 = 189299,
- GO_NOVOS_CRYSTAL_2 = 189300,
- GO_NOVOS_CRYSTAL_3 = 189301,
- GO_NOVOS_CRYSTAL_4 = 189302
+ GO_NOVOS_CRYSTAL_1 = 189299,
+ GO_NOVOS_CRYSTAL_2 = 189300,
+ GO_NOVOS_CRYSTAL_3 = 189301,
+ GO_NOVOS_CRYSTAL_4 = 189302
+};
+enum Achievements
+{
+ ACM_CRITERIA_OH_NOVOS = 7361
};
class instance_drak_tharon : public InstanceMapScript
@@ -52,17 +59,22 @@ public:
{
instance_drak_tharon_InstanceScript(Map* map) : InstanceScript(map) {}
- uint8 uiDredAchievCounter;
+ uint8 dredAchievCounter;
- uint64 uiTrollgore;
- uint64 uiNovos;
- uint64 uiDred;
- uint64 uiTharonJa;
+ uint64 trollgoreGUID;
+ uint64 novosGUID;
+ uint64 dredGUID;
+ uint64 tharonJaGUID;
- uint64 uiNovosCrystal1;
- uint64 uiNovosCrystal2;
- uint64 uiNovosCrystal3;
- uint64 uiNovosCrystal4;
+ uint64 novosCrystalGUID1;
+ uint64 novosCrystalGUID2;
+ uint64 novosCrystalGUID3;
+ uint64 novosCrystalGUID4;
+
+ uint64 novosSummonerGUID1;
+ uint64 novosSummonerGUID2;
+ uint64 novosSummonerGUID3;
+ uint64 novosSummonerGUID4;
uint16 m_auiEncounter[MAX_ENCOUNTER];
@@ -71,15 +83,23 @@ public:
void Initialize()
{
memset(&m_auiEncounter, 0, sizeof(m_auiEncounter));
- uiTrollgore = 0;
- uiNovos = 0;
- uiDred = 0;
- uiTharonJa = 0;
- uiNovosCrystal1 = 0;
- uiNovosCrystal2 = 0;
- uiNovosCrystal3 = 0;
- uiNovosCrystal4 = 0;
- uiDredAchievCounter = 0;
+
+ dredAchievCounter = 0;
+
+ trollgoreGUID = 0;
+ novosGUID = 0;
+ dredGUID = 0;
+ tharonJaGUID = 0;
+
+ novosCrystalGUID1 = 0;
+ novosCrystalGUID2 = 0;
+ novosCrystalGUID3 = 0;
+ novosCrystalGUID4 = 0;
+
+ novosSummonerGUID1 = 0;
+ novosSummonerGUID2 = 0;
+ novosSummonerGUID3 = 0;
+ novosSummonerGUID4 = 0;
}
bool IsEncounterInProgress() const
@@ -96,16 +116,20 @@ public:
switch (go->GetEntry())
{
case GO_NOVOS_CRYSTAL_1:
- uiNovosCrystal1 = go->GetGUID();
+ novosCrystalGUID1 = go->GetGUID();
+ go->SetGoState(GO_STATE_READY);
break;
case GO_NOVOS_CRYSTAL_2:
- uiNovosCrystal2 = go->GetGUID();
+ novosCrystalGUID2 = go->GetGUID();
+ go->SetGoState(GO_STATE_READY);
break;
case GO_NOVOS_CRYSTAL_3:
- uiNovosCrystal3 = go->GetGUID();
+ novosCrystalGUID3 = go->GetGUID();
+ go->SetGoState(GO_STATE_READY);
break;
case GO_NOVOS_CRYSTAL_4:
- uiNovosCrystal4 = go->GetGUID();
+ novosCrystalGUID4 = go->GetGUID();
+ go->SetGoState(GO_STATE_READY);
break;
}
}
@@ -115,32 +139,55 @@ public:
switch (creature->GetEntry())
{
case NPC_TROLLGORE:
- uiTrollgore = creature->GetGUID();
+ trollgoreGUID = creature->GetGUID();
break;
case NPC_NOVOS:
- uiNovos = creature->GetGUID();
+ novosGUID = creature->GetGUID();
break;
case NPC_KING_DRED:
- uiDred = creature->GetGUID();
+ dredGUID = creature->GetGUID();
break;
case NPC_THARON_JA:
- uiTharonJa = creature->GetGUID();
+ tharonJaGUID = creature->GetGUID();
+ break;
+ case NPC_CRYSTAL_CHANNEL_TARGET:
+ InitializeNovosSummoner(creature);
break;
}
}
+ void InitializeNovosSummoner(Creature* creature)
+ {
+ float x = creature->GetPositionX();
+ float y = creature->GetPositionY();
+ float z = creature->GetPositionZ();
+
+ if (x < -374.0f && x > -379.0f && y > -820.0f && y < -815.0f && z < 60.0f && z > 58.0f)
+ novosSummonerGUID1 = creature->GetGUID();
+ else if (x < -379.0f && x > -385.0f && y > -820.0f && y < -815.0f && z < 60.0f && z > 58.0f)
+ novosSummonerGUID2 = creature->GetGUID();
+ else if (x < -374.0f && x > -385.0f && y > -827.0f && y < -820.0f && z < 60.0f && z > 58.0f)
+ novosSummonerGUID3 = creature->GetGUID();
+ else if (x < -338.0f && x > -344.0f && y > -727.0f && y < 721.0f && z < 30.0f && z > 26.0f)
+ novosSummonerGUID4 = creature->GetGUID();
+ }
+
uint64 GetData64(uint32 identifier) const
{
switch (identifier)
{
- case DATA_TROLLGORE: return uiTrollgore;
- case DATA_NOVOS: return uiNovos;
- case DATA_DRED: return uiDred;
- case DATA_THARON_JA: return uiTharonJa;
- case DATA_NOVOS_CRYSTAL_1: return uiNovosCrystal1;
- case DATA_NOVOS_CRYSTAL_2: return uiNovosCrystal2;
- case DATA_NOVOS_CRYSTAL_3: return uiNovosCrystal3;
- case DATA_NOVOS_CRYSTAL_4: return uiNovosCrystal4;
+ case DATA_TROLLGORE: return trollgoreGUID;
+ case DATA_NOVOS: return novosGUID;
+ case DATA_DRED: return dredGUID;
+ case DATA_THARON_JA: return tharonJaGUID;
+ case DATA_NOVOS_CRYSTAL_1: return novosCrystalGUID1;
+ case DATA_NOVOS_CRYSTAL_2: return novosCrystalGUID2;
+ case DATA_NOVOS_CRYSTAL_3: return novosCrystalGUID3;
+ case DATA_NOVOS_CRYSTAL_4: return novosCrystalGUID4;
+ case DATA_NOVOS_SUMMONER_1: return novosSummonerGUID1;
+ case DATA_NOVOS_SUMMONER_2: return novosSummonerGUID2;
+ case DATA_NOVOS_SUMMONER_3: return novosSummonerGUID3;
+ case DATA_NOVOS_SUMMONER_4: return novosSummonerGUID4;
}
return 0;
@@ -164,7 +211,7 @@ public:
break;
case DATA_KING_DRED_ACHIEV:
- uiDredAchievCounter = data;
+ dredAchievCounter = data;
break;
}
@@ -182,7 +229,7 @@ public:
case DATA_NOVOS_EVENT: return m_auiEncounter[1];
case DATA_DRED_EVENT: return m_auiEncounter[2];
case DATA_THARON_JA_EVENT: return m_auiEncounter[3];
- case DATA_KING_DRED_ACHIEV: return uiDredAchievCounter;
+ case DATA_KING_DRED_ACHIEV: return dredAchievCounter;
}
return 0;
}
@@ -199,6 +246,14 @@ public:
return saveStream.str();
}
+ void OnUnitDeath(Unit* unit)
+ {
+ if (unit->GetEntry() == NPC_CRYSTAL_HANDLER)
+ if (novosGUID)
+ if (Creature* novos = instance->GetCreature(novosGUID))
+ novos->AI()->DoAction(ACTION_CRYSTAL_HANDLER_DIED);
+ }
+
void Load(const char* in)
{
if (!in)
diff --git a/src/server/scripts/Northrend/Nexus/EyeOfEternity/boss_malygos.cpp b/src/server/scripts/Northrend/Nexus/EyeOfEternity/boss_malygos.cpp
index 85414e3808c..952363c6dcf 100644
--- a/src/server/scripts/Northrend/Nexus/EyeOfEternity/boss_malygos.cpp
+++ b/src/server/scripts/Northrend/Nexus/EyeOfEternity/boss_malygos.cpp
@@ -35,10 +35,13 @@ Script Data End */
#include "eye_of_eternity.h"
#include "ScriptedEscortAI.h"
#include "Player.h"
+#include "Vehicle.h"
+#include "CombatAI.h"
+#include "CreatureTextMgr.h"
enum Achievements
{
- ACHIEV_TIMED_START_EVENT = 20387,
+ ACHIEV_TIMED_START_EVENT = 20387,
};
enum Events
@@ -132,25 +135,36 @@ enum MalygosEvents
#define TEN_MINUTES 600000
-enum MalygosSays
+enum Texts
{
- SAY_AGGRO_P_ONE,
- SAY_KILLED_PLAYER_P_ONE,
- SAY_END_P_ONE,
- SAY_AGGRO_P_TWO,
- SAY_ANTI_MAGIC_SHELL, // not sure when execute it
- SAY_MAGIC_BLAST, // not sure when execute it
- SAY_KILLED_PLAYER_P_TWO,
- SAY_END_P_TWO,
- SAY_INTRO_P_THREE,
- SAY_AGGRO_P_THREE,
- SAY_SURGE_POWER, // not sure when execute it
- SAY_BUFF_SPARK,
- SAY_KILLED_PLAYER_P_THREE,
- SAY_SPELL_CASTING_P_THREE,
- SAY_DEATH
+ // Malygos
+ SAY_AGGRO_P_ONE = 0,
+ SAY_KILLED_PLAYER_P_ONE = 1,
+ SAY_END_P_ONE = 2,
+ SAY_AGGRO_P_TWO = 3,
+ SAY_ANTI_MAGIC_SHELL = 4, // not sure when execute it
+ SAY_MAGIC_BLAST = 5, // not sure when execute it
+ SAY_KILLED_PLAYER_P_TWO = 6,
+ SAY_END_P_TWO = 7,
+ SAY_INTRO_P_THREE = 8,
+ SAY_AGGRO_P_THREE = 9,
+ SAY_SURGE_POWER = 10, // not sure when execute it
+ SAY_BUFF_SPARK = 11,
+ SAY_KILLED_PLAYER_P_THREE = 12,
+ SAY_SPELL_CASTING_P_THREE = 13,
+ SAY_DEATH,
+
+ // Alexstrasza
+ SAY_ONE = 0,
+ SAY_TWO = 1,
+ SAY_THREE = 2,
+ SAY_FOUR = 3,
+
+ // Power Sparks
+ EMOTE_POWER_SPARK_SUMMONED = 0
};
+
#define MAX_HOVER_DISK_WAYPOINTS 18
// Sniffed data (x, y,z)
@@ -178,7 +192,7 @@ const Position HoverDiskWaypoints[MAX_HOVER_DISK_WAYPOINTS] =
#define GROUND_Z 268
-// Source: Sniffs (x, y,z)
+// Source: Sniffs (x,y,z)
#define MALYGOS_MAX_WAYPOINTS 16
const Position MalygosPhaseTwoWaypoints[MALYGOS_MAX_WAYPOINTS] =
{
@@ -316,6 +330,7 @@ public:
// The rest is handled in the AI of the vehicle.
target->CastSpell(target, SPELL_SUMMOM_RED_DRAGON, true);
+ me->Attack(target, false);
}
}
@@ -748,13 +763,18 @@ public:
_instance = creature->GetInstanceScript();
}
- void Reset()
+ void SpellHit(Unit* /*caster*/, const SpellInfo* spell)
{
- _summonTimer = urand(5, 7)*IN_MILLISECONDS;
+ if (spell->Id == SPELL_PORTAL_OPENED)
+ {
+ DoCast(me, SPELL_SUMMON_POWER_PARK, true);
+ }
}
- void UpdateAI(uint32 const diff)
+ void UpdateAI(uint32 const /*diff*/)
{
+ // When duration of oppened riff visual ends,
+ // closed one should be cast
if (!me->HasAura(SPELL_PORTAL_VISUAL_CLOSED) &&
!me->HasAura(SPELL_PORTAL_OPENED))
DoCast(me, SPELL_PORTAL_VISUAL_CLOSED, true);
@@ -770,16 +790,6 @@ public:
}
}
}
-
- if (!me->HasAura(SPELL_PORTAL_OPENED))
- return;
-
- if (_summonTimer <= diff)
- {
- DoCast(SPELL_SUMMON_POWER_PARK);
- _summonTimer = urand(5, 7)*IN_MILLISECONDS;
- } else
- _summonTimer -= diff;
}
void JustSummoned(Creature* summon)
@@ -811,6 +821,8 @@ public:
_instance = creature->GetInstanceScript();
MoveToMalygos();
+ // Talk range was not enough for this encounter
+ sCreatureTextMgr->SendChat(me, EMOTE_POWER_SPARK_SUMMONED, 0, CHAT_MSG_ADDON, LANG_ADDON, TEXT_RANGE_MAP);
}
void EnterEvadeMode()
@@ -853,14 +865,9 @@ public:
}
}
- void DamageTaken(Unit* /*done_by*/, uint32& damage)
+ void JustDied(Unit* /*killer*/)
{
- if (damage > me->GetMaxHealth())
- {
- damage = 0;
- DoCast(me, SPELL_POWER_SPARK_DEATH, true);
- me->DespawnOrUnsummon(1000);
- }
+ me->CastSpell(me, SPELL_POWER_SPARK_DEATH, true); // not supposed to hide the fact it's there by not selectable
}
private:
@@ -903,8 +910,7 @@ public:
else
{
// Error found: This is not called if the passenger is a player
-
- if (unit->GetTypeId() == TYPEID_UNIT)
+ if (unit->GetTypeId() == TYPEID_UNIT || unit->GetTypeId() == TYPEID_PLAYER)
{
// This will only be called if the passenger dies
if (_instance)
@@ -1012,7 +1018,7 @@ public:
};
};
-// SmartAI does not work correctly for this (vehicles)
+// SmartAI does not work correctly for vehicles
class npc_wyrmrest_skytalon : public CreatureScript
{
public:
@@ -1023,14 +1029,13 @@ public:
return new npc_wyrmrest_skytalonAI (creature);
}
- struct npc_wyrmrest_skytalonAI : public NullCreatureAI
+ struct npc_wyrmrest_skytalonAI : public VehicleAI
{
- npc_wyrmrest_skytalonAI(Creature* creature) : NullCreatureAI(creature)
- {
- _instance = creature->GetInstanceScript();
+ npc_wyrmrest_skytalonAI(Creature* creature) : VehicleAI(creature) { }
- _timer = 1000;
- _entered = false;
+ void IsSummonedBy(Unit* summoner)
+ {
+ summoner->CastSpell(me, SPELL_RIDE_RED_DRAGON, true);
}
void PassengerBoarded(Unit* /*unit*/, int8 /*seat*/, bool apply)
@@ -1038,54 +1043,9 @@ public:
if (!apply)
me->DespawnOrUnsummon();
}
-
- // we can't call this in reset function, it fails.
- void MakePlayerEnter()
- {
- if (!_instance)
- return;
-
- if (Unit* summoner = me->ToTempSummon()->GetSummoner())
- {
- if (Creature* malygos = Unit::GetCreature(*me, _instance->GetData64(DATA_MALYGOS)))
- {
- summoner->CastSpell(me, SPELL_RIDE_RED_DRAGON, true);
- float victimThreat = malygos->getThreatManager().getThreat(summoner);
- malygos->getThreatManager().resetAllAggro();
- malygos->AI()->AttackStart(me);
- malygos->AddThreat(me, victimThreat);
- }
- }
- }
-
- void UpdateAI(const uint32 diff)
- {
- if (!_entered)
- {
- if (_timer <= diff)
- {
- MakePlayerEnter();
- _entered = true;
- } else
- _timer -= diff;
- }
- }
-
- private:
- InstanceScript* _instance;
- uint32 _timer;
- bool _entered;
};
};
-enum AlexstraszaYells
-{
- SAY_ONE,
- SAY_TWO,
- SAY_THREE,
- SAY_FOUR
-};
-
class npc_alexstrasza_eoe : public CreatureScript
{
public:
diff --git a/src/server/scripts/Northrend/Nexus/Nexus/commander_kolurg.cpp b/src/server/scripts/Northrend/Nexus/Nexus/boss_commander_kolurg.cpp
index fedb1f5cebc..fedb1f5cebc 100644
--- a/src/server/scripts/Northrend/Nexus/Nexus/commander_kolurg.cpp
+++ b/src/server/scripts/Northrend/Nexus/Nexus/boss_commander_kolurg.cpp
diff --git a/src/server/scripts/Northrend/Nexus/Nexus/commander_stoutbeard.cpp b/src/server/scripts/Northrend/Nexus/Nexus/boss_commander_stoutbeard.cpp
index 39c93f15d6f..39c93f15d6f 100644
--- a/src/server/scripts/Northrend/Nexus/Nexus/commander_stoutbeard.cpp
+++ b/src/server/scripts/Northrend/Nexus/Nexus/boss_commander_stoutbeard.cpp
diff --git a/src/server/scripts/Northrend/VaultOfArchavon/boss_archavon.cpp b/src/server/scripts/Northrend/VaultOfArchavon/boss_archavon.cpp
index dc9665ae27b..33e0619c7e5 100644
--- a/src/server/scripts/Northrend/VaultOfArchavon/boss_archavon.cpp
+++ b/src/server/scripts/Northrend/VaultOfArchavon/boss_archavon.cpp
@@ -21,7 +21,8 @@
enum
{
- EMOTE_BERSERK = 0
+ EMOTE_BERSERK = 0,
+ EMOTE_LEAP = 1 // Not in use
};
//Spells Archavon
@@ -38,9 +39,6 @@ enum
//4 Warders spawned
#define ARCHAVON_WARDER 32353 //npc 32353
-//Yell
-#define SAY_LEAP "Archavon the Stone Watcher lunges for $N!" //$N should be the target
-
enum Events
{
// Archavon
diff --git a/src/server/scripts/Northrend/borean_tundra.cpp b/src/server/scripts/Northrend/zone_borean_tundra.cpp
index 8e7507bce61..8e7507bce61 100644
--- a/src/server/scripts/Northrend/borean_tundra.cpp
+++ b/src/server/scripts/Northrend/zone_borean_tundra.cpp
diff --git a/src/server/scripts/Northrend/crystalsong_forest.cpp b/src/server/scripts/Northrend/zone_crystalsong_forest.cpp
index d12b5176b15..d12b5176b15 100644
--- a/src/server/scripts/Northrend/crystalsong_forest.cpp
+++ b/src/server/scripts/Northrend/zone_crystalsong_forest.cpp
diff --git a/src/server/scripts/Northrend/dalaran.cpp b/src/server/scripts/Northrend/zone_dalaran.cpp
index d16b6fe4588..d16b6fe4588 100644
--- a/src/server/scripts/Northrend/dalaran.cpp
+++ b/src/server/scripts/Northrend/zone_dalaran.cpp
diff --git a/src/server/scripts/Northrend/dragonblight.cpp b/src/server/scripts/Northrend/zone_dragonblight.cpp
index a8fb0215902..a8fb0215902 100644
--- a/src/server/scripts/Northrend/dragonblight.cpp
+++ b/src/server/scripts/Northrend/zone_dragonblight.cpp
diff --git a/src/server/scripts/Northrend/grizzly_hills.cpp b/src/server/scripts/Northrend/zone_grizzly_hills.cpp
index fe1f561071c..fe1f561071c 100644
--- a/src/server/scripts/Northrend/grizzly_hills.cpp
+++ b/src/server/scripts/Northrend/zone_grizzly_hills.cpp
diff --git a/src/server/scripts/Northrend/howling_fjord.cpp b/src/server/scripts/Northrend/zone_howling_fjord.cpp
index ff4d8ec7a79..ff4d8ec7a79 100644
--- a/src/server/scripts/Northrend/howling_fjord.cpp
+++ b/src/server/scripts/Northrend/zone_howling_fjord.cpp
diff --git a/src/server/scripts/Northrend/icecrown.cpp b/src/server/scripts/Northrend/zone_icecrown.cpp
index 2ec5a3e8164..2ec5a3e8164 100644
--- a/src/server/scripts/Northrend/icecrown.cpp
+++ b/src/server/scripts/Northrend/zone_icecrown.cpp
diff --git a/src/server/scripts/Northrend/sholazar_basin.cpp b/src/server/scripts/Northrend/zone_sholazar_basin.cpp
index 2aa355084a1..2aa355084a1 100644
--- a/src/server/scripts/Northrend/sholazar_basin.cpp
+++ b/src/server/scripts/Northrend/zone_sholazar_basin.cpp
diff --git a/src/server/scripts/Northrend/storm_peaks.cpp b/src/server/scripts/Northrend/zone_storm_peaks.cpp
index 85ab1dc1127..85ab1dc1127 100644
--- a/src/server/scripts/Northrend/storm_peaks.cpp
+++ b/src/server/scripts/Northrend/zone_storm_peaks.cpp
diff --git a/src/server/scripts/Northrend/wintergrasp.cpp b/src/server/scripts/Northrend/zone_wintergrasp.cpp
index 8935c77b30e..8935c77b30e 100644
--- a/src/server/scripts/Northrend/wintergrasp.cpp
+++ b/src/server/scripts/Northrend/zone_wintergrasp.cpp
diff --git a/src/server/scripts/Northrend/zuldrak.cpp b/src/server/scripts/Northrend/zone_zuldrak.cpp
index 69e8d900435..69e8d900435 100644
--- a/src/server/scripts/Northrend/zuldrak.cpp
+++ b/src/server/scripts/Northrend/zone_zuldrak.cpp
diff --git a/src/server/scripts/Outland/CMakeLists.txt b/src/server/scripts/Outland/CMakeLists.txt
index 9fb0d4715a0..f038af07634 100644
--- a/src/server/scripts/Outland/CMakeLists.txt
+++ b/src/server/scripts/Outland/CMakeLists.txt
@@ -10,7 +10,7 @@
set(scripts_STAT_SRCS
${scripts_STAT_SRCS}
- Outland/nagrand.cpp
+ Outland/zone_nagrand.cpp
Outland/HellfireCitadel/MagtheridonsLair/magtheridons_lair.h
Outland/HellfireCitadel/MagtheridonsLair/instance_magtheridons_lair.cpp
Outland/HellfireCitadel/MagtheridonsLair/boss_magtheridon.cpp
@@ -44,7 +44,7 @@ set(scripts_STAT_SRCS
Outland/CoilfangReservoir/SerpentShrine/boss_morogrim_tidewalker.cpp
Outland/CoilfangReservoir/underbog/boss_hungarfen.cpp
Outland/CoilfangReservoir/underbog/boss_the_black_stalker.cpp
- Outland/shattrath_city.cpp
+ Outland/zone_shattrath_city.cpp
Outland/TempestKeep/Mechanar/boss_mechano_lord_capacitus.cpp
Outland/TempestKeep/Mechanar/boss_pathaleon_the_calculator.cpp
Outland/TempestKeep/Mechanar/boss_nethermancer_sepethrea.cpp
@@ -59,6 +59,10 @@ set(scripts_STAT_SRCS
Outland/TempestKeep/Eye/boss_alar.cpp
Outland/TempestKeep/Eye/boss_kaelthas.cpp
Outland/TempestKeep/Eye/the_eye.cpp
+ Outland/TempestKeep/botanica/the_botanica.h
+ Outland/TempestKeep/botanica/instance_the_botanica.cpp
+ Outland/TempestKeep/botanica/boss_commander_sarannis.cpp
+ Outland/TempestKeep/botanica/boss_thorngrin_the_tender.cpp
Outland/TempestKeep/botanica/boss_high_botanist_freywinn.cpp
Outland/TempestKeep/botanica/boss_warp_splinter.cpp
Outland/TempestKeep/botanica/boss_laj.cpp
@@ -81,8 +85,8 @@ set(scripts_STAT_SRCS
Outland/Auchindoun/ShadowLabyrinth/shadow_labyrinth.h
Outland/Auchindoun/ShadowLabyrinth/boss_grandmaster_vorpil.cpp
Outland/boss_doomwalker.cpp
- Outland/terokkar_forest.cpp
- Outland/hellfire_peninsula.cpp
+ Outland/zone_terokkar_forest.cpp
+ Outland/zone_hellfire_peninsula.cpp
Outland/boss_doomlord_kazzak.cpp
Outland/BlackTemple/boss_teron_gorefiend.cpp
Outland/BlackTemple/black_temple.h
@@ -96,14 +100,14 @@ set(scripts_STAT_SRCS
Outland/BlackTemple/boss_warlord_najentus.cpp
Outland/BlackTemple/boss_bloodboil.cpp
Outland/BlackTemple/boss_illidan.cpp
- Outland/shadowmoon_valley.cpp
- Outland/blades_edge_mountains.cpp
+ Outland/zone_shadowmoon_valley.cpp
+ Outland/zone_blades_edge_mountains.cpp
Outland/GruulsLair/boss_high_king_maulgar.cpp
Outland/GruulsLair/boss_gruul.cpp
Outland/GruulsLair/gruuls_lair.h
Outland/GruulsLair/instance_gruuls_lair.cpp
- Outland/netherstorm.cpp
- Outland/zangarmarsh.cpp
+ Outland/zone_netherstorm.cpp
+ Outland/zone_zangarmarsh.cpp
)
message(" -> Prepared: Outland")
diff --git a/src/server/scripts/Outland/TempestKeep/botanica/boss_commander_sarannis.cpp b/src/server/scripts/Outland/TempestKeep/botanica/boss_commander_sarannis.cpp
new file mode 100644
index 00000000000..fe89925b6f9
--- /dev/null
+++ b/src/server/scripts/Outland/TempestKeep/botanica/boss_commander_sarannis.cpp
@@ -0,0 +1,186 @@
+/*
+ * Copyright (C) 2008-2013 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 "the_botanica.h"
+#include "SpellScript.h"
+
+enum Says
+{
+ SAY_AGGRO = 0,
+ SAY_KILL = 1,
+ SAY_ARCANE_RESONANCE = 2,
+ SAY_ARCANE_DEVASTATION = 3,
+ EMOTE_SUMMON = 4,
+ SAY_SUMMON = 5,
+ SAY_DEATH = 6
+};
+
+enum Spells
+{
+ SPELL_ARCANE_RESONANCE = 34794,
+ SPELL_ARCANE_DEVASTATION = 34799,
+ SPELL_SUMMON_REINFORCEMENTS = 34803
+};
+
+enum
+{
+ EVENT_ARCANE_RESONANCE = 1,
+ EVENT_ARCANE_DEVASTATION = 2
+};
+
+class boss_commander_sarannis : public CreatureScript
+{
+ public: boss_commander_sarannis() : CreatureScript("boss_commander_sarannis") { }
+
+ struct boss_commander_sarannisAI : public BossAI
+ {
+ boss_commander_sarannisAI(Creature* creature) : BossAI(creature, DATA_COMMANDER_SARANNIS) { }
+
+ void Reset()
+ {
+ _Reset();
+ _phase = true;
+ }
+
+ void EnterCombat(Unit* /*who*/)
+ {
+ _EnterCombat();
+ Talk(SAY_AGGRO);
+ events.ScheduleEvent(EVENT_ARCANE_RESONANCE, 42700);
+ events.ScheduleEvent(EVENT_ARCANE_DEVASTATION, 15200);
+ }
+
+ void KilledUnit(Unit* /*victim*/)
+ {
+ Talk(SAY_KILL);
+ }
+
+ void JustDied(Unit* /*killer*/)
+ {
+ _JustDied();
+ Talk(SAY_DEATH);
+ }
+
+ void DamageTaken(Unit* /*killer*/, uint32 &damage)
+ {
+ if (me->HealthBelowPctDamaged(50, damage) && _phase)
+ {
+ _phase = false;
+ Talk(EMOTE_SUMMON);
+ Talk(SAY_SUMMON);
+ DoCast(me, SPELL_SUMMON_REINFORCEMENTS);
+ }
+ }
+
+ void JustSummoned(Creature* summon)
+ {
+ BossAI::JustSummoned(summon);
+ }
+
+ void UpdateAI(uint32 const diff)
+ {
+ if (!UpdateVictim())
+ return;
+
+ events.Update(diff);
+
+ if (me->HasUnitState(UNIT_STATE_CASTING))
+ return;
+
+ while (uint32 eventId = events.ExecuteEvent())
+ {
+ switch (eventId)
+ {
+ case EVENT_ARCANE_RESONANCE:
+ Talk(SAY_ARCANE_RESONANCE);
+ DoCastVictim(SPELL_ARCANE_RESONANCE, true);
+ events.ScheduleEvent(EVENT_ARCANE_RESONANCE, 42700);
+ break;
+ case EVENT_ARCANE_DEVASTATION:
+ Talk(SAY_ARCANE_DEVASTATION);
+ DoCastVictim(SPELL_ARCANE_DEVASTATION, true);
+ events.ScheduleEvent(EVENT_ARCANE_DEVASTATION, urand(11000, 19200));
+ break;
+ default:
+ break;
+ }
+ }
+
+ DoMeleeAttackIfReady();
+ }
+
+ private:
+ bool _phase;
+ };
+
+ CreatureAI* GetAI(Creature* creature) const
+ {
+ return new boss_commander_sarannisAI(creature);
+ }
+};
+
+Position const PosSummonReinforcements[4] =
+{
+ { 160.4483f, 287.6435f, -3.887904f, 2.3841f },
+ { 153.4406f, 289.9929f, -4.736916f, 2.3841f },
+ { 154.4137f, 292.8956f, -4.683603f, 2.3841f },
+ { 157.1544f, 294.2599f, -4.726504f, 2.3841f }
+};
+
+enum Creatures
+{
+ NPC_SUMMONED_BLOODWARDER_MENDER = 20083,
+ NPC_SUMMONED_BLOODWARDER_RESERVIST = 20078
+};
+
+class spell_commander_sarannis_summon_reinforcements : public SpellScriptLoader
+{
+ public:
+ spell_commander_sarannis_summon_reinforcements() : SpellScriptLoader("spell_commander_sarannis_summon_reinforcements") { }
+
+ class spell_commander_sarannis_summon_reinforcements_SpellScript : public SpellScript
+ {
+ PrepareSpellScript(spell_commander_sarannis_summon_reinforcements_SpellScript);
+
+ void HandleCast(SpellEffIndex /*effIndex*/)
+ {
+ GetCaster()->SummonCreature(NPC_SUMMONED_BLOODWARDER_MENDER, PosSummonReinforcements[0], TEMPSUMMON_CORPSE_DESPAWN);
+ GetCaster()->SummonCreature(NPC_SUMMONED_BLOODWARDER_RESERVIST, PosSummonReinforcements[1], TEMPSUMMON_CORPSE_DESPAWN);
+ GetCaster()->SummonCreature(NPC_SUMMONED_BLOODWARDER_RESERVIST, PosSummonReinforcements[2], TEMPSUMMON_CORPSE_DESPAWN);
+ if (GetCaster()->GetMap()->IsHeroic())
+ GetCaster()->SummonCreature(NPC_SUMMONED_BLOODWARDER_RESERVIST, PosSummonReinforcements[3], TEMPSUMMON_CORPSE_DESPAWN);
+ }
+
+ void Register()
+ {
+ OnEffectHitTarget += SpellEffectFn(spell_commander_sarannis_summon_reinforcements_SpellScript::HandleCast, EFFECT_0, SPELL_EFFECT_DUMMY);
+ }
+ };
+
+ SpellScript* GetSpellScript() const
+ {
+ return new spell_commander_sarannis_summon_reinforcements_SpellScript();
+ }
+};
+
+void AddSC_boss_commander_sarannis()
+{
+ new boss_commander_sarannis();
+ new spell_commander_sarannis_summon_reinforcements();
+}
diff --git a/src/server/scripts/Outland/TempestKeep/botanica/boss_high_botanist_freywinn.cpp b/src/server/scripts/Outland/TempestKeep/botanica/boss_high_botanist_freywinn.cpp
index b3604d66d90..2ab527c2fd5 100644
--- a/src/server/scripts/Outland/TempestKeep/botanica/boss_high_botanist_freywinn.cpp
+++ b/src/server/scripts/Outland/TempestKeep/botanica/boss_high_botanist_freywinn.cpp
@@ -25,6 +25,7 @@ EndScriptData */
#include "ScriptMgr.h"
#include "ScriptedCreature.h"
+#include "the_botanica.h"
enum eSays
{
@@ -33,7 +34,7 @@ enum eSays
SAY_TREE = 2,
SAY_SUMMON = 3,
SAY_DEATH = 4,
- SAY_OOC_RANDOM = 5,
+ SAY_OOC_RANDOM = 5
};
enum eSpells
@@ -44,7 +45,7 @@ enum eSpells
SPELL_PLANT_WHITE = 34759,
SPELL_PLANT_GREEN = 34761,
SPELL_PLANT_BLUE = 34762,
- SPELL_PLANT_RED = 34763,
+ SPELL_PLANT_RED = 34763
};
#define ENTRY_FRAYER 19953
@@ -58,9 +59,9 @@ class boss_high_botanist_freywinn : public CreatureScript
{
}
- struct boss_high_botanist_freywinnAI : public ScriptedAI
+ struct boss_high_botanist_freywinnAI : public BossAI
{
- boss_high_botanist_freywinnAI(Creature* creature) : ScriptedAI(creature) {}
+ boss_high_botanist_freywinnAI(Creature* creature) : BossAI(creature, DATA_HIGH_BOTANIST_FREYWINN) { }
std::list<uint64> Adds_List;
diff --git a/src/server/scripts/Outland/TempestKeep/botanica/boss_laj.cpp b/src/server/scripts/Outland/TempestKeep/botanica/boss_laj.cpp
index b1a894d9b48..bd9195e44f8 100644
--- a/src/server/scripts/Outland/TempestKeep/botanica/boss_laj.cpp
+++ b/src/server/scripts/Outland/TempestKeep/botanica/boss_laj.cpp
@@ -25,6 +25,7 @@ EndScriptData */
#include "ScriptMgr.h"
#include "ScriptedCreature.h"
+#include "the_botanica.h"
enum eSpells
{
@@ -38,7 +39,7 @@ enum eSpells
SPELL_SUMMON_LASHER_3 = 34686,
SPELL_SUMMON_FLAYER_4 = 34687,
SPELL_SUMMON_LASHER_4 = 34688,
- SPELL_SUMMON_FLAYER_3 = 34690,
+ SPELL_SUMMON_FLAYER_3 = 34690
};
enum eOthers
{
@@ -47,7 +48,7 @@ enum eOthers
MODEL_ARCANE = 14213,
MODEL_FIRE = 13110,
MODEL_FROST = 14112,
- MODEL_NATURE = 14214,
+ MODEL_NATURE = 14214
};
class boss_laj : public CreatureScript
@@ -59,9 +60,9 @@ class boss_laj : public CreatureScript
{
}
- struct boss_lajAI : public ScriptedAI
+ struct boss_lajAI : public BossAI
{
- boss_lajAI(Creature* creature) : ScriptedAI(creature) {}
+ boss_lajAI(Creature* creature) : BossAI(creature, DATA_LAJ) { }
bool CanSummon;
uint32 Teleport_Timer;
diff --git a/src/server/scripts/Outland/TempestKeep/botanica/boss_thorngrin_the_tender.cpp b/src/server/scripts/Outland/TempestKeep/botanica/boss_thorngrin_the_tender.cpp
new file mode 100644
index 00000000000..ffd48f4dcb5
--- /dev/null
+++ b/src/server/scripts/Outland/TempestKeep/botanica/boss_thorngrin_the_tender.cpp
@@ -0,0 +1,152 @@
+/*
+ * Copyright (C) 2008-2013 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 "the_botanica.h"
+
+enum Says
+{
+ SAY_AGGRO = 0,
+ SAY_20_PERCENT_HP = 1,
+ SAY_KILL = 2,
+ SAY_CAST_SACRIFICE = 3,
+ SAY_50_PERCENT_HP = 4,
+ SAY_CAST_HELLFIRE = 5,
+ SAY_DEATH = 6,
+ EMOTE_ENRAGE = 7
+};
+
+enum Spells
+{
+ SPELL_SACRIFICE = 34661,
+ SPELL_HELLFIRE_NORMAL = 34659,
+ SPELL_HELLFIRE_HEROIC = 39131,
+ SPELL_ENRAGE = 34670
+};
+
+enum Events
+{
+ EVENT_SACRIFICE = 1,
+ EVENT_HELLFIRE = 2,
+ EVENT_ENRAGE = 3
+};
+
+class boss_thorngrin_the_tender : public CreatureScript
+{
+ public: boss_thorngrin_the_tender() : CreatureScript("thorngrin_the_tender") { }
+
+ struct boss_thorngrin_the_tenderAI : public BossAI
+ {
+ boss_thorngrin_the_tenderAI(Creature* creature) : BossAI(creature, DATA_THORNGRIN_THE_TENDER) { }
+
+ void Reset()
+ {
+ _Reset();
+ _phase1 = true;
+ _phase2 = true;
+ }
+
+ void EnterCombat(Unit* /*who*/)
+ {
+ _EnterCombat();
+ Talk(SAY_AGGRO);
+ events.ScheduleEvent(EVENT_SACRIFICE, 5700);
+ events.ScheduleEvent(EVENT_HELLFIRE, IsHeroic() ? urand(17400, 19300) : 18000);
+ events.ScheduleEvent(EVENT_ENRAGE, 12000);
+ }
+
+ void KilledUnit(Unit* /*victim*/)
+ {
+ Talk(SAY_KILL);
+ }
+
+ void JustDied(Unit* /*killer*/)
+ {
+ _JustDied();
+ Talk(SAY_DEATH);
+ }
+
+ void DamageTaken(Unit* /*killer*/, uint32 &damage)
+ {
+ if (me->HealthBelowPctDamaged(50, damage) && _phase1)
+ {
+ _phase1 = false;
+ Talk(SAY_50_PERCENT_HP);
+ }
+ if (me->HealthBelowPctDamaged(20, damage) && _phase2)
+ {
+ _phase2 = false;
+ Talk(SAY_20_PERCENT_HP);
+ }
+ }
+
+ void UpdateAI(uint32 const diff)
+ {
+ if (!UpdateVictim())
+ return;
+
+ events.Update(diff);
+
+ if (me->HasUnitState(UNIT_STATE_CASTING))
+ return;
+
+ while (uint32 eventId = events.ExecuteEvent())
+ {
+ switch (eventId)
+ {
+ case EVENT_SACRIFICE:
+ if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1, 0.0f, true))
+ {
+ Talk(SAY_CAST_SACRIFICE);
+ DoCast(target, SPELL_SACRIFICE, true);
+ }
+ events.ScheduleEvent(EVENT_SACRIFICE, 29400);
+ break;
+ case EVENT_HELLFIRE:
+ Talk(SAY_CAST_HELLFIRE);
+ DoCastVictim(DUNGEON_MODE(SPELL_HELLFIRE_NORMAL, SPELL_HELLFIRE_HEROIC), true);
+ events.ScheduleEvent(EVENT_HELLFIRE, IsHeroic() ? urand(17400, 19300) : 18000);
+ break;
+ case EVENT_ENRAGE:
+ Talk(EMOTE_ENRAGE);
+ DoCast(me, SPELL_ENRAGE);
+ events.ScheduleEvent(EVENT_ENRAGE, 33000);
+ break;
+ default:
+ break;
+ }
+ }
+
+ DoMeleeAttackIfReady();
+ }
+
+ private:
+ bool _phase1;
+ bool _phase2;
+ };
+
+ CreatureAI* GetAI(Creature* creature) const
+ {
+ return new boss_thorngrin_the_tenderAI(creature);
+ }
+};
+
+void AddSC_boss_thorngrin_the_tender()
+{
+ new boss_thorngrin_the_tender();
+}
diff --git a/src/server/scripts/Outland/TempestKeep/botanica/boss_warp_splinter.cpp b/src/server/scripts/Outland/TempestKeep/botanica/boss_warp_splinter.cpp
index 2ca1bb28f96..d2b6c44ec7b 100644
--- a/src/server/scripts/Outland/TempestKeep/botanica/boss_warp_splinter.cpp
+++ b/src/server/scripts/Outland/TempestKeep/botanica/boss_warp_splinter.cpp
@@ -25,6 +25,7 @@ EndScriptData */
#include "ScriptMgr.h"
#include "ScriptedCreature.h"
+#include "the_botanica.h"
enum eSays
{
@@ -40,13 +41,13 @@ enum eSpells
SUMMON_TREANTS = 34727, // DBC: 34727, 34731, 34733, 34734, 34736, 34739, 34741 (with Ancestral Life spell 34742) // won't work (guardian summon)
ARCANE_VOLLEY = 36705,
ARCANE_VOLLEY_H = 39133,
- SPELL_HEAL_FATHER = 6262,
+ SPELL_HEAL_FATHER = 6262
};
enum eOthers
{
CREATURE_TREANT = 19949,
- TREANT_SPAWN_DIST = 50, //50 yards from Warp Splinter's spawn point
+ TREANT_SPAWN_DIST = 50 //50 yards from Warp Splinter's spawn point
};
float treant_pos[6][3] =
@@ -134,9 +135,9 @@ class boss_warp_splinter : public CreatureScript
: CreatureScript("boss_warp_splinter")
{
}
- struct boss_warp_splinterAI : public ScriptedAI
+ struct boss_warp_splinterAI : public BossAI
{
- boss_warp_splinterAI(Creature* creature) : ScriptedAI(creature)
+ boss_warp_splinterAI(Creature* creature) : BossAI(creature, DATA_WARP_SPLINTER)
{
Treant_Spawn_Pos_X = creature->GetPositionX();
Treant_Spawn_Pos_Y = creature->GetPositionY();
diff --git a/src/server/scripts/Outland/TempestKeep/botanica/instance_the_botanica.cpp b/src/server/scripts/Outland/TempestKeep/botanica/instance_the_botanica.cpp
new file mode 100644
index 00000000000..69b95e8c813
--- /dev/null
+++ b/src/server/scripts/Outland/TempestKeep/botanica/instance_the_botanica.cpp
@@ -0,0 +1,164 @@
+/*
+ * Copyright (C) 2008-2013 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 "InstanceScript.h"
+#include "the_botanica.h"
+
+class instance_the_botanica : public InstanceMapScript
+{
+ public:
+ instance_the_botanica() : InstanceMapScript("instance_the_botanica", 553) { }
+
+ struct instance_the_botanica_InstanceMapScript : public InstanceScript
+ {
+ instance_the_botanica_InstanceMapScript(Map* map) : InstanceScript(map)
+ {
+ CommanderSarannisGUID = 0;
+ HighBotanistFreywinnGUID = 0;
+ ThorngrinTheTenderGUID = 0;
+ LajGUID = 0;
+ WarpSplinterGUID = 0;
+ }
+
+ void OnCreatureCreate(Creature* creature)
+ {
+ switch (creature->GetEntry())
+ {
+ case NPC_COMMANDER_SARANNIS:
+ CommanderSarannisGUID = creature->GetGUID();
+ break;
+ case NPC_HIGH_BOTANIST_FREYWINN:
+ HighBotanistFreywinnGUID = creature->GetGUID();
+ break;
+ case NPC_THORNGRIN_THE_TENDER:
+ ThorngrinTheTenderGUID = creature->GetGUID();
+ break;
+ case NPC_LAJ:
+ LajGUID = creature->GetGUID();
+ break;
+ case NPC_WARP_SPLINTER:
+ WarpSplinterGUID = creature->GetGUID();
+ break;
+ default:
+ break;
+ }
+ }
+
+ uint64 GetData64(uint32 type) const
+ {
+ switch (type)
+ {
+ case DATA_COMMANDER_SARANNIS:
+ return CommanderSarannisGUID;
+ case DATA_HIGH_BOTANIST_FREYWINN:
+ return HighBotanistFreywinnGUID;
+ case DATA_THORNGRIN_THE_TENDER:
+ return ThorngrinTheTenderGUID;
+ case DATA_LAJ:
+ return LajGUID;
+ case DATA_WARP_SPLINTER:
+ return WarpSplinterGUID;
+ default:
+ break;
+ }
+
+ return 0;
+ }
+
+ bool SetBossState(uint32 type, EncounterState state)
+ {
+ if (!InstanceScript::SetBossState(type, state))
+ return false;
+
+ switch (type)
+ {
+ case DATA_COMMANDER_SARANNIS:
+ case DATA_HIGH_BOTANIST_FREYWINN:
+ case DATA_THORNGRIN_THE_TENDER:
+ case DATA_LAJ:
+ case DATA_WARP_SPLINTER:
+ break;
+ default:
+ break;
+ }
+
+ return true;
+ }
+
+ std::string GetSaveData()
+ {
+ OUT_SAVE_INST_DATA;
+
+ std::ostringstream saveStream;
+ saveStream << "B O " << GetBossSaveData();
+
+ OUT_SAVE_INST_DATA_COMPLETE;
+ return saveStream.str();
+ }
+
+ void Load(char const* str)
+ {
+ if (!str)
+ {
+ OUT_LOAD_INST_DATA_FAIL;
+ return;
+ }
+
+ OUT_LOAD_INST_DATA(str);
+
+ char dataHead1, dataHead2;
+
+ std::istringstream loadStream(str);
+ loadStream >> dataHead1 >> dataHead2;
+
+ if (dataHead1 == 'B' && dataHead2 == 'O')
+ {
+ for (uint8 i = 0; i < EncounterCount; ++i)
+ {
+ uint32 tmpState;
+ loadStream >> tmpState;
+ if (tmpState == IN_PROGRESS || tmpState > SPECIAL)
+ tmpState = NOT_STARTED;
+
+ SetBossState(i, EncounterState(tmpState));
+ }
+ }
+ else
+ OUT_LOAD_INST_DATA_FAIL;
+
+ OUT_LOAD_INST_DATA_COMPLETE;
+ }
+
+ protected:
+ uint64 CommanderSarannisGUID;
+ uint64 HighBotanistFreywinnGUID;
+ uint64 ThorngrinTheTenderGUID;
+ uint64 LajGUID;
+ uint64 WarpSplinterGUID;
+ };
+
+ InstanceScript* GetInstanceScript(InstanceMap* map) const
+ {
+ return new instance_the_botanica_InstanceMapScript(map);
+ }
+};
+
+void AddSC_instance_the_botanica()
+{
+ new instance_the_botanica;
+}
diff --git a/src/server/scripts/Outland/TempestKeep/botanica/the_botanica.h b/src/server/scripts/Outland/TempestKeep/botanica/the_botanica.h
new file mode 100644
index 00000000000..d5657dc7048
--- /dev/null
+++ b/src/server/scripts/Outland/TempestKeep/botanica/the_botanica.h
@@ -0,0 +1,42 @@
+/*
+ * Copyright (C) 2008-2013 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/>.
+ */
+
+#ifndef DEF_THE_BOTANICA_H
+#define DEF_THE_BOTANICA_H
+
+uint32 const EncounterCount = 5;
+
+enum DataTypes
+{
+ DATA_COMMANDER_SARANNIS = 0,
+ DATA_HIGH_BOTANIST_FREYWINN = 1,
+ DATA_THORNGRIN_THE_TENDER = 2,
+ DATA_LAJ = 3,
+ DATA_WARP_SPLINTER = 4
+};
+
+enum CreatureIds
+{
+ NPC_COMMANDER_SARANNIS = 17976,
+ NPC_HIGH_BOTANIST_FREYWINN = 17975,
+ NPC_THORNGRIN_THE_TENDER = 17978,
+ NPC_LAJ = 17980,
+ NPC_WARP_SPLINTER = 17977
+};
+
+#endif
diff --git a/src/server/scripts/Outland/blades_edge_mountains.cpp b/src/server/scripts/Outland/zone_blades_edge_mountains.cpp
index d03abc82b9c..d03abc82b9c 100644
--- a/src/server/scripts/Outland/blades_edge_mountains.cpp
+++ b/src/server/scripts/Outland/zone_blades_edge_mountains.cpp
diff --git a/src/server/scripts/Outland/hellfire_peninsula.cpp b/src/server/scripts/Outland/zone_hellfire_peninsula.cpp
index 64b484268df..64b484268df 100644
--- a/src/server/scripts/Outland/hellfire_peninsula.cpp
+++ b/src/server/scripts/Outland/zone_hellfire_peninsula.cpp
diff --git a/src/server/scripts/Outland/nagrand.cpp b/src/server/scripts/Outland/zone_nagrand.cpp
index 0a92b985c95..0a92b985c95 100644
--- a/src/server/scripts/Outland/nagrand.cpp
+++ b/src/server/scripts/Outland/zone_nagrand.cpp
diff --git a/src/server/scripts/Outland/netherstorm.cpp b/src/server/scripts/Outland/zone_netherstorm.cpp
index 769ee7dc68d..769ee7dc68d 100644
--- a/src/server/scripts/Outland/netherstorm.cpp
+++ b/src/server/scripts/Outland/zone_netherstorm.cpp
diff --git a/src/server/scripts/Outland/shadowmoon_valley.cpp b/src/server/scripts/Outland/zone_shadowmoon_valley.cpp
index 0a016f0923c..0a016f0923c 100644
--- a/src/server/scripts/Outland/shadowmoon_valley.cpp
+++ b/src/server/scripts/Outland/zone_shadowmoon_valley.cpp
diff --git a/src/server/scripts/Outland/shattrath_city.cpp b/src/server/scripts/Outland/zone_shattrath_city.cpp
index ac26614ae69..ac26614ae69 100644
--- a/src/server/scripts/Outland/shattrath_city.cpp
+++ b/src/server/scripts/Outland/zone_shattrath_city.cpp
diff --git a/src/server/scripts/Outland/terokkar_forest.cpp b/src/server/scripts/Outland/zone_terokkar_forest.cpp
index 2b046a7518e..2b046a7518e 100644
--- a/src/server/scripts/Outland/terokkar_forest.cpp
+++ b/src/server/scripts/Outland/zone_terokkar_forest.cpp
diff --git a/src/server/scripts/Outland/zangarmarsh.cpp b/src/server/scripts/Outland/zone_zangarmarsh.cpp
index 319da372bf8..319da372bf8 100644
--- a/src/server/scripts/Outland/zangarmarsh.cpp
+++ b/src/server/scripts/Outland/zone_zangarmarsh.cpp
diff --git a/src/server/shared/Database/Field.h b/src/server/shared/Database/Field.h
index 6a2e53032ad..878b806ecb9 100644
--- a/src/server/shared/Database/Field.h
+++ b/src/server/shared/Database/Field.h
@@ -246,6 +246,11 @@ class Field
return std::string((char*)data.value);
}
+ bool IsNull() const
+ {
+ return data.value == NULL;
+ }
+
protected:
Field();
~Field();
diff --git a/src/server/shared/Database/Implementation/CharacterDatabase.cpp b/src/server/shared/Database/Implementation/CharacterDatabase.cpp
index 57268987450..cfbd4b2bc45 100644
--- a/src/server/shared/Database/Implementation/CharacterDatabase.cpp
+++ b/src/server/shared/Database/Implementation/CharacterDatabase.cpp
@@ -22,536 +22,559 @@ void CharacterDatabaseConnection::DoPrepareStatements()
if (!m_reconnecting)
m_stmts.resize(MAX_CHARACTERDATABASE_STATEMENTS);
- PREPARE_STATEMENT(CHAR_DEL_QUEST_POOL_SAVE, "DELETE FROM pool_quest_save WHERE pool_id = ?", CONNECTION_ASYNC)
- PREPARE_STATEMENT(CHAR_INS_QUEST_POOL_SAVE, "INSERT INTO pool_quest_save (pool_id, quest_id) VALUES (?, ?)", CONNECTION_ASYNC)
- PREPARE_STATEMENT(CHAR_DEL_NONEXISTENT_GUILD_BANK_ITEM, "DELETE FROM guild_bank_item WHERE guildid = ? AND TabId = ? AND SlotId = ?", CONNECTION_ASYNC)
- PREPARE_STATEMENT(CHAR_DEL_EXPIRED_BANS, "UPDATE character_banned SET active = 0 WHERE unbandate <= UNIX_TIMESTAMP() AND unbandate <> bandate", CONNECTION_ASYNC)
- PREPARE_STATEMENT(CHAR_SEL_GUID_BY_NAME, "SELECT guid FROM characters WHERE name = ?", CONNECTION_BOTH);
- PREPARE_STATEMENT(CHAR_SEL_CHECK_NAME, "SELECT 1 FROM characters WHERE name = ?", CONNECTION_BOTH);
- PREPARE_STATEMENT(CHAR_SEL_CHECK_GUID, "SELECT 1 FROM characters WHERE guid = ?", CONNECTION_SYNCH);
- PREPARE_STATEMENT(CHAR_SEL_SUM_CHARS, "SELECT COUNT(guid) FROM characters WHERE account = ?", CONNECTION_BOTH);
- PREPARE_STATEMENT(CHAR_SEL_CHAR_CREATE_INFO, "SELECT level, race, class FROM characters WHERE account = ? LIMIT 0, ?", CONNECTION_ASYNC);
- PREPARE_STATEMENT(CHAR_INS_CHARACTER_BAN, "INSERT INTO character_banned VALUES (?, UNIX_TIMESTAMP(), UNIX_TIMESTAMP()+?, ?, ?, 1)", CONNECTION_ASYNC)
- PREPARE_STATEMENT(CHAR_UPD_CHARACTER_BAN, "UPDATE character_banned SET active = 0 WHERE guid = ? AND active != 0", CONNECTION_ASYNC)
- PREPARE_STATEMENT(CHAR_DEL_CHARACTER_BAN, "DELETE cb FROM character_banned cb INNER JOIN characters c ON c.guid = cb.guid WHERE c.account = ?", CONNECTION_ASYNC);
- PREPARE_STATEMENT(CHAR_SEL_BANINFO, "SELECT FROM_UNIXTIME(bandate), unbandate-bandate, active, unbandate, banreason, bannedby FROM character_banned WHERE guid = ? ORDER BY bandate ASC", CONNECTION_SYNCH)
- PREPARE_STATEMENT(CHAR_SEL_GUID_BY_NAME_FILTER, "SELECT guid, name FROM characters WHERE name LIKE CONCAT('%%', ?, '%%')", CONNECTION_SYNCH)
- PREPARE_STATEMENT(CHAR_SEL_BANINFO_LIST, "SELECT bandate, unbandate, bannedby, banreason FROM character_banned WHERE guid = ? ORDER BY unbandate", CONNECTION_SYNCH)
- PREPARE_STATEMENT(CHAR_SEL_BANNED_NAME, "SELECT characters.name FROM characters, character_banned WHERE character_banned.guid = ? AND character_banned.guid = characters.guid", CONNECTION_SYNCH)
- PREPARE_STATEMENT(CHAR_SEL_ENUM, "SELECT c.guid, c.name, c.race, c.class, c.gender, c.playerBytes, c.playerBytes2, c.level, c.zone, c.map, c.position_x, c.position_y, c.position_z, gm.guildid, c.playerFlags, c.at_login, cp.entry, cp.modelid, cp.level, c.equipmentCache, cb.guid FROM characters AS c LEFT JOIN character_pet AS cp ON c.guid = cp.owner AND cp.slot = ? LEFT JOIN guild_member AS gm ON c.guid = gm.guid LEFT JOIN character_banned AS cb ON c.guid = cb.guid AND cb.active = 1 WHERE c.account = ? ORDER BY c.guid", CONNECTION_ASYNC);
- PREPARE_STATEMENT(CHAR_SEL_ENUM_DECLINED_NAME, "SELECT c.guid, c.name, c.race, c.class, c.gender, c.playerBytes, c.playerBytes2, c.level, c.zone, c.map, c.position_x, c.position_y, c.position_z, gm.guildid, c.playerFlags, c.at_login, cp.entry, cp.modelid, cp.level, c.equipmentCache, cb.guid, cd.genitive FROM characters AS c LEFT JOIN character_pet AS cp ON c.guid = cp.owner AND cp.slot = ? LEFT JOIN character_declinedname AS cd ON c.guid = cd.guid LEFT JOIN guild_member AS gm ON c.guid = gm.guid LEFT JOIN character_banned AS cb ON c.guid = cb.guid AND cb.active = 1 WHERE c.account = ? ORDER BY c.guid", CONNECTION_ASYNC);
- PREPARE_STATEMENT(CHAR_SEL_PET_SLOTS, "SELECT owner, slot FROM character_pet WHERE owner = ? AND slot >= ? AND slot <= ? ORDER BY slot", CONNECTION_ASYNC);
- PREPARE_STATEMENT(CHAR_SEL_PET_SLOTS_DETAIL, "SELECT owner, id, entry, level, name FROM character_pet WHERE owner = ? AND slot >= ? AND slot <= ? ORDER BY slot", CONNECTION_ASYNC);
- PREPARE_STATEMENT(CHAR_SEL_PET_ENTRY, "SELECT entry FROM character_pet WHERE owner = ? AND id = ? AND slot >= ? AND slot <= ?", CONNECTION_ASYNC);
- PREPARE_STATEMENT(CHAR_SEL_PET_SLOT_BY_ID, "SELECT slot, entry FROM character_pet WHERE owner = ? AND id = ?", CONNECTION_ASYNC);
- PREPARE_STATEMENT(CHAR_SEL_FREE_NAME, "SELECT guid, name FROM characters WHERE guid = ? AND account = ? AND (at_login & ?) = ? AND NOT EXISTS (SELECT NULL FROM characters WHERE name = ?)", CONNECTION_ASYNC);
- PREPARE_STATEMENT(CHAR_SEL_GUID_RACE_ACC_BY_NAME, "SELECT guid, race, account FROM characters WHERE name = ?", CONNECTION_BOTH);
- PREPARE_STATEMENT(CHAR_SEL_CHAR_RACE, "SELECT race FROM characters WHERE guid = ?", CONNECTION_SYNCH);
- PREPARE_STATEMENT(CHAR_SEL_CHAR_LEVEL, "SELECT level FROM characters WHERE guid = ?", CONNECTION_SYNCH);
- PREPARE_STATEMENT(CHAR_SEL_CHAR_ZONE, "SELECT zone FROM characters WHERE guid = ?", CONNECTION_SYNCH);
- PREPARE_STATEMENT(CHAR_SEL_CHARACTER_NAME_DATA, "SELECT race, class, gender, level FROM characters WHERE guid = ?", CONNECTION_SYNCH);
- PREPARE_STATEMENT(CHAR_SEL_CHAR_POSITION_XYZ, "SELECT map, position_x, position_y, position_z FROM characters WHERE guid = ?", CONNECTION_SYNCH);
- PREPARE_STATEMENT(CHAR_SEL_CHAR_POSITION, "SELECT position_x, position_y, position_z, orientation, map, taxi_path FROM characters WHERE guid = ?", CONNECTION_SYNCH);
- PREPARE_STATEMENT(CHAR_DEL_QUEST_STATUS_DAILY, "DELETE FROM character_queststatus_daily", CONNECTION_ASYNC);
- PREPARE_STATEMENT(CHAR_DEL_QUEST_STATUS_WEEKLY, "DELETE FROM character_queststatus_weekly", CONNECTION_ASYNC);
- PREPARE_STATEMENT(CHAR_DEL_QUEST_STATUS_MONTHLY, "DELETE FROM character_queststatus_monthly", CONNECTION_ASYNC);
- PREPARE_STATEMENT(CHAR_DEL_QUEST_STATUS_SEASONAL, "DELETE FROM character_queststatus_seasonal WHERE event = ?", CONNECTION_ASYNC);
- PREPARE_STATEMENT(CHAR_DEL_QUEST_STATUS_DAILY_CHAR, "DELETE FROM character_queststatus_daily WHERE guid = ?", CONNECTION_ASYNC);
- PREPARE_STATEMENT(CHAR_DEL_QUEST_STATUS_WEEKLY_CHAR, "DELETE FROM character_queststatus_weekly WHERE guid = ?", CONNECTION_ASYNC);
- PREPARE_STATEMENT(CHAR_DEL_QUEST_STATUS_MONTHLY_CHAR, "DELETE FROM character_queststatus_monthly WHERE guid = ?", CONNECTION_ASYNC);
- PREPARE_STATEMENT(CHAR_DEL_QUEST_STATUS_SEASONAL_CHAR, "DELETE FROM character_queststatus_seasonal WHERE guid = ?", CONNECTION_ASYNC);
- PREPARE_STATEMENT(CHAR_DEL_BATTLEGROUND_RANDOM, "DELETE FROM character_battleground_random", CONNECTION_ASYNC);
- PREPARE_STATEMENT(CHAR_INS_BATTLEGROUND_RANDOM, "INSERT INTO character_battleground_random (guid) VALUES (?)", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_QUEST_POOL_SAVE, "DELETE FROM pool_quest_save WHERE pool_id = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_INS_QUEST_POOL_SAVE, "INSERT INTO pool_quest_save (pool_id, quest_id) VALUES (?, ?)", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_NONEXISTENT_GUILD_BANK_ITEM, "DELETE FROM guild_bank_item WHERE guildid = ? AND TabId = ? AND SlotId = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_EXPIRED_BANS, "UPDATE character_banned SET active = 0 WHERE unbandate <= UNIX_TIMESTAMP() AND unbandate <> bandate", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_SEL_GUID_BY_NAME, "SELECT guid FROM characters WHERE name = ?", CONNECTION_BOTH);
+ PrepareStatement(CHAR_SEL_CHECK_NAME, "SELECT 1 FROM characters WHERE name = ?", CONNECTION_BOTH);
+ PrepareStatement(CHAR_SEL_CHECK_GUID, "SELECT 1 FROM characters WHERE guid = ?", CONNECTION_SYNCH);
+ PrepareStatement(CHAR_SEL_SUM_CHARS, "SELECT COUNT(guid) FROM characters WHERE account = ?", CONNECTION_BOTH);
+ PrepareStatement(CHAR_SEL_CHAR_CREATE_INFO, "SELECT level, race, class FROM characters WHERE account = ? LIMIT 0, ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_INS_CHARACTER_BAN, "INSERT INTO character_banned VALUES (?, UNIX_TIMESTAMP(), UNIX_TIMESTAMP()+?, ?, ?, 1)", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_UPD_CHARACTER_BAN, "UPDATE character_banned SET active = 0 WHERE guid = ? AND active != 0", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_CHARACTER_BAN, "DELETE cb FROM character_banned cb INNER JOIN characters c ON c.guid = cb.guid WHERE c.account = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_SEL_BANINFO, "SELECT FROM_UNIXTIME(bandate), unbandate-bandate, active, unbandate, banreason, bannedby FROM character_banned WHERE guid = ? ORDER BY bandate ASC", CONNECTION_SYNCH);
+ PrepareStatement(CHAR_SEL_GUID_BY_NAME_FILTER, "SELECT guid, name FROM characters WHERE name LIKE CONCAT('%%', ?, '%%')", CONNECTION_SYNCH);
+ PrepareStatement(CHAR_SEL_BANINFO_LIST, "SELECT bandate, unbandate, bannedby, banreason FROM character_banned WHERE guid = ? ORDER BY unbandate", CONNECTION_SYNCH);
+ PrepareStatement(CHAR_SEL_BANNED_NAME, "SELECT characters.name FROM characters, character_banned WHERE character_banned.guid = ? AND character_banned.guid = characters.guid", CONNECTION_SYNCH);
+ PrepareStatement(CHAR_SEL_ENUM, "SELECT c.guid, c.name, c.race, c.class, c.gender, c.playerBytes, c.playerBytes2, c.level, c.zone, c.map, c.position_x, c.position_y, c.position_z, "
+ "gm.guildid, c.playerFlags, c.at_login, cp.entry, cp.modelid, cp.level, c.equipmentCache, cb.guid "
+ "FROM characters AS c LEFT JOIN character_pet AS cp ON c.guid = cp.owner AND cp.slot = ? LEFT JOIN guild_member AS gm ON c.guid = gm.guid "
+ "LEFT JOIN character_banned AS cb ON c.guid = cb.guid AND cb.active = 1 WHERE c.account = ? ORDER BY c.guid", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_SEL_ENUM_DECLINED_NAME, "SELECT c.guid, c.name, c.race, c.class, c.gender, c.playerBytes, c.playerBytes2, c.level, c.zone, c.map, "
+ "c.position_x, c.position_y, c.position_z, gm.guildid, c.playerFlags, c.at_login, cp.entry, cp.modelid, cp.level, c.equipmentCache, "
+ "cb.guid, cd.genitive FROM characters AS c LEFT JOIN character_pet AS cp ON c.guid = cp.owner AND cp.slot = ? "
+ "LEFT JOIN character_declinedname AS cd ON c.guid = cd.guid LEFT JOIN guild_member AS gm ON c.guid = gm.guid "
+ "LEFT JOIN character_banned AS cb ON c.guid = cb.guid AND cb.active = 1 WHERE c.account = ? ORDER BY c.guid", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_SEL_FREE_NAME, "SELECT guid, name FROM characters WHERE guid = ? AND account = ? AND (at_login & ?) = ? AND NOT EXISTS (SELECT NULL FROM characters WHERE name = ?)", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_SEL_GUID_RACE_ACC_BY_NAME, "SELECT guid, race, account FROM characters WHERE name = ?", CONNECTION_BOTH);
+ PrepareStatement(CHAR_SEL_CHAR_RACE, "SELECT race FROM characters WHERE guid = ?", CONNECTION_SYNCH);
+ PrepareStatement(CHAR_SEL_CHAR_LEVEL, "SELECT level FROM characters WHERE guid = ?", CONNECTION_SYNCH);
+ PrepareStatement(CHAR_SEL_CHAR_ZONE, "SELECT zone FROM characters WHERE guid = ?", CONNECTION_SYNCH);
+ PrepareStatement(CHAR_SEL_CHARACTER_NAME_DATA, "SELECT race, class, gender, level FROM characters WHERE guid = ?", CONNECTION_SYNCH);
+ PrepareStatement(CHAR_SEL_CHAR_POSITION_XYZ, "SELECT map, position_x, position_y, position_z FROM characters WHERE guid = ?", CONNECTION_SYNCH);
+ PrepareStatement(CHAR_SEL_CHAR_POSITION, "SELECT position_x, position_y, position_z, orientation, map, taxi_path FROM characters WHERE guid = ?", CONNECTION_SYNCH);
+ PrepareStatement(CHAR_DEL_QUEST_STATUS_DAILY, "DELETE FROM character_queststatus_daily", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_QUEST_STATUS_WEEKLY, "DELETE FROM character_queststatus_weekly", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_QUEST_STATUS_MONTHLY, "DELETE FROM character_queststatus_monthly", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_QUEST_STATUS_SEASONAL, "DELETE FROM character_queststatus_seasonal WHERE event = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_QUEST_STATUS_DAILY_CHAR, "DELETE FROM character_queststatus_daily WHERE guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_QUEST_STATUS_WEEKLY_CHAR, "DELETE FROM character_queststatus_weekly WHERE guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_QUEST_STATUS_MONTHLY_CHAR, "DELETE FROM character_queststatus_monthly WHERE guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_QUEST_STATUS_SEASONAL_CHAR, "DELETE FROM character_queststatus_seasonal WHERE guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_BATTLEGROUND_RANDOM, "DELETE FROM character_battleground_random", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_INS_BATTLEGROUND_RANDOM, "INSERT INTO character_battleground_random (guid) VALUES (?)", CONNECTION_ASYNC);
// Start LoginQueryHolder content
- PREPARE_STATEMENT(CHAR_SEL_CHARACTER, "SELECT guid, account, name, race, class, gender, level, xp, money, playerBytes, playerBytes2, playerFlags, "
- "position_x, position_y, position_z, map, orientation, taximask, cinematic, totaltime, leveltime, rest_bonus, logout_time, is_logout_resting, resettalents_cost, "
- "resettalents_time, trans_x, trans_y, trans_z, trans_o, transguid, extra_flags, stable_slots, at_login, zone, online, death_expire_time, taxi_path, instance_mode_mask, "
- "arenaPoints, totalHonorPoints, todayHonorPoints, yesterdayHonorPoints, totalKills, todayKills, yesterdayKills, chosenTitle, knownCurrencies, watchedFaction, drunk, "
- "health, power1, power2, power3, power4, power5, power6, power7, instance_id, speccount, activespec, exploredZones, equipmentCache, ammoId, knownTitles, actionBars, grantableLevels FROM characters WHERE guid = ?", CONNECTION_ASYNC)
- PREPARE_STATEMENT(CHAR_SEL_GROUP_MEMBER, "SELECT guid FROM group_member WHERE memberGuid = ?", CONNECTION_BOTH)
- PREPARE_STATEMENT(CHAR_SEL_CHARACTER_INSTANCE, "SELECT id, permanent, map, difficulty, resettime FROM character_instance LEFT JOIN instance ON instance = id WHERE guid = ?", CONNECTION_ASYNC)
- PREPARE_STATEMENT(CHAR_SEL_CHARACTER_AURAS, "SELECT caster_guid, spell, effect_mask, recalculate_mask, stackcount, amount0, amount1, amount2, "
- "base_amount0, base_amount1, base_amount2, maxduration, remaintime, remaincharges FROM character_aura WHERE guid = ?", CONNECTION_ASYNC)
- PREPARE_STATEMENT(CHAR_SEL_CHARACTER_SPELL, "SELECT spell, active, disabled FROM character_spell WHERE guid = ?", CONNECTION_ASYNC)
- PREPARE_STATEMENT(CHAR_SEL_CHARACTER_QUESTSTATUS, "SELECT quest, status, explored, timer, mobcount1, mobcount2, mobcount3, mobcount4, "
- "itemcount1, itemcount2, itemcount3, itemcount4, playercount FROM character_queststatus WHERE guid = ? AND status <> 0", CONNECTION_ASYNC)
- PREPARE_STATEMENT(CHAR_SEL_CHARACTER_DAILYQUESTSTATUS, "SELECT quest, time FROM character_queststatus_daily WHERE guid = ?", CONNECTION_ASYNC)
- PREPARE_STATEMENT(CHAR_SEL_CHARACTER_WEEKLYQUESTSTATUS, "SELECT quest FROM character_queststatus_weekly WHERE guid = ?", CONNECTION_ASYNC)
- PREPARE_STATEMENT(CHAR_SEL_CHARACTER_MONTHLYQUESTSTATUS, "SELECT quest FROM character_queststatus_monthly WHERE guid = ?", CONNECTION_ASYNC);
- PREPARE_STATEMENT(CHAR_SEL_CHARACTER_SEASONALQUESTSTATUS, "SELECT quest, event FROM character_queststatus_seasonal WHERE guid = ?", CONNECTION_ASYNC)
- PREPARE_STATEMENT(CHAR_INS_CHARACTER_DAILYQUESTSTATUS, "INSERT INTO character_queststatus_daily (guid, quest, time) VALUES (?, ?, ?)", CONNECTION_ASYNC)
- PREPARE_STATEMENT(CHAR_INS_CHARACTER_WEEKLYQUESTSTATUS, "INSERT INTO character_queststatus_weekly (guid, quest) VALUES (?, ?)", CONNECTION_ASYNC)
- PREPARE_STATEMENT(CHAR_INS_CHARACTER_MONTHLYQUESTSTATUS, "INSERT INTO character_queststatus_monthly (guid, quest) VALUES (?, ?)", CONNECTION_ASYNC)
- PREPARE_STATEMENT(CHAR_INS_CHARACTER_SEASONALQUESTSTATUS, "INSERT INTO character_queststatus_seasonal (guid, quest, event) VALUES (?, ?, ?)", CONNECTION_ASYNC)
- PREPARE_STATEMENT(CHAR_SEL_CHARACTER_REPUTATION, "SELECT faction, standing, flags FROM character_reputation WHERE guid = ?", CONNECTION_ASYNC)
- PREPARE_STATEMENT(CHAR_SEL_CHARACTER_INVENTORY, "SELECT creatorGuid, giftCreatorGuid, count, duration, charges, flags, enchantments, randomPropertyId, durability, playedTime, text, bag, slot, "
- "item, itemEntry FROM character_inventory ci JOIN item_instance ii ON ci.item = ii.guid WHERE ci.guid = ? ORDER BY bag, slot", CONNECTION_ASYNC)
- PREPARE_STATEMENT(CHAR_SEL_CHARACTER_ACTIONS, "SELECT a.button, a.action, a.type FROM character_action as a, characters as c WHERE a.guid = c.guid AND a.spec = c.activespec AND a.guid = ? ORDER BY button", CONNECTION_ASYNC)
- PREPARE_STATEMENT(CHAR_SEL_CHARACTER_MAILCOUNT, "SELECT COUNT(id) FROM mail WHERE receiver = ? AND (checked & 1) = 0 AND deliver_time <= ?", CONNECTION_ASYNC)
- PREPARE_STATEMENT(CHAR_SEL_CHARACTER_MAILDATE, "SELECT MIN(deliver_time) FROM mail WHERE receiver = ? AND (checked & 1) = 0", CONNECTION_ASYNC)
- PREPARE_STATEMENT(CHAR_SEL_MAIL_COUNT, "SELECT COUNT(*) FROM mail WHERE receiver = ?", CONNECTION_SYNCH);
- PREPARE_STATEMENT(CHAR_SEL_CHARACTER_SOCIALLIST, "SELECT friend, flags, note FROM character_social JOIN characters ON characters.guid = character_social.friend WHERE character_social.guid = ? AND deleteinfos_name IS NULL LIMIT 255", CONNECTION_ASYNC)
- PREPARE_STATEMENT(CHAR_SEL_CHARACTER_HOMEBIND, "SELECT mapId, zoneId, posX, posY, posZ FROM character_homebind WHERE guid = ?", CONNECTION_ASYNC)
- PREPARE_STATEMENT(CHAR_SEL_CHARACTER_SPELLCOOLDOWNS, "SELECT spell, item, time FROM character_spell_cooldown WHERE guid = ?", CONNECTION_ASYNC)
- PREPARE_STATEMENT(CHAR_SEL_CHARACTER_DECLINEDNAMES, "SELECT genitive, dative, accusative, instrumental, prepositional FROM character_declinedname WHERE guid = ?", CONNECTION_ASYNC)
- PREPARE_STATEMENT(CHAR_SEL_GUILD_MEMBER, "SELECT guildid, rank FROM guild_member WHERE guid = ?", CONNECTION_BOTH)
- PREPARE_STATEMENT(CHAR_SEL_CHARACTER_ACHIEVEMENTS, "SELECT achievement, date FROM character_achievement WHERE guid = ?", CONNECTION_ASYNC)
- PREPARE_STATEMENT(CHAR_SEL_CHARACTER_CRITERIAPROGRESS, "SELECT criteria, counter, date FROM character_achievement_progress WHERE guid = ?", CONNECTION_ASYNC)
- PREPARE_STATEMENT(CHAR_SEL_CHARACTER_EQUIPMENTSETS, "SELECT setguid, setindex, name, iconname, ignore_mask, item0, item1, item2, item3, item4, item5, item6, item7, item8, "
- "item9, item10, item11, item12, item13, item14, item15, item16, item17, item18 FROM character_equipmentsets WHERE guid = ? ORDER BY setindex", CONNECTION_ASYNC)
- PREPARE_STATEMENT(CHAR_SEL_CHARACTER_BGDATA, "SELECT instanceId, team, joinX, joinY, joinZ, joinO, joinMapId, taxiStart, taxiEnd, mountSpell FROM character_battleground_data WHERE guid = ?", CONNECTION_ASYNC)
- PREPARE_STATEMENT(CHAR_SEL_CHARACTER_GLYPHS, "SELECT spec, glyph1, glyph2, glyph3, glyph4, glyph5, glyph6 FROM character_glyphs WHERE guid = ?", CONNECTION_ASYNC)
- PREPARE_STATEMENT(CHAR_SEL_CHARACTER_TALENTS, "SELECT spell, spec FROM character_talent WHERE guid = ?", CONNECTION_ASYNC)
- PREPARE_STATEMENT(CHAR_SEL_CHARACTER_SKILLS, "SELECT skill, value, max FROM character_skills WHERE guid = ?", CONNECTION_ASYNC)
- PREPARE_STATEMENT(CHAR_SEL_CHARACTER_RANDOMBG, "SELECT guid FROM character_battleground_random WHERE guid = ?", CONNECTION_ASYNC)
- PREPARE_STATEMENT(CHAR_SEL_CHARACTER_BANNED, "SELECT guid FROM character_banned WHERE guid = ? AND active = 1", CONNECTION_ASYNC)
- PREPARE_STATEMENT(CHAR_SEL_CHARACTER_QUESTSTATUSREW, "SELECT quest FROM character_queststatus_rewarded WHERE guid = ?", CONNECTION_ASYNC)
- PREPARE_STATEMENT(CHAR_SEL_ACCOUNT_INSTANCELOCKTIMES, "SELECT instanceId, releaseTime FROM account_instance_times WHERE accountId = ?", CONNECTION_ASYNC)
+ PrepareStatement(CHAR_SEL_CHARACTER, "SELECT guid, account, name, race, class, gender, level, xp, money, playerBytes, playerBytes2, playerFlags, "
+ "position_x, position_y, position_z, map, orientation, taximask, cinematic, totaltime, leveltime, rest_bonus, logout_time, is_logout_resting, resettalents_cost, "
+ "resettalents_time, trans_x, trans_y, trans_z, trans_o, transguid, extra_flags, stable_slots, at_login, zone, online, death_expire_time, taxi_path, instance_mode_mask, "
+ "arenaPoints, totalHonorPoints, todayHonorPoints, yesterdayHonorPoints, totalKills, todayKills, yesterdayKills, chosenTitle, knownCurrencies, watchedFaction, drunk, "
+ "health, power1, power2, power3, power4, power5, power6, power7, instance_id, speccount, activespec, exploredZones, equipmentCache, ammoId, knownTitles, actionBars, grantableLevels "
+ "FROM characters WHERE guid = ?", CONNECTION_ASYNC);
+
+ PrepareStatement(CHAR_SEL_GROUP_MEMBER, "SELECT guid FROM group_member WHERE memberGuid = ?", CONNECTION_BOTH);
+ PrepareStatement(CHAR_SEL_CHARACTER_INSTANCE, "SELECT id, permanent, map, difficulty, resettime FROM character_instance LEFT JOIN instance ON instance = id WHERE guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_SEL_CHARACTER_AURAS, "SELECT caster_guid, spell, effect_mask, recalculate_mask, stackcount, amount0, amount1, amount2, "
+ "base_amount0, base_amount1, base_amount2, maxduration, remaintime, remaincharges FROM character_aura WHERE guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_SEL_CHARACTER_SPELL, "SELECT spell, active, disabled FROM character_spell WHERE guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_SEL_CHARACTER_QUESTSTATUS, "SELECT quest, status, explored, timer, mobcount1, mobcount2, mobcount3, mobcount4, "
+ "itemcount1, itemcount2, itemcount3, itemcount4, playercount FROM character_queststatus WHERE guid = ? AND status <> 0", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_SEL_CHARACTER_DAILYQUESTSTATUS, "SELECT quest, time FROM character_queststatus_daily WHERE guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_SEL_CHARACTER_WEEKLYQUESTSTATUS, "SELECT quest FROM character_queststatus_weekly WHERE guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_SEL_CHARACTER_MONTHLYQUESTSTATUS, "SELECT quest FROM character_queststatus_monthly WHERE guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_SEL_CHARACTER_SEASONALQUESTSTATUS, "SELECT quest, event FROM character_queststatus_seasonal WHERE guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_INS_CHARACTER_DAILYQUESTSTATUS, "INSERT INTO character_queststatus_daily (guid, quest, time) VALUES (?, ?, ?)", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_INS_CHARACTER_WEEKLYQUESTSTATUS, "INSERT INTO character_queststatus_weekly (guid, quest) VALUES (?, ?)", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_INS_CHARACTER_MONTHLYQUESTSTATUS, "INSERT INTO character_queststatus_monthly (guid, quest) VALUES (?, ?)", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_INS_CHARACTER_SEASONALQUESTSTATUS, "INSERT INTO character_queststatus_seasonal (guid, quest, event) VALUES (?, ?, ?)", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_SEL_CHARACTER_REPUTATION, "SELECT faction, standing, flags FROM character_reputation WHERE guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_SEL_CHARACTER_INVENTORY, "SELECT creatorGuid, giftCreatorGuid, count, duration, charges, flags, enchantments, randomPropertyId, durability, playedTime, text, bag, slot, "
+ "item, itemEntry FROM character_inventory ci JOIN item_instance ii ON ci.item = ii.guid WHERE ci.guid = ? ORDER BY bag, slot", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_SEL_CHARACTER_ACTIONS, "SELECT a.button, a.action, a.type FROM character_action as a, characters as c WHERE a.guid = c.guid AND a.spec = c.activespec AND a.guid = ? ORDER BY button", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_SEL_CHARACTER_MAILCOUNT, "SELECT COUNT(id) FROM mail WHERE receiver = ? AND (checked & 1) = 0 AND deliver_time <= ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_SEL_CHARACTER_MAILDATE, "SELECT MIN(deliver_time) FROM mail WHERE receiver = ? AND (checked & 1) = 0", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_SEL_MAIL_COUNT, "SELECT COUNT(*) FROM mail WHERE receiver = ?", CONNECTION_SYNCH);
+ PrepareStatement(CHAR_SEL_CHARACTER_SOCIALLIST, "SELECT friend, flags, note FROM character_social JOIN characters ON characters.guid = character_social.friend WHERE character_social.guid = ? AND deleteinfos_name IS NULL LIMIT 255", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_SEL_CHARACTER_HOMEBIND, "SELECT mapId, zoneId, posX, posY, posZ FROM character_homebind WHERE guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_SEL_CHARACTER_SPELLCOOLDOWNS, "SELECT spell, item, time FROM character_spell_cooldown WHERE guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_SEL_CHARACTER_DECLINEDNAMES, "SELECT genitive, dative, accusative, instrumental, prepositional FROM character_declinedname WHERE guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_SEL_GUILD_MEMBER, "SELECT guildid, rank FROM guild_member WHERE guid = ?", CONNECTION_BOTH);
+ PrepareStatement(CHAR_SEL_CHARACTER_ACHIEVEMENTS, "SELECT achievement, date FROM character_achievement WHERE guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_SEL_CHARACTER_CRITERIAPROGRESS, "SELECT criteria, counter, date FROM character_achievement_progress WHERE guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_SEL_CHARACTER_EQUIPMENTSETS, "SELECT setguid, setindex, name, iconname, ignore_mask, item0, item1, item2, item3, item4, item5, item6, item7, item8, "
+ "item9, item10, item11, item12, item13, item14, item15, item16, item17, item18 FROM character_equipmentsets WHERE guid = ? ORDER BY setindex", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_SEL_CHARACTER_BGDATA, "SELECT instanceId, team, joinX, joinY, joinZ, joinO, joinMapId, taxiStart, taxiEnd, mountSpell FROM character_battleground_data WHERE guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_SEL_CHARACTER_GLYPHS, "SELECT spec, glyph1, glyph2, glyph3, glyph4, glyph5, glyph6 FROM character_glyphs WHERE guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_SEL_CHARACTER_TALENTS, "SELECT spell, spec FROM character_talent WHERE guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_SEL_CHARACTER_SKILLS, "SELECT skill, value, max FROM character_skills WHERE guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_SEL_CHARACTER_RANDOMBG, "SELECT guid FROM character_battleground_random WHERE guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_SEL_CHARACTER_BANNED, "SELECT guid FROM character_banned WHERE guid = ? AND active = 1", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_SEL_CHARACTER_QUESTSTATUSREW, "SELECT quest FROM character_queststatus_rewarded WHERE guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_SEL_ACCOUNT_INSTANCELOCKTIMES, "SELECT instanceId, releaseTime FROM account_instance_times WHERE accountId = ?", CONNECTION_ASYNC);
// End LoginQueryHolder content
- PREPARE_STATEMENT(CHAR_SEL_CHARACTER_ACTIONS_SPEC, "SELECT button, action, type FROM character_action WHERE guid = ? AND spec = ? ORDER BY button", CONNECTION_SYNCH)
- PREPARE_STATEMENT(CHAR_SEL_MAILITEMS, "SELECT creatorGuid, giftCreatorGuid, count, duration, charges, flags, enchantments, randomPropertyId, durability, playedTime, text, item_guid, itemEntry, owner_guid FROM mail_items mi JOIN item_instance ii ON mi.item_guid = ii.guid WHERE mail_id = ?", CONNECTION_SYNCH)
- PREPARE_STATEMENT(CHAR_SEL_AUCTION_ITEMS, "SELECT creatorGuid, giftCreatorGuid, count, duration, charges, flags, enchantments, randomPropertyId, durability, playedTime, text, itemguid, itemEntry FROM auctionhouse ah JOIN item_instance ii ON ah.itemguid = ii.guid", CONNECTION_SYNCH)
- PREPARE_STATEMENT(CHAR_SEL_AUCTIONS, "SELECT id, auctioneerguid, itemguid, itemEntry, count, itemowner, buyoutprice, time, buyguid, lastbid, startbid, deposit FROM auctionhouse ah INNER JOIN item_instance ii ON ii.guid = ah.itemguid", CONNECTION_SYNCH)
- PREPARE_STATEMENT(CHAR_INS_AUCTION, "INSERT INTO auctionhouse (id, auctioneerguid, itemguid, itemowner, buyoutprice, time, buyguid, lastbid, startbid, deposit) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", CONNECTION_ASYNC)
- PREPARE_STATEMENT(CHAR_DEL_AUCTION, "DELETE FROM auctionhouse WHERE id = ?", CONNECTION_ASYNC)
- PREPARE_STATEMENT(CHAR_SEL_AUCTION_BY_TIME, "SELECT id FROM auctionhouse WHERE time <= ? ORDER BY TIME ASC", CONNECTION_SYNCH);
- PREPARE_STATEMENT(CHAR_UPD_AUCTION_BID, "UPDATE auctionhouse SET buyguid = ?, lastbid = ? WHERE id = ?", CONNECTION_ASYNC);
- PREPARE_STATEMENT(CHAR_INS_MAIL, "INSERT INTO mail(id, messageType, stationery, mailTemplateId, sender, receiver, subject, body, has_items, expire_time, deliver_time, money, cod, checked) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", CONNECTION_ASYNC)
- PREPARE_STATEMENT(CHAR_DEL_MAIL_BY_ID, "DELETE FROM mail WHERE id = ?", CONNECTION_ASYNC)
- PREPARE_STATEMENT(CHAR_INS_MAIL_ITEM, "INSERT INTO mail_items(mail_id, item_guid, receiver) VALUES (?, ?, ?)", CONNECTION_ASYNC)
- PREPARE_STATEMENT(CHAR_DEL_MAIL_ITEM, "DELETE FROM mail_items WHERE item_guid = ?", CONNECTION_ASYNC);
- PREPARE_STATEMENT(CHAR_DEL_INVALID_MAIL_ITEM, "DELETE FROM mail_items WHERE item_guid = ?", CONNECTION_ASYNC);
- PREPARE_STATEMENT(CHAR_DEL_EMPTY_EXPIRED_MAIL, "DELETE FROM mail WHERE expire_time < ? AND has_items = 0 AND body = ''", CONNECTION_ASYNC)
- PREPARE_STATEMENT(CHAR_SEL_EXPIRED_MAIL, "SELECT id, messageType, sender, receiver, has_items, expire_time, cod, checked, mailTemplateId FROM mail WHERE expire_time < ?", CONNECTION_SYNCH)
- PREPARE_STATEMENT(CHAR_SEL_EXPIRED_MAIL_ITEMS, "SELECT item_guid, itemEntry, mail_id FROM mail_items mi INNER JOIN item_instance ii ON ii.guid = mi.item_guid LEFT JOIN mail mm ON mi.mail_id = mm.id WHERE mm.id IS NOT NULL AND mm.expire_time < ?", CONNECTION_SYNCH)
- PREPARE_STATEMENT(CHAR_UPD_MAIL_RETURNED, "UPDATE mail SET sender = ?, receiver = ?, expire_time = ?, deliver_time = ?, cod = 0, checked = ? WHERE id = ?", CONNECTION_ASYNC)
- PREPARE_STATEMENT(CHAR_UPD_MAIL_ITEM_RECEIVER, "UPDATE mail_items SET receiver = ? WHERE item_guid = ?", CONNECTION_ASYNC)
- PREPARE_STATEMENT(CHAR_UPD_ITEM_OWNER, "UPDATE item_instance SET owner_guid = ? WHERE guid = ?", CONNECTION_ASYNC)
-
- PREPARE_STATEMENT(CHAR_SEL_ITEM_REFUNDS, "SELECT player_guid, paidMoney, paidExtendedCost FROM item_refund_instance WHERE item_guid = ? AND player_guid = ? LIMIT 1", CONNECTION_SYNCH)
- PREPARE_STATEMENT(CHAR_SEL_ITEM_BOP_TRADE, "SELECT allowedPlayers FROM item_soulbound_trade_data WHERE itemGuid = ? LIMIT 1", CONNECTION_SYNCH)
- PREPARE_STATEMENT(CHAR_DEL_ITEM_BOP_TRADE, "DELETE FROM item_soulbound_trade_data WHERE itemGuid = ? LIMIT 1", CONNECTION_ASYNC)
- PREPARE_STATEMENT(CHAR_INS_ITEM_BOP_TRADE, "INSERT INTO item_soulbound_trade_data VALUES (?, ?)", CONNECTION_ASYNC)
- PREPARE_STATEMENT(CHAR_REP_INVENTORY_ITEM, "REPLACE INTO character_inventory (guid, bag, slot, item) VALUES (?, ?, ?, ?)", CONNECTION_ASYNC)
- PREPARE_STATEMENT(CHAR_REP_ITEM_INSTANCE, "REPLACE INTO item_instance (itemEntry, owner_guid, creatorGuid, giftCreatorGuid, count, duration, charges, flags, enchantments, randomPropertyId, durability, playedTime, text, guid) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", CONNECTION_ASYNC)
- PREPARE_STATEMENT(CHAR_UPD_ITEM_INSTANCE, "UPDATE item_instance SET itemEntry = ?, owner_guid = ?, creatorGuid = ?, giftCreatorGuid = ?, count = ?, duration = ?, charges = ?, flags = ?, enchantments = ?, randomPropertyId = ?, durability = ?, playedTime = ?, text = ? WHERE guid = ?", CONNECTION_ASYNC)
- PREPARE_STATEMENT(CHAR_UPD_ITEM_INSTANCE_ON_LOAD, "UPDATE item_instance SET duration = ?, flags = ?, durability = ? WHERE guid = ?", CONNECTION_ASYNC)
- PREPARE_STATEMENT(CHAR_DEL_ITEM_INSTANCE, "DELETE FROM item_instance WHERE guid = ?", CONNECTION_ASYNC)
- PREPARE_STATEMENT(CHAR_UPD_GIFT_OWNER, "UPDATE character_gifts SET guid = ? WHERE item_guid = ?", CONNECTION_ASYNC)
- PREPARE_STATEMENT(CHAR_DEL_GIFT, "DELETE FROM character_gifts WHERE item_guid = ?", CONNECTION_ASYNC)
- PREPARE_STATEMENT(CHAR_SEL_CHARACTER_GIFT_BY_ITEM, "SELECT entry, flags FROM character_gifts WHERE item_guid = ?", CONNECTION_SYNCH);
- PREPARE_STATEMENT(CHAR_SEL_ACCOUNT_BY_NAME, "SELECT account FROM characters WHERE name = ?", CONNECTION_SYNCH)
- PREPARE_STATEMENT(CHAR_SEL_ACCOUNT_BY_GUID, "SELECT account FROM characters WHERE guid = ?", CONNECTION_SYNCH);
- PREPARE_STATEMENT(CHAR_SEL_CHARACTER_DATA_BY_GUID, "SELECT account, name, level FROM characters WHERE guid = ?", CONNECTION_SYNCH);
- PREPARE_STATEMENT(CHAR_DEL_ACCOUNT_INSTANCE_LOCK_TIMES, "DELETE FROM account_instance_times WHERE accountId = ?", CONNECTION_ASYNC)
- PREPARE_STATEMENT(CHAR_INS_ACCOUNT_INSTANCE_LOCK_TIMES, "INSERT INTO account_instance_times (accountId, instanceId, releaseTime) VALUES (?, ?, ?)", CONNECTION_ASYNC)
- PREPARE_STATEMENT(CHAR_SEL_CHARACTER_NAME_CLASS, "SELECT name, class FROM characters WHERE guid = ?", CONNECTION_SYNCH);
- PREPARE_STATEMENT(CHAR_SEL_CHARACTER_NAME, "SELECT name FROM characters WHERE guid = ?", CONNECTION_SYNCH);
- PREPARE_STATEMENT(CHAR_SEL_MATCH_MAKER_RATING, "SELECT matchMakerRating FROM character_arena_stats WHERE guid = ? AND slot = ?", CONNECTION_SYNCH);
- PREPARE_STATEMENT(CHAR_SEL_CHARACTER_COUNT, "SELECT account, COUNT(guid) FROM characters WHERE account = ? GROUP BY account", CONNECTION_ASYNC);
- PREPARE_STATEMENT(CHAR_UPD_NAME, "UPDATE characters set name = ?, at_login = at_login & ~ ? WHERE guid = ?", CONNECTION_ASYNC);
- PREPARE_STATEMENT(CHAR_DEL_DECLINED_NAME, "DELETE FROM character_declinedname WHERE guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_SEL_CHARACTER_ACTIONS_SPEC, "SELECT button, action, type FROM character_action WHERE guid = ? AND spec = ? ORDER BY button", CONNECTION_SYNCH);
+ PrepareStatement(CHAR_SEL_MAILITEMS, "SELECT creatorGuid, giftCreatorGuid, count, duration, charges, flags, enchantments, randomPropertyId, durability, playedTime, text, item_guid, itemEntry, owner_guid FROM mail_items mi JOIN item_instance ii ON mi.item_guid = ii.guid WHERE mail_id = ?", CONNECTION_SYNCH);
+ PrepareStatement(CHAR_SEL_AUCTION_ITEMS, "SELECT creatorGuid, giftCreatorGuid, count, duration, charges, flags, enchantments, randomPropertyId, durability, playedTime, text, itemguid, itemEntry FROM auctionhouse ah JOIN item_instance ii ON ah.itemguid = ii.guid", CONNECTION_SYNCH);
+ PrepareStatement(CHAR_SEL_AUCTIONS, "SELECT id, auctioneerguid, itemguid, itemEntry, count, itemowner, buyoutprice, time, buyguid, lastbid, startbid, deposit FROM auctionhouse ah INNER JOIN item_instance ii ON ii.guid = ah.itemguid", CONNECTION_SYNCH);
+ PrepareStatement(CHAR_INS_AUCTION, "INSERT INTO auctionhouse (id, auctioneerguid, itemguid, itemowner, buyoutprice, time, buyguid, lastbid, startbid, deposit) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_AUCTION, "DELETE FROM auctionhouse WHERE id = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_SEL_AUCTION_BY_TIME, "SELECT id FROM auctionhouse WHERE time <= ? ORDER BY TIME ASC", CONNECTION_SYNCH);
+ PrepareStatement(CHAR_UPD_AUCTION_BID, "UPDATE auctionhouse SET buyguid = ?, lastbid = ? WHERE id = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_INS_MAIL, "INSERT INTO mail(id, messageType, stationery, mailTemplateId, sender, receiver, subject, body, has_items, expire_time, deliver_time, money, cod, checked) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_MAIL_BY_ID, "DELETE FROM mail WHERE id = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_INS_MAIL_ITEM, "INSERT INTO mail_items(mail_id, item_guid, receiver) VALUES (?, ?, ?)", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_MAIL_ITEM, "DELETE FROM mail_items WHERE item_guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_INVALID_MAIL_ITEM, "DELETE FROM mail_items WHERE item_guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_EMPTY_EXPIRED_MAIL, "DELETE FROM mail WHERE expire_time < ? AND has_items = 0 AND body = ''", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_SEL_EXPIRED_MAIL, "SELECT id, messageType, sender, receiver, has_items, expire_time, cod, checked, mailTemplateId FROM mail WHERE expire_time < ?", CONNECTION_SYNCH);
+ PrepareStatement(CHAR_SEL_EXPIRED_MAIL_ITEMS, "SELECT item_guid, itemEntry, mail_id FROM mail_items mi INNER JOIN item_instance ii ON ii.guid = mi.item_guid LEFT JOIN mail mm ON mi.mail_id = mm.id WHERE mm.id IS NOT NULL AND mm.expire_time < ?", CONNECTION_SYNCH);
+ PrepareStatement(CHAR_UPD_MAIL_RETURNED, "UPDATE mail SET sender = ?, receiver = ?, expire_time = ?, deliver_time = ?, cod = 0, checked = ? WHERE id = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_UPD_MAIL_ITEM_RECEIVER, "UPDATE mail_items SET receiver = ? WHERE item_guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_UPD_ITEM_OWNER, "UPDATE item_instance SET owner_guid = ? WHERE guid = ?", CONNECTION_ASYNC);
+
+ PrepareStatement(CHAR_SEL_ITEM_REFUNDS, "SELECT player_guid, paidMoney, paidExtendedCost FROM item_refund_instance WHERE item_guid = ? AND player_guid = ? LIMIT 1", CONNECTION_SYNCH);
+ PrepareStatement(CHAR_SEL_ITEM_BOP_TRADE, "SELECT allowedPlayers FROM item_soulbound_trade_data WHERE itemGuid = ? LIMIT 1", CONNECTION_SYNCH);
+ PrepareStatement(CHAR_DEL_ITEM_BOP_TRADE, "DELETE FROM item_soulbound_trade_data WHERE itemGuid = ? LIMIT 1", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_INS_ITEM_BOP_TRADE, "INSERT INTO item_soulbound_trade_data VALUES (?, ?)", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_REP_INVENTORY_ITEM, "REPLACE INTO character_inventory (guid, bag, slot, item) VALUES (?, ?, ?, ?)", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_REP_ITEM_INSTANCE, "REPLACE INTO item_instance (itemEntry, owner_guid, creatorGuid, giftCreatorGuid, count, duration, charges, flags, enchantments, randomPropertyId, durability, playedTime, text, guid) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_UPD_ITEM_INSTANCE, "UPDATE item_instance SET itemEntry = ?, owner_guid = ?, creatorGuid = ?, giftCreatorGuid = ?, count = ?, duration = ?, charges = ?, flags = ?, enchantments = ?, randomPropertyId = ?, durability = ?, playedTime = ?, text = ? WHERE guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_UPD_ITEM_INSTANCE_ON_LOAD, "UPDATE item_instance SET duration = ?, flags = ?, durability = ? WHERE guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_ITEM_INSTANCE, "DELETE FROM item_instance WHERE guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_UPD_GIFT_OWNER, "UPDATE character_gifts SET guid = ? WHERE item_guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_GIFT, "DELETE FROM character_gifts WHERE item_guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_SEL_CHARACTER_GIFT_BY_ITEM, "SELECT entry, flags FROM character_gifts WHERE item_guid = ?", CONNECTION_SYNCH);
+ PrepareStatement(CHAR_SEL_ACCOUNT_BY_NAME, "SELECT account FROM characters WHERE name = ?", CONNECTION_SYNCH);
+ PrepareStatement(CHAR_SEL_ACCOUNT_BY_GUID, "SELECT account FROM characters WHERE guid = ?", CONNECTION_SYNCH);
+ PrepareStatement(CHAR_SEL_CHARACTER_DATA_BY_GUID, "SELECT account, name, level FROM characters WHERE guid = ?", CONNECTION_SYNCH);
+ PrepareStatement(CHAR_DEL_ACCOUNT_INSTANCE_LOCK_TIMES, "DELETE FROM account_instance_times WHERE accountId = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_INS_ACCOUNT_INSTANCE_LOCK_TIMES, "INSERT INTO account_instance_times (accountId, instanceId, releaseTime) VALUES (?, ?, ?)", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_SEL_CHARACTER_NAME_CLASS, "SELECT name, class FROM characters WHERE guid = ?", CONNECTION_SYNCH);
+ PrepareStatement(CHAR_SEL_CHARACTER_NAME, "SELECT name FROM characters WHERE guid = ?", CONNECTION_SYNCH);
+ PrepareStatement(CHAR_SEL_MATCH_MAKER_RATING, "SELECT matchMakerRating FROM character_arena_stats WHERE guid = ? AND slot = ?", CONNECTION_SYNCH);
+ PrepareStatement(CHAR_SEL_CHARACTER_COUNT, "SELECT account, COUNT(guid) FROM characters WHERE account = ? GROUP BY account", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_UPD_NAME, "UPDATE characters set name = ?, at_login = at_login & ~ ? WHERE guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_DECLINED_NAME, "DELETE FROM character_declinedname WHERE guid = ?", CONNECTION_ASYNC);
// Guild handling
// 0: uint32, 1: string, 2: uint32, 3: string, 4: string, 5: uint64, 6-10: uint32, 11: uint64
- PREPARE_STATEMENT(CHAR_INS_GUILD, "INSERT INTO guild (guildid, name, leaderguid, info, motd, createdate, EmblemStyle, EmblemColor, BorderStyle, BorderColor, BackgroundColor, BankMoney) VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", CONNECTION_ASYNC)
- PREPARE_STATEMENT(CHAR_DEL_GUILD, "DELETE FROM guild WHERE guildid = ?", CONNECTION_ASYNC) // 0: uint32
+ PrepareStatement(CHAR_INS_GUILD, "INSERT INTO guild (guildid, name, leaderguid, info, motd, createdate, EmblemStyle, EmblemColor, BorderStyle, BorderColor, BackgroundColor, BankMoney) VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_GUILD, "DELETE FROM guild WHERE guildid = ?", CONNECTION_ASYNC); // 0: uint32
// 0: uint32, 1: uint32, 2: uint8, 4: string, 5: string
- PREPARE_STATEMENT(CHAR_INS_GUILD_MEMBER, "INSERT INTO guild_member (guildid, guid, rank, pnote, offnote) VALUES (?, ?, ?, ?, ?)", CONNECTION_ASYNC)
- PREPARE_STATEMENT(CHAR_DEL_GUILD_MEMBER, "DELETE FROM guild_member WHERE guid = ?", CONNECTION_ASYNC) // 0: uint32
- PREPARE_STATEMENT(CHAR_DEL_GUILD_MEMBERS, "DELETE FROM guild_member WHERE guildid = ?", CONNECTION_ASYNC) // 0: uint32
+ PrepareStatement(CHAR_INS_GUILD_MEMBER, "INSERT INTO guild_member (guildid, guid, rank, pnote, offnote) VALUES (?, ?, ?, ?, ?)", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_GUILD_MEMBER, "DELETE FROM guild_member WHERE guid = ?", CONNECTION_ASYNC); // 0: uint32
+ PrepareStatement(CHAR_DEL_GUILD_MEMBERS, "DELETE FROM guild_member WHERE guildid = ?", CONNECTION_ASYNC); // 0: uint32
// 0: uint32, 1: uint8, 3: string, 4: uint32
- PREPARE_STATEMENT(CHAR_INS_GUILD_RANK, "INSERT INTO guild_rank (guildid, rid, rname, rights) VALUES (?, ?, ?, ?)", CONNECTION_ASYNC)
- PREPARE_STATEMENT(CHAR_DEL_GUILD_RANKS, "DELETE FROM guild_rank WHERE guildid = ?", CONNECTION_ASYNC) // 0: uint32
- PREPARE_STATEMENT(CHAR_DEL_GUILD_LOWEST_RANK, "DELETE FROM guild_rank WHERE guildid = ? AND rid >= ?", CONNECTION_ASYNC) // 0: uint32, 1: uint8
- PREPARE_STATEMENT(CHAR_INS_GUILD_BANK_TAB, "INSERT INTO guild_bank_tab (guildid, TabId) VALUES (?, ?)", CONNECTION_ASYNC) // 0: uint32, 1: uint8
- PREPARE_STATEMENT(CHAR_DEL_GUILD_BANK_TAB, "DELETE FROM guild_bank_tab WHERE guildid = ? AND TabId = ?", CONNECTION_ASYNC) // 0: uint32, 1: uint8
- PREPARE_STATEMENT(CHAR_DEL_GUILD_BANK_TABS, "DELETE FROM guild_bank_tab WHERE guildid = ?", CONNECTION_ASYNC) // 0: uint32
+ PrepareStatement(CHAR_INS_GUILD_RANK, "INSERT INTO guild_rank (guildid, rid, rname, rights) VALUES (?, ?, ?, ?)", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_GUILD_RANKS, "DELETE FROM guild_rank WHERE guildid = ?", CONNECTION_ASYNC); // 0: uint32
+ PrepareStatement(CHAR_DEL_GUILD_LOWEST_RANK, "DELETE FROM guild_rank WHERE guildid = ? AND rid >= ?", CONNECTION_ASYNC); // 0: uint32, 1: uint8
+ PrepareStatement(CHAR_INS_GUILD_BANK_TAB, "INSERT INTO guild_bank_tab (guildid, TabId) VALUES (?, ?)", CONNECTION_ASYNC); // 0: uint32, 1: uint8
+ PrepareStatement(CHAR_DEL_GUILD_BANK_TAB, "DELETE FROM guild_bank_tab WHERE guildid = ? AND TabId = ?", CONNECTION_ASYNC); // 0: uint32, 1: uint8
+ PrepareStatement(CHAR_DEL_GUILD_BANK_TABS, "DELETE FROM guild_bank_tab WHERE guildid = ?", CONNECTION_ASYNC); // 0: uint32
// 0: uint32, 1: uint8, 2: uint8, 3: uint32, 4: uint32
- PREPARE_STATEMENT(CHAR_INS_GUILD_BANK_ITEM, "INSERT INTO guild_bank_item (guildid, TabId, SlotId, item_guid) VALUES (?, ?, ?, ?)", CONNECTION_ASYNC)
- PREPARE_STATEMENT(CHAR_DEL_GUILD_BANK_ITEM, "DELETE FROM guild_bank_item WHERE guildid = ? AND TabId = ? AND SlotId = ?", CONNECTION_ASYNC) // 0: uint32, 1: uint8, 2: uint8
- PREPARE_STATEMENT(CHAR_DEL_GUILD_BANK_ITEMS, "DELETE FROM guild_bank_item WHERE guildid = ?", CONNECTION_ASYNC) // 0: uint32
+ PrepareStatement(CHAR_INS_GUILD_BANK_ITEM, "INSERT INTO guild_bank_item (guildid, TabId, SlotId, item_guid) VALUES (?, ?, ?, ?)", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_GUILD_BANK_ITEM, "DELETE FROM guild_bank_item WHERE guildid = ? AND TabId = ? AND SlotId = ?", CONNECTION_ASYNC); // 0: uint32, 1: uint8, 2: uint8
+ PrepareStatement(CHAR_DEL_GUILD_BANK_ITEMS, "DELETE FROM guild_bank_item WHERE guildid = ?", CONNECTION_ASYNC); // 0: uint32
// 0: uint32, 1: uint8, 2: uint8, 3: uint8, 4: uint32
- PREPARE_STATEMENT(CHAR_INS_GUILD_BANK_RIGHT, "INSERT INTO guild_bank_right (guildid, TabId, rid, gbright, SlotPerDay) VALUES (?, ?, ?, ?, ?) "
- "ON DUPLICATE KEY UPDATE gbright = VALUES(gbright), SlotPerDay = VALUES(SlotPerDay)", CONNECTION_ASYNC)
- PREPARE_STATEMENT(CHAR_DEL_GUILD_BANK_RIGHTS, "DELETE FROM guild_bank_right WHERE guildid = ?", CONNECTION_ASYNC) // 0: uint32
- PREPARE_STATEMENT(CHAR_DEL_GUILD_BANK_RIGHTS_FOR_RANK, "DELETE FROM guild_bank_right WHERE guildid = ? AND rid = ?", CONNECTION_ASYNC) // 0: uint32, 1: uint8
+ PrepareStatement(CHAR_INS_GUILD_BANK_RIGHT, "INSERT INTO guild_bank_right (guildid, TabId, rid, gbright, SlotPerDay) VALUES (?, ?, ?, ?, ?) "
+ "ON DUPLICATE KEY UPDATE gbright = VALUES(gbright), SlotPerDay = VALUES(SlotPerDay)", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_GUILD_BANK_RIGHTS, "DELETE FROM guild_bank_right WHERE guildid = ?", CONNECTION_ASYNC); // 0: uint32
+ PrepareStatement(CHAR_DEL_GUILD_BANK_RIGHTS_FOR_RANK, "DELETE FROM guild_bank_right WHERE guildid = ? AND rid = ?", CONNECTION_ASYNC); // 0: uint32, 1: uint8
// 0-1: uint32, 2-3: uint8, 4-5: uint32, 6: uint16, 7: uint8, 8: uint64
- PREPARE_STATEMENT(CHAR_INS_GUILD_BANK_EVENTLOG, "INSERT INTO guild_bank_eventlog (guildid, LogGuid, TabId, EventType, PlayerGuid, ItemOrMoney, ItemStackCount, DestTabId, TimeStamp) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)", CONNECTION_ASYNC)
- PREPARE_STATEMENT(CHAR_DEL_GUILD_BANK_EVENTLOG, "DELETE FROM guild_bank_eventlog WHERE guildid = ? AND LogGuid = ? AND TabId = ?", CONNECTION_ASYNC) // 0: uint32, 1: uint32, 2: uint8
- PREPARE_STATEMENT(CHAR_DEL_GUILD_BANK_EVENTLOGS, "DELETE FROM guild_bank_eventlog WHERE guildid = ?", CONNECTION_ASYNC) // 0: uint32
+ PrepareStatement(CHAR_INS_GUILD_BANK_EVENTLOG, "INSERT INTO guild_bank_eventlog (guildid, LogGuid, TabId, EventType, PlayerGuid, ItemOrMoney, ItemStackCount, DestTabId, TimeStamp) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_GUILD_BANK_EVENTLOG, "DELETE FROM guild_bank_eventlog WHERE guildid = ? AND LogGuid = ? AND TabId = ?", CONNECTION_ASYNC); // 0: uint32, 1: uint32, 2: uint8
+ PrepareStatement(CHAR_DEL_GUILD_BANK_EVENTLOGS, "DELETE FROM guild_bank_eventlog WHERE guildid = ?", CONNECTION_ASYNC); // 0: uint32
// 0-1: uint32, 2: uint8, 3-4: uint32, 5: uint8, 6: uint64
- PREPARE_STATEMENT(CHAR_INS_GUILD_EVENTLOG, "INSERT INTO guild_eventlog (guildid, LogGuid, EventType, PlayerGuid1, PlayerGuid2, NewRank, TimeStamp) VALUES (?, ?, ?, ?, ?, ?, ?)", CONNECTION_ASYNC)
- PREPARE_STATEMENT(CHAR_DEL_GUILD_EVENTLOG, "DELETE FROM guild_eventlog WHERE guildid = ? AND LogGuid = ?", CONNECTION_ASYNC) // 0: uint32, 1: uint32
- PREPARE_STATEMENT(CHAR_DEL_GUILD_EVENTLOGS, "DELETE FROM guild_eventlog WHERE guildid = ?", CONNECTION_ASYNC) // 0: uint32
- PREPARE_STATEMENT(CHAR_UPD_GUILD_MEMBER_PNOTE, "UPDATE guild_member SET pnote = ? WHERE guid = ?", CONNECTION_ASYNC) // 0: string, 1: uint32
- PREPARE_STATEMENT(CHAR_UPD_GUILD_MEMBER_OFFNOTE, "UPDATE guild_member SET offnote = ? WHERE guid = ?", CONNECTION_ASYNC) // 0: string, 1: uint32
- PREPARE_STATEMENT(CHAR_UPD_GUILD_MEMBER_RANK, "UPDATE guild_member SET rank = ? WHERE guid = ?", CONNECTION_ASYNC) // 0: uint8, 1: uint32
- PREPARE_STATEMENT(CHAR_UPD_GUILD_MOTD, "UPDATE guild SET motd = ? WHERE guildid = ?", CONNECTION_ASYNC) // 0: string, 1: uint32
- PREPARE_STATEMENT(CHAR_UPD_GUILD_INFO, "UPDATE guild SET info = ? WHERE guildid = ?", CONNECTION_ASYNC) // 0: string, 1: uint32
- PREPARE_STATEMENT(CHAR_UPD_GUILD_LEADER, "UPDATE guild SET leaderguid = ? WHERE guildid = ?", CONNECTION_ASYNC) // 0: uint32, 1: uint32
- PREPARE_STATEMENT(CHAR_UPD_GUILD_RANK_NAME, "UPDATE guild_rank SET rname = ? WHERE rid = ? AND guildid = ?", CONNECTION_ASYNC) // 0: string, 1: uint8, 2: uint32
- PREPARE_STATEMENT(CHAR_UPD_GUILD_RANK_RIGHTS, "UPDATE guild_rank SET rights = ? WHERE rid = ? AND guildid = ?", CONNECTION_ASYNC) // 0: uint32, 1: uint8, 2: uint32
+ PrepareStatement(CHAR_INS_GUILD_EVENTLOG, "INSERT INTO guild_eventlog (guildid, LogGuid, EventType, PlayerGuid1, PlayerGuid2, NewRank, TimeStamp) VALUES (?, ?, ?, ?, ?, ?, ?)", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_GUILD_EVENTLOG, "DELETE FROM guild_eventlog WHERE guildid = ? AND LogGuid = ?", CONNECTION_ASYNC); // 0: uint32, 1: uint32
+ PrepareStatement(CHAR_DEL_GUILD_EVENTLOGS, "DELETE FROM guild_eventlog WHERE guildid = ?", CONNECTION_ASYNC); // 0: uint32
+ PrepareStatement(CHAR_UPD_GUILD_MEMBER_PNOTE, "UPDATE guild_member SET pnote = ? WHERE guid = ?", CONNECTION_ASYNC); // 0: string, 1: uint32
+ PrepareStatement(CHAR_UPD_GUILD_MEMBER_OFFNOTE, "UPDATE guild_member SET offnote = ? WHERE guid = ?", CONNECTION_ASYNC); // 0: string, 1: uint32
+ PrepareStatement(CHAR_UPD_GUILD_MEMBER_RANK, "UPDATE guild_member SET rank = ? WHERE guid = ?", CONNECTION_ASYNC); // 0: uint8, 1: uint32
+ PrepareStatement(CHAR_UPD_GUILD_MOTD, "UPDATE guild SET motd = ? WHERE guildid = ?", CONNECTION_ASYNC); // 0: string, 1: uint32
+ PrepareStatement(CHAR_UPD_GUILD_INFO, "UPDATE guild SET info = ? WHERE guildid = ?", CONNECTION_ASYNC); // 0: string, 1: uint32
+ PrepareStatement(CHAR_UPD_GUILD_LEADER, "UPDATE guild SET leaderguid = ? WHERE guildid = ?", CONNECTION_ASYNC); // 0: uint32, 1: uint32
+ PrepareStatement(CHAR_UPD_GUILD_RANK_NAME, "UPDATE guild_rank SET rname = ? WHERE rid = ? AND guildid = ?", CONNECTION_ASYNC); // 0: string, 1: uint8, 2: uint32
+ PrepareStatement(CHAR_UPD_GUILD_RANK_RIGHTS, "UPDATE guild_rank SET rights = ? WHERE rid = ? AND guildid = ?", CONNECTION_ASYNC); // 0: uint32, 1: uint8, 2: uint32
// 0-5: uint32
- PREPARE_STATEMENT(CHAR_UPD_GUILD_EMBLEM_INFO, "UPDATE guild SET EmblemStyle = ?, EmblemColor = ?, BorderStyle = ?, BorderColor = ?, BackgroundColor = ? WHERE guildid = ?", CONNECTION_ASYNC)
+ PrepareStatement(CHAR_UPD_GUILD_EMBLEM_INFO, "UPDATE guild SET EmblemStyle = ?, EmblemColor = ?, BorderStyle = ?, BorderColor = ?, BackgroundColor = ? WHERE guildid = ?", CONNECTION_ASYNC);
// 0: string, 1: string, 2: uint32, 3: uint8
- PREPARE_STATEMENT(CHAR_UPD_GUILD_BANK_TAB_INFO, "UPDATE guild_bank_tab SET TabName = ?, TabIcon = ? WHERE guildid = ? AND TabId = ?", CONNECTION_ASYNC)
- PREPARE_STATEMENT(CHAR_UPD_GUILD_BANK_MONEY, "UPDATE guild SET BankMoney = ? WHERE guildid = ?", CONNECTION_ASYNC) // 0: uint64, 1: uint32
+ PrepareStatement(CHAR_UPD_GUILD_BANK_TAB_INFO, "UPDATE guild_bank_tab SET TabName = ?, TabIcon = ? WHERE guildid = ? AND TabId = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_UPD_GUILD_BANK_MONEY, "UPDATE guild SET BankMoney = ? WHERE guildid = ?", CONNECTION_ASYNC); // 0: uint64, 1: uint32
// 0: uint8, 1: uint32, 2: uint8, 3: uint32
- PREPARE_STATEMENT(CHAR_UPD_GUILD_BANK_EVENTLOG_TAB, "UPDATE guild_bank_eventlog SET TabId = ? WHERE guildid = ? AND TabId = ? AND LogGuid = ?", CONNECTION_ASYNC)
- PREPARE_STATEMENT(CHAR_UPD_GUILD_RANK_BANK_MONEY, "UPDATE guild_rank SET BankMoneyPerDay = ? WHERE rid = ? AND guildid = ?", CONNECTION_ASYNC) // 0: uint32, 1: uint8, 2: uint32
- PREPARE_STATEMENT(CHAR_UPD_GUILD_BANK_TAB_TEXT, "UPDATE guild_bank_tab SET TabText = ? WHERE guildid = ? AND TabId = ?", CONNECTION_ASYNC) // 0: string, 1: uint32, 2: uint8
+ PrepareStatement(CHAR_UPD_GUILD_BANK_EVENTLOG_TAB, "UPDATE guild_bank_eventlog SET TabId = ? WHERE guildid = ? AND TabId = ? AND LogGuid = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_UPD_GUILD_RANK_BANK_MONEY, "UPDATE guild_rank SET BankMoneyPerDay = ? WHERE rid = ? AND guildid = ?", CONNECTION_ASYNC); // 0: uint32, 1: uint8, 2: uint32
+ PrepareStatement(CHAR_UPD_GUILD_BANK_TAB_TEXT, "UPDATE guild_bank_tab SET TabText = ? WHERE guildid = ? AND TabId = ?", CONNECTION_ASYNC); // 0: string, 1: uint32, 2: uint8
- PREPARE_STATEMENT(CHAR_INS_GUILD_MEMBER_WITHDRAW,
- "INSERT INTO guild_member_withdraw (guid, tab0, tab1, tab2, tab3, tab4, tab5, money) VALUES (?, ?, ?, ?, ?, ?, ?, ?) "
- "ON DUPLICATE KEY UPDATE tab0 = VALUES (tab0), tab1 = VALUES (tab1), tab2 = VALUES (tab2), tab3 = VALUES (tab3), tab4 = VALUES (tab4), tab5 = VALUES (tab5)", CONNECTION_ASYNC)
- PREPARE_STATEMENT(CHAR_DEL_GUILD_MEMBER_WITHDRAW, "TRUNCATE guild_member_withdraw", CONNECTION_ASYNC)
+ PrepareStatement(CHAR_INS_GUILD_MEMBER_WITHDRAW,
+ "INSERT INTO guild_member_withdraw (guid, tab0, tab1, tab2, tab3, tab4, tab5, money) VALUES (?, ?, ?, ?, ?, ?, ?, ?) "
+ "ON DUPLICATE KEY UPDATE tab0 = VALUES (tab0), tab1 = VALUES (tab1), tab2 = VALUES (tab2), tab3 = VALUES (tab3), tab4 = VALUES (tab4), tab5 = VALUES (tab5)", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_GUILD_MEMBER_WITHDRAW, "TRUNCATE guild_member_withdraw", CONNECTION_ASYNC);
// 0: uint32, 1: uint32, 2: uint32
- PREPARE_STATEMENT(CHAR_SEL_CHAR_DATA_FOR_GUILD, "SELECT name, level, class, zone, account FROM characters WHERE guid = ?", CONNECTION_SYNCH)
+ PrepareStatement(CHAR_SEL_CHAR_DATA_FOR_GUILD, "SELECT name, level, class, zone, account FROM characters WHERE guid = ?", CONNECTION_SYNCH);
// Chat channel handling
- PREPARE_STATEMENT(CHAR_SEL_CHANNEL, "SELECT announce, ownership, password, bannedList FROM channels WHERE name = ? AND team = ?", CONNECTION_SYNCH)
- PREPARE_STATEMENT(CHAR_INS_CHANNEL, "INSERT INTO channels(name, team, lastUsed) VALUES (?, ?, UNIX_TIMESTAMP())", CONNECTION_ASYNC)
- PREPARE_STATEMENT(CHAR_UPD_CHANNEL, "UPDATE channels SET announce = ?, ownership = ?, password = ?, bannedList = ?, lastUsed = UNIX_TIMESTAMP() WHERE name = ? AND team = ?", CONNECTION_ASYNC)
- PREPARE_STATEMENT(CHAR_UPD_CHANNEL_USAGE, "UPDATE channels SET lastUsed = UNIX_TIMESTAMP() WHERE name = ? AND team = ?", CONNECTION_ASYNC)
- PREPARE_STATEMENT(CHAR_UPD_CHANNEL_OWNERSHIP, "UPDATE channels SET ownership = ? WHERE name LIKE ?", CONNECTION_ASYNC)
- PREPARE_STATEMENT(CHAR_DEL_OLD_CHANNELS, "DELETE FROM channels WHERE ownership = 1 AND lastUsed + ? < UNIX_TIMESTAMP()", CONNECTION_ASYNC)
+ PrepareStatement(CHAR_SEL_CHANNEL, "SELECT announce, ownership, password, bannedList FROM channels WHERE name = ? AND team = ?", CONNECTION_SYNCH);
+ PrepareStatement(CHAR_INS_CHANNEL, "INSERT INTO channels(name, team, lastUsed) VALUES (?, ?, UNIX_TIMESTAMP())", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_UPD_CHANNEL, "UPDATE channels SET announce = ?, ownership = ?, password = ?, bannedList = ?, lastUsed = UNIX_TIMESTAMP() WHERE name = ? AND team = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_UPD_CHANNEL_USAGE, "UPDATE channels SET lastUsed = UNIX_TIMESTAMP() WHERE name = ? AND team = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_UPD_CHANNEL_OWNERSHIP, "UPDATE channels SET ownership = ? WHERE name LIKE ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_OLD_CHANNELS, "DELETE FROM channels WHERE ownership = 1 AND lastUsed + ? < UNIX_TIMESTAMP()", CONNECTION_ASYNC);
// Equipmentsets
- PREPARE_STATEMENT(CHAR_UPD_EQUIP_SET, "UPDATE character_equipmentsets SET name=?, iconname=?, ignore_mask=?, item0=?, item1=?, item2=?, item3=?, item4=?, item5=?, item6=?, item7=?, item8=?, item9=?, item10=?, item11=?, item12=?, item13=?, item14=?, item15=?, item16=?, item17=?, item18=? WHERE guid=? AND setguid=? AND setindex=?", CONNECTION_ASYNC)
- PREPARE_STATEMENT(CHAR_INS_EQUIP_SET, "INSERT INTO character_equipmentsets (guid, setguid, setindex, name, iconname, ignore_mask, item0, item1, item2, item3, item4, item5, item6, item7, item8, item9, item10, item11, item12, item13, item14, item15, item16, item17, item18) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", CONNECTION_ASYNC)
- PREPARE_STATEMENT(CHAR_DEL_EQUIP_SET, "DELETE FROM character_equipmentsets WHERE setguid=?", CONNECTION_ASYNC)
+ PrepareStatement(CHAR_UPD_EQUIP_SET, "UPDATE character_equipmentsets SET name=?, iconname=?, ignore_mask=?, item0=?, item1=?, item2=?, item3=?, "
+ "item4=?, item5=?, item6=?, item7=?, item8=?, item9=?, item10=?, item11=?, item12=?, item13=?, item14=?, item15=?, item16=?, "
+ "item17=?, item18=? WHERE guid=? AND setguid=? AND setindex=?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_INS_EQUIP_SET, "INSERT INTO character_equipmentsets (guid, setguid, setindex, name, iconname, ignore_mask, item0, item1, item2, item3, "
+ "item4, item5, item6, item7, item8, item9, item10, item11, item12, item13, item14, item15, item16, item17, item18) "
+ "VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_EQUIP_SET, "DELETE FROM character_equipmentsets WHERE setguid=?", CONNECTION_ASYNC);
// Auras
- PREPARE_STATEMENT(CHAR_INS_AURA, "INSERT INTO character_aura (guid, caster_guid, item_guid, spell, effect_mask, recalculate_mask, stackcount, amount0, amount1, amount2, base_amount0, base_amount1, base_amount2, maxduration, remaintime, remaincharges) "
- "VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", CONNECTION_ASYNC)
+ PrepareStatement(CHAR_INS_AURA, "INSERT INTO character_aura (guid, caster_guid, item_guid, spell, effect_mask, recalculate_mask, stackcount, amount0, amount1, amount2, base_amount0, base_amount1, base_amount2, maxduration, remaintime, remaincharges) "
+ "VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", CONNECTION_ASYNC);
// Account data
- PREPARE_STATEMENT(CHAR_SEL_ACCOUNT_DATA, "SELECT type, time, data FROM account_data WHERE accountId = ?", CONNECTION_SYNCH)
- PREPARE_STATEMENT(CHAR_REP_ACCOUNT_DATA, "REPLACE INTO account_data (accountId, type, time, data) VALUES (?, ?, ?, ?)", CONNECTION_ASYNC)
- PREPARE_STATEMENT(CHAR_DEL_ACCOUNT_DATA, "DELETE FROM account_data WHERE accountId = ?", CONNECTION_ASYNC)
- PREPARE_STATEMENT(CHAR_SEL_PLAYER_ACCOUNT_DATA, "SELECT type, time, data FROM character_account_data WHERE guid = ?", CONNECTION_ASYNC)
- PREPARE_STATEMENT(CHAR_REP_PLAYER_ACCOUNT_DATA, "REPLACE INTO character_account_data(guid, type, time, data) VALUES (?, ?, ?, ?)", CONNECTION_ASYNC)
- PREPARE_STATEMENT(CHAR_DEL_PLAYER_ACCOUNT_DATA, "DELETE FROM character_account_data WHERE guid = ?", CONNECTION_ASYNC)
+ PrepareStatement(CHAR_SEL_ACCOUNT_DATA, "SELECT type, time, data FROM account_data WHERE accountId = ?", CONNECTION_SYNCH);
+ PrepareStatement(CHAR_REP_ACCOUNT_DATA, "REPLACE INTO account_data (accountId, type, time, data) VALUES (?, ?, ?, ?)", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_ACCOUNT_DATA, "DELETE FROM account_data WHERE accountId = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_SEL_PLAYER_ACCOUNT_DATA, "SELECT type, time, data FROM character_account_data WHERE guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_REP_PLAYER_ACCOUNT_DATA, "REPLACE INTO character_account_data(guid, type, time, data) VALUES (?, ?, ?, ?)", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_PLAYER_ACCOUNT_DATA, "DELETE FROM character_account_data WHERE guid = ?", CONNECTION_ASYNC);
// Tutorials
- PREPARE_STATEMENT(CHAR_SEL_TUTORIALS, "SELECT tut0, tut1, tut2, tut3, tut4, tut5, tut6, tut7 FROM account_tutorial WHERE accountId = ?", CONNECTION_SYNCH)
- PREPARE_STATEMENT(CHAR_SEL_HAS_TUTORIALS, "SELECT 1 FROM account_tutorial WHERE accountId = ?", CONNECTION_SYNCH)
- PREPARE_STATEMENT(CHAR_INS_TUTORIALS, "INSERT INTO account_tutorial(tut0, tut1, tut2, tut3, tut4, tut5, tut6, tut7, accountId) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)", CONNECTION_ASYNC)
- PREPARE_STATEMENT(CHAR_UPD_TUTORIALS, "UPDATE account_tutorial SET tut0 = ?, tut1 = ?, tut2 = ?, tut3 = ?, tut4 = ?, tut5 = ?, tut6 = ?, tut7 = ? WHERE accountId = ?", CONNECTION_ASYNC)
- PREPARE_STATEMENT(CHAR_DEL_TUTORIALS, "DELETE FROM account_tutorial WHERE accountId = ?", CONNECTION_ASYNC)
+ PrepareStatement(CHAR_SEL_TUTORIALS, "SELECT tut0, tut1, tut2, tut3, tut4, tut5, tut6, tut7 FROM account_tutorial WHERE accountId = ?", CONNECTION_SYNCH);
+ PrepareStatement(CHAR_SEL_HAS_TUTORIALS, "SELECT 1 FROM account_tutorial WHERE accountId = ?", CONNECTION_SYNCH);
+ PrepareStatement(CHAR_INS_TUTORIALS, "INSERT INTO account_tutorial(tut0, tut1, tut2, tut3, tut4, tut5, tut6, tut7, accountId) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_UPD_TUTORIALS, "UPDATE account_tutorial SET tut0 = ?, tut1 = ?, tut2 = ?, tut3 = ?, tut4 = ?, tut5 = ?, tut6 = ?, tut7 = ? WHERE accountId = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_TUTORIALS, "DELETE FROM account_tutorial WHERE accountId = ?", CONNECTION_ASYNC);
// Instance saves
- PREPARE_STATEMENT(CHAR_INS_INSTANCE_SAVE, "INSERT INTO instance (id, map, resettime, difficulty, completedEncounters, data) VALUES (?, ?, ?, ?, ?, ?)", CONNECTION_ASYNC)
- PREPARE_STATEMENT(CHAR_UPD_INSTANCE_DATA, "UPDATE instance SET completedEncounters=?, data=? WHERE id=?", CONNECTION_ASYNC)
+ PrepareStatement(CHAR_INS_INSTANCE_SAVE, "INSERT INTO instance (id, map, resettime, difficulty, completedEncounters, data) VALUES (?, ?, ?, ?, ?, ?)", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_UPD_INSTANCE_DATA, "UPDATE instance SET completedEncounters=?, data=? WHERE id=?", CONNECTION_ASYNC);
// Game event saves
- PREPARE_STATEMENT(CHAR_DEL_GAME_EVENT_SAVE, "DELETE FROM game_event_save WHERE eventEntry = ?", CONNECTION_ASYNC)
- PREPARE_STATEMENT(CHAR_INS_GAME_EVENT_SAVE, "INSERT INTO game_event_save (eventEntry, state, next_start) VALUES (?, ?, ?)", CONNECTION_ASYNC)
+ PrepareStatement(CHAR_DEL_GAME_EVENT_SAVE, "DELETE FROM game_event_save WHERE eventEntry = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_INS_GAME_EVENT_SAVE, "INSERT INTO game_event_save (eventEntry, state, next_start) VALUES (?, ?, ?)", CONNECTION_ASYNC);
// Game event condition saves
- PREPARE_STATEMENT(CHAR_DEL_ALL_GAME_EVENT_CONDITION_SAVE, "DELETE FROM game_event_condition_save WHERE eventEntry = ?", CONNECTION_ASYNC)
- PREPARE_STATEMENT(CHAR_DEL_GAME_EVENT_CONDITION_SAVE, "DELETE FROM game_event_condition_save WHERE eventEntry = ? AND condition_id = ?", CONNECTION_ASYNC)
- PREPARE_STATEMENT(CHAR_INS_GAME_EVENT_CONDITION_SAVE, "INSERT INTO game_event_condition_save (eventEntry, condition_id, done) VALUES (?, ?, ?)", CONNECTION_ASYNC)
+ PrepareStatement(CHAR_DEL_ALL_GAME_EVENT_CONDITION_SAVE, "DELETE FROM game_event_condition_save WHERE eventEntry = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_GAME_EVENT_CONDITION_SAVE, "DELETE FROM game_event_condition_save WHERE eventEntry = ? AND condition_id = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_INS_GAME_EVENT_CONDITION_SAVE, "INSERT INTO game_event_condition_save (eventEntry, condition_id, done) VALUES (?, ?, ?)", CONNECTION_ASYNC);
// Petitions
- PREPARE_STATEMENT(CHAR_SEL_PETITION, "SELECT ownerguid, name, type FROM petition WHERE petitionguid = ?", CONNECTION_SYNCH);
- PREPARE_STATEMENT(CHAR_SEL_PETITION_SIGNATURE, "SELECT playerguid FROM petition_sign WHERE petitionguid = ?", CONNECTION_SYNCH);
- PREPARE_STATEMENT(CHAR_DEL_ALL_PETITION_SIGNATURES, "DELETE FROM petition_sign WHERE playerguid = ?", CONNECTION_ASYNC);
- PREPARE_STATEMENT(CHAR_DEL_PETITION_SIGNATURE, "DELETE FROM petition_sign WHERE playerguid = ? AND type = ?", CONNECTION_ASYNC);
- PREPARE_STATEMENT(CHAR_SEL_PETITION_BY_OWNER, "SELECT petitionguid FROM petition WHERE ownerguid = ? AND type = ?", CONNECTION_SYNCH);
- PREPARE_STATEMENT(CHAR_SEL_PETITION_TYPE, "SELECT type FROM petition WHERE petitionguid = ?", CONNECTION_SYNCH);
- PREPARE_STATEMENT(CHAR_SEL_PETITION_SIGNATURES, "SELECT ownerguid, (SELECT COUNT(playerguid) FROM petition_sign WHERE petition_sign.petitionguid = ?) AS signs, type FROM petition WHERE petitionguid = ?", CONNECTION_SYNCH);
- PREPARE_STATEMENT(CHAR_SEL_PETITION_SIG_BY_ACCOUNT, "SELECT playerguid FROM petition_sign WHERE player_account = ? AND petitionguid = ?", CONNECTION_SYNCH);
- PREPARE_STATEMENT(CHAR_SEL_PETITION_OWNER_BY_GUID, "SELECT ownerguid FROM petition WHERE petitionguid = ?", CONNECTION_SYNCH);
- PREPARE_STATEMENT(CHAR_SEL_PETITION_SIG_BY_GUID, "SELECT ownerguid, petitionguid FROM petition_sign WHERE playerguid = ?", CONNECTION_SYNCH);
- PREPARE_STATEMENT(CHAR_SEL_PETITION_SIG_BY_GUID_TYPE, "SELECT ownerguid, petitionguid FROM petition_sign WHERE playerguid = ? AND type = ?", CONNECTION_SYNCH);
+ PrepareStatement(CHAR_SEL_PETITION, "SELECT ownerguid, name, type FROM petition WHERE petitionguid = ?", CONNECTION_SYNCH);
+ PrepareStatement(CHAR_SEL_PETITION_SIGNATURE, "SELECT playerguid FROM petition_sign WHERE petitionguid = ?", CONNECTION_SYNCH);
+ PrepareStatement(CHAR_DEL_ALL_PETITION_SIGNATURES, "DELETE FROM petition_sign WHERE playerguid = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_PETITION_SIGNATURE, "DELETE FROM petition_sign WHERE playerguid = ? AND type = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_SEL_PETITION_BY_OWNER, "SELECT petitionguid FROM petition WHERE ownerguid = ? AND type = ?", CONNECTION_SYNCH);
+ PrepareStatement(CHAR_SEL_PETITION_TYPE, "SELECT type FROM petition WHERE petitionguid = ?", CONNECTION_SYNCH);
+ PrepareStatement(CHAR_SEL_PETITION_SIGNATURES, "SELECT ownerguid, (SELECT COUNT(playerguid) FROM petition_sign WHERE petition_sign.petitionguid = ?) AS signs, type FROM petition WHERE petitionguid = ?", CONNECTION_SYNCH);
+ PrepareStatement(CHAR_SEL_PETITION_SIG_BY_ACCOUNT, "SELECT playerguid FROM petition_sign WHERE player_account = ? AND petitionguid = ?", CONNECTION_SYNCH);
+ PrepareStatement(CHAR_SEL_PETITION_OWNER_BY_GUID, "SELECT ownerguid FROM petition WHERE petitionguid = ?", CONNECTION_SYNCH);
+ PrepareStatement(CHAR_SEL_PETITION_SIG_BY_GUID, "SELECT ownerguid, petitionguid FROM petition_sign WHERE playerguid = ?", CONNECTION_SYNCH);
+ PrepareStatement(CHAR_SEL_PETITION_SIG_BY_GUID_TYPE, "SELECT ownerguid, petitionguid FROM petition_sign WHERE playerguid = ? AND type = ?", CONNECTION_SYNCH);
// Arena teams
- PREPARE_STATEMENT(CHAR_SEL_CHARACTER_ARENAINFO, "SELECT arenaTeamId, weekGames, seasonGames, seasonWins, personalRating FROM arena_team_member WHERE guid = ?", CONNECTION_ASYNC)
- PREPARE_STATEMENT(CHAR_INS_ARENA_TEAM, "INSERT INTO arena_team (arenaTeamId, name, captainGuid, type, rating, backgroundColor, emblemStyle, emblemColor, borderStyle, borderColor) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", CONNECTION_ASYNC);
- PREPARE_STATEMENT(CHAR_INS_ARENA_TEAM_MEMBER, "INSERT INTO arena_team_member (arenaTeamId, guid) VALUES (?, ?)", CONNECTION_ASYNC);
- PREPARE_STATEMENT(CHAR_DEL_ARENA_TEAM, "DELETE FROM arena_team where arenaTeamId = ?", CONNECTION_ASYNC);
- PREPARE_STATEMENT(CHAR_DEL_ARENA_TEAM_MEMBERS, "DELETE FROM arena_team_member WHERE arenaTeamId = ?", CONNECTION_ASYNC);
- PREPARE_STATEMENT(CHAR_UPD_ARENA_TEAM_CAPTAIN, "UPDATE arena_team SET captainGuid = ? WHERE arenaTeamId = ?", CONNECTION_ASYNC);
- PREPARE_STATEMENT(CHAR_DEL_ARENA_TEAM_MEMBER, "DELETE FROM arena_team_member WHERE arenaTeamId = ? AND guid = ?", CONNECTION_ASYNC);
- PREPARE_STATEMENT(CHAR_UPD_ARENA_TEAM_STATS, "UPDATE arena_team SET rating = ?, weekGames = ?, weekWins = ?, seasonGames = ?, seasonWins = ?, rank = ? WHERE arenaTeamId = ?", CONNECTION_ASYNC);
- PREPARE_STATEMENT(CHAR_UPD_ARENA_TEAM_MEMBER, "UPDATE arena_team_member SET personalRating = ?, weekGames = ?, weekWins = ?, seasonGames = ?, seasonWins = ? WHERE arenaTeamId = ? AND guid = ?", CONNECTION_ASYNC);
- PREPARE_STATEMENT(CHAR_REP_CHARACTER_ARENA_STATS, "REPLACE INTO character_arena_stats (guid, slot, matchMakerRating) VALUES (?, ?, ?)", CONNECTION_ASYNC);
- PREPARE_STATEMENT(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_SEL_CHARACTER_ARENAINFO, "SELECT arenaTeamId, weekGames, seasonGames, seasonWins, personalRating FROM arena_team_member WHERE guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_INS_ARENA_TEAM, "INSERT INTO arena_team (arenaTeamId, name, captainGuid, type, rating, backgroundColor, emblemStyle, emblemColor, borderStyle, borderColor) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_INS_ARENA_TEAM_MEMBER, "INSERT INTO arena_team_member (arenaTeamId, guid) VALUES (?, ?)", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_ARENA_TEAM, "DELETE FROM arena_team where arenaTeamId = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_ARENA_TEAM_MEMBERS, "DELETE FROM arena_team_member WHERE arenaTeamId = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_UPD_ARENA_TEAM_CAPTAIN, "UPDATE arena_team SET captainGuid = ? WHERE arenaTeamId = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_ARENA_TEAM_MEMBER, "DELETE FROM arena_team_member WHERE arenaTeamId = ? AND guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_UPD_ARENA_TEAM_STATS, "UPDATE arena_team SET rating = ?, weekGames = ?, weekWins = ?, seasonGames = ?, seasonWins = ?, rank = ? WHERE arenaTeamId = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_UPD_ARENA_TEAM_MEMBER, "UPDATE arena_team_member SET personalRating = ?, weekGames = ?, weekWins = ?, seasonGames = ?, seasonWins = ? WHERE arenaTeamId = ? AND guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_REP_CHARACTER_ARENA_STATS, "REPLACE INTO character_arena_stats (guid, slot, matchMakerRating) VALUES (?, ?, ?)", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_SEL_PLAYER_ARENA_TEAMS, "SELECT arena_team_member.arenaTeamId FROM arena_team_member JOIN arena_team ON arena_team_member.arenaTeamId = arena_team.arenaTeamId WHERE guid = ?", CONNECTION_SYNCH);
// Character battleground data
- PREPARE_STATEMENT(CHAR_INS_PLAYER_BGDATA, "INSERT INTO character_battleground_data (guid, instanceId, team, joinX, joinY, joinZ, joinO, joinMapId, taxiStart, taxiEnd, mountSpell) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", CONNECTION_ASYNC)
- PREPARE_STATEMENT(CHAR_DEL_PLAYER_BGDATA, "DELETE FROM character_battleground_data WHERE guid = ?", CONNECTION_ASYNC)
+ PrepareStatement(CHAR_INS_PLAYER_BGDATA, "INSERT INTO character_battleground_data (guid, instanceId, team, joinX, joinY, joinZ, joinO, joinMapId, taxiStart, taxiEnd, mountSpell) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_PLAYER_BGDATA, "DELETE FROM character_battleground_data WHERE guid = ?", CONNECTION_ASYNC);
// Character homebind
- PREPARE_STATEMENT(CHAR_INS_PLAYER_HOMEBIND, "INSERT INTO character_homebind (guid, mapId, zoneId, posX, posY, posZ) VALUES (?, ?, ?, ?, ?, ?)", CONNECTION_ASYNC)
- PREPARE_STATEMENT(CHAR_UPD_PLAYER_HOMEBIND, "UPDATE character_homebind SET mapId = ?, zoneId = ?, posX = ?, posY = ?, posZ = ? WHERE guid = ?", CONNECTION_ASYNC)
- PREPARE_STATEMENT(CHAR_DEL_PLAYER_HOMEBIND, "DELETE FROM character_homebind WHERE guid = ?", CONNECTION_ASYNC)
+ PrepareStatement(CHAR_INS_PLAYER_HOMEBIND, "INSERT INTO character_homebind (guid, mapId, zoneId, posX, posY, posZ) VALUES (?, ?, ?, ?, ?, ?)", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_UPD_PLAYER_HOMEBIND, "UPDATE character_homebind SET mapId = ?, zoneId = ?, posX = ?, posY = ?, posZ = ? WHERE guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_PLAYER_HOMEBIND, "DELETE FROM character_homebind WHERE guid = ?", CONNECTION_ASYNC);
// Corpse
- PREPARE_STATEMENT(CHAR_SEL_CORPSES, "SELECT posX, posY, posZ, orientation, mapId, displayId, itemCache, bytes1, bytes2, guildId, flags, dynFlags, time, corpseType, instanceId, phaseMask, corpseGuid, guid FROM corpse WHERE corpseType <> 0", CONNECTION_SYNCH)
- PREPARE_STATEMENT(CHAR_INS_CORPSE, "INSERT INTO corpse (corpseGuid, guid, posX, posY, posZ, orientation, mapId, displayId, itemCache, bytes1, bytes2, guildId, flags, dynFlags, time, corpseType, instanceId, phaseMask) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", CONNECTION_ASYNC)
- PREPARE_STATEMENT(CHAR_DEL_CORPSE, "DELETE FROM corpse WHERE corpseGuid = ?", CONNECTION_ASYNC)
- PREPARE_STATEMENT(CHAR_DEL_PLAYER_CORPSES, "DELETE FROM corpse WHERE guid = ? AND corpseType <> 0", CONNECTION_ASYNC)
- PREPARE_STATEMENT(CHAR_DEL_OLD_CORPSES, "DELETE FROM corpse WHERE corpseType = 0 OR time < (UNIX_TIMESTAMP(NOW()) - ?)", CONNECTION_ASYNC)
+ PrepareStatement(CHAR_SEL_CORPSES, "SELECT posX, posY, posZ, orientation, mapId, displayId, itemCache, bytes1, bytes2, guildId, flags, dynFlags, time, corpseType, instanceId, phaseMask, corpseGuid, guid FROM corpse WHERE corpseType <> 0", CONNECTION_SYNCH);
+ PrepareStatement(CHAR_INS_CORPSE, "INSERT INTO corpse (corpseGuid, guid, posX, posY, posZ, orientation, mapId, displayId, itemCache, bytes1, bytes2, guildId, flags, dynFlags, time, corpseType, instanceId, phaseMask) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_CORPSE, "DELETE FROM corpse WHERE corpseGuid = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_PLAYER_CORPSES, "DELETE FROM corpse WHERE guid = ? AND corpseType <> 0", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_OLD_CORPSES, "DELETE FROM corpse WHERE corpseType = 0 OR time < (UNIX_TIMESTAMP(NOW()) - ?)", CONNECTION_ASYNC);
// Creature respawn
- PREPARE_STATEMENT(CHAR_SEL_CREATURE_RESPAWNS, "SELECT guid, respawnTime FROM creature_respawn WHERE mapId = ? AND instanceId = ?", CONNECTION_SYNCH)
- PREPARE_STATEMENT(CHAR_REP_CREATURE_RESPAWN, "REPLACE INTO creature_respawn (guid, respawnTime, mapId, instanceId) VALUES (?, ?, ?, ?)", CONNECTION_ASYNC)
- PREPARE_STATEMENT(CHAR_DEL_CREATURE_RESPAWN, "DELETE FROM creature_respawn WHERE guid = ? AND mapId = ? AND instanceId = ?", CONNECTION_ASYNC)
- PREPARE_STATEMENT(CHAR_DEL_CREATURE_RESPAWN_BY_INSTANCE, "DELETE FROM creature_respawn WHERE mapId = ? AND instanceId = ?", CONNECTION_ASYNC)
- PREPARE_STATEMENT(CHAR_SEL_MAX_CREATURE_RESPAWNS, "SELECT MAX(respawnTime), instanceId FROM creature_respawn WHERE instanceId > 0 GROUP BY instanceId", CONNECTION_SYNCH)
+ PrepareStatement(CHAR_SEL_CREATURE_RESPAWNS, "SELECT guid, respawnTime FROM creature_respawn WHERE mapId = ? AND instanceId = ?", CONNECTION_SYNCH);
+ PrepareStatement(CHAR_REP_CREATURE_RESPAWN, "REPLACE INTO creature_respawn (guid, respawnTime, mapId, instanceId) VALUES (?, ?, ?, ?)", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_CREATURE_RESPAWN, "DELETE FROM creature_respawn WHERE guid = ? AND mapId = ? AND instanceId = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_CREATURE_RESPAWN_BY_INSTANCE, "DELETE FROM creature_respawn WHERE mapId = ? AND instanceId = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_SEL_MAX_CREATURE_RESPAWNS, "SELECT MAX(respawnTime), instanceId FROM creature_respawn WHERE instanceId > 0 GROUP BY instanceId", CONNECTION_SYNCH);
// Gameobject respawn
- PREPARE_STATEMENT(CHAR_SEL_GO_RESPAWNS, "SELECT guid, respawnTime FROM gameobject_respawn WHERE mapId = ? AND instanceId = ?", CONNECTION_SYNCH)
- PREPARE_STATEMENT(CHAR_REP_GO_RESPAWN, "REPLACE INTO gameobject_respawn (guid, respawnTime, mapId, instanceId) VALUES (?, ?, ?, ?)", CONNECTION_ASYNC)
- PREPARE_STATEMENT(CHAR_DEL_GO_RESPAWN, "DELETE FROM gameobject_respawn WHERE guid = ? AND mapId = ? AND instanceId = ?", CONNECTION_ASYNC)
- PREPARE_STATEMENT(CHAR_DEL_GO_RESPAWN_BY_INSTANCE, "DELETE FROM gameobject_respawn WHERE mapId = ? AND instanceId = ?", CONNECTION_ASYNC)
+ PrepareStatement(CHAR_SEL_GO_RESPAWNS, "SELECT guid, respawnTime FROM gameobject_respawn WHERE mapId = ? AND instanceId = ?", CONNECTION_SYNCH);
+ PrepareStatement(CHAR_REP_GO_RESPAWN, "REPLACE INTO gameobject_respawn (guid, respawnTime, mapId, instanceId) VALUES (?, ?, ?, ?)", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_GO_RESPAWN, "DELETE FROM gameobject_respawn WHERE guid = ? AND mapId = ? AND instanceId = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_GO_RESPAWN_BY_INSTANCE, "DELETE FROM gameobject_respawn WHERE mapId = ? AND instanceId = ?", CONNECTION_ASYNC);
// GM Tickets
- PREPARE_STATEMENT(CHAR_SEL_GM_TICKETS, "SELECT ticketId, guid, name, message, createTime, mapId, posX, posY, posZ, lastModifiedTime, closedBy, assignedTo, comment, response, completed, escalated, viewed, haveTicket FROM gm_tickets", CONNECTION_SYNCH)
- PREPARE_STATEMENT(CHAR_REP_GM_TICKET, "REPLACE INTO gm_tickets (ticketId, guid, name, message, createTime, mapId, posX, posY, posZ, lastModifiedTime, closedBy, assignedTo, comment, response, completed, escalated, viewed, haveTicket) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", CONNECTION_ASYNC)
- PREPARE_STATEMENT(CHAR_DEL_GM_TICKET, "DELETE FROM gm_tickets WHERE ticketId = ?", CONNECTION_ASYNC)
- PREPARE_STATEMENT(CHAR_DEL_PLAYER_GM_TICKETS, "DELETE FROM gm_tickets WHERE guid = ?", CONNECTION_ASYNC)
+ PrepareStatement(CHAR_SEL_GM_TICKETS, "SELECT ticketId, guid, name, message, createTime, mapId, posX, posY, posZ, lastModifiedTime, closedBy, assignedTo, comment, response, completed, escalated, viewed, haveTicket FROM gm_tickets", CONNECTION_SYNCH);
+ PrepareStatement(CHAR_REP_GM_TICKET, "REPLACE INTO gm_tickets (ticketId, guid, name, message, createTime, mapId, posX, posY, posZ, lastModifiedTime, closedBy, assignedTo, comment, response, completed, escalated, viewed, haveTicket) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_GM_TICKET, "DELETE FROM gm_tickets WHERE ticketId = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_PLAYER_GM_TICKETS, "DELETE FROM gm_tickets WHERE guid = ?", CONNECTION_ASYNC);
// GM Survey/subsurvey/lag report
- PREPARE_STATEMENT(CHAR_INS_GM_SURVEY, "INSERT INTO gm_surveys (guid, surveyId, mainSurvey, overallComment, createTime) VALUES (?, ?, ?, ?, UNIX_TIMESTAMP(NOW()))", CONNECTION_ASYNC)
- PREPARE_STATEMENT(CHAR_INS_GM_SUBSURVEY, "INSERT INTO gm_subsurveys (surveyId, subsurveyId, rank, comment) VALUES (?, ?, ?, ?)", CONNECTION_ASYNC)
- PREPARE_STATEMENT(CHAR_INS_LAG_REPORT, "INSERT INTO lag_reports (guid, lagType, mapId, posX, posY, posZ, latency, createTime) VALUES (?, ?, ?, ?, ?, ?, ?, ?)", CONNECTION_ASYNC)
+ PrepareStatement(CHAR_INS_GM_SURVEY, "INSERT INTO gm_surveys (guid, surveyId, mainSurvey, overallComment, createTime) VALUES (?, ?, ?, ?, UNIX_TIMESTAMP(NOW()))", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_INS_GM_SUBSURVEY, "INSERT INTO gm_subsurveys (surveyId, subsurveyId, rank, comment) VALUES (?, ?, ?, ?)", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_INS_LAG_REPORT, "INSERT INTO lag_reports (guid, lagType, mapId, posX, posY, posZ, latency, createTime) VALUES (?, ?, ?, ?, ?, ?, ?, ?)", CONNECTION_ASYNC);
// For loading and deleting expired auctions at startup
- PREPARE_STATEMENT(CHAR_SEL_EXPIRED_AUCTIONS, "SELECT id, auctioneerguid, itemguid, itemEntry, count, itemowner, buyoutprice, time, buyguid, lastbid, startbid, deposit FROM auctionhouse ah INNER JOIN item_instance ii ON ii.guid = ah.itemguid WHERE ah.time <= ?", CONNECTION_SYNCH)
+ PrepareStatement(CHAR_SEL_EXPIRED_AUCTIONS, "SELECT id, auctioneerguid, itemguid, itemEntry, count, itemowner, buyoutprice, time, buyguid, lastbid, startbid, deposit FROM auctionhouse ah INNER JOIN item_instance ii ON ii.guid = ah.itemguid WHERE ah.time <= ?", CONNECTION_SYNCH);
// LFG Data
- PREPARE_STATEMENT(CHAR_INS_LFG_DATA, "INSERT INTO lfg_data (guid, dungeon, state) VALUES (?, ?, ?)", CONNECTION_ASYNC)
- PREPARE_STATEMENT(CHAR_DEL_LFG_DATA, "DELETE FROM lfg_data WHERE guid = ?", CONNECTION_ASYNC)
+ PrepareStatement(CHAR_INS_LFG_DATA, "INSERT INTO lfg_data (guid, dungeon, state) VALUES (?, ?, ?)", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_LFG_DATA, "DELETE FROM lfg_data WHERE guid = ?", CONNECTION_ASYNC);
// Player saving
- PREPARE_STATEMENT(CHAR_INS_CHARACTER, "INSERT INTO characters (guid, account, name, race, class, gender, level, xp, money, playerBytes, playerBytes2, playerFlags, "
- "map, instance_id, instance_mode_mask, position_x, position_y, position_z, orientation, "
- "taximask, cinematic, "
- "totaltime, leveltime, rest_bonus, logout_time, is_logout_resting, resettalents_cost, resettalents_time, "
- "extra_flags, stable_slots, at_login, zone, "
- "death_expire_time, taxi_path, arenaPoints, totalHonorPoints, todayHonorPoints, yesterdayHonorPoints, totalKills, "
- "todayKills, yesterdayKills, chosenTitle, knownCurrencies, watchedFaction, drunk, health, power1, power2, power3, "
- "power4, power5, power6, power7, latency, speccount, activespec, exploredZones, equipmentCache, ammoId, knownTitles, actionBars, grantableLevels) VALUES "
- "(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)", CONNECTION_ASYNC);
- PREPARE_STATEMENT(CHAR_UPD_CHARACTER, "UPDATE characters SET name=?,race=?,class=?,gender=?,level=?,xp=?,money=?,playerBytes=?,playerBytes2=?,playerFlags=?,"
- "map=?,instance_id=?,instance_mode_mask=?,position_x=?,position_y=?,position_z=?,orientation=?,taximask=?,cinematic=?,totaltime=?,leveltime=?,rest_bonus=?,"
- "logout_time=?,is_logout_resting=?,resettalents_cost=?,resettalents_time=?,extra_flags=?,stable_slots=?,at_login=?,zone=?,death_expire_time=?,taxi_path=?,"
- "arenaPoints=?,totalHonorPoints=?,todayHonorPoints=?,yesterdayHonorPoints=?,totalKills=?,todayKills=?,yesterdayKills=?,chosenTitle=?,knownCurrencies=?,"
- "watchedFaction=?,drunk=?,health=?,power1=?,power2=?,power3=?,power4=?,power5=?,power6=?,power7=?,latency=?,speccount=?,activespec=?,exploredZones=?,"
- "equipmentCache=?,ammoId=?,knownTitles=?,actionBars=?,grantableLevels=?,online=? WHERE guid=?", CONNECTION_ASYNC);
-
- PREPARE_STATEMENT(CHAR_UPD_ADD_AT_LOGIN_FLAG, "UPDATE characters SET at_login = at_login | ? WHERE guid = ?", CONNECTION_ASYNC);
- PREPARE_STATEMENT(CHAR_UPD_REM_AT_LOGIN_FLAG, "UPDATE characters set at_login = at_login & ~ ? WHERE guid = ?", CONNECTION_ASYNC);
- PREPARE_STATEMENT(CHAR_UPD_ALL_AT_LOGIN_FLAGS, "UPDATE characters SET at_login = at_login | ?", CONNECTION_ASYNC);
- PREPARE_STATEMENT(CHAR_INS_BUG_REPORT, "INSERT INTO bugreport (type, content) VALUES(?, ?)", CONNECTION_ASYNC);
- PREPARE_STATEMENT(CHAR_UPD_PETITION_NAME, "UPDATE petition SET name = ? WHERE petitionguid = ?", CONNECTION_ASYNC);
- PREPARE_STATEMENT(CHAR_INS_PETITION_SIGNATURE, "INSERT INTO petition_sign (ownerguid, petitionguid, playerguid, player_account) VALUES (?, ?, ?, ?)", CONNECTION_ASYNC);
- PREPARE_STATEMENT(CHAR_UPD_ACCOUNT_ONLINE, "UPDATE characters SET online = 0 WHERE account = ?", CONNECTION_ASYNC);
- PREPARE_STATEMENT(CHAR_INS_GROUP, "INSERT INTO groups (guid, leaderGuid, lootMethod, looterGuid, lootThreshold, icon1, icon2, icon3, icon4, icon5, icon6, icon7, icon8, groupType, difficulty, raiddifficulty) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", CONNECTION_ASYNC);
- PREPARE_STATEMENT(CHAR_INS_GROUP_MEMBER, "INSERT INTO group_member (guid, memberGuid, memberFlags, subgroup, roles) VALUES(?, ?, ?, ?, ?)", CONNECTION_ASYNC);
- PREPARE_STATEMENT(CHAR_DEL_GROUP_MEMBER, "DELETE FROM group_member WHERE memberGuid = ?", CONNECTION_ASYNC);
- PREPARE_STATEMENT(CHAR_DEL_GROUP_INSTANCE_PERM_BINDING, "DELETE FROM group_instance WHERE guid = ? AND (permanent = 1 OR instance IN (SELECT instance FROM character_instance WHERE guid = ?))", CONNECTION_ASYNC);
- PREPARE_STATEMENT(CHAR_UPD_GROUP_LEADER, "UPDATE groups SET leaderGuid = ? WHERE guid = ?", CONNECTION_ASYNC);
- PREPARE_STATEMENT(CHAR_UPD_GROUP_TYPE, "UPDATE groups SET groupType = ? WHERE guid = ?", CONNECTION_ASYNC);
- PREPARE_STATEMENT(CHAR_UPD_GROUP_MEMBER_SUBGROUP, "UPDATE group_member SET subgroup = ? WHERE memberGuid = ?", CONNECTION_ASYNC);
- PREPARE_STATEMENT(CHAR_UPD_GROUP_MEMBER_FLAG, "UPDATE group_member SET memberFlags = ? WHERE memberGuid = ?", CONNECTION_ASYNC);
- PREPARE_STATEMENT(CHAR_UPD_GROUP_DIFFICULTY, "UPDATE groups SET difficulty = ? WHERE guid = ?", CONNECTION_ASYNC);
- PREPARE_STATEMENT(CHAR_UPD_GROUP_RAID_DIFFICULTY, "UPDATE groups SET raiddifficulty = ? WHERE guid = ?", CONNECTION_ASYNC);
- PREPARE_STATEMENT(CHAR_DEL_ALL_GM_TICKETS, "TRUNCATE TABLE gm_tickets", CONNECTION_ASYNC);
- PREPARE_STATEMENT(CHAR_DEL_INVALID_SPELL, "DELETE FROM character_talent WHERE spell = ?", CONNECTION_ASYNC);
- PREPARE_STATEMENT(CHAR_UPD_DELETE_INFO, "UPDATE characters SET deleteInfos_Name = name, deleteInfos_Account = account, deleteDate = UNIX_TIMESTAMP(), name = '', account = 0 WHERE guid = ?", CONNECTION_ASYNC);
- PREPARE_STATEMENT(CHAR_UDP_RESTORE_DELETE_INFO, "UPDATE characters SET name = ?, account = ?, deleteDate = NULL, deleteInfos_Name = NULL, deleteInfos_Account = NULL WHERE deleteDate IS NOT NULL AND guid = ?", CONNECTION_ASYNC);
- PREPARE_STATEMENT(CHAR_UPD_ZONE, "UPDATE characters SET zone = ? WHERE guid = ?", CONNECTION_ASYNC);
- PREPARE_STATEMENT(CHAR_UPD_LEVEL, "UPDATE characters SET level = ?, xp = 0 WHERE guid = ?", CONNECTION_ASYNC);
- PREPARE_STATEMENT(CHAR_DEL_INVALID_ACHIEV_PROGRESS_CRITERIA, "DELETE FROM character_achievement_progress WHERE criteria = ?", CONNECTION_ASYNC);
- PREPARE_STATEMENT(CHAR_DEL_INVALID_ACHIEVMENT, "DELETE FROM character_achievement WHERE achievement = ?", CONNECTION_ASYNC);
- PREPARE_STATEMENT(CHAR_INS_ADDON, "INSERT INTO addons (name, crc) VALUES (?, ?)", CONNECTION_ASYNC);
- PREPARE_STATEMENT(CHAR_DEL_INVALID_PET_SPELL, "DELETE FROM pet_spell WHERE spell = ?", CONNECTION_ASYNC);
- PREPARE_STATEMENT(CHAR_DEL_GROUP_INSTANCE_BY_INSTANCE, "DELETE FROM group_instance WHERE instance = ?", CONNECTION_ASYNC);
- PREPARE_STATEMENT(CHAR_DEL_GROUP_INSTANCE_BY_GUID, "DELETE FROM group_instance WHERE guid = ? AND instance = ?", CONNECTION_ASYNC);
- PREPARE_STATEMENT(CHAR_REP_GROUP_INSTANCE, "REPLACE INTO group_instance (guid, instance, permanent) VALUES (?, ?, ?)", CONNECTION_ASYNC);
- PREPARE_STATEMENT(CHAR_UPD_INSTANCE_RESETTIME, "UPDATE instance SET resettime = ? WHERE id = ?", CONNECTION_ASYNC);
- PREPARE_STATEMENT(CHAR_UPD_GLOBAL_INSTANCE_RESETTIME, "UPDATE instance_reset SET resettime = ? WHERE mapid = ? AND difficulty = ?", CONNECTION_ASYNC);
- PREPARE_STATEMENT(CHAR_UPD_CHAR_ONLINE, "UPDATE characters SET online = 1 WHERE guid = ?", CONNECTION_ASYNC);
- PREPARE_STATEMENT(CHAR_UPD_CHAR_NAME_AT_LOGIN, "UPDATE characters set name = ?, at_login = at_login & ~ ? WHERE guid = ?", CONNECTION_ASYNC);
- PREPARE_STATEMENT(CHAR_UPD_WORLDSTATE, "UPDATE worldstates SET value = ? WHERE entry = ?", CONNECTION_ASYNC);
- PREPARE_STATEMENT(CHAR_INS_WORLDSTATE, "INSERT INTO worldstates (entry, value) VALUES (?, ?)", CONNECTION_ASYNC);
- PREPARE_STATEMENT(CHAR_DEL_CHAR_INSTANCE_BY_INSTANCE_GUID, "DELETE FROM character_instance WHERE guid = ? AND instance = ?", CONNECTION_ASYNC);
- PREPARE_STATEMENT(CHAR_UPD_CHAR_INSTANCE, "UPDATE character_instance SET instance = ?, permanent = ? WHERE guid = ? AND instance = ?", CONNECTION_ASYNC);
- PREPARE_STATEMENT(CHAR_INS_CHAR_INSTANCE, "INSERT INTO character_instance (guid, instance, permanent) VALUES (?, ?, ?)", CONNECTION_ASYNC);
- PREPARE_STATEMENT(CHAR_UPD_GENDER_PLAYERBYTES, "UPDATE characters SET gender = ?, playerBytes = ?, playerBytes2 = ? WHERE guid = ?", CONNECTION_ASYNC);
- PREPARE_STATEMENT(CHAR_DEL_CHARACTER_SKILL, "DELETE FROM character_skills WHERE guid = ? AND skill = ?", CONNECTION_ASYNC);
- PREPARE_STATEMENT(CHAR_UPD_ADD_CHARACTER_SOCIAL_FLAGS, "UPDATE character_social SET flags = flags | ? WHERE guid = ? AND friend = ?", CONNECTION_ASYNC);
- PREPARE_STATEMENT(CHAR_UPD_REM_CHARACTER_SOCIAL_FLAGS, "UPDATE character_social SET flags = flags & ~ ? WHERE guid = ? AND friend = ?", CONNECTION_ASYNC);
- PREPARE_STATEMENT(CHAR_INS_CHARACTER_SOCIAL, "INSERT INTO character_social (guid, friend, flags) VALUES (?, ?, ?)", CONNECTION_ASYNC);
- PREPARE_STATEMENT(CHAR_DEL_CHARACTER_SOCIAL, "DELETE FROM character_social WHERE guid = ? AND friend = ?", CONNECTION_ASYNC);
- PREPARE_STATEMENT(CHAR_UPD_CHARACTER_SOCIAL_NOTE, "UPDATE character_social SET note = ? WHERE guid = ? AND friend = ?", CONNECTION_ASYNC);
- PREPARE_STATEMENT(CHAR_UPD_CHARACTER_POSITION, "UPDATE characters SET position_x = ?, position_y = ?, position_z = ?, orientation = ?, map = ?, zone = ?, trans_x = 0, trans_y = 0, trans_z = 0, transguid = 0, taxi_path = '' WHERE guid = ?", CONNECTION_ASYNC);
- PREPARE_STATEMENT(CHAR_SEL_CHARACTER_AURA_FROZEN, "SELECT characters.name FROM characters LEFT JOIN character_aura ON (characters.guid = character_aura.guid) WHERE character_aura.spell = 9454", CONNECTION_SYNCH);
- PREPARE_STATEMENT(CHAR_SEL_CHARACTER_ONLINE, "SELECT name, account, map, zone FROM characters WHERE online > 0", CONNECTION_SYNCH);
- PREPARE_STATEMENT(CHAR_SEL_CHAR_DEL_INFO_BY_GUID, "SELECT guid, deleteInfos_Name, deleteInfos_Account, deleteDate FROM characters WHERE deleteDate IS NOT NULL AND guid = ?", CONNECTION_SYNCH);
- PREPARE_STATEMENT(CHAR_SEL_CHAR_DEL_INFO_BY_NAME, "SELECT guid, deleteInfos_Name, deleteInfos_Account, deleteDate FROM characters WHERE deleteDate IS NOT NULL AND deleteInfos_Name LIKE CONCAT('%%', ?, '%%')", CONNECTION_SYNCH);
- PREPARE_STATEMENT(CHAR_SEL_CHAR_DEL_INFO, "SELECT guid, deleteInfos_Name, deleteInfos_Account, deleteDate FROM characters WHERE deleteDate IS NOT NULL", CONNECTION_SYNCH);
- PREPARE_STATEMENT(CHAR_SEL_CHARS_BY_ACCOUNT_ID, "SELECT guid FROM characters WHERE account = ?", CONNECTION_SYNCH);
- PREPARE_STATEMENT(CHAR_SEL_CHAR_PINFO, "SELECT totaltime, level, money, account, race, class, map, zone FROM characters WHERE guid = ?", CONNECTION_SYNCH);
- PREPARE_STATEMENT(CHAR_SEL_PINFO_BANS, "SELECT unbandate, bandate = unbandate, bannedby, banreason FROM character_banned WHERE guid = ? AND active ORDER BY bandate ASC LIMIT 1", CONNECTION_SYNCH);
- PREPARE_STATEMENT(CHAR_SEL_CHAR_HOMEBIND, "SELECT mapId, zoneId, posX, posY, posZ FROM character_homebind WHERE guid = ?", CONNECTION_SYNCH);
- PREPARE_STATEMENT(CHAR_SEL_CHAR_GUID_NAME_BY_ACC, "SELECT guid, name FROM characters WHERE account = ?", CONNECTION_SYNCH);
- PREPARE_STATEMENT(CHAR_SEL_POOL_QUEST_SAVE, "SELECT quest_id FROM pool_quest_save WHERE pool_id = ?", CONNECTION_SYNCH);
- PREPARE_STATEMENT(CHAR_SEL_CHARACTER_AT_LOGIN, "SELECT at_login FROM characters WHERE guid = ?", CONNECTION_SYNCH);
- PREPARE_STATEMENT(CHAR_SEL_CHAR_CLASS_LVL_AT_LOGIN, "SELECT class, level, at_login, knownTitles FROM characters WHERE guid = ?", CONNECTION_SYNCH);
- PREPARE_STATEMENT(CHAR_SEL_CHAR_AT_LOGIN_TITLES, "SELECT at_login, knownTitles FROM characters WHERE guid = ?", CONNECTION_SYNCH);
- PREPARE_STATEMENT(CHAR_SEL_INSTANCE, "SELECT data, completedEncounters FROM instance WHERE map = ? AND id = ?", CONNECTION_SYNCH);
- PREPARE_STATEMENT(CHAR_SEL_PET_SPELL_LIST, "SELECT DISTINCT pet_spell.spell FROM pet_spell, character_pet WHERE character_pet.owner = ? AND character_pet.id = pet_spell.guid AND character_pet.id <> ?", CONNECTION_SYNCH);
- PREPARE_STATEMENT(CHAR_SEL_CHAR_PET, "SELECT id FROM character_pet WHERE owner = ? AND id <> ?", CONNECTION_SYNCH);
- PREPARE_STATEMENT(CHAR_SEL_CHAR_PETS, "SELECT id FROM character_pet WHERE owner = ?", CONNECTION_SYNCH);
- PREPARE_STATEMENT(CHAR_SEL_CHAR_COD_ITEM_MAIL, "SELECT id, messageType, mailTemplateId, sender, subject, body, money, has_items FROM mail WHERE receiver = ? AND has_items <> 0 AND cod <> 0", CONNECTION_SYNCH);
- PREPARE_STATEMENT(CHAR_SEL_CHAR_SOCIAL, "SELECT DISTINCT guid FROM character_social WHERE friend = ?", CONNECTION_SYNCH);
- PREPARE_STATEMENT(CHAR_SEL_PET_AURA, "SELECT caster_guid, spell, effect_mask, recalculate_mask, stackcount, amount0, amount1, amount2, base_amount0, base_amount1, base_amount2, maxduration, remaintime, remaincharges FROM pet_aura WHERE guid = ?", CONNECTION_SYNCH);
- PREPARE_STATEMENT(CHAR_SEL_CHAR_OLD_CHARS, "SELECT guid, deleteInfos_Account FROM characters WHERE deleteDate IS NOT NULL AND deleteDate < ?", CONNECTION_SYNCH);
- PREPARE_STATEMENT(CHAR_SEL_ARENA_TEAM_ID_BY_PLAYER_GUID, "SELECT arena_team_member.arenateamid FROM arena_team_member JOIN arena_team ON arena_team_member.arenateamid = arena_team.arenateamid WHERE guid = ? AND type = ? LIMIT 1", CONNECTION_SYNCH);
- PREPARE_STATEMENT(CHAR_SEL_MAIL, "SELECT id, messageType, sender, receiver, subject, body, has_items, expire_time, deliver_time, money, cod, checked, stationery, mailTemplateId FROM mail WHERE receiver = ? ORDER BY id DESC", CONNECTION_SYNCH);
- PREPARE_STATEMENT(CHAR_SEL_CHAR_PLAYERBYTES2, "SELECT playerBytes2 FROM characters WHERE guid = ?", CONNECTION_SYNCH);
- PREPARE_STATEMENT(CHAR_SEL_PET_SPELL, "SELECT spell, active FROM pet_spell WHERE guid = ?", CONNECTION_SYNCH);
- PREPARE_STATEMENT(CHAR_SEL_PET_SPELL_COOLDOWN, "SELECT spell, time FROM pet_spell_cooldown WHERE guid = ?", CONNECTION_SYNCH);
- PREPARE_STATEMENT(CHAR_SEL_PET_DECLINED_NAME, "SELECT genitive, dative, accusative, instrumental, prepositional FROM character_pet_declinedname WHERE owner = ? AND id = ?", CONNECTION_SYNCH);
- PREPARE_STATEMENT(CHAR_SEL_CHAR_GUID_BY_NAME, "SELECT guid FROM characters WHERE name = ?", CONNECTION_SYNCH);
- PREPARE_STATEMENT(CHAR_DEL_CHAR_AURA_FROZEN, "DELETE FROM character_aura WHERE spell = 9454 AND guid = ?", CONNECTION_ASYNC);
- PREPARE_STATEMENT(CHAR_SEL_CHAR_INVENTORY_COUNT_ITEM, "SELECT COUNT(itemEntry) FROM character_inventory ci INNER JOIN item_instance ii ON ii.guid = ci.item WHERE itemEntry = ?", CONNECTION_SYNCH);
- PREPARE_STATEMENT(CHAR_SEL_MAIL_COUNT_ITEM, "SELECT COUNT(itemEntry) FROM mail_items mi INNER JOIN item_instance ii ON ii.guid = mi.item_guid WHERE itemEntry = ?", CONNECTION_SYNCH);
- PREPARE_STATEMENT(CHAR_SEL_AUCTIONHOUSE_COUNT_ITEM,"SELECT COUNT(itemEntry) FROM auctionhouse ah INNER JOIN item_instance ii ON ii.guid = ah.itemguid WHERE itemEntry = ?", CONNECTION_SYNCH);
- PREPARE_STATEMENT(CHAR_SEL_GUILD_BANK_COUNT_ITEM, "SELECT COUNT(itemEntry) FROM guild_bank_item gbi INNER JOIN item_instance ii ON ii.guid = gbi.item_guid WHERE itemEntry = ?", CONNECTION_SYNCH);
- PREPARE_STATEMENT(CHAR_SEL_CHAR_INVENTORY_ITEM_BY_ENTRY, "SELECT ci.item, cb.slot AS bag, ci.slot, ci.guid, c.account, c.name FROM characters c INNER JOIN character_inventory ci ON ci.guid = c.guid INNER JOIN item_instance ii ON ii.guid = ci.item LEFT JOIN character_inventory cb ON cb.item = ci.bag WHERE ii.itemEntry = ? LIMIT ?", CONNECTION_SYNCH);
- PREPARE_STATEMENT(CHAR_SEL_MAIL_ITEMS_BY_ENTRY, "SELECT mi.item_guid, m.sender, m.receiver, cs.account, cs.name, cr.account, cr.name FROM mail m INNER JOIN mail_items mi ON mi.mail_id = m.id INNER JOIN item_instance ii ON ii.guid = mi.item_guid INNER JOIN characters cs ON cs.guid = m.sender INNER JOIN characters cr ON cr.guid = m.receiver WHERE ii.itemEntry = ? LIMIT ?", CONNECTION_SYNCH);
- PREPARE_STATEMENT(CHAR_SEL_AUCTIONHOUSE_ITEM_BY_ENTRY, "SELECT ah.itemguid, ah.itemowner, c.account, c.name FROM auctionhouse ah INNER JOIN characters c ON c.guid = ah.itemowner INNER JOIN item_instance ii ON ii.guid = ah.itemguid WHERE ii.itemEntry = ? LIMIT ?", CONNECTION_SYNCH);
- PREPARE_STATEMENT(CHAR_SEL_GUILD_BANK_ITEM_BY_ENTRY, "SELECT gi.item_guid, gi.guildid, g.name FROM guild_bank_item gi INNER JOIN guild g ON g.guildid = gi.guildid INNER JOIN item_instance ii ON ii.guid = gi.item_guid WHERE ii.itemEntry = ? LIMIT ?", CONNECTION_SYNCH);
- PREPARE_STATEMENT(CHAR_SEL_CHAR_PET_BY_ENTRY, "SELECT id, entry, owner, modelid, level, exp, Reactstate, slot, name, renamed, curhealth, curmana, curhappiness, abdata, savetime, CreatedBySpell, PetType FROM character_pet WHERE owner = ? AND id = ?", CONNECTION_SYNCH);
- PREPARE_STATEMENT(CHAR_SEL_CHAR_PET_BY_ENTRY_AND_SLOT_2, "SELECT id, entry, owner, modelid, level, exp, Reactstate, slot, name, renamed, curhealth, curmana, curhappiness, abdata, savetime, CreatedBySpell, PetType FROM character_pet WHERE owner = ? AND entry = ? AND (slot = ? OR slot > ?)", CONNECTION_SYNCH);
- PREPARE_STATEMENT(CHAR_SEL_CHAR_PET_BY_SLOT, "SELECT id, entry, owner, modelid, level, exp, Reactstate, slot, name, renamed, curhealth, curmana, curhappiness, abdata, savetime, CreatedBySpell, PetType FROM character_pet WHERE owner = ? AND (slot = ? OR slot > ?) ", CONNECTION_SYNCH);
- PREPARE_STATEMENT(CHAR_DEL_CHAR_ACHIEVEMENT, "DELETE FROM character_achievement WHERE guid = ?", CONNECTION_ASYNC);
- PREPARE_STATEMENT(CHAR_DEL_CHAR_ACHIEVEMENT_PROGRESS, "DELETE FROM character_achievement_progress WHERE guid = ?", CONNECTION_ASYNC);
- PREPARE_STATEMENT(CHAR_DEL_CHAR_REPUTATION_BY_FACTION, "DELETE FROM character_reputation WHERE guid = ? AND faction = ?", CONNECTION_ASYNC);
- PREPARE_STATEMENT(CHAR_INS_CHAR_REPUTATION_BY_FACTION, "INSERT INTO character_reputation (guid, faction, standing, flags) VALUES (?, ?, ? , ?)", CONNECTION_ASYNC);
- PREPARE_STATEMENT(CHAR_UPD_CHAR_ARENA_POINTS, "UPDATE characters SET arenaPoints = (arenaPoints + ?) WHERE guid = ?", CONNECTION_ASYNC);
- PREPARE_STATEMENT(CHAR_DEL_ITEM_REFUND_INSTANCE, "DELETE FROM item_refund_instance WHERE item_guid = ?", CONNECTION_ASYNC);
- PREPARE_STATEMENT(CHAR_INS_ITEM_REFUND_INSTANCE, "INSERT INTO item_refund_instance (item_guid, player_guid, paidMoney, paidExtendedCost) VALUES (?, ?, ?, ?)", CONNECTION_ASYNC);
- PREPARE_STATEMENT(CHAR_DEL_GROUP, "DELETE FROM groups WHERE guid = ?", CONNECTION_ASYNC);
- PREPARE_STATEMENT(CHAR_DEL_GROUP_MEMBER_ALL, "DELETE FROM group_member WHERE guid = ?", CONNECTION_ASYNC);
- PREPARE_STATEMENT(CHAR_INS_CHAR_GIFT, "INSERT INTO character_gifts (guid, item_guid, entry, flags) VALUES (?, ?, ?, ?)", CONNECTION_ASYNC);
- PREPARE_STATEMENT(CHAR_DEL_INSTANCE_BY_INSTANCE, "DELETE FROM instance WHERE id = ?", CONNECTION_ASYNC);
- PREPARE_STATEMENT(CHAR_DEL_CHAR_INSTANCE_BY_INSTANCE, "DELETE FROM character_instance WHERE instance = ?", CONNECTION_ASYNC);
- PREPARE_STATEMENT(CHAR_DEL_CHAR_INSTANCE_BY_MAP_DIFF, "DELETE FROM character_instance USING character_instance LEFT JOIN instance ON character_instance.instance = id WHERE map = ? and difficulty = ?", CONNECTION_ASYNC);
- PREPARE_STATEMENT(CHAR_DEL_GROUP_INSTANCE_BY_MAP_DIFF, "DELETE FROM group_instance USING group_instance LEFT JOIN instance ON group_instance.instance = id WHERE map = ? and difficulty = ?", CONNECTION_ASYNC);
- PREPARE_STATEMENT(CHAR_DEL_INSTANCE_BY_MAP_DIFF, "DELETE FROM instance WHERE map = ? and difficulty = ?", CONNECTION_ASYNC);
- PREPARE_STATEMENT(CHAR_DEL_MAIL_ITEM_BY_ID, "DELETE FROM mail_items WHERE mail_id = ?", CONNECTION_ASYNC);
- PREPARE_STATEMENT(CHAR_DEL_CHAR_PET_DECLINEDNAME, "DELETE FROM character_pet_declinedname WHERE id = ?", CONNECTION_ASYNC);
- PREPARE_STATEMENT(CHAR_ADD_CHAR_PET_DECLINEDNAME, "INSERT INTO character_pet_declinedname (id, owner, genitive, dative, accusative, instrumental, prepositional) VALUES (?, ?, ?, ?, ?, ?, ?)", CONNECTION_ASYNC);
- PREPARE_STATEMENT(CHAR_UPD_CHAR_PET_NAME, "UPDATE character_pet SET name = ?, renamed = 1 WHERE owner = ? AND id = ?", CONNECTION_ASYNC);
- PREPARE_STATEMENT(CHAR_INS_PETITION, "INSERT INTO petition (ownerguid, petitionguid, name, type) VALUES (?, ?, ?, ?)", CONNECTION_ASYNC);
- PREPARE_STATEMENT(CHAR_DEL_PETITION_BY_GUID, "DELETE FROM petition WHERE petitionguid = ?", CONNECTION_ASYNC);
- PREPARE_STATEMENT(CHAR_DEL_PETITION_SIGNATURE_BY_GUID, "DELETE FROM petition_sign WHERE petitionguid = ?", CONNECTION_ASYNC);
- PREPARE_STATEMENT(CHAR_UDP_CHAR_PET_SLOT_BY_SLOT_EXCLUDE_ID, "UPDATE character_pet SET slot = ? WHERE owner = ? AND slot = ? AND id <> ?", CONNECTION_ASYNC);
- PREPARE_STATEMENT(CHAR_UDP_CHAR_PET_SLOT_BY_SLOT, "UPDATE character_pet SET slot = ? WHERE owner = ? AND slot = ?", CONNECTION_ASYNC);
- PREPARE_STATEMENT(CHAR_UPD_CHAR_PET_SLOT_BY_ID, "UPDATE character_pet SET slot = ? WHERE owner = ? AND id = ?", CONNECTION_ASYNC);
- PREPARE_STATEMENT(CHAR_DEL_CHAR_PET_BY_ID, "DELETE FROM character_pet WHERE id = ?", CONNECTION_ASYNC);
- PREPARE_STATEMENT(CHAR_DEL_CHAR_PET_BY_SLOT, "DELETE FROM character_pet WHERE owner = ? AND (slot = ? OR slot > ?)", CONNECTION_ASYNC);
- PREPARE_STATEMENT(CHAR_DEL_PET_AURAS, "DELETE FROM pet_aura WHERE guid = ?", CONNECTION_ASYNC);
- PREPARE_STATEMENT(CHAR_DEL_PET_SPELLS, "DELETE FROM pet_spell WHERE guid = ?", CONNECTION_ASYNC);
- PREPARE_STATEMENT(CHAR_DEL_PET_SPELL_COOLDOWNS, "DELETE FROM pet_spell_cooldown WHERE guid = ?", CONNECTION_ASYNC);
- PREPARE_STATEMENT(CHAR_INS_PET_SPELL_COOLDOWN, "INSERT INTO pet_spell_cooldown (guid, spell, time) VALUES (?, ?, ?)", CONNECTION_ASYNC);
- PREPARE_STATEMENT(CHAR_DEL_PET_SPELL_BY_SPELL, "DELETE FROM pet_spell WHERE guid = ? and spell = ?", CONNECTION_ASYNC);
- PREPARE_STATEMENT(CHAR_INS_PET_SPELL, "INSERT INTO pet_spell (guid, spell, active) VALUES (?, ?, ?)", CONNECTION_ASYNC);
- PREPARE_STATEMENT(CHAR_INS_PET_AURA, "INSERT INTO pet_aura (guid, caster_guid, spell, effect_mask, recalculate_mask, stackcount, amount0, amount1, amount2, base_amount0, base_amount1, base_amount2, maxduration, remaintime, remaincharges) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", CONNECTION_ASYNC);
- PREPARE_STATEMENT(CHAR_DEL_CHAR_DECLINED_NAME, "DELETE FROM character_declinedname WHERE guid = ?", CONNECTION_ASYNC);
- PREPARE_STATEMENT(CHAR_INS_CHAR_DECLINED_NAME, "INSERT INTO character_declinedname (guid, genitive, dative, accusative, instrumental, prepositional) VALUES (?, ?, ?, ?, ?, ?)", CONNECTION_ASYNC);
- PREPARE_STATEMENT(CHAR_UPD_FACTION_OR_RACE, "UPDATE characters SET name = ?, race = ?, at_login = at_login & ~ ? WHERE guid = ?", CONNECTION_ASYNC);
- PREPARE_STATEMENT(CHAR_DEL_CHAR_SKILL_LANGUAGES, "DELETE FROM character_skills WHERE skill IN (98, 113, 759, 111, 313, 109, 115, 315, 673, 137) AND guid = ?", CONNECTION_ASYNC);
- PREPARE_STATEMENT(CHAR_INS_CHAR_SKILL_LANGUAGE, "INSERT INTO `character_skills` (guid, skill, value, max) VALUES (?, ?, 300, 300)", CONNECTION_ASYNC);
- PREPARE_STATEMENT(CHAR_UPD_CHAR_TAXI_PATH, "UPDATE characters SET taxi_path = '' WHERE guid = ?", CONNECTION_ASYNC);
- PREPARE_STATEMENT(CHAR_UPD_CHAR_TAXIMASK, "UPDATE characters SET taximask = ? WHERE guid = ?", CONNECTION_ASYNC);
- PREPARE_STATEMENT(CHAR_DEL_CHAR_QUESTSTATUS, "DELETE FROM character_queststatus WHERE guid = ?", CONNECTION_ASYNC);
- PREPARE_STATEMENT(CHAR_DEL_CHAR_SOCIAL_BY_GUID, "DELETE FROM character_social WHERE guid = ?", CONNECTION_ASYNC);
- PREPARE_STATEMENT(CHAR_DEL_CHAR_SOCIAL_BY_FRIEND, "DELETE FROM character_social WHERE friend = ?", CONNECTION_ASYNC);
- PREPARE_STATEMENT(CHAR_DEL_CHAR_ACHIEVEMENT_BY_ACHIEVEMENT, "DELETE FROM character_achievement WHERE achievement = ? AND guid = ?", CONNECTION_ASYNC);
- PREPARE_STATEMENT(CHAR_UPD_CHAR_ACHIEVEMENT, "UPDATE character_achievement SET achievement = ? where achievement = ? AND guid = ?", CONNECTION_ASYNC);
- PREPARE_STATEMENT(CHAR_UPD_CHAR_INVENTORY_FACTION_CHANGE, "UPDATE item_instance ii, character_inventory ci SET ii.itemEntry = ? WHERE ii.itemEntry = ? AND ci.guid = ? AND ci.item = ii.guid", CONNECTION_ASYNC);
- PREPARE_STATEMENT(CHAR_DEL_CHAR_SPELL_BY_SPELL, "DELETE FROM character_spell WHERE spell = ? AND guid = ?", CONNECTION_ASYNC);
- PREPARE_STATEMENT(CHAR_UPD_CHAR_SPELL_FACTION_CHANGE, "UPDATE character_spell SET spell = ? where spell = ? AND guid = ?", CONNECTION_ASYNC);
- PREPARE_STATEMENT(CHAR_SEL_CHAR_REP_BY_FACTION, "SELECT standing FROM character_reputation WHERE faction = ? AND guid = ?", CONNECTION_SYNCH);
- PREPARE_STATEMENT(CHAR_DEL_CHAR_REP_BY_FACTION, "DELETE FROM character_reputation WHERE faction = ? AND guid = ?", CONNECTION_ASYNC);
- PREPARE_STATEMENT(CHAR_UPD_CHAR_REP_FACTION_CHANGE, "UPDATE character_reputation SET faction = ?, standing = ? WHERE faction = ? AND guid = ?", CONNECTION_ASYNC);
- PREPARE_STATEMENT(CHAR_UPD_CHAR_TITLES_FACTION_CHANGE, "UPDATE characters SET knownTitles = ? WHERE guid = ?", CONNECTION_ASYNC);
- PREPARE_STATEMENT(CHAR_RES_CHAR_TITLES_FACTION_CHANGE, "UPDATE characters SET chosenTitle = 0 WHERE guid = ?", CONNECTION_ASYNC);
- PREPARE_STATEMENT(CHAR_DEL_CHAR_SPELL_COOLDOWN, "DELETE FROM character_spell_cooldown WHERE guid = ?", CONNECTION_ASYNC);
- PREPARE_STATEMENT(CHAR_DEL_CHARACTER, "DELETE FROM characters WHERE guid = ?", CONNECTION_ASYNC);
- PREPARE_STATEMENT(CHAR_DEL_CHAR_ACTION, "DELETE FROM character_action WHERE guid = ?", CONNECTION_ASYNC);
- PREPARE_STATEMENT(CHAR_DEL_CHAR_AURA, "DELETE FROM character_aura WHERE guid = ?", CONNECTION_ASYNC);
- PREPARE_STATEMENT(CHAR_DEL_CHAR_GIFT, "DELETE FROM character_gifts WHERE guid = ?", CONNECTION_ASYNC);
- PREPARE_STATEMENT(CHAR_DEL_CHAR_INSTANCE, "DELETE FROM character_instance WHERE guid = ?", CONNECTION_ASYNC);
- PREPARE_STATEMENT(CHAR_DEL_CHAR_INVENTORY, "DELETE FROM character_inventory WHERE guid = ?", CONNECTION_ASYNC);
- PREPARE_STATEMENT(CHAR_DEL_CHAR_QUESTSTATUS_REWARDED, "DELETE FROM character_queststatus_rewarded WHERE guid = ?", CONNECTION_ASYNC);
- PREPARE_STATEMENT(CHAR_DEL_CHAR_REPUTATION, "DELETE FROM character_reputation WHERE guid = ?", CONNECTION_ASYNC);
- PREPARE_STATEMENT(CHAR_DEL_CHAR_SPELL, "DELETE FROM character_spell WHERE guid = ?", CONNECTION_ASYNC);
- PREPARE_STATEMENT(CHAR_DEL_MAIL, "DELETE FROM mail WHERE receiver = ?", CONNECTION_ASYNC);
- PREPARE_STATEMENT(CHAR_DEL_MAIL_ITEMS, "DELETE FROM mail_items WHERE receiver = ?", CONNECTION_ASYNC);
- PREPARE_STATEMENT(CHAR_DEL_CHAR_PET_BY_OWNER, "DELETE FROM character_pet WHERE owner = ?", CONNECTION_ASYNC);
- PREPARE_STATEMENT(CHAR_DEL_CHAR_PET_DECLINEDNAME_BY_OWNER, "DELETE FROM character_pet_declinedname WHERE owner = ?", CONNECTION_ASYNC);
- PREPARE_STATEMENT(CHAR_DEL_CHAR_ACHIEVEMENTS, "DELETE FROM character_achievement WHERE guid = ? AND achievement NOT BETWEEN '456' AND '467' AND achievement NOT BETWEEN '1400' AND '1427' AND achievement NOT IN(1463, 3117, 3259)", CONNECTION_ASYNC);
- PREPARE_STATEMENT(CHAR_DEL_CHAR_EQUIPMENTSETS, "DELETE FROM character_equipmentsets WHERE guid = ?", CONNECTION_ASYNC);
- PREPARE_STATEMENT(CHAR_DEL_GUILD_EVENTLOG_BY_PLAYER, "DELETE FROM guild_eventlog WHERE PlayerGuid1 = ? OR PlayerGuid2 = ?", CONNECTION_ASYNC);
- PREPARE_STATEMENT(CHAR_DEL_GUILD_BANK_EVENTLOG_BY_PLAYER, "DELETE FROM guild_bank_eventlog WHERE PlayerGuid = ?", CONNECTION_ASYNC);
- PREPARE_STATEMENT(CHAR_DEL_CHAR_GLYPHS, "DELETE FROM character_glyphs WHERE guid = ?", CONNECTION_ASYNC);
- PREPARE_STATEMENT(CHAR_DEL_CHAR_QUESTSTATUS_DAILY, "DELETE FROM character_queststatus_daily WHERE guid = ?", CONNECTION_ASYNC);
- PREPARE_STATEMENT(CHAR_DEL_CHAR_TALENT, "DELETE FROM character_talent WHERE guid = ?", CONNECTION_ASYNC);
- PREPARE_STATEMENT(CHAR_DEL_CHAR_SKILLS, "DELETE FROM character_skills WHERE guid = ?", CONNECTION_ASYNC);
- PREPARE_STATEMENT(CHAR_UDP_CHAR_HONOR_POINTS, "UPDATE characters SET totalHonorPoints = ? WHERE guid = ?", CONNECTION_ASYNC);
- PREPARE_STATEMENT(CHAR_UDP_CHAR_ARENA_POINTS, "UPDATE characters SET arenaPoints = ? WHERE guid = ?", CONNECTION_ASYNC);
- PREPARE_STATEMENT(CHAR_UDP_CHAR_MONEY, "UPDATE characters SET money = ? WHERE guid = ?", CONNECTION_ASYNC);
- PREPARE_STATEMENT(CHAR_INS_CHAR_ACTION, "INSERT INTO character_action (guid, spec, button, action, type) VALUES (?, ?, ?, ?, ?)", CONNECTION_ASYNC);
- PREPARE_STATEMENT(CHAR_UPD_CHAR_ACTION, "UPDATE character_action SET action = ?, type = ? WHERE guid = ? AND button = ? AND spec = ?", CONNECTION_ASYNC);
- PREPARE_STATEMENT(CHAR_DEL_CHAR_ACTION_BY_BUTTON_SPEC, "DELETE FROM character_action WHERE guid = ? and button = ? and spec = ?", CONNECTION_ASYNC);
- PREPARE_STATEMENT(CHAR_DEL_CHAR_INVENTORY_BY_ITEM, "DELETE FROM character_inventory WHERE item = ?", CONNECTION_ASYNC);
- PREPARE_STATEMENT(CHAR_DEL_CHAR_INVENTORY_BY_BAG_SLOT, "DELETE FROM character_inventory WHERE bag = ? AND slot = ? AND guid = ?", CONNECTION_ASYNC);
- PREPARE_STATEMENT(CHAR_UPD_MAIL, "UPDATE mail SET has_items = ?, expire_time = ?, deliver_time = ?, money = ?, cod = ?, checked = ? WHERE id = ?", CONNECTION_ASYNC);
- PREPARE_STATEMENT(CHAR_REP_CHAR_QUESTSTATUS, "REPLACE INTO character_queststatus (guid, quest, status, explored, timer, mobcount1, mobcount2, mobcount3, mobcount4, itemcount1, itemcount2, itemcount3, itemcount4, playercount) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", CONNECTION_ASYNC);
- PREPARE_STATEMENT(CHAR_DEL_CHAR_QUESTSTATUS_BY_QUEST, "DELETE FROM character_queststatus WHERE guid = ? AND quest = ?", CONNECTION_ASYNC);
- PREPARE_STATEMENT(CHAR_INS_CHAR_QUESTSTATUS, "INSERT IGNORE INTO character_queststatus_rewarded (guid, quest) VALUES (?, ?)", CONNECTION_ASYNC);
- PREPARE_STATEMENT(CHAR_DEL_CHAR_QUESTSTATUS_REWARDED_BY_QUEST, "DELETE FROM character_queststatus_rewarded WHERE guid = ? AND quest = ?", CONNECTION_ASYNC);
- PREPARE_STATEMENT(CHAR_DEL_CHAR_SKILL_BY_SKILL, "DELETE FROM character_skills WHERE guid = ? AND skill = ?", CONNECTION_ASYNC);
- PREPARE_STATEMENT(CHAR_INS_CHAR_SKILLS, "INSERT INTO character_skills (guid, skill, value, max) VALUES (?, ?, ?, ?)", CONNECTION_ASYNC);
- PREPARE_STATEMENT(CHAR_UDP_CHAR_SKILLS, "UPDATE character_skills SET value = ?, max = ? WHERE guid = ? AND skill = ?", CONNECTION_ASYNC);
- PREPARE_STATEMENT(CHAR_INS_CHAR_SPELL, "INSERT INTO character_spell (guid, spell, active, disabled) VALUES (?, ?, ?, ?)", CONNECTION_ASYNC);
- PREPARE_STATEMENT(CHAR_DEL_CHAR_STATS, "DELETE FROM character_stats WHERE guid = ?", CONNECTION_ASYNC);
- PREPARE_STATEMENT(CHAR_INS_CHAR_STATS, "INSERT INTO character_stats (guid, maxhealth, maxpower1, maxpower2, maxpower3, maxpower4, maxpower5, maxpower6, maxpower7, strength, agility, stamina, intellect, spirit, armor, resHoly, resFire, resNature, resFrost, resShadow, resArcane, blockPct, dodgePct, parryPct, critPct, rangedCritPct, spellCritPct, attackPower, rangedAttackPower, spellPower, resilience) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", CONNECTION_ASYNC);
- PREPARE_STATEMENT(CHAR_DEL_PETITION_BY_OWNER, "DELETE FROM petition WHERE ownerguid = ?", CONNECTION_ASYNC);
- PREPARE_STATEMENT(CHAR_DEL_PETITION_SIGNATURE_BY_OWNER, "DELETE FROM petition_sign WHERE ownerguid = ?", CONNECTION_ASYNC);
- PREPARE_STATEMENT(CHAR_DEL_PETITION_BY_OWNER_AND_TYPE, "DELETE FROM petition WHERE ownerguid = ? AND type = ?", CONNECTION_ASYNC);
- PREPARE_STATEMENT(CHAR_DEL_PETITION_SIGNATURE_BY_OWNER_AND_TYPE, "DELETE FROM petition_sign WHERE ownerguid = ? AND type = ?", CONNECTION_ASYNC);
- PREPARE_STATEMENT(CHAR_INS_CHAR_GLYPHS, "INSERT INTO character_glyphs VALUES(?, ?, ?, ?, ?, ?, ?, ?)", CONNECTION_ASYNC);
- PREPARE_STATEMENT(CHAR_DEL_CHAR_TALENT_BY_SPELL_SPEC, "DELETE FROM character_talent WHERE guid = ? and spell = ? and spec = ?", CONNECTION_ASYNC);
- PREPARE_STATEMENT(CHAR_INS_CHAR_TALENT, "INSERT INTO character_talent (guid, spell, spec) VALUES (?, ?, ?)", CONNECTION_ASYNC);
- PREPARE_STATEMENT(CHAR_DEL_CHAR_ACTION_EXCEPT_SPEC, "DELETE FROM character_action WHERE spec<>? AND guid = ?", CONNECTION_ASYNC);
- PREPARE_STATEMENT(CHAR_SEL_CHAR_PET_BY_ENTRY_AND_SLOT, "SELECT id, entry, owner, modelid, level, exp, Reactstate, slot, name, renamed, curhealth, curmana, curhappiness, abdata, savetime, CreatedBySpell, PetType FROM character_pet WHERE owner = ? AND slot = ?", CONNECTION_SYNCH);
+ PrepareStatement(CHAR_INS_CHARACTER, "INSERT INTO characters (guid, account, name, race, class, gender, level, xp, money, playerBytes, playerBytes2, playerFlags, "
+ "map, instance_id, instance_mode_mask, position_x, position_y, position_z, orientation, "
+ "taximask, cinematic, "
+ "totaltime, leveltime, rest_bonus, logout_time, is_logout_resting, resettalents_cost, resettalents_time, "
+ "extra_flags, stable_slots, at_login, zone, "
+ "death_expire_time, taxi_path, arenaPoints, totalHonorPoints, todayHonorPoints, yesterdayHonorPoints, totalKills, "
+ "todayKills, yesterdayKills, chosenTitle, knownCurrencies, watchedFaction, drunk, health, power1, power2, power3, "
+ "power4, power5, power6, power7, latency, speccount, activespec, exploredZones, equipmentCache, ammoId, knownTitles, actionBars, grantableLevels) VALUES "
+ "(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_UPD_CHARACTER, "UPDATE characters SET name=?,race=?,class=?,gender=?,level=?,xp=?,money=?,playerBytes=?,playerBytes2=?,playerFlags=?,"
+ "map=?,instance_id=?,instance_mode_mask=?,position_x=?,position_y=?,position_z=?,orientation=?,taximask=?,cinematic=?,totaltime=?,leveltime=?,rest_bonus=?,"
+ "logout_time=?,is_logout_resting=?,resettalents_cost=?,resettalents_time=?,extra_flags=?,stable_slots=?,at_login=?,zone=?,death_expire_time=?,taxi_path=?,"
+ "arenaPoints=?,totalHonorPoints=?,todayHonorPoints=?,yesterdayHonorPoints=?,totalKills=?,todayKills=?,yesterdayKills=?,chosenTitle=?,knownCurrencies=?,"
+ "watchedFaction=?,drunk=?,health=?,power1=?,power2=?,power3=?,power4=?,power5=?,power6=?,power7=?,latency=?,speccount=?,activespec=?,exploredZones=?,"
+ "equipmentCache=?,ammoId=?,knownTitles=?,actionBars=?,grantableLevels=?,online=? WHERE guid=?", CONNECTION_ASYNC);
+
+ PrepareStatement(CHAR_UPD_ADD_AT_LOGIN_FLAG, "UPDATE characters SET at_login = at_login | ? WHERE guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_UPD_REM_AT_LOGIN_FLAG, "UPDATE characters set at_login = at_login & ~ ? WHERE guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_UPD_ALL_AT_LOGIN_FLAGS, "UPDATE characters SET at_login = at_login | ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_INS_BUG_REPORT, "INSERT INTO bugreport (type, content) VALUES(?, ?)", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_UPD_PETITION_NAME, "UPDATE petition SET name = ? WHERE petitionguid = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_INS_PETITION_SIGNATURE, "INSERT INTO petition_sign (ownerguid, petitionguid, playerguid, player_account) VALUES (?, ?, ?, ?)", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_UPD_ACCOUNT_ONLINE, "UPDATE characters SET online = 0 WHERE account = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_INS_GROUP, "INSERT INTO groups (guid, leaderGuid, lootMethod, looterGuid, lootThreshold, icon1, icon2, icon3, icon4, icon5, icon6, icon7, icon8, groupType, difficulty, raiddifficulty) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_INS_GROUP_MEMBER, "INSERT INTO group_member (guid, memberGuid, memberFlags, subgroup, roles) VALUES(?, ?, ?, ?, ?)", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_GROUP_MEMBER, "DELETE FROM group_member WHERE memberGuid = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_GROUP_INSTANCE_PERM_BINDING, "DELETE FROM group_instance WHERE guid = ? AND (permanent = 1 OR instance IN (SELECT instance FROM character_instance WHERE guid = ?))", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_UPD_GROUP_LEADER, "UPDATE groups SET leaderGuid = ? WHERE guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_UPD_GROUP_TYPE, "UPDATE groups SET groupType = ? WHERE guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_UPD_GROUP_MEMBER_SUBGROUP, "UPDATE group_member SET subgroup = ? WHERE memberGuid = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_UPD_GROUP_MEMBER_FLAG, "UPDATE group_member SET memberFlags = ? WHERE memberGuid = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_UPD_GROUP_DIFFICULTY, "UPDATE groups SET difficulty = ? WHERE guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_UPD_GROUP_RAID_DIFFICULTY, "UPDATE groups SET raiddifficulty = ? WHERE guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_ALL_GM_TICKETS, "TRUNCATE TABLE gm_tickets", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_INVALID_SPELL, "DELETE FROM character_talent WHERE spell = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_UPD_DELETE_INFO, "UPDATE characters SET deleteInfos_Name = name, deleteInfos_Account = account, deleteDate = UNIX_TIMESTAMP(), name = '', account = 0 WHERE guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_UDP_RESTORE_DELETE_INFO, "UPDATE characters SET name = ?, account = ?, deleteDate = NULL, deleteInfos_Name = NULL, deleteInfos_Account = NULL WHERE deleteDate IS NOT NULL AND guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_UPD_ZONE, "UPDATE characters SET zone = ? WHERE guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_UPD_LEVEL, "UPDATE characters SET level = ?, xp = 0 WHERE guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_INVALID_ACHIEV_PROGRESS_CRITERIA, "DELETE FROM character_achievement_progress WHERE criteria = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_INVALID_ACHIEVMENT, "DELETE FROM character_achievement WHERE achievement = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_INS_ADDON, "INSERT INTO addons (name, crc) VALUES (?, ?)", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_INVALID_PET_SPELL, "DELETE FROM pet_spell WHERE spell = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_GROUP_INSTANCE_BY_INSTANCE, "DELETE FROM group_instance WHERE instance = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_GROUP_INSTANCE_BY_GUID, "DELETE FROM group_instance WHERE guid = ? AND instance = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_REP_GROUP_INSTANCE, "REPLACE INTO group_instance (guid, instance, permanent) VALUES (?, ?, ?)", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_UPD_INSTANCE_RESETTIME, "UPDATE instance SET resettime = ? WHERE id = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_UPD_GLOBAL_INSTANCE_RESETTIME, "UPDATE instance_reset SET resettime = ? WHERE mapid = ? AND difficulty = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_UPD_CHAR_ONLINE, "UPDATE characters SET online = 1 WHERE guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_UPD_CHAR_NAME_AT_LOGIN, "UPDATE characters set name = ?, at_login = at_login & ~ ? WHERE guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_UPD_WORLDSTATE, "UPDATE worldstates SET value = ? WHERE entry = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_INS_WORLDSTATE, "INSERT INTO worldstates (entry, value) VALUES (?, ?)", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_CHAR_INSTANCE_BY_INSTANCE_GUID, "DELETE FROM character_instance WHERE guid = ? AND instance = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_UPD_CHAR_INSTANCE, "UPDATE character_instance SET instance = ?, permanent = ? WHERE guid = ? AND instance = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_INS_CHAR_INSTANCE, "INSERT INTO character_instance (guid, instance, permanent) VALUES (?, ?, ?)", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_UPD_GENDER_PLAYERBYTES, "UPDATE characters SET gender = ?, playerBytes = ?, playerBytes2 = ? WHERE guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_CHARACTER_SKILL, "DELETE FROM character_skills WHERE guid = ? AND skill = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_UPD_ADD_CHARACTER_SOCIAL_FLAGS, "UPDATE character_social SET flags = flags | ? WHERE guid = ? AND friend = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_UPD_REM_CHARACTER_SOCIAL_FLAGS, "UPDATE character_social SET flags = flags & ~ ? WHERE guid = ? AND friend = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_INS_CHARACTER_SOCIAL, "INSERT INTO character_social (guid, friend, flags) VALUES (?, ?, ?)", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_CHARACTER_SOCIAL, "DELETE FROM character_social WHERE guid = ? AND friend = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_UPD_CHARACTER_SOCIAL_NOTE, "UPDATE character_social SET note = ? WHERE guid = ? AND friend = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_UPD_CHARACTER_POSITION, "UPDATE characters SET position_x = ?, position_y = ?, position_z = ?, orientation = ?, map = ?, zone = ?, trans_x = 0, trans_y = 0, trans_z = 0, transguid = 0, taxi_path = '' WHERE guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_SEL_CHARACTER_AURA_FROZEN, "SELECT characters.name FROM characters LEFT JOIN character_aura ON (characters.guid = character_aura.guid) WHERE character_aura.spell = 9454", CONNECTION_SYNCH);
+ PrepareStatement(CHAR_SEL_CHARACTER_ONLINE, "SELECT name, account, map, zone FROM characters WHERE online > 0", CONNECTION_SYNCH);
+ PrepareStatement(CHAR_SEL_CHAR_DEL_INFO_BY_GUID, "SELECT guid, deleteInfos_Name, deleteInfos_Account, deleteDate FROM characters WHERE deleteDate IS NOT NULL AND guid = ?", CONNECTION_SYNCH);
+ PrepareStatement(CHAR_SEL_CHAR_DEL_INFO_BY_NAME, "SELECT guid, deleteInfos_Name, deleteInfos_Account, deleteDate FROM characters WHERE deleteDate IS NOT NULL AND deleteInfos_Name LIKE CONCAT('%%', ?, '%%')", CONNECTION_SYNCH);
+ PrepareStatement(CHAR_SEL_CHAR_DEL_INFO, "SELECT guid, deleteInfos_Name, deleteInfos_Account, deleteDate FROM characters WHERE deleteDate IS NOT NULL", CONNECTION_SYNCH);
+ PrepareStatement(CHAR_SEL_CHARS_BY_ACCOUNT_ID, "SELECT guid FROM characters WHERE account = ?", CONNECTION_SYNCH);
+ PrepareStatement(CHAR_SEL_CHAR_PINFO, "SELECT totaltime, level, money, account, race, class, map, zone FROM characters WHERE guid = ?", CONNECTION_SYNCH);
+ PrepareStatement(CHAR_SEL_PINFO_BANS, "SELECT unbandate, bandate = unbandate, bannedby, banreason FROM character_banned WHERE guid = ? AND active ORDER BY bandate ASC LIMIT 1", CONNECTION_SYNCH);
+ PrepareStatement(CHAR_SEL_CHAR_HOMEBIND, "SELECT mapId, zoneId, posX, posY, posZ FROM character_homebind WHERE guid = ?", CONNECTION_SYNCH);
+ PrepareStatement(CHAR_SEL_CHAR_GUID_NAME_BY_ACC, "SELECT guid, name FROM characters WHERE account = ?", CONNECTION_SYNCH);
+ PrepareStatement(CHAR_SEL_POOL_QUEST_SAVE, "SELECT quest_id FROM pool_quest_save WHERE pool_id = ?", CONNECTION_SYNCH);
+ PrepareStatement(CHAR_SEL_CHARACTER_AT_LOGIN, "SELECT at_login FROM characters WHERE guid = ?", CONNECTION_SYNCH);
+ PrepareStatement(CHAR_SEL_CHAR_CLASS_LVL_AT_LOGIN, "SELECT class, level, at_login, knownTitles FROM characters WHERE guid = ?", CONNECTION_SYNCH);
+ PrepareStatement(CHAR_SEL_CHAR_AT_LOGIN_TITLES, "SELECT at_login, knownTitles FROM characters WHERE guid = ?", CONNECTION_SYNCH);
+ PrepareStatement(CHAR_SEL_INSTANCE, "SELECT data, completedEncounters FROM instance WHERE map = ? AND id = ?", CONNECTION_SYNCH);
+ PrepareStatement(CHAR_SEL_CHAR_COD_ITEM_MAIL, "SELECT id, messageType, mailTemplateId, sender, subject, body, money, has_items FROM mail WHERE receiver = ? AND has_items <> 0 AND cod <> 0", CONNECTION_SYNCH);
+ PrepareStatement(CHAR_SEL_CHAR_SOCIAL, "SELECT DISTINCT guid FROM character_social WHERE friend = ?", CONNECTION_SYNCH);
+ PrepareStatement(CHAR_SEL_CHAR_OLD_CHARS, "SELECT guid, deleteInfos_Account FROM characters WHERE deleteDate IS NOT NULL AND deleteDate < ?", CONNECTION_SYNCH);
+ PrepareStatement(CHAR_SEL_ARENA_TEAM_ID_BY_PLAYER_GUID, "SELECT arena_team_member.arenateamid FROM arena_team_member JOIN arena_team ON arena_team_member.arenateamid = arena_team.arenateamid WHERE guid = ? AND type = ? LIMIT 1", CONNECTION_SYNCH);
+ PrepareStatement(CHAR_SEL_MAIL, "SELECT id, messageType, sender, receiver, subject, body, has_items, expire_time, deliver_time, money, cod, checked, stationery, mailTemplateId FROM mail WHERE receiver = ? ORDER BY id DESC", CONNECTION_SYNCH);
+ PrepareStatement(CHAR_SEL_CHAR_PLAYERBYTES2, "SELECT playerBytes2 FROM characters WHERE guid = ?", CONNECTION_SYNCH);
+ PrepareStatement(CHAR_SEL_CHAR_GUID_BY_NAME, "SELECT guid FROM characters WHERE name = ?", CONNECTION_SYNCH);
+ PrepareStatement(CHAR_DEL_CHAR_AURA_FROZEN, "DELETE FROM character_aura WHERE spell = 9454 AND guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_SEL_CHAR_INVENTORY_COUNT_ITEM, "SELECT COUNT(itemEntry) FROM character_inventory ci INNER JOIN item_instance ii ON ii.guid = ci.item WHERE itemEntry = ?", CONNECTION_SYNCH);
+ PrepareStatement(CHAR_SEL_MAIL_COUNT_ITEM, "SELECT COUNT(itemEntry) FROM mail_items mi INNER JOIN item_instance ii ON ii.guid = mi.item_guid WHERE itemEntry = ?", CONNECTION_SYNCH);
+ PrepareStatement(CHAR_SEL_AUCTIONHOUSE_COUNT_ITEM,"SELECT COUNT(itemEntry) FROM auctionhouse ah INNER JOIN item_instance ii ON ii.guid = ah.itemguid WHERE itemEntry = ?", CONNECTION_SYNCH);
+ PrepareStatement(CHAR_SEL_GUILD_BANK_COUNT_ITEM, "SELECT COUNT(itemEntry) FROM guild_bank_item gbi INNER JOIN item_instance ii ON ii.guid = gbi.item_guid WHERE itemEntry = ?", CONNECTION_SYNCH);
+ PrepareStatement(CHAR_SEL_CHAR_INVENTORY_ITEM_BY_ENTRY, "SELECT ci.item, cb.slot AS bag, ci.slot, ci.guid, c.account, c.name FROM characters c "
+ "INNER JOIN character_inventory ci ON ci.guid = c.guid "
+ "INNER JOIN item_instance ii ON ii.guid = ci.item "
+ "LEFT JOIN character_inventory cb ON cb.item = ci.bag WHERE ii.itemEntry = ? LIMIT ?", CONNECTION_SYNCH);
+ PrepareStatement(CHAR_SEL_MAIL_ITEMS_BY_ENTRY, "SELECT mi.item_guid, m.sender, m.receiver, cs.account, cs.name, cr.account, cr.name "
+ "FROM mail m INNER JOIN mail_items mi ON mi.mail_id = m.id INNER JOIN item_instance ii ON ii.guid = mi.item_guid "
+ "INNER JOIN characters cs ON cs.guid = m.sender INNER JOIN characters cr ON cr.guid = m.receiver WHERE ii.itemEntry = ? LIMIT ?", CONNECTION_SYNCH);
+ PrepareStatement(CHAR_SEL_AUCTIONHOUSE_ITEM_BY_ENTRY, "SELECT ah.itemguid, ah.itemowner, c.account, c.name FROM auctionhouse ah INNER JOIN characters c ON c.guid = ah.itemowner INNER JOIN item_instance ii ON ii.guid = ah.itemguid WHERE ii.itemEntry = ? LIMIT ?", CONNECTION_SYNCH);
+ PrepareStatement(CHAR_SEL_GUILD_BANK_ITEM_BY_ENTRY, "SELECT gi.item_guid, gi.guildid, g.name FROM guild_bank_item gi INNER JOIN guild g ON g.guildid = gi.guildid INNER JOIN item_instance ii ON ii.guid = gi.item_guid WHERE ii.itemEntry = ? LIMIT ?", CONNECTION_SYNCH);
+ PrepareStatement(CHAR_DEL_CHAR_ACHIEVEMENT, "DELETE FROM character_achievement WHERE guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_CHAR_ACHIEVEMENT_PROGRESS, "DELETE FROM character_achievement_progress WHERE guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_CHAR_REPUTATION_BY_FACTION, "DELETE FROM character_reputation WHERE guid = ? AND faction = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_INS_CHAR_REPUTATION_BY_FACTION, "INSERT INTO character_reputation (guid, faction, standing, flags) VALUES (?, ?, ? , ?)", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_UPD_CHAR_ARENA_POINTS, "UPDATE characters SET arenaPoints = (arenaPoints + ?) WHERE guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_ITEM_REFUND_INSTANCE, "DELETE FROM item_refund_instance WHERE item_guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_INS_ITEM_REFUND_INSTANCE, "INSERT INTO item_refund_instance (item_guid, player_guid, paidMoney, paidExtendedCost) VALUES (?, ?, ?, ?)", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_GROUP, "DELETE FROM groups WHERE guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_GROUP_MEMBER_ALL, "DELETE FROM group_member WHERE guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_INS_CHAR_GIFT, "INSERT INTO character_gifts (guid, item_guid, entry, flags) VALUES (?, ?, ?, ?)", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_INSTANCE_BY_INSTANCE, "DELETE FROM instance WHERE id = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_CHAR_INSTANCE_BY_INSTANCE, "DELETE FROM character_instance WHERE instance = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_CHAR_INSTANCE_BY_MAP_DIFF, "DELETE FROM character_instance USING character_instance LEFT JOIN instance ON character_instance.instance = id WHERE map = ? and difficulty = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_GROUP_INSTANCE_BY_MAP_DIFF, "DELETE FROM group_instance USING group_instance LEFT JOIN instance ON group_instance.instance = id WHERE map = ? and difficulty = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_INSTANCE_BY_MAP_DIFF, "DELETE FROM instance WHERE map = ? and difficulty = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_MAIL_ITEM_BY_ID, "DELETE FROM mail_items WHERE mail_id = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_INS_PETITION, "INSERT INTO petition (ownerguid, petitionguid, name, type) VALUES (?, ?, ?, ?)", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_PETITION_BY_GUID, "DELETE FROM petition WHERE petitionguid = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_PETITION_SIGNATURE_BY_GUID, "DELETE FROM petition_sign WHERE petitionguid = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_CHAR_DECLINED_NAME, "DELETE FROM character_declinedname WHERE guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_INS_CHAR_DECLINED_NAME, "INSERT INTO character_declinedname (guid, genitive, dative, accusative, instrumental, prepositional) VALUES (?, ?, ?, ?, ?, ?)", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_UPD_FACTION_OR_RACE, "UPDATE characters SET name = ?, race = ?, at_login = at_login & ~ ? WHERE guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_CHAR_SKILL_LANGUAGES, "DELETE FROM character_skills WHERE skill IN (98, 113, 759, 111, 313, 109, 115, 315, 673, 137) AND guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_INS_CHAR_SKILL_LANGUAGE, "INSERT INTO `character_skills` (guid, skill, value, max) VALUES (?, ?, 300, 300)", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_UPD_CHAR_TAXI_PATH, "UPDATE characters SET taxi_path = '' WHERE guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_UPD_CHAR_TAXIMASK, "UPDATE characters SET taximask = ? WHERE guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_CHAR_QUESTSTATUS, "DELETE FROM character_queststatus WHERE guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_CHAR_SOCIAL_BY_GUID, "DELETE FROM character_social WHERE guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_CHAR_SOCIAL_BY_FRIEND, "DELETE FROM character_social WHERE friend = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_CHAR_ACHIEVEMENT_BY_ACHIEVEMENT, "DELETE FROM character_achievement WHERE achievement = ? AND guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_UPD_CHAR_ACHIEVEMENT, "UPDATE character_achievement SET achievement = ? where achievement = ? AND guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_UPD_CHAR_INVENTORY_FACTION_CHANGE, "UPDATE item_instance ii, character_inventory ci SET ii.itemEntry = ? WHERE ii.itemEntry = ? AND ci.guid = ? AND ci.item = ii.guid", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_CHAR_SPELL_BY_SPELL, "DELETE FROM character_spell WHERE spell = ? AND guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_UPD_CHAR_SPELL_FACTION_CHANGE, "UPDATE character_spell SET spell = ? where spell = ? AND guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_SEL_CHAR_REP_BY_FACTION, "SELECT standing FROM character_reputation WHERE faction = ? AND guid = ?", CONNECTION_SYNCH);
+ PrepareStatement(CHAR_DEL_CHAR_REP_BY_FACTION, "DELETE FROM character_reputation WHERE faction = ? AND guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_UPD_CHAR_REP_FACTION_CHANGE, "UPDATE character_reputation SET faction = ?, standing = ? WHERE faction = ? AND guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_UPD_CHAR_TITLES_FACTION_CHANGE, "UPDATE characters SET knownTitles = ? WHERE guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_RES_CHAR_TITLES_FACTION_CHANGE, "UPDATE characters SET chosenTitle = 0 WHERE guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_CHAR_SPELL_COOLDOWN, "DELETE FROM character_spell_cooldown WHERE guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_CHARACTER, "DELETE FROM characters WHERE guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_CHAR_ACTION, "DELETE FROM character_action WHERE guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_CHAR_AURA, "DELETE FROM character_aura WHERE guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_CHAR_GIFT, "DELETE FROM character_gifts WHERE guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_CHAR_INSTANCE, "DELETE FROM character_instance WHERE guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_CHAR_INVENTORY, "DELETE FROM character_inventory WHERE guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_CHAR_QUESTSTATUS_REWARDED, "DELETE FROM character_queststatus_rewarded WHERE guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_CHAR_REPUTATION, "DELETE FROM character_reputation WHERE guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_CHAR_SPELL, "DELETE FROM character_spell WHERE guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_MAIL, "DELETE FROM mail WHERE receiver = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_MAIL_ITEMS, "DELETE FROM mail_items WHERE receiver = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_CHAR_ACHIEVEMENTS, "DELETE FROM character_achievement WHERE guid = ? AND achievement NOT BETWEEN '456' AND '467' AND achievement NOT BETWEEN '1400' AND '1427' AND achievement NOT IN(1463, 3117, 3259)", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_CHAR_EQUIPMENTSETS, "DELETE FROM character_equipmentsets WHERE guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_GUILD_EVENTLOG_BY_PLAYER, "DELETE FROM guild_eventlog WHERE PlayerGuid1 = ? OR PlayerGuid2 = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_GUILD_BANK_EVENTLOG_BY_PLAYER, "DELETE FROM guild_bank_eventlog WHERE PlayerGuid = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_CHAR_GLYPHS, "DELETE FROM character_glyphs WHERE guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_CHAR_QUESTSTATUS_DAILY, "DELETE FROM character_queststatus_daily WHERE guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_CHAR_TALENT, "DELETE FROM character_talent WHERE guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_CHAR_SKILLS, "DELETE FROM character_skills WHERE guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_UDP_CHAR_HONOR_POINTS, "UPDATE characters SET totalHonorPoints = ? WHERE guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_UDP_CHAR_ARENA_POINTS, "UPDATE characters SET arenaPoints = ? WHERE guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_UDP_CHAR_MONEY, "UPDATE characters SET money = ? WHERE guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_INS_CHAR_ACTION, "INSERT INTO character_action (guid, spec, button, action, type) VALUES (?, ?, ?, ?, ?)", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_UPD_CHAR_ACTION, "UPDATE character_action SET action = ?, type = ? WHERE guid = ? AND button = ? AND spec = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_CHAR_ACTION_BY_BUTTON_SPEC, "DELETE FROM character_action WHERE guid = ? and button = ? and spec = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_CHAR_INVENTORY_BY_ITEM, "DELETE FROM character_inventory WHERE item = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_CHAR_INVENTORY_BY_BAG_SLOT, "DELETE FROM character_inventory WHERE bag = ? AND slot = ? AND guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_UPD_MAIL, "UPDATE mail SET has_items = ?, expire_time = ?, deliver_time = ?, money = ?, cod = ?, checked = ? WHERE id = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_REP_CHAR_QUESTSTATUS, "REPLACE INTO character_queststatus (guid, quest, status, explored, timer, mobcount1, mobcount2, mobcount3, mobcount4, itemcount1, itemcount2, itemcount3, itemcount4, playercount) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_CHAR_QUESTSTATUS_BY_QUEST, "DELETE FROM character_queststatus WHERE guid = ? AND quest = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_INS_CHAR_QUESTSTATUS, "INSERT IGNORE INTO character_queststatus_rewarded (guid, quest) VALUES (?, ?)", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_CHAR_QUESTSTATUS_REWARDED_BY_QUEST, "DELETE FROM character_queststatus_rewarded WHERE guid = ? AND quest = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_CHAR_SKILL_BY_SKILL, "DELETE FROM character_skills WHERE guid = ? AND skill = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_INS_CHAR_SKILLS, "INSERT INTO character_skills (guid, skill, value, max) VALUES (?, ?, ?, ?)", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_UDP_CHAR_SKILLS, "UPDATE character_skills SET value = ?, max = ? WHERE guid = ? AND skill = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_INS_CHAR_SPELL, "INSERT INTO character_spell (guid, spell, active, disabled) VALUES (?, ?, ?, ?)", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_CHAR_STATS, "DELETE FROM character_stats WHERE guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_INS_CHAR_STATS, "INSERT INTO character_stats (guid, maxhealth, maxpower1, maxpower2, maxpower3, maxpower4, maxpower5, maxpower6, maxpower7, strength, agility, stamina, intellect, spirit, "
+ "armor, resHoly, resFire, resNature, resFrost, resShadow, resArcane, blockPct, dodgePct, parryPct, critPct, rangedCritPct, spellCritPct, attackPower, rangedAttackPower, "
+ "spellPower, resilience) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_PETITION_BY_OWNER, "DELETE FROM petition WHERE ownerguid = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_PETITION_SIGNATURE_BY_OWNER, "DELETE FROM petition_sign WHERE ownerguid = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_PETITION_BY_OWNER_AND_TYPE, "DELETE FROM petition WHERE ownerguid = ? AND type = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_PETITION_SIGNATURE_BY_OWNER_AND_TYPE, "DELETE FROM petition_sign WHERE ownerguid = ? AND type = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_INS_CHAR_GLYPHS, "INSERT INTO character_glyphs VALUES(?, ?, ?, ?, ?, ?, ?, ?)", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_CHAR_TALENT_BY_SPELL_SPEC, "DELETE FROM character_talent WHERE guid = ? and spell = ? and spec = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_INS_CHAR_TALENT, "INSERT INTO character_talent (guid, spell, spec) VALUES (?, ?, ?)", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_CHAR_ACTION_EXCEPT_SPEC, "DELETE FROM character_action WHERE spec<>? AND guid = ?", CONNECTION_ASYNC);
// Items that hold loot or money
- PREPARE_STATEMENT(CHAR_SEL_ITEMCONTAINER_ITEMS, "SELECT item_id, item_count, follow_rules, ffa, blocked, counted, under_threshold, needs_quest, rnd_prop, rnd_suffix FROM item_loot_items WHERE container_id = ?", CONNECTION_SYNCH);
- PREPARE_STATEMENT(CHAR_DEL_ITEMCONTAINER_ITEMS, "DELETE FROM item_loot_items WHERE container_id = ?", CONNECTION_ASYNC);
- PREPARE_STATEMENT(CHAR_DEL_ITEMCONTAINER_ITEM, "DELETE FROM item_loot_items WHERE container_id = ? AND item_id = ?", CONNECTION_ASYNC);
- PREPARE_STATEMENT(CHAR_INS_ITEMCONTAINER_ITEMS, "INSERT INTO item_loot_items (container_id, item_id, item_count, follow_rules, ffa, blocked, counted, under_threshold, needs_quest, rnd_prop, rnd_suffix) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", CONNECTION_ASYNC);
- PREPARE_STATEMENT(CHAR_SEL_ITEMCONTAINER_MONEY, "SELECT money FROM item_loot_money WHERE container_id = ?", CONNECTION_SYNCH);
- PREPARE_STATEMENT(CHAR_DEL_ITEMCONTAINER_MONEY, "DELETE FROM item_loot_money WHERE container_id = ?", CONNECTION_ASYNC);
- PREPARE_STATEMENT(CHAR_INS_ITEMCONTAINER_MONEY, "INSERT INTO item_loot_money (container_id, money) VALUES (?, ?)", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_SEL_ITEMCONTAINER_ITEMS, "SELECT item_id, item_count, follow_rules, ffa, blocked, counted, under_threshold, needs_quest, rnd_prop, rnd_suffix FROM item_loot_items WHERE container_id = ?", CONNECTION_SYNCH);
+ PrepareStatement(CHAR_DEL_ITEMCONTAINER_ITEMS, "DELETE FROM item_loot_items WHERE container_id = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_ITEMCONTAINER_ITEM, "DELETE FROM item_loot_items WHERE container_id = ? AND item_id = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_INS_ITEMCONTAINER_ITEMS, "INSERT INTO item_loot_items (container_id, item_id, item_count, follow_rules, ffa, blocked, counted, under_threshold, needs_quest, rnd_prop, rnd_suffix) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_SEL_ITEMCONTAINER_MONEY, "SELECT money FROM item_loot_money WHERE container_id = ?", CONNECTION_SYNCH);
+ PrepareStatement(CHAR_DEL_ITEMCONTAINER_MONEY, "DELETE FROM item_loot_money WHERE container_id = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_INS_ITEMCONTAINER_MONEY, "INSERT INTO item_loot_money (container_id, money) VALUES (?, ?)", CONNECTION_ASYNC);
// Calendar
- PREPARE_STATEMENT(CHAR_REP_CALENDAR_EVENT, "REPLACE INTO calendar_events (id, creator, title, description, type, dungeon, eventtime, flags, time2) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)", CONNECTION_ASYNC);
- PREPARE_STATEMENT(CHAR_DEL_CALENDAR_EVENT, "DELETE FROM calendar_events WHERE id = ?", CONNECTION_ASYNC);
- PREPARE_STATEMENT(CHAR_REP_CALENDAR_INVITE, "REPLACE INTO calendar_invites (id, event, invitee, sender, status, statustime, rank, text) VALUES (?, ?, ?, ?, ?, ?, ?, ?)", CONNECTION_ASYNC);
- PREPARE_STATEMENT(CHAR_DEL_CALENDAR_INVITE, "DELETE FROM calendar_invites WHERE id = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_REP_CALENDAR_EVENT, "REPLACE INTO calendar_events (id, creator, title, description, type, dungeon, eventtime, flags, time2) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_CALENDAR_EVENT, "DELETE FROM calendar_events WHERE id = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_REP_CALENDAR_INVITE, "REPLACE INTO calendar_invites (id, event, invitee, sender, status, statustime, rank, text) VALUES (?, ?, ?, ?, ?, ?, ?, ?)", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_CALENDAR_INVITE, "DELETE FROM calendar_invites WHERE id = ?", CONNECTION_ASYNC);
+
+ // Pet
+ PrepareStatement(CHAR_SEL_PET_SLOTS, "SELECT owner, slot FROM character_pet WHERE owner = ? AND slot >= ? AND slot <= ? ORDER BY slot", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_SEL_PET_SLOTS_DETAIL, "SELECT owner, id, entry, level, name FROM character_pet WHERE owner = ? AND slot >= ? AND slot <= ? ORDER BY slot", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_SEL_PET_ENTRY, "SELECT entry FROM character_pet WHERE owner = ? AND id = ? AND slot >= ? AND slot <= ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_SEL_PET_SLOT_BY_ID, "SELECT slot, entry FROM character_pet WHERE owner = ? AND id = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_SEL_PET_SPELL_LIST, "SELECT DISTINCT pet_spell.spell FROM pet_spell, character_pet WHERE character_pet.owner = ? AND character_pet.id = pet_spell.guid AND character_pet.id <> ?", CONNECTION_SYNCH);
+ PrepareStatement(CHAR_SEL_CHAR_PET, "SELECT id FROM character_pet WHERE owner = ? AND id <> ?", CONNECTION_SYNCH);
+ PrepareStatement(CHAR_SEL_CHAR_PETS, "SELECT id FROM character_pet WHERE owner = ?", CONNECTION_SYNCH);
+ PrepareStatement(CHAR_DEL_CHAR_PET_DECLINEDNAME_BY_OWNER, "DELETE FROM character_pet_declinedname WHERE owner = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_CHAR_PET_DECLINEDNAME, "DELETE FROM character_pet_declinedname WHERE id = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_ADD_CHAR_PET_DECLINEDNAME, "INSERT INTO character_pet_declinedname (id, owner, genitive, dative, accusative, instrumental, prepositional) VALUES (?, ?, ?, ?, ?, ?, ?)", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_SEL_PET_AURA, "SELECT caster_guid, spell, effect_mask, recalculate_mask, stackcount, amount0, amount1, amount2, base_amount0, base_amount1, base_amount2, maxduration, remaintime, remaincharges FROM pet_aura WHERE guid = ?", CONNECTION_SYNCH);
+ PrepareStatement(CHAR_SEL_PET_SPELL, "SELECT spell, active FROM pet_spell WHERE guid = ?", CONNECTION_SYNCH);
+ PrepareStatement(CHAR_SEL_PET_SPELL_COOLDOWN, "SELECT spell, time FROM pet_spell_cooldown WHERE guid = ?", CONNECTION_SYNCH);
+ PrepareStatement(CHAR_SEL_PET_DECLINED_NAME, "SELECT genitive, dative, accusative, instrumental, prepositional FROM character_pet_declinedname WHERE owner = ? AND id = ?", CONNECTION_SYNCH);
+ PrepareStatement(CHAR_DEL_PET_AURAS, "DELETE FROM pet_aura WHERE guid = ?", CONNECTION_BOTH);
+ PrepareStatement(CHAR_DEL_PET_SPELLS, "DELETE FROM pet_spell WHERE guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_PET_SPELL_COOLDOWNS, "DELETE FROM pet_spell_cooldown WHERE guid = ?", CONNECTION_BOTH);
+ PrepareStatement(CHAR_INS_PET_SPELL_COOLDOWN, "INSERT INTO pet_spell_cooldown (guid, spell, time) VALUES (?, ?, ?)", CONNECTION_BOTH);
+ PrepareStatement(CHAR_DEL_PET_SPELL_BY_SPELL, "DELETE FROM pet_spell WHERE guid = ? and spell = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_INS_PET_SPELL, "INSERT INTO pet_spell (guid, spell, active) VALUES (?, ?, ?)", CONNECTION_BOTH);
+ PrepareStatement(CHAR_INS_PET_AURA, "INSERT INTO pet_aura (guid, caster_guid, spell, effect_mask, recalculate_mask, stackcount, amount0, amount1, amount2, "
+ "base_amount0, base_amount1, base_amount2, maxduration, remaintime, remaincharges) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", CONNECTION_BOTH);
+ PrepareStatement(CHAR_SEL_CHAR_PET_BY_ENTRY, "SELECT id, entry, owner, modelid, level, exp, Reactstate, slot, name, renamed, curhealth, curmana, curhappiness, abdata, savetime, CreatedBySpell, PetType FROM character_pet WHERE owner = ? AND id = ?", CONNECTION_SYNCH);
+ PrepareStatement(CHAR_SEL_CHAR_PET_BY_ENTRY_AND_SLOT_2, "SELECT id, entry, owner, modelid, level, exp, Reactstate, slot, name, renamed, curhealth, curmana, curhappiness, abdata, savetime, CreatedBySpell, PetType FROM character_pet WHERE owner = ? AND entry = ? AND (slot = ? OR slot > ?)", CONNECTION_SYNCH);
+ PrepareStatement(CHAR_SEL_CHAR_PET_BY_SLOT, "SELECT id, entry, owner, modelid, level, exp, Reactstate, slot, name, renamed, curhealth, curmana, curhappiness, abdata, savetime, CreatedBySpell, PetType FROM character_pet WHERE owner = ? AND (slot = ? OR slot > ?) ", CONNECTION_SYNCH);
+ PrepareStatement(CHAR_SEL_CHAR_PET_BY_ENTRY_AND_SLOT, "SELECT id, entry, owner, modelid, level, exp, Reactstate, slot, name, renamed, curhealth, curmana, curhappiness, abdata, savetime, CreatedBySpell, PetType FROM character_pet WHERE owner = ? AND slot = ?", CONNECTION_SYNCH);
+ PrepareStatement(CHAR_DEL_CHAR_PET_BY_OWNER, "DELETE FROM character_pet WHERE owner = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_UPD_CHAR_PET_NAME, "UPDATE character_pet SET name = ?, renamed = 1 WHERE owner = ? AND id = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_UDP_CHAR_PET_SLOT_BY_SLOT_EXCLUDE_ID, "UPDATE character_pet SET slot = ? WHERE owner = ? AND slot = ? AND id <> ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_UDP_CHAR_PET_SLOT_BY_SLOT, "UPDATE character_pet SET slot = ? WHERE owner = ? AND slot = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_UPD_CHAR_PET_SLOT_BY_ID, "UPDATE character_pet SET slot = ? WHERE owner = ? AND id = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_CHAR_PET_BY_ID, "DELETE FROM character_pet WHERE id = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_CHAR_PET_BY_SLOT, "DELETE FROM character_pet WHERE owner = ? AND (slot = ? OR slot > ?)", CONNECTION_ASYNC);
}
diff --git a/src/server/shared/Database/Implementation/CharacterDatabase.h b/src/server/shared/Database/Implementation/CharacterDatabase.h
index 7adff490138..bfa7bc48cf5 100644
--- a/src/server/shared/Database/Implementation/CharacterDatabase.h
+++ b/src/server/shared/Database/Implementation/CharacterDatabase.h
@@ -60,10 +60,6 @@ enum CharacterDatabaseStatements
CHAR_SEL_BANNED_NAME,
CHAR_SEL_ENUM,
CHAR_SEL_ENUM_DECLINED_NAME,
- CHAR_SEL_PET_SLOTS,
- CHAR_SEL_PET_SLOTS_DETAIL,
- CHAR_SEL_PET_ENTRY,
- CHAR_SEL_PET_SLOT_BY_ID,
CHAR_SEL_FREE_NAME,
CHAR_SEL_GUID_RACE_ACC_BY_NAME,
CHAR_SEL_CHAR_RACE,
@@ -369,19 +365,12 @@ enum CharacterDatabaseStatements
CHAR_SEL_CHAR_CLASS_LVL_AT_LOGIN,
CHAR_SEL_CHAR_AT_LOGIN_TITLES,
CHAR_SEL_INSTANCE,
- CHAR_SEL_PET_SPELL_LIST,
- CHAR_SEL_CHAR_PET,
- CHAR_SEL_CHAR_PETS,
CHAR_SEL_CHAR_COD_ITEM_MAIL,
CHAR_SEL_CHAR_SOCIAL,
- CHAR_SEL_PET_AURA,
CHAR_SEL_CHAR_OLD_CHARS,
CHAR_SEL_ARENA_TEAM_ID_BY_PLAYER_GUID,
CHAR_SEL_MAIL,
CHAR_SEL_CHAR_PLAYERBYTES2,
- CHAR_SEL_PET_SPELL,
- CHAR_SEL_PET_SPELL_COOLDOWN,
- CHAR_SEL_PET_DECLINED_NAME,
CHAR_SEL_CHAR_GUID_BY_NAME,
CHAR_DEL_CHAR_AURA_FROZEN,
CHAR_SEL_CHAR_INVENTORY_COUNT_ITEM,
@@ -392,9 +381,6 @@ enum CharacterDatabaseStatements
CHAR_SEL_MAIL_ITEMS_BY_ENTRY,
CHAR_SEL_AUCTIONHOUSE_ITEM_BY_ENTRY,
CHAR_SEL_GUILD_BANK_ITEM_BY_ENTRY,
- CHAR_SEL_CHAR_PET_BY_ENTRY,
- CHAR_SEL_CHAR_PET_BY_ENTRY_AND_SLOT_2,
- CHAR_SEL_CHAR_PET_BY_SLOT,
CHAR_DEL_CHAR_ACHIEVEMENT,
CHAR_DEL_CHAR_ACHIEVEMENT_PROGRESS,
CHAR_DEL_CHAR_REPUTATION_BY_FACTION,
@@ -411,24 +397,9 @@ enum CharacterDatabaseStatements
CHAR_DEL_GROUP_INSTANCE_BY_MAP_DIFF,
CHAR_DEL_INSTANCE_BY_MAP_DIFF,
CHAR_DEL_MAIL_ITEM_BY_ID,
- CHAR_DEL_CHAR_PET_DECLINEDNAME,
- CHAR_ADD_CHAR_PET_DECLINEDNAME,
- CHAR_UPD_CHAR_PET_NAME,
CHAR_INS_PETITION,
CHAR_DEL_PETITION_BY_GUID,
CHAR_DEL_PETITION_SIGNATURE_BY_GUID,
- CHAR_UDP_CHAR_PET_SLOT_BY_SLOT_EXCLUDE_ID,
- CHAR_UDP_CHAR_PET_SLOT_BY_SLOT,
- CHAR_UPD_CHAR_PET_SLOT_BY_ID,
- CHAR_DEL_CHAR_PET_BY_ID,
- CHAR_DEL_CHAR_PET_BY_SLOT,
- CHAR_DEL_PET_AURAS,
- CHAR_DEL_PET_SPELLS,
- CHAR_DEL_PET_SPELL_COOLDOWNS,
- CHAR_INS_PET_SPELL_COOLDOWN,
- CHAR_DEL_PET_SPELL_BY_SPELL,
- CHAR_INS_PET_SPELL,
- CHAR_INS_PET_AURA,
CHAR_DEL_CHAR_DECLINED_NAME,
CHAR_INS_CHAR_DECLINED_NAME,
CHAR_UPD_FACTION_OR_RACE,
@@ -461,8 +432,6 @@ enum CharacterDatabaseStatements
CHAR_DEL_CHAR_SPELL,
CHAR_DEL_MAIL,
CHAR_DEL_MAIL_ITEMS,
- CHAR_DEL_CHAR_PET_BY_OWNER,
- CHAR_DEL_CHAR_PET_DECLINEDNAME_BY_OWNER,
CHAR_DEL_CHAR_ACHIEVEMENTS,
CHAR_DEL_CHAR_EQUIPMENTSETS,
CHAR_DEL_GUILD_EVENTLOG_BY_PLAYER,
@@ -498,13 +467,46 @@ enum CharacterDatabaseStatements
CHAR_DEL_CHAR_TALENT_BY_SPELL_SPEC,
CHAR_INS_CHAR_TALENT,
CHAR_DEL_CHAR_ACTION_EXCEPT_SPEC,
- CHAR_SEL_CHAR_PET_BY_ENTRY_AND_SLOT,
CHAR_REP_CALENDAR_EVENT,
CHAR_DEL_CALENDAR_EVENT,
CHAR_REP_CALENDAR_INVITE,
CHAR_DEL_CALENDAR_INVITE,
+ CHAR_SEL_PET_AURA,
+ CHAR_SEL_PET_SPELL,
+ CHAR_SEL_PET_SPELL_COOLDOWN,
+ CHAR_SEL_PET_DECLINED_NAME,
+ CHAR_DEL_PET_AURAS,
+ CHAR_DEL_PET_SPELL_COOLDOWNS,
+ CHAR_INS_PET_SPELL_COOLDOWN,
+ CHAR_DEL_PET_SPELL_BY_SPELL,
+ CHAR_INS_PET_SPELL,
+ CHAR_INS_PET_AURA,
+
+ CHAR_DEL_PET_SPELLS,
+ CHAR_DEL_CHAR_PET_BY_OWNER,
+ CHAR_DEL_CHAR_PET_DECLINEDNAME_BY_OWNER,
+ CHAR_SEL_CHAR_PET_BY_ENTRY_AND_SLOT,
+ CHAR_SEL_PET_SLOTS,
+ CHAR_SEL_PET_SLOTS_DETAIL,
+ CHAR_SEL_PET_ENTRY,
+ CHAR_SEL_PET_SLOT_BY_ID,
+ CHAR_SEL_PET_SPELL_LIST,
+ CHAR_SEL_CHAR_PET,
+ CHAR_SEL_CHAR_PETS,
+ CHAR_SEL_CHAR_PET_BY_ENTRY,
+ CHAR_SEL_CHAR_PET_BY_ENTRY_AND_SLOT_2,
+ CHAR_SEL_CHAR_PET_BY_SLOT,
+ CHAR_DEL_CHAR_PET_DECLINEDNAME,
+ CHAR_ADD_CHAR_PET_DECLINEDNAME,
+ CHAR_UPD_CHAR_PET_NAME,
+ CHAR_UDP_CHAR_PET_SLOT_BY_SLOT_EXCLUDE_ID,
+ CHAR_UDP_CHAR_PET_SLOT_BY_SLOT,
+ CHAR_UPD_CHAR_PET_SLOT_BY_ID,
+ CHAR_DEL_CHAR_PET_BY_ID,
+ CHAR_DEL_CHAR_PET_BY_SLOT,
+
CHAR_SEL_ITEMCONTAINER_ITEMS,
CHAR_DEL_ITEMCONTAINER_ITEMS,
CHAR_DEL_ITEMCONTAINER_ITEM,
diff --git a/src/server/shared/Database/Implementation/LoginDatabase.cpp b/src/server/shared/Database/Implementation/LoginDatabase.cpp
index 572071d8acf..70d509af6fe 100644
--- a/src/server/shared/Database/Implementation/LoginDatabase.cpp
+++ b/src/server/shared/Database/Implementation/LoginDatabase.cpp
@@ -22,69 +22,69 @@ void LoginDatabaseConnection::DoPrepareStatements()
if (!m_reconnecting)
m_stmts.resize(MAX_LOGINDATABASE_STATEMENTS);
- PREPARE_STATEMENT(LOGIN_SEL_REALMLIST, "SELECT id, name, address, port, icon, flag, timezone, allowedSecurityLevel, population, gamebuild FROM realmlist WHERE flag <> 3 ORDER BY name", CONNECTION_SYNCH)
- PREPARE_STATEMENT(LOGIN_DEL_EXPIRED_IP_BANS, "DELETE FROM ip_banned WHERE unbandate<>bandate AND unbandate<=UNIX_TIMESTAMP()", CONNECTION_ASYNC)
- PREPARE_STATEMENT(LOGIN_UPD_EXPIRED_ACCOUNT_BANS, "UPDATE account_banned SET active = 0 WHERE active = 1 AND unbandate<>bandate AND unbandate<=UNIX_TIMESTAMP()", CONNECTION_ASYNC)
- PREPARE_STATEMENT(LOGIN_SEL_IP_BANNED, "SELECT * FROM ip_banned WHERE ip = ?", CONNECTION_SYNCH)
- PREPARE_STATEMENT(LOGIN_INS_IP_AUTO_BANNED, "INSERT INTO ip_banned VALUES (?, UNIX_TIMESTAMP(), UNIX_TIMESTAMP()+?, 'Trinity realmd', 'Failed login autoban')", CONNECTION_ASYNC)
- PREPARE_STATEMENT(LOGIN_SEL_IP_BANNED_ALL, "SELECT ip, bandate, unbandate, bannedby, banreason FROM ip_banned WHERE (bandate = unbandate OR unbandate > UNIX_TIMESTAMP()) ORDER BY unbandate", CONNECTION_SYNCH);
- PREPARE_STATEMENT(LOGIN_SEL_IP_BANNED_BY_IP, "SELECT ip, bandate, unbandate, bannedby, banreason FROM ip_banned WHERE (bandate = unbandate OR unbandate > UNIX_TIMESTAMP()) AND ip LIKE CONCAT('%%', ?, '%%') ORDER BY unbandate", CONNECTION_SYNCH);
- PREPARE_STATEMENT(LOGIN_SEL_ACCOUNT_BANNED, "SELECT bandate, unbandate FROM account_banned WHERE id = ? AND active = 1", CONNECTION_SYNCH)
- PREPARE_STATEMENT(LOGIN_SEL_ACCOUNT_BANNED_ALL, "SELECT account.id, username FROM account, account_banned WHERE account.id = account_banned.id AND active = 1 GROUP BY account.id", CONNECTION_SYNCH);
- PREPARE_STATEMENT(LOGIN_SEL_ACCOUNT_BANNED_BY_USERNAME, "SELECT account.id, username FROM account, account_banned WHERE account.id = account_banned.id AND active = 1 AND username LIKE CONCAT('%%', ?, '%%') GROUP BY account.id", CONNECTION_SYNCH);
- PREPARE_STATEMENT(LOGIN_INS_ACCOUNT_AUTO_BANNED, "INSERT INTO account_banned VALUES (?, UNIX_TIMESTAMP(), UNIX_TIMESTAMP()+?, 'Trinity realmd', 'Failed login autoban', 1)", CONNECTION_ASYNC)
- PREPARE_STATEMENT(LOGIN_DEL_ACCOUNT_BANNED, "DELETE FROM account_banned WHERE id = ?", CONNECTION_ASYNC);
- PREPARE_STATEMENT(LOGIN_SEL_SESSIONKEY, "SELECT a.sessionkey, a.id, aa.gmlevel FROM account a LEFT JOIN account_access aa ON (a.id = aa.id) WHERE username = ?", CONNECTION_SYNCH)
- PREPARE_STATEMENT(LOGIN_UPD_VS, "UPDATE account SET v = ?, s = ? WHERE username = ?", CONNECTION_ASYNC)
- PREPARE_STATEMENT(LOGIN_UPD_LOGONPROOF, "UPDATE account SET sessionkey = ?, last_ip = ?, last_login = NOW(), locale = ?, failed_logins = 0, os = ? WHERE username = ?", CONNECTION_ASYNC)
- PREPARE_STATEMENT(LOGIN_SEL_LOGONCHALLENGE, "SELECT a.sha_pass_hash, a.id, a.locked, a.last_ip, aa.gmlevel, a.v, a.s FROM account a LEFT JOIN account_access aa ON (a.id = aa.id) WHERE a.username = ?", CONNECTION_SYNCH)
- PREPARE_STATEMENT(LOGIN_UPD_FAILEDLOGINS, "UPDATE account SET failed_logins = failed_logins + 1 WHERE username = ?", CONNECTION_ASYNC)
- PREPARE_STATEMENT(LOGIN_SEL_FAILEDLOGINS, "SELECT id, failed_logins FROM account WHERE username = ?", CONNECTION_SYNCH)
- PREPARE_STATEMENT(LOGIN_SEL_ACCOUNT_ID_BY_NAME, "SELECT id FROM account WHERE username = ?", CONNECTION_SYNCH)
- PREPARE_STATEMENT(LOGIN_SEL_ACCOUNT_LIST_BY_NAME, "SELECT id, username FROM account WHERE username = ?", CONNECTION_SYNCH);
- PREPARE_STATEMENT(LOGIN_SEL_ACCOUNT_INFO_BY_NAME, "SELECT id, sessionkey, last_ip, locked, v, s, expansion, mutetime, locale, recruiter, os FROM account WHERE username = ?", CONNECTION_SYNCH);
- PREPARE_STATEMENT(LOGIN_SEL_ACCOUNT_LIST_BY_EMAIL, "SELECT id, username FROM account WHERE email = ?", CONNECTION_SYNCH);
- PREPARE_STATEMENT(LOGIN_SEL_NUM_CHARS_ON_REALM, "SELECT numchars FROM realmcharacters WHERE realmid = ? AND acctid= ?", CONNECTION_SYNCH)
- PREPARE_STATEMENT(LOGIN_SEL_ACCOUNT_BY_IP, "SELECT id, username FROM account WHERE last_ip = ?", CONNECTION_SYNCH)
- PREPARE_STATEMENT(LOGIN_SEL_ACCOUNT_BY_ID, "SELECT 1 FROM account WHERE id = ?", CONNECTION_SYNCH);
- PREPARE_STATEMENT(LOGIN_INS_IP_BANNED, "INSERT INTO ip_banned VALUES (?, UNIX_TIMESTAMP(), UNIX_TIMESTAMP()+?, ?, ?)", CONNECTION_ASYNC)
- PREPARE_STATEMENT(LOGIN_DEL_IP_NOT_BANNED, "DELETE FROM ip_banned WHERE ip = ?", CONNECTION_ASYNC)
- PREPARE_STATEMENT(LOGIN_INS_ACCOUNT_BANNED, "INSERT INTO account_banned VALUES (?, UNIX_TIMESTAMP(), UNIX_TIMESTAMP()+?, ?, ?, 1)", CONNECTION_ASYNC)
- PREPARE_STATEMENT(LOGIN_UPD_ACCOUNT_NOT_BANNED, "UPDATE account_banned SET active = 0 WHERE id = ? AND active != 0", CONNECTION_ASYNC)
- PREPARE_STATEMENT(LOGIN_DEL_REALM_CHARACTERS_BY_REALM, "DELETE FROM realmcharacters WHERE acctid = ? AND realmid = ?", CONNECTION_ASYNC)
- PREPARE_STATEMENT(LOGIN_DEL_REALM_CHARACTERS, "DELETE FROM realmcharacters WHERE acctid = ?", CONNECTION_ASYNC);
- PREPARE_STATEMENT(LOGIN_INS_REALM_CHARACTERS, "INSERT INTO realmcharacters (numchars, acctid, realmid) VALUES (?, ?, ?)", CONNECTION_ASYNC)
- PREPARE_STATEMENT(LOGIN_SEL_SUM_REALM_CHARACTERS, "SELECT SUM(numchars) FROM realmcharacters WHERE acctid = ?", CONNECTION_ASYNC);
- PREPARE_STATEMENT(LOGIN_INS_ACCOUNT, "INSERT INTO account(username, sha_pass_hash, joindate) VALUES(?, ?, NOW())", CONNECTION_ASYNC);
- PREPARE_STATEMENT(LOGIN_INS_REALM_CHARACTERS_INIT, "INSERT INTO realmcharacters (realmid, acctid, numchars) SELECT realmlist.id, account.id, 0 FROM realmlist, account LEFT JOIN realmcharacters ON acctid=account.id WHERE acctid IS NULL", CONNECTION_ASYNC);
- PREPARE_STATEMENT(LOGIN_UPD_EXPANSION, "UPDATE account SET expansion = ? WHERE id = ?", CONNECTION_ASYNC);
- PREPARE_STATEMENT(LOGIN_UPD_ACCOUNT_LOCK, "UPDATE account SET locked = ? WHERE id = ?", CONNECTION_ASYNC);
- PREPARE_STATEMENT(LOGIN_INS_LOG, "INSERT INTO logs (time, realm, type, level, string) VALUES (?, ?, ?, ?, ?)", CONNECTION_ASYNC);
- PREPARE_STATEMENT(LOGIN_UPD_USERNAME, "UPDATE account SET v = 0, s = 0, username = ?, sha_pass_hash = ? WHERE id = ?", CONNECTION_ASYNC);
- PREPARE_STATEMENT(LOGIN_UPD_PASSWORD, "UPDATE account SET v = 0, s = 0, sha_pass_hash = ? WHERE id = ?", CONNECTION_ASYNC);
- PREPARE_STATEMENT(LOGIN_UPD_MUTE_TIME, "UPDATE account SET mutetime = ? WHERE id = ?", CONNECTION_ASYNC);
- PREPARE_STATEMENT(LOGIN_UPD_LAST_IP, "UPDATE account SET last_ip = ? WHERE username = ?", CONNECTION_ASYNC);
- PREPARE_STATEMENT(LOGIN_UPD_ACCOUNT_ONLINE, "UPDATE account SET online = 1 WHERE id = ?", CONNECTION_ASYNC);
- PREPARE_STATEMENT(LOGIN_UPD_UPTIME_PLAYERS, "UPDATE uptime SET uptime = ?, maxplayers = ? WHERE realmid = ? AND starttime = ?", CONNECTION_ASYNC);
- PREPARE_STATEMENT(LOGIN_DEL_OLD_LOGS, "DELETE FROM logs WHERE (time + ?) < ?", CONNECTION_ASYNC);
- PREPARE_STATEMENT(LOGIN_DEL_ACCOUNT_ACCESS, "DELETE FROM account_access WHERE id = ?", CONNECTION_ASYNC);
- PREPARE_STATEMENT(LOGIN_DEL_ACCOUNT_ACCESS_BY_REALM, "DELETE FROM account_access WHERE id = ? AND (RealmID = ? OR RealmID = -1)", CONNECTION_ASYNC);
- PREPARE_STATEMENT(LOGIN_INS_ACCOUNT_ACCESS, "INSERT INTO account_access (id,gmlevel,RealmID) VALUES (?, ?, ?)", CONNECTION_ASYNC);
- PREPARE_STATEMENT(LOGIN_GET_ACCOUNT_ID_BY_USERNAME, "SELECT id FROM account WHERE username = ?", CONNECTION_SYNCH);
- PREPARE_STATEMENT(LOGIN_GET_ACCOUNT_ACCESS_GMLEVEL, "SELECT gmlevel FROM account_access WHERE id = ?", CONNECTION_SYNCH);
- PREPARE_STATEMENT(LOGIN_GET_GMLEVEL_BY_REALMID, "SELECT gmlevel FROM account_access WHERE id = ? AND (RealmID = ? OR RealmID = -1)", CONNECTION_SYNCH);
- PREPARE_STATEMENT(LOGIN_GET_USERNAME_BY_ID, "SELECT username FROM account WHERE id = ?", CONNECTION_SYNCH);
- PREPARE_STATEMENT(LOGIN_SEL_CHECK_PASSWORD, "SELECT 1 FROM account WHERE id = ? AND sha_pass_hash = ?", CONNECTION_SYNCH);
- PREPARE_STATEMENT(LOGIN_SEL_CHECK_PASSWORD_BY_NAME, "SELECT 1 FROM account WHERE username = ? AND sha_pass_hash = ?", CONNECTION_SYNCH);
- PREPARE_STATEMENT(LOGIN_SEL_PINFO, "SELECT a.username, aa.gmlevel, a.email, a.last_ip, DATE_FORMAT(a.last_login, '%Y-%m-%d %T'), a.mutetime FROM account a LEFT JOIN account_access aa ON (a.id = aa.id AND (aa.RealmID = ? OR aa.RealmID = -1)) WHERE a.id = ?", CONNECTION_SYNCH);
- PREPARE_STATEMENT(LOGIN_SEL_PINFO_BANS, "SELECT unbandate, bandate = unbandate, bannedby, banreason FROM account_banned WHERE id = ? AND active ORDER BY bandate ASC LIMIT 1", CONNECTION_SYNCH);
- PREPARE_STATEMENT(LOGIN_SEL_GM_ACCOUNTS, "SELECT a.username, aa.gmlevel FROM account a, account_access aa WHERE a.id=aa.id AND aa.gmlevel >= ? AND (aa.realmid = -1 OR aa.realmid = ?)", CONNECTION_SYNCH);
- PREPARE_STATEMENT(LOGIN_SEL_ACCOUNT_INFO, "SELECT a.username, a.last_ip, aa.gmlevel, a.expansion FROM account a LEFT JOIN account_access aa ON (a.id = aa.id) WHERE a.id = ?", CONNECTION_SYNCH);
- PREPARE_STATEMENT(LOGIN_SEL_ACCOUNT_ACCESS_GMLEVEL_TEST, "SELECT 1 FROM account_access WHERE id = ? AND gmlevel > ?", CONNECTION_SYNCH);
- PREPARE_STATEMENT(LOGIN_SEL_ACCOUNT_ACCESS, "SELECT a.id, aa.gmlevel, aa.RealmID FROM account a LEFT JOIN account_access aa ON (a.id = aa.id) WHERE a.username = ?", CONNECTION_SYNCH);
- PREPARE_STATEMENT(LOGIN_SEL_ACCOUNT_RECRUITER, "SELECT 1 FROM account WHERE recruiter = ?", CONNECTION_SYNCH);
- PREPARE_STATEMENT(LOGIN_SEL_BANS, "SELECT 1 FROM account_banned WHERE id = ? AND active = 1 UNION SELECT 1 FROM ip_banned WHERE ip = ?", CONNECTION_SYNCH);
- PREPARE_STATEMENT(LOGIN_SEL_ACCOUNT_WHOIS, "SELECT username, email, last_ip FROM account WHERE id = ?", CONNECTION_SYNCH);
- PREPARE_STATEMENT(LOGIN_SEL_REALMLIST_SECURITY_LEVEL, "SELECT allowedSecurityLevel from realmlist WHERE id = ?", CONNECTION_SYNCH);
- PREPARE_STATEMENT(LOGIN_DEL_ACCOUNT, "DELETE FROM account WHERE id = ?", CONNECTION_ASYNC);
+ PrepareStatement(LOGIN_SEL_REALMLIST, "SELECT id, name, address, port, icon, flag, timezone, allowedSecurityLevel, population, gamebuild FROM realmlist WHERE flag <> 3 ORDER BY name", CONNECTION_SYNCH);
+ PrepareStatement(LOGIN_DEL_EXPIRED_IP_BANS, "DELETE FROM ip_banned WHERE unbandate<>bandate AND unbandate<=UNIX_TIMESTAMP()", CONNECTION_ASYNC);
+ PrepareStatement(LOGIN_UPD_EXPIRED_ACCOUNT_BANS, "UPDATE account_banned SET active = 0 WHERE active = 1 AND unbandate<>bandate AND unbandate<=UNIX_TIMESTAMP()", CONNECTION_ASYNC);
+ PrepareStatement(LOGIN_SEL_IP_BANNED, "SELECT * FROM ip_banned WHERE ip = ?", CONNECTION_SYNCH);
+ PrepareStatement(LOGIN_INS_IP_AUTO_BANNED, "INSERT INTO ip_banned VALUES (?, UNIX_TIMESTAMP(), UNIX_TIMESTAMP()+?, 'Trinity realmd', 'Failed login autoban')", CONNECTION_ASYNC);
+ PrepareStatement(LOGIN_SEL_IP_BANNED_ALL, "SELECT ip, bandate, unbandate, bannedby, banreason FROM ip_banned WHERE (bandate = unbandate OR unbandate > UNIX_TIMESTAMP()) ORDER BY unbandate", CONNECTION_SYNCH);
+ PrepareStatement(LOGIN_SEL_IP_BANNED_BY_IP, "SELECT ip, bandate, unbandate, bannedby, banreason FROM ip_banned WHERE (bandate = unbandate OR unbandate > UNIX_TIMESTAMP()) AND ip LIKE CONCAT('%%', ?, '%%') ORDER BY unbandate", CONNECTION_SYNCH);
+ PrepareStatement(LOGIN_SEL_ACCOUNT_BANNED, "SELECT bandate, unbandate FROM account_banned WHERE id = ? AND active = 1", CONNECTION_SYNCH);
+ PrepareStatement(LOGIN_SEL_ACCOUNT_BANNED_ALL, "SELECT account.id, username FROM account, account_banned WHERE account.id = account_banned.id AND active = 1 GROUP BY account.id", CONNECTION_SYNCH);
+ PrepareStatement(LOGIN_SEL_ACCOUNT_BANNED_BY_USERNAME, "SELECT account.id, username FROM account, account_banned WHERE account.id = account_banned.id AND active = 1 AND username LIKE CONCAT('%%', ?, '%%') GROUP BY account.id", CONNECTION_SYNCH);
+ PrepareStatement(LOGIN_INS_ACCOUNT_AUTO_BANNED, "INSERT INTO account_banned VALUES (?, UNIX_TIMESTAMP(), UNIX_TIMESTAMP()+?, 'Trinity realmd', 'Failed login autoban', 1)", CONNECTION_ASYNC);
+ PrepareStatement(LOGIN_DEL_ACCOUNT_BANNED, "DELETE FROM account_banned WHERE id = ?", CONNECTION_ASYNC);
+ PrepareStatement(LOGIN_SEL_SESSIONKEY, "SELECT a.sessionkey, a.id, aa.gmlevel FROM account a LEFT JOIN account_access aa ON (a.id = aa.id) WHERE username = ?", CONNECTION_SYNCH);
+ PrepareStatement(LOGIN_UPD_VS, "UPDATE account SET v = ?, s = ? WHERE username = ?", CONNECTION_ASYNC);
+ PrepareStatement(LOGIN_UPD_LOGONPROOF, "UPDATE account SET sessionkey = ?, last_ip = ?, last_login = NOW(), locale = ?, failed_logins = 0, os = ? WHERE username = ?", CONNECTION_ASYNC);
+ PrepareStatement(LOGIN_SEL_LOGONCHALLENGE, "SELECT a.sha_pass_hash, a.id, a.locked, a.last_ip, aa.gmlevel, a.v, a.s FROM account a LEFT JOIN account_access aa ON (a.id = aa.id) WHERE a.username = ?", CONNECTION_SYNCH);
+ PrepareStatement(LOGIN_UPD_FAILEDLOGINS, "UPDATE account SET failed_logins = failed_logins + 1 WHERE username = ?", CONNECTION_ASYNC);
+ PrepareStatement(LOGIN_SEL_FAILEDLOGINS, "SELECT id, failed_logins FROM account WHERE username = ?", CONNECTION_SYNCH);
+ PrepareStatement(LOGIN_SEL_ACCOUNT_ID_BY_NAME, "SELECT id FROM account WHERE username = ?", CONNECTION_SYNCH);
+ PrepareStatement(LOGIN_SEL_ACCOUNT_LIST_BY_NAME, "SELECT id, username FROM account WHERE username = ?", CONNECTION_SYNCH);
+ PrepareStatement(LOGIN_SEL_ACCOUNT_INFO_BY_NAME, "SELECT id, sessionkey, last_ip, locked, v, s, expansion, mutetime, locale, recruiter, os FROM account WHERE username = ?", CONNECTION_SYNCH);
+ PrepareStatement(LOGIN_SEL_ACCOUNT_LIST_BY_EMAIL, "SELECT id, username FROM account WHERE email = ?", CONNECTION_SYNCH);
+ PrepareStatement(LOGIN_SEL_NUM_CHARS_ON_REALM, "SELECT numchars FROM realmcharacters WHERE realmid = ? AND acctid= ?", CONNECTION_SYNCH);
+ PrepareStatement(LOGIN_SEL_ACCOUNT_BY_IP, "SELECT id, username FROM account WHERE last_ip = ?", CONNECTION_SYNCH);
+ PrepareStatement(LOGIN_SEL_ACCOUNT_BY_ID, "SELECT 1 FROM account WHERE id = ?", CONNECTION_SYNCH);
+ PrepareStatement(LOGIN_INS_IP_BANNED, "INSERT INTO ip_banned VALUES (?, UNIX_TIMESTAMP(), UNIX_TIMESTAMP()+?, ?, ?)", CONNECTION_ASYNC);
+ PrepareStatement(LOGIN_DEL_IP_NOT_BANNED, "DELETE FROM ip_banned WHERE ip = ?", CONNECTION_ASYNC);
+ PrepareStatement(LOGIN_INS_ACCOUNT_BANNED, "INSERT INTO account_banned VALUES (?, UNIX_TIMESTAMP(), UNIX_TIMESTAMP()+?, ?, ?, 1)", CONNECTION_ASYNC);
+ PrepareStatement(LOGIN_UPD_ACCOUNT_NOT_BANNED, "UPDATE account_banned SET active = 0 WHERE id = ? AND active != 0", CONNECTION_ASYNC);
+ PrepareStatement(LOGIN_DEL_REALM_CHARACTERS_BY_REALM, "DELETE FROM realmcharacters WHERE acctid = ? AND realmid = ?", CONNECTION_ASYNC);
+ PrepareStatement(LOGIN_DEL_REALM_CHARACTERS, "DELETE FROM realmcharacters WHERE acctid = ?", CONNECTION_ASYNC);
+ PrepareStatement(LOGIN_INS_REALM_CHARACTERS, "INSERT INTO realmcharacters (numchars, acctid, realmid) VALUES (?, ?, ?)", CONNECTION_ASYNC);
+ PrepareStatement(LOGIN_SEL_SUM_REALM_CHARACTERS, "SELECT SUM(numchars) FROM realmcharacters WHERE acctid = ?", CONNECTION_ASYNC);
+ PrepareStatement(LOGIN_INS_ACCOUNT, "INSERT INTO account(username, sha_pass_hash, joindate) VALUES(?, ?, NOW())", CONNECTION_ASYNC);
+ PrepareStatement(LOGIN_INS_REALM_CHARACTERS_INIT, "INSERT INTO realmcharacters (realmid, acctid, numchars) SELECT realmlist.id, account.id, 0 FROM realmlist, account LEFT JOIN realmcharacters ON acctid=account.id WHERE acctid IS NULL", CONNECTION_ASYNC);
+ PrepareStatement(LOGIN_UPD_EXPANSION, "UPDATE account SET expansion = ? WHERE id = ?", CONNECTION_ASYNC);
+ PrepareStatement(LOGIN_UPD_ACCOUNT_LOCK, "UPDATE account SET locked = ? WHERE id = ?", CONNECTION_ASYNC);
+ PrepareStatement(LOGIN_INS_LOG, "INSERT INTO logs (time, realm, type, level, string) VALUES (?, ?, ?, ?, ?)", CONNECTION_ASYNC);
+ PrepareStatement(LOGIN_UPD_USERNAME, "UPDATE account SET v = 0, s = 0, username = ?, sha_pass_hash = ? WHERE id = ?", CONNECTION_ASYNC);
+ PrepareStatement(LOGIN_UPD_PASSWORD, "UPDATE account SET v = 0, s = 0, sha_pass_hash = ? WHERE id = ?", CONNECTION_ASYNC);
+ PrepareStatement(LOGIN_UPD_MUTE_TIME, "UPDATE account SET mutetime = ? WHERE id = ?", CONNECTION_ASYNC);
+ PrepareStatement(LOGIN_UPD_LAST_IP, "UPDATE account SET last_ip = ? WHERE username = ?", CONNECTION_ASYNC);
+ PrepareStatement(LOGIN_UPD_ACCOUNT_ONLINE, "UPDATE account SET online = 1 WHERE id = ?", CONNECTION_ASYNC);
+ PrepareStatement(LOGIN_UPD_UPTIME_PLAYERS, "UPDATE uptime SET uptime = ?, maxplayers = ? WHERE realmid = ? AND starttime = ?", CONNECTION_ASYNC);
+ PrepareStatement(LOGIN_DEL_OLD_LOGS, "DELETE FROM logs WHERE (time + ?) < ?", CONNECTION_ASYNC);
+ PrepareStatement(LOGIN_DEL_ACCOUNT_ACCESS, "DELETE FROM account_access WHERE id = ?", CONNECTION_ASYNC);
+ PrepareStatement(LOGIN_DEL_ACCOUNT_ACCESS_BY_REALM, "DELETE FROM account_access WHERE id = ? AND (RealmID = ? OR RealmID = -1)", CONNECTION_ASYNC);
+ PrepareStatement(LOGIN_INS_ACCOUNT_ACCESS, "INSERT INTO account_access (id,gmlevel,RealmID) VALUES (?, ?, ?)", CONNECTION_ASYNC);
+ PrepareStatement(LOGIN_GET_ACCOUNT_ID_BY_USERNAME, "SELECT id FROM account WHERE username = ?", CONNECTION_SYNCH);
+ PrepareStatement(LOGIN_GET_ACCOUNT_ACCESS_GMLEVEL, "SELECT gmlevel FROM account_access WHERE id = ?", CONNECTION_SYNCH);
+ PrepareStatement(LOGIN_GET_GMLEVEL_BY_REALMID, "SELECT gmlevel FROM account_access WHERE id = ? AND (RealmID = ? OR RealmID = -1)", CONNECTION_SYNCH);
+ PrepareStatement(LOGIN_GET_USERNAME_BY_ID, "SELECT username FROM account WHERE id = ?", CONNECTION_SYNCH);
+ PrepareStatement(LOGIN_SEL_CHECK_PASSWORD, "SELECT 1 FROM account WHERE id = ? AND sha_pass_hash = ?", CONNECTION_SYNCH);
+ PrepareStatement(LOGIN_SEL_CHECK_PASSWORD_BY_NAME, "SELECT 1 FROM account WHERE username = ? AND sha_pass_hash = ?", CONNECTION_SYNCH);
+ PrepareStatement(LOGIN_SEL_PINFO, "SELECT a.username, aa.gmlevel, a.email, a.last_ip, DATE_FORMAT(a.last_login, '%Y-%m-%d %T'), a.mutetime FROM account a LEFT JOIN account_access aa ON (a.id = aa.id AND (aa.RealmID = ? OR aa.RealmID = -1)) WHERE a.id = ?", CONNECTION_SYNCH);
+ PrepareStatement(LOGIN_SEL_PINFO_BANS, "SELECT unbandate, bandate = unbandate, bannedby, banreason FROM account_banned WHERE id = ? AND active ORDER BY bandate ASC LIMIT 1", CONNECTION_SYNCH);
+ PrepareStatement(LOGIN_SEL_GM_ACCOUNTS, "SELECT a.username, aa.gmlevel FROM account a, account_access aa WHERE a.id=aa.id AND aa.gmlevel >= ? AND (aa.realmid = -1 OR aa.realmid = ?)", CONNECTION_SYNCH);
+ PrepareStatement(LOGIN_SEL_ACCOUNT_INFO, "SELECT a.username, a.last_ip, aa.gmlevel, a.expansion FROM account a LEFT JOIN account_access aa ON (a.id = aa.id) WHERE a.id = ?", CONNECTION_SYNCH);
+ PrepareStatement(LOGIN_SEL_ACCOUNT_ACCESS_GMLEVEL_TEST, "SELECT 1 FROM account_access WHERE id = ? AND gmlevel > ?", CONNECTION_SYNCH);
+ PrepareStatement(LOGIN_SEL_ACCOUNT_ACCESS, "SELECT a.id, aa.gmlevel, aa.RealmID FROM account a LEFT JOIN account_access aa ON (a.id = aa.id) WHERE a.username = ?", CONNECTION_SYNCH);
+ PrepareStatement(LOGIN_SEL_ACCOUNT_RECRUITER, "SELECT 1 FROM account WHERE recruiter = ?", CONNECTION_SYNCH);
+ PrepareStatement(LOGIN_SEL_BANS, "SELECT 1 FROM account_banned WHERE id = ? AND active = 1 UNION SELECT 1 FROM ip_banned WHERE ip = ?", CONNECTION_SYNCH);
+ PrepareStatement(LOGIN_SEL_ACCOUNT_WHOIS, "SELECT username, email, last_ip FROM account WHERE id = ?", CONNECTION_SYNCH);
+ PrepareStatement(LOGIN_SEL_REALMLIST_SECURITY_LEVEL, "SELECT allowedSecurityLevel from realmlist WHERE id = ?", CONNECTION_SYNCH);
+ PrepareStatement(LOGIN_DEL_ACCOUNT, "DELETE FROM account WHERE id = ?", CONNECTION_ASYNC);
}
diff --git a/src/server/shared/Database/Implementation/WorldDatabase.cpp b/src/server/shared/Database/Implementation/WorldDatabase.cpp
index 9b4f709ffdd..399a4eeb031 100644
--- a/src/server/shared/Database/Implementation/WorldDatabase.cpp
+++ b/src/server/shared/Database/Implementation/WorldDatabase.cpp
@@ -22,74 +22,74 @@ void WorldDatabaseConnection::DoPrepareStatements()
if (!m_reconnecting)
m_stmts.resize(MAX_WORLDDATABASE_STATEMENTS);
- PREPARE_STATEMENT(WORLD_SEL_QUEST_POOLS, "SELECT entry, pool_entry FROM pool_quest", CONNECTION_SYNCH)
- PREPARE_STATEMENT(WORLD_DEL_CRELINKED_RESPAWN, "DELETE FROM linked_respawn WHERE guid = ?", CONNECTION_ASYNC)
- PREPARE_STATEMENT(WORLD_REP_CREATURE_LINKED_RESPAWN, "REPLACE INTO linked_respawn (guid, linkedGuid) VALUES (?, ?)", CONNECTION_ASYNC)
- PREPARE_STATEMENT(WORLD_SEL_CREATURE_TEXT, "SELECT entry, groupid, id, text, type, language, probability, emote, duration, sound FROM creature_text", CONNECTION_SYNCH)
- PREPARE_STATEMENT(WORLD_SEL_SMART_SCRIPTS, "SELECT entryorguid, source_type, id, link, event_type, event_phase_mask, event_chance, event_flags, event_param1, event_param2, event_param3, event_param4, action_type, action_param1, action_param2, action_param3, action_param4, action_param5, action_param6, target_type, target_param1, target_param2, target_param3, target_x, target_y, target_z, target_o FROM smart_scripts ORDER BY entryorguid, source_type, id, link", CONNECTION_SYNCH)
- PREPARE_STATEMENT(WORLD_SEL_SMARTAI_WP, "SELECT entry, pointid, position_x, position_y, position_z FROM waypoints ORDER BY entry, pointid", CONNECTION_SYNCH)
- PREPARE_STATEMENT(WORLD_DEL_GAMEOBJECT, "DELETE FROM gameobject WHERE guid = ?", CONNECTION_ASYNC);
- PREPARE_STATEMENT(WORLD_DEL_EVENT_GAMEOBJECT, "DELETE FROM game_event_gameobject WHERE guid = ?", CONNECTION_ASYNC);
- PREPARE_STATEMENT(WORLD_INS_GRAVEYARD_ZONE, "INSERT INTO game_graveyard_zone (id, ghost_zone, faction) VALUES (?, ?, ?)", CONNECTION_ASYNC);
- PREPARE_STATEMENT(WORLD_DEL_GRAVEYARD_ZONE, "DELETE FROM game_graveyard_zone WHERE id = ? AND ghost_zone = ? AND faction = ?", CONNECTION_ASYNC);
- PREPARE_STATEMENT(WORLD_INS_GAME_TELE, "INSERT INTO game_tele (id, position_x, position_y, position_z, orientation, map, name) VALUES (?, ?, ?, ?, ?, ?, ?)", CONNECTION_ASYNC);
- PREPARE_STATEMENT(WORLD_DEL_GAME_TELE, "DELETE FROM game_tele WHERE name = ?", CONNECTION_ASYNC);
- PREPARE_STATEMENT(WORLD_INS_NPC_VENODR, "INSERT INTO npc_vendor (entry, item, maxcount, incrtime, extendedcost) VALUES(?, ?, ?, ?, ?)", CONNECTION_ASYNC);
- PREPARE_STATEMENT(WORLD_DEL_NPC_VENDOR, "DELETE FROM npc_vendor WHERE entry = ? AND item = ?", CONNECTION_ASYNC);
- PREPARE_STATEMENT(WORLD_SEL_NPC_VENDOR_REF, "SELECT item, maxcount, incrtime, ExtendedCost FROM npc_vendor WHERE entry = ? ORDER BY slot ASC", CONNECTION_SYNCH);
- PREPARE_STATEMENT(WORLD_UPD_CREATURE_MOVEMENT_TYPE, "UPDATE creature SET MovementType = ? WHERE guid = ?", CONNECTION_ASYNC);
- PREPARE_STATEMENT(WORLD_UPD_CREATURE_FACTION, "UPDATE creature_template SET faction_A = ?, faction_H = ? WHERE entry = ?", CONNECTION_ASYNC);
- PREPARE_STATEMENT(WORLD_UPD_CREATURE_NPCFLAG, "UPDATE creature_template SET npcflag = ? WHERE entry = ?", CONNECTION_ASYNC);
- PREPARE_STATEMENT(WORLD_UPD_CREATURE_POSITION, "UPDATE creature SET position_x = ?, position_y = ?, position_z = ?, orientation = ? WHERE guid = ?", CONNECTION_ASYNC);
- PREPARE_STATEMENT(WORLD_UPD_CREATURE_SPAWN_DISTANCE, "UPDATE creature SET spawndist = ?, MovementType = ? WHERE guid = ?", CONNECTION_ASYNC);
- PREPARE_STATEMENT(WORLD_UPD_CREATURE_SPAWN_TIME_SECS, "UPDATE creature SET spawntimesecs = ? WHERE guid = ?", CONNECTION_ASYNC);
- PREPARE_STATEMENT(WORLD_INS_CREATURE_FORMATION, "INSERT INTO creature_formations (leaderGUID, memberGUID, dist, angle, groupAI) VALUES (?, ?, ?, ?, ?)", CONNECTION_ASYNC);
- PREPARE_STATEMENT(WORLD_INS_WAYPOINT_DATA, "INSERT INTO waypoint_data (id, point, position_x, position_y, position_z) VALUES (?, ?, ?, ?, ?)", CONNECTION_ASYNC);
- PREPARE_STATEMENT(WORLD_DEL_WAYPOINT_DATA, "DELETE FROM waypoint_data WHERE id = ? AND point = ?", CONNECTION_ASYNC);
- PREPARE_STATEMENT(WORLD_UPD_WAYPOINT_DATA_POINT, "UPDATE waypoint_data SET point = point - 1 WHERE id = ? AND point > ?", CONNECTION_ASYNC);
- PREPARE_STATEMENT(WORLD_UPD_WAYPOINT_DATA_POSITION, "UPDATE waypoint_data SET position_x = ?, position_y = ?, position_z = ? where id = ? AND point = ?", CONNECTION_ASYNC);
- PREPARE_STATEMENT(WORLD_UPD_WAYPOINT_DATA_WPGUID, "UPDATE waypoint_data SET wpguid = ? WHERE id = ? and point = ?", CONNECTION_ASYNC);
- PREPARE_STATEMENT(WORLD_SEL_WAYPOINT_DATA_MAX_ID, "SELECT MAX(id) FROM waypoint_data", CONNECTION_SYNCH);
- PREPARE_STATEMENT(WORLD_SEL_WAYPOINT_DATA_MAX_POINT, "SELECT MAX(point) FROM waypoint_data WHERE id = ?", CONNECTION_SYNCH);
- PREPARE_STATEMENT(WORLD_SEL_WAYPOINT_DATA_BY_ID, "SELECT point, position_x, position_y, position_z, orientation, move_flag, delay, action, action_chance FROM waypoint_data WHERE id = ? ORDER BY point", CONNECTION_SYNCH);
- PREPARE_STATEMENT(WORLD_SEL_WAYPOINT_DATA_POS_BY_ID, "SELECT point, position_x, position_y, position_z FROM waypoint_data WHERE id = ?", CONNECTION_SYNCH);
- PREPARE_STATEMENT(WORLD_SEL_WAYPOINT_DATA_POS_FIRST_BY_ID, "SELECT position_x, position_y, position_z FROM waypoint_data WHERE point = 1 AND id = ?", CONNECTION_SYNCH);
- PREPARE_STATEMENT(WORLD_SEL_WAYPOINT_DATA_POS_LAST_BY_ID, "SELECT position_x, position_y, position_z, orientation FROM waypoint_data WHERE id = ? ORDER BY point DESC LIMIT 1", CONNECTION_SYNCH);
- PREPARE_STATEMENT(WORLD_SEL_WAYPOINT_DATA_BY_WPGUID, "SELECT id, point FROM waypoint_data WHERE wpguid = ?", CONNECTION_SYNCH);
- PREPARE_STATEMENT(WORLD_SEL_WAYPOINT_DATA_ALL_BY_WPGUID, "SELECT id, point, delay, move_flag, action, action_chance FROM waypoint_data WHERE wpguid = ?", CONNECTION_SYNCH);
- PREPARE_STATEMENT(WORLD_UPD_WAYPOINT_DATA_ALL_WPGUID, "UPDATE waypoint_data SET wpguid = 0", CONNECTION_ASYNC);
- PREPARE_STATEMENT(WORLD_SEL_WAYPOINT_DATA_BY_POS, "SELECT id, point FROM waypoint_data WHERE (abs(position_x - ?) <= ?) and (abs(position_y - ?) <= ?) and (abs(position_z - ?) <= ?)", CONNECTION_SYNCH);
- PREPARE_STATEMENT(WORLD_SEL_WAYPOINT_DATA_WPGUID_BY_ID, "SELECT wpguid FROM waypoint_data WHERE id = ? and wpguid <> 0", CONNECTION_SYNCH);
- PREPARE_STATEMENT(WOLRD_SEL_WAYPOINT_DATA_ACTION, "SELECT DISTINCT action FROM waypoint_data", CONNECTION_SYNCH);
- PREPARE_STATEMENT(WORLD_SEL_WAYPOINT_SCRIPTS_MAX_ID, "SELECT MAX(guid) FROM waypoint_scripts", CONNECTION_SYNCH);
- PREPARE_STATEMENT(WORLD_INS_CREATURE_ADDON, "INSERT INTO creature_addon(guid, path_id) VALUES (?, ?)", CONNECTION_ASYNC);
- PREPARE_STATEMENT(WORLD_UPD_CREATURE_ADDON_PATH, "UPDATE creature_addon SET path_id = ? WHERE guid = ?", CONNECTION_ASYNC);
- PREPARE_STATEMENT(WORLD_DEL_CREATURE_ADDON, "DELETE FROM creature_addon WHERE guid = ?", CONNECTION_ASYNC);
- PREPARE_STATEMENT(WORLD_SEL_CREATURE_ADDON_BY_GUID, "SELECT guid FROM creature_addon WHERE guid = ?", CONNECTION_SYNCH);
- PREPARE_STATEMENT(WORLD_INS_WAYPOINT_SCRIPT, "INSERT INTO waypoint_scripts (guid) VALUES (?)", CONNECTION_ASYNC);
- PREPARE_STATEMENT(WORLD_DEL_WAYPOINT_SCRIPT, "DELETE FROM waypoint_scripts WHERE guid = ?", CONNECTION_ASYNC);
- PREPARE_STATEMENT(WORLD_UPD_WAYPOINT_SCRIPT_ID, "UPDATE waypoint_scripts SET id = ? WHERE guid = ?", CONNECTION_ASYNC);
- PREPARE_STATEMENT(WORLD_UPD_WAYPOINT_SCRIPT_X, "UPDATE waypoint_scripts SET x = ? WHERE guid = ?", CONNECTION_ASYNC);
- PREPARE_STATEMENT(WORLD_UPD_WAYPOINT_SCRIPT_Y, "UPDATE waypoint_scripts SET y = ? WHERE guid = ?", CONNECTION_ASYNC);
- PREPARE_STATEMENT(WORLD_UPD_WAYPOINT_SCRIPT_Z, "UPDATE waypoint_scripts SET z = ? WHERE guid = ?", CONNECTION_ASYNC);
- PREPARE_STATEMENT(WORLD_UPD_WAYPOINT_SCRIPT_O, "UPDATE waypoint_scripts SET o = ? WHERE guid = ?", CONNECTION_ASYNC);
- PREPARE_STATEMENT(WORLD_SEL_WAYPOINT_SCRIPT_ID_BY_GUID, "SELECT id FROM waypoint_scripts WHERE guid = ?", CONNECTION_SYNCH);
- PREPARE_STATEMENT(WORLD_DEL_CREATURE, "DELETE FROM creature WHERE guid = ?", CONNECTION_ASYNC);
- PREPARE_STATEMENT(WORLD_INS_CREATURE_TRANSPORT, "INSERT INTO creature_transport (guid, npc_entry, transport_entry, TransOffsetX, TransOffsetY, TransOffsetZ, TransOffsetO) values (?, ?, ?, ?, ?, ?, ?)", CONNECTION_ASYNC);
- PREPARE_STATEMENT(WORLD_UPD_CREATURE_TRANSPORT_EMOTE, "UPDATE creature_transport SET emote = ? WHERE transport_entry = ? AND guid = ?", CONNECTION_ASYNC);
- PREPARE_STATEMENT(WORLD_SEL_COMMANDS, "SELECT name, security, help FROM command", CONNECTION_SYNCH);
- PREPARE_STATEMENT(WORLD_SEL_CREATURE_TEMPLATE, "SELECT difficulty_entry_1, difficulty_entry_2, difficulty_entry_3, KillCredit1, KillCredit2, modelid1, modelid2, modelid3, modelid4, name, subname, IconName, gossip_menu_id, minlevel, maxlevel, exp, faction_A, faction_H, npcflag, speed_walk, speed_run, scale, rank, mindmg, maxdmg, dmgschool, attackpower, dmg_multiplier, baseattacktime, rangeattacktime, unit_class, unit_flags, unit_flags2, dynamicflags, family, trainer_type, trainer_spell, trainer_class, trainer_race, minrangedmg, maxrangedmg, rangedattackpower, type, type_flags, lootid, pickpocketloot, skinloot, resistance1, resistance2, resistance3, resistance4, resistance5, resistance6, spell1, spell2, spell3, spell4, spell5, spell6, spell7, spell8, PetSpellDataId, VehicleId, mingold, maxgold, AIName, MovementType, InhabitType, HoverHeight, Health_mod, Mana_mod, Armor_mod, RacialLeader, questItem1, questItem2, questItem3, questItem4, questItem5, questItem6, movementId, RegenHealth, equipment_id, mechanic_immune_mask, flags_extra, ScriptName FROM creature_template WHERE entry = ?", CONNECTION_SYNCH);
- PREPARE_STATEMENT(WORLD_SEL_WAYPOINT_SCRIPT_BY_ID, "SELECT guid, delay, command, datalong, datalong2, dataint, x, y, z, o FROM waypoint_scripts WHERE id = ?", CONNECTION_SYNCH);
- PREPARE_STATEMENT(WORLD_SEL_IP2NATION_COUNTRY, "SELECT c.country FROM ip2nationCountries c, ip2nation i WHERE i.ip < ? AND c.code = i.country ORDER BY i.ip DESC LIMIT 0,1", CONNECTION_SYNCH);
- PREPARE_STATEMENT(WORLD_SEL_ITEM_TEMPLATE_BY_NAME, "SELECT entry FROM item_template WHERE name = ?", CONNECTION_SYNCH);
- PREPARE_STATEMENT(WORLD_SEL_CREATURE_BY_ID, "SELECT guid FROM creature WHERE id = ?", CONNECTION_SYNCH);
- PREPARE_STATEMENT(WORLD_SEL_GAMEOBJECT_NEAREST, "SELECT guid, id, position_x, position_y, position_z, map, (POW(position_x - ?, 2) + POW(position_y - ?, 2) + POW(position_z - ?, 2)) AS order_ FROM gameobject WHERE map = ? AND (POW(position_x - ?, 2) + POW(position_y - ?, 2) + POW(position_z - ?, 2)) <= ? ORDER BY order_", CONNECTION_SYNCH);
- PREPARE_STATEMENT(WORLD_SEL_CREATURE_NEAREST, "SELECT guid, id, position_x, position_y, position_z, map, (POW(position_x - ?, 2) + POW(position_y - ?, 2) + POW(position_z - ?, 2)) AS order_ FROM creature WHERE map = ? AND (POW(position_x - ?, 2) + POW(position_y - ?, 2) + POW(position_z - ?, 2)) <= ? ORDER BY order_", CONNECTION_SYNCH);
- PREPARE_STATEMENT(WORLD_INS_CREATURE, "INSERT INTO creature (guid, id , map, spawnMask, phaseMask, modelid, equipment_id, position_x, position_y, position_z, orientation, spawntimesecs, spawndist, currentwaypoint, curhealth, curmana, MovementType, npcflag, unit_flags, dynamicflags) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", CONNECTION_ASYNC);
- PREPARE_STATEMENT(WORLD_DEL_GAME_EVENT_CREATURE, "DELETE FROM game_event_creature WHERE guid = ?", CONNECTION_ASYNC);
- PREPARE_STATEMENT(WORLD_DEL_GAME_EVENT_MODEL_EQUIP, "DELETE FROM game_event_model_equip WHERE guid = ?", CONNECTION_ASYNC);
- PREPARE_STATEMENT(WORLD_INS_GAMEOBJECT, "INSERT INTO gameobject (guid, id, map, spawnMask, phaseMask, position_x, position_y, position_z, orientation, rotation0, rotation1, rotation2, rotation3, spawntimesecs, animprogress, state) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", CONNECTION_ASYNC);
- PREPARE_STATEMENT(WORLD_INS_DISABLES, "INSERT INTO disables (entry, sourceType, flags, comment) VALUES (?, ?, ?, ?)", CONNECTION_ASYNC);
- PREPARE_STATEMENT(WORLD_SEL_DISABLES, "SELECT entry FROM disables WHERE entry = ? AND sourceType = ?", CONNECTION_SYNCH);
- PREPARE_STATEMENT(WORLD_DEL_DISABLES, "DELETE FROM disables WHERE entry = ? AND sourceType = ?", CONNECTION_ASYNC);
+ PrepareStatement(WORLD_SEL_QUEST_POOLS, "SELECT entry, pool_entry FROM pool_quest", CONNECTION_SYNCH);
+ PrepareStatement(WORLD_DEL_CRELINKED_RESPAWN, "DELETE FROM linked_respawn WHERE guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(WORLD_REP_CREATURE_LINKED_RESPAWN, "REPLACE INTO linked_respawn (guid, linkedGuid) VALUES (?, ?)", CONNECTION_ASYNC);
+ PrepareStatement(WORLD_SEL_CREATURE_TEXT, "SELECT entry, groupid, id, text, type, language, probability, emote, duration, sound FROM creature_text", CONNECTION_SYNCH);
+ PrepareStatement(WORLD_SEL_SMART_SCRIPTS, "SELECT entryorguid, source_type, id, link, event_type, event_phase_mask, event_chance, event_flags, event_param1, event_param2, event_param3, event_param4, action_type, action_param1, action_param2, action_param3, action_param4, action_param5, action_param6, target_type, target_param1, target_param2, target_param3, target_x, target_y, target_z, target_o FROM smart_scripts ORDER BY entryorguid, source_type, id, link", CONNECTION_SYNCH);
+ PrepareStatement(WORLD_SEL_SMARTAI_WP, "SELECT entry, pointid, position_x, position_y, position_z FROM waypoints ORDER BY entry, pointid", CONNECTION_SYNCH);
+ PrepareStatement(WORLD_DEL_GAMEOBJECT, "DELETE FROM gameobject WHERE guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(WORLD_DEL_EVENT_GAMEOBJECT, "DELETE FROM game_event_gameobject WHERE guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(WORLD_INS_GRAVEYARD_ZONE, "INSERT INTO game_graveyard_zone (id, ghost_zone, faction) VALUES (?, ?, ?)", CONNECTION_ASYNC);
+ PrepareStatement(WORLD_DEL_GRAVEYARD_ZONE, "DELETE FROM game_graveyard_zone WHERE id = ? AND ghost_zone = ? AND faction = ?", CONNECTION_ASYNC);
+ PrepareStatement(WORLD_INS_GAME_TELE, "INSERT INTO game_tele (id, position_x, position_y, position_z, orientation, map, name) VALUES (?, ?, ?, ?, ?, ?, ?)", CONNECTION_ASYNC);
+ PrepareStatement(WORLD_DEL_GAME_TELE, "DELETE FROM game_tele WHERE name = ?", CONNECTION_ASYNC);
+ PrepareStatement(WORLD_INS_NPC_VENDOR, "INSERT INTO npc_vendor (entry, item, maxcount, incrtime, extendedcost) VALUES(?, ?, ?, ?, ?)", CONNECTION_ASYNC);
+ PrepareStatement(WORLD_DEL_NPC_VENDOR, "DELETE FROM npc_vendor WHERE entry = ? AND item = ?", CONNECTION_ASYNC);
+ PrepareStatement(WORLD_SEL_NPC_VENDOR_REF, "SELECT item, maxcount, incrtime, ExtendedCost FROM npc_vendor WHERE entry = ? ORDER BY slot ASC", CONNECTION_SYNCH);
+ PrepareStatement(WORLD_UPD_CREATURE_MOVEMENT_TYPE, "UPDATE creature SET MovementType = ? WHERE guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(WORLD_UPD_CREATURE_FACTION, "UPDATE creature_template SET faction_A = ?, faction_H = ? WHERE entry = ?", CONNECTION_ASYNC);
+ PrepareStatement(WORLD_UPD_CREATURE_NPCFLAG, "UPDATE creature_template SET npcflag = ? WHERE entry = ?", CONNECTION_ASYNC);
+ PrepareStatement(WORLD_UPD_CREATURE_POSITION, "UPDATE creature SET position_x = ?, position_y = ?, position_z = ?, orientation = ? WHERE guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(WORLD_UPD_CREATURE_SPAWN_DISTANCE, "UPDATE creature SET spawndist = ?, MovementType = ? WHERE guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(WORLD_UPD_CREATURE_SPAWN_TIME_SECS, "UPDATE creature SET spawntimesecs = ? WHERE guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(WORLD_INS_CREATURE_FORMATION, "INSERT INTO creature_formations (leaderGUID, memberGUID, dist, angle, groupAI) VALUES (?, ?, ?, ?, ?)", CONNECTION_ASYNC);
+ PrepareStatement(WORLD_INS_WAYPOINT_DATA, "INSERT INTO waypoint_data (id, point, position_x, position_y, position_z) VALUES (?, ?, ?, ?, ?)", CONNECTION_ASYNC);
+ PrepareStatement(WORLD_DEL_WAYPOINT_DATA, "DELETE FROM waypoint_data WHERE id = ? AND point = ?", CONNECTION_ASYNC);
+ PrepareStatement(WORLD_UPD_WAYPOINT_DATA_POINT, "UPDATE waypoint_data SET point = point - 1 WHERE id = ? AND point > ?", CONNECTION_ASYNC);
+ PrepareStatement(WORLD_UPD_WAYPOINT_DATA_POSITION, "UPDATE waypoint_data SET position_x = ?, position_y = ?, position_z = ? where id = ? AND point = ?", CONNECTION_ASYNC);
+ PrepareStatement(WORLD_UPD_WAYPOINT_DATA_WPGUID, "UPDATE waypoint_data SET wpguid = ? WHERE id = ? and point = ?", CONNECTION_ASYNC);
+ PrepareStatement(WORLD_SEL_WAYPOINT_DATA_MAX_ID, "SELECT MAX(id) FROM waypoint_data", CONNECTION_SYNCH);
+ PrepareStatement(WORLD_SEL_WAYPOINT_DATA_MAX_POINT, "SELECT MAX(point) FROM waypoint_data WHERE id = ?", CONNECTION_SYNCH);
+ PrepareStatement(WORLD_SEL_WAYPOINT_DATA_BY_ID, "SELECT point, position_x, position_y, position_z, orientation, move_flag, delay, action, action_chance FROM waypoint_data WHERE id = ? ORDER BY point", CONNECTION_SYNCH);
+ PrepareStatement(WORLD_SEL_WAYPOINT_DATA_POS_BY_ID, "SELECT point, position_x, position_y, position_z FROM waypoint_data WHERE id = ?", CONNECTION_SYNCH);
+ PrepareStatement(WORLD_SEL_WAYPOINT_DATA_POS_FIRST_BY_ID, "SELECT position_x, position_y, position_z FROM waypoint_data WHERE point = 1 AND id = ?", CONNECTION_SYNCH);
+ PrepareStatement(WORLD_SEL_WAYPOINT_DATA_POS_LAST_BY_ID, "SELECT position_x, position_y, position_z, orientation FROM waypoint_data WHERE id = ? ORDER BY point DESC LIMIT 1", CONNECTION_SYNCH);
+ PrepareStatement(WORLD_SEL_WAYPOINT_DATA_BY_WPGUID, "SELECT id, point FROM waypoint_data WHERE wpguid = ?", CONNECTION_SYNCH);
+ PrepareStatement(WORLD_SEL_WAYPOINT_DATA_ALL_BY_WPGUID, "SELECT id, point, delay, move_flag, action, action_chance FROM waypoint_data WHERE wpguid = ?", CONNECTION_SYNCH);
+ PrepareStatement(WORLD_UPD_WAYPOINT_DATA_ALL_WPGUID, "UPDATE waypoint_data SET wpguid = 0", CONNECTION_ASYNC);
+ PrepareStatement(WORLD_SEL_WAYPOINT_DATA_BY_POS, "SELECT id, point FROM waypoint_data WHERE (abs(position_x - ?) <= ?) and (abs(position_y - ?) <= ?) and (abs(position_z - ?) <= ?)", CONNECTION_SYNCH);
+ PrepareStatement(WORLD_SEL_WAYPOINT_DATA_WPGUID_BY_ID, "SELECT wpguid FROM waypoint_data WHERE id = ? and wpguid <> 0", CONNECTION_SYNCH);
+ PrepareStatement(WOLRD_SEL_WAYPOINT_DATA_ACTION, "SELECT DISTINCT action FROM waypoint_data", CONNECTION_SYNCH);
+ PrepareStatement(WORLD_SEL_WAYPOINT_SCRIPTS_MAX_ID, "SELECT MAX(guid) FROM waypoint_scripts", CONNECTION_SYNCH);
+ PrepareStatement(WORLD_INS_CREATURE_ADDON, "INSERT INTO creature_addon(guid, path_id) VALUES (?, ?)", CONNECTION_ASYNC);
+ PrepareStatement(WORLD_UPD_CREATURE_ADDON_PATH, "UPDATE creature_addon SET path_id = ? WHERE guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(WORLD_DEL_CREATURE_ADDON, "DELETE FROM creature_addon WHERE guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(WORLD_SEL_CREATURE_ADDON_BY_GUID, "SELECT guid FROM creature_addon WHERE guid = ?", CONNECTION_SYNCH);
+ PrepareStatement(WORLD_INS_WAYPOINT_SCRIPT, "INSERT INTO waypoint_scripts (guid) VALUES (?)", CONNECTION_ASYNC);
+ PrepareStatement(WORLD_DEL_WAYPOINT_SCRIPT, "DELETE FROM waypoint_scripts WHERE guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(WORLD_UPD_WAYPOINT_SCRIPT_ID, "UPDATE waypoint_scripts SET id = ? WHERE guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(WORLD_UPD_WAYPOINT_SCRIPT_X, "UPDATE waypoint_scripts SET x = ? WHERE guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(WORLD_UPD_WAYPOINT_SCRIPT_Y, "UPDATE waypoint_scripts SET y = ? WHERE guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(WORLD_UPD_WAYPOINT_SCRIPT_Z, "UPDATE waypoint_scripts SET z = ? WHERE guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(WORLD_UPD_WAYPOINT_SCRIPT_O, "UPDATE waypoint_scripts SET o = ? WHERE guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(WORLD_SEL_WAYPOINT_SCRIPT_ID_BY_GUID, "SELECT id FROM waypoint_scripts WHERE guid = ?", CONNECTION_SYNCH);
+ PrepareStatement(WORLD_DEL_CREATURE, "DELETE FROM creature WHERE guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(WORLD_INS_CREATURE_TRANSPORT, "INSERT INTO creature_transport (guid, npc_entry, transport_entry, TransOffsetX, TransOffsetY, TransOffsetZ, TransOffsetO) values (?, ?, ?, ?, ?, ?, ?)", CONNECTION_ASYNC);
+ PrepareStatement(WORLD_UPD_CREATURE_TRANSPORT_EMOTE, "UPDATE creature_transport SET emote = ? WHERE transport_entry = ? AND guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(WORLD_SEL_COMMANDS, "SELECT name, security, help FROM command", CONNECTION_SYNCH);
+ PrepareStatement(WORLD_SEL_CREATURE_TEMPLATE, "SELECT difficulty_entry_1, difficulty_entry_2, difficulty_entry_3, KillCredit1, KillCredit2, modelid1, modelid2, modelid3, modelid4, name, subname, IconName, gossip_menu_id, minlevel, maxlevel, exp, faction_A, faction_H, npcflag, speed_walk, speed_run, scale, rank, mindmg, maxdmg, dmgschool, attackpower, dmg_multiplier, baseattacktime, rangeattacktime, unit_class, unit_flags, unit_flags2, dynamicflags, family, trainer_type, trainer_spell, trainer_class, trainer_race, minrangedmg, maxrangedmg, rangedattackpower, type, type_flags, lootid, pickpocketloot, skinloot, resistance1, resistance2, resistance3, resistance4, resistance5, resistance6, spell1, spell2, spell3, spell4, spell5, spell6, spell7, spell8, PetSpellDataId, VehicleId, mingold, maxgold, AIName, MovementType, InhabitType, HoverHeight, Health_mod, Mana_mod, Armor_mod, RacialLeader, questItem1, questItem2, questItem3, questItem4, questItem5, questItem6, movementId, RegenHealth, equipment_id, mechanic_immune_mask, flags_extra, ScriptName FROM creature_template WHERE entry = ?", CONNECTION_SYNCH);
+ PrepareStatement(WORLD_SEL_WAYPOINT_SCRIPT_BY_ID, "SELECT guid, delay, command, datalong, datalong2, dataint, x, y, z, o FROM waypoint_scripts WHERE id = ?", CONNECTION_SYNCH);
+ PrepareStatement(WORLD_SEL_IP2NATION_COUNTRY, "SELECT c.country FROM ip2nationCountries c, ip2nation i WHERE i.ip < ? AND c.code = i.country ORDER BY i.ip DESC LIMIT 0,1", CONNECTION_SYNCH);
+ PrepareStatement(WORLD_SEL_ITEM_TEMPLATE_BY_NAME, "SELECT entry FROM item_template WHERE name = ?", CONNECTION_SYNCH);
+ PrepareStatement(WORLD_SEL_CREATURE_BY_ID, "SELECT guid FROM creature WHERE id = ?", CONNECTION_SYNCH);
+ PrepareStatement(WORLD_SEL_GAMEOBJECT_NEAREST, "SELECT guid, id, position_x, position_y, position_z, map, (POW(position_x - ?, 2) + POW(position_y - ?, 2) + POW(position_z - ?, 2)) AS order_ FROM gameobject WHERE map = ? AND (POW(position_x - ?, 2) + POW(position_y - ?, 2) + POW(position_z - ?, 2)) <= ? ORDER BY order_", CONNECTION_SYNCH);
+ PrepareStatement(WORLD_SEL_CREATURE_NEAREST, "SELECT guid, id, position_x, position_y, position_z, map, (POW(position_x - ?, 2) + POW(position_y - ?, 2) + POW(position_z - ?, 2)) AS order_ FROM creature WHERE map = ? AND (POW(position_x - ?, 2) + POW(position_y - ?, 2) + POW(position_z - ?, 2)) <= ? ORDER BY order_", CONNECTION_SYNCH);
+ PrepareStatement(WORLD_INS_CREATURE, "INSERT INTO creature (guid, id , map, spawnMask, phaseMask, modelid, equipment_id, position_x, position_y, position_z, orientation, spawntimesecs, spawndist, currentwaypoint, curhealth, curmana, MovementType, npcflag, unit_flags, dynamicflags) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", CONNECTION_ASYNC);
+ PrepareStatement(WORLD_DEL_GAME_EVENT_CREATURE, "DELETE FROM game_event_creature WHERE guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(WORLD_DEL_GAME_EVENT_MODEL_EQUIP, "DELETE FROM game_event_model_equip WHERE guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(WORLD_INS_GAMEOBJECT, "INSERT INTO gameobject (guid, id, map, spawnMask, phaseMask, position_x, position_y, position_z, orientation, rotation0, rotation1, rotation2, rotation3, spawntimesecs, animprogress, state) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", CONNECTION_ASYNC);
+ PrepareStatement(WORLD_INS_DISABLES, "INSERT INTO disables (entry, sourceType, flags, comment) VALUES (?, ?, ?, ?)", CONNECTION_ASYNC);
+ PrepareStatement(WORLD_SEL_DISABLES, "SELECT entry FROM disables WHERE entry = ? AND sourceType = ?", CONNECTION_SYNCH);
+ PrepareStatement(WORLD_DEL_DISABLES, "DELETE FROM disables WHERE entry = ? AND sourceType = ?", CONNECTION_ASYNC);
}
diff --git a/src/server/shared/Database/Implementation/WorldDatabase.h b/src/server/shared/Database/Implementation/WorldDatabase.h
index 27586f63c13..30cc45c535a 100644
--- a/src/server/shared/Database/Implementation/WorldDatabase.h
+++ b/src/server/shared/Database/Implementation/WorldDatabase.h
@@ -54,7 +54,7 @@ enum WorldDatabaseStatements
WORLD_DEL_GRAVEYARD_ZONE,
WORLD_INS_GAME_TELE,
WORLD_DEL_GAME_TELE,
- WORLD_INS_NPC_VENODR,
+ WORLD_INS_NPC_VENDOR,
WORLD_DEL_NPC_VENDOR,
WORLD_SEL_NPC_VENDOR_REF,
WORLD_UPD_CREATURE_MOVEMENT_TYPE,
diff --git a/src/server/shared/Database/MySQLConnection.cpp b/src/server/shared/Database/MySQLConnection.cpp
index acf0d96684c..10ff16b5ddd 100644
--- a/src/server/shared/Database/MySQLConnection.cpp
+++ b/src/server/shared/Database/MySQLConnection.cpp
@@ -63,9 +63,6 @@ MySQLConnection::~MySQLConnection()
for (size_t i = 0; i < m_stmts.size(); ++i)
delete m_stmts[i];
- for (PreparedStatementMap::const_iterator itr = m_queries.begin(); itr != m_queries.end(); ++itr)
- free((void *)m_queries[itr->first].first);
-
mysql_close(m_Mysql);
}
@@ -150,8 +147,6 @@ bool MySQLConnection::Open()
bool MySQLConnection::PrepareStatements()
{
DoPrepareStatements();
- for (PreparedStatementMap::const_iterator itr = m_queries.begin(); itr != m_queries.end(); ++itr)
- PrepareStatement(itr->first, itr->second.first, itr->second.second);
return !m_prepareError;
}
@@ -424,6 +419,8 @@ MySQLPreparedStatement* MySQLConnection::GetPreparedStatement(uint32 index)
void MySQLConnection::PrepareStatement(uint32 index, const char* sql, ConnectionFlags flags)
{
+ m_queries.insert(PreparedStatementMap::value_type(index, std::make_pair(sql, flags)));
+
// For reconnection case
if (m_reconnecting)
delete m_stmts[index];
diff --git a/src/server/shared/Database/MySQLConnection.h b/src/server/shared/Database/MySQLConnection.h
index 2b1ccf7df4d..989c447fcd5 100644
--- a/src/server/shared/Database/MySQLConnection.h
+++ b/src/server/shared/Database/MySQLConnection.h
@@ -62,9 +62,7 @@ struct MySQLConnectionInfo
std::string port_or_socket;
};
-typedef std::map<uint32 /*index*/, std::pair<const char* /*query*/, ConnectionFlags /*sync/async*/> > PreparedStatementMap;
-
-#define PREPARE_STATEMENT(a, b, c) m_queries[a] = std::make_pair(strdup(b), c);
+typedef std::map<uint32 /*index*/, std::pair<std::string /*query*/, ConnectionFlags /*sync/async*/> > PreparedStatementMap;
class MySQLConnection
{
diff --git a/src/server/shared/Database/PreparedStatement.cpp b/src/server/shared/Database/PreparedStatement.cpp
index 6403592eed2..86010e61686 100644
--- a/src/server/shared/Database/PreparedStatement.cpp
+++ b/src/server/shared/Database/PreparedStatement.cpp
@@ -74,6 +74,9 @@ void PreparedStatement::BindParameters()
case TYPE_STRING:
m_stmt->setString(i, statement_data[i].str.c_str());
break;
+ case TYPE_NULL:
+ m_stmt->setNull(i);
+ break;
}
}
#ifdef _DEBUG
@@ -191,6 +194,14 @@ void PreparedStatement::setString(const uint8 index, const std::string& value)
statement_data[index].type = TYPE_STRING;
}
+void PreparedStatement::setNull(const uint8 index)
+{
+ if (index >= statement_data.size())
+ statement_data.resize(index+1);
+
+ statement_data[index].type = TYPE_NULL;
+}
+
MySQLPreparedStatement::MySQLPreparedStatement(MYSQL_STMT* stmt) :
m_Mstmt(stmt),
m_bind(NULL)
@@ -230,11 +241,16 @@ void MySQLPreparedStatement::ClearParameters()
}
}
+static bool ParamenterIndexAssertFail(uint32 stmtIndex, uint8 index, uint32 paramCount)
+{
+ sLog->outError(LOG_FILTER_SQL_DRIVER, "Attempted to bind parameter %u%s on a PreparedStatement %u (statement has only %u parameters)", uint32(index) + 1, (index == 1 ? "st" : (index == 2 ? "nd" : (index == 3 ? "rd" : "nd"))), stmtIndex, paramCount);
+ return false;
+}
+
//- Bind on mysql level
bool MySQLPreparedStatement::CheckValidIndex(uint8 index)
{
- if (index >= m_paramCount)
- return false;
+ ASSERT(index < m_paramCount || ParamenterIndexAssertFail(m_stmt->m_index, index, m_paramCount));
if (m_paramsSet[index])
sLog->outWarn(LOG_FILTER_SQL, "[WARNING] Prepared Statement (id: %u) trying to bind value on already bound index (%u).", m_stmt->m_index, index);
@@ -337,11 +353,26 @@ void MySQLPreparedStatement::setString(const uint8 index, const char* value)
param->buffer = new char[len];
param->buffer_length = len;
param->is_null_value = 0;
+ delete param->length;
param->length = new unsigned long(len-1);
memcpy(param->buffer, value, len);
}
+void MySQLPreparedStatement::setNull(const uint8 index)
+{
+ CheckValidIndex(index);
+ m_paramsSet[index] = true;
+ MYSQL_BIND* param = &m_bind[index];
+ param->buffer_type = MYSQL_TYPE_NULL;
+ delete [] static_cast<char *>(param->buffer);
+ param->buffer = NULL;
+ param->buffer_length = 0;
+ param->is_null_value = 1;
+ delete param->length;
+ param->length = NULL;
+}
+
void MySQLPreparedStatement::setValue(MYSQL_BIND* param, enum_field_types type, const void* value, uint32 len, bool isUnsigned)
{
param->buffer_type = type;
@@ -355,59 +386,62 @@ void MySQLPreparedStatement::setValue(MYSQL_BIND* param, enum_field_types type,
memcpy(param->buffer, value, len);
}
-std::string MySQLPreparedStatement::getQueryString(const char *query)
+std::string MySQLPreparedStatement::getQueryString(std::string const& sqlPattern) const
{
- std::string queryString = query;
+ std::string queryString = sqlPattern;
- uint32 pos = 0;
+ size_t pos = 0;
for (uint32 i = 0; i < m_stmt->statement_data.size(); i++)
{
- pos = queryString.find("?", pos);
- std::stringstream replace;
-
- replace << '\'';
+ pos = queryString.find('?', pos);
+ std::stringstream ss;
switch (m_stmt->statement_data[i].type)
{
case TYPE_BOOL:
- replace << (m_stmt->statement_data[i].data.boolean ? '1' : '0');
+ ss << uint16(m_stmt->statement_data[i].data.boolean);
break;
case TYPE_UI8:
- replace << uint16(m_stmt->statement_data[i].data.ui8); // stringstream will append a character with that code instead of numeric representation
+ ss << uint16(m_stmt->statement_data[i].data.ui8); // stringstream will append a character with that code instead of numeric representation
break;
case TYPE_UI16:
- replace << m_stmt->statement_data[i].data.ui16;
+ ss << m_stmt->statement_data[i].data.ui16;
break;
case TYPE_UI32:
- replace << m_stmt->statement_data[i].data.ui32;
+ ss << m_stmt->statement_data[i].data.ui32;
break;
case TYPE_I8:
- replace << int16(m_stmt->statement_data[i].data.i8); // stringstream will append a character with that code instead of numeric representation
+ ss << int16(m_stmt->statement_data[i].data.i8); // stringstream will append a character with that code instead of numeric representation
break;
case TYPE_I16:
- replace << m_stmt->statement_data[i].data.i16;
+ ss << m_stmt->statement_data[i].data.i16;
break;
case TYPE_I32:
- replace << m_stmt->statement_data[i].data.i32;
+ ss << m_stmt->statement_data[i].data.i32;
break;
case TYPE_UI64:
- replace << m_stmt->statement_data[i].data.ui64;
+ ss << m_stmt->statement_data[i].data.ui64;
break;
case TYPE_I64:
- replace << m_stmt->statement_data[i].data.i64;
+ ss << m_stmt->statement_data[i].data.i64;
break;
case TYPE_FLOAT:
- replace << m_stmt->statement_data[i].data.f;
+ ss << m_stmt->statement_data[i].data.f;
break;
case TYPE_DOUBLE:
- replace << m_stmt->statement_data[i].data.d;
+ ss << m_stmt->statement_data[i].data.d;
break;
case TYPE_STRING:
- replace << m_stmt->statement_data[i].str;
+ ss << '\'' << m_stmt->statement_data[i].str << '\'';
+ break;
+ case TYPE_NULL:
+ ss << "NULL";
break;
}
- replace << '\'';
- queryString.replace(pos, 1, replace.str());
+
+ std::string replaceStr = ss.str();
+ queryString.replace(pos, 1, replaceStr);
+ pos += replaceStr.length();
}
return queryString;
diff --git a/src/server/shared/Database/PreparedStatement.h b/src/server/shared/Database/PreparedStatement.h
index ae9acb4c441..2cab6e40de0 100644
--- a/src/server/shared/Database/PreparedStatement.h
+++ b/src/server/shared/Database/PreparedStatement.h
@@ -55,7 +55,8 @@ enum PreparedStatementValueType
TYPE_I64,
TYPE_FLOAT,
TYPE_DOUBLE,
- TYPE_STRING
+ TYPE_STRING,
+ TYPE_NULL
};
struct PreparedStatementData
@@ -91,6 +92,7 @@ class PreparedStatement
void setFloat(const uint8 index, const float value);
void setDouble(const uint8 index, const double value);
void setString(const uint8 index, const std::string& value);
+ void setNull(const uint8 index);
protected:
void BindParameters();
@@ -125,6 +127,7 @@ class MySQLPreparedStatement
void setFloat(const uint8 index, const float value);
void setDouble(const uint8 index, const double value);
void setString(const uint8 index, const char* value);
+ void setNull(const uint8 index);
protected:
MYSQL_STMT* GetSTMT() { return m_Mstmt; }
@@ -132,7 +135,7 @@ class MySQLPreparedStatement
PreparedStatement* m_stmt;
void ClearParameters();
bool CheckValidIndex(uint8 index);
- std::string getQueryString(const char *query);
+ std::string getQueryString(std::string const& sqlPattern) const;
private:
void setValue(MYSQL_BIND* param, enum_field_types type, const void* value, uint32 len, bool isUnsigned);
diff --git a/src/server/shared/Database/Transaction.h b/src/server/shared/Database/Transaction.h
index 9b7f9afc30b..026cc1fdf96 100644
--- a/src/server/shared/Database/Transaction.h
+++ b/src/server/shared/Database/Transaction.h
@@ -29,6 +29,9 @@ class Transaction
friend class TransactionTask;
friend class MySQLConnection;
+ template <typename T>
+ friend class DatabaseWorkerPool;
+
public:
Transaction() : _cleanedUp(false) {}
~Transaction() { Cleanup(); }
@@ -65,4 +68,4 @@ class TransactionTask : public SQLOperation
SQLTransaction m_trans;
};
-#endif \ No newline at end of file
+#endif
diff --git a/src/server/shared/Dynamic/LinkedReference/Reference.h b/src/server/shared/Dynamic/LinkedReference/Reference.h
index c221753cfbf..4c3630b175d 100644
--- a/src/server/shared/Dynamic/LinkedReference/Reference.h
+++ b/src/server/shared/Dynamic/LinkedReference/Reference.h
@@ -20,7 +20,7 @@
#define _REFERENCE_H
#include "Dynamic/LinkedList.h"
-#include <assert.h>
+#include "Errors.h" // for ASSERT
//=====================================================
@@ -45,7 +45,7 @@ template <class TO, class FROM> class Reference : public LinkedListElement
// Create new link
void link(TO* toObj, FROM* fromObj)
{
- assert(fromObj); // fromObj MUST not be NULL
+ ASSERT(fromObj); // fromObj MUST not be NULL
if (isValid())
unlink();
if (toObj != NULL)
diff --git a/src/server/shared/Dynamic/TypeContainerVisitor.h b/src/server/shared/Dynamic/TypeContainerVisitor.h
index af798623334..800a21bed5d 100644
--- a/src/server/shared/Dynamic/TypeContainerVisitor.h
+++ b/src/server/shared/Dynamic/TypeContainerVisitor.h
@@ -38,7 +38,7 @@ template<class VISITOR, class TYPE_CONTAINER> void VisitorHelper(VISITOR &v, TYP
}
// terminate condition for container list
-template<class VISITOR> void VisitorHelper(VISITOR &v, ContainerList<TypeNull> &c)
+template<class VISITOR> void VisitorHelper(VISITOR &/*v*/, ContainerList<TypeNull> &/*c*/)
{
}
diff --git a/src/server/shared/Utilities/Util.cpp b/src/server/shared/Utilities/Util.cpp
index 50fbaa799c6..0d9314c48a3 100644
--- a/src/server/shared/Utilities/Util.cpp
+++ b/src/server/shared/Utilities/Util.cpp
@@ -20,6 +20,7 @@
#include "Common.h"
#include "utf8.h"
#include "SFMT.h"
+#include "Errors.h" // for ASSERT
#include <ace/TSS_T.h>
#include <ace/INET_Addr.h>
@@ -28,19 +29,19 @@ static SFMTRandTSS sfmtRand;
int32 irand(int32 min, int32 max)
{
- assert(max >= min);
+ ASSERT(max >= min);
return int32(sfmtRand->IRandom(min, max));
}
uint32 urand(uint32 min, uint32 max)
{
- assert(max >= min);
+ ASSERT(max >= min);
return sfmtRand->URandom(min, max);
}
float frand(float min, float max)
{
- assert(max >= min);
+ ASSERT(max >= min);
return float(sfmtRand->Random() * (max - min) + min);
}
diff --git a/src/server/shared/Utilities/Util.h b/src/server/shared/Utilities/Util.h
index 3cf8857ead6..10c2e866a7d 100644
--- a/src/server/shared/Utilities/Util.h
+++ b/src/server/shared/Utilities/Util.h
@@ -352,11 +352,6 @@ std::string ByteArrayToHexStr(uint8 const* bytes, uint32 length, bool reverse =
#ifndef _FLAG96
#define _FLAG96
-#ifndef PAIR64_HIPART
-#define PAIR64_HIPART(x) (uint32)((uint64(x) >> 32) & UI64LIT(0x00000000FFFFFFFF))
-#define PAIR64_LOPART(x) (uint32)(uint64(x) & UI64LIT(0x00000000FFFFFFFF))
-#endif
-
// simple class for not-modifyable list
template <typename T>
class HookList
@@ -404,8 +399,8 @@ public:
flag96(uint64 p1, uint32 p2)
{
- part[0] = PAIR64_LOPART(p1);
- part[1] = PAIR64_HIPART(p1);
+ part[0] = (uint32)(p1 & UI64LIT(0x00000000FFFFFFFF));
+ part[1] = (uint32)((p1 >> 32) & UI64LIT(0x00000000FFFFFFFF));
part[2] = p2;
}
diff --git a/src/server/worldserver/RemoteAccess/RARunnable.cpp b/src/server/worldserver/RemoteAccess/RARunnable.cpp
index e64e8d03115..8d57ef6c3b2 100644
--- a/src/server/worldserver/RemoteAccess/RARunnable.cpp
+++ b/src/server/worldserver/RemoteAccess/RARunnable.cpp
@@ -35,7 +35,7 @@
RARunnable::RARunnable()
{
- ACE_Reactor_Impl* imp = NULL;
+ ACE_Reactor_Impl* imp;
#if defined (ACE_HAS_EVENT_POLL) || defined (ACE_HAS_DEV_POLL)
imp = new ACE_Dev_Poll_Reactor();
diff --git a/src/server/worldserver/worldserver.conf.dist b/src/server/worldserver/worldserver.conf.dist
index fafc1362cad..68cf3994e3b 100644
--- a/src/server/worldserver/worldserver.conf.dist
+++ b/src/server/worldserver/worldserver.conf.dist
@@ -280,15 +280,6 @@ vmap.enableLOS = 1
vmap.enableHeight = 1
#
-# vmap.ignoreSpellIds
-# Description: These spells are ignored for LoS calculation.
-# List of ids with delimiter ','.
-# Example: "7720,1337"
-# Default: "7720"
-
-vmap.ignoreSpellIds = "7720"
-
-#
# vmap.petLOS
# Description: Check line of sight for pets, to avoid them attacking through walls.
# Default: 1 - (Enabled, each pet attack will be checked for line of sight)
diff --git a/src/tools/vmap4_extractor/model.cpp b/src/tools/vmap4_extractor/model.cpp
index 57f9b421dbe..c642f73ccae 100644
--- a/src/tools/vmap4_extractor/model.cpp
+++ b/src/tools/vmap4_extractor/model.cpp
@@ -77,8 +77,7 @@ bool Model::ConvertToVMAPModel(const char * outfilename)
return false;
}
fwrite(szRawVMAPMagic, 8, 1, output);
- uint32 nVertices = 0;
- nVertices = header.nBoundingVertices;
+ uint32 nVertices = header.nBoundingVertices;
fwrite(&nVertices, sizeof(int), 1, output);
uint32 nofgroups = 1;
fwrite(&nofgroups,sizeof(uint32), 1, output);
@@ -91,8 +90,7 @@ bool Model::ConvertToVMAPModel(const char * outfilename)
wsize = sizeof(branches) + sizeof(uint32) * branches;
fwrite(&wsize, sizeof(int), 1, output);
fwrite(&branches,sizeof(branches), 1, output);
- uint32 nIndexes = 0;
- nIndexes = header.nBoundingTriangles;
+ uint32 nIndexes = header.nBoundingTriangles;
fwrite(&nIndexes,sizeof(uint32), 1, output);
fwrite("INDX",4, 1, output);
wsize = sizeof(uint32) + sizeof(unsigned short) * nIndexes;