Scripts/ZA: rewrite Zul'Aman intro script

*todo: Amani'shi Savages need to run upstairs
This commit is contained in:
Ovahlord
2019-03-16 14:00:14 +01:00
parent 1878beca7a
commit 957429caed
4 changed files with 405 additions and 110 deletions

View File

@@ -0,0 +1,15 @@
UPDATE `creature_template` SET `ScriptName`= 'npc_zulaman_amanishi_guardian' WHERE `entry`= 23597;
UPDATE `creature_template_addon` SET `mount`= 29261 WHERE `entry`= 52924; -- 52924 (Vol'jin)
DELETE FROM `creature_text` WHERE `CreatureID` IN (52924, 23597);
INSERT INTO `creature_text` (`CreatureID`, `GroupID`, `ID`, `Text`, `Type`, `Language`, `Probability`, `Emote`, `Duration`, `Sound`, `BroadcastTextId`, `comment`) VALUES
-- Vol'jin
(52924, 0, 0, 'Follow me, $c. It be takin'' da both of us to open these gates.', 14, 0, 100, 1, 0, 0, 51504, 'Vol\'jin - Intro 1'),
(52924, 1, 0, 'Da ritual to open da gates be requirin'' both of us to hit da gong together.', 14, 0, 100, 1, 0, 0, 51506, 'Vol\'jin - Intro 2'),
(52924, 2, 0, 'Hear me, Zandalari schemers... Da Darkspears and our allies will deny you rulership of da Amani!', 14, 0, 100, 25, 0, 0, 51517, 'Vol\'jin - Intro 3'),
(52924, 3, 0, 'Da Amani know we''re here. Now is da time to attack!', 14, 0, 100, 5, 0, 0, 51519, 'Vol\'jin - Intro 4'),
(52924, 4, 0, 'Perhaps we''re not ready yet. Speak to me again when you be wantin'' to open da gates.', 14, 0, 100, 1, 0, 0, 51508, 'Vol\'jin - Fail Intro'),
(52924, 5, 0, 'Hear me, Rastakhan! Wherever ya and your Zandalari be schemin'' to rule da troll people, ya be findin'' da Darkspear and our allies standin'' against ya!', 12, 0, 100, 1, 0, 0, 51658, 'Vol\'jin - Daakara Death'),
-- Amani Guardian
(23597, 0, 0, 'More intruders! Sound da alarm!', 14, 0, 100, 25, 0, 12104, 23252, 'Amani''Shi Guardian - Intro'),
(23597, 1, 0, '%s goes into a frenzy!', 16, 0, 100, 0, 0, 0, 36719, 'Amani''Shi Guardian - Enrage');

View File

@@ -35,13 +35,16 @@ ObjectData const creatureData[] =
{ 0, 0 } // END
};
ObjectData const cameobjectData[] =
ObjectData const gameobjectData[] =
{
{ GO_STRANGE_GONG, DATA_STRANGE_GONG },
{ GO_MASSIVE_GATE, DATA_MASSIVE_GATE },
{ 0, 0 } // END
};
Position const AmanishiGuardianDistanceCheckPos = { 120.223f, 1585.766f, 43.43f };
Position const AmanishiSavageDistanceCheckPos = { 122.176f, 1528.203f, 21.233f };
class instance_zulaman : public InstanceMapScript
{
public:
@@ -53,7 +56,7 @@ public:
{
SetHeaders(DataHeader);
SetBossNumber(EncounterCount);
LoadObjectData(creatureData, cameobjectData);
LoadObjectData(creatureData, gameobjectData);
_remainingSpeedRunTime = 0;
_speedRunState = NOT_STARTED;
}
@@ -66,15 +69,27 @@ public:
void OnCreatureCreate(Creature* creature) override
{
/*
InstanceScript::OnCreatureCreate(creature);
switch (creature->GetEntry())
{
case NPC_AMANISHI_GUARDIAN:
if (creature->GetExactDist2d(AmanishiGuardianDistanceCheckPos) < 30.0f)
_amanishiGuardianGUIDs.push_back(creature->GetGUID());
break;
case NPC_AMANISHI_SAVAGE:
if (creature->GetExactDist2d(AmanishiSavageDistanceCheckPos) < 100.0f)
_amanishiSavageGUIDs.push_back(creature->GetGUID());
break;
default:
break;
}
*/
}
void OnGameObjectCreate(GameObject* go) override
{
InstanceScript::OnGameObjectCreate(go);
switch (go->GetEntry())
{
case GO_MASSIVE_GATE:
@@ -100,7 +115,6 @@ public:
switch (type)
{
case DATA_ZULAMAN_SPEEDRUN_STATE:
{
if (data == IN_PROGRESS)
{
_remainingSpeedRunTime = 15;
@@ -111,7 +125,14 @@ public:
SaveToDB();
}
break;
}
case DATA_TRIGGER_AMANISHI_GUARDIANS:
for (ObjectGuid guid : _amanishiGuardianGUIDs)
{
if (Creature* guardian = instance->GetCreature(guid))
if (guardian->IsAIEnabled)
guardian->AI()->DoAction(ACTION_ALERT_AMANISHI_GUARDIANS);
}
break;
default:
break;
}
@@ -146,12 +167,10 @@ public:
{
switch (eventId)
{
case EVENT_START_ZULAMAN:
case EVENT_RIUAL_OF_POWER:
if (Creature* voljin = GetCreature(DATA_VOLJIN))
{
if (voljin->IsAIEnabled)
voljin->AI()->DoAction(ACTION_START_ZULAMAN);
}
voljin->AI()->DoAction(ACTION_OPEN_MASSIVE_GATES);
break;
default:
break;
@@ -208,6 +227,8 @@ public:
protected:
EventMap events;
GuidVector _amanishiGuardianGUIDs;
GuidVector _amanishiSavageGUIDs;
uint32 _remainingSpeedRunTime;
uint32 _speedRunState;
};

View File

@@ -17,6 +17,7 @@
#include "ScriptMgr.h"
#include "CreatureTextMgr.h"
#include "ScriptedEscortAI.h"
#include "GameObject.h"
#include "InstanceScript.h"
#include "MotionMaster.h"
@@ -27,157 +28,237 @@
#include "SpellScript.h"
#include "zulaman.h"
enum Says
enum VoljinTexts
{
// Vol'jin
SAY_INTRO_1 = 0,
SAY_INTRO_2 = 1,
SAY_INTRO_3 = 2,
SAY_INTRO_4 = 3,
SAY_INTRO_FAIL = 4,
SAY_INTRO_1 = 0,
SAY_INTRO_2 = 1,
SAY_INTRO_3 = 2,
SAY_INTRO_4 = 3,
SAY_FAIL_GONG_EVENT = 4,
// Hex Lord Malacrass
SAY_HEXLOR_INTRO = 0
SAY_HEXLOR_INTRO = 0
};
enum Spells
enum VoljinSpells
{
// Vol'jin
SPELL_BANGING_THE_GONG = 45225
SPELL_BANGING_THE_GONG = 45225
};
enum Events
enum VoljinEvents
{
EVENT_INTRO_MOVEPOINT_1 = 1,
EVENT_INTRO_MOVEPOINT_2 = 2,
EVENT_INTRO_MOVEPOINT_3 = 3,
EVENT_BANGING_THE_GONG = 4,
EVENT_START_DOOR_OPENING_1 = 5,
EVENT_START_DOOR_OPENING_2 = 6,
EVENT_START_DOOR_OPENING_3 = 7,
EVENT_START_DOOR_OPENING_4 = 8,
EVENT_START_DOOR_OPENING_5 = 9,
EVENT_START_DOOR_OPENING_6 = 10,
EVENT_START_DOOR_OPENING_7 = 11
EVENT_DISMOUNT_VOLJIN = 1,
EVENT_REMOVE_GOSSIP_FLAG,
EVENT_SAY_FOLLOW_ME,
EVENT_MOVE_TO_GONG_1,
EVENT_MOVE_TO_GONG_2,
EVENT_FACE_TO_GONG,
EVENT_SAY_GONG_INSTRUCTIONS,
EVENT_BANGING_THE_GONG,
EVENT_MAKE_GONG_SELECTABLE,
EVENT_FAIL_GONG_EVENT,
EVENT_MOVE_TO_ROOM_CENTER,
EVENT_MOVE_HOME,
EVENT_FACE_HOME,
EVENT_RESET_NPC_FLAGS,
EVENT_MOVE_TO_CENTER,
EVENT_MAKE_GONG_UNSELECTABLE,
EVENT_TALK_TO_AMANI,
EVENT_OPEN_MASSIVE_GATE,
EVENT_TALK_WARN_PLAYERS,
EVENT_START_SPEED_RUN
};
enum Points
enum VoljinMovePoints
{
POINT_INTRO = 1,
POINT_STRANGE_GONG = 2,
POINT_START_DOOR_OPENING_1 = 3,
POINT_START_DOOR_OPENING_2 = 4
POINT_HOME = 1,
POINT_INTRO_1 = 2,
POINT_INTRO_2 = 3,
POINT_INTRO_3 = 4
};
enum Misc
enum VoljinMisc
{
ITEM_VIRTUAL_ITEM = 5301
ITEM_DISPLAY_ID_MACE = 5301,
MOUNT_DISPLAY_ID_RAPTOR = 29261
};
Position const VoljinIntroWaypoint[4] =
{
{ 117.7349f, 1662.77f, 42.02156f, 0.0f },
{ 132.14f, 1645.143f, 42.02158f, 0.0f },
{ 117.7349f, 1662.77f, 42.02156f, 0.0f },
{ 132.14f, 1645.143f, 42.02158f, 0.0f },
{ 121.8901f, 1639.118f, 42.23253f, 0.0f },
{ 122.618f, 1639.546f, 42.11659f, 0.0f },
{ 122.618f, 1639.546f, 42.11659f, 0.0f }
};
Position const VoljinIntroPosition1 = { 117.7349f, 1662.77f, 42.02156f };
Position const VoljinIntroPosition2 = { 132.14f, 1645.143f, 42.02158f };
Position const VoljinIntroPosition3 = { 122.6202f, 1639.547f, 42.16251f };
Position const VoljinHomePosition = { 121.0399f, 1672.196f, 42.02157f };
struct npc_zulaman_voljin : public ScriptedAI
{
npc_zulaman_voljin(Creature* creature) : ScriptedAI(creature), _instance(creature->GetInstanceScript())
npc_zulaman_voljin(Creature* creature) : ScriptedAI(creature), _instance(me->GetInstanceScript())
{
Initialize();
}
void Initialize()
{
_gongCount = 0;
_restarted = false;
_started = false;
_actionTriggered = false;
me->SetDisplayId(me->GetCreatureTemplate()->Modelid1);
if (_instance->GetData(DATA_ZULAMAN_SPEEDRUN_STATE) == NOT_STARTED)
me->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP);
if (_instance->GetData(DATA_ZULAMAN_SPEEDRUN_STATE) != NOT_STARTED)
me->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP);
}
bool GossipSelect(Player* player, uint32 menuId, uint32 gossipListId) override
bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 /*gossipListId*/) override
{
if (_instance->GetData(DATA_ZULAMAN_SPEEDRUN_STATE) != NOT_STARTED)
if (_started)
return true;
if (me->GetCreatureTemplate()->GossipMenuId == menuId && !gossipListId)
_playerGUID = player->GetGUID();
me->SetWalk(true);
if (!_restarted)
{
_events.Reset();
me->SetUInt32Value(UNIT_FIELD_MOUNTDISPLAYID, 0);
me->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP);
me->SetUInt32Value(UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_NONE);
_events.ScheduleEvent(EVENT_INTRO_MOVEPOINT_1, 1000);
Talk(SAY_INTRO_1, player);
me->SetWalk(true);
_events.ScheduleEvent(EVENT_DISMOUNT_VOLJIN, 1s);
_events.ScheduleEvent(EVENT_REMOVE_GOSSIP_FLAG, 3s);
_events.ScheduleEvent(EVENT_SAY_FOLLOW_ME, 4s);
}
else
{
_events.ScheduleEvent(EVENT_REMOVE_GOSSIP_FLAG, 1s + 400ms);
_events.ScheduleEvent(EVENT_SAY_FOLLOW_ME, 2s + 400ms);
}
player->PlayerTalkClass->SendCloseGossip();
_started = true;
return true;
}
void DoAction(int32 action) override
{
if (action == ACTION_START_ZULAMAN)
switch (action)
{
if (++_gongCount == 10)
_events.ScheduleEvent(EVENT_START_DOOR_OPENING_1, 500);
case ACTION_OPEN_MASSIVE_GATES:
if (!_actionTriggered)
{
_events.CancelEvent(EVENT_FAIL_GONG_EVENT);
_events.ScheduleEvent(EVENT_MOVE_TO_CENTER, 1s);
_actionTriggered = true;
}
break;
default:
break;
}
}
void UpdateAI(uint32 diff) override
{
_events.Update(diff);
while (uint32 eventId = _events.ExecuteEvent())
{
switch (eventId)
{
case EVENT_INTRO_MOVEPOINT_1:
me->GetMotionMaster()->MovePoint(POINT_INTRO, VoljinIntroWaypoint[0]);
_events.ScheduleEvent(EVENT_INTRO_MOVEPOINT_2, 1000);
case EVENT_DISMOUNT_VOLJIN:
me->SetUInt32Value(UNIT_FIELD_MOUNTDISPLAYID, 0);
break;
case EVENT_INTRO_MOVEPOINT_2:
me->GetMotionMaster()->MovePoint(POINT_STRANGE_GONG, VoljinIntroWaypoint[1]);
_events.ScheduleEvent(EVENT_INTRO_MOVEPOINT_3, 4000);
case EVENT_REMOVE_GOSSIP_FLAG:
me->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP);
break;
case EVENT_INTRO_MOVEPOINT_3:
case EVENT_SAY_FOLLOW_ME:
if (Player* player = ObjectAccessor::GetPlayer(*me, _playerGUID))
Talk(SAY_INTRO_1, player);
_events.ScheduleEvent(EVENT_MOVE_TO_GONG_1, 1s);
break;
case EVENT_MOVE_TO_GONG_1:
me->GetMotionMaster()->MovePoint(POINT_INTRO_1, VoljinIntroPosition1);
break;
case EVENT_MOVE_TO_GONG_2:
me->GetMotionMaster()->MovePoint(POINT_INTRO_2, VoljinIntroPosition2);
break;
case EVENT_FACE_TO_GONG:
if (GameObject* gong = _instance->GetGameObject(DATA_STRANGE_GONG))
me->SetFacingToObject(gong);
_events.ScheduleEvent(EVENT_SAY_GONG_INSTRUCTIONS, 1s + 400ms);
break;
case EVENT_SAY_GONG_INSTRUCTIONS:
Talk(SAY_INTRO_2);
_events.ScheduleEvent(EVENT_BANGING_THE_GONG, 3000);
_events.ScheduleEvent(EVENT_BANGING_THE_GONG, 2s + 100ms);
break;
case EVENT_BANGING_THE_GONG:
DoCast(me, SPELL_BANGING_THE_GONG);
if (GameObject* strangeGong = _instance->GetGameObject(DATA_STRANGE_GONG))
strangeGong->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
me->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID, uint32(ITEM_VIRTUAL_ITEM));
DoCastSelf(SPELL_BANGING_THE_GONG);
me->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + 0, ITEM_DISPLAY_ID_MACE);
_events.ScheduleEvent(EVENT_MAKE_GONG_SELECTABLE, 400ms);
_events.ScheduleEvent(EVENT_FAIL_GONG_EVENT, 1min + 3s);
break;
case EVENT_START_DOOR_OPENING_1:
me->RemoveAura(SPELL_BANGING_THE_GONG);
_events.ScheduleEvent(EVENT_START_DOOR_OPENING_2, 500);
case EVENT_MAKE_GONG_SELECTABLE:
if (GameObject* gong = _instance->GetGameObject(DATA_STRANGE_GONG))
gong->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
break;
case EVENT_START_DOOR_OPENING_2:
me->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID, uint32(0));
if (GameObject* strangeGong = _instance->GetGameObject(DATA_STRANGE_GONG))
strangeGong->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
_events.ScheduleEvent(EVENT_START_DOOR_OPENING_3, 500);
case EVENT_FAIL_GONG_EVENT:
if (GameObject* gong = _instance->GetGameObject(DATA_STRANGE_GONG))
gong->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
me->RemoveAurasDueToSpell(SPELL_BANGING_THE_GONG);
me->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + 0, 0);
Talk(SAY_FAIL_GONG_EVENT);
_events.ScheduleEvent(EVENT_MOVE_HOME, 2s + 200ms);
break;
case EVENT_START_DOOR_OPENING_3:
me->GetMotionMaster()->MovePoint(POINT_START_DOOR_OPENING_1, VoljinIntroWaypoint[2]);
case EVENT_MOVE_HOME:
me->GetMotionMaster()->MovePoint(POINT_HOME, VoljinHomePosition);
break;
case EVENT_START_DOOR_OPENING_4:
_instance->SetData(DATA_ZULAMAN_SPEEDRUN_STATE, IN_PROGRESS);
if (GameObject* masiveGate = _instance->GetGameObject(DATA_MASSIVE_GATE))
masiveGate->SetGoState(GO_STATE_ACTIVE);
_events.ScheduleEvent(EVENT_START_DOOR_OPENING_5, 3000);
case EVENT_FACE_HOME:
me->SetFacingTo(4.782202f);
if (!_actionTriggered)
{
_started = false;
_restarted = true;
_events.ScheduleEvent(EVENT_RESET_NPC_FLAGS, 400ms);
}
else
me->SetUInt32Value(UNIT_FIELD_MOUNTDISPLAYID, MOUNT_DISPLAY_ID_RAPTOR);
break;
case EVENT_START_DOOR_OPENING_5:
case EVENT_RESET_NPC_FLAGS:
me->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP | UNIT_NPC_FLAG_QUESTGIVER);
break;
case EVENT_MOVE_TO_CENTER:
_instance->SetData(DATA_TRIGGER_AMANISHI_GUARDIANS, IN_PROGRESS);
me->RemoveAurasDueToSpell(SPELL_BANGING_THE_GONG);
me->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + 0, 0);
me->GetMotionMaster()->MovePoint(POINT_INTRO_3, VoljinIntroPosition3);
_events.ScheduleEvent(EVENT_MAKE_GONG_UNSELECTABLE, 400ms);
break;
case EVENT_MAKE_GONG_UNSELECTABLE:
if (GameObject* gong = _instance->GetGameObject(DATA_STRANGE_GONG))
gong->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
break;
case EVENT_TALK_TO_AMANI:
me->SetFacingTo(4.747295f);
Talk(SAY_INTRO_3);
_events.ScheduleEvent(EVENT_OPEN_MASSIVE_GATE, 5s + 400ms);
_events.ScheduleEvent(EVENT_TALK_WARN_PLAYERS, 9s);
break;
case EVENT_OPEN_MASSIVE_GATE:
if (GameObject* gate = _instance->GetGameObject(DATA_MASSIVE_GATE))
gate->SetGoState(GO_STATE_ACTIVE);
break;
case EVENT_TALK_WARN_PLAYERS:
Talk(SAY_INTRO_4);
_events.ScheduleEvent(EVENT_START_DOOR_OPENING_6, 6000);
_events.ScheduleEvent(EVENT_MOVE_HOME, 4s + 500ms);
_events.ScheduleEvent(EVENT_START_SPEED_RUN, 12s);
break;
case EVENT_START_DOOR_OPENING_6:
_events.ScheduleEvent(EVENT_START_DOOR_OPENING_7, 6000);
break;
case EVENT_START_DOOR_OPENING_7:
if (Creature* hexLordTrigger = _instance->GetCreature(DATA_HEXLORD_MALACRASS_TRIGGER))
sCreatureTextMgr->SendChat(hexLordTrigger, SAY_HEXLOR_INTRO, 0, CHAT_MSG_ADDON, LANG_ADDON, TEXT_RANGE_MAP);
case EVENT_START_SPEED_RUN:
_instance->SetData(DATA_ZULAMAN_SPEEDRUN_STATE, IN_PROGRESS);
break;
default:
break;
@@ -192,15 +273,17 @@ struct npc_zulaman_voljin : public ScriptedAI
switch (pointId)
{
case POINT_STRANGE_GONG:
if (GameObject* strangeGong = _instance->GetGameObject(DATA_STRANGE_GONG))
me->SetFacingToObject(strangeGong); // setInFront
case POINT_HOME:
_events.ScheduleEvent(EVENT_FACE_HOME, 1ms);
break;
case POINT_START_DOOR_OPENING_1:
me->SetFacingTo(4.747295f);
me->GetMotionMaster()->MovePoint(POINT_START_DOOR_OPENING_2, VoljinIntroWaypoint[3]);
Talk(SAY_INTRO_3);
_events.ScheduleEvent(EVENT_START_DOOR_OPENING_4, 4500);
case POINT_INTRO_1:
_events.ScheduleEvent(EVENT_MOVE_TO_GONG_2, 1ms);
break;
case POINT_INTRO_2:
_events.ScheduleEvent(EVENT_FACE_TO_GONG, 800ms);
break;
case POINT_INTRO_3:
_events.ScheduleEvent(EVENT_TALK_TO_AMANI, 1ms);
break;
default:
break;
@@ -210,7 +293,177 @@ struct npc_zulaman_voljin : public ScriptedAI
private:
InstanceScript* _instance;
EventMap _events;
uint8 _gongCount;
ObjectGuid _playerGUID;
bool _restarted;
bool _started;
bool _actionTriggered;
};
Position const AmanishiGuardianPos1 = { 107.7912f, 1586.498f, 43.58794f };
Position const AmanishiGuardianPos2 = { 131.8407f, 1590.247f, 43.61382f };
enum AmanishiGuardianTexts
{
SAY_ALERT = 0,
SAY_ENRAGE = 1
};
enum AmanishiGuardianEvents
{
EVENT_MOVE_TO_GATE = 1,
EVENT_FACE_TO_ENTRANCE,
EVENT_SAY_ALERT,
EVENT_MAKE_ATTACKABLE,
EVENT_REND
};
enum AmanishiGuardianMovePoints
{
POINT_MASSIVE_GATE = 1
};
enum AmanishiGuardianSpells
{
SPELL_REND = 43246,
SPELL_ENRAGE = 8599
};
enum AmanishiGuardianMisc
{
ITEM_DISPLAY_ID_SPEAR = 13631
};
struct npc_zulaman_amanishi_guardian : public ScriptedAI
{
npc_zulaman_amanishi_guardian(Creature* creature) : ScriptedAI(creature)
{
Initialize();
}
void Initialize()
{
_enraged = false;
_firstGuardian = me->GetHomePosition().GetExactDist2d(AmanishiGuardianPos1) < 10.0f;
}
void JustEngagedWith(Unit* /*who*/) override
{
_events.ScheduleEvent(EVENT_REND, 5s, 7s);
}
void EnterEvadeMode(EvadeReason why) override
{
me->GetMotionMaster()->MoveTargetedHome();
_EnterEvadeMode();
_events.Reset();
Initialize();
}
void DoAction(int32 action) override
{
switch (action)
{
case ACTION_ALERT_AMANISHI_GUARDIANS:
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC);
if (_firstGuardian)
_events.ScheduleEvent(EVENT_MOVE_TO_GATE, 19s + 200ms);
else
{
me->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + 0, ITEM_DISPLAY_ID_SPEAR);
_events.ScheduleEvent(EVENT_MOVE_TO_GATE, 16s + 500ms);
}
break;
default:
break;
}
}
void UpdateAI(uint32 diff) override
{
if (!UpdateVictim() && me->IsInCombat())
return;
_events.Update(diff);
if (me->HasUnitState(UNIT_STATE_CASTING))
return;
while (uint32 eventId = _events.ExecuteEvent())
{
switch (eventId)
{
case EVENT_MOVE_TO_GATE:
if (_firstGuardian)
me->GetMotionMaster()->MovePoint(POINT_MASSIVE_GATE, AmanishiGuardianPos1);
else
me->GetMotionMaster()->MovePoint(POINT_MASSIVE_GATE, AmanishiGuardianPos2);
break;
case EVENT_MAKE_ATTACKABLE:
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC);
break;
case EVENT_FACE_TO_ENTRANCE:
if (_firstGuardian)
me->SetFacingTo(1.047198f);
else
{
me->SetFacingTo(2.024582f);
_events.ScheduleEvent(EVENT_SAY_ALERT, 1s + 400ms);
}
me->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_STATE_READY1H);
break;
case EVENT_SAY_ALERT:
Talk(SAY_ALERT);
break;
case EVENT_REND:
DoCastVictim(SPELL_REND);
_events.Repeat(5s);
break;
default:
break;
}
}
DoMeleeAttackIfReady();
}
void DamageTaken(Unit* /*attacker*/, uint32& /*damage*/) override
{
if (me->HealthBelowPct(50) && !_enraged)
{
DoCastSelf(SPELL_ENRAGE);
Talk(SAY_ENRAGE);
_enraged = true;
}
}
void MovementInform(uint32 movementType, uint32 pointId) override
{
if (movementType != POINT_MOTION_TYPE)
return;
switch (pointId)
{
case POINT_MASSIVE_GATE:
if (_firstGuardian)
{
_events.ScheduleEvent(EVENT_FACE_TO_ENTRANCE, 1ms);
_events.ScheduleEvent(EVENT_MAKE_ATTACKABLE, 1ms);
}
else
{
_events.ScheduleEvent(EVENT_FACE_TO_ENTRANCE, 1ms);
_events.ScheduleEvent(EVENT_MAKE_ATTACKABLE, 4s + 800ms);
}
break;
default:
break;
}
}
private:
EventMap _events;
bool _enraged;
bool _firstGuardian;
};
// 45226 - Banging the Gong
@@ -218,9 +471,9 @@ class spell_banging_the_gong : public SpellScript
{
PrepareSpellScript(spell_banging_the_gong);
void Activate(SpellEffIndex index)
void Activate(SpellEffIndex effIndex)
{
PreventHitDefaultEffect(index);
PreventHitDefaultEffect(effIndex);
GetHitGObj()->SendCustomAnim(0);
}
@@ -233,5 +486,6 @@ class spell_banging_the_gong : public SpellScript
void AddSC_zulaman()
{
RegisterZulAamanCreatureAI(npc_zulaman_voljin);
RegisterZulAamanCreatureAI(npc_zulaman_amanishi_guardian);
RegisterSpellScript(spell_banging_the_gong);
}

View File

@@ -40,6 +40,8 @@ enum ZADataTypes
DATA_STRANGE_GONG,
DATA_MASSIVE_GATE,
DATA_ZULAMAN_SPEEDRUN_STATE,
DATA_TRIGGER_AMANISHI_GUARDIANS,
DATA_TRIGGER_AMANISHI_SAVAGES,
};
enum ZACreatureIds
@@ -53,24 +55,27 @@ enum ZACreatureIds
BOSS_DAAKARA = 23863,
NPC_VOLJIN = 52924,
NPC_HEXLORD_MALACRASS_TRIGGER = 24363
NPC_HEXLORD_MALACRASS_TRIGGER = 24363,
NPC_AMANISHI_GUARDIAN = 23597,
NPC_AMANISHI_SAVAGE = 23889
};
enum ZAGameObjectIds
{
GO_STRANGE_GONG = 187359,
GO_MASSIVE_GATE = 186728,
GO_STRANGE_GONG = 187359,
GO_MASSIVE_GATE = 186728,
};
enum ZAEvents
{
EVENT_START_ZULAMAN = 15897,
EVENT_RIUAL_OF_POWER = 15897,
EVENT_UPDATE_SPEED_RUN_TIMER = 1,
};
enum ZAAction
enum ZAActions
{
ACTION_START_ZULAMAN = 1
ACTION_OPEN_MASSIVE_GATES = 1,
ACTION_ALERT_AMANISHI_GUARDIANS = 1
};
enum ZAWorldStates