diff --git a/sql/world/base/naxx40_spells.sql b/sql/world/base/naxx40_spells.sql
index 3214651..e3ae2b3 100644
--- a/sql/world/base/naxx40_spells.sql
+++ b/sql/world/base/naxx40_spells.sql
@@ -19,26 +19,102 @@
-- Custom Spells
DELETE FROM `spell_dbc` WHERE `ID` BETWEEN 90001 AND 90007;
-INSERT INTO `spell_dbc` (`ID`,`Category`,`DispelType`,`Mechanic`,`Attributes`,`AttributesEx`,`AttributesEx2`,`AttributesEx3`,`AttributesEx4`,`AttributesEx5`,`AttributesEx6`,`AttributesEx7`,`ShapeshiftMask`,`unk_320_2`,`ShapeshiftExclude`,`unk_320_3`,`Targets`,`TargetCreatureType`,`RequiresSpellFocus`,`FacingCasterFlags`,`CasterAuraState`,`TargetAuraState`,`ExcludeCasterAuraState`,`ExcludeTargetAuraState`,`CasterAuraSpell`,`TargetAuraSpell`,`ExcludeCasterAuraSpell`,`ExcludeTargetAuraSpell`,`CastingTimeIndex`,`RecoveryTime`,`CategoryRecoveryTime`,`InterruptFlags`,`AuraInterruptFlags`,`ChannelInterruptFlags`,`ProcTypeMask`,`ProcChance`,`ProcCharges`,`MaxLevel`,`BaseLevel`,`SpellLevel`,`DurationIndex`,`PowerType`,`ManaCost`,`ManaCostPerLevel`,`ManaPerSecond`,`ManaPerSecondPerLevel`,`RangeIndex`,`Speed`,`ModalNextSpell`,`CumulativeAura`,`Totem_1`,`Totem_2`,`Reagent_1`,`Reagent_2`,`Reagent_3`,`Reagent_4`,`Reagent_5`,`Reagent_6`,`Reagent_7`,`Reagent_8`,`ReagentCount_1`,`ReagentCount_2`,`ReagentCount_3`,`ReagentCount_4`,`ReagentCount_5`,`ReagentCount_6`,`ReagentCount_7`,`ReagentCount_8`,`EquippedItemClass`,`EquippedItemSubclass`,`EquippedItemInvTypes`,`Effect_1`,`Effect_2`,`Effect_3`,`EffectDieSides_1`,`EffectDieSides_2`,`EffectDieSides_3`,`EffectRealPointsPerLevel_1`,`EffectRealPointsPerLevel_2`,`EffectRealPointsPerLevel_3`,`EffectBasePoints_1`,`EffectBasePoints_2`,`EffectBasePoints_3`,`EffectMechanic_1`,`EffectMechanic_2`,`EffectMechanic_3`,`ImplicitTargetA_1`,`ImplicitTargetA_2`,`ImplicitTargetA_3`,`ImplicitTargetB_1`,`ImplicitTargetB_2`,`ImplicitTargetB_3`,`EffectRadiusIndex_1`,`EffectRadiusIndex_2`,`EffectRadiusIndex_3`,`EffectAura_1`,`EffectAura_2`,`EffectAura_3`,`EffectAuraPeriod_1`,`EffectAuraPeriod_2`,`EffectAuraPeriod_3`,`EffectMultipleValue_1`,`EffectMultipleValue_2`,`EffectMultipleValue_3`,`EffectChainTargets_1`,`EffectChainTargets_2`,`EffectChainTargets_3`,`EffectItemType_1`,`EffectItemType_2`,`EffectItemType_3`,`EffectMiscValue_1`,`EffectMiscValue_2`,`EffectMiscValue_3`,`EffectMiscValueB_1`,`EffectMiscValueB_2`,`EffectMiscValueB_3`,`EffectTriggerSpell_1`,`EffectTriggerSpell_2`,`EffectTriggerSpell_3`,`EffectPointsPerCombo_1`,`EffectPointsPerCombo_2`,`EffectPointsPerCombo_3`,`EffectSpellClassMaskA_1`,`EffectSpellClassMaskA_2`,`EffectSpellClassMaskA_3`,`EffectSpellClassMaskB_1`,`EffectSpellClassMaskB_2`,`EffectSpellClassMaskB_3`,`EffectSpellClassMaskC_1`,`EffectSpellClassMaskC_2`,`EffectSpellClassMaskC_3`,`SpellVisualID_1`,`SpellVisualID_2`,`SpellIconID`,`ActiveIconID`,`SpellPriority`,`Name_Lang_enUS`,`Name_Lang_enGB`,`Name_Lang_koKR`,`Name_Lang_frFR`,`Name_Lang_deDE`,`Name_Lang_enCN`,`Name_Lang_zhCN`,`Name_Lang_enTW`,`Name_Lang_zhTW`,`Name_Lang_esES`,`Name_Lang_esMX`,`Name_Lang_ruRU`,`Name_Lang_ptPT`,`Name_Lang_ptBR`,`Name_Lang_itIT`,`Name_Lang_Unk`,`Name_Lang_Mask`,`NameSubtext_Lang_enUS`,`NameSubtext_Lang_enGB`,`NameSubtext_Lang_koKR`,`NameSubtext_Lang_frFR`,`NameSubtext_Lang_deDE`,`NameSubtext_Lang_enCN`,`NameSubtext_Lang_zhCN`,`NameSubtext_Lang_enTW`,`NameSubtext_Lang_zhTW`,`NameSubtext_Lang_esES`,`NameSubtext_Lang_esMX`,`NameSubtext_Lang_ruRU`,`NameSubtext_Lang_ptPT`,`NameSubtext_Lang_ptBR`,`NameSubtext_Lang_itIT`,`NameSubtext_Lang_Unk`,`NameSubtext_Lang_Mask`,`Description_Lang_enUS`,`Description_Lang_enGB`,`Description_Lang_koKR`,`Description_Lang_frFR`,`Description_Lang_deDE`,`Description_Lang_enCN`,`Description_Lang_zhCN`,`Description_Lang_enTW`,`Description_Lang_zhTW`,`Description_Lang_esES`,`Description_Lang_esMX`,`Description_Lang_ruRU`,`Description_Lang_ptPT`,`Description_Lang_ptBR`,`Description_Lang_itIT`,`Description_Lang_Unk`,`Description_Lang_Mask`,`AuraDescription_Lang_enUS`,`AuraDescription_Lang_enGB`,`AuraDescription_Lang_koKR`,`AuraDescription_Lang_frFR`,`AuraDescription_Lang_deDE`,`AuraDescription_Lang_enCN`,`AuraDescription_Lang_zhCN`,`AuraDescription_Lang_enTW`,`AuraDescription_Lang_zhTW`,`AuraDescription_Lang_esES`,`AuraDescription_Lang_esMX`,`AuraDescription_Lang_ruRU`,`AuraDescription_Lang_ptPT`,`AuraDescription_Lang_ptBR`,`AuraDescription_Lang_itIT`,`AuraDescription_Lang_Unk`,`AuraDescription_Lang_Mask`,`ManaCostPct`,`StartRecoveryCategory`,`StartRecoveryTime`,`MaxTargetLevel`,`SpellClassSet`,`SpellClassMask_1`,`SpellClassMask_2`,`SpellClassMask_3`,`MaxTargets`,`DefenseType`,`PreventionType`,`StanceBarOrder`,`EffectChainAmplitude_1`,`EffectChainAmplitude_2`,`EffectChainAmplitude_3`,`MinFactionID`,`MinReputation`,`RequiredAuraVision`,`RequiredTotemCategoryID_1`,`RequiredTotemCategoryID_2`,`RequiredAreasID`,`SchoolMask`,`RuneCostID`,`SpellMissileID`,`PowerDisplayID`,`EffectBonusMultiplier_1`,`EffectBonusMultiplier_2`,`EffectBonusMultiplier_3`,`SpellDescriptionVariableID`,`SpellDifficultyID`) VALUES
+DELETE FROM `spell_dbc` WHERE `ID` IN (28732);
+INSERT INTO `spell_dbc` (`ID`, `Category`, `DispelType`, `Mechanic`, `Attributes`, `AttributesEx`, `AttributesEx2`, `AttributesEx3`, `AttributesEx4`, `AttributesEx5`, `AttributesEx6`, `AttributesEx7`, `ShapeshiftMask`,
+`unk_320_2`, `ShapeshiftExclude`, `unk_320_3`, `Targets`, `TargetCreatureType`, `RequiresSpellFocus`, `FacingCasterFlags`, `CasterAuraState`, `TargetAuraState`, `ExcludeCasterAuraState`, `ExcludeTargetAuraState`,
+`CasterAuraSpell`, `TargetAuraSpell`, `ExcludeCasterAuraSpell`, `ExcludeTargetAuraSpell`, `CastingTimeIndex`, `RecoveryTime`, `CategoryRecoveryTime`, `InterruptFlags`, `AuraInterruptFlags`, `ChannelInterruptFlags`,
+`ProcTypeMask`, `ProcChance`, `ProcCharges`, `MaxLevel`, `BaseLevel`, `SpellLevel`, `DurationIndex`, `PowerType`, `ManaCost`, `ManaCostPerLevel`, `ManaPerSecond`, `ManaPerSecondPerLevel`, `RangeIndex`, `Speed`,
+`ModalNextSpell`, `CumulativeAura`, `Totem_1`, `Totem_2`, `Reagent_1`, `Reagent_2`, `Reagent_3`, `Reagent_4`, `Reagent_5`, `Reagent_6`, `Reagent_7`, `Reagent_8`, `ReagentCount_1`, `ReagentCount_2`, `ReagentCount_3`,
+`ReagentCount_4`, `ReagentCount_5`, `ReagentCount_6`, `ReagentCount_7`, `ReagentCount_8`, `EquippedItemClass`, `EquippedItemSubclass`, `EquippedItemInvTypes`, `Effect_1`, `Effect_2`, `Effect_3`, `EffectDieSides_1`,
+`EffectDieSides_2`, `EffectDieSides_3`, `EffectRealPointsPerLevel_1`, `EffectRealPointsPerLevel_2`, `EffectRealPointsPerLevel_3`, `EffectBasePoints_1`, `EffectBasePoints_2`, `EffectBasePoints_3`, `EffectMechanic_1`,
+`EffectMechanic_2`, `EffectMechanic_3`, `ImplicitTargetA_1`, `ImplicitTargetA_2`, `ImplicitTargetA_3`, `ImplicitTargetB_1`, `ImplicitTargetB_2`, `ImplicitTargetB_3`, `EffectRadiusIndex_1`, `EffectRadiusIndex_2`,
+`EffectRadiusIndex_3`, `EffectAura_1`, `EffectAura_2`, `EffectAura_3`, `EffectAuraPeriod_1`, `EffectAuraPeriod_2`, `EffectAuraPeriod_3`, `EffectMultipleValue_1`, `EffectMultipleValue_2`, `EffectMultipleValue_3`,
+`EffectChainTargets_1`, `EffectChainTargets_2`, `EffectChainTargets_3`, `EffectItemType_1`, `EffectItemType_2`, `EffectItemType_3`, `EffectMiscValue_1`, `EffectMiscValue_2`, `EffectMiscValue_3`, `EffectMiscValueB_1`,
+`EffectMiscValueB_2`, `EffectMiscValueB_3`, `EffectTriggerSpell_1`, `EffectTriggerSpell_2`, `EffectTriggerSpell_3`, `EffectPointsPerCombo_1`, `EffectPointsPerCombo_2`, `EffectPointsPerCombo_3`, `EffectSpellClassMaskA_1`,
+`EffectSpellClassMaskA_2`, `EffectSpellClassMaskA_3`, `EffectSpellClassMaskB_1`, `EffectSpellClassMaskB_2`, `EffectSpellClassMaskB_3`, `EffectSpellClassMaskC_1`, `EffectSpellClassMaskC_2`, `EffectSpellClassMaskC_3`,
+`SpellVisualID_1`, `SpellVisualID_2`, `SpellIconID`, `ActiveIconID`, `SpellPriority`, `Name_Lang_enUS`, `Name_Lang_enGB`, `Name_Lang_koKR`, `Name_Lang_frFR`, `Name_Lang_deDE`, `Name_Lang_enCN`, `Name_Lang_zhCN`,
+`Name_Lang_enTW`, `Name_Lang_zhTW`, `Name_Lang_esES`, `Name_Lang_esMX`, `Name_Lang_ruRU`, `Name_Lang_ptPT`, `Name_Lang_ptBR`, `Name_Lang_itIT`, `Name_Lang_Unk`, `Name_Lang_Mask`, `NameSubtext_Lang_enUS`,
+`NameSubtext_Lang_enGB`, `NameSubtext_Lang_koKR`, `NameSubtext_Lang_frFR`, `NameSubtext_Lang_deDE`, `NameSubtext_Lang_enCN`, `NameSubtext_Lang_zhCN`, `NameSubtext_Lang_enTW`, `NameSubtext_Lang_zhTW`,
+`NameSubtext_Lang_esES`, `NameSubtext_Lang_esMX`, `NameSubtext_Lang_ruRU`, `NameSubtext_Lang_ptPT`, `NameSubtext_Lang_ptBR`, `NameSubtext_Lang_itIT`, `NameSubtext_Lang_Unk`, `NameSubtext_Lang_Mask`,
+`Description_Lang_enUS`, `Description_Lang_enGB`, `Description_Lang_koKR`, `Description_Lang_frFR`, `Description_Lang_deDE`, `Description_Lang_enCN`, `Description_Lang_zhCN`, `Description_Lang_enTW`,
+`Description_Lang_zhTW`, `Description_Lang_esES`, `Description_Lang_esMX`, `Description_Lang_ruRU`, `Description_Lang_ptPT`, `Description_Lang_ptBR`, `Description_Lang_itIT`, `Description_Lang_Unk`,
+`Description_Lang_Mask`, `AuraDescription_Lang_enUS`, `AuraDescription_Lang_enGB`, `AuraDescription_Lang_koKR`, `AuraDescription_Lang_frFR`, `AuraDescription_Lang_deDE`, `AuraDescription_Lang_enCN`,
+`AuraDescription_Lang_zhCN`, `AuraDescription_Lang_enTW`, `AuraDescription_Lang_zhTW`, `AuraDescription_Lang_esES`, `AuraDescription_Lang_esMX`, `AuraDescription_Lang_ruRU`, `AuraDescription_Lang_ptPT`,
+`AuraDescription_Lang_ptBR`, `AuraDescription_Lang_itIT`, `AuraDescription_Lang_Unk`, `AuraDescription_Lang_Mask`, `ManaCostPct`, `StartRecoveryCategory`, `StartRecoveryTime`, `MaxTargetLevel`, `SpellClassSet`,
+`SpellClassMask_1`, `SpellClassMask_2`, `SpellClassMask_3`, `MaxTargets`, `DefenseType`, `PreventionType`, `StanceBarOrder`, `EffectChainAmplitude_1`, `EffectChainAmplitude_2`, `EffectChainAmplitude_3`, `MinFactionID`,
+`MinReputation`, `RequiredAuraVision`, `RequiredTotemCategoryID_1`, `RequiredTotemCategoryID_2`, `RequiredAreasID`, `SchoolMask`, `RuneCostID`, `SpellMissileID`, `PowerDisplayID`, `EffectBonusMultiplier_1`,
+`EffectBonusMultiplier_2`, `EffectBonusMultiplier_3`, `SpellDescriptionVariableID`, `SpellDifficultyID`) VALUES
+
-- Anub'Arak
-- 29105 - Corpse Scarabs (5)
-(90001,0,0,0,8388864,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,101,0,0,0,0,21,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,28,0,0,1,0,0,0,0,0,4,0,0,0,0,0,18,0,0,0,0,0,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,351083,0,0,64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7626,0,1,0,0,'Summon Corpse Scarabs (5)','','','','','','','','','','','','','','','',16712190,'','','','','','','','','','','','','','','','',16712172,'','','','','','','','','','','','','','','','',16712188,'','','','','','','','','','','','','','','','',16712188,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0),
+(90001, 0, 0, 0, 8388864, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 101, 0, 0, 0, 0, 21,
+0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 28, 0, 0, 1, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 18,
+0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 351083, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7626, 0, 1, 0, 0,
+'Summon Corpse Scarabs (5)', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', 16712190, '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', 16712172,
+'', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', 16712188, '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', 16712188,
+0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0),
-- 28864 - Corpse Scarabs (10)
-(90002,0,0,0,8388864,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,101,0,0,0,0,21,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,28,0,0,1,0,0,0,0,0,9,0,0,0,0,0,18,0,0,0,0,0,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,351083,0,0,64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7626,0,1,0,0,'Summon Corpse Scarabs (10)','','','','','','','','','','','','','','','',16712190,'','','','','','','','','','','','','','','','',16712172,'','','','','','','','','','','','','','','','',16712188,'','','','','','','','','','','','','','','','',16712188,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0),
+(90002, 0, 0, 0, 8388864, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 101, 0, 0, 0, 0, 21,
+0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 28, 0, 0, 1, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 18,
+0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 351083, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7626, 0, 1, 0, 0,
+'Summon Corpse Scarabs (10)', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', 16712190, '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', 16712172,
+'', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', 16712188, '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', 16712188,
+0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0),
+
-- Trash Construct Quarter
-- 28280 - Spell Bombard Slime - Sewage Slime (10)
-(90003,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,101,0,0,0,0,26,0,0,0,0,0,6,25,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,28,0,0,1,0,0,0,0,0,0,0,0,0,0,0,17,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,351071,0,0,64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,68,0,0,"Bombard Slime","","","","","","","","",0,0,0,0,0,0,0,16712190,"","","","","","","","","",0,0,0,0,0,0,0,16712190,"Bombards the area below with a Sewage Slime.","","","","","","","","",0,0,0,0,0,0,0,16712190,"","","","","","","","","",0,0,0,0,0,0,0,16712190,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0),
+(90003, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 101, 0, 0, 0, 0, 26,
+0, 0, 0, 0, 0, 6, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 28, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17,
+0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 351071, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 68, 0, 0,
+"Bombard Slime", '', '', '', '', '', '', '', '', 0, 0, 0, 0, 0, 0, 0, 16712190, '', '', '', '', '', '', '', '', '', 0, 0, 0, 0, 0, 0, 0, 16712190,
+'Bombards the area below with a Sewage Slime.', '', '', '', '', '', '', '', '', 0, 0, 0, 0, 0, 0, 0, 16712190,
+"", '', '', '', '', '', '', '', '', 0, 0, 0, 0, 0, 0, 0, 16712190, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0),
+
-- Trash Military Quarter
-- 28383 - Portal of Shadows - Update summon to 351092 Ghost of Naxxramas
-(90004, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 101, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 1, 0.0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 28, 0, 0, 1, 0, 0, 0.0, 0.0, 0.0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.0, 0.0, 0.0, 0, 0, 0, 0, 0, 0, 351092, 0, 0, 64, 0, 0, 0, 0, 0, 0.0, 0.0, 0.0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3459, 0, 1490, 0, 0, 'Portal of Shadows', '', '', '', '', '', '', '', '', 0, 0, 0, 0, 0, 0, 0, 16712190, '', '', '', '', '', '', '', '', '', 0, 0, 0, 0, 0, 0, 0, 16712190, 'Opens a portal into the Twisting Nether that periodically summons demonic minions to aid the caster in battle for $d.', '', '', '', '', '', '', '', '', 0, 0, 0, 0, 0, 0, 0, 16712190, '', '', '', '', '', '', '', '', '', 0, 0, 0, 0, 0, 0, 0, 16712190, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1.0, 1.0, 1.0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1.0, 1.0, 1.0, 0, 0),
+(90004, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 101, 0, 0, 0, 0, 3,
+0, 0, 0, 0, 0, 1, 0.0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 28, 0, 0, 1, 0, 0, 0.0, 0.0, 0.0, 0, 0, 0, 0, 0, 0, 18,
+0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.0, 0.0, 0.0, 0, 0, 0, 0, 0, 0, 351092, 0, 0, 64, 0, 0, 0, 0, 0, 0.0, 0.0, 0.0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3459, 0, 1490, 0, 0,
+'Portal of Shadows', '', '', '', '', '', '', '', '', 0, 0, 0, 0, 0, 0, 0, 16712190, '', '', '', '', '', '', '', '', '', 0, 0, 0, 0, 0, 0, 0, 16712190,
+'Opens a portal into the Twisting Nether that periodically summons demonic minions to aid the caster in battle for $d.', '', '', '', '', '', '', '', '', 0, 0, 0, 0, 0, 0, 0, 16712190,
+'', '', '', '', '', '', '', '', '', 0, 0, 0, 0, 0, 0, 0, 16712190, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1.0, 1.0, 1.0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1.0, 1.0, 1.0, 0, 0),
+
-- 351024 - Living Monstrosity - Summon Lightning Totem with entry 351091
-(90005, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 101, 0, 0, 29, 29, 3, 0, 0, 0, 0, 0, 1, 0.0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 28, 0, 0, 1, 0, 0, 0.0, 0.0, 0.0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.0, 0.0, 0.0, 0, 0, 0, 0, 0, 0, 351091, 0, 0, 61, 0, 0, 0, 0, 0, 0.0, 0.0, 0.0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 36, 0, 62, 0, 0, 'Lightning Totem', '', '', '', '', '', '', '', '', 0, 0, 0, 0, 0, 0, 0, 16712190, '', '', '', '', '', '', '', '', '', 0, 0, 0, 0, 0, 0, 0, 16712190, 'Summons an Lightning Totem that lasts $d and periodically damages nearby enemies.', '', '', '', '', '', '', '', '', 0, 0, 0, 0, 0, 0, 0, 16712190, '', '', '', '', '', '', '', '', '', 0, 0, 0, 0, 0, 0, 0, 16712190, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1.0, 1.0, 1.0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0.0, 0.0, 0.0, 0, 0),
+(90005, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 101, 0, 0, 29, 29, 3,
+0, 0, 0, 0, 0, 1, 0.0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 28, 0, 0, 1, 0, 0, 0.0, 0.0, 0.0, 0, 0, 0, 0, 0, 0, 32,
+0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.0, 0.0, 0.0, 0, 0, 0, 0, 0, 0, 351091, 0, 0, 61, 0, 0, 0, 0, 0, 0.0, 0.0, 0.0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 36, 0, 62, 0, 0,
+'Lightning Totem', '', '', '', '', '', '', '', '', 0, 0, 0, 0, 0, 0, 0, 16712190, '', '', '', '', '', '', '', '', '', 0, 0, 0, 0, 0, 0, 0, 16712190,
+'Summons an Lightning Totem that lasts $d and periodically damages nearby enemies.', '', '', '', '', '', '', '', '', 0, 0, 0, 0, 0, 0, 0, 16712190,
+'', '', '', '', '', '', '', '', '', 0, 0, 0, 0, 0, 0, 0, 16712190, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1.0, 1.0, 1.0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0.0, 0.0, 0.0, 0, 0),
+
-- Loatheb
-- 29234 - Summon Spore - Spore entry to 351066
-(90006, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 101, 0, 0, 0, 0, 23, 0, 0, 0, 0, 0, 14, 0.0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 28, 0, 0, 1, 0, 0, 0.0, 0.0, 0.0, 0, 0, 0, 0, 0, 0, 73, 0, 0, 0, 0, 0, 23, 0, 0, 0, 0, 0, 0, 0, 0, 0.0, 0.0, 0.0, 0, 0, 0, 0, 0, 0, 351066, 0, 0, 1362, 0, 0, 0, 0, 0, 0.0, 0.0, 0.0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 'Summon Spore', '', '', '', '', '', '', '', '', 0, 0, 0, 0, 0, 0, 0, 16712190, '', '', '', '', '', '', '', '', '', 0, 0, 0, 0, 0, 0, 0, 16712188, 'Summons a Spore that lasts for $d.', '', '', '', '', '', '', '', '', 0, 0, 0, 0, 0, 0, 0, 16712190, '', '', '', '', '', '', '', '', '', 0, 0, 0, 0, 0, 0, 0, 16712188, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1.0, 1.0, 1.0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0.0, 0.0, 0.0, 0, 0),
+(90006, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 101, 0, 0, 0, 0, 23,
+0, 0, 0, 0, 0, 14, 0.0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 28, 0, 0, 1, 0, 0, 0.0, 0.0, 0.0, 0, 0, 0, 0, 0, 0, 73,
+0, 0, 0, 0, 0, 23, 0, 0, 0, 0, 0, 0, 0, 0, 0.0, 0.0, 0.0, 0, 0, 0, 0, 0, 0, 351066, 0, 0, 1362, 0, 0, 0, 0, 0, 0.0, 0.0, 0.0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0,
+'Summon Spore', '', '', '', '', '', '', '', '', 0, 0, 0, 0, 0, 0, 0, 16712190, '', '', '', '', '', '', '', '', '', 0, 0, 0, 0, 0, 0, 0, 16712188,
+'Summons a Spore that lasts for $d.', '', '', '', '', '', '', '', '', 0, 0, 0, 0, 0, 0, 0, 16712190, '', '', '', '', '', '', '', '', '', 0, 0, 0, 0, 0, 0, 0, 16712188,
+0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1.0, 1.0, 1.0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0.0, 0.0, 0.0, 0, 0),
+
-- Maexxna
-- 90007: Summon Web Wrap. custom summon entry: 16486 -> 351079
-(90007, 0, 0, 0, 256, 268435456, 0, 268435456, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 101, 0, 0, 0, 0, 265, 0, 0, 0, 0, 0, 1, 0.0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 28, 6, 0, 1, 0, 0, 0.0, 0.0, 0.0, 0, 0, 0, 0, 0, 0, 18, 1, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 0, 0.0, 0.0, 0.0, 0, 0, 0, 0, 0, 0, 351079, 17286, 0, 64, 0, 0, 0, 0, 0, 0.0, 0.0, 0.0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 'Summon Web Wrap', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1.0, 1.0, 0.0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0.0, 0.0, 0.0, 0, 0);
+(90007, 0, 0, 0, 256, 268435456, 0, 268435456, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 101, 0, 0, 0, 0, 265,
+0, 0, 0, 0, 0, 1, 0.0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 28, 6, 0, 1, 0, 0, 0.0, 0.0, 0.0, 0, 0, 0, 0, 0, 0, 18, 1,
+0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 0, 0.0, 0.0, 0.0, 0, 0, 0, 0, 0, 0, 351079, 17286, 0, 64, 0, 0, 0, 0, 0, 0.0, 0.0, 0.0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+'Summon Web Wrap', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+NULL, NULL, NULL, NULL, NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL,
+NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1.0, 1.0, 0.0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0.0, 0.0, 0.0, 0, 0),
+
+-- Faerlina
+-- this makes Widow's Embrace a target spell, because as an aoe spell it did not hit Faerlina
+(28732, 0, 0, 0, 612368400, 131208, 4, 0, 0, 384, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 15, 0, 0, 0, 101, 0, 0, 62, 62, 9,
+0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 3, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0,
+0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7618, 0, 1499, 0, 0,
+'Widow\'s Embrace', '', '', '', '', '', '', '', '', 0, 0, 0, 0, 0, 0, 0, 16712190, '', '', '', '', '', '', '', '', '', 0, 0, 0, 0, 0, 0, 0, 16712172,
+'Prevents and removes frenzy. Silences nature spells for $d. Reduces casting speed by $s1%.', '', '', '', '', '', '', '', '', 0, 0, 0, 0, 0, 0, 0, 16712190,
+'Prevents and removes frenzy. Silences nature spells for $d. Reduces casting speed by $s1%.', '', '', '', '', '', '', '', '', 0, 0, 0, 0, 0, 0, 0, 16712190,
+0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 0);
+
-- Update target of spell 90003, summon Sewage Slime
DELETE FROM `spell_target_position` WHERE (`ID` = 90003);
diff --git a/sql/world/base/zz_cleanup.sql b/sql/world/base/zz_cleanup.sql
index 7c4ec44..9b9ee82 100644
--- a/sql/world/base/zz_cleanup.sql
+++ b/sql/world/base/zz_cleanup.sql
@@ -11,10 +11,6 @@ UPDATE `creature_template` SET `unit_class` = 8 WHERE `entry` IN (29273);
/* Delete unused Creature Addon data */
DELETE FROM `creature_addon` WHERE `guid` IN (133917, 133918, 133919, 133920, 133928);
-/* Remove script from database to avoid worldserver error. The code for this script has been commented out. Need to figure out why. */
-UPDATE `creature_template` SET `Scriptname` = '' WHERE `entry` = 351042;
-
-
-- undo previous method of Lights Hope Chapel phasing
UPDATE `creature` SET `phaseMask` = 1 WHERE `id1` IN
(11102, 16112, 16113, 16114, 16115, 16116, 16131, 16132, 16133, 16134, 16135, 16212, 16225, 16228, 16229, 16256, 16283, 16284, 16376, 16378, 17069, 17072);
diff --git a/src/IndividualProgression.h b/src/IndividualProgression.h
index f97e94a..3bda44b 100644
--- a/src/IndividualProgression.h
+++ b/src/IndividualProgression.h
@@ -106,7 +106,6 @@ enum ProgressionZones
enum ProgressionAreas
{
- AREA_AZSHARA = 16,
AREA_THE_DARK_PORTAL = 72,
AREA_DREADMAUL_ROCK = 249,
AREA_RUINS_OF_THAURISSAN = 250,
diff --git a/src/IndividualProgression_loader.cpp b/src/IndividualProgression_loader.cpp
index 58ddc79..f7dbb8b 100644
--- a/src/IndividualProgression_loader.cpp
+++ b/src/IndividualProgression_loader.cpp
@@ -13,7 +13,7 @@ void AddSC_quest_the_masquerade_60_2();
void AddSC_boss_lord_kazzak_60_2();
void AddSC_boss_chromaggus_60_2_A();
void AddSC_boss_drakkisath_50_59_B();
-void AddSC_instance_naxxramas_combined();
+void AddSC_instance_naxxramas();
void AddSC_boss_anubrekhan_40();
void AddSC_boss_faerlina_40();
void AddSC_boss_four_horsemen_40();
@@ -33,6 +33,7 @@ void AddSC_npc_omarion_40();
void AddSC_custom_spells_40();
void AddSC_custom_creatures_40();
void AddSC_custom_gameobjects_40();
+void AddSC_custom_scripts_40();
void AddSC_Ipp_Wotlk_Modded_Scripts();
void AddSC_aq_scripts();
void AddSC_cot_scripts();
@@ -58,7 +59,7 @@ void Addmod_individual_progressionScripts()
AddSC_boss_lord_kazzak_60_2();
AddSC_boss_chromaggus_60_2_A();
AddSC_boss_drakkisath_50_59_B();
- AddSC_instance_naxxramas_combined();
+ AddSC_instance_naxxramas();
AddSC_boss_anubrekhan_40();
AddSC_boss_faerlina_40();
AddSC_boss_four_horsemen_40();
@@ -78,6 +79,7 @@ void Addmod_individual_progressionScripts()
AddSC_custom_spells_40();
AddSC_custom_creatures_40();
AddSC_custom_gameobjects_40();
+ AddSC_custom_scripts_40();
AddSC_Ipp_Wotlk_Modded_Scripts();
AddSC_aq_scripts();
AddSC_cot_scripts();
diff --git a/src/naxx40Scripts/boss_anubrekhan_40.cpp b/src/naxx40Scripts/boss_anubrekhan_40.cpp
index cd3f1c7..ab87ede 100644
--- a/src/naxx40Scripts/boss_anubrekhan_40.cpp
+++ b/src/naxx40Scripts/boss_anubrekhan_40.cpp
@@ -15,7 +15,7 @@
* with this program. If not, see .
*/
-#include "ScriptMgr.h"
+#include "CreatureScript.h"
#include "ScriptedCreature.h"
#include "naxxramas.h"
@@ -35,30 +35,19 @@ enum GuardSays
enum Spells
{
- SPELL_IMPALE = 28783,
- SPELL_LOCUST_SWARM = 28785,
- SPELL_LOCUST_SWARM_TRIGGER = 28786, // periodic effect
+ SPELL_IMPALE_10 = 28783,
+ SPELL_IMPALE_25 = 56090,
+ SPELL_LOCUST_SWARM_10 = 28785,
+ SPELL_LOCUST_SWARM_25 = 54021,
+ // SPELL_SUMMON_CORPSE_SCRABS_5 = 29105,
+ // SPELL_SUMMON_CORPSE_SCRABS_10 = 28864,
SPELL_BERSERK = 26662
};
-enum SpellValues : int32
-{
- IMPALE_BP1 = 3937,
- IMPALE_BP2 = 299
-};
-
-enum Events
-{
- EVENT_IMPALE = 1,
- EVENT_LOCUST_SWARM = 2,
- EVENT_BERSERK = 3,
- EVENT_SPAWN_GUARD = 4
-};
-
enum Misc
{
- NPC_CORPSE_SCARAB = 351083,
- NPC_CRYPT_GUARD = 351082,
+ // NPC_CORPSE_SCARAB = 16698,
+ // NPC_CRYPT_GUARD = 16573,
ACHIEV_TIMED_START_EVENT = 9891
};
@@ -75,53 +64,36 @@ public:
struct boss_anubrekhan_40AI : public BossAI
{
- explicit boss_anubrekhan_40AI(Creature* c) : BossAI(c, BOSS_ANUB), summons(me)
+ boss_anubrekhan_40AI(Creature* c) : BossAI(c, BOSS_ANUB)
{
- pInstance = c->GetInstanceScript();
sayGreet = false;
}
- InstanceScript* pInstance;
- EventMap events;
- SummonList summons;
- bool sayGreet;
-
void SummonCryptGuards()
{
- me->SummonCreature(NPC_CRYPT_GUARD, 3299.732f, -3502.489f, 287.077f, 2.378f, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 60000);
- me->SummonCreature(NPC_CRYPT_GUARD, 3299.086f, -3450.929f, 287.077f, 3.999f, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 60000);
+ // if (Is25ManRaid())
+ {
+ me->SummonCreature(NPC_CRYPT_GUARD, 3299.732f, -3502.489f, 287.077f, 2.378f, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 60000);
+ me->SummonCreature(NPC_CRYPT_GUARD, 3299.086f, -3450.929f, 287.077f, 3.999f, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 60000);
+ }
}
void Reset() override
{
BossAI::Reset();
- events.Reset();
- summons.DespawnAll();
SummonCryptGuards();
- if (pInstance)
- {
- if (GameObject* go = me->GetMap()->GetGameObject(pInstance->GetGuidData(DATA_ANUB_GATE)))
- {
- go->SetGoState(GO_STATE_ACTIVE);
- }
- }
+ me->m_Events.KillAllEvents(false);
}
void JustSummoned(Creature* cr) override
{
- if (me->IsInCombat())
- {
- cr->SetInCombatWithZone(); // This line will set the creature in combat with the zone.
+ if (me->IsInCombat())
+ {
+ cr->SetInCombatWithZone();
if (cr->GetEntry() == NPC_CRYPT_GUARD)
- {
- cr->AI()->Talk(EMOTE_SPAWN, me);
- }
- else if (cr->GetEntry() == NPC_CORPSE_SCARAB) // Explicitly check for Corpse Scarabs here.
- {
- cr->SetInCombatWithZone(); // Set the Corpse Scarabs in combat with the zone too.
- }
- }
- summons.Summon(cr);
+ cr->AI()->Talk(EMOTE_SPAWN, me);
+ }
+ summons.Summon(cr);
}
void SummonedCreatureDies(Creature* cr, Unit*) override
@@ -133,62 +105,65 @@ public:
}
}
- void SummonedCreatureDespawn(Creature* cr) override
- {
- summons.Despawn(cr);
- }
-
- void JustDied(Unit* killer) override
+ /* void JustDied(Unit* killer) override
{
BossAI::JustDied(killer);
- summons.DespawnAll();
- if (pInstance)
- {
- pInstance->DoStartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_TIMED_START_EVENT);
- }
- }
+ instance->DoStartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_TIMED_START_EVENT);
+ } */
void KilledUnit(Unit* victim) override
{
- if (victim->GetTypeId() != TYPEID_PLAYER)
+ if (!victim->IsPlayer())
return;
Talk(SAY_SLAY);
victim->CastSpell(victim, SPELL_SUMMON_CORPSE_SCRABS_5, true, nullptr, nullptr, me->GetGUID());
- if (pInstance)
- {
- pInstance->SetData(DATA_IMMORTAL_FAIL, 0);
- }
+ instance->StorePersistentData(PERSISTENT_DATA_IMMORTAL_FAIL, 1);
}
void JustEngagedWith(Unit* who) override
{
BossAI::JustEngagedWith(who);
- me->CallForHelp(60.0f);
+ me->CallForHelp(30.0f);
Talk(SAY_AGGRO);
- if (pInstance)
- {
- if (GameObject* go = me->GetMap()->GetGameObject(pInstance->GetGuidData(DATA_ANUB_GATE)))
- {
- go->SetGoState(GO_STATE_READY);
- }
- }
- events.ScheduleEvent(EVENT_IMPALE, 15000);
- events.ScheduleEvent(EVENT_LOCUST_SWARM, urand(70000, 120000));
- events.ScheduleEvent(EVENT_BERSERK, 600000);
+
if (!summons.HasEntry(NPC_CRYPT_GUARD))
- {
SummonCryptGuards();
- }
if (!Is25ManRaid())
{
- events.ScheduleEvent(EVENT_SPAWN_GUARD, urand(15000, 20000));
+ me->m_Events.AddEventAtOffset([&]
+ {
+ me->SummonCreature(NPC_CRYPT_GUARD, 3331.217f, -3476.607f, 287.074f, 3.269f, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 60000);
+ }, Milliseconds(urand(15000, 20000)));
}
+
+ ScheduleTimedEvent(15s, [&] {
+ int32 bp1 = IMPALE_BP1;
+ int32 bp2 = IMPALE_BP2;
+ if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 0.0f, true, true))
+ me->CastCustomSpell(target, SPELL_IMPALE_10, 0, &bp1, &bp2, false, nullptr, nullptr, ObjectGuid::Empty);
+ }, 20s);
+
+ ScheduleTimedEvent(70s, 2min, [&] {
+ Talk(EMOTE_LOCUST);
+ DoCastSelf(RAID_MODE(SPELL_LOCUST_SWARM_10, SPELL_LOCUST_SWARM_25, SPELL_LOCUST_SWARM_10, SPELL_LOCUST_SWARM_25));
+
+ me->m_Events.AddEventAtOffset([&]
+ {
+ me->SummonCreature(NPC_CRYPT_GUARD, 3331.217f, -3476.607f, 287.074f, 3.269f, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 60000);
+ }, 3s);
+
+ }, 90s);
+
+ me->m_Events.AddEventAtOffset([&]
+ {
+ DoCastSelf(SPELL_BERSERK, true);
+ }, 10min);
}
void MoveInLineOfSight(Unit* who) override
{
- if (!sayGreet && who->GetTypeId() == TYPEID_PLAYER)
+ if (!sayGreet && who->IsPlayer())
{
Talk(SAY_GREET);
sayGreet = true;
@@ -196,58 +171,8 @@ public:
ScriptedAI::MoveInLineOfSight(who);
}
- void UpdateAI(uint32 diff) override
- {
- if (!me->IsInCombat() && sayGreet)
- {
- for (SummonList::iterator itr = summons.begin(); itr != summons.end(); ++itr)
- {
- if (pInstance)
- {
- if (Creature* cr = pInstance->instance->GetCreature(*itr))
- {
- if (cr->IsInCombat())
- DoZoneInCombat();
- }
- }
- }
- }
-
- if (!UpdateVictim())
- return;
-
- events.Update(diff);
- if (me->HasUnitState(UNIT_STATE_CASTING))
- return;
-
- switch (events.ExecuteEvent())
- {
- case EVENT_IMPALE:
- if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0))
- {
- int32 bp1 = IMPALE_BP1;
- int32 bp2 = IMPALE_BP2;
- me->CastCustomSpell(target, SPELL_IMPALE, 0, &bp1, &bp2, false, nullptr, nullptr, ObjectGuid::Empty);
- }
- events.RepeatEvent(20000);
- break;
- case EVENT_LOCUST_SWARM:
- {
- Talk(EMOTE_LOCUST);
- me->CastSpell(me, SPELL_LOCUST_SWARM, false);
- events.ScheduleEvent(EVENT_SPAWN_GUARD, 3000);
- events.RepeatEvent(90000);
- break;
- }
- case EVENT_SPAWN_GUARD:
- me->SummonCreature(NPC_CRYPT_GUARD, 3331.217f, -3476.607f, 287.074f, 3.269f, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 60000);
- break;
- case EVENT_BERSERK:
- me->CastSpell(me, SPELL_BERSERK, true);
- break;
- }
- DoMeleeAttackIfReady();
- }
+ private:
+ bool sayGreet;
};
};
diff --git a/src/naxx40Scripts/boss_faerlina_40.cpp b/src/naxx40Scripts/boss_faerlina_40.cpp
index ad433ac..a911ff7 100644
--- a/src/naxx40Scripts/boss_faerlina_40.cpp
+++ b/src/naxx40Scripts/boss_faerlina_40.cpp
@@ -15,7 +15,7 @@
* with this program. If not, see .
*/
-#include "ScriptMgr.h"
+#include "CreatureScript.h"
#include "ScriptedCreature.h"
#include "SpellInfo.h"
#include "naxxramas.h"
@@ -36,30 +36,19 @@ enum Spells
SPELL_POISON_BOLT_VOLLEY = 28796,
SPELL_RAIN_OF_FIRE = 28794,
SPELL_FRENZY = 28798,
- SPELL_WIDOWS_EMBRACE = 28732
+ SPELL_WIDOWS_EMBRACE = 28732,
+ SPELL_MINION_WIDOWS_EMBRACE = 54097
};
-enum SpellValues : int32
+enum Groups
{
- POISON_BOLT_VOLLEY_BP0 = 1224,
- POISON_BOLT_VOLLEY_BP1 = 416,
- RAIN_OF_FIRE_BP0 = 1849,
- FRENZY_BP0 = 149,
- FRENZY_BP1 = 74,
- FRENZY_BP2 = 49
-};
-
-enum Events
-{
- EVENT_POISON_BOLT = 1,
- EVENT_RAIN_OF_FIRE = 2,
- EVENT_FRENZY = 3
+ GROUP_FRENZY = 1
};
enum Misc
{
- NPC_NAXXRAMAS_WORSHIPPER = 351081,
- NPC_NAXXRAMAS_FOLLOWER = 351080
+ // NPC_NAXXRAMAS_WORSHIPPER = 16506,
+ // NPC_NAXXRAMAS_FOLLOWER = 16505
};
class boss_faerlina_40 : public CreatureScript
@@ -74,16 +63,7 @@ public:
struct boss_faerlina_40AI : public BossAI
{
- boss_faerlina_40AI(Creature* c) : BossAI(c, BOSS_FAERLINA), summons(me)
- {
- pInstance = me->GetInstanceScript();
- sayGreet = false;
- }
-
- InstanceScript* pInstance;
- EventMap events;
- SummonList summons;
- bool sayGreet;
+ boss_faerlina_40AI(Creature* c) : BossAI(c, BOSS_FAERLINA), _introDone(false) { }
void SummonHelpers()
{
@@ -91,28 +71,18 @@ public:
me->SummonCreature(NPC_NAXXRAMAS_WORSHIPPER, 3344.3f, -3618.31f, 261.08f, 4.69494f);
me->SummonCreature(NPC_NAXXRAMAS_WORSHIPPER, 3356.71f, -3620.05f, 261.08f, 4.57276f);
me->SummonCreature(NPC_NAXXRAMAS_WORSHIPPER, 3350.26f, -3619.11f, 261.08f, 4.67748f);
- me->SummonCreature(NPC_NAXXRAMAS_FOLLOWER, 3347.49f, -3617.59f, 261.0f, 4.49f);
- me->SummonCreature(NPC_NAXXRAMAS_FOLLOWER, 3359.64f, -3619.16f, 261.0f, 4.56f);
- }
-
- void JustSummoned(Creature* cr) override
- {
- summons.Summon(cr);
+ // if (Is25ManRaid())
+ {
+ me->SummonCreature(NPC_NAXXRAMAS_FOLLOWER, 3347.49f, -3617.59f, 261.0f, 4.49f);
+ me->SummonCreature(NPC_NAXXRAMAS_FOLLOWER, 3359.64f, -3619.16f, 261.0f, 4.56f);
+ }
}
void Reset() override
{
BossAI::Reset();
- events.Reset();
summons.DespawnAll();
SummonHelpers();
- if (pInstance)
- {
- if (GameObject* go = me->GetMap()->GetGameObject(pInstance->GetGuidData(DATA_FAERLINA_WEB)))
- {
- go->SetGoState(GO_STATE_ACTIVE);
- }
- }
}
void JustEngagedWith(Unit* who) override
@@ -121,122 +91,54 @@ public:
me->CallForHelp(VISIBLE_RANGE);
summons.DoZoneInCombat();
Talk(SAY_AGGRO);
- events.ScheduleEvent(EVENT_POISON_BOLT, urand(7000, 12000));
- events.ScheduleEvent(EVENT_RAIN_OF_FIRE, urand(8000, 12000));
- events.ScheduleEvent(EVENT_FRENZY, urand(60000, 80000), 1);
- events.SetPhase(1);
- if (pInstance)
- {
- if (GameObject* go = me->GetMap()->GetGameObject(pInstance->GetGuidData(DATA_FAERLINA_WEB)))
+
+ ScheduleTimedEvent(7s, 15s, [&]{
+ if (!me->HasAura(SPELL_WIDOWS_EMBRACE))
+ DoCastVictim(SPELL_POISON_BOLT_VOLLEY);
+ }, 7s, 15s);
+
+ ScheduleTimedEvent(8s, 18s, [&] {
+ DoCastRandomTarget(SPELL_RAIN_OF_FIRE);
+ }, 8s, 18s);
+
+ scheduler.Schedule(60s, 80s, GROUP_FRENZY, [this](TaskContext context) {
+ if (!me->HasAura(SPELL_WIDOWS_EMBRACE))
{
- go->SetGoState(GO_STATE_READY);
+ Talk(SAY_FRENZY);
+ Talk(EMOTE_FRENZY);
+ DoCastSelf(SPELL_FRENZY, true);
+ context.Repeat(1min);
}
- }
+ else
+ context.Repeat(30s);
+ });
}
void MoveInLineOfSight(Unit* who) override
{
- if (!sayGreet && who->GetTypeId() == TYPEID_PLAYER)
+ if (!_introDone && who->IsPlayer())
{
Talk(SAY_GREET);
- sayGreet = true;
+ _introDone = true;
}
ScriptedAI::MoveInLineOfSight(who);
}
void KilledUnit(Unit* who) override
{
- if (who->GetTypeId() != TYPEID_PLAYER)
+ if (!who->IsPlayer())
return;
if (!urand(0, 3))
- {
Talk(SAY_SLAY);
- }
- if (pInstance)
- {
- pInstance->SetData(DATA_IMMORTAL_FAIL, 0);
- }
+
+ instance->StorePersistentData(PERSISTENT_DATA_IMMORTAL_FAIL, 1);
}
void JustDied(Unit* killer) override
{
BossAI::JustDied(killer);
Talk(SAY_DEATH);
- if (pInstance)
- {
- if (GameObject* go = me->GetMap()->GetGameObject(pInstance->GetGuidData(DATA_FAERLINA_WEB)))
- {
- go->SetGoState(GO_STATE_ACTIVE);
- }
- }
- }
-
- void UpdateAI(uint32 diff) override
- {
- if (!me->IsInCombat() && sayGreet)
- {
- for (SummonList::iterator itr = summons.begin(); itr != summons.end(); ++itr)
- {
- if (pInstance)
- {
- if (Creature* cr = pInstance->instance->GetCreature(*itr))
- {
- if (cr->IsInCombat())
- DoZoneInCombat();
- }
- }
- }
- }
-
- if (!UpdateVictim())
- return;
-
- events.Update(diff);
- if (me->HasUnitState(UNIT_STATE_CASTING))
- return;
-
- switch (events.ExecuteEvent())
- {
- case EVENT_POISON_BOLT:
- if (!me->HasAura(SPELL_WIDOWS_EMBRACE))
- {
- CustomSpellValues values;
- int32 bp0 = POISON_BOLT_VOLLEY_BP0;
- int32 bp1 = POISON_BOLT_VOLLEY_BP1;
- values.AddSpellMod(SPELLVALUE_MAX_TARGETS, 10);
- values.AddSpellMod(SPELLVALUE_BASE_POINT0, bp0);
- values.AddSpellMod(SPELLVALUE_BASE_POINT1, bp1);
- me->CastCustomSpell(SPELL_POISON_BOLT_VOLLEY, values, me, TRIGGERED_NONE, nullptr, nullptr, ObjectGuid::Empty);
- }
- events.RepeatEvent(urand(7000, 12000));
- break;
- case EVENT_RAIN_OF_FIRE:
- if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0))
- {
- int32 bp0 = RAIN_OF_FIRE_BP0;
- me->CastCustomSpell(target, SPELL_RAIN_OF_FIRE, &bp0, 0, 0, false, nullptr, nullptr, ObjectGuid::Empty);
- }
- events.RepeatEvent(urand(8000, 12000));
- break;
- case EVENT_FRENZY:
- if (!me->HasAura(SPELL_FRENZY))
- {
- Talk(SAY_FRENZY);
- Talk(EMOTE_FRENZY);
- int32 bp0 = FRENZY_BP0;
- int32 bp1 = FRENZY_BP1;
- int32 bp2 = FRENZY_BP2;
- me->CastCustomSpell(me, SPELL_FRENZY, &bp0, &bp1, &bp2, true, nullptr, nullptr, ObjectGuid::Empty);
- events.RepeatEvent(60000);
- }
- else
- {
- events.RepeatEvent(30000);
- }
- break;
- }
- DoMeleeAttackIfReady();
}
void SpellHit(Unit* caster, SpellInfo const* spell) override
@@ -246,17 +148,18 @@ public:
Talk(EMOTE_WIDOWS_EMBRACE); // %s is affected by Widow's Embrace!
if (me->HasAura(SPELL_FRENZY))
{
- events.RescheduleEvent(EVENT_FRENZY, 60000); // You must sacrifice the worshiper AFTER she enrages if you want to stop her for the full 60 seconds.
+ scheduler.RescheduleGroup(GROUP_FRENZY, 1min); // You must sacrifice the worshiper AFTER she enrages if you want to stop her for the full 60 seconds.
me->RemoveAurasDueToSpell(SPELL_FRENZY);
- pInstance->SetData(DATA_FRENZY_REMOVED, 0); // achievement
+ instance->SetData(DATA_FRENZY_REMOVED, 0); // achievement
}
- else
- {
- events.RescheduleEvent(EVENT_FRENZY, 30000); // If you sacrifice the Worshiper before the enrage, it will merely delay the enrage for 30 seconds.
- }
- Unit::Kill(caster, caster);
+ else
+ scheduler.RescheduleGroup(GROUP_FRENZY, 30s); // If you sacrifice the Worshiper before the enrage, it will merely delay the enrage for 30 seconds.
+ caster->KillSelf();
}
}
+
+ private:
+ bool _introDone;
};
};
diff --git a/src/naxx40Scripts/boss_four_horsemen_40.cpp b/src/naxx40Scripts/boss_four_horsemen_40.cpp
index 08c78b1..ed5e9b1 100644
--- a/src/naxx40Scripts/boss_four_horsemen_40.cpp
+++ b/src/naxx40Scripts/boss_four_horsemen_40.cpp
@@ -25,8 +25,6 @@
enum Spells
{
SPELL_BERSERK = 26662,
- SPELL_SHIELDWALL = 29061, // Shield Wall - All 4 horsemen will shield wall at 50% hp and 20% hp for 20 seconds
- SPELL_SUMMON_PLAYER = 25104,
// Marks
SPELL_MARK_OF_KORTHAZZ = 28832,
SPELL_MARK_OF_BLAUMEUX = 28833,
@@ -43,6 +41,10 @@ enum Spells
SPELL_ZELIEK_HOLY_BOLT = 57376,
// Mograine
SPELL_RIVENDARE_UNHOLY_SHADOW = 28882,
+
+ // NX40
+ SPELL_SHIELDWALL = 29061, // Shield Wall - All 4 horsemen will shield wall at 50% hp and 20% hp for 20 seconds
+ SPELL_SUMMON_PLAYER = 25104,
};
enum Events
@@ -106,7 +108,6 @@ public:
{
explicit boss_four_horsemen_40AI(Creature* c) : BossAI(c, BOSS_HORSEMAN)
{
- pInstance = me->GetInstanceScript();
switch (me->GetEntry())
{
case NPC_SIR_ZELIEK_40:
@@ -125,7 +126,6 @@ public:
}
EventMap events;
- InstanceScript* pInstance;
uint8 horsemanId;
bool doneFirstShieldWall;
@@ -143,59 +143,44 @@ public:
{
BossAI::Reset();
me->SetPosition(me->GetHomePosition());
-
- me->SetReactState(REACT_AGGRESSIVE);
- doneFirstShieldWall = false;
events.Reset();
events.RescheduleEvent(EVENT_MARK_CAST, 20000);
events.RescheduleEvent(EVENT_BERSERK, 600000);
summons.DespawnAll(); // despawn spirits
if ((me->GetEntry() != NPC_LADY_BLAUMEUX_40 && me->GetEntry() != NPC_SIR_ZELIEK_40))
{
- events.RescheduleEvent(EVENT_PRIMARY_SPELL, 10000 + rand() % 5000);
+ events.RescheduleEvent(EVENT_PRIMARY_SPELL, 10s, 15s);
}
else
{
- events.RescheduleEvent(EVENT_SECONDARY_SPELL, 15000);
- }
- if (pInstance)
- {
- if (GameObject* go = me->GetMap()->GetGameObject(pInstance->GetGuidData(DATA_HORSEMEN_GATE)))
- {
- if (pInstance->GetBossState(BOSS_GOTHIK) == DONE)
- {
- go->SetGoState(GO_STATE_ACTIVE);
- }
- }
+ events.RescheduleEvent(EVENT_SECONDARY_SPELL, 15s);
}
+ doneFirstShieldWall = false;
}
void KilledUnit(Unit* who) override
{
- if (who->GetTypeId() != TYPEID_PLAYER)
+ if (!who->IsPlayer())
return;
Talk(SAY_SLAY);
- if (pInstance)
- {
- pInstance->SetData(DATA_IMMORTAL_FAIL, 0);
- }
+ instance->StorePersistentData(PERSISTENT_DATA_IMMORTAL_FAIL, 1);
}
void SpellHitTarget(Unit* target, SpellInfo const* spellInfo) override
{
if (spellInfo->Id == TABLE_SPELL_MARK[horsemanId])
- {
DoModifyThreatByPercent(target, -50);
- }
}
void JustDied(Unit* killer) override
{
BossAI::JustDied(killer);
- if (pInstance)
+ Talk(SAY_DEATH);
+
+ if (instance->GetBossState(BOSS_HORSEMAN) == DONE)
{
- if (pInstance->GetBossState(BOSS_HORSEMAN) == DONE)
+ if (!me->GetMap()->GetPlayers().IsEmpty())
{
if (Creature* spirit = GetClosestCreatureWithEntry(me, NPC_SPIRIT_ZELIEK, 200.0f))
spirit->DespawnOrUnsummon();
@@ -205,28 +190,15 @@ public:
spirit->DespawnOrUnsummon();
if (Creature* spirit = GetClosestCreatureWithEntry(me, NPC_SPIRIT_KORTHAZZ, 200.0f))
spirit->DespawnOrUnsummon();
- if (!me->GetMap()->GetPlayers().IsEmpty())
- {
- if (Player* player = me->GetMap()->GetPlayers().getFirst()->GetSource())
- {
- if (GameObject* chest = player->SummonGameObject(GO_HORSEMEN_CHEST_40, 2514.8f, -2944.9f, 245.55f, 5.51f, 0, 0, 0, 0, 0))
- {
- chest->SetLootRecipient(me);
- }
- }
- }
- if (GameObject* go = me->GetMap()->GetGameObject(pInstance->GetGuidData(DATA_HORSEMEN_GATE)))
- {
- go->SetGoState(GO_STATE_ACTIVE);
- }
- }
- else
- {
- // Prevent spawning if last horseman killed
- DoCastSelf(TABLE_SPELL_SUMMON_SPIRIT[horsemanId], true);
+ if (Player* player = me->GetMap()->GetPlayers().getFirst()->GetSource())
+ if (GameObject* chest = player->SummonGameObject(GO_HORSEMEN_CHEST_40, 2514.8f, -2944.9f, 245.55f, 5.51f, 0, 0, 0, 0, 0))
+ chest->SetLootRecipient(me);
}
}
- Talk(SAY_DEATH);
+ else
+ {
+ DoCastSelf(TABLE_SPELL_SUMMON_SPIRIT[horsemanId], true);
+ }
}
void JustSummoned(Creature* summon) override
@@ -240,16 +212,7 @@ public:
{
BossAI::JustEngagedWith(who);
Talk(SAY_AGGRO);
- me->SetReactState(REACT_AGGRESSIVE);
- me->SetInCombatWithZone();
- if (pInstance)
events.ScheduleEvent(EVENT_HEALTH_CHECK, 1s);
- {
- if (GameObject* go = me->GetMap()->GetGameObject(pInstance->GetGuidData(DATA_HORSEMEN_GATE)))
- {
- go->SetGoState(GO_STATE_READY);
- }
- }
}
void UpdateAI(uint32 diff) override
@@ -261,10 +224,8 @@ public:
return;
if (Unit* victim = me->GetVictim())
- {
if (!me->IsWithinDistInMap(victim, VISIBILITY_DISTANCE_NORMAL))
me->CastSpell(victim, SPELL_SUMMON_PLAYER, true);
- }
events.Update(diff);
if (me->HasUnitState(UNIT_STATE_CASTING))
@@ -274,7 +235,7 @@ public:
{
case EVENT_MARK_CAST:
me->CastSpell(me, TABLE_SPELL_MARK[horsemanId], false);
- events.RepeatEvent(12000);
+ events.Repeat(12s);
return;
case EVENT_BERSERK:
Talk(SAY_SPECIAL);
@@ -302,7 +263,7 @@ public:
int32 bp0 = 12824; // 14.5k to 13.5k
me->CastCustomSpell(me->GetVictim(), SPELL_KORTHAZZ_METEOR, &bp0, 0, 0, false);
}
- events.RepeatEvent(15000);
+ events.Repeat(15s);
return;
case EVENT_SECONDARY_SPELL:
if (horsemanId == HORSEMAN_ZELIEK)
@@ -314,10 +275,8 @@ public:
me->CastCustomSpell(SPELL_ZELIEK_HOLY_WRATH, values, me->GetVictim(), TRIGGERED_NONE, nullptr, nullptr, ObjectGuid::Empty);
}
else // HORSEMAN_BLAUMEUX
- {
me->CastSpell(me->GetVictim(), SPELL_BLAUMEUX_VOID_ZONE, false);
- }
- events.RepeatEvent(15000);
+ events.Repeat(15s);
return;
case EVENT_HEALTH_CHECK:
if (!doneFirstShieldWall && me->GetHealthPct() <= 50.0f)
@@ -330,9 +289,7 @@ public:
if (doneFirstShieldWall && me->GetHealthPct() <= 20.0f)
{
if (!me->HasAura(SPELL_SHIELDWALL)) // prevent refresh of first shield wall
- {
DoCastSelf(SPELL_SHIELDWALL, true);
- }
break;
}
events.Repeat(1s);
@@ -410,3 +367,4 @@ void AddSC_boss_four_horsemen_40()
new boss_four_horsemen_40();
RegisterSpellScript(spell_four_horsemen_mark_aura);
}
+
diff --git a/src/naxx40Scripts/boss_gluth_40.cpp b/src/naxx40Scripts/boss_gluth_40.cpp
index 41f034a..0fa3409 100644
--- a/src/naxx40Scripts/boss_gluth_40.cpp
+++ b/src/naxx40Scripts/boss_gluth_40.cpp
@@ -15,45 +15,48 @@
* with this program. If not, see .
*/
+#include "CreatureScript.h"
#include "Player.h"
-#include "ScriptMgr.h"
#include "ScriptedCreature.h"
#include "SpellScript.h"
+#include "SpellScriptLoader.h"
#include "naxxramas.h"
enum Spells
{
- SPELL_MORTAL_WOUND = 25646,
- SPELL_ENRAGE = 28371,
- SPELL_DECIMATE = 28374,
- SPELL_DECIMATE_DAMAGE = 28375,
- SPELL_BERSERK = 26662,
- SPELL_INFECTED_WOUND = 29306,
- SPELL_CHOW_SEARCHER = 28404
+ SPELL_MORTAL_WOUND = 25646,
+ SPELL_ENRAGE_10 = 28371,
+ SPELL_ENRAGE_25 = 54427,
+ SPELL_DECIMATE_10 = 28374,
+ SPELL_DECIMATE_25 = 54426,
+ SPELL_DECIMATE_DAMAGE = 28375,
+ SPELL_BERSERK = 26662,
+ SPELL_INFECTED_WOUND = 29306,
+ SPELL_CHOW_SEARCHER = 28404
};
enum Events
{
- EVENT_MORTAL_WOUND = 1,
- EVENT_ENRAGE = 2,
- EVENT_DECIMATE = 3,
- EVENT_BERSERK = 4,
- EVENT_SUMMON_ZOMBIE = 5,
- EVENT_CAN_EAT_ZOMBIE = 6
+ EVENT_MORTAL_WOUND = 1,
+ EVENT_ENRAGE = 2,
+ EVENT_DECIMATE = 3,
+ EVENT_BERSERK = 4,
+ EVENT_SUMMON_ZOMBIE = 5,
+ EVENT_CAN_EAT_ZOMBIE = 6
};
enum Misc
{
- NPC_ZOMBIE_CHOW = 351069
+ // NPC_ZOMBIE_CHOW = 16360
};
enum Emotes
{
- EMOTE_SPOTS_ONE = 0,
- EMOTE_DECIMATE = 1,
- EMOTE_ENRAGE = 2,
- EMOTE_DEVOURS_ALL = 3,
- EMOTE_BERSERK = 4
+ EMOTE_SPOTS_ONE = 0,
+ EMOTE_DECIMATE = 1,
+ EMOTE_ENRAGE = 2,
+ EMOTE_DEVOURS_ALL = 3,
+ EMOTE_BERSERK = 4
};
const Position zombiePos[3] =
@@ -76,13 +79,10 @@ public:
struct boss_gluth_40AI : public BossAI
{
explicit boss_gluth_40AI(Creature* c) : BossAI(c, BOSS_GLUTH), summons(me)
- {
- pInstance = me->GetInstanceScript();
- }
+ {}
EventMap events;
SummonList summons;
- InstanceScript* pInstance;
void Reset() override
{
@@ -113,12 +113,12 @@ public:
{
BossAI::JustEngagedWith(who);
me->SetInCombatWithZone();
- events.ScheduleEvent(EVENT_MORTAL_WOUND, 10000);
- events.ScheduleEvent(EVENT_ENRAGE, 22000);
- events.ScheduleEvent(EVENT_DECIMATE, 105000);
- events.ScheduleEvent(EVENT_BERSERK, 360000);
- events.ScheduleEvent(EVENT_SUMMON_ZOMBIE, 10000);
- events.ScheduleEvent(EVENT_CAN_EAT_ZOMBIE, 1000);
+ events.ScheduleEvent(EVENT_MORTAL_WOUND, 10s);
+ events.ScheduleEvent(EVENT_ENRAGE, 22s);
+ events.ScheduleEvent(EVENT_DECIMATE, RAID_MODE(110000, 90000, 110000, 90000));
+ events.ScheduleEvent(EVENT_BERSERK, 6min);
+ events.ScheduleEvent(EVENT_SUMMON_ZOMBIE, 10s);
+ events.ScheduleEvent(EVENT_CAN_EAT_ZOMBIE, 1s);
}
void JustSummoned(Creature* summon) override
@@ -135,16 +135,13 @@ public:
void KilledUnit(Unit* who) override
{
if (me->IsAlive() && who->GetEntry() == NPC_ZOMBIE_CHOW)
- {
me->ModifyHealth(int32(me->GetMaxHealth() * 0.05f));
- }
- if (who->GetTypeId() == TYPEID_PLAYER && pInstance)
- {
- pInstance->SetData(DATA_IMMORTAL_FAIL, 0);
- }
+
+ if (who->IsPlayer())
+ instance->StorePersistentData(PERSISTENT_DATA_IMMORTAL_FAIL, 1);
}
- void JustDied(Unit* killer) override
+ void JustDied(Unit* killer) override
{
BossAI::JustDied(killer);
summons.DespawnAll();
@@ -156,7 +153,7 @@ public:
return false;
Map::PlayerList const& pList = me->GetMap()->GetPlayers();
- for (const auto& itr : pList)
+ for (auto const& itr : pList)
{
Player* player = itr.GetSource();
if (!player || !player->IsAlive())
@@ -182,69 +179,78 @@ public:
switch (events.ExecuteEvent())
{
- case EVENT_BERSERK:
- me->CastSpell(me, SPELL_BERSERK, true);
- break;
- case EVENT_ENRAGE:
- {
- Talk(EMOTE_ENRAGE);
- int32 bp1 = 99; // Enrage melee haste
- int32 bp2 = 49; // Enrage damage percent
- me->CastCustomSpell(me, SPELL_ENRAGE, &bp1, &bp2, 0, true);
- events.RepeatEvent(22000);
- break;
- }
- case EVENT_MORTAL_WOUND:
- me->CastSpell(me->GetVictim(), SPELL_MORTAL_WOUND, false);
- events.RepeatEvent(10000);
- break;
- case EVENT_DECIMATE:
- Talk(EMOTE_DECIMATE);
- me->CastSpell(me, SPELL_DECIMATE, false);
- // Apply Decimate effect to zombies
+ case EVENT_BERSERK:
+ me->CastSpell(me, SPELL_BERSERK, true);
+ break;
+ case EVENT_ENRAGE:
{
- std::list zombies;
- me->GetCreatureListWithEntryInGrid(zombies, NPC_ZOMBIE_CHOW, 150.0f);
- for (Creature* zombie : zombies)
+ Talk(EMOTE_ENRAGE);
+ int32 bp1 = 99; // Enrage melee haste
+ int32 bp2 = 49; // Enrage damage percent
+ me->CastCustomSpell(me, SPELL_ENRAGE_10, &bp1, &bp2, 0, true);
+ events.Repeat(22s);
+ break;
+ }
+ case EVENT_MORTAL_WOUND:
+ me->CastSpell(me->GetVictim(), SPELL_MORTAL_WOUND, false);
+ events.Repeat(10s);
+ break;
+ case EVENT_DECIMATE:
+ Talk(EMOTE_DECIMATE);
+ me->CastSpell(me, SPELL_DECIMATE_10, false);
+ // Apply Decimate effect to zombies
+ // TODO: Is this block required?
{
- if (zombie->IsAlive())
+ std::list zombies;
+ me->GetCreatureListWithEntryInGrid(zombies, NPC_ZOMBIE_CHOW, 150.0f);
+ for (Creature* zombie : zombies)
{
- uint32 reduceHp = uint32(zombie->GetMaxHealth() * 0.05f);
- if (zombie->GetHealth() > reduceHp)
- zombie->SetHealth(reduceHp); // Reduce HP to 5%
- zombie->SetWalk(true); // Set to walk
- zombie->GetMotionMaster()->MoveFollow(me, 0.0f, 0.0f, MOTION_SLOT_CONTROLLED); // Move to boss
- zombie->SetReactState(REACT_PASSIVE); // Set to passive
+ if (zombie->IsAlive())
+ {
+ uint32 reduceHp = uint32(zombie->GetMaxHealth() * 0.05f);
+ if (zombie->GetHealth() > reduceHp)
+ zombie->SetHealth(reduceHp); // Reduce HP to 5%
+ zombie->SetWalk(true); // Set to walk
+ zombie->GetMotionMaster()->MoveFollow(me,
+ 0.0f,
+ 0.0f,
+ MOTION_SLOT_CONTROLLED); // Move to boss
+ zombie->SetReactState(REACT_PASSIVE); // Set to passive
+ }
}
}
- }
- events.RepeatEvent(105000);
- break;
- case EVENT_SUMMON_ZOMBIE:
- {
- uint8 rand = urand(0, 2);
- for (int32 i = 0; i < 1; ++i)
- {
- // In 40 man raid, use all gates
- me->SummonCreature(NPC_ZOMBIE_CHOW, zombiePos[urand(0, 2)]);
- (rand == 2 ? rand = 0 : rand++);
- }
- events.RepeatEvent(10000);
- break;
- }
- case EVENT_CAN_EAT_ZOMBIE:
- events.RepeatEvent(1000);
- if (me->GetVictim() && me->GetVictim()->GetEntry() == NPC_ZOMBIE_CHOW && me->IsWithinMeleeRange(me->GetVictim()))
- {
- if (me->GetVictim()->GetHealth() > 0) // Check if the zombie is alive
+ events.RepeatEvent(105000);
+ break;
+ case EVENT_SUMMON_ZOMBIE:
{
- me->ModifyHealth(int32(me->GetMaxHealth() * 0.05f)); // Heal for 5% of max health
+ uint8 rand = urand(0, 2);
+ for (int32 i = 0; i < RAID_MODE(1, 2, 2, 2); ++i)
+ {
+ // In 10 man raid, normal mode - should spawn only from mid gate
+ // \1 |0 /2 pos
+ // In 25 man raid - should spawn from all 3 gates
+ if (me->GetMap()->GetDifficulty() == RAID_DIFFICULTY_10MAN_NORMAL)
+ {
+ me->SummonCreature(NPC_ZOMBIE_CHOW, zombiePos[0]);
+ }
+ else
+ {
+ me->SummonCreature(NPC_ZOMBIE_CHOW, zombiePos[urand(0, 2)]);
+ }
+ (rand == 2 ? rand = 0 : rand++);
+ }
+ events.Repeat(10s);
+ break;
+ }
+ case EVENT_CAN_EAT_ZOMBIE:
+ events.RepeatEvent(1000);
+ if (me->GetVictim()->GetEntry() == NPC_ZOMBIE_CHOW && me->IsWithinMeleeRange(me->GetVictim()))
+ {
+ me->CastCustomSpell(SPELL_CHOW_SEARCHER, SPELLVALUE_RADIUS_MOD, 20000, me, true);
Talk(EMOTE_DEVOURS_ALL);
- Unit::DealDamage(me, me->GetVictim(), me->GetVictim()->GetHealth(), nullptr, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, nullptr, false); // Kill the zombie
return; // leave it to skip DoMeleeAttackIfReady
}
- }
- break;
+ break;
}
DoMeleeAttackIfReady();
}
diff --git a/src/naxx40Scripts/boss_gothik_40.cpp b/src/naxx40Scripts/boss_gothik_40.cpp
index 026eb9e..2882d4b 100644
--- a/src/naxx40Scripts/boss_gothik_40.cpp
+++ b/src/naxx40Scripts/boss_gothik_40.cpp
@@ -41,9 +41,8 @@ enum Spells
{
// Gothik
SPELL_HARVEST_SOUL = 28679,
- SPELL_SHADOW_BOLT = 29317,
- // SPELL_SHADOW_BOLT_10 = 29317,
- // SPELL_SHADOW_BOLT_25 = 56405,
+ SPELL_SHADOW_BOLT_10 = 29317,
+ SPELL_SHADOW_BOLT_25 = 56405,
// Teleport spells
SPELL_TELEPORT_DEAD = 28025,
SPELL_TELEPORT_LIVE = 28026,
@@ -76,14 +75,14 @@ enum Spells
enum Misc
{
- NPC_LIVING_TRAINEE = 351043,
- NPC_LIVING_KNIGHT = 351044,
- NPC_LIVING_RIDER = 351045,
- NPC_DEAD_TRAINEE = 351046,
- NPC_DEAD_KNIGHT = 351050,
- NPC_DEAD_HORSE = 351051,
- NPC_DEAD_RIDER = 351052,
- NPC_TRIGGER = 351047
+ // NPC_LIVING_TRAINEE = 16124,
+ // NPC_LIVING_KNIGHT = 16125,
+ // NPC_LIVING_RIDER = 16126,
+ // NPC_DEAD_TRAINEE = 16127,
+ // NPC_DEAD_KNIGHT = 16148,
+ // NPC_DEAD_HORSE = 16149,
+ // NPC_DEAD_RIDER = 16150,
+ // NPC_TRIGGER = 16137
};
enum Events
@@ -202,12 +201,10 @@ public:
struct boss_gothik_40AI : public BossAI
{
explicit boss_gothik_40AI(Creature* c) : BossAI(c, BOSS_GOTHIK), summons(me)
- {
- pInstance = me->GetInstanceScript();
- }
+ {}
+
EventMap events;
SummonList summons;
- InstanceScript* pInstance;
bool secondPhase{};
bool gateOpened{};
uint8 waveCount{};
@@ -234,21 +231,6 @@ public:
gateOpened = false;
waveCount = 0;
me->NearTeleportTo(2642.139f, -3386.959f, 285.492f, 6.265f);
- if (pInstance)
- {
- if (GameObject* go = me->GetMap()->GetGameObject(pInstance->GetGuidData(DATA_GOTHIK_ENTER_GATE)))
- {
- go->SetGoState(GO_STATE_ACTIVE);
- }
- if (GameObject* go = me->GetMap()->GetGameObject(pInstance->GetGuidData(DATA_GOTHIK_INNER_GATE)))
- {
- go->SetGoState(GO_STATE_ACTIVE);
- }
- if (GameObject* go = me->GetMap()->GetGameObject(pInstance->GetGuidData(DATA_GOTHIK_EXIT_GATE)))
- {
- go->SetGoState(GO_STATE_READY);
- }
- }
}
void JustEngagedWith(Unit* who) override
@@ -262,17 +244,6 @@ public:
me->SetUnitFlag(UNIT_FLAG_DISABLE_MOVE);
events.ScheduleEvent(EVENT_SUMMON_ADDS, 30s);
events.ScheduleEvent(EVENT_CHECK_PLAYERS, 2min);
- if (pInstance)
- {
- if (GameObject* go = me->GetMap()->GetGameObject(pInstance->GetGuidData(DATA_GOTHIK_ENTER_GATE)))
- {
- go->SetGoState(GO_STATE_READY);
- }
- if (GameObject* go = me->GetMap()->GetGameObject(pInstance->GetGuidData(DATA_GOTHIK_INNER_GATE)))
- {
- go->SetGoState(GO_STATE_READY);
- }
- }
}
void JustSummoned(Creature* summon) override
@@ -324,14 +295,11 @@ public:
void KilledUnit(Unit* who) override
{
- if (who->GetTypeId() != TYPEID_PLAYER)
+ if (!who->IsPlayer())
return;
Talk(SAY_KILL);
- if (pInstance)
- {
- pInstance->SetData(DATA_IMMORTAL_FAIL, 0);
- }
+ instance->StorePersistentData(PERSISTENT_DATA_IMMORTAL_FAIL, 1);
}
void JustDied(Unit* killer) override
@@ -339,41 +307,26 @@ public:
BossAI::JustDied(killer);
Talk(SAY_DEATH);
summons.DespawnAll();
- if (pInstance)
- {
- if (GameObject* go = me->GetMap()->GetGameObject(pInstance->GetGuidData(DATA_GOTHIK_ENTER_GATE)))
- {
- go->SetGoState(GO_STATE_ACTIVE);
- }
- if (GameObject* go = me->GetMap()->GetGameObject(pInstance->GetGuidData(DATA_GOTHIK_INNER_GATE)))
- {
- go->SetGoState(GO_STATE_ACTIVE);
- }
- if (GameObject* go = me->GetMap()->GetGameObject(pInstance->GetGuidData(DATA_GOTHIK_EXIT_GATE)))
- {
- go->SetGoState(GO_STATE_ACTIVE);
- }
- }
}
void SummonHelpers(uint32 entry)
{
- switch(entry)
+ switch (entry)
{
case NPC_LIVING_TRAINEE:
me->SummonCreature(NPC_LIVING_TRAINEE, PosSummonLiving[0].GetPositionX(), PosSummonLiving[0].GetPositionY(), PosSummonLiving[0].GetPositionZ(), PosSummonLiving[0].GetOrientation());
me->SummonCreature(NPC_LIVING_TRAINEE, PosSummonLiving[1].GetPositionX(), PosSummonLiving[1].GetPositionY(), PosSummonLiving[1].GetPositionZ(), PosSummonLiving[1].GetOrientation());
- // if (Is25ManRaid())
- // {
- me->SummonCreature(NPC_LIVING_TRAINEE, PosSummonLiving[2].GetPositionX(), PosSummonLiving[2].GetPositionY(), PosSummonLiving[2].GetPositionZ(), PosSummonLiving[2].GetOrientation());
- // }
+ if (Is25ManRaid())
+ {
+ me->SummonCreature(NPC_LIVING_TRAINEE, PosSummonLiving[2].GetPositionX(), PosSummonLiving[2].GetPositionY(), PosSummonLiving[2].GetPositionZ(), PosSummonLiving[2].GetOrientation());
+ }
break;
case NPC_LIVING_KNIGHT:
me->SummonCreature(NPC_LIVING_KNIGHT, PosSummonLiving[3].GetPositionX(), PosSummonLiving[3].GetPositionY(), PosSummonLiving[3].GetPositionZ(), PosSummonLiving[3].GetOrientation());
- // if (Is25ManRaid())
- // {
- me->SummonCreature(NPC_LIVING_KNIGHT, PosSummonLiving[5].GetPositionX(), PosSummonLiving[5].GetPositionY(), PosSummonLiving[5].GetPositionZ(), PosSummonLiving[5].GetOrientation());
- // }
+ if (Is25ManRaid())
+ {
+ me->SummonCreature(NPC_LIVING_KNIGHT, PosSummonLiving[5].GetPositionX(), PosSummonLiving[5].GetPositionY(), PosSummonLiving[5].GetPositionZ(), PosSummonLiving[5].GetOrientation());
+ }
break;
case NPC_LIVING_RIDER:
me->SummonCreature(NPC_LIVING_RIDER, PosSummonLiving[4].GetPositionX(), PosSummonLiving[4].GetPositionY(), PosSummonLiving[4].GetPositionZ(), PosSummonLiving[4].GetOrientation());
@@ -388,7 +341,7 @@ public:
{
bool checklife = false;
bool checkdead = false;
- for (const auto& i : PlayerList)
+ for (auto const& i : PlayerList)
{
Player* player = i.GetSource();
if (player->IsAlive() &&
@@ -447,7 +400,7 @@ public:
Talk(SAY_INTRO_4);
break;
case EVENT_SHADOW_BOLT:
- me->CastSpell(me->GetVictim(), SPELL_SHADOW_BOLT, false);
+ me->CastSpell(me->GetVictim(), RAID_MODE(SPELL_SHADOW_BOLT_10, SPELL_SHADOW_BOLT_25, SPELL_SHADOW_BOLT_10, SPELL_SHADOW_BOLT_25), false);
events.Repeat(1s);
break;
case EVENT_HARVEST_SOUL:
@@ -473,12 +426,11 @@ public:
events.Repeat(20s);
break;
case EVENT_CHECK_HEALTH:
- if (me->HealthBelowPct(30) && pInstance)
+ if (me->HealthBelowPct(30))
{
- if (GameObject* go = me->GetMap()->GetGameObject(pInstance->GetGuidData(DATA_GOTHIK_INNER_GATE)))
- {
+ if (GameObject* go = instance->GetGameObject(DATA_GOTHIK_INNER_GATE))
go->SetGoState(GO_STATE_ACTIVE);
- }
+
events.CancelEvent(EVENT_TELEPORT);
break;
}
@@ -510,16 +462,14 @@ public:
case EVENT_CHECK_PLAYERS:
if (!CheckGroupSplitted())
{
- if (GameObject* go = me->GetMap()->GetGameObject(pInstance->GetGuidData(DATA_GOTHIK_INNER_GATE)))
- {
+ if (GameObject* go = instance->GetGameObject(DATA_GOTHIK_INNER_GATE))
go->SetGoState(GO_STATE_ACTIVE);
- }
+
gateOpened = true;
Talk(EMOTE_GATE_OPENED);
}
break;
}
-
DoMeleeAttackIfReady();
}
};
@@ -599,10 +549,8 @@ public:
void KilledUnit(Unit* who) override
{
- if (who->GetTypeId() == TYPEID_PLAYER && me->GetInstanceScript())
- {
- me->GetInstanceScript()->SetData(DATA_IMMORTAL_FAIL, 0);
- }
+ if (who->IsPlayer())
+ me->GetInstanceScript()->StorePersistentData(PERSISTENT_DATA_IMMORTAL_FAIL, 1);
}
void UpdateAI(uint32 diff) override
@@ -769,17 +717,14 @@ public:
// dead side summons are "owned" by gothik
void JustSummoned(Creature* summon) override
{
- if (Creature* gothik = ObjectAccessor::GetCreature(*me, me->GetInstanceScript()->GetGuidData(DATA_GOTHIK_BOSS)))
- {
+ if (Creature* gothik = me->GetInstanceScript()->GetCreature(DATA_GOTHIK_BOSS))
gothik->AI()->JustSummoned(summon);
- }
}
+
void SummonedCreatureDespawn(Creature* summon) override
{
- if (Creature* gothik = ObjectAccessor::GetCreature(*me, me->GetInstanceScript()->GetGuidData(DATA_GOTHIK_BOSS)))
- {
+ if (Creature* gothik = me->GetInstanceScript()->GetCreature(DATA_GOTHIK_BOSS))
gothik->AI()->SummonedCreatureDespawn(summon);
- }
}
};
};
@@ -788,6 +733,11 @@ class spell_gothik_shadow_bolt_volley : public SpellScript
{
PrepareSpellScript(spell_gothik_shadow_bolt_volley);
+ bool Validate(SpellInfo const* /*spellInfo*/) override
+ {
+ return ValidateSpellInfo({ SPELL_SHADOW_MARK });
+ }
+
void FilterTargets(std::list& targets)
{
targets.remove_if(Acore::UnitAuraCheck(false, SPELL_SHADOW_MARK));
@@ -805,4 +755,4 @@ void AddSC_boss_gothik_40()
new npc_boss_gothik_minion_40();
new npc_gothik_trigger_40();
// RegisterSpellScript(spell_gothik_shadow_bolt_volley);
-}
+}
\ No newline at end of file
diff --git a/src/naxx40Scripts/boss_grobbulus_40.cpp b/src/naxx40Scripts/boss_grobbulus_40.cpp
index 24bf0b8..bf492c9 100644
--- a/src/naxx40Scripts/boss_grobbulus_40.cpp
+++ b/src/naxx40Scripts/boss_grobbulus_40.cpp
@@ -15,23 +15,26 @@
* with this program. If not, see .
*/
+#include "CreatureScript.h"
#include "PassiveAI.h"
-#include "ScriptMgr.h"
#include "ScriptedCreature.h"
#include "SpellAuraEffects.h"
#include "SpellAuras.h"
#include "SpellScript.h"
+#include "SpellScriptLoader.h"
#include "naxxramas.h"
enum Spells
{
SPELL_POISON_CLOUD = 28240,
- SPELL_POISON_CLOUD_POISON_DAMAGE = 28241,
SPELL_MUTATING_INJECTION = 28169,
SPELL_MUTATING_EXPLOSION = 28206,
- SPELL_SLIME_SPRAY = 28157,
- SPELL_POISON_CLOUD_DAMAGE_AURA = 28158,
+ SPELL_SLIME_SPRAY_10 = 28157,
+ SPELL_SLIME_SPRAY_25 = 54364,
+ SPELL_POISON_CLOUD_DAMAGE_AURA_10 = 28158,
+ SPELL_POISON_CLOUD_DAMAGE_AURA_25 = 54362,
SPELL_BERSERK = 26662,
+ // SPELL_BOMBARD_SLIME = 28280
};
enum Emotes
@@ -49,9 +52,9 @@ enum Events
enum Misc
{
- NPC_FALLOUT_SLIME = 351067,
- NPC_SEWAGE_SLIME = 351071,
- NPC_STICHED_GIANT = 351027
+ // NPC_FALLOUT_SLIME = 16290,
+ // NPC_SEWAGE_SLIME = 16375,
+ // NPC_STICHED_GIANT = 16025
};
class boss_grobbulus_40 : public CreatureScript
@@ -67,13 +70,10 @@ public:
struct boss_grobbulus_40AI : public BossAI
{
explicit boss_grobbulus_40AI(Creature* c) : BossAI(c, BOSS_GROBBULUS), summons(me)
- {
- pInstance = me->GetInstanceScript();
- }
+ {}
EventMap events;
SummonList summons;
- InstanceScript* pInstance;
uint32 dropSludgeTimer{};
void Reset() override
@@ -99,15 +99,15 @@ public:
BossAI::JustEngagedWith(who);
PullChamberAdds();
me->SetInCombatWithZone();
- events.ScheduleEvent(EVENT_POISON_CLOUD, 15000);
- events.ScheduleEvent(EVENT_MUTATING_INJECTION, 12000);
- events.ScheduleEvent(EVENT_SLIME_SPRAY, 10000);
- events.ScheduleEvent(EVENT_BERSERK, 12 * 60 * 1000); // 12 minute enrage
+ events.ScheduleEvent(EVENT_POISON_CLOUD, 15s);
+ events.ScheduleEvent(EVENT_MUTATING_INJECTION, 20s);
+ events.ScheduleEvent(EVENT_SLIME_SPRAY, 10s);
+ events.ScheduleEvent(EVENT_BERSERK, RAID_MODE(720000, 540000, 540000, 540000));
}
void SpellHitTarget(Unit* target, SpellInfo const* spellInfo) override
{
- if (spellInfo->Id == SPELL_SLIME_SPRAY && target->GetTypeId() == TYPEID_PLAYER)
+ if (spellInfo->Id == RAID_MODE(SPELL_SLIME_SPRAY_10, SPELL_SLIME_SPRAY_25, SPELL_SLIME_SPRAY_10, SPELL_SLIME_SPRAY_25) && target->IsPlayer())
{
me->SummonCreature(NPC_FALLOUT_SLIME, target->GetPositionX(), target->GetPositionY(), target->GetPositionZ());
}
@@ -135,10 +135,8 @@ public:
void KilledUnit(Unit* who) override
{
- if (who->GetTypeId() == TYPEID_PLAYER && pInstance)
- {
- pInstance->SetData(DATA_IMMORTAL_FAIL, 0);
- }
+ if (who->IsPlayer())
+ instance->StorePersistentData(PERSISTENT_DATA_IMMORTAL_FAIL, 1);
}
void UpdateAI(uint32 diff) override
@@ -164,19 +162,16 @@ public:
{
case EVENT_POISON_CLOUD:
me->CastSpell(me, SPELL_POISON_CLOUD, true);
- events.RepeatEvent(15000);
+ events.Repeat(15s);
break;
case EVENT_BERSERK:
me->CastSpell(me, SPELL_BERSERK, true);
break;
case EVENT_SLIME_SPRAY:
- {
Talk(EMOTE_SLIME);
- int32 modifiedSlimeSprayDamage = urand(3200, 3400);
- me->CastCustomSpell(me->GetVictim(), SPELL_SLIME_SPRAY, &modifiedSlimeSprayDamage, 0, 0, false);
- events.RepeatEvent(20000);
+ me->CastSpell(me->GetVictim(), RAID_MODE(SPELL_SLIME_SPRAY_10, SPELL_SLIME_SPRAY_25, SPELL_SLIME_SPRAY_10, SPELL_SLIME_SPRAY_25), false);
+ events.Repeat(20s);
break;
- }
case EVENT_MUTATING_INJECTION:
if (Unit* target = SelectTarget(SelectTargetMethod::Random, 1, 100.0f, true, true, -SPELL_MUTATING_INJECTION))
{
@@ -197,12 +192,12 @@ public:
CreatureAI* GetAI(Creature* pCreature) const override
{
- return GetNaxxramasAI(pCreature);
+ return GetNaxxramasAI(pCreature);
}
- struct boss_grobbulus_40_poison_cloudAI : public NullCreatureAI
+ struct boss_grobbulus_poison_cloud_40AI : public NullCreatureAI
{
- explicit boss_grobbulus_40_poison_cloudAI(Creature* pCreature) : NullCreatureAI(pCreature) { }
+ explicit boss_grobbulus_poison_cloud_40AI(Creature* pCreature) : NullCreatureAI(pCreature) { }
uint32 sizeTimer{};
uint32 auraVisualTimer{};
@@ -217,10 +212,8 @@ public:
void KilledUnit(Unit* who) override
{
- if (who->GetTypeId() == TYPEID_PLAYER && me->GetInstanceScript())
- {
- me->GetInstanceScript()->SetData(DATA_IMMORTAL_FAIL, 0);
- }
+ if (who->IsPlayer())
+ me->GetInstanceScript()->StorePersistentData(PERSISTENT_DATA_IMMORTAL_FAIL, 1);
}
void UpdateAI(uint32 diff) override
@@ -230,7 +223,7 @@ public:
auraVisualTimer += diff;
if (auraVisualTimer >= 1000)
{
- me->CastSpell(me, SPELL_POISON_CLOUD_DAMAGE_AURA, true);
+ me->CastSpell(me, (me->GetMap()->Is25ManRaid() ? SPELL_POISON_CLOUD_DAMAGE_AURA_25 : SPELL_POISON_CLOUD_DAMAGE_AURA_10), true);
auraVisualTimer = 0;
}
}
@@ -291,9 +284,7 @@ class spell_grobbulus_mutating_injection_aura : public AuraScript
caster->CastCustomSpell(GetTarget(), SPELL_MUTATING_EXPLOSION, &modifiedMutatingExplosionDamage, 0, 0, true);
}
else
- {
caster->CastSpell(GetTarget(), SPELL_MUTATING_EXPLOSION, true);
- }
}
break;
default:
diff --git a/src/naxx40Scripts/boss_heigan_40.cpp b/src/naxx40Scripts/boss_heigan_40.cpp
index 1da88d3..1b7e1b7 100644
--- a/src/naxx40Scripts/boss_heigan_40.cpp
+++ b/src/naxx40Scripts/boss_heigan_40.cpp
@@ -38,12 +38,14 @@ enum Says
enum Spells
{
- SPELL_SUMMON_PLAYER = 25104,
- SPELL_DISRUPTION = 55010, // 29310->55010: Mana Burn AoE spell similar to vanilla
- SPELL_DECREPIT_FEVER = 29998,
+ // SPELL_DISRUPTION = 29310,
+ SPELL_DECREPIT_FEVER_10 = 29998,
+ SPELL_DECREPIT_FEVER_25 = 55011,
SPELL_PLAGUE_CLOUD = 29350,
SPELL_TELEPORT_SELF = 30211,
- SPELL_TELEPORT_PLAYERS = 29273 // updated target in db
+
+ SPELL_TELEPORT_PLAYERS = 29273, // updated target in db
+ SPELL_SUMMON_PLAYER = 25104,
};
enum Events
@@ -100,15 +102,13 @@ public:
struct boss_heigan_40AI : public BossAI
{
explicit boss_heigan_40AI(Creature* c) : BossAI(c, BOSS_HEIGAN)
- {
- pInstance = me->GetInstanceScript();
- }
+ {}
- InstanceScript* pInstance;
EventMap events;
uint8 currentPhase{};
uint8 currentSection{};
bool moveRight{};
+
GuidList portedPlayersThisPhase;
void Reset() override
@@ -120,30 +120,15 @@ public:
portedPlayersThisPhase.clear();
KillPlayersInTheTunnel();
moveRight = true;
- if (pInstance)
- {
- if (GameObject* go = me->GetMap()->GetGameObject(pInstance->GetGuidData(DATA_HEIGAN_ENTER_GATE)))
- {
- go->SetGoState(GO_STATE_ACTIVE);
- }
- // Close tunnel door
- if (GameObject* go = me->GetMap()->GetGameObject(pInstance->GetGuidData(DATA_HEIGAN_EXIT_GATE_40)))
- {
- go->SetGoState(GO_STATE_READY);
- }
- }
}
void KilledUnit(Unit* who) override
{
- if (who->GetTypeId() != TYPEID_PLAYER)
+ if (!who->IsPlayer())
return;
Talk(SAY_SLAY);
- if (pInstance)
- {
- pInstance->SetData(DATA_IMMORTAL_FAIL, 0);
- }
+ instance->StorePersistentData(PERSISTENT_DATA_IMMORTAL_FAIL, 1);
}
void JustDied(Unit* killer) override
@@ -157,23 +142,6 @@ public:
BossAI::JustEngagedWith(who);
me->SetInCombatWithZone();
Talk(SAY_AGGRO);
- if (pInstance)
- {
- if (GameObject* go = me->GetMap()->GetGameObject(pInstance->GetGuidData(DATA_HEIGAN_ENTER_GATE)))
- {
- go->SetGoState(GO_STATE_READY);
- }
- // Open tunnel door
- if (GameObject* go = me->GetMap()->GetGameObject(pInstance->GetGuidData(DATA_HEIGAN_EXIT_GATE_40)))
- {
- go->SetGoState(GO_STATE_ACTIVE);
- }
- // Close loatheb door
- if (GameObject* go = me->GetMap()->GetGameObject(pInstance->GetGuidData(DATA_HEIGAN_EXIT_GATE_OLD_40)))
- {
- go->SetGoState(GO_STATE_READY);
- }
- }
StartFightPhase(PHASE_SLOW_DANCE);
}
@@ -187,11 +155,11 @@ public:
me->CastStop();
me->SetReactState(REACT_AGGRESSIVE);
DoZoneInCombat();
- events.ScheduleEvent(EVENT_DISRUPTION, urand(12000, 15000));
- events.ScheduleEvent(EVENT_DECEPIT_FEVER, 17000);
- events.ScheduleEvent(EVENT_ERUPT_SECTION, 15000);
- events.ScheduleEvent(EVENT_SWITCH_PHASE, 90000);
- events.ScheduleEvent(EVENT_TELEPORT_PLAYER, 40000);
+ events.ScheduleEvent(EVENT_DISRUPTION, 12s, 15s);
+ events.ScheduleEvent(EVENT_DECEPIT_FEVER, 17s);
+ events.ScheduleEvent(EVENT_ERUPT_SECTION, 15s);
+ events.ScheduleEvent(EVENT_SWITCH_PHASE, 90s);
+ events.ScheduleEvent(EVENT_TELEPORT_PLAYER, 40s);
portedPlayersThisPhase.clear();
}
else // if (phase == PHASE_FAST_DANCE)
@@ -203,11 +171,11 @@ public:
me->SetReactState(REACT_PASSIVE);
me->CastSpell(me, SPELL_TELEPORT_SELF, false);
me->SetFacingTo(2.40f);
- events.ScheduleEvent(EVENT_PLAGUE_CLOUD, 1000);
- events.ScheduleEvent(EVENT_ERUPT_SECTION, 7000);
- events.ScheduleEvent(EVENT_SWITCH_PHASE, 45000);
+ events.ScheduleEvent(EVENT_PLAGUE_CLOUD, 1s);
+ events.ScheduleEvent(EVENT_ERUPT_SECTION, 7s);
+ events.ScheduleEvent(EVENT_SWITCH_PHASE, 45s);
}
- events.ScheduleEvent(EVENT_SAFETY_DANCE, 5000);
+ events.ScheduleEvent(EVENT_SAFETY_DANCE, 5s);
}
bool IsInRoom(Unit* who)
@@ -226,19 +194,11 @@ public:
{
// hackfix: kill everyone in the tunnel
Map::PlayerList const& PlayerList = me->GetMap()->GetPlayers();
- for (const auto& itr : PlayerList)
- {
+ for (auto const& itr : PlayerList)
if (Player* player = itr.GetSource())
- {
if (player->IsAlive() && !player->IsGameMaster())
- {
if (player->GetPositionY() <= -3735.0f)
- {
player->KillSelf();
- }
- }
- }
- }
}
void DoEventTeleportPlayer()
@@ -289,19 +249,20 @@ public:
if (!me->IsWithinDistInMap(victim, VISIBILITY_DISTANCE_NORMAL))
me->CastSpell(victim, SPELL_SUMMON_PLAYER, true);
}
+
events.Update(diff);
switch (events.ExecuteEvent())
{
case EVENT_DISRUPTION:
me->CastCustomSpell(SPELL_DISRUPTION, SPELLVALUE_RADIUS_MOD, 2500, me, false); // 25yd
- events.RepeatEvent(10000);
+ events.Repeat(10s);
break;
case EVENT_DECEPIT_FEVER:
{
int32 bp1 = 499;
- me->CastCustomSpell(me, SPELL_DECREPIT_FEVER, 0, &bp1, 0, false, nullptr, nullptr, ObjectGuid::Empty);
- events.RepeatEvent(urand(22000, 25000));
+ me->CastCustomSpell(me, SPELL_DECREPIT_FEVER_10, 0, &bp1, 0, false, nullptr, nullptr, ObjectGuid::Empty);
+ events.Repeat(22s, 25s);
break;
}
case EVENT_PLAGUE_CLOUD:
@@ -319,45 +280,37 @@ public:
}
break;
case EVENT_ERUPT_SECTION:
- if (pInstance)
- {
- if (currentPhase == PHASE_FAST_DANCE)
- {
- if (currentSection >= 1)
- KillPlayersInTheTunnel();
- }
- pInstance->SetData(DATA_HEIGAN_ERUPTION, currentSection);
- if (currentSection == 3)
- {
- moveRight = false;
- }
- else if (currentSection == 0)
- {
- moveRight = true;
- }
- moveRight ? currentSection++ : currentSection--;
- }
+ {
+ instance->SetData(DATA_HEIGAN_ERUPTION, currentSection);
+ if (currentSection == 3)
+ moveRight = false;
+ else if (currentSection == 0)
+ moveRight = true;
+
+ moveRight ? currentSection++ : currentSection--;
+
if (currentPhase == PHASE_SLOW_DANCE)
- {
Talk(SAY_TAUNT);
- }
- events.RepeatEvent(currentPhase == PHASE_SLOW_DANCE ? 10000 : 4000);
+
+ events.Repeat(currentPhase == PHASE_SLOW_DANCE ? 10s : 4s);
break;
+ }
+ break;
case EVENT_SAFETY_DANCE:
+ {
+ Map::PlayerList const& pList = me->GetMap()->GetPlayers();
+ for (auto const& itr : pList)
{
- Map::PlayerList const& pList = me->GetMap()->GetPlayers();
- for (const auto& itr : pList)
+ if (IsInRoom(itr.GetSource()) && !itr.GetSource()->IsAlive())
{
- if (IsInRoom(itr.GetSource()) && !itr.GetSource()->IsAlive())
- {
- pInstance->SetData(DATA_DANCE_FAIL, 0);
- pInstance->SetData(DATA_IMMORTAL_FAIL, 0);
- return;
- }
+ instance->SetData(DATA_DANCE_FAIL, 0);
+ instance->StorePersistentData(PERSISTENT_DATA_IMMORTAL_FAIL, 1);
+ return;
}
- events.RepeatEvent(5000);
- return;
}
+ events.Repeat(5s);
+ return;
+ }
case EVENT_TELEPORT_PLAYER:
DoEventTeleportPlayer();
break;
diff --git a/src/naxx40Scripts/boss_kelthuzad_40.cpp b/src/naxx40Scripts/boss_kelthuzad_40.cpp
index 28b5c44..3d59767 100644
--- a/src/naxx40Scripts/boss_kelthuzad_40.cpp
+++ b/src/naxx40Scripts/boss_kelthuzad_40.cpp
@@ -15,6 +15,7 @@
* with this program. If not, see .
*/
+#include "CreatureScript.h"
#include "Player.h"
#include "ScriptMgr.h"
#include "ScriptedCreature.h"
@@ -42,8 +43,10 @@ enum Yells
enum Spells
{
// Kel'Thzuad
- SPELL_FROST_BOLT_SINGLE = 28478,
- SPELL_FROST_BOLT_MULTI = 28479,
+ SPELL_FROST_BOLT_SINGLE_10 = 28478,
+ SPELL_FROST_BOLT_SINGLE_25 = 55802,
+ SPELL_FROST_BOLT_MULTI_10 = 28479,
+ SPELL_FROST_BOLT_MULTI_25 = 55807,
SPELL_SHADOW_FISURE = 27810,
SPELL_VOID_BLAST = 27812,
SPELL_DETONATE_MANA = 27819,
@@ -61,10 +64,10 @@ enum Spells
enum Misc
{
- NPC_SOLDIER_OF_THE_FROZEN_WASTES = 351073,
- NPC_UNSTOPPABLE_ABOMINATION = 351074,
- NPC_SOUL_WEAVER = 351075,
- NPC_GUARDIAN_OF_ICECROWN = 351076,
+ // NPC_SOLDIER_OF_THE_FROZEN_WASTES = 16427,
+ // NPC_UNSTOPPABLE_ABOMINATION = 16428,
+ // NPC_SOUL_WEAVER = 16429,
+ // NPC_GUARDIAN_OF_ICECROWN = 16441,
ACTION_CALL_HELP_ON = 1,
ACTION_CALL_HELP_OFF = 2,
@@ -142,15 +145,10 @@ public:
struct boss_kelthuzad_40AI : public BossAI
{
explicit boss_kelthuzad_40AI(Creature* c) : BossAI(c, BOSS_KELTHUZAD), summons(me)
- {
- pInstance = me->GetInstanceScript();
- _justSpawned = true;
- }
+ {}
EventMap events;
SummonList summons;
- InstanceScript* pInstance;
- bool _justSpawned;
float NormalizeOrientation(float o)
{
@@ -221,35 +219,23 @@ public:
summons.DespawnAll();
me->RemoveUnitFlag(UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_DISABLE_MOVE);
me->SetReactState(REACT_AGGRESSIVE);
- if (GameObject* go = me->GetMap()->GetGameObject(pInstance->GetGuidData(DATA_KELTHUZAD_FLOOR)))
+ if (GameObject* go = instance->GetGameObject(DATA_KELTHUZAD_FLOOR))
{
go->SetPhaseMask(1, true);
go->SetGoState(GO_STATE_READY);
}
- if (GameObject* go = me->GetMap()->GetGameObject(pInstance->GetGuidData(DATA_KELTHUZAD_GATE)))
- {
- if(!_justSpawned) // Don't open the door if we just spawned and are still doing the conversation
- {
- go->SetGoState(GO_STATE_ACTIVE);
- }
- }
- _justSpawned = false;
- if (GameObject* go = me->GetMap()->GetGameObject(pInstance->GetGuidData(DATA_KELTHUZAD_PORTAL_1)))
- {
+
+ if (GameObject* go = instance->GetGameObject(DATA_KELTHUZAD_PORTAL_1))
go->SetGoState(GO_STATE_READY);
- }
- if (GameObject* go = me->GetMap()->GetGameObject(pInstance->GetGuidData(DATA_KELTHUZAD_PORTAL_2)))
- {
+
+ if (GameObject* go = instance->GetGameObject(DATA_KELTHUZAD_PORTAL_2))
go->SetGoState(GO_STATE_READY);
- }
- if (GameObject* go = me->GetMap()->GetGameObject(pInstance->GetGuidData(DATA_KELTHUZAD_PORTAL_3)))
- {
+
+ if (GameObject* go = instance->GetGameObject(DATA_KELTHUZAD_PORTAL_3))
go->SetGoState(GO_STATE_READY);
- }
- if (GameObject* go = me->GetMap()->GetGameObject(pInstance->GetGuidData(DATA_KELTHUZAD_PORTAL_4)))
- {
+
+ if (GameObject* go = instance->GetGameObject(DATA_KELTHUZAD_PORTAL_4))
go->SetGoState(GO_STATE_READY);
- }
}
void EnterEvadeMode(EvadeReason why) override
@@ -260,14 +246,11 @@ public:
void KilledUnit(Unit* who) override
{
- if (who->GetTypeId() != TYPEID_PLAYER)
+ if (!who->IsPlayer())
return;
Talk(SAY_SLAY);
- if (pInstance)
- {
- pInstance->SetData(DATA_IMMORTAL_FAIL, 0);
- }
+ instance->StorePersistentData(PERSISTENT_DATA_IMMORTAL_FAIL, 1);
}
void JustDied(Unit* killer) override
@@ -279,18 +262,11 @@ public:
guardian->AI()->Talk(EMOTE_GUARDIAN_FLEE);
}
Talk(SAY_DEATH);
- if (pInstance)
- {
- if (GameObject* go = me->GetMap()->GetGameObject(pInstance->GetGuidData(DATA_KELTHUZAD_GATE)))
- {
- go->SetGoState(GO_STATE_ACTIVE);
- }
- }
}
void MoveInLineOfSight(Unit* who) override
{
- if (!me->IsInCombat() && who->GetTypeId() == TYPEID_PLAYER && who->IsAlive() && me->GetDistance(who) <= 50.0f)
+ if (!me->IsInCombat() && who->IsPlayer() && who->IsAlive() && me->GetDistance(who) <= 50.0f)
AttackStart(who);
}
@@ -303,23 +279,17 @@ public:
me->SetTarget();
me->SetReactState(REACT_PASSIVE);
me->CastSpell(me, SPELL_KELTHUZAD_CHANNEL, false);
- events.ScheduleEvent(EVENT_SPAWN_POOL, 5000);
- events.ScheduleEvent(EVENT_SUMMON_SOLDIER, 6400);
- events.ScheduleEvent(EVENT_SUMMON_UNSTOPPABLE_ABOMINATION, 10000);
- events.ScheduleEvent(EVENT_SUMMON_SOUL_WEAVER, 12000);
- events.ScheduleEvent(EVENT_PHASE_2, 228000);
- events.ScheduleEvent(EVENT_ENRAGE, 900000);
- if (pInstance)
+ events.ScheduleEvent(EVENT_SPAWN_POOL, 5s);
+ events.ScheduleEvent(EVENT_SUMMON_SOLDIER, 6400ms);
+ events.ScheduleEvent(EVENT_SUMMON_UNSTOPPABLE_ABOMINATION, 10s);
+ events.ScheduleEvent(EVENT_SUMMON_SOUL_WEAVER, 12s);
+ events.ScheduleEvent(EVENT_PHASE_2, 228s);
+ events.ScheduleEvent(EVENT_ENRAGE, 15min);
+
+ if (GameObject* go = instance->GetGameObject(DATA_KELTHUZAD_FLOOR))
{
- if (GameObject* go = me->GetMap()->GetGameObject(pInstance->GetGuidData(DATA_KELTHUZAD_FLOOR)))
- {
- events.ScheduleEvent(EVENT_FLOOR_CHANGE, 15000);
- go->SetGoState(GO_STATE_ACTIVE);
- }
- }
- if (GameObject* go = me->GetMap()->GetGameObject(pInstance->GetGuidData(DATA_KELTHUZAD_GATE)))
- {
- go->SetGoState(GO_STATE_READY);
+ events.ScheduleEvent(EVENT_FLOOR_CHANGE, 15s);
+ go->SetGoState(GO_STATE_ACTIVE);
}
}
@@ -351,14 +321,11 @@ public:
switch (events.ExecuteEvent())
{
case EVENT_FLOOR_CHANGE:
- if (pInstance)
+ if (GameObject* go = instance->GetGameObject(DATA_KELTHUZAD_FLOOR))
{
- if (GameObject* go = me->GetMap()->GetGameObject(pInstance->GetGuidData(DATA_KELTHUZAD_FLOOR)))
- {
- events.ScheduleEvent(EVENT_FLOOR_CHANGE, 15000);
- go->SetGoState(GO_STATE_READY);
- go->SetPhaseMask(2, true);
- }
+ events.ScheduleEvent(EVENT_FLOOR_CHANGE, 15s);
+ go->SetGoState(GO_STATE_READY);
+ go->SetPhaseMask(2, true);
}
break;
case EVENT_SPAWN_POOL:
@@ -366,15 +333,15 @@ public:
break;
case EVENT_SUMMON_SOLDIER:
SummonHelper(NPC_SOLDIER_OF_THE_FROZEN_WASTES, 1);
- events.RepeatEvent(3100);
+ events.Repeat(3100ms);
break;
case EVENT_SUMMON_UNSTOPPABLE_ABOMINATION:
SummonHelper(NPC_UNSTOPPABLE_ABOMINATION, 1);
- events.RepeatEvent(18500);
+ events.Repeat(18s + 500ms);
break;
case EVENT_SUMMON_SOUL_WEAVER:
SummonHelper(NPC_SOUL_WEAVER, 1);
- events.RepeatEvent(30000);
+ events.Repeat(30s);
break;
case EVENT_PHASE_2:
Talk(EMOTE_PHASE_TWO);
@@ -385,42 +352,42 @@ public:
me->GetMotionMaster()->MoveChase(me->GetVictim());
me->RemoveAura(SPELL_KELTHUZAD_CHANNEL);
me->SetReactState(REACT_AGGRESSIVE);
- events.ScheduleEvent(EVENT_FROST_BOLT_SINGLE, urand(2000, 10000));
- events.ScheduleEvent(EVENT_FROST_BOLT_MULTI, urand(15000, 30000));
- events.ScheduleEvent(EVENT_DETONATE_MANA, 30000);
- events.ScheduleEvent(EVENT_PHASE_3, 1000);
- events.ScheduleEvent(EVENT_SHADOW_FISSURE, 25000);
- events.ScheduleEvent(EVENT_FROST_BLAST, 45000);
+ events.ScheduleEvent(EVENT_FROST_BOLT_SINGLE, 2s, 10s);
+ events.ScheduleEvent(EVENT_FROST_BOLT_MULTI, 15s, 30s);
+ events.ScheduleEvent(EVENT_DETONATE_MANA, 30s);
+ events.ScheduleEvent(EVENT_PHASE_3, 1s);
+ events.ScheduleEvent(EVENT_SHADOW_FISSURE, 25s);
+ events.ScheduleEvent(EVENT_FROST_BLAST, 45s);
if (Is25ManRaid())
{
- events.ScheduleEvent(EVENT_CHAINS, 90000);
+ events.ScheduleEvent(EVENT_CHAINS, 90s);
}
break;
case EVENT_ENRAGE:
me->CastSpell(me, SPELL_BERSERK, true);
break;
case EVENT_FROST_BOLT_SINGLE:
- me->CastSpell(me->GetVictim(), SPELL_FROST_BOLT_SINGLE, false);
- events.RepeatEvent(urand(2000, 10000));
+ me->CastSpell(me->GetVictim(), RAID_MODE(SPELL_FROST_BOLT_SINGLE_10, SPELL_FROST_BOLT_SINGLE_25, SPELL_FROST_BOLT_SINGLE_10, SPELL_FROST_BOLT_SINGLE_25), false);
+ events.Repeat(2s, 10s);
break;
case EVENT_FROST_BOLT_MULTI:
- me->CastSpell(me, SPELL_FROST_BOLT_MULTI, false);
- events.RepeatEvent(urand(15000, 30000));
+ me->CastSpell(me, RAID_MODE(SPELL_FROST_BOLT_MULTI_10, SPELL_FROST_BOLT_MULTI_25, SPELL_FROST_BOLT_MULTI_10, SPELL_FROST_BOLT_MULTI_25), false);
+ events.Repeat(15s, 30s);
break;
case EVENT_SHADOW_FISSURE:
if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 100.0f, true))
{
me->CastSpell(target, SPELL_SHADOW_FISURE, false);
}
- events.RepeatEvent(25000);
+ events.Repeat(25s);
break;
case EVENT_FROST_BLAST:
- if (Unit* target = SelectTarget(SelectTargetMethod::Random, 1, 0, true))
+ if (Unit* target = SelectTarget(SelectTargetMethod::Random, RAID_MODE(1, 0, 0, 0), 0, true))
{
me->CastSpell(target, SPELL_FROST_BLAST, false);
}
Talk(SAY_FROST_BLAST);
- events.RepeatEvent(45000);
+ events.Repeat(45s);
break;
case EVENT_CHAINS:
for (uint8 i = 0; i < 3; ++i)
@@ -431,7 +398,7 @@ public:
}
}
Talk(SAY_CHAIN);
- events.RepeatEvent(90000);
+ events.Repeat(90s);
break;
case EVENT_DETONATE_MANA:
{
@@ -439,7 +406,7 @@ public:
ThreatContainer::StorageType const& threatList = me->GetThreatMgr().GetThreatList();
for (auto itr : threatList)
{
- if (itr->getTarget()->GetTypeId() == TYPEID_PLAYER
+ if (itr->getTarget()->IsPlayer()
&& itr->getTarget()->getPowerType() == POWER_MANA
&& itr->getTarget()->GetPower(POWER_MANA))
{
@@ -453,48 +420,41 @@ public:
me->CastSpell(*itr, SPELL_DETONATE_MANA, false);
Talk(SAY_SPECIAL);
}
- events.RepeatEvent(30000);
+ events.Repeat(30s);
break;
}
case EVENT_PHASE_3:
if (me->HealthBelowPct(45))
{
Talk(SAY_REQUEST_AID);
- events.DelayEvents(5500);
- events.ScheduleEvent(EVENT_P3_LICH_KING_SAY, 5000);
- if (GameObject* go = me->GetMap()->GetGameObject(pInstance->GetGuidData(DATA_KELTHUZAD_PORTAL_1)))
- {
+ events.DelayEvents(5500ms);
+ events.ScheduleEvent(EVENT_P3_LICH_KING_SAY, 5s);
+ if (GameObject* go = instance->GetGameObject(DATA_KELTHUZAD_PORTAL_1))
go->SetGoState(GO_STATE_ACTIVE);
- }
- if (GameObject* go = me->GetMap()->GetGameObject(pInstance->GetGuidData(DATA_KELTHUZAD_PORTAL_2)))
- {
+
+ if (GameObject* go = instance->GetGameObject(DATA_KELTHUZAD_PORTAL_2))
go->SetGoState(GO_STATE_ACTIVE);
- }
- if (GameObject* go = me->GetMap()->GetGameObject(pInstance->GetGuidData(DATA_KELTHUZAD_PORTAL_3)))
- {
+
+ if (GameObject* go = instance->GetGameObject(DATA_KELTHUZAD_PORTAL_3))
go->SetGoState(GO_STATE_ACTIVE);
- }
- if (GameObject* go = me->GetMap()->GetGameObject(pInstance->GetGuidData(DATA_KELTHUZAD_PORTAL_4)))
- {
+
+ if (GameObject* go = instance->GetGameObject(DATA_KELTHUZAD_PORTAL_4))
go->SetGoState(GO_STATE_ACTIVE);
- }
+
break;
}
- events.RepeatEvent(1000);
+ events.Repeat(1s);
break;
case EVENT_P3_LICH_KING_SAY:
- if (pInstance)
- {
- if (Creature* cr = ObjectAccessor::GetCreature(*me, pInstance->GetGuidData(DATA_LICH_KING_BOSS)))
- {
- cr->AI()->Talk(SAY_ANSWER_REQUEST);
- }
- }
- for (uint8 i = 0 ; i < 5; ++i)
- {
+ {
+ if (Creature* cr = instance->GetCreature(DATA_LICH_KING_BOSS))
+ cr->AI()->Talk(SAY_ANSWER_REQUEST);
+
+ for (uint8 i = 0 ; i < RAID_MODE(2, 4, 4, 4); ++i)
events.ScheduleEvent(EVENT_SUMMON_GUARDIAN_OF_ICECROWN, 10000 + (i * 5000));
- }
+
break;
+ }
case EVENT_SUMMON_GUARDIAN_OF_ICECROWN:
if (Creature* cr = me->SummonCreature(NPC_GUARDIAN_OF_ICECROWN, SpawnPool[RAND(0, 1, 3, 4)]))
{
@@ -562,7 +522,7 @@ public:
void MoveInLineOfSight(Unit* who) override
{
- if (who->GetTypeId() != TYPEID_PLAYER && !who->IsPet())
+ if (!who->IsPlayer() && !who->IsPet())
return;
ScriptedAI::MoveInLineOfSight(who);
@@ -570,10 +530,8 @@ public:
void JustDied(Unit* /*killer*/) override
{
- if (me->GetEntry() == NPC_UNSTOPPABLE_ABOMINATION && me->GetInstanceScript())
- {
+ if (me->GetEntry() == NPC_UNSTOPPABLE_ABOMINATION)
me->GetInstanceScript()->SetData(DATA_ABOMINATION_KILLED, 0);
- }
}
void AttackStart(Unit* who) override
@@ -604,21 +562,19 @@ public:
me->SetInCombatWithZone();
if (me->GetEntry() == NPC_UNSTOPPABLE_ABOMINATION)
{
- events.ScheduleEvent(EVENT_MINION_FRENZY, 1000);
- events.ScheduleEvent(EVENT_MINION_MORTAL_WOUND, 5000);
+ events.ScheduleEvent(EVENT_MINION_FRENZY, 1s);
+ events.ScheduleEvent(EVENT_MINION_MORTAL_WOUND, 5s);
}
else if (me->GetEntry() == NPC_GUARDIAN_OF_ICECROWN)
{
- events.ScheduleEvent(EVENT_MINION_BLOOD_TAP, 15000);
+ events.ScheduleEvent(EVENT_MINION_BLOOD_TAP, 15s);
}
}
void KilledUnit(Unit* who) override
{
- if (who->GetTypeId() == TYPEID_PLAYER && me->GetInstanceScript())
- {
- me->GetInstanceScript()->SetData(DATA_IMMORTAL_FAIL, 0);
- }
+ if (who->IsPlayer())
+ me->GetInstanceScript()->StorePersistentData(PERSISTENT_DATA_IMMORTAL_FAIL, 1);
}
void JustReachedHome() override
@@ -642,7 +598,7 @@ public:
{
case EVENT_MINION_MORTAL_WOUND:
me->CastSpell(me->GetVictim(), SPELL_MORTAL_WOUND, false);
- events.RepeatEvent(15000);
+ events.Repeat(15s);
break;
case EVENT_MINION_FRENZY:
if (me->HealthBelowPct(35))
@@ -650,11 +606,11 @@ public:
me->CastSpell(me, SPELL_FRENZY, true);
break;
}
- events.RepeatEvent(1000);
+ events.Repeat(1s);
break;
case EVENT_MINION_BLOOD_TAP:
me->CastSpell(me->GetVictim(), SPELL_BLOOD_TAP, false);
- events.RepeatEvent(15000);
+ events.Repeat(15s);
break;
}
DoMeleeAttackIfReady();
@@ -666,6 +622,11 @@ class spell_kelthuzad_frost_blast : public SpellScript
{
PrepareSpellScript(spell_kelthuzad_frost_blast);
+ bool Validate(SpellInfo const* /*spell*/) override
+ {
+ return ValidateSpellInfo({ SPELL_FROST_BLAST });
+ }
+
void FilterTargets(std::list& targets)
{
Unit* caster = GetCaster();
@@ -726,3 +687,4 @@ void AddSC_boss_kelthuzad_40()
// RegisterSpellScript(spell_kelthuzad_frost_blast);
// RegisterSpellScript(spell_kelthuzad_detonate_mana_aura);
}
+
diff --git a/src/naxx40Scripts/boss_loatheb_40.cpp b/src/naxx40Scripts/boss_loatheb_40.cpp
index 3776154..ee3fcea 100644
--- a/src/naxx40Scripts/boss_loatheb_40.cpp
+++ b/src/naxx40Scripts/boss_loatheb_40.cpp
@@ -15,29 +15,35 @@
* with this program. If not, see .
*/
-#include "ScriptMgr.h"
+#include "CreatureScript.h"
#include "ScriptedCreature.h"
#include "naxxramas.h"
enum Spells
{
+ // SPELL_CORRUPTED_MIND = 29201, // this triggers the following spells on targets (based on class): 29185, 29194, 29196, 29198
SPELL_NECROTIC_AURA = 55593,
- // SPELL_CORRUPTED_MIND = 29201, // this triggers the following spells on targets (based on class): 29185, 29194, 29196, 29198
- // SPELL_POISON_AURA = 29865, // does 200 dmg every second for 6 seconds with 1200 extra damage at the end. should do 196 dmg every 6 seconds. no extra damage at the end.
- SPELL_POISON_SHOCK = 22595, // does 180-220 aoe poison damage. if we let loatheb recast this every 6 seconds it's a possible fix for poison aura.
+ // SPELL_SUMMON_SPORE = 29234,
+ // SPELL_DEATHBLOOM_10 = 29865, // does 200 dmg every second for 6 seconds with 1200 extra damage at the end. should do 196 dmg every 6 seconds. no extra damage at the end.
+ SPELL_POISON_SHOCK = 22595, // does 180-220 aoe poison damage. if Loatheb recasts this every 6 seconds it's a possible fix for poison aura.
+ // SPELL_DEATHBLOOM_25 = 55053,
SPELL_INEVITABLE_DOOM = 29204,
+ //SPELL_INEVITABLE_DOOM_25 = 55052,
+ // SPELL_BERSERK = 26662, // he doesn't cast berserk in Naxx40
SPELL_REMOVE_CURSE = 30281 // He periodically removes all curses on himself
};
enum Events
{
- // EVENT_CORRUPTED_MIND = 1,
- EVENT_NECROTIC_AURA = 1,
- EVENT_POISON_SHOCK = 2,
+ // EVENT_CORRUPTED_MIND = 1, // Loatheb should cast Corrupted Mind instead of Necrotic Aura
+ EVENT_NECROTIC_AURA = 1,
+ // EVENT_DEATHBLOOM = 2,
+ EVENT_POISON_SHOCK = 2,
EVENT_INEVITABLE_DOOM = 3,
- EVENT_SUMMON_SPORE = 4,
- EVENT_REMOVE_CURSE = 5,
- EVENT_NECROTIC_AURA_FADING = 6,
+ // EVENT_BERSERK = 4,
+ EVENT_REMOVE_CURSE = 4,
+ EVENT_SUMMON_SPORE = 5,
+ EVENT_NECROTIC_AURA_FADING = 6,
EVENT_NECROTIC_AURA_REMOVED = 7
};
@@ -62,11 +68,9 @@ public:
{
explicit boss_loatheb_40AI(Creature* c) : BossAI(c, BOSS_LOATHEB), summons(me)
{
- pInstance = me->GetInstanceScript();
me->SetHomePosition(me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), me->GetOrientation());
}
- InstanceScript* pInstance;
uint8 doomCounter;
EventMap events;
SummonList summons;
@@ -77,14 +81,6 @@ public:
events.Reset();
summons.DespawnAll();
doomCounter = 0;
- if (pInstance)
- {
- pInstance->SetData(BOSS_LOATHEB, NOT_STARTED);
- if (GameObject* go = me->GetMap()->GetGameObject(pInstance->GetGuidData(DATA_LOATHEB_GATE)))
- {
- go->SetGoState(GO_STATE_ACTIVE);
- }
- }
}
void JustSummoned(Creature* cr) override
@@ -95,48 +91,33 @@ public:
void SummonedCreatureDies(Creature* /*cr*/, Unit*) override
{
- if (pInstance)
- {
- pInstance->SetData(DATA_SPORE_KILLED, 0);
- }
+ instance->SetData(DATA_SPORE_KILLED, 0);
}
void KilledUnit(Unit* who) override
{
- if (who->GetTypeId() == TYPEID_PLAYER && pInstance)
- {
- pInstance->SetData(DATA_IMMORTAL_FAIL, 0);
- }
+ if (who->IsPlayer())
+ instance->StorePersistentData(PERSISTENT_DATA_IMMORTAL_FAIL, 1);
}
void JustEngagedWith(Unit* who) override
{
BossAI::JustEngagedWith(who);
me->SetInCombatWithZone();
- // events.ScheduleEvent(EVENT_CORRUPTED_MIND, 5000);
- events.ScheduleEvent(EVENT_NECROTIC_AURA, 10000);
- events.ScheduleEvent(EVENT_POISON_SHOCK, 6000);
- events.ScheduleEvent(EVENT_INEVITABLE_DOOM, 120000);
- events.ScheduleEvent(EVENT_SUMMON_SPORE, 13000);
- events.ScheduleEvent(EVENT_REMOVE_CURSE, 5000);
- if (pInstance)
- {
- pInstance->SetData(BOSS_LOATHEB, IN_PROGRESS);
- if (GameObject* go = me->GetMap()->GetGameObject(pInstance->GetGuidData(DATA_LOATHEB_GATE)))
- {
- go->SetGoState(GO_STATE_READY);
- }
- }
+ // events.ScheduleEvent(EVENT_CORRUPTED_MIND, 5s);
+ events.ScheduleEvent(EVENT_NECROTIC_AURA, 10s);
+ // events.ScheduleEvent(EVENT_DEATHBLOOM, 5s);
+ events.ScheduleEvent(EVENT_POISON_SHOCK, 5s);
+ events.ScheduleEvent(EVENT_INEVITABLE_DOOM, 2min);
+ events.ScheduleEvent(EVENT_SUMMON_SPORE, 15s);
+ // events.ScheduleEvent(EVENT_BERSERK, 12min);
+ events.ScheduleEvent(EVENT_REMOVE_CURSE, 5s);
}
void JustDied(Unit* killer) override
{
BossAI::JustDied(killer);
summons.DespawnAll();
- if (pInstance)
- {
- pInstance->SetData(BOSS_LOATHEB, DONE);
- }
}
void UpdateAI(uint32 diff) override
@@ -151,20 +132,9 @@ public:
switch (events.ExecuteEvent())
{
case EVENT_SUMMON_SPORE:
- {
me->CastSpell(me, SPELL_SUMMON_SPORE, true);
- events.RepeatEvent(13000);
+ events.Repeat(13s);
break;
- }
- case EVENT_NECROTIC_AURA:
- {
- me->CastSpell(me, SPELL_NECROTIC_AURA, true);
- Talk(SAY_NECROTIC_AURA_APPLIED);
- events.ScheduleEvent(EVENT_NECROTIC_AURA_FADING, 14000);
- events.ScheduleEvent(EVENT_NECROTIC_AURA_REMOVED, 17000);
- events.RepeatEvent(20000);
- break;
- }
/*
case EVENT_CORRUPTED_MIND:
{
@@ -179,49 +149,56 @@ public:
break;
}
*/
- case EVENT_POISON_SHOCK:
- {
- if (me->CastSpell(me, SPELL_POISON_SHOCK, true) == SPELL_CAST_OK)
- {
+ case EVENT_NECROTIC_AURA:
+ me->CastSpell(me, SPELL_NECROTIC_AURA, true);
+ Talk(SAY_NECROTIC_AURA_APPLIED);
+ events.ScheduleEvent(EVENT_NECROTIC_AURA_FADING, 14s);
+ events.ScheduleEvent(EVENT_NECROTIC_AURA_REMOVED, 17s);
+ events.Repeat(20s);
+ break;
+ /*
+ case EVENT_DEATHBLOOM:
+ {
+ int32 bp0 = 33; // TODO: Amplitude should be 6k, but is 1k. 200 dmg after 6 seconds
+ me->CastCustomSpell(me, SPELL_DEATHBLOOM_10, &bp0, 0, 0, false);
+ events.Repeat(30s);
+ break;
+ }
+ */
+ case EVENT_POISON_SHOCK:
+ if (me->CastSpell(me, SPELL_POISON_SHOCK, true) == SPELL_CAST_OK)
events.RepeatEvent(6000);
- }
- else
- {
- events.RepeatEvent(100);
- }
- break;
- }
+ else
+ events.RepeatEvent(100);
+ break;
case EVENT_INEVITABLE_DOOM:
{
int32 bp0 = 2549;
-
+
if (me->CastCustomSpell(me, SPELL_INEVITABLE_DOOM, &bp0, 0, 0, false) == SPELL_CAST_OK)
{
- doomCounter++;
- events.RepeatEvent(doomCounter < 6 ? 30000 : 15000);
- }
- else
- {
- events.RepeatEvent(100);
- }
+ doomCounter++;
+ events.Repeat(doomCounter < 6 ? 30s : 15s);
+ }
+ else
+ events.RepeatEvent(100);
break;
}
+ /*
+ case EVENT_BERSERK:
+ me->CastSpell(me, SPELL_BERSERK, true);
+ break;
+ */
case EVENT_REMOVE_CURSE:
- {
me->CastSpell(me, SPELL_REMOVE_CURSE, true);
- events.RepeatEvent(30000);
+ events.Repeat(30s);
break;
- }
case EVENT_NECROTIC_AURA_FADING:
- {
Talk(SAY_NECROTIC_AURA_FADING);
break;
- }
case EVENT_NECROTIC_AURA_REMOVED:
- {
Talk(SAY_NECROTIC_AURA_REMOVED);
break;
- }
}
DoMeleeAttackIfReady();
}
@@ -237,54 +214,11 @@ public:
return false;
}
return true;
- }
+ }
};
};
-
-/*
-// 29201 - Corrupted Mind (Loatheb)
-class spell_loatheb_corrupted_mind_aoe_40 : public SpellScript
-{
- PrepareSpellScript(spell_loatheb_corrupted_mind_aoe_40);
-
- void HandleEffect(Spell* spell, SpellEffIndex effIndex)
- {
- // Loatheb Corrupted Mind triggered sub spells
- uint32 spellid;
- switch (spell->GetTarget()->GetClass())
- {
- // priests should be getting 29185, but it triggers on dmg effects as well, don't know why.
- case CLASS_PRIEST: spellid = 29194; break;//29185; break;
- case CLASS_DRUID: spellid = 29194; break;
- case CLASS_PALADIN: spellid = 29196; break;
- case CLASS_SHAMAN: spellid = 29198; break;
- default: return false;
- }
- spell->me->CastSpell(spell->GetTarget(), spellid, true);
- }
-
- void Register() override
- {
- OnEffectHitTarget += SpellEffectFn(spell_loatheb_corrupted_mind_aoe_40::HandleEffect, SPELL_CORRUPTED_MIND, EFFECT_0, SPELL_AURA_PROC_TRIGGER_SPELL);
- }
-};
-
-class spell_loatheb_corrupted_mind_loader : public SpellScriptLoader
-{
-public:
- spell_loatheb_corrupted_mind_loader() : SpellScriptLoader("spell_loatheb_corrupted_mind_aoe_40") { }
-
- SpellScript* GetSpellScript() const override
- {
- return new spell_loatheb_corrupted_mind_aoe_40();
- }
-};
-*/
-
void AddSC_boss_loatheb_40()
{
new boss_loatheb_40();
- // new spell_loatheb_corrupted_mind_loader();
-
}
diff --git a/src/naxx40Scripts/boss_maexxna_40.cpp b/src/naxx40Scripts/boss_maexxna_40.cpp
index 8c8757e..946338c 100644
--- a/src/naxx40Scripts/boss_maexxna_40.cpp
+++ b/src/naxx40Scripts/boss_maexxna_40.cpp
@@ -16,8 +16,8 @@
*/
#include "CreatureScript.h"
-#include "Player.h"
#include "PassiveAI.h"
+#include "Player.h"
#include "ScriptedCreature.h"
#include "SpellAuraEffects.h"
#include "SpellScript.h"
@@ -26,36 +26,42 @@
enum Spells
{
- SPELL_WEB_SPRAY = 29484,
- SPELL_POISON_SHOCK = 28741,
- SPELL_NECROTIC_POISON = 54121,
- SPELL_FRENZY = 54123,
+ SPELL_WEB_SPRAY_10 = 29484,
+ SPELL_WEB_SPRAY_25 = 54125,
+ SPELL_POISON_SHOCK_10 = 28741,
+ SPELL_POISON_SHOCK_25 = 54122,
+ SPELL_NECROTIC_POISON_10 = 54121,
+ SPELL_NECROTIC_POISON_25 = 28776,
+ SPELL_FRENZY_10 = 54123,
+ SPELL_FRENZY_25 = 54124,
SPELL_WEB_WRAP_STUN = 28622,
SPELL_WEB_WRAP_SUMMON = 28627,
- SPELL_WEB_WRAP_PACIFY_5 = 28618
+ SPELL_WEB_WRAP_KILL_WEBS = 52512,
+ SPELL_WEB_WRAP_PACIFY_5 = 28618 // 5 seconds pacify silence
};
enum Events
{
- EVENT_WEB_SPRAY = 1,
- EVENT_POISON_SHOCK = 2,
- EVENT_NECROTIC_POISON = 3,
- EVENT_WEB_WRAP = 4,
- EVENT_HEALTH_CHECK = 5,
- EVENT_SUMMON_SPIDERLINGS = 6,
- EVENT_WEB_WRAP_APPLY_STUN = 7
+ EVENT_WEB_SPRAY = 1,
+ EVENT_POISON_SHOCK = 2,
+ EVENT_NECROTIC_POISON = 3,
+ EVENT_WEB_WRAP = 4,
+ EVENT_HEALTH_CHECK = 5,
+ EVENT_SUMMON_SPIDERLINGS = 6,
+ EVENT_WEB_WRAP_APPLY_STUN = 7
};
+
enum Emotes
{
- EMOTE_SPIDERS = 0,
- EMOTE_WEB_WRAP = 1,
- EMOTE_WEB_SPRAY = 2
+ EMOTE_SPIDERS = 0,
+ EMOTE_WEB_WRAP = 1,
+ EMOTE_WEB_SPRAY = 2
};
enum Misc
{
- NPC_WEB_WRAP = 351079,
- NPC_MAEXXNA_SPIDERLING = 351088
+ // NPC_WEB_WRAP = 16486,
+ // NPC_MAEXXNA_SPIDERLING = 17055
};
const Position PosWrap[7] =
@@ -100,13 +106,11 @@ public:
struct boss_maexxna_40AI : public BossAI
{
explicit boss_maexxna_40AI(Creature* c) : BossAI(c, BOSS_MAEXXNA), summons(me)
- {
- pInstance = me->GetInstanceScript();
- }
+ {}
- InstanceScript* pInstance;
EventMap events;
SummonList summons;
+
GuidList wraps;
bool IsInRoom()
@@ -124,13 +128,6 @@ public:
BossAI::Reset();
events.Reset();
summons.DespawnAll();
- if (pInstance)
- {
- if (GameObject* go = me->GetMap()->GetGameObject(pInstance->GetGuidData(DATA_MAEXXNA_GATE)))
- {
- go->SetGoState(GO_STATE_ACTIVE);
- }
- }
}
void JustEngagedWith(Unit* who) override
@@ -143,13 +140,6 @@ public:
events.ScheduleEvent(EVENT_NECROTIC_POISON, 5s);
events.ScheduleEvent(EVENT_HEALTH_CHECK, 1s);
events.ScheduleEvent(EVENT_SUMMON_SPIDERLINGS, 30s);
- if (pInstance)
- {
- if (GameObject* go = me->GetMap()->GetGameObject(pInstance->GetGuidData(DATA_MAEXXNA_GATE)))
- {
- go->SetGoState(GO_STATE_READY);
- }
- }
}
void JustSummoned(Creature* cr) override
@@ -167,13 +157,11 @@ public:
void KilledUnit(Unit* who) override
{
- if (who->GetTypeId() == TYPEID_PLAYER && pInstance)
- {
- pInstance->SetData(DATA_IMMORTAL_FAIL, 0);
- }
+ if (who->IsPlayer())
+ instance->StorePersistentData(PERSISTENT_DATA_IMMORTAL_FAIL, 1);
}
- void JustDied(Unit* killer) override
+ void JustDied(Unit* killer) override
{
BossAI::JustDied(killer);
}
@@ -181,7 +169,7 @@ public:
void DoCastWebWrap()
{
std::list candidates;
- SelectTargetList(candidates, 2, SelectTargetMethod::Random, 0, WebTargetSelector(me));
+ SelectTargetList(candidates, RAID_MODE(1, 2, 2, 2), SelectTargetMethod::Random, 0, WebTargetSelector(me));
std::vector positions {0, 1, 2, 3, 4, 5, 6};
Acore::Containers::RandomShuffle(positions);
@@ -189,7 +177,7 @@ public:
if (candidates.empty())
return;
- for (int i = 0; i < 2 ; i++)
+ for (int i = 0; i < RAID_MODE(1, 2, 2, 2); i++)
{
if (candidates.empty())
break;
@@ -241,55 +229,52 @@ public:
switch (events.ExecuteEvent())
{
- case EVENT_WEB_SPRAY:
- Talk(EMOTE_WEB_SPRAY);
- me->CastCustomSpell(SPELL_WEB_SPRAY, SPELLVALUE_AURA_DURATION, 10000, nullptr, true);
- events.RepeatEvent(40000);
- break;
- case EVENT_POISON_SHOCK:
- {
- int32 bp0 = 1499;
- me->CastCustomSpell(me->GetVictim(), SPELL_POISON_SHOCK, &bp0, nullptr, nullptr, false, nullptr, nullptr, me->GetGUID());
- events.RepeatEvent(10000);
- break;
- }
- case EVENT_NECROTIC_POISON:
- me->CastSpell(me->GetVictim(), SPELL_NECROTIC_POISON, false);
- events.RepeatEvent(30000);
- break;
- case EVENT_SUMMON_SPIDERLINGS:
- Talk(EMOTE_SPIDERS);
- for (uint8 i = 0; i < 10; ++i)
+ case EVENT_WEB_SPRAY:
+ Talk(EMOTE_WEB_SPRAY);
+ me->CastSpell(me, RAID_MODE(SPELL_WEB_SPRAY_10, SPELL_WEB_SPRAY_25, SPELL_WEB_SPRAY_10, SPELL_WEB_SPRAY_25), true);
+ events.Repeat(40s);
+ break;
+ case EVENT_POISON_SHOCK:
+ me->CastSpell(me->GetVictim(), RAID_MODE(SPELL_POISON_SHOCK_10, SPELL_POISON_SHOCK_25, SPELL_POISON_SHOCK_10, SPELL_POISON_SHOCK_25), false);
+ events.Repeat(10s);
+ break;
+ case EVENT_NECROTIC_POISON:
+ me->CastSpell(me->GetVictim(), RAID_MODE(SPELL_NECROTIC_POISON_10, SPELL_NECROTIC_POISON_25, SPELL_NECROTIC_POISON_10, SPELL_NECROTIC_POISON_25), false);
+ events.Repeat(30s);
+ break;
+ case EVENT_SUMMON_SPIDERLINGS:
+ Talk(EMOTE_SPIDERS);
+ for (uint8 i = 0; i < 8; ++i)
+ {
+ me->SummonCreature(NPC_MAEXXNA_SPIDERLING, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), me->GetOrientation());
+ }
+ events.Repeat(40s);
+ break;
+ case EVENT_HEALTH_CHECK:
+ if (me->GetHealthPct() < 30)
+ {
+ me->CastSpell(me, RAID_MODE(SPELL_FRENZY_10, SPELL_FRENZY_25, SPELL_FRENZY_10, SPELL_FRENZY_25), true);
+ break;
+ }
+ events.Repeat(1s);
+ break;
+ case EVENT_WEB_WRAP:
+ Talk(EMOTE_WEB_WRAP);
+ DoCastWebWrap();
+ events.Repeat(40s);
+ break;
+ case EVENT_WEB_WRAP_APPLY_STUN:
{
- me->SummonCreature(NPC_MAEXXNA_SPIDERLING, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), me->GetOrientation());
- }
- events.RepeatEvent(40000);
- break;
- case EVENT_HEALTH_CHECK:
- if (me->GetHealthPct() < 30)
- {
- me->CastSpell(me, SPELL_FRENZY, true);
+ for (auto& p : wraps)
+ {
+ if (Player* player = ObjectAccessor::GetPlayer(*me, p))
+ {
+ player->CastSpell(player, SPELL_WEB_WRAP_STUN, true);
+ }
+ }
+ wraps.clear();
break;
}
- events.RepeatEvent(1000);
- break;
- case EVENT_WEB_WRAP:
- Talk(EMOTE_WEB_WRAP);
- DoCastWebWrap();
- events.Repeat(40s);
- break;
- case EVENT_WEB_WRAP_APPLY_STUN:
- {
- for (auto& p : wraps)
- {
- if (Player* player = ObjectAccessor::GetPlayer(*me, p))
- {
- player->CastSpell(player, SPELL_WEB_WRAP_STUN, true);
- }
- }
- wraps.clear();
- break;
- }
}
DoMeleeAttackIfReady();
}
@@ -325,8 +310,11 @@ public:
{
if (Unit* victim = ObjectAccessor::GetUnit(*me, victimGUID))
{
- victim->RemoveAurasDueToSpell(SPELL_WEB_WRAP_SUMMON);
- victim->RemoveAurasDueToSpell(SPELL_WEB_WRAP_STUN);
+ if (victim->IsAlive())
+ {
+ victim->RemoveAurasDueToSpell(SPELL_WEB_WRAP_STUN);
+ victim->RemoveAurasDueToSpell(SPELL_WEB_WRAP_SUMMON_40);
+ }
}
}
}
@@ -339,7 +327,7 @@ public:
{
if (!victim->IsAlive())
{
- me->KillSelf();
+ me->CastSpell(me, SPELL_WEB_WRAP_KILL_WEBS, true);
}
}
}
@@ -354,14 +342,17 @@ public:
bool Validate(SpellInfo const* /*spellInfo*/) override
{
- return ValidateSpellInfo({ SPELL_WEB_WRAP_SUMMON });
+ return ValidateSpellInfo({ SPELL_WEB_WRAP_SUMMON_40 });
}
void OnPeriodic(AuraEffect const* aurEff)
{
if (aurEff->GetTickNumber() == 2)
{
- GetTarget()->CastSpell(GetTarget(), SPELL_WEB_WRAP_SUMMON, true);
+ if (GetCaster()->GetMap()->GetDifficulty() == RAID_DIFFICULTY_10MAN_HEROIC)
+ GetTarget()->CastSpell(GetTarget(), SPELL_WEB_WRAP_SUMMON_40, true);
+ else
+ GetTarget()->CastSpell(GetTarget(), SPELL_WEB_WRAP_SUMMON, true);
}
}
diff --git a/src/naxx40Scripts/boss_noth_40.cpp b/src/naxx40Scripts/boss_noth_40.cpp
index 88d29f4..dbe5790 100644
--- a/src/naxx40Scripts/boss_noth_40.cpp
+++ b/src/naxx40Scripts/boss_noth_40.cpp
@@ -15,10 +15,8 @@
* with this program. If not, see .
*/
-#include "ScriptMgr.h"
+#include "CreatureScript.h"
#include "ScriptedCreature.h"
-#include "SpellAuraEffects.h"
-#include "SpellScript.h"
#include "naxxramas.h"
enum Says
@@ -36,9 +34,10 @@ enum Says
enum Spells
{
- SPELL_CURSE_OF_THE_PLAGUEBRINGER = 29213,
- SPELL_REVENGE_OF_THE_PLAGUEBRINGER = 29214,
- SPELL_CRIPPLE = 29212,
+ SPELL_CURSE_OF_THE_PLAGUEBRINGER_10 = 29213,
+ SPELL_CURSE_OF_THE_PLAGUEBRINGER_25 = 54835,
+ SPELL_CRIPPLE_10 = 29212,
+ SPELL_CRIPPLE_25 = 54814,
SPELL_SUMMON_PLAGUED_WARRIORS = 29237,
SPELL_TELEPORT = 29216,
SPELL_TELEPORT_BACK = 29231,
@@ -61,9 +60,9 @@ enum Events
enum Misc
{
- NPC_PLAGUED_WARRIOR = 351087,
- NPC_PLAGUED_CHAMPION = 351086,
- NPC_PLAGUED_GUARDIAN = 351085
+ // NPC_PLAGUED_WARRIOR = 16984,
+ // NPC_PLAGUED_CHAMPION = 16983,
+ // NPC_PLAGUED_GUARDIAN = 16981
};
const Position summoningPosition[5] =
@@ -90,11 +89,8 @@ public:
struct boss_noth_40AI : public BossAI
{
explicit boss_noth_40AI(Creature* c) : BossAI(c, BOSS_NOTH), summons(me)
- {
- pInstance = me->GetInstanceScript();
- }
+ {}
- InstanceScript* pInstance;
uint8 timesInBalcony;
EventMap events;
SummonList summons;
@@ -105,12 +101,12 @@ public:
me->RemoveUnitFlag(UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_DISABLE_MOVE);
me->SetControlled(false, UNIT_STATE_ROOT);
events.Reset();
- events.ScheduleEvent(EVENT_MOVE_TO_BALCONY, 110000);
- //events.ScheduleEvent(EVENT_CURSE, urand(50000, 60000)); // more curses, down from 150s to 50-60s
- events.ScheduleEvent(EVENT_SUMMON_PLAGUED_WARRIOR_ANNOUNCE, 10000);
+ events.ScheduleEvent(EVENT_MOVE_TO_BALCONY, 110s);
+ events.ScheduleEvent(EVENT_CURSE, 15s);
+ events.ScheduleEvent(EVENT_SUMMON_PLAGUED_WARRIOR_ANNOUNCE, 10s);
if (Is25ManRaid())
{
- events.ScheduleEvent(EVENT_BLINK, 26000);
+ events.ScheduleEvent(EVENT_BLINK, 26s);
}
}
@@ -121,8 +117,8 @@ public:
me->SetUnitFlag(UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_DISABLE_MOVE);
me->SetControlled(true, UNIT_STATE_ROOT);
events.Reset();
- events.ScheduleEvent(EVENT_BALCONY_SUMMON_ANNOUNCE, 4000);
- events.ScheduleEvent(EVENT_MOVE_TO_GROUND, 70000);
+ events.ScheduleEvent(EVENT_BALCONY_SUMMON_ANNOUNCE, 4s);
+ events.ScheduleEvent(EVENT_MOVE_TO_GROUND, 70s);
}
void SummonHelper(uint32 entry, uint32 count)
@@ -152,13 +148,6 @@ public:
me->SetControlled(false, UNIT_STATE_ROOT);
me->SetReactState(REACT_AGGRESSIVE);
timesInBalcony = 0;
- if (pInstance)
- {
- if (GameObject* go = me->GetMap()->GetGameObject(pInstance->GetGuidData(DATA_NOTH_ENTRY_GATE)))
- {
- go->SetGoState(GO_STATE_ACTIVE);
- }
- }
}
void EnterEvadeMode(EvadeReason why) override
@@ -172,13 +161,6 @@ public:
BossAI::JustEngagedWith(who);
Talk(SAY_AGGRO);
StartGroundPhase();
- if (pInstance)
- {
- if (GameObject* go = me->GetMap()->GetGameObject(pInstance->GetGuidData(DATA_NOTH_ENTRY_GATE)))
- {
- go->SetGoState(GO_STATE_READY);
- }
- }
}
void JustSummoned(Creature* summon) override
@@ -196,25 +178,15 @@ public:
}
BossAI::JustDied(killer);
Talk(SAY_DEATH);
- if (pInstance)
- {
- if (GameObject* go = me->GetMap()->GetGameObject(pInstance->GetGuidData(DATA_NOTH_ENTRY_GATE)))
- {
- go->SetGoState(GO_STATE_ACTIVE);
- }
- }
}
void KilledUnit(Unit* who) override
{
- if (who->GetTypeId() != TYPEID_PLAYER)
+ if (!who->IsPlayer())
return;
Talk(SAY_SLAY);
- if (pInstance)
- {
- pInstance->SetData(DATA_IMMORTAL_FAIL, 0);
- }
+ instance->StorePersistentData(PERSISTENT_DATA_IMMORTAL_FAIL, 1);
}
void UpdateAI(uint32 diff) override
@@ -235,19 +207,19 @@ public:
case EVENT_CURSE:
if (events.GetPhaseMask() == 0)
{
- me->CastCustomSpell(SPELL_CURSE_OF_THE_PLAGUEBRINGER, SPELLVALUE_MAX_TARGETS, 10, me, false); // TODO: Increase to 20 on 40man
+ me->CastCustomSpell(SPELL_CURSE_OF_THE_PLAGUEBRINGER_10, SPELLVALUE_MAX_TARGETS, 10, me, false); // TODO: Increase to 20 on 40man
}
- events.RepeatEvent(25000); // 50-60 seconds in 40man
+ events.Repeat(25s); // 50-60 seconds in 40man
break;
case EVENT_SUMMON_PLAGUED_WARRIOR_ANNOUNCE:
Talk(SAY_SUMMON);
Talk(EMOTE_SUMMON);
- events.RepeatEvent(30000);
- events.ScheduleEvent(EVENT_SUMMON_PLAGUED_WARRIOR_REAL, 4000);
+ events.Repeat(30s);
+ events.ScheduleEvent(EVENT_SUMMON_PLAGUED_WARRIOR_REAL, 4s);
break;
case EVENT_SUMMON_PLAGUED_WARRIOR_REAL:
me->CastSpell(me, SPELL_SUMMON_PLAGUED_WARRIORS, true);
- SummonHelper(NPC_PLAGUED_WARRIOR, 3);
+ SummonHelper(NPC_PLAGUED_WARRIOR, RAID_MODE(2, 3, 3, 3));
break;
case EVENT_MOVE_TO_BALCONY:
Talk(EMOTE_TELEPORT_BALCONY);
@@ -256,30 +228,30 @@ public:
break;
case EVENT_BLINK:
DoResetThreatList();
- me->CastSpell(me, SPELL_CRIPPLE, false);
+ me->CastSpell(me, RAID_MODE(SPELL_CRIPPLE_10, SPELL_CRIPPLE_25, SPELL_CRIPPLE_10, SPELL_CRIPPLE_25), false);
me->CastSpell(me, SPELL_BLINK, true);
Talk(EMOTE_BLINK);
- events.RepeatEvent(30000);
+ events.Repeat(30s);
break;
// BALCONY
case EVENT_BALCONY_SUMMON_ANNOUNCE:
Talk(EMOTE_SUMMON_WAVE);
- events.RepeatEvent(30000);
- events.ScheduleEvent(EVENT_BALCONY_SUMMON_REAL, 4000);
+ events.Repeat(30s);
+ events.ScheduleEvent(EVENT_BALCONY_SUMMON_REAL, 4s);
break;
case EVENT_BALCONY_SUMMON_REAL:
me->CastSpell(me, SPELL_SUMMON_PLAGUED_WARRIORS, true); // visual
switch (timesInBalcony)
{
case 0:
- SummonHelper(NPC_PLAGUED_CHAMPION, 4);
+ SummonHelper(NPC_PLAGUED_CHAMPION, RAID_MODE(2, 4, 4, 4));
break;
case 1:
- SummonHelper(NPC_PLAGUED_CHAMPION, 2);
- SummonHelper(NPC_PLAGUED_GUARDIAN, 2);
+ SummonHelper(NPC_PLAGUED_CHAMPION, RAID_MODE(1, 2, 2, 2));
+ SummonHelper(NPC_PLAGUED_GUARDIAN, RAID_MODE(1, 2, 2, 2));
break;
default:
- SummonHelper(NPC_PLAGUED_GUARDIAN, 4);
+ SummonHelper(NPC_PLAGUED_GUARDIAN, RAID_MODE(2, 4, 4, 4));
break;
}
break;
diff --git a/src/naxx40Scripts/boss_patchwerk_40.cpp b/src/naxx40Scripts/boss_patchwerk_40.cpp
index 1c61e43..64afec1 100644
--- a/src/naxx40Scripts/boss_patchwerk_40.cpp
+++ b/src/naxx40Scripts/boss_patchwerk_40.cpp
@@ -15,7 +15,7 @@
* with this program. If not, see .
*/
-#include "ScriptMgr.h"
+#include "CreatureScript.h"
#include "ScriptedCreature.h"
#include "naxxramas.h"
@@ -30,7 +30,8 @@ enum Yells
enum Spells
{
- SPELL_HATEFUL_STRIKE = 28308,
+ SPELL_HATEFUL_STRIKE_10 = 41926,
+ SPELL_HATEFUL_STRIKE_25 = 59192,
SPELL_FRENZY = 28131,
SPELL_BERSERK = 26662,
SPELL_SLIME_BOLT = 32309
@@ -44,6 +45,11 @@ enum Events
EVENT_BERSERK = 4
};
+enum Misc
+{
+ ACHIEV_TIMED_START_EVENT = 10286
+};
+
class boss_patchwerk_40 : public CreatureScript
{
public:
@@ -57,12 +63,9 @@ public:
struct boss_patchwerk_40AI : public BossAI
{
explicit boss_patchwerk_40AI(Creature* c) : BossAI(c, BOSS_PATCHWERK)
- {
- pInstance = me->GetInstanceScript();
- }
+ {}
EventMap events;
- InstanceScript* pInstance;
void Reset() override
{
@@ -72,17 +75,13 @@ public:
void KilledUnit(Unit* who) override
{
- if (who->GetTypeId() != TYPEID_PLAYER)
+ if (!who->IsPlayer())
return;
if (!urand(0, 3))
- {
Talk(SAY_SLAY);
- }
- if (pInstance)
- {
- pInstance->SetData(DATA_IMMORTAL_FAIL, 0);
- }
+
+ instance->StorePersistentData(PERSISTENT_DATA_IMMORTAL_FAIL, 1);
}
void JustDied(Unit* killer) override
@@ -96,9 +95,10 @@ public:
BossAI::JustEngagedWith(who);
Talk(SAY_AGGRO);
me->SetInCombatWithZone();
- events.ScheduleEvent(EVENT_HATEFUL_STRIKE, 1200);
- events.ScheduleEvent(EVENT_BERSERK, 7 * 60 * 1000); // 7 minutes enrange
- events.ScheduleEvent(EVENT_HEALTH_CHECK, 1000);
+ events.ScheduleEvent(EVENT_HATEFUL_STRIKE, 1200ms);
+ events.ScheduleEvent(EVENT_BERSERK, 7min); // 7 minutes enrange
+ events.ScheduleEvent(EVENT_HEALTH_CHECK, 1s);
+ // instance->DoStartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_TIMED_START_EVENT);
}
void UpdateAI(uint32 diff) override
@@ -113,7 +113,7 @@ public:
switch (events.ExecuteEvent())
{
case EVENT_HATEFUL_STRIKE:
- {
+ {
// Cast Hateful strike on the player with the highest amount of HP within melee distance, and second threat amount
std::list meleeRangeTargets;
Unit* finalTarget = nullptr;
@@ -156,19 +156,19 @@ public:
if (finalTarget)
{
int32 dmg = urand(22100,22850);
- me->CastCustomSpell(finalTarget, SPELL_HATEFUL_STRIKE, &dmg, 0, 0, false);
+ me->CastCustomSpell(finalTarget, SPELL_HATEFUL_STRIKE_10, &dmg, 0, 0, false);
}
- events.RepeatEvent(1200);
+ events.Repeat(1200ms);
break;
}
case EVENT_BERSERK:
Talk(EMOTE_BERSERK);
me->CastSpell(me, SPELL_BERSERK, true);
- events.ScheduleEvent(EVENT_SLIME_BOLT, 3000);
+ events.ScheduleEvent(EVENT_SLIME_BOLT, 3s);
break;
case EVENT_SLIME_BOLT:
me->CastSpell(me, SPELL_SLIME_BOLT, false);
- events.RepeatEvent(3000);
+ events.Repeat(3s);
break;
case EVENT_HEALTH_CHECK:
if (me->GetHealthPct() <= 5)
@@ -177,7 +177,7 @@ public:
me->CastSpell(me, SPELL_FRENZY, true);
break;
}
- events.RepeatEvent(1000);
+ events.Repeat(1s);
break;
}
DoMeleeAttackIfReady();
diff --git a/src/naxx40Scripts/boss_razuvious_40.cpp b/src/naxx40Scripts/boss_razuvious_40.cpp
index 057cc58..abdd833 100644
--- a/src/naxx40Scripts/boss_razuvious_40.cpp
+++ b/src/naxx40Scripts/boss_razuvious_40.cpp
@@ -18,6 +18,7 @@
#include "CreatureScript.h"
#include "ScriptedCreature.h"
#include "naxxramas.h"
+#include "SpellInfo.h"
enum Says
{
@@ -48,7 +49,7 @@ enum Events
enum NPCs
{
- NPC_DEATH_KNIGHT_UNDERSTUDY = 351084,
+ // NPC_DEATH_KNIGHT_UNDERSTUDY = 351084,
NPC_TARGET_DUMMY = 16211,
};
@@ -80,13 +81,10 @@ public:
struct boss_razuvious_40AI : public BossAI
{
explicit boss_razuvious_40AI(Creature* c) : BossAI(c, BOSS_RAZUVIOUS), summons(me)
- {
- pInstance = me->GetInstanceScript();
- }
+ {}
EventMap events;
SummonList summons;
- InstanceScript* pInstance;
void SpawnHelpers()
{
@@ -207,19 +205,16 @@ public:
void KilledUnit(Unit* who) override
{
if (roll_chance_i(30))
- {
Talk(SAY_SLAY);
- }
- if (who->GetTypeId() == TYPEID_PLAYER && pInstance)
- {
- pInstance->SetData(DATA_IMMORTAL_FAIL, 0);
- }
+
+ if (who->IsPlayer())
+ instance->StorePersistentData(PERSISTENT_DATA_IMMORTAL_FAIL, 1);
}
void DamageTaken(Unit* who, uint32& damage, DamageEffectType, SpellSchoolMask) override
{
// Damage done by the controlled Death Knight understudies should also count toward damage done by players
- if(who && who->GetTypeId() == TYPEID_UNIT && who->GetEntry() == NPC_DEATH_KNIGHT_UNDERSTUDY)
+ if (who && who->IsCreature() && who->GetEntry() == NPC_DEATH_KNIGHT_UNDERSTUDY)
{
me->LowerPlayerDamageReq(damage);
}
@@ -331,13 +326,8 @@ public:
scheduler.CancelGroup(GROUP_OOC_RP);
me->SetSheath(SHEATH_STATE_UNARMED);
me->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_STATE_NONE);
- if (InstanceScript* instance = me->GetInstanceScript())
- {
- if (Creature* creature = instance->GetCreature(DATA_RAZUVIOUS_40))
- {
- me->SetFacingToObject(creature);
- }
- }
+ if (Creature* creature = me->GetInstanceScript()->GetCreature(DATA_RAZUVIOUS_BOSS))
+ me->SetFacingToObject(creature);
break;
case ACTION_TALK:
Talk(SAY_DEATH_KNIGHT_UNDERSTUDY);
@@ -357,22 +347,18 @@ public:
void KilledUnit(Unit* who) override
{
- if (who->GetTypeId() == TYPEID_PLAYER && me->GetInstanceScript())
- {
- me->GetInstanceScript()->SetData(DATA_IMMORTAL_FAIL, 0);
- }
+ if (who->IsPlayer())
+ me->GetInstanceScript()->StorePersistentData(PERSISTENT_DATA_IMMORTAL_FAIL, 1);
}
void JustEngagedWith(Unit* who) override
{
scheduler.CancelGroup(GROUP_OOC_RP);
- if (InstanceScript* instance = me->GetInstanceScript())
+
+ if (Creature* creature = me->GetInstanceScript()->GetCreature(DATA_RAZUVIOUS_BOSS))
{
- if (Creature* creature = instance->GetCreature(DATA_RAZUVIOUS_40))
- {
- creature->SetInCombatWithZone();
- creature->AI()->AttackStart(who);
- }
+ creature->SetInCombatWithZone();
+ creature->AI()->AttackStart(who);
}
}
diff --git a/src/naxx40Scripts/boss_sapphiron_40.cpp b/src/naxx40Scripts/boss_sapphiron_40.cpp
index 88f8b41..d8f14b1 100644
--- a/src/naxx40Scripts/boss_sapphiron_40.cpp
+++ b/src/naxx40Scripts/boss_sapphiron_40.cpp
@@ -104,12 +104,9 @@ public:
struct boss_sapphiron_40AI : public BossAI
{
explicit boss_sapphiron_40AI(Creature* c) : BossAI(c, BOSS_SAPPHIRON)
- {
- pInstance = me->GetInstanceScript();
- }
+ {}
EventMap events;
- InstanceScript* pInstance;
uint8 iceboltCount{};
uint32 spawnTimer{};
GuidList blockList;
@@ -117,7 +114,7 @@ public:
void InitializeAI() override
{
- if (pInstance->GetBossState(BOSS_SAPPHIRON) != DONE)
+ if (instance->GetBossState(BOSS_SAPPHIRON) != DONE)
{
me->SummonGameObject(GO_SAPPHIRON_BIRTH, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), 0, 0, 0, 0, 0, 0);
me->SetVisible(false);
@@ -157,7 +154,7 @@ public:
if (PlList.IsEmpty())
return;
- for (const auto& i : PlList)
+ for (auto const& i : PlList)
{
if (Player* player = i.GetSource())
{
@@ -179,20 +176,16 @@ public:
BossAI::JustEngagedWith(who);
EnterCombatSelfFunction();
if (isNaxx40Sapp(me->GetEntry()))
- {
me->CastSpell(me, SPELL_FROST_AURA, true);
- }
else
- {
me->CastSpell(me, RAID_MODE(SPELL_FROST_AURA_10, SPELL_FROST_AURA_25), true);
- }
- events.ScheduleEvent(EVENT_BERSERK, 900000);
- events.ScheduleEvent(EVENT_CLEAVE, 5000);
- events.ScheduleEvent(EVENT_TAIL_SWEEP, 10000);
- events.ScheduleEvent(EVENT_LIFE_DRAIN, 17000);
- events.ScheduleEvent(EVENT_BLIZZARD, 17000);
- events.ScheduleEvent(EVENT_FLIGHT_START, 45000);
- events.ScheduleEvent(EVENT_HUNDRED_CLUB, 5000);
+ events.ScheduleEvent(EVENT_BERSERK, 15min);
+ events.ScheduleEvent(EVENT_CLEAVE, 5s);
+ events.ScheduleEvent(EVENT_TAIL_SWEEP, 10s);
+ events.ScheduleEvent(EVENT_LIFE_DRAIN, 17s);
+ events.ScheduleEvent(EVENT_BLIZZARD, 17s);
+ events.ScheduleEvent(EVENT_FLIGHT_START, 45s);
+ events.ScheduleEvent(EVENT_HUNDRED_CLUB, 5s);
}
void JustDied(Unit* killer) override
@@ -213,7 +206,7 @@ public:
{
if (type == POINT_MOTION_TYPE && id == POINT_CENTER)
{
- events.ScheduleEvent(EVENT_FLIGHT_LIFTOFF, 500);
+ events.ScheduleEvent(EVENT_FLIGHT_LIFTOFF, 500ms);
}
}
@@ -243,10 +236,8 @@ public:
void KilledUnit(Unit* who) override
{
- if (who->GetTypeId() == TYPEID_PLAYER && pInstance)
- {
- pInstance->SetData(DATA_IMMORTAL_FAIL, 0);
- }
+ if (who->IsPlayer())
+ instance->StorePersistentData(PERSISTENT_DATA_IMMORTAL_FAIL, 1);
}
void UpdateAI(uint32 diff) override
@@ -282,18 +273,11 @@ public:
return;
case EVENT_CLEAVE:
me->CastSpell(me->GetVictim(), SPELL_CLEAVE, false);
- events.RepeatEvent(10000);
+ events.Repeat(10s);
return;
case EVENT_TAIL_SWEEP:
- if (isNaxx40Sapp(me->GetEntry()))
- {
- me->CastSpell(me, SPELL_TAIL_SWEEP, false);
- }
- else
- {
- me->CastSpell(me, RAID_MODE(SPELL_TAIL_SWEEP_10, SPELL_TAIL_SWEEP_25), false);
- }
- events.RepeatEvent(10000);
+ me->CastSpell(me, RAID_MODE(SPELL_TAIL_SWEEP_10, SPELL_TAIL_SWEEP_25, SPELL_TAIL_SWEEP, SPELL_TAIL_SWEEP_25), false);
+ events.Repeat(10s);
return;
case EVENT_LIFE_DRAIN:
if (isNaxx40Sapp(me->GetEntry()))
@@ -308,7 +292,7 @@ public:
{
me->CastCustomSpell(RAID_MODE(SPELL_LIFE_DRAIN_10, SPELL_LIFE_DRAIN_25), SPELLVALUE_MAX_TARGETS, RAID_MODE(2, 5), me, false);
}
- events.RepeatEvent(24000);
+ events.Repeat(24s);
return;
case EVENT_BLIZZARD:
{
@@ -325,14 +309,7 @@ public:
{
cr->GetMotionMaster()->MoveRandom(40);
}
- if (isNaxx40Sapp(me->GetEntry()))
- {
- events.RepeatEvent(6500);
- }
- else
- {
- events.RepeatEvent(RAID_MODE(8000, 6500));
- }
+ events.RepeatEvent(RAID_MODE(8000, 6500, 6500, 6500));
return;
}
case EVENT_FLIGHT_START:
@@ -340,8 +317,8 @@ public:
{
return;
}
- events.RepeatEvent(45000);
- events.DelayEvents(35000);
+ events.Repeat(45s);
+ events.DelayEvents(35s);
me->SetReactState(REACT_PASSIVE);
me->AttackStop();
float x, y, z, o;
@@ -355,15 +332,8 @@ public:
me->HandleEmoteCommand(EMOTE_ONESHOT_LIFTOFF);
me->SetDisableGravity(true);
currentTarget.Clear();
- events.ScheduleEvent(EVENT_FLIGHT_ICEBOLT, 3000);
- if (isNaxx40Sapp(me->GetEntry()))
- {
- iceboltCount = 3;
- }
- else
- {
- iceboltCount = RAID_MODE(2, 3);
- }
+ events.ScheduleEvent(EVENT_FLIGHT_ICEBOLT, 3s);
+ iceboltCount = RAID_MODE(2, 3, 3, 3);
return;
case EVENT_FLIGHT_ICEBOLT:
{
@@ -379,7 +349,7 @@ public:
auto i = me->GetThreatMgr().GetThreatList().begin();
for (; i != me->GetThreatMgr().GetThreatList().end(); ++i)
{
- if ((*i)->getTarget()->GetTypeId() == TYPEID_PLAYER)
+ if ((*i)->getTarget()->IsPlayer())
{
bool inList = false;
if (!blockList.empty())
@@ -412,7 +382,7 @@ public:
}
else
{
- events.ScheduleEvent(EVENT_FLIGHT_BREATH, 1000);
+ events.ScheduleEvent(EVENT_FLIGHT_BREATH, 1s);
}
return;
}
@@ -420,11 +390,11 @@ public:
currentTarget.Clear();
Talk(EMOTE_BREATH);
me->CastSpell(me, SPELL_FROST_MISSILE, false);
- events.ScheduleEvent(EVENT_FLIGHT_SPELL_EXPLOSION, 8500);
+ events.ScheduleEvent(EVENT_FLIGHT_SPELL_EXPLOSION, 8500ms);
return;
case EVENT_FLIGHT_SPELL_EXPLOSION:
me->CastSpell(me, SPELL_FROST_EXPLOSION, true);
- events.ScheduleEvent(EVENT_FLIGHT_START_LAND, 3000);
+ events.ScheduleEvent(EVENT_FLIGHT_START_LAND, 3s);
return;
case EVENT_FLIGHT_START_LAND:
if (!blockList.empty())
@@ -439,12 +409,12 @@ public:
}
blockList.clear();
me->RemoveAllGameObjects();
- events.ScheduleEvent(EVENT_LAND, 1000);
+ events.ScheduleEvent(EVENT_LAND, 1s);
return;
case EVENT_LAND:
me->HandleEmoteCommand(EMOTE_ONESHOT_LAND);
me->SetDisableGravity(false);
- events.ScheduleEvent(EVENT_GROUND, 1500);
+ events.ScheduleEvent(EVENT_GROUND, 1500ms);
return;
case EVENT_GROUND:
Talk(EMOTE_GROUND_PHASE);
@@ -454,15 +424,15 @@ public:
case EVENT_HUNDRED_CLUB:
{
Map::PlayerList const& pList = me->GetMap()->GetPlayers();
- for (const auto& itr : pList)
+ for (auto const& itr : pList)
{
- if (itr.GetSource()->GetResistance(SPELL_SCHOOL_FROST) > 100 && pInstance)
+ if (itr.GetSource()->GetResistance(SPELL_SCHOOL_FROST) > 100)
{
- pInstance->SetData(DATA_HUNDRED_CLUB, 0);
+ instance->SetData(DATA_HUNDRED_CLUB, 0);
return;
}
}
- events.RepeatEvent(5000);
+ events.Repeat(5s);
return;
}
}
diff --git a/src/naxx40Scripts/boss_thaddius_40.cpp b/src/naxx40Scripts/boss_thaddius_40.cpp
index 094b117..6bbec1c 100644
--- a/src/naxx40Scripts/boss_thaddius_40.cpp
+++ b/src/naxx40Scripts/boss_thaddius_40.cpp
@@ -15,6 +15,8 @@
* with this program. If not, see .
*/
+#include "AreaTriggerScript.h"
+#include "CreatureScript.h"
#include "Player.h"
#include "ScriptMgr.h"
#include "ScriptedCreature.h"
@@ -118,11 +120,8 @@ public:
struct boss_thaddius_40AI : public BossAI
{
explicit boss_thaddius_40AI(Creature* c) : BossAI(c, BOSS_THADDIUS), summons(me), ballLightningEnabled(false)
- {
- pInstance = me->GetInstanceScript();
- }
+ {}
- InstanceScript* pInstance;
EventMap events;
SummonList summons;
uint32 summonTimer{};
@@ -186,50 +185,30 @@ public:
{
go->SetGoState(GO_STATE_ACTIVE);
}
- if (pInstance)
- {
- if (GameObject* go = me->GetMap()->GetGameObject(pInstance->GetGuidData(DATA_THADDIUS_GATE)))
- {
- if (pInstance->GetBossState(BOSS_GLUTH) == DONE)
- {
- go->SetGoState(GO_STATE_ACTIVE);
- }
- }
- }
- pInstance->DoRemoveAurasDueToSpellOnPlayers(SPELL_POSITIVE_POLARITY);
- pInstance->DoRemoveAurasDueToSpellOnPlayers(SPELL_POSITIVE_CHARGE_STACK);
- pInstance->DoRemoveAurasDueToSpellOnPlayers(SPELL_NEGATIVE_POLARITY);
- pInstance->DoRemoveAurasDueToSpellOnPlayers(SPELL_NEGATIVE_CHARGE_STACK);
+ instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_POSITIVE_POLARITY);
+ instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_POSITIVE_CHARGE_STACK);
+ instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_NEGATIVE_POLARITY);
+ instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_NEGATIVE_CHARGE_STACK);
}
void KilledUnit(Unit* who) override
{
- if (who->GetTypeId() != TYPEID_PLAYER)
+ if (!who->IsPlayer())
return;
Talk(SAY_SLAY);
- if (pInstance)
- {
- pInstance->SetData(DATA_IMMORTAL_FAIL, 0);
- }
+ instance->StorePersistentData(PERSISTENT_DATA_IMMORTAL_FAIL, 1);
}
void JustDied(Unit* killer) override
{
BossAI::JustDied(killer);
Talk(SAY_DEATH);
- if (pInstance)
- {
- pInstance->DoRemoveAurasDueToSpellOnPlayers(SPELL_POSITIVE_POLARITY);
- pInstance->DoRemoveAurasDueToSpellOnPlayers(SPELL_POSITIVE_CHARGE_STACK);
- pInstance->DoRemoveAurasDueToSpellOnPlayers(SPELL_NEGATIVE_POLARITY);
- pInstance->DoRemoveAurasDueToSpellOnPlayers(SPELL_NEGATIVE_CHARGE_STACK);
- if (GameObject* go = me->GetMap()->GetGameObject(pInstance->GetGuidData(DATA_THADDIUS_GATE)))
- {
- go->SetGoState(GO_STATE_ACTIVE);
- }
- }
+ instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_POSITIVE_POLARITY);
+ instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_POSITIVE_CHARGE_STACK);
+ instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_NEGATIVE_POLARITY);
+ instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_NEGATIVE_CHARGE_STACK);
}
void JustSummoned(Creature* cr) override
@@ -321,7 +300,7 @@ public:
go->SetGoState(GO_STATE_READY);
}
me->CastSpell(me, SPELL_THADDIUS_VISUAL_LIGHTNING, true);
- events.ScheduleEvent(EVENT_THADDIUS_ENTER_COMBAT, 1000);
+ events.ScheduleEvent(EVENT_THADDIUS_ENTER_COMBAT, 1s);
break;
}
case EVENT_THADDIUS_ENTER_COMBAT:
@@ -329,10 +308,10 @@ public:
me->SetReactState(REACT_AGGRESSIVE);
me->SetControlled(false, UNIT_STATE_STUNNED);
me->RemoveUnitFlag(UNIT_FLAG_NON_ATTACKABLE);
- events.ScheduleEvent(EVENT_THADDIUS_CHAIN_LIGHTNING, 14000);
- events.ScheduleEvent(EVENT_THADDIUS_BERSERK, 360000);
- events.ScheduleEvent(EVENT_THADDIUS_POLARITY_SHIFT, 30000);
- events.ScheduleEvent(EVENT_ALLOW_BALL_LIGHTNING, 5000);
+ events.ScheduleEvent(EVENT_THADDIUS_CHAIN_LIGHTNING, 14s);
+ events.ScheduleEvent(EVENT_THADDIUS_BERSERK, 6min);
+ events.ScheduleEvent(EVENT_THADDIUS_POLARITY_SHIFT, 30s);
+ events.ScheduleEvent(EVENT_ALLOW_BALL_LIGHTNING, 5s);
return;
case EVENT_THADDIUS_BERSERK:
me->CastSpell(me, SPELL_BERSERK, true);
@@ -344,12 +323,12 @@ public:
values.AddSpellMod(SPELLVALUE_BASE_POINT0, customChainLightningDamage);
values.AddSpellMod(SPELLVALUE_MAX_TARGETS, 15);
me->CastCustomSpell(SPELL_CHAIN_LIGHTNING, values, me->GetVictim(), TRIGGERED_NONE, nullptr, nullptr, ObjectGuid::Empty);
- events.RepeatEvent(15000);
+ events.Repeat(15s);
break;
}
case EVENT_THADDIUS_POLARITY_SHIFT:
me->CastSpell(me, SPELL_POLARITY_SHIFT, false);
- events.RepeatEvent(30000);
+ events.Repeat(30s);
break;
case EVENT_ALLOW_BALL_LIGHTNING:
ballLightningEnabled = true;
@@ -386,11 +365,9 @@ public:
{
explicit boss_thaddius_summon_40AI(Creature* c) : ScriptedAI(c)
{
- pInstance = me->GetInstanceScript();
overload = false;
}
- InstanceScript* pInstance;
EventMap events;
uint32 pullTimer{};
uint32 visualTimer{};
@@ -441,17 +418,11 @@ public:
{
events.ScheduleEvent(EVENT_MINION_MAGNETIC_PULL, 20000);
}
- if (pInstance)
+
+ if (Creature* cr = me->GetInstanceScript()->GetCreature(DATA_THADDIUS_BOSS))
{
- if (GameObject* go = me->GetMap()->GetGameObject(pInstance->GetGuidData(DATA_THADDIUS_GATE)))
- {
- go->SetGoState(GO_STATE_READY);
- }
- if (Creature* cr = ObjectAccessor::GetCreature(*me, pInstance->GetGuidData(DATA_THADDIUS_BOSS)))
- {
- cr->AI()->AttackStart(pWho);
- cr->AddThreat(pWho, 10.0f);
- }
+ cr->AI()->AttackStart(pWho);
+ cr->AddThreat(pWho, 10.0f);
}
}
@@ -481,28 +452,20 @@ public:
{
Talk(me->GetEntry() == NPC_STALAGG_40 ? SAY_STAL_DEATH : SAY_FEUG_DEATH);
Talk(me->GetEntry() == NPC_STALAGG_40 ? EMOTE_STAL_DEATH : EMOTE_FEUG_DEATH);
- if (pInstance)
- {
- if (Creature* cr = ObjectAccessor::GetCreature(*me, pInstance->GetGuidData(DATA_THADDIUS_BOSS)))
- {
- cr->AI()->DoAction(ACTION_SUMMON_DIED);
- }
- }
+
+ if (Creature* cr = me->GetInstanceScript()->GetCreature(DATA_THADDIUS_BOSS))
+ cr->AI()->DoAction(ACTION_SUMMON_DIED);
}
void KilledUnit(Unit* who) override
{
- if (who->GetTypeId() != TYPEID_PLAYER)
+ if (!who->IsPlayer())
return;
- if (pInstance)
- {
- pInstance->SetData(DATA_IMMORTAL_FAIL, 0);
- }
if (!urand(0, 2))
- {
Talk(me->GetEntry() == NPC_STALAGG_40 ? SAY_STAL_SLAY : SAY_FEUG_SLAY);
- }
+
+ me->GetInstanceScript()->StorePersistentData(PERSISTENT_DATA_IMMORTAL_FAIL, 1);
}
void UpdateAI(uint32 diff) override
@@ -542,38 +505,37 @@ public:
{
case EVENT_MINION_POWER_SURGE:
me->CastSpell(me, SPELL_POWER_SURGE, false);
- events.RepeatEvent(19000);
+ events.Repeat(19s);
break;
case EVENT_MINION_STATIC_FIELD:
me->CastSpell(me, SPELL_STATIC_FIELD, false);
- events.RepeatEvent(3000);
+ events.Repeat(3s);
break;
case EVENT_MINION_MAGNETIC_PULL:
- events.RepeatEvent(20000);
- if (pInstance)
+ {
+ events.Repeat(20s);
+ if (Creature* feugen = me->GetInstanceScript()->GetCreature(DATA_FEUGEN_BOSS))
{
- if (Creature* feugen = ObjectAccessor::GetCreature(*me, pInstance->GetGuidData(DATA_FEUGEN_BOSS)))
- {
- if (!feugen->IsAlive() || !feugen->GetVictim() || !me->GetVictim())
- return;
+ if (!feugen->IsAlive() || !feugen->GetVictim() || !me->GetVictim())
+ return;
- float threatFeugen = feugen->GetThreatMgr().GetThreat(feugen->GetVictim());
- float threatStalagg = me->GetThreatMgr().GetThreat(me->GetVictim());
- Unit* tankFeugen = feugen->GetVictim();
- Unit* tankStalagg = me->GetVictim();
+ float threatFeugen = feugen->GetThreatMgr().GetThreat(feugen->GetVictim());
+ float threatStalagg = me->GetThreatMgr().GetThreat(me->GetVictim());
+ Unit* tankFeugen = feugen->GetVictim();
+ Unit* tankStalagg = me->GetVictim();
- feugen->GetThreatMgr().ModifyThreatByPercent(tankFeugen, -100);
- feugen->AddThreat(tankStalagg, threatFeugen);
- feugen->CastSpell(tankStalagg, SPELL_MAGNETIC_PULL, true);
- feugen->AI()->DoAction(ACTION_MAGNETIC_PULL);
+ feugen->GetThreatMgr().ModifyThreatByPercent(tankFeugen, -100);
+ feugen->AddThreat(tankStalagg, threatFeugen);
+ feugen->CastSpell(tankStalagg, SPELL_MAGNETIC_PULL, true);
+ feugen->AI()->DoAction(ACTION_MAGNETIC_PULL);
- me->GetThreatMgr().ModifyThreatByPercent(tankStalagg, -100);
- me->AddThreat(tankFeugen, threatStalagg);
- me->CastSpell(tankFeugen, SPELL_MAGNETIC_PULL, true);
- DoAction(ACTION_MAGNETIC_PULL);
- }
+ me->GetThreatMgr().ModifyThreatByPercent(tankStalagg, -100);
+ me->AddThreat(tankFeugen, threatStalagg);
+ me->CastSpell(tankFeugen, SPELL_MAGNETIC_PULL, true);
+ DoAction(ACTION_MAGNETIC_PULL);
}
break;
+ }
case EVENT_MINION_CHECK_DISTANCE:
if (Creature* cr = ObjectAccessor::GetCreature(*me, myCoil))
{
@@ -592,7 +554,7 @@ public:
int32 customTeslaShockDamage = 4374;
cr->CastCustomSpell(target, SPELL_TESLA_SHOCK, &customTeslaShockDamage, 0, 0, true);
}
- events.RepeatEvent(1500);
+ events.Repeat(1500ms);
break;
}
else
@@ -601,7 +563,7 @@ public:
cr->CastSpell(cr, me->GetEntry() == NPC_STALAGG_40 ? SPELL_STALAGG_CHAIN : SPELL_FEUGEN_CHAIN, false);
}
}
- events.RepeatEvent(5000);
+ events.Repeat(5s);
break;
}
DoMeleeAttackIfReady();
@@ -614,6 +576,11 @@ class spell_thaddius_pos_neg_charge : public SpellScript
{
PrepareSpellScript(spell_thaddius_pos_neg_charge);
+ bool Validate(SpellInfo const* /*spellInfo*/) override
+ {
+ return ValidateSpellInfo({ SPELL_POSITIVE_CHARGE, SPELL_POSITIVE_CHARGE_STACK });
+ }
+
void HandleTargets(std::list& targets)
{
uint8 count = 0;
@@ -647,7 +614,7 @@ class spell_thaddius_pos_neg_charge : public SpellScript
if (!target)
return;
- if (target->HasAura(GetTriggeringSpell()->Id) || target->GetTypeId() != TYPEID_PLAYER)
+ if (target->HasAura(GetTriggeringSpell()->Id) || !target->IsPlayer())
{
SetHitDamage(0);
}
@@ -740,15 +707,13 @@ public:
bool OnTrigger(Player* player, AreaTrigger const* /*areaTrigger*/) override
{
InstanceScript* instance = player->GetInstanceScript();
- if (!instance || instance->GetData(DATA_HAD_THADDIUS_GREET) || instance->GetBossState(BOSS_THADDIUS) == DONE)
+ if (!instance || instance->GetData(DATA_THADDIUS_INTRO) || instance->GetBossState(BOSS_THADDIUS) == DONE)
return true;
- if (Creature* thaddius = ObjectAccessor::GetCreature(*player, instance->GetGuidData(DATA_THADDIUS_BOSS)))
- {
+ if (Creature* thaddius = instance->GetCreature(DATA_THADDIUS_BOSS))
thaddius->AI()->Talk(SAY_GREET);
- }
- instance->SetData(DATA_HAD_THADDIUS_GREET, 1);
+ instance->SetData(DATA_THADDIUS_INTRO, 1);
return true;
}
};
diff --git a/src/naxx40Scripts/custom_creatures_40.cpp b/src/naxx40Scripts/custom_creatures_40.cpp
index e20f573..6feaab0 100644
--- a/src/naxx40Scripts/custom_creatures_40.cpp
+++ b/src/naxx40Scripts/custom_creatures_40.cpp
@@ -98,10 +98,8 @@ public:
void KilledUnit(Unit* who) override
{
- if (who->GetTypeId() == TYPEID_PLAYER && me->GetInstanceScript())
- {
- me->GetInstanceScript()->SetData(DATA_IMMORTAL_FAIL, 0);
- }
+ if (who->IsPlayer() && me->GetInstanceScript())
+ me->GetInstanceScript()->StorePersistentData(PERSISTENT_DATA_IMMORTAL_FAIL, 1);
}
void MoveInLineOfSight(Unit* who) override
diff --git a/src/naxx40Scripts/custom_gameobjects_40.cpp b/src/naxx40Scripts/custom_gameobjects_40.cpp
index 8591b74..c75f465 100644
--- a/src/naxx40Scripts/custom_gameobjects_40.cpp
+++ b/src/naxx40Scripts/custom_gameobjects_40.cpp
@@ -12,7 +12,7 @@ class gobject_naxx40_tele : public GameObjectScript
private:
static bool isAttuned(Player* player)
{
- if ((player->GetQuestStatus(NAXX40_ATTUNEMENT_1) == QUEST_STATUS_REWARDED) ||
+ if ((player->GetQuestStatus(NAXX40_ATTUNEMENT_1) == QUEST_STATUS_REWARDED) ||
(player->GetQuestStatus(NAXX40_ATTUNEMENT_2) == QUEST_STATUS_REWARDED) ||
(player->GetQuestStatus(NAXX40_ATTUNEMENT_3) == QUEST_STATUS_REWARDED))
{
@@ -54,11 +54,9 @@ public:
if ((!sIndividualProgression->requireNaxxStrath || player->GetQuestStatus(NAXX40_ENTRANCE_FLAG) == QUEST_STATUS_REWARDED) && (player->GetLevel() <= IP_LEVEL_TBC))
{
player->SetRaidDifficulty(RAID_DIFFICULTY_10MAN_HEROIC);
-
+
if ((isAttuned(player)) || (isExcludedFromProgression(player) && (player->GetLevel() <= IP_LEVEL_TBC)))
- {
player->TeleportTo(533, 3005.51f, -3434.64f, 304.195f, 6.2831f);
- }
}
return true;
}
diff --git a/src/naxx40Scripts/custom_scripts_40.cpp b/src/naxx40Scripts/custom_scripts_40.cpp
new file mode 100644
index 0000000..b6f59b0
--- /dev/null
+++ b/src/naxx40Scripts/custom_scripts_40.cpp
@@ -0,0 +1,122 @@
+#include "Player.h"
+#include "ScriptMgr.h"
+#include "ScriptedCreature.h"
+#include "SpellAuraEffects.h"
+#include "SpellScript.h"
+#include "naxxramas.h"
+
+class NaxxPlayerScript : public PlayerScript
+{
+public:
+ NaxxPlayerScript() : PlayerScript("NaxxPlayerScript") { }
+
+ void OnPlayerBeforeChooseGraveyard(Player* player, TeamId /*teamId*/, bool /*nearCorpse*/, uint32& graveyardOverride) override
+ {
+ if (player->GetMapId() == MAP_NAXX && player->GetMap()->GetSpawnMode() == RAID_DIFFICULTY_10MAN_HEROIC)
+ {
+ graveyardOverride = NAXX40_GRAVEYARD;
+ }
+ }
+};
+
+class naxx_northrend_entrance : public AreaTriggerScript
+{
+public:
+ naxx_northrend_entrance() : AreaTriggerScript("naxx_northrend_entrance") { }
+
+ bool OnTrigger(Player* player, AreaTrigger const* areaTrigger) override
+ {
+ // Do not allow entrance to Naxx 40 from Northrend
+ // Change 10 man heroic to regular 10 man, as when 10 man heroic is not available
+ Difficulty diff = player->GetGroup() ? player->GetGroup()->GetDifficulty(true) : player->GetDifficulty(true);
+ if (diff == RAID_DIFFICULTY_10MAN_HEROIC)
+ {
+ player->SetRaidDifficulty(RAID_DIFFICULTY_10MAN_NORMAL);
+ }
+ switch (areaTrigger->entry)
+ {
+ // Naxx 10 and 25 entrances
+ case 5191:
+ player->TeleportTo(533, 3005.68f, -3447.77f, 293.93f, 4.65f);
+ break;
+ case 5192:
+ player->TeleportTo(533, 3019.34f, -3434.36f, 293.99f, 6.27f);
+ break;
+ case 5193:
+ player->TeleportTo(533, 3005.9f, -3420.58f, 294.11f, 1.58f);
+ break;
+ case 5194:
+ player->TeleportTo(533, 2992.5f, -3434.42f, 293.94f, 3.13f);
+ break;
+ }
+ return true;
+ }
+};
+
+class naxx_exit_trigger : public AreaTriggerScript
+{
+public:
+ naxx_exit_trigger() : AreaTriggerScript("naxx_exit_trigger") { }
+
+ bool OnTrigger(Player* player, AreaTrigger const* areaTrigger) override
+ {
+ if (player->GetMap()->GetSpawnMode() == RAID_DIFFICULTY_10MAN_HEROIC)
+ {
+ // Naxx 40 cannot be exited via portals, as in Classic
+ return false;
+ }
+ switch (areaTrigger->entry)
+ {
+ // Naxx 10 and 25 exits
+ case 5196:
+ player->TeleportTo(571, 3679.25f, -1278.58f, 243.55f, 2.39f);
+ break;
+ case 5197:
+ player->TeleportTo(571, 3679.03f, -1259.68f, 243.55f, 3.98f);
+ break;
+ case 5198:
+ player->TeleportTo(571, 3661.14f, -1279.55f, 243.55f, 0.82f);
+ break;
+ case 5199:
+ player->TeleportTo(571, 3660.01f, -1260.99f, 243.55f, 5.51f);
+ break;
+ }
+ return true;
+ }
+};
+
+class NaxxEntryFlag_AllMapScript : public AllMapScript
+{
+public:
+ NaxxEntryFlag_AllMapScript() : AllMapScript("NaxxEntryFlag_AllMapScript") { }
+
+ void OnPlayerEnterAll(Map* map, Player* player) override
+ {
+ if (player->IsGameMaster())
+ return;
+
+ // Check if mapId equals to Naxxramas (mapId: 533)
+ if (map->GetId() != 533)
+ return;
+
+ // Cast on player Naxxramas Entry Flag Trigger DND - Classic (spellID: 29296)
+ if (player->GetQuestStatus(NAXX40_ENTRANCE_FLAG) != QUEST_STATUS_REWARDED)
+ {
+ // Mark player as having entered
+ Quest const* quest = sObjectMgr->GetQuestTemplate(NAXX40_ENTRANCE_FLAG);
+ player->AddQuest(quest, nullptr);
+ player->CompleteQuest(NAXX40_ENTRANCE_FLAG);
+ player->RewardQuest(quest, 0, player, false, false);
+ // Cast on player Naxxramas Entry Flag Trigger DND - Classic (spellID: 29296)
+ player->CastSpell(player, 29296, true); // for visual effect only, possible crash if cast on login
+ }
+ }
+};
+
+void AddSC_custom_scripts_40()
+{
+ new NaxxPlayerScript();
+ new naxx_exit_trigger();
+ new naxx_northrend_entrance();
+ new NaxxEntryFlag_AllMapScript();
+}
diff --git a/src/naxx40Scripts/custom_spells_40.cpp b/src/naxx40Scripts/custom_spells_40.cpp
index de9996d..f013ad7 100644
--- a/src/naxx40Scripts/custom_spells_40.cpp
+++ b/src/naxx40Scripts/custom_spells_40.cpp
@@ -1,6 +1,6 @@
-
#include "ScriptMgr.h"
#include "ScriptedCreature.h"
+#include "SpellAuraDefines.h"
#include "SpellAuraEffects.h"
#include "SpellScript.h"
#include "naxxramas.h"
@@ -228,7 +228,7 @@ class spell_kelthuzad_frostbolt_40 : public SpellScript
}
};
-// 28522 - Icebolt
+// 28522 - Icebolt
class spell_sapphiron_icebolt_40 : public SpellScript
{
PrepareSpellScript(spell_sapphiron_icebolt_40);
@@ -250,37 +250,23 @@ class spell_sapphiron_icebolt_40 : public SpellScript
};
// 28531 - Frost Aura
-enum FrostAura
-{
- SPELL_FROST_AURA = 28531,
-};
-
class spell_sapphiron_frost_aura_40 : public AuraScript
{
PrepareAuraScript(spell_sapphiron_frost_aura_40);
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_FROST_AURA });
- }
-
- void OnApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
+ void CalculateAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& /*canBeRecalculated*/)
{
Unit* caster = GetCaster();
if (!caster || (caster->GetMap()->GetDifficulty() != RAID_DIFFICULTY_10MAN_HEROIC))
- {
return;
- }
- PreventDefaultAction();
- CustomSpellValues values;
- int32 bp0 = 599;
- values.AddSpellMod(SPELLVALUE_BASE_POINT0, bp0);
- caster->CastCustomSpell(SPELL_FROST_AURA, values, caster, TRIGGERED_NONE, nullptr, nullptr, GetCasterGUID());
+ if (urand(0, 99) == 0) // 1% chance to receive extra Frost Aura tick
+ return;
+ amount *= 0.5; // Reduce damage by 50% (1200bp -> 600bp)
}
void Register() override
{
- OnEffectApply += AuraEffectApplyFn(spell_sapphiron_frost_aura_40::OnApply, EFFECT_0, SPELL_AURA_PERIODIC_DAMAGE, AURA_EFFECT_HANDLE_REAL);
+ DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_sapphiron_frost_aura_40::CalculateAmount, EFFECT_0, SPELL_AURA_PERIODIC_DAMAGE);
}
};
@@ -296,7 +282,7 @@ class spell_patchwork_golem_war_stomp_40 : public SpellScript
{
return;
}
- SetHitDamage(urand(936,1064));
+ SetHitDamage(urand(936,1064));
}
void Register() override
@@ -343,7 +329,6 @@ class spell_noth_curse_of_the_plaguebringer_aura_40 : public AuraScript
}
};
-
class spell_razuvious_disrupting_shout_40 : public SpellScript
{
PrepareSpellScript(spell_razuvious_disrupting_shout_40);
diff --git a/src/naxx40Scripts/instance_naxxramas.cpp b/src/naxx40Scripts/instance_naxxramas.cpp
index 5fb34a7..ef38b26 100644
--- a/src/naxx40Scripts/instance_naxxramas.cpp
+++ b/src/naxx40Scripts/instance_naxxramas.cpp
@@ -15,1493 +15,829 @@
* with this program. If not, see .
*/
+#include "AreaTriggerScript.h"
#include "CellImpl.h"
-#include "GridNotifiers.h"
-#include "GridNotifiersImpl.h"
+#include "CreatureAIImpl.h"
+#include "CreatureScript.h"
+#include "InstanceMapScript.h"
+#include "InstanceScript.h"
#include "PassiveAI.h"
-#include "ScriptMgr.h"
-#include "ScriptedCreature.h"
-#include "DBCEnums.h"
-#include "ObjectMgr.h"
+#include "Player.h"
#include "naxxramas.h"
-const float HeiganPos[2] = {2796, -3707};
-const float HeiganEruptionSlope[3] =
+struct LivingPoisonData
+{
+ Position Start {};
+ Position End {};
+ uint32 DespawnTime {};
+};
+
+static const LivingPoisonData LivingPoisonDataList[3]
+{
+ { Position { 3128.59, -3118.81, 293.346, 4.76754 }, Position { 3130.322, -3156.51, 293.324 }, 15200 },
+ { Position { 3154.25, -3125.7, 293.43, 4.47694 }, Position { 3144.779, -3158.416, 293.324 }, 14800 },
+ { Position { 3175.42, -3134.86, 293.34, 4.284 }, Position { 3158.778, -3164.201, 293.312 }, 14800 }
+};
+
+static const float HeiganPos[2]
+{
+ 2796, -3707
+};
+
+static const float HeiganEruptionSlope[3]
{
(-3685 - HeiganPos[1]) / (2724 - HeiganPos[0]),
(-3647 - HeiganPos[1]) / (2749 - HeiganPos[0]),
(-3637 - HeiganPos[1]) / (2771 - HeiganPos[0]),
};
-inline uint8 GetEruptionSection(float x, float y)
+static constexpr std::array HorsemanDataGroup
{
- y -= HeiganPos[1];
- if (y < 1.0f)
- return 0;
-
- x -= HeiganPos[0];
- if (x > -1.0f)
- return 3;
-
- float slope = y / x;
- for (uint32 i = 0; i < 3; ++i)
- {
- if (slope > HeiganEruptionSlope[i])
- return i;
- }
- return 3;
-}
-
-ObjectData const creatureData[] =
-{
- { NPC_RAZUVIOUS, DATA_RAZUVIOUS },
- { NPC_RAZUVIOUS_40, DATA_RAZUVIOUS_40 },
- { 0, 0 }
+ DATA_BARON_RIVENDARE_BOSS,
+ DATA_SIR_ZELIEK_BOSS,
+ DATA_LADY_BLAUMEUX_BOSS,
+ DATA_THANE_KORTHAZZ_BOSS
};
-ObjectData const gameObjectData[] =
+static WorldLocation const SapphironTeleportPos
{
- { 0, 0 }
+ NaxxramasMapId, 3498.300049f, -5349.490234f, 144.968002f, 1.3698910f
};
-class instance_naxxramas_combined : public InstanceMapScript
+static DoorData const doorData[]
+{
+ { GO_PATCHWERK_GATE, BOSS_PATCHWERK, DOOR_TYPE_PASSAGE },
+ { GO_PATCHWERK_GATE, BOSS_GROBBULUS, DOOR_TYPE_ROOM },
+ { GO_GLUTH_GATE, BOSS_GLUTH, DOOR_TYPE_PASSAGE },
+ { GO_THADDIUS_GATE, BOSS_GLUTH, DOOR_TYPE_PASSAGE },
+ { GO_NOTH_ENTRY_GATE, BOSS_NOTH, DOOR_TYPE_ROOM },
+ { GO_NOTH_EXIT_GATE, BOSS_NOTH, DOOR_TYPE_PASSAGE },
+ { GO_HEIGAN_ENTRY_GATE, BOSS_NOTH, DOOR_TYPE_PASSAGE },
+ { GO_HEIGAN_ENTRY_GATE, BOSS_HEIGAN, DOOR_TYPE_ROOM },
+ { GO_HEIGAN_EXIT_GATE, BOSS_HEIGAN, DOOR_TYPE_PASSAGE },
+ { GO_HEIGAN_EXIT_GATE_40, BOSS_HEIGAN, DOOR_TYPE_PASSAGE },
+ { GO_LOATHEB_GATE, BOSS_HEIGAN, DOOR_TYPE_PASSAGE },
+ { GO_LOATHEB_GATE, BOSS_LOATHEB, DOOR_TYPE_ROOM },
+ { GO_PLAGUE_EYE_PORTAL, BOSS_LOATHEB, DOOR_TYPE_PASSAGE },
+ { GO_PLAG_EYE_RAMP_BOSS, BOSS_LOATHEB, DOOR_TYPE_PASSAGE },
+ { GO_ANUB_GATE, BOSS_ANUB, DOOR_TYPE_ROOM },
+ { GO_ANUB_NEXT_GATE, BOSS_ANUB, DOOR_TYPE_PASSAGE },
+ { GO_FAERLINA_WEB, BOSS_FAERLINA, DOOR_TYPE_ROOM },
+ { GO_FAERLINA_GATE, BOSS_FAERLINA, DOOR_TYPE_PASSAGE },
+ { GO_MAEXXNA_GATE, BOSS_FAERLINA, DOOR_TYPE_PASSAGE },
+ { GO_MAEXXNA_GATE, BOSS_MAEXXNA, DOOR_TYPE_ROOM },
+ { GO_SPIDER_EYE_PORTAL, BOSS_MAEXXNA, DOOR_TYPE_PASSAGE },
+ { GO_ARAC_EYE_RAMP_BOSS, BOSS_MAEXXNA, DOOR_TYPE_PASSAGE },
+ { GO_THADDIUS_GATE, BOSS_THADDIUS, DOOR_TYPE_ROOM },
+ { GO_ABOM_EYE_PORTAL, BOSS_THADDIUS, DOOR_TYPE_PASSAGE },
+ { GO_CONS_EYE_RAMP_BOSS, BOSS_THADDIUS, DOOR_TYPE_PASSAGE },
+ { GO_GOTHIK_ENTER_GATE, BOSS_GOTHIK, DOOR_TYPE_ROOM },
+ { GO_GOTHIK_INNER_GATE, BOSS_GOTHIK, DOOR_TYPE_ROOM },
+ { GO_GOTHIK_EXIT_GATE, BOSS_GOTHIK, DOOR_TYPE_PASSAGE },
+ { GO_HORSEMEN_GATE, BOSS_GOTHIK, DOOR_TYPE_PASSAGE },
+ { GO_HORSEMEN_GATE, BOSS_HORSEMAN, DOOR_TYPE_ROOM },
+ { GO_DEATHKNIGHT_EYE_PORTAL, BOSS_HORSEMAN, DOOR_TYPE_PASSAGE },
+ { GO_MILI_EYE_RAMP_BOSS, BOSS_HORSEMAN, DOOR_TYPE_PASSAGE },
+ { GO_KELTHUZAD_GATE, BOSS_KELTHUZAD, DOOR_TYPE_ROOM },
+ { 0, 0, DOOR_TYPE_ROOM }
+};
+
+static ObjectData const creatureData[]
+{
+ { NPC_PATCHWERK, DATA_PATCHWERK_BOSS },
+ { NPC_STALAGG, DATA_STALAGG_BOSS },
+ { NPC_FEUGEN, DATA_FEUGEN_BOSS },
+ { NPC_THADDIUS, DATA_THADDIUS_BOSS },
+ { NPC_RAZUVIOUS, DATA_RAZUVIOUS_BOSS },
+ { NPC_GOTHIK, DATA_GOTHIK_BOSS },
+ { NPC_BARON_RIVENDARE, DATA_BARON_RIVENDARE_BOSS },
+ { NPC_SIR_ZELIEK, DATA_SIR_ZELIEK_BOSS },
+ { NPC_LADY_BLAUMEUX, DATA_LADY_BLAUMEUX_BOSS },
+ { NPC_THANE_KORTHAZZ, DATA_THANE_KORTHAZZ_BOSS },
+ { NPC_SAPPHIRON, DATA_SAPPHIRON_BOSS },
+ { NPC_KELTHUZAD, DATA_KELTHUZAD_BOSS },
+ { NPC_LICH_KING, DATA_LICH_KING_BOSS },
+ { 0, 0 }
+};
+
+// overwrite the default ObjectData if Naxx40
+static ObjectData const creatureDataNX40[]
+{
+ { NPC_PATCHWERK_40, DATA_PATCHWERK_BOSS },
+ { NPC_STALAGG_40, DATA_STALAGG_BOSS },
+ { NPC_FEUGEN_40, DATA_FEUGEN_BOSS },
+ { NPC_THADDIUS_40, DATA_THADDIUS_BOSS },
+ { NPC_RAZUVIOUS_40, DATA_RAZUVIOUS_BOSS },
+ { NPC_GOTHIK_40, DATA_GOTHIK_BOSS },
+ { NPC_HIGHLORD_MOGRAINE_40, DATA_BARON_RIVENDARE_BOSS },
+ { NPC_SIR_ZELIEK_40, DATA_SIR_ZELIEK_BOSS },
+ { NPC_LADY_BLAUMEUX_40, DATA_LADY_BLAUMEUX_BOSS },
+ { NPC_THANE_KORTHAZZ_40, DATA_THANE_KORTHAZZ_BOSS },
+ { NPC_SAPPHIRON_40, DATA_SAPPHIRON_BOSS },
+ { NPC_KELTHUZAD_40, DATA_KELTHUZAD_BOSS },
+ // { NPC_LICH_KING, DATA_LICH_KING_BOSS },
+ { 0, 0 }
+};
+
+static ObjectData const gameObjectData[]
+{
+ { GO_GOTHIK_INNER_GATE, DATA_GOTHIK_INNER_GATE },
+ { GO_LOATHEB_PORTAL, DATA_LOATHEB_PORTAL },
+ { GO_MAEXXNA_PORTAL, DATA_MAEXXNA_PORTAL },
+ { GO_THADDIUS_PORTAL, DATA_THADDIUS_PORTAL },
+ { GO_HORSEMAN_PORTAL, DATA_HORSEMAN_PORTAL },
+ { GO_SAPPHIRON_GATE, DATA_SAPPHIRON_GATE },
+ { GO_KELTHUZAD_FLOOR, DATA_KELTHUZAD_FLOOR },
+ { GO_KELTHUZAD_GATE, DATA_KELTHUZAD_GATE },
+ { GO_KELTHUZAD_PORTAL_1, DATA_KELTHUZAD_PORTAL_1 },
+ { GO_KELTHUZAD_PORTAL_2, DATA_KELTHUZAD_PORTAL_2 },
+ { GO_KELTHUZAD_PORTAL_3, DATA_KELTHUZAD_PORTAL_3 },
+ { GO_KELTHUZAD_PORTAL_4, DATA_KELTHUZAD_PORTAL_4 },
+ { 0, 0 }
+};
+
+class instance_naxxramas : public InstanceScript
{
public:
- instance_naxxramas_combined() : InstanceMapScript("instance_naxxramas", 533) { }
-
- InstanceScript* GetInstanceScript(InstanceMap* pMap) const override
+ instance_naxxramas(Map* map) : InstanceScript(map)
{
- return new instance_naxxramas_combined_InstanceMapScript(pMap);
- }
+ SetHeaders(DataHeader);
+ SetBossNumber(MAX_ENCOUNTERS);
+ SetPersistentDataCount(PERSISTENT_DATA_COUNT);
+ LoadDoorData(doorData);
+ LoadObjectData(creatureData, gameObjectData);
- struct instance_naxxramas_combined_InstanceMapScript : public InstanceScript
- {
- explicit instance_naxxramas_combined_InstanceMapScript(Map* pMap) : InstanceScript(pMap)
- {
- SetHeaders(DataHeader);
- SetBossNumber(MAX_ENCOUNTERS);
- LoadObjectData(creatureData, gameObjectData);
- for (auto& i : HeiganEruption)
- i.clear();
+ // NX40 specific data
+ if (instance->GetDifficulty() == RAID_DIFFICULTY_10MAN_HEROIC)
+ LoadObjectData(creatureDataNX40, gameObjectData);
- // NPCs
- PatchwerkRoomTrash.clear();
- HeiganBackRoomAdds.clear();
-
- // Controls
- _horsemanKilled = 0;
- _speakTimer = 0;
- _horsemanTimer = 0;
- _screamTimer = 2 * MINUTE * IN_MILLISECONDS;
- _hadThaddiusGreet = false;
- _currentWingTaunt = SAY_FIRST_WING_TAUNT;
- _horsemanLoadDoneState = false;
-
- // Achievements
- abominationsKilled = 0;
- faerlinaAchievement = true;
- thaddiusAchievement = true;
- loathebAchievement = true;
- sapphironAchievement = true;
- heiganAchievement = true;
- immortalAchievement = 1;
- }
-
- std::set HeiganEruption[4];
- std::set HeiganEruptionTunnel;
-
- // GOs
- ObjectGuid _patchwerkGateGUID;
- ObjectGuid _gluthGateGUID;
- ObjectGuid _nothEntryGateGUID;
- ObjectGuid _nothExitGateGUID;
- ObjectGuid _heiganGateGUID;
- ObjectGuid _heiganGateExitGUID;
- ObjectGuid _heiganGateExitOldGUID;
- ObjectGuid _loathebGateGUID;
- ObjectGuid _anubGateGUID;
- ObjectGuid _anubNextGateGUID;
- ObjectGuid _faerlinaWebGUID;
- ObjectGuid _faerlinaGateGUID;
- ObjectGuid _maexxnaGateGUID;
- ObjectGuid _thaddiusGateGUID;
- ObjectGuid _gothikEnterGateGUID;
- ObjectGuid _gothikInnerGateGUID;
- ObjectGuid _gothikExitGateGUID{};
- ObjectGuid _horsemanGateGUID;
- ObjectGuid _kelthuzadFloorGUID;
- ObjectGuid _kelthuzadGateGUID;
- ObjectGuid _kelthuzadPortal1GUID;
- ObjectGuid _kelthuzadPortal2GUID;
- ObjectGuid _kelthuzadPortal3GUID;
- ObjectGuid _kelthuzadPortal4GUID;
- ObjectGuid _sapphironGateGUID;
- ObjectGuid _horsemanPortalGUID;
- ObjectGuid _loathebPortalGUID;
- ObjectGuid _maexxnaPortalGUID;
- ObjectGuid _thaddiusPortalGUID;
- ObjectGuid _deathknightEyePortalGUID;
- ObjectGuid _plagueEyePortalGUID;
- ObjectGuid _spiderEyePortalGUID;
- ObjectGuid _abomEyePortalGUID;
- ObjectGuid _deathknightGlowEyePortalGUID;
- ObjectGuid _plagueGlowEyePortalGUID;
- ObjectGuid _spiderGlowEyePortalGUID;
- ObjectGuid _abomGlowEyePortalGUID;
+ // GameObjects
+ for (auto& i : _heiganEruption)
+ i.clear();
// NPCs
- GuidList PatchwerkRoomTrash;
- GuidList HeiganBackRoomAdds;
- ObjectGuid _patchwerkGUID;
- ObjectGuid _thaddiusGUID;
- ObjectGuid _gothikGUID;
- ObjectGuid _stalaggGUID;
- ObjectGuid _feugenGUID;
- ObjectGuid _zeliekGUID;
- ObjectGuid _rivendareGUID;
- ObjectGuid _blaumeuxGUID;
- ObjectGuid _korthazzGUID;
- ObjectGuid _sapphironGUID;
- ObjectGuid _kelthuzadGUID;
- ObjectGuid _lichkingGUID;
+ _patchwerkRoomTrash.clear();
+ _heiganBackRoomTrash.clear();
// Controls
- uint8 _horsemanKilled;
- uint32 _speakTimer;
- uint32 _horsemanTimer;
- uint32 _screamTimer;
- bool _hadThaddiusGreet;
- EventMap events;
- uint8 _currentWingTaunt;
- bool _horsemanLoadDoneState;
+ _events.Reset();
+ _currentWingTaunt = SAY_FIRST_WING_TAUNT;
+ _horsemanLoaded = 0;
// Achievements
- uint8 abominationsKilled;
- bool faerlinaAchievement;
- bool thaddiusAchievement;
- bool loathebAchievement;
- bool sapphironAchievement;
- bool heiganAchievement;
- uint32 immortalAchievement;
+ _abominationsKilled = 0;
+ _faerlinaAchievement = true;
+ _thaddiusAchievement = true;
+ _loathebAchievement = true;
+ _heiganAchievement = true;
+ _sapphironAchievement = true;
+ _horsemanAchievement = true;
+ }
- void HeiganEruptSections(uint32 section)
- {
- for (uint8 i = 0; i < 4; ++i)
- {
- if (i == section)
- continue;
+ inline void CreatureTalk(uint32 dataCreature, uint8 dialog)
+ {
+ if (Creature* creature = GetCreature(dataCreature))
+ creature->AI()->Talk(dialog);
+ }
- for (auto itr : HeiganEruption[i])
- {
- itr->SendCustomAnim(itr->GetGoAnimProgress());
- itr->CastSpell(nullptr, SPELL_ERUPTION);
- }
+ inline void SetGoState(uint32 dataGameObject, GOState state)
+ {
+ if (GameObject* go = GetGameObject(dataGameObject))
+ go->SetGoState(state);
+ }
- }
- }
+ inline void ActivateWingPortal(GameObject* go, EncounterState state)
+ {
+ if (!go || state != DONE)
+ return;
- void HeiganEruptSectionsTunnel()
- {
- // doesn't work
- for (auto itr : HeiganEruptionTunnel)
- {
- itr->SendCustomAnim(itr->GetGoAnimProgress());
- itr->CastSpell(nullptr, SPELL_ERUPTION);
- }
- }
+ go->SetGoState(GO_STATE_ACTIVE);
+ go->RemoveGameObjectFlag(GO_FLAG_NOT_SELECTABLE);
+ }
- bool IsEncounterInProgress() const override
- {
- for (uint8 i = 0; i < MAX_ENCOUNTERS; ++i)
- {
- if (GetBossState(i) == IN_PROGRESS)
- return true;
- }
- return false;
- }
-
- void OnCreatureCreate(Creature* creature) override
- {
-
- switch(creature->GetEntry())
- {
- case NPC_ROTTING_MAGGOT_40:
- HeiganBackRoomAdds.push_back(creature->GetGUID());
- return;
- case NPC_DISEASED_MAGGOT_40:
- HeiganBackRoomAdds.push_back(creature->GetGUID());
- return;
- case NPC_EYE_STALK_40:
- HeiganBackRoomAdds.push_back(creature->GetGUID());
- return;
- case NPC_PATCHWERK:
- _patchwerkGUID = creature->GetGUID();
- return;
- case NPC_PATCHWORK_GOLEM:
- PatchwerkRoomTrash.push_back(creature->GetGUID());
- return;
- case NPC_BILE_RETCHER:
- if (creature->GetPositionY() > -3258.0f) // we want only those inside the room, not before
- PatchwerkRoomTrash.push_back(creature->GetGUID());
- return;
- case NPC_SLUDGE_BELCHER:
- if (creature->GetPositionY() > -3258.0f) // we want only those inside the room, not before
- PatchwerkRoomTrash.push_back(creature->GetGUID());
- return;
- case NPC_MAD_SCIENTIST:
- PatchwerkRoomTrash.push_back(creature->GetGUID());
- return;
- case NPC_LIVING_MONSTROSITY:
- PatchwerkRoomTrash.push_back(creature->GetGUID());
- return;
- case NPC_SURGICAL_ASSIST:
- PatchwerkRoomTrash.push_back(creature->GetGUID());
- return;
- case NPC_THADDIUS:
- _thaddiusGUID = creature->GetGUID();
- return;
- case NPC_STALAGG:
- _stalaggGUID = creature->GetGUID();
- return;
- case NPC_FEUGEN:
- _feugenGUID = creature->GetGUID();
- return;
- case NPC_GOTHIK:
- _gothikGUID = creature->GetGUID();
- return;
- case NPC_LADY_BLAUMEUX:
- _blaumeuxGUID = creature->GetGUID();
- return;
- case NPC_SIR_ZELIEK:
- _zeliekGUID = creature->GetGUID();
- return;
- case NPC_BARON_RIVENDARE:
- _rivendareGUID = creature->GetGUID();
- return;
- case NPC_THANE_KORTHAZZ:
- _korthazzGUID = creature->GetGUID();
- return;
- case NPC_SAPPHIRON:
- _sapphironGUID = creature->GetGUID();
- return;
- case NPC_KELTHUZAD:
- _kelthuzadGUID = creature->GetGUID();
- return;
- case NPC_LICH_KING:
- _lichkingGUID = creature->GetGUID();
- return;
- // Naxx 40 NPCs
- case NPC_GOTHIK_40:
- _gothikGUID = creature->GetGUID();
- return;
- case NPC_PATCHWERK_40:
- _patchwerkGUID = creature->GetGUID();
- return;
- case NPC_PATCHWORK_GOLEM_40:
- PatchwerkRoomTrash.push_back(creature->GetGUID());
- return;
- case NPC_BILE_RETCHER_40:
- if (creature->GetPositionY() > -3258.0f) // we want only those inside the room, not before
- PatchwerkRoomTrash.push_back(creature->GetGUID());
- return;
- case NPC_SLUDGE_BELCHER_40:
- if (creature->GetPositionY() > -3258.0f) // we want only those inside the room, not before
- PatchwerkRoomTrash.push_back(creature->GetGUID());
- return;
- case NPC_MAD_SCIENTIST_40:
- PatchwerkRoomTrash.push_back(creature->GetGUID());
- return;
- case NPC_LIVING_MONSTROSITY_40:
- PatchwerkRoomTrash.push_back(creature->GetGUID());
- return;
- case NPC_SURGICAL_ASSIST_40:
- PatchwerkRoomTrash.push_back(creature->GetGUID());
- return;
- case NPC_THADDIUS_40:
- _thaddiusGUID = creature->GetGUID();
- return;
- case NPC_STALAGG_40:
- _stalaggGUID = creature->GetGUID();
- return;
- case NPC_FEUGEN_40:
- _feugenGUID = creature->GetGUID();
- return;
- case NPC_LADY_BLAUMEUX_40:
- _blaumeuxGUID = creature->GetGUID();
- return;
- case NPC_SIR_ZELIEK_40:
- _zeliekGUID = creature->GetGUID();
- return;
- case NPC_HIGHLORD_MOGRAINE_40:
- _rivendareGUID = creature->GetGUID();
- return;
- case NPC_THANE_KORTHAZZ_40:
- _korthazzGUID = creature->GetGUID();
- return;
- case NPC_SAPPHIRON_40:
- _sapphironGUID = creature->GetGUID();
- return;
- case NPC_KELTHUZAD_40:
- _kelthuzadGUID = creature->GetGUID();
- return;
- case NPC_ARCHMAGE_TARSIS:
- creature->SetStandState(UNIT_STAND_STATE_DEAD);
- return;
- }
-
- InstanceScript::OnCreatureCreate(creature);
- }
-
- void OnGameObjectCreate(GameObject* pGo) override
- {
- if (pGo->GetGOInfo()->displayId == 6785 || pGo->GetGOInfo()->displayId == 1287)
- {
- HeiganEruption[GetEruptionSection(pGo->GetPositionX(), pGo->GetPositionY())].insert(pGo);
- return;
- }
- if (pGo->GetGOInfo()->entry == 361001)
- {
- HeiganEruptionTunnel.insert(pGo);
- return;
- }
-
- switch(pGo->GetEntry())
- {
- case GO_PATCHWERK_GATE:
- _patchwerkGateGUID = pGo->GetGUID();
- if (GetBossState(BOSS_PATCHWERK) == DONE)
- {
- pGo->SetGoState(GO_STATE_ACTIVE);
- }
- break;
- case GO_GLUTH_GATE:
- _gluthGateGUID = pGo->GetGUID();
- if (GetBossState(BOSS_GLUTH) == DONE)
- {
- pGo->SetGoState(GO_STATE_ACTIVE);
- }
- break;
- case GO_NOTH_ENTRY_GATE:
- _nothEntryGateGUID = pGo->GetGUID();
- if (GetBossState(BOSS_NOTH) == DONE)
- {
- pGo->SetGoState(GO_STATE_ACTIVE);
- }
- break;
- case GO_NOTH_EXIT_GATE:
- _nothExitGateGUID = pGo->GetGUID();
- if (GetBossState(BOSS_NOTH) == DONE)
- {
- pGo->SetGoState(GO_STATE_ACTIVE);
- }
- break;
- case GO_HEIGAN_ENTRY_GATE:
- _heiganGateGUID = pGo->GetGUID();
- if (GetBossState(BOSS_HEIGAN) == DONE || GetBossState(BOSS_NOTH) == DONE)
- {
- pGo->SetGoState(GO_STATE_ACTIVE);
- }
- break;
- case GO_HEIGAN_EXIT_GATE:
- _heiganGateExitGUID = pGo->GetGUID();
- if (GetBossState(BOSS_HEIGAN) == DONE)
- {
- pGo->SetGoState(GO_STATE_ACTIVE);
- }
- break;
- case GO_HEIGAN_EXIT_GATE_OLD:
- _heiganGateExitOldGUID = pGo->GetGUID();
- if (GetBossState(BOSS_HEIGAN) == DONE)
- {
- pGo->SetGoState(GO_STATE_ACTIVE);
- }
- break;
- case GO_LOATHEB_GATE:
- _loathebGateGUID = pGo->GetGUID();
- if (GetBossState(BOSS_LOATHEB) == DONE)
- {
- pGo->SetGoState(GO_STATE_ACTIVE);
- }
- break;
- case GO_ANUB_GATE:
- _anubGateGUID = pGo->GetGUID();
- if (GetBossState(BOSS_ANUB) == DONE)
- {
- pGo->SetGoState(GO_STATE_ACTIVE);
- }
- break;
- case GO_ANUB_NEXT_GATE:
- _anubNextGateGUID = pGo->GetGUID();
- if (GetBossState(BOSS_ANUB) == DONE)
- {
- pGo->SetGoState(GO_STATE_ACTIVE);
- }
- break;
- case GO_FAERLINA_GATE:
- _faerlinaGateGUID = pGo->GetGUID();
- if (GetBossState(BOSS_FAERLINA) == DONE)
- {
- pGo->SetGoState(GO_STATE_ACTIVE);
- }
- break;
- case GO_FAERLINA_WEB:
- _faerlinaWebGUID = pGo->GetGUID();
- if (GetBossState(BOSS_FAERLINA) == DONE)
- {
- pGo->SetGoState(GO_STATE_ACTIVE);
- }
- break;
- case GO_MAEXXNA_GATE:
- _maexxnaGateGUID = pGo->GetGUID();
- if (GetBossState(BOSS_FAERLINA) == DONE)
- {
- pGo->SetGoState(GO_STATE_ACTIVE);
- }
- break;
- case GO_THADDIUS_GATE:
- _thaddiusGateGUID = pGo->GetGUID();
- if (GetBossState(BOSS_GLUTH) == DONE)
- {
- pGo->SetGoState(GO_STATE_ACTIVE);
- }
- break;
- case GO_GOTHIK_ENTER_GATE:
- _gothikEnterGateGUID = pGo->GetGUID();
- break;
- case GO_GOTHIK_INNER_GATE:
- _gothikInnerGateGUID = pGo->GetGUID();
- break;
- case GO_GOTHIK_EXIT_GATE:
- _gothikExitGateGUID = pGo->GetGUID();
- if (GetBossState(BOSS_GOTHIK) == DONE)
- {
- pGo->SetGoState(GO_STATE_ACTIVE);
- }
- break;
- case GO_HORSEMEN_GATE:
- _horsemanGateGUID = pGo->GetGUID();
- if (GetBossState(BOSS_GOTHIK) == DONE)
- {
- pGo->SetGoState(GO_STATE_ACTIVE);
- }
- break;
- case GO_KELTHUZAD_FLOOR:
- _kelthuzadFloorGUID = pGo->GetGUID();
- break;
- case GO_KELTHUZAD_GATE:
- _kelthuzadGateGUID = pGo->GetGUID();
- if (GetBossState(BOSS_SAPPHIRON) == DONE && _speakTimer == 0)
- {
- pGo->SetGoState(GO_STATE_ACTIVE);
- }
- break;
- case GO_KELTHUZAD_PORTAL_1:
- _kelthuzadPortal1GUID = pGo->GetGUID();
- break;
- case GO_KELTHUZAD_PORTAL_2:
- _kelthuzadPortal2GUID = pGo->GetGUID();
- break;
- case GO_KELTHUZAD_PORTAL_3:
- _kelthuzadPortal3GUID = pGo->GetGUID();
- break;
- case GO_KELTHUZAD_PORTAL_4:
- _kelthuzadPortal4GUID = pGo->GetGUID();
- break;
- case GO_SAPPHIRON_GATE:
- _sapphironGateGUID = pGo->GetGUID();
- if (GetBossState(BOSS_SAPPHIRON) == DONE)
- {
- pGo->SetGoState(GO_STATE_ACTIVE);
- }
- break;
- case GO_LOATHEB_PORTAL:
- _loathebPortalGUID = pGo->GetGUID();
- if (GetBossState(BOSS_LOATHEB) == DONE)
- {
- pGo->SetGoState(GO_STATE_ACTIVE);
- pGo->RemoveGameObjectFlag(GO_FLAG_NOT_SELECTABLE);
- }
- break;
- case GO_THADDIUS_PORTAL:
- _thaddiusPortalGUID = pGo->GetGUID();
- if (GetBossState(BOSS_THADDIUS) == DONE)
- {
- pGo->SetGoState(GO_STATE_ACTIVE);
- pGo->RemoveGameObjectFlag(GO_FLAG_NOT_SELECTABLE);
- }
- break;
- case GO_MAEXXNA_PORTAL:
- _maexxnaPortalGUID = pGo->GetGUID();
- if (GetBossState(BOSS_MAEXXNA) == DONE)
- {
- pGo->SetGoState(GO_STATE_ACTIVE);
- pGo->RemoveGameObjectFlag(GO_FLAG_NOT_SELECTABLE);
- }
- break;
- case GO_HORSEMAN_PORTAL:
- _horsemanPortalGUID = pGo->GetGUID();
- if (GetBossState(BOSS_HORSEMAN) == DONE)
- {
- pGo->SetGoState(GO_STATE_ACTIVE);
- pGo->RemoveGameObjectFlag(GO_FLAG_NOT_SELECTABLE);
- }
- break;
-
- // Glow portals at center-side
- case GO_DEATHKNIGHT_EYE_PORTAL:
- _deathknightEyePortalGUID = pGo->GetGUID();
- if (GetBossState(BOSS_HORSEMAN) == DONE)
- {
- pGo->SetGoState(GO_STATE_ACTIVE);
- }
- break;
- case GO_PLAGUE_EYE_PORTAL:
- _plagueEyePortalGUID = pGo->GetGUID();
- if (GetBossState(BOSS_LOATHEB) == DONE)
- {
- pGo->SetGoState(GO_STATE_ACTIVE);
- }
- break;
- case GO_SPIDER_EYE_PORTAL:
- _spiderEyePortalGUID = pGo->GetGUID();
- if (GetBossState(BOSS_MAEXXNA) == DONE)
- {
- pGo->SetGoState(GO_STATE_ACTIVE);
- }
- break;
- case GO_ABOM_EYE_PORTAL:
- _abomEyePortalGUID = pGo->GetGUID();
- if (GetBossState(BOSS_THADDIUS) == DONE)
- {
- pGo->SetGoState(GO_STATE_ACTIVE);
- }
- break;
-
- // Glow portals at boss-side
- case GO_MILI_EYE_RAMP_BOSS:
- _deathknightGlowEyePortalGUID = pGo->GetGUID();
- if (GetBossState(BOSS_HORSEMAN) == DONE)
- {
- pGo->SetGoState(GO_STATE_ACTIVE);
- }
- break;
- case GO_PLAG_EYE_RAMP_BOSS:
- _plagueGlowEyePortalGUID = pGo->GetGUID();
- if (GetBossState(BOSS_LOATHEB) == DONE)
- {
- pGo->SetGoState(GO_STATE_ACTIVE);
- }
- break;
- case GO_ARAC_EYE_RAMP_BOSS:
- _spiderGlowEyePortalGUID = pGo->GetGUID();
- if (GetBossState(BOSS_MAEXXNA) == DONE)
- {
- pGo->SetGoState(GO_STATE_ACTIVE);
- }
- break;
- case GO_CONS_EYE_RAMP_BOSS:
- _abomGlowEyePortalGUID = pGo->GetGUID();
- if (GetBossState(BOSS_THADDIUS) == DONE)
- {
- pGo->SetGoState(GO_STATE_ACTIVE);
- }
- break;
- }
-
- InstanceScript::OnGameObjectCreate(pGo);
- }
-
- void OnGameObjectRemove(GameObject* pGo) override
- {
- if (pGo->GetGOInfo()->displayId == 6785 || pGo->GetGOInfo()->displayId == 1287)
- {
- uint32 section = GetEruptionSection(pGo->GetPositionX(), pGo->GetPositionY());
- HeiganEruption[section].erase(pGo);
- return;
- }
- if (pGo->GetEntry() == GO_SAPPHIRON_BIRTH)
- {
- if (Creature* cr = instance->GetCreature(_sapphironGUID))
- {
- cr->AI()->DoAction(ACTION_SAPPHIRON_BIRTH);
- }
- }
- }
-
- bool CheckAchievementCriteriaMeet(uint32 criteria_id, Player const* /*source*/, Unit const* /*target*/, uint32 /*miscvalue1*/) override
- {
- if (instance->GetDifficulty() == RAID_DIFFICULTY_10MAN_HEROIC)
- {
- return false; // No achievements in Naxx 40
- }
- switch (criteria_id)
- {
- case 7600: // And They Would All Go Down Together (10 player)
- case 7601: // And They Would All Go Down Together (25 player)
- return (_horsemanTimer < 15 * IN_MILLISECONDS);
- case 7614: // Just Can't Get Enough (10 player)
- case 7615: // Just Can't Get Enough (25 player)
- return abominationsKilled >= 18;
- case 7265: // Momma Said Knock You Out (10 player)
- case 7549: // Momma Said Knock You Out (25 player)
- return faerlinaAchievement;
- case 7604: // Shocking! (10 player)
- case 7605: // Shocking! (25 player)
- return thaddiusAchievement;
- case 7612: // Spore Loser (10 player)
- case 7613: // Spore Loser (25 player)
- return loathebAchievement;
- case 7264: // The Safety Dance (10 player)
- case 7548: // The Safety Dance (25 player)
- return heiganAchievement;
- case 7608: // Subtraction (10 player)
- // The Dedicated few (10 player)
- case 6802:
- case 7146:
- case 7147:
- case 7148:
- case 7149:
- case 7150:
- case 7151:
- case 7152:
- case 7153:
- case 7154:
- case 7155:
- case 7156:
- case 7157:
- case 7158:
- return (instance->GetPlayersCountExceptGMs() < 9);
- case 7609: // Subtraction (25 player)
- // The Dedicated few (25 player)
- case 7159:
- case 7160:
- case 7161:
- case 7162:
- case 7163:
- case 7164:
- case 7165:
- case 7166:
- case 7167:
- case 7168:
- case 7169:
- case 7170:
- case 7171:
- case 7172:
- return (instance->GetPlayersCountExceptGMs() < 21);
- case 7567: // The Hundred Club (10 player)
- case 7568: // The Hundred Club (25 player)
- return sapphironAchievement;
- // The Undying
- case 7617:
- case 13237:
- case 13238:
- case 13239:
- case 13240:
- // The Immortal
- case 7616:
- case 13233:
- case 13234:
- case 13235:
- case 13236:
- {
- uint8 count = 0;
- for (uint8 i = 0; i < MAX_ENCOUNTERS; ++i)
- {
- if (GetBossState(i) == NOT_STARTED)
- ++count;
- }
- return !count && immortalAchievement;
- }
-
- default:
- return false;
- }
- }
-
- void SetData(uint32 id, uint32 data) override
- {
- switch(id)
- {
- case DATA_ABOMINATION_KILLED:
- abominationsKilled++;
- return;
- case DATA_FRENZY_REMOVED:
- faerlinaAchievement = false;
- return;
- case DATA_CHARGES_CROSSED:
- thaddiusAchievement = false;
- return;
- case DATA_SPORE_KILLED:
- loathebAchievement = false;
- return;
- case DATA_HUNDRED_CLUB:
- sapphironAchievement = false;
- return;
- case DATA_DANCE_FAIL:
- heiganAchievement = false;
- return;
- case DATA_IMMORTAL_FAIL:
- immortalAchievement = 0;
- SaveToDB();
- return;
- case DATA_HEIGAN_ERUPTION:
- HeiganEruptSections(data);
- return;
- case DATA_HEIGAN_ERUPTION_TUNNEL_40:
- HeiganEruptSectionsTunnel();
- return;
- case DATA_HAD_THADDIUS_GREET:
- _hadThaddiusGreet = (data == 1);
- default:
- return;
- }
- }
-
- uint32 GetData(uint32 id) const override
- {
- if (id == DATA_HAD_THADDIUS_GREET && _hadThaddiusGreet)
- return 1;
+ inline void ActivateWingPortal(uint32 wingPortal)
+ {
+ ActivateWingPortal(GetGameObject(wingPortal), DONE);
+ _events.RescheduleEvent(EVENT_KELTHUZAD_WING_TAUNT, 6s);
+ }
+ static inline uint8 GetEruptionSection(float x, float y)
+ {
+ y -= HeiganPos[1];
+ if (y < 1.0f)
return 0;
- }
- bool AreAllWingsCleared() const
- {
- return (GetBossState(BOSS_MAEXXNA) == DONE) && (GetBossState(BOSS_LOATHEB) == DONE) && (GetBossState(BOSS_THADDIUS) == DONE) && (GetBossState(BOSS_HORSEMAN) == DONE);
- }
+ x -= HeiganPos[0];
+ if (x > -1.0f)
+ return 3;
- bool CheckRequiredBosses(uint32 bossId, Player const* /* player */) const override
+ float slope = y / x;
+ for (uint32 i = 0; i < 3; ++i)
+ if (slope > HeiganEruptionSlope[i])
+ return i;
+
+ return 3;
+ }
+
+ inline void HeiganEruptSections(uint32 section)
+ {
+ for (uint8 i = 0; i < HeiganEruptSectionCount; ++i)
{
- switch (bossId)
+ if (i == section)
+ continue;
+
+ for (GameObject* go : _heiganEruption[i])
{
- case BOSS_SAPPHIRON:
- if (!AreAllWingsCleared())
- {
+ go->SendCustomAnim(go->GetGoAnimProgress());
+ go->CastSpell(nullptr, SPELL_ERUPTION);
+ }
+ }
+ }
+
+ void OnPlayerEnter(Player* player) override
+ {
+ InstanceScript::OnPlayerEnter(player);
+
+ _events.ScheduleEvent(EVENT_THADDIUS_SCREAMS, 2min, 2min + 30s);
+ }
+
+ void OnCreatureCreate(Creature* creature) override
+ {
+ switch (creature->GetEntry())
+ {
+ case NPC_ROTTING_MAGGOT_40:
+ case NPC_DISEASED_MAGGOT_40:
+ case NPC_EYE_STALK_40:
+ _heiganBackRoomTrash.push_back(creature->GetGUID());
+ return;
+ case NPC_LIVING_MONSTROSITY:
+ case NPC_MAD_SCIENTIST:
+ case NPC_PATCHWORK_GOLEM:
+ case NPC_SURGICAL_ASSIST:
+ case NPC_LIVING_MONSTROSITY_40:
+ case NPC_MAD_SCIENTIST_40:
+ case NPC_PATCHWORK_GOLEM_40:
+ case NPC_SURGICAL_ASSIST_40:
+ _patchwerkRoomTrash.push_back(creature->GetGUID());
+ return;
+ case NPC_BILE_RETCHER:
+ case NPC_SLUDGE_BELCHER:
+ case NPC_BILE_RETCHER_40:
+ case NPC_SLUDGE_BELCHER_40:
+ if (creature->GetPositionY() > -3258.0f) // we want only those inside the room, not before
+ _patchwerkRoomTrash.push_back(creature->GetGUID());
+ return;
+ case NPC_BARON_RIVENDARE:
+ case NPC_SIR_ZELIEK:
+ case NPC_LADY_BLAUMEUX:
+ case NPC_THANE_KORTHAZZ:
+ case NPC_HIGHLORD_MOGRAINE_40:
+ case NPC_SIR_ZELIEK_40:
+ case NPC_LADY_BLAUMEUX_40:
+ case NPC_THANE_KORTHAZZ_40:
+ if (++_horsemanLoaded == HorsemanCount)
+ SetBossState(BOSS_HORSEMAN, GetBossState(BOSS_HORSEMAN));
+ break;
+ default:
+ break;
+ }
+
+ InstanceScript::OnCreatureCreate(creature);
+ }
+
+ void OnGameObjectCreate(GameObject* go) override
+ {
+ switch (go->GetGOInfo()->displayId)
+ {
+ case GO_DISPLAY_ID_HEIGAN_ERUPTION1:
+ case GO_DISPLAY_ID_HEIGAN_ERUPTION2:
+ _heiganEruption[GetEruptionSection(go->GetPositionX(), go->GetPositionY())].insert(go);
+ break;
+ default:
+ break;
+ }
+
+ switch (go->GetEntry())
+ {
+ case GO_SAPPHIRON_GATE:
+ if (GetBossState(BOSS_SAPPHIRON) == DONE)
+ go->SetGoState(GO_STATE_ACTIVE);
+ break;
+ case GO_LOATHEB_PORTAL:
+ ActivateWingPortal(go, GetBossState(BOSS_LOATHEB));
+ break;
+ case GO_THADDIUS_PORTAL:
+ ActivateWingPortal(go, GetBossState(BOSS_THADDIUS));
+ break;
+ case GO_MAEXXNA_PORTAL:
+ ActivateWingPortal(go, GetBossState(BOSS_MAEXXNA));
+ break;
+ case GO_HORSEMAN_PORTAL:
+ ActivateWingPortal(go, GetBossState(BOSS_HORSEMAN));
+ break;
+ default:
+ break;
+ }
+
+ InstanceScript::OnGameObjectCreate(go);
+ }
+
+ void OnGameObjectRemove(GameObject* go) override
+ {
+ switch (go->GetGOInfo()->displayId)
+ {
+ case GO_DISPLAY_ID_HEIGAN_ERUPTION1:
+ case GO_DISPLAY_ID_HEIGAN_ERUPTION2:
+ _heiganEruption[GetEruptionSection(go->GetPositionX(), go->GetPositionY())].erase(go);
+ break;
+ default:
+ break;
+ }
+
+ switch (go->GetEntry())
+ {
+ case GO_SAPPHIRON_BIRTH:
+ if (Creature* cr = GetCreature(DATA_SAPPHIRON_BOSS))
+ cr->AI()->DoAction(ACTION_SAPPHIRON_BIRTH);
+ break;
+ default:
+ break;
+ }
+
+ InstanceScript::OnGameObjectRemove(go);
+ }
+
+ bool CheckAchievementCriteriaMeet(uint32 criteria_id, Player const* /*source*/, Unit const* /*target*/, uint32 /*miscvalue1*/) override
+ {
+ if (instance->GetDifficulty() == RAID_DIFFICULTY_10MAN_HEROIC)
+ return false; // No achievements in Naxx 40
+
+ switch (criteria_id)
+ {
+ case ACHIEV_CRITERIA_AND_THEY_WOULD_ALL_GO_DOWN_TOGETHER_10_PLAYER:
+ case ACHIEV_CRITERIA_AND_THEY_WOULD_ALL_GO_DOWN_TOGETHER_25_PLAYER:
+ return _horsemanAchievement;
+ case ACHIEV_CRITERIA_JUST_CANT_GET_ENOUGH_10_PLAYER:
+ case ACHIEV_CRITERIA_JUST_CANT_GET_ENOUGH_25_PLAYER:
+ return _abominationsKilled >= AbominationKillCountReq;
+ case ACHIEV_CRITERIA_MOMMA_SAID_KNOCK_YOU_OUT_10_PLAYER:
+ case ACHIEV_CRITERIA_MOMMA_SAID_KNOCK_YOU_OUT_25_PLAYER:
+ return _faerlinaAchievement;
+ case ACHIEV_CRITERIA_SHOKING_10_PLAYER:
+ case ACHIEV_CRITERIA_SHOKING_25_PLAYER:
+ return _thaddiusAchievement;
+ case ACHIEV_CRITERIA_SPORE_LOSER_10_PLAYER:
+ case ACHIEV_CRITERIA_SPORE_LOSER_25_PLAYER:
+ return _loathebAchievement;
+ case ACHIEV_CRITERIA_THE_SAFETY_DANCE_10_PLAYER:
+ case ACHIEV_CRITERIA_THE_SAFETY_DANCE_25_PLAYER:
+ return _heiganAchievement;
+ case ACHIEV_CRITERIA_SUBTRACTION_10_PLAYER:
+ case ACHIEV_CRITERIA_THE_DEDICATED_FEW_KELTHUZAD_10_PLAYER:
+ case ACHIEV_CRITERIA_THE_DEDICATED_FEW_GOTHIK_10_PLAYER:
+ case ACHIEV_CRITERIA_THE_DEDICATED_FEW_ANUB_10_PLAYER:
+ case ACHIEV_CRITERIA_THE_DEDICATED_FEW_GROBBULUS_10_PLAYER:
+ case ACHIEV_CRITERIA_THE_DEDICATED_FEW_HEIGAN_10_PLAYER:
+ case ACHIEV_CRITERIA_THE_DEDICATED_FEW_FAERLINA_10_PLAYER:
+ case ACHIEV_CRITERIA_THE_DEDICATED_FEW_MAEXXNA_10_PLAYER:
+ case ACHIEV_CRITERIA_THE_DEDICATED_FEW_SAPPHIRON_10_PLAYER:
+ case ACHIEV_CRITERIA_THE_DEDICATED_FEW_LOATHEB_10_PLAYER:
+ case ACHIEV_CRITERIA_THE_DEDICATED_FEW_GLUTH_10_PLAYER:
+ case ACHIEV_CRITERIA_THE_DEDICATED_FEW_THADDIUS_10_PLAYER:
+ case ACHIEV_CRITERIA_THE_DEDICATED_FEW_PATCHWERK_10_PLAYER:
+ case ACHIEV_CRITERIA_THE_DEDICATED_FEW_RAZUVIOUS_10_PLAYER:
+ case ACHIEV_CRITERIA_THE_DEDICATED_FEW_NOTH_10_PLAYER:
+ return instance->GetPlayersCountExceptGMs() < TheDedicatedFew10PlayerReq;
+ case ACHIEV_CRITERIA_SUBTRACTION_25_PLAYER:
+ case ACHIEV_CRITERIA_THE_DEDICATED_FEW_ANUB_25_PLAYER:
+ case ACHIEV_CRITERIA_THE_DEDICATED_FEW_FAERLINA_25_PLAYER:
+ case ACHIEV_CRITERIA_THE_DEDICATED_FEW_MAEXXNA_25_PLAYER:
+ case ACHIEV_CRITERIA_THE_DEDICATED_FEW_PATCHWERK_25_PLAYER:
+ case ACHIEV_CRITERIA_THE_DEDICATED_FEW_GROBBULUS_25_PLAYER:
+ case ACHIEV_CRITERIA_THE_DEDICATED_FEW_GLUTH_25_PLAYER:
+ case ACHIEV_CRITERIA_THE_DEDICATED_FEW_THADDIUS_25_PLAYER:
+ case ACHIEV_CRITERIA_THE_DEDICATED_FEW_NOTH_25_PLAYER:
+ case ACHIEV_CRITERIA_THE_DEDICATED_FEW_HEIGAN_25_PLAYER:
+ case ACHIEV_CRITERIA_THE_DEDICATED_FEW_LOATHEB_25_PLAYER:
+ case ACHIEV_CRITERIA_THE_DEDICATED_FEW_RAZUVIOUS_25_PLAYER:
+ case ACHIEV_CRITERIA_THE_DEDICATED_FEW_GOTHIK_25_PLAYER:
+ case ACHIEV_CRITERIA_THE_DEDICATED_FEW_SAPPHIRON_25_PLAYER:
+ case ACHIEV_CRITERIA_THE_DEDICATED_FEW_KELTHUZAD_25_PLAYER:
+ return instance->GetPlayersCountExceptGMs() < TheDedicatedFew25PlayerReq;
+ case ACHIEV_CRITERIA_THE_HUNDRED_CLUB_10_PLAYER:
+ case ACHIEV_CRITERIA_THE_HUNDRED_CLUB_25_PLAYER:
+ return _sapphironAchievement;
+ case ACHIEV_CRITERIA_THE_UNDYING_KELTHUZAD:
+ case ACHIEV_CRITERIA_THE_UNDYING_THE_FOUR_HORSEMEN:
+ case ACHIEV_CRITERIA_THE_UNDYING_MAEXXNA:
+ case ACHIEV_CRITERIA_THE_UNDYING_LOATHEB:
+ case ACHIEV_CRITERIA_THE_UNDYING_THADDIUS:
+ case ACHIEV_CRITERIA_THE_IMMORTAL_KELTHUZAD:
+ case ACHIEV_CRITERIA_THE_IMMORTAL_THE_FOUR_HORSEMEN:
+ case ACHIEV_CRITERIA_THE_IMMORTAL_MAEXXNA:
+ case ACHIEV_CRITERIA_THE_IMMORTAL_LOATHEB:
+ case ACHIEV_CRITERIA_THE_IMMORTAL_THADDIUS:
+ for (int i = 0; i < MAX_ENCOUNTERS; ++i)
+ if (GetBossState(i) != DONE)
return false;
- }
- break;
- default:
- break;
- }
- return true;
- }
- void Load(const char* data) override
- {
- _horsemanLoadDoneState = true;
- InstanceScript::Load(data);
- if (GetBossState(BOSS_HORSEMAN) != DONE)
- {
- _horsemanLoadDoneState = false;
- }
- }
-
- bool SetBossState(uint32 bossId, EncounterState state) override
- {
- // pull all the trash if not killed
- if (bossId == BOSS_PATCHWERK && state == IN_PROGRESS)
- {
- if (Creature* patch = instance->GetCreature(_patchwerkGUID))
- {
- for (auto& itr : PatchwerkRoomTrash)
- {
- Creature* trash = ObjectAccessor::GetCreature(*patch, itr);
- if (trash && trash->IsAlive() && !trash->IsInCombat())
- {
- trash->AI()->AttackStart(patch->GetVictim());
- }
- }
- }
- }
-
- // Horseman handling
- if (bossId == BOSS_HORSEMAN)
- {
- if (state == DONE && !_horsemanLoadDoneState)
- {
- _horsemanTimer++;
- _horsemanKilled++;
- if (_horsemanKilled < 4)
- {
- return false;
- }
- // All horsemans are killed
- if (Creature* cr = instance->GetCreature(_blaumeuxGUID))
- {
- cr->CastSpell(cr, 59450, true); // credit
- }
- }
-
- // respawn
- else if (state == NOT_STARTED && _horsemanKilled > 0)
- {
- Creature* cr;
- _horsemanKilled = 0;
- if ((cr = instance->GetCreature(_blaumeuxGUID)))
- {
- if (!cr->IsAlive())
- {
- cr->SetPosition(cr->GetHomePosition());
- cr->Respawn();
- }
- }
- if ((cr = instance->GetCreature(_rivendareGUID)))
- {
- if (!cr->IsAlive())
- {
- cr->SetPosition(cr->GetHomePosition());
- cr->Respawn();
- }
- }
- if ((cr = instance->GetCreature(_zeliekGUID)))
- {
- if (!cr->IsAlive())
- {
- cr->SetPosition(cr->GetHomePosition());
- cr->Respawn();
- }
- }
- if ((cr = instance->GetCreature(_korthazzGUID)))
- {
- if (!cr->IsAlive())
- {
- cr->SetPosition(cr->GetHomePosition());
- cr->Respawn();
- }
- }
- }
- else if (state == IN_PROGRESS)
- {
- Creature* cr;
- if ((cr = instance->GetCreature(_blaumeuxGUID)))
- {
- cr->SetInCombatWithZone();
- }
- if ((cr = instance->GetCreature(_rivendareGUID)))
- {
- cr->SetInCombatWithZone();
- }
- if ((cr = instance->GetCreature(_zeliekGUID)))
- {
- cr->SetInCombatWithZone();
- }
- if ((cr = instance->GetCreature(_korthazzGUID)))
- {
- cr->SetInCombatWithZone();
- }
- }
-
- if (state == NOT_STARTED)
- {
- _horsemanTimer = 0;
- }
- }
-
- if (!InstanceScript::SetBossState(bossId, state))
+ return !GetPersistentData(PERSISTENT_DATA_IMMORTAL_FAIL);
+ default:
return false;
+ }
+ }
- // Bosses data
- switch(bossId)
+ void SetData(uint32 id, uint32 data) override
+ {
+ switch (id)
+ {
+ case DATA_ABOMINATION_KILLED:
+ ++_abominationsKilled;
+ return;
+ case DATA_FRENZY_REMOVED:
+ _faerlinaAchievement = false;
+ return;
+ case DATA_CHARGES_CROSSED:
+ _thaddiusAchievement = false;
+ return;
+ case DATA_SPORE_KILLED:
+ _loathebAchievement = false;
+ return;
+ case DATA_HUNDRED_CLUB:
+ _sapphironAchievement = false;
+ return;
+ case DATA_DANCE_FAIL:
+ _heiganAchievement = false;
+ return;
+ case DATA_HEIGAN_ERUPTION:
+ HeiganEruptSections(data);
+ return;
+ default:
+ return;
+ }
+ }
+
+ bool SetBossState(uint32 bossId, EncounterState state) override
+ {
+ switch (bossId)
+ {
+ case BOSS_PATCHWERK:
{
- case BOSS_KELTHUZAD:
- if (state == NOT_STARTED)
- {
- abominationsKilled = 0;
- }
+ if (state != IN_PROGRESS)
break;
- case BOSS_FAERLINA:
- if (state == NOT_STARTED)
- {
- faerlinaAchievement = true;
- }
- break;
- case BOSS_THADDIUS:
- if (state == NOT_STARTED)
- {
- thaddiusAchievement = true;
- }
- break;
- case BOSS_LOATHEB:
- if (state == NOT_STARTED)
- {
- loathebAchievement = true;
- }
- break;
- case BOSS_HEIGAN:
- if (state == NOT_STARTED)
- {
- heiganAchievement = true;
- }
- break;
- case BOSS_SAPPHIRON:
- if (state == DONE)
- {
- _speakTimer = 1;
- // Load KT's grid so he can talk
- instance->LoadGrid(3763.43f, -5115.87f);
- }
- else if (state == NOT_STARTED)
- {
- sapphironAchievement = true;
- }
- break;
- default:
- break;
- }
- // Save instance and open gates
- if (state == DONE)
- {
- SaveToDB();
-
- switch (bossId)
+ // pull all the trash if not killed
+ if (Creature* patchwerk = GetCreature(DATA_PATCHWERK_BOSS))
{
- case BOSS_PATCHWERK:
- if (GameObject* go = instance->GetGameObject(_patchwerkGateGUID))
- {
- go->SetGoState(GO_STATE_ACTIVE);
- }
+ for (auto& itr : _patchwerkRoomTrash)
+ {
+ Creature* trash = ObjectAccessor::GetCreature(*patchwerk, itr);
+ if (trash && trash->IsAlive() && !trash->IsInCombat())
+ trash->AI()->AttackStart(patchwerk->GetVictim());
+ }
+ }
+
+ break;
+ }
+ case BOSS_HEIGAN:
+ {
+ if (state == NOT_STARTED)
+ _heiganAchievement = true;
+
+ if (state == DONE)
+ for (auto const& guid : _heiganBackRoomTrash)
+ if (Creature* creature = instance->GetCreature(guid))
+ creature->DespawnOrUnsummon();
+ break;
+ }
+ case BOSS_LOATHEB:
+ {
+ switch (state)
+ {
+ case NOT_STARTED:
+ _loathebAchievement = true;
break;
- case BOSS_GLUTH:
- if (GameObject* go = instance->GetGameObject(_gluthGateGUID))
- {
- go->SetGoState(GO_STATE_ACTIVE);
- }
- if (GameObject* go = instance->GetGameObject(_thaddiusGateGUID))
- {
- go->SetGoState(GO_STATE_ACTIVE);
- }
- break;
- case BOSS_NOTH:
- if (GameObject* go = instance->GetGameObject(_nothExitGateGUID))
- {
- go->SetGoState(GO_STATE_ACTIVE);
- }
- if (GameObject* go = instance->GetGameObject(_heiganGateGUID))
- {
- go->SetGoState(GO_STATE_ACTIVE);
- }
- break;
- case BOSS_HEIGAN:
- for (auto& mobGUID : HeiganBackRoomAdds)
- {
- if (Creature* mob = instance->GetCreature(mobGUID))
- {
- mob->DespawnOrUnsummon();
- }
- }
- if (GameObject* go = instance->GetGameObject(_heiganGateGUID))
- {
- go->SetGoState(GO_STATE_ACTIVE);
- }
- if (GameObject* go = instance->GetGameObject(_heiganGateExitGUID))
- {
- go->SetGoState(GO_STATE_ACTIVE);
- }
- if (GameObject* go = instance->GetGameObject(_heiganGateExitOldGUID))
- {
- go->SetGoState(GO_STATE_ACTIVE);
- }
- break;
- case BOSS_LOATHEB:
- if (GameObject* go = instance->GetGameObject(_loathebGateGUID))
- {
- go->SetGoState(GO_STATE_ACTIVE);
- }
- if (GameObject* go = instance->GetGameObject(_loathebPortalGUID))
- {
- go->SetGoState(GO_STATE_ACTIVE);
- go->RemoveGameObjectFlag(GO_FLAG_NOT_SELECTABLE);
- }
- if (GameObject* go = instance->GetGameObject(_plagueEyePortalGUID))
- {
- go->SetGoState(GO_STATE_ACTIVE);
- }
- if (GameObject* go = instance->GetGameObject(_plagueGlowEyePortalGUID))
- {
- go->SetGoState(GO_STATE_ACTIVE);
- }
- events.ScheduleEvent(EVENT_KELTHUZAD_WING_TAUNT, 6000);
- break;
- case BOSS_ANUB:
- if (GameObject* go = instance->GetGameObject(_anubGateGUID))
- {
- go->SetGoState(GO_STATE_ACTIVE);
- }
- if (GameObject* go = instance->GetGameObject(_anubNextGateGUID))
- {
- go->SetGoState(GO_STATE_ACTIVE);
- }
- break;
- case BOSS_FAERLINA:
- if (GameObject* go = instance->GetGameObject(_faerlinaGateGUID))
- {
- go->SetGoState(GO_STATE_ACTIVE);
- }
- if (GameObject* go = instance->GetGameObject(_maexxnaGateGUID))
- {
- go->SetGoState(GO_STATE_ACTIVE);
- }
- break;
- case BOSS_MAEXXNA:
- if (GameObject* go = instance->GetGameObject(_maexxnaGateGUID))
- {
- go->SetGoState(GO_STATE_ACTIVE);
- }
- if (GameObject* go = instance->GetGameObject(_maexxnaPortalGUID))
- {
- go->SetGoState(GO_STATE_ACTIVE);
- go->RemoveGameObjectFlag(GO_FLAG_NOT_SELECTABLE);
- }
- if (GameObject* go = instance->GetGameObject(_spiderEyePortalGUID))
- {
- go->SetGoState(GO_STATE_ACTIVE);
- }
- if (GameObject* go = instance->GetGameObject(_spiderGlowEyePortalGUID))
- {
- go->SetGoState(GO_STATE_ACTIVE);
- }
- events.ScheduleEvent(EVENT_KELTHUZAD_WING_TAUNT, 6000);
- break;
- case BOSS_GOTHIK:
- if (GameObject* go = instance->GetGameObject(_gothikEnterGateGUID))
- {
- go->SetGoState(GO_STATE_ACTIVE);
- }
- if (GameObject* go = instance->GetGameObject(_gothikExitGateGUID))
- {
- go->SetGoState(GO_STATE_ACTIVE);
- }
- if (GameObject* go = instance->GetGameObject(_horsemanGateGUID))
- {
- go->SetGoState(GO_STATE_ACTIVE);
- }
- break;
- case BOSS_SAPPHIRON:
- events.ScheduleEvent(EVENT_FROSTWYRM_WATERFALL_DOOR, 5000);
- break;
- case BOSS_THADDIUS:
- if (GameObject* go = instance->GetGameObject(_thaddiusPortalGUID))
- {
- go->SetGoState(GO_STATE_ACTIVE);
- go->RemoveGameObjectFlag(GO_FLAG_NOT_SELECTABLE);
- }
- if (GameObject* go = instance->GetGameObject(_abomEyePortalGUID))
- {
- go->SetGoState(GO_STATE_ACTIVE);
- }
- if (GameObject* go = instance->GetGameObject(_abomGlowEyePortalGUID))
- {
- go->SetGoState(GO_STATE_ACTIVE);
- }
- events.ScheduleEvent(EVENT_KELTHUZAD_WING_TAUNT, 6000);
- break;
- case BOSS_HORSEMAN:
- if (GameObject* go = instance->GetGameObject(_horsemanPortalGUID))
- {
- go->SetGoState(GO_STATE_ACTIVE);
- go->RemoveGameObjectFlag(GO_FLAG_NOT_SELECTABLE);
- }
- if (GameObject* go = instance->GetGameObject(_deathknightEyePortalGUID))
- {
- go->SetGoState(GO_STATE_ACTIVE);
- }
- if (GameObject* go = instance->GetGameObject(_deathknightGlowEyePortalGUID))
- {
- go->SetGoState(GO_STATE_ACTIVE);
- }
- events.ScheduleEvent(EVENT_KELTHUZAD_WING_TAUNT, 6000);
+ case DONE:
+ ActivateWingPortal(DATA_LOATHEB_PORTAL);
break;
default:
break;
}
- }
- return true;
- }
- void Update(uint32 diff) override
- {
- if (_speakTimer)
+ break;
+ }
+ case BOSS_FAERLINA:
{
- Creature* kel = instance->GetCreature(_kelthuzadGUID);
- Creature* lich = instance->GetCreature(_lichkingGUID);
- if (kel && lich)
+ if (state == NOT_STARTED)
+ _faerlinaAchievement = true;
+
+ break;
+ }
+ case BOSS_MAEXXNA:
+ {
+ if (state == DONE)
+ ActivateWingPortal(DATA_MAEXXNA_PORTAL);
+
+ break;
+ }
+ case BOSS_THADDIUS:
+ {
+ switch (state)
{
- _speakTimer += diff;
+ case NOT_STARTED:
+ _thaddiusAchievement = true;
+ break;
+ case DONE:
+ ActivateWingPortal(DATA_THADDIUS_PORTAL);
+ break;
+ default:
+ break;
}
- else
+
+ break;
+ }
+ case BOSS_HORSEMAN:
+ {
+ uint32 horsemanKilled = std::count_if(HorsemanDataGroup.begin(), HorsemanDataGroup.end(), [this](auto&& entry)
{
- return;
- }
- if (_speakTimer > 10000 && _speakTimer < 20000)
+ Creature* cr = GetCreature(entry);
+ return cr && !cr->IsAlive();
+ });
+
+ switch (state)
{
- kel->AI()->Talk(SAY_SAPP_DIALOG1);
- _speakTimer = 20000;
- }
- else if (_speakTimer > 30000 && _speakTimer < 40000)
- {
- lich->AI()->Talk(SAY_SAPP_DIALOG2_LICH);
- _speakTimer = 40000;
- }
- else if (_speakTimer > 54000 && _speakTimer < 60000)
- {
- kel->AI()->Talk(SAY_SAPP_DIALOG3);
- _speakTimer = 60000;
- }
- else if (_speakTimer > 70000 && _speakTimer < 80000)
- {
- lich->AI()->Talk(SAY_SAPP_DIALOG4_LICH);
- _speakTimer = 80000;
- }
- else if (_speakTimer > 92000 && _speakTimer < 100000)
- {
- kel->AI()->Talk(SAY_SAPP_DIALOG5);
- _speakTimer = 100000;
- }
- else if (_speakTimer > 105000)
- {
- kel->AI()->Talk(SAY_SAPP_DIALOG6);
- _speakTimer = 0;
- if (GameObject* go = instance->GetGameObject(_kelthuzadGateGUID))
+ case NOT_STARTED:
{
- go->SetGoState(GO_STATE_ACTIVE);
+ _horsemanAchievement = true;
+
+ if (!horsemanKilled)
+ break;
+
+ for (auto&& entry : HorsemanDataGroup)
+ {
+ if (Creature* cr = GetCreature(entry))
+ {
+ cr->SetPosition(cr->GetHomePosition());
+ cr->Respawn();
+ }
+ }
+
+ break;
}
- }
- }
-
- // And They would all
- if (_horsemanTimer)
- {
- _horsemanTimer += diff;
- }
-
- if (_screamTimer && GetBossState(BOSS_THADDIUS) != DONE)
- {
- if (_screamTimer <= diff)
- {
- instance->PlayDirectSoundToMap(SOUND_SCREAM + urand(0, 3));
- _screamTimer = (2 * MINUTE + urand(0, 30)) * IN_MILLISECONDS;
- }
- else
- {
- _screamTimer -= diff;
- }
- }
-
- events.Update(diff);
- switch (events.ExecuteEvent())
- {
- case EVENT_KELTHUZAD_WING_TAUNT:
- // Loads Kel'Thuzad's grid. We need this as he must be active in order for his texts to work.
- instance->LoadGrid(3749.67f, -5114.06f);
- if (Creature* kelthuzad = instance->GetCreature(_kelthuzadGUID))
+ case IN_PROGRESS:
{
- kelthuzad->AI()->Talk(_currentWingTaunt);
+ for (auto&& entry : HorsemanDataGroup)
+ if (Creature* cr = GetCreature(entry))
+ cr->SetInCombatWithZone();
+
+ break;
}
- ++_currentWingTaunt;
- break;
- case EVENT_FROSTWYRM_WATERFALL_DOOR:
- if (GameObject* go = instance->GetGameObject(_sapphironGateGUID))
+ case DONE:
{
- go->SetGoState(GO_STATE_ACTIVE);
+ _events.RescheduleEvent(EVENT_AND_THEY_WOULD_ALL_GO_DOWN_TOGETHER, 15s);
+
+ if (horsemanKilled != HorsemanCount)
+ return false;
+
+ // all horsemans are killed
+ if (Creature* cr = GetCreature(DATA_BARON_RIVENDARE_BOSS))
+ cr->CastSpell(cr, SPELL_THE_FOUR_HORSEMAN_CREDIT, true);
+
+ ActivateWingPortal(DATA_HORSEMAN_PORTAL);
+ break;
}
- break;
+ default:
+ break;
+ }
+
+ break;
}
- }
-
- ObjectGuid GetGuidData(uint32 id) const override
- {
- switch (id)
+ case BOSS_SAPPHIRON:
{
- // GameObjects
- case DATA_HEIGAN_ENTER_GATE:
- return _heiganGateGUID;
- case DATA_HEIGAN_EXIT_GATE_OLD_40:
- return _heiganGateExitOldGUID;
- case DATA_HEIGAN_EXIT_GATE_40:
- return _heiganGateExitGUID;
- case DATA_LOATHEB_GATE:
- return _loathebGateGUID;
- case DATA_ANUB_GATE:
- return _anubGateGUID;
- case DATA_FAERLINA_WEB:
- return _faerlinaWebGUID;
- case DATA_MAEXXNA_GATE:
- return _maexxnaGateGUID;
- case DATA_GOTHIK_ENTER_GATE:
- return _gothikEnterGateGUID;
- case DATA_GOTHIK_INNER_GATE:
- return _gothikInnerGateGUID;
- case DATA_GOTHIK_EXIT_GATE:
- return _gothikExitGateGUID;
- case DATA_HORSEMEN_GATE:
- return _horsemanGateGUID;
- case DATA_THADDIUS_GATE:
- return _thaddiusGateGUID;
- case DATA_NOTH_ENTRY_GATE:
- return _nothEntryGateGUID;
- case DATA_KELTHUZAD_FLOOR:
- return _kelthuzadFloorGUID;
- case DATA_KELTHUZAD_GATE:
- return _kelthuzadGateGUID;
- case DATA_KELTHUZAD_PORTAL_1:
- return _kelthuzadPortal1GUID;
- case DATA_KELTHUZAD_PORTAL_2:
- return _kelthuzadPortal2GUID;
- case DATA_KELTHUZAD_PORTAL_3:
- return _kelthuzadPortal3GUID;
- case DATA_KELTHUZAD_PORTAL_4:
- return _kelthuzadPortal4GUID;
+ switch (state)
+ {
+ case NOT_STARTED:
+ _sapphironAchievement = true;
+ break;
+ case DONE:
+ {
+ if (GetPersistentData(PERSISTENT_DATA_KELTHUZAD_DIALOG))
+ break;
- // NPCs
- case DATA_THADDIUS_BOSS:
- return _thaddiusGUID;
- case DATA_STALAGG_BOSS:
- return _stalaggGUID;
- case DATA_FEUGEN_BOSS:
- return _feugenGUID;
- case DATA_GOTHIK_BOSS:
- return _gothikGUID;
- case DATA_LICH_KING_BOSS:
- return _lichkingGUID;
- default:
- break;
- }
-
- return ObjectGuid::Empty;
- }
-
- void ReadSaveDataMore(std::istringstream& data) override
- {
- data >> immortalAchievement;
+ StorePersistentData(PERSISTENT_DATA_KELTHUZAD_DIALOG, 1);
+ SetGoState(DATA_KELTHUZAD_GATE, GO_STATE_READY);
+ _events.ScheduleEvent(EVENT_FROSTWYRM_WATERFALL_DOOR, 5s);
+ break;
}
+ default:
+ break;
+ }
- void WriteSaveDataMore(std::ostringstream& data) override
+ break;
+ }
+ case BOSS_KELTHUZAD:
{
- data << immortalAchievement;
+ if (state == NOT_STARTED)
+ _abominationsKilled = 0;
+
+ break;
+ }
+ default:
+ break;
}
- };
-};
-class boss_naxxramas_misc : public CreatureScript
-{
-public:
- boss_naxxramas_misc() : CreatureScript("boss_naxxramas_misc") { }
-
- CreatureAI* GetAI(Creature* pCreature) const override
- {
- return GetNaxxramasAI(pCreature);
+ return InstanceScript::SetBossState(bossId, state);
}
- struct boss_naxxramas_miscAI : public NullCreatureAI
+ void Update(uint32 diff) override
{
- explicit boss_naxxramas_miscAI(Creature* c) : NullCreatureAI(c)
- {
- timer = 0;
- }
+ _events.Update(diff);
- uint32 timer;
-
- void JustDied(Unit* /*killer*/) override
+ switch (_events.ExecuteEvent())
{
- if (me->GetEntry() == NPC_MR_BIGGLESWORTH && me->GetInstanceScript())
+ case EVENT_THADDIUS_SCREAMS:
{
- if (Creature* cr = me->SummonCreature(20350/*NPC_KELTHUZAD*/, *me, TEMPSUMMON_TIMED_DESPAWN, 1))
- {
- cr->SetDisplayId(11686);
- cr->AI()->Talk(SAY_CAT_DIED);
- }
- }
- }
+ if (GetBossState(BOSS_THADDIUS) == DONE)
+ break;
- void UpdateAI(uint32 diff) override
- {
- if (me->GetEntry() == NPC_NAXXRAMAS_TRIGGER)
- {
- timer += diff;
- if (timer >= 5000)
- {
- if (Creature* cr = me->SummonCreature(NPC_LIVING_POISON, 3128.59, -3118.81, 293.346, 4.76754, TEMPSUMMON_TIMED_DESPAWN, 15200))
- {
- cr->AddUnitMovementFlag(MOVEMENTFLAG_WALKING);
- cr->GetMotionMaster()->MovePoint(0, 3130.322, -3156.51, 293.324, false);
- }
- if (Creature* cr = me->SummonCreature(NPC_LIVING_POISON, *me, TEMPSUMMON_TIMED_DESPAWN, 14800))
- {
- cr->AddUnitMovementFlag(MOVEMENTFLAG_WALKING);
- cr->GetMotionMaster()->MovePoint(0, 3144.779, -3158.416, 293.324, false);
- }
- if (Creature* cr = me->SummonCreature(NPC_LIVING_POISON, 3175.42, -3134.86, 293.34, 4.284, TEMPSUMMON_TIMED_DESPAWN, 14800))
- {
- cr->AddUnitMovementFlag(MOVEMENTFLAG_WALKING);
- cr->GetMotionMaster()->MovePoint(0, 3158.778, -3164.201, 293.312, false);
- }
- timer = 0;
- }
- }
- else if (me->GetEntry() == NPC_LIVING_POISON)
- {
- Unit* target = nullptr;
- Acore::AnyUnfriendlyUnitInObjectRangeCheck u_check(me, me, 0.5f);
- Acore::UnitLastSearcher searcher(me, target, u_check);
- Cell::VisitAllObjects(me, searcher, 1.5f);
- if (target)
- {
- me->CastSpell(me, SPELL_FROGGER_EXPLODE, true);
- }
+ instance->PlayDirectSoundToMap(SOUND_SCREAM + urand(0, 3));
+ return _events.ScheduleEvent(EVENT_THADDIUS_SCREAMS, 2min, 2min + 30s);
}
+ case EVENT_AND_THEY_WOULD_ALL_GO_DOWN_TOGETHER:
+ _horsemanAchievement = false;
+ break;
+ case EVENT_KELTHUZAD_WING_TAUNT:
+ return CreatureTalk(DATA_KELTHUZAD_BOSS, _currentWingTaunt++);
+ case EVENT_HORSEMEN_INTRO1:
+ CreatureTalk(DATA_THANE_KORTHAZZ_BOSS, SAY_HORSEMEN_DIALOG1);
+ return _events.ScheduleEvent(EVENT_HORSEMEN_INTRO2, 4500ms);
+ case EVENT_HORSEMEN_INTRO2:
+ CreatureTalk(DATA_SIR_ZELIEK_BOSS, SAY_HORSEMEN_DIALOG1);
+ return _events.ScheduleEvent(EVENT_HORSEMEN_INTRO3, 6500ms);
+ case EVENT_HORSEMEN_INTRO3:
+ CreatureTalk(DATA_LADY_BLAUMEUX_BOSS, SAY_HORSEMEN_DIALOG1);
+ return _events.ScheduleEvent(EVENT_HORSEMEN_INTRO4, 6500ms);
+ case EVENT_HORSEMEN_INTRO4:
+ CreatureTalk(DATA_BARON_RIVENDARE_BOSS, SAY_HORSEMEN_DIALOG1);
+ return _events.ScheduleEvent(EVENT_HORSEMEN_INTRO5, 6500ms);
+ case EVENT_HORSEMEN_INTRO5:
+ CreatureTalk(DATA_LADY_BLAUMEUX_BOSS, SAY_HORSEMEN_DIALOG2);
+ return _events.ScheduleEvent(EVENT_HORSEMEN_INTRO6, 6500ms);
+ case EVENT_HORSEMEN_INTRO6:
+ CreatureTalk(DATA_SIR_ZELIEK_BOSS, SAY_HORSEMEN_DIALOG2);
+ return _events.ScheduleEvent(EVENT_HORSEMEN_INTRO7, 6500ms);
+ case EVENT_HORSEMEN_INTRO7:
+ CreatureTalk(DATA_THANE_KORTHAZZ_BOSS, SAY_HORSEMEN_DIALOG2);
+ return _events.ScheduleEvent(EVENT_HORSEMEN_INTRO8, 6500ms);
+ case EVENT_HORSEMEN_INTRO8:
+ return CreatureTalk(DATA_BARON_RIVENDARE_BOSS, SAY_HORSEMEN_DIALOG2);
+ case EVENT_FROSTWYRM_WATERFALL_DOOR:
+ SetGoState(DATA_SAPPHIRON_GATE, GO_STATE_ACTIVE);
+ return _events.ScheduleEvent(EVENT_KELTHUZAD_LICH_KING_TALK1, 5s);
+ case EVENT_KELTHUZAD_LICH_KING_TALK1:
+ CreatureTalk(DATA_KELTHUZAD_BOSS, SAY_SAPP_DIALOG1);
+ return _events.ScheduleEvent(EVENT_KELTHUZAD_LICH_KING_TALK2, 10s);
+ case EVENT_KELTHUZAD_LICH_KING_TALK2:
+ CreatureTalk(DATA_LICH_KING_BOSS, SAY_SAPP_DIALOG2_LICH);
+ return _events.ScheduleEvent(EVENT_KELTHUZAD_LICH_KING_TALK3, 14s);
+ case EVENT_KELTHUZAD_LICH_KING_TALK3:
+ CreatureTalk(DATA_KELTHUZAD_BOSS, SAY_SAPP_DIALOG3);
+ return _events.ScheduleEvent(EVENT_KELTHUZAD_LICH_KING_TALK4, 10s);
+ case EVENT_KELTHUZAD_LICH_KING_TALK4:
+ CreatureTalk(DATA_LICH_KING_BOSS, SAY_SAPP_DIALOG4_LICH);
+ return _events.ScheduleEvent(EVENT_KELTHUZAD_LICH_KING_TALK5, 12s);
+ case EVENT_KELTHUZAD_LICH_KING_TALK5:
+ CreatureTalk(DATA_KELTHUZAD_BOSS, SAY_SAPP_DIALOG5);
+ return _events.ScheduleEvent(EVENT_KELTHUZAD_LICH_KING_TALK6, 5s);
+ case EVENT_KELTHUZAD_LICH_KING_TALK6:
+ CreatureTalk(DATA_KELTHUZAD_BOSS, SAY_SAPP_DIALOG6);
+ return SetGoState(DATA_KELTHUZAD_GATE, GO_STATE_ACTIVE);
+ default:
+ break;
}
- };
+ }
+
+private:
+ // Controls
+ EventMap _events;
+ uint8 _currentWingTaunt;
+ uint8 _horsemanLoaded;
+
+ // GameObjects
+ std::set _heiganEruption[HeiganEruptSectionCount];
+
+ // NPCs
+ GuidList _patchwerkRoomTrash;
+ GuidList _heiganBackRoomTrash;
+
+ // Achievements
+ uint8 _abominationsKilled;
+ bool _faerlinaAchievement;
+ bool _thaddiusAchievement;
+ bool _loathebAchievement;
+ bool _sapphironAchievement;
+ bool _heiganAchievement;
+ bool _horsemanAchievement;
};
-const Position sapphironEntryTP = { 3498.300049f, -5349.490234f, 144.968002f, 1.3698910f };
+class npc_mr_bigglesworth : public NullCreatureAI
+{
+public:
+ npc_mr_bigglesworth(Creature* c) : NullCreatureAI(c) { }
+
+ void JustDied(Unit* /*killer*/) override
+ {
+ InstanceScript* instance = me->GetInstanceScript();
+ if (!instance)
+ return;
+
+ Creature* kelThuzard = instance->GetCreature(DATA_KELTHUZAD_BOSS);
+ if (!kelThuzard)
+ return;
+
+ kelThuzard->AI()->Talk(SAY_CAT_DIED);
+ }
+};
+
+class npc_living_poison : public NullCreatureAI
+{
+public:
+ npc_living_poison(Creature* c) : NullCreatureAI(c) { }
+
+ void UpdateAI(uint32 /*diff*/) override
+ {
+ if (me->SelectNearestTarget(1.5f, true))
+ me->CastSpell(me, SPELL_EXPLODE, true);
+ }
+};
+
+class npc_naxxramas_trigger : public NullCreatureAI
+{
+public:
+ npc_naxxramas_trigger(Creature* c) : NullCreatureAI(c) { }
+
+ void Reset() override
+ {
+ _events.Reset();
+ _events.ScheduleEvent(EVENT_SUMMON_LIVING_POISON, 5s);
+ }
+
+ void UpdateAI(uint32 diff) override
+ {
+ _events.Update(diff);
+ switch (_events.ExecuteEvent())
+ {
+ case EVENT_SUMMON_LIVING_POISON:
+ {
+ for (LivingPoisonData const& entry : LivingPoisonDataList)
+ if (Creature* cr = me->SummonCreature(NPC_LIVING_POISON, entry.Start, TEMPSUMMON_TIMED_DESPAWN, entry.DespawnTime))
+ {
+ cr->AddUnitMovementFlag(MOVEMENTFLAG_WALKING);
+ cr->GetMotionMaster()->MovePoint(0, entry.End, false);
+ }
+
+ _events.Repeat(5s);
+ break;
+ }
+ default:
+ break;
+ }
+ }
+
+private:
+ EventMap _events;
+};
class at_naxxramas_hub_portal : public AreaTriggerScript
{
public:
at_naxxramas_hub_portal() : AreaTriggerScript("at_naxxramas_hub_portal") { }
- bool OnTrigger(Player* player, AreaTrigger const* /*areaTrigger*/) override
+ bool OnTrigger(Player* player, AreaTrigger const* /*trigger*/) override
{
- if (player->GetMap()->GetSpawnMode() == RAID_DIFFICULTY_10MAN_HEROIC)
- {
- InstanceScript* instance = player->GetInstanceScript();
- for (int i = 0; i < BOSS_SAPPHIRON; ++i)
- {
- if (instance->GetBossState(i) != DONE)
- return false;
- }
- }
- if (player->IsAlive() && !player->IsInCombat())
- {
- if (InstanceScript *instance = player->GetInstanceScript())
- {
- if (instance->CheckRequiredBosses(BOSS_SAPPHIRON))
- {
- player->TeleportTo(533, sapphironEntryTP.m_positionX, sapphironEntryTP.m_positionY, sapphironEntryTP.m_positionZ, sapphironEntryTP.m_orientation);
- return true;
- }
- }
- }
- return false;
- }
-};
-
-class NaxxPlayerScript : public PlayerScript
-{
-public:
- NaxxPlayerScript() : PlayerScript("NaxxPlayerScript") { }
-
- void OnPlayerBeforeChooseGraveyard(Player* player, TeamId /*teamId*/, bool /*nearCorpse*/, uint32& graveyardOverride) override
- {
- if (player->GetMapId() == MAP_NAXX && player->GetMap()->GetSpawnMode() == RAID_DIFFICULTY_10MAN_HEROIC)
- {
- graveyardOverride = NAXX40_GRAVEYARD;
- }
- }
-};
-
-class naxx_northrend_entrance : public AreaTriggerScript
-{
-public:
- naxx_northrend_entrance() : AreaTriggerScript("naxx_northrend_entrance") { }
-
- bool OnTrigger(Player* player, AreaTrigger const* areaTrigger) override
- {
- // Do not allow entrance to Naxx 40 from Northrend
- // Change 10 man heroic to regular 10 man, as when 10 man heroic is not available
- Difficulty diff = player->GetGroup() ? player->GetGroup()->GetDifficulty(true) : player->GetDifficulty(true);
- if (diff == RAID_DIFFICULTY_10MAN_HEROIC)
- {
- player->SetRaidDifficulty(RAID_DIFFICULTY_10MAN_NORMAL);
- }
- switch (areaTrigger->entry)
- {
- // Naxx 10 and 25 entrances
- case 5191:
- player->TeleportTo(533, 3005.68f, -3447.77f, 293.93f, 4.65f);
- break;
- case 5192:
- player->TeleportTo(533, 3019.34f, -3434.36f, 293.99f, 6.27f);
- break;
- case 5193:
- player->TeleportTo(533, 3005.9f, -3420.58f, 294.11f, 1.58f);
- break;
- case 5194:
- player->TeleportTo(533, 2992.5f, -3434.42f, 293.94f, 3.13f);
- break;
- }
- return true;
- }
-};
-
-class naxx_exit_trigger : public AreaTriggerScript
-{
-public:
- naxx_exit_trigger() : AreaTriggerScript("naxx_exit_trigger") { }
-
- bool OnTrigger(Player* player, AreaTrigger const* areaTrigger) override
- {
- if (player->GetMap()->GetSpawnMode() == RAID_DIFFICULTY_10MAN_HEROIC)
- {
- // Naxx 40 cannot be exited via portals, as in Classic
+ if (!player->IsAlive() || player->IsInCombat())
return false;
- }
- switch (areaTrigger->entry)
- {
- // Naxx 10 and 25 exits
- case 5196:
- player->TeleportTo(571, 3679.25f, -1278.58f, 243.55f, 2.39f);
- break;
- case 5197:
- player->TeleportTo(571, 3679.03f, -1259.68f, 243.55f, 3.98f);
- break;
- case 5198:
- player->TeleportTo(571, 3661.14f, -1279.55f, 243.55f, 0.82f);
- break;
- case 5199:
- player->TeleportTo(571, 3660.01f, -1260.99f, 243.55f, 5.51f);
- break;
- }
+
+ InstanceScript* instance = player->GetInstanceScript();
+ if (!instance)
+ return false;
+
+ if ((instance->GetBossState(BOSS_MAEXXNA) != DONE) ||
+ (instance->GetBossState(BOSS_LOATHEB) != DONE) ||
+ (instance->GetBossState(BOSS_THADDIUS) != DONE) ||
+ (instance->GetBossState(BOSS_HORSEMAN) != DONE))
+ return false;
+
+ player->TeleportTo(SapphironTeleportPos);
return true;
}
};
-class NaxxEntryFlag_AllMapScript : public AllMapScript
+void AddSC_instance_naxxramas()
{
-public:
- NaxxEntryFlag_AllMapScript() : AllMapScript("NaxxEntryFlag_AllMapScript") { }
-
- void OnPlayerEnterAll(Map* map, Player* player) override
- {
- if (player->IsGameMaster())
- return;
-
- // Check if mapId equals to Naxxramas (mapId: 533)
- if (map->GetId() != 533)
- return;
-
- // Cast on player Naxxramas Entry Flag Trigger DND - Classic (spellID: 29296)
- if (player->GetQuestStatus(NAXX40_ENTRANCE_FLAG) != QUEST_STATUS_REWARDED)
- {
- // Mark player as having entered
- Quest const* quest = sObjectMgr->GetQuestTemplate(NAXX40_ENTRANCE_FLAG);
- player->AddQuest(quest, nullptr);
- player->CompleteQuest(NAXX40_ENTRANCE_FLAG);
- player->RewardQuest(quest, 0, player, false, false);
- // Cast on player Naxxramas Entry Flag Trigger DND - Classic (spellID: 29296)
- player->CastSpell(player, 29296, true); // for visual effect only, possible crash if cast on login
- }
- }
-};
-
-void AddSC_instance_naxxramas_combined()
-{
- new instance_naxxramas_combined();
-// new boss_naxxramas_misc();
+ RegisterInstanceScript(instance_naxxramas, NaxxramasMapId);
+ RegisterNaxxramasCreatureAI(npc_mr_bigglesworth);
+ RegisterNaxxramasCreatureAI(npc_living_poison);
+ RegisterNaxxramasCreatureAI(npc_naxxramas_trigger);
new at_naxxramas_hub_portal();
- new NaxxPlayerScript();
- new naxx_exit_trigger();
- new naxx_northrend_entrance();
- new NaxxEntryFlag_AllMapScript();
}
diff --git a/src/naxx40Scripts/naxxramas.h b/src/naxx40Scripts/naxxramas.h
index 163e74c..e3b11ac 100644
--- a/src/naxx40Scripts/naxxramas.h
+++ b/src/naxx40Scripts/naxxramas.h
@@ -18,71 +18,80 @@
#ifndef DEF_NAXXRAMAS_H
#define DEF_NAXXRAMAS_H
-#include "CreatureAIImpl.h"
-#include "SpellScript.h"
#include "naxxramas_40.h"
#define DataHeader "NAX"
#define NaxxramasScriptName "instance_naxxramas"
-enum Encounters
+enum NaxxramasEncouter
{
- BOSS_PATCHWERK = 0,
- BOSS_GROBBULUS = 1,
- BOSS_GLUTH = 2,
- BOSS_NOTH = 3,
- BOSS_HEIGAN = 4,
- BOSS_LOATHEB = 5,
- BOSS_ANUB = 6,
- BOSS_FAERLINA = 7,
- BOSS_MAEXXNA = 8,
- BOSS_THADDIUS = 9,
- BOSS_RAZUVIOUS = 10,
- BOSS_GOTHIK = 11,
- BOSS_HORSEMAN = 12,
- BOSS_SAPPHIRON = 13,
- BOSS_KELTHUZAD = 14,
- MAX_ENCOUNTERS,
+ BOSS_PATCHWERK = 0,
+ BOSS_GROBBULUS = 1,
+ BOSS_GLUTH = 2,
+ BOSS_NOTH = 3,
+ BOSS_HEIGAN = 4,
+ BOSS_LOATHEB = 5,
+ BOSS_ANUB = 6,
+ BOSS_FAERLINA = 7,
+ BOSS_MAEXXNA = 8,
+ BOSS_THADDIUS = 9,
+ BOSS_RAZUVIOUS = 10,
+ BOSS_GOTHIK = 11,
+ BOSS_HORSEMAN = 12,
+ BOSS_SAPPHIRON = 13,
+ BOSS_KELTHUZAD = 14,
+ MAX_ENCOUNTERS
};
-enum NXData
+enum NaxxramasData
{
- DATA_NOTH_ENTRY_GATE = 100,
- DATA_HEIGAN_ERUPTION = 101,
- DATA_HEIGAN_ENTER_GATE = 102,
- DATA_LOATHEB_GATE = 103,
- DATA_ANUB_GATE = 104,
- DATA_FAERLINA_WEB = 105,
- DATA_MAEXXNA_GATE = 106,
- DATA_THADDIUS_BOSS = 107,
- DATA_STALAGG_BOSS = 108,
- DATA_FEUGEN_BOSS = 109,
- DATA_THADDIUS_GATE = 110,
- DATA_RAZUVIOUS = 111, //
- DATA_GOTHIK_BOSS = 112, //
- DATA_GOTHIK_ENTER_GATE = 113,
- DATA_GOTHIK_INNER_GATE = 114,
- DATA_GOTHIK_EXIT_GATE = 115,
- DATA_HORSEMEN_GATE = 116,
- DATA_LICH_KING_BOSS = 117,
- DATA_KELTHUZAD_FLOOR = 118,
- DATA_ABOMINATION_KILLED = 119,
- DATA_FRENZY_REMOVED = 120,
- DATA_CHARGES_CROSSED = 121,
- DATA_SPORE_KILLED = 122,
- DATA_HUNDRED_CLUB = 123,
- DATA_DANCE_FAIL = 124,
- DATA_IMMORTAL_FAIL = 125,
- DATA_KELTHUZAD_GATE = 126,
- DATA_HAD_THADDIUS_GREET = 127,
- DATA_KELTHUZAD_PORTAL_1 = 128,
- DATA_KELTHUZAD_PORTAL_2 = 129,
- DATA_KELTHUZAD_PORTAL_3 = 130,
- DATA_KELTHUZAD_PORTAL_4 = 131
+ DATA_PATCHWERK_BOSS = 100,
+ DATA_STALAGG_BOSS = 101,
+ DATA_FEUGEN_BOSS = 102,
+ DATA_THADDIUS_BOSS = 103,
+ DATA_RAZUVIOUS_BOSS = 104,
+ DATA_GOTHIK_BOSS = 105,
+ DATA_BARON_RIVENDARE_BOSS = 106,
+ DATA_SIR_ZELIEK_BOSS = 107,
+ DATA_LADY_BLAUMEUX_BOSS = 108,
+ DATA_THANE_KORTHAZZ_BOSS = 109,
+ DATA_SAPPHIRON_BOSS = 110,
+ DATA_KELTHUZAD_BOSS = 111,
+ DATA_LICH_KING_BOSS = 112,
+
+ DATA_LOATHEB_PORTAL = 200,
+ DATA_MAEXXNA_PORTAL = 201,
+ DATA_THADDIUS_PORTAL = 202,
+ DATA_HORSEMAN_PORTAL = 203,
+ DATA_GOTHIK_INNER_GATE = 204,
+ DATA_SAPPHIRON_GATE = 205,
+ DATA_KELTHUZAD_GATE = 206,
+ DATA_KELTHUZAD_FLOOR = 207,
+ DATA_KELTHUZAD_PORTAL_1 = 208,
+ DATA_KELTHUZAD_PORTAL_2 = 209,
+ DATA_KELTHUZAD_PORTAL_3 = 210,
+ DATA_KELTHUZAD_PORTAL_4 = 211,
+
+ DATA_HEIGAN_ERUPTION = 300,
+ DATA_DANCE_FAIL = 301,
+ DATA_SPORE_KILLED = 302,
+ DATA_FRENZY_REMOVED = 303,
+ DATA_THADDIUS_INTRO = 304,
+ DATA_CHARGES_CROSSED = 305,
+ DATA_HUNDRED_CLUB = 306,
+ DATA_ABOMINATION_KILLED = 307,
};
-enum NXGOs
+enum NaxxramasPersistentData
+{
+ PERSISTENT_DATA_THADDIUS_INTRO = 0,
+ PERSISTENT_DATA_KELTHUZAD_DIALOG = 1,
+ PERSISTENT_DATA_IMMORTAL_FAIL = 2,
+ PERSISTENT_DATA_COUNT
+};
+
+enum NaxxramasGameObject
{
GO_PATCHWERK_GATE = 181123,
GO_GLUTH_GATE = 181120,
@@ -90,7 +99,6 @@ enum NXGOs
GO_NOTH_EXIT_GATE = 181201,
GO_HEIGAN_ENTRY_GATE = 181202,
GO_HEIGAN_EXIT_GATE = 181203,
- GO_HEIGAN_EXIT_GATE_OLD = 181496,
GO_LOATHEB_GATE = 181241,
GO_ANUB_GATE = 181126,
GO_ANUB_NEXT_GATE = 181195,
@@ -130,11 +138,28 @@ enum NXGOs
GO_ARAC_EYE_RAMP_BOSS = 181233,
GO_PLAG_EYE_RAMP_BOSS = 181231,
GO_MILI_EYE_RAMP_BOSS = 181230,
- GO_CONS_EYE_RAMP_BOSS = 181232,
+ GO_CONS_EYE_RAMP_BOSS = 181232
};
-enum NXNPCs
+enum NaxxramasGameObjectsDisplayId
{
+ GO_DISPLAY_ID_HEIGAN_ERUPTION1 = 1287,
+ GO_DISPLAY_ID_HEIGAN_ERUPTION2 = 6785
+};
+
+enum NaxxramasCreatureId
+{
+ // Patchwerk
+ NPC_PATCHWERK = 16028,
+ NPC_PATCHWORK_GOLEM = 16017,
+ NPC_BILE_RETCHER = 16018,
+ NPC_MAD_SCIENTIST = 16020,
+ NPC_LIVING_MONSTROSITY = 16021,
+ NPC_SURGICAL_ASSIST = 16022,
+ NPC_SLUDGE_BELCHER = 16029,
+
+ NPC_LIVING_POISON = 16027,
+
// Thaddius
NPC_THADDIUS = 15928,
NPC_STALAGG = 15929,
@@ -143,6 +168,9 @@ enum NXNPCs
// Razuvious
NPC_RAZUVIOUS = 16061,
+ // Gothik
+ NPC_GOTHIK = 16060,
+
// Four horseman
NPC_BARON_RIVENDARE = 30549,
NPC_SIR_ZELIEK = 16063,
@@ -154,30 +182,124 @@ enum NXNPCs
// Kel'Thuzad
NPC_KELTHUZAD = 15990,
- NPC_LICH_KING = 16980,
-
- // Frogger
- NPC_LIVING_POISON = 16027,
- NPC_NAXXRAMAS_TRIGGER = 16082,
- NPC_MR_BIGGLESWORTH = 16998,
-
- // Patchwerk
- NPC_PATCHWERK = 16028,
- NPC_PATCHWORK_GOLEM = 16017,
- NPC_BILE_RETCHER = 16018,
- NPC_MAD_SCIENTIST = 16020,
- NPC_LIVING_MONSTROSITY = 16021,
- NPC_SURGICAL_ASSIST = 16022,
- NPC_SLUDGE_BELCHER = 16029,
-
- // Gothik
- NPC_GOTHIK = 16060
+ NPC_LICH_KING = 16980
};
-enum NXMisc
+enum NaxxramasAchievemmentCriteria
+{
+ ACHIEV_CRITERIA_AND_THEY_WOULD_ALL_GO_DOWN_TOGETHER_10_PLAYER = 7600, // And They Would All Go Down Together (10 player)
+ ACHIEV_CRITERIA_AND_THEY_WOULD_ALL_GO_DOWN_TOGETHER_25_PLAYER = 7601, // And They Would All Go Down Together (25 player)
+
+ ACHIEV_CRITERIA_JUST_CANT_GET_ENOUGH_10_PLAYER = 7614, // Just Can't Get Enough (10 player)
+ ACHIEV_CRITERIA_JUST_CANT_GET_ENOUGH_25_PLAYER = 7615, // Just Can't Get Enough (25 player)
+
+ ACHIEV_CRITERIA_MOMMA_SAID_KNOCK_YOU_OUT_10_PLAYER = 7265, // Momma Said Knock You Out (10 player)
+ ACHIEV_CRITERIA_MOMMA_SAID_KNOCK_YOU_OUT_25_PLAYER = 7549, // Momma Said Knock You Out (25 player)
+
+ ACHIEV_CRITERIA_SHOKING_10_PLAYER = 7604, // Shocking! (10 player)
+ ACHIEV_CRITERIA_SHOKING_25_PLAYER = 7605, // Shocking! (25 player)
+
+ ACHIEV_CRITERIA_SPORE_LOSER_10_PLAYER = 7612, // Spore Loser (10 player)
+ ACHIEV_CRITERIA_SPORE_LOSER_25_PLAYER = 7613, // Spore Loser (25 player)
+
+ ACHIEV_CRITERIA_THE_SAFETY_DANCE_10_PLAYER = 7264, // The Safety Dance (10 player)
+ ACHIEV_CRITERIA_THE_SAFETY_DANCE_25_PLAYER = 7548, // The Safety Dance (25 player)
+
+ ACHIEV_CRITERIA_SUBTRACTION_10_PLAYER = 7608, // Subtraction (10 player)
+ ACHIEV_CRITERIA_SUBTRACTION_25_PLAYER = 7609, // Subtraction (25 player)
+
+ ACHIEV_CRITERIA_THE_HUNDRED_CLUB_10_PLAYER = 7567, // The Hundred Club (10 player)
+ ACHIEV_CRITERIA_THE_HUNDRED_CLUB_25_PLAYER = 7568, // The Hundred Club (25 player)
+
+ ACHIEV_CRITERIA_THE_DEDICATED_FEW_ANUB_10_PLAYER = 7146, // The Dedicated Few (25 player) - Anub'Rekhan
+ ACHIEV_CRITERIA_THE_DEDICATED_FEW_FAERLINA_10_PLAYER = 7147, // The Dedicated Few (25 player) - Grand Widow Faerlina
+ ACHIEV_CRITERIA_THE_DEDICATED_FEW_MAEXXNA_10_PLAYER = 7148, // The Dedicated Few (25 player) - Maexxna
+ ACHIEV_CRITERIA_THE_DEDICATED_FEW_PATCHWERK_10_PLAYER = 7149, // The Dedicated Few (25 player) - Patchwerk
+ ACHIEV_CRITERIA_THE_DEDICATED_FEW_GROBBULUS_10_PLAYER = 7150, // The Dedicated Few (25 player) - Grobbulus
+ ACHIEV_CRITERIA_THE_DEDICATED_FEW_GLUTH_10_PLAYER = 7151, // The Dedicated Few (25 player) - Gluth
+ ACHIEV_CRITERIA_THE_DEDICATED_FEW_THADDIUS_10_PLAYER = 7152, // The Dedicated Few (25 player) - Thaddius
+ ACHIEV_CRITERIA_THE_DEDICATED_FEW_NOTH_10_PLAYER = 7153, // The Dedicated Few (25 player) - Noth the Plaguebringer
+ ACHIEV_CRITERIA_THE_DEDICATED_FEW_HEIGAN_10_PLAYER = 7154, // The Dedicated Few (25 player) - Heigan the Unclean
+ ACHIEV_CRITERIA_THE_DEDICATED_FEW_LOATHEB_10_PLAYER = 7155, // The Dedicated Few (25 player) - Loatheb
+ ACHIEV_CRITERIA_THE_DEDICATED_FEW_RAZUVIOUS_10_PLAYER = 7156, // The Dedicated Few (25 player) - Instructor Razuvious
+ ACHIEV_CRITERIA_THE_DEDICATED_FEW_GOTHIK_10_PLAYER = 7157, // The Dedicated Few (25 player) - Gothik the Harvester
+ ACHIEV_CRITERIA_THE_DEDICATED_FEW_SAPPHIRON_10_PLAYER = 7158, // The Dedicated Few (25 player) - Sapphiron
+ ACHIEV_CRITERIA_THE_DEDICATED_FEW_KELTHUZAD_10_PLAYER = 6802, // The Dedicated Few (25 player) - Kel'Thuzad
+
+ ACHIEV_CRITERIA_THE_DEDICATED_FEW_ANUB_25_PLAYER = 7159, // The Dedicated Few (25 player) - Anub'Rekhan
+ ACHIEV_CRITERIA_THE_DEDICATED_FEW_FAERLINA_25_PLAYER = 7160, // The Dedicated Few (25 player) - Grand Widow Faerlina
+ ACHIEV_CRITERIA_THE_DEDICATED_FEW_MAEXXNA_25_PLAYER = 7161, // The Dedicated Few (25 player) - Maexxna
+ ACHIEV_CRITERIA_THE_DEDICATED_FEW_PATCHWERK_25_PLAYER = 7162, // The Dedicated Few (25 player) - Patchwerk
+ ACHIEV_CRITERIA_THE_DEDICATED_FEW_GROBBULUS_25_PLAYER = 7163, // The Dedicated Few (25 player) - Grobbulus
+ ACHIEV_CRITERIA_THE_DEDICATED_FEW_GLUTH_25_PLAYER = 7164, // The Dedicated Few (25 player) - Gluth
+ ACHIEV_CRITERIA_THE_DEDICATED_FEW_THADDIUS_25_PLAYER = 7165, // The Dedicated Few (25 player) - Thaddius
+ ACHIEV_CRITERIA_THE_DEDICATED_FEW_NOTH_25_PLAYER = 7166, // The Dedicated Few (25 player) - Noth the Plaguebringer
+ ACHIEV_CRITERIA_THE_DEDICATED_FEW_HEIGAN_25_PLAYER = 7167, // The Dedicated Few (25 player) - Heigan the Unclean
+ ACHIEV_CRITERIA_THE_DEDICATED_FEW_LOATHEB_25_PLAYER = 7168, // The Dedicated Few (25 player) - Loatheb
+ ACHIEV_CRITERIA_THE_DEDICATED_FEW_RAZUVIOUS_25_PLAYER = 7169, // The Dedicated Few (25 player) - Instructor Razuvious
+ ACHIEV_CRITERIA_THE_DEDICATED_FEW_GOTHIK_25_PLAYER = 7170, // The Dedicated Few (25 player) - Gothik the Harvester
+ ACHIEV_CRITERIA_THE_DEDICATED_FEW_SAPPHIRON_25_PLAYER = 7171, // The Dedicated Few (25 player) - Sapphiron
+ ACHIEV_CRITERIA_THE_DEDICATED_FEW_KELTHUZAD_25_PLAYER = 7172, // The Dedicated Few (25 player) - Kel'Thuzad
+
+ ACHIEV_CRITERIA_THE_UNDYING_KELTHUZAD = 7617, // The Undying - Kel'Thuzad
+ ACHIEV_CRITERIA_THE_UNDYING_THE_FOUR_HORSEMEN = 13237, // The Undying - The Four Horsemen
+ ACHIEV_CRITERIA_THE_UNDYING_MAEXXNA = 13238, // The Undying - Maexxna
+ ACHIEV_CRITERIA_THE_UNDYING_LOATHEB = 13239, // The Undying - Loatheb
+ ACHIEV_CRITERIA_THE_UNDYING_THADDIUS = 13240, // The Undying - Thaddius
+
+ ACHIEV_CRITERIA_THE_IMMORTAL_KELTHUZAD = 7616, // The Immortal - Kel'Thuzad
+ ACHIEV_CRITERIA_THE_IMMORTAL_THE_FOUR_HORSEMEN = 13233, // The Immortal - The Four Horsemen
+ ACHIEV_CRITERIA_THE_IMMORTAL_MAEXXNA = 13234, // The Immortal - Maexxna
+ ACHIEV_CRITERIA_THE_IMMORTAL_LOATHEB = 13235, // The Immortal - Loatheb
+ ACHIEV_CRITERIA_THE_IMMORTAL_THADDIUS = 13236 // The Immortal - Thaddius
+};
+
+enum NaxxramasSay
+{
+ SAY_HORSEMEN_DIALOG1 = 5,
+ SAY_HORSEMEN_DIALOG2 = 6,
+
+ SAY_SAPP_DIALOG1 = 0,
+ SAY_SAPP_DIALOG2_LICH = 1,
+ SAY_SAPP_DIALOG3 = 2,
+ SAY_SAPP_DIALOG4_LICH = 2,
+ SAY_SAPP_DIALOG5 = 4,
+ SAY_SAPP_DIALOG6 = 20,
+
+ SAY_CAT_DIED = 5, // No!!! A curse upon you, interlopers! The armies of the Lich King will hunt you down. You will not escape your fate...
+ SAY_FIRST_WING_TAUNT = 16
+};
+
+enum NaxxramasEvent
+{
+ EVENT_SUMMON_LIVING_POISON = 1,
+ EVENT_THADDIUS_SCREAMS = 2,
+ EVENT_AND_THEY_WOULD_ALL_GO_DOWN_TOGETHER = 3,
+ EVENT_KELTHUZAD_WING_TAUNT = 4,
+
+ EVENT_HORSEMEN_INTRO1 = 5, // Thane Korth'azz: To arms, ye roustabouts! We've got company!
+ EVENT_HORSEMEN_INTRO2 = 6, // Sir Zeliek: Invaders, cease this foolish venture at once! Turn away while you still can!
+ EVENT_HORSEMEN_INTRO3 = 7, // Lady Blaumeux: Come, Zeliek, do not drive them out. Not before we've had our fun!
+ EVENT_HORSEMEN_INTRO4 = 8, // Baron Rivendare: Enough prattling. Let them come. We shall grind their bones to dust.
+ EVENT_HORSEMEN_INTRO5 = 9, // Lady Blaumeux: I do hope they stay alive long enough for me to... introduce myself.
+ EVENT_HORSEMEN_INTRO6 = 10, // Sir Zeliek: Perhaps they will come to their senses... and run away as fast as they can.
+ EVENT_HORSEMEN_INTRO7 = 11, // Thane Korth'azz: I've heard about enough a' yer snivelin'! Shut yer flytrap before I shut it for ye'!
+ EVENT_HORSEMEN_INTRO8 = 12, // Baron Rivendare: Conserve your anger. Harness your rage. You will all have outlets for your frustrations soon enough.
+
+ EVENT_FROSTWYRM_WATERFALL_DOOR = 13,
+ EVENT_KELTHUZAD_LICH_KING_TALK1 = 14,
+ EVENT_KELTHUZAD_LICH_KING_TALK2 = 15,
+ EVENT_KELTHUZAD_LICH_KING_TALK3 = 16,
+ EVENT_KELTHUZAD_LICH_KING_TALK4 = 17,
+ EVENT_KELTHUZAD_LICH_KING_TALK5 = 18,
+ EVENT_KELTHUZAD_LICH_KING_TALK6 = 19
+};
+
+enum NaxxramasMisc
{
SPELL_ERUPTION = 29371,
- SPELL_FROGGER_EXPLODE = 28433,
+ SPELL_EXPLODE = 28433,
+ SPELL_THE_FOUR_HORSEMAN_CREDIT = 59450,
ACTION_SAPPHIRON_BIRTH = 1,
@@ -185,29 +307,19 @@ enum NXMisc
SOUND_SCREAM = 8873
};
-enum NXSays
-{
- SAY_SAPP_DIALOG1 = 0,
- SAY_SAPP_DIALOG2_LICH = 1,
- SAY_SAPP_DIALOG3 = 2,
- SAY_SAPP_DIALOG4_LICH = 2,
- SAY_SAPP_DIALOG5 = 4,
- SAY_SAPP_DIALOG6 = 20,
- SAY_CAT_DIED = 5,
- SAY_FIRST_WING_TAUNT = 16
-};
+static constexpr uint32 NaxxramasMapId = 533;
+static constexpr uint8 HeiganEruptSectionCount = 4;
+static constexpr uint8 HorsemanCount = 4;
+static constexpr uint8 AbominationKillCountReq = 18;
+static constexpr uint8 TheDedicatedFew10PlayerReq = 9;
+static constexpr uint8 TheDedicatedFew25PlayerReq = 21;
-enum NXEvents
-{
- EVENT_THADDIUS_SCREAMS = 0,
- EVENT_KELTHUZAD_WING_TAUNT = 1,
- EVENT_FROSTWYRM_WATERFALL_DOOR = 2
-};
-
-template
+template
inline AI* GetNaxxramasAI(T* obj)
{
return GetInstanceAI(obj, NaxxramasScriptName);
}
+#define RegisterNaxxramasCreatureAI(ai_name) RegisterCreatureAIWithFactory(ai_name, GetNaxxramasAI)
+
#endif
diff --git a/src/naxx40Scripts/naxxramas_40.h b/src/naxx40Scripts/naxxramas_40.h
index 3898fce..e52fc63 100644
--- a/src/naxx40Scripts/naxxramas_40.h
+++ b/src/naxx40Scripts/naxxramas_40.h
@@ -20,26 +20,37 @@
enum NX40Spells
{
+ // Anub'Rekhan
SPELL_SUMMON_CORPSE_SCRABS_5 = 90001, // Changed from 29105 to Level 60 Mob ID for summon
SPELL_SUMMON_CORPSE_SCRABS_10 = 90002, // Changed from 29105 to Level 60 Mob ID for summon
+ // Grobbulus
SPELL_BOMBARD_SLIME = 90003, // update summon entry
+ // Loatheb
SPELL_SUMMON_SPORE = 90006,
- SPELL_WEB_WRAP_SUMMON_40 = 90007 // custom summon entry: 16486 -> 351075
+ // Maexxna
+ SPELL_WEB_WRAP_SUMMON_40 = 90007, // custom summon entry: 16486 -> 351075
+
+ // Heigan
+ SPELL_DISRUPTION = 55010, // 29310->55010: Mana Burn AoE spell similar to vanilla
+};
+
+enum NX40SpellValues
+{
+ // Anub'Rekhan
+ IMPALE_BP1 = 3937,
+ IMPALE_BP2 = 299
};
enum NX40Data
{
DATA_HEIGAN_EXIT_GATE_OLD_40 = 4130,
- DATA_HEIGAN_EXIT_GATE_40 = 4131,
DATA_HEIGAN_ERUPTION_TUNNEL_40 = 4132,
DATA_RAZUVIOUS_40 = 4133
};
enum NX40GOs
{
- GO_HEIGAN_ENTRY_GATE_40 = 181202,
- GO_HEIGAN_EXIT_GATE_40 = 181203,
- GO_HEIGAN_EXIT_GATE_OLD_40 = 181496,
+ GO_HEIGAN_EXIT_GATE_40 = 181496,
GO_HORSEMEN_CHEST_40 = 361000,
// Gate to enter Naxx 40 from Strath
GO_STRATH_GATE_40 = 176424
@@ -47,16 +58,50 @@ enum NX40GOs
enum NX40NPCs
{
+ // Anub'Rekhan
+ NPC_CORPSE_SCARAB = 351083,
+ NPC_CRYPT_GUARD = 351082,
+
+ // Faerlina
+ NPC_NAXXRAMAS_WORSHIPPER = 351081,
+ NPC_NAXXRAMAS_FOLLOWER = 351080,
+
+ // Gluth
+ NPC_ZOMBIE_CHOW = 351069,
+
// Thaddius
NPC_THADDIUS_40 = 351000,
NPC_STALAGG_40 = 351001,
NPC_FEUGEN_40 = 351002,
+ // Grobbulus
+ NPC_FALLOUT_SLIME = 351067,
+ NPC_SEWAGE_SLIME = 351071,
+ NPC_STICHED_GIANT = 351027,
+
+ // Noth
+ NPC_PLAGUED_WARRIOR = 351087,
+ NPC_PLAGUED_CHAMPION = 351086,
+ NPC_PLAGUED_GUARDIAN = 351085,
+
// Razuvious
NPC_RAZUVIOUS_40 = 351036,
+ NPC_DEATH_KNIGHT_UNDERSTUDY = 351084,
// Gothik
NPC_GOTHIK_40 = 351035,
+ NPC_LIVING_TRAINEE = 351043,
+ NPC_LIVING_KNIGHT = 351044,
+ NPC_LIVING_RIDER = 351045,
+ NPC_DEAD_TRAINEE = 351046,
+ NPC_DEAD_KNIGHT = 351050,
+ NPC_DEAD_HORSE = 351051,
+ NPC_DEAD_RIDER = 351052,
+ NPC_TRIGGER = 351047,
+
+ // Maexxna
+ NPC_WEB_WRAP = 351079,
+ NPC_MAEXXNA_SPIDERLING = 351088,
// Four horseman
NPC_HIGHLORD_MOGRAINE_40 = 351037,
@@ -70,6 +115,10 @@ enum NX40NPCs
// Kel'Thuzad
NPC_KELTHUZAD_40 = 351019,
// NPC_LICH_KING_40 = 16980,
+ NPC_SOLDIER_OF_THE_FROZEN_WASTES = 351073,
+ NPC_UNSTOPPABLE_ABOMINATION = 351074,
+ NPC_SOUL_WEAVER = 351075,
+ NPC_GUARDIAN_OF_ICECROWN = 351076,
// Frogger
// NPC_LIVING_POISON_40 = 16027,
diff --git a/src/naxx40Scripts/omarion.cpp b/src/naxx40Scripts/omarion.cpp
index 34cf0cd..84d19fa 100644
--- a/src/naxx40Scripts/omarion.cpp
+++ b/src/naxx40Scripts/omarion.cpp
@@ -127,12 +127,12 @@ public:
AddGossipItemFor(player, MENU_ID_INTRO, ITEM_ID_TAILORING, GOSSIP_SENDER_MAIN, MENU_ID_TAILORING);
}
- if(blacksmithSkill >= MASTER_REQ_SKILL)
+ if (blacksmithSkill >= MASTER_REQ_SKILL)
{
AddGossipItemFor(player, MENU_ID_INTRO, ITEM_ID_BLACKSMITHING, GOSSIP_SENDER_MAIN, MENU_ID_BLACKSMITHING);
}
- if(leatherworkSkill >= MASTER_REQ_SKILL)
+ if (leatherworkSkill >= MASTER_REQ_SKILL)
{
AddGossipItemFor(player, MENU_ID_INTRO, ITEM_ID_LEATHERWORKING, GOSSIP_SENDER_MAIN, MENU_ID_LEATHERWORKING);
}