diff options
86 files changed, 2156 insertions, 2134 deletions
diff --git a/sql/base/auth_database.sql b/sql/base/auth_database.sql index eb47e39e274..1d612fae666 100644 --- a/sql/base/auth_database.sql +++ b/sql/base/auth_database.sql @@ -29,6 +29,7 @@ CREATE TABLE `account` ( `sessionkey` varchar(80) NOT NULL DEFAULT '', `v` varchar(64) NOT NULL DEFAULT '', `s` varchar(64) NOT NULL DEFAULT '', + `token_key` varchar(100) NOT NULL DEFAULT '', `email` varchar(254) NOT NULL DEFAULT '', `joindate` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, `last_ip` varchar(15) NOT NULL DEFAULT '127.0.0.1', diff --git a/sql/updates/auth/2013_08_25_00_auth.sql b/sql/updates/auth/2013_08_25_00_auth.sql new file mode 100644 index 00000000000..d1abc9eb958 --- /dev/null +++ b/sql/updates/auth/2013_08_25_00_auth.sql @@ -0,0 +1 @@ +ALTER TABLE `account` ADD COLUMN `token_key` varchar(100) NOT NULL DEFAULT '' AFTER `s`; diff --git a/sql/updates/world/2013_08_22_00_world_sai.sql b/sql/updates/world/2013_08_22_00_world_sai.sql new file mode 100644 index 00000000000..4689091f345 --- /dev/null +++ b/sql/updates/world/2013_08_22_00_world_sai.sql @@ -0,0 +1,49 @@ +-- Vile Like Fire! (13071) + +SET @NPC_DRAKE := 30272; -- Njorndar Proto-Drake (not mount) +SET @NPC_DRAKE_MOUNT := 30564; -- Njorndar Proto-Drake +SET @NPC_FIRE_BUNNY := 30599; -- Vile Like Fire! Fire Bunny +SET @NPC_CREDIT := 30576; -- Vile Like Fire! Kill Credit Bunny +SET @SPELL_MOUNT := 57401; -- Njorndar Proto-Drake +SET @SPELL_STRAFE := 7769; -- Strafe Jotunheim Building +SET @AURA_OUT_OF_AREA := 57404; -- Out of Jotunheim! (mount out of area) +SET @SPELL_SPREAD_FIRE := 57469; -- Vile Like Fire!: Spread the Fire +SET @SPELL_FIRE := 7448; -- Vile Like Fire!: Fire + +DELETE FROM `npc_spellclick_spells` WHERE `npc_entry`=@NPC_DRAKE; +INSERT INTO `npc_spellclick_spells` (`npc_entry`,`spell_id`,`cast_flags`,`user_type`) VALUES +(@NPC_DRAKE,@SPELL_MOUNT,1,0); + +UPDATE `creature_template` SET `npcflag`=16777216,`faction_A`=190,`faction_H`=190 WHERE `entry`=@NPC_DRAKE; +UPDATE `creature_template` SET `AIName`='SmartAI',`minlevel`=80,`maxlevel`=80,`exp`=2,`unit_flags`=8,`HoverHeight`=2.25,`InhabitType`=4,`spell1`=57493,`spell3`=7769 WHERE `entry`=@NPC_DRAKE_MOUNT; + +DELETE FROM `creature_template_addon` WHERE `entry`=@NPC_DRAKE_MOUNT; +INSERT INTO `creature_template_addon` (`entry`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES +(@NPC_DRAKE_MOUNT,0,0,50331648,1,0,'57403'); -- 57403: Flight + +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=13 AND `SourceEntry` IN (@SPELL_STRAFE,@SPELL_SPREAD_FIRE); +INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`SourceId`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionTarget`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`NegativeCondition`,`ErrorTextId`,`ScriptName`,`Comment`) VALUES +(13,1,@SPELL_STRAFE,0,0,31,0,3,@NPC_CREDIT,0,0,0,'','Strafe Jotunheim Building targets Kill Credit Bunny'), +(13,1,@SPELL_SPREAD_FIRE,0,0,31,0,3,@NPC_CREDIT,0,0,0,'','Spread the Fire targets Kill Credit Bunny'), +(13,1,@SPELL_SPREAD_FIRE,0,1,31,0,3,@NPC_FIRE_BUNNY,0,0,0,'','Spread the Fire targets Kill Credit Bunny'); + +DELETE FROM `spell_linked_spell` WHERE `spell_trigger`=@SPELL_SPREAD_FIRE; +INSERT INTO `spell_linked_spell` (`spell_trigger`,`spell_effect`,`type`,`comment`) VALUES +(@SPELL_SPREAD_FIRE,@SPELL_FIRE,1,'Spread Fire triggers Fire'); + +UPDATE `creature_template` SET `flags_extra`=128 WHERE `entry`=@NPC_FIRE_BUNNY; +UPDATE `creature_template` SET `AIName`='SmartAI',`flags_extra`=128 WHERE `entry`=@NPC_CREDIT; +UPDATE `creature_template` SET `AIName`='SmartAI' WHERE `entry`=@NPC_DRAKE_MOUNT; + +DELETE FROM `smart_scripts` WHERE `source_type`=0 AND `entryorguid` IN (@NPC_CREDIT,@NPC_DRAKE_MOUNT); +INSERT INTO `smart_scripts` (`entryorguid`,`source_type`,`id`,`link`,`event_type`,`event_phase_mask`,`event_chance`,`event_flags`,`event_param1`,`event_param2`,`event_param3`,`event_param4`,`action_type`,`action_param1`,`action_param2`,`action_param3`,`action_param4`,`action_param5`,`action_param6`,`target_type`,`target_param1`,`target_param2`,`target_param3`,`target_x`,`target_y`,`target_z`,`target_o`,`comment`) VALUES +(@NPC_CREDIT,0,0,0,23,0,100,0,@SPELL_FIRE,0,0,0,22,1,0,0,0,0,0,1,0,0,0,0,0,0,0,'On no aura - Set phase 1'), +(@NPC_CREDIT,0,1,2,8,1,100,0,@SPELL_STRAFE,0,0,0,11,@SPELL_SPREAD_FIRE,0,0,0,0,0,1,0,0,0,0,0,0,0,'On spellhit - Cast Spread Fire'), +(@NPC_CREDIT,0,2,3,61,1,100,0,0,0,0,0,45,0,1,0,0,0,0,7,0,0,0,0,0,0,0,'On link - Set data'), +(@NPC_CREDIT,0,3,0,61,1,100,0,0,0,0,0,22,0,0,0,0,0,0,1,0,0,0,0,0,0,0,'On link - Set phase 1'), +-- +(@NPC_DRAKE_MOUNT,0,0,0,38,0,100,0,0,1,0,0,33,@NPC_CREDIT,0,0,0,0,0,23,0,0,0,0,0,0,0,'On Data - Give killcredit owner'); + +DELETE FROM `conditions` WHERE `SourceEntry` = 57402; +INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorType`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES +(17, 1, 57402, 0, 0, 23, 0, 4526, 0, 0, 0, 0, 0, '', 'Dismount player when not in intended zone'); diff --git a/sql/updates/world/2013_08_22_01_world_sai.sql b/sql/updates/world/2013_08_22_01_world_sai.sql new file mode 100644 index 00000000000..2ef2ecfa305 --- /dev/null +++ b/sql/updates/world/2013_08_22_01_world_sai.sql @@ -0,0 +1,86 @@ +-- Fix I've Got a Flying Machine +-- Steel Gate Chief Archaeologist SAI & Text & Condition +SET @ENTRY := 24399; +SET @ENTRY1 := 24418; +SET @ENTRY2 := 24439; +SET @ENTRY3 := 24438; +SET @STALKER := 105997; +SET @CGUID := 142705; +SET @MENUID := 8954; +SET @OPTION := 0; + +UPDATE `creature_template` SET `unit_flags`=16777216, `InhabitType`=5, `spell1`=44009, `spell2`=43770, `spell3`=43799, `spell4`=43769, `spell5`=47769 WHERE `entry`=@ENTRY1; +DELETE FROM `creature` WHERE `id`=24439; +INSERT INTO `creature` (`guid`, `id`, `map`, `spawnMask`, `phaseMask`, `modelid`, `equipment_id`, `position_x`, `position_y`, `position_z`, `orientation`, `spawntimesecs`, `spawndist`, `currentwaypoint`, `curhealth`, `curmana`, `MovementType`, `npcflag`, `unit_flags`, `dynamicflags`) VALUES +(@CGUID+0, 24439, 571, 1, 1, 24780, 0, 2088.714, -3263.196, 82.50323, 0.2792527, 120, 0, 0, 42, 0, 0, 0, 0, 0), -- Sack of Relics (Area: 0) +(@CGUID+1, 24439, 571, 1, 1, 24780, 0, 2047.712, -3236.201, 62.82506, 3.682645, 120, 0, 0, 42, 0, 0, 0, 0, 0), -- Sack of Relics (Area: Steel Gate) +(@CGUID+2, 24439, 571, 1, 1, 24780, 0, 2017.764, -3243.003, 74.95174, 3.246312, 120, 0, 0, 42, 0, 0, 0, 0, 0), -- Sack of Relics (Area: Steel Gate) +(@CGUID+3, 24439, 571, 1, 1, 24780, 0, 2068.706, -3318.71, 98.2312, 5.72468, 120, 0, 0, 42, 0, 0, 0, 0, 0), -- Sack of Relics (Area: Steel Gate) +(@CGUID+4, 24439, 571, 1, 1, 24780, 0, 1996.727, -3323.912, 99.77941, 5.532694, 120, 0, 0, 42, 0, 0, 0, 0, 0), -- Sack of Relics (Area: Steel Gate) +(@CGUID+5, 24439, 571, 1, 1, 24780, 0, 2068.706, -3318.71, 98.2312, 5.72468, 120, 0, 0, 42, 0, 0, 0, 0, 0); -- Sack of Relics (Area: 0) + +DELETE FROM `creature_template_addon` WHERE `entry`=24418; +INSERT INTO `creature_template_addon` (`entry`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES +(24418, 0, 0, 0, 0x1, 0x1, '43775 43889'); -- Steel Gate Flying Machine - Flight Drop Off Buff + +UPDATE `creature_template` SET `AIName`= 'SmartAI' WHERE `entry`=@ENTRY; +DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY; +INSERT INTO `smart_scripts` (`entryorguid`,`source_type`,`id`,`link`,`event_type`,`event_phase_mask`,`event_chance`,`event_flags`,`event_param1`,`event_param2`,`event_param3`,`event_param4`,`action_type`,`action_param1`,`action_param2`,`action_param3`,`action_param4`,`action_param5`,`action_param6`,`target_type`,`target_param1`,`target_param2`,`target_param3`,`target_x`,`target_y`,`target_z`,`target_o`,`comment`) VALUES +(@ENTRY,0,0,1,62,0,100,0,@MENUID,@OPTION,0,0,11,45973,1,0,0,0,0,7,0,0,0,0,0,0,0, 'Steel Gate Chief Archaeologist - On gossip option select - Cast spell'), +(@ENTRY,0,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, 'Steel Gate Chief Archaeologist - On Link - Close gossip'), +(@ENTRY,0,2,0,61,0,100,0,0,0,0,0,11,43767,0,0,0,0,0,7,0,0,0,0,0,0,0, 'Steel Gate Chief Archaeologist - On Link - Cast Invoker'), +(@ENTRY,0,3,4,19,0,100,1,11390,0,0,0,11,45973,1,0,0,0,0,7,0,0,0,0,0,0,0, 'Steel Gate Chief Archaeologist - On Quest Accept - Cast spell'), +(@ENTRY,0,4,0,61,0,100,0,0,0,0,0,11,43767,0,0,0,0,0,7,0,0,0,0,0,0,0, 'Steel Gate Chief Archaeologist - On Link - Cast Invoker'), +(@ENTRY,0,5,0,19,0,100,0,11390,0,0,0,12,@ENTRY3,3,120000,0,0,0,8,0,0,0,1972.773,-3265.381,134.719,0, 'Steel Gate Chief Archaeologist - On Link - Cast Invoker'); + +UPDATE `creature_template` SET `modelid1`=11686, `modelid2`=0, `AIName`= 'SmartAI', `type_flags`=1048576 WHERE `entry`=@ENTRY3; +DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY3; +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 +(@ENTRY3,0,0,0,54,0,100,0,0,0,0,0,11,43890,0,0,0,0,0,1,0,0,0,0,0,0,0, 'Grapple Target - Just Summoned - Cast Invisibility on self'); + + +DELETE FROM `npc_spellclick_spells` WHERE `npc_entry`= @ENTRY1; +INSERT INTO `npc_spellclick_spells` (`npc_entry`, `spell_id`, `cast_flags`, `user_type`) VALUES +(@ENTRY1, 43768, 1, 0); + +DELETE FROM `gossip_menu_option` WHERE `menu_id`=@MENUID AND `id`=@OPTION; +INSERT INTO `gossip_menu_option` (`menu_id`, `id`, `option_icon`, `option_text`, `option_id`, `npc_option_npcflag`, `action_menu_id`, `action_poi_id`, `box_coded`, `box_money`, `box_text`) VALUES +(@MENUID,@OPTION,0,'Sir, I need another flying machine...',1,1,0,0,0,0,''); + +-- Gossip conditions +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=15 AND `SourceGroup`=@MENUID AND `SourceEntry`=@OPTION; +INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`ErrorTextId`,`ScriptName`,`Comment`) VALUES +(15,@MENUID,@OPTION,0,9,11390,0,0,0,'','Show gossip option 0 if player has quest I''ve got a Flying Machine'); + +DELETE FROM `conditions` WHERE `SourceEntry`=@ENTRY1; +INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`ErrorTextId`,`ScriptName`,`Comment`) VALUES +(16, 0, @ENTRY1, 0, 23, 3999, 0, 0, 0, '', 'Dismount player when not in intended zone'); +-- Condition for Grappling Hook spell(43770) +DELETE FROM `conditions` WHERE `SourceEntry`=43770; +INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`ErrorTextId`,`ScriptName`,`Comment`) VALUES +(13, 1, 43770, 0, 31, 3, 24439, 0, 0, '', 'Spell 43770(Grappling Hook) targets npc 24439(Sack of Relics)'); +-- Spell Conditions +DELETE FROM `conditions` WHERE `SourceEntry`IN (43891,43892,43789); +INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`ErrorTextId`,`ScriptName`,`Comment`) VALUES +(13, 1, 43892, 0, 31, 3, 24439, 0, 0, '', 'Spell 43892 targets npc 24439'), +(13, 1, 43891, 0, 29, @ENTRY2, 1, 0, 0, '', 'Spell 43892 targets npc 24439'), +(13, 1, 43789, 0, 31, 3, 24439, 0, 0, '', 'Spell 43892 targets npc 24439'); + +-- Sack of Relics SAI +DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY2 AND `source_type`=0; +UPDATE `creature_template` SET AIName='SmartAI' WHERE entry=@ENTRY2; +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 +(@ENTRY2,0,0,0,8,0,100,0,43770,0,0,0,11,46598,0,0,0,0,0,7,0,0,0,0.0,0.0,0.0,0.0,'Sack of Relics - On Link - Mount Sack to vehicle'), +(@ENTRY2,0,1,2,8,0,100,1,43892,0,0,0,11,46598,0,0,0,0,0,10,105997,15214,0,0.0,0.0,0.0,0.0,' Sack of Relics - Remove Vehicle - In range'), +(@ENTRY2,0,2,3,61,0,100,1,0,0,0,0,11,36553,0,0,0,0,0,1,0,0,0,0.0,0.0,0.0,0.0,'Sack of Relics - On Link - Cast pet stay(36553)'), +(@ENTRY2,0,3,4,61,0,100,1,0,0,0,0,33,24439,0,0,0,0,0,21,20,0,0,0.0,0.0,0.0,0.0,'Sack of Relics - On Link - Quest Credit'), +(@ENTRY2,0,4,0,61,0,100,1,0,0,0,0,41,10000,0,0,0,0,0,1,0,0,0,0.0,0.0,0.0,0.0,'Sack of Relics - On Link - Despawn'); + +DELETE FROM `spell_linked_spell` WHERE `spell_trigger`=43770; +INSERT INTO `spell_linked_spell` (`spell_trigger`,`spell_effect`,`type`,`comment`) VALUES +(43770,43789,1,'Trigger grip beam'); + +DELETE FROM `smart_scripts` WHERE `entryorguid`=-@STALKER AND `source_type`=0; +UPDATE `creature_template` SET AIName='SmartAI' WHERE entry=15214; +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 +(-@STALKER,0,0,0,1,0,100,0,0,0,0,0,11,43892,0,0,0,0,0,11,@ENTRY2,10,0,0.0,0.0,0.0,0.0,'Invisible Stalker - OOC - Cast Spell'); diff --git a/sql/updates/world/2013_08_23_00_world_db_errors.sql b/sql/updates/world/2013_08_23_00_world_db_errors.sql new file mode 100644 index 00000000000..f0c393065af --- /dev/null +++ b/sql/updates/world/2013_08_23_00_world_db_errors.sql @@ -0,0 +1,3 @@ +UPDATE `conditions` SET `SourceTypeOrReferenceId`=17, `SourceGroup`=0 WHERE `SourceTypeOrReferenceId`=13 AND `SourceGroup`=1 AND `SourceEntry`=43789 AND `SourceId`=0 AND `ElseGroup`=0 AND `ConditionTypeOrReference`=31 AND `ConditionTarget`=0 AND `ConditionValue1`=3 AND `ConditionValue2`=24439 AND `ConditionValue3`=0; +UPDATE `conditions` SET `SourceTypeOrReferenceId`=17, `SourceGroup`=0 WHERE `SourceTypeOrReferenceId`=13 AND `SourceGroup`=1 AND `SourceEntry`=43892 AND `SourceId`=0 AND `ElseGroup`=0 AND `ConditionTypeOrReference`=31 AND `ConditionTarget`=0 AND `ConditionValue1`=3 AND `ConditionValue2`=24439 AND `ConditionValue3`=0; +UPDATE `conditions` SET `SourceTypeOrReferenceId`=17 WHERE `SourceTypeOrReferenceId`=13 AND `SourceGroup`=1 AND `SourceEntry`=43891 AND `SourceId`=0 AND `ElseGroup`=0 AND `ConditionTypeOrReference`=29 AND `ConditionTarget`=0 AND `ConditionValue1`=24439 AND `ConditionValue2`=1 AND `ConditionValue3`=0; diff --git a/sql/updates/world/2013_08_23_01_world_db_errors.sql b/sql/updates/world/2013_08_23_01_world_db_errors.sql new file mode 100644 index 00000000000..9eb808fec1f --- /dev/null +++ b/sql/updates/world/2013_08_23_01_world_db_errors.sql @@ -0,0 +1,7 @@ +UPDATE `conditions` SET `SourceGroup`=0 WHERE `SourceTypeOrReferenceId`=17 AND `SourceEntry`=57402; +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=17 AND `SourceEntry` IN (43891,43789); +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=13 AND `SourceEntry`=43892; +INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorType`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES +(17, 0, 43891, 0, 0, 29, 0, 24439, 1, 0, 0, 0, 0, '', 'Spell Drop-Off Periodic targets npc Sack of Relics'), +(17, 0, 43789, 0, 0, 31, 0, 3, 24439, 0, 0, 0, 0, '', 'Spell Grappling Beam targets npc Sack of Relics'), +(13, 1, 43892, 0, 0, 31, 0, 3, 24439, 0, 0, 0, 0, '', 'Spell Steel Gate Drop Off Check targets npc Sack of Relics'); diff --git a/sql/updates/world/2013_08_24_00_world_sai.sql b/sql/updates/world/2013_08_24_00_world_sai.sql new file mode 100644 index 00000000000..ecaf80c9ca2 --- /dev/null +++ b/sql/updates/world/2013_08_24_00_world_sai.sql @@ -0,0 +1,24 @@ +-- Sleeping Giants A:11432 H:11433 +SET @ENTRY := 24669; -- Dormant Vrykul +SET @ITEM := 34083; -- Awakening Rod + +DELETE FROM `conditions` WHERE `SourceEntry`=@ITEM; +INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`ErrorTextId`,`ScriptName`,`Comment`) VALUES +(18,0,@ITEM,0,24,1,@ENTRY,0,0,'','Awakening Rod target only Dormant Vrykul'); + +DELETE FROM `creature_text` WHERE `entry`=@ENTRY; +INSERT INTO `creature_text` (`entry`,`groupid`,`id`,`text`,`type`,`language`,`probability`,`emote`,`duration`,`sound`,`comment`) VALUES +(@ENTRY,0,0,'Interference with the wakening ritual causes the vrykul to die.',16,0,100,0,0,0,'Dormant Vrykul emote text'), +(@ENTRY,0,1,'The vrykul dies from being awakened improperly.',16,0,100,0,0,0,'Dormant Vrykul emote text'), +(@ENTRY,0,2,'The incorrect application of the awakening rod causes the dormant vrykul to expire.',16,0,100,0,0,0,'Dormant Vrykul emote text'); + +UPDATE `creature_template` SET `AIName`='SmartAI' WHERE `entry`=@ENTRY; +DELETE FROM `smart_scripts` WHERE `entryorguid` IN (@ENTRY,@ENTRY*100) AND `source_type` IN (0,9); +INSERT INTO `smart_scripts` (`entryorguid`,`source_type`,`id`,`link`,`event_type`,`event_phase_mask`,`event_chance`,`event_flags`,`event_param1`,`event_param2`,`event_param3`,`event_param4`,`action_type`,`action_param1`,`action_param2`,`action_param3`,`action_param4`,`action_param5`,`action_param6`,`target_type`,`target_param1`,`target_param2`,`target_param3`,`target_x`,`target_y`,`target_z`,`target_o`,`comment`) VALUES +(@ENTRY,0,0,1,8,0,100,0,44261,0,0,0,5,53,0,0,0,0,0,1,0,0,0,0.0,0.0,0.0,0.0,'Dormant Vrykul - On Spellhit - Emote visual - Self'), +(@ENTRY,0,1,0,61,0,100,0,0,0,0,0,80,@ENTRY*100,2,0,0,0,0,1,0,0,0,0.0,0.0,0.0,0.0,' Dormant Vrykul - On Link - Start Action Script'), +-- +(@ENTRY*100,9,0,0,0,0,100,0,300,300,300,300,1,0,0,0,0,0,0,7,0,0,0,0.0,0.0,0.0,0.0,' Dormant Vrykul - On Script - Emote text Invoker'), +(@ENTRY*100,9,1,0,0,0,100,0,2000,2000,2000,2000,33,24669,0,0,0,0,0,7,0,0,0,0.0,0.0,0.0,0.0,' Dormant Vrykul - On Script - Kill credit Invoker'), +(@ENTRY*100,9,2,0,0,0,100,0,0,0,0,0,37,0,0,0,0,0,0,1,0,0,0,0.0,0.0,0.0,0.0,' Dormant Vrykul - On Script - Die'), +(@ENTRY*100,9,3,0,0,0,100,0,0,0,0,0,41,4500,0,0,0,0,0,1,0,0,0,0.0,0.0,0.0,0.0,'Dormant Vrykul - On Script Despawn'); diff --git a/sql/updates/world/2013_08_24_01_world_conditions.sql b/sql/updates/world/2013_08_24_01_world_conditions.sql new file mode 100644 index 00000000000..da32567e51a --- /dev/null +++ b/sql/updates/world/2013_08_24_01_world_conditions.sql @@ -0,0 +1,5 @@ +-- Proper condition for spell +DELETE FROM `conditions` WHERE `SourceEntry`=34083; +DELETE FROM `conditions` WHERE `SourceEntry`=50165; +INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorType`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES +(17, 0, 50165, 0, 0, 31, 1, 3, 24669, 0, 0, 173, 0, '', 'Awakening Rod target limit to Dormant Vrykul'); diff --git a/sql/updates/world/2013_08_24_02_world_sai.sql b/sql/updates/world/2013_08_24_02_world_sai.sql new file mode 100644 index 00000000000..d74e148773f --- /dev/null +++ b/sql/updates/world/2013_08_24_02_world_sai.sql @@ -0,0 +1 @@ +UPDATE `smart_scripts` SET `target_type`=23 WHERE `entryorguid`=30468 AND `source_type`=0 AND `id`=2 AND `link`=0; diff --git a/sql/updates/world/2013_08_24_03_world_sai.sql b/sql/updates/world/2013_08_24_03_world_sai.sql new file mode 100644 index 00000000000..c02d31a49df --- /dev/null +++ b/sql/updates/world/2013_08_24_03_world_sai.sql @@ -0,0 +1,56 @@ +-- Cannot Reproduce (13320,13355) +-- Retest Now (13321,13322,13356,13357) + +SET @NPC_BLUE_KC := 32242; -- Blue Sample KC Bunny +SET @NPC_GREEN_KC := 32244; -- Green Sample KC Bunny +SET @NPC_DARK_KC := 32245; -- Dark Sample KC Bunny +SET @SPELL_COLLECT := 60256; -- Collect Sample +SET @SPELL_WRITHING := 60310; -- Throw Writhing Mass +SET @NPC_MASS_KC := 32266; -- Writhing Mass KC Bunny +SET @AURA_DISCERNMENT := 60311; -- Dark Discernment +SET @ITEM_ESSENCE := 44301; -- Tainted Essence + +UPDATE `creature_template` SET `AIName`='SmartAI',`flags_extra`=128 WHERE `entry` IN (@NPC_BLUE_KC,@NPC_GREEN_KC,@NPC_DARK_KC); +UPDATE `creature` SET `MovementType`=0 WHERE `id` IN (@NPC_BLUE_KC,@NPC_GREEN_KC,@NPC_DARK_KC); + +DELETE FROM `smart_scripts` WHERE `entryorguid` IN (@NPC_BLUE_KC,@NPC_GREEN_KC,@NPC_DARK_KC) AND `source_type`=0; +INSERT INTO `smart_scripts` (`entryorguid`,`source_type`,`id`,`link`,`event_type`,`event_phase_mask`,`event_chance`,`event_flags`,`event_param1`,`event_param2`,`event_param3`,`event_param4`,`action_type`,`action_param1`,`action_param2`,`action_param3`,`action_param4`,`action_param5`,`action_param6`,`target_type`,`target_param1`,`target_param2`,`target_param3`,`target_x`,`target_y`,`target_z`,`target_o`,`comment`) VALUES +(@NPC_BLUE_KC,0,0,0,8,0,100,0,@SPELL_COLLECT,0,0,0,33,@NPC_BLUE_KC,0,0,0,0,0,7,0,0,0,0,0,0,0,"Blue Sample KC Bunny - On spellhit - Killed moster credit"), +(@NPC_BLUE_KC,0,1,0,8,0,100,0,@SPELL_WRITHING,0,0,0,33,@NPC_MASS_KC,0,0,0,0,0,7,0,0,0,0,0,0,0,"Blue Sample KC Bunny - On spellhit - Killed moster credit"), +-- +(@NPC_GREEN_KC,0,0,0,8,0,100,0,@SPELL_COLLECT,0,0,0,33,@NPC_GREEN_KC,0,0,0,0,0,7,0,0,0,0,0,0,0,"Green Sample KC Bunny - On spellhit - Killed moster credit"), +(@NPC_GREEN_KC,0,1,0,8,0,100,0,@SPELL_WRITHING,0,0,0,33,@NPC_MASS_KC,0,0,0,0,0,7,0,0,0,0,0,0,0,"Green Sample KC Bunny - On spellhit - Killed moster credit"), +-- +(@NPC_DARK_KC,0,0,0,8,0,100,0,@SPELL_COLLECT,0,0,0,33,@NPC_DARK_KC,0,0,0,0,0,7,0,0,0,0,0,0,0,"Dark Sample KC Bunny - On spellhit - Killed moster credit"), +(@NPC_DARK_KC,0,1,0,8,0,100,0,@SPELL_WRITHING,0,0,0,33,@NPC_MASS_KC,0,0,0,0,0,7,0,0,0,0,0,0,0,"Dark Sample KC Bunny - On spellhit - Killed moster credit"); + +UPDATE `creature_template` SET `AIName`='SmartAI' WHERE `entry` IN (32290,32289); +DELETE FROM `smart_scripts` WHERE `entryorguid` IN (32290,32289) AND `source_type`= 0; +INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(32289, 0, 0, 0, 0, 0, 100, 0, 0, 0, 7000, 9000, 11, 34359, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Damned Apothecary - IC - Cast Fire Breath Potion (Self)'), +(32289, 0, 1, 0, 2, 0, 100, 0, 30, 50, 60000, 60000, 11, 17534, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Damned Apothecary - On between 30 and 50% HP - Cast Healing Potion (Self)'), +-- +(32290, 0, 0, 0, 0, 0, 100, 0, 0, 2000, 3000, 10000, 11, 60846, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 'Cultist Alchemist - IC - Cast Corrosive Vial'); + + +DELETE FROM `conditions` WHERE `SourceEntry` IN (@SPELL_COLLECT,@SPELL_WRITHING) AND `SourceTypeOrReferenceId`=13; +DELETE FROM `conditions` WHERE `SourceEntry`=@ITEM_ESSENCE AND `SourceTypeOrReferenceId`=1; +INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`SourceId`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionTarget`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`NegativeCondition`,`ErrorTextId`,`ScriptName`,`Comment`) VALUES +(13,1,@SPELL_COLLECT,0,0,31,0,3,@NPC_BLUE_KC,0,0,0,'','Spell target creature'), +(13,1,@SPELL_COLLECT,0,1,31,0,3,@NPC_GREEN_KC,0,0,0,'','Spell target creature'), +(13,1,@SPELL_COLLECT,0,2,31,0,3,@NPC_DARK_KC,0,0,0,'','Spell target creature'), +-- +(13,1,@SPELL_WRITHING,0,0,31,0,3,@NPC_BLUE_KC,0,0,0,'','Spell target creature'), +(13,1,@SPELL_WRITHING,0,1,31,0,3,@NPC_GREEN_KC,0,0,0,'','Spell target creature'), +(13,1,@SPELL_WRITHING,0,2,31,0,3,@NPC_DARK_KC,0,0,0,'','Spell target creature'), + +-- Tainted Essence drops only if player has aura +(1,32236,@ITEM_ESSENCE,0,0,1,0,@AURA_DISCERNMENT,0,0,0,0,'','Loot requires aura'), +(1,32259,@ITEM_ESSENCE,0,0,1,0,@AURA_DISCERNMENT,0,0,0,0,'','Loot requires aura'), +(1,32262,@ITEM_ESSENCE,0,0,1,0,@AURA_DISCERNMENT,0,0,0,0,'','Loot requires aura'), +(1,32268,@ITEM_ESSENCE,0,0,1,0,@AURA_DISCERNMENT,0,0,0,0,'','Loot requires aura'), +(1,32276,@ITEM_ESSENCE,0,0,1,0,@AURA_DISCERNMENT,0,0,0,0,'','Loot requires aura'), +(1,32279,@ITEM_ESSENCE,0,0,1,0,@AURA_DISCERNMENT,0,0,0,0,'','Loot requires aura'), +(1,32289,@ITEM_ESSENCE,0,0,1,0,@AURA_DISCERNMENT,0,0,0,0,'','Loot requires aura'), +(1,32290,@ITEM_ESSENCE,0,0,1,0,@AURA_DISCERNMENT,0,0,0,0,'','Loot requires aura'), +(1,32297,@ITEM_ESSENCE,0,0,1,0,@AURA_DISCERNMENT,0,0,0,0,'','Loot requires aura'); diff --git a/sql/updates/world/2013_08_25_00_world_creature.sql b/sql/updates/world/2013_08_25_00_world_creature.sql new file mode 100644 index 00000000000..4670240d797 --- /dev/null +++ b/sql/updates/world/2013_08_25_00_world_creature.sql @@ -0,0 +1 @@ +UPDATE `creature` SET `spawndist`=0 WHERE `id` IN (32242,32244,32245); diff --git a/src/server/authserver/Authentication/TOTP.cpp b/src/server/authserver/Authentication/TOTP.cpp new file mode 100644 index 00000000000..43c97c296d9 --- /dev/null +++ b/src/server/authserver/Authentication/TOTP.cpp @@ -0,0 +1,94 @@ +/* + * Copyright (C) 2008-2013 TrinityCore <http://www.trinitycore.org/> + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#include "TOTP.h" + +int base32_decode(const char* encoded, char* result, int bufSize) +{ + // Base32 implementation + // Copyright 2010 Google Inc. + // Author: Markus Gutschke + // Licensed under the Apache License, Version 2.0 + int buffer = 0; + int bitsLeft = 0; + int count = 0; + for (const char *ptr = encoded; count < bufSize && *ptr; ++ptr) + { + char ch = *ptr; + if (ch == ' ' || ch == ' ' || ch == '\r' || ch == '\n' || ch == '-') + continue; + buffer <<= 5; + + // Deal with commonly mistyped characters + if (ch == '0') + ch = 'O'; + else if (ch == '1') + ch = 'L'; + else if (ch == '8') + ch = 'B'; + + // Look up one base32 digit + if ((ch >= 'A' && ch <= 'Z') || (ch >= 'a' && ch <= 'z')) + ch = (ch & 0x1F) - 1; + else if (ch >= '2' && ch <= '7') + ch -= '2' - 26; + else + return -1; + + buffer |= ch; + bitsLeft += 5; + if (bitsLeft >= 8) + { + result[count++] = buffer >> (bitsLeft - 8); + bitsLeft -= 8; + } + } + + if (count < bufSize) + result[count] = '\000'; + return count; +} + +#define HMAC_RES_SIZE 20 + +namespace TOTP +{ + unsigned int GenerateToken(const char* b32key) + { + size_t keySize = strlen(b32key); + int bufsize = (keySize + 7)/8*5; + char* encoded = new char[bufsize]; + memset(encoded, 0, bufsize); + unsigned int hmacResSize = HMAC_RES_SIZE; + unsigned char hmacRes[HMAC_RES_SIZE]; + unsigned long timestamp = time(NULL)/30; + unsigned char challenge[8]; + + for (int i = 8; i--;timestamp >>= 8) + challenge[i] = timestamp; + + base32_decode(b32key, encoded, bufsize); + HMAC(EVP_sha1(), encoded, bufsize, challenge, 8, hmacRes, &hmacResSize); + unsigned int offset = hmacRes[19] & 0xF; + unsigned int truncHash = (hmacRes[offset] << 24) | (hmacRes[offset+1] << 16 )| (hmacRes[offset+2] << 8) | (hmacRes[offset+3]); + truncHash &= 0x7FFFFFFF; + + delete[] encoded; + + return truncHash % 1000000; + } +} diff --git a/src/server/authserver/Authentication/TOTP.h b/src/server/authserver/Authentication/TOTP.h new file mode 100644 index 00000000000..3080e7c7787 --- /dev/null +++ b/src/server/authserver/Authentication/TOTP.h @@ -0,0 +1,29 @@ +/* + * Copyright (C) 2008-2013 TrinityCore <http://www.trinitycore.org/> + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#ifndef _TOTP_H +#define _TOPT_H + +#include "openssl/hmac.h" +#include "openssl/evp.h" + +namespace TOTP +{ + unsigned int GenerateToken(const char* b32key); +} + +#endif diff --git a/src/server/authserver/Server/AuthSocket.cpp b/src/server/authserver/Server/AuthSocket.cpp index c2131f5dbf7..93c03e26c88 100644 --- a/src/server/authserver/Server/AuthSocket.cpp +++ b/src/server/authserver/Server/AuthSocket.cpp @@ -27,6 +27,7 @@ #include "RealmList.h" #include "AuthSocket.h" #include "AuthCodes.h" +#include "TOTP.h" #include "SHA1.h" #include "openssl/crypto.h" @@ -492,6 +493,12 @@ bool AuthSocket::_HandleLogonChallenge() pkt.append(s.AsByteArray().get(), s.GetNumBytes()); // 32 bytes pkt.append(unk3.AsByteArray(16).get(), 16); uint8 securityFlags = 0; + + // Check if token is used + _tokenKey = fields[8].GetString(); + if (!_tokenKey.empty()) + securityFlags = 4; + pkt << uint8(securityFlags); // security flags (0x0...0x04) if (securityFlags & 0x01) // PIN input @@ -652,6 +659,25 @@ bool AuthSocket::_HandleLogonProof() sha.UpdateBigNumbers(&A, &M, &K, NULL); sha.Finalize(); + // Check auth token + if ((lp.securityFlags & 0x04) || !_tokenKey.empty()) + { + uint8 size; + socket().recv((char*)&size, 1); + char* token = new char[size + 1]; + token[size] = '\0'; + socket().recv(token, size); + unsigned int validToken = TOTP::GenerateToken(_tokenKey.c_str()); + unsigned int incomingToken = atoi(token); + delete[] token; + if (validToken != incomingToken) + { + char data[] = { AUTH_LOGON_PROOF, WOW_FAIL_UNKNOWN_ACCOUNT, 3, 0 }; + socket().send(data, sizeof(data)); + return false; + } + } + if (_expversion & POST_BC_EXP_FLAG) // 2.x and 3.x clients { sAuthLogonProof_S proof; diff --git a/src/server/authserver/Server/AuthSocket.h b/src/server/authserver/Server/AuthSocket.h index 6c13f85a022..c6513eaa5bf 100644 --- a/src/server/authserver/Server/AuthSocket.h +++ b/src/server/authserver/Server/AuthSocket.h @@ -69,6 +69,7 @@ private: bool _authed; std::string _login; + std::string _tokenKey; // Since GetLocaleByName() is _NOT_ bijective, we have to store the locale as a string. Otherwise we can't differ // between enUS and enGB, which is important for the patch system diff --git a/src/server/collision/Maps/TileAssembler.cpp b/src/server/collision/Maps/TileAssembler.cpp index 02300c0b34a..c504d750931 100644 --- a/src/server/collision/Maps/TileAssembler.cpp +++ b/src/server/collision/Maps/TileAssembler.cpp @@ -98,7 +98,16 @@ namespace VMAP printf("Creating map tree for map %u...\n", map_iter->first); BIH pTree; - pTree.build(mapSpawns, BoundsTrait<ModelSpawn*>::getBounds); + + try + { + pTree.build(mapSpawns, BoundsTrait<ModelSpawn*>::getBounds); + } + catch (std::exception& e) + { + printf("Exception ""%s"" when calling pTree.build", e.what()); + return false; + } // ===> possibly move this code to StaticMapTree class std::map<uint32, uint32> modelNodeIdx; diff --git a/src/server/game/Chat/Chat.cpp b/src/server/game/Chat/Chat.cpp index 469a2b53b79..55440650993 100644 --- a/src/server/game/Chat/Chat.cpp +++ b/src/server/game/Chat/Chat.cpp @@ -695,13 +695,12 @@ void ChatHandler::FillMessageData(WorldPacket* data, WorldSession* session, uint *data << uint32(0); // 2.1.0 *data << uint32(speaker->GetName().size() + 1); *data << speaker->GetName(); - uint64 listener_guid = 0; - *data << uint64(listener_guid); - if (listener_guid && !IS_PLAYER_GUID(listener_guid)) - { - *data << uint32(1); // string listener_name_length - *data << uint8(0); // string listener_name - } + *data << uint64(0); // listener_guid + //if (listener_guid && !IS_PLAYER_GUID(listener_guid)) + //{ + // *data << uint32(1); // string listener_name_length + // *data << uint8(0); // string listener_name + //} *data << uint32(messageLength); *data << message; *data << uint8(0); diff --git a/src/server/game/Entities/Object/Updates/UpdateMask.h b/src/server/game/Entities/Object/Updates/UpdateMask.h index 8be8dfecdaf..72c9e9945d0 100644 --- a/src/server/game/Entities/Object/Updates/UpdateMask.h +++ b/src/server/game/Entities/Object/Updates/UpdateMask.h @@ -36,7 +36,7 @@ class UpdateMask UpdateMask() : _fieldCount(0), _blockCount(0), _bits(NULL) { } - UpdateMask(UpdateMask const& right) + UpdateMask(UpdateMask const& right) : _bits(NULL) { SetCount(right.GetCount()); memcpy(_bits, right._bits, sizeof(uint8) * _blockCount * 32); diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 3bfbc13c6c9..73f0d09cace 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -869,6 +869,8 @@ Player::Player(WorldSession* session): Unit(true), phaseMgr(this) m_WeeklyQuestChanged = false; + m_MonthlyQuestChanged = false; + m_SeasonalQuestChanged = false; SetPendingBind(0, 0); @@ -6849,10 +6851,8 @@ void Player::CheckAreaExploreAndOutdoor() } else if (diff > 5) { - int32 exploration_percent = (100-((diff-5)*5)); - if (exploration_percent > 100) - exploration_percent = 100; - else if (exploration_percent < 0) + int32 exploration_percent = 100 - ((diff - 5) * 5); + if (exploration_percent < 0) exploration_percent = 0; XP = uint32(sObjectMgr->GetBaseXP(areaEntry->area_level)*exploration_percent/100*sWorld->getRate(RATE_XP_EXPLORE)); diff --git a/src/server/game/Handlers/MiscHandler.cpp b/src/server/game/Handlers/MiscHandler.cpp index 5ad39188fbd..dc3679e021f 100644 --- a/src/server/game/Handlers/MiscHandler.cpp +++ b/src/server/game/Handlers/MiscHandler.cpp @@ -1680,9 +1680,13 @@ void WorldSession::HandleRequestPetInfoOpcode(WorldPacket& /*recvData */) void WorldSession::HandleSetTaxiBenchmarkOpcode(WorldPacket& recvData) { + TC_LOG_DEBUG(LOG_FILTER_NETWORKIO, "WORLD: CMSG_SET_TAXI_BENCHMARK_MODE"); + uint8 mode; recvData >> mode; + mode ? _player->SetFlag(PLAYER_FLAGS, PLAYER_FLAGS_TAXI_BENCHMARK) : _player->RemoveFlag(PLAYER_FLAGS, PLAYER_FLAGS_TAXI_BENCHMARK); + TC_LOG_DEBUG(LOG_FILTER_NETWORKIO, "Client used \"/timetest %d\" command", mode); } diff --git a/src/server/game/Instances/InstanceScript.h b/src/server/game/Instances/InstanceScript.h index 2d77f6792c6..44c149ba9ac 100644 --- a/src/server/game/Instances/InstanceScript.h +++ b/src/server/game/Instances/InstanceScript.h @@ -22,8 +22,6 @@ #include "ZoneScript.h" #include "World.h" #include "ObjectMgr.h" -//#include "GameObject.h" -//#include "Map.h" #define OUT_SAVE_INST_DATA TC_LOG_DEBUG(LOG_FILTER_TSCR, "Saving Instance Data for Instance %s (Map %d, Instance Id %d)", instance->GetMapName(), instance->GetId(), instance->GetInstanceId()) #define OUT_SAVE_INST_DATA_COMPLETE TC_LOG_DEBUG(LOG_FILTER_TSCR, "Saving Instance Data for Instance %s (Map %d, Instance Id %d) completed.", instance->GetMapName(), instance->GetId(), instance->GetInstanceId()) @@ -241,4 +239,16 @@ class InstanceScript : public ZoneScript MinionInfoMap minions; uint32 completedEncounters; // completed encounter mask, bit indexes are DungeonEncounter.dbc boss numbers, used for packets }; -#endif + +template<class AI, class T> +AI* GetInstanceAI(T* obj, char const* scriptName) +{ + if (InstanceMap* instance = obj->GetMap()->ToInstanceMap()) + if (instance->GetInstanceScript()) + if (instance->GetScriptId() == sObjectMgr->GetScriptId(scriptName)) + return new AI(obj); + + return NULL; +} + +#endif // TRINITY_INSTANCE_DATA_H diff --git a/src/server/game/Movement/MovementGenerators/WaypointMovementGenerator.cpp b/src/server/game/Movement/MovementGenerators/WaypointMovementGenerator.cpp index 1e275b0be9f..31da239670b 100755 --- a/src/server/game/Movement/MovementGenerators/WaypointMovementGenerator.cpp +++ b/src/server/game/Movement/MovementGenerators/WaypointMovementGenerator.cpp @@ -218,6 +218,8 @@ void FlightPathMovementGenerator::DoFinalize(Player* player) // when client side flight end early in comparison server side player->StopMoving(); } + + player->RemoveFlag(PLAYER_FLAGS, PLAYER_FLAGS_TAXI_BENCHMARK); } #define PLAYER_FLIGHT_SPEED 32.0f diff --git a/src/server/game/Spells/Auras/SpellAuras.cpp b/src/server/game/Spells/Auras/SpellAuras.cpp index 4cb6fcc40e5..363446a72d3 100644 --- a/src/server/game/Spells/Auras/SpellAuras.cpp +++ b/src/server/game/Spells/Auras/SpellAuras.cpp @@ -2236,6 +2236,7 @@ void UnitAura::FillTargetMap(std::map<Unit*, uint8> & targets, Unit* caster) } case SPELL_EFFECT_APPLY_AREA_AURA_PET: targetList.push_back(GetUnitOwner()); + // no break case SPELL_EFFECT_APPLY_AREA_AURA_OWNER: { if (Unit* owner = GetUnitOwner()->GetCharmerOrOwner()) diff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp index 22da5257663..80349754585 100644 --- a/src/server/game/Spells/Spell.cpp +++ b/src/server/game/Spells/Spell.cpp @@ -6200,6 +6200,7 @@ SpellCastResult Spell::CheckItems() return SPELL_FAILED_DONT_REPORT; } } + // no break case SPELL_EFFECT_ENCHANT_ITEM_PRISMATIC: { Item* targetItem = m_targets.GetItemTarget(); diff --git a/src/server/game/Spells/SpellMgr.cpp b/src/server/game/Spells/SpellMgr.cpp index cb0ba654b42..b34b935e975 100644 --- a/src/server/game/Spells/SpellMgr.cpp +++ b/src/server/game/Spells/SpellMgr.cpp @@ -1224,7 +1224,7 @@ void SpellMgr::LoadSpellTalentRanks() node.rank = rank + 1; node.prev = prevSpell; - node.next = node.rank < MAX_TALENT_RANK ? GetSpellInfo(talentInfo->RankID[rank + 1]) : NULL; + node.next = node.rank < MAX_TALENT_RANK ? GetSpellInfo(talentInfo->RankID[node.rank]) : NULL; mSpellChains[spellId] = node; mSpellInfoMap[spellId]->ChainEntry = &mSpellChains[spellId]; @@ -2858,6 +2858,9 @@ void SpellMgr::LoadSpellInfoCustomAttributes() { uint32 enchantId = spellInfo->Effects[j].MiscValue; SpellItemEnchantmentEntry const* enchant = sSpellItemEnchantmentStore.LookupEntry(enchantId); + if (!enchant) + break; + for (uint8 s = 0; s < MAX_ITEM_ENCHANTMENT_EFFECTS; ++s) { if (enchant->type[s] != ITEM_ENCHANTMENT_TYPE_COMBAT_SPELL) @@ -3386,10 +3389,6 @@ void SpellMgr::LoadSpellInfoCorrections() case 45602: // Ride Carpet spellInfo->Effects[EFFECT_0].BasePoints = 0; // force seat 0, vehicle doesn't have the required seat flags for "no seat specified (-1)" break; - case 59414: // Pulsing Shockwave Aura (Loken) - // this flag breaks movement, remove it - spellInfo->AttributesEx &= ~SPELL_ATTR1_CHANNELED_1; - break; case 61719: // Easter Lay Noblegarden Egg Aura - Interrupt flags copied from aura which this aura is linked with spellInfo->AuraInterruptFlags = AURA_INTERRUPT_FLAG_HITBYSPELL | AURA_INTERRUPT_FLAG_TAKE_DAMAGE; break; @@ -3785,10 +3784,10 @@ void SpellMgr::LoadSpellInfoCorrections() } } - SummonPropertiesEntry* properties = const_cast<SummonPropertiesEntry*>(sSummonPropertiesStore.LookupEntry(121)); - properties->Type = SUMMON_TYPE_TOTEM; - properties = const_cast<SummonPropertiesEntry*>(sSummonPropertiesStore.LookupEntry(647)); // 52893 - properties->Type = SUMMON_TYPE_TOTEM; + if (SummonPropertiesEntry* properties = const_cast<SummonPropertiesEntry*>(sSummonPropertiesStore.LookupEntry(121))) + properties->Type = SUMMON_TYPE_TOTEM; + if (SummonPropertiesEntry* properties = const_cast<SummonPropertiesEntry*>(sSummonPropertiesStore.LookupEntry(647))) // 52893 + properties->Type = SUMMON_TYPE_TOTEM; TC_LOG_INFO(LOG_FILTER_SERVER_LOADING, ">> Loaded SpellInfo corrections in %u ms", GetMSTimeDiffToNow(oldMSTime)); } diff --git a/src/server/game/World/World.cpp b/src/server/game/World/World.cpp index f6001e2ac7a..b92698c7daa 100644 --- a/src/server/game/World/World.cpp +++ b/src/server/game/World/World.cpp @@ -1141,7 +1141,7 @@ void World::LoadConfigSettings(bool reload) ///- Read the "Data" directory from the config file std::string dataPath = sConfigMgr->GetStringDefault("DataDir", "./"); - if (dataPath.at(dataPath.length()-1) != '/' && dataPath.at(dataPath.length()-1) != '\\') + if (dataPath.empty() || (dataPath.at(dataPath.length()-1) != '/' && dataPath.at(dataPath.length()-1) != '\\')) dataPath.push_back('/'); #if PLATFORM == PLATFORM_UNIX || PLATFORM == PLATFORM_APPLE diff --git a/src/server/scripts/Commands/cs_debug.cpp b/src/server/scripts/Commands/cs_debug.cpp index 6ef84033312..604ad76f46c 100644 --- a/src/server/scripts/Commands/cs_debug.cpp +++ b/src/server/scripts/Commands/cs_debug.cpp @@ -1323,7 +1323,35 @@ public: char* mask2 = strtok(NULL, " \n"); uint32 moveFlags = (uint32)atoi(mask1); - target->SetUnitMovementFlags(moveFlags); + + static uint32 const FlagsWithHandlers = MOVEMENTFLAG_MASK_HAS_PLAYER_STATUS_OPCODE | + MOVEMENTFLAG_WALKING | MOVEMENTFLAG_SWIMMING | + MOVEMENTFLAG_SPLINE_ENABLED; + + bool unhandledFlag = (moveFlags ^ target->GetUnitMovementFlags()) & ~FlagsWithHandlers; + + target->SetWalk(moveFlags & MOVEMENTFLAG_WALKING); + target->SetDisableGravity(moveFlags & MOVEMENTFLAG_DISABLE_GRAVITY); + target->SetSwim(moveFlags & MOVEMENTFLAG_SWIMMING); + target->SetCanFly(moveFlags & MOVEMENTFLAG_CAN_FLY); + target->SetWaterWalking(moveFlags & MOVEMENTFLAG_WATERWALKING); + target->SetFeatherFall(moveFlags & MOVEMENTFLAG_FALLING_SLOW); + target->SetHover(moveFlags & MOVEMENTFLAG_HOVER); + + if (moveFlags & (MOVEMENTFLAG_DISABLE_GRAVITY | MOVEMENTFLAG_CAN_FLY)) + moveFlags &= ~MOVEMENTFLAG_FALLING; + + if (moveFlags & MOVEMENTFLAG_ROOT) + { + target->SetControlled(true, UNIT_STATE_ROOT); + moveFlags &= ~MOVEMENTFLAG_MASK_MOVING; + } + + if (target->HasUnitMovementFlag(MOVEMENTFLAG_SPLINE_ENABLED) && !(moveFlags & MOVEMENTFLAG_SPLINE_ENABLED)) + target->StopMoving(); + + if (unhandledFlag) + target->SetUnitMovementFlags(moveFlags); if (mask2) { diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_razorgore.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_razorgore.cpp index be2aeb9e223..caf2719eff9 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_razorgore.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_razorgore.cpp @@ -169,7 +169,7 @@ public: { if (InstanceScript* instance = go->GetInstanceScript()) if (instance->GetData(DATA_EGG_EVENT) != DONE) - if (Creature* razor = Unit::GetCreature(*go, instance ? instance->GetData64(DATA_RAZORGORE_THE_UNTAMED) : 0)) + if (Creature* razor = Unit::GetCreature(*go, instance->GetData64(DATA_RAZORGORE_THE_UNTAMED))) { razor->Attack(player, true); player->CastSpell(razor, SPELL_MINDCONTROL); diff --git a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_eredar_twins.cpp b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_eredar_twins.cpp index 0e58cb85c4b..d402eccedd4 100644 --- a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_eredar_twins.cpp +++ b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_eredar_twins.cpp @@ -473,6 +473,7 @@ public: { case SPELL_BLAZE: target->CastSpell(target, SPELL_BLAZE_SUMMON, true); + break; case SPELL_CONFLAGRATION: case SPELL_FLAME_SEAR: HandleTouchedSpells(target, SPELL_FLAME_TOUCHED); diff --git a/src/server/scripts/EasternKingdoms/zone_western_plaguelands.cpp b/src/server/scripts/EasternKingdoms/zone_western_plaguelands.cpp index 4057f4070b1..8937e896faf 100644 --- a/src/server/scripts/EasternKingdoms/zone_western_plaguelands.cpp +++ b/src/server/scripts/EasternKingdoms/zone_western_plaguelands.cpp @@ -361,13 +361,12 @@ public: break; case 15: Talk(SAY_WP_2); + break; case 21: Theldanis = GetClosestCreatureWithEntry(me, NPC_THEL_DANIS, 150); if (Theldanis) Theldanis->AI()->Talk(SAY_WP_3); break; - case 22: - 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) diff --git a/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/ahnkahet.h b/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/ahnkahet.h index 8473ee1d39d..5b8cf0a4d44 100644 --- a/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/ahnkahet.h +++ b/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/ahnkahet.h @@ -18,33 +18,71 @@ #ifndef AHNKAHET_H_ #define AHNKAHET_H_ -enum Data64 +#define AhnKahetScriptName "instance_ahnkahet" + +uint32 const EncounterCount = 5; + +enum DataTypes +{ + // Encounter States/Boss GUIDs + DATA_ELDER_NADOX = 0, + DATA_PRINCE_TALDARAM = 1, + DATA_JEDOGA_SHADOWSEEKER = 2, + DATA_AMANITAR = 3, + DATA_HERALD_VOLAZJ = 4, + + // Additional Data + DATA_SPHERE_1 = 5, + DATA_SPHERE_2 = 6, + DATA_PRINCE_TALDARAM_PLATFORM = 7, + DATA_PL_JEDOGA_TARGET = 8, + DATA_ADD_JEDOGA_OPFER = 9, + DATA_ADD_JEDOGA_INITIAND = 10, + DATA_JEDOGA_TRIGGER_SWITCH = 11, + DATA_JEDOGA_RESET_INITIANDS = 12, + DATA_ALL_INITIAND_DEAD = 13 +}; + +enum CreatureIds { - DATA_ELDER_NADOX, - DATA_PRINCE_TALDARAM, - DATA_JEDOGA_SHADOWSEEKER, - DATA_HERALD_VOLAZJ, - DATA_AMANITAR, - DATA_SPHERE1, - DATA_SPHERE2, - DATA_PRINCE_TALDARAM_PLATFORM, - DATA_PL_JEDOGA_TARGET, - DATA_ADD_JEDOGA_OPFER, - DATA_ADD_JEDOGA_INITIAND + NPC_ELDER_NADOX = 29309, + NPC_PRINCE_TALDARAM = 29308, + NPC_JEDOGA_SHADOWSEEKER = 29310, + NPC_AMANITAR = 30258, + NPC_HERALD_VOLAZJ = 29311, + + // Elder Nadox + NPC_AHNKAHAR_GUARDIAN = 30176, + NPC_AHNKAHAR_SWARMER = 30178, + + // Jedoga Shadowseeker + NPC_INITIAND = 30114, + NPC_JEDOGA_CONTROLLER = 30181, + + // Amanitar + NPC_HEALTHY_MUSHROOM = 30391, + NPC_POISONOUS_MUSHROOM = 30435, + + // Herald Volazj + //NPC_TWISTED_VISAGE_1 = 30621, + //NPC_TWISTED_VISAGE_2 = 30622, + //NPC_TWISTED_VISAGE_3 = 30623, + //NPC_TWISTED_VISAGE_4 = 30624, + NPC_TWISTED_VISAGE = 30625 }; -enum Data +enum GameObjectIds { - DATA_ELDER_NADOX_EVENT, - DATA_PRINCE_TALDARAM_EVENT, - DATA_JEDOGA_SHADOWSEEKER_EVENT, - DATA_HERALD_VOLAZJ_EVENT, - DATA_AMANITAR_EVENT, - DATA_SPHERE1_EVENT, - DATA_SPHERE2_EVENT, - DATA_JEDOGA_TRIGGER_SWITCH, - DATA_JEDOGA_RESET_INITIANDS, - DATA_ALL_INITIAND_DEAD + GO_PRINCE_TALDARAM_GATE = 192236, + GO_PRINCE_TALDARAM_PLATFORM = 193564, + GO_SPHERE_1 = 193093, + GO_SPHERE_2 = 193094 }; +template<class AI> +AI* GetAhnKahetAI(Creature* creature) +{ + return GetInstanceAI<AI>(creature, AhnKahetScriptName); +} + #endif // AHNKAHET_H_ diff --git a/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_amanitar.cpp b/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_amanitar.cpp index 7a20d1f581c..7132ba825f1 100644 --- a/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_amanitar.cpp +++ b/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_amanitar.cpp @@ -35,8 +35,6 @@ enum Spells enum Creatures { - NPC_HEALTHY_MUSHROOM = 30391, - NPC_POISONOUS_MUSHROOM = 30435, NPC_TRIGGER = 19656 }; @@ -52,129 +50,112 @@ enum Events class boss_amanitar : public CreatureScript { -public: - boss_amanitar() : CreatureScript("boss_amanitar") { } - - struct boss_amanitarAI : public BossAI - { - boss_amanitarAI(Creature* creature) : BossAI(creature, DATA_AMANITAR) { } + public: + boss_amanitar() : CreatureScript("boss_amanitar") { } - void Reset() OVERRIDE + struct boss_amanitarAI : public BossAI { - _Reset(); + boss_amanitarAI(Creature* creature) : BossAI(creature, DATA_AMANITAR) { } - me->SetMeleeDamageSchool(SPELL_SCHOOL_NATURE); - me->ApplySpellImmune(0, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_NATURE, true); - summons.DespawnAll(); + void Reset() OVERRIDE + { + _Reset(); + me->SetMeleeDamageSchool(SPELL_SCHOOL_NATURE); + me->ApplySpellImmune(0, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_NATURE, true); + } - if (instance) + void EnterCombat(Unit* /*who*/) OVERRIDE { - instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_MINI); - instance->SetData(DATA_AMANITAR_EVENT, NOT_STARTED); + _EnterCombat(); + + events.ScheduleEvent(EVENT_ROOT, urand(5, 9) * IN_MILLISECONDS); + events.ScheduleEvent(EVENT_BASH, urand(10, 14) * IN_MILLISECONDS); + events.ScheduleEvent(EVENT_BOLT, urand(15, 20) * IN_MILLISECONDS); + events.ScheduleEvent(EVENT_MINI, urand(12, 18) * IN_MILLISECONDS); + events.ScheduleEvent(EVENT_SPAWN, 5 * IN_MILLISECONDS); } - } - void JustDied(Unit* /*Killer*/) OVERRIDE - { - if (instance) + void JustDied(Unit* /*killer*/) OVERRIDE { _JustDied(); - instance->SetData(DATA_AMANITAR_EVENT, DONE); instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_MINI); - summons.DespawnAll(); } - } - - void EnterCombat(Unit* /*who*/) OVERRIDE - { - _EnterCombat(); - - events.ScheduleEvent(EVENT_ROOT, urand(5, 9) * IN_MILLISECONDS); - events.ScheduleEvent(EVENT_BASH, urand(10, 14) * IN_MILLISECONDS); - events.ScheduleEvent(EVENT_BOLT, urand(15, 20) * IN_MILLISECONDS); - events.ScheduleEvent(EVENT_MINI, urand(12, 18) * IN_MILLISECONDS); - events.ScheduleEvent(EVENT_SPAWN, 5 * IN_MILLISECONDS); - me->SetInCombatWithZone(); - if (instance) - instance->SetData(DATA_AMANITAR_EVENT, IN_PROGRESS); - } - - void SpawnAdds() - { - uint8 u = 0; - - for (uint8 i = 0; i < 30; ++i) + void SpawnAdds() { - Position pos; - me->GetPosition(&pos); - me->GetRandomNearPosition(pos, 30.0f); - pos.m_positionZ = me->GetMap()->GetHeight(pos.GetPositionX(), pos.GetPositionY(), MAX_HEIGHT) + 2.0f; + uint8 u = 0; - if (Creature* trigger = me->SummonCreature(NPC_TRIGGER, pos)) + for (uint8 i = 0; i < 30; ++i) { - Creature* temp1 = trigger->FindNearestCreature(NPC_HEALTHY_MUSHROOM, 4.0f, true); - Creature* temp2 = trigger->FindNearestCreature(NPC_POISONOUS_MUSHROOM, 4.0f, true); - if (temp1 || temp2) - { - trigger->DisappearAndDie(); - } - else + Position pos; + me->GetPosition(&pos); + me->GetRandomNearPosition(pos, 30.0f); + pos.m_positionZ = me->GetMap()->GetHeight(pos.GetPositionX(), pos.GetPositionY(), MAX_HEIGHT) + 2.0f; + + if (Creature* trigger = me->SummonCreature(NPC_TRIGGER, pos)) { - u = 1 - u; - trigger->DisappearAndDie(); - me->SummonCreature(u > 0 ? NPC_POISONOUS_MUSHROOM : NPC_HEALTHY_MUSHROOM, pos, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 60 * IN_MILLISECONDS); + Creature* temp1 = trigger->FindNearestCreature(NPC_HEALTHY_MUSHROOM, 4.0f, true); + Creature* temp2 = trigger->FindNearestCreature(NPC_POISONOUS_MUSHROOM, 4.0f, true); + if (temp1 || temp2) + { + trigger->DisappearAndDie(); + } + else + { + u = 1 - u; + trigger->DisappearAndDie(); + me->SummonCreature(u > 0 ? NPC_POISONOUS_MUSHROOM : NPC_HEALTHY_MUSHROOM, pos, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 60 * IN_MILLISECONDS); + } } } } - } - void UpdateAI(uint32 diff) OVERRIDE - { - if (!UpdateVictim()) - return; + void UpdateAI(uint32 diff) OVERRIDE + { + if (!UpdateVictim()) + return; - events.Update(diff); + events.Update(diff); - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; - while (uint32 eventId = events.ExecuteEvent()) - { - switch (eventId) + while (uint32 eventId = events.ExecuteEvent()) { - case EVENT_SPAWN: - SpawnAdds(); - events.ScheduleEvent(EVENT_SPAWN, 20 * IN_MILLISECONDS); - break; - case EVENT_MINI: - DoCast(SPELL_MINI); - events.ScheduleEvent(EVENT_MINI, urand(25, 30) * IN_MILLISECONDS); - break; - case EVENT_ROOT: - DoCast(SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true), SPELL_ENTANGLING_ROOTS, true); - events.ScheduleEvent(EVENT_ROOT, urand(10, 15) * IN_MILLISECONDS); - break; - case EVENT_BASH: - DoCastVictim(SPELL_BASH); - events.ScheduleEvent(EVENT_BASH, urand(7, 12) * IN_MILLISECONDS); - break; - case EVENT_BOLT: - DoCast(SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true), SPELL_VENOM_BOLT_VOLLEY, true); - events.ScheduleEvent(EVENT_BOLT, urand(18, 22) * IN_MILLISECONDS); - break; - default: - break; + switch (eventId) + { + case EVENT_SPAWN: + SpawnAdds(); + events.ScheduleEvent(EVENT_SPAWN, 20 * IN_MILLISECONDS); + break; + case EVENT_MINI: + DoCast(SPELL_MINI); + events.ScheduleEvent(EVENT_MINI, urand(25, 30) * IN_MILLISECONDS); + break; + case EVENT_ROOT: + DoCast(SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true), SPELL_ENTANGLING_ROOTS, true); + events.ScheduleEvent(EVENT_ROOT, urand(10, 15) * IN_MILLISECONDS); + break; + case EVENT_BASH: + DoCastVictim(SPELL_BASH); + events.ScheduleEvent(EVENT_BASH, urand(7, 12) * IN_MILLISECONDS); + break; + case EVENT_BOLT: + DoCast(SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true), SPELL_VENOM_BOLT_VOLLEY, true); + events.ScheduleEvent(EVENT_BOLT, urand(18, 22) * IN_MILLISECONDS); + break; + default: + break; + } } + DoMeleeAttackIfReady(); } - DoMeleeAttackIfReady(); - } - }; + }; - CreatureAI* GetAI(Creature* creature) const OVERRIDE - { - return new boss_amanitarAI(creature); - } + CreatureAI* GetAI(Creature* creature) const OVERRIDE + { + return GetAhnKahetAI<boss_amanitarAI>(creature); + } }; class npc_amanitar_mushrooms : public CreatureScript diff --git a/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_elder_nadox.cpp b/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_elder_nadox.cpp index 482617cbfd5..4fa150511b5 100644 --- a/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_elder_nadox.cpp +++ b/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_elder_nadox.cpp @@ -41,12 +41,6 @@ enum Spells SPELL_GUARDIAN_AURA = 56151 }; -enum Creatures -{ - NPC_AHNKAHAR_SWARMER = 30178, - NPC_AHNKAHAR_GUARDIAN = 30176 -}; - enum Events { EVENT_PLAGUE = 1, @@ -62,38 +56,22 @@ class boss_elder_nadox : public CreatureScript public: boss_elder_nadox() : CreatureScript("boss_elder_nadox") { } - struct boss_elder_nadoxAI : public ScriptedAI + struct boss_elder_nadoxAI : public BossAI { - boss_elder_nadoxAI(Creature* creature) : ScriptedAI(creature), summons(me) - { - instance = creature->GetInstanceScript(); - } - - bool GuardianDied; - uint8 AmountHealthModifier; - InstanceScript* instance; - SummonList summons; - EventMap events; + boss_elder_nadoxAI(Creature* creature) : BossAI(creature, DATA_ELDER_NADOX) { } void Reset() OVERRIDE { - events.Reset(); - summons.DespawnAll(); - + _Reset(); AmountHealthModifier = 1; GuardianDied = false; - - if (instance) - instance->SetData(DATA_ELDER_NADOX_EVENT, NOT_STARTED); } void EnterCombat(Unit* /*who*/) OVERRIDE { + _EnterCombat(); Talk(SAY_AGGRO); - if (instance) - instance->SetData(DATA_ELDER_NADOX_EVENT, IN_PROGRESS); - events.ScheduleEvent(EVENT_PLAGUE, 13 * IN_MILLISECONDS); events.ScheduleEvent(EVENT_SUMMON_SWARMER, 10 * IN_MILLISECONDS); @@ -104,12 +82,6 @@ class boss_elder_nadox : public CreatureScript } } - void JustSummoned(Creature* summon) OVERRIDE - { - summons.Summon(summon); - summon->AI()->DoZoneInCombat(); - } - void SummonedCreatureDies(Creature* summon, Unit* /*killer*/) OVERRIDE { if (summon->GetEntry() == NPC_AHNKAHAR_GUARDIAN) @@ -124,19 +96,16 @@ class boss_elder_nadox : public CreatureScript return 0; } - void KilledUnit(Unit* /*victim*/) OVERRIDE + void KilledUnit(Unit* who) OVERRIDE { - Talk(SAY_SLAY); + if (who->GetTypeId() == TYPEID_PLAYER) + Talk(SAY_SLAY); } void JustDied(Unit* /*killer*/) OVERRIDE { + _JustDied(); Talk(SAY_DEATH); - - summons.DespawnAll(); - - if (instance) - instance->SetData(DATA_ELDER_NADOX_EVENT, DONE); } void UpdateAI(uint32 diff) OVERRIDE @@ -185,11 +154,15 @@ class boss_elder_nadox : public CreatureScript DoMeleeAttackIfReady(); } + + private: + bool GuardianDied; + uint8 AmountHealthModifier; }; CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new boss_elder_nadoxAI(creature); + return GetAhnKahetAI<boss_elder_nadoxAI>(creature); } }; diff --git a/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_herald_volazj.cpp b/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_herald_volazj.cpp index 481df79c890..5bb68a4c886 100644 --- a/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_herald_volazj.cpp +++ b/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_herald_volazj.cpp @@ -41,12 +41,6 @@ enum Spells SPELL_INSANITY_PHASING_5 = 57512 }; -enum Creatures -{ - NPC_TWISTED_VISAGE = 30625 -}; - - enum Yells { SAY_AGGRO = 0, @@ -157,7 +151,7 @@ public: if (instance) { - instance->SetData(DATA_HERALD_VOLAZJ, NOT_STARTED); + instance->SetBossState(DATA_HERALD_VOLAZJ, NOT_STARTED); instance->DoStopTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_QUICK_DEMISE_START_EVENT); } @@ -180,7 +174,7 @@ public: if (instance) { - instance->SetData(DATA_HERALD_VOLAZJ, IN_PROGRESS); + instance->SetBossState(DATA_HERALD_VOLAZJ, IN_PROGRESS); instance->DoStartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_QUICK_DEMISE_START_EVENT); } } @@ -302,7 +296,7 @@ public: Talk(SAY_DEATH); if (instance) - instance->SetData(DATA_HERALD_VOLAZJ, DONE); + instance->SetBossState(DATA_HERALD_VOLAZJ, DONE); Summons.DespawnAll(); ResetPlayersPhaseMask(); diff --git a/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_jedoga_shadowseeker.cpp b/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_jedoga_shadowseeker.cpp index 5095f590fdb..78513fec486 100644 --- a/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_jedoga_shadowseeker.cpp +++ b/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_jedoga_shadowseeker.cpp @@ -46,11 +46,6 @@ enum Spells SPELL_THUNDERSHOCK_H = 60029 // 30Y }; -enum Creatures -{ - NPC_JEDOGA_CONTROLLER = 30181 -}; - const Position JedogaPosition[2] = { {372.330994f, -705.278015f, -0.624178f, 5.427970f}, @@ -109,7 +104,7 @@ public: if (instance) { if (!bFirstTime) - instance->SetData(DATA_JEDOGA_SHADOWSEEKER_EVENT, FAIL); + instance->SetBossState(DATA_JEDOGA_SHADOWSEEKER, FAIL); instance->SetData64(DATA_PL_JEDOGA_TARGET, 0); instance->SetData64(DATA_ADD_JEDOGA_OPFER, 0); @@ -127,7 +122,7 @@ public: Talk(TEXT_AGGRO); me->SetInCombatWithZone(); - instance->SetData(DATA_JEDOGA_SHADOWSEEKER_EVENT, IN_PROGRESS); + instance->SetBossState(DATA_JEDOGA_SHADOWSEEKER, IN_PROGRESS); } void AttackStart(Unit* who) OVERRIDE @@ -150,7 +145,7 @@ public: { Talk(TEXT_DEATH); if (instance) - instance->SetData(DATA_JEDOGA_SHADOWSEEKER_EVENT, DONE); + instance->SetBossState(DATA_JEDOGA_SHADOWSEEKER, DONE); } void DoAction(int32 action) OVERRIDE @@ -168,7 +163,6 @@ public: } void MoveInLineOfSight(Unit* who) OVERRIDE - { if (!instance || !who || (who->GetTypeId() == TYPEID_UNIT && who->GetEntry() == NPC_JEDOGA_CONTROLLER)) return; @@ -179,7 +173,7 @@ public: bPreDone = true; } - if (instance->GetData(DATA_JEDOGA_SHADOWSEEKER_EVENT) != IN_PROGRESS || !bOnGround) + if (instance->GetBossState(DATA_JEDOGA_SHADOWSEEKER) != IN_PROGRESS || !bOnGround) return; if (!me->GetVictim() && me->CanCreatureAttack(who)) @@ -229,7 +223,7 @@ public: { AttackStart(target); instance->SetData(DATA_JEDOGA_RESET_INITIANDS, 0); - if (instance->GetData(DATA_JEDOGA_SHADOWSEEKER_EVENT) != IN_PROGRESS) + if (instance->GetBossState(DATA_JEDOGA_SHADOWSEEKER) != IN_PROGRESS) EnterCombat(target); } else if (!me->IsInCombat()) @@ -252,7 +246,8 @@ public: me->GetMotionMaster()->MovePoint(0, JedogaPosition[0]); instance->SetData(DATA_JEDOGA_TRIGGER_SWITCH, 1); - if (instance->GetData(DATA_JEDOGA_SHADOWSEEKER_EVENT) == IN_PROGRESS) OpferRufen(); + if (instance->GetBossState(DATA_JEDOGA_SHADOWSEEKER) == IN_PROGRESS) + OpferRufen(); bOnGround = false; uiOpFerTimer = urand(15*IN_MILLISECONDS, 30*IN_MILLISECONDS); @@ -289,7 +284,7 @@ public: if (!instance) return; - if (instance->GetData(DATA_JEDOGA_SHADOWSEEKER_EVENT) != IN_PROGRESS && instance->GetData(DATA_ALL_INITIAND_DEAD)) + if (instance->GetBossState(DATA_JEDOGA_SHADOWSEEKER) != IN_PROGRESS && instance->GetData(DATA_ALL_INITIAND_DEAD)) MoveDown(); if (bOpFerok && !bOnGround && !bCanDown) Opfern(); @@ -372,7 +367,7 @@ public: bWalking = false; bCheckTimer = 2*IN_MILLISECONDS; - if (instance->GetData(DATA_JEDOGA_SHADOWSEEKER_EVENT) != IN_PROGRESS) + if (instance->GetBossState(DATA_JEDOGA_SHADOWSEEKER) != IN_PROGRESS) { me->RemoveAurasDueToSpell(SPELL_SPHERE_VISUAL); me->ApplySpellImmune(0, IMMUNITY_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, false); @@ -412,15 +407,13 @@ public: instance->SetData64(DATA_PL_JEDOGA_TARGET, killer->GetGUID()); } - void EnterCombat(Unit* who) OVERRIDE + void EnterCombat(Unit* /*who*/) OVERRIDE { - if ((instance && instance->GetData(DATA_JEDOGA_SHADOWSEEKER_EVENT) == IN_PROGRESS) || !who) - return; } void AttackStart(Unit* victim) OVERRIDE { - if ((instance && instance->GetData(DATA_JEDOGA_SHADOWSEEKER_EVENT) == IN_PROGRESS) || !victim) + if ((instance && instance->GetBossState(DATA_JEDOGA_SHADOWSEEKER) == IN_PROGRESS) || !victim) return; ScriptedAI::AttackStart(victim); @@ -429,7 +422,7 @@ public: void MoveInLineOfSight(Unit* who) OVERRIDE { - if ((instance && instance->GetData(DATA_JEDOGA_SHADOWSEEKER_EVENT) == IN_PROGRESS) || !who) + if ((instance && instance->GetBossState(DATA_JEDOGA_SHADOWSEEKER) == IN_PROGRESS) || !who) return; ScriptedAI::MoveInLineOfSight(who); @@ -482,14 +475,14 @@ public: } if (!bWalking) { - if (instance->GetData(DATA_JEDOGA_SHADOWSEEKER_EVENT) != IN_PROGRESS && me->HasAura(SPELL_SPHERE_VISUAL)) + if (instance->GetBossState(DATA_JEDOGA_SHADOWSEEKER) != IN_PROGRESS && me->HasAura(SPELL_SPHERE_VISUAL)) { me->RemoveAurasDueToSpell(SPELL_SPHERE_VISUAL); me->ApplySpellImmune(0, IMMUNITY_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, false); me->ApplySpellImmune(0, IMMUNITY_DAMAGE, SPELL_SCHOOL_MASK_MAGIC, false); me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE + UNIT_FLAG_NON_ATTACKABLE); } - if (instance->GetData(DATA_JEDOGA_SHADOWSEEKER_EVENT) == IN_PROGRESS && !me->HasAura(SPELL_SPHERE_VISUAL)) + if (instance->GetBossState(DATA_JEDOGA_SHADOWSEEKER) == IN_PROGRESS && !me->HasAura(SPELL_SPHERE_VISUAL)) { DoCast(me, SPELL_SPHERE_VISUAL, false); me->ApplySpellImmune(0, IMMUNITY_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, true); @@ -561,7 +554,7 @@ public: if (!bRemoved && me->GetPositionX() > 440.0f) { - if (instance->GetData(DATA_PRINCE_TALDARAM_EVENT) == DONE) + if (instance->GetBossState(DATA_PRINCE_TALDARAM) == DONE) { me->InterruptNonMeleeSpells(true); bRemoved = true; @@ -585,7 +578,7 @@ public: me->InterruptNonMeleeSpells(true); bCasted2 = false; } - if (!bRemoved2 && instance->GetData(DATA_JEDOGA_SHADOWSEEKER_EVENT) == DONE) + if (!bRemoved2 && instance->GetBossState(DATA_JEDOGA_SHADOWSEEKER) == DONE) { me->InterruptNonMeleeSpells(true); bRemoved2 = true; diff --git a/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_prince_taldaram.cpp b/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_prince_taldaram.cpp index 2cfc714c1f7..2f01cc734e6 100644 --- a/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_prince_taldaram.cpp +++ b/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_prince_taldaram.cpp @@ -69,11 +69,6 @@ enum CombatPhase VANISHED, FEEDING }; -enum GameObjects -{ - GO_SPHERE1 = 193093, - GO_SPHERE2 = 193094 -}; class boss_taldaram : public CreatureScript { @@ -113,13 +108,13 @@ public: uiPhaseTimer = 0; uiEmbraceTarget = 0; if (instance) - instance->SetData(DATA_PRINCE_TALDARAM_EVENT, NOT_STARTED); + instance->SetBossState(DATA_PRINCE_TALDARAM, NOT_STARTED); } void EnterCombat(Unit* /*who*/) OVERRIDE { if (instance) - instance->SetData(DATA_PRINCE_TALDARAM_EVENT, IN_PROGRESS); + instance->SetBossState(DATA_PRINCE_TALDARAM, IN_PROGRESS); Talk(SAY_AGGRO); } @@ -267,7 +262,7 @@ public: Talk(SAY_DEATH); if (instance) - instance->SetData(DATA_PRINCE_TALDARAM_EVENT, DONE); + instance->SetBossState(DATA_PRINCE_TALDARAM, DONE); } void KilledUnit(Unit* victim) OVERRIDE @@ -287,21 +282,10 @@ public: bool CheckSpheres() { - if (!instance) - return false; - - uint64 uiSphereGuids[2]; - uiSphereGuids[0] = instance->GetData64(DATA_SPHERE1); - uiSphereGuids[1] = instance->GetData64(DATA_SPHERE2); - - for (uint8 i=0; i < 2; ++i) - { - GameObject* pSpheres = instance->instance->GetGameObject(uiSphereGuids[i]); - if (!pSpheres) + for (uint8 i = 0; i < 2; ++i) + if (!instance->GetData(DATA_SPHERE_1 + i)) return false; - if (pSpheres->GetGoState() != GO_STATE_ACTIVE) - return false; - } + RemovePrison(); return true; } @@ -332,7 +316,7 @@ public: CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new boss_taldaramAI(creature); + return GetAhnKahetAI<boss_taldaramAI>(creature); } }; @@ -390,39 +374,38 @@ public: class prince_taldaram_sphere : public GameObjectScript { -public: - prince_taldaram_sphere() : GameObjectScript("prince_taldaram_sphere") { } - - bool OnGossipHello(Player* /*player*/, GameObject* go) OVERRIDE - { - InstanceScript* instance = go->GetInstanceScript(); - if (!instance) - return true; + public: + prince_taldaram_sphere() : GameObjectScript("prince_taldaram_sphere") { } - Creature* pPrinceTaldaram = Unit::GetCreature(*go, instance->GetData64(DATA_PRINCE_TALDARAM)); - if (pPrinceTaldaram && pPrinceTaldaram->IsAlive()) + bool OnGossipHello(Player* /*player*/, GameObject* go) { - // maybe these are hacks :( - go->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE); - go->SetGoState(GO_STATE_ACTIVE); + InstanceScript* instance = go->GetInstanceScript(); + if (!instance) + return false; - switch (go->GetEntry()) + Creature* PrinceTaldaram = ObjectAccessor::GetCreature(*go, instance->GetData64(DATA_PRINCE_TALDARAM)); + if (PrinceTaldaram && PrinceTaldaram->IsAlive()) { - case GO_SPHERE1: - instance->SetData(DATA_SPHERE1_EVENT, IN_PROGRESS); - pPrinceTaldaram->AI()->Talk(SAY_1); - break; + // maybe these are hacks :( + go->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE); + go->SetGoState(GO_STATE_ACTIVE); - case GO_SPHERE2: - instance->SetData(DATA_SPHERE2_EVENT, IN_PROGRESS); - pPrinceTaldaram->AI()->Talk(SAY_1); - break; - } + switch (go->GetEntry()) + { + case GO_SPHERE_1: + instance->SetData(DATA_SPHERE_1, IN_PROGRESS); + PrinceTaldaram->AI()->Talk(SAY_1); + break; + case GO_SPHERE_2: + instance->SetData(DATA_SPHERE_2, IN_PROGRESS); + PrinceTaldaram->AI()->Talk(SAY_1); + break; + } - CAST_AI(boss_taldaram::boss_taldaramAI, pPrinceTaldaram->AI())->CheckSpheres(); + CAST_AI(boss_taldaram::boss_taldaramAI, PrinceTaldaram->AI())->CheckSpheres(); + } + return true; } - return true; - } }; void AddSC_boss_taldaram() diff --git a/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/instance_ahnkahet.cpp b/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/instance_ahnkahet.cpp index a7b82583d08..7207bbd3aab 100644 --- a/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/instance_ahnkahet.cpp +++ b/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/instance_ahnkahet.cpp @@ -20,321 +20,314 @@ #include "InstanceScript.h" #include "ahnkahet.h" -/* Ahn'kahet encounters: -0 - Elder Nadox -1 - Prince Taldaram -2 - Jedoga Shadowseeker -3 - Herald Volazj -4 - Amanitar (Heroic only) -*/ - -#define MAX_ENCOUNTER 5 - -enum Achievements +DoorData const doorData[] = { - ACHIEV_VOLUNTEER_WORK = 2056 + { GO_PRINCE_TALDARAM_GATE, DATA_PRINCE_TALDARAM, DOOR_TYPE_PASSAGE, BOUNDARY_NONE }, + { 0, 0, DOOR_TYPE_ROOM, BOUNDARY_NONE } // END }; class instance_ahnkahet : public InstanceMapScript { -public: - instance_ahnkahet() : InstanceMapScript("instance_ahnkahet", 619) { } - - struct instance_ahnkahet_InstanceScript : public InstanceScript - { - instance_ahnkahet_InstanceScript(Map* map) : InstanceScript(map) {} - - uint64 Elder_Nadox; - uint64 Prince_Taldaram; - uint64 Jedoga_Shadowseeker; - uint64 Herald_Volazj; - uint64 Amanitar; - - uint64 Prince_TaldaramSpheres[2]; - uint64 Prince_TaldaramPlatform; - uint64 Prince_TaldaramGate; - - std::set<uint64> InitiandGUIDs; - uint64 JedogaSacrifices; - uint64 JedogaTarget; + public: + instance_ahnkahet() : InstanceMapScript(AhnKahetScriptName, 619) { } - uint32 m_auiEncounter[MAX_ENCOUNTER]; - uint32 spheres[2]; + struct instance_ahnkahet_InstanceScript : public InstanceScript + { + instance_ahnkahet_InstanceScript(Map* map) : InstanceScript(map) + { + SetBossNumber(EncounterCount); + LoadDoorData(doorData); - uint8 InitiandCnt; - uint8 switchtrigger; + ElderNadoxGUID = 0; + PrinceTaldaramGUID = 0; + JedogaShadowseekerGUID = 0; + AmanitarGUID = 0; + HeraldVolazjGUID = 0; - std::string str_data; + PrinceTaldaramPlatformGUID = 0; + JedogaSacrifices = 0; + JedogaTarget = 0; + SwitchTrigger = 0; - void Initialize() OVERRIDE - { - memset(&m_auiEncounter, 0, sizeof(m_auiEncounter)); - InitiandGUIDs.clear(); - - Elder_Nadox =0; - Prince_Taldaram =0; - Jedoga_Shadowseeker =0; - Herald_Volazj =0; - Amanitar =0; - - spheres[0] = NOT_STARTED; - spheres[1] = NOT_STARTED; - - InitiandCnt = 0; - switchtrigger = 0; - JedogaSacrifices = 0; - JedogaTarget = 0; - } + SpheresState[0] = 0; + SpheresState[1] = 0; - bool IsEncounterInProgress() const OVERRIDE - { - for (uint8 i = 0; i < MAX_ENCOUNTER; ++i) - if (m_auiEncounter[i] == IN_PROGRESS) - return true; + InitiandGUIDs.clear(); + } - return false; - } + void OnCreatureCreate(Creature* creature) OVERRIDE + { + switch (creature->GetEntry()) + { + case NPC_ELDER_NADOX: + ElderNadoxGUID = creature->GetGUID(); + break; + case NPC_PRINCE_TALDARAM: + PrinceTaldaramGUID = creature->GetGUID(); + break; + case NPC_JEDOGA_SHADOWSEEKER: + JedogaShadowseekerGUID = creature->GetGUID(); + break; + case NPC_AMANITAR: + AmanitarGUID = creature->GetGUID(); + break; + case NPC_HERALD_VOLAZJ: + HeraldVolazjGUID = creature->GetGUID(); + break; + case NPC_INITIAND: + InitiandGUIDs.insert(creature->GetGUID()); + break; + default: + break; + } + } - void OnCreatureCreate(Creature* creature) OVERRIDE - { - switch (creature->GetEntry()) + void OnGameObjectCreate(GameObject* go) OVERRIDE { - case 29309: Elder_Nadox = creature->GetGUID(); break; - case 29308: Prince_Taldaram = creature->GetGUID(); break; - case 29310: Jedoga_Shadowseeker = creature->GetGUID(); break; - case 29311: Herald_Volazj = creature->GetGUID(); break; - case 30258: Amanitar = creature->GetGUID(); break; - case 30114: InitiandGUIDs.insert(creature->GetGUID()); break; + switch (go->GetEntry()) + { + case GO_PRINCE_TALDARAM_PLATFORM: + PrinceTaldaramPlatformGUID = go->GetGUID(); + if (GetBossState(DATA_PRINCE_TALDARAM) == DONE) + HandleGameObject(0, true, go); + break; + case GO_SPHERE_1: + if (SpheresState[0]) + { + go->SetGoState(GO_STATE_ACTIVE); + go->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE); + } + else + go->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE); + break; + case GO_SPHERE_2: + if (SpheresState[1]) + { + go->SetGoState(GO_STATE_ACTIVE); + go->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE); + } + else + go->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE); + break; + case GO_PRINCE_TALDARAM_GATE: + AddDoor(go, true); + break; + default: + break; + } } - } - void OnGameObjectCreate(GameObject* go) OVERRIDE - { - switch (go->GetEntry()) + void OnGameObjectRemove(GameObject* go) OVERRIDE { - case 193564: - Prince_TaldaramPlatform = go->GetGUID(); - if (m_auiEncounter[1] == DONE) - HandleGameObject(0, true, go); - break; - - case 193093: - Prince_TaldaramSpheres[0] = go->GetGUID(); - if (spheres[0] == IN_PROGRESS) - { - go->SetGoState(GO_STATE_ACTIVE); - go->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE); - } - else - go->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE); - break; - case 193094: - Prince_TaldaramSpheres[1] = go->GetGUID(); - if (spheres[1] == IN_PROGRESS) - { - go->SetGoState(GO_STATE_ACTIVE); - go->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE); - } - else - go->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE); - break; - case 192236: - Prince_TaldaramGate = go->GetGUID(); // Web gate past Prince Taldaram - if (m_auiEncounter[1] == DONE) - HandleGameObject(0, true, go); - break; + switch (go->GetEntry()) + { + case GO_PRINCE_TALDARAM_GATE: + AddDoor(go, false); + break; + default: + break; + } } - } - void SetData64(uint32 idx, uint64 guid) OVERRIDE - { - switch (idx) + void SetData(uint32 type, uint32 data) OVERRIDE { - case DATA_ADD_JEDOGA_OPFER: - JedogaSacrifices = guid; - break; + switch (type) + { + case DATA_SPHERE_1: + case DATA_SPHERE_2: + SpheresState[type - DATA_SPHERE_1] = data; + break; + case DATA_JEDOGA_TRIGGER_SWITCH: + SwitchTrigger = data; + break; + case DATA_JEDOGA_RESET_INITIANDS: + for (std::set<uint64>::const_iterator itr = InitiandGUIDs.begin(); itr != InitiandGUIDs.end(); ++itr) + { + if (Creature* creature = instance->GetCreature(*itr)) + { + creature->Respawn(); + if (!creature->IsInEvadeMode()) + creature->AI()->EnterEvadeMode(); + } + } + break; + default: + break; + } + } - case DATA_PL_JEDOGA_TARGET: - JedogaTarget = guid; - break; + uint32 GetData(uint32 type) const OVERRIDE + { + switch (type) + { + case DATA_SPHERE_1: + case DATA_SPHERE_2: + return SpheresState[type - DATA_SPHERE_1]; + case DATA_ALL_INITIAND_DEAD: + for (std::set<uint64>::const_iterator itr = InitiandGUIDs.begin(); itr != InitiandGUIDs.end(); ++itr) + { + Creature* cr = instance->GetCreature(*itr); + if (!cr || cr->IsAlive()) + return 0; + } + return 1; + case DATA_JEDOGA_TRIGGER_SWITCH: + return SwitchTrigger; + default: + break; + } + return 0; } - } - uint64 GetData64(uint32 identifier) const OVERRIDE - { - switch (identifier) + void SetData64(uint32 type, uint64 data) OVERRIDE { - case DATA_ELDER_NADOX: return Elder_Nadox; - case DATA_PRINCE_TALDARAM: return Prince_Taldaram; - case DATA_JEDOGA_SHADOWSEEKER: return Jedoga_Shadowseeker; - case DATA_HERALD_VOLAZJ: return Herald_Volazj; - case DATA_AMANITAR: return Amanitar; - case DATA_SPHERE1: return Prince_TaldaramSpheres[0]; - case DATA_SPHERE2: return Prince_TaldaramSpheres[1]; - case DATA_PRINCE_TALDARAM_PLATFORM: return Prince_TaldaramPlatform; - case DATA_ADD_JEDOGA_INITIAND: + switch (type) { - std::vector<uint64> vInitiands; - vInitiands.clear(); - for (std::set<uint64>::const_iterator itr = InitiandGUIDs.begin(); itr != InitiandGUIDs.end(); ++itr) - { - Creature* cr = instance->GetCreature(*itr); - if (cr && cr->IsAlive()) - vInitiands.push_back(*itr); - } - if (vInitiands.empty()) - return 0; - uint8 j = urand(0, vInitiands.size() -1); - return vInitiands[j]; + case DATA_ADD_JEDOGA_OPFER: + JedogaSacrifices = data; + break; + case DATA_PL_JEDOGA_TARGET: + JedogaTarget = data; + break; + default: + break; } - case DATA_ADD_JEDOGA_OPFER: return JedogaSacrifices; - case DATA_PL_JEDOGA_TARGET: return JedogaTarget; } - return 0; - } - void SetData(uint32 type, uint32 data) OVERRIDE - { - switch (type) + uint64 GetData64(uint32 type) const OVERRIDE { - case DATA_ELDER_NADOX_EVENT: - m_auiEncounter[0] = data; - break; - case DATA_PRINCE_TALDARAM_EVENT: - if (data == DONE) - HandleGameObject(Prince_TaldaramGate, true); - m_auiEncounter[1] = data; - break; - case DATA_JEDOGA_SHADOWSEEKER_EVENT: - m_auiEncounter[2] = data; - if (data == DONE) + switch (type) + { + case DATA_ELDER_NADOX: + return ElderNadoxGUID; + case DATA_PRINCE_TALDARAM: + return PrinceTaldaramGUID; + case DATA_JEDOGA_SHADOWSEEKER: + return JedogaShadowseekerGUID; + case DATA_AMANITAR: + return AmanitarGUID; + case DATA_HERALD_VOLAZJ: + return HeraldVolazjGUID; + case DATA_PRINCE_TALDARAM_PLATFORM: + return PrinceTaldaramPlatformGUID; + case DATA_ADD_JEDOGA_INITIAND: { + std::vector<uint64> vInitiands; + vInitiands.clear(); for (std::set<uint64>::const_iterator itr = InitiandGUIDs.begin(); itr != InitiandGUIDs.end(); ++itr) { Creature* cr = instance->GetCreature(*itr); if (cr && cr->IsAlive()) - { - cr->SetVisible(false); - cr->setDeathState(JUST_DIED); - cr->RemoveCorpse(); - } + vInitiands.push_back(*itr); } + if (vInitiands.empty()) + return 0; + + return Trinity::Containers::SelectRandomContainerElement(vInitiands); } - break; - case DATA_HERALD_VOLAZJ_EVENT: - m_auiEncounter[3] = data; - break; - case DATA_AMANITAR_EVENT: - m_auiEncounter[4] = data; - break; - case DATA_SPHERE1_EVENT: - spheres[0] = data; - break; - case DATA_SPHERE2_EVENT: - spheres[1] = data; - break; - case DATA_JEDOGA_TRIGGER_SWITCH: - switchtrigger = data; - break; - case DATA_JEDOGA_RESET_INITIANDS: - for (std::set<uint64>::const_iterator itr = InitiandGUIDs.begin(); itr != InitiandGUIDs.end(); ++itr) - { - Creature* cr = instance->GetCreature(*itr); - if (cr) + case DATA_ADD_JEDOGA_OPFER: + return JedogaSacrifices; + case DATA_PL_JEDOGA_TARGET: + return JedogaTarget; + default: + break; + } + return 0; + } + + bool SetBossState(uint32 type, EncounterState state) OVERRIDE + { + if (!InstanceScript::SetBossState(type, state)) + return false; + + switch (type) + { + case DATA_JEDOGA_SHADOWSEEKER: + if (state == DONE) { - cr->Respawn(); - if (!cr->IsInEvadeMode()) cr->AI()->EnterEvadeMode(); + for (std::set<uint64>::const_iterator itr = InitiandGUIDs.begin(); itr != InitiandGUIDs.end(); ++itr) + { + if (Creature* cr = instance->GetCreature(*itr)) + cr->DespawnOrUnsummon(); + } } - } - break; + break; + default: + break; + } + return true; } - if (data == DONE) - SaveToDB(); - } - uint32 GetData(uint32 type) const OVERRIDE - { - switch (type) + std::string GetSaveData() OVERRIDE { - case DATA_ELDER_NADOX_EVENT: return m_auiEncounter[0]; - case DATA_PRINCE_TALDARAM_EVENT: return m_auiEncounter[1]; - case DATA_JEDOGA_SHADOWSEEKER_EVENT: return m_auiEncounter[2]; - case DATA_HERALD_VOLAZJ: return m_auiEncounter[3]; - case DATA_AMANITAR_EVENT: return m_auiEncounter[4]; - case DATA_SPHERE1_EVENT: return spheres[0]; - case DATA_SPHERE2_EVENT: return spheres[1]; - case DATA_ALL_INITIAND_DEAD: - for (std::set<uint64>::const_iterator itr = InitiandGUIDs.begin(); itr != InitiandGUIDs.end(); ++itr) - { - Creature* cr = instance->GetCreature(*itr); - if (!cr || (cr && cr->IsAlive())) - return 0; - } - return 1; - case DATA_JEDOGA_TRIGGER_SWITCH: return switchtrigger; - } - return 0; - } + OUT_SAVE_INST_DATA; - std::string GetSaveData() OVERRIDE - { - OUT_SAVE_INST_DATA; + std::ostringstream saveStream; + saveStream << "A K " << GetBossSaveData() << SpheresState[0] << ' ' << SpheresState[1]; - std::ostringstream saveStream; - saveStream << "A K " << m_auiEncounter[0] << ' ' << m_auiEncounter[1] << ' ' - << m_auiEncounter[2] << ' ' << m_auiEncounter[3] << ' ' << m_auiEncounter[4] << ' ' - << spheres[0] << ' ' << spheres[1]; + OUT_SAVE_INST_DATA_COMPLETE; + return saveStream.str(); + } - str_data = saveStream.str(); + void Load(char const* str) OVERRIDE + { + if (!str) + { + OUT_LOAD_INST_DATA_FAIL; + return; + } - OUT_SAVE_INST_DATA_COMPLETE; - return str_data; - } + OUT_LOAD_INST_DATA(str); - void Load(const char* in) OVERRIDE - { - if (!in) - { - OUT_LOAD_INST_DATA_FAIL; - return; - } + char dataHead1, dataHead2; - OUT_LOAD_INST_DATA(in); + std::istringstream loadStream(str); + loadStream >> dataHead1 >> dataHead2; + + if (dataHead1 == 'A' && dataHead2 == 'K') + { + for (uint32 i = 0; i < EncounterCount; ++i) + { + uint32 tmpState; + loadStream >> tmpState; + if (tmpState == IN_PROGRESS || tmpState > SPECIAL) + tmpState = NOT_STARTED; + SetBossState(i, EncounterState(tmpState)); + } - char dataHead1, dataHead2; - uint16 data0, data1, data2, data3, data4, data5, data6; + loadStream >> SpheresState[0]; + loadStream >> SpheresState[1]; + } + else + OUT_LOAD_INST_DATA_FAIL; - std::istringstream loadStream(in); - loadStream >> dataHead1 >> dataHead2 >> data0 >> data1 >> data2 >> data3 >> data4 >> data5 >> data6; + OUT_LOAD_INST_DATA_COMPLETE; + } - if (dataHead1 == 'A' && dataHead2 == 'K') - { - m_auiEncounter[0] = data0; - m_auiEncounter[1] = data1; - m_auiEncounter[2] = data2; - m_auiEncounter[3] = data3; - m_auiEncounter[4] = data4; + protected: + uint64 ElderNadoxGUID; + uint64 PrinceTaldaramGUID; + uint64 JedogaShadowseekerGUID; + uint64 AmanitarGUID; + uint64 HeraldVolazjGUID; - for (uint8 i = 0; i < MAX_ENCOUNTER; ++i) - if (m_auiEncounter[i] == IN_PROGRESS) - m_auiEncounter[i] = NOT_STARTED; + uint64 PrinceTaldaramPlatformGUID; + uint64 JedogaSacrifices; + uint64 JedogaTarget; - spheres[0] = data5; - spheres[1] = data6; + std::set<uint64> InitiandGUIDs; - } else OUT_LOAD_INST_DATA_FAIL; + uint8 SpheresState[2]; + uint8 SwitchTrigger; + }; - OUT_LOAD_INST_DATA_COMPLETE; + InstanceScript* GetInstanceScript(InstanceMap* map) const OVERRIDE + { + return new instance_ahnkahet_InstanceScript(map); } - }; - - InstanceScript* GetInstanceScript(InstanceMap* map) const OVERRIDE - { - return new instance_ahnkahet_InstanceScript(map); - } }; void AddSC_instance_ahnkahet() { - new instance_ahnkahet(); + new instance_ahnkahet(); } diff --git a/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/azjol_nerub.h b/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/azjol_nerub.h index 5970a85cc38..5087ed0cec3 100644 --- a/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/azjol_nerub.h +++ b/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/azjol_nerub.h @@ -15,24 +15,49 @@ * with this program. If not, see <http://www.gnu.org/licenses/>. */ -#ifndef DEF_AZJOL_NERUB_H -#define DEF_AZJOL_NERUB_H +#ifndef AZJOL_NERUB_H_ +#define AZJOL_NERUB_H_ -enum Data64 +#define AzjolNerubScriptName "instance_azjol_nerub" + +uint32 const EncounterCount = 3; + +enum DataTypes { - DATA_KRIKTHIR_THE_GATEWATCHER, - DATA_HADRONOX, - DATA_ANUBARAK, - DATA_WATCHER_GASHRA, - DATA_WATCHER_SILTHIK, - DATA_WATCHER_NARJIL + // Encounter States/Boss GUIDs + DATA_KRIKTHIR_THE_GATEWATCHER = 0, + DATA_HADRONOX = 1, + DATA_ANUBARAK = 2, + + // Additional Data + DATA_WATCHER_GASHRA = 3, + DATA_WATCHER_SILTHIK = 4, + DATA_WATCHER_NARJIL = 5 }; -enum Data +enum CreatureIds { - DATA_KRIKTHIR_THE_GATEWATCHER_EVENT, - DATA_HADRONOX_EVENT, - DATA_ANUBARAK_EVENT + NPC_KRIKTHIR = 28684, + NPC_HADRONOX = 28921, + NPC_ANUBARAK = 29120, + + NPC_WATCHER_NARJIL = 28729, + NPC_WATCHER_GASHRA = 28730, + NPC_WATCHER_SILTHIK = 28731 }; -#endif +enum GameObjectIds +{ + GO_KRIKTHIR_DOOR = 192395, + GO_ANUBARAK_DOOR_1 = 192396, + GO_ANUBARAK_DOOR_2 = 192397, + GO_ANUBARAK_DOOR_3 = 192398 +}; + +template<class AI> +AI* GetAzjolNerubAI(Creature* creature) +{ + return GetInstanceAI<AI>(creature, AzjolNerubScriptName); +} + +#endif // AZJOL_NERUB_H_ diff --git a/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/boss_anubarak.cpp b/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/boss_anubarak.cpp index 05e758f5cf9..81530265617 100644 --- a/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/boss_anubarak.cpp +++ b/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/boss_anubarak.cpp @@ -132,7 +132,7 @@ public: if (instance) { - instance->SetData(DATA_ANUBARAK_EVENT, NOT_STARTED); + instance->SetBossState(DATA_ANUBARAK, NOT_STARTED); instance->DoStopTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_TIMED_START_EVENT); } } @@ -165,7 +165,7 @@ public: void DelayEventStart() { if (instance) - instance->SetData(DATA_ANUBARAK_EVENT, IN_PROGRESS); + instance->SetBossState(DATA_ANUBARAK, IN_PROGRESS); } void UpdateAI(uint32 diff) OVERRIDE @@ -336,7 +336,7 @@ public: Talk(SAY_DEATH); Summons.DespawnAll(); if (instance) - instance->SetData(DATA_ANUBARAK_EVENT, DONE); + instance->SetBossState(DATA_ANUBARAK, DONE); } void KilledUnit(Unit* victim) OVERRIDE diff --git a/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/boss_hadronox.cpp b/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/boss_hadronox.cpp index 6b556f4fe4d..1664a1375ae 100644 --- a/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/boss_hadronox.cpp +++ b/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/boss_hadronox.cpp @@ -84,8 +84,8 @@ public: uiDoorsTimer = urand(20*IN_MILLISECONDS, 30*IN_MILLISECONDS); uiCheckDistanceTimer = 2*IN_MILLISECONDS; - if (instance && (instance->GetData(DATA_HADRONOX_EVENT) != DONE && !bFirstTime)) - instance->SetData(DATA_HADRONOX_EVENT, FAIL); + if (instance && (instance->GetBossState(DATA_HADRONOX) != DONE && !bFirstTime)) + instance->SetBossState(DATA_HADRONOX, FAIL); bFirstTime = false; } @@ -103,13 +103,13 @@ public: void JustDied(Unit* /*killer*/) OVERRIDE { if (instance) - instance->SetData(DATA_HADRONOX_EVENT, DONE); + instance->SetBossState(DATA_HADRONOX, DONE); } void EnterCombat(Unit* /*who*/) OVERRIDE { if (instance) - instance->SetData(DATA_HADRONOX_EVENT, IN_PROGRESS); + instance->SetBossState(DATA_HADRONOX, IN_PROGRESS); me->SetInCombatWithZone(); } diff --git a/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/boss_krikthir_the_gatewatcher.cpp b/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/boss_krikthir_the_gatewatcher.cpp index 2222d16f68b..c5e40052a9d 100644 --- a/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/boss_krikthir_the_gatewatcher.cpp +++ b/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/boss_krikthir_the_gatewatcher.cpp @@ -105,7 +105,7 @@ public: uiCurseFatigueTimer = 12*IN_MILLISECONDS; if (instance) - instance->SetData(DATA_KRIKTHIR_THE_GATEWATCHER_EVENT, NOT_STARTED); + instance->SetBossState(DATA_KRIKTHIR_THE_GATEWATCHER, NOT_STARTED); } void EnterCombat(Unit* /*who*/) OVERRIDE @@ -115,7 +115,7 @@ public: uiSummonTimer = 15*IN_MILLISECONDS; if (instance) - instance->SetData(DATA_KRIKTHIR_THE_GATEWATCHER_EVENT, IN_PROGRESS); + instance->SetBossState(DATA_KRIKTHIR_THE_GATEWATCHER, IN_PROGRESS); } void Summon() @@ -176,7 +176,7 @@ public: Talk(SAY_DEATH); if (instance) - instance->SetData(DATA_KRIKTHIR_THE_GATEWATCHER_EVENT, DONE); + instance->SetBossState(DATA_KRIKTHIR_THE_GATEWATCHER, DONE); } void KilledUnit(Unit* victim) OVERRIDE @@ -537,15 +537,14 @@ class achievement_watch_him_die : public AchievementCriteriaScript return false; InstanceScript* instance = target->GetInstanceScript(); - Creature* Watcher[3]; if (!instance) return false; for (uint8 n = 0; n < 3; ++n) { - Watcher[n] = ObjectAccessor::GetCreature(*target, instance->GetData64(DATA_WATCHER_GASHRA + n)); - if (Watcher[n] && !Watcher[n]->IsAlive()) - return false; + if (Creature* watcher = ObjectAccessor::GetCreature(*target, instance->GetData64(DATA_WATCHER_GASHRA + n))) + if (!watcher->IsAlive()) + return false; } return true; diff --git a/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/instance_azjol_nerub.cpp b/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/instance_azjol_nerub.cpp index 261a2748579..b20a28b7a75 100644 --- a/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/instance_azjol_nerub.cpp +++ b/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/instance_azjol_nerub.cpp @@ -19,196 +19,171 @@ #include "InstanceScript.h" #include "azjol_nerub.h" -#define MAX_ENCOUNTER 3 - -/* Azjol Nerub encounters: -0 - Krik'thir the Gatewatcher -1 - Hadronox -2 - Anub'arak -*/ +DoorData const doorData[] = +{ + { GO_KRIKTHIR_DOOR, DATA_KRIKTHIR_THE_GATEWATCHER, DOOR_TYPE_PASSAGE, BOUNDARY_NONE }, + { GO_ANUBARAK_DOOR_1, DATA_ANUBARAK, DOOR_TYPE_ROOM, BOUNDARY_NONE }, + { GO_ANUBARAK_DOOR_2, DATA_ANUBARAK, DOOR_TYPE_ROOM, BOUNDARY_NONE }, + { GO_ANUBARAK_DOOR_3, DATA_ANUBARAK, DOOR_TYPE_ROOM, BOUNDARY_NONE }, + { 0, 0, DOOR_TYPE_ROOM, BOUNDARY_NONE } // END +}; class instance_azjol_nerub : public InstanceMapScript { -public: - instance_azjol_nerub() : InstanceMapScript("instance_azjol_nerub", 601) { } - - struct instance_azjol_nerub_InstanceScript : public InstanceScript - { - instance_azjol_nerub_InstanceScript(Map* map) : InstanceScript(map) {} - - uint64 uiKrikthir; - uint64 uiHadronox; - uint64 uiAnubarak; - uint64 uiWatcherGashra; - uint64 uiWatcherSilthik; - uint64 uiWatcherNarjil; - uint64 uiAnubarakDoor[3]; - - uint64 uiKrikthirDoor; - - uint32 auiEncounter[MAX_ENCOUNTER]; - - void Initialize() OVERRIDE - { - memset(&auiEncounter, 0, sizeof(auiEncounter)); - memset(&uiAnubarakDoor, 0, sizeof(uiAnubarakDoor)); - - uiKrikthir = 0; - uiHadronox = 0; - uiAnubarak = 0; - uiWatcherGashra = 0; - uiWatcherSilthik = 0; - uiWatcherNarjil = 0; - uiKrikthirDoor = 0; - } + public: + instance_azjol_nerub() : InstanceMapScript(AzjolNerubScriptName, 601) { } - bool IsEncounterInProgress() const OVERRIDE + struct instance_azjol_nerub_InstanceScript : public InstanceScript { - for (uint8 i = 0; i < MAX_ENCOUNTER; ++i) - if (auiEncounter[i] == IN_PROGRESS) - return true; - - return false; - } - - void OnCreatureCreate(Creature* creature) OVERRIDE - { - switch (creature->GetEntry()) + instance_azjol_nerub_InstanceScript(Map* map) : InstanceScript(map) { - case 28684: uiKrikthir = creature->GetGUID(); break; - case 28921: uiHadronox = creature->GetGUID(); break; - case 29120: uiAnubarak = creature->GetGUID(); break; - case 28730: uiWatcherGashra = creature->GetGUID(); break; - case 28731: uiWatcherSilthik = creature->GetGUID(); break; - case 28729: uiWatcherNarjil = creature->GetGUID(); break; + SetBossNumber(EncounterCount); + LoadDoorData(doorData); + + KrikthirGUID = 0; + HadronoxGUID = 0; + AnubarakGUID = 0; + WatcherGashraGUID = 0; + WatcherSilthikGUID = 0; + WatcherNarjilGUID = 0; } - } - void OnGameObjectCreate(GameObject* go) OVERRIDE - { - switch (go->GetEntry()) + void OnCreatureCreate(Creature* creature) OVERRIDE { - case 192395: - uiKrikthirDoor = go->GetGUID(); - if (auiEncounter[0] == DONE) - HandleGameObject(0, true, go); - break; - case 192396: - uiAnubarakDoor[0] = go->GetGUID(); - break; - case 192397: - uiAnubarakDoor[1] = go->GetGUID(); - break; - case 192398: - uiAnubarakDoor[2] = go->GetGUID(); - break; + switch (creature->GetEntry()) + { + case NPC_KRIKTHIR: + KrikthirGUID = creature->GetGUID(); + break; + case NPC_HADRONOX: + HadronoxGUID = creature->GetGUID(); + break; + case NPC_ANUBARAK: + AnubarakGUID = creature->GetGUID(); + break; + case NPC_WATCHER_NARJIL: + WatcherNarjilGUID = creature->GetGUID(); + break; + case NPC_WATCHER_GASHRA: + WatcherGashraGUID = creature->GetGUID(); + break; + case NPC_WATCHER_SILTHIK: + WatcherSilthikGUID = creature->GetGUID(); + break; + default: + break; + } } - } - uint64 GetData64(uint32 identifier) const OVERRIDE - { - switch (identifier) + void OnGameObjectCreate(GameObject* go) OVERRIDE { - case DATA_KRIKTHIR_THE_GATEWATCHER: return uiKrikthir; - case DATA_HADRONOX: return uiHadronox; - case DATA_ANUBARAK: return uiAnubarak; - case DATA_WATCHER_GASHRA: return uiWatcherGashra; - case DATA_WATCHER_SILTHIK: return uiWatcherSilthik; - case DATA_WATCHER_NARJIL: return uiWatcherNarjil; + switch (go->GetEntry()) + { + case GO_KRIKTHIR_DOOR: + case GO_ANUBARAK_DOOR_1: + case GO_ANUBARAK_DOOR_2: + case GO_ANUBARAK_DOOR_3: + AddDoor(go, true); + break; + default: + break; + } } - return 0; - } - - void SetData(uint32 type, uint32 data) OVERRIDE - { - switch (type) + void OnGameObjectRemove(GameObject* go) OVERRIDE { - case DATA_KRIKTHIR_THE_GATEWATCHER_EVENT: - auiEncounter[0] = data; - if (data == DONE) - HandleGameObject(uiKrikthirDoor, true); - break; - case DATA_HADRONOX_EVENT: - auiEncounter[1] = data; - break; - case DATA_ANUBARAK_EVENT: - auiEncounter[2] = data; - if (data == IN_PROGRESS) - for (uint8 i = 0; i < 3; ++i) - HandleGameObject(uiAnubarakDoor[i], false); - else if (data == NOT_STARTED || data == DONE) - for (uint8 i = 0; i < 3; ++i) - HandleGameObject(uiAnubarakDoor[i], true); - break; + switch (go->GetEntry()) + { + case GO_KRIKTHIR_DOOR: + case GO_ANUBARAK_DOOR_1: + case GO_ANUBARAK_DOOR_2: + case GO_ANUBARAK_DOOR_3: + AddDoor(go, false); + break; + default: + break; + } } - if (data == DONE) + uint64 GetData64(uint32 type) const OVERRIDE { - SaveToDB(); + switch (type) + { + case DATA_KRIKTHIR_THE_GATEWATCHER: + return KrikthirGUID; + case DATA_HADRONOX: + return HadronoxGUID; + case DATA_ANUBARAK: + return AnubarakGUID; + case DATA_WATCHER_GASHRA: + return WatcherGashraGUID; + case DATA_WATCHER_SILTHIK: + return WatcherSilthikGUID; + case DATA_WATCHER_NARJIL: + return WatcherNarjilGUID; + default: + break; + } + + return 0; } - } - uint32 GetData(uint32 type) const OVERRIDE - { - switch (type) + std::string GetSaveData() OVERRIDE { - case DATA_KRIKTHIR_THE_GATEWATCHER_EVENT: return auiEncounter[0]; - case DATA_HADRONOX_EVENT: return auiEncounter[1]; - case DATA_ANUBARAK_EVENT: return auiEncounter[2]; - } - - return 0; - } - - std::string GetSaveData() OVERRIDE - { - OUT_SAVE_INST_DATA; - - std::ostringstream saveStream; - saveStream << "A N " << auiEncounter[0] << ' ' << auiEncounter[1] << ' ' - << auiEncounter[2]; + OUT_SAVE_INST_DATA; - OUT_SAVE_INST_DATA_COMPLETE; - return saveStream.str(); - } + std::ostringstream saveStream; + saveStream << "A N " << GetBossSaveData(); - void Load(const char* in) OVERRIDE - { - if (!in) - { - OUT_LOAD_INST_DATA_FAIL; - return; + OUT_SAVE_INST_DATA_COMPLETE; + return saveStream.str(); } - OUT_LOAD_INST_DATA(in); - - char dataHead1, dataHead2; - uint16 data0, data1, data2; - - std::istringstream loadStream(in); - loadStream >> dataHead1 >> dataHead2 >> data0 >> data1 >> data2; - - if (dataHead1 == 'A' && dataHead2 == 'N') + void Load(char const* str) OVERRIDE { - auiEncounter[0] = data0; - auiEncounter[1] = data1; - auiEncounter[2] = data2; - - for (uint8 i = 0; i < MAX_ENCOUNTER; ++i) - if (auiEncounter[i] == IN_PROGRESS) - auiEncounter[i] = NOT_STARTED; + if (!str) + { + OUT_LOAD_INST_DATA_FAIL; + return; + } + + OUT_LOAD_INST_DATA(str); + + char dataHead1, dataHead2; + + std::istringstream loadStream(str); + loadStream >> dataHead1 >> dataHead2; + + if (dataHead1 == 'A' && dataHead2 == 'N') + { + for (uint32 i = 0; i < EncounterCount; ++i) + { + uint32 tmpState; + loadStream >> tmpState; + if (tmpState == IN_PROGRESS || tmpState > SPECIAL) + tmpState = NOT_STARTED; + SetBossState(i, EncounterState(tmpState)); + } + } + else + OUT_LOAD_INST_DATA_FAIL; + + OUT_LOAD_INST_DATA_COMPLETE; + } - } else OUT_LOAD_INST_DATA_FAIL; + protected: + uint64 KrikthirGUID; + uint64 HadronoxGUID; + uint64 AnubarakGUID; + uint64 WatcherGashraGUID; + uint64 WatcherSilthikGUID; + uint64 WatcherNarjilGUID; + }; - OUT_LOAD_INST_DATA_COMPLETE; + InstanceScript* GetInstanceScript(InstanceMap* map) const OVERRIDE + { + return new instance_azjol_nerub_InstanceScript(map); } - }; - - InstanceScript* GetInstanceScript(InstanceMap* map) const OVERRIDE - { - return new instance_azjol_nerub_InstanceScript(map); - } }; void AddSC_instance_azjol_nerub() diff --git a/src/server/scripts/Northrend/DraktharonKeep/drak_tharon_keep.h b/src/server/scripts/Northrend/DraktharonKeep/drak_tharon_keep.h index 072a5f2f534..c2d957b7c0a 100644 --- a/src/server/scripts/Northrend/DraktharonKeep/drak_tharon_keep.h +++ b/src/server/scripts/Northrend/DraktharonKeep/drak_tharon_keep.h @@ -18,9 +18,6 @@ #ifndef DRAK_THARON_KEEP_H_ #define DRAK_THARON_KEEP_H_ -#include "Map.h" -#include "Creature.h" - #define DrakTharonKeepScriptName "instance_drak_tharon_keep" uint32 const EncounterCount = 4; @@ -89,11 +86,7 @@ enum GameObjectIds template<class AI> AI* GetDrakTharonKeepAI(Creature* creature) { - if (InstanceMap* instance = creature->GetMap()->ToInstanceMap()) - if (instance->GetInstanceScript()) - if (instance->GetScriptId() == sObjectMgr->GetScriptId(DrakTharonKeepScriptName)) - return new AI(creature); - return NULL; + return GetInstanceAI<AI>(creature, DrakTharonKeepScriptName); } #endif // DRAK_THARON_KEEP_H_ diff --git a/src/server/scripts/Northrend/DraktharonKeep/instance_drak_tharon_keep.cpp b/src/server/scripts/Northrend/DraktharonKeep/instance_drak_tharon_keep.cpp index 240e27ad026..d9e34ee2af3 100644 --- a/src/server/scripts/Northrend/DraktharonKeep/instance_drak_tharon_keep.cpp +++ b/src/server/scripts/Northrend/DraktharonKeep/instance_drak_tharon_keep.cpp @@ -36,7 +36,7 @@ class instance_drak_tharon_keep : public InstanceMapScript KingDredGUID = 0; TharonJaGUID = 0; - memset(TrollgoreInvaderSummonerGuids, 0, 4 * sizeof(uint64)); + memset(TrollgoreInvaderSummonerGuids, 0, 3 * sizeof(uint64)); memset(NovosCrystalGUIDs, 0, 4 * sizeof(uint64)); memset(NovosSummonerGUIDs, 0, 4 * sizeof(uint64)); } diff --git a/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/halls_of_reflection.cpp b/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/halls_of_reflection.cpp index 6408417e902..3f81b517721 100644 --- a/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/halls_of_reflection.cpp +++ b/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/halls_of_reflection.cpp @@ -714,7 +714,9 @@ class npc_jaina_or_sylvanas_escape_hor : public CreatureScript // AI of Part2 struct npc_jaina_or_sylvanas_escape_horAI : public ScriptedAI { - npc_jaina_or_sylvanas_escape_horAI(Creature* creature) : ScriptedAI(creature) + npc_jaina_or_sylvanas_escape_horAI(Creature* creature) : ScriptedAI(creature), + _instance(creature->GetInstanceScript()), _lichkingGUID(0), _walltargetGUID(0), + _icewallGUID(0), _icewall(0), _isattackingwall(0) { _instance = me->GetInstanceScript(); } diff --git a/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/instance_halls_of_reflection.cpp b/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/instance_halls_of_reflection.cpp index 40110b8a509..50600453368 100644 --- a/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/instance_halls_of_reflection.cpp +++ b/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/instance_halls_of_reflection.cpp @@ -79,20 +79,27 @@ public: { SetBossNumber(MAX_ENCOUNTER); events.Reset(); + _falricGUID = 0; _marwynGUID = 0; _jainaOrSylvanasPart1GUID = 0; + _jainaOrSylvanasPart2GUID = 0; + _lichkingPart1GUID = 0; _frostwornGeneralGUID = 0; + _frostmourneGUID = 0; _entranceDoorGUID = 0; _frostwornDoorGUID = 0; _arthasDoorGUID = 0; + _escapeDoorGUID = 0; + _caveGUID = 0; + _teamInInstance = 0; _waveCount = 0; - _mobsaticewall = 0; _introEvent = NOT_STARTED; _frostwornGeneral = NOT_STARTED; _escapeevent = NOT_STARTED; + _mobsaticewall = 0; } void OnPlayerEnter(Player* player) OVERRIDE diff --git a/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_bjarngrim.cpp b/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_bjarngrim.cpp index 2077049641f..944eacda34e 100644 --- a/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_bjarngrim.cpp +++ b/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_bjarngrim.cpp @@ -181,7 +181,7 @@ public: SetEquipmentSlots(false, EQUIP_SWORD, EQUIP_SHIELD, EQUIP_NO_CHANGE); if (instance) - instance->SetData(TYPE_BJARNGRIM, NOT_STARTED); + instance->SetBossState(DATA_BJARNGRIM, NOT_STARTED); } void EnterEvadeMode() OVERRIDE @@ -202,7 +202,7 @@ public: me->CallForHelp(30.0f); if (instance) - instance->SetData(TYPE_BJARNGRIM, IN_PROGRESS); + instance->SetBossState(DATA_BJARNGRIM, IN_PROGRESS); } void KilledUnit(Unit* /*victim*/) OVERRIDE @@ -215,7 +215,7 @@ public: Talk(SAY_DEATH); if (instance) - instance->SetData(TYPE_BJARNGRIM, DONE); + instance->SetBossState(DATA_BJARNGRIM, DONE); } /// @todo remove when removal is done by the core diff --git a/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_ionar.cpp b/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_ionar.cpp index dfb21edf9af..af6beca608d 100644 --- a/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_ionar.cpp +++ b/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_ionar.cpp @@ -116,7 +116,7 @@ public: me->SetVisible(true); if (instance) - instance->SetData(TYPE_IONAR, NOT_STARTED); + instance->SetBossState(DATA_IONAR, NOT_STARTED); } void EnterCombat(Unit* /*who*/) OVERRIDE @@ -124,7 +124,7 @@ public: Talk(SAY_AGGRO); if (instance) - instance->SetData(TYPE_IONAR, IN_PROGRESS); + instance->SetBossState(DATA_IONAR, IN_PROGRESS); } void JustDied(Unit* /*killer*/) OVERRIDE @@ -134,7 +134,7 @@ public: lSparkList.DespawnAll(); if (instance) - instance->SetData(TYPE_IONAR, DONE); + instance->SetBossState(DATA_IONAR, DONE); } void KilledUnit(Unit* /*victim*/) OVERRIDE @@ -338,7 +338,7 @@ public: void UpdateAI(uint32 uiDiff) OVERRIDE { // Despawn if the encounter is not running - if (instance && instance->GetData(TYPE_IONAR) != IN_PROGRESS) + if (instance && instance->GetBossState(DATA_IONAR) != IN_PROGRESS) { me->DespawnOrUnsummon(); return; diff --git a/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_loken.cpp b/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_loken.cpp index d8ab71870a8..61687de1b58 100644 --- a/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_loken.cpp +++ b/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_loken.cpp @@ -97,7 +97,7 @@ public: if (instance) { - instance->SetData(TYPE_LOKEN, NOT_STARTED); + instance->SetBossState(DATA_LOKEN, NOT_STARTED); instance->DoStopTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_TIMELY_DEATH_START_EVENT); } } @@ -108,7 +108,7 @@ public: if (instance) { - instance->SetData(TYPE_LOKEN, IN_PROGRESS); + instance->SetBossState(DATA_LOKEN, IN_PROGRESS); instance->DoStartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_TIMELY_DEATH_START_EVENT); } } @@ -119,7 +119,7 @@ public: if (instance) { - instance->SetData(TYPE_LOKEN, DONE); + instance->SetBossState(DATA_LOKEN, DONE); instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_PULSING_SHOCKWAVE_AURA); } } @@ -140,6 +140,7 @@ public: if (m_uiResumePulsingShockwave_Timer <= uiDiff) { DoCast(me, SPELL_PULSING_SHOCKWAVE_AURA, true); + me->ClearUnitState(UNIT_STATE_CASTING); // this flag breaks movement DoCast(me, SPELL_PULSING_SHOCKWAVE_N, true); m_uiResumePulsingShockwave_Timer = 0; diff --git a/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_volkhan.cpp b/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_volkhan.cpp index 725293a7e60..b6790a088ad 100644 --- a/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_volkhan.cpp +++ b/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_volkhan.cpp @@ -121,7 +121,7 @@ public: m_lGolemGUIDList.clear(); if (instance) - instance->SetData(TYPE_VOLKHAN, NOT_STARTED); + instance->SetBossState(DATA_VOLKHAN, NOT_STARTED); } void EnterCombat(Unit* /*who*/) OVERRIDE @@ -129,7 +129,7 @@ public: Talk(SAY_AGGRO); if (instance) - instance->SetData(TYPE_VOLKHAN, IN_PROGRESS); + instance->SetBossState(DATA_VOLKHAN, IN_PROGRESS); } void AttackStart(Unit* who) OVERRIDE @@ -151,7 +151,7 @@ public: DespawnGolem(); if (instance) - instance->SetData(TYPE_VOLKHAN, DONE); + instance->SetBossState(DATA_VOLKHAN, DONE); } void KilledUnit(Unit* /*victim*/) OVERRIDE diff --git a/src/server/scripts/Northrend/Ulduar/HallsOfLightning/halls_of_lightning.h b/src/server/scripts/Northrend/Ulduar/HallsOfLightning/halls_of_lightning.h index c45feab1e8a..17c049e8292 100644 --- a/src/server/scripts/Northrend/Ulduar/HallsOfLightning/halls_of_lightning.h +++ b/src/server/scripts/Northrend/Ulduar/HallsOfLightning/halls_of_lightning.h @@ -1,6 +1,5 @@ /* * Copyright (C) 2008-2013 TrinityCore <http://www.trinitycore.org/> - * Copyright (C) 2006-2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/> * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the @@ -16,22 +15,20 @@ * with this program. If not, see <http://www.gnu.org/licenses/>. */ -#ifndef DEF_HALLS_OF_LIGHTNING_H -#define DEF_HALLS_OF_LIGHTNING_H +#ifndef HALLS_OF_LIGHTNING_H_ +#define HALLS_OF_LIGHTNING_H_ -enum Types -{ - MAX_ENCOUNTER = 4, +#define HoLScriptName "instance_halls_of_lightning" - DATA_BJARNGRIM = 1, - DATA_IONAR = 2, - DATA_LOKEN = 3, - DATA_VOLKHAN = 4, +uint32 const EncounterCount = 4; - TYPE_BJARNGRIM = 10, - TYPE_IONAR = 11, - TYPE_LOKEN = 12, - TYPE_VOLKHAN = 13, +enum DataTypes +{ + // Encounter States/Boss GUIDs + DATA_BJARNGRIM = 0, + DATA_VOLKHAN = 1, + DATA_IONAR = 2, + DATA_LOKEN = 3 }; enum CreaturesIds @@ -44,11 +41,17 @@ enum CreaturesIds enum GameObjectIds { - GO_BJARNGRIM_DOOR = 191416, //_doors10 - GO_VOLKHAN_DOOR = 191325, //_doors07 - GO_IONAR_DOOR = 191326, //_doors05 - GO_LOKEN_DOOR = 191324, //_doors02 + GO_BJARNGRIM_DOOR = 191416, + GO_VOLKHAN_DOOR = 191325, + GO_IONAR_DOOR = 191326, + GO_LOKEN_DOOR = 191324, GO_LOKEN_THRONE = 192654 }; -#endif +template<class AI> +AI* GetHallsOfLightningAI(Creature* creature) +{ + return GetInstanceAI<AI>(creature, HoLScriptName); +} + +#endif // HALLS_OF_LIGHTNING_H_ diff --git a/src/server/scripts/Northrend/Ulduar/HallsOfLightning/instance_halls_of_lightning.cpp b/src/server/scripts/Northrend/Ulduar/HallsOfLightning/instance_halls_of_lightning.cpp index e6d2ededd73..6baf5dc6d93 100644 --- a/src/server/scripts/Northrend/Ulduar/HallsOfLightning/instance_halls_of_lightning.cpp +++ b/src/server/scripts/Northrend/Ulduar/HallsOfLightning/instance_halls_of_lightning.cpp @@ -1,6 +1,5 @@ /* * Copyright (C) 2008-2013 TrinityCore <http://www.trinitycore.org/> - * Copyright (C) 2006-2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/> * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the @@ -16,240 +15,186 @@ * with this program. If not, see <http://www.gnu.org/licenses/>. */ -/* ScriptData -SDName: Instance_Halls_of_Lightning -SD%Complete: 90% -SDComment: All ready. -SDCategory: Halls of Lightning -EndScriptData */ - #include "ScriptMgr.h" #include "InstanceScript.h" #include "halls_of_lightning.h" -/* Halls of Lightning encounters: -0 - General Bjarngrim -1 - Volkhan -2 - Ionar -3 - Loken -*/ +DoorData const doorData[] = +{ + { GO_BJARNGRIM_DOOR, DATA_BJARNGRIM, DOOR_TYPE_PASSAGE, BOUNDARY_NONE }, + { GO_VOLKHAN_DOOR, DATA_VOLKHAN, DOOR_TYPE_PASSAGE, BOUNDARY_NONE }, + { GO_IONAR_DOOR, DATA_IONAR, DOOR_TYPE_PASSAGE, BOUNDARY_NONE }, + { GO_LOKEN_DOOR, DATA_LOKEN, DOOR_TYPE_PASSAGE, BOUNDARY_NONE }, + { 0, 0, DOOR_TYPE_ROOM, BOUNDARY_NONE } // END +}; class instance_halls_of_lightning : public InstanceMapScript { -public: - instance_halls_of_lightning() : InstanceMapScript("instance_halls_of_lightning", 602) { } - - InstanceScript* GetInstanceScript(InstanceMap* map) const OVERRIDE - { - return new instance_halls_of_lightning_InstanceMapScript(map); - } - - struct instance_halls_of_lightning_InstanceMapScript : public InstanceScript - { - instance_halls_of_lightning_InstanceMapScript(Map* map) : InstanceScript(map) {} + public: + instance_halls_of_lightning() : InstanceMapScript(HoLScriptName, 602) { } - uint32 m_auiEncounter[MAX_ENCOUNTER]; - - uint64 m_uiGeneralBjarngrimGUID; - uint64 m_uiIonarGUID; - uint64 m_uiLokenGUID; - uint64 m_uiVolkhanGUID; - - uint64 m_uiBjarngrimDoorGUID; - uint64 m_uiVolkhanDoorGUID; - uint64 m_uiIonarDoorGUID; - uint64 m_uiLokenDoorGUID; - uint64 m_uiLokenGlobeGUID; - - void Initialize() OVERRIDE + struct instance_halls_of_lightning_InstanceMapScript : public InstanceScript { - memset(&m_auiEncounter, 0, sizeof(m_auiEncounter)); + instance_halls_of_lightning_InstanceMapScript(Map* map) : InstanceScript(map) + { + SetBossNumber(EncounterCount); + LoadDoorData(doorData); - m_uiGeneralBjarngrimGUID = 0; - m_uiVolkhanGUID = 0; - m_uiIonarGUID = 0; - m_uiLokenGUID = 0; + GeneralBjarngrimGUID = 0; + VolkhanGUID = 0; + IonarGUID = 0; + LokenGUID = 0; - m_uiBjarngrimDoorGUID = 0; - m_uiVolkhanDoorGUID = 0; - m_uiIonarDoorGUID = 0; - m_uiLokenDoorGUID = 0; - m_uiLokenGlobeGUID = 0; - } + LokenGlobeGUID = 0; + } - void OnCreatureCreate(Creature* creature) OVERRIDE - { - switch (creature->GetEntry()) + void OnCreatureCreate(Creature* creature) OVERRIDE { - case NPC_BJARNGRIM: - m_uiGeneralBjarngrimGUID = creature->GetGUID(); - break; - case NPC_VOLKHAN: - m_uiVolkhanGUID = creature->GetGUID(); - break; - case NPC_IONAR: - m_uiIonarGUID = creature->GetGUID(); - break; - case NPC_LOKEN: - m_uiLokenGUID = creature->GetGUID(); - break; + switch (creature->GetEntry()) + { + case NPC_BJARNGRIM: + GeneralBjarngrimGUID = creature->GetGUID(); + break; + case NPC_VOLKHAN: + VolkhanGUID = creature->GetGUID(); + break; + case NPC_IONAR: + IonarGUID = creature->GetGUID(); + break; + case NPC_LOKEN: + LokenGUID = creature->GetGUID(); + break; + default: + break; + } } - } - void OnGameObjectCreate(GameObject* go) OVERRIDE - { - switch (go->GetEntry()) + void OnGameObjectCreate(GameObject* go) OVERRIDE { - case GO_BJARNGRIM_DOOR: - m_uiBjarngrimDoorGUID = go->GetGUID(); - if (m_auiEncounter[0] == DONE) - go->SetGoState(GO_STATE_ACTIVE); - else - go->SetGoState(GO_STATE_READY); - break; - case GO_VOLKHAN_DOOR: - m_uiVolkhanDoorGUID = go->GetGUID(); - if (m_auiEncounter[1] == DONE) - go->SetGoState(GO_STATE_ACTIVE); - else - go->SetGoState(GO_STATE_READY); - break; - case GO_IONAR_DOOR: - m_uiIonarDoorGUID = go->GetGUID(); - if (m_auiEncounter[2] == DONE) - go->SetGoState(GO_STATE_ACTIVE); - else - go->SetGoState(GO_STATE_READY); - break; - case GO_LOKEN_DOOR: - m_uiLokenDoorGUID = go->GetGUID(); - if (m_auiEncounter[3] == DONE) - go->SetGoState(GO_STATE_ACTIVE); - else - go->SetGoState(GO_STATE_READY); - break; - case GO_LOKEN_THRONE: - m_uiLokenGlobeGUID = go->GetGUID(); - break; + switch (go->GetEntry()) + { + case GO_BJARNGRIM_DOOR: + case GO_VOLKHAN_DOOR: + case GO_IONAR_DOOR: + case GO_LOKEN_DOOR: + AddDoor(go, true); + break; + case GO_LOKEN_THRONE: + LokenGlobeGUID = go->GetGUID(); + break; + default: + break; + } } - } - void SetData(uint32 uiType, uint32 uiData) OVERRIDE - { - switch (uiType) + void OnGameObjectRemove(GameObject* go) OVERRIDE { - case TYPE_BJARNGRIM: - if (uiData == DONE) - if (GameObject* pDoor = instance->GetGameObject(m_uiBjarngrimDoorGUID)) - pDoor->SetGoState(GO_STATE_ACTIVE); - m_auiEncounter[0] = uiData; - break; - case TYPE_VOLKHAN: - if (uiData == DONE) - if (GameObject* pDoor = instance->GetGameObject(m_uiVolkhanDoorGUID)) - pDoor->SetGoState(GO_STATE_ACTIVE); - m_auiEncounter[1] = uiData; - break; - case TYPE_IONAR: - if (uiData == DONE) - if (GameObject* pDoor = instance->GetGameObject(m_uiIonarDoorGUID)) - pDoor->SetGoState(GO_STATE_ACTIVE); - m_auiEncounter[2] = uiData; - break; - case TYPE_LOKEN: - if (uiData == DONE) - { - if (GameObject* pDoor = instance->GetGameObject(m_uiLokenDoorGUID)) - pDoor->SetGoState(GO_STATE_ACTIVE); - - // Appears to be type 5 GO with animation. Need to figure out how this work, code below only placeholder - if (GameObject* pGlobe = instance->GetGameObject(m_uiLokenGlobeGUID)) - pGlobe->SetGoState(GO_STATE_ACTIVE); - } - m_auiEncounter[3] = uiData; - break; + switch (go->GetEntry()) + { + case GO_BJARNGRIM_DOOR: + case GO_VOLKHAN_DOOR: + case GO_IONAR_DOOR: + case GO_LOKEN_DOOR: + AddDoor(go, false); + break; + default: + break; + } } - if (uiData == DONE) - SaveToDB(); - } - - uint32 GetData(uint32 uiType) const OVERRIDE - { - switch (uiType) + bool SetBossState(uint32 type, EncounterState state) OVERRIDE { - case TYPE_BJARNGRIM: - return m_auiEncounter[0]; - case TYPE_VOLKHAN: - return m_auiEncounter[1]; - case TYPE_IONAR: - return m_auiEncounter[2]; - case TYPE_LOKEN: - return m_auiEncounter[3]; + if (!InstanceScript::SetBossState(type, state)) + return false; + + switch (type) + { + case DATA_LOKEN: + if (state == DONE) + if (GameObject* globe = instance->GetGameObject(LokenGlobeGUID)) + globe->SendCustomAnim(0); + break; + default: + break; + } + + return true; } - return 0; - } - uint64 GetData64(uint32 uiData) const OVERRIDE - { - switch (uiData) + uint64 GetData64(uint32 type) const OVERRIDE { - case DATA_BJARNGRIM: - return m_uiGeneralBjarngrimGUID; - case DATA_VOLKHAN: - return m_uiVolkhanGUID; - case DATA_IONAR: - return m_uiIonarGUID; - case DATA_LOKEN: - return m_uiLokenGUID; + switch (type) + { + case DATA_BJARNGRIM: + return GeneralBjarngrimGUID; + case DATA_VOLKHAN: + return VolkhanGUID; + case DATA_IONAR: + return IonarGUID; + case DATA_LOKEN: + return LokenGUID; + default: + break; + } + return 0; } - return 0; - } - std::string GetSaveData() OVERRIDE - { - OUT_SAVE_INST_DATA; + std::string GetSaveData() OVERRIDE + { + OUT_SAVE_INST_DATA; - std::ostringstream saveStream; - saveStream << "H L " << m_auiEncounter[0] << ' ' << m_auiEncounter[1] << ' ' - << m_auiEncounter[2] << ' ' << m_auiEncounter[3]; + std::ostringstream saveStream; + saveStream << "H L " << GetBossSaveData(); - OUT_SAVE_INST_DATA_COMPLETE; - return saveStream.str(); - } + OUT_SAVE_INST_DATA_COMPLETE; + return saveStream.str(); + } - void Load(const char* in) OVERRIDE - { - if (!in) + void Load(const char* str) OVERRIDE { - OUT_LOAD_INST_DATA_FAIL; - return; - } + if (!str) + { + OUT_LOAD_INST_DATA_FAIL; + return; + } - OUT_LOAD_INST_DATA(in); + OUT_LOAD_INST_DATA(str); - char dataHead1, dataHead2; - uint16 data0, data1, data2, data3; + char dataHead1, dataHead2; - std::istringstream loadStream(in); - loadStream >> dataHead1 >> dataHead2 >> data0 >> data1 >> data2 >> data3; + std::istringstream loadStream(str); + loadStream >> dataHead1 >> dataHead2; - if (dataHead1 == 'H' && dataHead2 == 'L') - { - m_auiEncounter[0] = data0; - m_auiEncounter[1] = data1; - m_auiEncounter[2] = data2; - m_auiEncounter[3] = data3; + if (dataHead1 == 'H' && dataHead2 == 'L') + { + for (uint32 i = 0; i < EncounterCount; ++i) + { + uint32 tmpState; + loadStream >> tmpState; + if (tmpState == IN_PROGRESS || tmpState > SPECIAL) + tmpState = NOT_STARTED; + SetBossState(i, EncounterState(tmpState)); + } + } + else + OUT_LOAD_INST_DATA_FAIL; - for (uint8 i = 0; i < MAX_ENCOUNTER; ++i) - if (m_auiEncounter[i] == IN_PROGRESS) - m_auiEncounter[i] = NOT_STARTED; - } else OUT_LOAD_INST_DATA_FAIL; + OUT_LOAD_INST_DATA_COMPLETE; + } - OUT_LOAD_INST_DATA_COMPLETE; - } - }; + protected: + uint64 GeneralBjarngrimGUID; + uint64 VolkhanGUID; + uint64 IonarGUID; + uint64 LokenGUID; + + uint64 LokenGlobeGUID; + }; + InstanceScript* GetInstanceScript(InstanceMap* map) const OVERRIDE + { + return new instance_halls_of_lightning_InstanceMapScript(map); + } }; void AddSC_instance_halls_of_lightning() diff --git a/src/server/scripts/Northrend/VioletHold/instance_violet_hold.cpp b/src/server/scripts/Northrend/VioletHold/instance_violet_hold.cpp index 025e93ac8d9..60d7570b96f 100644 --- a/src/server/scripts/Northrend/VioletHold/instance_violet_hold.cpp +++ b/src/server/scripts/Northrend/VioletHold/instance_violet_hold.cpp @@ -608,6 +608,7 @@ public: if (GameObject* pMainDoor = instance->GetGameObject(uiMainDoor)) pMainDoor->SetGoState(GO_STATE_READY); DoUpdateWorldState(WORLD_STATE_VH_PRISON_STATE, 100); + // no break } default: SpawnPortal(); diff --git a/src/server/scripts/Northrend/zone_borean_tundra.cpp b/src/server/scripts/Northrend/zone_borean_tundra.cpp index da8511a98d5..2b5508272d9 100644 --- a/src/server/scripts/Northrend/zone_borean_tundra.cpp +++ b/src/server/scripts/Northrend/zone_borean_tundra.cpp @@ -90,7 +90,7 @@ public: } } - void EnterCombat(Unit* /*who*/)OVERRIDE {} + void EnterCombat(Unit* /*who*/) OVERRIDE {} void UpdateAI(uint32 diff) OVERRIDE { @@ -119,7 +119,8 @@ public: case 3: DoCast(me, SPELL_EXPLODE_CART, true); phaseTimer = 2000; - phase = 4; + phase = 5; // @fixme: phase 4 is missing... + break; case 5: DoCast(me, SPELL_SUMMON_WORM, true); if (Unit* worm = me->FindNearestCreature(26250, 3)) diff --git a/src/server/scripts/Northrend/zone_sholazar_basin.cpp b/src/server/scripts/Northrend/zone_sholazar_basin.cpp index 86a65e98561..bf284c5138b 100644 --- a/src/server/scripts/Northrend/zone_sholazar_basin.cpp +++ b/src/server/scripts/Northrend/zone_sholazar_basin.cpp @@ -619,7 +619,7 @@ public: for (uint8 i = 0; i < 3; ++i) { - if (quest->RequiredNpcOrGo[i] != me->GetEntry()) + if (uint32(quest->RequiredNpcOrGo[i]) != me->GetEntry()) continue; if (itr->second.CreatureOrGOCount[i] != 0) diff --git a/src/server/scripts/Outland/BlackTemple/black_temple.h b/src/server/scripts/Outland/BlackTemple/black_temple.h index 971cc36d7ba..fb529a6b522 100644 --- a/src/server/scripts/Outland/BlackTemple/black_temple.h +++ b/src/server/scripts/Outland/BlackTemple/black_temple.h @@ -1,6 +1,5 @@ /* * Copyright (C) 2008-2013 TrinityCore <http://www.trinitycore.org/> - * Copyright (C) 2006-2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/> * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the @@ -19,36 +18,77 @@ #ifndef BLACK_TEMPLE_H_ #define BLACK_TEMPLE_H_ +#define BTScriptName "instance_black_temple" + uint32 const EncounterCount = 9; enum DataTypes { - DATA_AKAMA = 1, - DATA_AKAMA_SHADE = 2, - DATA_GURTOGGBLOODBOILEVENT = 3, - DATA_HIGHWARLORDNAJENTUS = 4, - DATA_HIGHWARLORDNAJENTUSEVENT = 5, - DATA_ILLIDANSTORMRAGE = 6, - DATA_ILLIDANSTORMRAGEEVENT = 7, - DATA_ILLIDARICOUNCILEVENT = 8, - DATA_ILLIDARICOUNCIL = 9, - DATA_LADYMALANDE = 10, - DATA_HIGHNETHERMANCERZEREVOR = 11, - DATA_GATHIOSTHESHATTERER = 12, - DATA_VERASDARKSHADOW = 13, - DATA_MOTHERSHAHRAZEVENT = 14, - DATA_RELIQUARYOFSOULSEVENT = 15, - DATA_SHADEOFAKAMA = 16, - DATA_SHADEOFAKAMAEVENT = 17, - DATA_SUPREMUS = 18, - DATA_SUPREMUSEVENT = 19, - DATA_TERONGOREFIENDEVENT = 20, - DATA_GAMEOBJECT_NAJENTUS_GATE = 21, - DATA_GAMEOBJECT_ILLIDAN_GATE = 22, - DATA_GAMEOBJECT_ILLIDAN_DOOR_R = 23, - DATA_GAMEOBJECT_ILLIDAN_DOOR_L = 24, - DATA_GAMEOBJECT_SUPREMUS_DOORS = 25, - DATA_BLOOD_ELF_COUNCIL_VOICE = 26 + // Encounter States/Boss GUIDs + DATA_HIGH_WARLORD_NAJENTUS = 0, + DATA_SUPREMUS = 1, + DATA_SHADE_OF_AKAMA = 2, + DATA_TERON_GOREFIEND = 3, + DATA_GURTOGG_BLOODBOIL = 4, + DATA_RELIQUARY_OF_SOULS = 5, + DATA_MOTHER_SHAHRAZ = 6, + DATA_ILLIDARI_COUNCIL = 7, + DATA_ILLIDAN_STORMRAGE = 8, + + // Additional Data + DATA_AKAMA_SHADE = 9, + DATA_AKAMA = 10, + + DATA_GATHIOS_THE_SHATTERER = 11, + DATA_HIGH_NETHERMANCER_ZEREVOR = 12, + DATA_LADY_MALANDE = 13, + DATA_VERAS_DARKSHADOW = 14, + DATA_BLOOD_ELF_COUNCIL_VOICE = 15, + + DATA_GO_ILLIDAN_GATE = 16, + DATA_GO_ILLIDAN_DOOR_R = 17, + DATA_GO_ILLIDAN_DOOR_L = 18 +}; + +enum CreatureIds +{ + NPC_HIGH_WARLORD_NAJENTUS = 22887, + NPC_SUPREMUS = 22898, + NPC_SHADE_OF_AKAMA = 22841, + NPC_AKAMA_SHADE = 23191, // This is the Akama that starts the Shade of Akama encounter. + NPC_AKAMA = 23089, // This is the Akama that starts the Illidan encounter. + + NPC_GATHIOS_THE_SHATTERER = 22949, + NPC_HIGH_NETHERMANCER_ZEREVOR = 22950, + NPC_LADY_MALANDE = 22951, + NPC_VERAS_DARKSHADOW = 22952, + NPC_ILLIDARI_COUNCIL = 23426, + NPC_BLOOD_ELF_COUNCIL_VOICE = 23499, + + NPC_ILLIDAN_STORMRAGE = 22917 }; -#endif +enum GameObjectIds +{ + GO_NAJENTUS_GATE = 185483, + GO_SUPREMUS_GATE = 185882, + GO_SHADE_OF_AKAMA_DOOR = 185478, + GO_TERON_DOOR_1 = 185480, + GO_TERON_DOOR_2 = 186153, + GO_GURTOGG_DOOR = 185892, + GO_TEMPLE_DOOR = 185479, + GO_MOTHER_SHAHRAZ_DOOR = 185482, + GO_COUNCIL_DOOR_1 = 185481, + GO_COUNCIL_DOOR_2 = 186152, + GO_ILLIDAN_GATE = 185905, + GO_ILLIDAN_DOOR_R = 186261, + GO_ILLIDAN_DOOR_L = 186262 +}; + +template<class AI> +AI* GetBlackTempleAI(Creature* creature) +{ + return GetInstanceAI<AI>(creature, BTScriptName); +} + +#endif // BLACK_TEMPLE_H_ diff --git a/src/server/scripts/Outland/BlackTemple/boss_bloodboil.cpp b/src/server/scripts/Outland/BlackTemple/boss_bloodboil.cpp index 7a11044476a..3a33885144d 100644 --- a/src/server/scripts/Outland/BlackTemple/boss_bloodboil.cpp +++ b/src/server/scripts/Outland/BlackTemple/boss_bloodboil.cpp @@ -96,7 +96,7 @@ public: void Reset() OVERRIDE { if (instance) - instance->SetData(DATA_GURTOGGBLOODBOILEVENT, NOT_STARTED); + instance->SetBossState(DATA_GURTOGG_BLOODBOIL, NOT_STARTED); TargetGUID = 0; @@ -124,7 +124,7 @@ public: DoZoneInCombat(); Talk(SAY_AGGRO); if (instance) - instance->SetData(DATA_GURTOGGBLOODBOILEVENT, IN_PROGRESS); + instance->SetBossState(DATA_GURTOGG_BLOODBOIL, IN_PROGRESS); } void KilledUnit(Unit* /*victim*/) OVERRIDE @@ -135,7 +135,7 @@ public: void JustDied(Unit* /*killer*/) OVERRIDE { if (instance) - instance->SetData(DATA_GURTOGGBLOODBOILEVENT, DONE); + instance->SetBossState(DATA_GURTOGG_BLOODBOIL, DONE); Talk(SAY_DEATH); } diff --git a/src/server/scripts/Outland/BlackTemple/boss_illidan.cpp b/src/server/scripts/Outland/BlackTemple/boss_illidan.cpp index f8f9bb790e0..4dedc774bb8 100644 --- a/src/server/scripts/Outland/BlackTemple/boss_illidan.cpp +++ b/src/server/scripts/Outland/BlackTemple/boss_illidan.cpp @@ -543,9 +543,9 @@ public: if (!instance) return; - instance->SetData(DATA_ILLIDANSTORMRAGEEVENT, DONE); // Completed + instance->SetBossState(DATA_ILLIDAN_STORMRAGE, DONE); - for (uint8 i = DATA_GAMEOBJECT_ILLIDAN_DOOR_R; i < DATA_GAMEOBJECT_ILLIDAN_DOOR_L + 1; ++i) + for (uint8 i = DATA_GO_ILLIDAN_DOOR_R; i < DATA_GO_ILLIDAN_DOOR_L + 1; ++i) instance->HandleGameObject(instance->GetData64(i), true); } @@ -1369,12 +1369,12 @@ public: WalkCount = 0; if (instance) { - instance->SetData(DATA_ILLIDANSTORMRAGEEVENT, NOT_STARTED); + instance->SetBossState(DATA_ILLIDAN_STORMRAGE, NOT_STARTED); - IllidanGUID = instance->GetData64(DATA_ILLIDANSTORMRAGE); - GateGUID = instance->GetData64(DATA_GAMEOBJECT_ILLIDAN_GATE); - DoorGUID[0] = instance->GetData64(DATA_GAMEOBJECT_ILLIDAN_DOOR_R); - DoorGUID[1] = instance->GetData64(DATA_GAMEOBJECT_ILLIDAN_DOOR_L); + IllidanGUID = instance->GetData64(DATA_ILLIDAN_STORMRAGE); + GateGUID = instance->GetData64(DATA_GO_ILLIDAN_GATE); + DoorGUID[0] = instance->GetData64(DATA_GO_ILLIDAN_DOOR_R); + DoorGUID[1] = instance->GetData64(DATA_GO_ILLIDAN_DOOR_L); if (JustCreated) // close all doors at create { @@ -1463,7 +1463,7 @@ public: if (!instance) return; - instance->SetData(DATA_ILLIDANSTORMRAGEEVENT, IN_PROGRESS); + instance->SetBossState(DATA_ILLIDAN_STORMRAGE, IN_PROGRESS); for (uint8 i = 0; i < 2; ++i) instance->HandleGameObject(DoorGUID[i], false); if (Creature* illidan = ObjectAccessor::GetCreature(*me, IllidanGUID)) @@ -1691,7 +1691,7 @@ public: { if (Check_Timer <= diff) { - if (instance && instance->GetData(DATA_ILLIDARICOUNCILEVENT) == DONE) + if (instance && instance->GetBossState(DATA_ILLIDARI_COUNCIL) == DONE) me->SetVisible(true); Check_Timer = 5000; @@ -1800,18 +1800,14 @@ public: void boss_illidan_stormrage::boss_illidan_stormrageAI::Reset() { if (instance) - instance->SetData(DATA_ILLIDANSTORMRAGEEVENT, NOT_STARTED); + instance->SetBossState(DATA_ILLIDAN_STORMRAGE, NOT_STARTED); - if (AkamaGUID) + if (Creature* akama = ObjectAccessor::GetCreature(*me, AkamaGUID)) { - if (Creature* akama = ObjectAccessor::GetCreature(*me, AkamaGUID)) - { - if (!akama->IsAlive()) - akama->Respawn(); - else - akama->AI()->EnterEvadeMode(); - } - AkamaGUID = 0; + if (!akama->IsAlive()) + akama->Respawn(); + else + akama->AI()->EnterEvadeMode(); } MaievGUID = 0; @@ -2164,7 +2160,7 @@ public: void Reset() OVERRIDE { if (instance) - IllidanGUID = instance->GetData64(DATA_ILLIDANSTORMRAGE); + IllidanGUID = instance->GetData64(DATA_ILLIDAN_STORMRAGE); else IllidanGUID = 0; diff --git a/src/server/scripts/Outland/BlackTemple/boss_mother_shahraz.cpp b/src/server/scripts/Outland/BlackTemple/boss_mother_shahraz.cpp index b9172be49da..aafe5f365b2 100644 --- a/src/server/scripts/Outland/BlackTemple/boss_mother_shahraz.cpp +++ b/src/server/scripts/Outland/BlackTemple/boss_mother_shahraz.cpp @@ -114,7 +114,7 @@ public: void Reset() OVERRIDE { if (instance) - instance->SetData(DATA_MOTHERSHAHRAZEVENT, NOT_STARTED); + instance->SetBossState(DATA_MOTHER_SHAHRAZ, NOT_STARTED); for (uint8 i = 0; i<3; ++i) TargetGUID[i] = 0; @@ -137,7 +137,7 @@ public: void EnterCombat(Unit* /*who*/) OVERRIDE { if (instance) - instance->SetData(DATA_MOTHERSHAHRAZEVENT, IN_PROGRESS); + instance->SetBossState(DATA_MOTHER_SHAHRAZ, IN_PROGRESS); DoZoneInCombat(); Talk(SAY_AGGRO); @@ -151,7 +151,7 @@ public: void JustDied(Unit* /*killer*/) OVERRIDE { if (instance) - instance->SetData(DATA_MOTHERSHAHRAZEVENT, DONE); + instance->SetBossState(DATA_MOTHER_SHAHRAZ, DONE); Talk(SAY_DEATH); } diff --git a/src/server/scripts/Outland/BlackTemple/boss_reliquary_of_souls.cpp b/src/server/scripts/Outland/BlackTemple/boss_reliquary_of_souls.cpp index c7de0dea961..ab3bc98b41b 100644 --- a/src/server/scripts/Outland/BlackTemple/boss_reliquary_of_souls.cpp +++ b/src/server/scripts/Outland/BlackTemple/boss_reliquary_of_souls.cpp @@ -159,14 +159,13 @@ public: void Reset() OVERRIDE { if (instance) - instance->SetData(DATA_RELIQUARYOFSOULSEVENT, NOT_STARTED); + instance->SetBossState(DATA_RELIQUARY_OF_SOULS, NOT_STARTED); if (EssenceGUID) { - if (Creature* Essence = Unit::GetCreature(*me, EssenceGUID)) - { - Essence->DespawnOrUnsummon(); - } + if (Creature* essence = ObjectAccessor::GetCreature(*me, EssenceGUID)) + essence->DespawnOrUnsummon(); + EssenceGUID = 0; } @@ -178,7 +177,6 @@ public: } void MoveInLineOfSight(Unit* who) OVERRIDE - { if (!who) return; @@ -200,7 +198,7 @@ public: me->AddThreat(who, 10000.0f); DoZoneInCombat(); if (instance) - instance->SetData(DATA_RELIQUARYOFSOULSEVENT, IN_PROGRESS); + instance->SetBossState(DATA_RELIQUARY_OF_SOULS, IN_PROGRESS); Phase = 1; Counter = 0; @@ -246,7 +244,7 @@ public: void JustDied(Unit* /*killer*/) OVERRIDE { if (instance) - instance->SetData(DATA_RELIQUARYOFSOULSEVENT, DONE); + instance->SetBossState(DATA_RELIQUARY_OF_SOULS, DONE); } void UpdateAI(uint32 diff) OVERRIDE diff --git a/src/server/scripts/Outland/BlackTemple/boss_shade_of_akama.cpp b/src/server/scripts/Outland/BlackTemple/boss_shade_of_akama.cpp index 4a4304bcd24..a1a965ed015 100644 --- a/src/server/scripts/Outland/BlackTemple/boss_shade_of_akama.cpp +++ b/src/server/scripts/Outland/BlackTemple/boss_shade_of_akama.cpp @@ -123,23 +123,22 @@ enum Events EVENT_SUMMON_ASHTONGUE_SORCERER = 12, EVENT_SUMMON_ASHTONGUE_DEFENDER = 13, // Channeler - EVENT_GET_SHADE_GUID = 14, - EVENT_CHANNEL = 15, + EVENT_CHANNEL = 14, // Ashtongue Sorcerer - EVENT_SORCERER_CHANNEL = 16, + EVENT_SORCERER_CHANNEL = 15, // Ashtongue Defender - EVENT_DEBILITATING_STRIKE = 17, - EVENT_HEROIC_STRIKE = 18, - EVENT_SHIELD_BASH = 19, - EVENT_WINDFURY = 20, + EVENT_DEBILITATING_STRIKE = 16, + EVENT_HEROIC_STRIKE = 17, + EVENT_SHIELD_BASH = 18, + EVENT_WINDFURY = 29, // Ashtongue Rogue - EVENT_DEBILITATING_POISON = 21, - EVENT_EVISCERATE = 22, + EVENT_DEBILITATING_POISON = 20, + EVENT_EVISCERATE = 21, // Ashtongue Elementalist - EVENT_RAIN_OF_FIRE = 23, - EVENT_LIGHTNING_BOLT = 24, + EVENT_RAIN_OF_FIRE = 22, + EVENT_LIGHTNING_BOLT = 23, // Ashtongue Spiritbinder - EVENT_SPIRIT_HEAL = 25, + EVENT_SPIRIT_HEAL = 24 }; struct Location @@ -177,11 +176,11 @@ public: if (!HasKilledAkamaAndReseting) { for (std::list<uint64>::const_iterator itr = Channelers.begin(); itr != Channelers.end(); ++itr) - if (Creature* Channeler = (Unit::GetCreature(*me, *itr))) + if (Creature* Channeler = ObjectAccessor::GetCreature(*me, *itr)) Channeler->DespawnOrUnsummon(); for (std::list<uint64>::const_iterator itr = Spawners.begin(); itr != Spawners.end(); ++itr) - if (Creature* Spawner = (Unit::GetCreature(*me, *itr))) + if (Creature* Spawner = ObjectAccessor::GetCreature(*me, *itr)) Spawner->AI()->SetData(SETDATA_DATA, SETDATA_DESPAWN_ALL_SPAWNS); events.ScheduleEvent(EVENT_FIND_CHANNELERS_SPAWNERS, 3000); @@ -200,16 +199,16 @@ public: void JustDied(Unit* /*killer*/) OVERRIDE { if (instance) - instance->SetData(DATA_SHADEOFAKAMAEVENT, DONE); + instance->SetBossState(DATA_SHADE_OF_AKAMA, DONE); } - void EnterCombat(Unit* /*who*/) OVERRIDE {} + void EnterCombat(Unit* /*who*/) OVERRIDE { } void AttackStart(Unit* who) OVERRIDE { if (me->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE)) { - if (Creature* Akama = Unit::GetCreature((*me), akamaGUID)) + if (Creature* Akama = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_AKAMA_SHADE))) if (Akama->IsAlive()) ScriptedAI::AttackStart(Akama); } @@ -233,7 +232,7 @@ public: events.ScheduleEvent(EVENT_START_ATTACK_AKAMA, 500); events.ScheduleEvent(EVENT_SET_CHANNELERS_SPAWNERS, 1000); me->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_STATE_NONE); - if (Creature* Akama = Unit::GetCreature((*me), akamaGUID)) + if (Creature* Akama = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_AKAMA_SHADE))) me->AddThreat(Akama, 10000000.0f); } else if (spell->Id == SPELL_SHADE_SOUL_CHANNEL_2) @@ -269,7 +268,7 @@ public: switch (eventId) { case EVENT_RESET_ENCOUNTER: - if (Creature* Akama = Unit::GetCreature((*me), akamaGUID)) + if (Creature* Akama = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_AKAMA_SHADE))) if (!Akama->IsAlive()) Akama->Respawn(); break; @@ -294,7 +293,6 @@ public: Spawners.push_back((*itr)->GetGUID()); me->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_STATE_STUN); - akamaGUID = instance->GetData64(DATA_AKAMA_SHADE); break; } default: @@ -312,20 +310,19 @@ public: { for (std::list<uint64>::const_iterator itr = Channelers.begin(); itr != Channelers.end(); ++itr) { - if (Creature* Channeler = (Unit::GetCreature(*me, *itr))) + if (Creature* Channeler = ObjectAccessor::GetCreature(*me, *itr)) Channeler->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); } for (std::list<uint64>::const_iterator itr = Spawners.begin(); itr != Spawners.end(); ++itr) { - if (Creature* Spawner = (Unit::GetCreature(*me, *itr))) + if (Creature* Spawner = ObjectAccessor::GetCreature(*me, *itr)) Spawner->AI()->SetData(SETDATA_DATA, SETDATA_START_SPAWNING); } - break; } case EVENT_START_ATTACK_AKAMA: - me->GetMotionMaster()->MovePoint(0, ShadeWP.x, ShadeWP.y, ShadeWP.z ,false); + me->GetMotionMaster()->MovePoint(0, ShadeWP.x, ShadeWP.y, ShadeWP.z, false); events.ScheduleEvent(EVENT_START_ATTACK_AKAMA, 1000); break; case EVENT_ADD_THREAT: @@ -343,7 +340,7 @@ public: { HasKilledAkamaAndReseting = true; me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); - instance->SetData(DATA_SHADEOFAKAMAEVENT, NOT_STARTED); + instance->SetBossState(DATA_SHADE_OF_AKAMA, NOT_STARTED); me->RemoveAllAurasExceptType(SPELL_AURA_DUMMY); me->DeleteThreatList(); me->CombatStop(); @@ -351,15 +348,15 @@ public: me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC); combatStarted = false; - if (Creature* Akama = Unit::GetCreature((*me), akamaGUID)) + if (Creature* Akama = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_AKAMA_SHADE))) Akama->DespawnOrUnsummon(); for (std::list<uint64>::const_iterator itr = Channelers.begin(); itr != Channelers.end(); ++itr) - if (Creature* Channeler = (Unit::GetCreature(*me, *itr))) + if (Creature* Channeler = ObjectAccessor::GetCreature(*me, *itr)) Channeler->DespawnOrUnsummon(); for (std::list<uint64>::const_iterator itr = Spawners.begin(); itr != Spawners.end(); ++itr) - if (Creature* Spawner = (Unit::GetCreature(*me, *itr))) + if (Creature* Spawner = ObjectAccessor::GetCreature(*me, *itr)) Spawner->AI()->SetData(SETDATA_DATA, SETDATA_DESPAWN_ALL_SPAWNS); events.ScheduleEvent(EVENT_FIND_CHANNELERS_SPAWNERS, 10000); @@ -369,7 +366,7 @@ public: if (!akamaReached) { - if (Creature* Akama = Unit::GetCreature((*me), akamaGUID)) + if (Creature* Akama = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_AKAMA_SHADE))) { if (me->IsWithinDist(Akama, 2.0f, false)) { @@ -384,7 +381,7 @@ public: events.ScheduleEvent(EVENT_ADD_THREAT, 100); for (std::list<uint64>::const_iterator itr = Spawners.begin(); itr != Spawners.end(); ++itr) - if (Creature* Spawner = (Unit::GetCreature(*me, *itr))) + if (Creature* Spawner = ObjectAccessor::GetCreature(*me, *itr)) Spawner->AI()->SetData(SETDATA_DATA, SETDATA_STOP_SPAWNING); } } @@ -401,8 +398,6 @@ public: EventMap events; std::list<uint64> Channelers; std::list<uint64> Spawners; - uint64 akamaGUID; - uint64 ShadeGUID; bool akamaReached; bool combatStarted; bool HasKilledAkamaAndReseting; @@ -443,7 +438,7 @@ public: void JustDied(Unit* /*killer*/) OVERRIDE { - if (Creature* Shade = Unit::GetCreature((*me), ShadeGUID)) + if (Creature* Shade = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_SHADE_OF_AKAMA))) if (Shade->IsAlive()) CAST_AI(boss_shade_of_akama::boss_shade_of_akamaAI, Shade->AI())->HasKilledAkama = true; me->GetMotionMaster()->Clear(true); @@ -452,17 +447,14 @@ public: void SpellHit(Unit* /*caster*/, SpellInfo const* spell) OVERRIDE { - if (!StartCombat) + if (spell->Id == SPELL_THREAT && !StartCombat) { - if (spell->Id == SPELL_THREAT) - { - me->ClearUnitState(UNIT_STATE_ROOT); - me->RemoveAura(SPELL_AKAMA_SOUL_CHANNEL); - me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_STUNNED); - if (Creature* Shade = Unit::GetCreature((*me), ShadeGUID)) - Shade->RemoveAura(SPELL_AKAMA_SOUL_CHANNEL); - StartCombat = true; - } + me->ClearUnitState(UNIT_STATE_ROOT); + me->RemoveAura(SPELL_AKAMA_SOUL_CHANNEL); + me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_STUNNED); + if (Creature* Shade = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_SHADE_OF_AKAMA))) + Shade->RemoveAura(SPELL_AKAMA_SOUL_CHANNEL); + StartCombat = true; } } @@ -485,8 +477,7 @@ public: case EVENT_SHADE_START: if (instance) { - ShadeGUID = instance->GetData64(DATA_SHADEOFAKAMA); - instance->SetData(DATA_SHADEOFAKAMAEVENT, IN_PROGRESS); + instance->SetBossState(DATA_SHADE_OF_AKAMA, IN_PROGRESS); me->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP); me->RemoveAura(SPELL_STEALTH); me->SetWalk(true); @@ -550,7 +541,6 @@ public: private: InstanceScript* instance; EventMap events; - uint64 ShadeGUID; bool StartChannel; bool ShadeHasDied; bool StartCombat; @@ -587,17 +577,16 @@ public: me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); events.ScheduleEvent(EVENT_CHANNEL, 2000); - events.ScheduleEvent(EVENT_GET_SHADE_GUID, 1000); } void JustDied(Unit* /*killer*/) OVERRIDE { - if (Creature* Shade = (Unit::GetCreature((*me), ShadeGUID))) + if (Creature* Shade = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_SHADE_OF_AKAMA))) Shade->AI()->SetData(SETDATA_DATA, SETDATA_CHANNELER_DIED); } - void EnterCombat(Unit* /*who*/) OVERRIDE {} - void AttackStart(Unit* /*who*/) OVERRIDE {} + void EnterCombat(Unit* /*who*/) OVERRIDE { } + void AttackStart(Unit* /*who*/) OVERRIDE { } void UpdateAI(uint32 diff) OVERRIDE { @@ -608,7 +597,7 @@ public: switch (eventId) { case EVENT_CHANNEL: - if (Creature* Shade = (Unit::GetCreature((*me), ShadeGUID))) + if (Creature* Shade = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_SHADE_OF_AKAMA))) { if (Shade->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE)) DoCast(me, SPELL_SHADE_SOUL_CHANNEL); @@ -620,10 +609,6 @@ public: } events.ScheduleEvent(EVENT_CHANNEL, 2000); break; - case EVENT_GET_SHADE_GUID: - if (instance) - ShadeGUID = instance->GetData64(DATA_SHADEOFAKAMA); - break; default: break; } @@ -633,7 +618,6 @@ public: private: InstanceScript* instance; EventMap events; - uint64 ShadeGUID; }; CreatureAI* GetAI(Creature* creature) const OVERRIDE @@ -764,25 +748,19 @@ public: npc_ashtongue_sorcererAI(Creature* creature) : ScriptedAI(creature) { instance = creature->GetInstanceScript(); - - if (instance) - { - akamaGUID = instance->GetData64(DATA_AKAMA_SHADE); - shadeGUID = instance->GetData64(DATA_SHADEOFAKAMA); - } } void Reset() OVERRIDE { if (!startedBanishing) { - if (Creature* Shade = (Unit::GetCreature((*me), shadeGUID))) + if (Creature* Shade = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_SHADE_OF_AKAMA))) { if (Shade->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE)) me->GetMotionMaster()->MovePoint(0, Shade->GetPositionX(), Shade->GetPositionY(), Shade->GetPositionZ(), false); else { - if (Unit* target = me->GetCreature(*me, akamaGUID)) + if (Unit* target = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_AKAMA_SHADE))) AttackStart(target); } } @@ -795,7 +773,7 @@ public: void JustDied(Unit* /*killer*/) OVERRIDE { - if (Creature* Shade = (Unit::GetCreature((*me), shadeGUID))) + if (Creature* Shade = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_SHADE_OF_AKAMA))) Shade->AI()->SetData(SETDATA_DATA, SETDATA_CHANNELER_DIED); me->DespawnOrUnsummon(5000); } @@ -824,7 +802,7 @@ public: switch (eventId) { case EVENT_SORCERER_CHANNEL: - if (Creature* Shade = (Unit::GetCreature((*me), shadeGUID))) + if (Creature* Shade = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_SHADE_OF_AKAMA))) { if (Shade->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE)) { @@ -837,7 +815,7 @@ public: me->InterruptSpell(CURRENT_CHANNELED_SPELL); Shade->AI()->SetData(SETDATA_DATA, SETDATA_CHANNELER_DIED); switchToCombat = true; - if (Unit* target = me->GetCreature(*me, akamaGUID)) + if (Unit* target = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_AKAMA_SHADE))) AttackStart(target); } } @@ -849,7 +827,7 @@ public: if (!startedBanishing) { - Creature* Shade = Unit::GetCreature((*me), shadeGUID); + Creature* Shade = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_SHADE_OF_AKAMA)); if (me->IsWithinDist(Shade, 20.0f, false)) { me->StopMoving(); @@ -866,8 +844,6 @@ public: private: InstanceScript* instance; EventMap events; - uint64 akamaGUID; - uint64 shadeGUID; uint64 summonerGuid; float distanceToShade; bool startedBanishing; @@ -894,15 +870,13 @@ public: npc_ashtongue_defenderAI(Creature* creature) : ScriptedAI(creature) { instance = creature->GetInstanceScript(); - if (instance) - akamaGUID = instance->GetData64(DATA_AKAMA_SHADE); } void Reset() OVERRIDE { summonerGuid = 0; - if (Unit* target = me->GetCreature(*me, akamaGUID)) + if (Unit* target = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_AKAMA_SHADE))) AttackStart(target); } @@ -956,13 +930,13 @@ public: break; } } + DoMeleeAttackIfReady(); } private: InstanceScript* instance; EventMap events; - uint64 akamaGUID; uint64 summonerGuid; }; @@ -986,15 +960,13 @@ public: npc_ashtongue_rogueAI(Creature* creature) : ScriptedAI(creature) { instance = creature->GetInstanceScript(); - if (instance) - akamaGUID = instance->GetData64(DATA_AKAMA_SHADE); } void Reset() OVERRIDE { summonerGuid = 0; - if (Unit* target = me->GetCreature(*me, akamaGUID)) + if (Unit* target = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_AKAMA_SHADE))) AttackStart(target); } @@ -1038,13 +1010,13 @@ public: break; } } + DoMeleeAttackIfReady(); } private: InstanceScript* instance; EventMap events; - uint64 akamaGUID; uint64 summonerGuid; }; @@ -1068,15 +1040,13 @@ public: npc_ashtongue_elementalistAI(Creature* creature) : ScriptedAI(creature) { instance = creature->GetInstanceScript(); - if (instance) - akamaGUID = instance->GetData64(DATA_AKAMA_SHADE); } void Reset() OVERRIDE { summonerGuid = 0; - if (Unit* target = me->GetCreature(*me, akamaGUID)) + if (Unit* target = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_AKAMA_SHADE))) AttackStart(target); } @@ -1120,13 +1090,13 @@ public: break; } } + DoMeleeAttackIfReady(); } private: InstanceScript* instance; EventMap events; - uint64 akamaGUID; uint64 summonerGuid; }; @@ -1150,8 +1120,6 @@ public: npc_ashtongue_spiritbinderAI(Creature* creature) : ScriptedAI(creature) { instance = creature->GetInstanceScript(); - if (instance) - akamaGUID = instance->GetData64(DATA_AKAMA_SHADE); } void Reset() OVERRIDE @@ -1160,7 +1128,7 @@ public: chainHeal = false; summonerGuid = 0; - if (Unit* target = me->GetCreature(*me, akamaGUID)) + if (Unit* target = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_AKAMA_SHADE))) AttackStart(target); } @@ -1224,7 +1192,6 @@ public: private: InstanceScript* instance; EventMap events; - uint64 akamaGUID; uint64 summonerGuid; bool spiritMend; bool chainHeal; diff --git a/src/server/scripts/Outland/BlackTemple/boss_supremus.cpp b/src/server/scripts/Outland/BlackTemple/boss_supremus.cpp index fbc3e387e8e..94423f87bdf 100644 --- a/src/server/scripts/Outland/BlackTemple/boss_supremus.cpp +++ b/src/server/scripts/Outland/BlackTemple/boss_supremus.cpp @@ -31,7 +31,7 @@ EndScriptData */ enum Supremus { EMOTE_NEW_TARGET = 0, - EMOTE_PUNCH_GROUND = 1, //Talk(EMOTE_PUNCH_GROUND); + EMOTE_PUNCH_GROUND = 1, EMOTE_GROUND_CRACK = 2, //Spells @@ -110,11 +110,7 @@ public: if (instance) { if (me->IsAlive()) - { - instance->SetData(DATA_SUPREMUSEVENT, NOT_STARTED); - //ToggleDoors(true); - } - //else ToggleDoors(false); + instance->SetBossState(DATA_SUPREMUS, NOT_STARTED); } phase = 0; @@ -126,7 +122,7 @@ public: void EnterCombat(Unit* /*who*/) OVERRIDE { if (instance) - instance->SetData(DATA_SUPREMUSEVENT, IN_PROGRESS); + instance->SetBossState(DATA_SUPREMUS, IN_PROGRESS); ChangePhase(); events.ScheduleEvent(EVENT_BERSERK, 900000, GCD_CAST); @@ -163,10 +159,8 @@ public: void JustDied(Unit* /*killer*/) OVERRIDE { if (instance) - { - instance->SetData(DATA_SUPREMUSEVENT, DONE); - instance->HandleGameObject(instance->GetData64(DATA_GAMEOBJECT_SUPREMUS_DOORS), true); - } + instance->SetBossState(DATA_SUPREMUS, DONE); + summons.DespawnAll(); } diff --git a/src/server/scripts/Outland/BlackTemple/boss_teron_gorefiend.cpp b/src/server/scripts/Outland/BlackTemple/boss_teron_gorefiend.cpp index a861980ae42..c02954c7b2f 100644 --- a/src/server/scripts/Outland/BlackTemple/boss_teron_gorefiend.cpp +++ b/src/server/scripts/Outland/BlackTemple/boss_teron_gorefiend.cpp @@ -247,7 +247,7 @@ public: void Reset() OVERRIDE { if (instance) - instance->SetData(DATA_TERONGOREFIENDEVENT, NOT_STARTED); + instance->SetBossState(DATA_TERON_GOREFIEND, NOT_STARTED); IncinerateTimer = urand(20000, 31000); SummonDoomBlossomTimer = 12000; @@ -276,7 +276,7 @@ public: if (me->IsWithinDistInMap(who, VISIBLE_RANGE) && me->IsWithinLOSInMap(who)) { if (instance) - instance->SetData(DATA_TERONGOREFIENDEVENT, IN_PROGRESS); + instance->SetBossState(DATA_TERON_GOREFIEND, IN_PROGRESS); me->GetMotionMaster()->Clear(false); me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); @@ -298,7 +298,7 @@ public: void JustDied(Unit* /*killer*/) OVERRIDE { if (instance) - instance->SetData(DATA_TERONGOREFIENDEVENT, DONE); + instance->SetBossState(DATA_TERON_GOREFIEND, DONE); Talk(SAY_DEATH); } diff --git a/src/server/scripts/Outland/BlackTemple/boss_warlord_najentus.cpp b/src/server/scripts/Outland/BlackTemple/boss_warlord_najentus.cpp index 532c66bb14a..1f4a36afad6 100644 --- a/src/server/scripts/Outland/BlackTemple/boss_warlord_najentus.cpp +++ b/src/server/scripts/Outland/BlackTemple/boss_warlord_najentus.cpp @@ -100,7 +100,7 @@ public: SpineTargetGUID = 0; if (instance) - instance->SetData(DATA_HIGHWARLORDNAJENTUSEVENT, NOT_STARTED); + instance->SetBossState(DATA_HIGH_WARLORD_NAJENTUS, NOT_STARTED); } void KilledUnit(Unit* /*victim*/) OVERRIDE @@ -112,7 +112,7 @@ public: void JustDied(Unit* /*killer*/) OVERRIDE { if (instance) - instance->SetData(DATA_HIGHWARLORDNAJENTUSEVENT, DONE); + instance->SetBossState(DATA_HIGH_WARLORD_NAJENTUS, DONE); Talk(SAY_DEATH); } @@ -130,7 +130,7 @@ public: void EnterCombat(Unit* /*who*/) OVERRIDE { if (instance) - instance->SetData(DATA_HIGHWARLORDNAJENTUSEVENT, IN_PROGRESS); + instance->SetBossState(DATA_HIGH_WARLORD_NAJENTUS, IN_PROGRESS); Talk(SAY_AGGRO); DoZoneInCombat(); @@ -228,7 +228,7 @@ public: bool OnGossipHello(Player* player, GameObject* go) OVERRIDE { if (InstanceScript* instance = go->GetInstanceScript()) - if (Creature* Najentus = Unit::GetCreature(*go, instance->GetData64(DATA_HIGHWARLORDNAJENTUS))) + if (Creature* Najentus = ObjectAccessor::GetCreature(*go, instance->GetData64(DATA_HIGH_WARLORD_NAJENTUS))) if (CAST_AI(boss_najentus::boss_najentusAI, Najentus->AI())->RemoveImpalingSpine()) { player->CastSpell(player, SPELL_CREATE_NAJENTUS_SPINE, true); diff --git a/src/server/scripts/Outland/BlackTemple/illidari_council.cpp b/src/server/scripts/Outland/BlackTemple/illidari_council.cpp index 290641437f3..05d19eb62bf 100644 --- a/src/server/scripts/Outland/BlackTemple/illidari_council.cpp +++ b/src/server/scripts/Outland/BlackTemple/illidari_council.cpp @@ -157,10 +157,10 @@ public: { if (InstanceScript* instance = me->GetInstanceScript()) { - Council[0] = instance->GetData64(DATA_GATHIOSTHESHATTERER); - Council[1] = instance->GetData64(DATA_VERASDARKSHADOW); - Council[2] = instance->GetData64(DATA_LADYMALANDE); - Council[3] = instance->GetData64(DATA_HIGHNETHERMANCERZEREVOR); + Council[0] = instance->GetData64(DATA_GATHIOS_THE_SHATTERER); + Council[1] = instance->GetData64(DATA_VERAS_DARKSHADOW); + Council[2] = instance->GetData64(DATA_LADY_MALANDE); + Council[3] = instance->GetData64(DATA_HIGH_NETHERMANCER_ZEREVOR); } else TC_LOG_ERROR(LOG_FILTER_TSCR, ERROR_INST_DATA); } @@ -265,8 +265,8 @@ public: if (instance) { - instance->SetData(DATA_ILLIDARICOUNCILEVENT, NOT_STARTED); - if (Creature* VoiceTrigger = (Unit::GetCreature(*me, instance->GetData64(DATA_BLOOD_ELF_COUNCIL_VOICE)))) + instance->SetBossState(DATA_ILLIDARI_COUNCIL, NOT_STARTED); + if (Creature* VoiceTrigger = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_BLOOD_ELF_COUNCIL_VOICE))) VoiceTrigger->AI()->EnterEvadeMode(); } @@ -289,13 +289,13 @@ public: if (target && target->IsAlive()) { - Council[0] = instance->GetData64(DATA_GATHIOSTHESHATTERER); - Council[1] = instance->GetData64(DATA_HIGHNETHERMANCERZEREVOR); - Council[2] = instance->GetData64(DATA_LADYMALANDE); - Council[3] = instance->GetData64(DATA_VERASDARKSHADOW); + Council[0] = instance->GetData64(DATA_GATHIOS_THE_SHATTERER); + Council[1] = instance->GetData64(DATA_HIGH_NETHERMANCER_ZEREVOR); + Council[2] = instance->GetData64(DATA_LADY_MALANDE); + Council[3] = instance->GetData64(DATA_VERAS_DARKSHADOW); // Start the event for the Voice Trigger - if (Creature* VoiceTrigger = (Unit::GetCreature(*me, instance->GetData64(DATA_BLOOD_ELF_COUNCIL_VOICE)))) + if (Creature* VoiceTrigger = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_BLOOD_ELF_COUNCIL_VOICE))) { CAST_AI(npc_blood_elf_council_voice_trigger::npc_blood_elf_council_voice_triggerAI, VoiceTrigger->AI())->LoadCouncilGUIDs(); CAST_AI(npc_blood_elf_council_voice_trigger::npc_blood_elf_council_voice_triggerAI, VoiceTrigger->AI())->EventStarted = true; @@ -305,13 +305,13 @@ public: { if (Council[i]) { - Unit* member = Unit::GetUnit(*me, Council[i]); - if (member && member->IsAlive()) - member->ToCreature()->AI()->AttackStart(target); + if (Creature* member = ObjectAccessor::GetCreature(*me, Council[i])) + if (member->IsAlive()) + member->AI()->AttackStart(target); } } - instance->SetData(DATA_ILLIDARICOUNCILEVENT, IN_PROGRESS); + instance->SetBossState(DATA_ILLIDARI_COUNCIL, IN_PROGRESS); EventBegun = true; } @@ -330,9 +330,9 @@ public: { if (instance) { - if (Creature* VoiceTrigger = (Unit::GetCreature(*me, instance->GetData64(DATA_BLOOD_ELF_COUNCIL_VOICE)))) + if (Creature* VoiceTrigger = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_BLOOD_ELF_COUNCIL_VOICE))) VoiceTrigger->DealDamage(VoiceTrigger, VoiceTrigger->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false); - instance->SetData(DATA_ILLIDARICOUNCILEVENT, DONE); + instance->SetBossState(DATA_ILLIDARI_COUNCIL, DONE); //me->SummonCreature(AKAMAID, 746.466980f, 304.394989f, 311.90208f, 6.272870f, TEMPSUMMON_DEAD_DESPAWN, 0); } me->DealDamage(me, me->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false); @@ -403,9 +403,8 @@ struct boss_illidari_councilAI : public ScriptedAI { if (instance) { - Creature* Controller = (Unit::GetCreature(*me, instance->GetData64(DATA_ILLIDARICOUNCIL))); - if (Controller) - CAST_AI(npc_illidari_council::npc_illidari_councilAI, Controller->AI())->StartEvent(who); + if (Creature* controller = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_ILLIDARI_COUNCIL))) + CAST_AI(npc_illidari_council::npc_illidari_councilAI, controller->AI())->StartEvent(who); } else { @@ -461,10 +460,10 @@ struct boss_illidari_councilAI : public ScriptedAI return; } - Council[0] = instance->GetData64(DATA_LADYMALANDE); - Council[1] = instance->GetData64(DATA_HIGHNETHERMANCERZEREVOR); - Council[2] = instance->GetData64(DATA_GATHIOSTHESHATTERER); - Council[3] = instance->GetData64(DATA_VERASDARKSHADOW); + Council[0] = instance->GetData64(DATA_LADY_MALANDE); + Council[1] = instance->GetData64(DATA_HIGH_NETHERMANCER_ZEREVOR); + Council[2] = instance->GetData64(DATA_GATHIOS_THE_SHATTERER); + Council[3] = instance->GetData64(DATA_VERAS_DARKSHADOW); LoadedGUIDs = true; } diff --git a/src/server/scripts/Outland/BlackTemple/instance_black_temple.cpp b/src/server/scripts/Outland/BlackTemple/instance_black_temple.cpp index bd70ce012ba..591f28a19f3 100644 --- a/src/server/scripts/Outland/BlackTemple/instance_black_temple.cpp +++ b/src/server/scripts/Outland/BlackTemple/instance_black_temple.cpp @@ -1,6 +1,5 @@ /* * Copyright (C) 2008-2013 TrinityCore <http://www.trinitycore.org/> - * Copyright (C) 2006-2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/> * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the @@ -16,382 +15,261 @@ * with this program. If not, see <http://www.gnu.org/licenses/>. */ -/* ScriptData -SDName: Instance_Black_Temple -SD%Complete: 100 -SDComment: Instance Data Scripts and functions to acquire mobs and set encounter status for use in various Black Temple Scripts -SDCategory: Black Temple -EndScriptData */ - #include "ScriptMgr.h" #include "InstanceScript.h" #include "black_temple.h" -#include "Player.h" -/* Black Temple encounters: -0 - High Warlord Naj'entus event -1 - Supremus Event -2 - Shade of Akama Event -3 - Teron Gorefiend Event -4 - Gurtogg Bloodboil Event -5 - Reliquary Of Souls Event -6 - Mother Shahraz Event -7 - Illidari Council Event -8 - Illidan Stormrage Event -*/ +DoorData const doorData[] = +{ + { GO_NAJENTUS_GATE, DATA_HIGH_WARLORD_NAJENTUS, DOOR_TYPE_PASSAGE, BOUNDARY_NONE }, + { GO_NAJENTUS_GATE, DATA_SUPREMUS, DOOR_TYPE_ROOM, BOUNDARY_NONE }, + { GO_SUPREMUS_GATE, DATA_SUPREMUS, DOOR_TYPE_PASSAGE, BOUNDARY_NONE }, + { GO_SHADE_OF_AKAMA_DOOR, DATA_SHADE_OF_AKAMA, DOOR_TYPE_ROOM, BOUNDARY_NONE }, + { GO_TERON_DOOR_1, DATA_TERON_GOREFIEND, DOOR_TYPE_ROOM, BOUNDARY_NONE }, + { GO_TERON_DOOR_2, DATA_TERON_GOREFIEND, DOOR_TYPE_ROOM, BOUNDARY_NONE }, + { GO_GURTOGG_DOOR, DATA_GURTOGG_BLOODBOIL, DOOR_TYPE_PASSAGE, BOUNDARY_NONE }, + { GO_TEMPLE_DOOR, DATA_RELIQUARY_OF_SOULS, DOOR_TYPE_PASSAGE, BOUNDARY_NONE }, + { GO_MOTHER_SHAHRAZ_DOOR, DATA_MOTHER_SHAHRAZ, DOOR_TYPE_PASSAGE, BOUNDARY_NONE }, + { GO_COUNCIL_DOOR_1, DATA_ILLIDARI_COUNCIL, DOOR_TYPE_ROOM, BOUNDARY_NONE }, + { GO_COUNCIL_DOOR_2, DATA_ILLIDARI_COUNCIL, DOOR_TYPE_ROOM, BOUNDARY_NONE }, + { 0, 0, DOOR_TYPE_ROOM, BOUNDARY_NONE } // END +}; class instance_black_temple : public InstanceMapScript { -public: - instance_black_temple() : InstanceMapScript("instance_black_temple", 564) { } - - InstanceScript* GetInstanceScript(InstanceMap* map) const OVERRIDE - { - return new instance_black_temple_InstanceMapScript(map); - } - - struct instance_black_temple_InstanceMapScript : public InstanceScript - { - instance_black_temple_InstanceMapScript(Map* map) : InstanceScript(map) {} - - uint32 m_auiEncounter[EncounterCount]; - std::string str_data; - - uint64 Najentus; - uint64 Akama; // This is the Akama that starts the Illidan encounter. - uint64 Akama_Shade; // This is the Akama that starts the Shade of Akama encounter. - uint64 ShadeOfAkama; - uint64 Supremus; - uint64 LadyMalande; - uint64 GathiosTheShatterer; - uint64 HighNethermancerZerevor; - uint64 VerasDarkshadow; - uint64 IllidariCouncil; - uint64 BloodElfCouncilVoice; - uint64 IllidanStormrage; - - uint64 NajentusGate; - uint64 MainTempleDoors; - uint64 ShadeOfAkamaDoor; - uint64 CommonDoor;//Teron - uint64 TeronDoor; - uint64 GuurtogDoor; - uint64 MotherDoor; - uint64 TempleDoor;//Befor mother - uint64 CouncilDoor; - uint64 SimpleDoor;//council - uint64 IllidanGate; - uint64 IllidanDoor[2]; - - void Initialize() OVERRIDE - { - memset(&m_auiEncounter, 0, sizeof(m_auiEncounter)); + public: + instance_black_temple() : InstanceMapScript(BTScriptName, 564) { } - Najentus = 0; - Akama = 0; - Akama_Shade = 0; - ShadeOfAkama = 0; - Supremus = 0; - LadyMalande = 0; - GathiosTheShatterer = 0; - HighNethermancerZerevor = 0; - VerasDarkshadow = 0; - IllidariCouncil = 0; - BloodElfCouncilVoice = 0; - IllidanStormrage = 0; - - NajentusGate = 0; - MainTempleDoors = 0; - ShadeOfAkamaDoor = 0; - CommonDoor = 0; // teron - TeronDoor = 0; - GuurtogDoor = 0; - MotherDoor = 0; - TempleDoor = 0; - SimpleDoor = 0; // Bycouncil - CouncilDoor = 0; - IllidanGate = 0; - IllidanDoor[0] = 0; - IllidanDoor[1] = 0; - } - - bool IsEncounterInProgress() const OVERRIDE - { - for (uint8 i = 0; i < EncounterCount; ++i) - if (m_auiEncounter[i] == IN_PROGRESS) - return true; - - return false; - } - - Player* GetPlayerInMap() + struct instance_black_temple_InstanceMapScript : public InstanceScript { - Map::PlayerList const& players = instance->GetPlayers(); - - if (!players.isEmpty()) + instance_black_temple_InstanceMapScript(Map* map) : InstanceScript(map) { - for (Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr) - { - if (Player* player = itr->GetSource()) - return player; - } + SetBossNumber(EncounterCount); + LoadDoorData(doorData); + + NajentusGUID = 0; + SupremusGUID = 0; + ShadeOfAkamaGUID = 0; + AkamaShadeGUID = 0; + AkamaGUID = 0; + GathiosTheShattererGUID = 0; + HighNethermancerZerevorGUID = 0; + LadyMalandeGUID = 0; + VerasDarkshadowGUID = 0; + IllidariCouncilGUID = 0; + BloodElfCouncilVoiceGUID = 0; + IllidanStormrageGUID = 0; + + IllidanGateGUID = 0; + + memset(IllidanDoorGUIDs, 0, 2 * sizeof(uint64)); } - TC_LOG_DEBUG(LOG_FILTER_TSCR, "Instance Black Temple: GetPlayerInMap, but PlayerList is empty!"); - return NULL; - } - - void OnCreatureCreate(Creature* creature) OVERRIDE - { - switch (creature->GetEntry()) + void OnCreatureCreate(Creature* creature) OVERRIDE { - case 22887: Najentus = creature->GetGUID(); break; - case 23089: Akama = creature->GetGUID(); break; - case 23191: Akama_Shade = creature->GetGUID(); break; - case 22841: ShadeOfAkama = creature->GetGUID(); break; - case 22898: Supremus = creature->GetGUID(); break; - case 22917: IllidanStormrage = creature->GetGUID(); break; - case 22949: GathiosTheShatterer = creature->GetGUID(); break; - case 22950: HighNethermancerZerevor = creature->GetGUID(); break; - case 22951: LadyMalande = creature->GetGUID(); break; - case 22952: VerasDarkshadow = creature->GetGUID(); break; - case 23426: IllidariCouncil = creature->GetGUID(); break; - case 23499: BloodElfCouncilVoice = creature->GetGUID(); break; + switch (creature->GetEntry()) + { + case NPC_HIGH_WARLORD_NAJENTUS: + NajentusGUID = creature->GetGUID(); + break; + case NPC_SUPREMUS: + SupremusGUID = creature->GetGUID(); + break; + case NPC_SHADE_OF_AKAMA: + ShadeOfAkamaGUID = creature->GetGUID(); + break; + case NPC_AKAMA_SHADE: + AkamaShadeGUID = creature->GetGUID(); + break; + case NPC_AKAMA: + AkamaGUID = creature->GetGUID(); + break; + case NPC_GATHIOS_THE_SHATTERER: + GathiosTheShattererGUID = creature->GetGUID(); + break; + case NPC_HIGH_NETHERMANCER_ZEREVOR: + HighNethermancerZerevorGUID = creature->GetGUID(); + break; + case NPC_LADY_MALANDE: + LadyMalandeGUID = creature->GetGUID(); + break; + case NPC_VERAS_DARKSHADOW: + VerasDarkshadowGUID = creature->GetGUID(); + break; + case NPC_ILLIDARI_COUNCIL: + IllidariCouncilGUID = creature->GetGUID(); + break; + case NPC_BLOOD_ELF_COUNCIL_VOICE: + BloodElfCouncilVoiceGUID = creature->GetGUID(); + break; + case NPC_ILLIDAN_STORMRAGE: + IllidanStormrageGUID = creature->GetGUID(); + break; + default: + break; + } } - } - void OnGameObjectCreate(GameObject* go) OVERRIDE - { - switch (go->GetEntry()) + void OnGameObjectCreate(GameObject* go) OVERRIDE { - case 185483: - NajentusGate = go->GetGUID(); // Gate past Naj'entus (at the entrance to Supermoose's courtyards) - if (m_auiEncounter[0] == DONE) - HandleGameObject(0, true, go); - break; - - case 185882: - MainTempleDoors = go->GetGUID(); // Main Temple Doors - right past Supermoose (Supremus) - if (m_auiEncounter[1] == DONE) - HandleGameObject(0, true, go); - break; - - case 185478: - ShadeOfAkamaDoor = go->GetGUID(); - break; - - case 185480: - CommonDoor = go->GetGUID(); - if (m_auiEncounter[3] == DONE) - HandleGameObject(0, true, go); - break; - - case 186153: - TeronDoor = go->GetGUID(); - if (m_auiEncounter[3] == DONE) - HandleGameObject(0, true, go); - break; - - case 185892: - GuurtogDoor = go->GetGUID(); - if (m_auiEncounter[4] == DONE) - HandleGameObject(0, true, go); - break; - - case 185479: - TempleDoor = go->GetGUID(); - if (m_auiEncounter[5] == DONE) - HandleGameObject(0, true, go); - break; - - case 185482: - MotherDoor = go->GetGUID(); - if (m_auiEncounter[6] == DONE) - HandleGameObject(0, true, go); - break; - - case 185481: - CouncilDoor = go->GetGUID(); - if (m_auiEncounter[7] == DONE) - HandleGameObject(0, true, go); - break; - - case 186152: - SimpleDoor = go->GetGUID(); - if (m_auiEncounter[7] == DONE) - HandleGameObject(0, true, go); - break; - - case 185905: - IllidanGate = go->GetGUID(); // Gate leading to Temple Summit - break; - - case 186261: - IllidanDoor[0] = go->GetGUID(); // Right door at Temple Summit - break; - - case 186262: - IllidanDoor[1] = go->GetGUID(); // Left door at Temple Summit - break; + switch (go->GetEntry()) + { + case GO_NAJENTUS_GATE: + case GO_SUPREMUS_GATE: + case GO_SHADE_OF_AKAMA_DOOR: + case GO_TERON_DOOR_1: + case GO_TERON_DOOR_2: + case GO_GURTOGG_DOOR: + case GO_TEMPLE_DOOR: + case GO_MOTHER_SHAHRAZ_DOOR: + case GO_COUNCIL_DOOR_1: + case GO_COUNCIL_DOOR_2: + AddDoor(go, true); + break; + case GO_ILLIDAN_GATE: + IllidanGateGUID = go->GetGUID(); + break; + case GO_ILLIDAN_DOOR_R: + IllidanDoorGUIDs[0] = go->GetGUID(); + break; + case GO_ILLIDAN_DOOR_L: + IllidanDoorGUIDs[1] = go->GetGUID(); + break; + default: + break; + } } - } - uint64 GetData64(uint32 identifier) const OVERRIDE - { - switch (identifier) + void OnGameObjectRemove(GameObject* go) OVERRIDE { - case DATA_HIGHWARLORDNAJENTUS: return Najentus; - case DATA_AKAMA: return Akama; - case DATA_AKAMA_SHADE: return Akama_Shade; - case DATA_SHADEOFAKAMA: return ShadeOfAkama; - case DATA_SUPREMUS: return Supremus; - case DATA_ILLIDANSTORMRAGE: return IllidanStormrage; - case DATA_GATHIOSTHESHATTERER: return GathiosTheShatterer; - case DATA_HIGHNETHERMANCERZEREVOR: return HighNethermancerZerevor; - case DATA_LADYMALANDE: return LadyMalande; - case DATA_VERASDARKSHADOW: return VerasDarkshadow; - case DATA_ILLIDARICOUNCIL: return IllidariCouncil; - case DATA_GAMEOBJECT_NAJENTUS_GATE: return NajentusGate; - case DATA_GAMEOBJECT_ILLIDAN_GATE: return IllidanGate; - case DATA_GAMEOBJECT_ILLIDAN_DOOR_R: return IllidanDoor[0]; - case DATA_GAMEOBJECT_ILLIDAN_DOOR_L: return IllidanDoor[1]; - case DATA_GAMEOBJECT_SUPREMUS_DOORS: return MainTempleDoors; - case DATA_BLOOD_ELF_COUNCIL_VOICE: return BloodElfCouncilVoice; + switch (go->GetEntry()) + { + case GO_NAJENTUS_GATE: + case GO_SUPREMUS_GATE: + case GO_SHADE_OF_AKAMA_DOOR: + case GO_TERON_DOOR_1: + case GO_TERON_DOOR_2: + case GO_GURTOGG_DOOR: + case GO_TEMPLE_DOOR: + case GO_MOTHER_SHAHRAZ_DOOR: + case GO_COUNCIL_DOOR_1: + case GO_COUNCIL_DOOR_2: + AddDoor(go, false); + break; + default: + break; + } } - return 0; - } - - void SetData(uint32 type, uint32 data) OVERRIDE - { - switch (type) + uint64 GetData64(uint32 type) const OVERRIDE { - case DATA_HIGHWARLORDNAJENTUSEVENT: - if (data == DONE) - HandleGameObject(NajentusGate, true); - m_auiEncounter[0] = data; - break; - case DATA_SUPREMUSEVENT: - if (data == DONE) - HandleGameObject(NajentusGate, true); - m_auiEncounter[1] = data; - break; - case DATA_SHADEOFAKAMAEVENT: - if (data == IN_PROGRESS) - HandleGameObject(ShadeOfAkamaDoor, false); - else - HandleGameObject(ShadeOfAkamaDoor, true); - m_auiEncounter[2] = data; - break; - case DATA_TERONGOREFIENDEVENT: - if (data == IN_PROGRESS) + switch (type) { - HandleGameObject(TeronDoor, false); - HandleGameObject(CommonDoor, false); + case DATA_HIGH_WARLORD_NAJENTUS: + return NajentusGUID; + case DATA_SUPREMUS: + return SupremusGUID; + case DATA_SHADE_OF_AKAMA: + return ShadeOfAkamaGUID; + case DATA_AKAMA_SHADE: + return AkamaShadeGUID; + case DATA_AKAMA: + return AkamaGUID; + case DATA_GATHIOS_THE_SHATTERER: + return GathiosTheShattererGUID; + case DATA_HIGH_NETHERMANCER_ZEREVOR: + return HighNethermancerZerevorGUID; + case DATA_LADY_MALANDE: + return LadyMalandeGUID; + case DATA_VERAS_DARKSHADOW: + return VerasDarkshadowGUID; + case DATA_ILLIDARI_COUNCIL: + return IllidariCouncilGUID; + case DATA_BLOOD_ELF_COUNCIL_VOICE: + return BloodElfCouncilVoiceGUID; + case DATA_ILLIDAN_STORMRAGE: + return IllidanStormrageGUID; + case DATA_GO_ILLIDAN_GATE: + return IllidanGateGUID; + case DATA_GO_ILLIDAN_DOOR_R: + return IllidanDoorGUIDs[0]; + case DATA_GO_ILLIDAN_DOOR_L: + return IllidanDoorGUIDs[1]; + default: + break; } - else - { - HandleGameObject(TeronDoor, true); - HandleGameObject(CommonDoor, true); - } - m_auiEncounter[3] = data; - break; - case DATA_GURTOGGBLOODBOILEVENT: - if (data == DONE) - HandleGameObject(GuurtogDoor, true); - m_auiEncounter[4] = data; - break; - case DATA_RELIQUARYOFSOULSEVENT: - if (data == DONE) - HandleGameObject(TempleDoor, true); - m_auiEncounter[5] = data; - break; - case DATA_MOTHERSHAHRAZEVENT: - if (data == DONE) - HandleGameObject(MotherDoor, true); - m_auiEncounter[6] = data; - break; - case DATA_ILLIDARICOUNCILEVENT: - if (data == IN_PROGRESS) - { - HandleGameObject(CouncilDoor, false); - HandleGameObject(SimpleDoor, false); - } - else - { - HandleGameObject(CouncilDoor, true); - HandleGameObject(SimpleDoor, true); - } - m_auiEncounter[7] = data; - break; - case DATA_ILLIDANSTORMRAGEEVENT: - m_auiEncounter[8] = data; - break; + + return 0; } - if (data == DONE) + std::string GetSaveData() OVERRIDE { OUT_SAVE_INST_DATA; std::ostringstream saveStream; - saveStream << m_auiEncounter[0] << ' ' << m_auiEncounter[1] << ' ' - << m_auiEncounter[2] << ' ' << m_auiEncounter[3] << ' ' << m_auiEncounter[4] - << ' ' << m_auiEncounter[5] << ' ' << m_auiEncounter[6] << ' ' << m_auiEncounter[7] - << ' ' << m_auiEncounter[8]; - - str_data = saveStream.str(); + saveStream << "B T " << GetBossSaveData(); - SaveToDB(); OUT_SAVE_INST_DATA_COMPLETE; + return saveStream.str(); } - } - uint32 GetData(uint32 type) const OVERRIDE - { - switch (type) + void Load(char const* str) OVERRIDE { - case DATA_HIGHWARLORDNAJENTUSEVENT: return m_auiEncounter[0]; - case DATA_SUPREMUSEVENT: return m_auiEncounter[1]; - case DATA_SHADEOFAKAMAEVENT: return m_auiEncounter[2]; - case DATA_TERONGOREFIENDEVENT: return m_auiEncounter[3]; - case DATA_GURTOGGBLOODBOILEVENT: return m_auiEncounter[4]; - case DATA_RELIQUARYOFSOULSEVENT: return m_auiEncounter[5]; - case DATA_MOTHERSHAHRAZEVENT: return m_auiEncounter[6]; - case DATA_ILLIDARICOUNCILEVENT: return m_auiEncounter[7]; - case DATA_ILLIDANSTORMRAGEEVENT: return m_auiEncounter[8]; - } + if (!str) + { + OUT_LOAD_INST_DATA_FAIL; + return; + } - return 0; - } + OUT_LOAD_INST_DATA(str); - std::string GetSaveData() OVERRIDE - { - return str_data; - } + char dataHead1, dataHead2; - void Load(const char* in) OVERRIDE - { - if (!in) - { - OUT_LOAD_INST_DATA_FAIL; - return; + std::istringstream loadStream(str); + loadStream >> dataHead1 >> dataHead2; + + if (dataHead1 == 'B' && dataHead2 == 'T') + { + for (uint32 i = 0; i < EncounterCount; ++i) + { + uint32 tmpState; + loadStream >> tmpState; + if (tmpState == IN_PROGRESS || tmpState > SPECIAL) + tmpState = NOT_STARTED; + SetBossState(i, EncounterState(tmpState)); + } + } + else + OUT_LOAD_INST_DATA_FAIL; + + OUT_LOAD_INST_DATA_COMPLETE; } - OUT_LOAD_INST_DATA(in); + protected: + uint64 NajentusGUID; + uint64 SupremusGUID; + uint64 ShadeOfAkamaGUID; + uint64 AkamaShadeGUID; + uint64 AkamaGUID; - std::istringstream loadStream(in); - loadStream >> m_auiEncounter[0] >> m_auiEncounter[1] >> m_auiEncounter[2] - >> m_auiEncounter[3] >> m_auiEncounter[4] >> m_auiEncounter[5] >> m_auiEncounter[6] - >> m_auiEncounter[7] >> m_auiEncounter[8]; + uint64 GathiosTheShattererGUID; + uint64 HighNethermancerZerevorGUID; + uint64 LadyMalandeGUID; + uint64 VerasDarkshadowGUID; - for (uint8 i = 0; i < EncounterCount; ++i) - if (m_auiEncounter[i] == IN_PROGRESS) - m_auiEncounter[i] = NOT_STARTED; + uint64 IllidariCouncilGUID; + uint64 BloodElfCouncilVoiceGUID; - OUT_LOAD_INST_DATA_COMPLETE; - } - }; + uint64 IllidanStormrageGUID; + + uint64 IllidanGateGUID; + uint64 IllidanDoorGUIDs[2]; + }; + InstanceScript* GetInstanceScript(InstanceMap* map) const OVERRIDE + { + return new instance_black_temple_InstanceMapScript(map); + } }; void AddSC_instance_black_temple() diff --git a/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_hydross_the_unstable.cpp b/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_hydross_the_unstable.cpp index db270c943e5..d6205cb3ec7 100644 --- a/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_hydross_the_unstable.cpp +++ b/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_hydross_the_unstable.cpp @@ -94,6 +94,8 @@ public: boss_hydross_the_unstableAI(Creature* creature) : ScriptedAI(creature), Summons(me) { instance = creature->GetInstanceScript(); + beams[0] = 0; + beams[1] = 0; } InstanceScript* instance; @@ -159,10 +161,9 @@ public: } void DeSummonBeams() { - for (uint8 i=0; i<2; ++i) + for (uint8 i = 0; i < 2; ++i) { - Creature* mob = Unit::GetCreature(*me, beams[i]); - if (mob) + if (Creature* mob = Unit::GetCreature(*me, beams[i])) { mob->setDeathState(DEAD); mob->RemoveCorpse(); diff --git a/src/server/scripts/Outland/GruulsLair/boss_gruul.cpp b/src/server/scripts/Outland/GruulsLair/boss_gruul.cpp index 31f854803bc..0ae86f7c455 100644 --- a/src/server/scripts/Outland/GruulsLair/boss_gruul.cpp +++ b/src/server/scripts/Outland/GruulsLair/boss_gruul.cpp @@ -43,215 +43,217 @@ enum Spells { SPELL_GROWTH = 36300, SPELL_CAVE_IN = 36240, - SPELL_GROUND_SLAM = 33525, //AoE Ground Slam applying Ground Slam to everyone with a script effect (most likely the knock back, we can code it to a set knockback) + SPELL_GROUND_SLAM = 33525, // AoE Ground Slam applying Ground Slam to everyone with a script effect (most likely the knock back, we can code it to a set knockback) SPELL_REVERBERATION = 36297, SPELL_SHATTER = 33654, SPELL_SHATTER_EFFECT = 33671, SPELL_HURTFUL_STRIKE = 33813, - SPELL_STONED = 33652, //Spell is self cast by target + SPELL_STONED = 33652, // Spell is self cast by target SPELL_MAGNETIC_PULL = 28337, - SPELL_KNOCK_BACK = 24199, //Knockback spell until correct implementation is made + SPELL_KNOCK_BACK = 24199, // Knockback spell until correct implementation is made }; -class boss_gruul : public CreatureScript +enum Events { -public: - boss_gruul() : CreatureScript("boss_gruul") { } + EVENT_GROWTH = 1, + EVENT_CAVE_IN, + EVENT_CAVE_IN_STATIC, + EVENT_GROUND_SLAM, + EVENT_HURTFUL_STRIKE, + EVENT_REVERBERATION +}; - CreatureAI* GetAI(Creature* creature) const OVERRIDE - { - return new boss_gruulAI(creature); - } +class boss_gruul : public CreatureScript +{ + public: + boss_gruul() : CreatureScript("boss_gruul") { } - struct boss_gruulAI : public ScriptedAI - { - boss_gruulAI(Creature* creature) : ScriptedAI(creature) + struct boss_gruulAI : public BossAI { - instance = creature->GetInstanceScript(); - } - - InstanceScript* instance; - - uint32 m_uiGrowth_Timer; - uint32 m_uiCaveIn_Timer; - uint32 m_uiCaveIn_StaticTimer; - uint32 m_uiGroundSlamTimer; - uint32 m_uiHurtfulStrike_Timer; - uint32 m_uiReverberation_Timer; + boss_gruulAI(Creature* creature) : BossAI(creature, DATA_GRUUL) { } - bool m_bPerformingGroundSlam; + uint32 m_uiGrowth_Timer; + uint32 m_uiCaveIn_Timer; + uint32 m_uiCaveIn_StaticTimer; + uint32 m_uiGroundSlamTimer; + uint32 m_uiHurtfulStrike_Timer; + uint32 m_uiReverberation_Timer; - void Reset() OVERRIDE - { - m_uiGrowth_Timer= 30000; - m_uiCaveIn_Timer= 27000; - m_uiCaveIn_StaticTimer = 30000; - m_uiGroundSlamTimer= 35000; - m_bPerformingGroundSlam= false; - m_uiHurtfulStrike_Timer= 8000; - m_uiReverberation_Timer= 60000+45000; - - if (instance) - instance->SetData(DATA_GRUULEVENT, NOT_STARTED); - } + bool m_bPerformingGroundSlam; - void EnterCombat(Unit* /*who*/) OVERRIDE - { - Talk(SAY_AGGRO); - - if (instance) - instance->SetData(DATA_GRUULEVENT, IN_PROGRESS); - } + void Reset() OVERRIDE + { + _Reset(); + m_uiGrowth_Timer= 30000; + m_uiCaveIn_Timer= 27000; + m_uiCaveIn_StaticTimer = 30000; + m_uiGroundSlamTimer= 35000; + m_bPerformingGroundSlam= false; + m_uiHurtfulStrike_Timer= 8000; + m_uiReverberation_Timer= 60000+45000; + } - void KilledUnit(Unit* /*victim*/) OVERRIDE - { - Talk(SAY_SLAY); - } + void EnterCombat(Unit* /*who*/) OVERRIDE + { + _EnterCombat(); + Talk(SAY_AGGRO); + } - void JustDied(Unit* /*killer*/) OVERRIDE - { - Talk(SAY_DEATH); + void KilledUnit(Unit* who) OVERRIDE + { + if (who->GetTypeId() == TYPEID_PLAYER) + Talk(SAY_SLAY); + } - if (instance) + void JustDied(Unit* /*killer*/) OVERRIDE { - instance->SetData(DATA_GRUULEVENT, DONE); - instance->HandleGameObject(instance->GetData64(DATA_GRUULDOOR), true); // Open the encounter door + _JustDied(); + Talk(SAY_DEATH); } - } - void SpellHitTarget(Unit* target, const SpellInfo* pSpell) OVERRIDE - { - //This to emulate effect1 (77) of SPELL_GROUND_SLAM, knock back to any direction - //It's initially wrong, since this will cause fall damage, which is by comments, not intended. - if (pSpell->Id == SPELL_GROUND_SLAM) + void SpellHitTarget(Unit* target, const SpellInfo* pSpell) OVERRIDE { - if (target->GetTypeId() == TYPEID_PLAYER) + //This to emulate effect1 (77) of SPELL_GROUND_SLAM, knock back to any direction + //It's initially wrong, since this will cause fall damage, which is by comments, not intended. + if (pSpell->Id == SPELL_GROUND_SLAM) { - switch (urand(0, 1)) + if (target->GetTypeId() == TYPEID_PLAYER) { - case 0: - target->CastSpell(target, SPELL_MAGNETIC_PULL, true, NULL, NULL, me->GetGUID()); - break; - - case 1: - target->CastSpell(target, SPELL_KNOCK_BACK, true, NULL, NULL, me->GetGUID()); - break; + switch (urand(0, 1)) + { + case 0: + target->CastSpell(target, SPELL_MAGNETIC_PULL, true, NULL, NULL, me->GetGUID()); + break; + + case 1: + target->CastSpell(target, SPELL_KNOCK_BACK, true, NULL, NULL, me->GetGUID()); + break; + } } } - } - //this part should be in the core - if (pSpell->Id == SPELL_SHATTER) - { - /// @todo use eventmap to kill this stuff - //clear this, if we are still performing - if (m_bPerformingGroundSlam) + //this part should be in the core + if (pSpell->Id == SPELL_SHATTER) { - m_bPerformingGroundSlam = false; - - //and correct movement, if not already - if (me->GetMotionMaster()->GetCurrentMovementGeneratorType() != CHASE_MOTION_TYPE) + /// @todo use eventmap to kill this stuff + //clear this, if we are still performing + if (m_bPerformingGroundSlam) { - if (me->GetVictim()) - me->GetMotionMaster()->MoveChase(me->GetVictim()); + m_bPerformingGroundSlam = false; + + //and correct movement, if not already + if (me->GetMotionMaster()->GetCurrentMovementGeneratorType() != CHASE_MOTION_TYPE) + { + if (me->GetVictim()) + me->GetMotionMaster()->MoveChase(me->GetVictim()); + } } } } - } - - void UpdateAI(uint32 uiDiff) OVERRIDE - { - //Return since we have no target - if (!UpdateVictim()) - return; - // Growth - // Gruul can cast this spell up to 30 times - if (m_uiGrowth_Timer <= uiDiff) + void UpdateAI(uint32 diff) OVERRIDE { - Talk(EMOTE_GROW); - DoCast(me, SPELL_GROWTH); - m_uiGrowth_Timer = 30000; - } - else - m_uiGrowth_Timer -= uiDiff; + if (!UpdateVictim()) + return; - if (m_bPerformingGroundSlam) - { - if (m_uiGroundSlamTimer <= uiDiff) - { - m_uiGroundSlamTimer =120000; - m_uiHurtfulStrike_Timer= 8000; + events.Update(diff); + + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; - if (m_uiReverberation_Timer < 10000) //Give a little time to the players to undo the damage from shatter - m_uiReverberation_Timer += 10000; + /// @todo: convert this shit to eventmap - DoCast(me, SPELL_SHATTER); + // Growth + // Gruul can cast this spell up to 30 times + if (m_uiGrowth_Timer <= diff) + { + Talk(EMOTE_GROW); + DoCast(me, SPELL_GROWTH); + m_uiGrowth_Timer = 30000; } else - m_uiGroundSlamTimer -= uiDiff; - } - else - { - // Hurtful Strike - if (m_uiHurtfulStrike_Timer <= uiDiff) + m_uiGrowth_Timer -= diff; + + if (m_bPerformingGroundSlam) { - Unit* target = SelectTarget(SELECT_TARGET_TOPAGGRO, 1); + if (m_uiGroundSlamTimer <= diff) + { + m_uiGroundSlamTimer =120000; + m_uiHurtfulStrike_Timer= 8000; - if (target && me->IsWithinMeleeRange(me->GetVictim())) - DoCast(target, SPELL_HURTFUL_STRIKE); - else - DoCastVictim(SPELL_HURTFUL_STRIKE); + if (m_uiReverberation_Timer < 10000) //Give a little time to the players to undo the damage from shatter + m_uiReverberation_Timer += 10000; - m_uiHurtfulStrike_Timer= 8000; + DoCast(me, SPELL_SHATTER); + } + else + m_uiGroundSlamTimer -= diff; } else - m_uiHurtfulStrike_Timer -= uiDiff; - - // Reverberation - if (m_uiReverberation_Timer <= uiDiff) { - DoCastVictim(SPELL_REVERBERATION, true); - m_uiReverberation_Timer = urand(15000, 25000); - } - else - m_uiReverberation_Timer -= uiDiff; + // Hurtful Strike + if (m_uiHurtfulStrike_Timer <= diff) + { + Unit* target = SelectTarget(SELECT_TARGET_TOPAGGRO, 1); - // Cave In - if (m_uiCaveIn_Timer <= uiDiff) - { - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) - DoCast(target, SPELL_CAVE_IN); + if (target && me->IsWithinMeleeRange(me->GetVictim())) + DoCast(target, SPELL_HURTFUL_STRIKE); + else + DoCastVictim(SPELL_HURTFUL_STRIKE); - if (m_uiCaveIn_StaticTimer >= 4000) - m_uiCaveIn_StaticTimer -= 2000; + m_uiHurtfulStrike_Timer= 8000; + } + else + m_uiHurtfulStrike_Timer -= diff; - m_uiCaveIn_Timer = m_uiCaveIn_StaticTimer; - } - else - m_uiCaveIn_Timer -= uiDiff; + // Reverberation + if (m_uiReverberation_Timer <= diff) + { + DoCastVictim(SPELL_REVERBERATION, true); + m_uiReverberation_Timer = urand(15000, 25000); + } + else + m_uiReverberation_Timer -= diff; - // Ground Slam, Gronn Lord's Grasp, Stoned, Shatter - if (m_uiGroundSlamTimer <= uiDiff) - { - me->GetMotionMaster()->Clear(); - me->GetMotionMaster()->MoveIdle(); + // Cave In + if (m_uiCaveIn_Timer <= diff) + { + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) + DoCast(target, SPELL_CAVE_IN); - m_bPerformingGroundSlam= true; - m_uiGroundSlamTimer = 10000; + if (m_uiCaveIn_StaticTimer >= 4000) + m_uiCaveIn_StaticTimer -= 2000; - DoCast(me, SPELL_GROUND_SLAM); - } - else - m_uiGroundSlamTimer -= uiDiff; + m_uiCaveIn_Timer = m_uiCaveIn_StaticTimer; + } + else + m_uiCaveIn_Timer -= diff; + + // Ground Slam, Gronn Lord's Grasp, Stoned, Shatter + if (m_uiGroundSlamTimer <= diff) + { + me->GetMotionMaster()->Clear(); + me->GetMotionMaster()->MoveIdle(); - DoMeleeAttackIfReady(); + m_bPerformingGroundSlam= true; + m_uiGroundSlamTimer = 10000; + + DoCast(me, SPELL_GROUND_SLAM); + } + else + m_uiGroundSlamTimer -= diff; + + DoMeleeAttackIfReady(); + } } - } - }; + }; + CreatureAI* GetAI(Creature* creature) const OVERRIDE + { + return GetGruulsLairAI<boss_gruulAI>(creature); + } }; class spell_gruul_shatter : public SpellScriptLoader diff --git a/src/server/scripts/Outland/GruulsLair/boss_high_king_maulgar.cpp b/src/server/scripts/Outland/GruulsLair/boss_high_king_maulgar.cpp index d216c0b02ee..dd44d764987 100644 --- a/src/server/scripts/Outland/GruulsLair/boss_high_king_maulgar.cpp +++ b/src/server/scripts/Outland/GruulsLair/boss_high_king_maulgar.cpp @@ -49,79 +49,35 @@ enum HighKingMaulgar SPELL_DEATH_COIL = 33130, SPELL_SUMMON_WFH = 33131, - //Kiggler the Craed + // Kiggler the Craed SPELL_GREATER_POLYMORPH = 33173, SPELL_LIGHTNING_BOLT = 36152, SPELL_ARCANE_SHOCK = 33175, SPELL_ARCANE_EXPLOSION = 33237, - //Blindeye the Seer + // Blindeye the Seer SPELL_GREATER_PW_SHIELD = 33147, SPELL_HEAL = 33144, SPELL_PRAYER_OH = 33152, - //Krosh Firehand + // Krosh Firehand SPELL_GREATER_FIREBALL = 33051, SPELL_SPELLSHIELD = 33054, - SPELL_BLAST_WAVE = 33061 -}; + SPELL_BLAST_WAVE = 33061, -bool CheckAllBossDied(InstanceScript* instance, Creature* me) -{ - if (!instance || !me) - return false; - - uint64 MaulgarGUID = 0; - uint64 KigglerGUID = 0; - uint64 BlindeyeGUID = 0; - uint64 OlmGUID = 0; - uint64 KroshGUID = 0; - - Creature* Maulgar = NULL; - Creature* Kiggler = NULL; - Creature* Blindeye = NULL; - Creature* Olm = NULL; - Creature* Krosh = NULL; - - MaulgarGUID = instance->GetData64(DATA_MAULGAR); - KigglerGUID = instance->GetData64(DATA_KIGGLERTHECRAZED); - BlindeyeGUID = instance->GetData64(DATA_BLINDEYETHESEER); - OlmGUID = instance->GetData64(DATA_OLMTHESUMMONER); - KroshGUID = instance->GetData64(DATA_KROSHFIREHAND); - - Maulgar = (Unit::GetCreature((*me), MaulgarGUID)); - Kiggler = (Unit::GetCreature((*me), KigglerGUID)); - Blindeye = (Unit::GetCreature((*me), BlindeyeGUID)); - Olm = (Unit::GetCreature((*me), OlmGUID)); - Krosh = (Unit::GetCreature((*me), KroshGUID)); - - if (!Maulgar || !Kiggler || !Blindeye || !Olm || !Krosh) - return false; - - if (!Maulgar->IsAlive() && !Kiggler->IsAlive() && !Blindeye->IsAlive() && !Olm->IsAlive() && !Krosh->IsAlive()) - return true; - - return false; -} + ACTION_ADD_DEATH = 1 +}; -//High King Maulgar AI class boss_high_king_maulgar : public CreatureScript { public: boss_high_king_maulgar() : CreatureScript("boss_high_king_maulgar") { } - CreatureAI* GetAI(Creature* creature) const OVERRIDE - { - return new boss_high_king_maulgarAI(creature); - } - struct boss_high_king_maulgarAI : public ScriptedAI { boss_high_king_maulgarAI(Creature* creature) : ScriptedAI(creature) { instance = creature->GetInstanceScript(); - for (uint8 i = 0; i < 4; ++i) - Council[i] = 0; } InstanceScript* instance; @@ -134,8 +90,6 @@ public: bool Phase2; - uint64 Council[4]; - void Reset() OVERRIDE { ArcingSmash_Timer = 10000; @@ -148,23 +102,7 @@ public: Phase2 = false; - Creature* creature = NULL; - for (uint8 i = 0; i < 4; ++i) - { - if (Council[i]) - { - creature = (Unit::GetCreature((*me), Council[i])); - if (creature && !creature->IsAlive()) - { - creature->Respawn(); - creature->AI()->EnterEvadeMode(); - } - } - } - - //reset encounter - if (instance) - instance->SetData(DATA_MAULGAREVENT, NOT_STARTED); + instance->SetBossState(DATA_MAULGAR, NOT_STARTED); } void KilledUnit(Unit* /*victim*/) OVERRIDE @@ -176,72 +114,27 @@ public: { Talk(SAY_DEATH); - if (CheckAllBossDied(instance, me)) - instance->SetData(DATA_MAULGAREVENT, DONE); - } - - void AddDeath() - { - Talk(SAY_OGRE_DEATH); - } - - void EnterCombat(Unit* who) OVERRIDE - { - StartEvent(who); + instance->SetBossState(DATA_MAULGAR, DONE); } - void GetCouncil() + void DoAction(int32 actionId) { - if (instance) - { - //get council member's guid to respawn them if needed - Council[0] = instance->GetData64(DATA_KIGGLERTHECRAZED); - Council[1] = instance->GetData64(DATA_BLINDEYETHESEER); - Council[2] = instance->GetData64(DATA_OLMTHESUMMONER); - Council[3] = instance->GetData64(DATA_KROSHFIREHAND); - } + if (actionId == ACTION_ADD_DEATH) + Talk(SAY_OGRE_DEATH); } - void StartEvent(Unit* who) + void EnterCombat(Unit* /*who*/) OVERRIDE { - if (!instance) - return; - - GetCouncil(); - - Talk(SAY_AGGRO); - - instance->SetData64(DATA_MAULGAREVENT_TANK, who->GetGUID()); - instance->SetData(DATA_MAULGAREVENT, IN_PROGRESS); - DoZoneInCombat(); + instance->SetBossState(DATA_MAULGAR, IN_PROGRESS); + Talk(SAY_AGGRO); } void UpdateAI(uint32 diff) OVERRIDE { - //Only if not incombat check if the event is started - if (!me->IsInCombat() && instance && instance->GetData(DATA_MAULGAREVENT)) - { - Unit* target = Unit::GetUnit(*me, instance->GetData64(DATA_MAULGAREVENT_TANK)); - - if (target) - { - AttackStart(target); - GetCouncil(); - } - } - - //Return since we have no target if (!UpdateVictim()) return; - //someone evaded! - if (instance && !instance->GetData(DATA_MAULGAREVENT)) - { - EnterEvadeMode(); - return; - } - //ArcingSmash_Timer if (ArcingSmash_Timer <= diff) { @@ -301,19 +194,17 @@ public: } }; + CreatureAI* GetAI(Creature* creature) const OVERRIDE + { + return GetGruulsLairAI<boss_high_king_maulgarAI>(creature); + } }; -//Olm The Summoner AI class boss_olm_the_summoner : public CreatureScript { public: boss_olm_the_summoner() : CreatureScript("boss_olm_the_summoner") { } - CreatureAI* GetAI(Creature* creature) const OVERRIDE - { - return new boss_olm_the_summonerAI(creature); - } - struct boss_olm_the_summonerAI : public ScriptedAI { boss_olm_the_summonerAI(Creature* creature) : ScriptedAI(creature) @@ -333,9 +224,7 @@ public: Summon_Timer = 15000; DeathCoil_Timer = 20000; - //reset encounter - if (instance) - instance->SetData(DATA_MAULGAREVENT, NOT_STARTED); + instance->SetBossState(DATA_MAULGAR, NOT_STARTED); } void AttackStart(Unit* who) OVERRIDE @@ -353,54 +242,25 @@ public: } } - void EnterCombat(Unit* who) OVERRIDE + void EnterCombat(Unit* /*who*/) OVERRIDE { - if (instance) - { - instance->SetData64(DATA_MAULGAREVENT_TANK, who->GetGUID()); - instance->SetData(DATA_MAULGAREVENT, IN_PROGRESS); - } + DoZoneInCombat(); + instance->SetBossState(DATA_MAULGAR, IN_PROGRESS); } void JustDied(Unit* /*killer*/) OVERRIDE { - if (instance) - { - Creature* Maulgar = NULL; - Maulgar = (Unit::GetCreature((*me), instance->GetData64(DATA_MAULGAR))); - - if (Maulgar) - CAST_AI(boss_high_king_maulgar::boss_high_king_maulgarAI, Maulgar->AI())->AddDeath(); + if (Creature* maulgar = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_MAULGAR))) + maulgar->AI()->DoAction(ACTION_ADD_DEATH); - if (CheckAllBossDied(instance, me)) - instance->SetData(DATA_MAULGAREVENT, DONE); - } + instance->SetBossState(DATA_MAULGAR, DONE); } void UpdateAI(uint32 diff) OVERRIDE { - //Only if not incombat check if the event is started - if (!me->IsInCombat() && instance && instance->GetData(DATA_MAULGAREVENT)) - { - Unit* target = Unit::GetUnit(*me, instance->GetData64(DATA_MAULGAREVENT_TANK)); - - if (target) - { - AttackStart(target); - } - } - - //Return since we have no target if (!UpdateVictim()) return; - //someone evaded! - if (instance && !instance->GetData(DATA_MAULGAREVENT)) - { - EnterEvadeMode(); - return; - } - //DarkDecay_Timer if (DarkDecay_Timer <= diff) { @@ -429,6 +289,10 @@ public: } }; + CreatureAI* GetAI(Creature* creature) const OVERRIDE + { + return GetGruulsLairAI<boss_olm_the_summonerAI>(creature); + } }; //Kiggler The Crazed AI @@ -437,11 +301,6 @@ class boss_kiggler_the_crazed : public CreatureScript public: boss_kiggler_the_crazed() : CreatureScript("boss_kiggler_the_crazed") { } - CreatureAI* GetAI(Creature* creature) const OVERRIDE - { - return new boss_kiggler_the_crazedAI(creature); - } - struct boss_kiggler_the_crazedAI : public ScriptedAI { boss_kiggler_the_crazedAI(Creature* creature) : ScriptedAI(creature) @@ -463,59 +322,28 @@ public: ArcaneShock_Timer = 20000; ArcaneExplosion_Timer = 30000; - //reset encounter - if (instance) - instance->SetData(DATA_MAULGAREVENT, NOT_STARTED); + instance->SetBossState(DATA_MAULGAR, NOT_STARTED); } - void EnterCombat(Unit* who) OVERRIDE + void EnterCombat(Unit* /*who*/) OVERRIDE { - if (instance) - { - instance->SetData64(DATA_MAULGAREVENT_TANK, who->GetGUID()); - instance->SetData(DATA_MAULGAREVENT, IN_PROGRESS); - } + DoZoneInCombat(); + instance->SetBossState(DATA_MAULGAR, IN_PROGRESS); } void JustDied(Unit* /*killer*/) OVERRIDE { - if (instance) - { - Creature* Maulgar = NULL; - Maulgar = (Unit::GetCreature((*me), instance->GetData64(DATA_MAULGAR))); - - if (Maulgar) - CAST_AI(boss_high_king_maulgar::boss_high_king_maulgarAI, Maulgar->AI())->AddDeath(); + if (Creature* maulgar = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_MAULGAR))) + maulgar->AI()->DoAction(ACTION_ADD_DEATH); - if (CheckAllBossDied(instance, me)) - instance->SetData(DATA_MAULGAREVENT, DONE); - } + instance->SetBossState(DATA_MAULGAR, DONE); } void UpdateAI(uint32 diff) OVERRIDE { - //Only if not incombat check if the event is started - if (!me->IsInCombat() && instance && instance->GetData(DATA_MAULGAREVENT)) - { - Unit* target = Unit::GetUnit(*me, instance->GetData64(DATA_MAULGAREVENT_TANK)); - - if (target) - { - AttackStart(target); - } - } - - //Return since we have no target if (!UpdateVictim()) return; - //someone evaded! - if (instance && !instance->GetData(DATA_MAULGAREVENT)) - { - EnterEvadeMode(); - return; - } - //GreaterPolymorph_Timer if (GreaterPolymorph_Timer <= diff) { @@ -550,19 +378,17 @@ public: } }; + CreatureAI* GetAI(Creature* creature) const OVERRIDE + { + return GetGruulsLairAI<boss_kiggler_the_crazedAI>(creature); + } }; -//Blindeye The Seer AI class boss_blindeye_the_seer : public CreatureScript { public: boss_blindeye_the_seer() : CreatureScript("boss_blindeye_the_seer") { } - CreatureAI* GetAI(Creature* creature) const OVERRIDE - { - return new boss_blindeye_the_seerAI(creature); - } - struct boss_blindeye_the_seerAI : public ScriptedAI { boss_blindeye_the_seerAI(Creature* creature) : ScriptedAI(creature) @@ -582,59 +408,28 @@ public: Heal_Timer = urand(25000, 40000); PrayerofHealing_Timer = urand(45000, 55000); - //reset encounter - if (instance) - instance->SetData(DATA_MAULGAREVENT, NOT_STARTED); + instance->SetBossState(DATA_MAULGAR, NOT_STARTED); } - void EnterCombat(Unit* who) OVERRIDE + void EnterCombat(Unit* /*who*/) OVERRIDE { - if (instance) - { - instance->SetData64(DATA_MAULGAREVENT_TANK, who->GetGUID()); - instance->SetData(DATA_MAULGAREVENT, IN_PROGRESS); - } + DoZoneInCombat(); + instance->SetBossState(DATA_MAULGAR, IN_PROGRESS); } void JustDied(Unit* /*killer*/) OVERRIDE { - if (instance) - { - Creature* Maulgar = NULL; - Maulgar = (Unit::GetCreature((*me), instance->GetData64(DATA_MAULGAR))); + if (Creature* maulgar = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_MAULGAR))) + maulgar->AI()->DoAction(ACTION_ADD_DEATH); - if (Maulgar) - CAST_AI(boss_high_king_maulgar::boss_high_king_maulgarAI, Maulgar->AI())->AddDeath(); - - if (CheckAllBossDied(instance, me)) - instance->SetData(DATA_MAULGAREVENT, DONE); - } + instance->SetBossState(DATA_MAULGAR, DONE); } void UpdateAI(uint32 diff) OVERRIDE { - //Only if not incombat check if the event is started - if (!me->IsInCombat() && instance && instance->GetData(DATA_MAULGAREVENT)) - { - Unit* target = Unit::GetUnit(*me, instance->GetData64(DATA_MAULGAREVENT_TANK)); - - if (target) - { - AttackStart(target); - } - } - - //Return since we have no target if (!UpdateVictim()) return; - //someone evaded! - if (instance && !instance->GetData(DATA_MAULGAREVENT)) - { - EnterEvadeMode(); - return; - } - //GreaterPowerWordShield_Timer if (GreaterPowerWordShield_Timer <= diff) { @@ -660,19 +455,17 @@ public: } }; + CreatureAI* GetAI(Creature* creature) const OVERRIDE + { + return GetGruulsLairAI<boss_blindeye_the_seerAI>(creature); + } }; -//Krosh Firehand AI class boss_krosh_firehand : public CreatureScript { public: boss_krosh_firehand() : CreatureScript("boss_krosh_firehand") { } - CreatureAI* GetAI(Creature* creature) const OVERRIDE - { - return new boss_krosh_firehandAI(creature); - } - struct boss_krosh_firehandAI : public ScriptedAI { boss_krosh_firehandAI(Creature* creature) : ScriptedAI(creature) @@ -692,59 +485,28 @@ public: SpellShield_Timer = 5000; BlastWave_Timer = 20000; - //reset encounter - if (instance) - instance->SetData(DATA_MAULGAREVENT, NOT_STARTED); + instance->SetBossState(DATA_MAULGAR, NOT_STARTED); } - void EnterCombat(Unit* who) OVERRIDE + void EnterCombat(Unit* /*who*/) OVERRIDE { - if (instance) - { - instance->SetData64(DATA_MAULGAREVENT_TANK, who->GetGUID()); - instance->SetData(DATA_MAULGAREVENT, IN_PROGRESS); - } + DoZoneInCombat(); + instance->SetBossState(DATA_MAULGAR, IN_PROGRESS); } void JustDied(Unit* /*killer*/) OVERRIDE { - if (instance) - { - Creature* Maulgar = NULL; - Maulgar = (Unit::GetCreature((*me), instance->GetData64(DATA_MAULGAR))); + if (Creature* maulgar = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_MAULGAR))) + maulgar->AI()->DoAction(ACTION_ADD_DEATH); - if (Maulgar) - CAST_AI(boss_high_king_maulgar::boss_high_king_maulgarAI, Maulgar->AI())->AddDeath(); - - if (CheckAllBossDied(instance, me)) - instance->SetData(DATA_MAULGAREVENT, DONE); - } + instance->SetBossState(DATA_MAULGAR, DONE); } void UpdateAI(uint32 diff) OVERRIDE { - //Only if not incombat check if the event is started - if (!me->IsInCombat() && instance && instance->GetData(DATA_MAULGAREVENT)) - { - Unit* target = Unit::GetUnit(*me, instance->GetData64(DATA_MAULGAREVENT_TANK)); - - if (target) - { - AttackStart(target); - } - } - - //Return since we have no target if (!UpdateVictim()) return; - //someone evaded! - if (instance && !instance->GetData(DATA_MAULGAREVENT)) - { - EnterEvadeMode(); - return; - } - //GreaterFireball_Timer if (GreaterFireball_Timer < diff || me->IsWithinDist(me->GetVictim(), 30)) { @@ -783,6 +545,11 @@ public: } else BlastWave_Timer -= diff; } }; + + CreatureAI* GetAI(Creature* creature) const OVERRIDE + { + return GetGruulsLairAI<boss_krosh_firehandAI>(creature); + } }; void AddSC_boss_high_king_maulgar() diff --git a/src/server/scripts/Outland/GruulsLair/gruuls_lair.h b/src/server/scripts/Outland/GruulsLair/gruuls_lair.h index 69ddba8c274..1425a19aa47 100644 --- a/src/server/scripts/Outland/GruulsLair/gruuls_lair.h +++ b/src/server/scripts/Outland/GruulsLair/gruuls_lair.h @@ -1,6 +1,5 @@ /* * Copyright (C) 2008-2013 TrinityCore <http://www.trinitycore.org/> - * Copyright (C) 2006-2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/> * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the @@ -16,23 +15,39 @@ * with this program. If not, see <http://www.gnu.org/licenses/>. */ -#ifndef DEF_GRUULS_LAIR_H -#define DEF_GRUULS_LAIR_H +#ifndef GRUULS_LAIR_H_ +#define GRUULS_LAIR_H_ + +#define GLScriptName "instance_gruuls_lair" + +uint32 const EncounterCount = 2; enum DataTypes { - DATA_BLINDEYETHESEER = 1, - DATA_GRUULEVENT = 2, - DATA_KIGGLERTHECRAZED = 3, - DATA_KROSHFIREHAND = 4, - DATA_MAULGAREVENT = 5, - DATA_MAULGAREVENT_TANK = 6, - DATA_OLMTHESUMMONER = 7, - DATA_MAULGARDOOR = 8, - DATA_GRUULDOOR = 9, - DATA_MAULGAR = 10 + // Encounter States/Boss GUIDs + DATA_MAULGAR = 0, + DATA_GRUUL = 1 +}; + +enum CreatureIds +{ + NPC_MAULGAR = 18831, + NPC_KROSH_FIREHAND = 18832, + NPC_OLM_THE_SUMMONER = 18834, + NPC_KIGGLER_THE_CRAZED = 18835, + NPC_BLINDEYE_THE_SEER = 18836 }; -#define ERROR_INST_DATA "TSCR Error: Instance Data not set properly for Gruul's Lair instance (map 565). Encounters will be buggy." -#endif +enum GameObjectIds +{ + GO_MAULGAR_DOOR = 184468, + GO_GRUUL_DOOR = 184662 +}; + +template<class AI> +AI* GetGruulsLairAI(Creature* creature) +{ + return GetInstanceAI<AI>(creature, GLScriptName); +} +#endif // GRUULS_LAIR_H_ diff --git a/src/server/scripts/Outland/GruulsLair/instance_gruuls_lair.cpp b/src/server/scripts/Outland/GruulsLair/instance_gruuls_lair.cpp index d8399793df4..aa8a8d01d8a 100644 --- a/src/server/scripts/Outland/GruulsLair/instance_gruuls_lair.cpp +++ b/src/server/scripts/Outland/GruulsLair/instance_gruuls_lair.cpp @@ -1,6 +1,5 @@ /* * Copyright (C) 2008-2013 TrinityCore <http://www.trinitycore.org/> - * Copyright (C) 2006-2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/> * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the @@ -16,184 +15,165 @@ * with this program. If not, see <http://www.gnu.org/licenses/>. */ -/* ScriptData -SDName: Instance_Gruuls_Lair -SD%Complete: 100 -SDComment: -SDCategory: Gruul's Lair -EndScriptData */ - #include "ScriptMgr.h" #include "InstanceScript.h" #include "gruuls_lair.h" -#define MAX_ENCOUNTER 2 +DoorData const doorData[] = +{ + { GO_MAULGAR_DOOR, DATA_MAULGAR, DOOR_TYPE_PASSAGE, BOUNDARY_NONE }, + { GO_GRUUL_DOOR, DATA_GRUUL, DOOR_TYPE_ROOM, BOUNDARY_NONE }, + { 0, 0, DOOR_TYPE_ROOM, BOUNDARY_NONE } // END +}; -/* Gruuls Lair encounters: -1 - High King Maulgar event -2 - Gruul event -*/ +MinionData const minionData[] = +{ + { NPC_MAULGAR, DATA_MAULGAR }, + { NPC_KROSH_FIREHAND, DATA_MAULGAR }, + { NPC_OLM_THE_SUMMONER, DATA_MAULGAR }, + { NPC_KIGGLER_THE_CRAZED, DATA_MAULGAR }, + { NPC_BLINDEYE_THE_SEER, DATA_MAULGAR } +}; class instance_gruuls_lair : public InstanceMapScript { -public: - instance_gruuls_lair() : InstanceMapScript("instance_gruuls_lair", 565) { } - - InstanceScript* GetInstanceScript(InstanceMap* map) const OVERRIDE - { - return new instance_gruuls_lair_InstanceMapScript(map); - } + public: + instance_gruuls_lair() : InstanceMapScript(GLScriptName, 565) { } - struct instance_gruuls_lair_InstanceMapScript : public InstanceScript - { - instance_gruuls_lair_InstanceMapScript(Map* map) : InstanceScript(map) {} - - uint32 m_auiEncounter[MAX_ENCOUNTER]; - - uint64 MaulgarEvent_Tank; - uint64 KigglerTheCrazed; - uint64 BlindeyeTheSeer; - uint64 OlmTheSummoner; - uint64 KroshFirehand; - uint64 Maulgar; - - uint64 MaulgarDoor; - uint64 GruulDoor; - - void Initialize() OVERRIDE + struct instance_gruuls_lair_InstanceMapScript : public InstanceScript { - memset(&m_auiEncounter, 0, sizeof(m_auiEncounter)); - - MaulgarEvent_Tank = 0; - KigglerTheCrazed = 0; - BlindeyeTheSeer = 0; - OlmTheSummoner = 0; - KroshFirehand = 0; - Maulgar = 0; - - MaulgarDoor = 0; - GruulDoor = 0; - } - - bool IsEncounterInProgress() const OVERRIDE - { - for (uint8 i = 0; i < MAX_ENCOUNTER; ++i) - if (m_auiEncounter[i] == IN_PROGRESS) - return true; + instance_gruuls_lair_InstanceMapScript(Map* map) : InstanceScript(map) + { + SetBossNumber(EncounterCount); + LoadDoorData(doorData); + LoadMinionData(minionData); - return false; - } + MaulgarGUID = 0; + } - void OnCreatureCreate(Creature* creature) OVERRIDE - { - switch (creature->GetEntry()) + void OnCreatureCreate(Creature* creature) OVERRIDE { - case 18835: KigglerTheCrazed = creature->GetGUID(); break; - case 18836: BlindeyeTheSeer = creature->GetGUID(); break; - case 18834: OlmTheSummoner = creature->GetGUID(); break; - case 18832: KroshFirehand = creature->GetGUID(); break; - case 18831: Maulgar = creature->GetGUID(); break; + switch (creature->GetEntry()) + { + case NPC_MAULGAR: + MaulgarGUID = creature->GetGUID(); + // no break; + case NPC_KROSH_FIREHAND: + case NPC_OLM_THE_SUMMONER: + case NPC_KIGGLER_THE_CRAZED: + case NPC_BLINDEYE_THE_SEER: + AddMinion(creature, true); + break; + default: + break; + } } - } - void OnGameObjectCreate(GameObject* go) OVERRIDE - { - switch (go->GetEntry()) + void OnCreatureRemove(Creature* creature) OVERRIDE { - case 184468: - MaulgarDoor = go->GetGUID(); - if (m_auiEncounter[0] == DONE) - HandleGameObject(0, true, go); - break; - case 184662: - GruulDoor = go->GetGUID(); - break; + switch (creature->GetEntry()) + { + case NPC_MAULGAR: + case NPC_KROSH_FIREHAND: + case NPC_OLM_THE_SUMMONER: + case NPC_KIGGLER_THE_CRAZED: + case NPC_BLINDEYE_THE_SEER: + AddMinion(creature, false); + break; + default: + break; + } } - } - void SetData64(uint32 type, uint64 data) OVERRIDE - { - if (type == DATA_MAULGAREVENT_TANK) - MaulgarEvent_Tank = data; - } - - uint64 GetData64(uint32 identifier) const OVERRIDE - { - switch (identifier) + void OnGameObjectCreate(GameObject* go) OVERRIDE { - case DATA_MAULGAREVENT_TANK: return MaulgarEvent_Tank; - case DATA_KIGGLERTHECRAZED: return KigglerTheCrazed; - case DATA_BLINDEYETHESEER: return BlindeyeTheSeer; - case DATA_OLMTHESUMMONER: return OlmTheSummoner; - case DATA_KROSHFIREHAND: return KroshFirehand; - case DATA_MAULGARDOOR: return MaulgarDoor; - case DATA_GRUULDOOR: return GruulDoor; - case DATA_MAULGAR: return Maulgar; + switch (go->GetEntry()) + { + case GO_MAULGAR_DOOR: + case GO_GRUUL_DOOR: + AddDoor(go, true); + break; + default: + break; + } } - return 0; - } - void SetData(uint32 type, uint32 data) OVERRIDE - { - switch (type) + void OnGameObjectRemove(GameObject* go) OVERRIDE { - case DATA_MAULGAREVENT: - if (data == DONE) - HandleGameObject(MaulgarDoor, true); - m_auiEncounter[0] = data; - break; - - case DATA_GRUULEVENT: - if (data == IN_PROGRESS) - HandleGameObject(GruulDoor, false); - else - HandleGameObject(GruulDoor, true); - m_auiEncounter[1] = data; - break; + switch (go->GetEntry()) + { + case GO_MAULGAR_DOOR: + case GO_GRUUL_DOOR: + AddDoor(go, false); + break; + default: + break; + } } - if (data == DONE) - SaveToDB(); - } - - uint32 GetData(uint32 type) const OVERRIDE - { - switch (type) + uint64 GetData64(uint32 type) const OVERRIDE { - case DATA_MAULGAREVENT: return m_auiEncounter[0]; - case DATA_GRUULEVENT: return m_auiEncounter[1]; + switch (type) + { + case DATA_MAULGAR: + return MaulgarGUID; + default: + break; + } + return 0; } - return 0; - } - std::string GetSaveData() OVERRIDE - { - OUT_SAVE_INST_DATA; - std::ostringstream stream; - stream << m_auiEncounter[0] << ' ' << m_auiEncounter[1]; + std::string GetSaveData() OVERRIDE + { + OUT_SAVE_INST_DATA; - OUT_SAVE_INST_DATA_COMPLETE; - return stream.str(); - } + std::ostringstream saveStream; + saveStream << "G L " << GetBossSaveData(); - void Load(const char* in) OVERRIDE - { - if (!in) + OUT_SAVE_INST_DATA_COMPLETE; + return saveStream.str(); + } + + void Load(char const* str) OVERRIDE { - OUT_LOAD_INST_DATA_FAIL; - return; + if (!str) + { + OUT_LOAD_INST_DATA_FAIL; + return; + } + + OUT_LOAD_INST_DATA(str); + + char dataHead1, dataHead2; + + std::istringstream loadStream(str); + loadStream >> dataHead1 >> dataHead2; + + if (dataHead1 == 'G' && dataHead2 == 'L') + { + for (uint32 i = 0; i < EncounterCount; ++i) + { + uint32 tmpState; + loadStream >> tmpState; + if (tmpState == IN_PROGRESS || tmpState > SPECIAL) + tmpState = NOT_STARTED; + SetBossState(i, EncounterState(tmpState)); + } + } + else + OUT_LOAD_INST_DATA_FAIL; + + OUT_LOAD_INST_DATA_COMPLETE; } - OUT_LOAD_INST_DATA(in); - std::istringstream stream(in); - stream >> m_auiEncounter[0] >> m_auiEncounter[1]; - for (uint8 i = 0; i < MAX_ENCOUNTER; ++i) - if (m_auiEncounter[i] == IN_PROGRESS) // Do not load an encounter as "In Progress" - reset it instead. - m_auiEncounter[i] = NOT_STARTED; - OUT_LOAD_INST_DATA_COMPLETE; - } - }; + protected: + uint64 MaulgarGUID; + }; + InstanceScript* GetInstanceScript(InstanceMap* map) const OVERRIDE + { + return new instance_gruuls_lair_InstanceMapScript(map); + } }; void AddSC_instance_gruuls_lair() diff --git a/src/server/scripts/Spells/spell_shaman.cpp b/src/server/scripts/Spells/spell_shaman.cpp index 3bf305d73c9..caae7944f78 100644 --- a/src/server/scripts/Spells/spell_shaman.cpp +++ b/src/server/scripts/Spells/spell_shaman.cpp @@ -512,9 +512,9 @@ class spell_sha_flame_shock : public SpellScriptLoader // Lava Flows if (AuraEffect const* aurEff = caster->GetDummyAuraEffect(SPELLFAMILY_SHAMAN, SHAMAN_ICON_ID_SHAMAN_LAVA_FLOW, EFFECT_0)) { - SpellInfo const* firstRankSpellInfo = sSpellMgr->GetSpellInfo(SPELL_SHAMAN_LAVA_FLOWS_R1); - if (!aurEff->GetSpellInfo()->IsRankOf(firstRankSpellInfo)) - return; + if (SpellInfo const* firstRankSpellInfo = sSpellMgr->GetSpellInfo(SPELL_SHAMAN_LAVA_FLOWS_R1)) + if (!aurEff->GetSpellInfo()->IsRankOf(firstRankSpellInfo)) + return; int32 basepoints = aurEff->GetAmount(); caster->CastCustomSpell(caster, SPELL_SHAMAN_LAVA_FLOWS_TRIGGERED_R1, &basepoints, NULL, NULL, true); diff --git a/src/server/shared/Cryptography/HMACSHA1.cpp b/src/server/shared/Cryptography/HMACSHA1.cpp index 62d1997ded2..c6c49f14a8e 100644 --- a/src/server/shared/Cryptography/HMACSHA1.cpp +++ b/src/server/shared/Cryptography/HMACSHA1.cpp @@ -36,6 +36,11 @@ void HmacHash::UpdateData(const std::string &str) HMAC_Update(&m_ctx, (uint8 const*)str.c_str(), str.length()); } +void HmacHash::UpdateData(const uint8* data, size_t len) +{ + HMAC_Update(&m_ctx, data, len); +} + void HmacHash::Finalize() { uint32 length = 0; diff --git a/src/server/shared/Cryptography/HMACSHA1.h b/src/server/shared/Cryptography/HMACSHA1.h index e09e7fdb43c..04b8f7d0277 100644 --- a/src/server/shared/Cryptography/HMACSHA1.h +++ b/src/server/shared/Cryptography/HMACSHA1.h @@ -34,6 +34,7 @@ class HmacHash HmacHash(uint32 len, uint8 *seed); ~HmacHash(); void UpdateData(const std::string &str); + void UpdateData(const uint8* data, size_t len); void Finalize(); uint8 *ComputeHash(BigNumber* bn); uint8 *GetDigest() { return (uint8*)m_digest; } diff --git a/src/server/shared/Database/Implementation/LoginDatabase.cpp b/src/server/shared/Database/Implementation/LoginDatabase.cpp index 6113dd61d70..26940c8a599 100644 --- a/src/server/shared/Database/Implementation/LoginDatabase.cpp +++ b/src/server/shared/Database/Implementation/LoginDatabase.cpp @@ -37,7 +37,7 @@ void LoginDatabaseConnection::DoPrepareStatements() PrepareStatement(LOGIN_SEL_SESSIONKEY, "SELECT a.sessionkey, a.id, aa.gmlevel FROM account a LEFT JOIN account_access aa ON (a.id = aa.id) WHERE username = ?", CONNECTION_SYNCH); PrepareStatement(LOGIN_UPD_VS, "UPDATE account SET v = ?, s = ? WHERE username = ?", CONNECTION_ASYNC); PrepareStatement(LOGIN_UPD_LOGONPROOF, "UPDATE account SET sessionkey = ?, last_ip = ?, last_login = NOW(), locale = ?, failed_logins = 0, os = ? WHERE username = ?", CONNECTION_ASYNC); - PrepareStatement(LOGIN_SEL_LOGONCHALLENGE, "SELECT a.sha_pass_hash, a.id, a.locked, a.lock_country, a.last_ip, aa.gmlevel, a.v, a.s FROM account a LEFT JOIN account_access aa ON (a.id = aa.id) WHERE a.username = ?", CONNECTION_SYNCH); + PrepareStatement(LOGIN_SEL_LOGONCHALLENGE, "SELECT a.sha_pass_hash, a.id, a.locked, a.lock_country, a.last_ip, aa.gmlevel, a.v, a.s, a.token_key FROM account a LEFT JOIN account_access aa ON (a.id = aa.id) WHERE a.username = ?", CONNECTION_SYNCH); PrepareStatement(LOGIN_SEL_LOGON_COUNTRY, "SELECT country FROM ip2nation WHERE ip < ? ORDER BY ip DESC LIMIT 0,1", CONNECTION_SYNCH); PrepareStatement(LOGIN_UPD_FAILEDLOGINS, "UPDATE account SET failed_logins = failed_logins + 1 WHERE username = ?", CONNECTION_ASYNC); PrepareStatement(LOGIN_SEL_FAILEDLOGINS, "SELECT id, failed_logins FROM account WHERE username = ?", CONNECTION_SYNCH); diff --git a/src/server/shared/Database/QueryResult.cpp b/src/server/shared/Database/QueryResult.cpp index 4f4c0ec51f4..9413e28a0c0 100644 --- a/src/server/shared/Database/QueryResult.cpp +++ b/src/server/shared/Database/QueryResult.cpp @@ -60,6 +60,9 @@ m_length(NULL) if (mysql_stmt_store_result(m_stmt)) { TC_LOG_WARN(LOG_FILTER_SQL, "%s:mysql_stmt_store_result, cannot bind result from MySQL server. Error: %s", __FUNCTION__, mysql_stmt_error(m_stmt)); + delete[] m_rBind; + delete[] m_isNull; + delete[] m_length; return; } diff --git a/src/server/shared/Threading/Threading.cpp b/src/server/shared/Threading/Threading.cpp index bd96c359616..34a7bf8bb9d 100644 --- a/src/server/shared/Threading/Threading.cpp +++ b/src/server/shared/Threading/Threading.cpp @@ -62,7 +62,7 @@ ThreadPriority::ThreadPriority() //since we have only 7(seven) values in enum Priority //and 3 we know already (Idle, Normal, Realtime) so //we need to split each list [Idle...Normal] and [Normal...Realtime] - //into ¹ piesces + //into piecies const size_t _divider = 4; size_t _div = (norm_pos - min_pos) / _divider; if (_div == 0) @@ -130,10 +130,13 @@ bool Thread::start() if (m_task == 0 || m_iThreadId != 0) return false; + // incRef before spawing the thread, otherwise Thread::ThreadTask() might call decRef and delete m_task + m_task->incReference(); + bool res = (ACE_Thread::spawn(&Thread::ThreadTask, (void*)m_task, THREADFLAG, &m_iThreadId, &m_hThreadHandle) == 0); - if (res) - m_task->incReference(); + if (!res) + m_task->decReference(); return res; } diff --git a/src/server/shared/Utilities/Util.h b/src/server/shared/Utilities/Util.h index 5d1ce862d21..0ecc5a9f756 100644 --- a/src/server/shared/Utilities/Util.h +++ b/src/server/shared/Utilities/Util.h @@ -173,7 +173,7 @@ inline bool isExtendedLatinCharacter(wchar_t wchar) return true; if (wchar >= 0x00C0 && wchar <= 0x00D6) // LATIN CAPITAL LETTER A WITH GRAVE - LATIN CAPITAL LETTER O WITH DIAERESIS return true; - if (wchar >= 0x00D8 && wchar <= 0x00DF) // LATIN CAPITAL LETTER O WITH STROKE - LATIN CAPITAL LETTER THORN + if (wchar >= 0x00D8 && wchar <= 0x00DE) // LATIN CAPITAL LETTER O WITH STROKE - LATIN CAPITAL LETTER THORN return true; if (wchar == 0x00DF) // LATIN SMALL LETTER SHARP S return true; diff --git a/src/tools/mmaps_generator/MapBuilder.cpp b/src/tools/mmaps_generator/MapBuilder.cpp index 06a764690ca..a8254eb5eaf 100644 --- a/src/tools/mmaps_generator/MapBuilder.cpp +++ b/src/tools/mmaps_generator/MapBuilder.cpp @@ -202,7 +202,10 @@ namespace MMAP minX = INT_MIN; minY = INT_MIN; - float bmin[3], bmax[3], lmin[3], lmax[3]; + float bmin[3] = { 0, 0, 0 }; + float bmax[3] = { 0, 0, 0 }; + float lmin[3] = { 0, 0, 0 }; + float lmax[3] = { 0, 0, 0 }; MeshData meshData; // make sure we process maps which don't have tiles @@ -260,25 +263,45 @@ namespace MMAP uint32 verticesCount, indicesCount; if (fread(&verticesCount, sizeof(uint32), 1, file) != 1) + { + fclose(file); return; + } + if (fread(&indicesCount, sizeof(uint32), 1, file) != 1) + { + fclose(file); return; + } float* verts = new float[verticesCount]; int* inds = new int[indicesCount]; if (fread(verts, sizeof(float), verticesCount, file) != verticesCount) + { + fclose(file); + delete[] verts; + delete[] inds; return; + } + if (fread(inds, sizeof(int), indicesCount, file) != indicesCount) + { + fclose(file); + delete[] verts; + delete[] inds; return; + } MeshData data; for (uint32 i = 0; i < verticesCount; ++i) data.solidVerts.append(verts[i]); + delete[] verts; for (uint32 i = 0; i < indicesCount; ++i) data.solidTris.append(inds[i]); + delete[] inds; TerrainBuilder::cleanVertices(data.solidVerts, data.solidTris); // get bounds of current tile @@ -659,6 +682,9 @@ namespace MMAP if (!iv.polyMesh) { printf("%s alloc iv.polyMesh FIALED!\n", tileString); + delete[] pmmerge; + delete[] dmmerge; + delete[] tiles; return; } rcMergePolyMeshes(m_rcContext, pmmerge, nmerge, *iv.polyMesh); @@ -667,6 +693,9 @@ namespace MMAP if (!iv.polyMeshDetail) { printf("%s alloc m_dmesh FIALED!\n", tileString); + delete[] pmmerge; + delete[] dmmerge; + delete[] tiles; return; } rcMergePolyMeshDetails(m_rcContext, dmmerge, nmerge, *iv.polyMeshDetail); @@ -674,7 +703,6 @@ namespace MMAP // free things up delete[] pmmerge; delete[] dmmerge; - delete[] tiles; // set polygons as walkable diff --git a/src/tools/mmaps_generator/PathCommon.h b/src/tools/mmaps_generator/PathCommon.h index 3e06ff58410..94a11e01730 100644 --- a/src/tools/mmaps_generator/PathCommon.h +++ b/src/tools/mmaps_generator/PathCommon.h @@ -114,7 +114,6 @@ namespace MMAP const char *p = dirpath.c_str(); DIR * dirp = opendir(p); struct dirent * dp; - dirp = opendir(p); while (dirp) { diff --git a/src/tools/mmaps_generator/TerrainBuilder.cpp b/src/tools/mmaps_generator/TerrainBuilder.cpp index 3a87da3d4f1..5c76161c0d6 100644 --- a/src/tools/mmaps_generator/TerrainBuilder.cpp +++ b/src/tools/mmaps_generator/TerrainBuilder.cpp @@ -260,7 +260,8 @@ namespace MMAP meshData.solidVerts.append(coord[1]); } - int indices[3], loopStart = 0, loopEnd = 0, loopInc = 0; + int indices[] = { 0, 0, 0 }; + int loopStart = 0, loopEnd = 0, loopInc = 0; getLoopVars(portion, loopStart, loopEnd, loopInc); for (int i = loopStart; i < loopEnd; i+=loopInc) for (int j = TOP; j <= BOTTOM; j+=1) @@ -340,7 +341,8 @@ namespace MMAP delete [] liquid_map; - int indices[3], loopStart = 0, loopEnd = 0, loopInc = 0, triInc = BOTTOM-TOP; + int indices[] = { 0, 0, 0 }; + int loopStart = 0, loopEnd = 0, loopInc = 0, triInc = BOTTOM-TOP; getLoopVars(portion, loopStart, loopEnd, loopInc); // generate triangles diff --git a/src/tools/vmap4_assembler/VMapAssembler.cpp b/src/tools/vmap4_assembler/VMapAssembler.cpp index bb8e324bc75..4ee6f5fce3c 100644 --- a/src/tools/vmap4_assembler/VMapAssembler.cpp +++ b/src/tools/vmap4_assembler/VMapAssembler.cpp @@ -5,9 +5,8 @@ int main(int argc, char* argv[]) { - if(argc != 3) + if (argc != 3) { - //printf("\nusage: %s <raw data dir> <vmap dest dir> [config file name]\n", argv[0]); std::cout << "usage: " << argv[0] << " <raw data dir> <vmap dest dir>" << std::endl; return 1; } @@ -19,7 +18,7 @@ int main(int argc, char* argv[]) VMAP::TileAssembler* ta = new VMAP::TileAssembler(src, dest); - if(!ta->convertWorld2()) + if (!ta->convertWorld2()) { std::cout << "exit with errors" << std::endl; delete ta; diff --git a/src/tools/vmap4_extractor/gameobject_extract.cpp b/src/tools/vmap4_extractor/gameobject_extract.cpp index 3147469e342..af6d621248c 100644 --- a/src/tools/vmap4_extractor/gameobject_extract.cpp +++ b/src/tools/vmap4_extractor/gameobject_extract.cpp @@ -50,7 +50,13 @@ void ExtractGameobjectModels() basepath += "/"; std::string path; - FILE * model_list = fopen((basepath + "temp_gameobject_models").c_str(), "wb"); + std::string modelListPath = basepath + "temp_gameobject_models"; + FILE* model_list = fopen(modelListPath.c_str(), "wb"); + if (!model_list) + { + printf("Fatal error: Could not open file %s\n", modelListPath.c_str()); + return; + } for (DBCFile::Iterator it = dbc.begin(); it != dbc.end(); ++it) { diff --git a/src/tools/vmap4_extractor/vmapexport.cpp b/src/tools/vmap4_extractor/vmapexport.cpp index b650121f587..cd9f552eaee 100644 --- a/src/tools/vmap4_extractor/vmapexport.cpp +++ b/src/tools/vmap4_extractor/vmapexport.cpp @@ -315,16 +315,16 @@ bool ExtractSingleWmo(std::string& fname) return true; int p = 0; - //Select root wmo files + // Select root wmo files char const* rchr = strrchr(plain_name, '_'); - if(rchr != NULL) + if (rchr != NULL) { char cpy[4]; - strncpy((char*)cpy, rchr, 4); + memcpy(cpy, rchr, 4); for (int i = 0; i < 4; ++i) { int m = cpy[i]; - if(isdigit(m)) + if (isdigit(m)) p++; } } diff --git a/src/tools/vmap4_extractor/wmo.cpp b/src/tools/vmap4_extractor/wmo.cpp index 63187963550..8bf70b8ffbb 100644 --- a/src/tools/vmap4_extractor/wmo.cpp +++ b/src/tools/vmap4_extractor/wmo.cpp @@ -138,14 +138,12 @@ bool WMORoot::ConvertToVMAPRootWmo(FILE* pOutfile) return true; } -WMORoot::~WMORoot() -{ -} - WMOGroup::WMOGroup(const std::string &filename) : filename(filename), MOPY(0), MOVI(0), MoviEx(0), MOVT(0), MOBA(0), MobaEx(0), hlq(0), LiquEx(0), LiquBytes(0), groupName(0), descGroupName(0), mogpFlags(0), - mopy_size(0), moba_size(0), LiquEx_size(0), nVertices(0), nTriangles(0) + mopy_size(0), moba_size(0), LiquEx_size(0), nVertices(0), nTriangles(0), + moprIdx(0), moprNItems(0), nBatchA(0), nBatchB(0), fogIdx(0), liquidType(0), + groupWMOID(0), liquflags(0) { memset(bbcorn1, 0, sizeof(bbcorn1)); memset(bbcorn2, 0, sizeof(bbcorn2)); @@ -390,7 +388,7 @@ int WMOGroup::ConvertToVMAPGroupWmo(FILE *output, WMORoot *rootWMO, bool precise fwrite(MoviEx,2,nColTriangles*3,output); // write vertices - int VERT[] = {0x54524556, nColVertices*3*sizeof(float)+4, nColVertices};// "VERT" + int VERT[] = {0x54524556, nColVertices*3*static_cast<int>(sizeof(float))+4, nColVertices};// "VERT" int check = 3*nColVertices; fwrite(VERT,4,3,output); for (uint32 i=0; i<nVertices; ++i) @@ -404,9 +402,9 @@ int WMOGroup::ConvertToVMAPGroupWmo(FILE *output, WMORoot *rootWMO, bool precise } //------LIQU------------------------ - if(LiquEx_size != 0) + if (LiquEx_size != 0) { - int LIQU_h[] = {0x5551494C, sizeof(WMOLiquidHeader) + LiquEx_size + hlq->xtiles*hlq->ytiles};// "LIQU" + int LIQU_h[] = {0x5551494C, static_cast<int>(sizeof(WMOLiquidHeader) + LiquEx_size) + hlq->xtiles*hlq->ytiles};// "LIQU" fwrite(LIQU_h, 4, 2, output); // according to WoW.Dev Wiki: @@ -441,7 +439,7 @@ int WMOGroup::ConvertToVMAPGroupWmo(FILE *output, WMORoot *rootWMO, bool precise if (liquidEntry && liquidEntry < 21) { - switch (((uint8)liquidEntry - 1) & 3) + switch ((liquidEntry - 1) & 3) { case 0: liquidEntry = ((mogpFlags & 0x80000) != 0) + 13; @@ -455,8 +453,6 @@ int WMOGroup::ConvertToVMAPGroupWmo(FILE *output, WMORoot *rootWMO, bool precise case 3: liquidEntry = 20; break; - default: - break; } } @@ -490,7 +486,7 @@ WMOGroup::~WMOGroup() } WMOInstance::WMOInstance(MPQFile& f, char const* WmoInstName, uint32 mapID, uint32 tileX, uint32 tileY, FILE* pDirfile) - : currx(0), curry(0), wmo(NULL), doodadset(0), pos(), indx(0), d3(0) + : currx(0), curry(0), wmo(NULL), doodadset(0), pos(), indx(0), id(0), d2(0), d3(0) { float ff[3]; f.read(&id, 4); diff --git a/src/tools/vmap4_extractor/wmo.h b/src/tools/vmap4_extractor/wmo.h index 16d55ffe7de..204e4ead0ce 100644 --- a/src/tools/vmap4_extractor/wmo.h +++ b/src/tools/vmap4_extractor/wmo.h @@ -53,7 +53,6 @@ public: float bbcorn2[3]; WMORoot(std::string& filename); - ~WMORoot(); bool open(); bool ConvertToVMAPRootWmo(FILE* output); |