fix(Scripts/Hyjal): Archimonde should gain charges regardless of deat… (#19069)

* fix(Scripts/Hyjal): Archimonde should gain charges regardless of death cause

* Update instance_hyjal.cpp

* fix boss waves
This commit is contained in:
Andrew
2024-06-16 13:58:14 -03:00
committed by GitHub
parent 9e122a0cad
commit 95221c4d50
3 changed files with 64 additions and 65 deletions

View File

@@ -187,7 +187,7 @@ struct boss_archimonde : public BossAI
void Reset() override
{
BossAI::Reset();
_Reset();
_wispCount = 0;
_isChanneling = false;
_enraged = false;
@@ -279,7 +279,7 @@ struct boss_archimonde : public BossAI
void JustEngagedWith(Unit* who) override
{
BossAI::JustEngagedWith(who);
_JustEngagedWith();
me->InterruptNonMeleeSpells(false);
Talk(SAY_AGGRO);
ScheduleTimedEvent(25s, 35s, [&]
@@ -348,46 +348,43 @@ struct boss_archimonde : public BossAI
void KilledUnit(Unit* victim) override
{
Talk(SAY_SLAY);
if (victim->IsPlayer())
{
GainSoulCharge(victim->ToPlayer());
}
}
void GainSoulCharge(Player* player)
void SetGUID(ObjectGuid guid, int32 type) override
{
switch (player->getClass())
if (type == GUID_GAIN_SOUL_CHARGE_PLAYER)
{
case CLASS_PALADIN:
case CLASS_PRIEST:
case CLASS_WARLOCK:
player->CastSpell(me, SPELL_SOUL_CHARGE_RED, true);
break;
case CLASS_DEATH_KNIGHT:
case CLASS_MAGE:
case CLASS_ROGUE:
case CLASS_WARRIOR:
player->CastSpell(me, SPELL_SOUL_CHARGE_YELLOW, true);
break;
case CLASS_DRUID:
case CLASS_HUNTER:
case CLASS_SHAMAN:
player->CastSpell(me, SPELL_SOUL_CHARGE_GREEN, true);
break;
case CLASS_NONE:
default:
break;
}
scheduler.Schedule(2s, 10s, [this](TaskContext)
{
UnleashSoulCharge();
});
}
if (Player* player = ObjectAccessor::GetPlayer(*me, guid))
{
switch (player->getClass())
{
case CLASS_PALADIN:
case CLASS_PRIEST:
case CLASS_WARLOCK:
player->CastSpell(me, SPELL_SOUL_CHARGE_RED, true);
break;
case CLASS_DEATH_KNIGHT:
case CLASS_MAGE:
case CLASS_ROGUE:
case CLASS_WARRIOR:
player->CastSpell(me, SPELL_SOUL_CHARGE_YELLOW, true);
break;
case CLASS_DRUID:
case CLASS_HUNTER:
case CLASS_SHAMAN:
player->CastSpell(me, SPELL_SOUL_CHARGE_GREEN, true);
break;
case CLASS_NONE:
default:
break;
}
void JustDied(Unit* killer) override
{
BossAI::JustDied(killer);
scheduler.Schedule(2s, 10s, [this](TaskContext)
{
UnleashSoulCharge();
});
}
}
}
void EnterEvadeMode(EvadeReason why) override

View File

@@ -27,18 +27,13 @@
uint32 const EncounterCount = 5;
enum HyjalBosses
{
BOSS_ARCHIMONDE = 0,
};
enum DataTypes
{
DATA_WINTERCHILL = 1,
DATA_ANETHERON = 2,
DATA_KAZROGAL = 3,
DATA_AZGALOR = 4,
DATA_ARCHIMONDE = 5,
DATA_WINTERCHILL = 0,
DATA_ANETHERON = 1,
DATA_KAZROGAL = 2,
DATA_AZGALOR = 3,
DATA_ARCHIMONDE = 4,
DATA_ALLIANCE_RETREAT = 11,
DATA_HORDE_RETREAT = 12,
@@ -154,7 +149,9 @@ enum HyjalMisc
AREA_NORDRASSIL = 3710,
SPELL_ETERNAL_SILENCE = 42201
SPELL_ETERNAL_SILENCE = 42201,
GUID_GAIN_SOUL_CHARGE_PLAYER = 1
};
enum HyjalPaths

View File

@@ -92,7 +92,7 @@ public:
void Initialize() override
{
_bossWave = 0;
_bossWave = TO_BE_DECIDED;
_retreat = 0;
trash = 0;
_currentWave = 0;
@@ -185,12 +185,12 @@ public:
case NPC_GARGO:
case NPC_FROST:
case NPC_INFER:
if (_bossWave)
if (_bossWave != TO_BE_DECIDED)
creature->AI()->DoAction(_bossWave);
else if (_retreat)
creature->AI()->DoAction(_retreat);
if (creature->IsSummon() && _bossWave)
if (creature->IsSummon() && _bossWave != TO_BE_DECIDED)
{
DoUpdateWorldState(WORLD_STATE_ENEMYCOUNT, ++trash); // Update the instance wave count on new trash spawn
_encounterNPCs.insert(creature->GetGUID()); // Used for despawning on wipe
@@ -228,7 +228,7 @@ public:
case NPC_STALK:
if (creature->IsSummon())
{
if (_bossWave)
if (_bossWave != TO_BE_DECIDED)
{
DoUpdateWorldState(WORLD_STATE_ENEMYCOUNT, --trash); // Update the instance wave count on new trash death
_encounterNPCs.erase(creature->GetGUID()); // Used for despawning on wipe
@@ -256,6 +256,11 @@ public:
break;
}
}
else if (unit->IsPlayer() && GetBossState(DATA_ARCHIMONDE) == IN_PROGRESS)
{
if (Creature* archimonde = GetCreature(DATA_ARCHIMONDE))
archimonde->AI()->SetGUID(unit->GetGUID(), GUID_GAIN_SOUL_CHARGE_PLAYER);
}
}
void SetData(uint32 type, uint32 data) override
@@ -263,7 +268,7 @@ public:
switch (type)
{
case DATA_ALLIANCE_RETREAT:
_bossWave = 0;
_bossWave = TO_BE_DECIDED;
_retreat = DATA_ALLIANCE_RETREAT;
// Spawn Ancient Gems
for (ObjectGuid const& guid : _ancientGemAlliance)
@@ -312,7 +317,7 @@ public:
SaveToDB();
break;
case DATA_HORDE_RETREAT:
_bossWave = 0;
_bossWave = TO_BE_DECIDED;
_retreat = DATA_HORDE_RETREAT;
for (ObjectGuid const& guid : _ancientGemHorde)
{
@@ -359,39 +364,39 @@ public:
_retreat = 0;
if (GetBossState(DATA_WINTERCHILL) != DONE)
{
if (!_bossWave)
if (_bossWave == TO_BE_DECIDED)
for (ObjectGuid const& guid : _baseAlliance)
if (Creature* creature = instance->GetCreature(guid))
creature->Respawn();
_bossWave = DATA_WINTERCHILL;
ScheduleWaves(1ms, START_WAVE_WINTERCHILL, MAX_WAVES_STANDARD, hyjalWaveTimers[DATA_WINTERCHILL - 1]);
ScheduleWaves(1ms, START_WAVE_WINTERCHILL, MAX_WAVES_STANDARD, hyjalWaveTimers[DATA_WINTERCHILL]);
}
else if (GetBossState(DATA_ANETHERON) != DONE)
{
if (!_bossWave)
if (_bossWave == TO_BE_DECIDED)
for (ObjectGuid const& guid : _baseAlliance)
if (Creature* creature = instance->GetCreature(guid))
creature->Respawn();
_bossWave = DATA_ANETHERON;
ScheduleWaves(1ms, START_WAVE_ANETHERON, MAX_WAVES_STANDARD, hyjalWaveTimers[DATA_ANETHERON - 1]);
ScheduleWaves(1ms, START_WAVE_ANETHERON, MAX_WAVES_STANDARD, hyjalWaveTimers[DATA_ANETHERON]);
}
else if (GetBossState(DATA_KAZROGAL) != DONE)
{
if (!_bossWave)
if (_bossWave == TO_BE_DECIDED)
for (ObjectGuid const& guid : _baseHorde)
if (Creature* creature = instance->GetCreature(guid))
creature->Respawn();
_bossWave = DATA_KAZROGAL;
ScheduleWaves(1ms, START_WAVE_KAZROGAL, MAX_WAVES_STANDARD, hyjalWaveTimers[DATA_KAZROGAL - 1]);
ScheduleWaves(1ms, START_WAVE_KAZROGAL, MAX_WAVES_STANDARD, hyjalWaveTimers[DATA_KAZROGAL]);
}
else if (GetBossState(DATA_AZGALOR) != DONE)
{
if (!_bossWave)
if (_bossWave == TO_BE_DECIDED)
for (ObjectGuid const& guid : _baseHorde)
if (Creature* creature = instance->GetCreature(guid))
creature->Respawn();
_bossWave = DATA_AZGALOR;
ScheduleWaves(1ms, START_WAVE_AZGALOR, MAX_WAVES_STANDARD, hyjalWaveTimers[DATA_AZGALOR - 1]);
ScheduleWaves(1ms, START_WAVE_AZGALOR, MAX_WAVES_STANDARD, hyjalWaveTimers[DATA_AZGALOR]);
}
else if (GetBossState(DATA_ARCHIMONDE) != DONE)
{
@@ -399,7 +404,7 @@ public:
ScheduleWaves(1ms, START_WAVE_NIGHT_ELF, MAX_WAVES_NIGHT_ELF, hyjalNightElfWaveTimers[0]);
}
if (_bossWave)
if (_bossWave != TO_BE_DECIDED)
DoUpdateWorldState(WORLD_STATE_WAVES, 0);
break;
@@ -455,7 +460,7 @@ public:
if (Creature* creature = instance->GetCreature(guid))
creature->DespawnOrUnsummon();
if (_bossWave && (GetBossState(_bossWave) != DONE))
if (_bossWave != TO_BE_DECIDED && (GetBossState(_bossWave) != DONE))
SetBossState(_bossWave, NOT_STARTED);
SetData(DATA_RESET_WAVES, 0);
@@ -466,7 +471,7 @@ public:
_summonedNPCs.clear();
_currentWave = 0;
trash = 0;
_bossWave = 0;
_bossWave = TO_BE_DECIDED;
_retreat = 0;
DoUpdateWorldState(WORLD_STATE_WAVES, _currentWave);
DoUpdateWorldState(WORLD_STATE_ENEMY, trash);