Scripts/Arcatraz: Rewrite Mellichar's event (#31081)

This commit is contained in:
offl
2025-07-22 22:26:15 +03:00
committed by GitHub
parent cfa9fb701a
commit 4dece3fe4e
6 changed files with 709 additions and 508 deletions

File diff suppressed because it is too large Load Diff

View File

@@ -31,7 +31,7 @@ enum AZDataTypes
DATA_ZEREKETH = 0,
DATA_DALLIAH = 1,
DATA_SOCCOTHRATES = 2,
DATA_HARBINGER_SKYRISS = 3,
DATA_HARBINGER_SKYRISS = 3, // used by SmartAI
// Additional Data
DATA_CONVERSATION = 4,
@@ -40,16 +40,20 @@ enum AZDataTypes
DATA_WARDEN_3 = 7, // used by SmartAI
DATA_WARDEN_4 = 8, // used by SmartAI
DATA_WARDEN_5 = 9, // used by SmartAI
DATA_MELLICHAR = 10,
DATA_WARDENS_SHIELD = 11
DATA_MELLICHAR,
DATA_WARDENS_SHIELD,
DATA_STASIS_POD_ALPHA,
DATA_STASIS_POD_BETA,
DATA_STASIS_POD_DELTA,
DATA_STASIS_POD_GAMMA,
DATA_STASIS_POD_OMEGA
};
enum AZCreatureIds
{
NPC_DALLIAH = 20885,
NPC_SOCCOTHRATES = 20886,
NPC_MELLICHAR = 20904, // skyriss will kill this unit
NPC_ALPHA_POD_TARGET = 21436,
NPC_MELLICHAR = 20904,
NPC_MILLHOUSE = 20977
};
@@ -70,6 +74,11 @@ enum AZSpellIds
SPELL_QID_10886 = 39564
};
enum AZMisc
{
ACTION_RESET_PRISON = 1
};
template <class AI, class T>
inline AI* GetArcatrazAI(T* obj)
{

View File

@@ -15,8 +15,6 @@
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
/* Need more docs on how event fully work. Reset all event and force start over if fail at one point? */
#include "ScriptMgr.h"
#include "SpellInfo.h"
#include "SpellScript.h"
@@ -29,7 +27,7 @@ enum SkyrissTexts
{
SAY_INTRO = 0,
SAY_AGGRO = 1,
SAY_KILL = 2,
SAY_SLAY = 2,
SAY_MIND = 3,
SAY_FEAR = 4,
SAY_IMAGE = 5,
@@ -50,7 +48,7 @@ enum SkyrissSpells
SPELL_SUMMON_66_ILLUSION = 36931,
SPELL_SUMMON_33_ILLUSION = 36932,
// Illusion
SPELL_BIRTH = 26262,
SPELL_BLINK_VISUAL = 36937,
SPELL_66_HEALTH = 36928,
@@ -66,7 +64,11 @@ enum SkyrissEvents
EVENT_DOMINATION,
EVENT_MANA_BURN,
EVENT_SUMMON_66,
EVENT_SUMMON_33
EVENT_SUMMON_33,
EVENT_INTRO_1,
EVENT_INTRO_2,
EVENT_INTRO_3
};
enum SkyrissMisc
@@ -85,25 +87,17 @@ enum SkyrissPhases : uint8
// 20912 - Harbinger Skyriss
struct boss_harbinger_skyriss : public BossAI
{
boss_harbinger_skyriss(Creature* creature) : BossAI(creature, DATA_HARBINGER_SKYRISS), _intro(false), _phase(PHASE_NONE) { }
boss_harbinger_skyriss(Creature* creature) : BossAI(creature, DATA_HARBINGER_SKYRISS), _phase(PHASE_NONE) { }
void Initialize()
void JustAppeared() override
{
Intro_Phase = 1;
Intro_Timer = 5000;
events.ScheduleEvent(EVENT_INTRO_1, 0s);
}
uint32 Intro_Phase;
uint32 Intro_Timer;
void Reset() override
{
DoCastSelf(SPELL_SIMPLE_TELEPORT);
_Reset();
_intro = false;
_phase = PHASE_NONE;
me->SetImmuneToAll(!_intro);
Initialize();
}
void JustEngagedWith(Unit* who) override
@@ -132,13 +126,9 @@ struct boss_harbinger_skyriss : public BossAI
}
}
void KilledUnit(Unit* victim) override
void KilledUnit(Unit* /*victim*/) override
{
// Won't yell killing pet/other unit
if (victim->GetEntry() == NPC_ALPHA_POD_TARGET)
return;
Talk(SAY_KILL);
Talk(SAY_SLAY);
}
void DamageTaken(Unit* /*killer*/, uint32& damage, DamageEffectType /*damageType*/, SpellInfo const* /*spellInfo = nullptr*/) override
@@ -163,42 +153,34 @@ struct boss_harbinger_skyriss : public BossAI
void UpdateAI(uint32 diff) override
{
if (!_intro)
if (!UpdateVictim())
{
if (Intro_Timer <= diff)
events.Update(diff);
while (uint32 eventId = events.ExecuteEvent())
{
switch (Intro_Phase)
switch (eventId)
{
case 1:
Talk(SAY_INTRO);
instance->HandleGameObject(instance->GetGuidData(DATA_WARDENS_SHIELD), true);
++Intro_Phase;
Intro_Timer = 25000;
break;
case 2:
Talk(SAY_AGGRO);
if (Unit* mellic = ObjectAccessor::GetUnit(*me, instance->GetGuidData(DATA_MELLICHAR)))
{
//should have a better way to do this. possibly spell exist.
mellic->setDeathState(JUST_DIED);
mellic->SetHealth(0);
instance->HandleGameObject(instance->GetGuidData(DATA_WARDENS_SHIELD), false);
}
++Intro_Phase;
Intro_Timer = 3000;
break;
case 3:
me->SetImmuneToAll(false);
_intro = true;
break;
case EVENT_INTRO_1:
Talk(SAY_INTRO);
DoCastSelf(SPELL_SIMPLE_TELEPORT);
events.ScheduleEvent(EVENT_INTRO_2, 30s);
break;
case EVENT_INTRO_2:
Talk(SAY_AGGRO);
DoCastSelf(SPELL_MIND_REND_COSMETIC);
events.ScheduleEvent(EVENT_INTRO_3, 2s);
break;
case EVENT_INTRO_3:
me->SetImmuneToAll(false);
DoZoneInCombat();
break;
default:
break;
}
}
else
Intro_Timer -=diff;
}
if (!UpdateVictim())
return;
}
events.Update(diff);
@@ -251,7 +233,6 @@ struct boss_harbinger_skyriss : public BossAI
}
private:
bool _intro;
uint8 _phase;
};

