Scripts/BRC: several improvements to Raz' script

* moved several mechanics to spell script and added safechecks to Raz' escort script to reduce the chance of getting stuck midway
This commit is contained in:
Ovahlord
2021-04-27 19:43:28 +02:00
parent 344abae388
commit 56b1687714
2 changed files with 79 additions and 21 deletions

View File

@@ -0,0 +1,11 @@
DELETE FROM `spell_script_names` WHERE `ScriptName` IN
('spell_brc_furious_swipe_dummy',
'spell_brc_furious_swipe');
INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES
(80340, 'spell_brc_furious_swipe_dummy'),
(80206, 'spell_brc_furious_swipe');
DELETE FROM `spell_custom_attr` WHERE `entry`= 80206;
INSERT INTO `spell_custom_attr` (`entry`, `attributes`) VALUES
(80206, 0x4);

View File

@@ -654,29 +654,12 @@ struct npc_raz_the_crazed : public EscortAI
{
SetEscortPaused(true);
_events.ScheduleEvent(EVENT_FACE_TO_THE_SIDE, 1s);
_events.ScheduleEvent(EVENT_LEAP_FROM_BRIDGE, 2s);
_events.ScheduleEvent(EVENT_RESUME_ESCORT, 2s + 500ms);
me->DespawnOrUnsummon(12s);
}
else if (id == 1 && _instance->GetData(DATA_RAZ_LAST_AREA_INDEX) == RAZ_AREA_INDEX_CORLA)
_events.ScheduleEvent(EVENT_LEAP_OVER_BORER_PACKS, 1s);
}
void SpellHitTarget(Unit* target, SpellInfo const* spell) override
{
if (!target)
return;
if (!target->IsInCombat())
return;
if (spell->Id == SPELL_FURIOUS_SWIPE_DUMMY)
{
DoCast(target, SPELL_FURIOUS_SWIPE);
DoCastSelf(SPELL_FURIOUS_RAGE, true);
}
}
void UpdateEscortAI(uint32 diff) override
{
UpdateVictim();
@@ -691,14 +674,31 @@ struct npc_raz_the_crazed : public EscortAI
Talk(SAY_SMASH);
break;
case EVENT_START_ESCORT_PATH:
me->SetHomePosition(me->GetPosition());
Start(true, true);
if (!me->IsEngaged())
{
me->SetHomePosition(me->GetPosition());
Start(true, true);
}
else
_events.Repeat(1s);
break;
case EVENT_FACE_TO_THE_SIDE:
me->SetFacingTo(5.061455f);
if (!me->IsEngaged())
{
me->SetFacingTo(5.061455f);
_events.ScheduleEvent(EVENT_LEAP_FROM_BRIDGE, 1s);
}
else
_events.Repeat(1s);
break;
case EVENT_LEAP_FROM_BRIDGE:
DoCastSelf(SPELL_LEAP_FROM_BRIDGE);
if (!me->IsEngaged())
{
DoCastSelf(SPELL_LEAP_FROM_BRIDGE);
_events.ScheduleEvent(EVENT_RESUME_ESCORT, 500ms);
}
else
_events.Repeat(1s);
break;
case EVENT_RESUME_ESCORT:
SetEscortPaused(false);
@@ -722,6 +722,8 @@ struct npc_raz_the_crazed : public EscortAI
default:
break;
}
if (me->HasUnitState(UNIT_STATE_CASTING))
return;
}
}
@@ -730,6 +732,49 @@ private:
InstanceScript* _instance;
};
class spell_brc_furious_swipe_dummy : public SpellScript
{
bool Validate(SpellInfo const* /*spellInfo*/) override
{
return ValidateSpellInfo({ SPELL_FURIOUS_SWIPE });
}
void HandleDummyEffect(SpellEffIndex /*effIndex*/)
{
if (Unit* caster = GetCaster())
{
caster->SetFacingTo(caster->GetAngle(GetHitUnit()));
caster->CastSpell(GetHitUnit(), SPELL_FURIOUS_SWIPE);
if (caster->GetMap()->IsHeroic()) // Heroic difficulty casts the spell twice in a row
caster->CastSpell(GetHitUnit(), SPELL_FURIOUS_SWIPE);
}
}
void Register() override
{
OnEffectHitTarget.Register(&spell_brc_furious_swipe_dummy::HandleDummyEffect, EFFECT_0, SPELL_EFFECT_DUMMY);
}
};
class spell_brc_furious_swipe : public SpellScript
{
bool Validate(SpellInfo const* /*spellInfo*/) override
{
return ValidateSpellInfo({ SPELL_FURIOUS_RAGE });
}
void HandleScriptEffect(SpellEffIndex /*effIndex*/)
{
if (Unit* caster = GetCaster())
caster->CastSpell(GetHitUnit(), SPELL_FURIOUS_RAGE);
}
void Register() override
{
OnEffectHitTarget.Register(&spell_brc_furious_swipe::HandleScriptEffect, EFFECT_1, SPELL_EFFECT_SCRIPT_EFFECT);
}
};
class at_raz_corla_event : public AreaTriggerScript
{
public:
@@ -805,6 +850,8 @@ void AddSC_blackrock_caverns()
RegisterBlackrockCavernsCreatureAI(npc_mad_prisoner);
RegisterBlackrockCavernsCreatureAI(npc_crazed_mage);
RegisterBlackrockCavernsCreatureAI(npc_raz_the_crazed);
RegisterSpellScript(spell_brc_furious_swipe_dummy);
RegisterSpellScript(spell_brc_furious_swipe);
new at_raz_corla_event();
new at_raz_obsidius_event();
new at_brc_quest_trigger("at_brc_corla_quest", QUEST_ID_WHAT_IS_THIS_PLACE);