aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sql/updates/characters/2012_01_04_00_characters_character_queststatus_seasonal.sql8
-rw-r--r--sql/updates/world/2011_12_13_02_world_creature_template_addon.sql (renamed from sql/updates/world/2011_12_13_02_creature_template_addon.sql)0
-rw-r--r--sql/updates/world/2012_01_02_02_world_creature_template.sql2
-rw-r--r--sql/updates/world/2012_01_03_00_world_gossip_menu.sql17
-rw-r--r--sql/updates/world/2012_01_03_01_world_quest_template.sql1
-rw-r--r--sql/updates/world/2012_01_03_02_world_sai.sql27
-rw-r--r--sql/updates/world/2012_01_03_03_world_creature_template.sql2
-rw-r--r--sql/updates/world/2012_01_03_04_world_gameobject_questrelation.sql8
-rw-r--r--sql/updates/world/2012_01_03_05_world_creature.sql180
-rw-r--r--sql/updates/world/2012_01_03_06_world_sai.sql82
-rw-r--r--sql/updates/world/2012_01_03_07_world_creature.sql46
-rw-r--r--sql/updates/world/2012_01_04_00_world_gossip_menu.sql70
-rw-r--r--sql/updates/world/2012_01_04_01_world_game_event_seasonal_questrelation.sql386
-rw-r--r--sql/updates/world/2012_01_04_02_world_achievements.sql29
-rw-r--r--sql/updates/world/2012_01_04_02_world_sai.sql177
-rw-r--r--sql/updates/world/2012_01_04_03_world_spell_script_names.sql2
-rw-r--r--sql/updates/world/2012_01_04_04_world_creature.sql10
-rw-r--r--sql/updates/world/2012_01_04_04_world_creature_template.sql8
-rw-r--r--sql/updates/world/2012_01_04_05_world_waypoint_data.sql476
-rw-r--r--sql/updates/world/2012_01_04_06_world_waypoint_data.sql22
-rw-r--r--sql/updates/world/2012_01_04_07_world_gossip_menu.sql17
-rw-r--r--sql/updates/world/2012_01_04_08_world_gossip_menu.sql164
-rw-r--r--sql/updates/world/2012_01_04_09_world_gossip_menu.sql56
-rw-r--r--sql/updates/world/2012_01_04_10_world_gossip_menu.sql131
-rw-r--r--sql/updates/world/2012_01_04_11_world_gossip_menu.sql223
-rw-r--r--sql/updates/world/2012_01_04_12_world_gosip_menu.sql30
-rw-r--r--sql/updates/world/2012_01_04_13_world_gossip_menu.sql88
-rw-r--r--sql/updates/world/2012_01_04_14_world_gossip_menu.sql71
-rw-r--r--sql/updates/world/2012_01_04_15_world_gossip_menu.sql26
-rw-r--r--sql/updates/world/2012_01_05_00_world_script_texts.sql2
-rw-r--r--sql/updates/world/2012_01_05_01_world_gameobject.sql5
-rw-r--r--sql/updates/world/2012_01_05_02_world_gameobject_template.sql7
-rw-r--r--sql/updates/world/2012_01_05_03_world_creature_model_info.sql7
-rw-r--r--sql/updates/world/2012_01_05_04_world_gameobject.sql4
-rw-r--r--sql/updates/world/2012_01_05_05_world_creature.sql2
-rw-r--r--sql/updates/world/2012_01_05_06_world_spell_script_names.sql2
-rw-r--r--sql/updates/world/2012_01_05_07_world_creature_template.sql9
-rw-r--r--sql/updates/world/2012_01_05_08_world_creature_template.sql2
-rw-r--r--sql/updates/world/2012_01_05_09_world_waypoint_data.sql73
-rw-r--r--sql/updates/world/2012_01_05_10_world_creature_template.sql2
-rw-r--r--sql/updates/world/2012_01_05_11_world_creature_onkill_reputation.sql6
-rw-r--r--sql/updates/world/2012_01_05_12_world_game_event_seasonal_questrelation.sql5
-rw-r--r--sql/updates/world/2012_01_05_13_world_creature_transport.sql2
-rw-r--r--sql/updates/world/2012_01_05_14_world_command.sql1
-rw-r--r--sql/updates/world/2012_01_05_14_world_creature_template.sql9
-rw-r--r--sql/updates/world/2012_01_06_00_world_misc.sql189
-rw-r--r--sql/updates/world/2012_01_06_01_world_creature_template.sql2
-rw-r--r--sql/updates/world/2012_01_06_02_world_achievement_criteria_data.sql24
-rw-r--r--sql/updates/world/2012_01_06_03_world_item_loot_template.sql8
-rw-r--r--sql/updates/world/2012_01_06_04_world_creature_questrelation.sql5
-rw-r--r--sql/updates/world/2012_01_06_05_world_creature_template.sql2
-rw-r--r--sql/updates/world/2012_01_06_06_world_quest_template.sql2
-rw-r--r--sql/updates/world/2012_01_06_07_world_sai.sql23
-rw-r--r--sql/updates/world/2012_01_06_08_world_creature_template.sql2
-rw-r--r--sql/updates/world/2012_01_06_09_world_creature_questrelation.sql9
-rw-r--r--sql/updates/world/2012_01_06_10_world_creature_template.sql2
-rwxr-xr-xsrc/server/game/Achievements/AchievementMgr.cpp34
-rwxr-xr-xsrc/server/game/Achievements/AchievementMgr.h4
-rwxr-xr-xsrc/server/game/Battlegrounds/Battleground.cpp2
-rwxr-xr-xsrc/server/game/Chat/Chat.cpp8
-rwxr-xr-xsrc/server/game/Entities/Creature/Creature.cpp18
-rwxr-xr-xsrc/server/game/Entities/Player/Player.cpp142
-rwxr-xr-xsrc/server/game/Entities/Player/Player.h12
-rwxr-xr-xsrc/server/game/Entities/Unit/Unit.cpp128
-rwxr-xr-xsrc/server/game/Events/GameEventMgr.cpp60
-rwxr-xr-xsrc/server/game/Events/GameEventMgr.h3
-rwxr-xr-xsrc/server/game/Globals/ObjectMgr.h3
-rwxr-xr-xsrc/server/game/Maps/MapInstanced.cpp12
-rwxr-xr-xsrc/server/game/Maps/ZoneScript.h2
-rwxr-xr-xsrc/server/game/Quests/QuestDef.cpp6
-rwxr-xr-xsrc/server/game/Quests/QuestDef.h1
-rw-r--r--[-rwxr-xr-x]src/server/game/Server/Protocol/Handlers/CharacterHandler.cpp12
-rwxr-xr-xsrc/server/game/Spells/Auras/SpellAuras.cpp10
-rwxr-xr-xsrc/server/game/Spells/Spell.cpp2
-rwxr-xr-xsrc/server/game/Spells/SpellEffects.cpp43
-rw-r--r--src/server/game/Spells/SpellInfo.cpp8
-rw-r--r--src/server/game/Spells/SpellInfo.h1
-rwxr-xr-xsrc/server/game/Spells/SpellMgr.cpp11
-rwxr-xr-xsrc/server/game/World/World.cpp11
-rwxr-xr-xsrc/server/game/World/World.h1
-rw-r--r--src/server/scripts/Commands/cs_account.cpp1
-rw-r--r--src/server/scripts/Commands/cs_reload.cpp18
-rwxr-xr-xsrc/server/scripts/Northrend/IcecrownCitadel/instance_icecrown_citadel.cpp6
-rw-r--r--src/server/scripts/Northrend/Naxxramas/instance_naxxramas.cpp212
-rw-r--r--src/server/scripts/Northrend/Nexus/Oculus/instance_oculus.cpp6
-rw-r--r--src/server/scripts/Northrend/Ulduar/Ulduar/boss_freya.cpp2
-rw-r--r--src/server/scripts/Northrend/Ulduar/Ulduar/instance_ulduar.cpp6
-rw-r--r--src/server/scripts/Outland/blades_edge_mountains.cpp561
-rw-r--r--src/server/scripts/Spells/spell_paladin.cpp39
-rw-r--r--src/server/scripts/Spells/spell_shaman.cpp30
-rw-r--r--[-rwxr-xr-x]src/server/shared/Database/Implementation/CharacterDatabase.cpp10
-rw-r--r--[-rwxr-xr-x]src/server/shared/Database/Implementation/CharacterDatabase.h10
92 files changed, 3975 insertions, 225 deletions
diff --git a/sql/updates/characters/2012_01_04_00_characters_character_queststatus_seasonal.sql b/sql/updates/characters/2012_01_04_00_characters_character_queststatus_seasonal.sql
new file mode 100644
index 00000000000..f9ae71b65a7
--- /dev/null
+++ b/sql/updates/characters/2012_01_04_00_characters_character_queststatus_seasonal.sql
@@ -0,0 +1,8 @@
+DROP TABLE IF EXISTS `character_queststatus_seasonal`;
+CREATE TABLE `character_queststatus_seasonal` (
+ `guid` int(10) unsigned NOT NULL DEFAULT '0' COMMENT 'Global Unique Identifier',
+ `quest` int(10) unsigned NOT NULL DEFAULT '0' COMMENT 'Quest Identifier',
+ `event` int(10) unsigned NOT NULL DEFAULT '0' COMMENT 'Event Identifier',
+ PRIMARY KEY (`guid`,`quest`),
+ KEY `idx_guid` (`guid`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='Player System';
diff --git a/sql/updates/world/2011_12_13_02_creature_template_addon.sql b/sql/updates/world/2011_12_13_02_world_creature_template_addon.sql
index f1dc473bdd7..f1dc473bdd7 100644
--- a/sql/updates/world/2011_12_13_02_creature_template_addon.sql
+++ b/sql/updates/world/2011_12_13_02_world_creature_template_addon.sql
diff --git a/sql/updates/world/2012_01_02_02_world_creature_template.sql b/sql/updates/world/2012_01_02_02_world_creature_template.sql
index 1f87f418dec..ed95c4450fd 100644
--- a/sql/updates/world/2012_01_02_02_world_creature_template.sql
+++ b/sql/updates/world/2012_01_02_02_world_creature_template.sql
@@ -17,5 +17,5 @@ UPDATE `creature_template` SET `flags_extra`= `flags_extra`|64 WHERE `entry` IN
31484, -- Azure Binder
31488, -- Azure Invader
31495, -- Azure Spellbreaker
-31498, -- Azure Mage Slayer
+31498 -- Azure Mage Slayer
);
diff --git a/sql/updates/world/2012_01_03_00_world_gossip_menu.sql b/sql/updates/world/2012_01_03_00_world_gossip_menu.sql
new file mode 100644
index 00000000000..9e9bba43b1a
--- /dev/null
+++ b/sql/updates/world/2012_01_03_00_world_gossip_menu.sql
@@ -0,0 +1,17 @@
+-- Gossip Menu insert from sniff
+DELETE FROM `gossip_menu` WHERE `entry`=9918 AND `text_id`=13792;
+INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (9918,13792);
+DELETE FROM `gossip_menu` WHERE `entry`=9859 AND `text_id`=13650;
+INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (9859,13650);
+DELETE FROM `gossip_menu` WHERE `entry`=9857 AND `text_id`=13651;
+INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (9857,13651);
+-- Creature Gossip_menu_id Update from sniff
+UPDATE `creature_template` SET `gossip_menu_id`=10316 WHERE `entry`=33224;
+UPDATE `creature_template` SET `gossip_menu_id`=9918 WHERE `entry`=29430;
+UPDATE `creature_template` SET `gossip_menu_id`=9859 WHERE `entry`=29434;
+-- Creature Gossip_menu_option Update from sniff
+DELETE FROM `gossip_menu_option` WHERE `menu_id` IN (10316,9857,9917) AND `id` IN (0);
+INSERT INTO `gossip_menu_option` (`menu_id`,`id`,`option_icon`,`option_text`,`option_id`,`npc_option_npcflag`,`action_menu_id`,`action_poi_id`,`box_coded`,`box_money`,`box_text`) VALUES
+(10316,0,0, 'Glad to help, my lady. I''m told you were once the guardian of a fabled sword. Do you know where I might find it?',1,1,10315,0,0,0, ''),
+(9857,0,0, 'I''m ready - lets get you out of here.',1,1,0,0,0,0, ''),
+(9917,0,0, 'I am ready to head further into Storm Peaks.',1,1,0,0,0,0, '');
diff --git a/sql/updates/world/2012_01_03_01_world_quest_template.sql b/sql/updates/world/2012_01_03_01_world_quest_template.sql
new file mode 100644
index 00000000000..f35ea3be65b
--- /dev/null
+++ b/sql/updates/world/2012_01_03_01_world_quest_template.sql
@@ -0,0 +1 @@
+UPDATE `quest_template` SET `OfferRewardText`='<Getry looks you over.>$B$BThis is all Ickoris could send?' WHERE `id`=11703;
diff --git a/sql/updates/world/2012_01_03_02_world_sai.sql b/sql/updates/world/2012_01_03_02_world_sai.sql
new file mode 100644
index 00000000000..61ae8aab575
--- /dev/null
+++ b/sql/updates/world/2012_01_03_02_world_sai.sql
@@ -0,0 +1,27 @@
+-- Add text for Lynn Hyal
+DELETE FROM `creature_text` WHERE `entry`=23768;
+INSERT INTO `creature_text` (`entry`, `groupid`, `id`, `text`, `type`, `language`, `probability`, `emote`, `duration`, `sound`, `comment`) VALUES
+(23768, 1, 0, 'James? James... No, you\'re not James, but I know who you are...', 12, 0, 100, 0, 0, 0, 'Lynn Hyal'),
+(23768, 2, 0, 'You\'re the one who tracked down the brutes who did this to us.', 12, 0, 100, 0, 0, 0, 'Lynn Hyal'),
+(23768, 3, 0, 'I tried so hard to tell Jim... to tell anyone... who was behind this, but I couldn\'t find a way...', 12, 0, 100, 0, 0, 0, 'Lynn Hyal'),
+(23768, 4, 0, 'Thank you for helping us and for helping Jim. If you see him, tell him little Jimmy and I love him and that we\'re waiting for him.', 12, 0, 100, 0, 0, 0, 'Lynn Hyal'),
+(23768, 5, 0, 'I don\'t know when we\'ll see Daddy again, Jimmy, but I know he loves you and he misses you very much.', 12, 0, 100, 0, 0, 0, 'Lynn Hyal');
+-- Add text for Jimmy Hyal
+DELETE FROM `creature_text` WHERE `entry`=23769;
+INSERT INTO `creature_text` (`entry`, `groupid`, `id`, `text`, `type`, `language`, `probability`, `emote`, `duration`, `sound`, `comment`) VALUES
+(23769, 1, 0, 'Mommy, when will we see Daddy again?', 12, 0, 100, 0, 0, 0, 'Jimmy Hyal');
+-- add smart ai dialog for Lynn Hyal and quest credit at end of dialog
+UPDATE `creature_template` SET AIName="SmartAI" WHERE `entry`=23768;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=23768;
+INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES
+(23768, 0, 0, 0, 1, 0, 100, 1, 0, 0, 0, 0, 84, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Lynn Hyal - on spawn - talk 1'),
+(23768, 0, 1, 0, 1, 0, 100, 1, 2000, 2000, 0, 0, 84, 2, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Lynn Hyal - after 2 sec - talk 2'),
+(23768, 0, 2, 0, 1, 0, 100, 1, 5000, 5000, 0, 0, 84, 3, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Lynn Hyal - after 5 sec - talk 3'),
+(23768, 0, 3, 0, 1, 0, 100, 1, 8000, 8000, 0, 0, 84, 4, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Lynn Hyal - after 8 sec - talk 4'),
+(23768, 0, 4, 0, 1, 0, 100, 1, 12000, 12000, 0, 0, 84, 5, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Lynn Hyal - after 12 sec - reply to jimmy'),
+(23768, 0, 5, 0, 1, 0, 100, 1, 12000, 12000, 0, 0, 33, 23768, 0, 0, 0, 0, 0, 18, 5, 0, 0, 0, 0, 0, 0, 'Lynn Hyal - after 12 sec - kill credit quest complete');
+-- add smart ai dialog for Jimmy Hyal
+UPDATE `creature_template` SET AIName="SmartAI" WHERE `entry`=23769;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=23769;
+INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES
+(23769, 0, 0, 0, 1, 0, 100, 1, 10000, 10000, 0, 0, 84, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Jimmy Hyal - after 10 sec - talk 1');
diff --git a/sql/updates/world/2012_01_03_03_world_creature_template.sql b/sql/updates/world/2012_01_03_03_world_creature_template.sql
new file mode 100644
index 00000000000..29d0e802abe
--- /dev/null
+++ b/sql/updates/world/2012_01_03_03_world_creature_template.sql
@@ -0,0 +1,2 @@
+-- Update faction for Frostmane Troll Whelp "From Sniff"
+UPDATE `creature_template` SET `faction_A`=7,`faction_H`=7 WHERE `entry`=706;
diff --git a/sql/updates/world/2012_01_03_04_world_gameobject_questrelation.sql b/sql/updates/world/2012_01_03_04_world_gameobject_questrelation.sql
new file mode 100644
index 00000000000..519fa99e2d5
--- /dev/null
+++ b/sql/updates/world/2012_01_03_04_world_gameobject_questrelation.sql
@@ -0,0 +1,8 @@
+DELETE FROM `gameobject_questrelation` WHERE `quest` IN (12345, 12377);
+INSERT INTO `gameobject_questrelation` VALUES
+(190035, 12345),
+(190079, 12377);
+DELETE FROM `gameobject_involvedrelation` WHERE `quest` IN (12345, 12377);
+INSERT INTO `gameobject_involvedrelation` VALUES
+(190035, 12345),
+(190079, 12377);
diff --git a/sql/updates/world/2012_01_03_05_world_creature.sql b/sql/updates/world/2012_01_03_05_world_creature.sql
new file mode 100644
index 00000000000..b30ca2d5ef4
--- /dev/null
+++ b/sql/updates/world/2012_01_03_05_world_creature.sql
@@ -0,0 +1,180 @@
+SET @GUID := 72707; -- need 62;
+SET @NPC_WILDSPAWN_SATYR = 11451;
+SET @NPC_WILDSPAWN_ROGUE := 11452;
+SET @NPC_WILDSPAWN_BETRAYER := 11454;
+SET @NPC_WILDSPAWN_FELSWORN := 11455;
+SET @NPC_WILDSPAWN_SHADOWSTALKER := 11456;
+SET @NPC_WILDSPAWN_HELLCALLER := 11457;
+SET @NPC_WARPWOOD_TREANT = 11462;
+SET @NPC_WARPWOOD_CRUSHER := 13021;
+SET @NPC_WHIP_LASHER := 13022;
+SET @NPC_PHASE_LASHER := 13196;
+SET @NPC_FEL_LASH := 13197;
+
+-- add movement
+SET @ENTRY := 56992; -- single Wildspawn Felsworn instance
+UPDATE creature SET `MovementType`=2 WHERE `guid`=@ENTRY;
+DELETE FROM `creature_addon` WHERE `guid`=@ENTRY;
+INSERT INTO `creature_addon`(`guid`,`path_id`) VALUES
+(@ENTRY,@ENTRY*10);
+
+-- Add waypoints to Wildspawn Felsworn instance
+DELETE FROM `waypoint_data` WHERE `id`=@ENTRY*10;
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`delay`,`move_flag`,`action`,`action_chance`,`wpguid`) VALUES
+(@ENTRY*10,1,57.4000,-737.329,-25.1524,0,0,0,100,0),
+(@ENTRY*10,2,26.45,-682.69,-24.98,0,0,0,100,0);
+
+-- Smart AI for Wildspawn Shadowstalker
+SET @ENTRY := @NPC_WILDSPAWN_SHADOWSTALKER;
+DELETE FROM `creature_ai_scripts` WHERE `creature_id`=@ENTRY;
+UPDATE `creature_template` SET `AIName`='SmartAI' WHERE `entry`=@ENTRY;
+UPDATE creature SET `MovementType`=1,`spawndist`=3 WHERE `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,0,0,0,0,0,11,22766,0,0,0,0,0,1,0,0,0,0,0,0,0,'Wildspawn Shadowstalker - On Spawn - cast Sneak on self'),
+(@ENTRY,0,1,0,0,0,100,0,4000,8000,5000,8000,11,22416,0,0,0,0,0,2,0,0,0,0,0,0,0,'Wildspawn Shadowstalker - In Combat - Cast Backstab'),
+(@ENTRY,0,2,0,0,0,100,0,6000,7000,8000,9000,11,7992,0,0,0,0,0,2,0,0,0,0,0,0,0,'Wildspawn Shadowstalker - In Combat - Cast Slowing Posion');
+
+-- add movement
+SET @ENTRY := 56967; -- single Wildspawn Shadowstalker instance
+UPDATE creature SET `MovementType`=2 WHERE `guid`=@ENTRY;
+DELETE FROM `creature_addon` WHERE `guid`=@ENTRY;
+INSERT INTO `creature_addon`(`guid`,`path_id`) VALUES
+(@ENTRY,@ENTRY*10);
+
+-- Add waypoints to Wildspawn Shadowstalker instance
+DELETE FROM `waypoint_data` WHERE `id`=@ENTRY*10;
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`delay`,`move_flag`,`action`,`action_chance`,`wpguid`) VALUES
+(@ENTRY*10,1,45.4305,-675.9378,-25.1612,0,0,0,100,0),
+(@ENTRY*10,2,36.5939,-646.3212,-25.1506,0,0,0,100,0),
+(@ENTRY*10,3,58.3292,-605.7308,-25.0700,0,0,0,100,0),
+(@ENTRY*10,4,52.3244,-584.9519,-23.3673,0,0,0,100,0),
+(@ENTRY*10,5,52.1407,-565.7738,-19.4151,0,0,0,100,0),
+(@ENTRY*10,6,56.5794,-558.3062,-19.2307,0,0,0,100,0),
+(@ENTRY*10,7,76.8705,-545.9866,-15.2457,0,0,0,100,0),
+(@ENTRY*10,8,97.9787,-544.0214,-11.0777,0,0,0,100,0),
+(@ENTRY*10,9,76.8705,-545.9866,-15.2457,0,0,0,100,0),
+(@ENTRY*10,10,56.5794,-558.3062,-19.2307,0,0,0,100,0),
+(@ENTRY*10,11,52.1407,-565.7738,-19.4151,0,0,0,100,0),
+(@ENTRY*10,12,52.3244,-584.9519,-23.3673,0,0,0,100,0),
+(@ENTRY*10,13,58.3292,-605.7308,-25.0700,0,0,0,100,0),
+(@ENTRY*10,14,36.5939,-646.3212,-25.1506,0,0,0,100,0),
+(@ENTRY*10,15,45.4305,-675.9378,-25.1612,0,0,0,100,0),
+(@ENTRY*10,16,62.53,-681.04,-24.98,0,0,0,100,0);
+
+-- Spawn the mobs
+DELETE FROM `creature` WHERE `guid` BETWEEN @GUID AND @GUID+62;
+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+1,@NPC_WARPWOOD_TREANT,429,1,1,0,0,72.5524,-197.561,-4.14211,3.13356,7200,0,0,7842,0,2),
+(@GUID+2,@NPC_WARPWOOD_TREANT,429,1,1,0,0,20.3687,-203.068,-4.0968,3.10349,7200,0,0,7842,0,2),
+(@GUID+3,@NPC_WARPWOOD_TREANT,429,1,1,0,0,30.1582,-195.841,-4.12466,3.01317,7200,0,0,7599,0,2),
+(@GUID+4,@NPC_WARPWOOD_TREANT,429,1,1,0,0,25.8537,-206.521,-4.06996,3.01317,7200,0,0,7599,0,2),
+(@GUID+5,@NPC_WARPWOOD_TREANT,429,1,1,0,0,-107.769,-200.032,-4.10429,0.153016,7200,0,0,7842,0,2),
+(@GUID+6,@NPC_WARPWOOD_TREANT,429,1,1,0,0,-113.89,-195.466,-4.14424,0.0626954,7200,0,0,7842,0,2),
+(@GUID+7,@NPC_WARPWOOD_TREANT,429,1,1,0,0,-117.388,-207.58,-4.06716,0.0476419,7200,0,0,7842,0,2),
+(@GUID+8,@NPC_WARPWOOD_TREANT,429,1,1,0,0,-142.675,-350.105,-4.11237,1.70352,7200,0,0,7599,0,2),
+(@GUID+9,@NPC_WARPWOOD_TREANT,429,1,1,0,0,-145.689,-356.994,-4.13712,1.66338,7200,0,0,7599,0,2),
+(@GUID+10,@NPC_WARPWOOD_TREANT,429,1,1,0,0,-138.62,-360.106,-4.13313,1.66338,7200,0,0,7599,0,2),
+(@GUID+11,@NPC_WARPWOOD_TREANT,429,1,1,0,0,-115.225,-347.295,-4.05097,6.26559,7200,0,0,7599,0,2),
+(@GUID+12,@NPC_WARPWOOD_TREANT,429,1,1,0,0,-109.451,-350.449,-4.07628,6.28064,7200,0,0,7599,0,2),
+(@GUID+13,@NPC_WARPWOOD_TREANT,429,1,1,0,0,-120.637,-353.502,-4.10136,6.26747,7200,0,0,7842,0,2),
+(@GUID+14,@NPC_WARPWOOD_TREANT,429,1,1,0,0,-46.8699,-355.781,-4.11898,0.109725,7200,0,0,7599,0,2),
+(@GUID+15,@NPC_WARPWOOD_TREANT,429,1,1,0,0,-57.5391,-352.691,-4.09353,0.121943,7200,0,0,7842,0,2),
+(@GUID+16,@NPC_WARPWOOD_TREANT,429,1,1,0,0,-60.9243,-359.466,-4.14508,0.0617289,7200,0,0,7842,0,2),
+(@GUID+17,@NPC_WARPWOOD_TREANT,429,1,1,0,0,54.2367,-348.114,-4.05781,6.25459,7200,0,0,7599,0,2),
+(@GUID+18,@NPC_WARPWOOD_TREANT,429,1,1,0,0,43.279,-352.861,-4.0973,0.0633858,7200,0,0,7842,0,2),
+(@GUID+19,@NPC_WARPWOOD_TREANT,429,1,1,0,0,39.8267,-343.521,-4.02135,6.18098,7200,0,0,7842,0,2),
+(@GUID+20,@NPC_WARPWOOD_TREANT,429,1,1,0,0,111.859,-366.456,-4.14992,1.56459,7200,0,0,7842,0,2),
+(@GUID+21,@NPC_WARPWOOD_TREANT,429,1,1,0,0,116.012,-372.374,-4.09262,1.52947,7200,0,0,7842,0,2),
+(@GUID+22,@NPC_WARPWOOD_TREANT,429,1,1,0,0,107.625,-377.033,-4.07882,1.53449,7200,0,0,7842,0,2),
+(@GUID+23,@NPC_WARPWOOD_CRUSHER,429,1,1,0,0,141.391,-355.109,-4.15258,3.22692,7200,0,0,16194,0,0),
+(@GUID+24,@NPC_PHASE_LASHER,429,1,1,0,0,81.2447,-361.592,-4.14699,1.54781,7200,0,0,15684,0,0),
+(@GUID+25,@NPC_WHIP_LASHER,429,1,1,0,0,34.9898,-347.58,-4.05484,0.017372,7200,0,0,1900,0,0),
+(@GUID+26,@NPC_WHIP_LASHER,429,1,1,0,0,36.7793,-352.448,-4.09411,0.00231851,7200,0,0,1900,0,0),
+(@GUID+27,@NPC_WHIP_LASHER,429,1,1,0,0,41.2793,-352.437,-4.09411,0.00231851,7200,0,0,1900,0,0),
+(@GUID+28,@NPC_WHIP_LASHER,429,1,1,0,0,44.3212,-352.43,-4.09411,0.00231851,7200,0,0,1900,0,0),
+(@GUID+29,@NPC_WHIP_LASHER,429,1,1,0,0,44.315,-349.742,-4.07234,0.0588672,7200,0,0,1900,0,0),
+(@GUID+30,@NPC_WHIP_LASHER,429,1,1,0,0,39.4515,-350.029,-4.0749,0.063885,7200,0,0,1900,0,0),
+(@GUID+31,@NPC_WHIP_LASHER,429,1,1,0,0,39.2745,-347.262,-4.05348,0.063885,7200,0,0,1900,0,0),
+(@GUID+32,@NPC_WARPWOOD_CRUSHER,429,1,1,0,0,-20.953,-371.52,-4.05577,1.58638,7200,0,0,16194,0,0),
+(@GUID+33,@NPC_PHASE_LASHER,429,1,1,0,0,-52.0524,-361.703,-4.14598,1.7679,7200,0,0,15684,0,0),
+(@GUID+34,@NPC_WHIP_LASHER,429,1,1,0,0,-62.1186,-349.8,-4.07015,6.09414,7200,0,0,1900,0,0),
+(@GUID+35,@NPC_WHIP_LASHER,429,1,1,0,0,-69.5873,-354.282,-4.1069,6.17944,7200,0,0,1900,0,0),
+(@GUID+36,@NPC_WHIP_LASHER,429,1,1,0,0,-66.7331,-351.805,-4.08577,6.18948,7200,0,0,1900,0,0),
+(@GUID+37,@NPC_WHIP_LASHER,429,1,1,0,0,-73.9811,-351.124,-4.08116,6.18948,7200,0,0,1900,0,0),
+(@GUID+38,@NPC_WHIP_LASHER,429,1,1,0,0,-69.8854,-349.117,-4.06468,6.2798,7200,0,0,1900,0,0),
+(@GUID+39,@NPC_WHIP_LASHER,429,1,1,0,0,-65.6902,-346.108,-4.0402,6.2798,7200,0,0,1900,0,0),
+(@GUID+40,@NPC_WARPWOOD_CRUSHER,429,1,1,0,0,-73.7821,-346.08,-4.0402,6.2798,7200,0,0,1900,0,0),
+(@GUID+41,@NPC_WARPWOOD_TREANT,429,1,1,0,0,-93.8011,-363.618,-4.14738,1.65316,7200,0,0,16194,0,0),
+(@GUID+42,@NPC_PHASE_LASHER,429,1,1,0,0,-131.311,-365.627,-4.15058,1.51265,7200,0,0,15198,0,0),
+(@GUID+43,@NPC_WHIP_LASHER,429,1,1,0,0,-143.839,-340.391,-4.12014,1.83881,7200,0,0,1900,0,0),
+(@GUID+44,@NPC_WHIP_LASHER,429,1,1,0,0,-142.296,-336.529,-4.10736,1.85386,7200,0,0,1900,0,0),
+(@GUID+45,@NPC_WHIP_LASHER,429,1,1,0,0,-138.49,-341.197,-4.07808,1.73845,7200,0,0,1900,0,0),
+(@GUID+46,@NPC_WHIP_LASHER,429,1,1,0,0,-134.462,-337.194,-4.04726,1.70944,7200,0,0,1900,0,0),
+(@GUID+47,@NPC_WHIP_LASHER,429,1,1,0,0,-135.424,-330.303,-4.0528,1.70944,7200,0,0,1900,0,0),
+(@GUID+48,@NPC_WHIP_LASHER,429,1,1,0,0,-142.163,-331.244,-4.1045,1.71445,7200,0,0,1900,0,0),
+(@GUID+49,@NPC_WHIP_LASHER,429,1,1,0,0,-138.62,-333.245,-4.07944,1.71947,7200,0,0,1900,0,0),
+(@GUID+50,@NPC_WARPWOOD_CRUSHER,429,1,1,0,0,-138.38,-275.724,-4.07674,3.17049,7200,0,0,16194,0,0),
+(@GUID+51,@NPC_PHASE_LASHER,429,1,1,0,0,-162.835,-275.863,-4.14791,6.27238,7200,0,0,15684,0,0),
+(@GUID+52,@NPC_WHIP_LASHER,429,1,1,0,0,-158.318,-204.325,-4.15232,0.0694766,7200,0,0,1900,0,0),
+(@GUID+53,@NPC_WHIP_LASHER,429,1,1,0,0,-154.646,-204.07,-4.15232,0.0694766,7200,0,0,1900,0,0),
+(@GUID+54,@NPC_WHIP_LASHER,429,1,1,0,0,-153.089,-196.695,-4.15243,0.0343519,7200,0,0,1900,0,0),
+(@GUID+55,@NPC_WHIP_LASHER,429,1,1,0,0,-160.393,-196.946,-4.15243,0.0343519,7200,0,0,1900,0,0),
+(@GUID+56,@NPC_WHIP_LASHER,429,1,1,0,0,-162.052,-201.486,-4.15243,0.0393697,7200,0,0,1900,0,0),
+(@GUID+57,@NPC_WHIP_LASHER,429,1,1,0,0,-152.686,-201.117,-4.15243,0.0393697,7200,0,0,1900,0,0),
+(@GUID+58,@NPC_WHIP_LASHER,429,1,1,0,0,-156.996,-199.83,-4.15243,0.059441,7200,0,0,1900,0,0),
+(@GUID+59,@NPC_PHASE_LASHER,429,1,1,0,0,-86.8965,-210.681,-4.03141,1.56479,7200,0,0,15198,0,0),
+(@GUID+60,@NPC_WARPWOOD_CRUSHER,429,1,1,0,0,-87.0174,-180.571,-2.71439,4.76202,7200,0,0,16194,0,0),
+(@GUID+61,@NPC_PHASE_LASHER,429,1,1,0,0,-27.3846,-207.58,-4.06107,0.888256,7200,0,0,15684,0,0),
+(@GUID+62,@NPC_WARPWOOD_CRUSHER,429,1,1,0,0,-15.3937,-177.684,-2.71439,4.81219,7200,0,0,16194,0,0);
+
+-- Add movement to some mobs
+DELETE FROM `creature_addon` WHERE `guid` BETWEEN @GUID+1 AND @GUID+22;
+INSERT INTO `creature_addon` (`guid`,`path_id`) VALUES
+(@GUID+1,(@GUID+1)*10),
+(@GUID+2,(@GUID+2)*10),
+(@GUID+3,(@GUID+2)*10),
+(@GUID+4,(@GUID+2)*10),
+(@GUID+5,(@GUID+6)*10),
+(@GUID+6,(@GUID+6)*10),
+(@GUID+7,(@GUID+6)*10),
+(@GUID+8,(@GUID+8)*10),
+(@GUID+9,(@GUID+8)*10),
+(@GUID+10,(@GUID+8)*10),
+(@GUID+11,(@GUID+11)*10),
+(@GUID+12,(@GUID+11)*10),
+(@GUID+13,(@GUID+11)*10),
+(@GUID+14,(@GUID+14)*10),
+(@GUID+15,(@GUID+14)*10),
+(@GUID+16,(@GUID+14)*10),
+(@GUID+17,(@GUID+17)*10),
+(@GUID+18,(@GUID+17)*10),
+(@GUID+19,(@GUID+17)*10),
+(@GUID+20,(@GUID+20)*10),
+(@GUID+21,(@GUID+20)*10),
+(@GUID+22,(@GUID+20)*10);
+
+-- Add waypoints to mobs
+DELETE FROM `waypoint_data` WHERE `id` = (@GUID+1)*10;
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`delay`,`move_flag`,`action`,`action_chance`,`wpguid`) VALUES
+((@GUID+1)*10,1,70.6901,-197.173,-4.14434,0,1,0,100,0),
+((@GUID+1)*10,2,-104.169,-199.817,-4.12389,0,1,0,100,0),
+((@GUID+2)*10,1,-73.5443,-202.239,-4.10251,0,1,0,100,0),
+((@GUID+2)*10,2,35.4205,-201.467,-4.11061,0,1,0,100,0),
+((@GUID+6)*10,1,-20.2122,-201.982,-4.11082,0,1,0,100,0),
+((@GUID+6)*10,2,-130.665,-201.733,-4.10813,0,1,0,100,0),
+((@GUID+8)*10,1,-166.248,-199.501,-4.15228,0,1,0,100,0),
+((@GUID+8)*10,2,-131.595,-354.127,-4.10839,0,1,0,100,0),
+((@GUID+11)*10,1,-35.5988,-348.525,-4.06037,0,1,0,100,0),
+((@GUID+11)*10,2,-21.0353,-356.517,-4.12553,0,1,0,100,0),
+((@GUID+11)*10,3,4.10672,-354.436,-4.11233,0,1,0,100,0),
+((@GUID+11)*10,4,-62.8668,-351.204,-4.083,0,1,0,100,0),
+((@GUID+11)*10,5,-113.908,-346.958,-4.04887,0,1,0,100,0),
+((@GUID+14)*10,1,49.0152,-351.975,-4.09131,0,1,0,100,0),
+((@GUID+14)*10,2,-68.801,-355.361,-4.11568,0,1,0,100,0),
+((@GUID+17)*10,1,140.938,-354.573,-4.15133,0,1,0,100,0),
+((@GUID+17)*10,2, -17.9066,-352.038,-4.09042,0,1,0,100,0),
+((@GUID+20)*10,1,134.04,-337.362,-4.14977,0,1,0,100,0),
+((@GUID+20)*10,2,117.337,-367.835,-4.15199,0,1,0,100,0),
+((@GUID+20)*10,3,68.2814,-346.911,-4.04935,0,1,0,100,0),
+((@GUID+20)*10,4,111.089,-364.118,-4.14948,0,1,0,100,0);
diff --git a/sql/updates/world/2012_01_03_06_world_sai.sql b/sql/updates/world/2012_01_03_06_world_sai.sql
new file mode 100644
index 00000000000..858dc3f498d
--- /dev/null
+++ b/sql/updates/world/2012_01_03_06_world_sai.sql
@@ -0,0 +1,82 @@
+SET @NPC_WILDSPAWN_SATYR = 11451;
+SET @NPC_WILDSPAWN_ROGUE := 11452;
+SET @NPC_WILDSPAWN_BETRAYER := 11454;
+SET @NPC_WILDSPAWN_FELSWORN := 11455;
+SET @NPC_WILDSPAWN_SHADOWSTALKER := 11456;
+SET @NPC_WILDSPAWN_HELLCALLER := 11457;
+SET @NPC_WARPWOOD_TREANT = 11462;
+SET @NPC_WARPWOOD_CRUSHER := 13021;
+SET @NPC_WHIP_LASHER := 13022;
+SET @NPC_PHASE_LASHER := 13196;
+SET @NPC_FEL_LASH := 13197;
+
+-- SmartAI for Wildspawn Hellcaller
+SET @ENTRY := @NPC_WILDSPAWN_HELLCALLER;
+DELETE FROM `creature_ai_scripts` WHERE `creature_id`=@ENTRY;
+UPDATE `creature_template` SET `AIName`='SmartAI' WHERE `entry`=@ENTRY;
+UPDATE creature SET `MovementType`=1,`spawndist`=3 WHERE `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,4,0,100,0,0,0,0,0,21,0,0,0,0,0,0,1,0,0,0,0,0,0,0,'Wildspawn Hellcaller - On Aggro - Prevent Combat Movement'),
+(@ENTRY,0,1,2,4,0,100,0,0,0,0,0,11,15228,0,0,0,0,0,2,0,0,0,0,0,0,0,'Wildspawn Hellcaller - On Aggro - Cast Fireball '),
+(@ENTRY,0,2,0,61,0,100,0,0,0,0,0,22,1,0,0,0,0,0,1,0,0,0,0,0,0,0,'Wildspawn Hellcaller - On Aggro - Set Phase 1'),
+(@ENTRY,0,3,0,9,1,100,0,0,40,2400,3800,11,15228,0,0,0,0,0,2,0,0,0,0,0,0,0,'Wildspawn Hellcaller - Phase 1 - Cast Fireball'),
+(@ENTRY,0,4,5,3,1,100,0,0,15,0,0,21,1,0,0,0,0,0,1,0,0,0,0,0,0,0,'Wildspawn Hellcaller -In Phase 1 - Start Combat Movement'),
+(@ENTRY,0,5,0,61,1,100,0,0,0,0,0,22,1,0,0,0,0,0,1,0,0,0,0,0,0,0,'Wildspawn Hellcaller - Mana at 15% (Phase 1) - Set Phase 2'),
+(@ENTRY,0,6,0,9,1,100,0,35,80,0,0,21,1,0,0,0,0,0,0,0,0,0,0,0,0,0,'Wildspawn Hellcaller - At 35 Yards (Phase 1) - Start Combat Movement'),
+(@ENTRY,0,7,0,9,1,100,0,5,15,0,0,21,0,0,0,0,0,0,1,0,0,0,0,0,0,0,'Wildspawn Hellcaller - at 15 Yards (Phase 1) - Prevent Combat Movement '),
+(@ENTRY,0,8,0,9,1,100,0,0,5,0,0,21,1,0,0,0,0,0,1,0,0,0,0,0,0,0,'Wildspawn Hellcaller - Below 5 Yards (Phase 1) - Start Combat Movement'),
+(@ENTRY,0,9,0,3,2,100,0,0,30,100,100,22,1,0,0,0,0,0,1,0,0,0,0,0,0,0,'Wildspawn Hellcaller - Mana is above 30% (Phase 2) - Set Phase 1'),
+(@ENTRY,0,10,0,0,0,100,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'Wildspawn Hellcaller - Set Phase 1 when Mana is above 30% (Phase 2)'),
+(@ENTRY,0,11,0,0,0,100,0,8000,14000,18000,25000,11,20754,3,0,0,0,0,2,0,0,0,0,0,0,0,'Wildspawn Hellcaller - In Combat - Cast Rain of Fire'),
+(@ENTRY,0,12,0,2,0,100,1,0,15,0,0,21,1,0,0,0,0,0,1,0,0,0,0,0,0,0,'Wildspawn Hellcaller - At 15% HP - Start Combat Movement'),
+(@ENTRY,0,13,0,2,0,100,1,0,15,0,0,25,1,0,0,0,0,0,1,0,0,0,0,0,0,0,'Wildspawn Betrayer - At 15% HP - Flee'),
+(@ENTRY,0,14,0,7,0,100,0,0,0,0,0,22,0,0,0,0,0,0,1,0,0,0,0,0,0,0,'Wildspawn Felsworn - On Evade - Set Phase to 0');
+
+-- SmartAI for Wildspawn Felsworn
+SET @ENTRY := @NPC_WILDSPAWN_FELSWORN;
+DELETE FROM `creature_ai_scripts` WHERE `creature_id`=@ENTRY;
+UPDATE `creature_template` SET `AIName`='SmartAI' WHERE `entry`=@ENTRY;
+UPDATE creature SET `MovementType`=1,`spawndist`=3 WHERE `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,1,1000,1000,1800000,1800000,11,12542,0,0,0,0,0,1,0,0,0,0,0,0,0,'Wildspawn Felsworn - Cast Chaotic Focus'),
+(@ENTRY,0,1,0,4,0,100,0,0,0,0,0,21,0,0,0,0,0,0,1,0,0,0,0,0,0,0,'Wildspawn Felsworn - On Aggro - Prevent Combat Movement'),
+(@ENTRY,0,2,3,4,0,100,0,0,0,0,0,11,15537,0,0,0,0,0,2,0,0,0,0,0,0,0,'Wildspawn Felsworn - On Aggro - Cast Shadow Bolt'),
+(@ENTRY,0,3,0,61,0,100,0,0,0,0,0,22,1,0,0,0,0,0,1,0,0,0,0,0,0,0,'Wildspawn Felsworn - On Aggro - Set Phase 1'),
+(@ENTRY,0,4,0,9,1,100,0,0,40,2400,3800,11,15537,0,0,0,0,0,2,0,0,0,0,0,0,0,'Wildspawn Felsworn - Phase 1 - Cast Shadow Bolt'),
+(@ENTRY,0,5,6,3,1,100,0,0,15,0,0,21,1,0,0,0,0,0,1,0,0,0,0,0,0,0,'Wildspawn Felsworn -In Phase 1 - Start Combat Movement'),
+(@ENTRY,0,6,0,61,1,100,0,0,0,0,0,22,1,0,0,0,0,0,1,0,0,0,0,0,0,0,'Wildspawn Felsworn - Mana at 15% (Phase 1) - Set Phase 2'),
+(@ENTRY,0,7,0,9,1,100,0,35,80,0,0,21,1,0,0,0,0,0,0,0,0,0,0,0,0,0,'Wildspawn Felsworn - At 35 Yards (Phase 1) - Start Combat Movement'),
+(@ENTRY,0,8,0,9,1,100,0,5,15,0,0,21,0,0,0,0,0,0,1,0,0,0,0,0,0,0,'Wildspawn Felsworn - at 15 Yards (Phase 1) - Prevent Combat Movement '),
+(@ENTRY,0,9,0,9,1,100,0,0,5,0,0,21,1,0,0,0,0,0,1,0,0,0,0,0,0,0,'Wildspawn Felsworn - Below 5 Yards (Phase 1) - Start Combat Movement'),
+(@ENTRY,0,10,0,3,2,100,0,0,30,100,100,22,1,0,0,0,0,0,1,0,0,0,0,0,0,0,'Wildspawn Felsworn - Mana is above 30% (Phase 2) - Set Phase 1'),
+(@ENTRY,0,11,0,0,0,100,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'Wildspawn Felsworn - Set Phase 1 when Mana is above 30% (Phase 2)'),
+(@ENTRY,0,12,0,0,0,100,0,7000,12000,38000,45000,11,22417,1,0,0,0,0,1,0,0,0,0,0,0,0,'Wildspawn Felsworn - In Phase 1 - Cast Shadow Shield'),
+(@ENTRY,0,13,0,0,1,100,0,11000,17000,23000,30000,11,15654,0,0,0,0,0,2,0,0,0,0,0,0,0,'Wildspawn Felsworn - In Phase 1 - Cast Shadow Word: Pain'),
+(@ENTRY,0,14,0,0,0,100,0,6000,10000,10000,15000,11,12542,1,0,0,0,0,5,0,0,0,0,0,0,0,'Wildspawn Felsworn - In Combat - Cast Fear (on random target)'),
+(@ENTRY,0,15,0,7,0,100,0,0,0,0,0,22,0,0,0,0,0,0,1,0,0,0,0,0,0,0,'Wildspawn Felsworn - On Evade - Set Phase to 0');
+
+-- add movement
+SET @ENTRY := 56992; -- single Wildspawn Felsworn instance
+UPDATE creature SET `MovementType`=2 WHERE `guid`=@ENTRY;
+DELETE FROM `creature_addon` WHERE `guid`=@ENTRY;
+INSERT INTO `creature_addon`(`guid`,`path_id`) VALUES
+(@ENTRY,@ENTRY*10);
+
+-- Add waypoints to Wildspawn Felsworn instance
+DELETE FROM `waypoint_data` WHERE `id`=@ENTRY*10;
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`delay`,`move_flag`,`action`,`action_chance`,`wpguid`) VALUES
+(@ENTRY*10,1,57.4000,-737.329,-25.1524,0,0,0,100,0),
+(@ENTRY*10,2,26.45,-682.69,-24.98,0,0,0,100,0);
+
+-- Smart AI for Wildspawn Shadowstalker
+SET @ENTRY := @NPC_WILDSPAWN_SHADOWSTALKER;
+DELETE FROM `creature_ai_scripts` WHERE `creature_id`=@ENTRY;
+UPDATE `creature_template` SET `AIName`='SmartAI' WHERE `entry`=@ENTRY;
+UPDATE creature SET `MovementType`=1,`spawndist`=3 WHERE `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,0,0,0,0,0,11,22766,0,0,0,0,0,1,0,0,0,0,0,0,0,'Wildspawn Shadowstalker - On Spawn - cast Sneak on self'),
+(@ENTRY,0,1,0,0,0,100,0,4000,8000,5000,8000,11,22416,0,0,0,0,0,2,0,0,0,0,0,0,0,'Wildspawn Shadowstalker - In Combat - Cast Backstab'),
+(@ENTRY,0,2,0,0,0,100,0,6000,7000,8000,9000,11,7992,0,0,0,0,0,2,0,0,0,0,0,0,0,'Wildspawn Shadowstalker - In Combat - Cast Slowing Posion');
diff --git a/sql/updates/world/2012_01_03_07_world_creature.sql b/sql/updates/world/2012_01_03_07_world_creature.sql
new file mode 100644
index 00000000000..5098901b564
--- /dev/null
+++ b/sql/updates/world/2012_01_03_07_world_creature.sql
@@ -0,0 +1,46 @@
+-- Spawn & Pathing for Horace Alder Entry: 27704 "Not Spawned"
+SET @NPC := 1846;
+DELETE FROM `creature` WHERE `guid` IN (@NPC);
+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
+(@NPC,27704,1,1,1,0,0,-3738.565,-4442.265,56.23981,0.41887,300,0,0,1,0,2);
+SET @PATH := @NPC * 10;
+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,-3740.015,-4437.762,56.23981,0,0,0,0,100,0),
+(@PATH,2,-3742.823,-4433.892,56.23981,0,0,0,0,100,0),
+(@PATH,3,-3746.757,-4431.049,56.23981,0,0,0,0,100,0),
+(@PATH,4,-3751.263,-4429.58,56.23981,0,0,0,0,100,0),
+(@PATH,5,-3756.035,-4429.627,56.23981,0,0,0,0,100,0),
+(@PATH,6,-3760.625,-4431.113,56.23981,0,0,0,0,100,0),
+(@PATH,7,-3764.42,-4433.888,56.22611,0,0,0,0,100,0),
+(@PATH,8,-3767.252,-4437.716,56.23981,0,0,0,0,100,0),
+(@PATH,9,-3768.719,-4442.307,56.23982,0,0,0,0,100,0),
+(@PATH,10,-3768.664,-4447.081,56.22474,0,0,0,0,100,0),
+(@PATH,11,-3767.221,-4451.627,56.23982,0,0,0,0,100,0),
+(@PATH,12,-3764.422,-4455.48,56.23981,0,0,0,0,100,0),
+(@PATH,13,-3767.221,-4451.627,56.23982,0,0,0,0,100,0),
+(@PATH,14,-3768.664,-4447.081,56.22474,0,0,0,0,100,0),
+(@PATH,15,-3768.719,-4442.307,56.23982,0,0,0,0,100,0),
+(@PATH,16,-3767.255,-4437.724,56.20177,0,0,0,0,100,0),
+(@PATH,17,-3764.42,-4433.888,56.22611,0,0,0,0,100,0),
+(@PATH,18,-3760.625,-4431.113,56.23981,0,0,0,0,100,0),
+(@PATH,19,-3756.035,-4429.627,56.23981,0,0,0,0,100,0),
+(@PATH,20,-3751.263,-4429.58,56.23981,0,0,0,0,100,0),
+(@PATH,21,-3746.757,-4431.049,56.23981,0,0,0,0,100,0),
+(@PATH,22,-3742.823,-4433.892,56.23981,0,0,0,0,100,0),
+(@PATH,23,-3740.015,-4437.762,56.23981,0,0,0,0,100,0),
+(@PATH,24,-3738.565,-4442.265,56.23981,0,0,0,0,100,0),
+(@PATH,25,-3738.577,-4447.063,56.23981,0,0,0,0,100,0),
+(@PATH,26,-3740.03,-4451.584,56.23981,0,0,0,0,100,0),
+(@PATH,27,-3742.872,-4455.448,56.23981,0,0,0,0,100,0),
+(@PATH,28,-3746.699,-4458.252,56.23982,0,0,0,0,100,0),
+(@PATH,29,-3751.217,-4459.749,56.26265,0,0,0,0,100,0),
+(@PATH,30,-3756.021,-4459.732,56.23981,0,0,0,0,100,0),
+(@PATH,31,-3751.217,-4459.749,56.26265,0,0,0,0,100,0),
+(@PATH,32,-3746.699,-4458.252,56.23982,0,0,0,0,100,0),
+(@PATH,33,-3742.872,-4455.448,56.23981,0,0,0,0,100,0),
+(@PATH,34,-3740.03,-4451.584,56.23981,0,0,0,0,100,0),
+(@PATH,35,-3738.577,-4447.063,56.23981,0,0,0,0,100,0),
+(@PATH,36,-3738.565,-4442.265,56.23981,0,0,0,0,100,0);
diff --git a/sql/updates/world/2012_01_04_00_world_gossip_menu.sql b/sql/updates/world/2012_01_04_00_world_gossip_menu.sql
new file mode 100644
index 00000000000..cf11ba74eb2
--- /dev/null
+++ b/sql/updates/world/2012_01_04_00_world_gossip_menu.sql
@@ -0,0 +1,70 @@
+-- Update npc_text from sniff
+UPDATE `npc_text` SET `prob0`=1,`text0_0`='I wandered for the rest of my natural life in search of knowledge, seeing more wonder and meeting more strange and mysterious races than any of my people before me. I travelled across the length and breadth of ancient Kalimdor until there was no more to see, no new lands across the horizon.$B$BYet... there was still so much I did not know as I felt my final journey approaching and I wept for the things I would never know.$B$BAs I fell, my life at an end, that is when they found me.',`WDBVerified`=14545 WHERE `ID`=14121;
+UPDATE `npc_text` SET `prob0`=1,`text0_0`='The bronze dragonflight. They snatched me from the brink of death and took me before their master, Nozdormu. He said they had been watching me and wanted me to continue my hunt. He granted me immortality as a watcher, tasked to bear witness to the history of Azeroth as one of his agents.$B$BI am Xarantaur the Witness, and it is my duty to preserve the true history of Azeroth lest it be forgotten.',`WDBVerified`=14545 WHERE `ID`=14122;
+
+-- Gossip Menu insert from sniff
+DELETE FROM `gossip_menu` WHERE `entry`=10217 AND `text_id`=14204;
+INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (10217,14204);
+DELETE FROM `gossip_menu` WHERE `entry`=10174 AND `text_id`=14118;
+INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (10174,14118);
+
+-- Creature Gossip_menu_id Update from sniff
+UPDATE `creature_template` SET `gossip_menu_id`=10217 WHERE `entry`=30824;
+UPDATE `creature_template` SET `gossip_menu_id`=10038 WHERE `entry`=31261;
+UPDATE `creature_template` SET `gossip_menu_id`=10174 WHERE `entry`=30825;
+
+-- Creature Gossip_menu_option Update from sniff
+DELETE FROM `gossip_menu_option` WHERE `menu_id` IN (10026,10174) AND `id` IN (0);
+INSERT INTO `gossip_menu_option` (`menu_id`,`id`,`option_icon`,`option_text`,`option_id`,`npc_option_npcflag`,`action_menu_id`,`action_poi_id`,`box_coded`,`box_money`,`box_text`) VALUES
+(10026,0,0, 'Take me to the ship.',1,1,0,0,0,0, ''),
+(10174,0,1, 'I want to browse your goods.',3,128,0,0,0,0, '');
+
+-- Gossip Menu insert from sniff
+DELETE FROM `gossip_menu` WHERE `entry`=9806 AND `text_id`=13525;
+INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (9806,13525);
+DELETE FROM `gossip_menu` WHERE `entry`=9807 AND `text_id`=13526;
+INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (9807,13526);
+DELETE FROM `gossip_menu` WHERE `entry`=9808 AND `text_id`=13527;
+INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (9808,13527);
+DELETE FROM `gossip_menu` WHERE `entry`=9809 AND `text_id`=13528;
+INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (9809,13528);
+DELETE FROM `gossip_menu` WHERE `entry`=9810 AND `text_id`=13529;
+INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (9810,13529);
+DELETE FROM `gossip_menu` WHERE `entry`=9811 AND `text_id`=13530;
+INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (9811,13530);
+DELETE FROM `gossip_menu` WHERE `entry`=9812 AND `text_id`=13531;
+INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (9812,13531);
+DELETE FROM `gossip_menu` WHERE `entry`=9813 AND `text_id`=13534;
+INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (9813,13534);
+
+-- Creature Gossip_menu_id Update from sniff
+UPDATE `creature_template` SET `gossip_menu_id`=9806 WHERE `entry`=29344;
+UPDATE `creature_template` SET `gossip_menu_id`=9813 WHERE `entry`=29396;
+
+-- Creature Gossip_menu_option Update from sniff
+DELETE FROM `gossip_menu_option` WHERE `menu_id` IN (9806,9807,9808,9809,9810,9811,9812) AND `id` IN (0);
+DELETE FROM `gossip_menu_option` WHERE `menu_id` IN (9808,9809,9810,9811,9812) AND `id` IN (1);
+INSERT INTO `gossip_menu_option` (`menu_id`,`id`,`option_icon`,`option_text`,`option_id`,`npc_option_npcflag`,`action_menu_id`,`action_poi_id`,`box_coded`,`box_money`,`box_text`) VALUES
+(9806,0,0, 'Lord-Commander, I would hear your tale.',1,1,9807,0,0,0, ''),
+(9807,0,0, '<You nod slightly but do not complete the motion as the lord-commander narrows his eyes before he continues.>',1,1,9808,0,0,0, ''),
+(9808,0,0, 'I thought that they now called themselves the Scarlet Onslaught?',1,1,9809,0,0,0, ''),
+(9808,1,0, 'Lord-Commander, would you repeat what you said before?',1,1,9807,0,0,0, ''),
+(9809,0,0, 'Where did the grand admiral go?',1,1,9810,0,0,0, ''),
+(9809,1,0, 'Lord-Commander, would you repeat what you said before?',1,1,9808,0,0,0, ''),
+(9810,0,0, 'That''s fine. When do I start?',1,1,9811,0,0,0, ''),
+(9810,1,0, 'Lord-Commander, would you repeat what you said before?',1,1,9809,0,0,0, ''),
+(9811,0,0, 'Let''s finish this!',1,1,9812,0,0,0, ''),
+(9811,1,0, 'Lord-Commander, would you repeat what you said before?',1,1,9810,0,0,0, ''),
+(9812,0,0, 'That''s quite a tale, lord-commander.',1,1,0,0,0,0, ''),
+(9812,1,0, 'Lord-Commander, would you repeat what you said before?',1,1,9811,0,0,0, '');
+
+-- Gossip Menu insert from sniff
+DELETE FROM `gossip_menu` WHERE `entry`=9168 AND `text_id`=12427;
+INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (9168,12427);
+DELETE FROM `gossip_menu` WHERE `entry`=9184 AND `text_id`=12472;
+INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (9184,12472);
+
+-- Creature Gossip_menu_id Update from sniff
+UPDATE `creature_template` SET `gossip_menu_id`=9168 WHERE `entry`=25504;
+UPDATE `creature_template` SET `gossip_menu_id`=9184 WHERE `entry`=25379;
+UPDATE `creature_template` SET `gossip_menu_id`=348 WHERE `entry`=25278;
diff --git a/sql/updates/world/2012_01_04_01_world_game_event_seasonal_questrelation.sql b/sql/updates/world/2012_01_04_01_world_game_event_seasonal_questrelation.sql
new file mode 100644
index 00000000000..9746a358e8a
--- /dev/null
+++ b/sql/updates/world/2012_01_04_01_world_game_event_seasonal_questrelation.sql
@@ -0,0 +1,386 @@
+DROP TABLE IF EXISTS `game_event_seasonal_questrelation`;
+CREATE TABLE `game_event_seasonal_questrelation` (
+ `quest` mediumint(10) unsigned NOT NULL DEFAULT '0' COMMENT 'Global Unique Identifier',
+ `event` mediumint(10) NOT NULL DEFAULT '0' COMMENT 'Quest Identifier',
+ PRIMARY KEY (`quest`,`event`),
+ KEY `idx_quest` (`quest`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='Player System';
+
+INSERT INTO `game_event_seasonal_questrelation` (`quest`,`event`) VALUES
+ (1657, 12),
+ (1658, 12),
+ (6961, 2),
+ (6962, 2),
+ (6963, 2),
+ (6964, 2),
+ (6983, 3),
+ (6984, 3),
+ (7021, 2),
+ (7022, 2),
+ (7023, 2),
+ (7024, 2),
+ (7025, 2),
+ (7042, 2),
+ (7043, 2),
+ (7045, 2),
+ (7061, 2),
+ (7062, 2),
+ (7063, 2),
+ (8149, 11),
+ (8150, 11),
+ (8311, 12),
+ (8312, 12),
+ (8322, 12),
+ (8353, 12),
+ (8354, 12),
+ (8355, 12),
+ (8356, 12),
+ (8357, 12),
+ (8358, 12),
+ (8359, 12),
+ (8360, 12),
+ (8373, 12),
+ (8409, 12),
+ (8744, 52),
+ (8746, 2),
+ (8762, 2),
+ (8763, 2),
+ (8767, 52),
+ (8768, 52),
+ (8769, 52),
+ (8788, 52),
+ (8799, 2),
+ (8803, 52),
+ (8827, 2),
+ (8828, 2),
+ (8860, 6),
+ (8861, 6),
+ (8868, 7),
+ (8897, 8),
+ (8898, 8),
+ (8899, 8),
+ (8900, 8),
+ (8901, 8),
+ (8902, 8),
+ (8903, 8),
+ (8904, 8),
+ (8971, -1),
+ (8972, -1),
+ (8973, -1),
+ (8974, -1),
+ (8975, -1),
+ (8976, -1),
+ (8979, 8),
+ (8980, 8),
+ (8981, 8),
+ (8982, 8),
+ (8983, 8),
+ (8984, 8),
+ (8993, 8),
+ (9024, 8),
+ (9025, 8),
+ (9026, 8),
+ (9027, 8),
+ (9028, 8),
+ (11131, 12),
+ (11135, 12),
+ (11219, 12),
+ (11220, 12),
+ (11242, 12),
+ (11356, 12),
+ (11357, 12),
+ (11360, 12),
+ (11361, 12),
+ (11392, 12),
+ (11401, 12),
+ (11403, 12),
+ (11404, 12),
+ (11405, 12),
+ (11435, 12),
+ (11439, 12),
+ (11440, 12),
+ (11449, 12),
+ (11450, 12),
+ (11528, 52),
+ (11558, 8),
+ (11580, 1),
+ (11581, 1),
+ (11583, 1),
+ (11584, 1),
+ (11696, 1),
+ (11732, 1),
+ (11734, 1),
+ (11735, 1),
+ (11736, 1),
+ (11737, 1),
+ (11738, 1),
+ (11739, 1),
+ (11740, 1),
+ (11741, 1),
+ (11742, 1),
+ (11743, 1),
+ (11744, 1),
+ (11745, 1),
+ (11746, 1),
+ (11747, 1),
+ (11748, 1),
+ (11749, 1),
+ (11750, 1),
+ (11751, 1),
+ (11752, 1),
+ (11753, 1),
+ (11754, 1),
+ (11755, 1),
+ (11756, 1),
+ (11757, 1),
+ (11758, 1),
+ (11759, 1),
+ (11760, 1),
+ (11761, 1),
+ (11762, 1),
+ (11763, 1),
+ (11764, 1),
+ (11765, 1),
+ (11766, 1),
+ (11767, 1),
+ (11768, 1),
+ (11769, 1),
+ (11770, 1),
+ (11771, 1),
+ (11772, 1),
+ (11773, 1),
+ (11774, 1),
+ (11775, 1),
+ (11776, 1),
+ (11777, 1),
+ (11778, 1),
+ (11779, 1),
+ (11780, 1),
+ (11781, 1),
+ (11782, 1),
+ (11783, 1),
+ (11784, 1),
+ (11785, 1),
+ (11786, 1),
+ (11787, 1),
+ (11799, 1),
+ (11800, 1),
+ (11801, 1),
+ (11802, 1),
+ (11803, 1),
+ (11804, 1),
+ (11805, 1),
+ (11806, 1),
+ (11807, 1),
+ (11808, 1),
+ (11809, 1),
+ (11810, 1),
+ (11811, 1),
+ (11812, 1),
+ (11813, 1),
+ (11814, 1),
+ (11815, 1),
+ (11816, 1),
+ (11817, 1),
+ (11818, 1),
+ (11819, 1),
+ (11820, 1),
+ (11821, 1),
+ (11822, 1),
+ (11823, 1),
+ (11824, 1),
+ (11825, 1),
+ (11826, 1),
+ (11827, 1),
+ (11828, 1),
+ (11829, 1),
+ (11830, 1),
+ (11831, 1),
+ (11832, 1),
+ (11833, 1),
+ (11834, 1),
+ (11835, 1),
+ (11836, 1),
+ (11837, 1),
+ (11838, 1),
+ (11839, 1),
+ (11840, 1),
+ (11841, 1),
+ (11842, 1),
+ (11843, 1),
+ (11844, 1),
+ (11845, 1),
+ (11846, 1),
+ (11847, 1),
+ (11848, 1),
+ (11849, 1),
+ (11850, 1),
+ (11851, 1),
+ (11852, 1),
+ (11853, 1),
+ (11854, 1),
+ (11855, 1),
+ (11856, 1),
+ (11857, 1),
+ (11858, 1),
+ (11859, 1),
+ (11860, 1),
+ (11861, 1),
+ (11862, 1),
+ (11863, 1),
+ (11937, 1),
+ (11976, 1),
+ (12133, 12),
+ (12135, 12),
+ (12139, 12),
+ (12155, 12),
+ (12286, -1),
+ (12313, 24),
+ (12331, 12),
+ (12332, 12),
+ (12333, 12),
+ (12334, 12),
+ (12335, 12),
+ (12336, 12),
+ (12337, 12),
+ (12338, 12),
+ (12339, 12),
+ (12340, 12),
+ (12341, 12),
+ (12342, 12),
+ (12343, 12),
+ (12344, 12),
+ (12345, 12),
+ (12346, 12),
+ (12347, 12),
+ (12348, 12),
+ (12349, 12),
+ (12350, 12),
+ (12351, 12),
+ (12352, 12),
+ (12353, 12),
+ (12354, 12),
+ (12355, 12),
+ (12356, 12),
+ (12357, 12),
+ (12358, 12),
+ (12359, 12),
+ (12360, 12),
+ (12361, 12),
+ (12362, 12),
+ (12363, 12),
+ (12364, 12),
+ (12365, 12),
+ (12366, 12),
+ (12367, 12),
+ (12368, 12),
+ (12369, 12),
+ (12370, 12),
+ (12371, 12),
+ (12373, 12),
+ (12374, 12),
+ (12375, 12),
+ (12376, 12),
+ (12377, 12),
+ (12378, 12),
+ (12379, 12),
+ (12380, 12),
+ (12381, 12),
+ (12382, 12),
+ (12383, 12),
+ (12384, 12),
+ (12385, 12),
+ (12386, 12),
+ (12387, 12),
+ (12388, 12),
+ (12389, 12),
+ (12390, 12),
+ (12391, 12),
+ (12392, 12),
+ (12393, 12),
+ (12394, 12),
+ (12395, 12),
+ (12396, 12),
+ (12397, 12),
+ (12398, 12),
+ (12399, 12),
+ (12400, 12),
+ (12401, 12),
+ (12402, 12),
+ (12403, 12),
+ (12404, 12),
+ (12405, 12),
+ (12406, 12),
+ (12407, 12),
+ (12408, 12),
+ (12409, 12),
+ (12410, 12),
+ (12940, 12),
+ (12941, 12),
+ (12944, 12),
+ (12945, 12),
+ (12946, 12),
+ (12947, 12),
+ (12950, 12),
+ (13203, 52),
+ (13433, 12),
+ (13434, 12),
+ (13435, 12),
+ (13436, 12),
+ (13437, 12),
+ (13438, 12),
+ (13439, 12),
+ (13440, 12),
+ (13441, 12),
+ (13442, 12),
+ (13443, 12),
+ (13444, 12),
+ (13445, 12),
+ (13446, 12),
+ (13447, 12),
+ (13448, 12),
+ (13449, 12),
+ (13450, 12),
+ (13451, 12),
+ (13452, 12),
+ (13453, 12),
+ (13454, 12),
+ (13455, 12),
+ (13456, 12),
+ (13457, 12),
+ (13458, 12),
+ (13459, 12),
+ (13460, 12),
+ (13461, 12),
+ (13462, 12),
+ (13463, 12),
+ (13464, 12),
+ (13465, 12),
+ (13466, 12),
+ (13467, 12),
+ (13468, 12),
+ (13469, 12),
+ (13470, 12),
+ (13471, 12),
+ (13472, 12),
+ (13473, 12),
+ (13474, 12),
+ (13485, 1),
+ (13486, 1),
+ (13487, 1),
+ (13488, 1),
+ (13489, 1),
+ (13490, 1),
+ (13491, 1),
+ (13492, 1),
+ (13493, 1),
+ (13494, 1),
+ (13495, 1),
+ (13496, 1),
+ (13497, 1),
+ (13498, 1),
+ (13499, 1),
+ (13500, 1),
+ (13501, 12),
+ (13548, 12),
+ (13966, 52);
diff --git a/sql/updates/world/2012_01_04_02_world_achievements.sql b/sql/updates/world/2012_01_04_02_world_achievements.sql
new file mode 100644
index 00000000000..cbd5efa3cd6
--- /dev/null
+++ b/sql/updates/world/2012_01_04_02_world_achievements.sql
@@ -0,0 +1,29 @@
+-- The Undying
+DELETE FROM `disables` WHERE `sourceType` = 4 AND `entry` IN (13237, 13238, 13239, 13240, 7617); -- Enable criteria
+DELETE FROM `achievement_criteria_data` WHERE `criteria_id` IN (13237, 13238, 13239, 13240, 7617); -- Enable instance script execution for achievement criteria
+INSERT INTO `achievement_criteria_data` VALUES
+(13237, 12, 0, 0, ''),
+(13237, 18, 0, 0, ''),
+(13238, 12, 0, 0, ''),
+(13238, 18, 0, 0, ''),
+(13239, 12, 0, 0, ''),
+(13239, 18, 0, 0, ''),
+(13240, 12, 0, 0, ''),
+(13240, 18, 0, 0, ''),
+(7617, 12, 0, 0, ''),
+(7617, 18, 0, 0, '');
+
+-- The Immortal
+DELETE FROM `disables` WHERE `sourceType` = 4 AND `entry` IN (13233, 13234, 13235, 13236, 7616); -- Enable criteria
+DELETE FROM `achievement_criteria_data` WHERE `criteria_id` IN (13233, 13234, 13235, 13236, 7616); -- Enable instance script execution for achievement criteria
+INSERT INTO `achievement_criteria_data` VALUES
+(13233, 12, 1, 0, ''),
+(13233, 18, 0, 0, ''),
+(13234, 12, 1, 0, ''),
+(13234, 18, 0, 0, ''),
+(13235, 12, 1, 0, ''),
+(13235, 18, 0, 0, ''),
+(13236, 12, 1, 0, ''),
+(13236, 18, 0, 0, ''),
+(7616, 12, 1, 0, ''),
+(7616, 18, 0, 0, '');
diff --git a/sql/updates/world/2012_01_04_02_world_sai.sql b/sql/updates/world/2012_01_04_02_world_sai.sql
new file mode 100644
index 00000000000..70cb3fc9a04
--- /dev/null
+++ b/sql/updates/world/2012_01_04_02_world_sai.sql
@@ -0,0 +1,177 @@
+-- spawns for the first part of DM East, along Pusillins path (will make things a bit more fun ;-) )
+
+SET @NPC_WILDSPAWN_SATYR = 11451;
+SET @NPC_WILDSPAWN_ROGUE := 11452;
+SET @NPC_WILDSPAWN_BETRAYER := 11454;
+SET @NPC_WILDSPAWN_FELSWORN := 11455;
+SET @NPC_WILDSPAWN_SHADOWSTALKER := 11456;
+SET @NPC_WILDSPAWN_HELLCALLER := 11457;
+SET @NPC_WARPWOOD_TREANT = 11462;
+SET @NPC_WARPWOOD_CRUSHER := 13021;
+SET @NPC_WHIP_LASHER := 13022;
+SET @NPC_PHASE_LASHER := 13196;
+SET @NPC_FEL_LASH := 13197;
+
+-- SmartAI for Warpwood Treant
+SET @ENTRY := @NPC_WARPWOOD_TREANT;
+DELETE FROM `creature_ai_scripts` WHERE `creature_id`=@ENTRY;
+UPDATE `creature_template` SET `AIName`='SmartAI' WHERE `entry`=@ENTRY;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0;
+INSERT INTO `smart_scripts` (`entryorguid`,`source_type`,`id`,`link`,`event_type`,`event_phase_mask`,`event_chance`,`event_flags`,`event_param1`,`event_param2`,`event_param3`,`event_param4`,`action_type`,`action_param1`,`action_param2`,`action_param3`,`action_param4`,`action_param5`,`action_param6`,`target_type`,`target_param1`,`target_param2`,`target_param3`,`target_x`,`target_y`,`target_z`,`target_o`,`comment`) VALUES
+(@ENTRY,0,0,0,0,0,100,0,3000,5000,5000,7000,11,18368,0,0,0,0,0,2,0,0,0,0,0,0,0,'Warpwood Treant - In Combat - Cast Strike'),
+(@ENTRY,0,1,0,0,0,100,0,7000,9000,18000,22000,11,14331,0,0,0,0,0,2,0,0,0,0,0,0,0,'Warpwood Treant - In Combat - Cast Vicious Rend'),
+(@ENTRY,0,2,0,0,0,100,0,10000,12000,9000,14000,11,11428,0,0,0,0,0,2,0,0,0,0,0,0,0,'Warpwood Treant - In Combat - Cast Knockdown');
+
+-- SmartAI for Warpwood Crusher
+SET @ENTRY := @NPC_WARPWOOD_CRUSHER;
+DELETE FROM `creature_ai_scripts` WHERE `creature_id`=@ENTRY;
+UPDATE `creature_template` SET `AIName`='SmartAI' WHERE `entry`=@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,0,0,0,0,0,100,0,3000,7000,8000,12000,11,22426,0,0,0,0,0,2,0,0,0,0,0,0,0,'Warpwood Crusher - In Combat - Cast Crush Armor');
+
+-- SmartAI for Whip Lasher
+SET @ENTRY := @NPC_WHIP_LASHER;
+DELETE FROM `creature_ai_scripts` WHERE `creature_id`=@ENTRY;
+UPDATE `creature_template` SET `AIName`='SmartAI' WHERE `entry`=@ENTRY;
+UPDATE creature SET `MovementType`=1,`spawndist`=15 WHERE `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,0,0,0,0,0,100,0,2000,5000,7000,9000,11,21987,0,0,0,0,0,2,0,0,0,0,0,0,0,'Whip Lasher - In Combat - Cast Lash of Pain');
+
+-- Fel Lash
+SET @ENTRY := @NPC_FEL_LASH;
+DELETE FROM `creature_ai_scripts` WHERE `creature_id`=@ENTRY;
+UPDATE `creature_template` SET `AIName`='SmartAI' WHERE `entry`=@ENTRY;
+UPDATE creature SET `MovementType`=1,`spawndist`=15 WHERE `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,0,0,0,4,0,100,0,0,0,0,0,21,0,0,0,0,0,0,1,0,0,0,0,0,0,0,'Fel Lash - On Aggro - Prevent Combat Movement'),
+(@ENTRY,0,1,2,4,0,100,0,0,0,0,0,11,15230,0,0,0,0,0,2,0,0,0,0,0,0,0,'Fel Lash - On Aggro - Cast Arcane Bolt'),
+(@ENTRY,0,2,0,61,0,100,0,0,0,0,0,22,1,0,0,0,0,0,0,0,0,0,0,0,0,0,'Fel Lash - On Aggro - Set Phase 1'),
+(@ENTRY,0,3,0,9,1,100,0,0,40,2400,3800,11,15230,0,0,0,0,0,2,0,0,0,0,0,0,0,'Fel Lash - In Phase 1 - Cast Arcane Bolt '),
+(@ENTRY,0,4,5,3,1,100,0,0,15,0,0,21,1,0,0,0,0,0,1,0,0,0,0,0,0,0,'Fel Lash - In Phase 1 and Mana at 15% - Start Combat Movement'),
+(@ENTRY,0,5,0,61,1,100,0,0,0,0,0,22,2,0,0,0,0,0,0,0,0,0,0,0,0,0,'Fel Lash - In Phase 1 and Mana is at 15% - set Phase 2'),
+(@ENTRY,0,6,0,9,1,100,0,35,80,0,0,21,1,0,0,0,0,0,1,0,0,0,0,0,0,0,'Fel Lash - In Phase 1 - Start Combat Movement at 35 Yards'),
+(@ENTRY,0,7,0,9,1,100,0,5,15,0,0,21,0,0,0,0,0,0,1,0,0,0,0,0,0,0,'Fel Lash - In Phase 1 - Prevent Combat Movement at 15 Yards'),
+(@ENTRY,0,8,0,9,1,100,0,0,5,0,0,21,1,0,0,0,0,0,1,0,0,0,0,0,0,0,'Fel Lash - In Phase 1 - Start Combat Movement Below 5 Yards'),
+(@ENTRY,0,9,0,3,2,100,0,30,100,100,100,22,1,0,0,0,0,0,0,0,0,0,0,0,0,0,'Fel Lash - Phase 2 - Set Phase 1 when Mana is above 30%'),
+(@ENTRY,0,10,0,0,0,100,0,9000,15000,11000,16000,11,22271,1,0,0,0,0,1,0,0,0,0,0,0,0,'Fel Lash - In Combat - Cast Arcane Explosion'),
+(@ENTRY,0,11,0,7,0,100,0,0,0,0,0,22,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'Fel Lash - On Evade - Set Phase to 0');
+
+-- Phase Lasher
+SET @ENTRY := @NPC_PHASE_LASHER;
+DELETE FROM `creature_ai_scripts` WHERE `creature_id`=@ENTRY;
+UPDATE `creature_template` SET `AIName`='SmartAI' WHERE `entry`=@ENTRY;
+UPDATE creature SET `MovementType`=1,`spawndist`=15 WHERE `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,0,0,0,4,0,100,0,0,0,0,0,21,0,0,0,0,0,0,1,0,0,0,0,0,0,0,'Phase Lasher - On Aggro - Prevent Combat Movement'),
+(@ENTRY,0,1,0,4,0,100,0,0,0,0,0,22,1,0,0,0,0,0,1,0,0,0,0,0,0,0,'Phase Lasher - On Aggro - Set Phase 1'),
+(@ENTRY,0,2,0,9,1,100,0,0,30,3400,4800,11,17228,2,0,0,0,0,2,0,0,0,0,0,0,0,'Phase Lasher - On Range - Cast Shadow Bolt Volley (Phase 1)'),
+(@ENTRY,0,3,0,0,1,100,0,5000,5000,6000,6000,31,2,4,8,16,0,0,1,0,0,0,0,0,0,0,'Phase Lasher - In Phase 1 - Random Select Phase'),
+(@ENTRY,0,4,5,9,2,100,0,0,40,3400,4800,11,15285,2,0,0,0,0,2,0,0,0,0,0,0,0,'Phase Lasher - In Phase 2 - Cast Fireball Volley'),
+(@ENTRY,0,5,0,61,2,100,0,0,0,0,0,22,1,0,0,0,0,0,1,0,0,0,0,0,0,0,'Phase Lasher - In Phase 2 - Set Phase 1'),
+(@ENTRY,0,6,7,0,4,100,0,4000,8000,8000,10000,11,22519,2,0,0,0,0,2,0,0,0,0,0,0,0,'Phase Lasher - In Phase 3 - Cast Ice Nova'),
+(@ENTRY,0,7,0,61,4,100,0,0,0,0,0,22,1,0,0,0,0,0,1,0,0,0,0,0,0,0,'Phase Lasher - In Phase 3 - Set Phase 1'),
+(@ENTRY,0,8,0,0,8,100,0,4000,8000,10000,13000,11,22356,2,0,0,0,0,2,0,0,0,0,0,0,0,'Phase Lasher - In Phase 4 - Cast Slow'),
+(@ENTRY,0,9,0,61,8,100,0,0,0,0,0,22,1,0,0,0,0,0,1,0,0,0,0,0,0,0,'Phase Lasher - In Phase 4 - Set Phase 1'),
+(@ENTRY,0,10,11,0,16,100,0,4000,8000,6000,8000,11,21749,2,0,0,0,0,2,0,0,0,0,0,0,0,'Phase Lasher - In Phase 5 - Cast Thorn Volley'),
+(@ENTRY,0,11,0,61,16,100,0,0,0,0,0,22,1,0,0,0,0,0,1,0,0,0,0,0,0,0,'Phase Lasher - In Phase 5 - Set Phase 1'),
+(@ENTRY,0,12,0,7,0,100,0,0,0,0,0,22,0,0,0,0,0,0,1,0,0,0,0,0,0,0,'Phase Lasher - On Evade - Set Phase to 0'),
+(@ENTRY,0,13,0,6,0,100,0,0,0,0,0,22,0,0,0,0,0,0,1,0,0,0,0,0,0,0,'Phase Lasher - On Death - Set Phase to 0');
+
+-- SmartAI for Wildspawn Satyr
+SET @ENTRY := @NPC_WILDSPAWN_SATYR;
+DELETE FROM `creature_ai_scripts` WHERE `creature_id`=@ENTRY;
+UPDATE `creature_template` SET `AIName`='SmartAI' WHERE `entry`=@ENTRY;
+UPDATE creature SET `MovementType`=1,`spawndist`=3 WHERE `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,0,0,0,0,0,100,0,1000,3000,4000,6000,11,15580,0,0,0,0,0,2,0,0,0,0,0,0,0,'Wildspawn Satyr - In Combat - Cast Strike'),
+(@ENTRY,0,1,0,0,0,100,0,7000,9000,14000,18000,11,9080,0,0,0,0,0,2,0,0,0,0,0,0,0,'Wildspawn Satyr - In Combat - Cast Hamstring'),
+(@ENTRY,0,2,0,0,0,100,0,5000,7000,15000,25000,11,9128,0,0,0,0,0,2,0,0,0,0,0,0,0,'Wildspawn Satyr - In Combat - Cast Battle Shout'),
+(@ENTRY,0,3,0,2,0,100,1,0,30,0,0,11,8599,0,0,0,0,0,1,0,0,0,0,0,0,0,'Wildspawn Satyr - At 30% HP - Cast Enrage'),
+(@ENTRY,0,4,0,2,0,100,1,0,30,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'Wildspawn Satyr - At 30% HP - Say Line 0');
+
+-- Text for Wildspawn Satyr
+DELETE FROM `creature_text` WHERE `entry`=@ENTRY;
+INSERT INTO `creature_text` (`entry`,`groupid`,`id`,`text`,`type`,`language`,`probability`,`emote`,`duration`,`sound`,`comment`) VALUES
+(@ENTRY,0,0,'%s becomes enraged!',16,0,100,0,0,0,'Wildspawn Satyr - At 30% HP - Enraged Text');
+
+-- SmartAI for Wildspawn Rogue
+SET @ENTRY := @NPC_WILDSPAWN_ROGUE;
+DELETE FROM `creature_ai_scripts` WHERE `creature_id`=@ENTRY;
+UPDATE `creature_template` SET `AIName`='SmartAI' WHERE `entry`=@ENTRY;
+UPDATE creature SET `MovementType`=1,`spawndist`=3 WHERE `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,0,0,100,0,5000,7000,12000,16000,11,15583,0,0,0,0,0,2,0,0,0,0,0,0,0,'Wildspawn Rogue - In Combat - Cast Rupture'),
+(@ENTRY,0,1,0,0,0,100,0,11000,15000,10000,13000,11,15667,0,0,0,0,0,2,0,0,0,0,0,0,0,'Wildspawn Rogue - In Combat - Cast Sinister Strike');
+
+-- SmartAI for Wildspawn Betrayer
+SET @ENTRY := @NPC_WILDSPAWN_BETRAYER;
+DELETE FROM `creature_ai_scripts` WHERE `creature_id`=@ENTRY;
+UPDATE `creature_template` SET `AIName`='SmartAI' WHERE `entry`=@ENTRY;
+UPDATE creature SET `MovementType`=1,`spawndist`=3 WHERE `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,4,0,100,0,0,0,0,0,21,0,0,0,0,0,0,1,0,0,0,0,0,0,0,'Wildspawn Betrayer - On Spawn - Prevent Combat Movement'),
+(@ENTRY,0,1,0,61,0,100,0,0,0,0,0,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'Wildspawn Betrayer - On Spawn - Prevent Melee'),
+(@ENTRY,0,2,3,4,0,100,0,0,0,0,0,11,16100,0,0,0,0,0,2,0,0,0,0,0,0,0,'Wildspawn Betrayer - On Aggro - Cast Shoot'),
+(@ENTRY,0,3,0,61,0,100,0,0,0,0,0,22,1,0,0,0,0,0,1,0,0,0,0,0,0,0,'Wildspawn Betrayer - On Aggro - Set Phase 1'),
+(@ENTRY,0,4,5,9,1,100,0,5,30,2300,3900,11,16100,0,0,0,0,0,2,0,0,0,0,0,0,0,'Wildspawn Betrayer - In Combat (Phase 1) - 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,'Wildspawn Betrayer - In Combat (Phase 1) - Set Ranged Weapon Model'),
+(@ENTRY,0,6,7,9,1,100,1,25,80,0,0,21,1,0,0,0,0,0,0,0,0,0,0,0,0,0,'Wildspawn Betrayer - At 25 Yards (Phase 1) - Start Combat Movement'),
+(@ENTRY,0,7,0,61,1,100,1,0,0,0,0,20,1,0,0,0,0,0,2,0,0,0,0,0,0,0,'Wildspawn Betrayer - At 25 Yards (Phase 1) - Start Melee'),
+(@ENTRY,0,8,9,9,1,100,0,0,5,0,0,21,1,0,0,0,0,0,1,0,0,0,0,0,0,0,'Wildspawn Betrayer - Below 5 Yards (Phase 1) - Start 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,'Wildspawn Betrayer - Below 5 Yards (Phase 1) - Set Melee Weapon'),
+(@ENTRY,0,10,0,61,1,100,0,0,0,0,0,21,1,0,0,0,0,0,1,0,0,0,0,0,0,0,'Wildspawn Betrayer - Below 5 Yards (Phase 1) - Start Melee'),
+(@ENTRY,0,11,12,9,1,100,0,5,15,0,0,21,0,0,0,0,0,0,1,0,0,0,0,0,0,0,'Wildspawn Betrayer - At 15 Yards (Phase 1) - Prevent 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,'Wildspawn Betrayer - At 15 Yards (Phase 1) - Prevent Melee'),
+(@ENTRY,0,13,0,9,1,100,0,5,30,7800,11400,11,18649,40,0,0,0,0,2,0,0,0,0,0,0,0,'Wildspawn Betrayer - In Combat (Phase 1) - Cast Shadow Shot'),
+(@ENTRY,0,14,0,9,1,100,0,5,30,9900,13600,11,7896,40,0,0,0,0,2,0,0,0,0,0,0,0,'Wildspawn Betrayer - In Combat (Phase 1) - Cast Exploding Shot'),
+(@ENTRY,0,15,0,0,1,100,0,5000,8000,8000,11000,11,11428,0,0,0,0,0,2,0,0,0,0,0,0,0,'Wildspawn Betrayer - In Combat (Phase 1) - Cast Knockdown'),
+(@ENTRY,0,16,0,2,0,100,1,0,15,0,0,21,1,0,0,0,0,0,1,0,0,0,0,0,0,0,'Wildspawn Betrayer - At 15% HP - Start Combat Movement'),
+(@ENTRY,0,17,0,2,0,100,1,0,15,0,0,25,1,0,0,0,0,0,1,0,0,0,0,0,0,0,'Wildspawn Betrayer - At 15% HP - Flee'),
+(@ENTRY,0,18,19,7,0,100,0,0,0,0,0,22,0,0,0,0,0,0,1,0,0,0,0,0,0,0,'Wildspawn Betrayer - On Evade - Set Phase to 0'),
+(@ENTRY,0,19,0,61,0,100,0,0,0,0,0,40,1,0,0,0,0,0,1,0,0,0,0,0,0,0,'Wildspawn Betrayer - On Evade - Set Melee Weapon Model');
+
+-- SmartAI for Wildspawn Hellcaller
+SET @ENTRY := @NPC_WILDSPAWN_HELLCALLER;
+DELETE FROM `creature_ai_scripts` WHERE `creature_id`=@ENTRY;
+UPDATE `creature_template` SET `AIName`='SmartAI' WHERE `entry`=@ENTRY;
+UPDATE creature SET `MovementType`=1,`spawndist`=3 WHERE `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,4,0,100,0,0,0,0,0,21,0,0,0,0,0,0,1,0,0,0,0,0,0,0,'Wildspawn Hellcaller - On Aggro - Prevent Combat Movement'),
+(@ENTRY,0,1,2,4,0,100,0,0,0,0,0,11,15228,0,0,0,0,0,2,0,0,0,0,0,0,0,'Wildspawn Hellcaller - On Aggro - Cast Fireball '),(@ENTRY,0,2,0,61,0,100,0,0,0,0,0,22,1,0,0,0,0,0,1,0,0,0,0,0,0,0,'Wildspawn Hellcaller - On Aggro - Set Phase 1'),(@ENTRY,0,3,0,9,1,100,0,0,40,2400,3800,11,15228,0,0,0,0,0,2,0,0,0,0,0,0,0,'Wildspawn Hellcaller - Phase 1 - Cast Fireball'),
+(@ENTRY,0,4,5,3,1,100,0,0,15,0,0,21,1,0,0,0,0,0,1,0,0,0,0,0,0,0,'Wildspawn Hellcaller -In Phase 1 - Start Combat Movement'),
+(@ENTRY,0,5,0,61,1,100,0,0,0,0,0,22,1,0,0,0,0,0,1,0,0,0,0,0,0,0,'Wildspawn Hellcaller - Mana at 15% (Phase 1) - Set Phase 2'),
+(@ENTRY,0,6,0,9,1,100,0,35,80,0,0,21,1,0,0,0,0,0,0,0,0,0,0,0,0,0,'Wildspawn Hellcaller - At 35 Yards (Phase 1) - Start Combat Movement'),
+(@ENTRY,0,7,0,9,1,100,0,5,15,0,0,21,0,0,0,0,0,0,1,0,0,0,0,0,0,0,'Wildspawn Hellcaller - at 15 Yards (Phase 1) - Prevent Combat Movement '),
+(@ENTRY,0,8,0,9,1,100,0,0,5,0,0,21,1,0,0,0,0,0,1,0,0,0,0,0,0,0,'Wildspawn Hellcaller - Below 5 Yards (Phase 1) - Start Combat Movement'),
+(@ENTRY,0,9,0,3,2,100,0,0,30,100,100,22,1,0,0,0,0,0,1,0,0,0,0,0,0,0,'Wildspawn Hellcaller - Mana is above 30% (Phase 2) - Set Phase 1'),
+(@ENTRY,0,10,0,0,0,100,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'Wildspawn Hellcaller - Set Phase 1 when Mana is above 30% (Phase 2)'),
+(@ENTRY,0,11,0,0,0,100,0,8000,14000,18000,25000,11,20754,3,0,0,0,0,2,0,0,0,0,0,0,0,'Wildspawn Hellcaller - In Combat - Cast Rain of Fire'),
+(@ENTRY,0,12,0,2,0,100,1,0,15,0,0,21,1,0,0,0,0,0,1,0,0,0,0,0,0,0,'Wildspawn Hellcaller - At 15% HP - Start Combat Movement'),
+(@ENTRY,0,13,0,2,0,100,1,0,15,0,0,25,1,0,0,0,0,0,1,0,0,0,0,0,0,0,'Wildspawn Betrayer - At 15% HP - Flee'),(@ENTRY,0,14,0,7,0,100,0,0,0,0,0,22,0,0,0,0,0,0,1,0,0,0,0,0,0,0,'Wildspawn Felsworn - On Evade - Set Phase to 0');
+
+-- SmartAI for Wildspawn Felsworn
+SET @ENTRY := @NPC_WILDSPAWN_FELSWORN;
+DELETE FROM `creature_ai_scripts` WHERE `creature_id`=@ENTRY;
+UPDATE `creature_template` SET `AIName`='SmartAI' WHERE `entry`=@ENTRY;
+UPDATE creature SET `MovementType`=1,`spawndist`=3 WHERE `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,1,1000,1000,1800000,1800000,11,12542,0,0,0,0,0,1,0,0,0,0,0,0,0,'Wildspawn Felsworn - Cast Chaotic Focus'),
+(@ENTRY,0,1,0,4,0,100,0,0,0,0,0,21,0,0,0,0,0,0,1,0,0,0,0,0,0,0,'Wildspawn Felsworn - On Aggro - Prevent Combat Movement'),
+(@ENTRY,0,2,3,4,0,100,0,0,0,0,0,11,15537,0,0,0,0,0,2,0,0,0,0,0,0,0,'Wildspawn Felsworn - On Aggro - Cast Shadow Bolt'),
+(@ENTRY,0,3,0,61,0,100,0,0,0,0,0,22,1,0,0,0,0,0,1,0,0,0,0,0,0,0,'Wildspawn Felsworn - On Aggro - Set Phase 1'),(@ENTRY,0,4,0,9,1,100,0,0,40,2400,3800,11,15537,0,0,0,0,0,2,0,0,0,0,0,0,0,'Wildspawn Felsworn - Phase 1 - Cast Shadow Bolt'),
+(@ENTRY,0,5,6,3,1,100,0,0,15,0,0,21,1,0,0,0,0,0,1,0,0,0,0,0,0,0,'Wildspawn Felsworn -In Phase 1 - Start Combat Movement'),
+(@ENTRY,0,6,0,61,1,100,0,0,0,0,0,22,1,0,0,0,0,0,1,0,0,0,0,0,0,0,'Wildspawn Felsworn - Mana at 15% (Phase 1) - Set Phase 2'),
+(@ENTRY,0,7,0,9,1,100,0,35,80,0,0,21,1,0,0,0,0,0,0,0,0,0,0,0,0,0,'Wildspawn Felsworn - At 35 Yards (Phase 1) - Start Combat Movement'),
+(@ENTRY,0,8,0,9,1,100,0,5,15,0,0,21,0,0,0,0,0,0,1,0,0,0,0,0,0,0,'Wildspawn Felsworn - at 15 Yards (Phase 1) - Prevent Combat Movement '),
+(@ENTRY,0,9,0,9,1,100,0,0,5,0,0,21,1,0,0,0,0,0,1,0,0,0,0,0,0,0,'Wildspawn Felsworn - Below 5 Yards (Phase 1) - Start Combat Movement'),
+(@ENTRY,0,10,0,3,2,100,0,0,30,100,100,22,1,0,0,0,0,0,1,0,0,0,0,0,0,0,'Wildspawn Felsworn - Mana is above 30% (Phase 2) - Set Phase 1'),
+(@ENTRY,0,11,0,0,0,100,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'Wildspawn Felsworn - Set Phase 1 when Mana is above 30% (Phase 2)'),
+(@ENTRY,0,12,0,0,0,100,0,7000,12000,38000,45000,11,22417,1,0,0,0,0,1,0,0,0,0,0,0,0,'Wildspawn Felsworn - In Phase 1 - Cast Shadow Shield'),(@ENTRY,0,13,0,0,1,100,0,11000,17000,23000,30000,11,15654,0,0,0,0,0,2,0,0,0,0,0,0,0,'Wildspawn Felsworn - In Phase 1 - Cast Shadow Word: Pain'),(@ENTRY,0,14,0,0,0,100,0,6000,10000,10000,15000,11,12542,1,0,0,0,0,5,0,0,0,0,0,0,0,'Wildspawn Felsworn - In Combat - Cast Fear (on random target)'),
+(@ENTRY,0,15,0,7,0,100,0,0,0,0,0,22,0,0,0,0,0,0,1,0,0,0,0,0,0,0,'Wildspawn Felsworn - On Evade - Set Phase to 0');
diff --git a/sql/updates/world/2012_01_04_03_world_spell_script_names.sql b/sql/updates/world/2012_01_04_03_world_spell_script_names.sql
new file mode 100644
index 00000000000..f8ae3db6ad3
--- /dev/null
+++ b/sql/updates/world/2012_01_04_03_world_spell_script_names.sql
@@ -0,0 +1,2 @@
+DELETE FROM `spell_script_names` WHERE `spell_id` = 53385;
+INSERT INTO `spell_script_names` VALUES (53385, 'spell_pal_divine_storm');
diff --git a/sql/updates/world/2012_01_04_04_world_creature.sql b/sql/updates/world/2012_01_04_04_world_creature.sql
new file mode 100644
index 00000000000..58970cd03c7
--- /dev/null
+++ b/sql/updates/world/2012_01_04_04_world_creature.sql
@@ -0,0 +1,10 @@
+-- fix earlier typo in guid (recovered 1846)
+DELETE FROM `creature` WHERE `guid` = 1864;
+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
+(1864,1096,0,1,1,7197,0,-11958.5,-484.88,17.0796,5.15875,300,0,0,1160,1067,0);
+
+DELETE FROM `creature_addon` WHERE `guid`=1864;
+INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES
+(1864,0,0,0,4097,0,'');
+
+
diff --git a/sql/updates/world/2012_01_04_04_world_creature_template.sql b/sql/updates/world/2012_01_04_04_world_creature_template.sql
new file mode 100644
index 00000000000..6131c439fdb
--- /dev/null
+++ b/sql/updates/world/2012_01_04_04_world_creature_template.sql
@@ -0,0 +1,8 @@
+-- [Q] Garments of the Moon (5621) and Garments of the Light (5625)
+SET @ENTRY_SHAYA := 12429; -- Sentinel Shaya
+SET @ENTRY_DOLF := 12427; -- Mountaineer Dolf
+UPDATE `creature_template` SET `unit_flags`=`unit_flags`|8 WHERE `entry` IN (@ENTRY_SHAYA, @ENTRY_DOLF);
+
+-- [Q] Garments of Darkness (5650)
+SET @ENTRY_KEL := 12428; -- Deathguard Kel (has to be +8 so in total 36872)
+UPDATE `creature_template` SET `unit_flags`=`unit_flags`|8|4096|32768 WHERE `entry` IN (@ENTRY_KEL);
diff --git a/sql/updates/world/2012_01_04_05_world_waypoint_data.sql b/sql/updates/world/2012_01_04_05_world_waypoint_data.sql
new file mode 100644
index 00000000000..2ad787b36ca
--- /dev/null
+++ b/sql/updates/world/2012_01_04_05_world_waypoint_data.sql
@@ -0,0 +1,476 @@
+-- Some Hinterlands fixups.
+
+-- Waypoint Script guids
+SET @SCRIPTGUID := 55; -- 12 required
+
+-- Fixup Revantusk Watcher add Invisibility and Stealth Detection aura
+UPDATE creature SET `modelid`=0,`curhealth`=1 WHERE id=14730;
+UPDATE `creature_addon` SET `bytes2`=257,`auras`=18950 WHERE guid IN (SELECT guid FROM creature WHERE id=14730);
+
+-- Revantusk Drummer add emote
+DELETE FROM `creature_addon` WHERE `guid` IN (92886,92887,92888);
+DELETE FROM `creature_template_addon` WHERE `entry`=14734;
+INSERT INTO `creature_template_addon` (`entry`,`bytes2`,`emote`) VALUES (14734,1,36);
+
+-- Pathing for Smith Slagtree Entry: 14737
+SET @NPC := 92909;
+SET @PATH := @NPC * 10;
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=-589.9536,`position_y`=-4548.458,`position_z`=9.161489 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,-591.6767,-4554.789,9.161489,0,0,0,0,100,0),
+(@PATH,2,-595.7503,-4559.671,9.161489,0,6000,0,929090,100,0),
+(@PATH,3,-589.9536,-4548.458,9.161489,0,29000,0,929091,100,0);
+DELETE FROM `waypoint_scripts` WHERE `id` IN (929090,929091);
+INSERT INTO `waypoint_scripts` (`id`,`delay`,`command`,`datalong`,`datalong2`,`o`,`guid`) VALUES
+(929090,1,30,0,0,3.228859,@SCRIPTGUID),
+(929090,2,2,74,8,0,@SCRIPTGUID+1),
+(929090,5,2,74,0,0,@SCRIPTGUID+2),
+(929091,1,30,0,0,0.6108652,@SCRIPTGUID+3),
+(929091,2,15,23488,1,0,@SCRIPTGUID+4),
+(929091,5,2,83,233,0,@SCRIPTGUID+5),
+(929091,24,2,83,69,0,@SCRIPTGUID+6);
+
+-- Pathing for Mystic Yayo'jin Entry: 14739
+SET @NPC := 92911;
+SET @PATH := @NPC * 10;
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=-541.7078,`position_y`=-4608.892,`position_z`=13.12271 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,-538.0938,-4609.549,13.11275,0,500,0,0,100,0),
+(@PATH,2,-538.0938,-4609.549,13.11275,5.986479,8000,0,0,100,0),
+(@PATH,3,-539.3364,-4606.846,13.11516,0,500,0,0,100,0),
+(@PATH,4,-539.3364,-4606.846,13.11516,0.9773844,10000,0,0,100,0),
+(@PATH,5,-542.105,-4606.523,13.12286,0,500,0,0,100,0),
+(@PATH,6,-542.105,-4606.523,13.12286,1.815142,9000,0,0,100,0),
+(@PATH,7,-543.7079,-4611.147,13.15176,0,0,0,0,100,0),
+(@PATH,8,-540.0343,-4611.84,13.11918,0,0,0,0,100,0),
+(@PATH,9,-539.916,-4609.014,13.11769,0,0,0,0,100,0),
+(@PATH,10,-541.7078,-4608.892,13.12271,0,500,0,0,100,0),
+(@PATH,11,-541.7078,-4608.892,13.12271,2.86234,48000,0,929110,100,0);
+DELETE FROM `waypoint_scripts` WHERE `id`=929110;
+INSERT INTO `waypoint_scripts` (`id`,`delay`,`command`,`datalong`,`datalong2`,`guid`) VALUES
+(929110,2,2,74,1,@SCRIPTGUID+7),
+(929110,39,2,74,0,@SCRIPTGUID+8),
+(929110,41,2,83,133,@SCRIPTGUID+9);
+
+-- Pathing for Revantusk Watcher Entry: 14730
+SET @NPC := 92898;
+SET @PATH := @NPC * 10;
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=-621.9691,`position_y`=-4670.079,`position_z`=5.061154 WHERE `guid`=@NPC;
+DELETE FROM `creature_addon` WHERE `guid`=@NPC;
+INSERT INTO `creature_addon` (`guid`,`path_id`,`bytes2`,`mount`,`auras`) VALUES (@NPC,@PATH,257,0, '18950');
+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,-614.1932,-4653.834,5.040805,0,0,0,0,100,0),
+(@PATH,2,-620.4515,-4667.109,5.066647,0,0,0,0,100,0),
+(@PATH,3,-630.2896,-4686.361,5.086016,0,0,0,0,100,0),
+(@PATH,4,-644.1071,-4714.346,5.219747,0,9000,0,928980,100,0);
+DELETE FROM `waypoint_scripts` WHERE `id` IN (928980);
+INSERT INTO `waypoint_scripts` (`id`,`delay`,`command`,`datalong`,`datalong2`,`x`,`y`,`z`,`o`,`guid`) VALUES
+(928980,8,6,0,1,-621.9691,-4670.079,5.061154,1.098353,@SCRIPTGUID+10);
+
+-- Pathing for Revantusk Watcher Entry: 14730
+SET @NPC := 92899;
+SET @PATH := @NPC * 10;
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=-619.3934,`position_y`=-4664.687,`position_z`=5.057855 WHERE `guid`=@NPC;
+DELETE FROM `creature_addon` WHERE `guid`=@NPC;
+INSERT INTO `creature_addon` (`guid`,`path_id`,`bytes2`,`mount`,`auras`) VALUES (@NPC,@PATH,257,0, '18950');
+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,-615.9739,-4657.611,5.048162,0,0,0,0,100,0),
+(@PATH,2,-617.2744,-4660.37,5.053535,0,0,0,0,100,0),
+(@PATH,3,-618.5742,-4663.127,5.058907,0,0,0,0,100,0),
+(@PATH,4,-619.8167,-4665.867,5.066616,0,0,0,0,100,0),
+(@PATH,5,-621.2051,-4668.584,5.066684,0,0,0,0,100,0),
+(@PATH,6,-622.5936,-4671.301,5.066746,0,0,0,0,100,0),
+(@PATH,7,-623.9827,-4674.019,5.066799,0,0,0,0,100,0),
+(@PATH,8,-625.2844,-4676.566,5.066853,0,0,0,0,100,0),
+(@PATH,9,-626.7726,-4679.479,5.060135,0,0,0,0,100,0),
+(@PATH,10,-628.1486,-4682.171,5.07026,0,0,0,0,100,0),
+(@PATH,11,-629.5447,-4684.852,5.078729,0,0,0,0,100,0),
+(@PATH,12,-630.8968,-4687.591,5.091967,0,0,0,0,100,0),
+(@PATH,13,-632.2471,-4690.326,5.105191,0,10000,0,928990,100,0);
+DELETE FROM `waypoint_scripts` WHERE `id` IN (928990);
+INSERT INTO `waypoint_scripts` (`id`,`delay`,`command`,`datalong`,`datalong2`,`x`,`y`,`z`,`o`,`guid`) VALUES
+(928990,9,6,0,1,-619.3934,-4664.687,5.057855,1.120319,@SCRIPTGUID+11);
+
+-- Pathing for Revantusk Watcher Entry: 14730
+SET @NPC := 92946;
+SET @PATH := @NPC * 10;
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=-583.7281,`position_y`=-4567.89,`position_z`=9.120717 WHERE `guid`=@NPC;
+DELETE FROM `creature_addon` WHERE `guid`=@NPC;
+INSERT INTO `creature_addon` (`guid`,`path_id`,`bytes2`,`mount`,`auras`) VALUES (@NPC,@PATH,257,0, '18950');
+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,-576.5599,-4568.717,9.161489,0,0,0,0,100,0),
+(@PATH,2,-570.6282,-4570.051,9.286489,0,0,0,0,100,0),
+(@PATH,3,-564.2906,-4571.396,9.480314,0,0,0,0,100,0),
+(@PATH,4,-559.9419,-4573.958,9.605314,0,0,0,0,100,0),
+(@PATH,5,-554.7994,-4581.686,9.740568,0,0,0,0,100,0),
+(@PATH,6,-552.841,-4589.281,9.605314,0,0,0,0,100,0),
+(@PATH,7,-555.0905,-4596.873,9.605314,0,0,0,0,100,0),
+(@PATH,8,-555.7503,-4601.974,9.614173,0,0,0,0,100,0),
+(@PATH,9,-559.4357,-4608.517,9.739173,0,0,0,0,100,0),
+(@PATH,10,-563.2764,-4613.221,9.739173,0,0,0,0,100,0),
+(@PATH,11,-566.1555,-4615.88,9.739173,0,0,0,0,100,0),
+(@PATH,12,-566.157,-4619.973,9.739173,0,0,0,0,100,0),
+(@PATH,13,-565.7682,-4621.338,10.5361,0,0,0,0,100,0),
+(@PATH,14,-564.9091,-4624.298,12.33652,0,0,0,0,100,0),
+(@PATH,15,-564.4247,-4626.619,13.21042,0,0,0,0,100,0),
+(@PATH,16,-565.8718,-4628.861,13.21023,0,0,0,0,100,0),
+(@PATH,17,-568.9028,-4629.674,13.21105,0,0,0,0,100,0),
+(@PATH,18,-571.7204,-4630.63,14.69388,0,0,0,0,100,0),
+(@PATH,19,-576.4782,-4631.931,17.15172,0,0,0,0,100,0),
+(@PATH,20,-581.1254,-4634.227,19.03236,0,0,0,0,100,0),
+(@PATH,21,-585.7308,-4639.775,21.21893,0,0,0,0,100,0),
+(@PATH,22,-585.2182,-4645.189,22.94262,0,0,0,0,100,0),
+(@PATH,23,-582.2473,-4647.843,24.75424,0,0,0,0,100,0),
+(@PATH,24,-576.8602,-4648.417,26.25482,0,0,0,0,100,0),
+(@PATH,25,-572.6866,-4646.474,28.46729,0,0,0,0,100,0),
+(@PATH,26,-569.6187,-4644.834,30.25781,0,0,0,0,100,0),
+(@PATH,27,-565.1738,-4641.978,30.34623,0,0,0,0,100,0),
+(@PATH,28,-561.8621,-4639.479,30.34518,0,0,0,0,100,0),
+(@PATH,29,-559.1216,-4640.588,30.34381,0,0,0,0,100,0),
+(@PATH,30,-561.8621,-4639.479,30.34518,0,0,0,0,100,0),
+(@PATH,31,-568.164,-4644.291,30.34578,0,0,0,0,100,0),
+(@PATH,32,-572.6866,-4646.474,28.46729,0,0,0,0,100,0),
+(@PATH,33,-576.8602,-4648.417,26.25482,0,0,0,0,100,0),
+(@PATH,34,-582.2473,-4647.843,24.75424,0,0,0,0,100,0),
+(@PATH,35,-585.2182,-4645.189,22.94262,0,0,0,0,100,0),
+(@PATH,36,-585.7538,-4639.803,21.22803,0,0,0,0,100,0),
+(@PATH,37,-581.134,-4634.237,19.03649,0,0,0,0,100,0),
+(@PATH,38,-576.6482,-4631.978,17.23644,0,0,0,0,100,0),
+(@PATH,39,-572.6212,-4631.001,15.44738,0,0,0,0,100,0),
+(@PATH,40,-568.9028,-4629.674,13.21105,0,0,0,0,100,0),
+(@PATH,41,-565.8718,-4628.861,13.21023,0,0,0,0,100,0),
+(@PATH,42,-564.4247,-4626.619,13.21042,0,0,0,0,100,0),
+(@PATH,43,-564.7512,-4625.108,12.77208,0,0,0,0,100,0),
+(@PATH,44,-565.6238,-4622.17,11.06051,0,0,0,0,100,0),
+(@PATH,45,-566.157,-4619.973,9.739173,0,0,0,0,100,0),
+(@PATH,46,-566.1555,-4615.88,9.739173,0,0,0,0,100,0),
+(@PATH,47,-563.2764,-4613.221,9.739173,0,0,0,0,100,0),
+(@PATH,48,-559.4357,-4608.517,9.739173,0,0,0,0,100,0),
+(@PATH,49,-555.7503,-4601.974,9.614173,0,0,0,0,100,0),
+(@PATH,50,-555.0905,-4596.873,9.605314,0,0,0,0,100,0),
+(@PATH,51,-552.841,-4589.281,9.605314,0,0,0,0,100,0),
+(@PATH,52,-554.7994,-4581.686,9.740568,0,0,0,0,100,0),
+(@PATH,53,-559.9419,-4573.958,9.605314,0,0,0,0,100,0),
+(@PATH,54,-564.2906,-4571.396,9.480314,0,0,0,0,100,0),
+(@PATH,55,-570.6282,-4570.051,9.286489,0,0,0,0,100,0),
+(@PATH,56,-576.5599,-4568.717,9.161489,0,0,0,0,100,0),
+(@PATH,57,-583.7281,-4567.89,9.120717,0,0,0,0,100,0),
+(@PATH,58,-589.5422,-4571.942,9.482045,0,0,0,0,100,0),
+(@PATH,59,-595.0231,-4573.951,9.786489,0,0,0,0,100,0),
+(@PATH,60,-589.5422,-4571.942,9.482045,0,0,0,0,100,0),
+(@PATH,61,-583.7281,-4567.89,9.120717,0,0,0,0,100,0);
+
+-- Pathing for Revantusk Watcher Entry: 14730
+SET @NPC := 92903;
+SET @PATH := @NPC * 10;
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=-587.9592,`position_y`=-4565.161,`position_z`=9.161489 WHERE `guid`=@NPC;
+DELETE FROM `creature_addon` WHERE `guid`=@NPC;
+INSERT INTO `creature_addon` (`guid`,`path_id`,`bytes2`,`mount`,`auras`) VALUES (@NPC,@PATH,257,0, '18950');
+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,-589.1211,-4560.011,9.161489,0,0,0,0,100,0),
+(@PATH,2,-586.8055,-4558.024,9.161489,0,0,0,0,100,0),
+(@PATH,3,-582.1091,-4557.421,9.418232,0,0,0,0,100,0),
+(@PATH,4,-563.0848,-4567.083,9.617765,0,0,0,0,100,0),
+(@PATH,5,-564.0873,-4565.243,9.636915,0,0,0,0,100,0),
+(@PATH,6,-554.4955,-4549.669,10.38081,0,0,0,0,100,0),
+(@PATH,7,-551.9146,-4546.659,10.20161,0,0,0,0,100,0),
+(@PATH,8,-530.5864,-4534.892,10.88507,0,0,0,0,100,0),
+(@PATH,9,-528.0935,-4540.74,10.68414,0,0,0,0,100,0),
+(@PATH,10,-548.4247,-4552.033,10.33687,0,0,0,0,100,0),
+(@PATH,11,-559.3554,-4571.553,9.605396,0,0,0,0,100,0),
+(@PATH,12,-558.353,-4572.357,9.734953,0,0,0,0,100,0),
+(@PATH,13,-552.0048,-4585.105,9.830168,0,0,0,0,100,0),
+(@PATH,14,-551.9355,-4589.406,9.685699,0,0,0,0,100,0),
+(@PATH,15,-559.1077,-4612.717,9.864173,0,0,0,0,100,0),
+(@PATH,16,-563.384,-4614.937,9.739216,0,0,0,0,100,0),
+(@PATH,17,-587.5415,-4618.487,9.456761,0,0,0,0,100,0),
+(@PATH,18,-596.1833,-4629.224,9.796849,0,0,0,0,100,0),
+(@PATH,19,-601.0118,-4628.754,9.411202,0,0,0,0,100,0),
+(@PATH,20,-592.4224,-4616.147,9.359911,0,0,0,0,100,0),
+(@PATH,21,-588.6967,-4613.219,9.55808,0,0,0,0,100,0),
+(@PATH,22,-567.4048,-4614.91,9.729955,0,0,0,0,100,0),
+(@PATH,23,-566.9582,-4615.76,9.628169,0,0,0,0,100,0),
+(@PATH,24,-557.4971,-4586.748,9.730397,0,0,0,0,100,0),
+(@PATH,25,-565.1426,-4573.827,9.526945,0,0,0,0,100,0),
+(@PATH,26,-587.9592,-4565.161,9.161489,0,0,0,0,100,0);
+
+-- Pathing for Revantusk Watcher Entry: 14730
+SET @NPC := 92904;
+SET @PATH := @NPC * 10;
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=-563.7853,`position_y`=-4572.203,`position_z`=9.480314 WHERE `guid`=@NPC;
+DELETE FROM `creature_addon` WHERE `guid`=@NPC;
+INSERT INTO `creature_addon` (`guid`,`path_id`,`bytes2`,`mount`,`auras`) VALUES (@NPC,@PATH,257,0, '18950');
+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,-589.0695,-4562.6,9.161489,0,0,0,0,100,0),
+(@PATH,2,-584.3304,-4558.535,9.161489,0,0,0,0,100,0),
+(@PATH,3,-563.9773,-4568.874,9.527922,0,0,0,0,100,0),
+(@PATH,4,-551.5903,-4548.764,10.15376,0,0,0,0,100,0),
+(@PATH,5,-529.4497,-4536.548,11.02155,0,0,0,0,100,0),
+(@PATH,6,-549.9079,-4550.587,9.985304,0,0,0,0,100,0),
+(@PATH,7,-561.3011,-4570.924,9.605314,0,0,0,0,100,0),
+(@PATH,8,-553.2903,-4587.01,9.647795,0,0,0,0,100,0),
+(@PATH,9,-561.1612,-4612.59,9.864173,0,0,0,0,100,0),
+(@PATH,10,-588.2601,-4616.572,9.456761,0,0,0,0,100,0),
+(@PATH,11,-599.4961,-4630.079,9.579808,0,0,0,0,100,0),
+(@PATH,12,-589.3387,-4615.174,9.456761,0,0,0,0,100,0),
+(@PATH,13,-565.2857,-4617.084,9.739173,0,0,0,0,100,0),
+(@PATH,14,-555.2867,-4586.42,9.730314,0,0,0,0,100,0),
+(@PATH,15,-563.7853,-4572.203,9.480314,0,0,0,0,100,0);
+
+DELETE FROM `creature_formations` WHERE `leaderGUID`=92903;
+INSERT INTO `creature_formations` (`leaderGUID`,`memberGUID`,`dist`,`angle`,`groupAI`) VALUES
+(92903,92903,0,0,2),
+(92903,92904,2,300,2);
+
+-- Pathing for Vilebranch Headhunter Entry: 2641
+SET @NPC := 93747;
+SET @PATH := @NPC * 10;
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=-334.7697,`position_y`=-4118.176,`position_z`=152.1513 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,-333.2237,-4134.225,152.0622,0,0,0,0,100,0),
+(@PATH,2,-339.8373,-4147.746,152.1256,0,0,0,0,100,0),
+(@PATH,3,-346.6712,-4160.327,152.1256,0,0,0,0,100,0),
+(@PATH,4,-345.9421,-4177.107,152.2871,0,0,0,0,100,0),
+(@PATH,5,-346.2449,-4195.276,152.2244,0,0,0,0,100,0),
+(@PATH,6,-345.7937,-4206.436,152.1899,0,0,0,0,100,0),
+(@PATH,7,-341.1774,-4208.535,152.0649,0,0,0,0,100,0),
+(@PATH,8,-337.7476,-4206.129,152.1899,0,1000,0,0,100,0),
+(@PATH,9,-341.1774,-4208.535,152.0649,0,0,0,0,100,0),
+(@PATH,10,-345.7937,-4206.436,152.1899,0,0,0,0,100,0),
+(@PATH,11,-346.2449,-4195.276,152.2244,0,0,0,0,100,0),
+(@PATH,12,-345.9421,-4177.107,152.2871,0,0,0,0,100,0),
+(@PATH,13,-346.6712,-4160.327,152.1256,0,0,0,0,100,0),
+(@PATH,14,-339.8373,-4147.746,152.1256,0,0,0,0,100,0),
+(@PATH,15,-333.2237,-4134.225,152.0622,0,0,0,0,100,0),
+(@PATH,16,-334.7697,-4118.176,152.1513,0,0,0,0,100,0),
+(@PATH,17,-345.4443,-4114.745,151.9538,0,0,0,0,100,0),
+(@PATH,18,-358.0292,-4116.998,154.2687,0,0,0,0,100,0),
+(@PATH,19,-345.4443,-4114.745,151.9538,0,0,0,0,100,0),
+(@PATH,20,-334.7697,-4118.176,152.1513,0,0,0,0,100,0);
+
+-- Pathing for Vilebranch Headhunter Entry: 2641
+SET @NPC := 93634;
+SET @PATH := @NPC * 10;
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=-304.2423,`position_y`=-4087.691,`position_z`=152.2971 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,-295.6881,-4087.868,152.4837,0,0,0,0,100,0),
+(@PATH,2,-284.571,-4085.302,152.14,0,0,0,0,100,0),
+(@PATH,3,-272.7595,-4092.214,152.5167,0,0,0,0,100,0),
+(@PATH,4,-284.571,-4085.302,152.14,0,0,0,0,100,0),
+(@PATH,5,-295.6881,-4087.868,152.4837,0,0,0,0,100,0),
+(@PATH,6,-304.2423,-4087.691,152.2971,0,0,0,0,100,0),
+(@PATH,7,-314.2382,-4088.344,152.2971,0,0,0,0,100,0),
+(@PATH,8,-322.7508,-4087.331,152.5894,0,0,0,0,100,0),
+(@PATH,9,-331.1907,-4082.108,152.5066,0,0,0,0,100,0),
+(@PATH,10,-338.1729,-4086.666,153.3141,0,0,0,0,100,0),
+(@PATH,11,-342.3202,-4093.814,152.2581,0,0,0,0,100,0),
+(@PATH,12,-338.1729,-4086.666,153.3141,0,0,0,0,100,0),
+(@PATH,13,-331.1907,-4082.108,152.5066,0,0,0,0,100,0),
+(@PATH,14,-322.7508,-4087.331,152.5894,0,0,0,0,100,0),
+(@PATH,15,-314.2382,-4088.344,152.2971,0,0,0,0,100,0),
+(@PATH,16,-304.2423,-4087.691,152.2971,0,0,0,0,100,0);
+
+-- Pathing for Vilebranch Headhunter Entry: 2641
+SET @NPC := 93755;
+SET @PATH := @NPC * 10;
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=-334.7697,`position_y`=-4118.176,`position_z`=152.1513 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,-345.4443,-4114.745,151.9538,0,0,0,0,100,0),
+(@PATH,2,-334.7697,-4118.176,152.1513,0,0,0,0,100,0),
+(@PATH,3,-333.2237,-4134.225,152.0622,0,0,0,0,100,0),
+(@PATH,4,-339.8373,-4147.746,152.1256,0,0,0,0,100,0),
+(@PATH,5,-345.9421,-4177.107,152.2871,0,0,0,0,100,0),
+(@PATH,6,-346.2449,-4195.276,152.2244,0,0,0,0,100,0),
+(@PATH,7,-345.7937,-4206.436,152.1899,0,0,0,0,100,0),
+(@PATH,8,-341.1774,-4208.535,152.0649,0,0,0,0,100,0),
+(@PATH,9,-337.7476,-4206.129,152.1899,0,3000,0,0,100,0),
+(@PATH,10,-341.1774,-4208.535,152.0649,0,0,0,0,100,0),
+(@PATH,11,-345.7937,-4206.436,152.1899,0,0,0,0,100,0),
+(@PATH,12,-346.2449,-4195.276,152.2244,0,7000,0,0,100,0),
+(@PATH,13,-345.9421,-4177.107,152.2871,0,0,0,0,100,0),
+(@PATH,14,-339.8373,-4147.746,152.1256,0,0,0,0,100,0),
+(@PATH,15,-333.2237,-4134.225,152.0622,0,0,0,0,100,0),
+(@PATH,16,-334.7697,-4118.176,152.1513,0,0,0,0,100,0);
+
+-- Pathing for Green Sludge Entry: 2655
+SET @NPC := 92995;
+SET @PATH := @NPC * 10;
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=367.4861,`position_y`=-3892.534,`position_z`=103.3926 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,362.0923,-3869.861,106.0149,0,0,0,0,100,0),
+(@PATH,2,359.729,-3842.23,107.0658,0,0,0,0,100,0),
+(@PATH,3,362.0923,-3869.861,106.0149,0,0,0,0,100,0),
+(@PATH,4,367.4861,-3892.534,103.3926,0,0,0,0,100,0),
+(@PATH,5,388.8041,-3900.64,99.87824,0,0,0,0,100,0),
+(@PATH,6,399.8027,-3882.644,97.61748,0,0,0,0,100,0),
+(@PATH,7,390.798,-3860.872,95.97817,0,0,0,0,100,0),
+(@PATH,8,379.3473,-3843.385,96.72575,0,0,0,0,100,0),
+(@PATH,9,389.2842,-3825.799,98.92686,0,0,0,0,100,0),
+(@PATH,10,399.2549,-3789.222,102.3659,0,0,0,0,100,0),
+(@PATH,11,389.2842,-3825.799,98.92686,0,0,0,0,100,0),
+(@PATH,12,379.3473,-3843.385,96.72575,0,0,0,0,100,0),
+(@PATH,13,390.7259,-3860.698,95.98909,0,0,0,0,100,0),
+(@PATH,14,399.8027,-3882.644,97.61748,0,0,0,0,100,0),
+(@PATH,15,388.8041,-3900.64,99.87824,0,0,0,0,100,0),
+(@PATH,16,367.4861,-3892.534,103.3926,0,0,0,0,100,0);
+
+-- Pathing for Jade Ooze Entry: 2656
+SET @NPC := 93068;
+SET @PATH := @NPC * 10;
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=386.5382,`position_y`=-3767.701,`position_z`=103.1262 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,382.7473,-3754.237,102.4903,0,0,0,0,100,0),
+(@PATH,2,376.4646,-3738.252,105.2092,0,0,0,0,100,0),
+(@PATH,3,365.8063,-3725.304,105.9001,0,0,0,0,100,0),
+(@PATH,4,348.4052,-3720.816,105.9374,0,0,0,0,100,0),
+(@PATH,5,319.9912,-3724.497,106.8615,0,0,0,0,100,0),
+(@PATH,6,312.3986,-3744.087,106.7072,0,0,0,0,100,0),
+(@PATH,7,318.8742,-3761.253,106.802,0,0,0,0,100,0),
+(@PATH,8,343.6207,-3757.014,106.9888,0,0,0,0,100,0),
+(@PATH,9,318.8742,-3761.253,106.802,0,0,0,0,100,0),
+(@PATH,10,312.3907,-3744.138,106.7072,0,0,0,0,100,0),
+(@PATH,11,319.9912,-3724.497,106.8615,0,0,0,0,100,0),
+(@PATH,12,348.4052,-3720.816,105.9374,0,0,0,0,100,0),
+(@PATH,13,365.8063,-3725.304,105.9001,0,0,0,0,100,0),
+(@PATH,14,376.4646,-3738.252,105.2092,0,0,0,0,100,0),
+(@PATH,15,382.7473,-3754.237,102.4903,0,0,0,0,100,0),
+(@PATH,16,386.5382,-3767.701,103.1262,0,0,0,0,100,0),
+(@PATH,17,398.7607,-3775.05,102.3659,0,0,0,0,100,0),
+(@PATH,18,403.8524,-3788.918,102.2382,0,0,0,0,100,0),
+(@PATH,19,398.7607,-3775.05,102.3659,0,0,0,0,100,0),
+(@PATH,20,386.5382,-3767.701,103.1262,0,0,0,0,100,0);
+
+-- Pathing for Green Sludge Entry: 2655
+SET @NPC := 93068;
+SET @PATH := @NPC * 10;
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=353.2792,`position_y`=-3775.147,`position_z`=126.7992 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,337.8778,-3781.475,127.0284,0,0,0,0,100,0),
+(@PATH,2,348.2281,-3797.657,127.2243,0,0,0,0,100,0),
+(@PATH,3,337.8778,-3781.475,127.0284,0,0,0,0,100,0),
+(@PATH,4,353.2792,-3775.147,126.7992,0,0,0,0,100,0),
+(@PATH,5,360.8041,-3764.615,126.8099,0,0,0,0,100,0),
+(@PATH,6,384.1081,-3758.339,126.8203,0,0,0,0,100,0),
+(@PATH,7,398.6287,-3760.762,126.0662,0,0,0,0,100,0),
+(@PATH,8,421.6737,-3776.188,122.9383,0,0,0,0,100,0),
+(@PATH,9,439.5612,-3795.414,120.8122,0,0,0,0,100,0),
+(@PATH,10,416.8036,-3816.887,120.3546,0,0,0,0,100,0),
+(@PATH,11,400.8517,-3822.608,118.5542,0,0,0,0,100,0),
+(@PATH,12,381.2686,-3822.9,114.8412,0,0,0,0,100,0),
+(@PATH,13,372.0157,-3806.465,111.9946,0,0,0,0,100,0),
+(@PATH,14,363.0406,-3792.427,111.5014,0,0,0,0,100,0),
+(@PATH,15,374.681,-3774.967,106.5569,0,0,0,0,100,0),
+(@PATH,16,363.0406,-3792.427,111.5014,0,0,0,0,100,0),
+(@PATH,17,372.0157,-3806.465,111.9946,0,0,0,0,100,0),
+(@PATH,18,381.2686,-3822.9,114.8412,0,0,0,0,100,0),
+(@PATH,19,400.8517,-3822.608,118.5542,0,0,0,0,100,0),
+(@PATH,20,416.8036,-3816.887,120.3546,0,0,0,0,100,0),
+(@PATH,21,439.5612,-3795.414,120.8122,0,0,0,0,100,0),
+(@PATH,22,421.6737,-3776.188,122.9383,0,0,0,0,100,0),
+(@PATH,23,398.6287,-3760.762,126.0662,0,0,0,0,100,0),
+(@PATH,24,384.1081,-3758.339,126.8203,0,0,0,0,100,0),
+(@PATH,25,360.8041,-3764.615,126.8099,0,0,0,0,100,0),
+(@PATH,26,353.2792,-3775.147,126.7992,0,0,0,0,100,0);
+
+-- Pathing for Vilebranch Warrior Entry: 4465
+SET @NPC := 93742;
+SET @PATH := @NPC * 10;
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=-300.8814,`position_y`=-4190.363,`position_z`=136.5622 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,-299.2402,-4199.432,136.8216,0,0,0,0,100,0),
+(@PATH,2,-294.703,-4206.721,136.5972,0,0,0,0,100,0),
+(@PATH,3,-284.916,-4203.682,136.7266,0,0,0,0,100,0),
+(@PATH,4,-281.4611,-4198.692,136.5716,0,0,0,0,100,0),
+(@PATH,5,-278.4128,-4187.48,136.5716,0,0,0,0,100,0),
+(@PATH,6,-279.7527,-4179.343,136.4959,0,0,0,0,100,0),
+(@PATH,7,-282.9599,-4172.346,136.5655,0,0,0,0,100,0),
+(@PATH,8,-291.1088,-4159.861,136.5396,0,0,0,0,100,0),
+(@PATH,9,-296.5112,-4150.362,136.5396,0,0,0,0,100,0),
+(@PATH,10,-297.4698,-4136.667,136.5396,0,0,0,0,100,0),
+(@PATH,11,-296.116,-4127.808,136.4748,0,0,0,0,100,0),
+(@PATH,12,-287.9145,-4123.469,136.6125,0,0,0,0,100,0),
+(@PATH,13,-276.8211,-4123.947,137.0688,0,0,0,0,100,0),
+(@PATH,14,-268.0964,-4124.016,135.5265,0,0,0,0,100,0),
+(@PATH,15,-259.8373,-4124.032,128.8418,0,0,0,0,100,0),
+(@PATH,16,-253.119,-4123.896,124.6126,0,0,0,0,100,0),
+(@PATH,17,-245.0412,-4124.756,119.3458,0,0,0,0,100,0),
+(@PATH,18,-231.2207,-4124.845,117.8142,0,0,0,0,100,0),
+(@PATH,19,-213.4383,-4132.925,118.0337,0,0,0,0,100,0),
+(@PATH,20,-231.2207,-4124.845,117.8142,0,0,0,0,100,0),
+(@PATH,21,-245.0412,-4124.756,119.3458,0,0,0,0,100,0),
+(@PATH,22,-253.119,-4123.896,124.6126,0,0,0,0,100,0),
+(@PATH,23,-259.8373,-4124.032,128.8418,0,0,0,0,100,0),
+(@PATH,24,-268.0964,-4124.016,135.5265,0,0,0,0,100,0),
+(@PATH,25,-276.8211,-4123.947,137.0688,0,0,0,0,100,0),
+(@PATH,26,-287.9145,-4123.469,136.6125,0,0,0,0,100,0),
+(@PATH,27,-296.116,-4127.808,136.4748,0,0,0,0,100,0),
+(@PATH,28,-297.4698,-4136.667,136.5396,0,0,0,0,100,0),
+(@PATH,29,-296.5112,-4150.362,136.5396,0,0,0,0,100,0),
+(@PATH,30,-291.1088,-4159.861,136.5396,0,0,0,0,100,0),
+(@PATH,31,-282.9599,-4172.346,136.5655,0,0,0,0,100,0),
+(@PATH,32,-279.7527,-4179.343,136.4959,0,0,0,0,100,0),
+(@PATH,33,-278.4128,-4187.48,136.5716,0,0,0,0,100,0),
+(@PATH,34,-281.4611,-4198.692,136.5716,0,0,0,0,100,0),
+(@PATH,35,-284.916,-4203.682,136.7266,0,0,0,0,100,0),
+(@PATH,36,-294.703,-4206.721,136.5972,0,0,0,0,100,0),
+(@PATH,37,-299.2402,-4199.432,136.8216,0,0,0,0,100,0),
+(@PATH,38,-300.8814,-4190.363,136.5622,0,0,0,0,100,0);
+
+-- Gossip Menu insert from sniff
+DELETE FROM `gossip_menu` WHERE `entry`=6059 AND `text_id`=7211;
+INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (6059,7211);
+DELETE FROM `gossip_menu` WHERE `entry`=6087 AND `text_id`=7241;
+INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (6087,7241);
+DELETE FROM `gossip_menu` WHERE `entry`=6088 AND `text_id`=7242;
+INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (6088,7242);
+DELETE FROM `gossip_menu` WHERE `entry`=6086 AND `text_id`=7240;
+INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (6086,7240);
+
+-- Creature Gossip_menu_id Update from sniff
+UPDATE `creature_template` SET `gossip_menu_id`=6059 WHERE `entry`=14731;
+UPDATE `creature_template` SET `gossip_menu_id`=6087 WHERE `entry`=14740;
+UPDATE `creature_template` SET `gossip_menu_id`=6088 WHERE `entry`=14741;
+UPDATE `creature_template` SET `gossip_menu_id`=6086 WHERE `entry`=14739;
+
+-- Creature Gossip_menu_option Update from sniff
+DELETE FROM `gossip_menu_option` WHERE `menu_id` IN (6059,6087,6086) AND `id` IN (0);
+DELETE FROM `gossip_menu_option` WHERE `menu_id` IN (6059,6087) AND `id` IN (1);
+INSERT INTO `gossip_menu_option` (`menu_id`,`id`,`option_icon`,`option_text`,`option_id`,`npc_option_npcflag`,`action_menu_id`,`action_poi_id`,`box_coded`,`box_money`,`box_text`) VALUES
+(6059,0,5, 'Make this inn your home.',8,65536,0,0,0,0, ''),
+(6059,1,1, 'Let me browse your goods.',3,128,0,0,0,0, ''),
+(6087,0,1, 'I would like to buy from you.',3,128,0,0,0,0, ''),
+(6087,1,3, 'What can you teach me?',5,16,0,0,0,0, ''),
+(6086,0,1, 'I would like to buy from you.',3,128,0,0,0,0, '');
+
diff --git a/sql/updates/world/2012_01_04_06_world_waypoint_data.sql b/sql/updates/world/2012_01_04_06_world_waypoint_data.sql
new file mode 100644
index 00000000000..c4cefc87c63
--- /dev/null
+++ b/sql/updates/world/2012_01_04_06_world_waypoint_data.sql
@@ -0,0 +1,22 @@
+-- Pathing for King Dred Entry: 27483 "Drak'Tharon Keep"
+SET @NPC := 127507;
+SET @PATH := @NPC * 10;
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=-544.874,`position_y`=-696.9735,`position_z`=30.29507 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,-529.7952,-711.4729,30.37141,0,1000,0,0,100,0),
+(@PATH,2,-544.874,-696.9735,30.29507,0,0,0,0,100,0),
+(@PATH,3,-550.9299,-694.043,30.49649,0,0,0,0,100,0),
+(@PATH,4,-554.3631,-689.458,30.83389,0,0,0,0,100,0),
+(@PATH,5,-554.6004,-681.4241,30.67007,0,0,0,0,100,0),
+(@PATH,6,-550.1124,-674.5519,30.67007,0,0,0,0,100,0),
+(@PATH,7,-540.9714,-671.0374,30.29507,0,0,0,0,100,0),
+(@PATH,8,-535.8426,-664.3137,30.29507,0,1000,0,0,100,0),
+(@PATH,9,-540.9714,-671.0374,30.29507,0,0,0,0,100,0),
+(@PATH,10,-550.1124,-674.5519,30.67007,0,0,0,0,100,0),
+(@PATH,11,-554.6004,-681.4241,30.67007,0,0,0,0,100,0),
+(@PATH,12,-554.3631,-689.458,30.83389,0,0,0,0,100,0),
+(@PATH,13,-550.9299,-694.043,30.49649,0,0,0,0,100,0),
+(@PATH,14,-544.874,-696.9735,30.29507,0,0,0,0,100,0);
diff --git a/sql/updates/world/2012_01_04_07_world_gossip_menu.sql b/sql/updates/world/2012_01_04_07_world_gossip_menu.sql
new file mode 100644
index 00000000000..9e9bba43b1a
--- /dev/null
+++ b/sql/updates/world/2012_01_04_07_world_gossip_menu.sql
@@ -0,0 +1,17 @@
+-- Gossip Menu insert from sniff
+DELETE FROM `gossip_menu` WHERE `entry`=9918 AND `text_id`=13792;
+INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (9918,13792);
+DELETE FROM `gossip_menu` WHERE `entry`=9859 AND `text_id`=13650;
+INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (9859,13650);
+DELETE FROM `gossip_menu` WHERE `entry`=9857 AND `text_id`=13651;
+INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (9857,13651);
+-- Creature Gossip_menu_id Update from sniff
+UPDATE `creature_template` SET `gossip_menu_id`=10316 WHERE `entry`=33224;
+UPDATE `creature_template` SET `gossip_menu_id`=9918 WHERE `entry`=29430;
+UPDATE `creature_template` SET `gossip_menu_id`=9859 WHERE `entry`=29434;
+-- Creature Gossip_menu_option Update from sniff
+DELETE FROM `gossip_menu_option` WHERE `menu_id` IN (10316,9857,9917) AND `id` IN (0);
+INSERT INTO `gossip_menu_option` (`menu_id`,`id`,`option_icon`,`option_text`,`option_id`,`npc_option_npcflag`,`action_menu_id`,`action_poi_id`,`box_coded`,`box_money`,`box_text`) VALUES
+(10316,0,0, 'Glad to help, my lady. I''m told you were once the guardian of a fabled sword. Do you know where I might find it?',1,1,10315,0,0,0, ''),
+(9857,0,0, 'I''m ready - lets get you out of here.',1,1,0,0,0,0, ''),
+(9917,0,0, 'I am ready to head further into Storm Peaks.',1,1,0,0,0,0, '');
diff --git a/sql/updates/world/2012_01_04_08_world_gossip_menu.sql b/sql/updates/world/2012_01_04_08_world_gossip_menu.sql
new file mode 100644
index 00000000000..826ca19e99f
--- /dev/null
+++ b/sql/updates/world/2012_01_04_08_world_gossip_menu.sql
@@ -0,0 +1,164 @@
+-- Some Gossip updates
+UPDATE `creature_template` SET `npcflag`=`npcflag`&~1 WHERE `entry` IN (239,353,658,1215,1233,2079);
+UPDATE `creature_template` SET `gossip_menu_id`=5241 WHERE `entry` IN (22658,32099);
+UPDATE `creature_template` SET `gossip_menu_id`=5124 WHERE `entry` IN (22571,32080);
+UPDATE `creature_template` SET `gossip_menu_id`=5442 WHERE `entry` IN (22628);
+UPDATE `creature_template` SET `gossip_menu_id`=6500 WHERE `entry` IN (22656);
+UPDATE `creature_template` SET `gossip_menu_id`=7499 WHERE `entry` IN (20548);
+UPDATE `creature_template` SET `gossip_menu_id`=9695 WHERE `entry` IN (31210);
+
+-- Gossip Menu insert from sniff
+DELETE FROM `gossip_menu` WHERE `entry`=1632 AND `text_id`=2289;
+INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (1632,2289);
+DELETE FROM `gossip_menu` WHERE `entry`=4322 AND `text_id`=5494;
+INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (4322,5494);
+DELETE FROM `gossip_menu` WHERE `entry`=2801 AND `text_id`=3494;
+INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (2801,3494);
+DELETE FROM `gossip_menu` WHERE `entry`=2831 AND `text_id`=3523;
+INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (2831,3523);
+
+-- Creature Gossip_menu_id Update from sniff
+UPDATE `creature_template` SET `gossip_menu_id`=1632 WHERE `entry`=1340;
+UPDATE `creature_template` SET `gossip_menu_id`=4322 WHERE `entry`=2057;
+UPDATE `creature_template` SET `gossip_menu_id`=2801 WHERE `entry`=1154;
+UPDATE `creature_template` SET `gossip_menu_id`=2831 WHERE `entry`=1156;
+
+-- Creature Gossip_menu_option Update from sniff
+DELETE FROM `gossip_menu_option` WHERE `menu_id` IN (2831) AND `id` IN (0,1);
+INSERT INTO `gossip_menu_option` (`menu_id`,`id`,`option_icon`,`option_text`,`option_id`,`npc_option_npcflag`,`action_menu_id`,`action_poi_id`,`box_coded`,`box_money`,`box_text`) VALUES
+(2831,0,5, 'Make this inn your home.',8,65536,0,0,0,0, ''),
+(2831,1,1, 'Let me browse your goods.',3,128,0,0,0,0, '');
+
+-- Gossip Menu insert from sniff
+DELETE FROM `gossip_menu` WHERE `entry`=9838 AND `text_id`=13349;
+INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (9838,13349);
+DELETE FROM `gossip_menu` WHERE `entry`=10854 AND `text_id`=15066;
+INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (10854,15066);
+DELETE FROM `gossip_menu` WHERE `entry`=10147 AND `text_id`=14091;
+INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (10147,14091);
+DELETE FROM `gossip_menu` WHERE `entry`=9873 AND `text_id`=13690;
+INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (9873,13690);
+
+-- Creature Gossip_menu_id Update from sniff
+UPDATE `creature_template` SET `gossip_menu_id`=9838 WHERE `entry`=28774;
+UPDATE `creature_template` SET `gossip_menu_id`=9832 WHERE `entry`=28776;
+UPDATE `creature_template` SET `gossip_menu_id`=10854 WHERE `entry`=36856;
+UPDATE `creature_template` SET `gossip_menu_id`=10180 WHERE `entry`=29478;
+UPDATE `creature_template` SET `gossip_menu_id`=10147 WHERE `entry`=31136;
+UPDATE `creature_template` SET `gossip_menu_id`=9873 WHERE `entry`=28701;
+
+-- Creature Gossip_menu_option Update from sniff
+DELETE FROM `gossip_menu_option` WHERE `menu_id` IN (9838,9873) AND `id` IN (0);
+DELETE FROM `gossip_menu_option` WHERE `menu_id` IN (9838,9873,10180) AND `id` IN (1);
+INSERT INTO `gossip_menu_option` (`menu_id`,`id`,`option_icon`,`option_text`,`option_id`,`npc_option_npcflag`,`action_menu_id`,`action_poi_id`,`box_coded`,`box_money`,`box_text`) VALUES
+(9838,0,8, 'I want to create a guild crest.',11,524288,0,0,0,0, ''),
+(9838,1,7, 'How do I form a guild?',10,262144,0,0,0,0, ''),
+(10180,1,1, 'I want to browse your goods.',3,128,0,0,0,0, ''),
+(9873,0,3, 'Train me.',5,16,0,0,0,0, ''),
+(9873,1,1, 'May I browse your epic gem recipes?',3,128,0,0,0,0, '');
+
+-- Gossip Menu insert from sniff
+DELETE FROM `gossip_menu` WHERE `entry`=2061 AND `text_id`=2713;
+INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (2061,2713);
+DELETE FROM `gossip_menu` WHERE `entry`=5818 AND `text_id`=6991;
+INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (5818,6991);
+
+-- Creature Gossip_menu_id Update from sniff
+UPDATE `creature_template` SET `gossip_menu_id`=2061 WHERE `entry`=9563;
+UPDATE `creature_template` SET `gossip_menu_id`=5818 WHERE `entry`=14437;
+UPDATE `creature_template` SET `gossip_menu_id`=10188 WHERE `entry`=31051;
+
+-- Creature Gossip_menu_option Update from sniff
+-- You must manually add delete statement
+-- DELETE FROM `gossip_menu_option` WHERE `menu_id` IN (5818) AND `id` IN (0);
+INSERT INTO `gossip_menu_option` (`menu_id`,`id`,`option_icon`,`option_text`,`option_id`,`npc_option_npcflag`,`action_menu_id`,`action_poi_id`,`box_coded`,`box_money`,`box_text`) VALUES
+(5818,0,1, 'Gorzeeki, I wish to make a purchase.',3,128,0,0,0,0, '');
+
+-- Gossip Menu insert from sniff
+DELETE FROM `gossip_menu` WHERE `entry`=8023 AND `text_id`=9899;
+INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (8023,9899);
+DELETE FROM `gossip_menu` WHERE `entry`=8021 AND `text_id`=9896;
+INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (8021,9896);
+
+-- Creature Gossip_menu_id Update from sniff
+UPDATE `creature_template` SET `gossip_menu_id`=8021 WHERE `entry`=19679;
+
+-- Creature Gossip_menu_option Update from sniff
+DELETE FROM `gossip_menu_option` WHERE `menu_id` IN (8023,8021,4005) AND `id` IN (0);
+INSERT INTO `gossip_menu_option` (`menu_id`,`id`,`option_icon`,`option_text`,`option_id`,`npc_option_npcflag`,`action_menu_id`,`action_poi_id`,`box_coded`,`box_money`,`box_text`) VALUES
+(8023,0,0, '<Push a random button.>',1,1,8023,0,0,0, ''),
+(8021,0,1, 'Show me what you have for sale, "Slim."',3,128,0,0,0,0, ''),
+(4005,0,1, 'I would like to buy from you.',3,128,0,0,0,0, '');
+
+-- Gossip Menu insert from sniff
+DELETE FROM `gossip_menu` WHERE `entry`=4143 AND `text_id`=5136;
+INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (4143,5136);
+DELETE FROM `gossip_menu` WHERE `entry`=6229 AND `text_id`=7403;
+INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (6229,7403);
+
+-- Creature Gossip_menu_id Update from sniff
+UPDATE `creature_template` SET `gossip_menu_id`=9781 WHERE `entry`=29143;
+UPDATE `creature_template` SET `gossip_menu_id`=4143 WHERE `entry`=2857;
+UPDATE `creature_template` SET `gossip_menu_id`=6229 WHERE `entry`=7010;
+UPDATE `creature_template` SET `gossip_menu_id`=9107 WHERE `entry`=24930;
+UPDATE `creature_template` SET `gossip_menu_id`=9108 WHERE `entry`=25081;
+UPDATE `creature_template` SET `gossip_menu_id`=9107 WHERE `entry`=24931;
+UPDATE `creature_template` SET `gossip_menu_id`=9106 WHERE `entry`=24926;
+
+-- Creature Gossip_menu_id Update from sniff
+UPDATE `creature_template` SET `gossip_menu_id`=4667 WHERE `entry`=906;
+
+-- Gossip Menu insert from sniff
+DELETE FROM `gossip_menu` WHERE `entry`=4644 AND `text_id`=5716;
+INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (4644,5716);
+DELETE FROM `gossip_menu` WHERE `entry`=4045 AND `text_id`=4935;
+INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (4045,4935);
+DELETE FROM `gossip_menu` WHERE `entry`=3926 AND `text_id`=4786;
+INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (3926,4786);
+DELETE FROM `gossip_menu` WHERE `entry`=4006 AND `text_id`=4862;
+INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (4006,4862);
+DELETE FROM `gossip_menu` WHERE `entry`=4012 AND `text_id`=4998;
+INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (4012,4998);
+DELETE FROM `gossip_menu` WHERE `entry`=4185 AND `text_id`=5287;
+INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (4185,5287);
+
+-- Creature Gossip_menu_id Update from sniff
+UPDATE `creature_template` SET `gossip_menu_id`=4045 WHERE `entry`=2980;
+UPDATE `creature_template` SET `gossip_menu_id`=5856 WHERE `entry`=5939;
+UPDATE `creature_template` SET `gossip_menu_id`=10181 WHERE `entry`=3079;
+
+-- Creature Gossip_menu_option Update from sniff
+DELETE FROM `gossip_menu_option` WHERE `menu_id` IN (4644,3926,4006) AND `id` IN (0);
+INSERT INTO `gossip_menu_option` (`menu_id`,`id`,`option_icon`,`option_text`,`option_id`,`npc_option_npcflag`,`action_menu_id`,`action_poi_id`,`box_coded`,`box_money`,`box_text`) VALUES
+(4644,0,3, 'I seek further druidic training to have a closer understanding of the Earth Mother''s will.',5,16,0,0,0,0, ''),
+(3926,0,3, 'I seek training as a druid.',5,16,0,0,0,0, ''),
+(4006,0,1, 'I would like to buy from you.',3,128,0,0,0,0, '');
+
+-- Gossip Menu insert from sniff
+DELETE FROM `gossip_menu` WHERE `entry`=7369 AND `text_id`=8805;
+INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (7369,8805);
+
+-- Creature Gossip_menu_id Update from sniff
+UPDATE `creature_template` SET `gossip_menu_id`=7369 WHERE `entry`=17109;
+
+-- Gossip Menu insert from sniff
+DELETE FROM `gossip_menu` WHERE `entry`=4486 AND `text_id`=538;
+INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (4486,538);
+
+-- Creature Gossip_menu_option Update from sniff
+DELETE FROM `gossip_menu_option` WHERE `menu_id` IN (4486) AND `id` IN (0,1);
+INSERT INTO `gossip_menu_option` (`menu_id`,`id`,`option_icon`,`option_text`,`option_id`,`npc_option_npcflag`,`action_menu_id`,`action_poi_id`,`box_coded`,`box_money`,`box_text`) VALUES
+(4486,0,3, 'I am interested in mage training.',5,16,0,0,0,0, ''),
+(4486,1,0, 'I wish to unlearn my talents.',16,16,0,0,0,0, '');
+
+-- Gossip conditions
+SET @ID := 4486;
+DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=14 AND `SourceGroup`=@ID;
+INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`ErrorTextId`,`ScriptName`,`Comment`) VALUES
+(14,@ID,538,0,15,8,0,0,0,'','Show gossip text if player is mage');
+-- Gossip option conditions
+SET @ID := 4486;
+DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=15 AND `SourceGroup`=@ID;
+INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`ErrorTextId`,`ScriptName`,`Comment`) VALUES
+(15,@ID,0,0,15,8,0,0,0,'','Show gossip option if player is mage'),
+(15,@ID,1,0,15,8,0,0,0,'','Show gossip option if player is mage');
diff --git a/sql/updates/world/2012_01_04_09_world_gossip_menu.sql b/sql/updates/world/2012_01_04_09_world_gossip_menu.sql
new file mode 100644
index 00000000000..b95eb723d03
--- /dev/null
+++ b/sql/updates/world/2012_01_04_09_world_gossip_menu.sql
@@ -0,0 +1,56 @@
+-- Gossip Menu insert from sniff
+DELETE FROM `gossip_menu` WHERE `entry`=6768 AND `text_id`=6194;
+INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (6768,6194);
+DELETE FROM `gossip_menu` WHERE `entry`=8703 AND `text_id`=10948;
+INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (8703,10948);
+DELETE FROM `gossip_menu` WHERE `entry`=8672 AND `text_id`=10910;
+INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (8672,10910);
+DELETE FROM `gossip_menu` WHERE `entry`=8673 AND `text_id`=10911;
+INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (8673,10911);
+DELETE FROM `gossip_menu` WHERE `entry`=8678 AND `text_id`=10916;
+INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (8678,10916);
+DELETE FROM `gossip_menu` WHERE `entry`=8677 AND `text_id`=10921;
+INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (8677,10921);
+DELETE FROM `gossip_menu` WHERE `entry`=8677 AND `text_id`=10913;
+INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (8677,10913); -- Needs condition of 10 Apexis Shards
+DELETE FROM `gossip_menu` WHERE `entry`=8676 AND `text_id`=10914;
+INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (8676,10914);
+DELETE FROM `gossip_menu` WHERE `entry`=8704 AND `text_id`=10949;
+INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (8704,10949);
+DELETE FROM `gossip_menu` WHERE `entry`=8681 AND `text_id`=10927;
+INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (8681,10927);
+DELETE FROM `gossip_menu` WHERE `entry`=8671 AND `text_id`=10951;
+INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (8671,10951);
+DELETE FROM `gossip_menu` WHERE `entry`=8680 AND `text_id`=10923;
+INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (8680,10923);
+
+-- Creature Gossip_menu_id Update from sniff
+UPDATE `creature_template` SET `gossip_menu_id`=6768 WHERE `entry`=13418;
+UPDATE `creature_template` SET `gossip_menu_id`=8678 WHERE `entry`=23316;
+UPDATE `creature_template` SET `gossip_menu_id`=8681 WHERE `entry`=23233;
+UPDATE `creature_template` SET `gossip_menu_id`=8680 WHERE `entry`=23300;
+
+-- Creature Gossip_menu_option Update from sniff
+DELETE FROM `gossip_menu_option` WHERE `menu_id` IN (6768,8703,8672,8673,8677,8676,8704) AND `id` IN (0);
+INSERT INTO `gossip_menu_option` (`menu_id`,`id`,`option_icon`,`option_text`,`option_id`,`npc_option_npcflag`,`action_menu_id`,`action_poi_id`,`box_coded`,`box_money`,`box_text`) VALUES
+(6768,0,1, 'Let me browse your seasonal fare.',3,128,0,0,0,0, ''),
+(8703,0,0, 'Insert an Apexis Shard, and begin!',1,1,0,0,0,0, ''),
+(8672,0,0, 'Purchase 1 Unstable Flask of the Beast for the cost of 10 Apexis Shards',1,1,8673,0,0,0, ''), -- Needs condition of 10 Apexis Shards
+(8673,0,0, 'Use the fel crystalforge to make another purchase.',1,1,8672,0,0,0, ''),
+(8677,0,0, 'Purchase 1 Unstable Flask of the Sorcerer for the cost of 10 Apexis Shards',1,1,8676,0,0,0, ''), -- Needs condition of 10 Apexis Shards
+(8676,0,0, 'Use the Bash''ir crystalforge to make another purchase.',1,1,8677,0,0,0, ''),
+(8704,0,0, 'Insert 35 Apexis Shards, and begin!',1,1,0,0,0,0, '');
+
+-- Gossip Menu insert from sniff
+DELETE FROM `gossip_menu` WHERE `entry`=8689 AND `text_id`=10931;
+INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (8689,10931);
+DELETE FROM `gossip_menu` WHERE `entry`=8669 AND `text_id`=10938;
+INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (8669,10938);
+
+-- Creature Gossip_menu_id Update from sniff
+UPDATE `creature_template` SET `gossip_menu_id`=8669 WHERE `entry`=23334;
+
+-- Creature Gossip_menu_option Update from sniff
+DELETE FROM `gossip_menu_option` WHERE `menu_id` IN (8689) AND `id` IN (0);
+INSERT INTO `gossip_menu_option` (`menu_id`,`id`,`option_icon`,`option_text`,`option_id`,`npc_option_npcflag`,`action_menu_id`,`action_poi_id`,`box_coded`,`box_money`,`box_text`) VALUES
+(8689,0,0, 'Place 35 Apexis Shards near the dragon egg to crack it open.',1,1,0,0,0,0, '');
diff --git a/sql/updates/world/2012_01_04_10_world_gossip_menu.sql b/sql/updates/world/2012_01_04_10_world_gossip_menu.sql
new file mode 100644
index 00000000000..b41f74e8050
--- /dev/null
+++ b/sql/updates/world/2012_01_04_10_world_gossip_menu.sql
@@ -0,0 +1,131 @@
+-- Gossip Menu insert from sniff
+DELETE FROM `gossip_menu` WHERE `entry`=4005 AND `text_id`=4869;
+INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (4005,4869);
+
+-- Creature Gossip_menu_id Update from sniff
+UPDATE `creature_template` SET `gossip_menu_id`=4005 WHERE `entry`=4731;
+
+-- Creature Gossip_menu_option Update from sniff
+DELETE FROM `gossip_menu_option` WHERE `menu_id` IN (4005) AND `id` IN (1);
+INSERT INTO `gossip_menu_option` (`menu_id`,`id`,`option_icon`,`option_text`,`option_id`,`npc_option_npcflag`,`action_menu_id`,`action_poi_id`,`box_coded`,`box_money`,`box_text`) VALUES
+(4005,1,1, 'I would like to buy from you.',3,128,0,0,0,0, '');
+
+-- Gossip Menu insert from sniff
+DELETE FROM `gossip_menu` WHERE `entry`=940 AND `text_id`=1513;
+INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (940,1513);
+DELETE FROM `gossip_menu` WHERE `entry`=941 AND `text_id`=1517;
+INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (941,1517);
+
+-- Creature Gossip_menu_id Update from sniff
+UPDATE `creature_template` SET `gossip_menu_id`=940 WHERE `entry`=7607;
+UPDATE `creature_template` SET `gossip_menu_id`=941 WHERE `entry`=7604;
+
+-- Creature Gossip_menu_option Update from sniff
+DELETE FROM `gossip_menu_option` WHERE `menu_id` IN (941) AND `id` IN (1);
+INSERT INTO `gossip_menu_option` (`menu_id`,`id`,`option_icon`,`option_text`,`option_id`,`npc_option_npcflag`,`action_menu_id`,`action_poi_id`,`box_coded`,`box_money`,`box_text`) VALUES
+(941,1,0, 'That''s it! I''m tired of helping you out. It''s time we settled things on the battlefield!',1,1,0,0,0,0, '');
+
+-- Creature Gossip_menu_id Update from sniff
+UPDATE `creature_template` SET `gossip_menu_id`=6944 WHERE `entry`=28621;
+-- Gossip Menu insert from sniff
+DELETE FROM `gossip_menu` WHERE `entry`=5710 AND `text_id`=6878;
+INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (5710,6878);
+DELETE FROM `gossip_menu` WHERE `entry`=5711 AND `text_id`=6879;
+INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (5711,6879);
+DELETE FROM `gossip_menu` WHERE `entry`=5712 AND `text_id`=6880;
+INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (5712,6880);
+DELETE FROM `gossip_menu` WHERE `entry`=5713 AND `text_id`=6881;
+INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (5713,6881);
+
+-- Creature Gossip_menu_id Update from sniff
+UPDATE `creature_template` SET `gossip_menu_id`=3623 WHERE `entry`=11556; -- 3624 in db. possible different gossip depending on faction?
+UPDATE `creature_template` SET `gossip_menu_id`=5710 WHERE `entry`=14354;
+
+-- Creature Gossip_menu_option Update from sniff
+DELETE FROM `gossip_menu_option` WHERE `menu_id` IN (5710,5711,5712,5713) AND `id` IN (0);
+INSERT INTO `gossip_menu_option` (`menu_id`,`id`,`option_icon`,`option_text`,`option_id`,`npc_option_npcflag`,`action_menu_id`,`action_poi_id`,`box_coded`,`box_money`,`box_text`) VALUES
+(5710,0,0, 'Why you little...',1,1,0,0,0,0, ''),
+(5711,0,0, 'Mark my words, I will catch you, imp. And when I do!',1,1,0,0,0,0, ''),
+(5712,0,0, 'DIE!',1,1,0,0,0,0, ''),
+(5713,0,0, 'Prepare to meet your maker.',1,1,0,0,0,0, '');
+
+-- Gossip Menu insert from sniff
+DELETE FROM `gossip_menu` WHERE `entry`=8310 AND `text_id`=10373;
+INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (8310,10373);
+
+-- Creature Gossip_menu_id Update from sniff
+UPDATE `creature_template` SET `gossip_menu_id`=8310 WHERE `entry`=20977;
+-- Gossip Menu insert from sniff
+DELETE FROM `gossip_menu` WHERE `entry`=8006 AND `text_id`=9871;
+INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (8006,9871);
+DELETE FROM `gossip_menu` WHERE `entry`=8007 AND `text_id`=9872;
+INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (8007,9872);
+DELETE FROM `gossip_menu` WHERE `entry`=8036 AND `text_id`=9922;
+INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (8036,9922);
+DELETE FROM `gossip_menu` WHERE `entry`=8036 AND `text_id`=10045;
+INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (8036,10045);
+DELETE FROM `gossip_menu` WHERE `entry`=8082 AND `text_id`=9990;
+INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (8082,9990);
+DELETE FROM `gossip_menu` WHERE `entry`=8038 AND `text_id`=9925;
+INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (8038,9925);
+DELETE FROM `gossip_menu` WHERE `entry`=7829 AND `text_id`=9579;
+INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (7829,9579);
+DELETE FROM `gossip_menu` WHERE `entry`=7831 AND `text_id`=9580;
+INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (7831,9580);
+DELETE FROM `gossip_menu` WHERE `entry`=7840 AND `text_id`=9597;
+INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (7840,9597);
+DELETE FROM `gossip_menu` WHERE `entry`=7852 AND `text_id`=9613;
+INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (7852,9613);
+
+-- Creature Gossip_menu_id Update from sniff
+UPDATE `creature_template` SET `gossip_menu_id`=8006 WHERE `entry`=19468;
+UPDATE `creature_template` SET `gossip_menu_id`=8082 WHERE `entry`=20162;
+UPDATE `creature_template` SET `gossip_menu_id`=8038 WHERE `entry`=19840;
+UPDATE `creature_template` SET `gossip_menu_id`=7852 WHERE `entry`=18887;
+
+-- Creature Gossip_menu_option Update from sniff
+DELETE FROM `gossip_menu_option` WHERE `menu_id` IN (8036,8082,7830,7829,7831,7840,7852) AND `id` IN (0);
+INSERT INTO `gossip_menu_option` (`menu_id`,`id`,`option_icon`,`option_text`,`option_id`,`npc_option_npcflag`,`action_menu_id`,`action_poi_id`,`box_coded`,`box_money`,`box_text`) VALUES
+(8036,0,0, '<Begin emergency shutdown.>',1,1,8036,0,0,0, ''),
+(8082,0,0, 'I''m as ready as I''ll ever be.',1,1,0,0,0,0, ''),
+(7830,0,0, 'Taretha cannot see you, Thrall.',1,1,7829,0,0,0, ''),
+(7829,0,0, 'The situation is rather complicated, Thrall. It would be best for you to head into the mountains now, before more of Blackmoore''s men show up. We''ll make sure Taretha is safe.',1,1,7831,0,0,0, ''),
+(7831,0,0, 'Tarren Mill.',1,1,0,0,0,0, ''),
+(7840,0,0, 'We''re ready, Thrall.',1,1,0,0,0,0, ''),
+(7852,0,0, 'We''ll get you out, Taretha. Don''t worry. I doubt the wizard would wander too far away.',1,1,0,0,0,0, '');
+
+-- Creature Gossip_menu_option Update from sniff
+UPDATE `gossip_menu_option` SET `action_menu_id`=7829 WHERE `menu_id`=7830 AND `id`=0;
+
+-- Gossip Menu insert from sniff
+DELETE FROM `gossip_menu` WHERE `entry`=9185 AND `text_id`=12475;
+INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (9185,12475);
+DELETE FROM `gossip_menu` WHERE `entry`=9248 AND `text_id`=12556;
+INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (9248,12556);
+
+-- Creature Gossip_menu_id Update from sniff
+UPDATE `creature_template` SET `gossip_menu_id`=9185 WHERE `entry`=25381;
+UPDATE `creature_template` SET `gossip_menu_id`=9248 WHERE `entry`=26158;
+-- Gossip Menu insert from sniff
+DELETE FROM `gossip_menu` WHERE `entry`=5232 AND `text_id`=6250;
+INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (5232,6250);
+DELETE FROM `gossip_menu` WHERE `entry`=6813 AND `text_id`=8139;
+INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (6813,8139);
+
+-- Creature Gossip_menu_id Update from sniff
+UPDATE `creature_template` SET `gossip_menu_id`=5232 WHERE `entry`=13445;
+UPDATE `creature_template` SET `gossip_menu_id`=6813 WHERE `entry`=15760;
+
+-- Creature Gossip_menu_id Update from sniff
+UPDATE `creature_template` SET `gossip_menu_id`=6944 WHERE `entry`=6026;
+-- Gossip Menu insert from sniff
+DELETE FROM `gossip_menu` WHERE `entry`=10171 AND `text_id`=14115;
+INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (10171,14115);
+
+-- Creature Gossip_menu_id Update from sniff
+UPDATE `creature_template` SET `gossip_menu_id`=10171 WHERE `entry`=32301;
+
+-- Creature Gossip_menu_option Update from sniff
+DELETE FROM `gossip_menu_option` WHERE `menu_id` IN (10026) AND `id` IN (1);
+INSERT INTO `gossip_menu_option` (`menu_id`,`id`,`option_icon`,`option_text`,`option_id`,`npc_option_npcflag`,`action_menu_id`,`action_poi_id`,`box_coded`,`box_money`,`box_text`) VALUES
+(10026,1,0, 'Take me to the ship.',1,1,0,0,0,0, '');
diff --git a/sql/updates/world/2012_01_04_11_world_gossip_menu.sql b/sql/updates/world/2012_01_04_11_world_gossip_menu.sql
new file mode 100644
index 00000000000..4356f9c7a0a
--- /dev/null
+++ b/sql/updates/world/2012_01_04_11_world_gossip_menu.sql
@@ -0,0 +1,223 @@
+-- Gossip Menu insert from sniff
+DELETE FROM `gossip_menu` WHERE `entry`=341 AND `text_id`=820;
+INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (341,820);
+DELETE FROM `gossip_menu` WHERE `entry`=1041 AND `text_id`=1123;
+INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (1041,1123);
+DELETE FROM `gossip_menu` WHERE `entry`=643 AND `text_id`=1203;
+INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (643,1203);
+DELETE FROM `gossip_menu` WHERE `entry`=645 AND `text_id`=1206;
+INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (645,1206);
+DELETE FROM `gossip_menu` WHERE `entry`=648 AND `text_id`=1208;
+INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (648,1208);
+DELETE FROM `gossip_menu` WHERE `entry`=657 AND `text_id`=1221;
+INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (657,1221);
+DELETE FROM `gossip_menu` WHERE `entry`=660 AND `text_id`=1226;
+INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (660,1226);
+DELETE FROM `gossip_menu` WHERE `entry`=682 AND `text_id`=1232;
+INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (682,1232);
+DELETE FROM `gossip_menu` WHERE `entry`=683 AND `text_id`=1233;
+INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (683,1233);
+DELETE FROM `gossip_menu` WHERE `entry`=692 AND `text_id`=1242;
+INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (692,1242);
+DELETE FROM `gossip_menu` WHERE `entry`=693 AND `text_id`=1243;
+INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (693,1243);
+DELETE FROM `gossip_menu` WHERE `entry`=698 AND `text_id`=1249;
+INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (698,1249);
+DELETE FROM `gossip_menu` WHERE `entry`=705 AND `text_id`=1257;
+INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (705,1257);
+DELETE FROM `gossip_menu` WHERE `entry`=706 AND `text_id`=1258;
+INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (706,1258);
+DELETE FROM `gossip_menu` WHERE `entry`=10392 AND `text_id`=1259;
+INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (10392,1259);
+DELETE FROM `gossip_menu` WHERE `entry`=708 AND `text_id`=1260;
+INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (708,1260);
+DELETE FROM `gossip_menu` WHERE `entry`=2943 AND `text_id`=3657;
+INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (2943,3657);
+DELETE FROM `gossip_menu` WHERE `entry`=4469 AND `text_id`=3977;
+INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (4469,3977);
+DELETE FROM `gossip_menu` WHERE `entry`=4470 AND `text_id`=3977;
+INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (4470,3977);
+DELETE FROM `gossip_menu` WHERE `entry`=4471 AND `text_id`=3977;
+INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (4471,3977);
+DELETE FROM `gossip_menu` WHERE `entry`=4466 AND `text_id`=4434;
+INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (4466,4434);
+DELETE FROM `gossip_menu` WHERE `entry`=4467 AND `text_id`=4434;
+INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (4467,4434);
+DELETE FROM `gossip_menu` WHERE `entry`=4468 AND `text_id`=4434;
+INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (4468,4434);
+DELETE FROM `gossip_menu` WHERE `entry`=12537 AND `text_id`=4437;
+INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (12537,4437);
+DELETE FROM `gossip_menu` WHERE `entry`=4508 AND `text_id`=4783;
+INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (4508,4783);
+DELETE FROM `gossip_menu` WHERE `entry`=4502 AND `text_id`=4837;
+INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (4502,4837);
+DELETE FROM `gossip_menu` WHERE `entry`=5061 AND `text_id`=4837;
+INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (5061,4837);
+DELETE FROM `gossip_menu` WHERE `entry`=4472 AND `text_id`=5000;
+INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (4472,5000);
+DELETE FROM `gossip_menu` WHERE `entry`=4473 AND `text_id`=5000;
+INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (4473,5000);
+DELETE FROM `gossip_menu` WHERE `entry`=4474 AND `text_id`=5000;
+INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (4474,5000);
+DELETE FROM `gossip_menu` WHERE `entry`=4201 AND `text_id`=5016;
+INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (4201,5016);
+DELETE FROM `gossip_menu` WHERE `entry`=4112 AND `text_id`=5019;
+INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (4112,5019);
+DELETE FROM `gossip_menu` WHERE `entry`=4139 AND `text_id`=5124;
+INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (4139,5124);
+DELETE FROM `gossip_menu` WHERE `entry`=4146 AND `text_id`=5147;
+INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (4146,5147);
+DELETE FROM `gossip_menu` WHERE `entry`=4161 AND `text_id`=5207;
+INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (4161,5207);
+DELETE FROM `gossip_menu` WHERE `entry`=4173 AND `text_id`=5260;
+INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (4173,5260);
+DELETE FROM `gossip_menu` WHERE `entry`=4203 AND `text_id`=5320;
+INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (4203,5320);
+DELETE FROM `gossip_menu` WHERE `entry`=4262 AND `text_id`=5416;
+INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (4262,5416);
+DELETE FROM `gossip_menu` WHERE `entry`=4344 AND `text_id`=5519;
+INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (4344,5519);
+DELETE FROM `gossip_menu` WHERE `entry`=4353 AND `text_id`=5561;
+INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (4353,5561);
+DELETE FROM `gossip_menu` WHERE `entry`=4482 AND `text_id`=5721;
+INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (4482,5721);
+DELETE FROM `gossip_menu` WHERE `entry`=4475 AND `text_id`=5721;
+INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (4475,5721);
+DELETE FROM `gossip_menu` WHERE `entry`=4481 AND `text_id`=5721;
+INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (4481,5721);
+DELETE FROM `gossip_menu` WHERE `entry`=4504 AND `text_id`=5722;
+INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (4504,5722);
+DELETE FROM `gossip_menu` WHERE `entry`=4505 AND `text_id`=5722;
+INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (4505,5722);
+DELETE FROM `gossip_menu` WHERE `entry`=4503 AND `text_id`=5722;
+INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (4503,5722);
+DELETE FROM `gossip_menu` WHERE `entry`=4941 AND `text_id`=5994;
+INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (4941,5994);
+DELETE FROM `gossip_menu` WHERE `entry`=5641 AND `text_id`=6755;
+INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (5641,6755);
+DELETE FROM `gossip_menu` WHERE `entry`=5849 AND `text_id`=7011;
+INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (5849,7011);
+DELETE FROM `gossip_menu` WHERE `entry`=8110 AND `text_id`=10040;
+INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (8110,10040);
+DELETE FROM `gossip_menu` WHERE `entry`=8631 AND `text_id`=10821;
+INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (8631,10821);
+
+-- Creature Gossip_menu_id Update from sniff
+UPDATE `creature_template` SET `gossip_menu_id`=341 WHERE `entry`=3628;
+UPDATE `creature_template` SET `gossip_menu_id`=581 WHERE `entry`=5511;
+UPDATE `creature_template` SET `gossip_menu_id`=645 WHERE `entry`=5493;
+UPDATE `creature_template` SET `gossip_menu_id`=648 WHERE `entry`=1292;
+UPDATE `creature_template` SET `gossip_menu_id`=657 WHERE `entry`=2327;
+UPDATE `creature_template` SET `gossip_menu_id`=660 WHERE `entry`=5513;
+UPDATE `creature_template` SET `gossip_menu_id`=681 WHERE `entry`=1312;
+UPDATE `creature_template` SET `gossip_menu_id`=681 WHERE `entry`=1315;
+UPDATE `creature_template` SET `gossip_menu_id`=681 WHERE `entry`=1314;
+UPDATE `creature_template` SET `gossip_menu_id`=681 WHERE `entry`=1307;
+UPDATE `creature_template` SET `gossip_menu_id`=681 WHERE `entry`=1313;
+UPDATE `creature_template` SET `gossip_menu_id`=681 WHERE `entry`=1309;
+UPDATE `creature_template` SET `gossip_menu_id`=681 WHERE `entry`=1310;
+UPDATE `creature_template` SET `gossip_menu_id`=682 WHERE `entry`=1304;
+UPDATE `creature_template` SET `gossip_menu_id`=683 WHERE `entry`=5503;
+UPDATE `creature_template` SET `gossip_menu_id`=684 WHERE `entry`=1347;
+UPDATE `creature_template` SET `gossip_menu_id`=685 WHERE `entry`=5494;
+UPDATE `creature_template` SET `gossip_menu_id`=687 WHERE `entry`=1298;
+UPDATE `creature_template` SET `gossip_menu_id`=688 WHERE `entry`=1319;
+UPDATE `creature_template` SET `gossip_menu_id`=688 WHERE `entry`=1323;
+UPDATE `creature_template` SET `gossip_menu_id`=688 WHERE `entry`=1333;
+UPDATE `creature_template` SET `gossip_menu_id`=689 WHERE `entry`=1341;
+UPDATE `creature_template` SET `gossip_menu_id`=689 WHERE `entry`=1339;
+UPDATE `creature_template` SET `gossip_menu_id`=690 WHERE `entry`=1324;
+UPDATE `creature_template` SET `gossip_menu_id`=691 WHERE `entry`=1350;
+UPDATE `creature_template` SET `gossip_menu_id`=691 WHERE `entry`=1349;
+UPDATE `creature_template` SET `gossip_menu_id`=692 WHERE `entry`=1351;
+UPDATE `creature_template` SET `gossip_menu_id`=693 WHERE `entry`=5510;
+UPDATE `creature_template` SET `gossip_menu_id`=693 WHERE `entry`=5512;
+UPDATE `creature_template` SET `gossip_menu_id`=693 WHERE `entry`=5509;
+UPDATE `creature_template` SET `gossip_menu_id`=693 WHERE `entry`=5514;
+UPDATE `creature_template` SET `gossip_menu_id`=698 WHERE `entry`=5519;
+UPDATE `creature_template` SET `gossip_menu_id`=701 WHERE `entry`=1305;
+UPDATE `creature_template` SET `gossip_menu_id`=703 WHERE `entry`=1303;
+UPDATE `creature_template` SET `gossip_menu_id`=703 WHERE `entry`=1302;
+UPDATE `creature_template` SET `gossip_menu_id`=705 WHERE `entry`=1326;
+UPDATE `creature_template` SET `gossip_menu_id`=706 WHERE `entry`=1325;
+UPDATE `creature_template` SET `gossip_menu_id`=708 WHERE `entry`=4974;
+UPDATE `creature_template` SET `gossip_menu_id`=1041 WHERE `entry`=7232;
+UPDATE `creature_template` SET `gossip_menu_id`=2745 WHERE `entry`=957;
+UPDATE `creature_template` SET `gossip_menu_id`=2943 WHERE `entry`=10782;
+UPDATE `creature_template` SET `gossip_menu_id`=4112 WHERE `entry`=5500;
+UPDATE `creature_template` SET `gossip_menu_id`=4139 WHERE `entry`=11026;
+UPDATE `creature_template` SET `gossip_menu_id`=4146 WHERE `entry`=5518;
+UPDATE `creature_template` SET `gossip_menu_id`=4161 WHERE `entry`=1317;
+UPDATE `creature_template` SET `gossip_menu_id`=4173 WHERE `entry`=11096;
+UPDATE `creature_template` SET `gossip_menu_id`=4201 WHERE `entry`=5499;
+UPDATE `creature_template` SET `gossip_menu_id`=4203 WHERE `entry`=5564;
+UPDATE `creature_template` SET `gossip_menu_id`=4262 WHERE `entry`=1300;
+UPDATE `creature_template` SET `gossip_menu_id`=4344 WHERE `entry`=5567;
+UPDATE `creature_template` SET `gossip_menu_id`=4353 WHERE `entry`=1346;
+UPDATE `creature_template` SET `gossip_menu_id`=4466 WHERE `entry`=376;
+UPDATE `creature_template` SET `gossip_menu_id`=4467 WHERE `entry`=5489;
+UPDATE `creature_template` SET `gossip_menu_id`=4468 WHERE `entry`=5484;
+UPDATE `creature_template` SET `gossip_menu_id`=4469 WHERE `entry`=5491;
+UPDATE `creature_template` SET `gossip_menu_id`=4470 WHERE `entry`=5492;
+UPDATE `creature_template` SET `gossip_menu_id`=4471 WHERE `entry`=928;
+UPDATE `creature_template` SET `gossip_menu_id`=4472 WHERE `entry`=5517;
+UPDATE `creature_template` SET `gossip_menu_id`=4473 WHERE `entry`=5516;
+UPDATE `creature_template` SET `gossip_menu_id`=4474 WHERE `entry`=5515;
+UPDATE `creature_template` SET `gossip_menu_id`=4475 WHERE `entry`=914;
+UPDATE `creature_template` SET `gossip_menu_id`=4481 WHERE `entry`=5480;
+UPDATE `creature_template` SET `gossip_menu_id`=4482 WHERE `entry`=5479;
+UPDATE `creature_template` SET `gossip_menu_id`=4502 WHERE `entry`=918;
+UPDATE `creature_template` SET `gossip_menu_id`=4503 WHERE `entry`=461;
+UPDATE `creature_template` SET `gossip_menu_id`=4504 WHERE `entry`=5496;
+UPDATE `creature_template` SET `gossip_menu_id`=4505 WHERE `entry`=5495;
+UPDATE `creature_template` SET `gossip_menu_id`=4508 WHERE `entry`=5504;
+UPDATE `creature_template` SET `gossip_menu_id`=4783 WHERE `entry`=2879;
+UPDATE `creature_template` SET `gossip_menu_id`=4941 WHERE `entry`=332;
+UPDATE `creature_template` SET `gossip_menu_id`=5061 WHERE `entry`=13283;
+UPDATE `creature_template` SET `gossip_menu_id`=5641 WHERE `entry`=6122;
+UPDATE `creature_template` SET `gossip_menu_id`=5849 WHERE `entry`=14450;
+UPDATE `creature_template` SET `gossip_menu_id`=8110 WHERE `entry`=20407;
+UPDATE `creature_template` SET `gossip_menu_id`=8631 WHERE `entry`=23050;
+UPDATE `creature_template` SET `gossip_menu_id`=9729 WHERE `entry`=28650;
+UPDATE `creature_template` SET `gossip_menu_id`=9823 WHERE `entry`=29725;
+UPDATE `creature_template` SET `gossip_menu_id`=10392 WHERE `entry`=5193;
+UPDATE `creature_template` SET `gossip_menu_id`=10606 WHERE `entry`=34998;
+UPDATE `creature_template` SET `gossip_menu_id`=10606 WHERE `entry`=34997;
+
+-- Creature Gossip_menu_option Update from sniff
+DELETE FROM `gossip_menu_option` WHERE `menu_id` IN (341,581,645,648,657,660,682,683,684,687,688,689,690,692,693,698,701,702,703,705,706,4146,4161,4201,4203,4353,9823) AND `id` IN (0);
+DELETE FROM `gossip_menu_option` WHERE `menu_id` IN (9823) AND `id` IN (4);
+INSERT INTO `gossip_menu_option` (`menu_id`,`id`,`option_icon`,`option_text`,`option_id`,`npc_option_npcflag`,`action_menu_id`,`action_poi_id`,`box_coded`,`box_money`,`box_text`) VALUES
+(341,0,5, 'Make this inn your home.',8,65536,0,0,0,0, ''),
+(581,0,3, 'Train me.',5,16,0,0,0,0, ''),
+(645,0,3, 'Train me.',5,16,0,0,0,0, ''),
+(648,0,3, 'Train me.',5,16,0,0,0,0, ''),
+(657,0,3, 'Train me.',5,16,0,0,0,0, ''),
+(660,0,3, 'Train me.',5,16,0,0,0,0, ''),
+(682,0,1, 'I want to browse your goods.',3,128,0,0,0,0, ''),
+(683,0,1, 'I want to browse your goods.',3,128,0,0,0,0, ''),
+(684,0,1, 'I want to browse your goods.',3,128,0,0,0,0, ''),
+(687,0,1, 'I want to browse your goods.',3,128,0,0,0,0, ''),
+(688,0,1, 'I want to browse your goods.',3,128,0,0,0,0, ''),
+(689,0,1, 'I want to browse your goods.',3,128,0,0,0,0, ''),
+(690,0,1, 'I want to browse your goods.',3,128,0,0,0,0, ''),
+(692,0,1, 'I want to browse your goods.',3,128,0,0,0,0, ''),
+(693,0,1, 'I want to browse your goods.',3,128,0,0,0,0, ''),
+(698,0,1, 'I want to browse your goods.',3,128,0,0,0,0, ''),
+(701,0,1, 'I want to browse your goods.',3,128,0,0,0,0, ''),
+(702,0,1, 'I want to browse your goods.',3,128,0,0,0,0, ''),
+(703,0,1, 'I want to browse your goods.',3,128,0,0,0,0, ''),
+(705,0,1, 'I want to browse your goods.',3,128,0,0,0,0, ''),
+(706,0,1, 'I want to browse your goods.',3,128,0,0,0,0, ''),
+(4146,0,3, 'Train me.',5,16,0,0,0,0, ''),
+(4161,0,3, 'Train me.',5,16,0,0,0,0, ''),
+(4201,0,3, 'Train me.',5,16,0,0,0,0, ''),
+(4203,0,3, 'Train me.',5,16,0,0,0,0, ''),
+(4353,0,3, 'Train me.',5,16,0,0,0,0, ''),
+(9823,0,0, 'I''ve lost my key to Scholomance.',1,1,0,0,0,0, ''),
+(9823,4,0, 'I''ve lost my Shadowforge Key.',1,1,0,0,0,0, '');
+
+-- Insert npc_text from sniff
+DELETE FROM `npc_text` WHERE `ID` IN (1123);
+INSERT INTO `npc_text` (`ID`,`prob0`,`text0_0`,`text0_1`,`lang0`,`em0_0`,`em0_1`,`em0_2`,`em0_3`,`em0_4`,`em0_5`,`prob1`,`text1_0`,`text1_1`,`lang1`,`em1_0`,`em1_1`,`em1_2`,`em1_3`,`em1_4`,`em1_5`,`prob2`,`text2_0`,`text2_1`,`lang2`,`em2_0`,`em2_1`,`em2_2`,`em2_3`,`em2_4`,`em2_5`,`prob3`,`text3_0`,`text3_1`,`lang3`,`em3_0`,`em3_1`,`em3_2`,`em3_3`,`em3_4`,`em3_5`,`prob4`,`text4_0`,`text4_1`,`lang4`,`em4_0`,`em4_1`,`em4_2`,`em4_3`,`em4_4`,`em4_5`,`prob5`,`text5_0`,`text5_1`,`lang5`,`em5_0`,`em5_1`,`em5_2`,`em5_3`,`em5_4`,`em5_5`,`prob6`,`text6_0`,`text6_1`,`lang6`,`em6_0`,`em6_1`,`em6_2`,`em6_3`,`em6_4`,`em6_5`,`prob7`,`text7_0`,`text7_1`,`lang7`,`em7_0`,`em7_1`,`em7_2`,`em7_3`,`em7_4`,`em7_5`,`WDBVerified`) VALUES
+(1123,100,'Can''t ye see I''m busy? This had better be good.','',7,0,0,0,0,0,0,0,'','',0,0,0,0,0,0,0,0,'','',0,0,0,0,0,0,0,0,'','',0,0,0,0,0,0,0,0,'','',0,0,0,0,0,0,0,0,'','',0,0,0,0,0,0,0,0,'','',0,0,0,0,0,0,0,0,'','',0,0,0,0,0,0,0,1);
diff --git a/sql/updates/world/2012_01_04_12_world_gosip_menu.sql b/sql/updates/world/2012_01_04_12_world_gosip_menu.sql
new file mode 100644
index 00000000000..a57dc7bcdba
--- /dev/null
+++ b/sql/updates/world/2012_01_04_12_world_gosip_menu.sql
@@ -0,0 +1,30 @@
+-- Gossip Menu insert from sniff
+DELETE FROM `gossip_menu` WHERE `entry`=752 AND `text_id`=1302;
+INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (752,1302);
+DELETE FROM `gossip_menu` WHERE `entry`=1541 AND `text_id`=2213;
+INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (1541,2213);
+-- Creature Gossip_menu_id Update from sniff
+UPDATE `creature_template` SET `gossip_menu_id`=752 WHERE `entry`=7363;
+UPDATE `creature_template` SET `gossip_menu_id`=11618 WHERE `entry`=9540;
+UPDATE `creature_template` SET `gossip_menu_id`=1541 WHERE `entry`=8816;
+-- Creature Gossip_menu_option Update from sniff
+DELETE FROM `gossip_menu_option` WHERE `menu_id` IN (1541) AND `id` IN (0);
+INSERT INTO `gossip_menu_option` (`menu_id`,`id`,`option_icon`,`option_text`,`option_id`,`npc_option_npcflag`,`action_menu_id`,`action_poi_id`,`box_coded`,`box_money`,`box_text`) VALUES
+(1541,0,0, 'I wish to face the Defiler.',1,1,0,0,0,0, '');
+
+-- Gossip Menu insert from sniff
+DELETE FROM `gossip_menu` WHERE `entry`=9735 AND `text_id`=13342;
+INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (9735,13342);
+DELETE FROM `gossip_menu` WHERE `entry`=9754 AND `text_id`=13397;
+INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (9754,13397);
+-- Creature Gossip_menu_id Update from sniff
+UPDATE `creature_template` SET `gossip_menu_id`=9735 WHERE `entry`=28760;
+UPDATE `creature_template` SET `gossip_menu_id`=9769 WHERE `entry`=28914;
+UPDATE `creature_template` SET `gossip_menu_id`=9762 WHERE `entry`=28912;
+UPDATE `creature_template` SET `gossip_menu_id`=9795 WHERE `entry`=29173;
+-- Creature Gossip_menu_option Update from sniff
+DELETE FROM `gossip_menu_option` WHERE `menu_id` IN (9735,9769,9795) AND `id` IN (0);
+INSERT INTO `gossip_menu_option` (`menu_id`,`id`,`option_icon`,`option_text`,`option_id`,`npc_option_npcflag`,`action_menu_id`,`action_poi_id`,`box_coded`,`box_money`,`box_text`) VALUES
+(9735,0,1, 'Yes, Hargus. I wish to purchase supplies.',3,128,0,0,0,0, ''),
+(9769,0,0, 'I missed the gate to Acherus, Orbaz. Could you please open another?',1,1,0,0,0,0, ''),
+(9795,0,0, 'I am ready, Highlord. Let the siege of Light''s Hope begin!',1,1,0,0,0,0, '');
diff --git a/sql/updates/world/2012_01_04_13_world_gossip_menu.sql b/sql/updates/world/2012_01_04_13_world_gossip_menu.sql
new file mode 100644
index 00000000000..5a102db3f08
--- /dev/null
+++ b/sql/updates/world/2012_01_04_13_world_gossip_menu.sql
@@ -0,0 +1,88 @@
+-- Gossip Menu insert from sniff
+DELETE FROM `gossip_menu` WHERE `entry`=8895 AND `text_id`=11667;
+INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (8895,11667);
+DELETE FROM `gossip_menu` WHERE `entry`=8805 AND `text_id`=11291;
+INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (8805,11291);
+DELETE FROM `gossip_menu` WHERE `entry`=10116 AND `text_id`=14042;
+INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (10116,14042);
+-- Creature Gossip_menu_id Update from sniff
+UPDATE `creature_template` SET `gossip_menu_id`=8895 WHERE `entry`=24111;
+UPDATE `creature_template` SET `gossip_menu_id`=8805 WHERE `entry`=23733;
+UPDATE `creature_template` SET `gossip_menu_id`=10116 WHERE `entry`=26914;
+UPDATE `creature_template` SET `gossip_menu_id`=9879 WHERE `entry`=26916;
+-- Creature Gossip_menu_option Update from sniff
+DELETE FROM `gossip_menu_option` WHERE `menu_id` IN (10116) AND `id` IN (0);
+INSERT INTO `gossip_menu_option` (`menu_id`,`id`,`option_icon`,`option_text`,`option_id`,`npc_option_npcflag`,`action_menu_id`,`action_poi_id`,`box_coded`,`box_money`,`box_text`) VALUES
+(10116,0,3, 'Train me.',5,16,0,0,0,0, '');
+-- Insert npc_text from sniff
+DELETE FROM `npc_text` WHERE `ID` IN (11291);
+INSERT INTO `npc_text` (`ID`,`prob0`,`text0_0`,`text0_1`,`lang0`,`em0_0`,`em0_1`,`em0_2`,`em0_3`,`em0_4`,`em0_5`,`prob1`,`text1_0`,`text1_1`,`lang1`,`em1_0`,`em1_1`,`em1_2`,`em1_3`,`em1_4`,`em1_5`,`prob2`,`text2_0`,`text2_1`,`lang2`,`em2_0`,`em2_1`,`em2_2`,`em2_3`,`em2_4`,`em2_5`,`prob3`,`text3_0`,`text3_1`,`lang3`,`em3_0`,`em3_1`,`em3_2`,`em3_3`,`em3_4`,`em3_5`,`prob4`,`text4_0`,`text4_1`,`lang4`,`em4_0`,`em4_1`,`em4_2`,`em4_3`,`em4_4`,`em4_5`,`prob5`,`text5_0`,`text5_1`,`lang5`,`em5_0`,`em5_1`,`em5_2`,`em5_3`,`em5_4`,`em5_5`,`prob6`,`text6_0`,`text6_1`,`lang6`,`em6_0`,`em6_1`,`em6_2`,`em6_3`,`em6_4`,`em6_5`,`prob7`,`text7_0`,`text7_1`,`lang7`,`em7_0`,`em7_1`,`em7_2`,`em7_3`,`em7_4`,`em7_5`,`WDBVerified`) VALUES
+(11291,1,'When I grow up I want to be a stable man!','',0,0,1,0,0,0,0,0,'','',0,0,0,0,0,0,0,0,'','',0,0,0,0,0,0,0,0,'','',0,0,0,0,0,0,0,0,'','',0,0,0,0,0,0,0,0,'','',0,0,0,0,0,0,0,0,'','',0,0,0,0,0,0,0,0,'','',0,0,0,0,0,0,0,1);
+
+-- Gossip Menu insert from sniff
+DELETE FROM `gossip_menu` WHERE `entry`=7434 AND `text_id`=8983;
+INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (7434,8983);
+-- Creature Gossip_menu_id Update from sniff
+UPDATE `creature_template` SET `gossip_menu_id`=7434 WHERE `entry`=17440;
+-- Gossip Menu insert from sniff
+DELETE FROM `gossip_menu` WHERE `entry`=10922 AND `text_id`=15171;
+INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (10922,15171);
+DELETE FROM `gossip_menu` WHERE `entry`=10950 AND `text_id`=15215;
+INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (10950,15215);
+DELETE FROM `gossip_menu` WHERE `entry`=10909 AND `text_id`=15157;
+INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (10909,15157);
+-- Creature Gossip_menu_id Update from sniff
+UPDATE `creature_template` SET `gossip_menu_id`=10922 WHERE `entry`=37592;
+UPDATE `creature_template` SET `gossip_menu_id`=10950 WHERE `entry`=37223;
+UPDATE `creature_template` SET `gossip_menu_id`=10909 WHERE `entry`=37554;
+
+-- Creature Gossip_menu_option Update from sniff
+DELETE FROM `gossip_menu_option` WHERE `menu_id` IN (10950) AND `id` IN (0,1);
+DELETE FROM `gossip_menu_option` WHERE `menu_id` IN (10909) AND `id` IN (0);
+INSERT INTO `gossip_menu_option` (`menu_id`,`id`,`option_icon`,`option_text`,`option_id`,`npc_option_npcflag`,`action_menu_id`,`action_poi_id`,`box_coded`,`box_money`,`box_text`) VALUES
+(10950,0,0, 'Can you remove the sword?',1,1,0,0,0,0, ''),
+(10950,1,0, 'Dark Lady, I think I hear Arthas coming. Whatever you''re going to do, do it quickly.',1,1,0,0,0,0, ''),
+(10909,0,0, 'We''re ready! Let''s go!',1,1,0,0,0,0, '');
+-- Gossip Menu insert from sniff
+DELETE FROM `gossip_menu` WHERE `entry`=9024 AND `text_id`=12194;
+INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (9024,12194);
+
+-- Creature Gossip_menu_option Update from sniff
+DELETE FROM `gossip_menu_option` WHERE `menu_id` IN (9024) AND `id` IN (0,1,2,3);
+INSERT INTO `gossip_menu_option` (`menu_id`,`id`,`option_icon`,`option_text`,`option_id`,`npc_option_npcflag`,`action_menu_id`,`action_poi_id`,`box_coded`,`box_money`,`box_text`) VALUES
+(9024,0,0, '<Get on the work bench and let Walt put you in the golem suit.>',1,1,0,0,0,0, ''),
+(9024,1,0, '<Get on the work bench and let Walt put you in the golem suit.>',1,1,0,0,0,0, ''),
+(9024,2,0, '<Get on the work bench and let Walt put you in the golem suit.>',1,1,0,0,0,0, ''),
+(9024,3,0, '<Get on the work bench and let Walt put you in the golem suit.>',1,1,0,0,0,0, '');
+
+-- Gossip conditions
+SET @ID := 9024;
+DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=15 AND `SourceGroup`=@ID;
+INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`ErrorTextId`,`ScriptName`,`Comment`) VALUES
+(15,@ID,0,0,9,11485,0,0,0,'','Show gossip option if player has quest Iron Rune Constructs and You: Rocket Jumping'),
+(15,@ID,1,0,9,11489,0,0,0,'','Show gossip option if player has quest Iron Rune Constructs and You: Collecting Data'),
+(15,@ID,2,0,9,11491,0,0,0,'','Show gossip option if player has quest Iron Rune Constructs and You: The Bluff'),
+(15,@ID,3,0,9,11494,0,0,0,'','Show gossip option if player has quest Lightning Infused Relics');
+
+
+-- Gossip Menu insert from sniff
+DELETE FROM `gossip_menu` WHERE `entry`=8560 AND `text_id`=10723;
+INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (8560,10723);
+
+-- Gossip Menu insert from sniff
+DELETE FROM `gossip_menu` WHERE `entry`=9562 AND `text_id`=12881;
+INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (9562,12881);
+DELETE FROM `gossip_menu` WHERE `entry`=9562 AND `text_id`=12882;
+INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (9562,12882);
+
+-- Creature Gossip_menu_id Update from sniff
+UPDATE `creature_template` SET `gossip_menu_id`=9562 WHERE `entry`=27318;
+
+-- Gossip conditions
+SET @ID := 9562;
+DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=14 AND `SourceGroup`=@ID;
+INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`ErrorTextId`,`ScriptName`,`Comment`) VALUES
+(14,@ID,12882,0,8,12311,0,0,0,'','Show gossip text if player completed quest The Noble''s Crypt');
+
+UPDATE `creature_template` SET `gossip_menu_id`=0 WHERE `entry`=14354;
+
diff --git a/sql/updates/world/2012_01_04_14_world_gossip_menu.sql b/sql/updates/world/2012_01_04_14_world_gossip_menu.sql
new file mode 100644
index 00000000000..be28d634899
--- /dev/null
+++ b/sql/updates/world/2012_01_04_14_world_gossip_menu.sql
@@ -0,0 +1,71 @@
+-- Gossip Menu insert from sniff
+DELETE FROM `gossip_menu` WHERE `entry`=9635 AND `text_id`=13322;
+INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (9635,13322);
+DELETE FROM `gossip_menu` WHERE `entry`=9724 AND `text_id`=13307;
+INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (9724,13307);
+DELETE FROM `gossip_menu` WHERE `entry`=9720 AND `text_id`=13303;
+INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (9720,13303);
+DELETE FROM `gossip_menu` WHERE `entry`=9688 AND `text_id`=13147;
+INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (9688,13147);
+DELETE FROM `gossip_menu` WHERE `entry`=9738 AND `text_id`=13352;
+INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (9738,13352);
+DELETE FROM `gossip_menu` WHERE `entry`=9723 AND `text_id`=13306;
+INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (9723,13306);
+DELETE FROM `gossip_menu` WHERE `entry`=9721 AND `text_id`=13304;
+INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (9721,13304);
+DELETE FROM `gossip_menu` WHERE `entry`=9722 AND `text_id`=13305;
+INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (9722,13305);
+DELETE FROM `gossip_menu` WHERE `entry`=9748 AND `text_id`=13366;
+INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (9748,13366);
+DELETE FROM `gossip_menu` WHERE `entry`=9677 AND `text_id`=13124;
+INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (9677,13124);
+DELETE FROM `gossip_menu` WHERE `entry`=9679 AND `text_id`=13124;
+INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (9679,13124);
+DELETE FROM `gossip_menu` WHERE `entry`=9684 AND `text_id`=13124;
+INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (9684,13124);
+DELETE FROM `gossip_menu` WHERE `entry`=9742 AND `text_id`=13361;
+INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (9742,13361);
+DELETE FROM `gossip_menu` WHERE `entry`=9678 AND `text_id`=13137;
+INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (9678,13137);
+DELETE FROM `gossip_menu` WHERE `entry`=9686 AND `text_id`=13138;
+INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (9686,13138);
+DELETE FROM `gossip_menu` WHERE `entry`=9743 AND `text_id`=13362;
+INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (9743,13362);
+DELETE FROM `gossip_menu` WHERE `entry`=9746 AND `text_id`=13365;
+INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (9746,13365);
+-- Creature Gossip_menu_id Update from sniff
+UPDATE `creature_template` SET `gossip_menu_id`=9724 WHERE `entry`=28604;
+UPDATE `creature_template` SET `gossip_menu_id`=9720 WHERE `entry`=27801;
+UPDATE `creature_template` SET `gossip_menu_id`=9688 WHERE `entry`=28376;
+UPDATE `creature_template` SET `gossip_menu_id`=9738 WHERE `entry`=28771;
+UPDATE `creature_template` SET `gossip_menu_id`=9723 WHERE `entry`=28374;
+UPDATE `creature_template` SET `gossip_menu_id`=9748 WHERE `entry`=28216;
+UPDATE `creature_template` SET `gossip_menu_id`=9677 WHERE `entry`=28217;
+UPDATE `creature_template` SET `gossip_menu_id`=9742 WHERE `entry`=28027;
+UPDATE `creature_template` SET `gossip_menu_id`=9678 WHERE `entry`=28315;
+UPDATE `creature_template` SET `gossip_menu_id`=9743 WHERE `entry`=28114;
+UPDATE `creature_template` SET `gossip_menu_id`=9746 WHERE `entry`=28122;
+-- Creature Gossip_menu_option Update from sniff
+DELETE FROM `gossip_menu_option` WHERE `menu_id` IN (9804,9750,9713,9720,9721,9722,9674,9677,9684,9678,9686,9728,2384,1624) AND `id` IN (0);
+DELETE FROM `gossip_menu_option` WHERE `menu_id` IN (10024,9724,2384) AND `id` IN (1);
+DELETE FROM `gossip_menu_option` WHERE `menu_id` IN (9742,2384) AND `id` IN (2);
+INSERT INTO `gossip_menu_option` (`menu_id`,`id`,`option_icon`,`option_text`,`option_id`,`npc_option_npcflag`,`action_menu_id`,`action_poi_id`,`box_coded`,`box_money`,`box_text`) VALUES
+(10024,1,0, 'I''m ready to fly to Sholazar Basin.',1,1,0,0,0,0, ''),
+(9804,0,1, 'Show me what you have for sale.',3,128,0,0,0,0, ''),
+(9750,0,3, 'Train me.',5,16,0,0,0,0, ''),
+(9724,1,0, 'Have a spare bunch of bananas?',1,1,0,0,0,0, ''),
+(9713,0,0, 'I''m ready to start the distillation, uh, Tipsy.',1,1,0,0,0,0, ''),
+(9720,0,0, 'I want to stop the Scourge as much as you do. How can I help?',1,1,9721,0,0,0, ''),
+(9721,0,0, 'You can trust me. I am no friend of the Lich King''s.',1,1,9722,0,0,0, ''),
+(9722,0,0, 'I will not fail.',1,1,0,0,0,0, ''),
+(9674,0,0, 'You look safe enough... let''s do this.',1,1,0,0,0,0, ''),
+(9677,0,0, '<Reach down and pull the Injured Rainspeaker Oracle to its feet.>',1,1,0,0,0,0, ''),
+(9684,0,0, 'I am ready to travel to your village now.',1,1,0,0,0,0, ''),
+(9678,0,0, 'Shaman Vekjik, I have spoken with the big-tongues and they desire peace. I have brought this offering on their behalf.',1,1,9686,0,0,0, ''),
+(9686,0,0, 'No no... I had no intentions of betraying your people. I was only defending myself. It was all a misunderstanding.',1,1,0,0,0,0, ''),
+(9742,2,0, 'I need to find Jaloot, do you have his favorite crystal?',1,1,0,0,0,0, ''),
+(9728,0,0, '<Check for a pulse...>',1,1,0,0,0,0, ''),
+(2384,0,3, 'I am interested in warlock training.',5,16,0,0,0,0, ''),
+(2384,1,0, 'I wish to unlearn my talents.',16,16,0,0,0,0, ''),
+(2384,2,0, 'I wish to know about Dual Talent Specialization.',1,1,0,0,0,0, ''),
+(1624,0,1, 'I want to browse your goods.',3,128,0,0,0,0, '');
diff --git a/sql/updates/world/2012_01_04_15_world_gossip_menu.sql b/sql/updates/world/2012_01_04_15_world_gossip_menu.sql
new file mode 100644
index 00000000000..38d449640f2
--- /dev/null
+++ b/sql/updates/world/2012_01_04_15_world_gossip_menu.sql
@@ -0,0 +1,26 @@
+-- Gossip Menu insert from sniff
+DELETE FROM `gossip_menu` WHERE `entry`=9475 AND `text_id`=12733;
+INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (9475,12733);
+-- Creature Gossip_menu_id Update from sniff
+UPDATE `creature_template` SET `gossip_menu_id`=9475 WHERE `entry`=27060;
+-- Gossip Menu insert from sniff
+DELETE FROM `gossip_menu` WHERE `entry`=9786 AND `text_id`=13466;
+INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (9786,13466);
+-- Creature Gossip_menu_id Update from sniff
+UPDATE `creature_template` SET `gossip_menu_id`=9574 WHERE `entry`=27659;
+-- Creature Gossip_menu_option Update from sniff
+DELETE FROM `gossip_menu_option` WHERE `menu_id` IN (9574) AND `id` IN (0,1,4);
+INSERT INTO `gossip_menu_option` (`menu_id`,`id`,`option_icon`,`option_text`,`option_id`,`npc_option_npcflag`,`action_menu_id`,`action_poi_id`,`box_coded`,`box_money`,`box_text`) VALUES
+(9574,0,0, 'What should we do next?',1,1,9786,0,0,0, ''),
+(9574,1,0, 'I want to fly on the wings of the Bronze Flight.',1,1,0,0,0,0, ''),
+(9574,4,0, 'What abilities do Amber Drakes have?',1,1,0,0,0,0, '');
+-- Gossip Menu insert from sniff
+DELETE FROM `gossip_menu` WHERE `entry`=9690 AND `text_id`=13157;
+INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (9690,13157);
+-- Creature Gossip_menu_id Update from sniff
+UPDATE `creature_template` SET `gossip_menu_id`=9690 WHERE `entry`=26664;
+-- Gossip Menu insert from sniff
+DELETE FROM `gossip_menu` WHERE `entry`=10009 AND `text_id`=13873;
+INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (10009,13873);
+-- Creature Gossip_menu_id Update from sniff
+UPDATE `creature_template` SET `gossip_menu_id`=10009 WHERE `entry`=30871;
diff --git a/sql/updates/world/2012_01_05_00_world_script_texts.sql b/sql/updates/world/2012_01_05_00_world_script_texts.sql
new file mode 100644
index 00000000000..2fcaaf83e49
--- /dev/null
+++ b/sql/updates/world/2012_01_05_00_world_script_texts.sql
@@ -0,0 +1,2 @@
+UPDATE `script_texts` SET `content_default` = "Noooo! This torture is inhumane! You have what you want... why don't you just kill me?" WHERE `entry`="-1571030";
+UPDATE `script_texts` SET `content_default` = "Pathetic fool! A servant of Malygos would sooner die than aid an enemy..." WHERE `entry`= "-1571024";
diff --git a/sql/updates/world/2012_01_05_01_world_gameobject.sql b/sql/updates/world/2012_01_05_01_world_gameobject.sql
new file mode 100644
index 00000000000..15b2f5dc408
--- /dev/null
+++ b/sql/updates/world/2012_01_05_01_world_gameobject.sql
@@ -0,0 +1,5 @@
+-- Template updates for gameobject 186831 (Saga of the Twins)
+UPDATE `gameobject_template` SET `flags`=`flags`|4 WHERE `entry`=186831; -- Saga of the Twins
+DELETE FROM `gameobject` WHERE `id`=186831;
+INSERT INTO `gameobject` (`guid`,`id`,`map`,`spawnMask`,`phaseMask`,`position_x`,`position_y`,`position_z`,`orientation`,`rotation0`,`rotation1`,`rotation2`,`rotation3`,`spawntimesecs`,`animprogress`,`state`) VALUES
+(216,186831,571,1,1,957.1025,-5308.23,189.3529,2.600535,0,0,0.9636297,0.267241,300,100,1);
diff --git a/sql/updates/world/2012_01_05_02_world_gameobject_template.sql b/sql/updates/world/2012_01_05_02_world_gameobject_template.sql
new file mode 100644
index 00000000000..022c82d539d
--- /dev/null
+++ b/sql/updates/world/2012_01_05_02_world_gameobject_template.sql
@@ -0,0 +1,7 @@
+-- Fixing quest 12234 "Need to Know"
+UPDATE `gameobject_template` SET `flags`=`flags`|4 WHERE `entry`=188675; -- Scarlet Onslaught Daily Orders: Barracks by sniff
+UPDATE `gameobject_template` SET `flags`=`flags`|4 WHERE `entry`=188676; -- Scarlet Onslaught Daily Orders: Abbey by sniff
+UPDATE `gameobject_template` SET `flags`=`flags`|4 WHERE `entry`=188677; -- Scarlet Onslaught Daily Orders: Beach by sniff
+DELETE FROM `gameobject` WHERE `id`=188677;
+INSERT INTO `gameobject` (`guid`,`id`,`map`,`spawnMask`,`phaseMask`,`position_x`,`position_y`,`position_z`,`orientation`,`rotation0`,`rotation1`,`rotation2`,`rotation3`,`spawntimesecs`,`animprogress`,`state`) VALUES
+(219,188677,571,1,1,2567.449,-388.7118,3.573463,-2.879789,0,0,-0.9914446,0.1305283,300,100,1);
diff --git a/sql/updates/world/2012_01_05_03_world_creature_model_info.sql b/sql/updates/world/2012_01_05_03_world_creature_model_info.sql
new file mode 100644
index 00000000000..8da923db96b
--- /dev/null
+++ b/sql/updates/world/2012_01_05_03_world_creature_model_info.sql
@@ -0,0 +1,7 @@
+-- Template updates for creature 31798 (Athan)
+-- Model data 23823 (creature 31798 (Athan))
+UPDATE `creature_model_info` SET `bounding_radius`=2.06,`combat_reach`=0,`gender`=2 WHERE `modelid`=23823; -- Athan
+-- Addon data for creature 31798 (Athan)
+DELETE FROM `creature_template_addon` WHERE `entry`=31798;
+INSERT INTO `creature_template_addon` (`entry`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES
+(31798,0,0,1,0, NULL); -- Athan
diff --git a/sql/updates/world/2012_01_05_04_world_gameobject.sql b/sql/updates/world/2012_01_05_04_world_gameobject.sql
new file mode 100644
index 00000000000..4090eb0c123
--- /dev/null
+++ b/sql/updates/world/2012_01_05_04_world_gameobject.sql
@@ -0,0 +1,4 @@
+-- add South Point Station Valve gameobject
+DELETE FROM `gameobject` WHERE `id`=188109;
+INSERT INTO `gameobject` (`guid`,`id`,`map`,`spawnMask`,`phaseMask`,`position_x`,`position_y`,`position_z`,`orientation`,`rotation0`,`rotation1`,`rotation2`,`rotation3`,`spawntimesecs`,`animprogress`,`state`) VALUES
+(221,188109,571,1,1,3792.77,4808.874,-11.56067,1.483528,0,0,0.6755896,0.7372779,0,0,1);
diff --git a/sql/updates/world/2012_01_05_05_world_creature.sql b/sql/updates/world/2012_01_05_05_world_creature.sql
new file mode 100644
index 00000000000..b902db64ee6
--- /dev/null
+++ b/sql/updates/world/2012_01_05_05_world_creature.sql
@@ -0,0 +1,2 @@
+-- Update position of a Stormforged Raider that was flying
+UPDATE `creature` SET position_X=8471.19, position_Y=-105.686, position_Z=792.018 WHERE guid=114177;
diff --git a/sql/updates/world/2012_01_05_06_world_spell_script_names.sql b/sql/updates/world/2012_01_05_06_world_spell_script_names.sql
new file mode 100644
index 00000000000..1a22c2916bb
--- /dev/null
+++ b/sql/updates/world/2012_01_05_06_world_spell_script_names.sql
@@ -0,0 +1,2 @@
+-- add voices for Currupted Ashbringer
+UPDATE `spell_script_names` SET `spell_id`=28414 WHERE `ScriptName`= 'spell_item_ashbringer';
diff --git a/sql/updates/world/2012_01_05_07_world_creature_template.sql b/sql/updates/world/2012_01_05_07_world_creature_template.sql
new file mode 100644
index 00000000000..b3f0c8aeec6
--- /dev/null
+++ b/sql/updates/world/2012_01_05_07_world_creature_template.sql
@@ -0,0 +1,9 @@
+UPDATE `creature_template` SET `npcflag`=`npcflag`|16777216,`unit_flags`=`unit_flags`|16777216,`spell1`=50978,`spell2`=50980,`spell3`=50985,`spell4`=50983,`spell5`=54166,`VehicleId`=111,`Health_mod`=18,`Mana_mod`=12,`questItem1`=0,`AIName`='',`ScriptName`='' WHERE `entry`=28222;
+
+DELETE FROM `npc_spellclick_spells` WHERE `npc_entry`=28222;
+INSERT INTO `npc_spellclick_spells` (`npc_entry`,`spell_id`,`quest_start`,`quest_start_active`,`quest_end`,`cast_flags`,`aura_required`,`aura_forbidden`,`user_type`) VALUES
+(28222,52082,12546,1,12546,1,0,0,0);
+
+DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=16 AND `SourceEntry`=28222;
+INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`ErrorTextId`,`ScriptName`,`Comment`) VALUES
+(16,0,28222,0,23,4282,0,0,0,'','Ride vehicle only in Area');
diff --git a/sql/updates/world/2012_01_05_08_world_creature_template.sql b/sql/updates/world/2012_01_05_08_world_creature_template.sql
new file mode 100644
index 00000000000..e62617c0914
--- /dev/null
+++ b/sql/updates/world/2012_01_05_08_world_creature_template.sql
@@ -0,0 +1,2 @@
+-- Fix Highlord Nemesis Trainer
+UPDATE `creature_template` SET `unit_flags`=131072,`flags_extra`=262144,`ScriptName`= 'npc_training_dummy' WHERE `entry`=32547;
diff --git a/sql/updates/world/2012_01_05_09_world_waypoint_data.sql b/sql/updates/world/2012_01_05_09_world_waypoint_data.sql
new file mode 100644
index 00000000000..6299472a263
--- /dev/null
+++ b/sql/updates/world/2012_01_05_09_world_waypoint_data.sql
@@ -0,0 +1,73 @@
+-- Spawn & Pathing for Nethervine Inciter Entry: 19511 "Not Spawned"
+SET @NPC := 40252;
+DELETE FROM `creature` WHERE `guid` IN (@NPC);
+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
+(@NPC,19511,553,1,1,0,0,13.71129,556.805,-18.16187,0.41887,300,0,0,1,0,2);
+SET @PATH := @NPC * 10;
+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,34.53745,554.1877,-18.31396,0,0,0,0,100,0),
+(@PATH,2,13.71129,556.805,-18.16187,0,0,0,0,100,0),
+(@PATH,3,-11.50565,559.8253,-18.09619,0,0,0,0,100,0),
+(@PATH,4,-29.17254,568.2135,-17.99052,0,0,0,0,100,0),
+(@PATH,5,-11.50565,559.8253,-18.09619,0,0,0,0,100,0),
+(@PATH,6,13.71129,556.805,-18.16187,0,0,0,0,100,0);
+-- .go 34.53745 554.1877 -18.31396
+
+-- Pathing for Nethervine Inciter Entry: 19511
+SET @NPC := 83086;
+SET @PATH := @NPC * 10;
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=-37.1817,`position_y`=524.0293,`position_z`=-10.16431 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,-21.58225,517.7063,-6.475254,0,0,0,0,100,0),
+(@PATH,2,-9.34382,516.5084,-5.636462,0,0,0,0,100,0),
+(@PATH,3,4.990617,518.1604,-7.138422,0,0,0,0,100,0),
+(@PATH,4,19.44558,526.3201,-11.25785,0,0,0,0,100,0),
+(@PATH,5,23.91135,540.4265,-18.37715,0,0,0,0,100,0),
+(@PATH,6,18.10396,548.5428,-18.3295,0,0,0,0,100,0),
+(@PATH,7,-1.83314,553.5635,-18.1602,0,0,0,0,100,0),
+(@PATH,8,-17.95817,553.2923,-18.19155,0,0,0,0,100,0),
+(@PATH,9,-30.42817,550.3372,-18.30474,0,0,0,0,100,0),
+(@PATH,10,-43.32164,544.6859,-18.35999,0,0,0,0,100,0),
+(@PATH,11,-46.76561,533.5467,-15.89331,0,0,0,0,100,0),
+(@PATH,12,-37.1817,524.0293,-10.16431,0,0,0,0,100,0);
+-- .go -21.58225 517.7063 -6.475254
+
+-- Pathing for Nethervine Inciter Entry: 19511
+SET @NPC := 83072;
+SET @PATH := @NPC * 10;
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=-10.81185,`position_y`=498.6948,`position_z`=-5.355443 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,-10.5063,509.9379,-5.275531,0,0,0,0,100,0),
+(@PATH,2,-10.81185,498.6948,-5.355443,0,0,0,0,100,0),
+(@PATH,3,2.500325,493.4179,-5.437914,0,0,0,0,100,0),
+(@PATH,4,15.09316,496.8965,-5.464271,0,0,0,0,100,0),
+(@PATH,5,2.500325,493.4179,-5.437914,0,0,0,0,100,0),
+(@PATH,6,-10.81185,498.6948,-5.355443,0,0,0,0,100,0);
+-- .go -10.5063 509.9379 -5.275531
+
+-- Pathing for Nethervine Inciter Entry: 19511
+SET @NPC := 83073;
+SET @PATH := @NPC * 10;
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=-6.525395,`position_y`=482.9323,`position_z`=-5.492778 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,1.63937,482.4999,-5.53459,0,0,0,0,100,0),
+(@PATH,2,-6.525395,482.9323,-5.492778,0,0,0,0,100,0),
+(@PATH,3,-13.81937,488.856,-5.425375,0,0,0,0,100,0),
+(@PATH,4,-17.63536,496.55,-5.370692,0,0,0,0,100,0),
+(@PATH,5,-16.29433,503.0782,-5.324292,0,0,0,0,100,0),
+(@PATH,6,-17.63536,496.55,-5.370692,0,0,0,0,100,0),
+(@PATH,7,-13.81937,488.856,-5.425375,0,0,0,0,100,0),
+(@PATH,8,-6.525395,482.9323,-5.492778,0,0,0,0,100,0);
+-- .go 1.63937 482.4999 -5.53459
diff --git a/sql/updates/world/2012_01_05_10_world_creature_template.sql b/sql/updates/world/2012_01_05_10_world_creature_template.sql
new file mode 100644
index 00000000000..a3d8d2432b5
--- /dev/null
+++ b/sql/updates/world/2012_01_05_10_world_creature_template.sql
@@ -0,0 +1,2 @@
+-- Set correct immunemasks for Scourgelord Tyrannus
+UPDATE `creature_template` SET `mechanic_immune_mask` = mechanic_immune_mask|1|2|4|16|32|64|128|256|512|1024|2048|4096|8192|131072|4194304|8388608|67108864|536870912 WHERE `entry` in (36658,36938);
diff --git a/sql/updates/world/2012_01_05_11_world_creature_onkill_reputation.sql b/sql/updates/world/2012_01_05_11_world_creature_onkill_reputation.sql
new file mode 100644
index 00000000000..047c0453608
--- /dev/null
+++ b/sql/updates/world/2012_01_05_11_world_creature_onkill_reputation.sql
@@ -0,0 +1,6 @@
+-- remade incorrect gain of ashen verdict reputation according to http://www.wowwiki.com/Ashen_Verdict
+-- there were incorrect values for trash mobs ( before=25 for kill, must to be 15)
+-- for Lich King it must to be 1500 and for Deathbound Wards and Deathspeaker High Priests 45
+UPDATE `creature_onkill_reputation` SET `RewOnKillRepValue1` = 1500 WHERE `creature_id` IN (36597,39166,39167,39168);
+UPDATE `creature_onkill_reputation` SET `RewOnKillRepValue1` = 45 WHERE `creature_id` IN (36829,37007);
+UPDATE `creature_onkill_reputation` SET `RewOnKillRepValue1` = 15 WHERE `creature_id` IN (36619,36724,36725,36791,36805,36807,36808,36811,36880,36957,36960,36968,36982,37011,37012,37022,37029,37030,37031,37032,37033,37034,37035,37117,37125,37127,37132,37133,37134,37146,37149,37228,37229,37232,37501,37502,37531,37532,37546,37571,37595,37662,37663,37664,37665,37666,37695,37782,37886,37890,37919,37934,37949,38125,38159,38184,38369,38472,38485,38508,38711,38712);
diff --git a/sql/updates/world/2012_01_05_12_world_game_event_seasonal_questrelation.sql b/sql/updates/world/2012_01_05_12_world_game_event_seasonal_questrelation.sql
new file mode 100644
index 00000000000..ad6013b0edf
--- /dev/null
+++ b/sql/updates/world/2012_01_05_12_world_game_event_seasonal_questrelation.sql
@@ -0,0 +1,5 @@
+UPDATE `game_event_seasonal_questrelation` SET `event`=8 WHERE `event`=-1;
+
+ALTER TABLE `game_event_seasonal_questrelation`
+ CHANGE `quest` `questId` int(10) unsigned NOT NULL COMMENT 'Quest Identifier',
+ CHANGE `event` `eventEntry` mediumint(8) unsigned NOT NULL DEFAULT 0 COMMENT 'Entry of the game event';
diff --git a/sql/updates/world/2012_01_05_13_world_creature_transport.sql b/sql/updates/world/2012_01_05_13_world_creature_transport.sql
new file mode 100644
index 00000000000..3acb70a4442
--- /dev/null
+++ b/sql/updates/world/2012_01_05_13_world_creature_transport.sql
@@ -0,0 +1,2 @@
+-- put Brother Keltan on the correct ship
+UPDATE `creature_transport` SET `guid`=1, `transport_entry`=192241, `TransOffsetX`=-24.08398, `TransOffsetY`=-22.21777, `TransOffsetZ`=24.37781 WHERE `guid`=66 AND `transport_entry`=192242;
diff --git a/sql/updates/world/2012_01_05_14_world_command.sql b/sql/updates/world/2012_01_05_14_world_command.sql
new file mode 100644
index 00000000000..d890ab5509c
--- /dev/null
+++ b/sql/updates/world/2012_01_05_14_world_command.sql
@@ -0,0 +1 @@
+INSERT INTO `command` (`name`, `security`, `help`) VALUES ('reload wp_data', 3, 'Syntax: .reload wp_data will reload waypoint_data table.');
diff --git a/sql/updates/world/2012_01_05_14_world_creature_template.sql b/sql/updates/world/2012_01_05_14_world_creature_template.sql
new file mode 100644
index 00000000000..331a533812d
--- /dev/null
+++ b/sql/updates/world/2012_01_05_14_world_creature_template.sql
@@ -0,0 +1,9 @@
+-- Added equipment template, corrected unit_flags and fixed model bounding for The Etymidian
+SET @EQUIP := 2477;
+
+UPDATE `creature_template` SET `unit_flags`=`unit_flags`|8,`equipment_id`=@EQUIP WHERE `entry`=28222;
+UPDATE `creature_model_info` SET `bounding_radius`=0.42,`combat_reach`=2.4 WHERE `modelid`=25928;
+
+DELETE FROM `creature_equip_template` WHERE `entry`=@EQUIP;
+INSERT INTO `creature_equip_template` (`entry`,`itemEntry1`,`itemEntry2`,`itemEntry3`) VALUES
+(@EQUIP,25316,0,0);
diff --git a/sql/updates/world/2012_01_06_00_world_misc.sql b/sql/updates/world/2012_01_06_00_world_misc.sql
new file mode 100644
index 00000000000..5cc96ef17a8
--- /dev/null
+++ b/sql/updates/world/2012_01_06_00_world_misc.sql
@@ -0,0 +1,189 @@
+SET @NPC_SIMON_BUNNY := 22923;
+SET @GO_APEXIS_RELIC := 185890;
+SET @GO_APEXIS_MONUMENT := 185944;
+
+SET @SPELL_SIMON_BLUE_VISUAL := 40244;
+SET @SPELL_SIMON_GREEN_VISUAL := 40245;
+SET @SPELL_SIMON_RED_VISUAL := 40246;
+SET @SPELL_SIMON_YELLOW_VISUAL := 40247;
+
+SET @ITEM_APEXIS_SHARD := 32569;
+SET @QUEST_THE_CRYSTALS := 11025;
+SET @QUEST_GUARDIAN_MONUMENT := 11059;
+SET @GOSSIP_MENU_ID_NORMAL := 8703;
+SET @GOSSIP_MENU_ID_LARGE := 8704;
+
+SET @ID_SPELL_GROUP := 1115;
+
+UPDATE `creature_template` SET `ScriptName` = 'npc_simon_bunny',`flags_extra` = 130 WHERE `entry` = @NPC_SIMON_BUNNY;
+UPDATE `gameobject_template` SET `ScriptName` = 'go_apexis_relic' WHERE `entry` IN (@GO_APEXIS_MONUMENT,@GO_APEXIS_RELIC);
+-- Update is done via displayid since there are 28 entries for each color
+UPDATE `gameobject_template` SET `flags` = 16,`ScriptName` = 'go_simon_cluster' WHERE `displayId` IN (7364,7365,7366,7367,7369,7371,7373,7375);
+
+-- Spell stacking rules for Introspection and Apexis reward spells
+DELETE FROM `spell_group` WHERE `spell_id` IN (40055,40165,40166,40167,40623,40625,40626);
+INSERT INTO `spell_group` (`id`,`spell_id`) VALUES
+(@ID_SPELL_GROUP+0,40055),
+(@ID_SPELL_GROUP+0,40165),
+(@ID_SPELL_GROUP+0,40166),
+(@ID_SPELL_GROUP+0,40167),
+(@ID_SPELL_GROUP+1,40623),
+(@ID_SPELL_GROUP+1,40625),
+(@ID_SPELL_GROUP+1,40626);
+
+DELETE FROM `spell_group_stack_rules` WHERE `group_id` IN (@ID_SPELL_GROUP,@ID_SPELL_GROUP+1);
+INSERT INTO `spell_group_stack_rules` (`group_id`,`stack_rule`) VALUES
+(@ID_SPELL_GROUP+0,1),
+(@ID_SPELL_GROUP+1,1);
+--
+
+DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId` = 13 AND `SourceEntry` IN (@SPELL_SIMON_BLUE_VISUAL,@SPELL_SIMON_GREEN_VISUAL,@SPELL_SIMON_RED_VISUAL,@SPELL_SIMON_YELLOW_VISUAL);
+DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId` = 15 AND `SourceGroup` IN (@GOSSIP_MENU_ID_NORMAL,@GOSSIP_MENU_ID_LARGE);
+INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`ErrorTextId`,`ScriptName`,`Comment`) VALUES
+-- Apexis Relic gossip option conditions
+(15,@GOSSIP_MENU_ID_NORMAL,0,0,8,@QUEST_THE_CRYSTALS ,0,0,0,'','Apexis Relic Gossip Condition - Must have completed quest The Crystals'),
+(15,@GOSSIP_MENU_ID_NORMAL,0,0,2,@ITEM_APEXIS_SHARD,1,0,0,'','Apexis Relic Gossip Condition - Must have an Apexis Shard'),
+-- Apexis Monument gossip option conditions
+(15,@GOSSIP_MENU_ID_LARGE,0,0,9,@QUEST_GUARDIAN_MONUMENT ,0,0,0,'','Apexis Monument Gossip Condition - Must be on quest Guardian of the Monument'),
+(15,@GOSSIP_MENU_ID_LARGE,0,0,2,@ITEM_APEXIS_SHARD,35,0,0,'','Apexis Monument Gossip Condition - Must have 35 Apexis Shard'),
+-- Visual color spells should target their correspondant cluster color
+(13,0,@SPELL_SIMON_BLUE_VISUAL,0,18,0,185604,0,0,'','Simon Game - Blue visual target Large Blue Cluster'),
+(13,0,@SPELL_SIMON_BLUE_VISUAL,0,18,0,185609,0,0,'','Simon Game - Blue visual target Blue Cluster'),
+(13,0,@SPELL_SIMON_BLUE_VISUAL,0,18,0,185617,0,0,'','Simon Game - Blue visual target Blue Cluster'),
+(13,0,@SPELL_SIMON_BLUE_VISUAL,0,18,0,185625,0,0,'','Simon Game - Blue visual target Blue Cluster'),
+(13,0,@SPELL_SIMON_BLUE_VISUAL,0,18,0,185637,0,0,'','Simon Game - Blue visual target Blue Cluster'),
+(13,0,@SPELL_SIMON_BLUE_VISUAL,0,18,0,185640,0,0,'','Simon Game - Blue visual target Large Blue Cluster'),
+(13,0,@SPELL_SIMON_BLUE_VISUAL,0,18,0,185647,0,0,'','Simon Game - Blue visual target Blue Cluster'),
+(13,0,@SPELL_SIMON_BLUE_VISUAL,0,18,0,185649,0,0,'','Simon Game - Blue visual target Blue Cluster'),
+(13,0,@SPELL_SIMON_BLUE_VISUAL,0,18,0,185652,0,0,'','Simon Game - Blue visual target Blue Cluster'),
+(13,0,@SPELL_SIMON_BLUE_VISUAL,0,18,0,185659,0,0,'','Simon Game - Blue visual target Blue Cluster'),
+(13,0,@SPELL_SIMON_BLUE_VISUAL,0,18,0,185660,0,0,'','Simon Game - Blue visual target Large Blue Cluster'),
+(13,0,@SPELL_SIMON_BLUE_VISUAL,0,18,0,185665,0,0,'','Simon Game - Blue visual target Blue Cluster'),
+(13,0,@SPELL_SIMON_BLUE_VISUAL,0,18,0,185669,0,0,'','Simon Game - Blue visual target Blue Cluster'),
+(13,0,@SPELL_SIMON_BLUE_VISUAL,0,18,0,185673,0,0,'','Simon Game - Blue visual target Blue Cluster'),
+(13,0,@SPELL_SIMON_BLUE_VISUAL,0,18,0,185770,0,0,'','Simon Game - Blue visual target Blue Cluster'),
+(13,0,@SPELL_SIMON_BLUE_VISUAL,0,18,0,185772,0,0,'','Simon Game - Blue visual target Blue Cluster'),
+(13,0,@SPELL_SIMON_BLUE_VISUAL,0,18,0,185776,0,0,'','Simon Game - Blue visual target Large Blue Cluster'),
+(13,0,@SPELL_SIMON_BLUE_VISUAL,0,18,0,185780,0,0,'','Simon Game - Blue visual target Blue Cluster'),
+(13,0,@SPELL_SIMON_BLUE_VISUAL,0,18,0,185784,0,0,'','Simon Game - Blue visual target Blue Cluster'),
+(13,0,@SPELL_SIMON_BLUE_VISUAL,0,18,0,185791,0,0,'','Simon Game - Blue visual target Blue Cluster'),
+(13,0,@SPELL_SIMON_BLUE_VISUAL,0,18,0,185795,0,0,'','Simon Game - Blue visual target Large Blue Cluster'),
+(13,0,@SPELL_SIMON_BLUE_VISUAL,0,18,0,185796,0,0,'','Simon Game - Blue visual target Blue Cluster'),
+(13,0,@SPELL_SIMON_BLUE_VISUAL,0,18,0,185807,0,0,'','Simon Game - Blue visual target Blue Cluster'),
+(13,0,@SPELL_SIMON_BLUE_VISUAL,0,18,0,185808,0,0,'','Simon Game - Blue visual target Blue Cluster'),
+(13,0,@SPELL_SIMON_BLUE_VISUAL,0,18,0,185812,0,0,'','Simon Game - Blue visual target Blue Cluster'),
+(13,0,@SPELL_SIMON_BLUE_VISUAL,0,18,0,185816,0,0,'','Simon Game - Blue visual target Large Blue Cluster'),
+(13,0,@SPELL_SIMON_BLUE_VISUAL,0,18,0,185820,0,0,'','Simon Game - Blue visual target Blue Cluster'),
+(13,0,@SPELL_SIMON_BLUE_VISUAL,0,18,0,185824,0,0,'','Simon Game - Blue visual target Blue Cluster'),
+(13,0,@SPELL_SIMON_BLUE_VISUAL,0,18,0,185828,0,0,'','Simon Game - Blue visual target Blue Cluster'),
+(13,0,@SPELL_SIMON_BLUE_VISUAL,0,18,0,185832,0,0,'','Simon Game - Blue visual target Blue Cluster'),
+(13,0,@SPELL_SIMON_BLUE_VISUAL,0,18,0,185836,0,0,'','Simon Game - Blue visual target Blue Cluster'),
+(13,0,@SPELL_SIMON_BLUE_VISUAL,0,18,0,185840,0,0,'','Simon Game - Blue visual target Blue Cluster'),
+(13,0,@SPELL_SIMON_BLUE_VISUAL,0,18,0,185844,0,0,'','Simon Game - Blue visual target Large Blue Cluster'),
+(13,0,@SPELL_SIMON_BLUE_VISUAL,0,18,0,185848,0,0,'','Simon Game - Blue visual target Blue Cluster'),
+(13,0,@SPELL_SIMON_BLUE_VISUAL,0,18,0,185853,0,0,'','Simon Game - Blue visual target Blue Cluster'),
+(13,0,@SPELL_SIMON_GREEN_VISUAL,0,18,0,185605,0,0,'','Simon Game - Green visual target Large Green Cluster'),
+(13,0,@SPELL_SIMON_GREEN_VISUAL,0,18,0,185611,0,0,'','Simon Game - Green visual target Green Cluster'),
+(13,0,@SPELL_SIMON_GREEN_VISUAL,0,18,0,185619,0,0,'','Simon Game - Green visual target Green Cluster'),
+(13,0,@SPELL_SIMON_GREEN_VISUAL,0,18,0,185627,0,0,'','Simon Game - Green visual target Green Cluster'),
+(13,0,@SPELL_SIMON_GREEN_VISUAL,0,18,0,185639,0,0,'','Simon Game - Green visual target Green Cluster'),
+(13,0,@SPELL_SIMON_GREEN_VISUAL,0,18,0,185641,0,0,'','Simon Game - Green visual target Large Green Cluster'),
+(13,0,@SPELL_SIMON_GREEN_VISUAL,0,18,0,185646,0,0,'','Simon Game - Green visual target Green Cluster'),
+(13,0,@SPELL_SIMON_GREEN_VISUAL,0,18,0,185651,0,0,'','Simon Game - Green visual target Green Cluster'),
+(13,0,@SPELL_SIMON_GREEN_VISUAL,0,18,0,185654,0,0,'','Simon Game - Green visual target Green Cluster'),
+(13,0,@SPELL_SIMON_GREEN_VISUAL,0,18,0,185658,0,0,'','Simon Game - Green visual target Green Cluster'),
+(13,0,@SPELL_SIMON_GREEN_VISUAL,0,18,0,185661,0,0,'','Simon Game - Green visual target Large Green Cluster'),
+(13,0,@SPELL_SIMON_GREEN_VISUAL,0,18,0,185667,0,0,'','Simon Game - Green visual target Green Cluster'),
+(13,0,@SPELL_SIMON_GREEN_VISUAL,0,18,0,185671,0,0,'','Simon Game - Green visual target Green Cluster'),
+(13,0,@SPELL_SIMON_GREEN_VISUAL,0,18,0,185675,0,0,'','Simon Game - Green visual target Green Cluster'),
+(13,0,@SPELL_SIMON_GREEN_VISUAL,0,18,0,185768,0,0,'','Simon Game - Green visual target Green Cluster'),
+(13,0,@SPELL_SIMON_GREEN_VISUAL,0,18,0,185774,0,0,'','Simon Game - Green visual target Green Cluster'),
+(13,0,@SPELL_SIMON_GREEN_VISUAL,0,18,0,185777,0,0,'','Simon Game - Green visual target Large Green Cluster'),
+(13,0,@SPELL_SIMON_GREEN_VISUAL,0,18,0,185781,0,0,'','Simon Game - Green visual target Green Cluster'),
+(13,0,@SPELL_SIMON_GREEN_VISUAL,0,18,0,185786,0,0,'','Simon Game - Green visual target Green Cluster'),
+(13,0,@SPELL_SIMON_GREEN_VISUAL,0,18,0,185789,0,0,'','Simon Game - Green visual target Green Cluster'),
+(13,0,@SPELL_SIMON_GREEN_VISUAL,0,18,0,185793,0,0,'','Simon Game - Green visual target Large Green Cluster'),
+(13,0,@SPELL_SIMON_GREEN_VISUAL,0,18,0,185798,0,0,'','Simon Game - Green visual target Green Cluster'),
+(13,0,@SPELL_SIMON_GREEN_VISUAL,0,18,0,185805,0,0,'','Simon Game - Green visual target Green Cluster'),
+(13,0,@SPELL_SIMON_GREEN_VISUAL,0,18,0,185810,0,0,'','Simon Game - Green visual target Green Cluster'),
+(13,0,@SPELL_SIMON_GREEN_VISUAL,0,18,0,185814,0,0,'','Simon Game - Green visual target Green Cluster'),
+(13,0,@SPELL_SIMON_GREEN_VISUAL,0,18,0,185818,0,0,'','Simon Game - Green visual target Large Green Cluster'),
+(13,0,@SPELL_SIMON_GREEN_VISUAL,0,18,0,185822,0,0,'','Simon Game - Green visual target Green Cluster'),
+(13,0,@SPELL_SIMON_GREEN_VISUAL,0,18,0,185826,0,0,'','Simon Game - Green visual target Green Cluster'),
+(13,0,@SPELL_SIMON_GREEN_VISUAL,0,18,0,185830,0,0,'','Simon Game - Green visual target Green Cluster'),
+(13,0,@SPELL_SIMON_GREEN_VISUAL,0,18,0,185834,0,0,'','Simon Game - Green visual target Green Cluster'),
+(13,0,@SPELL_SIMON_GREEN_VISUAL,0,18,0,185838,0,0,'','Simon Game - Green visual target Green Cluster'),
+(13,0,@SPELL_SIMON_GREEN_VISUAL,0,18,0,185842,0,0,'','Simon Game - Green visual target Green Cluster'),
+(13,0,@SPELL_SIMON_GREEN_VISUAL,0,18,0,185846,0,0,'','Simon Game - Green visual target Large Green Cluster'),
+(13,0,@SPELL_SIMON_GREEN_VISUAL,0,18,0,185850,0,0,'','Simon Game - Green visual target Green Cluster'),
+(13,0,@SPELL_SIMON_GREEN_VISUAL,0,18,0,185855,0,0,'','Simon Game - Green visual target Green Cluster'),
+(13,0,@SPELL_SIMON_RED_VISUAL,0,18,0,185606,0,0,'','Simon Game - Red visual target Large Red Cluster'),
+(13,0,@SPELL_SIMON_RED_VISUAL,0,18,0,185613,0,0,'','Simon Game - Red visual target Red Cluster'),
+(13,0,@SPELL_SIMON_RED_VISUAL,0,18,0,185621,0,0,'','Simon Game - Red visual target Red Cluster'),
+(13,0,@SPELL_SIMON_RED_VISUAL,0,18,0,185626,0,0,'','Simon Game - Red visual target Red Cluster'),
+(13,0,@SPELL_SIMON_RED_VISUAL,0,18,0,185638,0,0,'','Simon Game - Red visual target Red Cluster'),
+(13,0,@SPELL_SIMON_RED_VISUAL,0,18,0,185642,0,0,'','Simon Game - Red visual target Large Red Cluster'),
+(13,0,@SPELL_SIMON_RED_VISUAL,0,18,0,185645,0,0,'','Simon Game - Red visual target Red Cluster'),
+(13,0,@SPELL_SIMON_RED_VISUAL,0,18,0,185650,0,0,'','Simon Game - Red visual target Red Cluster'),
+(13,0,@SPELL_SIMON_RED_VISUAL,0,18,0,185655,0,0,'','Simon Game - Red visual target Red Cluster'),
+(13,0,@SPELL_SIMON_RED_VISUAL,0,18,0,185657,0,0,'','Simon Game - Red visual target Red Cluster'),
+(13,0,@SPELL_SIMON_RED_VISUAL,0,18,0,185662,0,0,'','Simon Game - Red visual target Large Red Cluster'),
+(13,0,@SPELL_SIMON_RED_VISUAL,0,18,0,185666,0,0,'','Simon Game - Red visual target Red Cluster'),
+(13,0,@SPELL_SIMON_RED_VISUAL,0,18,0,185670,0,0,'','Simon Game - Red visual target Red Cluster'),
+(13,0,@SPELL_SIMON_RED_VISUAL,0,18,0,185674,0,0,'','Simon Game - Red visual target Red Cluster'),
+(13,0,@SPELL_SIMON_RED_VISUAL,0,18,0,185771,0,0,'','Simon Game - Red visual target Red Cluster'),
+(13,0,@SPELL_SIMON_RED_VISUAL,0,18,0,185773,0,0,'','Simon Game - Red visual target Red Cluster'),
+(13,0,@SPELL_SIMON_RED_VISUAL,0,18,0,185778,0,0,'','Simon Game - Red visual target Large Red Cluster'),
+(13,0,@SPELL_SIMON_RED_VISUAL,0,18,0,185782,0,0,'','Simon Game - Red visual target Red Cluster'),
+(13,0,@SPELL_SIMON_RED_VISUAL,0,18,0,185785,0,0,'','Simon Game - Red visual target Red Cluster'),
+(13,0,@SPELL_SIMON_RED_VISUAL,0,18,0,185788,0,0,'','Simon Game - Red visual target Red Cluster'),
+(13,0,@SPELL_SIMON_RED_VISUAL,0,18,0,185794,0,0,'','Simon Game - Red visual target Large Red Cluster'),
+(13,0,@SPELL_SIMON_RED_VISUAL,0,18,0,185797,0,0,'','Simon Game - Red visual target Red Cluster'),
+(13,0,@SPELL_SIMON_RED_VISUAL,0,18,0,185804,0,0,'','Simon Game - Red visual target Red Cluster'),
+(13,0,@SPELL_SIMON_RED_VISUAL,0,18,0,185809,0,0,'','Simon Game - Red visual target Red Cluster'),
+(13,0,@SPELL_SIMON_RED_VISUAL,0,18,0,185815,0,0,'','Simon Game - Red visual target Red Cluster'),
+(13,0,@SPELL_SIMON_RED_VISUAL,0,18,0,185817,0,0,'','Simon Game - Red visual target Large Red Cluster'),
+(13,0,@SPELL_SIMON_RED_VISUAL,0,18,0,185823,0,0,'','Simon Game - Red visual target Red Cluster'),
+(13,0,@SPELL_SIMON_RED_VISUAL,0,18,0,185827,0,0,'','Simon Game - Red visual target Red Cluster'),
+(13,0,@SPELL_SIMON_RED_VISUAL,0,18,0,185831,0,0,'','Simon Game - Red visual target Red Cluster'),
+(13,0,@SPELL_SIMON_RED_VISUAL,0,18,0,185835,0,0,'','Simon Game - Red visual target Red Cluster'),
+(13,0,@SPELL_SIMON_RED_VISUAL,0,18,0,185839,0,0,'','Simon Game - Red visual target Red Cluster'),
+(13,0,@SPELL_SIMON_RED_VISUAL,0,18,0,185843,0,0,'','Simon Game - Red visual target Red Cluster'),
+(13,0,@SPELL_SIMON_RED_VISUAL,0,18,0,185845,0,0,'','Simon Game - Red visual target Large Red Cluster'),
+(13,0,@SPELL_SIMON_RED_VISUAL,0,18,0,185851,0,0,'','Simon Game - Red visual target Red Cluster'),
+(13,0,@SPELL_SIMON_RED_VISUAL,0,18,0,185854,0,0,'','Simon Game - Red visual target Red Cluster'),
+(13,0,@SPELL_SIMON_YELLOW_VISUAL,0,18,0,185607,0,0,'','Simon Game - Yellow visual target Large Yellow Cluster'),
+(13,0,@SPELL_SIMON_YELLOW_VISUAL,0,18,0,185615,0,0,'','Simon Game - Yellow visual target Yellow Cluster'),
+(13,0,@SPELL_SIMON_YELLOW_VISUAL,0,18,0,185623,0,0,'','Simon Game - Yellow visual target Yellow Cluster'),
+(13,0,@SPELL_SIMON_YELLOW_VISUAL,0,18,0,185624,0,0,'','Simon Game - Yellow visual target Yellow Cluster'),
+(13,0,@SPELL_SIMON_YELLOW_VISUAL,0,18,0,185636,0,0,'','Simon Game - Yellow visual target Yellow Cluster'),
+(13,0,@SPELL_SIMON_YELLOW_VISUAL,0,18,0,185643,0,0,'','Simon Game - Yellow visual target Large Yellow Cluster'),
+(13,0,@SPELL_SIMON_YELLOW_VISUAL,0,18,0,185644,0,0,'','Simon Game - Yellow visual target Yellow Cluster'),
+(13,0,@SPELL_SIMON_YELLOW_VISUAL,0,18,0,185648,0,0,'','Simon Game - Yellow visual target Yellow Cluster'),
+(13,0,@SPELL_SIMON_YELLOW_VISUAL,0,18,0,185653,0,0,'','Simon Game - Yellow visual target Yellow Cluster'),
+(13,0,@SPELL_SIMON_YELLOW_VISUAL,0,18,0,185656,0,0,'','Simon Game - Yellow visual target Yellow Cluster'),
+(13,0,@SPELL_SIMON_YELLOW_VISUAL,0,18,0,185663,0,0,'','Simon Game - Yellow visual target Large Yellow Cluster'),
+(13,0,@SPELL_SIMON_YELLOW_VISUAL,0,18,0,185664,0,0,'','Simon Game - Yellow visual target Yellow Cluster'),
+(13,0,@SPELL_SIMON_YELLOW_VISUAL,0,18,0,185668,0,0,'','Simon Game - Yellow visual target Yellow Cluster'),
+(13,0,@SPELL_SIMON_YELLOW_VISUAL,0,18,0,185672,0,0,'','Simon Game - Yellow visual target Yellow Cluster'),
+(13,0,@SPELL_SIMON_YELLOW_VISUAL,0,18,0,185769,0,0,'','Simon Game - Yellow visual target Yellow Cluster'),
+(13,0,@SPELL_SIMON_YELLOW_VISUAL,0,18,0,185775,0,0,'','Simon Game - Yellow visual target Yellow Cluster'),
+(13,0,@SPELL_SIMON_YELLOW_VISUAL,0,18,0,185779,0,0,'','Simon Game - Yellow visual target Large Yellow Cluster'),
+(13,0,@SPELL_SIMON_YELLOW_VISUAL,0,18,0,185783,0,0,'','Simon Game - Yellow visual target Yellow Cluster'),
+(13,0,@SPELL_SIMON_YELLOW_VISUAL,0,18,0,185787,0,0,'','Simon Game - Yellow visual target Yellow Cluster'),
+(13,0,@SPELL_SIMON_YELLOW_VISUAL,0,18,0,185790,0,0,'','Simon Game - Yellow visual target Yellow Cluster'),
+(13,0,@SPELL_SIMON_YELLOW_VISUAL,0,18,0,185792,0,0,'','Simon Game - Yellow visual target Large Yellow Cluster'),
+(13,0,@SPELL_SIMON_YELLOW_VISUAL,0,18,0,185803,0,0,'','Simon Game - Yellow visual target Yellow Cluster'),
+(13,0,@SPELL_SIMON_YELLOW_VISUAL,0,18,0,185806,0,0,'','Simon Game - Yellow visual target Yellow Cluster'),
+(13,0,@SPELL_SIMON_YELLOW_VISUAL,0,18,0,185811,0,0,'','Simon Game - Yellow visual target Yellow Cluster'),
+(13,0,@SPELL_SIMON_YELLOW_VISUAL,0,18,0,185813,0,0,'','Simon Game - Yellow visual target Yellow Cluster'),
+(13,0,@SPELL_SIMON_YELLOW_VISUAL,0,18,0,185819,0,0,'','Simon Game - Yellow visual target Large Yellow Cluster'),
+(13,0,@SPELL_SIMON_YELLOW_VISUAL,0,18,0,185821,0,0,'','Simon Game - Yellow visual target Yellow Cluster'),
+(13,0,@SPELL_SIMON_YELLOW_VISUAL,0,18,0,185825,0,0,'','Simon Game - Yellow visual target Yellow Cluster'),
+(13,0,@SPELL_SIMON_YELLOW_VISUAL,0,18,0,185829,0,0,'','Simon Game - Yellow visual target Yellow Cluster'),
+(13,0,@SPELL_SIMON_YELLOW_VISUAL,0,18,0,185833,0,0,'','Simon Game - Yellow visual target Yellow Cluster'),
+(13,0,@SPELL_SIMON_YELLOW_VISUAL,0,18,0,185837,0,0,'','Simon Game - Yellow visual target Yellow Cluster'),
+(13,0,@SPELL_SIMON_YELLOW_VISUAL,0,18,0,185841,0,0,'','Simon Game - Yellow visual target Yellow Cluster'),
+(13,0,@SPELL_SIMON_YELLOW_VISUAL,0,18,0,185847,0,0,'','Simon Game - Yellow visual target Large Yellow Cluster'),
+(13,0,@SPELL_SIMON_YELLOW_VISUAL,0,18,0,185849,0,0,'','Simon Game - Yellow visual target Yellow Cluster'),
+(13,0,@SPELL_SIMON_YELLOW_VISUAL,0,18,0,185852,0,0,'','Simon Game - Yellow visual target Yellow Cluster'); \ No newline at end of file
diff --git a/sql/updates/world/2012_01_06_01_world_creature_template.sql b/sql/updates/world/2012_01_06_01_world_creature_template.sql
new file mode 100644
index 00000000000..c089209c16f
--- /dev/null
+++ b/sql/updates/world/2012_01_06_01_world_creature_template.sql
@@ -0,0 +1,2 @@
+-- spell interrupt is loaded from DBC so can be removed from mechanic_immune_mask
+UPDATE `creature_template` SET `mechanic_immune_mask`=`mechanic_immune_mask` &~33554432;
diff --git a/sql/updates/world/2012_01_06_02_world_achievement_criteria_data.sql b/sql/updates/world/2012_01_06_02_world_achievement_criteria_data.sql
new file mode 100644
index 00000000000..9e6dddfb949
--- /dev/null
+++ b/sql/updates/world/2012_01_06_02_world_achievement_criteria_data.sql
@@ -0,0 +1,24 @@
+DELETE FROM `achievement_criteria_data` WHERE criteria_id IN (5220, 5215, 5218, 5221, 5216, 5219, 5213, 5018, 5217, 5214, 5233, 5235, 5232, 5234, 5238, 5236, 5229, 5237, 5230, 5231);
+INSERT INTO `achievement_criteria_data` VALUES
+-- Classes
+(5220,21, 1,0,''), -- Realm First! Level 80 Warrior
+(5215,21, 2,0,''), -- Realm First! Level 80 Paladin
+(5218,21, 3,0,''), -- Realm First! Level 80 Hunter
+(5221,21, 4,0,''), -- Realm First! Level 80 Rogue
+(5216,21, 5,0,''), -- Realm First! Level 80 Priest
+(5219,21, 6,0,''), -- Realm First! Level 80 Death Knight
+(5213,21, 7,0,''), -- Realm First! Level 80 Shaman
+(5018,21, 8,0,''), -- Realm First! Level 80 Mage
+(5217,21, 9,0,''), -- Realm First! Level 80 Warlock
+(5214,21,11,0,''), -- Realm First! Level 80 Druid
+-- Races
+(5233,21,0,1,''), -- Realm First! Level 80 Human
+(5235,21,0,2,''), -- Realm First! Level 80 Orc
+(5232,21,0,3,''), -- Realm First! Level 80 Dwarf
+(5234,21,0,4,''), -- Realm First! Level 80 Night Elf
+(5238,21,0,5,''), -- Realm First! Level 80 Undead
+(5236,21,0,6,''), -- Realm First! Level 80 Tauren
+(5229,21,0,7,''), -- Realm First! Level 80 Gnome
+(5237,21,0,8,''), -- Realm First! Level 80 Troll
+(5230,21,0,10,''), -- Realm First! Level 80 Blood Elf
+(5231,21,0,11,''); -- Realm First! Level 80 Draenei
diff --git a/sql/updates/world/2012_01_06_03_world_item_loot_template.sql b/sql/updates/world/2012_01_06_03_world_item_loot_template.sql
new file mode 100644
index 00000000000..e1d6cd94525
--- /dev/null
+++ b/sql/updates/world/2012_01_06_03_world_item_loot_template.sql
@@ -0,0 +1,8 @@
+-- Fix Decoy! (8606) quest items drop chance from Narain's Special Kit (21042)
+SET @Kit := 21042;
+DELETE FROM `item_loot_template` WHERE `entry`= @Kit;
+INSERT INTO `item_loot_template` VALUES
+(@Kit, 21037, 100, 1, 0, 1, 1), -- Crude Map
+(@Kit, 21039, 100, 1, 0, 1, 1), -- Narain's Turban
+(@Kit, 21040, 100, 1, 0, 1, 1), -- Narain's Robe
+(@Kit, 21041, 100, 1, 0, 1, 1); -- Bag of Gold
diff --git a/sql/updates/world/2012_01_06_04_world_creature_questrelation.sql b/sql/updates/world/2012_01_06_04_world_creature_questrelation.sql
new file mode 100644
index 00000000000..e1dce65f3bc
--- /dev/null
+++ b/sql/updates/world/2012_01_06_04_world_creature_questrelation.sql
@@ -0,0 +1,5 @@
+-- Fix Captain Vimes questrelation
+DELETE FROM `creature_questrelation` WHERE `quest`=1220;
+INSERT INTO `creature_questrelation` (`id`,`quest`) VALUES
+(4947,1220),
+(23951,1220);
diff --git a/sql/updates/world/2012_01_06_05_world_creature_template.sql b/sql/updates/world/2012_01_06_05_world_creature_template.sql
new file mode 100644
index 00000000000..412fab4dab2
--- /dev/null
+++ b/sql/updates/world/2012_01_06_05_world_creature_template.sql
@@ -0,0 +1,2 @@
+-- Creatures with EAI flag set but no EAI script
+UPDATE `creature_template` SET `AIName` = '' WHERE `entry` IN (29329,29330,29333,29338);
diff --git a/sql/updates/world/2012_01_06_06_world_quest_template.sql b/sql/updates/world/2012_01_06_06_world_quest_template.sql
new file mode 100644
index 00000000000..4f58452d980
--- /dev/null
+++ b/sql/updates/world/2012_01_06_06_world_quest_template.sql
@@ -0,0 +1,2 @@
+-- Ogre Heaven fix PrevQuestID
+UPDATE `quest_template` SET `PrevQuestID`=11000 WHERE `ID`=11009;
diff --git a/sql/updates/world/2012_01_06_07_world_sai.sql b/sql/updates/world/2012_01_06_07_world_sai.sql
new file mode 100644
index 00000000000..5d322367250
--- /dev/null
+++ b/sql/updates/world/2012_01_06_07_world_sai.sql
@@ -0,0 +1,23 @@
+-- Fix Quest 11795, 11887 'Emergency Protocol: Section 8.2, Paragraph C', 'Emergency Supplies'
+SET @NPC :=25841; -- Fizzcrank Recon Pilot
+SET @Gossip :=21248;
+
+DELETE FROM `gossip_menu_option` WHERE (`menu_id`=@Gossip AND `id`=1);
+INSERT INTO `gossip_menu_option` (`menu_id`,`id`,`option_icon`,`option_text`,`option_id`,`npc_option_npcflag`,`action_menu_id`,`action_poi_id`,`box_coded`,`box_money`,`box_text`) VALUES
+(@Gossip,1,0,"Search the body for the pilot's insignia.",1,1,0,0,0,0,'');
+
+DELETE FROM `conditions` WHERE `SourceGroup`=21248;
+INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`ErrorTextId`,`ScriptName`,`Comment`) VALUES
+(15,@Gossip,0,0,9,11887,0,0,0,'',''),
+(15,@Gossip,1,0,9,11795,0,0,0,'','');
+
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@NPC AND `source_type`=0;
+INSERT INTO `smart_scripts` (`entryorguid`,`source_type`,`id`,`link`,`event_type`,`event_phase_mask`,`event_chance`,`event_flags`,`event_param1`,`event_param2`,`event_param3`,`event_param4`,`action_type`,`action_param1`,`action_param2`,`action_param3`,`action_param4`,`action_param5`,`action_param6`,`target_type`,`target_param1`,`target_param2`,`target_param3`,`target_x`,`target_y`,`target_z`,`target_o`,`comment`) VALUES
+(@NPC,0,0,0,11,0,100,0,0,0,0,0,82,1,0,0,0,0,0,1,0,0,0,0,0,0,0,'Fizzcrank Recon Pilot - On spawn - set gossip flag'),
+(@NPC,0,1,2,62,0,100,0,@Gossip,0,0,0,11,46362,2,0,0,0,0,7,0,0,0,0,0,0,0,'Fizzcrank Recon Pilot - On gossip option 0 select - cast spell'),
+(@NPC,0,2,3,61,0,100,0,0,0,0,0,72,0,0,0,0,0,0,7,0,0,0,0,0,0,0,'Fizzcrank Recon Pilot - close gossip'),
+(@NPC,0,3,7,61,0,100,0,0,0,0,0,83,1,0,0,0,0,0,1,0,0,0,0,0,0,0,'Fizzcrank Recon Pilot - remove gossip flag'),
+(@NPC,0,4,5,62,0,100,0,@Gossip,1,0,0,11,46166,2,0,0,0,0,7,0,0,0,0,0,0,0,'Fizzcrank Recon Pilot - On gossip option 1 select - cast spell'),
+(@NPC,0,5,6,61,0,100,0,0,0,0,0,72,0,0,0,0,0,0,7,0,0,0,0,0,0,0,'Fizzcrank Recon Pilot - close gossip'),
+(@NPC,0,6,7,61,0,100,0,0,0,0,0,83,1,0,0,0,0,0,1,0,0,0,0,0,0,0,'Fizzcrank Recon Pilot - remove gossip flag'),
+(@NPC,0,7,0,61,0,100,0,0,0,0,0,41,3000,0,0,0,0,0,1,0,0,0,0,0,0,0,'Fizzcrank Recon Pilot - Despawn');
diff --git a/sql/updates/world/2012_01_06_08_world_creature_template.sql b/sql/updates/world/2012_01_06_08_world_creature_template.sql
new file mode 100644
index 00000000000..d59a5551f14
--- /dev/null
+++ b/sql/updates/world/2012_01_06_08_world_creature_template.sql
@@ -0,0 +1,2 @@
+-- Tiger Matriarch Credit have no SAI script
+UPDATE `creature_template` SET `AIName`='' WHERE `entry`=40301;
diff --git a/sql/updates/world/2012_01_06_09_world_creature_questrelation.sql b/sql/updates/world/2012_01_06_09_world_creature_questrelation.sql
new file mode 100644
index 00000000000..c2af677f047
--- /dev/null
+++ b/sql/updates/world/2012_01_06_09_world_creature_questrelation.sql
@@ -0,0 +1,9 @@
+-- Fix Report to Gryan Stoutmantle creature_questrelation values
+DELETE FROM `creature_questrelation` WHERE `quest` = 109;
+INSERT INTO `creature_questrelation` (`id`, `quest`) VALUES
+(233,109), -- Farmer Saldean
+(237,109), -- Farmer Furlbrow
+(240,109), -- Marshal Dughan
+(261,109), -- Guard Thomas
+(294,109), -- Marshal Haggard
+(963,109); -- Deputy Rainer
diff --git a/sql/updates/world/2012_01_06_10_world_creature_template.sql b/sql/updates/world/2012_01_06_10_world_creature_template.sql
new file mode 100644
index 00000000000..c121fd7424b
--- /dev/null
+++ b/sql/updates/world/2012_01_06_10_world_creature_template.sql
@@ -0,0 +1,2 @@
+-- Drowned Guardian & Phylactery Guardian summoned NPC should not give XP
+UPDATE `creature_template` SET `flags_extra`=`flags_extra`|64 WHERE `entry` IN (26225,26224);
diff --git a/src/server/game/Achievements/AchievementMgr.cpp b/src/server/game/Achievements/AchievementMgr.cpp
index 7efd5481ae8..02686993fbb 100755
--- a/src/server/game/Achievements/AchievementMgr.cpp
+++ b/src/server/game/Achievements/AchievementMgr.cpp
@@ -130,19 +130,19 @@ bool AchievementCriteriaData::IsValid(AchievementCriteriaEntry const* criteria)
case ACHIEVEMENT_CRITERIA_DATA_TYPE_T_PLAYER_CLASS_RACE:
if (!classRace.class_id && !classRace.race_id)
{
- sLog->outErrorDb("Table `achievement_criteria_data` (Entry: %u Type: %u) for data type ACHIEVEMENT_CRITERIA_DATA_TYPE_PLAYER_CLASS_RACE (%u) must not have 0 in either value field, ignored.",
+ sLog->outErrorDb("Table `achievement_criteria_data` (Entry: %u Type: %u) for data type ACHIEVEMENT_CRITERIA_DATA_TYPE_T_PLAYER_CLASS_RACE (%u) must not have 0 in either value field, ignored.",
criteria->ID, criteria->requiredType, dataType);
return false;
}
if (classRace.class_id && ((1 << (classRace.class_id-1)) & CLASSMASK_ALL_PLAYABLE) == 0)
{
- sLog->outErrorDb("Table `achievement_criteria_data` (Entry: %u Type: %u) for data type ACHIEVEMENT_CRITERIA_DATA_TYPE_PLAYER_CLASS_RACE (%u) has non-existing class in value1 (%u), ignored.",
+ sLog->outErrorDb("Table `achievement_criteria_data` (Entry: %u Type: %u) for data type ACHIEVEMENT_CRITERIA_DATA_TYPE_T_PLAYER_CLASS_RACE (%u) has non-existing class in value1 (%u), ignored.",
criteria->ID, criteria->requiredType, dataType, classRace.class_id);
return false;
}
if (classRace.race_id && ((1 << (classRace.race_id-1)) & RACEMASK_ALL_PLAYABLE) == 0)
{
- sLog->outErrorDb("Table `achievement_criteria_data` (Entry: %u Type: %u) for data type ACHIEVEMENT_CRITERIA_DATA_TYPE_PLAYER_CLASS_RACE (%u) has non-existing race in value2 (%u), ignored.",
+ sLog->outErrorDb("Table `achievement_criteria_data` (Entry: %u Type: %u) for data type ACHIEVEMENT_CRITERIA_DATA_TYPE_T_PLAYER_CLASS_RACE (%u) has non-existing race in value2 (%u), ignored.",
criteria->ID, criteria->requiredType, dataType, classRace.race_id);
return false;
}
@@ -277,6 +277,26 @@ bool AchievementCriteriaData::IsValid(AchievementCriteriaEntry const* criteria)
return false;
}
return true;
+ case ACHIEVEMENT_CRITERIA_DATA_TYPE_S_PLAYER_CLASS_RACE:
+ if (!classRace.class_id && !classRace.race_id)
+ {
+ sLog->outErrorDb("Table `achievement_criteria_data` (Entry: %u Type: %u) for data type ACHIEVEMENT_CRITERIA_DATA_TYPE_S_PLAYER_CLASS_RACE (%u) must not have 0 in either value field, ignored.",
+ criteria->ID, criteria->requiredType, dataType);
+ return false;
+ }
+ if (classRace.class_id && ((1 << (classRace.class_id-1)) & CLASSMASK_ALL_PLAYABLE) == 0)
+ {
+ sLog->outErrorDb("Table `achievement_criteria_data` (Entry: %u Type: %u) for data type ACHIEVEMENT_CRITERIA_DATA_TYPE_S_PLAYER_CLASS_RACE (%u) has non-existing class in value1 (%u), ignored.",
+ criteria->ID, criteria->requiredType, dataType, classRace.class_id);
+ return false;
+ }
+ if (classRace.race_id && ((1 << (classRace.race_id-1)) & RACEMASK_ALL_PLAYABLE) == 0)
+ {
+ sLog->outErrorDb("Table `achievement_criteria_data` (Entry: %u Type: %u) for data type ACHIEVEMENT_CRITERIA_DATA_TYPE_S_PLAYER_CLASS_RACE (%u) has non-existing race in value2 (%u), ignored.",
+ criteria->ID, criteria->requiredType, dataType, classRace.race_id);
+ return false;
+ }
+ return true;
default:
sLog->outErrorDb("Table `achievement_criteria_data` (Entry: %u Type: %u) has data for non-supported data type (%u), ignored.", criteria->ID, criteria->requiredType, dataType);
return false;
@@ -301,6 +321,14 @@ bool AchievementCriteriaData::Meets(uint32 criteria_id, Player const* source, Un
if (classRace.race_id && classRace.race_id != target->ToPlayer()->getRace())
return false;
return true;
+ case ACHIEVEMENT_CRITERIA_DATA_TYPE_S_PLAYER_CLASS_RACE:
+ if (!source || source->GetTypeId() != TYPEID_PLAYER)
+ return false;
+ if (classRace.class_id && classRace.class_id != source->ToPlayer()->getClass())
+ return false;
+ if (classRace.race_id && classRace.race_id != source->ToPlayer()->getRace())
+ return false;
+ return true;
case ACHIEVEMENT_CRITERIA_DATA_TYPE_T_PLAYER_LESS_HEALTH:
if (!target || target->GetTypeId() != TYPEID_PLAYER)
return false;
diff --git a/src/server/game/Achievements/AchievementMgr.h b/src/server/game/Achievements/AchievementMgr.h
index 640b5de98c9..c7d838fcb44 100755
--- a/src/server/game/Achievements/AchievementMgr.h
+++ b/src/server/game/Achievements/AchievementMgr.h
@@ -63,9 +63,10 @@ enum AchievementCriteriaDataType
ACHIEVEMENT_CRITERIA_DATA_INSTANCE_SCRIPT = 18, // 0 0 maker instance script call for check current criteria requirements fit
ACHIEVEMENT_CRITERIA_DATA_TYPE_S_EQUIPED_ITEM = 19, // item_level item_quality for equipped item in slot to check item level and quality
ACHIEVEMENT_CRITERIA_DATA_TYPE_MAP_ID = 20, // map_id 0 player must be on map with id in map_id
+ ACHIEVEMENT_CRITERIA_DATA_TYPE_S_PLAYER_CLASS_RACE = 21, // class_id race_id
};
-#define MAX_ACHIEVEMENT_CRITERIA_DATA_TYPE 21 // maximum value in AchievementCriteriaDataType enum
+#define MAX_ACHIEVEMENT_CRITERIA_DATA_TYPE 22 // maximum value in AchievementCriteriaDataType enum
class Player;
class Unit;
@@ -82,6 +83,7 @@ struct AchievementCriteriaData
uint32 id;
} creature;
// ACHIEVEMENT_CRITERIA_DATA_TYPE_T_PLAYER_CLASS_RACE = 2
+ // ACHIEVEMENT_CRITERIA_DATA_TYPE_S_PLAYER_CLASS_RACE = 21
struct
{
uint32 class_id;
diff --git a/src/server/game/Battlegrounds/Battleground.cpp b/src/server/game/Battlegrounds/Battleground.cpp
index 8ca4b73d105..6a758695116 100755
--- a/src/server/game/Battlegrounds/Battleground.cpp
+++ b/src/server/game/Battlegrounds/Battleground.cpp
@@ -1245,8 +1245,6 @@ void Battleground::EventPlayerLoggedOut(Player* player)
if (GetAlivePlayersCountByTeam(player->GetTeam()) <= 1 && GetPlayersCountByTeam(GetOtherTeam(player->GetTeam())))
EndBattleground(GetOtherTeam(player->GetTeam()));
}
-
- player->LeaveBattleground();
}
// This method should be called only once ... it adds pointer to queue
diff --git a/src/server/game/Chat/Chat.cpp b/src/server/game/Chat/Chat.cpp
index 91ccb42f1d0..035fbaf5b78 100755
--- a/src/server/game/Chat/Chat.cpp
+++ b/src/server/game/Chat/Chat.cpp
@@ -885,11 +885,11 @@ bool ChatHandler::ShowHelpForSubCommands(ChatCommand* table, char const* cmd, ch
std::string list;
for (uint32 i = 0; table[i].Name != NULL; ++i)
{
- // must be available (ignore handler existence for show command with possibe avalable subcomands
+ // must be available (ignore handler existence for show command with possible available subcommands)
if (!isAvailable(table[i]))
continue;
- /// for empty subcmd show all available
+ // for empty subcmd show all available
if (*subcmd && !hasStringAbbr(table[i].Name, subcmd))
continue;
@@ -924,7 +924,7 @@ bool ChatHandler::ShowHelpForCommand(ChatCommand* table, const char* cmd)
{
for (uint32 i = 0; table[i].Name != NULL; ++i)
{
- // must be available (ignore handler existence for show command with possibe avalable subcomands
+ // must be available (ignore handler existence for show command with possible available subcommands)
if (!isAvailable(table[i]))
continue;
@@ -954,7 +954,7 @@ bool ChatHandler::ShowHelpForCommand(ChatCommand* table, const char* cmd)
{
for (uint32 i = 0; table[i].Name != NULL; ++i)
{
- // must be available (ignore handler existence for show command with possibe avalable subcomands
+ // must be available (ignore handler existence for show command with possible available subcommands)
if (!isAvailable(table[i]))
continue;
diff --git a/src/server/game/Entities/Creature/Creature.cpp b/src/server/game/Entities/Creature/Creature.cpp
index 96890eb3095..3e06f9e73db 100755
--- a/src/server/game/Entities/Creature/Creature.cpp
+++ b/src/server/game/Entities/Creature/Creature.cpp
@@ -1507,9 +1507,6 @@ void Creature::setDeathState(DeathState s)
if (m_formation && m_formation->getLeader() == this)
m_formation->FormationReset(true);
- if (ZoneScript* zoneScript = GetZoneScript())
- zoneScript->OnCreatureDeath(this);
-
if ((canFly() || IsFlying()) && FallGround())
return;
@@ -1644,7 +1641,20 @@ bool Creature::IsImmunedToSpell(SpellInfo const* spellInfo)
if (!spellInfo)
return false;
- if (GetCreatureInfo()->MechanicImmuneMask & (1 << (spellInfo->Mechanic - 1)))
+ // Spells that don't have effectMechanics.
+ if (!spellInfo->HasAnyEffectMechanic() && GetCreatureInfo()->MechanicImmuneMask & (1 << (spellInfo->Mechanic - 1)))
+ return true;
+
+ // This check must be done instead of 'if (GetCreatureInfo()->MechanicImmuneMask & (1 << (spellInfo->Mechanic - 1)))' for not break
+ // the check of mechanic immunity on DB (tested) because GetCreatureInfo()->MechanicImmuneMask and m_spellImmune[IMMUNITY_MECHANIC] don't have same data.
+ bool immunedToAllEffects = true;
+ for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
+ if (!IsImmunedToSpellEffect(spellInfo, i))
+ {
+ immunedToAllEffects = false;
+ break;
+ }
+ if (immunedToAllEffects)
return true;
return Unit::IsImmunedToSpell(spellInfo);
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp
index 10ec8500923..09b19223039 100755
--- a/src/server/game/Entities/Player/Player.cpp
+++ b/src/server/game/Entities/Player/Player.cpp
@@ -14529,7 +14529,7 @@ bool Player::CanSeeStartQuest(Quest const* quest)
SatisfyQuestExclusiveGroup(quest, false) && SatisfyQuestReputation(quest, false) &&
SatisfyQuestPreviousQuest(quest, false) && SatisfyQuestNextChain(quest, false) &&
SatisfyQuestPrevChain(quest, false) && SatisfyQuestDay(quest, false) && SatisfyQuestWeek(quest, false) &&
- !DisableMgr::IsDisabledFor(DISABLE_TYPE_QUEST, quest->GetQuestId(), this))
+ SatisfyQuestSeasonal(quest, false) && !DisableMgr::IsDisabledFor(DISABLE_TYPE_QUEST, quest->GetQuestId(), this))
{
return getLevel() + sWorld->getIntConfig(CONFIG_QUEST_HIGH_LEVEL_HIDE_DIFF) >= quest->GetMinLevel();
}
@@ -14545,7 +14545,7 @@ bool Player::CanTakeQuest(Quest const* quest, bool msg)
&& SatisfyQuestPreviousQuest(quest, msg) && SatisfyQuestTimed(quest, msg)
&& SatisfyQuestNextChain(quest, msg) && SatisfyQuestPrevChain(quest, msg)
&& SatisfyQuestDay(quest, msg) && SatisfyQuestWeek(quest, msg)
- && !DisableMgr::IsDisabledFor(DISABLE_TYPE_QUEST, quest->GetQuestId(), this)
+ && SatisfyQuestSeasonal(quest,msg) && !DisableMgr::IsDisabledFor(DISABLE_TYPE_QUEST, quest->GetQuestId(), this)
&& SatisfyQuestConditions(quest, msg);
}
@@ -14669,7 +14669,7 @@ bool Player::CanRewardQuest(Quest const* quest, bool msg)
return false;
// daily quest can't be rewarded (25 daily quest already completed)
- if (!SatisfyQuestDay(quest, true) || !SatisfyQuestWeek(quest, true))
+ if (!SatisfyQuestDay(quest, true) || !SatisfyQuestWeek(quest, true) || !SatisfyQuestSeasonal(quest,true))
return false;
// rewarded and not repeatable quest (only cheating case, then ignore without message)
@@ -14978,6 +14978,8 @@ void Player::RewardQuest(Quest const* quest, uint32 reward, Object* questGiver,
}
else if (quest->IsWeekly())
SetWeeklyQuestStatus(quest_id);
+ else if (quest->IsSeasonal())
+ SetSeasonalQuestStatus(quest_id);
RemoveActiveQuest(quest_id);
m_RewardedQuests.insert(quest_id);
@@ -15333,7 +15335,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))
+ if (!SatisfyQuestDay(Nquest, false) || !SatisfyQuestWeek(Nquest, false) || !SatisfyQuestSeasonal(Nquest,false))
{
if (msg)
SendCanTakeQuestResponse(INVALIDREASON_DONT_HAVE_REQ);
@@ -15342,7 +15344,7 @@ bool Player::SatisfyQuestExclusiveGroup(Quest const* qInfo, bool msg)
}
// alternative quest already started or completed - but don't check rewarded states if both are repeatable
- if (GetQuestStatus(exclude_Id) != QUEST_STATUS_NONE || (!(qInfo->IsRepeatable() && Nquest->IsRepeatable()) && m_RewardedQuests.find(exclude_Id) != m_RewardedQuests.end()))
+ if (GetQuestStatus(exclude_Id) != QUEST_STATUS_NONE || (!(qInfo->IsRepeatable() && Nquest->IsRepeatable()) && (m_RewardedQuests.find(exclude_Id) != m_RewardedQuests.end())))
{
if (msg)
SendCanTakeQuestResponse(INVALIDREASON_DONT_HAVE_REQ);
@@ -15443,6 +15445,19 @@ bool Player::SatisfyQuestWeek(Quest const* qInfo, bool /*msg*/)
return m_weeklyquests.find(qInfo->GetQuestId()) == m_weeklyquests.end();
}
+bool Player::SatisfyQuestSeasonal(Quest const* qInfo, bool /*msg*/)
+{
+ if (!qInfo->IsSeasonal() || m_seasonalquests.empty())
+ return true;
+
+ uint16 eventId = sGameEventMgr->GetEventIdForQuest(qInfo);
+ if (m_seasonalquests.find(eventId) == m_seasonalquests.end())
+ return false;
+
+ // if not found in cooldown list
+ return m_seasonalquests[eventId].find(qInfo->GetQuestId()) == m_seasonalquests[eventId].end();
+}
+
bool Player::GiveQuestSourceItem(Quest const* quest)
{
uint32 srcitem = quest->GetSrcItemId();
@@ -16659,10 +16674,10 @@ bool Player::LoadFromDB(uint32 guid, SQLQueryHolder *holder)
if (player_at_bg && currentBg->GetStatus() != STATUS_WAIT_LEAVE)
{
- BattlegroundQueueTypeId bgQueueTypeId = sBattlegroundMgr->BGQueueTypeId(currentBg->GetTypeID(true), currentBg->GetArenaType());
+ BattlegroundQueueTypeId bgQueueTypeId = sBattlegroundMgr->BGQueueTypeId(currentBg->GetTypeID(), currentBg->GetArenaType());
AddBattlegroundQueueId(bgQueueTypeId);
- m_bgData.bgTypeID = currentBg->GetTypeID(true);
+ m_bgData.bgTypeID = currentBg->GetTypeID();
//join player to battleground group
currentBg->EventPlayerLoggedIn(this);
@@ -16834,7 +16849,7 @@ bool Player::LoadFromDB(uint32 guid, SQLQueryHolder *holder)
}
// if the player is in an instance and it has been reset in the meantime teleport him to the entrance
- if (instanceId && !sInstanceSaveMgr->GetInstanceSave(instanceId))
+ if (instanceId && !sInstanceSaveMgr->GetInstanceSave(instanceId) && !map->IsBattlegroundOrArena())
{
AreaTrigger const* at = sObjectMgr->GetMapEntranceTrigger(mapId);
if (at)
@@ -16980,7 +16995,8 @@ bool Player::LoadFromDB(uint32 guid, SQLQueryHolder *holder)
_LoadQuestStatus(holder->GetPreparedResult(PLAYER_LOGIN_QUERY_LOADQUESTSTATUS));
_LoadQuestStatusRewarded(holder->GetPreparedResult(PLAYER_LOGIN_QUERY_LOADQUESTSTATUSREW));
_LoadDailyQuestStatus(holder->GetPreparedResult(PLAYER_LOGIN_QUERY_LOADDAILYQUESTSTATUS));
- _LoadWeeklyQuestStatus(holder->GetPreparedResult(PLAYER_LOGIN_QUERY_LOADWEKLYQUESTSTATUS));
+ _LoadWeeklyQuestStatus(holder->GetPreparedResult(PLAYER_LOGIN_QUERY_LOADWEEKLYQUESTSTATUS));
+ _LoadSeasonalQuestStatus(holder->GetPreparedResult(PLAYER_LOGIN_QUERY_LOADSEASONALQUESTSTATUS));
_LoadRandomBGStatus(holder->GetPreparedResult(PLAYER_LOGIN_QUERY_LOADRANDOMBG));
// after spell and quest load
@@ -17832,7 +17848,8 @@ void Player::_LoadWeeklyQuestStatus(PreparedQueryResult result)
{
do
{
- uint32 quest_id = (*result)[0].GetUInt32();
+ Field* fields = result->Fetch();
+ uint32 quest_id = fields[0].GetUInt32();
Quest const* quest = sObjectMgr->GetQuestTemplate(quest_id);
if (!quest)
continue;
@@ -17846,6 +17863,30 @@ void Player::_LoadWeeklyQuestStatus(PreparedQueryResult result)
m_WeeklyQuestChanged = false;
}
+void Player::_LoadSeasonalQuestStatus(PreparedQueryResult result)
+{
+ m_seasonalquests.clear();
+
+ if (result)
+ {
+ do
+ {
+ Field* fields = result->Fetch();
+ uint32 quest_id = fields[0].GetUInt32();
+ uint32 event_id = fields[1].GetUInt32();
+ Quest const* quest = sObjectMgr->GetQuestTemplate(quest_id);
+ if (!quest)
+ continue;
+
+ m_seasonalquests[event_id].insert(quest_id);
+ sLog->outDebug(LOG_FILTER_PLAYER_LOADING, "Seasonal quest {%u} cooldown for player (GUID: %u)", quest_id, GetGUIDLow());
+ }
+ while (result->NextRow());
+ }
+
+ m_SeasonalQuestChanged = false;
+}
+
void Player::_LoadSpells(PreparedQueryResult result)
{
//QueryResult* result = CharacterDatabase.PQuery("SELECT spell, active, disabled FROM character_spell WHERE guid = '%u'", GetGUIDLow());
@@ -18572,6 +18613,7 @@ void Player::SaveToDB(bool create /*=false*/)
_SaveQuestStatus(trans);
_SaveDailyQuestStatus(trans);
_SaveWeeklyQuestStatus(trans);
+ _SaveSeasonalQuestStatus(trans);
_SaveTalents(trans);
_SaveSpells(trans);
_SaveSpellCooldowns(trans);
@@ -18910,18 +18952,28 @@ void Player::_SaveDailyQuestStatus(SQLTransaction& trans)
// save last daily quest time for all quests: we need only mostly reset time for reset check anyway
// we don't need transactions here.
- trans->PAppend("DELETE FROM character_queststatus_daily WHERE guid = '%u'", GetGUIDLow());
+ PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_QUEST_STATUS_DAILY_CHAR);
+ stmt->setUInt32(0, GetGUIDLow());
+ trans->Append(stmt);
for (uint32 quest_daily_idx = 0; quest_daily_idx < PLAYER_MAX_DAILY_QUESTS; ++quest_daily_idx)
if (GetUInt32Value(PLAYER_FIELD_DAILY_QUESTS_1+quest_daily_idx))
- trans->PAppend("INSERT INTO character_queststatus_daily (guid, quest, time) VALUES ('%u', '%u', '" UI64FMTD "')",
- GetGUIDLow(), GetUInt32Value(PLAYER_FIELD_DAILY_QUESTS_1+quest_daily_idx), uint64(m_lastDailyQuestTime));
+ {
+ PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_CHARACTER_DAILYQUESTSTATUS);
+ stmt->setUInt32(0, GetGUIDLow());
+ stmt->setUInt32(1, GetUInt32Value(PLAYER_FIELD_DAILY_QUESTS_1+quest_daily_idx));
+ stmt->setUInt64(2, uint64(m_lastDailyQuestTime));
+ trans->Append(stmt);
+ }
if (!m_DFQuests.empty())
{
for (DFQuestsDoneList::iterator itr = m_DFQuests.begin(); itr != m_DFQuests.end(); ++itr)
{
- trans->PAppend("INSERT INTO character_queststatus_daily (guid, quest, time) VALUES ('%u', '%u', '" UI64FMTD "')",
- GetGUIDLow(), (*itr), uint64(m_lastDailyQuestTime));
+ PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_CHARACTER_DAILYQUESTSTATUS);
+ stmt->setUInt32(0, GetGUIDLow());
+ stmt->setUInt32(1, (*itr));
+ stmt->setUInt64(2, uint64(m_lastDailyQuestTime));
+ trans->Append(stmt);
}
}
}
@@ -18932,18 +18984,51 @@ void Player::_SaveWeeklyQuestStatus(SQLTransaction& trans)
return;
// we don't need transactions here.
- trans->PAppend("DELETE FROM character_queststatus_weekly WHERE guid = '%u'", GetGUIDLow());
+ PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_QUEST_STATUS_WEEKLY_CHAR);
+ stmt->setUInt32(0, GetGUIDLow());
+ trans->Append(stmt);
for (QuestSet::const_iterator iter = m_weeklyquests.begin(); iter != m_weeklyquests.end(); ++iter)
{
uint32 quest_id = *iter;
- trans->PAppend("INSERT INTO character_queststatus_weekly (guid, quest) VALUES ('%u', '%u')", GetGUIDLow(), quest_id);
+ PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_CHARACTER_WEEKLYQUESTSTATUS);
+ stmt->setUInt32(0, GetGUIDLow());
+ stmt->setUInt32(1, quest_id);
+ trans->Append(stmt);
}
m_WeeklyQuestChanged = false;
}
+void Player::_SaveSeasonalQuestStatus(SQLTransaction& trans)
+{
+ if (!m_SeasonalQuestChanged || m_seasonalquests.empty())
+ return;
+
+ // we don't need transactions here.
+ PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_QUEST_STATUS_SEASONAL_CHAR);
+ stmt->setUInt32(0, GetGUIDLow());
+ trans->Append(stmt);
+
+ for (SeasonalEventQuestMap::const_iterator iter = m_seasonalquests.begin(); iter != m_seasonalquests.end(); ++iter)
+ {
+ uint16 event_id = iter->first;
+ for (SeasonalQuestSet::const_iterator itr = iter->second.begin(); itr != iter->second.end(); ++itr)
+ {
+ uint32 quest_id = (*itr);
+
+ PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_CHARACTER_SEASONALQUESTSTATUS);
+ stmt->setUInt32(0, GetGUIDLow());
+ stmt->setUInt32(1, quest_id);
+ stmt->setUInt32(2, event_id);
+ trans->Append(stmt);
+ }
+ }
+
+ m_SeasonalQuestChanged = false;
+}
+
void Player::_SaveSkills(SQLTransaction& trans)
{
// we don't need transactions here.
@@ -22036,6 +22121,16 @@ void Player::SetWeeklyQuestStatus(uint32 quest_id)
m_WeeklyQuestChanged = true;
}
+void Player::SetSeasonalQuestStatus(uint32 quest_id)
+{
+ Quest const* quest = sObjectMgr->GetQuestTemplate(quest_id);
+ if (!quest)
+ return;
+
+ m_seasonalquests[sGameEventMgr->GetEventIdForQuest(quest)].insert(quest_id);
+ m_SeasonalQuestChanged = true;
+}
+
void Player::ResetDailyQuestStatus()
{
for (uint32 quest_daily_idx = 0; quest_daily_idx < PLAYER_MAX_DAILY_QUESTS; ++quest_daily_idx)
@@ -22058,6 +22153,16 @@ void Player::ResetWeeklyQuestStatus()
m_WeeklyQuestChanged = false;
}
+void Player::ResetSeasonalQuestStatus(uint16 event_id)
+{
+ if (m_seasonalquests.empty() || m_seasonalquests[event_id].empty())
+ return;
+
+ m_seasonalquests.erase(event_id);
+ // DB data deleted in caller
+ m_SeasonalQuestChanged = false;
+}
+
Battleground* Player::GetBattleground() const
{
if (GetBattlegroundId() == 0)
@@ -23201,6 +23306,9 @@ void Player::RemoveRunesByAuraEffect(AuraEffect const* aura)
void Player::RestoreBaseRune(uint8 index)
{
AuraEffect const* aura = m_runes->runes[index].ConvertAura;
+ // If rune was converted by a non-pasive aura that still active we should keep it converted
+ if (aura && !(aura->GetSpellInfo()->Attributes & SPELL_ATTR0_PASSIVE))
+ return;
ConvertRune(index, GetBaseRune(index));
SetRuneConvertAura(index, NULL);
// Don't drop passive talents providing rune convertion
diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h
index 7da008d597b..21c87a993dc 100755
--- a/src/server/game/Entities/Player/Player.h
+++ b/src/server/game/Entities/Player/Player.h
@@ -815,11 +815,12 @@ enum PlayerLoginQueryIndex
PLAYER_LOGIN_QUERY_LOADTALENTS = 23,
PLAYER_LOGIN_QUERY_LOADACCOUNTDATA = 24,
PLAYER_LOGIN_QUERY_LOADSKILLS = 25,
- PLAYER_LOGIN_QUERY_LOADWEKLYQUESTSTATUS = 26,
+ PLAYER_LOGIN_QUERY_LOADWEEKLYQUESTSTATUS = 26,
PLAYER_LOGIN_QUERY_LOADRANDOMBG = 27,
PLAYER_LOGIN_QUERY_LOADBANNED = 28,
PLAYER_LOGIN_QUERY_LOADQUESTSTATUSREW = 29,
PLAYER_LOGIN_QUERY_LOADINSTANCELOCKTIMES = 30,
+ PLAYER_LOGIN_QUERY_LOADSEASONALQUESTSTATUS = 31,
MAX_PLAYER_LOGIN_QUERY,
};
@@ -1422,6 +1423,7 @@ class Player : public Unit, public GridObject<Player>
bool SatisfyQuestPrevChain(Quest const* qInfo, bool msg);
bool SatisfyQuestDay(Quest const* qInfo, bool msg);
bool SatisfyQuestWeek(Quest const* qInfo, bool msg);
+ bool SatisfyQuestSeasonal(Quest const* qInfo, bool msg);
bool GiveQuestSourceItem(Quest const* quest);
bool TakeQuestSourceItem(uint32 questId, bool msg);
bool GetQuestRewardStatus(uint32 quest_id) const;
@@ -1432,8 +1434,10 @@ class Player : public Unit, public GridObject<Player>
void SetDailyQuestStatus(uint32 quest_id);
void SetWeeklyQuestStatus(uint32 quest_id);
+ void SetSeasonalQuestStatus(uint32 quest_id);
void ResetDailyQuestStatus();
void ResetWeeklyQuestStatus();
+ void ResetSeasonalQuestStatus(uint16 event_id);
uint16 FindQuestSlot(uint32 quest_id) const;
uint32 GetQuestSlotQuestId(uint16 slot) const { return GetUInt32Value(PLAYER_QUEST_LOG_1_1 + slot * MAX_QUEST_OFFSET + QUEST_ID_OFFSET); }
@@ -2558,8 +2562,11 @@ class Player : public Unit, public GridObject<Player>
//We allow only one timed quest active at the same time. Below can then be simple value instead of set.
typedef std::set<uint32> QuestSet;
+ typedef std::set<uint32> SeasonalQuestSet;
+ typedef UNORDERED_MAP<uint32,SeasonalQuestSet> SeasonalEventQuestMap;
QuestSet m_timedquests;
QuestSet m_weeklyquests;
+ SeasonalEventQuestMap m_seasonalquests;
uint64 m_divider;
uint32 m_ingametime;
@@ -2580,6 +2587,7 @@ class Player : public Unit, public GridObject<Player>
void _LoadQuestStatusRewarded(PreparedQueryResult result);
void _LoadDailyQuestStatus(PreparedQueryResult result);
void _LoadWeeklyQuestStatus(PreparedQueryResult result);
+ void _LoadSeasonalQuestStatus(PreparedQueryResult result);
void _LoadRandomBGStatus(PreparedQueryResult result);
void _LoadGroup(PreparedQueryResult result);
void _LoadSkills(PreparedQueryResult result);
@@ -2605,6 +2613,7 @@ class Player : public Unit, public GridObject<Player>
void _SaveQuestStatus(SQLTransaction& trans);
void _SaveDailyQuestStatus(SQLTransaction& trans);
void _SaveWeeklyQuestStatus(SQLTransaction& trans);
+ void _SaveSeasonalQuestStatus(SQLTransaction& trans);
void _SaveSkills(SQLTransaction& trans);
void _SaveSpells(SQLTransaction& trans);
void _SaveEquipmentSets(SQLTransaction& trans);
@@ -2716,6 +2725,7 @@ class Player : public Unit, public GridObject<Player>
bool m_DailyQuestChanged;
bool m_WeeklyQuestChanged;
+ bool m_SeasonalQuestChanged;
time_t m_lastDailyQuestTime;
uint32 m_drunkTimer;
diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp
index 7d470d663d2..fdc6eef8407 100755
--- a/src/server/game/Entities/Unit/Unit.cpp
+++ b/src/server/game/Entities/Unit/Unit.cpp
@@ -1127,7 +1127,7 @@ void Unit::DealSpellDamage(SpellNonMeleeDamage* damageInfo, bool durabilityLoss)
SpellInfo const* spellProto = sSpellMgr->GetSpellInfo(damageInfo->SpellID);
if (spellProto == NULL)
{
- sLog->outDebug(LOG_FILTER_UNITS, "Unit::DealSpellDamage have wrong damageInfo->SpellID: %u", damageInfo->SpellID);
+ sLog->outDebug(LOG_FILTER_UNITS, "Unit::DealSpellDamage has wrong damageInfo->SpellID: %u", damageInfo->SpellID);
return;
}
@@ -2397,7 +2397,7 @@ SpellMissInfo Unit::MeleeSpellHitResult(Unit* victim, SpellInfo const* spell)
case MELEE_HIT_BLOCK: canBlock = false; break;
case MELEE_HIT_PARRY: canParry = false; break;
default:
- sLog->outStaticDebug("Spell %u SPELL_AURA_IGNORE_COMBAT_RESULT have unhandled state %d", (*i)->GetId(), (*i)->GetMiscValue());
+ sLog->outStaticDebug("Spell %u SPELL_AURA_IGNORE_COMBAT_RESULT has unhandled state %d", (*i)->GetId(), (*i)->GetMiscValue());
break;
}
}
@@ -4643,7 +4643,7 @@ void Unit::AddGameObject(GameObject* gameObj)
SpellInfo const* createBySpell = sSpellMgr->GetSpellInfo(gameObj->GetSpellId());
// Need disable spell use for owner
if (createBySpell && createBySpell->Attributes & SPELL_ATTR0_DISABLED_WHILE_ACTIVE)
- // note: item based cooldowns and cooldown spell mods with charges ignored (unknown existed cases)
+ // note: item based cooldowns and cooldown spell mods with charges ignored (unknown existing cases)
ToPlayer()->AddSpellAndCategoryCooldowns(createBySpell, 0, NULL, true);
}
}
@@ -4673,7 +4673,7 @@ void Unit::RemoveGameObject(GameObject* gameObj, bool del)
SpellInfo const* createBySpell = sSpellMgr->GetSpellInfo(spellid);
// Need activate spell use for owner
if (createBySpell && createBySpell->Attributes & SPELL_ATTR0_DISABLED_WHILE_ACTIVE)
- // note: item based cooldowns and cooldown spell mods with charges ignored (unknown existed cases)
+ // note: item based cooldowns and cooldown spell mods with charges ignored (unknown existing cases)
ToPlayer()->SendCooldownEvent(createBySpell);
}
}
@@ -4968,7 +4968,7 @@ bool Unit::HandleHasteAuraProc(Unit* victim, uint32 damage, AuraEffect* triggere
if (!triggerEntry)
{
- sLog->outError("Unit::HandleHasteAuraProc: Spell %u have not existed triggered spell %u", hasteSpell->Id, triggered_spell_id);
+ sLog->outError("Unit::HandleHasteAuraProc: Spell %u has non-existing triggered spell %u", hasteSpell->Id, triggered_spell_id);
return false;
}
@@ -5026,7 +5026,7 @@ bool Unit::HandleSpellCritChanceAuraProc(Unit* victim, uint32 /*damage*/, AuraEf
if (!triggerEntry)
{
- sLog->outError("Unit::HandleHasteAuraProc: Spell %u have not existed triggered spell %u", triggeredByAuraSpell->Id, triggered_spell_id);
+ sLog->outError("Unit::HandleHasteAuraProc: Spell %u has non-existing triggered spell %u", triggeredByAuraSpell->Id, triggered_spell_id);
return false;
}
@@ -5622,7 +5622,7 @@ bool Unit::HandleDummyAuraProc(Unit* victim, uint32 damage, AuraEffect* triggere
case SPELLFAMILY_MAGE:
{
// Magic Absorption
- if (dummySpell->SpellIconID == 459) // only this spell have SpellIconID == 459 and dummy aura
+ if (dummySpell->SpellIconID == 459) // only this spell has SpellIconID == 459 and dummy aura
{
if (getPowerType() != POWER_MANA)
return false;
@@ -7003,26 +7003,6 @@ bool Unit::HandleDummyAuraProc(Unit* victim, uint32 damage, AuraEffect* triggere
{
switch (dummySpell->Id)
{
- // Earthen Power (Rank 1, 2)
- case 51523:
- case 51524:
- {
- // Totem itself must be a caster of this spell
- Unit* caster = NULL;
- for (ControlList::iterator itr = m_Controlled.begin(); itr != m_Controlled.end(); ++itr) {
- if ((*itr)->GetEntry() != 2630)
- continue;
-
- caster = *itr;
- break;
- }
-
- if (!caster)
- return false;
-
- caster->CastSpell(caster, 59566, true, castItem, triggeredByAura, originalCaster);
- return true;
- }
// Tidal Force
case 55198:
{
@@ -7069,7 +7049,7 @@ bool Unit::HandleDummyAuraProc(Unit* victim, uint32 damage, AuraEffect* triggere
triggered_spell_id = 28850;
break;
}
- // Windfury Weapon (Passive) 1-5 Ranks
+ // Windfury Weapon (Passive) 1-8 Ranks
case 33757:
{
Player* player = ToPlayer();
@@ -7084,8 +7064,10 @@ bool Unit::HandleDummyAuraProc(Unit* victim, uint32 damage, AuraEffect* triggere
return false;
WeaponAttackType attType = WeaponAttackType(player->GetAttackBySlot(castItem->GetSlot()));
- if ((attType != BASE_ATTACK && attType != OFF_ATTACK) || !isAttackReady(attType))
- return false;
+ if ((attType != BASE_ATTACK && attType != OFF_ATTACK)
+ || attType == BASE_ATTACK && procFlag & PROC_FLAG_DONE_OFFHAND_ATTACK
+ || attType == OFF_ATTACK && procFlag & PROC_FLAG_DONE_MAINHAND_ATTACK)
+ return false;
// Now compute real proc chance...
uint32 chance = 20;
@@ -7124,15 +7106,20 @@ bool Unit::HandleDummyAuraProc(Unit* victim, uint32 damage, AuraEffect* triggere
SpellInfo const* windfurySpellInfo = sSpellMgr->GetSpellInfo(spellId);
if (!windfurySpellInfo)
{
- sLog->outError("Unit::HandleDummyAuraProc: non existed spell id: %u (Windfury)", spellId);
+ sLog->outError("Unit::HandleDummyAuraProc: non-existing spell id: %u (Windfury)", spellId);
return false;
}
int32 extra_attack_power = CalculateSpellDamage(victim, windfurySpellInfo, 1);
// Value gained from additional AP
- basepoints0 = int32(extra_attack_power / 14.0f * GetAttackTime(BASE_ATTACK) / 1000);
- triggered_spell_id = 25504;
+ basepoints0 = int32(extra_attack_power / 14.0f * GetAttackTime(attType) / 1000);
+
+ if (procFlag & PROC_FLAG_DONE_MAINHAND_ATTACK)
+ triggered_spell_id = 25504;
+
+ if (procFlag & PROC_FLAG_DONE_OFFHAND_ATTACK)
+ triggered_spell_id = 33750;
// apply cooldown before cast to prevent processing itself
if (cooldown)
@@ -7370,6 +7357,13 @@ bool Unit::HandleDummyAuraProc(Unit* victim, uint32 damage, AuraEffect* triggere
if (GetTypeId() != TYPEID_PLAYER || !victim || !victim->isAlive() || !castItem || !castItem->IsEquipped())
return false;
+ Player* player = ToPlayer();
+ WeaponAttackType attType = WeaponAttackType(player->GetAttackBySlot(castItem->GetSlot()));
+ if ((attType != BASE_ATTACK && attType != OFF_ATTACK)
+ || attType == BASE_ATTACK && procFlag & PROC_FLAG_DONE_OFFHAND_ATTACK
+ || attType == OFF_ATTACK && procFlag & PROC_FLAG_DONE_MAINHAND_ATTACK)
+ return false;
+
float fire_onhit = float(CalculatePctF(dummySpell->Effects[EFFECT_0]. CalcValue(), 1.0f));
float add_spellpower = (float)(SpellBaseDamageBonus(SPELL_SCHOOL_MASK_FIRE)
@@ -7379,7 +7373,7 @@ bool Unit::HandleDummyAuraProc(Unit* victim, uint32 damage, AuraEffect* triggere
ApplyPctF(add_spellpower, 3.84f);
// Enchant on Off-Hand and ready?
- if (castItem->GetSlot() == EQUIPMENT_SLOT_OFFHAND && isAttackReady(OFF_ATTACK))
+ if (castItem->GetSlot() == EQUIPMENT_SLOT_OFFHAND && procFlag & PROC_FLAG_DONE_OFFHAND_ATTACK)
{
float BaseWeaponSpeed = GetAttackTime(OFF_ATTACK) / 1000.0f;
@@ -7389,7 +7383,7 @@ bool Unit::HandleDummyAuraProc(Unit* victim, uint32 damage, AuraEffect* triggere
}
// Enchant on Main-Hand and ready?
- else if (castItem->GetSlot() == EQUIPMENT_SLOT_MAINHAND && isAttackReady(BASE_ATTACK))
+ else if (castItem->GetSlot() == EQUIPMENT_SLOT_MAINHAND && procFlag & PROC_FLAG_DONE_MAINHAND_ATTACK)
{
float BaseWeaponSpeed = GetAttackTime(BASE_ATTACK) / 1000.0f;
@@ -7431,7 +7425,7 @@ bool Unit::HandleDummyAuraProc(Unit* victim, uint32 damage, AuraEffect* triggere
return false;
}
// Lightning Overload
- if (dummySpell->SpellIconID == 2018) // only this spell have SpellFamily Shaman SpellIconID == 2018 and dummy aura
+ if (dummySpell->SpellIconID == 2018) // only this spell has SpellFamily Shaman SpellIconID == 2018 and dummy aura
{
if (!procSpell || GetTypeId() != TYPEID_PLAYER || !victim)
return false;
@@ -7483,7 +7477,7 @@ bool Unit::HandleDummyAuraProc(Unit* victim, uint32 damage, AuraEffect* triggere
if (!roll_chance_f(chance))
return false;
- // Remove cooldown (Chain Lightning - have Category Recovery time)
+ // Remove cooldown (Chain Lightning - has Category Recovery time)
ToPlayer()->RemoveSpellCooldown(spellId);
}
@@ -7794,7 +7788,7 @@ bool Unit::HandleDummyAuraProc(Unit* victim, uint32 damage, AuraEffect* triggere
SpellInfo const* triggerEntry = sSpellMgr->GetSpellInfo(triggered_spell_id);
if (!triggerEntry)
{
- sLog->outError("Unit::HandleDummyAuraProc: Spell %u have not existed triggered spell %u", dummySpell->Id, triggered_spell_id);
+ sLog->outError("Unit::HandleDummyAuraProc: Spell %u has non-existing triggered spell %u", dummySpell->Id, triggered_spell_id);
return false;
}
@@ -7852,7 +7846,7 @@ bool Unit::HandleObsModEnergyAuraProc(Unit* victim, uint32 /*damage*/, AuraEffec
// Try handle unknown trigger spells
if (!triggerEntry)
{
- sLog->outError("Unit::HandleObsModEnergyAuraProc: Spell %u have not existed triggered spell %u", dummySpell->Id, triggered_spell_id);
+ sLog->outError("Unit::HandleObsModEnergyAuraProc: Spell %u has non-existing triggered spell %u", dummySpell->Id, triggered_spell_id);
return false;
}
@@ -7905,7 +7899,7 @@ bool Unit::HandleModDamagePctTakenAuraProc(Unit* victim, uint32 /*damage*/, Aura
if (!triggerEntry)
{
- sLog->outError("Unit::HandleModDamagePctTakenAuraProc: Spell %u have not existed triggered spell %u", dummySpell->Id, triggered_spell_id);
+ sLog->outError("Unit::HandleModDamagePctTakenAuraProc: Spell %u has non-existing triggered spell %u", dummySpell->Id, triggered_spell_id);
return false;
}
@@ -8651,8 +8645,8 @@ bool Unit::HandleProcTriggerSpell(Unit* victim, uint32 damage, AuraEffect* trigg
SpellInfo const* triggerEntry = sSpellMgr->GetSpellInfo(trigger_spell_id);
if (triggerEntry == NULL)
{
- // Not cast unknown spell
- // sLog->outError("Unit::HandleProcTriggerSpell: Spell %u have 0 in EffectTriggered[%d], not handled custom case?", auraSpellInfo->Id, triggeredByAura->GetEffIndex());
+ // Don't cast unknown spell
+ // sLog->outError("Unit::HandleProcTriggerSpell: Spell %u has 0 in EffectTriggered[%d]. Unhandled custom case?", auraSpellInfo->Id, triggeredByAura->GetEffIndex());
return false;
}
@@ -8739,7 +8733,7 @@ bool Unit::HandleProcTriggerSpell(Unit* victim, uint32 damage, AuraEffect* trigg
if (!victim || !victim->isAlive())
return false;
- // Not give if target already have full health
+ // Doesn't proc if target already has full health
if (victim->IsFullHealth())
return false;
// If your Greater Heal brings the target to full health, you gain $37595s1 mana.
@@ -8950,7 +8944,7 @@ bool Unit::HandleProcTriggerSpell(Unit* victim, uint32 damage, AuraEffect* trigg
if ((maelstrom->GetStackAmount() == maelstrom->GetSpellInfo()->StackAmount) && roll_chance_i(aurEff->GetAmount()))
CastSpell(this, 70831, true, castItem, triggeredByAura);
- // have rank dependent proc chance, ignore too often cases
+ // has rank dependant proc chance, ignore too often cases
// PPM = 2.5 * (rank of talent),
uint32 rank = auraSpellInfo->GetRank();
// 5 rank -> 100% 4 rank -> 80% and etc from full rate
@@ -9304,7 +9298,7 @@ ReputationRank Unit::GetReactionTo(Unit const* target) const
&& selfPlayerOwner->HasFlag(PLAYER_FLAGS, PLAYER_FLAGS_CONTESTED_PVP))
return REP_HOSTILE;
- // if faction have reputation then hostile state dependent only from at_war state
+ // if faction has reputation, hostile state depends only from AtWar state
if (selfPlayerOwner->GetReputationMgr().IsAtWar(targetFactionEntry))
return REP_HOSTILE;
return REP_FRIENDLY;
@@ -10450,7 +10444,7 @@ uint32 Unit::SpellDamageBonus(Unit* victim, SpellInfo const* spellProto, uint32
{
if (victim->HasAuraState(AURA_STATE_HEALTHLESS_35_PERCENT, spellProto, this))
{
- // effect 0 have expected value but in negative state
+ // effect 0 has expected value but in negative state
int32 bonus = -(*i)->GetBase()->GetEffect(0)->GetAmount();
AddPctN(DoneTotalMod, bonus);
}
@@ -11481,7 +11475,8 @@ bool Unit::IsImmunedToSpell(SpellInfo const* spellInfo)
return true;
}
- if (spellInfo->Mechanic)
+ // Spells that don't have effectMechanics.
+ if (!spellInfo->HasAnyEffectMechanic() && spellInfo->Mechanic)
{
SpellImmuneList const& mechanicList = m_spellImmune[IMMUNITY_MECHANIC];
for (SpellImmuneList::const_iterator itr = mechanicList.begin(); itr != mechanicList.end(); ++itr)
@@ -11489,14 +11484,19 @@ bool Unit::IsImmunedToSpell(SpellInfo const* spellInfo)
return true;
}
- for (int i = 0; i < MAX_SPELL_EFFECTS; ++i)
+ bool immuneToAllEffects = true;
+ for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
{
// State/effect immunities applied by aura expect full spell immunity
// Ignore effects with mechanic, they are supposed to be checked separately
- if (!spellInfo->Effects[i].Mechanic)
- if (IsImmunedToSpellEffect(spellInfo, i))
- return true;
+ if (spellInfo->Effects[i].Mechanic || !IsImmunedToSpellEffect(spellInfo, i))
+ {
+ immuneToAllEffects = false;
+ break;
+ }
}
+ if (immuneToAllEffects) //Return immune only if the target is immune to all spell effects.
+ return true;
if (spellInfo->Id != 42292 && spellInfo->Id !=59752)
{
@@ -11708,7 +11708,7 @@ void Unit::MeleeDamageBonus(Unit* victim, uint32 *pdamage, WeaponAttackType attT
{
if (victim->HasAuraState(AURA_STATE_HEALTHLESS_35_PERCENT, spellProto, this))
{
- // effect 0 have expected value but in negative state
+ // effect 0 has expected value but in negative state
int32 bonus = -(*i)->GetBase()->GetEffect(0)->GetAmount();
AddPctN(DoneTotalMod, bonus);
}
@@ -12750,6 +12750,10 @@ void Unit::setDeathState(DeathState s)
// do not why since in IncreaseMaxHealth currenthealth is checked
SetHealth(0);
SetPower(getPowerType(), 0);
+
+ // players in instance don't have ZoneScript, but they have InstanceScript
+ if (ZoneScript* zoneScript = GetZoneScript() ? GetZoneScript() : (ZoneScript*)GetInstanceScript())
+ zoneScript->OnUnitDeath(this);
}
else if (s == JUST_ALIVED)
RemoveFlag (UNIT_FIELD_FLAGS, UNIT_FLAG_SKINNABLE); // clear skinnable for creature and player (at battleground)
@@ -12973,7 +12977,7 @@ Unit* Creature::SelectVictim()
// last case when creature must not go to evade mode:
// it in combat but attacker not make any damage and not enter to aggro radius to have record in threat list
// for example at owner command to pet attack some far away creature
- // Note: creature not have targeted movement generator but have attacker in this case
+ // Note: creature does not have targeted movement generator but has attacker in this case
for (AttackerSet::const_iterator itr = m_attackers.begin(); itr != m_attackers.end(); ++itr)
{
if ((*itr) && !canCreatureAttack(*itr) && (*itr)->GetTypeId() != TYPEID_PLAYER
@@ -13359,7 +13363,7 @@ bool Unit::HandleStatModifier(UnitMods unitMod, UnitModifierType modifierType, f
{
if (unitMod >= UNIT_MOD_END || modifierType >= MODIFIER_TYPE_END)
{
- sLog->outError("ERROR in HandleStatModifier(): non existed UnitMods or wrong UnitModifierType!");
+ sLog->outError("ERROR in HandleStatModifier(): non-existing UnitMods or wrong UnitModifierType!");
return false;
}
@@ -13424,7 +13428,7 @@ float Unit::GetModifierValue(UnitMods unitMod, UnitModifierType modifierType) co
{
if (unitMod >= UNIT_MOD_END || modifierType >= MODIFIER_TYPE_END)
{
- sLog->outError("trial to access non existed modifier value from UnitMods!");
+ sLog->outError("attempt to access non-existing modifier value from UnitMods!");
return 0.0f;
}
@@ -13454,7 +13458,7 @@ float Unit::GetTotalAuraModValue(UnitMods unitMod) const
{
if (unitMod >= UNIT_MOD_END)
{
- sLog->outError("trial to access non existed UnitMods in GetTotalAuraModValue()!");
+ sLog->outError("attempt to access non-existing UnitMods in GetTotalAuraModValue()!");
return 0.0f;
}
@@ -13683,7 +13687,7 @@ void Unit::SetMaxPower(Powers power, uint32 val)
uint32 Unit::GetCreatePowers(Powers power) const
{
- // POWER_FOCUS and POWER_HAPPINESS only have hunter pet
+ // Only hunter pets have POWER_FOCUS and POWER_HAPPINESS
switch (power)
{
case POWER_MANA: return GetCreateMana();
@@ -14111,12 +14115,12 @@ bool InitTriggerAuraData()
isTriggerAura[SPELL_AURA_DUMMY] = true;
isTriggerAura[SPELL_AURA_MOD_CONFUSE] = true;
isTriggerAura[SPELL_AURA_MOD_THREAT] = true;
- isTriggerAura[SPELL_AURA_MOD_STUN] = true; // Aura not have charges but need remove him on trigger
+ isTriggerAura[SPELL_AURA_MOD_STUN] = true; // Aura does not have charges but needs to be removed on trigger
isTriggerAura[SPELL_AURA_MOD_DAMAGE_DONE] = true;
isTriggerAura[SPELL_AURA_MOD_DAMAGE_TAKEN] = true;
isTriggerAura[SPELL_AURA_MOD_RESISTANCE] = true;
isTriggerAura[SPELL_AURA_MOD_STEALTH] = true;
- isTriggerAura[SPELL_AURA_MOD_FEAR] = true; // Aura not have charges but need remove him on trigger
+ isTriggerAura[SPELL_AURA_MOD_FEAR] = true; // Aura does not have charges but needs to be removed on trigger
isTriggerAura[SPELL_AURA_MOD_ROOT] = true;
isTriggerAura[SPELL_AURA_TRANSFORM] = true;
isTriggerAura[SPELL_AURA_REFLECT_SPELLS] = true;
@@ -15325,7 +15329,7 @@ bool Unit::HandleAuraRaidProcFromCharge(AuraEffect* triggeredByAura)
damageSpellId = 43594;
break;
default:
- sLog->outError("Unit::HandleAuraRaidProcFromCharge, received not handled spell: %u", spellProto->Id);
+ sLog->outError("Unit::HandleAuraRaidProcFromCharge, received unhandled spell: %u", spellProto->Id);
return false;
}
@@ -15738,7 +15742,7 @@ void Unit::SetStunned(bool apply)
if (!owner || (owner->GetTypeId() == TYPEID_PLAYER && !owner->ToPlayer()->IsMounted()))
RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_STUNNED);
- if (!HasUnitState(UNIT_STAT_ROOT)) // prevent allow move if have also root effect
+ if (!HasUnitState(UNIT_STAT_ROOT)) // prevent moving if it also has root effect
{
WorldPacket data(SMSG_FORCE_MOVE_UNROOT, 8+4);
data.append(GetPackGUID());
@@ -15780,7 +15784,7 @@ void Unit::SetRooted(bool apply)
}
else
{
- if (!HasUnitState(UNIT_STAT_STUNNED)) // prevent allow move if have also stun effect
+ if (!HasUnitState(UNIT_STAT_STUNNED)) // prevent moving if it also has stun effect
{
if (GetTypeId() == TYPEID_PLAYER)
{
diff --git a/src/server/game/Events/GameEventMgr.cpp b/src/server/game/Events/GameEventMgr.cpp
index 8b9e2fe047b..6f5dc0e511e 100755
--- a/src/server/game/Events/GameEventMgr.cpp
+++ b/src/server/game/Events/GameEventMgr.cpp
@@ -759,6 +759,50 @@ void GameEventMgr::LoadFromDB()
}
}
+ sLog->outString("Loading Game Event Seasonal Quest Relations...");
+ {
+ uint32 oldMSTime = getMSTime();
+
+ // 0 1
+ QueryResult result = WorldDatabase.Query("SELECT questId, eventEntry FROM game_event_seasonal_questrelation");
+
+ if (!result)
+ {
+ sLog->outString(">> Loaded 0 seasonal quests additions in game events. DB table `game_event_seasonal_questrelation` is empty.");
+ sLog->outString();
+ }
+ else
+ {
+ uint32 count = 0;
+ do
+ {
+ Field* fields = result->Fetch();
+
+ uint32 questId = fields[0].GetUInt32();
+ uint16 eventEntry = fields[1].GetUInt16();
+
+ if (!sObjectMgr->GetQuestTemplate(questId))
+ {
+ sLog->outErrorDb("`game_event_seasonal_questrelation` quest id (%u) does not exist in `quest_template`", questId);
+ continue;
+ }
+
+ if (eventEntry >= mGameEvent.size())
+ {
+ sLog->outErrorDb("`game_event_seasonal_questrelation` event id (%u) is out of range compared to max event in `game_event`", eventEntry);
+ continue;
+ }
+
+ _questToEventLinks[questId] = eventEntry;
+ ++count;
+ }
+ while (result->NextRow());
+
+ sLog->outString(">> Loaded %u quests additions in game events in %u ms", count, GetMSTimeDiffToNow(oldMSTime));
+ sLog->outString();
+ }
+ }
+
sLog->outString("Loading Game Event Vendor Additions Data...");
{
uint32 oldMSTime = getMSTime();
@@ -1079,6 +1123,8 @@ void GameEventMgr::UnApplyEvent(uint16 event_id)
UpdateEventNPCVendor(event_id, false);
// update bg holiday
UpdateBattlegroundSettings();
+ // check for seasonal quest reset.
+ sWorld->ResetEventSeasonalQuests(event_id);
}
void GameEventMgr::ApplyNewEvent(uint16 event_id)
@@ -1628,6 +1674,18 @@ void GameEventMgr::RunSmartAIScripts(uint16 event_id, bool activate)
}
}
+uint16 GameEventMgr::GetEventIdForQuest(Quest const* quest) const
+{
+ if (!quest)
+ return 0;
+
+ UNORDERED_MAP<uint32, uint16>::const_iterator itr = _questToEventLinks.find(quest->GetQuestId());
+ if (itr == _questToEventLinks.end())
+ return 0;
+
+ return itr->second;
+}
+
bool IsHolidayActive(HolidayIds id)
{
if (id == HOLIDAY_NONE)
@@ -1643,7 +1701,7 @@ bool IsHolidayActive(HolidayIds id)
return false;
}
- bool IsEventActive(uint16 event_id)
+bool IsEventActive(uint16 event_id)
{
GameEventMgr::ActiveEvents const& ae = sGameEventMgr->GetActiveEventList();
return ae.find(event_id) != ae.end();
diff --git a/src/server/game/Events/GameEventMgr.h b/src/server/game/Events/GameEventMgr.h
index 34258bac499..d9b5890bfe5 100755
--- a/src/server/game/Events/GameEventMgr.h
+++ b/src/server/game/Events/GameEventMgr.h
@@ -89,6 +89,7 @@ struct NPCVendorEntry
class Player;
class Creature;
+class Quest;
class GameEventMgr
{
@@ -118,6 +119,7 @@ class GameEventMgr
void HandleWorldEventGossip(Player* player, Creature* c);
uint32 GetNPCFlag(Creature* cr);
uint32 GetNpcTextId(uint32 guid);
+ uint16 GetEventIdForQuest(Quest const* quest) const;
private:
void SendWorldStateUpdate(Player* player, uint16 event_id);
void AddActiveEvent(uint16 event_id) { m_ActiveEvents.insert(event_id); }
@@ -169,6 +171,7 @@ class GameEventMgr
QuestIdToEventConditionMap mQuestToEventConditions;
GameEventNPCFlagMap mGameEventNPCFlags;
ActiveEvents m_ActiveEvents;
+ UNORDERED_MAP<uint32, uint16> _questToEventLinks;
bool isSystemInit;
public:
GameEventGuidMap mGameEventCreatureGuids;
diff --git a/src/server/game/Globals/ObjectMgr.h b/src/server/game/Globals/ObjectMgr.h
index 57c6fe1ad2f..126cca59ef0 100755
--- a/src/server/game/Globals/ObjectMgr.h
+++ b/src/server/game/Globals/ObjectMgr.h
@@ -670,6 +670,7 @@ class ObjectMgr
return NULL;
return info;
}
+
void GetPlayerLevelInfo(uint32 race, uint32 class_, uint8 level, PlayerLevelInfo* info) const;
uint64 GetPlayerGUIDByName(std::string name) const;
@@ -687,6 +688,7 @@ class ObjectMgr
QuestMap::const_iterator itr = mQuestTemplates.find(quest_id);
return itr != mQuestTemplates.end() ? itr->second : NULL;
}
+
QuestMap const& GetQuestTemplates() const { return mQuestTemplates; }
uint32 GetQuestForAreaTrigger(uint32 Trigger_ID) const
@@ -696,6 +698,7 @@ class ObjectMgr
return itr->second;
return 0;
}
+
bool IsTavernAreaTrigger(uint32 Trigger_ID) const
{
return mTavernAreaTriggerSet.find(Trigger_ID) != mTavernAreaTriggerSet.end();
diff --git a/src/server/game/Maps/MapInstanced.cpp b/src/server/game/Maps/MapInstanced.cpp
index 2dafd44b0d1..fbe609bee23 100755
--- a/src/server/game/Maps/MapInstanced.cpp
+++ b/src/server/game/Maps/MapInstanced.cpp
@@ -124,9 +124,17 @@ Map* MapInstanced::CreateInstanceForPlayer(const uint32 mapId, Player* player)
// the instance id is set in battlegroundid
NewInstanceId = player->GetBattlegroundId();
if (!NewInstanceId) return NULL;
- map = FindInstanceMap(NewInstanceId);
+ map = sMapMgr->FindMap(mapId, NewInstanceId);
if (!map)
- map = CreateBattleground(NewInstanceId, player->GetBattleground());
+ {
+ if (Battleground* bg = player->GetBattleground())
+ map = CreateBattleground(NewInstanceId, bg);
+ else
+ {
+ player->TeleportToBGEntryPoint();
+ return NULL;
+ }
+ }
}
else
{
diff --git a/src/server/game/Maps/ZoneScript.h b/src/server/game/Maps/ZoneScript.h
index 8112d101c24..df6349a7664 100755
--- a/src/server/game/Maps/ZoneScript.h
+++ b/src/server/game/Maps/ZoneScript.h
@@ -37,7 +37,7 @@ class ZoneScript
virtual void OnGameObjectCreate(GameObject* /*go*/) {}
virtual void OnGameObjectRemove(GameObject* /*go*/) {}
- virtual void OnCreatureDeath(Creature* /*creature*/) {}
+ virtual void OnUnitDeath(Unit* /*unit*/) {}
//All-purpose data storage 64 bit
virtual uint64 GetData64(uint32 /*DataId*/) { return 0; }
diff --git a/src/server/game/Quests/QuestDef.cpp b/src/server/game/Quests/QuestDef.cpp
index 14a6577b1b5..0467eaa3253 100755
--- a/src/server/game/Quests/QuestDef.cpp
+++ b/src/server/game/Quests/QuestDef.cpp
@@ -77,7 +77,7 @@ Quest::Quest(Field* questRecord)
for (int i = 0; i < QUEST_REWARD_CHOICES_COUNT; ++i)
RewardChoiceItemCount[i] = questRecord[57+i].GetUInt32();
-
+
for (int i = 0; i < QUEST_REPUTATIONS_COUNT; ++i)
RewardFactionId[i] = questRecord[63+i].GetUInt32();
@@ -86,7 +86,7 @@ Quest::Quest(Field* questRecord)
for (int i = 0; i < QUEST_REPUTATIONS_COUNT; ++i)
RewardFactionValueIdOverride[i] = questRecord[73+i].GetInt32();
-
+
PointMapId = questRecord[78].GetUInt32();
PointX = questRecord[79].GetFloat();
PointY = questRecord[80].GetFloat();
@@ -202,7 +202,7 @@ uint32 Quest::XPValue(Player* player) const
return 0;
}
-int32 Quest::GetRewOrReqMoney() const
+int32 Quest::GetRewOrReqMoney() const
{
if (RewardOrRequiredMoney <= 0)
return RewardOrRequiredMoney;
diff --git a/src/server/game/Quests/QuestDef.h b/src/server/game/Quests/QuestDef.h
index 90905f2fa34..3e142e1d84c 100755
--- a/src/server/game/Quests/QuestDef.h
+++ b/src/server/game/Quests/QuestDef.h
@@ -251,6 +251,7 @@ class Quest
uint32 GetFlags() const { return Flags; }
bool IsDaily() const { return Flags & QUEST_FLAGS_DAILY; }
bool IsWeekly() const { return Flags & QUEST_FLAGS_WEEKLY; }
+ bool IsSeasonal() const { return ZoneOrSort == -QUEST_SORT_SEASONAL; }
bool IsDailyOrWeekly() const { return Flags & (QUEST_FLAGS_DAILY | QUEST_FLAGS_WEEKLY); }
bool IsAutoAccept() const { return Flags & QUEST_FLAGS_AUTO_ACCEPT; }
bool IsRaidQuest() const { return Type == QUEST_TYPE_RAID || Type == QUEST_TYPE_RAID_10 || Type == QUEST_TYPE_RAID_25; }
diff --git a/src/server/game/Server/Protocol/Handlers/CharacterHandler.cpp b/src/server/game/Server/Protocol/Handlers/CharacterHandler.cpp
index 11de2c68ca1..fd649175f76 100755..100644
--- a/src/server/game/Server/Protocol/Handlers/CharacterHandler.cpp
+++ b/src/server/game/Server/Protocol/Handlers/CharacterHandler.cpp
@@ -93,9 +93,13 @@ bool LoginQueryHolder::Initialize()
stmt->setUInt32(0, lowGuid);
res &= SetPreparedQuery(PLAYER_LOGIN_QUERY_LOADDAILYQUESTSTATUS, stmt);
- stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_CHARACTER_WEKLYQUESTSTATUS);
+ stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_CHARACTER_WEEKLYQUESTSTATUS);
stmt->setUInt32(0, lowGuid);
- res &= SetPreparedQuery(PLAYER_LOGIN_QUERY_LOADWEKLYQUESTSTATUS, stmt);
+ res &= SetPreparedQuery(PLAYER_LOGIN_QUERY_LOADWEEKLYQUESTSTATUS, stmt);
+
+ stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_CHARACTER_SEASONALQUESTSTATUS);
+ stmt->setUInt32(0, lowGuid);
+ res &= SetPreparedQuery(PLAYER_LOGIN_QUERY_LOADSEASONALQUESTSTATUS, stmt);
stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_CHARACTER_REPUTATION);
stmt->setUInt32(0, lowGuid);
@@ -1796,7 +1800,9 @@ void WorldSession::HandleCharFactionOrRaceChange(WorldPacket& recv_data)
if (!sWorld->getBoolConfig(CONFIG_ALLOW_TWO_SIDE_INTERACTION_GUILD))
{
// Reset guild
- trans->PAppend("DELETE FROM `guild_member` WHERE `guid`= '%u'", lowGuid);
+ if (QueryResult result = CharacterDatabase.PQuery("SELECT guildid FROM `guild_member` WHERE guid ='%u'", lowGuid))
+ if (Guild* guild = sGuildMgr->GetGuildById((result->Fetch()[0]).GetUInt32()))
+ guild->DeleteMember(MAKE_NEW_GUID(lowGuid, 0, HIGHGUID_PLAYER));
}
if (!sWorld->getBoolConfig(CONFIG_ALLOW_TWO_SIDE_ADD_FRIEND))
diff --git a/src/server/game/Spells/Auras/SpellAuras.cpp b/src/server/game/Spells/Auras/SpellAuras.cpp
index 3d964a6e14e..5577422919f 100755
--- a/src/server/game/Spells/Auras/SpellAuras.cpp
+++ b/src/server/game/Spells/Auras/SpellAuras.cpp
@@ -1567,6 +1567,16 @@ void Aura::HandleAuraSpecificMods(AuraApplication const* aurApp, Unit* caster, b
break;
}
break;
+ case SPELLFAMILY_DRUID:
+ // Enrage
+ if ((GetSpellInfo()->SpellFamilyFlags[0] & 0x80000) && GetSpellInfo()->SpellIconID == 961)
+ {
+ if (target->HasAura(70726)) // Item - Druid T10 Feral 4P Bonus
+ if (apply)
+ target->CastSpell(target, 70725, true);
+ break;
+ }
+ break;
case SPELLFAMILY_ROGUE:
// Stealth
if (GetSpellInfo()->SpellFamilyFlags[0] & 0x00400000)
diff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp
index bbc07c0572e..f76dbd7be47 100755
--- a/src/server/game/Spells/Spell.cpp
+++ b/src/server/game/Spells/Spell.cpp
@@ -1562,7 +1562,7 @@ SpellMissInfo Spell::DoSpellHitOnUnit(Unit* unit, const uint32 effectMask, bool
}
for (uint32 effectNumber = 0; effectNumber < MAX_SPELL_EFFECTS; ++effectNumber)
- if (effectMask & (1 << effectNumber))
+ if (effectMask & (1 << effectNumber) && !unit->IsImmunedToSpellEffect(m_spellInfo, effectNumber)) //Handle effect only if the target isn't immune.
HandleEffects(unit, NULL, NULL, effectNumber, SPELL_EFFECT_HANDLE_HIT_TARGET);
return SPELL_MISS_NONE;
diff --git a/src/server/game/Spells/SpellEffects.cpp b/src/server/game/Spells/SpellEffects.cpp
index 2fa7bf37de9..40b3101cfd5 100755
--- a/src/server/game/Spells/SpellEffects.cpp
+++ b/src/server/game/Spells/SpellEffects.cpp
@@ -1145,9 +1145,13 @@ void Spell::EffectDummy(SpellEffIndex effIndex)
return;
m_caster->CastCustomSpell(unitTarget, 52752, &damage, NULL, NULL, true);
return;
- case 54171: //Divine Storm
+ case 54171: // Divine Storm
{
- m_caster->CastCustomSpell(unitTarget, 54172, &damage, 0, 0, true);
+ if (m_UniqueTargetInfo.size())
+ {
+ int32 heal = damage / m_UniqueTargetInfo.size();
+ m_caster->CastCustomSpell(unitTarget, 54172, &heal, NULL, NULL, true);
+ }
return;
}
case 58418: // Portal to Orgrimmar
@@ -1374,16 +1378,6 @@ void Spell::EffectDummy(SpellEffIndex effIndex)
}
break;
case SPELLFAMILY_PALADIN:
- // Divine Storm
- if (m_spellInfo->SpellFamilyFlags[1] & SPELLFAMILYFLAG1_PALADIN_DIVINESTORM && effIndex == 1)
- {
- int32 dmg = CalculatePctN(m_damage, damage);
- if (!unitTarget)
- unitTarget = m_caster;
- m_caster->CastCustomSpell(unitTarget, 54171, &dmg, 0, 0, true);
- return;
- }
-
switch (m_spellInfo->Id)
{
case 31789: // Righteous Defense (step 1)
@@ -7002,10 +6996,35 @@ void Spell::EffectActivateRune(SpellEffIndex effIndex)
{
if (player->GetRuneCooldown(j) && player->GetCurrentRune(j) == RuneType(m_spellInfo->Effects[effIndex].MiscValue))
{
+ if (m_spellInfo->Id == 45529)
+ if (player->GetBaseRune(j) != RuneType(m_spellInfo->Effects[effIndex].MiscValueB))
+ continue;
player->SetRuneCooldown(j, 0);
--count;
}
}
+
+ // Blood Tap
+ if (m_spellInfo->Id == 45529 && count > 0)
+ {
+ for (uint32 l = 0; l < MAX_RUNES && count > 0; ++l)
+ {
+ // Check if both runes are on cd as that is the only time when this needs to come into effect
+ if ((player->GetRuneCooldown(l) && player->GetCurrentRune(l) == RuneType(m_spellInfo->Effects[effIndex].MiscValueB)) && (player->GetRuneCooldown(l+1) && player->GetCurrentRune(l+1) == RuneType(m_spellInfo->Effects[effIndex].MiscValueB)))
+ {
+ // Should always update the rune with the lowest cd
+ if (player->GetRuneCooldown(l) >= player->GetRuneCooldown(l+1))
+ l++;
+ player->SetRuneCooldown(l, 0);
+ --count;
+ // is needed to push through to the client that the rune is active
+ player->ResyncRunes(MAX_RUNES);
+ }
+ else
+ break;
+ }
+ }
+
// Empower rune weapon
if (m_spellInfo->Id == 47568)
{
diff --git a/src/server/game/Spells/SpellInfo.cpp b/src/server/game/Spells/SpellInfo.cpp
index 7836c177c26..fb8018fb5ae 100644
--- a/src/server/game/Spells/SpellInfo.cpp
+++ b/src/server/game/Spells/SpellInfo.cpp
@@ -1755,6 +1755,14 @@ Mechanics SpellInfo::GetEffectMechanic(uint8 effIndex) const
return MECHANIC_NONE;
}
+bool SpellInfo::HasAnyEffectMechanic() const
+{
+ for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
+ if (Effects[i].Mechanic)
+ return true;
+ return false;
+}
+
uint32 SpellInfo::GetDispelMask() const
{
return GetDispelMask(DispelType(Dispel));
diff --git a/src/server/game/Spells/SpellInfo.h b/src/server/game/Spells/SpellInfo.h
index cdc24f9ceac..90b79d4da28 100644
--- a/src/server/game/Spells/SpellInfo.h
+++ b/src/server/game/Spells/SpellInfo.h
@@ -446,6 +446,7 @@ public:
uint32 GetEffectMechanicMask(uint8 effIndex) const;
uint32 GetSpellMechanicMaskByEffectMask(uint32 effectMask) const;
Mechanics GetEffectMechanic(uint8 effIndex) const;
+ bool HasAnyEffectMechanic() const;
uint32 GetDispelMask() const;
static uint32 GetDispelMask(DispelType type);
uint32 GetExplicitTargetMask() const;
diff --git a/src/server/game/Spells/SpellMgr.cpp b/src/server/game/Spells/SpellMgr.cpp
index b7c31ee29c6..e57cbf4a390 100755
--- a/src/server/game/Spells/SpellMgr.cpp
+++ b/src/server/game/Spells/SpellMgr.cpp
@@ -2960,8 +2960,10 @@ void SpellMgr::LoadDbcDataCorrections()
switch (spellInfo->Id)
{
- case 42835: // Spout
- spellInfo->Effect[0] = 0; // remove damage effect, only anim is needed
+ case 40244: case 40245: // Simon Game Visual
+ case 40246: case 40247: // Simon Game Visual
+ case 42835: // Spout, remove damage effect, only anim is needed
+ spellInfo->Effect[0] = 0;
break;
case 30657: // Quake
spellInfo->EffectTriggerSpell[0] = 30571;
@@ -3495,6 +3497,11 @@ void SpellMgr::LoadDbcDataCorrections()
case 72405: // Broken Frostmourne
spellInfo->EffectRadiusIndex[1] = EFFECT_RADIUS_200_YARDS; // 200yd
break;
+ case 40055: // Introspection
+ case 40165: // Introspection
+ case 40166: // Introspection
+ case 40167: // Introspection
+ spellInfo->Attributes |= SPELL_ATTR0_NEGATIVE_1;
default:
break;
}
diff --git a/src/server/game/World/World.cpp b/src/server/game/World/World.cpp
index 388bafc503d..426a93fda57 100755
--- a/src/server/game/World/World.cpp
+++ b/src/server/game/World/World.cpp
@@ -2748,6 +2748,17 @@ void World::ResetWeeklyQuests()
sPoolMgr->ChangeWeeklyQuests();
}
+void World::ResetEventSeasonalQuests(uint16 event_id)
+{
+ PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_QUEST_STATUS_SEASONAL);
+ stmt->setUInt16(0,event_id);
+ CharacterDatabase.Execute(stmt);
+
+ for (SessionMap::const_iterator itr = m_sessions.begin(); itr != m_sessions.end(); ++itr)
+ if (itr->second->GetPlayer())
+ itr->second->GetPlayer()->ResetSeasonalQuestStatus(event_id);
+}
+
void World::ResetRandomBG()
{
sLog->outDetail("Random BG status reset for all characters.");
diff --git a/src/server/game/World/World.h b/src/server/game/World/World.h
index 02438375058..bedd8a87b20 100755
--- a/src/server/game/World/World.h
+++ b/src/server/game/World/World.h
@@ -746,6 +746,7 @@ class World
uint32 GetCleaningFlags() const { return m_CleaningFlags; }
void SetCleaningFlags(uint32 flags) { m_CleaningFlags = flags; }
+ void ResetEventSeasonalQuests(uint16 event_id);
protected:
void _UpdateGameTime();
// callback for UpdateRealmCharacters
diff --git a/src/server/scripts/Commands/cs_account.cpp b/src/server/scripts/Commands/cs_account.cpp
index 3ab0306f55a..bd415c0f79f 100644
--- a/src/server/scripts/Commands/cs_account.cpp
+++ b/src/server/scripts/Commands/cs_account.cpp
@@ -109,6 +109,7 @@ public:
{
case AOR_OK:
handler->PSendSysMessage(LANG_ACCOUNT_CREATED, accountName);
+ sLog->outChar("Account: %d (IP: %s) Character:[%s] (GUID: %u) Change Password.", handler->GetSession()->GetAccountId(),handler->GetSession()->GetRemoteAddress().c_str(), handler->GetSession()->GetPlayer()->GetName(), handler->GetSession()->GetPlayer()->GetGUIDLow());
break;
case AOR_NAME_TOO_LONG:
handler->SendSysMessage(LANG_ACCOUNT_TOO_LONG);
diff --git a/src/server/scripts/Commands/cs_reload.cpp b/src/server/scripts/Commands/cs_reload.cpp
index b1aaf82e35b..4d8ce4ef4ed 100644
--- a/src/server/scripts/Commands/cs_reload.cpp
+++ b/src/server/scripts/Commands/cs_reload.cpp
@@ -36,6 +36,7 @@ EndScriptData */
#include "SkillDiscovery.h"
#include "SkillExtraItems.h"
#include "Chat.h"
+#include "WaypointManager.h"
class reload_commandscript : public CommandScript
{
@@ -144,13 +145,14 @@ public:
{ "spell_linked_spell", SEC_ADMINISTRATOR, true, &HandleReloadSpellLinkedSpellCommand, "", NULL },
{ "spell_pet_auras", SEC_ADMINISTRATOR, true, &HandleReloadSpellPetAurasCommand, "", NULL },
{ "spell_proc_event", SEC_ADMINISTRATOR, true, &HandleReloadSpellProcEventCommand, "", NULL },
- { "spell_proc", SEC_ADMINISTRATOR, true, &HandleReloadSpellProcsCommand, "", NULL },
+ { "spell_proc", SEC_ADMINISTRATOR, true, &HandleReloadSpellProcsCommand, "", NULL },
{ "spell_scripts", SEC_ADMINISTRATOR, true, &HandleReloadSpellScriptsCommand, "", NULL },
{ "spell_target_position", SEC_ADMINISTRATOR, true, &HandleReloadSpellTargetPositionCommand, "", NULL },
{ "spell_threats", SEC_ADMINISTRATOR, true, &HandleReloadSpellThreatsCommand, "", NULL },
{ "spell_group_stack_rules", SEC_ADMINISTRATOR, true, &HandleReloadSpellGroupStackRulesCommand, "", NULL },
{ "trinity_string", SEC_ADMINISTRATOR, true, &HandleReloadTrinityStringCommand, "", NULL },
{ "waypoint_scripts", SEC_ADMINISTRATOR, true, &HandleReloadWpScriptsCommand, "", NULL },
+ { "waypoint_data", SEC_ADMINISTRATOR, true, &HandleReloadWpCommand, "", NULL },
{ "vehicle_accessory", SEC_ADMINISTRATOR, true, &HandleReloadVehicleAccessoryCommand, "", NULL },
{ "vehicle_template_accessory", SEC_ADMINISTRATOR, true, &HandleReloadVehicleTemplateAccessoryCommand, "", NULL },
{ NULL, 0, false, NULL, "", NULL }
@@ -264,6 +266,7 @@ public:
handler->SendGlobalGMSysMessage("DB tables `*_scripts` reloaded.");
HandleReloadDbScriptStringCommand(handler, "a");
HandleReloadWpScriptsCommand(handler, "a");
+ HandleReloadWpCommand(handler, "a");
return true;
}
@@ -986,6 +989,19 @@ public:
return true;
}
+ static bool HandleReloadWpCommand(ChatHandler* handler, const char* args)
+ {
+ if (*args != 'a')
+ sLog->outString("Re-Loading Waypoints data from 'waypoints_data'");
+
+ sWaypointMgr->Load();
+
+ if (*args != 'a')
+ sLog->outString("DB Table 'waypoint_data' reloaded.");
+
+ return true;
+ }
+
static bool HandleReloadEventAITextsCommand(ChatHandler* handler, const char* /*args*/)
{
diff --git a/src/server/scripts/Northrend/IcecrownCitadel/instance_icecrown_citadel.cpp b/src/server/scripts/Northrend/IcecrownCitadel/instance_icecrown_citadel.cpp
index 946321c3de3..2a61d00d119 100755
--- a/src/server/scripts/Northrend/IcecrownCitadel/instance_icecrown_citadel.cpp
+++ b/src/server/scripts/Northrend/IcecrownCitadel/instance_icecrown_citadel.cpp
@@ -335,8 +335,12 @@ class instance_icecrown_citadel : public InstanceMapScript
return entry;
}
- void OnCreatureDeath(Creature* creature)
+ void OnUnitDeath(Unit* unit)
{
+ Creature* creature = unit->ToCreature();
+ if (!creature)
+ return;
+
switch (creature->GetEntry())
{
case NPC_YMIRJAR_BATTLE_MAIDEN:
diff --git a/src/server/scripts/Northrend/Naxxramas/instance_naxxramas.cpp b/src/server/scripts/Northrend/Naxxramas/instance_naxxramas.cpp
index cc03caef58e..32cb279ce5f 100644
--- a/src/server/scripts/Northrend/Naxxramas/instance_naxxramas.cpp
+++ b/src/server/scripts/Northrend/Naxxramas/instance_naxxramas.cpp
@@ -121,24 +121,24 @@ public:
LoadMinionData(minionData);
}
- std::set<uint64> HeiganEruptionGUID[4];
- uint64 GothikGateGUID;
- uint64 HorsemenChestGUID;
- uint64 SapphironGUID;
- uint64 uiFaerlina;
- uint64 uiThane;
- uint64 uiLady;
- uint64 uiBaron;
- uint64 uiSir;
-
- uint64 uiThaddius;
- uint64 uiHeigan;
- uint64 uiFeugen;
- uint64 uiStalagg;
-
- uint64 uiKelthuzad;
- uint64 uiKelthuzadTrigger;
- uint64 uiPortals[4];
+ std::set<uint64> heiganEruptionGUID[4];
+ uint64 gothikGateGUID;
+ uint64 horsemenChestGUID;
+ uint64 sapphironGUID;
+ uint64 faerlinaGUID;
+ uint64 thaneGUID;
+ uint64 ladyGUID;
+ uint64 baronGUID;
+ uint64 sirGUID;
+
+ uint64 thaddiusGUID;
+ uint64 heiganGUID;
+ uint64 feugenGUID;
+ uint64 stalaggGUID;
+
+ uint64 kelthuzadGUID;
+ uint64 kelthuzadTriggerGUID;
+ uint64 portalsGUID[4];
uint32 AbominationCount;
@@ -147,41 +147,46 @@ public:
time_t minHorsemenDiedTime;
time_t maxHorsemenDiedTime;
+ uint32 playerDied;
+
void Initialize()
{
- GothikGateGUID = 0;
- HorsemenChestGUID = 0;
- SapphironGUID = 0;
- uiFaerlina = 0;
- uiThane = 0;
- uiLady = 0;
- uiBaron = 0;
- uiSir = 0;
- uiThaddius = 0;
- uiHeigan = 0;
- uiFeugen = 0;
- uiStalagg = 0;
- uiKelthuzad = 0;
- uiKelthuzadTrigger = 0;
-
- memset(uiPortals, 0, sizeof(uiPortals));
+ gothikGateGUID = 0;
+ horsemenChestGUID = 0;
+ sapphironGUID = 0;
+ faerlinaGUID = 0;
+ thaneGUID = 0;
+ ladyGUID = 0;
+ baronGUID = 0;
+ sirGUID = 0;
+ thaddiusGUID = 0;
+ heiganGUID = 0;
+ feugenGUID = 0;
+ stalaggGUID = 0;
+ kelthuzadGUID = 0;
+ kelthuzadTriggerGUID = 0;
+
+ playerDied = 0;
+ gothikDoorState = GO_STATE_ACTIVE;
+
+ memset(portalsGUID, 0, sizeof(portalsGUID));
}
void OnCreatureCreate(Creature* creature)
{
switch (creature->GetEntry())
{
- case 15989: SapphironGUID = creature->GetGUID(); return;
- case 15953: uiFaerlina = creature->GetGUID(); return;
- case 16064: uiThane = creature->GetGUID(); return;
- case 16065: uiLady = creature->GetGUID(); return;
- case 30549: uiBaron = creature->GetGUID(); return;
- case 16063: uiSir = creature->GetGUID(); return;
- case 15928: uiThaddius = creature->GetGUID(); return;
- case 15936: uiHeigan = creature->GetGUID(); return;
- case 15930: uiFeugen = creature->GetGUID(); return;
- case 15929: uiStalagg = creature->GetGUID(); return;
- case 15990: uiKelthuzad = creature->GetGUID(); return;
+ case 15989: sapphironGUID = creature->GetGUID(); return;
+ case 15953: faerlinaGUID = creature->GetGUID(); return;
+ case 16064: thaneGUID = creature->GetGUID(); return;
+ case 16065: ladyGUID = creature->GetGUID(); return;
+ case 30549: baronGUID = creature->GetGUID(); return;
+ case 16063: sirGUID = creature->GetGUID(); return;
+ case 15928: thaddiusGUID = creature->GetGUID(); return;
+ case 15936: heiganGUID = creature->GetGUID(); return;
+ case 15930: feugenGUID = creature->GetGUID(); return;
+ case 15929: stalaggGUID = creature->GetGUID(); return;
+ case 15990: kelthuzadGUID = creature->GetGUID(); return;
}
AddMinion(creature, true);
@@ -197,7 +202,7 @@ public:
if (go->GetGOInfo()->displayId == 6785 || go->GetGOInfo()->displayId == 1287)
{
uint32 section = GetEruptionSection(go->GetPositionX(), go->GetPositionY());
- HeiganEruptionGUID[section].insert(go->GetGUID());
+ heiganEruptionGUID[section].insert(go->GetGUID());
return;
}
@@ -205,29 +210,29 @@ public:
switch (go->GetEntry())
{
case GO_GOTHIK_GATE:
- GothikGateGUID = go->GetGUID();
+ gothikGateGUID = go->GetGUID();
go->SetGoState(gothikDoorState);
break;
case GO_HORSEMEN_CHEST:
- HorsemenChestGUID = go->GetGUID();
+ horsemenChestGUID = go->GetGUID();
break;
case GO_HORSEMEN_CHEST_HERO:
- HorsemenChestGUID = go->GetGUID();
+ horsemenChestGUID = go->GetGUID();
break;
case GO_KELTHUZAD_PORTAL01:
- uiPortals[0] = go->GetGUID();
+ portalsGUID[0] = go->GetGUID();
break;
case GO_KELTHUZAD_PORTAL02:
- uiPortals[1] = go->GetGUID();
+ portalsGUID[1] = go->GetGUID();
break;
case GO_KELTHUZAD_PORTAL03:
- uiPortals[2] = go->GetGUID();
+ portalsGUID[2] = go->GetGUID();
break;
case GO_KELTHUZAD_PORTAL04:
- uiPortals[3] = go->GetGUID();
+ portalsGUID[3] = go->GetGUID();
break;
case GO_KELTHUZAD_TRIGGER:
- uiKelthuzadTrigger = go->GetGUID();
+ kelthuzadTriggerGUID = go->GetGUID();
break;
default:
break;
@@ -242,16 +247,16 @@ public:
{
uint32 section = GetEruptionSection(go->GetPositionX(), go->GetPositionY());
- HeiganEruptionGUID[section].erase(go->GetGUID());
+ heiganEruptionGUID[section].erase(go->GetGUID());
return;
}
switch (go->GetEntry())
{
case GO_BIRTH:
- if (SapphironGUID)
+ if (sapphironGUID)
{
- if (Creature* pSapphiron = instance->GetCreature(SapphironGUID))
+ if (Creature* pSapphiron = instance->GetCreature(sapphironGUID))
pSapphiron->AI()->DoAction(DATA_SAPPHIRON_BIRTH);
return;
}
@@ -263,6 +268,15 @@ public:
AddDoor(go, false);
}
+ void OnUnitDeath(Unit* unit)
+ {
+ if (unit->GetTypeId() == TYPEID_PLAYER && IsEncounterInProgress())
+ {
+ playerDied = 1;
+ SaveToDB();
+ }
+ }
+
void SetData(uint32 id, uint32 value)
{
switch (id)
@@ -271,11 +285,10 @@ public:
HeiganErupt(value);
break;
case DATA_GOTHIK_GATE:
- if (GameObject* gothikGate = instance->GetGameObject(GothikGateGUID))
+ if (GameObject* gothikGate = instance->GetGameObject(gothikGateGUID))
gothikGate->SetGoState(GOState(value));
gothikDoorState = GOState(value);
break;
-
case DATA_HORSEMEN0:
case DATA_HORSEMEN1:
case DATA_HORSEMEN2:
@@ -319,35 +332,35 @@ public:
switch (id)
{
case DATA_FAERLINA:
- return uiFaerlina;
+ return faerlinaGUID;
case DATA_THANE:
- return uiThane;
+ return thaneGUID;
case DATA_LADY:
- return uiLady;
+ return ladyGUID;
case DATA_BARON:
- return uiBaron;
+ return baronGUID;
case DATA_SIR:
- return uiSir;
+ return sirGUID;
case DATA_THADDIUS:
- return uiThaddius;
+ return thaddiusGUID;
case DATA_HEIGAN:
- return uiHeigan;
+ return heiganGUID;
case DATA_FEUGEN:
- return uiFeugen;
+ return feugenGUID;
case DATA_STALAGG:
- return uiStalagg;
+ return stalaggGUID;
case DATA_KELTHUZAD:
- return uiKelthuzad;
+ return kelthuzadGUID;
case DATA_KELTHUZAD_PORTAL01:
- return uiPortals[0];
+ return portalsGUID[0];
case DATA_KELTHUZAD_PORTAL02:
- return uiPortals[1];
+ return portalsGUID[1];
case DATA_KELTHUZAD_PORTAL03:
- return uiPortals[2];
+ return portalsGUID[2];
case DATA_KELTHUZAD_PORTAL04:
- return uiPortals[3];
+ return portalsGUID[3];
case DATA_KELTHUZAD_TRIGGER:
- return uiKelthuzadTrigger;
+ return kelthuzadTriggerGUID;
}
return 0;
}
@@ -359,7 +372,7 @@ public:
if (id == BOSS_HORSEMEN && state == DONE)
{
- if (GameObject* pHorsemenChest = instance->GetGameObject(HorsemenChestGUID))
+ if (GameObject* pHorsemenChest = instance->GetGameObject(horsemenChestGUID))
pHorsemenChest->SetRespawnTime(pHorsemenChest->GetRespawnDelay());
}
@@ -373,7 +386,7 @@ public:
if (i == section)
continue;
- for (std::set<uint64>::const_iterator itr = HeiganEruptionGUID[i].begin(); itr != HeiganEruptionGUID[i].end(); ++itr)
+ for (std::set<uint64>::const_iterator itr = heiganEruptionGUID[i].begin(); itr != heiganEruptionGUID[i].end(); ++itr)
{
if (GameObject* pHeiganEruption = instance->GetGameObject(*itr))
{
@@ -384,6 +397,21 @@ public:
}
}
+ // This Function is called in CheckAchievementCriteriaMeet and CheckAchievementCriteriaMeet is called before SetBossState(bossId, DONE),
+ // so to check if all bosses are done the checker must exclude 1 boss, the last done, if there is at most 1 encouter in progress when is
+ // called this function then all bosses are done. The one boss that check is the boss that calls this function, so it is dead.
+ bool AreAllEncoutersDone()
+ {
+ uint32 numBossAlive = 0;
+ for (uint32 i = 0; i < MAX_BOSS_NUMBER; ++i)
+ if (GetBossState(i) != DONE)
+ numBossAlive++;
+
+ if (numBossAlive > 1)
+ return false;
+ return true;
+ }
+
bool CheckAchievementCriteriaMeet(uint32 criteria_id, Player const* /*source*/, Unit const* /*target = NULL*/, uint32 /*miscvalue1 = 0*/)
{
switch (criteria_id)
@@ -396,12 +424,22 @@ public:
if (Difficulty(instance->GetSpawnMode()) == RAID_DIFFICULTY_25MAN_NORMAL && (maxHorsemenDiedTime - minHorsemenDiedTime) < 15)
return true;
return false;
- case 13233: // Criteria for achievement 2186: The Immortal (25-man)
- // TODO.
- break;
- case 13237: // Criteria for achievement 2187: The Undying (10-man)
- // TODO.
- break;
+ // Difficulty checks are done on DB.
+ // Criteria for achievement 2186: The Immortal (25-man)
+ case 13233: // The Four Horsemen
+ case 13234: // Maexxna
+ case 13235: // Thaddius
+ case 13236: // Loatheb
+ case 7616: // Kel'Thuzad
+ // Criteria for achievement 2187: The Undying (10-man)
+ case 13237: // The Four Horsemen
+ case 13238: // Maexxna
+ case 13239: // Loatheb
+ case 13240: // Thaddius
+ case 7617: // Kel'Thuzad
+ if (AreAllEncoutersDone() && !playerDied)
+ return true;
+ return false;
}
return false;
}
@@ -409,16 +447,22 @@ public:
std::string GetSaveData()
{
std::ostringstream saveStream;
- saveStream << GetBossSaveData() << ' ' << gothikDoorState;
+ saveStream << GetBossSaveData() << gothikDoorState << ' ' << playerDied;
return saveStream.str();
}
void Load(const char * data)
{
std::istringstream loadStream(LoadBossState(data));
- uint32 buff;
+ uint32 temp, buff, buff2;
+
+ for (uint32 i = 0; i < MAX_BOSS_NUMBER; ++i)
+ loadStream >> temp;
+
loadStream >> buff;
gothikDoorState = GOState(buff);
+ loadStream >> buff2;
+ playerDied = buff2;
}
};
diff --git a/src/server/scripts/Northrend/Nexus/Oculus/instance_oculus.cpp b/src/server/scripts/Northrend/Nexus/Oculus/instance_oculus.cpp
index 1a62a6236e1..46498a69c6f 100644
--- a/src/server/scripts/Northrend/Nexus/Oculus/instance_oculus.cpp
+++ b/src/server/scripts/Northrend/Nexus/Oculus/instance_oculus.cpp
@@ -58,8 +58,12 @@ public:
gameObjectList.clear();
}
- void OnCreatureDeath(Creature* creature)
+ void OnUnitDeath(Unit* unit)
{
+ Creature* creature = unit->ToCreature();
+ if (!creature)
+ return;
+
if (creature->GetEntry() != NPC_CENTRIFUGE_CONSTRUCT)
return;
diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_freya.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_freya.cpp
index 7c8121f475f..f62c2d6c596 100644
--- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_freya.cpp
+++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_freya.cpp
@@ -436,7 +436,7 @@ class boss_freya : public CreatureScript
break;
case EVENT_WAVE:
SpawnWave();
- if (waveCount < 6)
+ if (waveCount <= 6) // If set to 6 The Bombs appear during the Final Add wave
events.ScheduleEvent(EVENT_WAVE, WAVE_TIME);
else
events.ScheduleEvent(EVENT_NATURE_BOMB, urand(10000, 20000));
diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/instance_ulduar.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/instance_ulduar.cpp
index a6f7af6e492..e12393f047f 100644
--- a/src/server/scripts/Northrend/Ulduar/Ulduar/instance_ulduar.cpp
+++ b/src/server/scripts/Northrend/Ulduar/Ulduar/instance_ulduar.cpp
@@ -358,8 +358,12 @@ class instance_ulduar : public InstanceMapScript
}
}
- void OnCreatureDeath(Creature* creature)
+ void OnUnitDeath(Unit* unit)
{
+ Creature* creature = unit->ToCreature();
+ if (!creature)
+ return;
+
switch (creature->GetEntry())
{
case NPC_CORRUPTED_SERVITOR:
diff --git a/src/server/scripts/Outland/blades_edge_mountains.cpp b/src/server/scripts/Outland/blades_edge_mountains.cpp
index d78d4afbfb8..97ce9f45430 100644
--- a/src/server/scripts/Outland/blades_edge_mountains.cpp
+++ b/src/server/scripts/Outland/blades_edge_mountains.cpp
@@ -562,6 +562,564 @@ class go_thunderspike : public GameObjectScript
}
};
+enum SimonGame
+{
+ NPC_SIMON_BUNNY = 22923,
+ NPC_APEXIS_GUARDIAN = 22275,
+
+ GO_APEXIS_RELIC = 185890,
+ GO_APEXIS_MONUMENT = 185944,
+ GO_AURA_BLUE = 185872,
+ GO_AURA_GREEN = 185873,
+ GO_AURA_RED = 185874,
+ GO_AURA_YELLOW = 185875,
+
+ GO_BLUE_CLUSTER_DISPLAY = 7369,
+ GO_GREEN_CLUSTER_DISPLAY = 7371,
+ GO_RED_CLUSTER_DISPLAY = 7373,
+ GO_YELLOW_CLUSTER_DISPLAY = 7375,
+ GO_BLUE_CLUSTER_DISPLAY_LARGE = 7364,
+ GO_GREEN_CLUSTER_DISPLAY_LARGE = 7365,
+ GO_RED_CLUSTER_DISPLAY_LARGE = 7366,
+ GO_YELLOW_CLUSTER_DISPLAY_LARGE = 7367,
+
+ SPELL_PRE_GAME_BLUE = 40176,
+ SPELL_PRE_GAME_GREEN = 40177,
+ SPELL_PRE_GAME_RED = 40178,
+ SPELL_PRE_GAME_YELLOW = 40179,
+ SPELL_VISUAL_BLUE = 40244,
+ SPELL_VISUAL_GREEN = 40245,
+ SPELL_VISUAL_RED = 40246,
+ SPELL_VISUAL_YELLOW = 40247,
+
+ SOUND_BLUE = 11588,
+ SOUND_GREEN = 11589,
+ SOUND_RED = 11590,
+ SOUND_YELLOW = 11591,
+ SOUND_DISABLE_NODE = 11758,
+
+ SPELL_AUDIBLE_GAME_TICK = 40391,
+ SPELL_VISUAL_START_PLAYER_LEVEL = 40436,
+ SPELL_VISUAL_START_AI_LEVEL = 40387,
+
+ SPELL_BAD_PRESS_TRIGGER = 41241,
+ SPELL_BAD_PRESS_DAMAGE = 40065,
+ SPELL_REWARD_BUFF_1 = 40310,
+ SPELL_REWARD_BUFF_2 = 40311,
+ SPELL_REWARD_BUFF_3 = 40312,
+};
+
+enum SimonEvents
+{
+ EVENT_SIMON_SETUP_PRE_GAME = 1,
+ EVENT_SIMON_PLAY_SEQUENCE = 2,
+ EVENT_SIMON_RESET_CLUSTERS = 3,
+ EVENT_SIMON_PERIODIC_PLAYER_CHECK = 4,
+ EVENT_SIMON_TOO_LONG_TIME = 5,
+ EVENT_SIMON_GAME_TICK = 6,
+ EVENT_SIMON_ROUND_FINISHED = 7,
+
+ ACTION_SIMON_CORRECT_FULL_SEQUENCE = 8,
+ ACTION_SIMON_WRONG_SEQUENCE = 9,
+ ACTION_SIMON_ROUND_FINISHED = 10,
+};
+
+enum SimonColors
+{
+ SIMON_BLUE = 0,
+ SIMON_RED = 1,
+ SIMON_GREEN = 2,
+ SIMON_YELLOW = 3,
+ SIMON_MAX_COLORS = 4,
+};
+
+class npc_simon_bunny : public CreatureScript
+{
+ public:
+ npc_simon_bunny() : CreatureScript("npc_simon_bunny") { }
+
+ struct npc_simon_bunnyAI : public ScriptedAI
+ {
+ npc_simon_bunnyAI(Creature* creature) : ScriptedAI(creature) { }
+
+ bool large;
+ bool listening;
+ uint8 gameLevel;
+ uint8 fails;
+ uint8 gameTicks;
+ uint64 playerGUID;
+ uint32 clusterIds[SIMON_MAX_COLORS];
+ float zCoordCorrection;
+ float searchDistance;
+ EventMap _events;
+ std::list<uint8> colorSequence, playableSequence, playerSequence;
+
+ void UpdateAI(const uint32 diff)
+ {
+ _events.Update(diff);
+
+ switch(_events.ExecuteEvent())
+ {
+ case EVENT_SIMON_PERIODIC_PLAYER_CHECK:
+ if (!CheckPlayer())
+ ResetNode();
+ else
+ _events.ScheduleEvent(EVENT_SIMON_PERIODIC_PLAYER_CHECK, 2000);
+ break;
+ case EVENT_SIMON_SETUP_PRE_GAME:
+ SetUpPreGame();
+ _events.CancelEvent(EVENT_SIMON_GAME_TICK);
+ _events.ScheduleEvent(EVENT_SIMON_PLAY_SEQUENCE, 1000);
+ break;
+ case EVENT_SIMON_PLAY_SEQUENCE:
+ if (!playableSequence.empty())
+ {
+ PlayNextColor();
+ _events.ScheduleEvent(EVENT_SIMON_PLAY_SEQUENCE, 1500);
+ }
+ else
+ {
+ listening = true;
+ DoCast(SPELL_VISUAL_START_PLAYER_LEVEL);
+ playerSequence.clear();
+ PrepareClusters();
+ gameTicks = 0;
+ _events.ScheduleEvent(EVENT_SIMON_GAME_TICK, 3000);
+ }
+ break;
+ case EVENT_SIMON_GAME_TICK:
+ DoCast(SPELL_AUDIBLE_GAME_TICK);
+
+ if (gameTicks > gameLevel)
+ _events.ScheduleEvent(EVENT_SIMON_TOO_LONG_TIME, 500);
+ else
+ _events.ScheduleEvent(EVENT_SIMON_GAME_TICK, 3000);
+ gameTicks++;
+ break;
+ case EVENT_SIMON_RESET_CLUSTERS:
+ PrepareClusters(true);
+ break;
+ case EVENT_SIMON_TOO_LONG_TIME:
+ DoAction(ACTION_SIMON_WRONG_SEQUENCE);
+ break;
+ case EVENT_SIMON_ROUND_FINISHED:
+ DoAction(ACTION_SIMON_ROUND_FINISHED);
+ break;
+ }
+ }
+
+ void DoAction(const int32 action)
+ {
+ switch (action)
+ {
+ case ACTION_SIMON_ROUND_FINISHED:
+ listening = false;
+ DoCast(SPELL_VISUAL_START_AI_LEVEL);
+ GiveRewardForLevel(gameLevel);
+ _events.CancelEventGroup(0);
+ if (gameLevel == 10)
+ ResetNode();
+ else
+ _events.ScheduleEvent(EVENT_SIMON_SETUP_PRE_GAME, 1000);
+ break;
+ case ACTION_SIMON_CORRECT_FULL_SEQUENCE:
+ gameLevel++;
+ DoAction(ACTION_SIMON_ROUND_FINISHED);
+ break;
+ case ACTION_SIMON_WRONG_SEQUENCE:
+ GivePunishment();
+ DoAction(ACTION_SIMON_ROUND_FINISHED);
+ break;
+ }
+ }
+
+ // Called by color clusters script (go_simon_cluster) and used for knowing the button pressed by player
+ void SetData(uint32 type, uint32 /*data*/)
+ {
+ if (!listening)
+ return;
+
+ uint8 pressedColor;
+
+ if (type == clusterIds[SIMON_RED])
+ pressedColor = SIMON_RED;
+ else if (type == clusterIds[SIMON_BLUE])
+ pressedColor = SIMON_BLUE;
+ else if (type == clusterIds[SIMON_GREEN])
+ pressedColor = SIMON_GREEN;
+ else if (type == clusterIds[SIMON_YELLOW])
+ pressedColor = SIMON_YELLOW;
+
+ PlayColor(pressedColor);
+ playerSequence.push_back(pressedColor);
+ _events.ScheduleEvent(EVENT_SIMON_RESET_CLUSTERS, 500);
+ CheckPlayerSequence();
+ }
+
+ // Used for getting involved player guid. Parameter id is used for defining if is a large(Monument) or small(Relic) node
+ void SetGUID(uint64 guid, int32 id)
+ {
+ me->SetFlying(true);
+
+ large = (bool)id;
+ playerGUID = guid;
+ StartGame();
+ }
+
+ /*
+ Resets all variables and also find the ids of the four closests color clusters, since every simon
+ node have diferent ids for clusters this is absolutely NECESSARY.
+ */
+ void StartGame()
+ {
+ listening = false;
+ gameLevel = 0;
+ fails = 0;
+ gameTicks = 0;
+ zCoordCorrection = large ? 8.0f : 2.75f;
+ searchDistance = large ? 13.0f : 5.0f;
+ colorSequence.clear();
+ playableSequence.clear();
+ playerSequence.clear();
+ me->SetFloatValue(OBJECT_FIELD_SCALE_X, large ? 2 : 1);
+
+ std::list<WorldObject*> ClusterList;
+ Trinity::AllWorldObjectsInRange objects(me, searchDistance);
+ Trinity::WorldObjectListSearcher<Trinity::AllWorldObjectsInRange> searcher(me, ClusterList, objects);
+ me->VisitNearbyObject(searchDistance, searcher);
+
+ for (std::list<WorldObject*>::const_iterator i = ClusterList.begin(); i != ClusterList.end(); ++i)
+ {
+ if (GameObject* go = (*i)->ToGameObject())
+ {
+ // We are checking for displayid because all simon nodes have 4 clusters with different entries
+ if (large)
+ {
+ switch (go->GetGOInfo()->displayId)
+ {
+ case GO_BLUE_CLUSTER_DISPLAY_LARGE: clusterIds[SIMON_BLUE] = go->GetEntry(); break;
+ case GO_RED_CLUSTER_DISPLAY_LARGE: clusterIds[SIMON_RED] = go->GetEntry(); break;
+ case GO_GREEN_CLUSTER_DISPLAY_LARGE: clusterIds[SIMON_GREEN] = go->GetEntry(); break;
+ case GO_YELLOW_CLUSTER_DISPLAY_LARGE: clusterIds[SIMON_YELLOW] = go->GetEntry(); break;
+ }
+ }
+ else
+ {
+ switch (go->GetGOInfo()->displayId)
+ {
+ case GO_BLUE_CLUSTER_DISPLAY: clusterIds[SIMON_BLUE] = go->GetEntry(); break;
+ case GO_RED_CLUSTER_DISPLAY: clusterIds[SIMON_RED] = go->GetEntry(); break;
+ case GO_GREEN_CLUSTER_DISPLAY: clusterIds[SIMON_GREEN] = go->GetEntry(); break;
+ case GO_YELLOW_CLUSTER_DISPLAY: clusterIds[SIMON_YELLOW] = go->GetEntry(); break;
+ }
+ }
+ }
+ }
+
+ _events.Reset();
+ _events.ScheduleEvent(EVENT_SIMON_ROUND_FINISHED, 1000);
+ _events.ScheduleEvent(EVENT_SIMON_PERIODIC_PLAYER_CHECK, 2000);
+
+ if (GameObject* relic = me->FindNearestGameObject(large ? GO_APEXIS_MONUMENT : GO_APEXIS_RELIC, searchDistance))
+ relic->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
+ }
+
+ // Called when despawning the bunny. Sets all the node GOs to their default states.
+ void ResetNode()
+ {
+ DoPlaySoundToSet(me, SOUND_DISABLE_NODE);
+
+ for (uint32 clusterId = SIMON_BLUE; clusterId < SIMON_MAX_COLORS; clusterId++)
+ if (GameObject* cluster = me->FindNearestGameObject(clusterIds[clusterId], searchDistance))
+ cluster->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
+
+ for (uint32 auraId = GO_AURA_BLUE; auraId <= GO_AURA_YELLOW; auraId++)
+ if (GameObject* auraGo = me->FindNearestGameObject(auraId, searchDistance))
+ auraGo->RemoveFromWorld();
+
+ if (GameObject* relic = me->FindNearestGameObject(large ? GO_APEXIS_MONUMENT : GO_APEXIS_RELIC, searchDistance))
+ relic->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
+
+ me->ForcedDespawn(1000);
+ }
+
+ /*
+ Called on every button click of player. Adds the clicked color to the player created sequence and
+ checks if it corresponds to the AI created sequence. If so, incremente gameLevel and start a new
+ round, if not, give punishment and restart current level.
+ */
+ void CheckPlayerSequence()
+ {
+ bool correct = true;
+ if (playerSequence.size() <= colorSequence.size())
+ for (std::list<uint8>::const_iterator i = playerSequence.begin(), j = colorSequence.begin(); i != playerSequence.end(); ++i, ++j)
+ if ((*i) != (*j))
+ correct = false;
+
+ if (correct && (playerSequence.size() == colorSequence.size()))
+ DoAction(ACTION_SIMON_CORRECT_FULL_SEQUENCE);
+ else if (!correct)
+ DoAction(ACTION_SIMON_WRONG_SEQUENCE);
+ }
+
+ /*
+ Generates a random sequence of colors depending on the gameLevel. We also copy this sequence to
+ the playableSequence wich will be used when playing the sequence to the player.
+ */
+ void GenerateColorSequence()
+ {
+ colorSequence.clear();
+ for (uint8 i = 0; i <= gameLevel; i++)
+ colorSequence.push_back(RAND(SIMON_BLUE, SIMON_RED, SIMON_GREEN, SIMON_YELLOW));
+
+ for (std::list<uint8>::const_iterator i = colorSequence.begin(); i != colorSequence.end(); ++i)
+ playableSequence.push_back(*i);
+ }
+
+
+ // Remove any existant glowing auras over clusters and set clusters ready for interating with them.
+ void PrepareClusters(bool clustersOnly = false)
+ {
+ for (uint32 clusterId = SIMON_BLUE; clusterId < SIMON_MAX_COLORS; clusterId++)
+ if (GameObject* cluster = me->FindNearestGameObject(clusterIds[clusterId], searchDistance))
+ cluster->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
+
+ if (clustersOnly)
+ return;
+
+ for (uint32 auraId = GO_AURA_BLUE; auraId <= GO_AURA_YELLOW; auraId++)
+ if (GameObject* auraGo = me->FindNearestGameObject(auraId, searchDistance))
+ auraGo->RemoveFromWorld();
+ }
+
+ /*
+ Called when AI is playing the sequence for player. We cast the visual spell and then remove the
+ casted color from the casting sequence.
+ */
+ void PlayNextColor()
+ {
+ PlayColor(*playableSequence.begin());
+ playableSequence.erase(playableSequence.begin());
+ }
+
+ // Casts a spell and plays a sound depending on parameter color.
+ void PlayColor(uint8 color)
+ {
+ switch (color)
+ {
+ case SIMON_BLUE:
+ DoCast(SPELL_VISUAL_BLUE);
+ DoPlaySoundToSet(me, SOUND_BLUE);
+ break;
+ case SIMON_GREEN:
+ DoCast(SPELL_VISUAL_GREEN);
+ DoPlaySoundToSet(me, SOUND_GREEN);
+ break;
+ case SIMON_RED:
+ DoCast(SPELL_VISUAL_RED);
+ DoPlaySoundToSet(me, SOUND_RED);
+ break;
+ case SIMON_YELLOW:
+ DoCast(SPELL_VISUAL_YELLOW);
+ DoPlaySoundToSet(me, SOUND_YELLOW);
+ break;
+ }
+ }
+
+ /*
+ Creates the transparent glowing auras on every cluster of this node.
+ After calling this function bunny is teleported to the center of the node.
+ */
+ void SetUpPreGame()
+ {
+ for (uint32 clusterId = SIMON_BLUE; clusterId < SIMON_MAX_COLORS; clusterId++)
+ {
+ if (GameObject* cluster = me->FindNearestGameObject(clusterIds[clusterId], 2.0f*searchDistance))
+ {
+ cluster->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
+
+ // break since we don't need glowing auras for large clusters
+ if (large)
+ break;
+
+ float x, y, z, o;
+ cluster->GetPosition(x, y, z, o);
+ me->NearTeleportTo(x, y, z, o);
+
+ uint32 preGameSpellId;
+ if (cluster->GetEntry() == clusterIds[SIMON_RED])
+ preGameSpellId = SPELL_PRE_GAME_RED;
+ else if (cluster->GetEntry() == clusterIds[SIMON_BLUE])
+ preGameSpellId = SPELL_PRE_GAME_BLUE;
+ else if (cluster->GetEntry() == clusterIds[SIMON_GREEN])
+ preGameSpellId = SPELL_PRE_GAME_GREEN;
+ else if (cluster->GetEntry() == clusterIds[SIMON_YELLOW])
+ preGameSpellId = SPELL_PRE_GAME_YELLOW;
+ else break;
+
+ me->CastSpell(cluster, preGameSpellId, true);
+ }
+ }
+
+ if (GameObject* relic = me->FindNearestGameObject(large ? GO_APEXIS_MONUMENT : GO_APEXIS_RELIC, searchDistance))
+ {
+ float x, y, z, o;
+ relic->GetPosition(x, y, z, o);
+ me->NearTeleportTo(x, y, z + zCoordCorrection, o);
+ }
+
+ GenerateColorSequence();
+ }
+
+ // Handles the spell rewards. The spells also have the QuestCompleteEffect, so quests credits are working.
+ void GiveRewardForLevel(uint8 level)
+ {
+ uint32 rewSpell;
+ switch (level)
+ {
+ case 6:
+ if (large)
+ GivePunishment();
+ else
+ rewSpell = SPELL_REWARD_BUFF_1;
+ break;
+ case 8:
+ rewSpell = SPELL_REWARD_BUFF_2;
+ break;
+ case 10:
+ rewSpell = SPELL_REWARD_BUFF_3;
+ break;
+ default:
+ rewSpell = 0;
+ }
+
+ if (rewSpell)
+ if (Player* player = me->GetPlayer(*me, playerGUID))
+ DoCast(player, rewSpell, true);
+ }
+
+ /*
+ Depending on the number of failed pushes for player the damage of the spell scales, so we first
+ cast the spell on the target that hits for 50 and shows the visual and then forces the player
+ to cast the damaging spell on it self with the modified basepoints.
+ 4 fails = death.
+ On large nodes punishment and reward are the same, summoning the Apexis Guardian.
+ */
+ void GivePunishment()
+ {
+ if (large)
+ {
+ if (Player* player = me->GetPlayer(*me, playerGUID))
+ if (Creature* guardian = me->SummonCreature(NPC_APEXIS_GUARDIAN, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ() - zCoordCorrection, 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 20000))
+ guardian->AI()->AttackStart(player);
+
+ ResetNode();
+ }
+ else
+ {
+ fails++;
+
+ if (Player* player = me->GetPlayer(*me, playerGUID))
+ DoCast(player, SPELL_BAD_PRESS_TRIGGER, true);
+
+ if (fails >= 4)
+ ResetNode();
+ }
+ }
+
+ void SpellHitTarget(Unit* target, const SpellInfo* spell)
+ {
+ // Cast SPELL_BAD_PRESS_DAMAGE with scaled basepoints when the visual hits the target.
+ // Need Fix: When SPELL_BAD_PRESS_TRIGGER hits target it triggers spell SPELL_BAD_PRESS_DAMAGE by itself
+ // so player gets damage equal to calculated damage dbc basepoints for SPELL_BAD_PRESS_DAMAGE (~50)
+ if (spell->Id == SPELL_BAD_PRESS_TRIGGER)
+ {
+ int32 bp = (int32)((float)(fails)*0.33f*target->GetMaxHealth());
+ target->CastCustomSpell(target, SPELL_BAD_PRESS_DAMAGE, &bp, NULL, NULL, true);
+ }
+ }
+
+ // Checks if player has already die or has get too far from the current node
+ bool CheckPlayer()
+ {
+ if (Player* player = me->GetPlayer(*me, playerGUID))
+ {
+ if (player->isDead())
+ return false;
+ if (player->GetDistance2d(me) >= 2.0f*searchDistance)
+ {
+ GivePunishment();
+ return false;
+ }
+ }
+ else
+ return false;
+
+ return true;
+ }
+ };
+
+ CreatureAI* GetAI(Creature* creature) const
+ {
+ return new npc_simon_bunnyAI(creature);
+ }
+};
+
+class go_simon_cluster : public GameObjectScript
+{
+ public:
+ go_simon_cluster() : GameObjectScript("go_simon_cluster") { }
+
+ bool OnGossipHello(Player* player, GameObject* go)
+ {
+ if (Creature* bunny = go->FindNearestCreature(NPC_SIMON_BUNNY, 12.0f, true))
+ bunny->AI()->SetData(go->GetEntry(), 0);
+
+ player->CastSpell(player, go->GetGOInfo()->goober.spellId, true);
+ go->AddUse();
+ return true;
+ }
+};
+
+enum ApexisRelic
+{
+ QUEST_CRYSTALS = 11025,
+ GOSSIP_TEXT_ID = 10948,
+
+ ITEM_APEXIS_SHARD = 32569,
+ SPELL_TAKE_REAGENTS_SOLO = 41145,
+ SPELL_TAKE_REAGENTS_GROUP = 41146,
+};
+
+class go_apexis_relic : public GameObjectScript
+{
+ public:
+ go_apexis_relic() : GameObjectScript("go_apexis_relic") { }
+
+ bool OnGossipHello(Player* player, GameObject* go)
+ {
+ player->PrepareGossipMenu(go, go->GetGOInfo()->questgiver.gossipID);
+ player->SendPreparedGossip(go);
+ return true;
+ }
+
+ bool OnGossipSelect(Player* player, GameObject* go, uint32 /*sender*/, uint32 /*action*/)
+ {
+ player->CLOSE_GOSSIP_MENU();
+
+ bool large = (go->GetEntry() == GO_APEXIS_MONUMENT);
+ if (player->HasItemCount(ITEM_APEXIS_SHARD, large ? 35 : 1))
+ {
+ player->CastSpell(player, large ? SPELL_TAKE_REAGENTS_GROUP : SPELL_TAKE_REAGENTS_SOLO, false);
+
+ if (Creature* bunny = player->SummonCreature(NPC_SIMON_BUNNY, go->GetPositionX(), go->GetPositionY(), go->GetPositionZ()))
+ bunny->AI()->SetGUID(player->GetGUID(), large);
+ }
+
+ return true;
+ }
+};
+
void AddSC_blades_edge_mountains()
{
new mobs_bladespire_ogre();
@@ -573,4 +1131,7 @@ void AddSC_blades_edge_mountains()
new npc_bloodmaul_brutebane();
new npc_ogre_brute();
new go_thunderspike();
+ new npc_simon_bunny();
+ new go_simon_cluster();
+ new go_apexis_relic();
}
diff --git a/src/server/scripts/Spells/spell_paladin.cpp b/src/server/scripts/Spells/spell_paladin.cpp
index f7cdfa552ee..39360e04aa1 100644
--- a/src/server/scripts/Spells/spell_paladin.cpp
+++ b/src/server/scripts/Spells/spell_paladin.cpp
@@ -37,6 +37,10 @@ enum PaladinSpells
SPELL_BLESSING_OF_LOWER_CITY_PALADIN = 37879,
SPELL_BLESSING_OF_LOWER_CITY_PRIEST = 37880,
SPELL_BLESSING_OF_LOWER_CITY_SHAMAN = 37881,
+
+ SPELL_DIVINE_STORM = 53385,
+ SPELL_DIVINE_STORM_DUMMY = 54171,
+ SPELL_DIVINE_STORM_HEAL = 54172,
};
// 31850 - Ardent Defender
@@ -327,6 +331,40 @@ public:
}
};
+class spell_pal_divine_storm : public SpellScriptLoader
+{
+public:
+ spell_pal_divine_storm() : SpellScriptLoader("spell_pal_divine_storm") { }
+
+ class spell_pal_divine_storm_SpellScript : public SpellScript
+ {
+ PrepareSpellScript(spell_pal_divine_storm_SpellScript);
+
+ uint32 healPct;
+
+ bool Load()
+ {
+ healPct = GetSpellInfo()->Effects[EFFECT_1].CalcValue(GetCaster());
+ return true;
+ }
+
+ void TriggerHeal()
+ {
+ GetCaster()->CastCustomSpell(SPELL_DIVINE_STORM_DUMMY, SPELLVALUE_BASE_POINT0, (GetHitDamage() * healPct) / 100, GetCaster(), true);
+ }
+
+ void Register()
+ {
+ AfterHit += SpellHitFn(spell_pal_divine_storm_SpellScript::TriggerHeal);
+ }
+ };
+
+ SpellScript* GetSpellScript() const
+ {
+ return new spell_pal_divine_storm_SpellScript();
+ }
+};
+
void AddSC_paladin_spell_scripts()
{
new spell_pal_ardent_defender();
@@ -335,4 +373,5 @@ void AddSC_paladin_spell_scripts()
new spell_pal_guarded_by_the_light();
new spell_pal_holy_shock();
new spell_pal_judgement_of_command();
+ new spell_pal_divine_storm();
}
diff --git a/src/server/scripts/Spells/spell_shaman.cpp b/src/server/scripts/Spells/spell_shaman.cpp
index 9e8b8a9eda4..b0116d6d33d 100644
--- a/src/server/scripts/Spells/spell_shaman.cpp
+++ b/src/server/scripts/Spells/spell_shaman.cpp
@@ -26,16 +26,16 @@
enum ShamanSpells
{
- SHAMAN_SPELL_GLYPH_OF_MANA_TIDE = 55441,
- SHAMAN_SPELL_MANA_TIDE_TOTEM = 39609,
- SHAMAN_SPELL_FIRE_NOVA_R1 = 1535,
- SHAMAN_SPELL_FIRE_NOVA_TRIGGERED_R1 = 8349,
- SHAMAN_SPELL_SATED = 57724,
- SHAMAN_SPELL_EXHAUSTION = 57723,
-
- //For Earthen Power
- SHAMAN_TOTEM_SPELL_EARTHBIND_TOTEM = 6474, //Spell casted by totem
- SHAMAN_TOTEM_SPELL_EARTHEN_POWER = 59566, //Spell witch remove snare effect
+ SHAMAN_SPELL_GLYPH_OF_MANA_TIDE = 55441,
+ SHAMAN_SPELL_MANA_TIDE_TOTEM = 39609,
+ SHAMAN_SPELL_FIRE_NOVA_R1 = 1535,
+ SHAMAN_SPELL_FIRE_NOVA_TRIGGERED_R1 = 8349,
+ SHAMAN_SPELL_SATED = 57724,
+ SHAMAN_SPELL_EXHAUSTION = 57723,
+
+ // For Earthen Power
+ SHAMAN_TOTEM_SPELL_EARTHBIND_TOTEM = 6474,
+ SHAMAN_TOTEM_SPELL_EARTHEN_POWER = 59566,
};
// 51474 - Astral shift
@@ -125,7 +125,7 @@ class spell_sha_fire_nova : public SpellScriptLoader
{
Creature* totem = caster->GetMap()->GetCreature(caster->m_SummonSlot[1]);
if (totem && totem->isTotem())
- totem->CastSpell(totem, spellId, true);
+ caster->CastSpell(totem, spellId, true);
}
}
@@ -215,9 +215,11 @@ class spell_sha_earthbind_totem : public SpellScriptLoader
{
Unit* target = GetTarget();
if (Unit* caster = aurEff->GetBase()->GetCaster())
- if (AuraEffect* aur = caster->GetDummyAuraEffect(SPELLFAMILY_SHAMAN, 2289, 0))
- if (roll_chance_i(aur->GetBaseAmount()))
- target->CastSpell(target, SHAMAN_TOTEM_SPELL_EARTHEN_POWER, true, NULL, aurEff);
+ if (TempSummon* summon = caster->ToTempSummon())
+ if (Unit* owner = summon->GetOwner())
+ if (AuraEffect* aur = owner->GetDummyAuraEffect(SPELLFAMILY_SHAMAN, 2289, 0))
+ if (roll_chance_i(aur->GetBaseAmount()) && target->HasAuraWithMechanic(1 << MECHANIC_SNARE))
+ caster->CastSpell(caster, SHAMAN_TOTEM_SPELL_EARTHEN_POWER, true, NULL, aurEff);
}
void Register()
diff --git a/src/server/shared/Database/Implementation/CharacterDatabase.cpp b/src/server/shared/Database/Implementation/CharacterDatabase.cpp
index b5b174a19eb..a24f17a8b76 100755..100644
--- a/src/server/shared/Database/Implementation/CharacterDatabase.cpp
+++ b/src/server/shared/Database/Implementation/CharacterDatabase.cpp
@@ -46,6 +46,10 @@ void CharacterDatabaseConnection::DoPrepareStatements()
PREPARE_STATEMENT(CHAR_SEL_GUID_RACE_ACC_BY_NAME, "SELECT guid, race, account FROM characters WHERE name = ?", CONNECTION_ASYNC);
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_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_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);
@@ -63,7 +67,11 @@ void CharacterDatabaseConnection::DoPrepareStatements()
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 = ?", CONNECTION_ASYNC)
PREPARE_STATEMENT(CHAR_SEL_CHARACTER_DAILYQUESTSTATUS, "SELECT quest, time FROM character_queststatus_daily WHERE guid = ?", CONNECTION_ASYNC)
- PREPARE_STATEMENT(CHAR_SEL_CHARACTER_WEKLYQUESTSTATUS, "SELECT quest FROM character_queststatus_weekly 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_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_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)
diff --git a/src/server/shared/Database/Implementation/CharacterDatabase.h b/src/server/shared/Database/Implementation/CharacterDatabase.h
index a0f5b9a9954..a239e274a54 100755..100644
--- a/src/server/shared/Database/Implementation/CharacterDatabase.h
+++ b/src/server/shared/Database/Implementation/CharacterDatabase.h
@@ -66,6 +66,10 @@ enum CharacterDatabaseStatements
CHAR_SEL_GUID_RACE_ACC_BY_NAME,
CHAR_DEL_QUEST_STATUS_DAILY,
CHAR_DEL_QUEST_STATUS_WEEKLY,
+ CHAR_DEL_QUEST_STATUS_SEASONAL,
+ CHAR_DEL_QUEST_STATUS_DAILY_CHAR,
+ CHAR_DEL_QUEST_STATUS_WEEKLY_CHAR,
+ CHAR_DEL_QUEST_STATUS_SEASONAL_CHAR,
CHAR_DEL_BATTLEGROUND_RANDOM,
CHAR_INS_BATTLEGROUND_RANDOM,
@@ -76,7 +80,11 @@ enum CharacterDatabaseStatements
CHAR_SEL_CHARACTER_SPELL,
CHAR_SEL_CHARACTER_QUESTSTATUS,
CHAR_SEL_CHARACTER_DAILYQUESTSTATUS,
- CHAR_SEL_CHARACTER_WEKLYQUESTSTATUS,
+ CHAR_SEL_CHARACTER_WEEKLYQUESTSTATUS,
+ CHAR_SEL_CHARACTER_SEASONALQUESTSTATUS,
+ CHAR_INS_CHARACTER_DAILYQUESTSTATUS,
+ CHAR_INS_CHARACTER_WEEKLYQUESTSTATUS,
+ CHAR_INS_CHARACTER_SEASONALQUESTSTATUS,
CHAR_SEL_CHARACTER_REPUTATION,
CHAR_SEL_CHARACTER_INVENTORY,
CHAR_SEL_CHARACTER_ACTIONS,