mirror of
https://github.com/ZhengPeiRu21/mod-individual-progression
synced 2025-11-29 23:44:51 +08:00
Merge pull request #544 from sogladev/update-scripts
Naxx40: Update cpp scripts
This commit is contained in:
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -15,7 +15,7 @@
|
||||
* with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#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;
|
||||
};
|
||||
};
|
||||
|
||||
|
||||
@@ -15,7 +15,7 @@
|
||||
* with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#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;
|
||||
};
|
||||
};
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
@@ -15,45 +15,48 @@
|
||||
* with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#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<Creature*> 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<Creature*> 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();
|
||||
}
|
||||
|
||||
@@ -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<WorldObject*>& 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);
|
||||
}
|
||||
}
|
||||
@@ -15,23 +15,26 @@
|
||||
* with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#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<boss_grobbulus_40_poison_cloudAI>(pCreature);
|
||||
return GetNaxxramasAI<boss_grobbulus_poison_cloud_40AI>(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:
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -15,6 +15,7 @@
|
||||
* with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#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<WorldObject*>& targets)
|
||||
{
|
||||
Unit* caster = GetCaster();
|
||||
@@ -726,3 +687,4 @@ void AddSC_boss_kelthuzad_40()
|
||||
// RegisterSpellScript(spell_kelthuzad_frost_blast);
|
||||
// RegisterSpellScript(spell_kelthuzad_detonate_mana_aura);
|
||||
}
|
||||
|
||||
|
||||
@@ -15,29 +15,35 @@
|
||||
* with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#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();
|
||||
|
||||
}
|
||||
|
||||
@@ -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<Unit*> candidates;
|
||||
SelectTargetList(candidates, 2, SelectTargetMethod::Random, 0, WebTargetSelector(me));
|
||||
SelectTargetList(candidates, RAID_MODE(1, 2, 2, 2), SelectTargetMethod::Random, 0, WebTargetSelector(me));
|
||||
|
||||
std::vector<uint32> 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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -15,10 +15,8 @@
|
||||
* with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#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;
|
||||
|
||||
@@ -15,7 +15,7 @@
|
||||
* with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#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<Unit*> 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();
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -15,6 +15,8 @@
|
||||
* with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#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<WorldObject*>& 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;
|
||||
}
|
||||
};
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
122
src/naxx40Scripts/custom_scripts_40.cpp
Normal file
122
src/naxx40Scripts/custom_scripts_40.cpp
Normal file
@@ -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();
|
||||
}
|
||||
@@ -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);
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -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 <class AI, class T>
|
||||
template<typename AI, typename T>
|
||||
inline AI* GetNaxxramasAI(T* obj)
|
||||
{
|
||||
return GetInstanceAI<AI>(obj, NaxxramasScriptName);
|
||||
}
|
||||
|
||||
#define RegisterNaxxramasCreatureAI(ai_name) RegisterCreatureAIWithFactory(ai_name, GetNaxxramasAI)
|
||||
|
||||
#endif
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user