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

View File

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

View File

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