fix(Core/RuinsOfAhnQiraj): Kurinnaxx (#12522)

This commit is contained in:
Nefertumm
2022-07-24 17:59:03 -03:00
committed by GitHub
parent d859b12c1d
commit 577ae14b25
4 changed files with 121 additions and 85 deletions
@@ -0,0 +1,4 @@
--
UPDATE `gameobject_template` SET `ScriptName` = 'go_sand_trap' WHERE `entry` = 180647;
UPDATE `creature_text` SET `TextRange` = 3 WHERE `CreatureID` = 15339 AND `GroupID` = 5;
@@ -16,14 +16,16 @@
*/ */
#include "CreatureTextMgr.h" #include "CreatureTextMgr.h"
#include "GameObjectAI.h"
#include "ScriptMgr.h" #include "ScriptMgr.h"
#include "ScriptedCreature.h" #include "ScriptedCreature.h"
#include "TaskScheduler.h"
#include "ruins_of_ahnqiraj.h" #include "ruins_of_ahnqiraj.h"
enum Spells enum Spells
{ {
SPELL_MORTALWOUND = 25646, SPELL_MORTAL_WOUND = 25646,
SPELL_SANDTRAP = 25648, SPELL_SAND_TRAP = 25648,
SPELL_ENRAGE = 26527, SPELL_ENRAGE = 26527,
SPELL_SUMMON_PLAYER = 26446, SPELL_SUMMON_PLAYER = 26446,
SPELL_WIDE_SLASH = 25814 SPELL_WIDE_SLASH = 25814
@@ -32,97 +34,116 @@ enum Spells
enum Events enum Events
{ {
EVENT_MORTAL_WOUND = 1, EVENT_MORTAL_WOUND = 1,
EVENT_SANDTRAP = 2, EVENT_SAND_TRAP = 2,
EVENT_WIDE_SLASH = 3 EVENT_WIDE_SLASH = 3
}; };
enum Texts enum Texts
{ {
SAY_KURINAXX_DEATH = 5 // Yell by 'Ossirian the Unscarred' SAY_KURINNAXX_DEATH = 5 // Yell by 'Ossirian the Unscarred'
}; };
class boss_kurinnaxx : public CreatureScript struct boss_kurinnaxx : public BossAI
{ {
public: boss_kurinnaxx(Creature* creature) : BossAI(creature, DATA_KURINNAXX) {}
boss_kurinnaxx() : CreatureScript("boss_kurinnaxx") { }
struct boss_kurinnaxxAI : public BossAI void Reset() override
{ {
boss_kurinnaxxAI(Creature* creature) : BossAI(creature, DATA_KURINNAXX) {} BossAI::Reset();
_enraged = false;
void Reset() override events.ScheduleEvent(EVENT_MORTAL_WOUND, 8s, 10s);
{ events.ScheduleEvent(EVENT_SAND_TRAP, 5s, 15s);
_Reset(); events.ScheduleEvent(EVENT_WIDE_SLASH, 10s, 15s);
_enraged = false;
events.ScheduleEvent(EVENT_MORTAL_WOUND, urand(8000, 10000));
events.ScheduleEvent(EVENT_SANDTRAP, urand(5000, 15000));
events.ScheduleEvent(EVENT_WIDE_SLASH, urand(10000, 15000));
}
void DamageTaken(Unit*, uint32& /*damage*/, DamageEffectType, SpellSchoolMask) override
{
if (!_enraged && HealthBelowPct(30))
{
DoCastSelf(SPELL_ENRAGE);
_enraged = true;
}
}
void JustDied(Unit* /*killer*/) override
{
_JustDied();
if (Creature* Ossirian = me->GetMap()->GetCreature(instance->GetGuidData(DATA_OSSIRIAN)))
{
sCreatureTextMgr->SendChat(Ossirian, SAY_KURINAXX_DEATH, nullptr, CHAT_MSG_ADDON, LANG_ADDON, TEXT_RANGE_ZONE);
}
}
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_MORTAL_WOUND:
DoCastVictim(SPELL_MORTALWOUND);
events.ScheduleEvent(EVENT_MORTAL_WOUND, urand(8000, 10000));
break;
case EVENT_SANDTRAP:
if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 100, true))
{
target->CastSpell(target, SPELL_SANDTRAP, true);
}
events.ScheduleEvent(EVENT_SANDTRAP, urand(5000, 15000));
break;
case EVENT_WIDE_SLASH:
DoCastSelf(SPELL_WIDE_SLASH);
events.ScheduleEvent(EVENT_WIDE_SLASH, urand(12000, 15000));
break;
default:
break;
}
}
DoMeleeAttackIfReady();
}
private:
bool _enraged;
};
CreatureAI* GetAI(Creature* creature) const override
{
return GetRuinsOfAhnQirajAI<boss_kurinnaxxAI>(creature);
} }
void DamageTaken(Unit*, uint32& /*damage*/, DamageEffectType, SpellSchoolMask) override
{
if (!_enraged && HealthBelowPct(30))
{
DoCastSelf(SPELL_ENRAGE);
_enraged = true;
}
}
void JustDied(Unit* killer) override
{
if (killer)
killer->GetMap()->LoadGrid(-9502.80f, 2042.65f); // Ossirian grid
if (Creature* ossirian = instance->GetCreature(DATA_OSSIRIAN))
{
ossirian->setActive(true);
if (ossirian->GetAI())
ossirian->AI()->Talk(SAY_KURINNAXX_DEATH);
}
BossAI::JustDied(killer);
}
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_MORTAL_WOUND:
DoCastVictim(SPELL_MORTAL_WOUND);
events.ScheduleEvent(EVENT_MORTAL_WOUND, 8s, 10s);
break;
case EVENT_SAND_TRAP:
if (Unit* target = SelectTarget(SelectTargetMethod::Random, 1, 100.f, true))
{
target->CastSpell(target, SPELL_SAND_TRAP, true, nullptr, nullptr, me->GetGUID());
}
events.ScheduleEvent(EVENT_SAND_TRAP, 5s, 15s);
break;
case EVENT_WIDE_SLASH:
DoCastSelf(SPELL_WIDE_SLASH);
events.ScheduleEvent(EVENT_WIDE_SLASH, 12s, 15s);
break;
default:
break;
}
}
DoMeleeAttackIfReady();
}
private:
bool _enraged;
};
struct go_sand_trap : public GameObjectAI
{
go_sand_trap(GameObject* go) : GameObjectAI(go) { }
void Reset() override
{
_scheduler.Schedule(5s, [this](TaskContext /*context*/)
{
if (InstanceScript* instance = me->GetInstanceScript())
if (Creature* kurinnaxx = instance->GetCreature(DATA_KURINNAXX))
me->Use(kurinnaxx);
});
}
void UpdateAI(uint32 const diff) override
{
_scheduler.Update(diff);
}
protected:
TaskScheduler _scheduler;
}; };
void AddSC_boss_kurinnaxx() void AddSC_boss_kurinnaxx()
{ {
new boss_kurinnaxx(); RegisterRuinsOfAhnQirajCreatureAI(boss_kurinnaxx);
RegisterGameObjectAI(go_sand_trap);
} }
@@ -19,6 +19,12 @@
#include "ScriptMgr.h" #include "ScriptMgr.h"
#include "ruins_of_ahnqiraj.h" #include "ruins_of_ahnqiraj.h"
ObjectData const creatureData[] =
{
{ NPC_OSSIRIAN, DATA_OSSIRIAN },
{ NPC_KURINNAXX, DATA_KURINNAXX }
};
class instance_ruins_of_ahnqiraj : public InstanceMapScript class instance_ruins_of_ahnqiraj : public InstanceMapScript
{ {
public: public:
@@ -29,14 +35,17 @@ public:
instance_ruins_of_ahnqiraj_InstanceMapScript(Map* map) : InstanceScript(map) instance_ruins_of_ahnqiraj_InstanceMapScript(Map* map) : InstanceScript(map)
{ {
SetBossNumber(NUM_ENCOUNTER); SetBossNumber(NUM_ENCOUNTER);
LoadObjectData(creatureData, nullptr);
} }
void OnCreatureCreate(Creature* creature) override void OnCreatureCreate(Creature* creature) override
{ {
InstanceScript::OnCreatureCreate(creature);
switch (creature->GetEntry()) switch (creature->GetEntry())
{ {
case NPC_KURINAXX: case NPC_KURINNAXX:
_kurinaxxGUID = creature->GetGUID(); _kurinnaxxGUID = creature->GetGUID();
break; break;
case NPC_RAJAXX: case NPC_RAJAXX:
_rajaxxGUID = creature->GetGUID(); _rajaxxGUID = creature->GetGUID();
@@ -75,7 +84,7 @@ public:
switch (type) switch (type)
{ {
case DATA_KURINNAXX: case DATA_KURINNAXX:
return _kurinaxxGUID; return _kurinnaxxGUID;
case DATA_RAJAXX: case DATA_RAJAXX:
return _rajaxxGUID; return _rajaxxGUID;
case DATA_MOAM: case DATA_MOAM:
@@ -137,7 +146,7 @@ public:
} }
private: private:
ObjectGuid _kurinaxxGUID; ObjectGuid _kurinnaxxGUID;
ObjectGuid _rajaxxGUID; ObjectGuid _rajaxxGUID;
ObjectGuid _moamGUID; ObjectGuid _moamGUID;
ObjectGuid _buruGUID; ObjectGuid _buruGUID;
@@ -37,7 +37,7 @@ enum DataTypes
enum Creatures enum Creatures
{ {
NPC_KURINAXX = 15348, NPC_KURINNAXX = 15348,
NPC_RAJAXX = 15341, NPC_RAJAXX = 15341,
NPC_MOAM = 15340, NPC_MOAM = 15340,
NPC_BURU = 15370, NPC_BURU = 15370,
@@ -66,4 +66,6 @@ inline AI* GetRuinsOfAhnQirajAI(T* obj)
return GetInstanceAI<AI>(obj, RuinsOfAhnQirajScriptName); return GetInstanceAI<AI>(obj, RuinsOfAhnQirajScriptName);
} }
#define RegisterRuinsOfAhnQirajCreatureAI(ai_name) RegisterCreatureAIWithFactory(ai_name, GetRuinsOfAhnQirajAI)
#endif #endif