aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sql/updates/world/2014_08_12_00_world_sai.sql352
-rw-r--r--sql/updates/world/2014_08_12_01_world_misc.sql3
-rw-r--r--sql/updates/world/2014_08_13_00_world_sai.sql95
-rw-r--r--sql/updates/world/2014_08_14_00_world_gameobject.sql4
-rw-r--r--sql/updates/world/2014_08_14_01_world_creature_template.sql16
-rw-r--r--sql/updates/world/2014_08_14_01_world_creature_template_434.sql1
-rw-r--r--sql/updates/world/2014_08_14_02_world_misc.sql197
-rw-r--r--sql/updates/world/2014_08_15_00_world_sai.sql39
-rw-r--r--sql/updates/world/2014_08_15_01_world_misc.sql170
-rw-r--r--src/server/authserver/Server/BattlenetBitStream.h29
-rw-r--r--src/server/authserver/Server/BattlenetSession.cpp8
-rw-r--r--src/server/game/AI/CreatureAISelector.cpp2
-rw-r--r--src/server/game/AI/SmartScripts/SmartScript.cpp2
-rw-r--r--src/server/game/Achievements/AchievementMgr.cpp4
-rw-r--r--src/server/game/Entities/Creature/Creature.cpp8
-rw-r--r--src/server/game/Entities/Creature/Creature.h23
-rw-r--r--src/server/game/Entities/Object/Object.h12
-rw-r--r--src/server/game/Entities/Pet/Pet.cpp5
-rw-r--r--src/server/game/Entities/Unit/StatSystem.cpp8
-rw-r--r--src/server/game/Entities/Unit/Unit.cpp8
-rw-r--r--src/server/game/Entities/Unit/Unit.h2
-rw-r--r--src/server/game/Globals/ObjectMgr.cpp257
-rw-r--r--src/server/game/Globals/ObjectMgr.h1
-rw-r--r--src/server/game/Handlers/NPCHandler.h6
-rw-r--r--src/server/game/Miscellaneous/Formulas.h33
-rw-r--r--src/server/game/Miscellaneous/SharedDefines.h2
-rw-r--r--src/server/game/Scripting/ScriptLoader.cpp1
-rw-r--r--src/server/game/Server/WorldPacket.h2
-rw-r--r--src/server/game/Server/WorldSession.h19
-rw-r--r--src/server/game/Spells/Spell.cpp2
-rw-r--r--src/server/game/Texts/CreatureTextMgr.cpp2
-rw-r--r--src/server/scripts/Commands/cs_ban.cpp16
-rw-r--r--src/server/scripts/Commands/cs_misc.cpp46
-rw-r--r--src/server/scripts/Commands/cs_reload.cpp83
-rw-r--r--src/server/scripts/Kalimdor/RazorfenKraul/razorfen_kraul.cpp72
-rw-r--r--src/server/scripts/Northrend/IcecrownCitadel/boss_deathbringer_saurfang.cpp12
-rw-r--r--src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.cpp10
-rw-r--r--src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.h14
-rw-r--r--src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel_teleport.cpp16
-rw-r--r--src/server/scripts/Northrend/IcecrownCitadel/instance_icecrown_citadel.cpp150
-rw-r--r--src/server/scripts/Outland/zone_netherstorm.cpp323
-rw-r--r--src/server/scripts/Pet/pet_hunter.cpp2
-rw-r--r--src/server/scripts/Spells/spell_item.cpp2
-rw-r--r--src/server/shared/Database/Implementation/WorldDatabase.cpp4
-rw-r--r--src/server/shared/Database/Implementation/WorldDatabase.h1
-rw-r--r--src/server/shared/Networking/MessageBuffer.h6
-rw-r--r--src/server/shared/Networking/Socket.h4
-rw-r--r--src/server/shared/Threading/ProducerConsumerQueue.h11
48 files changed, 1331 insertions, 754 deletions
diff --git a/sql/updates/world/2014_08_12_00_world_sai.sql b/sql/updates/world/2014_08_12_00_world_sai.sql
new file mode 100644
index 00000000000..c20c948f2f0
--- /dev/null
+++ b/sql/updates/world/2014_08_12_00_world_sai.sql
@@ -0,0 +1,352 @@
+-- Remove bad gossip linking (linking to same gossip menu option)
+UPDATE `gossip_menu_option` SET `action_menu_id`=0 WHERE `menu_id`=8036 AND `id`=0;
+UPDATE `creature_template` SET `flags_extra`=0 WHERE `entry`=20218;
+
+DELETE FROM `creature` WHERE `id`=21267; -- Delete mana beasts as these are duplicated as are summoned by sunfury nethermancer and permament spawn also exists so these are duplicated.
+
+UPDATE `creature_template` SET `gossip_menu_id`=8046 WHERE `entry`=20397;
+UPDATE `creature_template` SET `gossip_menu_id`=8041 WHERE `entry`=19831;
+UPDATE `creature_template` SET `gossip_menu_id`=8040 WHERE `entry`=19830;
+
+
+DELETE FROM `gossip_menu` WHERE `entry`IN(8036,8113,8115,8116,8046,8045,8041,8042,8040,8039);
+INSERT INTO `gossip_menu` (`entry`, `text_id`) VALUES
+(8036, 10045),
+(8036, 9922),
+(8113, 10045),
+(8113, 9922),
+(8115, 10045),
+(8115, 9922),
+(8116, 10045),
+(8116, 9922),
+(8046, 9931), -- 20397
+(8045, 9934), -- 20397
+(8041, 9929), -- 19831
+(8042, 9930), -- 19831
+(8040, 9926), -- 19830
+(8039, 9927); -- 19830
+
+DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=13 AND `SourceEntry` IN(35016,35176);
+INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorType`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES
+(13, 1, 35016, 0, 0, 31, 0, 3, 20226, 0, 0, 0, 0, '', 'Interrupt Shutdown only hits Netherstorm Repair Target'),
+(13, 1, 35176, 0, 0, 31, 0, 3, 20226, 0, 0, 0, 0, '', 'Interrupt Shutdown only hits Netherstorm Repair Target');
+
+DELETE FROM `gossip_menu_option` WHERE `menu_id` IN(8036, 8113,8115,8116,8046,8041,8040);
+INSERT INTO `gossip_menu_option` (`menu_id`, `id`, `option_icon`, `option_text`, `OptionBroadcastTextID`, `option_id`, `npc_option_npcflag`, `action_menu_id`, `action_poi_id`, `box_coded`, `box_money`, `box_text`, `BoxBroadcastTextID`) VALUES
+
+(8036, 0, 0, '<Begin emergency shutdown.>', 18119, 1, 1, 0, 0, 0, 0, '', 0),
+(8113, 0, 0, '<Begin emergency shutdown.>', 18119, 1, 1, 0, 0, 0, 0, '', 0),
+(8115, 0, 0, '<Begin emergency shutdown.>', 18119, 1, 1, 0, 0, 0, 0, '', 0),
+(8116, 0, 0, '<Begin emergency shutdown.>', 18119, 1, 1, 0, 0, 0, 0, '', 0),
+(8046, 0, 0, 'Where did this technology come from?', 17475, 1, 1, 8045, 0, 0, 0, '', 0),
+(8041, 0, 0, 'Who attacked Manaforge Duro?', 17464, 1, 1, 8042, 0, 0, 0, '', 0),
+(8040, 0, 0, 'Ultris?', 17444, 1, 1, 8039, 0, 0, 0, '', 0);
+
+
+
+DELETE FROM `creature_text` WHERE `entry`IN(20209,20417,20418,20440) AND `groupid`=5;
+INSERT INTO `creature_text` (`entry`, `groupid`, `id`, `text`, `type`, `language`, `probability`, `emote`, `duration`, `sound`, `comment`, `BroadcastTextID`) VALUES
+(20209, 5, 0, 'Manaforge shutdown aborted. Resuming manaforge activity.', 16, 0, 100, 0, 0, 0, 'manaforge_control fail', 17886),
+(20417, 5, 0, 'Manaforge shutdown aborted. Resuming manaforge activity.', 16, 0, 100, 0, 0, 0, 'manaforge_control fail', 17886),
+(20418, 5, 0, 'Manaforge shutdown aborted. Resuming manaforge activity.', 16, 0, 100, 0, 0, 0, 'manaforge_control fail', 17886),
+(20440, 5, 0, 'Manaforge shutdown aborted. Resuming manaforge activity.', 16, 0, 100, 0, 0, 0, 'manaforge_control fail', 17886);
+
+DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`IN(14,15) AND `SourceGroup` IN(8036,8113,8115,8116);
+INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorType`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES
+(15, 8036, 0, 0, 0, 9, 0, 10299, 0, 0, 0, 0, 0, '', 'Show gossip option if player has quest marked as taken'),
+(15, 8036, 0, 0, 0, 2, 0, 29366, 1, 0, 0, 0, 0, '', 'Only show gossip option if Player Has got B''naar Access Crystal'),
+(15, 8036, 0, 0, 1, 9, 0, 10329, 0, 0, 0, 0, 0, '', 'Show gossip option if player has quest marked as taken'),
+(15, 8036, 0, 0, 1, 2, 0, 29366, 1, 0, 0, 0, 0, '', 'Only show gossip option if Player Has got B''naar Access Crystal'),
+(15, 8113, 0, 0, 0, 9, 0, 10330, 0, 0, 0, 0, 0, '', 'Show gossip option if player has quest marked as taken'),
+(15, 8113, 0, 0, 0, 2, 0, 29396, 1, 0, 0, 0, 0, '', 'Only show gossip option if Player Has got Coruu Access Crystal'),
+(15, 8113, 0, 0, 1, 9, 0, 10321, 0, 0, 0, 0, 0, '', 'Show gossip option if player has quest marked as taken'),
+(15, 8113, 0, 0, 1, 2, 0, 29396, 1, 0, 0, 0, 0, '', 'Only show gossip option if Player Has got Coruu Access Crystal'),
+(15, 8115, 0, 0, 0, 9, 0, 10338, 0, 0, 0, 0, 0, '', 'Show gossip option if player has quest marked as taken'),
+(15, 8115, 0, 0, 0, 2, 0, 29397, 1, 0, 0, 0, 0, '', 'Only show gossip option if Player Has got Duru Access Crystal'),
+(15, 8115, 0, 0, 1, 9, 0, 10322, 0, 0, 0, 0, 0, '', 'Show gossip option if player has quest marked as taken'),
+(15, 8115, 0, 0, 1, 2, 0, 29397, 1, 0, 0, 0, 0, '', 'Only show gossip option if Player Has got Duru Access Crystal'),
+(15, 8116, 0, 0, 0, 9, 0, 10365, 0, 0, 0, 0, 0, '', 'Show gossip option if player has quest marked as taken'),
+(15, 8116, 0, 0, 0, 2, 0, 29411, 1, 0, 0, 0, 0, '', 'Only show gossip option if Player Has got Ara Access Crystal'),
+(15, 8116, 0, 0, 1, 9, 0, 10323, 0, 0, 0, 0, 0, '', 'Show gossip option if player has quest marked as taken'),
+(15, 8116, 0, 0, 1, 2, 0, 29411, 1, 0, 0, 0, 0, '', 'Only show gossip option if Player Has got Ara Access Crystal'),
+
+(14, 8036, 9922, 0, 0, 2, 0, 29366, 1, 0, 1, 0, 0, '', 'Only show npc text if Player does not have B''naar Access Crystal'),
+(14, 8113, 9922, 0, 0, 2, 0, 29396, 1, 0, 1, 0, 0, '', 'Only show npc text if Player does not have Coruu Access Crystal'),
+(14, 8115, 9922, 0, 0, 2, 0, 29397, 1, 0, 1, 0, 0, '', 'Only show npc text if Player does not have Duru Access Crystal'),
+(14, 8116, 9922, 0, 0, 2, 0, 29411, 1, 0, 1, 0, 0, '', 'Onlyshow npc text if Player does not have Ara Access Crystal'),
+(14, 8036, 10045, 0, 0, 2, 0, 29366, 1, 0, 0, 0, 0, '', 'Only show npc text if Player has B''naar Access Crystal'),
+(14, 8113, 10045, 0, 0, 2, 0, 29396, 1, 0, 0, 0, 0, '', 'Only show npc text if Player has Coruu Access Crystal'),
+(14, 8115, 10045, 0, 0, 2, 0, 29397, 1, 0, 0, 0, 0, '', 'Only show npc text if Player has Duru Access Crystal'),
+(14, 8116, 10045, 0, 0, 2, 0, 29411, 1, 0, 0, 0, 0, '', 'Onlyshow npc text if Player has Ara Access Crystal');
+
+UPDATE `gameobject_template` SET `AIName`= 'SmartGameObjectAI',`ScriptName`= '' WHERE `entry`IN(183770,183956,184311,184312);
+
+DELETE FROM `smart_scripts` WHERE `entryorguid` IN(183770,183956,184311,184312) and `source_type`=1;
+DELETE FROM `smart_scripts` WHERE `entryorguid` IN(18377000,18395600,18431100,18431200) and `source_type`=9;
+
+INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES
+(183770,1,0,1,62,0,100,0,8036,0,0,0,64,1,0,0,0,0,0,7,0,0,0,0,0,0,0,'B''naar Control Console - On Gossip Option Select - Store Target List'),
+(183770,1,1,2,61,0,100,0,0,0,0,0,12,20209,1,120000,0,0,0,8,0,0,0,2918.95, 4189.98, 161.88, 0.34,'B''naar Control Console - Linked with previous event - Summon B''naar Control Console'),
+(183770,1,2,3,61,0,100,0,0,0,0,0,100,1,0,0,0,0,0,19,20209,0,0,0,0,0,0,'B''naar Control Console - Linked with previous event - Send Targetlist to B''naar Control Console'),
+(183770,1,3,4,61,0,100,0,0,0,0,0,72,0,0,0,0,0,0,7,0,0,0,0,0,0,0,'B''naar Control Console - Linked with previous event - Close Gossip'),
+(183770,1,4,0,61,0,100,0,0,0,0,0,80,18377000,2,0,0,0,0,1,0,0,0,0,0,0,0,'B''naar Control Console - Linked with previous event - Run Script'),
+(183770,1,5,6,38,0,100,0,1,1,2000,2000,104,0,0,0,0,0,0,1,0,0,0,0,0,0,0,'B''naar Control Console - On Data Set - Fail Quest'),
+(183770,1,6,7,61,0,100,0,0,0,0,0,1,5,0,0,0,0,0,19,20209,0,0,0,0,0,0,'B''naar Control Console - On Data Set - Say'),
+(183770,1,7,8,61,0,100,0,0,0,0,0,45,7,7,0,0,0,0,19,20209,0,0,0,0,0,0,'Ara Control Console - On Data Set - Set Data'),
+(183770,1,8,0,61,0,100,0,0,0,0,0,78,0,0,0,0,0,0,1,0,0,0,0,0,0,0,'B''naar Control Console - On Data Set - Reset Scripts'),
+(18377000,9,0,0,0,0,100,0,0,0,0,0,104,16,0,0,0,0,0,1,0,0,0,0,0,0,0,'B''naar Control Console - Linked with previous event - Run Script'),
+(18377000,9,1,0,0,0,100,0,1000,1000,0,0,45,1,1,0,0,0,0,19,20209,0,0,0,0,0,0,'B''naar Control Console - Script - Set Data B''naar Control Console'),
+(18377000,9,2,0,0,0,100,0,0,0,0,0,45,2,2,0,0,0,0,19,20209,0,0,0,0,0,0,'B''naar Control Console Script - Set Data B''naar Control Console'),
+(18377000,9,3,0,0,0,100,0,29000,29000,0,0,45,2,2,0,0,0,0,19,20209,0,0,0,0,0,0,'B''naar Control Console Script - Set Data B''naar Control Console'),
+(18377000,9,4,0,0,0,100,0,30000,30000,0,0,45,3,3,0,0,0,0,19,20209,0,0,0,0,0,0,'B''naar Control Console Script - Set Data B''naar Control Console'),
+(18377000,9,5,0,0,0,100,0,0,0,0,0,45,2,2,0,0,0,0,19,20209,0,0,0,0,0,0,'B''naar Control Console Script - Set Data B''naar Control Console'),
+(18377000,9,6,0,0,0,100,0,30000,30000,0,0,45,4,4,0,0,0,0,19,20209,0,0,0,0,0,0,'B''naar Control Console Script - Set Data B''naar Control Console'),
+(18377000,9,7,0,0,0,100,0,20000,20000,0,0,45,5,5,0,0,0,0,19,20209,0,0,0,0,0,0,'B''naar Control Console Script - Set Data B''naar Control Console'),
+(18377000,9,8,0,0,0,100,0,10000,10000,0,0,45,6,6,0,0,0,0,19,20209,0,0,0,0,0,0,'B''naar Control Console Script - Set Data B''naar Control Console'),
+(18377000,9,9,0,0,0,100,0,0,0,0,0,45,8,8,0,0,0,0,19,20209,0,0,0,0,0,0,'B''naar Control Console Script - Set Data B''naar Control Console'),
+(18377000,9,10,0,0,0,100,0,0,0,0,0,104,0,0,0,0,0,0,1,0,0,0,0,0,0,0,'B''naar Control Console Script - Set Flags'),
+(183956,1,0,1,62,0,100,0,8113,0,0,0,64,1,0,0,0,0,0,7,0,0,0,0,0,0,0,'Coruu Control Console - On Gossip Option Select - Store Target List'),
+(183956,1,1,2,61,0,100,0,0,0,0,0,12,20417,1,120000,0,0,0,8,0,0,0,2426.77, 2750.38, 133.24, 2.14,'Coruu Control Console - Linked with previous event - Summon Coruu Control Console'),
+(183956,1,2,3,61,0,100,0,0,0,0,0,100,1,0,0,0,0,0,19,20417,0,0,0,0,0,0,'Coruu Control Console - Linked with previous event - Send Targetlist to Coruu Control Console'),
+(183956,1,3,4,61,0,100,0,0,0,0,0,72,0,0,0,0,0,0,7,0,0,0,0,0,0,0,'Coruu Control Console - Linked with previous event - Close Gossip'),
+(183956,1,4,0,61,0,100,0,0,0,0,0,80,18395600,2,0,0,0,0,1,0,0,0,0,0,0,0,'Coruu Control Console - Linked with previous event - Run Script'),
+(183956,1,5,6,38,0,100,0,1,1,2000,2000,104,0,0,0,0,0,0,1,0,0,0,0,0,0,0,'Coruu Control Console - On Data Set - Fail Quest'),
+(183956,1,6,7,61,0,100,0,0,0,0,0,1,5,0,0,0,0,0,19,20417,0,0,0,0,0,0,'Coruu Control Console - On Data Set - Say'),
+(183956,1,7,8,61,0,100,0,0,0,0,0,45,7,7,0,0,0,0,19,20417,0,0,0,0,0,0,'Coruu Control Console - On Data Set - Set Data'),
+(183956,1,8,0,61,0,100,0,0,0,0,0,78,0,0,0,0,0,0,1,0,0,0,0,0,0,0,'Coruu Control Console - On Data Set - Reset Scripts'),
+(18395600,9,0,0,0,0,100,0,0,0,0,0,104,16,0,0,0,0,0,1,0,0,0,0,0,0,0,'Coruu Control Console - Linked with previous event - Run Script'),
+(18395600,9,1,0,0,0,100,0,1000,1000,0,0,45,1,1,0,0,0,0,19,20417,0,0,0,0,0,0,'Coruu Control Console - Script - Set Data Coruu Control Console'),
+(18395600,9,2,0,0,0,100,0,0,0,0,0,45,2,2,0,0,0,0,19,20417,0,0,0,0,0,0,'Coruu Control Console Script - Set Data Coruu Control Console'),
+(18395600,9,3,0,0,0,100,0,19000,19000,0,0,45,2,2,0,0,0,0,19,20417,0,0,0,0,0,0,'Coruu Control Console Script - Set Data Coruu Control Console'),
+(18395600,9,4,0,0,0,100,0,20000,20000,0,0,45,2,2,0,0,0,0,19,20417,0,0,0,0,0,0,'Coruu Control Console Script - Set Data Coruu Control Console'),
+(18395600,9,5,0,0,0,100,0,20000,20000,0,0,45,2,2,0,0,0,0,19,20417,0,0,0,0,0,0,'Coruu Control Console Script - Set Data Coruu Control Console'),
+(18395600,9,6,0,0,0,100,0,0,0,0,0,45,3,3,0,0,0,0,19,20417,0,0,0,0,0,0,'Coruu Control Console Script - Set Data Coruu Control Console'),
+(18395600,9,8,0,0,0,100,0,20000,20000,0,0,45,2,2,0,0,0,0,19,20417,0,0,0,0,0,0,'Coruu Control Console Script - Set Data Coruu Control Console'),
+(18395600,9,9,0,0,0,100,0,10000,10000,0,0,45,4,4,0,0,0,0,19,20417,0,0,0,0,0,0,'Coruu Control Console Script - Set Data Coruu Control Console'),
+(18395600,9,10,0,0,0,100,0,10000,10000,0,0,45,8,8,0,0,0,0,19,20417,0,0,0,0,0,0,'Coruu Control Console Script - Set Data Coruu Control Console'),
+(18395600,9,11,0,0,0,100,0,10000,10000,0,0,45,5,5,0,0,0,0,19,20417,0,0,0,0,0,0,'Coruu Control Console Script - Set Data Coruu Control Console'),
+(18395600,9,12,0,0,0,100,0,10000,10000,0,0,45,6,6,0,0,0,0,19,20417,0,0,0,0,0,0,'Coruu Control Console Script - Set Data Coruu Control Console'),
+(18395600,9,13,0,0,0,100,0,0,0,0,0,45,8,8,0,0,0,0,19,20417,0,0,0,0,0,0,'Coruu Control Console Script - Set Data Coruu Control Console'),
+(18395600,9,14,0,0,0,100,0,0,0,0,0,104,0,0,0,0,0,0,1,0,0,0,0,0,0,0,'Coruu Control Console Script - Set Flags'),
+(184311,1,0,1,62,0,100,0,8115,0,0,0,64,1,0,0,0,0,0,7,0,0,0,0,0,0,0,'Duru Control Console - On Gossip Option Select - Store Target List'),
+(184311,1,1,2,61,0,100,0,0,0,0,0,12,20418,1,120000,0,0,0,8,0,0,0,2976.48, 2183.29, 163.20, 1.85,'Duru Control Console - Linked with previous event - Summon Duru Control Console'),
+(184311,1,2,3,61,0,100,0,0,0,0,0,100,1,0,0,0,0,0,19,20418,0,0,0,0,0,0,'Duru Control Console - Linked with previous event - Send Targetlist to Duru Control Console'),
+(184311,1,3,4,61,0,100,0,0,0,0,0,72,0,0,0,0,0,0,7,0,0,0,0,0,0,0,'Duru Control Console - Linked with previous event - Close Gossip'),
+(184311,1,4,0,61,0,100,0,0,0,0,0,80,18431100,2,0,0,0,0,1,0,0,0,0,0,0,0,'Duru Control Console - Linked with previous event - Run Script'),
+(184311,1,5,6,38,0,100,0,1,1,2000,2000,104,0,0,0,0,0,0,1,0,0,0,0,0,0,0,'Duru Control Console - On Data Set - Fail Quest'),
+(184311,1,6,7,61,0,100,0,0,0,0,0,1,5,0,0,0,0,0,19,20418,0,0,0,0,0,0,'Duru Control Console - On Data Set - Say'),
+(184311,1,7,8,61,0,100,0,0,0,0,0,45,7,7,0,0,0,0,19,20418,0,0,0,0,0,0,'Duru Control Console - On Data Set - Set Data'),
+(184311,1,8,9,61,0,100,0,0,0,0,0,78,0,0,0,0,0,0,1,0,0,0,0,0,0,0,'Duru Control Console - On Data Set - Reset Scripts'),
+(18431100,9,0,0,0,0,100,0,0,0,0,0,104,16,0,0,0,0,0,1,0,0,0,0,0,0,0,'Duru Control Console - Linked with previous event - Run Script'),
+(18431100,9,1,0,0,0,100,0,1000,1000,0,0,45,1,1,0,0,0,0,19,20418,0,0,0,0,0,0,'Duru Control Console - Script - Set Data Duru Control Console'),
+(18431100,9,2,0,0,0,100,0,0,0,0,0,45,2,2,0,0,0,0,19,20418,0,0,0,0,0,0,'Duru Control Console Script - Set Data Duru Control Console'),
+(18431100,9,3,0,0,0,100,0,14000,14000,0,0,45,2,2,0,0,0,0,19,20418,0,0,0,0,0,0,'Duru Control Console Script - Set Data Duru Control Console'),
+(18431100,9,4,0,0,0,100,0,15000,15000,0,0,45,2,2,0,0,0,0,19,20418,0,0,0,0,0,0,'Duru Control Console Script - Set Data Duru Control Console'),
+(18431100,9,5,0,0,0,100,0,15000,15000,0,0,45,2,2,0,0,0,0,19,20418,0,0,0,0,0,0,'Duru Control Console Script - Set Data Duru Control Console'),
+(18431100,9,6,0,0,0,100,0,15000,15000,0,0,45,3,3,0,0,0,0,19,20418,0,0,0,0,0,0,'Duru Control Console Script - Set Data Duru Control Console'),
+(18431100,9,7,0,0,0,100,0,0,0,0,0,45,2,2,0,0,0,0,19,20418,0,0,0,0,0,0,'Duru Control Console Script - Set Data Duru Control Console'),
+(18431100,9,8,0,0,0,100,0,15000,15000,0,0,45,2,2,0,0,0,0,19,20418,0,0,0,0,0,0,'Duru Control Console Script - Set Data Duru Control Console'),
+(18431100,9,9,0,0,0,100,0,15000,15000,0,0,45,2,2,0,0,0,0,19,20418,0,0,0,0,0,0,'Duru Control Console Script - Set Data Duru Control Console'),
+(18431100,9,10,0,0,0,100,0,15000,15000,0,0,45,4,4,0,0,0,0,19,20418,0,0,0,0,0,0,'Duru Control Console Script - Set Data Duru Control Console'),
+(18431100,9,11,0,0,0,100,0,5000,5000,0,0,45,5,5,0,0,0,0,19,20418,0,0,0,0,0,0,'Duru Control Console Script - Set Data Duru Control Console'),
+(18431100,9,12,0,0,0,100,0,10000,10000,0,0,45,6,6,0,0,0,0,19,20418,0,0,0,0,0,0,'Duru Control Console Script - Set Data Duru Control Console'),
+(18431100,9,13,0,0,0,100,0,0,0,0,0,45,8,8,0,0,0,0,19,20418,0,0,0,0,0,0,'Duru Control Console Script - Set Data Duru Control Console'),
+(18431100,9,14,0,0,0,100,0,0,0,0,0,104,0,0,0,0,0,0,1,0,0,0,0,0,0,0,'Duru Control Console Script - Set Flags'),
+(184312,1,0,1,62,0,100,0,8116,0,0,0,64,1,0,0,0,0,0,7,0,0,0,0,0,0,0,'Ara Control Console - On Gossip Option Select - Store Target List'),
+(184312,1,1,2,61,0,100,0,0,0,0,0,12,20440,1,120000,0,0,0,8,0,0,0,4013.71, 4028.76, 192.10, 1.25,'Ara Control Console - Linked with previous event - Summon Ara Control Console'),
+(184312,1,2,3,61,0,100,0,0,0,0,0,100,1,0,0,0,0,0,19,20440,0,0,0,0,0,0,'Ara Control Console - Linked with previous event - Send Targetlist to Ara Control Console'),
+(184312,1,3,4,61,0,100,0,0,0,0,0,72,0,0,0,0,0,0,7,0,0,0,0,0,0,0,'Ara Control Console - Linked with previous event - Close Gossip'),
+(184312,1,4,0,61,0,100,0,0,0,0,0,80,18431200,2,0,0,0,0,1,0,0,0,0,0,0,0,'Ara Control Console - Linked with previous event - Run Script'),
+(184312,1,5,6,38,0,100,0,1,1,2000,2000,104,0,0,0,0,0,0,1,0,0,0,0,0,0,0,'Ara Control Console - On Data Set - Fail Quest'),
+(184312,1,6,7,61,0,100,0,0,0,0,0,1,5,0,0,0,0,0,19,20440,0,0,0,0,0,0,'Ara Control Console - On Data Set - Say'),
+(184312,1,7,8,61,0,100,0,0,0,0,0,45,7,7,0,0,0,0,19,20440,0,0,0,0,0,0,'Ara Control Console - On Data Set - Set Data'),
+(184312,1,0,0,61,0,100,0,0,0,0,0,78,0,0,0,0,0,0,1,0,0,0,0,0,0,0,'Ara Control Console - On Data Set - Reset Scripts'),
+(18431200,9,0,0,0,0,100,0,0,0,0,0,104,16,0,0,0,0,0,1,0,0,0,0,0,0,0,'Ara Control Console - Linked with previous event - Run Script'),
+(18431200,9,1,0,0,0,100,0,1000,1000,0,0,45,1,1,0,0,0,0,19,20440,0,0,0,0,0,0,'Ara Control Console - Script - Set Data Ara Control Console'),
+(18431200,9,2,0,0,0,100,0,0,0,0,0,45,2,2,0,0,0,0,19,20440,0,0,0,0,0,0,'Ara Control Console Script - Set Data Ara Control Console'),
+(18431200,9,3,0,0,0,100,0,14000,14000,0,0,45,2,2,0,0,0,0,19,20440,0,0,0,0,0,0,'Ara Control Console Script - Set Data Ara Control Console'),
+(18431200,9,4,0,0,0,100,0,15000,15000,0,0,45,2,2,0,0,0,0,19,20440,0,0,0,0,0,0,'Ara Control Console Script - Set Data Ara Control Console'),
+(18431200,9,5,0,0,0,100,0,15000,15000,0,0,45,2,2,0,0,0,0,19,20440,0,0,0,0,0,0,'Ara Control Console Script - Set Data Ara Control Console'),
+(18431200,9,6,0,0,0,100,0,15000,15000,0,0,45,3,3,0,0,0,0,19,20440,0,0,0,0,0,0,'Ara Control Console Script - Set Data Ara Control Console'),
+(18431200,9,7,0,0,0,100,0,0,0,0,0,45,2,2,0,0,0,0,19,20440,0,0,0,0,0,0,'Ara Control Console Script - Set Data Ara Control Console'),
+(18431200,9,8,0,0,0,100,0,15000,15000,0,0,45,2,2,0,0,0,0,19,20440,0,0,0,0,0,0,'Ara Control Console Script - Set Data Ara Control Console'),
+(18431200,9,9,0,0,0,100,0,15000,15000,0,0,45,2,2,0,0,0,0,19,20440,0,0,0,0,0,0,'Ara Control Console Script - Set Data Ara Control Console'),
+(18431200,9,10,0,0,0,100,0,15000,15000,0,0,45,4,4,0,0,0,0,19,20440,0,0,0,0,0,0,'Ara Control Console Script - Set Data Ara Control Console'),
+(18431200,9,11,0,0,0,100,0,5000,5000,0,0,45,5,5,0,0,0,0,19,20440,0,0,0,0,0,0,'Ara Control Console Script - Set Data Ara Control Console'),
+(18431200,9,12,0,0,0,100,0,10000,10000,0,0,45,6,6,0,0,0,0,19,20440,0,0,0,0,0,0,'Ara Control Console Script - Set Data Ara Control Console'),
+(18431200,9,13,0,0,0,100,0,0,0,0,0,45,8,8,0,0,0,0,19,20440,0,0,0,0,0,0,'Ara Control Console Script - Set Data Ara Control Console'),
+(18431200,9,14,0,0,0,100,0,0,0,0,0,104,0,0,0,0,0,0,1,0,0,0,0,0,0,0,'Ara Control Console Script - Set Flags');
+
+DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=22 AND `SourceEntry`IN(183770,183956,184311,184312);
+
+UPDATE `creature_template` SET `AIName`= 'SmartAI',`ScriptName`= '' WHERE `entry` IN(20209,20218, 20226, 20417,20418, 20436, 20440, 20438, 20439, 20460);
+
+DELETE FROM `smart_scripts` WHERE `entryorguid` IN(20209,20218,20226,20417, 20418, 20436, 20440, 20438, 20439, 20460) and `source_type`=0;
+DELETE FROM `smart_scripts` WHERE `entryorguid` IN(2020900, 2020901,2041700,2041800,2044000,2044001,2022600,2022601,2022602,2022603,2021800,2021801,2021802,2021803,2021804,2021804,2021805,2043900,2043901,2021806) and `source_type`=9;
+
+INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES
+(20209, 0,0,0,38,0,100,0,1,1,0,0,1,0,0,0,0,0,0,12,1,0,0,0,0,0,0,'B''naar Control Console - On Data Set 1 1 - Say'),
+(20209, 0,1,0,38,0,100,0,2,2,0,0,87,2020900,2020901,0,0,0,0,1,0,0,0,0, 0, 0, 0,'B''naar Control Console - On Data Set 2 2 - Run Randomscript'),
+(20209, 0,2,0,38,0,100,0,3,3,0,0,1,1,0,0,0,0,0,12,1,0,0,0,0,0,0,'B''naar Control Console - On Data Set 3 3 - Say'),
+(20209, 0,3,4,38,0,100,0,4,4,0,0,1,2,0,0,0,0,0,12,1,0,0,0,0,0,0,'B''naar Control Console - On Data Set 4 4 - Say'),
+(20209, 0,4,5,61,0,100,0,0,0,0,0,12,20218,1,120000,1,0,0,8,0,0,0,2946.52, 4201.42, 163.47, 3.54,'B''naar Control Console - Linked with Previous Event - Summon Sunfury Technician'),
+(20209, 0,5,6,61,0,100,0,0,0,0,0,100,1,0,0,0,0,0,9,20218,0,200,0, 0, 0, 0,'B''naar Control Console - Linked with Previous Event - Send Target list to Sunfury Technician'),
+(20209, 0,6,0,61,0,100,0,0,0,0,0,45,1,1,0,0,0,0,9,20218,0,200,0, 0, 0, 0,'B''naar Control Console - Linked with Previous Event - Set Data to to Sunfury Technician'),
+(20209, 0,7,0,38,0,100,0,5,5,0,0,1,3,0,0,0,0,0,12,1,0,0,0,0,0,0,'B''naar Control Console - On Data Set 5 5 - Say'),
+(20209, 0,8,10,38,0,100,0,6,6,0,0,1,4,0,0,0,0,0,12,1,0,0,0,0,0,0,'B''naar Control Console - On Data Set 6 6 - Say'),
+(20209, 0,9,0,38,0,100,0,7,7,0,0,41,0,0,0,0,0,0,1,0,0,0,0,0,0,0,'B''naar Control Console - On Data Set 7 7 - Despawn'),
+(20209, 0,10,0,61,0,100,0,0,0,0,0,45,1,1,0,0,0,0,19,20226,0,0,0,0,0,0,'B''naar Control Console - On Data Set 6 6 - Set Data Manaforge Visual Trigger'),
+(20209 ,0,11,12,38,0,100,0,8,8,0,0,33,20209,0,0,0,0,0,12,1,0,0,0,0,0,0,'B''naar Control Console Script - Give Kill Credit'),
+(20209 ,0,12,13,61,0,100,0,0,0,0,0,15,10299,0,0,0,0,0,12,1,0,0,0,0,0,0,'B''naar Control Console Script - Give Kill Credit'),
+(20209 ,0,13,0,61,0,100,0,0,0,0,0,15,10329,0,0,0,0,0,12,1,0,0,0,0,0,0,'B''naar Control Console Script - Give Kill Credit'),
+(2020900, 9,0,0,0,0,100,0,0,0,0,0,12,20218,1,120000,1,0,0,8,0,0,0,2927.36, 4212.97, 164.00, 4.94,'B''naar Control Console - Script 1 - Summon Sunfury Technician'),
+(2020900, 9,1,0,0,0,100,0,0,0,0,0,100,1,0,0,0,0,0,9,20218,0,200,0, 0, 0, 0,'B''naar Control Console - Script 1 - Send Target list to Sunfury Technician'),
+(2020900, 9,2,0,0,0,100,0,0,0,0,0,45,1,1,0,0,0,0,9,20218,0,200,0, 0, 0, 0,'B''naar Control Console - Script 1 - Set Data to to Sunfury Technician'),
+(2020901, 9,0,0,0,0,100,0,0,0,0,0,12,20218,1,120000,1,0,0,8,0,0,0,2933.68, 4162.55, 164.00, 1.60,'B''naar Control Console - Script 2 - Summon Sunfury Technician'),
+(2020901, 9,1,0,0,0,100,0,0,0,0,0,100,1,0,0,0,0,0,9,20218,0,200,0, 0, 0, 0,'B''naar Control Console - Script 2 - Send Target list to Sunfury Technician'),
+(2020901, 9,2,0,0,0,100,0,0,0,0,0,45,1,1,0,0,0,0,9,20218,0,200,0, 0, 0, 0,'B''naar Control Console - Script 2 - Set Data to to Sunfury Technician'),
+(20417, 0,0,0,38,0,100,0,1,1,0,0,1,0,0,0,0,0,0,12,1,0,0,0,0,0,0,'Coruu Control Console - On Data Set 1 1 - Say'),
+(20417, 0,1,0,38,0,100,0,2,2,0,0,80,2041700,2,0,0,0,0,1,0,0,0,0, 0, 0, 0,'Coruu Control Console - On Data Set 2 2 - Run Script'),
+(20417, 0,2,0,38,0,100,0,3,3,0,0,1,1,0,0,0,0,0,12,1,0,0,0,0,0,0,'Coruu Control Console - On Data Set 3 3 - Say'),
+(20417, 0,3,0,38,0,100,0,4,4,0,0,1,2,0,0,0,0,0,12,1,0,0,0,0,0,0,'Coruu Control Console - On Data Set 4 4 - Say'),
+(20417, 0,4,5,38,0,100,0,8,8,0,0,12,20218,1,120000,1,0,0,8,0,0,0,2453.88, 2737.85, 133.27, 2.59,'Coruu Control Console - Linked with Previous Event - Summon Sunfury Technician'),
+(20417, 0,5,6,61,0,100,0,0,0,0,0,12,20218,1,120000,1,0,0,8,0,0,0,2441.62, 2735.32, 134.49, 1.97,'Coruu Control Console - Linked with Previous Event - Summon Sunfury Technician'),
+(20417, 0,6,7,61,0,100,0,0,0,0,0,12,20218,1,120000,1,0,0,8,0,0,0,2450.73, 2754.50, 134.49, 3.29,'Coruu Control Console - Linked with Previous Event - Summon Sunfury Technician'),
+(20417, 0,7,8,61,0,100,0,0,0,0,0,100,1,0,0,0,0,0,9,20218,0,200,0, 0, 0, 0,'Coruu Control Console - Linked with Previous Event - Send Target list to Sunfury Technician'),
+(20417, 0,8,0,61,0,100,0,0,0,0,0,45,2,2,0,0,0,0,9,20218,0,200,0, 0, 0, 0,'Coruu Control Console - Linked with Previous Event - Set Data to to Sunfury Technician'),
+(20417, 0,9,0,38,0,100,0,5,5,0,0,1,3,0,0,0,0,0,12,1,0,0,0,0,0,0,'Coruu Control Console - On Data Set 5 5 - Say'),
+(20417, 0,10,12,38,0,100,0,6,6,0,0,1,4,0,0,0,0,0,12,1,0,0,0,0,0,0,'Coruu Control Console - On Data Set 6 6 - Say'),
+(20417, 0,11,0,38,0,100,0,7,7,0,0,41,0,0,0,0,0,0,1,0,0,0,0,0,0,0,'Coruu Control Console - On Data Set 7 7 - Despawn'),
+(20417, 0,12,0,61,0,100,0,0,0,0,0,45,1,1,0,0,0,0,19,20226,0,0,0,0,0,0,'Coruu Control Console - On Data Set 6 6 - Set Data Manaforge Visual Trigger'),
+(20417 ,0,13,14,38,0,100,0,8,8,0,0,33,20417,0,0,0,0,0,12,1,0,0,0,0,0,0,'Coruu Control Console Script - Give Kill Credit'),
+(20417 ,0,14,15,61,0,100,0,0,0,0,0,15,10330,0,0,0,0,0,12,1,0,0,0,0,0,0,'Coru Control Console Script - Give Kill Credit'),
+(20417 ,0,13,0,61,0,100,0,0,0,0,0,15,10321,0,0,0,0,0,12,1,0,0,0,0,0,0,'Coru Control Console Script - Give Kill Credit'),
+(2041700, 9,0,0,0,0,100,0,0,0,0,0,12,20218,1,120000,1,0,0,8,0,0,0,2445.21, 2765.26, 134.49, 3.93,'Coruu Control Console - Script - Summon Sunfury Technician'),
+(2041700, 9,1,0,0,0,100,0,0,0,0,0,12,20218,1,120000,1,0,0,8,0,0,0,2429.86, 2731.85, 134.53, 1.31,'Coruu Control Console - Script - Summon Sunfury Technician'),
+(2041700, 9,2,0,0,0,100,0,0,0,0,0,100,1,0,0,0,0,0,9,20218,0,200,0, 0, 0, 0,'Coruu Control Console - Script - Send Target list to Sunfury Technician'),
+(2041700, 9,3,0,0,0,100,0,0,0,0,0,45,2,2,0,0,0,0,9,20218,0,200,0, 0, 0, 0,'Coruu Control Console - Script - Set Data to to Sunfury Technician'),
+(20418, 0,0,0,38,0,100,0,1,1,0,0,1,0,0,0,0,0,0,12,1,0,0,0,0,0,0,'Duru Control Console - On Data Set 1 1 - Say'),
+(20418, 0,1,0,38,0,100,0,2,2,0,0,80,2041800,2,0,0,0,0,1,0,0,0,0,0,0,0,'Duru Control Console - On Data Set 2 2 - Run Script'),
+(20418, 0,2,0,38,0,100,0,3,3,0,0,1,1,0,0,0,0,0,12,1,0,0,0,0,0,0,'Duru Control Console - On Data Set 3 3 - Say'),
+(20418, 0,3,4,38,0,100,0,4,4,0,0,1,2,0,0,0,0,0,12,1,0,0,0,0,0,0,'Duru Control Console - On Data Set 4 4 - Say'),
+(20418, 0,4,5,61,0,100,0,0,0,0,0,12,20218,1,120000,1,0,0,8,0,0,0,2956.18, 2202.85, 165.32, 5.45,'Duru Control Console - Linked with Previous Event - Summon Sunfury Technician'),
+(20418, 0,5,6,61,0,100,0,0,0,0,0,12,20218,1,120000,1,0,0,8,0,0,0,2975.30, 2211.50, 165.32, 4.55,'Duru Control Console - Linked with Previous Event - Summon Sunfury Technician'),
+(20418, 0,6,7,61,0,100,0,0,0,0,0,12,20436,1,120000,1,0,0,8,0,0,0,2965.02, 2217.45, 164.16, 4.96,'Duru Control Console - Linked with Previous Event - Summon Sunfury Protector'),
+(20418, 0,7,8,61,0,100,0,0,0,0,0,100,1,0,0,0,0,0,9,20218,0,200,0, 0, 0, 0,'Duru Control Console - Linked with Previous Event - Send Target list to Sunfury Technician'),
+(20418, 0,8,9,61,0,100,0,0,0,0,0,100,1,0,0,0,0,0,9,20436,0,200,0, 0, 0, 0,'Duru Control Console - Linked with Previous Event - Send Target list to Sunfury Protector'),
+(20418, 0,9,10,61,0,100,0,0,0,0,0,45,3,3,0,0,0,0,9,20218,0,200,0, 0, 0, 0,'Duru Control Console - Linked with Previous Event - Set Data to to Sunfury Technician'),
+(20418, 0,10,0,61,0,100,0,0,0,0,0,45,1,1,0,0,0,0,9,20436,0,200,0, 0, 0, 0,'Duru Control Console - Linked with Previous Event - Set Data to to Sunfury Protector'),
+(20418, 0,11,0,38,0,100,0,5,5,0,0,1,3,0,0,0,0,0,12,1,0,0,0,0,0,0,'Duru Control Console - On Data Set 5 5 - Say'),
+(20418, 0,12,14,38,0,100,0,6,6,0,0,1,4,0,0,0,0,0,12,1,0,0,0,0,0,0,'Duru Control Console - On Data Set 6 6 - Say'),
+(20418, 0,13,0,38,0,100,0,7,7,0,0,41,0,0,0,0,0,0,1,0,0,0,0,0,0,0,'Duru Control Console - On Data Set 7 7 - Despawn'),
+(20418, 0,14,0,61,0,100,0,0,0,0,0,45,1,1,0,0,0,0,19,20226,0,0,0,0,0,0,'Duru Control Console - On Data Set 6 6 - Set Data Manaforge Visual Trigger'),
+(20418 ,0,15,16,38,0,100,0,8,8,0,0,33,20418,0,0,0,0,0,12,1,0,0,0,0,0,0,'Duru Control Console Script - Give Kill Credit'),
+(20418 ,0,16,17,61,0,100,0,0,0,0,0,15,10338,0,0,0,0,0,12,1,0,0,0,0,0,0,'Duru Control Console Script - Give Kill Credit'),
+(20418 ,0,17,0,61,0,100,0,0,0,0,0,15,10322,0,0,0,0,0,12,1,0,0,0,0,0,0,'Duru Control Console Script - Give Kill Credit'),
+(2041800, 9,0,0,0,0,100,0,2,2,0,0,12,20218,1,120000,1,0,0,8,0,0,0,2986.80, 2205.36, 165.37, 3.74,'Duru Control Console - Script - Summon Sunfury Technician'),
+(2041800, 9,1,0,0,0,100,0,0,0,0,0,12,20218,1,120000,1,0,0,8,0,0,0,2952.91, 2191.20, 165.32, 0.22,'Duru Control Console - Script - Summon Sunfury Technician'),
+(2041800, 9,2,0,0,0,100,0,0,0,0,0,100,1,0,0,0,0,0,9,20218,0,200,0, 0, 0, 0,'Duru Control Console - Script - Send Target list to Sunfury Technician'),
+(2041800, 9,3,0,0,0,100,0,0,0,0,0,45,3,3,0,0,0,0,9,20218,0,200,0, 0, 0, 0,'Duru Control Console - Script - Set Data to to Sunfury Technician'),
+(20440, 0,0,0,38,0,100,0,1,1,0,0,1,0,0,0,0,0,0,12,1,0,0,0,0,0,0,'Ara Control Console - On Data Set 1 1 - Say'),
+(20440, 0,1,0,38,0,100,0,2,2,0,0,87,2044000,2044001,0,0,0,0,1,0,0,0,0,0,0,0,'Ara Control Console - On Data Set 2 2 - Run Random Script'),
+(20440, 0,2,0,38,0,100,0,3,3,0,0,1,1,0,0,0,0,0,12,1,0,0,0,0,0,0,'Ara Control Console - On Data Set 3 3 - Say'),
+(20440, 0,3,4,38,0,100,0,4,4,0,0,1,2,0,0,0,0,0,12,1,0,0,0,0,0,0,'Ara Control Console - On Data Set 4 4 - Say'),
+(20440, 0,4,5,61,0,100,0,0,0,0,0,12,20439,1,120000,1,0,0,8,0,0,0,3994.51, 4020.46, 192.18, 0.91,'Ara Control Console - Linked with Previous Event - Summon Ara Engineer'),
+(20440, 0,5,6,61,0,100,0,0,0,0,0,12,20460,1,120000,1,0,0,8,0,0,0,4021.56, 4059.35, 193.59, 4.44,'Ara Control Console - Linked with Previous Event - Summon Chief Engineer Gork lonn'),
+(20440, 0,6,7,61,0,100,0,0,0,0,0,100,1,0,0,0,0,0,9,20239,0,200,0, 0, 0, 0,'Ara Control Console - Linked with Previous Event - Send Target list to Ara Engineer'),
+(20440, 0,7,8,61,0,100,0,0,0,0,0,100,1,0,0,0,0,0,9,20460,0,200,0, 0, 0, 0,'Ara Control Console - Linked with Previous Event - Send Target list to Chief Engineer Gork lonn'),
+(20440, 0,8,9,61,0,100,0,0,0,0,0,45,4,4,0,0,0,0,9,20239,0,200,0, 0, 0, 0,'Ara Control Console - Linked with Previous Event - Set Data to to Ara Engineer'),
+(20440, 0,9,0,61,0,100,0,0,0,0,0,45,1,1,0,0,0,0,9,20460,0,200,0, 0, 0, 0,'Ara Control Console - Linked with Previous Event - Set Data to to Chief Engineer Gork lonn'),
+(20440, 0,10,0,38,0,100,0,5,5,0,0,1,3,0,0,0,0,0,12,1,0,0,0,0,0,0,'Ara Control Console - On Data Set 5 5 - Say'),
+(20440, 0,11,13,38,0,100,0,6,6,0,0,1,4,0,0,0,0,0,12,1,0,0,0,0,0,0,'Ara Control Console - On Data Set 6 6 - Say'),
+(20440, 0,12,0,38,0,100,0,7,7,0,0,41,0,0,0,0,0,0,1,0,0,0,0,0,0,0,'Ara Control Console - On Data Set 7 7 - Despawn'),
+(20440, 0,13,0,61,0,100,0,0,0,0,0,45,1,1,0,0,0,0,19,20226,0,0,0,0,0,0,'Ara Control Console - On Data Set 6 6 - Set Data Manaforge Visual Trigger'),
+(20440 ,0,14,15,38,0,100,0,8,8,0,0,33,20440,0,0,0,0,0,12,1,0,0,0,0,0,0,'Ara Control Console Script - Give Kill Credit'),
+(20440 ,0,15,16,61,0,100,0,0,0,0,0,15,10365,0,0,0,0,0,12,1,0,0,0,0,0,0,'Ara Control Console Script - Give Kill Credit'),
+(20440 ,0,16,0,61,0,100,0,0,0,0,0,15,10323,0,0,0,0,0,12,1,0,0,0,0,0,0,'Ara Control Console Script - Give Kill Credit'),
+(2044000, 9,0,0,0,0,100,0,2,2,0,0,12,20438,1,120000,1,0,0,8,0,0,0,4035.11, 4038.97, 194.27, 2.57,'Ara Control Console - Script 1 - Summon Ara Technician'),
+(2044000, 9,1,0,0,0,100,0,0,0,0,0,12,20438,1,120000,1,0,0,8,0,0,0,4033.66, 4036.79, 194.28, 2.57,'Ara Control Console - Script 1 - Summon Ara Technician'),
+(2044000, 9,2,0,0,0,100,0,0,0,0,0,12,20438,1,120000,1,0,0,8,0,0,0,4037.13, 4037.30, 194.23, 2.57,'Ara Control Console - Script 1 - Summon Ara Technician'),
+(2044000, 9,3,0,0,0,100,0,0,0,0,0,100,1,0,0,0,0,0,9,20438,0,200,0, 0, 0, 0,'Ara Control Console - Script 1 - Send Target list to Ara Technician'),
+(2044000, 9,4,0,0,0,100,0,0,0,0,0,45,4,4,0,0,0,0,9,20438,0,200,0, 0, 0, 0,'Ara Control Console - Script 1 - Set Data to to Ara Technician'),
+(2044001, 9,0,0,0,0,100,0,2,2,0,0,12,20438,1,120000,1,0,0,8,0,0,0,3099.59, 4049.30, 194.22, 0.05,'Ara Control Console - Script 2 - Summon Ara Technician'),
+(2044001, 9,1,0,0,0,100,0,0,0,0,0,12,20438,1,120000,1,0,0,8,0,0,0,3999.72, 4046.75, 194.22, 0.05,'Ara Control Console - Script 2 - Summon Ara Technician'),
+(2044001, 9,2,0,0,0,100,0,0,0,0,0,12,20438,1,120000,1,0,0,8,0,0,0,3996.81, 4048.26, 194.22, 0.05,'Ara Control Console - Script 2 - Summon Ara Technician'),
+(2044001, 9,3,0,0,0,100,0,0,0,0,0,100,1,0,0,0,0,0,9,20438,0,200,0, 0, 0, 0,'Ara Control Console - Script 1 - Send Target list to Ara Technician'),
+(2044001, 9,4,0,0,0,100,0,0,0,0,0,45,4,4,0,0,0,0,9,20438,0,200,0, 0, 0, 0,'Ara Control Console - Script 1 - Set Data to to Ara Technician'),
+(20218, 0,0,0,54,0,40,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0, 0, 0, 0,'Sunfury Technician - On Just Summoned - Say'),
+(20218, 0,1,2,38,0,100,1,1,1,0,0,8,1,0,0,0,0,0,1,0,0,0,0, 0, 0, 0,'Sunfury Technician - On Data Set - Set Defensive'),
+(20218, 0,2,0,61,0,100,0,0,0,0,0,87,2021800,2021801,0,0,0,0,1,0,0,0,0, 0, 0, 0,'Sunfury Technician - On Data Set - Set Defensive'),
+(20218, 0,3,0,1,1,100,1,12000,12000,0,0,45,1,1,0,0,0,0,20,183770,0,0,0, 0, 0, 0,'Sunfury Technician - OOC (Phase 1) - Set Data'),
+(20218, 0,4,0,1,1,100,1,12000,12000,0,0,45,1,1,0,0,0,0,20,183956,0,0,0, 0, 0, 0,'Sunfury Technician - On Evade - Set Data'),
+(20218, 0,5,0,1,1,100,1,12000,12000,0,0,45,1,1,0,0,0,0,20,184311,0,0,0, 0, 0, 0,'Sunfury Technician - On Evade - Set Data'),
+(20218, 0,6,0,40,0,100,0,1,0,0,0,80,2021806,0,0,0,0,0,1,0,0,0,0, 0, 0, 0,'Sunfury Technician - On Reached WP1 - Cast Interrupt Shutdown'),
+(20218, 0,7,8,4,0,100,0,1,0,0,0,22,0,0,0,0,0,0,1,0,0,0,0, 0, 0, 0,'Sunfury Technician - On Agro - Set Phase 0'),
+(20218, 0,8,9,61,0,100,0,0,0,0,0,8,2,0,0,0,0,0,1,0,0,0,0, 0, 0, 0,'Sunfury Technician - On agro - Set agressive'),
+(20218, 0,9,10,61,0,100,0,0,0,0,0,20,1,0,0,0,0,0,1,0,0,0,0, 0, 0, 0,'Sunfury Technician - On agro - Set agressive'),
+(20218, 0,10,0,61,0,100,0,0,0,0,0,21,1,0,0,0,0,0,1,0,0,0,0, 0, 0, 0,'Sunfury Technician - On agro - Set agressive'),
+(20218, 0,11,12,38,0,100,1,2,2,0,0,8,1,0,0,0,0,0,1,0,0,0,0, 0, 0, 0,'Sunfury Technician - On Data Set - Set Defensive'),
+(20218, 0,12,0,61,0,100,0,0,0,0,0,87,2021801,2021802,0,0,0,0,1,0,0,0,0, 0, 0, 0,'Sunfury Technician - On Data Set - Set Defensive'),
+(20218, 0,13,14,38,0,100,1,3,3,0,0,8,1,0,0,0,0,0,1,0,0,0,0, 0, 0, 0,'Sunfury Technician - On Data Set - Set Defensive'),
+(20218, 0,14,0,61,0,100,0,0,0,0,0,87,2021803,2021804,0,0,0,0,1,0,0,0,0, 0, 0, 0,'Sunfury Technician - On Data Set - Set Defensive'),
+(20218, 0,15,0,7,0,100,0,0,0,0,0,45,1,1,0,0,0,0,20,183770,0,0,0, 0, 0, 0,'Sunfury Technician - On Evade - Set Data'),
+(20218, 0,16,0,7,0,100,0,0,0,0,0,45,1,1,0,0,0,0,20,183956,0,0,0, 0, 0, 0,'Sunfury Technician - On Evade - Set Data'),
+(20218, 0,17,0,7,0,100,0,0,0,0,0,45,1,1,0,0,0,0,20,184311,0,0,0, 0, 0, 0,'Sunfury Technician - On Evade - Set Data'),
+(2021806, 9,0,0,0,0,100,0,1,0,0,0,66,0,0,0,0,0,0,8,0,0,0,0, 0, 0, 3.6,'Sunfury Technician - On Reached WP1 - Cast Interrupt Shutdown'),
+(2021806, 9,1,0,0,0,100,0,0,0,0,0,101,0,0,0,0,0,0,1,0,0,0,0, 0, 0, 0,'Sunfury Technician - On Evade - Set Data'),
+(2021806, 9,2,0,0,0,100,0,0,0,0,0,22,1,0,0,0,0,0,1,0,0,0,0, 0, 0, 0,'Sunfury Technician - On Agro - Set Phase 0'),
+(2021806, 9,3,0,0,0,100,0,1000,1000,0,0,11,35016,0,0,0,0,0,1,0,0,0,0, 0, 0, 0,'Sunfury Technician - On Reached WP1 Set Phase 1'),
+
+
+
+(2021800, 9,0,0,0,0,100,0,0,0,0,0,53,1,2021800,0,0,0,0,1,0,0,0,0, 0, 0, 0,'Sunfury Technician - Script - Start wp'),
+(2021801, 9,0,0,0,0,100,0,0,0,0,0,53,1,2021801,0,0,0,0,1,0,0,0,0, 0, 0, 0,'Sunfury Technician - Script - Start wp'),
+(2021802, 9,0,0,0,0,100,0,0,0,0,0,53,1,2021802,0,0,0,0,1,0,0,0,0, 0, 0, 0,'Sunfury Technician - Script - Start wp'),
+(2021803, 9,0,0,0,0,100,0,0,0,0,0,53,1,2021803,0,0,0,0,1,0,0,0,0, 0, 0, 0,'Sunfury Technician - Script - Start wp'),
+(2021804, 9,0,0,0,0,100,0,0,0,0,0,53,1,2021804,0,0,0,0,1,0,0,0,0, 0, 0, 0,'Sunfury Technician - Script - Start wp'),
+(2021805, 9,0,0,0,0,100,0,0,0,0,0,53,1,2021805,0,0,0,0,1,0,0,0,0, 0, 0, 0,'Sunfury Technician - Script - Start wp'),
+(20436, 0,0,0,38,2,100,0,1,1,0,0,49,0,0,0,0,0,0,12,1,0,0,0, 0, 0, 0,'Sunfury Protector - On Data Set - Attack Stored Target'),
+(20436, 0,1,0,54,0,100,0,0,0,0,0,22,2,0,0,0,0,0,1,0,0,0,0, 0, 0, 0,'Sunfury Protector - On Just Summoned - Set Phase 2'),
+(20436, 0,2,0,1,2,100,0,1000,1000,1000,1000,49,0,0,0,0,0,0,12,1,0,0,0, 0, 0, 0,'Sunfury Protector - OOC - Attack'),
+(20438, 0,0,1,38,0,100,0,4,4,0,0,8,1,0,0,0,0,0,1,0,0,0,0, 0, 0, 0,'Ara Engineer - On Data Set - Set Defensive'),
+(20438, 0,1,0,61,0,100,0,0,0,0,0,87,2043900,2043901,0,0,0,0,1,0,0,0,0, 0, 0, 0,'Ara Engineer - On Data Set - Set Defensive'),
+(20438, 0,2,0,1,1,100,1,12000,12000,0,0,45,1,1,0,0,0,0,20,184312,0,0,0, 0, 0, 0,'Ara Engineer - OOC (Phase 1) - Set Data'),
+(20438, 0,3,4,40,0,100,0,1,0,0,0,11,35176,0,0,0,0,0,1,0,0,0,0, 0, 0, 0,'Ara Engineer - On Reached WP1 - Cast Interrupt Shutdown'),
+(20438, 0,4,0,61,0,100,0,0,0,0,0,22,1,0,0,0,0,0,1,0,0,0,0, 0, 0, 0,'Ara Engineer - On Reached WP1 Set Phase 1'),
+(20438, 0,5,6,4,0,100,0,1,0,0,0,22,0,0,0,0,0,0,1,0,0,0,0, 0, 0, 0,'Ara Engineer - On Agro - Set Phase 0'),
+(20438, 0,6,7,61,0,100,0,0,0,0,0,8,2,0,0,0,0,0,1,0,0,0,0, 0, 0, 0,'Sunfury Technician - On agro - Set agressive'),
+(20438, 0,7,8,61,0,100,0,0,0,0,0,20,1,0,0,0,0,0,1,0,0,0,0, 0, 0, 0,'Sunfury Technician - On agro - Set agressive'),
+(20438, 0,8,0,61,0,100,0,0,0,0,0,21,1,0,0,0,0,0,1,0,0,0,0, 0, 0, 0,'Sunfury Technician - On agro - Set agressive'),
+(20438, 0,9,0,7,0,100,0,0,0,0,0,45,1,1,0,0,0,0,20,184312,0,0,0, 0, 0, 0,'Ara Techician - On Evade - Set Data'),
+(20439, 0,3,0,38,0,100,0,1,1,0,0,49,0,0,0,0,0,0,12,1,0,0,0, 0, 0, 0,'Ara Technician - On Data Set - Attack Stored Target'),
+(20439, 0,6,0,7,0,100,0,0,0,0,0,45,1,1,0,0,0,0,20,184312,0,0,0, 0, 0, 0,'Ara Techician - On Evade - Set Data'),
+(20438, 0,13,0,61,0,100,0,0,0,0,0,101,0,0,0,0,0,0,1,0,0,0,0, 0, 0, 0,'Sunfury Technician - On Evade - Set Data'),
+
+(2043900, 9,0,0,0,0,100,0,0,0,0,0,53,1,2043900,0,0,0,0,1,0,0,0,0, 0, 0, 0,'Ara Engineer - Script - Start wp'),
+(2043901, 9,0,0,0,0,100,0,0,0,0,0,53,1,2043901,0,0,0,0,1,0,0,0,0, 0, 0, 0,'Ara Engineer - Script - Start wp'),
+(20460, 0,0,0,38,2,100,0,1,1,0,0,49,0,0,0,0,0,0,12,1,0,0,0, 0, 0, 0,'Chief Engineer Gork lonn - On Data Set - Attack Stored Target'),
+(20460, 0,1,2,7,2,100,0,0,0,0,0,45,1,1,0,0,0,0,20,184312,0,0,0, 0, 0, 0,'Chief Engineer Gork lonn - On Evade - Set Data'),
+(20460, 0,2,0,61,2,100,0,0,0,0,0,41,0,0,0,0,0,0,1,0,0,0,0, 0, 0, 0,'Chief Engineer Gork lonn - On Evade - Despawn'),
+(20460, 0,3,0,54,0,100,0,0,0,0,0,22,2,0,0,0,0,0,1,0,0,0,0, 0, 0, 0,'Chief Engineer Gork lonn - On Just Summoned - Set Phase 2'),
+(20460, 0,4,0,1,2,100,0,1000,1000,1000,1000,49,0,0,0,0,0,0,12,1,0,0,0, 0, 0, 0,'Chief Engineer Gork lonn - OOC - Attack'),
+(20226, 0,0,1,38,0,100,0,1,1,0,0,11,35031,0,0,0,0,0,1,0,0,0,0, 0, 0, 0,'Manaforge Visual Trigger - On Data Set - Cast Manaforge Disable Visual'),
+(20226, 0,1,0,61,0,100,0,0,0,0,0,50,184954,60000,0,0,0,0,1,0,0,0,0, 0, 0, 0,'Manaforge Visual Trigger - On Data Set - Summon Manaforge Smoke');
+
+DELETE FROM `creature_text` WHERE `entry`=20218;
+INSERT INTO `creature_text` (`entry`, `groupid`, `id`, `text`, `type`, `language`, `probability`, `emote`, `duration`, `sound`, `comment`, `BroadcastTextID`) VALUES
+(20218, 0, 0, 'Stop the emergency shutdown! Kael will have our heads if he hears about this!', 12, 0, 100, 0, 0, 0, 'Sunfury Technician', 17931),
+(20218, 0, 1, 'Stop this immediately!', 12, 0, 100, 0, 0, 0, 'Sunfury Technician', 18131),
+(20218, 0, 2, 'The naaru''s emergency shutdown will disable the manaforge permanently! It must be aborted!', 12, 0, 100, 0, 0, 0, 'Sunfury Technician', 17932);
+
+
+DELETE FROM `waypoints` WHERE `entry` IN(2021800,2021801,2021802,2021803,2021804,2021805,2043900,2043901);
+INSERT INTO `waypoints` (`entry`, `pointid`, `position_x`, `position_y`, `position_z`, `point_comment`) VALUES
+(2021800,1, 2918.929199, 4180.713379, 161.866867,'Manforge B''naar cast point 1'),
+(2021801,1, 2911.797852, 4196.943848, 161.883194,'Manforge B''naar cast point 2'),
+(2021802,1, 2417.708252, 2748.968018, 132.415741,'Manforge Coruu cast point 1'),
+(2021803,1, 2424.118652, 2765.202637, 132.368378,'Manforge Coruu cast point 2'),
+(2021804,1, 2969.341797, 2175.692383, 163.197601,'Manforge Duru cast point 1'),
+(2021805,1, 2986.231201, 2184.670166, 163.204178,'Manforge Duru cast point 2'),
+(2043900,1, 4004.417969, 4033.558105, 192.624023,'Manforge Ara cast point 1'),
+(2043901,1, 4024.727295, 4027.472656, 192.559723,'Manforge Ara cast point 2');
+
diff --git a/sql/updates/world/2014_08_12_01_world_misc.sql b/sql/updates/world/2014_08_12_01_world_misc.sql
new file mode 100644
index 00000000000..a1e386b16a0
--- /dev/null
+++ b/sql/updates/world/2014_08_12_01_world_misc.sql
@@ -0,0 +1,3 @@
+UPDATE `quest_template` SET `SpecialFlags`=2 WHERE `Id` IN(10321,10322,10323,10329,1330,10338,10365);
+UPDATE `smart_scripts` SET `event_param4`=75000 WHERE `entryorguid`=17953 AND `source_type`=0 AND `id`=1 AND `link`=2;
+UPDATE `smart_scripts` SET `event_param1`=0 WHERE `entryorguid`=2021806 AND `source_type`=9 AND `id`=0 AND `link`=0;
diff --git a/sql/updates/world/2014_08_13_00_world_sai.sql b/sql/updates/world/2014_08_13_00_world_sai.sql
new file mode 100644
index 00000000000..e478edd86b3
--- /dev/null
+++ b/sql/updates/world/2014_08_13_00_world_sai.sql
@@ -0,0 +1,95 @@
+DELETE FROM `creature_text` WHERE `entry` IN(23782,24126,27248,27250,27349);
+
+INSERT INTO `creature_text` (`entry`, `groupid`, `id`, `text`, `type`, `language`, `probability`, `emote`, `duration`, `sound`, `comment`, `BroadcastTextID`) VALUES
+(24126, 0, 0, 'Excellent. What''s the lowdown? Do we have a bodycount?', 12, 0, 100, 11, 0, 0, 'Apothecary Lysander',22797),
+(24126, 1, 0, 'Well, spit it out! What''s the bad news?', 12, 0, 100, 1, 0, 0, 'Apothecary Lysander',22798),
+(24126, 2, 0, 'Severe stomach pain?', 12, 0, 100, 5, 0, 0, 'Apothecary Lysander',22800),
+(24126, 3, 0, 'SEVERE STOMACH PAIN?', 14, 0, 100, 15, 0, 0, 'Apothecary Lysander',22801),
+(24126, 4, 0, 'We are the Royal Apothecary Society! Inducing belly aches is not part of our job description!', 12, 0, 100, 0, 0, 0, 'Apothecary Lysander',22802),
+(24126, 5, 0, 'Am I surrounded by amateurs? I want a full analysis of the new strain by tomorrow morning! Get on it, Ravien!', 12, 0, 100, 25, 0, 0, 'Apothecary Lysander',22803),
+(24126, 6, 0, 'We were making progress with our plague in Undercity. All of a sudden our strains keep failing!', 12, 0, 100, 5, 0, 0, 'Apothecary Lysander',22406),
+(24126, 6, 1, 'The last ten strains from Undercity... all of them worthless!', 12, 0, 100, 5, 0, 0, 'Apothecary Lysander',22403),
+(24126, 6, 2, 'I cannot work under these conditions! We need a viable strain!', 12, 0, 100, 5, 0, 0, 'Apothecary Lysander',22404),
+(23782, 0, 0, 'Reports from the test on the enemy fleet have come in, sir!', 12, 0, 100, 1, 0, 0, 'Apothecary Ravien',22793),
+(23782, 1, 0, 'Well... the good news is we forced the reinforcements to turn back.', 12, 0, 100, 6, 0, 0, 'Apothecary Ravien',22794),
+(23782, 2, 0, 'The plague was not quite... fatal. However, reports of harmful effects include nausea, loss of equilibrium and severe stomach pain.', 12, 0, 100, 274, 0, 0, 'Apothecary Ravien',22795),
+(23782, 3, 0, 'Yes, sir!', 12, 0, 100, 273, 0, 0, 'Apothecary Ravien',22796),
+(27349, 0, 0, 'The %s moans but seems otherwise unaffected by the blight.', 16, 0, 100, 0, 0, 0, 'Scarlet Onslaught Prisoner',26389),
+(27250, 0, 0, 'Huh?', 12, 0, 100, 6, 0, 0, 'Junior Apothecary Schlemiel',26274),
+(27250, 1, 0, 'But... I followed your instructions precisely! Sorry?', 12, 0, 100, 6, 0, 0, 'Junior Apothecary Schlemiel',26277),
+(27250, 2, 0, 'Eep!', 12, 0, 100, 34, 0, 1368, 'Junior Apothecary Schlemiel',26281),
+(27248, 0, 0, 'Schlemiel!', 12, 0, 100, 5, 0, 0, 'Apothecary Vicky Levine',26273),
+(27248, 1, 0, 'Apparently you flubbed this batch of blight. What do you have to say for yourself?', 12, 0, 100, 5, 0, 0, 'Apothecary Vicky Levine',26275),
+(27248, 2, 0, 'Sorry? SORRY?! Here''s sorry for you!', 12, 0, 100, 5, 0, 0, 'Apothecary Vicky Levine',26279),
+(27248, 3, 0, 'Oops. I guess it IS working! That''s odd.', 12, 0, 100, 6, 0, 0, 'Apothecary Vicky Levine',26280),
+(27248, 4, 0, 'I''m gonna need a cleanup and a new assistant over here!', 12, 0, 100, 5, 0, 0, 'Apothecary Vicky Levine',26289);
+
+UPDATE `creature_template` SET `ainame`='SmartAI', `scriptname`='' WHERE `entry` IN(23782,24126,27248,27250);
+DELETE FROM `smart_scripts` WHERE `entryorguid` IN(23782,24126,27248,27250) AND `source_type`=0;
+DELETE FROM `smart_scripts` WHERE `entryorguid` IN(2412600,2412601,2724800) AND `source_type`=9;
+INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES
+(24126, 0, 0, 0, 20, 0, 100, 0, 11170, 0, 0, 0, 80, 2412600, 2, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Apothecary Lysander - On Quest Reward - Run Script 1'),
+(24126, 0, 1, 0, 38, 0, 100, 0, 1, 1, 0, 0, 80, 2412601, 2, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Apothecary Lysander - On Data Set - Run Script 2'),
+(24126, 0, 2, 3, 38, 0, 100, 0, 2, 2, 0, 0, 81, 3, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Apothecary Lysander - On Data Set - Set NPC Flags'),
+(24126, 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, 'Apothecary Lysander - On Data Set - Set Phase 1'),
+(24126, 0, 4, 0, 25, 0, 100, 0, 0, 0, 0, 0, 22, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Apothecary Lysander - On Reset - Set Phase 1'),
+(24126, 0, 5, 0, 1, 1, 100, 0, 0, 30000, 30000, 90000, 1, 6, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Apothecary Lysander - OOC (Phase 1) - Say'),
+(23782, 0, 0, 0, 54, 0, 100, 0, 0, 0, 0, 0, 53, 0, 23782, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Apothecary Ravien - On Just Summoned - Start WP'),
+(23782, 0, 1, 2, 40, 0, 100, 0, 6, 23782, 0, 0, 54, 60000, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Apothecary Ravien - On Reached WP6 - Pause WP'),
+(23782, 0, 2, 3, 61, 0, 100, 0, 0, 0, 0, 0, 66, 0, 0, 0, 0, 0, 0, 19, 24126, 0, 0, 0, 0, 0, 0, 'Apothecary Ravien - On Reached WP6 - Set Orientation'),
+(23782, 0, 3, 0, 61, 0, 100, 0, 0, 0, 0, 0, 45, 1, 1, 0, 0, 0, 0, 19, 24126, 0, 0, 0, 0, 0, 0, 'Apothecary Ravien - On Reached WP6 - Set Data on Apothecary Lysander'),
+(23782, 0, 4, 0, 40, 0, 100, 0, 7, 23782, 0, 0, 45, 2, 2, 0, 0, 0, 0, 19,24126, 0, 0, 0, 0, 0, 0, 'Apothecary Ravien - On Reached WP7 - Set Data on Apothecary Lysander'),
+(23782, 0, 5, 0, 40, 0, 100, 0,18, 23782, 0, 0, 41, 0, 0, 0, 0, 0, 0, 1,0, 0, 0, 0, 0, 0, 0, 'Apothecary Ravien - On Reached WP18 - Despawn'),
+(27250, 0, 0, 1, 8, 0, 100, 0,48201, 0, 0, 0, 11, 48196, 0, 0, 0, 0, 0, 1,0, 0, 0, 0, 0, 0, 0, 'Junior Apothecary Schlemiel - On Spellhit (Throw Blight) - Cast Blighted'),
+(27250, 0, 1, 2, 61, 0, 100, 0,0, 0, 0, 0, 22, 1, 0, 0, 0, 0, 0, 1,0, 0, 0, 0, 0, 0, 0, 'Junior Apothecary Schlemiel - On Spellhit (Throw Blight) - Set Phase 1'),
+(27250, 0, 2, 0, 61, 0, 100, 0,0, 0, 0, 0, 1, 2, 0, 0, 0, 0, 0, 1,0, 0, 0, 0, 0, 0, 0, 'Junior Apothecary Schlemiel - On Spellhit (Throw Blight) - Say Line 3'),
+(27250, 0, 3, 0, 1, 1, 100, 0,5000, 5000, 0, 0, 37, 0, 0, 0, 0, 0, 0, 1,0, 0, 0, 0, 0, 0, 0, 'Junior Apothecary Schlemiel - OOC (Phase 1) - Die'),
+(27248, 0, 0, 0, 20, 0, 100, 0, 12206, 0, 0, 0, 80, 2724800, 2, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Apothecary Vicky Levine - On Quest Reward - Run Script'),
+(2724800, 9,0,0,0,0,100,0,0,0,0,0,81,0,0,0,0,0,0,1,0,0,0,0, 0, 0, 0,'Apothecary Vicky Levine - Script - Set NPC Flags'),
+(2724800, 9,1,0,0,0,100,0,0,0,0,0,66,0,0,0,0,0,0,19,27250,0,0,0, 0, 0, 0,'Apothecary Vicky Levine - Script - Set Orientation'),
+(2724800, 9,2,0,0,0,100,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0, 0, 0, 0,'Apothecary Vicky Levine - Script - Say Line 1'),
+(2724800, 9,3,0,0,0,100,0,6000,6000,0,0,1,0,0,0,0,0,0,19,27250,0,0,0, 0, 0, 0,'Apothecary Vicky Levine - Script - Say Line 1 (Junior Apothecary Schlemiel)'),
+(2724800, 9,4,0,0,0,100,0,6000,6000,0,0,1,1,0,0,0,0,0,1,0,0,0,0, 0, 0, 0,'Apothecary Vicky Levine - Script - Say Line 2'),
+(2724800, 9,5,0,0,0,100,0,6000,6000,0,0,1,1,0,0,0,0,0,19,27250,0,0,0, 0, 0, 0,'Apothecary Vicky Levine - Script - Say Line 2 (Junior Apothecary Schlemiel)'),
+(2724800, 9,6,0,0,0,100,0,6000,6000,0,0,1,2,0,0,0,0,0,1,0,0,0,0, 0, 0, 0,'Apothecary Vicky Levine - Script - Say Line 3'),
+(2724800, 9,7,0,0,0,100,0,0,0,0,0,11,48201,0,0,0,0,0,19,27250,0,0,0, 0, 0, 0,'Apothecary Vicky Levine - Script - Cast Throw Blight'),
+(2724800, 9,8,0,0,0,100,0,7000,7000,0,0,1,3,0,0,0,0,0,1,0,0,0,0, 0, 0, 0,'Apothecary Vicky Levine - Script - Say Line 4'),
+(2724800, 9,9,0,0,0,100,0,6000,6000,0,0,1,4,0,0,0,0,0,1,0,0,0,0, 0, 0, 0,'Apothecary Vicky Levine - Script - Say Line 5'),
+(2724800, 9,10,0,0,0,100,0,0,0,0,0,81,2,0,0,0,0,0,1,0,0,0,0, 0, 0, 0,'Apothecary Vicky Levine - Script - Set NPC Flags'),
+(2412600, 9,0,0,0,0,100,0,0,0,0,0,12,23782,1,90000,0,0,0,8,0,0,0,1965.131, -6126.74, 25.61264, 3.271674,'Apothecary Lysander - Script 1 - Spawn Apothecary Ravien'),
+(2412600, 9,1,0,0,0,100,0,0,0,0,0,81,0,0,0,0,0,0,1,0,0,0,0, 0, 0, 0,'Apothecary Lysander - Script 1 - Set NPC Flags'),
+(2412600, 9,2,0,0,0,100,0,0,0,0,0,22,0,0,0,0,0,0,1,0,0,0,0, 0, 0, 0,'Apothecary Lysander - Script 1 - Set Phase 0'),
+(2412601, 9,0,0,0,0,100,0,0,0,0,0,1,0,0,0,0,0,0,19,23782,0,0,0, 0, 0, 0,'Apothecary Lysander - Script 2 - Say Line 1 (Apothecary Ravien)'),
+(2412601, 9,1,0,0,0,100,0,6000,6000,0,0,1,0,0,0,0,0,0,1,0,0,0,0, 0, 0, 0,'Apothecary Lysander - Script 2 - Say Line 1'),
+(2412601, 9,2,0,0,0,100,0,6000,6000,0,0,1,1,0,0,0,0,0,19,23782,0,0,0, 0, 0, 0,'Apothecary Lysander - Script 2 - Say Line 2 (Apothecary Ravien)'),
+(2412601, 9,3,0,0,0,100,0,6000,6000,0,0,1,1,0,0,0,0,0,1,0,0,0,0, 0, 0, 0,'Apothecary Lysander - Script 2 - Say Line 2'),
+(2412601, 9,4,0,0,0,100,0,6000,6000,0,0,1,2,0,0,0,0,0,19,23782,0,0,0, 0, 0, 0,'Apothecary Lysander - Script 2 - Say Line 3 (Apothecary Ravien)'),
+(2412601, 9,5,0,0,0,100,0,6000,6000,0,0,1,2,0,0,0,0,0,1,0,0,0,0, 0, 0, 0,'Apothecary Lysander - Script 2 - Say Line 3'),
+(2412601, 9,6,0,0,0,100,0,6000,6000,0,0,1,3,0,0,0,0,0,1,0,0,0,0, 0, 0, 0,'Apothecary Lysander - Script 2 - Say Line 4'),
+(2412601, 9,7,0,0,0,100,0,6000,6000,0,0,1,4,0,0,0,0,0,1,0,0,0,0, 0, 0, 0,'Apothecary Lysander - Script 2 - Say Line 5'),
+(2412601, 9,8,0,0,0,100,0,6000,6000,0,0,1,5,0,0,0,0,0,1,0,0,0,0, 0, 0, 0,'Apothecary Lysander - Script 2 - Say Line 6'),
+(2412601, 9,9,0,0,0,100,0,6000,6000,0,0,1,3,0,0,0,0,0,19,23782,0,0,0, 0, 0, 0,'Apothecary Lysander - Script 2 - Say Line 4 (Apothecary Ravien)');
+
+UPDATE `smart_scripts` SET `event_flags`=0 WHERE `entryorguid`=27349 AND `source_type`=0 AND `id`=0 AND `link`=1;
+UPDATE `smart_scripts` SET `link`=0, `event_flags`=0, `action_type`=1,`comment`='Scarlet Onslaught Prisoner - On Spellhit \'Flask of Blight\' - Say' WHERE `entryorguid`=27349 AND `source_type`=0 AND `id`=1 AND `link`=2;
+
+DELETE FROM `waypoints` WHERE `entry` IN(23782);
+INSERT INTO `waypoints` (`entry`, `pointid`, `position_x`, `position_y`, `position_z`, `point_comment`) VALUES
+(23782,1, 1950.98, -6131.159, 24.8696,'Apothecary Ravien'),
+(23782,2, 1946.992, -6136.564, 24.37891,'Apothecary Ravien'),
+(23782,3, 1946.492, -6139.314, 24.37891,'Apothecary Ravien'),
+(23782,4, 1946.492, -6140.314, 24.37891,'Apothecary Ravien'),
+(23782,5, 1946.492, -6141.314, 24.37891,'Apothecary Ravien'),
+(23782,6, 1946.492, -6142.564, 24.37891,'Apothecary Ravien'), -- Event
+(23782,7, 1946.487, -6142.437, 24.39008,'Apothecary Ravien'),
+(23782,8, 1946.487, -6141.437, 24.39008,'Apothecary Ravien'),
+(23782,9, 1946.487, -6140.437, 24.39008,'Apothecary Ravien'),
+(23782,10, 1946.487, -6139.437, 24.39008,'Apothecary Ravien'),
+(23782,11, 1947.237, -6137.437, 24.39008,'Apothecary Ravien'),
+(23782,12, 1947.051, -6137.372, 24.81357,'Apothecary Ravien'),
+(23782,13, 1948.301, -6134.372, 24.81357,'Apothecary Ravien'),
+(23782,14, 1950.301, -6133.622, 25.06357,'Apothecary Ravien'),
+(23782,15, 1954.051, -6129.622, 25.06357,'Apothecary Ravien'),
+(23782,16, 1958.301, -6127.122, 25.56357,'Apothecary Ravien'),
+(23782,17, 1958.692, -6127.187, 25.5125,'Apothecary Ravien'),
+(23782,18, 1960.692, -6127.187, 26.0125,'Apothecary Ravien'); -- Despawn
diff --git a/sql/updates/world/2014_08_14_00_world_gameobject.sql b/sql/updates/world/2014_08_14_00_world_gameobject.sql
new file mode 100644
index 00000000000..0cbe21fb11a
--- /dev/null
+++ b/sql/updates/world/2014_08_14_00_world_gameobject.sql
@@ -0,0 +1,4 @@
+SET @OGUID := 5495;
+DELETE FROM `gameobject` WHERE `guid`=@OGUID;
+INSERT INTO `gameobject` (`guid`,`id`,`map`,`spawnMask`,`phaseMask`,`position_x`,`position_y`,`position_z`,`orientation`,`spawntimesecs`,`animprogress`,`state`) VALUES
+(@OGUID,201818,631,15,1,4149.65,2779.59,350.962,0,604800,0,1);
diff --git a/sql/updates/world/2014_08_14_01_world_creature_template.sql b/sql/updates/world/2014_08_14_01_world_creature_template.sql
new file mode 100644
index 00000000000..8889a424b62
--- /dev/null
+++ b/sql/updates/world/2014_08_14_01_world_creature_template.sql
@@ -0,0 +1,16 @@
+ALTER TABLE `creature_template`
+ DROP COLUMN `mindmg`,
+ DROP COLUMN `maxdmg`,
+ DROP COLUMN `attackpower`,
+ DROP COLUMN `minrangedmg`,
+ DROP COLUMN `maxrangedmg`,
+ DROP COLUMN `rangedattackpower`,
+ CHANGE `baseattacktime` `BaseAttackTime` INT(10) UNSIGNED DEFAULT 0 NOT NULL,
+ CHANGE `rangeattacktime` `RangeAttackTime` INT(10) UNSIGNED DEFAULT 0 NOT NULL,
+ ADD COLUMN `BaseVariance` FLOAT DEFAULT 1 NOT NULL AFTER `RangeAttackTime`,
+ ADD COLUMN `RangeVariance` FLOAT DEFAULT 1 NOT NULL AFTER `BaseVariance`,
+ CHANGE `Health_mod` `HealthModifier` FLOAT DEFAULT 1 NOT NULL,
+ CHANGE `Mana_mod` `ManaModifier` FLOAT DEFAULT 1 NOT NULL,
+ CHANGE `Armor_mod` `ArmorModifier` FLOAT DEFAULT 1 NOT NULL,
+ CHANGE `dmg_multiplier` `DamageModifier` FLOAT DEFAULT 1 NOT NULL AFTER `ArmorModifier`,
+ ADD COLUMN `ExperienceModifier` FLOAT DEFAULT 1 NOT NULL AFTER `DamageModifier`;
diff --git a/sql/updates/world/2014_08_14_01_world_creature_template_434.sql b/sql/updates/world/2014_08_14_01_world_creature_template_434.sql
new file mode 100644
index 00000000000..9eceee48e9a
--- /dev/null
+++ b/sql/updates/world/2014_08_14_01_world_creature_template_434.sql
@@ -0,0 +1 @@
+ALTER TABLE `creature_template` CHANGE `Mana_mod_extra` `ManaModifierExtra` FLOAT DEFAULT 1 NOT NULL;
diff --git a/sql/updates/world/2014_08_14_02_world_misc.sql b/sql/updates/world/2014_08_14_02_world_misc.sql
new file mode 100644
index 00000000000..e08c6f66c74
--- /dev/null
+++ b/sql/updates/world/2014_08_14_02_world_misc.sql
@@ -0,0 +1,197 @@
+DELETE FROM `creature_text` WHERE `entry` IN(24703,24706,24709,25237,25256,23990,24123,23989,23991,24014,24152,24362);
+INSERT INTO `creature_text` (`entry`, `groupid`, `id`, `text`, `type`, `language`, `probability`, `emote`, `duration`, `sound`, `comment`, `BroadcastTextID`) VALUES
+(24703, 0, 0, 'The Scourge has us surrounded. We can hold the village for awhile, but if we can''t defeat them, they will overrun us.', 12, 0, 100, 5, 0, 0, 'Chieftain Wintergale',24791),
+(24703, 1, 0, 'The time has come to act. We must decide how to deal with the Scourge before it consumes us.', 12, 0, 100, 1, 0, 0, 'Chieftain Wintergale',24807),
+(24706, 0, 0, 'The choice is clear. We must attack. I know the odds are against us, but Taunka do not go quietly to the slaughter.', 12, 0, 100, 25, 0, 0, 'Durm Icehide',24792),
+(24706, 1, 0, 'I''ll die with my axes in my hands and drenched in the blood of our foes!', 12, 0, 100, 53, 0, 0, 'Durm Icehide',24793),
+(24703, 2, 0, 'I won''t sacrifice my warriors for romantic notions of glorious death on the battlefield. What use is fighting for survival if no one survives?', 12, 0, 100, 1, 0, 0, 'Chieftain Wintergale',24798),
+(24703, 3, 0, 'There will be a time for battle, Durm. But first, we must find a way to even the odds. What would you have me do, Aeire?', 12, 0, 100, 6, 0, 0, 'Chieftain Wintergale',24799),
+(24709, 0, 0, 'The ancestors knew a way to confound an enemy''s senses. We could use this knowledge to discover the Scourge''s weakness or strike at their commanders. Without their leaders, the Scourge would fall before our warriors.', 12, 0, 100, 1, 0, 0, 'Sage Aeire',24800),
+(24706, 2, 0, 'A dishonorable scheme.', 12, 0, 100, 274, 0, 0, 'Durm Icehide',24801),
+(24703, 4, 0, 'What is your honor worth, Durm? Your life? Mine? The life of blind old Greatfather Mahan, who raised you from childhood?', 12, 0, 100, 1, 0, 0, 'Chieftain Wintergale',24802),
+(24703, 5, 0, 'Honor is meaningless to a dead man. A warrior may throw himself into battle for honor''s sake, but a chieftain is responsible for far more. We will follow Sage Aeire''s plan and continue to defend our village.', 12, 0, 100, 1, 0, 0, 'Chieftain Wintergale',24803),
+(24709, 1, 0, 'I''ll take those. We can''t have the mighty chieftain cowering in fear of a few hides.', 12, 0, 100, 11, 0, 0, 'Sage Aeire',24811),
+(24703, 6, 0, 'Aeire, $n has brought your hides. Please, take them before they make me ill.', 12, 0, 100, 25, 0, 0, 'Chieftain Wintergale',24810),
+(25256, 0, 0, 'We are surrounded... Our enemies press in from all sides, young Hellscream.', 12, 1, 100, 1, 0, 0, 'High Overlord Saurfang',24486),
+(25256, 1, 0, 'The Scourge descends like locust from the north.', 12, 1, 100, 25, 0, 0, 'High Overlord Saurfang',24487),
+(25256, 2, 0, 'The Alliance holds the only secure shipping lane in this region, and even that is at risk of being lost to those dreaded mists.', 12, 1, 100, 25, 0, 0, 'High Overlord Saurfang',24488),
+(25256, 3, 0, 'Our only viable port for resupply is held by the Forsaken on the other side of this blasted continent!', 12, 1, 100, 1, 0, 0, 'High Overlord Saurfang',24489),
+(25256, 4, 0, 'Anything our zeppelins cannot haul must be brought in by ship and travel the length of Northrend to reach us.', 12, 1, 100, 1, 0, 0, 'High Overlord Saurfang',24490),
+(25237, 0, 0, '%s grunts.', 16, 1, 100, 0, 0, 0, 'Garrosh Hellscream',24491),
+(25237, 1, 0, 'Shipping lanes... supplies... You bore me to death! We need nothing more than the warrior spirit of the Horde, Saurfang! Now that we are firmly entrenched in this frozen wasteland, nothing shall stop us!', 12, 1, 100, 1, 0, 0, 'Garrosh Hellscream',24492),
+(25256, 5, 0, 'Siege engines, ammunition, heavy armor... How do you propose to shatter the walls of Icecrown without those?', 12, 1, 100, 1, 0, 0, 'High Overlord Saurfang',24493),
+(25237, 2, 0, 'Propose? I will show you what I propose!', 12, 1, 100, 6, 0, 0, 'Garrosh Hellscream',24494),
+(25237, 3, 0, 'There... Now we now have a shipping lane.', 12, 1, 100, 1, 0, 0, 'Garrosh Hellscream',24495),
+(25237, 4, 0, 'And just for good measure...', 12, 1, 100, 5, 0, 0, 'Garrosh Hellscream',24496),
+(25256, 6, 0, 'So the prodigal son has spoken!', 12, 1, 100, 5, 0, 0, 'High Overlord Saurfang',24997),
+(25256, 7, 0, 'Your father''s blood runs strong in you, Hellscream. Impatient as always... Impatient and reckless.', 12, 1, 100, 1, 0, 0, 'High Overlord Saurfang',24498),
+(25256, 8, 0, 'You rush headlong into all-out war without a thought of the consequences.', 12, 1, 100, 1, 0, 0, 'High Overlord Saurfang',24500),
+(25237, 5, 0, 'Do not speak to me of consequences, old one. ', 12, 1, 100, 25, 0, 0, 'Garrosh Hellscream',24501),
+(25256, 9, 0, 'I drank of the same blood your father did, Garrosh. Mannoroth''s cursed venom pumped through my veins as well.', 12, 1, 100, 1, 0, 0, 'High Overlord Saurfang',24502),
+(25256, 10, 0, 'I drove my weapons into the bodies and minds of my enemies.', 12, 1, 100, 1, 0, 0, 'High Overlord Saurfang',24503),
+(25256, 11, 0, 'And while Grom died a glorious death - freeing us all from the blood curse - he could not wipe away the terrible memory of our past.', 12, 1, 100, 1, 0, 0, 'High Overlord Saurfang',24504),
+(25256, 12, 0, 'His act could not erase the horrors we committed. ', 12, 1, 100, 274, 0, 0, 'High Overlord Saurfang',24505),
+(25256, 13, 0, '%s pauses.', 16, 1, 100, 0, 0, 0, 'High Overlord Saurfang',24506),
+(25256, 14, 0, 'The winter after the curse was lifted, hundreds of veteran orcs like me were lost to despair.', 12, 1, 100, 1, 0, 0, 'High Overlord Saurfang',24507),
+(25256, 15, 0, 'Our minds were finally free, yes... Free to relive all of the unthinkable acts that we had performed under the Legions'' influence.', 12, 1, 100, 273, 0, 0, 'High Overlord Saurfang',24508),
+(25256, 16, 0, '%s nods.', 16, 1, 100, 273, 0, 0, 'High Overlord Saurfang',24509),
+(25256, 17, 0, 'I think it was the sounds of the draenei children that unnerved most of them... You never forget...', 12, 1, 100, 1, 0, 0, 'High Overlord Saurfang',24510),
+(25256, 18, 0, 'Have you ever been to Jaggedswine Farm? When the swine are of age for the slaughter... It''s that sound. The sound of the swine being killed... It resonates the loudest. Those are hard times for us older veterans.', 12, 1, 100, 6, 0, 0, 'High Overlord Saurfang',24511),
+(25237, 6, 0, 'But surely you cannot think that those children were born into innocence? They would have grown up and taken arms against us!', 12, 1, 100, 5, 0, 0, 'Garrosh Hellscream',24512),
+(25256, 19, 0, '%s shakes his head.', 16, 1, 100, 274, 0, 0, 'High Overlord Saurfang',24513),
+(25256, 20, 0, 'I am not speaking solely of the children of our enemies...', 12, 1, 100, 1, 0, 0, 'High Overlord Saurfang',24515),
+(25256, 21, 0, '%s pauses.', 16, 1, 100, 1, 0, 0, 'High Overlord Saurfang',24506),
+(25256, 22, 0, 'I won''t let you take us down that dark path again, young Hellscream. I''ll kill you myself before that day comes...', 12, 1, 100, 274, 0, 0, 'High Overlord Saurfang',24516),
+(25237, 7, 0, 'How have you managed to survive for so long, Saurfang? Not fallen victim to your own memories?', 12, 1, 100, 6, 0, 0, 'Garrosh Hellscream',24518),
+(25256, 23, 0, 'I don''t eat pork...', 12, 1, 100, 274, 0, 0, 'High Overlord Saurfang',24519),
+(25256, 24, 0, '%s spits.', 16, 1, 100, 0, 0, 0, 'High Overlord Saurfang',24520),
+(24014, 0, 0, 'You too will serve the Lich King.', 12, 0, 100, 0, 0, 0, 'Necrolord',23663),
+(24014, 0, 1, 'There''s always room for one more.', 12, 0, 100, 0, 0, 13542, 'Necrolord',23669),
+(24014, 0, 2, 'Your life for the Lich King!', 12, 0, 100, 0, 0, 0, 'Necrolord',23667),
+(24014, 0, 3, 'So eager to die are we?', 12, 0, 100, 0, 0, 0, 'Necrolord',23662),
+(24014, 0, 4, 'Hello, little one. Come to play?', 12, 0, 100, 0, 0, 0, 'Necrolord',23666),
+(24014, 0, 5, 'I have so many wonders to show you.', 12, 0, 100, 0, 0, 0, 'Necrolord',23668),
+(24014, 0, 6, 'Excellent, another sacrificial lamb.', 12, 0, 100, 0, 0, 0, 'Necrolord',23661),
+(24014, 0, 7, 'There''s always room for one more.', 12, 0, 100, 0, 0, 0, 'Necrolord',23669),
+(24014, 0, 8, 'Plucked ripe off the vine.', 12, 0, 100, 0, 0, 0, 'Necrolord',23678),
+(23990, 0, 0, 'I spit on you!', 12, 0, 100, 0, 0, 13538, 'Gjalerbron Rune-Caster',30503),
+(23990, 0, 1, 'YAAARRRGH!', 12, 0, 100, 0, 0, 0, 'Gjalerbron Rune-Caster',22700),
+(23990, 0, 2, 'Look what''s come to play.', 12, 0, 100, 0, 0, 0, 'Gjalerbron Rune-Caster',22820),
+(23990, 0, 3, 'Your entrails will make a fine necklace.', 12, 0, 100, 0, 0, 13535, 'Gjalerbron Rune-Caster',30500),
+(24123, 0, 0, 'These are all excellent. It''s going to be hard to choose just one.', 12, 0, 100, 1, 0, 0, 'Nokoma Snowseer',22854),
+(24123, 1, 0, 'I think I''ve found the one I''ll use. Now I have to begin the task of carving it. I don''t think it''s going to be easy. I don''t even know what a female yeti''s mating call sounds like!', 12, 0, 100, 396, 0, 0, 'Nokoma Snowseer',22855),
+(24123, 2, 0, 'I''ve got most of the basic carving done, but it needs to be tested before I can continue. Are you willing to help me with that, $n?', 12, 0, 100, 396, 0, 0, 'Nokoma Snowseer',22856),
+(24152, 0, 0, 'Wait a minute...', 12, 0, 100, 5, 0, 0, 'Apothecary Malthus',22958),
+(24152, 1, 0, 'It''s just...', 12, 0, 100, 6, 0, 0, 'Apothecary Malthus',22959),
+(24152, 2, 0, 'Beer! Mere beer!', 12, 0, 100, 1, 0, 0, 'Apothecary Malthus',22960),
+(24152, 3, 0, 'There''s absolutely nothing out of the ordinary about it.', 12, 0, 100, 1, 0, 0, 'Apothecary Malthus',22961),
+(24152, 4, 0, 'You! Not a word to Grick about this! Do you hear me?', 12, 0, 100, 25, 0, 0, 'Apothecary Malthus',22962),
+(23989, 0, 0, 'I''ll eat your heart!', 12, 0, 100, 0, 0, 13542, 'Gjalerbron Sleep-Watcher',30508),
+(23989, 0, 1, 'YAAARRRGH!', 12, 0, 100, 0, 0, 13542, 'Gjalerbron Sleep-Watcher',22700),
+(23989, 0, 2, 'I will take pleasure in gutting you!', 12, 0, 100, 0, 0, 13533, 'Gjalerbron Sleep-Watcher',30498),
+(23989, 0, 3, 'YAAARRRGH!', 12, 0, 100, 0, 0, 0, 'Gjalerbron Sleep-Watcher',22700),
+(23989, 0, 4, 'There will be no everlasting life for you!', 12, 0, 100, 0, 0, 0, 'Gjalerbron Sleep-Watcher',22822),
+(23989, 0, 5, 'Sniveling pig!', 12, 0, 100, 0, 0, 0, 'Gjalerbron Sleep-Watcher',30504),
+(23989, 0, 6, 'Haraak foln!', 12, 0, 100, 0, 0, 0, 'Gjalerbron Sleep-Watcher',30506),
+(23991, 0, 0, 'I will feed you to the dogs!', 12, 0, 100, 0, 0, 13534, 'Gjalerbron Warrior',30499),
+(23991, 0, 1, 'I''ll eat your heart!', 12, 0, 100, 0, 0, 13542, 'Gjalerbron Warrior',30508),
+(23991, 0, 2, 'Look what''s come to play.', 12, 0, 100, 0, 0, 13542, 'Gjalerbron Warrior',22820),
+(23991, 0, 3, 'My life for Ymiron!', 12, 0, 100, 0, 0, 0, 'Gjalerbron Warrior',22702),
+(23991, 0, 4, 'I spit on you!', 12, 0, 100, 0, 0, 13538, 'Gjalerbron Warrior',30503),
+(23991, 0, 5, 'You tiny creatures disgust me!', 12, 0, 100, 0, 0, 0, 'Gjalerbron Warrior',22816),
+(23991, 0, 6, 'You tiny creatures disgust me!', 12, 0, 100, 0, 0, 13542, 'Gjalerbron Warrior',22816),
+(23991, 0, 7, 'Your entrails will make a fine necklace.', 12, 0, 100, 0, 0, 13535, 'Gjalerbron Warrior',30500),
+(23991, 0, 8, 'YAAARRRGH!', 12, 0, 100, 0, 0, 13535, 'Gjalerbron Warrior',22700),
+(23991, 0, 9, 'For Ymiron!', 12, 0, 100, 0, 0, 0, 'Gjalerbron Warrior',22697),
+(24362, 0, 0, 'They keep their tools in boxes that look like this. Look for them near the pavilions.', 12, 0, 100, 25, 0, 0, 'Longrunner Pembe',23552),
+(24362, 1, 0, 'I''m only going to carve the runes I think will give you command over a giant.', 12, 0, 100, 1, 0, 0, 'Longrunner Pembe',23246),
+(24362, 2, 0, 'I''m omitting the runes for "north" and "west" because I''m not sure how they impact the giant. I''m also including a rune to limit how long you can control it.', 12, 0, 100, 0, 0, 0, 'Longrunner Pembe',23247),
+(24362, 3, 0, 'There we go, the Rune of Command... hopefully. Not nearly as vicious as its Iron Dwarf cousin, but functional.', 12, 0, 100, 1, 0, 0, 'Longrunner Pembe',23248);
+
+UPDATE `creature_template` SET `ainame`='SmartAI', `scriptname`='' WHERE `entry` IN(25256,24703,25237,24014,23991,23989,23990,24152,24123,24362);
+
+DELETE FROM `smart_scripts` WHERE `entryorguid` IN(25256,24703,25237,24014,23991,23989,23990,24152,24123,24362) AND `source_type`=0;
+DELETE FROM `smart_scripts` WHERE `entryorguid` IN(2525600,2470300,2415200,2412300) AND `source_type`=9;
+
+DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=22 AND `SourceEntry`=25256 ;
+
+DELETE FROM `waypoints` WHERE `entry` IN(2523700,2523701);
+INSERT INTO `waypoints` (`entry`, `pointid`, `position_x`, `position_y`, `position_z`, `point_comment`) VALUES
+(2523700,1, 2836.876, 6186.151, 84.93269,'Garrosh Hellscream (Path 1)'),
+(2523700,2, 2835.618, 6183.708, 84.93269,'Garrosh Hellscream (Path 1)'),
+(2523700,3, 2838.32, 6187.36, 84.6827,'Garrosh Hellscream (Path 1)'),
+(2523701,1, 2834.367, 6182.802, 84.93269,'Garrosh Hellscream (Path 2)'),
+(2523701,2, 2833.117, 6185.052, 84.93269,'Garrosh Hellscream (Path 2)'),
+(2523701,3, 2832.875, 6185.245, 84.93269,'Garrosh Hellscream (Path 2)'),
+(2523701,4, 2834.375, 6183.995, 84.93269,'Garrosh Hellscream (Path 2)'),
+(2523701,5, 2838.32, 6187.36, 84.6827,'Garrosh Hellscream (Path 2)');
+
+INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES
+(24014, 0, 0, 0, 4, 0, 50, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Necrolord - On Agro - Say'),
+(23989, 0, 0, 0, 4, 0, 50, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Gjalerbron Sleep-Watcher - On Agro - Say'),
+(23990, 0, 0, 0, 4, 0, 50, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Gjalerbron Rune-Caster - On Agro - Say'),
+(23991, 0, 0, 0, 4, 0, 50, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Gjalerbron Warrior - On Agro - Say'),
+(24152, 0, 0, 0, 20, 0, 100, 0, 11298, 0, 0, 0, 80, 2415200, 2, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Apothecary Malthus <Royal Apothecary Society> - On Quest Reward (Whats in that brew?) - Run Script'),
+(24123, 0, 0, 0, 20, 0, 100, 0, 11275, 0, 0, 0, 80, 2412300, 2, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Nokoma Snowseer - On Quest Reward (Making The Horn) - Run Script'),
+(25256, 0, 0, 0, 1, 0, 100, 0, 0, 0, 300000, 450000, 80, 2525600, 2, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'High Overlord Saurfang - OOC - Run Script'),
+(25237, 0, 0, 6, 40, 0, 100, 0, 2, 2523700, 0, 0, 54, 1000, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Garrosh Hellscream - On Reached WP 2 (Path 1) - Pause WP'),
+(25237, 0, 1, 0, 40, 0, 100, 0, 3, 2523700, 0, 0, 66, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 3.822270, 'Garrosh Hellscream - On Reached WP 3 (Path 1) - Set Orientation'),
+(25237, 0, 2, 6, 40, 0, 100, 0, 3, 2523701, 0, 0, 54, 1000, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Garrosh Hellscream - On Reached WP 3 (Path 2) - Pause WP'),
+(25237, 0, 3, 0, 40, 0, 100, 0, 5, 2523701, 0, 0, 66, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 3.822270, 'Garrosh Hellscream - On Reached WP 5 (Path 2) - Set Orientation'),
+(25237, 0, 4, 0, 38, 0, 100, 0, 1, 1, 0, 0, 53, 1, 2523700, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Garrosh Hellscream - On Data Set 1 1 - Start WP (Path 1)'),
+(25237, 0, 5, 0, 38, 0, 100, 0, 2, 2, 0, 0, 53, 1, 2523701, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Garrosh Hellscream - On Data Set 2 2 - Start WP (Path 2)'),
+(25237, 0, 6, 0, 61, 0, 100, 0, 0, 0, 0, 0, 11, 45404, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Garrosh Hellscream - Link - Cast Crush Under Foot'),
+(24703, 0, 0, 0, 1, 0, 100, 0, 0, 0, 300000, 450000, 80, 2470300, 2, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Chieftain Wintergale - OOC - Run Script'),
+(24703, 0, 1, 0, 20, 0, 100, 0, 11628, 0, 0, 0, 1, 6, 7000, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Chieftain Wintergale - On Quest Reward (Shrouds of the Scourge) - Say Line 7'),
+(24703, 0, 2, 0, 52, 0, 100, 0, 6, 24703, 0, 0, 1, 1, 0, 0, 0, 0, 0, 19, 24709, 0, 0, 0, 0, 0, 0, 'Chieftain Wintergale - On Quest Reward (Shrouds of the Scourge) - Say Line 2 (Sage Aeire)'),
+(24362, 0, 0, 0, 19, 0, 100, 0, 11351, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Longrunner Pembe - On Quest Accept (Mastering the Runes) - Say Line 1'),
+(24362, 0, 1, 0, 20, 0, 100, 0, 11351, 0, 0, 0, 1, 1, 7000, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Longrunner Pembe - On Quest Reward (Mastering the Runes) - Say Line 2'),
+(24362, 0, 2, 0, 52, 0, 100, 0, 1, 24362, 0, 0, 1, 2, 7000, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Longrunner Pembe - On Text Over Line 2 - Say Line 3'),
+(24362, 0, 3, 0, 52, 0, 100, 0, 2, 24362, 0, 0, 1, 3, 7000, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Longrunner Pembe - On Text Over Line 3 - Say Line 4'),
+(2415200, 9, 1, 0, 0, 0, 100, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Apothecary Malthus <Royal Apothecary Society> - Script - Say Line 1'),
+(2415200, 9, 2, 0, 0, 0, 100, 0, 7000, 7000, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Apothecary Malthus <Royal Apothecary Society> - Script - Say Line 2'),
+(2415200, 9, 3, 0, 0, 0, 100, 0, 7000, 7000, 0, 0, 1, 2, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Apothecary Malthus <Royal Apothecary Society> - Script - Say Line 2'),
+(2415200, 9, 4, 0, 0, 0, 100, 0, 7000, 7000, 0, 0, 1, 3, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Apothecary Malthus <Royal Apothecary Society> - Script - Say Line 2'),
+(2415200, 9, 5, 0, 0, 0, 100, 0, 7000, 7000, 0, 0, 1, 4, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Apothecary Malthus <Royal Apothecary Society> - Script - Say Line 2'),
+(2412300, 9, 1, 0, 0, 0, 100, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Nokoma Snowseer - Script - Say Line 1'),
+(2412300, 9, 2, 0, 0, 0, 100, 0, 7000, 7000, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Nokoma Snowseer - Script - Say Line 2'),
+(2412300, 9, 3, 0, 0, 0, 100, 0, 7000, 7000, 0, 0, 1, 2, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Nokoma Snowseer - Script - Say Line 2'),
+(2470300, 9, 1, 0, 0, 0, 100, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Chieftain Wintergale - Script - Say Line 1'),
+(2470300, 9, 2, 0, 0, 0, 100, 0, 8000, 8000, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Chieftain Wintergale - Script - Say Line 2'),
+(2470300, 9, 3, 0, 0, 0, 100, 0, 8000, 8000, 0, 0, 1, 0, 0, 0, 0, 0, 0, 19, 24706, 0, 0, 0, 0, 0, 0, 'Chieftain Wintergale - Script - Say Line 1 (Durm Icehide)'),
+(2470300, 9, 4, 0, 0, 0, 100, 0, 8000, 8000, 0, 0, 1, 1, 0, 0, 0, 0, 0, 19, 24706, 0, 0, 0, 0, 0, 0, 'Chieftain Wintergale - Script - Say Line 2 (Durm Icehide)'),
+(2470300, 9, 5, 0, 0, 0, 100, 0, 8000, 8000, 0, 0, 1, 2, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Chieftain Wintergale - Script - Say Line 3'),
+(2470300, 9, 6, 0, 0, 0, 100, 0, 8000, 8000, 0, 0, 1, 3, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Chieftain Wintergale - Script - Say Line 4'),
+(2470300, 9, 7, 0, 0, 0, 100, 0, 8000, 8000, 0, 0, 1, 0, 0, 0, 0, 0, 0, 19, 24709, 0, 0, 0, 0, 0, 0, 'Chieftain Wintergale - Script - Say Line 1 (Sage Aeire)'),
+(2470300, 9, 8, 0, 0, 0, 100, 0, 8000, 8000, 0, 0, 1, 2, 0, 0, 0, 0, 0, 19, 24706, 0, 0, 0, 0, 0, 0, 'Chieftain Wintergale - Script - Say Line 3 (Durm Icehide)'),
+(2470300, 9, 9, 0, 0, 0, 100, 0, 8000, 8000, 0, 0, 1, 4, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Chieftain Wintergale - Script - Say Line 5'),
+(2470300, 9, 10, 0, 0, 0, 100, 0, 8000, 8000, 0, 0, 1, 5, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Chieftain Wintergale - Script - Say Line 6'),
+(2525600, 9, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 66, 0, 0, 0, 0, 0, 0, 19, 25237, 0, 0, 0, 0, 0, 0, 'High Overlord Saurfang - Script - Set Orientation'),
+(2525600, 9, 1, 0, 0, 0, 100, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'High Overlord Saurfang - Script - Say Line 1'),
+(2525600, 9, 2, 0, 0, 0, 100, 0, 8000, 8000, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'High Overlord Saurfang - Script - Say Line 2'),
+(2525600, 9, 3, 0, 0, 0, 100, 0, 8000, 8000, 0, 0, 1, 2, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'High Overlord Saurfang - Script - Say Line 3'),
+(2525600, 9, 4, 0, 0, 0, 100, 0, 8000, 8000, 0, 0, 1, 3, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'High Overlord Saurfang - Script - Say Line 4'),
+(2525600, 9, 5, 0, 0, 0, 100, 0, 8000, 8000, 0, 0, 1, 4, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'High Overlord Saurfang - Script - Say Line 5'),
+(2525600, 9, 6, 0, 0, 0, 100, 0, 5000, 5000, 0, 0, 1, 0, 0, 0, 0, 0, 0, 19, 25237, 0, 0, 0, 0, 0, 0, 'High Overlord Saurfang - Script - Say Line 1 (Garrosh Hellscream)'),
+(2525600, 9, 7, 0, 0, 0, 100, 0, 8000, 8000, 0, 0, 1, 1, 0, 0, 0, 0, 0, 19, 25237, 0, 0, 0, 0, 0, 0, 'High Overlord Saurfang - Script - Say Line 2 (Garrosh Hellscream)'),
+(2525600, 9, 8, 0, 0, 0, 100, 0, 8000, 8000, 0, 0, 1, 5, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'High Overlord Saurfang - Script - Say Line 6'),
+(2525600, 9, 9, 0, 0, 0, 100, 0, 8000, 8000, 0, 0, 1, 2, 0, 0, 0, 0, 0, 19, 25237, 0, 0, 0, 0, 0, 0, 'High Overlord Saurfang - Script - Say Line 3 (Garrosh Hellscream)'),
+(2525600, 9, 10, 0, 0, 0, 100, 0, 0, 0, 0, 0, 45, 1, 1, 0, 0, 0, 0, 19, 25237, 0, 0, 0, 0, 0, 0, 'High Overlord Saurfang - Script - Set Data 1 1 (Garrosh Hellscream)'),
+(2525600, 9, 11, 0, 0, 0, 100, 0, 8000, 8000, 0, 0, 1, 3, 0, 0, 0, 0, 0, 19, 25237, 0, 0, 0, 0, 0, 0, 'High Overlord Saurfang - Script - Say Line 4 (Garrosh Hellscream)'),
+(2525600, 9, 12, 0, 0, 0, 100, 0, 8000, 8000, 0, 0, 1, 4, 0, 0, 0, 0, 0, 19, 25237, 0, 0, 0, 0, 0, 0, 'High Overlord Saurfang - Script - Say Line 5 (Garrosh Hellscream)'),
+(2525600, 9, 13, 0, 0, 0, 100, 0, 0, 0, 0, 0, 45, 2, 2, 0, 0, 0, 0, 19, 25237, 0, 0, 0, 0, 0, 0, 'High Overlord Saurfang - Script - Set Data 2 2 (Garrosh Hellscream)'),
+(2525600, 9, 14, 0, 0, 0, 100, 0, 8000, 8000, 0, 0, 1, 6, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'High Overlord Saurfang - Script - Say Line 7'),
+(2525600, 9, 15, 0, 0, 0, 100, 0, 8000, 8000, 0, 0, 1, 7, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'High Overlord Saurfang - Script - Say Line 8'),
+(2525600, 9, 16, 0, 0, 0, 100, 0, 8000, 8000, 0, 0, 1, 8, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'High Overlord Saurfang - Script - Say Line 9'),
+(2525600, 9, 17, 0, 0, 0, 100, 0, 8000, 8000, 0, 0, 1, 5, 0, 0, 0, 0, 0, 19, 25237, 0, 0, 0, 0, 0, 0, 'High Overlord Saurfang - Script - Say Line 6 (Garrosh Hellscream)'),
+(2525600, 9, 18, 0, 0, 0, 100, 0, 8000, 8000, 0, 0, 1, 9, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'High Overlord Saurfang - Script - Say Line 10'),
+(2525600, 9, 19, 0, 0, 0, 100, 0, 8000, 8000, 0, 0, 1, 10, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'High Overlord Saurfang - Script - Say Line 11'),
+(2525600, 9, 20, 0, 0, 0, 100, 0, 8000, 8000, 0, 0, 1, 11, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'High Overlord Saurfang - Script - Say Line 12'),
+(2525600, 9, 21, 0, 0, 0, 100, 0, 8000, 8000, 0, 0, 1, 12, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'High Overlord Saurfang - Script - Say Line 13'),
+(2525600, 9, 22, 0, 0, 0, 100, 0, 8000, 8000, 0, 0, 1, 13, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'High Overlord Saurfang - Script - Say Line 14'),
+(2525600, 9, 23, 0, 0, 0, 100, 0, 5000, 5000, 0, 0, 1, 14, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'High Overlord Saurfang - Script - Say Line 15'),
+(2525600, 9, 24, 0, 0, 0, 100, 0, 8000, 8000, 0, 0, 1, 15, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'High Overlord Saurfang - Script - Say Line 16'),
+(2525600, 9, 25, 0, 0, 0, 100, 0, 8000, 8000, 0, 0, 1, 16, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'High Overlord Saurfang - Script - Say Line 17'),
+(2525600, 9, 26, 0, 0, 0, 100, 0, 5000, 5000, 0, 0, 1, 17, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'High Overlord Saurfang - Script - Say Line 18'),
+(2525600, 9, 27, 0, 0, 0, 100, 0, 8000, 8000, 0, 0, 1, 18, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'High Overlord Saurfang - Script - Say Line 19'),
+(2525600, 9, 28, 0, 0, 0, 100, 0, 8000, 8000, 0, 0, 1, 6, 0, 0, 0, 0, 0, 19, 25237, 0, 0, 0, 0, 0, 0, 'High Overlord Saurfang - Script - Say Line 7 (Garrosh Hellscream)'),
+(2525600, 9, 29, 0, 0, 0, 100, 0, 8000, 8000, 0, 0, 1, 19, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'High Overlord Saurfang - Script - Say Line 20'),
+(2525600, 9, 30, 0, 0, 0, 100, 0, 8000, 8000, 0, 0, 1, 20, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'High Overlord Saurfang - Script - Say Line 21'),
+(2525600, 9, 31, 0, 0, 0, 100, 0, 8000, 8000, 0, 0, 1, 21, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'High Overlord Saurfang - Script - Say Line 22'),
+(2525600, 9, 32, 0, 0, 0, 100, 0, 5000, 5000, 0, 0, 1, 22, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'High Overlord Saurfang - Script - Say Line 23'),
+(2525600, 9, 33, 0, 0, 0, 100, 0, 8000, 8000, 0, 0, 1, 7, 0, 0, 0, 0, 0, 19, 25237, 0, 0, 0, 0, 0, 0, 'High Overlord Saurfang - Script - Say Line 8 (Garrosh Hellscream)'),
+(2525600, 9, 34, 0, 0, 0, 100, 0, 8000, 8000, 0, 0, 1, 23, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'High Overlord Saurfang - Script - Say Line 24'),
+(2525600, 9, 35, 0, 0, 0, 100, 0, 5000, 5000, 0, 0, 1, 24, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'High Overlord Saurfang - Script - Say Line 25'),
+(2525600, 9, 36, 0, 0, 0, 100, 0, 0, 0, 0, 0, 66, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 5.821980, 'High Overlord Saurfang - Script - Set Orientation');
+
+
+UPDATE `quest_template` SET `SpecialFlags`=2 WHERE `Id`=10330;
+
+UPDATE `smart_scripts` SET `link`=6 WHERE `entryorguid`=17831 AND `source_type`=0 AND `id`=1 AND `link`=0;
+
+DELETE FROM `smart_scripts` WHERE `entryorguid`=17831 AND `source_type`=0 AND `id`>5;
+
+INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES
+(17831, 0, 6, 0, 61, 0, 100, 0, 0, 0, 0, 0, 22, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Watcher Leesa\'oh - Quest Reward - Set Phase 1'),
+(17831, 0, 7, 8, 1, 1, 100, 0, 300000, 300000, 0, 0, 81, 3, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Watcher Leesa\'oh - OOC (Phase 1) - Set NPC Flags'),
+(17831, 0, 8, 0, 61, 1, 100, 0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Watcher Leesa\'oh - OOC (Phase 1) - Set Phase 0');
diff --git a/sql/updates/world/2014_08_15_00_world_sai.sql b/sql/updates/world/2014_08_15_00_world_sai.sql
new file mode 100644
index 00000000000..753866d5a87
--- /dev/null
+++ b/sql/updates/world/2014_08_15_00_world_sai.sql
@@ -0,0 +1,39 @@
+DELETE FROM `creature_text` WHERE `entry`=27683;
+INSERT INTO `creature_text` (`entry`, `groupid`, `id`, `text`, `type`, `language`, `probability`, `emote`, `duration`, `sound`, `comment`, `BroadcastTextID`) VALUES
+(27683, 0, 0, 'I''ve lived here and kept this shrine with the blessing of the Alexstrasza for longer than I can remember. In its darkest hour, I''ve failed... I fell at the feet of that damned death knight... Bloodbane.', 12, 0, 100, 0, 0, 0, 'Remnant of Dahlia Suntouch',26939),
+(27683, 1, 0, 'Dahlia spits on the ground at the thought of the name.', 16, 0, 100, 0, 0, 0, 'Remnant of Dahlia Suntouch',26943),
+(27683, 2, 0, 'The Lich King is stretching his hand far now... fearlessly treading on the most sacred lands of all of the flights. He intends to force us to action.', 12, 0, 100, 0, 0, 0, 'Remnant of Dahlia Suntouch',26940),
+(27683, 3, 0, 'My time is done... I offered myself to Alexstrasza in life, but I have nothing left to offer in death. She will need a new keeper for her shrine.', 12, 0, 100, 0, 0, 0, 'Remnant of Dahlia Suntouch',26941),
+(27683, 4, 0, 'And thank you... thank you for freeing me from the shackles of the damned. You are a hero... I know you will go on to great deeds.', 12, 0, 100, 0, 0, 0, 'Remnant of Dahlia Suntouch',26942),
+(27683, 5, 0, 'The Remnant of Dahlia Suntouch fades away...', 16, 0, 100, 0, 0, 0, 'Remnant of Dahlia Suntouch',26944);
+
+DELETE FROM `waypoints` WHERE `entry` IN(27683);
+INSERT INTO `waypoints` (`entry`, `pointid`, `position_x`, `position_y`, `position_z`, `point_comment`) VALUES
+(27683,1, 3711.944, 938.4294, 55.09203,'Remnant of Dahlia Suntouch'),
+(27683,2, 3711.274, 937.6862, 55.09203,'Remnant of Dahlia Suntouch'),
+(27683,3, 3722.171, 943.1833, 54.70838,'Remnant of Dahlia Suntouch'),
+(27683,4, 3723.844, 944.0275, 53.94967,'Remnant of Dahlia Suntouch'),
+(27683,5, 3725.486, 944.8557, 54.00668,'Remnant of Dahlia Suntouch'),
+(27683,6, 3729.952, 947.1088, 53.98567,'Remnant of Dahlia Suntouch'),
+(27683,7, 3733.333, 948.8146, 53.49077,'Remnant of Dahlia Suntouch'),
+(27683,8, 3737.499, 950.9161, 53.46587,'Remnant of Dahlia Suntouch'),
+(27683,9, 3737.499, 950.9161, 53.46587,'Remnant of Dahlia Suntouch'),
+(27683,10, 3736.349, 956.1506, 53.60175,'Remnant of Dahlia Suntouch');
+
+UPDATE `creature_template` SET `ainame`='SmartAI', `scriptname`='' WHERE `entry` =27683;
+DELETE FROM `smart_scripts` WHERE `entryorguid` =27683 AND `source_type`=0;
+DELETE FROM `smart_scripts` WHERE `entryorguid` =27680 AND `source_type`=0 AND `id`=12;
+
+DELETE FROM `smart_scripts` WHERE `entryorguid` =2768300 AND `source_type`=9;
+INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES
+(27683, 0, 0, 0, 54, 0, 100, 0, 0, 0, 0, 0, 53, 0, 27683, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Remnant of Dahlia Suntouch - On Just Summoned - Start WP'),
+(27683, 0, 1, 2, 40, 0, 100, 0, 9, 27683, 0, 0, 54, 25000, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Remnant of Dahlia Suntouch - On Reached WP9 - Pause WP'),
+(27683, 0, 2, 0, 61, 0, 100, 0, 0, 0, 0, 0, 80, 2768300, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Remnant of Dahlia Suntouch - On Reached WP9 - Run Script'),
+(27680, 0, 12, 0, 6, 0, 100, 0, 0, 0, 0, 0, 12, 27683, 1, 60000, 0, 0, 0, 8, 0, 0, 0, 3712.014, 938.0595, 55.06598, 0.4672305, 'Dahlia Suntouch - On Death - Summon Remnant of Dahlia Suntouch'),
+(2768300, 9, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Remnant of Dahlia Suntouch - Script - Say Line 1'),
+(2768300, 9, 1, 0, 0, 0, 100, 0, 5000, 5000, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Remnant of Dahlia Suntouch - Script - Say Line 2'),
+(2768300, 9, 2, 0, 0, 0, 100, 0, 8000, 8000, 0, 0, 1, 2, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Remnant of Dahlia Suntouch - Script - Say Line 3'),
+(2768300, 9, 3, 0, 0, 0, 100, 0, 8000, 8000, 0, 0, 1, 3, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Remnant of Dahlia Suntouch - Script - Say Line 4'),
+(2768300, 9, 4, 0, 0, 0, 100, 0, 8000, 8000, 0, 0, 1, 4, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Remnant of Dahlia Suntouch - Script - Say Line 5'),
+(2768300, 9, 5, 0, 0, 0, 100, 0, 8000, 8000, 0, 0, 1, 5, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Remnant of Dahlia Suntouch - Script - Say Line 6'),
+(2768300, 9, 6, 0, 0, 0, 100, 0, 500, 500, 0, 0, 41, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Remnant of Dahlia Suntouch - Despawn - Say Line 6');
diff --git a/sql/updates/world/2014_08_15_01_world_misc.sql b/sql/updates/world/2014_08_15_01_world_misc.sql
new file mode 100644
index 00000000000..5be02998c64
--- /dev/null
+++ b/sql/updates/world/2014_08_15_01_world_misc.sql
@@ -0,0 +1,170 @@
+SET @CGuid := 143153;
+SET @OGuid := 77204;
+DELETE FROM `creature` WHERE `id` IN(23929,25284);
+INSERT INTO `creature` (`guid`, `id`, `map`, `spawnMask`, `phaseMask`, `position_x`, `position_y`, `position_z`, `orientation`, `spawntimesecs`, `spawndist`, `MovementType`) VALUES
+(@CGUID+0, 23929, 571, 1, 1, 2062.051, -6156.655, 2.237447, 2.628232, 120, 5, 1), -- 23929 (Area: 495)
+(@CGUID+1, 23929, 571, 1, 1, 2039.878, -6193.417, -3.080797, 0.6698744, 120, 5, 1), -- 23929 (Area: 495)
+(@CGUID+2, 23929, 571, 1, 1, 2081.596, -6220.62, -5.559644, 5.520558, 120, 5, 1), -- 23929 (Area: 495)
+(@CGUID+3, 23929, 571, 1, 1, 2077.341, -6119.324, 5.133451, 4.804286, 120, 5, 1), -- 23929 (Area: 495)
+(@CGUID+4, 23929, 571, 1, 1, 2115, -6212.778, -4.308464, 3.277982, 120, 5, 1), -- 23929 (Area: 495)
+(@CGUID+5, 23929, 571, 1, 1, 2122.892, -6158.371, 0.6280799, 0.982948, 120, 5, 1), -- 23929 (Area: 495)
+(@CGUID+6, 23929, 571, 1, 1, 2087.858, -6250.41, -10.2408, 1.35658, 120, 5, 1), -- 23929 (Area: 495)
+(@CGUID+7, 23929, 571, 1, 1, 2119.835, -6118.032, 4.803041, 4.132127, 120, 5, 1), -- 23929 (Area: 495)
+(@CGUID+8, 23929, 571, 1, 1, 2013.993, -6254.518, -21.00015, 1.112391, 120, 5, 1), -- 23929 (Area: 495)
+(@CGUID+9, 23929, 571, 1, 1, 2074.681, -6119.5, 5.277219, 0.4713301, 120, 5, 1), -- 23929 (Area: 495)
+(@CGUID+10, 23929, 571, 1, 1, 2031.484, -6194.683, -3.001702, 3.621255, 120, 5, 1), -- 23929 (Area: 495)
+(@CGUID+11, 23929, 571, 1, 1, 1812.82, -6244.173, 1.262661, 2.487445, 120, 5, 1), -- 23929 (Area: 495)
+(@CGUID+12, 23929, 571, 1, 1, 1776.06, -6286.881, -8.274602, 2.982747, 120, 5, 1), -- 23929 (Area: 495)
+(@CGUID+13, 23929, 571, 1, 1, 1751.377, -6316.019, -10.69181, 3.970208, 120, 5, 1), -- 23929 (Area: 495)
+(@CGUID+14, 23929, 571, 1, 1, 1815.154, -6316.675, -13.0728, 4.246229, 120, 5, 1), -- 23929 (Area: 495)
+(@CGUID+15, 23929, 571, 1, 1, 1720.834, -6354.166, -23.7564, 3.148981, 120, 5, 1), -- 23929 (Area: 495)
+(@CGUID+16, 23929, 571, 1, 1, 1786.484, -6348.827, -15.25126, 5.586704, 120, 5, 1), -- 23929 (Area: 495)
+(@CGUID+17, 23929, 571, 1, 1, 2012.074, -6258.688, -24.43521, 1.652964, 120, 5, 1), -- 23929 (Area: 495)
+(@CGUID+18, 23929, 571, 1, 1, 2079.094, -6215.773, -5.043775, 5.081459, 120, 5, 1), -- 23929 (Area: 495)
+(@CGUID+19, 23929, 571, 1, 1, 2071.581, -6157.182, 0.1636388, 5.932077, 120, 5, 1), -- 23929 (Area: 495)
+(@CGUID+20, 23929, 571, 1, 1, 2074.838, -6118.759, 5.493956, 5.970884, 120, 5, 1), -- 23929 (Area: 495)
+(@CGUID+21, 23929, 571, 1, 1, 2117.708, -6161.979, -0.6126428, 3.141593, 120, 5, 1), -- 23929 (Area: 495)
+(@CGUID+22, 23929, 571, 1, 1, 2125.113, -6124.736, 3.693666, 0.07874685, 120, 5, 1), -- 23929 (Area: 495)
+(@CGUID+23, 23929, 571, 1, 1, 2151.335, -6116.62, 3.726775, 0.7912424, 120, 5, 1), -- 23929 (Area: 495)
+(@CGUID+24, 23929, 571, 1, 1, 2164.445, -6072.661, 6.89298, 2.316718, 120, 5, 1), -- 23929 (Area: 495)
+(@CGUID+25, 23929, 571, 1, 1, 2179.933, -6160.375, -2.803007, 4.367789, 120, 5, 1), -- 23929 (Area: 495)
+(@CGUID+26, 23929, 571, 1, 1, 2153.739, -6181.967, -3.171751, 5.224991, 120, 5, 1), -- 23929 (Area: 495)
+(@CGUID+27, 23929, 571, 1, 1, 2220.191, -6099.616, 0.6470425, 4.567189, 120, 5, 1), -- 23929 (Area: 495)
+(@CGUID+28, 23929, 571, 1, 1, 2221.758, -6150.805, -3.64033, 6.07286, 120, 5, 1), -- 23929 (Area: 495)
+(@CGUID+29, 23929, 571, 1, 1, 2219.395, -6119.518, -0.3414693, 5.788517, 120, 5, 1), -- 23929 (Area: 495)
+(@CGUID+30, 23929, 571, 1, 1, 2244.717, -6174.005, -2.611649, 4.025463, 120, 5, 1), -- 23929 (Area: 495)
+(@CGUID+31, 23929, 571, 1, 1, 2268.053, -6148.229, 0.8215511, 4.072433, 120, 5, 1), -- 23929 (Area: 495)
+(@CGUID+32, 23929, 571, 1, 1, 2259.826, -6126.416, -1.830338, 5.523048, 120, 5, 1), -- 23929 (Area: 495)
+(@CGUID+33, 23929, 571, 1, 1, 2254.738, -6091.322, -2.024077, 5.402378, 120, 5, 1), -- 23929 (Area: 495)
+(@CGUID+34, 23929, 571, 1, 1, 2271.875, -6126.52, -1.595837, 4.712389, 120, 5, 1), -- 23929 (Area: 495)
+(@CGUID+35, 23929, 571, 1, 1, 2314.286, -6078.776, -3.049409, 1.255219, 120, 5, 1), -- 23929 (Area: 495)
+(@CGUID+36, 23929, 571, 1, 1, 2285.159, -6048.628, 1.530014, 1.072228, 120, 5, 1), -- 23929 (Area: 495)
+(@CGUID+37, 23929, 571, 1, 1, 2343.827, -6044.389, 1.277295, 1.883511, 120, 5, 1), -- 23929 (Area: 495)
+(@CGUID+38, 23929, 571, 1, 1, 2335.332, -6080.069, 1.338652, 0.232657, 120, 5, 1), -- 23929 (Area: 495)
+(@CGUID+39, 23929, 571, 1, 1, 2351.129, -6115.324, -4.712684, 3.427819, 120, 5, 1), -- 23929 (Area: 495)
+(@CGUID+40, 23929, 571, 1, 1, 2386.805, -6029.24, 1.689566, 5.427387, 120, 5, 1), -- 23929 (Area: 495)
+(@CGUID+41, 23929, 571, 1, 1, 2386.735, -6067.292, -0.04827976, 5.714135, 120, 5, 1), -- 23929 (Area: 495)
+(@CGUID+42, 23929, 571, 1, 1, 2384.594, -6092.619, -3.653382, 5.481915, 120, 5, 1), -- 23929 (Area: 495)
+(@CGUID+43, 23929, 571, 1, 1, 2423.318, -6059.001, -6.105264, 3.636262, 120, 5, 1), -- 23929 (Area: 495)
+(@CGUID+44, 23929, 571, 1, 1, 2377.889, -6160.928, -19.9129, 1.64061, 120, 5, 1), -- 23929 (Area: 495)
+(@CGUID+45, 23929, 571, 1, 1, 2436.968, -6086.432, -7.688639, 2.888794, 120, 5, 1), -- 23929 (Area: 495)
+(@CGUID+46, 23929, 571, 1, 1, 2440.737, -6130.041, 1.548573, 0.08994298, 120, 5, 1), -- 23929 (Area: 495)
+(@CGUID+47, 23929, 571, 1, 1, 2431.062, -6115.15, 1.2024, 0.1236143, 120, 5, 1), -- 23929 (Area: 495)
+(@CGUID+48, 23929, 571, 1, 1, 2441.386, -6147.935, -9.38678, 5.727692, 120, 5, 1), -- 23929 (Area: 495)
+(@CGUID+49, 23929, 571, 1, 1, 2481.23, -6117.843, -16.34631, 0.01528431, 120, 5, 1), -- 23929 (Area: 495)
+(@CGUID+50, 23929, 571, 1, 1, 2416.964, -6180.481, -10.01509, 5.76622, 120, 5, 1), -- 23929 (Area: 495)
+(@CGUID+51, 23929, 571, 1, 1, 2517.968, -6183.572, -14.04712, 0.9787358, 120, 5, 1), -- 23929 (Area: 495)
+(@CGUID+52, 23929, 571, 1, 1, 2479.459, -6216.994, -9.751188, 5.713609, 120, 5, 1), -- 23929 (Area: 495)
+(@CGUID+53, 23929, 571, 1, 1, 2357.83, -6189.611, -5.109934, 4.951204, 120, 5, 1), -- 23929 (Area: 495)
+(@CGUID+54, 23929, 571, 1, 1, 2449.997, -6250.838, -23.58067, 5.063299, 120, 5, 1), -- 23929 (Area: 495)
+(@CGUID+55, 23929, 571, 1, 1, 2309.368, -6179.754, -1.228604, 4.355446, 120, 5, 1), -- 23929 (Area: 495)
+(@CGUID+56, 23929, 571, 1, 1, 2275.881, -6190.431, -3.251583, 4.121325, 120, 5, 1), -- 23929 (Area: 495)
+(@CGUID+57, 23929, 571, 1, 1, 2145.802, -6215.906, -7.7219, 3.838213, 120, 5, 1), -- 23929 (Area: 495)
+(@CGUID+58, 23929, 571, 1, 1, 2120.029, -6220.328, -5.733196, 5.31485, 120, 5, 1), -- 23929 (Area: 495)
+(@CGUID+59, 23929, 571, 1, 1, 2184.749, -6251.813, -16.28959, 5.527495, 120, 5, 1), -- 23929 (Area: 495)
+(@CGUID+60, 23929, 571, 1, 1, 1854.276, -6285.03, -2.871074, 0.0351761, 120, 5, 1), -- 23929 (Area: 495)
+(@CGUID+61, 23929, 571, 1, 1, 1380.867, -6553.344, -46.03973, 3.758869, 120, 5, 1), -- 23929 (Area: 495)
+(@CGUID+62, 23929, 571, 1, 1, 1178.156, -6519.182, -92.66708, 3.490531, 120, 5, 1), -- 23929 (Area: 495)
+(@CGUID+63, 23929, 571, 1, 1, 1127.725, -6511.934, -94.98593, 4.032036, 120, 5, 1), -- 23929 (Area: 495)
+(@CGUID+64, 23929, 571, 1, 1, 1084.161, -6485.229, -108.9694, 0.2125256, 120, 0, 1), -- 23929 (Area: 3979)
+(@CGUID+65, 23929, 571, 1, 1, 1921.829, -6288.605, -31.88664, 2.203755, 120, 5, 1), -- 23929 (Area: 495)
+(@CGUID+66, 23929, 571, 1, 1, 1874.235, -6321.702, -14.44084, 3.356235, 120, 5, 1), -- 23929 (Area: 495)
+(@CGUID+67, 25284, 571, 1, 1, 2978.103, 6172.022, 60.97056, 5.323254, 120, 0, 0), -- 25284 (Area: 3537)
+(@CGUID+68, 25284, 571, 1, 1, 2945.243, 6246.111, 60.97499, 6.161012, 120, 0, 0), -- 25284 (Area: 3537)
+(@CGUID+69, 25284, 571, 1, 1, 2957.582, 6227.221, 60.7323, 3.944444, 120, 0, 0), -- 25284 (Area: 3537)
+(@CGUID+70, 25284, 571, 1, 1, 2926.579, 6281.956, 62.19782, 0.8028514, 120, 0, 0), -- 25284 (Area: 3537)
+(@CGUID+71, 25284, 571, 1, 1, 2887.594, 6237.456, 77.77579, 3.857178, 120, 0, 0), -- 25284 (Area: 3537)
+(@CGUID+72, 25284, 571, 1, 1, 2867.707, 6267.306, 61.74702, 4.991642, 120, 0, 0), -- 25284 (Area: 3537)
+(@CGUID+73, 25284, 571, 1, 1, 2854.757, 6246.977, 77.77579, 3.351032, 120, 0, 0), -- 25284 (Area: 3537)
+(@CGUID+74, 25284, 571, 1, 1, 2905.465, 6216.614, 61.55614, 5.305801, 120, 0, 0), -- 25284 (Area: 3537)
+(@CGUID+75, 25284, 571, 1, 1, 2928.379, 6185.368, 62.54679, 1.919862, 120, 0, 0), -- 25284 (Area: 3537)
+(@CGUID+76, 25284, 571, 1, 1, 2894.524, 6226.447, 77.77579, 3.647738, 120, 0, 0), -- 25284 (Area: 3537)
+(@CGUID+77, 25284, 571, 1, 1, 2887.594, 6237.456, 77.77579, 3.857178, 120, 0, 0), -- 25284 (Area: 3537)
+(@CGUID+78, 25284, 571, 1, 1, 2854.757, 6246.977, 77.77579, 3.351032, 120, 0, 0), -- 25284 (Area: 3537)
+(@CGUID+79, 25284, 571, 1, 1, 2905.465, 6216.614, 61.55614, 5.305801, 120, 0, 0), -- 25284 (Area: 3537)
+(@CGUID+80, 25284, 571, 1, 1, 2902.444, 6158.434, 78.50218, 2.96706, 120, 0, 0), -- 25284 (Area: 3537)
+(@CGUID+81, 25284, 571, 1, 1, 2895.373, 6293.756, 61.66352, 4.24115, 120, 0, 0), -- 25284 (Area: 3537)
+(@CGUID+82, 25284, 571, 1, 1, 2934.037, 6166.059, 62.02911, 2.007129, 120, 0, 0), -- 25284 (Area: 3537)
+(@CGUID+83, 25284, 571, 1, 1, 2819.929, 6311.556, 62.53657, 4.694936, 120, 0, 0), -- 25284 (Area: 3537)
+(@CGUID+84, 25284, 571, 1, 1, 2921.874, 6135.715, 78.50816, 5.166174, 120, 0, 0), -- 25284 (Area: 3537)
+(@CGUID+85, 25284, 571, 1, 1, 2754.331, 6240.902, 77.77577, 3.176499, 120, 0, 0), -- 25284 (Area: 3537)
+(@CGUID+86, 25284, 571, 1, 1, 2704.211, 6040.896, 30.74461, 5.77704, 120, 0, 0), -- 25284 (Area: 3537)
+(@CGUID+87, 25284, 571, 1, 1, 2722.752, 6031.677, 30.67421, 2.181662, 120, 0, 0), -- 25284 (Area: 3537)
+(@CGUID+88, 25284, 571, 1, 1, 2685.116, 6131.614, 40.07638, 2.530727, 120, 0, 0), -- 25284 (Area: 3537)
+(@CGUID+89, 25284, 571, 1, 1, 2689.42, 6110.311, 40.18113, 2.199115, 120, 0, 0), -- 25284 (Area: 3537)
+(@CGUID+90, 25284, 571, 1, 1, 2680.275, 6147.348, 40.37154, 5.602507, 120, 0, 0), -- 25284 (Area: 3537)
+(@CGUID+91, 25284, 571, 1, 1, 2721.42, 6008.339, 32.75626, 3.804818, 120, 0, 0), -- 25284 (Area: 3537)
+(@CGUID+92, 25284, 571, 1, 1, 2650.328, 6111.799, 38.28828, 3.001966, 120, 0, 0), -- 25284 (Area: 3537)
+(@CGUID+93, 25284, 571, 1, 1, 2689.249, 6194.803, 54.03319, 3.490659, 120, 0, 0), -- 25284 (Area: 3537)
+(@CGUID+94, 25284, 571, 1, 1, 2669.266, 6179.793, 39.35976, 5.654867, 120, 0, 0), -- 25284 (Area: 3537)
+(@CGUID+95, 25284, 571, 1, 1, 2656.433, 6220.198, 38.51787, 1.762783, 120, 0, 0), -- 25284 (Area: 3537)
+(@CGUID+96, 25284, 571, 1, 1, 2567.771, 6109.047, 54.6977, 3.769911, 120, 0, 0), -- 25284 (Area: 3537)
+(@CGUID+97, 25284, 571, 1, 1, 2641.339, 6031.713, 54.29123, 3.263766, 120, 0, 0), -- 25284 (Area: 3537)
+(@CGUID+98, 25284, 571, 1, 1, 2625.259, 6095.536, 54.0161, 5.235988, 120, 0, 0), -- 25284 (Area: 3537)
+(@CGUID+99, 25284, 571, 1, 1, 2585.699, 6190.792, 39.16593, 3.909538, 120, 0, 0), -- 25284 (Area: 3537)
+(@CGUID+100, 25284, 571, 1, 1, 2615.039, 6115.129, 45.42371, 2.495821, 120, 0, 0), -- 25284 (Area: 3537)
+(@CGUID+101, 25284, 571, 1, 1, 2634.755, 6034.534, 54.04792, 3.071779, 120, 0, 0), -- 25284 (Area: 3537)
+(@CGUID+102, 25284, 571, 1, 1, 2700.171, 6236.872, 39.57338, 6.126106, 120, 0, 0), -- 25284 (Area: 3537)
+(@CGUID+103, 25284, 571, 1, 1, 2660.299, 6237.816, 38.33454, 3.909538, 120, 0, 0), -- 25284 (Area: 3537)
+(@CGUID+104, 25284, 571, 1, 1, 2671.279, 6169.584, 39.5054, 5.51524, 120, 0, 0), -- 25284 (Area: 3537)
+(@CGUID+105, 25284, 571, 1, 1, 2717.305, 6294.582, 61.74333, 1.343904, 120, 0, 0), -- 25284 (Area: 3537)
+(@CGUID+106, 25284, 571, 1, 1, 2673.979, 6268.218, 39.8142, 2.635447, 120, 0, 0), -- 25284 (Area: 3537)
+(@CGUID+107, 25284, 571, 1, 1, 2629.925, 6118.807, 38.28828, 2.426008, 120, 0, 0), -- 25284 (Area: 3537)
+(@CGUID+108, 25284, 571, 1, 1, 2627.617, 6052.651, 54.03309, 6.213372, 120, 0, 0), -- 25284 (Area: 3537)
+(@CGUID+109, 25284, 571, 1, 1, 2590.953, 6064.318, 53.93201, 0.9948376, 120, 0, 0), -- 25284 (Area: 3537)
+(@CGUID+110, 25284, 571, 1, 1, 2650.328, 6111.799, 38.28828, 3.001966, 120, 0, 0), -- 25284 (Area: 3537)
+(@CGUID+111, 25284, 571, 1, 1, 2669.266, 6179.793, 39.35976, 5.654867, 120, 0, 0), -- 25284 (Area: 3537)
+(@CGUID+112, 25284, 571, 1, 1, 2637.65, 6217.151, 40.16053, 2.199115, 120, 0, 0), -- 25284 (Area: 3537)
+(@CGUID+113, 25284, 571, 1, 1, 2677.915, 6199.642, 39.81421, 2.513274, 120, 0, 0), -- 25284 (Area: 3537)
+(@CGUID+114, 25284, 571, 1, 1, 2708.715, 6270.94, 47.00795, 3.228859, 120, 0, 0), -- 25284 (Area: 3537)
+(@CGUID+115, 25284, 571, 1, 1, 2685.116, 6131.614, 40.07638, 2.530727, 120, 0, 0), -- 25284 (Area: 3537)
+(@CGUID+116, 25284, 571, 1, 1, 2680.275, 6147.348, 40.37154, 5.602507, 120, 0, 0), -- 25284 (Area: 3537)
+(@CGUID+117, 25284, 571, 1, 1, 2990.109, 6142.668, 61.59288, 1.27409, 120, 0, 0), -- 25284 (Area: 3537)
+(@CGUID+118, 25284, 571, 1, 1, 2673.979, 6268.218, 39.8142, 2.635447, 120, 0, 0), -- 25284 (Area: 3537)
+(@CGUID+119, 25284, 571, 1, 1, 2700.171, 6236.872, 39.57338, 6.126106, 120, 0, 0), -- 25284 (Area: 3537)
+(@CGUID+120, 25284, 571, 1, 1, 2641.339, 6031.713, 54.29123, 3.263766, 120, 0, 0), -- 25284 (Area: 3537)
+(@CGUID+121, 25284, 571, 1, 1, 2979.675, 6128.437, 62.3862, 2.844887, 120, 0, 0); -- 25284 (Area: 3537)
+
+DELETE FROM `gameobject` WHERE `id` =188359;
+INSERT INTO `gameobject` (`guid`, `id`, `map`, `spawnMask`, `phaseMask`, `position_x`, `position_y`, `position_z`, `orientation`, `rotation0`, `rotation1`, `rotation2`, `rotation3`, `spawntimesecs`, `animprogress`, `state`) VALUES
+(@OGUID+0, 188359, 571, 1, 1, 2739.448, 1009.872, -15.50548, 1.117009, 0, 0, 0, 1, 120, 255, 1), -- 188359 (Area: 65)
+(@OGUID+1, 188359, 571, 1, 1, 2693.321, 800.6493, -35.41924, 4.01426, 0, 0, 0, 1, 120, 255, 1), -- 188359 (Area: 65)
+(@OGUID+2, 188359, 571, 1, 1, 2626.211, 916.5868, -38.96599, 0.1745321, 0, 0, 0, 1, 120, 255, 1), -- 188359 (Area: 65)
+(@OGUID+3, 188359, 571, 1, 1, 2676.746, 1013.403, -40.85683, 4.136433, 0, 0, 0, 1, 120, 255, 1), -- 188359 (Area: 65)
+(@OGUID+4, 188359, 571, 1, 1, 2620.612, 856.0625, -50.26746, 4.450591, 0, 0, 0, 1, 120, 255, 1), -- 188359 (Area: 65)
+(@OGUID+5, 188359, 571, 1, 1, 2572.437, 893.8802, -58.98691, 1.466076, 0, 0, 0, 1, 120, 255, 1), -- 188359 (Area: 65)
+(@OGUID+6, 188359, 571, 1, 1, 2529.14, 934.5538, -72.81474, 0.7853968, 0, 0, 0, 1, 120, 255, 1), -- 188359 (Area: 65)
+(@OGUID+7, 188359, 571, 1, 1, 2575.657, 1030.057, -53.22688, 2.268925, 0, 0, 0, 1, 120, 255, 1), -- 188359 (Area: 65)
+(@OGUID+8, 188359, 571, 1, 1, 2534.077, 989.4757, -71.60398, 1.466076, 0, 0, 0, 1, 120, 255, 1), -- 188359 (Area: 65)
+(@OGUID+9, 188359, 571, 1, 1, 2509.641, 873.2882, -75.62807, 1.658062, 0, 0, 0, 1, 120, 255, 1), -- 188359 (Area: 65)
+(@OGUID+10, 188359, 571, 1, 1, 2563.084, 823.2552, -61.71206, 3.124123, 0, 0, 0, 1, 120, 255, 1), -- 188359 (Area: 65)
+(@OGUID+11, 188359, 571, 1, 1, 2518.605, 800.5799, -76.53564, 2.146753, 0, 0, 0, 1, 120, 255, 1), -- 188359 (Area: 65)
+(@OGUID+12, 188359, 571, 1, 1, 2615.869, 802.5712, -51.88618, 4.904376, 0, 0, 0, 1, 120, 255, 1), -- 188359 (Area: 65)
+(@OGUID+13, 188359, 571, 1, 1, 2581.496, 762.3195, -61.76929, 1.117009, 0, 0, 0, 1, 120, 255, 1), -- 188359 (Area: 65)
+(@OGUID+14, 188359, 571, 1, 1, 2535.514, 735.6823, -77.05926, 2.617989, 0, 0, 0, 1, 120, 255, 1), -- 188359 (Area: 65)
+(@OGUID+15, 188359, 571, 1, 1, 2571.571, 706.4549, -67.86278, 1.989672, 0, 0, 0, 1, 120, 255, 1), -- 188359 (Area: 65)
+(@OGUID+16, 188359, 571, 1, 1, 2629.165, 735.0938, -46.26245, 1.640607, 0, 0, 0, 1, 120, 255, 1), -- 188359 (Area: 65)
+(@OGUID+17, 188359, 571, 1, 1, 2613.99, 677.934, -56.06399, 6.230826, 0, 0, 0, 1, 120, 255, 1), -- 188359 (Area: 65)
+(@OGUID+18, 188359, 571, 1, 1, 2681.451, 736.7986, -33.3134, 0.9075702, 0, 0, 0, 1, 120, 255, 1), -- 188359 (Area: 65)
+(@OGUID+19, 188359, 571, 1, 1, 2645.693, 650.7758, -48.87302, 2.792518, 0, 0, 0, 1, 120, 255, 1), -- 188359 (Area: 65)
+(@OGUID+20, 188359, 571, 1, 1, 2711.268, 1039.043, -16.4229, 5.724681, 0, 0, 0, 1, 120, 255, 1), -- 188359 (Area: 65)
+(@OGUID+21, 188359, 571, 1, 1, 2644.706, 1073.232, -23.43658, 3.926996, 0, 0, 0, 1, 120, 255, 1), -- 188359 (Area: 65)
+(@OGUID+22, 188359, 571, 1, 1, 2647.365, 1045.391, -30.60161, 2.007128, 0, 0, 0, 1, 120, 255, 1), -- 188359 (Area: 65)
+(@OGUID+23, 188359, 571, 1, 1, 2633.851, 982.8386, -46.50484, 0.2094394, 0, 0, 0, 1, 120, 255, 1), -- 188359 (Area: 65)
+(@OGUID+24, 188359, 571, 1, 1, 2590.615, 1085.63, -34.9085, 6.265733, 0, 0, 0, 1, 120, 255, 1), -- 188359 (Area: 65)
+(@OGUID+25, 188359, 571, 1, 1, 2609.903, 625.9184, -57.36692, 4.502952, 0, 0, 0, 1, 120, 255, 1), -- 188359 (Area: 65)
+(@OGUID+26, 188359, 571, 1, 1, 2549.809, 657.2969, -71.88847, 6.0912, 0, 0, 0, 1, 120, 255, 1), -- 188359 (Area: 65)
+(@OGUID+27, 188359, 571, 1, 1, 2638.909, 576.8455, -54.19276, 1.815142, 0, 0, 0, 1, 120, 255, 1), -- 188359 (Area: 65)
+(@OGUID+28, 188359, 571, 1, 1, 2701.917, 570.9913, -38.3619, 1.239183, 0, 0, 0, 1, 120, 255, 1), -- 188359 (Area: 65)
+(@OGUID+29, 188359, 571, 1, 1, 2575.972, 561.1805, -57.53023, 5.131269, 0, 0, 0, 1, 120, 255, 1), -- 188359 (Area: 65)
+(@OGUID+30, 188359, 571, 1, 1, 2532.788, 599.1788, -67.74231, 5.951575, 0, 0, 0, 1, 120, 255, 1), -- 188359 (Area: 65)
+(@OGUID+31, 188359, 571, 1, 1, 2518.677, 539.4149, -57.49432, 3.141593, 0, 0, 0, 1, 120, 255, 1), -- 188359 (Area: 65)
+(@OGUID+32, 188359, 571, 1, 1, 2660.824, 515.9827, -59.03183, 2.91469, 0, 0, 0, 1, 120, 255, 1), -- 188359 (Area: 65)
+(@OGUID+33, 188359, 571, 1, 1, 2581.496, 762.3195, -61.76929, 1.117009, 0, 0, 0, 1, 120, 255, 1), -- 188359 (Area: 65)
+(@OGUID+34, 188359, 571, 1, 1, 2572.437, 893.8802, -58.98691, 1.466076, 0, 0, 0, 1, 120, 255, 1), -- 188359 (Area: 65)
+(@OGUID+35, 188359, 571, 1, 1, 2633.851, 982.8386, -46.50484, 0.2094394, 0, 0, 0, 1, 120, 255, 1), -- 188359 (Area: 65)
+(@OGUID+36, 188359, 571, 1, 1, 2676.746, 1013.403, -40.85683, 4.136433, 0, 0, 0, 1, 120, 255, 1), -- 188359 (Area: 65)
+(@OGUID+37, 188359, 571, 1, 1, 2520.906, 1052.955, -56.98813, 5.794494, 0, 0, 0, 1, 120, 255, 1), -- 188359 (Area: 65)
+(@OGUID+38, 188359, 571, 1, 1, 2533.467, 1092.911, -30.86761, 1.518436, 0, 0, 0, 1, 120, 255, 1), -- 188359 (Area: 65)
+(@OGUID+39, 188359, 571, 1, 1, 2599.236, 1126.641, -24.74891, 4.468043, 0, 0, 0, 1, 120, 255, 1), -- 188359 (Area: 65)
+(@OGUID+40, 188359, 571, 1, 1, 2633.851, 982.8386, -46.50484, 0.2094394, 0, 0, 0, 1, 120, 255, 1); -- 188359 (Area: 65)
diff --git a/src/server/authserver/Server/BattlenetBitStream.h b/src/server/authserver/Server/BattlenetBitStream.h
index c1c95236360..82c2a0a6d5d 100644
--- a/src/server/authserver/Server/BattlenetBitStream.h
+++ b/src/server/authserver/Server/BattlenetBitStream.h
@@ -59,16 +59,16 @@ namespace Battlenet
static uint32 const MaxSize = 0x4000;
// length : The maximum number of bytes to read
- BitStream(uint32 length) : _numBits(length * 8), _readPos(0), _writePos(0)
+ BitStream(uint32 length) : _writePos(length * 8), _readPos(0)
{
_buffer.resize(length, 0);
}
- BitStream(MessageBuffer&& buffer) : _buffer(buffer.Move()), _numBits(_buffer.size() * 8), _readPos(0), _writePos(0)
+ BitStream(MessageBuffer&& buffer) : _writePos(buffer.GetReadyDataSize() * 8), _readPos(0), _buffer(buffer.Move())
{
}
- BitStream() : _numBits(0), _readPos(0), _writePos(0)
+ BitStream() : _writePos(0), _readPos(0)
{
_buffer.reserve(0x1000);
}
@@ -91,8 +91,8 @@ namespace Battlenet
std::unique_ptr<uint8[]> ReadBytes(uint32 count)
{
AlignToNextByte();
- if (_readPos + count * 8 > _numBits)
- throw BitStreamPositionException(true, count * 8, _readPos, _numBits);
+ if (_readPos + count * 8 > _writePos)
+ throw BitStreamPositionException(true, count * 8, _readPos, _writePos);
std::unique_ptr<uint8[]> buf(new uint8[count]);
memcpy(buf.get(), &_buffer[_readPos >> 3], count);
@@ -125,8 +125,8 @@ namespace Battlenet
{
static_assert(std::is_integral<T>::value || std::is_enum<T>::value, "T must be an integer type");
- if (_readPos + bitCount >= _numBits)
- throw BitStreamPositionException(true, bitCount, _readPos, _numBits);
+ if (_readPos + bitCount >= _writePos)
+ throw BitStreamPositionException(true, bitCount, _readPos, _writePos);
uint64 ret = 0;
while (bitCount != 0)
@@ -214,26 +214,23 @@ namespace Battlenet
void SetReadPos(uint32 bits)
{
- if (bits >= _numBits)
- throw BitStreamPositionException(true, bits, 0, _numBits);
+ if (bits >= _writePos)
+ throw BitStreamPositionException(true, bits, 0, _writePos);
_readPos = bits;
}
- bool IsRead() const { return _readPos >= _numBits; }
+ bool IsRead() const { return _readPos >= _writePos; }
uint8* GetBuffer() { return _buffer.data(); }
uint8 const* GetBuffer() const { return _buffer.data(); }
- size_t GetSize() const { return _buffer.size(); }
-
- void FinishReading() { _readPos = _numBits; }
+ size_t GetSize() const { return ((_writePos + 7) & ~7) / 8; }
private:
- std::vector<uint8> _buffer;
- uint32 _numBits;
- uint32 _readPos;
uint32 _writePos;
+ uint32 _readPos;
+ std::vector<uint8> _buffer;
};
template<>
diff --git a/src/server/authserver/Server/BattlenetSession.cpp b/src/server/authserver/Server/BattlenetSession.cpp
index e345cd35200..9dc43d4bedb 100644
--- a/src/server/authserver/Server/BattlenetSession.cpp
+++ b/src/server/authserver/Server/BattlenetSession.cpp
@@ -554,12 +554,12 @@ void Battlenet::Session::ReadDataHandler()
if (header.Channel != AUTHENTICATION && !_authed)
{
- TC_LOG_DEBUG("server.battlenet", "Battlenet::Session::AsyncRead Received not allowed packet %s", header.ToString().c_str());
+ TC_LOG_DEBUG("server.battlenet", "Battlenet::Session::ReadDataHandler Received not allowed packet %s", header.ToString().c_str());
CloseSocket();
return;
}
- TC_LOG_TRACE("server.battlenet", "Battlenet::Session::AsyncRead %s", header.ToString().c_str());
+ TC_LOG_TRACE("server.battlenet", "Battlenet::Session::ReadDataHandler %s", header.ToString().c_str());
std::map<PacketHeader, PacketHandler>::const_iterator itr = Handlers.find(header);
if (itr != Handlers.end())
{
@@ -568,7 +568,7 @@ void Battlenet::Session::ReadDataHandler()
}
else
{
- TC_LOG_DEBUG("server.battlenet", "Battlenet::Session::AsyncRead Unhandled opcode %s", header.ToString().c_str());
+ TC_LOG_DEBUG("server.battlenet", "Battlenet::Session::ReadDataHandler Unhandled opcode %s", header.ToString().c_str());
break;
}
@@ -576,7 +576,7 @@ void Battlenet::Session::ReadDataHandler()
}
catch (BitStreamPositionException const& e)
{
- TC_LOG_ERROR("server.battlenet", "Battlenet::Session::AsyncRead Exception: %s", e.what());
+ TC_LOG_ERROR("server.battlenet", "Battlenet::Session::ReadDataHandler Exception: %s", e.what());
CloseSocket();
return;
}
diff --git a/src/server/game/AI/CreatureAISelector.cpp b/src/server/game/AI/CreatureAISelector.cpp
index afbd306c184..3643bccdb6f 100644
--- a/src/server/game/AI/CreatureAISelector.cpp
+++ b/src/server/game/AI/CreatureAISelector.cpp
@@ -68,7 +68,7 @@ namespace FactorySelector
else
ai_factory = ai_registry.GetRegistryItem("NullCreatureAI");
}
- else if (creature->GetCreatureType() == CREATURE_TYPE_CRITTER && !creature->HasUnitTypeMask(UNIT_MASK_GUARDIAN))
+ else if (creature->IsCritter() && !creature->HasUnitTypeMask(UNIT_MASK_GUARDIAN))
ai_factory = ai_registry.GetRegistryItem("CritterAI");
}
diff --git a/src/server/game/AI/SmartScripts/SmartScript.cpp b/src/server/game/AI/SmartScripts/SmartScript.cpp
index 8b83cae3d99..9dba0fe3bf9 100644
--- a/src/server/game/AI/SmartScripts/SmartScript.cpp
+++ b/src/server/game/AI/SmartScripts/SmartScript.cpp
@@ -3223,7 +3223,7 @@ void SmartScript::InitTimer(SmartScriptHolder& e)
void SmartScript::RecalcTimer(SmartScriptHolder& e, uint32 min, uint32 max)
{
// min/max was checked at loading!
- e.timer = urand(uint32(min), uint32(max));
+ e.timer = urand(min, max);
e.active = e.timer ? false : true;
}
diff --git a/src/server/game/Achievements/AchievementMgr.cpp b/src/server/game/Achievements/AchievementMgr.cpp
index 2bbdffc1e7b..06e19b6ebd1 100644
--- a/src/server/game/Achievements/AchievementMgr.cpp
+++ b/src/server/game/Achievements/AchievementMgr.cpp
@@ -3356,7 +3356,7 @@ void AchievementGlobalMgr::LoadRewardLocales()
AchievementRewardLocale& data = m_achievementRewardLocales[entry];
- for (int i = 1; i < TOTAL_LOCALES; ++i)
+ for (uint8 i = TOTAL_LOCALES - 1; i > 0; --i)
{
LocaleConstant locale = (LocaleConstant) i;
ObjectMgr::AddLocaleString(fields[1 + 2 * (i - 1)].GetString(), locale, data.subject);
@@ -3365,7 +3365,7 @@ void AchievementGlobalMgr::LoadRewardLocales()
}
while (result->NextRow());
- TC_LOG_INFO("server.loading", ">> Loaded %lu achievement reward locale strings in %u ms", (unsigned long)m_achievementRewardLocales.size(), GetMSTimeDiffToNow(oldMSTime));
+ TC_LOG_INFO("server.loading", ">> Loaded %u achievement reward locale strings in %u ms", uint32(m_achievementRewardLocales.size()), GetMSTimeDiffToNow(oldMSTime));
}
AchievementEntry const* AchievementGlobalMgr::GetAchievement(uint32 achievementId) const
diff --git a/src/server/game/Entities/Creature/Creature.cpp b/src/server/game/Entities/Creature/Creature.cpp
index 4a515d311d3..4690e4d174e 100644
--- a/src/server/game/Entities/Creature/Creature.cpp
+++ b/src/server/game/Entities/Creature/Creature.cpp
@@ -385,9 +385,9 @@ bool Creature::UpdateEntry(uint32 entry, CreatureData const* data /*= nullptr*/)
RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IN_COMBAT);
- SetAttackTime(BASE_ATTACK, cInfo->baseattacktime);
- SetAttackTime(OFF_ATTACK, cInfo->baseattacktime);
- SetAttackTime(RANGED_ATTACK, cInfo->rangeattacktime);
+ SetAttackTime(BASE_ATTACK, cInfo->BaseAttackTime);
+ SetAttackTime(OFF_ATTACK, cInfo->BaseAttackTime);
+ SetAttackTime(RANGED_ATTACK, cInfo->RangeAttackTime);
SelectLevel();
@@ -819,7 +819,7 @@ bool Creature::Create(uint32 guidlow, Map* map, uint32 /*phaseMask*/, uint32 ent
void Creature::InitializeReactState()
{
- if (IsTotem() || IsTrigger() || GetCreatureType() == CREATURE_TYPE_CRITTER || IsSpiritService())
+ if (IsTotem() || IsTrigger() || IsCritter() || IsSpiritService())
SetReactState(REACT_PASSIVE);
/*
else if (IsCivilian())
diff --git a/src/server/game/Entities/Creature/Creature.h b/src/server/game/Entities/Creature/Creature.h
index 64f7fca8ffa..0f4dda4c319 100644
--- a/src/server/game/Entities/Creature/Creature.h
+++ b/src/server/game/Entities/Creature/Creature.h
@@ -65,12 +65,12 @@ enum CreatureFlagsExtra
CREATURE_FLAG_EXTRA_NO_SKILLGAIN | CREATURE_FLAG_EXTRA_TAUNT_DIMINISH | CREATURE_FLAG_EXTRA_ALL_DIMINISH | \
CREATURE_FLAG_EXTRA_GUARD | CREATURE_FLAG_EXTRA_IGNORE_PATHFINDING)
-#define MAX_KILL_CREDIT 2
#define CREATURE_REGEN_INTERVAL 2 * IN_MILLISECONDS
+#define MAX_KILL_CREDIT 2
+#define MAX_CREATURE_MODELS 4
#define MAX_CREATURE_QUEST_ITEMS 6
-
-#define MAX_EQUIPMENT_ITEMS 3
+#define CREATURE_MAX_SPELLS 8
// from `creature_template` table
struct CreatureTemplate
@@ -97,13 +97,11 @@ struct CreatureTemplate
float speed_run;
float scale;
uint32 rank;
- float mindmg;
- float maxdmg;
uint32 dmgschool;
- uint32 attackpower;
- float dmg_multiplier;
- uint32 baseattacktime;
- uint32 rangeattacktime;
+ uint32 BaseAttackTime;
+ uint32 RangeAttackTime;
+ float BaseVariance;
+ float RangeVariance;
uint32 unit_class; // enum Classes. Note only 4 classes are known for creatures.
uint32 unit_flags; // enum UnitFlags mask values
uint32 unit_flags2; // enum UnitFlags2 mask values
@@ -112,9 +110,6 @@ struct CreatureTemplate
uint32 trainer_type;
uint32 trainer_class;
uint32 trainer_race;
- float minrangedmg;
- float maxrangedmg;
- uint32 rangedattackpower;
uint32 type; // enum CreatureType values
uint32 type_flags; // enum CreatureTypeFlags mask values
uint32 type_flags2; // unknown enum, only set for 4 creatures (with value 1)
@@ -135,6 +130,8 @@ struct CreatureTemplate
float ModMana;
float ModManaExtra; // Added in 4.x, this value is usually 2 for a small group of creatures with double mana
float ModArmor;
+ float ModDamage;
+ float ModExperience;
bool RacialLeader;
uint32 questItems[MAX_CREATURE_QUEST_ITEMS];
uint32 movementId;
@@ -242,6 +239,8 @@ struct PointOfInterestLocale
StringVector IconName;
};
+#define MAX_EQUIPMENT_ITEMS 3
+
struct EquipmentInfo
{
uint32 ItemEntry[MAX_EQUIPMENT_ITEMS];
diff --git a/src/server/game/Entities/Object/Object.h b/src/server/game/Entities/Object/Object.h
index 6c6d8c75f7d..108eb3ce0b7 100644
--- a/src/server/game/Entities/Object/Object.h
+++ b/src/server/game/Entities/Object/Object.h
@@ -885,14 +885,16 @@ namespace Trinity
class ObjectDistanceOrderPred
{
public:
- ObjectDistanceOrderPred(WorldObject const* pRefObj, bool ascending = true) : m_refObj(pRefObj), m_ascending(ascending) { }
- bool operator()(WorldObject const* pLeft, WorldObject const* pRight) const
+ ObjectDistanceOrderPred(WorldObject const* refObj, bool ascending = true) : _refObj(refObj), _ascending(ascending) { }
+
+ bool operator()(WorldObject const* left, WorldObject const* right) const
{
- return m_ascending ? m_refObj->GetDistanceOrder(pLeft, pRight) : !m_refObj->GetDistanceOrder(pLeft, pRight);
+ return _refObj->GetDistanceOrder(left, right) == _ascending;
}
+
private:
- WorldObject const* m_refObj;
- const bool m_ascending;
+ WorldObject const* _refObj;
+ bool _ascending;
};
}
diff --git a/src/server/game/Entities/Pet/Pet.cpp b/src/server/game/Entities/Pet/Pet.cpp
index 5c731c6f8f7..46c9e61886a 100644
--- a/src/server/game/Entities/Pet/Pet.cpp
+++ b/src/server/game/Entities/Pet/Pet.cpp
@@ -186,8 +186,7 @@ bool Pet::LoadPetFromDB(Player* owner, uint32 petEntry, uint32 petnumber, bool c
setFaction(owner->getFaction());
SetUInt32Value(UNIT_CREATED_BY_SPELL, summonSpellId);
- CreatureTemplate const* cinfo = GetCreatureTemplate();
- if (cinfo->type == CREATURE_TYPE_CRITTER)
+ if (IsCritter())
{
float px, py, pz;
owner->GetClosePoint(px, py, pz, GetObjectSize(), PET_FOLLOW_DIST, GetFollowAngle());
@@ -982,7 +981,7 @@ bool Guardian::InitStatsForLevel(uint8 petlevel)
SetCreateHealth(30*petlevel);
// wolf attack speed is 1.5s
- SetAttackTime(BASE_ATTACK, cinfo->baseattacktime);
+ SetAttackTime(BASE_ATTACK, cinfo->BaseAttackTime);
SetBaseWeaponDamage(BASE_ATTACK, MINDAMAGE, float((petlevel * 4 - petlevel)));
SetBaseWeaponDamage(BASE_ATTACK, MAXDAMAGE, float((petlevel * 4 + petlevel)));
diff --git a/src/server/game/Entities/Unit/StatSystem.cpp b/src/server/game/Entities/Unit/StatSystem.cpp
index 06179692845..6ef74785d16 100644
--- a/src/server/game/Entities/Unit/StatSystem.cpp
+++ b/src/server/game/Entities/Unit/StatSystem.cpp
@@ -901,17 +901,21 @@ void Creature::UpdateAttackPowerAndDamage(bool ranged)
void Creature::CalculateMinMaxDamage(WeaponAttackType attType, bool normalized, bool addTotalPct, float& minDamage, float& maxDamage)
{
+ float variance = 1.0f;
UnitMods unitMod;
switch (attType)
{
case BASE_ATTACK:
default:
+ variance = GetCreatureTemplate()->BaseVariance;
unitMod = UNIT_MOD_DAMAGE_MAINHAND;
break;
case OFF_ATTACK:
+ variance = GetCreatureTemplate()->BaseVariance;
unitMod = UNIT_MOD_DAMAGE_OFFHAND;
break;
case RANGED_ATTACK:
+ variance = GetCreatureTemplate()->RangeVariance;
unitMod = UNIT_MOD_DAMAGE_RANGED;
break;
}
@@ -934,11 +938,11 @@ void Creature::CalculateMinMaxDamage(WeaponAttackType attType, bool normalized,
float attackPower = GetTotalAttackPowerValue(attType);
float attackSpeedMulti = GetAPMultiplier(attType, normalized);
- float baseValue = GetModifierValue(unitMod, BASE_VALUE) + (attackPower / 14.0f);
+ float baseValue = GetModifierValue(unitMod, BASE_VALUE) + (attackPower / 14.0f) * variance;
float basePct = GetModifierValue(unitMod, BASE_PCT) * attackSpeedMulti;
float totalValue = GetModifierValue(unitMod, TOTAL_VALUE);
float totalPct = addTotalPct ? GetModifierValue(unitMod, TOTAL_PCT) : 1.0f;
- float dmgMultiplier = GetCreatureTemplate()->dmg_multiplier; // = dmg_multiplier * _GetDamageMod(rank);
+ float dmgMultiplier = GetCreatureTemplate()->ModDamage; // = ModDamage * _GetDamageMod(rank);
minDamage = ((weaponMinDamage + baseValue) * dmgMultiplier * basePct + totalValue) * totalPct;
maxDamage = ((weaponMaxDamage + baseValue) * dmgMultiplier * basePct + totalValue) * totalPct;
diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp
index 843cc937baa..9b4e7e5ac45 100644
--- a/src/server/game/Entities/Unit/Unit.cpp
+++ b/src/server/game/Entities/Unit/Unit.cpp
@@ -11133,6 +11133,10 @@ int32 Unit::ModSpellDuration(SpellInfo const* spellProto, Unit const* target, in
if (duration < 0)
return duration;
+ // some auras are not affected by duration modifiers
+ if (spellProto->AttributesEx7 & SPELL_ATTR7_IGNORE_DURATION_MODS)
+ return duration;
+
// cut duration only of negative effects
if (!positive)
{
@@ -13026,7 +13030,7 @@ Unit* Unit::SelectNearbyTarget(Unit* exclude, float dist) const
// remove not LoS targets
for (std::list<Unit*>::iterator tIter = targets.begin(); tIter != targets.end();)
{
- if (!IsWithinLOSInMap(*tIter) || (*tIter)->IsTotem() || (*tIter)->IsSpiritService() || (*tIter)->GetCreatureType() == CREATURE_TYPE_CRITTER)
+ if (!IsWithinLOSInMap(*tIter) || (*tIter)->IsTotem() || (*tIter)->IsSpiritService() || (*tIter)->IsCritter())
targets.erase(tIter++);
else
++tIter;
@@ -13679,7 +13683,7 @@ void Unit::Kill(Unit* victim, bool durabilityLoss)
if (Unit* owner = GetOwner())
owner->ProcDamageAndSpell(victim, PROC_FLAG_KILL, PROC_FLAG_NONE, PROC_EX_NONE, 0);
- if (victim->GetCreatureType() != CREATURE_TYPE_CRITTER)
+ if (!victim->IsCritter())
ProcDamageAndSpell(victim, PROC_FLAG_KILL, PROC_FLAG_KILLED, PROC_EX_NONE, 0);
// Proc auras on death - must be before aura/combat remove
diff --git a/src/server/game/Entities/Unit/Unit.h b/src/server/game/Entities/Unit/Unit.h
index d5e732989e0..d80b4697f48 100644
--- a/src/server/game/Entities/Unit/Unit.h
+++ b/src/server/game/Entities/Unit/Unit.h
@@ -266,7 +266,6 @@ enum UnitRename
UNIT_CAN_BE_ABANDONED = 0x02
};
-#define CREATURE_MAX_SPELLS 8
#define MAX_SPELL_CHARM 4
#define MAX_SPELL_VEHICLE 6
#define MAX_SPELL_POSSESS 8
@@ -1538,6 +1537,7 @@ class Unit : public WorldObject
bool IsArmorer() const { return HasFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_REPAIR); }
bool IsServiceProvider() const;
bool IsSpiritService() const { return HasFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_SPIRITHEALER | UNIT_NPC_FLAG_SPIRITGUIDE); }
+ bool IsCritter() const { return GetCreatureType() == CREATURE_TYPE_CRITTER; }
bool IsInFlight() const { return HasUnitState(UNIT_STATE_IN_FLIGHT); }
diff --git a/src/server/game/Globals/ObjectMgr.cpp b/src/server/game/Globals/ObjectMgr.cpp
index 93c06146c06..f16ab30567f 100644
--- a/src/server/game/Globals/ObjectMgr.cpp
+++ b/src/server/game/Globals/ObjectMgr.cpp
@@ -348,7 +348,7 @@ void ObjectMgr::LoadCreatureLocales()
CreatureLocale& data = _creatureLocaleStore[entry];
- for (uint8 i = 1; i < TOTAL_LOCALES; ++i)
+ for (uint8 i = TOTAL_LOCALES - 1; i > 0; --i)
{
LocaleConstant locale = (LocaleConstant) i;
AddLocaleString(fields[1 + 3 * (i - 1)].GetString(), locale, data.Name);
@@ -357,7 +357,7 @@ void ObjectMgr::LoadCreatureLocales()
}
} while (result->NextRow());
- TC_LOG_INFO("server.loading", ">> Loaded %lu creature locale strings in %u ms", (unsigned long)_creatureLocaleStore.size(), GetMSTimeDiffToNow(oldMSTime));
+ TC_LOG_INFO("server.loading", ">> Loaded %u creature locale strings in %u ms", uint32(_creatureLocaleStore.size()), GetMSTimeDiffToNow(oldMSTime));
}
void ObjectMgr::LoadGossipMenuItemsLocales()
@@ -385,7 +385,7 @@ void ObjectMgr::LoadGossipMenuItemsLocales()
GossipMenuItemsLocale& data = _gossipMenuItemsLocaleStore[MAKE_PAIR32(menuId, id)];
- for (uint8 i = 1; i < TOTAL_LOCALES; ++i)
+ for (uint8 i = TOTAL_LOCALES - 1; i > 0; --i)
{
LocaleConstant locale = (LocaleConstant) i;
AddLocaleString(fields[2 + 2 * (i - 1)].GetString(), locale, data.OptionText);
@@ -394,7 +394,7 @@ void ObjectMgr::LoadGossipMenuItemsLocales()
}
while (result->NextRow());
- TC_LOG_INFO("server.loading", ">> Loaded %lu gossip_menu_option locale strings in %u ms", (unsigned long)_gossipMenuItemsLocaleStore.size(), GetMSTimeDiffToNow(oldMSTime));
+ TC_LOG_INFO("server.loading", ">> Loaded %u gossip_menu_option locale strings in %u ms", uint32(_gossipMenuItemsLocaleStore.size()), GetMSTimeDiffToNow(oldMSTime));
}
void ObjectMgr::LoadPointOfInterestLocales()
@@ -416,34 +416,36 @@ void ObjectMgr::LoadPointOfInterestLocales()
PointOfInterestLocale& data = _pointOfInterestLocaleStore[entry];
- for (uint8 i = 1; i < TOTAL_LOCALES; ++i)
+ for (uint8 i = TOTAL_LOCALES - 1; i > 0; --i)
AddLocaleString(fields[i].GetString(), LocaleConstant(i), data.IconName);
} while (result->NextRow());
- TC_LOG_INFO("server.loading", ">> Loaded %lu points_of_interest locale strings in %u ms", (unsigned long)_pointOfInterestLocaleStore.size(), GetMSTimeDiffToNow(oldMSTime));
+ TC_LOG_INFO("server.loading", ">> Loaded %u points_of_interest locale strings in %u ms", uint32(_pointOfInterestLocaleStore.size()), GetMSTimeDiffToNow(oldMSTime));
}
void ObjectMgr::LoadCreatureTemplates()
{
uint32 oldMSTime = getMSTime();
- // 0 1 2 3 4 5 6 7 8
+ // 0 1 2 3 4 5 6 7 8
QueryResult result = WorldDatabase.Query("SELECT entry, difficulty_entry_1, difficulty_entry_2, difficulty_entry_3, KillCredit1, KillCredit2, modelid1, modelid2, modelid3, "
- // 9 10 11 12 13 14 15 16 17 18 19 20 21 22
+ // 9 10 11 12 13 14 15 16 17 18 19 20 21 22
"modelid4, name, femaleName, subname, IconName, gossip_menu_id, minlevel, maxlevel, exp, exp_unk, faction, npcflag, speed_walk, speed_run, "
- // 23 24 25 26 27 28 29 30 31 32 33 34
- "scale, rank, mindmg, maxdmg, dmgschool, attackpower, dmg_multiplier, baseattacktime, rangeattacktime, unit_class, unit_flags, unit_flags2, "
- // 35 36 37 38 39 40 41 42 43
- "dynamicflags, family, trainer_type, trainer_class, trainer_race, minrangedmg, maxrangedmg, rangedattackpower, type, "
- // 44 45 46 47 48 49 50 51 52 53 54
+ // 23 24 25 26 27 28 29 30 31 32
+ "scale, rank, dmgschool, BaseAttackTime, RangeAttackTime, BaseVariance, RangeVariance, unit_class, unit_flags, unit_flags2, "
+ // 33 34 35 36 37 38
+ "dynamicflags, family, trainer_type, trainer_class, trainer_race, type, "
+ // 39 40 41 42 43 44 45 46 47 48 49
"type_flags, type_flags2, lootid, pickpocketloot, skinloot, resistance1, resistance2, resistance3, resistance4, resistance5, resistance6, "
- // 55 56 57 58 59 60 61 62 63 64 65 66 67 68
+ // 50 51 52 53 54 55 56 57 58 59 60 61 62 63
"spell1, spell2, spell3, spell4, spell5, spell6, spell7, spell8, PetSpellDataId, VehicleId, mingold, maxgold, AIName, MovementType, "
- // 69 70 71 72 73 74 75 76 77 78 79 80
- "InhabitType, HoverHeight, Health_mod, Mana_mod, Mana_mod_extra, Armor_mod, RacialLeader, questItem1, questItem2, questItem3, questItem4, questItem5, "
- // 81 82 83 84 85 86
- " questItem6, movementId, RegenHealth, mechanic_immune_mask, flags_extra, ScriptName "
- "FROM creature_template;");
+ // 64 65 66 67 68 69 70 71
+ "InhabitType, HoverHeight, HealthModifier, ManaModifier, ManaModifierExtra, ArmorModifier, DamageModifier, ExperienceModifier, "
+ // 72 73 74 75 76 77 78
+ "RacialLeader, questItem1, questItem2, questItem3, questItem4, questItem5, questItem6, "
+ // 79 80 81 82 83
+ "movementId, RegenHealth, mechanic_immune_mask, flags_extra, ScriptName "
+ "FROM creature_template");
if (!result)
{
@@ -456,93 +458,7 @@ void ObjectMgr::LoadCreatureTemplates()
do
{
Field* fields = result->Fetch();
-
- uint32 entry = fields[0].GetUInt32();
-
-
- CreatureTemplate& creatureTemplate = _creatureTemplateStore[entry];
-
- creatureTemplate.Entry = entry;
-
- for (uint8 i = 0; i < MAX_DIFFICULTY - 1; ++i)
- creatureTemplate.DifficultyEntry[i] = fields[1 + i].GetUInt32();
-
- for (uint8 i = 0; i < MAX_KILL_CREDIT; ++i)
- creatureTemplate.KillCredit[i] = fields[4 + i].GetUInt32();
-
- creatureTemplate.Modelid1 = fields[6].GetUInt32();
- creatureTemplate.Modelid2 = fields[7].GetUInt32();
- creatureTemplate.Modelid3 = fields[8].GetUInt32();
- creatureTemplate.Modelid4 = fields[9].GetUInt32();
- creatureTemplate.Name = fields[10].GetString();
- creatureTemplate.FemaleName = fields[11].GetString();
- creatureTemplate.SubName = fields[12].GetString();
- creatureTemplate.IconName = fields[13].GetString();
- creatureTemplate.GossipMenuId = fields[14].GetUInt32();
- creatureTemplate.minlevel = fields[15].GetUInt8();
- creatureTemplate.maxlevel = fields[16].GetUInt8();
- creatureTemplate.expansion = uint32(fields[17].GetInt16());
- creatureTemplate.expansionUnknown = uint32(fields[18].GetUInt16());
- creatureTemplate.faction = uint32(fields[19].GetUInt16());
- creatureTemplate.npcflag = fields[20].GetUInt32();
- creatureTemplate.speed_walk = fields[21].GetFloat();
- creatureTemplate.speed_run = fields[22].GetFloat();
- creatureTemplate.scale = fields[23].GetFloat();
- creatureTemplate.rank = uint32(fields[24].GetUInt8());
- creatureTemplate.mindmg = fields[25].GetFloat();
- creatureTemplate.maxdmg = fields[26].GetFloat();
- creatureTemplate.dmgschool = uint32(fields[27].GetInt8());
- creatureTemplate.attackpower = fields[28].GetUInt32();
- creatureTemplate.dmg_multiplier = fields[29].GetFloat();
- creatureTemplate.baseattacktime = fields[30].GetUInt32();
- creatureTemplate.rangeattacktime = fields[31].GetUInt32();
- creatureTemplate.unit_class = uint32(fields[32].GetUInt8());
- creatureTemplate.unit_flags = fields[33].GetUInt32();
- creatureTemplate.unit_flags2 = fields[34].GetUInt32();
- creatureTemplate.dynamicflags = fields[35].GetUInt32();
- creatureTemplate.family = uint32(fields[36].GetUInt8());
- creatureTemplate.trainer_type = uint32(fields[37].GetUInt8());
- creatureTemplate.trainer_class = uint32(fields[38].GetUInt8());
- creatureTemplate.trainer_race = uint32(fields[39].GetUInt8());
- creatureTemplate.minrangedmg = fields[40].GetFloat();
- creatureTemplate.maxrangedmg = fields[41].GetFloat();
- creatureTemplate.rangedattackpower = uint32(fields[42].GetUInt16());
- creatureTemplate.type = uint32(fields[43].GetUInt8());
- creatureTemplate.type_flags = fields[44].GetUInt32();
- creatureTemplate.type_flags2 = fields[45].GetUInt32();
- creatureTemplate.lootid = fields[46].GetUInt32();
- creatureTemplate.pickpocketLootId = fields[47].GetUInt32();
- creatureTemplate.SkinLootId = fields[48].GetUInt32();
-
- for (uint8 i = SPELL_SCHOOL_HOLY; i < MAX_SPELL_SCHOOL; ++i)
- creatureTemplate.resistance[i] = fields[49 + i - 1].GetInt16();
-
- for (uint8 i = 0; i < CREATURE_MAX_SPELLS; ++i)
- creatureTemplate.spells[i] = fields[55 + i].GetUInt32();
-
- creatureTemplate.PetSpellDataId = fields[63].GetUInt32();
- creatureTemplate.VehicleId = fields[64].GetUInt32();
- creatureTemplate.mingold = fields[65].GetUInt32();
- creatureTemplate.maxgold = fields[66].GetUInt32();
- creatureTemplate.AIName = fields[67].GetString();
- creatureTemplate.MovementType = uint32(fields[68].GetUInt8());
- creatureTemplate.InhabitType = uint32(fields[69].GetUInt8());
- creatureTemplate.HoverHeight = fields[70].GetFloat();
- creatureTemplate.ModHealth = fields[71].GetFloat();
- creatureTemplate.ModMana = fields[72].GetFloat();
- creatureTemplate.ModManaExtra = fields[73].GetFloat();
- creatureTemplate.ModArmor = fields[74].GetFloat();
- creatureTemplate.RacialLeader = fields[75].GetBool();
-
- for (uint8 i = 0; i < MAX_CREATURE_QUEST_ITEMS; ++i)
- creatureTemplate.questItems[i] = fields[76 + i].GetUInt32();
-
- creatureTemplate.movementId = fields[82].GetUInt32();
- creatureTemplate.RegenHealth = fields[83].GetBool();
- creatureTemplate.MechanicImmuneMask = fields[84].GetUInt32();
- creatureTemplate.flags_extra = fields[85].GetUInt32();
- creatureTemplate.ScriptID = GetScriptId(fields[86].GetCString());
-
+ LoadCreatureTemplate(fields);
++count;
}
while (result->NextRow());
@@ -554,6 +470,91 @@ void ObjectMgr::LoadCreatureTemplates()
TC_LOG_INFO("server.loading", ">> Loaded %u creature definitions in %u ms", count, GetMSTimeDiffToNow(oldMSTime));
}
+void ObjectMgr::LoadCreatureTemplate(Field* fields)
+{
+ uint32 entry = fields[0].GetUInt32();
+
+ CreatureTemplate& creatureTemplate = _creatureTemplateStore[entry];
+
+ creatureTemplate.Entry = entry;
+
+ for (uint8 i = 0; i < MAX_DIFFICULTY - 1; ++i)
+ creatureTemplate.DifficultyEntry[i] = fields[1 + i].GetUInt32();
+
+ for (uint8 i = 0; i < MAX_KILL_CREDIT; ++i)
+ creatureTemplate.KillCredit[i] = fields[4 + i].GetUInt32();
+
+ creatureTemplate.Modelid1 = fields[6].GetUInt32();
+ creatureTemplate.Modelid2 = fields[7].GetUInt32();
+ creatureTemplate.Modelid3 = fields[8].GetUInt32();
+ creatureTemplate.Modelid4 = fields[9].GetUInt32();
+ creatureTemplate.Name = fields[10].GetString();
+ creatureTemplate.FemaleName = fields[11].GetString();
+ creatureTemplate.SubName = fields[12].GetString();
+ creatureTemplate.IconName = fields[13].GetString();
+ creatureTemplate.GossipMenuId = fields[14].GetUInt32();
+ creatureTemplate.minlevel = fields[15].GetUInt8();
+ creatureTemplate.maxlevel = fields[16].GetUInt8();
+ creatureTemplate.expansion = uint32(fields[17].GetInt16());
+ creatureTemplate.expansionUnknown = uint32(fields[18].GetUInt16());
+ creatureTemplate.faction = uint32(fields[19].GetUInt16());
+ creatureTemplate.npcflag = fields[20].GetUInt32();
+ creatureTemplate.speed_walk = fields[21].GetFloat();
+ creatureTemplate.speed_run = fields[22].GetFloat();
+ creatureTemplate.scale = fields[23].GetFloat();
+ creatureTemplate.rank = uint32(fields[24].GetUInt8());
+ creatureTemplate.dmgschool = uint32(fields[25].GetInt8());
+ creatureTemplate.BaseAttackTime = fields[26].GetUInt32();
+ creatureTemplate.RangeAttackTime = fields[27].GetUInt32();
+ creatureTemplate.BaseVariance = fields[28].GetFloat();
+ creatureTemplate.RangeVariance = fields[29].GetFloat();
+ creatureTemplate.unit_class = uint32(fields[30].GetUInt8());
+ creatureTemplate.unit_flags = fields[31].GetUInt32();
+ creatureTemplate.unit_flags2 = fields[32].GetUInt32();
+ creatureTemplate.dynamicflags = fields[33].GetUInt32();
+ creatureTemplate.family = uint32(fields[34].GetUInt8());
+ creatureTemplate.trainer_type = uint32(fields[35].GetUInt8());
+ creatureTemplate.trainer_class = uint32(fields[36].GetUInt8());
+ creatureTemplate.trainer_race = uint32(fields[37].GetUInt8());
+ creatureTemplate.type = uint32(fields[38].GetUInt8());
+ creatureTemplate.type_flags = fields[39].GetUInt32();
+ creatureTemplate.type_flags2 = fields[40].GetUInt32();
+ creatureTemplate.lootid = fields[41].GetUInt32();
+ creatureTemplate.pickpocketLootId = fields[42].GetUInt32();
+ creatureTemplate.SkinLootId = fields[43].GetUInt32();
+
+ for (uint8 i = SPELL_SCHOOL_HOLY; i < MAX_SPELL_SCHOOL; ++i)
+ creatureTemplate.resistance[i] = fields[44 + i - 1].GetInt16();
+
+ for (uint8 i = 0; i < CREATURE_MAX_SPELLS; ++i)
+ creatureTemplate.spells[i] = fields[50 + i].GetUInt32();
+
+ creatureTemplate.PetSpellDataId = fields[58].GetUInt32();
+ creatureTemplate.VehicleId = fields[59].GetUInt32();
+ creatureTemplate.mingold = fields[60].GetUInt32();
+ creatureTemplate.maxgold = fields[61].GetUInt32();
+ creatureTemplate.AIName = fields[62].GetString();
+ creatureTemplate.MovementType = uint32(fields[63].GetUInt8());
+ creatureTemplate.InhabitType = uint32(fields[64].GetUInt8());
+ creatureTemplate.HoverHeight = fields[65].GetFloat();
+ creatureTemplate.ModHealth = fields[66].GetFloat();
+ creatureTemplate.ModMana = fields[67].GetFloat();
+ creatureTemplate.ModManaExtra = fields[68].GetFloat();
+ creatureTemplate.ModArmor = fields[69].GetFloat();
+ creatureTemplate.ModDamage = fields[70].GetFloat();
+ creatureTemplate.ModExperience = fields[71].GetFloat();
+ creatureTemplate.RacialLeader = fields[72].GetBool();
+
+ for (uint8 i = 0; i < MAX_CREATURE_QUEST_ITEMS; ++i)
+ creatureTemplate.questItems[i] = fields[73 + i].GetUInt32();
+
+ creatureTemplate.movementId = fields[79].GetUInt32();
+ creatureTemplate.RegenHealth = fields[80].GetBool();
+ creatureTemplate.MechanicImmuneMask = fields[81].GetUInt32();
+ creatureTemplate.flags_extra = fields[82].GetUInt32();
+ creatureTemplate.ScriptID = GetScriptId(fields[83].GetCString());
+}
+
void ObjectMgr::LoadCreatureTemplateAddons()
{
uint32 oldMSTime = getMSTime();
@@ -887,11 +888,11 @@ void ObjectMgr::CheckCreatureTemplate(CreatureTemplate const* cInfo)
const_cast<CreatureTemplate*>(cInfo)->dmgschool = SPELL_SCHOOL_NORMAL;
}
- if (cInfo->baseattacktime == 0)
- const_cast<CreatureTemplate*>(cInfo)->baseattacktime = BASE_ATTACK_TIME;
+ if (cInfo->BaseAttackTime == 0)
+ const_cast<CreatureTemplate*>(cInfo)->BaseAttackTime = BASE_ATTACK_TIME;
- if (cInfo->rangeattacktime == 0)
- const_cast<CreatureTemplate*>(cInfo)->rangeattacktime = BASE_ATTACK_TIME;
+ if (cInfo->RangeAttackTime == 0)
+ const_cast<CreatureTemplate*>(cInfo)->RangeAttackTime = BASE_ATTACK_TIME;
if ((cInfo->npcflag & UNIT_NPC_FLAG_TRAINER) && cInfo->trainer_type >= MAX_TRAINER_TYPE)
TC_LOG_ERROR("sql.sql", "Creature (Entry: %u) has wrong trainer type %u.", cInfo->Entry, cInfo->trainer_type);
@@ -992,7 +993,7 @@ void ObjectMgr::CheckCreatureTemplate(CreatureTemplate const* cInfo)
const_cast<CreatureTemplate*>(cInfo)->flags_extra &= CREATURE_FLAG_EXTRA_DB_ALLOWED;
}
- const_cast<CreatureTemplate*>(cInfo)->dmg_multiplier *= Creature::_GetDamageMod(cInfo->rank);
+ const_cast<CreatureTemplate*>(cInfo)->ModDamage *= Creature::_GetDamageMod(cInfo->rank);
}
void ObjectMgr::LoadCreatureAddons()
@@ -2252,7 +2253,7 @@ void ObjectMgr::LoadItemLocales()
ItemLocale& data = _itemLocaleStore[entry];
- for (uint8 i = 1; i < TOTAL_LOCALES; ++i)
+ for (uint8 i = TOTAL_LOCALES - 1; i > 0; --i)
{
LocaleConstant locale = (LocaleConstant) i;
AddLocaleString(fields[1 + 2 * (i - 1)].GetString(), locale, data.Name);
@@ -2260,7 +2261,7 @@ void ObjectMgr::LoadItemLocales()
}
} while (result->NextRow());
- TC_LOG_INFO("server.loading", ">> Loaded %lu Item locale strings in %u ms", (unsigned long)_itemLocaleStore.size(), GetMSTimeDiffToNow(oldMSTime));
+ TC_LOG_INFO("server.loading", ">> Loaded %u Item locale strings in %u ms", uint32(_itemLocaleStore.size()), GetMSTimeDiffToNow(oldMSTime));
}
void FillItemDamageFields(float* minDamage, float* maxDamage, float* dps, uint32 itemLevel, uint32 itemClass, uint32 itemSubClass, uint32 quality, uint32 delay, float statScalingFactor, uint32 inventoryType, uint32 flags2)
@@ -4569,7 +4570,7 @@ void ObjectMgr::LoadQuestLocales()
QuestLocale& data = _questLocaleStore[entry];
- for (uint8 i = 1; i < TOTAL_LOCALES; ++i)
+ for (uint8 i = TOTAL_LOCALES - 1; i > 0; --i)
{
LocaleConstant locale = (LocaleConstant) i;
@@ -4591,7 +4592,7 @@ void ObjectMgr::LoadQuestLocales()
}
} while (result->NextRow());
- TC_LOG_INFO("server.loading", ">> Loaded %lu Quest locale strings in %u ms", (unsigned long)_questLocaleStore.size(), GetMSTimeDiffToNow(oldMSTime));
+ TC_LOG_INFO("server.loading", ">> Loaded %u Quest locale strings in %u ms", uint32(_questLocaleStore.size()), GetMSTimeDiffToNow(oldMSTime));
}
void ObjectMgr::LoadScripts(ScriptsType type)
@@ -5202,11 +5203,11 @@ void ObjectMgr::LoadPageTextLocales()
PageTextLocale& data = _pageTextLocaleStore[entry];
- for (uint8 i = 1; i < TOTAL_LOCALES; ++i)
+ for (uint8 i = TOTAL_LOCALES - 1; i > 0; --i)
AddLocaleString(fields[i].GetString(), LocaleConstant(i), data.Text);
} while (result->NextRow());
- TC_LOG_INFO("server.loading", ">> Loaded %lu PageText locale strings in %u ms", (unsigned long)_pageTextLocaleStore.size(), GetMSTimeDiffToNow(oldMSTime));
+ TC_LOG_INFO("server.loading", ">> Loaded %u PageText locale strings in %u ms", uint32(_pageTextLocaleStore.size()), GetMSTimeDiffToNow(oldMSTime));
}
void ObjectMgr::LoadInstanceTemplate()
@@ -5465,10 +5466,10 @@ void ObjectMgr::LoadNpcTextLocales()
NpcTextLocale& data = _npcTextLocaleStore[entry];
- for (uint8 i = 1; i < TOTAL_LOCALES; ++i)
+ for (uint8 i = TOTAL_LOCALES - 1; i > 0; --i)
{
LocaleConstant locale = (LocaleConstant) i;
- for (uint8 j = 0; j < MAX_LOCALES; ++j)
+ for (uint8 j = 0; j < MAX_GOSSIP_TEXT_OPTIONS; ++j)
{
AddLocaleString(fields[1 + 8 * 2 * (i - 1) + 2 * j].GetString(), locale, data.Text_0[j]);
AddLocaleString(fields[1 + 8 * 2 * (i - 1) + 2 * j + 1].GetString(), locale, data.Text_1[j]);
@@ -5476,7 +5477,7 @@ void ObjectMgr::LoadNpcTextLocales()
}
} while (result->NextRow());
- TC_LOG_INFO("server.loading", ">> Loaded %lu NpcText locale strings in %u ms", (unsigned long)_npcTextLocaleStore.size(), GetMSTimeDiffToNow(oldMSTime));
+ TC_LOG_INFO("server.loading", ">> Loaded %u NpcText locale strings in %u ms", uint32(_npcTextLocaleStore.size()), GetMSTimeDiffToNow(oldMSTime));
}
//not very fast function but it is called only once a day, or on starting-up
@@ -6507,14 +6508,14 @@ void ObjectMgr::LoadGameObjectLocales()
GameObjectLocale& data = _gameObjectLocaleStore[entry];
- for (uint8 i = 1; i < TOTAL_LOCALES; ++i)
+ for (uint8 i = TOTAL_LOCALES - 1; i > 0; --i)
+ {
AddLocaleString(fields[i].GetString(), LocaleConstant(i), data.Name);
-
- for (uint8 i = 1; i < TOTAL_LOCALES; ++i)
AddLocaleString(fields[i + (TOTAL_LOCALES - 1)].GetString(), LocaleConstant(i), data.CastBarCaption);
+ }
} while (result->NextRow());
- TC_LOG_INFO("server.loading", ">> Loaded %lu gameobject locale strings in %u ms", (unsigned long)_gameObjectLocaleStore.size(), GetMSTimeDiffToNow(oldMSTime));
+ TC_LOG_INFO("server.loading", ">> Loaded %u gameobject locale strings in %u ms", uint32(_gameObjectLocaleStore.size()), GetMSTimeDiffToNow(oldMSTime));
}
inline void CheckGOLockId(GameObjectTemplate const* goInfo, uint32 dataN, uint32 N)
@@ -7850,7 +7851,7 @@ bool ObjectMgr::LoadTrinityStrings(const char* table, int32 min_value, int32 max
data.Content.resize(1);
++count;
- for (uint8 i = 0; i < TOTAL_LOCALES; ++i)
+ for (int8 i = TOTAL_LOCALES - 1; i >= 0; --i)
AddLocaleString(fields[i + 1].GetString(), LocaleConstant(i), data.Content);
} while (result->NextRow());
@@ -8887,11 +8888,11 @@ void ObjectMgr::LoadBroadcastTextLocales()
continue;
}
- for (uint8 i = 1; i < TOTAL_LOCALES; ++i)
+ for (uint8 i = TOTAL_LOCALES - 1; i > 0; --i)
{
LocaleConstant locale = LocaleConstant(i);
- ObjectMgr::AddLocaleString(fields[1 + (i - 1)].GetString(), locale, bct->second.MaleText);
- ObjectMgr::AddLocaleString(fields[9 + (i - 1)].GetString(), locale, bct->second.FemaleText);
+ AddLocaleString(fields[1 + (i - 1)].GetString(), locale, bct->second.MaleText);
+ AddLocaleString(fields[9 + (i - 1)].GetString(), locale, bct->second.FemaleText);
}
++count;
diff --git a/src/server/game/Globals/ObjectMgr.h b/src/server/game/Globals/ObjectMgr.h
index 45671f016c8..f9f5269e485 100644
--- a/src/server/game/Globals/ObjectMgr.h
+++ b/src/server/game/Globals/ObjectMgr.h
@@ -984,6 +984,7 @@ class ObjectMgr
void LoadGraveyardOrientations();
void LoadCreatureTemplates();
void LoadCreatureTemplateAddons();
+ void LoadCreatureTemplate(Field* fields);
void CheckCreatureTemplate(CreatureTemplate const* cInfo);
void LoadTempSummons();
void LoadCreatures();
diff --git a/src/server/game/Handlers/NPCHandler.h b/src/server/game/Handlers/NPCHandler.h
index 7210d9a53b5..855536c7d9e 100644
--- a/src/server/game/Handlers/NPCHandler.h
+++ b/src/server/game/Handlers/NPCHandler.h
@@ -51,10 +51,10 @@ struct PageTextLocale
struct NpcTextLocale
{
- NpcTextLocale() { Text_0.resize(8); Text_1.resize(8); }
+ NpcTextLocale() { }
- std::vector<StringVector> Text_0;
- std::vector<StringVector> Text_1;
+ StringVector Text_0[MAX_GOSSIP_TEXT_OPTIONS];
+ StringVector Text_1[MAX_GOSSIP_TEXT_OPTIONS];
};
#endif
diff --git a/src/server/game/Miscellaneous/Formulas.h b/src/server/game/Miscellaneous/Formulas.h
index 924320ac198..537fa7543f7 100644
--- a/src/server/game/Miscellaneous/Formulas.h
+++ b/src/server/game/Miscellaneous/Formulas.h
@@ -163,27 +163,32 @@ namespace Trinity
inline uint32 Gain(Player* player, Unit* u)
{
- uint32 gain;
+ Creature* creature = u->ToCreature();
+ uint32 gain = 0;
- if (u->GetTypeId() == TYPEID_UNIT &&
- (((Creature*)u)->IsTotem() || ((Creature*)u)->IsPet() ||
- (((Creature*)u)->GetCreatureTemplate()->flags_extra & CREATURE_FLAG_EXTRA_NO_XP_AT_KILL) ||
- ((Creature*)u)->GetCreatureTemplate()->type == CREATURE_TYPE_CRITTER))
- gain = 0;
- else
+ if (!creature || (!creature->IsTotem() && !creature->IsPet() && !creature->IsCritter() &&
+ !(creature->GetCreatureTemplate()->flags_extra & CREATURE_FLAG_EXTRA_NO_XP_AT_KILL)))
{
+ float xpMod = 1.0f;
+
gain = BaseGain(player->getLevel(), u->getLevel(), GetContentLevelsForMapAndZone(u->GetMapId(), u->GetZoneId()));
- if (gain != 0 && u->GetTypeId() == TYPEID_UNIT && ((Creature*)u)->isElite())
+ if (gain && creature)
{
- // Elites in instances have a 2.75x XP bonus instead of the regular 2x world bonus.
- if (u->GetMap() && u->GetMap()->IsDungeon())
- gain = uint32(gain * 2.75);
- else
- gain *= 2;
+ if (creature->isElite())
+ {
+ // Elites in instances have a 2.75x XP bonus instead of the regular 2x world bonus.
+ if (u->GetMap() && u->GetMap()->IsDungeon())
+ xpMod *= 2.75f;
+ else
+ xpMod *= 2.0f;
+ }
+
+ xpMod *= creature->GetCreatureTemplate()->ModExperience;
}
- gain = uint32(gain * sWorld->getRate(RATE_XP_KILL));
+ xpMod *= sWorld->getRate(RATE_XP_KILL);
+ gain = uint32(gain * xpMod);
}
sScriptMgr->OnGainCalculation(gain, player, u);
diff --git a/src/server/game/Miscellaneous/SharedDefines.h b/src/server/game/Miscellaneous/SharedDefines.h
index da48d749cab..6e90412a3b6 100644
--- a/src/server/game/Miscellaneous/SharedDefines.h
+++ b/src/server/game/Miscellaneous/SharedDefines.h
@@ -538,7 +538,7 @@ enum SpellAttr6
enum SpellAttr7
{
SPELL_ATTR7_UNK0 = 0x00000001, // 0 Shaman's new spells (Call of the ...), Feign Death.
- SPELL_ATTR7_UNK1 = 0x00000002, // 1 Not set in 3.2.2a.
+ SPELL_ATTR7_IGNORE_DURATION_MODS = 0x00000002, // 1 Duration is not affected by duration modifiers
SPELL_ATTR7_REACTIVATE_AT_RESURRECT = 0x00000004, // 2 Paladin's auras and 65607 only.
SPELL_ATTR7_IS_CHEAT_SPELL = 0x00000008, // 3 Cannot cast if caster doesn't have UnitFlag2 & UNIT_FLAG2_ALLOW_CHEAT_SPELLS
SPELL_ATTR7_UNK4 = 0x00000010, // 4 Only 47883 (Soulstone Resurrection) and test spell.
diff --git a/src/server/game/Scripting/ScriptLoader.cpp b/src/server/game/Scripting/ScriptLoader.cpp
index 29107a72a9e..9bdf591103d 100644
--- a/src/server/game/Scripting/ScriptLoader.cpp
+++ b/src/server/game/Scripting/ScriptLoader.cpp
@@ -266,7 +266,6 @@ void AddSC_blasted_lands();
void AddSC_burning_steppes();
void AddSC_duskwood();
void AddSC_eastern_plaguelands();
-void AddSC_eversong_woods();
void AddSC_ghostlands();
void AddSC_hinterlands();
void AddSC_isle_of_queldanas();
diff --git a/src/server/game/Server/WorldPacket.h b/src/server/game/Server/WorldPacket.h
index bdacefabbeb..b047b20bce2 100644
--- a/src/server/game/Server/WorldPacket.h
+++ b/src/server/game/Server/WorldPacket.h
@@ -65,7 +65,7 @@ class WorldPacket : public ByteBuffer
Opcodes GetOpcode() const { return m_opcode; }
void SetOpcode(Opcodes opcode) { m_opcode = opcode; }
- bool IsCompressed() const { return m_opcode & COMPRESSED_OPCODE_MASK; }
+ bool IsCompressed() const { return (m_opcode & COMPRESSED_OPCODE_MASK) != 0; }
void Compress(z_stream_s* compressionStream);
void Compress(z_stream_s* compressionStream, WorldPacket const* source);
diff --git a/src/server/game/Server/WorldSession.h b/src/server/game/Server/WorldSession.h
index 227be6ec45b..f7269ae977c 100644
--- a/src/server/game/Server/WorldSession.h
+++ b/src/server/game/Server/WorldSession.h
@@ -380,17 +380,22 @@ class WorldSession
void SetLatency(uint32 latency) { m_latency = latency; }
void ResetClientTimeDelay() { m_clientTimeDelay = 0; }
- std::atomic<time_t> m_timeOutTime;
+ std::atomic<int32> m_timeOutTime;
void UpdateTimeOutTime(uint32 diff)
{
- if (time_t(diff) > m_timeOutTime)
- m_timeOutTime = 0;
- else
- m_timeOutTime -= diff;
+ m_timeOutTime -= int32(diff);
+ }
+
+ void ResetTimeOutTime()
+ {
+ m_timeOutTime = int32(sWorld->getIntConfig(CONFIG_SOCKET_TIMEOUTTIME));
+ }
+
+ bool IsConnectionIdle() const
+ {
+ return m_timeOutTime <= 0 && !m_inQueue;
}
- void ResetTimeOutTime() { m_timeOutTime = sWorld->getIntConfig(CONFIG_SOCKET_TIMEOUTTIME); }
- bool IsConnectionIdle() const { return (m_timeOutTime <= 0 && !m_inQueue); }
// Recruit-A-Friend Handling
uint32 GetRecruiterId() const { return recruiterId; }
diff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp
index df754440c40..e75ef03d392 100644
--- a/src/server/game/Spells/Spell.cpp
+++ b/src/server/game/Spells/Spell.cpp
@@ -5151,7 +5151,7 @@ SpellCastResult Spell::CheckCast(bool strict)
return SPELL_FAILED_TARGET_UNSKINNABLE;
Creature* creature = m_targets.GetUnitTarget()->ToCreature();
- if (creature->GetCreatureType() != CREATURE_TYPE_CRITTER && !creature->loot.isLooted())
+ if (!creature->IsCritter() && !creature->loot.isLooted())
return SPELL_FAILED_TARGET_NOT_LOOTED;
uint32 skill = creature->GetCreatureTemplate()->GetRequiredLootSkill();
diff --git a/src/server/game/Texts/CreatureTextMgr.cpp b/src/server/game/Texts/CreatureTextMgr.cpp
index 3fbbd34777b..9e05e4874bc 100644
--- a/src/server/game/Texts/CreatureTextMgr.cpp
+++ b/src/server/game/Texts/CreatureTextMgr.cpp
@@ -180,7 +180,7 @@ void CreatureTextMgr::LoadCreatureTextLocales()
{
Field* fields = result->Fetch();
CreatureTextLocale& loc = mLocaleTextMap[CreatureTextId(fields[0].GetUInt32(), uint32(fields[1].GetUInt8()), uint32(fields[2].GetUInt8()))];
- for (uint8 i = 1; i < TOTAL_LOCALES; ++i)
+ for (uint8 i = TOTAL_LOCALES - 1; i > 0; --i)
{
LocaleConstant locale = LocaleConstant(i);
ObjectMgr::AddLocaleString(fields[3 + i - 1].GetString(), locale, loc.Text);
diff --git a/src/server/scripts/Commands/cs_ban.cpp b/src/server/scripts/Commands/cs_ban.cpp
index 2f74132fe21..121da6489a3 100644
--- a/src/server/scripts/Commands/cs_ban.cpp
+++ b/src/server/scripts/Commands/cs_ban.cpp
@@ -109,21 +109,23 @@ public:
return false;
}
- switch (sWorld->BanCharacter(name, durationStr, reasonStr, handler->GetSession() ? handler->GetSession()->GetPlayerName().c_str() : ""))
+ std::string author = handler->GetSession() ? handler->GetSession()->GetPlayerName() : "Server";
+
+ switch (sWorld->BanCharacter(name, durationStr, reasonStr, author))
{
case BAN_SUCCESS:
{
if (atoi(durationStr) > 0)
{
if (sWorld->getBoolConfig(CONFIG_SHOW_BAN_IN_WORLD))
- sWorld->SendWorldText(LANG_BAN_CHARACTER_YOUBANNEDMESSAGE_WORLD, (handler->GetSession() ? handler->GetSession()->GetPlayerName().c_str() : "Server"), name.c_str(), secsToTimeString(TimeStringToSecs(durationStr), true).c_str(), reasonStr);
+ sWorld->SendWorldText(LANG_BAN_CHARACTER_YOUBANNEDMESSAGE_WORLD, author.c_str(), name.c_str(), secsToTimeString(TimeStringToSecs(durationStr), true).c_str(), reasonStr);
else
handler->PSendSysMessage(LANG_BAN_YOUBANNED, name.c_str(), secsToTimeString(TimeStringToSecs(durationStr), true).c_str(), reasonStr);
}
else
{
if (sWorld->getBoolConfig(CONFIG_SHOW_BAN_IN_WORLD))
- sWorld->SendWorldText(LANG_BAN_CHARACTER_YOUPERMBANNEDMESSAGE_WORLD, (handler->GetSession() ? handler->GetSession()->GetPlayerName().c_str() : "Server"), name.c_str(), reasonStr);
+ sWorld->SendWorldText(LANG_BAN_CHARACTER_YOUPERMBANNEDMESSAGE_WORLD, author.c_str(), name.c_str(), reasonStr);
else
handler->PSendSysMessage(LANG_BAN_YOUPERMBANNED, name.c_str(), reasonStr);
}
@@ -195,20 +197,22 @@ public:
break;
}
- switch (sWorld->BanAccount(mode, nameOrIP, durationStr, reasonStr, handler->GetSession() ? handler->GetSession()->GetPlayerName().c_str() : ""))
+ std::string author = handler->GetSession() ? handler->GetSession()->GetPlayerName() : "Server";
+
+ switch (sWorld->BanAccount(mode, nameOrIP, durationStr, reasonStr, author))
{
case BAN_SUCCESS:
if (atoi(durationStr) > 0)
{
if (sWorld->getBoolConfig(CONFIG_SHOW_BAN_IN_WORLD))
- sWorld->SendWorldText(LANG_BAN_ACCOUNT_YOUBANNEDMESSAGE_WORLD, (handler->GetSession() ? handler->GetSession()->GetPlayerName().c_str() : "Server"), nameOrIP.c_str(), secsToTimeString(TimeStringToSecs(durationStr), true).c_str(), reasonStr);
+ sWorld->SendWorldText(LANG_BAN_ACCOUNT_YOUBANNEDMESSAGE_WORLD, author.c_str(), nameOrIP.c_str(), secsToTimeString(TimeStringToSecs(durationStr), true).c_str(), reasonStr);
else
handler->PSendSysMessage(LANG_BAN_YOUBANNED, nameOrIP.c_str(), secsToTimeString(TimeStringToSecs(durationStr), true).c_str(), reasonStr);
}
else
{
if (sWorld->getBoolConfig(CONFIG_SHOW_BAN_IN_WORLD))
- sWorld->SendWorldText(LANG_BAN_ACCOUNT_YOUPERMBANNEDMESSAGE_WORLD, (handler->GetSession() ? handler->GetSession()->GetPlayerName().c_str() : "Server"), nameOrIP.c_str(), reasonStr);
+ sWorld->SendWorldText(LANG_BAN_ACCOUNT_YOUPERMBANNEDMESSAGE_WORLD, author.c_str(), nameOrIP.c_str(), reasonStr);
else
handler->PSendSysMessage(LANG_BAN_YOUPERMBANNED, nameOrIP.c_str(), reasonStr);
}
diff --git a/src/server/scripts/Commands/cs_misc.cpp b/src/server/scripts/Commands/cs_misc.cpp
index 9d763cb8d71..2afdff94a0b 100644
--- a/src/server/scripts/Commands/cs_misc.cpp
+++ b/src/server/scripts/Commands/cs_misc.cpp
@@ -1610,16 +1610,7 @@ public:
banReason = fields[3].GetString();
}
- // Can be used to query data from World database
- stmt2 = WorldDatabase.GetPreparedStatement(WORLD_SEL_REQ_XP);
- stmt2->setUInt8(0, level);
- PreparedQueryResult result3 = WorldDatabase.Query(stmt2);
- if (result3)
- {
- Field* fields = result3->Fetch();
- xptotal = fields[0].GetUInt32();
- }
// Can be used to query data from Characters database
stmt2 = CharacterDatabase.GetPreparedStatement(CHAR_SEL_PINFO_XP);
@@ -1631,6 +1622,7 @@ public:
Field* fields = result4->Fetch();
xp = fields[0].GetUInt32(); // Used for "current xp" output and "%u XP Left" calculation
uint32 gguid = fields[1].GetUInt32(); // We check if have a guild for the person, so we might not require to query it at all
+ xptotal = sObjectMgr->GetXPForLevel(level);
if (gguid != 0)
{
@@ -1767,10 +1759,10 @@ public:
Player* player = handler->GetSession()->GetPlayer();
// accept only explicitly selected target (not implicitly self targeting case)
- Unit* target = handler->getSelectedUnit();
- if (player->GetTarget() && target)
+ Creature* target = player->GetTarget() ? handler->getSelectedCreature() : nullptr;
+ if (target)
{
- if (target->GetTypeId() != TYPEID_UNIT || target->IsPet())
+ if (target->IsPet())
{
handler->SendSysMessage(LANG_SELECT_CREATURE);
handler->SetSentErrorMessage(true);
@@ -1778,19 +1770,13 @@ public:
}
if (target->isDead())
- target->ToCreature()->Respawn();
+ target->Respawn();
return true;
}
- CellCoord p(Trinity::ComputeCellCoord(player->GetPositionX(), player->GetPositionY()));
- Cell cell(p);
- cell.SetNoCreate();
-
Trinity::RespawnDo u_do;
Trinity::WorldObjectWorker<Trinity::RespawnDo> worker(player, u_do);
-
- TypeContainerVisitor<Trinity::WorldObjectWorker<Trinity::RespawnDo>, GridTypeMapContainer > obj_worker(worker);
- cell.Visit(p, obj_worker, *player->GetMap(), *player, player->GetGridActivationRange());
+ player->VisitNearbyGridObject(player->GetGridActivationRange(), worker);
return true;
}
@@ -1844,14 +1830,9 @@ public:
std::string nameLink = handler->playerLink(targetName);
if (sWorld->getBoolConfig(CONFIG_SHOW_MUTE_IN_WORLD))
- {
- sWorld->SendWorldText(LANG_COMMAND_MUTEMESSAGE_WORLD, (handler->GetSession() ? handler->GetSession()->GetPlayerName().c_str() : "Server"), nameLink.c_str(), notSpeakTime, muteReasonStr.c_str());
- ChatHandler(target->GetSession()).PSendSysMessage(LANG_YOUR_CHAT_DISABLED, notSpeakTime, muteBy.c_str(), muteReasonStr.c_str());
- }
- else
- {
- ChatHandler(target->GetSession()).PSendSysMessage(LANG_YOUR_CHAT_DISABLED, notSpeakTime, muteBy.c_str(), muteReasonStr.c_str());
- }
+ sWorld->SendWorldText(LANG_COMMAND_MUTEMESSAGE_WORLD, muteBy.c_str(), nameLink.c_str(), notSpeakTime, muteReasonStr.c_str());
+
+ ChatHandler(target->GetSession()).PSendSysMessage(LANG_YOUR_CHAT_DISABLED, notSpeakTime, muteBy.c_str(), muteReasonStr.c_str());
}
else
{
@@ -1866,10 +1847,11 @@ public:
LoginDatabase.Execute(stmt);
std::string nameLink = handler->playerLink(targetName);
- if (sWorld->getBoolConfig(CONFIG_SHOW_MUTE_IN_WORLD) && !target)
- sWorld->SendWorldText(LANG_COMMAND_MUTEMESSAGE_WORLD, handler->GetSession()->GetPlayerName().c_str(), nameLink.c_str(), notSpeakTime, muteReasonStr.c_str());
- else
- handler->PSendSysMessage(target ? LANG_YOU_DISABLE_CHAT : LANG_COMMAND_DISABLE_CHAT_DELAYED, nameLink.c_str(), notSpeakTime, muteReasonStr.c_str());
+ if (sWorld->getBoolConfig(CONFIG_SHOW_MUTE_IN_WORLD) && !target)
+ sWorld->SendWorldText(LANG_COMMAND_MUTEMESSAGE_WORLD, muteBy.c_str(), nameLink.c_str(), notSpeakTime, muteReasonStr.c_str());
+ else
+ handler->PSendSysMessage(target ? LANG_YOU_DISABLE_CHAT : LANG_COMMAND_DISABLE_CHAT_DELAYED, nameLink.c_str(), notSpeakTime, muteReasonStr.c_str());
+
return true;
}
diff --git a/src/server/scripts/Commands/cs_reload.cpp b/src/server/scripts/Commands/cs_reload.cpp
index 2988c2c50c9..4b78ab880d4 100644
--- a/src/server/scripts/Commands/cs_reload.cpp
+++ b/src/server/scripts/Commands/cs_reload.cpp
@@ -438,7 +438,7 @@ public:
continue;
}
- CreatureTemplate* cInfo = const_cast<CreatureTemplate*>(sObjectMgr->GetCreatureTemplate(entry));
+ CreatureTemplate const* cInfo = sObjectMgr->GetCreatureTemplate(entry);
if (!cInfo)
{
handler->PSendSysMessage(LANG_COMMAND_CREATURESTORAGE_NOTFOUND, entry);
@@ -448,86 +448,7 @@ public:
TC_LOG_INFO("misc", "Reloading creature template entry %u", entry);
Field* fields = result->Fetch();
-
- for (uint8 i = 0; i < MAX_DIFFICULTY - 1; ++i)
- cInfo->DifficultyEntry[i] = fields[0 + i].GetUInt32();
-
- for (uint8 i = 0; i < MAX_KILL_CREDIT; ++i)
- cInfo->KillCredit[i] = fields[3 + i].GetUInt32();
-
- cInfo->Modelid1 = fields[5].GetUInt32();
- cInfo->Modelid2 = fields[6].GetUInt32();
- cInfo->Modelid3 = fields[7].GetUInt32();
- cInfo->Modelid4 = fields[8].GetUInt32();
- cInfo->Name = fields[9].GetString();
- cInfo->SubName = fields[10].GetString();
- cInfo->FemaleName = fields[11].GetString();
- cInfo->IconName = fields[12].GetString();
- cInfo->GossipMenuId = fields[13].GetUInt32();
- cInfo->minlevel = fields[14].GetUInt8();
- cInfo->maxlevel = fields[15].GetUInt8();
- cInfo->expansion = fields[16].GetUInt16();
- cInfo->expansionUnknown = fields[17].GetUInt16();
- cInfo->faction = fields[18].GetUInt16();
- cInfo->npcflag = fields[19].GetUInt32();
- cInfo->speed_walk = fields[20].GetFloat();
- cInfo->speed_run = fields[21].GetFloat();
- cInfo->scale = fields[22].GetFloat();
- cInfo->rank = fields[23].GetUInt8();
- cInfo->mindmg = fields[24].GetFloat();
- cInfo->maxdmg = fields[25].GetFloat();
- cInfo->dmgschool = fields[26].GetUInt8();
- cInfo->attackpower = fields[27].GetUInt32();
- cInfo->dmg_multiplier = fields[28].GetFloat();
- cInfo->baseattacktime = fields[29].GetUInt32();
- cInfo->rangeattacktime = fields[30].GetUInt32();
- cInfo->unit_class = fields[31].GetUInt8();
- cInfo->unit_flags = fields[32].GetUInt32();
- cInfo->unit_flags2 = fields[33].GetUInt32();
- cInfo->dynamicflags = fields[34].GetUInt32();
- cInfo->family = fields[35].GetUInt8();
- cInfo->trainer_type = fields[36].GetUInt8();
- cInfo->trainer_class = fields[37].GetUInt8();
- cInfo->trainer_race = fields[38].GetUInt8();
- cInfo->minrangedmg = fields[39].GetFloat();
- cInfo->maxrangedmg = fields[40].GetFloat();
- cInfo->rangedattackpower = fields[41].GetUInt16();
- cInfo->type = fields[42].GetUInt8();
- cInfo->type_flags = fields[43].GetUInt32();
- cInfo->type_flags2 = fields[44].GetUInt32();
- cInfo->lootid = fields[45].GetUInt32();
- cInfo->pickpocketLootId = fields[46].GetUInt32();
- cInfo->SkinLootId = fields[47].GetUInt32();
-
- for (uint8 i = SPELL_SCHOOL_HOLY; i < MAX_SPELL_SCHOOL; ++i)
- cInfo->resistance[i] = fields[48 + i -1].GetUInt16();
-
- for (uint8 i = 0; i < CREATURE_MAX_SPELLS; ++i)
- cInfo->spells[i] = fields[54 + i].GetUInt32();
-
- cInfo->PetSpellDataId = fields[62].GetUInt32();
- cInfo->VehicleId = fields[63].GetUInt32();
- cInfo->mingold = fields[64].GetUInt32();
- cInfo->maxgold = fields[65].GetUInt32();
- cInfo->AIName = fields[66].GetString();
- cInfo->MovementType = fields[67].GetUInt8();
- cInfo->InhabitType = fields[68].GetUInt8();
- cInfo->HoverHeight = fields[69].GetFloat();
- cInfo->ModHealth = fields[70].GetFloat();
- cInfo->ModMana = fields[71].GetFloat();
- cInfo->ModManaExtra = fields[72].GetFloat();
- cInfo->ModArmor = fields[73].GetFloat();
- cInfo->RacialLeader = fields[74].GetBool();
-
- for (uint8 i = 0; i < MAX_CREATURE_QUEST_ITEMS; ++i)
- cInfo->questItems[i] = fields[75 + i].GetUInt32();
-
- cInfo->movementId = fields[81].GetUInt32();
- cInfo->RegenHealth = fields[82].GetBool();
- cInfo->MechanicImmuneMask = fields[83].GetUInt32();
- cInfo->flags_extra = fields[84].GetUInt32();
- cInfo->ScriptID = sObjectMgr->GetScriptId(fields[85].GetCString());
-
+ sObjectMgr->LoadCreatureTemplate(fields);
sObjectMgr->CheckCreatureTemplate(cInfo);
}
diff --git a/src/server/scripts/Kalimdor/RazorfenKraul/razorfen_kraul.cpp b/src/server/scripts/Kalimdor/RazorfenKraul/razorfen_kraul.cpp
index f996bcc6f70..e3021ff7a95 100644
--- a/src/server/scripts/Kalimdor/RazorfenKraul/razorfen_kraul.cpp
+++ b/src/server/scripts/Kalimdor/RazorfenKraul/razorfen_kraul.cpp
@@ -47,27 +47,20 @@ class npc_willix : public CreatureScript
public:
npc_willix() : CreatureScript("npc_willix") { }
- bool OnQuestAccept(Player* player, Creature* creature, Quest const* quest) override
- {
- if (quest->GetQuestId() == QUEST_WILLIX_THE_IMPORTER)
- {
- ENSURE_AI(npc_escortAI, (creature->AI()))->Start(true, false, player->GetGUID());
- creature->AI()->Talk(SAY_READY, player);
- creature->setFaction(113);
- }
-
- return true;
- }
-
- CreatureAI* GetAI(Creature* creature) const override
- {
- return new npc_willixAI(creature);
- }
-
struct npc_willixAI : public npc_escortAI
{
npc_willixAI(Creature* creature) : npc_escortAI(creature) { }
+ void sQuestAccept(Player* player, Quest const* quest) override
+ {
+ if (quest->GetQuestId() == QUEST_WILLIX_THE_IMPORTER)
+ {
+ Start(true, false, player->GetGUID());
+ Talk(SAY_READY, player);
+ me->setFaction(113);
+ }
+ }
+
void WaypointReached(uint32 waypointId) override
{
Player* player = GetPlayerForEscort();
@@ -137,6 +130,10 @@ public:
}
};
+ CreatureAI* GetAI(Creature* creature) const override
+ {
+ return new npc_willixAI(creature);
+ }
};
enum SnufflenoseGopher
@@ -147,18 +144,6 @@ enum SnufflenoseGopher
POINT_TUBBER = 0
};
-struct DistanceOrder : public std::binary_function<GameObject, GameObject, bool>
-{
- DistanceOrder(Creature* me) : me(me) { }
-
- bool operator() (GameObject* first, GameObject* second)
- {
- return me->GetDistanceOrder(first, second);
- }
-
- Creature* me;
-};
-
struct npc_snufflenose_gopher : public CreatureScript
{
public:
@@ -208,18 +193,14 @@ public:
if (tubbersInRange.empty())
return;
- tubbersInRange.sort(DistanceOrder(me));
- GameObject* nearestTubber = NULL;
-
- for (std::list<GameObject*>::const_iterator itr = tubbersInRange.begin(); itr != tubbersInRange.end(); ++itr)
+ tubbersInRange.remove_if([](GameObject* go)
{
- if (!(*itr)->isSpawned() && (*itr)->HasFlag(GAMEOBJECT_FLAGS, GO_FLAG_INTERACT_COND))
- {
- nearestTubber = *itr;
- break;
- }
- }
+ return go->isSpawned() || !go->HasFlag(GAMEOBJECT_FLAGS, GO_FLAG_INTERACT_COND);
+ });
+ tubbersInRange.sort(Trinity::ObjectDistanceOrderPred(me));
+
+ GameObject* nearestTubber = tubbersInRange.front();
if (!nearestTubber)
return;
@@ -259,21 +240,16 @@ class spell_snufflenose_command : public SpellScriptLoader
{
PrepareSpellScript(spell_snufflenose_commandSpellScript);
- bool Load() override
- {
- return GetCaster()->GetTypeId() == TYPEID_PLAYER;
- }
-
- void HandleAfterCast()
+ void HandleEffect(SpellEffIndex /*effIndex*/)
{
- if (Unit* target = GetCaster()->ToPlayer()->GetSelectedUnit())
+ if (Creature* target = GetHitCreature())
if (target->GetEntry() == NPC_SNUFFLENOSE_GOPHER)
- target->ToCreature()->AI()->DoAction(ACTION_FIND_NEW_TUBBER);
+ target->AI()->DoAction(ACTION_FIND_NEW_TUBBER);
}
void Register() override
{
- AfterCast += SpellCastFn(spell_snufflenose_commandSpellScript::HandleAfterCast);
+ OnEffectHitTarget += SpellEffectFn(spell_snufflenose_commandSpellScript::HandleEffect, EFFECT_0, SPELL_EFFECT_DUMMY);
}
};
diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_deathbringer_saurfang.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_deathbringer_saurfang.cpp
index e1658e564ec..5ef84c7bb40 100644
--- a/src/server/scripts/Northrend/IcecrownCitadel/boss_deathbringer_saurfang.cpp
+++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_deathbringer_saurfang.cpp
@@ -299,6 +299,12 @@ class boss_deathbringer_saurfang : public CreatureScript
_introDone = true;
+ if (GameObject* teleporter = GameObject::GetGameObject(*me, instance->GetData64(GO_SCOURGE_TRANSPORTER_DEATHBRINGER)))
+ {
+ instance->HandleGameObject(0, false, teleporter);
+ teleporter->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
+ }
+
Talk(SAY_AGGRO);
events.ScheduleEvent(EVENT_SUMMON_BLOOD_BEAST, 30000, 0, PHASE_COMBAT);
events.ScheduleEvent(EVENT_BERSERK, IsHeroic() ? 360000 : 480000, 0, PHASE_COMBAT);
@@ -538,12 +544,6 @@ class boss_deathbringer_saurfang : public CreatureScript
case PHASE_INTRO_A:
case PHASE_INTRO_H:
{
- if (GameObject* teleporter = GameObject::GetGameObject(*me, instance->GetData64(GO_SCOURGE_TRANSPORTER_SAURFANG)))
- {
- instance->HandleGameObject(0, false, teleporter);
- teleporter->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_IN_USE);
- }
-
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
// controls what events will execute
events.SetPhase(uint32(action));
diff --git a/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.cpp b/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.cpp
index 592c44940a4..e85ddc21dda 100644
--- a/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.cpp
+++ b/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.cpp
@@ -2102,7 +2102,15 @@ class at_icc_shutdown_traps : public AreaTriggerScript
bool OnTrigger(Player* player, AreaTriggerEntry const* /*areaTrigger*/) override
{
if (InstanceScript* instance = player->GetInstanceScript())
- instance->SetData(DATA_COLDFLAME_JETS, DONE);
+ {
+ instance->SetData(DATA_UPPERSPIRE_TELE_ACT, DONE);
+ uint64 teleporterGUID = instance->GetData64(GO_SCOURGE_TRANSPORTER_UPPERSPIRE);
+ if (GameObject* go = instance->instance->GetGameObject(teleporterGUID))
+ {
+ go->SetGoState(GO_STATE_ACTIVE);
+ go->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
+ }
+ }
return true;
}
};
diff --git a/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.h b/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.h
index da4a8f089cc..fbd3a715fb8 100644
--- a/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.h
+++ b/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.h
@@ -116,7 +116,8 @@ enum DataTypes
DATA_HIGHLORD_TIRION_FORDRING = 37,
DATA_ARTHAS_PLATFORM = 38,
DATA_TERENAS_MENETHIL = 39,
- DATA_ENEMY_GUNSHIP = 40
+ DATA_ENEMY_GUNSHIP = 40,
+ DATA_UPPERSPIRE_TELE_ACT = 41,
};
enum CreaturesIds
@@ -322,6 +323,15 @@ enum CreaturesIds
enum GameObjectsIds
{
+ // ICC Teleporters
+ GO_SCOURGE_TRANSPORTER_LICHKING = 202223,
+ GO_SCOURGE_TRANSPORTER_UPPERSPIRE = 202235,
+ GO_SCOURGE_TRANSPORTER_LIGHTSHAMMER = 202242,
+ GO_SCOURGE_TRANSPORTER_RAMPART = 202243,
+ GO_SCOURGE_TRANSPORTER_DEATHBRINGER = 202244,
+ GO_SCOURGE_TRANSPORTER_ORATORY = 202245,
+ GO_SCOURGE_TRANSPORTER_SINDRAGOSA = 202246,
+
// Lower Spire Trash
GO_SPIRIT_ALARM_1 = 201814,
GO_SPIRIT_ALARM_2 = 201815,
@@ -359,7 +369,6 @@ enum GameObjectsIds
GO_DEATHBRINGER_S_CACHE_25N = 202240,
GO_DEATHBRINGER_S_CACHE_10H = 202238,
GO_DEATHBRINGER_S_CACHE_25H = 202241,
- GO_SCOURGE_TRANSPORTER_SAURFANG = 202244,
// Professor Putricide
GO_ORANGE_PLAGUE_MONSTER_ENTRANCE = 201371,
@@ -404,7 +413,6 @@ enum GameObjectsIds
GO_SIGIL_OF_THE_FROSTWING = 202181,
// The Lich King
- GO_SCOURGE_TRANSPORTER_LK = 202223,
GO_ARTHAS_PLATFORM = 202161,
GO_ARTHAS_PRECIPICE = 202078,
GO_DOODAD_ICECROWN_THRONEFROSTYWIND01 = 202188,
diff --git a/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel_teleport.cpp b/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel_teleport.cpp
index 537c3c7354d..469bfc1d310 100644
--- a/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel_teleport.cpp
+++ b/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel_teleport.cpp
@@ -31,19 +31,23 @@ class icecrown_citadel_teleport : public GameObjectScript
bool OnGossipHello(Player* player, GameObject* go) override
{
- player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, "Teleport to Light's Hammer.", GOSSIP_SENDER_ICC_PORT, LIGHT_S_HAMMER_TELEPORT);
if (InstanceScript* instance = go->GetInstanceScript())
{
if (instance->GetBossState(DATA_LORD_MARROWGAR) == DONE)
- player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, "Teleport to the Oratory of the Damned.", GOSSIP_SENDER_ICC_PORT, ORATORY_OF_THE_DAMNED_TELEPORT);
- if (instance->GetBossState(DATA_LADY_DEATHWHISPER) == DONE)
+ {
+ if (go->GetEntry() != GO_SCOURGE_TRANSPORTER_LIGHTSHAMMER)
+ player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, "Teleport to Light's Hammer.", GOSSIP_SENDER_ICC_PORT, LIGHT_S_HAMMER_TELEPORT);
+ if (go->GetEntry() != GO_SCOURGE_TRANSPORTER_ORATORY)
+ player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, "Teleport to the Oratory of the Damned.", GOSSIP_SENDER_ICC_PORT, ORATORY_OF_THE_DAMNED_TELEPORT);
+ }
+ if (instance->GetBossState(DATA_LADY_DEATHWHISPER) == DONE && go->GetEntry() != GO_SCOURGE_TRANSPORTER_RAMPART)
player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, "Teleport to the Rampart of Skulls.", GOSSIP_SENDER_ICC_PORT, RAMPART_OF_SKULLS_TELEPORT);
- if (instance->GetBossState(DATA_ICECROWN_GUNSHIP_BATTLE) == DONE)
+ if (instance->GetBossState(DATA_ICECROWN_GUNSHIP_BATTLE) == DONE && go->GetEntry() != GO_SCOURGE_TRANSPORTER_DEATHBRINGER)
player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, "Teleport to the Deathbringer's Rise.", GOSSIP_SENDER_ICC_PORT, DEATHBRINGER_S_RISE_TELEPORT);
- if (instance->GetData(DATA_COLDFLAME_JETS) == DONE)
+ if (instance->GetData(DATA_UPPERSPIRE_TELE_ACT) == DONE && go->GetEntry() != GO_SCOURGE_TRANSPORTER_UPPERSPIRE)
player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, "Teleport to the Upper Spire.", GOSSIP_SENDER_ICC_PORT, UPPER_SPIRE_TELEPORT);
/// @todo Gauntlet event before Sindragosa
- if (instance->GetBossState(DATA_VALITHRIA_DREAMWALKER) == DONE)
+ if (instance->GetBossState(DATA_VALITHRIA_DREAMWALKER) == DONE && go->GetEntry() != GO_SCOURGE_TRANSPORTER_SINDRAGOSA)
player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, "Teleport to Sindragosa's Lair", GOSSIP_SENDER_ICC_PORT, SINDRAGOSA_S_LAIR_TELEPORT);
}
diff --git a/src/server/scripts/Northrend/IcecrownCitadel/instance_icecrown_citadel.cpp b/src/server/scripts/Northrend/IcecrownCitadel/instance_icecrown_citadel.cpp
index febcf22ba6d..86e4efc5db7 100644
--- a/src/server/scripts/Northrend/IcecrownCitadel/instance_icecrown_citadel.cpp
+++ b/src/server/scripts/Northrend/IcecrownCitadel/instance_icecrown_citadel.cpp
@@ -127,7 +127,13 @@ class instance_icecrown_citadel : public InstanceMapScript
DeathbringerSaurfangDoorGUID = 0;
DeathbringerSaurfangEventGUID = 0;
DeathbringersCacheGUID = 0;
- SaurfangTeleportGUID = 0;
+ TeleporterLichKingGUID = 0;
+ TeleporterUpperSpireGUID = 0;
+ TeleporterLightsHammerGUID = 0;
+ TeleporterRampartsGUID = 0;
+ TeleporterDeathBringerGUID = 0;
+ TeleporterOratoryGUID = 0;
+ TeleporterSindragosaGUID = 0;
PlagueSigilGUID = 0;
BloodwingSigilGUID = 0;
FrostwingSigilGUID = 0;
@@ -164,10 +170,26 @@ class instance_icecrown_citadel : public InstanceMapScript
IsNauseaEligible = true;
IsOrbWhispererEligible = true;
ColdflameJetsState = NOT_STARTED;
+ UpperSpireTeleporterActiveState = NOT_STARTED;
BloodQuickeningState = NOT_STARTED;
BloodQuickeningMinutes = 0;
}
+ // A function to help reduce the number of lines for teleporter management.
+ void SetTeleporterState(GameObject* go, bool usable)
+ {
+ if (usable)
+ {
+ go->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
+ go->SetGoState(GO_STATE_ACTIVE);
+ }
+ else
+ {
+ go->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
+ go->SetGoState(GO_STATE_READY);
+ }
+ }
+
void FillInitialWorldStates(WorldPacket& data) override
{
data << uint32(WORLDSTATE_SHOW_TIMER) << uint32(BloodQuickeningState == IN_PROGRESS);
@@ -542,8 +564,37 @@ class instance_icecrown_citadel : public InstanceMapScript
case GO_DEATHBRINGER_S_CACHE_25H:
DeathbringersCacheGUID = go->GetGUID();
break;
- case GO_SCOURGE_TRANSPORTER_SAURFANG:
- SaurfangTeleportGUID = go->GetGUID();
+ case GO_SCOURGE_TRANSPORTER_LICHKING:
+ TeleporterLichKingGUID = go->GetGUID();
+ if (GetBossState(DATA_PROFESSOR_PUTRICIDE) == DONE && GetBossState(DATA_BLOOD_QUEEN_LANA_THEL) == DONE && GetBossState(DATA_SINDRAGOSA) == DONE)
+ go->SetGoState(GO_STATE_ACTIVE);
+ break;
+ case GO_SCOURGE_TRANSPORTER_UPPERSPIRE:
+ TeleporterUpperSpireGUID = go->GetGUID();
+ if (GetBossState(DATA_DEATHBRINGER_SAURFANG) != DONE || GetData(DATA_UPPERSPIRE_TELE_ACT) != DONE)
+ SetTeleporterState(go, false);
+ else
+ SetTeleporterState(go, true);
+ break;
+ case GO_SCOURGE_TRANSPORTER_LIGHTSHAMMER:
+ TeleporterLightsHammerGUID = go->GetGUID();
+ SetTeleporterState(go, GetBossState(DATA_LORD_MARROWGAR) == DONE);
+ break;
+ case GO_SCOURGE_TRANSPORTER_RAMPART:
+ TeleporterRampartsGUID = go->GetGUID();
+ SetTeleporterState(go, GetBossState(DATA_LADY_DEATHWHISPER) == DONE);
+ break;
+ case GO_SCOURGE_TRANSPORTER_DEATHBRINGER:
+ TeleporterDeathBringerGUID = go->GetGUID();
+ SetTeleporterState(go, GetBossState(DATA_ICECROWN_GUNSHIP_BATTLE) == DONE);
+ break;
+ case GO_SCOURGE_TRANSPORTER_ORATORY:
+ TeleporterOratoryGUID = go->GetGUID();
+ SetTeleporterState(go, GetBossState(DATA_LORD_MARROWGAR) == DONE);
+ break;
+ case GO_SCOURGE_TRANSPORTER_SINDRAGOSA:
+ TeleporterSindragosaGUID = go->GetGUID();
+ SetTeleporterState(go, GetBossState(DATA_VALITHRIA_DREAMWALKER) == DONE);
break;
case GO_PLAGUE_SIGIL:
PlagueSigilGUID = go->GetGUID();
@@ -600,11 +651,6 @@ class instance_icecrown_citadel : public InstanceMapScript
go->SetLootRecipient(valithria->GetLootRecipient());
go->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_LOCKED | GO_FLAG_NOT_SELECTABLE | GO_FLAG_NODESPAWN);
break;
- case GO_SCOURGE_TRANSPORTER_LK:
- TheLichKingTeleportGUID = go->GetGUID();
- if (GetBossState(DATA_PROFESSOR_PUTRICIDE) == DONE && GetBossState(DATA_BLOOD_QUEEN_LANA_THEL) == DONE && GetBossState(DATA_SINDRAGOSA) == DONE)
- go->SetGoState(GO_STATE_ACTIVE);
- break;
case GO_ARTHAS_PLATFORM:
ArthasPlatformGUID = go->GetGUID();
break;
@@ -690,6 +736,8 @@ class instance_icecrown_citadel : public InstanceMapScript
return RimefangTrash.size();
case DATA_COLDFLAME_JETS:
return ColdflameJetsState;
+ case DATA_UPPERSPIRE_TELE_ACT:
+ return UpperSpireTeleporterActiveState;
case DATA_TEAM_IN_INSTANCE:
return TeamInInstance;
case DATA_BLOOD_QUICKENING_STATE:
@@ -717,8 +765,20 @@ class instance_icecrown_citadel : public InstanceMapScript
return DeathbringerSaurfangEventGUID;
case GO_SAURFANG_S_DOOR:
return DeathbringerSaurfangDoorGUID;
- case GO_SCOURGE_TRANSPORTER_SAURFANG:
- return SaurfangTeleportGUID;
+ case GO_SCOURGE_TRANSPORTER_LICHKING:
+ return TeleporterLichKingGUID;
+ case GO_SCOURGE_TRANSPORTER_UPPERSPIRE:
+ return TeleporterUpperSpireGUID;
+ case GO_SCOURGE_TRANSPORTER_LIGHTSHAMMER:
+ return TeleporterLightsHammerGUID;
+ case GO_SCOURGE_TRANSPORTER_RAMPART:
+ return TeleporterRampartsGUID;
+ case GO_SCOURGE_TRANSPORTER_DEATHBRINGER:
+ return TeleporterDeathBringerGUID;
+ case GO_SCOURGE_TRANSPORTER_ORATORY:
+ return TeleporterOratoryGUID;
+ case GO_SCOURGE_TRANSPORTER_SINDRAGOSA:
+ return TeleporterSindragosaGUID;
case DATA_FESTERGUT:
return FestergutGUID;
case DATA_ROTFACE:
@@ -780,10 +840,24 @@ class instance_icecrown_citadel : public InstanceMapScript
switch (type)
{
+ case DATA_LORD_MARROWGAR:
+ {
+ if (state == DONE)
+ {
+ if (GameObject* teleporter = instance->GetGameObject(TeleporterLightsHammerGUID))
+ SetTeleporterState(teleporter, true);
+ if (GameObject* teleporter = instance->GetGameObject(TeleporterOratoryGUID))
+ SetTeleporterState(teleporter, true);
+ }
+ break;
+ }
case DATA_LADY_DEATHWHISPER:
{
if (state == DONE)
{
+ if (GameObject* teleporter = instance->GetGameObject(TeleporterRampartsGUID))
+ SetTeleporterState(teleporter, true);
+
if (GameObject* elevator = instance->GetGameObject(LadyDeathwisperElevatorGUID))
{
elevator->SetUInt32Value(GAMEOBJECT_LEVEL, 0);
@@ -797,6 +871,9 @@ class instance_icecrown_citadel : public InstanceMapScript
case DATA_ICECROWN_GUNSHIP_BATTLE:
if (state == DONE)
{
+ if (GameObject* teleporter = instance->GetGameObject(TeleporterDeathBringerGUID))
+ SetTeleporterState(teleporter, true);
+
if (GameObject* loot = instance->GetGameObject(GunshipArmoryGUID))
loot->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_LOCKED | GO_FLAG_NOT_SELECTABLE | GO_FLAG_NODESPAWN);
}
@@ -807,20 +884,28 @@ class instance_icecrown_citadel : public InstanceMapScript
switch (state)
{
case DONE:
+ {
if (GameObject* loot = instance->GetGameObject(DeathbringersCacheGUID))
{
if (Creature* deathbringer = instance->GetCreature(DeathbringerSaurfangGUID))
loot->SetLootRecipient(deathbringer->GetLootRecipient());
loot->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_LOCKED | GO_FLAG_NOT_SELECTABLE | GO_FLAG_NODESPAWN);
}
- // no break
+
+ if (GameObject* teleporter = instance->GetGameObject(TeleporterUpperSpireGUID))
+ SetTeleporterState(teleporter, true);
+
+ if (GameObject* teleporter = instance->GetGameObject(TeleporterDeathBringerGUID))
+ SetTeleporterState(teleporter, true);
+ break;
+ }
case NOT_STARTED:
- if (GameObject* teleporter = instance->GetGameObject(SaurfangTeleportGUID))
- {
- HandleGameObject(SaurfangTeleportGUID, true, teleporter);
- teleporter->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_IN_USE);
- }
+ {
+ if (GameObject* teleporter = instance->GetGameObject(TeleporterDeathBringerGUID))
+ SetTeleporterState(teleporter, true);
+
break;
+ }
default:
break;
}
@@ -890,8 +975,13 @@ class instance_icecrown_citadel : public InstanceMapScript
}
break;
case DATA_VALITHRIA_DREAMWALKER:
- if (state == DONE && sPoolMgr->IsSpawnedObject<Quest>(WeeklyQuestData[8].questId[instance->GetSpawnMode() & 1]))
- instance->SummonCreature(NPC_VALITHRIA_DREAMWALKER_QUEST, ValithriaSpawnPos);
+ if (state == DONE)
+ {
+ if (sPoolMgr->IsSpawnedObject<Quest>(WeeklyQuestData[8].questId[instance->GetSpawnMode() & 1]))
+ instance->SummonCreature(NPC_VALITHRIA_DREAMWALKER_QUEST, ValithriaSpawnPos);
+ if (GameObject* teleporter = instance->GetGameObject(TeleporterSindragosaGUID))
+ SetTeleporterState(teleporter, true);
+ }
break;
case DATA_SINDRAGOSA:
HandleGameObject(FrostwingSigilGUID, state != DONE);
@@ -1025,6 +1115,11 @@ class instance_icecrown_citadel : public InstanceMapScript
SaveToDB();
break;
}
+ case DATA_UPPERSPIRE_TELE_ACT:
+ UpperSpireTeleporterActiveState = data;
+ if (UpperSpireTeleporterActiveState == DONE)
+ SaveToDB();
+ break;
default:
break;
}
@@ -1231,7 +1326,7 @@ class instance_icecrown_citadel : public InstanceMapScript
std::ostringstream saveStream;
saveStream << "I C " << GetBossSaveData() << HeroicAttempts << ' '
- << ColdflameJetsState << ' ' << BloodQuickeningState << ' ' << BloodQuickeningMinutes;
+ << ColdflameJetsState << ' ' << BloodQuickeningState << ' ' << BloodQuickeningMinutes << ' ' << UpperSpireTeleporterActiveState;
OUT_SAVE_INST_DATA_COMPLETE;
return saveStream.str();
@@ -1267,11 +1362,17 @@ class instance_icecrown_citadel : public InstanceMapScript
uint32 temp = 0;
loadStream >> temp;
- ColdflameJetsState = temp ? DONE : NOT_STARTED;
+ if (temp == IN_PROGRESS)
+ ColdflameJetsState = NOT_STARTED;
+ else
+ ColdflameJetsState = temp ? DONE : NOT_STARTED;
loadStream >> temp;
BloodQuickeningState = temp ? DONE : NOT_STARTED; // DONE means finished (not success/fail)
loadStream >> BloodQuickeningMinutes;
+
+ loadStream >> temp;
+ UpperSpireTeleporterActiveState = temp ? DONE : NOT_STARTED;
}
else
OUT_LOAD_INST_DATA_FAIL;
@@ -1412,7 +1513,13 @@ class instance_icecrown_citadel : public InstanceMapScript
uint64 DeathbringerSaurfangDoorGUID;
uint64 DeathbringerSaurfangEventGUID; // Muradin Bronzebeard or High Overlord Saurfang
uint64 DeathbringersCacheGUID;
- uint64 SaurfangTeleportGUID;
+ uint64 TeleporterLichKingGUID;
+ uint64 TeleporterUpperSpireGUID;
+ uint64 TeleporterLightsHammerGUID;
+ uint64 TeleporterRampartsGUID;
+ uint64 TeleporterDeathBringerGUID;
+ uint64 TeleporterOratoryGUID;
+ uint64 TeleporterSindragosaGUID;
uint64 PlagueSigilGUID;
uint64 BloodwingSigilGUID;
uint64 FrostwingSigilGUID;
@@ -1449,6 +1556,7 @@ class instance_icecrown_citadel : public InstanceMapScript
uint64 PillarsUnchainedGUID;
uint32 TeamInInstance;
uint32 ColdflameJetsState;
+ uint32 UpperSpireTeleporterActiveState;
std::set<uint32> FrostwyrmGUIDs;
std::set<uint32> SpinestalkerTrash;
std::set<uint32> RimefangTrash;
diff --git a/src/server/scripts/Outland/zone_netherstorm.cpp b/src/server/scripts/Outland/zone_netherstorm.cpp
index 42be5ba8c90..f82c1f5fb58 100644
--- a/src/server/scripts/Outland/zone_netherstorm.cpp
+++ b/src/server/scripts/Outland/zone_netherstorm.cpp
@@ -19,13 +19,11 @@
/* ScriptData
SDName: Netherstorm
SD%Complete: 80
-SDComment: Quest support: 10337, 10438, 10652 (special flight paths), 10299, 10321, 10322, 10323, 10329, 10330, 10338, 10365(Shutting Down Manaforge), 10198, 10191
+SDComment: Quest support: 10337, 10438, 10652 (special flight paths), 10198, 10191
SDCategory: Netherstorm
EndScriptData */
/* ContentData
-npc_manaforge_control_console
-go_manaforge_control_console
npc_commander_dawnforge
npc_bessy
npc_maxx_a_million
@@ -39,323 +37,6 @@ EndContentData */
#include "Player.h"
/*######
-## npc_manaforge_control_console
-######*/
-
-//used by 20209, 20417, 20418, 20440, signed for 20209
-enum ManaforgeConsoleData
-{
- EMOTE_START = 0,
- EMOTE_60 = 1,
- EMOTE_30 = 2,
- EMOTE_10 = 3,
- EMOTE_COMPLETE = 4,
- EMOTE_ABORT = 5,
-
- ENTRY_BNAAR_C_CONSOLE = 20209,
- ENTRY_CORUU_C_CONSOLE = 20417,
- ENTRY_DURO_C_CONSOLE = 20418,
- ENTRY_ARA_C_CONSOLE = 20440,
-
- ENTRY_SUNFURY_TECH = 20218,
- ENTRY_SUNFURY_PROT = 20436,
-
- ENTRY_ARA_TECH = 20438,
- ENTRY_ARA_ENGI = 20439,
- ENTRY_ARA_GORKLONN = 20460,
-
- SPELL_DISABLE_VISUAL = 35031,
- SPELL_INTERRUPT_1 = 35016, //ACID mobs should cast this
- SPELL_INTERRUPT_2 = 35176, //ACID mobs should cast this (Manaforge Ara-version)
-};
-
-class npc_manaforge_control_console : public CreatureScript
-{
-public:
- npc_manaforge_control_console() : CreatureScript("npc_manaforge_control_console") { }
-
- CreatureAI* GetAI(Creature* creature) const override
- {
- return new npc_manaforge_control_consoleAI(creature);
- }
-
- struct npc_manaforge_control_consoleAI : public ScriptedAI
- {
- npc_manaforge_control_consoleAI(Creature* creature) : ScriptedAI(creature) { }
-
- uint32 Event_Timer;
- uint32 Wave_Timer;
- uint32 Phase;
- bool Wave;
- uint64 someplayer;
- uint64 goConsole;
- Creature* add;
-
- void Reset() override
- {
- Event_Timer = 3000;
- Wave_Timer = 0;
- Phase = 1;
- Wave = false;
- someplayer = 0;
- goConsole = 0;
- add = NULL;
- }
-
- void EnterCombat(Unit* /*who*/) override { }
-
- /*void SpellHit(Unit* caster, const SpellInfo* spell) override
- {
- //we have no way of telling the Creature was hit by spell -> got aura applied after 10-12 seconds
- //then no way for the mobs to actually stop the shutdown as intended.
- if (spell->Id == SPELL_INTERRUPT_1)
- DoSay("Silence! I kill you!", LANG_UNIVERSAL, NULL);
- }*/
-
- void JustDied(Unit* /*killer*/) override
- {
- Talk(EMOTE_ABORT);
-
- if (someplayer)
- {
- if (Player* player = ObjectAccessor::GetPlayer(*me, someplayer))
- {
- switch (me->GetEntry())
- {
- case ENTRY_BNAAR_C_CONSOLE:
- player->FailQuest(10299);
- player->FailQuest(10329);
- break;
- case ENTRY_CORUU_C_CONSOLE:
- player->FailQuest(10321);
- player->FailQuest(10330);
- break;
- case ENTRY_DURO_C_CONSOLE:
- player->FailQuest(10322);
- player->FailQuest(10338);
- break;
- case ENTRY_ARA_C_CONSOLE:
- player->FailQuest(10323);
- player->FailQuest(10365);
- break;
- }
- }
- }
-
- if (goConsole)
- if (GameObject* go = GameObject::GetGameObject(*me, goConsole))
- go->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_IN_USE);
- }
-
- void DoWaveSpawnForCreature(Creature* creature)
- {
- switch (creature->GetEntry())
- {
- case ENTRY_BNAAR_C_CONSOLE:
- if (rand32() % 2)
- {
- add = me->SummonCreature(ENTRY_SUNFURY_TECH, 2933.68f, 4162.55f, 164.00f, 1.60f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 120000);
- if (add) add->GetMotionMaster()->MovePoint(0, 2927.36f, 4212.97f, 164.00f);
- }
- else
- {
- add = me->SummonCreature(ENTRY_SUNFURY_TECH, 2927.36f, 4212.97f, 164.00f, 4.94f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 120000);
- if (add) add->GetMotionMaster()->MovePoint(0, 2933.68f, 4162.55f, 164.00f);
- }
- Wave_Timer = 30000;
- break;
- case ENTRY_CORUU_C_CONSOLE:
- add = me->SummonCreature(ENTRY_SUNFURY_TECH, 2445.21f, 2765.26f, 134.49f, 3.93f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 120000);
- if (add) add->GetMotionMaster()->MovePoint(0, 2424.21f, 2740.15f, 133.81f);
- add = me->SummonCreature(ENTRY_SUNFURY_TECH, 2429.86f, 2731.85f, 134.53f, 1.31f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 120000);
- if (add) add->GetMotionMaster()->MovePoint(0, 2435.37f, 2766.04f, 133.81f);
- Wave_Timer = 20000;
- break;
- case ENTRY_DURO_C_CONSOLE:
- add = me->SummonCreature(ENTRY_SUNFURY_TECH, 2986.80f, 2205.36f, 165.37f, 3.74f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 120000);
- if (add) add->GetMotionMaster()->MovePoint(0, 2985.15f, 2197.32f, 164.79f);
- add = me->SummonCreature(ENTRY_SUNFURY_TECH, 2952.91f, 2191.20f, 165.32f, 0.22f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 120000);
- if (add) add->GetMotionMaster()->MovePoint(0, 2060.01f, 2185.27f, 164.67f);
- Wave_Timer = 15000;
- break;
- case ENTRY_ARA_C_CONSOLE:
- if (rand32() % 2)
- {
- add = me->SummonCreature(ENTRY_ARA_TECH, 4035.11f, 4038.97f, 194.27f, 2.57f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 120000);
- if (add) add->GetMotionMaster()->MovePoint(0, 4003.42f, 4040.19f, 193.49f);
- add = me->SummonCreature(ENTRY_ARA_TECH, 4033.66f, 4036.79f, 194.28f, 2.57f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 120000);
- if (add) add->GetMotionMaster()->MovePoint(0, 4003.42f, 4040.19f, 193.49f);
- add = me->SummonCreature(ENTRY_ARA_TECH, 4037.13f, 4037.30f, 194.23f, 2.57f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 120000);
- if (add) add->GetMotionMaster()->MovePoint(0, 4003.42f, 4040.19f, 193.49f);
- }
- else
- {
- add = me->SummonCreature(ENTRY_ARA_TECH, 3099.59f, 4049.30f, 194.22f, 0.05f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 120000);
- if (add) add->GetMotionMaster()->MovePoint(0, 4028.01f, 4035.17f, 193.59f);
- add = me->SummonCreature(ENTRY_ARA_TECH, 3999.72f, 4046.75f, 194.22f, 0.05f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 120000);
- if (add) add->GetMotionMaster()->MovePoint(0, 4028.01f, 4035.17f, 193.59f);
- add = me->SummonCreature(ENTRY_ARA_TECH, 3996.81f, 4048.26f, 194.22f, 0.05f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 120000);
- if (add) add->GetMotionMaster()->MovePoint(0, 4028.01f, 4035.17f, 193.59f);
- }
- Wave_Timer = 15000;
- break;
- }
- }
- void DoFinalSpawnForCreature(Creature* creature)
- {
- switch (creature->GetEntry())
- {
- case ENTRY_BNAAR_C_CONSOLE:
- add = me->SummonCreature(ENTRY_SUNFURY_TECH, 2946.52f, 4201.42f, 163.47f, 3.54f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 120000);
- if (add) add->GetMotionMaster()->MovePoint(0, 2927.49f, 4192.81f, 163.00f);
- break;
- case ENTRY_CORUU_C_CONSOLE:
- add = me->SummonCreature(ENTRY_SUNFURY_TECH, 2453.88f, 2737.85f, 133.27f, 2.59f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 120000);
- if (add) add->GetMotionMaster()->MovePoint(0, 2433.96f, 2751.53f, 133.85f);
- add = me->SummonCreature(ENTRY_SUNFURY_TECH, 2441.62f, 2735.32f, 134.49f, 1.97f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 120000);
- if (add) add->GetMotionMaster()->MovePoint(0, 2433.96f, 2751.53f, 133.85f);
- add = me->SummonCreature(ENTRY_SUNFURY_TECH, 2450.73f, 2754.50f, 134.49f, 3.29f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 120000);
- if (add) add->GetMotionMaster()->MovePoint(0, 2433.96f, 2751.53f, 133.85f);
- break;
- case ENTRY_DURO_C_CONSOLE:
- add = me->SummonCreature(ENTRY_SUNFURY_TECH, 2956.18f, 2202.85f, 165.32f, 5.45f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 120000);
- if (add) add->GetMotionMaster()->MovePoint(0, 2972.27f, 2193.22f, 164.48f);
- add = me->SummonCreature(ENTRY_SUNFURY_TECH, 2975.30f, 2211.50f, 165.32f, 4.55f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 120000);
- if (add) add->GetMotionMaster()->MovePoint(0, 2972.27f, 2193.22f, 164.48f);
- add = me->SummonCreature(ENTRY_SUNFURY_PROT, 2965.02f, 2217.45f, 164.16f, 4.96f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 120000);
- if (add) add->GetMotionMaster()->MovePoint(0, 2972.27f, 2193.22f, 164.48f);
- break;
- case ENTRY_ARA_C_CONSOLE:
- add = me->SummonCreature(ENTRY_ARA_ENGI, 3994.51f, 4020.46f, 192.18f, 0.91f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 120000);
- if (add) add->GetMotionMaster()->MovePoint(0, 4008.35f, 4035.04f, 192.70f);
- add = me->SummonCreature(ENTRY_ARA_GORKLONN, 4021.56f, 4059.35f, 193.59f, 4.44f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 120000);
- if (add) add->GetMotionMaster()->MovePoint(0, 4016.62f, 4039.89f, 193.46f);
- break;
- }
- }
-
- void UpdateAI(uint32 diff) override
- {
- if (Event_Timer <= diff)
- {
- switch (Phase)
- {
- case 1:
- if (someplayer)
- {
- Unit* u = ObjectAccessor::GetUnit(*me, someplayer);
- if (u && u->GetTypeId() == TYPEID_PLAYER)
- Talk(EMOTE_START, u);
- }
- Event_Timer = 60000;
- Wave = true;
- ++Phase;
- break;
- case 2:
- Talk(EMOTE_60);
- Event_Timer = 30000;
- ++Phase;
- break;
- case 3:
- Talk(EMOTE_30);
- Event_Timer = 20000;
- DoFinalSpawnForCreature(me);
- ++Phase;
- break;
- case 4:
- Talk(EMOTE_10);
- Event_Timer = 10000;
- Wave = false;
- ++Phase;
- break;
- case 5:
- Talk(EMOTE_COMPLETE);
- if (someplayer)
- {
- if (Player* player = ObjectAccessor::GetPlayer(*me, someplayer))
- player->KilledMonsterCredit(me->GetEntry(), me->GetGUID());
- DoCast(me, SPELL_DISABLE_VISUAL);
- }
-
- if (goConsole)
- if (GameObject* go = GameObject::GetGameObject(*me, goConsole))
- go->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_IN_USE);
-
- ++Phase;
- break;
- }
- }
- else
- Event_Timer -= diff;
-
- if (Wave)
- {
- if (Wave_Timer <= diff)
- {
- DoWaveSpawnForCreature(me);
- }
- else
- Wave_Timer -= diff;
- }
- }
- };
-};
-
-/*######
-## go_manaforge_control_console
-######*/
-
-/// @todo clean up this workaround when Trinity adds support to do it properly (with gossip selections instead of instant summon)
-class go_manaforge_control_console : public GameObjectScript
-{
-public:
- go_manaforge_control_console() : GameObjectScript("go_manaforge_control_console") { }
-
- bool OnGossipHello(Player* player, GameObject* go) override
- {
- if (go->GetGoType() == GAMEOBJECT_TYPE_QUESTGIVER)
- {
- player->PrepareQuestMenu(go->GetGUID());
- player->SendPreparedQuest(go->GetGUID());
- }
-
- Creature* manaforge = NULL;
-
- switch (go->GetAreaId())
- {
- case 3726: //b'naar
- if ((player->GetQuestStatus(10299) == QUEST_STATUS_INCOMPLETE || player->GetQuestStatus(10329) == QUEST_STATUS_INCOMPLETE) &&
- player->HasItemCount(29366))
- manaforge = player->SummonCreature(ENTRY_BNAAR_C_CONSOLE, 2918.95f, 4189.98f, 161.88f, 0.34f, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 125000);
- break;
- case 3730: //coruu
- if ((player->GetQuestStatus(10321) == QUEST_STATUS_INCOMPLETE || player->GetQuestStatus(10330) == QUEST_STATUS_INCOMPLETE) &&
- player->HasItemCount(29396))
- manaforge = player->SummonCreature(ENTRY_CORUU_C_CONSOLE, 2426.77f, 2750.38f, 133.24f, 2.14f, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 125000);
- break;
- case 3734: //duro
- if ((player->GetQuestStatus(10322) == QUEST_STATUS_INCOMPLETE || player->GetQuestStatus(10338) == QUEST_STATUS_INCOMPLETE) &&
- player->HasItemCount(29397))
- manaforge = player->SummonCreature(ENTRY_DURO_C_CONSOLE, 2976.48f, 2183.29f, 163.20f, 1.85f, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 125000);
- break;
- case 3722: //ara
- if ((player->GetQuestStatus(10323) == QUEST_STATUS_INCOMPLETE || player->GetQuestStatus(10365) == QUEST_STATUS_INCOMPLETE) &&
- player->HasItemCount(29411))
- manaforge = player->SummonCreature(ENTRY_ARA_C_CONSOLE, 4013.71f, 4028.76f, 192.10f, 1.25f, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 125000);
- break;
- }
-
- if (manaforge)
- {
- ENSURE_AI(npc_manaforge_control_console::npc_manaforge_control_consoleAI, manaforge->AI())->someplayer = player->GetGUID();
- ENSURE_AI(npc_manaforge_control_console::npc_manaforge_control_consoleAI, manaforge->AI())->goConsole = go->GetGUID();
- go->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_IN_USE);
- }
- return true;
- }
-};
-
-/*######
## npc_commander_dawnforge
######*/
@@ -1054,8 +735,6 @@ class go_captain_tyralius_prison : public GameObjectScript
void AddSC_netherstorm()
{
- new go_manaforge_control_console();
- new npc_manaforge_control_console();
new npc_commander_dawnforge();
new at_commander_dawnforge();
new npc_professor_dabiri();
diff --git a/src/server/scripts/Pet/pet_hunter.cpp b/src/server/scripts/Pet/pet_hunter.cpp
index 7dbdc7af63f..8fd6cb54b0e 100644
--- a/src/server/scripts/Pet/pet_hunter.cpp
+++ b/src/server/scripts/Pet/pet_hunter.cpp
@@ -57,7 +57,7 @@ class npc_pet_hunter_snake_trap : public CreatureScript
me->SetMaxHealth(uint32(107 * (me->getLevel() - 40) * 0.025f));
// Add delta to make them not all hit the same time
uint32 delta = (rand32() % 7) * 100;
- me->SetAttackTime(BASE_ATTACK, Info->baseattacktime + delta);
+ me->SetAttackTime(BASE_ATTACK, Info->BaseAttackTime + delta);
//me->SetStatFloatValue(UNIT_FIELD_RANGED_ATTACK_POWER, float(Info->attackpower));
// Start attacking attacker of owner on first ai update after spawn - move in line of sight may choose better target
diff --git a/src/server/scripts/Spells/spell_item.cpp b/src/server/scripts/Spells/spell_item.cpp
index c4bd473f1d1..70451888c07 100644
--- a/src/server/scripts/Spells/spell_item.cpp
+++ b/src/server/scripts/Spells/spell_item.cpp
@@ -991,7 +991,7 @@ class spell_item_unsated_craving : public SpellScriptLoader
return false;
Unit* target = procInfo.GetActionTarget();
- if (!target || target->GetTypeId() != TYPEID_UNIT || target->GetCreatureType() == CREATURE_TYPE_CRITTER || (target->GetEntry() != NPC_SINDRAGOSA && target->IsSummon()))
+ if (!target || target->GetTypeId() != TYPEID_UNIT || target->IsCritter() || (target->GetEntry() != NPC_SINDRAGOSA && target->IsSummon()))
return false;
return true;
diff --git a/src/server/shared/Database/Implementation/WorldDatabase.cpp b/src/server/shared/Database/Implementation/WorldDatabase.cpp
index 53f3b5519cd..e5aeaf46c15 100644
--- a/src/server/shared/Database/Implementation/WorldDatabase.cpp
+++ b/src/server/shared/Database/Implementation/WorldDatabase.cpp
@@ -76,7 +76,7 @@ void WorldDatabaseConnection::DoPrepareStatements()
PrepareStatement(WORLD_SEL_WAYPOINT_SCRIPT_ID_BY_GUID, "SELECT id FROM waypoint_scripts WHERE guid = ?", CONNECTION_SYNCH);
PrepareStatement(WORLD_DEL_CREATURE, "DELETE FROM creature WHERE guid = ?", CONNECTION_ASYNC);
PrepareStatement(WORLD_SEL_COMMANDS, "SELECT name, permission, help FROM command", CONNECTION_SYNCH);
- PrepareStatement(WORLD_SEL_CREATURE_TEMPLATE, "SELECT difficulty_entry_1, difficulty_entry_2, difficulty_entry_3, KillCredit1, KillCredit2, modelid1, modelid2, modelid3, modelid4, name, subname, IconName, gossip_menu_id, minlevel, maxlevel, exp, exp_unk, faction, npcflag, speed_walk, speed_run, scale, rank, mindmg, maxdmg, dmgschool, attackpower, dmg_multiplier, baseattacktime, rangeattacktime, unit_class, unit_flags, unit_flags2, dynamicflags, family, trainer_type, trainer_class, trainer_race, minrangedmg, maxrangedmg, rangedattackpower, type, type_flags, type_flags2, lootid, pickpocketloot, skinloot, resistance1, resistance2, resistance3, resistance4, resistance5, resistance6, spell1, spell2, spell3, spell4, spell5, spell6, spell7, spell8, PetSpellDataId, VehicleId, mingold, maxgold, AIName, MovementType, InhabitType, HoverHeight, Health_mod, Mana_mod, Mana_mod_extra, Armor_mod, RacialLeader, questItem1, questItem2, questItem3, questItem4, questItem5, questItem6, movementId, RegenHealth, mechanic_immune_mask, flags_extra, ScriptName FROM creature_template WHERE entry = ?", CONNECTION_SYNCH);
+ PrepareStatement(WORLD_SEL_CREATURE_TEMPLATE, "SELECT entry, difficulty_entry_1, difficulty_entry_2, difficulty_entry_3, KillCredit1, KillCredit2, modelid1, modelid2, modelid3, modelid4, name, femaleName, subname, IconName, gossip_menu_id, minlevel, maxlevel, exp, exp_unk, faction, npcflag, speed_walk, speed_run, scale, rank, dmgschool, BaseAttackTime, RangeAttackTime, BaseVariance, RangeVariance, unit_class, unit_flags, unit_flags2, dynamicflags, family, trainer_type, trainer_class, trainer_race, type, type_flags, type_flags2, lootid, pickpocketloot, skinloot, resistance1, resistance2, resistance3, resistance4, resistance5, resistance6, spell1, spell2, spell3, spell4, spell5, spell6, spell7, spell8, PetSpellDataId, VehicleId, mingold, maxgold, AIName, MovementType, InhabitType, HoverHeight, HealthModifier, ManaModifier, ManaModifierExtra, ArmorModifier, DamageModifier, ExperienceModifier, RacialLeader, questItem1, questItem2, questItem3, questItem4, questItem5, questItem6, movementId, RegenHealth, mechanic_immune_mask, flags_extra, ScriptName FROM creature_template WHERE entry = ?", CONNECTION_SYNCH);
PrepareStatement(WORLD_SEL_WAYPOINT_SCRIPT_BY_ID, "SELECT guid, delay, command, datalong, datalong2, dataint, x, y, z, o FROM waypoint_scripts WHERE id = ?", CONNECTION_SYNCH);
PrepareStatement(WORLD_SEL_ITEM_TEMPLATE_BY_NAME, "SELECT entry FROM item_template WHERE name = ?", CONNECTION_SYNCH);
PrepareStatement(WORLD_SEL_CREATURE_BY_ID, "SELECT guid FROM creature WHERE id = ?", CONNECTION_SYNCH);
@@ -89,6 +89,4 @@ void WorldDatabaseConnection::DoPrepareStatements()
PrepareStatement(WORLD_INS_DISABLES, "INSERT INTO disables (entry, sourceType, flags, comment) VALUES (?, ?, ?, ?)", CONNECTION_ASYNC);
PrepareStatement(WORLD_SEL_DISABLES, "SELECT entry FROM disables WHERE entry = ? AND sourceType = ?", CONNECTION_SYNCH);
PrepareStatement(WORLD_DEL_DISABLES, "DELETE FROM disables WHERE entry = ? AND sourceType = ?", CONNECTION_ASYNC);
- // 0: uint8
- PrepareStatement(WORLD_SEL_REQ_XP, "SELECT xp_for_next_level FROM player_xp_for_level WHERE lvl = ?", CONNECTION_SYNCH);
}
diff --git a/src/server/shared/Database/Implementation/WorldDatabase.h b/src/server/shared/Database/Implementation/WorldDatabase.h
index 625dfc68ce6..8a5bd206021 100644
--- a/src/server/shared/Database/Implementation/WorldDatabase.h
+++ b/src/server/shared/Database/Implementation/WorldDatabase.h
@@ -110,7 +110,6 @@ enum WorldDatabaseStatements
WORLD_SEL_DISABLES,
WORLD_INS_DISABLES,
WORLD_DEL_DISABLES,
- WORLD_SEL_REQ_XP,
MAX_WORLDDATABASE_STATEMENTS
};
diff --git a/src/server/shared/Networking/MessageBuffer.h b/src/server/shared/Networking/MessageBuffer.h
index 547b39130a4..c7f8ba31a71 100644
--- a/src/server/shared/Networking/MessageBuffer.h
+++ b/src/server/shared/Networking/MessageBuffer.h
@@ -40,6 +40,10 @@ public:
bool IsMessageReady() const { return _wpos == _storage.size(); }
+ size_type GetSize() const { return _storage.size(); }
+
+ size_type GetReadyDataSize() const { return _wpos; }
+
size_type GetMissingSize() const { return _storage.size() - _wpos; }
uint8* Data() { return _storage.data(); }
@@ -55,8 +59,6 @@ public:
void ResetWritePointer() { _wpos = 0; }
- size_type GetSize() const { return _storage.size(); }
-
std::vector<uint8>&& Move()
{
_wpos = 0;
diff --git a/src/server/shared/Networking/Socket.h b/src/server/shared/Networking/Socket.h
index dd638c059a5..a13a079ff6c 100644
--- a/src/server/shared/Networking/Socket.h
+++ b/src/server/shared/Networking/Socket.h
@@ -146,8 +146,8 @@ public:
uint8* GetHeaderBuffer() { return _readHeaderBuffer.Data(); }
uint8* GetDataBuffer() { return _readDataBuffer.Data(); }
- size_t GetHeaderSize() const { return _readHeaderBuffer.GetSize(); }
- size_t GetDataSize() const { return _readDataBuffer.GetSize(); }
+ size_t GetHeaderSize() const { return _readHeaderBuffer.GetReadyDataSize(); }
+ size_t GetDataSize() const { return _readDataBuffer.GetReadyDataSize(); }
MessageBuffer&& MoveHeader() { return std::move(_readHeaderBuffer); }
MessageBuffer&& MoveData() { return std::move(_readDataBuffer); }
diff --git a/src/server/shared/Threading/ProducerConsumerQueue.h b/src/server/shared/Threading/ProducerConsumerQueue.h
index accb0aebb11..a76b8b0b5c0 100644
--- a/src/server/shared/Threading/ProducerConsumerQueue.h
+++ b/src/server/shared/Threading/ProducerConsumerQueue.h
@@ -39,10 +39,8 @@ public:
void Push(const T& value)
{
- {
- std::lock_guard<std::mutex> lock(_queueLock);
- _queue.push(std::move(value));
- }
+ std::lock_guard<std::mutex> lock(_queueLock);
+ _queue.push(std::move(value));
_condition.notify_one();
}
@@ -72,10 +70,7 @@ public:
{
std::unique_lock<std::mutex> lock(_queueLock);
- while (_queue.empty() && !_shutdown)
- {
- _condition.wait(lock);
- }
+ _condition.wait(lock, [this]() { return !_queue.empty() || _shutdown; });
if (_queue.empty() || _shutdown)
return;