Scripts/BWD: scripted Dwarven spirits

This commit is contained in:
Ovahlord
2020-07-15 15:40:44 +02:00
parent 322662ba69
commit 00a94593cd
4 changed files with 550 additions and 65 deletions

View File

@@ -23,7 +23,9 @@
#include "Spell.h"
#include "SpellScript.h"
#include "SpellAuraEffects.h"
#include "TemporarySummon.h"
#include "Map.h"
#include "MoveSplineInit.h"
#include "PassiveAI.h"
#include "Player.h"
#include "InstanceScript.h"
@@ -191,7 +193,7 @@ enum DrakonidChainWielder
SPELL_OVERHEAD_SMASH_SUMMON = 79578, // Serverside spell
SPELL_OVERHEAD_SMASH = 79580,
SPELL_GRIEVOUS_WOUND = 80051,
SPELL_CONSTRICTING_CHAINS = 79589,
SPELL_CONSTRICTING_CHAINS = 79589
};
struct npc_bwd_drakonid_chainwielder : public ScriptedAI
@@ -265,15 +267,261 @@ private:
EventMap _events;
};
enum DwarvenSpirits
{
// Spells
SPELL_SPIRIT_OF_ANGERFORGE = 80762,
SPELL_SPIRIT_OF_IRONSTAR = 80767,
SPELL_SPIRIT_OF_THAURISSAN = 80766,
SPELL_SPIRIT_OF_BURNINGEYE = 80770,
SPELL_SPIRIT_OF_MOLTENFIST = 80764,
SPELL_SPIRIT_OF_ANVILRAGE = 80768,
SPELL_SPIRIT_OF_SHADOWFORGE = 80769,
SPELL_SPIRIT_OF_COREHAMMER = 80763,
SPELL_BESTOWAL_OF_THAURISSAN = 80871,
SPELL_BESTOWAL_OF_BURNINGEYE = 80872,
SPELL_BESTOWAL_OF_SHADOWFORGE = 80873,
SPELL_BESTOWAL_OF_ANVILRAGE = 80874,
SPELL_BESTOWAL_OF_IRONSTAR = 80875,
SPELL_BESTOWAL_OF_MOLTENFIST = 80876,
SPELL_BESTOWAL_OF_COREHAMMER = 80877,
SPELL_BESTOWAL_OF_ANGERFORGE = 80878,
SPELL_BURDEN_OF_THE_CROWN = 80718,
SPELL_CHAIN_LIGHTNING = 80646,
SPELL_STORMBOLT = 80648,
SPELL_THUNDERCLAP = 80649,
SPELL_WHIRLWIND = 80652,
SPELL_AVATAR = 80645,
SPELL_STONEBLOOD = 80655,
SPELL_EXECUTION_SENTENCE_SUMMON_1 = 80738,
SPELL_EXECUTION_SENTENCE_SUMMON_2 = 80729,
SPELL_EXECUTION_SENTENCE_DUMMY = 85176,
SPELL_EXECUTION_SENTENCE = 80727,
// Events
EVENT_BURDEN_OF_THE_CROWN = 1,
EVENT_CHAIN_LIGHTNING,
EVENT_STORMBOLT,
EVENT_THUNDERCLAP,
EVENT_WHIRLWIND,
EVENT_AVATAR,
EVENT_STONEBLOOD,
EVENT_SHIELD_OF_LIGHT,
EVENT_EXECUTION_SENTENCE
};
#define SPELL_SHIELD_OF_LIGHT RAID_MODE<uint32>(80747, 95537)
struct npc_bwd_dwarven_spirit : public ScriptedAI
{
npc_bwd_dwarven_spirit(Creature* creature) : ScriptedAI(creature) { }
void JustEngagedWith(Unit* /*who*/) override
{
uint32 initialEventId = 0;
switch (me->GetEntry())
{
case NPC_SPIRIT_OF_COREHAMMER: initialEventId = EVENT_BURDEN_OF_THE_CROWN; break;
case NPC_SPIRIT_OF_SHADOWFORGE: initialEventId = EVENT_CHAIN_LIGHTNING; break;
case NPC_SPIRIT_OF_ANVILRAGE: initialEventId = EVENT_STORMBOLT; break;
case NPC_SPIRIT_OF_MOLTENFIST: initialEventId = EVENT_THUNDERCLAP; break;
case NPC_SPIRIT_OF_BURNINGEYE: initialEventId = EVENT_WHIRLWIND; break;
case NPC_SPIRIT_OF_THAURISSAN: initialEventId = EVENT_AVATAR; break;
case NPC_SPIRIT_OF_ANGERFORGE: initialEventId = EVENT_STONEBLOOD; break;
case NPC_SPIRIT_OF_IRONSTAR: initialEventId = EVENT_SHIELD_OF_LIGHT; break;
default:
break;
}
if (initialEventId)
_events.ScheduleEvent(initialEventId, 11s, 18s);
}
void EnterEvadeMode(EvadeReason why) override
{
ScriptedAI::EnterEvadeMode(why);
_events.Reset();
if (InstanceScript* instance = me->GetInstanceScript())
{
switch (me->GetEntry())
{
case NPC_SPIRIT_OF_MOLTENFIST:
case NPC_SPIRIT_OF_ANVILRAGE:
case NPC_SPIRIT_OF_SHADOWFORGE:
case NPC_SPIRIT_OF_COREHAMMER:
instance->SetData(DATA_RESET_DWARVEN_SPIRIT_GROUP, DWARVEN_SPIRIT_GROUP_LEFT);
break;
default:
instance->SetData(DATA_RESET_DWARVEN_SPIRIT_GROUP, DWARVEN_SPIRIT_GROUP_RIGHT);
break;
}
}
}
void JustDied(Unit* /*killer*/) override
{
_events.Reset();
uint32 bestowalSpellId = 0;
switch (me->GetEntry())
{
case NPC_SPIRIT_OF_ANGERFORGE: bestowalSpellId = SPELL_BESTOWAL_OF_ANGERFORGE; break;
case NPC_SPIRIT_OF_ANVILRAGE: bestowalSpellId = SPELL_BESTOWAL_OF_ANVILRAGE; break;
case NPC_SPIRIT_OF_BURNINGEYE: bestowalSpellId = SPELL_BESTOWAL_OF_BURNINGEYE; break;
case NPC_SPIRIT_OF_COREHAMMER: bestowalSpellId = SPELL_BESTOWAL_OF_COREHAMMER; break;
case NPC_SPIRIT_OF_IRONSTAR: bestowalSpellId = SPELL_BESTOWAL_OF_IRONSTAR; break;
case NPC_SPIRIT_OF_MOLTENFIST: bestowalSpellId = SPELL_BESTOWAL_OF_MOLTENFIST; break;
case NPC_SPIRIT_OF_SHADOWFORGE: bestowalSpellId = SPELL_BESTOWAL_OF_SHADOWFORGE; break;
case NPC_SPIRIT_OF_THAURISSAN: bestowalSpellId = SPELL_BESTOWAL_OF_THAURISSAN; break;
default:
break;
}
if (bestowalSpellId)
DoCastAOE(bestowalSpellId);
if (InstanceScript* instance = me->GetInstanceScript())
{
switch (me->GetEntry())
{
case NPC_SPIRIT_OF_MOLTENFIST:
case NPC_SPIRIT_OF_ANVILRAGE:
case NPC_SPIRIT_OF_SHADOWFORGE:
case NPC_SPIRIT_OF_COREHAMMER:
instance->SetData(DATA_DWARVEN_SPIRIT_DIED, DWARVEN_SPIRIT_GROUP_LEFT);
break;
default:
instance->SetData(DATA_DWARVEN_SPIRIT_DIED, DWARVEN_SPIRIT_GROUP_RIGHT);
break;
}
}
}
void SpellHit(Unit* /*caster*/, SpellInfo const* spell) override
{
uint32 triggeredEventId = 0;
switch (spell->Id)
{
case SPELL_BESTOWAL_OF_COREHAMMER: triggeredEventId = EVENT_BURDEN_OF_THE_CROWN; break;
case SPELL_BESTOWAL_OF_SHADOWFORGE: triggeredEventId = EVENT_CHAIN_LIGHTNING; break;
case SPELL_BESTOWAL_OF_ANVILRAGE: triggeredEventId = EVENT_STORMBOLT; break;
case SPELL_BESTOWAL_OF_MOLTENFIST: triggeredEventId = EVENT_THUNDERCLAP; break;
case SPELL_BESTOWAL_OF_BURNINGEYE: triggeredEventId = EVENT_WHIRLWIND; break;
case SPELL_BESTOWAL_OF_THAURISSAN: triggeredEventId = EVENT_AVATAR; break;
case SPELL_BESTOWAL_OF_ANGERFORGE: triggeredEventId = EVENT_AVATAR; break;
case SPELL_BESTOWAL_OF_IRONSTAR: triggeredEventId = EVENT_SHIELD_OF_LIGHT; break;
default:
break;
}
if (triggeredEventId)
_events.ScheduleEvent(triggeredEventId, 1s);
}
void JustSummoned(Creature* summon) override
{
if (summon->GetEntry() == NPC_EXECUTION_SENTENCE_VISUAL)
{
summon->m_Events.AddEventAtOffset([summon]()
{
Movement::MoveSplineInit init(summon);
init.MoveTo(summon->GetPositionX(), summon->GetPositionY(), summon->GetFloorZ(), false);
init.SetVelocity(0.54f);
init.Launch();
}, 2s+ 500ms);
}
}
void OnSpellCastFinished(SpellInfo const* spell, SpellFinishReason reason) override
{
if (spell->Id == SPELL_SHIELD_OF_LIGHT && reason == SPELL_FINISHED_SUCCESSFUL_CAST)
{
_events.DelayEvents(1s + 100ms);
_events.ScheduleEvent(EVENT_EXECUTION_SENTENCE, 1s);
}
}
void UpdateAI(uint32 diff) override
{
if (!UpdateVictim())
return;
_events.Update(diff);
if (me->HasUnitState(UNIT_STATE_CASTING))
return;
while (uint32 eventId = _events.ExecuteEvent())
{
switch (eventId)
{
case EVENT_BURDEN_OF_THE_CROWN:
DoCastVictim(SPELL_BURDEN_OF_THE_CROWN);
_events.Repeat(31s);
break;
case EVENT_CHAIN_LIGHTNING:
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 90.f, true))
DoCast(target, SPELL_CHAIN_LIGHTNING);
_events.Repeat(10s, 11s);
break;
case EVENT_STORMBOLT:
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 30.f, true))
DoCast(target, SPELL_STORMBOLT);
_events.Repeat(19s, 23s);
break;
case EVENT_THUNDERCLAP:
if (me->GetVictim()->IsWithinMeleeRange(me))
{
DoCastAOE(SPELL_THUNDERCLAP);
_events.Repeat(6s, 8s);
}
else
_events.Repeat(1s);
break;
case EVENT_WHIRLWIND:
DoCastSelf(SPELL_WHIRLWIND);
_events.Repeat(34s, 36s);
break;
case EVENT_AVATAR:
DoCastSelf(SPELL_AVATAR);
_events.Repeat(34s, 36s);
break;
case EVENT_STONEBLOOD:
DoCastSelf(SPELL_STONEBLOOD);
_events.Repeat(19s, 23s);
break;
case EVENT_SHIELD_OF_LIGHT:
DoCastSelf(SPELL_SHIELD_OF_LIGHT);
break;
case EVENT_EXECUTION_SENTENCE:
if (me->GetVictim() && !me->GetVictim()->HasAura(SPELL_EXECUTION_SENTENCE))
{
DoCastVictim(SPELL_EXECUTION_SENTENCE_SUMMON_1);
DoCastVictim(SPELL_EXECUTION_SENTENCE_SUMMON_2);
DoCastVictim(SPELL_EXECUTION_SENTENCE);
}
_events.Repeat(34s, 36s);
break;
default:
break;
}
}
DoMeleeAttackIfReady();
}
private:
EventMap _events;
};
struct go_bwd_ancient_bell : public GameObjectAI
{
go_bwd_ancient_bell(GameObject* go) : GameObjectAI(go), _instance(go->GetInstanceScript()) { }
bool GossipHello(Player* /*player*/) override
{
if (_instance->GetData(DATA_ATRAMEDES_INTRO) == DONE)
return true;
_instance->SetData(DATA_ATRAMEDES_INTRO, DONE);
me->SendCustomAnim(0);
me->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
@@ -341,6 +589,98 @@ class spell_bwd_grievous_wound : public AuraScript
}
};
class spell_bwd_execution_sentence_visual : public SpellScript
{
PrepareSpellScript(spell_bwd_execution_sentence_visual);
void SetDest(SpellDestination& dest)
{
dest.RelocateOffset({ 0.0f, 0.0f, 15.0f, 0.0f });
}
void Register()
{
OnDestinationTargetSelect += SpellDestinationTargetSelectFn(spell_bwd_execution_sentence_visual::SetDest, EFFECT_0, TARGET_DEST_TARGET_ENEMY);
}
};
class spell_bwd_execution_sentence_dummy : public SpellScript
{
PrepareSpellScript(spell_bwd_execution_sentence_dummy);
void HandleDummyEffect(SpellEffIndex /*effIndex*/)
{
Unit* caster = GetCaster();
Creature* creature = GetHitCreature();
if (!caster || !creature)
return;
if (TempSummon* summon = creature->ToTempSummon())
if (summon->GetSummoner() == caster)
summon->DespawnOrUnsummon();
}
void Register() override
{
OnEffectHitTarget += SpellEffectFn(spell_bwd_execution_sentence_dummy::HandleDummyEffect, EFFECT_0, SPELL_EFFECT_DUMMY);
}
};
class spell_bwd_execution_sentence : public AuraScript
{
PrepareAuraScript(spell_bwd_execution_sentence);
bool Validate(SpellInfo const* /*spellInfo*/) override
{
return ValidateSpellInfo({ SPELL_EXECUTION_SENTENCE_DUMMY });
}
void HandleRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
{
if (GetTargetApplication()->GetRemoveMode().HasFlag(AuraRemoveFlags::ByCancel | AuraRemoveFlags::ByDeath))
if (Unit* caster = GetCaster())
caster->CastSpell(caster, SPELL_EXECUTION_SENTENCE_DUMMY, true);
}
void Register() override
{
OnEffectRemove += AuraEffectRemoveFn(spell_bwd_execution_sentence::HandleRemove, EFFECT_1, SPELL_AURA_PERIODIC_TRIGGER_SPELL, AURA_EFFECT_HANDLE_REAL);
}
};
class spell_bwd_stoneblood : public SpellScript
{
PrepareSpellScript(spell_bwd_stoneblood);
void HandleScriptEffect(SpellEffIndex /*effIndex*/)
{
std::unordered_set<Aura*> aurasToRemove;
Unit* target = GetHitUnit();
for (auto itr : target->GetAppliedAuras())
{
Aura* aura = itr.second->GetBase();
if (!aura)
continue;
// Todo: this check should be more generic so it can detect actual hostile effects but it'll do for the dwarven spirits for the time being.
if (Unit* caster = aura->GetCaster())
if (caster->IsPlayer() || caster->IsSummon())
aurasToRemove.insert(aura);
}
for (std::unordered_set<Aura*>::const_iterator itr = aurasToRemove.begin(); itr != aurasToRemove.end();)
{
(*itr)->Remove(AuraRemoveFlags::ByEnemySpell);
itr = aurasToRemove.erase(itr);
}
}
void Register() override
{
OnEffectHitTarget += SpellEffectFn(spell_bwd_stoneblood::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
}
};
class at_bwd_intro: public OnlyOnceAreaTriggerScript
{
public:
@@ -358,8 +698,13 @@ void AddSC_blackwing_descent()
{
RegisterBlackwingDescentCreatureAI(npc_bwd_lord_victor_nefarius);
RegisterBlackwingDescentCreatureAI(npc_bwd_drakonid_chainwielder);
RegisterBlackwingDescentCreatureAI(npc_bwd_dwarven_spirit);
RegisterGameObjectAI(go_bwd_ancient_bell);
RegisterSpellScript(spell_bwd_dragon_orb);
RegisterAuraScript(spell_bwd_grievous_wound);
RegisterSpellScript(spell_bwd_execution_sentence_visual);
RegisterSpellScript(spell_bwd_execution_sentence_dummy);
RegisterAuraScript(spell_bwd_execution_sentence);
RegisterSpellScript(spell_bwd_stoneblood);
new at_bwd_intro();
}

View File

@@ -36,7 +36,8 @@ enum BWDDataTypes
DATA_NEFARIANS_END = 5,
/*Events*/
DATA_DEAD_DWARF_SPIRITS,
DATA_RESET_DWARVEN_SPIRIT_GROUP,
DATA_DWARVEN_SPIRIT_DIED,
DATA_ANCIENT_BELL,
DATA_COLUMN_OF_LIGHT,
DATA_ATRAMEDES_INTRO,
@@ -165,7 +166,8 @@ enum BWDCreatureIds
// Generic Creatures
NPC_DRAKONID_DRUDGE = 42362,
NPC_OVERHEAD_SMASH = 42690
NPC_OVERHEAD_SMASH = 42690,
NPC_EXECUTION_SENTENCE_VISUAL = 43206
};
enum BWDGameObjectIds
@@ -181,8 +183,13 @@ enum BWDGameObjectIds
enum BWDMisc
{
// Magmaw
MASSIVE_CRASH_SIDE_LEFT = 0,
MASSIVE_CRASH_SIDE_RIGHT = 1
MASSIVE_CRASH_SIDE_RIGHT = 1,
// Dwarven Spirit Council
DWARVEN_SPIRIT_GROUP_LEFT = 0,
DWARVEN_SPIRIT_GROUP_RIGHT = 1
};
enum BWDSpells

View File

@@ -86,7 +86,9 @@ enum Events
EVENT_MAKE_ANCIENT_BELL_SELECTABLE = 1,
EVENT_RESPAWN_ATRAMEDES,
EVENT_RESPAWN_NEFARIAN,
EVENT_RAISE_ELEVATOR
EVENT_RAISE_ELEVATOR,
EVENT_RESPAWN_LEFT_DWARVEN_GROUP,
EVENT_RESPAWN_RIGHT_DWARVEN_GROUP
};
enum Actions
@@ -98,7 +100,9 @@ enum Actions
enum SpawnGroup
{
SPAWN_GROUP_ANCIENT_DWARVEN_SHIELDS = 400,
SPAWN_GROUP_NEFARIANS_END = 402
SPAWN_GROUP_NEFARIANS_END = 402,
SPAWN_GROUP_DWARVEN_SPIRITS_LEFT = 435,
SPAWN_GROUP_DWARVEN_SPIRITS_RIGHT = 436
};
enum SummonGroups
@@ -124,7 +128,8 @@ class instance_blackwing_descent : public InstanceMapScript
SetBossNumber(EncounterCount);
LoadObjectData(creatureData, gameobjectData);
LoadDoorData(doorData);
_deadDwarfSpirits = 0;
_deadDwarfSpiritsLeft = 0;
_deadDwarfSpiritsRight = 0;
_atramedesIntroState = NOT_STARTED;
_nefarianAchievementEligible = true;
_nefariansEndIntroDone = false;
@@ -133,6 +138,8 @@ class instance_blackwing_descent : public InstanceMapScript
void Create() override
{
instance->SpawnGroupSpawn(SPAWN_GROUP_ANCIENT_DWARVEN_SHIELDS, true);
instance->SpawnGroupSpawn(SPAWN_GROUP_DWARVEN_SPIRITS_LEFT, true);
instance->SpawnGroupSpawn(SPAWN_GROUP_DWARVEN_SPIRITS_RIGHT, true);
}
void OnCreatureCreate(Creature* creature) override
@@ -209,36 +216,6 @@ class instance_blackwing_descent : public InstanceMapScript
if (GetBossState(DATA_MAGMAW) == DONE && GetBossState(DATA_OMNOTRON_DEFENSE_SYSTEM) == DONE)
go->SetGoState(GO_STATE_ACTIVE);
break;
case GO_ANCIENT_BELL:
if (_deadDwarfSpirits == 8 && _atramedesIntroState != DONE)
{
go->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
if (Creature* column = instance->SummonCreature(NPC_COLUMN_OF_LIGHT, ColumnOfLightPosition))
column->CastSpell(column, SPELL_COLUMN_OF_LIGHT);
}
break;
default:
break;
}
}
void OnUnitDeath(Unit* unit) override
{
if (unit->GetTypeId() != TYPEID_UNIT)
return;
switch (unit->GetEntry())
{
case NPC_SPIRIT_OF_MOLTENFIST:
case NPC_SPIRIT_OF_ANVILRAGE:
case NPC_SPIRIT_OF_SHADOWFORGE:
case NPC_SPIRIT_OF_COREHAMMER:
case NPC_SPIRIT_OF_ANGERFORGE:
case NPC_SPIRIT_OF_IRONSTAR:
case NPC_SPIRIT_OF_THAURISSAN:
case NPC_SPIRIT_OF_BURNINGEYE:
SetData(DATA_DEAD_DWARF_SPIRITS, DONE);
break;
default:
break;
}
@@ -318,12 +295,17 @@ class instance_blackwing_descent : public InstanceMapScript
{
switch (type)
{
case DATA_DEAD_DWARF_SPIRITS:
_deadDwarfSpirits++;
SaveToDB();
case DATA_DWARVEN_SPIRIT_DIED:
if (data == DWARVEN_SPIRIT_GROUP_LEFT)
++_deadDwarfSpiritsLeft;
else
++_deadDwarfSpiritsRight;
if (_deadDwarfSpirits == 8)
if ((_deadDwarfSpiritsLeft + _deadDwarfSpiritsRight) == 8)
{
_atramedesIntroState = DONE;
SaveToDB();
std::list<TempSummon*> summoned;
instance->SummonCreatureGroup(SUMMON_GROUP_ATRAMEDES_INTRO, &summoned);
for (TempSummon* summon : summoned)
@@ -333,22 +315,38 @@ class instance_blackwing_descent : public InstanceMapScript
_events.ScheduleEvent(EVENT_MAKE_ANCIENT_BELL_SELECTABLE, 4s + 500ms);
}
break;
case DATA_ATRAMEDES_INTRO:
_atramedesIntroState = data;
if (Creature* atramedes = instance->SummonCreature(BOSS_ATRAMEDES, AtramedesIntroSummonPosition))
case DATA_RESET_DWARVEN_SPIRIT_GROUP:
if (data == DWARVEN_SPIRIT_GROUP_LEFT)
{
for (ObjectGuid guid : _atramedesIntroGUIDs)
if (Creature* intro = instance->GetCreature(guid))
intro->DespawnOrUnsummon();
atramedes->SetDisableGravity(true);
atramedes->SetReactState(REACT_PASSIVE);
atramedes->SendSetPlayHoverAnim(true);
atramedes->AI()->DoAction(ACTION_START_ATRAMEDES_INTRO);
_deadDwarfSpiritsLeft = 0;
_events.RescheduleEvent(EVENT_RESPAWN_LEFT_DWARVEN_GROUP, 30s);
instance->SpawnGroupDespawn(SPAWN_GROUP_DWARVEN_SPIRITS_LEFT);
}
else
{
_deadDwarfSpiritsRight = 0;
_events.RescheduleEvent(EVENT_RESPAWN_RIGHT_DWARVEN_GROUP, 30s);
instance->SpawnGroupDespawn(SPAWN_GROUP_DWARVEN_SPIRITS_RIGHT);
}
SaveToDB();
break;
case DATA_ATRAMEDES_INTRO:
if (!GetCreature(DATA_ATRAMEDES))
{
if (Creature* atramedes = instance->SummonCreature(BOSS_ATRAMEDES, AtramedesIntroSummonPosition))
{
for (ObjectGuid guid : _atramedesIntroGUIDs)
if (Creature* intro = instance->GetCreature(guid))
intro->DespawnOrUnsummon();
atramedes->SetDisableGravity(true);
atramedes->SetReactState(REACT_PASSIVE);
atramedes->SendSetPlayHoverAnim(true);
if (atramedes->IsAIEnabled)
atramedes->AI()->DoAction(ACTION_START_ATRAMEDES_INTRO);
}
}
break;
case DATA_ENTRANCE_INTRO:
{
@@ -481,6 +479,12 @@ class instance_blackwing_descent : public InstanceMapScript
if (Transport* transport = gameobject->ToTransport())
transport->SetTransportState(GO_STATE_TRANSPORT_STOPPED, 1);
break;
case EVENT_RESPAWN_LEFT_DWARVEN_GROUP:
instance->SpawnGroupSpawn(SPAWN_GROUP_DWARVEN_SPIRITS_LEFT, true);
break;
case EVENT_RESPAWN_RIGHT_DWARVEN_GROUP:
instance->SpawnGroupSpawn(SPAWN_GROUP_DWARVEN_SPIRITS_RIGHT, true);
break;
default:
break;
}
@@ -489,22 +493,26 @@ class instance_blackwing_descent : public InstanceMapScript
void WriteSaveDataMore(std::ostringstream& data) override
{
data << _deadDwarfSpirits << ' '
<< _atramedesIntroState;
data << _atramedesIntroState;
}
void ReadSaveDataMore(std::istringstream& data) override
{
data >> _deadDwarfSpirits;
data >> _atramedesIntroState;
// Atramedes' intro is done but he has not been defeated yet: spawm him at his respawn location
if (_atramedesIntroState == DONE && GetBossState(DATA_ATRAMEDES) != DONE)
instance->SummonCreature(BOSS_ATRAMEDES, AtramedesRespawnPosition);
if (GetBossState(DATA_ATRAMEDES) != DONE)
{
instance->SpawnGroupSpawn(SPAWN_GROUP_ANCIENT_DWARVEN_SHIELDS, true);
if (_atramedesIntroState == DONE)
instance->SummonCreature(BOSS_ATRAMEDES, AtramedesRespawnPosition);
else
{
instance->SpawnGroupSpawn(SPAWN_GROUP_DWARVEN_SPIRITS_LEFT, true);
instance->SpawnGroupSpawn(SPAWN_GROUP_DWARVEN_SPIRITS_RIGHT, true);
}
}
if (IsNefarianAvailable())
instance->SpawnGroupSpawn(SPAWN_GROUP_NEFARIANS_END, true);
}
@@ -517,7 +525,8 @@ class instance_blackwing_descent : public InstanceMapScript
ObjectGuid _roomStalkerTargetDummyRightGuid;
GuidVector _roomStalkerGUIDs;
GuidVector _atramedesIntroGUIDs;
uint8 _deadDwarfSpirits;
uint8 _deadDwarfSpiritsLeft;
uint8 _deadDwarfSpiritsRight;
uint8 _atramedesIntroState;
bool _nefarianAchievementEligible;
bool _nefariansEndIntroDone;