From 95d8d05ff93a11dd69b2d497d76278f622192aa7 Mon Sep 17 00:00:00 2001 From: Ovahlord Date: Tue, 31 Jul 2018 03:09:02 +0200 Subject: [PATCH] Scripts/GB: Valiona's Devouring Flames will now deal less damage when moving further away from her * corrected some timers and cleaned up script --- .../custom/custom_2018_07_31_00_world.sql | 6 + src/server/game/Spells/SpellMgr.cpp | 15 ++ .../GrimBatol/boss_drahga_shadowburner.cpp | 162 ++++++++---------- 3 files changed, 90 insertions(+), 93 deletions(-) create mode 100644 sql/updates/world/custom/custom_2018_07_31_00_world.sql diff --git a/sql/updates/world/custom/custom_2018_07_31_00_world.sql b/sql/updates/world/custom/custom_2018_07_31_00_world.sql new file mode 100644 index 00000000000..78069faa588 --- /dev/null +++ b/sql/updates/world/custom/custom_2018_07_31_00_world.sql @@ -0,0 +1,6 @@ +DELETE FROM `spell_script_names` WHERE `ScriptName` IN +('spell_drahga_devouring_flames', +'spell_drahga_devouring_flames_aoe'); + +INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES +(90949, 'spell_drahga_devouring_flames'); diff --git a/src/server/game/Spells/SpellMgr.cpp b/src/server/game/Spells/SpellMgr.cpp index 12fad095078..bae16719c15 100644 --- a/src/server/game/Spells/SpellMgr.cpp +++ b/src/server/game/Spells/SpellMgr.cpp @@ -4387,6 +4387,21 @@ void SpellMgr::LoadSpellInfoCorrections() spellInfo->AttributesEx2 |= SPELL_ATTR2_CAN_TARGET_NOT_IN_LOS; }); + // Devouring Flames + ApplySpellFix({ 90945 }, [](SpellInfo* spellInfo) + { + spellInfo->MaxAffectedTargets = 1; + }); + + // Burning Shadowbolt + ApplySpellFix({ + 75245, + 90915 + }, [](SpellInfo* spellInfo) + { + spellInfo->MaxAffectedTargets = 1; + }); + // Erudax // Twilight Blast ApplySpellFix({ 76194, 91042 }, [](SpellInfo* spellInfo) diff --git a/src/server/scripts/EasternKingdoms/GrimBatol/boss_drahga_shadowburner.cpp b/src/server/scripts/EasternKingdoms/GrimBatol/boss_drahga_shadowburner.cpp index 49682aac93b..6f4b97fdaff 100644 --- a/src/server/scripts/EasternKingdoms/GrimBatol/boss_drahga_shadowburner.cpp +++ b/src/server/scripts/EasternKingdoms/GrimBatol/boss_drahga_shadowburner.cpp @@ -20,6 +20,7 @@ #include "ScriptedCreature.h" #include "SpellScript.h" #include "SpellAuraEffects.h" +#include "MoveSplineInit.h" #include "Player.h" #include "grim_batol.h" @@ -73,7 +74,6 @@ enum Events // Valiona EVENT_MOVE_INTRO, - EVENT_ATTACK, EVENT_SHREDDING_SWIPE, EVENT_DEVOURING_FLAMES, EVENT_DEVOURING_FLAMES_CAST, @@ -180,19 +180,13 @@ class boss_drahga_shadowburner : public CreatureScript void JustSummoned(Creature* summon) override { - switch (summon->GetEntry()) - { - case NPC_VALIONA: - break; - default: - summons.Summon(summon); - break; - } + if (summon->GetEntry() != NPC_VALIONA) + summons.Summon(summon); } - void DamageTaken(Unit* /*attacker*/, uint32& /*damage*/) override + void DamageTaken(Unit* /*attacker*/, uint32& damage) override { - if (me->HealthBelowPct(30) && events.IsInPhase(PHASE_1)) + if (me->HealthBelowPctDamaged(30, damage) && events.IsInPhase(PHASE_1)) { events.Reset(); events.SetPhase(PHASE_2); @@ -234,8 +228,8 @@ class boss_drahga_shadowburner : public CreatureScript switch(action) { case ACTION_SCHEDULE_EVENTS: - events.ScheduleEvent(EVENT_BURNING_SHADOWBOLT, Seconds(3)); - events.ScheduleEvent(EVENT_INVOCATION_OF_FLAME, Seconds(9) + Milliseconds(500)); + events.ScheduleEvent(EVENT_BURNING_SHADOWBOLT, Milliseconds(1)); + events.ScheduleEvent(EVENT_INVOCATION_OF_FLAME, Milliseconds(1)); break; default: break; @@ -285,7 +279,7 @@ class npc_drahga_valiona : public CreatureScript struct npc_drahga_valionaAI : public ScriptedAI { - npc_drahga_valionaAI(Creature* creature) : ScriptedAI(creature), _summons(me) + npc_drahga_valionaAI(Creature* creature) : ScriptedAI(creature), _summons(me), _instance(me->GetInstanceScript()) { Initialize(); } @@ -293,13 +287,12 @@ class npc_drahga_valiona : public CreatureScript void Initialize() { _finished = false; - _instance = me->GetInstanceScript(); } void IsSummonedBy(Unit* /*summon*/) override { - me->SetCanFly(true); me->SetDisableGravity(true); + me->SetHover(true); me->SetByteFlag(UNIT_FIELD_BYTES_1, 3, UNIT_BYTE1_FLAG_ALWAYS_STAND | UNIT_BYTE1_FLAG_HOVER); me->SetSpeed(MOVE_FLIGHT, 4.5f); me->SetReactState(REACT_PASSIVE); @@ -320,6 +313,7 @@ class npc_drahga_valiona : public CreatureScript switch (point) { case POINT_INTRO_1: + DoZoneInCombat(); _instance->SendEncounterUnit(ENCOUNTER_FRAME_ENGAGE, me); me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); me->GetMotionMaster()->MovePoint(POINT_INTRO_2, ValionaPos2); @@ -328,11 +322,21 @@ class npc_drahga_valiona : public CreatureScript me->GetMotionMaster()->MoveLand(POINT_LAND, LandingPos); break; case POINT_LAND: - me->SetCanFly(false); - me->SetHover(false); + me->SendMovementSetSplineAnim(Movement::AnimType::ToGround); me->SetDisableGravity(false); + me->SetHover(false); + me->SendMovementSetSplineAnim(Movement::AnimType::ToGround); me->RemoveByteFlag(UNIT_FIELD_BYTES_1, 3, UNIT_BYTE1_FLAG_ALWAYS_STAND | UNIT_BYTE1_FLAG_HOVER); - _events.ScheduleEvent(EVENT_ATTACK, Milliseconds(800)); + me->SetReactState(REACT_AGGRESSIVE); + + if (Unit* nearTarget = me->SelectNearestTarget(100.0f)) + AttackStart(nearTarget); + + if (Creature* drahga = _instance->GetCreature(DATA_DRAHGA_SHADOWBURNER)) + drahga->AI()->DoAction(ACTION_SCHEDULE_EVENTS); + + _events.ScheduleEvent(EVENT_SHREDDING_SWIPE, Seconds(1)); + _events.ScheduleEvent(EVENT_DEVOURING_FLAMES, Seconds(15) + Milliseconds(500)); break; case POINT_TAKEOFF: me->GetMotionMaster()->MovePoint(POINT_FLEE, FleePos); @@ -346,9 +350,9 @@ class npc_drahga_valiona : public CreatureScript } } - void DamageTaken(Unit* /*attacker*/, uint32& /*damage*/) override + void DamageTaken(Unit* /*attacker*/, uint32& damage) override { - if (me->HealthBelowPct(20) && !_finished) + if (me->HealthBelowPctDamaged(20, damage) && !_finished) { Talk(SAY_VALIONA_FLEE); DoCast(SPELL_TWILIGHT_SHIFT); @@ -357,7 +361,6 @@ class npc_drahga_valiona : public CreatureScript me->SetReactState(REACT_PASSIVE); _events.Reset(); me->RemoveAurasDueToSpell(SPELL_RIDE_VEHICLE); - me->SetCanFly(true); me->SetDisableGravity(true); me->SetHover(true); me->SetByteFlag(UNIT_FIELD_BYTES_1, 3, UNIT_BYTE1_FLAG_ALWAYS_STAND | UNIT_BYTE1_FLAG_HOVER); @@ -407,14 +410,6 @@ class npc_drahga_valiona : public CreatureScript Talk(SAY_VALIONA_AGGRO); me->GetMotionMaster()->MovePoint(POINT_INTRO_1, ValionaPos1); break; - case EVENT_ATTACK: - me->SetReactState(REACT_AGGRESSIVE); - if (Creature* drahga = _instance->GetCreature(DATA_DRAHGA_SHADOWBURNER)) - drahga->AI()->DoAction(ACTION_SCHEDULE_EVENTS); - - _events.ScheduleEvent(EVENT_SHREDDING_SWIPE, Seconds(1) + Milliseconds(500)); - _events.ScheduleEvent(EVENT_DEVOURING_FLAMES, Seconds(15) + Milliseconds(500)); - break; case EVENT_SHREDDING_SWIPE: DoCastVictim(SPELL_SHREDDING_SWIPE); _events.Repeat(Seconds(25)); @@ -431,14 +426,12 @@ class npc_drahga_valiona : public CreatureScript _events.Repeat(Seconds(25)); break; case EVENT_DEVOURING_FLAMES_CAST: - if (Creature* dummy = me->FindNearestCreature(NPC_DEVOURING_FLAMES, 500.0f, true)) + if (Creature* dummy = me->FindNearestCreature(NPC_DEVOURING_FLAMES, 200.0f, true)) { Talk(SAY_ANNOUNCE_DEVOURING_FLAMES); me->StopMoving(); - me->SetReactState(REACT_PASSIVE); - me->AttackStop(); me->SetFacingToObject(dummy); - DoCastAOE(SPELL_DEVOURING_FLAMES); + DoCast(dummy, SPELL_DEVOURING_FLAMES); _events.ScheduleEvent(EVENT_MAKE_AGGRESSIVE, Seconds(7) + Milliseconds(500)); } break; @@ -471,13 +464,20 @@ class npc_drahga_invoked_flaming_spirit : public CreatureScript struct npc_drahga_invoked_flaming_spiritAI : public ScriptedAI { - npc_drahga_invoked_flaming_spiritAI(Creature* creature) : ScriptedAI(creature) { } + npc_drahga_invoked_flaming_spiritAI(Creature* creature) : ScriptedAI(creature) + { + Initialize(); + } - void IsSummonedBy(Unit* /*summoner*/) + void Initialize() { me->SetReactState(REACT_PASSIVE); me->SetWalk(true); - me->SetInCombatWithZone(); + } + + void IsSummonedBy(Unit* /*summoner*/) + { + DoZoneInCombat(); _events.ScheduleEvent(EVENT_CHASE_PLAYER, Seconds(2)); } @@ -509,7 +509,7 @@ class npc_drahga_invoked_flaming_spirit : public CreatureScript { me->AddThreat(target, 1500500.0f); DoCast(target, SPELL_FLAMING_FIXATE, true); - me->AI()->AttackStart(target); + AttackStart(target); me->ClearUnitState(UNIT_STATE_CASTING); me->GetMotionMaster()->MovePoint(0, target->GetPosition(), true); _events.ScheduleEvent(EVENT_REPEAT_MOVEMENT, Seconds(1)); @@ -537,70 +537,46 @@ class npc_drahga_invoked_flaming_spirit : public CreatureScript } }; -class spell_drahga_burning_shadowbolt : public SpellScriptLoader +class spell_drahga_burning_shadowbolt : public SpellScript { - public: - spell_drahga_burning_shadowbolt() : SpellScriptLoader("spell_drahga_burning_shadowbolt") { } + PrepareSpellScript(spell_drahga_burning_shadowbolt); - class spell_drahga_burning_shadowbolt_SpellScript : public SpellScript - { - PrepareSpellScript(spell_drahga_burning_shadowbolt_SpellScript); + bool Validate(SpellInfo const* /*spell*/) override + { + return ValidateSpellInfo({ SPELL_BURNING_SHADOWBOLT_DUMMY }); + } - bool Validate(SpellInfo const* /*spell*/) override - { - return ValidateSpellInfo({ SPELL_BURNING_SHADOWBOLT_DUMMY }); - } + void CastDummySpell(SpellEffIndex /*effIndex*/) + { + if (Unit* target = GetHitUnit()) + GetCaster()->CastSpell(target, SPELL_BURNING_SHADOWBOLT_DUMMY, true); + } - void FilterTargets(std::list& targets) - { - if (targets.empty()) - return; - - Trinity::Containers::RandomResize(targets, 1); - auto itr = targets.begin(); - if (Unit* target = (*itr)->ToUnit()) - GetCaster()->CastSpell(target, SPELL_BURNING_SHADOWBOLT_DUMMY, true); - } - - void Register() override - { - OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_drahga_burning_shadowbolt_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY); - } - }; - - SpellScript* GetSpellScript() const override - { - return new spell_drahga_burning_shadowbolt_SpellScript(); - } + void Register() override + { + OnEffectLaunchTarget += SpellEffectFn(spell_drahga_burning_shadowbolt::CastDummySpell, EFFECT_0, SPELL_EFFECT_SCHOOL_DAMAGE); + } }; -class spell_drahga_devouring_flames_aoe : public SpellScriptLoader +class spell_drahga_devouring_flames : public SpellScript { - public: - spell_drahga_devouring_flames_aoe() : SpellScriptLoader("spell_drahga_devouring_flames_aoe") { } + PrepareSpellScript(spell_drahga_devouring_flames); - class spell_drahga_devouring_flames_aoe_SpellScript : public SpellScript + void ChangeDamage() + { + if (Unit* caster = GetCaster()) { - PrepareSpellScript(spell_drahga_devouring_flames_aoe_SpellScript); + float distance = GetHitUnit()->GetDistance(caster) * 3.0f; - void FilterTargets(std::list& targets) - { - if (targets.empty()) - return; - - Trinity::Containers::RandomResize(targets, 1); - } - - void Register() override - { - OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_drahga_devouring_flames_aoe_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY); - } - }; - - SpellScript* GetSpellScript() const override - { - return new spell_drahga_devouring_flames_aoe_SpellScript(); + uint32 damageReduction = CalculatePct(GetHitDamage(), distance); + SetHitDamage(GetHitDamage() - damageReduction); } + } + + void Register() override + { + OnHit += SpellHitFn(spell_drahga_devouring_flames::ChangeDamage); + } }; void AddSC_boss_drahga_shadowburner() @@ -608,6 +584,6 @@ void AddSC_boss_drahga_shadowburner() new boss_drahga_shadowburner(); new npc_drahga_valiona(); new npc_drahga_invoked_flaming_spirit(); - new spell_drahga_burning_shadowbolt(); - new spell_drahga_devouring_flames_aoe(); + RegisterSpellScript(spell_drahga_burning_shadowbolt); + RegisterSpellScript(spell_drahga_devouring_flames); }