Merge branch 'master' of github.com:TrinityCore/TrinityCore into 4.3.4

Conflicts:
	src/server/scripts/Commands/cs_misc.cpp
	src/server/scripts/Events/childrens_week.cpp
	src/server/scripts/Kalimdor/boss_azuregos.cpp
	src/server/scripts/Kalimdor/zone_azshara.cpp
	src/server/scripts/Kalimdor/zone_darkshore.cpp
	src/server/scripts/Kalimdor/zone_durotar.cpp
	src/server/scripts/Kalimdor/zone_moonglade.cpp
	src/server/scripts/Kalimdor/zone_mulgore.cpp
	src/server/scripts/Kalimdor/zone_orgrimmar.cpp
	src/server/scripts/Kalimdor/zone_thousand_needles.cpp
	src/server/scripts/Kalimdor/zone_ungoro_crater.cpp
	src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_herald_volazj.cpp
This commit is contained in:
Vincent-Michael
2014-09-06 02:41:45 +02:00
86 changed files with 1604 additions and 664 deletions

View File

@@ -0,0 +1,50 @@
UPDATE `creature_template` SET `InhabitType`=4 WHERE `entry`=23282;
DELETE FROM `smart_scripts` WHERE `entryorguid`=185932 AND `source_type`=1;
INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES
(185932, 1, 0, 1, 62, 0, 100, 0, 8685, 0, 0, 0, 85, 41035, 2, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'Obsidia\'s Egg - On Gossip Option 0 Selected - Invoker Cast 41035 Four Dragons: Force Cast - Obsidia'),
(185932, 1, 1, 0, 61, 0, 100, 0, 0, 0, 0, 0, 72, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'Obsidia\'s Egg - On Gossip Option 0 Selected - Close Gossip');
DELETE FROM `event_scripts` WHERE `id`=15005;
INSERT INTO `event_scripts` (`id`, `delay`, `command`, `datalong`, `datalong2`, `dataint`, `x`, `y`, `z`, `o`) VALUES
(15005, 1, 10, 23364, 100000, 0, 2426.954, 7001.479, 367.3824, 0),
(15005, 0, 10, 23282, 300000, 0, 2424.975, 6933.425, 409.5501, 1.43117);
UPDATE `creature_template` SET `ainame`='SmartAI', `scriptname`='' WHERE `entry` =23364;
DELETE FROM `smart_scripts` WHERE `entryorguid` =23364 AND `source_type`=0;
DELETE FROM `smart_scripts` WHERE `entryorguid` =23282 AND `source_type`=0 AND `id`>4;
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
(23364, 0, 0, 1, 11, 0, 100, 0, 0, 0, 0, 0, 11, 15750, 2, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Black Dragon Whelpling - On Spawn - Cast Rookery Whelp Spawn-in Spell'),
(23364, 0, 1, 2, 61, 0, 100, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Black Dragon Whelpling - On Spawn - Say'),
(23364, 0, 2, 3, 61, 0, 100, 0, 0, 0, 0, 0, 18, 33536, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Black Dragon Whelpling - On Spawn - Set Unit Flags'),
(23364, 0, 3, 4, 61, 0, 100, 0, 0, 0, 0, 0, 70, 300, 0, 0, 0, 0, 0, 14, 27915, 185932, 0, 0, 0, 0, 0, 'Black Dragon Whelpling - On Spawn - Despawn Obsidia\'s Egg'),
(23364, 0, 4, 0, 61, 0, 100, 0, 0, 0, 0, 0, 53, 0, 23364, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Black Dragon Whelpling - On Spawn - Start WP'),
(23364, 0, 5, 6, 40, 0, 100, 0, 2, 23364, 0, 0, 45, 1, 1, 0, 0, 0, 0, 19, 23282, 0, 0, 0, 0, 0, 0, 'Black Dragon Whelpling - On Reached WP2 - Set Data on Obsidia'),
(23364, 0, 6, 0, 61, 0, 100, 0, 0, 0, 0, 0, 41, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Black Dragon Whelpling - Reached WP2 - Despawn'),
(23282, 0, 5, 0, 11, 0, 100, 0, 0, 0, 0, 0, 18, 768, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Obsidia - On Spawn - Set Unit Flags'),
(23282, 0, 6, 7, 38, 0, 100, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Obsidia - On Data Set - Say'),
(23282, 0, 7, 0, 61, 0, 100, 0, 0, 0, 0, 0, 53, 1, 23282, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Obsidia - On Data Set - Start WP'),
(23282, 0, 8, 9, 40, 0, 100, 0, 1, 23282, 0, 0, 94, 280, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Obsidia - On Reached WP1 - Set Dynamic Flags'),
(23282, 0, 9, 10, 61, 0, 100, 0, 0, 0, 0, 0, 19, 768, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Obsidia - On Reached WP1 - Set Unit Flags'),
(23282, 0, 10, 11, 61, 0, 100, 0, 0, 0, 0, 0, 101, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Obsidia - On Reached WP1 - Set Home Position'),
(23282, 0, 11, 0, 61, 0, 100, 0, 0, 0, 0, 0, 8, 2, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Obsidia - On Reached WP1 - Set Aggresive');
DELETE FROM `creature_text` WHERE `entry` IN(23364,23282);
INSERT INTO `creature_text` (`entry`, `groupid`, `id`, `text`, `type`, `language`, `probability`, `emote`, `duration`, `sound`, `comment`, `BroadcastTextID`) VALUES
(23364, 0, 0, 'The %s screams out for its mother.', 16, 0, 100, 0, 0, 431, 'Black Dragon Whelpling',21420),
(23282, 0, 0, 'I believe that I shall feast upon both $r and ogre flesh tonight.', 14, 0, 100, 0, 0, 7274, 'Obsidia',21718);
DELETE FROM `waypoints` WHERE `entry` IN(23364,23282);
INSERT INTO `waypoints` (`entry`, `pointid`, `position_x`, `position_y`, `position_z`, `point_comment`) VALUES
(23364, 1,2425.253, 6994.862, 368.0848, 'Black Dragon Whelpling'),
(23364, 2,2424.881, 6998.754, 367.8495, 'Black Dragon Whelpling'),
(23282, 1,2428.085, 6980.77, 369.7684, 'Obsidia');

View File

@@ -0,0 +1,17 @@
DELETE FROM `smart_scripts` WHERE `source_type`=1 AND `entryorguid` IN (185937,185938,185936);
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
(185937, 1, 0, 1, 62, 0, 100, 0, 8690, 0, 0, 0, 85, 41050, 2, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'Furywing\'s Egg - On Gossip Option 0 Selected - Invoker cast Four Dragons: Force Cast - Furywing'),
(185938, 1, 0, 1, 62, 0, 100, 0, 8691, 0, 0, 0, 85, 41052, 2, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'Insidion\'s Egg - On Gossip Option 0 Selected - Invoker cast Four Dragons: Force Cast - Insidion'),
(185936, 1, 0, 1, 62, 0, 100, 0, 8689, 0, 0, 0, 85, 41044, 2, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'Rivendark\'s Egg - On Gossip Option 0 Selected - Invoker cast Four Dragons: Force Cast - Rivendark'),
(185937, 1, 1, 2, 61, 0, 100, 0, 0, 0, 0, 0, 72, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'Furywing\'s Egg - On Gossip Option 0 Selected - Close Gossip'),
(185938, 1, 1, 2, 61, 0, 100, 0, 0, 0, 0, 0, 72, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'Insidion\'s Egg - On Gossip Option 0 Selected - Close Gossip'),
(185936, 1, 1, 2, 61, 0, 100, 0, 0, 0, 0, 0, 72, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'Rivendark\'s Egg - On Gossip Option 0 Selected - Close Gossip'),
(185937, 1, 2, 0, 61, 0, 100, 0, 0, 0, 0, 0, 70, 300, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Furywing\'s Egg - On Gossip Option 0 Selected - Despawn GO'),
(185938, 1, 2, 0, 61, 0, 100, 0, 0, 0, 0, 0, 70, 300, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Insidion\'s Egg - On Gossip Option 0 Selected - Despawn GO'),
(185936, 1, 2, 0, 61, 0, 100, 0, 0, 0, 0, 0, 70, 300, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Rivendark\'s Egg - On Gossip Option 0 Selected - Despawn GO');
DELETE FROM `event_scripts` WHERE `id` IN(15004,15002);
INSERT INTO `event_scripts` (`id`, `delay`, `command`, `datalong`, `datalong2`, `dataint`, `x`, `y`, `z`, `o`) VALUES
(15004, 0, 10, 23061, 300000, 0, 2060.6, 7418.53, 391.098, 0),
(15002, 0, 10, 23281, 300000, 0, 4176.5, 5452.21, 291.923, 0),
(15003, 0, 10, 23261, 300000, 0, 3845.31, 5220.04, 295.412, 0);

View File

@@ -0,0 +1,5 @@
-- Implements in-game gm message when tickets are completed
SET @LANG_COMMAND_TICKETCOMPLETED := 2030;
DELETE FROM `trinity_string` WHERE `entry` = @LANG_COMMAND_TICKETCOMPLETED;
INSERT INTO `trinity_string` (`entry`, `content_default`) VALUES (@LANG_COMMAND_TICKETCOMPLETED, '|cff00ff00Completed by|r:|cff00ccff %s|r');

View File

@@ -0,0 +1,11 @@
-- Move cs_misc command output hardcoded strings to DB so they can be localized too
DELETE FROM `trinity_string` WHERE `entry` IN (5030,5035,5039,5040,5041,5042,5043,5044);
INSERT INTO `trinity_string` (`entry`, `content_default`) VALUES
(5030, '<unauthorized>'),
(5035, 'No reason'),
(5039, 'Console'),
(5040, 'Character'),
(5041, 'Permanently'),
(5042, 'You are outdoors'),
(5043, 'You are indoors'),
(5044, 'no VMAP available for area info');

View File

@@ -0,0 +1,2 @@
UPDATE creature_template SET InhabitType = 5 WHERE entry = 10184;
UPDATE creature_template SET InhabitType = 5 WHERE entry = 36538;

View File

@@ -0,0 +1,129 @@
SET @OGUID := 21036;
-- respawn Fel Crystal Prism (Currently only 1 is spawned)
DELETE FROM `gameobject` WHERE `id`=185927;
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, 185927, 530, 1, 1, 2909.894, 6797.157, 365.7202, 2.391098, 0, 0, 0, 1, 120, 255, 1),
(@OGUID+1, 185927, 530, 1, 1, 2988.61, 7129.965, 368.9746, 1.029743, 0, 0, 0, 1, 120, 255, 1),
(@OGUID+2, 185927, 530, 1, 1, 3080.931, 6914.941, 369.3258, 4.32842, 0, 0, 0, 1, 120, 255, 1),
(@OGUID+3, 185927, 530, 1, 1, 2810.343, 7006.054, 376.0882, 1.151916, 0, 0, 0, 1, 120, 255, 1),
(@OGUID+4, 185927, 530, 1, 1, 1385.925, 7392.285, 371.1215, 0.5585039, 0, 0, 0, 1, 120, 255, 1),
(@OGUID+5, 185927, 530, 1, 1, 1280.611, 7164.499, 377.1786, 5.585054, 0, 0, 0, 1, 120, 255, 1),
(@OGUID+6, 185927, 530, 1, 1, 1616.641, 7207.047, 375.4805, 5.131269, 0, 0, 0, 1, 120, 255, 1),
(@OGUID+9, 185927, 530, 1, 1, 1673.486, 7377.358, 375.558, 1.308995, 0, 0, 0, 1, 120, 255, 1);
-- SAI for Fel Crystal Prism
UPDATE `gameobject_template` SET `AIName`='SmartGameObjectAI' WHERE `entry`=185927;
DELETE FROM `smart_scripts` WHERE `entryorguid`=185927 AND `source_type`=1;
DELETE FROM `smart_scripts` WHERE `entryorguid` BETWEEN 18592700 AND 18592703 AND `source_type`=9;
INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES
(185927, 1, 0, 1, 62, 0, 100, 0, 8671, 0, 0, 0, 64, 1, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'Fel Crystal Prism - On Gossip Option 0 Selected - Store Targetlist'),
(185927, 1, 1, 2, 61, 0, 100, 0, 0, 0, 0, 0, 85, 40958, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'Fel Crystal Prism - On Gossip Option 0 Selected - Invoker Cast Blades Edge Terrace Demon Boss Summon Trigger'),
(185927, 1, 2, 3, 61, 0, 100, 0, 0, 0, 0, 0, 85, 40962, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'Fel Crystal Prism - On Gossip Option 0 Selected - Invoker Cast Blades Edge Terrace Demon Boss Summon Branch'),
(185927, 1, 3, 0, 61, 0, 100, 0, 0, 0, 0, 0, 87, 18592700, 18592701, 18592702, 18592703, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Fel Crystal Prism - On Gossip Option 0 Selected - Run Random Timed Action list'),
(18592700, 9, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 85, 40957, 0, 0, 0, 0, 0, 12, 1, 0, 0, 0, 0, 0, 0, 'Fel Crystal Prism - Script 1 - Invoker Cast Blades Edge Terrace Demon Boss Summon 1'),
(18592700, 9, 1, 0, 0, 0, 100, 0, 0, 0, 0, 0, 70, 300, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Fel Crystal Prism - Script 1 - Despawn GO'),
(18592700, 9, 2, 0, 0, 0, 100, 0, 0, 0, 0, 0, 72, 0, 0, 0, 0, 0, 0, 12, 1, 0, 0, 0, 0, 0, 0, 'Fel Crystal Prism - Script 1 - Close Gossip'),
(18592701, 9, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 85, 40959, 0, 0, 0, 0, 0, 12, 1, 0, 0, 0, 0, 0, 0, 'Fel Crystal Prism - Script 2 - Invoker Cast Blades Edge Terrace Demon Boss Summon 2'),
(18592701, 9, 1, 0, 0, 0, 100, 0, 0, 0, 0, 0, 70, 300, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Fel Crystal Prism - Script 2 - Despawn GO'),
(18592701, 9, 2, 0, 0, 0, 100, 0, 0, 0, 0, 0, 72, 0, 0, 0, 0, 0, 0, 12, 1, 0, 0, 0, 0, 0, 0, 'Fel Crystal Prism - Script 2 - Close Gossip'),
(18592702, 9, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 85, 40960, 0, 0, 0, 0, 0, 12, 1, 0, 0, 0, 0, 0, 0, 'Fel Crystal Prism - Script 3 - Invoker Cast Blades Edge Terrace Demon Boss Summon 3'),
(18592702, 9, 1, 0, 0, 0, 100, 0, 0, 0, 0, 0, 70, 300, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Fel Crystal Prism - Script 3 - Despawn GO'),
(18592702, 9, 2, 0, 0, 0, 100, 0, 0, 0, 0, 0, 72, 0, 0, 0, 0, 0, 0, 12, 1, 0, 0, 0, 0, 0, 0, 'Fel Crystal Prism - Script 3 - Close Gossip'),
(18592703, 9, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 85, 40961, 0, 0, 0, 0, 0, 12, 1, 0, 0, 0, 0, 0, 0, 'Fel Crystal Prism - Script 4 - Invoker Cast Blades Edge Terrace Demon Boss Summon 4'),
(18592703, 9, 1, 0, 0, 0, 100, 0, 0, 0, 0, 0, 70, 300, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Fel Crystal Prism - Script 4 - Despawn GO'),
(18592703, 9, 2, 0, 0, 0, 100, 0, 0, 0, 0, 0, 72, 0, 0, 0, 0, 0, 0, 12, 1, 0, 0, 0, 0, 0, 0, 'Fel Crystal Prism - Script 4 - Close Gossip');
-- SAI for Demons
DELETE FROM `smart_scripts` WHERE `entryorguid` IN(22281,23353,23354,23355) AND `source_type`=0;
UPDATE `creature_template` SET `AIName`='SmartAI' WHERE `entry` IN(22281,23353,23354,23355);
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
(22281,0,0,0,11,0,100,0,0,0,0,0,2,14,0,0,0,0,0,1,0,0,0,0,0,0,0,'Galvanoth - On Spawn - Set Faction'),
(22281,0,1,0,9,0,100,0,0,30,8000,11000,11,39139,0,0,0,0,0,7,0,0,0,0,0,0,0,'Galvanoth - On Range - Cast Fel Flamestike'),
(22281,0,2,0,9,0,100,0,0,10,13000,23000,11,38750,0,0,0,0,0,1,0,0,0,0,0,0,0,'Galvanoth - On Range - Cast War Stomp'),
(22281,0,3,0,9,0,100,0,0,5,11000,18000,11,15708,0,0,0,0,0,7,0,0,0,0,0,0,0,'Galvanoth - On Range - Cast Mortal Strike'),
(23353,0,0,0,11,0,100,0,0,0,0,0,2,14,0,0,0,0,0,1,0,0,0,0,0,0,0,'Braxxus - On Spawn - Set Faction'),
(23353,0,1,0,9,0,100,0,0,5,4000,8000,11,41437,0,0,0,0,0,7,0,0,0,0,0,0,0,'Braxxus - On Range - Cast Double Breath'),
(23353,0,2,0,9,0,100,0,0,10,15000,25000,11,41439,2,0,0,0,0,7,0,0,0,0,0,0,0,'Braxxus - On Range - Cast Mangle'),
(23353,0,3,0,0,0,100,0,5000,8000,7000,11000,11,41436,0,0,0,0,0,1,0,0,0,0,0,0,0,'Braxxus - IC - Cast Panic'),
(23354,0,0,0,11,0,100,0,0,0,0,0,2,14,0,0,0,0,0,1,0,0,0,0,0,0,0,'Mo arg Incinerator - On Spawn - Set Faction'),
(23354,0,1,0,9,0,100,0,0,40,5000,8000,11,44431,0,0,0,0,0,7,0,0,0,0,0,0,0,'Mo arg Incinerator - On Range - Cast Acid Geyser'),
(23354,0,2,0,9,0,100,0,10,60,10000,15000,11,36606,0,0,0,0,0,7,0,0,0,0,0,0,0,'Mo arg Incinerator - On Range - Cast Mighty Charge'),
(23354,0,3,0,9,0,100,0,0,5,15000,25000,11,25174,2,0,0,0,0,7,0,0,0,0,0,0,0,'Mo arg Incinerator - On Range - Cast Sundering Cleave'),
(23355,0,0,0,11,0,100,0,0,0,0,0,2,14,0,0,0,0,0,1,0,0,0,0,0,0,0,'Zarcsin - On Spawn - Set Faction'),
(23355,0,1,0,9,0,100,0,0,5,5000,8000,11,41444,0,0,0,0,0,7,0,0,0,0,0,0,0,'Zarcsin - On Range - Cast Fel Flames'),
(23355,0,2,0,2,0,100,1,0,50,5000,8000,11,41447,0,0,0,0,0,1,0,0,0,0,0,0,0,'Zarcsin - 50% HP - Cast Enrage');
-- ALL 4 of these should have 100% chance to drop an apexis crystal, this is rolled if in party
UPDATE `creature_loot_template` SET `ChanceOrQuestChance`=100 WHERE `entry`IN(22281,23353,23354,23355) AND `item`=32572;
-- Fel Whip to complete quest is meant to have 100% chance to drop if on quest as all comments state you only have to kill 1 demon to complete the quest
UPDATE `creature_loot_template` SET `ChanceOrQuestChance`=-100 WHERE `entry`IN(22281,23353,23354,23355) AND `item`=32733;
DELETE FROM `smart_scripts` WHERE `source_type`=1 AND `entryorguid` IN (185937,185938,185936,185932);
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
(185937, 1, 0, 1, 62, 0, 100, 0, 8690, 0, 0, 0, 85, 41050, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'Furywing\'s Egg - On Gossip Option 0 Selected - Invoker cast Four Dragons: Force Cast - Furywing'),
(185938, 1, 0, 1, 62, 0, 100, 0, 8691, 0, 0, 0, 85, 41052, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'Insidion\'s Egg - On Gossip Option 0 Selected - Invoker cast Four Dragons: Force Cast - Insidion'),
(185936, 1, 0, 1, 62, 0, 100, 0, 8689, 0, 0, 0, 85, 41044, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'Rivendark\'s Egg - On Gossip Option 0 Selected - Invoker cast Four Dragons: Force Cast - Rivendark'),
(185937, 1, 1, 2, 61, 0, 100, 0, 0, 0, 0, 0, 85, 41049, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'Furywing\'s Egg - On Gossip Option 0 Selected - Invoker Cast Four Dragons: Reagents - Furywing'),
(185938, 1, 1, 2, 61, 0, 100, 0, 0, 0, 0, 0, 85, 41051, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'Insidion\'s Egg - On Gossip Option 0 Selected - Invoker Cast Four Dragons: Reagents - Insidion'),
(185936, 1, 1, 2, 61, 0, 100, 0, 0, 0, 0, 0, 85, 41045, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'Rivendark\'s Egg - On Gossip Option 0 Selected - Invoker Cast Four Dragons: Reagents - Rivendark'),
(185937, 1, 2, 3, 61, 0, 100, 0, 0, 0, 0, 0, 72, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'Furywing\'s Egg - On Gossip Option 0 Selected - Close Gossip'),
(185938, 1, 2, 3, 61, 0, 100, 0, 0, 0, 0, 0, 72, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'Insidion\'s Egg - On Gossip Option 0 Selected - Close Gossip'),
(185936, 1, 2, 3, 61, 0, 100, 0, 0, 0, 0, 0, 72, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'Rivendark\'s Egg - On Gossip Option 0 Selected - Close Gossip'),
(185937, 1, 3, 0, 61, 0, 100, 0, 0, 0, 0, 0, 70, 300, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Furywing\'s Egg - On Gossip Option 0 Selected - Despawn GO'),
(185938, 1, 3, 0, 61, 0, 100, 0, 0, 0, 0, 0, 70, 300, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Insidion\'s Egg - On Gossip Option 0 Selected - Despawn GO'),
(185936, 1, 3, 0, 61, 0, 100, 0, 0, 0, 0, 0, 70, 300, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Rivendark\'s Egg - On Gossip Option 0 Selected - Despawn GO'),
(185932, 1, 0, 1, 62, 0, 100, 0, 8685, 0, 0, 0, 85, 41035, 2, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'Obsidia\'s Egg - On Gossip Option 0 Selected - Invoker Cast 41035 Four Dragons: Force Cast - Obsidia'),
(185932, 1, 1, 2, 61, 0, 100, 0, 0, 0, 0, 0, 85, 41036, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'Obsidia\'s Egg - On Gossip Option 0 Selected - Invoker Cast Four Dragons: Reagents - Obsidia'),
(185932, 1, 2, 0, 61, 0, 100, 0, 0, 0, 0, 0, 72, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'Obsidia\'s Egg - On Gossip Option 0 Selected - Close Gossip');
DELETE FROM `event_scripts` WHERE `id` IN(15004,15002);
INSERT INTO `event_scripts` (`id`, `delay`, `command`, `datalong`, `datalong2`, `dataint`, `x`, `y`, `z`, `o`) VALUES
(15004, 0, 10, 23061, 300000, 0, 2060.6, 7418.53, 391.098, 0),
(15002, 0, 10, 23281, 300000, 0, 4176.5, 5452.21, 291.923, 0),
(15003, 0, 10, 23261, 300000, 0, 3845.31, 5220.04, 295.412, 0);
UPDATE `creature_template` SET `InhabitType`=4 WHERE `entry`=23282;
UPDATE `creature_template` SET `ainame`='SmartAI', `scriptname`='' WHERE `entry` =23364;
DELETE FROM `smart_scripts` WHERE `entryorguid` =23364 AND `source_type`=0;
DELETE FROM `smart_scripts` WHERE `entryorguid` =23282 AND `source_type`=0 AND `id`>4;
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
(23364, 0, 0, 1, 11, 0, 100, 0, 0, 0, 0, 0, 11, 15750, 2, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Black Dragon Whelpling - On Spawn - Cast Rookery Whelp Spawn-in Spell'),
(23364, 0, 1, 2, 61, 0, 100, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Black Dragon Whelpling - On Spawn - Say'),
(23364, 0, 2, 3, 61, 0, 100, 0, 0, 0, 0, 0, 18, 33536, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Black Dragon Whelpling - On Spawn - Set Unit Flags'),
(23364, 0, 3, 4, 61, 0, 100, 0, 0, 0, 0, 0, 70, 300, 0, 0, 0, 0, 0, 14, 27915, 185932, 0, 0, 0, 0, 0, 'Black Dragon Whelpling - On Spawn - Despawn Obsidia\'s Egg'),
(23364, 0, 4, 0, 61, 0, 100, 0, 0, 0, 0, 0, 53, 0, 23364, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Black Dragon Whelpling - On Spawn - Start WP'),
(23364, 0, 5, 6, 40, 0, 100, 0, 2, 23364, 0, 0, 45, 1, 1, 0, 0, 0, 0, 19, 23282, 0, 0, 0, 0, 0, 0, 'Black Dragon Whelpling - On Reached WP2 - Set Data on Obsidia'),
(23364, 0, 6, 0, 61, 0, 100, 0, 0, 0, 0, 0, 41, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Black Dragon Whelpling - Reached WP2 - Despawn'),
(23282, 0, 5, 0, 11, 0, 100, 0, 0, 0, 0, 0, 18, 768, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Obsidia - On Spawn - Set Unit Flags'),
(23282, 0, 6, 7, 38, 0, 100, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Obsidia - On Data Set - Say'),
(23282, 0, 7, 0, 61, 0, 100, 0, 0, 0, 0, 0, 53, 1, 23282, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Obsidia - On Data Set - Start WP'),
(23282, 0, 8, 9, 40, 0, 100, 0, 1, 23282, 0, 0, 94, 280, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Obsidia - On Reached WP1 - Set Dynamic Flags'),
(23282, 0, 9, 10, 61, 0, 100, 0, 0, 0, 0, 0, 19, 768, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Obsidia - On Reached WP1 - Set Unit Flags'),
(23282, 0, 10, 11, 61, 0, 100, 0, 0, 0, 0, 0, 101, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Obsidia - On Reached WP1 - Set Home Position'),
(23282, 0, 11, 0, 61, 0, 100, 0, 0, 0, 0, 0, 8, 2, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Obsidia - On Reached WP1 - Set Aggresive');
DELETE FROM `creature_text` WHERE `entry` IN(23364,23282);
INSERT INTO `creature_text` (`entry`, `groupid`, `id`, `text`, `type`, `language`, `probability`, `emote`, `duration`, `sound`, `comment`, `BroadcastTextID`) VALUES
(23364, 0, 0, 'The %s screams out for its mother.', 16, 0, 100, 0, 0, 431, 'Black Dragon Whelpling',21420),
(23282, 0, 0, 'I believe that I shall feast upon both $r and ogre flesh tonight.', 14, 0, 100, 0, 0, 7274, 'Obsidia',21718);
DELETE FROM `waypoints` WHERE `entry` IN(23364,23282);
INSERT INTO `waypoints` (`entry`, `pointid`, `position_x`, `position_y`, `position_z`, `point_comment`) VALUES
(23364, 1,2425.253, 6994.862, 368.0848, 'Black Dragon Whelpling'),
(23364, 2,2424.881, 6998.754, 367.8495, 'Black Dragon Whelpling'),
(23282, 1,2428.085, 6980.77, 369.7684, 'Obsidia');
DELETE FROM `event_scripts` WHERE `id` IN(15004,15002,15003,15005);
INSERT INTO `event_scripts` (`id`, `delay`, `command`, `datalong`, `datalong2`, `dataint`, `x`, `y`, `z`, `o`) VALUES
(15004, 0, 10, 23061, 300000, 0, 2060.6, 7418.53, 391.098, 0),
(15002, 0, 10, 23281, 300000, 0, 4176.5, 5452.21, 291.923, 0),
(15003, 0, 10, 23261, 300000, 0, 3845.31, 5220.04, 295.412, 0),
(15005, 1, 10, 23364, 100000, 0, 2426.954, 7001.479, 367.3824, 0),
(15005, 0, 10, 23282, 300000, 0, 2424.975, 6933.425, 409.5501, 1.43117);

View File

@@ -0,0 +1,4 @@
UPDATE `creature_template` SET `dynamicflags`=`dynamicflags` &~ 1; -- lootable
UPDATE `creature_template` SET `dynamicflags`=`dynamicflags` &~ 4; -- tapped
UPDATE `creature_template` SET `dynamicflags`=`dynamicflags` &~ 8; -- tapped by player
UPDATE `creature_template` SET `dynamicflags`=`dynamicflags` &~ 128; -- tapped by threat list

View File

@@ -0,0 +1 @@
UPDATE `creature_template` SET `HoverHeight`=1 WHERE `entry`=33273; -- Maiden of Drak'Mar

View File

@@ -34,6 +34,7 @@
#include "GameObjectAI.h"
#include "SpellAuraEffects.h"
#include "Player.h"
#include "Config.h"
void WorldSession::HandleClientCastFlags(WorldPacket& recvPacket, uint8 castFlags, SpellCastTargets& targets)
{
@@ -481,6 +482,25 @@ void WorldSession::HandleCancelAuraOpcode(WorldPacket& recvPacket)
// maybe should only remove one buff when there are multiple?
_player->RemoveOwnedAura(spellId, 0, 0, AURA_REMOVE_BY_CANCEL);
// If spell being removed is a resource tracker, see if player was tracking both (herbs / minerals) and remove the other
if (sWorld->getBoolConfig(CONFIG_ALLOW_TRACK_BOTH_RESOURCES) && spellInfo->HasAura(SPELL_AURA_TRACK_RESOURCES))
{
Unit::AuraEffectList const& auraEffects = _player->GetAuraEffectsByType(SPELL_AURA_TRACK_RESOURCES);
if (!auraEffects.empty())
{
// Build list of spell IDs to cancel. Trying to cancel the aura while iterating
// over AuraEffectList caused "incompatible iterator" errors on second pass
std::list<uint32> spellIDs;
for (Unit::AuraEffectList::const_iterator auraEffect = auraEffects.begin(); auraEffect != auraEffects.end(); auraEffect++)
spellIDs.push_back((*auraEffect)->GetId());
// Remove all auras related to resource tracking (only Herbs and Minerals in 3.3.5a)
for (std::list<uint32>::iterator it = spellIDs.begin(); it != spellIDs.end(); it++)
_player->RemoveOwnedAura(*it, 0, 0, AURA_REMOVE_BY_CANCEL);
}
}
}
void WorldSession::HandlePetCancelAuraOpcode(WorldPacket& recvPacket)

View File

@@ -412,8 +412,8 @@ enum TrinityStrings
LANG_BANINFO_HISTORYENTRY = 418,
LANG_BANINFO_INFINITE = 419,
LANG_BANINFO_NEVER = 420,
LANG_BANINFO_YES = 421,
LANG_BANINFO_NO = 422,
LANG_YES = 421,
LANG_NO = 422,
LANG_BANINFO_IPENTRY = 423,
LANG_BANLIST_NOIP = 424,
@@ -1024,7 +1024,7 @@ enum TrinityStrings
LANG_BG_AV_START_TWO_MINUTES = 1333,
// FREE IDS 1334-1999
// Ticket Strings 2000-2029
// Ticket Strings 2000-2030
LANG_COMMAND_TICKETNEW = 2000,
LANG_COMMAND_TICKETUPDATED = 2001,
LANG_COMMAND_TICKETPLAYERABANDON = 2002,
@@ -1055,6 +1055,7 @@ enum TrinityStrings
LANG_COMMAND_TICKETPENDING = 2027,
LANG_COMMAND_TICKETRESET = 2028,
LANG_COMMAND_TICKETLISTRESPONSE = 2029,
LANG_COMMAND_TICKETCOMPLETED = 2030,
// Trinity strings 5000-9999
LANG_COMMAND_FREEZE = 5000,
@@ -1088,16 +1089,22 @@ enum TrinityStrings
LANG_GOINFO_NAME = 5027,
LANG_GOINFO_LOOTID = 5028,
LANG_COMMAND_LOOKUP_MAX_RESULTS = 5029,
// unused = 5030,
LANG_UNAUTHORIZED = 5030,
LANG_NPCINFO_AIINFO = 5031,
LANG_COMMAND_NO_BATTLEGROUND_FOUND = 5032,
LANG_COMMAND_NO_ACHIEVEMENT_CRITERIA_FOUND = 5033,
LANG_COMMAND_NO_OUTDOOR_PVP_FORUND = 5034,
// unused = 5035,
LANG_NO_REASON = 5035,
LANG_NPCINFO_EQUIPMENT = 5036,
LANG_NPCINFO_MECHANIC_IMMUNE = 5037,
LANG_NPCINFO_UNIT_FIELD_FLAGS = 5038,
// Room for more Trinity strings 5039-9999
LANG_CONSOLE = 5039,
LANG_CHARACTER = 5040,
LANG_PERMANENTLY = 5041,
LANG_GPS_POSITION_OUTDOORS = 5042,
LANG_GPS_POSITION_INDOORS = 5043,
LANG_GPS_NO_VMAP = 5044,
// Room for more Trinity strings 5045-9999
// Level requirement notifications
LANG_SAY_REQ = 6604,

View File

@@ -35,6 +35,7 @@
#include "ScriptMgr.h"
#include "SpellScript.h"
#include "Vehicle.h"
#include "Config.h"
AuraApplication::AuraApplication(Unit* target, Unit* caster, Aura* aura, uint8 effMask):
_target(target), _base(aura), _removeMode(AURA_REMOVE_NONE), _slot(MAX_AURAS),
@@ -1613,6 +1614,15 @@ bool Aura::CanStackWith(Aura const* existingAura) const
return true;
}
// Check for custom server setting to allow tracking both Herbs and Minerals
// Note: The following are client limitations and cannot be coded for:
// * The minimap tracking icon will display whichever skill is activated second
// * The minimap tracking list will only show a check mark next to the last skill activated
// Sometimes this bugs out and doesn't switch the check mark. It has no effect on the actual tracking though.
// * The minimap dots are yellow for both resources
if (m_spellInfo->HasAura(SPELL_AURA_TRACK_RESOURCES) && existingSpellInfo->HasAura(SPELL_AURA_TRACK_RESOURCES))
return sWorld->getBoolConfig(CONFIG_ALLOW_TRACK_BOTH_RESOURCES);
// check spell specific stack rules
if (m_spellInfo->IsAuraExclusiveBySpecificWith(existingSpellInfo)
|| (sameCaster && m_spellInfo->IsAuraExclusiveBySpecificPerCasterWith(existingSpellInfo)))

View File

@@ -184,7 +184,7 @@ std::string GmTicket::FormatMessageString(ChatHandler& handler, bool detailed) c
return ss.str();
}
std::string GmTicket::FormatMessageString(ChatHandler& handler, const char* szClosedName, const char* szAssignedToName, const char* szUnassignedName, const char* szDeletedName) const
std::string GmTicket::FormatMessageString(ChatHandler& handler, const char* szClosedName, const char* szAssignedToName, const char* szUnassignedName, const char* szDeletedName, const char* szCompletedName) const
{
std::stringstream ss;
ss << handler.PGetParseString(LANG_COMMAND_TICKETLISTGUID, _id);
@@ -197,6 +197,8 @@ std::string GmTicket::FormatMessageString(ChatHandler& handler, const char* szCl
ss << handler.PGetParseString(LANG_COMMAND_TICKETLISTUNASSIGNED, szUnassignedName);
if (szDeletedName)
ss << handler.PGetParseString(LANG_COMMAND_TICKETDELETED, szDeletedName);
if (szCompletedName)
ss << handler.PGetParseString(LANG_COMMAND_TICKETCOMPLETED, szCompletedName);
return ss.str();
}

View File

@@ -142,7 +142,7 @@ public:
void TeleportTo(Player* player) const;
std::string FormatMessageString(ChatHandler& handler, bool detailed = false) const;
std::string FormatMessageString(ChatHandler& handler, const char* szClosedName, const char* szAssignedToName, const char* szUnassignedName, const char* szDeletedName) const;
std::string FormatMessageString(ChatHandler& handler, const char* szClosedName, const char* szAssignedToName, const char* szUnassignedName, const char* szDeletedName, const char* szCompletedName) const;
void SetChatLog(std::list<uint32> time, std::string const& log);
std::string const& GetChatLog() const { return _chatLog; }

View File

@@ -1204,6 +1204,7 @@ void World::LoadConfigSettings(bool reload)
if (m_int_configs[CONFIG_PVP_TOKEN_COUNT] < 1)
m_int_configs[CONFIG_PVP_TOKEN_COUNT] = 1;
m_bool_configs[CONFIG_ALLOW_TRACK_BOTH_RESOURCES] = sConfigMgr->GetBoolDefault("AllowTrackBothResources", false);
m_bool_configs[CONFIG_NO_RESET_TALENT_COST] = sConfigMgr->GetBoolDefault("NoResetTalentsCost", false);
m_bool_configs[CONFIG_SHOW_KICK_IN_WORLD] = sConfigMgr->GetBoolDefault("ShowKickInWorld", false);
m_bool_configs[CONFIG_SHOW_MUTE_IN_WORLD] = sConfigMgr->GetBoolDefault("ShowMuteInWorld", false);

View File

@@ -164,6 +164,7 @@ enum WorldBoolConfigs
CONFIG_STATS_LIMITS_ENABLE,
CONFIG_INSTANCES_RESET_ANNOUNCE,
CONFIG_IP_BASED_ACTION_LOGGING,
CONFIG_ALLOW_TRACK_BOTH_RESOURCES,
BOOL_CONFIG_VALUE_COUNT
};

View File

@@ -287,7 +287,7 @@ public:
bool permanent = (fields[1].GetUInt64() == uint64(0));
std::string banTime = permanent ? handler->GetTrinityString(LANG_BANINFO_INFINITE) : secsToTimeString(fields[1].GetUInt64(), true);
handler->PSendSysMessage(LANG_BANINFO_HISTORYENTRY,
fields[0].GetCString(), banTime.c_str(), active ? handler->GetTrinityString(LANG_BANINFO_YES) : handler->GetTrinityString(LANG_BANINFO_NO), fields[4].GetCString(), fields[5].GetCString());
fields[0].GetCString(), banTime.c_str(), active ? handler->GetTrinityString(LANG_YES) : handler->GetTrinityString(LANG_NO), fields[4].GetCString(), fields[5].GetCString());
}
while (result->NextRow());
@@ -340,7 +340,7 @@ public:
bool permanent = (fields[1].GetUInt32() == uint32(0));
std::string banTime = permanent ? handler->GetTrinityString(LANG_BANINFO_INFINITE) : secsToTimeString(fields[1].GetUInt32(), true);
handler->PSendSysMessage(LANG_BANINFO_HISTORYENTRY,
fields[0].GetCString(), banTime.c_str(), active ? handler->GetTrinityString(LANG_BANINFO_YES) : handler->GetTrinityString(LANG_BANINFO_NO), fields[4].GetCString(), fields[5].GetCString());
fields[0].GetCString(), banTime.c_str(), active ? handler->GetTrinityString(LANG_YES) : handler->GetTrinityString(LANG_NO), fields[4].GetCString(), fields[5].GetCString());
}
while (result->NextRow());

View File

@@ -191,17 +191,17 @@ public:
if (haveVMap)
{
if (map->IsOutdoors(object->GetPositionX(), object->GetPositionY(), object->GetPositionZ()))
handler->PSendSysMessage("You are outdoors");
handler->PSendSysMessage(LANG_GPS_POSITION_OUTDOORS);
else
handler->PSendSysMessage("You are indoors");
handler->PSendSysMessage(LANG_GPS_POSITION_INDOORS);
}
else
handler->PSendSysMessage("no VMAP available for area info");
handler->PSendSysMessage(LANG_GPS_NO_VMAP);
handler->PSendSysMessage(LANG_MAP_POSITION,
mapId, (mapEntry ? mapEntry->name : "<unknown>"),
zoneId, (zoneEntry ? zoneEntry->area_name : "<unknown>"),
areaId, (areaEntry ? areaEntry->area_name : "<unknown>"),
mapId, (mapEntry ? mapEntry->name : handler->GetTrinityString(LANG_UNKNOWN)),
zoneId, (zoneEntry ? zoneEntry->area_name : handler->GetTrinityString(LANG_UNKNOWN)),
areaId, (areaEntry ? areaEntry->area_name : handler->GetTrinityString(LANG_UNKNOWN)),
object->GetPhaseMask(),
object->GetPositionX(), object->GetPositionY(), object->GetPositionZ(), object->GetOrientation(),
cell.GridX(), cell.GridY(), cell.CellX(), cell.CellY(), object->GetInstanceId(),
@@ -809,7 +809,7 @@ public:
if (handler->HasLowerSecurity(target, 0))
return false;
std::string kickReasonStr = "No reason";
std::string kickReasonStr = handler->GetTrinityString(LANG_NO_REASON);
if (*args != '\0')
{
char const* kickReason = strtok(NULL, "\r");
@@ -1442,22 +1442,22 @@ public:
std::string lastLogin = handler->GetTrinityString(LANG_ERROR);
uint32 failedLogins = 0;
uint32 latency = 0;
std::string OS = "None";
std::string OS = handler->GetTrinityString(LANG_UNKNOWN);
// Mute data print variables
int64 muteTime = -1;
std::string muteReason = "unknown";
std::string muteBy = "unknown";
std::string muteReason = handler->GetTrinityString(LANG_NO_REASON);
std::string muteBy = handler->GetTrinityString(LANG_UNKNOWN);
// Ban data print variables
int64 banTime = -1;
std::string banType = "None";
std::string banReason = "Unknown";
std::string bannedBy = "Unknown";
std::string banType = handler->GetTrinityString(LANG_UNKNOWN);
std::string banReason = handler->GetTrinityString(LANG_NO_REASON);
std::string bannedBy = handler->GetTrinityString(LANG_UNKNOWN);
// Character data print variables
uint8 raceid, classid = 0; //RACE_NONE, CLASS_NONE
std::string raceStr, classStr = "None";
std::string raceStr, classStr = handler->GetTrinityString(LANG_UNKNOWN);
uint8 gender = 0;
int8 locale = handler->GetSessionDbcLocale();
uint32 totalPlayerTime = 0;
@@ -1471,8 +1471,8 @@ public:
uint32 mapId;
uint32 areaId;
uint32 phase = 0;
std::string areaName = "<unknown>";
std::string zoneName = "<unknown>";
std::string areaName = handler->GetTrinityString(LANG_UNKNOWN);
std::string zoneName = handler->GetTrinityString(LANG_UNKNOWN);
// Guild data print variables defined so that they exist, but are not necessarily used
uint32 guildId = 0;
@@ -1500,7 +1500,7 @@ public:
muteTime = target->GetSession()->m_muteTime;
mapId = target->GetMapId();
areaId = target->GetAreaId();
alive = target->IsAlive() ? "Yes" : "No";
alive = target->IsAlive() ? handler->GetTrinityString(LANG_YES) : handler->GetTrinityString(LANG_NO);
gender = target->getGender();
phase = target->GetPhaseMask();
}
@@ -1533,9 +1533,9 @@ public:
uint32 playerFlags = fields[10].GetUInt32();
if (!health || playerFlags & PLAYER_FLAGS_GHOST)
alive = "No";
alive = handler->GetTrinityString(LANG_NO);
else
alive = "Yes";
alive = handler->GetTrinityString(LANG_YES);
}
// Query the prepared statement for login data
@@ -1575,9 +1575,10 @@ public:
}
else
{
eMail = "Unauthorized";
lastIp = "Unauthorized";
lastLogin = "Unauthorized";
eMail = handler->GetTrinityString(LANG_UNAUTHORIZED);
regMail = handler->GetTrinityString(LANG_UNAUTHORIZED);
lastIp = handler->GetTrinityString(LANG_UNAUTHORIZED);
lastLogin = handler->GetTrinityString(LANG_UNAUTHORIZED);
}
muteTime = fields[6].GetUInt64();
muteReason = fields[7].GetString();
@@ -1596,7 +1597,7 @@ public:
PreparedQueryResult result2 = LoginDatabase.Query(stmt2);
if (!result2)
{
banType = "Character";
banType = handler->GetTrinityString(LANG_CHARACTER);
stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_PINFO_BANS);
stmt->setUInt32(0, lowguid);
result2 = CharacterDatabase.Query(stmt);
@@ -1653,7 +1654,7 @@ public:
// Output III. LANG_PINFO_BANNED if ban exists and is applied
if (banTime >= 0)
handler->PSendSysMessage(LANG_PINFO_BANNED, banType.c_str(), banReason.c_str(), banTime > 0 ? secsToTimeString(banTime - time(NULL), true).c_str() : "permanently", bannedBy.c_str());
handler->PSendSysMessage(LANG_PINFO_BANNED, banType.c_str(), banReason.c_str(), banTime > 0 ? secsToTimeString(banTime - time(NULL), true).c_str() : handler->GetTrinityString(LANG_PERMANENTLY), bannedBy.c_str());
// Output IV. LANG_PINFO_MUTED if mute is applied
if (muteTime > 0)
@@ -1672,7 +1673,7 @@ public:
handler->PSendSysMessage(LANG_PINFO_ACC_REGMAILS, regMail.c_str(), eMail.c_str());
// Output IX. LANG_PINFO_ACC_IP
handler->PSendSysMessage(LANG_PINFO_ACC_IP, lastIp.c_str(), locked ? "Yes" : "No");
handler->PSendSysMessage(LANG_PINFO_ACC_IP, lastIp.c_str(), locked ? handler->GetTrinityString(LANG_YES) : handler->GetTrinityString(LANG_NO));
// Output X. LANG_PINFO_CHR_LEVEL
if (level != sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL))
@@ -1711,7 +1712,7 @@ public:
}
if (target)
handler->PSendSysMessage(LANG_PINFO_CHR_MAP, map->name, (!zoneName.empty() ? zoneName.c_str() : "<Unknown>"), (!areaName.empty() ? areaName.c_str() : "<Unknown>"));
handler->PSendSysMessage(LANG_PINFO_CHR_MAP, map->name, (!zoneName.empty() ? zoneName.c_str() : handler->GetTrinityString(LANG_UNKNOWN)), (!areaName.empty() ? areaName.c_str() : handler->GetTrinityString(LANG_UNKNOWN)));
// Output XVII. - XVIX. if they are not empty
if (!guildName.empty())
@@ -1791,7 +1792,7 @@ public:
return false;
char const* muteReason = strtok(NULL, "\r");
std::string muteReasonStr = "No reason";
std::string muteReasonStr = handler->GetTrinityString(LANG_NO_REASON);
if (muteReason != NULL)
muteReasonStr = muteReason;
@@ -1819,7 +1820,7 @@ public:
if (handler->GetSession())
muteBy = handler->GetSession()->GetPlayerName();
else
muteBy = "Console";
muteBy = handler->GetTrinityString(LANG_CONSOLE);
if (target)
{

View File

@@ -126,7 +126,7 @@ public:
ticket->SaveToDB(trans);
sTicketMgr->UpdateLastChange();
std::string msg = ticket->FormatMessageString(*handler, NULL, target.c_str(), NULL, NULL);
std::string msg = ticket->FormatMessageString(*handler, NULL, target.c_str(), NULL, NULL, NULL);
handler->SendGlobalGMSysMessage(msg.c_str());
return true;
}
@@ -156,7 +156,7 @@ public:
sTicketMgr->CloseTicket(ticket->GetId(), player ? player->GetGUID() : -1);
sTicketMgr->UpdateLastChange();
std::string msg = ticket->FormatMessageString(*handler, player ? player->GetName().c_str() : "Console", NULL, NULL, NULL);
std::string msg = ticket->FormatMessageString(*handler, player ? player->GetName().c_str() : "Console", NULL, NULL, NULL, NULL);
handler->SendGlobalGMSysMessage(msg.c_str());
// Inform player, who submitted this ticket, that it is closed
@@ -205,7 +205,7 @@ public:
ticket->SaveToDB(trans);
sTicketMgr->UpdateLastChange();
std::string msg = ticket->FormatMessageString(*handler, NULL, ticket->GetAssignedToName().c_str(), NULL, NULL);
std::string msg = ticket->FormatMessageString(*handler, NULL, ticket->GetAssignedToName().c_str(), NULL, NULL, NULL);
msg += handler->PGetParseString(LANG_COMMAND_TICKETLISTADDCOMMENT, player ? player->GetName().c_str() : "Console", comment);
handler->SendGlobalGMSysMessage(msg.c_str());
@@ -239,6 +239,9 @@ public:
ticket->SetCompleted();
ticket->SaveToDB(trans);
std::string msg = ticket->FormatMessageString(*handler, NULL, NULL,
NULL, NULL, handler->GetSession() ? handler->GetSession()->GetPlayer()->GetName().c_str() : "Console");
handler->SendGlobalGMSysMessage(msg.c_str());
sTicketMgr->UpdateLastChange();
return true;
}
@@ -262,7 +265,7 @@ public:
return true;
}
std::string msg = ticket->FormatMessageString(*handler, NULL, NULL, NULL, handler->GetSession() ? handler->GetSession()->GetPlayer()->GetName().c_str() : "Console");
std::string msg = ticket->FormatMessageString(*handler, NULL, NULL, NULL, handler->GetSession() ? handler->GetSession()->GetPlayer()->GetName().c_str() : "Console", NULL);
handler->SendGlobalGMSysMessage(msg.c_str());
sTicketMgr->RemoveTicket(ticket->GetId());
@@ -394,7 +397,7 @@ public:
sTicketMgr->UpdateLastChange();
std::string msg = ticket->FormatMessageString(*handler, NULL, assignedTo.c_str(),
handler->GetSession() ? handler->GetSession()->GetPlayer()->GetName().c_str() : "Console", NULL);
handler->GetSession() ? handler->GetSession()->GetPlayer()->GetName().c_str() : "Console", NULL, NULL);
handler->SendGlobalGMSysMessage(msg.c_str());
return true;

View File

@@ -319,19 +319,24 @@ public:
struct npc_anchorite_truuenAI : public npc_escortAI
{
npc_anchorite_truuenAI(Creature* creature) : npc_escortAI(creature) { }
npc_anchorite_truuenAI(Creature* creature) : npc_escortAI(creature)
{
Initialize();
UghostGUID = 0;
}
void Initialize()
{
m_uiChatTimer = 7000;
}
uint32 m_uiChatTimer;
uint64 UghostGUID;
uint64 TheldanisGUID;
Creature* Ughost;
Creature* Theldanis;
void Reset() override
{
m_uiChatTimer = 7000;
Initialize();
}
void JustSummoned(Creature* summoned) override
@@ -364,26 +369,25 @@ public:
Talk(SAY_WP_2);
break;
case 21:
Theldanis = GetClosestCreatureWithEntry(me, NPC_THEL_DANIS, 150);
if (Theldanis)
if (Creature* Theldanis = GetClosestCreatureWithEntry(me, NPC_THEL_DANIS, 150))
Theldanis->AI()->Talk(SAY_WP_3);
break;
case 23:
Ughost = me->SummonCreature(NPC_GHOST_UTHER, 971.86f, -1825.42f, 81.99f, 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000);
if (Ughost)
if (Creature* Ughost = me->SummonCreature(NPC_GHOST_UTHER, 971.86f, -1825.42f, 81.99f, 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000))
{
UghostGUID = Ughost->GetGUID();
Ughost->SetDisableGravity(true);
Ughost->AI()->Talk(SAY_WP_4, me);
}
m_uiChatTimer = 4000;
break;
case 24:
if (Ughost)
if (Creature* Ughost = ObjectAccessor::GetCreature(*me, UghostGUID))
Ughost->AI()->Talk(SAY_WP_5, me);
m_uiChatTimer = 4000;
break;
case 25:
if (Ughost)
if (Creature* Ughost = ObjectAccessor::GetCreature(*me, UghostGUID))
Ughost->AI()->Talk(SAY_WP_6, me);
m_uiChatTimer = 4000;
break;

View File

@@ -59,14 +59,22 @@ public:
struct npc_tapoke_slim_jahnAI : public npc_escortAI
{
npc_tapoke_slim_jahnAI(Creature* creature) : npc_escortAI(creature) { }
npc_tapoke_slim_jahnAI(Creature* creature) : npc_escortAI(creature)
{
Initialize();
}
void Initialize()
{
IsFriendSummoned = false;
}
bool IsFriendSummoned;
void Reset() override
{
if (!HasEscortState(STATE_ESCORT_ESCORTING))
IsFriendSummoned = false;
Initialize();
}
void WaypointReached(uint32 waypointId) override

View File

@@ -150,9 +150,12 @@ class npc_winterfin_playmate : public CreatureScript
struct npc_winterfin_playmateAI : public ScriptedAI
{
npc_winterfin_playmateAI(Creature* creature) : ScriptedAI(creature) { }
npc_winterfin_playmateAI(Creature* creature) : ScriptedAI(creature)
{
Initialize();
}
void Reset() override
void Initialize()
{
timer = 0;
phase = 0;
@@ -160,6 +163,11 @@ class npc_winterfin_playmate : public CreatureScript
orphanGUID = 0;
}
void Reset() override
{
Initialize();
}
void MoveInLineOfSight(Unit* who) override
{
@@ -249,9 +257,12 @@ class npc_snowfall_glade_playmate : public CreatureScript
struct npc_snowfall_glade_playmateAI : public ScriptedAI
{
npc_snowfall_glade_playmateAI(Creature* creature) : ScriptedAI(creature) { }
npc_snowfall_glade_playmateAI(Creature* creature) : ScriptedAI(creature)
{
Initialize();
}
void Reset() override
void Initialize()
{
timer = 0;
phase = 0;
@@ -259,6 +270,11 @@ class npc_snowfall_glade_playmate : public CreatureScript
orphanGUID = 0;
}
void Reset() override
{
Initialize();
}
void MoveInLineOfSight(Unit* who) override
{
@@ -349,10 +365,11 @@ class npc_the_biggest_tree : public CreatureScript
{
npc_the_biggest_treeAI(Creature* creature) : ScriptedAI(creature)
{
Initialize();
me->SetDisplayId(DISPLAY_INVISIBLE);
}
void Reset() override
void Initialize()
{
timer = 1000;
phase = 0;
@@ -360,8 +377,12 @@ class npc_the_biggest_tree : public CreatureScript
orphanGUID = 0;
}
void MoveInLineOfSight(Unit* who) override
void Reset() override
{
Initialize();
}
void MoveInLineOfSight(Unit* who) override
{
if (!phase && who && who->GetDistance2d(me) < 10.0f)
if (Player* player = who->ToPlayer())
@@ -437,9 +458,12 @@ class npc_high_oracle_soo_roo : public CreatureScript
struct npc_high_oracle_soo_rooAI : public ScriptedAI
{
npc_high_oracle_soo_rooAI(Creature* creature) : ScriptedAI(creature) { }
npc_high_oracle_soo_rooAI(Creature* creature) : ScriptedAI(creature)
{
Initialize();
}
void Reset() override
void Initialize()
{
timer = 0;
phase = 0;
@@ -447,6 +471,11 @@ class npc_high_oracle_soo_roo : public CreatureScript
orphanGUID = 0;
}
void Reset() override
{
Initialize();
}
void MoveInLineOfSight(Unit* who) override
{
@@ -526,9 +555,12 @@ class npc_elder_kekek : public CreatureScript
struct npc_elder_kekekAI : public ScriptedAI
{
npc_elder_kekekAI(Creature* creature) : ScriptedAI(creature) { }
npc_elder_kekekAI(Creature* creature) : ScriptedAI(creature)
{
Initialize();
}
void Reset() override
void Initialize()
{
timer = 0;
phase = 0;
@@ -536,6 +568,11 @@ class npc_elder_kekek : public CreatureScript
orphanGUID = 0;
}
void Reset() override
{
Initialize();
}
void MoveInLineOfSight(Unit* who) override
{
@@ -615,9 +652,12 @@ class npc_the_etymidian : public CreatureScript
struct npc_the_etymidianAI : public ScriptedAI
{
npc_the_etymidianAI(Creature* creature) : ScriptedAI(creature) { }
npc_the_etymidianAI(Creature* creature) : ScriptedAI(creature)
{
Initialize();
}
void Reset() override
void Initialize()
{
timer = 0;
phase = 0;
@@ -625,8 +665,12 @@ class npc_the_etymidian : public CreatureScript
orphanGUID = 0;
}
void MoveInLineOfSight(Unit* who) override
void Reset() override
{
Initialize();
}
void MoveInLineOfSight(Unit* who) override
{
if (!phase && who && who->GetDistance2d(me) < 10.0f)
if (Player* player = who->ToPlayer())
@@ -711,9 +755,12 @@ class npc_alexstraza_the_lifebinder : public CreatureScript
struct npc_alexstraza_the_lifebinderAI : public ScriptedAI
{
npc_alexstraza_the_lifebinderAI(Creature* creature) : ScriptedAI(creature) { }
npc_alexstraza_the_lifebinderAI(Creature* creature) : ScriptedAI(creature)
{
Initialize();
}
void Reset() override
void Initialize()
{
timer = 0;
phase = 0;
@@ -721,6 +768,11 @@ class npc_alexstraza_the_lifebinder : public CreatureScript
orphanGUID = 0;
}
void Reset() override
{
Initialize();
}
void SetData(uint32 type, uint32 data) override
{
// Existing SmartAI
@@ -871,7 +923,7 @@ class at_bring_your_orphan_to : public AreaTriggerScript
public:
at_bring_your_orphan_to() : AreaTriggerScript("at_bring_your_orphan_to") { }
bool OnTrigger(Player* player, AreaTriggerEntry const* trigger)
bool OnTrigger(Player* player, AreaTriggerEntry const* trigger) override
{
if (player->isDead() || !player->HasAura(SPELL_ORPHAN_OUT))
return false;
@@ -934,7 +986,6 @@ class npc_cw_area_trigger : public CreatureScript
}
void MoveInLineOfSight(Unit* who) override
{
if (who && me->GetDistance2d(who) < 20.0f)
if (Player* player = who->ToPlayer())

View File

@@ -80,6 +80,7 @@ public:
{
npc_blackfathom_deeps_eventAI(Creature* creature) : ScriptedAI(creature)
{
Initialize();
if (creature->IsSummon())
{
creature->SetHomePosition(HomePosition);
@@ -89,6 +90,15 @@ public:
instance = creature->GetInstanceScript();
}
void Initialize()
{
Flee = false;
ravageTimer = urand(5000, 8000);
frostNovaTimer = urand(9000, 12000);
frostBoltVolleyTimer = urand(2000, 4000);
}
InstanceScript* instance;
uint32 ravageTimer;
@@ -99,11 +109,7 @@ public:
void Reset() override
{
Flee = false;
ravageTimer = urand(5000, 8000);
frostNovaTimer = urand(9000, 12000);
frostBoltVolleyTimer = urand(2000, 4000);
Initialize();
}
void AttackPlayer()

View File

@@ -38,11 +38,19 @@ public:
struct boss_aku_maiAI : public BossAI
{
boss_aku_maiAI(Creature* creature) : BossAI(creature, TYPE_AKU_MAI) { }
boss_aku_maiAI(Creature* creature) : BossAI(creature, TYPE_AKU_MAI)
{
Initialize();
}
void Initialize()
{
IsEnraged = false;
}
void Reset() override
{
IsEnraged = false;
Initialize();
_Reset();
}

View File

@@ -38,16 +38,22 @@ public:
{
boss_gelihastAI(Creature* creature) : ScriptedAI(creature)
{
Initialize();
instance = creature->GetInstanceScript();
}
void Initialize()
{
netTimer = urand(2000, 4000);
}
uint32 netTimer;
InstanceScript* instance;
void Reset() override
{
netTimer = urand(2000, 4000);
Initialize();
instance->SetData(TYPE_GELIHAST, NOT_STARTED);
}

View File

@@ -43,9 +43,16 @@ public:
{
boss_kelrisAI(Creature* creature) : ScriptedAI(creature)
{
Initialize();
instance = creature->GetInstanceScript();
}
void Initialize()
{
mindBlastTimer = urand(2000, 5000);
sleepTimer = urand(9000, 12000);
}
uint32 mindBlastTimer;
uint32 sleepTimer;
@@ -53,8 +60,7 @@ public:
void Reset() override
{
mindBlastTimer = urand(2000, 5000);
sleepTimer = urand(9000, 12000);
Initialize();
instance->SetData(TYPE_KELRIS, NOT_STARTED);
}

View File

@@ -54,10 +54,20 @@ public:
{
boss_anetheronAI(Creature* creature) : hyjal_trashAI(creature)
{
Initialize();
instance = creature->GetInstanceScript();
go = false;
}
void Initialize()
{
SwarmTimer = 45000;
SleepTimer = 60000;
AuraTimer = 5000;
InfernoTimer = 45000;
damageTaken = 0;
}
uint32 SwarmTimer;
uint32 SleepTimer;
uint32 AuraTimer;
@@ -66,11 +76,7 @@ public:
void Reset() override
{
damageTaken = 0;
SwarmTimer = 45000;
SleepTimer = 60000;
AuraTimer = 5000;
InfernoTimer = 45000;
Initialize();
if (IsEvent)
instance->SetData(DATA_ANETHERONEVENT, NOT_STARTED);

View File

@@ -90,7 +90,13 @@ public:
{
npc_ancient_wispAI(Creature* creature) : ScriptedAI(creature)
{
Initialize();
instance = creature->GetInstanceScript();
}
void Initialize()
{
CheckTimer = 1000;
ArchimondeGUID = 0;
}
@@ -100,7 +106,7 @@ public:
void Reset() override
{
CheckTimer = 1000;
Initialize();
ArchimondeGUID = instance->GetData64(DATA_ARCHIMONDE);
@@ -174,15 +180,23 @@ public:
struct npc_doomfire_targettingAI : public ScriptedAI
{
npc_doomfire_targettingAI(Creature* creature) : ScriptedAI(creature) { }
npc_doomfire_targettingAI(Creature* creature) : ScriptedAI(creature)
{
Initialize();
}
void Initialize()
{
TargetGUID = 0;
ChangeTargetTimer = 5000;
}
uint64 TargetGUID;
uint32 ChangeTargetTimer;
void Reset() override
{
TargetGUID = 0;
ChangeTargetTimer = 5000;
Initialize();
}
void MoveInLineOfSight(Unit* who) override
@@ -244,9 +258,36 @@ public:
{
boss_archimondeAI(Creature* creature) : hyjal_trashAI(creature)
{
Initialize();
instance = creature->GetInstanceScript();
}
void Initialize()
{
DoomfireSpiritGUID = 0;
damageTaken = 0;
WorldTreeGUID = 0;
DrainNordrassilTimer = 0;
FearTimer = 42000;
AirBurstTimer = 30000;
GripOfTheLegionTimer = urand(5000, 25000);
DoomfireTimer = 20000;
SoulChargeTimer = urand(2000, 30000);
SoulChargeCount = 0;
MeleeRangeCheckTimer = 15000;
HandOfDeathTimer = 2000;
WispCount = 0; // When ~30 wisps are summoned, Archimonde dies
EnrageTimer = 600000; // 10 minutes
CheckDistanceTimer = 30000; // This checks if he's too close to the World Tree (75 yards from a point on the tree), if true then he will enrage
SummonWispTimer = 0;
Enraged = false;
BelowTenPercent = false;
HasProtected = false;
IsChanneling = false;
}
InstanceScript* instance;
uint64 DoomfireSpiritGUID;
@@ -275,28 +316,7 @@ public:
{
instance->SetData(DATA_ARCHIMONDEEVENT, NOT_STARTED);
DoomfireSpiritGUID = 0;
damageTaken = 0;
WorldTreeGUID = 0;
DrainNordrassilTimer = 0;
FearTimer = 42000;
AirBurstTimer = 30000;
GripOfTheLegionTimer = urand(5000, 25000);
DoomfireTimer = 20000;
SoulChargeTimer = urand(2000, 30000);
SoulChargeCount = 0;
MeleeRangeCheckTimer = 15000;
HandOfDeathTimer = 2000;
WispCount = 0; // When ~30 wisps are summoned, Archimonde dies
EnrageTimer = 600000; // 10 minutes
CheckDistanceTimer = 30000; // This checks if he's too close to the World Tree (75 yards from a point on the tree), if true then he will enrage
SummonWispTimer = 0;
Enraged = false;
BelowTenPercent = false;
HasProtected = false;
IsChanneling = false;
Initialize();
}
void EnterCombat(Unit* /*who*/) override

View File

@@ -55,10 +55,22 @@ public:
{
boss_azgalorAI(Creature* creature) : hyjal_trashAI(creature)
{
Initialize();
instance = creature->GetInstanceScript();
go = false;
}
void Initialize()
{
damageTaken = 0;
RainTimer = 20000;
DoomTimer = 50000;
HowlTimer = 30000;
CleaveTimer = 10000;
EnrageTimer = 600000;
enraged = false;
}
uint32 RainTimer;
uint32 DoomTimer;
uint32 HowlTimer;
@@ -70,13 +82,7 @@ public:
void Reset() override
{
damageTaken = 0;
RainTimer = 20000;
DoomTimer = 50000;
HowlTimer = 30000;
CleaveTimer = 10000;
EnrageTimer = 600000;
enraged = false;
Initialize();
if (IsEvent)
instance->SetData(DATA_AZGALOREVENT, NOT_STARTED);

View File

@@ -56,10 +56,20 @@ public:
{
boss_kazrogalAI(Creature* creature) : hyjal_trashAI(creature)
{
Initialize();
instance = creature->GetInstanceScript();
go = false;
}
void Initialize()
{
damageTaken = 0;
CleaveTimer = 5000;
WarStompTimer = 15000;
MarkTimer = 45000;
MarkTimerBase = 45000;
}
uint32 CleaveTimer;
uint32 WarStompTimer;
uint32 MarkTimer;
@@ -68,11 +78,7 @@ public:
void Reset() override
{
damageTaken = 0;
CleaveTimer = 5000;
WarStompTimer = 15000;
MarkTimer = 45000;
MarkTimerBase = 45000;
Initialize();
if (IsEvent)
instance->SetData(DATA_KAZROGALEVENT, NOT_STARTED);

View File

@@ -51,10 +51,20 @@ public:
{
boss_rage_winterchillAI(Creature* creature) : hyjal_trashAI(creature)
{
Initialize();
instance = creature->GetInstanceScript();
go = false;
}
void Initialize()
{
damageTaken = 0;
FrostArmorTimer = 37000;
DecayTimer = 45000;
NovaTimer = 15000;
IceboltTimer = 10000;
}
uint32 FrostArmorTimer;
uint32 DecayTimer;
uint32 NovaTimer;
@@ -63,11 +73,7 @@ public:
void Reset() override
{
damageTaken = 0;
FrostArmorTimer = 37000;
DecayTimer = 45000;
NovaTimer = 15000;
IceboltTimer = 10000;
Initialize();
if (IsEvent)
instance->SetData(DATA_RAGEWINTERCHILLEVENT, NOT_STARTED);

View File

@@ -317,6 +317,7 @@ float HordeFirePos[65][8]=//spawn points for the fire visuals (GO) in the horde
hyjalAI::hyjalAI(Creature* creature) : npc_escortAI(creature), Summons(me)
{
Initialize();
instance = creature->GetInstanceScript();
VeinsSpawned[0] = false;
VeinsSpawned[1] = false;
@@ -332,11 +333,45 @@ hyjalAI::hyjalAI(Creature* creature) : npc_escortAI(creature), Summons(me)
InfernalPoint = 0;
RespawnTimer = 10000;
DoRespawn = false;
DoHide = false;
MassTeleportTimer = 0;
DoMassTeleport = false;
}
void hyjalAI::Initialize()
{
IsDummy = false;
// GUIDs
PlayerGUID = 0;
BossGUID[0] = 0;
BossGUID[1] = 0;
// Timers
NextWaveTimer = 10000;
CheckTimer = 0;
RetreatTimer = 1000;
// Misc
WaveCount = 0;
EnemyCount = 0;
//Bools
EventBegun = false;
FirstBossDead = false;
SecondBossDead = false;
Summon = false;
bRetreat = false;
Debug = false;
//Visibility
DoHide = true;
//Initialize spells
memset(Spells, 0, sizeof(Spell) * HYJAL_AI_MAX_SPELLS);
Faction = 0;
}
void hyjalAI::JustSummoned(Creature* summoned)
{
Summons.Summon(summoned);
@@ -349,21 +384,9 @@ void hyjalAI::SummonedCreatureDespawn(Creature* summoned)
void hyjalAI::Reset()
{
IsDummy = false;
me->setActive(true);
// GUIDs
PlayerGUID = 0;
BossGUID[0] = 0;
BossGUID[1] = 0;
// Timers
NextWaveTimer = 10000;
CheckTimer = 0;
RetreatTimer = 1000;
// Misc
WaveCount = 0;
EnemyCount = 0;
Initialize();
// Set faction properly based on Creature entry
switch (me->GetEntry())
@@ -382,20 +405,9 @@ void hyjalAI::Reset()
break;
}
//Bools
EventBegun = false;
FirstBossDead = false;
SecondBossDead = false;
Summon = false;
bRetreat = false;
Debug = false;
//Flags
me->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP);
//Initialize spells
memset(Spells, 0, sizeof(Spell) * HYJAL_AI_MAX_SPELLS);
//Reset Instance Data for trash count
if ((!instance->GetData(DATA_ALLIANCE_RETREAT) && me->GetEntry() == JAINA) || (instance->GetData(DATA_ALLIANCE_RETREAT) && me->GetEntry() == THRALL))
{
@@ -405,9 +417,6 @@ void hyjalAI::Reset()
instance->DoUpdateWorldState(WORLD_STATE_ENEMYCOUNT, 0);
instance->SetData(DATA_RESET_TRASH_COUNT, 0);
}
//Visibility
DoHide = true;
}
void hyjalAI::EnterEvadeMode()

View File

@@ -119,6 +119,8 @@ struct hyjalAI : public npc_escortAI
{
hyjalAI(Creature* creature);
void Initialize();
void Reset(); // Generically used to reset our variables. Do *not* call in EnterEvadeMode as this may make problems if the raid is still in combat
void EnterEvadeMode(); // Send creature back to spawn location and evade.

View File

@@ -1135,9 +1135,15 @@ public:
{
npc_frost_wyrmAI(Creature* creature) : hyjal_trashAI(creature)
{
Initialize();
instance = creature->GetInstanceScript();
go = false;
Reset();
}
void Initialize()
{
FrostBreathTimer = 5000;
MoveTimer = 0;
}
bool go;
@@ -1146,8 +1152,7 @@ public:
void Reset() override
{
FrostBreathTimer = 5000;
MoveTimer = 0;
Initialize();
me->SetDisableGravity(true);
}
@@ -1388,9 +1393,15 @@ public:
{
alliance_riflemanAI(Creature* creature) : ScriptedAI(creature)
{
Initialize();
SetCombatMovement(false);
}
void Initialize()
{
ExplodeTimer = 5000 + rand32() % 5000;
}
uint32 ExplodeTimer;
void JustDied(Unit* /*killer*/) override
@@ -1399,7 +1410,7 @@ public:
void Reset() override
{
ExplodeTimer = 5000 + rand32() % 5000;
Initialize();
}
void MoveInLineOfSight(Unit* who) override

View File

@@ -59,9 +59,20 @@ public:
{
boss_epochAI(Creature* creature) : ScriptedAI(creature)
{
Initialize();
instance = creature->GetInstanceScript();
}
void Initialize()
{
uiStep = 1;
uiStepTimer = 26000;
uiCurseOfExertionTimer = 9300;
uiTimeWarpTimer = 25300;
uiTimeStopTimer = 21300;
uiWoundingStrikeTimer = 5300;
}
uint8 uiStep;
uint32 uiStepTimer;
@@ -74,12 +85,7 @@ public:
void Reset() override
{
uiStep = 1;
uiStepTimer = 26000;
uiCurseOfExertionTimer = 9300;
uiTimeWarpTimer = 25300;
uiTimeStopTimer = 21300;
uiWoundingStrikeTimer = 5300;
Initialize();
instance->SetData(DATA_EPOCH_EVENT, NOT_STARTED);
}

View File

@@ -73,7 +73,21 @@ public:
{
boss_mal_ganisAI(Creature* creature) : ScriptedAI(creature)
{
Initialize();
instance = creature->GetInstanceScript();
uiOutroStep = 0;
}
void Initialize()
{
bYelled = false;
bYelled2 = false;
Phase = COMBAT;
uiCarrionSwarmTimer = 6000;
uiMindBlastTimer = 11000;
uiVampiricTouchTimer = urand(10000, 15000);
uiSleepTimer = urand(15000, 20000);
uiOutroTimer = 1000;
}
uint32 uiCarrionSwarmTimer;
@@ -93,16 +107,9 @@ public:
void Reset() override
{
bYelled = false;
bYelled2 = false;
Phase = COMBAT;
uiCarrionSwarmTimer = 6000;
uiMindBlastTimer = 11000;
uiVampiricTouchTimer = urand(10000, 15000);
uiSleepTimer = urand(15000, 20000);
uiOutroTimer = 1000;
Initialize();
instance->SetData(DATA_MAL_GANIS_EVENT, NOT_STARTED);
instance->SetData(DATA_MAL_GANIS_EVENT, NOT_STARTED);
}
void EnterCombat(Unit* /*who*/) override

View File

@@ -58,10 +58,18 @@ public:
{
boss_meathookAI(Creature* creature) : ScriptedAI(creature)
{
Initialize();
instance = creature->GetInstanceScript();
Talk(SAY_SPAWN);
}
void Initialize()
{
uiChainTimer = urand(12000, 17000); //seen on video 13, 17, 15, 12, 16
uiDiseaseTimer = urand(2000, 4000); //approx 3s
uiFrenzyTimer = urand(21000, 26000); //made it up
}
uint32 uiChainTimer;
uint32 uiDiseaseTimer;
uint32 uiFrenzyTimer;
@@ -70,9 +78,7 @@ public:
void Reset() override
{
uiChainTimer = urand(12000, 17000); //seen on video 13, 17, 15, 12, 16
uiDiseaseTimer = urand(2000, 4000); //approx 3s
uiFrenzyTimer = urand(21000, 26000); //made it up
Initialize();
instance->SetData(DATA_MEATHOOK_EVENT, NOT_STARTED);
}

View File

@@ -63,10 +63,20 @@ public:
{
boss_salrammAI(Creature* creature) : ScriptedAI(creature)
{
Initialize();
instance = creature->GetInstanceScript();
Talk(SAY_SPAWN);
}
void Initialize()
{
uiCurseFleshTimer = 30000; //30s DBM
uiExplodeGhoulTimer = urand(25000, 28000); //approx 6 sec after summon ghouls
uiShadowBoltTimer = urand(8000, 12000); // approx 10s
uiStealFleshTimer = 12345;
uiSummonGhoulsTimer = urand(19000, 24000); //on a video approx 24s after aggro
}
uint32 uiCurseFleshTimer;
uint32 uiExplodeGhoulTimer;
uint32 uiShadowBoltTimer;
@@ -77,13 +87,9 @@ public:
void Reset() override
{
uiCurseFleshTimer = 30000; //30s DBM
uiExplodeGhoulTimer = urand(25000, 28000); //approx 6 sec after summon ghouls
uiShadowBoltTimer = urand(8000, 12000); // approx 10s
uiStealFleshTimer = 12345;
uiSummonGhoulsTimer = urand(19000, 24000); //on a video approx 24s after aggro
Initialize();
instance->SetData(DATA_SALRAMM_EVENT, NOT_STARTED);
instance->SetData(DATA_SALRAMM_EVENT, NOT_STARTED);
}
void EnterCombat(Unit* /*who*/) override

View File

@@ -351,35 +351,15 @@ public:
{
npc_arthasAI(Creature* creature) : npc_escortAI(creature)
{
Initialize();
instance = creature->GetInstanceScript();
Reset();
bStepping = false;
step = 0;
gossipStep = 0;
bossEvent = 0;
}
InstanceScript* instance;
bool bStepping;
uint32 step;
uint32 phaseTimer;
uint32 gossipStep;
uint32 playerFaction;
uint32 bossEvent;
uint32 wave;
uint64 utherGUID;
uint64 jainaGUID;
uint64 citymenGUID[2];
uint64 waveGUID[ENCOUNTER_WAVES_MAX_SPAWNS];
uint64 infiniteDraconianGUID[ENCOUNTER_DRACONIAN_NUMBER];
uint64 stalkerGUID;
uint64 bossGUID;
uint64 epochGUID;
uint64 malganisGUID;
uint64 infiniteGUID;
uint32 exorcismTimer;
void Reset() override
void Initialize()
{
utherGUID = 0;
jainaGUID = 0;
@@ -399,6 +379,38 @@ public:
malganisGUID = 0;
infiniteGUID = 0;
phaseTimer = 1000;
exorcismTimer = 7300;
wave = 0;
}
InstanceScript* instance;
bool bStepping;
uint32 step;
uint32 phaseTimer;
uint32 gossipStep;
uint32 bossEvent;
uint32 wave;
uint64 utherGUID;
uint64 jainaGUID;
uint64 citymenGUID[2];
uint64 waveGUID[ENCOUNTER_WAVES_MAX_SPAWNS];
uint64 infiniteDraconianGUID[ENCOUNTER_DRACONIAN_NUMBER];
uint64 stalkerGUID;
uint64 bossGUID;
uint64 epochGUID;
uint64 malganisGUID;
uint64 infiniteGUID;
uint32 exorcismTimer;
void Reset() override
{
Initialize();
instance->SetData(DATA_ARTHAS_EVENT, NOT_STARTED);
switch (instance->GetData(DATA_ARTHAS_EVENT))
{
@@ -410,9 +422,6 @@ public:
gossipStep = 0;
break;
}
phaseTimer = 1000;
exorcismTimer = 7300;
wave = 0;
}
void EnterCombat(Unit* /*who*/) override

View File

@@ -61,9 +61,20 @@ public:
{
boss_captain_skarlocAI(Creature* creature) : ScriptedAI(creature)
{
Initialize();
instance = creature->GetInstanceScript();
}
void Initialize()
{
Holy_Light_Timer = urand(20000, 30000);
Cleanse_Timer = 10000;
HammerOfJustice_Timer = urand(20000, 35000);
HolyShield_Timer = 240000;
DevotionAura_Timer = 3000;
Consecration_Timer = 8000;
}
InstanceScript* instance;
uint32 Holy_Light_Timer;
@@ -75,12 +86,7 @@ public:
void Reset() override
{
Holy_Light_Timer = urand(20000, 30000);
Cleanse_Timer = 10000;
HammerOfJustice_Timer = urand(20000, 35000);
HolyShield_Timer = 240000;
DevotionAura_Timer = 3000;
Consecration_Timer = 8000;
Initialize();
}
void EnterCombat(Unit* /*who*/) override

View File

@@ -59,9 +59,18 @@ public:
{
boss_epoch_hunterAI(Creature* creature) : ScriptedAI(creature)
{
Initialize();
instance = creature->GetInstanceScript();
}
void Initialize()
{
SandBreath_Timer = urand(8000, 16000);
ImpendingDeath_Timer = urand(25000, 30000);
WingBuffet_Timer = 35000;
Mda_Timer = 40000;
}
InstanceScript* instance;
uint32 SandBreath_Timer;
@@ -71,10 +80,7 @@ public:
void Reset() override
{
SandBreath_Timer = urand(8000, 16000);
ImpendingDeath_Timer = urand(25000, 30000);
WingBuffet_Timer = 35000;
Mda_Timer = 40000;
Initialize();
}
void EnterCombat(Unit* /*who*/) override

View File

@@ -114,7 +114,21 @@ public:
struct boss_lieutenant_drakeAI : public ScriptedAI
{
boss_lieutenant_drakeAI(Creature* creature) : ScriptedAI(creature) { }
boss_lieutenant_drakeAI(Creature* creature) : ScriptedAI(creature)
{
Initialize();
}
void Initialize()
{
CanPatrol = true;
wpId = 0;
Whirlwind_Timer = 20000;
Fear_Timer = 30000;
MortalStrike_Timer = 45000;
ExplodingShout_Timer = 25000;
}
bool CanPatrol;
uint32 wpId;
@@ -126,13 +140,7 @@ public:
void Reset() override
{
CanPatrol = true;
wpId = 0;
Whirlwind_Timer = 20000;
Fear_Timer = 30000;
MortalStrike_Timer = 45000;
ExplodingShout_Timer = 25000;
Initialize();
}
void EnterCombat(Unit* /*who*/) override

View File

@@ -276,11 +276,17 @@ public:
{
npc_thrall_old_hillsbradAI(Creature* creature) : npc_escortAI(creature)
{
Initialize();
instance = creature->GetInstanceScript();
HadMount = false;
me->setActive(true);
}
void Initialize()
{
LowHp = false;
}
InstanceScript* instance;
bool LowHp;
@@ -451,7 +457,7 @@ public:
void Reset() override
{
LowHp = false;
Initialize();
if (HadMount)
DoMount();

View File

@@ -77,9 +77,19 @@ public:
{
npc_medivh_bmAI(Creature* creature) : ScriptedAI(creature)
{
Initialize();
instance = creature->GetInstanceScript();
}
void Initialize()
{
SpellCorrupt_Timer = 0;
Check_Timer = 0;
Life75 = true;
Life50 = true;
Life25 = true;
}
InstanceScript* instance;
uint32 SpellCorrupt_Timer;
@@ -91,11 +101,7 @@ public:
void Reset() override
{
SpellCorrupt_Timer = 0;
Check_Timer = 0;
Life75 = true;
Life50 = true;
Life25 = true;
Initialize();
if (instance->GetData(TYPE_MEDIVH) == IN_PROGRESS)
DoCast(me, SPELL_CHANNEL, true);
@@ -265,23 +271,28 @@ public:
{
npc_time_riftAI(Creature* creature) : ScriptedAI(creature)
{
Initialize();
instance = creature->GetInstanceScript();
}
void Initialize()
{
TimeRiftWave_Timer = 15000;
mRiftWaveCount = 0;
mWaveId = 0;
}
InstanceScript* instance;
uint32 TimeRiftWave_Timer;
uint8 mRiftWaveCount;
uint8 mPortalCount;
uint8 mWaveId;
void Reset() override
{
Initialize();
TimeRiftWave_Timer = 15000;
mRiftWaveCount = 0;
mPortalCount = instance->GetData(DATA_PORTAL_COUNT);
uint8 mPortalCount = instance->GetData(DATA_PORTAL_COUNT);
if (mPortalCount < 6)
mWaveId = 0;

View File

@@ -45,7 +45,17 @@ public:
struct celebras_the_cursedAI : public ScriptedAI
{
celebras_the_cursedAI(Creature* creature) : ScriptedAI(creature) { }
celebras_the_cursedAI(Creature* creature) : ScriptedAI(creature)
{
Initialize();
}
void Initialize()
{
WrathTimer = 8000;
EntanglingRootsTimer = 2000;
CorruptForcesTimer = 30000;
}
uint32 WrathTimer;
uint32 EntanglingRootsTimer;
@@ -53,9 +63,7 @@ public:
void Reset() override
{
WrathTimer = 8000;
EntanglingRootsTimer = 2000;
CorruptForcesTimer = 30000;
Initialize();
}
void EnterCombat(Unit* /*who*/) override { }

View File

@@ -45,7 +45,17 @@ public:
struct boss_landslideAI : public ScriptedAI
{
boss_landslideAI(Creature* creature) : ScriptedAI(creature) { }
boss_landslideAI(Creature* creature) : ScriptedAI(creature)
{
Initialize();
}
void Initialize()
{
KnockAwayTimer = 8000;
TrampleTimer = 2000;
LandslideTimer = 0;
}
uint32 KnockAwayTimer;
uint32 TrampleTimer;
@@ -53,9 +63,7 @@ public:
void Reset() override
{
KnockAwayTimer = 8000;
TrampleTimer = 2000;
LandslideTimer = 0;
Initialize();
}
void EnterCombat(Unit* /*who*/) override

View File

@@ -44,7 +44,19 @@ public:
struct boss_noxxionAI : public ScriptedAI
{
boss_noxxionAI(Creature* creature) : ScriptedAI(creature) { }
boss_noxxionAI(Creature* creature) : ScriptedAI(creature)
{
Initialize();
}
void Initialize()
{
ToxicVolleyTimer = 7000;
UppercutTimer = 16000;
AddsTimer = 19000;
InvisibleTimer = 15000; //Too much too low?
Invisible = false;
}
uint32 ToxicVolleyTimer;
uint32 UppercutTimer;
@@ -54,11 +66,7 @@ public:
void Reset() override
{
ToxicVolleyTimer = 7000;
UppercutTimer = 16000;
AddsTimer = 19000;
InvisibleTimer = 15000; //Too much too low?
Invisible = false;
Initialize();
}
void EnterCombat(Unit* /*who*/) override { }

View File

@@ -47,7 +47,18 @@ public:
struct boss_ptheradrasAI : public ScriptedAI
{
boss_ptheradrasAI(Creature* creature) : ScriptedAI(creature) { }
boss_ptheradrasAI(Creature* creature) : ScriptedAI(creature)
{
Initialize();
}
void Initialize()
{
DustfieldTimer = 8000;
BoulderTimer = 2000;
ThrashTimer = 5000;
RepulsiveGazeTimer = 23000;
}
uint32 DustfieldTimer;
uint32 BoulderTimer;
@@ -56,10 +67,7 @@ public:
void Reset() override
{
DustfieldTimer = 8000;
BoulderTimer = 2000;
ThrashTimer = 5000;
RepulsiveGazeTimer = 23000;
Initialize();
}
void EnterCombat(Unit* /*who*/) override { }

View File

@@ -111,6 +111,7 @@ static OnyxMove MoveData[8]=
Position const MiddleRoomLocation = {-23.6155f, -215.357f, -55.7344f, 0.0f};
Position const Phase2Location = {-80.924f, -214.299f, -82.942f, 0.0f};
Position const Phase2Floating = { -80.924f, -214.299f, -57.942f, 0.0f };
Position const SpawnLocations[3]=
{
@@ -128,7 +129,7 @@ public:
struct boss_onyxiaAI : public BossAI
{
boss_onyxiaAI(Creature* creature) : BossAI(creature, DATA_ONYXIA), Summons(me)
boss_onyxiaAI(Creature* creature) : BossAI(creature, DATA_ONYXIA)
{
Reset();
}
@@ -138,16 +139,16 @@ public:
if (!IsCombatMovementAllowed())
SetCombatMovement(true);
_Reset();
Phase = PHASE_START;
MovePoint = urand(0, 5);
PointData = GetMoveData();
Summons.DespawnAll();
SummonWhelpCount = 0;
IsMoving = false;
instance->SetBossState(DATA_ONYXIA, NOT_STARTED);
instance->SetData(DATA_ONYXIA_PHASE, Phase);
instance->DoStopTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_TIMED_START_EVENT);
instance->DoStopTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_TIMED_START_EVENT);
}
void EnterCombat(Unit* /*who*/) override
@@ -155,20 +156,15 @@ public:
Talk(SAY_AGGRO);
me->SetInCombatWithZone();
events.ScheduleEvent(EVENT_FLAME_BREATH, urand (10000, 20000));
events.ScheduleEvent(EVENT_TAIL_SWEEP, urand (15000, 20000));
events.ScheduleEvent(EVENT_CLEAVE, urand (2000, 5000));
events.ScheduleEvent(EVENT_WING_BUFFET, urand (10000, 20000));
events.Reset();
events.ScheduleEvent(EVENT_FLAME_BREATH, urand(10000, 20000));
events.ScheduleEvent(EVENT_TAIL_SWEEP, urand(15000, 20000));
events.ScheduleEvent(EVENT_CLEAVE, urand(2000, 5000));
events.ScheduleEvent(EVENT_WING_BUFFET, urand(10000, 20000));
instance->SetBossState(DATA_ONYXIA, IN_PROGRESS);
instance->DoStartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_TIMED_START_EVENT);
}
void JustDied(Unit* /*killer*/) override
{
instance->SetBossState(DATA_ONYXIA, DONE);
Summons.DespawnAll();
instance->DoStartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_TIMED_START_EVENT);
}
void JustSummoned(Creature* summoned) override
@@ -186,13 +182,9 @@ public:
summoned->setActive(true);
break;
}
Summons.Summon(summoned);
summons.Summon(summoned);
}
void SummonedCreatureDespawn(Creature* summon) override
{
Summons.Despawn(summon);
}
void KilledUnit(Unit* /*victim*/) override
{
@@ -231,22 +223,43 @@ public:
}
break;
case 9:
me->GetMotionMaster()->MoveChase(me->GetVictim());
events.ScheduleEvent(EVENT_BELLOWING_ROAR, 1000);
me->SetCanFly(false);
me->SetDisableGravity(false);
me->RemoveByteFlag(UNIT_FIELD_BYTES_1, 3, UNIT_BYTE1_FLAG_ALWAYS_STAND | UNIT_BYTE1_FLAG_HOVER);
if (Creature* trigger = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_TRIGGER_GUID)))
me->Kill(trigger);
me->SetReactState(REACT_AGGRESSIVE);
// tank selection based on phase one. If tank is not there i take nearest one
if (Unit* tank = ObjectAccessor::GetUnit(*me, instance->GetData64(DATA_TANK_GUID)))
me->GetMotionMaster()->MoveChase(tank);
else if (Unit* newtarget = SelectTarget(SELECT_TARGET_NEAREST, 0))
me->GetMotionMaster()->MoveChase(newtarget);
events.ScheduleEvent(EVENT_BELLOWING_ROAR, 5000);
events.ScheduleEvent(EVENT_FLAME_BREATH, urand(10000, 20000));
events.ScheduleEvent(EVENT_TAIL_SWEEP, urand(15000, 20000));
events.ScheduleEvent(EVENT_CLEAVE, urand(2000, 5000));
events.ScheduleEvent(EVENT_WING_BUFFET, urand(15000, 30000));
break;
case 10:
me->SetCanFly(true);
me->GetMotionMaster()->MovePoint(11, Phase2Location.GetPositionX(), Phase2Location.GetPositionY(), Phase2Location.GetPositionZ()+25);
me->SetDisableGravity(true);
me->SetByteFlag(UNIT_FIELD_BYTES_1, 3, UNIT_BYTE1_FLAG_ALWAYS_STAND | UNIT_BYTE1_FLAG_HOVER);
me->SetFacingTo(me->GetOrientation() + float(M_PI));
if (Creature * trigger = me->SummonCreature(NPC_TRIGGER, MiddleRoomLocation, TEMPSUMMON_CORPSE_DESPAWN))
instance->SetData64(DATA_TRIGGER_GUID, trigger->GetGUID());
me->GetMotionMaster()->MoveTakeoff(11, Phase2Floating);
me->SetSpeed(MOVE_FLIGHT, 1.0f);
Talk(SAY_PHASE_2_TRANS);
instance->SetData(DATA_ONYXIA_PHASE, Phase);
events.ScheduleEvent(EVENT_WHELP_SPAWN, 5000);
events.ScheduleEvent(EVENT_LAIR_GUARD, 15000);
events.ScheduleEvent(EVENT_DEEP_BREATH, 75000);
events.ScheduleEvent(EVENT_MOVEMENT, 10000);
events.ScheduleEvent(EVENT_FIREBALL, 18000);
break;
case 11:
if (PointData)
me->GetMotionMaster()->MovePoint(PointData->LocId, PointData->fX, PointData->fY, PointData->fZ);
me->GetMotionMaster()->Clear(false);
me->GetMotionMaster()->MoveIdle();
break;
default:
@@ -272,13 +285,13 @@ public:
(Spell->Id >= 22267 && Spell->Id <= 22268)) &&
(target->GetTypeId() == TYPEID_PLAYER))
{
instance->SetData(DATA_SHE_DEEP_BREATH_MORE, FAIL);
instance->SetData(DATA_SHE_DEEP_BREATH_MORE, FAIL);
}
}
OnyxMove* GetMoveData()
{
uint8 MaxCount = sizeof(MoveData)/sizeof(OnyxMove);
uint8 MaxCount = sizeof(MoveData) / sizeof(OnyxMove);
for (uint8 i = 0; i < MaxCount; ++i)
{
@@ -291,9 +304,9 @@ public:
void SetNextRandomPoint()
{
uint8 MaxCount = sizeof(MoveData)/sizeof(OnyxMove);
uint8 MaxCount = sizeof(MoveData) / sizeof(OnyxMove);
uint8 iTemp = urand(0, MaxCount-1);
uint8 iTemp = urand(0, MaxCount - 1);
if (iTemp >= MovePoint)
++iTemp;
@@ -312,15 +325,13 @@ public:
//Specific to PHASE_START || PHASE_END
if (Phase == PHASE_START)
{
if (HealthBelowPct(60))
if (HealthBelowPct(65))
{
SetCombatMovement(false);
Phase = PHASE_BREATH;
events.ScheduleEvent(EVENT_DEEP_BREATH, 85000);
events.ScheduleEvent(EVENT_MOVEMENT, 14000);
events.ScheduleEvent(EVENT_FIREBALL, 15000);
events.ScheduleEvent(EVENT_LAIR_GUARD, 60000);
events.ScheduleEvent(EVENT_WHELP_SPAWN, 60000);
instance->SetData64(DATA_TANK_GUID, me->GetVictim()->GetGUID());
me->SetReactState(REACT_PASSIVE);
me->AttackStop();
me->GetMotionMaster()->MovePoint(10, Phase2Location);
return;
}
@@ -347,19 +358,19 @@ public:
}
case EVENT_FLAME_BREATH: // Phase PHASE_START and PHASE_END
DoCastVictim(SPELL_FLAME_BREATH);
events.ScheduleEvent(EVENT_FLAME_BREATH, urand (10000, 20000));
events.ScheduleEvent(EVENT_FLAME_BREATH, urand(10000, 20000));
break;
case EVENT_TAIL_SWEEP: // Phase PHASE_START and PHASE_END
DoCastAOE(SPELL_TAIL_SWEEP);
events.ScheduleEvent(EVENT_TAIL_SWEEP, urand (15000, 20000));
events.ScheduleEvent(EVENT_TAIL_SWEEP, urand(15000, 20000));
break;
case EVENT_CLEAVE: // Phase PHASE_START and PHASE_END
DoCastVictim(SPELL_CLEAVE);
events.ScheduleEvent(EVENT_CLEAVE, urand (2000, 5000));
events.ScheduleEvent(EVENT_CLEAVE, urand(2000, 5000));
break;
case EVENT_WING_BUFFET: // Phase PHASE_START and PHASE_END
DoCastVictim(SPELL_WING_BUFFET);
events.ScheduleEvent(EVENT_WING_BUFFET, urand (15000, 30000));
events.ScheduleEvent(EVENT_WING_BUFFET, urand(15000, 30000));
break;
default:
break;
@@ -374,15 +385,18 @@ public:
Phase = PHASE_END;
instance->SetData(DATA_ONYXIA_PHASE, PHASE_END);
Talk(SAY_PHASE_3_TRANS);
SetCombatMovement(true);
me->SetCanFly(false);
IsMoving = false;
me->GetMotionMaster()->MovePoint(9, me->GetHomePosition());
Position const pos = me->GetHomePosition();
me->GetMotionMaster()->MovePoint(9, pos.GetPositionX(), pos.GetPositionY(), pos.GetPositionZ() + 12.0f);
events.ScheduleEvent(EVENT_BELLOWING_ROAR, 30000);
return;
}
if (!me->isMoving())
if (Creature* trigger = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_TRIGGER_GUID)))
me->SetFacingToObject(trigger);
events.Update(diff);
while (uint32 eventId = events.ExecuteEvent())
@@ -398,8 +412,10 @@ public:
Talk(EMOTE_BREATH);
if (PointData) /// @todo: In what cases is this null? What should we do?
DoCast(me, PointData->SpellId);
events.ScheduleEvent(EVENT_DEEP_BREATH, 70000);
events.ScheduleEvent(EVENT_DEEP_BREATH, 75000);
}
else
events.ScheduleEvent(EVENT_DEEP_BREATH, 1000);
break;
case EVENT_MOVEMENT: // Phase PHASE_BREATH
if (!IsMoving && !(me->HasUnitState(UNIT_STATE_CASTING)))
@@ -414,18 +430,21 @@ public:
IsMoving = true;
events.ScheduleEvent(EVENT_MOVEMENT, 25000);
}
else
events.ScheduleEvent(EVENT_MOVEMENT, 500);
break;
case EVENT_FIREBALL: // Phase PHASE_BREATH
if (me->GetMotionMaster()->GetCurrentMovementGeneratorType() != POINT_MOTION_TYPE)
if (!IsMoving)
{
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
DoCast(target, SPELL_FIREBALL);
events.ScheduleEvent(EVENT_FIREBALL, 8000);
}
else
events.ScheduleEvent(EVENT_FIREBALL, 1000);
break;
case EVENT_LAIR_GUARD: // Phase PHASE_BREATH
me->SummonCreature(NPC_LAIRGUARD, SpawnLocations[2], TEMPSUMMON_CORPSE_DESPAWN);
me->SummonCreature(NPC_LAIRGUARD, SpawnLocations[2], TEMPSUMMON_CORPSE_DESPAWN);
events.ScheduleEvent(EVENT_LAIR_GUARD, 30000);
break;
case EVENT_WHELP_SPAWN: // Phase PHASE_BREATH
@@ -437,7 +456,7 @@ public:
events.ScheduleEvent(EVENT_WHELP_SPAWN, 90000);
}
else
events.ScheduleEvent(EVENT_WHELP_SPAWN, 500);
events.ScheduleEvent(EVENT_WHELP_SPAWN, 500);
break;
default:
break;
@@ -447,7 +466,6 @@ public:
}
private:
SummonList Summons;
OnyxMove* PointData;
uint8 Phase;
uint8 MovePoint;

View File

@@ -53,6 +53,8 @@ public:
SetBossNumber(EncounterCount);
onyxiaGUID = 0;
triggerGUID = 0;
tankGUID = 0;
onyxiaLiftoffTimer = 0;
manyWhelpsCounter = 0;
eruptTimer = 0;
@@ -181,6 +183,12 @@ public:
FloorEruptionGUIDQueue.push(data);
eruptTimer = 2500;
break;
case DATA_TRIGGER_GUID:
triggerGUID = data;
break;
case DATA_TANK_GUID:
tankGUID = data;
break;
}
}
@@ -190,6 +198,13 @@ public:
{
case NPC_ONYXIA:
return onyxiaGUID;
break;
case DATA_TRIGGER_GUID:
return triggerGUID;
break;
case DATA_TANK_GUID:
return tankGUID;
break;
}
return 0;
@@ -298,6 +313,8 @@ public:
std::map<uint64, uint32> FloorEruptionGUID[2];
std::queue<uint64> FloorEruptionGUIDQueue;
uint64 onyxiaGUID;
uint64 triggerGUID;
uint64 tankGUID;
uint32 onyxiaLiftoffTimer;
uint32 manyWhelpsCounter;
uint32 eruptTimer;

View File

@@ -35,7 +35,9 @@ enum Data32
enum Data64
{
DATA_ONYXIA_GUID = 0,
DATA_FLOOR_ERUPTION_GUID = 1
DATA_FLOOR_ERUPTION_GUID = 1,
DATA_TRIGGER_GUID = 2,
DATA_TANK_GUID = 3
};
enum OnyxiaPhases
@@ -49,7 +51,8 @@ enum CreatureIds
{
NPC_WHELP = 11262,
NPC_LAIRGUARD = 36561,
NPC_ONYXIA = 10184
NPC_ONYXIA = 10184,
NPC_TRIGGER = 14495
};
enum GameObjectIds

View File

@@ -50,14 +50,22 @@ public:
struct boss_amnennar_the_coldbringerAI : public BossAI
{
boss_amnennar_the_coldbringerAI(Creature* creature) : BossAI(creature, DATA_AMNENNAR_THE_COLD_BRINGER) { }
boss_amnennar_the_coldbringerAI(Creature* creature) : BossAI(creature, DATA_AMNENNAR_THE_COLD_BRINGER)
{
Initialize();
}
void Initialize()
{
hp60Spectrals = false;
hp30Spectrals = false;
hp50 = false;
}
void Reset() override
{
_Reset();
hp60Spectrals = false;
hp30Spectrals = false;
hp50 = false;
Initialize();
}
void EnterCombat(Unit* /*who*/) override

View File

@@ -80,13 +80,19 @@ class boss_ayamiss : public CreatureScript
{
boss_ayamissAI(Creature* creature) : BossAI(creature, DATA_AYAMISS)
{
Initialize();
}
void Initialize()
{
_phase = PHASE_AIR;
_enraged = false;
}
void Reset() override
{
_Reset();
_phase = PHASE_AIR;
_enraged = false;
Initialize();
SetCombatMovement(false);
}

View File

@@ -69,6 +69,7 @@ class boss_buru : public CreatureScript
{
boss_buruAI(Creature* creature) : BossAI(creature, DATA_BURU)
{
_phase = 0;
}
void EnterEvadeMode() override

View File

@@ -53,12 +53,18 @@ class boss_kurinnaxx : public CreatureScript
{
boss_kurinnaxxAI(Creature* creature) : BossAI(creature, DATA_KURINNAXX)
{
Initialize();
}
void Initialize()
{
_enraged = false;
}
void Reset() override
{
_Reset();
_enraged = false;
Initialize();
events.ScheduleEvent(EVENT_MORTAL_WOUND, 8000);
events.ScheduleEvent(EVENT_SANDTRAP, urand(5000, 15000));
events.ScheduleEvent(EVENT_TRASH, 1000);

View File

@@ -60,13 +60,19 @@ class boss_moam : public CreatureScript
{
boss_moamAI(Creature* creature) : BossAI(creature, DATA_MOAM)
{
Initialize();
}
void Initialize()
{
_isStonePhase = false;
}
void Reset() override
{
_Reset();
me->SetPower(POWER_MANA, 0);
_isStonePhase = false;
Initialize();
events.ScheduleEvent(EVENT_STONE_PHASE, 90000);
//events.ScheduleEvent(EVENT_WIDE_SLASH, 11000);
}

View File

@@ -88,9 +88,17 @@ class boss_ossirian : public CreatureScript
{
boss_ossirianAI(Creature* creature) : BossAI(creature, DATA_OSSIRIAN)
{
Initialize();
SaidIntro = false;
}
void Initialize()
{
CrystalIterator = 0;
TriggerGUID = 0;
CrystalGUID = 0;
}
uint64 TriggerGUID;
uint64 CrystalGUID;
uint8 CrystalIterator;
@@ -99,9 +107,7 @@ class boss_ossirian : public CreatureScript
void Reset() override
{
_Reset();
CrystalIterator = 0;
TriggerGUID = 0;
CrystalGUID = 0;
Initialize();
}
void SpellHit(Unit* caster, SpellInfo const* spell) override

View File

@@ -65,12 +65,18 @@ class boss_rajaxx : public CreatureScript
{
boss_rajaxxAI(Creature* creature) : BossAI(creature, DATA_RAJAXX)
{
Initialize();
}
void Initialize()
{
enraged = false;
}
void Reset() override
{
_Reset();
enraged = false;
Initialize();
events.ScheduleEvent(EVENT_DISARM, 10000);
events.ScheduleEvent(EVENT_THUNDERCRASH, 12000);
}

View File

@@ -55,9 +55,20 @@ public:
{
boss_kriAI(Creature* creature) : ScriptedAI(creature)
{
Initialize();
instance = creature->GetInstanceScript();
}
void Initialize()
{
Cleave_Timer = urand(4000, 8000);
ToxicVolley_Timer = urand(6000, 12000);
Check_Timer = 2000;
VemDead = false;
Death = false;
}
InstanceScript* instance;
uint32 Cleave_Timer;
@@ -69,12 +80,7 @@ public:
void Reset() override
{
Cleave_Timer = urand(4000, 8000);
ToxicVolley_Timer = urand(6000, 12000);
Check_Timer = 2000;
VemDead = false;
Death = false;
Initialize();
}
void EnterCombat(Unit* /*who*/) override
@@ -148,9 +154,19 @@ public:
{
boss_vemAI(Creature* creature) : ScriptedAI(creature)
{
Initialize();
instance = creature->GetInstanceScript();
}
void Initialize()
{
Charge_Timer = urand(15000, 27000);
KnockBack_Timer = urand(8000, 20000);
Enrage_Timer = 120000;
Enraged = false;
}
InstanceScript* instance;
uint32 Charge_Timer;
@@ -161,11 +177,7 @@ public:
void Reset() override
{
Charge_Timer = urand(15000, 27000);
KnockBack_Timer = urand(8000, 20000);
Enrage_Timer = 120000;
Enraged = false;
Initialize();
}
void JustDied(Unit* /*killer*/) override
@@ -237,9 +249,19 @@ public:
{
boss_yaujAI(Creature* creature) : ScriptedAI(creature)
{
Initialize();
instance = creature->GetInstanceScript();
}
void Initialize()
{
Heal_Timer = urand(25000, 40000);
Fear_Timer = urand(12000, 24000);
Check_Timer = 2000;
VemDead = false;
}
InstanceScript* instance;
uint32 Heal_Timer;
@@ -250,11 +272,7 @@ public:
void Reset() override
{
Heal_Timer = urand(25000, 40000);
Fear_Timer = urand(12000, 24000);
Check_Timer = 2000;
VemDead = false;
Initialize();
}
void JustDied(Unit* /*killer*/) override

View File

@@ -160,11 +160,29 @@ public:
{
eye_of_cthunAI(Creature* creature) : ScriptedAI(creature)
{
Initialize();
instance = creature->GetInstanceScript();
SetCombatMovement(false);
}
void Initialize()
{
//Phase information
PhaseTimer = 50000; //First dark glare in 50 seconds
//Eye beam phase 50 seconds
BeamTimer = 3000;
EyeTentacleTimer = 45000; //Always spawns 5 seconds before Dark Beam
ClawTentacleTimer = 12500; //4 per Eye beam phase (unsure if they spawn during Dark beam)
//Dark Beam phase 35 seconds (each tick = 1 second, 35 ticks)
DarkGlareTick = 0;
DarkGlareTickTimer = 1000;
DarkGlareAngle = 0;
ClockWise = false;
}
InstanceScript* instance;
//Global variables
@@ -183,19 +201,7 @@ public:
void Reset() override
{
//Phase information
PhaseTimer = 50000; //First dark glare in 50 seconds
//Eye beam phase 50 seconds
BeamTimer = 3000;
EyeTentacleTimer = 45000; //Always spawns 5 seconds before Dark Beam
ClawTentacleTimer = 12500; //4 per Eye beam phase (unsure if they spawn during Dark beam)
//Dark Beam phase 35 seconds (each tick = 1 second, 35 ticks)
DarkGlareTick = 0;
DarkGlareTickTimer = 1000;
DarkGlareAngle = 0;
ClockWise = false;
Initialize();
//Reset flags
me->RemoveAurasDueToSpell(SPELL_RED_COLORATION);
@@ -454,11 +460,34 @@ public:
{
cthunAI(Creature* creature) : ScriptedAI(creature)
{
Initialize();
SetCombatMovement(false);
instance = creature->GetInstanceScript();
}
void Initialize()
{
//One random wisper every 90 - 300 seconds
WisperTimer = 90000;
//Phase information
PhaseTimer = 10000; //Emerge in 10 seconds
//No hold player for transition
HoldPlayer = 0;
//Body Phase
EyeTentacleTimer = 30000;
FleshTentaclesKilled = 0;
GiantClawTentacleTimer = 15000; //15 seconds into body phase (1 min repeat)
GiantEyeTentacleTimer = 45000; //15 seconds into body phase (1 min repeat)
StomachAcidTimer = 4000; //Every 4 seconds
StomachEnterTimer = 10000; //Every 10 seconds
StomachEnterVisTimer = 0; //Always 3.5 seconds after Stomach Enter Timer
StomachEnterTarget = 0; //Target to be teleported to stomach
}
InstanceScript* instance;
//Out of combat whisper timer
@@ -487,24 +516,7 @@ public:
void Reset() override
{
//One random wisper every 90 - 300 seconds
WisperTimer = 90000;
//Phase information
PhaseTimer = 10000; //Emerge in 10 seconds
//No hold player for transition
HoldPlayer = 0;
//Body Phase
EyeTentacleTimer = 30000;
FleshTentaclesKilled = 0;
GiantClawTentacleTimer = 15000; //15 seconds into body phase (1 min repeat)
GiantEyeTentacleTimer = 45000; //15 seconds into body phase (1 min repeat)
StomachAcidTimer = 4000; //Every 4 seconds
StomachEnterTimer = 10000; //Every 10 seconds
StomachEnterVisTimer = 0; //Always 3.5 seconds after Stomach Enter Timer
StomachEnterTarget = 0; //Target to be teleported to stomach
Initialize();
//Clear players in stomach and outside
Stomach_Map.clear();

View File

@@ -53,23 +53,28 @@ public:
struct boss_fankrissAI : public ScriptedAI
{
boss_fankrissAI(Creature* creature) : ScriptedAI(creature) { }
boss_fankrissAI(Creature* creature) : ScriptedAI(creature)
{
Initialize();
}
void Initialize()
{
MortalWound_Timer = urand(10000, 15000);
SpawnHatchlings_Timer = urand(6000, 12000);
SpawnSpawns_Timer = urand(15000, 45000);
}
uint32 MortalWound_Timer;
uint32 SpawnHatchlings_Timer;
uint32 SpawnSpawns_Timer;
int Rand;
float RandX;
float RandY;
Creature* Hatchling;
Creature* Spawn;
void Reset() override
{
MortalWound_Timer = urand(10000, 15000);
SpawnHatchlings_Timer = urand(6000, 12000);
SpawnSpawns_Timer = urand(15000, 45000);
Initialize();
}
void SummonSpawn(Unit* victim)
@@ -77,7 +82,10 @@ public:
if (!victim)
return;
Rand = 10 + (rand32() % 10);
int Rand = 10 + (rand32() % 10);
float RandX = 0.f;
float RandY = 0.f;
switch (rand32() % 2)
{
case 0: RandX = 0.0f - Rand; break;

View File

@@ -51,7 +51,23 @@ public:
struct boss_huhuranAI : public ScriptedAI
{
boss_huhuranAI(Creature* creature) : ScriptedAI(creature) { }
boss_huhuranAI(Creature* creature) : ScriptedAI(creature)
{
Initialize();
}
void Initialize()
{
Frenzy_Timer = urand(25000, 35000);
Wyvern_Timer = urand(18000, 28000);
Spit_Timer = 8000;
PoisonBolt_Timer = 4000;
NoxiousPoison_Timer = urand(10000, 20000);
FrenzyBack_Timer = 15000;
Frenzy = false;
Berserk = false;
}
uint32 Frenzy_Timer;
uint32 Wyvern_Timer;
@@ -65,15 +81,7 @@ public:
void Reset() override
{
Frenzy_Timer = urand(25000, 35000);
Wyvern_Timer = urand(18000, 28000);
Spit_Timer = 8000;
PoisonBolt_Timer = 4000;
NoxiousPoison_Timer = urand(10000, 20000);
FrenzyBack_Timer = 15000;
Frenzy = false;
Berserk = false;
Initialize();
}
void EnterCombat(Unit* /*who*/) override

View File

@@ -48,7 +48,23 @@ public:
struct boss_ouroAI : public ScriptedAI
{
boss_ouroAI(Creature* creature) : ScriptedAI(creature) { }
boss_ouroAI(Creature* creature) : ScriptedAI(creature)
{
Initialize();
}
void Initialize()
{
Sweep_Timer = urand(5000, 10000);
SandBlast_Timer = urand(20000, 35000);
Submerge_Timer = urand(90000, 150000);
Back_Timer = urand(30000, 45000);
ChangeTarget_Timer = urand(5000, 8000);
Spawn_Timer = urand(10000, 20000);
Enrage = false;
Submerged = false;
}
uint32 Sweep_Timer;
uint32 SandBlast_Timer;
@@ -62,15 +78,7 @@ public:
void Reset() override
{
Sweep_Timer = urand(5000, 10000);
SandBlast_Timer = urand(20000, 35000);
Submerge_Timer = urand(90000, 150000);
Back_Timer = urand(30000, 45000);
ChangeTarget_Timer = urand(5000, 8000);
Spawn_Timer = urand(10000, 20000);
Enrage = false;
Submerged = false;
Initialize();
}
void EnterCombat(Unit* /*who*/) override

View File

@@ -53,7 +53,25 @@ public:
struct boss_sarturaAI : public ScriptedAI
{
boss_sarturaAI(Creature* creature) : ScriptedAI(creature) { }
boss_sarturaAI(Creature* creature) : ScriptedAI(creature)
{
Initialize();
}
void Initialize()
{
WhirlWind_Timer = 30000;
WhirlWindRandom_Timer = urand(3000, 7000);
WhirlWindEnd_Timer = 15000;
AggroReset_Timer = urand(45000, 55000);
AggroResetEnd_Timer = 5000;
EnrageHard_Timer = 10 * 60000;
WhirlWind = false;
AggroReset = false;
Enraged = false;
EnragedHard = false;
}
uint32 WhirlWind_Timer;
uint32 WhirlWindRandom_Timer;
@@ -69,18 +87,7 @@ public:
void Reset() override
{
WhirlWind_Timer = 30000;
WhirlWindRandom_Timer = urand(3000, 7000);
WhirlWindEnd_Timer = 15000;
AggroReset_Timer = urand(45000, 55000);
AggroResetEnd_Timer = 5000;
EnrageHard_Timer = 10*60000;
WhirlWind = false;
AggroReset = false;
Enraged = false;
EnragedHard = false;
Initialize();
}
void EnterCombat(Unit* /*who*/) override
@@ -196,7 +203,23 @@ public:
struct npc_sartura_royal_guardAI : public ScriptedAI
{
npc_sartura_royal_guardAI(Creature* creature) : ScriptedAI(creature) { }
npc_sartura_royal_guardAI(Creature* creature) : ScriptedAI(creature)
{
Initialize();
}
void Initialize()
{
WhirlWind_Timer = 30000;
WhirlWindRandom_Timer = urand(3000, 7000);
WhirlWindEnd_Timer = 15000;
AggroReset_Timer = urand(45000, 55000);
AggroResetEnd_Timer = 5000;
KnockBack_Timer = 10000;
WhirlWind = false;
AggroReset = false;
}
uint32 WhirlWind_Timer;
uint32 WhirlWindRandom_Timer;
@@ -210,15 +233,7 @@ public:
void Reset() override
{
WhirlWind_Timer = 30000;
WhirlWindRandom_Timer = urand(3000, 7000);
WhirlWindEnd_Timer = 15000;
AggroReset_Timer = urand(45000, 55000);
AggroResetEnd_Timer = 5000;
KnockBack_Timer = 10000;
WhirlWind = false;
AggroReset = false;
Initialize();
}
void EnterCombat(Unit* /*who*/) override

View File

@@ -55,12 +55,20 @@ class boss_skeram : public CreatureScript
struct boss_skeramAI : public BossAI
{
boss_skeramAI(Creature* creature) : BossAI(creature, DATA_SKERAM) { }
boss_skeramAI(Creature* creature) : BossAI(creature, DATA_SKERAM)
{
Initialize();
}
void Reset() override
void Initialize()
{
_flag = 0;
_hpct = 75.0f;
}
void Reset() override
{
Initialize();
me->SetVisible(true);
}

View File

@@ -69,9 +69,24 @@ struct boss_twinemperorsAI : public ScriptedAI
{
boss_twinemperorsAI(Creature* creature): ScriptedAI(creature)
{
Initialize();
instance = creature->GetInstanceScript();
}
void Initialize()
{
Heal_Timer = 0; // first heal immediately when they get close together
Teleport_Timer = TELEPORTTIME;
AfterTeleport = false;
tspellcast = false;
AfterTeleportTimer = 0;
Abuse_Bug_Timer = urand(10000, 17000);
BugsTimer = 2000;
DontYellWhenDead = false;
EnrageTimer = 15 * 60000;
}
InstanceScript* instance;
uint32 Heal_Timer;
@@ -89,16 +104,8 @@ struct boss_twinemperorsAI : public ScriptedAI
void TwinReset()
{
Heal_Timer = 0; // first heal immediately when they get close together
Teleport_Timer = TELEPORTTIME;
AfterTeleport = false;
tspellcast = false;
AfterTeleportTimer = 0;
Abuse_Bug_Timer = urand(10000, 17000);
BugsTimer = 2000;
Initialize();
me->ClearUnitState(UNIT_STATE_STUNNED);
DontYellWhenDead = false;
EnrageTimer = 15*60000;
}
Creature* GetOtherBoss()
@@ -394,24 +401,28 @@ public:
struct boss_veknilashAI : public boss_twinemperorsAI
{
bool IAmVeklor() {return false;}
boss_veknilashAI(Creature* creature) : boss_twinemperorsAI(creature) { }
boss_veknilashAI(Creature* creature) : boss_twinemperorsAI(creature)
{
Initialize();
}
void Initialize()
{
UpperCut_Timer = urand(14000, 29000);
UnbalancingStrike_Timer = urand(8000, 18000);
Scarabs_Timer = urand(7000, 14000);
}
uint32 UpperCut_Timer;
uint32 UnbalancingStrike_Timer;
uint32 Scarabs_Timer;
int Rand;
int RandX;
int RandY;
Creature* Summoned;
void Reset() override
{
TwinReset();
UpperCut_Timer = urand(14000, 29000);
UnbalancingStrike_Timer = urand(8000, 18000);
Scarabs_Timer = urand(7000, 14000);
Initialize();
//Added. Can be removed if its included in DB.
me->ApplySpellImmune(0, IMMUNITY_DAMAGE, SPELL_SCHOOL_MASK_MAGIC, true);
}
@@ -480,25 +491,30 @@ public:
struct boss_veklorAI : public boss_twinemperorsAI
{
bool IAmVeklor() {return true;}
boss_veklorAI(Creature* creature) : boss_twinemperorsAI(creature) { }
boss_veklorAI(Creature* creature) : boss_twinemperorsAI(creature)
{
Initialize();
}
void Initialize()
{
ShadowBolt_Timer = 0;
Blizzard_Timer = urand(15000, 20000);
ArcaneBurst_Timer = 1000;
Scorpions_Timer = urand(7000, 14000);
}
uint32 ShadowBolt_Timer;
uint32 Blizzard_Timer;
uint32 ArcaneBurst_Timer;
uint32 Scorpions_Timer;
int Rand;
int RandX;
int RandY;
Creature* Summoned;
void Reset() override
{
TwinReset();
ShadowBolt_Timer = 0;
Blizzard_Timer = urand(15000, 20000);
ArcaneBurst_Timer = 1000;
Scorpions_Timer = urand(7000, 14000);
Initialize();
//Added. Can be removed if its included in DB.
me->ApplySpellImmune(0, IMMUNITY_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, true);

View File

@@ -91,13 +91,21 @@ class boss_viscidus : public CreatureScript
struct boss_viscidusAI : public BossAI
{
boss_viscidusAI(Creature* creature) : BossAI(creature, DATA_VISCIDUS) { }
boss_viscidusAI(Creature* creature) : BossAI(creature, DATA_VISCIDUS)
{
Initialize();
}
void Initialize()
{
_hitcounter = 0;
_phase = PHASE_FROST;
}
void Reset() override
{
_Reset();
_hitcounter = 0;
_phase = PHASE_FROST;
Initialize();
}
void DamageTaken(Unit* attacker, uint32& /*damage*/) override

View File

@@ -92,8 +92,15 @@ public:
aqsentinelAI(Creature* creature) : ScriptedAI(creature)
{
ClearBuddyList();
Initialize();
abselected = 0; // just initialization of variable
ability = 0;
}
void Initialize()
{
ClearBuddyList();
gatherOthersWhenAggro = true;
}
uint64 NearbyGUID[3];
@@ -183,8 +190,8 @@ public:
void GetOtherSentinels(Unit* who)
{
bool *chosenAbilities = new bool[9];
memset(chosenAbilities, 0, 9*sizeof(bool));
bool chosenAbilities[9];
memset(chosenAbilities, 0, sizeof(chosenAbilities));
selectAbility(pickAbilityRandom(chosenAbilities));
ClearBuddyList();
@@ -207,8 +214,6 @@ public:
DoYell("I dont have enough buddies.", LANG_NEUTRAL, 0);*/
SendMyListToBuddies();
CallBuddiesToAttack(who);
delete[] chosenAbilities;
}
bool gatherOthersWhenAggro;
@@ -228,8 +233,7 @@ public:
}
}
}
ClearBuddyList();
gatherOthersWhenAggro = true;
Initialize();
}
void GainSentinelAbility(uint32 id)

View File

@@ -59,14 +59,22 @@ public:
struct boss_zum_rahAI : public BossAI
{
boss_zum_rahAI(Creature* creature) : BossAI(creature, DATA_ZUM_RAH) { }
boss_zum_rahAI(Creature* creature) : BossAI(creature, DATA_ZUM_RAH)
{
Initialize();
}
void Initialize()
{
_ward80 = false;
_ward40 = false;
_heal30 = false;
}
void Reset() override
{
me->setFaction(ZUMRAH_FRIENDLY_FACTION); // areatrigger sets faction to enemy
_ward80 = false;
_ward40 = false;
_heal30 = false;
Initialize();
}
void EnterCombat(Unit* /*who*/) override

View File

@@ -104,8 +104,17 @@ public:
{
npc_sergeant_blyAI(Creature* creature) : ScriptedAI(creature)
{
Initialize();
instance = creature->GetInstanceScript();
postGossipStep = 0;
Text_Timer = 0;
PlayerGUID = 0;
}
void Initialize()
{
ShieldBash_Timer = 5000;
Revenge_Timer = 8000;
}
InstanceScript* instance;
@@ -118,8 +127,7 @@ public:
void Reset() override
{
ShieldBash_Timer = 5000;
Revenge_Timer = 8000;
Initialize();
me->setFaction(FACTION_FRIENDLY);
}

View File

@@ -61,13 +61,21 @@ public:
struct npc_torekAI : public npc_escortAI
{
npc_torekAI(Creature* creature) : npc_escortAI(creature) { }
npc_torekAI(Creature* creature) : npc_escortAI(creature)
{
Initialize();
}
void Initialize()
{
rend_Timer = 5000;
thunderclap_Timer = 8000;
_completed = false;
}
void Reset() override
{
rend_Timer = 5000;
thunderclap_Timer = 8000;
_completed = false;
Initialize();
}
void EnterCombat(Unit* /*who*/) override { }
@@ -298,15 +306,23 @@ public:
struct npc_muglashAI : public npc_escortAI
{
npc_muglashAI(Creature* creature) : npc_escortAI(creature) { }
npc_muglashAI(Creature* creature) : npc_escortAI(creature)
{
Initialize();
}
void Reset() override
void Initialize()
{
eventTimer = 10000;
waveId = 0;
_isBrazierExtinguished = false;
}
void Reset() override
{
Initialize();
}
void EnterCombat(Unit* /*who*/) override
{
if (Player* player = GetPlayerForEscort())

View File

@@ -60,7 +60,21 @@ public:
struct npc_draenei_survivorAI : public ScriptedAI
{
npc_draenei_survivorAI(Creature* creature) : ScriptedAI(creature) { }
npc_draenei_survivorAI(Creature* creature) : ScriptedAI(creature)
{
Initialize();
}
void Initialize()
{
pCaster = 0;
SayThanksTimer = 0;
RunAwayTimer = 0;
SayHelpTimer = 10000;
CanSayHelp = true;
}
uint64 pCaster;
@@ -72,13 +86,7 @@ public:
void Reset() override
{
pCaster = 0;
SayThanksTimer = 0;
RunAwayTimer = 0;
SayHelpTimer = 10000;
CanSayHelp = true;
Initialize();
DoCast(me, SPELL_IRRIDATION, true);
@@ -192,22 +200,28 @@ public:
{
npc_engineer_spark_overgrindAI(Creature* creature) : ScriptedAI(creature)
{
Initialize();
NormFaction = creature->getFaction();
NpcFlags = creature->GetUInt32Value(UNIT_NPC_FLAGS);
if (creature->GetAreaId() == AREA_COVE || creature->GetAreaId() == AREA_ISLE)
IsTreeEvent = true;
}
void Reset() override
void Initialize()
{
DynamiteTimer = 8000;
EmoteTimer = urand(120000, 150000);
if (me->GetAreaId() == AREA_COVE || me->GetAreaId() == AREA_ISLE)
IsTreeEvent = true;
else
IsTreeEvent = false;
}
void Reset() override
{
Initialize();
me->setFaction(NormFaction);
me->SetUInt32Value(UNIT_NPC_FLAGS, NpcFlags);
IsTreeEvent = false;
}
void EnterCombat(Unit* who) override
@@ -409,7 +423,18 @@ public:
struct npc_geezleAI : public ScriptedAI
{
npc_geezleAI(Creature* creature) : ScriptedAI(creature) { }
npc_geezleAI(Creature* creature) : ScriptedAI(creature)
{
Initialize();
}
void Initialize()
{
SparkGUID = 0;
Step = 0;
EventStarted = false;
SayTimer = 0;
}
uint64 SparkGUID;
@@ -420,8 +445,7 @@ public:
void Reset() override
{
SparkGUID = 0;
Step = 0;
Initialize();
StartEvent();
}
@@ -581,15 +605,23 @@ public:
struct npc_death_ravagerAI : public ScriptedAI
{
npc_death_ravagerAI(Creature* creature) : ScriptedAI(creature){ }
npc_death_ravagerAI(Creature* creature) : ScriptedAI(creature)
{
Initialize();
}
void Initialize()
{
RendTimer = 30000;
EnragingBiteTimer = 20000;
}
uint32 RendTimer;
uint32 EnragingBiteTimer;
void Reset() override
{
RendTimer = 30000;
EnragingBiteTimer = 20000;
Initialize();
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
me->SetReactState(REACT_PASSIVE);
@@ -647,7 +679,16 @@ class npc_stillpine_capitive : public CreatureScript
struct npc_stillpine_capitiveAI : public ScriptedAI
{
npc_stillpine_capitiveAI(Creature* creature) : ScriptedAI(creature) { }
npc_stillpine_capitiveAI(Creature* creature) : ScriptedAI(creature)
{
Initialize();
}
void Initialize()
{
_playerGUID = 0;
_movementComplete = false;
}
void Reset() override
{
@@ -657,8 +698,7 @@ class npc_stillpine_capitive : public CreatureScript
cage->SetGoState(GO_STATE_READY);
}
_events.Reset();
_player = NULL;
_movementComplete = false;
Initialize();
}
void StartMoving(Player* owner)
@@ -666,7 +706,7 @@ class npc_stillpine_capitive : public CreatureScript
if (owner)
{
Talk(CAPITIVE_SAY, owner);
_player = owner;
_playerGUID = owner->GetGUID();
}
Position pos = me->GetNearPosition(3.0f, 0.0f);
me->GetMotionMaster()->MovePoint(POINT_INIT, pos);
@@ -677,7 +717,7 @@ class npc_stillpine_capitive : public CreatureScript
if (type != POINT_MOTION_TYPE || id != POINT_INIT)
return;
if (_player)
if (Player* _player = ObjectAccessor::GetPlayer(*me, _playerGUID))
_player->KilledMonsterCredit(me->GetEntry(), me->GetGUID());
_movementComplete = true;
@@ -696,7 +736,7 @@ class npc_stillpine_capitive : public CreatureScript
}
private:
Player* _player;
uint64 _playerGUID;
EventMap _events;
bool _movementComplete;
};

View File

@@ -50,7 +50,17 @@ public:
struct npc_lazy_peonAI : public ScriptedAI
{
npc_lazy_peonAI(Creature* creature) : ScriptedAI(creature) { }
npc_lazy_peonAI(Creature* creature) : ScriptedAI(creature)
{
Initialize();
}
void Initialize()
{
PlayerGUID = 0;
RebuffTimer = 0;
work = false;
}
uint64 PlayerGUID;
@@ -59,9 +69,7 @@ public:
void Reset() override
{
PlayerGUID = 0;
RebuffTimer = 0;
work = false;
Initialize();
}
void MovementInform(uint32 /*type*/, uint32 id)

View File

@@ -61,7 +61,19 @@ public:
struct npc_kyle_frenziedAI : public ScriptedAI
{
npc_kyle_frenziedAI(Creature* creature) : ScriptedAI(creature) { }
npc_kyle_frenziedAI(Creature* creature) : ScriptedAI(creature)
{
Initialize();
}
void Initialize()
{
EventActive = false;
IsMovingToLunch = false;
PlayerGUID = 0;
EventTimer = 5000;
EventPhase = 0;
}
bool EventActive;
bool IsMovingToLunch;
@@ -71,11 +83,7 @@ public:
void Reset() override
{
EventActive = false;
IsMovingToLunch = false;
PlayerGUID = 0;
EventTimer = 5000;
EventPhase = 0;
Initialize();
if (me->GetEntry() == NPC_KYLE_FRIENDLY)
me->UpdateEntry(NPC_KYLE_FRENZIED);

View File

@@ -422,7 +422,23 @@ public:
struct npc_anachronos_the_ancientAI : public ScriptedAI
{
npc_anachronos_the_ancientAI(Creature* creature) : ScriptedAI(creature) { }
npc_anachronos_the_ancientAI(Creature* creature) : ScriptedAI(creature)
{
Initialize();
}
void Initialize()
{
AnimationTimer = 1500;
AnimationCount = 0;
AnachronosQuestTriggerGUID = 0;
MerithraGUID = 0;
ArygosGUID = 0;
CaelestraszGUID = 0;
FandralGUID = 0;
PlayerGUID = 0;
eventEnd = false;
}
uint32 AnimationTimer;
uint8 AnimationCount;
@@ -437,15 +453,7 @@ public:
void Reset() override
{
AnimationTimer = 1500;
AnimationCount = 0;
AnachronosQuestTriggerGUID = 0;
MerithraGUID = 0;
ArygosGUID = 0;
CaelestraszGUID = 0;
FandralGUID = 0;
PlayerGUID = 0;
eventEnd = false;
Initialize();
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
}
@@ -750,7 +758,22 @@ public:
struct npc_qiraj_war_spawnAI : public ScriptedAI
{
npc_qiraj_war_spawnAI(Creature* creature) : ScriptedAI(creature) { }
npc_qiraj_war_spawnAI(Creature* creature) : ScriptedAI(creature)
{
Initialize();
SpellTimer1 = 0;
SpellTimer2 = 0;
SpellTimer3 = 0;
SpellTimer4 = 0;
}
void Initialize()
{
MobGUID = 0;
PlayerGUID = 0;
Timers = false;
hasTarget = false;
}
uint64 MobGUID;
uint64 PlayerGUID;
@@ -760,10 +783,7 @@ public:
void Reset() override
{
MobGUID = 0;
PlayerGUID = 0;
Timers = false;
hasTarget = false;
Initialize();
}
void EnterCombat(Unit* /*who*/) override { }
@@ -863,7 +883,24 @@ public:
struct npc_anachronos_quest_triggerAI : public ScriptedAI
{
npc_anachronos_quest_triggerAI(Creature* creature) : ScriptedAI(creature) { }
npc_anachronos_quest_triggerAI(Creature* creature) : ScriptedAI(creature)
{
Initialize();
}
void Initialize()
{
PlayerGUID = 0;
WaveTimer = 2000;
AnnounceTimer = 1000;
LiveCount = 0;
WaveCount = 0;
EventStarted = false;
Announced = false;
Failed = false;
}
uint64 PlayerGUID;
@@ -879,16 +916,7 @@ public:
void Reset() override
{
PlayerGUID = 0;
WaveTimer = 2000;
AnnounceTimer = 1000;
LiveCount = 0;
WaveCount = 0;
EventStarted = false;
Announced = false;
Failed = false;
Initialize();
me->SetVisible(false);
}

View File

@@ -61,7 +61,21 @@ public:
struct npc_aquementasAI : public ScriptedAI
{
npc_aquementasAI(Creature* creature) : ScriptedAI(creature) { }
npc_aquementasAI(Creature* creature) : ScriptedAI(creature)
{
Initialize();
}
void Initialize()
{
SendItemTimer = 0;
SwitchFactionTimer = 10000;
isFriendly = true;
AquaJetTimer = 5000;
FrostShockTimer = 1000;
}
uint32 SendItemTimer;
uint32 SwitchFactionTimer;
@@ -72,13 +86,8 @@ public:
void Reset() override
{
SendItemTimer = 0;
SwitchFactionTimer = 10000;
Initialize();
me->setFaction(35);
isFriendly = true;
AquaJetTimer = 5000;
FrostShockTimer = 1000;
}
void SendItem(Unit* receiver)
@@ -458,7 +467,19 @@ public:
struct npc_toogaAI : public FollowerAI
{
npc_toogaAI(Creature* creature) : FollowerAI(creature) { }
npc_toogaAI(Creature* creature) : FollowerAI(creature)
{
Initialize();
}
void Initialize()
{
CheckSpeechTimer = 2500;
PostEventTimer = 1000;
PhasePostEvent = 0;
TortaGUID = 0;
}
uint32 CheckSpeechTimer;
uint32 PostEventTimer;
@@ -468,11 +489,7 @@ public:
void Reset() override
{
CheckSpeechTimer = 2500;
PostEventTimer = 1000;
PhasePostEvent = 0;
TortaGUID = 0;
Initialize();
}
void MoveInLineOfSight(Unit* who)

View File

@@ -195,9 +195,17 @@ public:
{
npc_taskmaster_fizzuleAI(Creature* creature) : ScriptedAI(creature)
{
Initialize();
factionNorm = creature->getFaction();
}
void Initialize()
{
IsFriend = false;
ResetTimer = 120000;
FlareCount = 0;
}
uint32 factionNorm;
bool IsFriend;
uint32 ResetTimer;
@@ -205,9 +213,7 @@ public:
void Reset() override
{
IsFriend = false;
ResetTimer = 120000;
FlareCount = 0;
Initialize();
me->setFaction(factionNorm);
}
@@ -309,20 +315,12 @@ public:
struct npc_twiggy_flatheadAI : public ScriptedAI
{
npc_twiggy_flatheadAI(Creature* creature) : ScriptedAI(creature) { }
npc_twiggy_flatheadAI(Creature* creature) : ScriptedAI(creature)
{
Initialize();
}
bool EventInProgress;
bool EventGrate;
bool EventBigWill;
bool ChallengerDown[6];
uint8 Wave;
uint32 WaveTimer;
uint32 ChallengerChecker;
uint64 PlayerGUID;
uint64 AffrayChallenger[6];
uint64 BigWill;
void Reset() override
void Initialize()
{
EventInProgress = false;
EventGrate = false;
@@ -340,6 +338,22 @@ public:
BigWill = 0;
}
bool EventInProgress;
bool EventGrate;
bool EventBigWill;
bool ChallengerDown[6];
uint8 Wave;
uint32 WaveTimer;
uint32 ChallengerChecker;
uint64 PlayerGUID;
uint64 AffrayChallenger[6];
uint64 BigWill;
void Reset() override
{
Initialize();
}
void MoveInLineOfSight(Unit* who) override
{
if (!who || !who->IsAlive() || EventInProgress)

View File

@@ -55,7 +55,19 @@ public:
struct npc_cairne_bloodhoofAI : public ScriptedAI
{
npc_cairne_bloodhoofAI(Creature* creature) : ScriptedAI(creature) { }
npc_cairne_bloodhoofAI(Creature* creature) : ScriptedAI(creature)
{
Initialize();
}
void Initialize()
{
BerserkerChargeTimer = 30000;
CleaveTimer = 5000;
MortalStrikeTimer = 10000;
ThunderclapTimer = 15000;
UppercutTimer = 10000;
}
uint32 BerserkerChargeTimer;
uint32 CleaveTimer;
@@ -65,11 +77,7 @@ public:
void Reset() override
{
BerserkerChargeTimer = 30000;
CleaveTimer = 5000;
MortalStrikeTimer = 10000;
ThunderclapTimer = 15000;
UppercutTimer = 10000;
Initialize();
}
void EnterCombat(Unit* /*who*/) override { }

View File

@@ -317,7 +317,17 @@ public:
npc_ranshallaAI(Creature* creature) : npc_escortAI(creature),
DialogueHelper(introDialogue)
{
Reset();
Initialize();
_firstPriestessGUID = 0;
_secondPriestessGUID = 0;
_guardEluneGUID = 0;
_voiceEluneGUID = 0;
_altarGUID = 0;
}
void Initialize()
{
_delayTimer = 0;
}
uint32 _delayTimer;
@@ -330,7 +340,7 @@ public:
void Reset() override
{
_delayTimer = 0;
Initialize();
}
// Called when the player activates the torch / altar

View File

@@ -61,13 +61,21 @@ class boss_elder_nadox : public CreatureScript
struct boss_elder_nadoxAI : public BossAI
{
boss_elder_nadoxAI(Creature* creature) : BossAI(creature, DATA_ELDER_NADOX) { }
boss_elder_nadoxAI(Creature* creature) : BossAI(creature, DATA_ELDER_NADOX)
{
Initialize();
}
void Initialize()
{
GuardianSummoned = false;
GuardianDied = false;
}
void Reset() override
{
_Reset();
GuardianSummoned = false;
GuardianDied = false;
Initialize();
}
void EnterCombat(Unit* /*who*/) override

View File

@@ -63,9 +63,19 @@ public:
{
boss_volazjAI(Creature* creature) : ScriptedAI(creature), Summons(me)
{
Initialize();
instance = creature->GetInstanceScript();
}
void Initialize()
{
uiMindFlayTimer = 8 * IN_MILLISECONDS;
uiShadowBoltVolleyTimer = 5 * IN_MILLISECONDS;
uiShiverTimer = 15 * IN_MILLISECONDS;
// Used for Insanity handling
insanityHandled = 0;
}
InstanceScript* instance;
uint32 uiMindFlayTimer;
@@ -152,9 +162,7 @@ public:
void Reset() override
{
uiMindFlayTimer = 8*IN_MILLISECONDS;
uiShadowBoltVolleyTimer = 5*IN_MILLISECONDS;
uiShiverTimer = 15*IN_MILLISECONDS;
Initialize();
instance->SetBossState(DATA_HERALD_VOLAZJ, NOT_STARTED);
instance->DoStopTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_QUICK_DEMISE_START_EVENT);
@@ -164,9 +172,6 @@ public:
for (uint32 i = 173; i <= 177; ++i)
me->SetInPhase(i, true, true);
// Used for Insanity handling
insanityHandled = 0;
ResetPlayersPhase();
// Cleanup

View File

@@ -64,11 +64,27 @@ public:
{
boss_jedoga_shadowseekerAI(Creature* creature) : ScriptedAI(creature)
{
Initialize();
instance = creature->GetInstanceScript();
bFirstTime = true;
bPreDone = false;
}
void Initialize()
{
uiOpFerTimer = urand(15 * IN_MILLISECONDS, 20 * IN_MILLISECONDS);
uiCycloneTimer = 3 * IN_MILLISECONDS;
uiBoltTimer = 7 * IN_MILLISECONDS;
uiThunderTimer = 12 * IN_MILLISECONDS;
bOpFerok = false;
bOpFerokFail = false;
bOnGround = false;
bCanDown = false;
volunteerWork = true;
}
InstanceScript* instance;
uint32 uiOpFerTimer;
@@ -86,17 +102,7 @@ public:
void Reset() override
{
uiOpFerTimer = urand(15*IN_MILLISECONDS, 20*IN_MILLISECONDS);
uiCycloneTimer = 3*IN_MILLISECONDS;
uiBoltTimer = 7*IN_MILLISECONDS;
uiThunderTimer = 12*IN_MILLISECONDS;
bOpFerok = false;
bOpFerokFail = false;
bOnGround = false;
bCanDown = false;
volunteerWork = true;
Initialize();
if (!bFirstTime)
instance->SetBossState(DATA_JEDOGA_SHADOWSEEKER, FAIL);
@@ -331,9 +337,16 @@ public:
{
npc_jedoga_initiandAI(Creature* creature) : ScriptedAI(creature)
{
Initialize();
instance = creature->GetInstanceScript();
}
void Initialize()
{
bWalking = false;
bCheckTimer = 2 * IN_MILLISECONDS;
}
InstanceScript* instance;
uint32 bCheckTimer;
@@ -342,8 +355,7 @@ public:
void Reset() override
{
bWalking = false;
bCheckTimer = 2*IN_MILLISECONDS;
Initialize();
if (instance->GetBossState(DATA_JEDOGA_SHADOWSEEKER) != IN_PROGRESS)
{

View File

@@ -87,7 +87,29 @@ public:
{
boss_anub_arakAI(Creature* creature) : ScriptedAI(creature), Summons(me)
{
Initialize();
instance = creature->GetInstanceScript();
GuardianSummoned = false;
VenomancerSummoned = false;
DatterSummoned = false;
UndergroundTimer = 0;
VenomancerTimer = 0;
DatterTimer = 0;
DelayTimer = 0;
ImpaleTarget = 0;
}
void Initialize()
{
CarrionBeetlesTimer = 8 * IN_MILLISECONDS;
LeechingSwarmTimer = 20 * IN_MILLISECONDS;
ImpaleTimer = 9 * IN_MILLISECONDS;
PoundTimer = 15 * IN_MILLISECONDS;
Phase = PHASE_MELEE;
UndergroundPhase = 0;
Channeling = false;
ImpalePhase = IMPALE_PHASE_TARGET;
}
InstanceScript* instance;
@@ -101,7 +123,6 @@ public:
uint32 CarrionBeetlesTimer;
uint32 LeechingSwarmTimer;
uint32 PoundTimer;
uint32 SubmergeTimer;
uint32 UndergroundTimer;
uint32 VenomancerTimer;
uint32 DatterTimer;
@@ -115,15 +136,7 @@ public:
void Reset() override
{
CarrionBeetlesTimer = 8*IN_MILLISECONDS;
LeechingSwarmTimer = 20*IN_MILLISECONDS;
ImpaleTimer = 9*IN_MILLISECONDS;
PoundTimer = 15*IN_MILLISECONDS;
Phase = PHASE_MELEE;
UndergroundPhase = 0;
Channeling = false;
ImpalePhase = IMPALE_PHASE_TARGET;
Initialize();
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE|UNIT_FLAG_NOT_SELECTABLE);
me->RemoveAura(SPELL_SUBMERGE);

View File

@@ -54,11 +54,22 @@ public:
{
boss_hadronoxAI(Creature* creature) : ScriptedAI(creature)
{
Initialize();
instance = creature->GetInstanceScript();
fMaxDistance = 50.0f;
bFirstTime = true;
}
void Initialize()
{
uiAcidTimer = urand(10 * IN_MILLISECONDS, 14 * IN_MILLISECONDS);
uiLeechTimer = urand(3 * IN_MILLISECONDS, 9 * IN_MILLISECONDS);
uiPierceTimer = urand(1 * IN_MILLISECONDS, 3 * IN_MILLISECONDS);
uiGrabTimer = urand(15 * IN_MILLISECONDS, 19 * IN_MILLISECONDS);
uiDoorsTimer = urand(20 * IN_MILLISECONDS, 30 * IN_MILLISECONDS);
uiCheckDistanceTimer = 2 * IN_MILLISECONDS;
}
InstanceScript* instance;
uint32 uiAcidTimer;
@@ -77,12 +88,7 @@ public:
me->SetFloatValue(UNIT_FIELD_BOUNDINGRADIUS, 9.0f);
me->SetFloatValue(UNIT_FIELD_COMBATREACH, 9.0f);
uiAcidTimer = urand(10*IN_MILLISECONDS, 14*IN_MILLISECONDS);
uiLeechTimer = urand(3*IN_MILLISECONDS, 9*IN_MILLISECONDS);
uiPierceTimer = urand(1*IN_MILLISECONDS, 3*IN_MILLISECONDS);
uiGrabTimer = urand(15*IN_MILLISECONDS, 19*IN_MILLISECONDS);
uiDoorsTimer = urand(20*IN_MILLISECONDS, 30*IN_MILLISECONDS);
uiCheckDistanceTimer = 2*IN_MILLISECONDS;
Initialize();
if (instance->GetBossState(DATA_HADRONOX) != DONE && !bFirstTime)
instance->SetBossState(DATA_HADRONOX, FAIL);

View File

@@ -130,14 +130,22 @@ public:
struct boss_sartharionAI : public BossAI
{
boss_sartharionAI(Creature* creature) : BossAI(creature, DATA_SARTHARION) { }
boss_sartharionAI(Creature* creature) : BossAI(creature, DATA_SARTHARION)
{
Initialize();
}
void Initialize()
{
_isBerserk = false;
_isSoftEnraged = false;
_isHardEnraged = false;
drakeCount = 0;
}
void Reset() override
{
_isBerserk = false;
_isSoftEnraged = false;
_isHardEnraged = false;
drakeCount = 0;
Initialize();
if (me->HasAura(SPELL_TWILIGHT_REVENGE))
me->RemoveAurasDueToSpell(SPELL_TWILIGHT_REVENGE);

View File

@@ -25,18 +25,26 @@ EndScriptData */
#include "ScriptMgr.h"
#include "ScriptedCreature.h"
#include "mana_tombs.h"
enum Pandemonius
enum Texts
{
SAY_AGGRO = 0,
SAY_KILL = 1,
SAY_DEATH = 2,
EMOTE_DARK_SHELL = 3,
EMOTE_DARK_SHELL = 3
};
SPELL_VOID_BLAST = 32325,
H_SPELL_VOID_BLAST = 38760,
SPELL_DARK_SHELL = 32358,
H_SPELL_DARK_SHELL = 38759
enum Spells
{
SPELL_VOID_BLAST = 32325,
SPELL_DARK_SHELL = 32358
};
enum Events
{
EVENT_VOID_BLAST = 1,
EVENT_DARK_SHELL
};
class boss_pandemonius : public CreatureScript
@@ -44,26 +52,17 @@ class boss_pandemonius : public CreatureScript
public:
boss_pandemonius() : CreatureScript("boss_pandemonius") { }
CreatureAI* GetAI(Creature* creature) const override
struct boss_pandemoniusAI : public BossAI
{
return new boss_pandemoniusAI(creature);
}
struct boss_pandemoniusAI : public ScriptedAI
{
boss_pandemoniusAI(Creature* creature) : ScriptedAI(creature)
boss_pandemoniusAI(Creature* creature) : BossAI(creature, DATA_PANDEMONIUS)
{
VoidBlastCounter = 0;
}
uint32 VoidBlast_Timer;
uint32 DarkShell_Timer;
uint32 VoidBlast_Counter;
void Reset() override
{
VoidBlast_Timer = 8000 + rand32() % 15000;
DarkShell_Timer = 20000;
VoidBlast_Counter = 0;
_Reset();
VoidBlastCounter = 0;
}
void JustDied(Unit* /*killer*/) override
@@ -78,48 +77,54 @@ public:
void EnterCombat(Unit* /*who*/) override
{
_EnterCombat();
Talk(SAY_AGGRO);
events.ScheduleEvent(EVENT_DARK_SHELL, 20000);
events.ScheduleEvent(EVENT_VOID_BLAST, urand(8000, 23000));
}
void UpdateAI(uint32 diff) override
void ExecuteEvent(uint32 eventId) override
{
if (!UpdateVictim())
return;
if (VoidBlast_Timer <= diff)
switch (eventId)
{
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
{
DoCast(target, SPELL_VOID_BLAST);
VoidBlast_Timer = 500;
++VoidBlast_Counter;
}
case EVENT_VOID_BLAST:
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
{
DoCast(target, SPELL_VOID_BLAST);
++VoidBlastCounter;
}
if (VoidBlast_Counter == 5)
{
VoidBlast_Timer = 15000 + rand32() % 10000;
VoidBlast_Counter = 0;
}
} else VoidBlast_Timer -= diff;
if (!VoidBlast_Counter)
{
if (DarkShell_Timer <= diff)
{
if (VoidBlastCounter == 5)
{
VoidBlastCounter = 0;
events.ScheduleEvent(EVENT_VOID_BLAST, urand(15000, 25000));
}
else
{
events.ScheduleEvent(EVENT_VOID_BLAST, 500);
events.DelayEvents(EVENT_DARK_SHELL, 500);
}
break;
case EVENT_DARK_SHELL:
if (me->IsNonMeleeSpellCast(false))
me->InterruptNonMeleeSpells(true);
Talk(EMOTE_DARK_SHELL);
DoCast(me, SPELL_DARK_SHELL);
DarkShell_Timer = 20000;
} else DarkShell_Timer -= diff;
events.ScheduleEvent(EVENT_DARK_SHELL, 20000);
break;
default:
break;
}
DoMeleeAttackIfReady();
}
private:
uint32 VoidBlastCounter;
};
CreatureAI* GetAI(Creature* creature) const override
{
return GetManaTombsAI<boss_pandemoniusAI>(creature);
}
};
void AddSC_boss_pandemonius()

View File

@@ -2399,6 +2399,20 @@ CharDelete.KeepDays = 30
###################################################################################################
# CUSTOM SERVER OPTIONS
#
# AllowTrackBothResources
# Description: Allows players to track herbs and minerals at the same time (if they have the skills)
# Default: 0 (do not allow)
# 1 (allow)
#
# Note: The following are client limitations and cannot be coded for:
# * The minimap tracking icon will display whichever skill is activated second
# * The minimap tracking list will only show a check mark next to the last skill activated (sometimes this
# bugs out and doesn't switch the check mark. It has no effect on the actual tracking though).
# * The minimap dots are yellow for both resources
AllowTrackBothResources = 0
#
# PlayerStart.AllReputation
# Description: Players will start with most of the high level reputations that are needed