Scripts/Stratholme: Added missing dungeon encounter ids

(cherry picked from commit 4370f2fe29)
This commit is contained in:
Shauren
2023-09-18 19:14:50 +02:00
parent 2ce4c8640e
commit 8011ef76c3
12 changed files with 276 additions and 308 deletions

View File

@@ -16,7 +16,6 @@
*/
#include "ScriptMgr.h"
#include "InstanceScript.h"
#include "ScriptedCreature.h"
#include "SpellInfo.h"
#include "stratholme.h"
@@ -62,23 +61,10 @@ uint32 const RaiseDeadSpells[6] =
struct boss_baron_rivendare : public BossAI
{
public:
boss_baron_rivendare(Creature* creature) : BossAI(creature, TYPE_BARON), RaiseDead(false) { }
void Reset() override
{
// needed until re-write of instance scripts is done
if (instance->GetData(TYPE_RAMSTEIN) == DONE)
instance->SetData(TYPE_BARON, NOT_STARTED);
BossAI::Reset();
}
boss_baron_rivendare(Creature* creature) : BossAI(creature, BOSS_RIVENDARE), RaiseDead(false) { }
void JustEngagedWith(Unit* who) override
{
// needed until re-write of instance scripts is done
if (instance->GetData(TYPE_BARON) == NOT_STARTED)
instance->SetData(TYPE_BARON, IN_PROGRESS);
events.ScheduleEvent(EVENT_SHADOWBOLT, 5s);
events.ScheduleEvent(EVENT_CLEAVE, 8s);
events.ScheduleEvent(EVENT_MORTALSTRIKE, 12s);
@@ -87,14 +73,6 @@ public:
BossAI::JustEngagedWith(who);
}
void JustDied(Unit* killer) override
{
// needed until re-write of instance scripts is done
instance->SetData(TYPE_BARON, DONE);
BossAI::JustDied(killer);
}
void UpdateAI(uint32 diff) override
{
if (!UpdateVictim())

View File

@@ -43,12 +43,14 @@ enum BaronessAnastariEvents
struct boss_baroness_anastari : public BossAI
{
boss_baroness_anastari(Creature* creature) : BossAI(creature, TYPE_BARONESS) { }
boss_baroness_anastari(Creature* creature) : BossAI(creature, BOSS_BARONESS_ANASTARI) { }
ObjectGuid _possessedTargetGuid;
void Reset() override
{
_Reset();
_possessedTargetGuid.Clear();
instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_POSSESS);
@@ -66,13 +68,6 @@ struct boss_baroness_anastari : public BossAI
events.ScheduleEvent(EVENT_SPELL_POSSESS, 20s, 30s);
}
void JustDied(Unit* /*killer*/) override
{
// needed until crystals implemented,
// see line 305 instance_stratholme.cpp
instance->SetData(TYPE_BARONESS, IN_PROGRESS);
}
void UpdateAI(uint32 diff) override
{
if (!UpdateVictim())

View File

@@ -41,21 +41,18 @@ enum WilleyEvents
};
// 10997 - Cannon Master Willey
struct boss_cannon_master_willey : public ScriptedAI
struct boss_cannon_master_willey : public BossAI
{
boss_cannon_master_willey(Creature* creature) : ScriptedAI(creature) { }
boss_cannon_master_willey(Creature* creature) : BossAI(creature, BOSS_CANNON_MASTER_WILLEY) { }
void Reset() override
void JustEngagedWith(Unit* who) override
{
_events.Reset();
}
BossAI::JustEngagedWith(who);
void JustEngagedWith(Unit* /*who*/) override
{
_events.ScheduleEvent(EVENT_SHOOT, 0s);
_events.ScheduleEvent(EVENT_KNOCK_AWAY, 10s, 20s);
_events.ScheduleEvent(EVENT_PUMMEL, 10s, 15s);
_events.ScheduleEvent(EVENT_SUMMON_RIFLEMAN, 5s, 10s);
events.ScheduleEvent(EVENT_SHOOT, 0s);
events.ScheduleEvent(EVENT_KNOCK_AWAY, 10s, 20s);
events.ScheduleEvent(EVENT_PUMMEL, 10s, 15s);
events.ScheduleEvent(EVENT_SUMMON_RIFLEMAN, 5s, 10s);
}
void AttackStart(Unit* who) override
@@ -68,30 +65,30 @@ struct boss_cannon_master_willey : public ScriptedAI
if (!UpdateVictim())
return;
_events.Update(diff);
events.Update(diff);
if (me->HasUnitState(UNIT_STATE_CASTING))
return;
while (uint32 eventId = _events.ExecuteEvent())
while (uint32 eventId = events.ExecuteEvent())
{
switch (eventId)
{
case EVENT_SHOOT:
DoCastVictim(SPELL_SHOOT);
_events.Repeat(2s, 4s);
events.Repeat(2s, 4s);
break;
case EVENT_KNOCK_AWAY:
DoCastVictim(SPELL_KNOCK_AWAY);
_events.Repeat(15s, 25s);
events.Repeat(15s, 25s);
break;
case EVENT_PUMMEL:
DoCastVictim(SPELL_PUMMEL);
_events.Repeat(10s, 15s);
events.Repeat(10s, 15s);
break;
case EVENT_SUMMON_RIFLEMAN:
DoCastSelf(SPELL_SUMMON_RIFLEMAN);
_events.Repeat(15s, 25s);
events.Repeat(15s, 25s);
break;
default:
break;
@@ -103,9 +100,6 @@ struct boss_cannon_master_willey : public ScriptedAI
DoMeleeAttackIfReady();
}
private:
EventMap _events;
};
void AddSC_boss_cannon_master_willey()

View File

@@ -74,13 +74,14 @@ enum DathrohanMisc
};
// 10812 - Grand Crusader Dathrohan
struct boss_dathrohan_balnazzar : public ScriptedAI
struct boss_dathrohan_balnazzar : public BossAI
{
boss_dathrohan_balnazzar(Creature* creature) : ScriptedAI(creature), _transformed(false) { }
boss_dathrohan_balnazzar(Creature* creature) : BossAI(creature, BOSS_BALNAZZAR), _transformed(false) { }
void Reset() override
{
_events.Reset();
BossAI::Reset();
_transformed = false;
if (me->GetEntry() == NPC_BALNAZZAR)
@@ -89,14 +90,16 @@ struct boss_dathrohan_balnazzar : public ScriptedAI
SetEquipmentSlots(true);
}
void JustEngagedWith(Unit* /*who*/) override
void JustEngagedWith(Unit* who) override
{
BossAI::JustEngagedWith(who);
Talk(SAY_AGGRO);
_events.ScheduleEvent(EVENT_CRUSADERS_HAMMER, 15s, 25s);
_events.ScheduleEvent(EVENT_CRUSADER_STRIKE, 5s, 10s);
_events.ScheduleEvent(EVENT_HOLY_STRIKE, 10s, 20s);
_events.ScheduleEvent(EVENT_MIND_BLAST, 5s, 15s);
events.ScheduleEvent(EVENT_CRUSADERS_HAMMER, 15s, 25s);
events.ScheduleEvent(EVENT_CRUSADER_STRIKE, 5s, 10s);
events.ScheduleEvent(EVENT_HOLY_STRIKE, 10s, 20s);
events.ScheduleEvent(EVENT_MIND_BLAST, 5s, 15s);
}
void DamageTaken(Unit* /*attacker*/, uint32& damage, DamageEffectType /*damageType*/, SpellInfo const* /*spellInfo = nullptr*/) override
@@ -104,12 +107,14 @@ struct boss_dathrohan_balnazzar : public ScriptedAI
if (!_transformed && me->HealthBelowPctDamaged(40, damage))
{
_transformed = true;
_events.ScheduleEvent(EVENT_TRANSFORM_1, 0s);
events.ScheduleEvent(EVENT_TRANSFORM_1, 0s);
}
}
void JustDied(Unit* /*killer*/) override
void JustDied(Unit* killer) override
{
BossAI::JustDied(killer);
Talk(SAY_DEATH);
me->SummonCreatureGroup(SUMMON_GROUP_DEATH);
}
@@ -119,78 +124,78 @@ struct boss_dathrohan_balnazzar : public ScriptedAI
if (!UpdateVictim())
return;
_events.Update(diff);
events.Update(diff);
if (me->HasUnitState(UNIT_STATE_CASTING))
return;
while (uint32 eventId = _events.ExecuteEvent())
while (uint32 eventId = events.ExecuteEvent())
{
switch (eventId)
{
case EVENT_CRUSADERS_HAMMER:
DoCastSelf(SPELL_CRUSADERS_HAMMER);
_events.Repeat(20s, 30s);
events.Repeat(20s, 30s);
break;
case EVENT_CRUSADER_STRIKE:
DoCastVictim(SPELL_CRUSADER_STRIKE);
_events.Repeat(10s, 20s);
events.Repeat(10s, 20s);
break;
case EVENT_HOLY_STRIKE:
DoCastVictim(SPELL_HOLY_STRIKE);
_events.Repeat(10s, 15s);
events.Repeat(10s, 15s);
break;
case EVENT_MIND_BLAST:
DoCastVictim(SPELL_MIND_BLAST);
_events.Repeat(10s, 15s);
events.Repeat(10s, 15s);
break;
case EVENT_SHADOW_SHOCK:
DoCastSelf(SPELL_SHADOW_SHOCK);
_events.Repeat(10s, 15s);
events.Repeat(10s, 15s);
break;
case EVENT_PSYCHIC_SCREAM:
DoCastSelf(SPELL_PSYCHIC_SCREAM);
_events.Repeat(20s, 30s);
events.Repeat(20s, 30s);
break;
case EVENT_SLEEP:
if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0))
DoCast(target, SPELL_SLEEP);
_events.Repeat(15s, 20s);
events.Repeat(15s, 20s);
break;
case EVENT_DOMINATION:
if (Unit* target = SelectTarget(SelectTargetMethod::Random, 1))
DoCast(target, SPELL_DOMINATION);
_events.Repeat(20s, 25s);
events.Repeat(20s, 25s);
break;
case EVENT_TRANSFORM_1:
_events.CancelEvent(EVENT_CRUSADERS_HAMMER);
_events.CancelEvent(EVENT_CRUSADER_STRIKE);
_events.CancelEvent(EVENT_HOLY_STRIKE);
_events.CancelEvent(EVENT_MIND_BLAST);
events.CancelEvent(EVENT_CRUSADERS_HAMMER);
events.CancelEvent(EVENT_CRUSADER_STRIKE);
events.CancelEvent(EVENT_HOLY_STRIKE);
events.CancelEvent(EVENT_MIND_BLAST);
DoCastSelf(SPELL_BALNAZZAR_TRANSFORM);
me->SetReactState(REACT_PASSIVE);
_events.ScheduleEvent(EVENT_TRANSFORM_2, 2s);
events.ScheduleEvent(EVENT_TRANSFORM_2, 2s);
break;
case EVENT_TRANSFORM_2:
me->UpdateEntry(NPC_BALNAZZAR);
me->SetReactState(REACT_PASSIVE);
SetEquipmentSlots(false, EQUIP_UNEQUIP);
_events.ScheduleEvent(EVENT_TRANSFORM_3, 2s);
events.ScheduleEvent(EVENT_TRANSFORM_3, 2s);
break;
case EVENT_TRANSFORM_3:
Talk(SAY_TRANSFORM);
_events.ScheduleEvent(EVENT_TRANSFORM_4, 4s);
events.ScheduleEvent(EVENT_TRANSFORM_4, 4s);
break;
case EVENT_TRANSFORM_4:
me->SetReactState(REACT_AGGRESSIVE);
_events.ScheduleEvent(EVENT_MIND_BLAST, 5s, 15s);
_events.ScheduleEvent(EVENT_SHADOW_SHOCK, 10s, 15s);
_events.ScheduleEvent(EVENT_PSYCHIC_SCREAM, 15s, 25s);
_events.ScheduleEvent(EVENT_SLEEP, 5s, 15s);
_events.ScheduleEvent(EVENT_DOMINATION, 15s, 25s);
events.ScheduleEvent(EVENT_MIND_BLAST, 5s, 15s);
events.ScheduleEvent(EVENT_SHADOW_SHOCK, 10s, 15s);
events.ScheduleEvent(EVENT_PSYCHIC_SCREAM, 15s, 25s);
events.ScheduleEvent(EVENT_SLEEP, 5s, 15s);
events.ScheduleEvent(EVENT_DOMINATION, 15s, 25s);
break;
default:
break;
@@ -205,7 +210,6 @@ struct boss_dathrohan_balnazzar : public ScriptedAI
private:
bool _transformed;
EventMap _events;
};
void AddSC_boss_dathrohan_balnazzar()

View File

@@ -42,25 +42,24 @@ enum BarthilasEvents
};
// 10435 - Magistrate Barthilas
struct boss_magistrate_barthilas : public ScriptedAI
struct boss_magistrate_barthilas : public BossAI
{
boss_magistrate_barthilas(Creature* creature) : ScriptedAI(creature) { }
boss_magistrate_barthilas(Creature* creature) : BossAI(creature, BOSS_MAGISTRATE_BARTHILAS) { }
void Reset() override
void JustEngagedWith(Unit* who) override
{
_events.Reset();
BossAI::JustEngagedWith(who);
events.ScheduleEvent(EVENT_FURIOUS_ANGER, 0s, 4s);
events.ScheduleEvent(EVENT_DRAINING_BLOW, 0s, 5s);
events.ScheduleEvent(EVENT_CROWD_PUMMEL, 15s, 20s);
events.ScheduleEvent(EVENT_MIGHTY_BLOW, 15s, 25s);
}
void JustEngagedWith(Unit* /*who*/) override
void JustDied(Unit* killer) override
{
_events.ScheduleEvent(EVENT_FURIOUS_ANGER, 0s, 4s);
_events.ScheduleEvent(EVENT_DRAINING_BLOW, 0s, 5s);
_events.ScheduleEvent(EVENT_CROWD_PUMMEL, 15s, 20s);
_events.ScheduleEvent(EVENT_MIGHTY_BLOW, 15s, 25s);
}
BossAI::JustDied(killer);
void JustDied(Unit* /*killer*/) override
{
DoCastSelf(SPELL_TRANSFORMATION, true);
}
@@ -69,30 +68,30 @@ struct boss_magistrate_barthilas : public ScriptedAI
if (!UpdateVictim())
return;
_events.Update(diff);
events.Update(diff);
if (me->HasUnitState(UNIT_STATE_CASTING))
return;
while (uint32 eventId = _events.ExecuteEvent())
while (uint32 eventId = events.ExecuteEvent())
{
switch (eventId)
{
case EVENT_FURIOUS_ANGER:
DoCastSelf(SPELL_FURIOUS_ANGER);
_events.Repeat(4s);
events.Repeat(4s);
break;
case EVENT_DRAINING_BLOW:
DoCastVictim(SPELL_DRAINING_BLOW);
_events.Repeat(2s, 14s);
events.Repeat(2s, 14s);
break;
case EVENT_CROWD_PUMMEL:
DoCastSelf(SPELL_CROWD_PUMMEL);
_events.Repeat(25s, 30s);
events.Repeat(25s, 30s);
break;
case EVENT_MIGHTY_BLOW:
DoCastVictim(SPELL_MIGHTY_BLOW);
_events.Repeat(10s, 15s);
events.Repeat(10s, 15s);
break;
default:
break;
@@ -104,9 +103,6 @@ struct boss_magistrate_barthilas : public ScriptedAI
DoMeleeAttackIfReady();
}
private:
EventMap _events;
};
void AddSC_boss_magistrate_barthilas()

View File

@@ -42,27 +42,25 @@ enum MalekiEvents
};
// 10438 - Maleki the Pallid
struct boss_maleki_the_pallid : public ScriptedAI
struct boss_maleki_the_pallid : public BossAI
{
boss_maleki_the_pallid(Creature* creature) : ScriptedAI(creature), _instance(creature->GetInstanceScript()) { }
boss_maleki_the_pallid(Creature* creature) : BossAI(creature, BOSS_MALEKI_THE_PALLID) { }
void Reset() override
{
_events.Reset();
BossAI::Reset();
DoCastSelf(SPELL_FROST_ARMOR);
}
void JustEngagedWith(Unit* /*who*/) override
void JustEngagedWith(Unit* who) override
{
_events.ScheduleEvent(EVENT_FROSTBOLT, 0s, 8s);
_events.ScheduleEvent(EVENT_DRAIN_LIFE, 20s, 25s);
_events.ScheduleEvent(EVENT_DRAIN_MANA, 15s, 25s);
_events.ScheduleEvent(EVENT_ICE_TOMB, 10s, 20s);
}
BossAI::JustEngagedWith(who);
void JustDied(Unit* /*killer*/) override
{
_instance->SetData(TYPE_PALLID, IN_PROGRESS);
events.ScheduleEvent(EVENT_FROSTBOLT, 0s, 8s);
events.ScheduleEvent(EVENT_DRAIN_LIFE, 20s, 25s);
events.ScheduleEvent(EVENT_DRAIN_MANA, 15s, 25s);
events.ScheduleEvent(EVENT_ICE_TOMB, 10s, 20s);
}
void UpdateAI(uint32 diff) override
@@ -70,34 +68,34 @@ struct boss_maleki_the_pallid : public ScriptedAI
if (!UpdateVictim())
return;
_events.Update(diff);
events.Update(diff);
if (me->HasUnitState(UNIT_STATE_CASTING))
return;
while (uint32 eventId = _events.ExecuteEvent())
while (uint32 eventId = events.ExecuteEvent())
{
switch (eventId)
{
case EVENT_FROSTBOLT:
DoCastVictim(SPELL_FROSTBOLT);
_events.Repeat(2s, 8s);
events.Repeat(2s, 8s);
break;
case EVENT_DRAIN_LIFE:
DoCastVictim(SPELL_DRAIN_LIFE);
_events.Repeat(20s, 30s);
events.Repeat(20s, 30s);
break;
case EVENT_DRAIN_MANA:
{
Unit* target = me->GetVictim();
if (target && target->GetPowerType() == POWER_MANA)
DoCast(target, SPELL_DRAIN_MANA);
_events.Repeat(15s, 20s);
events.Repeat(15s, 20s);
break;
}
case EVENT_ICE_TOMB:
DoCastVictim(SPELL_ICE_TOMB);
_events.Repeat(15s, 25s);
events.Repeat(15s, 25s);
break;
default:
break;
@@ -106,10 +104,6 @@ struct boss_maleki_the_pallid : public ScriptedAI
DoMeleeAttackIfReady();
}
private:
EventMap _events;
InstanceScript* _instance;
};
void AddSC_boss_maleki_the_pallid()

View File

@@ -20,7 +20,6 @@
*/
#include "ScriptMgr.h"
#include "InstanceScript.h"
#include "ScriptedCreature.h"
#include "stratholme.h"
@@ -41,26 +40,18 @@ enum NerubenkanEvents
};
// 10437 - Nerub'enkan
struct boss_nerubenkan : public ScriptedAI
struct boss_nerubenkan : public BossAI
{
boss_nerubenkan(Creature* creature) : ScriptedAI(creature), _instance(creature->GetInstanceScript()) { }
boss_nerubenkan(Creature* creature) : BossAI(creature, BOSS_NERUB_ENKAN) { }
void Reset() override
void JustEngagedWith(Unit* who) override
{
_events.Reset();
}
BossAI::JustEngagedWith(who);
void JustEngagedWith(Unit* /*who*/) override
{
_events.ScheduleEvent(EVENT_CRYPT_SCARABS, 0s);
_events.ScheduleEvent(EVENT_ENCASING_WEBS, 5s, 10s);
_events.ScheduleEvent(EVENT_PIERCE_ARMOR, 5s, 20s);
_events.ScheduleEvent(EVENT_RAISE_SCARAB, 6s, 12s);
}
void JustDied(Unit* /*killer*/) override
{
_instance->SetData(TYPE_NERUB, IN_PROGRESS);
events.ScheduleEvent(EVENT_CRYPT_SCARABS, 0s);
events.ScheduleEvent(EVENT_ENCASING_WEBS, 5s, 10s);
events.ScheduleEvent(EVENT_PIERCE_ARMOR, 5s, 20s);
events.ScheduleEvent(EVENT_RAISE_SCARAB, 6s, 12s);
}
void UpdateAI(uint32 diff) override
@@ -68,30 +59,30 @@ struct boss_nerubenkan : public ScriptedAI
if (!UpdateVictim())
return;
_events.Update(diff);
events.Update(diff);
if (me->HasUnitState(UNIT_STATE_CASTING))
return;
while (uint32 eventId = _events.ExecuteEvent())
while (uint32 eventId = events.ExecuteEvent())
{
switch (eventId)
{
case EVENT_CRYPT_SCARABS:
DoCastVictim(SPELL_CRYPT_SCARABS);
_events.Repeat(2s, 10s);
events.Repeat(2s, 10s);
break;
case EVENT_ENCASING_WEBS:
DoCastVictim(SPELL_ENCASING_WEBS);
_events.Repeat(6s, 10s);
events.Repeat(6s, 10s);
break;
case EVENT_PIERCE_ARMOR:
DoCastVictim(SPELL_PIERCE_ARMOR);
_events.Repeat(10s, 20s);
events.Repeat(10s, 20s);
break;
case EVENT_RAISE_SCARAB:
DoCastSelf(SPELL_RAISE_SCARAB);
_events.Repeat(25s, 30s);
events.Repeat(25s, 30s);
break;
default:
break;
@@ -100,10 +91,6 @@ struct boss_nerubenkan : public ScriptedAI
DoMeleeAttackIfReady();
}
private:
EventMap _events;
InstanceScript* _instance;
};
void AddSC_boss_nerubenkan()

View File

@@ -49,7 +49,7 @@ enum MalownEvents
// 11143 - Postmaster Malown
struct boss_postmaster_malown : public BossAI
{
boss_postmaster_malown(Creature* creature) : BossAI(creature, TYPE_MALOWN) { }
boss_postmaster_malown(Creature* creature) : BossAI(creature, BOSS_POSTMASTER_MALOWN) { }
void Reset() override
{

View File

@@ -21,7 +21,6 @@
*/
#include "ScriptMgr.h"
#include "InstanceScript.h"
#include "ScriptedCreature.h"
#include "stratholme.h"
@@ -45,28 +44,31 @@ enum RamsteinMisc
};
// 10439 - Ramstein the Gorger
struct boss_ramstein_the_gorger : public ScriptedAI
struct boss_ramstein_the_gorger : public BossAI
{
boss_ramstein_the_gorger(Creature* creature) : ScriptedAI(creature), _instance(creature->GetInstanceScript()) { }
boss_ramstein_the_gorger(Creature* creature) : BossAI(creature, BOSS_RAMSTEIN_THE_GORGER) { }
void Reset() override
{
_events.Reset();
BossAI::Reset();
DoCastSelf(SPELL_FLURRY);
}
void JustEngagedWith(Unit* /*who*/) override
void JustEngagedWith(Unit* who) override
{
_events.ScheduleEvent(EVENT_TRAMPLE, 10s, 15s);
_events.ScheduleEvent(EVENT_KNOCKOUT, 10s, 20s);
BossAI::JustEngagedWith(who);
events.ScheduleEvent(EVENT_TRAMPLE, 10s, 15s);
events.ScheduleEvent(EVENT_KNOCKOUT, 10s, 20s);
}
void JustDied(Unit* /*killer*/) override
void JustDied(Unit* killer) override
{
BossAI::JustDied(killer);
me->SummonCreatureGroup(SUMMON_GROUP_SENTRY);
me->SummonCreatureGroup(SUMMON_GROUP_UNDEAD);
_instance->SetData(TYPE_RAMSTEIN, DONE);
}
void UpdateAI(uint32 diff) override
@@ -74,22 +76,22 @@ struct boss_ramstein_the_gorger : public ScriptedAI
if (!UpdateVictim())
return;
_events.Update(diff);
events.Update(diff);
if (me->HasUnitState(UNIT_STATE_CASTING))
return;
while (uint32 eventId = _events.ExecuteEvent())
while (uint32 eventId = events.ExecuteEvent())
{
switch (eventId)
{
case EVENT_TRAMPLE:
DoCastSelf(SPELL_TRAMPLE);
_events.Repeat(10s, 25s);
events.Repeat(10s, 25s);
break;
case EVENT_KNOCKOUT:
DoCastVictim(SPELL_KNOCKOUT);
_events.Repeat(15s, 20s);
events.Repeat(15s, 20s);
break;
default:
break;
@@ -101,10 +103,6 @@ struct boss_ramstein_the_gorger : public ScriptedAI
DoMeleeAttackIfReady();
}
private:
EventMap _events;
InstanceScript* _instance;
};
void AddSC_boss_ramstein_the_gorger()

View File

@@ -40,21 +40,24 @@ enum TimmyEvents
};
// 10808 - Timmy the Cruel
struct boss_timmy_the_cruel : public ScriptedAI
struct boss_timmy_the_cruel : public BossAI
{
boss_timmy_the_cruel(Creature* creature) : ScriptedAI(creature) { }
boss_timmy_the_cruel(Creature* creature) : BossAI(creature, BOSS_TIMMY_THE_CRUEL) { }
void Reset() override
{
_events.Reset();
BossAI::Reset();
DoCastSelf(SPELL_THRASH);
}
void JustEngagedWith(Unit* /*who*/) override
void JustEngagedWith(Unit* who) override
{
BossAI::JustEngagedWith(who);
Talk(SAY_AGGRO);
_events.ScheduleEvent(EVENT_RAVENOUS_CLAW, 10s, 15s);
events.ScheduleEvent(EVENT_RAVENOUS_CLAW, 10s, 15s);
}
void UpdateAI(uint32 diff) override
@@ -62,18 +65,18 @@ struct boss_timmy_the_cruel : public ScriptedAI
if (!UpdateVictim())
return;
_events.Update(diff);
events.Update(diff);
if (me->HasUnitState(UNIT_STATE_CASTING))
return;
while (uint32 eventId = _events.ExecuteEvent())
while (uint32 eventId = events.ExecuteEvent())
{
switch (eventId)
{
case EVENT_RAVENOUS_CLAW:
DoCastVictim(SPELL_RAVENOUS_CLAW);
_events.Repeat(10s, 15s);
events.Repeat(10s, 15s);
break;
default:
break;
@@ -85,9 +88,6 @@ struct boss_timmy_the_cruel : public ScriptedAI
DoMeleeAttackIfReady();
}
private:
EventMap _events;
};
void AddSC_boss_timmy_the_cruel()

View File

@@ -84,21 +84,22 @@ class instance_stratholme : public InstanceMapScript
instance_stratholme_InstanceMapScript(InstanceMap* map) : InstanceScript(map)
{
SetHeaders(DataHeader);
for (uint8 i = 0; i < MAX_ENCOUNTER; ++i)
EncounterState[i] = NOT_STARTED;
SetBossNumber(MAX_ENCOUNTER);
for (uint8 i = 0; i < 5; ++i)
IsSilverHandDead[i] = false;
timmySpawned = false;
scarletsKilled = 0;
brokenCrystals = 0;
baronRunState = NOT_STARTED;
events.ScheduleEvent(EVENT_RAT_TRAP_CLOSE, 15s);
}
uint32 EncounterState[MAX_ENCOUNTER];
uint8 scarletsKilled;
int32 brokenCrystals;
EncounterState baronRunState;
bool IsSilverHandDead[5];
bool timmySpawned;
@@ -148,6 +149,20 @@ class instance_stratholme : public InstanceMapScript
}
break;
}
case NPC_HEARTHSINGER_FORRESTEN:
SetBossState(BOSS_HEARTHSINGER_FORRESTEN, DONE);
break;
case NPC_COMMANDER_MALOR:
SetBossState(BOSS_COMMANDER_MALOR, DONE);
break;
case NPC_INSTRUCTOR_GALFORD:
SetBossState(BOSS_INSTRUCTOR_GALFORD, DONE);
break;
case NPC_THE_UNFORGIVEN:
SetBossState(BOSS_THE_UNFORGIVEN, DONE);
break;
default:
break;
case NPC_PLAGUED_RAT:
{
for (GateTrapData& trapGate : TrapGates)
@@ -167,8 +182,7 @@ class instance_stratholme : public InstanceMapScript
bool StartSlaugtherSquare()
{
//change to DONE when crystals implemented
if (EncounterState[1] == IN_PROGRESS && EncounterState[2] == IN_PROGRESS && EncounterState[3] == IN_PROGRESS)
if (brokenCrystals >= 3)
{
HandleGameObject(portGauntletGUID, true);
HandleGameObject(portSlaugtherGUID, true);
@@ -264,37 +278,37 @@ class instance_stratholme : public InstanceMapScript
break;
case GO_ZIGGURAT1:
ziggurat1GUID = go->GetGUID();
if (GetData(TYPE_BARONESS) == IN_PROGRESS)
if (GetBossState(BOSS_BARONESS_ANASTARI) == DONE)
HandleGameObject(ObjectGuid::Empty, true, go);
break;
case GO_ZIGGURAT2:
ziggurat2GUID = go->GetGUID();
if (GetData(TYPE_NERUB) == IN_PROGRESS)
if (GetBossState(BOSS_NERUB_ENKAN) == DONE)
HandleGameObject(ObjectGuid::Empty, true, go);
break;
case GO_ZIGGURAT3:
ziggurat3GUID = go->GetGUID();
if (GetData(TYPE_PALLID) == IN_PROGRESS)
if (GetBossState(BOSS_MALEKI_THE_PALLID) == DONE)
HandleGameObject(ObjectGuid::Empty, true, go);
break;
case GO_ZIGGURAT4:
ziggurat4GUID = go->GetGUID();
if (GetData(TYPE_BARON) == DONE || GetData(TYPE_RAMSTEIN) == DONE)
if (GetBossState(BOSS_RIVENDARE) == DONE || GetBossState(BOSS_RAMSTEIN_THE_GORGER) == DONE)
HandleGameObject(ObjectGuid::Empty, true, go);
break;
case GO_ZIGGURAT5:
ziggurat5GUID = go->GetGUID();
if (GetData(TYPE_BARON) == DONE || GetData(TYPE_RAMSTEIN) == DONE)
if (GetBossState(BOSS_RIVENDARE) == DONE || GetBossState(BOSS_RAMSTEIN_THE_GORGER) == DONE)
HandleGameObject(ObjectGuid::Empty, true, go);
break;
case GO_PORT_GAUNTLET:
portGauntletGUID = go->GetGUID();
if (GetData(TYPE_BARONESS) == IN_PROGRESS && GetData(TYPE_NERUB) == IN_PROGRESS && GetData(TYPE_PALLID) == IN_PROGRESS)
if (brokenCrystals >= 3)
HandleGameObject(ObjectGuid::Empty, true, go);
break;
case GO_PORT_SLAUGTHER:
portSlaugtherGUID = go->GetGUID();
if (GetData(TYPE_BARONESS) == IN_PROGRESS && GetData(TYPE_NERUB) == IN_PROGRESS && GetData(TYPE_PALLID) == IN_PROGRESS)
if (brokenCrystals >= 3)
HandleGameObject(ObjectGuid::Empty, true, go);
break;
case GO_PORT_ELDERS:
@@ -318,6 +332,72 @@ class instance_stratholme : public InstanceMapScript
}
}
bool SetBossState(uint32 id, EncounterState state) override
{
if (!InstanceScript::SetBossState(id, state))
return false;
switch (id)
{
case BOSS_BARONESS_ANASTARI:
if (state == DONE)
{
HandleGameObject(ziggurat1GUID, true);
//remove when crystals implemented
++brokenCrystals;
StartSlaugtherSquare();
}
break;
case BOSS_NERUB_ENKAN:
if (state == DONE)
{
HandleGameObject(ziggurat2GUID, true);
//remove when crystals implemented
++brokenCrystals;
StartSlaugtherSquare();
}
break;
case BOSS_MALEKI_THE_PALLID:
if (state == DONE)
{
HandleGameObject(ziggurat3GUID, true);
//remove when crystals implemented
++brokenCrystals;
StartSlaugtherSquare();
}
break;
case BOSS_RAMSTEIN_THE_GORGER:
if (state == NOT_STARTED)
HandleGameObject(portGauntletGUID, true);
if (state == DONE)
{
events.ScheduleEvent(EVENT_SLAUGHTER_SQUARE, 1min);
TC_LOG_DEBUG("scripts", "Instance Stratholme: Slaugther event will continue in 1 minute.");
}
break;
case BOSS_RIVENDARE:
HandleGameObject(ziggurat4GUID, GetBossState(BOSS_RAMSTEIN_THE_GORGER) == DONE && state != IN_PROGRESS);
HandleGameObject(ziggurat5GUID, GetBossState(BOSS_RAMSTEIN_THE_GORGER) == DONE && state != IN_PROGRESS);
if (state == DONE)
{
HandleGameObject(portGauntletGUID, true);
if (GetData(TYPE_BARON_RUN) == IN_PROGRESS)
DoRemoveAurasDueToSpellOnPlayers(SPELL_BARON_ULTIMATUM);
SetData(TYPE_BARON_RUN, DONE);
}
break;
default:
break;
}
return true;
}
void SetData(uint32 type, uint32 data) override
{
switch (type)
@@ -326,9 +406,9 @@ class instance_stratholme : public InstanceMapScript
switch (data)
{
case IN_PROGRESS:
if (EncounterState[0] == IN_PROGRESS || EncounterState[0] == FAIL)
if (baronRunState == IN_PROGRESS || baronRunState == FAIL)
break;
EncounterState[0] = data;
baronRunState = IN_PROGRESS;
events.ScheduleEvent(EVENT_BARON_RUN, 45min);
TC_LOG_DEBUG("scripts", "Instance Stratholme: Baron run in progress.");
break;
@@ -336,10 +416,10 @@ class instance_stratholme : public InstanceMapScript
DoRemoveAurasDueToSpellOnPlayers(SPELL_BARON_ULTIMATUM);
if (Creature* ysida = instance->GetCreature(ysidaGUID))
ysida->CastSpell(ysida, SPELL_PERM_FEIGN_DEATH, true);
EncounterState[0] = data;
baronRunState = FAIL;
break;
case DONE:
EncounterState[0] = data;
baronRunState = DONE;
if (Creature* ysida = instance->GetCreature(ysidaGUID))
{
@@ -374,33 +454,6 @@ class instance_stratholme : public InstanceMapScript
break;
}
break;
case TYPE_BARONESS:
EncounterState[1] = data;
if (data == IN_PROGRESS)
{
HandleGameObject(ziggurat1GUID, true);
//change to DONE when crystals implemented
StartSlaugtherSquare();
}
break;
case TYPE_NERUB:
EncounterState[2] = data;
if (data == IN_PROGRESS)
{
HandleGameObject(ziggurat2GUID, true);
//change to DONE when crystals implemented
StartSlaugtherSquare();
}
break;
case TYPE_PALLID:
EncounterState[3] = data;
if (data == IN_PROGRESS)
{
HandleGameObject(ziggurat3GUID, true);
//change to DONE when crystals implemented
StartSlaugtherSquare();
}
break;
case TYPE_RAMSTEIN:
if (data == IN_PROGRESS)
{
@@ -425,37 +478,6 @@ class instance_stratholme : public InstanceMapScript
else
TC_LOG_DEBUG("scripts", "Instance Stratholme: {} Abomnation left to kill.", count);
}
if (data == NOT_STARTED)
HandleGameObject(portGauntletGUID, true);
if (data == DONE)
{
events.ScheduleEvent(EVENT_SLAUGHTER_SQUARE, 1min);
TC_LOG_DEBUG("scripts", "Instance Stratholme: Slaugther event will continue in 1 minute.");
}
EncounterState[4] = data;
break;
case TYPE_BARON:
if (data == IN_PROGRESS)
{
HandleGameObject(ziggurat4GUID, false);
HandleGameObject(ziggurat5GUID, false);
}
if (data == DONE || data == NOT_STARTED)
{
HandleGameObject(ziggurat4GUID, true);
HandleGameObject(ziggurat5GUID, true);
}
if (data == DONE)
{
HandleGameObject(portGauntletGUID, true);
if (GetData(TYPE_BARON_RUN) == IN_PROGRESS)
DoRemoveAurasDueToSpellOnPlayers(SPELL_BARON_ULTIMATUM);
SetData(TYPE_BARON_RUN, DONE);
}
EncounterState[5] = data;
break;
case TYPE_SH_AELMAR:
IsSilverHandDead[0] = (data) ? true : false;
@@ -472,47 +494,9 @@ class instance_stratholme : public InstanceMapScript
case TYPE_SH_VICAR:
IsSilverHandDead[4] = (data) ? true : false;
break;
default:
break;
}
if (data == DONE)
SaveToDB();
}
std::string GetSaveData() override
{
OUT_SAVE_INST_DATA;
std::ostringstream saveStream;
saveStream << EncounterState[0] << ' ' << EncounterState[1] << ' ' << EncounterState[2] << ' '
<< EncounterState[3] << ' ' << EncounterState[4] << ' ' << EncounterState[5];
OUT_SAVE_INST_DATA_COMPLETE;
return saveStream.str();
}
void Load(char const* in) override
{
if (!in)
{
OUT_LOAD_INST_DATA_FAIL;
return;
}
OUT_LOAD_INST_DATA(in);
std::istringstream loadStream(in);
loadStream >> EncounterState[0] >> EncounterState[1] >> EncounterState[2] >> EncounterState[3]
>> EncounterState[4] >> EncounterState[5];
// Do not reset 1, 2 and 3. they are not set to done, yet .
if (EncounterState[0] == IN_PROGRESS)
EncounterState[0] = NOT_STARTED;
if (EncounterState[4] == IN_PROGRESS)
EncounterState[4] = NOT_STARTED;
if (EncounterState[5] == IN_PROGRESS)
EncounterState[5] = NOT_STARTED;
OUT_LOAD_INST_DATA_COMPLETE;
}
uint32 GetData(uint32 type) const override
@@ -524,17 +508,19 @@ class instance_stratholme : public InstanceMapScript
return 1;
return 0;
case TYPE_BARON_RUN:
return EncounterState[0];
return baronRunState;
case TYPE_BARONESS:
return EncounterState[1];
return GetBossState(BOSS_BARONESS_ANASTARI);
case TYPE_NERUB:
return EncounterState[2];
return GetBossState(BOSS_NERUB_ENKAN);
case TYPE_PALLID:
return EncounterState[3];
return GetBossState(BOSS_MALEKI_THE_PALLID);
case TYPE_RAMSTEIN:
return EncounterState[4];
return GetBossState(BOSS_RAMSTEIN_THE_GORGER);
case TYPE_BARON:
return EncounterState[5];
return GetBossState(BOSS_RIVENDARE);
default:
break;
}
return 0;
}
@@ -549,6 +535,8 @@ class instance_stratholme : public InstanceMapScript
return ysidaTriggerGUID;
case NPC_YSIDA:
return ysidaGUID;
default:
break;
}
return ObjectGuid::Empty;
}
@@ -611,6 +599,18 @@ class instance_stratholme : public InstanceMapScript
}
}
}
void ReadSaveDataMore(std::istringstream& /*data*/) override
{
if (GetBossState(BOSS_BARONESS_ANASTARI) == DONE)
++brokenCrystals;
if (GetBossState(BOSS_NERUB_ENKAN) == DONE)
++brokenCrystals;
if (GetBossState(BOSS_MALEKI_THE_PALLID) == DONE)
++brokenCrystals;
baronRunState = FAIL;
}
};
InstanceScript* GetInstanceScript(InstanceMap* map) const override

