diff --git a/sql/updates/WIP/atramedes.sql b/sql/updates/world/custom/custom_2019_07_19_00_world.sql similarity index 83% rename from sql/updates/WIP/atramedes.sql rename to sql/updates/world/custom/custom_2019_07_19_00_world.sql index 93f0a1a5f54..b5951112ff5 100644 --- a/sql/updates/WIP/atramedes.sql +++ b/sql/updates/world/custom/custom_2019_07_19_00_world.sql @@ -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); diff --git a/src/server/game/Spells/SpellMgr.cpp b/src/server/game/Spells/SpellMgr.cpp index 074a5f9b25b..fa187bb14a9 100644 --- a/src/server/game/Spells/SpellMgr.cpp +++ b/src/server/game/Spells/SpellMgr.cpp @@ -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 diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingDescent/blackwing_descent.h b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingDescent/blackwing_descent.h index 0027d4e7270..163cd3b5ca1 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingDescent/blackwing_descent.h +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingDescent/blackwing_descent.h @@ -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, diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingDescent/boss_atramedes.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingDescent/boss_atramedes.cpp index f289a2a2426..7af7d3e7741 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingDescent/boss_atramedes.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingDescent/boss_atramedes.cpp @@ -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(); } diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingDescent/instance_blackwing_descent.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingDescent/instance_blackwing_descent.cpp index a8f06dedece..1b3bbc9bdc7 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingDescent/instance_blackwing_descent.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingDescent/instance_blackwing_descent.cpp @@ -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;