View File

@@ -18,6 +18,7 @@
#include "ScriptMgr.h"
#include "arcatraz.h"
#include "Creature.h"
#include "CreatureAI.h"
#include "GameObject.h"
#include "InstanceScript.h"
#include "Map.h"
@@ -29,6 +30,23 @@ DoorData const doorData[] =
{ 0, 0, DOOR_TYPE_ROOM } // END
};
ObjectData const creatureData[] =
{
{ NPC_MELLICHAR, DATA_MELLICHAR },
{ 0, 0 } // END
};
ObjectData const gameObjectData[] =
{
{ GO_STASIS_POD_ALPHA, DATA_STASIS_POD_ALPHA },
{ GO_STASIS_POD_BETA, DATA_STASIS_POD_BETA },
{ GO_STASIS_POD_DELTA, DATA_STASIS_POD_DELTA },
{ GO_STASIS_POD_GAMMA, DATA_STASIS_POD_GAMMA },
{ GO_STASIS_POD_OMEGA, DATA_STASIS_POD_OMEGA },
{ GO_WARDENS_SHIELD, DATA_WARDENS_SHIELD },
{ 0, 0 } //END
};
class instance_arcatraz : public InstanceMapScript
{
public:
@@ -41,6 +59,7 @@ class instance_arcatraz : public InstanceMapScript
SetHeaders(DataHeader);
SetBossNumber(EncounterCount);
LoadDoorData(doorData);
LoadObjectData(creatureData, gameObjectData);
ConversationState = NOT_STARTED;
@@ -59,9 +78,6 @@ class instance_arcatraz : public InstanceMapScript
case NPC_SOCCOTHRATES:
SoccothratesGUID = creature->GetGUID();
break;
case NPC_MELLICHAR:
MellicharGUID = creature->GetGUID();
break;
case NPC_MILLHOUSE:
MillhouseGUID = creature->GetGUID();
break;
@@ -70,35 +86,6 @@ class instance_arcatraz : public InstanceMapScript
}
}
void OnGameObjectCreate(GameObject* go) override
{
InstanceScript::OnGameObjectCreate(go);
switch (go->GetEntry())
{
case GO_STASIS_POD_ALPHA:
StasisPodGUIDs[0] = go->GetGUID();
break;
case GO_STASIS_POD_BETA:
StasisPodGUIDs[1] = go->GetGUID();
break;
case GO_STASIS_POD_DELTA:
StasisPodGUIDs[2] = go->GetGUID();
break;
case GO_STASIS_POD_GAMMA:
StasisPodGUIDs[3] = go->GetGUID();
break;
case GO_STASIS_POD_OMEGA:
StasisPodGUIDs[4] = go->GetGUID();
break;
case GO_WARDENS_SHIELD:
WardensShieldGUID = go->GetGUID();
break;
default:
break;
}
}
void SetData(uint32 type, uint32 data) override
{
switch (type)
@@ -108,8 +95,6 @@ class instance_arcatraz : public InstanceMapScript
case DATA_WARDEN_3:
case DATA_WARDEN_4:
case DATA_WARDEN_5:
if (data == IN_PROGRESS)
HandleGameObject(StasisPodGUIDs[type - DATA_WARDEN_1], true);
StasisPodStates[type - DATA_WARDEN_1] = uint8(data);
break;
case DATA_CONVERSATION:
@@ -146,10 +131,6 @@ class instance_arcatraz : public InstanceMapScript
return DalliahGUID;
case DATA_SOCCOTHRATES:
return SoccothratesGUID;
case DATA_MELLICHAR:
return MellicharGUID;
case DATA_WARDENS_SHIELD:
return WardensShieldGUID;
default:
break;
}
@@ -172,7 +153,7 @@ class instance_arcatraz : public InstanceMapScript
SetData(DATA_WARDEN_4, NOT_STARTED);
SetData(DATA_WARDEN_5, NOT_STARTED);
}
else if (state == DONE)
if (state == DONE)
{
if (!instance->IsHeroic())
break;
@@ -181,6 +162,11 @@ class instance_arcatraz : public InstanceMapScript
if (millhouse->IsAlive())
DoCastSpellOnPlayers(SPELL_QID_10886);
}
if (state == FAIL)
{
if (Creature* mellichar = GetCreature(DATA_MELLICHAR))
mellichar->AI()->DoAction(ACTION_RESET_PRISON);
}
break;
default:
break;
@@ -191,9 +177,6 @@ class instance_arcatraz : public InstanceMapScript
protected:
ObjectGuid DalliahGUID;
ObjectGuid SoccothratesGUID;
ObjectGuid StasisPodGUIDs[5];
ObjectGuid MellicharGUID;
ObjectGuid WardensShieldGUID;
ObjectGuid MillhouseGUID;
uint8 ConversationState;