mirror of
https://github.com/liyunfan1223/azerothcore-wotlk.git
synced 2026-08-08 15:58:04 +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
|
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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
Reference in New Issue
Block a user