mirror of
https://github.com/mod-playerbots/azerothcore-wotlk.git
synced 2026-01-15 10:00:28 +00:00
refactor(Scripts/UtgardeKeep): Modernize Prince Keleseth script (#20806)
This commit is contained in:
@@ -51,30 +51,24 @@ enum eSpells
|
||||
|
||||
#define SPELL_SHADOWBOLT DUNGEON_MODE(SPELL_SHADOWBOLT_N, SPELL_SHADOWBOLT_H)
|
||||
|
||||
enum eEvents
|
||||
{
|
||||
EVENT_SPELL_SHADOWBOLT = 1,
|
||||
EVENT_FROST_TOMB,
|
||||
EVENT_SUMMON_SKELETONS,
|
||||
};
|
||||
|
||||
struct npc_frost_tomb : public NullCreatureAI
|
||||
{
|
||||
npc_frost_tomb(Creature* c) : NullCreatureAI(c)
|
||||
{
|
||||
if (TempSummon* t = c->ToTempSummon())
|
||||
if (Unit* s = t->GetSummonerUnit())
|
||||
if (WorldObject* summoner = GetSummoner())
|
||||
if (Unit* summonerUnit = summoner->ToUnit())
|
||||
{
|
||||
PrisonerGUID = s->GetGUID();
|
||||
PrisonerGUID = summonerUnit->GetGUID();
|
||||
if (me->GetInstanceScript() && me->GetInstanceScript()->instance->IsHeroic())
|
||||
{
|
||||
const int32 dmg = 2000;
|
||||
c->CastCustomSpell(s, SPELL_FROST_TOMB_AURA, nullptr, &dmg, nullptr, true);
|
||||
c->CastCustomSpell(summonerUnit, SPELL_FROST_TOMB_AURA, nullptr, &dmg, nullptr, true);
|
||||
}
|
||||
else
|
||||
c->CastSpell(s, SPELL_FROST_TOMB_AURA, true);
|
||||
c->CastSpell(summonerUnit, SPELL_FROST_TOMB_AURA, true);
|
||||
}
|
||||
}
|
||||
|
||||
ObjectGuid PrisonerGUID;
|
||||
|
||||
void JustDied(Unit* killer) override
|
||||
@@ -104,50 +98,49 @@ struct npc_frost_tomb : public NullCreatureAI
|
||||
}
|
||||
};
|
||||
|
||||
struct boss_keleseth : public ScriptedAI
|
||||
struct boss_keleseth : public BossAI
|
||||
{
|
||||
boss_keleseth(Creature* c) : ScriptedAI(c)
|
||||
{
|
||||
pInstance = c->GetInstanceScript();
|
||||
}
|
||||
|
||||
InstanceScript* pInstance;
|
||||
EventMap events;
|
||||
|
||||
void Reset() override
|
||||
{
|
||||
events.Reset();
|
||||
if (pInstance)
|
||||
pInstance->SetData(DATA_KELESETH, NOT_STARTED);
|
||||
}
|
||||
boss_keleseth(Creature* creature) : BossAI(creature, DATA_KELESETH) { }
|
||||
|
||||
void KilledUnit(Unit* victim) override
|
||||
{
|
||||
if (victim->IsPlayer())
|
||||
{
|
||||
Talk(SAY_KILL);
|
||||
}
|
||||
}
|
||||
|
||||
void JustDied(Unit* /*killer*/) override
|
||||
{
|
||||
_JustDied();
|
||||
Talk(SAY_DEATH);
|
||||
if (pInstance)
|
||||
pInstance->SetData(DATA_KELESETH, DONE);
|
||||
}
|
||||
|
||||
void JustEngagedWith(Unit* /*who*/) override
|
||||
{
|
||||
events.Reset();
|
||||
events.RescheduleEvent(EVENT_SPELL_SHADOWBOLT, 0ms);
|
||||
events.RescheduleEvent(EVENT_FROST_TOMB, 28s);
|
||||
events.RescheduleEvent(EVENT_SUMMON_SKELETONS, 4s);
|
||||
|
||||
_JustEngagedWith();
|
||||
Talk(SAY_START_COMBAT);
|
||||
DoZoneInCombat();
|
||||
|
||||
if (pInstance)
|
||||
pInstance->SetData(DATA_KELESETH, IN_PROGRESS);
|
||||
ScheduleTimedEvent(1s, [&] {
|
||||
DoCastVictim(SPELL_SHADOWBOLT);
|
||||
}, 4s, 5s);
|
||||
|
||||
ScheduleTimedEvent(28s, [&] {
|
||||
if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 0.0f, true, true, -SPELL_FROST_TOMB_AURA))
|
||||
{
|
||||
Talk(SAY_FROST_TOMB_EMOTE, target);
|
||||
Talk(SAY_FROST_TOMB);
|
||||
DoCast(target, SPELL_FROST_TOMB);
|
||||
}
|
||||
}, 15s);
|
||||
|
||||
me->m_Events.AddEventAtOffset([this]() {
|
||||
Talk(SAY_SUMMON_SKELETONS);
|
||||
for (uint8 i = 0; i < 5; ++i)
|
||||
{
|
||||
float dist = rand_norm() * 4 + 3.0f;
|
||||
float angle = rand_norm() * 2 * M_PI;
|
||||
me->SummonCreature(NPC_SKELETON, 156.2f + cos(angle) * dist, 259.1f + std::sin(angle) * dist, 42.9f, 0, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 20000);
|
||||
}
|
||||
}, 4s);
|
||||
}
|
||||
|
||||
void AttackStart(Unit* who) override
|
||||
@@ -157,55 +150,6 @@ struct boss_keleseth : public ScriptedAI
|
||||
|
||||
UnitAI::AttackStartCaster(who, 12.0f);
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff) override
|
||||
{
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
events.Update(diff);
|
||||
|
||||
if (me->HasUnitState(UNIT_STATE_CASTING))
|
||||
return;
|
||||
|
||||
switch (events.ExecuteEvent())
|
||||
{
|
||||
case 0:
|
||||
break;
|
||||
case EVENT_SPELL_SHADOWBOLT:
|
||||
me->CastSpell(me->GetVictim(), SPELL_SHADOWBOLT, false);
|
||||
events.Repeat(4s, 5s);
|
||||
break;
|
||||
case EVENT_FROST_TOMB:
|
||||
if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 0.0f, true, true))
|
||||
if (!target->HasAura(SPELL_FROST_TOMB_AURA))
|
||||
{
|
||||
Talk(SAY_FROST_TOMB_EMOTE, target);
|
||||
Talk(SAY_FROST_TOMB);
|
||||
me->CastSpell(target, SPELL_FROST_TOMB, false);
|
||||
events.Repeat(15s);
|
||||
break;
|
||||
}
|
||||
events.Repeat(1s);
|
||||
break;
|
||||
case EVENT_SUMMON_SKELETONS:
|
||||
Talk(SAY_SUMMON_SKELETONS);
|
||||
for (uint8 i = 0; i < 5; ++i)
|
||||
{
|
||||
float dist = rand_norm() * 4 + 3.0f;
|
||||
float angle = rand_norm() * 2 * M_PI;
|
||||
if (Creature* c = me->SummonCreature(NPC_SKELETON, 156.2f + cos(angle) * dist, 259.1f + std::sin(angle) * dist, 42.9f, 0, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 20000))
|
||||
if (Unit* target = c->SelectNearestTarget(250.0f))
|
||||
{
|
||||
c->AddThreat(target, 5.0f);
|
||||
DoZoneInCombat(c);
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
};
|
||||
|
||||
enum eSkeletonEnum
|
||||
@@ -260,7 +204,7 @@ struct npc_vrykul_skeleton : public ScriptedAI
|
||||
|
||||
void UpdateAI(uint32 diff) override
|
||||
{
|
||||
if (pInstance && pInstance->GetData(DATA_KELESETH) != IN_PROGRESS)
|
||||
if (pInstance && pInstance->GetBossState(DATA_KELESETH) != IN_PROGRESS)
|
||||
{
|
||||
if (me->IsAlive())
|
||||
me->KillSelf();
|
||||
|
||||
@@ -44,6 +44,8 @@ public:
|
||||
{
|
||||
instance_utgarde_keep_InstanceMapScript(Map* pMap) : InstanceScript(pMap)
|
||||
{
|
||||
SetHeaders(DataHeader);
|
||||
SetBossNumber(EncounterCount);
|
||||
LoadObjectData(creatureData, nullptr);
|
||||
}
|
||||
|
||||
@@ -69,12 +71,26 @@ public:
|
||||
|
||||
bool IsEncounterInProgress() const override
|
||||
{
|
||||
if (InstanceScript::IsEncounterInProgress())
|
||||
return true;
|
||||
|
||||
for (uint8 i = 0; i < MAX_ENCOUNTER; ++i)
|
||||
if (m_auiEncounter[i] == IN_PROGRESS) return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
bool SetBossState(uint32 type, EncounterState state) override
|
||||
{
|
||||
if (!InstanceScript::SetBossState(type, state))
|
||||
return false;
|
||||
|
||||
if (type == DATA_KELESETH && state == NOT_STARTED)
|
||||
bRocksAchiev = true;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void OnPlayerEnter(Player* plr) override
|
||||
{
|
||||
if (Creature* c = GetCreature(DATA_DARK_RANGER_MARRAH))
|
||||
@@ -160,11 +176,6 @@ public:
|
||||
{
|
||||
switch (type)
|
||||
{
|
||||
case DATA_KELESETH:
|
||||
m_auiEncounter[0] = data;
|
||||
if (data == NOT_STARTED)
|
||||
bRocksAchiev = true;
|
||||
break;
|
||||
case DATA_ON_THE_ROCKS_ACHIEV:
|
||||
bRocksAchiev = false;
|
||||
break;
|
||||
|
||||
@@ -22,6 +22,10 @@
|
||||
|
||||
#define UtgardeKeepScriptName "instance_utgarde_keep"
|
||||
|
||||
#define DataHeader "UK"
|
||||
|
||||
uint32 const EncounterCount = 3;
|
||||
|
||||
enum eData
|
||||
{
|
||||
DATA_KELESETH,
|
||||
|
||||
Reference in New Issue
Block a user