aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sql/updates/world/2013_04_03_02_world_sai.sql2
-rw-r--r--sql/updates/world/2013_05_21_00_world_trinity_strings.sql24
-rw-r--r--sql/updates/world/2013_05_21_01_world_misc.sql25
-rw-r--r--sql/updates/world/2013_05_22_00_world_sai.sql466
-rw-r--r--sql/updates/world/2013_05_22_01_world_gameobject.sql3
-rw-r--r--sql/updates/world/2013_05_22_02_world_sai.sql11
-rw-r--r--sql/updates/world/2013_05_22_03_world_sai.sql54
-rw-r--r--sql/updates/world/2013_05_23_00_world_misc.sql96
-rw-r--r--sql/updates/world/2013_05_23_01_world_misc.sql39
-rw-r--r--sql/updates/world/2013_05_24_00_world_misc.sql298
-rw-r--r--sql/updates/world/2013_05_26_00_world_sai.sql115
-rw-r--r--sql/updates/world/2013_05_26_01_world_sai.sql39
-rw-r--r--sql/updates/world/2013_05_26_02_world_sai.sql79
-rw-r--r--sql/updates/world/2013_05_26_03_world_sai.sql5
-rw-r--r--sql/updates/world/2013_05_26_04_world_waypoints.sql27
-rw-r--r--sql/updates/world/2013_05_26_05_world_misc.sql120
-rw-r--r--sql/updates/world/2013_05_26_05_world_waypoints.sql55
-rw-r--r--sql/updates/world/2013_05_27_00_world_sai.sql2
-rw-r--r--sql/updates/world/2013_05_30_00_world_misc.sql103
-rw-r--r--src/server/authserver/Authentication/AuthCodes.cpp1
-rw-r--r--src/server/authserver/Server/AuthSocket.cpp6
-rw-r--r--src/server/authserver/Server/RealmSocket.cpp4
-rw-r--r--src/server/collision/Management/VMapManager2.cpp3
-rw-r--r--src/server/collision/Maps/MapTree.cpp74
-rw-r--r--src/server/collision/Maps/MapTree.h3
-rw-r--r--src/server/collision/Maps/TileAssembler.cpp32
-rw-r--r--src/server/collision/Maps/TileAssembler.h4
-rw-r--r--src/server/collision/Models/WorldModel.cpp55
-rw-r--r--src/server/game/AI/CoreAI/UnitAI.cpp49
-rw-r--r--src/server/game/AI/SmartScripts/SmartScript.cpp26
-rw-r--r--src/server/game/AI/SmartScripts/SmartScriptMgr.h1
-rw-r--r--src/server/game/Achievements/AchievementMgr.cpp19
-rw-r--r--src/server/game/Battlefield/Zones/BattlefieldWG.h1
-rw-r--r--src/server/game/Battlegrounds/ArenaTeam.cpp36
-rw-r--r--src/server/game/Battlegrounds/ArenaTeam.h2
-rw-r--r--src/server/game/Chat/Chat.cpp4
-rw-r--r--src/server/game/Chat/Chat.h2
-rw-r--r--src/server/game/Entities/Creature/Creature.cpp38
-rw-r--r--src/server/game/Entities/Creature/GossipDef.cpp44
-rw-r--r--src/server/game/Entities/GameObject/GameObject.cpp5
-rw-r--r--src/server/game/Entities/Item/Item.cpp24
-rw-r--r--src/server/game/Entities/Item/Item.h4
-rw-r--r--src/server/game/Entities/Player/Player.cpp22
-rw-r--r--src/server/game/Entities/Transport/Transport.cpp22
-rw-r--r--src/server/game/Entities/Transport/Transport.h4
-rw-r--r--src/server/game/Entities/Unit/Unit.cpp13
-rw-r--r--src/server/game/Entities/Vehicle/Vehicle.cpp20
-rw-r--r--src/server/game/Entities/Vehicle/Vehicle.h4
-rw-r--r--src/server/game/Entities/Vehicle/VehicleDefines.h4
-rw-r--r--src/server/game/Handlers/ItemHandler.cpp24
-rw-r--r--src/server/game/Handlers/MailHandler.cpp10
-rw-r--r--src/server/game/Handlers/QuestHandler.cpp2
-rw-r--r--src/server/game/Miscellaneous/Language.h61
-rw-r--r--src/server/game/Movement/MotionMaster.h4
-rw-r--r--src/server/game/Movement/Spline/MoveSplineInit.cpp7
-rw-r--r--src/server/game/Scripting/ScriptLoader.cpp2
-rw-r--r--src/server/game/Server/Protocol/Opcodes.cpp37
-rw-r--r--src/server/game/Server/Protocol/Opcodes.h2
-rw-r--r--src/server/game/Server/WorldSession.h2
-rw-r--r--src/server/game/Spells/SpellEffects.cpp10
-rw-r--r--src/server/game/Spells/SpellMgr.cpp3
-rw-r--r--src/server/scripts/Commands/CMakeLists.txt1
-rw-r--r--src/server/scripts/Commands/cs_arena.cpp347
-rw-r--r--src/server/scripts/Commands/cs_misc.cpp382
-rw-r--r--src/server/scripts/Commands/cs_server.cpp3
-rw-r--r--src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kalecgos.cpp19
-rw-r--r--src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/boss_falric.cpp8
-rw-r--r--src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/boss_marwyn.cpp8
-rw-r--r--src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/halls_of_reflection.cpp950
-rw-r--r--src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/halls_of_reflection.h136
-rw-r--r--src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/instance_halls_of_reflection.cpp667
-rw-r--r--src/server/scripts/Northrend/Gundrak/gundrak.h31
-rw-r--r--src/server/scripts/Northrend/Gundrak/instance_gundrak.cpp334
-rw-r--r--src/server/scripts/Spells/spell_quest.cpp32
-rw-r--r--src/server/shared/Database/Implementation/CharacterDatabase.cpp7
-rwxr-xr-xsrc/server/shared/Database/Implementation/CharacterDatabase.h3
-rw-r--r--src/server/shared/Database/Implementation/LoginDatabase.cpp2
-rw-r--r--src/server/shared/Database/Implementation/WorldDatabase.cpp2
-rw-r--r--src/server/shared/Database/Implementation/WorldDatabase.h1
79 files changed, 3889 insertions, 1297 deletions
diff --git a/sql/updates/world/2013_04_03_02_world_sai.sql b/sql/updates/world/2013_04_03_02_world_sai.sql
index 8ae37e21ff2..83c968a2788 100644
--- a/sql/updates/world/2013_04_03_02_world_sai.sql
+++ b/sql/updates/world/2013_04_03_02_world_sai.sql
@@ -78,7 +78,7 @@ SET @VENOMTIP := 28358;
UPDATE `creature_template` SET `minlevel`=77, `maxlevel`=77, `exp`=2,`mindmg`=371, `maxdmg`=522,`attackpower`=478 WHERE `entry`IN (@GOREGEK,@DAJIK,@ZEPIK);
UPDATE `creature_template` SET `unit_flags` =33555200 WHERE `entry`IN (@MOSSWALKERBUNNY,@MISTWHISPERBUNNY,@SPEARBORNBUNNY,@KARTAKHOLDBUNNY,@SPARKTOUCHEDBUNNY,@SAPPHIREHIVEBUNNY,@LIFEBLOODPILLARBUNNY,@SKYREACHPILLARBUNNY);
UPDATE `creature_template` SET `AIName`= 'SmartAI' WHERE `entry` IN(@HO_SOOSAY,@ELDER_HARKEK,@SHAMAN_RAKJAK);
-DELETE FROM `creature_ai_scripts` WHERE `creature_id`IN(@HO_SOOSAY,@ELDER_HARKEK,@SHAMAN_RAKJAK);;
+DELETE FROM `creature_ai_scripts` WHERE `creature_id`IN(@HO_SOOSAY,@ELDER_HARKEK,@SHAMAN_RAKJAK);
DELETE FROM `smart_scripts` WHERE `entryorguid`IN(@HO_SOOSAY,@ELDER_HARKEK,@SHAMAN_RAKJAK);
INSERT INTO `smart_scripts` (`entryorguid`,`source_type`,`id`,`link`,`event_type`,`event_phase_mask`,`event_chance`,`event_flags`,`event_param1`,`event_param2`,`event_param3`,`event_param4`,`action_type`,`action_param1`,`action_param2`,`action_param3`,`action_param4`,`action_param5`,`action_param6`,`target_type`,`target_param1`,`target_param2`,`target_param3`,`target_x`,`target_y`,`target_z`,`target_o`,`comment`) VALUES
(@HO_SOOSAY, 0, 0, 0, 1, 0, 100, 0, 0, 0, 0, 0, 75, @O_STATE, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'High-Oracle Soo-say - Out of combat - Add Oracle State Aura'),
diff --git a/sql/updates/world/2013_05_21_00_world_trinity_strings.sql b/sql/updates/world/2013_05_21_00_world_trinity_strings.sql
new file mode 100644
index 00000000000..a8cae5aa19c
--- /dev/null
+++ b/sql/updates/world/2013_05_21_00_world_trinity_strings.sql
@@ -0,0 +1,24 @@
+DELETE FROM `trinity_string` WHERE entry IN (453, 548, 549, 550, 714, 716, 749, 752, 843, 844, 845, 846, 847, 848, 849, 850, 851, 852, 853, 854, 855, 856);
+INSERT INTO `trinity_string` (entry, content_default) VALUES
+(453,'│Player %s %s (guid: %u)'),
+(548,'│ GM Mode active, Phase: -1'),
+(549,'├─ Banned: (Type: %s, Reason: %s, Time: %s, By: %s)'),
+(550,'├─ Muted: (Reason: %s, Time: %s, By: %s)'),
+(714,'│ Account: %s (ID: %u), GMLevel: %u'),
+(716,'│ Last Login: %s (Failed Logins: %u)'),
+(749,'│ OS: %s - Latency: %u ms - Mail: %s'),
+(752,'│ Last IP: %s (Locked: %s)'),
+(843,'│ Level: %u (%u/%u XP (%u XP left))'),
+(844,'│ Race: %s %s, %s'),
+(845,'│ Alive ?: %s'),
+(846,'│ Phase: %u'),
+(847,'│ Money: %ug%us%uc'),
+(848,'│ Map: %s, Area: %s, Zone: %s'),
+(849,'│ Guild: %s (ID: %u)'),
+(850,'├─ Rank: %s'),
+(851,'├─ Note: %s'),
+(852,'├─ O. Note: %s'),
+(853,'│ Played time: %s'),
+(854,'└ Mails: %d Read/%I64u Total'),
+(855,'Male'),
+(856,'Female');
diff --git a/sql/updates/world/2013_05_21_01_world_misc.sql b/sql/updates/world/2013_05_21_01_world_misc.sql
new file mode 100644
index 00000000000..59a7c67833c
--- /dev/null
+++ b/sql/updates/world/2013_05_21_01_world_misc.sql
@@ -0,0 +1,25 @@
+DELETE FROM `command` WHERE `name` LIKE 'arena%';
+INSERT INTO `command` (`name`, `security`, `help`) VALUES
+('arena create', 3, 'Syntax: .arena create $name \"arena name\" #type\n\nA command to create a new Arena-team in game. #type = [2/3/5]'),
+('arena disband', 3, 'Syntax: .arena disband #TeamID\n\nA command to disband Arena-team in game.'),
+('arena rename', 3, 'Syntax: .arena rename \"oldname\" \"newname\"\n\nA command to rename Arena-team name.'),
+('arena captain', 3, 'Syntax: .arena captain #TeamID $name\n\nA command to set new captain to the team $name must be in the team'),
+('arena info', 2, 'Syntax: .arena info #TeamID\n\nA command that show info about arena team'),
+('arena lookup', 2, 'Syntax: .arena lookup $name\n\nA command that give a list of arenateam with the given $name');
+
+DELETE FROM `trinity_string` WHERE `entry` BETWEEN 857 AND 870;
+INSERT INTO `trinity_string` (`entry`, `content_default`) VALUES
+(857, 'Arena team [%u] not found'),
+(858, 'There is already an arena team named \"%s\"'),
+(859, '%s is already in an arena team of that size'),
+(860, 'Arena Team In Combat'),
+(861, 'Arena with name: \"%s\" or silmilar not found'),
+(862, '[%s] not member of the team \"%s\"'),
+(863, '[%s] already capitan in the team \"%s\"'),
+(864, 'New ArenaTeam created [Name: \"%s\"][Id: %u][Type: %u][Captain GUID: %u]'),
+(865, 'Arena team Name: \"%s\"[Id: %u] disbanded'),
+(866, 'Arena team [Id: %u] change from \"%s\" to \"%s\"'),
+(867, 'Arena team Name: \"%s\"[Id: %u] change capitan from[%s] to [%s]'),
+(868, 'Arena team: \"%s\"[%u] - Rating: %u - Type: %ux%u'),
+(869, 'Name:\"%s\"[guid:%u] - PR: %u - %s'),
+(870, '|\"%s\"[ID:%u](%ux%u)|');
diff --git a/sql/updates/world/2013_05_22_00_world_sai.sql b/sql/updates/world/2013_05_22_00_world_sai.sql
new file mode 100644
index 00000000000..d3dbd8185c0
--- /dev/null
+++ b/sql/updates/world/2013_05_22_00_world_sai.sql
@@ -0,0 +1,466 @@
+-- Matthias Lehner quest chain in Icecrown. Sniffed info.
+SET @GUID := 62064; -- Need 4 Matthias Lehner guids; one is already spawned.
+SET @CGUID := 142254; -- Needs 81 creature guids
+SET @OGUID := 76647; -- Needs 85 misc gameobject guids
+SET @MATT1 := 32408; -- Matthias Lehner (Near demolisher)
+SET @MATT2 := 32404; -- Matthias Lehner (1)
+SET @MATT3 := 32423; -- Matthias Lerner (2)
+SET @MATT4 := 32497; -- Matthias Lerner (3)
+SET @PLSP_FC := 58989; -- Prodigal Leader Force Cast
+SET @REF_DEMOLISHER := 32370; -- Refurbished Demolisher
+SET @DEMOLISHER := 31868; -- Wrecked Demolisher
+SET @L_CAPTAIN := 32414; -- Lordaeron Captain
+SET @L_FOOTSOLDIER := 31254; -- Lordaeron Footsoldier
+SET @G_MINION := 31276; -- Ghoulish Minion
+SET @SFKCB := 58988; -- Skeletal Footsoldier Kill Credit Base
+SET @TPL := 31268; -- The Prodigal Leader
+SET @NPC_LK := 32443; -- The Lich King
+SET @NPC_SIND := 32446; -- Sindragosa
+SET @LK := 32326; -- Lich King
+SET @ILLIDAN := 32588; -- Illidan Stormrage
+SET @BLOODSTAINED_S1 := 194023; -- GO:194023 Event:20722
+SET @BLOODSTAINED_S2 := 194024; -- GO:194024 Event:20723
+SET @BLOODSTAINED_S3 := 193980; -- GO:193980 Event:20724
+SET @EVENT_1 := 20722; -- Spell Event 1
+SET @EVENT_2 := 20723; -- Spell Event 2
+SET @EVENT_3 := 20724; -- Spell Event 3
+
+DELETE FROM `creature` WHERE `guid`=@GUID;
+INSERT INTO `creature` (`guid`,`id`,`map`,`spawnMask`,`phaseMask`,`modelid`,`equipment_id`,`position_x`,`position_y`,`position_z`,`orientation`,`spawntimesecs`,`spawndist`,`currentwaypoint`,`curhealth`,`curmana`,`MovementType`,`npcflag`,`unit_flags`,`dynamicflags`) VALUES
+(@GUID,@MATT1,571,1,1,0,0,7269.866,1178.146,317.4561,1.954769,300,0,0,12600,0,0,0,0,0);
+UPDATE `creature_template` SET `exp`=2,`npcflag`=0x2 WHERE `entry`=@MATT1;
+DELETE FROM `creature_template_addon` WHERE `entry`=@MATT1;
+INSERT INTO `creature_template_addon` (`entry`,`mount`,`bytes1`,`bytes2`,`auras`) VALUES
+(@MATT1,0,0x10000,0x1,'10848 49414'); -- Quest Invisibility, Shroud of Death
+
+-- Apply aura (Generic Quest Invisibility Detection 1) when Field Repairs has been rewarded
+DELETE FROM `spell_area` WHERE `spell`=49416 AND `area`=4537;
+INSERT INTO `spell_area` (`spell`,`area`,`quest_start`,`quest_end`,`aura_spell`,`racemask`,`gender`,`autocast`,`quest_start_status`,`quest_end_status`) VALUES
+(49416,4537,13393,13394,0,1101,2,1,64,9), -- Alliance
+(49416,4537,13304,13305,0,690,2,1,64,9); -- Horde
+-- Remove aura (Generic Quest Invisibility Detection 1) when "Do Your Worst" (13394/13305) has been completed
+
+UPDATE `creature_template` SET `exp`=2,`unit_flags`=0x20040000,`dynamicflags`=0x20,`npcflag`=0x2 WHERE `entry`=@DEMOLISHER;
+
+DELETE FROM `creature_addon` WHERE `guid`=122757; -- Guid based
+DELETE FROM `creature_template_addon` WHERE `entry`=@DEMOLISHER;
+INSERT INTO `creature_template_addon` (`entry`,`mount`,`bytes1`,`bytes2`,`auras`) VALUES
+(@DEMOLISHER,0,0x10000,0x1,'49415 29266'); -- Generic Quest Invisibility 2 & Permanent Feign Death
+
+-- Apply aura (Generic Quest Invisibility Detection 2) when "Field Repairs" has been taken
+DELETE FROM `spell_area` WHERE `spell`=49417 AND `area`=4537;
+INSERT INTO `spell_area` (`spell`,`area`,`quest_start`,`quest_end`,`aura_spell`,`racemask`,`gender`,`autocast`,`quest_start_status`,`quest_end_status`) VALUES
+(49417,4537,13393,13393,0,1101,2,1,11,11), -- Alliance
+(49417,4537,13304,13304,0,690,2,1,11,11); -- Horde
+-- Remove aura (Generic Quest Invisibility Detection 1) when Field Repairs has been rewarded
+
+UPDATE `creature_template` SET `exp`=2,`npcflag`=16777216 WHERE `entry`=@REF_DEMOLISHER;
+
+DELETE FROM `creature_template_addon` WHERE `entry`=@REF_DEMOLISHER;
+INSERT INTO `creature_template_addon` (`entry`,`mount`,`bytes1`,`bytes2`,`auras`) VALUES
+(@REF_DEMOLISHER,0,0x10000,0x1,'49414'); -- Generic Quest Invisibility 1
+
+DELETE FROM `npc_spellclick_spells` WHERE `npc_entry`=@REF_DEMOLISHER;
+INSERT INTO `npc_spellclick_spells` (`npc_entry`,`spell_id`,`cast_flags`,`user_type`) VALUES
+(@REF_DEMOLISHER,59724,1,0); -- Summon (Refurbished Demolisher)
+
+DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=18 AND `SourceGroup`=@REF_DEMOLISHER;
+INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`SourceId`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionTarget`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`NegativeCondition`,`ErrorType`,`ErrorTextId`,`ScriptName`,`Comment`) VALUES
+(18,@REF_DEMOLISHER,59724,0,0,9,0,13394,0,0,0,0,0,'','Requires quest to be active for spellclick'),
+(18,@REF_DEMOLISHER,59724,0,0,28,0,13394,0,0,1,0,0,'','Requires quest not to be completed for spellclick');
+
+
+DELETE FROM `creature` WHERE `guid`=@GUID+1;
+INSERT INTO `creature` (`guid`,`id`,`map`,`spawnMask`,`phaseMask`,`modelid`,`equipment_id`,`position_x`,`position_y`,`position_z`,`orientation`,`spawntimesecs`,`spawndist`,`currentwaypoint`,`curhealth`,`curmana`,`MovementType`,`npcflag`,`unit_flags`,`dynamicflags`) VALUES
+(@GUID+1,@REF_DEMOLISHER,571,1,1,0,0,7259.758,1176.801,316.8752,0.9599311,300,0,0,36860,0,0,0,0,0);
+
+-- Refurbished Demolisher (31830) -- The vehicle
+UPDATE `creature_template` SET `exp`=2,`spell1`=59733,`spell2`=50652,`spell3`=59737 WHERE `entry`=31830;
+
+UPDATE `creature_template` SET `exp`=2,`AIName`='SmartAI',`npcflag`=0x3,`gossip_menu_id`=10226 WHERE `entry`=@MATT2;
+
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@MATT2 AND `source_type`=0;
+INSERT INTO `smart_scripts` (`entryorguid`,`source_type`,`id`,`link`,`event_type`,`event_phase_mask`,`event_chance`,`event_flags`,`event_param1`,`event_param2`,`event_param3`,`event_param4`,`action_type`,`action_param1`,`action_param2`,`action_param3`,`action_param4`,`action_param5`,`action_param6`,`target_type`,`target_param1`,`target_param2`,`target_param3`,`target_x`,`target_y`,`target_z`,`target_o`,`comment`) VALUES
+(@MATT2,0,0,0,19,0,100,0,13395,0,0,0,11,@PLSP_FC,0,0,0,0,0,7,0,0,0,0,0,0,0,'On quest accept - Cast spell - Invoker'),
+(@MATT2,0,1,0,19,0,100,0,13236,0,0,0,11,@PLSP_FC,0,0,0,0,0,7,0,0,0,0,0,0,0,'On quest accept - Cast spell - Invoker');
+
+DELETE FROM `creature_template_addon` WHERE `entry`=@MATT2;
+INSERT INTO `creature_template_addon` (`entry`,`mount`,`bytes1`,`bytes2`,`auras`) VALUES
+(@MATT2,0,0x10000,0x1,'10848 49414'); -- Quest Invisibility, Shroud of Death
+
+DELETE FROM `gossip_menu` WHERE `entry`=10226 AND `text_id`=14218;
+INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES
+(10226,14218);
+
+DELETE FROM `creature` WHERE `guid`=@GUID+2;
+INSERT INTO `creature` (`guid`,`id`,`map`,`spawnMask`,`phaseMask`,`modelid`,`equipment_id`,`position_x`,`position_y`,`position_z`,`orientation`,`spawntimesecs`,`spawndist`,`currentwaypoint`,`curhealth`,`curmana`,`MovementType`,`npcflag`,`unit_flags`,`dynamicflags`) VALUES
+(@GUID+2,@MATT2,571,1,1,0,0,7587.631,1398.042,332.4734,0.8203048,300,0,0,12600,0,0,0,0,0);
+
+-- Apply aura (Generic Quest Invisibility Detection 1) when Do Your Worst has been completed|rewarded.
+DELETE FROM `spell_area` WHERE `spell`=49416 AND `area`=4622;
+INSERT INTO `spell_area` (`spell`,`area`,`quest_start`,`quest_end`,`aura_spell`,`racemask`,`gender`,`autocast`,`quest_start_status`,`quest_end_status`) VALUES
+(49416,4622,13394,13396,0,1101,2,1,66,11), -- Alliance
+(49416,4622,13305,13348,0,690,2,1,66,11); -- Horde
+-- Remove aura (Generic Quest Invisibility Detection 1) when Futility is rewarded
+
+UPDATE `creature_template` SET `exp`=2,`minlevel`=80,`maxlevel`=80 WHERE `entry`=@MATT3;
+
+DELETE FROM `creature` WHERE `guid`=@GUID+3;
+INSERT INTO `creature` (`guid`,`id`,`map`,`spawnMask`,`phaseMask`,`modelid`,`equipment_id`,`position_x`,`position_y`,`position_z`,`orientation`,`spawntimesecs`,`spawndist`,`currentwaypoint`,`curhealth`,`curmana`,`MovementType`,`npcflag`,`unit_flags`,`dynamicflags`) VALUES
+(@GUID+3,@MATT3,571,1,3,0,0,7854.05,957.014,450.898,0.628319,300,0,0,12600,0,0,0,0,0);
+
+DELETE FROM `creature_template_addon` WHERE `entry`=@MATT3;
+INSERT INTO `creature_template_addon` (`entry`,`mount`,`bytes1`,`bytes2`,`auras`) VALUES
+(@MATT3,0,0x10000,0x1,'10848 49414'); -- Quest Invisibility, Shroud of Death
+
+-- Apply aura (Generic Quest Invisibility Detection 1) when Sindragosa's Fall/Cradle of the Frostbrood has been Taken.
+DELETE FROM `spell_area` WHERE `spell`=49416 AND `area`=4533;
+INSERT INTO `spell_area` (`spell`,`area`,`quest_start`,`quest_end`,`aura_spell`,`racemask`,`gender`,`autocast`,`quest_start_status`,`quest_end_status`) VALUES
+(49416,4533,13397,13399,0,1101,2,1,74,11), -- Alliance
+(49416,4533,13349,13360,0,690,2,1,74,11); -- Horde
+-- Remove aura (Generic Quest Invisibility Detection 1) when Time for Answers is rewarded
+
+UPDATE `creature_template` SET `exp`=2,`minlevel`=80,`maxlevel`=80 WHERE `entry`=@MATT4;
+
+DELETE FROM `creature` WHERE `guid`=@GUID+4;
+INSERT INTO `creature` (`guid`,`id`,`map`,`spawnMask`,`phaseMask`,`modelid`,`equipment_id`,`position_x`,`position_y`,`position_z`,`orientation`,`spawntimesecs`,`spawndist`,`currentwaypoint`,`curhealth`,`curmana`,`MovementType`,`npcflag`,`unit_flags`,`dynamicflags`) VALUES
+(@GUID+4,@MATT4,571,1,1,0,0,6369.59,2360.84,471.656,1.22173,300,0,0,12600,0,0,0,0,0);
+
+DELETE FROM `creature_template_addon` WHERE `entry`=@MATT4;
+INSERT INTO `creature_template_addon` (`entry`,`mount`,`bytes1`,`bytes2`,`auras`) VALUES
+(@MATT4,0,0x10000,0x1,'10848 49414'); -- Quest Invisibility, Shroud of Death
+
+-- Apply aura (Generic Quest Invisibility Detection 1) when Time for Answers has been completed/rewarded.
+DELETE FROM `spell_area` WHERE `spell`=49416 AND `area`=4519;
+INSERT INTO `spell_area` (`spell`,`area`,`quest_start`,`quest_end`,`aura_spell`,`racemask`,`gender`,`autocast`,`quest_start_status`,`quest_end_status`) VALUES
+(49416,4519,13399,0,0,1101,2,1,66,0), -- Alliance
+(49416,4519,13360,0,0,690,2,1,66,0); -- Horde
+-- Remove aura (Generic Quest Invisibility Detection 1) when
+
+-- Army of the Damned (13395/13236)
+-- http://www.youtube.com/watch?v=Rimu18yrSx8
+
+UPDATE `creature_template` SET `AIName`='SmartAI',`exp`=2,`spell1`=58912,`spell2`=58913,`spell3`=58916,`spell4`=58917,`speed_run`=0.992062866687775,`VehicleId`=269,`minlevel`=82,`maxlevel`=82,`unit_flags`=0x8,`baseattacktime`=3000,`unit_class`=2 WHERE `entry`=@TPL;
+
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@TPL AND `source_type`=0;
+INSERT INTO `smart_scripts` (`entryorguid`,`source_type`,`id`,`link`,`event_type`,`event_phase_mask`,`event_chance`,`event_flags`,`event_param1`,`event_param2`,`event_param3`,`event_param4`,`action_type`,`action_param1`,`action_param2`,`action_param3`,`action_param4`,`action_param5`,`action_param6`,`target_type`,`target_param1`,`target_param2`,`target_param3`,`target_x`,`target_y`,`target_z`,`target_o`,`comment`) VALUES
+(@TPL,0,0,0,8,0,100,0,@SFKCB,0,0,0,11,58987,0,0,0,0,0,23,0,0,0,0,0,0,0,'On Spellhit - Cast Spell - Owner'),
+(@TPL,0,1,0,27,0,100,1,0,0,0,0,45,1,1,0,0,0,0,11,@L_CAPTAIN,50,0,0,0,0,0,'On Passenger Boarded - Set Data - Creature Distance');
+
+
+DELETE FROM `creature_equip_template` WHERE `entry`=@TPL;
+INSERT INTO `creature_equip_template` (`entry`,`itemEntry1`,`itemEntry2`,`itemEntry3`) VALUES
+(@TPL,33475,0,0);
+
+DELETE FROM `spell_scripts` WHERE `id` IN (58916,58917);
+INSERT INTO `spell_scripts` (`id`,`effIndex`,`delay`,`command`,`datalong`,`datalong2`,`dataint`,`x`,`y`,`z`,`o`) VALUES
+(58916,0,0,15,58915,0,0,0,0,0,0),
+(58917,0,0,15,58919,0,0,0,0,0,0);
+
+DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=13 AND `SourceEntry` IN (58916,58917);
+INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`SourceId`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionTarget`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`NegativeCondition`,`ErrorType`,`ErrorTextId`,`ScriptName`,`Comment`) VALUES
+(13,1,58916,0,0,31,0,3,@L_CAPTAIN,0,0,0,0,'','Gift of the Lich King target Lordaeron Captain'),
+(13,1,58916,0,1,31,0,3,@L_FOOTSOLDIER,0,0,0,0,'','Gift of the Lich King target Lordaeron Footsoldier'),
+(13,1,58916,0,0,36,0,0,0,0,1,0,0,'','Target needs to be dead'),
+(13,1,58916,0,1,36,0,0,0,0,1,0,0,'','Target needs to be dead'),
+(13,1,58917,0,0,31,0,3,@G_MINION,0,0,0,0,'','Consume Minions target Ghoulish Minion');
+
+
+DELETE FROM `creature` WHERE `guid` BETWEEN @CGUID+0 AND @CGUID+80;
+INSERT INTO `creature` (`guid`,`id`,`map`,`spawnMask`,`phaseMask`,`position_x`,`position_y`,`position_z`,`orientation`,`spawntimesecs`,`spawndist`,`curhealth`,`MovementType`) VALUES
+(@CGUID+0, @L_CAPTAIN, 571, 1, 2, 7590.981, 1393.571, 332.805, 1.396263, 120, 0, 12600, 0), -- @L_CAPTAIN (Area: 4622)
+(@CGUID+1, @L_FOOTSOLDIER, 571, 1, 2, 7597.618, 1305.04, 337.8358, 1.692969, 120, 0, 12600, 0), -- @L_FOOTSOLDIER (Area: 4622)
+(@CGUID+2, @L_FOOTSOLDIER, 571, 1, 2, 7592.61, 1305.417, 336.9066, 1.623156, 120, 0, 12600, 0), -- @L_FOOTSOLDIER (Area: 4622)
+(@CGUID+3, @L_FOOTSOLDIER, 571, 1, 2, 7587.983, 1305.996, 335.96, 1.570796, 120, 0, 12600, 0), -- @L_FOOTSOLDIER (Area: 4622)
+(@CGUID+4, @L_FOOTSOLDIER, 571, 1, 2, 7575.548, 1310.397, 333.8244, 1.43117, 120, 0, 12600, 0), -- @L_FOOTSOLDIER (Area: 4622)
+(@CGUID+5, @L_FOOTSOLDIER, 571, 1, 2, 7580.698, 1310.446, 334.4726, 1.500983, 120, 0, 12600, 0), -- @L_FOOTSOLDIER (Area: 4622)
+(@CGUID+6, @L_FOOTSOLDIER, 571, 1, 2, 7581.648, 1306.047, 334.8738, 1.518436, 120, 0, 12600, 0), -- @L_FOOTSOLDIER (Area: 4622)
+(@CGUID+7, @L_FOOTSOLDIER, 571, 1, 2, 7575.075, 1306.437, 333.991, 1.43117, 120, 0, 12600, 0), -- @L_FOOTSOLDIER (Area: 4622)
+(@CGUID+8, @L_FOOTSOLDIER, 571, 1, 2, 7581.489, 1318.208, 334.0107, 1.448623, 120, 0, 12600, 0), -- @L_FOOTSOLDIER (Area: 4622)
+(@CGUID+9, @L_FOOTSOLDIER, 571, 1, 2, 7576.248, 1318.982, 333.3188, 1.37881, 120, 0, 12600, 0), -- @L_FOOTSOLDIER (Area: 4622)
+(@CGUID+10, @L_FOOTSOLDIER, 571, 1, 2, 7592.329, 1309.999, 336.3537, 1.623156, 120, 0, 12600, 0), -- @L_FOOTSOLDIER (Area: 4622)
+(@CGUID+11, @L_FOOTSOLDIER, 571, 1, 2, 7586.704, 1310.507, 335.3659, 1.570796, 120, 0, 12600, 0), -- @L_FOOTSOLDIER (Area: 4622)
+(@CGUID+12, @L_FOOTSOLDIER, 571, 1, 2, 7598.781, 1325.946, 335.8446, 1.692969, 120, 0, 12600, 0), -- @L_FOOTSOLDIER (Area: 4622)
+(@CGUID+13, @L_FOOTSOLDIER, 571, 1, 2, 7594.156, 1325.512, 335.1556, 1.623156, 120, 0, 12600, 0), -- @L_FOOTSOLDIER (Area: 4622)
+(@CGUID+14, @L_FOOTSOLDIER, 571, 1, 2, 7588.168, 1325.119, 334.319, 1.553343, 120, 0, 12600, 0), -- @L_FOOTSOLDIER (Area: 4622)
+(@CGUID+15, @L_FOOTSOLDIER, 571, 1, 2, 7582.48, 1325.178, 333.5676, 1.466077, 120, 0, 12600, 0), -- @L_FOOTSOLDIER (Area: 4622)
+(@CGUID+16, @L_FOOTSOLDIER, 571, 1, 2, 7577.097, 1325.809, 332.8546, 1.37881, 120, 0, 12600, 0), -- @L_FOOTSOLDIER (Area: 4622)
+(@CGUID+17, @L_FOOTSOLDIER, 571, 1, 2, 7598.016, 1318.954, 336.3169, 1.675516, 120, 0, 12600, 0), -- @L_FOOTSOLDIER (Area: 4622)
+(@CGUID+18, @L_FOOTSOLDIER, 571, 1, 2, 7592.37, 1318.074, 335.5277, 1.58825, 120, 0, 12600, 0), -- @L_FOOTSOLDIER (Area: 4622)
+(@CGUID+19, @L_FOOTSOLDIER, 571, 1, 2, 7587.729, 1318.605, 334.7913, 1.53589, 120, 0, 12600, 0), -- @L_FOOTSOLDIER (Area: 4622)
+(@CGUID+20, @L_FOOTSOLDIER, 571, 1, 2, 7581.285, 1353.305, 331.5094, 1.343904, 120, 0, 12600, 0), -- @L_FOOTSOLDIER (Area: 4622)
+(@CGUID+21, @L_FOOTSOLDIER, 571, 1, 2, 7578.252, 1356.313, 331.3191, 1.239184, 120, 0, 12600, 0), -- @L_FOOTSOLDIER (Area: 4622)
+(@CGUID+22, @L_FOOTSOLDIER, 571, 1, 2, 7574.283, 1359.968, 331.2968, 1.099557, 120, 0, 12600, 0), -- @L_FOOTSOLDIER (Area: 4622)
+(@CGUID+23, @L_FOOTSOLDIER, 571, 1, 2, 7570.327, 1363.058, 330.5497, 0.9424778, 120, 0, 12600, 0), -- @L_FOOTSOLDIER (Area: 4622)
+(@CGUID+24, @L_FOOTSOLDIER, 571, 1, 2, 7566.075, 1366.799, 329.6888, 0.7853982, 120, 0, 12600, 0), -- @L_FOOTSOLDIER (Area: 4622)
+(@CGUID+25, @L_FOOTSOLDIER, 571, 1, 2, 7578.452, 1348.972, 331.6236, 1.291544, 120, 0, 12600, 0), -- @L_FOOTSOLDIER (Area: 4622)
+(@CGUID+26, @L_FOOTSOLDIER, 571, 1, 2, 7574.736, 1352.336, 330.9636, 1.186824, 120, 0, 12600, 0), -- @L_FOOTSOLDIER (Area: 4622)
+(@CGUID+27, @L_FOOTSOLDIER, 571, 1, 2, 7570.568, 1356.494, 330.5071, 1.047198, 120, 0, 12600, 0), -- @L_FOOTSOLDIER (Area: 4622)
+(@CGUID+28, @L_FOOTSOLDIER, 571, 1, 2, 7566.392, 1359.588, 329.7618, 0.9250245, 120, 0, 12600, 0), -- @L_FOOTSOLDIER (Area: 4622)
+(@CGUID+29, @L_FOOTSOLDIER, 571, 1, 2, 7562.342, 1362.778, 329.0039, 0.7853982, 120, 0, 12600, 0), -- @L_FOOTSOLDIER (Area: 4622)
+(@CGUID+30, @L_FOOTSOLDIER, 571, 1, 2, 7558.438, 1359.295, 328.2628, 0.7853982, 120, 0, 12600, 0), -- @L_FOOTSOLDIER (Area: 4622)
+(@CGUID+31, @L_FOOTSOLDIER, 571, 1, 2, 7562.093, 1356.335, 328.9453, 0.8901179, 120, 0, 12600, 0), -- @L_FOOTSOLDIER (Area: 4622)
+(@CGUID+32, @L_FOOTSOLDIER, 571, 1, 2, 7566.872, 1352.062, 329.6797, 1.029744, 120, 0, 12600, 0), -- @L_FOOTSOLDIER (Area: 4622)
+(@CGUID+33, @L_FOOTSOLDIER, 571, 1, 2, 7571.022, 1348.635, 330.5304, 1.151917, 120, 0, 12600, 0), -- @L_FOOTSOLDIER (Area: 4622)
+(@CGUID+34, @L_FOOTSOLDIER, 571, 1, 2, 7575.356, 1345.213, 331.7339, 1.256637, 120, 0, 12600, 0), -- @L_FOOTSOLDIER (Area: 4622)
+(@CGUID+35, @L_FOOTSOLDIER, 571, 1, 2, 7555.554, 1355.546, 328.1983, 0.7853982, 120, 0, 12600, 0), -- @L_FOOTSOLDIER (Area: 4622)
+(@CGUID+36, @L_FOOTSOLDIER, 571, 1, 2, 7558.832, 1352.613, 329.0146, 0.8901179, 120, 0, 12600, 0), -- @L_FOOTSOLDIER (Area: 4622)
+(@CGUID+37, @L_FOOTSOLDIER, 571, 1, 2, 7563.994, 1349.025, 329.8778, 1.012291, 120, 0, 12600, 0), -- @L_FOOTSOLDIER (Area: 4622)
+(@CGUID+38, @L_FOOTSOLDIER, 571, 1, 2, 7568.353, 1344.57, 330.5612, 1.134464, 120, 0, 12600, 0), -- @L_FOOTSOLDIER (Area: 4622)
+(@CGUID+39, @L_FOOTSOLDIER, 571, 1, 2, 7572.892, 1341.369, 331.6706, 1.239184, 120, 0, 12600, 0), -- @L_FOOTSOLDIER (Area: 4622)
+(@CGUID+40, @L_FOOTSOLDIER, 571, 1, 2, 7597.866, 1354.706, 334.6848, 1.762783, 120, 0, 12600, 0), -- @L_FOOTSOLDIER (Area: 4622)
+(@CGUID+41, @L_FOOTSOLDIER, 571, 1, 2, 7597.885, 1367.288, 334.5932, 1.867502, 120, 0, 12600, 0), -- @L_FOOTSOLDIER (Area: 4622)
+(@CGUID+42, @L_FOOTSOLDIER, 571, 1, 2, 7593.319, 1367.276, 333.7295, 1.692969, 120, 0, 12600, 0), -- @L_FOOTSOLDIER (Area: 4622)
+(@CGUID+43, @L_FOOTSOLDIER, 571, 1, 2, 7589.114, 1367.378, 332.953, 1.518436, 120, 0, 12600, 0), -- @L_FOOTSOLDIER (Area: 4622)
+(@CGUID+44, @L_FOOTSOLDIER, 571, 1, 2, 7583.886, 1367.601, 331.9132, 1.308997, 120, 0, 12600, 0), -- @L_FOOTSOLDIER (Area: 4622)
+(@CGUID+45, @L_FOOTSOLDIER, 571, 1, 2, 7579.366, 1368.245, 331.3056, 1.117011, 120, 0, 12600, 0), -- @L_FOOTSOLDIER (Area: 4622)
+(@CGUID+46, @L_FOOTSOLDIER, 571, 1, 2, 7598.125, 1372.082, 334.4693, 1.954769, 120, 0, 12600, 0), -- @L_FOOTSOLDIER (Area: 4622)
+(@CGUID+47, @L_FOOTSOLDIER, 571, 1, 2, 7593.253, 1372.027, 333.6238, 1.710423, 120, 0, 12600, 0), -- @L_FOOTSOLDIER (Area: 4622)
+(@CGUID+48, @L_FOOTSOLDIER, 571, 1, 2, 7589.304, 1371.93, 333.0089, 1.518436, 120, 0, 12600, 0), -- @L_FOOTSOLDIER (Area: 4622)
+(@CGUID+49, @L_FOOTSOLDIER, 571, 1, 2, 7584.049, 1372.177, 332.2688, 1.239184, 120, 0, 12600, 0), -- @L_FOOTSOLDIER (Area: 4622)
+(@CGUID+50, @L_FOOTSOLDIER, 571, 1, 2, 7579.457, 1372.116, 331.681, 1.047198, 120, 0, 12600, 0), -- @L_FOOTSOLDIER (Area: 4622)
+(@CGUID+51, @L_FOOTSOLDIER, 571, 1, 2, 7598.163, 1375.465, 334.3708, 2.042035, 120, 0, 12600, 0), -- @L_FOOTSOLDIER (Area: 4622)
+(@CGUID+52, @L_FOOTSOLDIER, 571, 1, 2, 7593.275, 1375.512, 333.6264, 1.745329, 120, 0, 12600, 0), -- @L_FOOTSOLDIER (Area: 4622)
+(@CGUID+53, @L_FOOTSOLDIER, 571, 1, 2, 7589.806, 1375.822, 333.1504, 1.53589, 120, 0, 12600, 0), -- @L_FOOTSOLDIER (Area: 4622)
+(@CGUID+54, @L_FOOTSOLDIER, 571, 1, 2, 7584.474, 1376.15, 332.5364, 1.186824, 120, 0, 12600, 0), -- @L_FOOTSOLDIER (Area: 4622)
+(@CGUID+55, @L_FOOTSOLDIER, 571, 1, 2, 7580.116, 1376.351, 331.8188, 0.9424778, 120, 0, 12600, 0), -- @L_FOOTSOLDIER (Area: 4622)
+(@CGUID+56, @L_FOOTSOLDIER, 571, 1, 2, 7573.417, 1379.314, 330.5734, 0.5759587, 120, 0, 12600, 0), -- @L_FOOTSOLDIER (Area: 4622)
+(@CGUID+57, @L_FOOTSOLDIER, 571, 1, 2, 7577.173, 1385.125, 331.072, 0.3839724, 120, 0, 12600, 0), -- @L_FOOTSOLDIER (Area: 4622)
+(@CGUID+58, @L_FOOTSOLDIER, 571, 1, 2, 7597.55, 1310.817, 337.1335, 1.692969, 120, 0, 12600, 0), -- @L_FOOTSOLDIER (Area: 4622)
+(@CGUID+59, @L_FOOTSOLDIER, 571, 1, 2, 7604.912, 1343.7, 336.2978, 1.867502, 120, 0, 12600, 0), -- @L_FOOTSOLDIER (Area: 4622)
+(@CGUID+60, @L_FOOTSOLDIER, 571, 1, 2, 7609.108, 1346.246, 336.7637, 1.954769, 120, 0, 12600, 0), -- @L_FOOTSOLDIER (Area: 4622)
+(@CGUID+61, @L_FOOTSOLDIER, 571, 1, 2, 7614.414, 1348.76, 337.1829, 2.094395, 120, 0, 12600, 0), -- @L_FOOTSOLDIER (Area: 4622)
+(@CGUID+62, @L_FOOTSOLDIER, 571, 1, 2, 7618.95, 1352.026, 337.3129, 2.199115, 120, 0, 12600, 0), -- @L_FOOTSOLDIER (Area: 4622)
+(@CGUID+63, @L_FOOTSOLDIER, 571, 1, 2, 7624.063, 1355.433, 337.9718, 2.321288, 120, 0, 12600, 0), -- @L_FOOTSOLDIER (Area: 4622)
+(@CGUID+64, @L_FOOTSOLDIER, 571, 1, 2, 7601.938, 1347.675, 335.5448, 1.832596, 120, 0, 12600, 0), -- @L_FOOTSOLDIER (Area: 4622)
+(@CGUID+65, @L_FOOTSOLDIER, 571, 1, 2, 7606.248, 1349.914, 336.0553, 1.937315, 120, 0, 12600, 0), -- @L_FOOTSOLDIER (Area: 4622)
+(@CGUID+66, @L_FOOTSOLDIER, 571, 1, 2, 7611.866, 1352.601, 336.4185, 2.076942, 120, 0, 12600, 0), -- @L_FOOTSOLDIER (Area: 4622)
+(@CGUID+67, @L_FOOTSOLDIER, 571, 1, 2, 7617.08, 1355.108, 336.8806, 2.216568, 120, 0, 12600, 0), -- @L_FOOTSOLDIER (Area: 4622)
+(@CGUID+68, @L_FOOTSOLDIER, 571, 1, 2, 7622.682, 1358.639, 337.6412, 2.356194, 120, 0, 12600, 0), -- @L_FOOTSOLDIER (Area: 4622)
+(@CGUID+69, @L_FOOTSOLDIER, 571, 1, 2, 7600.038, 1350.75, 334.9453, 1.797689, 120, 0, 12600, 0), -- @L_FOOTSOLDIER (Area: 4622)
+(@CGUID+70, @L_FOOTSOLDIER, 571, 1, 2, 7603.683, 1353.315, 335.4449, 1.902409, 120, 0, 12600, 0), -- @L_FOOTSOLDIER (Area: 4622)
+(@CGUID+71, @L_FOOTSOLDIER, 571, 1, 2, 7609.594, 1356.689, 336.257, 2.076942, 120, 0, 12600, 0), -- @L_FOOTSOLDIER (Area: 4622)
+(@CGUID+72, @L_FOOTSOLDIER, 571, 1, 2, 7614.948, 1359.268, 337.0087, 2.234021, 120, 0, 12600, 0), -- @L_FOOTSOLDIER (Area: 4622)
+(@CGUID+73, @L_FOOTSOLDIER, 571, 1, 2, 7621.068, 1362.548, 337.6258, 2.391101, 120, 0, 12600, 0), -- @L_FOOTSOLDIER (Area: 4622)
+(@CGUID+74, @L_FOOTSOLDIER, 571, 1, 2, 7601.229, 1356.915, 335.2959, 1.867502, 120, 0, 12600, 0), -- @L_FOOTSOLDIER (Area: 4622)
+(@CGUID+75, @L_FOOTSOLDIER, 571, 1, 2, 7607.468, 1359.978, 336.2152, 2.076942, 120, 0, 12600, 0), -- @L_FOOTSOLDIER (Area: 4622)
+(@CGUID+76, @L_FOOTSOLDIER, 571, 1, 2, 7613.156, 1363.574, 336.9086, 2.268928, 120, 0, 12600, 0), -- @L_FOOTSOLDIER (Area: 4622)
+(@CGUID+77, @L_FOOTSOLDIER, 571, 1, 2, 7618.365, 1366.665, 337.358, 2.426008, 120, 0, 12600, 0), -- @L_FOOTSOLDIER (Area: 4622)
+(@CGUID+78, @L_FOOTSOLDIER, 571, 1, 2, 7600.953, 1385.339, 334.186, 2.687807, 120, 0, 12600, 0), -- @L_FOOTSOLDIER (Area: 4622)
+(@CGUID+79, @L_FOOTSOLDIER, 571, 1, 2, 7608.228, 1378.985, 334.8071, 2.565634, 120, 0, 12600, 0), -- @L_FOOTSOLDIER (Area: 4622)
+(@CGUID+80, @L_FOOTSOLDIER, 571, 1, 2, 7604.285, 1378.747, 334.8669, 2.443461, 120, 0, 12600, 0); -- @L_FOOTSOLDIER (Area: 4622)
+
+-- Misc gameobjects
+DELETE FROM `gameobject` WHERE `guid` BETWEEN @OGUID+0 AND @OGUID+84;
+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, 193813, 571, 1, 2, 7541.28, 1320.396, 328.9124, -1.500982, 0, 0, 0, 1, 120, 255, 1), -- 193813 (Area: 4622)
+(@OGUID+1, 193814, 571, 1, 2, 7543.634, 1320.439, 329.0549, 2.775071, 0, 0, 0, 1, 120, 255, 1), -- 193814 (Area: 4622)
+(@OGUID+2, 193816, 571, 1, 2, 7545.142, 1315.035, 329.4462, -3.010669, 0, 0, 0, 1, 120, 255, 1), -- 193816 (Area: 4622)
+(@OGUID+3, 193817, 571, 1, 2, 7543.001, 1315.064, 329.2274, 0.130899, 0, 0, 0, 1, 120, 255, 1), -- 193817 (Area: 4622)
+(@OGUID+4, 193818, 571, 1, 2, 7540.648, 1315.594, 328.9768, 1.701696, 0, 0, 0, 1, 120, 255, 1), -- 193818 (Area: 4622)
+(@OGUID+5, 193819, 571, 1, 2, 7560.569, 1300.758, 333.2082, 1.806415, 0, 0, 0, 1, 120, 255, 1), -- 193819 (Area: 4622)
+(@OGUID+6, 193820, 571, 1, 2, 7554.927, 1309.58, 330.9437, -1.771509, 0, 0, 0, 1, 120, 255, 1), -- 193820 (Area: 4622)
+(@OGUID+7, 193807, 571, 1, 2, 7559.165, 1301.401, 332.9652, 2.015855, 0, 0, 0, 1, 120, 255, 1), -- 193807 (Area: 4622)
+(@OGUID+8, 193808, 571, 1, 2, 7561.399, 1303.66, 332.1848, 1.370081, 0, 0, 0, 1, 120, 255, 1), -- 193808 (Area: 4622)
+(@OGUID+9, 193809, 571, 1, 2, 7557.444, 1303.104, 331.5889, 1.30027, 0, 0, 0, 1, 120, 255, 1), -- 193809 (Area: 4622)
+(@OGUID+10, 193815, 571, 1, 2, 7542.429, 1320.442, 329.6358, 1.911133, 0, 0, 0, 1, 120, 255, 1), -- 193815 (Area: 4622)
+(@OGUID+11, 193800, 571, 1, 2, 7554.204, 1314.124, 330.6833, 2.338742, 0, 0, 0, 1, 120, 255, 1), -- 193800 (Area: 4622)
+(@OGUID+12, 193801, 571, 1, 2, 7545.629, 1307.18, 329.9126, 0.7243106, 0, 0, 0, 1, 120, 255, 1), -- 193801 (Area: 4622)
+(@OGUID+13, 193802, 571, 1, 2, 7541.902, 1316.621, 328.9081, 0.1134449, 0, 0, 0, 1, 120, 255, 1), -- 193802 (Area: 4622)
+(@OGUID+14, 193810, 571, 1, 2, 7557.45, 1303.402, 332.9673, -1.832593, 0, 0, 0, 1, 120, 255, 1), -- 193810 (Area: 4622)
+(@OGUID+15, 193821, 571, 1, 2, 7550.283, 1316.339, 329.959, 2.836153, 0, 0, 0, 1, 120, 255, 1), -- 193821 (Area: 4622)
+(@OGUID+16, 193822, 571, 1, 2, 7553.371, 1304.985, 331.0674, -2.277654, 0, 0, 0, 1, 120, 255, 1), -- 193822 (Area: 4622)
+(@OGUID+17, 193823, 571, 1, 2, 7551.499, 1304.395, 330.7182, 1.596977, 0, 0, 0, 1, 120, 255, 1), -- 193823 (Area: 4622)
+(@OGUID+18, 193824, 571, 1, 2, 7553.543, 1304.755, 331.1079, 0.9424764, 0, 0, 0, 1, 120, 255, 1), -- 193824 (Area: 4622)
+(@OGUID+19, 193825, 571, 1, 2, 7550.23, 1316.46, 330.6128, -2.330011, 0, 0, 0, 1, 120, 255, 1), -- 193825 (Area: 4622)
+(@OGUID+20, 193826, 571, 1, 2, 7556.107, 1309.794, 331.7017, 1.021015, 0, 0, 0, 1, 120, 255, 1), -- 193826 (Area: 4622)
+(@OGUID+21, 193827, 571, 1, 2, 7540.02, 1320.733, 329.4276, 1.596974, 0, 0, 0, 1, 120, 255, 1), -- 193827 (Area: 4622)
+(@OGUID+22, 193805, 571, 1, 2, 7560.395, 1300.322, 332.0938, -1.335177, 0, 0, 0, 1, 120, 255, 1), -- 193805 (Area: 4622)
+(@OGUID+23, 193811, 571, 1, 2, 7616.356, 1305.621, 341.7527, -1.553341, 0, 0, 0, 1, 120, 255, 1), -- 193811 (Area: 4622)
+(@OGUID+24, 193829, 571, 1, 2, 7628.698, 1313.042, 341.731, 2.510756, 0, 0, 0, 1, 120, 255, 1), -- 193829 (Area: 4622)
+(@OGUID+25, 193836, 571, 1, 2, 7623.703, 1306.834, 341.2804, -1.304631, 0, 0, 0, 1, 120, 255, 1), -- 193836 (Area: 4622)
+(@OGUID+26, 193837, 571, 1, 2, 7623.346, 1306.82, 341.664, 0.3035969, 0, 0, 0, 1, 120, 255, 1), -- 193837 (Area: 4622)
+(@OGUID+27, 193812, 571, 1, 2, 7616.432, 1305.333, 340.4039, 1.579521, 0, 0, 0, 1, 120, 255, 1), -- 193812 (Area: 4622)
+(@OGUID+28, 193839, 571, 1, 2, 7620.775, 1303.785, 341.3588, 1.776699, 0, 0, 0, 1, 120, 255, 1), -- 193839 (Area: 4622)
+(@OGUID+29, 193840, 571, 1, 2, 7619.116, 1305.521, 340.8146, -1.292454, 0, 0, 0, 1, 120, 255, 1), -- 193840 (Area: 4622)
+(@OGUID+30, 193833, 571, 1, 2, 7611.557, 1304.096, 341.6903, 2.46209, 0, 0, 0, 1, 120, 255, 1), -- 193833 (Area: 4622)
+(@OGUID+31, 193834, 571, 1, 2, 7611.44, 1305.623, 341.8747, 2.385941, 0, 0, 0, 1, 120, 255, 1), -- 193834 (Area: 4622)
+(@OGUID+32, 193828, 571, 1, 2, 7628.804, 1312.444, 341.1812, -0.5995114, 0, 0, 0, 1, 120, 255, 1), -- 193828 (Area: 4622)
+(@OGUID+33, 193830, 571, 1, 2, 7631.086, 1311.507, 341.5322, 2.199114, 0, 0, 0, 1, 120, 255, 1), -- 193830 (Area: 4622)
+(@OGUID+34, 193838, 571, 1, 2, 7628.428, 1307.566, 341.7274, 2.481837, 0, 0, 0, 1, 120, 255, 1), -- 193838 (Area: 4622)
+(@OGUID+35, 193831, 571, 1, 2, 7630.328, 1312.191, 341.3887, 1.474802, 0, 0, 0, 1, 120, 255, 1), -- 193831 (Area: 4622)
+(@OGUID+36, 193832, 571, 1, 2, 7631.078, 1312.427, 341.4087, 1.210786, 0, 0, 0, 1, 120, 255, 1), -- 193832 (Area: 4622)
+(@OGUID+37, 193845, 571, 1, 2, 7625.171, 1305.658, 341.5322, 2.274172, 0, 0, 0, 1, 120, 255, 1), -- 193845 (Area: 4622)
+(@OGUID+38, 193803, 571, 1, 2, 7634.984, 1315.54, 341.3336, 0.3839723, 0, 0, 0, 1, 120, 255, 1), -- 193803 (Area: 4622)
+(@OGUID+39, 193804, 571, 1, 2, 7612.716, 1303.828, 340.1033, 2.403463, 0, 0, 0, 1, 120, 255, 1), -- 193804 (Area: 4622)
+(@OGUID+40, 193799, 571, 1, 2, 7629.829, 1308.381, 341.4977, 2.495816, 0, 0, 0, 1, 120, 255, 1), -- 193799 (Area: 4622)
+(@OGUID+41, 193474, 571, 1, 2, 7594.459, 1387.242, 335.4896, 1.509709, 0, 0, 0, 1, 120, 255, 1), -- 193474 (Area: 4622)
+(@OGUID+42, 193477, 571, 1, 2, 7565.28, 1388.165, 328.3016, 2.646745, 0, 0, 0, 1, 120, 255, 1), -- 193477 (Area: 4622)
+(@OGUID+43, 193478, 571, 1, 2, 7573.998, 1396.272, 329.3516, 1.903219, 0, 0, 0, 1, 120, 255, 1), -- 193478 (Area: 4622)
+(@OGUID+44, 193479, 571, 1, 2, 7574.192, 1387.192, 330.1734, -0.721683, 0, 0, 0, 1, 120, 255, 1), -- 193479 (Area: 4622)
+(@OGUID+45, 193515, 571, 1, 2, 7572.924, 1386.133, 330.0977, -0.1943158, 0, 0, 0, 1, 120, 255, 1), -- 193515 (Area: 4622)
+(@OGUID+46, 193475, 571, 1, 2, 7594.464, 1387.608, 334.2297, -1.596976, 0, 0, 0, 1, 120, 255, 1), -- 193475 (Area: 4622)
+(@OGUID+47, 193511, 571, 1, 2, 7572.461, 1387.348, 329.9952, -2.310437, 0, 0, 0, 1, 120, 255, 1), -- 193511 (Area: 4622)
+(@OGUID+48, 193523, 571, 1, 2, 7569.051, 1379.311, 329.6375, 0.26714, 0, 0, 0, 1, 120, 255, 1), -- 193523 (Area: 4622)
+(@OGUID+49, 193524, 571, 1, 2, 7569.593, 1378.756, 331.6182, 0.2884431, 0, 0, 0, 1, 120, 255, 1), -- 193524 (Area: 4622)
+(@OGUID+50, 193525, 571, 1, 2, 7569.944, 1380.115, 331.8074, 0.2884431, 0, 0, 0, 1, 120, 255, 1), -- 193525 (Area: 4622)
+(@OGUID+51, 193526, 571, 1, 2, 7578.941, 1388.341, 331.1905, 2.510151, 0, 0, 0, 1, 120, 255, 1), -- 193526 (Area: 4622)
+(@OGUID+52, 193527, 571, 1, 2, 7578.064, 1388.368, 330.8582, 0.952802, 0, 0, 0, 1, 120, 255, 1), -- 193527 (Area: 4622)
+(@OGUID+53, 193528, 571, 1, 2, 7578.356, 1387.903, 331.3766, 2.996104, 0, 0, 0, 1, 120, 255, 1), -- 193528 (Area: 4622)
+(@OGUID+54, 193514, 571, 1, 2, 7587.764, 1391.348, 333.9012, 3.10851, 0, 0, 0, 1, 120, 255, 1), -- 193514 (Area: 4622)
+(@OGUID+55, 193472, 571, 1, 2, 7584.512, 1387.774, 335.2943, 1.52716, 0, 0, 0, 1, 120, 255, 1), -- 193472 (Area: 4622)
+(@OGUID+56, 193473, 571, 1, 2, 7584.511, 1388.14, 334.0347, -1.579522, 0, 0, 0, 1, 120, 255, 1), -- 193473 (Area: 4622)
+(@OGUID+57, 193510, 571, 1, 2, 7585.269, 1391.078, 333.9027, -2.382504, 0, 0, 0, 1, 120, 255, 1), -- 193510 (Area: 4622)
+(@OGUID+58, 193529, 571, 1, 2, 7611.424, 1384.339, 335.7021, 0.4115172, 0, 0, 0, 1, 120, 255, 1), -- 193529 (Area: 4622)
+(@OGUID+59, 193498, 571, 1, 2, 7608.75, 1388.728, 335.8158, -3.031208, 0, 0, 0, 1, 120, 255, 1), -- 193498 (Area: 4622)
+(@OGUID+60, 193512, 571, 1, 2, 7607.569, 1380.687, 334.6062, -2.615315, 0, 0, 0, 1, 120, 255, 1), -- 193512 (Area: 4622)
+(@OGUID+61, 193513, 571, 1, 2, 7602.882, 1392.214, 333.8481, 2.86819, 0, 0, 0, 1, 120, 255, 1), -- 193513 (Area: 4622)
+(@OGUID+62, 193499, 571, 1, 2, 7607.803, 1387.896, 334.5514, 1.181878, 0, 0, 0, 1, 120, 255, 1), -- 193499 (Area: 4622)
+(@OGUID+63, 193500, 571, 1, 2, 7607.761, 1388.981, 335.6974, 2.752486, 0, 0, 0, 1, 120, 255, 1), -- 193500 (Area: 4622)
+(@OGUID+64, 193501, 571, 1, 2, 7608.067, 1387.847, 335.6891, 1.57918, 0, 0, 0, 1, 120, 255, 1), -- 193501 (Area: 4622)
+(@OGUID+65, 193502, 571, 1, 2, 7606.78, 1387.013, 335.4621, 0.4406689, 0, 0, 0, 1, 120, 255, 1), -- 193502 (Area: 4622)
+(@OGUID+66, 193507, 571, 1, 2, 7603.438, 1393.474, 333.8636, 0.8205906, 0, 0, 0, 1, 120, 255, 1), -- 193507 (Area: 4622)
+(@OGUID+67, 193508, 571, 1, 2, 7604.211, 1394.048, 334.0117, 0.553567, 0, 0, 0, 1, 120, 255, 1), -- 193508 (Area: 4622)
+(@OGUID+68, 193521, 571, 1, 2, 7603.405, 1381.198, 334.5134, 1.028245, 0, 0, 0, 1, 120, 255, 1), -- 193521 (Area: 4622)
+(@OGUID+69, 193522, 571, 1, 2, 7609.946, 1383.467, 334.8445, 2.07127, 0, 0, 0, 1, 120, 255, 1), -- 193522 (Area: 4622)
+(@OGUID+70, 193505, 571, 1, 2, 7614.041, 1383.107, 335.3358, -1.199282, 0, 0, 0, 1, 120, 255, 1), -- 193505 (Area: 4622)
+(@OGUID+71, 193506, 571, 1, 2, 7604.289, 1393.07, 334.0316, -0.001746883, 0, 0, 0, 1, 120, 255, 1), -- 193506 (Area: 4622)
+(@OGUID+72, 193466, 571, 1, 2, 7603.318, 1390.261, 333.631, -1.944215, 0, 0, 0, 1, 120, 255, 1), -- 193466 (Area: 4622)
+(@OGUID+73, 193467, 571, 1, 2, 7611.13, 1380.281, 334.9095, -2.729541, 0, 0, 0, 1, 120, 255, 1), -- 193467 (Area: 4622)
+(@OGUID+74, 193503, 571, 1, 2, 7613.502, 1382.34, 335.2786, 0.381168, 0, 0, 0, 1, 120, 255, 1), -- 193503 (Area: 4622)
+(@OGUID+75, 193504, 571, 1, 2, 7613.352, 1382.993, 335.6254, 0.8341318, 0, 0, 0, 1, 120, 255, 1), -- 193504 (Area: 4622)
+(@OGUID+76, 193509, 571, 1, 2, 7600.531, 1392.637, 333.3486, 1.351323, 0, 0, 0, 1, 120, 255, 1), -- 193509 (Area: 4622)
+(@OGUID+77, 193806, 571, 1, 2, 7559.955, 1299.04, 333.1187, 2.809974, 0, 0, 0, 1, 120, 255, 1), -- 193806 (Area: 4622)
+(@OGUID+78, 193798, 571, 1, 2, 7554.067, 1301.211, 331.2181, 1.195549, 0, 0, 0, 1, 120, 255, 1), -- 193798 (Area: 4622)
+(@OGUID+79, 193841, 571, 1, 2, 7625.241, 1304.634, 341.6619, 2.192614, 0, 0, 0, 1, 120, 255, 1), -- 193841 (Area: 4622)
+(@OGUID+80, 193843, 571, 1, 2, 7626.075, 1302.194, 342.0533, 1.939992, 0, 0, 0, 1, 120, 255, 1), -- 193843 (Area: 4622)
+(@OGUID+81, 193842, 571, 1, 2, 7625.737, 1303.095, 341.8933, 2.157538, 0, 0, 0, 1, 120, 255, 1), -- 193842 (Area: 4622)
+(@OGUID+82, 193835, 571, 1, 2, 7621.549, 1301.871, 341.7209, -1.390356, 0, 0, 0, 1, 120, 255, 1), -- 193835 (Area: 4622)
+(@OGUID+83, 193797, 571, 1, 2, 7622.559, 1303.291, 341.1438, 1.823867, 0, 0, 0, 1, 120, 255, 1), -- 193797 (Area: 4622)
+(@OGUID+84, 193844, 571, 1, 2, 7626.616, 1302.82, 342.0193, 1.37313, 0, 0, 0, 1, 120, 255, 1); -- 193844 (Area: 4622)
+
+-- 193471
+UPDATE `gameobject` SET `phaseMask`=3 WHERE `guid`=62737;
+
+UPDATE `creature_template` SET `AIName`='SmartAI',`exp`=2,`minlevel`=80,`maxlevel`=80,`faction_A`=2136,`faction_H`=2136 WHERE `entry`=@L_FOOTSOLDIER;
+UPDATE `creature_template` SET `AIName`='SmartAI',`exp`=2,`minlevel`=80,`maxlevel`=80,`faction_A`=2136,`faction_H`=2136 WHERE `entry`=@L_CAPTAIN;
+
+DELETE FROM `smart_scripts` WHERE `entryorguid` IN (@L_CAPTAIN,@L_FOOTSOLDIER) AND `source_type`=0;
+INSERT INTO `smart_scripts` (`entryorguid`,`source_type`,`id`,`link`,`event_type`,`event_phase_mask`,`event_chance`,`event_flags`,`event_param1`,`event_param2`,`event_param3`,`event_param4`,`action_type`,`action_param1`,`action_param2`,`action_param3`,`action_param4`,`action_param5`,`action_param6`,`target_type`,`target_param1`,`target_param2`,`target_param3`,`target_x`,`target_y`,`target_z`,`target_o`,`comment`) VALUES
+ -- We hide the body; this way to prevent multiple ghoul spawns from the same body
+(@L_CAPTAIN,0,0,0,8,0,100,0,58916,0,0,0,47,0,0,0,0,0,0,1,0,0,0,0,0,0,0,'Lordaeron Captain - On Spellhit - Set Invisible'),
+(@L_CAPTAIN,0,1,0,38,0,100,0,1,1,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,'Lordaeron Captain - On Data Set - Talk'),
+(@L_FOOTSOLDIER,0,0,0,8,0,100,0,58916,0,0,0,47,0,0,0,0,0,0,1,0,0,0,0,0,0,0,'Lordaeron Footsoldier - On Spellhit -Set Invisible'),
+(@L_FOOTSOLDIER,0,1,0,4,0,100,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,'Lordaeron Footsoldier - On Aggro - Talk');
+
+
+DELETE FROM `creature_equip_template` WHERE `entry` IN (@L_CAPTAIN,@L_FOOTSOLDIER);
+INSERT INTO `creature_equip_template` (`entry`,`itemEntry1`,`itemEntry2`,`itemEntry3`) VALUES
+(@L_CAPTAIN,1895,0,36636), -- Lordaeron Captain @L_CAPTAIN
+(@L_FOOTSOLDIER,1895,0,36636); -- Lordaeron Footsoldier @L_FOOTSOLDIER
+
+DELETE FROM `creature_text` WHERE `entry` IN (@L_FOOTSOLDIER,@L_CAPTAIN);
+INSERT INTO `creature_text` (`entry`,`groupid`,`id`,`text`,`type`,`language`,`probability`,`emote`,`duration`,`sound`,`comment`) VALUES
+(@L_FOOTSOLDIER,0,0,'The undead are upon us!',12,0,10,0,0,0,'Lordaeron Footsoldier to Ghoulish Minion'),
+(@L_FOOTSOLDIER,0,1,'The rumors were true! The prince has gone mad!',12,0,10,0,0,0,'Lordaeron Footsoldier to Ghoulish Minion'),
+(@L_CAPTAIN,0,0,'You''ve come to address the men, sir?', 12,0,100,66,0,0,'Lordaeron Captain');
+
+UPDATE `creature_template` SET `AIName`='SmartAI',`speed_walk`=0.777776,`minlevel`=82,`maxlevel`=82,`unit_flags`=0x8 WHERE `entry`=@G_MINION;
+DELETE FROM `creature_template_addon` WHERE `entry`=@G_MINION;
+INSERT INTO `creature_template_addon` (`entry`,`mount`,`bytes1`,`bytes2`,`auras`) VALUES
+(@G_MINION,0,0x0,0x1,'58946'); -- Hate Aura
+
+
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@G_MINION AND `source_type`=0;
+INSERT INTO `smart_scripts` (`entryorguid`,`source_type`,`id`,`link`,`event_type`,`event_phase_mask`,`event_chance`,`event_flags`,`event_param1`,`event_param2`,`event_param3`,`event_param4`,`action_type`,`action_param1`,`action_param2`,`action_param3`,`action_param4`,`action_param5`,`action_param6`,`target_type`,`target_param1`,`target_param2`,`target_param3`,`target_x`,`target_y`,`target_z`,`target_o`,`comment`) VALUES
+(@G_MINION,0,0,0,54,0,100,1,0,0,0,0,11,@SFKCB,0,0,0,0,0,23,0,0,0,0,0,0,0,'On Just Summoned - Cast Spell - Owner');
+
+-- Where Dragons Fell (13398/13359)
+-- http://www.youtube.com/watch?v=v3FsLm1oY8k
+
+UPDATE `creature_template` SET `minlevel`=83, `maxlevel`=83, `exp`=2, `unit_class`=2, `InhabitType`=7 WHERE `entry`=@NPC_SIND;
+UPDATE `creature_template` SET `AIName`='SmartAI' WHERE `entry` IN (@NPC_LK,@NPC_SIND,@NPC_LK*100,@MATT3);
+DELETE FROM `smart_scripts` WHERE (`entryorguid` IN (@NPC_LK,@NPC_SIND,@MATT3,@NPC_LK*100) AND `source_type`IN (0,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
+(@MATT3,0,0,0,20,0,100,0,13398,1,0,0,12,@NPC_LK,1,27000,0,0,0,8,0,0,0,7863.779, 943.377, 451.502, 1.556,'Matthias Lehner - On Quest rewarded - Summon Lich King'),
+(@MATT3,0,1,0,20,0,100,0,13359,0,0,0,12,@NPC_LK,1,27000,0,0,0,8,0,0,0,7863.779, 943.377, 451.502, 1.556,'Matthias Lehner - On Quest rewarded - Summon Lich King '),
+
+(@NPC_LK,0,0,0,54,0,100,0,0,0,0,0,53,0,@NPC_LK,0,0,0,0,1,0,0,0,0,0,0,0,'Lich King - On Summoned - Start WP-Movement'),
+(@NPC_LK,0,1,2,58,0,100,0,1,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,'Lich King - On WP-End - Talk'),
+(@NPC_LK,0,2,3,61,0,100,0,0,0,0,0,90,8,0,0,0,0,0,1,0,0,0,0,0,0,0,'Lich King - On Link -Add unit field bytes - Kneel'),
+(@NPC_LK,0,3,4,61,0,100,0,0,0,0,0,12,@NPC_SIND,8,0,0,0,0,8,0,0,0,7837.523,1054.987,421.766,5.00,'Lich King - On WP-End - Summon Sindragosa'),
+(@NPC_LK,0,4,0,61,0,100,0,0,0,0,0,80,@NPC_LK*100,2,0,0,0,0,1,0,0,0,0,0,0,0,'Lich King - On Link - Start timed script'),
+(@NPC_LK,0,5,0,38,0,100,0,1,1,0,0,91,8,0,0,0,0,0,1,0,0,0,0,0,0,0,'Lich King - On data set - Remove unit field bytes'),
+(@NPC_LK*100,9,0,0,0,0,100,0,2000,2000,2000,2000,45,1,1,0,0,0,0,1,0,0,0,0,0,0,0,'Lich King - On Script - Set Data'),
+
+(@NPC_SIND,0,0,0,54,0,100,0,0,0,0,0,53,1,@NPC_SIND,0,0,0,0,1,0,0,0,0,0,0,0,'Sindragosa - On Summoned - Start WP-Movement'),
+(@NPC_SIND,0,1,2,58,0,100,0,1,0,0,0,45,1,1,0,0,0,0,1,0,0,0,0,0,0,0,'Sindragosa - On WP-Ended - Set Data on self'),
+(@NPC_SIND,0,2,3,61,0,100,0,1,1,0,0,46,200,0,0,0,0,0,1,0,0,0,0,0,0,0,'Sindragosa - On data set - Move forward'),
+(@NPC_SIND,0,3,0,61,0,100,0,0,0,0,0,41,15000,0,0,0,0,0,1,0,0,0,0,0,0,0,'Sindragosa - On data set - Despawn');
+
+DELETE FROM `creature_template_addon` WHERE entry =@NPC_SIND;
+INSERT INTO `creature_template_addon` (`entry`, `path_id`, `mount`, `bytes1`, `bytes2`, `emote`, `auras`) VALUES
+(@NPC_SIND,0,0,33554432,0,0,'43775');
+
+DELETE FROM `waypoints` WHERE `entry`=@NPC_LK;
+INSERT INTO `waypoints` (`entry`,`pointid`,`position_x`,`position_y`,`position_z`,`point_comment`) VALUES
+(@NPC_LK,1,7863.453, 960.661, 450.491,'Lich King - WP1');
+
+DELETE FROM `waypoints` WHERE `entry`=@NPC_SIND;
+INSERT INTO `waypoints` (`entry`,`pointid`,`position_x`,`position_y`,`position_z`,`point_comment`) VALUES
+(@NPC_SIND,1,7848.635,1027.209,480.763,'Sindragosa- WP1');
+
+DELETE FROM `creature_text` WHERE `entry`= @NPC_LK;
+INSERT INTO `creature_text` (`entry`,`groupid`,`id`,`text`,`type`,`language`,`probability`,`emote`,`duration`,`sound`,`comment`) VALUES
+(@NPC_LK,0,0,'Rise, Sindragosa! Rise and lead the Frostbrood into war!',12,0,100,16,0,0,'Lich King');
+
+
+-- The Hunter and the Prince (13400/13361)
+-- Bloodstained Stone
+-- GO:194023 Event:20722
+-- GO:194024 Event:20723
+-- GO:193980 Event:20724
+
+UPDATE `creature_template` SET `AIName`='SmartAI' WHERE `entry`=@MATT4;
+
+DELETE FROM `smart_scripts` WHERE (`entryorguid`=@MATT4 AND `source_type`=0) OR (`entryorguid` IN (@MATT4*100,@MATT4*100+1,@MATT4*100+2) AND `source_type`=9);
+INSERT INTO `smart_scripts` (`entryorguid`,`source_type`,`id`,`link`,`event_type`,`event_phase_mask`,`event_chance`,`event_flags`,`event_param1`,`event_param2`,`event_param3`,`event_param4`,`action_type`,`action_param1`,`action_param2`,`action_param3`,`action_param4`,`action_param5`,`action_param6`,`target_type`,`target_param1`,`target_param2`,`target_param3`,`target_x`,`target_y`,`target_z`,`target_o`,`comment`) VALUES
+(@MATT4,0,0,0,19,0,100,0,13400,0,0,0,87,@MATT4*100,@MATT4*100+1,@MATT4*100+2,0,0,0,1,0,0,0,0,0,0,0,'On Quest Accepted - Run Script - Self'),
+(@MATT4,0,1,0,19,0,100,0,13361,0,0,0,87,@MATT4*100,@MATT4*100+1,@MATT4*100+2,0,0,0,1,0,0,0,0,0,0,0,'On Quest Accepted - Run Script - Self'),
+(@MATT4*100,9,0,0,0,0,100,0,0,0,0,0,50,@BLOODSTAINED_S1,30000,0,0,0,0,8,0,0,0,6331.721,2360.052,477.274,0,'On Script - Summon GO - Location'),
+(@MATT4*100+1,9,0,0,0,0,100,0,0,0,0,0,50,@BLOODSTAINED_S2,30000,0,0,0,0,8,0,0,0,6359.744,2342.196,472.701,0,'On Script - Summon GO - Location'),
+(@MATT4*100+2,9,0,0,0,0,100,0,0,0,0,0,50,@BLOODSTAINED_S3,30000,0,0,0,0,8,0,0,0,6358.710,2383.027,474.682,0,'On Script - Summon GO - Location');
+
+-- LK
+UPDATE `creature_template` SET `AIName`='',`minlevel`=82,`maxlevel`=82,`EXP`=2,`mindmg`=417,`maxdmg`=582,`attackpower`=608,`baseattacktime`=3000,`unit_class`=2,`minrangedmg`=341,`maxrangedmg`=506,`rangedattackpower`=80,`spell1`=60617,`spell2`=60644,`spell3`=60672,`spell4`=60642,`VehicleId`=300 WHERE `entry`=@LK;
+UPDATE `creature_template` SET `Health_mod`=160,`EXP`=0,`rank`=3,`type_flags`=0,`AIName`='SmartAI',`faction_A`=14,`faction_H`=14,`minlevel`=82,`maxlevel`=82,`mindmg`=452,`maxdmg`=678,`attackpower`=169,`baseattacktime`=2000,`unit_class`=1,`minrangedmg`=362,`maxrangedmg`=542,`rangedattackpower`=135 WHERE `entry`= @ILLIDAN;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ILLIDAN AND `source_type`=0;
+INSERT INTO `smart_scripts` (`entryorguid`,`source_type`,`id`,`link`,`event_type`,`event_phase_mask`,`event_chance`,`event_flags`,`event_param1`,`event_param2`,`event_param3`,`event_param4`,`action_type`,`action_param1`,`action_param2`,`action_param3`,`action_param4`,`action_param5`,`action_param6`,`target_type`,`target_param1`,`target_param2`,`target_param3`,`target_x`,`target_y`,`target_z`,`target_o`,`comment`) VALUES
+(@ILLIDAN,0,0,0,54,0,100,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0, 'Illidan - On Just Summoned - Talk - Self'),
+(@ILLIDAN,0,1,0,0,0,100,0,15000,16000,15000,16000,11,60744,0,0,0,0,0,2,0,0,0,0,0,0,0, 'Illidan - In combat - Immolate'),
+(@ILLIDAN,0,2,0,0,0,100,0,6000,7000,6000,7000,11,61101,0,0,0,0,0,2,0,0,0,0,0,0,0, 'Illidan - In combat - Heart Rip'),
+(@ILLIDAN,0,4,0,0,0,100,0,19000,19000,19000,19000,11,60742,0,0,0,0,0,2,0,0,0,0,0,0,0, 'Illidan - In combat - Shear'),
+(@ILLIDAN,0,5,0,6,0,100,0,0,0,0,0,33,32797,0,0,0,0,0,21,20,0,0,0,0,0,0, 'Illidan - On death - Give quest credit');
+
+-- Removing spell from this table in order for Energize (60628) to refund mana.
+DELETE FROM `spell_proc_event` WHERE `entry`=60617;
+
+DELETE FROM `creature_text` WHERE `entry`=@ILLIDAN;
+INSERT INTO `creature_text` (`entry`,`groupid`,`id`,`TEXT`,`type`,`language`,`probability`,`emote`,`duration`,`sound`,`comment`) VALUES
+(@ILLIDAN,0,0,'Prepare to die!',12,0,100,0,0,0,'Illidan Stormrage');
+
+DELETE FROM `event_scripts` WHERE `id` IN (@EVENT1,@EVENT2,@EVENT3);
+INSERT INTO `event_scripts` (`id`,`delay`,`command`,`datalong`,`datalong2`,`dataint`,`x`,`y`,`z`,`o`) VALUES
+(@EVENT_1,0,10,@ILLIDAN,60000,0,6342.646,2399.023,478.483,5.5137),
+(@EVENT_2,0,10,@ILLIDAN,60000,0,6313.481,2345.141,479.379,1.0173),
+(@EVENT_3,0,10,@ILLIDAN,60000,0,6351.155,2315.504,474.698,1.2568);
+
+-- These don't work ...
+-- 61752 Illidan Kill Credit Master
+-- 61748 Illidan Kill Credit
+
+-- Addition Dr-j
+DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=18 AND `SourceGroup`=32370 AND `SourceEntry`=59724 AND `ConditionValue1`=13305;
+INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorType`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES
+(18,32370,59724,0,1,9,0,13305,0,0,0,0,0, '', 'Required quest active for spellclick'),
+(18,32370,59724,0,1,28,0,13305,0,0,1,0,0, '', 'Required quest not completed for spellclick');
diff --git a/sql/updates/world/2013_05_22_01_world_gameobject.sql b/sql/updates/world/2013_05_22_01_world_gameobject.sql
new file mode 100644
index 00000000000..2485b74969b
--- /dev/null
+++ b/sql/updates/world/2013_05_22_01_world_gameobject.sql
@@ -0,0 +1,3 @@
+-- Update Frozen Halls & ICC Meeting stone positions from 4.3.4 sniff
+UPDATE `gameobject` SET `position_x`=5633.551, `position_y`=2029.531, `position_z`=798.499, `orientation`=4.515394, `rotation2`=0.976296, `rotation3`=-0.2164396 WHERE `guid`=151101;
+UPDATE `gameobject` SET `position_x`=5842.831, `position_y`=2218.624, `position_z`=636.288, `orientation`=5.327191, `rotation2`=0.976296, `rotation3`=-0.2164396 WHERE `guid`=151102;
diff --git a/sql/updates/world/2013_05_22_02_world_sai.sql b/sql/updates/world/2013_05_22_02_world_sai.sql
new file mode 100644
index 00000000000..705fb879151
--- /dev/null
+++ b/sql/updates/world/2013_05_22_02_world_sai.sql
@@ -0,0 +1,11 @@
+-- Creature_AI to Smart_AI Conversion for Proto-Drake Egg (ID 23777)
+UPDATE `creature_template` SET `AIName`= 'SmartAI' WHERE `entry` =23777;
+DELETE FROM `creature_ai_scripts` WHERE `creature_id`=23777;
+DELETE FROM `smart_scripts` WHERE `entryorguid` =23777;
+INSERT INTO `smart_scripts` (`entryorguid`,`source_type`,`id`,`link`,`event_type`,`event_phase_mask`,`event_chance`,`event_flags`,`event_param1`,`event_param2`,`event_param3`,`event_param4`,`action_type`,`action_param1`,`action_param2`,`action_param3`,`action_param4`,`action_param5`,`action_param6`,`target_type`,`target_param1`,`target_param2`,`target_param3`,`target_x`,`target_y`,`target_z`,`target_o`,`comment`) VALUES
+(23777,0,0,1,25,0,100,0,0,0, 0, 0, 21 ,0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, "Proto-Drake Egg - On Spawn - Prevent Combat Movement"),
+(23777,0,1,0,61,0,100,0,0,0, 0, 0, 20 ,0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, "Proto-Drake Egg - Linked with Previous Event - Disable Combat"),
+(23777,0,2,3,8 ,0,100,0,46606,0, 0, 0, 12 ,24160, 1, 300000, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, "Proto-Drake Egg - On Spellhit Tillinghast's Plague Canister Dummy - Spawn Plagued Proto-Whelp"),
+(23777,0,3,0,61,0,100,0,0,0, 0, 0, 37 ,0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, "Proto-Drake Egg - Linked with Previous Event - Die"),
+(23777,0,4,0,6 ,1,100,0,0,0, 0, 0, 12 ,23688, 1, 300000, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, "Proto-Drake Egg - On Death - Spawn Proto-Whelp"),
+(23777,0,5,0,4, 0,100,1,0,0,0,0,23,1,0,0,0,0,0,1,0,0,0,0,0,0,0, "Proto-Drake Egg - On Aggro - Set Phase 2");
diff --git a/sql/updates/world/2013_05_22_03_world_sai.sql b/sql/updates/world/2013_05_22_03_world_sai.sql
new file mode 100644
index 00000000000..440739f9f82
--- /dev/null
+++ b/sql/updates/world/2013_05_22_03_world_sai.sql
@@ -0,0 +1,54 @@
+SET @MYSTIC := 430;
+SET @POACHER := 424;
+SET @SCOUT := 578;
+DELETE FROM `smart_scripts` WHERE entryorguid IN (@POACHER,@MYSTIC,@SCOUT);
+-- Redridge Poacher
+INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES
+(@POACHER, 0, 0, 1, 1, 0, 100, 0, 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Redridge Poacher - Out Of Combat - Allow Combat Movement'),
+(@POACHER, 0, 1, 0, 61, 0, 100, 0, 0, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Redridge Poacher - Out Of Combat - Start Auto Attack'),
+(@POACHER, 0, 2, 0, 4, 0, 10, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Redridge Poacher - On Aggro - Say Line 0'),
+(@POACHER, 0, 3, 4, 4, 0, 100, 0, 0, 0, 0, 0, 11, 6660, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 'Redridge Poacher - On Aggro - Cast Shoot'),
+(@POACHER, 0, 4, 0, 61, 0, 100, 0, 0, 0, 0, 0, 23, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Redridge Poacher - On Aggro - Increment Phase'),
+(@POACHER, 0, 5, 6, 9, 0, 100, 0, 5, 30, 3400, 3700, 11, 6660, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 'Redridge Poacher - At 5 - 30 Range - Cast Shoot'),
+(@POACHER, 0, 6, 0, 61, 0, 100, 0, 0, 0, 0, 0, 40, 2, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Redridge Poacher - At 5 - 30 Range - Display ranged weapon'),
+(@POACHER, 0, 7, 0, 9, 0, 100, 0, 25, 80, 0, 0, 21, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Redridge Poacher - At 25 - 80 Range - Allow Combat Movement'),
+(@POACHER, 0, 8, 0, 9, 0, 100, 0, 0, 5, 0, 0, 21, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Redridge Poacher - At 0 - 5 Range - Allow Combat Movement'),
+(@POACHER, 0, 9, 10, 9, 0, 100, 0, 0, 0, 0, 0, 40, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Redridge Poacher - At 0 - 5 Range - Display melee weapon'),
+(@POACHER, 0, 10, 0, 61, 0, 100, 0, 0, 0, 0, 0, 20, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Redridge Poacher - At 0 - 5 Range - Start Auto Attack'),
+(@POACHER, 0, 11, 0, 9, 0, 100, 0, 5, 15, 0, 0, 21, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Redridge Poacher - At 5 - 15 Range - Allow Combat Movement'),
+(@POACHER, 0, 12, 13, 2, 0, 100, 1, 0, 15, 0, 0, 21, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Redridge Poacher - At 15% HP - Allow Combat Movement'),
+(@POACHER, 0, 13, 0, 61, 0, 100, 0, 0, 0, 0, 0, 25, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 'Redridge Poacher - At 15% HP - Flee For Assist'),
+(@POACHER, 0, 14, 0, 7, 0, 100, 0, 0, 0, 0, 0, 40, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Redridge Poacher - On Evade - Display melee weapon');
+-- Redridge Mystic
+INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES
+(@MYSTIC, 0, 0, 0, 1, 0, 100, 1, 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Redridge Mystic - Out Of Combat - Allow Combat Movement'),
+(@MYSTIC, 0, 1, 0, 4, 0, 10, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Redridge Mystic - On Aggro - Say Line 0'),
+(@MYSTIC, 0, 2, 3, 4, 0, 100, 0, 0, 0, 0, 0, 11, 20802, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 'Redridge Mystic - On Aggro - Cast Lightning Bolt'),
+(@MYSTIC, 0, 3, 0, 61, 0, 100, 0, 0, 0, 0, 0, 23, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Redridge Mystic - On Aggro - Increment Phase'),
+(@MYSTIC, 0, 4, 0, 9, 0, 100, 0, 0, 40, 600, 1800, 11, 20802, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 'Redridge Mystic - At 0 - 40 Range - Cast Lightning Bolt'),
+(@MYSTIC, 0, 5, 6, 3, 0, 100, 0, 0, 15, 0, 0, 21, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Redridge Mystic - At 15% Mana - Allow Combat Movement'),
+(@MYSTIC, 0, 6, 0, 61, 0, 100, 0, 0, 0, 0, 0, 23, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Redridge Mystic - At 15% Mana - Increment Phase'),
+(@MYSTIC, 0, 7, 0, 9, 0, 100, 1, 35, 80, 0, 0, 21, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Redridge Mystic - At 35 - 80 Range - Allow Combat Movement'),
+(@MYSTIC, 0, 8, 0, 9, 0, 100, 1, 5, 15, 0, 0, 21, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Redridge Mystic - At 5 - 15 Range - Allow Combat Movement'),
+(@MYSTIC, 0, 9, 0, 9, 0, 100, 1, 0, 5, 0, 0, 21, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Redridge Mystic - At 0 - 5 Range - Allow Combat Movement'),
+(@MYSTIC, 0, 10, 0, 3, 0, 100, 0, 30, 100, 100, 100, 23, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Redridge Mystic - At 100% Mana - Increment Phase'),
+(@MYSTIC, 0, 11, 12, 14, 0, 100, 0, 0, 30, 35800, 35800, 11, 547, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'Redridge Mystic - On Friendly Unit At 0 - 30% Health - Cast Healing Wave'),
+(@MYSTIC, 0, 12, 0, 61, 0, 100, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Redridge Mystic - On Friendly Unit At 0 - 30% Health - Say Line 1'),
+(@MYSTIC, 0, 13, 14, 2, 0, 100, 1, 0, 15, 0, 0, 21, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Redridge Mystic - At 15% HP - Allow Combat Movement'),
+(@MYSTIC, 0, 14, 0, 61, 0, 100, 0, 0, 0, 0, 0, 25, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 'Redridge Mystic - At 15% HP - Flee For Assist');
+-- Murloc Scout
+INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES
+(@SCOUT, 0, 0, 1, 1, 0, 100, 0, 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Murloc Scout - Out Of Combat - Allow Combat Movement'),
+(@SCOUT, 0, 1, 0, 61, 0, 100, 0, 0, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Murloc Scout - Out Of Combat - Start Auto Attack'),
+(@SCOUT, 0, 2, 3, 4, 0, 100, 0, 0, 0, 0, 0, 11, 6660, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 'Murloc Scout - On Aggro - Cast Shoot'),
+(@SCOUT, 0, 3, 0, 61, 0, 100, 0, 0, 0, 0, 0, 23, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Murloc Scout - On Aggro - Increment Phase'),
+(@SCOUT, 0, 4, 5, 9, 0, 100, 0, 5, 30, 2600, 3700, 11, 6660, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 'Murloc Scout - At 5 - 30 Range - Cast Shoot'),
+(@SCOUT, 0, 5, 0, 61, 0, 100, 0, 0, 0, 0, 0, 40, 2, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Murloc Scout - At 5 - 30 Range - Display ranged weapon'),
+(@SCOUT, 0, 6, 0, 9, 0, 100, 0, 25, 80, 0, 0, 21, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Murloc Scout - At 25 - 80 Range - Allow Combat Movement'),
+(@SCOUT, 0, 7, 8, 9, 0, 100, 0, 0, 5, 0, 0, 21, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Murloc Scout - At 0 - 5 Range - Allow Combat Movement'),
+(@SCOUT, 0, 8, 9, 61, 0, 100, 0, 0, 0, 0, 0, 40, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Murloc Scout - At 0 - 5 Range - Display melee weapon'),
+(@SCOUT, 0, 9, 0, 61, 0, 100, 0, 0, 0, 0, 0, 20, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Murloc Scout - At 0 - 5 Range - Start Auto Attack'),
+(@SCOUT, 0, 10, 0, 9, 0, 100, 0, 5, 15, 0, 0, 21, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Murloc Scout - At 5 - 15 Range - Allow Combat Movement'),
+(@SCOUT, 0, 11, 12, 2, 0, 100, 1, 0, 15, 0, 0, 21, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Murloc Scout - At 15% HP - Allow Combat Movement'),
+(@SCOUT, 0, 12, 0, 61, 0, 100, 0, 0, 0, 0, 0, 25, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 'Murloc Scout - At 15% HP - Flee For Assist'),
+(@SCOUT, 0, 13, 0, 7, 0, 100, 0, 0, 0, 0, 0, 40, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Murloc Scout - On Evade - Display melee weapon');
diff --git a/sql/updates/world/2013_05_23_00_world_misc.sql b/sql/updates/world/2013_05_23_00_world_misc.sql
new file mode 100644
index 00000000000..b6b00ce7cf3
--- /dev/null
+++ b/sql/updates/world/2013_05_23_00_world_misc.sql
@@ -0,0 +1,96 @@
+SET @GUID := 62851;
+
+SET @TRIGGER := 4951;
+SET @ELM_BUNNY := 23837;
+SET @ELM_BUNNY_LARGE := 24110;
+SET @OACHANOA := 26648;
+SET @PEARL := 188422;
+
+UPDATE `gameobject_template` SET `AIName`='SmartGameObjectAI', `ScriptName`='' WHERE `entry`=@PEARL;
+UPDATE `creature_template` SET `speed_run`=2.14286, `faction_A`=190, `faction_H`=190, `unit_flags`=33536, `unit_flags2`=2080, `AIName`='SmartAI', `InhabitType`=4 WHERE `entry`=@OACHANOA;
+
+DELETE FROM `creature` WHERE `guid` BETWEEN @GUID+0 AND @GUID+3;
+INSERT INTO `creature` (`guid`,`id`,`map`,`spawnMask`,`phaseMask`,`modelid`,`equipment_id`,`position_x`,`position_y`,`position_z`,`orientation`,`spawntimesecs`,`spawndist`,`currentwaypoint`,`curhealth`,`curmana`,`MovementType`,`npcflag`,`unit_flags`,`dynamicflags`) VALUES
+(@GUID+0,@ELM_BUNNY,571,1,1,11686,0,2452.865,1722.222,61.8313,5.654867,300,0,0,42,0,0,0,0,0),
+(@GUID+1,@ELM_BUNNY_LARGE,571,1,1,11686,0,2427.382,1680.861,-0.05963766,2.356194,300,0,0,42,0,0,0,0,0),
+(@GUID+2,@ELM_BUNNY_LARGE,571,1,1,11686,0,2407.345,1733.472,7.560452,2.443461,300,0,0,42,0,0,0,0,0),
+(@GUID+3,@ELM_BUNNY_LARGE,571,1,1,11686,0,2436.226,1710.697,-0.01387666,5.183628,300,0,0,42,0,0,0,0,0);
+
+DELETE FROM `areatrigger_scripts` WHERE `entry`=@TRIGGER;
+INSERT INTO `areatrigger_scripts` (`entry`, `ScriptName`) VALUES
+(@TRIGGER,'SmartTrigger');
+
+DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=22 AND `SourceEntry`=@TRIGGER AND `SourceId`=2;
+DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=22 AND `SourceEntry`=@PEARL AND `SourceId`=1;
+INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`SourceId`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionTarget`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`NegativeCondition`,`ErrorTextId`,`ScriptName`,`Comment`) VALUES
+(22,1,@PEARL,1,0,9,0,12032,0,0,0,0,'','SAI only activates if player is on quest Conversing With the Depths'),
+(22,1,@TRIGGER,2,0,9,0,12032,0,0,0,0,'','SAI only activates if player is on quest Conversing With the Depths'),
+(22,1,@TRIGGER,2,0,1,0,47098,0,0,0,0,'','SAI only activates if player has aura Oacha''noa''s Compulsion');
+
+DELETE FROM `smart_scripts` WHERE `entryorguid` IN (-(@GUID+0),-(@GUID+1),-(@GUID+2),-(@GUID+3),@OACHANOA) AND `source_type`=0;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@PEARL AND `source_type`=1;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@TRIGGER AND `source_type`=2;
+DELETE FROM `smart_scripts` WHERE `entryorguid` IN (@OACHANOA*100,@OACHANOA*100+1,@PEARL*100) AND `source_type`=9;
+INSERT INTO `smart_scripts` (`entryorguid`,`source_type`,`id`,`link`,`event_type`,`event_phase_mask`,`event_chance`,`event_flags`,`event_param1`,`event_param2`,`event_param3`,`event_param4`,`action_type`,`action_param1`,`action_param2`,`action_param3`,`action_param4`,`action_param5`,`action_param6`,`target_type`,`target_param1`,`target_param2`,`target_param3`,`target_x`,`target_y`,`target_z`,`target_o`,`comment`) VALUES
+(-(@GUID+0),0,0,0,38,0,100,0,0,1,0,0,11,38497,0,0,0,0,0,1,0,0,0,0,0,0,0, 'ELM General Purpose Bunny - On data 0 1 set - Spellcast Cyclone Water Visual'),
+(-(@GUID+0),0,1,0,38,0,100,0,0,2,0,0,28,38497,0,0,0,0,0,1,0,0,0,0,0,0,0, 'ELM General Purpose Bunny - On data 0 2 set - Remove aura Cyclone Water Visual'),
+(-(@GUID+1),0,0,0,38,0,100,0,0,1,0,0,11,47479,0,0,0,0,0,1,0,0,0,0,0,0,0, 'ELM General Purpose Bunny Large - On data 0 1 set - Spellcast Water Spout'),
+(-(@GUID+2),0,0,0,38,0,100,0,0,1,0,0,11,45849,0,0,0,0,0,1,0,0,0,0,0,0,0, 'ELM General Purpose Bunny Large - On data 0 1 set - Spellcast Camera Shake - Tremor'),
+(-(@GUID+3),0,0,0,38,0,100,0,0,1,0,0,11,47479,0,0,0,0,0,1,0,0,0,0,0,0,0, 'ELM General Purpose Bunny Large - On data 0 1 set - Spellcast Water Spout'),
+
+(@OACHANOA,0,0,1,11,0,100,0,0,0,0,0,22,1,0,0,0,0,0,1,0,0,0,0,0,0,0, 'Oacha''noa - On Spawn - Set event phase 1'),
+(@OACHANOA,0,1,2,61,0,100,0,0,0,0,0,59,1,0,0,0,0,0,1,0,0,0,0,0,0,0, 'Oacha''noa - On Spawn - Set run'),
+(@OACHANOA,0,2,0,61,0,100,0,0,0,0,0,69,1,0,0,0,0,0,8,0,0,0,2367.975,1712.07,43.56623,0, 'Oacha''noa - On Spawn - Move to position'),
+(@OACHANOA,0,3,0,34,1,100,0,0,1,0,0,80,@OACHANOA*100,2,0,0,0,0,1,0,0,0,0,0,0,0, 'Oacha''noa - On movement inform (phase 1) - Run script 0'),
+(@OACHANOA,0,4,0,52,1,100,0,3,@OACHANOA,0,0,1,4,10100,0,0,0,0,1,0,0,0,0,0,0,0, 'Oacha''noa - On text 3 over (phase 1) - Say line'),
+(@OACHANOA,0,5,6,52,1,100,0,4,@OACHANOA,0,0,1,9,0,0,0,0,0,12,1,0,0,0,0,0,0, 'Oacha''noa - On text 4 over (phase 1) - Say line'),
+(@OACHANOA,0,6,7,61,0,100,0,0,0,0,0,6,12032,0,0,0,0,0,12,1,0,0,0,0,0,0, 'Oacha''noa - On text 4 over (phase 1) - Fail quest'),
+(@OACHANOA,0,7,0,61,0,100,0,0,0,0,0,41,2000,0,0,0,0,0,1,0,0,0,0,0,0,0, 'Oacha''noa - On text 4 over (phase 1) - Despawn after 2 seconds'),
+(@OACHANOA,0,8,9,38,1,100,0,0,1,0,0,22,0,0,0,0,0,0,1,0,0,0,0,0,0,0, 'Oacha''noa - On data 0 1 set (phase 1) - Set event phase 0'),
+(@OACHANOA,0,9,0,61,0,100,0,0,0,0,0,80,@OACHANOA*100+1,2,0,0,0,0,1,0,0,0,0,0,0,0, 'Oacha''noa - On data 0 1 set (phase 1) - Run script 1'),
+
+(@TRIGGER,2,0,0,46,0,100,0,0,0,0,0,45,0,1,0,0,0,0,14,21195,@PEARL,0,0,0,0,0, 'On trigger - Set data 0 1 Pearl of the Depths'),
+
+(@PEARL,1,0,0,70,0,100,0,2,0,0,0,80,@PEARL*100,2,0,0,0,0,1,0,0,0,0,0,0,0, 'Pearl of the Depths - On state changed - Run script'),
+(@PEARL,1,1,0,38,0,100,0,0,1,0,0,45,0,1,0,0,0,0,19,@OACHANOA,100,0,0,0,0,0, 'Pearl of the Depths - On data 0 1 set - Set data 0 1 Oacha''noa'),
+
+(@OACHANOA*100,9,0,0,0,0,100,0,0,0,0,0,66,0,0,0,0,0,0,12,1,0,0,0,0,0,0, 'Oacha''noa script 0 - Turn to'),
+(@OACHANOA*100,9,1,0,0,0,100,0,0,0,0,0,45,0,1,0,0,0,0,10,@GUID+1,@ELM_BUNNY_LARGE,0,0,0,0,0, 'Oacha''noa script 0 - Set data 0 1 ELM General Purpose Bunny Large'),
+(@OACHANOA*100,9,2,0,0,0,100,0,0,0,0,0,45,0,1,0,0,0,0,10,@GUID+2,@ELM_BUNNY_LARGE,0,0,0,0,0, 'Oacha''noa script 0 - Set data 0 1 ELM General Purpose Bunny Large'),
+(@OACHANOA*100,9,3,0,0,0,100,0,0,0,0,0,45,0,1,0,0,0,0,10,@GUID+3,@ELM_BUNNY_LARGE,0,0,0,0,0, 'Oacha''noa script 0 - Set data 0 1 ELM General Purpose Bunny Large'),
+(@OACHANOA*100,9,4,0,0,0,100,0,1200,1200,0,0,1,0,0,0,0,0,0,12,1,0,0,0,0,0,0, 'Oacha''noa script 0 - Say line'),
+(@OACHANOA*100,9,5,0,0,0,100,0,8500,8500,0,0,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0, 'Oacha''noa script 0 - Say line'),
+(@OACHANOA*100,9,6,0,0,0,100,0,9700,9700,0,0,1,2,0,0,0,0,0,1,0,0,0,0,0,0,0, 'Oacha''noa script 0 - Say line'),
+(@OACHANOA*100,9,7,0,0,0,100,0,0,0,0,0,11,47098,0,0,0,0,0,12,1,0,0,0,0,0,0, 'Oacha''noa script 0 - Spellcast Oacha''noa''s Compulsion'),
+(@OACHANOA*100,9,8,0,0,0,100,0,10900,10900,0,0,1,3,10000,0,0,0,0,1,0,0,0,0,0,0,0, 'Oacha''noa script 0 - Say line'),
+
+(@OACHANOA*100+1,9,0,0,0,0,100,0,0,0,0,0,15,12032,0,0,0,0,0,12,1,0,0,0,0,0,0, 'Oacha''noa script 1 - Complete quest'),
+(@OACHANOA*100+1,9,1,0,0,0,100,0,0,0,0,0,1,5,0,0,0,0,0,12,1,0,0,0,0,0,0, 'Oacha''noa script 1 - Say line'),
+(@OACHANOA*100+1,9,2,0,0,0,100,0,10600,10600,0,0,1,6,0,0,0,0,0,12,1,0,0,0,0,0,0, 'Oacha''noa script 1 - Say line'),
+(@OACHANOA*100+1,9,3,0,0,0,100,0,10800,10800,0,0,1,7,0,0,0,0,0,12,1,0,0,0,0,0,0, 'Oacha''noa script 1 - Say line'),
+(@OACHANOA*100+1,9,4,0,0,0,100,0,10700,10700,0,0,66,0,0,0,0,0,0,8,0,0,0,0,0,0,3.281219, 'Oacha''noa script 1 - Turn to'),
+(@OACHANOA*100+1,9,5,0,0,0,100,0,200,200,0,0,1,8,0,0,0,0,0,12,1,0,0,0,0,0,0, 'Oacha''noa script 1 - Say line'),
+(@OACHANOA*100+1,9,6,0,0,0,100,0,1000,1000,0,0,5,374,0,0,0,0,0,1,0,0,0,0,0,0,0, 'Oacha''noa script 1 - Play emote'),
+(@OACHANOA*100+1,9,7,0,0,0,100,0,0,0,0,0,4,11561,0,0,0,0,0,1,0,0,0,0,0,0,0, 'Oacha''noa script 1 - Play sound'),
+(@OACHANOA*100+1,9,8,0,0,0,100,0,2300,2300,0,0,41,0,0,0,0,0,0,1,0,0,0,0,0,0,0, 'Oacha''noa script 1 - Despawn'),
+
+(@PEARL*100,9,0,0,0,0,100,0,0,0,0,0,64,1,0,0,0,0,0,7,0,0,0,0,0,0,0, 'Pearl of the Depths script - Store targetlist'),
+(@PEARL*100,9,1,0,0,0,100,0,0,0,0,0,99,0,2,0,0,0,0,1,0,0,0,0,0,0,0, 'Pearl of the Depths script - Set state'),
+(@PEARL*100,9,2,0,0,0,100,0,0,0,0,0,45,0,1,0,0,0,0,10,@GUID+0,@ELM_BUNNY,0,0,0,0,0, 'Pearl of the Depths script - Set data 0 1 ELM General Purpose Bunny'),
+(@PEARL*100,9,3,0,0,0,100,0,20000,20000,0,0,45,0,2,0,0,0,0,10,@GUID+0,@ELM_BUNNY,0,0,0,0,0, 'Pearl of the Depths script - Set data 0 2 ELM General Purpose Bunny'),
+(@PEARL*100,9,4,0,0,0,100,0,0,0,0,0,12,@OACHANOA,8,0,0,0,0,8,0,0,0,2367.975,1712.07,0.232847,0, 'Pearl of the Depths script - Summon Oacha''noa'),
+(@PEARL*100,9,5,0,0,0,100,0,1000,1000,0,0,100,1,0,0,0,0,0,19,@OACHANOA,100,0,0,0,0,0, 'Pearl of the Depths script - Send targetlist'),
+(@PEARL*100,9,6,0,0,0,100,0,74000,74000,0,0,99,3,0,0,0,0,0,1,0,0,0,0,0,0,0, 'Pearl of the Depths script - Set state');
+
+DELETE FROM `creature_text` WHERE `entry`=@OACHANOA;
+INSERT INTO `creature_text` (`entry`,`groupid`,`id`,`text`,`type`,`language`,`probability`,`emote`,`duration`,`sound`,`comment`) VALUES
+(@OACHANOA,0,0,'Little $N, why do you call me forth? Are you working with the trolls of this land? Have you come to kill me and take my power as your own?',14,0,100,33,0,11557,'Oacha''noa'),
+(@OACHANOA,1,0,'I sense uncertainty in you, and I do not trust it whether you are with them, or not. If you wish my augury for the Kalu''ak, you will have to prove yourself first.',14,0,100,33,0,11557,'Oacha''noa'),
+(@OACHANOA,2,0,'I will lay a mild compulsion upon you. Jump into the depths before me so that you put yourself into my element and thereby display your submission.',14,0,100,33,0,11557,'Oacha''noa'),
+(@OACHANOA,3,0,'Though you are compelled, the choice, and the last step before you leap, are yours. You have twenty more seconds to decide.',14,0,100,33,0,11557,'Oacha''noa'),
+(@OACHANOA,4,0,'I''m rather curious as to what will happen, should you ignore this and NOT jump into the water.',14,0,100,33,0,11557,'Oacha''noa'),
+(@OACHANOA,5,0,'Well done, $N. Your display of respect is duly noted. Now, I have information for you that you must convey to the Kalu''ak.',14,0,100,33,0,11557,'Oacha''noa'),
+(@OACHANOA,6,0,'Simply put, you must tell the tuskarr that they cannot run. If they do so, their spirits will be destroyed by the evil rising within Northrend.',15,0,100,0,0,0,'Oacha''noa'),
+(@OACHANOA,7,0,'Tell the mystic that his people are to stand and fight alongside the Horde and Alliance against the forces of Malygos and the Lich King.',15,0,100,0,0,0,'Oacha''noa'),
+(@OACHANOA,8,0,'Now swim back with the knowledge I have granted you. Do what you can for them, $r.',15,0,100,0,0,0,'Oacha''noa'),
+(@OACHANOA,9,0,'Very well, $N, you have failed to act. The prophecy is not yours to learn. Do not call upon me again until you have found your backbone.',14,0,100,33,0,11557,'Oacha''noa');
diff --git a/sql/updates/world/2013_05_23_01_world_misc.sql b/sql/updates/world/2013_05_23_01_world_misc.sql
new file mode 100644
index 00000000000..143bc3410c6
--- /dev/null
+++ b/sql/updates/world/2013_05_23_01_world_misc.sql
@@ -0,0 +1,39 @@
+SET @NARVIR := 30299;
+SET @HEART := 192181;
+
+UPDATE `gameobject_template` SET `AIName`='SmartGameObjectAI' WHERE `entry`=@HEART;
+UPDATE `creature_template` SET `speed_run`=0.99206, `faction_H`=1954, `faction_A`=1954, `unit_flags`=768, `AIName`='SmartAI' WHERE `entry`=@NARVIR;
+
+DELETE FROM `creature_equip_template` WHERE `entry`=@NARVIR;
+INSERT INTO `creature_equip_template` (`entry`,`id`,`itemEntry1`,`itemEntry2`,`itemEntry3`) VALUES
+(@NARVIR,1,35727,0,0);
+
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@NARVIR AND `source_type`=0;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@HEART AND `source_type`=1;
+DELETE FROM `smart_scripts` WHERE `entryorguid` IN (@NARVIR*100,@HEART*100) AND `source_type`=9;
+INSERT INTO `smart_scripts` (`entryorguid`,`source_type`,`id`,`link`,`event_type`,`event_phase_mask`,`event_chance`,`event_flags`,`event_param1`,`event_param2`,`event_param3`,`event_param4`,`action_type`,`action_param1`,`action_param2`,`action_param3`,`action_param4`,`action_param5`,`action_param6`,`target_type`,`target_param1`,`target_param2`,`target_param3`,`target_x`,`target_y`,`target_z`,`target_o`,`comment`) VALUES
+(@NARVIR,0,0,0,11,0,100,0,0,0,0,0,80,@NARVIR*100,2,0,0,0,0,1,0,0,0,0,0,0,0, 'Overseer Narvir - On spawn - Run script'),
+(@NARVIR,0,1,2,8,0,100,0,40163,0,0,0,33,@NARVIR,0,0,0,0,0,12,1,0,0,0,0,0,0, 'Overseer Narvir - On spellhit Teleport - Quest credit'),
+(@NARVIR,0,2,0,61,0,100,0,0,0,0,0,41,0,0,0,0,0,0,1,0,0,0,0,0,0,0, 'Overseer Narvir - On spellhit Teleport - Despawn'),
+
+(@HEART,1,0,0,70,0,100,0,2,0,0,0,80,@HEART*100,2,0,0,0,0,1,0,0,0,0,0,0,0, 'The Heart of the Storm - On state changed - Run script'),
+
+(@NARVIR*100,9,0,0,0,0,100,0,20,20,0,0,11,56485,0,0,0,0,0,12,1,0,0,0,0,0,0, 'Overseer Narvir script - Spellcast The Storm''s Fury'),
+(@NARVIR*100,9,1,0,0,0,100,0,500,500,0,0,69,0,0,0,0,0,0,8,0,0,0,7312.406,-726.3165,791.6095,0, 'Overseer Narvir script - Move to position'),
+(@NARVIR*100,9,2,0,0,0,100,0,6500,6500,0,0,66,0,0,0,0,0,0,8,0,0,0,0,0,0,1.919862, 'Overseer Narvir script - Turn to'),
+(@NARVIR*100,9,3,0,0,0,100,0,1500,1500,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0, 'Overseer Narvir script - Say line'),
+(@NARVIR*100,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, 'Overseer Narvir script - Say line'),
+(@NARVIR*100,9,5,0,0,0,100,0,3000,3000,0,0,5,274,0,0,0,0,0,1,0,0,0,0,0,0,0, 'Overseer Narvir script - Play emote'),
+(@NARVIR*100,9,6,0,0,0,100,0,3000,3000,0,0,66,0,0,0,0,0,0,8,0,0,0,0,0,0,3.385939, 'Overseer Narvir script - Turn to'),
+(@NARVIR*100,9,7,0,0,0,100,0,500,500,0,0,17,69,0,0,0,0,0,1,0,0,0,0,0,0,0, 'Overseer Narvir script - Play emotestate'),
+(@NARVIR*100,9,8,0,0,0,100,0,3500,3500,0,0,17,0,0,0,0,0,0,1,0,0,0,0,0,0,0, 'Overseer Narvir script - Stop emotestate'),
+(@NARVIR*100,9,9,0,0,0,100,0,1500,1500,0,0,11,40163,0,0,0,0,0,1,0,0,0,0,0,0,0, 'Overseer Narvir script - Spellcast Teleport'),
+
+(@HEART*100,9,0,0,0,0,100,0,0,0,0,0,64,1,0,0,0,0,0,7,0,0,0,0,0,0,0, 'The Heart of the Storm script - Store targetlist'),
+(@HEART*100,9,1,0,0,0,100,0,0,0,0,0,12,@NARVIR,8,0,0,0,0,8,0,0,0,7313.231,-711.5209,791.6917,5.61996, 'The Heart of the Storm script - Summon Overseer Narvir'),
+(@HEART*100,9,2,0,0,0,100,0,10,10,0,0,100,1,0,0,0,0,0,19,@NARVIR,50,0,0,0,0,0, 'The Heart of the Storm script - Send targetlist to Overseer Narvir');
+
+DELETE FROM `creature_text` WHERE `entry`=@NARVIR;
+INSERT INTO `creature_text` (`entry`,`groupid`,`id`,`text`,`type`,`language`,`probability`,`emote`,`duration`,`sound`,`comment`) VALUES
+(@NARVIR,0,0,'You didn''t think that I was going to let you walk in here and take the Heart of the Storm, did you?',12,0,100,6,0,0,'Overseer Narvir'),
+(@NARVIR,1,0,'You may have killed Valduran, but that will not stop me from completing the colossus.',12,0,100,1,0,0,'Overseer Narvir');
diff --git a/sql/updates/world/2013_05_24_00_world_misc.sql b/sql/updates/world/2013_05_24_00_world_misc.sql
new file mode 100644
index 00000000000..4506dcb1cd3
--- /dev/null
+++ b/sql/updates/world/2013_05_24_00_world_misc.sql
@@ -0,0 +1,298 @@
+-- Halls Of Reflexion WIP
+
+DELETE FROM `creature` WHERE `guid` IN (202308,202294,202301,202293);
+-- extra spawned Uther -- 202294
+-- extra LK spawn -- 202301
+-- Loralen -- 202293
+-- Lady Jaina Proudmoore -- 202308
+INSERT INTO `creature` (`guid`, `id`, `map`, `spawnMask`, `phaseMask`, `modelid`, `equipment_id`, `position_x`, `position_y`, `position_z`, `orientation`, `spawntimesecs`, `spawndist`, `currentwaypoint`, `curhealth`, `curmana`, `MovementType`, `npcflag`, `unit_flags`, `dynamicflags`) VALUES
+(202308,38112,668,3,1,0,0,5276.583,2037.45,709.4025,5.532694,604800,0,0,0,0,0,0,0,0),
+(202294,38113,668,3,1,0,0,5342.232,1975.696,709.4025,2.391101,604800,0,0,0,0,0,0,0,0),
+(202301,36723,668,3,2,0,0,5415.538,2117.842,707.7781,3.944444,604800,0,0,0,0,0,0,0,0);
+-- Lady Jaina Proudmoore
+UPDATE `creature_template` SET `ScriptName`='npc_jaina_or_sylvanas_hor' WHERE `entry`=37221;
+-- Lady Sylvanas Windrunner
+UPDATE `creature_template` SET `ScriptName`='npc_jaina_or_sylvanas_hor' WHERE `entry`=37223;
+-- Frostmourne Altar Bunny (Quel'Delar)
+UPDATE `creature_template` SET `InhabitType`=4,`flags_extra`=128 WHERE `entry`=37704;
+-- Frostsworn General
+UPDATE `creature_template` SET `ScriptName`='npc_frostworn_general' WHERE `entry`=36723;
+UPDATE `creature_template` SET `faction_A`=16,`faction_H`=16 WHERE `entry`=37720; -- for hc
+-- Spiritual Reflection
+UPDATE `creature_template` SET /*`modelid1`=57,*/`ScriptName`='npc_spiritual_reflection' WHERE `entry`=37068;
+-- Falric and Marwyn bind players to instance on heroic
+UPDATE `creature_template` SET `flags_extra`=1 WHERE `entry` IN (38599,38603);
+
+DELETE FROM `areatrigger_scripts` WHERE `entry` IN (5697,5632);
+INSERT INTO `areatrigger_scripts` VALUES
+-- AreaTrigger for waves restarter
+(5697,'at_hor_waves_restarter'),
+-- AreaTrigger for intro start
+(5632,'at_hor_intro_start');
+
+DELETE FROM `creature_text` WHERE (`entry`=37226 AND `groupid` IN (3,4)) OR `entry`=36723 OR `entry`=36954 OR `entry`=36955 OR `entry`=37554 OR `entry`=30344 OR `entry`=30824;
+INSERT INTO `creature_text` (`entry`,`groupid`,`id`,`text`,`type`,`language`,`probability`,`emote`,`duration`,`sound`,`comment`) VALUES
+-- The Lich King (at start)
+(37226,3,0,'Foolish girl. You seek that, which I killed long ago. He is nearly a ghost now. A fate ago in my mind.',14,0,100,0,0,17229,'Lich King SAY_LK_JAINA_INTRO_END'),
+(37226,4,0,'I will not make the same mistake again. This time there will be no escape. You fail to serve me in undead. Now, all that remains for you is oblivion!',14,0,100,0,0,17228,'Lich King SAY_LK_SYLVANAS_INTRO_END'),
+-- Frostsworn General
+(36723,0,0,'You are not worthy to face the Lich King!',14,0,100,0,0,16921,'general SAY_AGGRO'),
+(36723,1,0,'Master, I have failed...',14,0,100,0,0,16922,'general SAY_DEATH'),
+-- The Lich King (at chase event)
+(36954,0,0,'Your allies have arrived, Jaina, just as you promised. You will all become powerful agents of the Scourge.',14,0,100,0,0,17212, 'Lich King SAY_LICH_KING_AGGRO_A'),
+(36954,1,0,'I will not make the same mistake again, Sylvanas. This time there will be no escape. You will all serve me in death!',14,0,100,0,0,17213,'Lich King SAY_LICH_KING_AGGRO_H'),
+(36954,2,0,'Succumb to the chill of the grave.',14,0,100,0,0,17218,'Lich King SAY_LICH_KING_WALL_02'),
+(36954,3,0,'Another dead end.',14,0,100,0,0,17219,'Lich King SAY_LICH_KING_WALL_03'),
+(36954,4,0,'How long can you fight it?',14,0,100,0,0,17220,'Lich King SAY_LICH_KING_WALL_04'),
+(36954,5,0,'There is no escape!', 14,0,100,0,0,17217,'Lich King SAY_LICH_KING_WALL_01'),
+(36954,6,0,'Rise minions, do not left them us!',14,0,100,0,0,17216,'Lich King SAY_LICH_KING_GNOUL'),
+(36954,7,0,'Minions sees them. Bring their corpses back to me!',14,0,100,0,0,17222,'Lich King SAY_LICH_KING_ABON'),
+(36954,8,0,'Death''s cold embrace awaits.',14,0,100,0,0,17221,'Lich King SAY_LICH_KING_WINTER'),
+(36954,9,0,'Nowhere to run! You''re mine now...',14,0,100,0,0,17223,'Lich King SAY_LICH_KING_END_DUN'),
+(36954,10,0,'All is lost!',14,0,100,0,0,17215,'Lich King SAY_LICH_KING_WIN'),
+-- Lady Jaina Proudmoore (at chase event)
+(36955,0,0,'He is too powerful, we must leave this place at once! My magic will hold him in place for only a short time! Come quickly, heroes!',14,0,100,1,0,16644,'Jaina SAY_JAINA_AGGRO'),
+(36955,1,0,'I will destroy this barrier. You must hold the undead back!',14,0,100,0,0,16607,'Jaina SAY_JAINA_WALL_01'),
+(36955,2,0,'Another ice wall! Keep the undead from interrupting my incantation so that I may bring this wall down!',14,0,100,0,0,16608,'Jaina SAY_JAINA_WALL_02'),
+(36955,3,0,'He is toying with us! I will show him what happens to ice when it meets fire!',14,0,100,0,0,16609,'Jaina SAY_JAINA_WALL_03'),
+(36955,4,0,'Your barriers can''t hold us back much longer, monster. I will shatter them all!',14,0,100,0,0,16610,'Jaina SAY_JAINA_WALL_04'),
+(36955,5,0,'There''s an opening up ahead. GO NOW!', 14,0,100,1,0,16645,'Jaina SAY_JAINA_ESCAPE_01'),
+(36955,6,0,'We''re almost there... Don''t give up!',14,0,100,0,0,16646,'Jaina SAY_JAINA_ESCAPE_02'),
+(36955,7,0,'It... It''s a dead end. We have no choice but to fight. Steel yourself heroes, for this is our last stand!',14,0,100,1,0,16647,'Jaina SAY_JAINA_TRAP'),
+(36955,8,0,'Forgive me heroes, I should have listened to Uther. I ... I had to see for myself, to look into his eyes one last time ... I am sorry.',14,0,100,1,0,16648,'Jaina SAY_JAINA_FINAL_2'),
+(36955,9,0,'We now know what must be done. I will deliver this news to King Varian and Highlord Fordring.',14,0,100,1,0,16649,'Jaina SAY_JAINA_FINAL_3'),
+-- Lady Sylvanas Windrunner (at chase event)
+(37554,0,0,'He''s too powerful! Heroes, quickly, come to me! We must leave this place immediately! I will do what I can do hold him in place while we flee.',14,0,100,0,0,17058,'Sylvanas SAY_SYLVANA_AGGRO'),
+(37554,1,0,'No wall can hold the Banshee Queen! Keep the undead at bay, heroes! I will tear this barrier down!',14,0,100,0,0,17029,'Sylvanas SAY_SYLVANA_WALL_01'),
+(37554,2,0,'Another barrier? Stand strong, champions! I will bring the wall down!',14,0,100,0,0,17030,'Sylvanas SAY_SYLVANA_WALL_02'),
+(37554,3,0,'I grow tired of these games, Arthas! Your walls can\'t stop me!',14,0,100,0,0,17031,'Sylvanas SAY_SYLVANA_WALL_03'),
+(37554,4,0,'You won''t impede our escape, fiend. Keep the undead off me while I bring this barrier down!',14,0,100,0,0,17032,'Sylvanas SAY_SYLVANA_WALL_04'),
+(37554,5,0,'There''s an opening up ahead. GO NOW!',14,0,100,1,0,17059,'Sylvanas SAY_SYLVANA_ESCAPE_01'),
+(37554,6,0,'We''re almost there! Don''t give up!',14,0,100,0,0,17060,'Sylvanas SAY_SYLVANA_ESCAPE_02'),
+(37554,7,0,'BLASTED DEAD END! So this is how it ends. Prepare yourselves, heroes, for today we make our final stand!',14,0,100,5,0,17061,'Sylvanas SAY_SYLVANA_TRAP'),
+(37554,8,0,'We are safe... for now. His strength has increased tenfold since our last battle. It will take a mighty army to destroy the Lich King. An army greater than even the Horde can rouse.',14,0,100,1,0,17062,'Sylvanas SAY_SYLVANA_FINAL_2'),
+-- High Captain Justin Bartlett
+(30344,0,0,'Fire, fire!',14,0,100,0,0,16721,'Bartlett SAY_BARTLETT_FIRE'),
+(30344,1,0,'Quickly, climb aboard! We mustn''t tarry here. There''s no telling when this whole mountainside will collapse!',14,0,100,0,0,16722,'Bartlett SAY_BARTLETT_FINAL_1'),
+-- Sky-Reaver Korm Blackscar
+(30824,0,0,'FIRE! FIRE!',14,0,100,0,0,0,'Korm SAY_KORM_FIRE'),
+(30824,1,0,'Quickly, climb aboard! We mustn''t tarry here. There''s no telling when this whole mountainside will collapse!',14,0,100,0,0,0,'Korm SAY_KORM_FINAL_1');
+
+/*
+# 3+4+4+5 +4+4+5+5 = 16+18
+# if 1st boss is dead and we wipe counter starts at wave 6
+SET @CGUID := 400000;
+DELETE FROM `creature` WHERE `guid` BETWEEN @CGUID+0 AND @CGUID+33;
+INSERT INTO `creature` (`guid`, `id`, `map`, `spawnMask`, `phaseMask`, `position_x`, `position_y`, `position_z`, `orientation`, `spawntimesecs`, `spawndist`, `MovementType`) VALUES
+-- pos 1
+(@CGUID+4, 38177, 668, 3, 1, 5277.365, 1993.229, 707.7781, 0.4014257, 7200, 0, 0),
+(@CGUID+31, 38172, 668, 3, 1, 5280.513, 1997.842, 707.7781, 0.296706, 7200, 0, 0),
+(@CGUID+5, 38175, 668, 3, 1, 5275.479, 2001.135, 707.7781, 0.1745329, 7200, 0, 0),
+(@CGUID+19, 38172, 668, 3, 1, 5279.649, 2004.656, 707.7781, 0.06981317, 7200, 0, 0),
+(@CGUID+10, 38172, 668, 3, 1, 5275.076, 2008.724, 707.7781, 6.213372, 7200, 0, 0),
+(@CGUID+25, 38176, 668, 3, 1, 5280.632, 2012.156, 707.7781, 6.056293, 7200, 0, 0),
+(@CGUID+15, 38175, 668, 3, 1, 5277.739, 2016.882, 707.7781, 5.969026, 7200, 0, 0),
+(@CGUID+29, 38176, 668, 3, 1, 5282.897, 2019.597, 707.7781, 5.88176, 7200, 0, 0),
+-- pos 2
+(@CGUID+1, 38172, 668, 3, 1, 5295.885, 2040.342, 707.7781, 5.078908, 7200, 0, 0),
+(@CGUID+33, 38176, 668, 3, 1, 5299.25, 2035.998, 707.7781, 5.026548, 7200, 0, 0),
+(@CGUID+6, 38172, 668, 3, 1, 5302.448, 2042.222, 707.7781, 4.904375, 7200, 0, 0),
+(@CGUID+20, 38173, 668, 3, 1, 5306.057, 2037.002, 707.7781, 4.817109, 7200, 0, 0),
+(@CGUID+0, 38175, 668, 3, 1, 5309.577, 2042.668, 707.7781, 4.694936, 7200, 0, 0),
+(@CGUID+23, 38175, 668, 3, 1, 5312.752, 2037.122, 707.7781, 4.590216, 7200, 0, 0),
+(@CGUID+11, 38173, 668, 3, 1, 5316.701, 2041.55, 707.7781, 4.502949, 7200, 0, 0),
+(@CGUID+30, 38177, 668, 3, 1, 5318.704, 2036.108, 707.7781, 4.223697, 7200, 0, 0),
+(@CGUID+16, 38173, 668, 3, 1, 5322.964, 2040.288, 707.7781, 4.34587, 7200, 0, 0),
+-- pos 3
+(@CGUID+28, 38173, 668, 3, 1, 5336.599, 2017.278, 707.7781, 3.473205, 7200, 0, 0),
+(@CGUID+17, 38176, 668, 3, 1, 5343.467, 2015.951, 707.7781, 3.490659, 7200, 0, 0),
+(@CGUID+32, 38173, 668, 3, 1, 5337.833, 2010.057, 707.7781, 3.228859, 7200, 0, 0),
+(@CGUID+12, 38173, 668, 3, 1, 5344.15, 2007.168, 707.7781, 3.159046, 7200, 0, 0),
+(@CGUID+21, 38176, 668, 3, 1, 5337.865, 2003.403, 707.7781, 2.984513, 7200, 0, 0),
+(@CGUID+7, 38177, 668, 3, 1, 5343.293, 1999.384, 707.7781, 2.9147, 7200, 0, 0),
+(@CGUID+24, 38173, 668, 3, 1, 5335.724, 1996.859, 707.7781, 2.740167, 7200, 0, 0),
+(@CGUID+2, 38173, 668, 3, 1, 5340.836, 1992.458, 707.7781, 2.75762, 7200, 0, 0),
+-- pos 4
+(@CGUID+3, 38176, 668, 3, 1, 5325.072, 1977.597, 707.7781, 2.076942, 7200, 0, 0),
+(@CGUID+8, 38176, 668, 3, 1, 5295.635, 1973.757, 707.7781, 1.186824, 7200, 0, 0),
+(@CGUID+9, 38177, 668, 3, 1, 5311.031, 1972.229, 707.7781, 1.64061, 7200, 0, 0),
+(@CGUID+13, 38176, 668, 3, 1, 5319.158, 1973.998, 707.7781, 1.919862, 7200, 0, 0),
+(@CGUID+14, 38177, 668, 3, 1, 5302.247, 1972.415, 707.7781, 1.37881, 7200, 0, 0),
+(@CGUID+18, 38172, 668, 3, 1, 5313.82, 1978.146, 707.7781, 1.745329, 7200, 0, 0),
+(@CGUID+22, 38177, 668, 3, 1, 5299.434, 1979.009, 707.7781, 1.239184, 7200, 0, 0),
+(@CGUID+26, 38172, 668, 3, 1, 5320.369, 1980.125, 707.7781, 2.007129, 7200, 0, 0),
+(@CGUID+27, 38172, 668, 3, 1, 5306.572, 1977.474, 707.7781, 1.500983, 7200, 0, 0);
+*/
+
+/*
+-- Uther the Lightbringer missing emotes
+UPDATE `creature_text` SET `emote`=5 WHERE `entry`=37225 AND `groupid` IN (0,4,8,15) AND `id`=0;
+UPDATE `creature_text` SET `emote`=1 WHERE `entry`=37225 AND `groupid` IN (1,2,3,5,6,7,9,10,11,12,13,14) AND `id`=0;
+-- Falric missing emotes
+UPDATE `creature_text` SET `emote`=2 WHERE `entry`=38112 AND `groupid`=5 AND `id`=0;
+-- Marwyn missing emotes
+UPDATE `creature_text` SET `emote`=2 WHERE `entry`=38113 AND `groupid`=4 AND `id`=0;
+UPDATE `creature_text` SET `emote`=397 WHERE `entry`=38113 AND `groupid`=0 AND `id`=0;
+
+-- Falric and Marwyn bind players to instance on heroic
+UPDATE `creature_template` SET `flags_extra`=1 WHERE `entry` IN (38599,38603);
+-- Frostsworn General
+UPDATE `creature_template` SET `ScriptName`='npc_frostworn_general' WHERE `entry`=36723;
+UPDATE `creature_template` SET `faction_A`=16,`faction_H`=16 WHERE `entry`=37720; -- for hc
+-- Spiritual Reflection
+-- UPDATE `creature_template` SET `modelid1`=57 WHERE `entry`=37068;
+UPDATE `creature_template` SET `ScriptName`='npc_spiritual_reflection' WHERE `entry`=37068;
+-- The Lich King (at chase event)
+UPDATE `creature_template` SET `ScriptName`='boss_lich_king_hor' WHERE `entry`=36954;
+-- Lady Jaina Proudmoore (at chase event)
+UPDATE `creature_template` SET `faction_A`=1770,`faction_H`=1770,`unit_flags`=64|256|32768,`ScriptName`='npc_jaina_and_sylvana_hor_part2' WHERE `entry`=36955;
+-- Lady Sylvanas Windrunner (at chase event)
+UPDATE `creature_template` SET `ScriptName`='npc_jaina_and_sylvana_hor_part2' WHERE `entry`=37554;
+-- High Captain Justin Bartlett
+#UPDATE `creature_template` SET `npcflag`=3 WHERE `entry`=30344;
+-- Sky-Reaver Korm Blackscar
+#UPDATE `creature_template` SET `npcflag`=3 WHERE `entry`=30824;
+-- Raging Ghoul
+UPDATE `creature_template` SET `AIName`='',`Scriptname`='npc_raging_ghoul' WHERE `entry`=36940;
+-- Risen Witch Doctor
+UPDATE `creature_template` SET `AIName`='',`Scriptname`='npc_risen_witch_doctor' WHERE `entry`=36941;
+-- Lumbering Abomination
+UPDATE `creature_template` SET `AIName`='',`Scriptname`='npc_lumbering_abomination' WHERE `entry`=37069;
+-- Frostmourne Altar Bunny (Quel''Delar)
+UPDATE `creature_template` SET `InhabitType`=4,`flags_extra`=128 WHERE `entry`=37704;
+
+DELETE FROM `conditions` WHERE `SourceEntry`=70063 AND `SourceTypeOrReferenceId`=13;
+INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`SourceId`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionTarget`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`NegativeCondition`,`ErrorTextId`,`ScriptName`,`Comment`) VALUES
+(13,1,70063,0,0,32,0,144,0,0,0,0,'','Fury of Frostmourne - target players');
+
+-- AreaTrigger for waves restarter
+DELETE FROM `areatrigger_scripts` WHERE `entry`=5697;
+INSERT INTO `areatrigger_scripts` VALUES
+(5697,'at_hor_waves_restarter');
+
+SET @GUID_CREATURE := 400000;
+DELETE FROM `creature` WHERE `map`=668 AND `guid` BETWEEN @GUID_CREATURE+0 AND @GUID_CREATURE+3;
+INSERT INTO `creature` (`guid`, `id`, `map`, `spawnMask`, `phaseMask`, `modelid`, `equipment_id`, `position_x`, `position_y`, `position_z`, `orientation`, `spawntimesecs`, `spawndist`, `currentwaypoint`, `curhealth`, `curmana`, `MovementType`, `npcflag`, `unit_flags`, `dynamicflags`) VALUES
+(@GUID_CREATURE+0,37704,668,3,1,0,0,5309.135,2006.21,715.7825,3.961897,604800,0,0,0,0,0,0,0,0),
+(@GUID_CREATURE+1,38112,668,3,1,0,0,5276.583,2037.45,709.4025,5.532694,604800,0,0,0,0,0,0,0,0),
+(@GUID_CREATURE+2,38113,668,3,1,0,0,5342.232,1975.696,709.4025,2.391101,604800,0,0,0,0,0,0,0,0),
+(@GUID_CREATURE+3,36723,668,3,1,0,0,5415.538,2117.842,707.7781,3.944444,604800,0,0,0,0,0,0,0,0);
+
+DELETE FROM `script_waypoint` WHERE `entry` IN(36955,36954,37554);
+INSERT INTO `script_waypoint` VALUES
+-- Jaina
+(36955,0,5587.682,2228.586,733.011,0,'WP1'),
+(36955,1,5600.715,2209.058,731.618,0,'WP2'),
+(36955,2,5606.417,2193.029,731.129,0,'WP3'),
+(36955,3,5598.562,2167.806,730.918,0,'WP4 - Summon IceWall 01'),
+(36955,4,5556.436,2099.827,731.827,0,'WP5 - Spell Channel'),
+(36955,5,5543.498,2071.234,731.702,0,'WP6'),
+(36955,6,5528.969,2036.121,731.407,0,'WP7'),
+(36955,7,5512.045,1996.702,735.122,0,'WP8'),
+(36955,8,5504.490,1988.789,735.886,0,'WP9 - Spell Channel'),
+(36955,9,5489.645,1966.389,737.653,0,'WP10'),
+(36955,10,5475.517,1943.176,741.146,0,'WP11'),
+(36955,11,5466.930,1926.049,743.536,0,'WP12'),
+(36955,12,5445.157,1894.955,748.757,0,'WP13 - Spell Channel'),
+(36955,13,5425.907,1869.708,753.237,0,'WP14'),
+(36955,14,5405.118,1833.937,757.486,0,'WP15'),
+(36955,15,5370.324,1799.375,761.007,0,'WP16'),
+(36955,16,5335.422,1766.951,767.635,0,'WP17 - Spell Channel'),
+(36955,17,5311.438,1739.390,774.165,0,'WP18'),
+(36955,18,5283.589,1703.755,784.176,0,'WP19'),
+(36955,19,5260.400,1677.775,784.301,3000,'WP20'),
+(36955,20,5262.439,1680.410,784.294,0,'WP21'),
+(36955,21,5260.400,1677.775,784.301,0,'WP22'),
+-- Sylvana
+(37554,0,5587.682,2228.586,733.011,0,'WP1'),
+(37554,1,5600.715,2209.058,731.618,0,'WP2'),
+(37554,2,5606.417,2193.029,731.129,0,'WP3'),
+(37554,3,5598.562,2167.806,730.918,0,'WP4 - Summon IceWall 01'),
+(37554,4,5556.436,2099.827,731.827,0,'WP5 - Spell Channel'),
+(37554,5,5543.498,2071.234,731.702,0,'WP6'),
+(37554,6,5528.969,2036.121,731.407,0,'WP7'),
+(37554,7,5512.045,1996.702,735.122,0,'WP8'),
+(37554,8,5504.490,1988.789,735.886,0,'WP9 - Spell Channel'),
+(37554,9,5489.645,1966.389,737.653,0,'WP10'),
+(37554,10,5475.517,1943.176,741.146,0,'WP11'),
+(37554,11,5466.930,1926.049,743.536,0,'WP12'),
+(37554,12,5445.157,1894.955,748.757,0,'WP13 - Spell Channel'),
+(37554,13,5425.907,1869.708,753.237,0,'WP14'),
+(37554,14,5405.118,1833.937,757.486,0,'WP15'),
+(37554,15,5370.324,1799.375,761.007,0,'WP16'),
+(37554,16,5335.422,1766.951,767.635,0,'WP17 - Spell Channel'),
+(37554,17,5311.438,1739.390,774.165,0,'WP18'),
+(37554,18,5283.589,1703.755,784.176,0,'WP19'),
+(37554,19,5260.400,1677.775,784.301,3000,'WP20'),
+(37554,20,5262.439,1680.410,784.294,0,'WP21'),
+(37554,21,5260.400,1677.775,784.301,0,'WP22'),
+-- Lich King
+(36954,1,5577.19,2236,733.012,0,'HoR WP LichKing'),
+(36954,2,5580.57,2232.22,733.012,0,'HoR WP LichKing'),
+(36954,3,5586.67,2225.54,733.012,0,'HoR WP LichKing'),
+(36954,4,5590.45,2221.41,733.012,0,'HoR WP LichKing'),
+(36954,5,5595.75,2215.62,732.101,0,'HoR WP LichKing'),
+(36954,6,5601.21,2206.49,731.54,0,'HoR WP LichKing'),
+(36954,7,5605.01,2197.9,731.667,0,'HoR WP LichKing'),
+(36954,8,5606.55,2191.39,730.977,0,'HoR WP LichKing'),
+(36954,9,5604.68,2186.11,730.998,0,'HoR WP LichKing'),
+(36954,10,5602.26,2179.9,730.967,0,'HoR WP LichKing'),
+(36954,11,5600.06,2174.38,730.924,0,'HoR WP LichKing'),
+(36954,12,5597.29,2166.81,730.924,0,'HoR WP LichKing'),
+(36954,13,5596.25,2160.36,730.931,0,'HoR WP LichKing'),
+(36954,14,5591.79,2152.87,731.008,0,'HoR WP LichKing'),
+(36954,15,5585.47,2146.63,731.109,0,'HoR WP LichKing'),
+(36954,16,5579.1,2140.34,731.18,0,'HoR WP LichKing'),
+(36954,17,5572.56,2134.21,731.092,0,'HoR WP LichKing'),
+(36954,18,5564.08,2126.53,730.816,0,'HoR WP LichKing'),
+(36954,19,5559.04,2117.64,730.812,0,'HoR WP LichKing'),
+(36954,20,5555.77,2111.88,730.995,0,'HoR WP LichKing'),
+(36954,21,5550.82,2103.14,731.123,0,'HoR WP LichKing'),
+(36954,22,5546.02,2094.68,731.16,0,'HoR WP LichKing'),
+(36954,23,5541.53,2084.42,730.999,0,'HoR WP LichKing'),
+(36954,24,5537.5,2075.18,730.901,0,'HoR WP LichKing'),
+(36954,25,5533.76,2063.84,730.87,0,'HoR WP LichKing'),
+(36954,26,5530.97,2052.98,730.981,0,'HoR WP LichKing'),
+(36954,27,5526.75,2041.73,731.193,0,'HoR WP LichKing'),
+(36954,28,5522.88,2031.65,731.7,0,'HoR WP LichKing'),
+(36954,29,5521.01,2023.02,732.396,0,'HoR WP LichKing'),
+(36954,30,5516.55,2015.36,733.12,0,'HoR WP LichKing'),
+(36954,31,5513.06,2007.33,733.99,0,'HoR WP LichKing'),
+(36954,32,5510.43,1997.9,735.016,0,'HoR WP LichKing'),
+(36954,33,5504.53,1990.39,735.748,0,'HoR WP LichKing'),
+(36954,34,5499.34,1983.78,736.29,0,'HoR WP LichKing'),
+(36954,35,5493.11,1975.86,736.852,0,'HoR WP LichKing'),
+(36954,36,5487.58,1968.81,737.394,0,'HoR WP LichKing'),
+(36954,37,5483.12,1961.78,738.06,0,'HoR WP LichKing'),
+(36954,38,5478.33,1954.2,739.343,0,'HoR WP LichKing'),
+(36954,39,5475.2,1945.84,740.697,0,'HoR WP LichKing'),
+(36954,40,5472.15,1938.02,741.884,0,'HoR WP LichKing'),
+(36954,41,5469.26,1931.34,742.813,0,'HoR WP LichKing'),
+(36954,42,5464.23,1922.25,744.055,0,'HoR WP LichKing'),
+(36954,43,5458.43,1912.96,745.229,0,'HoR WP LichKing'),
+(36954,44,5452.26,1902.95,747.091,0,'HoR WP LichKing'),
+(36954,45,5442.44,1892.51,749.208,0,'HoR WP LichKing'),
+(36954,46,5435.67,1879.7,751.776,0,'HoR WP LichKing'),
+(36954,47,5429.03,1870.73,753.151,0,'HoR WP LichKing'),
+(36954,48,5423.72,1862.16,754.263,0,'HoR WP LichKing'),
+(36954,49,5417.21,1851.7,755.507,0,'HoR WP LichKing'),
+(36954,50,5408.94,1838.38,757.002,0,'HoR WP LichKing'),
+(36954,51,5398.8,1829.61,757.742,0,'HoR WP LichKing'),
+(36954,52,5388.47,1817.95,759.285,0,'HoR WP LichKing'),
+(36954,53,5378.23,1808.5,760.316,0,'HoR WP LichKing'),
+(36954,54,5368.5,1801.35,760.845,0,'HoR WP LichKing'),
+(36954,55,5360.86,1793.16,762.271,0,'HoR WP LichKing'),
+(36954,56,5353.62,1785.4,763.868,0,'HoR WP LichKing'),
+(36954,57,5344.78,1776.09,765.759,0,'HoR WP LichKing'),
+(36954,58,5336.38,1768.67,767.324,0,'HoR WP LichKing'),
+(36954,59,5327.56,1760.12,769.332,0,'HoR WP LichKing'),
+(36954,60,5319.62,1750.7,771.487,0,'HoR WP LichKing'),
+(36954,61,5313.12,1742.99,773.424,0,'HoR WP LichKing'),
+(36954,62,5305.41,1735.79,775.473,0,'HoR WP LichKing'),
+(36954,63,5298.93,1728.16,777.573,0,'HoR WP LichKing'),
+(36954,64,5292.54,1720.37,779.862,0,'HoR WP LichKing'),
+(36954,65,5287.11,1713.96,781.667,0,'HoR WP LichKing'),
+(36954,66,5280.14,1705.21,784.65,0,'HoR WP LichKing'),
+(36954,67,5277.98,1701.28,785.224,0,'HoR WP LichKing');
+*/
+-- Halls of Reflexion WIP
diff --git a/sql/updates/world/2013_05_26_00_world_sai.sql b/sql/updates/world/2013_05_26_00_world_sai.sql
new file mode 100644
index 00000000000..14879241a25
--- /dev/null
+++ b/sql/updates/world/2013_05_26_00_world_sai.sql
@@ -0,0 +1,115 @@
+SET @NPC_LANDGREN := 29542;
+SET @NPC_ARETE := 29560;
+SET @NPC_SOUL := 29572;
+SET @NPC_SOUL_TARGET := 29577;
+SET @GO_FOCUS := 191578;
+SET @GO_GATE := 191579;
+
+UPDATE `gameobject_template` SET `faction`=114, `AIName`='SmartGameObjectAI' WHERE `entry`=@GO_GATE;
+DELETE FROM `gameobject_template` WHERE `entry`=@GO_FOCUS;
+INSERT INTO `gameobject_template` (`entry`,`type`,`displayId`,`name`,`data0`,`data1`,`data6`,`AIName`) VALUES
+(@GO_FOCUS,8,0,'Archbishop Landgren''s Corpse',1566,20,0,'SmartGameObjectAI');
+
+UPDATE `creature_template` SET `npcflag`=2, `unit_flags`=33280 WHERE `entry`=@NPC_ARETE;
+UPDATE `creature_template` SET `faction_A`=14, `faction_H`=14, `speed_walk`=0.4, `unit_flags`=256, `dynamicflags`=0, `InhabitType`=4 WHERE `entry`=@NPC_SOUL;
+UPDATE `creature_template` SET `unit_flags`=33555200, `InhabitType`=4 WHERE `entry`=@NPC_SOUL_TARGET;
+
+UPDATE `creature_model_info` SET `bounding_radius`=0.5745, `combat_reach`=2.25 WHERE `modelid`=26197;
+UPDATE `creature_model_info` SET `bounding_radius`=0.3825, `combat_reach`=1.875 WHERE `modelid`=26346;
+
+DELETE FROM `creature_template_addon` WHERE `entry`=@NPC_SOUL;
+INSERT INTO `creature_template_addon` (`entry`,`bytes2`,`emote`,`auras`) VALUES
+(@NPC_SOUL,1,0,'36545');
+
+DELETE FROM `creature_equip_template` WHERE `entry`=@NPC_ARETE;
+INSERT INTO `creature_equip_template` (`entry`,`id`,`itemEntry1`,`itemEntry2`,`itemEntry3`) VALUES
+(@NPC_ARETE,1,40276,0,0);
+
+DELETE FROM `creature_text` WHERE `entry` IN (@NPC_LANDGREN,@NPC_ARETE,@NPC_SOUL);
+INSERT INTO `creature_text` (`entry`,`groupid`,`id`,`text`,`type`,`language`,`probability`,`emote`,`duration`,`sound`,`comment`) VALUES
+(@NPC_LANDGREN,0,0,'I will not die so quickly this time!',14,0,100,0,0,0,''),
+
+(@NPC_ARETE,0,0,'Well done. Let''s get this over with.',12,0,100,1,0,0,''),
+(@NPC_ARETE,1,0,'Come, Landgren, cough up your soul so that I can ask you a very important question.',12,0,100,0,0,0,''),
+(@NPC_ARETE,2,0,'YOU WILL TELL ME WHERE WESTWIND IS OR I WILL DESTROY YOUR SOUL!',14,0,100,25,0,0,''),
+(@NPC_ARETE,3,0,'Then you leave me no choice. I won''t say that I won''t enjoy this.',12,0,100,1,0,0,''),
+(@NPC_ARETE,4,0,'Very well. Tell me!',12,0,100,0,0,0,''),
+(@NPC_ARETE,5,0,'A hidden hollow? How very interesting. You''ve served your purpose, Landgren, but I''m afraid there''ll be no resurrection for you this time!',12,0,100,6,0,0,''),
+(@NPC_ARETE,6,0,'Now that the unpleasantness is finished with, let''s talk about you dealing with Grand Admiral Westwind.',12,0,100,11,0,0,''),
+
+(@NPC_SOUL,0,0,'You''ll get nothing out of me, monster. I am beyond your ability to influence.',12,0,100,0,0,0,''),
+(@NPC_SOUL,1,0,'No.',12,0,100,0,0,0,''),
+(@NPC_SOUL,2,0,'STOP! It isn''t worth it. I''ll tell you where he is.',12,0,100,0,0,0,''),
+(@NPC_SOUL,3,0,'On the south end of the island is a cave -- a hidden hollow. The grand admiral has holed himself up in there, preparing for the final battle against the Lich King.',12,0,100,0,0,0,''),
+(@NPC_SOUL,4,0,'AAAEEEEIIIiiiiiiiiiiiiiiiiiiiiiiiiiiii........................................',14,0,100,0,0,0,'');
+
+DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=13 AND `SourceEntry` IN (22966,26560);
+INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`SourceId`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionTarget`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`NegativeCondition`,`ErrorTextId`,`ScriptName`,`Comment`) VALUES
+(13,1,22966,0,0,31,0,3,@NPC_LANDGREN,0,0,0,'','Spell Soul Coax targets Archbishop Landgren'),
+(13,2,26560,0,0,31,0,3,@NPC_LANDGREN,0,0,0,'','Spell Summon Arete''s Gate effect1 targets Archbishop Landgren');
+
+DELETE FROM `spell_script_names` WHERE `spell_id`=12601;
+INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES
+(12601,'spell_q12847_summon_soul_moveto_bunny');
+
+UPDATE `creature_template` SET `AIName`='SmartAI' WHERE `entry` IN (@NPC_LANDGREN,@NPC_ARETE,@NPC_SOUL);
+DELETE FROM `smart_scripts` WHERE `entryorguid` IN (@NPC_LANDGREN,@NPC_ARETE,@NPC_SOUL) AND `source_type`=0;
+DELETE FROM `smart_scripts` WHERE `entryorguid` IN (@GO_FOCUS,@GO_GATE) AND `source_type`=1;
+DELETE FROM `smart_scripts` WHERE `entryorguid` IN (@NPC_LANDGREN*100,@NPC_ARETE*100,@NPC_SOUL*100,@GO_GATE*100) AND `source_type`=9;
+INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES
+(@NPC_LANDGREN,0,0,0,25,0,100,0,0,0,0,0,28,60449,0,0,0,0,0,1,0,0,0,0,0,0,0,'Archbishop Landgren - On reset - Remove aura Shadowform'),
+(@NPC_LANDGREN,0,1,0,0,0,100,0,10000,12000,9000,10000,11,60453,0,0,0,0,0,2,0,0,0,0,0,0,0,'Archbishop Landgren - On update IC - Spellcast Mind Blast'),
+(@NPC_LANDGREN,0,2,0,0,0,100,0,15000,16000,18000,20000,11,60446,0,0,0,0,0,2,0,0,0,0,0,0,0,'Archbishop Landgren - On update IC - Spellcast Shadow Word: Pain'),
+(@NPC_LANDGREN,0,3,0,0,0,100,0,30000,35000,35000,40000,11,60440,0,0,0,0,0,2,0,0,0,0,0,0,0,'Archbishop Landgren - On update IC - Spellcast Mind Sear'),
+(@NPC_LANDGREN,0,4,5,2,0,100,1,0,50,0,0,11,60449,0,0,0,0,0,1,0,0,0,0,0,0,0,'Archbishop Landgren - On health below 50% - Spellcast Shadowform'),
+(@NPC_LANDGREN,0,5,0,61,0,100,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,'Archbishop Landgren - On health below 50% - Say line'),
+(@NPC_LANDGREN,0,6,0,6,0,100,0,0,0,0,0,11,22965,0,0,0,0,0,1,0,0,0,0,0,0,0,'Archbishop Landgren - On death - Spellcast Summon Archbishop Landgren''s Corpse Spell Focus'),
+(@NPC_LANDGREN,0,7,8,8,0,100,0,26560,0,0,0,45,0,1,0,0,0,0,20,@GO_GATE,50,0,0,0,0,0,'Archbishop Landgren - On spellhit Summon Arete''s Gate - Set data 0 1 Arete''s Gate'),
+(@NPC_LANDGREN,0,8,0,61,0,100,0,0,0,0,0,45,0,1,0,0,0,0,20,@GO_FOCUS,5,0,0,0,0,0,'Archbishop Landgren - On spellhit Summon Arete''s Gate - Set data 0 1 Arete''s Gate'),
+(@NPC_LANDGREN,0,9,10,38,0,100,0,0,1,0,0,11,12601,2,0,0,0,0,1,0,0,0,0,0,0,0,'Archbishop Landgren - On data 0 1 set - Spellcast Summon Landgren''s Soul Moveto Target Bunny'),
+(@NPC_LANDGREN,0,10,0,61,0,100,0,0,0,0,0,11,12600,2,0,0,0,0,1,0,0,0,0,0,0,0,'Archbishop Landgren - On data 0 1 set - Spellcast Summon Landgren''s Soul'),
+
+(@NPC_ARETE,0,0,1,1,0,100,1,0,0,0,0,11,34427,0,0,0,0,0,1,0,0,0,0,0,0,0,'Lord-Commander Arete - Just summoned - Spellcast Ethereal Teleport'),
+(@NPC_ARETE,0,1,2,61,0,100,0,0,0,0,0,83,2,0,0,0,0,0,1,0,0,0,0,0,0,0,'Lord-Commander Arete - Just summoned - Remove npcflag questgiver'),
+(@NPC_ARETE,0,2,3,61,0,100,0,0,0,0,0,66,0,0,0,0,0,0,19,@NPC_LANDGREN,20,0,0,0,0,0,'Lord-Commander Arete - Just summoned - Turn to Archbishop Landgren'),
+(@NPC_ARETE,0,3,0,61,0,100,0,0,0,0,0,80,@NPC_ARETE*100,2,0,0,0,0,1,0,0,0,0,0,0,0,'Lord-Commander Arete - Just summoned - Run script'),
+
+(@NPC_SOUL,0,0,0,54,0,100,0,0,0,0,0,80,@NPC_SOUL*100,2,0,0,0,0,1,0,0,0,0,0,0,0,'Landgren''s Soul - Just summoned - Run script'),
+
+(@GO_FOCUS,1,0,0,38,0,100,0,0,1,0,0,44,2,0,0,0,0,0,1,0,0,0,0,0,0,0,'Archbishop Landgren''s Corpse Spell Focus - On data 0 1 set - Set phase 2'),
+
+(@GO_GATE,1,0,0,38,0,100,0,0,1,0,0,80,@GO_GATE*100,2,0,0,0,0,1,0,0,0,0,0,0,0,'Arete''s Gateway - On data 0 1 set - Run script'),
+
+(@GO_GATE*100,9,0,0,0,0,100,0,4000,4000,0,0,11,18280,0,0,0,0,0,1,0,0,0,0,0,0,0,'Arete''s Gateway script - Spellcast Summon Arete'),
+(@GO_GATE*100,9,1,0,0,0,100,0,180000,180000,0,0,44,2,0,0,0,0,0,1,0,0,0,0,0,0,0,'Arete''s Gateway script - Set phase 2'),
+
+(@NPC_ARETE*100,9,0,0,0,0,100,0,500,500,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,'Lord-Commander Arete script - Say line'),
+(@NPC_ARETE*100,9,1,0,0,0,100,0,0,0,0,0,46,1,0,0,0,0,0,1,0,0,0,0,0,0,0,'Lord-Commander Arete script - Move forward'),
+(@NPC_ARETE*100,9,2,0,0,0,100,0,4000,4000,0,0,66,0,0,0,0,0,0,19,@NPC_LANDGREN,20,0,0,0,0,0,'Lord-Commander Arete script - Turn to Archbishop Landgren'),
+(@NPC_ARETE*100,9,3,0,0,0,100,0,1000,1000,0,0,11,22966,0,0,0,0,0,19,@NPC_LANDGREN,20,1,0,0,0,0,'Lord-Commander Arete script - Spellcast Soul Coax'),
+(@NPC_ARETE*100,9,4,0,0,0,100,0,0,0,0,0,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,'Lord-Commander Arete script - Say line'),
+(@NPC_ARETE*100,9,5,0,0,0,100,0,8000,8000,0,0,45,0,1,0,0,0,0,19,@NPC_LANDGREN,20,1,0,0,0,0,'Lord-Commander Arete script - Set data 0 1 Archbishop Landgren'),
+(@NPC_ARETE*100,9,6,0,0,0,100,0,12000,12000,0,0,1,2,0,0,0,0,0,1,0,0,0,0,0,0,0,'Lord-Commander Arete script - Say line'),
+(@NPC_ARETE*100,9,7,0,0,0,100,0,7000,7000,0,0,1,3,0,0,0,0,0,1,0,0,0,0,0,0,0,'Lord-Commander Arete script - Say line'),
+(@NPC_ARETE*100,9,8,0,0,0,100,0,4000,4000,0,0,11,27765,0,0,0,0,0,19,@NPC_SOUL,20,0,0,0,0,0,'Lord-Commander Arete script - Spellcast Soul Wrack'),
+(@NPC_ARETE*100,9,9,0,0,0,100,0,15000,15000,0,0,1,4,0,0,0,0,0,1,0,0,0,0,0,0,0,'Lord-Commander Arete script - Say line'),
+(@NPC_ARETE*100,9,10,0,0,0,100,0,0,0,0,0,92,0,27765,1,0,0,0,1,0,0,0,0,0,0,0,'Lord-Commander Arete script - Interrupt spellcast'),
+(@NPC_ARETE*100,9,11,0,0,0,100,0,10000,10000,0,0,1,5,0,0,0,0,0,1,0,0,0,0,0,0,0,'Lord-Commander Arete script - Say line'),
+(@NPC_ARETE*100,9,12,0,0,0,100,0,4000,4000,0,0,5,25,0,0,0,0,0,1,0,0,0,0,0,0,0,'Lord-Commander Arete script - Play emote'),
+(@NPC_ARETE*100,9,13,0,0,0,100,0,4000,4000,0,0,11,54723,0,0,0,0,0,19,@NPC_SOUL,20,0,0,0,0,0,'Lord-Commander Arete script - Spellcast Soul Wrack'),
+(@NPC_ARETE*100,9,14,0,0,0,100,0,8000,8000,0,0,92,0,54723,1,0,0,0,1,0,0,0,0,0,0,0,'Lord-Commander Arete script - Interrupt spellcast'),
+(@NPC_ARETE*100,9,15,0,0,0,100,0,0,0,0,0,1,6,0,0,0,0,0,1,0,0,0,0,0,0,0,'Lord-Commander Arete script - Say line'),
+(@NPC_ARETE*100,9,16,0,0,0,100,0,0,0,0,0,82,2,0,0,0,0,0,1,0,0,0,0,0,0,0,'Lord-Commander Arete script - Set npcflag questgiver'),
+(@NPC_ARETE*100,9,17,0,0,0,100,0,98000,98000,0,0,69,0,0,0,0,0,0,20,@GO_GATE,10,0,0,0,0,0,'Lord-Commander Arete script - Move to position'),
+(@NPC_ARETE*100,9,18,0,0,0,100,0,2000,2000,0,0,11,34427,0,0,0,0,0,1,0,0,0,0,0,0,0,'Lord-Commander Arete script - Spellcast Ethereal Teleport'),
+(@NPC_ARETE*100,9,19,0,0,0,100,0,500,500,0,0,41,0,0,0,0,0,0,1,0,0,0,0,0,0,0,'Lord-Commander Arete script - Despawn'),
+
+(@NPC_SOUL*100,9,0,0,0,0,100,0,0,0,0,0,66,0,0,0,0,0,0,19,@NPC_ARETE,20,0,0,0,0,0,'Landgren''s Soul script - Turn to Lord-Commander Arete'),
+(@NPC_SOUL*100,9,1,0,0,0,100,0,500,500,0,0,11,36545,0,0,0,0,0,1,0,0,0,0,0,0,0,'Landgren''s Soul script - Spellcast Floating Drowned'),
+(@NPC_SOUL*100,9,2,0,0,0,100,0,6500,6500,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,'Landgren''s Soul script - Say line'),
+(@NPC_SOUL*100,9,3,0,0,0,100,0,10000,10000,0,0,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,'Landgren''s Soul script - Say line'),
+(@NPC_SOUL*100,9,4,0,0,0,100,0,15000,15000,0,0,1,2,0,0,0,0,0,1,0,0,0,0,0,0,0,'Landgren''s Soul script - Say line'),
+(@NPC_SOUL*100,9,5,0,0,0,100,0,10000,10000,0,0,1,3,0,0,0,0,0,1,0,0,0,0,0,0,0,'Landgren''s Soul script - Say line'),
+(@NPC_SOUL*100,9,6,0,0,0,100,0,16000,16000,0,0,1,4,0,0,0,0,0,1,0,0,0,0,0,0,0,'Landgren''s Soul script - Say line'),
+(@NPC_SOUL*100,9,7,0,0,0,100,0,5000,5000,0,0,11,35426,0,0,0,0,0,1,0,0,0,0,0,0,0,'Landgren''s Soul script - Spellcast Arcane Explosion Visual'),
+(@NPC_SOUL*100,9,8,0,0,0,100,0,1000,1000,0,0,41,0,0,0,0,0,0,1,0,0,0,0,0,0,0,'Landgren''s Soul script - Despawn');
diff --git a/sql/updates/world/2013_05_26_01_world_sai.sql b/sql/updates/world/2013_05_26_01_world_sai.sql
new file mode 100644
index 00000000000..0c70f665c27
--- /dev/null
+++ b/sql/updates/world/2013_05_26_01_world_sai.sql
@@ -0,0 +1,39 @@
+SET @THANE := 29919;
+SET @SPELL := 31696;
+SET @B_STRIKE := 58460;
+SET @REND := 16509;
+SET @P_SMASH := 60868;
+SET @EVENT := 19490;
+
+DELETE FROM `disables` WHERE `sourceType`=0 AND `entry` IN (@SPELL);
+INSERT INTO `disables`(`sourceType`,`entry`,`flags`,`comment`) VALUES
+(0,@SPELL,64,'Ignore LOS on Thane');
+
+DELETE FROM `event_scripts` WHERE `id`=@EVENT;
+INSERT INTO `event_scripts` (`id`, `delay`, `command`, `datalong`, `datalong2`, `dataint`, `x`, `y`, `z`, `o`) VALUES
+(@EVENT,0,15,53799,4,29919,30,0,0,0);
+
+DELETE FROM `creature_text` WHERE `entry` IN (@THANE);
+INSERT INTO `creature_text` (`entry`,`groupid`,`id`,`text`,`type`,`language`,`probability`,`emote`,`duration`,`sound`,`comment`) VALUES
+(@THANE,1,0, 'By order of Duke Lankral, Commander of the Knights of the Ebon Blade, Vanquisher of the Scourge and Conquerer of The Shadow Vault, you are hearby served notice to cease and desist from all activities providing materiel assistance, vrykul, and any other type of support to the Lich King. Failure to comply will result in your immediate destruction. My messenger will serve as the instrument of my will. What is your decision?',12,0,100,0,0,0,'Thane'),
+(@THANE,2,0, 'What is this?',14,0,100,0,0,0,'Thane'),
+(@THANE,3,0, 'My answer? Here''s my answer, little messenger!',14,0,100,0,0,0,'Thane'),
+(@THANE,4,0, 'I will feed you to the dogs!',14,0,100,0,0,0,'Thane');
+
+UPDATE `creature_template` SET AIName='SmartAI' WHERE entry = @THANE;
+DELETE FROM `smart_scripts` WHERE source_type=0 AND entryorguid = @THANE;
+DELETE FROM `smart_scripts` WHERE source_type=9 AND entryorguid = @THANE*100;
+INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES
+(@THANE,0,0,1,4,0,100,0,0,0,0,0,1,2,12000,0,0,0,0,1,0,0,0,0,0,0,0,'Thane - On spellhit - Say text2'),
+(@THANE,0,1,2,61,0,100,0,0,0,0,0,18,33685504,0,0,0,0,0,1,0,0,0,0,0,0,0,'Thane - On Link - Set Unit Flags'),
+(@THANE,0,2,0,61,0,100,0,0,0,0,0,84,1,0,0,0,0,0,7,0,0,0,0,0,0,0,'Thane - On Link - Make player say Text1'),
+(@THANE,0,3,0,52,0,100,0,2,@THANE,0,0,1,3,4000,0,0,0,0,1,0,0,0,0,0,0,0,'Thane - On Text2 over - Say Text3'),
+(@THANE,0,4,5,52,0,100,0,3,@THANE,0,0,1,4,4000,0,0,0,0,1,0,0,0,0,0,0,0,'Thane - On Text3 over - Say Text4'),
+(@THANE,0,5,0,61,0,100,0,0,0,0,0,19,33685504,0,0,0,0,0,1,0,0,0,0,0,0,0, 'Thane - On Link - Remove unit flags'),
+(@THANE,0,6,0,0,0,100,0,4000,7000,4000,7000,11,@B_STRIKE,0,0,0,0,0,5,0,0,0,0,0,0,0,'Thane - In Combat - Cast Brutal Strike'),
+(@THANE,0,7,0,0,0,100,0,4000,15000,4000,15000,11,@REND,0,0,0,0,0,5,0,0,0,0,0,0,0,'Thane - In Combat - Cast Rend'),
+(@THANE,0,8,0,0,0,100,0,12000,25000,12000,25000,11,@P_SMASH,0,0,0,0,0,5,0,0,0,0,0,0,0,'Thane - In Combat - Cast Powerful Smash');
+
+DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`= 13 AND `SourceEntry`=@SPELL;
+INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES
+(13,1,@SPELL,0,0,31,0,3,@THANE,0,0,0,'','Shadow Decree hits only Thane');
diff --git a/sql/updates/world/2013_05_26_02_world_sai.sql b/sql/updates/world/2013_05_26_02_world_sai.sql
new file mode 100644
index 00000000000..a30b6c8be43
--- /dev/null
+++ b/sql/updates/world/2013_05_26_02_world_sai.sql
@@ -0,0 +1,79 @@
+-- Not-So-Honorable Combat (13137)
+SET @GO_SIGNAL_FIRE := 193024; -- Battlescar Signal Fire
+SET @EVENT_SCRIPT := 20069; -- Event Script
+SET @NPC_POSSESSED_ISKALDER := 30924; -- Possessed Iskalder <The Ancient Hero>
+SET @NPC_VARDMADRA := 30945; -- Vadmadra
+SET @NPC_LADY_NIGHTSWOOD := 30955; -- Lady Nightswood
+SET @MOVE_TARGET_BUNNY := 25715; -- Not-So-Honorable Combat: Summon Lady Nightswood's Moveto Target Bunny
+SET @TARGET_BUNNY := 30959; -- Lady Nightswood's Moveto Target Bunny
+SET @SUMMON_NIGHTSWOOD := 25727; -- Not-So-Honorable Combat: Summon Lady Nightswood
+SET @POSSESS_VARDMADRA := 25745; -- Possession
+
+DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`= 13 AND `SourceEntry`IN (@SUMMON_NIGHTSWOOD,@MOVE_TARGET_BUNNY,@POSSESS_VARDMADRA);
+INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES
+(13,1,@SUMMON_NIGHTSWOOD,0,0,31,0,3,@TARGET_BUNNY,0,0,0,'','Summon Nightswood only hits Target Bunny'),
+(13,1,@MOVE_TARGET_BUNNY,0,0,31,0,3,@NPC_POSSESSED_ISKALDER,0,0,0,'','Move Target Bunny only hits Target Bunny'),
+(13,1,@POSSESS_VARDMADRA,0,0,31,0,3,@NPC_VARDMADRA,0,0,0,'','Possess Vardmadra only hits Vardmadra');
+
+UPDATE `creature_template` SET `AIName`='SmartAI',`faction_A`=2116,`faction_H`=2116,`unit_flags`=33088,`mindmg`=422,`maxdmg`=586,`attackpower`=642,`minrangedmg`=345,`maxrangedmg`=509,`rangedattackpower`=103 WHERE `entry`=@NPC_POSSESSED_ISKALDER;
+UPDATE `creature_template` SET `faction_A`=2116,`faction_H`=2116,`unit_flags`=33536,`AIName`='SmartAI',`minlevel`=80, `maxlevel`=80 WHERE `entry`=@NPC_VARDMADRA;
+UPDATE `creature_template` SET `AIName`='SmartAI', `InhabitType`=7 WHERE `entry` IN (@TARGET_BUNNY,@NPC_LADY_NIGHTSWOOD);
+UPDATE `creature_template` SET `modelid1`=11686, `modelid2`=0 WHERE `entry`=@TARGET_BUNNY;
+DELETE FROM `creature_template_addon` WHERE `entry` IN (@NPC_POSSESSED_ISKALDER,@NPC_VARDMADRA);
+INSERT INTO `creature_template_addon` (`entry`,`mount`,`bytes1`,`bytes2`,`auras`) VALUES
+(@NPC_POSSESSED_ISKALDER,0,0x0,0x1,'58102'),
+(@NPC_VARDMADRA,0,0x3000000,0x1,'');
+
+DELETE FROM `creature_equip_template` WHERE `entry`=@NPC_POSSESSED_ISKALDER;
+INSERT INTO `creature_equip_template` (`entry`,`itemEntry1`,`itemEntry2`,`itemEntry3`) VALUES
+(@NPC_POSSESSED_ISKALDER,43296,43295,0);
+
+DELETE FROM `creature_text` WHERE `entry` IN (@NPC_POSSESSED_ISKALDER,@NPC_VARDMADRA,@NPC_LADY_NIGHTSWOOD);
+INSERT INTO `creature_text` (`entry`,`groupid`,`id`,`text`,`type`,`language`,`probability`,`emote`,`duration`,`sound`,`comment`) VALUES
+(@NPC_POSSESSED_ISKALDER,0,0,'Now fight me, $N! Kill Iskalder!',14,0,100,0,0,1167,'Possessed Iskalder'),
+(@NPC_VARDMADRA,0,0, 'Iskalder, there you are. What is this? Engaged in battle already?',14,0,100,457,0,13824,'Vardmadra'),
+(@NPC_VARDMADRA,1,0, 'NO! How is this possible?',14,0,100,457,0,13825,'Vardmadra'),
+(@NPC_VARDMADRA,2,0, 'I know not how this was possible, but you must still be judged Iskalder. Wait... what is this?',14,0,100,457,0,13824,'Vardmadra'),
+(@NPC_VARDMADRA,3,0, 'Stay away from me creature! Do not touch me!',14,0,100,0,0,1168,'Vardmadra to Nightswood'),
+(@NPC_VARDMADRA,4,0, 'Ahahahahahaha! It is done. Return to my cave. We have much to discuss!',14,0,100,457,0,1167,'Vardmadra to '),
+(@NPC_LADY_NIGHTSWOOD,0,0, 'This? This is me taking control of you. This is me setting up my final revenge!',14,0,100,457,0,13824,'Lady Nightswood');
+
+-- Possessed Iskalder <The Ancient Hero>
+DELETE FROM `event_scripts` WHERE `id`=@EVENT_SCRIPT;
+INSERT INTO `event_scripts` (`id`,`delay`,`command`,`datalong`,`datalong2`,`dataint`,`x`,`y`,`z`,`o`) VALUES
+(@EVENT_SCRIPT,5,10,@NPC_POSSESSED_ISKALDER,180000,0,7229.436,3642.27,809.0175,0);
+
+DELETE FROM `smart_scripts` WHERE `source_type` IN (0,9) AND `entryorguid` IN (@NPC_POSSESSED_ISKALDER,@NPC_VARDMADRA,@NPC_LADY_NIGHTSWOOD,@TARGET_BUNNY,@TARGET_BUNNY*100);
+INSERT INTO `smart_scripts` (`entryorguid`,`source_type`,`id`,`link`,`event_type`,`event_phase_mask`,`event_chance`,`event_flags`,`event_param1`,`event_param2`,`event_param3`,`event_param4`,`action_type`,`action_param1`,`action_param2`,`action_param3`,`action_param4`,`action_param5`,`action_param6`,`target_type`,`target_param1`,`target_param2`,`target_param3`,`target_x`,`target_y`,`target_z`,`target_o`,`comment`) VALUES
+(@NPC_POSSESSED_ISKALDER,0,0,1,54,0,100,0,0,0,0,0,19,256,0,0,0,0,0,1,0,0,0,0,0,0,0,'Iskalder - On Summon - Remove unit flag'),
+(@NPC_POSSESSED_ISKALDER,0,1,0,61,0,100,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,'Iskalder - On Link - Talk'),
+(@NPC_POSSESSED_ISKALDER,0,2,0,2,0,100,1,0,65,0,0,12,@NPC_VARDMADRA,3,180000,0,0,0,8,0,0,0,7182.766602,3661.931885, 826.149292, 5.838641, 'Possessed Iskalder - on 65% HP - Spawn Vardmara'),
+(@NPC_POSSESSED_ISKALDER,0,3,0,4,0,100,1,0,0,0,0,11,60108,0,0,0,0,0,2,0,0,0,0,0,0,0,'Iskalder - On Aggro - Cast Heroic Leap'),
+(@NPC_POSSESSED_ISKALDER,0,4,0,0,0,100,0,3500,3500,14500,16700,11,15496,0,0,0,0,0,2,0,0,0,0,0,0,0,'Iskalder - In Combat - Cast Cleave'),
+(@NPC_POSSESSED_ISKALDER,0,5,0,0,0,100,0,5000,6000,11200,15800,11,57846,0,0,0,0,0,2,0,0,0,0,0,0,0,'Iskalder - In Combat - Cast Heroic Strike'),
+(@NPC_POSSESSED_ISKALDER,0,6,0,0,0,100,0,9000,11000,25000,25000,11,60121,0,0,0,0,0,1,0,0,0,0,0,0,0,'Iskalder - In Combat - Cast Ancient Curse'),
+(@NPC_POSSESSED_ISKALDER,0,7,0,2,0,100,1,0,50,0,0,1,0,0,0,0,0,0,11,@NPC_VARDMADRA,200,0,0,0,0,0,'Iskalder - On HPC - Make Vardmadra Say'),
+(@NPC_POSSESSED_ISKALDER,0,8,0,6,0,100,1,0,0,0,0,45,1,1,0,0,0,0,11,@NPC_VARDMADRA,200,0,0,0,0,0,' Iskalder - On event death - Send Data to Vardmadra'),
+(@NPC_POSSESSED_ISKALDER,0,9,10,1,0,100,1,0,0,0,0,19,256,0,0,0,0,0,1,0,0,0,0,0,0,0,'Iskalder - OOC - Remove unit flag'),
+(@NPC_POSSESSED_ISKALDER,0,10,0,61,0,100,1,0,0,0,0,45,2,2,0,0,0,0,11,@NPC_VARDMADRA,300,0,0,0,0,0, 'Possessed Iskalder - On link - Set Data on Vardmara'),
+
+(@NPC_VARDMADRA,0,0,1,38,0,100,0,1,1,0,0,59,1,0,0,0,0,0,1,0,0,0,0,0,0,0,'Vardmadra - On Receive Data - Set Run'),
+(@NPC_VARDMADRA,0,1,2,61,0,100,0,1,1,0,0,69,0,0,0,0,0,0,8,0,0,0,7234.742,3643.584,811.8065,5.507,'Vardmadra - Linked with Previous Event - Move to position'),
+(@NPC_VARDMADRA,0,2,3,61,0,100,0,0,0,0,0,1,1,10000,0,0,0,0,1,0,0,0,0,0,0,0,'Vardmadra - Linked with Previous Event - Say'),
+(@NPC_VARDMADRA,0,3,4,61,0,100,1,0,0,0,0,11,@MOVE_TARGET_BUNNY,2,0,0,0,0,19,@NPC_POSSESSED_ISKALDER,200,1,0,0,0,0,'Vardmadra - Linked with Previous Event - Cast Not-So-Honorable Combat: Summon Lady Nightswood''s Moveto Target Bunny'),
+(@NPC_VARDMADRA,0,4,5,52,0,100,0,1,@NPC_VARDMADRA,0,0,1,2,10000,0,0,0,0,1,0,0,0,0,0,0,0,'Vardmadra - On Text Over - Say'),
+(@NPC_VARDMADRA,0,5,0,61,0,100,0,0,0,0,0,66,0,0,0,0,0,0,19,@NPC_POSSESSED_ISKALDER,200,1,0,0,0,0,'Vardmadra - On Link - Turn to Iskalder'),
+(@NPC_VARDMADRA,0,6,7,52,0,100,0,2,@NPC_VARDMADRA,0,0,1,0,10000,0,0,0,0,11,@NPC_LADY_NIGHTSWOOD,200,0,0,0,0,0,'Vardmadra - On Text Over - Say'),
+(@NPC_VARDMADRA,0,7,8,61,0,100,0,0,0,0,0,66,0,0,0,0,0,0,19,@NPC_LADY_NIGHTSWOOD,200,0,0,0,0,0,'Vardmadra - On Link - Turn to Lady Nightswood'),
+(@NPC_VARDMADRA,0,8,0,61,0,100,0,0,0,0,0,45,1,1,0,0,0,0,11,@NPC_LADY_NIGHTSWOOD,200,0,0,0,0,0,'Vardmadra - On link - Send Data to Lady Nightswood'),
+(@NPC_VARDMADRA,0,9,0,52,0,100,0,0,@NPC_LADY_NIGHTSWOOD,0,0,1,3,10000,0,0,0,0,1,0,0,0,0,0,0,0,'Vardmadra - On Text Over - Say'),
+(@NPC_VARDMADRA,0,10,0,52,0,100,0,3,@NPC_VARDMADRA,0,0,1,4,10000,0,0,0,0,1,0,0,0,0,0,0,0,'Vardmadra- On Text Over - Say'),
+(@NPC_VARDMADRA,0,11,0,52,0,100,0,4,@NPC_VARDMADRA,0,0,41,0,0,0,0,0,0,1,0,0,0,0,0,0,0,'Vardmadra - On Text Over - Despawn'),
+(@NPC_VARDMADRA,0,12,0,38,0,100,0,2,2,0,0,41,0,0,0,0,0,0,1,0,0,0,0,0,0,0,'Vardmadra - On Receive Data - Despawn'),
+
+(@TARGET_BUNNY,0,0,0,54,0,100,0,0,0,0,0,80,@TARGET_BUNNY*100,2,0,0,0,0,1,0,0,0,0,0,0,0,'Lady Nightswood Move-to-Bunny - On Summon - Start Timed Script'),
+(@TARGET_BUNNY*100,9,0,0,0,0,100,0,7000,7000,7000,7000,69,0,0,0,0,0,0,8,0,0,0,7242.77,3631.67,814.0644,2.227,'Lady Nightswood Move-to-Bunny - On Script - Go to position'),
+(@TARGET_BUNNY*100,9,1,0,0,0,100,0,8000,8000,8000,8000,11,@SUMMON_NIGHTSWOOD,2,0,0,0,0,1,0,0,0,0,0,0,0,'Lady Nightswood Move-to-Bunny - Linked with Previous Event - Cast Not-So-Honorable Combat: Summon Lady Nightswood''s Moveto Target Bunny'),
+
+(@NPC_LADY_NIGHTSWOOD,0,0,0,54,0,100,0,0,0,0,0,66,0,0,0,0,0,0,19,@NPC_VARDMADRA,200,0,0,0,0,0,'Lady Nightswood - On Summon - Turn to Vardmadra'),
+(@NPC_LADY_NIGHTSWOOD,0,1,0,38,0,100,0,1,1,0,0,11,@POSSESS_VARDMADRA,0,0,0,0,0,19,@NPC_VARDMADRA,200,0,0,0,0,0,'Lady Nigtswood - On Receive Data - Possess Vardmadra');
diff --git a/sql/updates/world/2013_05_26_03_world_sai.sql b/sql/updates/world/2013_05_26_03_world_sai.sql
new file mode 100644
index 00000000000..6a3225266e7
--- /dev/null
+++ b/sql/updates/world/2013_05_26_03_world_sai.sql
@@ -0,0 +1,5 @@
+SET @SUMMON_ARETE := 18280; -- LC Arete Summon Spell
+SET @ARETE_GATE := 191579; -- Arete Gateway Object
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@ARETE_GATE*100 AND `source_type`=9;
+INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES
+(@ARETE_GATE*100,9,0,0,0,0,100,0,4000,4000,0,0,11,@SUMMON_ARETE,0,0,0,0,0,1,0,0,0,0,0,0,0,'Arete''s Gateway - On Script - Spellcast Summon Arete');
diff --git a/sql/updates/world/2013_05_26_04_world_waypoints.sql b/sql/updates/world/2013_05_26_04_world_waypoints.sql
new file mode 100644
index 00000000000..58f1e50bf23
--- /dev/null
+++ b/sql/updates/world/2013_05_26_04_world_waypoints.sql
@@ -0,0 +1,27 @@
+-- Pathing for Entry 5934 Heartrazor
+SET @NPC := 51821;
+SET @PATH := @NPC * 10;
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=-5183.809,`position_y`=-1170.219,`position_z`=45.11078 WHERE `guid`=@NPC;
+DELETE FROM `creature_addon` WHERE `guid`=@NPC;
+INSERT INTO `creature_addon` (`guid`,`path_id`,`bytes2`,`mount`,`auras`) VALUES (@NPC,@PATH,1,0, '');
+DELETE FROM `waypoint_data` WHERE `id`=@PATH;
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`delay`,`move_flag`,`action`,`action_chance`,`wpguid`) VALUES
+(@PATH,1,-5183.809,-1170.219,45.11078,0,0,0,100,0),
+(@PATH,2,-5181.056,-1184.849,45.97993,0,0,0,100,0),
+(@PATH,3,-5169.914,-1200.506,47.15270,0,0,0,100,0),
+(@PATH,4,-5159.998,-1216.499,48.38121,0,0,0,100,0),
+(@PATH,5,-5173.076,-1229.047,49.04836,0,0,0,100,0),
+(@PATH,6,-5194.938,-1230.641,48.47133,0,0,0,100,0),
+(@PATH,7,-5207.135,-1229.340,47.92607,0,0,0,100,0),
+(@PATH,8,-5215.482,-1216.020,46.70019,0,0,0,100,0),
+(@PATH,9,-5207.343,-1200.787,46.16835,0,0,0,100,0),
+(@PATH,10,-5184.156,-1170.526,45.12170,0,0,0,100,0),
+(@PATH,11,-5183.285,-1153.094,44.87883,0,0,0,100,0),
+(@PATH,12,-5183.285,-1153.094,44.87883,0,0,0,100,0),
+(@PATH,13,-5177.142,-1130.755,43.77563,0,0,0,100,0),
+(@PATH,14,-5164.937,-1121.575,43.77023,0,0,0,100,0),
+(@PATH,15,-5145.432,-1115.095,43.74949,0,0,0,100,0),
+(@PATH,16,-5138.181,-1109.642,44.04351,0,0,0,100,0),
+(@PATH,17,-5154.783,-1119.312,43.67305,0,0,0,100,0),
+(@PATH,18,-5176.401,-1127.441,43.71729,0,0,0,100,0),
+(@PATH,19,-5183.811,-1149.325,44.34430,0,0,0,100,0);
diff --git a/sql/updates/world/2013_05_26_05_world_misc.sql b/sql/updates/world/2013_05_26_05_world_misc.sql
new file mode 100644
index 00000000000..e819f7a93bc
--- /dev/null
+++ b/sql/updates/world/2013_05_26_05_world_misc.sql
@@ -0,0 +1,120 @@
+SET @OGUID := 7080;
+
+SET @ARTHAS := 27455;
+SET @MURADIN := 27480;
+SET @THELZAN := 27851;
+SET @ALTAR := 190332;
+
+UPDATE `creature` SET `spawndist`=0,`MovementType`=0 WHERE `id`=@THELZAN;
+
+DELETE FROM `gameobject` WHERE `map`=571 AND `id` IN (192066,192065,192064,190191,@ALTAR);
+INSERT INTO `gameobject` (`guid`,`id`,`map`,`spawnMask`,`phaseMask`,`position_x`,`position_y`,`position_z`,`orientation`,`rotation0`,`rotation1`,`rotation2`,`rotation3`,`spawntimesecs`,`animprogress`,`state`) VALUES
+(@OGUID,192066,571,1,1,4816.637,-582.2271,163.1873,-1.240983,-0.5743933,0.2897787,-0.5093117,0.5715788,120,0,1),
+(@OGUID+1,192065,571,1,1,4816.552,-581.2853,163.0618,1.043091,0.5583439,0.3292217,0.3740091,0.6633116,120,0,1),
+(@OGUID+2,192064,571,1,1,4823.089,-581.7293,164.1632,2.408346,-0.3306689,-0.6249218,0.6858006,0.1726511,120,0,1),
+(@OGUID+3,190191,571,1,1,4819.284,-583.5658,163.5637,1.343901,0,0,0.6225138,0.7826088,120,0,1),
+(@OGUID+4,@ALTAR,571,1,1,4819.374,-583.699,163.5065,1.500983,0,0,0.6819983,0.7313538,120,0,1);
+
+UPDATE `creature_template` SET `AIName`='SmartAI' WHERE `entry`=@THELZAN;
+UPDATE `creature_template` SET `InhabitType`=1, `AIName`='SmartAI' WHERE `entry` IN (@MURADIN,@ARTHAS);
+
+DELETE FROM `event_scripts` WHERE `id`=18281;
+INSERT INTO `event_scripts` (`id`,`delay`,`command`,`datalong`,`datalong2`,`x`,`y`,`z`,`o`) VALUES
+(18281,0,10,@THELZAN,20000,4819.284,-583.5658,163.5637,1.343901);
+
+DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=13 AND `SourceEntry`=49825;
+DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=22 AND `SourceEntry`=@THELZAN;
+INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`SourceId`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`NegativeCondition`,`ErrorTextId`,`Comment`) VALUES
+(13,1,49825,0,0,31,3,@MURADIN,0,0,0, 'Arthas Calls to Spirits targets Muradin'),
+(22,2,@THELZAN,0,0,29,@MURADIN,100,0,1,0, 'SAI activates only if Muradin is not around');
+
+DELETE FROM `smart_scripts` WHERE `source_type`=0 AND `entryorguid` IN (@ARTHAS,@MURADIN,@THELZAN);
+DELETE FROM `smart_scripts` WHERE `source_type`=9 AND `entryorguid` IN (@ARTHAS*100,@MURADIN*100,@MURADIN*100+1,@THELZAN*100);
+INSERT INTO `smart_scripts` (`entryorguid`,`source_type`,`id`,`link`,`event_type`,`event_phase_mask`,`event_chance`,`event_flags`,`event_param1`,`event_param2`,`event_param3`,`event_param4`,`action_type`,`action_param1`,`action_param2`,`action_param3`,`action_param4`,`action_param5`,`action_param6`,`target_type`,`target_param1`,`target_param2`,`target_param3`,`target_x`,`target_y`,`target_z`,`target_o`,`comment`) VALUES
+(@ARTHAS,0,0,0,38,0,100,0,0,10,0,0,80,@ARTHAS*100,2,0,0,0,0,1,0,0,0,0,0,0,0,'Prince Arthas - On dataset - Run script'),
+
+(@MURADIN,0,0,0,38,0,100,0,0,10,0,0,80,@MURADIN*100,2,0,0,0,0,1,0,0,0,0,0,0,0,'Muradin - On dataset - Run script'),
+(@MURADIN,0,1,0,8,0,100,0,49825,0,0,0,80,@MURADIN*100+1,2,0,0,0,0,1,0,0,0,0,0,0,0,'Muradin - On spellhit - Run script'),
+
+(@THELZAN,0,0,0,54,0,100,0,0,0,0,0,3,0,17200,0,0,0,0,1,0,0,0,0,0,0,0,'Thel''zan Spell Dummy - Just summoned - Run script'),
+(@THELZAN,0,1,0,54,0,100,0,0,0,0,0,80,@THELZAN*100,2,0,0,0,0,1,0,0,0,0,0,0,0,'Thel''zan Spell Dummy - Just summoned - Run script'),
+
+(@ARTHAS*100,9,0,0,0,0,100,0,0,0,0,0,45,0,0,0,0,0,0,1,0,0,0,0,0,0,0,'Prince Arthas - Script - reset data 0'),
+(@ARTHAS*100,9,1,0,0,0,100,0,0,0,0,0,69,0,0,0,0,0,0,8,0,0,0,4820.175,-581.226,163.6158,0,'Prince Arthas - Script - moveto'),
+(@ARTHAS*100,9,2,0,0,0,100,0,8000,8000,0,0,1,6,0,0,0,0,0,1,0,0,0,0,0,0,0,'Prince Arthas - Script - say 6'),
+(@ARTHAS*100,9,3,0,0,0,100,0,6000,6000,0,0,1,7,0,0,0,0,0,1,0,0,0,0,0,0,0,'Prince Arthas - Script - say 7'),
+(@ARTHAS*100,9,4,0,0,0,100,0,6000,6000,0,0,11,49824,0,0,0,0,0,1,0,0,0,0,0,0,0,'Prince Arthas - Script - Spellcast Arthas Calls to Spirits'),
+(@ARTHAS*100,9,5,0,0,0,100,0,10000,10000,0,0,69,0,0,0,0,0,0,8,0,0,0,4819.658,-582.5223,163.752,0,'Prince Arthas - Script - moveto'),
+(@ARTHAS*100,9,6,0,0,0,100,0,0,0,0,0,71,0,7,0,0,0,0,1,0,0,0,0,0,0,0,'Prince Arthas - Script - Change weapon'),
+(@ARTHAS*100,9,7,0,0,0,100,0,1000,1000,0,0,5,397,0,0,0,0,0,1,0,0,0,0,0,0,0,'Prince Arthas - Script - Emote OneShotPointNoSheathe'),
+(@ARTHAS*100,9,8,0,0,0,100,0,0,0,0,0,71,0,7,33350,0,0,0,1,0,0,0,0,0,0,0,'Prince Arthas - Script - Change weapon'),
+(@ARTHAS*100,9,9,0,0,0,100,0,0,0,0,0,9,0,0,0,0,0,0,20,@ALTAR,5,0,0,0,0,0,'Prince Arthas - Script - Activate Altar'),
+(@ARTHAS*100,9,10,0,0,0,100,0,4000,4000,0,0,69,0,0,0,0,0,0,8,0,0,0,4814.56,-577.2604,162.2522,0,'Prince Arthas - Script - moveto'),
+(@ARTHAS*100,9,11,0,0,0,100,0,3500,3500,0,0,5,15,0,0,0,0,0,1,0,0,0,0,0,0,0,'Prince Arthas - Script - Emote OneShotRoar'),
+(@ARTHAS*100,9,12,0,0,0,100,0,4000,4000,0,0,53,1,@ARTHAS,0,0,0,0,1,0,0,0,0,0,0,0,'Prince Arthas - Script - Start WP movement'),
+
+(@MURADIN*100,9,0,0,0,0,100,0,0,0,0,0,45,0,0,0,0,0,0,1,0,0,0,0,0,0,0,'Muradin - Script - reset data 0'),
+(@MURADIN*100,9,1,0,0,0,100,0,500,500,0,0,69,0,0,0,0,0,0,8,0,0,0,4818.622,-582.4843,163.5883,0,'Muradin - Script - moveto'),
+(@MURADIN*100,9,2,0,0,0,100,0,2000,2000,0,0,66,0,0,0,0,0,0,8,0,0,0,0,0,0,5.305801,'Muradin - Script - turnto'),
+(@MURADIN*100,9,3,0,0,0,100,0,1000,1000,0,0,1,2,0,0,0,0,0,1,0,0,0,0,0,0,0,'Muradin - Script - say 2'),
+(@MURADIN*100,9,4,0,0,0,100,0,500,500,0,0,90,8,0,0,0,0,0,1,0,0,0,0,0,0,0,'Muradin - Script - kneel'),
+(@MURADIN*100,9,5,0,0,0,100,0,15000,15000,0,0,91,8,0,0,0,0,0,1,0,0,0,0,0,0,0,'Muradin - Script - stand'),
+(@MURADIN*100,9,6,0,0,0,100,0,1000,1000,0,0,66,0,0,0,0,0,0,19,@ARTHAS,10,0,0,0,0,0,'Muradin - Script - turnto Prince Arthas'),
+(@MURADIN*100,9,7,0,0,0,100,0,2000,2000,0,0,5,274,0,0,0,0,0,1,0,0,0,0,0,0,0,'Muradin - Script - Emote no'),
+(@MURADIN*100,9,8,0,0,0,100,0,2500,2500,0,0,5,5,0,0,0,0,0,1,0,0,0,0,0,0,0,'Muradin - Script - Emote Exclamation'),
+(@MURADIN*100,9,9,0,0,0,100,0,7000,7000,0,0,69,0,0,0,0,0,0,8,0,0,0,4817.42,-581.4944,163.2614,0,'Muradin - Script - moveto'),
+(@MURADIN*100,9,10,0,0,0,100,0,1000,1000,0,0,66,0,0,0,0,0,0,19,@ARTHAS,10,0,0,0,0,0,'Muradin - Script - turnto Prince Arthas'),
+(@MURADIN*100,9,11,0,0,0,100,0,1500,1500,0,0,1,5,0,0,0,0,0,19,@ARTHAS,10,0,0,0,0,0,'Muradin - Script - Prince Arthas say 5'),
+(@MURADIN*100,9,12,0,0,0,100,0,5000,5000,0,0,1,3,0,0,0,0,0,1,0,0,0,0,0,0,0,'Muradin - Script - say 3'),
+(@MURADIN*100,9,13,0,0,0,100,0,0,0,0,0,45,0,10,0,0,0,0,19,@ARTHAS,10,0,0,0,0,0,'Muradin - Script - set data 0 10 on Prince Arthas'),
+(@MURADIN*100,9,14,0,0,0,100,0,1000,1000,0,0,66,0,0,0,0,0,0,8,0,0,0,0,0,0,5.323254,'Muradin - Script - turnto'),
+
+(@MURADIN*100+1,9,0,0,0,0,100,0,0,0,0,0,40,0,0,0,0,0,0,1,0,0,0,0,0,0,0,'Muradin - Script - Set sheath'),
+(@MURADIN*100+1,9,1,0,0,0,100,0,0,0,0,0,18,1,1,0,0,0,0,1,0,0,0,0,0,0,0,'Muradin - Script - Set unit_flag2'),
+(@MURADIN*100+1,9,2,0,0,0,100,0,13000,13000,0,0,19,1,1,0,0,0,0,1,0,0,0,0,0,0,0,'Muradin - Script - Remove unit_flag2'),
+(@MURADIN*100+1,9,3,0,0,0,100,0,500,500,0,0,17,64,0,0,0,0,0,1,0,0,0,0,0,0,0,'Muradin - Script - emotestate stun'),
+(@MURADIN*100+1,9,4,0,0,0,100,0,5000,5000,0,0,1,4,0,0,0,0,0,1,0,0,0,0,0,0,0,'Muradin - Script - say 4'),
+(@MURADIN*100+1,9,5,0,0,0,100,0,3000,3000,0,0,1,5,0,0,0,0,0,1,0,0,0,0,0,0,0,'Muradin - Script - say 5'),
+(@MURADIN*100+1,9,6,0,0,0,100,0,4000,4000,0,0,17,0,0,0,0,0,0,1,0,0,0,0,0,0,0,'Muradin - Script - emotestate none'),
+(@MURADIN*100+1,9,7,0,0,0,100,0,1000,1000,0,0,11,49829,3,0,0,0,0,1,0,0,0,0,0,0,0,'Muradin - Script - Spellcast Frostmourne Cavern Quest Credit'),
+(@MURADIN*100+1,9,8,0,0,0,100,0,0,0,0,0,53,1,@MURADIN,0,0,0,0,1,0,0,0,0,0,0,0,'Muradin - Script - Start WP movement'),
+
+(@THELZAN*100,9,0,0,0,0,100,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,'Thel''zan Spell Dummy - Script - Say 0'),
+(@THELZAN*100,9,1,0,0,0,100,0,0,0,0,0,11,33271,0,0,0,0,0,1,0,0,0,0,0,0,0,'Thel''zan Spell Dummy - Script - Spellcast Internal Shake Camera w/ rumble sound'),
+(@THELZAN*100,9,2,0,0,0,100,0,7000,7000,0,0,12,@MURADIN,3,116000,0,0,0,8,0,0,0,4817.494,-579.6047,163.0956,5.102134,'Thel''zan Spell Dummy - Script - Summon Muradin'),
+(@THELZAN*100,9,3,0,0,0,100,0,0,0,0,0,12,@ARTHAS,3,102000,0,0,0,8,0,0,0,4821.529,-579.8818,163.5944,4.167512,'Thel''zan Spell Dummy - Script - Summon Prince Arthas'),
+(@THELZAN*100,9,4,0,0,0,100,0,0,0,0,0,9,0,0,0,0,0,0,20,@ALTAR,5,0,0,0,0,0,'Thel''zan Spell Dummy - Script - set data 0 10 on Frostmourne Altar'),
+(@THELZAN*100,9,5,0,0,0,100,0,3000,3000,0,0,1,4,0,0,0,0,0,19,@ARTHAS,10,0,0,0,0,0,'Thel''zan Spell Dummy - Script - Prince Arthas Say 4'),
+(@THELZAN*100,9,6,0,0,0,100,0,3000,3000,0,0,5,25,0,0,0,0,0,19,@ARTHAS,10,0,0,0,0,0,'Thel''zan Spell Dummy - Script - Prince Arthas Emote Point'),
+(@THELZAN*100,9,7,0,0,0,100,0,3500,3500,0,0,45,0,10,0,0,0,0,19,@MURADIN,10,0,0,0,0,0,'Thel''zan Spell Dummy - Script - Set data 0 10 on Muradin');
+
+DELETE FROM `waypoints` WHERE `entry` IN (@ARTHAS,@MURADIN);
+INSERT INTO `waypoints` (`entry`,`pointid`,`position_x`,`position_y`,`position_z`,`point_comment`) VALUES
+(@ARTHAS,1,4793.066,-571.0735,160.8400, 'Prince Arthas'),
+(@ARTHAS,2,4772.816,-566.8235,162.2605, 'Prince Arthas'),
+(@ARTHAS,3,4759.816,-568.5735,164.2808, 'Prince Arthas'),
+(@ARTHAS,4,4743.573,-564.3865,166.2362, 'Prince Arthas'),
+(@MURADIN,1,4797.722,-576.3405,160.1779, 'Muradin'),
+(@MURADIN,2,4770.222,-575.5905,162.9453, 'Muradin'),
+(@MURADIN,3,4757.972,-575.0905,164.5265, 'Muradin'),
+(@MURADIN,4,4753.972,-572.8405,165.1388, 'Muradin'),
+(@MURADIN,5,4749.972,-569.5905,165.7607, 'Muradin'),
+(@MURADIN,6,4748.024,-566.1866,165.7932, 'Muradin');
+
+DELETE FROM `creature_text` WHERE `entry` IN (@ARTHAS,@MURADIN,@THELZAN);
+INSERT INTO `creature_text` (`entry`,`groupid`,`id`,`text`,`type`,`language`,`probability`,`emote`,`duration`,`sound`,`comment`) VALUES
+(@ARTHAS,0,0, 'Captain, why are the guards not at their posts?',12,0,100,6,0,12725, 'Prince Arthas'),
+(@ARTHAS,1,0, 'Uther had my troops recalled? Damn it! If my warriors abandon me, I''ll never defeat Mal''Ganis. The ships must be burned before the men reach the shore!',12,0,100,5,0,12726, 'Prince Arthas'),
+(@ARTHAS,2,0, 'Burned down to their frames! No one goes home until our job here is done!',12,0,100,15,0,12727, 'Prince Arthas'),
+(@ARTHAS,3,0, 'Spare me, Muradin. You weren''t there to see what Mal''Ganis did to my homeland.',12,0,100,1,0,12728, 'Prince Arthas'),
+(@ARTHAS,4,0, 'Behold, Muradin, our salvation, Frostmourne.',12,0,100,1,0,12729, 'Prince Arthas'),
+(@ARTHAS,5,0, 'I would gladly bear any curse to save my homeland.',12,0,100,1,0,12730, 'Prince Arthas'),
+(@ARTHAS,6,0, 'Damn the men! Nothing shall prevent me from having my revenge, old friend. Not even you.',12,0,100,5,0,12731, 'Prince Arthas'),
+(@ARTHAS,7,0, 'Now, I call out to the spirits of this place. I will give anything or pay any price, if only you will help me save my people.',12,0,100,396,0,12732, 'Prince Arthas'),
+(@MURADIN,0,0, 'Isn''t that a bit much, lad?',12,0,100,6,0,12733, 'Muradin'),
+(@MURADIN,1,0, 'You lied to your men and betrayed the mercenaries who fought for you. What''s happening to you, Arthas? Is vengeance all that''s important to you?',12,0,100,1,0,12734, 'Muradin'),
+(@MURADIN,2,0, 'Hold, lad. There''s an inscription on the dais. It''s a warning. It says, "Whomsoever takes up this blade shall wield power eternal. Just as the blade rends flesh, so must power scar the spirit." Oh, I should''ve known. The blade is cursed! Let''s get the hell out of here!',12,0,100,0,0,12735, 'Muradin'),
+(@MURADIN,3,0, 'Leave it be, Arthas. Forget this business and lead your men home.',12,0,100,396,0,12736, 'Muradin'),
+(@MURADIN,4,0, 'O'' my head... Wh... Where am I?',12,0,100,0,0,0, 'Muradin'),
+(@MURADIN,5,0, 'Who... Who am I?',12,0,100,0,0,0, 'Muradin'),
+(@THELZAN,0,0, 'The walls of Frostmourne Cavern shudder and shake.',41,0,100,0,0,0, 'Thel''zan Spell Dummy');
diff --git a/sql/updates/world/2013_05_26_05_world_waypoints.sql b/sql/updates/world/2013_05_26_05_world_waypoints.sql
new file mode 100644
index 00000000000..6596851cd33
--- /dev/null
+++ b/sql/updates/world/2013_05_26_05_world_waypoints.sql
@@ -0,0 +1,55 @@
+-- remove extra Highperch Soarer spawn
+DELETE FROM `creature` WHERE `guid`=21707;
+DELETE FROM `creature_addon` WHERE `guid`=21707;
+
+-- Proper Pathing for Entry 6139 Highperch Soarer
+SET @NPC := 21708;
+SET @PATH := @NPC * 10;
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=-5155.495,`position_y`=-1195.804,`position_z`=73.70869 WHERE `guid`=@NPC;
+DELETE FROM `creature_addon` WHERE `guid`=@NPC;
+INSERT INTO `creature_addon` (`guid`,`path_id`,`bytes2`,`mount`,`auras`) VALUES (@NPC,@PATH,4097,0, '');
+DELETE FROM `waypoint_data` WHERE `id`=@PATH;
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`delay`,`move_flag`,`action`,`action_chance`,`wpguid`) VALUES
+(@PATH,1,-5155.495,-1195.804,73.70869,0,0,0,100,0),
+(@PATH,2,-5155.09,-1194.89,73.70869,0,0,0,100,0),
+(@PATH,3,-5155.986,-1199.748,81.49023,0,0,0,100,0),
+(@PATH,4,-5166.314,-1220.043,81.76808,0,0,0,100,0),
+(@PATH,5,-5170.551,-1226.347,76.71234,0,0,0,100,0),
+(@PATH,6,-5178.024,-1237.037,72.43468,0,0,0,100,0),
+(@PATH,7,-5190.296,-1239.181,71.90687,0,0,0,100,0),
+(@PATH,8,-5215.796,-1225.133,69.76797,0,0,0,100,0),
+(@PATH,9,-5221.52,-1209.387,67.79574,0,0,0,100,0),
+(@PATH,10,-5219.366,-1194.92,67.15694,0,0,0,100,0),
+(@PATH,11,-5209.852,-1187.224,65.96239,0,0,0,100,0),
+(@PATH,12,-5194.886,-1188.915,70.71236,0,0,0,100,0),
+(@PATH,13,-5181.055,-1199.332,60.29574,0,0,0,100,0),
+(@PATH,14,-5158.846,-1213.597,57.6291,0,0,0,100,0),
+(@PATH,15,-5122.129,-1222.279,42.46242,0,0,0,100,0),
+(@PATH,16,-5110.988,-1230.767,15.32349,0,0,0,100,0),
+(@PATH,17,-5084.673,-1227.625,-11.81538,0,0,0,100,0),
+(@PATH,18,-5065.282,-1209.691,-34.89864,0,0,0,100,0),
+(@PATH,19,-5052.477,-1181.261,-39.42649,0,0,0,100,0),
+(@PATH,20,-5025.058,-1165.288,-32.56528,0,0,0,100,0),
+(@PATH,21,-5004.282,-1140.431,-38.3154,0,0,0,100,0),
+(@PATH,22,-4984.813,-1123.683,-38.17639,0,0,0,100,0),
+(@PATH,23,-4971.478,-1109.776,-38.17639,0,0,0,100,0),
+(@PATH,24,-4949.74,-1096.296,-32.42633,0,0,0,100,0),
+(@PATH,25,-4927.954,-1090.275,-24.84298,0,0,0,100,0),
+(@PATH,26,-4909.837,-1080.728,-14.0652,0,0,0,100,0),
+(@PATH,27,-4914.713,-1066.641,-7.898551,0,0,0,100,0),
+(@PATH,28,-4927.922,-1056.954,-3.352009,0,0,0,100,0),
+(@PATH,29,-4942.696,-1055.217,8.220422,0,0,0,100,0),
+(@PATH,30,-4951.954,-1049.145,14.62554,0,0,0,100,0),
+(@PATH,31,-4960.176,-1028.92,20.03323,0,0,0,100,0),
+(@PATH,32,-4970.474,-1008.432,22.08879,0,0,0,100,0),
+(@PATH,33,-4980.969,-992.9671,23.42848,0,0,0,100,0),
+(@PATH,34,-4993.734,-980.054,23.75917,0,0,0,100,0),
+(@PATH,35,-5012.753,-967.9377,24.0925,0,0,0,100,0),
+(@PATH,36,-5032.862,-971.138,30.92584,0,0,0,100,0),
+(@PATH,37,-5052.127,-982.1085,39.0092,0,0,0,100,0),
+(@PATH,38,-5060.675,-991.1913,52.28708,0,0,0,100,0),
+(@PATH,39,-5072.277,-1008.99,67.84268,0,0,0,100,0),
+(@PATH,40,-5090.256,-1005.558,79.18673,0,0,0,100,0),
+(@PATH,41,-5106.005,-1004.311,73.88409,0,0,0,100,0),
+(@PATH,42,-5132.349,-1102.871,74.67264,0,0,0,100,0),
+(@PATH,43,-5200.281,-1166.383,88.48215,0,0,0,100,0);
diff --git a/sql/updates/world/2013_05_27_00_world_sai.sql b/sql/updates/world/2013_05_27_00_world_sai.sql
new file mode 100644
index 00000000000..9c0002572c3
--- /dev/null
+++ b/sql/updates/world/2013_05_27_00_world_sai.sql
@@ -0,0 +1,2 @@
+SET @SPELL := 31696;
+DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`= 13 AND `SourceEntry`=@SPELL;
diff --git a/sql/updates/world/2013_05_30_00_world_misc.sql b/sql/updates/world/2013_05_30_00_world_misc.sql
new file mode 100644
index 00000000000..0e81b2debaa
--- /dev/null
+++ b/sql/updates/world/2013_05_30_00_world_misc.sql
@@ -0,0 +1,103 @@
+SET @GOSSIP := 8301;
+SET @EVENT := 13888;
+SET @BLOOD_MOUNT := 19085;
+SET @BORAK := 21293;
+SET @ICARIUS := 21409;
+SET @ZARATH := 21410;
+SET @GOBJECT := 184798;
+
+DELETE FROM `gossip_menu` WHERE `entry`=@GOSSIP AND `text_id`=10356;
+INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES
+(@GOSSIP,10356);
+
+DELETE FROM `gossip_menu_option` WHERE `menu_id`=@GOSSIP;
+INSERT INTO `gossip_menu_option` (`menu_id`,`id`,`option_icon`,`option_text`,`option_id`,`npc_option_npcflag`,`action_menu_id`,`action_poi_id`,`box_coded`,`box_money`,`box_text`) VALUES
+(@GOSSIP,0,0,'Borak, I need another bundle of bloodthistle.',1,1,0,0,0,0,'');
+
+DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=15 AND `SourceGroup`=@GOSSIP;
+INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorType`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES
+(15,@GOSSIP,0,0,0,9,0,10570,0,0,0,0,0,'','Show gossip menu option if player has quest To Catch a Thistlehead'),
+(15,@GOSSIP,0,0,0,2,0,30616,1,0,1,0,0,'','Show gossip menu option if player doesn''t have item Bundle of Bloodthistle');
+
+DELETE FROM `creature_text` WHERE entry IN (@ZARATH,@ICARIUS,@BORAK);
+INSERT INTO `creature_text` (`entry`,`groupid`,`id`,`text`,`type`,`language`,`probability`,`emote`,`duration`,`sound`,`comment`) VALUES
+(@BORAK,0,0,'Hide! Hide before they see you! Back up!',15,0,100,0,0,0,'Borak'),
+(@BORAK,1,0,'The time to strike is at hand. Terminate Icarius.',15,0,100,0,0,0,'Borak'),
+(@BORAK,2,0,'You have it. Do not lose it again!',12,0,100,5,0,0,'Borak'),
+(@ZARATH,0,0,'What is it, my lord?',12,0,100,6,0,0,'Zarath'),
+(@ZARATH,1,0,'My lord, surely you do not expect me to leave you unattended. Lord Illidan would have my head if anything were to happen to you.',12,0,100,1,0,0,'Zarath'),
+(@ZARATH,2,0,'As you wish, my lord.',12,0,100,66,0,0,'Zarath'),
+(@ICARIUS,0,0,'Halt!',12,0,100,1,0,0,'Icarius'),
+(@ICARIUS,1,0,'Zarath you must return to the Black Temple at once! I... I seem to have misplaced Lord Illidan''s orders. Quickly!',12,0,100,5,0,0,'Icarius'),
+(@ICARIUS,2,0,'Zarath, I am perfectly capable of making it up this road to Eclipse Point. If we do not deliver the missive, Lord Illidan will have both of our heads! You are dismissed!',12,0,100,1,0,0,'Icarius'),
+(@ICARIUS,3,0,'Ah, sweet, sweet bloodthistle... Probably left behind by one of those filthy addicts at Eclipse Point.',12,0,100,1,0,0,'Icarius'),
+(@ICARIUS,4,0,'Their loss is most definitely my gain...',12,0,100,275,0,0,'Icarius'),
+(@ICARIUS,5,0,'Envoy Icarius puts the bundle of bloodthistle in his robe.',16,0,100,0,0,0,'Icarius'),
+(@ICARIUS,6,0,'Ah, damn it all! Clever trap. Too bad you''ll never live to tell the tale...',12,0,100,1,0,0,'Icarius');
+
+DELETE FROM `creature_template_addon` WHERE entry = @ZARATH;
+INSERT INTO `creature_template_addon` (`entry`,`mount`,`bytes2`) VALUES
+(@ZARATH,@BLOOD_MOUNT,0);
+
+UPDATE `gameobject` SET `position_x`=-4057.190, `position_y`=1527.482, `position_z`=93.0938 WHERE `guid`=99970;
+
+UPDATE `creature_template` SET `gossip_menu_id`=8301 WHERE `entry`=@BORAK;
+UPDATE `creature_template` SET `faction_A`=1701, `faction_H`=1701, `speed_walk`=1.14286 WHERE `entry` IN (@ZARATH,@ICARIUS);
+
+UPDATE `creature_template` SET AIName='SmartAI' WHERE entry IN (@ZARATH,@ICARIUS,@BORAK);
+UPDATE `gameobject_template` SET `AIName`='SmartGameObjectAI' WHERE `entry`=@GOBJECT;
+DELETE FROM `smart_scripts` WHERE `source_type`=0 AND `entryorguid` IN (@ZARATH,@ICARIUS,@BORAK);
+DELETE FROM `smart_scripts` WHERE `source_type`=1 AND `entryorguid`=@GOBJECT;
+DELETE FROM `smart_scripts` WHERE `source_type`=9 AND `entryorguid` IN (@ICARIUS*100,@ZARATH*100);
+INSERT INTO `smart_scripts` (`entryorguid`,`source_type`,`id`,`link`,`event_type`,`event_phase_mask`,`event_chance`,`event_flags`,`event_param1`,`event_param2`,`event_param3`,`event_param4`,`action_type`,`action_param1`,`action_param2`,`action_param3`,`action_param4`,`action_param5`,`action_param6`,`target_type`,`target_param1`,`target_param2`,`target_param3`,`target_x`,`target_y`,`target_z`,`target_o`,`comment`) VALUES
+(@BORAK,0,0,0,38,0,100,0,1,1,0,0,1,0,0,0,0,0,0,17,50,100,0,0,0,0,0,'Borak - On Data Set - Say 0'),
+(@BORAK,0,1,0,38,0,100,0,2,2,0,0,1,1,0,0,0,0,0,17,50,100,0,0,0,0,0,'Borak - On Data Set - Say 1'),
+(@BORAK,0,2,3,62,0,100,0,@GOSSIP,0,0,0,56,30616,35,0,0,0,0,7,0,0,0,0,0,0,0,'Borak - On gossip select - Add Item to Player'),
+(@BORAK,0,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,'Borak - On gossip select - Close Gossip'),
+(@BORAK,0,4,0,61,0,100,0,0,0,0,0,1,2,0,0,0,0,0,17,50,100,0,0,0,0,0,'Borak - On gossip select - Say 2'),
+
+(@ZARATH,0,0,1,54,0,100,0,0,0,0,0,53,0,@ZARATH,0,10570,0,0,1,0,0,0,0,0,0,0,'Zarath - Just Summoned - Start Wp'),
+(@ZARATH,0,1,2,61,0,100,1,0,0,0,0,45,1,1,0,0,0,0,11,@BORAK,500,0,0,0,0,0,'Zarath - On Link - Set Data to Borak'),
+(@ZARATH,0,2,0,61,0,100,1,0,0,0,0,8,2,0,0,0,0,0,1,0,0,0,0,0,0,0,'Zarath - On Link - Set react state aggressive'),
+(@ZARATH,0,3,0,38,0,100,0,0,1,0,0,66,0,0,0,0,0,0,19,@ICARIUS,10,0,0,0,0,0,'Zarath - On Data Set - Turn to'),
+(@ZARATH,0,4,5,38,0,100,0,1,1,0,0,66,0,0,0,0,0,0,8,0,0,0,0,0,0,4.716,'Zarath - On Data Set - Set Orientation'),
+(@ZARATH,0,5,0,61,0,100,0,0,0,0,0,80,@ZARATH*100,2,0,0,0,0,1,0,0,0,0,0,0,0,'Zarath - On Link - Timed Script'),
+(@ZARATH,0,6,0,40,0,100,0,1,@ZARATH,0,0,101,0,0,0,0,0,0,1,0,0,0,0,0,0,0,'Zarath - WP Reached - Set Home Pos'),
+
+(@ICARIUS,0,0,1,54,0,100,0,0,0,0,0,53,0,@ICARIUS,0,0,0,0,1,0,0,0,0,0,0,0,'Icarius - Just Summoned - Start Wp'),
+(@ICARIUS,0,1,0,61,0,100,0,0,0,0,0,8,2,0,0,0,0,0,1,0,0,0,0,0,0,0,'Icarius - Just Summoned - Set react state aggressive'),
+(@ICARIUS,0,2,0,40,0,100,0,1,@ICARIUS,0,0,80,@ICARIUS*100,2,0,0,0,0,1,0,0,0,0,0,0,0,'Icarius - WP reached - Call Action Script'),
+(@ICARIUS,0,3,0,4,1,100,1,0,0,0,0,1,6,0,0,0,0,0,1,0,0,0,0,0,0,0,'Icarius - On aggro (phase 1) - Say text 6'),
+
+(@GOBJECT,1,0,0,38,0,100,0,3,3,0,0,44,2,0,0,0,0,0,1,0,0,0,0,0,0,0,'Bundle of Bloodthistle - On data 3 3 set - Set phase 2'),
+
+(@ZARATH*100,9,0,0,0,0,100,0,1500,1500,0,0,46,100,0,0,0,0,0,1,0,0,0,0,0,0,0,'Zarath - Move forward'),
+
+(@ICARIUS*100,9,0,0,0,0,100,0,1000,1000,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,'Icarius - Say Text 0'),
+(@ICARIUS*100,9,1,0,0,0,100,0,2000,2000,0,0,1,0,0,0,0,0,0,19,@ZARATH,10,0,0,0,0,0,'Zarath - Say Text 0 Zarath'),
+(@ICARIUS*100,9,2,0,0,0,100,0,6500,6500,0,0,66,0,0,0,0,0,0,19,@ZARATH,10,0,0,0,0,0,'Icarius - Turn to'),
+(@ICARIUS*100,9,3,0,0,0,100,0,500,500,0,0,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,'Icarius - Say Text 1'),
+(@ICARIUS*100,9,4,0,0,0,100,0,1000,1000,0,0,45,0,1,0,0,0,0,19,@ZARATH,10,0,0,0,0,0,'Zarath - Set data 0 1'),
+(@ICARIUS*100,9,5,0,0,0,100,0,5000,5000,0,0,1,1,0,0,0,0,0,19,@ZARATH,10,0,0,0,0,0,'Zarath - Say Text 1 Zarath'),
+(@ICARIUS*100,9,6,0,0,0,100,0,7000,7000,0,0,1,2,0,0,0,0,0,1,0,0,0,0,0,0,0,'Icarius - Say Text 2'),
+(@ICARIUS*100,9,7,0,0,0,100,0,6000,6000,0,0,1,2,0,0,0,0,0,19,@ZARATH,10,0,0,0,0,0,'Zarath - Say Text 2 Zarath'),
+(@ICARIUS*100,9,8,0,0,0,100,0,3000,3000,0,0,45,1,1,0,0,0,0,19,@ZARATH,10,0,0,0,0,0,'Zarath - Set Data 1 1'),
+(@ICARIUS*100,9,9,0,0,0,100,0,1000,1000,0,0,66,0,0,0,0,0,0,20,@GOBJECT,50,0,0,0,0,0,'Icarius - Turn to'),
+(@ICARIUS*100,9,10,0,0,0,100,0,4000,4000,0,0,1,3,0,0,0,0,0,1,0,0,0,0,0,0,0,'Icarius - Say Text 3'),
+(@ICARIUS*100,9,11,0,0,0,100,0,6000,6000,0,0,1,4,0,0,0,0,0,1,0,0,0,0,0,0,0,'Icarius - Say Text 4'),
+(@ICARIUS*100,9,12,0,0,0,100,0,4000,4000,0,0,69,0,0,0,0,0,0,20,@GOBJECT,50,0,0,0,0,0,'Icarius - Go to GO PoS'),
+(@ICARIUS*100,9,13,0,0,0,100,0,5000,5000,0,0,5,16,0,0,0,0,0,1,0,0,0,0,0,0,0,'Icarius - Emote Kneel'),
+(@ICARIUS*100,9,14,0,0,0,100,0,3000,3000,0,0,1,5,0,0,0,0,0,1,0,0,0,0,0,0,0,'Icarius - Say Text 5'),
+(@ICARIUS*100,9,15,0,0,0,100,0,0,0,0,0,45,3,3,0,0,0,0,20,@GOBJECT,5,0,0,0,0,0,'Icarius - Set Data Gameobject'),
+(@ICARIUS*100,9,16,0,0,0,100,1,3000,3000,0,0,45,2,2,0,0,0,0,11,@BORAK,100,0,0,0,0,0,'Icarius - Set Data 2 2'),
+(@ICARIUS*100,9,17,0,0,0,100,0,0,0,0,0,22,1,0,0,0,0,0,1,0,0,0,0,0,0,0,'Icarius - Set event phase 1');
+
+DELETE FROM `event_scripts` WHERE `id`=@EVENT;
+INSERT INTO `event_scripts` (`id`,`delay`,`command`,`datalong`,`datalong2`,`dataint`,`x`,`y`,`z`,`o`) VALUES
+(@EVENT,0,10,@ZARATH,80000,0,-4055.979,1478.097,87.927,1.501698),
+(@EVENT,0,10,@ICARIUS,120000,0,-4052.285,1478.886,87.8424,1.604585);
+
+DELETE FROM `waypoints` WHERE `entry` IN (@ZARATH,@ICARIUS);
+INSERT INTO `waypoints` (`entry`,`pointid`,`position_x`,`position_y`,`position_z`,`point_comment`) VALUES
+(@ZARATH,1,-4058.758,1515.231,91.292,'Zarath'),
+(@ICARIUS,1,-4054.427,1515.515,91.511,'Icarius');
diff --git a/src/server/authserver/Authentication/AuthCodes.cpp b/src/server/authserver/Authentication/AuthCodes.cpp
index 55229e0d18b..b47ef21b24b 100644
--- a/src/server/authserver/Authentication/AuthCodes.cpp
+++ b/src/server/authserver/Authentication/AuthCodes.cpp
@@ -37,6 +37,7 @@ namespace AuthHelper
static RealmBuildInfo const PreBcAcceptedClientBuilds[] =
{
+ {6141, 1, 12, 3, ' '},
{6005, 1, 12, 2, ' '},
{5875, 1, 12, 1, ' '},
{0, 0, 0, 0, ' '} // terminator
diff --git a/src/server/authserver/Server/AuthSocket.cpp b/src/server/authserver/Server/AuthSocket.cpp
index 2e73498eb52..792e1bf2a86 100644
--- a/src/server/authserver/Server/AuthSocket.cpp
+++ b/src/server/authserver/Server/AuthSocket.cpp
@@ -196,12 +196,12 @@ const AuthHandler table[] =
Patcher PatchesCache;
// Constructor - set the N and g values for SRP6
-AuthSocket::AuthSocket(RealmSocket& socket) : pPatch(NULL), socket_(socket)
+AuthSocket::AuthSocket(RealmSocket& socket) :
+ pPatch(NULL), socket_(socket), _authed(false), _build(0),
+ _expversion(0), _accountSecurityLevel(SEC_PLAYER)
{
N.SetHexStr("894B645E89E1535BBDAD5B8B290650530801B18EBFBF5E8FAB3C82872A3E9BB7");
g.SetDword(7);
- _authed = false;
- _accountSecurityLevel = SEC_PLAYER;
}
// Close patch file descriptor before leaving
diff --git a/src/server/authserver/Server/RealmSocket.cpp b/src/server/authserver/Server/RealmSocket.cpp
index e249894a4d3..6710a6a88ae 100644
--- a/src/server/authserver/Server/RealmSocket.cpp
+++ b/src/server/authserver/Server/RealmSocket.cpp
@@ -27,7 +27,9 @@ RealmSocket::Session::Session(void) {}
RealmSocket::Session::~Session(void) { }
-RealmSocket::RealmSocket(void) : input_buffer_(4096), session_(NULL), _remoteAddress()
+RealmSocket::RealmSocket(void) :
+ input_buffer_(4096), session_(NULL),
+ _remoteAddress(), _remotePort(0)
{
reference_counting_policy().value(ACE_Event_Handler::Reference_Counting_Policy::ENABLED);
diff --git a/src/server/collision/Management/VMapManager2.cpp b/src/server/collision/Management/VMapManager2.cpp
index 8a1bd346957..6355dbcf4ce 100644
--- a/src/server/collision/Management/VMapManager2.cpp
+++ b/src/server/collision/Management/VMapManager2.cpp
@@ -96,7 +96,10 @@ namespace VMAP
std::string mapFileName = getMapFileName(mapId);
StaticMapTree* newTree = new StaticMapTree(mapId, basePath);
if (!newTree->InitMap(mapFileName, this))
+ {
+ delete newTree;
return false;
+ }
instanceTree = iInstanceMapTrees.insert(InstanceTreeMap::value_type(mapId, newTree)).first;
}
diff --git a/src/server/collision/Maps/MapTree.cpp b/src/server/collision/Maps/MapTree.cpp
index 7dbfcd78bc9..dc12bb68e0d 100644
--- a/src/server/collision/Maps/MapTree.cpp
+++ b/src/server/collision/Maps/MapTree.cpp
@@ -119,8 +119,9 @@ namespace VMAP
return intersectionCallBack.result;
}
- StaticMapTree::StaticMapTree(uint32 mapID, const std::string &basePath)
- : iMapID(mapID), iIsTiled(false), iTreeValues(0), iBasePath(basePath)
+ StaticMapTree::StaticMapTree(uint32 mapID, const std::string &basePath) :
+ iMapID(mapID), iIsTiled(false), iTreeValues(NULL),
+ iNTreeValues(0), iBasePath(basePath)
{
if (iBasePath.length() > 0 && iBasePath[iBasePath.length()-1] != '/' && iBasePath[iBasePath.length()-1] != '\\')
{
@@ -273,54 +274,49 @@ namespace VMAP
bool StaticMapTree::InitMap(const std::string &fname, VMapManager2* vm)
{
VMAP_DEBUG_LOG(LOG_FILTER_MAPS, "StaticMapTree::InitMap() : initializing StaticMapTree '%s'", fname.c_str());
- bool success = true;
+ bool success = false;
std::string fullname = iBasePath + fname;
FILE* rf = fopen(fullname.c_str(), "rb");
if (!rf)
return false;
- else
+
+ char chunk[8];
+ char tiled = '\0';
+
+ if (readChunk(rf, chunk, VMAP_MAGIC, 8) && fread(&tiled, sizeof(char), 1, rf) == 1 &&
+ readChunk(rf, chunk, "NODE", 4) && iTree.readFromFile(rf))
{
- char chunk[8];
- //general info
- if (!readChunk(rf, chunk, VMAP_MAGIC, 8)) success = false;
- char tiled = '\0';
- if (success && fread(&tiled, sizeof(char), 1, rf) != 1) success = false;
- iIsTiled = bool(tiled);
- // Nodes
- if (success && !readChunk(rf, chunk, "NODE", 4)) success = false;
- if (success) success = iTree.readFromFile(rf);
- if (success)
- {
- iNTreeValues = iTree.primCount();
- iTreeValues = new ModelInstance[iNTreeValues];
- }
+ iNTreeValues = iTree.primCount();
+ iTreeValues = new ModelInstance[iNTreeValues];
+ success = readChunk(rf, chunk, "GOBJ", 4);
+ }
+
+ iIsTiled = bool(tiled);
- if (success && !readChunk(rf, chunk, "GOBJ", 4)) success = false;
- // global model spawns
- // only non-tiled maps have them, and if so exactly one (so far at least...)
- ModelSpawn spawn;
+ // global model spawns
+ // only non-tiled maps have them, and if so exactly one (so far at least...)
+ ModelSpawn spawn;
#ifdef VMAP_DEBUG
- TC_LOG_DEBUG(LOG_FILTER_MAPS, "StaticMapTree::InitMap() : map isTiled: %u", static_cast<uint32>(iIsTiled));
+ TC_LOG_DEBUG(LOG_FILTER_MAPS, "StaticMapTree::InitMap() : map isTiled: %u", static_cast<uint32>(iIsTiled));
#endif
- if (!iIsTiled && ModelSpawn::readFromFile(rf, spawn))
+ if (!iIsTiled && ModelSpawn::readFromFile(rf, spawn))
+ {
+ WorldModel* model = vm->acquireModelInstance(iBasePath, spawn.name);
+ VMAP_DEBUG_LOG(LOG_FILTER_MAPS, "StaticMapTree::InitMap() : loading %s", spawn.name.c_str());
+ if (model)
{
- WorldModel* model = vm->acquireModelInstance(iBasePath, spawn.name);
- VMAP_DEBUG_LOG(LOG_FILTER_MAPS, "StaticMapTree::InitMap() : loading %s", spawn.name.c_str());
- if (model)
- {
- // assume that global model always is the first and only tree value (could be improved...)
- iTreeValues[0] = ModelInstance(spawn, model);
- iLoadedSpawns[0] = 1;
- }
- else
- {
- success = false;
- VMAP_ERROR_LOG(LOG_FILTER_GENERAL, "StaticMapTree::InitMap() : could not acquire WorldModel pointer for '%s'", spawn.name.c_str());
- }
+ // assume that global model always is the first and only tree value (could be improved...)
+ iTreeValues[0] = ModelInstance(spawn, model);
+ iLoadedSpawns[0] = 1;
+ }
+ else
+ {
+ success = false;
+ VMAP_ERROR_LOG(LOG_FILTER_GENERAL, "StaticMapTree::InitMap() : could not acquire WorldModel pointer for '%s'", spawn.name.c_str());
}
-
- fclose(rf);
}
+
+ fclose(rf);
return success;
}
diff --git a/src/server/collision/Maps/MapTree.h b/src/server/collision/Maps/MapTree.h
index e97c44d089e..c66893da82f 100644
--- a/src/server/collision/Maps/MapTree.h
+++ b/src/server/collision/Maps/MapTree.h
@@ -85,7 +85,8 @@ namespace VMAP
struct AreaInfo
{
- AreaInfo(): result(false), ground_Z(-G3D::inf()) {}
+ AreaInfo(): result(false), ground_Z(-G3D::inf()), flags(0), adtId(0),
+ rootId(0), groupId(0) {}
bool result;
float ground_Z;
uint32 flags;
diff --git a/src/server/collision/Maps/TileAssembler.cpp b/src/server/collision/Maps/TileAssembler.cpp
index a73e5ed4dc3..b2d381b0ffd 100644
--- a/src/server/collision/Maps/TileAssembler.cpp
+++ b/src/server/collision/Maps/TileAssembler.cpp
@@ -152,23 +152,25 @@ namespace VMAP
uint32 x, y;
StaticMapTree::unpackTileID(tile->first, x, y);
tilefilename << std::setw(2) << x << '_' << std::setw(2) << y << ".vmtile";
- FILE* tilefile = fopen(tilefilename.str().c_str(), "wb");
- // file header
- if (success && fwrite(VMAP_MAGIC, 1, 8, tilefile) != 8) success = false;
- // write number of tile spawns
- if (success && fwrite(&nSpawns, sizeof(uint32), 1, tilefile) != 1) success = false;
- // write tile spawns
- for (uint32 s=0; s<nSpawns; ++s)
+ if (FILE* tilefile = fopen(tilefilename.str().c_str(), "wb"))
{
- if (s)
- ++tile;
- const ModelSpawn &spawn2 = map_iter->second->UniqueEntries[tile->second];
- success = success && ModelSpawn::writeToFile(tilefile, spawn2);
- // MapTree nodes to update when loading tile:
- std::map<uint32, uint32>::iterator nIdx = modelNodeIdx.find(spawn2.ID);
- if (success && fwrite(&nIdx->second, sizeof(uint32), 1, tilefile) != 1) success = false;
+ // file header
+ if (success && fwrite(VMAP_MAGIC, 1, 8, tilefile) != 8) success = false;
+ // write number of tile spawns
+ if (success && fwrite(&nSpawns, sizeof(uint32), 1, tilefile) != 1) success = false;
+ // write tile spawns
+ for (uint32 s=0; s<nSpawns; ++s)
+ {
+ if (s)
+ ++tile;
+ const ModelSpawn &spawn2 = map_iter->second->UniqueEntries[tile->second];
+ success = success && ModelSpawn::writeToFile(tilefile, spawn2);
+ // MapTree nodes to update when loading tile:
+ std::map<uint32, uint32>::iterator nIdx = modelNodeIdx.find(spawn2.ID);
+ if (success && fwrite(&nIdx->second, sizeof(uint32), 1, tilefile) != 1) success = false;
+ }
+ fclose(tilefile);
}
- fclose(tilefile);
}
// break; //test, extract only first map; TODO: remvoe this line
}
diff --git a/src/server/collision/Maps/TileAssembler.h b/src/server/collision/Maps/TileAssembler.h
index a11ce272d62..56cb7600e4f 100644
--- a/src/server/collision/Maps/TileAssembler.h
+++ b/src/server/collision/Maps/TileAssembler.h
@@ -40,6 +40,7 @@ namespace VMAP
private:
G3D::Matrix3 iRotation;
public:
+ ModelPosition(): iScale(0.0f) { }
G3D::Vector3 iPos;
G3D::Vector3 iDir;
float iScale;
@@ -74,7 +75,8 @@ namespace VMAP
std::vector<G3D::Vector3> vertexArray;
class WmoLiquid* liquid;
- GroupModel_Raw() : liquid(0) {}
+ GroupModel_Raw() : mogpflags(0), GroupWMOID(0), liquidflags(0),
+ liquid(NULL) {}
~GroupModel_Raw();
bool Read(FILE* f);
diff --git a/src/server/collision/Models/WorldModel.cpp b/src/server/collision/Models/WorldModel.cpp
index ca0f95c74e3..3c72cb80308 100644
--- a/src/server/collision/Models/WorldModel.cpp
+++ b/src/server/collision/Models/WorldModel.cpp
@@ -205,35 +205,48 @@ namespace VMAP
bool WmoLiquid::writeToFile(FILE* wf)
{
- bool result = true;
- if (result && fwrite(&iTilesX, sizeof(uint32), 1, wf) != 1) result = false;
- if (result && fwrite(&iTilesY, sizeof(uint32), 1, wf) != 1) result = false;
- if (result && fwrite(&iCorner, sizeof(Vector3), 1, wf) != 1) result = false;
- if (result && fwrite(&iType, sizeof(uint32), 1, wf) != 1) result = false;
- uint32 size = (iTilesX + 1)*(iTilesY + 1);
- if (result && fwrite(iHeight, sizeof(float), size, wf) != size) result = false;
- size = iTilesX*iTilesY;
- if (result && fwrite(iFlags, sizeof(uint8), size, wf) != size) result = false;
+ bool result = false;
+ if (fwrite(&iTilesX, sizeof(uint32), 1, wf) == 1 &&
+ fwrite(&iTilesY, sizeof(uint32), 1, wf) == 1 &&
+ fwrite(&iCorner, sizeof(Vector3), 1, wf) == 1 &&
+ fwrite(&iType, sizeof(uint32), 1, wf) == 1)
+ {
+ uint32 size = (iTilesX + 1) * (iTilesY + 1);
+ if (fwrite(iHeight, sizeof(float), size, wf) == size)
+ {
+ size = iTilesX*iTilesY;
+ result = fwrite(iFlags, sizeof(uint8), size, wf) == size;
+ }
+ }
+
return result;
}
bool WmoLiquid::readFromFile(FILE* rf, WmoLiquid* &out)
{
- bool result = true;
+ bool result = false;
WmoLiquid* liquid = new WmoLiquid();
- if (result && fread(&liquid->iTilesX, sizeof(uint32), 1, rf) != 1) result = false;
- if (result && fread(&liquid->iTilesY, sizeof(uint32), 1, rf) != 1) result = false;
- if (result && fread(&liquid->iCorner, sizeof(Vector3), 1, rf) != 1) result = false;
- if (result && fread(&liquid->iType, sizeof(uint32), 1, rf) != 1) result = false;
- uint32 size = (liquid->iTilesX + 1)*(liquid->iTilesY + 1);
- liquid->iHeight = new float[size];
- if (result && fread(liquid->iHeight, sizeof(float), size, rf) != size) result = false;
- size = liquid->iTilesX * liquid->iTilesY;
- liquid->iFlags = new uint8[size];
- if (result && fread(liquid->iFlags, sizeof(uint8), size, rf) != size) result = false;
+
+ if (fread(&liquid->iTilesX, sizeof(uint32), 1, rf) == 1 &&
+ fread(&liquid->iTilesY, sizeof(uint32), 1, rf) == 1 &&
+ fread(&liquid->iCorner, sizeof(Vector3), 1, rf) == 1 &&
+ fread(&liquid->iType, sizeof(uint32), 1, rf) == 1)
+ {
+ uint32 size = (liquid->iTilesX + 1) * (liquid->iTilesY + 1);
+ liquid->iHeight = new float[size];
+ if (fread(liquid->iHeight, sizeof(float), size, rf) == size)
+ {
+ size = liquid->iTilesX * liquid->iTilesY;
+ liquid->iFlags = new uint8[size];
+ result = fread(liquid->iFlags, sizeof(uint8), size, rf) == size;
+ }
+ }
+
if (!result)
delete liquid;
- out = liquid;
+ else
+ out = liquid;
+
return result;
}
diff --git a/src/server/game/AI/CoreAI/UnitAI.cpp b/src/server/game/AI/CoreAI/UnitAI.cpp
index 0ab807466d5..70c4761e025 100644
--- a/src/server/game/AI/CoreAI/UnitAI.cpp
+++ b/src/server/game/AI/CoreAI/UnitAI.cpp
@@ -123,34 +123,45 @@ void UnitAI::DoCastToAllHostilePlayers(uint32 spellid, bool triggered)
void UnitAI::DoCast(uint32 spellId)
{
Unit* target = NULL;
- //TC_LOG_ERROR(LOG_FILTER_GENERAL, "aggre %u %u", spellId, (uint32)AISpellInfo[spellId].target);
+
switch (AISpellInfo[spellId].target)
{
default:
- case AITARGET_SELF: target = me; break;
- case AITARGET_VICTIM: target = me->getVictim(); break;
+ case AITARGET_SELF:
+ target = me;
+ break;
+ case AITARGET_VICTIM:
+ target = me->getVictim();
+ break;
case AITARGET_ENEMY:
{
- const SpellInfo* spellInfo = sSpellMgr->GetSpellInfo(spellId);
- bool playerOnly = spellInfo->AttributesEx3 & SPELL_ATTR3_ONLY_TARGET_PLAYERS;
- //float range = GetSpellMaxRange(spellInfo, false);
- target = SelectTarget(SELECT_TARGET_RANDOM, 0, spellInfo->GetMaxRange(false), playerOnly);
+ if (SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId))
+ {
+ bool playerOnly = spellInfo->AttributesEx3 & SPELL_ATTR3_ONLY_TARGET_PLAYERS;
+ target = SelectTarget(SELECT_TARGET_RANDOM, 0, spellInfo->GetMaxRange(false), playerOnly);
+ }
break;
}
- case AITARGET_ALLY: target = me; break;
- case AITARGET_BUFF: target = me; break;
+ case AITARGET_ALLY:
+ target = me;
+ break;
+ case AITARGET_BUFF:
+ target = me;
+ break;
case AITARGET_DEBUFF:
{
- const SpellInfo* spellInfo = sSpellMgr->GetSpellInfo(spellId);
- bool playerOnly = spellInfo->AttributesEx3 & SPELL_ATTR3_ONLY_TARGET_PLAYERS;
- float range = spellInfo->GetMaxRange(false);
-
- DefaultTargetSelector targetSelector(me, range, playerOnly, -(int32)spellId);
- if (!(spellInfo->AuraInterruptFlags & AURA_INTERRUPT_FLAG_NOT_VICTIM)
- && targetSelector(me->getVictim()))
- target = me->getVictim();
- else
- target = SelectTarget(SELECT_TARGET_RANDOM, 0, targetSelector);
+ if (SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId))
+ {
+ bool playerOnly = spellInfo->AttributesEx3 & SPELL_ATTR3_ONLY_TARGET_PLAYERS;
+ float range = spellInfo->GetMaxRange(false);
+
+ DefaultTargetSelector targetSelector(me, range, playerOnly, -(int32)spellId);
+ if (!(spellInfo->AuraInterruptFlags & AURA_INTERRUPT_FLAG_NOT_VICTIM)
+ && targetSelector(me->getVictim()))
+ target = me->getVictim();
+ else
+ target = SelectTarget(SELECT_TARGET_RANDOM, 0, targetSelector);
+ }
break;
}
}
diff --git a/src/server/game/AI/SmartScripts/SmartScript.cpp b/src/server/game/AI/SmartScripts/SmartScript.cpp
index 576d77a2e24..9d182ee6885 100644
--- a/src/server/game/AI/SmartScripts/SmartScript.cpp
+++ b/src/server/game/AI/SmartScripts/SmartScript.cpp
@@ -657,9 +657,18 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u
{
if (IsUnit(*itr))
{
- (*itr)->ToUnit()->SetFlag(UNIT_FIELD_FLAGS, e.action.unitFlag.flag);
- TC_LOG_DEBUG(LOG_FILTER_DATABASE_AI, "SmartScript::ProcessAction:: SMART_ACTION_SET_UNIT_FLAG. Unit %u added flag %u to UNIT_FIELD_FLAGS",
+ if (!e.action.unitFlag.type)
+ {
+ (*itr)->ToUnit()->SetFlag(UNIT_FIELD_FLAGS, e.action.unitFlag.flag);
+ TC_LOG_DEBUG(LOG_FILTER_DATABASE_AI, "SmartScript::ProcessAction:: SMART_ACTION_SET_UNIT_FLAG. Unit %u added flag %u to UNIT_FIELD_FLAGS",
+ (*itr)->GetGUIDLow(), e.action.unitFlag.flag);
+ }
+ else
+ {
+ (*itr)->ToUnit()->SetFlag(UNIT_FIELD_FLAGS_2, e.action.unitFlag.flag);
+ TC_LOG_DEBUG(LOG_FILTER_DATABASE_AI, "SmartScript::ProcessAction:: SMART_ACTION_SET_UNIT_FLAG. Unit %u added flag %u to UNIT_FIELD_FLAGS_2",
(*itr)->GetGUIDLow(), e.action.unitFlag.flag);
+ }
}
}
@@ -676,9 +685,18 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u
{
if (IsUnit(*itr))
{
- (*itr)->ToUnit()->RemoveFlag(UNIT_FIELD_FLAGS, e.action.unitFlag.flag);
- TC_LOG_DEBUG(LOG_FILTER_DATABASE_AI, "SmartScript::ProcessAction:: SMART_ACTION_REMOVE_UNIT_FLAG. Unit %u removed flag %u to UNIT_FIELD_FLAGS",
+ if (!e.action.unitFlag.type)
+ {
+ (*itr)->ToUnit()->RemoveFlag(UNIT_FIELD_FLAGS, e.action.unitFlag.flag);
+ TC_LOG_DEBUG(LOG_FILTER_DATABASE_AI, "SmartScript::ProcessAction:: SMART_ACTION_REMOVE_UNIT_FLAG. Unit %u removed flag %u to UNIT_FIELD_FLAGS",
+ (*itr)->GetGUIDLow(), e.action.unitFlag.flag);
+ }
+ else
+ {
+ (*itr)->ToUnit()->RemoveFlag(UNIT_FIELD_FLAGS_2, e.action.unitFlag.flag);
+ TC_LOG_DEBUG(LOG_FILTER_DATABASE_AI, "SmartScript::ProcessAction:: SMART_ACTION_REMOVE_UNIT_FLAG. Unit %u removed flag %u to UNIT_FIELD_FLAGS_2",
(*itr)->GetGUIDLow(), e.action.unitFlag.flag);
+ }
}
}
diff --git a/src/server/game/AI/SmartScripts/SmartScriptMgr.h b/src/server/game/AI/SmartScripts/SmartScriptMgr.h
index 875a67d7f3c..d80b4816d4b 100644
--- a/src/server/game/AI/SmartScripts/SmartScriptMgr.h
+++ b/src/server/game/AI/SmartScripts/SmartScriptMgr.h
@@ -828,6 +828,7 @@ struct SmartAction
struct
{
uint32 flag;
+ uint32 type;
} unitFlag;
struct
diff --git a/src/server/game/Achievements/AchievementMgr.cpp b/src/server/game/Achievements/AchievementMgr.cpp
index f7811753147..888605b4745 100644
--- a/src/server/game/Achievements/AchievementMgr.cpp
+++ b/src/server/game/Achievements/AchievementMgr.cpp
@@ -406,8 +406,11 @@ void AchievementMgr<Player>::SendPacket(WorldPacket* data) const
}
template<class T>
-void AchievementMgr<T>::RemoveCriteriaProgress(const AchievementCriteriaEntry* entry)
+void AchievementMgr<T>::RemoveCriteriaProgress(AchievementCriteriaEntry const* entry)
{
+ if (!entry)
+ return;
+
CriteriaProgressMap::iterator criteriaProgress = m_criteriaProgress.find(entry->ID);
if (criteriaProgress == m_criteriaProgress.end())
return;
@@ -420,8 +423,11 @@ void AchievementMgr<T>::RemoveCriteriaProgress(const AchievementCriteriaEntry* e
}
template<>
-void AchievementMgr<Guild>::RemoveCriteriaProgress(const AchievementCriteriaEntry* entry)
+void AchievementMgr<Guild>::RemoveCriteriaProgress(AchievementCriteriaEntry const* entry)
{
+ if (!entry)
+ return;
+
CriteriaProgressMap::iterator criteriaProgress = m_criteriaProgress.find(entry->ID);
if (criteriaProgress == m_criteriaProgress.end())
return;
@@ -1448,6 +1454,9 @@ void AchievementMgr<T>::UpdateAchievementCriteria(AchievementCriteriaTypes type,
template<class T>
bool AchievementMgr<T>::IsCompletedCriteria(AchievementCriteriaEntry const* achievementCriteria, AchievementEntry const* achievement)
{
+ if (!achievement)
+ return false;
+
// counter can never complete
if (achievement->flags & ACHIEVEMENT_FLAG_COUNTER)
return false;
@@ -2049,10 +2058,14 @@ void AchievementMgr<T>::SendAllAchievementData(Player* /*receiver*/) const
template<>
void AchievementMgr<Guild>::SendAllAchievementData(Player* receiver) const
{
+ VisibleAchievementPred isVisible;
WorldPacket data(SMSG_GUILD_ACHIEVEMENT_DATA, m_completedAchievements.size() * (4 + 4) + 3);
- data.WriteBits(m_completedAchievements.size(), 23);
+ data.WriteBits(std::count_if(m_completedAchievements.begin(), m_completedAchievements.end(), isVisible), 23);
for (CompletedAchievementMap::const_iterator itr = m_completedAchievements.begin(); itr != m_completedAchievements.end(); ++itr)
{
+ if (!isVisible(*itr))
+ continue;
+
data.AppendPackedTime(itr->second.date);
data << uint32(itr->first);
}
diff --git a/src/server/game/Battlefield/Zones/BattlefieldWG.h b/src/server/game/Battlefield/Zones/BattlefieldWG.h
index 10d28118325..f2d96c1d1a0 100644
--- a/src/server/game/Battlefield/Zones/BattlefieldWG.h
+++ b/src/server/game/Battlefield/Zones/BattlefieldWG.h
@@ -1481,6 +1481,7 @@ struct WGWorkshop
bf = _bf;
workshopId = _workshopId;
+ teamControl = BATTLEFIELD_WG_TEAM_NEUTRAL;
}
void GiveControlTo(uint8 team, bool init /* for first call in setup*/)
diff --git a/src/server/game/Battlegrounds/ArenaTeam.cpp b/src/server/game/Battlegrounds/ArenaTeam.cpp
index 668858618cb..9639e36f204 100644
--- a/src/server/game/Battlegrounds/ArenaTeam.cpp
+++ b/src/server/game/Battlegrounds/ArenaTeam.cpp
@@ -271,6 +271,19 @@ bool ArenaTeam::LoadMembersFromDB(QueryResult result)
return true;
}
+bool ArenaTeam::SetName(std::string const& name)
+{
+ if (TeamName == name || name.empty() || name.length() > 24 || sObjectMgr->IsReservedName(name) || !ObjectMgr::IsValidCharterName(name))
+ return false;
+
+ TeamName = name;
+ PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_ARENA_TEAM_NAME);
+ stmt->setString(0, TeamName);
+ stmt->setUInt32(1, GetId());
+ CharacterDatabase.Execute(stmt);
+ return true;
+}
+
void ArenaTeam::SetCaptain(uint64 guid)
{
// Disable remove/promote buttons
@@ -360,6 +373,29 @@ void ArenaTeam::Disband(WorldSession* session)
sArenaTeamMgr->RemoveArenaTeam(TeamId);
}
+void ArenaTeam::Disband()
+{
+ // Remove all members from arena team
+ while (!Members.empty())
+ DelMember(Members.front().Guid, false);
+
+ // Update database
+ SQLTransaction trans = CharacterDatabase.BeginTransaction();
+
+ PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_ARENA_TEAM);
+ stmt->setUInt32(0, TeamId);
+ trans->Append(stmt);
+
+ stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_ARENA_TEAM_MEMBERS);
+ stmt->setUInt32(0, TeamId);
+ trans->Append(stmt);
+
+ CharacterDatabase.CommitTransaction(trans);
+
+ // Remove arena team from ObjectMgr
+ sArenaTeamMgr->RemoveArenaTeam(TeamId);
+}
+
void ArenaTeam::Roster(WorldSession* session)
{
Player* player = NULL;
diff --git a/src/server/game/Battlegrounds/ArenaTeam.h b/src/server/game/Battlegrounds/ArenaTeam.h
index 59b1275a549..e25fbba235b 100644
--- a/src/server/game/Battlegrounds/ArenaTeam.h
+++ b/src/server/game/Battlegrounds/ArenaTeam.h
@@ -118,6 +118,7 @@ class ArenaTeam
uint32 backgroundColor, uint8 emblemStyle, uint32 emblemColor,
uint8 borderStyle, uint32 borderColor);
void Disband(WorldSession* session);
+ void Disband();
typedef std::list<ArenaTeamMember> MemberList;
@@ -134,6 +135,7 @@ class ArenaTeam
uint32 GetAverageMMR(Group* group) const;
void SetCaptain(uint64 guid);
+ bool SetName(std::string const& name);
bool AddMember(uint64 PlayerGuid);
void DelMember(uint64 guid, bool cleanDb);
diff --git a/src/server/game/Chat/Chat.cpp b/src/server/game/Chat/Chat.cpp
index d62f9e4eaa7..1515c75597f 100644
--- a/src/server/game/Chat/Chat.cpp
+++ b/src/server/game/Chat/Chat.cpp
@@ -143,7 +143,7 @@ bool ChatHandler::isAvailable(ChatCommand const& cmd) const
return m_session->GetSecurity() >= AccountTypes(cmd.SecurityLevel);
}
- return m_session->HasPermission(permission);
+ return HasPermission(permission);
}
bool ChatHandler::HasLowerSecurity(Player* target, uint64 guid, bool strong)
@@ -205,7 +205,7 @@ bool ChatHandler::hasStringAbbr(const char* name, const char* part)
if (!*part)
return false;
- for (;;)
+ while (true)
{
if (!*part)
return true;
diff --git a/src/server/game/Chat/Chat.h b/src/server/game/Chat/Chat.h
index 538273062ae..298bb91692b 100644
--- a/src/server/game/Chat/Chat.h
+++ b/src/server/game/Chat/Chat.h
@@ -86,6 +86,7 @@ class ChatHandler
// function with different implementation for chat/console
virtual bool isAvailable(ChatCommand const& cmd) const;
+ virtual bool HasPermission(uint32 permission) const { return m_session->HasPermission(permission); }
virtual std::string GetNameLink() const { return GetNameLink(m_session->GetPlayer()); }
virtual bool needReportToTarget(Player* chr) const;
virtual LocaleConstant GetSessionDbcLocale() const;
@@ -149,6 +150,7 @@ class CliHandler : public ChatHandler
// overwrite functions
const char *GetTrinityString(int32 entry) const;
bool isAvailable(ChatCommand const& cmd) const;
+ bool HasPermission(uint32 /*permission*/) const { return true; }
void SendSysMessage(const char *str);
std::string GetNameLink() const;
bool needReportToTarget(Player* chr) const;
diff --git a/src/server/game/Entities/Creature/Creature.cpp b/src/server/game/Entities/Creature/Creature.cpp
index cf8a01a765e..79beab4f7e6 100644
--- a/src/server/game/Entities/Creature/Creature.cpp
+++ b/src/server/game/Entities/Creature/Creature.cpp
@@ -2451,19 +2451,18 @@ uint32 Creature::GetVendorItemCurrentCount(VendorItem const* vItem)
time_t ptime = time(NULL);
if (time_t(vCount->lastIncrementTime + vItem->incrtime) <= ptime)
- {
- ItemTemplate const* pProto = sObjectMgr->GetItemTemplate(vItem->item);
-
- uint32 diff = uint32((ptime - vCount->lastIncrementTime)/vItem->incrtime);
- if ((vCount->count + diff * pProto->BuyCount) >= vItem->maxcount)
+ if (ItemTemplate const* pProto = sObjectMgr->GetItemTemplate(vItem->item))
{
- m_vendorItemCounts.erase(itr);
- return vItem->maxcount;
- }
+ uint32 diff = uint32((ptime - vCount->lastIncrementTime)/vItem->incrtime);
+ if ((vCount->count + diff * pProto->BuyCount) >= vItem->maxcount)
+ {
+ m_vendorItemCounts.erase(itr);
+ return vItem->maxcount;
+ }
- vCount->count += diff * pProto->BuyCount;
- vCount->lastIncrementTime = ptime;
- }
+ vCount->count += diff * pProto->BuyCount;
+ vCount->lastIncrementTime = ptime;
+ }
return vCount->count;
}
@@ -2490,15 +2489,14 @@ uint32 Creature::UpdateVendorItemCurrentCount(VendorItem const* vItem, uint32 us
time_t ptime = time(NULL);
if (time_t(vCount->lastIncrementTime + vItem->incrtime) <= ptime)
- {
- ItemTemplate const* pProto = sObjectMgr->GetItemTemplate(vItem->item);
-
- uint32 diff = uint32((ptime - vCount->lastIncrementTime)/vItem->incrtime);
- if ((vCount->count + diff * pProto->BuyCount) < vItem->maxcount)
- vCount->count += diff * pProto->BuyCount;
- else
- vCount->count = vItem->maxcount;
- }
+ if (ItemTemplate const* pProto = sObjectMgr->GetItemTemplate(vItem->item))
+ {
+ uint32 diff = uint32((ptime - vCount->lastIncrementTime)/vItem->incrtime);
+ if ((vCount->count + diff * pProto->BuyCount) < vItem->maxcount)
+ vCount->count += diff * pProto->BuyCount;
+ else
+ vCount->count = vItem->maxcount;
+ }
vCount->count = vCount->count > used_count ? vCount->count-used_count : 0;
vCount->lastIncrementTime = ptime;
diff --git a/src/server/game/Entities/Creature/GossipDef.cpp b/src/server/game/Entities/Creature/GossipDef.cpp
index c6d9bd52e18..3cefc5881e9 100644
--- a/src/server/game/Entities/Creature/GossipDef.cpp
+++ b/src/server/game/Entities/Creature/GossipDef.cpp
@@ -184,7 +184,9 @@ void PlayerMenu::SendGossipMenu(uint32 titleTextId, uint64 objectGUID) const
data << item.BoxMessage; // accept text (related to money) pop up box, 2.0.3
}
- data << uint32(_questMenu.GetMenuItemCount()); // max count 0x20
+ size_t count_pos = data.wpos();
+ data << uint32(0); // max count 0x20
+ uint32 count = 0;
// Store this instead of checking the Singleton every loop iteration
bool questLevelInTitle = sWorld->getBoolConfig(CONFIG_UI_QUESTLEVELS_IN_DIALOGS);
@@ -193,26 +195,29 @@ void PlayerMenu::SendGossipMenu(uint32 titleTextId, uint64 objectGUID) const
{
QuestMenuItem const& item = _questMenu.GetItem(i);
uint32 questID = item.QuestId;
- Quest const* quest = sObjectMgr->GetQuestTemplate(questID);
-
- data << uint32(questID);
- data << uint32(item.QuestIcon);
- data << int32(quest->GetQuestLevel());
- data << uint32(quest->GetFlags()); // 3.3.3 quest flags
- data << uint8(0); // 3.3.3 changes icon: blue question or yellow exclamation
- std::string title = quest->GetTitle();
+ if (Quest const* quest = sObjectMgr->GetQuestTemplate(questID))
+ {
+ ++count;
+ data << uint32(questID);
+ data << uint32(item.QuestIcon);
+ data << int32(quest->GetQuestLevel());
+ data << uint32(quest->GetFlags()); // 3.3.3 quest flags
+ data << uint8(0); // 3.3.3 changes icon: blue question or yellow exclamation
+ std::string title = quest->GetTitle();
- int32 locale = _session->GetSessionDbLocaleIndex();
- if (locale >= 0)
- if (QuestLocale const* localeData = sObjectMgr->GetQuestLocale(questID))
- ObjectMgr::GetLocaleString(localeData->Title, locale, title);
+ int32 locale = _session->GetSessionDbLocaleIndex();
+ if (locale >= 0)
+ if (QuestLocale const* localeData = sObjectMgr->GetQuestLocale(questID))
+ ObjectMgr::GetLocaleString(localeData->Title, locale, title);
- if (questLevelInTitle)
- AddQuestLevelToTitle(title, quest->GetQuestLevel());
+ if (questLevelInTitle)
+ AddQuestLevelToTitle(title, quest->GetQuestLevel());
- data << title; // max 0x200
+ data << title; // max 0x200
+ }
}
+ data.put<uint8>(count_pos, count);
_session->SendPacket(&data);
}
@@ -300,20 +305,21 @@ void PlayerMenu::SendQuestGiverQuestList(QEmote eEmote, const std::string& Title
data << uint32(eEmote._Emote); // NPC emote
size_t count_pos = data.wpos();
- data << uint8 (_questMenu.GetMenuItemCount());
+ data << uint8 (0);
uint32 count = 0;
// Store this instead of checking the Singleton every loop iteration
bool questLevelInTitle = sWorld->getBoolConfig(CONFIG_UI_QUESTLEVELS_IN_DIALOGS);
- for (; count < _questMenu.GetMenuItemCount(); ++count)
+ for (uint32 i = 0; i < _questMenu.GetMenuItemCount(); ++i)
{
- QuestMenuItem const& qmi = _questMenu.GetItem(count);
+ QuestMenuItem const& qmi = _questMenu.GetItem(i);
uint32 questID = qmi.QuestId;
if (Quest const* quest = sObjectMgr->GetQuestTemplate(questID))
{
+ ++count;
std::string title = quest->GetTitle();
int32 locale = _session->GetSessionDbLocaleIndex();
diff --git a/src/server/game/Entities/GameObject/GameObject.cpp b/src/server/game/Entities/GameObject/GameObject.cpp
index ff74c6921f7..8d15e6ab39a 100644
--- a/src/server/game/Entities/GameObject/GameObject.cpp
+++ b/src/server/game/Entities/GameObject/GameObject.cpp
@@ -87,7 +87,10 @@ bool GameObject::AIM_Initialize()
std::string GameObject::GetAIName() const
{
- return sObjectMgr->GetGameObjectTemplate(GetEntry())->AIName;
+ if (GameObjectTemplate const* got = sObjectMgr->GetGameObjectTemplate(GetEntry()))
+ return got->AIName;
+
+ return "";
}
void GameObject::CleanupsBeforeDelete(bool /*finalCleanup*/)
diff --git a/src/server/game/Entities/Item/Item.cpp b/src/server/game/Entities/Item/Item.cpp
index a25bd463a55..86d02132eca 100644
--- a/src/server/game/Entities/Item/Item.cpp
+++ b/src/server/game/Entities/Item/Item.cpp
@@ -858,16 +858,26 @@ bool Item::IsFitToSpellRequirements(SpellInfo const* spellInfo) const
return true;
}
-void Item::SetEnchantment(EnchantmentSlot slot, uint32 id, uint32 duration, uint32 charges)
+void Item::SetEnchantment(EnchantmentSlot slot, uint32 id, uint32 duration, uint32 charges, uint64 caster /*= 0*/)
{
// Better lost small time at check in comparison lost time at item save to DB.
if ((GetEnchantmentId(slot) == id) && (GetEnchantmentDuration(slot) == duration) && (GetEnchantmentCharges(slot) == charges))
return;
+ Player* owner = GetOwner();
+ if (slot < MAX_INSPECTED_ENCHANTMENT_SLOT)
+ {
+ if (uint32 oldEnchant = GetEnchantmentId(slot))
+ owner->GetSession()->SendEnchantmentLog(GetOwnerGUID(), 0, GetEntry(), oldEnchant);
+
+ if (id)
+ owner->GetSession()->SendEnchantmentLog(GetOwnerGUID(), caster, GetEntry(), id);
+ }
+
SetUInt32Value(ITEM_FIELD_ENCHANTMENT_1_1 + slot*MAX_ENCHANTMENT_OFFSET + ENCHANTMENT_ID_OFFSET, id);
SetUInt32Value(ITEM_FIELD_ENCHANTMENT_1_1 + slot*MAX_ENCHANTMENT_OFFSET + ENCHANTMENT_DURATION_OFFSET, duration);
SetUInt32Value(ITEM_FIELD_ENCHANTMENT_1_1 + slot*MAX_ENCHANTMENT_OFFSET + ENCHANTMENT_CHARGES_OFFSET, charges);
- SetState(ITEM_CHANGED, GetOwner());
+ SetState(ITEM_CHANGED, owner);
}
void Item::SetEnchantmentDuration(EnchantmentSlot slot, uint32 duration, Player* owner)
@@ -984,6 +994,16 @@ bool Item::IsLimitedToAnotherMapOrZone(uint32 cur_mapId, uint32 cur_zoneId) cons
return proto && ((proto->Map && proto->Map != cur_mapId) || (proto->Area && proto->Area != cur_zoneId));
}
+void Item::SendUpdateSockets()
+{
+ WorldPacket data(SMSG_SOCKET_GEMS_RESULT, 8+4+4+4+4);
+ data << uint64(GetGUID());
+ for (uint32 i = SOCK_ENCHANTMENT_SLOT; i <= BONUS_ENCHANTMENT_SLOT; ++i)
+ data << uint32(GetEnchantmentId(EnchantmentSlot(i)));
+
+ GetOwner()->GetSession()->SendPacket(&data);
+}
+
// Though the client has the information in the item's data field,
// we have to send SMSG_ITEM_TIME_UPDATE to display the remaining
// time.
diff --git a/src/server/game/Entities/Item/Item.h b/src/server/game/Entities/Item/Item.h
index f69ac0f8965..cdc79d96d67 100644
--- a/src/server/game/Entities/Item/Item.h
+++ b/src/server/game/Entities/Item/Item.h
@@ -295,7 +295,7 @@ class Item : public Object
void SetItemRandomProperties(int32 randomPropId);
void UpdateItemSuffixFactor();
static int32 GenerateItemRandomPropertyId(uint32 item_id);
- void SetEnchantment(EnchantmentSlot slot, uint32 id, uint32 duration, uint32 charges);
+ void SetEnchantment(EnchantmentSlot slot, uint32 id, uint32 duration, uint32 charges, uint64 caster = 0);
void SetEnchantmentDuration(EnchantmentSlot slot, uint32 duration, Player* owner);
void SetEnchantmentCharges(EnchantmentSlot slot, uint32 charges);
void ClearEnchantment(EnchantmentSlot slot);
@@ -306,6 +306,8 @@ class Item : public Object
std::string const& GetText() const { return m_text; }
void SetText(std::string const& text) { m_text = text; }
+ void SendUpdateSockets();
+
void SendTimeUpdate(Player* owner);
void UpdateDuration(Player* owner, uint32 diff);
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp
index 10004862b74..718223304da 100644
--- a/src/server/game/Entities/Player/Player.cpp
+++ b/src/server/game/Entities/Player/Player.cpp
@@ -8017,6 +8017,10 @@ void Player::DuelComplete(DuelCompleteType type)
if (getClass() == CLASS_DEATH_KNIGHT && duel->opponent->GetQuestStatus(12733) == QUEST_STATUS_INCOMPLETE)
duel->opponent->CastSpell(duel->opponent, 52994, true);
+ // Honor points after duel (the winner) - ImpConfig
+ if (uint32 amount = sWorld->getIntConfig(CONFIG_HONOR_AFTER_DUEL))
+ duel->opponent->RewardHonor(NULL, 1, amount);
+
break;
default:
break;
@@ -8063,10 +8067,6 @@ void Player::DuelComplete(DuelCompleteType type)
else if (duel->opponent->GetComboTarget() == GetPetGUID())
duel->opponent->ClearComboPoints();
- // Honor points after duel (the winner) - ImpConfig
- if (uint32 amount = sWorld->getIntConfig(CONFIG_HONOR_AFTER_DUEL))
- duel->opponent->RewardHonor(NULL, 1, amount);
-
//cleanups
SetUInt64Value(PLAYER_DUEL_ARBITER, 0);
SetUInt32Value(PLAYER_DUEL_TEAM, 0);
@@ -9885,6 +9885,16 @@ void Player::SendInitWorldStates(uint32 zoneid, uint32 areaid)
bf->FillInitialWorldStates(data);
break;
}
+ case 4820:
+ if (instance && mapid == 668)
+ instance->FillInitialWorldStates(data);
+ else
+ {
+ data << uint32(4884) << uint32(0); // 9 WORLD_STATE_HOR_WAVES_ENABLED
+ data << uint32(4882) << uint32(0); // 10 WORLD_STATE_HOR_WAVE_COUNT
+ }
+ break;
+
// No break here, intended.
default:
data << uint32(0x914) << uint32(0x0); // 7
@@ -22711,7 +22721,7 @@ void Player::UpdateTriggerVisibility()
if (!obj || !(obj->isTrigger() || obj->HasAuraType(SPELL_AURA_TRANSFORM))) // can transform into triggers
continue;
- obj->BuildCreateUpdateBlockForPlayer(&udata, this);
+ obj->BuildValuesUpdateBlockForPlayer(&udata, this);
}
}
@@ -23681,7 +23691,7 @@ void Player::UpdateForQuestWorldObjects()
if (buildUpdateBlock)
{
- obj->BuildCreateUpdateBlockForPlayer(&udata, this);
+ obj->BuildValuesUpdateBlockForPlayer(&udata, this);
break;
}
}
diff --git a/src/server/game/Entities/Transport/Transport.cpp b/src/server/game/Entities/Transport/Transport.cpp
index 43664a7853e..3ed41781982 100644
--- a/src/server/game/Entities/Transport/Transport.cpp
+++ b/src/server/game/Entities/Transport/Transport.cpp
@@ -691,30 +691,34 @@ void Transport::UpdatePassengerPositions()
float x, y, z, o;
npc->m_movementInfo.t_pos.GetPosition(x, y, z, o);
- CalculatePassengerPosition(x, y, z, o);
+ CalculatePassengerPosition(x, y, z, &o);
GetMap()->CreatureRelocation(npc, x, y, z, o, false);
npc->GetTransportHomePosition(x, y, z, o);
- CalculatePassengerPosition(x, y, z, o);
+ CalculatePassengerPosition(x, y, z, &o);
npc->SetHomePosition(x, y, z, o);
}
}
-void Transport::CalculatePassengerPosition(float& x, float& y, float& z, float& o) const
+void Transport::CalculatePassengerPosition(float& x, float& y, float& z, float* o /*= NULL*/) const
{
- float inx = x, iny = y, inz = z, ino = o;
- o = GetOrientation() + ino;
+ float inx = x, iny = y, inz = z;
+ if (o)
+ *o = Position::NormalizeOrientation(GetOrientation() + *o);
+
x = GetPositionX() + inx * std::cos(GetOrientation()) - iny * std::sin(GetOrientation());
y = GetPositionY() + iny * std::cos(GetOrientation()) + inx * std::sin(GetOrientation());
z = GetPositionZ() + inz;
}
-void Transport::CalculatePassengerOffset(float& x, float& y, float& z, float& o) const
+void Transport::CalculatePassengerOffset(float& x, float& y, float& z, float* o /*= NULL*/) const
{
- o -= GetOrientation();
+ if (o)
+ *o = Position::NormalizeOrientation(*o - GetOrientation());
+
z -= GetPositionZ();
y -= GetPositionY(); // y = searchedY * std::cos(o) + searchedX * std::sin(o)
x -= GetPositionX(); // x = searchedX * std::cos(o) + searchedY * std::sin(o + pi)
float inx = x, iny = y;
- y = (iny - inx * tan(GetOrientation())) / (cos(GetOrientation()) + std::sin(GetOrientation()) * tan(GetOrientation()));
- x = (inx + iny * tan(GetOrientation())) / (cos(GetOrientation()) + std::sin(GetOrientation()) * tan(GetOrientation()));
+ y = (iny - inx * std::tan(GetOrientation())) / (std::cos(GetOrientation()) + std::sin(GetOrientation()) * std::tan(GetOrientation()));
+ x = (inx + iny * std::tan(GetOrientation())) / (std::cos(GetOrientation()) + std::sin(GetOrientation()) * std::tan(GetOrientation()));
}
diff --git a/src/server/game/Entities/Transport/Transport.h b/src/server/game/Entities/Transport/Transport.h
index bae09335f62..445bec456fd 100644
--- a/src/server/game/Entities/Transport/Transport.h
+++ b/src/server/game/Entities/Transport/Transport.h
@@ -50,10 +50,10 @@ class Transport : public GameObject, public TransportBase
void UpdatePassengerPositions();
/// This method transforms supplied transport offsets into global coordinates
- void CalculatePassengerPosition(float& x, float& y, float& z, float& o) const;
+ void CalculatePassengerPosition(float& x, float& y, float& z, float* o = NULL) const;
/// This method transforms supplied global coordinates into local offsets
- void CalculatePassengerOffset(float& x, float& y, float& z, float& o) const;
+ void CalculatePassengerOffset(float& x, float& y, float& z, float* o = NULL) const;
void BuildStartMovePacket(Map const* targetMap);
void BuildStopMovePacket(Map const* targetMap);
diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp
index a0aea414cef..8fa929131e2 100644
--- a/src/server/game/Entities/Unit/Unit.cpp
+++ b/src/server/game/Entities/Unit/Unit.cpp
@@ -416,15 +416,8 @@ void Unit::UpdateSplinePosition()
pos.m_positionZ = loc.z;
pos.SetOrientation(loc.orientation);
- if (Unit* vehicle = GetVehicleBase())
- {
- loc.x += vehicle->GetPositionX();
- loc.y += vehicle->GetPositionY();
- loc.z += vehicle->GetPositionZMinusOffset();
- loc.orientation = vehicle->GetOrientation();
- }
- else if (TransportBase* transport = GetDirectTransport())
- transport->CalculatePassengerPosition(loc.x, loc.y, loc.z, loc.orientation);
+ if (TransportBase* transport = GetDirectTransport())
+ transport->CalculatePassengerPosition(loc.x, loc.y, loc.z, &loc.orientation);
}
if (HasUnitState(UNIT_STATE_CANNOT_TURN))
@@ -11246,7 +11239,7 @@ void Unit::setDeathState(DeathState s)
SetPower(getPowerType(), 0);
// players in instance don't have ZoneScript, but they have InstanceScript
- if (ZoneScript* zoneScript = GetZoneScript() ? GetZoneScript() : (ZoneScript*)GetInstanceScript())
+ if (ZoneScript* zoneScript = GetZoneScript() ? GetZoneScript() : GetInstanceScript())
zoneScript->OnUnitDeath(this);
}
else if (s == JUST_RESPAWNED)
diff --git a/src/server/game/Entities/Vehicle/Vehicle.cpp b/src/server/game/Entities/Vehicle/Vehicle.cpp
index 214a47a6611..503d89a8e82 100644
--- a/src/server/game/Entities/Vehicle/Vehicle.cpp
+++ b/src/server/game/Entities/Vehicle/Vehicle.cpp
@@ -556,7 +556,7 @@ void Vehicle::RelocatePassengers()
float px, py, pz, po;
passenger->m_movementInfo.t_pos.GetPosition(px, py, pz, po);
- CalculatePassengerPosition(px, py, pz, po);
+ CalculatePassengerPosition(px, py, pz, &po);
passenger->UpdatePosition(px, py, pz, po);
}
@@ -675,24 +675,28 @@ uint8 Vehicle::GetAvailableSeatCount() const
return ret;
}
-void Vehicle::CalculatePassengerPosition(float& x, float& y, float& z, float& o) const
+void Vehicle::CalculatePassengerPosition(float& x, float& y, float& z, float* o /*= NULL*/) const
{
- float inx = x, iny = y, inz = z, ino = o;
- o = GetBase()->GetOrientation() + ino;
+ float inx = x, iny = y, inz = z;
+ if (o)
+ *o = Position::NormalizeOrientation(GetBase()->GetOrientation() + *o);
+
x = GetBase()->GetPositionX() + inx * std::cos(GetBase()->GetOrientation()) - iny * std::sin(GetBase()->GetOrientation());
y = GetBase()->GetPositionY() + iny * std::cos(GetBase()->GetOrientation()) + inx * std::sin(GetBase()->GetOrientation());
z = GetBase()->GetPositionZ() + inz;
}
-void Vehicle::CalculatePassengerOffset(float& x, float& y, float& z, float& o) const
+void Vehicle::CalculatePassengerOffset(float& x, float& y, float& z, float* o /*= NULL*/) const
{
- o -= GetBase()->GetOrientation();
+ if (o)
+ *o = Position::NormalizeOrientation(*o - GetBase()->GetOrientation());
+
z -= GetBase()->GetPositionZ();
y -= GetBase()->GetPositionY(); // y = searchedY * std::cos(o) + searchedX * std::sin(o)
x -= GetBase()->GetPositionX(); // x = searchedX * std::cos(o) + searchedY * std::sin(o + pi)
float inx = x, iny = y;
- y = (iny - inx * tan(GetBase()->GetOrientation())) / (cos(GetBase()->GetOrientation()) + std::sin(GetBase()->GetOrientation()) * tan(GetBase()->GetOrientation()));
- x = (inx + iny * tan(GetBase()->GetOrientation())) / (cos(GetBase()->GetOrientation()) + std::sin(GetBase()->GetOrientation()) * tan(GetBase()->GetOrientation()));
+ y = (iny - inx * std::tan(GetBase()->GetOrientation())) / (std::cos(GetBase()->GetOrientation()) + std::sin(GetBase()->GetOrientation()) * std::tan(GetBase()->GetOrientation()));
+ x = (inx + iny * std::tan(GetBase()->GetOrientation())) / (std::cos(GetBase()->GetOrientation()) + std::sin(GetBase()->GetOrientation()) * std::tan(GetBase()->GetOrientation()));
}
/**
diff --git a/src/server/game/Entities/Vehicle/Vehicle.h b/src/server/game/Entities/Vehicle/Vehicle.h
index 3e4a2fd3a78..c83a9fa5f33 100644
--- a/src/server/game/Entities/Vehicle/Vehicle.h
+++ b/src/server/game/Entities/Vehicle/Vehicle.h
@@ -89,10 +89,10 @@ class Vehicle : public TransportBase
void InitMovementInfoForBase();
/// This method transforms supplied transport offsets into global coordinates
- void CalculatePassengerPosition(float& x, float& y, float& z, float& o) const;
+ void CalculatePassengerPosition(float& x, float& y, float& z, float* o = NULL) const;
/// This method transforms supplied global coordinates into local offsets
- void CalculatePassengerOffset(float& x, float& y, float& z, float& o) const;
+ void CalculatePassengerOffset(float& x, float& y, float& z, float* o = NULL) const;
void RemovePendingEvent(VehicleJoinEvent* e);
void RemovePendingEventsForSeat(int8 seatId);
diff --git a/src/server/game/Entities/Vehicle/VehicleDefines.h b/src/server/game/Entities/Vehicle/VehicleDefines.h
index 9db8c15f697..55c47df86ad 100644
--- a/src/server/game/Entities/Vehicle/VehicleDefines.h
+++ b/src/server/game/Entities/Vehicle/VehicleDefines.h
@@ -105,10 +105,10 @@ protected:
public:
/// This method transforms supplied transport offsets into global coordinates
- virtual void CalculatePassengerPosition(float& x, float& y, float& z, float& o) const = 0;
+ virtual void CalculatePassengerPosition(float& x, float& y, float& z, float* o = NULL) const = 0;
/// This method transforms supplied global coordinates into local offsets
- virtual void CalculatePassengerOffset(float& x, float& y, float& z, float& o) const = 0;
+ virtual void CalculatePassengerOffset(float& x, float& y, float& z, float* o = NULL) const = 0;
};
#endif
diff --git a/src/server/game/Handlers/ItemHandler.cpp b/src/server/game/Handlers/ItemHandler.cpp
index d7be695e142..f23a1c9632f 100644
--- a/src/server/game/Handlers/ItemHandler.cpp
+++ b/src/server/game/Handlers/ItemHandler.cpp
@@ -891,14 +891,14 @@ void WorldSession::HandleAutoStoreBankItemOpcode(WorldPacket& recvPacket)
}
}
-void WorldSession::SendEnchantmentLog(uint64 Target, uint64 Caster, uint32 ItemID, uint32 SpellID)
+void WorldSession::SendEnchantmentLog(uint64 target, uint64 caster, uint32 itemId, uint32 enchantId)
{
- WorldPacket data(SMSG_ENCHANTMENTLOG, (8+8+4+4+1)); // last check 4.3.4
- data.appendPackGUID(Target);
- data.appendPackGUID(Caster);
- data << uint32(ItemID);
- data << uint32(SpellID);
- SendPacket(&data);
+ WorldPacket data(SMSG_ENCHANTMENTLOG, (8+8+4+4));
+ data.appendPackGUID(target);
+ data.appendPackGUID(caster);
+ data << uint32(itemId);
+ data << uint32(enchantId);
+ GetPlayer()->SendMessageToSet(&data, true);
}
void WorldSession::SendItemEnchantTimeUpdate(uint64 Playerguid, uint64 Itemguid, uint32 slot, uint32 Duration)
@@ -1201,10 +1201,12 @@ void WorldSession::HandleSocketOpcode(WorldPacket& recvData)
{
if (GemEnchants[i])
{
- uint32 gemCount = 1;
- itemTarget->SetEnchantment(EnchantmentSlot(SOCK_ENCHANTMENT_SLOT+i), GemEnchants[i], 0, 0);
+ itemTarget->SetEnchantment(EnchantmentSlot(SOCK_ENCHANTMENT_SLOT+i), GemEnchants[i], 0, 0, _player->GetGUID());
if (Item* guidItem = _player->GetItemByGuid(gem_guids[i]))
+ {
+ uint32 gemCount = 1;
_player->DestroyItemCount(guidItem, gemCount, true);
+ }
}
}
@@ -1215,7 +1217,7 @@ void WorldSession::HandleSocketOpcode(WorldPacket& recvData)
if (SocketBonusActivated ^ SocketBonusToBeActivated) //if there was a change...
{
_player->ApplyEnchantment(itemTarget, BONUS_ENCHANTMENT_SLOT, false);
- itemTarget->SetEnchantment(BONUS_ENCHANTMENT_SLOT, (SocketBonusToBeActivated ? itemTarget->GetTemplate()->socketBonus : 0), 0, 0);
+ itemTarget->SetEnchantment(BONUS_ENCHANTMENT_SLOT, (SocketBonusToBeActivated ? itemTarget->GetTemplate()->socketBonus : 0), 0, 0, _player->GetGUID());
_player->ApplyEnchantment(itemTarget, BONUS_ENCHANTMENT_SLOT, true);
//it is not displayed, client has an inbuilt system to determine if the bonus is activated
}
@@ -1224,6 +1226,8 @@ void WorldSession::HandleSocketOpcode(WorldPacket& recvData)
_player->RemoveTradeableItem(itemTarget);
itemTarget->ClearSoulboundTradeable(_player); // clear tradeable flag
+
+ itemTarget->SendUpdateSockets();
}
void WorldSession::HandleCancelTempEnchantmentOpcode(WorldPacket& recvData)
diff --git a/src/server/game/Handlers/MailHandler.cpp b/src/server/game/Handlers/MailHandler.cpp
index cea83bbfa93..d34ea534753 100644
--- a/src/server/game/Handlers/MailHandler.cpp
+++ b/src/server/game/Handlers/MailHandler.cpp
@@ -307,10 +307,10 @@ void WorldSession::HandleSendMail(WorldPacket& recvData)
Item* item = items[i];
if (log)
{
- sLog->outCommand(GetAccountId(), "GM %s (Account: %u) mail item: %s (Entry: %u Count: %u) "
- "to player: %s (Account: %u)", GetPlayerName().c_str(), GetAccountId(),
+ sLog->outCommand(GetAccountId(), "GM %s (GUID: %u) (Account: %u) mail item: %s (Entry: %u Count: %u) "
+ "to player: %s (GUID: %u) (Account: %u)", GetPlayerName().c_str(), GetGuidLow(), GetAccountId(),
item->GetTemplate()->Name1.c_str(), item->GetEntry(), item->GetCount(),
- receiverName.c_str(), receiverAccountId);
+ receiverName.c_str(), GUID_LOPART(receiverGuid), receiverAccountId);
}
item->SetNotRefundable(GetPlayer()); // makes the item no longer refundable
@@ -329,8 +329,8 @@ void WorldSession::HandleSendMail(WorldPacket& recvData)
if (log && money > 0)
{
- sLog->outCommand(GetAccountId(), "GM %s (Account: %u) mail money: " UI64FMTD " to player: %s (Account: %u)",
- GetPlayerName().c_str(), GetAccountId(), money, receiverName.c_str(), receiverAccountId);
+ sLog->outCommand(GetAccountId(), "GM %s (GUID: %u) (Account: %u) mail money: " UI64FMTD " to player: %s (GUID: %u) (Account: %u)",
+ GetPlayerName().c_str(), GetGuidLow(), GetAccountId(), money, receiverName.c_str(), GUID_LOPART(receiverGuid), receiverAccountId);
}
}
diff --git a/src/server/game/Handlers/QuestHandler.cpp b/src/server/game/Handlers/QuestHandler.cpp
index c785684cf0e..45be13ae776 100644
--- a/src/server/game/Handlers/QuestHandler.cpp
+++ b/src/server/game/Handlers/QuestHandler.cpp
@@ -603,7 +603,7 @@ void WorldSession::HandlePushQuestToParty(WorldPacket& recvPacket)
continue;
}
- player->PlayerTalkClass->SendQuestGiverQuestDetails(quest, player->GetGUID(), true);
+ player->PlayerTalkClass->SendQuestGiverQuestDetails(quest, _player->GetGUID(), true);
player->SetDivider(_player->GetGUID());
}
}
diff --git a/src/server/game/Miscellaneous/Language.h b/src/server/game/Miscellaneous/Language.h
index c26bbc1dfc9..f3323682e1b 100644
--- a/src/server/game/Miscellaneous/Language.h
+++ b/src/server/game/Miscellaneous/Language.h
@@ -452,7 +452,7 @@ enum TrinityStrings
LANG_COMMAND_GRAVEYARDALRLINKED = 450,
LANG_COMMAND_GRAVEYARDLINKED = 451,
LANG_COMMAND_GRAVEYARDWRONGZONE = 452,
- // = 453, see LANG_PINFO_BAN
+ // = 453, see LANG_PINFO_PLAYER
LANG_COMMAND_GRAVEYARDERROR = 454,
LANG_COMMAND_GRAVEYARD_NOTEAM = 455,
LANG_COMMAND_GRAVEYARD_ANY = 456,
@@ -563,13 +563,9 @@ enum TrinityStrings
LANG_NPCINFO_TRAINER = 546,
LANG_NPCINFO_DUNGEON_ID = 547,
- LANG_PINFO_ACCOUNT = 548,
- LANG_PINFO_LEVEL = 549,
- LANG_PINFO_MUTE = 550,
- LANG_PINFO_BAN = 453,
- LANG_PINFO_MAP_ONLINE = 714,
- LANG_PINFO_MAP_OFFLINE = 716,
- LANG_PINFO_GUILD_INFO = 749,
+ // = 548, see LANG_PINFO_GM_ACTIVE
+ // = 549, see LANG_PINFO_BANNED
+ // = 550, see LANG_PINFO_MUTED
LANG_YOU_SET_EXPLORE_ALL = 551,
LANG_YOU_SET_EXPLORE_NOTHING = 552,
@@ -717,9 +713,9 @@ enum TrinityStrings
LANG_BG_QUEUE_ANNOUNCE_SELF = 711,
LANG_BG_QUEUE_ANNOUNCE_WORLD = 712,
LANG_YOUR_ARENA_LEVEL_REQ_ERROR = 713,
-// = 714, see LANG_PINFO_MAP_ONLINE
+// = 714, see LANG_PINFO_ACC_ACCOUNT
LANG_YOUR_BG_LEVEL_REQ_ERROR = 715,
-// = 716, see LANG_PINFO_MAP_OFFLINE
+// = 716, see LANG_PINFO_ACC_LASTLOGIN
LANG_BG_STARTED_ANNOUNCE_WORLD = 717,
LANG_ARENA_QUEUE_ANNOUNCE_WORLD_JOIN= 718,
LANG_ARENA_QUEUE_ANNOUNCE_WORLD_EXIT= 719,
@@ -754,10 +750,10 @@ enum TrinityStrings
// LANG_DIST_ARENA_POINTS_END = 746,
LANG_BG_DISABLED = 747,
LANG_ARENA_DISABLED = 748,
-// = 749, not used
+// = 749, see LANG_PINFO_ACC_OS
LANG_BATTLEGROUND_PREMATURE_FINISH_WARNING = 750, // "Not enough players. This game will close in %u mins."
LANG_BATTLEGROUND_PREMATURE_FINISH_WARNING_SECS = 751, // "Not enough players. This game will close in %u seconds."
-// = 752, not used
+// = 752, see LANG_PINFO_ACC_IP
// LANG_BG_WS_START_TWO_MINUTES = 753, - defined above
// LANG_BG_AB_START_TWO_MINUTES = 754, - defined above
// LANG_BG_EY_START_TWO_MINUTES = 755, - defined above
@@ -815,7 +811,46 @@ enum TrinityStrings
LANG_NPCINFO_MAILBOX = 841,
LANG_NPCINFO_PLAYER_VEHICLE = 842,
- // Room for in-game strings 843-999 not used
+ // Pinfo commands
+ LANG_PINFO_PLAYER = 453,
+ LANG_PINFO_GM_ACTIVE = 548,
+ LANG_PINFO_BANNED = 549,
+ LANG_PINFO_MUTED = 550,
+ LANG_PINFO_ACC_ACCOUNT = 714,
+ LANG_PINFO_ACC_LASTLOGIN = 716,
+ LANG_PINFO_ACC_OS = 749,
+ LANG_PINFO_ACC_IP = 752,
+ LANG_PINFO_CHR_LEVEL = 843,
+ LANG_PINFO_CHR_RACE = 844,
+ LANG_PINFO_CHR_ALIVE = 845,
+ LANG_PINFO_CHR_PHASE = 846,
+ LANG_PINFO_CHR_MONEY = 847,
+ LANG_PINFO_CHR_MAP = 848,
+ LANG_PINFO_CHR_GUILD = 849,
+ LANG_PINFO_CHR_GUILD_RANK = 850,
+ LANG_PINFO_CHR_GUILD_NOTE = 851,
+ LANG_PINFO_CHR_GUILD_ONOTE = 852,
+ LANG_PINFO_CHR_PLAYEDTIME = 853,
+ LANG_PINFO_CHR_MAILS = 854,
+
+ LANG_CHARACTER_GENDER_MALE = 855,
+ LANG_CHARACTER_GENDER_FEMALE = 856,
+
+ LANG_ARENA_ERROR_NOT_FOUND = 857,
+ LANG_ARENA_ERROR_NAME_EXISTS = 858,
+ LANG_ARENA_ERROR_SIZE = 859,
+ LANG_ARENA_ERROR_COMBAT = 860,
+ LANG_AREAN_ERROR_NAME_NOT_FOUND = 861,
+ LANG_ARENA_ERROR_NOT_MEMBER = 862,
+ LANG_ARENA_ERROR_CAPTAIN = 863,
+ LANG_ARENA_CREATE = 864,
+ LANG_ARENA_DISBAND = 865,
+ LANG_ARENA_RENAME = 866,
+ LANG_ARENA_CAPTAIN = 867,
+ LANG_ARENA_INFO_HEADER = 868,
+ LANG_ARENA_INFO_MEMBERS = 869,
+ LANG_ARENA_LOOKUP = 870,
+ // Room for in-game strings 870-999 not used
// Level 4 (CLI only commands)
LANG_COMMAND_EXIT = 1000,
diff --git a/src/server/game/Movement/MotionMaster.h b/src/server/game/Movement/MotionMaster.h
index f2f3959dba5..156813f56fb 100644
--- a/src/server/game/Movement/MotionMaster.h
+++ b/src/server/game/Movement/MotionMaster.h
@@ -153,8 +153,8 @@ class MotionMaster //: private std::stack<MovementGenerator *>
void MoveChase(Unit* target, float dist = 0.0f, float angle = 0.0f);
void MoveConfused();
void MoveFleeing(Unit* enemy, uint32 time = 0);
- void MovePoint(uint32 id, const Position &pos)
- { MovePoint(id, pos.m_positionX, pos.m_positionY, pos.m_positionZ); }
+ void MovePoint(uint32 id, Position const& pos, bool generatePath = true)
+ { MovePoint(id, pos.m_positionX, pos.m_positionY, pos.m_positionZ, generatePath); }
void MovePoint(uint32 id, float x, float y, float z, bool generatePath = true);
// These two movement types should only be used with creatures having landing/takeoff animations
diff --git a/src/server/game/Movement/Spline/MoveSplineInit.cpp b/src/server/game/Movement/Spline/MoveSplineInit.cpp
index d42df898a7e..8a60ae05f41 100644
--- a/src/server/game/Movement/Spline/MoveSplineInit.cpp
+++ b/src/server/game/Movement/Spline/MoveSplineInit.cpp
@@ -207,13 +207,8 @@ namespace Movement
Vector3 TransportPathTransform::operator()(Vector3 input)
{
if (_transformForTransport)
- {
if (TransportBase* transport = _owner->GetDirectTransport())
- {
- float unused = 0.0f; // need reference
- transport->CalculatePassengerOffset(input.x, input.y, input.z, unused);
- }
- }
+ transport->CalculatePassengerOffset(input.x, input.y, input.z);
return input;
}
diff --git a/src/server/game/Scripting/ScriptLoader.cpp b/src/server/game/Scripting/ScriptLoader.cpp
index ec1b7ac609e..b566f9dabe1 100644
--- a/src/server/game/Scripting/ScriptLoader.cpp
+++ b/src/server/game/Scripting/ScriptLoader.cpp
@@ -46,6 +46,7 @@ void AddSC_SmartSCripts();
//Commands
void AddSC_account_commandscript();
void AddSC_achievement_commandscript();
+void AddSC_arena_commandscript();
void AddSC_ban_commandscript();
void AddSC_bf_commandscript();
void AddSC_cast_commandscript();
@@ -680,6 +681,7 @@ void AddCommandScripts()
{
AddSC_account_commandscript();
AddSC_achievement_commandscript();
+ AddSC_arena_commandscript();
AddSC_ban_commandscript();
AddSC_bf_commandscript();
AddSC_cast_commandscript();
diff --git a/src/server/game/Server/Protocol/Opcodes.cpp b/src/server/game/Server/Protocol/Opcodes.cpp
index 7572bfcc860..5e66efea913 100644
--- a/src/server/game/Server/Protocol/Opcodes.cpp
+++ b/src/server/game/Server/Protocol/Opcodes.cpp
@@ -1166,6 +1166,7 @@ void OpcodeTable::Initialize()
DEFINE_OPCODE_HANDLER(SMSG_SHOWTAXINODES, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide );
DEFINE_OPCODE_HANDLER(SMSG_SHOW_BANK, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide );
DEFINE_OPCODE_HANDLER(SMSG_SHOW_RATINGS, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_ServerSide );
+ DEFINE_OPCODE_HANDLER(SMSG_SOCKET_GEMS_RESULT, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide );
DEFINE_OPCODE_HANDLER(SMSG_SOR_START_EXPERIENCE_INCOMPLETE, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_ServerSide );
DEFINE_OPCODE_HANDLER(SMSG_SPELLBREAKLOG, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide );
DEFINE_OPCODE_HANDLER(SMSG_SPELLDAMAGESHIELD, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide );
@@ -1263,7 +1264,6 @@ void OpcodeTable::Initialize()
DEFINE_OPCODE_HANDLER(SMSG_UPDATE_DUNGEON_ENCOUNTER_FOR_LOOT, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_ServerSide );
DEFINE_OPCODE_HANDLER(SMSG_UPDATE_INSTANCE_ENCOUNTER_UNIT, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide );
DEFINE_OPCODE_HANDLER(SMSG_UPDATE_INSTANCE_OWNERSHIP, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide );
- DEFINE_OPCODE_HANDLER(SMSG_UPDATE_ITEM_ENCHANTMENTS, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_ServerSide );
DEFINE_OPCODE_HANDLER(SMSG_UPDATE_LAST_INSTANCE, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide );
DEFINE_OPCODE_HANDLER(SMSG_UPDATE_OBJECT, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide );
DEFINE_OPCODE_HANDLER(SMSG_UPDATE_SERVER_PLAYER_POSITION, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_ServerSide );
@@ -1440,13 +1440,10 @@ void OpcodeTable::Initialize()
//DEFINE_OPCODE_HANDLER(CMSG_MOVE_CHARM_PORT_CHEAT, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL );
//DEFINE_OPCODE_HANDLER(CMSG_MOVE_CHARM_TELEPORT_CHEAT, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL );
//DEFINE_OPCODE_HANDLER(CMSG_MOVE_ENABLE_SWIM_TO_FLY_TRANS_ACK, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL );
- //DEFINE_OPCODE_HANDLER(CMSG_MOVE_SET_FLY, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleMovementOpcodes );
//DEFINE_OPCODE_HANDLER(CMSG_MOVE_SET_RELATIVE_POSITION, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL );
- //DEFINE_OPCODE_HANDLER(CMSG_MOVE_SET_RUN_SPEED, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL );
//DEFINE_OPCODE_HANDLER(CMSG_MOVE_SET_VEHICLE_REC_ID_ACK, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL );
//DEFINE_OPCODE_HANDLER(CMSG_MOVE_START_SWIM_CHEAT, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL );
//DEFINE_OPCODE_HANDLER(CMSG_MOVE_STOP_SWIM_CHEAT, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL );
- //DEFINE_OPCODE_HANDLER(CMSG_MOVE_TOGGLE_COLLISION_ACK, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL );
//DEFINE_OPCODE_HANDLER(CMSG_NEW_SPELL_SLOT, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL );
//DEFINE_OPCODE_HANDLER(CMSG_NO_SPELL_VARIANCE, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL );
//DEFINE_OPCODE_HANDLER(CMSG_PERFORM_ACTION_SET, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL );
@@ -1557,18 +1554,12 @@ void OpcodeTable::Initialize()
//DEFINE_OPCODE_HANDLER(MSG_GM_RESETINSTANCELIMIT, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL );
//DEFINE_OPCODE_HANDLER(MSG_GM_SHOWLABEL, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL );
//DEFINE_OPCODE_HANDLER(MSG_GM_SUMMON, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL );
- //DEFINE_OPCODE_HANDLER(MSG_MOVE_FEATHER_FALL, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL );
- //DEFINE_OPCODE_HANDLER(MSG_MOVE_GRAVITY_CHNG, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL );
- //DEFINE_OPCODE_HANDLER(MSG_MOVE_HOVER, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL );
- //DEFINE_OPCODE_HANDLER(MSG_MOVE_ROOT, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL );
//DEFINE_OPCODE_HANDLER(MSG_MOVE_SET_ALL_SPEED_CHEAT, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL );
- //DEFINE_OPCODE_HANDLER(MSG_MOVE_SET_COLLISION_HEIGHT, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL );
//DEFINE_OPCODE_HANDLER(MSG_MOVE_SET_FLIGHT_BACK_SPEED_CHEAT, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL );
//DEFINE_OPCODE_HANDLER(MSG_MOVE_SET_FLIGHT_SPEED_CHEAT, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL );
//DEFINE_OPCODE_HANDLER(MSG_MOVE_SET_PITCH_RATE_CHEAT, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL );
//DEFINE_OPCODE_HANDLER(MSG_MOVE_SET_RAW_POSITION_ACK, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL );
//DEFINE_OPCODE_HANDLER(MSG_MOVE_SET_RUN_BACK_SPEED_CHEAT, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL );
- //DEFINE_OPCODE_HANDLER(MSG_MOVE_SET_RUN_SPEED, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL );
//DEFINE_OPCODE_HANDLER(MSG_MOVE_SET_RUN_SPEED_CHEAT, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL );
//DEFINE_OPCODE_HANDLER(MSG_MOVE_SET_SWIM_BACK_SPEED_CHEAT, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL );
//DEFINE_OPCODE_HANDLER(MSG_MOVE_SET_SWIM_SPEED_CHEAT, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL );
@@ -1578,10 +1569,6 @@ void OpcodeTable::Initialize()
//DEFINE_OPCODE_HANDLER(MSG_MOVE_STOP_SWIM_CHEAT, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL );
//DEFINE_OPCODE_HANDLER(MSG_MOVE_TOGGLE_FALL_LOGGING, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL );
//DEFINE_OPCODE_HANDLER(MSG_MOVE_TOGGLE_LOGGING, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL );
- //DEFINE_OPCODE_HANDLER(MSG_MOVE_UPDATE_CAN_FLY, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL );
- //DEFINE_OPCODE_HANDLER(MSG_MOVE_UPDATE_CAN_TRANSITION_BETWEEN_SWIM_AND_FLY, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL );
- //DEFINE_OPCODE_HANDLER(MSG_MOVE_UPDATE_MOUSE, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL );
- //DEFINE_OPCODE_HANDLER(MSG_MOVE_WATER_WALK, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL );
//DEFINE_OPCODE_HANDLER(MSG_NULL_ACTION, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL );
//DEFINE_OPCODE_HANDLER(MSG_PVP_LOG_DATA, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandlePVPLogDataOpcode );
//DEFINE_OPCODE_HANDLER(MSG_VIEW_PHASE_SHIFT, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL );
@@ -1602,11 +1589,6 @@ void OpcodeTable::Initialize()
//DEFINE_OPCODE_HANDLER(SMSG_COMBAT_LOG_MULTIPLE, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide );
//DEFINE_OPCODE_HANDLER(SMSG_COMMENTATOR_GET_PLAYER_INFO, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide );
//DEFINE_OPCODE_HANDLER(SMSG_COMPLETION_NPC_RESPONCE, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide );
- //DEFINE_OPCODE_HANDLER(SMSG_COMPRESSED_ACHIEVEMENT_DATA, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide );
- //DEFINE_OPCODE_HANDLER(SMSG_COMPRESSED_CHAR_ENUM, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide );
- //DEFINE_OPCODE_HANDLER(SMSG_COMPRESSED_GUILD_ROSTER, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide );
- //DEFINE_OPCODE_HANDLER(SMSG_COMPRESSED_UNKNOWN_1310, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide );
- //DEFINE_OPCODE_HANDLER(SMSG_COMPRESSED_UPDATE_OBJECT, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide );
//DEFINE_OPCODE_HANDLER(SMSG_CORPSE_IS_NOT_IN_INSTANCE, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide );
//DEFINE_OPCODE_HANDLER(SMSG_DAMAGE_DONE_OBSOLETE, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide );
//DEFINE_OPCODE_HANDLER(SMSG_DBLOOKUP, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide );
@@ -1647,15 +1629,10 @@ void OpcodeTable::Initialize()
//DEFINE_OPCODE_HANDLER(SMSG_MEETINGSTONE_SETQUEUE, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide );
//DEFINE_OPCODE_HANDLER(SMSG_MINIGAME_MOVE_FAILED, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide );
//DEFINE_OPCODE_HANDLER(SMSG_MOVE_CHARACTER_CHEAT, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide );
- //DEFINE_OPCODE_HANDLER(SMSG_MOVE_DISABLE_COLLISION, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide );
- //DEFINE_OPCODE_HANDLER(SMSG_MOVE_DISABLE_GRAVITY, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide );
- //DEFINE_OPCODE_HANDLER(SMSG_MOVE_ENABLE_COLLISION, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide );
- //DEFINE_OPCODE_HANDLER(SMSG_MOVE_ENABLE_GRAVITY, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide );
//DEFINE_OPCODE_HANDLER(SMSG_MOVE_SET_VEHICLE_REC_ID, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide );
//DEFINE_OPCODE_HANDLER(SMSG_MOVE_SET_WALK_IN_AIR, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide );
//DEFINE_OPCODE_HANDLER(SMSG_MOVE_SKIP_TIME, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide );
//DEFINE_OPCODE_HANDLER(SMSG_MOVE_UNSET_WALK_IN_AIR, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide );
- //DEFINE_OPCODE_HANDLER(SMSG_MOVE_UPDATE_TELEPORT, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide );
//DEFINE_OPCODE_HANDLER(SMSG_NPC_WONT_TALK, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide );
//DEFINE_OPCODE_HANDLER(SMSG_PET_UNLEARN_CONFIRM, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide );
//DEFINE_OPCODE_HANDLER(SMSG_PLAYER_UNK_DEAD_ALIVE, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide );
@@ -1680,18 +1657,6 @@ void OpcodeTable::Initialize()
//DEFINE_OPCODE_HANDLER(SMSG_SHOW_MAILBOX, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide );
//DEFINE_OPCODE_HANDLER(SMSG_SPELL_CHANCE_PROC_LOG, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide );
//DEFINE_OPCODE_HANDLER(SMSG_SPELL_CHANCE_RESIST_PUSHBACK, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide );
- //DEFINE_OPCODE_HANDLER(SMSG_SPLINE_MOVE_LAND_WALK, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide );
- //DEFINE_OPCODE_HANDLER(SMSG_SPLINE_MOVE_NORMAL_FALL, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide );
- //DEFINE_OPCODE_HANDLER(SMSG_SPLINE_MOVE_SET_WATER_WALK, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide );
- //DEFINE_OPCODE_HANDLER(SMSG_SPLINE_SET_FLIGHT_BACK_SPEED, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide );
- //DEFINE_OPCODE_HANDLER(SMSG_SPLINE_SET_FLIGHT_SPEED, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide );
- //DEFINE_OPCODE_HANDLER(SMSG_SPLINE_SET_PITCH_RATE, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide );
- //DEFINE_OPCODE_HANDLER(SMSG_SPLINE_SET_RUN_BACK_SPEED, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide );
- //DEFINE_OPCODE_HANDLER(SMSG_SPLINE_SET_RUN_SPEED, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide );
- //DEFINE_OPCODE_HANDLER(SMSG_SPLINE_SET_SWIM_BACK_SPEED, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide );
- //DEFINE_OPCODE_HANDLER(SMSG_SPLINE_SET_SWIM_SPEED, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide );
- //DEFINE_OPCODE_HANDLER(SMSG_SPLINE_SET_TURN_RATE, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide );
- //DEFINE_OPCODE_HANDLER(SMSG_SPLINE_SET_WALK_SPEED, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide );
//DEFINE_OPCODE_HANDLER(SMSG_VOICE_SESSION_ADJUST_PRIORITY, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide );
//DEFINE_OPCODE_HANDLER(SMSG_VOICE_SESSION_ENABLE, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide );
//DEFINE_OPCODE_HANDLER(SMSG_ZONE_MAP, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide );
diff --git a/src/server/game/Server/Protocol/Opcodes.h b/src/server/game/Server/Protocol/Opcodes.h
index d7c1cfdd3e1..ad3ced93210 100644
--- a/src/server/game/Server/Protocol/Opcodes.h
+++ b/src/server/game/Server/Protocol/Opcodes.h
@@ -1250,6 +1250,7 @@ enum Opcodes
SMSG_SHOWTAXINODES = 0x2A36,
SMSG_SHOW_BANK = 0x2627,
SMSG_SHOW_RATINGS = 0x11B4,
+ SMSG_SOCKET_GEMS_RESULT = 0x6014,
SMSG_SOR_START_EXPERIENCE_INCOMPLETE = 0x7CA7,
SMSG_SPELLBREAKLOG = 0x6B17,
SMSG_SPELLDAMAGESHIELD = 0x2927,
@@ -1348,7 +1349,6 @@ enum Opcodes
SMSG_UPDATE_DUNGEON_ENCOUNTER_FOR_LOOT = 0x3CB5,
SMSG_UPDATE_INSTANCE_ENCOUNTER_UNIT = 0x4007,
SMSG_UPDATE_INSTANCE_OWNERSHIP = 0x4915,
- SMSG_UPDATE_ITEM_ENCHANTMENTS = 0x6014,
SMSG_UPDATE_LAST_INSTANCE = 0x0437,
SMSG_UPDATE_OBJECT = 0x4715,
SMSG_UPDATE_SERVER_PLAYER_POSITION = 0x74A3,
diff --git a/src/server/game/Server/WorldSession.h b/src/server/game/Server/WorldSession.h
index d4c4e5ef477..bc8718ef721 100644
--- a/src/server/game/Server/WorldSession.h
+++ b/src/server/game/Server/WorldSession.h
@@ -328,7 +328,7 @@ class WorldSession
void SendAuctionRemovedNotification(uint32 auctionId, uint32 itemEntry, int32 randomPropertyId);
//Item Enchantment
- void SendEnchantmentLog(uint64 Target, uint64 Caster, uint32 ItemID, uint32 SpellID);
+ void SendEnchantmentLog(uint64 target, uint64 caster, uint32 itemId, uint32 enchantId);
void SendItemEnchantTimeUpdate(uint64 Playerguid, uint64 Itemguid, uint32 slot, uint32 Duration);
//Taxi
diff --git a/src/server/game/Spells/SpellEffects.cpp b/src/server/game/Spells/SpellEffects.cpp
index 4be79d4b52b..80eadb9ac0e 100644
--- a/src/server/game/Spells/SpellEffects.cpp
+++ b/src/server/game/Spells/SpellEffects.cpp
@@ -2602,7 +2602,7 @@ void Spell::EffectEnchantItemPerm(SpellEffIndex effIndex)
// remove old enchanting before applying new if equipped
item_owner->ApplyEnchantment(itemTarget, PERM_ENCHANTMENT_SLOT, false);
- itemTarget->SetEnchantment(PERM_ENCHANTMENT_SLOT, enchant_id, 0, 0);
+ itemTarget->SetEnchantment(PERM_ENCHANTMENT_SLOT, enchant_id, 0, 0, m_caster->GetGUID());
// add new enchanting if equipped
item_owner->ApplyEnchantment(itemTarget, PERM_ENCHANTMENT_SLOT, true);
@@ -2667,7 +2667,7 @@ void Spell::EffectEnchantItemPrismatic(SpellEffIndex effIndex)
// remove old enchanting before applying new if equipped
item_owner->ApplyEnchantment(itemTarget, PRISMATIC_ENCHANTMENT_SLOT, false);
- itemTarget->SetEnchantment(PRISMATIC_ENCHANTMENT_SLOT, enchant_id, 0, 0);
+ itemTarget->SetEnchantment(PRISMATIC_ENCHANTMENT_SLOT, enchant_id, 0, 0, m_caster->GetGUID());
// add new enchanting if equipped
item_owner->ApplyEnchantment(itemTarget, PRISMATIC_ENCHANTMENT_SLOT, true);
@@ -2749,7 +2749,7 @@ void Spell::EffectEnchantItemTmp(SpellEffIndex effIndex)
// remove old enchanting before applying new if equipped
item_owner->ApplyEnchantment(itemTarget, TEMP_ENCHANTMENT_SLOT, false);
- itemTarget->SetEnchantment(TEMP_ENCHANTMENT_SLOT, enchant_id, duration * 1000, 0);
+ itemTarget->SetEnchantment(TEMP_ENCHANTMENT_SLOT, enchant_id, duration * 1000, 0, m_caster->GetGUID());
// add new enchanting if equipped
item_owner->ApplyEnchantment(itemTarget, TEMP_ENCHANTMENT_SLOT, true);
@@ -4243,7 +4243,7 @@ void Spell::EffectEnchantHeldItem(SpellEffIndex effIndex)
if (!unitTarget || unitTarget->GetTypeId() != TYPEID_PLAYER)
return;
- Player* item_owner = (Player*)unitTarget;
+ Player* item_owner = unitTarget->ToPlayer();
Item* item = item_owner->GetItemByPos(INVENTORY_SLOT_BAG_0, EQUIPMENT_SLOT_MAINHAND);
if (!item)
@@ -4274,7 +4274,7 @@ void Spell::EffectEnchantHeldItem(SpellEffIndex effIndex)
return;
// Apply the temporary enchantment
- item->SetEnchantment(slot, enchant_id, duration*IN_MILLISECONDS, 0);
+ item->SetEnchantment(slot, enchant_id, duration*IN_MILLISECONDS, 0, m_caster->GetGUID());
item_owner->ApplyEnchantment(item, slot, true);
}
}
diff --git a/src/server/game/Spells/SpellMgr.cpp b/src/server/game/Spells/SpellMgr.cpp
index a2a4a85808a..3ee6266b0d2 100644
--- a/src/server/game/Spells/SpellMgr.cpp
+++ b/src/server/game/Spells/SpellMgr.cpp
@@ -499,6 +499,9 @@ uint32 SpellMgr::GetSpellIdForDifficulty(uint32 spellId, Unit const* caster) con
SpellInfo const* SpellMgr::GetSpellForDifficultyFromSpell(SpellInfo const* spell, Unit const* caster) const
{
+ if (!spell)
+ return NULL;
+
uint32 newSpellId = GetSpellIdForDifficulty(spell->Id, caster);
SpellInfo const* newSpell = GetSpellInfo(newSpellId);
if (!newSpell)
diff --git a/src/server/scripts/Commands/CMakeLists.txt b/src/server/scripts/Commands/CMakeLists.txt
index 15e16c2caf1..ce31fa1f4d3 100644
--- a/src/server/scripts/Commands/CMakeLists.txt
+++ b/src/server/scripts/Commands/CMakeLists.txt
@@ -12,6 +12,7 @@ set(scripts_STAT_SRCS
${scripts_STAT_SRCS}
Commands/cs_account.cpp
Commands/cs_achievement.cpp
+ Commands/cs_arena.cpp
Commands/cs_ban.cpp
Commands/cs_bf.cpp
Commands/cs_cast.cpp
diff --git a/src/server/scripts/Commands/cs_arena.cpp b/src/server/scripts/Commands/cs_arena.cpp
new file mode 100644
index 00000000000..82a1109efd2
--- /dev/null
+++ b/src/server/scripts/Commands/cs_arena.cpp
@@ -0,0 +1,347 @@
+/*
+ * Copyright (C) 2008-2013 TrinityCore <http://www.trinitycore.org/>
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; either version 2 of the License, or (at your
+ * option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/* ScriptData
+Name: arena_commandscript
+%Complete: 100
+Comment: All arena team related commands
+Category: commandscripts
+EndScriptData */
+
+#include "ObjectMgr.h"
+#include "Chat.h"
+#include "Language.h"
+#include "ArenaTeamMgr.h"
+#include "Player.h"
+#include "ScriptMgr.h"
+
+class arena_commandscript : public CommandScript
+{
+public:
+ arena_commandscript() : CommandScript("arena_commandscript") { }
+
+ ChatCommand* GetCommands() const
+ {
+ static ChatCommand arenaCommandTable[] =
+ {
+ { "create", SEC_ADMINISTRATOR, true, &HandleArenaCreateCommand, "", NULL },
+ { "disband", SEC_ADMINISTRATOR, true, &HandleArenaDisbandCommand, "", NULL },
+ { "rename", SEC_ADMINISTRATOR, true, &HandleArenaRenameCommand, "", NULL },
+ { "captain", SEC_ADMINISTRATOR, false, &HandleArenaCaptainCommand, "", NULL },
+ { "info", SEC_GAMEMASTER, true, &HandleArenaInfoCommand, "", NULL },
+ { "lookup", SEC_GAMEMASTER, false, &HandleArenaLookupCommand, "", NULL },
+ { NULL, SEC_GAMEMASTER, false, NULL, "", NULL }
+ };
+ static ChatCommand commandTable[] =
+ {
+ { "arena", SEC_GAMEMASTER, false, NULL, "", arenaCommandTable },
+ { NULL, SEC_PLAYER, false, NULL, "", NULL }
+ };
+ return commandTable;
+ }
+
+ static bool HandleArenaCreateCommand(ChatHandler* handler, char const* args)
+ {
+ if (!*args)
+ return false;
+
+ Player* target;
+ if (!handler->extractPlayerTarget(*args != '"' ? (char*)args : NULL, &target))
+ return false;
+
+ char* tailStr = *args != '"' ? strtok(NULL, "") : (char*)args;
+ if (!tailStr)
+ return false;
+
+ char* name = handler->extractQuotedArg(tailStr);
+ if (!name)
+ return false;
+ char* typeStr = strtok(NULL, "");
+ if (!typeStr)
+ return false;
+ int8 type = atoi(typeStr);
+ if (sArenaTeamMgr->GetArenaTeamByName(name))
+ {
+ handler->PSendSysMessage(LANG_ARENA_ERROR_NAME_EXISTS, name);
+ handler->SetSentErrorMessage(true);
+ return false;
+ }
+
+ if (type == 2 || type == 3 || type == 5 )
+ {
+ if (Player::GetArenaTeamIdFromDB(target->GetGUID(), type) != 0)
+ {
+ handler->PSendSysMessage(LANG_ARENA_ERROR_SIZE, target->GetName().c_str());
+ handler->SetSentErrorMessage(true);
+ return false;
+ }
+
+ ArenaTeam* Arena = new ArenaTeam();
+
+ if (!Arena->Create(target->GetGUID(), type, name, 4293102085, 101, 4293253939, 4, 4284049911))
+ {
+ delete Arena;
+ handler->SendSysMessage(LANG_BAD_VALUE);
+ handler->SetSentErrorMessage(true);
+ return false;
+ }
+
+ sArenaTeamMgr->AddArenaTeam(Arena);
+ handler->PSendSysMessage(LANG_ARENA_CREATE, Arena->GetName().c_str(), Arena->GetId(), Arena->GetType(), Arena->GetCaptain());
+ }
+ else
+ {
+ handler->SendSysMessage(LANG_BAD_VALUE);
+ handler->SetSentErrorMessage(true);
+ return false;
+ }
+ return true;
+ }
+
+ static bool HandleArenaDisbandCommand(ChatHandler* handler, char const* args)
+ {
+ if (!*args)
+ return false;
+
+ uint32 teamId = atoi((char*)args);
+ if (!teamId)
+ return false;
+
+ ArenaTeam* Arena = sArenaTeamMgr->GetArenaTeamById(teamId);
+
+ if (!Arena)
+ {
+ handler->PSendSysMessage(LANG_ARENA_ERROR_NOT_FOUND, teamId);
+ handler->SetSentErrorMessage(true);
+ return false;
+ }
+
+ if (Arena->IsFighting())
+ {
+ handler->SendSysMessage(LANG_ARENA_ERROR_COMBAT);
+ handler->SetSentErrorMessage(true);
+ return false;
+ }
+ std::string name = Arena->GetName();
+ Arena->Disband();
+ if (handler->GetSession())
+ TC_LOG_DEBUG(LOG_FILTER_ARENAS, "GameMaster: %s [GUID: %u] disbanded arena team type: %u [Id: %u].",
+ handler->GetSession()->GetPlayer()->GetName().c_str(), handler->GetSession()->GetPlayer()->GetGUIDLow(), Arena->GetType(), teamId);
+ else
+ TC_LOG_DEBUG(LOG_FILTER_ARENAS, "Console: disbanded arena team type: %u [Id: %u].", Arena->GetType(), teamId);
+ delete(Arena);
+ handler->PSendSysMessage(LANG_ARENA_DISBAND, name.c_str(), teamId);
+ return true;
+ }
+
+ static bool HandleArenaRenameCommand(ChatHandler* handler, char const* _args)
+ {
+ if (!*_args)
+ return false;
+
+ char* args = (char *)_args;
+
+ char const* oldArenaStr = handler->extractQuotedArg(args);
+ if (!oldArenaStr)
+ {
+ handler->SendSysMessage(LANG_BAD_VALUE);
+ handler->SetSentErrorMessage(true);
+ return false;
+ }
+
+ char const* newArenaStr = handler->extractQuotedArg(strtok(NULL, ""));
+ if (!newArenaStr)
+ {
+ handler->SendSysMessage(LANG_BAD_VALUE);
+ handler->SetSentErrorMessage(true);
+ return false;
+ }
+
+ ArenaTeam* Arena = sArenaTeamMgr->GetArenaTeamByName(oldArenaStr);
+ if (!Arena)
+ {
+ handler->PSendSysMessage(LANG_AREAN_ERROR_NAME_NOT_FOUND, oldArenaStr);
+ handler->SetSentErrorMessage(true);
+ return false;
+ }
+
+ if (sArenaTeamMgr->GetArenaTeamByName(newArenaStr))
+ {
+ handler->PSendSysMessage(LANG_ARENA_ERROR_NAME_EXISTS, oldArenaStr);
+ handler->SetSentErrorMessage(true);
+ return false;
+ }
+
+ if (Arena->IsFighting())
+ {
+ handler->SendSysMessage(LANG_ARENA_ERROR_COMBAT);
+ handler->SetSentErrorMessage(true);
+ return false;
+ }
+
+ if (!Arena->SetName(newArenaStr))
+ {
+ handler->SendSysMessage(LANG_BAD_VALUE);
+ handler->SetSentErrorMessage(true);
+ return false;
+ }
+ handler->PSendSysMessage(LANG_ARENA_RENAME, Arena->GetId(), oldArenaStr, newArenaStr);
+ if (handler->GetSession())
+ TC_LOG_DEBUG(LOG_FILTER_ARENAS, "GameMaster: %s [GUID: %u] rename arena team \"%s\"[Id: %u] to \"%s\"",
+ handler->GetSession()->GetPlayer()->GetName().c_str(), handler->GetSession()->GetPlayer()->GetGUIDLow(), oldArenaStr, Arena->GetId(), newArenaStr);
+ else
+ TC_LOG_DEBUG(LOG_FILTER_ARENAS, "Console: rename arena team \"%s\"[Id: %u] to \"%s\"", oldArenaStr, Arena->GetId(), newArenaStr);
+ return true;
+ }
+
+ static bool HandleArenaCaptainCommand(ChatHandler* handler, char const* args)
+ {
+ if (!*args)
+ return false;
+
+ char* idStr;
+ char* nameStr;
+ handler->extractOptFirstArg((char*)args, &idStr, &nameStr);
+ if (!idStr)
+ return false;
+
+ uint32 teamId = atoi(idStr);
+ if (!teamId)
+ return false;
+
+ Player* target;
+ uint64 targetGuid;
+ if (!handler->extractPlayerTarget(nameStr, &target, &targetGuid))
+ return false;
+
+ ArenaTeam* Arena = sArenaTeamMgr->GetArenaTeamById(teamId);
+
+ if (!Arena)
+ {
+ handler->PSendSysMessage(LANG_ARENA_ERROR_NOT_FOUND, teamId);
+ handler->SetSentErrorMessage(true);
+ return false;
+ }
+
+ if (!target)
+ {
+ handler->PSendSysMessage(LANG_PLAYER_NOT_EXIST_OR_OFFLINE, nameStr);
+ handler->SetSentErrorMessage(true);
+ return false;
+ }
+
+ if (Arena->IsFighting())
+ {
+ handler->SendSysMessage(LANG_ARENA_ERROR_COMBAT);
+ handler->SetSentErrorMessage(true);
+ return false;
+ }
+
+ if (!Arena->IsMember(targetGuid))
+ {
+ handler->PSendSysMessage(LANG_ARENA_ERROR_NOT_MEMBER, nameStr, Arena->GetName().c_str());
+ handler->SetSentErrorMessage(true);
+ return false;
+ }
+
+ if (Arena->GetCaptain() == targetGuid)
+ {
+ handler->PSendSysMessage(LANG_ARENA_ERROR_CAPTAIN, nameStr, Arena->GetName().c_str());
+ handler->SetSentErrorMessage(true);
+ return false;
+ }
+
+ Player* oldCaptain = sObjectMgr->GetPlayerByLowGUID(Arena->GetCaptain());
+ Arena->SetCaptain(targetGuid);
+ handler->PSendSysMessage(LANG_ARENA_CAPTAIN, Arena->GetName().c_str(), Arena->GetId(), oldCaptain->GetName().c_str(), target->GetName().c_str());
+ if (handler->GetSession())
+ TC_LOG_DEBUG(LOG_FILTER_ARENAS, "GameMaster: %s [GUID: %u] promoted player: %s [GUID: %u] to leader of arena team \"%s\"[Id: %u]",
+ handler->GetSession()->GetPlayer()->GetName().c_str(), handler->GetSession()->GetPlayer()->GetGUIDLow(), target->GetName().c_str(), target->GetGUIDLow(), Arena->GetName().c_str(), Arena->GetId());
+ else
+ TC_LOG_DEBUG(LOG_FILTER_ARENAS, "Console: promoted player: %s [GUID: %u] to leader of arena team \"%s\"[Id: %u]",
+ target->GetName().c_str(), target->GetGUIDLow(), Arena->GetName().c_str(), Arena->GetId());
+ return true;
+ }
+
+ static bool HandleArenaInfoCommand(ChatHandler* handler, char const* args)
+ {
+ if (!*args)
+ return false;
+
+ uint32 teamId = atoi((char*)args);
+ if (!teamId)
+ return false;
+
+ ArenaTeam* Arena = sArenaTeamMgr->GetArenaTeamById(teamId);
+
+ if (!Arena)
+ {
+ handler->PSendSysMessage(LANG_ARENA_ERROR_NOT_FOUND, teamId);
+ handler->SetSentErrorMessage(true);
+ return false;
+ }
+
+ handler->PSendSysMessage(LANG_ARENA_INFO_HEADER, Arena->GetName().c_str(), Arena->GetId(), Arena->GetRating(), Arena->GetType(), Arena->GetType());
+ for (ArenaTeam::MemberList::iterator itr = Arena->m_membersBegin(); itr != Arena->m_membersEnd(); ++itr)
+ {
+ handler->PSendSysMessage(LANG_ARENA_INFO_MEMBERS, itr->Name.c_str(), GUID_LOPART(itr->Guid), itr->PersonalRating, (Arena->GetCaptain() == itr->Guid ? "- Captain" : ""));
+ }
+ return true;
+ }
+
+ static bool HandleArenaLookupCommand(ChatHandler* handler, char const* args)
+ {
+ if (!*args)
+ return false;
+
+ std::string namepart = args;
+ std::wstring wnamepart;
+
+ if (!Utf8toWStr(namepart, wnamepart))
+ return false;
+
+ wstrToLower(wnamepart);
+
+ bool found = false;
+ ArenaTeamMgr::ArenaTeamContainer::const_iterator i = sArenaTeamMgr->GetArenaTeamMapBegin();
+ for (; i != sArenaTeamMgr->GetArenaTeamMapEnd(); ++i)
+ {
+ ArenaTeam* Arena = i->second;
+
+ if (Utf8FitTo(Arena->GetName(), wnamepart))
+ {
+ if (handler->GetSession())
+ handler->PSendSysMessage(LANG_ARENA_LOOKUP, Arena->GetName().c_str(), Arena->GetId(), Arena->GetType(), Arena->GetType());
+
+ if (!found)
+ found = true;
+
+ continue;
+ }
+ }
+
+ if (!found)
+ handler->PSendSysMessage(LANG_AREAN_ERROR_NAME_NOT_FOUND, namepart.c_str());
+
+ return true;
+ }
+};
+
+void AddSC_arena_commandscript()
+{
+ new arena_commandscript();
+}
diff --git a/src/server/scripts/Commands/cs_misc.cpp b/src/server/scripts/Commands/cs_misc.cpp
index 489c11e0f94..46eda11bfed 100644
--- a/src/server/scripts/Commands/cs_misc.cpp
+++ b/src/server/scripts/Commands/cs_misc.cpp
@@ -1472,37 +1472,124 @@ public:
return true;
}
- // show info of player
+
+ /**
+ * @name Player command: .pinfo
+ * @date 05/19/2013
+ *
+ * @brief Prints information about a character and it's linked account to the commander
+ *
+ * Non-applying information, e.g. a character that is not in gm mode right now or
+ * that is not banned/muted, is not printed
+ *
+ * This can be done either by giving a name or by targeting someone, else, it'll use the commander
+ *
+ * @param args name Prints information according to the given name to the commander
+ * target Prints information on the target to the commander
+ * none No given args results in printing information on the commander
+ *
+ * @return Several pieces of information about the character and the account
+ **/
+
static bool HandlePInfoCommand(ChatHandler* handler, char const* args)
{
+ // Define ALL the player variables!
Player* target;
uint64 targetGuid;
std::string targetName;
+ // To make sure we get a target, we convert our guid to an omniversal...
uint32 parseGUID = MAKE_NEW_GUID(atol((char*)args), 0, HIGHGUID_PLAYER);
+ // ... and make sure we get a target, somehow.
if (sObjectMgr->GetPlayerNameByGUID(parseGUID, targetName))
{
target = sObjectMgr->GetPlayerByLowGUID(parseGUID);
targetGuid = parseGUID;
}
+ // if not, then return false. Which shouldn't happen, now should it ?
else if (!handler->extractPlayerTarget((char*)args, &target, &targetGuid, &targetName))
return false;
- uint32 accId = 0;
- uint32 money = 0;
- uint32 totalPlayerTime = 0;
- uint8 level = 0;
- uint32 latency = 0;
- uint8 race;
- uint8 Class;
- int64 muteTime = 0;
- int64 banTime = -1;
+ /* The variables we extract for the command. They are
+ * default as "does not exist" to prevent problems
+ * The output is printed in the follow manner:
+ *
+ * Player %s %s (guid: %u) - I. LANG_PINFO_PLAYER
+ * ** GM Mode active, Phase: -1 - II. LANG_PINFO_GM_ACTIVE (if GM)
+ * ** Banned: (Type, Reason, Time, By) - III. LANG_PINFO_BANNED (if banned)
+ * ** Muted: (Time, Reason, By) - IV. LANG_PINFO_MUTED (if muted)
+ * * Account: %s (id: %u), GM Level: %u - V. LANG_PINFO_ACC_ACCOUNT
+ * * Last Login: %u (Failed Logins: %u) - VI. LANG_PINFO_ACC_LASTLOGIN
+ * * Uses OS: %s - Latency: %u ms - Email %s - VII. LANG_PINFO_ACC_OS
+ * * Last IP: %u (Locked: %s) - VIII. LANG_PINFO_ACC_IP
+ * * Level: %u (%u/%u XP (%u XP left) - IX. LANG_PINFO_CHR_LEVEL
+ * * Race: %s %s, Class %s - X. LANG_PINFO_CHR_RACE
+ * * Alive ?: %s - XI. LANG_PINFO_CHR_ALIVE
+ * * Phase: %s - XII. LANG_PINFO_CHR_PHASE (if not GM)
+ * * Money: %ug%us%uc - XIII. LANG_PINFO_CHR_MONEY
+ * * Map: %s, Area: %s - XIV. LANG_PINFO_CHR_MAP
+ * * Guild: %s (Id: %u) - XV. LANG_PINFO_CHR_GUILD (if in guild)
+ * ** Rank: %s - XVI. LANG_PINFO_CHR_GUILD_RANK (if in guild)
+ * ** Note: %s - XVII. LANG_PINFO_CHR_GUILD_NOTE (if in guild and has note)
+ * ** O. Note: %s - XVIII.LANG_PINFO_CHR_GUILD_ONOTE (if in guild and has officer note)
+ * * Played time: %s - XIX. LANG_PINFO_CHR_PLAYEDTIME
+ * * Mails: %u Read/%u Total - XX. LANG_PINFO_CHR_MAILS (if has mails)
+ *
+ * Not all of them can be moved to the top. These should
+ * place the most important ones to the head, though.
+ *
+ * For a cleaner overview, I segment each output in Roman numerals
+ */
+
+ // Account data print variables
+ std::string userName = handler->GetTrinityString(LANG_ERROR);
+ uint32 accId = 0;
+ uint32 lowguid = GUID_LOPART(targetGuid);
+ std::string eMail = handler->GetTrinityString(LANG_ERROR);
+ uint32 security = 0;
+ std::string lastIp = handler->GetTrinityString(LANG_ERROR);
+ uint8 locked = 0;
+ std::string lastLogin = handler->GetTrinityString(LANG_ERROR);
+ uint32 failedLogins = 0;
+ uint32 latency = 0;
+ std::string OS = "None";
+
+ // Mute data print variables
+ int64 muteTime = -1;
+ std::string muteReason = "unknown";
+ std::string muteBy = "unknown";
+
+ // Ban data print variables
+ int64 banTime = -1;
+ std::string banType = "None";
+ std::string banReason = "Unknown";
+ std::string bannedBy = "Unknown";
+
+ // Character data print variables
+ uint8 raceid, classid = 0; //RACE_NONE, CLASS_NONE
+ std::string raceStr, classStr = "None";
+ uint8 gender = 0;
+ int8 locale = handler->GetSessionDbcLocale();
+ std::string genderStr = handler->GetTrinityString(LANG_ERROR);
+ uint32 totalPlayerTime = 0;
+ uint8 level = 0;
+ std::string alive = handler->GetTrinityString(LANG_ERROR);
+ uint32 money = 0;
+ uint32 xp = 0;
+ uint32 xptotal = 0;
+
+ // Position data print
uint32 mapId;
uint32 areaId;
uint32 phase = 0;
+ std::string areaName = "<unknown>";
+ std::string zoneName = "<unknown>";
+
+ // Guild data print is only defined if part of Guild
+
+ // Mail data print is only defined if you have a mail
- // get additional information from Player object
if (target)
{
// check online security
@@ -1514,11 +1601,13 @@ public:
totalPlayerTime = target->GetTotalPlayedTime();
level = target->getLevel();
latency = target->GetSession()->GetLatency();
- race = target->getRace();
- Class = target->getClass();
+ raceid = target->getRace();
+ classid = target->getClass();
muteTime = target->GetSession()->m_muteTime;
mapId = target->GetMapId();
areaId = target->GetAreaId();
+ alive = target->isAlive() ? "Yes" : "No";
+ gender = target->getGender();
phase = target->GetPhaseMask();
}
// get additional information from DB
@@ -1528,8 +1617,9 @@ public:
if (handler->HasLowerSecurity(NULL, targetGuid))
return false;
+ // Query informations from the DB
PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_CHAR_PINFO);
- stmt->setUInt32(0, GUID_LOPART(targetGuid));
+ stmt->setUInt32(0, lowguid);
PreparedQueryResult result = CharacterDatabase.Query(stmt);
if (!result)
@@ -1540,20 +1630,20 @@ public:
level = fields[1].GetUInt8();
money = fields[2].GetUInt32();
accId = fields[3].GetUInt32();
- race = fields[4].GetUInt8();
- Class = fields[5].GetUInt8();
+ raceid = fields[4].GetUInt8();
+ classid = fields[5].GetUInt8();
mapId = fields[6].GetUInt16();
areaId = fields[7].GetUInt16();
+ gender = fields[8].GetUInt8();
+ uint32 health = fields[9].GetUInt32();
+ uint32 playerFlags = fields[10].GetUInt32();
+ if (!health || playerFlags & PLAYER_FLAGS_GHOST)
+ alive = "No";
+ else
+ alive = "Yes";
}
- std::string userName = handler->GetTrinityString(LANG_ERROR);
- std::string eMail = handler->GetTrinityString(LANG_ERROR);
- std::string muteReason = "";
- std::string muteBy = "";
- std::string lastIp = handler->GetTrinityString(LANG_ERROR);
- uint32 security = 0;
- std::string lastLogin = handler->GetTrinityString(LANG_ERROR);
-
+ // Query the prepared statement for login data
PreparedStatement* stmt = LoginDatabase.GetPreparedStatement(LOGIN_SEL_PINFO);
stmt->setInt32(0, int32(realmID));
stmt->setUInt32(1, accId);
@@ -1565,23 +1655,18 @@ public:
userName = fields[0].GetString();
security = fields[1].GetUInt8();
eMail = fields[2].GetString();
- muteTime = fields[5].GetUInt64();
- muteReason = fields[6].GetString();
- muteBy = fields[7].GetString();
-
- if (eMail.empty())
- eMail = "-";
+ // Only fetch these fields if commander has sufficient rights AND is online (prevent cheating)
+ /// @TODO: Add RBAC for "Can query ip and login data"
if (!handler->GetSession() || handler->GetSession()->GetSecurity() >= AccountTypes(security))
{
lastIp = fields[3].GetString();
lastLogin = fields[4].GetString();
uint32 ip = inet_addr(lastIp.c_str());
-#if TRINITY_ENDIAN == BIGENDIAN
EndianConvertReverse(ip);
-#endif
+ // If ip2nation table is populated, it displays the country
PreparedStatement* stmt = LoginDatabase.GetPreparedStatement(LOGIN_SEL_IP2NATION_COUNTRY);
stmt->setUInt32(0, ip);
if (PreparedQueryResult result2 = LoginDatabase.Query(stmt))
@@ -1592,27 +1677,26 @@ public:
lastIp.append(")");
}
}
- else
- {
- lastIp = "-";
- lastLogin = "-";
- }
+ muteTime = fields[5].GetUInt64();
+ muteReason = fields[6].GetString();
+ muteBy = fields[7].GetString();
+ failedLogins = fields[8].GetUInt32();
+ locked = fields[9].GetUInt8();
+ OS = fields[10].GetString();
}
+ // Creates a chat link to the character. Returns nameLink
std::string nameLink = handler->playerLink(targetName);
- handler->PSendSysMessage(LANG_PINFO_ACCOUNT, (target ? "" : handler->GetTrinityString(LANG_OFFLINE)), nameLink.c_str(), GUID_LOPART(targetGuid), userName.c_str(), accId, eMail.c_str(), security, lastIp.c_str(), lastLogin.c_str(), latency);
-
- std::string bannedby = "unknown";
- std::string banreason = "";
-
- stmt = LoginDatabase.GetPreparedStatement(LOGIN_SEL_PINFO_BANS);
- stmt->setUInt32(0, accId);
- PreparedQueryResult result2 = LoginDatabase.Query(stmt);
+ // Returns banType, banTime, bannedBy, banreason
+ PreparedStatement* stmt2 = LoginDatabase.GetPreparedStatement(LOGIN_SEL_PINFO_BANS);
+ stmt2->setUInt32(0, accId);
+ PreparedQueryResult result2 = LoginDatabase.Query(stmt2);
if (!result2)
{
+ banType = "Character";
stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_PINFO_BANS);
- stmt->setUInt32(0, GUID_LOPART(targetGuid));
+ stmt->setUInt32(0, lowguid);
result2 = CharacterDatabase.Query(stmt);
}
@@ -1620,49 +1704,19 @@ public:
{
Field* fields = result2->Fetch();
banTime = int64(fields[1].GetUInt64() ? 0 : fields[0].GetUInt32());
- bannedby = fields[2].GetString();
- banreason = fields[3].GetString();
+ bannedBy = fields[2].GetString();
+ banReason = fields[3].GetString();
}
- if (muteTime > 0)
- handler->PSendSysMessage(LANG_PINFO_MUTE, secsToTimeString(muteTime - time(NULL), true).c_str(), muteBy.c_str(), muteReason.c_str());
-
- if (banTime >= 0)
- handler->PSendSysMessage(LANG_PINFO_BAN, banTime > 0 ? secsToTimeString(banTime - time(NULL), true).c_str() : "permanently", bannedby.c_str(), banreason.c_str());
+ // 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);
- std::string raceStr, ClassStr;
- switch (race)
+ if (result3)
{
- case RACE_HUMAN:
- raceStr = "Human";
- break;
- case RACE_ORC:
- raceStr = "Orc";
- break;
- case RACE_DWARF:
- raceStr = "Dwarf";
- break;
- case RACE_NIGHTELF:
- raceStr = "Night Elf";
- break;
- case RACE_UNDEAD_PLAYER:
- raceStr = "Undead";
- break;
- case RACE_TAUREN:
- raceStr = "Tauren";
- break;
- case RACE_GNOME:
- raceStr = "Gnome";
- break;
- case RACE_TROLL:
- raceStr = "Troll";
- break;
- case RACE_BLOODELF:
- raceStr = "Blood Elf";
- break;
- case RACE_DRAENEI:
- raceStr = "Draenei";
- break;
+ Field* fields = result3->Fetch();
+ xptotal = fields[0].GetUInt32();
case RACE_GOBLIN:
raceStr = "Goblin";
break;
@@ -1671,52 +1725,68 @@ public:
break;
}
- switch (Class)
+ // Can be used to query data from Characters database
+ stmt2 = CharacterDatabase.GetPreparedStatement(CHAR_SEL_PINFO_XP);
+ stmt2->setUInt32(0, lowguid);
+ PreparedQueryResult result4 = CharacterDatabase.Query(stmt2);
+
+ if (result4)
{
- case CLASS_WARRIOR:
- ClassStr = "Warrior";
- break;
- case CLASS_PALADIN:
- ClassStr = "Paladin";
- break;
- case CLASS_HUNTER:
- ClassStr = "Hunter";
- break;
- case CLASS_ROGUE:
- ClassStr = "Rogue";
- break;
- case CLASS_PRIEST:
- ClassStr = "Priest";
- break;
- case CLASS_DEATH_KNIGHT:
- ClassStr = "Death Knight";
- break;
- case CLASS_SHAMAN:
- ClassStr = "Shaman";
- break;
- case CLASS_MAGE:
- ClassStr = "Mage";
- break;
- case CLASS_WARLOCK:
- ClassStr = "Warlock";
- break;
- case CLASS_DRUID:
- ClassStr = "Druid";
- break;
+ Field* fields = result4->Fetch();
+ xp = fields[0].GetUInt32();
}
- std::string timeStr = secsToTimeString(totalPlayerTime, true, true);
- uint32 gold = money /GOLD;
- uint32 silv = (money % GOLD) / SILVER;
- uint32 copp = (money % GOLD) % SILVER;
- handler->PSendSysMessage(LANG_PINFO_LEVEL, raceStr.c_str(), ClassStr.c_str(), timeStr.c_str(), level, gold, silv, copp);
+ // Initiate output
+ // Output I. LANG_PINFO_PLAYER
+ handler->PSendSysMessage(LANG_PINFO_PLAYER, target ? "" : handler->GetTrinityString(LANG_OFFLINE), nameLink.c_str(), lowguid);
- // Add map, zone, subzone and phase to output
- std::string areaName = "<unknown>";
- std::string zoneName = "";
+ // Output II. LANG_PINFO_GM_ACTIVE
+ if (target && target->isGameMaster())
+ handler->PSendSysMessage(LANG_PINFO_GM_ACTIVE);
- MapEntry const* map = sMapStore.LookupEntry(mapId);
+ // Output III. LANG_PINFO_BANNED if ban exists and is applied
+ if (banTime >= 0)
+ handler->PSendSysMessage(LANG_PINFO_BANNED, banType.c_str(), banTime > 0 ? secsToTimeString(banTime - time(NULL), true).c_str() : "permanently", banReason.c_str(), bannedBy.c_str());
+
+ // Output IV. LANG_PINFO_MUTED if mute is applied
+ if (muteTime > 0)
+ handler->PSendSysMessage(LANG_PINFO_MUTED, secsToTimeString(muteTime - time(NULL), true).c_str(), muteReason.c_str(), muteBy.c_str());
+
+ // Output V. LANG_PINFO_ACC_ACCOUNT
+ handler->PSendSysMessage(LANG_PINFO_ACC_ACCOUNT, userName.c_str(), accId, security);
+
+ // Output VI. LANG_PINFO_ACC_LASTLOGIN
+ handler->PSendSysMessage(LANG_PINFO_ACC_LASTLOGIN, lastLogin.c_str(), failedLogins);
+
+ // Output VIII. LANG_PINFO_ACC_OS
+ handler->PSendSysMessage(LANG_PINFO_ACC_OS, OS.c_str(), latency, eMail.c_str());
+ // Output IX. LANG_PINFO_ACC_IP
+ handler->PSendSysMessage(LANG_PINFO_ACC_IP, lastIp.c_str(), locked ? "Yes" : "No");
+
+ // Output X. LANG_PINFO_CHR_LEVEL
+ handler->PSendSysMessage(LANG_PINFO_CHR_LEVEL, level, xp, xptotal, (xptotal - xp));
+
+ // Output XI. LANG_PINFO_CHR_RACE
+ raceStr = GetRaceName(raceid, locale);
+ classStr = GetClassName(classid, locale);
+ handler->PSendSysMessage(LANG_PINFO_CHR_RACE, (gender == 0 ? handler->GetTrinityString(LANG_CHARACTER_GENDER_MALE) : handler->GetTrinityString(LANG_CHARACTER_GENDER_FEMALE)), raceStr.c_str(), classStr.c_str());
+
+ // Output XII. LANG_PINFO_CHR_ALIVE
+ handler->PSendSysMessage(LANG_PINFO_CHR_ALIVE, alive.c_str());
+
+ // Output XIII. LANG_PINFO_CHR_PHASE if player is not in GM mode (GM is in every phase)
+ if (target && !target->isGameMaster()) // IsInWorld() returns false on loadingscreen, so it's more
+ handler->PSendSysMessage(LANG_PINFO_CHR_PHASE, phase); // precise than just target (safer ?).
+ // However, as we usually just require a target here, we use target instead.
+ // Output XIV. LANG_PINFO_CHR_MONEY
+ uint32 gold = money / GOLD;
+ uint32 silv = (money % GOLD) / SILVER;
+ uint32 copp = (money % GOLD) % SILVER;
+ handler->PSendSysMessage(LANG_PINFO_CHR_MONEY, gold, silv, copp);
+
+ // Position data
+ MapEntry const* map = sMapStore.LookupEntry(mapId);
AreaTableEntry const* area = GetAreaEntryByAreaID(areaId);
if (area)
{
@@ -1728,30 +1798,55 @@ public:
}
if (target)
- {
- if (!zoneName.empty())
- handler->PSendSysMessage(LANG_PINFO_MAP_ONLINE, map->name, zoneName.c_str(), areaName.c_str(), phase);
- else
- handler->PSendSysMessage(LANG_PINFO_MAP_ONLINE, map->name, areaName.c_str(), "<unknown>", phase);
+ handler->PSendSysMessage(LANG_PINFO_CHR_MAP, map->name[locale], (!zoneName.empty() ? zoneName.c_str() : "<Unknown>"), (!areaName.empty() ? areaName.c_str() : "<Unknown>"));
+
+ // Guild Data - an own query, because it may not happen.
+ PreparedStatement* stmt3 = CharacterDatabase.GetPreparedStatement(CHAR_SEL_GUILD_MEMBER_EXTENDED);
+ stmt3->setUInt32(0, lowguid);
+ PreparedQueryResult result5 = CharacterDatabase.Query(stmt3);
+ if (result5)
+ {
+ Field* fields = result5->Fetch();
+ uint32 guildId = fields[0].GetUInt32();
+ std::string guildName = fields[1].GetString();
+ std::string guildRank = fields[2].GetString();
+ std::string note = fields[3].GetString();
+ std::string officeNote = fields[4].GetString();
+
+ // Output XVII. - XX.
+ handler->PSendSysMessage(LANG_PINFO_CHR_GUILD, guildName.c_str(), guildId);
+ handler->PSendSysMessage(LANG_PINFO_CHR_GUILD_RANK, guildRank.c_str());
+ // Only output XIX and XX if they are not empty
+ if (!note.empty())
+ handler->PSendSysMessage(LANG_PINFO_CHR_GUILD_NOTE, note.c_str());
+ if (!officeNote.empty())
+ handler->PSendSysMessage(LANG_PINFO_CHR_GUILD_ONOTE, officeNote.c_str());
}
- else
- handler->PSendSysMessage(LANG_PINFO_MAP_OFFLINE, map->name, areaName.c_str());
- stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_GUILD_MEMBER_EXTENDED);
- stmt->setUInt32(0, GUID_LOPART(targetGuid));
+ // Output XXI. LANG_PINFO_CHR_PLAYEDTIME
+ handler->PSendSysMessage(LANG_PINFO_CHR_PLAYEDTIME, (secsToTimeString(totalPlayerTime, true, true)).c_str());
- result = CharacterDatabase.Query(stmt);
- if (result)
+ // Mail Data - an own query, because it may or may not be useful.
+ // SQL: "SELECT SUM(CASE WHEN (checked & 1) THEN 1 ELSE 0 END) AS 'readmail', COUNT(*) AS 'totalmail' FROM mail WHERE `receiver` = ?"
+ stmt3 = CharacterDatabase.GetPreparedStatement(CHAR_SEL_PINFO_MAILS);
+ stmt3->setUInt32(0, lowguid);
+ PreparedQueryResult result6 = CharacterDatabase.Query(stmt3);
+ if (result6)
{
- Field* fields = result->Fetch();
+ // Define the variables, so the compiler knows they exist
+ uint32 rmailint = 0;
- uint32 guildId = fields[0].GetUInt32();
- std::string guildName = fields[1].GetString();
- std::string guildRank = fields[2].GetString();
- std::string note = fields[3].GetString();
- std::string officeNote = fields[4].GetString();
+ // Fetch the fields - readmail is a SUM(x) and given out as char! Thus...
+ Field* fields = result6->Fetch();
+ std::string readmail = fields[0].GetString();
+ uint64 totalmail = fields[1].GetUInt64();
- handler->PSendSysMessage(LANG_PINFO_GUILD_INFO, guildName.c_str(), guildId, guildRank.c_str(), note.c_str(), officeNote.c_str());
+ // ... we have to convert it from Char to int. We can use totalmail as it is
+ rmailint = atol(readmail.c_str());
+
+ // Output XXII. LANG_INFO_CHR_MAILS if at least one mails is given
+ if (totalmail >= 1)
+ handler->PSendSysMessage(LANG_PINFO_CHR_MAILS, rmailint, totalmail);
}
return true;
@@ -1789,6 +1884,7 @@ public:
return true;
}
+
// mute player for some times
static bool HandleMuteCommand(ChatHandler* handler, char const* args)
{
diff --git a/src/server/scripts/Commands/cs_server.cpp b/src/server/scripts/Commands/cs_server.cpp
index 309380a9cbb..11b4ebf33ae 100644
--- a/src/server/scripts/Commands/cs_server.cpp
+++ b/src/server/scripts/Commands/cs_server.cpp
@@ -338,7 +338,8 @@ public:
}
else
sWorld->ShutdownServ(time, SHUTDOWN_MASK_IDLE, SHUTDOWN_EXIT_CODE);
- return true;
+
+ return true;
}
// Exit the realm
diff --git a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kalecgos.cpp b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kalecgos.cpp
index 9e312ef8f94..b6b701c513d 100644
--- a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kalecgos.cpp
+++ b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kalecgos.cpp
@@ -716,27 +716,27 @@ public:
if (CheckTimer <= diff)
{
Creature* Kalec = Unit::GetCreature(*me, KalecGUID);
- if (!Kalec || (Kalec && !Kalec->isAlive()))
+ if (!Kalec || !Kalec->isAlive())
{
if (Creature* Kalecgos = Unit::GetCreature(*me, KalecgosGUID))
Kalecgos->AI()->EnterEvadeMode();
- return;
+ return;
}
+
if (HealthBelowPct(10) && !isEnraged)
{
if (Creature* Kalecgos = Unit::GetCreature(*me, KalecgosGUID))
Kalecgos->AI()->DoAction(DO_ENRAGE);
DoAction(DO_ENRAGE);
}
+
Creature* Kalecgos = Unit::GetCreature(*me, KalecgosGUID);
- if (Kalecgos)
+ if (Kalecgos && !Kalecgos->isInCombat())
{
- if (!Kalecgos->isInCombat())
- {
- me->AI()->EnterEvadeMode();
- return;
- }
+ me->AI()->EnterEvadeMode();
+ return;
}
+
if (!isBanished && HealthBelowPct(1))
{
if (Kalecgos)
@@ -746,8 +746,7 @@ public:
me->DealDamage(me, me->GetHealth());
return;
}
- else
- DoAction(DO_BANISH);
+ DoAction(DO_BANISH);
}
else
{
diff --git a/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/boss_falric.cpp b/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/boss_falric.cpp
index 58dc74d0f0a..9d266c77b77 100644
--- a/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/boss_falric.cpp
+++ b/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/boss_falric.cpp
@@ -19,7 +19,7 @@
#include "ScriptedCreature.h"
#include "halls_of_reflection.h"
-enum Yells
+enum Texts
{
SAY_AGGRO = 0,
SAY_SLAY = 1,
@@ -68,14 +68,14 @@ public:
uiHopelessnessCount = 0;
if (instance)
- instance->SetData(DATA_FALRIC_EVENT, NOT_STARTED);
+ instance->SetBossState(DATA_FALRIC_EVENT, NOT_STARTED);
}
void EnterCombat(Unit* /*who*/)
{
Talk(SAY_AGGRO);
if (instance)
- instance->SetData(DATA_FALRIC_EVENT, IN_PROGRESS);
+ instance->SetBossState(DATA_FALRIC_EVENT, IN_PROGRESS);
events.ScheduleEvent(EVENT_QUIVERING_STRIKE, 23000);
events.ScheduleEvent(EVENT_IMPENDING_DESPAIR, 9000);
@@ -87,7 +87,7 @@ public:
Talk(SAY_DEATH);
if (instance)
- instance->SetData(DATA_FALRIC_EVENT, DONE);
+ instance->SetBossState(DATA_FALRIC_EVENT, DONE);
}
void KilledUnit(Unit* /*victim*/)
diff --git a/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/boss_marwyn.cpp b/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/boss_marwyn.cpp
index 08d5cf70ee1..e82f0d48ebd 100644
--- a/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/boss_marwyn.cpp
+++ b/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/boss_marwyn.cpp
@@ -19,7 +19,7 @@
#include "ScriptedCreature.h"
#include "halls_of_reflection.h"
-enum Yells
+enum Texts
{
SAY_AGGRO = 0,
SAY_SLAY = 1,
@@ -63,14 +63,14 @@ public:
boss_horAI::Reset();
if (instance)
- instance->SetData(DATA_MARWYN_EVENT, NOT_STARTED);
+ instance->SetBossState(DATA_MARWYN_EVENT, NOT_STARTED);
}
void EnterCombat(Unit* /*who*/)
{
Talk(SAY_AGGRO);
if (instance)
- instance->SetData(DATA_MARWYN_EVENT, IN_PROGRESS);
+ instance->SetBossState(DATA_MARWYN_EVENT, IN_PROGRESS);
events.ScheduleEvent(EVENT_OBLITERATE, 30000); /// @todo Check timer
events.ScheduleEvent(EVENT_WELL_OF_CORRUPTION, 13000);
@@ -83,7 +83,7 @@ public:
Talk(SAY_DEATH);
if (instance)
- instance->SetData(DATA_MARWYN_EVENT, DONE);
+ instance->SetBossState(DATA_MARWYN_EVENT, DONE);
}
void KilledUnit(Unit* /*victim*/)
diff --git a/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/halls_of_reflection.cpp b/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/halls_of_reflection.cpp
index b140801d8f1..a64f2cf5467 100644
--- a/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/halls_of_reflection.cpp
+++ b/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/halls_of_reflection.cpp
@@ -18,10 +18,10 @@
#include "ScriptMgr.h"
#include "ScriptedCreature.h"
#include "ScriptedGossip.h"
-#include "halls_of_reflection.h"
#include "Player.h"
+#include "halls_of_reflection.h"
-enum Yells
+enum Text
{
SAY_JAINA_INTRO_1 = 0,
SAY_JAINA_INTRO_2 = 1,
@@ -66,17 +66,19 @@ enum Yells
SAY_LK_INTRO_1 = 0,
SAY_LK_INTRO_2 = 1,
SAY_LK_INTRO_3 = 2,
+ SAY_LK_JAINA_INTRO_END = 3,
+ SAY_LK_SYLVANAS_INTRO_END = 4,
SAY_FALRIC_INTRO_1 = 5,
SAY_FALRIC_INTRO_2 = 6,
- SAY_MARWYN_INTRO_1 = 4
+ SAY_MARWYN_INTRO_1 = 4,
};
enum Events
{
- EVENT_NONE,
-
+ EVENT_WALK_INTRO1 = 1,
+ EVENT_WALK_INTRO2,
EVENT_START_INTRO,
EVENT_SKIP_INTRO,
@@ -125,8 +127,13 @@ enum Events
EVENT_INTRO_LK_7,
EVENT_INTRO_LK_8,
EVENT_INTRO_LK_9,
+ EVENT_INTRO_LK_10,
+ EVENT_INTRO_LK_11,
EVENT_INTRO_END,
+
+ EVENT_OPEN_FROSTWORN_DOOR,
+ EVENT_CLOSE_FROSTWORN_DOOR,
};
enum eEnum
@@ -140,6 +147,17 @@ enum eEnum
QUEST_WRATH_OF_THE_LICH_KING_H2 = 24802,
};
+enum Spells
+{
+ SPELL_CAST_VISUAL = 65633, // Jaina/Sylavana
+ SPELL_BOSS_SPAWN_AURA = 72712, // Falric and Marwyn
+ SPELL_UTHER_DESPAWN = 70693,
+ SPELL_TAKE_FROSTMOURNE = 72729,
+ SPELL_FROSTMOURNE_DESPAWN = 72726,
+ SPELL_FROSTMOURNE_VISUAL = 73220,
+ SPELL_FROSTMOURNE_SOUNDS = 70667,
+};
+
const Position HallsofReflectionLocs[]=
{
{5283.234863f, 1990.946777f, 707.695679f, 0.929097f}, // 2 Loralen Follows
@@ -147,7 +165,7 @@ const Position HallsofReflectionLocs[]=
{5401.866699f, 2110.837402f, 707.695251f, 0.800610f}, // 10 Loralen follows
};
-const Position SpawnPos = {5262.540527f, 1949.693726f, 707.695007f, 0.808736f}; // Jaina/Sylvanas Beginning Position
+const Position IntroPos = {5265.89f, 1952.98f, 707.6978f, 0.0f}; // Jaina/Sylvanas Intro Start Position
const Position MoveThronePos = {5306.952148f, 1998.499023f, 709.341431f, 1.277278f}; // Jaina/Sylvanas walks to throne
const Position UtherSpawnPos = {5308.310059f, 2003.857178f, 709.341431f, 4.650315f};
const Position LichKingSpawnPos = {5362.917480f, 2062.307129f, 707.695374f, 3.945812f};
@@ -156,58 +174,10 @@ const Position LichKingMoveAwayPos = {5400.069824f, 2102.7131689f, 707.69525f,
class npc_jaina_or_sylvanas_hor : public CreatureScript
{
-private:
- bool m_isSylvana;
-
-public:
- npc_jaina_or_sylvanas_hor(bool isSylvana, const char* name) : CreatureScript(name), m_isSylvana(isSylvana) { }
-
- bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action)
- {
- player->PlayerTalkClass->ClearMenus();
- switch (action)
- {
- case GOSSIP_ACTION_INFO_DEF+1:
- player->CLOSE_GOSSIP_MENU();
- if (creature->AI())
- creature->AI()->DoAction(ACTION_START_INTRO);
- creature->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP);
- break;
- case GOSSIP_ACTION_INFO_DEF+2:
- player->CLOSE_GOSSIP_MENU();
- if (creature->AI())
- creature->AI()->DoAction(ACTION_SKIP_INTRO);
- creature->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP);
- break;
- }
+ public:
+ npc_jaina_or_sylvanas_hor() : CreatureScript("npc_jaina_or_sylvanas_hor") { }
- return true;
- }
-
- bool OnGossipHello(Player* player, Creature* creature)
- {
- if (creature->isQuestGiver())
- player->PrepareQuestMenu(creature->GetGUID());
-
- QuestStatus status = player->GetQuestStatus(m_isSylvana ? QUEST_DELIVRANCE_FROM_THE_PIT_H2 : QUEST_DELIVRANCE_FROM_THE_PIT_A2);
- if (status == QUEST_STATUS_COMPLETE || status == QUEST_STATUS_REWARDED)
- player->ADD_GOSSIP_ITEM( 0, "Can you remove the sword?", GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1);
-
- // once last quest is completed, she offers this shortcut of the starting event
- status = player->GetQuestStatus(m_isSylvana ? QUEST_WRATH_OF_THE_LICH_KING_H2 : QUEST_WRATH_OF_THE_LICH_KING_A2);
- if (status == QUEST_STATUS_COMPLETE || status == QUEST_STATUS_REWARDED)
- player->ADD_GOSSIP_ITEM( 0, "Dark Lady, I think I hear Arthas coming. Whatever you're going to do, do it quickly.", GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+2);
-
- player->SEND_GOSSIP_MENU(DEFAULT_GOSSIP_MESSAGE, creature->GetGUID());
- return true;
- }
-
- CreatureAI* GetAI(Creature* creature) const
- {
- return new npc_jaina_or_sylvanas_horAI(creature);
- }
-
- // AI of Part1: handle the intro till start of gauntlet event.
+ // AI of Part1
struct npc_jaina_or_sylvanas_horAI : public ScriptedAI
{
npc_jaina_or_sylvanas_horAI(Creature* creature) : ScriptedAI(creature)
@@ -221,6 +191,24 @@ public:
EventMap events;
+ void sGossipSelect(Player* player, uint32 /*sender*/, uint32 action)
+ {
+ player->PlayerTalkClass->ClearMenus();
+ switch (action)
+ {
+ case 0:
+ player->CLOSE_GOSSIP_MENU();
+ events.ScheduleEvent(EVENT_START_INTRO, 1000);
+ me->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP|UNIT_NPC_FLAG_QUESTGIVER);
+ break;
+ case 1:
+ player->CLOSE_GOSSIP_MENU();
+ events.ScheduleEvent(EVENT_SKIP_INTRO, 1000);
+ me->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP|UNIT_NPC_FLAG_QUESTGIVER);
+ break;
+ }
+ }
+
void Reset()
{
events.Reset();
@@ -228,22 +216,9 @@ public:
utherGUID = 0;
lichkingGUID = 0;
- me->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP);
+ me->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP|UNIT_NPC_FLAG_QUESTGIVER);
me->SetStandState(UNIT_STAND_STATE_STAND);
- me->SetVisible(true);
- }
-
- void DoAction(int32 actionId)
- {
- switch (actionId)
- {
- case ACTION_START_INTRO:
- events.ScheduleEvent(EVENT_START_INTRO, 0);
- break;
- case ACTION_SKIP_INTRO:
- events.ScheduleEvent(EVENT_SKIP_INTRO, 0);
- break;
- }
+ events.ScheduleEvent(EVENT_WALK_INTRO1, 3000);
}
void UpdateAI(uint32 diff)
@@ -251,6 +226,26 @@ public:
events.Update(diff);
switch (events.ExecuteEvent())
{
+ case EVENT_WALK_INTRO1:
+ me->GetMotionMaster()->MovePoint(0, IntroPos);
+ if (instance->GetData(DATA_TEAM_IN_INSTANCE) == ALLIANCE)
+ {
+ Talk(SAY_JAINA_INTRO_1);
+ events.ScheduleEvent(EVENT_WALK_INTRO2, 7000);
+ }
+ else
+ {
+ Talk(SAY_SYLVANAS_INTRO_1);
+ events.ScheduleEvent(EVENT_WALK_INTRO2, 9000);
+ }
+ break;
+ case EVENT_WALK_INTRO2:
+ if (instance->GetData(DATA_TEAM_IN_INSTANCE) == ALLIANCE)
+ Talk(SAY_JAINA_INTRO_2);
+ else
+ Talk(SAY_SYLVANAS_INTRO_2);
+ me->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP|UNIT_NPC_FLAG_QUESTGIVER);
+ break;
case EVENT_START_INTRO:
me->GetMotionMaster()->MovePoint(0, MoveThronePos);
// Begining of intro is differents between fActions as the speech sequence and timers are differents.
@@ -259,27 +254,25 @@ public:
else
events.ScheduleEvent(EVENT_INTRO_H2_1, 0);
break;
-
- // A2 Intro Events
+ // A2 Intro Events
case EVENT_INTRO_A2_1:
Talk(SAY_JAINA_INTRO_3);
- events.ScheduleEvent(EVENT_INTRO_A2_2, 5000);
+ events.ScheduleEvent(EVENT_INTRO_A2_2, 7000);
break;
case EVENT_INTRO_A2_2:
Talk(SAY_JAINA_INTRO_4);
events.ScheduleEvent(EVENT_INTRO_A2_3, 10000);
break;
case EVENT_INTRO_A2_3:
- /// @todo she's doing some kind of spell casting emote
+ me->CastSpell(me, SPELL_CAST_VISUAL, false);
+ me->CastSpell(me, SPELL_FROSTMOURNE_SOUNDS, true);
instance->HandleGameObject(instance->GetData64(DATA_FROSTMOURNE), true);
events.ScheduleEvent(EVENT_INTRO_A2_4, 10000);
break;
case EVENT_INTRO_A2_4:
- // spawn UTHER during speach 2
if (Creature* uther = me->SummonCreature(NPC_UTHER, UtherSpawnPos, TEMPSUMMON_MANUAL_DESPAWN))
{
uther->GetMotionMaster()->MoveIdle();
- uther->SetReactState(REACT_PASSIVE); // be sure he will not aggro arthas
utherGUID = uther->GetGUID();
}
events.ScheduleEvent(EVENT_INTRO_A2_5, 2000);
@@ -291,57 +284,57 @@ public:
break;
case EVENT_INTRO_A2_6:
Talk(SAY_JAINA_INTRO_5);
- events.ScheduleEvent(EVENT_INTRO_A2_7, 6000);
+ events.ScheduleEvent(EVENT_INTRO_A2_7, 7000);
break;
case EVENT_INTRO_A2_7:
if (Creature* uther = me->GetCreature(*me, utherGUID))
uther->AI()->Talk(SAY_UTHER_INTRO_A2_2);
- events.ScheduleEvent(EVENT_INTRO_A2_8, 6500);
+ events.ScheduleEvent(EVENT_INTRO_A2_8, 7000);
break;
case EVENT_INTRO_A2_8:
Talk(SAY_JAINA_INTRO_6);
- events.ScheduleEvent(EVENT_INTRO_A2_9, 2000);
+ events.ScheduleEvent(EVENT_INTRO_A2_9, 1200);
break;
case EVENT_INTRO_A2_9:
if (Creature* uther = me->GetCreature(*me, utherGUID))
uther->AI()->Talk(SAY_UTHER_INTRO_A2_3);
- events.ScheduleEvent(EVENT_INTRO_A2_10, 9000);
+ events.ScheduleEvent(EVENT_INTRO_A2_10, 11000);
break;
case EVENT_INTRO_A2_10:
Talk(SAY_JAINA_INTRO_7);
- events.ScheduleEvent(EVENT_INTRO_A2_11, 5000);
+ events.ScheduleEvent(EVENT_INTRO_A2_11, 6000);
break;
case EVENT_INTRO_A2_11:
if (Creature* uther = me->GetCreature(*me, utherGUID))
uther->AI()->Talk(SAY_UTHER_INTRO_A2_4);
- events.ScheduleEvent(EVENT_INTRO_A2_12, 11000);
+ events.ScheduleEvent(EVENT_INTRO_A2_12, 12000);
break;
case EVENT_INTRO_A2_12:
Talk(SAY_JAINA_INTRO_8);
- events.ScheduleEvent(EVENT_INTRO_A2_13, 4000);
+ events.ScheduleEvent(EVENT_INTRO_A2_13, 6000);
break;
case EVENT_INTRO_A2_13:
if (Creature* uther = me->GetCreature(*me, utherGUID))
uther->AI()->Talk(SAY_UTHER_INTRO_A2_5);
- events.ScheduleEvent(EVENT_INTRO_A2_14, 12500);
+ events.ScheduleEvent(EVENT_INTRO_A2_14, 13000);
break;
case EVENT_INTRO_A2_14:
Talk(SAY_JAINA_INTRO_9);
- events.ScheduleEvent(EVENT_INTRO_A2_15, 10000);
+ events.ScheduleEvent(EVENT_INTRO_A2_15, 12000);
break;
case EVENT_INTRO_A2_15:
if (Creature* uther = me->GetCreature(*me, utherGUID))
uther->AI()->Talk(SAY_UTHER_INTRO_A2_6);
- events.ScheduleEvent(EVENT_INTRO_A2_16, 22000);
+ events.ScheduleEvent(EVENT_INTRO_A2_16, 25000);
break;
case EVENT_INTRO_A2_16:
if (Creature* uther = me->GetCreature(*me, utherGUID))
uther->AI()->Talk(SAY_UTHER_INTRO_A2_7);
- events.ScheduleEvent(EVENT_INTRO_A2_17, 4000);
+ events.ScheduleEvent(EVENT_INTRO_A2_17, 6000);
break;
case EVENT_INTRO_A2_17:
Talk(SAY_JAINA_INTRO_10);
- events.ScheduleEvent(EVENT_INTRO_A2_18, 2000);
+ events.ScheduleEvent(EVENT_INTRO_A2_18, 5000);
break;
case EVENT_INTRO_A2_18:
if (Creature* uther = me->GetCreature(*me, utherGUID))
@@ -349,14 +342,13 @@ public:
uther->HandleEmoteCommand(EMOTE_ONESHOT_NO);
uther->AI()->Talk(SAY_UTHER_INTRO_A2_8);
}
- events.ScheduleEvent(EVENT_INTRO_A2_19, 11000);
+ events.ScheduleEvent(EVENT_INTRO_A2_19, 12000);
break;
case EVENT_INTRO_A2_19:
Talk(SAY_JAINA_INTRO_11);
- events.ScheduleEvent(EVENT_INTRO_LK_1, 2000);
+ events.ScheduleEvent(EVENT_INTRO_LK_1, 3000);
break;
-
- // H2 Intro Events
+ // H2 Intro Events
case EVENT_INTRO_H2_1:
Talk(SAY_SYLVANAS_INTRO_1);
events.ScheduleEvent(EVENT_INTRO_H2_2, 8000);
@@ -367,7 +359,9 @@ public:
break;
case EVENT_INTRO_H2_3:
Talk(SAY_SYLVANAS_INTRO_3);
- /// @todo she's doing some kind of spell casting emote
+ me->CastSpell(me, SPELL_CAST_VISUAL, false);
+ me->CastSpell(me, SPELL_FROSTMOURNE_SOUNDS, true);
+ instance->HandleGameObject(instance->GetData64(DATA_FROSTMOURNE), true);
events.ScheduleEvent(EVENT_INTRO_H2_4, 6000);
break;
case EVENT_INTRO_H2_4:
@@ -375,7 +369,6 @@ public:
if (Creature* uther = me->SummonCreature(NPC_UTHER, UtherSpawnPos, TEMPSUMMON_MANUAL_DESPAWN))
{
uther->GetMotionMaster()->MoveIdle();
- uther->SetReactState(REACT_PASSIVE); // be sure he will not aggro arthas
utherGUID = uther->GetGUID();
}
events.ScheduleEvent(EVENT_INTRO_H2_5, 2000);
@@ -433,126 +426,159 @@ public:
Talk(SAY_SYLVANAS_INTRO_8);
events.ScheduleEvent(EVENT_INTRO_LK_1, 2000);
break;
-
- // Remaining Intro Events common for both faction
+ // Remaining Intro Events common for both faction
case EVENT_INTRO_LK_1:
// Spawn LK in front of door, and make him move to the sword.
- if (Creature* lichking = me->SummonCreature(NPC_LICH_KING_EVENT, LichKingSpawnPos, TEMPSUMMON_MANUAL_DESPAWN))
+ if (Creature* lichking = me->SummonCreature(NPC_LICH_KING_PART1, LichKingSpawnPos, TEMPSUMMON_MANUAL_DESPAWN))
{
+ lichking->SetUnitMovementFlags(MOVEMENTFLAG_WALKING);
lichking->GetMotionMaster()->MovePoint(0, LichKingMoveThronePos);
- lichking->SetReactState(REACT_PASSIVE);
+ //lichking->SetReactState(REACT_PASSIVE);
lichkingGUID = lichking->GetGUID();
+ events.ScheduleEvent(EVENT_OPEN_FROSTWORN_DOOR, 0);
+ events.ScheduleEvent(EVENT_CLOSE_FROSTWORN_DOOR, 4000);
}
-
if (Creature* uther = me->GetCreature(*me, utherGUID))
{
+ uther->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_STATE_COWER);
if (instance->GetData(DATA_TEAM_IN_INSTANCE) == ALLIANCE)
uther->AI()->Talk(SAY_UTHER_INTRO_A2_9);
else
uther->AI()->Talk(SAY_UTHER_INTRO_H2_7);
}
-
- events.ScheduleEvent(EVENT_INTRO_LK_2, 11000);
+ events.ScheduleEvent(EVENT_INTRO_LK_2, 10000);
break;
-
case EVENT_INTRO_LK_2:
- if (Creature* lichking = me->GetCreature(*me, lichkingGUID))
- lichking->AI()->Talk(SAY_LK_INTRO_1);
- events.ScheduleEvent(EVENT_INTRO_LK_3, 2000);
- break;
-
+ if (Creature* lichking = me->GetCreature(*me, lichkingGUID))
+ lichking->AI()->Talk(SAY_LK_INTRO_1);
+ events.ScheduleEvent(EVENT_INTRO_LK_3, 1000);
+ break;
case EVENT_INTRO_LK_3:
- // The Lich King banishes Uther to the abyss.
- if (Creature* uther = me->GetCreature(*me, utherGUID))
- {
- uther->DisappearAndDie();
- utherGUID = 0;
- }
-
- // He steps forward and removes the runeblade from the heap of skulls.
-
- events.ScheduleEvent(EVENT_INTRO_LK_4, 4000);
- break;
-
+ // The Lich King banishes Uther to the abyss.
+ if (Creature* uther = me->GetCreature(*me, utherGUID))
+ {
+ uther->CastSpell(uther, SPELL_UTHER_DESPAWN, true);
+ uther->DespawnOrUnsummon(5000);
+ utherGUID = 0;
+ }
+ events.ScheduleEvent(EVENT_INTRO_LK_4, 9000);
+ break;
case EVENT_INTRO_LK_4:
- if (Creature* lichking = me->GetCreature(*me, lichkingGUID))
- lichking->AI()->Talk(SAY_LK_INTRO_2);
- events.ScheduleEvent(EVENT_INTRO_LK_5, 10000);
+ // He steps forward and removes the runeblade from the heap of skulls.
+ if (Creature* lichking = me->GetCreature(*me, lichkingGUID))
+ {
+ if (GameObject* frostmourne = ObjectAccessor::GetGameObject(*me, instance->GetData64(DATA_FROSTMOURNE)))
+ frostmourne->SetPhaseMask(2, true);
+ lichking->CastSpell(lichking, SPELL_TAKE_FROSTMOURNE, true);
+ lichking->CastSpell(lichking, SPELL_FROSTMOURNE_VISUAL, true);
+ }
+ events.ScheduleEvent(EVENT_INTRO_LK_5, 8000);
break;
-
case EVENT_INTRO_LK_5:
+ if (Creature* lichking = me->GetCreature(*me, lichkingGUID))
+ lichking->AI()->Talk(SAY_LK_INTRO_2);
+ events.ScheduleEvent(EVENT_INTRO_LK_6, 8000);
+ break;
+ case EVENT_INTRO_LK_6:
// summon Falric and Marwyn. then go back to the door
- if (Creature* pFalric = me->GetCreature(*me, instance->GetData64(DATA_FALRIC)))
- pFalric->SetVisible(true);
- if (Creature* pMarwyn = me->GetCreature(*me, instance->GetData64(DATA_MARWYN)))
- pMarwyn->SetVisible(true);
-
+ if (Creature* falric = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_FALRIC_EVENT)))
+ {
+ falric->CastSpell(falric, SPELL_BOSS_SPAWN_AURA, true);
+ falric->SetVisible(true);
+ }
+ if (Creature* marwyn = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_MARWYN_EVENT)))
+ {
+ marwyn->CastSpell(marwyn, SPELL_BOSS_SPAWN_AURA, true);
+ marwyn->SetVisible(true);
+ }
if (Creature* lichking = me->GetCreature(*me, lichkingGUID))
{
- lichking->GetMotionMaster()->MovePoint(0, LichKingSpawnPos);
lichking->AI()->Talk(SAY_LK_INTRO_3);
+ lichking->SetUnitMovementFlags(MOVEMENTFLAG_WALKING);
+ lichking->GetMotionMaster()->MovePoint(0, LichKingMoveAwayPos);
}
-
- events.ScheduleEvent(EVENT_INTRO_LK_6, 8000);
- break;
-
- case EVENT_INTRO_LK_6:
- if (Creature* falric = me->GetCreature(*me, instance->GetData64(DATA_FALRIC)))
- falric->AI()->Talk(SAY_FALRIC_INTRO_1);
-
- events.ScheduleEvent(EVENT_INTRO_LK_7, 2000);
+ events.ScheduleEvent(EVENT_INTRO_LK_7, 10000);
+ events.ScheduleEvent(EVENT_OPEN_FROSTWORN_DOOR, 5000);
break;
-
case EVENT_INTRO_LK_7:
- if (Creature* marwyn = me->GetCreature(*me, instance->GetData64(DATA_MARWYN)))
+ if (Creature* marwyn = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_MARWYN_EVENT)))
marwyn->AI()->Talk(SAY_MARWYN_INTRO_1);
-
- events.ScheduleEvent(EVENT_INTRO_LK_8, 2000);
+ events.ScheduleEvent(EVENT_INTRO_LK_8, 1000);
break;
-
case EVENT_INTRO_LK_8:
- if (Creature* falric = me->GetCreature(*me, instance->GetData64(DATA_FALRIC)))
- falric->AI()->Talk(SAY_FALRIC_INTRO_2);
-
+ if (Creature* falric = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_FALRIC_EVENT)))
+ falric->AI()->Talk(SAY_FALRIC_INTRO_1);
events.ScheduleEvent(EVENT_INTRO_LK_9, 5000);
break;
-
case EVENT_INTRO_LK_9:
+ if (Creature* falric = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_FALRIC_EVENT)))
+ falric->AI()->Talk(SAY_FALRIC_INTRO_2);
+ events.ScheduleEvent(EVENT_INTRO_LK_10, 7000);
+ break;
+ case EVENT_INTRO_LK_10:
if (instance->GetData(DATA_TEAM_IN_INSTANCE) == ALLIANCE)
Talk(SAY_JAINA_INTRO_END);
else
Talk(SAY_SYLVANAS_INTRO_END);
-
- me->GetMotionMaster()->MovePoint(0, LichKingSpawnPos);
+ me->GetMotionMaster()->MovePoint(0, LichKingMoveAwayPos);
/// @todo Loralen/Koreln shall run also
- events.ScheduleEvent(EVENT_INTRO_END, 10000);
+ events.ScheduleEvent(EVENT_INTRO_LK_11, 5000);
+ break;
+ case EVENT_INTRO_LK_11:
+ if (Creature* lichking = me->GetCreature(*me, lichkingGUID))
+ {
+ if (instance->GetData(DATA_TEAM_IN_INSTANCE) == ALLIANCE)
+ lichking->AI()->Talk(SAY_LK_JAINA_INTRO_END);
+ else
+ lichking->AI()->Talk(SAY_LK_SYLVANAS_INTRO_END);
+ }
+ events.ScheduleEvent(EVENT_INTRO_END, 5000);
break;
-
case EVENT_INTRO_END:
if (instance)
- instance->SetData(DATA_WAVE_COUNT, SPECIAL); // start first wave
-
+ {
+ instance->SetData(DATA_INTRO_EVENT, DONE);
+ instance->ProcessEvent(0, EVENT_SPAWN_WAVES);
+ }
// Loralen or Koreln disappearAndDie()
- me->DisappearAndDie();
+ if (Creature* lichking = me->GetCreature(*me, lichkingGUID))
+ {
+ lichking->DespawnOrUnsummon(5000);
+ lichkingGUID = 0;
+ }
+ me->DespawnOrUnsummon(10000);
+ events.ScheduleEvent(EVENT_CLOSE_FROSTWORN_DOOR, 7000);
break;
-
case EVENT_SKIP_INTRO:
- /// @todo implement
-
- if (Creature* pFalric = me->GetCreature(*me, instance->GetData64(DATA_FALRIC)))
- pFalric->SetVisible(true);
- if (Creature* pMarwyn = me->GetCreature(*me, instance->GetData64(DATA_MARWYN)))
- pMarwyn->SetVisible(true);
-
- me->GetMotionMaster()->MovePoint(0, LichKingSpawnPos);
+ me->GetMotionMaster()->MovePoint(0, MoveThronePos);
/// @todo Loralen/Koreln shall run also
-
- events.ScheduleEvent(EVENT_INTRO_END, 15000);
+ if (Creature* lichking = me->SummonCreature(NPC_LICH_KING_PART1, LichKingSpawnPos, TEMPSUMMON_MANUAL_DESPAWN))
+ {
+ lichking->SetUnitMovementFlags(MOVEMENTFLAG_WALKING);
+ lichking->GetMotionMaster()->MovePoint(0, LichKingMoveThronePos);
+ lichking->SetReactState(REACT_PASSIVE);
+ lichkingGUID = lichking->GetGUID();
+ events.ScheduleEvent(EVENT_OPEN_FROSTWORN_DOOR, 0);
+ events.ScheduleEvent(EVENT_CLOSE_FROSTWORN_DOOR, 4000);
+ }
+ events.ScheduleEvent(EVENT_INTRO_LK_4, 15000);
+ break;
+ case EVENT_OPEN_FROSTWORN_DOOR:
+ if (GameObject* gate = ObjectAccessor::GetGameObject(*me, instance->GetData64(DATA_FROSTWORN_DOOR)))
+ instance->HandleGameObject(0 ,true, gate);
+ break;
+ case EVENT_CLOSE_FROSTWORN_DOOR:
+ if (GameObject* gate = ObjectAccessor::GetGameObject(*me, instance->GetData64(DATA_FROSTWORN_DOOR)))
+ instance->HandleGameObject(0 ,false, gate);
break;
}
}
};
+ CreatureAI* GetAI(Creature* creature) const
+ {
+ return new npc_jaina_or_sylvanas_horAI(creature);
+ }
};
enum TrashSpells
@@ -626,27 +652,56 @@ enum TrashEvents
EVENT_ICE_SHOT,
};
-class npc_ghostly_priest : public CreatureScript
+struct npc_gauntlet_trash : public ScriptedAI
{
-public:
- npc_ghostly_priest() : CreatureScript("npc_ghostly_priest") { }
+ npc_gauntlet_trash(Creature* creature) : ScriptedAI(creature),
+ instance(creature->GetInstanceScript())
+ {
+ }
- CreatureAI* GetAI(Creature* creature) const
+ void Reset()
{
- return new npc_ghostly_priestAI(creature);
+ me->CastSpell(me, SPELL_WELL_OF_SOULS, true);
+ events.Reset();
}
- struct npc_ghostly_priestAI: public ScriptedAI
+ void EnterEvadeMode()
{
- npc_ghostly_priestAI(Creature* creature) : ScriptedAI(creature)
- {
- }
+ if (instance->GetData(DATA_WAVE_COUNT) != NOT_STARTED)
+ instance->SetData(DATA_WAVE_COUNT, NOT_STARTED);
+ }
- EventMap events;
+ void SetData(uint32 type, uint32 value)
+ {
+ if (type)
+ return;
- void Reset()
+ InternalWaveId = value;
+ }
+
+ uint32 GetData(uint32 type) const
+ {
+ if (type)
+ return 0;
+
+ return InternalWaveId;
+ }
+
+protected:
+ EventMap events;
+ InstanceScript* instance;
+ uint32 InternalWaveId;
+};
+
+class npc_ghostly_priest : public CreatureScript
+{
+public:
+ npc_ghostly_priest() : CreatureScript("npc_ghostly_priest") { }
+
+ struct npc_ghostly_priestAI : public npc_gauntlet_trash
+ {
+ npc_ghostly_priestAI(Creature* creature) : npc_gauntlet_trash(creature)
{
- events.Reset();
}
void EnterCombat(Unit* /*who*/)
@@ -667,45 +722,46 @@ public:
if (me->HasUnitState(UNIT_STATE_CASTING))
return;
- while (uint32 eventId = events.ExecuteEvent())
+ switch (events.ExecuteEvent())
{
- switch (eventId)
- {
- case EVENT_SHADOW_WORD_PAIN:
- if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM))
- DoCast(target, SPELL_SHADOW_WORD_PAIN);
- events.ScheduleEvent(EVENT_SHADOW_WORD_PAIN, 8000);
- return;
- case EVENT_CIRCLE_OF_DESTRUCTION:
- if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM))
- DoCast(target, SPELL_CIRCLE_OF_DESTRUCTION);
- events.ScheduleEvent(EVENT_CIRCLE_OF_DESTRUCTION, 12000);
- return;
- case EVENT_COWER_IN_FEAR:
- if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM))
- DoCast(target, SPELL_COWER_IN_FEAR);
- events.ScheduleEvent(EVENT_COWER_IN_FEAR, 10000);
- return;
- case EVENT_DARK_MENDING:
- // find an ally with missing HP
- if (Unit* target = DoSelectLowestHpFriendly(40, DUNGEON_MODE(30000, 50000)))
- {
- DoCast(target, SPELL_DARK_MENDING);
- events.ScheduleEvent(EVENT_DARK_MENDING, 20000);
- }
- else
- {
- // no friendly unit with missing hp. re-check in just 5 sec.
- events.ScheduleEvent(EVENT_DARK_MENDING, 5000);
- }
- return;
- }
+ case EVENT_SHADOW_WORD_PAIN:
+ if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM))
+ DoCast(target, SPELL_SHADOW_WORD_PAIN);
+ events.ScheduleEvent(EVENT_SHADOW_WORD_PAIN, 8000);
+ break;
+ case EVENT_CIRCLE_OF_DESTRUCTION:
+ if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM))
+ DoCast(target, SPELL_CIRCLE_OF_DESTRUCTION);
+ events.ScheduleEvent(EVENT_CIRCLE_OF_DESTRUCTION, 12000);
+ break;
+ case EVENT_COWER_IN_FEAR:
+ if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM))
+ DoCast(target, SPELL_COWER_IN_FEAR);
+ events.ScheduleEvent(EVENT_COWER_IN_FEAR, 10000);
+ break;
+ case EVENT_DARK_MENDING:
+ // find an ally with missing HP
+ if (Unit* target = DoSelectLowestHpFriendly(40, DUNGEON_MODE(30000, 50000)))
+ {
+ DoCast(target, SPELL_DARK_MENDING);
+ events.ScheduleEvent(EVENT_DARK_MENDING, 20000);
+ }
+ else
+ {
+ // no friendly unit with missing hp. re-check in just 5 sec.
+ events.ScheduleEvent(EVENT_DARK_MENDING, 5000);
+ }
+ break;
}
DoMeleeAttackIfReady();
}
};
+ CreatureAI* GetAI(Creature* creature) const
+ {
+ return new npc_ghostly_priestAI(creature);
+ }
};
class npc_phantom_mage : public CreatureScript
@@ -713,22 +769,10 @@ class npc_phantom_mage : public CreatureScript
public:
npc_phantom_mage() : CreatureScript("npc_phantom_mage") { }
- CreatureAI* GetAI(Creature* creature) const
- {
- return new npc_phantom_mageAI(creature);
- }
-
- struct npc_phantom_mageAI: public ScriptedAI
+ struct npc_phantom_mageAI : public npc_gauntlet_trash
{
- npc_phantom_mageAI(Creature* creature) : ScriptedAI(creature)
- {
- }
-
- EventMap events;
-
- void Reset()
+ npc_phantom_mageAI(Creature* creature) : npc_gauntlet_trash(creature)
{
- events.Reset();
}
void EnterCombat(Unit* /*who*/)
@@ -750,39 +794,40 @@ public:
if (me->HasUnitState(UNIT_STATE_CASTING))
return;
- while (uint32 eventId = events.ExecuteEvent())
+ switch (events.ExecuteEvent())
{
- switch (eventId)
- {
- case EVENT_FIREBALL:
- if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM))
- DoCast(target, SPELL_FIREBALL);
- events.ScheduleEvent(EVENT_FIREBALL, 15000);
- return;
- case EVENT_FLAMESTRIKE:
- DoCast(SPELL_FLAMESTRIKE);
- events.ScheduleEvent(EVENT_FLAMESTRIKE, 15000);
- return;
- case EVENT_FROSTBOLT:
- if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM))
- DoCast(target, SPELL_FROSTBOLT);
- events.ScheduleEvent(EVENT_FROSTBOLT, 15000);
- return;
- case EVENT_CHAINS_OF_ICE:
- if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM))
- DoCast(target, SPELL_CHAINS_OF_ICE);
- events.ScheduleEvent(EVENT_CHAINS_OF_ICE, 15000);
- return;
- case EVENT_HALLUCINATION:
- DoCast(SPELL_HALLUCINATION);
- return;
- }
+ case EVENT_FIREBALL:
+ if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM))
+ DoCast(target, SPELL_FIREBALL);
+ events.ScheduleEvent(EVENT_FIREBALL, 15000);
+ break;
+ case EVENT_FLAMESTRIKE:
+ DoCast(SPELL_FLAMESTRIKE);
+ events.ScheduleEvent(EVENT_FLAMESTRIKE, 15000);
+ break;
+ case EVENT_FROSTBOLT:
+ if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM))
+ DoCast(target, SPELL_FROSTBOLT);
+ events.ScheduleEvent(EVENT_FROSTBOLT, 15000);
+ break;
+ case EVENT_CHAINS_OF_ICE:
+ if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM))
+ DoCast(target, SPELL_CHAINS_OF_ICE);
+ events.ScheduleEvent(EVENT_CHAINS_OF_ICE, 15000);
+ break;
+ case EVENT_HALLUCINATION:
+ DoCast(SPELL_HALLUCINATION);
+ break;
}
DoMeleeAttackIfReady();
}
};
+ CreatureAI* GetAI(Creature* creature) const
+ {
+ return new npc_phantom_mageAI(creature);
+ }
};
class npc_phantom_hallucination : public CreatureScript
@@ -790,16 +835,9 @@ class npc_phantom_hallucination : public CreatureScript
public:
npc_phantom_hallucination() : CreatureScript("npc_phantom_hallucination") { }
- CreatureAI* GetAI(Creature* creature) const
- {
- return new npc_phantom_hallucinationAI(creature);
- }
-
struct npc_phantom_hallucinationAI : public npc_phantom_mage::npc_phantom_mageAI
{
- npc_phantom_hallucinationAI(Creature* creature) : npc_phantom_mage::npc_phantom_mageAI(creature)
- {
- }
+ npc_phantom_hallucinationAI(Creature* creature) : npc_phantom_mage::npc_phantom_mageAI(creature) {}
void JustDied(Unit* /*killer*/)
{
@@ -807,6 +845,10 @@ public:
}
};
+ CreatureAI* GetAI(Creature* creature) const
+ {
+ return new npc_phantom_hallucinationAI(creature);
+ }
};
class npc_shadowy_mercenary : public CreatureScript
@@ -814,22 +856,10 @@ class npc_shadowy_mercenary : public CreatureScript
public:
npc_shadowy_mercenary() : CreatureScript("npc_shadowy_mercenary") { }
- CreatureAI* GetAI(Creature* creature) const
+ struct npc_shadowy_mercenaryAI : public npc_gauntlet_trash
{
- return new npc_shadowy_mercenaryAI(creature);
- }
-
- struct npc_shadowy_mercenaryAI: public ScriptedAI
- {
- npc_shadowy_mercenaryAI(Creature* creature) : ScriptedAI(creature)
- {
- }
-
- EventMap events;
-
- void Reset()
+ npc_shadowy_mercenaryAI(Creature* creature) : npc_gauntlet_trash(creature)
{
- events.Reset();
}
void EnterCombat(Unit* /*who*/)
@@ -850,34 +880,35 @@ public:
if (me->HasUnitState(UNIT_STATE_CASTING))
return;
- while (uint32 eventId = events.ExecuteEvent())
+ switch (events.ExecuteEvent())
{
- switch (eventId)
- {
- case EVENT_SHADOW_STEP:
- DoCast(SPELL_SHADOW_STEP);
- events.ScheduleEvent(EVENT_SHADOW_STEP, 8000);
- return;
- case EVENT_DEADLY_POISON:
- DoCast(me->getVictim(), SPELL_DEADLY_POISON);
- events.ScheduleEvent(EVENT_DEADLY_POISON, 10000);
- return;
- case EVENT_ENVENOMED_DAGGER_THROW:
- if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM))
- DoCast(target, SPELL_ENVENOMED_DAGGER_THROW);
- events.ScheduleEvent(EVENT_ENVENOMED_DAGGER_THROW, 10000);
- return;
- case EVENT_KIDNEY_SHOT:
- DoCast(me->getVictim(), SPELL_KIDNEY_SHOT);
- events.ScheduleEvent(EVENT_KIDNEY_SHOT, 10000);
- return;
- }
+ case EVENT_SHADOW_STEP:
+ DoCast(SPELL_SHADOW_STEP);
+ events.ScheduleEvent(EVENT_SHADOW_STEP, 8000);
+ break;
+ case EVENT_DEADLY_POISON:
+ DoCast(me->getVictim(), SPELL_DEADLY_POISON);
+ events.ScheduleEvent(EVENT_DEADLY_POISON, 10000);
+ break;
+ case EVENT_ENVENOMED_DAGGER_THROW:
+ if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM))
+ DoCast(target, SPELL_ENVENOMED_DAGGER_THROW);
+ events.ScheduleEvent(EVENT_ENVENOMED_DAGGER_THROW, 10000);
+ break;
+ case EVENT_KIDNEY_SHOT:
+ DoCast(me->getVictim(), SPELL_KIDNEY_SHOT);
+ events.ScheduleEvent(EVENT_KIDNEY_SHOT, 10000);
+ break;
}
DoMeleeAttackIfReady();
}
};
+ CreatureAI* GetAI(Creature* creature) const
+ {
+ return new npc_shadowy_mercenaryAI(creature);
+ }
};
class npc_spectral_footman : public CreatureScript
@@ -885,29 +916,176 @@ class npc_spectral_footman : public CreatureScript
public:
npc_spectral_footman() : CreatureScript("npc_spectral_footman") { }
+ struct npc_spectral_footmanAI : public npc_gauntlet_trash
+ {
+ npc_spectral_footmanAI(Creature* creature) : npc_gauntlet_trash(creature)
+ {
+ }
+
+ void EnterCombat(Unit* /*who*/)
+ {
+ events.ScheduleEvent(EVENT_SPECTRAL_STRIKE, 5000); /// @todo adjust timers
+ events.ScheduleEvent(EVENT_SHIELD_BASH, 10000);
+ events.ScheduleEvent(EVENT_TORTURED_ENRAGE, 15000);
+ }
+
+ void UpdateAI(uint32 diff)
+ {
+ if (!UpdateVictim())
+ return;
+
+ events.Update(diff);
+
+ if (me->HasUnitState(UNIT_STATE_CASTING))
+ return;
+
+ switch (events.ExecuteEvent())
+ {
+ case EVENT_SPECTRAL_STRIKE:
+ DoCast(me->getVictim(), SPELL_SPECTRAL_STRIKE);
+ events.ScheduleEvent(EVENT_SPECTRAL_STRIKE, 5000);
+ break;
+ case EVENT_SHIELD_BASH:
+ DoCast(me->getVictim(), SPELL_SHIELD_BASH);
+ events.ScheduleEvent(EVENT_SHIELD_BASH, 5000);
+ break;
+ case EVENT_TORTURED_ENRAGE:
+ DoCast(SPELL_TORTURED_ENRAGE);
+ events.ScheduleEvent(EVENT_TORTURED_ENRAGE, 15000);
+ break;
+ }
+
+ DoMeleeAttackIfReady();
+ }
+ };
+
CreatureAI* GetAI(Creature* creature) const
{
return new npc_spectral_footmanAI(creature);
}
+};
+
+class npc_tortured_rifleman : public CreatureScript
+{
+public:
+ npc_tortured_rifleman() : CreatureScript("npc_tortured_rifleman") { }
- struct npc_spectral_footmanAI: public ScriptedAI
+ struct npc_tortured_riflemanAI : public npc_gauntlet_trash
{
- npc_spectral_footmanAI(Creature* creature) : ScriptedAI(creature)
+ npc_tortured_riflemanAI(Creature* creature) : npc_gauntlet_trash(creature)
{
}
+ void EnterCombat(Unit* /*who*/)
+ {
+ events.ScheduleEvent(EVENT_SHOOT, 2000); /// @todo adjust timers
+ events.ScheduleEvent(EVENT_CURSED_ARROW, 10000);
+ events.ScheduleEvent(EVENT_FROST_TRAP, 1000);
+ events.ScheduleEvent(EVENT_ICE_SHOT, 15000);
+ }
+
+ void UpdateAI(uint32 diff)
+ {
+ if (!UpdateVictim())
+ return;
+
+ events.Update(diff);
+
+ if (me->HasUnitState(UNIT_STATE_CASTING))
+ return;
+
+ switch (events.ExecuteEvent())
+ {
+ case EVENT_SHOOT:
+ if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM))
+ DoCast(target, SPELL_SHOOT);
+ events.ScheduleEvent(EVENT_SHOOT, 2000);
+ break;
+ case EVENT_CURSED_ARROW:
+ if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM))
+ DoCast(target, SPELL_CURSED_ARROW);
+ events.ScheduleEvent(EVENT_CURSED_ARROW, 10000);
+ break;
+ case EVENT_FROST_TRAP:
+ DoCast(SPELL_FROST_TRAP);
+ events.ScheduleEvent(EVENT_FROST_TRAP, 30000);
+ break;
+ case EVENT_ICE_SHOT:
+ if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM))
+ DoCast(target, SPELL_ICE_SHOT);
+ events.ScheduleEvent(EVENT_ICE_SHOT, 15000);
+ break;
+ }
+
+ DoMeleeAttackIfReady();
+ }
+ };
+
+ CreatureAI* GetAI(Creature* creature) const
+ {
+ return new npc_tortured_riflemanAI(creature);
+ }
+};
+
+
+enum GeneralEvents
+{
+ //General
+ EVENT_SHIELD = 0,
+ EVENT_SPIKE = 1,
+ EVENT_CLONE = 2,
+
+ SAY_AGGRO = 0,
+ SAY_DEATH = 1,
+
+ SPELL_SHIELD_THROWN = 69222, // 73076 on hc
+ SPELL_SPIKE = 69184, // 70399 on hc
+ SPELL_CLONE_NAME = 57507,
+ SPELL_CLONE_MODEL = 45204,
+
+ // Reflection
+ EVENT_BALEFUL_STRIKE = 0,
+
+ SPELL_BALEFUL_STRIKE = 69933, // 70400 on hc
+ SPELL_SPIRIT_BURST = 69900, // 73046 on hc
+};
+
+class npc_frostworn_general : public CreatureScript
+{
+public:
+ npc_frostworn_general() : CreatureScript("npc_frostworn_general") { }
+
+ struct npc_frostworn_generalAI : public ScriptedAI
+ {
+ npc_frostworn_generalAI(Creature* creature) : ScriptedAI(creature)
+ {
+ instance = me->GetInstanceScript();
+ Reset();
+ }
+
+ InstanceScript* instance;
+
EventMap events;
void Reset()
{
events.Reset();
+ instance->SetData(DATA_FROSWORN_EVENT, NOT_STARTED);
}
- void EnterCombat(Unit* /*who*/)
+ void JustDied(Unit* /*killer*/)
{
- events.ScheduleEvent(EVENT_SPECTRAL_STRIKE, 5000); /// @todo adjust timers
- events.ScheduleEvent(EVENT_SHIELD_BASH, 10000);
- events.ScheduleEvent(EVENT_TORTURED_ENRAGE, 15000);
+ Talk(SAY_DEATH);
+ instance->SetData(DATA_FROSWORN_EVENT, DONE);
+ }
+
+ void EnterCombat(Unit* /*victim*/)
+ {
+ Talk(SAY_AGGRO);
+ events.ScheduleEvent(EVENT_SHIELD, 5000);
+ events.ScheduleEvent(EVENT_SPIKE, 14000);
+ events.ScheduleEvent(EVENT_CLONE, 22000);
+ instance->SetData(DATA_FROSWORN_EVENT, IN_PROGRESS);
}
void UpdateAI(uint32 diff)
@@ -920,45 +1098,61 @@ public:
if (me->HasUnitState(UNIT_STATE_CASTING))
return;
- while (uint32 eventId = events.ExecuteEvent())
+ switch (events.ExecuteEvent())
{
- switch (eventId)
- {
- case EVENT_SPECTRAL_STRIKE:
- DoCast(me->getVictim(), SPELL_SPECTRAL_STRIKE);
- events.ScheduleEvent(EVENT_SPECTRAL_STRIKE, 5000);
- return;
- case EVENT_SHIELD_BASH:
- DoCast(me->getVictim(), SPELL_SHIELD_BASH);
- events.ScheduleEvent(EVENT_SHIELD_BASH, 5000);
- return;
- case EVENT_TORTURED_ENRAGE:
- DoCast(SPELL_TORTURED_ENRAGE);
- events.ScheduleEvent(EVENT_TORTURED_ENRAGE, 15000);
- return;
- }
+ case EVENT_SHIELD:
+ if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
+ DoCast(target, SPELL_SHIELD_THROWN);
+ events.ScheduleEvent(EVENT_SHIELD, urand(8000, 12000));
+ break;
+ case EVENT_SPIKE:
+ if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
+ DoCast(target, SPELL_SPIKE);
+ events.ScheduleEvent(EVENT_SPIKE, urand(15000, 20000));
+ break;
+ case EVENT_CLONE:
+ SummonClones();
+ events.ScheduleEvent(EVENT_CLONE, 60000);
+ break;
}
DoMeleeAttackIfReady();
}
- };
-};
+ void SummonClones()
+ {
+ std::list<Unit *> playerList;
+ SelectTargetList(playerList, 5, SELECT_TARGET_TOPAGGRO, 0, true);
+ for (std::list<Unit*>::const_iterator itr = playerList.begin(); itr != playerList.end(); ++itr)
+ {
+ Unit* temp = (*itr);
+ Creature* reflection = me->SummonCreature(NPC_REFLECTION, temp->GetPositionX(), temp->GetPositionY(), temp->GetPositionZ(), temp->GetOrientation(), TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 3000);
+ reflection->SetName(temp->GetName());
+ temp->CastSpell(reflection, SPELL_CLONE_NAME, true);
+ temp->CastSpell(reflection, SPELL_CLONE_MODEL, true);
+ reflection->setFaction(me->getFaction());
+ reflection->AI()->AttackStart(temp);
+ }
-class npc_tortured_rifleman : public CreatureScript
-{
-public:
- npc_tortured_rifleman() : CreatureScript("npc_tortured_rifleman") { }
+ }
+ };
CreatureAI* GetAI(Creature* creature) const
{
- return new npc_tortured_riflemanAI(creature);
+ return new npc_frostworn_generalAI(creature);
}
+};
+
+class npc_spiritual_reflection : public CreatureScript
+{
+public:
+ npc_spiritual_reflection() : CreatureScript("npc_spiritual_reflection") { }
- struct npc_tortured_riflemanAI : public ScriptedAI
+ struct npc_spiritual_reflectionAI : public ScriptedAI
{
- npc_tortured_riflemanAI(Creature* creature) : ScriptedAI(creature)
+ npc_spiritual_reflectionAI(Creature *creature) : ScriptedAI(creature)
{
+ Reset();
}
EventMap events;
@@ -968,12 +1162,14 @@ public:
events.Reset();
}
- void EnterCombat(Unit* /*who*/)
+ void EnterCombat(Unit* /*victim*/)
{
- events.ScheduleEvent(EVENT_SHOOT, 2000); /// @todo adjust timers
- events.ScheduleEvent(EVENT_CURSED_ARROW, 10000);
- events.ScheduleEvent(EVENT_FROST_TRAP, 1000);
- events.ScheduleEvent(EVENT_ICE_SHOT, 15000);
+ events.ScheduleEvent(EVENT_BALEFUL_STRIKE, 3000);
+ }
+
+ void JustDied(Unit* killer)
+ {
+ DoCast(killer, SPELL_SPIRIT_BURST);
}
void UpdateAI(uint32 diff)
@@ -986,46 +1182,90 @@ public:
if (me->HasUnitState(UNIT_STATE_CASTING))
return;
- while (uint32 eventId = events.ExecuteEvent())
+ switch (events.ExecuteEvent())
{
- switch (eventId)
- {
- case EVENT_SHOOT:
- if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM))
- DoCast(target, SPELL_SHOOT);
- events.ScheduleEvent(EVENT_SHOOT, 2000);
- return;
- case EVENT_CURSED_ARROW:
- if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM))
- DoCast(target, SPELL_CURSED_ARROW);
- events.ScheduleEvent(EVENT_CURSED_ARROW, 10000);
- return;
- case EVENT_FROST_TRAP:
- DoCast(SPELL_FROST_TRAP);
- events.ScheduleEvent(EVENT_FROST_TRAP, 30000);
- return;
- case EVENT_ICE_SHOT:
- if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM))
- DoCast(target, SPELL_ICE_SHOT);
- events.ScheduleEvent(EVENT_ICE_SHOT, 15000);
- return;
- }
+ case EVENT_BALEFUL_STRIKE:
+ if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
+ DoCast(target, SPELL_BALEFUL_STRIKE);
+ events.ScheduleEvent(EVENT_BALEFUL_STRIKE, urand(3000, 8000));
}
DoMeleeAttackIfReady();
}
};
+ CreatureAI* GetAI(Creature* creature) const
+ {
+ return new npc_spiritual_reflectionAI(creature);
+ }
+};
+
+class at_hor_intro_start : public AreaTriggerScript
+{
+public:
+ at_hor_intro_start() : AreaTriggerScript("at_hor_intro_start") {}
+
+ bool OnTrigger(Player* player, AreaTriggerEntry const* /*trigger*/)
+ {
+ InstanceScript* instance = player->GetInstanceScript();
+
+ if (player->isGameMaster())
+ return true;
+
+ if (instance->GetData(DATA_INTRO_EVENT) == NOT_STARTED)
+ {
+ instance->SetData(DATA_INTRO_EVENT, IN_PROGRESS);
+ }
+
+ return true;
+ }
+};
+
+class at_hor_waves_restarter : public AreaTriggerScript
+{
+public:
+ at_hor_waves_restarter() : AreaTriggerScript("at_hor_waves_restarter") {}
+
+ bool OnTrigger(Player* player, AreaTriggerEntry const* /*trigger*/)
+ {
+ InstanceScript* instance = player->GetInstanceScript();
+
+ if (player->isGameMaster())
+ return true;
+
+ if (instance->GetData(DATA_WAVE_COUNT))
+ return true;
+
+ if (instance->GetData(DATA_INTRO_EVENT) == DONE && instance->GetBossState(DATA_MARWYN_EVENT) != DONE)
+ {
+ instance->ProcessEvent(0, EVENT_SPAWN_WAVES);
+
+ if (Creature* falric = player->GetCreature(*player, instance->GetData64(DATA_FALRIC_EVENT)))
+ {
+ falric->CastSpell(falric, SPELL_BOSS_SPAWN_AURA, true);
+ falric->SetVisible(true);
+ }
+ if (Creature* marwyn = player->GetCreature(*player, instance->GetData64(DATA_MARWYN_EVENT)))
+ {
+ marwyn->CastSpell(marwyn, SPELL_BOSS_SPAWN_AURA, true);
+ marwyn->SetVisible(true);
+ }
+ }
+ return true;
+ }
};
void AddSC_halls_of_reflection()
{
- new npc_jaina_or_sylvanas_hor(true, "npc_sylvanas_hor_part1");
- new npc_jaina_or_sylvanas_hor(false, "npc_jaina_hor_part1");
+ new npc_jaina_or_sylvanas_hor();
new npc_ghostly_priest();
new npc_phantom_mage();
new npc_phantom_hallucination();
new npc_shadowy_mercenary();
new npc_spectral_footman();
new npc_tortured_rifleman();
+ new at_hor_intro_start();
+ new at_hor_waves_restarter();
+ new npc_frostworn_general();
+ new npc_spiritual_reflection();
}
diff --git a/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/halls_of_reflection.h b/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/halls_of_reflection.h
index 2cab1cca214..4787a6b9fdc 100644
--- a/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/halls_of_reflection.h
+++ b/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/halls_of_reflection.h
@@ -18,54 +18,83 @@
#ifndef DEF_HALLS_OF_REFLECTION_H
#define DEF_HALLS_OF_REFLECTION_H
-enum Data
-{
- DATA_FALRIC_EVENT,
- DATA_MARWYN_EVENT,
- DATA_LICHKING_EVENT,
- DATA_WAVE_COUNT,
- DATA_TEAM_IN_INSTANCE,
-};
+#define HoRScriptName "instance_halls_of_reflection"
+#define MAX_ENCOUNTER 3
-enum Data64
+/* Halls of Reflection encounters:
+0- Falric
+1- Marwyn
+2- The Lich King
+*/
+
+enum Data
{
- DATA_FALRIC,
- DATA_MARWYN,
- DATA_LICHKING,
- DATA_FROSTMOURNE,
+ DATA_FALRIC_EVENT = 0,
+ DATA_MARWYN_EVENT = 1,
+ DATA_LICHKING_EVENT = 2,
+ DATA_INTRO_EVENT = 3,
+ DATA_FROSWORN_EVENT = 4,
+
+ DATA_WAVE_COUNT = 5,
+ DATA_TEAM_IN_INSTANCE = 6,
+ DATA_FROSTMOURNE = 7,
+ DATA_FROSTWORN_DOOR = 8,
};
enum Creatures
{
- NPC_FALRIC = 38112,
- NPC_MARWYN = 38113,
- NPC_LICH_KING_EVENT = 37226,
- NPC_LICH_KING_BOSS = 36954,
-
- NPC_UTHER = 37225,
NPC_JAINA_PART1 = 37221,
- NPC_JAINA_PART2 = 36955,
NPC_SYLVANAS_PART1 = 37223,
- NPC_SYLVANAS_PART2 = 37554,
+ NPC_UTHER = 37225,
+ NPC_LICH_KING_PART1 = 37226,
+ NPC_LORALEN = 37779,
+ NPC_KORELN = 37582,
+ NPC_FALRIC = 38112,
+ NPC_MARWYN = 38113,
NPC_WAVE_MERCENARY = 38177,
NPC_WAVE_FOOTMAN = 38173,
NPC_WAVE_RIFLEMAN = 38176,
NPC_WAVE_PRIEST = 38175,
NPC_WAVE_MAGE = 38172,
+
+ NPC_FROSTWORN_GENERAL = 36723,
+ NPC_REFLECTION = 37068, // 37107 for tank only?
+
+ NPC_JAINA_PART2 = 36955,
+ NPC_SYLVANAS_PART2 = 37554,
+ NPC_LICH_KING_PART2 = 36954,
+ NPC_BARTLETT = 37182, // High Captain Justin Bartlett
+ NPC_KORM = 37833, // Sky-Reaver Korm Blackscar
+ NPC_ICE_WALL = 37014, // Ice Wall Target
};
enum GameObjects
{
GO_FROSTMOURNE = 202302,
- GO_FROSTMOURNE_ALTAR = 202236,
- GO_FRONT_DOOR = 201976,
- GO_ARTHAS_DOOR = 197341,
+ GO_ENTRANCE_DOOR = 201976,
+ GO_FROSTWORN_DOOR = 197341,
+ GO_ARTHAS_DOOR = 197342,
+ //GO_ESCAPE_DOOR = 197343, // always open ?
+
+ GO_ICE_WALL = 201385,
+ GO_CAVE = 201596,
+
+ GO_STAIRS_SKYBREAKER = 201709,
+ GO_SKYBREAKER = 201598,
+ GO_STAIRS_ORGRIM_HAMMER = 202211,
+ GO_ORGRIM_HAMMER = 201599,
+ GO_PORTAL = 202079,
+
+ GO_CAPTAIN_CHEST_1 = 202212, //3145
+ GO_CAPTAIN_CHEST_2 = 201710, //30357
+ GO_CAPTAIN_CHEST_3 = 202337, //3246
+ GO_CAPTAIN_CHEST_4 = 202336, //3333
};
enum HorWorldStates
{
- WORLD_STATE_HOR = 4884,
+ WORLD_STATE_HOR_WAVES_ENABLED = 4884,
WORLD_STATE_HOR_WAVE_COUNT = 4882,
};
@@ -75,6 +104,21 @@ enum Actions
ACTION_ENTER_COMBAT,
};
+enum TrashGeneralSpells
+{
+ // General spells
+ SPELL_WELL_OF_SOULS = 72630, // cast when spawn(become visible)
+ SPELL_SPIRIT_ACTIVATE = 72130, // cast when unit activates
+};
+
+enum InstanceEvents
+{
+ EVENT_SPAWN_WAVES = 1,
+ EVENT_NEXT_WAVE = 2,
+ EVENT_DO_WIPE = 3,
+ EVENT_ADD_WAVE = 4,
+};
+
// Base class for FALRIC and MARWYN
// handled the summonList and the notification events to/from the InstanceScript
struct boss_horAI : ScriptedAI
@@ -92,14 +136,10 @@ struct boss_horAI : ScriptedAI
{
events.Reset();
me->SetVisible(false);
- me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE|UNIT_FLAG_NOT_SELECTABLE);
+ me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC|UNIT_FLAG_IMMUNE_TO_NPC);
me->SetReactState(REACT_PASSIVE);
- }
-
- void DamageTaken(Unit* /*who*/, uint32 &uiDamage)
- {
- if (me->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE))
- uiDamage = 0;
+ if (instance->GetData(DATA_WAVE_COUNT) != NOT_STARTED)
+ instance->ProcessEvent(0, EVENT_DO_WIPE);
}
void DoAction(int32 actionID)
@@ -107,11 +147,7 @@ struct boss_horAI : ScriptedAI
switch (actionID)
{
case ACTION_ENTER_COMBAT: // called by InstanceScript when boss shall enter in combat.
- // Just in case. Should have been done by InstanceScript
- me->SetVisible(true);
-
- // Reset flags
- me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE|UNIT_FLAG_NOT_SELECTABLE);
+ me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC|UNIT_FLAG_IMMUNE_TO_NPC);
me->SetReactState(REACT_AGGRESSIVE);
if (Unit* unit = me->SelectNearestTarget())
@@ -125,32 +161,6 @@ struct boss_horAI : ScriptedAI
void JustSummoned(Creature* summoned)
{
summons.Summon(summoned);
-
- if (Unit* target = summoned->SelectNearestTarget())
- {
- if (summoned->AI())
- summoned->AI()->AttackStart(target);
- else
- {
- summoned->GetMotionMaster()->MoveChase(target);
- summoned->Attack(target, true);
- }
- }
-
- if (summoned->AI())
- summoned->AI()->DoZoneInCombat();
- }
-
- void SummonedCreatureDespawn(Creature* summoned)
- {
- summons.Despawn(summoned);
- if (summons.empty())
- {
- if (summoned->isAlive())
- instance->SetData(DATA_WAVE_COUNT, NOT_STARTED);
- else
- instance->SetData(DATA_WAVE_COUNT, SPECIAL);
- }
}
};
diff --git a/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/instance_halls_of_reflection.cpp b/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/instance_halls_of_reflection.cpp
index dde3f7acc67..bff18b508d5 100644
--- a/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/instance_halls_of_reflection.cpp
+++ b/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/instance_halls_of_reflection.cpp
@@ -18,85 +18,50 @@
#include "ScriptMgr.h"
#include "ScriptedCreature.h"
#include "InstanceScript.h"
-#include "halls_of_reflection.h"
#include "Player.h"
+#include "WorldPacket.h"
+#include "halls_of_reflection.h"
-#define MAX_ENCOUNTER 3
-
-/* Halls of Reflection encounters:
-0- Falric
-1- Marwyn
-2- The Lich King
-*/
-
-enum eEnum
-{
- ENCOUNTER_WAVE_MERCENARY = 6,
- ENCOUNTER_WAVE_FOOTMAN = 10,
- ENCOUNTER_WAVE_RIFLEMAN = 6,
- ENCOUNTER_WAVE_PRIEST = 6,
- ENCOUNTER_WAVE_MAGE = 6,
-};
-
-enum Events
-{
- EVENT_NONE,
- EVENT_NEXT_WAVE,
- EVENT_START_LICH_KING,
-};
-
-static Position PriestSpawnPos[ENCOUNTER_WAVE_PRIEST] =
-{
- {5277.74f, 2016.88f, 707.778f, 5.96903f},
- {5295.88f, 2040.34f, 707.778f, 5.07891f},
- {5320.37f, 1980.13f, 707.778f, 2.00713f},
- {5280.51f, 1997.84f, 707.778f, 0.296706f},
- {5302.45f, 2042.22f, 707.778f, 4.90438f},
- {5306.57f, 1977.47f, 707.778f, 1.50098f},
-};
-
-static Position MageSpawnPos[ENCOUNTER_WAVE_MAGE] =
-{
- {5312.75f, 2037.12f, 707.778f, 4.59022f},
- {5309.58f, 2042.67f, 707.778f, 4.69494f},
- {5275.08f, 2008.72f, 707.778f, 6.21337f},
- {5279.65f, 2004.66f, 707.778f, 0.069813f},
- {5275.48f, 2001.14f, 707.778f, 0.174533f},
- {5316.7f, 2041.55f, 707.778f, 4.50295f},
-};
-
-static Position MercenarySpawnPos[ENCOUNTER_WAVE_MERCENARY] =
-{
- {5302.25f, 1972.41f, 707.778f, 1.37881f},
- {5311.03f, 1972.23f, 707.778f, 1.64061f},
- {5277.36f, 1993.23f, 707.778f, 0.401426f},
- {5318.7f, 2036.11f, 707.778f, 4.2237f},
- {5335.72f, 1996.86f, 707.778f, 2.74017f},
- {5299.43f, 1979.01f, 707.778f, 1.23918f},
-};
+Position const JainaSpawnPos = {5236.659f, 1929.894f, 707.7781f, 0.8726646f}; // Jaina Spawn Position
+Position const SylvanasSpawnPos = {5236.667f, 1929.906f, 707.7781f, 0.8377581f}; // Sylvanas Spawn Position
+Position const GeneralSpawnPos = {5415.538f, 2117.842f, 707.7781f, 3.944444f}; // Frostsworn General
-static Position FootmenSpawnPos[ENCOUNTER_WAVE_FOOTMAN] =
+Position const SpawnPos[] =
{
- {5306.06f, 2037, 707.778f, 4.81711f},
- {5344.15f, 2007.17f, 707.778f, 3.15905f},
- {5337.83f, 2010.06f, 707.778f, 3.22886f},
- {5343.29f, 1999.38f, 707.778f, 2.9147f},
- {5340.84f, 1992.46f, 707.778f, 2.75762f},
- {5325.07f, 1977.6f, 707.778f, 2.07694f},
- {5336.6f, 2017.28f, 707.778f, 3.47321f},
- {5313.82f, 1978.15f, 707.778f, 1.74533f},
- {5280.63f, 2012.16f, 707.778f, 6.05629f},
- {5322.96f, 2040.29f, 707.778f, 4.34587f},
-};
-
-static Position RiflemanSpawnPos[ENCOUNTER_WAVE_RIFLEMAN] =
-{
- {5343.47f, 2015.95f, 707.778f, 3.49066f},
- {5337.86f, 2003.4f, 707.778f, 2.98451f},
- {5319.16f, 1974, 707.778f, 1.91986f},
- {5299.25f, 2036, 707.778f, 5.02655f},
- {5295.64f, 1973.76f, 707.778f, 1.18682f},
- {5282.9f, 2019.6f, 707.778f, 5.88176f},
+ {5309.577f, 2042.668f, 707.7781f, 4.694936f},
+ {5295.885f, 2040.342f, 707.7781f, 5.078908f},
+ {5340.836f, 1992.458f, 707.7781f, 2.757620f},
+ {5325.072f, 1977.597f, 707.7781f, 2.076942f},
+ {5277.365f, 1993.229f, 707.7781f, 0.401426f},
+ {5275.479f, 2001.135f, 707.7781f, 0.174533f},
+ {5302.448f, 2042.222f, 707.7781f, 4.904375f},
+ {5343.293f, 1999.384f, 707.7781f, 2.914700f},
+ {5295.635f, 1973.757f, 707.7781f, 1.186824f},
+ {5311.031f, 1972.229f, 707.7781f, 1.640610f},
+ {5275.076f, 2008.724f, 707.7781f, 6.213372f},
+ {5316.701f, 2041.550f, 707.7781f, 4.502949f},
+ {5344.150f, 2007.168f, 707.7781f, 3.159046f},
+ {5319.158f, 1973.998f, 707.7781f, 1.919862f},
+ {5302.247f, 1972.415f, 707.7781f, 1.378810f},
+ {5277.739f, 2016.882f, 707.7781f, 5.969026f},
+ {5322.964f, 2040.288f, 707.7781f, 4.345870f},
+ {5343.467f, 2015.951f, 707.7781f, 3.490659f},
+ {5313.820f, 1978.146f, 707.7781f, 1.745329f},
+ {5279.649f, 2004.656f, 707.7781f, 0.069814f},
+ {5306.057f, 2037.002f, 707.7781f, 4.817109f},
+ {5337.865f, 2003.403f, 707.7781f, 2.984513f},
+ {5299.434f, 1979.009f, 707.7781f, 1.239184f},
+ {5312.752f, 2037.122f, 707.7781f, 4.590216f},
+ {5335.724f, 1996.859f, 707.7781f, 2.740167f},
+ {5280.632f, 2012.156f, 707.7781f, 6.056293f},
+ {5320.369f, 1980.125f, 707.7781f, 2.007129f},
+ {5306.572f, 1977.474f, 707.7781f, 1.500983f},
+ {5336.599f, 2017.278f, 707.7781f, 3.473205f},
+ {5282.897f, 2019.597f, 707.7781f, 5.881760f},
+ {5318.704f, 2036.108f, 707.7781f, 4.223697f},
+ {5280.513f, 1997.842f, 707.7781f, 0.296706f},
+ {5337.833f, 2010.057f, 707.7781f, 3.228859f},
+ {5299.250f, 2035.998f, 707.7781f, 5.026548f},
};
class instance_halls_of_reflection : public InstanceMapScript
@@ -104,107 +69,107 @@ class instance_halls_of_reflection : public InstanceMapScript
public:
instance_halls_of_reflection() : InstanceMapScript("instance_halls_of_reflection", 668) { }
- InstanceScript* GetInstanceScript(InstanceMap* map) const
- {
- return new instance_halls_of_reflection_InstanceMapScript(map);
- }
-
struct instance_halls_of_reflection_InstanceMapScript : public InstanceScript
{
- instance_halls_of_reflection_InstanceMapScript(Map* map) : InstanceScript(map) {};
-
- uint64 uiFalric;
- uint64 uiMarwyn;
- uint64 uiLichKingEvent;
- uint64 uiJainaPart1;
- uint64 uiSylvanasPart1;
-
- uint64 uiFrostmourne;
- uint64 uiFrostmourneAltar;
- uint64 uiArthasDoor;
- uint64 uiFrontDoor;
-
- uint32 uiEncounter[MAX_ENCOUNTER];
- uint32 uiTeamInInstance;
- uint32 uiWaveCount;
- bool bIntroDone;
-
- EventMap events;
+ instance_halls_of_reflection_InstanceMapScript(Map* map) : InstanceScript(map) {}
void Initialize()
{
+ SetBossNumber(MAX_ENCOUNTER);
events.Reset();
+ _falricGUID = 0;
+ _marwynGUID = 0;
+ _jainaOrSylvanasPart1GUID = 0;
+ _frostwornGeneralGUID = 0;
+ _frostmourneGUID = 0;
+ _entranceDoorGUID = 0;
+ _frostwornDoorGUID = 0;
+ _arthasDoorGUID = 0;
+ _teamInInstance = 0;
+ _waveCount = 0;
+ _introEvent = NOT_STARTED;
+ _frostwornGeneral = NOT_STARTED;
+ }
- uiFalric = 0;
- uiMarwyn = 0;
- uiLichKingEvent = 0;
- uiJainaPart1 = 0;
- uiSylvanasPart1 = 0;
-
- uiFrostmourne = 0;
- uiFrostmourneAltar = 0;
- uiArthasDoor = 0;
- uiFrontDoor = 0;
- uiTeamInInstance = 0;
- uiWaveCount = 0;
- bIntroDone = false;
-
- for (uint8 i = 0; i < MAX_ENCOUNTER; ++i)
- uiEncounter[i] = NOT_STARTED;
+ void OnPlayerEnter(Player* player)
+ {
+ if (!_teamInInstance)
+ _teamInInstance = player->GetTeam();
}
void OnCreatureCreate(Creature* creature)
{
- Map::PlayerList const &players = instance->GetPlayers();
+ Map::PlayerList const& players = instance->GetPlayers();
if (!players.isEmpty())
if (Player* player = players.begin()->getSource())
- uiTeamInInstance = player->GetTeam();
+ _teamInInstance = player->GetTeam();
switch (creature->GetEntry())
{
+ case NPC_JAINA_PART1:
+ case NPC_SYLVANAS_PART1:
+ _jainaOrSylvanasPart1GUID = creature->GetGUID();
+ break;
case NPC_FALRIC:
- uiFalric = creature->GetGUID();
+ _falricGUID = creature->GetGUID();
break;
case NPC_MARWYN:
- uiMarwyn = creature->GetGUID();
- break;
- case NPC_LICH_KING_EVENT:
- uiLichKingEvent = creature->GetGUID();
+ _marwynGUID = creature->GetGUID();
break;
- case NPC_JAINA_PART1:
- uiJainaPart1 = creature->GetGUID();
+ case NPC_FROSTWORN_GENERAL:
+ _frostwornGeneralGUID = creature->GetGUID();
+ if (GetBossState(DATA_MARWYN_EVENT) == DONE)
+ if (Creature* general = instance->GetCreature(_frostwornGeneralGUID))
+ general->SetPhaseMask(1, true);
break;
- case NPC_SYLVANAS_PART1:
- uiSylvanasPart1 = creature->GetGUID();
+ }
+ }
+
+ void OnCreatureRemove(Creature* creature)
+ {
+ switch (creature->GetEntry())
+ {
+ case NPC_WAVE_MERCENARY:
+ case NPC_WAVE_FOOTMAN:
+ case NPC_WAVE_RIFLEMAN:
+ case NPC_WAVE_PRIEST:
+ case NPC_WAVE_MAGE:
+ {
+ uint32 internalWaveId = creature->AI()->GetData(0);
+ waveGuidList[internalWaveId].erase(creature->GetGUID());
break;
+ }
}
}
void OnGameObjectCreate(GameObject* go)
{
- /// @todo init state depending on encounters
switch (go->GetEntry())
{
case GO_FROSTMOURNE:
- uiFrostmourne = go->GetGUID();
+ _frostmourneGUID = go->GetGUID();
go->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_INTERACT_COND);
HandleGameObject(0, false, go);
+ if (GetData(DATA_INTRO_EVENT) == DONE)
+ go->SetPhaseMask(2, true);
break;
- case GO_FROSTMOURNE_ALTAR:
- uiFrostmourneAltar = go->GetGUID();
+ case GO_ENTRANCE_DOOR:
+ _entranceDoorGUID = go->GetGUID();
go->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_INTERACT_COND);
HandleGameObject(0, true, go);
break;
- case GO_FRONT_DOOR:
- uiFrontDoor = go->GetGUID();
+ case GO_FROSTWORN_DOOR:
+ _frostwornDoorGUID = go->GetGUID();
go->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_INTERACT_COND);
- HandleGameObject(0, true, go);
+ if (GetBossState(DATA_MARWYN_EVENT) == DONE)
+ HandleGameObject(0, true, go);
+ else
+ HandleGameObject(0, false, go);
break;
case GO_ARTHAS_DOOR:
- uiArthasDoor = go->GetGUID();
+ _arthasDoorGUID = go->GetGUID();
go->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_INTERACT_COND);
-
- if (uiEncounter[1] == DONE)
+ if (GetBossState(DATA_FROSWORN_EVENT) == DONE)
HandleGameObject(0, true, go);
else
HandleGameObject(0, false, go);
@@ -212,61 +177,273 @@ public:
}
}
- void SetData(uint32 type, uint32 data)
+ void FillInitialWorldStates(WorldPacket& data)
{
- if (type == DATA_WAVE_COUNT && data == SPECIAL)
- {
- bIntroDone = true;
- events.ScheduleEvent(EVENT_NEXT_WAVE, 10000);
- return;
- }
+ data << uint32(WORLD_STATE_HOR_WAVES_ENABLED) << uint32(0);
+ data << uint32(WORLD_STATE_HOR_WAVE_COUNT) << uint32(0);
+ }
- if (uiWaveCount && data == NOT_STARTED)
- DoWipe();
+ bool SetBossState(uint32 type, EncounterState state)
+ {
+ if (!InstanceScript::SetBossState(type, state))
+ return false;
switch (type)
{
case DATA_FALRIC_EVENT:
- uiEncounter[0] = data;
- if (data == DONE)
+ if (state == DONE)
+ {
+ ++_waveCount;
events.ScheduleEvent(EVENT_NEXT_WAVE, 60000);
+ }
break;
case DATA_MARWYN_EVENT:
- uiEncounter[1] = data;
- if (data == DONE)
- HandleGameObject(uiArthasDoor, true);
+ if (state == DONE)
+ {
+ HandleGameObject(_entranceDoorGUID, true);
+ HandleGameObject(_frostwornDoorGUID, true);
+ if (Creature* general = instance->GetCreature(_frostwornGeneralGUID))
+ general->SetPhaseMask(1, true);
+ }
break;
case DATA_LICHKING_EVENT:
- uiEncounter[2] = data;
break;
+ default:
+ break;
+ }
+
+ return true;
+ }
+
+ void SetData(uint32 type, uint32 data)
+ {
+ switch (type)
+ {
+ case DATA_INTRO_EVENT:
+ if (data == IN_PROGRESS)
+ {
+ if (!_introEvent)
+ {
+ if (_teamInInstance == ALLIANCE)
+ instance->SummonCreature(NPC_JAINA_PART1, JainaSpawnPos);
+ else
+ instance->SummonCreature(NPC_SYLVANAS_PART1, SylvanasSpawnPos);
+ }
+ }
+ _introEvent = data;
+ break;
+ case DATA_WAVE_COUNT:
+ if (_waveCount && data == NOT_STARTED)
+ ProcessEvent(NULL, EVENT_DO_WIPE);
+ break;
+ case DATA_FROSWORN_EVENT:
+ if (data == DONE)
+ {
+ HandleGameObject(_arthasDoorGUID, true);
+ // spawn Jaina part 2
+ // spawn LK part 2
+ }
+ _frostwornGeneral = data;
+ break;
+ }
+
+ SaveToDB();
+ }
+
+
+ // wave scheduling,checked when wave npcs die
+ void OnUnitDeath(Unit* unit)
+ {
+ Creature* creature = unit->ToCreature();
+ if (!creature)
+ return;
+
+ switch (creature->GetEntry())
+ {
+ case NPC_WAVE_MERCENARY:
+ case NPC_WAVE_FOOTMAN:
+ case NPC_WAVE_RIFLEMAN:
+ case NPC_WAVE_PRIEST:
+ case NPC_WAVE_MAGE:
+ {
+ uint32 deadNpcs = 0;
+ uint32 waveId = creature->AI()->GetData(0);
+ for (std::set<uint64>::const_iterator itr = waveGuidList[waveId].begin(); itr != waveGuidList[waveId].end(); ++itr)
+ {
+ Creature* npc = instance->GetCreature(*itr);
+ if (!npc || !npc->isAlive())
+ ++deadNpcs;
+ }
+
+ // because the current npc returns isAlive when OnUnitDeath happens
+ // we check if the number of dead npcs is equal to the list-1
+ if (deadNpcs == waveGuidList[waveId].size() - 1)
+ {
+ ++_waveCount;
+ events.ScheduleEvent(EVENT_NEXT_WAVE, 10000);
+ }
+ break;
+ }
}
+ }
+
+ void Update(uint32 diff)
+ {
+ if (!instance->HavePlayers())
+ return;
- if (data == DONE)
- SaveToDB();
+ events.Update(diff);
+
+ switch (events.ExecuteEvent())
+ {
+ case EVENT_NEXT_WAVE:
+ ProcessEvent(NULL, EVENT_ADD_WAVE);
+ break;
+ }
+ }
+
+ void ProcessEvent(WorldObject* /*go*/, uint32 eventId)
+ {
+ switch (eventId)
+ {
+ // spawning all wave npcs at once
+ case EVENT_SPAWN_WAVES:
+ _waveCount = 1;
+ DoUpdateWorldState(WORLD_STATE_HOR_WAVES_ENABLED, 1);
+ DoUpdateWorldState(WORLD_STATE_HOR_WAVE_COUNT, _waveCount);
+ {
+ std::list<uint32> possibilityList, tempList;
+ uint32 posIndex = 0;
+
+ possibilityList.push_back(NPC_WAVE_MERCENARY);
+ possibilityList.push_back(NPC_WAVE_FOOTMAN);
+ possibilityList.push_back(NPC_WAVE_RIFLEMAN);
+ possibilityList.push_back(NPC_WAVE_PRIEST);
+ possibilityList.push_back(NPC_WAVE_MAGE);
+
+ // iterate each wave
+ for (uint8 i = 0; i < 8; ++i)
+ {
+ tempList = possibilityList;
+
+ uint64 bossGuid = i <= 3 ? _falricGUID : _marwynGUID;
+
+ if (!i)
+ Trinity::Containers::RandomResizeList(tempList, 3);
+ else if (i < 6 && i != 3)
+ Trinity::Containers::RandomResizeList(tempList, 4);
+
+ for (std::list<uint32>::const_iterator itr = tempList.begin(); itr != tempList.end(); ++itr)
+ {
+ if (Creature* boss = instance->GetCreature(bossGuid))
+ {
+ if (Creature* temp = boss->SummonCreature(*itr, SpawnPos[posIndex], TEMPSUMMON_DEAD_DESPAWN))
+ {
+ temp->AI()->SetData(0, i);
+ waveGuidList[i].insert(temp->GetGUID());
+ }
+ }
+
+ ++posIndex;
+ }
+ }
+ }
+ events.ScheduleEvent(EVENT_NEXT_WAVE, 10000);
+ break;
+ case EVENT_ADD_WAVE:
+ DoUpdateWorldState(WORLD_STATE_HOR_WAVES_ENABLED, 1);
+ DoUpdateWorldState(WORLD_STATE_HOR_WAVE_COUNT, _waveCount);
+ HandleGameObject(_entranceDoorGUID, false);
+
+ if (_waveCount % 5)
+ {
+ uint32 internalWaveId = _waveCount - ((_waveCount < 5) ? 1 : 2);
+ for (std::set<uint64>::const_iterator itr = waveGuidList[internalWaveId].begin(); itr != waveGuidList[internalWaveId].end(); ++itr)
+ {
+ if (Creature* temp = instance->GetCreature(*itr))
+ {
+ temp->CastSpell(temp, SPELL_SPIRIT_ACTIVATE, true);
+ temp->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC|UNIT_FLAG_IMMUNE_TO_NPC|UNIT_FLAG_NOT_SELECTABLE);
+ temp->AI()->DoZoneInCombat();
+ }
+ }
+ }
+ else
+ {
+ uint32 bossIndex = (_waveCount / 5) - 1;
+ if (GetBossState(DATA_FALRIC_EVENT + bossIndex) != DONE)
+ {
+ if (Creature* boss = instance->GetCreature(bossIndex ? _marwynGUID : _falricGUID))
+ if (boss->AI())
+ boss->AI()->DoAction(ACTION_ENTER_COMBAT);
+ }
+ else if (_waveCount != 10)
+ {
+ ++_waveCount;
+ events.ScheduleEvent(EVENT_NEXT_WAVE, 10000);
+ }
+ }
+ break;
+ case EVENT_DO_WIPE:
+ _waveCount = 0;
+ events.Reset();
+ DoUpdateWorldState(WORLD_STATE_HOR_WAVES_ENABLED, 1);
+ DoUpdateWorldState(WORLD_STATE_HOR_WAVE_COUNT, _waveCount);
+ HandleGameObject(_entranceDoorGUID, true);
+
+ if (Creature* falric = instance->GetCreature(_falricGUID))
+ falric->SetVisible(false);
+ if (Creature* marwyn = instance->GetCreature(_marwynGUID))
+ marwyn->SetVisible(false);
+
+ //despawn wave npcs
+ for (uint8 i = 0; i < 8; ++i)
+ {
+ for (std::set<uint64>::const_iterator itr = waveGuidList[i].begin(); itr != waveGuidList[i].end(); ++itr)
+ if (Creature* creature = instance->GetCreature(*itr))
+ creature->DespawnOrUnsummon(1);
+
+ waveGuidList[i].clear();
+ }
+ break;
+ }
}
uint32 GetData(uint32 type) const
{
switch (type)
{
- case DATA_FALRIC_EVENT: return uiEncounter[0];
- case DATA_MARWYN_EVENT: return uiEncounter[1];
- case DATA_LICHKING_EVENT: return uiEncounter[2];
- case DATA_WAVE_COUNT: return uiWaveCount;
- case DATA_TEAM_IN_INSTANCE: return uiTeamInInstance;
+ case DATA_WAVE_COUNT:
+ return _waveCount;
+ case DATA_TEAM_IN_INSTANCE:
+ return _teamInInstance;
+ case DATA_INTRO_EVENT:
+ return _introEvent;
+ case DATA_FROSWORN_EVENT:
+ return _frostwornGeneral;
+ default:
+ break;
}
return 0;
}
- uint64 GetData64(uint32 identifier) const
+ uint64 GetData64(uint32 type) const
{
- switch (identifier)
+ switch (type)
{
- case DATA_FALRIC: return uiFalric;
- case DATA_MARWYN: return uiMarwyn;
- case DATA_LICHKING: return uiLichKingEvent;
- case DATA_FROSTMOURNE: return uiFrostmourne;
+ case DATA_FALRIC_EVENT:
+ return _falricGUID;
+ case DATA_MARWYN_EVENT:
+ return _marwynGUID;
+ case DATA_FROSWORN_EVENT:
+ return _frostwornGeneralGUID;
+ case DATA_FROSTWORN_DOOR:
+ return _frostwornDoorGUID;
+ case DATA_FROSTMOURNE:
+ return _frostmourneGUID;
+ default:
+ break;
}
return 0;
@@ -277,13 +454,13 @@ public:
OUT_SAVE_INST_DATA;
std::ostringstream saveStream;
- saveStream << "H R 1 " << uiEncounter[0] << ' ' << uiEncounter[1] << ' ' << uiEncounter[2];
+ saveStream << "H R " << GetBossSaveData() << _introEvent << ' ' << _frostwornGeneral;
OUT_SAVE_INST_DATA_COMPLETE;
return saveStream.str();
}
- void Load(const char* in)
+ void Load(char const* in)
{
if (!in)
{
@@ -294,135 +471,67 @@ public:
OUT_LOAD_INST_DATA(in);
char dataHead1, dataHead2;
- uint16 version;
- uint16 data0, data1, data2;
std::istringstream loadStream(in);
- loadStream >> dataHead1 >> dataHead2 >> version >> data0 >> data1 >> data2;
+ loadStream >> dataHead1 >> dataHead2;
if (dataHead1 == 'H' && dataHead2 == 'R')
{
- uiEncounter[0] = data0;
- uiEncounter[1] = data1;
- uiEncounter[2] = data2;
-
for (uint8 i = 0; i < MAX_ENCOUNTER; ++i)
- if (uiEncounter[i] == IN_PROGRESS)
- uiEncounter[i] = NOT_STARTED;
-
- } else OUT_LOAD_INST_DATA_FAIL;
-
- if (uiEncounter[0] == DONE || uiEncounter[1] == DONE)
- bIntroDone = true;
-
- OUT_LOAD_INST_DATA_COMPLETE;
- }
-
- void AddWave()
- {
- DoUpdateWorldState(WORLD_STATE_HOR, 1);
- DoUpdateWorldState(WORLD_STATE_HOR_WAVE_COUNT, uiWaveCount);
-
- switch (uiWaveCount)
- {
- case 1:
- case 2:
- case 3:
- case 4:
- if (Creature* pFalric = instance->GetCreature(uiFalric))
- SpawnWave(pFalric);
- break;
- case 5:
- if (GetData(DATA_FALRIC_EVENT) == DONE)
- events.ScheduleEvent(EVENT_NEXT_WAVE, 10000);
- else if (Creature* pFalric = instance->GetCreature(uiFalric))
- if (pFalric->AI())
- pFalric->AI()->DoAction(ACTION_ENTER_COMBAT);
- break;
- case 6:
- case 7:
- case 8:
- case 9:
- if (Creature* pMarwyn = instance->GetCreature(uiMarwyn))
- SpawnWave(pMarwyn);
- break;
- case 10:
- if (GetData(DATA_MARWYN_EVENT) != DONE) // wave should not have been started if DONE. Check anyway to avoid bug exploit!
- if (Creature* pMarwyn = instance->GetCreature(uiMarwyn))
- if (pMarwyn->AI())
- pMarwyn->AI()->DoAction(ACTION_ENTER_COMBAT);
- break;
+ {
+ uint32 tmpState;
+ loadStream >> tmpState;
+ if (tmpState == IN_PROGRESS || tmpState > SPECIAL)
+ tmpState = NOT_STARTED;
+
+ SetBossState(i, EncounterState(tmpState));
+ }
+
+ uint32 temp = 0;
+ loadStream >> temp;
+ if (temp == DONE)
+ SetData(DATA_INTRO_EVENT, DONE);
+ else
+ SetData(DATA_INTRO_EVENT, NOT_STARTED);
+
+ loadStream >> temp;
+ if (temp == DONE)
+ SetData(DATA_FROSWORN_EVENT, DONE);
+ else
+ SetData(DATA_FROSWORN_EVENT, NOT_STARTED);
}
- }
+ else
+ OUT_LOAD_INST_DATA_FAIL;
- // Wipe has been detected. Perform cleanup and reset.
- void DoWipe()
- {
- uiWaveCount = 0;
- events.Reset();
- DoUpdateWorldState(WORLD_STATE_HOR, 1);
- DoUpdateWorldState(WORLD_STATE_HOR_WAVE_COUNT, uiWaveCount);
- HandleGameObject(uiFrontDoor, true);
-
- /// @todo
- // in case of wipe, the event is normally restarted by jumping into the center of the room.
- // As I can't find a trigger area there, just respawn Jaina/Sylvanas so the event may be restarted.
- if (Creature* pJaina = instance->GetCreature(uiJainaPart1))
- pJaina->Respawn();
- if (Creature* pSylvanas = instance->GetCreature(uiSylvanasPart1))
- pSylvanas->Respawn();
-
- if (Creature* pFalric = instance->GetCreature(uiFalric))
- pFalric->SetVisible(false);
- if (Creature* pMarwyn = instance->GetCreature(uiMarwyn))
- pMarwyn->SetVisible(false);
+ OUT_LOAD_INST_DATA_COMPLETE;
}
- // spawn a wave on behalf of the summoner.
- void SpawnWave(Creature* summoner)
- {
- uint32 index;
-
- summoner->SetVisible(true);
-
- /// @todo do composition at random. # of spawn also depends on uiWaveCount
- // As of now, it is just one of each.
- index = urand(0, ENCOUNTER_WAVE_MERCENARY-1);
- summoner->SummonCreature(NPC_WAVE_MERCENARY, MercenarySpawnPos[index], TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 0);
-
- index = urand(0, ENCOUNTER_WAVE_FOOTMAN-1);
- summoner->SummonCreature(NPC_WAVE_FOOTMAN, FootmenSpawnPos[index], TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 0);
-
- index = urand(0, ENCOUNTER_WAVE_RIFLEMAN-1);
- summoner->SummonCreature(NPC_WAVE_RIFLEMAN, RiflemanSpawnPos[index], TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 0);
+ private:
+ uint64 _falricGUID;
+ uint64 _marwynGUID;
+ uint64 _jainaOrSylvanasPart1GUID;
+ uint64 _frostwornGeneralGUID;
- index = urand(0, ENCOUNTER_WAVE_PRIEST-1);
- summoner->SummonCreature(NPC_WAVE_PRIEST, PriestSpawnPos[index], TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 0);
+ uint64 _frostmourneGUID;
+ uint64 _entranceDoorGUID;
+ uint64 _frostwornDoorGUID;
+ uint64 _arthasDoorGUID;
+ uint64 _escapeDoorGUID;
- index = urand(0, ENCOUNTER_WAVE_MAGE-1);
- summoner->SummonCreature(NPC_WAVE_MAGE, MageSpawnPos[index], TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 0);
- }
-
- void Update(uint32 diff)
- {
- if (!instance->HavePlayers())
- return;
+ uint32 _teamInInstance;
+ uint32 _waveCount;
+ uint32 _introEvent;
+ uint32 _frostwornGeneral;
- events.Update(diff);
+ EventMap events;
- switch (events.ExecuteEvent())
- {
- case EVENT_NEXT_WAVE:
- uiWaveCount++;
- AddWave();
- break;
- case EVENT_START_LICH_KING:
- /// @todo
- break;
- }
- }
+ std::set<uint64> waveGuidList[8];
};
+ InstanceScript* GetInstanceScript(InstanceMap* map) const
+ {
+ return new instance_halls_of_reflection_InstanceMapScript(map);
+ }
};
void AddSC_instance_halls_of_reflection()
diff --git a/src/server/scripts/Northrend/Gundrak/gundrak.h b/src/server/scripts/Northrend/Gundrak/gundrak.h
index 0c65b4d16de..a43edb4fcd7 100644
--- a/src/server/scripts/Northrend/Gundrak/gundrak.h
+++ b/src/server/scripts/Northrend/Gundrak/gundrak.h
@@ -43,12 +43,31 @@ enum Data64
enum mainCreatures
{
- CREATURE_RUIN_DWELLER = 29920,
- CREATURE_SLAD_RAN = 29304,
- CREATURE_MOORABI = 29305,
- CREATURE_GALDARAH = 29306,
- CREATURE_DRAKKARICOLOSSUS = 29307,
- CREATURE_ECK = 29932
+ CREATURE_RUIN_DWELLER = 29920,
+ CREATURE_SLAD_RAN = 29304,
+ CREATURE_MOORABI = 29305,
+ CREATURE_GALDARAH = 29306,
+ CREATURE_DRAKKARICOLOSSUS = 29307,
+ CREATURE_ECK = 29932
+};
+
+enum Gameobjects {
+
+ GO_SLADRAN_ALTAR = 192518,
+ GO_MOORABI_ALTAR = 192519,
+ GO_DRAKKARI_COLOSSUS_ALTAR = 192520,
+ GO_SLADRAN_STATUE = 192564,
+ GO_MOORABI_STATUE = 192565,
+ GO_GALDARAH_STATUE = 192566,
+ GO_DRAKKARI_COLOSSUS_STATUE = 192567,
+ GO_ECK_THE_FEROCIOUS_DOOR = 192632,
+ GO_ECK_THE_FEROCIOUS_DOOR_BEHIND = 192569,
+ GO_GALDARAH_DOOR1 = 193208,
+ GO_GALDARAH_DOOR2 = 193209,
+ GO_GALDARAH_DOOR3 = 192568,
+ GO_BRIDGE = 193188,
+ GO_COLLISION = 192633
+
};
#endif
diff --git a/src/server/scripts/Northrend/Gundrak/instance_gundrak.cpp b/src/server/scripts/Northrend/Gundrak/instance_gundrak.cpp
index a9bbffa5fb0..d17198b0c92 100644
--- a/src/server/scripts/Northrend/Gundrak/instance_gundrak.cpp
+++ b/src/server/scripts/Northrend/Gundrak/instance_gundrak.cpp
@@ -45,44 +45,45 @@ public:
{
instance_gundrak_InstanceMapScript(Map* map) : InstanceScript(map)
{
- bHeroicMode = map->IsHeroic();
+ isHeroic = map->IsHeroic();
}
- bool bHeroicMode;
+ bool isHeroic;
bool spawnSupport;
uint32 timer;
uint32 phase;
uint64 toActivate;
- uint64 uiSladRan;
- uint64 uiMoorabi;
- uint64 uiDrakkariColossus;
- uint64 uiGalDarah;
- uint64 uiEckTheFerocious;
-
- uint64 uiSladRanAltar;
- uint64 uiMoorabiAltar;
- uint64 uiDrakkariColossusAltar;
- uint64 uiSladRanStatue;
- uint64 uiMoorabiStatue;
- uint64 uiDrakkariColossusStatue;
- uint64 uiGalDarahStatue;
- uint64 uiEckTheFerociousDoor;
- uint64 uiEckTheFerociousDoorBehind;
- uint64 uiGalDarahDoor1;
- uint64 uiGalDarahDoor2;
- uint64 uiBridge;
- uint64 uiCollision;
+ uint64 sladRanGUID;
+ uint64 moorabiGUID;
+ uint64 drakkariColossusGUID;
+ uint64 galDarahGUID;
+ uint64 eckTheFerociousGUID;
+
+ uint64 sladRanAltarGUID;
+ uint64 moorabiAltarGUID;
+ uint64 drakkariColossusAltarGUID;
+ uint64 sladRanStatueGUID;
+ uint64 moorabiStatueGUID;
+ uint64 drakkariColossusStatueGUID;
+ uint64 galDarahStatueGUID;
+ uint64 eckTheFerociousDoorGUID;
+ uint64 eckTheFerociousDoorBehindGUID;
+ uint64 galDarahDoor1GUID;
+ uint64 galDarahDoor2GUID;
+ uint64 galDarahDoor3GUID;
+ uint64 bridgeGUID;
+ uint64 collisionGUID;
uint32 m_auiEncounter[MAX_ENCOUNTER];
- GOState uiSladRanStatueState;
- GOState uiMoorabiStatueState;
- GOState uiDrakkariColossusStatueState;
- GOState uiGalDarahStatueState;
- GOState uiBridgeState;
- GOState uiCollisionState;
+ GOState sladRanStatueState;
+ GOState moorabiStatueState;
+ GOState drakkariColossusStatueState;
+ GOState galDarahStatueState;
+ GOState bridgeState;
+ GOState collisionState;
std::set<uint64> DwellerGUIDs;
@@ -96,35 +97,36 @@ public:
phase = 0;
toActivate = 0;
- uiSladRan = 0;
- uiMoorabi = 0;
- uiDrakkariColossus = 0;
- uiGalDarah = 0;
- uiEckTheFerocious = 0;
-
- uiSladRanAltar = 0;
- uiMoorabiAltar = 0;
- uiDrakkariColossusAltar = 0;
-
- uiSladRanStatue = 0;
- uiMoorabiStatue = 0;
- uiDrakkariColossusStatue = 0;
- uiGalDarahStatue = 0;
-
- uiEckTheFerociousDoor = 0;
- uiEckTheFerociousDoorBehind = 0;
- uiGalDarahDoor1 = 0;
- uiGalDarahDoor2 = 0;
-
- uiBridge = 0;
- uiCollision = 0;
-
- uiSladRanStatueState = GO_STATE_ACTIVE;
- uiMoorabiStatueState = GO_STATE_ACTIVE;
- uiDrakkariColossusStatueState = GO_STATE_ACTIVE;
- uiGalDarahStatueState = GO_STATE_READY;
- uiBridgeState = GO_STATE_ACTIVE;
- uiCollisionState = GO_STATE_READY;
+ sladRanGUID = 0;
+ moorabiGUID = 0;
+ drakkariColossusGUID = 0;
+ galDarahGUID = 0;
+ eckTheFerociousGUID = 0;
+
+ sladRanAltarGUID = 0;
+ moorabiAltarGUID = 0;
+ drakkariColossusAltarGUID = 0;
+
+ sladRanStatueGUID = 0;
+ moorabiStatueGUID = 0;
+ drakkariColossusStatueGUID = 0;
+ galDarahStatueGUID = 0;
+
+ eckTheFerociousDoorGUID = 0;
+ eckTheFerociousDoorBehindGUID = 0;
+ galDarahDoor1GUID = 0;
+ galDarahDoor2GUID = 0;
+ galDarahDoor3GUID = 0;
+
+ bridgeGUID = 0;
+ collisionGUID = 0;
+
+ sladRanStatueState = GO_STATE_ACTIVE;
+ moorabiStatueState = GO_STATE_ACTIVE;
+ drakkariColossusStatueState = GO_STATE_ACTIVE;
+ galDarahStatueState = GO_STATE_READY;
+ bridgeState = GO_STATE_ACTIVE;
+ collisionState = GO_STATE_READY;
DwellerGUIDs.clear();
@@ -144,11 +146,21 @@ public:
{
switch (creature->GetEntry())
{
- case CREATURE_SLAD_RAN: uiSladRan = creature->GetGUID(); break;
- case CREATURE_MOORABI: uiMoorabi = creature->GetGUID(); break;
- case CREATURE_GALDARAH: uiGalDarah = creature->GetGUID(); break;
- case CREATURE_DRAKKARICOLOSSUS: uiDrakkariColossus = creature->GetGUID(); break;
- case CREATURE_ECK: uiEckTheFerocious = creature->GetGUID(); break;
+ case CREATURE_SLAD_RAN:
+ sladRanGUID = creature->GetGUID();
+ break;
+ case CREATURE_MOORABI:
+ moorabiGUID = creature->GetGUID();
+ break;
+ case CREATURE_GALDARAH:
+ galDarahGUID = creature->GetGUID();
+ break;
+ case CREATURE_DRAKKARICOLOSSUS:
+ drakkariColossusGUID = creature->GetGUID();
+ break;
+ case CREATURE_ECK:
+ eckTheFerociousGUID = creature->GetGUID();
+ break;
case CREATURE_RUIN_DWELLER:
if (creature->isAlive())
DwellerGUIDs.insert(creature->GetGUID());
@@ -160,13 +172,13 @@ public:
{
switch (go->GetEntry())
{
- case 192518:
- uiSladRanAltar = go->GetGUID();
+ case GO_SLADRAN_ALTAR:
+ sladRanAltarGUID = go->GetGUID();
// Make sure that they start out as unusuable
go->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
if (m_auiEncounter[0] == DONE)
{
- if (uiSladRanStatueState == GO_STATE_ACTIVE)
+ if (sladRanStatueState == GO_STATE_ACTIVE)
go->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
else
{
@@ -175,13 +187,13 @@ public:
}
}
break;
- case 192519:
- uiMoorabiAltar = go->GetGUID();
+ case GO_MOORABI_ALTAR:
+ moorabiAltarGUID = go->GetGUID();
// Make sure that they start out as unusuable
go->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
if (m_auiEncounter[0] == DONE)
{
- if (uiMoorabiStatueState == GO_STATE_ACTIVE)
+ if (moorabiStatueState == GO_STATE_ACTIVE)
go->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
else
{
@@ -190,13 +202,13 @@ public:
}
}
break;
- case 192520:
- uiDrakkariColossusAltar = go->GetGUID();
+ case GO_DRAKKARI_COLOSSUS_ALTAR:
+ drakkariColossusAltarGUID = go->GetGUID();
// Make sure that they start out as unusuable
go->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
if (m_auiEncounter[0] == DONE)
{
- if (uiDrakkariColossusStatueState == GO_STATE_ACTIVE)
+ if (drakkariColossusStatueState == GO_STATE_ACTIVE)
go->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
else
{
@@ -205,53 +217,58 @@ public:
}
}
break;
- case 192564:
- uiSladRanStatue = go->GetGUID();
- go->SetGoState(uiSladRanStatueState);
+ case GO_SLADRAN_STATUE:
+ sladRanStatueGUID = go->GetGUID();
+ go->SetGoState(sladRanStatueState);
break;
- case 192565:
- uiMoorabiStatue = go->GetGUID();
- go->SetGoState(uiMoorabiStatueState);
+ case GO_MOORABI_STATUE:
+ moorabiStatueGUID = go->GetGUID();
+ go->SetGoState(moorabiStatueState);
break;
- case 192566:
- uiGalDarahStatue = go->GetGUID();
- go->SetGoState(uiGalDarahStatueState);
+ case GO_GALDARAH_STATUE:
+ galDarahStatueGUID = go->GetGUID();
+ go->SetGoState(galDarahStatueState);
break;
- case 192567:
- uiDrakkariColossusStatue = go->GetGUID();
- go->SetGoState(uiDrakkariColossusStatueState);
+ case GO_DRAKKARI_COLOSSUS_STATUE:
+ drakkariColossusStatueGUID = go->GetGUID();
+ go->SetGoState(drakkariColossusStatueState);
break;
- case 192632:
- uiEckTheFerociousDoor = go->GetGUID();
- if (bHeroicMode && m_auiEncounter[1] == DONE)
+ case GO_ECK_THE_FEROCIOUS_DOOR:
+ eckTheFerociousDoorGUID = go->GetGUID();
+ if (isHeroic && m_auiEncounter[1] == DONE)
HandleGameObject(0, true, go);
break;
- case 192569:
- uiEckTheFerociousDoorBehind = go->GetGUID();
- if (bHeroicMode && m_auiEncounter[4] == DONE)
+ case GO_ECK_THE_FEROCIOUS_DOOR_BEHIND:
+ eckTheFerociousDoorBehindGUID = go->GetGUID();
+ if (isHeroic && m_auiEncounter[4] == DONE)
HandleGameObject(0, true, go);
- case 193208:
- uiGalDarahDoor1 = go->GetGUID();
+ case GO_GALDARAH_DOOR1:
+ galDarahDoor1GUID = go->GetGUID();
if (m_auiEncounter[3] == DONE)
HandleGameObject(0, true, go);
break;
- case 193209:
- uiGalDarahDoor2 = go->GetGUID();
+ case GO_GALDARAH_DOOR2:
+ galDarahDoor2GUID = go->GetGUID();
if (m_auiEncounter[3] == DONE)
HandleGameObject(0, true, go);
break;
- case 193188:
- uiBridge = go->GetGUID();
- go->SetGoState(uiBridgeState);
+ case GO_BRIDGE:
+ bridgeGUID = go->GetGUID();
+ go->SetGoState(bridgeState);
break;
- case 192633:
- uiCollision = go->GetGUID();
- go->SetGoState(uiCollisionState);
+ case GO_COLLISION:
+ collisionGUID = go->GetGUID();
+ go->SetGoState(collisionState);
// Can't spawn here with SpawnGameObject because go isn't added to world yet...
- if (uiCollisionState == GO_STATE_ACTIVE_ALTERNATIVE)
+ if (collisionState == GO_STATE_ACTIVE_ALTERNATIVE)
spawnSupport = true;
break;
+ case GO_GALDARAH_DOOR3:
+ galDarahDoor3GUID = go->GetGUID();
+ if (m_auiEncounter[3] != IN_PROGRESS)
+ HandleGameObject(galDarahDoor3GUID, true, go);
+ break;
}
}
@@ -263,7 +280,7 @@ public:
m_auiEncounter[0] = data;
if (data == DONE)
{
- GameObject* go = instance->GetGameObject(uiSladRanAltar);
+ GameObject* go = instance->GetGameObject(sladRanAltarGUID);
if (go)
go->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
}
@@ -272,18 +289,18 @@ public:
m_auiEncounter[1] = data;
if (data == DONE)
{
- GameObject* go = instance->GetGameObject(uiMoorabiAltar);
+ GameObject* go = instance->GetGameObject(moorabiAltarGUID);
if (go)
go->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
- if (bHeroicMode)
- HandleGameObject(uiEckTheFerociousDoor, true);
+ if (isHeroic)
+ HandleGameObject(eckTheFerociousDoorGUID, true);
}
break;
case DATA_DRAKKARI_COLOSSUS_EVENT:
m_auiEncounter[2] = data;
if (data == DONE)
{
- GameObject* go = instance->GetGameObject(uiDrakkariColossusAltar);
+ GameObject* go = instance->GetGameObject(drakkariColossusAltarGUID);
if (go)
go->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
}
@@ -292,14 +309,15 @@ public:
m_auiEncounter[3] = data;
if (data == DONE)
{
- HandleGameObject(uiGalDarahDoor1, true);
- HandleGameObject(uiGalDarahDoor2, true);
+ HandleGameObject(galDarahDoor1GUID, true);
+ HandleGameObject(galDarahDoor2GUID, true);
}
+ HandleGameObject(galDarahDoor3GUID, data == IN_PROGRESS ? false : true);
break;
case DATA_ECK_THE_FEROCIOUS_EVENT:
m_auiEncounter[4] = data;
- if (bHeroicMode && data == DONE)
- HandleGameObject(uiEckTheFerociousDoorBehind, true);
+ if (isHeroic && data == DONE)
+ HandleGameObject(eckTheFerociousDoorBehindGUID, true);
break;
}
@@ -345,19 +363,19 @@ public:
switch (type)
{
case DATA_SLAD_RAN_ALTAR:
- return uiSladRanAltar;
+ return sladRanAltarGUID;
case DATA_MOORABI_ALTAR:
- return uiMoorabiAltar;
+ return moorabiAltarGUID;
case DATA_DRAKKARI_COLOSSUS_ALTAR:
- return uiDrakkariColossusAltar;
+ return drakkariColossusAltarGUID;
case DATA_SLAD_RAN_STATUE:
- return uiSladRanStatue;
+ return sladRanStatueGUID;
case DATA_MOORABI_STATUE:
- return uiMoorabiStatue;
+ return moorabiStatueGUID;
case DATA_DRAKKARI_COLOSSUS_STATUE:
- return uiDrakkariColossusStatue;
+ return drakkariColossusStatueGUID;
case DATA_DRAKKARI_COLOSSUS:
- return uiDrakkariColossus;
+ return drakkariColossusGUID;
case DATA_STATUE_ACTIVATE:
return toActivate;
}
@@ -372,9 +390,9 @@ public:
std::ostringstream saveStream;
saveStream << "G D " << m_auiEncounter[0] << ' ' << m_auiEncounter[1] << ' '
<< m_auiEncounter[2] << ' ' << m_auiEncounter[3] << ' ' << m_auiEncounter[4] << ' '
- << (uiSladRanStatue ? GetObjState(uiSladRanStatue) : GO_STATE_ACTIVE) << ' ' << (uiMoorabiStatue ? GetObjState(uiMoorabiStatue) : GO_STATE_ACTIVE) << ' '
- << (uiDrakkariColossusStatue ? GetObjState(uiDrakkariColossusStatue) : GO_STATE_ACTIVE) << ' ' << (uiGalDarahStatue ? GetObjState(uiGalDarahStatue) : GO_STATE_READY) << ' '
- << (uiBridge ? GetObjState(uiBridge) : GO_STATE_ACTIVE) << ' ' << (uiCollision ? GetObjState(uiCollision) : GO_STATE_READY);
+ << (sladRanStatueGUID ? GetObjState(sladRanStatueGUID) : GO_STATE_ACTIVE) << ' ' << (moorabiStatueGUID ? GetObjState(moorabiStatueGUID) : GO_STATE_ACTIVE) << ' '
+ << (drakkariColossusStatueGUID ? GetObjState(drakkariColossusStatueGUID) : GO_STATE_ACTIVE) << ' ' << (galDarahStatueGUID ? GetObjState(galDarahStatueGUID) : GO_STATE_READY) << ' '
+ << (bridgeGUID ? GetObjState(bridgeGUID) : GO_STATE_ACTIVE) << ' ' << (collisionGUID ? GetObjState(collisionGUID) : GO_STATE_READY);
str_data = saveStream.str();
@@ -406,12 +424,12 @@ public:
m_auiEncounter[2] = data2;
m_auiEncounter[3] = data3;
m_auiEncounter[4] = data4;
- uiSladRanStatueState = GOState(data5);
- uiMoorabiStatueState = GOState(data6);
- uiDrakkariColossusStatueState = GOState(data7);
- uiGalDarahStatueState = GOState(data8);
- uiBridgeState = GOState(data9);
- uiCollisionState = GOState(data10);
+ sladRanStatueState = GOState(data5);
+ moorabiStatueState = GOState(data6);
+ drakkariColossusStatueState = GOState(data7);
+ galDarahStatueState = GOState(data8);
+ bridgeState = GOState(data9);
+ collisionState = GOState(data10);
for (uint8 i = 0; i < MAX_ENCOUNTER; ++i)
if (m_auiEncounter[i] == IN_PROGRESS)
@@ -426,8 +444,8 @@ public:
// Spawn the support for the bridge if necessary
if (spawnSupport)
{
- if (GameObject* pCollision = instance->GetGameObject(uiCollision))
- pCollision->SummonGameObject(192743, pCollision->GetPositionX(), pCollision->GetPositionY(), pCollision->GetPositionZ(), pCollision->GetOrientation(), 0, 0, 0, 0, 0);
+ if (GameObject* collision = instance->GetGameObject(collisionGUID))
+ collision->SummonGameObject(192743, collision->GetPositionX(), collision->GetPositionY(), collision->GetPositionZ(), collision->GetOrientation(), 0, 0, 0, 0, 0);
spawnSupport = false;
}
@@ -438,25 +456,25 @@ public:
if (timer < diff)
{
timer = 0;
- if (toActivate == uiBridge)
+ if (toActivate == bridgeGUID)
{
- GameObject* pBridge = instance->GetGameObject(uiBridge);
- GameObject* pCollision = instance->GetGameObject(uiCollision);
- GameObject* pSladRanStatue = instance->GetGameObject(uiSladRanStatue);
- GameObject* pMoorabiStatue = instance->GetGameObject(uiMoorabiStatue);
- GameObject* pDrakkariColossusStatue = instance->GetGameObject(uiDrakkariColossusStatue);
- GameObject* pGalDarahStatue = instance->GetGameObject(uiGalDarahStatue);
+ GameObject* bridge = instance->GetGameObject(bridgeGUID);
+ GameObject* collision = instance->GetGameObject(collisionGUID);
+ GameObject* sladRanStatue = instance->GetGameObject(sladRanStatueGUID);
+ GameObject* moorabiStatue = instance->GetGameObject(moorabiStatueGUID);
+ GameObject* drakkariColossusStatue = instance->GetGameObject(drakkariColossusStatueGUID);
+ GameObject* galDarahStatue = instance->GetGameObject(galDarahStatueGUID);
toActivate = 0;
- if (pBridge && pCollision && pSladRanStatue && pMoorabiStatue && pDrakkariColossusStatue && pGalDarahStatue)
+ if (bridge && collision && sladRanStatue && moorabiStatue && drakkariColossusStatue && galDarahStatue)
{
- pBridge->SetGoState(GO_STATE_ACTIVE_ALTERNATIVE);
- pCollision->SetGoState(GO_STATE_ACTIVE_ALTERNATIVE);
- pSladRanStatue->SetGoState(GO_STATE_ACTIVE_ALTERNATIVE);
- pMoorabiStatue->SetGoState(GO_STATE_ACTIVE_ALTERNATIVE);
- pDrakkariColossusStatue->SetGoState(GO_STATE_ACTIVE_ALTERNATIVE);
- pGalDarahStatue->SetGoState(GO_STATE_ACTIVE_ALTERNATIVE);
+ bridge->SetGoState(GO_STATE_ACTIVE_ALTERNATIVE);
+ collision->SetGoState(GO_STATE_ACTIVE_ALTERNATIVE);
+ sladRanStatue->SetGoState(GO_STATE_ACTIVE_ALTERNATIVE);
+ moorabiStatue->SetGoState(GO_STATE_ACTIVE_ALTERNATIVE);
+ drakkariColossusStatue->SetGoState(GO_STATE_ACTIVE_ALTERNATIVE);
+ galDarahStatue->SetGoState(GO_STATE_ACTIVE_ALTERNATIVE);
// Add the GO that solidifies the bridge so you can walk on it
spawnSupport = true;
@@ -466,27 +484,27 @@ public:
else
{
uint32 spell = 0;
- GameObject* pAltar = NULL;
- if (toActivate == uiSladRanStatue)
+ GameObject* altar = NULL;
+ if (toActivate == sladRanStatueGUID)
{
spell = 57071;
- pAltar = instance->GetGameObject(uiSladRanAltar);
+ altar = instance->GetGameObject(sladRanAltarGUID);
}
- else if (toActivate == uiMoorabiStatue)
+ else if (toActivate == moorabiStatueGUID)
{
spell = 57068;
- pAltar = instance->GetGameObject(uiMoorabiAltar);
+ altar = instance->GetGameObject(moorabiAltarGUID);
}
- else if (toActivate == uiDrakkariColossusStatue)
+ else if (toActivate == drakkariColossusStatueGUID)
{
spell = 57072;
- pAltar = instance->GetGameObject(uiDrakkariColossusAltar);
+ altar = instance->GetGameObject(drakkariColossusAltarGUID);
}
// This is a workaround to make the beam cast properly. The caster should be ID 30298 but since the spells
// all are with scripted target for that same ID, it will hit itself.
- if (pAltar)
- if (Creature* trigger = pAltar->SummonCreature(18721, pAltar->GetPositionX(), pAltar->GetPositionY(), pAltar->GetPositionZ() + 3, pAltar->GetOrientation(), TEMPSUMMON_CORPSE_DESPAWN, 5000))
+ if (altar)
+ if (Creature* trigger = altar->SummonCreature(18721, altar->GetPositionX(), altar->GetPositionY(), altar->GetPositionZ() + 3, altar->GetOrientation(), TEMPSUMMON_CORPSE_DESPAWN, 5000))
{
// Set the trigger model to invisible
trigger->SetDisplayId(11686);
@@ -499,7 +517,7 @@ public:
toActivate = 0;
if (phase == 3)
- SetData64(DATA_STATUE_ACTIVATE, uiBridge);
+ SetData64(DATA_STATUE_ACTIVATE, bridgeGUID);
else
SaveToDB(); // Don't save in between last statue and bridge turning in case of crash leading to stuck instance
}
@@ -526,7 +544,7 @@ public:
bool OnGossipHello(Player* /*player*/, GameObject* go)
{
InstanceScript* instance = go->GetInstanceScript();
- uint64 uiStatue = 0;
+ uint64 statueGUID = 0;
go->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
go->SetGoState(GO_STATE_ACTIVE);
@@ -535,20 +553,20 @@ public:
{
switch (go->GetEntry())
{
- case 192518:
- uiStatue = instance->GetData64(DATA_SLAD_RAN_STATUE);
+ case GO_SLADRAN_ALTAR:
+ statueGUID = instance->GetData64(DATA_SLAD_RAN_STATUE);
break;
- case 192519:
- uiStatue = instance->GetData64(DATA_MOORABI_STATUE);
+ case GO_MOORABI_ALTAR:
+ statueGUID = instance->GetData64(DATA_MOORABI_STATUE);
break;
- case 192520:
- uiStatue = instance->GetData64(DATA_DRAKKARI_COLOSSUS_STATUE);
+ case GO_DRAKKARI_COLOSSUS_ALTAR:
+ statueGUID = instance->GetData64(DATA_DRAKKARI_COLOSSUS_STATUE);
break;
}
if (!instance->GetData64(DATA_STATUE_ACTIVATE))
{
- instance->SetData64(DATA_STATUE_ACTIVATE, uiStatue);
+ instance->SetData64(DATA_STATUE_ACTIVATE, statueGUID);
go->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
go->SetGoState(GO_STATE_ACTIVE);
}
diff --git a/src/server/scripts/Spells/spell_quest.cpp b/src/server/scripts/Spells/spell_quest.cpp
index 3036c52876d..4cc464af9ab 100644
--- a/src/server/scripts/Spells/spell_quest.cpp
+++ b/src/server/scripts/Spells/spell_quest.cpp
@@ -1640,6 +1640,37 @@ class spell_q13291_q13292_q13239_q13261_armored_decoy_summon_skytalon : public S
}
};
+class spell_q12847_summon_soul_moveto_bunny : public SpellScriptLoader
+{
+ public:
+ spell_q12847_summon_soul_moveto_bunny() : SpellScriptLoader("spell_q12847_summon_soul_moveto_bunny") { }
+
+ class spell_q12847_summon_soul_moveto_bunny_SpellScript : public SpellScript
+ {
+ PrepareSpellScript(spell_q12847_summon_soul_moveto_bunny_SpellScript);
+
+ void ChangeSummonPos(SpellEffIndex /*effIndex*/)
+ {
+ // Adjust effect summon position
+ WorldLocation summonPos = *GetExplTargetDest();
+ Position offset = { 0.0f, 0.0f, 2.5f, 0.0f };
+ summonPos.RelocateOffset(offset);
+ SetExplTargetDest(summonPos);
+ GetHitDest()->RelocateOffset(offset);
+ }
+
+ void Register()
+ {
+ OnEffectHit += SpellEffectFn(spell_q12847_summon_soul_moveto_bunny_SpellScript::ChangeSummonPos, EFFECT_0, SPELL_EFFECT_SUMMON);
+ }
+ };
+
+ SpellScript *GetSpellScript() const
+ {
+ return new spell_q12847_summon_soul_moveto_bunny_SpellScript();
+ }
+};
+
void AddSC_quest_spell_scripts()
{
new spell_q55_sacred_cleansing();
@@ -1680,4 +1711,5 @@ void AddSC_quest_spell_scripts()
new spell_q12527_zuldrak_rat();
new spell_q13291_q13292_q13239_q13261_frostbrood_skytalon_grab_decoy();
new spell_q13291_q13292_q13239_q13261_armored_decoy_summon_skytalon();
+ new spell_q12847_summon_soul_moveto_bunny();
}
diff --git a/src/server/shared/Database/Implementation/CharacterDatabase.cpp b/src/server/shared/Database/Implementation/CharacterDatabase.cpp
index 9704b709959..4fb9c763f16 100644
--- a/src/server/shared/Database/Implementation/CharacterDatabase.cpp
+++ b/src/server/shared/Database/Implementation/CharacterDatabase.cpp
@@ -319,6 +319,7 @@ void CharacterDatabaseConnection::DoPrepareStatements()
PrepareStatement(CHAR_UPD_ARENA_TEAM_MEMBER, "UPDATE arena_team_member SET personalRating = ?, weekGames = ?, weekWins = ?, seasonGames = ?, seasonWins = ? WHERE arenaTeamId = ? AND guid = ?", CONNECTION_ASYNC);
PrepareStatement(CHAR_REP_CHARACTER_ARENA_STATS, "REPLACE INTO character_arena_stats (guid, slot, matchMakerRating) VALUES (?, ?, ?)", CONNECTION_ASYNC);
PrepareStatement(CHAR_SEL_PLAYER_ARENA_TEAMS, "SELECT arena_team_member.arenaTeamId FROM arena_team_member JOIN arena_team ON arena_team_member.arenaTeamId = arena_team.arenaTeamId WHERE guid = ?", CONNECTION_SYNCH);
+ PrepareStatement(CHAR_UPD_ARENA_TEAM_NAME, "UPDATE arena_team SET name = ? WHERE arenaTeamId = ?", CONNECTION_ASYNC);
// Character battleground data
PrepareStatement(CHAR_INS_PLAYER_BGDATA, "INSERT INTO character_battleground_data (guid, instanceId, team, joinX, joinY, joinZ, joinO, joinMapId, taxiStart, taxiEnd, mountSpell) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", CONNECTION_ASYNC);
@@ -439,8 +440,12 @@ void CharacterDatabaseConnection::DoPrepareStatements()
PrepareStatement(CHAR_SEL_CHAR_DEL_INFO_BY_NAME, "SELECT guid, deleteInfos_Name, deleteInfos_Account, deleteDate FROM characters WHERE deleteDate IS NOT NULL AND deleteInfos_Name LIKE CONCAT('%%', ?, '%%')", CONNECTION_SYNCH);
PrepareStatement(CHAR_SEL_CHAR_DEL_INFO, "SELECT guid, deleteInfos_Name, deleteInfos_Account, deleteDate FROM characters WHERE deleteDate IS NOT NULL", CONNECTION_SYNCH);
PrepareStatement(CHAR_SEL_CHARS_BY_ACCOUNT_ID, "SELECT guid FROM characters WHERE account = ?", CONNECTION_SYNCH);
- PrepareStatement(CHAR_SEL_CHAR_PINFO, "SELECT totaltime, level, money, account, race, class, map, zone FROM characters WHERE guid = ?", CONNECTION_SYNCH);
+ PrepareStatement(CHAR_SEL_CHAR_PINFO, "SELECT totaltime, level, money, account, race, class, map, zone, gender, health, playerFlags FROM characters WHERE guid = ?", CONNECTION_SYNCH);
PrepareStatement(CHAR_SEL_PINFO_BANS, "SELECT unbandate, bandate = unbandate, bannedby, banreason FROM character_banned WHERE guid = ? AND active ORDER BY bandate ASC LIMIT 1", CONNECTION_SYNCH);
+ //0: lowGUID
+ PrepareStatement(CHAR_SEL_PINFO_MAILS, "SELECT SUM(CASE WHEN (checked & 1) THEN 1 ELSE 0 END) AS 'readmail', COUNT(*) AS 'totalmail' FROM mail WHERE `receiver` = ?", CONNECTION_SYNCH);
+ //0: lowGUID
+ PrepareStatement(CHAR_SEL_PINFO_XP, "SELECT xp FROM characters WHERE guid = ?", CONNECTION_SYNCH);
PrepareStatement(CHAR_SEL_CHAR_HOMEBIND, "SELECT mapId, zoneId, posX, posY, posZ FROM character_homebind WHERE guid = ?", CONNECTION_SYNCH);
PrepareStatement(CHAR_SEL_CHAR_GUID_NAME_BY_ACC, "SELECT guid, name FROM characters WHERE account = ?", CONNECTION_SYNCH);
PrepareStatement(CHAR_SEL_POOL_QUEST_SAVE, "SELECT quest_id FROM pool_quest_save WHERE pool_id = ?", CONNECTION_SYNCH);
diff --git a/src/server/shared/Database/Implementation/CharacterDatabase.h b/src/server/shared/Database/Implementation/CharacterDatabase.h
index d9900d53f46..53c309f9ba0 100755
--- a/src/server/shared/Database/Implementation/CharacterDatabase.h
+++ b/src/server/shared/Database/Implementation/CharacterDatabase.h
@@ -268,6 +268,7 @@ enum CharacterDatabaseStatements
CHAR_UPD_ARENA_TEAM_MEMBER,
CHAR_REP_CHARACTER_ARENA_STATS,
CHAR_SEL_PLAYER_ARENA_TEAMS,
+ CHAR_UPD_ARENA_TEAM_NAME,
CHAR_SEL_PETITION,
CHAR_SEL_PETITION_SIGNATURE,
@@ -381,6 +382,8 @@ enum CharacterDatabaseStatements
CHAR_SEL_CHARS_BY_ACCOUNT_ID,
CHAR_SEL_CHAR_PINFO,
+ CHAR_SEL_PINFO_XP,
+ CHAR_SEL_PINFO_MAILS,
CHAR_SEL_PINFO_BANS,
CHAR_SEL_CHAR_HOMEBIND,
CHAR_SEL_CHAR_GUID_NAME_BY_ACC,
diff --git a/src/server/shared/Database/Implementation/LoginDatabase.cpp b/src/server/shared/Database/Implementation/LoginDatabase.cpp
index 0118f637205..6113dd61d70 100644
--- a/src/server/shared/Database/Implementation/LoginDatabase.cpp
+++ b/src/server/shared/Database/Implementation/LoginDatabase.cpp
@@ -79,7 +79,7 @@ void LoginDatabaseConnection::DoPrepareStatements()
PrepareStatement(LOGIN_GET_USERNAME_BY_ID, "SELECT username FROM account WHERE id = ?", CONNECTION_SYNCH);
PrepareStatement(LOGIN_SEL_CHECK_PASSWORD, "SELECT 1 FROM account WHERE id = ? AND sha_pass_hash = ?", CONNECTION_SYNCH);
PrepareStatement(LOGIN_SEL_CHECK_PASSWORD_BY_NAME, "SELECT 1 FROM account WHERE username = ? AND sha_pass_hash = ?", CONNECTION_SYNCH);
- PrepareStatement(LOGIN_SEL_PINFO, "SELECT a.username, aa.gmlevel, a.email, a.last_ip, DATE_FORMAT(a.last_login, '%Y-%m-%d %T'), a.mutetime, a.mutereason, a.muteby FROM account a LEFT JOIN account_access aa ON (a.id = aa.id AND (aa.RealmID = ? OR aa.RealmID = -1)) WHERE a.id = ?", CONNECTION_SYNCH);
+ PrepareStatement(LOGIN_SEL_PINFO, "SELECT a.username, aa.gmlevel, a.email, a.last_ip, DATE_FORMAT(a.last_login, '%Y-%m-%d %T'), a.mutetime, a.mutereason, a.muteby, a.failed_logins, a.locked, a.OS FROM account a LEFT JOIN account_access aa ON (a.id = aa.id AND (aa.RealmID = ? OR aa.RealmID = -1)) WHERE a.id = ?", CONNECTION_SYNCH);
PrepareStatement(LOGIN_SEL_PINFO_BANS, "SELECT unbandate, bandate = unbandate, bannedby, banreason FROM account_banned WHERE id = ? AND active ORDER BY bandate ASC LIMIT 1", CONNECTION_SYNCH);
PrepareStatement(LOGIN_SEL_GM_ACCOUNTS, "SELECT a.username, aa.gmlevel FROM account a, account_access aa WHERE a.id=aa.id AND aa.gmlevel >= ? AND (aa.realmid = -1 OR aa.realmid = ?)", CONNECTION_SYNCH);
PrepareStatement(LOGIN_SEL_ACCOUNT_INFO, "SELECT a.username, a.last_ip, aa.gmlevel, a.expansion FROM account a LEFT JOIN account_access aa ON (a.id = aa.id) WHERE a.id = ?", CONNECTION_SYNCH);
diff --git a/src/server/shared/Database/Implementation/WorldDatabase.cpp b/src/server/shared/Database/Implementation/WorldDatabase.cpp
index c6e520cfdde..75bafb571e9 100644
--- a/src/server/shared/Database/Implementation/WorldDatabase.cpp
+++ b/src/server/shared/Database/Implementation/WorldDatabase.cpp
@@ -91,4 +91,6 @@ 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 d8c3c69dbba..171627bb83a 100644
--- a/src/server/shared/Database/Implementation/WorldDatabase.h
+++ b/src/server/shared/Database/Implementation/WorldDatabase.h
@@ -112,6 +112,7 @@ enum WorldDatabaseStatements
WORLD_SEL_DISABLES,
WORLD_INS_DISABLES,
WORLD_DEL_DISABLES,
+ WORLD_SEL_REQ_XP,
MAX_WORLDDATABASE_STATEMENTS
};