From 441f254fc2edb2817326f8f116e60fb4aef5448d Mon Sep 17 00:00:00 2001 From: Ovahlord Date: Tue, 18 Dec 2018 05:19:29 +0100 Subject: [PATCH] Scripts/GB: scripted Twilight Beguiler and Enslaved Gronn Brute cosmetic and combat events --- .../custom/custom_2018_12_18_00_world.sql | 18 +++ src/server/game/Spells/SpellMgr.cpp | 6 + .../EasternKingdoms/GrimBatol/grim_batol.cpp | 141 ++++++++++++++++++ .../EasternKingdoms/GrimBatol/grim_batol.h | 3 + .../eastern_kingdoms_script_loader.cpp | 4 +- 5 files changed, 171 insertions(+), 1 deletion(-) create mode 100644 sql/updates/world/custom/custom_2018_12_18_00_world.sql create mode 100644 src/server/scripts/EasternKingdoms/GrimBatol/grim_batol.cpp diff --git a/sql/updates/world/custom/custom_2018_12_18_00_world.sql b/sql/updates/world/custom/custom_2018_12_18_00_world.sql new file mode 100644 index 00000000000..dcf0d30b9f8 --- /dev/null +++ b/sql/updates/world/custom/custom_2018_12_18_00_world.sql @@ -0,0 +1,18 @@ +-- Creature Enslaved Gronn Brute 40166 SAI +SET @ENTRY := 40166; +UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`= @ENTRY; +DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0; +INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(@ENTRY, 0, 0, 0, 1, 0, 100, 0, 0, 20000, 30000, 30000, 11, 76138, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, "When out of combat and timer at the begining between 0 and 20000 ms (and later repeats every 30000 and 30000 ms) - Self: Cast spell 76138 on Self // "), +(@ENTRY, 0, 1, 0, 0, 0, 100, 0, 4000, 5000, 11000, 12000, 11, 76703, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, "When in combat and timer at the begining between 4000 and 5000 ms (and later repeats every 11000 and 12000 ms) - Self: Cast spell 76703 on Victim // "); + +-- Twilight Beguiler +UPDATE `creature_template` SET `ScriptName`= 'npc_grim_batol_twilight_beguiler' WHERE `entry`= 40167; + +DELETE FROM `conditions` WHERE `SourceEntry` IN (76138, 74867, 74884, 76151, 90719) AND `SourceTypeOrReferenceId`= 13; +INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorType`, `ScriptName`, `Comment`) VALUES +(13, 3, 76138, 0, 0, 31, 0, 3, 40167, 0, 0, 0, '', 'Gronn Knockback Cosmetic - Target Twilight Beguiler'), +(13, 1, 74867, 0, 0, 31, 0, 3, 40166, 0, 0, 0, '', 'Enslave Gronn Cosmetic - Target Enslaved Gronn Brute'), +(13, 1, 74884, 0, 0, 31, 0, 3, 40166, 0, 0, 0, '', 'Enslave Gronn Cosmetic - Target Enslaved Gronn Brute'), +(13, 3, 76151, 0, 0, 31, 0, 3, 40166, 0, 0, 0, '', 'Beguile - Target Enslaved Gronn Brute'), +(13, 3, 90719, 0, 0, 31, 0, 3, 40166, 0, 0, 0, '', 'Beguile - Target Enslaved Gronn Brute'); diff --git a/src/server/game/Spells/SpellMgr.cpp b/src/server/game/Spells/SpellMgr.cpp index cee551da739..76e2832cb77 100644 --- a/src/server/game/Spells/SpellMgr.cpp +++ b/src/server/game/Spells/SpellMgr.cpp @@ -4499,6 +4499,12 @@ void SpellMgr::LoadSpellInfoCorrections() spellInfo->AttributesEx5 &= ~SPELL_ATTR5_CAN_CHANNEL_WHEN_MOVING; }); + // Gronn Knockback Cosmetic + ApplySpellFix({ 76138 }, [](SpellInfo* spellInfo) + { + spellInfo->MaxAffectedTargets = 1; + }); + // ENDOF GRIM_BATOL SPELLS // diff --git a/src/server/scripts/EasternKingdoms/GrimBatol/grim_batol.cpp b/src/server/scripts/EasternKingdoms/GrimBatol/grim_batol.cpp new file mode 100644 index 00000000000..8c60608e716 --- /dev/null +++ b/src/server/scripts/EasternKingdoms/GrimBatol/grim_batol.cpp @@ -0,0 +1,141 @@ +/* +* Copyright (C) 2008-2018 TrinityCore +* +* This program is free software; you can redistribute it and/or modify it +* under the terms of the GNU General Public License as published by the +* Free Software Foundation; either version 2 of the License, or (at your +* option) any later version. +* +* This program is distributed in the hope that it will be useful, but WITHOUT +* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for +* more details. +* +* You should have received a copy of the GNU General Public License along +* with this program. If not, see . +*/ + +#include "ObjectMgr.h" +#include "ScriptMgr.h" +#include "ScriptedCreature.h" +#include "SpellScript.h" +#include "SpellAuraEffects.h" +#include "grim_batol.h" + +enum TwilightBeguiler +{ + // Events + EVENT_BEGUILE = 1, + EVENT_MOVE_TO_HOME_POSITION, + EVENT_ENSLAVE_GRONN_COSMETIC, + EVENT_DECEITFUL_BLAST, + EVENT_CHAINED_MIND, + + // Phases + PHASE_COSMETIC = 1, + PHASE_COMBAT = 2, + + // Spells + SPELL_GRONN_KNOCKBACK_COSMETIC = 76138, + SPELL_BEGUILE = 76151, + SPELL_ENSLAVE_GRONN_COSMETIC_RIGHT = 74867, + SPELL_ENSLAVE_GRONN_COSMETIC_LEFT = 74884, + SPELL_DECEITFUL_BLAST = 76715, + SPELL_CHAINED_MIND = 76711 +}; + +struct npc_grim_batol_twilight_beguiler : public ScriptedAI +{ + npc_grim_batol_twilight_beguiler(Creature* creature) : ScriptedAI(creature) { } + + void Reset() + { + _events.Reset(); + _events.SetPhase(PHASE_COSMETIC); + _events.ScheduleEvent(EVENT_ENSLAVE_GRONN_COSMETIC, 1s, 0, PHASE_COSMETIC); + } + + void JustEngagedWith(Unit* /*who*/) override + { + _events.SetPhase(PHASE_COMBAT); + _events.ScheduleEvent(EVENT_DECEITFUL_BLAST, 7s, 0, PHASE_COMBAT); + _events.ScheduleEvent(EVENT_CHAINED_MIND, 7s, 15s, 0, PHASE_COMBAT); + me->InterruptNonMeleeSpells(true); + } + + void SpellHit(Unit* caster, SpellInfo const* spell) override + { + if (spell->Id == SPELL_GRONN_KNOCKBACK_COSMETIC) + { + _events.ScheduleEvent(EVENT_BEGUILE, 4s, 0, PHASE_COSMETIC); + _events.ScheduleEvent(EVENT_MOVE_TO_HOME_POSITION, 7s + 600ms, 0, PHASE_COSMETIC); + _events.ScheduleEvent(EVENT_ENSLAVE_GRONN_COSMETIC, 7s + 600ms, 0, PHASE_COSMETIC); + } + } + + void UpdateAI(uint32 diff) override + { + if (!UpdateVictim() && !_events.IsInPhase(PHASE_COSMETIC)) + return; + + _events.Update(diff); + + if (me->HasUnitState(UNIT_STATE_CASTING) && !_events.IsInPhase(PHASE_COSMETIC)) + return; + + while (uint32 eventId = _events.ExecuteEvent()) + { + switch (eventId) + { + case EVENT_BEGUILE: + DoCastSelf(SPELL_BEGUILE); + break; + case EVENT_MOVE_TO_HOME_POSITION: + me->GetMotionMaster()->MoveTargetedHome(); + break; + case EVENT_ENSLAVE_GRONN_COSMETIC: + if (Creature* gronn = me->FindNearestCreature(NPC_ENSLAVED_GRONN_BRUTE, 30.0f, true)) + { + Position pos = gronn->GetHomePosition(); + pos.SetOrientation(pos.GetOrientation() + (float)M_PI / 1.5f); + + if (pos.HasInLine(&me->GetHomePosition(), 15.0f)) + DoCastSelf(SPELL_ENSLAVE_GRONN_COSMETIC_LEFT); + else + { + pos = gronn->GetHomePosition(); + pos.SetOrientation(pos.GetOrientation() - (float)M_PI / 1.5f); + if (pos.HasInLine(&me->GetHomePosition(), 15.0f)) + DoCastSelf(SPELL_ENSLAVE_GRONN_COSMETIC_RIGHT); + } + } + break; + case EVENT_DECEITFUL_BLAST: + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 25.0f, true, 0)) + DoCast(target, SPELL_DECEITFUL_BLAST); + + if (_events.GetTimeUntilEvent(EVENT_CHAINED_MIND) > 4 * IN_MILLISECONDS) + _events.Repeat(1s, 3s); + else + _events.Repeat(11s, 12s); + break; + case EVENT_CHAINED_MIND: + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 25.0f, true, 0)) + DoCast(target, SPELL_CHAINED_MIND); + _events.Repeat(18s, 27s); + break; + default: + break; + } + } + DoMeleeAttackIfReady(); + } + +private: + EventMap _events; +}; + +void AddSC_grim_batol() +{ + RegisterGrimBatolCreatureAI(npc_grim_batol_twilight_beguiler); +} \ No newline at end of file diff --git a/src/server/scripts/EasternKingdoms/GrimBatol/grim_batol.h b/src/server/scripts/EasternKingdoms/GrimBatol/grim_batol.h index dc34e9fff72..e33e7fb63b3 100644 --- a/src/server/scripts/EasternKingdoms/GrimBatol/grim_batol.h +++ b/src/server/scripts/EasternKingdoms/GrimBatol/grim_batol.h @@ -75,6 +75,9 @@ enum GBCreatureIds NPC_TWILIGHT_HATCHLING = 39388, NPC_HATCHED_TWILIGHT_EGG = 40846, + // Generic Creatures + NPC_ENSLAVED_GRONN_BRUTE = 40166, + }; enum GBSpells diff --git a/src/server/scripts/EasternKingdoms/eastern_kingdoms_script_loader.cpp b/src/server/scripts/EasternKingdoms/eastern_kingdoms_script_loader.cpp index 40d7d00268d..3ccff3fdd3e 100644 --- a/src/server/scripts/EasternKingdoms/eastern_kingdoms_script_loader.cpp +++ b/src/server/scripts/EasternKingdoms/eastern_kingdoms_script_loader.cpp @@ -91,6 +91,7 @@ void AddSC_boss_general_umbriss(); void AddSC_boss_forgemaster_throngus(); void AddSC_boss_drahga_shadowburner(); void AddSC_boss_erudax(); +void AddSC_grim_batol(); void AddSC_boss_attumen(); //Karazhan void AddSC_boss_curator(); void AddSC_boss_maiden_of_virtue(); @@ -311,8 +312,9 @@ void AddEasternKingdomsScripts() AddSC_instance_grim_batol(); //Grim Batol AddSC_boss_general_umbriss(); AddSC_boss_forgemaster_throngus(); - AddSC_boss_erudax(); AddSC_boss_drahga_shadowburner(); + AddSC_boss_erudax(); + AddSC_grim_batol(); AddSC_boss_attumen(); //Karazhan AddSC_boss_curator(); AddSC_boss_maiden_of_virtue();