eluna-scripts-ornfelt/lua/WowEmulationScriptPack/C++/CustomBossFalric/CustomBossFalric.cpp

169 lines
5.8 KiB
C++
Raw Permalink Normal View History

2023-08-16 00:50:59 +02:00
#include "ScriptMgr.h"
#include "SpellMgr.h"
#include "ScriptedCreature.h"
enum Texts
{
SAY_AGGRO = 0,
SAY_SLAY = 1,
SAY_DEATH = 2,
SAY_IMPENDING_DESPAIR = 3,
SAY_DEFILING_HORROR = 4,
SAY_SHADOW_NOVA = 5,
SAY_DECIMATE = 6,
SAY_ZOMBIES = 7,
SAY_PLAGUED_ZOMBIES = 8
};
enum Spells
{
SPELL_QUIVERING_STRIKE = 72422, //attack
SPELL_IMPENDING_DESPAIR = 72426, //stun
SPELL_DEFILING_HORROR = 72435, //bun fear
SPELL_HOPELESSNESS_1 = 72395, //bun curse
SPELL_HOPELESSNESS_2 = 72396, //bun curse
SPELL_HOPELESSNESS_3 = 72397, //bun curse
SPELL_SHADOW_NOVA = 36127, //boom nasol trebuie rar
SPELL_DECIMATE = 71123, //15% hp down
SPELL_AWAKEN_PLAGUED_ZOMBIES = 71159 //spawn Zombies
};
enum Events
{
EVENT_NONE,
EVENT_QUIVERING_STRIKE,
EVENT_IMPENDING_DESPAIR,
EVENT_DEFILING_HORROR,
EVENT_VOID_ZONE,
EVENT_SHADOW_NOVA,
EVENT_SUMMON_ZOMBIES
};
uint32 const HopelessnessHelper[3] = { SPELL_HOPELESSNESS_1, SPELL_HOPELESSNESS_2, SPELL_HOPELESSNESS_3 };
#define FALRIC_BOSS_ID 123411
//Zombalau - will rename later :)
class CustomBossFalric : public CreatureScript
{
public:
CustomBossFalric() : CreatureScript("CustomBossFalric") { }
struct boss_falricAI : public BossAI
{
boss_falricAI(Creature* creature) : BossAI(creature, FALRIC_BOSS_ID)
{
Initialize();
}
void Initialize()
{
_hopelessnessCount = 0;
}
void Reset() override
{
BossAI::Reset();
Initialize();
}
void JustEngagedWith(Unit* /*who*/) override
{
Talk(SAY_AGGRO);
events.ScheduleEvent(EVENT_QUIVERING_STRIKE, 9000);
events.ScheduleEvent(EVENT_IMPENDING_DESPAIR, 15000);
events.ScheduleEvent(EVENT_DEFILING_HORROR, 90000);
events.ScheduleEvent(EVENT_SHADOW_NOVA, 120000);
events.ScheduleEvent(EVENT_SUMMON_ZOMBIES, urand(20000, 22000));
}
void DoAction(int32 action) override
{
}
void DamageTaken(Unit* /*attacker*/, uint32& damage) override
{
if ((_hopelessnessCount < 1 && me->HealthBelowPctDamaged(66, damage))
|| (_hopelessnessCount < 2 && me->HealthBelowPctDamaged(33, damage))
|| (_hopelessnessCount < 3 && me->HealthBelowPctDamaged(10, damage)))
{
if (_hopelessnessCount)
me->RemoveOwnedAura(sSpellMgr->GetSpellIdForDifficulty(HopelessnessHelper[_hopelessnessCount - 1], me));
DoCast(me, HopelessnessHelper[_hopelessnessCount]);
++_hopelessnessCount;
}
}
void JustDied(Unit* /*killer*/) override
{
Talk(SAY_DEATH);
events.Reset();
}
void KilledUnit(Unit* who) override
{
if (who->GetTypeId() == TYPEID_PLAYER)
Talk(SAY_SLAY);
}
void UpdateAI(uint32 diff) override
{
if (!UpdateVictim())
return;
events.Update(diff);
if (me->HasUnitState(UNIT_STATE_CASTING))
return;
switch (events.ExecuteEvent())
{
case EVENT_QUIVERING_STRIKE:
DoCastVictim(SPELL_QUIVERING_STRIKE);
events.ScheduleEvent(EVENT_QUIVERING_STRIKE, 9000);
break;
case EVENT_IMPENDING_DESPAIR:
if (Unit* target = SelectTarget(SELECT_TARGET_MAXTHREAT, 0, 45.0f, true))
{
Talk(SAY_IMPENDING_DESPAIR);
DoCast(target, SPELL_IMPENDING_DESPAIR);
}
events.ScheduleEvent(EVENT_IMPENDING_DESPAIR, 15000);
break;
case EVENT_DEFILING_HORROR:
DoCastAOE(SPELL_DEFILING_HORROR);
events.ScheduleEvent(EVENT_DEFILING_HORROR, 90000);
break;
case EVENT_SHADOW_NOVA:
DoCastVictim(SPELL_SHADOW_NOVA, true);
Talk(SAY_SHADOW_NOVA);
events.ScheduleEvent(EVENT_SHADOW_NOVA, 120000);
break;
case EVENT_SUMMON_ZOMBIES:
Talk(SAY_PLAGUED_ZOMBIES);
for (uint32 i = 0; i < 7; ++i)
DoCast(me, SPELL_AWAKEN_PLAGUED_ZOMBIES, false);
events.ScheduleEvent(EVENT_SUMMON_ZOMBIES, urand(60000, 120000));
break;
default:
break;
}
DoMeleeAttackIfReady();
}
private:
uint8 _hopelessnessCount;
};
CreatureAI* GetAI(Creature* creature) const override
{
return new boss_falricAI(creature);
}
};
void AddCustomBossFalricScripts()
{
new CustomBossFalric();
}