From cfbc05985e91728a2ec1b2699b76fa70d0541a48 Mon Sep 17 00:00:00 2001 From: Ovalord <1Don7H4v3@m41L.com> Date: Thu, 18 Jan 2018 20:41:42 +0100 Subject: [PATCH] Scripts/GB: implement General Umbriss encounter *todo: loot --- .../4.3.4/custom_2018_01_18_00_world.sql | 74 ++++ src/server/game/Spells/SpellMgr.cpp | 13 + .../GrimBatol/boss_general_umbriss.cpp | 381 ++++++++++++++++++ .../EasternKingdoms/GrimBatol/grim_batol.h | 56 +++ .../GrimBatol/instance_grim_batol.cpp | 83 ++++ .../eastern_kingdoms_script_loader.cpp | 4 + 6 files changed, 611 insertions(+) create mode 100644 sql/updates/world/4.3.4/custom_2018_01_18_00_world.sql create mode 100644 src/server/scripts/EasternKingdoms/GrimBatol/boss_general_umbriss.cpp create mode 100644 src/server/scripts/EasternKingdoms/GrimBatol/grim_batol.h create mode 100644 src/server/scripts/EasternKingdoms/GrimBatol/instance_grim_batol.cpp diff --git a/sql/updates/world/4.3.4/custom_2018_01_18_00_world.sql b/sql/updates/world/4.3.4/custom_2018_01_18_00_world.sql new file mode 100644 index 00000000000..5cd6d9f03e7 --- /dev/null +++ b/sql/updates/world/4.3.4/custom_2018_01_18_00_world.sql @@ -0,0 +1,74 @@ +-- Assign scriptname to instance +UPDATE `instance_template` SET `script`= 'instance_grim_batol' WHERE `map`= 670; + +-- Template Updates +UPDATE `creature_template` SET `scriptname`= 'boss_general_umbriss', `flags_extra`= `flags_extra`| 0x40000000 WHERE `entry`= 39625; +UPDATE `creature_template` SET `minlevel`= 87, `maxlevel`= 87, `BaseAttackTime`= 1500, `unit_flags`= 67141696, `lootid`= 48337, `mechanic_immune_mask`= 617299839, `flags_extra`= `flags_extra`| 0x40000000 WHERE `entry`= 48337; +-- Blitz / Ground Siege +UPDATE `creature_template` SET `faction`= 35, `unit_flags`= 33554688, `flags_extra`= 131 WHERE `entry` IN (40040, 40030); + +-- Remove db side spawned Malignant Trogg +DELETE FROM `creature` WHERE `guid`= 340015; +DELETE FROM `creature_addon` WHERE `guid`= 340015; + +-- Texts +DELETE FROM `creature_text` WHERE `CreatureID`= 39625; +INSERT INTO `creature_text` (`CreatureID`, `GroupID`, `ID`, `Text`, `Type`, `Language`, `Probability`, `Emote`, `Duration`, `Sound`, `BroadcastTextId`, `Comment`) VALUES +(39625, 0, 0, 'Cover the rear! Alexstrasza''s brood decimate our ranks!', 14, 0, 100, 0, 0, 18537, 40642, 'General Umbriss'), +(39625, 0, 1, 'Reinforce the front! We are being invaded!', 14, 0, 100, 0, 0, 18536, 40640, 'General Umbriss'), +(39625, 1, 0, 'A million more await my orders. What chance do you have?', 14, 0, 100, 0, 0, 18530, 47784, 'General Umbriss to Player'), +(39625, 2, 0, 'Attack you cowardly vermin!', 14, 0, 100, 0, 0, 18535, 47799, 'General Umbriss'), +(39625, 2, 1, 'Vermin, your dinner awaits!', 14, 0, 100, 0, 0, 18531, 47785, 'General Umbriss'), + +(39625, 3, 0, 'Messy...', 14, 0, 100, 0, 0, 18532, 47786, 'General Umbriss'), +(39625, 4, 0, '|TInterface\\Icons\\ability_warrior_charge.blp:20|tGeneral Umbriss sets his eyes on |cFFFF0000$n|r and begins to cast |cFFFF0000|Hspell:74670|h[Blitz]|h|r!', 41, 0, 100, 0, 0, 0, 39994, 'General Umbriss to Player'), +(39625, 5, 0, '|TInterface\\Icons\\spell_nature_earthquake.blp:20|tGeneral Umbriss begins to cast |cFFFF0000|Hspell:74634|h[Ground Siege]|h|r!', 41, 0, 100, 0, 0, 0, 50666, 'General Umbriss to Ground Siege'), +(39625, 6, 0, '%s goes into a frenzy!', 41, 0, 100, 0, 0, 0, 10645, 'General Umbriss'); + +-- Spell scriptnames +DELETE FROM `spell_script_names` WHERE `ScriptName` IN +('spell_umbriss_summon_blitz_trigger', +'spell_umbriss_summon_ground_siege_trigger', +'spell_umbriss_bleeding_wound', +'spell_umbriss_modguds_malice'); + +INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES +(74668, 'spell_umbriss_summon_blitz_trigger'), +(74640, 'spell_umbriss_summon_ground_siege_trigger'), +(74846, 'spell_umbriss_bleeding_wound'), +(91937, 'spell_umbriss_bleeding_wound'), +(74699, 'spell_umbriss_modguds_malice'), +(90169, 'spell_umbriss_modguds_malice'); + +DELETE FROM `conditions` WHERE `SourceEntry` IN (74670, 90250, 74634, 90249, 90170) AND `SourceTypeOrReferenceId`= 13; +INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorType`, `ScriptName`, `Comment`) VALUES +(13, 1, 74670, 0, 0, 31, 0, 3, 40040, 0, 0, 0, '', 'Blitz - Target Blitz Stalker'), +(13, 1, 90250, 0, 0, 31, 0, 3, 40040, 0, 0, 0, '', 'Blitz - Target Blitz Stalker'), +(13, 1, 74634, 0, 0, 31, 0, 3, 40030, 0, 0, 0, '', 'Ground Siege - Target Ground Siege Stalker'), +(13, 1, 90249, 0, 0, 31, 0, 3, 40030, 0, 0, 0, '', 'Ground Siege - Target Ground Siege Stalker'), +(13, 1, 90170, 0, 0, 31, 0, 3, 39625, 0, 0, 0, '', 'Modgud''s Malice - Target General Umbriss'), +(13, 2, 90170, 0, 0, 31, 0, 3, 39625, 0, 0, 0, '', 'Modgud''s Malice - Target General Umbriss'), +(13, 4, 90170, 0, 0, 31, 0, 3, 45467, 0, 0, 0, '', 'Modgud''s Malice - Target Trogg Dweller'); + +-- Creature Malignant Trogg 39984 SAI +SET @ENTRY := 39984; +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, 1, 3000, 3000, 0, 0, 49, 0, 0, 0, 0, 0, 0, 18, 100, 0, 0, 0, 0, 0, 0, "When out of combat and timer at the begining between 3000 and 3000 ms (and later repeats every 0 and 0 ms) - Self: Attack Players in 100 yards // "), +(@ENTRY, 0, 1, 0, 0, 0, 100, 0, 6000, 7000, 6000, 7000, 11, 76507, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, "When in combat and timer at the begining between 6000 and 7000 ms (and later repeats every 6000 and 7000 ms) - Self: Cast spell 76507 on Victim // "); + +DELETE FROM `creature_template_addon` WHERE `entry`= 48350; +INSERT INTO `creature_template_addon` (`entry`, `bytes2`, `auras`) VALUES +(48350, 1, 74699); + +-- Creature Trogg Dweller 45467 SAI +SET @ENTRY := 45467; +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, 1, 3000, 3000, 0, 0, 49, 0, 0, 0, 0, 0, 0, 18, 100, 0, 0, 0, 0, 0, 0, "When out of combat and timer at the begining between 3000 and 3000 ms (and later repeats every 0 and 0 ms) - Self: Attack Players in 100 yards // "), +(@ENTRY, 0, 1, 0, 0, 0, 100, 0, 6000, 7000, 6000, 7000, 11, 76507, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, "When in combat and timer at the begining between 6000 and 7000 ms (and later repeats every 6000 and 7000 ms) - Self: Cast spell 76507 on Victim // "); + +-- Remove pathfinding from troggs since they have to pass ugly terrain +UPDATE `creature_template` SET `flags_extra`= `flags_extra` | 0x20000000 WHERE `entry` IN (45467, 39984, 48350, 48348); diff --git a/src/server/game/Spells/SpellMgr.cpp b/src/server/game/Spells/SpellMgr.cpp index d77af693a7c..f78722b1bce 100644 --- a/src/server/game/Spells/SpellMgr.cpp +++ b/src/server/game/Spells/SpellMgr.cpp @@ -4112,6 +4112,19 @@ void SpellMgr::LoadSpellInfoCorrections() }); // ENDOF THE VORTEX PINNACLE SPELLS + // + // GRIM BATOL SPELLS + // + // General Umbriss + // Ground Siege + ApplySpellFix({ 74634, 90249 }, [](SpellInfo* spellInfo) + { + // SPELL_ATTR3_ONLY_TARGET_PLAYERS is the only attribute here so we can nullify it + spellInfo->AttributesEx3 = 0; + }); + + // ENDOF GRIM_BATOL SPELLS + // // THE LOST CITY OF THE TOL'VIR SPELLS // diff --git a/src/server/scripts/EasternKingdoms/GrimBatol/boss_general_umbriss.cpp b/src/server/scripts/EasternKingdoms/GrimBatol/boss_general_umbriss.cpp new file mode 100644 index 00000000000..8b5d6fd5bb1 --- /dev/null +++ b/src/server/scripts/EasternKingdoms/GrimBatol/boss_general_umbriss.cpp @@ -0,0 +1,381 @@ +/* +* 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 "Player.h" +#include "grim_batol.h" + +enum Spells +{ + // General Umbriss + SPELL_BLEEDING_WOUND = 74846, + SPELL_BLITZ_SUMMON_TRIGGER = 74668, + SPELL_BLITZ = 74670, + SPELL_GROUND_SIEGE_SUMMON_TRIGGER = 74640, + SPELL_GROUND_SIEGE = 74634, + SPELL_SUMMON_SKARDYN = 74859, + SPELL_FRENZY = 74853, + + // Troggs + SPELL_MODGUDS_MALADY = 74837, + SPELL_MODGUDS_MALICE_SPREAD = 90170, +}; + +enum Events +{ + // General Husam + EVENT_BLEEDING_WOUND = 1, + EVENT_BLITZ, + EVENT_GROUND_SIEGE, + EVENT_SUMMON_SKARDYN +}; + +enum Texts +{ + SAY_BOMBARDMENT = 0, + SAY_AGGRO = 1, + SAY_SUMMON_SKARDYN = 2, + SAY_SLAY = 3, + SAY_ANNOUNCE_BLITZ = 4, + SAY_ANNOUNCE_GROUND_SIEGE = 5, + SAY_ANNOUNCE_FRENZY = 6, +}; + +enum MovementPoints +{ + POINT_SKARDYN_SUMMON = 1 +}; + +Position const MalignantTroggSummonPosition = { -705.4689f, -485.3758f, 281.0951f, 1.265874f }; +Position const MalignantTroggMovePosition = { -691.993f, -456.1111f, 268.7674f }; + +Position const TroggDwellerSummonPositions[3] = +{ + { -723.0738f, -488.2023f, 292.2519f, 1.432476f }, + { -749.5168f, -469.0633f, 309.0818f, 0.5629198f }, + { -697.3342f, -486.9066f, 281.0173f, 1.33856f } +}; + +Position const TroggDwellerMovePositions[3] = +{ + { -718.5313f, -443.1129f, 268.7674f }, + { -729.0295f, -443.5573f, 268.7674f }, + { -693.0521f, -458.2517f, 268.7674f } +}; + +class boss_general_umbriss : public CreatureScript +{ + public: + boss_general_umbriss() : CreatureScript("boss_general_umbriss") { } + + struct boss_general_umbrissAI : public BossAI + { + boss_general_umbrissAI(Creature* creature) : BossAI(creature, DATA_GENERAL_UMBRISS) + { + Initialize(); + } + + void Reset() override + { + _Reset(); + Initialize(); + } + + void Initialize() + { + _frenzyCasted = false; + } + + void JustEngagedWith(Unit* /*who*/) override + { + _JustEngagedWith(); + Talk(SAY_AGGRO); + instance->SendEncounterUnit(ENCOUNTER_FRAME_ENGAGE, me); + events.ScheduleEvent(EVENT_SUMMON_SKARDYN, Seconds(6)); + events.ScheduleEvent(EVENT_BLEEDING_WOUND, Seconds(11)); + events.ScheduleEvent(EVENT_GROUND_SIEGE, Seconds(25) + Milliseconds(500)); + events.ScheduleEvent(EVENT_BLITZ, Seconds(16)); + } + + void KilledUnit(Unit* victim) override + { + if (victim->GetTypeId() == TYPEID_PLAYER) + Talk(SAY_SLAY); + } + + void JustDied(Unit* /*killer*/) override + { + _JustDied(); + summons.DespawnAll(); + instance->SendEncounterUnit(ENCOUNTER_FRAME_DISENGAGE, me); + } + + void EnterEvadeMode(EvadeReason /*why*/) override + { + _EnterEvadeMode(); + summons.DespawnAll(); + instance->SendEncounterUnit(ENCOUNTER_FRAME_DISENGAGE, me); + _DespawnAtEvade(); + } + + void JustSummoned(Creature* summon) override + { + summons.Summon(summon); + + switch (summon->GetEntry()) + { + case NPC_BLITZ_STALKER: + me->StopMoving(); + me->SetFacingToObject(summon); + DoCast(summon, SPELL_BLITZ); + break; + case NPC_GROUND_SIEGE_STALKER: + me->StopMoving(); + me->SetFacingToObject(summon); + DoCast(summon, SPELL_GROUND_SIEGE); + Talk(SAY_ANNOUNCE_GROUND_SIEGE); + break; + default: + break; + } + } + + void DamageTaken(Unit* /*attacker*/, uint32& /*damage*/) override + { + if (me->HealthBelowPct(30) && !_frenzyCasted && !me->HasAura(SPELL_FRENZY)) + { + _frenzyCasted = true; + DoCastSelf(SPELL_FRENZY, true); + } + } + + void SpellHit(Unit* /*caster*/, SpellInfo const* spell) override + { + if (spell->Id == SPELL_FRENZY) + Talk(SAY_ANNOUNCE_FRENZY); + } + + void UpdateAI(uint32 diff) override + { + if (!UpdateVictim()) + return; + + events.Update(diff); + + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + while (uint32 eventId = events.ExecuteEvent()) + { + switch (eventId) + { + case EVENT_BLEEDING_WOUND: + DoCastVictim(SPELL_BLEEDING_WOUND); + events.Repeat(Seconds(10) + Milliseconds(500)); + break; + case EVENT_BLITZ: + DoCastAOE(SPELL_BLITZ_SUMMON_TRIGGER, true); + events.Repeat(Seconds(23)); + break; + case EVENT_GROUND_SIEGE: + DoCastAOE(SPELL_GROUND_SIEGE_SUMMON_TRIGGER, true); + break; + case EVENT_SUMMON_SKARDYN: + Talk(SAY_SUMMON_SKARDYN); + DoCastAOE(SPELL_SUMMON_SKARDYN); // sends a event but since event_scripts does not support multiple spawns... + if (Creature* malignantTrogg = DoSummon(NPC_MALIGNANT_TROGG, MalignantTroggSummonPosition, 5000)) + malignantTrogg->GetMotionMaster()->MovePoint(POINT_SKARDYN_SUMMON, MalignantTroggMovePosition, false); + for (uint8 i = 0; i < 3; i++) + if (Creature* troggDweller = DoSummon(NPC_TROGG_DWELLER, TroggDwellerSummonPositions[i], 5000)) + troggDweller->GetMotionMaster()->MovePoint(POINT_SKARDYN_SUMMON, TroggDwellerMovePositions[i], false); + break; + default: + break; + } + } + DoMeleeAttackIfReady(); + } + private: + bool _frenzyCasted; + }; + + + CreatureAI* GetAI(Creature *creature) const override + { + return GetGrimBatolAI(creature); + } +}; + +class spell_umbriss_summon_blitz_trigger : public SpellScriptLoader +{ + public: + spell_umbriss_summon_blitz_trigger() : SpellScriptLoader("spell_umbriss_summon_blitz_trigger") { } + + class spell_umbriss_summon_blitz_trigger_SpellScript : public SpellScript + { + PrepareSpellScript(spell_umbriss_summon_blitz_trigger_SpellScript); + + void FilterTargets(std::list& targets) + { + if (targets.empty()) + return; + + Trinity::Containers::RandomResize(targets, 1); + } + + void HandleSummon(SpellEffIndex effIndex) + { + PreventHitDefaultEffect(effIndex); + + GetHitUnit()->CastSpell(GetHitUnit(), GetSpellInfo()->Effects[effIndex].TriggerSpell, true); + } + + void HandleScriptEffect(SpellEffIndex /*effIndex*/) + { + if (Creature* umbriss = GetCaster()->ToCreature()) + umbriss->AI()->Talk(SAY_ANNOUNCE_BLITZ, GetHitUnit()); + } + + void Register() override + { + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_umbriss_summon_blitz_trigger_SpellScript::FilterTargets, EFFECT_ALL, TARGET_UNIT_SRC_AREA_ENEMY); + OnEffectHitTarget += SpellEffectFn(spell_umbriss_summon_blitz_trigger_SpellScript::HandleSummon, EFFECT_0, SPELL_EFFECT_FORCE_CAST); + OnEffectHitTarget += SpellEffectFn(spell_umbriss_summon_blitz_trigger_SpellScript::HandleScriptEffect, EFFECT_1, SPELL_EFFECT_SCRIPT_EFFECT); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_umbriss_summon_blitz_trigger_SpellScript(); + } +}; + +class spell_umbriss_summon_ground_siege_trigger : public SpellScriptLoader +{ + public: + spell_umbriss_summon_ground_siege_trigger() : SpellScriptLoader("spell_umbriss_summon_ground_siege_trigger") { } + + class spell_umbriss_summon_ground_siege_trigger_SpellScript : public SpellScript + { + PrepareSpellScript(spell_umbriss_summon_ground_siege_trigger_SpellScript); + + void FilterTargets(std::list& targets) + { + if (targets.empty()) + return; + + Trinity::Containers::RandomResize(targets, 1); + } + + void HandleSummon(SpellEffIndex effIndex) + { + PreventHitDefaultEffect(effIndex); + GetHitUnit()->CastSpell(GetHitUnit(), GetSpellInfo()->Effects[effIndex].TriggerSpell, true); + } + + void Register() override + { + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_umbriss_summon_ground_siege_trigger_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY); + OnEffectHitTarget += SpellEffectFn(spell_umbriss_summon_ground_siege_trigger_SpellScript::HandleSummon, EFFECT_0, SPELL_EFFECT_FORCE_CAST); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_umbriss_summon_ground_siege_trigger_SpellScript(); + } +}; + +class spell_umbriss_bleeding_wound : public SpellScriptLoader +{ + public: + spell_umbriss_bleeding_wound() : SpellScriptLoader("spell_umbriss_bleeding_wound") { } + + class spell_umbriss_bleeding_wound_AuraScript : public AuraScript + { + PrepareAuraScript(spell_umbriss_bleeding_wound_AuraScript); + + void HandleRemoval(AuraEffect const* aurEff) + { + if (Unit* owner = GetOwner()->ToUnit()) + if (owner->GetHealthPct() >= 90.0f) + aurEff->GetBase()->Remove(); + } + + void Register() override + { + OnEffectPeriodic += AuraEffectPeriodicFn(spell_umbriss_bleeding_wound_AuraScript::HandleRemoval, EFFECT_1, SPELL_AURA_PERIODIC_DAMAGE); + } + }; + + AuraScript* GetAuraScript() const override + { + return new spell_umbriss_bleeding_wound_AuraScript(); + } +}; + +class spell_umbriss_modguds_malice : public SpellScriptLoader +{ + public: + spell_umbriss_modguds_malice() : SpellScriptLoader("spell_umbriss_modguds_malice") { } + + class spell_umbriss_modguds_malice_AuraScript : public AuraScript + { + PrepareAuraScript(spell_umbriss_modguds_malice_AuraScript); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo( + { + SPELL_MODGUDS_MALADY, + SPELL_MODGUDS_MALICE_SPREAD + }); + } + + void OnRemove(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/) + { + if (Unit* owner = GetOwner()->ToUnit()) + { + owner->CastSpell(owner, SPELL_MODGUDS_MALADY, true); + owner->CastSpell(owner, SPELL_MODGUDS_MALICE_SPREAD, true); + } + } + + void Register() override + { + AfterEffectRemove += AuraEffectApplyFn(spell_umbriss_modguds_malice_AuraScript::OnRemove, EFFECT_0, SPELL_AURA_MOD_SCALE, AURA_EFFECT_HANDLE_REAL_OR_REAPPLY_MASK); + } + }; + + AuraScript* GetAuraScript() const override + { + return new spell_umbriss_modguds_malice_AuraScript(); + } +}; + +void AddSC_boss_general_umbriss() +{ + new boss_general_umbriss(); + new spell_umbriss_summon_blitz_trigger(); + new spell_umbriss_summon_ground_siege_trigger(); + new spell_umbriss_bleeding_wound(); + new spell_umbriss_modguds_malice(); +} diff --git a/src/server/scripts/EasternKingdoms/GrimBatol/grim_batol.h b/src/server/scripts/EasternKingdoms/GrimBatol/grim_batol.h new file mode 100644 index 00000000000..f7d6bb86dce --- /dev/null +++ b/src/server/scripts/EasternKingdoms/GrimBatol/grim_batol.h @@ -0,0 +1,56 @@ +/* +* 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 . +*/ + +#ifndef GRIM_BATOL_H_ +#define GRIM_BATOL_H_ + +#define GBScriptName "instance_grim_batol" +#define DataHeader "GB" + +uint32 const EncounterCount = 5; + +enum GBDataTypes +{ + // Encounter States + DATA_GENERAL_UMBRISS = 0, + DATA_FORGEMASTER_THRONGUS = 1, + DATA_DRAHGA_SHADOWBURNER = 2, + DATA_ERUDAX = 3 +}; + +enum GBCreatureIds +{ + // Bosses + BOSS_GENERAL_UMBRISS = 39625, + BOSS_FORGEMASTER_THRONGUS = 40177, + BOSS_DRAHGA_SHADOWBURNER = 40319, + BOSS_ERUDAX = 40484, + + // General Umbriss encounter + NPC_BLITZ_STALKER = 40040, + NPC_GROUND_SIEGE_STALKER = 40030, + NPC_MALIGNANT_TROGG = 39984, + NPC_TROGG_DWELLER = 45467 +}; + +template +AI* GetGrimBatolAI(Creature* creature) +{ + return GetInstanceAI(creature, GBScriptName); +} + +#endif // GRIM_BATOL_H_ diff --git a/src/server/scripts/EasternKingdoms/GrimBatol/instance_grim_batol.cpp b/src/server/scripts/EasternKingdoms/GrimBatol/instance_grim_batol.cpp new file mode 100644 index 00000000000..767ee656ae2 --- /dev/null +++ b/src/server/scripts/EasternKingdoms/GrimBatol/instance_grim_batol.cpp @@ -0,0 +1,83 @@ +/* +* 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 "ScriptMgr.h" +#include "InstanceScript.h" +#include "grim_batol.h" + +ObjectData const creatureData[] = +{ + { BOSS_GENERAL_UMBRISS, DATA_GENERAL_UMBRISS }, + { BOSS_FORGEMASTER_THRONGUS, DATA_FORGEMASTER_THRONGUS }, + { BOSS_DRAHGA_SHADOWBURNER, DATA_DRAHGA_SHADOWBURNER }, + { BOSS_ERUDAX, DATA_ERUDAX }, + { 0, 0 } // End +}; + +class instance_grim_batol : public InstanceMapScript +{ + public: + instance_grim_batol() : InstanceMapScript(GBScriptName, 670) { } + + struct instance_grim_batol_InstanceMapScript : public InstanceScript + { + instance_grim_batol_InstanceMapScript(Map* map) : InstanceScript(map) + { + SetHeaders(DataHeader); + SetBossNumber(EncounterCount); + LoadObjectData(creatureData, nullptr); + } + + void OnCreatureCreate(Creature* creature) override + { + InstanceScript::OnCreatureCreate(creature); + + switch (creature->GetEntry()) + { + case NPC_BLITZ_STALKER: + case NPC_GROUND_SIEGE_STALKER: + if (Creature* umbriss = GetCreature(DATA_GENERAL_UMBRISS)) + umbriss->AI()->JustSummoned(creature); + break; + default: + break; + } + } + + bool SetBossState(uint32 type, EncounterState state) override + { + if (!InstanceScript::SetBossState(type, state)) + return false; + + return true; + } + + void SetData(uint32 data, uint32 value) override + { + } + }; + + InstanceScript* GetInstanceScript(InstanceMap* map) const override + { + return new instance_grim_batol_InstanceMapScript(map); + } +}; + +void AddSC_instance_grim_batol() +{ + new instance_grim_batol(); +} diff --git a/src/server/scripts/EasternKingdoms/eastern_kingdoms_script_loader.cpp b/src/server/scripts/EasternKingdoms/eastern_kingdoms_script_loader.cpp index d6f113173a4..809d8550cf1 100644 --- a/src/server/scripts/EasternKingdoms/eastern_kingdoms_script_loader.cpp +++ b/src/server/scripts/EasternKingdoms/eastern_kingdoms_script_loader.cpp @@ -73,6 +73,8 @@ void AddSC_boss_mr_smite(); void AddSC_gilneas_c1(); //Gilneas void AddSC_gnomeregan(); //Gnomeregan void AddSC_instance_gnomeregan(); +void AddSC_instance_grim_batol(); //Grim Batol +void AddSC_boss_general_umbriss(); void AddSC_boss_attumen(); //Karazhan void AddSC_boss_curator(); void AddSC_boss_maiden_of_virtue(); @@ -270,6 +272,8 @@ void AddEasternKingdomsScripts() AddSC_gilneas_c1(); //Gilneas AddSC_gnomeregan(); //Gnomeregan AddSC_instance_gnomeregan(); + AddSC_instance_grim_batol(); //Grim Batol + AddSC_boss_general_umbriss(); AddSC_boss_attumen(); //Karazhan AddSC_boss_curator(); AddSC_boss_maiden_of_virtue();