aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAfgann <Marcin60000@gmail.com>2017-02-10 01:07:29 +0100
committerShauren <shauren.trinity@gmail.com>2019-06-15 18:41:09 +0200
commitafade22ffb4669c9eb7ed6df0231adfc9b98d18d (patch)
treef9e363b478fd5a11ef19b94f88748838931e036e
parentbe87c0e8b846c60e53f450fa92d0b7fed9e647d3 (diff)
Core/Scripts: Moorabi encounter updated. (#19013)
(cherrypicked from 21b5a377e49b4c0bb7d3fa53451046af1192af4a)
-rw-r--r--sql/updates/world/master/2019_06_15_10_world_2017_02_09_00_world.sql7
-rw-r--r--src/server/scripts/Northrend/Gundrak/boss_moorabi.cpp185
2 files changed, 133 insertions, 59 deletions
diff --git a/sql/updates/world/master/2019_06_15_10_world_2017_02_09_00_world.sql b/sql/updates/world/master/2019_06_15_10_world_2017_02_09_00_world.sql
new file mode 100644
index 00000000000..bb5fb921898
--- /dev/null
+++ b/sql/updates/world/master/2019_06_15_10_world_2017_02_09_00_world.sql
@@ -0,0 +1,7 @@
+-- Phantom Mammoth
+DELETE FROM `creature` WHERE `guid`=127005; -- shouldn't stand all the time
+UPDATE `creature_template` SET `flags_extra` = `flags_extra`&0x2 WHERE `entry`=29748; -- set visible to players
+-- Mojo Frenzy
+DELETE FROM `spell_script_names` WHERE `ScriptName` = "spell_moorabi_mojo_frenzy";
+INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES
+(55163, "spell_moorabi_mojo_frenzy");
diff --git a/src/server/scripts/Northrend/Gundrak/boss_moorabi.cpp b/src/server/scripts/Northrend/Gundrak/boss_moorabi.cpp
index 5bae1c9d712..cd30df85748 100644
--- a/src/server/scripts/Northrend/Gundrak/boss_moorabi.cpp
+++ b/src/server/scripts/Northrend/Gundrak/boss_moorabi.cpp
@@ -20,43 +20,51 @@
#include "ScriptedCreature.h"
#include "SpellInfo.h"
-/// @todo: implement mojo frenzy
-
enum Spells
{
- SPELL_DETERMINED_GORE = 55102,
- SPELL_DETERMINED_STAB = 55104,
- SPELL_GROUND_TREMOR = 55142,
- SPELL_NUMBING_SHOUT = 55106,
- SPELL_QUAKE = 55101,
- SPELL_NUMBING_ROAR = 55100,
- SPELL_MOJO_FRENZY = 55163,
- SPELL_TRANSFORMATION = 55098, // Periodic, The caster transforms into a powerful mammoth, increasing Physical damage done by 25% and granting immunity to Stun effects.
+ SPELL_SUMMON_PHANTOM = 55205,
+ SPELL_SUMMON_PHANTOM_TRANSFORM = 55097,
+ SPELL_DETERMINED_GORE = 55102,
+ SPELL_DETERMINED_STAB = 55104,
+ SPELL_GROUND_TREMOR = 55142,
+ SPELL_NUMBING_SHOUT = 55106,
+ SPELL_QUAKE = 55101,
+ SPELL_NUMBING_ROAR = 55100,
+ SPELL_MOJO_FRENZY = 55163,
+ SPELL_MOJO_FRENZY_CAST_SPEED = 55096,
+ SPELL_TRANSFORMATION = 55098 // Periodic, The caster transforms into a powerful mammoth, increasing Physical damage done by 25% and granting immunity to Stun effects.
};
enum Says
{
- SAY_AGGRO = 0,
- SAY_SLAY = 1,
- SAY_DEATH = 2,
- SAY_TRANSFORM = 3,
- SAY_QUAKE = 4,
- EMOTE_BEGIN_TRANSFORM = 5,
- EMOTE_TRANSFORMED = 6,
- EMOTE_ACTIVATE_ALTAR = 7
+ SAY_AGGRO = 0,
+ SAY_SLAY = 1,
+ SAY_DEATH = 2,
+ SAY_TRANSFORM = 3,
+ SAY_QUAKE = 4,
+ EMOTE_BEGIN_TRANSFORM = 5,
+ EMOTE_TRANSFORMED = 6,
+ EMOTE_ACTIVATE_ALTAR = 7
};
enum Events
{
- EVENT_GROUND_TREMOR = 1,
+ EVENT_GROUND_TREMOR = 1,
EVENT_NUMBLING_SHOUT,
EVENT_DETERMINED_STAB,
- EVENT_TRANFORMATION
+ EVENT_TRANFORMATION,
+ EVENT_PHANTOM
};
enum Misc
{
- DATA_LESS_RABI = 1
+ DATA_LESS_RABI = 1
+};
+
+enum Phases
+{
+ PHASE_INTRO = 1,
+ PHASE_COMBAT
};
class boss_moorabi : public CreatureScript
@@ -78,22 +86,32 @@ class boss_moorabi : public CreatureScript
void Reset() override
{
- Initialize();
_Reset();
+ Initialize();
+ events.SetPhase(PHASE_INTRO);
+ events.ScheduleEvent(EVENT_PHANTOM, Seconds(21), 0, PHASE_INTRO);
}
void EnterCombat(Unit* /*who*/) override
{
_EnterCombat();
Talk(SAY_AGGRO);
- DoCast(me, SPELL_MOJO_FRENZY, true);
+ DoCastSelf(SPELL_MOJO_FRENZY, true);
- events.ScheduleEvent(EVENT_GROUND_TREMOR, 18 * IN_MILLISECONDS);
- events.ScheduleEvent(EVENT_NUMBLING_SHOUT, 10 * IN_MILLISECONDS);
- events.ScheduleEvent(EVENT_DETERMINED_STAB, 20 * IN_MILLISECONDS);
- events.ScheduleEvent(EVENT_TRANFORMATION, 12 * IN_MILLISECONDS);
+ events.SetPhase(PHASE_COMBAT);
+ events.ScheduleEvent(EVENT_GROUND_TREMOR, Seconds(18), 0, PHASE_COMBAT);
+ events.ScheduleEvent(EVENT_NUMBLING_SHOUT, Seconds(10), 0, PHASE_COMBAT);
+ events.ScheduleEvent(EVENT_DETERMINED_STAB, Seconds(20), 0, PHASE_COMBAT);
+ events.ScheduleEvent(EVENT_TRANFORMATION, Seconds(12), 0, PHASE_COMBAT);
}
+ void EnterEvadeMode(EvadeReason /*why*/) override
+ {
+ _DespawnAtEvade();
+ }
+
+ void JustSummoned(Creature* /*summon*/) override {}
+
uint32 GetData(uint32 type) const override
{
if (type == DATA_LESS_RABI)
@@ -125,41 +143,53 @@ class boss_moorabi : public CreatureScript
}
}
- void ExecuteEvent(uint32 eventId) override
+ void UpdateAI(uint32 diff) override
{
- switch (eventId)
+ if (!UpdateVictim() && !events.IsInPhase(PHASE_INTRO))
+ return;
+
+ events.Update(diff);
+ if (me->HasUnitState(UNIT_STATE_CASTING))
+ return;
+
+ while (uint32 eventId = events.ExecuteEvent())
{
- case EVENT_GROUND_TREMOR:
- Talk(SAY_QUAKE);
- if (_transformed)
- DoCastAOE(SPELL_QUAKE);
- else
- DoCastAOE(SPELL_GROUND_TREMOR);
- events.ScheduleEvent(eventId, 10 * IN_MILLISECONDS);
- break;
- case EVENT_NUMBLING_SHOUT:
- if (_transformed)
- DoCastAOE(SPELL_NUMBING_ROAR);
- else
- DoCastAOE(SPELL_NUMBING_SHOUT);
- events.ScheduleEvent(eventId, 10 * IN_MILLISECONDS);
- break;
- case EVENT_DETERMINED_STAB:
- if (_transformed)
- DoCastVictim(SPELL_DETERMINED_GORE);
- else
- DoCastVictim(SPELL_DETERMINED_STAB);
- events.ScheduleEvent(eventId, 8 * IN_MILLISECONDS);
- break;
- case EVENT_TRANFORMATION:
- Talk(EMOTE_BEGIN_TRANSFORM);
- Talk(SAY_TRANSFORM);
- DoCast(me, SPELL_TRANSFORMATION);
- events.ScheduleEvent(eventId, 10 * IN_MILLISECONDS);
- break;
- default:
- break;
+ switch (eventId)
+ {
+ case EVENT_GROUND_TREMOR:
+ if (roll_chance_i(50))
+ Talk(SAY_QUAKE);
+ DoCastAOE(_transformed ? SPELL_QUAKE : SPELL_GROUND_TREMOR);
+ events.Repeat(Seconds(10));
+ break;
+ case EVENT_NUMBLING_SHOUT:
+ DoCastAOE(_transformed ? SPELL_NUMBING_ROAR : SPELL_NUMBING_SHOUT);
+ events.Repeat(Seconds(10));
+ break;
+ case EVENT_DETERMINED_STAB:
+ DoCastAOE(_transformed ? SPELL_DETERMINED_GORE : SPELL_DETERMINED_STAB);
+ events.Repeat(Seconds(8));
+ break;
+ case EVENT_TRANFORMATION:
+ Talk(EMOTE_BEGIN_TRANSFORM);
+ Talk(SAY_TRANSFORM);
+ DoCastSelf(SPELL_TRANSFORMATION);
+ DoCastSelf(SPELL_SUMMON_PHANTOM_TRANSFORM, true);
+ events.Repeat(Seconds(10));
+ break;
+ case EVENT_PHANTOM:
+ DoCastSelf(SPELL_SUMMON_PHANTOM, true);
+ events.Repeat(Seconds(20), Seconds(25));
+ break;
+ default:
+ break;
+ }
+
+ if(me->HasUnitState(UNIT_STATE_CASTING))
+ return;
}
+
+ DoMeleeAttackIfReady();
}
private:
@@ -190,8 +220,45 @@ class achievement_less_rabi : public AchievementCriteriaScript
}
};
+// 55163 - Mojo Frenzy
+class spell_moorabi_mojo_frenzy : public SpellScriptLoader
+{
+ public:
+ spell_moorabi_mojo_frenzy() : SpellScriptLoader("spell_moorabi_mojo_frenzy") { }
+
+ class spell_moorabi_mojo_frenzy_AuraScript : public AuraScript
+ {
+ PrepareAuraScript(spell_moorabi_mojo_frenzy_AuraScript);
+
+ bool Validate(SpellInfo const* /*spell*/) override
+ {
+ return ValidateSpellInfo({ SPELL_MOJO_FRENZY_CAST_SPEED });
+ }
+
+ void HandlePeriodic(AuraEffect const* /*aurEff*/)
+ {
+ PreventDefaultAction();
+
+ Unit* owner = GetUnitOwner();
+ int32 castSpeedBonus = (100.0f - owner->GetHealthPct()) * 4; // between 0% and 400% cast speed bonus
+ owner->CastCustomSpell(SPELL_MOJO_FRENZY_CAST_SPEED, SPELLVALUE_BASE_POINT0, castSpeedBonus, owner, true);
+ }
+
+ void Register() override
+ {
+ OnEffectPeriodic += AuraEffectPeriodicFn(spell_moorabi_mojo_frenzy_AuraScript::HandlePeriodic, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY);
+ }
+ };
+
+ AuraScript* GetAuraScript() const override
+ {
+ return new spell_moorabi_mojo_frenzy_AuraScript();
+ }
+};
+
void AddSC_boss_moorabi()
{
new boss_moorabi();
new achievement_less_rabi();
+ new spell_moorabi_mojo_frenzy();
}