mirror of
https://github.com/TrinityCore/TrinityCore.git
synced 2026-01-17 16:10:49 +01:00
Scripts/BWD: finish Atramedes encounter implementation
This commit is contained in:
@@ -22,6 +22,9 @@ UPDATE `creature_template` SET `unit_flags`= 33554432, `flags_extra`= 130, `spee
|
||||
UPDATE `creature_template` SET `ScriptName`= 'npc_atramedes_ancient_dwarven_shield' WHERE `entry` IN (41445, 42947, 42949, 42951, 42954, 42956, 42958, 42960);
|
||||
-- Lord Victor Nefarius
|
||||
UPDATE `creature_template` SET `unit_flags`= 33554496, `ScriptName`= 'npc_atramedes_lord_victor_nefarius' WHERE `entry`= 49580;
|
||||
-- Obnoxious Imp
|
||||
UPDATE `creature_template` SET `ScriptName`= 'npc_atramedes_obnoxious_fiend', `difficulty_entry_3`= 49798 WHERE `entry`= 49740;
|
||||
UPDATE `creature_template` SET `minlevel`= 85, `maxlevel`= 85, `faction`= 16, `exp`= 3, `speed_run`= 1.429, `mechanic_immune_mask`= 650854271 WHERE `entry` IN (49740, 49798);
|
||||
|
||||
-- Texts
|
||||
DELETE FROM `creature_text` WHERE `CreatureID` IN (41442, 49580);
|
||||
@@ -30,8 +33,10 @@ INSERT INTO `creature_text` (`CreatureID`, `GroupID`, `ID`, `Text`, `Type`, `Lan
|
||||
(41442, 0, 0, 'I have no need for eyes to see my enemies. Your clumsy footsteps and foul stench give you away!', 14, 0, 100, 0, 0, 20820, 48030, 'Atramedes - Aggro'),
|
||||
(41442, 1, 0, '|TInterface\\Icons\\spell_fire_selfdestruct.blp:20|t%s rears back and casts |cFFFF0000|Hspell:77982|h[Searing Flame]|h|r!\n', 41, 0, 100, 0, 0, 0, 42180, 'Atramedes - Announce Searing Flame'),
|
||||
(41442, 2, 0, 'You cannot hide from searing flame!', 14, 0, 100, 0, 0, 20826, 48036, 'Atramedes - Searing Flame'),
|
||||
(41442, 3, 0, 'Yes, run! With every step your heart quickens. The beating, loud and thunderous... Almost deafening. You cannot escape!', 14, 0, 100, 0, 0, 20827, 48038, 'Atramedes'),
|
||||
(41442, 4, 0, 'This miserable existence finally ends.', 14, 0, 100, 0, 0, 20823, 48034, 'Atramedes to Player'),
|
||||
(41442, 3, 0, 'Yes, run! With every step your heart quickens. The beating, loud and thunderous... Almost deafening. You cannot escape!', 14, 0, 100, 0, 0, 20827, 48038, 'Atramedes - Roaring Flame Breath'),
|
||||
(41442, 4, 0, 'Death waits in the darkness!', 14, 0, 100, 0, 0, 20822, 48033, 'Atramedes - Slay 1'),
|
||||
(41442, 4, 1, 'Sighted, but blind to the truth. Embrace the finality of it all!', 14, 0, 100, 0, 0, 20821, 48031, 'Atramedes - Slay 2'),
|
||||
(41442, 5, 0, 'This miserable existence finally ends.', 14, 0, 100, 0, 0, 20823, 48034, 'Atramedes - Death'),
|
||||
-- Lord Victor Nefarius
|
||||
(49580, 0, 0, 'Atramedes, are you going deaf as well as blind? Hurry up and kill them all.', 14, 0, 100, 0, 0, 23360, 49074, 'Lord Victor Nefarius'),
|
||||
(49580, 1, 0, 'Atramedes, the heroes are right THERE!', 14, 0, 100, 0, 0, 23359, 49075, 'Lord Victor Nefarius'),
|
||||
@@ -52,7 +57,8 @@ DELETE FROM `spell_script_names` WHERE `ScriptName` IN
|
||||
'spell_atramedes_sonic_flames',
|
||||
'spell_atramedes_devastation_trigger',
|
||||
'spell_atramedes_sonic_breath',
|
||||
'spell_atramedes_destroy_shield');
|
||||
'spell_atramedes_destroy_shield',
|
||||
'spell_atramedes_pestered');
|
||||
|
||||
INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES
|
||||
(92452, 'spell_atramedes_modulation'),
|
||||
@@ -72,7 +78,8 @@ INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES
|
||||
(78864, 'spell_atramedes_sonic_flames'),
|
||||
(78898, 'spell_atramedes_devastation_trigger'),
|
||||
(78075, 'spell_atramedes_sonic_breath'),
|
||||
(92607, 'spell_atramedes_destroy_shield');
|
||||
(92607, 'spell_atramedes_destroy_shield'),
|
||||
(92685, 'spell_atramedes_pestered');
|
||||
|
||||
-- Addons
|
||||
DELETE FROM `creature_template_addon` WHERE `entry` IN (41807, 42001, 41962, 49580);
|
||||
@@ -80,7 +87,7 @@ INSERT INTO `creature_template_addon` (`entry`, `bytes1`, `bytes2`, `auras`) VAL
|
||||
(41807, 0, 1, '78024 78018'),
|
||||
(42001, 0, 1, '78024 78018'),
|
||||
(41962, 0, 1, '78354 78217'),
|
||||
(49580, 0, 1, '78494 92647');
|
||||
(49580, 0, 1, '78494');
|
||||
|
||||
-- Conditions
|
||||
DELETE FROM `conditions` WHERE `SourceEntry` IN (77673, 78098, 92403, 92404, 92405, 78230, 78431, 77611, 78168, 78945, 92607) AND `SourceTypeOrReferenceId`= 13;
|
||||
@@ -134,14 +141,14 @@ INSERT INTO `npc_spellclick_spells` (`npc_entry`, `spell_id`, `cast_flags`, `use
|
||||
(42956, 77709, 0, 1),
|
||||
(42958, 77709, 0, 1),
|
||||
(42960, 77709, 0, 1);
|
||||
|
||||
-- Movement
|
||||
DELETE FROM `creature_template_movement` WHERE `CreatureId` IN (41546, 41962, 42956, 49580);
|
||||
DELETE FROM `creature_template_movement` WHERE `CreatureId` IN (41546, 41962, 42956, 49580, 49623);
|
||||
INSERT INTO `creature_template_movement` (`CreatureId`, `Ground`, `Swim`, `Flight`, `Rooted`) VALUES
|
||||
(41546, 0, 1, 1, 0),
|
||||
(41962, 0, 0, 2, 0),
|
||||
(42956, 0, 0, 2, 1),
|
||||
(49580, 0, 0, 1, 0);
|
||||
(49580, 2, 0, 1, 0),
|
||||
(49623, 2, 0, 0, 0);
|
||||
|
||||
-- Correct Athenaeum Door Rotation
|
||||
UPDATE `gameobject` SET `rotation2`= -1, `rotation3`= 0 WHERE `guid`= 235177;
|
||||
@@ -178,3 +185,29 @@ INSERT INTO `spawn_group` (`groupId`, `spawnType`, `spawnId`) VALUES
|
||||
(400, 0, 250129),
|
||||
(400, 0, 250130),
|
||||
(400, 0, 250131);
|
||||
|
||||
DELETE FROM `spell_dbc` WHERE `Id`= 92647;
|
||||
INSERT INTO `spell_dbc` (`Id`, `CastingTimeIndex`, `DurationIndex`, `Attributes`, `AttributesEx`, `AttributesEx3`, `AttributesEx6`, `AttributesEx7`, `Comment`) VALUES
|
||||
(92647, 0, 21, 0x20000100, 0x10000400, 0x10070300, 0x00000400, 0x02000000, '(Serverside/Non-DB2) Apply Vehicle Periodic');
|
||||
|
||||
DELETE FROM `spelleffect_dbc` WHERE `Id`= 160097;
|
||||
INSERT INTO `spelleffect_dbc` (`Id`, `Effect`, `EffectApplyAuraName`, `EffectAmplitude`, `EffectMiscValue`, `EffectMiscValueB`, `EffectRadiusIndex`, `EffectRadiusIndexMax`, `EffectImplicitTargetA`, `EffectImplicitTargetB`, `EffectSpellId`, `EffectIndex`, `Comment`) VALUES
|
||||
(160097, 27, 296, 0, 443, 445, 0, 12, 22, 7, 92647, 0, '(Serverside/Non-DB2) Apply Vehicle Periodic - EFFECT_0');
|
||||
|
||||
-- Procs
|
||||
DELETE FROM `spell_proc` WHERE `SpellId`= 92681;
|
||||
INSERT INTO `spell_proc` (`SpellId`, `ProcFlags`, `SpellTypeMask`, `SpellPhaseMask`, `HitMask`, `Charges`) VALUES
|
||||
(92681, 0x00000004, 0, 0, 0x00002FFF, 1);
|
||||
|
||||
-- Achievement
|
||||
DELETE FROM `achievement_criteria_data` WHERE `criteria_id`= 15655;
|
||||
INSERT INTO `achievement_criteria_data` (`criteria_id`, `type`, `value1`, `value2`, `ScriptName`) VALUES
|
||||
(15655, 11, 0, 0, 'achievement_silence_is_golden');
|
||||
|
||||
-- Currency Loot
|
||||
DELETE FROM `creature_onkill_reward` WHERE `creature_id` IN (41442, 49583, 49584, 49585);
|
||||
INSERT INTO `creature_onkill_reward` (`creature_id`, `CurrencyId1`, `CurrencyCount1`) VALUES
|
||||
(41442, 396, 3500),
|
||||
(49583, 396, 4500),
|
||||
(49584, 396, 3500),
|
||||
(49585, 396, 4500);
|
||||
@@ -5375,6 +5375,12 @@ void SpellMgr::LoadSpellInfoCorrections()
|
||||
spellInfo->Effects[EFFECT_0].TargetA = SpellImplicitTargetInfo(TARGET_UNIT_TARGET_ANY);
|
||||
});
|
||||
|
||||
// Pestered!
|
||||
ApplySpellFix({ 92685 }, [](SpellInfo* spellInfo)
|
||||
{
|
||||
spellInfo->AttributesCu |= SPELL_ATTR0_CU_NEGATIVE_EFF1;
|
||||
});
|
||||
|
||||
// END OF BLACKWING DESCENT SPELLS
|
||||
|
||||
// Living Bomb
|
||||
|
||||
@@ -97,11 +97,11 @@ enum BWDCreatureIds
|
||||
|
||||
/*Atramedes*/
|
||||
NPC_SONAR_PULSE = 41546,
|
||||
NPC_SONAR_PULSE_TARGET = 49679,
|
||||
NPC_SONAR_PULSE_BOMB = 49623,
|
||||
NPC_TRACKING_FLAMES = 41879,
|
||||
NPC_REVERBERATING_FLAME = 41962,
|
||||
NPC_LORD_VICTOR_NEFARIUS_ATRAMEDES = 49580,
|
||||
NPC_OBNOXIOUS_FIEND = 49740,
|
||||
|
||||
/*Events*/
|
||||
NPC_SPIRIT_OF_MOLTENFIST = 43125,
|
||||
|
||||
@@ -41,7 +41,7 @@ enum Spells
|
||||
SPELL_SONIC_BREATH_CAST = 78098,
|
||||
SPELL_TAKE_OFF_ANIM_KIT = 86915,
|
||||
SPELL_SONAR_PULSE_TRIGGER = 92519,
|
||||
SPELL_SONAR_BOMB = 92765,
|
||||
SPELL_SONAR_BOMB = 92557,
|
||||
SPELL_ROARING_FLAME_BREATH = 78207,
|
||||
|
||||
// Sonar Pulse
|
||||
@@ -59,6 +59,12 @@ enum Spells
|
||||
// Lord Victor Nefarius
|
||||
SPELL_SUMMON_IMP = 92625,
|
||||
SPELL_DESTROY_SHIELD = 92607,
|
||||
SPELL_APPLY_VEHICLE_PERIODIC = 92647,
|
||||
|
||||
// Obnoxious Imp
|
||||
SPELL_PHASE_SHIFT = 92681,
|
||||
SPELL_PESTERED = 92685,
|
||||
SPELL_OBNOXIOUS = 92677,
|
||||
|
||||
// Player
|
||||
SPELL_RESONATING_CLASH_GROUND = 77611,
|
||||
@@ -74,10 +80,12 @@ enum Texts
|
||||
SAY_ANNOUNCE_SEARING_FLAME = 1,
|
||||
SAY_SEARING_FLAME = 2,
|
||||
SAY_FLIGHT_PHASE = 3,
|
||||
SAY_SLAY = 4,
|
||||
SAY_DEATH = 5,
|
||||
|
||||
// Lord Victor Nefarius
|
||||
SAY_INTRO = 0,
|
||||
SAY_SUMMON_IMP = 1,
|
||||
SAY_SUMMON_FIEND = 1,
|
||||
SAY_DESTROY_SHIELD = 2
|
||||
};
|
||||
|
||||
@@ -105,7 +113,12 @@ enum Events
|
||||
|
||||
// Lord Victor Nefarius
|
||||
EVENT_SAY_INTRO,
|
||||
EVENT_SUMMON_IMP
|
||||
EVENT_SUMMON_FIEND,
|
||||
|
||||
// Obnoxious Imp
|
||||
EVENT_FOCUS_PLAYER,
|
||||
EVENT_CHASE_PLAYER,
|
||||
EVENT_OBNOXIOUS
|
||||
};
|
||||
|
||||
enum Actions
|
||||
@@ -113,7 +126,16 @@ enum Actions
|
||||
// Atramedes
|
||||
ACTION_START_INTRO = 0,
|
||||
ACTION_HALT_REVERBERATING_FLAME = 1,
|
||||
ACTION_DESTROY_SHIELD = 2
|
||||
ACTION_FAIL_ACHIEVEMENT = 2,
|
||||
|
||||
// Lord Victor Nefarius
|
||||
ACTION_DESTROY_SHIELD = 0,
|
||||
ACTION_STOP_SUMMONING_FIENDS = 1,
|
||||
ACTION_START_SUMMONING_FIENDS = 2,
|
||||
|
||||
// Obnoxious Imp
|
||||
ACTION_PLAYER_ENTERED = 0,
|
||||
ACTION_PLAYER_LEFT = 1
|
||||
};
|
||||
|
||||
enum MovePoints
|
||||
@@ -140,6 +162,7 @@ enum Data
|
||||
DATA_ADD_NOISY_PLAYER = 1,
|
||||
DATA_REMOVE_NOISY_PLAYER = 2,
|
||||
DATA_LAST_SHIELD_USER = 3,
|
||||
DATA_ACHIEVEMT_ENLIGIBLE = 4,
|
||||
|
||||
// Getter
|
||||
DATA_IS_IN_AIR = 0,
|
||||
@@ -147,6 +170,11 @@ enum Data
|
||||
DATA_IS_IN_INTRO_PHASE = 2
|
||||
};
|
||||
|
||||
enum Misc
|
||||
{
|
||||
AI_ANIM_KIT_ID_OBNOXIOUS_IMP = 1162
|
||||
};
|
||||
|
||||
Position const IntroFlightPosition1 = { 249.432f, -223.616f, 98.6447f };
|
||||
Position const IntroFlightPosition2 = { 214.531f, -223.918f, 93.4661f };
|
||||
Position const IntroLandingPosition = { 214.531f, -223.918f, 74.7668f };
|
||||
@@ -156,7 +184,7 @@ Position const LordVictorNefariusSummonPosition = { 92.91319f, -223.9931f, 96.89
|
||||
|
||||
struct boss_atramedes : public BossAI
|
||||
{
|
||||
boss_atramedes(Creature* creature) : BossAI(creature, DATA_ATRAMEDES) { }
|
||||
boss_atramedes(Creature* creature) : BossAI(creature, DATA_ATRAMEDES), _achievementEnligible(true) { }
|
||||
|
||||
void Reset() override
|
||||
{
|
||||
@@ -189,7 +217,8 @@ struct boss_atramedes : public BossAI
|
||||
summons.DespawnAll();
|
||||
instance->SendEncounterUnit(ENCOUNTER_FRAME_DISENGAGE, me);
|
||||
instance->SetBossState(DATA_ATRAMEDES, FAIL);
|
||||
CleanupEncounter();
|
||||
if (GameObject* door = instance->GetGameObject(DATA_ATHENAEUM_DOOR))
|
||||
door->SetGoState(GO_STATE_ACTIVE);
|
||||
me->DespawnOrUnsummon();
|
||||
}
|
||||
|
||||
@@ -197,6 +226,15 @@ struct boss_atramedes : public BossAI
|
||||
{
|
||||
_JustDied();
|
||||
instance->SendEncounterUnit(ENCOUNTER_FRAME_DISENGAGE, me);
|
||||
if (GameObject* door = instance->GetGameObject(DATA_ATHENAEUM_DOOR))
|
||||
door->SetGoState(GO_STATE_ACTIVE);
|
||||
Talk(SAY_DEATH);
|
||||
}
|
||||
|
||||
void KilledUnit(Unit* victim) override
|
||||
{
|
||||
if (victim->GetTypeId() == TYPEID_PLAYER)
|
||||
Talk(SAY_SLAY, victim);
|
||||
}
|
||||
|
||||
void JustSummoned(Creature* summon) override
|
||||
@@ -263,6 +301,8 @@ struct boss_atramedes : public BossAI
|
||||
return (uint8(!_noisyPlayerGUIDs.empty()));
|
||||
case DATA_IS_IN_INTRO_PHASE:
|
||||
return (uint8(events.IsInPhase(PHASE_INTRO)));
|
||||
case DATA_ACHIEVEMT_ENLIGIBLE:
|
||||
return (uint8(_achievementEnligible));
|
||||
}
|
||||
|
||||
return 0;
|
||||
@@ -339,6 +379,10 @@ struct boss_atramedes : public BossAI
|
||||
events.ScheduleEvent(EVENT_SEARING_FLAME, 51s, 0, PHASE_GROUND);
|
||||
events.ScheduleEvent(EVENT_SONIC_BREATH, 22s, 0, PHASE_GROUND);
|
||||
events.ScheduleEvent(EVENT_LIFTOFF, 1min + 33s, 0, PHASE_GROUND);
|
||||
|
||||
if (Creature* nefarius = instance->GetCreature(DATA_LORD_VICTOR_NEFARIUS_ATRAMEDES))
|
||||
if (nefarius->IsAIEnabled)
|
||||
nefarius->AI()->DoAction(ACTION_START_SUMMONING_FIENDS);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
@@ -364,6 +408,9 @@ struct boss_atramedes : public BossAI
|
||||
events.ScheduleEvent(EVENT_MOVE_REVERBERATING_FLAME_TO_SHIELD, 2s, 0, PHASE_AIR);
|
||||
}
|
||||
break;
|
||||
case ACTION_FAIL_ACHIEVEMENT:
|
||||
_achievementEnligible = false;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
@@ -420,6 +467,10 @@ struct boss_atramedes : public BossAI
|
||||
me->SetReactState(REACT_PASSIVE);
|
||||
DoCastSelf(SPELL_TAKE_OFF_ANIM_KIT);
|
||||
me->GetMotionMaster()->MoveTakeoff(POINT_LIFTOFF, LiftoffPosition);
|
||||
|
||||
if (Creature* nefarius = instance->GetCreature(DATA_LORD_VICTOR_NEFARIUS_ATRAMEDES))
|
||||
if (nefarius->IsAIEnabled)
|
||||
nefarius->AI()->DoAction(ACTION_STOP_SUMMONING_FIENDS);
|
||||
break;
|
||||
case EVENT_MOVE_REVERBERATING_FLAME_TO_SHIELD:
|
||||
if (Creature* flame = ObjectAccessor::GetCreature(*me, _reverberatingFlameGUID))
|
||||
@@ -459,17 +510,11 @@ struct boss_atramedes : public BossAI
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
|
||||
private:
|
||||
void CleanupEncounter()
|
||||
{
|
||||
if (GameObject* door = instance->GetGameObject(DATA_ATHENAEUM_DOOR))
|
||||
door->SetGoState(GO_STATE_ACTIVE);
|
||||
}
|
||||
|
||||
GuidSet _noisyPlayerGUIDs;
|
||||
ObjectGuid _lastShieldUserGUID;
|
||||
ObjectGuid _lastUsedAncientDwarvenShieldGUID;
|
||||
ObjectGuid _reverberatingFlameGUID;
|
||||
bool _achievementEnligible;
|
||||
};
|
||||
|
||||
struct npc_atramedes_ancient_dwarven_shield : public NullCreatureAI
|
||||
@@ -507,13 +552,17 @@ struct npc_atramedes_lord_victor_nefarius : public NullCreatureAI
|
||||
void IsSummonedBy(Unit* /*summoner*/) override
|
||||
{
|
||||
_events.ScheduleEvent(EVENT_SAY_INTRO, 10s);
|
||||
me->SetByteFlag(UNIT_FIELD_BYTES_1, 3, UNIT_BYTE1_FLAG_HOVER);
|
||||
_events.ScheduleEvent(EVENT_SUMMON_FIEND, 30s);
|
||||
DoCastSelf(SPELL_APPLY_VEHICLE_PERIODIC);
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff) override
|
||||
{
|
||||
_events.Update(diff);
|
||||
|
||||
if (me->HasUnitState(UNIT_STATE_CASTING))
|
||||
return;
|
||||
|
||||
while (uint32 eventId = _events.ExecuteEvent())
|
||||
{
|
||||
switch (eventId)
|
||||
@@ -521,6 +570,11 @@ struct npc_atramedes_lord_victor_nefarius : public NullCreatureAI
|
||||
case EVENT_SAY_INTRO:
|
||||
Talk(SAY_INTRO);
|
||||
break;
|
||||
case EVENT_SUMMON_FIEND:
|
||||
Talk(SAY_SUMMON_FIEND);
|
||||
DoCastSelf(SPELL_SUMMON_IMP);
|
||||
_events.Repeat(35s);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
@@ -535,6 +589,12 @@ struct npc_atramedes_lord_victor_nefarius : public NullCreatureAI
|
||||
Talk(SAY_DESTROY_SHIELD);
|
||||
DoCastAOE(SPELL_DESTROY_SHIELD);
|
||||
break;
|
||||
case ACTION_STOP_SUMMONING_FIENDS:
|
||||
_events.Reset();
|
||||
break;
|
||||
case ACTION_START_SUMMONING_FIENDS:
|
||||
_events.ScheduleEvent(EVENT_SUMMON_FIEND, 30s);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
@@ -545,6 +605,90 @@ private:
|
||||
InstanceScript* _instance;
|
||||
};
|
||||
|
||||
struct npc_atramedes_obnoxious_fiend : public ScriptedAI
|
||||
{
|
||||
npc_atramedes_obnoxious_fiend(Creature* creature) : ScriptedAI(creature), _instance(me->GetInstanceScript())
|
||||
{
|
||||
Initialize();
|
||||
}
|
||||
|
||||
void Initialize()
|
||||
{
|
||||
me->SetReactState(REACT_PASSIVE);
|
||||
}
|
||||
|
||||
void JustDied(Unit* /*killer*/) override
|
||||
{
|
||||
me->DespawnOrUnsummon(2s);
|
||||
}
|
||||
|
||||
void JustAppeared() override
|
||||
{
|
||||
DoZoneInCombat();
|
||||
DoCastSelf(SPELL_PHASE_SHIFT, true);
|
||||
_events.ScheduleEvent(EVENT_FOCUS_PLAYER, 1s);
|
||||
}
|
||||
|
||||
void DoAction(int32 action) override
|
||||
{
|
||||
switch (action)
|
||||
{
|
||||
case ACTION_PLAYER_ENTERED:
|
||||
me->AttackStop();
|
||||
me->SetReactState(REACT_PASSIVE);
|
||||
_events.ScheduleEvent(EVENT_OBNOXIOUS, 1s);
|
||||
me->SetAIAnimKitId(AI_ANIM_KIT_ID_OBNOXIOUS_IMP);
|
||||
break;
|
||||
case ACTION_PLAYER_LEFT:
|
||||
DoCastSelf(SPELL_PHASE_SHIFT, true);
|
||||
_events.Reset();
|
||||
_events.ScheduleEvent(EVENT_FOCUS_PLAYER, 1s);
|
||||
me->SetAIAnimKitId(0);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff) override
|
||||
{
|
||||
UpdateVictim();
|
||||
|
||||
_events.Update(diff);
|
||||
|
||||
while (uint32 eventId = _events.ExecuteEvent())
|
||||
{
|
||||
switch (eventId)
|
||||
{
|
||||
case EVENT_SAY_INTRO:
|
||||
Talk(SAY_INTRO);
|
||||
break;
|
||||
case EVENT_FOCUS_PLAYER:
|
||||
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100.0f, true, -SPELL_PESTERED))
|
||||
me->AddThreat(target, 50000000.0f);
|
||||
_events.ScheduleEvent(EVENT_CHASE_PLAYER, 1s);
|
||||
break;
|
||||
case EVENT_CHASE_PLAYER:
|
||||
me->SetReactState(REACT_AGGRESSIVE);
|
||||
break;
|
||||
case EVENT_OBNOXIOUS:
|
||||
if (Unit* vehicle = me->GetVehicleBase())
|
||||
DoCast(vehicle, SPELL_OBNOXIOUS);
|
||||
_events.Repeat(2s + 500ms);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
|
||||
private:
|
||||
EventMap _events;
|
||||
InstanceScript* _instance;
|
||||
};
|
||||
|
||||
class spell_atramedes_modulation : public SpellScript
|
||||
{
|
||||
PrepareSpellScript(spell_atramedes_modulation);
|
||||
@@ -697,15 +841,21 @@ class spell_atramedes_sound_bar : public AuraScript
|
||||
void HandleNoisyAura(AuraEffect const* aurEff)
|
||||
{
|
||||
Unit* target = GetTarget();
|
||||
InstanceScript* instance = target->GetInstanceScript();
|
||||
if (!instance)
|
||||
return;
|
||||
|
||||
if (target->GetPower(POWER_ALTERNATE_POWER) == target->GetMaxPower(POWER_ALTERNATE_POWER))
|
||||
{
|
||||
if (!target->HasAura(SPELL_NOISY))
|
||||
if (InstanceScript* instance = target->GetInstanceScript())
|
||||
if (Creature* atramedes = instance->GetCreature(DATA_ATRAMEDES))
|
||||
atramedes->AI()->SetGUID(target->GetGUID(), DATA_ADD_NOISY_PLAYER);
|
||||
if (Creature* atramedes = instance->GetCreature(DATA_ATRAMEDES))
|
||||
atramedes->AI()->SetGUID(target->GetGUID(), DATA_ADD_NOISY_PLAYER);
|
||||
|
||||
target->CastSpell(target, SPELL_NOISY, true, nullptr, aurEff);
|
||||
}
|
||||
else if (target->GetPower(POWER_ALTERNATE_POWER) >= 50)
|
||||
if (Creature* atramedes = instance->GetCreature(DATA_ATRAMEDES))
|
||||
atramedes->AI()->DoAction(ACTION_FAIL_ACHIEVEMENT);
|
||||
}
|
||||
|
||||
void Register() override
|
||||
@@ -853,19 +1003,6 @@ class spell_atramedes_sonic_breath : public SpellScript
|
||||
}
|
||||
};
|
||||
|
||||
class ValidInvalidShieldCheck
|
||||
{
|
||||
public:
|
||||
ValidInvalidShieldCheck(ObjectGuid guid) : _guid(guid) { }
|
||||
|
||||
bool operator()(WorldObject const* obj) const
|
||||
{
|
||||
return obj->GetGUID() == _guid || obj->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
|
||||
}
|
||||
private:
|
||||
ObjectGuid _guid;
|
||||
};
|
||||
|
||||
class spell_atramedes_destroy_shield : public SpellScript
|
||||
{
|
||||
PrepareSpellScript(spell_atramedes_destroy_shield);
|
||||
@@ -875,9 +1012,10 @@ class spell_atramedes_destroy_shield : public SpellScript
|
||||
if (targets.empty())
|
||||
return;
|
||||
|
||||
if (Creature* creature = GetCaster()->ToCreature())
|
||||
if (creature->IsAIEnabled)
|
||||
targets.remove_if(ValidInvalidShieldCheck(creature->AI()->GetGUID(DATA_LAST_USED_ANCIENT_DWARVEN_SHIELD)));
|
||||
targets.remove_if([](WorldObject const* obj)
|
||||
{
|
||||
return obj->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
|
||||
});
|
||||
|
||||
if (targets.size() > 1)
|
||||
Trinity::Containers::RandomResize(targets, 1);
|
||||
@@ -889,11 +1027,56 @@ class spell_atramedes_destroy_shield : public SpellScript
|
||||
}
|
||||
};
|
||||
|
||||
class spell_atramedes_pestered : public AuraScript
|
||||
{
|
||||
PrepareAuraScript(spell_atramedes_pestered);
|
||||
|
||||
void AfterApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
|
||||
{
|
||||
if (Unit* caster = GetCaster())
|
||||
if (Creature* creature = caster->ToCreature())
|
||||
if (creature->IsAIEnabled)
|
||||
creature->AI()->DoAction(ACTION_PLAYER_ENTERED);
|
||||
}
|
||||
|
||||
void AfterRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
|
||||
{
|
||||
if (Unit* caster = GetCaster())
|
||||
if (Creature* creature = caster->ToCreature())
|
||||
if (creature->IsAIEnabled)
|
||||
creature->AI()->DoAction(ACTION_PLAYER_LEFT);
|
||||
}
|
||||
|
||||
void Register() override
|
||||
{
|
||||
AfterEffectApply += AuraEffectApplyFn(spell_atramedes_pestered::AfterApply, EFFECT_0, SPELL_AURA_CONTROL_VEHICLE, AURA_EFFECT_HANDLE_REAL);
|
||||
AfterEffectRemove += AuraEffectRemoveFn(spell_atramedes_pestered::AfterRemove, EFFECT_0, SPELL_AURA_CONTROL_VEHICLE, AURA_EFFECT_HANDLE_REAL);
|
||||
}
|
||||
};
|
||||
|
||||
class achievement_silence_is_golden : public AchievementCriteriaScript
|
||||
{
|
||||
public:
|
||||
achievement_silence_is_golden() : AchievementCriteriaScript("achievement_silence_is_golden") { }
|
||||
|
||||
bool OnCheck(Player* /*source*/, Unit* target) override
|
||||
{
|
||||
if (!target)
|
||||
return false;
|
||||
|
||||
if (target->IsAIEnabled)
|
||||
return target->GetAI()->GetData(DATA_ACHIEVEMT_ENLIGIBLE);
|
||||
|
||||
return false;
|
||||
}
|
||||
};
|
||||
|
||||
void AddSC_boss_atramedes()
|
||||
{
|
||||
RegisterBlackwingDescentCreatureAI(boss_atramedes);
|
||||
RegisterBlackwingDescentCreatureAI(npc_atramedes_ancient_dwarven_shield);
|
||||
RegisterBlackwingDescentCreatureAI(npc_atramedes_lord_victor_nefarius);
|
||||
RegisterBlackwingDescentCreatureAI(npc_atramedes_obnoxious_fiend);
|
||||
RegisterSpellScript(spell_atramedes_modulation);
|
||||
RegisterSpellScript(spell_atramedes_roaring_flame_breath_reverse_cast);
|
||||
RegisterAuraScript(spell_atramedes_roaring_flame_breath);
|
||||
@@ -908,4 +1091,6 @@ void AddSC_boss_atramedes()
|
||||
RegisterAuraScript(spell_atramedes_devastation_trigger);
|
||||
RegisterSpellScript(spell_atramedes_sonic_breath);
|
||||
RegisterSpellScript(spell_atramedes_destroy_shield);
|
||||
RegisterAuraScript(spell_atramedes_pestered);
|
||||
new achievement_silence_is_golden();
|
||||
}
|
||||
|
||||
@@ -150,6 +150,7 @@ class instance_blackwing_descent : public InstanceMapScript
|
||||
case NPC_TRACKING_FLAMES:
|
||||
case NPC_SONAR_PULSE_BOMB:
|
||||
case NPC_REVERBERATING_FLAME:
|
||||
case NPC_OBNOXIOUS_FIEND:
|
||||
if (Creature* atramedes = GetCreature(DATA_ATRAMEDES))
|
||||
atramedes->AI()->JustSummoned(creature);
|
||||
break;
|
||||
|
||||
Reference in New Issue
Block a user