aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--contrib/conf_merge/confdiffmerge.php169
-rw-r--r--sql/updates/world/2014_05_07_00_world_creature_template.sql2
-rw-r--r--sql/updates/world/2014_05_07_00_world_gossip_menu_option.sql1
-rw-r--r--sql/updates/world/2014_05_08_00_world_smart_scripts.sql2
-rw-r--r--sql/updates/world/2014_05_09_00_world_misc.sql11
-rw-r--r--sql/updates/world/2014_05_09_01_world_gossip.sql15
-rw-r--r--sql/updates/world/2014_05_09_02_world_creature_template.sql1
-rw-r--r--sql/updates/world/2014_05_10_00_world_player_factionchange_items.sql2
-rw-r--r--sql/updates/world/2014_05_10_01_world_halls_of_reflection.sql218
-rw-r--r--sql/updates/world/2014_05_11_00_world_gameobject.sql289
-rw-r--r--sql/updates/world/2014_05_11_01_world_misc.sql39
-rw-r--r--sql/updates/world/2014_05_11_02_world_gameobject.sql4
-rw-r--r--sql/updates/world/2014_05_11_03_world_gameobject.sql2
-rw-r--r--sql/updates/world/2014_05_12_00_world_misc.sql77
-rw-r--r--sql/updates/world/2014_05_12_01_world_creature_template.sql2
-rw-r--r--sql/updates/world/2014_05_13_00_world_conditions.sql2
-rw-r--r--sql/updates/world/2014_05_18_00_world_misc.sql17
-rw-r--r--sql/updates/world/2014_05_18_01_world_misc.sql37
-rw-r--r--sql/updates/world/2014_05_18_02_world_gameobject.sql4
-rw-r--r--sql/updates/world/2014_05_18_03_world_misc.sql48
-rw-r--r--sql/updates/world/2014_05_18_04_world_misc.sql28
-rw-r--r--sql/updates/world/2014_05_19_00_world_misc.sql10
-rw-r--r--sql/updates/world/2014_05_19_01_world_misc.sql8
-rw-r--r--src/server/authserver/Authentication/AuthCodes.cpp2
-rw-r--r--src/server/authserver/Authentication/AuthCodes.h2
-rw-r--r--src/server/game/AI/CoreAI/UnitAI.cpp1
-rw-r--r--src/server/game/AI/ScriptedAI/ScriptedCreature.cpp3
-rw-r--r--src/server/game/AI/SmartScripts/SmartAI.cpp5
-rw-r--r--src/server/game/Calendar/CalendarMgr.cpp23
-rw-r--r--src/server/game/Calendar/CalendarMgr.h3
-rw-r--r--src/server/game/DataStores/DBCStores.cpp2
-rw-r--r--src/server/game/DataStores/DBCStores.h1
-rw-r--r--src/server/game/DataStores/DBCStructure.h12
-rw-r--r--src/server/game/DataStores/DBCfmt.h1
-rw-r--r--src/server/game/Entities/Creature/Creature.cpp2
-rw-r--r--src/server/game/Entities/GameObject/GameObject.cpp8
-rw-r--r--src/server/game/Entities/Player/Player.cpp10
-rw-r--r--src/server/game/Entities/Player/Player.h4
-rw-r--r--src/server/game/Entities/Transport/Transport.cpp15
-rwxr-xr-xsrc/server/game/Entities/Vehicle/Vehicle.cpp39
-rw-r--r--src/server/game/Globals/ObjectMgr.cpp4
-rw-r--r--src/server/game/Globals/ObjectMgr.h2
-rw-r--r--src/server/game/Grids/GridStates.cpp12
-rw-r--r--src/server/game/Grids/GridStates.h7
-rw-r--r--src/server/game/Guilds/Guild.cpp8
-rw-r--r--src/server/game/Handlers/ArenaTeamHandler.cpp6
-rw-r--r--src/server/game/Handlers/CalendarHandler.cpp21
-rw-r--r--src/server/game/Handlers/TradeHandler.cpp5
-rw-r--r--src/server/game/Instances/InstanceScript.h4
-rw-r--r--src/server/game/Maps/Map.cpp44
-rw-r--r--src/server/game/Maps/MapUpdater.cpp30
-rw-r--r--src/server/game/Quests/QuestDef.cpp2
-rw-r--r--src/server/game/Spells/Auras/SpellAuras.cpp12
-rw-r--r--src/server/game/Spells/Spell.cpp17
-rw-r--r--src/server/game/Spells/SpellMgr.cpp12
-rw-r--r--src/server/game/Spells/SpellScript.h4
-rw-r--r--src/server/game/Tickets/TicketMgr.cpp2
-rw-r--r--src/server/game/Warden/Warden.cpp2
-rw-r--r--src/server/scripts/Commands/cs_modify.cpp7
-rw-r--r--src/server/scripts/EasternKingdoms/AlteracValley/boss_balinda.cpp2
-rw-r--r--src/server/scripts/EasternKingdoms/Karazhan/bosses_opera.cpp2
-rw-r--r--src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kalecgos.cpp13
-rw-r--r--src/server/scripts/EasternKingdoms/zone_duskwood.cpp56
-rw-r--r--src/server/scripts/Kalimdor/zone_durotar.cpp6
-rw-r--r--src/server/scripts/Kalimdor/zone_silithus.cpp2
-rw-r--r--src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_lord_jaraxxus.cpp2
-rw-r--r--src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_twin_valkyr.cpp3
-rw-r--r--src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/boss_falric.cpp162
-rw-r--r--src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/boss_marwyn.cpp164
-rw-r--r--src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/halls_of_reflection.cpp3333
-rw-r--r--src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/halls_of_reflection.h275
-rw-r--r--src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/instance_halls_of_reflection.cpp1168
-rw-r--r--src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.cpp2
-rw-r--r--src/server/scripts/Northrend/Nexus/EyeOfEternity/boss_malygos.cpp6
-rw-r--r--src/server/scripts/Northrend/Nexus/Oculus/boss_varos.cpp4
-rw-r--r--src/server/scripts/Northrend/Ulduar/HallsOfStone/boss_krystallus.cpp212
-rw-r--r--src/server/scripts/Northrend/Ulduar/Ulduar/boss_mimiron.cpp2
-rw-r--r--src/server/scripts/Spells/spell_generic.cpp55
-rw-r--r--src/server/scripts/Spells/spell_holiday.cpp2
-rw-r--r--src/server/scripts/Spells/spell_shaman.cpp2
-rw-r--r--src/server/scripts/World/boss_emerald_dragons.cpp2
-rw-r--r--src/server/shared/Database/DatabaseWorkerPool.h6
-rw-r--r--src/server/shared/Logging/Log.cpp15
-rw-r--r--src/server/shared/Logging/Log.h54
-rw-r--r--src/server/shared/Packets/ByteBuffer.h14
-rw-r--r--src/tools/mmaps_generator/TerrainBuilder.cpp2
86 files changed, 4233 insertions, 2655 deletions
diff --git a/contrib/conf_merge/confdiffmerge.php b/contrib/conf_merge/confdiffmerge.php
new file mode 100644
index 00000000000..7bcaef5042e
--- /dev/null
+++ b/contrib/conf_merge/confdiffmerge.php
@@ -0,0 +1,169 @@
+<!--
+ @title Configuration file merger/differ.
+ @about This script allows you to diff two config files and select which value to pick between the two.
+ It will then give you an updated configuration file with the settings you chose.
+ How-to: a) Paste both versions of your config file, submit the form.
+ b) Select values you want to keep in the next form, then submit said form.
+ c) Copy the output'd config file and profit!
+ Note: if either one of your config file has custom values, make sure that it is set to be the NEW
+ config file on the first step (right hand textarea). This will be adressed at a later date.
+ @author Warpten
+ @date 05/17/2014
+ @license GNU GPL v2(GPL)
+ @version 0.0.1
+-->
+<!DOCTYPE html>
+<html>
+<head>
+ <title>&lt;world/auth&gt;server.conf diff</title>
+ <style type="text/css">
+ form * { font-family: Verdana; font-size: 11px; }
+ form#step1 { position: relative; width: 800px; }
+ form#step2 { width: 500px; }
+ form > div { position: absolute; width: 50%; height: 500px; }
+ form > div:nth-child(1) { right: 0px; }
+ textarea { width: 90%; height: 500px; }
+ h3 { display: block; margin: 3px; padding: auto; text-align: center; }
+ input.valueName { border: 0px; background-color: white; }
+ form > p { margin: 0; padding: 3px; border-bottom: 1px solid black; }
+ textarea#result { width: 1000px; }
+ </style>
+</head>
+
+<body>
+<?php
+
+function printIndent($string, $indent = 1)
+{
+ echo str_pad("\r\n" . $string, $indent, " ");
+}
+
+if (!isset($_POST['step']))
+{
+?>
+ <form action="" method="POST" id="step1">
+ <div>
+ <h3>Paste the new configuration file</h3>
+ <textarea name="leftFile"></textarea>
+ </div><div>
+ <h3>Paste the old configuration file</h3>
+ <textarea name="rightFile"></textarea>
+ <input type="submit" value="Compare files" />
+ </div>
+ <input type="hidden" name="step" value="0" />
+ </form>
+<?php
+}
+else if ($_POST['step'] == 0)
+{
+ if (@empty($_POST['leftFile']) || @empty($_POST['rightFile']))
+ printf("You did not provide either the old or the new configuration file.<br />");
+
+ define('EOL', "\n\n");
+ $settingsData = array();
+
+ // Process them
+ $newFile = explode(EOL, $_POST['leftFile']);
+ $oldFile = explode(EOL, $_POST['rightFile']);
+
+ for ($i = 0, $o = count($oldFile); $i < $o; ++$i)
+ {
+ $oldFile[$i] = explode(PHP_EOL, $oldFile[$i]);
+ for ($j = 0, $p = count($oldFile[$i]); $j < $p; ++$j)
+ {
+ $currentLine = $oldFile[$i][$j];
+ if (preg_match("#^([A-Z.]+) = (?:\"?)(.*)(?:\"?)$#iU", $currentLine, $data) !== false)
+ if (strlen($data[1]) != 0)
+ $settingsData[$data[1]]["oldValue"] = str_replace('"', '', trim($data[2]));
+ }
+ }
+
+ for ($i = 0, $o = count($newFile); $i < $o; ++$i)
+ {
+ $newFile[$i] = explode(PHP_EOL, $newFile[$i]);
+ for ($j = 0, $p = count($newFile[$i]); $j < $p; ++$j)
+ {
+ $currentLine = $newFile[$i][$j];
+ if (preg_match("#^([A-Z.]+) = (?:\"?)(.*)(?:\"?)$#iU", $currentLine, $data) !== false)
+ if (strlen($data[1]) != 0)
+ $settingsData[$data[1]]["newValue"] = str_replace('"', '', trim($data[2]));
+ }
+ }
+
+ printIndent("<p>Please select values you want to keep. Note the script will default to new values, unless said <i>new</i> value does not exist.<br />You also can take advantage of this form and edit fields.</p>", 1);
+ printIndent('<form action="" method="POST" id="step2">', 1);
+
+ foreach ($settingsData as $itemName => &$values)
+ {
+ $displayOld = isset($values['oldValue']) ? $values['oldValue'] : "Value missing";
+ $displayNew = isset($values['newValue']) ? $values['newValue'] : "Value missing";
+
+ if ($displayOld == $displayNew)
+ continue;
+
+ $line = '<p><input type="text" class="valueName" name="nameCross[]" value="' . $itemName . '" />';
+ $line .= '<input type="radio" name="optionSelector[' . $itemName . ']" value="oldValue" ' . ($displayOld != "Value missing" ? "checked" : "") . '/>';
+ $line .= '<input type="text" name="oldValue[]" value="' . $displayOld . '" /> ';
+ $line .= '<input type="radio" name="optionSelector[' . $itemName . ']" value="newValue" ' . ($displayNew != "Value missing" ? "checked" : "") . '/>';
+ $line .= '<input type="text" name="newValue[]" value="' . $displayNew . '" /></p>';
+ printIndent($line, 2);
+ }
+ printIndent('<input type="hidden" name="step" value="1" />', 2);
+ printIndent('<input type="submit" value="Gief resulting configuration file" />', 2);
+ printIndent('<input type="hidden" name="file" value="' . htmlspecialchars($_POST['rightFile']) . '" />', 2);
+ printIndent('</form>', 1);
+}
+else if ($_POST['step'] == 1)
+{
+ $errors = array();
+
+ $confFile = $_POST['file'];
+
+ foreach ($_POST['optionSelector'] as $valueName => &$keyName)
+ {
+ $definiteValueIndex = -1;
+ foreach ($_POST['nameCross'] as $index => &$key)
+ {
+ if ($key == $valueName)
+ {
+ $definiteValueIndex = $index;
+ break;
+ }
+ }
+
+ if ($definiteValueIndex == -1)
+ {
+ // TODO: Handle custom values that get lost
+ continue;
+ }
+
+ $newStr = $_POST[$keyName][$definiteValueIndex];
+ $oldStr = $_POST[$keyName == "oldValue" ? "newValue" : "oldValue"][$definiteValueIndex];
+ if (!ctype_digit($newStr))
+ $newStr = '"' . $newStr . '"';
+ if (!ctype_digit($oldStr))
+ $oldStr = '"' . $oldStr . '"';
+
+ $newValueString = $valueName . " = " . $newStr;
+ $oldValueString = $valueName . " = " . $oldStr;
+ $confFile = str_replace($oldValueString, $newValueString, $confFile);
+ }
+ echo "<p>Here is your new configuration file:</p>";
+ echo '<form><textarea id="result">';
+ printf('%s', $confFile);
+ echo '</textarea></form>';
+
+ if (!empty($errors))
+ {
+ echo "<p>The following errors happened during processing:</p><ul><li>";
+ echo implode("</li><li>", $errors);
+ echo "</li>";
+ }
+}
+?>
+
+<script type="text/javascript">
+
+</script>
+</body>
+</html>
diff --git a/sql/updates/world/2014_05_07_00_world_creature_template.sql b/sql/updates/world/2014_05_07_00_world_creature_template.sql
new file mode 100644
index 00000000000..aa1a0511f18
--- /dev/null
+++ b/sql/updates/world/2014_05_07_00_world_creature_template.sql
@@ -0,0 +1,2 @@
+--
+UPDATE `creature_template` SET `unit_flags`=`unit_flags`|256, `flags_extra`=0 WHERE `entry`=30413;
diff --git a/sql/updates/world/2014_05_07_00_world_gossip_menu_option.sql b/sql/updates/world/2014_05_07_00_world_gossip_menu_option.sql
new file mode 100644
index 00000000000..2939237dc7d
--- /dev/null
+++ b/sql/updates/world/2014_05_07_00_world_gossip_menu_option.sql
@@ -0,0 +1 @@
+DELETE FROM `gossip_menu_option` WHERE `menu_id`=8903 AND `id`=1;
diff --git a/sql/updates/world/2014_05_08_00_world_smart_scripts.sql b/sql/updates/world/2014_05_08_00_world_smart_scripts.sql
new file mode 100644
index 00000000000..ebf971d512d
--- /dev/null
+++ b/sql/updates/world/2014_05_08_00_world_smart_scripts.sql
@@ -0,0 +1,2 @@
+--
+UPDATE `smart_scripts` SET `target_type`=1 WHERE `entryorguid`=28256 AND `source_type`=0;
diff --git a/sql/updates/world/2014_05_09_00_world_misc.sql b/sql/updates/world/2014_05_09_00_world_misc.sql
new file mode 100644
index 00000000000..8f4971f771f
--- /dev/null
+++ b/sql/updates/world/2014_05_09_00_world_misc.sql
@@ -0,0 +1,11 @@
+SET @OGUID := 6100;
+
+DELETE FROM `gameobject` WHERE `guid` BETWEEN @OGUID+0 AND @OGUID+1;
+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, 191849, 619, 3, 1, 523.5123, -301.1218, 68.84955, -1.570796, -0.004628658, 0.003181458, -0.7086, 0.705588, 7200, 255, 1), -- 191849 (Area: 4627)
+(@OGUID+1, 191848, 619, 3, 1, 523.4318, -300.7111, 68.82808, -1.575045, 0, 0, -0.7071066, 0.7071069, 7200, 255, 1); -- 191848 (Area: 4627)
+
+
+DELETE FROM `areatrigger_teleport` WHERE `id`=5235;
+INSERT INTO `areatrigger_teleport` (`id`, `name`, `target_map`, `target_position_x`, `target_position_y`, `target_position_z`, `target_orientation`) VALUES
+(5235, 'Ahn''Kahet (exit)', 571, 3817.4,2032.82, 11.0133, 3.612832);
diff --git a/sql/updates/world/2014_05_09_01_world_gossip.sql b/sql/updates/world/2014_05_09_01_world_gossip.sql
new file mode 100644
index 00000000000..7e2a1b040fc
--- /dev/null
+++ b/sql/updates/world/2014_05_09_01_world_gossip.sql
@@ -0,0 +1,15 @@
+DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=15 AND `SourceGroup` IN (10026,10025,10024);
+INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorType`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES
+(15, 10026, 0, 0, 0, 8, 0, 13419, 0, 0, 0, 0, 0, '', 'Sky-Reaver Klum - Show Gossip if player Has rewarded Quest Preparations for War'),
+(15, 10026, 1, 0, 0, 28, 0, 13419, 0, 0, 0, 0, 0, '', 'Sky-Reaver Klum - Show Gossip if player Has completed Quest Preparations for War'),
+(15, 10025, 0, 0, 0, 8, 0, 13418, 0, 0, 0, 0, 0, '', 'Officer Van Rossem - Show Gossip if player Has rewarded Quest Preparations for War'),
+(15, 10025, 1, 0, 0, 28, 0, 13418, 0, 0, 0, 0, 0, '', 'Officer Van Rossem - Show Gossip if player Has completed Quest Preparations for War'),
+(15, 10024, 0, 0, 0, 8, 0, 12521, 0, 0, 0, 0, 0, '', 'Archmage Pentarus - Show Gossip if player Has rewarded Quest Where in the World is Hemet Nesingwary?'),
+(15, 10024, 1, 0, 0, 28, 0, 12521, 0, 0, 0, 0, 0, '', 'Archmage Pentarus - Show Gossip if player Has completed Quest Where in the World is Hemet Nesingwary?');
+
+DELETE FROM `gossip_menu_option` WHERE `menu_id` IN (10025,10024) AND `id` IN (0,1);
+INSERT INTO `gossip_menu_option` (`menu_id`, `id`, `option_icon`, `option_text`, `OptionBroadcastTextID`, `option_id`, `npc_option_npcflag`, `action_menu_id`, `action_poi_id`, `box_coded`, `box_money`, `box_text`, `BoxBroadcastTextID`) VALUES
+(10025, 0, 0, 'Take me to the ship.', 31625, 1, 1, 0, 0, 0, 0, '', 0),
+(10025, 1, 0, 'Take me to the ship.', 31625, 1, 1, 0, 0, 0, 0, '', 0),
+(10024, 0, 0, 'I''m ready to fly to Sholazar Basin.', 31594, 1, 1, 0, 0, 0, 0, '', 0),
+(10024, 1, 0, 'I''m ready to fly to Sholazar Basin.', 31594, 1, 1, 0, 0, 0, 0, '', 0);
diff --git a/sql/updates/world/2014_05_09_02_world_creature_template.sql b/sql/updates/world/2014_05_09_02_world_creature_template.sql
new file mode 100644
index 00000000000..5520ca5d6f8
--- /dev/null
+++ b/sql/updates/world/2014_05_09_02_world_creature_template.sql
@@ -0,0 +1 @@
+UPDATE `creature_template` SET `faction`=14 WHERE `entry`=15625;
diff --git a/sql/updates/world/2014_05_10_00_world_player_factionchange_items.sql b/sql/updates/world/2014_05_10_00_world_player_factionchange_items.sql
new file mode 100644
index 00000000000..febb1032de3
--- /dev/null
+++ b/sql/updates/world/2014_05_10_00_world_player_factionchange_items.sql
@@ -0,0 +1,2 @@
+--
+DELETE FROM `player_factionchange_items` WHERE `alliance_id` BETWEEN 48357 AND 48370;
diff --git a/sql/updates/world/2014_05_10_01_world_halls_of_reflection.sql b/sql/updates/world/2014_05_10_01_world_halls_of_reflection.sql
new file mode 100644
index 00000000000..6d6c8feb956
--- /dev/null
+++ b/sql/updates/world/2014_05_10_01_world_halls_of_reflection.sql
@@ -0,0 +1,218 @@
+SET @CGUID := 142975; -- need 93
+DELETE FROM `creature` WHERE `guid` BETWEEN @CGUID+0 AND @CGUID+92;
+INSERT INTO `creature` (`guid`, `id`, `map`, `spawnMask`, `phaseMask`, `position_x`, `position_y`, `position_z`, `orientation`, `spawntimesecs`, `spawndist`, `MovementType`) VALUES
+-- The Skybreaker
+(@CGUID+0, 30351, 712, 3, 1, 40.85356, 44.65979, 25.11708, 2.617994, 7200, 0, 0),
+(@CGUID+1, 30867, 712, 3, 1, -32.58828, 22.11204, 21.78542, 1.762783, 7200, 0, 0),
+(@CGUID+2, 30867, 712, 3, 1, -11.11922, 23.02313, 21.71026, 1.727876, 7200, 0, 0),
+(@CGUID+3, 30867, 712, 3, 1, 36.80393, 45.60984, 25.11626, 1.43117, 7200, 0, 0),
+(@CGUID+4, 30351, 712, 3, 1, 1.432831, 22.45517, 21.75367, 3.193953, 7200, 0, 0),
+(@CGUID+5, 30394, 712, 3, 1, -57.66117, -6.004808, 23.56313, 4.956735, 7200, 0, 0),
+(@CGUID+6, 30351, 712, 3, 1, 1.032896, 9.635975, 20.53982, 3.211406, 7200, 0, 0),
+(@CGUID+7, 30351, 712, 3, 1, -36.27486, -6.711545, 20.53283, 1.53589, 7200, 0, 0),
+(@CGUID+8, 30351, 712, 3, 1, -36.26366, 6.612509, 20.5329, 4.642576, 7200, 0, 0),
+(@CGUID+9, 30352, 712, 3, 1, -16.93313, 2.497342, 20.87589, 3.106686, 7200, 0, 0),
+(@CGUID+10, 30352, 712, 3, 1, -49.00542, 0.003014, 20.75066, 0.01745329, 7200, 0, 0),
+(@CGUID+11, 30352, 712, 3, 1, 16.73826, 2.378118, 20.50117, 3.159046, 7200, 0, 0),
+(@CGUID+12, 30352, 712, 3, 1, 48.81408, 8.76864, 40.16452, 1.675516, 7200, 0, 0),
+(@CGUID+13, 30352, 712, 3, 1, -16.85414, -2.518523, 20.87587, 3.263766, 7200, 0, 0),
+(@CGUID+14, 30351, 712, 3, 1, 4.010166, -22.42914, 21.77942, 0.2617994, 7200, 0, 0),
+(@CGUID+15, 30351, 712, 3, 1, 0.778628, -9.484917, 20.5411, 3.036873, 7200, 0, 0),
+(@CGUID+16, 30867, 712, 3, 1, -9.599308, -23.15501, 21.71576, 4.782202, 7200, 0, 0),
+(@CGUID+17, 30352, 712, 3, 1, 48.82674, -8.803922, 40.16443, 4.712389, 7200, 0, 0),
+(@CGUID+18, 30867, 712, 3, 1, -32.99351, -22.17393, 21.7879, 4.502949, 7200, 0, 0),
+(@CGUID+19, 30867, 712, 3, 1, 37.14339, -45.94594, 25.11639, 4.014257, 7200, 0, 0),
+(@CGUID+20, 30344, 712, 3, 1, -2.700737, 12.2316, 20.52945, 1.727876, 7200, 0, 0),
+(@CGUID+21, 22515, 712, 3, 1, -27.09398, 38.85326, 1.366914, 1.256637, 7200, 0, 0),
+(@CGUID+22, 22515, 712, 3, 1, -6.396934, 39.80114, 1.470398, 1.256637, 7200, 0, 0),
+(@CGUID+23, 22515, 712, 3, 1, 4.017809, 38.32001, 1.533938, 1.256637, 7200, 0, 0),
+(@CGUID+24, 30392, 712, 3, 1, 28.1948, 7.542603, 23.37183, 5.8294, 7200, 0, 0),
+(@CGUID+25, 30833, 712, 3, 1, 6.518055, 0.003965, 20.66434, 0, 7200, 0, 0),
+(@CGUID+26, 30350, 712, 3, 1, 16.36582, -2.323581, 20.49201, 3.141593, 7200, 0, 0),
+(@CGUID+27, 30347, 712, 3, 1, 28.24817, -7.667989, 23.37183, 0.4363323, 7200, 0, 0),
+-- Orgrim Hammer
+(@CGUID+28, 30755, 713, 3, 1, -18.96152, 27.52218, 90.04992, 6.213372, 7200, 0, 0),
+(@CGUID+29, 30754, 713, 3, 1, -54.68485, 15.01545, 34.49284, 2.338741, 7200, 0, 0),
+(@CGUID+30, 30752, 713, 3, 1, -10.94232, 32.12282, 10.65215, 1.518436, 7200, 0, 0),
+(@CGUID+31, 30754, 713, 3, 1, -8.504885, -0.019059, 86.17371, 3.159046, 7200, 0, 0),
+(@CGUID+32, 30866, 713, 3, 1, -36.03656, 23.91632, 34.00398, 1.937315, 7200, 0, 0),
+(@CGUID+33, 30754, 713, 3, 1, 29.97084, 29.32993, 89.84912, 0.122173, 7200, 0, 0),
+(@CGUID+34, 30753, 713, 3, 1, 15.19238, -0.108369, 86.17371, 3.071779, 7200, 0, 0),
+(@CGUID+35, 30752, 713, 3, 1, 7.702429, 25.23042, 35.08076, 4.764749, 7200, 0, 0),
+(@CGUID+36, 30755, 713, 3, 1, 8.555423, 5.155768, 84.79706, 3.560472, 7200, 0, 0),
+(@CGUID+37, 30755, 713, 3, 1, -4.588624, 27.91955, 34.27925, 4.729842, 7200, 0, 0),
+(@CGUID+38, 30754, 713, 3, 1, -19.19535, -27.024, 90.05069, 3.124139, 7200, 0, 0),
+(@CGUID+39, 30754, 713, 3, 1, -54.63672, -15.29832, 34.48149, 3.717551, 7200, 0, 0),
+(@CGUID+40, 30753, 713, 3, 1, -26.19901, -10.37834, 35.63048, 1.64061, 7200, 0, 0),
+(@CGUID+41, 30755, 713, 3, 1, -56.79522, -3.870484, 13.31639, 0.1047198, 7200, 0, 0),
+(@CGUID+42, 30755, 713, 3, 1, -56.8364, 3.557915, 13.3138, 6.178465, 7200, 0, 0),
+(@CGUID+43, 30753, 713, 3, 1, -34.95441, 11.84717, 11.5961, 1.082104, 7200, 0, 0),
+(@CGUID+44, 30752, 713, 3, 1, 1.994709, 31.96335, 10.09305, 1.448623, 7200, 0, 0),
+(@CGUID+45, 30753, 713, 3, 1, -26.06219, 10.57757, 35.58858, 4.712389, 7200, 0, 0),
+(@CGUID+46, 30752, 713, 3, 1, 15.2307, 31.76827, 10.66515, 1.466077, 7200, 0, 0),
+(@CGUID+47, 30753, 713, 3, 1, 1.994774, 17.06817, 9.246212, 1.500983, 7200, 0, 0),
+(@CGUID+48, 30755, 713, 3, 1, -4.484874, 18.00111, 8.70937, 4.729842, 7200, 0, 0),
+(@CGUID+49, 30755, 713, 3, 1, 8.521951, 17.92888, 8.777781, 4.625123, 7200, 0, 0),
+(@CGUID+50, 30755, 713, 3, 1, -26.0374, 6.533113, 9.42994, 3.124139, 7200, 0, 0),
+(@CGUID+51, 30755, 713, 3, 1, -19.30323, 6.17474, 6.879124, 0, 7200, 0, 0),
+(@CGUID+52, 30755, 713, 3, 1, 8.786416, -5.037911, 84.79706, 2.740167, 7200, 0, 0),
+(@CGUID+53, 30755, 713, 3, 1, 8.557505, 5.72448, 34.52152, 3.106686, 7200, 0, 0),
+(@CGUID+54, 30755, 713, 3, 1, 8.450569, -5.609207, 34.52058, 2.792527, 7200, 0, 0),
+(@CGUID+55, 30866, 713, 3, 1, -36.32559, -23.21568, 34.04234, 4.39823, 7200, 0, 0),
+(@CGUID+56, 30753, 713, 3, 1, -35.48437, -11.9256, 11.71411, 5.986479, 7200, 0, 0),
+(@CGUID+57, 30752, 713, 3, 1, 8.472344, -22.36673, 34.99833, 1.780236, 7200, 0, 0),
+(@CGUID+58, 30755, 713, 3, 1, -4.738312, -28.17381, 34.26831, 1.466077, 7200, 0, 0),
+(@CGUID+59, 30755, 713, 3, 1, 31.3718, -29.84369, 89.84172, 2.96706, 7200, 0, 0),
+(@CGUID+60, 30755, 713, 3, 1, 37.59615, -9.010085, 30.1788, 0.05235988, 7200, 0, 0),
+(@CGUID+61, 30755, 713, 3, 1, 37.52684, 8.718971, 30.17881, 5.969026, 7200, 0, 0),
+(@CGUID+62, 30755, 713, 3, 1, -25.42656, -6.577197, 9.33257, 2.932153, 7200, 0, 0),
+(@CGUID+63, 30755, 713, 3, 1, 23.24178, 6.302864, 7.032903, 3.176499, 7200, 0, 0),
+(@CGUID+64, 30755, 713, 3, 1, -19.45751, -6.235432, 6.89157, 6.265732, 7200, 0, 0),
+(@CGUID+65, 30752, 713, 3, 1, -11.36508, -29.14235, 10.01249, 4.642576, 7200, 0, 0),
+(@CGUID+66, 30753, 713, 3, 1, 46.41658, 7.696208, 10.48851, 4.101524, 7200, 0, 0),
+(@CGUID+67, 30752, 713, 3, 1, 15.44485, -29.7788, 9.977043, 4.694936, 7200, 0, 0),
+(@CGUID+68, 30754, 713, 3, 1, 38.01897, -12.83605, 30.17452, 0.6108652, 7200, 0, 0),
+(@CGUID+69, 30866, 713, 3, 1, 17.22244, -26.63993, 35.64188, 4.817109, 7200, 0, 0),
+(@CGUID+70, 30752, 713, 3, 1, 2.069969, -29.66959, 9.395721, 4.677482, 7200, 0, 0),
+(@CGUID+71, 30753, 713, 3, 1, 2.036507, -17.18819, 9.245911, 4.764749, 7200, 0, 0),
+(@CGUID+72, 30753, 713, 3, 1, 46.33955, -7.35728, 10.47599, 2.391101, 7200, 0, 0),
+(@CGUID+73, 30755, 713, 3, 1, 8.592517, -17.94128, 8.77952, 1.553343, 7200, 0, 0),
+(@CGUID+74, 30755, 713, 3, 1, -4.406364, -17.97099, 8.709299, 1.48353, 7200, 0, 0),
+(@CGUID+75, 30755, 713, 3, 1, 22.90693, -6.745431, 7.115322, 3.124139, 7200, 0, 0),
+(@CGUID+76, 30824, 713, 3, 1, 17.28272, 21.73325, 35.37741, 1.623156, 7200, 0, 0),
+(@CGUID+77, 30827, 713, 3, 1, 45.76886, -8.964413, 30.17881, 1.396263, 7200, 0, 0),
+(@CGUID+78, 30825, 713, 3, 1, 38.55754, -0.025193, 10.27214, 3.106686, 7200, 0, 0),
+(@CGUID+79, 30826, 713, 3, 1, 55.08521, -3.344726, 30.1788, 2.687807, 7200, 0, 0),
+(@CGUID+80, 37593, 713, 3, 1, 2.015905, 34.44526, 10.09305, 1.64061, 7200, 0, 0),
+(@CGUID+81, 37593, 713, 3, 1, 14.85607, 33.80163, 9.849781, 1.64061, 7200, 0, 0),
+(@CGUID+82, 37593, 713, 3, 1, -10.84229, 34.34502, 10.6434, 1.64061, 7200, 0, 0),
+-- Others
+(@CGUID+83, 22515, 668, 3, 1, 5274.933, 1693.941, 797.2499, 0, 7200, 0, 0),
+(@CGUID+84, 36736, 668, 3, 1, 5415.332, 2080.358, 720.5068, 1.64061, 7200, 0, 0),
+(@CGUID+85, 36736, 668, 3, 1, 5376.905, 2115.425, 720.3566, 6.126106, 7200, 0, 0),
+(@CGUID+86, 36736, 668, 3, 1, 5445.525, 2099.37, 720.3999, 2.600541, 7200, 0, 0),
+(@CGUID+87, 36736, 668, 3, 1, 5431.74, 2087.503, 720.3914, 2.076942, 7200, 0, 0),
+(@CGUID+88, 36736, 668, 3, 1, 5395.38, 2146.632, 720.2123, 5.305801, 7200, 0, 0),
+(@CGUID+89, 36736, 668, 3, 1, 5380.971, 2134.462, 720.6889, 5.637414, 7200, 0, 0),
+(@CGUID+90, 36736, 668, 3, 1, 5449.623, 2117.587, 720.4929, 3.176499, 7200, 0, 0),
+(@CGUID+91, 36736, 668, 3, 1, 5412.493, 2150.627, 720.3359, 4.502949, 7200, 0, 0),
+(@CGUID+92, 37071, 668, 3, 1, 5408.362, 2110.33, 726.9917, 3.630285, 7200, 0, 0);
+
+DELETE FROM `creature_template_addon` WHERE `entry`=36736;
+INSERT INTO `creature_template_addon` (`entry`, `mount`, `bytes1`, `bytes2`, `auras`) VALUES
+(36736, 0, 0x0, 0x1, '69174'); -- Invisible Stalker (Icecrown Dungeon Trap) - Reflection Window Beam Visual
+
+DELETE FROM `creature_text` WHERE `entry` IN (30344, 30824, 36954);
+INSERT INTO `creature_text` (`entry`, `groupid`, `id`, `text`, `type`, `language`, `probability`, `emote`, `duration`, `sound`, `comment`, `BroadcastTextID`) VALUES
+-- High Captain Justin Bartlett
+(30344, 0, 0, 'FIRE! FIRE!', 14, 0, 100, 0, 0, 16721, 'High Captain Justin Bartlett - Fire', 36993),
+(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, 'High Captain Justin Bartlett - Final', 37213),
+-- Sky-Reaver Korm Blackscar
+(30824, 0, 0, 'FIRE! FIRE!', 14, 0, 100, 0, 0, 16732, 'Sky-Reaver Korm Blackscar - Fire', 38681),
+(30824, 1, 0, 'Get on board, now! This whole mountainside could collapse at any moment.', 14, 0, 100, 0, 0, 16733, 'Sky-Reaver Korm Blackscar - Final', 37212),
+-- Lich King
+(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', 37172),
+(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', 37173),
+(36954, 2, 0, 'There is no escape!', 14, 0, 100, 0, 0, 17217, 'Lich King SAY_LICH_KING_WALL_01', 37177),
+(36954, 3, 0, 'Succumb to the chill of the grave.', 14, 0, 100, 0, 0, 17218, 'Lich King SAY_LICH_KING_WALL_02', 37175),
+(36954, 4, 0, 'Another dead end.', 14, 0, 100, 0, 0, 17219, 'Lich King SAY_LICH_KING_WALL_03', 37176),
+(36954, 5, 0, 'How long can you fight it?', 14, 0, 100, 0, 0, 17220, 'Lich King SAY_LICH_KING_WALL_04', 38668),
+(36954, 6, 0, 'Arise minions. Do not let them pass.', 14, 0, 100, 0, 0, 17216, 'Lich King SAY_LICH_KING_GHOUL', 38669),
+(36954, 7, 0, 'Minions, sieze them. Bring their corpses back to me.', 14, 0, 100, 0, 0, 17222, 'Lich King SAY_LICH_KING_ABON', 38670),
+(36954, 8, 0, 'Death''s cold embrace awaits.', 14, 0, 100, 0, 0, 17221, 'Lich King SAY_LICH_KING_WINTER', 37174),
+(36954, 9, 0, 'Nowhere to run! You''re mine now...', 14, 0, 100, 0, 0, 17223, 'Lich King SAY_LICH_KING_END_DUN', 36994);
+
+DELETE FROM `areatrigger_scripts` WHERE `entry` IN (5605,5740);
+INSERT INTO `areatrigger_scripts` (`entry`,`scriptname`) VALUES
+(5605, 'at_hor_shadow_throne'),
+(5740, 'at_hor_impenetrable_door');
+
+DELETE FROM `areatrigger_teleport` WHERE `id`=5740;
+INSERT INTO `areatrigger_teleport` (`id`, `name`, `target_map`, `target_position_x`, `target_position_y`, `target_position_z`, `target_orientation`) VALUES
+(5740, 'Halls of Reflection (The Impenetrable Door)', 668, 5354.01, 2053.53, 707.695, 0.7853982);
+
+DELETE FROM `lfg_entrances` WHERE `dungeonId` IN(255,256);
+INSERT INTO `lfg_entrances` (`dungeonId`, `name`, `position_x`, `position_y`, `position_z`, `orientation`) VALUES
+(255, 'Halls of Reflection (Normal)', 5239.01, 1932.64, 707.695, 0.800565),
+(256, 'Halls of Reflection (Heroic)', 5239.01, 1932.64, 707.695, 0.800565);
+
+-- Lady Jaina Proudmoore
+UPDATE `creature_template` SET `ScriptName`='npc_jaina_or_sylvanas_intro_hor' WHERE `entry`=37221;
+-- Lady Sylvanas Windrunner
+UPDATE `creature_template` SET `ScriptName`='npc_jaina_or_sylvanas_intro_hor' WHERE `entry`=37223;
+-- Frostsworn General
+UPDATE `creature_template` SET `ScriptName`='npc_frostsworn_general' WHERE `entry`=36723;
+-- The Lich King
+UPDATE `creature_template` SET `ScriptName`='npc_the_lich_king_escape_hor', `mechanic_immune_mask`=617299839 WHERE `entry` = 36954;
+-- Icecrown Dungeon Horde Gunship Cannon
+UPDATE `creature_template` SET `InhabitType`=4 WHERE `entry`=37593;
+
+UPDATE `gameobject_template` SET `faction`=2102,`flags`=32 WHERE `entry`=201385;
+UPDATE `gameobject_template` SET `faction`=1375,`flags`=32 WHERE `entry` IN (201596,201709,202211);
+UPDATE `gameobject_template` SET `flags`=40 WHERE `entry` IN (201598,201599);
+UPDATE `gameobject_template` SET `faction`=35,`flags`=16 WHERE `entry` IN (201710,202212,202336,202337);
+
+ -- Lady Jaina Proudmoore
+UPDATE `creature_template` SET `spell1`=0, `gossip_menu_id`=10860 WHERE `entry`=36955;
+ -- Lady Sylvanas Windrunner
+UPDATE `creature_template` SET `gossip_menu_id`=10909 WHERE `entry`=37554;
+
+DELETE FROM `gossip_menu` WHERE `entry`=10931;
+INSERT INTO `gossip_menu` (`entry`, `text_id`) VALUES
+(10931, 15190); -- 37554 -- outro gossip
+
+UPDATE `gossip_menu_option` SET `option_id`=1, `npc_option_npcflag`=1 WHERE `menu_id`=10860 AND `id`=0;
+
+-- skip intro
+DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=15 AND `SourceGroup` IN (11031,10950);
+INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`SourceId`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionTarget`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`NegativeCondition`,`ErrorType`,`ErrorTextId`,`ScriptName`,`Comment`) VALUES
+(15,11031,1,0,0,14,0,24500,0,0,1,0,0,'','Show options only if quest 24500 taken/complete/rewarded'),
+(15,10950,1,0,0,14,0,24802,0,0,1,0,0,'','Show options only if quest 24802 taken/complete/rewarded');
+
+DELETE FROM `spell_script_names` WHERE `spell_id` IN (72900,70190,70017,72368,72369);
+INSERT INTO `spell_script_names` (`spell_id` ,`ScriptName`) VALUES
+(72900, 'spell_hor_start_halls_of_reflection_quest_ae'),
+(70190, 'spell_hor_evasion'),
+(70017, 'spell_hor_gunship_cannon_fire'),
+(72368, 'spell_marwyn_shared_suffering'),
+(72369, 'spell_marwyn_shared_suffering');
+
+DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=13 AND `SourceEntry` IN (69857,70199,70021,70246);
+INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorType`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES
+(13,1,69857,0,0,31,0,3,36954,0,0,0,0,'','Taunt Arthas targets The Lich King'),
+(13,2,70199,0,0,31,0,3,36954,0,0,0,0,'','Blinding Retreat targets The Lich King'),
+(13,1,70021,0,0,31,0,3,22515,0,0,0,0,'','Gunship Cannon Fire targets World Trigger'),
+(13,1,70021,0,0,1,0,70017,0,0,1,0,0,'','Gunship Cannon Fire target not has aura Gunship Cannon Fire'),
+(13,1,70246,0,0,31,0,3,22515,0,0,0,0,'','Gunship Cannon Fire targets World Trigger'),
+(13,1,70246,0,0,1,0,70017,0,0,1,0,0,'','Gunship Cannon Fire target not has aura Gunship Cannon Fire');
+
+-- Cloak of Darkness proc on dodge
+DELETE FROM `spell_proc_event` WHERE `entry`=70188;
+INSERT INTO `spell_proc_event` (`entry`,`procEx`) VALUES
+(70188,0x10);
+
+SET @OGUID := 21620; -- need 12
+DELETE FROM `gameobject` WHERE `guid` BETWEEN @OGUID+0 AND @OGUID+11;
+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, 201709, 668, 3, 1, 5228.354, 1640.958, 783.7306, 5.585054, 0, 0, 0, 1, -7200, 255, 1),
+(@OGUID+1, 201709, 668, 3, 1, 5215.889, 1626.078, 796.4562, 5.585054, 0, 0, 0, 1, -7200, 255, 1),
+(@OGUID+2, 202211, 668, 3, 1, 5242.835, 1623.45, 784.1498, 5.811947, 0, 0, 0, 1, -7200, 255, 1),
+(@OGUID+3, 202211, 668, 3, 1, 5225.201, 1589.099, 808.5507, 5.811947, 0, 0, 0, 1, -7200, 255, 1),
+(@OGUID+4, 202211, 668, 3, 1, 5233.985, 1606.311, 796.2543, 5.811947, 0, 0, 0, 1, -7200, 255, 1),
+(@OGUID+5, 195682, 712, 3, 1, 4.395291, 13.68329, 20.80389, 4.19445, 0, 0, 0, 1, 7200, 255, 1),
+(@OGUID+6, 201710, 712, 1, 1, -11.7548, 12.02463, 20.40827, 3.217069, 0, 0, 0, 1, 7200, 255, 1),
+(@OGUID+7, 202336, 712, 2, 1, -11.7548, 12.02463, 20.40827, 3.217069, 0, 0, 0, 1, 7200, 255, 1),
+(@OGUID+8, 202212, 713, 1, 1, 12.23327, 22.47315, 35.07432, 1.239183, 0, 0, 0, 1, 7200, 255, 1),
+(@OGUID+9, 202337, 713, 2, 1, 12.23327, 22.47315, 35.07432, 1.239183, 0, 0, 0, 1, 7200, 255, 1),
+(@OGUID+10, 195682, 713, 3, 1, 22.17697, 22.95274, 35.65761, 1.919862, 0, 0, 0, 1, 7200, 255, 1),
+(@OGUID+11, 191640, 713, 3, 1, 42.08455, 14.60723, 10.65548, 4.244588, 0, 0, 0, 1, 7200, 255, 1);
+
+DELETE FROM `spelldifficulty_dbc` WHERE `id` IN(72395,72396,72397);
+INSERT INTO `spelldifficulty_dbc` (`id`,`spellid0`,`spellid1`) VALUES
+(72395,72395,72390), -- Hopelessness
+(72396,72396,72391), -- Hopelessness
+(72397,72397,72393); -- Hopelessness
+
+DELETE FROM `spell_custom_attr` WHERE `entry` = 74117;
+INSERT INTO `spell_custom_attr` (`entry`,`attributes`) VALUES
+(74117, 2);
diff --git a/sql/updates/world/2014_05_11_00_world_gameobject.sql b/sql/updates/world/2014_05_11_00_world_gameobject.sql
new file mode 100644
index 00000000000..a25755671a5
--- /dev/null
+++ b/sql/updates/world/2014_05_11_00_world_gameobject.sql
@@ -0,0 +1,289 @@
+ALTER TABLE `gameobject` ADD `VerifiedBuild` SMALLINT(5) DEFAULT '0';
+
+SET @OGUID := 76921;
+
+DELETE FROM `gameobject` WHERE `guid` BETWEEN @OGUID+0 AND @OGUID+282;
+INSERT INTO `gameobject` (`guid`, `id`, `map`, `spawnMask`, `phaseMask`, `position_x`, `position_y`, `position_z`, `orientation`, `rotation0`, `rotation1`, `rotation2`, `rotation3`, `spawntimesecs`, `animprogress`, `state`, `VerifiedBuild`) VALUES
+(@OGUID+0, 186519, 571, 1, 1, 2017.644, -4887.931, 214.6985, 5.244714, 0, 0, 0, 1, 120, 255, 1, 15595), -- Fort Wildervar
+(@OGUID+1, 186520, 571, 1, 1, 2014.79, -4890.302, 214.6067, 2.434729, 0, 0, 0, 1, 120, 255, 1, 15595), -- Vengeance Landing
+(@OGUID+2, 186526, 571, 1, 1, 2017.778, -4887.679, 211.9238, 5.218536, 0, 0, 0, 1, 120, 255, 1, 15595), -- Camp Winterhoof
+(@OGUID+3, 186666, 571, 1, 1, 2978.301, -4561.268, 265.7909, 1.090829, 0, 0, 0, 1, 120, 255, 1, 17658), -- Frozen Waterfall
+(@OGUID+4, 186798, 571, 1, 1, 2597.174, -3735.528, 244.6674, 3.769912, 0, 0, 0, 1, 120, 255, 1, 17658), -- Gjalerbron Cage
+(@OGUID+5, 187106, 571, 1, 1, 1916.92, 5820.15, 8.111198, 2.303831, 0, 0, 0, 1, 120, 255, 1, 15595), -- Brazier
+(@OGUID+6, 187251, 571, 1, 1, 2853.868, 5838.515, 100.9134, 4.699066, 0, 0, 0, 1, 120, 255, 1, 17658), -- Campfire
+(@OGUID+7, 187453, 571, 1, 1, 3489.599, 6303.194, -125.5745, 6.26304, 0, 0, 0, 1, 120, 255, 1, 17658), -- Bubbly Fissure
+(@OGUID+8, 187454, 571, 1, 1, 3830.716, 5984.776, -126.78, 0.7966011, 0, 0, 0, 1, 120, 255, 1, 17658), -- Bubbly Fissure
+(@OGUID+9, 187455, 571, 1, 1, 4007.937, 6009.374, -125.0908, 0.1617281, 0, 0, 0, 1, 120, 255, 1, 17658), -- Bubbly Fissure
+(@OGUID+10, 188265, 571, 1, 1, 3095.937, -2048.806, 89.02545, 0.5235979, 0, 0, 0, 1, 120, 255, 1, 15595), -- Venture Bay
+(@OGUID+11, 188266, 571, 1, 1, 3183.273, -1991.391, 90.70473, 2.024579, 0, 0, 0, 1, 120, 255, 1, 15595), -- Conquest Hold
+(@OGUID+12, 188267, 571, 1, 1, 3183.291, -1991.38, 89.82629, 2.024579, 0, 0, 0, 1, 120, 255, 1, 15595), -- Amberpine Lodge
+(@OGUID+13, 188268, 571, 1, 1, 3185.445, -1990.872, 90.65273, 4.721116, 0, 0, 0, 1, 120, 255, 1, 15595), -- Zul''Drak
+(@OGUID+14, 188269, 571, 1, 1, 3184.378, -1989.682, 90.62007, 6.178466, 0, 0, 0, 1, 120, 255, 1, 15595), -- Dragonblight
+(@OGUID+15, 188270, 571, 1, 1, 3096.181, -2050.726, 89.68048, 2.95833, 0, 0, 0, 1, 120, 255, 1, 15595), -- Amberpine Lodge
+(@OGUID+16, 188271, 571, 1, 1, 3096.269, -2050.634, 88.82845, 2.975771, 0, 0, 0, 1, 120, 255, 1, 15595), -- Conquest Hold
+(@OGUID+17, 188330, 571, 1, 1, 3785.572, -4975.321, 119.4001, 2.74889, 0, 0, 0, 1, 120, 255, 1, 15595), -- Dun Argol
+(@OGUID+18, 188331, 571, 1, 1, 3785.993, -4975.519, 119.3407, 5.916667, 0, 0, 0, 1, 120, 255, 1, 15595), -- Thor Modan
+(@OGUID+19, 188332, 571, 1, 1, 3785.9, -4975.272, 119.3984, 1.160642, 0, 0, 0, 1, 120, 255, 1, 15595), -- Grizzlemaw
+(@OGUID+20, 188336, 571, 1, 1, 4359.022, -4089.576, 188.5192, 4.869471, 0, 0, 0, 1, 120, 255, 1, 15595), -- Dragonblight
+(@OGUID+21, 188387, 571, 1, 1, 4460.03, -1060.602, 169.3596, 4.878196, 0, 0, 0, 1, 120, 255, 1, 15595), -- Grizzly Hills
+(@OGUID+22, 188388, 571, 1, 1, 4459.658, -1058.771, 169.4787, 1.850049, 0, 0, 0, 1, 120, 255, 1, 15595), -- Wyrmrest Temple
+(@OGUID+23, 188389, 571, 1, 1, 4460.785, -1059.484, 169.2406, 0.1483503, 0, 0, 0, 1, 120, 255, 1, 15595), -- Light''s Trust
+(@OGUID+24, 188405, 571, 1, 1, 4458.938, -1059.854, 169.1528, 3.150327, 0, 0, 0, 1, 120, 255, 1, 15595), -- Wintergarde Keep
+(@OGUID+25, 188406, 571, 1, 1, 4460.755, -1059.488, 168.8691, 0.08726409, 0, 0, 0, 1, 120, 255, 1, 15595), -- Zul''Drak
+(@OGUID+26, 188542, 571, 1, 1, 4319.167, 580.9983, -6.637729, 2.853604, 0, 0, 0, 1, 120, 255, 1, 15595), -- Scourge Bonfire
+(@OGUID+27, 188545, 571, 1, 1, 4295.252, 376.5208, -6.531718, 2.897245, 0, 0, 0, 1, 120, 255, 1, 15595), -- Scourge Bonfire
+(@OGUID+28, 188547, 571, 1, 1, 4222.608, 514.5868, 11.47814, 2.495818, 0, 0, 0, 1, 120, 255, 1, 15595), -- Scourge Bonfire
+(@OGUID+29, 188551, 571, 1, 1, 4924.042, 1250.615, 226.7416, 5.646141, 0, 0, 0, 1, 120, 255, 1, 15595), -- Bonfire
+(@OGUID+30, 188565, 571, 1, 1, 4872.197, -1268.828, 168.1219, 4.047813, 0, 0, 0, 1, 120, 255, 1, 15595), --
+(@OGUID+31, 188566, 571, 1, 1, 4869.077, -1266.7, 168.1245, 4.053197, 0, 0, 0, 1, 120, 255, 1, 15595), --
+(@OGUID+32, 188567, 571, 1, 1, 4887.115, -1319.99, 169.8827, 2.763404, 0, 0, 0, 1, 120, 255, 1, 15595), --
+(@OGUID+33, 188568, 571, 1, 1, 4843.478, -1238.389, 168.1355, 3.189116, 0, 0, 0, 1, 120, 255, 1, 15595), --
+(@OGUID+34, 188569, 571, 1, 1, 4843.253, -1234.773, 168.0832, 3.001129, 0, 0, 0, 1, 120, 255, 1, 15595), --
+(@OGUID+35, 188570, 571, 1, 1, 4834.089, -1278.816, 168.0286, 1.95314, 0, 0, 0, 1, 120, 255, 1, 15595), --
+(@OGUID+36, 188571, 571, 1, 1, 4839.024, -1277.866, 168.0992, 1.88234, 0, 0, 0, 1, 120, 255, 1, 15595), --
+(@OGUID+37, 188576, 571, 1, 1, 4830.733, -1281.578, 168.0519, 3.001428, 0, 0, 0, 1, 120, 255, 1, 15595), --
+(@OGUID+38, 188577, 571, 1, 1, 4813.866, -1379.148, 168.2439, 1.575411, 0, 0, 0, 1, 120, 255, 1, 15595), --
+(@OGUID+39, 188578, 571, 1, 1, 4759.164, -1324.038, 168.0459, 0.9814962, 0, 0, 0, 1, 120, 255, 1, 15595), --
+(@OGUID+40, 188579, 571, 1, 1, 4756.252, -1322.118, 167.9957, 0.9735442, 0, 0, 0, 1, 120, 255, 1, 15595), --
+(@OGUID+41, 188580, 571, 1, 1, 4594.677, -1384.538, 157.1768, 3.218987, 0, 0, 0, 1, 120, 255, 1, 15595), --
+(@OGUID+42, 189294, 571, 1, 1, 3471.479, 940.9305, 153.8268, 1.727875, 0, 0, 0, 1, 120, 255, 1, 15595), -- Campfire
+(@OGUID+43, 189324, 571, 1, 1, 1946.168, -5494.583, 206.8149, 4.319691, 0, 0, 0, 1, 120, 255, 1, 15595), -- Bonfire
+(@OGUID+44, 189961, 571, 1, 1, 2734.848, -3931.597, 374.5498, 3.001947, 0, 0, 0, 1, 120, 255, 1, 17658), -- Campfire
+(@OGUID+45, 189962, 571, 1, 1, 2710.609, -3917.27, 375.0239, 3.141593, 0, 0, 0, 1, 120, 255, 1, 17658), -- Campfire
+(@OGUID+46, 189963, 571, 1, 1, 2687.596, -3977.962, 375.6875, 2.91469, 0, 0, 0, 1, 120, 255, 1, 17658), -- Campfire
+(@OGUID+47, 189964, 571, 1, 1, 2674.4, -4011.544, 374.0872, 3.141593, 0, 0, 0, 1, 120, 255, 1, 15595), -- Campfire
+(@OGUID+48, 189965, 571, 1, 1, 2640.501, -4069.877, 352.7829, 3.316144, 0, 0, 0, 1, 120, 255, 1, 15595), -- Campfire
+(@OGUID+49, 189966, 571, 1, 1, 2652.039, -4094.349, 352.7137, 2.696529, 0, 0, 0, 1, 120, 255, 1, 15595), -- Campfire
+(@OGUID+50, 190017, 571, 1, 1, 3886.404, -3854.78, 178.6396, 3.298687, 0, 0, 0, 1, 120, 255, 1, 15595), -- Bonfire
+(@OGUID+51, 190018, 571, 1, 1, 3879.928, -3898.141, 177.3041, 3.298687, 0, 0, 0, 1, 120, 255, 1, 15595), -- Bonfire
+(@OGUID+52, 190129, 571, 1, 1, 4093.27, -814.5311, 312.8538, 3.141593, 0, 0, 0, 1, 120, 255, 1, 17658), -- Campfire
+(@OGUID+53, 190132, 571, 1, 1, 4067.972, -1217.099, 129.8714, 2.33874, 0, 0, 0, 1, 120, 255, 1, 17658), -- Bonfire
+(@OGUID+54, 190134, 571, 1, 1, 4039.465, -1295.785, 130.3643, 3.194002, 0, 0, 0, 1, 120, 255, 1, 17658), -- Bonfire
+(@OGUID+55, 190136, 571, 1, 1, 2901.714, -4730.744, 322.4269, 0.06981169, 0, 0, 0, 1, 120, 255, 1, 15595), -- Campfire
+(@OGUID+56, 190137, 571, 1, 1, 2916.552, -4763.382, 324.672, 1.48353, 0, 0, 0, 1, 120, 255, 1, 15595), -- Campfire
+(@OGUID+57, 190138, 571, 1, 1, 2929.887, -4738.271, 322.2895, 0.2967051, 0, 0, 0, 1, 120, 255, 1, 15595), -- Campfire
+(@OGUID+58, 190275, 571, 1, 1, 3285.183, 1226.998, 137.6425, 2.050762, 0, 0, 0, 1, 120, 255, 1, 15595), -- Bonfire
+(@OGUID+59, 190281, 571, 1, 1, 3167.204, 977.7576, 113.9504, 1.84132, 0, 0, 0, 1, 120, 255, 1, 17658), -- Bonfire
+(@OGUID+60, 190662, 571, 1, 1, 2013.997, -4888.311, 211.8739, 1.413715, 0, 0, 0, 1, 120, 255, 1, 15595), -- Westguard Keep
+(@OGUID+61, 191201, 571, 1, 1, 4352.986, -4139.897, 183.2539, 0.9250238, 0, 0, 0, 1, 120, 255, 1, 15595), -- Bonfire
+(@OGUID+62, 191223, 571, 1, 1, 3395.608, 3933.193, 28.70841, 0.3316107, 0, 0, 0, 1, 120, 255, 1, 15595), -- Taunka''le Village
+(@OGUID+63, 191224, 571, 1, 1, 3396.677, 3930.758, 28.65611, 3.47321, 0, 0, 0, 1, 120, 255, 1, 15595), -- Dragonblight
+(@OGUID+64, 191241, 571, 1, 1, 3200.345, -1976.016, 85.20889, 3.036875, 0, 0, 0, 1, 120, 255, 1, 15595), -- Bonfire
+(@OGUID+65, 191242, 571, 1, 1, 3201.704, -1965.061, 85.96173, 1.431168, 0, 0, 0, 1, 120, 255, 1, 15595), -- Chair
+(@OGUID+66, 191243, 571, 1, 1, 3210.138, -1984.84, 85.72446, 5.471607, 0, 0, 0, 1, 120, 255, 1, 15595), -- Chair
+(@OGUID+67, 191245, 571, 1, 1, 3192.13, -1984.083, 85.71163, 3.857178, 0, 0, 0, 1, 120, 255, 1, 15595), -- Chair
+(@OGUID+68, 191256, 571, 1, 1, 3501.222, -4490.944, 225.8872, 2.897245, 0, 0, 0, 1, 120, 255, 1, 17658), -- Bonfire
+(@OGUID+69, 191257, 571, 1, 1, 3510.455, -4590.846, 221.0397, 2.565629, 0, 0, 0, 1, 120, 255, 1, 17658), -- Bonfire
+(@OGUID+70, 191333, 571, 1, 1, 3072.524, -512.8351, 124.2693, 0.8203033, 0, 0, 0, 1, 120, 255, 1, 15595), -- Bonfire
+(@OGUID+71, 191791, 571, 1, 1, 5798.875, -1597.493, 234.2027, 2.10312, 0, 0, 0, 1, 120, 255, 0, 15595), --
+(@OGUID+72, 192256, 571, 1, 1, 9025.685, -1178.616, 1058.108, 3.141593, 0, 0, 0, 1, 120, 255, 1, 17658), -- Gravestone
+(@OGUID+73, 192555, 571, 1, 1, 6137.667, -322.4479, 436.2447, 0.1414226, 0, 0, 0, 1, 120, 255, 1, 17658), -- Bonfire
+(@OGUID+74, 192722, 571, 1, 4, 7355.991, -2967.411, 906.3082, 1.727875, 0, 0, 0, 1, 120, 255, 1, 17658), -- Throne
+(@OGUID+75, 192723, 571, 1, 4, 7352.724, -2973.597, 938.7529, 2.033306, 0, 0, 0, 1, 120, 255, 1, 17658), -- Throne
+(@OGUID+76, 192724, 571, 1, 4, 7354.643, -2973.122, 921.2005, 5.009097, 0, 0, 0, 1, 120, 255, 1, 17658), -- Throne
+(@OGUID+77, 192725, 571, 1, 4, 7348.135, -2967.436, 911.3059, 0.7417646, 0, 0, 0, 1, 120, 255, 1, 17658), -- Throne
+(@OGUID+78, 192726, 571, 1, 4, 7355.149, -2969.905, 920.3154, 3.281227, 0, 0, 0, 1, 120, 255, 1, 17658), -- Throne
+(@OGUID+79, 192727, 571, 1, 4, 7360.083, -2966.736, 911.498, 0.4014239, 0, 0, 0, 1, 120, 255, 1, 17658), -- Throne
+(@OGUID+80, 192728, 571, 1, 4, 7360.628, -2971.285, 912.2922, 2.556908, 0, 0, 0, 1, 120, 255, 1, 17658), -- Throne
+(@OGUID+81, 192729, 571, 1, 4, 7347.269, -2971.479, 912.0352, 0.1483528, 0, 0, 0, 1, 120, 255, 1, 17658), -- Throne
+(@OGUID+82, 192730, 571, 1, 4, 7347.157, -2963.165, 907.7184, 2.801247, 0, 0, 0, 1, 120, 255, 1, 17658), -- Throne
+(@OGUID+83, 192731, 571, 1, 4, 7362.757, -2961.672, 907.7986, 3.42085, 0, 0, 0, 1, 120, 255, 1, 17658), -- Throne
+(@OGUID+84, 193196, 571, 1, 2, 4840.929, 1494.97, 209.6041, 2.103119, 0, 0, 0, 1, 120, 255, 1, 17658), -- Fordragon''s Shield
+(@OGUID+85, 193197, 571, 1, 2, 4875.424, 1486.991, 209.5768, 2.120576, 0, 0, 0, 1, 120, 255, 1, 17658), -- Saurfang''s Battle Armor
+(@OGUID+86, 193198, 571, 1, 2, 4875.969, 1487.23, 209.6242, 5.707228, 0, 0, 0, 1, 120, 255, 1, 17658), -- Shoulder [PH]
+(@OGUID+87, 193220, 571, 1, 2, 4901.706, 1501.568, 214.8973, 0.0005237369, 0, 0, 0, 1, 120, 255, 1, 17658),
+(@OGUID+88, 193221, 571, 1, 2, 4899.952, 1499.167, 214.9082, 5.41925, 0, 0, 0, 1, 120, 255, 1, 17658),
+(@OGUID+89, 193222, 571, 1, 2, 4867.967, 1505.212, 209.1965, 1.82941, 0, 0, 0, 1, 120, 255, 1, 17658),
+(@OGUID+90, 193223, 571, 1, 2, 4867.679, 1501.424, 209.7898, 0.969179, 0, 0, 0, 1, 120, 255, 1, 17658),
+(@OGUID+91, 193224, 571, 1, 2, 4867.233, 1510.344, 210.8179, 2.48454, 0, 0, 0, 1, 120, 255, 1, 17658),
+(@OGUID+92, 193225, 571, 1, 2, 4869.894, 1498.136, 209.9754, 2.077466, 0, 0, 0, 1, 120, 255, 1, 17658),
+(@OGUID+93, 193226, 571, 1, 2, 4868.827, 1515.047, 210.5834, 1.567609, 0, 0, 0, 1, 120, 255, 1, 17658),
+(@OGUID+94, 193227, 571, 1, 2, 4872.966, 1514.59, 212.3312, 4.885982, 0, 0, 0, 1, 120, 255, 1, 17658),
+(@OGUID+95, 193228, 571, 1, 2, 4867.919, 1513.521, 211.374, 4.224219, 0, 0, 0, 1, 120, 255, 1, 17658),
+(@OGUID+96, 193229, 571, 1, 2, 4899.046, 1500.026, 213.7757, 4.281601, 0, 0, 0, 1, 120, 255, 1, 17658),
+(@OGUID+97, 193230, 571, 1, 2, 4875.33, 1483.97, 209.321, 1.099933, 0, 0, 0, 1, 120, 255, 1, 17658),
+(@OGUID+98, 193231, 571, 1, 2, 4875.167, 1482.726, 209.5813, 3.899255, 0, 0, 0, 1, 120, 255, 1, 17658),
+(@OGUID+99, 193232, 571, 1, 2, 4873.677, 1479.37, 209.2619, 6.044956, 0, 0, 0, 1, 120, 255, 1, 17658),
+(@OGUID+100, 193233, 571, 1, 2, 4878.027, 1483.453, 209.3674, 3.726801, 0, 0, 0, 1, 120, 255, 1, 17658),
+(@OGUID+101, 193234, 571, 1, 2, 4874.569, 1482.123, 209.5809, 5.821372, 0, 0, 0, 1, 120, 255, 1, 17658),
+(@OGUID+102, 193235, 571, 1, 2, 4874.725, 1480.063, 209.5809, 3.477762, 0, 0, 0, 1, 120, 255, 1, 17658),
+(@OGUID+103, 193236, 571, 1, 2, 4877.155, 1482.281, 209.5077, 6.219547, 0, 0, 0, 1, 120, 255, 1, 17658),
+(@OGUID+104, 193237, 571, 1, 2, 4879.968, 1484.747, 209.8505, 4.501981, 0, 0, 0, 1, 120, 255, 1, 17658),
+(@OGUID+105, 193238, 571, 1, 2, 4876.323, 1484.97, 208.3138, 2.230834, 0, 0, 0, 1, 120, 255, 1, 17658),
+(@OGUID+106, 193239, 571, 1, 2, 4877.1, 1484.656, 209.1863, 2.269449, 0, 0, 0, 1, 120, 255, 1, 17658),
+(@OGUID+107, 193240, 571, 1, 2, 4871.932, 1485.224, 209.3937, 1.457871, 0, 0, 0, 1, 120, 255, 1, 17658),
+(@OGUID+108, 193241, 571, 1, 2, 4868.574, 1498.977, 210.52, 0.1396255, 0, 0, 0, 1, 120, 255, 1, 17658),
+(@OGUID+109, 193242, 571, 1, 2, 4868.924, 1496.627, 210.149, 3.220151, 0, 0, 0, 1, 120, 255, 1, 17658),
+(@OGUID+110, 193243, 571, 1, 2, 4866.884, 1497.613, 209.2193, 5.581869, 0, 0, 0, 1, 120, 255, 1, 17658),
+(@OGUID+111, 193244, 571, 1, 2, 4870.409, 1485.929, 208.8148, 2.012669, 0, 0, 0, 1, 120, 255, 1, 17658),
+(@OGUID+112, 193245, 571, 1, 2, 4873.674, 1463.747, 209.9446, 1.692968, 0, 0, 0, 1, 120, 255, 1, 17658),
+(@OGUID+113, 193246, 571, 1, 2, 4867.43, 1463.248, 208.1823, 3.382769, 0, 0, 0, 1, 120, 255, 1, 17658),
+(@OGUID+114, 193247, 571, 1, 2, 4870.533, 1463.094, 209.2539, 2.985031, 0, 0, 0, 1, 120, 255, 1, 17658),
+(@OGUID+115, 193248, 571, 1, 2, 4872.965, 1463.778, 208.817, 0.3284273, 0, 0, 0, 1, 120, 255, 1, 17658),
+(@OGUID+116, 193249, 571, 1, 2, 4866.135, 1454.382, 209.254, 2.906489, 0, 0, 0, 1, 120, 255, 1, 17658),
+(@OGUID+117, 193250, 571, 1, 2, 4863.497, 1511.99, 211.0073, 5.427976, 0, 0, 0, 1, 120, 255, 1, 17658),
+(@OGUID+118, 193251, 571, 1, 2, 4862.127, 1509.542, 210.2737, 4.765272, 0, 0, 0, 1, 120, 255, 1, 17658),
+(@OGUID+119, 193252, 571, 1, 2, 4865.178, 1507.217, 210.3379, 5.044526, 0, 0, 0, 1, 120, 255, 1, 17658),
+(@OGUID+120, 193253, 571, 1, 2, 4853.508, 1504.255, 209.7053, 1.998924, 0, 0, 0, 1, 120, 255, 1, 17658),
+(@OGUID+121, 193254, 571, 1, 2, 4849.161, 1504.778, 210.4205, 4.066619, 0, 0, 0, 1, 120, 255, 1, 17658),
+(@OGUID+122, 193255, 571, 1, 2, 4835.896, 1488.719, 209.5815, 3.416903, 0, 0, 0, 1, 120, 255, 1, 17658),
+(@OGUID+123, 193256, 571, 1, 2, 4841.354, 1482.227, 209.5805, 1.850049, 0, 0, 0, 1, 120, 255, 1, 17658),
+(@OGUID+124, 193257, 571, 1, 2, 4841.196, 1489.903, 209.5813, 5.725396, 0, 0, 0, 1, 120, 255, 1, 17658),
+(@OGUID+125, 193258, 571, 1, 2, 4840.608, 1484.361, 209.5813, 2.016231, 0, 0, 0, 1, 120, 255, 1, 17658),
+(@OGUID+126, 193259, 571, 1, 2, 4839.124, 1486.542, 209.2619, 1.978337, 0, 0, 0, 1, 120, 255, 1, 17658),
+(@OGUID+127, 193260, 571, 1, 2, 4843.821, 1489.113, 209.283, 5.184155, 0, 0, 0, 1, 120, 255, 1, 17658),
+(@OGUID+128, 193261, 571, 1, 2, 4842.286, 1483.191, 209.5809, 0.3759405, 0, 0, 0, 1, 120, 255, 1, 17658),
+(@OGUID+129, 193262, 571, 1, 2, 4845.386, 1486.806, 209.4725, 1.254085, 0, 0, 0, 1, 120, 255, 1, 17658),
+(@OGUID+130, 193263, 571, 1, 2, 4835.046, 1490.908, 209.2909, 1.831047, 0, 0, 0, 1, 120, 255, 1, 17658),
+(@OGUID+131, 193264, 571, 1, 2, 4838.369, 1493.165, 209.3897, 2.568887, 0, 0, 0, 1, 120, 255, 1, 17658),
+(@OGUID+132, 193265, 571, 1, 2, 4842.897, 1491.009, 209.5809, 5.959332, 0, 0, 0, 1, 120, 255, 1, 17658),
+(@OGUID+133, 193266, 571, 1, 2, 4844.97, 1489.892, 209.3359, 3.932379, 0, 0, 0, 1, 120, 255, 1, 17658),
+(@OGUID+134, 193267, 571, 1, 2, 4847.749, 1488.823, 209.301, 5.789437, 0, 0, 0, 1, 120, 255, 1, 17658),
+(@OGUID+135, 193268, 571, 1, 2, 4841.975, 1486.234, 209.4944, 5.791942, 0, 0, 0, 1, 120, 255, 1, 17658),
+(@OGUID+136, 193269, 571, 1, 2, 4844.339, 1484.116, 209.4908, 3.889533, 0, 0, 0, 1, 120, 255, 1, 17658),
+(@OGUID+137, 193270, 571, 1, 2, 4840.96, 1481.422, 209.4966, 4.98909, 0, 0, 0, 1, 120, 255, 1, 17658),
+(@OGUID+138, 193271, 571, 1, 2, 4844.502, 1486.135, 209.3802, 1.443149, 0, 0, 0, 1, 120, 255, 1, 17658),
+(@OGUID+139, 193272, 571, 1, 2, 4836.853, 1488.425, 209.4966, 3.060501, 0, 0, 0, 1, 120, 255, 1, 17658),
+(@OGUID+140, 193273, 571, 1, 2, 4844.616, 1493.514, 209.3608, 3.11481, 0, 0, 0, 1, 120, 255, 1, 17658),
+(@OGUID+141, 193274, 571, 1, 2, 4847.851, 1486.434, 209.3608, 1.151302, 0, 0, 0, 1, 120, 255, 1, 17658),
+(@OGUID+142, 193275, 571, 1, 2, 4841.349, 1488.082, 208.3138, 3.749274, 0, 0, 0, 1, 120, 255, 1, 17658),
+(@OGUID+143, 193276, 571, 1, 2, 4842.697, 1487.741, 209.3854, 3.587177, 0, 0, 0, 1, 120, 255, 1, 17658),
+(@OGUID+144, 193277, 571, 1, 2, 4847.485, 1488.835, 207.9903, 0.485505, 0, 0, 0, 1, 120, 255, 1, 17658),
+(@OGUID+145, 193278, 571, 1, 2, 4856.974, 1498.668, 210.0112, 5.593781, 0, 0, 0, 1, 120, 255, 1, 17658),
+(@OGUID+146, 193279, 571, 1, 2, 4860.162, 1499.833, 209.4969, 5.515764, 0, 0, 0, 1, 120, 255, 1, 17658),
+(@OGUID+147, 193280, 571, 1, 2, 4862.285, 1462.604, 209.3651, 4.037887, 0, 0, 0, 1, 120, 255, 1, 17658),
+(@OGUID+148, 193281, 571, 1, 2, 4862.758, 1457.965, 209.9445, 0.4537852, 0, 0, 0, 1, 120, 255, 1, 17658),
+(@OGUID+149, 193282, 571, 1, 2, 4859.121, 1463.345, 209.3854, 5.777565, 0, 0, 0, 1, 120, 255, 1, 17658),
+(@OGUID+150, 193283, 571, 1, 2, 4861.292, 1455.554, 209.3854, 5.742657, 0, 0, 0, 1, 120, 255, 1, 17658),
+(@OGUID+151, 193284, 571, 1, 2, 4865.374, 1460.495, 209.1164, 0.3146807, 0, 0, 0, 1, 120, 255, 1, 17658),
+(@OGUID+152, 193285, 571, 1, 2, 4865.479, 1453.684, 209.7114, 5.969027, 0, 0, 0, 1, 120, 255, 1, 17658),
+(@OGUID+153, 193286, 571, 1, 2, 4840.913, 1402.094, 192.9591, 5.131985, 0, 0, 0, 1, 120, 255, 1, 17658),
+(@OGUID+154, 193287, 571, 1, 2, 4837.317, 1400.465, 192.6397, 1.384923, 0, 0, 0, 1, 120, 255, 1, 17658),
+(@OGUID+155, 193288, 571, 1, 2, 4842.942, 1402.059, 192.9587, 5.365919, 0, 0, 0, 1, 120, 255, 1, 17658),
+(@OGUID+156, 193289, 571, 1, 2, 4836.487, 1403.299, 192.8744, 2.467085, 0, 0, 0, 1, 120, 255, 1, 17658),
+(@OGUID+157, 193290, 571, 1, 2, 4840.022, 1400.498, 191.6916, 3.15663, 0, 0, 0, 1, 120, 255, 1, 17658),
+(@OGUID+158, 193291, 571, 1, 2, 4854.309, 1417.488, 193.4538, 2.059487, 0, 0, 0, 1, 120, 255, 1, 17658),
+(@OGUID+159, 193292, 571, 1, 2, 4848.659, 1414.785, 191.6916, 3.749274, 0, 0, 0, 1, 120, 255, 1, 17658),
+(@OGUID+160, 193293, 571, 1, 2, 4852.316, 1415.811, 192.7632, 2.889032, 0, 0, 0, 1, 120, 255, 1, 17658),
+(@OGUID+161, 193294, 571, 1, 2, 4856.42, 1416.295, 192.7632, 1.702218, 0, 0, 0, 1, 120, 255, 1, 17658),
+(@OGUID+162, 193295, 571, 1, 2, 4838.964, 1398.37, 192.9591, 1.928963, 0, 0, 0, 1, 120, 255, 1, 17658),
+(@OGUID+163, 193296, 571, 1, 2, 4842.648, 1399.972, 192.6608, 4.590742, 0, 0, 0, 1, 120, 255, 1, 17658),
+(@OGUID+164, 193297, 571, 1, 2, 4842.655, 1397.182, 192.8535, 0.6606718, 0, 0, 0, 1, 120, 255, 1, 17658),
+(@OGUID+165, 193298, 571, 1, 2, 4844.037, 1399.976, 192.7137, 3.338978, 0, 0, 0, 1, 120, 255, 1, 17658),
+(@OGUID+166, 193299, 571, 1, 2, 4844.027, 1397.335, 192.6788, 4.733513, 0, 0, 0, 1, 120, 255, 1, 17658),
+(@OGUID+167, 193300, 571, 1, 2, 4839.507, 1398.616, 192.8744, 5.198529, 0, 0, 0, 1, 120, 255, 1, 17658),
+(@OGUID+168, 193301, 571, 1, 2, 4840.949, 1399.462, 192.7632, 2.993751, 0, 0, 0, 1, 120, 255, 1, 17658),
+(@OGUID+169, 193302, 571, 1, 2, 4844.576, 1399.304, 191.3681, 5.878576, 0, 0, 0, 1, 120, 255, 1, 17658),
+(@OGUID+170, 193303, 571, 1, 2, 4819.022, 1437.061, 195.9568, 0.7853968, 0, 0, 0, 1, 120, 255, 1, 17658),
+(@OGUID+171, 193304, 571, 1, 2, 4814.786, 1441.675, 193.9325, 2.475178, 0, 0, 0, 1, 120, 255, 1, 17658),
+(@OGUID+172, 193305, 571, 1, 2, 4816.835, 1438.477, 195.4229, 1.614948, 0, 0, 0, 1, 120, 255, 1, 17658),
+(@OGUID+173, 193306, 571, 1, 2, 4818.494, 1434.955, 194.9861, 6.227641, 0, 0, 0, 1, 120, 255, 1, 17658),
+(@OGUID+174, 193307, 571, 1, 2, 4804.619, 1464.389, 193.2142, 0.8726636, 0, 0, 0, 1, 120, 255, 1, 17658),
+(@OGUID+175, 193308, 571, 1, 2, 4802.317, 1465.608, 192.5236, 1.702218, 0, 0, 0, 1, 120, 255, 1, 17658),
+(@OGUID+176, 193309, 571, 1, 2, 4838.382, 1400.665, 192.9736, 0.165805, 0, 0, 0, 1, 120, 255, 1, 17658),
+(@OGUID+177, 193310, 571, 1, 2, 4804.275, 1462.243, 192.1949, 0.03171997, 0, 0, 0, 1, 120, 255, 1, 17658),
+(@OGUID+178, 193311, 571, 1, 2, 4818.627, 1432.585, 195.6188, 0.7931821, 0, 0, 0, 1, 120, 255, 1, 17658),
+(@OGUID+179, 193312, 571, 1, 2, 4818.935, 1434.288, 194.9375, 6.100451, 0, 0, 0, 1, 120, 255, 1, 17658),
+(@OGUID+180, 193313, 571, 1, 2, 4802.595, 1414.417, 193.2174, 5.02655, 0, 0, 0, 1, 120, 255, 1, 17658),
+(@OGUID+181, 193314, 571, 1, 2, 4808.629, 1416.099, 191.6722, 0.4331469, 0, 0, 0, 1, 120, 255, 1, 17658),
+(@OGUID+182, 193315, 571, 1, 2, 4805.602, 1422.391, 192.5222, 3.915716, 0, 0, 0, 1, 120, 255, 1, 17658),
+(@OGUID+183, 193316, 571, 1, 2, 4806.971, 1413.819, 192.5371, 0.8470061, 0, 0, 0, 1, 120, 255, 1, 17658),
+(@OGUID+184, 193317, 571, 1, 2, 4800.958, 1415.844, 192.1961, 4.185608, 0, 0, 0, 1, 120, 255, 1, 17658),
+(@OGUID+185, 193318, 571, 1, 2, 4814.53, 1421.677, 193.837, 4.031712, 0, 0, 0, 1, 120, 255, 1, 17658),
+(@OGUID+186, 193319, 571, 1, 2, 4818.464, 1416.958, 192.3035, 0.1713461, 0, 0, 0, 1, 120, 255, 1, 17658),
+(@OGUID+187, 193320, 571, 1, 2, 4816.804, 1417.587, 192.5431, 2.827954, 0, 0, 0, 1, 120, 255, 1, 17658),
+(@OGUID+188, 193321, 571, 1, 2, 4813.185, 1424.823, 193.4423, 2.793048, 0, 0, 0, 1, 120, 255, 1, 17658),
+(@OGUID+189, 193322, 571, 1, 2, 4810.121, 1419.193, 193.3252, 3.648265, 0, 0, 0, 1, 120, 255, 1, 17658),
+(@OGUID+190, 193323, 571, 1, 2, 4807.363, 1428.156, 193.9222, 3.0194, 0, 0, 0, 1, 120, 255, 1, 17658),
+(@OGUID+191, 193324, 571, 1, 2, 4806.887, 1426.839, 192.9712, 0.3234065, 0, 0, 0, 1, 120, 255, 1, 17658),
+(@OGUID+192, 193325, 571, 1, 2, 4822.01, 1384.936, 193.2164, 4.05789, 0, 0, 0, 1, 120, 255, 1, 17658),
+(@OGUID+193, 193326, 571, 1, 2, 4821.838, 1389.484, 192.8276, 1.342961, 0, 0, 0, 1, 120, 255, 1, 17658),
+(@OGUID+194, 193327, 571, 1, 2, 4826.813, 1380.915, 191.5601, 5.747677, 0, 0, 0, 1, 120, 255, 1, 17658),
+(@OGUID+195, 193328, 571, 1, 2, 4824.364, 1383.818, 192.6317, 4.887444, 0, 0, 0, 1, 120, 255, 1, 17658),
+(@OGUID+196, 193329, 571, 1, 2, 4822.135, 1389.366, 192.6317, 3.831524, 0, 0, 0, 1, 120, 255, 1, 17658),
+(@OGUID+197, 193330, 571, 1, 2, 4823.995, 1380.991, 192.6317, 6.161535, 0, 0, 0, 1, 120, 255, 1, 17658),
+(@OGUID+198, 193331, 571, 1, 2, 4822.26, 1387.094, 192.1949, 3.21697, 0, 0, 0, 1, 120, 255, 1, 17658),
+(@OGUID+199, 193332, 571, 1, 2, 4799.996, 1468.615, 191.452, 2.562449, 0, 0, 0, 1, 120, 255, 1, 17658),
+(@OGUID+200, 193333, 571, 1, 2, 4792.137, 1470.661, 193.0653, 6.161014, 0, 0, 0, 1, 120, 255, 1, 17658),
+(@OGUID+201, 193334, 571, 1, 2, 4794.401, 1474.757, 192.7633, 4.957259, 0, 0, 0, 1, 120, 255, 1, 17658),
+(@OGUID+202, 193335, 571, 1, 2, 4790.183, 1467.854, 192.762, 4.922352, 0, 0, 0, 1, 120, 255, 1, 17658),
+(@OGUID+203, 193336, 571, 1, 2, 4796.58, 1468.24, 192.1685, 5.777565, 0, 0, 0, 1, 120, 255, 1, 17658),
+(@OGUID+204, 193337, 571, 1, 2, 4784.452, 1470.938, 192.9553, 4.127707, 0, 0, 0, 1, 120, 255, 1, 17658),
+(@OGUID+205, 193338, 571, 1, 2, 4784.479, 1470.891, 192.5763, 0.9255483, 0, 0, 0, 1, 120, 255, 1, 17658),
+(@OGUID+206, 193339, 571, 1, 2, 4772.658, 1434.781, 193.2318, 3.691376, 0, 0, 0, 1, 120, 255, 1, 17658),
+(@OGUID+207, 193340, 571, 1, 2, 4774.897, 1439.738, 192.737, 3.725339, 0, 0, 0, 1, 120, 255, 1, 17658),
+(@OGUID+208, 193341, 571, 1, 2, 4775.096, 1434.278, 192.5412, 4.040963, 0, 0, 0, 1, 120, 255, 1, 17658),
+(@OGUID+209, 193342, 571, 1, 2, 4796.264, 1462.712, 192.9666, 6.045015, 0, 0, 0, 1, 120, 255, 1, 17658),
+(@OGUID+210, 193343, 571, 1, 2, 4790.44, 1461.151, 192.981, 5.148722, 0, 0, 0, 1, 120, 255, 1, 17658),
+(@OGUID+211, 193344, 571, 1, 2, 4791.811, 1461.446, 192.6317, 2.452708, 0, 0, 0, 1, 120, 255, 1, 17658),
+(@OGUID+212, 193345, 571, 1, 2, 4796.167, 1458.012, 192.8273, 4.96452, 0, 0, 0, 1, 120, 255, 1, 17658),
+(@OGUID+213, 193346, 571, 1, 2, 4778.761, 1431.167, 191.4696, 5.21535, 0, 0, 0, 1, 120, 255, 1, 17658),
+(@OGUID+214, 193347, 571, 1, 2, 4772.64, 1435.917, 192.8096, 5.940294, 0, 0, 0, 1, 120, 255, 1, 17658),
+(@OGUID+215, 193348, 571, 1, 2, 4774.135, 1431.061, 192.5412, 5.821197, 0, 0, 0, 1, 120, 255, 1, 17658),
+(@OGUID+216, 193349, 571, 1, 2, 4772.312, 1368.96, 179.3861, 0.8115751, 0, 0, 0, 1, 120, 255, 1, 17658),
+(@OGUID+217, 193350, 571, 1, 2, 4768.762, 1368.182, 178.913, 1.444671, 0, 0, 0, 1, 120, 255, 1, 17658),
+(@OGUID+218, 193351, 571, 1, 2, 4768.806, 1368.814, 178.492, 0.1401508, 0, 0, 0, 1, 120, 255, 1, 17658),
+(@OGUID+219, 193352, 571, 1, 2, 4773.032, 1368.717, 178.4498, 6.18401, 0, 0, 0, 1, 120, 255, 1, 17658),
+(@OGUID+220, 193353, 571, 1, 2, 4769.212, 1371.894, 177.5704, 3.96744, 0, 0, 0, 1, 120, 255, 1, 17658),
+(@OGUID+221, 193354, 571, 1, 2, 4753.28, 1340.752, 168.824, 5.942847, 0, 0, 0, 1, 120, 255, 1, 17658),
+(@OGUID+222, 193355, 571, 1, 2, 4755.793, 1348.842, 171.9237, 2.460914, 0, 0, 0, 1, 120, 255, 1, 17658),
+(@OGUID+223, 193356, 571, 1, 2, 4748.543, 1338.941, 166.3824, 5.994266, 0, 0, 0, 1, 120, 255, 1, 17658),
+(@OGUID+224, 193357, 571, 1, 2, 4755.62, 1346.563, 169.7958, 1.349443, 0, 0, 0, 1, 120, 255, 1, 17658),
+(@OGUID+225, 193358, 571, 1, 2, 4753.616, 1343.335, 168.9523, 0.4892147, 0, 0, 0, 1, 120, 255, 1, 17658),
+(@OGUID+226, 193359, 571, 1, 2, 4756.417, 1343.859, 170.2456, 1.763303, 0, 0, 0, 1, 120, 255, 1, 17658),
+(@OGUID+227, 193360, 571, 1, 2, 4751.151, 1340.321, 166.6075, 5.101904, 0, 0, 0, 1, 120, 255, 1, 17658),
+(@OGUID+228, 193361, 571, 1, 2, 4734.48, 1318.531, 157.1364, 1.850571, 0, 0, 0, 1, 120, 255, 1, 17658),
+(@OGUID+229, 193362, 571, 1, 2, 4729.611, 1321.644, 157.5598, 3.769916, 0, 0, 0, 1, 120, 255, 1, 17658),
+(@OGUID+230, 193363, 571, 1, 2, 4730.31, 1318.991, 155.5435, 4.299054, 0, 0, 0, 1, 120, 255, 1, 17658),
+(@OGUID+231, 193364, 571, 1, 2, 4730.522, 1317.274, 156.2261, 2.566151, 0, 0, 0, 1, 120, 255, 1, 17658),
+(@OGUID+232, 193365, 571, 1, 2, 4845.421, 1487.394, 209.5798, 3.621566, 0, 0, 0, 1, 120, 255, 1, 17658),
+(@OGUID+233, 193366, 571, 1, 2, 4873.986, 1482.95, 209.5806, 2.321287, 0, 0, 0, 1, 120, 255, 1, 17658),
+(@OGUID+234, 193367, 571, 1, 2, 4877.768, 1484.813, 209.6253, 0.9861118, 0, 0, 0, 1, 120, 255, 1, 17658),
+(@OGUID+235, 193368, 571, 1, 2, 4843.112, 1399.606, 192.9736, 4.04044, 0, 0, 0, 1, 120, 255, 1, 17658),
+(@OGUID+236, 193369, 571, 1, 2, 4733.987, 1316.142, 156.3821, 4.214973, 0, 0, 0, 1, 120, 255, 1, 17658),
+(@OGUID+237, 193370, 571, 1, 2, 4771.53, 1370.231, 177.6764, 3.473215, 0, 0, 0, 1, 120, 255, 1, 17658),
+(@OGUID+238, 193371, 571, 1, 2, 4747.052, 1371.73, 174.6061, 3.272515, 0, 0, 0, 1, 120, 255, 1, 17658),
+(@OGUID+239, 193372, 571, 1, 2, 4745.647, 1372.851, 180.6194, 0.2879769, 0, 0, 0, 1, 120, 255, 1, 17658),
+(@OGUID+240, 193373, 571, 1, 2, 4748.801, 1370.48, 177.2103, 1.125736, 0, 0, 0, 1, 120, 255, 1, 17658),
+(@OGUID+241, 193374, 571, 1, 2, 4739.766, 1375.458, 175.0408, 5.899213, 0, 0, 0, 1, 120, 255, 1, 17658),
+(@OGUID+242, 193375, 571, 1, 2, 4747.372, 1376.691, 177.1419, 4.241152, 0, 0, 0, 1, 120, 255, 1, 17658),
+(@OGUID+243, 193376, 571, 1, 2, 4729.662, 1338.746, 165.7118, 1.483528, 0, 0, 0, 1, 120, 255, 1, 17658),
+(@OGUID+244, 193377, 571, 1, 2, 4724.683, 1339.089, 165.6361, 0.9512024, 0, 0, 0, 1, 120, 255, 1, 17658),
+(@OGUID+245, 193378, 571, 1, 2, 4722.371, 1315.175, 153.0163, 4.712391, 0, 0, 0, 1, 120, 255, 1, 15595),
+(@OGUID+246, 193379, 571, 1, 2, 4722.186, 1312.745, 151.8177, 2.207837, 0, 0, 0, 1, 120, 255, 1, 17658),
+(@OGUID+247, 193380, 571, 1, 2, 4721.955, 1313.016, 155.3777, 4.267334, 0, 0, 0, 1, 120, 255, 1, 17658),
+(@OGUID+248, 193381, 571, 1, 2, 4828.909, 1364.957, 187.7651, 3.141593, 0, 0, 0, 1, 120, 255, 1, 17658),
+(@OGUID+249, 193382, 571, 1, 2, 4767.654, 1414.143, 182.9588, 3.141593, 0, 0, 0, 1, 120, 255, 1, 17658),
+(@OGUID+250, 193383, 571, 1, 2, 4885.875, 1446.399, 197.2411, 3.141593, 0, 0, 0, 1, 120, 255, 1, 17658),
+(@OGUID+251, 193384, 571, 1, 2, 4967.423, 1382.576, 280.6783, 3.141593, 0, 0, 0, 1, 120, 255, 1, 17658),
+(@OGUID+252, 193385, 571, 1, 2, 4819.641, 1494.38, 197.8983, 3.141593, 0, 0, 0, 1, 120, 255, 1, 17658),
+(@OGUID+253, 193386, 571, 1, 2, 4760.751, 1331.356, 166.7298, 1.483529, 0, 0, 0, 1, 120, 255, 1, 17658),
+(@OGUID+254, 193388, 571, 1, 2, 4841.913, 1491.074, 209.5806, 5.026549, 0, 0, 0, 1, 120, 255, 1, 17658),
+(@OGUID+255, 193389, 571, 1, 2, 4854.66, 1501.157, 209.4814, 2.347464, 0, 0, 0, 1, 120, 255, 1, 17658),
+(@OGUID+256, 193390, 571, 1, 2, 4867.81, 1503.073, 209.8845, 4.398232, 0, 0, 0, 1, 120, 255, 1, 17658),
+(@OGUID+257, 193391, 571, 1, 2, 4806.318, 1418.541, 192.7293, 3.996809, 0, 0, 0, 1, 120, 255, 1, 17658),
+(@OGUID+258, 193392, 571, 1, 2, 4809.103, 1418.015, 192.8921, 1.754055, 0, 0, 0, 1, 120, 255, 1, 17658),
+(@OGUID+259, 193393, 571, 1, 2, 4866.126, 1504.92, 209.6104, 3.586657, 0, 0, 0, 1, 120, 255, 1, 17658),
+(@OGUID+260, 193394, 571, 1, 2, 4822.109, 1385.169, 190.8455, 0.5934095, 0, 0, 0, 1, 120, 255, 1, 17658),
+(@OGUID+261, 193395, 571, 1, 2, 4770.155, 1370.927, 176.3797, 2.809977, 0, 0, 0, 1, 120, 255, 1, 17658),
+(@OGUID+262, 193396, 571, 1, 2, 4794.685, 1457.065, 192.5883, 2.644167, 0, 0, 0, 1, 120, 255, 1, 17658),
+(@OGUID+263, 193397, 571, 1, 2, 4733.944, 1315.556, 156.3676, 5.009097, 0, 0, 0, 1, 120, 255, 1, 17658),
+(@OGUID+264, 193398, 571, 1, 2, 4848.95, 1412.977, 192.9511, 4.468044, 0, 0, 0, 1, 120, 255, 1, 17658),
+(@OGUID+265, 193399, 571, 1, 2, 4859.428, 1457.759, 209.3438, 3.168109, 0, 0, 0, 1, 120, 255, 1, 17658),
+(@OGUID+266, 193986, 571, 1, 1, 7917.546, -2461.021, 1135.937, 3.071766, 0, 0, 0, 1, 120, 255, 1, 15595), -- Gravestone
+(@OGUID+267, 194127, 571, 1, 1, 6099.222, -1077.966, 404.2272, 2.948969, 0, 0, 0, 1, 120, 255, 1, 17658), -- Anvil
+(@OGUID+268, 194128, 571, 1, 1, 6096.169, -1074.005, 404.5583, 0.5148721, 0, 0, 0, 1, 120, 255, 1, 17658), -- Forge
+(@OGUID+269, 194155, 571, 1, 1, 3848.472, -4069.614, 200.835, 6.058595, 0, 0, 0, 1, 120, 255, 1, 15595), -- Mysterious Wreckage
+(@OGUID+270, 194535, 571, 1, 1, 4957.066, 1291.01, 234.8064, 4.06662, 0, 0, 0, 1, 120, 255, 1, 15595), -- Campfire
+(@OGUID+271, 194540, 571, 1, 1, 6219.549, 1.6977, 410.1644, 0.6981294, 0, 0, 0, 1, 120, 255, 1, 17658), -- Bonfire
+(@OGUID+272, 194545, 571, 1, 1, 3833.437, 1629.639, 89.75687, 3.028127, 0, 0, 0, 1, 120, 255, 1, 17658), -- Brazier
+(@OGUID+273, 194546, 571, 1, 1, 3823.038, 1623.943, 89.76097, 3.865906, 0, 0, 0, 1, 120, 255, 1, 17658), -- Brazier
+(@OGUID+274, 194547, 571, 1, 1, 3887.406, 1585.241, 90.91903, 1.204277, 0, 0, 0, 1, 120, 255, 1, 17658), -- Brazier
+(@OGUID+275, 194548, 571, 1, 1, 3887.188, 1596.438, 90.96321, 2.10312, 0, 0, 0, 1, 120, 255, 1, 17658), -- Brazier
+(@OGUID+276, 194832, 571, 1, 1, 6452.789, 2345.028, 464.2545, 4.497677, 0, 0, 0, 1, 120, 255, 1, 15595),
+(@OGUID+277, 194833, 571, 1, 1, 6454.819, 2346.186, 464.1093, 6.165739, 0, 0, 0, 1, 120, 255, 1, 15595),
+(@OGUID+278, 194834, 571, 1, 1, 6424.471, 2383.731, 466.7144, 6.260079, 0, 0, 0, 1, 120, 255, 1, 15595),
+(@OGUID+279, 194835, 571, 1, 1, 6422.702, 2385.566, 466.9037, 4.598919, 0, 0, 0, 1, 120, 255, 1, 15595),
+(@OGUID+280, 194836, 571, 1, 1, 6429.28, 2385.773, 466.5732, 3.505927, 0, 0, 0, 1, 120, 255, 1, 15595),
+(@OGUID+281, 194837, 571, 1, 1, 6425.83, 2383.571, 466.5943, 3.120276, 0, 0, 0, 1, 120, 255, 1, 15595),
+(@OGUID+282, 194838, 571, 1, 1, 6425.671, 2386.106, 465.9078, 5.982333, 0, 0, 0, 1, 120, 255, 1, 15595);
diff --git a/sql/updates/world/2014_05_11_01_world_misc.sql b/sql/updates/world/2014_05_11_01_world_misc.sql
new file mode 100644
index 00000000000..8f8dfc4567b
--- /dev/null
+++ b/sql/updates/world/2014_05_11_01_world_misc.sql
@@ -0,0 +1,39 @@
+ALTER TABLE `broadcast_text` CHANGE COLUMN `WDBVerified` `VerifiedBuild` SMALLINT(5) DEFAULT '0';
+ALTER TABLE `creature_equip_template` CHANGE COLUMN `WDBVerified` `VerifiedBuild` SMALLINT(5) DEFAULT '0';
+ALTER TABLE `creature_template` CHANGE COLUMN `WDBVerified` `VerifiedBuild` SMALLINT(5) DEFAULT '0';
+ALTER TABLE `gameobject_template` CHANGE COLUMN `WDBVerified` `VerifiedBuild` SMALLINT(5) DEFAULT '0';
+ALTER TABLE `item_set_names` CHANGE COLUMN `WDBVerified` `VerifiedBuild` SMALLINT(5) DEFAULT '0';
+ALTER TABLE `item_template` CHANGE COLUMN `WDBVerified` `VerifiedBuild` SMALLINT(5) DEFAULT '0';
+ALTER TABLE `npc_text` CHANGE COLUMN `WDBVerified` `VerifiedBuild` SMALLINT(5) DEFAULT '0';
+ALTER TABLE `page_text` CHANGE COLUMN `WDBVerified` `VerifiedBuild` SMALLINT(5) DEFAULT '0';
+ALTER TABLE `quest_template` CHANGE COLUMN `WDBVerified` `VerifiedBuild` SMALLINT(5) DEFAULT '0';
+
+ALTER TABLE `areatrigger_teleport` ADD `VerifiedBuild` SMALLINT(5) DEFAULT '0';
+ALTER TABLE `creature` ADD `VerifiedBuild` SMALLINT(5) DEFAULT '0';
+ALTER TABLE `lfg_entrances` ADD `VerifiedBuild` SMALLINT(5) DEFAULT '0';
+ALTER TABLE `locales_broadcast_text` ADD `VerifiedBuild` SMALLINT(5) DEFAULT '0';
+ALTER TABLE `locales_creature` ADD `VerifiedBuild` SMALLINT(5) DEFAULT '0';
+ALTER TABLE `locales_gameobject` ADD `VerifiedBuild` SMALLINT(5) DEFAULT '0';
+ALTER TABLE `locales_item` ADD `VerifiedBuild` SMALLINT(5) DEFAULT '0';
+ALTER TABLE `locales_item_set_names` ADD `VerifiedBuild` SMALLINT(5) DEFAULT '0';
+ALTER TABLE `locales_quest` ADD `VerifiedBuild` SMALLINT(5) DEFAULT '0';
+ALTER TABLE `npc_vendor` ADD `VerifiedBuild` SMALLINT(5) DEFAULT '0';
+ALTER TABLE `quest_poi_points` ADD `VerifiedBuild` SMALLINT(5) DEFAULT '0';
+ALTER TABLE `quest_poi` ADD `VerifiedBuild` SMALLINT(5) DEFAULT '0';
+
+UPDATE `locales_broadcast_text` SET `VerifiedBuild`=18019;
+UPDATE `locales_creature` SET `VerifiedBuild`=18019;
+UPDATE `locales_gameobject` SET `VerifiedBuild`=18019;
+UPDATE `locales_item` SET `VerifiedBuild`=15050;
+UPDATE `locales_item_set_names` SET `VerifiedBuild`=15050;
+UPDATE `locales_quest` SET `VerifiedBuild`=18019;
+
+UPDATE `creature_template` SET `VerifiedBuild`=0 WHERE `VerifiedBuild`=1;
+UPDATE `gameobject_template` SET `VerifiedBuild`=0 WHERE `VerifiedBuild`=1;
+UPDATE `item_set_names` SET `VerifiedBuild`=0 WHERE `VerifiedBuild`=1;
+UPDATE `item_template` SET `VerifiedBuild`=0 WHERE `VerifiedBuild`=1;
+UPDATE `npc_text` SET `VerifiedBuild`=0 WHERE `VerifiedBuild`=1;
+UPDATE `page_text` SET `VerifiedBuild`=0 WHERE `VerifiedBuild`=1;
+UPDATE `item_template` SET `VerifiedBuild`=0 WHERE `VerifiedBuild`=1;
+
+UPDATE `locales_item` SET `VerifiedBuild`=-12340 WHERE `entry` IN (1019, 5022, 5084, 5085, 5096, 5512, 5530, 5544, 5798, 6712, 6949, 6950, 6951, 7675, 8925, 8926, 8927, 8928, 8984, 8985, 9250, 9315, 9577, 10920, 10921, 10922, 10958, 11163, 11168, 11223, 11367, 11368, 12368, 12708, 13466, 16051, 16209, 16262, 16263, 16306, 16310, 16972, 17414, 17683, 17771, 18224, 18256, 18562, 18947, 19004, 19005, 20310, 20844, 21214, 21279, 21280, 21281, 21282, 21283, 21284, 21285, 21287, 21288, 21289, 21290, 21291, 21292, 21293, 21294, 21295, 21296, 21297, 21298, 21299, 21300, 21302, 21303, 21304, 21306, 21307, 21927, 22053, 22054, 22055, 22146, 22153, 22530, 22540, 22549, 22550, 22890, 22891, 22897, 23094, 23096, 23099, 23100, 23105, 23106, 23108, 23109, 23113, 23114, 23115, 23116, 23121, 23130, 23133, 23136, 23137, 23142, 23143, 23144, 23145, 23148, 23149, 23150, 23151, 23155, 23320, 23778, 23815, 23902, 24029, 24030, 24031, 24032, 24037, 24047, 24050, 24051, 24052, 24056, 24057, 24060, 24061, 24062, 24065, 24162, 24192, 24195, 24196, 24197, 24201, 24203, 24205, 24206, 24207, 24211, 24212, 24215, 24216, 24217, 24219, 27679, 27689, 27774, 27777, 27785, 27786, 27809, 27811, 27812, 27820, 28048, 28117, 28118, 28120, 28122, 28274, 28360, 28361, 28362, 28363, 28460, 28461, 28462, 28465, 28466, 28468, 28469, 28470, 28557, 28595, 28596, 2874, 2893, 2939, 29468, 29549, 29550, 29553, 30467, 30547, 30548, 30550, 30551, 30552, 30553, 30555, 30556, 30558, 30559, 30560, 30563, 30564, 30565, 30572, 30573, 30574, 30575, 30581, 30583, 30585, 30586, 30589, 30590, 30591, 30593, 30594, 30600, 30601, 30603, 30605, 30606, 31116, 31117, 31118, 31359, 31501, 31837, 31860, 31861, 31862, 31863, 31864, 31865, 31866, 31867, 31868, 31869, 31870, 31871, 31872, 31873, 31874, 31875, 31876, 31877, 31878, 31879, 32195, 32196, 32197, 32198, 32202, 32204, 32206, 32207, 32208, 32210, 32213, 32214, 32215, 32216, 32219, 32220, 32221, 32222, 32223, 32225, 32281, 32282, 32283, 32284, 32288, 32290, 32292, 32293, 32294, 32296, 32299, 32300, 32301, 32302, 32305, 32306, 32307, 32308, 32309, 32311, 3238, 32634, 32635, 32636, 32637, 32638, 32639, 32640, 32735, 33139, 33141, 3371, 3372, 33804, 34060, 34061, 34200, 34201, 34218, 3460, 35238, 35239, 35240, 35241, 35245, 35248, 35249, 35250, 35251, 35252, 35255, 35256, 35257, 35259, 35261, 35262, 35266, 35268, 35270, 35271, 35304, 35305, 35306, 35307, 35396, 35397, 35398, 35399, 35400, 35417, 35418, 35419, 35420, 35421, 35422, 35423, 35424, 35425, 35426, 35427, 35428, 35429, 35430, 35431, 35432, 35433, 35434, 35435, 35436, 35437, 35438, 35439, 35440, 35441, 35442, 35443, 35444, 35445, 35446, 35447, 35448, 35449, 35450, 35451, 35452, 35453, 35454, 35455, 35456, 35457, 35458, 35459, 35460, 35461, 35462, 35487, 35488, 35489, 35500, 35707, 35708, 35756, 36766, 37347, 37602, 37603, 3776, 3819, 38545, 38546, 38547, 38549, 38679, 38682, 38766, 38767, 38768, 38769, 38770, 38771, 38772, 38773, 38774, 38775, 38776, 38777, 38778, 38779, 38780, 38781, 38782, 38783, 38784, 38785, 38786, 38787, 38788, 38789, 38790, 38791, 38792, 38793, 38794, 38795, 38796, 38797, 38798, 38799, 38800, 38801, 38802, 38803, 38804, 38805, 38806, 38807, 38808, 38809, 38810, 38811, 38812, 38813, 38814, 38815, 38816, 38817, 38818, 38819, 38820, 38821, 38822, 38823, 38824, 38825, 38826, 38827, 38828, 38829, 38830, 38831, 38832, 38833, 38834, 38835, 38836, 38837, 38838, 38839, 38840, 38841, 38842, 38843, 38844, 38845, 38846, 38847, 38848, 38849, 38850, 38851, 38852, 38853, 38854, 38855, 38856, 38857, 38858, 38859, 38860, 38861, 38862, 38863, 38864, 38865, 38866, 38867, 38868, 38869, 38870, 38871, 38872, 38873, 38874, 38875, 38876, 38877, 38878, 38879, 38880, 38881, 38882, 38883, 38884, 38885, 38886, 38887, 38888, 38889, 38890, 38891, 38892, 38893, 38894, 38895, 38896, 38897, 38898, 38899, 38900, 38901, 38902, 38903, 38904, 38905, 38906, 38907, 38908, 38909, 38910, 38911, 38912, 38913, 38914, 38915, 38917, 38918, 38919, 38920, 38921, 38922, 38923, 38924, 38925, 38926, 38927, 38928, 38929, 38930, 38931, 38932, 38933, 38934, 38935, 38936, 38937, 38938, 38939, 38940, 38941, 38942, 38943, 38944, 38945, 38946, 38947, 38948, 38949, 38950, 38951, 38953, 38954, 38955, 38956, 38958, 38959, 38960, 38961, 38962, 38963, 38964, 38965, 38966, 38967, 38968, 38969, 38971, 38972, 38973, 38974, 38975, 38976, 38977, 38978, 38979, 38980, 38981, 38982, 38983, 38984, 38985, 38986, 38987, 38988, 38989, 38990, 38991, 38992, 38993, 38994, 38995, 38997, 38998, 38999, 39000, 39001, 39002, 39003, 39004, 39005, 39006, 39349, 39350, 39906, 39907, 39909, 39911, 39912, 39915, 39916, 39927, 39933, 39936, 39937, 39938, 39942, 39943, 39944, 39946, 39948, 39953, 39957, 39958, 39960, 39961, 39962, 39963, 39965, 39966, 39968, 39975, 39976, 39979, 39981, 39983, 39984, 39985, 39986, 39988, 39991, 39998, 39999, 40000, 40002, 40010, 40012, 40014, 40015, 40023, 40024, 40025, 40027, 40029, 40030, 40031, 40032, 40033, 40038, 40044, 40047, 40049, 40050, 40052, 40053, 40054, 40055, 40057, 40058, 40085, 40088, 40089, 40092, 40094, 40096, 40099, 40100, 40101, 40103, 40104, 40113, 40114, 40115, 40117, 40121, 40123, 40125, 40126, 40131, 40132, 40134, 40136, 40137, 40138, 40140, 40143, 40148, 40151, 40153, 40154, 40156, 40157, 40158, 40159, 40161, 40162, 40164, 40166, 40167, 40170, 40172, 40174, 40175, 40176, 40177, 40178, 40181, 40411, 40899, 40901, 40903, 40920, 41094, 41096, 41098, 41100, 41101, 41104, 41105, 41106, 41107, 41109, 41110, 41170, 41377, 41429, 41433, 41436, 41438, 41439, 41440, 41444, 41447, 41449, 41450, 41452, 41454, 41456, 41458, 41459, 41462, 41463, 41464, 41467, 41469, 41471, 41473, 41475, 41477, 41478, 41479, 41481, 41482, 41486, 41487, 41488, 41490, 41491, 41494, 41496, 41501, 41502, 41524, 41535, 41538, 41541, 41563, 41564, 41567, 41568, 41570, 41573, 41580, 41581, 41582, 41687, 41688, 41689, 41694, 41696, 41697, 41698, 41699, 41701, 41702, 41703, 41705, 41718, 41719, 41721, 41722, 41724, 41725, 41730, 41732, 41736, 41739, 41747, 41777, 41782, 41785, 41791, 41795, 41796, 41817, 41818, 41820, 42144, 42146, 42153, 42157, 42299, 42303, 42304, 42309, 42315, 42397, 42403, 42405, 42407, 42416, 42417, 42456, 42465, 42466, 42469, 42471, 42734, 42740, 42743, 42747, 42750, 42753, 42754, 42899, 42901, 42906, 42907, 42909, 42910, 42912, 42915, 42916, 42917, 42965, 42971, 43145, 43146, 43230, 43231, 43232, 43233, 43234, 43235, 43237, 43335, 43339, 43350, 43354, 43355, 43357, 43359, 43360, 43366, 43368, 43369, 43380, 43386, 43391, 43394, 43396, 43397, 43398, 43412, 43414, 43416, 43417, 43418, 43420, 43423, 43424, 43425, 43426, 43428, 43429, 43432, 43441, 43534, 43538, 43545, 43548, 43549, 43553, 4361, 4363, 43671, 43672, 43673, 43826, 43867, 43868, 43869, 43952, 43987, 44449, 44453, 44455, 44456, 44457, 44458, 44463, 44465, 44466, 44467, 44469, 44470, 44493, 44497, 44511, 44512, 44815, 44842, 44843, 44944, 44946, 44947, 45056, 45060, 45603, 45628, 45733, 45737, 45743, 45744, 45757, 45758, 45760, 45761, 45776, 45789, 45793, 45794, 45803, 45804, 45805, 45883, 46026, 46098, 46372, 46767, 46897, 46899, 46900, 46902, 46903, 46906, 46907, 46908, 46909, 46910, 46914, 46916, 46919, 46921, 46922, 46927, 46928, 46930, 46931, 46934, 46936, 46939, 46940, 46944, 46945, 46946, 46947, 46951, 46952, 46953, 46956, 47008, 47010, 47011, 47012, 47016, 47023, 47179, 48720, 49084, 50045, 50077, 50125, 50166, 50167, 50168, 50816, 52022, 52023);
diff --git a/sql/updates/world/2014_05_11_02_world_gameobject.sql b/sql/updates/world/2014_05_11_02_world_gameobject.sql
new file mode 100644
index 00000000000..e4648d78f50
--- /dev/null
+++ b/sql/updates/world/2014_05_11_02_world_gameobject.sql
@@ -0,0 +1,4 @@
+ALTER TABLE `points_of_interest` ADD `VerifiedBuild` SMALLINT(5) DEFAULT '0';
+ALTER TABLE `spell_target_position` ADD `VerifiedBuild` SMALLINT(5) DEFAULT '0';
+
+UPDATE `gameobject` SET `phasemask`=256 WHERE `guid`=76992;
diff --git a/sql/updates/world/2014_05_11_03_world_gameobject.sql b/sql/updates/world/2014_05_11_03_world_gameobject.sql
new file mode 100644
index 00000000000..4fd5f7d6fc5
--- /dev/null
+++ b/sql/updates/world/2014_05_11_03_world_gameobject.sql
@@ -0,0 +1,2 @@
+UPDATE `gameobject` SET `VerifiedBuild`=15595 WHERE `guid` IN (61, 72, 74, 1583, 2214, 4309, 5494, 6974, 6976, 6995, 7003, 7005, 7006, 7009, 7048, 10049, 10135, 10645, 11525, 11620, 11820, 11822, 11829, 12024, 13215, 13540, 13704, 13762, 13763, 13764, 13767, 14261, 15686, 16534, 16821, 16822, 16826, 17761, 21009, 21016, 21103, 21622, 21623, 21624, 22316, 22507, 22989, 23168, 24324, 26190, 26207, 26208, 26264, 26284, 26319, 26320, 26325, 26346, 26347, 26350, 26361, 26365, 26367, 26368, 26369, 26375, 26379, 26381, 26384, 26392, 26394, 26410, 26446, 26447, 26453, 28367, 30037, 30041, 30112, 30537, 31990, 31991, 31992, 31995, 31996, 31997, 31998, 31999, 32000, 32001, 32002, 32005, 32006, 32020, 33327, 33328, 33329, 33335, 33353, 33356, 33358, 33362, 33383, 33384, 33393, 33396, 33403, 33418, 33449, 33483, 34293, 34852, 35590, 35591, 35593, 35594, 35596, 35597, 35598, 35600, 35601, 35606, 35607, 35612, 35613, 35616, 35617, 35618, 35619, 40665, 42980, 43150, 44738, 44745, 44757, 44759, 44761, 44764, 44777, 44783, 44790, 44791, 44799, 44807, 45011, 45308, 45309, 45310, 45313, 45314, 47579, 47581, 47583, 47585, 48006, 49396, 49434, 49832, 50458, 50489, 50576, 50584, 50587, 50593, 50595, 50596, 50597, 50598, 50600, 50608, 50609, 50614, 50631, 50636, 51054, 51059, 51060, 51082, 51083, 51084, 51085, 51086, 51087, 51265, 51266, 51268, 51269, 51312, 51314, 51315, 51316, 51317, 51318, 51320, 51323, 51376, 51377, 51378, 51456, 51457, 51459, 51460, 51462, 51468, 51469, 51472, 51473, 51474, 51497, 51498, 51501, 51502, 51536, 51538, 51546, 51547, 51549, 51550, 51556, 51559, 51561, 51562, 51569, 51572, 51643, 51644, 51685, 51686, 51698, 51700, 51703, 51708, 51709, 51736, 51737, 51751, 51752, 51754, 51755, 51826, 51827, 51828, 51836, 51842, 51843, 51891, 51892, 51923, 51935, 51936, 51957, 52005, 52008, 52013, 52015, 52047, 52061, 52062, 52066, 52067, 52092, 52108, 52109, 52110, 52596, 52605, 52634, 52645, 52647, 52668, 52675, 52682, 52683, 52684, 52689, 52690, 52705, 52706, 52707, 52713, 52714, 52716, 52717, 52735, 52739, 52740, 52743, 52751, 52752, 52753, 52754, 52755, 52760, 52772, 52773, 52787, 52844, 52928, 52929, 52939, 52940, 52942, 52950, 52951, 52952, 52961, 52985, 52986, 52989, 52990, 52994, 52995, 53021, 53023, 53024, 53035, 53036, 53042, 53046, 53047, 53048, 53052, 53053, 53090, 53097, 53098, 53099, 53139, 53140, 53142, 53147, 53152, 53161, 53162, 53167, 53168, 53171, 53187, 53189, 53190, 53223, 53238, 53246, 53247, 53248, 53251, 53252, 53253, 53254, 53263, 53264, 53265, 53266, 53267, 53292, 53293, 53294, 53295, 53307, 53322, 53323, 53352, 53363, 53364, 53365, 53366, 53375, 53384, 53410, 53415, 53471, 53484, 53529, 53531, 53532, 53552, 53553, 53554, 53555, 53597, 53605, 53606, 53611, 53616, 53617, 53618, 53624, 53644, 53648, 53649, 53650, 53704, 53705, 53706, 53707, 53737, 53742, 53746, 53760, 53761, 53764, 53773, 53780, 53812, 53842, 53843, 53844, 53845, 53846, 53847, 53848, 53849, 53854, 53855, 53856, 53882, 53890, 53891, 53908, 53915, 53916, 53917, 53918, 53919, 53944, 53945, 53950, 53951, 53962, 53964, 53975, 53987, 54000, 54005, 54052, 54053, 54054, 54070, 54073, 54074, 54075, 54076, 54078, 54088, 54089, 54091, 54096, 54098, 54109, 54110, 54112, 54116, 54117, 54118, 54119, 54136, 54141, 54142, 54156, 54157, 54162, 54197, 54198, 54202, 54203, 54204, 54209, 54212, 54213, 54214, 54223, 54225, 54235, 54241, 54243, 54244, 54253, 54257, 54265, 54266, 54267, 54331, 54332, 54346, 54361, 54362, 54367, 54379, 54380, 54387, 54406, 54506, 54522, 54531, 54532, 54543, 54546, 54554, 54555, 54567, 54595, 54769, 54770, 54771, 54778, 54780, 54781, 54782, 54795, 54805, 54808, 54812, 54818, 54819, 54820, 54822, 54843, 54856, 54859, 54862, 54863, 54867, 54869, 54870, 54878, 54879, 54880, 54890, 54891, 54902, 54906, 54907, 54934, 54936, 55992, 55995, 55998, 56003, 56005, 56006, 56008, 56009, 56011, 56015, 56016, 56019, 56022, 56024, 56025, 56027, 56029, 56030, 56031, 56129, 56134, 56136, 56142, 56143, 56144, 56145, 56146, 56147, 56151, 56527, 57021, 57057, 57086, 57097, 57101, 57102, 57103, 57105, 57107, 57109, 57112, 57113, 57114, 57115, 57118, 57121, 57125, 57126, 57127, 57129, 57130, 57131, 58703, 58711, 58731, 58732, 58738, 58745, 58752, 58754, 58763, 58766, 58958, 59831, 60019, 60173, 60184, 60186, 60654, 60657, 60660, 60662, 60665, 60666, 60667, 61077, 61079, 62044, 63374, 63394, 63740, 63742, 63747, 63752, 63756, 63759, 63766, 63777, 63819, 63870, 64160, 64164, 64170, 64180, 64182, 64183, 64197, 64203, 64240, 64260, 64265, 64268, 64269, 64271, 64272, 64275, 64277, 64283, 64284, 64285, 64290, 64291, 64294, 64295, 64299, 64304, 64305, 64306, 64307, 64308, 64309, 64312, 64313, 64316, 64318, 64319, 64321, 64322, 64329, 64330, 64334, 64341, 64343, 64344, 64345, 64348, 64350, 64354, 64358, 64364, 64366, 64367, 64368, 64371, 64372, 64374, 64378, 64379, 64380, 64382, 64389, 64390, 64392, 64393, 64394, 64396, 64399, 64401, 64406, 64409, 64411, 64412, 64413, 64418, 64419, 64420, 64421, 64422, 64424, 64425, 64426, 64429, 64456, 64463, 64478, 66846, 66854, 66855, 66883, 66907, 70541, 85938, 85944, 85945, 85953, 85955, 85957, 85958, 85959, 86512, 86513, 86514, 86518, 86522, 86540, 86542, 86543, 86545, 86547, 86557, 87007, 87078, 87082, 87088, 87089, 87115, 87137, 87319, 87320, 87406, 87409, 120696, 121574, 150454, 150708, 150709, 150720, 160002, 160011, 160015, 160016, 160018, 160028, 160035, 160042, 160045, 160047, 160052, 160063, 160064, 160069, 160176, 160209, 160304, 160306, 160311, 160313, 160317, 160318, 160321, 160323, 160324, 160327, 160332, 160334, 160339, 160340, 160343, 160359, 160361, 160362, 160365, 160374, 160379, 160381, 160382, 160385, 160387, 160389, 160390, 160391, 160392, 160393, 160394, 160397, 160399, 160521, 160549, 160609, 160614, 160615, 160618, 160621, 160622, 160624, 160626, 160631, 160632, 160633, 160634, 160637, 160639, 160645, 160646, 160648, 160650, 160718, 160730, 160735);
+UPDATE `gameobject` SET `VerifiedBuild`=17658 WHERE `guid` IN (364, 393, 1507, 1953, 2102, 3586, 3953, 4314, 4510, 4516, 4517, 4518, 4519, 4520, 4596, 6783, 6955, 6960, 6965, 6973, 6994, 7034, 9948, 10053, 10069, 10096, 10100, 10218, 10678, 10679, 11832, 11833, 12209, 12450, 12634, 12641, 12642, 12645, 13635, 15421, 17230, 17269, 17337, 21059, 21631, 22655, 23169, 25326, 26351, 26354, 26427, 27677, 28892, 28908, 28911, 28913, 28915, 28952, 28954, 28956, 28991, 29008, 29024, 29027, 29562, 29565, 32320, 32511, 32644, 33486, 35351, 40661, 40663, 40664, 40666, 40667, 40668, 41471, 42079, 42080, 42081, 42082, 42083, 42084, 42085, 42086, 42087, 42088, 42089, 42486, 42507, 42652, 43240, 43393, 44762, 44763, 44787, 44997, 44998, 44999, 45000, 45288, 45612, 46106, 49390, 49391, 49532, 50022, 50044, 50065, 50169, 50171, 50186, 55989, 56012, 56018, 56026, 56037, 56038, 56157, 56956, 57084, 57100, 57104, 57106, 57110, 57119, 57120, 57123, 57124, 58357, 58521, 60596, 60824, 62024, 62371, 63175, 63314, 63757, 64172, 64181, 64198, 64223, 64264, 64286, 64292, 64296, 64298, 64314, 64315, 64320, 64336, 64349, 64376, 64384, 64400, 64405, 64415, 64741, 65119, 65353, 65354, 65516, 65549, 66634, 66635, 66841, 67636, 85947, 85949, 85950, 86556, 86892, 87138, 87318, 87359, 87972, 121573, 121575, 160017, 160021, 160024, 160041, 160061, 160079, 160084, 160320, 160333, 160352, 160383, 160396, 160602, 160638, 160644, 160654);
diff --git a/sql/updates/world/2014_05_12_00_world_misc.sql b/sql/updates/world/2014_05_12_00_world_misc.sql
new file mode 100644
index 00000000000..4273921e1b6
--- /dev/null
+++ b/sql/updates/world/2014_05_12_00_world_misc.sql
@@ -0,0 +1,77 @@
+--
+-- Add missing gossip menus for horde npcs
+DELETE FROM `gossip_menu` WHERE `entry` in (10419,10420,10421,10425,10426);
+INSERT INTO `gossip_menu` (`entry`, `text_id`) VALUES
+(10419, 14458),-- Thunder Bluff
+(10420, 14459), -- Undercity
+(10421, 14460), -- Ogrimmar
+(10425, 14464), -- Sen'Jin
+(10426, 14465); -- Silvermoon
+
+-- add missing gossip options to horde vendors and remove a duplicate menu option from one of the alliance vendors which all have same text and this option is never displayed to players anyway its just for the condition for vendor.
+DELETE FROM `gossip_menu_option` WHERE `menu_id`=10417 AND `id`=1 OR `menu_id` in (10419,10420,10421,10425,10426);
+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
+(10419, 0, 1, 'I want to browse your goods.', 3, 128, 0, 0, 0, 0, ''),
+(10420, 0, 1, 'I want to browse your goods.', 3, 128, 0, 0, 0, 0, ''),
+(10421, 0, 1, 'I want to browse your goods.', 3, 128, 0, 0, 0, 0, ''),
+(10425, 0, 1, 'I want to browse your goods.', 3, 128, 0, 0, 0, 0, ''),
+(10426, 0, 1, 'I want to browse your goods.', 3, 128, 0, 0, 0, 0, '');
+
+-- Update creature template with missing gossip menu ids for horde vendors
+UPDATE `creature_template` SET `gossip_menu_id`=10426 WHERE `entry`=33557;
+UPDATE `creature_template` SET `gossip_menu_id`=10420 WHERE `entry`=33555;
+UPDATE `creature_template` SET `gossip_menu_id`=10421 WHERE `entry`=33553;
+UPDATE `creature_template` SET `gossip_menu_id`=10419 WHERE `entry`=33556;
+UPDATE `creature_template` SET `gossip_menu_id`=10425 WHERE `entry`=33554;
+
+-- Conditions for argent tournament vendors so they will not allow player to use vendor until they are a champion of that faction
+DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=15 AND `SourceGroup` IN(10417,10418,10422,10423,10424);
+INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorType`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES
+(15, 10419, 0, 0, 0, 17, 0, 2786, 0, 0, 0, 0, 0, '', 'Only allow champions of Thunderbluff to access vendor'),
+(15, 10420, 0, 0, 0, 17, 0, 2787, 0, 0, 0, 0, 0, '', 'Only allow champions of Undercity to access vendor'),
+(15, 10421, 0, 0, 0, 17, 0, 2783, 0, 0, 0, 0, 0, '', 'Only allow champions of Ogrimmar to access vendor'),
+(15, 10425, 0, 0, 0, 17, 0, 2784, 0, 0, 0, 0, 0, '', 'Only allow champions of Sen Jin to access vendor'),
+(15, 10426, 0, 0, 0, 17, 0, 2785, 0, 0, 0, 0, 0, '', 'Only allow champions of Silvermoon to access vendor'),
+(15, 10417, 0, 0, 0, 17, 0, 2781, 0, 0, 0, 0, 0, '', 'Only allow champions of Stowmwind to access vendor'),
+(15, 10418, 0, 0, 0, 17, 0, 2780, 0, 0, 0, 0, 0, '', 'Only allow champions of Ironforge to access vendor'),
+(15, 10422, 0, 0, 0, 17, 0, 2778, 0, 0, 0, 0, 0, '', 'Only allow champions of Exodar to access vendor'),
+(15, 10423, 0, 0, 0, 17, 0, 2779, 0, 0, 0, 0, 0, '', 'Only allow champions of Gnomeregan to access vendor'),
+(15, 10424, 0, 0, 0, 17, 0, 2777, 0, 0, 0, 0, 0, '', 'Only allow champions of Darnassus to access vendor');
+
+-- Add missing versions of mounts for 5 champions seals and 500g to vendors, the versions which require rep to buy which are intended for player who is not member of that faction
+DELETE FROM `npc_vendor` WHERE `item` IN(46758,46756,46759,46762,46763,46761,46764,46755,46760,46757);
+INSERT INTO `npc_vendor` (`entry`, `slot`, `item`, `maxcount`, `incrtime`, `ExtendedCost`) VALUES
+(33307, 0, 46758, 0, 0, 2671), -- Stormwind (Non Human) - Human version 46752
+(33657, 0, 46756, 0, 0, 2671), -- Exodar (Non Dreanei) - Dreanei version 46745
+(33653, 0, 46759, 0, 0, 2671), -- Darnassus (Non Night elf) - Night elf version 46744
+(33310, 0, 46762, 0, 0, 2671), -- Iron Forge (Non Dwarf) - Dwarf version 46748
+(33650, 0, 46763, 0, 0, 2671), -- Gnomeregan (Non Gnome) - Gnome version 46747
+(33557, 0, 46761, 0, 0, 2671), -- Silvermoon (Non Blood elf) - Blood Elf version 46751
+(33555, 0, 46764, 0, 0, 2671), -- Undercity (Non Undead) - Undead version 46746
+(33556, 0, 46755, 0, 0, 2671), -- Thunderbluff (Non Tauren) - Tauren version 46750
+(33554, 0, 46760, 0, 0, 2671), -- Sen Jin (Non Troll) - Troll version 46743
+(33553, 0, 46757, 0, 0, 2671); -- Orgrimmar (Non Orc) - Orchish version 46749
+
+-- Conditions to specify which version of mounts to sell, no restriction if own race, requires exhalted if not this only applys to the mounts for 5 seals and 500g not the ones for 100 seals
+DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=23 AND `SourceGroup` IN(33307,33657,33653,33310,33650,33557,33555,33556,33554,33555);
+INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorType`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES
+(23, 33307, 46758, 0, 0, 16, 0, 1, 0, 0, 1, 0, 0, '', 'Only Sell to Non Humans'),
+(23, 33307, 46752, 0, 0, 16, 0, 1, 0, 0, 0, 0, 0, '', 'Only Sell to Humans'),
+(23, 33657, 46756, 0, 0, 16, 0, 1024, 0, 0, 1, 0, 0, '', 'Only Sell to Non Dreanei'),
+(23, 33657, 46745, 0, 0, 16, 0, 1024, 0, 0, 0, 0, 0, '', 'Only Sell to Dreanei'),
+(23, 33653, 46759, 0, 0, 16, 0, 8, 0, 0, 1, 0, 0, '', 'Only Sell to Non Night elf'),
+(23, 33653, 46744, 0, 0, 16, 0, 8, 0, 0, 0, 0, 0, '', 'Only Sell to Night elf'),
+(23, 33310, 46762, 0, 0, 16, 0, 4, 0, 0, 1, 0, 0, '', 'Only Sell to Non Dwarf'),
+(23, 33310, 46748, 0, 0, 16, 0, 4, 0, 0, 0, 0, 0, '', 'Only Sell to Dwarf'),
+(23, 33650, 46753, 0, 0, 16, 0, 64, 0, 0, 1, 0, 0, '', 'Only Sell to Non Gnome'),
+(23, 33650, 46747, 0, 0, 16, 0, 64, 0, 0, 0, 0, 0, '', 'Only Sell to Gnome'),
+(23, 33557, 46761, 0, 0, 16, 0, 512, 0, 0, 1, 0, 0, '', 'Only Sell to Non Blood elf'),
+(23, 33557, 46751, 0, 0, 16, 0, 512, 0, 0, 0, 0, 0, '', 'Only Sell to Blood elf'),
+(23, 33555, 46764, 0, 0, 16, 0, 16, 0, 0, 1, 0, 0, '', 'Only Sell to Non Undead'),
+(23, 33555, 46746, 0, 0, 16, 0, 16, 0, 0, 0, 0, 0, '', 'Only Sell to Undead'),
+(23, 33556, 46755, 0, 0, 16, 0, 32, 0, 0, 1, 0, 0, '', 'Only Sell to Non Tauren'),
+(23, 33556, 46750, 0, 0, 16, 0, 32, 0, 0, 0, 0, 0, '', 'Only Sell to Tauren'),
+(23, 33554, 46760, 0, 0, 16, 0, 128, 0, 0, 1, 0, 0, '', 'Only Sell to Non Troll'),
+(23, 33554, 46743, 0, 0, 16, 0, 128, 0, 0, 0, 0, 0, '', 'Only Sell to Troll'),
+(23, 33657, 46757, 0, 0, 16, 0, 2, 0, 0, 1, 0, 0, '', 'Only Sell to Non Orc'),
+(23, 33653, 46749, 0, 0, 16, 0, 2, 0, 0, 0, 0, 0, '', 'Only Sell to Orc');
diff --git a/sql/updates/world/2014_05_12_01_world_creature_template.sql b/sql/updates/world/2014_05_12_01_world_creature_template.sql
new file mode 100644
index 00000000000..2367789b6e4
--- /dev/null
+++ b/sql/updates/world/2014_05_12_01_world_creature_template.sql
@@ -0,0 +1,2 @@
+-- update Antipersonnel Cannon (1) immune mask to be the same as lvl 70 version
+UPDATE `creature_template` SET `mechanic_immune_mask`=`mechanic_immune_mask`|2|8|32|64|256|512|1024|4096|8192|65536|262144|8388608|268435456 WHERE `entry`=32795;
diff --git a/sql/updates/world/2014_05_13_00_world_conditions.sql b/sql/updates/world/2014_05_13_00_world_conditions.sql
new file mode 100644
index 00000000000..75fd2e1a950
--- /dev/null
+++ b/sql/updates/world/2014_05_13_00_world_conditions.sql
@@ -0,0 +1,2 @@
+--
+UPDATE `conditions` SET `SourceEntry`=46763 WHERE `SourceEntry`=46753;
diff --git a/sql/updates/world/2014_05_18_00_world_misc.sql b/sql/updates/world/2014_05_18_00_world_misc.sql
new file mode 100644
index 00000000000..fe0b59dc32f
--- /dev/null
+++ b/sql/updates/world/2014_05_18_00_world_misc.sql
@@ -0,0 +1,17 @@
+--
+UPDATE `creature_template` SET `npcflag`=3, `AIName`='SmartAI' WHERE `entry`=37120;
+
+DELETE FROM `gossip_menu_option` WHERE `menu_id`=10910 AND `id`=1;
+INSERT INTO `gossip_menu_option` (`menu_id`, `id`, `option_text`, `OptionBroadcastTextID`, `option_id`, `npc_option_npcflag`) VALUES
+(10910, 1, 'I must ask that you reforge Shadow''s Edge for me, Highlord Mograine.', 37855, 1, 1);
+
+DELETE FROM `smart_scripts` WHERE `entryorguid`=37120;
+INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES
+(37120, 0, 0, 0, 62, 0, 100, 0, 10910, 1, 0, 0, 11, 72995, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'Highlord Darion Mograine - On Gossip Option 1 Selected - Cast Shadow''s Edge'),
+(37120, 0, 1, 0, 62, 0, 100, 0, 10910, 1, 0, 0, 72, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'Highlord Darion Mograine - On Gossip Option 1 Selected - Close Gossip');
+
+DELETE FROM `conditions` WHERE `SourceGroup`=10910;
+INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorType`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES
+(15, 10910, 1, 0, 0, 8, 0, 24912, 0, 0, 1, 0, 0, '', 'Highlord Darion Mograine: Hide Gossip option if player has quest 24912 rewarded'),
+(15, 10910, 1, 0, 0, 8, 0, 24743, 0, 0, 0, 0, 0, '', 'Highlord Darion Mograine: Show Gossip option if player has quest 24743 rewarded'),
+(15, 10910, 1, 0, 0, 2, 0, 49888, 1, 0, 1, 0, 0, '', 'Highlord Darion Mograine: Show Gossip option if player does not have Shadow''s Edge');
diff --git a/sql/updates/world/2014_05_18_01_world_misc.sql b/sql/updates/world/2014_05_18_01_world_misc.sql
new file mode 100644
index 00000000000..66df66dc7b5
--- /dev/null
+++ b/sql/updates/world/2014_05_18_01_world_misc.sql
@@ -0,0 +1,37 @@
+--
+SET @ENTRY := 27914;
+UPDATE `creature_template` SET `gossip_menu_id`=9619, `npcflag`=129 WHERE `entry`=@ENTRY;
+
+DELETE FROM `gossip_menu_option` WHERE `menu_id`=9619;
+INSERT INTO `gossip_menu_option` (`menu_id`, `id`, `option_icon`, `option_text`, `OptionBroadcastTextID`, `option_id`, `npc_option_npcflag`, `action_menu_id`, `action_poi_id`, `box_coded`, `box_money`, `box_text`, `BoxBroadcastTextID`) VALUES
+(9619, 0, 0, 'How does this work?', 27298, 1, 1, 9620, 0, 0, 0, '', 0),
+(9619, 1, 1, 'Show me what you have to trade.', 27299, 3, 128, 0, 0, 0, 0, '', 0);
+
+DELETE FROM `gossip_menu` WHERE `entry` IN (9619,9620) AND `text_id` IN (13005,13006);
+INSERT INTO `gossip_menu` (`entry`, `text_id`) VALUES
+(9619, 13005),
+(9620, 13006);
+
+DELETE FROM `creature_text` WHERE `entry`=@ENTRY;
+INSERT INTO `creature_text` (`entry`, `groupid`, `id`, `text`, `type`, `language`, `probability`, `emote`, `duration`, `sound`, `comment`, `BroadcastTextID`) VALUES
+(@ENTRY, 0, 0, 'I have arrived. Shall we set to work, then?', 12, 0, 100, 0, 0, 0, 'Ethereal Soul-Trader', 27295),
+(@ENTRY, 1, 0, 'Ah, more essence to capture...', 12, 0, 100, 0, 0, 0, 'Ethereal Soul-Trader', 27336),
+(@ENTRY, 2, 0, 'Here is your share.', 12, 0, 100, 0, 0, 0, 'Ethereal Soul-Trader', 27341);
+
+DELETE FROM `npc_text` WHERE `ID` IN (13005,13006);
+INSERT INTO `npc_text` (`ID`, `text0_0`, `text0_1`, `BroadcastTextID0`, `lang0`, `prob0`, `em0_0`, `em0_1`, `em0_2`, `em0_3`, `em0_4`, `em0_5`, `text1_0`, `text1_1`, `BroadcastTextID1`, `lang1`, `prob1`, `em1_0`, `em1_1`, `em1_2`, `em1_3`, `em1_4`, `em1_5`, `text2_0`, `text2_1`, `BroadcastTextID2`, `lang2`, `prob2`, `em2_0`, `em2_1`, `em2_2`, `em2_3`, `em2_4`, `em2_5`, `text3_0`, `text3_1`, `BroadcastTextID3`, `lang3`, `prob3`, `em3_0`, `em3_1`, `em3_2`, `em3_3`, `em3_4`, `em3_5`, `text4_0`, `text4_1`, `BroadcastTextID4`, `lang4`, `prob4`, `em4_0`, `em4_1`, `em4_2`, `em4_3`, `em4_4`, `em4_5`, `text5_0`, `text5_1`, `BroadcastTextID5`, `lang5`, `prob5`, `em5_0`, `em5_1`, `em5_2`, `em5_3`, `em5_4`, `em5_5`, `text6_0`, `text6_1`, `BroadcastTextID6`, `lang6`, `prob6`, `em6_0`, `em6_1`, `em6_2`, `em6_3`, `em6_4`, `em6_5`, `text7_0`, `text7_1`, `BroadcastTextID7`, `lang7`, `prob7`, `em7_0`, `em7_1`, `em7_2`, `em7_3`, `em7_4`, `em7_5`, `VerifiedBuild`) VALUES
+(13005, 'How may this one help you, $gsir:madame;?', '', 27296, 0, 1, 0, 0, 0, 0, 0, 0, '', '', 0, 0, 0, 0, 0, 0, 0, 0, 0, '', '', 0, 0, 0, 0, 0, 0, 0, 0, 0, '', '', 0, 0, 0, 0, 0, 0, 0, 0, 0, '', '', 0, 0, 0, 0, 0, 0, 0, 0, 0, '', '', 0, 0, 0, 0, 0, 0, 0, 0, 0, '', '', 0, 0, 0, 0, 0, 0, 0, 0, 0, '', '', 0, 0, 0, 0, 0, 0, 0, 0, 0, 18019),
+(13006, 'My business partner slays things; I drain a portion of their essence... a pittance, really; the slightest of slivers. It won''t be missed.$B$BStill, to fulfil my portion of the contract, I pay in Ethereal Credits.$B$BOne may redeem these credits for items I sell at any time. I''m bound to have something that will interest you...', '', 27300, 0, 1, 0, 0, 0, 0, 0, 0, '', '', 0, 0, 0, 0, 0, 0, 0, 0, 0, '', '', 0, 0, 0, 0, 0, 0, 0, 0, 0, '', '', 0, 0, 0, 0, 0, 0, 0, 0, 0, '', '', 0, 0, 0, 0, 0, 0, 0, 0, 0, '', '', 0, 0, 0, 0, 0, 0, 0, 0, 0, '', '', 0, 0, 0, 0, 0, 0, 0, 0, 0, '', '', 0, 0, 0, 0, 0, 0, 0, 0, 0, 18019);
+
+DELETE FROM `npc_vendor` WHERE `entry`=@ENTRY;
+INSERT INTO `npc_vendor` (`entry`, `slot`, `item`, `maxcount`, `incrtime`, `ExtendedCost`) VALUES
+(@ENTRY, 0, 38308, 0, 0, 2411), -- Ethereal Essence Sphere
+(@ENTRY, 1, 38300, 0, 0, 2411), -- Diluted Ethereum Essence
+(@ENTRY, 2, 38294, 0, 0, 2412), -- Ethereal Liqueur
+(@ENTRY, 3, 38291, 0, 0, 2408), -- Ethereal Mutagen
+(@ENTRY, 4, 38163, 0, 0, 2408), -- Soul-Trader's Head Wrap
+(@ENTRY, 5, 38160, 0, 0, 2410), -- Soul-trader's Bindings
+(@ENTRY, 6, 38286, 0, 0, 2407), -- Soul-Trader's Pauldrons
+(@ENTRY, 7, 38285, 0, 0, 2408), -- Soul-Trader's Waistband
+(@ENTRY, 8, 38161, 0, 0, 2409), -- Soul-Trader's Gloves
+(@ENTRY, 9, 38162, 0, 0, 2409); -- Soul-Trader's Boots
diff --git a/sql/updates/world/2014_05_18_02_world_gameobject.sql b/sql/updates/world/2014_05_18_02_world_gameobject.sql
new file mode 100644
index 00000000000..0d3357de2a1
--- /dev/null
+++ b/sql/updates/world/2014_05_18_02_world_gameobject.sql
@@ -0,0 +1,4 @@
+--
+UPDATE `gameobject` SET `position_x`=914.3752, `position_y`=-146.9912, `position_z`=-49.75655, `orientation`=3.68265, `VerifiedBuild`=15595 WHERE `guid`=43097;
+UPDATE `gameobject` SET `position_x`=915.7144, `position_y`=-149.2887, `position_z`=-49.75705, `orientation`=3.647741, `VerifiedBuild`=15595 WHERE `guid`=43098;
+UPDATE `gameobject` SET `position_x`=917.0272, `position_y`=-151.5825, `position_z`=-49.75756, `orientation`=3.647741, `VerifiedBuild`=15595 WHERE `guid`=43099;
diff --git a/sql/updates/world/2014_05_18_03_world_misc.sql b/sql/updates/world/2014_05_18_03_world_misc.sql
new file mode 100644
index 00000000000..86d018dd7b0
--- /dev/null
+++ b/sql/updates/world/2014_05_18_03_world_misc.sql
@@ -0,0 +1,48 @@
+--
+-- Nesingwary Lackey Ear (35188) drop chance fix by nelegalno
+-- Needed for Can't Get Ear-nough... (11867) "turn in only" repeatable quest
+SET @EAR := 35188;
+
+UPDATE `creature_loot_template` SET `ChanceOrQuestChance` = ABS(`ChanceOrQuestChance`) WHERE `item`=@EAR;
+
+-- Clam Master K
+DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=1 AND `SourceGroup`=25800 AND `SourceEntry`=@EAR;
+INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`SourceId`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionTarget`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`NegativeCondition`,`ErrorTextId`,`ScriptName`,`Comment`) VALUES
+(1,25800,@EAR,0,0,9,0,11866,0,0,0,0,'',"Nesingwary Lackey Ear drops from Clam Master K only if Ears of Our Enemies quest taken"),
+(1,25800,@EAR,0,1,8,0,11866,0,0,0,0,'',"Nesingwary Lackey Ear drops from Clam Master K only if Ears of Our Enemies quest rewarded");
+
+-- Loot Crazed Poacher
+DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=1 AND `SourceGroup`=25806 AND `SourceEntry`=@EAR;
+INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`SourceId`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionTarget`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`NegativeCondition`,`ErrorTextId`,`ScriptName`,`Comment`) VALUES
+(1,25806,@EAR,0,0,9,0,11866,0,0,0,0,'',"Nesingwary Lackey Ear drops from Loot Crazed Poacher only if Ears of Our Enemies quest taken"),
+(1,25806,@EAR,0,1,8,0,11866,0,0,0,0,'',"Nesingwary Lackey Ear drops from Loot Crazed Poacher only if Ears of Our Enemies quest rewarded");
+
+-- Loot Crazed Diver
+DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=1 AND `SourceGroup`=25836 AND `SourceEntry`=@EAR;
+INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`SourceId`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionTarget`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`NegativeCondition`,`ErrorTextId`,`ScriptName`,`Comment`) VALUES
+(1,25836,@EAR,0,0,9,0,11866,0,0,0,0,'',"Nesingwary Lackey Ear drops from Loot Crazed Diver only if Ears of Our Enemies quest taken"),
+(1,25836,@EAR,0,1,8,0,11866,0,0,0,0,'',"Nesingwary Lackey Ear drops from Loot Crazed Diver only if Ears of Our Enemies quest rewarded");
+
+-- Northsea Mercenary
+DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=1 AND `SourceGroup`=25839 AND `SourceEntry`=@EAR;
+INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`SourceId`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionTarget`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`NegativeCondition`,`ErrorTextId`,`ScriptName`,`Comment`) VALUES
+(1,25839,@EAR,0,0,9,0,11866,0,0,0,0,'',"Nesingwary Lackey Ear drops from Northsea Mercenary only if Ears of Our Enemies quest taken"),
+(1,25839,@EAR,0,1,8,0,11866,0,0,0,0,'',"Nesingwary Lackey Ear drops from Northsea Mercenary only if Ears of Our Enemies quest rewarded");
+
+-- Northsea Thug
+DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=1 AND `SourceGroup`=25843 AND `SourceEntry`=@EAR;
+INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`SourceId`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionTarget`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`NegativeCondition`,`ErrorTextId`,`ScriptName`,`Comment`) VALUES
+(1,25843,@EAR,0,0,9,0,11866,0,0,0,0,'',"Nesingwary Lackey Ear drops from Northsea Thug only if Ears of Our Enemies quest taken"),
+(1,25843,@EAR,0,1,8,0,11866,0,0,0,0,'',"Nesingwary Lackey Ear drops from Northsea Thug only if Ears of Our Enemies quest rewarded");
+
+ -- Minion of Kaw
+DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=1 AND `SourceGroup`=25880 AND `SourceEntry`=@EAR;
+INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`SourceId`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionTarget`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`NegativeCondition`,`ErrorTextId`,`ScriptName`,`Comment`) VALUES
+(1,25880,@EAR,0,0,9,0,11866,0,0,0,0,'',"Nesingwary Lackey Ear drops from Minion of Kaw only if Ears of Our Enemies quest taken"),
+(1,25880,@EAR,0,1,8,0,11866,0,0,0,0,'',"Nesingwary Lackey Ear drops from Minion of Kaw only if Ears of Our Enemies quest rewarded");
+
+ -- Loot Crazed Hunter
+DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=1 AND `SourceGroup`=25979 AND `SourceEntry`=@EAR;
+INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`SourceId`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionTarget`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`NegativeCondition`,`ErrorTextId`,`ScriptName`,`Comment`) VALUES
+(1,25979,@EAR,0,0,9,0,11866,0,0,0,0,'',"Nesingwary Lackey Ear drops from Loot Crazed Hunter only if Ears of Our Enemies quest taken"),
+(1,25979,@EAR,0,1,8,0,11866,0,0,0,0,'',"Nesingwary Lackey Ear drops from Loot Crazed Hunter only if Ears of Our Enemies quest rewarded");
diff --git a/sql/updates/world/2014_05_18_04_world_misc.sql b/sql/updates/world/2014_05_18_04_world_misc.sql
new file mode 100644
index 00000000000..89dc227f7ca
--- /dev/null
+++ b/sql/updates/world/2014_05_18_04_world_misc.sql
@@ -0,0 +1,28 @@
+--
+SET @CGUID := 68279; -- set by TDB team (3)
+SET @OGUID := 6134; -- set by TDB team (2)
+
+DELETE FROM `spell_area` WHERE `spell`=71314;
+INSERT INTO `spell_area` (`spell`, `area`, `quest_start`, `quest_end`, `aura_spell`, `racemask`, `gender`, `autocast`, `quest_start_status`, `quest_end_status`) VALUES
+(71314, 4862, 24559, 24562, 0, 0, 2, 1, 74, 11);
+
+DELETE FROM `creature_addon` WHERE `guid` BETWEEN @CGUID+0 AND @CGUID+2;
+INSERT INTO `creature_addon` (`guid`, `path_id`, `mount`, `bytes1`, `bytes2`, `emote`, `auras`) VALUES
+(@CGUID+0, 0, 0, 0x10000, 0x1, 0, '71312'),
+(@CGUID+1, 0, 0, 0x10000, 0x1, 0, '71312'),
+(@CGUID+2, 0, 0, 0x10000, 0x1, 0, '71312');
+
+DELETE FROM `creature` WHERE `guid` BETWEEN @CGUID+0 AND @CGUID+2;
+INSERT INTO `creature` (`guid`, `id`, `map`, `spawnMask`, `phaseMask`, `position_x`, `position_y`, `position_z`, `orientation`, `spawntimesecs`, `spawndist`, `MovementType`) VALUES
+(@CGUID+0, 36657, 571, 1, 1, 5630.028, 2082.906, 798.1375, 0, 120, 0, 0), -- Sunreaver War Mage (Area: 210)
+(@CGUID+1, 36642, 571, 1, 1, 5630.374, 2087.88, 798.1375, 6.213372, 120, 0, 0), -- Myralion Sunblaze (Area: 210)
+(@CGUID+2, 36657, 571, 1, 1, 5631.038, 2092.561, 798.1375, 6.143559, 120, 0, 0); -- Sunreaver War Mage (Area: 210)
+
+DELETE FROM `gameobject` WHERE `guid` BETWEEN @OGUID+0 AND @OGUID+1;
+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, 202192, 571, 1, 1, 5628.946, 2079.644, 798.0542, 0.6457717, 0, 0, 0, 1, 120, 255, 1), -- Sunreaver Banner (Area: 210)
+(@OGUID+1, 202192, 571, 1, 1, 5630.607, 2096.247, 798.0542, 5.881761, 0, 0, 0, 1, 120, 255, 1); -- Sunreaver Banner (Area: 210)
+
+DELETE FROM `gameobject_template` WHERE `entry`=202192;
+INSERT INTO `gameobject_template` (`entry`, `type`, `displayId`, `name`, `IconName`, `castBarCaption`, `unk1`, `faction`, `flags`, `size`, `questItem1`, `questItem2`, `questItem3`, `questItem4`, `questItem5`, `questItem6`, `data0`, `data1`, `data2`, `data3`, `data4`, `data5`, `data6`, `data7`, `data8`, `data9`, `data10`, `data11`, `data12`, `data13`, `data14`, `data15`, `data16`, `data17`, `data18`, `data19`, `data20`, `data21`, `data22`, `data23`, `AIName`, `ScriptName`, `VerifiedBuild`) VALUES
+(202192, 5, 6794, 'Sunreaver Banner', '', '', '', 0, 0, 0.8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, '', '', 16992);
diff --git a/sql/updates/world/2014_05_19_00_world_misc.sql b/sql/updates/world/2014_05_19_00_world_misc.sql
new file mode 100644
index 00000000000..7879aca132d
--- /dev/null
+++ b/sql/updates/world/2014_05_19_00_world_misc.sql
@@ -0,0 +1,10 @@
+--
+UPDATE `smart_scripts` SET `event_phase_mask`=0 WHERE `entryorguid`=24539 AND `source_type`=0 AND `id` IN(5,6) AND `link`=0;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=2453900 AND `source_type`=9 AND `id`=5 AND `link`=0;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=2453901 AND `source_type`=9 AND `id`=4 AND `link`=0;
+UPDATE `smart_scripts` SET `event_param3`=0, `event_param4`=0 WHERE `entryorguid`=24539 AND `source_type`=0 AND `id`=4 AND `link`=0;
+
+DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=22 AND `SourceEntry`=24539;
+INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorType`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES
+(22, 6, 24539, 0, 0, 38, 1, 50, 4, 0, 0, 0, 0, '', 'Silvermoon Harry - Only run SAI if silvermoon harry hp at 50% or lower'),
+(22, 6, 24539, 0, 0, 9, 0, 11464, 0, 0, 0, 0, 0, '', 'Silvermoon Harry - Only run SAI if player has gambling debt taken');
diff --git a/sql/updates/world/2014_05_19_01_world_misc.sql b/sql/updates/world/2014_05_19_01_world_misc.sql
new file mode 100644
index 00000000000..d25e73f245e
--- /dev/null
+++ b/sql/updates/world/2014_05_19_01_world_misc.sql
@@ -0,0 +1,8 @@
+--
+DELETE FROM `smart_scripts` WHERE `entryorguid`=26737 AND `source_type`=0 AND `id`=5;
+INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES
+(26737, 0, 5, 0, 25, 0, 100, 0, 0, 0, 0, 0, 19, 537133824, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Crazed Mana-Surge - On Reset - Remove Unit Flags (UNK_29 / STUNNED / IMMUNE TO NPC / IMMUNE TO PC)');
+
+DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=22 AND `SourceEntry`=26737;
+INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorType`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES
+(22, 6, 26737, 0, 0, 1, 1, 29266, 0, 0, 1, 0, 0, '', 'Crazed Mana Surge only run SAI if Crazed mana surge does not have aura Permanent Feign Death');
diff --git a/src/server/authserver/Authentication/AuthCodes.cpp b/src/server/authserver/Authentication/AuthCodes.cpp
index bb278dd6653..55517884b8e 100644
--- a/src/server/authserver/Authentication/AuthCodes.cpp
+++ b/src/server/authserver/Authentication/AuthCodes.cpp
@@ -79,4 +79,4 @@ namespace AuthHelper
return NULL;
}
-};
+}
diff --git a/src/server/authserver/Authentication/AuthCodes.h b/src/server/authserver/Authentication/AuthCodes.h
index 5e6522f8981..97b4779da0e 100644
--- a/src/server/authserver/Authentication/AuthCodes.h
+++ b/src/server/authserver/Authentication/AuthCodes.h
@@ -92,6 +92,6 @@ namespace AuthHelper
bool IsAcceptedClientBuild(int build);
bool IsPostBCAcceptedClientBuild(int build);
bool IsPreBCAcceptedClientBuild(int build);
-};
+}
#endif
diff --git a/src/server/game/AI/CoreAI/UnitAI.cpp b/src/server/game/AI/CoreAI/UnitAI.cpp
index 8bf34527769..9631b75fe06 100644
--- a/src/server/game/AI/CoreAI/UnitAI.cpp
+++ b/src/server/game/AI/CoreAI/UnitAI.cpp
@@ -28,7 +28,6 @@
void UnitAI::AttackStart(Unit* victim)
{
-
if (victim && me->Attack(victim, true))
me->GetMotionMaster()->MoveChase(victim);
}
diff --git a/src/server/game/AI/ScriptedAI/ScriptedCreature.cpp b/src/server/game/AI/ScriptedAI/ScriptedCreature.cpp
index 36c1d384693..c205dd908c7 100644
--- a/src/server/game/AI/ScriptedAI/ScriptedCreature.cpp
+++ b/src/server/game/AI/ScriptedAI/ScriptedCreature.cpp
@@ -478,10 +478,7 @@ void BossAI::_JustDied()
events.Reset();
summons.DespawnAll();
if (instance)
- {
instance->SetBossState(_bossId, DONE);
- instance->SaveToDB();
- }
}
void BossAI::_EnterCombat()
diff --git a/src/server/game/AI/SmartScripts/SmartAI.cpp b/src/server/game/AI/SmartScripts/SmartAI.cpp
index 098f3130fed..e769b7c22a5 100644
--- a/src/server/game/AI/SmartScripts/SmartAI.cpp
+++ b/src/server/game/AI/SmartScripts/SmartAI.cpp
@@ -618,10 +618,7 @@ void SmartAI::DamageTaken(Unit* doneBy, uint32& damage)
{
GetScript()->ProcessEventsFor(SMART_EVENT_DAMAGED, doneBy, damage);
if (mInvincibilityHpLevel && (damage >= me->GetHealth() - mInvincibilityHpLevel))
- {
- damage = 0;
- me->SetHealth(mInvincibilityHpLevel);
- }
+ damage = me->GetHealth() - mInvincibilityHpLevel; // damage should not be nullified, because of player damage req.
}
void SmartAI::HealReceived(Unit* doneBy, uint32& addhealth)
diff --git a/src/server/game/Calendar/CalendarMgr.cpp b/src/server/game/Calendar/CalendarMgr.cpp
index 52ed50f3948..a4cb972e625 100644
--- a/src/server/game/Calendar/CalendarMgr.cpp
+++ b/src/server/game/Calendar/CalendarMgr.cpp
@@ -17,7 +17,6 @@
#include "CalendarMgr.h"
#include "QueryResult.h"
-#include "DatabaseEnv.h"
#include "Log.h"
#include "Player.h"
#include "GuildMgr.h"
@@ -128,6 +127,12 @@ void CalendarMgr::AddEvent(CalendarEvent* calendarEvent, CalendarSendEventType s
void CalendarMgr::AddInvite(CalendarEvent* calendarEvent, CalendarInvite* invite)
{
+ SQLTransaction dummy;
+ AddInvite(calendarEvent, invite, dummy);
+}
+
+void CalendarMgr::AddInvite(CalendarEvent* calendarEvent, CalendarInvite* invite, SQLTransaction& trans)
+{
if (!calendarEvent->IsGuildAnnouncement())
SendCalendarEventInvite(*invite);
@@ -137,7 +142,7 @@ void CalendarMgr::AddInvite(CalendarEvent* calendarEvent, CalendarInvite* invite
if (!calendarEvent->IsGuildAnnouncement())
{
_invites[invite->GetEventId()].push_back(invite);
- UpdateInvite(invite);
+ UpdateInvite(invite, trans);
}
}
@@ -221,7 +226,6 @@ void CalendarMgr::RemoveInvite(uint64 inviteId, uint64 eventId, uint64 /*remover
void CalendarMgr::UpdateEvent(CalendarEvent* calendarEvent)
{
- SQLTransaction trans = CharacterDatabase.BeginTransaction();
PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_REP_CALENDAR_EVENT);
stmt->setUInt64(0, calendarEvent->GetEventId());
stmt->setUInt32(1, GUID_LOPART(calendarEvent->GetCreatorGUID()));
@@ -232,13 +236,17 @@ void CalendarMgr::UpdateEvent(CalendarEvent* calendarEvent)
stmt->setUInt32(6, uint32(calendarEvent->GetEventTime()));
stmt->setUInt32(7, calendarEvent->GetFlags());
stmt->setUInt32(8, calendarEvent->GetTimeZoneTime()); // correct?
- trans->Append(stmt);
- CharacterDatabase.CommitTransaction(trans);
+ CharacterDatabase.Execute(stmt);
}
void CalendarMgr::UpdateInvite(CalendarInvite* invite)
{
- SQLTransaction trans = CharacterDatabase.BeginTransaction();
+ SQLTransaction dummy;
+ UpdateInvite(invite, dummy);
+}
+
+void CalendarMgr::UpdateInvite(CalendarInvite* invite, SQLTransaction& trans)
+{
PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_REP_CALENDAR_INVITE);
stmt->setUInt64(0, invite->GetInviteId());
stmt->setUInt64(1, invite->GetEventId());
@@ -248,8 +256,7 @@ void CalendarMgr::UpdateInvite(CalendarInvite* invite)
stmt->setUInt32(5, uint32(invite->GetStatusTime()));
stmt->setUInt8(6, invite->GetRank());
stmt->setString(7, invite->GetText());
- trans->Append(stmt);
- CharacterDatabase.CommitTransaction(trans);
+ CharacterDatabase.ExecuteOrAppend(trans, stmt);
}
void CalendarMgr::RemoveAllPlayerEventsAndInvites(uint64 guid)
diff --git a/src/server/game/Calendar/CalendarMgr.h b/src/server/game/Calendar/CalendarMgr.h
index da185d519d5..8f44b013e5c 100644
--- a/src/server/game/Calendar/CalendarMgr.h
+++ b/src/server/game/Calendar/CalendarMgr.h
@@ -20,6 +20,7 @@
#include <ace/Singleton.h>
#include "Common.h"
+#include "DatabaseEnv.h"
#include "WorldPacket.h"
enum CalendarMailAnswers
@@ -305,8 +306,10 @@ class CalendarMgr
void UpdateEvent(CalendarEvent* calendarEvent);
void AddInvite(CalendarEvent* calendarEvent, CalendarInvite* invite);
+ void AddInvite(CalendarEvent* calendarEvent, CalendarInvite* invite, SQLTransaction& trans);
void RemoveInvite(uint64 inviteId, uint64 eventId, uint64 remover);
void UpdateInvite(CalendarInvite* invite);
+ void UpdateInvite(CalendarInvite* invite, SQLTransaction& trans);
void RemoveAllPlayerEventsAndInvites(uint64 guid);
void RemovePlayerGuildEventsAndSignups(uint64 guid, uint32 guildId);
diff --git a/src/server/game/DataStores/DBCStores.cpp b/src/server/game/DataStores/DBCStores.cpp
index 9b0465a4536..44f03b6978d 100644
--- a/src/server/game/DataStores/DBCStores.cpp
+++ b/src/server/game/DataStores/DBCStores.cpp
@@ -139,6 +139,7 @@ DBCStorage <MovieEntry> sMovieStore(MovieEntryfmt);
DBCStorage <OverrideSpellDataEntry> sOverrideSpellDataStore(OverrideSpellDatafmt);
+DBCStorage <PowerDisplayEntry> sPowerDisplayStore(PowerDisplayfmt);
DBCStorage <PvPDifficultyEntry> sPvPDifficultyStore(PvPDifficultyfmt);
DBCStorage <QuestSortEntry> sQuestSortStore(QuestSortEntryfmt);
@@ -391,6 +392,7 @@ void LoadDBCStores(const std::string& dataPath)
LoadDBC(availableDbcLocales, bad_dbc_files, sOverrideSpellDataStore, dbcPath, "OverrideSpellData.dbc");
+ LoadDBC(availableDbcLocales, bad_dbc_files, sPowerDisplayStore, dbcPath, "PowerDisplay.dbc");
LoadDBC(availableDbcLocales, bad_dbc_files, sPvPDifficultyStore, dbcPath, "PvpDifficulty.dbc");
for (uint32 i = 0; i < sPvPDifficultyStore.GetNumRows(); ++i)
if (PvPDifficultyEntry const* entry = sPvPDifficultyStore.LookupEntry(i))
diff --git a/src/server/game/DataStores/DBCStores.h b/src/server/game/DataStores/DBCStores.h
index b77db950541..fe775dfda19 100644
--- a/src/server/game/DataStores/DBCStores.h
+++ b/src/server/game/DataStores/DBCStores.h
@@ -141,6 +141,7 @@ extern DBCStorage <MapEntry> sMapStore;
extern MapDifficultyMap sMapDifficultyMap;
extern DBCStorage <MovieEntry> sMovieStore;
extern DBCStorage <OverrideSpellDataEntry> sOverrideSpellDataStore;
+extern DBCStorage <PowerDisplayEntry> sPowerDisplayStore;
extern DBCStorage <QuestSortEntry> sQuestSortStore;
extern DBCStorage <QuestXPEntry> sQuestXPStore;
extern DBCStorage <QuestFactionRewEntry> sQuestFactionRewardStore;
diff --git a/src/server/game/DataStores/DBCStructure.h b/src/server/game/DataStores/DBCStructure.h
index abe7bde4bf5..5d6c8c7aa89 100644
--- a/src/server/game/DataStores/DBCStructure.h
+++ b/src/server/game/DataStores/DBCStructure.h
@@ -1398,6 +1398,16 @@ struct OverrideSpellDataEntry
//uint32 unk0; // 11
};
+struct PowerDisplayEntry
+{
+ uint32 Id; // 0
+ uint32 PowerType; // 1
+ //char* Name; // 2
+ //uint32 R; // 3
+ //uint32 G; // 4
+ //uint32 B; // 5
+};
+
struct PvPDifficultyEntry
{
//uint32 id; // 0 m_ID
@@ -1982,7 +1992,7 @@ struct VehicleEntry
uint32 m_uiLocomotionType; // 34
float m_msslTrgtImpactTexRadius; // 35
uint32 m_uiSeatIndicatorType; // 36
- uint32 m_powerType; // 37, new in 3.1
+ uint32 m_powerDisplayId; // 37, new in 3.1
// 38, new in 3.1
// 39, new in 3.1
};
diff --git a/src/server/game/DataStores/DBCfmt.h b/src/server/game/DataStores/DBCfmt.h
index 35a8eecb708..222353467f4 100644
--- a/src/server/game/DataStores/DBCfmt.h
+++ b/src/server/game/DataStores/DBCfmt.h
@@ -91,6 +91,7 @@ char const OverrideSpellDatafmt[] = "niiiiiiiiiix";
char const QuestFactionRewardfmt[] = "niiiiiiiiii";
char const QuestSortEntryfmt[] = "nxxxxxxxxxxxxxxxxx";
char const QuestXPfmt[] = "niiiiiiiiii";
+char const PowerDisplayfmt[] = "nixxxx";
char const PvPDifficultyfmt[] = "diiiii";
char const RandomPropertiesPointsfmt[] = "niiiiiiiiiiiiiii";
char const ScalingStatDistributionfmt[] = "niiiiiiiiiiiiiiiiiiiii";
diff --git a/src/server/game/Entities/Creature/Creature.cpp b/src/server/game/Entities/Creature/Creature.cpp
index 36997eb884a..01621637985 100644
--- a/src/server/game/Entities/Creature/Creature.cpp
+++ b/src/server/game/Entities/Creature/Creature.cpp
@@ -569,7 +569,7 @@ void Creature::Update(uint32 diff)
if (getPowerType() == POWER_ENERGY)
{
- if (!IsVehicle() || GetVehicleKit()->GetVehicleInfo()->m_powerType != POWER_PYRITE)
+ if (!IsVehicle() || GetVehicleKit()->GetVehicleInfo()->m_powerDisplayId != POWER_PYRITE)
Regenerate(POWER_ENERGY);
}
else
diff --git a/src/server/game/Entities/GameObject/GameObject.cpp b/src/server/game/Entities/GameObject/GameObject.cpp
index 8051c757bf2..306e4209e4d 100644
--- a/src/server/game/Entities/GameObject/GameObject.cpp
+++ b/src/server/game/Entities/GameObject/GameObject.cpp
@@ -526,7 +526,7 @@ void GameObject::Update(uint32 diff)
{
case GAMEOBJECT_TYPE_DOOR:
case GAMEOBJECT_TYPE_BUTTON:
- if (GetGOInfo()->GetAutoCloseTime() && (m_cooldownTime < time(NULL)))
+ if (m_cooldownTime && (m_cooldownTime < time(NULL)))
ResetDoorOrButton();
break;
case GAMEOBJECT_TYPE_GOOBER:
@@ -568,10 +568,12 @@ void GameObject::Update(uint32 diff)
CastSpell(target, goInfo->trap.spellId);
// Template value or 4 seconds
- m_cooldownTime = time(NULL) + (goInfo->trap.cooldown ? goInfo->trap.cooldown : uint32(4));
+ m_cooldownTime = time(NULL) + (goInfo->trap.cooldown ? goInfo->trap.cooldown : uint32(4));
if (goInfo->trap.type == 1)
SetLootState(GO_JUST_DEACTIVATED);
+ else if (!goInfo->trap.type)
+ SetLootState(GO_READY);
// Battleground gameobjects have data2 == 0 && data5 == 3
if (!goInfo->trap.diameter && goInfo->trap.cooldown == 3)
@@ -1098,7 +1100,7 @@ void GameObject::UseDoorOrButton(uint32 time_to_restore, bool alternative /* = f
SwitchDoorOrButton(true, alternative);
SetLootState(GO_ACTIVATED, user);
- m_cooldownTime = time(NULL) + time_to_restore;
+ m_cooldownTime = time_to_restore ? (time(NULL) + time_to_restore) : 0;
}
void GameObject::SetGoArtKit(uint8 kit)
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp
index a701e6fc38f..563d7fed107 100644
--- a/src/server/game/Entities/Player/Player.cpp
+++ b/src/server/game/Entities/Player/Player.cpp
@@ -144,6 +144,8 @@ enum CharacterCustomizeFlags
static uint32 copseReclaimDelay[MAX_DEATH_COUNT] = { 30, 60, 120 };
+uint32 const MAX_MONEY_AMOUNT = static_cast<uint32>(std::numeric_limits<int32>::max());
+
// == PlayerTaxi ================================================
PlayerTaxi::PlayerTaxi()
@@ -364,6 +366,12 @@ void TradeData::SetMoney(uint32 money)
if (m_money == money)
return;
+ if (!m_player->HasEnoughMoney(money))
+ {
+ m_player->GetSession()->SendTradeStatus(TRADE_STATUS_BUSY);
+ return;
+ }
+
m_money = money;
SetAccepted(false);
@@ -22639,7 +22647,7 @@ bool Player::ModifyMoney(int32 amount, bool sendError /*= true*/)
SetMoney (GetMoney() > uint32(-amount) ? GetMoney() + amount : 0);
else
{
- if (GetMoney() < uint32(MAX_MONEY_AMOUNT - amount))
+ if (GetMoney() < MAX_MONEY_AMOUNT - static_cast<uint32>(amount))
SetMoney(GetMoney() + amount);
else
{
diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h
index 92691c3fd45..0826f533df7 100644
--- a/src/server/game/Entities/Player/Player.h
+++ b/src/server/game/Entities/Player/Player.h
@@ -29,6 +29,7 @@
#include "SpellMgr.h"
#include "Unit.h"
+#include <limits>
#include <string>
#include <vector>
@@ -824,7 +825,8 @@ enum PlayerDelayedOperations
// Player summoning auto-decline time (in secs)
#define MAX_PLAYER_SUMMON_DELAY (2*MINUTE)
-#define MAX_MONEY_AMOUNT (0x7FFFFFFF-1)
+// Maximum money amount : 2^31 - 1
+extern uint32 const MAX_MONEY_AMOUNT;
struct InstancePlayerBind
{
diff --git a/src/server/game/Entities/Transport/Transport.cpp b/src/server/game/Entities/Transport/Transport.cpp
index fd45c3fc596..8bc07732bb6 100644
--- a/src/server/game/Entities/Transport/Transport.cpp
+++ b/src/server/game/Entities/Transport/Transport.cpp
@@ -85,8 +85,8 @@ bool Transport::Create(uint32 guidlow, uint32 entry, uint32 mapid, float x, floa
_triggeredDepartureEvent = false;
m_goValue.Transport.PathProgress = 0;
- SetFloatValue(OBJECT_FIELD_SCALE_X, goinfo->size);
- SetUInt32Value(GAMEOBJECT_FACTION, goinfo->faction);
+ SetObjectScale(goinfo->size);
+ SetFaction(goinfo->faction);
SetUInt32Value(GAMEOBJECT_FLAGS, goinfo->flags);
SetPeriod(tInfo->pathTime);
SetEntry(goinfo->entry);
@@ -210,8 +210,14 @@ void Transport::Update(uint32 diff)
3. transport moves from active to inactive grid
4. the grid that transport is currently in unloads
*/
- if (_staticPassengers.empty() && GetMap()->IsGridLoaded(GetPositionX(), GetPositionY())) // 2.
+ bool gridActive = GetMap()->IsGridLoaded(GetPositionX(), GetPositionY());
+
+ if (_staticPassengers.empty() && gridActive) // 2.
LoadStaticPassengers();
+ else if (!_staticPassengers.empty() && !gridActive)
+ // 4. - if transports stopped on grid edge, some passengers can remain in active grids
+ // unload all static passengers otherwise passengers won't load correctly when the grid that transport is currently in becomes active
+ UnloadStaticPassengers();
}
}
@@ -450,6 +456,7 @@ TempSummon* Transport::SummonPassenger(uint32 entry, Position const& pos, TempSu
void Transport::UpdatePosition(float x, float y, float z, float o)
{
bool newActive = GetMap()->IsGridLoaded(x, y);
+ Cell oldCell(GetPositionX(), GetPositionY());
Relocate(x, y, z, o);
UpdateModelPosition();
@@ -464,7 +471,7 @@ void Transport::UpdatePosition(float x, float y, float z, float o)
*/
if (_staticPassengers.empty() && newActive) // 1.
LoadStaticPassengers();
- else if (!_staticPassengers.empty() && !newActive && Cell(x, y).DiffGrid(Cell(GetPositionX(), GetPositionY()))) // 3.
+ else if (!_staticPassengers.empty() && !newActive && oldCell.DiffGrid(Cell(GetPositionX(), GetPositionY()))) // 3.
UnloadStaticPassengers();
else
UpdatePassengerPositions(_staticPassengers);
diff --git a/src/server/game/Entities/Vehicle/Vehicle.cpp b/src/server/game/Entities/Vehicle/Vehicle.cpp
index fae4f0c6b6a..4c3724a8860 100755
--- a/src/server/game/Entities/Vehicle/Vehicle.cpp
+++ b/src/server/game/Entities/Vehicle/Vehicle.cpp
@@ -76,42 +76,9 @@ Vehicle::~Vehicle()
void Vehicle::Install()
{
- if (Creature* creature = _me->ToCreature())
- {
- switch (_vehicleInfo->m_powerType)
- {
- case POWER_STEAM:
- case POWER_HEAT:
- case POWER_BLOOD:
- case POWER_OOZE:
- case POWER_WRATH:
- _me->setPowerType(POWER_ENERGY);
- _me->SetMaxPower(POWER_ENERGY, 100);
- break;
- case POWER_PYRITE:
- _me->setPowerType(POWER_ENERGY);
- _me->SetMaxPower(POWER_ENERGY, 50);
- break;
- default:
- for (uint32 i = 0; i < MAX_SPELL_VEHICLE; ++i)
- {
- if (!creature->m_spells[i])
- continue;
-
- SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(creature->m_spells[i]);
- if (!spellInfo)
- continue;
-
- if (spellInfo->PowerType == POWER_ENERGY && spellInfo->CalcPowerCost(_me, spellInfo->GetSchoolMask()) > 0)
- {
- _me->setPowerType(POWER_ENERGY);
- _me->SetMaxPower(POWER_ENERGY, 100);
- break;
- }
- }
- break;
- }
- }
+ if (_me->GetTypeId() == TYPEID_UNIT)
+ if (PowerDisplayEntry const* powerDisplay = sPowerDisplayStore.LookupEntry(_vehicleInfo->m_powerDisplayId))
+ _me->setPowerType(Powers(powerDisplay->PowerType));
_status = STATUS_INSTALLED;
if (GetBase()->GetTypeId() == TYPEID_UNIT)
diff --git a/src/server/game/Globals/ObjectMgr.cpp b/src/server/game/Globals/ObjectMgr.cpp
index 2905b0454c4..207f80eabe7 100644
--- a/src/server/game/Globals/ObjectMgr.cpp
+++ b/src/server/game/Globals/ObjectMgr.cpp
@@ -3822,8 +3822,8 @@ void ObjectMgr::LoadQuests()
"RequiredItemId1, RequiredItemId2, RequiredItemId3, RequiredItemId4, RequiredItemId5, RequiredItemId6, RequiredItemCount1, RequiredItemCount2, RequiredItemCount3, RequiredItemCount4, RequiredItemCount5, RequiredItemCount6, "
// 117 118 119 120 121 122 123 124 125 126 127 128 129
"Unknown0, ObjectiveText1, ObjectiveText2, ObjectiveText3, ObjectiveText4, DetailsEmote1, DetailsEmote2, DetailsEmote3, DetailsEmote4, DetailsEmoteDelay1, DetailsEmoteDelay2, DetailsEmoteDelay3, DetailsEmoteDelay4, "
- // 130 131 132 133 134 135 136 137 138 139 140
- "EmoteOnIncomplete, EmoteOnComplete, OfferRewardEmote1, OfferRewardEmote2, OfferRewardEmote3, OfferRewardEmote4, OfferRewardEmoteDelay1, OfferRewardEmoteDelay2, OfferRewardEmoteDelay3, OfferRewardEmoteDelay4, WDBVerified"
+ // 130 131 132 133 134 135 136 137 138 139
+ "EmoteOnIncomplete, EmoteOnComplete, OfferRewardEmote1, OfferRewardEmote2, OfferRewardEmote3, OfferRewardEmote4, OfferRewardEmoteDelay1, OfferRewardEmoteDelay2, OfferRewardEmoteDelay3, OfferRewardEmoteDelay4"
" FROM quest_template");
if (!result)
{
diff --git a/src/server/game/Globals/ObjectMgr.h b/src/server/game/Globals/ObjectMgr.h
index 48c9e618a1d..ba5940d7e12 100644
--- a/src/server/game/Globals/ObjectMgr.h
+++ b/src/server/game/Globals/ObjectMgr.h
@@ -432,7 +432,7 @@ struct BroadcastText
uint32 SoundId;
uint32 Unk1;
uint32 Unk2;
- // uint32 WDBVerified;
+ // uint32 VerifiedBuild;
std::string const& GetText(LocaleConstant locale = DEFAULT_LOCALE, uint8 gender = GENDER_MALE, bool forceGender = false) const
{
diff --git a/src/server/game/Grids/GridStates.cpp b/src/server/game/Grids/GridStates.cpp
index 8b57c382cd7..3e085f1f381 100644
--- a/src/server/game/Grids/GridStates.cpp
+++ b/src/server/game/Grids/GridStates.cpp
@@ -20,18 +20,6 @@
#include "GridNotifiers.h"
#include "Log.h"
-#ifdef TRINITY_DEBUG
-bool GridState::checkMagic()
-{
- if (i_Magic != MAGIC_TESTVAL)
- {
- TC_LOG_ERROR("misc", "!!! GridState: Magic value gone !!!");
- return false;
- }
- return true;
-}
-#endif
-
void InvalidState::Update(Map&, NGridType&, GridInfo&, uint32) const
{ }
diff --git a/src/server/game/Grids/GridStates.h b/src/server/game/Grids/GridStates.h
index 016df4dc3d4..af11ab08d5e 100644
--- a/src/server/game/Grids/GridStates.h
+++ b/src/server/game/Grids/GridStates.h
@@ -27,13 +27,6 @@ class Map;
class GridState
{
public:
-#ifdef TRINITY_DEBUG
-#define MAGIC_TESTVAL 0xFBE823BA
- GridState() { i_Magic = MAGIC_TESTVAL; }
- bool checkMagic();
- void setMagic() { i_Magic = MAGIC_TESTVAL; }
- unsigned int i_Magic;
-#endif
virtual ~GridState() { };
virtual void Update(Map &, NGridType&, GridInfo &, uint32 t_diff) const = 0;
};
diff --git a/src/server/game/Guilds/Guild.cpp b/src/server/game/Guilds/Guild.cpp
index f448fbb9f19..db0a196dec6 100644
--- a/src/server/game/Guilds/Guild.cpp
+++ b/src/server/game/Guilds/Guild.cpp
@@ -754,7 +754,7 @@ int32 Guild::Member::GetBankWithdrawValue(uint8 tabId) const
{
// Guild master has unlimited amount.
if (IsRank(GR_GUILDMASTER))
- return tabId == GUILD_BANK_MAX_TABS ? GUILD_WITHDRAW_MONEY_UNLIMITED : GUILD_WITHDRAW_SLOT_UNLIMITED;
+ return static_cast<int32>(tabId == GUILD_BANK_MAX_TABS ? GUILD_WITHDRAW_MONEY_UNLIMITED : GUILD_WITHDRAW_SLOT_UNLIMITED);
return m_bankWithdraw[tabId];
}
@@ -1760,7 +1760,7 @@ void Guild::HandleMemberDepositMoney(WorldSession* session, uint32 amount)
bool Guild::HandleMemberWithdrawMoney(WorldSession* session, uint32 amount, bool repair)
{
//clamp amount to MAX_MONEY_AMOUNT, Players can't hold more than that anyway
- amount = std::min(amount, uint32(MAX_MONEY_AMOUNT));
+ amount = std::min(amount, MAX_MONEY_AMOUNT);
if (m_bankMoney < amount) // Not enough money in bank
return false;
@@ -2581,7 +2581,7 @@ inline int32 Guild::_GetMemberRemainingSlots(Member const* member, uint8 tabId)
{
uint8 rankId = member->GetRankId();
if (rankId == GR_GUILDMASTER)
- return GUILD_WITHDRAW_SLOT_UNLIMITED;
+ return static_cast<int32>(GUILD_WITHDRAW_SLOT_UNLIMITED);
if ((_GetRankBankTabRights(rankId, tabId) & GUILD_BANK_RIGHT_VIEW_TAB) != 0)
{
int32 remaining = _GetRankBankTabSlotsPerDay(rankId, tabId) - member->GetBankWithdrawValue(tabId);
@@ -2598,7 +2598,7 @@ inline int32 Guild::_GetMemberRemainingMoney(Member const* member) const
{
uint8 rankId = member->GetRankId();
if (rankId == GR_GUILDMASTER)
- return GUILD_WITHDRAW_MONEY_UNLIMITED;
+ return static_cast<int32>(GUILD_WITHDRAW_MONEY_UNLIMITED);
if ((_GetRankRights(rankId) & (GR_RIGHT_WITHDRAW_REPAIR | GR_RIGHT_WITHDRAW_GOLD)) != 0)
{
diff --git a/src/server/game/Handlers/ArenaTeamHandler.cpp b/src/server/game/Handlers/ArenaTeamHandler.cpp
index 632bd02def0..3bb3edac500 100644
--- a/src/server/game/Handlers/ArenaTeamHandler.cpp
+++ b/src/server/game/Handlers/ArenaTeamHandler.cpp
@@ -121,6 +121,12 @@ void WorldSession::HandleArenaTeamInviteOpcode(WorldPacket& recvData)
return;
}
+ if (GetPlayer()->GetArenaTeamId(arenaTeam->GetSlot()) != arenaTeamId)
+ {
+ SendArenaTeamCommandResult(ERR_ARENA_TEAM_CREATE_S, "", "", ERR_ARENA_TEAM_PERMISSIONS);
+ return;
+ }
+
// OK result but don't send invite
if (player->GetSocial()->HasIgnore(GetPlayer()->GetGUIDLow()))
return;
diff --git a/src/server/game/Handlers/CalendarHandler.cpp b/src/server/game/Handlers/CalendarHandler.cpp
index 45d4d221d06..278c180c380 100644
--- a/src/server/game/Handlers/CalendarHandler.cpp
+++ b/src/server/game/Handlers/CalendarHandler.cpp
@@ -255,7 +255,14 @@ void WorldSession::HandleCalendarAddEvent(WorldPacket& recvData)
uint32 inviteCount;
recvData >> inviteCount;
- for (uint32 i = 0; i < inviteCount; ++i)
+ SQLTransaction trans;
+ if (inviteCount > 1)
+ trans = CharacterDatabase.BeginTransaction();
+
+ // client limits the amount of players to be invited to 100
+ const uint32 MaxPlayerInvites = 100;
+
+ for (uint32 i = 0; i < inviteCount && i < MaxPlayerInvites; ++i)
{
uint64 invitee = 0;
uint8 status = 0;
@@ -265,8 +272,11 @@ void WorldSession::HandleCalendarAddEvent(WorldPacket& recvData)
// 946684800 is 01/01/2000 00:00:00 - default response time
CalendarInvite* invite = new CalendarInvite(sCalendarMgr->GetFreeInviteId(), calendarEvent.GetEventId(), invitee, guid, 946684800, CalendarInviteStatus(status), CalendarModerationRank(rank), "");
- sCalendarMgr->AddInvite(&calendarEvent, invite);
+ sCalendarMgr->AddInvite(&calendarEvent, invite, trans);
}
+
+ if (inviteCount > 1)
+ CharacterDatabase.CommitTransaction(trans);
}
sCalendarMgr->AddEvent(new CalendarEvent(calendarEvent, calendarEvent.GetEventId()), CALENDAR_SENDTYPE_ADD);
@@ -350,10 +360,15 @@ void WorldSession::HandleCalendarCopyEvent(WorldPacket& recvData)
sCalendarMgr->AddEvent(newEvent, CALENDAR_SENDTYPE_COPY);
CalendarInviteStore invites = sCalendarMgr->GetEventInvites(eventId);
+ SQLTransaction trans;
+ if (invites.size() > 1)
+ trans = CharacterDatabase.BeginTransaction();
for (CalendarInviteStore::const_iterator itr = invites.begin(); itr != invites.end(); ++itr)
- sCalendarMgr->AddInvite(newEvent, new CalendarInvite(**itr, sCalendarMgr->GetFreeInviteId(), newEvent->GetEventId()));
+ sCalendarMgr->AddInvite(newEvent, new CalendarInvite(**itr, sCalendarMgr->GetFreeInviteId(), newEvent->GetEventId()), trans);
+ if (invites.size() > 1)
+ CharacterDatabase.CommitTransaction(trans);
// should we change owner when somebody makes a copy of event owned by another person?
}
else
diff --git a/src/server/game/Handlers/TradeHandler.cpp b/src/server/game/Handlers/TradeHandler.cpp
index 4372de9eafe..884c4a83b15 100644
--- a/src/server/game/Handlers/TradeHandler.cpp
+++ b/src/server/game/Handlers/TradeHandler.cpp
@@ -299,14 +299,14 @@ void WorldSession::HandleAcceptTradeOpcode(WorldPacket& /*recvPacket*/)
return;
}
- if (_player->GetMoney() >= uint32(MAX_MONEY_AMOUNT) - his_trade->GetMoney())
+ if (_player->GetMoney() >= MAX_MONEY_AMOUNT - his_trade->GetMoney())
{
_player->SendEquipError(EQUIP_ERR_TOO_MUCH_GOLD, NULL, NULL);
my_trade->SetAccepted(false, true);
return;
}
- if (trader->GetMoney() >= uint32(MAX_MONEY_AMOUNT) - my_trade->GetMoney())
+ if (trader->GetMoney() >= MAX_MONEY_AMOUNT - my_trade->GetMoney())
{
trader->SendEquipError(EQUIP_ERR_TOO_MUCH_GOLD, NULL, NULL);
his_trade->SetAccepted(false, true);
@@ -686,7 +686,6 @@ void WorldSession::HandleSetTradeGoldOpcode(WorldPacket& recvPacket)
if (!my_trade)
return;
- // gold can be incorrect, but this is checked at trade finished.
my_trade->SetMoney(gold);
}
diff --git a/src/server/game/Instances/InstanceScript.h b/src/server/game/Instances/InstanceScript.h
index 3050443edc0..9e11c566c22 100644
--- a/src/server/game/Instances/InstanceScript.h
+++ b/src/server/game/Instances/InstanceScript.h
@@ -243,7 +243,7 @@ AI* GetInstanceAI(T* obj, char const* scriptName)
return new AI(obj);
return NULL;
-};
+}
template<class AI, class T>
AI* GetInstanceAI(T* obj)
@@ -253,6 +253,6 @@ AI* GetInstanceAI(T* obj)
return new AI(obj);
return NULL;
-};
+}
#endif // TRINITY_INSTANCE_DATA_H
diff --git a/src/server/game/Maps/Map.cpp b/src/server/game/Maps/Map.cpp
index cd391299785..ba271235330 100644
--- a/src/server/game/Maps/Map.cpp
+++ b/src/server/game/Maps/Map.cpp
@@ -1544,11 +1544,8 @@ void Map::UnloadAll()
Transport* transport = *itr;
++itr;
- transport->RemoveFromWorld();
- delete transport;
+ RemoveFromMap<Transport>(transport, true);
}
-
- _transports.clear();
}
// *****************************
@@ -2648,24 +2645,27 @@ void Map::RemoveAllObjectsInRemoveList()
RemoveFromMap(corpse, true);
break;
}
- case TYPEID_DYNAMICOBJECT:
- RemoveFromMap((DynamicObject*)obj, true);
- break;
- case TYPEID_GAMEOBJECT:
- if (Transport* transport = obj->ToGameObject()->ToTransport())
- RemoveFromMap(transport, true);
- else
- RemoveFromMap(obj->ToGameObject(), true);
- break;
- case TYPEID_UNIT:
- // in case triggered sequence some spell can continue casting after prev CleanupsBeforeDelete call
- // make sure that like sources auras/etc removed before destructor start
- obj->ToCreature()->CleanupsBeforeDelete();
- RemoveFromMap(obj->ToCreature(), true);
- break;
- default:
- TC_LOG_ERROR("maps", "Non-grid object (TypeId: %u) is in grid object remove list, ignored.", obj->GetTypeId());
- break;
+ case TYPEID_DYNAMICOBJECT:
+ RemoveFromMap(obj->ToDynObject(), true);
+ break;
+ case TYPEID_GAMEOBJECT:
+ {
+ GameObject* go = obj->ToGameObject();
+ if (Transport* transport = go->ToTransport())
+ RemoveFromMap(transport, true);
+ else
+ RemoveFromMap(go, true);
+ break;
+ }
+ case TYPEID_UNIT:
+ // in case triggered sequence some spell can continue casting after prev CleanupsBeforeDelete call
+ // make sure that like sources auras/etc removed before destructor start
+ obj->ToCreature()->CleanupsBeforeDelete();
+ RemoveFromMap(obj->ToCreature(), true);
+ break;
+ default:
+ TC_LOG_ERROR("maps", "Non-grid object (TypeId: %u) is in grid object remove list, ignored.", obj->GetTypeId());
+ break;
}
i_objectsToRemove.erase(itr);
diff --git a/src/server/game/Maps/MapUpdater.cpp b/src/server/game/Maps/MapUpdater.cpp
index f3a5a66bf66..dd697719d54 100644
--- a/src/server/game/Maps/MapUpdater.cpp
+++ b/src/server/game/Maps/MapUpdater.cpp
@@ -6,34 +6,6 @@
#include <ace/Guard_T.h>
#include <ace/Method_Request.h>
-class WDBThreadStartReq1 : public ACE_Method_Request
-{
- public:
-
- WDBThreadStartReq1()
- {
- }
-
- virtual int call()
- {
- return 0;
- }
-};
-
-class WDBThreadEndReq1 : public ACE_Method_Request
-{
- public:
-
- WDBThreadEndReq1()
- {
- }
-
- virtual int call()
- {
- return 0;
- }
-};
-
class MapUpdateRequest : public ACE_Method_Request
{
private:
@@ -67,7 +39,7 @@ MapUpdater::~MapUpdater()
int MapUpdater::activate(size_t num_threads)
{
- return m_executor.start((int)num_threads, new WDBThreadStartReq1, new WDBThreadEndReq1);
+ return m_executor.start((int)num_threads);
}
int MapUpdater::deactivate()
diff --git a/src/server/game/Quests/QuestDef.cpp b/src/server/game/Quests/QuestDef.cpp
index 9b3732d232b..099275ba8dc 100644
--- a/src/server/game/Quests/QuestDef.cpp
+++ b/src/server/game/Quests/QuestDef.cpp
@@ -137,7 +137,7 @@ Quest::Quest(Field* questRecord)
for (int i = 0; i < QUEST_EMOTE_COUNT; ++i)
OfferRewardEmoteDelay[i] = questRecord[136+i].GetInt32();
- //int32 WDBVerified = questRecord[140].GetInt32();
+ //int32 VerifiedBuild = questRecord[140].GetInt32();
if (SpecialFlags & QUEST_SPECIAL_FLAGS_AUTO_ACCEPT)
Flags |= QUEST_FLAGS_AUTO_ACCEPT;
diff --git a/src/server/game/Spells/Auras/SpellAuras.cpp b/src/server/game/Spells/Auras/SpellAuras.cpp
index 8e7edfc5355..3e1763e6c5b 100644
--- a/src/server/game/Spells/Auras/SpellAuras.cpp
+++ b/src/server/game/Spells/Auras/SpellAuras.cpp
@@ -1343,17 +1343,7 @@ void Aura::HandleAuraSpecificMods(AuraApplication const* aurApp, Unit* caster, b
if (target->HasAura(61988) && !target->HasAura(25771))
target->RemoveAura(61988);
break;
- case 72368: // Shared Suffering
- case 72369:
- if (caster)
- {
- if (AuraEffect* aurEff = GetEffect(0))
- {
- int32 remainingDamage = aurEff->GetAmount() * (aurEff->GetTotalTicks() - aurEff->GetTickNumber());
- if (remainingDamage > 0)
- caster->CastCustomSpell(caster, 72373, NULL, &remainingDamage, NULL, true);
- }
- }
+ default:
break;
}
break;
diff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp
index 7c6f2552b44..768c0b7e818 100644
--- a/src/server/game/Spells/Spell.cpp
+++ b/src/server/game/Spells/Spell.cpp
@@ -1251,8 +1251,12 @@ void Spell::SelectImplicitCasterDestTargets(SpellEffIndex effIndex, SpellImplici
float angle = float(rand_norm()) * static_cast<float>(M_PI * 35.0f / 180.0f) - static_cast<float>(M_PI * 17.5f / 180.0f);
m_caster->GetClosePoint(x, y, z, DEFAULT_WORLD_OBJECT_SIZE, dist, angle);
- float ground = z;
- float liquidLevel = m_caster->GetMap()->GetWaterOrGroundLevel(x, y, z, &ground);
+ float ground = m_caster->GetMap()->GetHeight(m_caster->GetPhaseMask(), x, y, z, true, 50.0f);
+ float liquidLevel = VMAP_INVALID_HEIGHT_VALUE;
+ LiquidData liquidData;
+ if (m_caster->GetMap()->getLiquidStatus(x, y, z, MAP_ALL_LIQUIDS, &liquidData))
+ liquidLevel = liquidData.level;
+
if (liquidLevel <= ground) // When there is no liquid Map::GetWaterOrGroundLevel returns ground level
{
SendCastResult(SPELL_FAILED_NOT_HERE);
@@ -1288,10 +1292,7 @@ void Spell::SelectImplicitCasterDestTargets(SpellEffIndex effIndex, SpellImplici
dist = objSize + (dist - objSize) * float(rand_norm());
Position pos = dest._position;
- if (targetType.GetTarget() == TARGET_DEST_CASTER_FRONT_LEAP)
- m_caster->MovePositionToFirstCollision(pos, dist, angle);
- else
- m_caster->MovePosition(pos, dist, angle);
+ m_caster->MovePositionToFirstCollision(pos, dist, angle);
dest.Relocate(pos);
break;
@@ -1324,7 +1325,7 @@ void Spell::SelectImplicitTargetDestTargets(SpellEffIndex effIndex, SpellImplici
dist = objSize + (dist - objSize) * float(rand_norm());
Position pos = dest._position;
- target->MovePosition(pos, dist, angle);
+ target->MovePositionToFirstCollision(pos, dist, angle);
dest.Relocate(pos);
break;
@@ -1363,7 +1364,7 @@ void Spell::SelectImplicitDestDestTargets(SpellEffIndex effIndex, SpellImplicitT
dist *= float(rand_norm());
Position pos = dest._position;
- m_caster->MovePosition(pos, dist, angle);
+ m_caster->MovePositionToFirstCollision(pos, dist, angle);
dest.Relocate(pos);
break;
diff --git a/src/server/game/Spells/SpellMgr.cpp b/src/server/game/Spells/SpellMgr.cpp
index ba5b8856323..501cb1e77f2 100644
--- a/src/server/game/Spells/SpellMgr.cpp
+++ b/src/server/game/Spells/SpellMgr.cpp
@@ -3375,6 +3375,18 @@ void SpellMgr::LoadSpellInfoCorrections()
break;
// ENDOF TRIAL OF THE CRUSADER SPELLS
//
+ // HALLS OF REFLECTION SPELLS
+ //
+ case 72435: // Defiling Horror
+ case 72452: // Defiling Horror
+ spellInfo->Effects[EFFECT_0].RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_60_YARDS); // 60yd
+ spellInfo->Effects[EFFECT_1].RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_60_YARDS); // 60yd
+ break;
+ case 72900: // Start Halls of Reflection Quest AE
+ spellInfo->Effects[EFFECT_0].RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_200_YARDS); // 200yd
+ break;
+ // ENDOF HALLS OF REFLECTION SPELLS
+ //
// ICECROWN CITADEL SPELLS
//
// THESE SPELLS ARE WORKING CORRECTLY EVEN WITHOUT THIS HACK
diff --git a/src/server/game/Spells/SpellScript.h b/src/server/game/Spells/SpellScript.h
index 75a191a9801..32b8781fb89 100644
--- a/src/server/game/Spells/SpellScript.h
+++ b/src/server/game/Spells/SpellScript.h
@@ -249,7 +249,7 @@ class SpellScript : public _SpellScript
class HitHandlerFunction : public SpellScript::HitHandler { public: HitHandlerFunction(SpellHitFnType _pHitHandlerScript) : SpellScript::HitHandler((SpellScript::SpellHitFnType)_pHitHandlerScript) { } }; \
class ObjectAreaTargetSelectHandlerFunction : public SpellScript::ObjectAreaTargetSelectHandler { public: ObjectAreaTargetSelectHandlerFunction(SpellObjectAreaTargetSelectFnType _pObjectAreaTargetSelectHandlerScript, uint8 _effIndex, uint16 _targetType) : SpellScript::ObjectAreaTargetSelectHandler((SpellScript::SpellObjectAreaTargetSelectFnType)_pObjectAreaTargetSelectHandlerScript, _effIndex, _targetType) { } }; \
class ObjectTargetSelectHandlerFunction : public SpellScript::ObjectTargetSelectHandler { public: ObjectTargetSelectHandlerFunction(SpellObjectTargetSelectFnType _pObjectTargetSelectHandlerScript, uint8 _effIndex, uint16 _targetType) : SpellScript::ObjectTargetSelectHandler((SpellScript::SpellObjectTargetSelectFnType)_pObjectTargetSelectHandlerScript, _effIndex, _targetType) { } }; \
- class DestinationTargetSelectHandlerFunction : public SpellScript::DestinationTargetSelectHandler { public: DestinationTargetSelectHandlerFunction(SpellDestinationTargetSelectFnType _DestinationTargetSelectHandlerScript, uint8 _effIndex, uint16 _targetType) : SpellScript::DestinationTargetSelectHandler((SpellScript::SpellDestinationTargetSelectFnType)_DestinationTargetSelectHandlerScript, _effIndex, _targetType) { } };
+ class DestinationTargetSelectHandlerFunction : public SpellScript::DestinationTargetSelectHandler { public: DestinationTargetSelectHandlerFunction(SpellDestinationTargetSelectFnType _DestinationTargetSelectHandlerScript, uint8 _effIndex, uint16 _targetType) : SpellScript::DestinationTargetSelectHandler((SpellScript::SpellDestinationTargetSelectFnType)_DestinationTargetSelectHandlerScript, _effIndex, _targetType) { } }
#define PrepareSpellScript(CLASSNAME) SPELLSCRIPT_FUNCTION_TYPE_DEFINES(CLASSNAME) SPELLSCRIPT_FUNCTION_CAST_DEFINES(CLASSNAME)
public:
@@ -623,7 +623,7 @@ class AuraScript : public _SpellScript
class EffectSplitFunction : public AuraScript::EffectSplitHandler { public: EffectSplitFunction(AuraEffectSplitFnType _pEffectHandlerScript, uint8 _effIndex) : AuraScript::EffectSplitHandler((AuraScript::AuraEffectSplitFnType)_pEffectHandlerScript, _effIndex) { } }; \
class CheckProcHandlerFunction : public AuraScript::CheckProcHandler { public: CheckProcHandlerFunction(AuraCheckProcFnType handlerScript) : AuraScript::CheckProcHandler((AuraScript::AuraCheckProcFnType)handlerScript) { } }; \
class AuraProcHandlerFunction : public AuraScript::AuraProcHandler { public: AuraProcHandlerFunction(AuraProcFnType handlerScript) : AuraScript::AuraProcHandler((AuraScript::AuraProcFnType)handlerScript) { } }; \
- class EffectProcHandlerFunction : public AuraScript::EffectProcHandler { public: EffectProcHandlerFunction(AuraEffectProcFnType effectHandlerScript, uint8 effIndex, uint16 effName) : AuraScript::EffectProcHandler((AuraScript::AuraEffectProcFnType)effectHandlerScript, effIndex, effName) { } }; \
+ class EffectProcHandlerFunction : public AuraScript::EffectProcHandler { public: EffectProcHandlerFunction(AuraEffectProcFnType effectHandlerScript, uint8 effIndex, uint16 effName) : AuraScript::EffectProcHandler((AuraScript::AuraEffectProcFnType)effectHandlerScript, effIndex, effName) { } }
#define PrepareAuraScript(CLASSNAME) AURASCRIPT_FUNCTION_TYPE_DEFINES(CLASSNAME) AURASCRIPT_FUNCTION_CAST_DEFINES(CLASSNAME)
diff --git a/src/server/game/Tickets/TicketMgr.cpp b/src/server/game/Tickets/TicketMgr.cpp
index b9ecfffb8c3..71d51153b4c 100644
--- a/src/server/game/Tickets/TicketMgr.cpp
+++ b/src/server/game/Tickets/TicketMgr.cpp
@@ -233,7 +233,7 @@ void GmTicket::SetChatLog(std::list<uint32> time, std::string const& log)
std::stringstream ss(log);
std::stringstream newss;
std::string line;
- while (std::getline(ss, line))
+ while (std::getline(ss, line) && !time.empty())
{
newss << secsToTimeString(time.front()) << ": " << line << "\n";
time.pop_front();
diff --git a/src/server/game/Warden/Warden.cpp b/src/server/game/Warden/Warden.cpp
index 42872bba22e..0810295c0cc 100644
--- a/src/server/game/Warden/Warden.cpp
+++ b/src/server/game/Warden/Warden.cpp
@@ -223,7 +223,7 @@ std::string Warden::Penalty(WardenCheck* check /*= NULL*/)
void WorldSession::HandleWardenDataOpcode(WorldPacket& recvData)
{
- if (!_warden)
+ if (!_warden || recvData.empty())
return;
_warden->DecryptData(recvData.contents(), recvData.size());
diff --git a/src/server/scripts/Commands/cs_modify.cpp b/src/server/scripts/Commands/cs_modify.cpp
index f2f11801229..5dbe95b3e54 100644
--- a/src/server/scripts/Commands/cs_modify.cpp
+++ b/src/server/scripts/Commands/cs_modify.cpp
@@ -1020,7 +1020,7 @@ public:
}
else
{
- if (newmoney > MAX_MONEY_AMOUNT)
+ if (newmoney > static_cast<int32>(MAX_MONEY_AMOUNT))
newmoney = MAX_MONEY_AMOUNT;
handler->PSendSysMessage(LANG_YOU_TAKE_MONEY, abs(moneyToAdd), handler->GetNameLink(target).c_str());
@@ -1035,10 +1035,7 @@ public:
if (handler->needReportToTarget(target))
ChatHandler(target->GetSession()).PSendSysMessage(LANG_YOURS_MONEY_GIVEN, handler->GetNameLink().c_str(), moneyToAdd);
- if (moneyToAdd >= MAX_MONEY_AMOUNT)
- moneyToAdd = MAX_MONEY_AMOUNT;
-
- if (targetMoney >= uint32(MAX_MONEY_AMOUNT) - moneyToAdd)
+ if (targetMoney >= MAX_MONEY_AMOUNT - moneyToAdd)
moneyToAdd -= targetMoney;
target->ModifyMoney(moneyToAdd);
diff --git a/src/server/scripts/EasternKingdoms/AlteracValley/boss_balinda.cpp b/src/server/scripts/EasternKingdoms/AlteracValley/boss_balinda.cpp
index 83b716728ea..354e1204a50 100644
--- a/src/server/scripts/EasternKingdoms/AlteracValley/boss_balinda.cpp
+++ b/src/server/scripts/EasternKingdoms/AlteracValley/boss_balinda.cpp
@@ -212,4 +212,4 @@ void AddSC_boss_balinda()
{
new boss_balinda;
new npc_water_elemental;
-};
+}
diff --git a/src/server/scripts/EasternKingdoms/Karazhan/bosses_opera.cpp b/src/server/scripts/EasternKingdoms/Karazhan/bosses_opera.cpp
index 010e06d67cb..870ae370366 100644
--- a/src/server/scripts/EasternKingdoms/Karazhan/bosses_opera.cpp
+++ b/src/server/scripts/EasternKingdoms/Karazhan/bosses_opera.cpp
@@ -109,7 +109,7 @@ void SummonCroneIfReady(InstanceScript* instance, Creature* creature)
pCrone->AI()->AttackStart(creature->GetVictim());
}
}
-};
+}
class boss_dorothee : public CreatureScript
{
diff --git a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kalecgos.cpp b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kalecgos.cpp
index 5562559786d..28bb24f49a9 100644
--- a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kalecgos.cpp
+++ b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kalecgos.cpp
@@ -679,13 +679,16 @@ public:
if (!map->IsDungeon())
return;
- Map::PlayerList const &PlayerList = map->GetPlayers();
- for (Map::PlayerList::const_iterator i = PlayerList.begin(); i != PlayerList.end(); ++i)
+ Map::PlayerList const &playerList = map->GetPlayers();
+ Position homePos = me->GetHomePosition();
+ for (Map::PlayerList::const_iterator itr = playerList.begin(); itr != playerList.end(); ++itr)
{
- if (i->GetSource()->GetPositionZ() <= DRAGON_REALM_Z-5)
+ Player* player = itr->GetSource();
+ if (player->IsInDist(&homePos, 50.0f) && player->GetPositionZ() <= DEMON_REALM_Z + 10.f)
{
- i->GetSource()->RemoveAura(AURA_SPECTRAL_REALM);
- i->GetSource()->TeleportTo(me->GetMap()->GetId(), i->GetSource()->GetPositionX(), i->GetSource()->GetPositionY(), DRAGON_REALM_Z+5, i->GetSource()->GetOrientation());
+ player->RemoveAura(AURA_SPECTRAL_REALM);
+ player->TeleportTo(me->GetMap()->GetId(), player->GetPositionX(),
+ player->GetPositionY(), DRAGON_REALM_Z + 5, player->GetOrientation());
}
}
}
diff --git a/src/server/scripts/EasternKingdoms/zone_duskwood.cpp b/src/server/scripts/EasternKingdoms/zone_duskwood.cpp
index 236455137dc..4eaf98d0a0e 100644
--- a/src/server/scripts/EasternKingdoms/zone_duskwood.cpp
+++ b/src/server/scripts/EasternKingdoms/zone_duskwood.cpp
@@ -29,18 +29,19 @@ EndScriptData */
enum TwilightCorrupter
{
- ITEM_FRAGMENT = 21149,
NPC_TWILIGHT_CORRUPTER = 15625,
- YELL_TWILIGHTCORRUPTOR_RESPAWN = 0,
- YELL_TWILIGHTCORRUPTOR_AGGRO = 1,
- YELL_TWILIGHTCORRUPTOR_KILL = 2,
+ YELL_TWILIGHT_CORRUPTOR_RESPAWN = 0,
+ YELL_TWILIGHT_CORRUPTOR_AGGRO = 1,
+ YELL_TWILIGHT_CORRUPTOR_KILL = 2,
+
SPELL_SOUL_CORRUPTION = 25805,
SPELL_CREATURE_OF_NIGHTMARE = 25806,
SPELL_LEVEL_UP = 24312,
EVENT_SOUL_CORRUPTION = 1,
EVENT_CREATURE_OF_NIGHTMARE = 2,
- FACTION_HOSTILE = 14
+
+ QUEST_NIGHTMARES_CORRUPTION = 8735
};
/*######
@@ -58,12 +59,13 @@ public:
void Reset() override
{
- KillCount = 0;
+ _events.Reset();
+ KillCount = 0;
}
void EnterCombat(Unit* /*who*/) override
{
- Talk(YELL_TWILIGHTCORRUPTOR_AGGRO);
+ Talk(YELL_TWILIGHT_CORRUPTOR_AGGRO);
_events.ScheduleEvent(EVENT_SOUL_CORRUPTION, 15000);
_events.ScheduleEvent(EVENT_CREATURE_OF_NIGHTMARE, 30000);
}
@@ -73,7 +75,7 @@ public:
if (victim->GetTypeId() == TYPEID_PLAYER)
{
++KillCount;
- Talk(YELL_TWILIGHTCORRUPTOR_KILL, victim);
+ Talk(YELL_TWILIGHT_CORRUPTOR_KILL, victim);
if (KillCount == 3)
{
@@ -90,22 +92,27 @@ public:
_events.Update(diff);
+ if (me->HasUnitState(UNIT_STATE_CASTING))
+ return;
+
while (uint32 eventId = _events.ExecuteEvent())
{
switch (eventId)
{
case EVENT_SOUL_CORRUPTION:
- DoCastVictim(SPELL_SOUL_CORRUPTION);
- _events.ScheduleEvent(EVENT_SOUL_CORRUPTION, rand()%4000+15000);
+ DoCastAOE(SPELL_SOUL_CORRUPTION);
+ _events.ScheduleEvent(EVENT_SOUL_CORRUPTION, urand(15000, 19000));
break;
case EVENT_CREATURE_OF_NIGHTMARE:
- DoCastVictim(SPELL_CREATURE_OF_NIGHTMARE);
+ if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 0.0f, true))
+ DoCast(target, SPELL_CREATURE_OF_NIGHTMARE);
_events.ScheduleEvent(EVENT_CREATURE_OF_NIGHTMARE, 45000);
break;
default:
break;
}
}
+
DoMeleeAttackIfReady();
}
@@ -124,27 +131,22 @@ public:
# at_twilight_grove
######*/
+Position const TwillightCorrupter = { -10328.16f, -489.57f, 49.95f, 0.0f };
+
class at_twilight_grove : public AreaTriggerScript
{
-public:
- at_twilight_grove() : AreaTriggerScript("at_twilight_grove") { }
+ public:
+ at_twilight_grove() : AreaTriggerScript("at_twilight_grove") { }
- bool OnTrigger(Player* player, const AreaTriggerEntry* /*at*/) override
- {
- if (player->HasQuestForItem(ITEM_FRAGMENT))
+ bool OnTrigger(Player* player, const AreaTriggerEntry* /*at*/) override
{
- if (Unit* corrupter = player->SummonCreature(NPC_TWILIGHT_CORRUPTER, -10328.16f, -489.57f, 49.95f, 0, TEMPSUMMON_MANUAL_DESPAWN, 60000))
- corrupter->setFaction(FACTION_HOSTILE);
+ if (player->GetQuestStatus(QUEST_NIGHTMARES_CORRUPTION) == QUEST_STATUS_INCOMPLETE)
+ if (!player->FindNearestCreature(NPC_TWILIGHT_CORRUPTER, 500.0f, true))
+ if (Creature* corrupter = player->SummonCreature(NPC_TWILIGHT_CORRUPTER, TwillightCorrupter, TEMPSUMMON_MANUAL_DESPAWN, 60000))
+ corrupter->AI()->Talk(YELL_TWILIGHT_CORRUPTOR_RESPAWN, player);
- if (Creature* CorrupterSpeaker = player->SummonCreature(1, player->GetPositionX(), player->GetPositionY(), player->GetPositionZ()-1, 0, TEMPSUMMON_TIMED_DESPAWN, 15000))
- {
- CorrupterSpeaker->SetName("Twilight Corrupter");
- CorrupterSpeaker->SetVisible(true);
- CorrupterSpeaker->AI()->Talk(YELL_TWILIGHTCORRUPTOR_RESPAWN, player);
- }
- }
- return false;
- };
+ return false;
+ };
};
void AddSC_duskwood()
diff --git a/src/server/scripts/Kalimdor/zone_durotar.cpp b/src/server/scripts/Kalimdor/zone_durotar.cpp
index 8d6ae347b85..358814d440a 100644
--- a/src/server/scripts/Kalimdor/zone_durotar.cpp
+++ b/src/server/scripts/Kalimdor/zone_durotar.cpp
@@ -447,7 +447,7 @@ class spell_mount_check : public SpellScriptLoader
class spell_mount_check_AuraScript : public AuraScript
{
- PrepareAuraScript(spell_mount_check_AuraScript)
+ PrepareAuraScript(spell_mount_check_AuraScript);
bool Validate(SpellInfo const* /*spellInfo*/) override
{
@@ -495,7 +495,7 @@ class spell_voljin_war_drums : public SpellScriptLoader
class spell_voljin_war_drums_SpellScript : public SpellScript
{
- PrepareSpellScript(spell_voljin_war_drums_SpellScript)
+ PrepareSpellScript(spell_voljin_war_drums_SpellScript);
bool Validate(SpellInfo const* /*spellInfo*/) override
{
@@ -552,7 +552,7 @@ class spell_voodoo : public SpellScriptLoader
class spell_voodoo_SpellScript : public SpellScript
{
- PrepareSpellScript(spell_voodoo_SpellScript)
+ PrepareSpellScript(spell_voodoo_SpellScript);
bool Validate(SpellInfo const* /*spellInfo*/) override
{
diff --git a/src/server/scripts/Kalimdor/zone_silithus.cpp b/src/server/scripts/Kalimdor/zone_silithus.cpp
index 3f4fb31a11d..42ab3d8d9cf 100644
--- a/src/server/scripts/Kalimdor/zone_silithus.cpp
+++ b/src/server/scripts/Kalimdor/zone_silithus.cpp
@@ -1006,7 +1006,7 @@ void npc_qiraj_war_spawn::npc_qiraj_war_spawnAI::JustDied(Unit* /*slayer*/)
if (npc_anachronos_quest_trigger::npc_anachronos_quest_triggerAI* triggerAI = CAST_AI(npc_anachronos_quest_trigger::npc_anachronos_quest_triggerAI, mob->AI()))
triggerAI->LiveCounter();
-};
+}
/*#####
# go_crystalline_tear
diff --git a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_lord_jaraxxus.cpp b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_lord_jaraxxus.cpp
index abeafe156ad..c0f7b2f1856 100644
--- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_lord_jaraxxus.cpp
+++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_lord_jaraxxus.cpp
@@ -553,7 +553,7 @@ class spell_mistress_kiss_area : public SpellScriptLoader
class spell_mistress_kiss_area_SpellScript : public SpellScript
{
- PrepareSpellScript(spell_mistress_kiss_area_SpellScript)
+ PrepareSpellScript(spell_mistress_kiss_area_SpellScript);
void FilterTargets(std::list<WorldObject*>& targets)
{
diff --git a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_twin_valkyr.cpp b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_twin_valkyr.cpp
index 00eb970b57b..5fa52c1eb53 100644
--- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_twin_valkyr.cpp
+++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_twin_valkyr.cpp
@@ -673,8 +673,7 @@ class spell_powering_up : public SpellScriptLoader
class spell_powering_up_SpellScript : public SpellScript
{
- public:
- PrepareSpellScript(spell_powering_up_SpellScript)
+ PrepareSpellScript(spell_powering_up_SpellScript);
uint32 spellId;
uint32 poweringUp;
diff --git a/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/boss_falric.cpp b/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/boss_falric.cpp
index 9cf61058bd9..a5577b6a0ea 100644
--- a/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/boss_falric.cpp
+++ b/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/boss_falric.cpp
@@ -25,7 +25,7 @@ enum Texts
SAY_SLAY = 1,
SAY_DEATH = 2,
SAY_IMPENDING_DESPAIR = 3,
- SAY_DEFILING_HORROR = 4,
+ SAY_DEFILING_HORROR = 4
};
enum Spells
@@ -33,8 +33,9 @@ enum Spells
SPELL_QUIVERING_STRIKE = 72422,
SPELL_IMPENDING_DESPAIR = 72426,
SPELL_DEFILING_HORROR = 72435,
- SPELL_HOPELESSNESS = 72395,
- H_SPELL_HOPELESSNESS = 72390, /// @todo not in dbc. Add in DB.
+ SPELL_HOPELESSNESS_1 = 72395,
+ SPELL_HOPELESSNESS_2 = 72396,
+ SPELL_HOPELESSNESS_3 = 72397
};
enum Events
@@ -42,99 +43,106 @@ enum Events
EVENT_NONE,
EVENT_QUIVERING_STRIKE,
EVENT_IMPENDING_DESPAIR,
- EVENT_DEFILING_HORROR,
+ EVENT_DEFILING_HORROR
};
+uint32 const HopelessnessHelper[3] = { SPELL_HOPELESSNESS_1, SPELL_HOPELESSNESS_2, SPELL_HOPELESSNESS_3 };
+
class boss_falric : public CreatureScript
{
-public:
- boss_falric() : CreatureScript("boss_falric") { }
-
- CreatureAI* GetAI(Creature* creature) const override
- {
- return GetInstanceAI<boss_falricAI>(creature);
- }
-
- struct boss_falricAI : public boss_horAI
- {
- boss_falricAI(Creature* creature) : boss_horAI(creature) { }
-
- uint8 uiHopelessnessCount;
-
- void Reset() override
- {
- boss_horAI::Reset();
-
- uiHopelessnessCount = 0;
+ public:
+ boss_falric() : CreatureScript("boss_falric") { }
- instance->SetBossState(DATA_FALRIC_EVENT, NOT_STARTED);
- }
-
- void EnterCombat(Unit* /*who*/) override
+ struct boss_falricAI : public boss_horAI
{
- Talk(SAY_AGGRO);
- instance->SetBossState(DATA_FALRIC_EVENT, IN_PROGRESS);
-
- events.ScheduleEvent(EVENT_QUIVERING_STRIKE, 23000);
- events.ScheduleEvent(EVENT_IMPENDING_DESPAIR, 9000);
- events.ScheduleEvent(EVENT_DEFILING_HORROR, urand(25000, 45000)); /// @todo adjust timer.
- }
+ boss_falricAI(Creature* creature) : boss_horAI(creature, DATA_FALRIC) { }
- void JustDied(Unit* /*killer*/) override
- {
- Talk(SAY_DEATH);
-
- instance->SetBossState(DATA_FALRIC_EVENT, DONE);
- }
+ void Reset() override
+ {
+ boss_horAI::Reset();
+ _hopelessnessCount = 0;
+ }
- void KilledUnit(Unit* /*victim*/) override
- {
- Talk(SAY_SLAY);
- }
+ void EnterCombat(Unit* /*who*/) override
+ {
+ Talk(SAY_AGGRO);
+ DoZoneInCombat();
+ instance->SetBossState(DATA_FALRIC, IN_PROGRESS);
- void UpdateAI(uint32 diff) override
- {
- // Return since we have no target
- if (!UpdateVictim())
- return;
+ events.ScheduleEvent(EVENT_QUIVERING_STRIKE, 23000);
+ events.ScheduleEvent(EVENT_IMPENDING_DESPAIR, 9000);
+ events.ScheduleEvent(EVENT_DEFILING_HORROR, urand(21000, 39000));
+ }
- events.Update(diff);
+ void DamageTaken(Unit* /*attacker*/, uint32& damage) override
+ {
+ if ((_hopelessnessCount < 1 && me->HealthBelowPctDamaged(66, damage))
+ || (_hopelessnessCount < 2 && me->HealthBelowPctDamaged(33, damage))
+ || (_hopelessnessCount < 3 && me->HealthBelowPctDamaged(10, damage)))
+ {
+ if (_hopelessnessCount)
+ me->RemoveOwnedAura(sSpellMgr->GetSpellIdForDifficulty(HopelessnessHelper[_hopelessnessCount - 1], me));
+ DoCast(me, HopelessnessHelper[_hopelessnessCount]);
+ ++_hopelessnessCount;
+ }
+ }
- if (me->HasUnitState(UNIT_STATE_CASTING))
- return;
+ void JustDied(Unit* /*killer*/) override
+ {
+ Talk(SAY_DEATH);
+ events.Reset();
+ instance->SetBossState(DATA_FALRIC, DONE);
+ }
- switch (events.ExecuteEvent())
+ void KilledUnit(Unit* who) override
{
- case EVENT_QUIVERING_STRIKE:
- DoCast(SPELL_QUIVERING_STRIKE);
- events.ScheduleEvent(EVENT_QUIVERING_STRIKE, 10000);
- break;
- case EVENT_IMPENDING_DESPAIR:
- if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM))
- {
- Talk(SAY_IMPENDING_DESPAIR);
- DoCast(target, SPELL_IMPENDING_DESPAIR);
- }
- events.ScheduleEvent(EVENT_IMPENDING_DESPAIR, 13000);
- break;
- case EVENT_DEFILING_HORROR:
- DoCast(SPELL_DEFILING_HORROR);
- events.ScheduleEvent(EVENT_DEFILING_HORROR, urand(25000, 45000)); /// @todo adjust timer.
- break;
+ if (who->GetTypeId() == TYPEID_PLAYER)
+ Talk(SAY_SLAY);
}
- if ((uiHopelessnessCount < 1 && HealthBelowPct(66))
- || (uiHopelessnessCount < 2 && HealthBelowPct(33))
- || (uiHopelessnessCount < 3 && HealthBelowPct(10)))
+ void UpdateAI(uint32 diff) override
{
- uiHopelessnessCount++;
- DoCast(DUNGEON_MODE(SPELL_HOPELESSNESS, H_SPELL_HOPELESSNESS));
+ if (!UpdateVictim())
+ return;
+
+ events.Update(diff);
+
+ if (me->HasUnitState(UNIT_STATE_CASTING))
+ return;
+
+ switch (events.ExecuteEvent())
+ {
+ case EVENT_QUIVERING_STRIKE:
+ DoCastVictim(SPELL_QUIVERING_STRIKE);
+ events.ScheduleEvent(EVENT_QUIVERING_STRIKE, 10000);
+ break;
+ case EVENT_IMPENDING_DESPAIR:
+ if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 45.0f, true))
+ {
+ Talk(SAY_IMPENDING_DESPAIR);
+ DoCast(target, SPELL_IMPENDING_DESPAIR);
+ }
+ events.ScheduleEvent(EVENT_IMPENDING_DESPAIR, 13000);
+ break;
+ case EVENT_DEFILING_HORROR:
+ DoCastAOE(SPELL_DEFILING_HORROR);
+ events.ScheduleEvent(EVENT_DEFILING_HORROR, urand(21000, 39000));
+ break;
+ default:
+ break;
+ }
+
+ DoMeleeAttackIfReady();
}
- DoMeleeAttackIfReady();
- }
- };
+ private:
+ uint8 _hopelessnessCount;
+ };
+ CreatureAI* GetAI(Creature* creature) const override
+ {
+ return GetHallsOfReflectionAI<boss_falricAI>(creature);
+ }
};
void AddSC_boss_falric()
diff --git a/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/boss_marwyn.cpp b/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/boss_marwyn.cpp
index cf267ff1079..902a917c594 100644
--- a/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/boss_marwyn.cpp
+++ b/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/boss_marwyn.cpp
@@ -17,6 +17,8 @@
#include "ScriptMgr.h"
#include "ScriptedCreature.h"
+#include "SpellScript.h"
+#include "SpellAuraEffects.h"
#include "halls_of_reflection.h"
enum Texts
@@ -33,6 +35,7 @@ enum Spells
SPELL_WELL_OF_CORRUPTION = 72362,
SPELL_CORRUPTED_FLESH = 72363,
SPELL_SHARED_SUFFERING = 72368,
+ SPELL_SHARED_SUFFERING_DISPEL = 72373
};
enum Events
@@ -41,93 +44,130 @@ enum Events
EVENT_OBLITERATE,
EVENT_WELL_OF_CORRUPTION,
EVENT_CORRUPTED_FLESH,
- EVENT_SHARED_SUFFERING,
+ EVENT_SHARED_SUFFERING
};
class boss_marwyn : public CreatureScript
{
-public:
- boss_marwyn() : CreatureScript("boss_marwyn") { }
+ public:
+ boss_marwyn() : CreatureScript("boss_marwyn") { }
- CreatureAI* GetAI(Creature* creature) const override
- {
- return GetInstanceAI<boss_marwynAI>(creature);
- }
-
- struct boss_marwynAI : public boss_horAI
- {
- boss_marwynAI(Creature* creature) : boss_horAI(creature) { }
-
- void Reset() override
+ struct boss_marwynAI : public boss_horAI
{
- boss_horAI::Reset();
+ boss_marwynAI(Creature* creature) : boss_horAI(creature, DATA_MARWYN) { }
- instance->SetBossState(DATA_MARWYN_EVENT, NOT_STARTED);
- }
+ void Reset() override
+ {
+ boss_horAI::Reset();
+ }
- void EnterCombat(Unit* /*who*/) override
- {
- Talk(SAY_AGGRO);
- instance->SetBossState(DATA_MARWYN_EVENT, IN_PROGRESS);
+ void EnterCombat(Unit* /*who*/) override
+ {
+ Talk(SAY_AGGRO);
+ DoZoneInCombat();
+ instance->SetBossState(DATA_MARWYN, IN_PROGRESS);
+
+ events.ScheduleEvent(EVENT_OBLITERATE, urand(8000, 13000));
+ events.ScheduleEvent(EVENT_WELL_OF_CORRUPTION, 13000);
+ events.ScheduleEvent(EVENT_CORRUPTED_FLESH, 20000);
+ events.ScheduleEvent(EVENT_SHARED_SUFFERING, urand(14000, 15000));
+ }
- events.ScheduleEvent(EVENT_OBLITERATE, 30000); /// @todo Check timer
- events.ScheduleEvent(EVENT_WELL_OF_CORRUPTION, 13000);
- events.ScheduleEvent(EVENT_CORRUPTED_FLESH, 20000);
- events.ScheduleEvent(EVENT_SHARED_SUFFERING, 20000); /// @todo Check timer
- }
+ void JustDied(Unit* /*killer*/) override
+ {
+ Talk(SAY_DEATH);
+ events.Reset();
+ instance->SetBossState(DATA_MARWYN, DONE);
+ }
- void JustDied(Unit* /*killer*/) override
- {
- Talk(SAY_DEATH);
+ void KilledUnit(Unit* who) override
+ {
+ if (who->GetTypeId() == TYPEID_PLAYER)
+ Talk(SAY_SLAY);
+ }
- instance->SetBossState(DATA_MARWYN_EVENT, DONE);
- }
+ void UpdateAI(uint32 diff) override
+ {
+ if (!UpdateVictim())
+ return;
+
+ events.Update(diff);
+
+ if (me->HasUnitState(UNIT_STATE_CASTING))
+ return;
+
+ switch (events.ExecuteEvent())
+ {
+ case EVENT_OBLITERATE:
+ DoCastVictim(SPELL_OBLITERATE);
+ events.ScheduleEvent(EVENT_OBLITERATE, urand(8000, 13000));
+ break;
+ case EVENT_WELL_OF_CORRUPTION:
+ if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100.0f, true))
+ DoCast(target, SPELL_WELL_OF_CORRUPTION);
+ events.ScheduleEvent(EVENT_WELL_OF_CORRUPTION, 13000);
+ break;
+ case EVENT_CORRUPTED_FLESH:
+ Talk(SAY_CORRUPTED_FLESH);
+ DoCastAOE(SPELL_CORRUPTED_FLESH);
+ events.ScheduleEvent(EVENT_CORRUPTED_FLESH, 20000);
+ break;
+ case EVENT_SHARED_SUFFERING:
+ if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 0.0f, true))
+ DoCast(target, SPELL_SHARED_SUFFERING);
+ events.ScheduleEvent(EVENT_SHARED_SUFFERING, urand(14000, 15000));
+ break;
+ default:
+ break;
+ }
+
+ DoMeleeAttackIfReady();
+ }
+ };
- void KilledUnit(Unit* /*victim*/) override
+ CreatureAI* GetAI(Creature* creature) const override
{
- Talk(SAY_SLAY);
+ return GetHallsOfReflectionAI<boss_marwynAI>(creature);
}
+};
- void UpdateAI(uint32 diff) override
- {
- // Return since we have no target
- if (!UpdateVictim())
- return;
+// 72368, 72369 - Shared Suffering
+class spell_marwyn_shared_suffering : public SpellScriptLoader
+{
+ public:
+ spell_marwyn_shared_suffering() : SpellScriptLoader("spell_marwyn_shared_suffering") { }
- events.Update(diff);
+ class spell_marwyn_shared_suffering_AuraScript : public AuraScript
+ {
+ PrepareAuraScript(spell_marwyn_shared_suffering_AuraScript);
- if (me->HasUnitState(UNIT_STATE_CASTING))
- return;
+ void HandleEffectRemove(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/)
+ {
+ if (GetTargetApplication()->GetRemoveMode() != AURA_REMOVE_BY_ENEMY_SPELL)
+ return;
+
+ if (Unit* caster = GetCaster())
+ {
+ int32 remainingDamage = aurEff->GetAmount() * (aurEff->GetTotalTicks() - aurEff->GetTickNumber());
+ if (remainingDamage > 0)
+ caster->CastCustomSpell(SPELL_SHARED_SUFFERING_DISPEL, SPELLVALUE_BASE_POINT1, remainingDamage, GetTarget(), TRIGGERED_FULL_MASK);
+ }
+ }
- switch (events.ExecuteEvent())
+ void Register() override
{
- case EVENT_OBLITERATE:
- DoCast(SPELL_OBLITERATE);
- events.ScheduleEvent(EVENT_OBLITERATE, 30000);
- break;
- case EVENT_WELL_OF_CORRUPTION:
- DoCast(SPELL_WELL_OF_CORRUPTION);
- events.ScheduleEvent(EVENT_WELL_OF_CORRUPTION, 13000);
- break;
- case EVENT_CORRUPTED_FLESH:
- Talk(SAY_CORRUPTED_FLESH);
- DoCast(SPELL_CORRUPTED_FLESH);
- events.ScheduleEvent(EVENT_CORRUPTED_FLESH, 20000);
- break;
- case EVENT_SHARED_SUFFERING:
- if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM))
- DoCast(target, SPELL_SHARED_SUFFERING);
- events.ScheduleEvent(EVENT_SHARED_SUFFERING, 20000);
- break;
+ AfterEffectRemove += AuraEffectRemoveFn(spell_marwyn_shared_suffering_AuraScript::HandleEffectRemove, EFFECT_0, SPELL_AURA_PERIODIC_DAMAGE, AURA_EFFECT_HANDLE_REAL);
}
+ };
- DoMeleeAttackIfReady();
+ AuraScript* GetAuraScript() const override
+ {
+ return new spell_marwyn_shared_suffering_AuraScript();
}
- };
-
};
void AddSC_boss_marwyn()
{
new boss_marwyn();
+ new spell_marwyn_shared_suffering();
}
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 ca2a181a48a..0c5514a1c0a 100644
--- a/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/halls_of_reflection.cpp
+++ b/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/halls_of_reflection.cpp
@@ -18,6 +18,8 @@
#include "ScriptMgr.h"
#include "ScriptedCreature.h"
#include "ScriptedGossip.h"
+#include "SpellScript.h"
+#include "Transport.h"
#include "Player.h"
#include "halls_of_reflection.h"
@@ -36,17 +38,6 @@ enum Text
SAY_JAINA_INTRO_11 = 10,
SAY_JAINA_INTRO_END = 11,
- SAY_JAINA_ESCAPE_1 = 0,
- SAY_JAINA_ESCAPE_2 = 1,
- SAY_JAINA_ESCAPE_3 = 2,
- SAY_JAINA_ESCAPE_4 = 3,
- SAY_JAINA_ESCAPE_5 = 4,
- SAY_JAINA_ESCAPE_6 = 5,
- SAY_JAINA_ESCAPE_7 = 6,
- SAY_JAINA_ESCAPE_8 = 7,
- SAY_JAINA_ESCAPE_9 = 8,
- SAY_JAINA_ESCAPE_10 = 9,
-
SAY_SYLVANAS_INTRO_1 = 0,
SAY_SYLVANAS_INTRO_2 = 1,
SAY_SYLVANAS_INTRO_3 = 2,
@@ -57,16 +48,6 @@ enum Text
SAY_SYLVANAS_INTRO_8 = 7,
SAY_SYLVANAS_INTRO_END = 8,
- SAY_SYLVANAS_ESCAPE_1 = 0,
- SAY_SYLVANAS_ESCAPE_2 = 1,
- SAY_SYLVANAS_ESCAPE_3 = 2,
- SAY_SYLVANAS_ESCAPE_4 = 3,
- SAY_SYLVANAS_ESCAPE_5 = 4,
- SAY_SYLVANAS_ESCAPE_6 = 5,
- SAY_SYLVANAS_ESCAPE_7 = 6,
- SAY_SYLVANAS_ESCAPE_8 = 7,
- SAY_SYLVANAS_ESCAPE_9 = 8,
-
SAY_UTHER_INTRO_A2_1 = 0,
SAY_UTHER_INTRO_A2_2 = 1,
SAY_UTHER_INTRO_A2_3 = 2,
@@ -90,27 +71,40 @@ enum Text
SAY_LK_JAINA_INTRO_END = 3,
SAY_LK_SYLVANAS_INTRO_END = 4,
+ SAY_JAINA_SYLVANAS_ESCAPE_1 = 0,
+ SAY_JAINA_SYLVANAS_ESCAPE_2 = 1,
+ SAY_JAINA_SYLVANAS_ESCAPE_3 = 2,
+ SAY_JAINA_SYLVANAS_ESCAPE_4 = 3,
+ SAY_JAINA_SYLVANAS_ESCAPE_5 = 4,
+ SAY_JAINA_SYLVANAS_ESCAPE_6 = 5,
+ SAY_JAINA_SYLVANAS_ESCAPE_7 = 6, // unused
+ SAY_JAINA_SYLVANAS_ESCAPE_8 = 7,
+
+ SAY_JAINA_ESCAPE_9 = 8,
+ SAY_JAINA_ESCAPE_10 = 9,
+
+ SAY_SYLVANAS_ESCAPE_9 = 8,
+
SAY_LK_ESCAPE_1 = 0,
SAY_LK_ESCAPE_2 = 1,
- SAY_LK_ESCAPE_3 = 2,
- SAY_LK_ESCAPE_4 = 3,
- SAY_LK_ESCAPE_5 = 4,
- SAY_LK_ESCAPE_6 = 5,
- SAY_LK_ESCAPE_7 = 6,
- SAY_LK_ESCAPE_8 = 7,
- SAY_LK_ESCAPE_9 = 8,
- SAY_LK_ESCAPE_10 = 9,
- SAY_LK_ESCAPE_11 = 10,
+ SAY_LK_ESCAPE_ICEWALL_SUMMONED_1 = 2,
+ SAY_LK_ESCAPE_ICEWALL_SUMMONED_2 = 3,
+ SAY_LK_ESCAPE_ICEWALL_SUMMONED_3 = 4,
+ SAY_LK_ESCAPE_ICEWALL_SUMMONED_4 = 5,
+ SAY_LK_ESCAPE_GHOULS = 6,
+ SAY_LK_ESCAPE_ABOMINATION = 7,
+ SAY_LK_ESCAPE_WINTER = 8,
+ SAY_LK_ESCAPE_HARVEST_SOUL = 9,
SAY_FALRIC_INTRO_1 = 5,
SAY_FALRIC_INTRO_2 = 6,
- SAY_MARWYN_INTRO_1 = 4,
+ SAY_MARWYN_INTRO_1 = 4
};
enum Events
{
- EVENT_WALK_INTRO1 = 1,
+ EVENT_WALK_INTRO1 = 1,
EVENT_WALK_INTRO2,
EVENT_START_INTRO,
EVENT_SKIP_INTRO,
@@ -181,21 +175,17 @@ enum Events
EVENT_ESCAPE_13,
EVENT_ESCAPE_14,
EVENT_ESCAPE_15,
- //EVENT_ESCAPE_16,
+ EVENT_ESCAPE_16,
EVENT_ESCAPE_17,
- EVENT_ESCAPE_18,
- EVENT_ESCAPE_19,
- EVENT_ESCAPE_20,
- EVENT_ESCAPE_21,
- EVENT_ESCAPE_22,
- EVENT_ESCAPE_23,
- EVENT_ESCAPE_24,
- EVENT_ESCAPE_25,
- EVENT_ESCAPE_26,
- EVENT_ESCAPE_27,
-
- EVENT_OPEN_FROSTWORN_DOOR,
- EVENT_CLOSE_FROSTWORN_DOOR,
+
+ EVENT_REMORSELESS_WINTER,
+ EVENT_ESCAPE_SUMMON_GHOULS,
+ EVENT_ESCAPE_SUMMON_WITCH_DOCTOR,
+ EVENT_ESCAPE_SUMMON_LUMBERING_ABOMINATION,
+
+ EVENT_OPEN_IMPENETRABLE_DOOR,
+ EVENT_CLOSE_IMPENETRABLE_DOOR,
+ EVENT_KORELN_LORALEN_DEATH
};
enum Misc
@@ -203,907 +193,1151 @@ enum Misc
ACTION_START_INTRO,
ACTION_SKIP_INTRO,
- QUEST_DELIVRANCE_FROM_THE_PIT_A2 = 24710,
- QUEST_DELIVRANCE_FROM_THE_PIT_H2 = 24712,
- QUEST_WRATH_OF_THE_LICH_KING_A2 = 24500,
- QUEST_WRATH_OF_THE_LICH_KING_H2 = 24802,
+ JAINA_SYLVANAS_MAX_HEALTH = 252000,
+
+ POINT_SHADOW_THRONE_DOOR = 1,
+ POINT_ATTACK_ICEWALL = 2,
+ POINT_TRAP = 3,
+
+ SOUND_LK_SLAY_1 = 17214,
+ SOUND_LK_SLAY_2 = 17215,
+ SOUND_LK_FURY_OF_FROSTMOURNE = 17224
};
enum Spells
{
- SPELL_CAST_VISUAL = 65633, // Jaina/Sylavana
- SPELL_BOSS_SPAWN_AURA = 72712, // Falric and Marwyn
- SPELL_UTHER_DESPAWN = 70693,
+ // Misc
SPELL_TAKE_FROSTMOURNE = 72729,
SPELL_FROSTMOURNE_DESPAWN = 72726,
SPELL_FROSTMOURNE_VISUAL = 73220,
SPELL_FROSTMOURNE_SOUNDS = 70667,
- SPELL_JAINA_ICEBARRIER = 69787, // Jaina Ice Barrier
- SPELL_JAINA_ICEPRISON = 69708, // Jaina Ice Prison
- SPELL_SYLVANAS_CLOAKOFDARKNESS = 70188, // Sylvanas Cloak of Darkness
- SPELL_SYLVANAS_DARKBINDING = 70194, // Sylvanas Dark Binding
- SPELL_REMORSELESS_WINTER = 69780, // Lich King Remorseless Winter
- SPELL_SOUL_REAPER = 69409, // Lich King Soul Reaper
- SPELL_FURY_OF_FROSTMOURNE = 70063, // Lich King Fury of FrostMourne
+ SPELL_BOSS_SPAWN_AURA = 72712, // Falric and Marwyn
+ SPELL_UTHER_DESPAWN = 70693,
+
+ // Jaina, Sylvanas
+ SPELL_CAST_VISUAL = 65633, // wrong
+ SPELL_SUMMON_SOULS = 72711,
+ SPELL_TAUNT_ARTHAS = 69857,
+ SPELL_JAINA_ICE_BARRIER = 69787, // Jaina Ice Barrier
+ SPELL_JAINA_ICE_PRISON = 69708, // Jaina Ice Prison
SPELL_JAINA_DESTROY_ICE_WALL = 69784, // Jaina
+ SPELL_SYLVANAS_CLOAK_OF_DARKNESS = 70188, // Sylvanas Cloak of Darkness
+ SPELL_SYLVANAS_DARK_BINDING = 70194, // Sylvanas Dark Binding
SPELL_SYLVANAS_DESTROY_ICE_WALL = 70224, // Sylvanas
- SPELL_SYLVANAS_JUMP = 68339, // Sylvanas Jump
+ SPELL_SYLVANAS_BLINDING_RETREAT = 70199, // Sylvanas Blinding Retreat
+
+ // Lich King
+ SPELL_REMORSELESS_WINTER = 69780, // Lich King Remorseless Winter
+ SPELL_SOUL_REAPER = 69409, // Lich King Soul Reaper
+ SPELL_FURY_OF_FROSTMOURNE = 70063, // Lich King Fury of Frostmourne
SPELL_RAISE_DEAD = 69818,
- SPELL_HARVEST_SOUL = 70070,
- SPELL_SUMMON_RISE_WITCH_DOCTOR = 69836,
+ SPELL_SUMMON_RISEN_WITCH_DOCTOR = 69836,
SPELL_SUMMON_LUMBERING_ABOMINATION = 69835,
SPELL_SUMMON_ICE_WALL = 69768, // Visual effect and icewall summoning
+ SPELL_PAIN_AND_SUFFERING = 74115, // Lich King Pain and Suffering
+ SPELL_STUN_BREAK_JAINA = 69764, // Lich King visual spell, another Stun Break is 69763, should remove the stun effect
+ SPELL_STUN_BREAK_SYLVANAS = 70200,
+ SPELL_HARVEST_SOUL = 69866, // Lich King Harvest Soul
+
+ // Koreln, Loralen
+ SPELL_FEIGN_DEATH = 29266,
// Raging Ghoul
- SPELL_EMERGE_VISUAL = 50142,
SPELL_GHOUL_JUMP = 70150,
+ SPELL_RAGING_GHOUL_SPAWN = 69636,
- // Witch Doctor
- SPELL_COURSE_OF_DOOM = 70144,
+ // Risen Witch Doctor
+ SPELL_CURSE_OF_DOOM = 70144,
SPELL_SHADOW_BOLT_VOLLEY = 70145,
SPELL_SHADOW_BOLT = 70080,
+ SPELL_RISEN_WITCH_DOCTOR_SPAWN = 69639,
// Lumbering Abomination
- SPELL_ABON_STRIKE = 40505,
- SPELL_VOMIT_SPRAY = 70176,
+ SPELL_CLEAVE = 40505,
+ SPELL_VOMIT_SPRAY = 70176
};
-const Position HallsofReflectionLocs[] =
+enum HorGossipMenu
{
- {5283.234863f, 1990.946777f, 707.695679f, 0.929097f}, // 2 Loralen Follows
- {5408.031250f, 2102.918213f, 707.695251f, 0.792756f}, // 9 Sylvanas Follows
- {5401.866699f, 2110.837402f, 707.695251f, 0.800610f}, // 10 Loralen follows
+ GOSSIP_MENU_JAINA_FINAL = 10930,
+ GOSSIP_MENU_SYLVANAS_FINAL = 10931
};
-const Position NpcJainaOrSylvanasEscapeRoute[] =
+Position const NpcJainaOrSylvanasEscapeRoute[] =
{
- {5601.217285f, 2207.652832f, 731.541931f, 5.223304f}, // leave the throne room
- {5607.224375f, 2173.913330f, 731.126038f, 2.608723f}, // adjust route
- {5583.427246f, 2138.784180f, 731.150391f, 4.260901f}, // stop for talking
- {5560.281738f, 2104.025635f, 731.410889f, 4.058383f}, // attack the first icewall
- {5510.990723f, 2000.772217f, 734.716064f, 3.973213f}, // attack the second icewall
- {5452.641113f, 1905.762329f, 746.530579f, 4.118834f}, // attack the third icewall
- {5338.126953f, 1768.429810f, 767.237244f, 3.855189f}, // attack the fourth icewall
- {5257.712402f, 1669.379395f, 784.300110f, 0.908373f}, // face the Lich king
- {5261.191895f, 1681.901611f, 784.285278f, 4.410465f}, // final position
+ { 5601.217285f, 2207.652832f, 731.541931f, 5.223304f }, // leave the throne room
+ { 5607.224375f, 2173.913330f, 731.126038f, 2.608723f }, // adjust route
+ { 5583.427246f, 2138.784180f, 731.150391f, 4.260901f }, // stop for talking
+ { 5560.281738f, 2104.025635f, 731.410889f, 4.058383f }, // attack the first icewall
+ { 5510.990723f, 2000.772217f, 734.716064f, 3.973213f }, // attack the second icewall
+ { 5452.641113f, 1905.762329f, 746.530579f, 4.118834f }, // attack the third icewall
+ { 5338.126953f, 1768.429810f, 767.237244f, 3.855189f }, // attack the fourth icewall
+ { 5259.06f, 1669.27f, 784.3008f, 0.0f }, // trap (sniffed)
+ { 5265.53f, 1681.6f, 784.2947f, 4.13643f } // final position (sniffed)
};
-const Position IceWalls[] =
+Position const LichKingMoveAwayPos = { 5400.069824f, 2102.7131689f, 707.69525f, 0.843803f }; // Lich King walks away
+Position const LichKingFirstSummon = { 5600.076172f, 2192.270996f, 731.750488f, 4.330935f }; // Lich King First summons
+Position const JainaSylvanasShadowThroneDoor = { 5577.243f, 2235.852f, 733.0128f, 2.209562f }; // Jaina/Sylvanas move to door
+Position const LichKingFinalPos = { 5283.742188f, 1706.335693f, 783.293518f, 4.138510f }; // Lich King Final Pos
+
+// sniffed
+Position const KorelnOrLoralenPos[] =
{
- {5547.833f, 2083.701f,731.4332f,4.24115f}, // first icewall
- {5503.213f, 1969.547f,737.0245f,4.293779f},// second icewall
- {5439.976f, 1879.005f,752.7048f,4.207591f},// third icewall
- {5318.289f, 1749.184f,771.9423f,4.054276f},// fourth icewall
+ { 5253.061f, 1953.616f, 707.6948f, 0.8377581f },
+ { 5283.226f, 1992.300f, 707.7445f, 0.8377581f },
+ { 5360.711f, 2064.797f, 707.6948f, 0.0f }
};
-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};
-const Position LichKingMoveThronePos = {5312.080566f, 2009.172119f, 709.341431f, 3.973301f}; // Lich King walks to throne
-const Position LichKingMoveAwayPos = {5400.069824f, 2102.7131689f, 707.69525f, 0.843803f}; // Lich King walks away
-const Position LichKingSpawnPos2 = {5552.733398f, 2262.718506f, 733.011047f, 4.009696f}; // Lich King Spawn Position 2
-const Position LichKingFirstSummon = {5600.076172f, 2192.270996f, 731.750488f, 4.330935f}; // Lich King First summons
-const Position JainaShadowThroneDoor = {5577.243f, 2235.852f, 733.0128f, 2.209562f}; // Jaina Spawn Position 2
-const Position SylvanasShadowThroneDoor = {5577.243f, 2235.852f, 733.0128f, 2.209562f}; // Sylvanas Spawn Position 2
-const Position FalricStartPos = {5283.878906f, 2030.459595f, 709.319641f, 5.506670f}; // Falric start position
-const Position MarwynStartPos = {5334.979980f, 1982.399536f, 709.320129f, 2.347014f}; // Marwyn start position
-const Position LichKingFinalPos = {5283.742188f, 1706.335693f, 783.293518f, 4.138510f}; // Lich King Final Pos
-const Position ChestPos = {5246.187500f, 1649.079468f, 784.301758f, 0.901268f}; // Chest position
-const Position FinalPortalPos = {5270.634277f ,1639.101196f, 784.303040f, 1.682743f}; // Final portal position
-
-class npc_jaina_or_sylvanas_hor : public CreatureScript
+Position const SylvanasIntroPosition[] =
{
- public:
- npc_jaina_or_sylvanas_hor() : CreatureScript("npc_jaina_or_sylvanas_hor") { }
-
- // AI of Part1
- struct npc_jaina_or_sylvanas_horAI : public ScriptedAI
- {
- npc_jaina_or_sylvanas_horAI(Creature* creature) : ScriptedAI(creature)
- {
- _instance = me->GetInstanceScript();
- }
-
- InstanceScript* _instance;
- uint64 _utherGUID;
- uint64 _lichkingGUID;
+ { 0.0f, 0.0f, 0.0f, 0.0f }, // 0 - Spawn
+ { 5263.2f, 1950.96f, 707.6948f, 0.8028514f }, // 1 - Move to Door
+ { 5306.82f, 1998.17f, 709.341f, 1.239184f }, // 2 - Move to Frostmourne
+};
- EventMap _events;
+Position const JainaIntroPosition[] =
+{
+ { 0.0f, 0.0f, 0.0f, 0.0f }, // 0 - Spawn
+ { 5265.89f, 1952.98f, 707.6978f, 0.0f }, // 1 - Move to Door
+ { 5306.95f, 1998.49f, 709.3414f, 1.277278f } // 2 - Move to Frostmourne
+};
- void sGossipSelect(Player* player, uint32 /*sender*/, uint32 action) override
- {
- 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;
- }
- }
+Position const UtherSpawnPos = { 5307.814f, 2003.168f, 709.4244f, 4.537856f };
- void Reset() override
- {
- _events.Reset();
+Position const LichKingIntroPosition[] =
+{
+ { 5362.463f, 2062.693f, 707.7781f, 3.944444f }, // 0 - Spawn
+ { 5332.83f, 2031.24f, 707.6948f, 0.0f }, // 1 - Door
+ { 5312.93f, 2010.24f, 709.34f, 0.0f }, // 2 - Move to Frostmourne
+ { 5319.028f, 2016.662f, 707.6948f, 0.0f }, // 3 - Move back
+ { 5332.285f, 2030.832f, 707.6948f, 0.0f }, // 4 - Move back 2
+ { 5355.488f, 2055.149f, 707.6907f, 0.0f } // 5 - Move back 3
+};
- _utherGUID = 0;
- _lichkingGUID = 0;
+Position const FalricPosition[] =
+{
+ { 5276.583f, 2037.45f, 709.4025f, 5.532694f }, // 0 - Spawn
+ { 5283.95f, 2030.53f, 709.3191f, 0.0f } // 1 - Intro
+};
- me->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP|UNIT_NPC_FLAG_QUESTGIVER);
- me->SetStandState(UNIT_STAND_STATE_STAND);
- _events.ScheduleEvent(EVENT_WALK_INTRO1, 3000);
- }
+Position const MarwynPosition[] =
+{
+ { 5342.232f, 1975.696f, 709.4025f, 2.391101f }, // 0 - Spawn
+ { 5335.01f, 1982.37f, 709.3191f, 0.0f } // 1 - Intro
+};
- void UpdateAI(uint32 diff) override
- {
- _events.Update(diff);
+Position const SylvanasShadowThroneDoorPosition = { 5576.79f, 2235.73f, 733.0029f, 2.687807f };
- 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.
- if (_instance->GetData(DATA_TEAM_IN_INSTANCE) == ALLIANCE)
- _events.ScheduleEvent(EVENT_INTRO_A2_1, 0);
- else
- _events.ScheduleEvent(EVENT_INTRO_H2_1, 0);
- break;
- // A2 Intro Events
- case EVENT_INTRO_A2_1:
- Talk(SAY_JAINA_INTRO_3);
- _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:
- 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:
- if (Creature* uther = me->SummonCreature(NPC_UTHER, UtherSpawnPos, TEMPSUMMON_MANUAL_DESPAWN))
- {
- uther->GetMotionMaster()->MoveIdle();
- _utherGUID = uther->GetGUID();
- }
- _events.ScheduleEvent(EVENT_INTRO_A2_5, 2000);
- break;
- case EVENT_INTRO_A2_5:
- if (Creature* uther = ObjectAccessor::GetCreature(*me, _utherGUID))
- uther->AI()->Talk(SAY_UTHER_INTRO_A2_1);
- _events.ScheduleEvent(EVENT_INTRO_A2_6, 3000);
- break;
- case EVENT_INTRO_A2_6:
- Talk(SAY_JAINA_INTRO_5);
- _events.ScheduleEvent(EVENT_INTRO_A2_7, 7000);
- break;
- case EVENT_INTRO_A2_7:
- if (Creature* uther = ObjectAccessor::GetCreature(*me, _utherGUID))
- uther->AI()->Talk(SAY_UTHER_INTRO_A2_2);
- _events.ScheduleEvent(EVENT_INTRO_A2_8, 7000);
- break;
- case EVENT_INTRO_A2_8:
- Talk(SAY_JAINA_INTRO_6);
- _events.ScheduleEvent(EVENT_INTRO_A2_9, 1200);
- break;
- case EVENT_INTRO_A2_9:
- if (Creature* uther = ObjectAccessor::GetCreature(*me, _utherGUID))
- uther->AI()->Talk(SAY_UTHER_INTRO_A2_3);
- _events.ScheduleEvent(EVENT_INTRO_A2_10, 11000);
- break;
- case EVENT_INTRO_A2_10:
- Talk(SAY_JAINA_INTRO_7);
- _events.ScheduleEvent(EVENT_INTRO_A2_11, 6000);
- break;
- case EVENT_INTRO_A2_11:
- if (Creature* uther = ObjectAccessor::GetCreature(*me, _utherGUID))
- uther->AI()->Talk(SAY_UTHER_INTRO_A2_4);
- _events.ScheduleEvent(EVENT_INTRO_A2_12, 12000);
- break;
- case EVENT_INTRO_A2_12:
- Talk(SAY_JAINA_INTRO_8);
- _events.ScheduleEvent(EVENT_INTRO_A2_13, 6000);
- break;
- case EVENT_INTRO_A2_13:
- if (Creature* uther = ObjectAccessor::GetCreature(*me, _utherGUID))
- uther->AI()->Talk(SAY_UTHER_INTRO_A2_5);
- _events.ScheduleEvent(EVENT_INTRO_A2_14, 13000);
- break;
- case EVENT_INTRO_A2_14:
- Talk(SAY_JAINA_INTRO_9);
- _events.ScheduleEvent(EVENT_INTRO_A2_15, 12000);
- break;
- case EVENT_INTRO_A2_15:
- if (Creature* uther = ObjectAccessor::GetCreature(*me, _utherGUID))
- uther->AI()->Talk(SAY_UTHER_INTRO_A2_6);
- _events.ScheduleEvent(EVENT_INTRO_A2_16, 25000);
- break;
- case EVENT_INTRO_A2_16:
- if (Creature* uther = ObjectAccessor::GetCreature(*me, _utherGUID))
- uther->AI()->Talk(SAY_UTHER_INTRO_A2_7);
- _events.ScheduleEvent(EVENT_INTRO_A2_17, 6000);
- break;
- case EVENT_INTRO_A2_17:
- Talk(SAY_JAINA_INTRO_10);
- _events.ScheduleEvent(EVENT_INTRO_A2_18, 5000);
- break;
- case EVENT_INTRO_A2_18:
- if (Creature* uther = ObjectAccessor::GetCreature(*me, _utherGUID))
- {
- uther->HandleEmoteCommand(EMOTE_ONESHOT_NO);
- uther->AI()->Talk(SAY_UTHER_INTRO_A2_8);
- }
- _events.ScheduleEvent(EVENT_INTRO_A2_19, 12000);
- break;
- case EVENT_INTRO_A2_19:
- Talk(SAY_JAINA_INTRO_11);
- _events.ScheduleEvent(EVENT_INTRO_LK_1, 3000);
- break;
- // H2 Intro Events
- case EVENT_INTRO_H2_1:
- Talk(SAY_SYLVANAS_INTRO_1);
- _events.ScheduleEvent(EVENT_INTRO_H2_2, 8000);
- break;
- case EVENT_INTRO_H2_2:
- Talk(SAY_SYLVANAS_INTRO_2);
- _events.ScheduleEvent(EVENT_INTRO_H2_3, 6000);
- break;
- case EVENT_INTRO_H2_3:
- Talk(SAY_SYLVANAS_INTRO_3);
- 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:
- // spawn UTHER during speach 2
- if (Creature* uther = me->SummonCreature(NPC_UTHER, UtherSpawnPos, TEMPSUMMON_MANUAL_DESPAWN))
- {
- uther->GetMotionMaster()->MoveIdle();
- _utherGUID = uther->GetGUID();
- }
- _events.ScheduleEvent(EVENT_INTRO_H2_5, 2000);
- break;
- case EVENT_INTRO_H2_5:
- if (Creature* uther = ObjectAccessor::GetCreature(*me, _utherGUID))
- uther->AI()->Talk(SAY_UTHER_INTRO_H2_1);
- _events.ScheduleEvent(EVENT_INTRO_H2_6, 11000);
- break;
- case EVENT_INTRO_H2_6:
- Talk(SAY_SYLVANAS_INTRO_4);
- _events.ScheduleEvent(EVENT_INTRO_H2_7, 3000);
- break;
- case EVENT_INTRO_H2_7:
- if (Creature* uther = ObjectAccessor::GetCreature(*me, _utherGUID))
- uther->AI()->Talk(SAY_UTHER_INTRO_H2_2);
- _events.ScheduleEvent(EVENT_INTRO_H2_8, 6000);
- break;
- case EVENT_INTRO_H2_8:
- Talk(SAY_SYLVANAS_INTRO_5);
- _events.ScheduleEvent(EVENT_INTRO_H2_9, 5000);
- break;
- case EVENT_INTRO_H2_9:
- if (Creature* uther = ObjectAccessor::GetCreature(*me, _utherGUID))
- uther->AI()->Talk(SAY_UTHER_INTRO_H2_3);
- _events.ScheduleEvent(EVENT_INTRO_H2_10, 19000);
- break;
- case EVENT_INTRO_H2_10:
- Talk(SAY_SYLVANAS_INTRO_6);
- _events.ScheduleEvent(EVENT_INTRO_H2_11, 1500);
- break;
- case EVENT_INTRO_H2_11:
- if (Creature* uther = ObjectAccessor::GetCreature(*me, _utherGUID))
- uther->AI()->Talk(SAY_UTHER_INTRO_H2_4);
- _events.ScheduleEvent(EVENT_INTRO_H2_12, 19500);
- break;
- case EVENT_INTRO_H2_12:
- Talk(SAY_SYLVANAS_INTRO_7);
- _events.ScheduleEvent(EVENT_INTRO_H2_13, 2000);
- break;
- case EVENT_INTRO_H2_13:
- if (Creature* uther = ObjectAccessor::GetCreature(*me, _utherGUID))
- {
- uther->HandleEmoteCommand(EMOTE_ONESHOT_NO);
- uther->AI()->Talk(SAY_UTHER_INTRO_H2_5);
- }
- _events.ScheduleEvent(EVENT_INTRO_H2_14, 12000);
- break;
- case EVENT_INTRO_H2_14:
- if (Creature* uther = ObjectAccessor::GetCreature(*me, _utherGUID))
- uther->AI()->Talk(SAY_UTHER_INTRO_H2_6);
- _events.ScheduleEvent(EVENT_INTRO_H2_15, 8000);
- break;
- case EVENT_INTRO_H2_15:
- Talk(SAY_SYLVANAS_INTRO_8);
- _events.ScheduleEvent(EVENT_INTRO_LK_1, 2000);
- break;
- // 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_PART1, LichKingSpawnPos, TEMPSUMMON_MANUAL_DESPAWN))
- {
- lichking->SetWalk(true);
- lichking->GetMotionMaster()->MovePoint(0, LichKingMoveThronePos);
- _lichkingGUID = lichking->GetGUID();
- _events.ScheduleEvent(EVENT_OPEN_FROSTWORN_DOOR, 0);
- _events.ScheduleEvent(EVENT_CLOSE_FROSTWORN_DOOR, 4000);
- }
- if (Creature* uther = ObjectAccessor::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, 10000);
- break;
- case EVENT_INTRO_LK_2:
- if (Creature* lichking = ObjectAccessor::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 = ObjectAccessor::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:
- // He steps forward and removes the runeblade from the heap of skulls.
- if (Creature* lichking = ObjectAccessor::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 = ObjectAccessor::GetCreature(*me, _lichkingGUID))
- lichking->AI()->Talk(SAY_LK_INTRO_2);
- _events.ScheduleEvent(EVENT_INTRO_LK_6, 10000);
- break;
- case EVENT_INTRO_LK_6:
- // summon Falric and Marwyn. then go back to the door
- 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 = ObjectAccessor::GetCreature(*me, _lichkingGUID))
- {
- lichking->AI()->Talk(SAY_LK_INTRO_3);
- lichking->SetWalk(true);
- lichking->GetMotionMaster()->MovePoint(0, LichKingMoveAwayPos);
- }
- _events.ScheduleEvent(EVENT_INTRO_LK_7, 10000);
- _events.ScheduleEvent(EVENT_OPEN_FROSTWORN_DOOR, 5000);
- break;
- case EVENT_INTRO_LK_7:
- if (Creature* marwyn = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_MARWYN_EVENT)))
- {
- marwyn->AI()->Talk(SAY_MARWYN_INTRO_1);
- marwyn->SetWalk(true);
- marwyn->GetMotionMaster()->MovePoint(0, MarwynStartPos);
- }
- _events.ScheduleEvent(EVENT_INTRO_LK_8, 1000);
- break;
- case EVENT_INTRO_LK_8:
- if (Creature* falric = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_FALRIC_EVENT)))
- {
- falric->AI()->Talk(SAY_FALRIC_INTRO_1);
- falric->SetWalk(true);
- falric->GetMotionMaster()->MovePoint(0, FalricStartPos);
- }
- _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);
- _instance->ProcessEvent(0, EVENT_SPAWN_WAVES);
- _events.ScheduleEvent(EVENT_INTRO_LK_10, 4000);
- 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, LichKingMoveAwayPos);
- /// @todo Loralen/Koreln shall run also
- _events.ScheduleEvent(EVENT_INTRO_LK_11, 5000);
- break;
- case EVENT_INTRO_LK_11:
- if (Creature* lichking = ObjectAccessor::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:
- _instance->SetData(DATA_INTRO_EVENT, DONE);
- // Loralen or Koreln disappearAndDie()
- if (Creature* lichking = ObjectAccessor::GetCreature(*me, _lichkingGUID))
- {
- lichking->DespawnOrUnsummon(5000);
- _lichkingGUID = 0;
- }
- me->DespawnOrUnsummon(10000);
- _events.ScheduleEvent(EVENT_CLOSE_FROSTWORN_DOOR, 7000);
- break;
- case EVENT_SKIP_INTRO:
- me->GetMotionMaster()->MovePoint(0, MoveThronePos);
- /// @todo Loralen/Koreln shall run also
- if (Creature* lichking = me->SummonCreature(NPC_LICH_KING_PART1, LichKingSpawnPos, TEMPSUMMON_MANUAL_DESPAWN))
- {
- lichking->SetWalk(true);
- 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 override
- {
- return GetHallsOfReflectionAI<npc_jaina_or_sylvanas_horAI>(creature);
- }
+Position const IceWallTargetPosition[] =
+{
+ { 5547.833f, 2083.701f, 731.4332f, 1.029744f }, // 1st Icewall
+ { 5503.213f, 1969.547f, 737.0245f, 1.27409f }, // 2nd Icewall
+ { 5439.976f, 1879.005f, 752.7048f, 1.064651f }, // 3rd Icewall
+ { 5318.289f, 1749.184f, 771.9423f, 0.8726646f } // 4th Icewall
};
-class npc_jaina_or_sylvanas_escape_hor : public CreatureScript
+class npc_jaina_or_sylvanas_intro_hor : public CreatureScript
{
public:
- npc_jaina_or_sylvanas_escape_hor() : CreatureScript("npc_jaina_or_sylvanas_escape_hor") { }
-
- // AI of Part2
- struct npc_jaina_or_sylvanas_escape_horAI : public ScriptedAI
- {
- npc_jaina_or_sylvanas_escape_horAI(Creature* creature) : ScriptedAI(creature),
- _instance(creature->GetInstanceScript()), _lichkingGUID(0), _walltargetGUID(0),
- _icewallGUID(0), _icewall(0)
- {
- }
-
- InstanceScript* _instance;
- uint64 _lichkingGUID;
- uint64 _walltargetGUID; // dummy
- uint64 _icewallGUID; // object
- uint32 _icewall; // icewall number
-
- EventMap _events;
+ npc_jaina_or_sylvanas_intro_hor() : CreatureScript("npc_jaina_or_sylvanas_intro_hor") { }
- void Reset() override
+ struct npc_jaina_or_sylvanas_intro_horAI : public ScriptedAI
{
- _events.Reset();
- if (Creature* lichking = ObjectAccessor::GetCreature(*me, _lichkingGUID))
- lichking->DespawnOrUnsummon(1);
- _lichkingGUID = 0;
- _walltargetGUID = 0;
- _icewallGUID = 0;
- _icewall = 0;
- _events.ScheduleEvent(EVENT_ESCAPE, 0);
- }
-
- void JustDied(Unit* /*Killer*/) override
- {
- _instance->SetData(DATA_ESCAPE_EVENT, FAIL);
- }
-
- void DoAction(int32 actionId) override
- {
- switch (actionId)
- {
- case ACTION_START_ESCAPING: // called by InstanceScript when we need to start the escaping event
- _events.ScheduleEvent(EVENT_ESCAPE_1, 1000);
- break;
- case ACTION_WALL_BROKEN:
- _icewall++;
- if (_icewall != 4)
- _events.ScheduleEvent(EVENT_ESCAPE_17, 3000);
- else
- _events.ScheduleEvent(EVENT_ESCAPE_23, 3000);
- break;
+ npc_jaina_or_sylvanas_intro_horAI(Creature* creature) : ScriptedAI(creature)
+ {
+ _instance = me->GetInstanceScript();
+ _utherGUID = 0;
+ _lichkingGUID = 0;
}
- }
- void sGossipSelect(Player* player, uint32 /*sender*/, uint32 action) override
- {
- player->PlayerTalkClass->ClearMenus();
- switch (action)
+ void sGossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override
{
- case 0:
- player->CLOSE_GOSSIP_MENU();
- me->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP|UNIT_NPC_FLAG_QUESTGIVER);
- _events.ScheduleEvent(EVENT_ESCAPE_7, 0);
- break;
- }
- }
+ player->PlayerTalkClass->ClearMenus();
- void DestroyIceWall()
- {
- if (_instance->GetData(DATA_TEAM_IN_INSTANCE) == ALLIANCE)
- me->RemoveAurasDueToSpell(SPELL_JAINA_DESTROY_ICE_WALL);
- else
- me->RemoveAurasDueToSpell(SPELL_SYLVANAS_DESTROY_ICE_WALL);
+ switch (gossipListId)
+ {
+ case 0:
+ player->PlayerTalkClass->SendCloseGossip();
+ _events.ScheduleEvent(EVENT_START_INTRO, 1000);
+ me->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP | UNIT_NPC_FLAG_QUESTGIVER);
+ break;
+ case 1:
+ player->PlayerTalkClass->SendCloseGossip();
+ _events.ScheduleEvent(EVENT_SKIP_INTRO, 1000);
+ me->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP | UNIT_NPC_FLAG_QUESTGIVER);
+ break;
+ default:
+ break;
+ }
+ }
- _instance->HandleGameObject(_icewallGUID, true);
+ void Reset() override
+ {
+ _events.Reset();
- if (Creature* wallTarget = ObjectAccessor::GetCreature(*me, _walltargetGUID))
- wallTarget->DespawnOrUnsummon();
- }
+ _utherGUID = 0;
+ _lichkingGUID = 0;
- void UpdateAI(uint32 diff) override
- {
- _events.Update(diff);
+ me->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP | UNIT_NPC_FLAG_QUESTGIVER);
+ me->SetStandState(UNIT_STAND_STATE_STAND);
+ _events.ScheduleEvent(EVENT_WALK_INTRO1, 3000);
+ }
- while (uint32 event = _events.ExecuteEvent())
+ void UpdateAI(uint32 diff) override
{
- switch (event)
+ _events.Update(diff);
+
+ switch (_events.ExecuteEvent())
{
- case EVENT_ESCAPE:
- if (Creature* lichking = me->SummonCreature(NPC_LICH_KING_PART2, LichKingSpawnPos2, TEMPSUMMON_MANUAL_DESPAWN))
+ case EVENT_WALK_INTRO1:
+ if (Creature* korelnOrLoralen = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_KORELN_LORALEN)))
+ korelnOrLoralen->GetMotionMaster()->MovePoint(0, KorelnOrLoralenPos[0]);
+
+ if (_instance->GetData(DATA_TEAM_IN_INSTANCE) == ALLIANCE)
{
- me->Attack(lichking, true);
- lichking->Attack(me, true);
- me->SetReactState(REACT_PASSIVE);
- lichking->SetReactState(REACT_PASSIVE);
- _lichkingGUID = lichking->GetGUID();
- if (_instance->GetData(DATA_TEAM_IN_INSTANCE) == ALLIANCE)
- DoCast(me, SPELL_JAINA_ICEBARRIER);
- else
- DoCast(me, SPELL_SYLVANAS_CLOAKOFDARKNESS);
+ me->GetMotionMaster()->MovePoint(0, JainaIntroPosition[1]);
+ Talk(SAY_JAINA_INTRO_1);
+ _events.ScheduleEvent(EVENT_WALK_INTRO2, 7000);
}
- me->SetHealth(252000);
- break;
- case EVENT_ESCAPE_1:
- _instance->SetData(DATA_ESCAPE_EVENT, IN_PROGRESS);
- if (Creature* lichking = ObjectAccessor::GetCreature(*me, _lichkingGUID))
+ else
{
- if (_instance->GetData(DATA_TEAM_IN_INSTANCE) == ALLIANCE)
- lichking->AI()->Talk(SAY_LK_ESCAPE_1);
- else
- lichking->AI()->Talk(SAY_LK_ESCAPE_2);
- _events.ScheduleEvent(EVENT_ESCAPE_2, 8000);
+ me->GetMotionMaster()->MovePoint(0, SylvanasIntroPosition[1]);
+ Talk(SAY_SYLVANAS_INTRO_1);
+ _events.ScheduleEvent(EVENT_WALK_INTRO2, 9000);
}
break;
- case EVENT_ESCAPE_2:
+ case EVENT_WALK_INTRO2:
if (_instance->GetData(DATA_TEAM_IN_INSTANCE) == ALLIANCE)
- DoCast(me, SPELL_CAST_VISUAL, true);
+ Talk(SAY_JAINA_INTRO_2);
else
- DoCast(me, SPELL_SYLVANAS_JUMP, true);
- _events.ScheduleEvent(EVENT_ESCAPE_3, 1000);
+ Talk(SAY_SYLVANAS_INTRO_2);
+ me->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP | UNIT_NPC_FLAG_QUESTGIVER);
break;
- case EVENT_ESCAPE_3:
+ case EVENT_START_INTRO:
+ if (Creature* korelnOrLoralen = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_KORELN_LORALEN)))
+ korelnOrLoralen->GetMotionMaster()->MovePoint(0, KorelnOrLoralenPos[1]);
+ // Begining of intro is differents between factions as the speech sequence and timers are differents.
if (_instance->GetData(DATA_TEAM_IN_INSTANCE) == ALLIANCE)
- DoCastAOE(SPELL_JAINA_ICEPRISON, true);
+ {
+ me->GetMotionMaster()->MovePoint(0, JainaIntroPosition[2]);
+ _events.ScheduleEvent(EVENT_INTRO_A2_1, 0);
+ }
else
- DoCastAOE(SPELL_SYLVANAS_DARKBINDING, true);
- _events.ScheduleEvent(EVENT_ESCAPE_4, 2000);
+ {
+ me->GetMotionMaster()->MovePoint(0, SylvanasIntroPosition[2]);
+ _events.ScheduleEvent(EVENT_INTRO_H2_1, 0);
+ }
break;
- case EVENT_ESCAPE_4:
- if (_instance->GetData(DATA_TEAM_IN_INSTANCE) == ALLIANCE)
- Talk(SAY_JAINA_ESCAPE_1);
- else
- Talk(SAY_SYLVANAS_ESCAPE_1);
- _events.ScheduleEvent(EVENT_ESCAPE_5, 2000);
+ // A2 Intro Events
+ case EVENT_INTRO_A2_1:
+ Talk(SAY_JAINA_INTRO_3);
+ _events.ScheduleEvent(EVENT_INTRO_A2_2, 7000);
break;
- case EVENT_ESCAPE_5:
- if (Creature* lichking = ObjectAccessor::GetCreature(*me, _lichkingGUID))
- lichking->CombatStop();
- me->GetMotionMaster()->MovePoint(0, JainaShadowThroneDoor);
- if (_instance->GetData(DATA_TEAM_IN_INSTANCE) == ALLIANCE)
- me->RemoveAurasDueToSpell(SPELL_JAINA_ICEBARRIER);
- else
- me->RemoveAurasDueToSpell(SPELL_SYLVANAS_CLOAKOFDARKNESS);
- _events.ScheduleEvent(EVENT_ESCAPE_6, 5000);
+ case EVENT_INTRO_A2_2:
+ Talk(SAY_JAINA_INTRO_4);
+ _events.ScheduleEvent(EVENT_INTRO_A2_3, 10000);
break;
- case EVENT_ESCAPE_6:
- me->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP|UNIT_NPC_FLAG_QUESTGIVER);
+ case EVENT_INTRO_A2_3:
+ 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_ESCAPE_7:
- if (Creature* lichking = ObjectAccessor::GetCreature(*me, _lichkingGUID))
- {
- if (_instance->GetData(DATA_TEAM_IN_INSTANCE) == ALLIANCE)
- lichking->RemoveAurasDueToSpell(SPELL_JAINA_ICEPRISON);
- else
- lichking->RemoveAurasDueToSpell(SPELL_SYLVANAS_DARKBINDING);
- }
- _events.ScheduleEvent(EVENT_ESCAPE_8, 1000);
+ case EVENT_INTRO_A2_4:
+ if (Creature* uther = me->SummonCreature(NPC_UTHER, UtherSpawnPos, TEMPSUMMON_MANUAL_DESPAWN))
+ _utherGUID = uther->GetGUID();
+ _events.ScheduleEvent(EVENT_INTRO_A2_5, 2000);
break;
- case EVENT_ESCAPE_8:
- if (Creature* lichking = ObjectAccessor::GetCreature(*me, _lichkingGUID))
- lichking->HandleEmoteCommand(TEXT_EMOTE_ROAR);
- me->GetMotionMaster()->MovePoint(0, NpcJainaOrSylvanasEscapeRoute[0]);
- _events.ScheduleEvent(EVENT_ESCAPE_9, 3000);
+ case EVENT_INTRO_A2_5:
+ if (Creature* uther = ObjectAccessor::GetCreature(*me, _utherGUID))
+ uther->AI()->Talk(SAY_UTHER_INTRO_A2_1);
+ _events.ScheduleEvent(EVENT_INTRO_A2_6, 3000);
break;
- case EVENT_ESCAPE_9:
- if (Creature* lichking = ObjectAccessor::GetCreature(*me, _lichkingGUID))
- lichking->GetMotionMaster()->MovePoint(0, NpcJainaOrSylvanasEscapeRoute[0]);
- _events.ScheduleEvent(EVENT_ESCAPE_10, 1000);
+ case EVENT_INTRO_A2_6:
+ Talk(SAY_JAINA_INTRO_5);
+ _events.ScheduleEvent(EVENT_INTRO_A2_7, 7000);
break;
- case EVENT_ESCAPE_10:
- me->GetMotionMaster()->MovePoint(0, NpcJainaOrSylvanasEscapeRoute[1]);
- _events.ScheduleEvent(EVENT_ESCAPE_11, 5000);
+ case EVENT_INTRO_A2_7:
+ if (Creature* uther = ObjectAccessor::GetCreature(*me, _utherGUID))
+ uther->AI()->Talk(SAY_UTHER_INTRO_A2_2);
+ _events.ScheduleEvent(EVENT_INTRO_A2_8, 7000);
break;
- case EVENT_ESCAPE_11:
- me->GetMotionMaster()->MovePoint(0, NpcJainaOrSylvanasEscapeRoute[2]);
- if (Creature* lichking = ObjectAccessor::GetCreature(*me, _lichkingGUID))
- lichking->GetMotionMaster()->MovePoint(0, LichKingFirstSummon);
- _events.ScheduleEvent(EVENT_ESCAPE_12, 6000);
+ case EVENT_INTRO_A2_8:
+ Talk(SAY_JAINA_INTRO_6);
+ _events.ScheduleEvent(EVENT_INTRO_A2_9, 1200);
break;
- case EVENT_ESCAPE_12:
- if (Creature* lichking = ObjectAccessor::GetCreature(*me, _lichkingGUID))
+ case EVENT_INTRO_A2_9:
+ if (Creature* uther = ObjectAccessor::GetCreature(*me, _utherGUID))
+ uther->AI()->Talk(SAY_UTHER_INTRO_A2_3);
+ _events.ScheduleEvent(EVENT_INTRO_A2_10, 11000);
+ break;
+ case EVENT_INTRO_A2_10:
+ Talk(SAY_JAINA_INTRO_7);
+ _events.ScheduleEvent(EVENT_INTRO_A2_11, 6000);
+ break;
+ case EVENT_INTRO_A2_11:
+ if (Creature* uther = ObjectAccessor::GetCreature(*me, _utherGUID))
+ uther->AI()->Talk(SAY_UTHER_INTRO_A2_4);
+ _events.ScheduleEvent(EVENT_INTRO_A2_12, 12000);
+ break;
+ case EVENT_INTRO_A2_12:
+ Talk(SAY_JAINA_INTRO_8);
+ _events.ScheduleEvent(EVENT_INTRO_A2_13, 6000);
+ break;
+ case EVENT_INTRO_A2_13:
+ if (Creature* uther = ObjectAccessor::GetCreature(*me, _utherGUID))
+ uther->AI()->Talk(SAY_UTHER_INTRO_A2_5);
+ _events.ScheduleEvent(EVENT_INTRO_A2_14, 13000);
+ break;
+ case EVENT_INTRO_A2_14:
+ Talk(SAY_JAINA_INTRO_9);
+ _events.ScheduleEvent(EVENT_INTRO_A2_15, 12000);
+ break;
+ case EVENT_INTRO_A2_15:
+ if (Creature* uther = ObjectAccessor::GetCreature(*me, _utherGUID))
+ uther->AI()->Talk(SAY_UTHER_INTRO_A2_6);
+ _events.ScheduleEvent(EVENT_INTRO_A2_16, 25000);
+ break;
+ case EVENT_INTRO_A2_16:
+ if (Creature* uther = ObjectAccessor::GetCreature(*me, _utherGUID))
+ uther->AI()->Talk(SAY_UTHER_INTRO_A2_7);
+ _events.ScheduleEvent(EVENT_INTRO_A2_17, 6000);
+ break;
+ case EVENT_INTRO_A2_17:
+ Talk(SAY_JAINA_INTRO_10);
+ _events.ScheduleEvent(EVENT_INTRO_A2_18, 5000);
+ break;
+ case EVENT_INTRO_A2_18:
+ if (Creature* uther = ObjectAccessor::GetCreature(*me, _utherGUID))
{
- lichking->AI()->Talk(SAY_LK_ESCAPE_3);
- lichking->CastSpell(me, SPELL_RAISE_DEAD);
- lichking->Attack(me, true);
+ uther->HandleEmoteCommand(EMOTE_ONESHOT_NO);
+ uther->AI()->Talk(SAY_UTHER_INTRO_A2_8);
}
- _events.ScheduleEvent(EVENT_ESCAPE_13, 4000);
+ _events.ScheduleEvent(EVENT_INTRO_A2_19, 12000);
break;
- case EVENT_ESCAPE_13:
- if (Creature* lichking = ObjectAccessor::GetCreature(*me, _lichkingGUID))
+ case EVENT_INTRO_A2_19:
+ Talk(SAY_JAINA_INTRO_11);
+ _events.ScheduleEvent(EVENT_INTRO_LK_1, 3000);
+ break;
+ // H2 Intro Events
+ case EVENT_INTRO_H2_1:
+ Talk(SAY_SYLVANAS_INTRO_1);
+ _events.ScheduleEvent(EVENT_INTRO_H2_2, 8000);
+ break;
+ case EVENT_INTRO_H2_2:
+ Talk(SAY_SYLVANAS_INTRO_2);
+ _events.ScheduleEvent(EVENT_INTRO_H2_3, 6000);
+ break;
+ case EVENT_INTRO_H2_3:
+ Talk(SAY_SYLVANAS_INTRO_3);
+ 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:
+ // spawn UTHER during speach 2
+ if (Creature* uther = me->SummonCreature(NPC_UTHER, UtherSpawnPos, TEMPSUMMON_MANUAL_DESPAWN))
+ _utherGUID = uther->GetGUID();
+ _events.ScheduleEvent(EVENT_INTRO_H2_5, 2000);
+ break;
+ case EVENT_INTRO_H2_5:
+ if (Creature* uther = ObjectAccessor::GetCreature(*me, _utherGUID))
+ uther->AI()->Talk(SAY_UTHER_INTRO_H2_1);
+ _events.ScheduleEvent(EVENT_INTRO_H2_6, 11000);
+ break;
+ case EVENT_INTRO_H2_6:
+ Talk(SAY_SYLVANAS_INTRO_4);
+ _events.ScheduleEvent(EVENT_INTRO_H2_7, 3000);
+ break;
+ case EVENT_INTRO_H2_7:
+ if (Creature* uther = ObjectAccessor::GetCreature(*me, _utherGUID))
+ uther->AI()->Talk(SAY_UTHER_INTRO_H2_2);
+ _events.ScheduleEvent(EVENT_INTRO_H2_8, 6000);
+ break;
+ case EVENT_INTRO_H2_8:
+ Talk(SAY_SYLVANAS_INTRO_5);
+ _events.ScheduleEvent(EVENT_INTRO_H2_9, 5000);
+ break;
+ case EVENT_INTRO_H2_9:
+ if (Creature* uther = ObjectAccessor::GetCreature(*me, _utherGUID))
+ uther->AI()->Talk(SAY_UTHER_INTRO_H2_3);
+ _events.ScheduleEvent(EVENT_INTRO_H2_10, 19000);
+ break;
+ case EVENT_INTRO_H2_10:
+ Talk(SAY_SYLVANAS_INTRO_6);
+ _events.ScheduleEvent(EVENT_INTRO_H2_11, 1500);
+ break;
+ case EVENT_INTRO_H2_11:
+ if (Creature* uther = ObjectAccessor::GetCreature(*me, _utherGUID))
+ uther->AI()->Talk(SAY_UTHER_INTRO_H2_4);
+ _events.ScheduleEvent(EVENT_INTRO_H2_12, 19500);
+ break;
+ case EVENT_INTRO_H2_12:
+ Talk(SAY_SYLVANAS_INTRO_7);
+ _events.ScheduleEvent(EVENT_INTRO_H2_13, 2000);
+ break;
+ case EVENT_INTRO_H2_13:
+ if (Creature* uther = ObjectAccessor::GetCreature(*me, _utherGUID))
{
- lichking->CastSpell(lichking, SPELL_REMORSELESS_WINTER, true);
- lichking->CastSpell(lichking, SPELL_SUMMON_RISE_WITCH_DOCTOR);
- lichking->GetMotionMaster()->MoveIdle();
- lichking->GetMotionMaster()->MoveChase(me);
+ uther->HandleEmoteCommand(EMOTE_ONESHOT_NO);
+ uther->AI()->Talk(SAY_UTHER_INTRO_H2_5);
}
- if (Creature* walltarget = me->SummonCreature(NPC_ICE_WALL, IceWalls[0], TEMPSUMMON_MANUAL_DESPAWN, 720000))
+ _events.ScheduleEvent(EVENT_INTRO_H2_14, 12000);
+ break;
+ case EVENT_INTRO_H2_14:
+ if (Creature* uther = ObjectAccessor::GetCreature(*me, _utherGUID))
+ uther->AI()->Talk(SAY_UTHER_INTRO_H2_6);
+ _events.ScheduleEvent(EVENT_INTRO_H2_15, 8000);
+ break;
+ case EVENT_INTRO_H2_15:
+ Talk(SAY_SYLVANAS_INTRO_8);
+ _events.ScheduleEvent(EVENT_INTRO_LK_1, 2000);
+ break;
+ // 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_THE_LICH_KING_INTRO, LichKingIntroPosition[0], TEMPSUMMON_MANUAL_DESPAWN))
{
- _walltargetGUID = walltarget->GetGUID();
- walltarget->CastSpell(walltarget, SPELL_SUMMON_ICE_WALL);
- walltarget->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE);
- me->Attack(walltarget, false);
+ lichking->SetWalk(true);
+ lichking->GetMotionMaster()->MovePoint(0, LichKingIntroPosition[2]);
+ _lichkingGUID = lichking->GetGUID();
+ _events.ScheduleEvent(EVENT_OPEN_IMPENETRABLE_DOOR, 0);
+ _events.ScheduleEvent(EVENT_CLOSE_IMPENETRABLE_DOOR, 4000);
}
- me->GetMotionMaster()->MovePoint(0, NpcJainaOrSylvanasEscapeRoute[3]);
- _events.ScheduleEvent(EVENT_ESCAPE_14, 8000);
- break;
- case EVENT_ESCAPE_14:
- if (Creature* walltarget = ObjectAccessor::GetCreature(*me, _walltargetGUID))
+ if (Creature* uther = ObjectAccessor::GetCreature(*me, _utherGUID))
{
- if (GameObject* icewall = walltarget->FindNearestGameObject(GO_ICE_WALL, 50.00f))
- {
- _icewallGUID = icewall->GetGUID();
- icewall->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_INTERACT_COND);
- _instance->HandleGameObject(0, false, icewall);
- if (_instance->GetData(DATA_TEAM_IN_INSTANCE) == ALLIANCE)
- Talk(SAY_JAINA_ESCAPE_2);
- else
- Talk(SAY_SYLVANAS_ESCAPE_2);
- }
+ 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_ESCAPE_15, 1000);
+ _events.ScheduleEvent(EVENT_INTRO_LK_2, 10000);
break;
- case EVENT_ESCAPE_15:
+ case EVENT_INTRO_LK_2:
if (Creature* lichking = ObjectAccessor::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 = ObjectAccessor::GetCreature(*me, _utherGUID))
{
- lichking->GetMotionMaster()->MoveIdle();
- lichking->GetMotionMaster()->MoveChase(me);
- lichking->SetReactState(REACT_PASSIVE);
+ uther->CastSpell(uther, SPELL_UTHER_DESPAWN, true);
+ uther->DespawnOrUnsummon(5000);
+ _utherGUID = 0;
}
- if (_instance->GetData(DATA_TEAM_IN_INSTANCE) == ALLIANCE)
- DoCast(me, SPELL_JAINA_DESTROY_ICE_WALL, true);
- else
- DoCast(me, SPELL_SYLVANAS_DESTROY_ICE_WALL, true);
+ _events.ScheduleEvent(EVENT_INTRO_LK_4, 9000);
break;
- case EVENT_ESCAPE_17:// ICEWALL BROKEN
- me->GetMotionMaster()->MoveIdle();
+ case EVENT_INTRO_LK_4:
+ // He steps forward and removes the runeblade from the heap of skulls.
if (Creature* lichking = ObjectAccessor::GetCreature(*me, _lichkingGUID))
{
- lichking->StopMoving();
- lichking->AI()->Talk(SAY_LK_ESCAPE_3);
- lichking->CastSpell(me, SPELL_RAISE_DEAD);
+ 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);
}
-
- DestroyIceWall();
-
- if (_icewall && _icewall < 4)
- me->GetMotionMaster()->MovePoint(0, NpcJainaOrSylvanasEscapeRoute[_icewall + 3]);
- _events.ScheduleEvent(EVENT_ESCAPE_18, 2000);
+ _events.ScheduleEvent(EVENT_INTRO_LK_5, 8000);
break;
- case EVENT_ESCAPE_18:
+ case EVENT_INTRO_LK_5:
if (Creature* lichking = ObjectAccessor::GetCreature(*me, _lichkingGUID))
+ lichking->AI()->Talk(SAY_LK_INTRO_2);
+ _events.ScheduleEvent(EVENT_INTRO_LK_6, 10000);
+ break;
+ case EVENT_INTRO_LK_6:
+ // summon Falric and Marwyn. then go back to the door
+ if (Creature* falric = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_FALRIC)))
{
- lichking->GetMotionMaster()->MoveIdle();
- lichking->GetMotionMaster()->MoveChase(me);
+ falric->CastSpell(falric, SPELL_BOSS_SPAWN_AURA, true);
+ falric->SetVisible(true);
}
- _events.ScheduleEvent(EVENT_ESCAPE_19, 6000);
- break;
- case EVENT_ESCAPE_19:
- if (Creature* lichking = ObjectAccessor::GetCreature(*me, _lichkingGUID))
+ if (Creature* marwyn = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_MARWYN)))
{
- if (_icewall && _icewall < 4)
- lichking->CastSpell(lichking, SPELL_SUMMON_RISE_WITCH_DOCTOR);
- lichking->GetMotionMaster()->MoveIdle();
- lichking->GetMotionMaster()->MoveChase(me);
- lichking->SetReactState(REACT_PASSIVE);
- lichking->Attack(me, true);
+ marwyn->CastSpell(marwyn, SPELL_BOSS_SPAWN_AURA, true);
+ marwyn->SetVisible(true);
}
- if (_icewall < 4)
+ if (Creature* lichking = ObjectAccessor::GetCreature(*me, _lichkingGUID))
{
- if (Creature* walltarget = me->SummonCreature(NPC_ICE_WALL, IceWalls[_icewall], TEMPSUMMON_MANUAL_DESPAWN, 720000))
- {
- _walltargetGUID = walltarget->GetGUID();
- walltarget->CastSpell(walltarget, SPELL_SUMMON_ICE_WALL);
- walltarget->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE);
- me->Attack(walltarget, false);
- }
+ lichking->AI()->Talk(SAY_LK_INTRO_3);
+ lichking->SetWalk(true);
+ lichking->GetMotionMaster()->MovePoint(0, LichKingMoveAwayPos);
}
- _events.ScheduleEvent(EVENT_ESCAPE_20, 3000);
+ _events.ScheduleEvent(EVENT_INTRO_LK_7, 10000);
+ _events.ScheduleEvent(EVENT_OPEN_IMPENETRABLE_DOOR, 5000);
break;
- case EVENT_ESCAPE_20:
- if (Creature* walltarget = ObjectAccessor::GetCreature(*me, _walltargetGUID))
+ case EVENT_INTRO_LK_7:
+ if (Creature* marwyn = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_MARWYN)))
{
- if (GameObject* icewall = walltarget->FindNearestGameObject(GO_ICE_WALL, 50.00f))
- {
- _icewallGUID = icewall->GetGUID();
- _instance->HandleGameObject(0, false, icewall);
- icewall->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_INTERACT_COND);
- if (_instance->GetData(DATA_TEAM_IN_INSTANCE) == ALLIANCE)
- {
- if (_icewall == 1)
- Talk(SAY_JAINA_ESCAPE_3);
- else if (_icewall == 2)
- Talk(SAY_JAINA_ESCAPE_4);
- else if (_icewall == 3)
- Talk(SAY_JAINA_ESCAPE_5);
- }
- else if (_instance->GetData(DATA_TEAM_IN_INSTANCE) == HORDE)
- {
- if (_icewall == 1)
- Talk(SAY_SYLVANAS_ESCAPE_3);
- else if (_icewall == 2)
- Talk(SAY_SYLVANAS_ESCAPE_4);
- else if (_icewall == 3)
- Talk(SAY_SYLVANAS_ESCAPE_5);
- }
- }
+ marwyn->AI()->Talk(SAY_MARWYN_INTRO_1);
+ marwyn->SetWalk(true);
+ marwyn->GetMotionMaster()->MovePoint(0, MarwynPosition[1]);
}
- if (Creature* lichking = ObjectAccessor::GetCreature(*me, _lichkingGUID))
+ _events.ScheduleEvent(EVENT_INTRO_LK_8, 1000);
+ break;
+ case EVENT_INTRO_LK_8:
+ if (Creature* falric = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_FALRIC)))
{
- if (_icewall && _icewall < 3)
- lichking->CastSpell(lichking, SPELL_SUMMON_RISE_WITCH_DOCTOR);
- else
- lichking->CastSpell(lichking, SPELL_SUMMON_LUMBERING_ABOMINATION);
+ falric->AI()->Talk(SAY_FALRIC_INTRO_1);
+ falric->SetWalk(true);
+ falric->GetMotionMaster()->MovePoint(0, FalricPosition[1]);
}
- if (_icewall == 3)
- _events.ScheduleEvent(EVENT_ESCAPE_21, 16000); // last wall, really far
- else
- _events.ScheduleEvent(EVENT_ESCAPE_21, 9000);
+ _events.ScheduleEvent(EVENT_INTRO_LK_9, 5000);
+ break;
+ case EVENT_INTRO_LK_9:
+ if (Creature* falric = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_FALRIC)))
+ falric->AI()->Talk(SAY_FALRIC_INTRO_2);
+ _instance->ProcessEvent(0, EVENT_SPAWN_WAVES);
+ _events.ScheduleEvent(EVENT_INTRO_LK_10, 4000);
break;
- case EVENT_ESCAPE_21:
+ case EVENT_INTRO_LK_10:
if (_instance->GetData(DATA_TEAM_IN_INSTANCE) == ALLIANCE)
- DoCast(me, SPELL_JAINA_DESTROY_ICE_WALL, true);
+ Talk(SAY_JAINA_INTRO_END);
else
- DoCast(me, SPELL_SYLVANAS_DESTROY_ICE_WALL, true);
-
+ Talk(SAY_SYLVANAS_INTRO_END);
+ me->GetMotionMaster()->MovePoint(0, LichKingMoveAwayPos);
+ /// @todo: needs some improvements
+ if (Creature* korelnOrLoralen = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_KORELN_LORALEN)))
+ korelnOrLoralen->GetMotionMaster()->MovePoint(1, KorelnOrLoralenPos[2]);
+ _events.ScheduleEvent(EVENT_INTRO_LK_11, 5000);
+ break;
+ case EVENT_INTRO_LK_11:
if (Creature* lichking = ObjectAccessor::GetCreature(*me, _lichkingGUID))
{
- if (_icewall == 1)
- lichking->CastSpell(lichking, SPELL_SUMMON_LUMBERING_ABOMINATION);
- else if (_icewall > 1 && _icewall < 4)
- {
- lichking->CastSpell(lichking, SPELL_SUMMON_RISE_WITCH_DOCTOR);
- _events.ScheduleEvent(EVENT_ESCAPE_22, 1000);
- }
+ 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_ESCAPE_22:
+ case EVENT_INTRO_END:
+ _instance->SetData(DATA_INTRO_EVENT, DONE);
+ _events.ScheduleEvent(EVENT_KORELN_LORALEN_DEATH, 8000);
if (Creature* lichking = ObjectAccessor::GetCreature(*me, _lichkingGUID))
{
- if (_icewall >= 2 && _icewall < 4)
- lichking->CastSpell(lichking, SPELL_SUMMON_LUMBERING_ABOMINATION);
+ lichking->DespawnOrUnsummon(5000);
+ _lichkingGUID = 0;
}
+ me->DespawnOrUnsummon(10000);
+ _events.ScheduleEvent(EVENT_CLOSE_IMPENETRABLE_DOOR, 7000);
break;
- case EVENT_ESCAPE_23: // FINAL PART
- DestroyIceWall();
-
+ case EVENT_SKIP_INTRO:
if (_instance->GetData(DATA_TEAM_IN_INSTANCE) == ALLIANCE)
- Talk(SAY_JAINA_ESCAPE_6);
+ me->GetMotionMaster()->MovePoint(0, JainaIntroPosition[2]);
else
- Talk(SAY_SYLVANAS_ESCAPE_6);
+ me->GetMotionMaster()->MovePoint(0, SylvanasIntroPosition[2]);
- if (Creature* lichking = ObjectAccessor::GetCreature(*me, _lichkingGUID))
+ if (Creature* korelnOrLoralen = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_KORELN_LORALEN)))
+ korelnOrLoralen->GetMotionMaster()->MovePoint(0, KorelnOrLoralenPos[1]);
+
+ if (Creature* lichking = me->SummonCreature(NPC_THE_LICH_KING_INTRO, LichKingIntroPosition[0], TEMPSUMMON_MANUAL_DESPAWN))
{
- lichking->GetMotionMaster()->MovePoint(0, LichKingFinalPos);
- lichking->AI()->Talk(SAY_LK_ESCAPE_11);
+ lichking->SetWalk(true);
+ lichking->GetMotionMaster()->MovePoint(0, LichKingIntroPosition[2]);
+ lichking->SetReactState(REACT_PASSIVE);
+ _lichkingGUID = lichking->GetGUID();
+ _events.ScheduleEvent(EVENT_OPEN_IMPENETRABLE_DOOR, 0);
+ _events.ScheduleEvent(EVENT_CLOSE_IMPENETRABLE_DOOR, 4000);
}
- me->GetMotionMaster()->MovePoint(0, NpcJainaOrSylvanasEscapeRoute[8]);
- _events.ScheduleEvent(EVENT_ESCAPE_24, 10000);
+ _events.ScheduleEvent(EVENT_INTRO_LK_4, 15000);
break;
- case EVENT_ESCAPE_24:
- if (_instance->GetData(DATA_TEAM_IN_INSTANCE) == ALLIANCE)
- Talk(SAY_JAINA_ESCAPE_8);
- else
- Talk(SAY_SYLVANAS_ESCAPE_8);
- _events.ScheduleEvent(EVENT_ESCAPE_25, 5000);
+ case EVENT_OPEN_IMPENETRABLE_DOOR:
+ _instance->HandleGameObject(_instance->GetData64(DATA_IMPENETRABLE_DOOR), true);
break;
- case EVENT_ESCAPE_25:
- if (GameObject* cave = ObjectAccessor::GetGameObject(*me, _instance->GetData64(DATA_CAVE_IN)))
- cave->SetGoState(GO_STATE_READY);
- _events.ScheduleEvent(EVENT_ESCAPE_26, 4000);
+ case EVENT_CLOSE_IMPENETRABLE_DOOR:
+ _instance->HandleGameObject(_instance->GetData64(DATA_IMPENETRABLE_DOOR), false);
break;
- case EVENT_ESCAPE_26:
- if (_instance->GetData(DATA_TEAM_IN_INSTANCE) == ALLIANCE)
- Talk(SAY_JAINA_ESCAPE_10);
+ case EVENT_KORELN_LORALEN_DEATH:
+ if (Creature* korelnOrLoralen = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_KORELN_LORALEN)))
+ korelnOrLoralen->CastSpell(korelnOrLoralen, SPELL_FEIGN_DEATH);
+ break;
+ default:
+ break;
+ }
+ }
+
+ private:
+ InstanceScript* _instance;
+ EventMap _events;
+ uint64 _utherGUID;
+ uint64 _lichkingGUID;
+ };
+
+ CreatureAI* GetAI(Creature* creature) const override
+ {
+ return GetHallsOfReflectionAI<npc_jaina_or_sylvanas_intro_horAI>(creature);
+ }
+};
+
+class npc_jaina_or_sylvanas_escape_hor : public CreatureScript
+{
+ public:
+ npc_jaina_or_sylvanas_escape_hor() : CreatureScript("npc_jaina_or_sylvanas_escape_hor") { }
+
+ bool OnGossipHello(Player* player, Creature* creature) override
+ {
+ // override default gossip
+ if (InstanceScript* instance = creature->GetInstanceScript())
+ if (instance->GetBossState(DATA_THE_LICH_KING_ESCAPE) == DONE)
+ {
+ player->PrepareGossipMenu(creature, creature->GetEntry() == NPC_JAINA_ESCAPE ? GOSSIP_MENU_JAINA_FINAL : GOSSIP_MENU_SYLVANAS_FINAL, true);
+ player->SendPreparedGossip(creature);
+ return true;
+ }
+
+ // load default gossip
+ return false;
+ }
+
+ struct npc_jaina_or_sylvanas_escape_horAI : public ScriptedAI
+ {
+ npc_jaina_or_sylvanas_escape_horAI(Creature* creature) : ScriptedAI(creature),
+ _instance(creature->GetInstanceScript()), _icewall(0), _prefight(false), _invincibility(true) { }
+
+ void Reset() override
+ {
+ _events.Reset();
+ _icewall = 0;
+ _events.ScheduleEvent(EVENT_ESCAPE, 1000);
+ _instance->DoStopTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_NOT_RETREATING_EVENT);
+ }
+
+ void JustDied(Unit* /*killer*/) override
+ {
+ if (Creature* lichking = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_THE_LICH_KING_ESCAPE)))
+ lichking->AI()->EnterEvadeMode(); // event failed
+ }
+
+ void DamageTaken(Unit* /*attacker*/, uint32& damage) override
+ {
+ if (damage >= me->GetHealth() && _invincibility)
+ damage = me->GetHealth() - 1;
+ }
+
+ void DoAction(int32 actionId) override
+ {
+ switch (actionId)
+ {
+ case ACTION_START_PREFIGHT:
+ if (_prefight)
+ return;
+ _prefight = true;
+ _events.ScheduleEvent(EVENT_ESCAPE_1, 1000);
+ break;
+ case ACTION_WALL_BROKEN:
+ ++_icewall;
+ if (_icewall < 4)
+ _events.ScheduleEvent(EVENT_ESCAPE_13, 3000);
else
- Talk(SAY_SYLVANAS_ESCAPE_9);
- _events.ScheduleEvent(EVENT_ESCAPE_27, 4000);
+ _events.ScheduleEvent(EVENT_ESCAPE_15, 3000);
break;
- case EVENT_ESCAPE_27:
- if (_instance->GetData(DATA_TEAM_IN_INSTANCE) == ALLIANCE)
- me->SummonGameObject(IsHeroic() ? GO_CAPTAIN_CHEST_ALLIANCE_HEROIC : GO_CAPTAIN_CHEST_ALLIANCE_NORMAL, ChestPos.GetPositionX(), ChestPos.GetPositionY(), ChestPos.GetPositionZ(), ChestPos.GetOrientation(), 0, 0, 0, 0, 720000);
+ case ACTION_GUNSHIP_ARRIVAL:
+ _events.ScheduleEvent(EVENT_ESCAPE_16, 5000);
+ break;
+ case ACTION_GUNSHIP_ARRIVAL_2:
+ _events.ScheduleEvent(EVENT_ESCAPE_17, 5000);
+ break;
+ default:
+ break;
+ }
+ }
+
+ void sGossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override
+ {
+ player->PlayerTalkClass->ClearMenus();
+
+ switch (gossipListId)
+ {
+ case 0:
+ player->PlayerTalkClass->SendCloseGossip();
+ me->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP);
+ _events.ScheduleEvent(EVENT_ESCAPE_6, 0);
+ break;
+ default:
+ break;
+ }
+ }
+
+ void DestroyIceWall()
+ {
+ if (_instance->GetData(DATA_TEAM_IN_INSTANCE) == ALLIANCE)
+ me->RemoveAurasDueToSpell(SPELL_JAINA_DESTROY_ICE_WALL);
+ else
+ me->RemoveAurasDueToSpell(SPELL_SYLVANAS_DESTROY_ICE_WALL);
+
+ _instance->HandleGameObject(_instance->GetData64(DATA_ICEWALL), true);
+ me->m_Events.AddEvent(new GameObjectDeleteDelayEvent(me, _instance->GetData64(DATA_ICEWALL)), me->m_Events.CalculateTime(5000));
+
+ if (Creature* wallTarget = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_ICEWALL_TARGET)))
+ wallTarget->DespawnOrUnsummon();
+ }
+
+ void SummonIceWall()
+ {
+ if (_icewall < 4)
+ {
+ if (Creature* lichking = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_THE_LICH_KING_ESCAPE)))
+ {
+ lichking->StopMoving();
+ if (Creature* wallTarget = me->SummonCreature(NPC_ICE_WALL_TARGET, IceWallTargetPosition[_icewall], TEMPSUMMON_MANUAL_DESPAWN, 720000))
+ lichking->CastSpell(wallTarget, SPELL_SUMMON_ICE_WALL);
+
+ lichking->AI()->SetData(DATA_ICEWALL, _icewall);
+ }
+ }
+ }
+
+ void AttackIceWall()
+ {
+ if (_icewall < 4)
+ Talk(SAY_JAINA_SYLVANAS_ESCAPE_2 + _icewall);
+
+ if (Creature* wallTarget = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_ICEWALL_TARGET)))
+ me->SetFacingToObject(wallTarget);
+
+ if (_instance->GetData(DATA_TEAM_IN_INSTANCE) == ALLIANCE)
+ DoCast(me, SPELL_JAINA_DESTROY_ICE_WALL, true);
+ else
+ DoCast(me, SPELL_SYLVANAS_DESTROY_ICE_WALL, true);
+ }
+
+ void MovementInform(uint32 type, uint32 pointId) override
+ {
+ if (type != POINT_MOTION_TYPE)
+ return;
+
+ switch (pointId)
+ {
+ case POINT_SHADOW_THRONE_DOOR:
+ if (me->GetEntry() == NPC_JAINA_ESCAPE)
+ me->RemoveAurasDueToSpell(SPELL_JAINA_ICE_BARRIER);
else
- me->SummonGameObject(IsHeroic() ? GO_CAPTAIN_CHEST_HORDE_HEROIC : GO_CAPTAIN_CHEST_HORDE_NORMAL, ChestPos.GetPositionX(), ChestPos.GetPositionY(), ChestPos.GetPositionZ(), ChestPos.GetOrientation(), 0, 0, 0, 0, 720000);
- me->SummonGameObject(GO_PORTAL, FinalPortalPos.GetPositionX(), FinalPortalPos.GetPositionY(), FinalPortalPos.GetPositionZ(), FinalPortalPos.GetOrientation(), 0, 0, 0, 0, 720000);
- if (Creature* lichking = ObjectAccessor::GetCreature(*me, _lichkingGUID))
- lichking->DespawnOrUnsummon(1);
+ me->RemoveAurasDueToSpell(SPELL_SYLVANAS_CLOAK_OF_DARKNESS);
+ me->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP);
+ me->SetHealth(JAINA_SYLVANAS_MAX_HEALTH);
+ me->SetFacingTo(SylvanasShadowThroneDoorPosition.GetOrientation());
+ break;
+ case POINT_ATTACK_ICEWALL:
+ AttackIceWall();
+ break;
+ case POINT_TRAP:
+ Talk(SAY_JAINA_SYLVANAS_ESCAPE_8);
+ if (Creature* lichking = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_THE_LICH_KING_ESCAPE)))
+ me->SetFacingToObject(lichking);
break;
+ default:
+ break;
+ }
+ }
+
+ void DeleteAllFromThreatList(Unit* target, uint64 except)
+ {
+ ThreatContainer::StorageType threatlist = target->getThreatManager().getThreatList();
+ for (auto i : threatlist)
+ {
+ if (i->getUnitGuid() == except)
+ continue;
+
+ i->removeReference();
+ }
+ }
+
+ void UpdateAI(uint32 diff) override
+ {
+ _events.Update(diff);
+
+ while (uint32 event = _events.ExecuteEvent())
+ {
+ switch (event)
+ {
+ case EVENT_ESCAPE:
+ if (_instance->GetData(DATA_TEAM_IN_INSTANCE) == ALLIANCE)
+ DoCast(me, SPELL_JAINA_ICE_BARRIER);
+ else
+ DoCast(me, SPELL_SYLVANAS_CLOAK_OF_DARKNESS);
+
+ if (Creature* lichking = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_THE_LICH_KING_ESCAPE)))
+ {
+ AttackStart(lichking);
+ lichking->AI()->AttackStart(me);
+ me->CastSpell(lichking, SPELL_TAUNT_ARTHAS, true);
+ }
+ me->SetHealth(JAINA_SYLVANAS_MAX_HEALTH);
+ me->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP | UNIT_NPC_FLAG_QUESTGIVER);
+ break;
+ case EVENT_ESCAPE_1:
+ if (Creature* lichking = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_THE_LICH_KING_ESCAPE)))
+ {
+ if (_instance->GetData(DATA_TEAM_IN_INSTANCE) == ALLIANCE)
+ lichking->AI()->Talk(SAY_LK_ESCAPE_1);
+ else
+ lichking->AI()->Talk(SAY_LK_ESCAPE_2);
+ _events.ScheduleEvent(EVENT_ESCAPE_2, 8000);
+ }
+ break;
+ case EVENT_ESCAPE_2:
+ me->AttackStop();
+ me->StopMoving();
+ me->SetReactState(REACT_PASSIVE);
+
+ if (_instance->GetData(DATA_TEAM_IN_INSTANCE) == ALLIANCE)
+ DoCast(me, SPELL_JAINA_ICE_PRISON, false);
+ else
+ DoCast(me, SPELL_SYLVANAS_BLINDING_RETREAT, true);
+
+ if (Creature* lichking = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_THE_LICH_KING_ESCAPE)))
+ {
+ lichking->SetReactState(REACT_PASSIVE);
+ lichking->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_PACIFIED);
+ }
+
+ _events.ScheduleEvent(EVENT_ESCAPE_3, 1500);
+ break;
+ case EVENT_ESCAPE_3:
+ if (_instance->GetData(DATA_TEAM_IN_INSTANCE) == HORDE)
+ DoCastAOE(SPELL_SYLVANAS_DARK_BINDING, true);
+ _events.ScheduleEvent(EVENT_ESCAPE_4, 1000);
+ break;
+ case EVENT_ESCAPE_4:
+ if (_instance->GetData(DATA_TEAM_IN_INSTANCE) == ALLIANCE)
+ DoCast(me, SPELL_CREDIT_FINDING_JAINA);
+ else
+ DoCast(me, SPELL_CREDIT_FINDING_SYLVANAS);
+ Talk(SAY_JAINA_SYLVANAS_ESCAPE_1);
+
+ if (Creature* lichking = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_THE_LICH_KING_ESCAPE)))
+ {
+ lichking->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC);
+ lichking->RemoveAllAttackers();
+
+ DeleteAllFromThreatList(lichking, me->GetGUID());
+ }
+
+ _events.ScheduleEvent(EVENT_ESCAPE_5, 2000);
+ break;
+ case EVENT_ESCAPE_5:
+ me->GetMotionMaster()->MovePoint(POINT_SHADOW_THRONE_DOOR, SylvanasShadowThroneDoorPosition);
+ break;
+ case EVENT_ESCAPE_6:
+ if (Creature* lichking = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_THE_LICH_KING_ESCAPE)))
+ {
+ lichking->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_PACIFIED);
+
+ if (_instance->GetData(DATA_TEAM_IN_INSTANCE) == ALLIANCE)
+ {
+ lichking->CastSpell(lichking, SPELL_STUN_BREAK_JAINA);
+ lichking->RemoveAurasDueToSpell(SPELL_JAINA_ICE_PRISON);
+ }
+ else
+ {
+ lichking->CastSpell(lichking, SPELL_STUN_BREAK_SYLVANAS);
+ lichking->RemoveAurasDueToSpell(SPELL_SYLVANAS_DARK_BINDING);
+ }
+ }
+ _invincibility = false;
+ _instance->DoStartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_NOT_RETREATING_EVENT);
+ _events.ScheduleEvent(EVENT_ESCAPE_7, 1000);
+ break;
+ case EVENT_ESCAPE_7:
+ if (Creature* lichking = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_THE_LICH_KING_ESCAPE)))
+ lichking->HandleEmoteCommand(TEXT_EMOTE_ROAR);
+ me->GetMotionMaster()->MovePoint(0, NpcJainaOrSylvanasEscapeRoute[0]);
+ _events.ScheduleEvent(EVENT_ESCAPE_8, 3000);
+ break;
+ case EVENT_ESCAPE_8:
+ if (Creature* lichking = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_THE_LICH_KING_ESCAPE)))
+ lichking->GetMotionMaster()->MovePoint(0, NpcJainaOrSylvanasEscapeRoute[0]);
+ _events.ScheduleEvent(EVENT_ESCAPE_9, 1000);
+ break;
+ case EVENT_ESCAPE_9:
+ me->GetMotionMaster()->MovePoint(0, NpcJainaOrSylvanasEscapeRoute[1]);
+ _events.ScheduleEvent(EVENT_ESCAPE_10, 5000);
+ break;
+ case EVENT_ESCAPE_10:
+ me->GetMotionMaster()->MovePoint(0, NpcJainaOrSylvanasEscapeRoute[2]);
+ if (Creature* lichking = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_THE_LICH_KING_ESCAPE)))
+ lichking->GetMotionMaster()->MovePoint(1, LichKingFirstSummon);
+ _events.ScheduleEvent(EVENT_ESCAPE_11, 6000);
+ break;
+ case EVENT_ESCAPE_11:
+ SummonIceWall();
+ _events.ScheduleEvent(EVENT_ESCAPE_12, 4000);
+ break;
+ case EVENT_ESCAPE_12:
+ if (Creature* lichking = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_THE_LICH_KING_ESCAPE)))
+ lichking->CastSpell(lichking, SPELL_PAIN_AND_SUFFERING, true);
+
+ me->GetMotionMaster()->MovePoint(POINT_ATTACK_ICEWALL, NpcJainaOrSylvanasEscapeRoute[3]);
+ break;
+ case EVENT_ESCAPE_13: // ICEWALL BROKEN
+ DestroyIceWall();
+
+ if (_icewall && _icewall < 4)
+ me->GetMotionMaster()->MovePoint(POINT_ATTACK_ICEWALL, NpcJainaOrSylvanasEscapeRoute[_icewall + 3]);
+ _events.ScheduleEvent(EVENT_ESCAPE_14, 8000);
+ break;
+ case EVENT_ESCAPE_14:
+ SummonIceWall();
+ break;
+ case EVENT_ESCAPE_15: // FINAL PART
+ DestroyIceWall();
+
+ Talk(SAY_JAINA_SYLVANAS_ESCAPE_6);
+
+ if (Creature* lichking = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_THE_LICH_KING_ESCAPE)))
+ {
+ lichking->GetMotionMaster()->MovePoint(2, LichKingFinalPos);
+ lichking->RemoveAurasDueToSpell(SPELL_REMORSELESS_WINTER);
+ }
+ me->GetMotionMaster()->MovePoint(POINT_TRAP, NpcJainaOrSylvanasEscapeRoute[7]);
+ break;
+ case EVENT_ESCAPE_16:
+ me->RemoveAurasDueToSpell(SPELL_HARVEST_SOUL);
+ if (_instance->GetData(DATA_TEAM_IN_INSTANCE) == ALLIANCE)
+ Talk(SAY_JAINA_ESCAPE_9);
+ if (Transport* gunship = ObjectAccessor::GetTransport(*me, _instance->GetData64(DATA_GUNSHIP)))
+ gunship->EnableMovement(true);
+ _instance->SetBossState(DATA_THE_LICH_KING_ESCAPE, DONE);
+ break;
+ case EVENT_ESCAPE_17:
+ if (_instance->GetData(DATA_TEAM_IN_INSTANCE) == ALLIANCE)
+ Talk(SAY_JAINA_ESCAPE_10);
+ else
+ Talk(SAY_SYLVANAS_ESCAPE_9);
+ DoCast(me, SPELL_CREDIT_ESCAPING_ARTHAS);
+ me->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP | UNIT_NPC_FLAG_QUESTGIVER);
+ break;
+ default:
+ break;
}
}
+
+ DoMeleeAttackIfReady();
}
- };
- CreatureAI* GetAI(Creature* creature) const override
- {
- return GetHallsOfReflectionAI<npc_jaina_or_sylvanas_escape_horAI>(creature);
- }
+ private:
+ InstanceScript* _instance;
+ EventMap _events;
+ uint32 _icewall; // icewall number
+ bool _prefight;
+ bool _invincibility;
+ };
+
+ CreatureAI* GetAI(Creature* creature) const override
+ {
+ return GetHallsOfReflectionAI<npc_jaina_or_sylvanas_escape_horAI>(creature);
+ }
+};
+
+class npc_the_lich_king_escape_hor : public CreatureScript
+{
+ public:
+ npc_the_lich_king_escape_hor() : CreatureScript("npc_the_lich_king_escape_hor") { }
+
+ struct npc_the_lich_king_escape_horAI : public ScriptedAI
+ {
+ npc_the_lich_king_escape_horAI(Creature* creature) : ScriptedAI(creature)
+ {
+ _instance = me->GetInstanceScript();
+ _instance->SetBossState(DATA_THE_LICH_KING_ESCAPE, NOT_STARTED);
+ _summonsCount = 0;
+ _icewall = 0;
+ _despawn = false;
+ }
+
+ void DamageTaken(Unit* /*attacker*/, uint32& damage) override
+ {
+ if (damage >= me->GetHealth())
+ damage = me->GetHealth() - 1;
+ }
+
+ void MovementInform(uint32 type, uint32 pointId) override
+ {
+ if (type == POINT_MOTION_TYPE)
+ {
+ switch (pointId)
+ {
+ case 1:
+ if (Creature* target = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_ESCAPE_LEADER)))
+ me->GetMotionMaster()->MoveChase(target);
+ break;
+ case 2:
+ Talk(SAY_LK_ESCAPE_HARVEST_SOUL);
+
+ if (Creature* target = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_ESCAPE_LEADER)))
+ DoCast(target, SPELL_HARVEST_SOUL);
+
+ if (Transport* gunship = ObjectAccessor::GetTransport(*me, _instance->GetData64(DATA_GUNSHIP)))
+ gunship->EnableMovement(true);
+ break;
+ default:
+ break;
+ }
+ }
+ }
+
+ void JustSummoned(Creature* /*summon*/) override
+ {
+ ++_summonsCount;
+ }
+
+ void SummonedCreatureDies(Creature* /*summon*/, Unit* /*killer*/) override
+ {
+ // should never happen
+ if (!_summonsCount)
+ return;
+
+ --_summonsCount;
+
+ // All summons dead and no summon events scheduled
+ if (!_summonsCount && _events.Empty())
+ {
+ if (Creature* jainaOrSylvanas = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_ESCAPE_LEADER)))
+ jainaOrSylvanas->AI()->DoAction(ACTION_WALL_BROKEN);
+ }
+ }
+
+ void KilledUnit(Unit* who) override
+ {
+ if (who->GetTypeId() == TYPEID_PLAYER)
+ DoPlaySoundToSet(me, RAND(SOUND_LK_SLAY_1, SOUND_LK_SLAY_2));
+ }
+
+ void SetData(uint32 type, uint32 data) override
+ {
+ if (type != DATA_ICEWALL)
+ return;
+
+ _icewall = data;
+
+ switch (_icewall)
+ {
+ case 0: // 6 Ghouls, 1 Witch Doctor
+ DoZoneInCombat();
+ _events.ScheduleEvent(EVENT_REMORSELESS_WINTER, 0);
+ _events.ScheduleEvent(EVENT_ESCAPE_SUMMON_GHOULS, 8000);
+ _events.ScheduleEvent(EVENT_ESCAPE_SUMMON_WITCH_DOCTOR, 14000);
+ Talk(SAY_LK_ESCAPE_ICEWALL_SUMMONED_1);
+ break;
+ case 1: // 6 Ghouls, 2 Witch Doctor, 1 Lumbering Abomination
+ _events.ScheduleEvent(EVENT_ESCAPE_SUMMON_GHOULS, 8000);
+ _events.ScheduleEvent(EVENT_ESCAPE_SUMMON_LUMBERING_ABOMINATION, 13000);
+ _events.ScheduleEvent(EVENT_ESCAPE_SUMMON_WITCH_DOCTOR, 16000);
+ _events.ScheduleEvent(EVENT_ESCAPE_SUMMON_WITCH_DOCTOR, 18000);
+ Talk(SAY_LK_ESCAPE_ICEWALL_SUMMONED_2);
+ break;
+ case 2: // 6 Ghouls, 2 Witch Doctor, 2 Lumbering Abomination
+ _events.ScheduleEvent(EVENT_ESCAPE_SUMMON_GHOULS, 9000);
+ _events.ScheduleEvent(EVENT_ESCAPE_SUMMON_LUMBERING_ABOMINATION, 14000);
+ _events.ScheduleEvent(EVENT_ESCAPE_SUMMON_WITCH_DOCTOR, 17000);
+ _events.ScheduleEvent(EVENT_ESCAPE_SUMMON_LUMBERING_ABOMINATION, 19000);
+ _events.ScheduleEvent(EVENT_ESCAPE_SUMMON_WITCH_DOCTOR, 39000);
+ Talk(SAY_LK_ESCAPE_ICEWALL_SUMMONED_3);
+ break;
+ case 3: // 12 Ghouls, 4 Witch Doctor, 3 Lumbering Abomination
+ _events.ScheduleEvent(EVENT_ESCAPE_SUMMON_GHOULS, 9000);
+ _events.ScheduleEvent(EVENT_ESCAPE_SUMMON_WITCH_DOCTOR, 17000);
+ _events.ScheduleEvent(EVENT_ESCAPE_SUMMON_WITCH_DOCTOR, 19000);
+ _events.ScheduleEvent(EVENT_ESCAPE_SUMMON_LUMBERING_ABOMINATION, 40000);
+ _events.ScheduleEvent(EVENT_ESCAPE_SUMMON_LUMBERING_ABOMINATION, 46000);
+ _events.ScheduleEvent(EVENT_ESCAPE_SUMMON_GHOULS, 55000);
+ _events.ScheduleEvent(EVENT_ESCAPE_SUMMON_WITCH_DOCTOR, 62000);
+ _events.ScheduleEvent(EVENT_ESCAPE_SUMMON_WITCH_DOCTOR, 66000);
+ _events.ScheduleEvent(EVENT_ESCAPE_SUMMON_LUMBERING_ABOMINATION, 14000);
+ Talk(SAY_LK_ESCAPE_ICEWALL_SUMMONED_4);
+ break;
+ default:
+ break;
+ }
+ }
+
+ void EnterEvadeMode() override
+ {
+ if (_despawn)
+ return;
+
+ _instance->SetBossState(DATA_THE_LICH_KING_ESCAPE, FAIL);
+ me->StopMoving();
+ DoPlaySoundToSet(me, SOUND_LK_FURY_OF_FROSTMOURNE);
+ DoCastAOE(SPELL_FURY_OF_FROSTMOURNE);
+ me->DespawnOrUnsummon(12000);
+ _despawn = true;
+ }
+
+ void UpdateAI(uint32 diff) override
+ {
+ if (!SelectVictim())
+ return;
+
+ _events.Update(diff);
+
+ if (me->HasUnitState(UNIT_STATE_CASTING))
+ return;
+
+ while (uint32 event = _events.ExecuteEvent())
+ {
+ switch (event)
+ {
+ case EVENT_REMORSELESS_WINTER:
+ me->StopMoving();
+ Talk(SAY_LK_ESCAPE_WINTER);
+ DoCast(me, SPELL_REMORSELESS_WINTER);
+ break;
+ case EVENT_ESCAPE_SUMMON_GHOULS:
+ me->StopMoving();
+ Talk(SAY_LK_ESCAPE_GHOULS);
+ DoCast(me, SPELL_RAISE_DEAD);
+ break;
+ case EVENT_ESCAPE_SUMMON_WITCH_DOCTOR:
+ DoCast(me, SPELL_SUMMON_RISEN_WITCH_DOCTOR);
+ break;
+ case EVENT_ESCAPE_SUMMON_LUMBERING_ABOMINATION:
+ Talk(SAY_LK_ESCAPE_ABOMINATION);
+ DoCast(me, SPELL_SUMMON_LUMBERING_ABOMINATION);
+ break;
+ default:
+ break;
+ }
+ }
+
+ DoMeleeAttackIfReady();
+ }
+
+ private:
+ bool SelectVictim()
+ {
+ if (!me->IsInCombat())
+ return false;
+
+ if (!me->HasReactState(REACT_PASSIVE))
+ {
+ if (Unit* victim = me->SelectVictim())
+ AttackStart(victim);
+ return me->GetVictim();
+ }
+ else if (me->getThreatManager().getThreatList().size() < 2 && me->HasAura(SPELL_REMORSELESS_WINTER))
+ {
+ EnterEvadeMode();
+ return false;
+ }
+
+ return true;
+ }
+
+ InstanceScript* _instance;
+ EventMap _events;
+ uint8 _icewall;
+ uint32 _summonsCount;
+ bool _despawn;
+ };
+
+ CreatureAI* GetAI(Creature* creature) const override
+ {
+ return GetHallsOfReflectionAI<npc_the_lich_king_escape_horAI>(creature);
+ }
};
enum TrashSpells
@@ -1140,7 +1374,7 @@ enum TrashSpells
SPELL_SHOOT = 72208,
SPELL_CURSED_ARROW = 72222,
SPELL_FROST_TRAP = 72215,
- SPELL_ICE_SHOT = 72268,
+ SPELL_ICE_SHOT = 72268
};
enum TrashEvents
@@ -1175,19 +1409,16 @@ enum TrashEvents
EVENT_SHOOT,
EVENT_CURSED_ARROW,
EVENT_FROST_TRAP,
- EVENT_ICE_SHOT,
+ EVENT_ICE_SHOT
};
struct npc_gauntlet_trash : public ScriptedAI
{
- npc_gauntlet_trash(Creature* creature) : ScriptedAI(creature), _instance(creature->GetInstanceScript())
- {
- InternalWaveId = 0;
- }
+ npc_gauntlet_trash(Creature* creature) : ScriptedAI(creature),
+ _instance(creature->GetInstanceScript()), InternalWaveId(0) { }
void Reset() override
{
- InternalWaveId = 0;
me->CastSpell(me, SPELL_WELL_OF_SOULS, true);
_events.Reset();
}
@@ -1222,352 +1453,362 @@ protected:
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) { }
+ public:
+ npc_ghostly_priest() : CreatureScript("npc_ghostly_priest") { }
- void EnterCombat(Unit* /*who*/) override
+ struct npc_ghostly_priestAI : public npc_gauntlet_trash
{
- _events.ScheduleEvent(EVENT_SHADOW_WORD_PAIN, 8000); /// @todo adjust timers
- _events.ScheduleEvent(EVENT_CIRCLE_OF_DESTRUCTION, 12000);
- _events.ScheduleEvent(EVENT_COWER_IN_FEAR, 10000);
- _events.ScheduleEvent(EVENT_DARK_MENDING, 20000);
- }
+ npc_ghostly_priestAI(Creature* creature) : npc_gauntlet_trash(creature) { }
- void UpdateAI(uint32 diff) override
- {
- if (!UpdateVictim())
- return;
-
- _events.Update(diff);
-
- if (me->HasUnitState(UNIT_STATE_CASTING))
- return;
-
- switch (_events.ExecuteEvent())
- {
- 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;
+ void EnterCombat(Unit* /*who*/) override
+ {
+ _events.ScheduleEvent(EVENT_SHADOW_WORD_PAIN, urand(6000, 15000));
+ _events.ScheduleEvent(EVENT_CIRCLE_OF_DESTRUCTION, 12000);
+ _events.ScheduleEvent(EVENT_COWER_IN_FEAR, 10000);
+ _events.ScheduleEvent(EVENT_DARK_MENDING, 20000);
}
- DoMeleeAttackIfReady();
- }
- };
+ void UpdateAI(uint32 diff) override
+ {
+ if (!UpdateVictim())
+ return;
- CreatureAI* GetAI(Creature* creature) const override
- {
- return GetInstanceAI<npc_ghostly_priestAI>(creature);
- }
-};
+ _events.Update(diff);
-class npc_phantom_mage : public CreatureScript
-{
-public:
- npc_phantom_mage() : CreatureScript("npc_phantom_mage") { }
+ if (me->HasUnitState(UNIT_STATE_CASTING))
+ return;
- struct npc_phantom_mageAI : public npc_gauntlet_trash
- {
- npc_phantom_mageAI(Creature* creature) : npc_gauntlet_trash(creature) { }
+ switch (_events.ExecuteEvent())
+ {
+ case EVENT_SHADOW_WORD_PAIN:
+ if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 40.0f, true))
+ DoCast(target, SPELL_SHADOW_WORD_PAIN);
+ _events.ScheduleEvent(EVENT_SHADOW_WORD_PAIN, urand(6000, 15000));
+ break;
+ case EVENT_CIRCLE_OF_DESTRUCTION:
+ if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 10.0f, true))
+ 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, 0, 20.0f, true))
+ 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;
+ default:
+ break;
+ }
+
+ DoMeleeAttackIfReady();
+ }
+ };
- void EnterEvadeMode() override
+ CreatureAI* GetAI(Creature* creature) const override
{
- if (!me->HasAura(AURA_HALLUCINATION))
- npc_gauntlet_trash::EnterEvadeMode();
+ return GetHallsOfReflectionAI<npc_ghostly_priestAI>(creature);
}
+};
- void EnterCombat(Unit* /*who*/) override
+class npc_phantom_mage : public CreatureScript
+{
+ public:
+ npc_phantom_mage() : CreatureScript("npc_phantom_mage") { }
+
+ struct npc_phantom_mageAI : public npc_gauntlet_trash
{
- _events.ScheduleEvent(EVENT_FIREBALL, 3000); /// @todo adjust timers
- _events.ScheduleEvent(EVENT_FLAMESTRIKE, 6000);
- _events.ScheduleEvent(EVENT_FROSTBOLT, 9000);
- _events.ScheduleEvent(EVENT_CHAINS_OF_ICE, 12000);
- _events.ScheduleEvent(EVENT_HALLUCINATION, 40000);
- }
+ npc_phantom_mageAI(Creature* creature) : npc_gauntlet_trash(creature) { }
+
+ void EnterEvadeMode() override
+ {
+ if (!me->HasAura(AURA_HALLUCINATION))
+ npc_gauntlet_trash::EnterEvadeMode();
+ }
- void UpdateAI(uint32 diff) override
+ void EnterCombat(Unit* /*who*/) override
+ {
+ _events.ScheduleEvent(EVENT_FIREBALL, 3000);
+ _events.ScheduleEvent(EVENT_FLAMESTRIKE, 6000);
+ _events.ScheduleEvent(EVENT_FROSTBOLT, 9000);
+ _events.ScheduleEvent(EVENT_CHAINS_OF_ICE, 12000);
+ _events.ScheduleEvent(EVENT_HALLUCINATION, 40000);
+ }
+
+ void UpdateAI(uint32 diff) override
+ {
+ if (!UpdateVictim())
+ return;
+
+ _events.Update(diff);
+
+ if (me->HasUnitState(UNIT_STATE_CASTING))
+ return;
+
+ switch (_events.ExecuteEvent())
+ {
+ case EVENT_FIREBALL:
+ if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 40.0f, true))
+ DoCast(target, SPELL_FIREBALL);
+ _events.ScheduleEvent(EVENT_FIREBALL, 15000);
+ break;
+ case EVENT_FLAMESTRIKE:
+ if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 40.0f, true))
+ DoCast(target, SPELL_FLAMESTRIKE);
+ _events.ScheduleEvent(EVENT_FLAMESTRIKE, 15000);
+ break;
+ case EVENT_FROSTBOLT:
+ if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 40.0f, true))
+ 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:
+ // removing any dots on mage or else the invisibility spell will break duration
+ me->RemoveAllAuras();
+ DoCast(me, SPELL_HALLUCINATION);
+ break;
+ default:
+ break;
+ }
+
+ DoMeleeAttackIfReady();
+ }
+ };
+
+ CreatureAI* GetAI(Creature* creature) const override
{
- if (!UpdateVictim())
- return;
-
- _events.Update(diff);
-
- if (me->HasUnitState(UNIT_STATE_CASTING))
- return;
-
- switch (_events.ExecuteEvent())
- {
- 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:
- // removing any dots on mage or else the invisibility spell will break duration
- me->RemoveAllAuras();
- DoCast(SPELL_HALLUCINATION);
- break;
- }
-
- DoMeleeAttackIfReady();
+ return GetHallsOfReflectionAI<npc_phantom_mageAI>(creature);
}
- };
-
- CreatureAI* GetAI(Creature* creature) const override
- {
- return GetInstanceAI<npc_phantom_mageAI>(creature);
- }
};
class npc_phantom_hallucination : public CreatureScript
{
-public:
- npc_phantom_hallucination() : CreatureScript("npc_phantom_hallucination") { }
-
- struct npc_phantom_hallucinationAI : public npc_phantom_mage::npc_phantom_mageAI
- {
- npc_phantom_hallucinationAI(Creature* creature) : npc_phantom_mage::npc_phantom_mageAI(creature) { }
+ public:
+ npc_phantom_hallucination() : CreatureScript("npc_phantom_hallucination") { }
- void Reset() override
+ struct npc_phantom_hallucinationAI : public npc_phantom_mage::npc_phantom_mageAI
{
- if (Unit* unit = me->SelectNearestTarget())
- AttackStart(unit);
- DoZoneInCombat();
- }
+ npc_phantom_hallucinationAI(Creature* creature) : npc_phantom_mage::npc_phantom_mageAI(creature) { }
- void EnterEvadeMode() override
- {
- if (me->GetOwner() && !me->GetOwner()->HasAura(AURA_HALLUCINATION))
- npc_phantom_mage::npc_phantom_mageAI::EnterEvadeMode();
- }
+ void Reset() override
+ {
+ DoZoneInCombat(me, 150.0f);
+ }
+
+ void EnterEvadeMode() override
+ {
+ if (me->GetOwner() && !me->GetOwner()->HasAura(AURA_HALLUCINATION))
+ npc_phantom_mage::npc_phantom_mageAI::EnterEvadeMode();
+ }
+
+ void JustDied(Unit* /*killer*/) override
+ {
+ DoCastAOE(SPELL_HALLUCINATION_2);
+ }
+ };
- void JustDied(Unit* /*killer*/) override
+ CreatureAI* GetAI(Creature* creature) const override
{
- DoCast(SPELL_HALLUCINATION_2);
+ return new npc_phantom_hallucinationAI(creature);
}
- };
-
- CreatureAI* GetAI(Creature* creature) const override
- {
- return new npc_phantom_hallucinationAI(creature);
- }
};
class npc_shadowy_mercenary : public CreatureScript
{
-public:
- npc_shadowy_mercenary() : CreatureScript("npc_shadowy_mercenary") { }
-
- struct npc_shadowy_mercenaryAI : public npc_gauntlet_trash
- {
- npc_shadowy_mercenaryAI(Creature* creature) : npc_gauntlet_trash(creature) { }
+ public:
+ npc_shadowy_mercenary() : CreatureScript("npc_shadowy_mercenary") { }
- void EnterCombat(Unit* /*who*/) override
+ struct npc_shadowy_mercenaryAI : public npc_gauntlet_trash
{
- _events.ScheduleEvent(EVENT_SHADOW_STEP, 8000); /// @todo adjust timers
- _events.ScheduleEvent(EVENT_DEADLY_POISON, 5000);
- _events.ScheduleEvent(EVENT_ENVENOMED_DAGGER_THROW, 10000);
- _events.ScheduleEvent(EVENT_KIDNEY_SHOT, 12000);
- }
+ npc_shadowy_mercenaryAI(Creature* creature) : npc_gauntlet_trash(creature) { }
+
+ void EnterCombat(Unit* /*who*/) override
+ {
+ _events.ScheduleEvent(EVENT_SHADOW_STEP, 23000);
+ _events.ScheduleEvent(EVENT_DEADLY_POISON, 5000);
+ _events.ScheduleEvent(EVENT_ENVENOMED_DAGGER_THROW, 10000);
+ _events.ScheduleEvent(EVENT_KIDNEY_SHOT, 12000);
+ }
+
+ void UpdateAI(uint32 diff) override
+ {
+ if (!UpdateVictim())
+ return;
+
+ _events.Update(diff);
- void UpdateAI(uint32 diff) override
+ if (me->HasUnitState(UNIT_STATE_CASTING))
+ return;
+
+ switch (_events.ExecuteEvent())
+ {
+ case EVENT_SHADOW_STEP:
+ if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100.0f, true))
+ DoCast(target, SPELL_SHADOW_STEP);
+ _events.ScheduleEvent(EVENT_SHADOW_STEP, 8000);
+ break;
+ case EVENT_DEADLY_POISON:
+ DoCastVictim(SPELL_DEADLY_POISON);
+ _events.ScheduleEvent(EVENT_DEADLY_POISON, 10000);
+ break;
+ case EVENT_ENVENOMED_DAGGER_THROW:
+ if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 40.0f, true))
+ DoCast(target, SPELL_ENVENOMED_DAGGER_THROW);
+ _events.ScheduleEvent(EVENT_ENVENOMED_DAGGER_THROW, 10000);
+ break;
+ case EVENT_KIDNEY_SHOT:
+ DoCastVictim(SPELL_KIDNEY_SHOT);
+ _events.ScheduleEvent(EVENT_KIDNEY_SHOT, 10000);
+ break;
+ default:
+ break;
+ }
+
+ DoMeleeAttackIfReady();
+ }
+ };
+
+ CreatureAI* GetAI(Creature* creature) const override
{
- if (!UpdateVictim())
- return;
-
- _events.Update(diff);
-
- if (me->HasUnitState(UNIT_STATE_CASTING))
- return;
-
- switch (_events.ExecuteEvent())
- {
- case EVENT_SHADOW_STEP:
- DoCast(SPELL_SHADOW_STEP);
- _events.ScheduleEvent(EVENT_SHADOW_STEP, 8000);
- break;
- case EVENT_DEADLY_POISON:
- DoCastVictim(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:
- DoCastVictim(SPELL_KIDNEY_SHOT);
- _events.ScheduleEvent(EVENT_KIDNEY_SHOT, 10000);
- break;
- }
-
- DoMeleeAttackIfReady();
+ return GetHallsOfReflectionAI<npc_shadowy_mercenaryAI>(creature);
}
- };
-
- CreatureAI* GetAI(Creature* creature) const override
- {
- return GetInstanceAI<npc_shadowy_mercenaryAI>(creature);
- }
};
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) { }
+ public:
+ npc_spectral_footman() : CreatureScript("npc_spectral_footman") { }
- void EnterCombat(Unit* /*who*/) override
+ struct npc_spectral_footmanAI : public npc_gauntlet_trash
{
- _events.ScheduleEvent(EVENT_SPECTRAL_STRIKE, 5000); /// @todo adjust timers
- _events.ScheduleEvent(EVENT_SHIELD_BASH, 10000);
- _events.ScheduleEvent(EVENT_TORTURED_ENRAGE, 15000);
- }
+ npc_spectral_footmanAI(Creature* creature) : npc_gauntlet_trash(creature) { }
- void UpdateAI(uint32 diff) override
- {
- if (!UpdateVictim())
- return;
+ void EnterCombat(Unit* /*who*/) override
+ {
+ _events.ScheduleEvent(EVENT_SPECTRAL_STRIKE, 14000);
+ _events.ScheduleEvent(EVENT_SHIELD_BASH, 10000);
+ _events.ScheduleEvent(EVENT_TORTURED_ENRAGE, 15000);
+ }
+
+ void UpdateAI(uint32 diff) override
+ {
+ if (!UpdateVictim())
+ return;
- _events.Update(diff);
+ _events.Update(diff);
- if (me->HasUnitState(UNIT_STATE_CASTING))
- return;
+ if (me->HasUnitState(UNIT_STATE_CASTING))
+ return;
- switch (_events.ExecuteEvent())
- {
- case EVENT_SPECTRAL_STRIKE:
- DoCastVictim(SPELL_SPECTRAL_STRIKE);
- _events.ScheduleEvent(EVENT_SPECTRAL_STRIKE, 5000);
- break;
- case EVENT_SHIELD_BASH:
- DoCastVictim(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;
+ switch (_events.ExecuteEvent())
+ {
+ case EVENT_SPECTRAL_STRIKE:
+ DoCastVictim(SPELL_SPECTRAL_STRIKE);
+ _events.ScheduleEvent(EVENT_SPECTRAL_STRIKE, 5000);
+ break;
+ case EVENT_SHIELD_BASH:
+ DoCastVictim(SPELL_SHIELD_BASH);
+ _events.ScheduleEvent(EVENT_SHIELD_BASH, 5000);
+ break;
+ case EVENT_TORTURED_ENRAGE:
+ DoCast(me, SPELL_TORTURED_ENRAGE);
+ _events.ScheduleEvent(EVENT_TORTURED_ENRAGE, 15000);
+ break;
+ default:
+ break;
+ }
+
+ DoMeleeAttackIfReady();
}
+ };
- DoMeleeAttackIfReady();
+ CreatureAI* GetAI(Creature* creature) const override
+ {
+ return GetHallsOfReflectionAI<npc_spectral_footmanAI>(creature);
}
- };
-
- CreatureAI* GetAI(Creature* creature) const override
- {
- return GetInstanceAI<npc_spectral_footmanAI>(creature);
- }
};
class npc_tortured_rifleman : public CreatureScript
{
-public:
- npc_tortured_rifleman() : CreatureScript("npc_tortured_rifleman") { }
-
- struct npc_tortured_riflemanAI : public npc_gauntlet_trash
- {
- npc_tortured_riflemanAI(Creature* creature) : npc_gauntlet_trash(creature) { }
+ public:
+ npc_tortured_rifleman() : CreatureScript("npc_tortured_rifleman") { }
- void EnterCombat(Unit* /*who*/) override
+ struct npc_tortured_riflemanAI : public npc_gauntlet_trash
{
- _events.ScheduleEvent(EVENT_SHOOT, 1); /// @todo adjust timers
- _events.ScheduleEvent(EVENT_CURSED_ARROW, 7000);
- _events.ScheduleEvent(EVENT_FROST_TRAP, 10000);
- _events.ScheduleEvent(EVENT_ICE_SHOT, 15000);
- }
+ npc_tortured_riflemanAI(Creature* creature) : npc_gauntlet_trash(creature) { }
+
+ void EnterCombat(Unit* /*who*/) override
+ {
+ _events.ScheduleEvent(EVENT_SHOOT, 1);
+ _events.ScheduleEvent(EVENT_CURSED_ARROW, 7000);
+ _events.ScheduleEvent(EVENT_FROST_TRAP, 10000);
+ _events.ScheduleEvent(EVENT_ICE_SHOT, 15000);
+ }
+
+ void UpdateAI(uint32 diff) override
+ {
+ if (!UpdateVictim())
+ return;
- void UpdateAI(uint32 diff) override
+ _events.Update(diff);
+
+ if (me->HasUnitState(UNIT_STATE_CASTING))
+ return;
+
+ switch (_events.ExecuteEvent())
+ {
+ case EVENT_SHOOT:
+ if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 40.0f, true))
+ DoCast(target, SPELL_SHOOT);
+ _events.ScheduleEvent(EVENT_SHOOT, 2000);
+ break;
+ case EVENT_CURSED_ARROW:
+ if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 40.0f, true))
+ DoCast(target, SPELL_CURSED_ARROW);
+ _events.ScheduleEvent(EVENT_CURSED_ARROW, 10000);
+ break;
+ case EVENT_FROST_TRAP:
+ DoCast(me, SPELL_FROST_TRAP);
+ _events.ScheduleEvent(EVENT_FROST_TRAP, 30000);
+ break;
+ case EVENT_ICE_SHOT:
+ if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 40.0f, true))
+ DoCast(target, SPELL_ICE_SHOT);
+ _events.ScheduleEvent(EVENT_ICE_SHOT, 15000);
+ break;
+ default:
+ break;
+ }
+
+ DoMeleeAttackIfReady();
+ }
+ };
+
+ CreatureAI* GetAI(Creature* creature) const override
{
- 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();
+ return GetHallsOfReflectionAI<npc_tortured_riflemanAI>(creature);
}
- };
-
- CreatureAI* GetAI(Creature* creature) const override
- {
- return GetInstanceAI<npc_tortured_riflemanAI>(creature);
- }
};
-
-enum GeneralEvents
+enum FrostswornGeneral
{
- //General
+ // General
EVENT_SHIELD = 1,
EVENT_SPIKE = 2,
EVENT_CLONE = 3,
@@ -1575,554 +1816,652 @@ enum GeneralEvents
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,
+ SPELL_SHIELD_THROWN = 69222,
+ SPELL_SPIKE = 69184,
+ SPELL_CLONE = 69828,
+ SPELL_GHOST_VISUAL = 69861,
// Reflection
EVENT_BALEFUL_STRIKE = 1,
- SPELL_BALEFUL_STRIKE = 69933, // 70400 on hc
- SPELL_SPIRIT_BURST = 69900, // 73046 on hc
+ SPELL_BALEFUL_STRIKE = 69933,
+ SPELL_SPIRIT_BURST = 69900
};
-class npc_frostworn_general : public CreatureScript
+class npc_frostsworn_general : public CreatureScript
{
-public:
- npc_frostworn_general() : CreatureScript("npc_frostworn_general") { }
+ public:
+ npc_frostsworn_general() : CreatureScript("npc_frostsworn_general") { }
- struct npc_frostworn_generalAI : public ScriptedAI
- {
- npc_frostworn_generalAI(Creature* creature) : ScriptedAI(creature)
+ struct npc_frostsworn_generalAI : public ScriptedAI
{
- _instance = me->GetInstanceScript();
- Reset();
- }
+ npc_frostsworn_generalAI(Creature* creature) : ScriptedAI(creature)
+ {
+ _instance = creature->GetInstanceScript();
+ }
- InstanceScript* _instance;
- EventMap _events;
+ void Reset() override
+ {
+ _events.Reset();
+ _instance->SetData(DATA_FROSTSWORN_GENERAL, NOT_STARTED);
+ }
- void Reset() override
- {
- _events.Reset();
- _instance->SetData(DATA_FROSWORN_EVENT, NOT_STARTED);
- }
+ void JustDied(Unit* /*killer*/) override
+ {
+ Talk(SAY_DEATH);
+ _events.Reset();
+ _instance->SetData(DATA_FROSTSWORN_GENERAL, DONE);
+ }
- void JustDied(Unit* /*killer*/) override
- {
- Talk(SAY_DEATH);
- _instance->SetData(DATA_FROSWORN_EVENT, DONE);
- }
+ void EnterCombat(Unit* /*victim*/) override
+ {
+ Talk(SAY_AGGRO);
+ DoZoneInCombat();
+ _events.ScheduleEvent(EVENT_SHIELD, 5000);
+ _events.ScheduleEvent(EVENT_SPIKE, 14000);
+ _events.ScheduleEvent(EVENT_CLONE, 22000);
+ _instance->SetData(DATA_FROSTSWORN_GENERAL, IN_PROGRESS);
+ }
- void EnterCombat(Unit* /*victim*/) override
- {
- 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) override
+ {
+ if (!UpdateVictim())
+ return;
- void UpdateAI(uint32 diff) override
- {
- if (!UpdateVictim())
- return;
+ _events.Update(diff);
- _events.Update(diff);
+ if (me->HasUnitState(UNIT_STATE_CASTING))
+ return;
- if (me->HasUnitState(UNIT_STATE_CASTING))
- return;
+ while (uint32 event = _events.ExecuteEvent())
+ {
+ switch (event)
+ {
+ case EVENT_SHIELD:
+ if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 45.0f, true))
+ DoCast(target, SPELL_SHIELD_THROWN);
+ _events.ScheduleEvent(EVENT_SHIELD, urand(8000, 12000));
+ break;
+ case EVENT_SPIKE:
+ if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 45.0f, true))
+ DoCast(target, SPELL_SPIKE);
+ _events.ScheduleEvent(EVENT_SPIKE, urand(15000, 20000));
+ break;
+ case EVENT_CLONE:
+ SummonClones();
+ _events.ScheduleEvent(EVENT_CLONE, 60000);
+ break;
+ default:
+ break;
+ }
+ }
+ DoMeleeAttackIfReady();
+ }
- while (uint32 event = _events.ExecuteEvent())
+ void SummonClones()
{
- switch (event)
+ std::list<Unit*> playerList;
+ SelectTargetList(playerList, 5, SELECT_TARGET_TOPAGGRO, 0.0f, true);
+ for (Unit* target : playerList)
{
- 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;
+ if (Creature* reflection = me->SummonCreature(NPC_REFLECTION, *target, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 3000))
+ {
+ target->CastSpell(reflection, SPELL_CLONE, true);
+ target->CastSpell(reflection, SPELL_GHOST_VISUAL, true);
+ reflection->AI()->AttackStart(target);
+ }
}
}
- DoMeleeAttackIfReady();
- }
- void SummonClones()
+ private:
+ InstanceScript* _instance;
+ EventMap _events;
+ };
+
+ CreatureAI* GetAI(Creature* creature) const override
{
- 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);
- }
+ return GetHallsOfReflectionAI<npc_frostsworn_generalAI>(creature);
}
- };
-
- CreatureAI* GetAI(Creature* creature) const override
- {
- return GetInstanceAI<npc_frostworn_generalAI>(creature);
- }
};
class npc_spiritual_reflection : public CreatureScript
{
-public:
- npc_spiritual_reflection() : CreatureScript("npc_spiritual_reflection") { }
+ public:
+ npc_spiritual_reflection() : CreatureScript("npc_spiritual_reflection") { }
- struct npc_spiritual_reflectionAI : public ScriptedAI
- {
- npc_spiritual_reflectionAI(Creature *creature) : ScriptedAI(creature)
+ struct npc_spiritual_reflectionAI : public ScriptedAI
{
- Reset();
- }
+ npc_spiritual_reflectionAI(Creature *creature) : ScriptedAI(creature) { }
- EventMap _events;
+ void Reset() override
+ {
+ _events.Reset();
+ }
- void Reset() override
- {
- _events.Reset();
- }
+ void EnterCombat(Unit* /*victim*/) override
+ {
+ _events.ScheduleEvent(EVENT_BALEFUL_STRIKE, 3000);
+ }
- void EnterCombat(Unit* /*victim*/) override
- {
- _events.ScheduleEvent(EVENT_BALEFUL_STRIKE, 3000);
- }
+ void JustDied(Unit* /*killer*/) override
+ {
+ DoCastAOE(SPELL_SPIRIT_BURST);
+ }
- void JustDied(Unit* killer) override
- {
- DoCast(killer, SPELL_SPIRIT_BURST);
- }
+ void UpdateAI(uint32 diff) override
+ {
+ if (!UpdateVictim())
+ return;
- void UpdateAI(uint32 diff) override
- {
- if (!UpdateVictim())
- return;
+ _events.Update(diff);
- _events.Update(diff);
+ if (me->HasUnitState(UNIT_STATE_CASTING))
+ return;
- if (me->HasUnitState(UNIT_STATE_CASTING))
- return;
+ switch (_events.ExecuteEvent())
+ {
+ case EVENT_BALEFUL_STRIKE:
+ if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 8.0f, true))
+ DoCast(target, SPELL_BALEFUL_STRIKE);
+ _events.ScheduleEvent(EVENT_BALEFUL_STRIKE, urand(3000, 8000));
+ break;
+ default:
+ break;
+ }
- switch (_events.ExecuteEvent())
- {
- 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();
}
- DoMeleeAttackIfReady();
- }
- };
+ private:
+ EventMap _events;
+ };
- CreatureAI* GetAI(Creature* creature) const override
- {
- return new npc_spiritual_reflectionAI(creature);
- }
+ CreatureAI* GetAI(Creature* creature) const override
+ {
+ return new npc_spiritual_reflectionAI(creature);
+ }
};
+// 5689
class at_hor_intro_start : public AreaTriggerScript
{
-public:
- at_hor_intro_start() : AreaTriggerScript("at_hor_intro_start") { }
+ public:
+ at_hor_intro_start() : AreaTriggerScript("at_hor_intro_start") { }
- bool OnTrigger(Player* player, AreaTriggerEntry const* /*trigger*/) override
- {
- InstanceScript* _instance = player->GetInstanceScript();
+ bool OnTrigger(Player* player, AreaTriggerEntry const* /*trigger*/) override
+ {
+ if (player->IsGameMaster())
+ return true;
- if (player->IsGameMaster())
- return true;
+ InstanceScript* _instance = player->GetInstanceScript();
- if (_instance->GetData(DATA_INTRO_EVENT) == NOT_STARTED)
- _instance->SetData(DATA_INTRO_EVENT, IN_PROGRESS);
+ if (_instance->GetData(DATA_INTRO_EVENT) == NOT_STARTED)
+ _instance->SetData(DATA_INTRO_EVENT, IN_PROGRESS);
- return true;
- }
+ return true;
+ }
};
class at_hor_waves_restarter : public AreaTriggerScript
{
-public:
- at_hor_waves_restarter() : AreaTriggerScript("at_hor_waves_restarter") { }
+ public:
+ at_hor_waves_restarter() : AreaTriggerScript("at_hor_waves_restarter") { }
- bool OnTrigger(Player* player, AreaTriggerEntry const* /*trigger*/) override
- {
- InstanceScript* _instance = player->GetInstanceScript();
+ bool OnTrigger(Player* player, AreaTriggerEntry const* /*trigger*/) override
+ {
+ if (player->IsGameMaster())
+ return true;
- if (player->IsGameMaster())
- return true;
+ InstanceScript* _instance = player->GetInstanceScript();
+
+ if (_instance->GetData(DATA_WAVE_COUNT))
+ return true;
- if (_instance->GetData(DATA_WAVE_COUNT))
+ if (_instance->GetData(DATA_INTRO_EVENT) == DONE && _instance->GetBossState(DATA_MARWYN) != DONE)
+ {
+ _instance->ProcessEvent(0, EVENT_SPAWN_WAVES);
+
+ if (Creature* falric = player->GetCreature(*player, _instance->GetData64(DATA_FALRIC)))
+ {
+ falric->CastSpell(falric, SPELL_BOSS_SPAWN_AURA, true);
+ falric->SetVisible(true);
+ }
+ if (Creature* marwyn = player->GetCreature(*player, _instance->GetData64(DATA_MARWYN)))
+ {
+ marwyn->CastSpell(marwyn, SPELL_BOSS_SPAWN_AURA, true);
+ marwyn->SetVisible(true);
+ }
+ }
return true;
+ }
+};
- if (_instance->GetData(DATA_INTRO_EVENT) == DONE && _instance->GetBossState(DATA_MARWYN_EVENT) != DONE)
+// 5740
+class at_hor_impenetrable_door : public AreaTriggerScript
+{
+ public:
+ at_hor_impenetrable_door() : AreaTriggerScript("at_hor_impenetrable_door") { }
+
+ bool OnTrigger(Player* player, AreaTriggerEntry const* /*at*/) override
{
- _instance->ProcessEvent(0, EVENT_SPAWN_WAVES);
+ if (player->IsGameMaster())
+ return true;
- 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);
- }
+ InstanceScript* _instance = player->GetInstanceScript();
+ if (_instance->GetBossState(DATA_MARWYN) == DONE)
+ return true;
+
+ /// return false to handle teleport by db
+ return false;
}
- return true;
- }
};
-class at_shadow_throne : public AreaTriggerScript
+// 5605
+class at_hor_shadow_throne : public AreaTriggerScript
{
-public:
- at_shadow_throne() : AreaTriggerScript("at_shadow_throne") { }
+ public:
+ at_hor_shadow_throne() : AreaTriggerScript("at_hor_shadow_throne") { }
- bool OnTrigger(Player* player, const AreaTriggerEntry* /*at*/) override
- {
- InstanceScript* _instance = player->GetInstanceScript();
+ bool OnTrigger(Player* player, AreaTriggerEntry const* /*at*/) override
+ {
+ if (player->IsGameMaster())
+ return true;
+
+ InstanceScript* _instance = player->GetInstanceScript();
+
+ if (_instance->GetBossState(DATA_THE_LICH_KING_ESCAPE) == NOT_STARTED)
+ _instance->SetBossState(DATA_THE_LICH_KING_ESCAPE, IN_PROGRESS);
- if (player->IsGameMaster())
return true;
+ }
+};
- if (_instance->GetData(DATA_ESCAPE_EVENT) == NOT_STARTED)
- _instance->SetData(DATA_ESCAPE_EVENT, IN_PROGRESS);
+enum EscapeEvents
+{
+ // Raging Ghoul
+ EVENT_RAGING_GHOUL_JUMP = 1,
- return true;
- }
+ // Risen Witch Doctor
+ EVENT_RISEN_WITCH_DOCTOR_CURSE,
+ EVENT_RISEN_WITCH_DOCTOR_SHADOW_BOLT,
+ EVENT_RISEN_WITCH_DOCTOR_SHADOW_BOLT_VOLLEY,
+
+ // Lumbering Abomination
+ EVENT_LUMBERING_ABOMINATION_VOMIT_SPRAY,
+ EVENT_LUMBERING_ABOMINATION_CLEAVE
};
-class npc_raging_ghoul : public CreatureScript
+namespace hor
{
-public:
- npc_raging_ghoul() : CreatureScript("npc_raging_ghoul") { }
- struct npc_raging_ghoulAI : public ScriptedAI
- {
- npc_raging_ghoulAI(Creature* creature) : ScriptedAI(creature)
+class StartMovementEvent : public BasicEvent
+{
+ public:
+ StartMovementEvent(Creature* owner) : _owner(owner) { }
+
+ bool Execute(uint64 /*execTime*/, uint32 /*diff*/) override
{
- _instance = me->GetInstanceScript();
+ _owner->SetReactState(REACT_AGGRESSIVE);
+ if (Unit* target = _owner->AI()->SelectTarget(SELECT_TARGET_RANDOM, 0, 0.0f, true))
+ _owner->AI()->AttackStart(target);
+ return true;
}
- InstanceScript* _instance;
- uint32 _emergeTimer;
- bool _doEmerge;
- bool _doJump;
- uint64 _leaderGUID;
+ private:
+ Creature* _owner;
+};
- void Reset() override
- {
- _emergeTimer = 4000;
- _doEmerge = false;
- _doJump = false;
- if (_instance->GetData(DATA_ESCAPE_EVENT) == IN_PROGRESS)
- _instance->SetData(DATA_SUMMONS, 1);
+} // namespace hor
- }
+struct npc_escape_event_trash : public ScriptedAI
+{
+ npc_escape_event_trash(Creature* creature) : ScriptedAI(creature), _instance(creature->GetInstanceScript()) { }
- void IsSummonedBy(Unit*) override
- {
- DoCast(me, SPELL_EMERGE_VISUAL);
- }
+ void Reset() override
+ {
+ _events.Reset();
+ }
- void JustDied(Unit* /*killer*/) override
+ void UpdateAI(uint32 /*diff*/) override
+ {
+ if (_instance->GetBossState(DATA_THE_LICH_KING_ESCAPE) == FAIL || _instance->GetBossState(DATA_THE_LICH_KING_ESCAPE) == NOT_STARTED)
+ me->DespawnOrUnsummon();
+ }
+
+ void IsSummonedBy(Unit* /*summoner*/) override
+ {
+ DoZoneInCombat(me, 0.0f);
+ if (Creature* leader = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_ESCAPE_LEADER)))
{
- _instance->SetData(DATA_SUMMONS, 0);
+ me->SetInCombatWith(leader);
+ leader->SetInCombatWith(me);
+ me->AddThreat(leader, 0.0f);
}
+ }
- void AttackStart(Unit* who) override
+protected:
+ EventMap _events;
+ InstanceScript* _instance;
+};
+
+class npc_raging_ghoul : public CreatureScript
+{
+ public:
+ npc_raging_ghoul() : CreatureScript("npc_raging_ghoul") { }
+
+ struct npc_raging_ghoulAI : public npc_escape_event_trash
{
- if (!who)
- return;
+ npc_raging_ghoulAI(Creature* creature) : npc_escape_event_trash(creature) { }
- if (!_doEmerge)
- return;
+ void Reset() override
+ {
+ npc_escape_event_trash::Reset();
+ _events.ScheduleEvent(EVENT_RAGING_GHOUL_JUMP, 5000);
+ }
- ScriptedAI::AttackStart(who);
- }
+ void IsSummonedBy(Unit* summoner) override
+ {
+ me->CastSpell(me, SPELL_RAGING_GHOUL_SPAWN, true);
+ me->SetReactState(REACT_PASSIVE);
+ me->HandleEmoteCommand(EMOTE_ONESHOT_EMERGE);
+ me->m_Events.AddEvent(new hor::StartMovementEvent(me), me->m_Events.CalculateTime(5000));
- void UpdateAI(uint32 diff) override
- {
- if (!_instance)
- return;
+ npc_escape_event_trash::IsSummonedBy(summoner);
+ }
- if (_instance->GetData(DATA_ESCAPE_EVENT) == IN_PROGRESS)
+ void UpdateAI(uint32 diff) override
{
- _leaderGUID = _instance->GetData64(DATA_ESCAPE_LEADER);
- Creature* leader = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_ESCAPE_LEADER));
+ npc_escape_event_trash::UpdateAI(diff);
+
+ if (!UpdateVictim())
+ return;
+
+ _events.Update(diff);
- if (_doEmerge != true)
+ if (me->HasUnitState(UNIT_STATE_CASTING))
+ return;
+
+ switch (_events.ExecuteEvent())
{
- if (_emergeTimer < diff)
- {
- _doEmerge = true;
- if (leader)
+ case EVENT_RAGING_GHOUL_JUMP:
+ if (Unit* victim = me->GetVictim())
{
- DoResetThreat();
- me->GetMotionMaster()->MoveIdle();
- me->GetMotionMaster()->MoveChase(leader);
+ if (me->IsInRange(victim, 5.0f, 30.0f))
+ {
+ DoCast(victim, SPELL_GHOUL_JUMP);
+ return;
+ }
}
- }
- else
- _emergeTimer -= diff;
+ _events.ScheduleEvent(EVENT_RAGING_GHOUL_JUMP, 500);
+ break;
+ default:
+ break;
}
- if (me->Attack(leader,true))/*(Unit *target = SelectTarget(SELECT_TARGET_RANDOM, 0, 150.0f))*/
- {
- if (!_doJump && me->IsWithinDistInMap(leader, 30.0f) && !me->IsWithinDistInMap(leader, 5.0f))
- {
- _doJump = true;
- DoCast(leader, SPELL_GHOUL_JUMP);
- }
- }
+ DoMeleeAttackIfReady();
}
- else if (_instance->GetData(DATA_ESCAPE_EVENT) == FAIL || _instance->GetData(DATA_ESCAPE_EVENT) == NOT_STARTED)
- me->DespawnOrUnsummon();
- DoMeleeAttackIfReady();
- }
- };
+ };
- CreatureAI* GetAI(Creature* creature) const override
- {
- return GetInstanceAI<npc_raging_ghoulAI>(creature);
- }
+ CreatureAI* GetAI(Creature* creature) const override
+ {
+ return GetHallsOfReflectionAI<npc_raging_ghoulAI>(creature);
+ }
};
class npc_risen_witch_doctor : public CreatureScript
{
-public:
- npc_risen_witch_doctor() : CreatureScript("npc_risen_witch_doctor") { }
+ public:
+ npc_risen_witch_doctor() : CreatureScript("npc_risen_witch_doctor") { }
- struct npc_risen_witch_doctorAI : public ScriptedAI
- {
- npc_risen_witch_doctorAI(Creature* creature) : ScriptedAI(creature)
+ struct npc_risen_witch_doctorAI : public npc_escape_event_trash
{
- _instance = me->GetInstanceScript();
- }
+ npc_risen_witch_doctorAI(Creature* creature) : npc_escape_event_trash(creature) { }
- InstanceScript* _instance;
- uint32 _emergeTimer;
- bool _doEmerge;
- uint64 _leaderGUID;
- uint32 _boltTimer;
- uint32 _boltVolleyTimer;
- uint32 _curseTimer;
+ void Reset() override
+ {
+ npc_escape_event_trash::Reset();
+ _events.ScheduleEvent(EVENT_RISEN_WITCH_DOCTOR_SHADOW_BOLT, 6000);
+ _events.ScheduleEvent(EVENT_RISEN_WITCH_DOCTOR_SHADOW_BOLT_VOLLEY, 15000);
+ _events.ScheduleEvent(EVENT_RISEN_WITCH_DOCTOR_CURSE, 7000);
+ }
- void Reset() override
- {
- _emergeTimer = 5000;
- _boltTimer = 6000;
- _boltVolleyTimer = 15000;
- _curseTimer = 7000;
- _doEmerge = false;
- if (_instance->GetData(DATA_ESCAPE_EVENT) == IN_PROGRESS)
- _instance->SetData(DATA_SUMMONS, 1);
- }
+ void IsSummonedBy(Unit* summoner) override
+ {
+ me->CastSpell(me, SPELL_RISEN_WITCH_DOCTOR_SPAWN, true);
+ me->SetReactState(REACT_PASSIVE);
+ me->HandleEmoteCommand(EMOTE_ONESHOT_EMERGE);
+ me->m_Events.AddEvent(new hor::StartMovementEvent(me), me->m_Events.CalculateTime(5000));
- void IsSummonedBy(Unit*) override
- {
- DoCast(me, SPELL_EMERGE_VISUAL);
- DoZoneInCombat(me, 100.00f);
- }
+ npc_escape_event_trash::IsSummonedBy(summoner);
+ }
- void JustDied(Unit* /*killer*/) override
- {
- _instance->SetData(DATA_SUMMONS, 0);
- }
+ void UpdateAI(uint32 diff) override
+ {
+ npc_escape_event_trash::UpdateAI(diff);
- void AttackStart(Unit* who) override
- {
- if (!who)
- return;
+ if (!UpdateVictim())
+ return;
+
+ _events.Update(diff);
- if (_doEmerge == false)
- return;
+ if (me->HasUnitState(UNIT_STATE_CASTING))
+ return;
- ScriptedAI::AttackStart(who);
+ switch (_events.ExecuteEvent())
+ {
+ case EVENT_RISEN_WITCH_DOCTOR_CURSE:
+ if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 30.0f, true))
+ DoCast(target, SPELL_CURSE_OF_DOOM);
+ _events.ScheduleEvent(EVENT_RISEN_WITCH_DOCTOR_CURSE, urand(10000, 15000));
+ break;
+ case EVENT_RISEN_WITCH_DOCTOR_SHADOW_BOLT:
+ if (Unit* target = SelectTarget(SELECT_TARGET_TOPAGGRO, 0, 20.0f, true))
+ DoCast(target, SPELL_SHADOW_BOLT);
+ _events.ScheduleEvent(EVENT_RISEN_WITCH_DOCTOR_SHADOW_BOLT, urand(2000, 3000));
+ break;
+ case EVENT_RISEN_WITCH_DOCTOR_SHADOW_BOLT_VOLLEY:
+ if (SelectTarget(SELECT_TARGET_RANDOM, 0, 30.0f, true))
+ DoCastAOE(SPELL_SHADOW_BOLT_VOLLEY);
+ _events.ScheduleEvent(EVENT_RISEN_WITCH_DOCTOR_SHADOW_BOLT_VOLLEY, urand(15000, 22000));
+ break;
+ default:
+ break;
+ }
+
+ DoMeleeAttackIfReady();
+ }
+ };
+
+ CreatureAI* GetAI(Creature* creature) const override
+ {
+ return GetHallsOfReflectionAI<npc_risen_witch_doctorAI>(creature);
}
+};
+
+class npc_lumbering_abomination : public CreatureScript
+{
+ public:
+ npc_lumbering_abomination() : CreatureScript("npc_lumbering_abomination") { }
- void UpdateAI(uint32 diff) override
+ struct npc_lumbering_abominationAI : public npc_escape_event_trash
{
- if (!_instance)
- return;
+ npc_lumbering_abominationAI(Creature* creature) : npc_escape_event_trash(creature) { }
- if (_instance->GetData(DATA_ESCAPE_EVENT) == IN_PROGRESS)
+ void Reset() override
{
- if (_doEmerge != true)
- {
- if (_emergeTimer < diff)
- {
- _doEmerge = true;
- _leaderGUID = _instance->GetData64(DATA_ESCAPE_LEADER);
+ npc_escape_event_trash::Reset();
+ _events.ScheduleEvent(EVENT_LUMBERING_ABOMINATION_VOMIT_SPRAY, 15000);
+ _events.ScheduleEvent(EVENT_LUMBERING_ABOMINATION_CLEAVE, 6000);
+ }
- if (Creature* leader = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_ESCAPE_LEADER)))
- {
- DoResetThreat();
- me->GetMotionMaster()->MoveIdle();
- me->GetMotionMaster()->MoveChase(leader);
- }
- }
- else
- _emergeTimer -= diff;
- }
+ void UpdateAI(uint32 diff) override
+ {
+ npc_escape_event_trash::UpdateAI(diff);
- if (_curseTimer < diff)
- {
- if (Unit *target = SelectTarget(SELECT_TARGET_RANDOM))
- DoCast(target, SPELL_COURSE_OF_DOOM);
- _curseTimer = urand(10000, 15000);
- }
- else
- _curseTimer -= diff;
+ if (!UpdateVictim())
+ return;
- if (_boltTimer < diff)
- {
- if (Unit *target = SelectTarget(SELECT_TARGET_TOPAGGRO))
- DoCast(target, SPELL_SHADOW_BOLT);
- _boltTimer = urand(2000, 3000);
- }
- else
- _boltTimer -= diff;
+ _events.Update(diff);
- if (_boltVolleyTimer < diff)
+ if (me->HasUnitState(UNIT_STATE_CASTING))
+ return;
+
+ switch (_events.ExecuteEvent())
{
- if (Unit *target = SelectTarget(SELECT_TARGET_TOPAGGRO))
- DoCast(target, SPELL_SHADOW_BOLT_VOLLEY);
- _boltVolleyTimer = urand(15000, 22000);
+ case EVENT_LUMBERING_ABOMINATION_VOMIT_SPRAY:
+ DoCastVictim(SPELL_VOMIT_SPRAY);
+ _events.ScheduleEvent(EVENT_LUMBERING_ABOMINATION_VOMIT_SPRAY, urand(15000, 20000));
+ break;
+ case EVENT_LUMBERING_ABOMINATION_CLEAVE:
+ DoCastVictim(SPELL_CLEAVE);
+ _events.ScheduleEvent(EVENT_LUMBERING_ABOMINATION_CLEAVE, urand(7000, 9000));
+ break;
+ default:
+ break;
}
- else
- _boltVolleyTimer -= diff;
+
+ DoMeleeAttackIfReady();
}
- else if (_instance->GetData(DATA_ESCAPE_EVENT) == FAIL || _instance->GetData(DATA_ESCAPE_EVENT) == NOT_STARTED)
- me->DespawnOrUnsummon();
- DoMeleeAttackIfReady();
- }
- };
+ };
- CreatureAI* GetAI(Creature* creature) const override
- {
- return GetInstanceAI<npc_risen_witch_doctorAI>(creature);
- }
+ CreatureAI* GetAI(Creature* creature) const override
+ {
+ return GetHallsOfReflectionAI<npc_lumbering_abominationAI>(creature);
+ }
};
-
-class npc_lumbering_abomination : public CreatureScript
+// 72900 - Start Halls of Reflection Quest AE
+class spell_hor_start_halls_of_reflection_quest_ae : public SpellScriptLoader
{
-public:
- npc_lumbering_abomination() : CreatureScript("npc_lumbering_abomination") { }
+ public:
+ spell_hor_start_halls_of_reflection_quest_ae() : SpellScriptLoader("spell_hor_start_halls_of_reflection_quest_ae") { }
- struct npc_lumbering_abominationAI : public ScriptedAI
- {
- npc_lumbering_abominationAI(Creature* creature) : ScriptedAI(creature)
+ class spell_hor_start_halls_of_reflection_quest_ae_SpellScript : public SpellScript
{
- _instance = me->GetInstanceScript();
- }
+ PrepareSpellScript(spell_hor_start_halls_of_reflection_quest_ae_SpellScript);
+
+ void StartQuests(SpellEffIndex /*effIndex*/)
+ {
+ if (Player* target = GetHitPlayer())
+ {
+ // CanTakeQuest and CanAddQuest checks done in spell effect execution
+ if (target->GetTeam() == ALLIANCE)
+ target->CastSpell(target, SPELL_START_HALLS_OF_REFLECTION_QUEST_A, true);
+ else
+ target->CastSpell(target, SPELL_START_HALLS_OF_REFLECTION_QUEST_H, true);
+ }
+ }
- InstanceScript* _instance;
- uint64 _leaderGUID;
- bool _doWalk;
- uint32 _strikeTimer;
- uint32 _vomitTimer;
+ void Register() override
+ {
+ OnEffectHitTarget += SpellEffectFn(spell_hor_start_halls_of_reflection_quest_ae_SpellScript::StartQuests, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
+ }
+ };
- void Reset() override
+ SpellScript* GetSpellScript() const override
{
- _doWalk = false;
- _vomitTimer = 15000;
- _strikeTimer = 6000;
- if (_instance->GetData(DATA_ESCAPE_EVENT) == IN_PROGRESS)
- _instance->SetData(DATA_SUMMONS, 1);
+ return new spell_hor_start_halls_of_reflection_quest_ae_SpellScript();
}
+};
+
+// 70190 - Evasion
+class spell_hor_evasion : public SpellScriptLoader
+{
+ public:
+ spell_hor_evasion() : SpellScriptLoader("spell_hor_evasion") { }
+
+ class spell_hor_evasion_SpellScript : public SpellScript
+ {
+ PrepareSpellScript(spell_hor_evasion_SpellScript);
+
+ bool Load() override
+ {
+ return GetCaster()->GetTypeId() == TYPEID_UNIT;
+ }
+
+ void SetDest(SpellDestination& dest)
+ {
+ WorldObject* target = GetExplTargetWorldObject();
+ Position pos(*target);
+ Position home = GetCaster()->ToCreature()->GetHomePosition();
+
+ // prevent evasion outside the room
+ if (pos.IsInDist2d(&home, 15.0f))
+ return;
+
+ float angle = pos.GetAngle(&home);
+ float dist = GetSpellInfo()->Effects[EFFECT_0].CalcRadius(GetCaster());
+ target->MovePosition(pos, dist, angle);
+
+ dest.Relocate(pos);
+ }
+
+ void Register() override
+ {
+ OnDestinationTargetSelect += SpellDestinationTargetSelectFn(spell_hor_evasion_SpellScript::SetDest, EFFECT_0, TARGET_DEST_TARGET_RADIUS);
+ }
+ };
- void IsSummonedBy(Unit*) override
+ SpellScript* GetSpellScript() const override
{
- DoCast(me, SPELL_EMERGE_VISUAL);
- DoZoneInCombat(me, 100.00f);
+ return new spell_hor_evasion_SpellScript();
}
+};
+
+// 70017 - Gunship Cannon Fire
+class spell_hor_gunship_cannon_fire : public SpellScriptLoader
+{
+ public:
+ spell_hor_gunship_cannon_fire() : SpellScriptLoader("spell_hor_gunship_cannon_fire") { }
- void UpdateAI(uint32 diff) override
+ class spell_hor_gunship_cannon_fire_AuraScript : public AuraScript
{
- if (_instance->GetData(DATA_ESCAPE_EVENT) == IN_PROGRESS)
+ PrepareAuraScript(spell_hor_gunship_cannon_fire_AuraScript);
+
+ void HandlePeriodic(AuraEffect const* /*aurEff*/)
{
- if (_doWalk != true)
+ if (!urand(0, 2))
{
- _doWalk = true;
- _leaderGUID = _instance->GetData64(DATA_ESCAPE_LEADER);
- if (Creature* leader = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_ESCAPE_LEADER)))
- {
- DoResetThreat();
- me->GetMotionMaster()->MoveIdle();
- me->GetMotionMaster()->MoveChase(leader);
- }
- }
- if (_strikeTimer < diff)
- {
- if (Unit *target = SelectTarget(SELECT_TARGET_TOPAGGRO))
- DoCast(target, SPELL_ABON_STRIKE);
- _strikeTimer = urand(7000, 9000);
+ if (GetTarget()->GetEntry() == NPC_GUNSHIP_CANNON_HORDE)
+ GetTarget()->CastSpell((Unit*)NULL, SPELL_GUNSHIP_CANNON_FIRE_MISSILE_HORDE, true);
+ else
+ GetTarget()->CastSpell((Unit*)NULL, SPELL_GUNSHIP_CANNON_FIRE_MISSILE_ALLIANCE, true);
}
- else
- _strikeTimer -= diff;
+ }
- if (_vomitTimer < diff)
- {
- if (Unit *target = SelectTarget(SELECT_TARGET_TOPAGGRO))
- DoCast(target, SPELL_VOMIT_SPRAY);
- _vomitTimer = urand(15000, 20000);
- }
- else
- _vomitTimer -= diff;
+ void Register() override
+ {
+ OnEffectPeriodic += AuraEffectPeriodicFn(spell_hor_gunship_cannon_fire_AuraScript::HandlePeriodic, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL);
}
- else if (_instance->GetData(DATA_ESCAPE_EVENT) == FAIL || _instance->GetData(DATA_ESCAPE_EVENT) == NOT_STARTED)
- me->DespawnOrUnsummon();
- DoMeleeAttackIfReady();
- }
+ };
- void JustDied(Unit* /*killer*/) override
+ AuraScript* GetAuraScript() const override
{
- _instance->SetData(DATA_SUMMONS, 0);
+ return new spell_hor_gunship_cannon_fire_AuraScript();
}
-
- };
-
- CreatureAI* GetAI(Creature* creature) const override
- {
- return GetInstanceAI<npc_lumbering_abominationAI>(creature);
- }
};
void AddSC_halls_of_reflection()
{
new at_hor_intro_start();
new at_hor_waves_restarter();
- new at_shadow_throne();
- new npc_jaina_or_sylvanas_hor();
+ new at_hor_impenetrable_door();
+ new at_hor_shadow_throne();
+ new npc_jaina_or_sylvanas_intro_hor();
new npc_jaina_or_sylvanas_escape_hor();
+ new npc_the_lich_king_escape_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 npc_frostsworn_general();
+ new npc_spiritual_reflection();
new npc_raging_ghoul();
new npc_risen_witch_doctor();
new npc_lumbering_abomination();
- new npc_frostworn_general();
- new npc_spiritual_reflection();
+ new spell_hor_start_halls_of_reflection_quest_ae();
+ new spell_hor_evasion();
+ new spell_hor_gunship_cannon_fire();
}
diff --git a/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/halls_of_reflection.h b/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/halls_of_reflection.h
index c4776c3cfcd..a05035f7b44 100644
--- a/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/halls_of_reflection.h
+++ b/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/halls_of_reflection.h
@@ -15,170 +15,231 @@
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-#ifndef DEF_HALLS_OF_REFLECTION_H
-#define DEF_HALLS_OF_REFLECTION_H
+#ifndef HALLS_OF_REFLECTION_H_
+#define HALLS_OF_REFLECTION_H_
#define HoRScriptName "instance_halls_of_reflection"
-#define MAX_ENCOUNTER 3
+
+uint32 const EncounterCount = 3;
/* Halls of Reflection encounters:
-0- Falric
-1- Marwyn
-2- The Lich King
+ 0 - Falric
+ 1 - Marwyn
+ 2 - The Lich King
*/
-enum Data
+enum DataTypes
{
- DATA_FALRIC_EVENT = 0,
- DATA_MARWYN_EVENT = 1,
- DATA_LICHKING_EVENT = 2,
+ DATA_FALRIC = 0,
+ DATA_MARWYN = 1,
+ DATA_THE_LICH_KING_ESCAPE = 2,
+
DATA_INTRO_EVENT = 3,
- DATA_FROSWORN_EVENT = 4,
+ DATA_FROSTSWORN_GENERAL = 4,
- DATA_WAVE_COUNT = 5,
- DATA_TEAM_IN_INSTANCE = 6,
- DATA_FROSTMOURNE = 7,
- DATA_FROSTWORN_DOOR = 8,
- DATA_ESCAPE_EVENT = 9,
+ DATA_KORELN_LORALEN = 5,
+ DATA_WAVE_COUNT = 6,
+ DATA_TEAM_IN_INSTANCE = 7,
+ DATA_FROSTMOURNE = 8,
+ DATA_IMPENETRABLE_DOOR = 9,
DATA_ESCAPE_LEADER = 10,
- DATA_SUMMONS = 11,
- DATA_ICEWALL = 12,
- DATA_CAVE_IN = 13
+ DATA_ICEWALL = 11,
+ DATA_ICEWALL_TARGET = 12,
+ DATA_GUNSHIP = 13
};
-enum Creatures
+enum CreatureIds
{
- NPC_JAINA_PART1 = 37221,
- NPC_SYLVANAS_PART1 = 37223,
- 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
-
- NPC_RAGING_GNOUL = 36940,
- NPC_RISEN_WITCH_DOCTOR = 36941,
- NPC_ABON = 37069
+ NPC_JAINA_INTRO = 37221,
+ NPC_SYLVANAS_INTRO = 37223,
+ NPC_UTHER = 37225,
+ NPC_THE_LICH_KING_INTRO = 37226,
+ NPC_KORELN = 37582,
+ NPC_LORALEN = 37779,
+ NPC_FROSTMOUNRE_ALTAR_BUNNY = 37704,
+
+ 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_FROSTSWORN_GENERAL = 36723,
+ NPC_REFLECTION = 37068, // 37107 for tank only?
+
+ NPC_JAINA_ESCAPE = 36955,
+ NPC_SYLVANAS_ESCAPE = 37554,
+ NPC_THE_LICH_KING_ESCAPE = 36954,
+ NPC_ICE_WALL_TARGET = 37014,
+
+ NPC_RAGING_GHOUL = 36940,
+ NPC_RISEN_WITCH_DOCTOR = 36941,
+ NPC_LUMBERING_ABOMINATION = 37069,
+
+ NPC_GUNSHIP_CANNON_HORDE = 37593,
+ NPC_JUSTIN_BARTLETT = 30344,
+ NPC_KORM_BLACKSCAR = 30824,
+
+ NPC_WORLD_TRIGGER = 22515
};
-enum GameObjects
+enum GameObjectIds
{
- GO_FROSTMOURNE = 202302,
- 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_HORDE_NORMAL = 202212, //3145
- GO_CAPTAIN_CHEST_ALLIANCE_NORMAL = 201710, //30357
- GO_CAPTAIN_CHEST_HORDE_HEROIC = 202337, //3246
- GO_CAPTAIN_CHEST_ALLIANCE_HEROIC = 202336, //3333
+ GO_FROSTMOURNE = 202302,
+ GO_ENTRANCE_DOOR = 201976,
+ GO_IMPENETRABLE_DOOR = 197341,
+ GO_SHADOW_THRONE_DOOR = 197342,
+ GO_ESCAPE_DOOR = 197343, // always open ?
+
+ GO_ICE_WALL = 201385,
+ GO_CAVE_IN = 201596,
+
+ GO_THE_SKYBREAKER = 201598,
+ GO_ORGRIMS_HAMMER = 201599,
+ GO_THE_SKYBREAKER_STAIRS = 201709,
+ GO_ORGRIMS_HAMMER_STAIRS = 202211,
+ GO_PORTAL_TO_DALARAN = 195682,
+
+ GO_THE_CAPTAIN_CHEST_ALLIANCE_NORMAL = 201710,
+ GO_THE_CAPTAIN_CHEST_HORDE_NORMAL = 202212,
+ GO_THE_CAPTAIN_CHEST_ALLIANCE_HEROIC = 202336,
+ GO_THE_CAPTAIN_CHEST_HORDE_HEROIC = 202337
};
-enum HorWorldStates
+enum Achievements
{
- WORLD_STATE_HOR_WAVES_ENABLED = 4884,
- WORLD_STATE_HOR_WAVE_COUNT = 4882,
+ ACHIEV_NOT_RETREATING_EVENT = 22615,
+ SPELL_ACHIEV_CHECK = 72830
};
// Common actions from Instance Script to Boss Script
enum Actions
{
- ACTION_ENTER_COMBAT,
- ACTION_START_ESCAPING,
- ACTION_WALL_BROKEN
+ ACTION_ENTER_COMBAT = -668001,
+ ACTION_START_PREFIGHT = -668002,
+ ACTION_WALL_BROKEN = -668003,
+ ACTION_GUNSHIP_ARRIVAL = -668004,
+ ACTION_GUNSHIP_ARRIVAL_2 = -668005
};
-enum TrashGeneralSpells
+enum InstanceEvents
{
- // General spells
- SPELL_WELL_OF_SOULS = 72630, // cast when spawn(become visible)
- SPELL_SPIRIT_ACTIVATE = 72130, // cast when unit activates
+ EVENT_SPAWN_WAVES = 1,
+ EVENT_NEXT_WAVE = 2,
+ EVENT_DO_WIPE = 3,
+ EVENT_ADD_WAVE = 4,
+ EVENT_SPAWN_ESCAPE_EVENT = 5
};
-enum InstanceEvents
+enum InstanceEventIds
{
- EVENT_SPAWN_WAVES = 1,
- EVENT_NEXT_WAVE = 2,
- EVENT_DO_WIPE = 3,
- EVENT_ADD_WAVE = 4,
+ EVENT_GUNSHIP_ARRIVAL = 22709,
+ EVENT_GUNSHIP_ARRIVAL_2 = 22714,
+ EVENT_ICE_WALL_SUMMONED = 22795
};
-// Base class for FALRIC and MARWYN
-// handled the summonList and the notification events to/from the InstanceScript
-struct boss_horAI : ScriptedAI
+enum InstanceSpells
{
- boss_horAI(Creature* creature) : ScriptedAI(creature), summons(creature)
- {
- instance = me->GetInstanceScript();
- }
+ // Trash
+ SPELL_WELL_OF_SOULS = 72630, // cast when spawn (become visible)
+ SPELL_SPIRIT_ACTIVATE = 72130, // cast when unit activates
+
+ // Start Quests
+ SPELL_START_HALLS_OF_REFLECTION_QUEST_A = 71351,
+ SPELL_START_HALLS_OF_REFLECTION_QUEST_H = 71542,
+ SPELL_START_HALLS_OF_REFLECTION_QUEST_AE = 72900,
+
+ // Quest Credits
+ SPELL_CREDIT_FINDING_SYLVANAS = 71536,
+ SPELL_CREDIT_FINDING_JAINA = 71538,
+ SPELL_CREDIT_ESCAPING_ARTHAS = 71352,
+
+ // Gunship
+ SPELL_GUNSHIP_CANNON_FIRE = 70017,
+ SPELL_GUNSHIP_CANNON_FIRE_MISSILE_ALLIANCE = 70021,
+ SPELL_GUNSHIP_CANNON_FIRE_MISSILE_HORDE = 70246
+};
- InstanceScript* instance;
- EventMap events;
- SummonList summons;
+enum InstanceWorldStates
+{
+ WORLD_STATE_HOR_WAVES_ENABLED = 4884,
+ WORLD_STATE_HOR_WAVE_COUNT = 4882
+};
+
+enum InstanceYells
+{
+ SAY_CAPTAIN_FIRE = 0,
+ SAY_CAPTAIN_FINAL = 1
+};
+
+// Base class for FALRIC and MARWYN
+struct boss_horAI : BossAI
+{
+ boss_horAI(Creature* creature, uint32 bossId) : BossAI(creature, bossId) { }
- void Reset()
+ void Reset() override
{
- events.Reset();
+ _Reset();
me->SetVisible(false);
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_IMMUNE_TO_NPC);
me->SetReactState(REACT_PASSIVE);
if (instance->GetData(DATA_WAVE_COUNT) != NOT_STARTED)
- instance->ProcessEvent(0, EVENT_DO_WIPE);
+ instance->ProcessEvent(NULL, EVENT_DO_WIPE);
}
- void DoAction(int32 actionID)
+ void DoAction(int32 actionId) override
{
- switch (actionID)
+ switch (actionId)
{
- case ACTION_ENTER_COMBAT: // called by InstanceScript when boss shall enter in combat.
+ case ACTION_ENTER_COMBAT: // called by InstanceScript when boss shall enter in combat.
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_IMMUNE_TO_NPC);
me->SetReactState(REACT_AGGRESSIVE);
-
- if (Unit* unit = me->SelectNearestTarget())
- AttackStart(unit);
-
- DoZoneInCombat();
+ DoZoneInCombat(me, 150.0f);
+ break;
+ default:
break;
}
}
- void JustSummoned(Creature* summoned)
+ void JustSummoned(Creature* summon) override
{
- summons.Summon(summoned);
+ summons.Summon(summon);
}
};
+class GameObjectDeleteDelayEvent : public BasicEvent
+{
+ public:
+ GameObjectDeleteDelayEvent(Unit* owner, uint64 gameObjectGUID) : _owner(owner), _gameObjectGUID(gameObjectGUID) { }
+
+ void DeleteGameObject()
+ {
+ if (GameObject* go = ObjectAccessor::GetGameObject(*_owner, _gameObjectGUID))
+ go->Delete();
+ }
+
+ bool Execute(uint64 /*execTime*/, uint32 /*diff*/) override
+ {
+ DeleteGameObject();
+ return true;
+ }
+
+ void Abort(uint64 /*execTime*/) override
+ {
+ DeleteGameObject();
+ }
+
+ private:
+ Unit* _owner;
+ uint64 _gameObjectGUID;
+};
+
template<class AI>
AI* GetHallsOfReflectionAI(Creature* creature)
{
return GetInstanceAI<AI>(creature, HoRScriptName);
}
-#endif
+#endif // HALLS_OF_REFLECTION_H_
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 ab5168dd34a..6f33e80b92b 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
@@ -19,590 +19,792 @@
#include "ScriptedCreature.h"
#include "InstanceScript.h"
#include "Player.h"
+#include "Transport.h"
#include "WorldPacket.h"
#include "halls_of_reflection.h"
-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
-Position const JainaSpawnPos2 = {5549.011f, 2257.041f, 733.0120f, 1.153993f}; // Jaina Spawn Position 2
-Position const SylvanasSpawnPos2 = {5549.011f, 2257.041f, 733.0120f, 1.153993f}; // Sylvanas Spawn Position 2
+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 (sniffed)
+Position const JainaSpawnPos2 = { 5549.011f, 2257.041f, 733.0120f, 1.153993f }; // Jaina Spawn Position 2
+Position const SylvanasSpawnPos2 = { 5549.29f, 2257.353f, 733.0943f, 0.8901179f }; // Sylvanas Spawn Position 2 (sniffed)
+Position const KorelnOrLoralenSpawnPos = { 5232.68f, 1931.46f, 707.7781f, 0.8377581f };
+
+Position const TheLichKingEscapePosition[] =
+{
+ { 5557.017f, 2266.103f, 733.0943f, 3.892084f }, // 0 - Spawn (Horde)
+ { 5552.733f, 2262.718f, 733.0110f, 4.009696f } // 1 - Spawn (Alliance)
+};
Position const SpawnPos[] =
{
- {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},
+ { 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
{
-public:
- instance_halls_of_reflection() : InstanceMapScript("instance_halls_of_reflection", 668) { }
-
- struct instance_halls_of_reflection_InstanceMapScript : public InstanceScript
- {
- instance_halls_of_reflection_InstanceMapScript(Map* map) : InstanceScript(map) { }
+ public:
+ instance_halls_of_reflection() : InstanceMapScript(HoRScriptName, 668) { }
- void Initialize() override
+ struct instance_halls_of_reflection_InstanceMapScript : public InstanceScript
{
- SetBossNumber(MAX_ENCOUNTER);
- events.Reset();
-
- _falricGUID = 0;
- _marwynGUID = 0;
- _jainaOrSylvanasPart1GUID = 0;
- _jainaOrSylvanasPart2GUID = 0;
- _lichkingPart1GUID = 0;
- _frostwornGeneralGUID = 0;
-
- _frostmourneGUID = 0;
- _entranceDoorGUID = 0;
- _frostwornDoorGUID = 0;
- _arthasDoorGUID = 0;
- _escapeDoorGUID = 0;
- _caveGUID = 0;
-
- _teamInInstance = 0;
- _waveCount = 0;
- _introEvent = NOT_STARTED;
- _frostwornGeneral = NOT_STARTED;
- _escapeevent = NOT_STARTED;
- _mobsaticewall = 0;
- }
+ instance_halls_of_reflection_InstanceMapScript(Map* map) : InstanceScript(map)
+ {
+ SetBossNumber(EncounterCount);
+
+ JainaOrSylvanasIntroGUID = 0;
+ KorelnOrLoralenGUID = 0;
+ TheLichkingIntroGUID = 0;
+ FalricGUID = 0;
+ MarwynGUID = 0;
+ FrostmourneAltarBunnyGUID = 0;
+ FrostswornGeneralGUID = 0;
+ JainaOrSylvanasEscapeGUID = 0;
+ TheLichKingEscapeGUID = 0;
+
+ FrostmourneGUID = 0;
+ EntranceDoorGUID = 0;
+ ImpenetrableDoorGUID = 0;
+ ShadowThroneDoorGUID = 0;
+ CaveInGUID = 0;
+ GunshipGUID = 0;
+ CaptainsChestGUID = 0;
+ CaptainGUID = 0;
+ IcewallGUID = 0;
+ IcewallTargetGUID = 0;
+
+ _teamInInstance = 0;
+ _waveCount = 0;
+ _introState = NOT_STARTED;
+ _frostswornGeneralState = NOT_STARTED;
+
+ events.Reset();
+ }
- void OnPlayerEnter(Player* player) override
- {
- if (!_teamInInstance)
- _teamInInstance = player->GetTeam();
- }
+ void OnPlayerEnter(Player* player) override
+ {
+ if (!_teamInInstance)
+ _teamInInstance = player->GetTeam();
- void OnCreatureCreate(Creature* creature) override
- {
- if (!_teamInInstance)
+ if (GetBossState(DATA_MARWYN) == DONE)
+ {
+ SpawnGunship();
+
+ if (!JainaOrSylvanasEscapeGUID && GetBossState(DATA_THE_LICH_KING_ESCAPE) != DONE)
+ SpawnEscapeEvent();
+ }
+ }
+
+ void OnCreatureCreate(Creature* creature) override
{
- Map::PlayerList const& players = instance->GetPlayers();
- if (!players.isEmpty())
- if (Player* player = players.begin()->GetSource())
- _teamInInstance = player->GetTeam();
+ switch (creature->GetEntry())
+ {
+ case NPC_JAINA_INTRO:
+ case NPC_SYLVANAS_INTRO:
+ JainaOrSylvanasIntroGUID = creature->GetGUID();
+ break;
+ case NPC_KORELN:
+ case NPC_LORALEN:
+ if (GetBossState(DATA_MARWYN) != DONE)
+ creature->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_QUESTGIVER);
+ KorelnOrLoralenGUID = creature->GetGUID();
+ break;
+ case NPC_THE_LICH_KING_INTRO:
+ TheLichkingIntroGUID = creature->GetGUID();
+ break;
+ case NPC_FALRIC:
+ FalricGUID = creature->GetGUID();
+ break;
+ case NPC_MARWYN:
+ MarwynGUID = creature->GetGUID();
+ break;
+ case NPC_FROSTMOUNRE_ALTAR_BUNNY:
+ FrostmourneAltarBunnyGUID = creature->GetGUID();
+ break;
+ case NPC_FROSTSWORN_GENERAL:
+ FrostswornGeneralGUID = creature->GetGUID();
+ if (GetBossState(DATA_MARWYN) == DONE)
+ creature->SetPhaseMask(1, true);
+ break;
+ case NPC_JAINA_ESCAPE:
+ case NPC_SYLVANAS_ESCAPE:
+ JainaOrSylvanasEscapeGUID = creature->GetGUID();
+ break;
+ case NPC_THE_LICH_KING_ESCAPE:
+ TheLichKingEscapeGUID = creature->GetGUID();
+ break;
+ case NPC_JUSTIN_BARTLETT:
+ case NPC_KORM_BLACKSCAR:
+ CaptainGUID = creature->GetGUID();
+ break;
+ case NPC_WORLD_TRIGGER:
+ if (!creature->GetTransport())
+ break;
+ // no break
+ case NPC_GUNSHIP_CANNON_HORDE:
+ GunshipCannonGUIDs.insert(creature->GetGUID());
+ break;
+ case NPC_ICE_WALL_TARGET:
+ IcewallTargetGUID = creature->GetGUID();
+ break;
+ default:
+ break;
+ }
}
- switch (creature->GetEntry())
+ void OnCreatureRemove(Creature* creature) override
{
- case NPC_JAINA_PART1:
- case NPC_SYLVANAS_PART1:
- _jainaOrSylvanasPart1GUID = creature->GetGUID();
- break;
- case NPC_FALRIC:
- _falricGUID = creature->GetGUID();
- break;
- case NPC_MARWYN:
- _marwynGUID = creature->GetGUID();
- break;
- 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_JAINA_PART2:
- case NPC_SYLVANAS_PART2:
- _jainaOrSylvanasPart2GUID = creature->GetGUID();
- break;
+ 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;
+ }
+ case NPC_ICE_WALL_TARGET:
+ IcewallTargetGUID = 0;
+ break;
+ case NPC_WORLD_TRIGGER:
+ case NPC_GUNSHIP_CANNON_HORDE:
+ GunshipCannonGUIDs.erase(creature->GetGUID());
+ break;
+ default:
+ break;
+ }
}
- }
- void OnCreatureRemove(Creature* creature) override
- {
- switch (creature->GetEntry())
+ uint32 GetGameObjectEntry(uint32 /*guidLow*/, uint32 entry) override
{
- case NPC_WAVE_MERCENARY:
- case NPC_WAVE_FOOTMAN:
- case NPC_WAVE_RIFLEMAN:
- case NPC_WAVE_PRIEST:
- case NPC_WAVE_MAGE:
+ if (!_teamInInstance)
+ {
+ Map::PlayerList const& players = instance->GetPlayers();
+ if (!players.isEmpty())
+ if (Player* player = players.begin()->GetSource())
+ _teamInInstance = player->GetTeam();
+ }
+
+ switch (entry)
{
- uint32 internalWaveId = creature->AI()->GetData(0);
- waveGuidList[internalWaveId].erase(creature->GetGUID());
- break;
+ case GO_THE_CAPTAIN_CHEST_ALLIANCE_NORMAL:
+ case GO_THE_CAPTAIN_CHEST_ALLIANCE_HEROIC:
+ case GO_THE_SKYBREAKER_STAIRS:
+ if (_teamInInstance == HORDE)
+ return 0;
+ break;
+ case GO_THE_CAPTAIN_CHEST_HORDE_NORMAL:
+ case GO_THE_CAPTAIN_CHEST_HORDE_HEROIC:
+ case GO_ORGRIMS_HAMMER_STAIRS:
+ if (_teamInInstance == ALLIANCE)
+ return 0;
+ break;
+ default:
+ break;
}
+
+ return entry;
}
- }
- void OnGameObjectCreate(GameObject* go) override
- {
- switch (go->GetEntry())
+ void OnGameObjectCreate(GameObject* go) override
{
- case GO_FROSTMOURNE:
- _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_ENTRANCE_DOOR:
- _entranceDoorGUID = go->GetGUID();
- go->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_INTERACT_COND);
- HandleGameObject(0, true, go);
- break;
- case GO_FROSTWORN_DOOR:
- _frostwornDoorGUID = go->GetGUID();
- go->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_INTERACT_COND);
- if (GetBossState(DATA_MARWYN_EVENT) == DONE)
- HandleGameObject(0, true, go);
- else
- HandleGameObject(0, false, go);
- break;
- case GO_ARTHAS_DOOR:
- _arthasDoorGUID = go->GetGUID();
- go->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_INTERACT_COND);
- if (GetData(DATA_FROSWORN_EVENT) == DONE)
- HandleGameObject(0, true, go);
- else
+ switch (go->GetEntry())
+ {
+ case GO_FROSTMOURNE:
+ FrostmourneGUID = go->GetGUID();
+ if (GetData(DATA_INTRO_EVENT) == DONE)
+ go->SetPhaseMask(2, true);
+ break;
+ case GO_ENTRANCE_DOOR:
+ EntranceDoorGUID = go->GetGUID();
+ break;
+ case GO_IMPENETRABLE_DOOR:
+ ImpenetrableDoorGUID = go->GetGUID();
+ HandleGameObject(0, GetBossState(DATA_MARWYN) == DONE, go);
+ break;
+ case GO_SHADOW_THRONE_DOOR:
+ ShadowThroneDoorGUID = go->GetGUID();
+ HandleGameObject(0, GetData(DATA_FROSTSWORN_GENERAL) == DONE, go);
+ break;
+ case GO_CAVE_IN:
+ CaveInGUID = go->GetGUID();
+ break;
+ case GO_THE_SKYBREAKER:
+ case GO_ORGRIMS_HAMMER:
+ GunshipGUID = go->GetGUID();
+ break;
+ case GO_THE_SKYBREAKER_STAIRS:
+ case GO_ORGRIMS_HAMMER_STAIRS:
+ if (GetBossState(DATA_THE_LICH_KING_ESCAPE) == DONE)
+ go->SetRespawnTime(DAY);
+ GunshipStairGUIDs.insert(go->GetGUID());
+ break;
+ case GO_THE_CAPTAIN_CHEST_ALLIANCE_NORMAL:
+ case GO_THE_CAPTAIN_CHEST_HORDE_NORMAL:
+ case GO_THE_CAPTAIN_CHEST_ALLIANCE_HEROIC:
+ case GO_THE_CAPTAIN_CHEST_HORDE_HEROIC:
+ CaptainsChestGUID = go->GetGUID();
+ break;
+ case GO_ICE_WALL:
HandleGameObject(0, false, go);
- break;
- case GO_CAVE:
- _caveGUID = go->GetGUID();
- go->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_INTERACT_COND);
- break;
+ IcewallGUID = go->GetGUID();
+ break;
+ default:
+ break;
+ }
}
- }
- void FillInitialWorldStates(WorldPacket& data) override
- {
- data << uint32(WORLD_STATE_HOR_WAVES_ENABLED) << uint32(0);
- data << uint32(WORLD_STATE_HOR_WAVE_COUNT) << uint32(0);
- }
-
- bool SetBossState(uint32 type, EncounterState state) override
- {
- if (!InstanceScript::SetBossState(type, state))
- return false;
-
- switch (type)
+ void OnGameObjectRemove(GameObject* go) override
{
- case DATA_FALRIC_EVENT:
- if (state == DONE)
- {
- ++_waveCount;
- events.ScheduleEvent(EVENT_NEXT_WAVE, 60000);
- }
- break;
- case DATA_MARWYN_EVENT:
- if (state == DONE)
- {
- HandleGameObject(_entranceDoorGUID, true);
- HandleGameObject(_frostwornDoorGUID, true);
- DoUpdateWorldState(WORLD_STATE_HOR_WAVES_ENABLED, 0);
- if (Creature* general = instance->GetCreature(_frostwornGeneralGUID))
- general->SetPhaseMask(1, true);
- }
- break;
- case DATA_LICHKING_EVENT:
- default:
- break;
+ switch (go->GetEntry())
+ {
+ case GO_THE_SKYBREAKER_STAIRS:
+ case GO_ORGRIMS_HAMMER_STAIRS:
+ GunshipStairGUIDs.erase(go->GetGUID());
+ break;
+ default:
+ break;
+ }
}
- return true;
- }
+ void FillInitialWorldStates(WorldPacket& data) override
+ {
+ data << uint32(WORLD_STATE_HOR_WAVES_ENABLED) << uint32(_introState == DONE && GetBossState(DATA_MARWYN) != DONE);
+ data << uint32(WORLD_STATE_HOR_WAVE_COUNT) << uint32(_waveCount);
+ }
- void SetData(uint32 type, uint32 data) override
- {
- switch (type)
+ bool SetBossState(uint32 type, EncounterState state) override
{
- case DATA_INTRO_EVENT:
- if (data == IN_PROGRESS)
- {
- if (!_introEvent)
+ if (!InstanceScript::SetBossState(type, state))
+ return false;
+
+ switch (type)
+ {
+ case DATA_FALRIC:
+ if (state == DONE)
{
- if (_teamInInstance == ALLIANCE)
- instance->SummonCreature(NPC_JAINA_PART1, JainaSpawnPos);
- else
- instance->SummonCreature(NPC_SYLVANAS_PART1, SylvanasSpawnPos);
+ ++_waveCount;
+ events.ScheduleEvent(EVENT_NEXT_WAVE, 60000);
}
- }
- _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);
- if (_teamInInstance == ALLIANCE)
- instance->SummonCreature(NPC_JAINA_PART2, JainaSpawnPos2);
- else
- instance->SummonCreature(NPC_SYLVANAS_PART2, SylvanasSpawnPos2);
- }
- _frostwornGeneral = data;
- break;
- case DATA_ESCAPE_EVENT:
- if (data == IN_PROGRESS)
- {
- if (!_escapeevent)
- if (Creature* jaina_or_sylvanas = instance->GetCreature(_jainaOrSylvanasPart2GUID))
- jaina_or_sylvanas->AI()->DoAction(ACTION_START_ESCAPING);
- }
- else if (data == NOT_STARTED)
- {
- if (Creature* jaina_or_sylvanas = instance->GetCreature(_jainaOrSylvanasPart2GUID))
- jaina_or_sylvanas->DespawnOrUnsummon(1);
- if (_teamInInstance == ALLIANCE)
- instance->SummonCreature(NPC_JAINA_PART2, JainaSpawnPos2);
- else
- instance->SummonCreature(NPC_SYLVANAS_PART2, SylvanasSpawnPos2);
- SetData(DATA_ESCAPE_EVENT,IN_PROGRESS);
- }
- _escapeevent = data;
- break;
- case DATA_SUMMONS:
- if (data == 0)
- {
- _mobsaticewall--;
- if (_mobsaticewall == 0)
+ break;
+ case DATA_MARWYN:
+ if (state == DONE)
{
- if (Creature* jaina_or_sylvanas = instance->GetCreature(_jainaOrSylvanasPart2GUID))
- jaina_or_sylvanas->AI()->DoAction(ACTION_WALL_BROKEN);
+ if (Creature* bunny = instance->GetCreature(FrostmourneAltarBunnyGUID))
+ bunny->CastSpell(bunny, SPELL_START_HALLS_OF_REFLECTION_QUEST_AE, true);
+
+ if (Creature* korelnOrLoralen = instance->GetCreature(KorelnOrLoralenGUID))
+ korelnOrLoralen->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_QUESTGIVER);
+
+ HandleGameObject(EntranceDoorGUID, true);
+ HandleGameObject(ImpenetrableDoorGUID, true);
+ DoUpdateWorldState(WORLD_STATE_HOR_WAVES_ENABLED, 0);
+ if (Creature* general = instance->GetCreature(FrostswornGeneralGUID))
+ general->SetPhaseMask(1, true);
+
+ SpawnGunship();
+ SpawnEscapeEvent();
}
- }
- else if (data == 1)
- _mobsaticewall++;
- break;
+ break;
+ case DATA_THE_LICH_KING_ESCAPE:
+ switch (state)
+ {
+ case NOT_STARTED:
+ break;
+ case IN_PROGRESS:
+ if (Creature* jainaOrSylvanas = instance->GetCreature(JainaOrSylvanasEscapeGUID))
+ jainaOrSylvanas->AI()->DoAction(ACTION_START_PREFIGHT);
+ break;
+ case DONE:
+ if (GameObject* chest = instance->GetGameObject(CaptainsChestGUID))
+ chest->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_LOCKED | GO_FLAG_NOT_SELECTABLE | GO_FLAG_NODESPAWN);
+
+ DoUseDoorOrButton(CaveInGUID, 15);
+
+ if (Creature* lichking = instance->GetCreature(TheLichKingEscapeGUID))
+ {
+ lichking->CastSpell((Unit*)NULL, SPELL_ACHIEV_CHECK, true);
+ lichking->DespawnOrUnsummon(1);
+ }
+ break;
+ case FAIL:
+ DoStopTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_NOT_RETREATING_EVENT);
+
+ if (Creature* jainaOrSylvanas = instance->GetCreature(JainaOrSylvanasEscapeGUID))
+ jainaOrSylvanas->DespawnOrUnsummon(10000);
+
+ if (Creature* icewallTarget = instance->GetCreature(IcewallTargetGUID))
+ icewallTarget->DespawnOrUnsummon();
+
+ if (GameObject* icewall = instance->GetGameObject(IcewallGUID))
+ icewall->Delete();
+
+ events.ScheduleEvent(EVENT_SPAWN_ESCAPE_EVENT, 30000);
+ break;
+ default:
+ break;
+ }
+ break;
+ default:
+ break;
+ }
+
+ return true;
}
- SaveToDB();
- }
+ void SpawnGunship()
+ {
+ // don't spawn gunship twice
+ if (GunshipGUID)
+ return;
+ if (!_teamInInstance)
+ {
+ Map::PlayerList const& players = instance->GetPlayers();
+ if (!players.isEmpty())
+ if (Player* player = players.begin()->GetSource())
+ _teamInInstance = player->GetTeam();
+ }
- // wave scheduling,checked when wave npcs die
- void OnUnitDeath(Unit* unit) override
- {
- Creature* creature = unit->ToCreature();
- if (!creature)
- return;
+ if (Transport* gunship = sTransportMgr->CreateTransport(_teamInInstance == HORDE ? GO_ORGRIMS_HAMMER : GO_THE_SKYBREAKER, 0, instance))
+ gunship->EnableMovement(GetBossState(DATA_THE_LICH_KING_ESCAPE) == DONE);
+ }
- switch (creature->GetEntry())
+ void SpawnEscapeEvent()
{
- case NPC_WAVE_MERCENARY:
- case NPC_WAVE_FOOTMAN:
- case NPC_WAVE_RIFLEMAN:
- case NPC_WAVE_PRIEST:
- case NPC_WAVE_MAGE:
+ if (!_teamInInstance)
{
- 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)
+ Map::PlayerList const& players = instance->GetPlayers();
+ if (!players.isEmpty())
+ if (Player* player = players.begin()->GetSource())
+ _teamInInstance = player->GetTeam();
+ }
+
+ if (_teamInInstance == ALLIANCE)
+ {
+ instance->SummonCreature(NPC_JAINA_ESCAPE, JainaSpawnPos2);
+ instance->SummonCreature(NPC_THE_LICH_KING_ESCAPE, TheLichKingEscapePosition[1]);
+ }
+ else
+ {
+ instance->SummonCreature(NPC_SYLVANAS_ESCAPE, SylvanasSpawnPos2);
+ instance->SummonCreature(NPC_THE_LICH_KING_ESCAPE, TheLichKingEscapePosition[0]);
+ }
+ }
+
+ void SetData(uint32 type, uint32 data) override
+ {
+ switch (type)
+ {
+ case DATA_INTRO_EVENT:
+ if (data == IN_PROGRESS)
+ {
+ if (_introState == NOT_STARTED)
+ {
+ if (_teamInInstance == ALLIANCE)
+ {
+ instance->SummonCreature(NPC_JAINA_INTRO, JainaSpawnPos);
+ instance->SummonCreature(NPC_KORELN, KorelnOrLoralenSpawnPos);
+ }
+ else
+ {
+ instance->SummonCreature(NPC_SYLVANAS_INTRO, SylvanasSpawnPos);
+ instance->SummonCreature(NPC_LORALEN, KorelnOrLoralenSpawnPos);
+ }
+ }
+ }
+ _introState = data;
+ break;
+ case DATA_WAVE_COUNT:
+ if (_waveCount && data == NOT_STARTED)
+ ProcessEvent(NULL, EVENT_DO_WIPE);
+ break;
+ case DATA_FROSTSWORN_GENERAL:
+ if (data == DONE)
+ HandleGameObject(ShadowThroneDoorGUID, true);
+ _frostswornGeneralState = data;
+ break;
+ default:
+ break;
+ }
+
+ SaveToDB();
+ }
+
+ // wave scheduling, checked when wave npcs die
+ void OnUnitDeath(Unit* unit) override
+ {
+ 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 waveId = creature->AI()->GetData(0);
+ for (uint64 guid : waveGuidList[waveId])
+ {
+ if (Creature* npc = instance->GetCreature(guid))
+ if (npc->IsAlive())
+ return;
+ }
+
++_waveCount;
events.ScheduleEvent(EVENT_NEXT_WAVE, 3000);
+ break;
}
- break;
}
}
- }
- void Update(uint32 diff) override
- {
- if (!instance->HavePlayers())
- return;
+ void Update(uint32 diff) override
+ {
+ if (!instance->HavePlayers())
+ return;
- events.Update(diff);
+ events.Update(diff);
- switch (events.ExecuteEvent())
- {
- case EVENT_NEXT_WAVE:
- ProcessEvent(NULL, EVENT_ADD_WAVE);
- break;
+ switch (events.ExecuteEvent())
+ {
+ case EVENT_NEXT_WAVE:
+ ProcessEvent(NULL, EVENT_ADD_WAVE);
+ break;
+ case EVENT_SPAWN_ESCAPE_EVENT:
+ SpawnEscapeEvent();
+ break;
+ }
}
- }
- void ProcessEvent(WorldObject* /*go*/, uint32 eventId) override
- {
- switch (eventId)
+ void ProcessEvent(WorldObject* /*obj*/, uint32 eventId) override
{
- // 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;
+ 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);
+ 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;
+ // iterate each wave
+ for (uint8 i = 0; i < 8; ++i)
+ {
+ tempList = possibilityList;
- uint64 bossGuid = i <= 3 ? _falricGUID : _marwynGUID;
+ uint64 bossGuid = i <= 3 ? FalricGUID : MarwynGUID;
- if (!i)
- Trinity::Containers::RandomResizeList(tempList, 3);
- else if (i < 6 && i != 3)
- Trinity::Containers::RandomResizeList(tempList, 4);
+ 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))
+ for (uint32 entry : tempList)
{
- if (Creature* temp = boss->SummonCreature(*itr, SpawnPos[posIndex], TEMPSUMMON_DEAD_DESPAWN))
+ if (Creature* boss = instance->GetCreature(bossGuid))
{
- temp->AI()->SetData(0, i);
- waveGuidList[i].insert(temp->GetGUID());
+ if (Creature* temp = boss->SummonCreature(entry, SpawnPos[posIndex], TEMPSUMMON_DEAD_DESPAWN))
+ {
+ temp->AI()->SetData(0, i);
+ waveGuidList[i].insert(temp->GetGUID());
+ }
}
- }
- ++posIndex;
+ ++posIndex;
+ }
}
}
- }
- events.ScheduleEvent(EVENT_NEXT_WAVE, 5000);
- 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)
+ events.ScheduleEvent(EVENT_NEXT_WAVE, 5000);
+ 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)
{
- if (Creature* temp = instance->GetCreature(*itr))
+ uint32 internalWaveId = _waveCount - ((_waveCount < 5) ? 1 : 2);
+ for (uint64 guid : waveGuidList[internalWaveId])
{
- 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(temp, 100.00f);
+ if (Creature* temp = instance->GetCreature(guid))
+ {
+ temp->CastSpell(temp, SPELL_SPIRIT_ACTIVATE, false);
+ temp->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_IMMUNE_TO_NPC | UNIT_FLAG_NOT_SELECTABLE);
+ temp->AI()->DoZoneInCombat(temp, 100.00f);
+ }
}
}
- }
- else
- {
- uint32 bossIndex = (_waveCount / 5) - 1;
- if (GetBossState(DATA_FALRIC_EVENT + bossIndex) != DONE)
+ else
+ {
+ uint32 bossIndex = (_waveCount / 5) - 1;
+ if (GetBossState(DATA_FALRIC + bossIndex) != DONE)
+ {
+ if (Creature* boss = instance->GetCreature(bossIndex ? MarwynGUID : FalricGUID))
+ boss->AI()->DoAction(ACTION_ENTER_COMBAT);
+ }
+ else if (_waveCount != 10)
+ {
+ ++_waveCount;
+ events.ScheduleEvent(EVENT_NEXT_WAVE, 5000);
+ }
+ }
+ 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)
{
- if (Creature* boss = instance->GetCreature(bossIndex ? _marwynGUID : _falricGUID))
- boss->AI()->DoAction(ACTION_ENTER_COMBAT);
+ for (uint64 guid : waveGuidList[i])
+ if (Creature* creature = instance->GetCreature(guid))
+ creature->DespawnOrUnsummon(1);
+ waveGuidList[i].clear();
}
- else if (_waveCount != 10)
+ break;
+ // Gunship Outro
+ case EVENT_GUNSHIP_ARRIVAL:
+ if (GetBossState(DATA_THE_LICH_KING_ESCAPE) == DONE)
+ break;
+
+ if (Transport* gunship = instance->GetTransport(GunshipGUID))
+ gunship->EnableMovement(false);
+
+ if (Creature* jainaOrSylvanas = instance->GetCreature(JainaOrSylvanasEscapeGUID))
+ jainaOrSylvanas->AI()->DoAction(ACTION_GUNSHIP_ARRIVAL);
+
+ if (Creature* captain = instance->GetCreature(CaptainGUID))
+ captain->AI()->Talk(SAY_CAPTAIN_FIRE);
+
+ for (uint64 guid : GunshipCannonGUIDs)
{
- ++_waveCount;
- events.ScheduleEvent(EVENT_NEXT_WAVE, 5000);
+ uint32 entry = GUID_ENPART(guid);
+ if ((entry == NPC_WORLD_TRIGGER && _teamInInstance == ALLIANCE) || (entry == NPC_GUNSHIP_CANNON_HORDE && _teamInInstance == HORDE))
+ if (Creature* cannon = instance->GetCreature(guid))
+ cannon->CastSpell(cannon, SPELL_GUNSHIP_CANNON_FIRE, true);
}
- }
- 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;
+ break;
+ case EVENT_GUNSHIP_ARRIVAL_2:
+ if (Transport* gunship = instance->GetTransport(GunshipGUID))
+ gunship->EnableMovement(false);
+
+ for (uint64 guid : GunshipStairGUIDs)
+ if (GameObject* stairs = instance->GetGameObject(guid))
+ stairs->SetRespawnTime(DAY);
+
+ if (Creature* jainaOrSylvanas = instance->GetCreature(JainaOrSylvanasEscapeGUID))
+ jainaOrSylvanas->AI()->DoAction(ACTION_GUNSHIP_ARRIVAL_2);
+
+ if (Creature* captain = instance->GetCreature(CaptainGUID))
+ captain->AI()->Talk(SAY_CAPTAIN_FINAL);
+
+ break;
+ default:
+ break;
+ }
}
- }
- uint32 GetData(uint32 type) const override
- {
- switch (type)
+ uint32 GetData(uint32 type) const override
{
- 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;
- case DATA_ESCAPE_EVENT:
- return _escapeevent;
- case DATA_SUMMONS:
- return _mobsaticewall;
- default:
- break;
- }
+ switch (type)
+ {
+ case DATA_WAVE_COUNT:
+ return _waveCount;
+ case DATA_TEAM_IN_INSTANCE:
+ return _teamInInstance;
+ case DATA_INTRO_EVENT:
+ return _introState;
+ case DATA_FROSTSWORN_GENERAL:
+ return _frostswornGeneralState;
+ default:
+ break;
+ }
- return 0;
- }
+ return 0;
+ }
- uint64 GetData64(uint32 type) const override
- {
- switch (type)
+ uint64 GetData64(uint32 type) const override
{
- 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;
- case DATA_ESCAPE_LEADER:
- return _jainaOrSylvanasPart2GUID;
- case DATA_CAVE_IN:
- return _caveGUID;
- default:
- break;
- }
+ switch (type)
+ {
+ case DATA_FALRIC:
+ return FalricGUID;
+ case DATA_MARWYN:
+ return MarwynGUID;
+ case DATA_FROSTSWORN_GENERAL:
+ return FrostswornGeneralGUID;
+ case DATA_IMPENETRABLE_DOOR:
+ return ImpenetrableDoorGUID;
+ case DATA_FROSTMOURNE:
+ return FrostmourneGUID;
+ case DATA_ESCAPE_LEADER:
+ return JainaOrSylvanasEscapeGUID;
+ case DATA_KORELN_LORALEN:
+ return KorelnOrLoralenGUID;
+ case DATA_THE_LICH_KING_ESCAPE:
+ return TheLichKingEscapeGUID;
+ case DATA_GUNSHIP:
+ return GunshipGUID;
+ case DATA_ICEWALL:
+ return IcewallGUID;
+ case DATA_ICEWALL_TARGET:
+ return IcewallTargetGUID;
+ default:
+ break;
+ }
- return 0;
- }
+ return 0;
+ }
- std::string GetSaveData() override
- {
- OUT_SAVE_INST_DATA;
+ std::string GetSaveData() override
+ {
+ OUT_SAVE_INST_DATA;
- std::ostringstream saveStream;
- saveStream << "H R " << GetBossSaveData() << _introEvent << ' ' << _frostwornGeneral << ' ' << _escapeevent;
+ std::ostringstream saveStream;
+ saveStream << "H R " << GetBossSaveData() << _introState << ' ' << _frostswornGeneralState;
- OUT_SAVE_INST_DATA_COMPLETE;
- return saveStream.str();
- }
+ OUT_SAVE_INST_DATA_COMPLETE;
+ return saveStream.str();
+ }
- void Load(char const* in) override
- {
- if (!in)
+ void Load(char const* in) override
{
- OUT_LOAD_INST_DATA_FAIL;
- return;
- }
+ if (!in)
+ {
+ OUT_LOAD_INST_DATA_FAIL;
+ return;
+ }
- OUT_LOAD_INST_DATA(in);
+ OUT_LOAD_INST_DATA(in);
- char dataHead1, dataHead2;
+ char dataHead1, dataHead2;
- std::istringstream loadStream(in);
- loadStream >> dataHead1 >> dataHead2;
+ std::istringstream loadStream(in);
+ loadStream >> dataHead1 >> dataHead2;
- if (dataHead1 == 'H' && dataHead2 == 'R')
- {
- for (uint8 i = 0; i < MAX_ENCOUNTER; ++i)
+ if (dataHead1 == 'H' && dataHead2 == 'R')
{
- uint32 tmpState;
- loadStream >> tmpState;
- if (tmpState == IN_PROGRESS || tmpState > SPECIAL)
- tmpState = NOT_STARTED;
+ for (uint8 i = 0; i < EncounterCount; ++i)
+ {
+ uint32 tmpState;
+ loadStream >> tmpState;
+ if (tmpState == IN_PROGRESS || tmpState > SPECIAL)
+ tmpState = NOT_STARTED;
- SetBossState(i, EncounterState(tmpState));
- }
+ SetBossState(i, EncounterState(tmpState));
+ }
- uint32 temp = 0;
- loadStream >> temp;
- if (temp == DONE)
- SetData(DATA_INTRO_EVENT, DONE);
- else
- SetData(DATA_INTRO_EVENT, NOT_STARTED);
+ 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);
+ loadStream >> temp;
+ if (temp == DONE)
+ SetData(DATA_FROSTSWORN_GENERAL, DONE);
+ else
+ SetData(DATA_FROSTSWORN_GENERAL, NOT_STARTED);
+ }
else
- SetData(DATA_FROSWORN_EVENT, NOT_STARTED);
+ OUT_LOAD_INST_DATA_FAIL;
- loadStream >> temp;
- if (temp == DONE)
- SetData(DATA_ESCAPE_EVENT, DONE);
- else
- SetData(DATA_ESCAPE_EVENT, NOT_STARTED);
+ OUT_LOAD_INST_DATA_COMPLETE;
}
- else
- OUT_LOAD_INST_DATA_FAIL;
- OUT_LOAD_INST_DATA_COMPLETE;
+ private:
+ uint64 JainaOrSylvanasIntroGUID; // unused
+ uint64 KorelnOrLoralenGUID;
+ uint64 TheLichkingIntroGUID; // unused
+ uint64 FalricGUID;
+ uint64 MarwynGUID;
+ uint64 FrostmourneAltarBunnyGUID;
+ uint64 FrostswornGeneralGUID;
+ uint64 JainaOrSylvanasEscapeGUID;
+ uint64 TheLichKingEscapeGUID;
+
+ uint64 FrostmourneGUID;
+ uint64 EntranceDoorGUID;
+ uint64 ImpenetrableDoorGUID;
+ uint64 ShadowThroneDoorGUID;
+ uint64 CaveInGUID;
+
+ uint32 _teamInInstance;
+ uint32 _waveCount;
+ uint32 _introState;
+ uint32 _frostswornGeneralState;
+
+ EventMap events;
+ std::set<uint64> waveGuidList[8];
+
+ uint64 GunshipGUID;
+ uint64 CaptainsChestGUID;
+ uint64 CaptainGUID;
+ uint64 IcewallGUID;
+ uint64 IcewallTargetGUID;
+
+ std::set<uint64> GunshipCannonGUIDs;
+ std::set<uint64> GunshipStairGUIDs;
+ };
+
+ InstanceScript* GetInstanceScript(InstanceMap* map) const override
+ {
+ return new instance_halls_of_reflection_InstanceMapScript(map);
}
-
- private:
- uint64 _falricGUID;
- uint64 _marwynGUID;
- uint64 _jainaOrSylvanasPart1GUID;
- uint64 _jainaOrSylvanasPart2GUID;
- uint64 _lichkingPart1GUID;
- uint64 _frostwornGeneralGUID;
-
- uint64 _frostmourneGUID;
- uint64 _entranceDoorGUID;
- uint64 _frostwornDoorGUID;
- uint64 _arthasDoorGUID;
- uint64 _escapeDoorGUID;
- uint64 _caveGUID;
-
- uint32 _teamInInstance;
- uint32 _waveCount;
- uint32 _introEvent;
- uint32 _frostwornGeneral;
- uint32 _escapeevent;
- uint32 _mobsaticewall;
-
- EventMap events;
-
- std::set<uint64> waveGuidList[8];
- };
-
- InstanceScript* GetInstanceScript(InstanceMap* map) const override
- {
- return new instance_halls_of_reflection_InstanceMapScript(map);
- }
};
void AddSC_instance_halls_of_reflection()
diff --git a/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.cpp b/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.cpp
index 25cc47b358c..592c44940a4 100644
--- a/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.cpp
+++ b/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.cpp
@@ -1800,7 +1800,7 @@ class spell_icc_sprit_alarm : public SpellScriptLoader
}
if (GameObject* trap = GetCaster()->FindNearestGameObject(trapId, 5.0f))
- trap->SetRespawnTime(trap->GetGOInfo()->trap.autoCloseTime);
+ trap->SetRespawnTime(trap->GetGOInfo()->GetAutoCloseTime());
std::list<Creature*> wards;
GetCaster()->GetCreatureListWithEntryInGrid(wards, NPC_DEATHBOUND_WARD, 150.0f);
diff --git a/src/server/scripts/Northrend/Nexus/EyeOfEternity/boss_malygos.cpp b/src/server/scripts/Northrend/Nexus/EyeOfEternity/boss_malygos.cpp
index 3f0fb2f93b1..192249955cf 100644
--- a/src/server/scripts/Northrend/Nexus/EyeOfEternity/boss_malygos.cpp
+++ b/src/server/scripts/Northrend/Nexus/EyeOfEternity/boss_malygos.cpp
@@ -1810,7 +1810,7 @@ public:
class spell_malygos_vortex_dummy_SpellScript : public SpellScript
{
- PrepareSpellScript(spell_malygos_vortex_dummy_SpellScript)
+ PrepareSpellScript(spell_malygos_vortex_dummy_SpellScript);
bool Load() override
{
@@ -2282,7 +2282,7 @@ class spell_malygos_surge_of_power_warning_selector_25 : public SpellScriptLoade
class spell_malygos_surge_of_power_warning_selector_25_SpellScript : public SpellScript
{
- PrepareSpellScript(spell_malygos_surge_of_power_warning_selector_25_SpellScript)
+ PrepareSpellScript(spell_malygos_surge_of_power_warning_selector_25_SpellScript);
bool Load() override
{
@@ -2348,7 +2348,7 @@ class spell_malygos_surge_of_power_25 : public SpellScriptLoader
class spell_malygos_surge_of_power_25_SpellScript : public SpellScript
{
- PrepareSpellScript(spell_malygos_surge_of_power_25_SpellScript)
+ PrepareSpellScript(spell_malygos_surge_of_power_25_SpellScript);
bool Load() override
{
diff --git a/src/server/scripts/Northrend/Nexus/Oculus/boss_varos.cpp b/src/server/scripts/Northrend/Nexus/Oculus/boss_varos.cpp
index 0870614ba78..585da8e28d3 100644
--- a/src/server/scripts/Northrend/Nexus/Oculus/boss_varos.cpp
+++ b/src/server/scripts/Northrend/Nexus/Oculus/boss_varos.cpp
@@ -299,7 +299,7 @@ class spell_varos_energize_core_area_enemy : public SpellScriptLoader
class spell_varos_energize_core_area_enemySpellScript : public SpellScript
{
- PrepareSpellScript(spell_varos_energize_core_area_enemySpellScript)
+ PrepareSpellScript(spell_varos_energize_core_area_enemySpellScript);
void FilterTargets(std::list<WorldObject*>& targets)
{
@@ -343,7 +343,7 @@ class spell_varos_energize_core_area_entry : public SpellScriptLoader
class spell_varos_energize_core_area_entrySpellScript : public SpellScript
{
- PrepareSpellScript(spell_varos_energize_core_area_entrySpellScript)
+ PrepareSpellScript(spell_varos_energize_core_area_entrySpellScript);
void FilterTargets(std::list<WorldObject*>& targets)
{
diff --git a/src/server/scripts/Northrend/Ulduar/HallsOfStone/boss_krystallus.cpp b/src/server/scripts/Northrend/Ulduar/HallsOfStone/boss_krystallus.cpp
index c81cd0b0b80..07cdfa3353c 100644
--- a/src/server/scripts/Northrend/Ulduar/HallsOfStone/boss_krystallus.cpp
+++ b/src/server/scripts/Northrend/Ulduar/HallsOfStone/boss_krystallus.cpp
@@ -15,14 +15,6 @@
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-/* Script Data Start
-SDName: Boss krystallus
-SDAuthor: LordVanMartin
-SD%Complete:
-SDComment:
-SDCategory:
-Script Data End */
-
#include "ScriptMgr.h"
#include "ScriptedCreature.h"
#include "SpellScript.h"
@@ -30,17 +22,13 @@ Script Data End */
enum Spells
{
- SPELL_BOULDER_TOSS = 50843,
- H_SPELL_BOULDER_TOSS = 59742,
- SPELL_GROUND_SPIKE = 59750,
- SPELL_GROUND_SLAM = 50827,
- SPELL_SHATTER = 50810,
- H_SPELL_SHATTER = 61546,
- SPELL_SHATTER_EFFECT = 50811,
- H_SPELL_SHATTER_EFFECT = 61547,
- SPELL_STONED = 50812,
- SPELL_STOMP = 48131,
- H_SPELL_STOMP = 59744
+ SPELL_BOULDER_TOSS = 50843,
+ SPELL_GROUND_SPIKE = 59750,
+ SPELL_GROUND_SLAM = 50827,
+ SPELL_SHATTER = 50810,
+ SPELL_SHATTER_EFFECT = 50811,
+ SPELL_STONED = 50812,
+ SPELL_STOMP = 48131
};
enum Yells
@@ -51,133 +39,103 @@ enum Yells
SAY_SHATTER = 3
};
-class boss_krystallus : public CreatureScript
+enum Events
{
-public:
- boss_krystallus() : CreatureScript("boss_krystallus") { }
-
- struct boss_krystallusAI : public ScriptedAI
- {
- boss_krystallusAI(Creature* creature) : ScriptedAI(creature)
- {
- instance = creature->GetInstanceScript();
- }
-
- uint32 uiBoulderTossTimer;
- uint32 uiGroundSpikeTimer;
- uint32 uiGroundSlamTimer;
- uint32 uiShatterTimer;
- uint32 uiStompTimer;
-
- bool bIsSlam;
-
- InstanceScript* instance;
-
- void Reset() override
- {
- bIsSlam = false;
-
- uiBoulderTossTimer = urand(3000, 9000);
- uiGroundSpikeTimer = urand(9000, 14000);
- uiGroundSlamTimer = urand(15000, 18000);
- uiStompTimer = urand(20000, 29000);
- uiShatterTimer = 0;
-
- instance->SetBossState(DATA_KRYSTALLUS, NOT_STARTED);
- }
- void EnterCombat(Unit* /*who*/) override
- {
- Talk(SAY_AGGRO);
+ EVENT_BOULDER_TOSS = 1,
+ EVENT_GROUND_SPIKE,
+ EVENT_GROUND_SLAM,
+ EVENT_STOMP,
+ EVENT_SHATTER
+};
- instance->SetBossState(DATA_KRYSTALLUS, IN_PROGRESS);
- }
+class boss_krystallus : public CreatureScript
+{
+ public:
+ boss_krystallus() : CreatureScript("boss_krystallus") { }
- void UpdateAI(uint32 diff) override
+ struct boss_krystallusAI : public BossAI
{
- //Return since we have no target
- if (!UpdateVictim())
- return;
+ boss_krystallusAI(Creature* creature) : BossAI(creature, DATA_KRYSTALLUS) { }
- if (uiBoulderTossTimer <= diff)
+ void Reset() override
{
- if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true))
- DoCast(target, SPELL_BOULDER_TOSS);
- uiBoulderTossTimer = urand(9000, 15000);
- } else uiBoulderTossTimer -= diff;
-
- if (uiGroundSpikeTimer <= diff)
- {
- if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true))
- DoCast(target, SPELL_GROUND_SPIKE);
- uiGroundSpikeTimer = urand(12000, 17000);
- } else uiGroundSpikeTimer -= diff;
-
- if (uiStompTimer <= diff)
- {
- DoCast(me, SPELL_STOMP);
- uiStompTimer = urand(20000, 29000);
- } else uiStompTimer -= diff;
-
- if (uiGroundSlamTimer <= diff)
- {
- DoCast(me, SPELL_GROUND_SLAM);
- bIsSlam = true;
- uiShatterTimer = 10000;
- uiGroundSlamTimer = urand(15000, 18000);
- } else uiGroundSlamTimer -= diff;
+ _Reset();
+ }
- if (bIsSlam)
+ void EnterCombat(Unit* /*who*/) override
{
- if (uiShatterTimer <= diff)
- {
- DoCast(me, DUNGEON_MODE(SPELL_SHATTER, H_SPELL_SHATTER));
- } else uiShatterTimer -= diff;
+ Talk(SAY_AGGRO);
+ _EnterCombat();
+
+ events.ScheduleEvent(EVENT_BOULDER_TOSS, urand(3000, 9000));
+ events.ScheduleEvent(EVENT_GROUND_SLAM, urand(15000, 18000));
+ events.ScheduleEvent(EVENT_STOMP, urand(20000, 29000));
+ if (IsHeroic())
+ events.ScheduleEvent(EVENT_GROUND_SPIKE, urand(9000, 14000));
}
- DoMeleeAttackIfReady();
- }
-
- void JustDied(Unit* /*killer*/) override
- {
- Talk(SAY_DEATH);
-
- instance->SetBossState(DATA_KRYSTALLUS, DONE);
- }
+ void UpdateAI(uint32 diff) override
+ {
+ // Return since we have no target
+ if (!UpdateVictim())
+ return;
- void KilledUnit(Unit* victim) override
- {
- if (victim->GetTypeId() != TYPEID_PLAYER)
- return;
+ events.Update(diff);
- Talk(SAY_KILL);
- }
+ if (me->HasUnitState(UNIT_STATE_CASTING))
+ return;
- void SpellHitTarget(Unit* /*target*/, const SpellInfo* pSpell) override
- {
- //this part should be in the core
- if (pSpell->Id == SPELL_SHATTER || pSpell->Id == H_SPELL_SHATTER)
- {
- /// @todo we need eventmap to kill this stuff
- //clear this, if we are still performing
- if (bIsSlam)
+ while (uint32 eventId = events.ExecuteEvent())
{
- bIsSlam = false;
-
- //and correct movement, if not already
- if (me->GetMotionMaster()->GetCurrentMovementGeneratorType() != CHASE_MOTION_TYPE)
+ switch (eventId)
{
- if (me->GetVictim())
- me->GetMotionMaster()->MoveChase(me->GetVictim());
+ case EVENT_BOULDER_TOSS:
+ if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 50.0f, true))
+ DoCast(target, SPELL_BOULDER_TOSS);
+ events.ScheduleEvent(EVENT_BOULDER_TOSS, urand(9000, 15000));
+ break;
+ case EVENT_GROUND_SPIKE:
+ if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100.0f, true))
+ DoCast(target, SPELL_GROUND_SPIKE);
+ events.ScheduleEvent(EVENT_GROUND_SPIKE, urand(12000, 17000));
+ break;
+ case EVENT_GROUND_SLAM:
+ DoCast(me, SPELL_GROUND_SLAM);
+ events.ScheduleEvent(EVENT_SHATTER, 10000);
+ events.ScheduleEvent(EVENT_GROUND_SLAM, urand(15000, 18000));
+ break;
+ case EVENT_STOMP:
+ DoCast(me, SPELL_STOMP);
+ events.ScheduleEvent(EVENT_STOMP, urand(20000, 29000));
+ break;
+ case EVENT_SHATTER:
+ DoCast(me, SPELL_SHATTER);
+ break;
+ default:
+ break;
}
}
+
+ DoMeleeAttackIfReady();
+ }
+
+ void JustDied(Unit* /*killer*/) override
+ {
+ Talk(SAY_DEATH);
+ _JustDied();
}
- }
- };
- CreatureAI* GetAI(Creature* creature) const override
- {
- return GetHallsOfStoneAI<boss_krystallusAI>(creature);
- }
+ void KilledUnit(Unit* victim) override
+ {
+ if (victim->GetTypeId() == TYPEID_PLAYER)
+ Talk(SAY_KILL);
+ }
+ };
+
+ CreatureAI* GetAI(Creature* creature) const override
+ {
+ return GetHallsOfStoneAI<boss_krystallusAI>(creature);
+ }
};
class spell_krystallus_shatter : public SpellScriptLoader
diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_mimiron.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_mimiron.cpp
index cfa5429ea79..f284aacf996 100644
--- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_mimiron.cpp
+++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_mimiron.cpp
@@ -89,7 +89,7 @@ class spell_ulduar_proximity_mines : public SpellScriptLoader
class spell_ulduar_proximity_minesSpellScript : public SpellScript
{
- PrepareSpellScript(spell_ulduar_proximity_minesSpellScript)
+ PrepareSpellScript(spell_ulduar_proximity_minesSpellScript);
void HandleScript(SpellEffIndex effIndex)
{
diff --git a/src/server/scripts/Spells/spell_generic.cpp b/src/server/scripts/Spells/spell_generic.cpp
index 77a4faa7e8c..4c72d790059 100644
--- a/src/server/scripts/Spells/spell_generic.cpp
+++ b/src/server/scripts/Spells/spell_generic.cpp
@@ -509,7 +509,7 @@ class spell_gen_break_shield: public SpellScriptLoader
class spell_gen_break_shield_SpellScript : public SpellScript
{
- PrepareSpellScript(spell_gen_break_shield_SpellScript)
+ PrepareSpellScript(spell_gen_break_shield_SpellScript);
void HandleScriptEffect(SpellEffIndex effIndex)
{
@@ -671,7 +671,7 @@ class spell_gen_chaos_blast : public SpellScriptLoader
class spell_gen_chaos_blast_SpellScript : public SpellScript
{
- PrepareSpellScript(spell_gen_chaos_blast_SpellScript)
+ PrepareSpellScript(spell_gen_chaos_blast_SpellScript);
bool Validate(SpellInfo const* /*spellInfo*/) override
{
@@ -895,7 +895,7 @@ class spell_gen_count_pct_from_max_hp : public SpellScriptLoader
class spell_gen_count_pct_from_max_hp_SpellScript : public SpellScript
{
- PrepareSpellScript(spell_gen_count_pct_from_max_hp_SpellScript)
+ PrepareSpellScript(spell_gen_count_pct_from_max_hp_SpellScript);
public:
spell_gen_count_pct_from_max_hp_SpellScript(int32 damagePct) : SpellScript(), _damagePct(damagePct) { }
@@ -1446,6 +1446,7 @@ class spell_gen_elune_candle : public SpellScriptLoader
class spell_gen_elune_candle_SpellScript : public SpellScript
{
PrepareSpellScript(spell_gen_elune_candle_SpellScript);
+
bool Validate(SpellInfo const* /*spellInfo*/) override
{
if (!sSpellMgr->GetSpellInfo(SPELL_ELUNE_CANDLE_OMEN_HEAD) ||
@@ -1511,7 +1512,7 @@ class spell_gen_gadgetzan_transporter_backfire : public SpellScriptLoader
class spell_gen_gadgetzan_transporter_backfire_SpellScript : public SpellScript
{
- PrepareSpellScript(spell_gen_gadgetzan_transporter_backfire_SpellScript)
+ PrepareSpellScript(spell_gen_gadgetzan_transporter_backfire_SpellScript);
bool Validate(SpellInfo const* /*spellInfo*/) override
{
@@ -1612,7 +1613,7 @@ class spell_gen_gnomish_transporter : public SpellScriptLoader
class spell_gen_gnomish_transporter_SpellScript : public SpellScript
{
- PrepareSpellScript(spell_gen_gnomish_transporter_SpellScript)
+ PrepareSpellScript(spell_gen_gnomish_transporter_SpellScript);
bool Validate(SpellInfo const* /*spellInfo*/) override
{
@@ -2093,7 +2094,7 @@ class spell_gen_mounted_charge: public SpellScriptLoader
class spell_gen_mounted_charge_SpellScript : public SpellScript
{
- PrepareSpellScript(spell_gen_mounted_charge_SpellScript)
+ PrepareSpellScript(spell_gen_mounted_charge_SpellScript);
void HandleScriptEffect(SpellEffIndex effIndex)
{
@@ -2794,7 +2795,7 @@ class spell_gen_parachute_ic : public SpellScriptLoader
class spell_gen_parachute_ic_AuraScript : public AuraScript
{
- PrepareAuraScript(spell_gen_parachute_ic_AuraScript)
+ PrepareAuraScript(spell_gen_parachute_ic_AuraScript);
void HandleTriggerSpell(AuraEffect const* /*aurEff*/)
{
@@ -2842,30 +2843,28 @@ class spell_gen_pet_summoned : public SpellScriptLoader
if (player->GetLastPetNumber())
{
PetType newPetType = (player->getClass() == CLASS_HUNTER) ? HUNTER_PET : SUMMON_PET;
- if (Pet* newPet = new Pet(player, newPetType))
+ Pet* newPet = new Pet(player, newPetType);
+ if (newPet->LoadPetFromDB(player, 0, player->GetLastPetNumber(), true))
{
- if (newPet->LoadPetFromDB(player, 0, player->GetLastPetNumber(), true))
- {
- // revive the pet if it is dead
- if (newPet->getDeathState() == DEAD)
- newPet->setDeathState(ALIVE);
+ // revive the pet if it is dead
+ if (newPet->getDeathState() == DEAD)
+ newPet->setDeathState(ALIVE);
- newPet->SetFullHealth();
- newPet->SetPower(newPet->getPowerType(), newPet->GetMaxPower(newPet->getPowerType()));
+ newPet->SetFullHealth();
+ newPet->SetPower(newPet->getPowerType(), newPet->GetMaxPower(newPet->getPowerType()));
- switch (newPet->GetEntry())
- {
- case NPC_DOOMGUARD:
- case NPC_INFERNAL:
- newPet->SetEntry(NPC_IMP);
- break;
- default:
- break;
- }
+ switch (newPet->GetEntry())
+ {
+ case NPC_DOOMGUARD:
+ case NPC_INFERNAL:
+ newPet->SetEntry(NPC_IMP);
+ break;
+ default:
+ break;
}
- else
- delete newPet;
}
+ else
+ delete newPet;
}
}
@@ -3123,7 +3122,7 @@ class spell_gen_spectator_cheer_trigger : public SpellScriptLoader
class spell_gen_spectator_cheer_trigger_SpellScript : public SpellScript
{
- PrepareSpellScript(spell_gen_spectator_cheer_trigger_SpellScript)
+ PrepareSpellScript(spell_gen_spectator_cheer_trigger_SpellScript);
void HandleDummy(SpellEffIndex /*effIndex*/)
{
@@ -3615,7 +3614,7 @@ class spell_gen_vendor_bark_trigger : public SpellScriptLoader
class spell_gen_vendor_bark_trigger_SpellScript : public SpellScript
{
- PrepareSpellScript(spell_gen_vendor_bark_trigger_SpellScript)
+ PrepareSpellScript(spell_gen_vendor_bark_trigger_SpellScript);
void HandleDummy(SpellEffIndex /* effIndex */)
{
diff --git a/src/server/scripts/Spells/spell_holiday.cpp b/src/server/scripts/Spells/spell_holiday.cpp
index dc0c70975dd..85bf85fa2d2 100644
--- a/src/server/scripts/Spells/spell_holiday.cpp
+++ b/src/server/scripts/Spells/spell_holiday.cpp
@@ -296,7 +296,7 @@ class spell_pilgrims_bounty_buff_food : public SpellScriptLoader
class spell_pilgrims_bounty_buff_food_AuraScript : public AuraScript
{
- PrepareAuraScript(spell_pilgrims_bounty_buff_food_AuraScript)
+ PrepareAuraScript(spell_pilgrims_bounty_buff_food_AuraScript);
private:
uint32 const _triggeredSpellId;
diff --git a/src/server/scripts/Spells/spell_shaman.cpp b/src/server/scripts/Spells/spell_shaman.cpp
index 590cad7007f..61ff79c505e 100644
--- a/src/server/scripts/Spells/spell_shaman.cpp
+++ b/src/server/scripts/Spells/spell_shaman.cpp
@@ -775,7 +775,7 @@ class spell_sha_lava_lash : public SpellScriptLoader
class spell_sha_lava_lash_SpellScript : public SpellScript
{
- PrepareSpellScript(spell_sha_lava_lash_SpellScript)
+ PrepareSpellScript(spell_sha_lava_lash_SpellScript);
bool Load() override
{
diff --git a/src/server/scripts/World/boss_emerald_dragons.cpp b/src/server/scripts/World/boss_emerald_dragons.cpp
index 362c02e1af5..950b4cd10e9 100644
--- a/src/server/scripts/World/boss_emerald_dragons.cpp
+++ b/src/server/scripts/World/boss_emerald_dragons.cpp
@@ -781,4 +781,4 @@ void AddSC_emerald_dragons()
// dragon spellscripts
new spell_dream_fog_sleep();
new spell_mark_of_nature();
-};
+}
diff --git a/src/server/shared/Database/DatabaseWorkerPool.h b/src/server/shared/Database/DatabaseWorkerPool.h
index c60458323f7..3665a388854 100644
--- a/src/server/shared/Database/DatabaseWorkerPool.h
+++ b/src/server/shared/Database/DatabaseWorkerPool.h
@@ -49,8 +49,10 @@ class DatabaseWorkerPool
{
public:
/* Activity state */
- DatabaseWorkerPool() : _queue(new ACE_Activation_Queue()), _connectionInfo(NULL)
+ DatabaseWorkerPool() : _connectionInfo(NULL)
{
+ _messageQueue = new ACE_Message_Queue<ACE_SYNCH>(8 * 1024 * 1024, 8 * 1024 * 1024);
+ _queue = new ACE_Activation_Queue(_messageQueue);
memset(_connectionCount, 0, sizeof(_connectionCount));
_connections.resize(IDX_SIZE);
@@ -131,6 +133,7 @@ class DatabaseWorkerPool
//! Deletes the ACE_Activation_Queue object and its underlying ACE_Message_Queue
delete _queue;
+ delete _messageQueue;
TC_LOG_INFO("sql.driver", "All connections on DatabasePool '%s' closed.", GetDatabaseName());
@@ -520,6 +523,7 @@ class DatabaseWorkerPool
IDX_SIZE
};
+ ACE_Message_Queue<ACE_SYNCH>* _messageQueue; //! Message Queue used by ACE_Activation_Queue
ACE_Activation_Queue* _queue; //! Queue shared by async worker threads.
std::vector< std::vector<T*> > _connections;
uint32 _connectionCount[2]; //! Counter of MySQL connections;
diff --git a/src/server/shared/Logging/Log.cpp b/src/server/shared/Logging/Log.cpp
index bc002668b3b..dc9bda62bfb 100644
--- a/src/server/shared/Logging/Log.cpp
+++ b/src/server/shared/Logging/Log.cpp
@@ -250,13 +250,13 @@ void Log::ReadLoggersFromConfig()
AppenderConsole* appender = new AppenderConsole(NextAppenderId(), "Console", LOG_LEVEL_DEBUG, APPENDER_FLAGS_NONE);
appenders[appender->getId()] = appender;
- Logger& rootLogger = loggers[LOGGER_ROOT];
- rootLogger.Create(LOGGER_ROOT, LOG_LEVEL_ERROR);
- rootLogger.addAppender(appender->getId(), appender);
+ Logger& logger = loggers[LOGGER_ROOT];
+ logger.Create(LOGGER_ROOT, LOG_LEVEL_ERROR);
+ logger.addAppender(appender->getId(), appender);
- Logger& serverLogger = loggers["server"];
- serverLogger.Create("server", LOG_LEVEL_INFO);
- serverLogger.addAppender(appender->getId(), appender);
+ logger = loggers["server"];
+ logger.Create("server", LOG_LEVEL_ERROR);
+ logger.addAppender(appender->getId(), appender);
}
}
@@ -267,7 +267,7 @@ void Log::vlog(std::string const& filter, LogLevel level, char const* str, va_li
write(new LogMessage(level, filter, text));
}
-void Log::write(LogMessage* msg)
+void Log::write(LogMessage* msg) const
{
Logger const* logger = GetLoggerByType(msg->type);
msg->text.append("\n");
@@ -376,7 +376,6 @@ void Log::Close()
delete worker;
worker = NULL;
loggers.clear();
- cachedLoggers.clear();
for (AppenderMap::iterator it = appenders.begin(); it != appenders.end(); ++it)
{
delete it->second;
diff --git a/src/server/shared/Logging/Log.h b/src/server/shared/Logging/Log.h
index 5fa638e2f40..a118e6e8773 100644
--- a/src/server/shared/Logging/Log.h
+++ b/src/server/shared/Logging/Log.h
@@ -35,7 +35,6 @@ class Log
friend class ACE_Singleton<Log, ACE_Thread_Mutex>;
typedef std::unordered_map<std::string, Logger> LoggerMap;
- typedef std::unordered_map<std::string, Logger const*> CachedLoggerContainer;
private:
Log();
@@ -44,7 +43,7 @@ class Log
public:
void LoadFromConfig();
void Close();
- bool ShouldLog(std::string const& type, LogLevel level);
+ bool ShouldLog(std::string const& type, LogLevel level) const;
bool SetLogLevel(std::string const& name, char const* level, bool isLogger = true);
void outMessage(std::string const& f, LogLevel level, char const* str, ...) ATTR_PRINTF(4, 5);
@@ -57,9 +56,9 @@ class Log
private:
static std::string GetTimestampStr();
void vlog(std::string const& f, LogLevel level, char const* str, va_list argptr);
- void write(LogMessage* msg);
+ void write(LogMessage* msg) const;
- Logger const* GetLoggerByType(std::string const& type);
+ Logger const* GetLoggerByType(std::string const& type) const;
Appender* GetAppenderByName(std::string const& name);
uint8 NextAppenderId();
void CreateAppenderFromConfig(std::string const& name);
@@ -69,7 +68,6 @@ class Log
AppenderMap appenders;
LoggerMap loggers;
- CachedLoggerContainer cachedLoggers;
uint8 AppenderId;
std::string m_logsDir;
@@ -78,37 +76,29 @@ class Log
LogWorker* worker;
};
-inline Logger const* Log::GetLoggerByType(std::string const& originalType)
+inline Logger const* Log::GetLoggerByType(std::string const& type) const
{
- // Check if already cached
- CachedLoggerContainer::const_iterator itCached = cachedLoggers.find(originalType);
- if (itCached != cachedLoggers.end())
- return itCached->second;
-
- Logger const* logger = NULL;
- std::string type(originalType);
-
- do
- {
- // Search for the logger "type.subtype"
- LoggerMap::const_iterator it = loggers.find(type);
- if (it == loggers.end())
- {
- // Search for the logger "type", if our logger contains '.', otherwise search for LOGGER_ROOT
- size_t found = type.find_last_of(".");
- type = found != std::string::npos ? type.substr(0, found) : LOGGER_ROOT;
- }
- else
- logger = &(it->second);
- }
- while (!logger);
-
- cachedLoggers[originalType] = logger;
- return logger;
+ LoggerMap::const_iterator it = loggers.find(type);
+ if (it != loggers.end())
+ return &(it->second);
+
+ if (type == LOGGER_ROOT)
+ return NULL;
+
+ std::string parentLogger = LOGGER_ROOT;
+ size_t found = type.find_last_of(".");
+ if (found != std::string::npos)
+ parentLogger = type.substr(0,found);
+
+ return GetLoggerByType(parentLogger);
}
-inline bool Log::ShouldLog(std::string const& type, LogLevel level)
+inline bool Log::ShouldLog(std::string const& type, LogLevel level) const
{
+ // TODO: Use cache to store "Type.sub1.sub2": "Type" equivalence, should
+ // Speed up in cases where requesting "Type.sub1.sub2" but only configured
+ // Logger "Type"
+
Logger const* logger = GetLoggerByType(type);
if (!logger)
return false;
diff --git a/src/server/shared/Packets/ByteBuffer.h b/src/server/shared/Packets/ByteBuffer.h
index bc46b87fa27..dd0a9d5fdf4 100644
--- a/src/server/shared/Packets/ByteBuffer.h
+++ b/src/server/shared/Packets/ByteBuffer.h
@@ -377,9 +377,19 @@ class ByteBuffer
return *this;
}
- uint8 * contents() { return &_storage[0]; }
+ uint8 * contents()
+ {
+ if (_storage.empty())
+ throw ByteBufferException();
+ return &_storage[0];
+ }
- const uint8 *contents() const { return &_storage[0]; }
+ const uint8 *contents() const
+ {
+ if (_storage.empty())
+ throw ByteBufferException();
+ return &_storage[0];
+ }
size_t size() const { return _storage.size(); }
bool empty() const { return _storage.empty(); }
diff --git a/src/tools/mmaps_generator/TerrainBuilder.cpp b/src/tools/mmaps_generator/TerrainBuilder.cpp
index 19112d84266..7832cef18de 100644
--- a/src/tools/mmaps_generator/TerrainBuilder.cpp
+++ b/src/tools/mmaps_generator/TerrainBuilder.cpp
@@ -906,7 +906,7 @@ namespace MMAP
float p0[3], p1[3];
uint32 mid, tx, ty;
float size;
- if (sscanf(buf, "%d %d,%d (%f %f %f) (%f %f %f) %f", &mid, &tx, &ty,
+ if (sscanf(buf, "%u %u,%u (%f %f %f) (%f %f %f) %f", &mid, &tx, &ty,
&p0[0], &p0[1], &p0[2], &p1[0], &p1[1], &p1[2], &size) != 10)
continue;