mirror of
https://github.com/liyunfan1223/azerothcore-wotlk.git
synced 2026-08-08 07:48:02 +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)
|
#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
|
struct npc_frost_tomb : public NullCreatureAI
|
||||||
{
|
{
|
||||||
npc_frost_tomb(Creature* c) : NullCreatureAI(c)
|
npc_frost_tomb(Creature* c) : NullCreatureAI(c)
|
||||||
{
|
{
|
||||||
if (TempSummon* t = c->ToTempSummon())
|
if (WorldObject* summoner = GetSummoner())
|
||||||
if (Unit* s = t->GetSummonerUnit())
|
if (Unit* summonerUnit = summoner->ToUnit())
|
||||||
{
|
{
|
||||||
PrisonerGUID = s->GetGUID();
|
PrisonerGUID = summonerUnit->GetGUID();
|
||||||
if (me->GetInstanceScript() && me->GetInstanceScript()->instance->IsHeroic())
|
if (me->GetInstanceScript() && me->GetInstanceScript()->instance->IsHeroic())
|
||||||
{
|
{
|
||||||
const int32 dmg = 2000;
|
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
|
else
|
||||||
c->CastSpell(s, SPELL_FROST_TOMB_AURA, true);
|
c->CastSpell(summonerUnit, SPELL_FROST_TOMB_AURA, true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ObjectGuid PrisonerGUID;
|
ObjectGuid PrisonerGUID;
|
||||||
|
|
||||||
void JustDied(Unit* killer) override
|
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)
|
boss_keleseth(Creature* creature) : BossAI(creature, DATA_KELESETH) { }
|
||||||
{
|
|
||||||
pInstance = c->GetInstanceScript();
|
|
||||||
}
|
|
||||||
|
|
||||||
InstanceScript* pInstance;
|
|
||||||
EventMap events;
|
|
||||||
|
|
||||||
void Reset() override
|
|
||||||
{
|
|
||||||
events.Reset();
|
|
||||||
if (pInstance)
|
|
||||||
pInstance->SetData(DATA_KELESETH, NOT_STARTED);
|
|
||||||
}
|
|
||||||
|
|
||||||
void KilledUnit(Unit* victim) override
|
void KilledUnit(Unit* victim) override
|
||||||
{
|
{
|
||||||
if (victim->IsPlayer())
|
if (victim->IsPlayer())
|
||||||
{
|
|
||||||
Talk(SAY_KILL);
|
Talk(SAY_KILL);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void JustDied(Unit* /*killer*/) override
|
void JustDied(Unit* /*killer*/) override
|
||||||
{
|
{
|
||||||
|
_JustDied();
|
||||||
Talk(SAY_DEATH);
|
Talk(SAY_DEATH);
|
||||||
if (pInstance)
|
|
||||||
pInstance->SetData(DATA_KELESETH, DONE);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void JustEngagedWith(Unit* /*who*/) override
|
void JustEngagedWith(Unit* /*who*/) override
|
||||||
{
|
{
|
||||||
events.Reset();
|
_JustEngagedWith();
|
||||||
events.RescheduleEvent(EVENT_SPELL_SHADOWBOLT, 0ms);
|
|
||||||
events.RescheduleEvent(EVENT_FROST_TOMB, 28s);
|
|
||||||
events.RescheduleEvent(EVENT_SUMMON_SKELETONS, 4s);
|
|
||||||
|
|
||||||
Talk(SAY_START_COMBAT);
|
Talk(SAY_START_COMBAT);
|
||||||
DoZoneInCombat();
|
|
||||||
|
|
||||||
if (pInstance)
|
ScheduleTimedEvent(1s, [&] {
|
||||||
pInstance->SetData(DATA_KELESETH, IN_PROGRESS);
|
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
|
void AttackStart(Unit* who) override
|
||||||
@@ -157,55 +150,6 @@ struct boss_keleseth : public ScriptedAI
|
|||||||
|
|
||||||
UnitAI::AttackStartCaster(who, 12.0f);
|
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
|
enum eSkeletonEnum
|
||||||
@@ -260,7 +204,7 @@ struct npc_vrykul_skeleton : public ScriptedAI
|
|||||||
|
|
||||||
void UpdateAI(uint32 diff) override
|
void UpdateAI(uint32 diff) override
|
||||||
{
|
{
|
||||||
if (pInstance && pInstance->GetData(DATA_KELESETH) != IN_PROGRESS)
|
if (pInstance && pInstance->GetBossState(DATA_KELESETH) != IN_PROGRESS)
|
||||||
{
|
{
|
||||||
if (me->IsAlive())
|
if (me->IsAlive())
|
||||||
me->KillSelf();
|
me->KillSelf();
|
||||||
|
|||||||
@@ -44,6 +44,8 @@ public:
|
|||||||
{
|
{
|
||||||
instance_utgarde_keep_InstanceMapScript(Map* pMap) : InstanceScript(pMap)
|
instance_utgarde_keep_InstanceMapScript(Map* pMap) : InstanceScript(pMap)
|
||||||
{
|
{
|
||||||
|
SetHeaders(DataHeader);
|
||||||
|
SetBossNumber(EncounterCount);
|
||||||
LoadObjectData(creatureData, nullptr);
|
LoadObjectData(creatureData, nullptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -69,12 +71,26 @@ public:
|
|||||||
|
|
||||||
bool IsEncounterInProgress() const override
|
bool IsEncounterInProgress() const override
|
||||||
{
|
{
|
||||||
|
if (InstanceScript::IsEncounterInProgress())
|
||||||
|
return true;
|
||||||
|
|
||||||
for (uint8 i = 0; i < MAX_ENCOUNTER; ++i)
|
for (uint8 i = 0; i < MAX_ENCOUNTER; ++i)
|
||||||
if (m_auiEncounter[i] == IN_PROGRESS) return true;
|
if (m_auiEncounter[i] == IN_PROGRESS) return true;
|
||||||
|
|
||||||
return false;
|
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
|
void OnPlayerEnter(Player* plr) override
|
||||||
{
|
{
|
||||||
if (Creature* c = GetCreature(DATA_DARK_RANGER_MARRAH))
|
if (Creature* c = GetCreature(DATA_DARK_RANGER_MARRAH))
|
||||||
@@ -160,11 +176,6 @@ public:
|
|||||||
{
|
{
|
||||||
switch (type)
|
switch (type)
|
||||||
{
|
{
|
||||||
case DATA_KELESETH:
|
|
||||||
m_auiEncounter[0] = data;
|
|
||||||
if (data == NOT_STARTED)
|
|
||||||
bRocksAchiev = true;
|
|
||||||
break;
|
|
||||||
case DATA_ON_THE_ROCKS_ACHIEV:
|
case DATA_ON_THE_ROCKS_ACHIEV:
|
||||||
bRocksAchiev = false;
|
bRocksAchiev = false;
|
||||||
break;
|
break;
|
||||||
|
|||||||
@@ -22,6 +22,10 @@
|
|||||||
|
|
||||||
#define UtgardeKeepScriptName "instance_utgarde_keep"
|
#define UtgardeKeepScriptName "instance_utgarde_keep"
|
||||||
|
|
||||||
|
#define DataHeader "UK"
|
||||||
|
|
||||||
|
uint32 const EncounterCount = 3;
|
||||||
|
|
||||||
enum eData
|
enum eData
|
||||||
{
|
{
|
||||||
DATA_KELESETH,
|
DATA_KELESETH,
|
||||||
|
|||||||
Reference in New Issue
Block a user