mirror of
https://github.com/TrinityCore/TrinityCore.git
synced 2026-01-30 21:57:01 +01:00
Scripts/Arcatraz: Rewrite Mellichar's event (#31081)
This commit is contained in:
File diff suppressed because it is too large
Load Diff
@@ -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)
|
||||
{
|
||||
|
||||
@@ -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;
|
||||
};
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user