View File

@@ -23,6 +23,26 @@
#define StratholmeScriptName "instance_stratholme"
#define DataHeader "STR"
enum STRBossIds
{
BOSS_HEARTHSINGER_FORRESTEN = 0,
BOSS_TIMMY_THE_CRUEL = 1,
BOSS_COMMANDER_MALOR = 2,
BOSS_CANNON_MASTER_WILLEY = 3,
BOSS_INSTRUCTOR_GALFORD = 4,
BOSS_BALNAZZAR = 5,
BOSS_THE_UNFORGIVEN = 6,
BOSS_BARONESS_ANASTARI = 7,
BOSS_NERUB_ENKAN = 8,
BOSS_MALEKI_THE_PALLID = 9,
BOSS_MAGISTRATE_BARTHILAS = 10,
BOSS_RAMSTEIN_THE_GORGER = 11,
BOSS_RIVENDARE = 12,
BOSS_POSTMASTER_MALOWN = 13,
MAX_ENCOUNTER
};
enum STRDataTypes
{
TYPE_BARON_RUN = 1,
@@ -32,8 +52,6 @@ enum STRDataTypes
TYPE_RAMSTEIN = 5,
TYPE_BARON = 6,
TYPE_MALOWN = 7,
DATA_BARON = 10,
DATA_YSIDA_TRIGGER = 11,
@@ -47,6 +65,11 @@ enum STRDataTypes
enum STRCreatureIds
{
NPC_HEARTHSINGER_FORRESTEN = 10558,
NPC_COMMANDER_MALOR = 11032,
NPC_INSTRUCTOR_GALFORD = 10811,
NPC_THE_UNFORGIVEN = 10516,
NPC_CRYSTAL = 10415, // ziggurat crystal
NPC_BARON = 10440, // ziggurat crystal
NPC_YSIDA_TRIGGER = 16100, // ziggurat crystal
@@ -106,7 +129,6 @@ enum STRMisc
{
//! amount of crusade monsters required to be killed in order for timmy the cruel to spawn
TIMMY_THE_CRUEL_CRUSADERS_REQUIRED = 15,
MAX_ENCOUNTER = 6
};
template <class AI, class T>