mirror of
https://github.com/TrinityCore/TrinityCore.git
synced 2026-01-21 01:37:37 +01:00
Scripts/ZA: rewrite Zul'Aman intro script
*todo: Amani'shi Savages need to run upstairs
This commit is contained in:
@@ -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;
|
||||
};
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user