From 95221c4d505d964ce5ef2538e4dedbb48f5e2d63 Mon Sep 17 00:00:00 2001 From: Andrew <47818697+Nyeriah@users.noreply.github.com> Date: Sun, 16 Jun 2024 13:58:14 -0300 Subject: [PATCH] =?UTF-8?q?fix(Scripts/Hyjal):=20Archimonde=20should=20gai?= =?UTF-8?q?n=20charges=20regardless=20of=20deat=E2=80=A6=20(#19069)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix(Scripts/Hyjal): Archimonde should gain charges regardless of death cause * Update instance_hyjal.cpp * fix boss waves --- .../BattleForMountHyjal/boss_archimonde.cpp | 71 +++++++++---------- .../CavernsOfTime/BattleForMountHyjal/hyjal.h | 19 +++-- .../BattleForMountHyjal/instance_hyjal.cpp | 39 +++++----- 3 files changed, 64 insertions(+), 65 deletions(-) diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_archimonde.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_archimonde.cpp index 852d98c60..5cc549636 100644 --- a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_archimonde.cpp +++ b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_archimonde.cpp @@ -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 diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjal.h b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjal.h index 8575d7e35..f29a56eb2 100644 --- a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjal.h +++ b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjal.h @@ -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 diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/instance_hyjal.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/instance_hyjal.cpp index 76749ed62..3e518ecca 100644 --- a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/instance_hyjal.cpp +++ b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/instance_hyjal.cpp @@ -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);