mirror of
https://github.com/mod-playerbots/azerothcore-wotlk.git
synced 2026-01-15 18:10:26 +00:00
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:
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user