fix(Scripts/GruulsLair): Fixed Ground Slam. (#14780)

Co-authored-by: Kitzunu <24550914+Kitzunu@users.noreply.github.com>
This commit is contained in:
UltraNix
2023-02-12 14:14:15 +01:00
committed by GitHub
parent 7e07a31f26
commit 3d9a55996d
2 changed files with 230 additions and 193 deletions
@@ -0,0 +1,8 @@
--
DELETE FROM `spell_script_names` WHERE `spell_id`=33496;
INSERT INTO `spell_script_names` VALUES
(33496,'spell_tractor_beam_creator');
UPDATE `spell_dbc` SET `Effect_1`=28, `EffectMiscValueB_1`=64 WHERE `ID` IN (33495,33514,33515,33516,33517,33518,33519,33520);
UPDATE `creature_template` SET `ScriptName`='npc_invisible_tractor_beam_source' WHERE `entry`=19198;
@@ -19,6 +19,7 @@
#include "ScriptedCreature.h"
#include "SpellScript.h"
#include "gruuls_lair.h"
#include "PassiveAI.h"
enum Yells
{
@@ -39,6 +40,19 @@ enum Spells
SPELL_REVERBERATION = 36297,
SPELL_HURTFUL_STRIKE = 33813,
SPELL_SHATTER = 33654,
SPELL_LOOK_AROUND = 33965,
// Ground Slam spells
SPELL_SUMMON_TRACTOR_BEAM_CREATOR = 33496,
SPELL_TRACTOR_BEAM_PULL = 33497,
SPELL_SUMMON_TRACTOR_BEAM_1 = 33495,
SPELL_SUMMON_TRACTOR_BEAM_2 = 33514,
SPELL_SUMMON_TRACTOR_BEAM_3 = 33515,
SPELL_SUMMON_TRACTOR_BEAM_4 = 33516,
SPELL_SUMMON_TRACTOR_BEAM_5 = 33517,
SPELL_SUMMON_TRACTOR_BEAM_6 = 33518,
SPELL_SUMMON_TRACTOR_BEAM_7 = 33519,
SPELL_SUMMON_TRACTOR_BEAM_8 = 33520,
SPELL_SHATTER_EFFECT = 33671,
SPELL_STONED = 33652,
@@ -55,14 +69,9 @@ enum Events
EVENT_RECENTLY_SPOKEN = 7
};
class boss_gruul : public CreatureScript
struct boss_gruul : public BossAI
{
public:
boss_gruul() : CreatureScript("boss_gruul") { }
struct boss_gruulAI : public BossAI
{
boss_gruulAI(Creature* creature) : BossAI(creature, DATA_GRUUL) { }
boss_gruul(Creature* creature) : BossAI(creature, DATA_GRUUL) { }
void Reset() override
{
@@ -141,11 +150,10 @@ public:
events.DelayEvents(8001);
events.ScheduleEvent(EVENT_GROUND_SLAM, 60000);
events.ScheduleEvent(EVENT_SHATTER, 8000);
me->SetControlled(true, UNIT_STATE_ROOT);
break;
case EVENT_SHATTER:
Talk(SAY_SHATTER);
me->SetControlled(false, UNIT_STATE_ROOT);
me->RemoveAurasDueToSpell(SPELL_LOOK_AROUND);
me->CastSpell(me, SPELL_SHATTER, false);
break;
}
@@ -160,74 +168,103 @@ public:
uint32 _caveInTimer;
};
CreatureAI* GetAI(Creature* creature) const override
struct npc_invisible_tractor_beam_source : public NullCreatureAI
{
return GetGruulsLairAI<boss_gruulAI>(creature);
npc_invisible_tractor_beam_source(Creature* creature) : NullCreatureAI(creature) { }
void IsSummonedBy(WorldObject* summoner) override
{
if (Unit* summonerUnit = summoner->ToUnit())
{
DoCast(summonerUnit, SPELL_TRACTOR_BEAM_PULL, true);
}
}
};
class spell_gruul_ground_slam : public SpellScriptLoader
class spell_gruul_ground_slam : public SpellScript
{
public:
spell_gruul_ground_slam() : SpellScriptLoader("spell_gruul_ground_slam") { }
PrepareSpellScript(spell_gruul_ground_slam);
class spell_gruul_ground_slam_SpellScript : public SpellScript
bool Validate(SpellInfo const* /*spellInfo*/) override
{
PrepareSpellScript(spell_gruul_ground_slam_SpellScript);
return ValidateSpellInfo({ SPELL_SUMMON_TRACTOR_BEAM_CREATOR });
}
void ApplyStun()
{
if (Unit* caster = GetCaster())
{
caster->CastSpell(caster, SPELL_LOOK_AROUND, true);
}
}
void HandleScriptEffect(SpellEffIndex /*effIndex*/)
{
if (Unit* target = GetHitUnit())
target->KnockbackFrom(GetCaster()->GetPositionX(), GetCaster()->GetPositionY(), 15.0f, 15.0f);
{
target->CastSpell(target, SPELL_SUMMON_TRACTOR_BEAM_CREATOR, true);
}
}
void Register() override
{
OnEffectHitTarget += SpellEffectFn(spell_gruul_ground_slam_SpellScript::HandleScriptEffect, EFFECT_1, SPELL_EFFECT_SCRIPT_EFFECT);
AfterCast += SpellCastFn(spell_gruul_ground_slam::ApplyStun);
OnEffectHitTarget += SpellEffectFn(spell_gruul_ground_slam::HandleScriptEffect, EFFECT_1, SPELL_EFFECT_SCRIPT_EFFECT);
}
};
SpellScript* GetSpellScript() const override
class spell_tractor_beam_creator : public SpellScript
{
return new spell_gruul_ground_slam_SpellScript();
PrepareSpellScript(spell_tractor_beam_creator);
void HandleScriptEffect(SpellEffIndex /*effIndex*/)
{
if (Unit* caster = GetCaster())
{
std::vector<uint32> tractorBeamSummons = { SPELL_SUMMON_TRACTOR_BEAM_1, SPELL_SUMMON_TRACTOR_BEAM_2, SPELL_SUMMON_TRACTOR_BEAM_3, SPELL_SUMMON_TRACTOR_BEAM_4,
SPELL_SUMMON_TRACTOR_BEAM_5, SPELL_SUMMON_TRACTOR_BEAM_6, SPELL_SUMMON_TRACTOR_BEAM_7, SPELL_SUMMON_TRACTOR_BEAM_8 };
uint32 randomTractorSpellID = Acore::Containers::SelectRandomContainerElement(tractorBeamSummons);
caster->CastSpell(caster, randomTractorSpellID, true);
}
}
void Register() override
{
OnEffectHitTarget += SpellEffectFn(spell_tractor_beam_creator::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
}
};
class spell_gruul_ground_slam_trigger : public SpellScriptLoader
class spell_gruul_ground_slam_trigger : public AuraScript
{
public:
spell_gruul_ground_slam_trigger() : SpellScriptLoader("spell_gruul_ground_slam_trigger") { }
PrepareAuraScript(spell_gruul_ground_slam_trigger);
class spell_gruul_ground_slam_trigger_AuraScript : public AuraScript
bool Validate(SpellInfo const* /*spellInfo*/) override
{
PrepareAuraScript(spell_gruul_ground_slam_trigger_AuraScript);
return ValidateSpellInfo({ SPELL_STONED });
}
void OnApply(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/)
{
if (GetUnitOwner()->GetAuraCount(GetSpellInfo()->Effects[aurEff->GetEffIndex()].TriggerSpell) == 5)
{
GetUnitOwner()->CastSpell(GetUnitOwner(), SPELL_STONED, true);
}
}
void Register() override
{
AfterEffectRemove += AuraEffectRemoveFn(spell_gruul_ground_slam_trigger_AuraScript::OnApply, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL, AURA_EFFECT_HANDLE_REAL);
AfterEffectRemove += AuraEffectRemoveFn(spell_gruul_ground_slam_trigger::OnApply, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL, AURA_EFFECT_HANDLE_REAL);
}
};
AuraScript* GetAuraScript() const override
class spell_gruul_shatter : public SpellScript
{
return new spell_gruul_ground_slam_trigger_AuraScript();
PrepareSpellScript(spell_gruul_shatter);
bool Validate(SpellInfo const* /*spellInfo*/) override
{
return ValidateSpellInfo({ SPELL_SHATTER_EFFECT });
}
};
class spell_gruul_shatter : public SpellScriptLoader
{
public:
spell_gruul_shatter() : SpellScriptLoader("spell_gruul_shatter") { }
class spell_gruul_shatter_SpellScript : public SpellScript
{
PrepareSpellScript(spell_gruul_shatter_SpellScript);
void HandleScriptEffect(SpellEffIndex /*effIndex*/)
{
@@ -240,56 +277,48 @@ public:
void Register() override
{
OnEffectHitTarget += SpellEffectFn(spell_gruul_shatter_SpellScript::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
OnEffectHitTarget += SpellEffectFn(spell_gruul_shatter::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
}
};
SpellScript* GetSpellScript() const override
class spell_gruul_shatter_effect : public SpellScript
{
return new spell_gruul_shatter_SpellScript();
}
};
class spell_gruul_shatter_effect : public SpellScriptLoader
{
public:
spell_gruul_shatter_effect() : SpellScriptLoader("spell_gruul_shatter_effect") { }
class spell_gruul_shatter_effect_SpellScript : public SpellScript
{
PrepareSpellScript(spell_gruul_shatter_effect_SpellScript);
PrepareSpellScript(spell_gruul_shatter_effect);
void CalculateDamage()
{
if (!GetHitUnit())
{
return;
}
float radius = GetSpellInfo()->Effects[EFFECT_0].CalcRadius(GetCaster());
if (!radius)
{
return;
}
float distance = GetCaster()->GetDistance2d(GetHitUnit());
if (distance > 1.0f)
{
SetHitDamage(int32(GetHitDamage() * ((radius - distance) / radius)));
}
}
void Register() override
{
OnHit += SpellHitFn(spell_gruul_shatter_effect_SpellScript::CalculateDamage);
}
};
SpellScript* GetSpellScript() const override
{
return new spell_gruul_shatter_effect_SpellScript();
OnHit += SpellHitFn(spell_gruul_shatter_effect::CalculateDamage);
}
};
void AddSC_boss_gruul()
{
new boss_gruul();
new spell_gruul_ground_slam();
new spell_gruul_ground_slam_trigger();
new spell_gruul_shatter();
new spell_gruul_shatter_effect();
RegisterGruulsLairAI(boss_gruul);
RegisterGruulsLairAI(npc_invisible_tractor_beam_source);
RegisterSpellScript(spell_gruul_ground_slam);
RegisterSpellScript(spell_tractor_beam_creator);
RegisterSpellScript(spell_gruul_ground_slam_trigger);
RegisterSpellScript(spell_gruul_shatter);
RegisterSpellScript(spell_gruul_shatter_effect);
}