diff --git a/sql/updates/world/custom/custom_2019_03_16_00_world.sql b/sql/updates/world/custom/custom_2019_03_16_00_world.sql new file mode 100644 index 00000000000..f270a815347 --- /dev/null +++ b/sql/updates/world/custom/custom_2019_03_16_00_world.sql @@ -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'); diff --git a/src/server/scripts/EasternKingdoms/ZulAman/instance_zulaman.cpp b/src/server/scripts/EasternKingdoms/ZulAman/instance_zulaman.cpp index 5253612b49f..2738a3ba19e 100644 --- a/src/server/scripts/EasternKingdoms/ZulAman/instance_zulaman.cpp +++ b/src/server/scripts/EasternKingdoms/ZulAman/instance_zulaman.cpp @@ -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; }; diff --git a/src/server/scripts/EasternKingdoms/ZulAman/zulaman.cpp b/src/server/scripts/EasternKingdoms/ZulAman/zulaman.cpp index 5373d9ef5b5..e3ead6440b1 100644 --- a/src/server/scripts/EasternKingdoms/ZulAman/zulaman.cpp +++ b/src/server/scripts/EasternKingdoms/ZulAman/zulaman.cpp @@ -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); } diff --git a/src/server/scripts/EasternKingdoms/ZulAman/zulaman.h b/src/server/scripts/EasternKingdoms/ZulAman/zulaman.h index 17c03f6da4a..9a7dfa8d40d 100644 --- a/src/server/scripts/EasternKingdoms/ZulAman/zulaman.h +++ b/src/server/scripts/EasternKingdoms/ZulAman/zulaman.h @@ -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