diff --git a/src/server/scripts/EasternKingdoms/ZulAman/boss_akilzon.cpp b/src/server/scripts/EasternKingdoms/ZulAman/boss_akilzon.cpp index 4dcb41f533b..9c784da9357 100644 --- a/src/server/scripts/EasternKingdoms/ZulAman/boss_akilzon.cpp +++ b/src/server/scripts/EasternKingdoms/ZulAman/boss_akilzon.cpp @@ -135,7 +135,6 @@ class boss_akilzon : public CreatureScript void KilledUnit(Unit* who) override { if (who->GetTypeId() == TYPEID_PLAYER) - Talk(SAY_PLAYER_KILL); Talk(SAY_KILL); } diff --git a/src/server/scripts/EasternKingdoms/ZulAman/boss_daakara.cpp b/src/server/scripts/EasternKingdoms/ZulAman/boss_daakara.cpp index d1d62b373e5..4a44be3d676 100644 --- a/src/server/scripts/EasternKingdoms/ZulAman/boss_daakara.cpp +++ b/src/server/scripts/EasternKingdoms/ZulAman/boss_daakara.cpp @@ -52,7 +52,7 @@ class boss_daakara : public CreatureScript struct boss_daakaraAI : public BossAI { - boss_daakaraAI(Creature* creature) : BossAI(creature, DATA_DAAKARA) { } + boss_daakaraAI(Creature* creature) : BossAI(creature, DATA_DAAKARAEVENT) { } void Reset() override { diff --git a/src/server/scripts/EasternKingdoms/ZulAman/instance_zulaman.cpp b/src/server/scripts/EasternKingdoms/ZulAman/instance_zulaman.cpp index 2b33461dc4e..53554a64458 100644 --- a/src/server/scripts/EasternKingdoms/ZulAman/instance_zulaman.cpp +++ b/src/server/scripts/EasternKingdoms/ZulAman/instance_zulaman.cpp @@ -22,285 +22,285 @@ class instance_zulaman : public InstanceMapScript { - public: - instance_zulaman() : InstanceMapScript(ZulAmanScriptName, 568) { } +public: + instance_zulaman() : InstanceMapScript(ZulAmanScriptName, 568) { } - struct instance_zulaman_InstanceScript : public InstanceScript + struct instance_zulaman_InstanceScript : public InstanceScript + { + instance_zulaman_InstanceScript(InstanceMap* map) : InstanceScript(map) { - instance_zulaman_InstanceScript(InstanceMap* map) : InstanceScript(map) - { - SetHeaders(DataHeader); - SetBossNumber(EncounterCount); + SetHeaders(DataHeader); + SetBossNumber(EncounterCount); - SpeedRunTimer = 16; - ZulAmanState = NOT_STARTED; - ZulAmanBossCount = 0; + SpeedRunTimer = 16; + ZulAmanState = NOT_STARTED; + ZulAmanBossCount = 0; + } + + void FillInitialWorldStates(WorldPacket& packet) override + { + packet << uint32(WORLD_STATE_ZULAMAN_TIMER_ENABLED) << uint32(ZulAmanState ? 1 : 0); + packet << uint32(WORLD_STATE_ZULAMAN_TIMER) << uint32(SpeedRunTimer); + } + + void OnCreatureCreate(Creature* creature) override + { + switch (creature->GetEntry()) + { + case NPC_AKILZON: + AkilzonGUID = creature->GetGUID(); + break; + case NPC_NALORAKK: + NalorakkGUID = creature->GetGUID(); + break; + case NPC_JANALAI: + JanalaiGUID = creature->GetGUID(); + break; + case NPC_HALAZZI: + HalazziGUID = creature->GetGUID(); + break; + case NPC_HEXLORD: + HexLordMalacrassGUID = creature->GetGUID(); + break; + case NPC_DAAKARA: + DaakaraGUID = creature->GetGUID(); + break; + case NPC_VOLJIN: + VoljinGUID = creature->GetGUID(); + break; + case NPC_HEXLORD_TRIGGER: + HexLordTriggerGUID = creature->GetGUID(); + break; + default: + break; + } + } + + void OnGameObjectCreate(GameObject* go) override + { + switch (go->GetEntry()) + { + case GO_STRANGE_GONG: + StrangeGongGUID = go->GetGUID(); + break; + case GO_MASSIVE_GATE: + MasiveGateGUID = go->GetGUID(); + AddDoor(go, true); + if (ZulAmanState != NOT_STARTED) + go->SetGoState(GO_STATE_ACTIVE); + break; + default: + break; + } + } + + void OnGameObjectRemove(GameObject* go) override + { + switch (go->GetEntry()) + { + case GO_MASSIVE_GATE: + AddDoor(go, false); + break; + default: + break; + } + } + + ObjectGuid GetGuidData(uint32 type) const override + { + switch (type) + { + case DATA_AKILZONEVENT: + return AkilzonGUID; + case DATA_NALORAKKEVENT: + return NalorakkGUID; + case DATA_JANALAIEVENT: + return JanalaiGUID; + case DATA_HALAZZIEVENT: + return HalazziGUID; + case DATA_HEXLORDEVENT: + return HexLordMalacrassGUID; + case DATA_DAAKARAEVENT: + return DaakaraGUID; + case DATA_HEXLORD_TRIGGER: + return HexLordTriggerGUID; + case DATA_STRANGE_GONG: + return StrangeGongGUID; + case DATA_MASSIVE_GATE: + return MasiveGateGUID; + default: + break; } - void FillInitialWorldStates(WorldPacket& packet) override - { - packet << uint32(WORLD_STATE_ZULAMAN_TIMER_ENABLED) << uint32(ZulAmanState ? 1 : 0); - packet << uint32(WORLD_STATE_ZULAMAN_TIMER) << uint32(SpeedRunTimer); - } + return ObjectGuid::Empty; + } - void OnCreatureCreate(Creature* creature) override + void SetData(uint32 type, uint32 data) override + { + switch (type) { - switch (creature->GetEntry()) + case DATA_ZULAMAN_STATE: + { + if (data == IN_PROGRESS) { - case NPC_AKILZON: - AkilzonGUID = creature->GetGUID(); - break; - case NPC_NALORAKK: - NalorakkGUID = creature->GetGUID(); - break; - case NPC_JANALAI: - JanalaiGUID = creature->GetGUID(); - break; - case NPC_HALAZZI: - HalazziGUID = creature->GetGUID(); - break; - case NPC_HEXLORD: - HexLordMalacrassGUID = creature->GetGUID(); - break; - case NPC_DAAKARA: - DaakaraGUID = creature->GetGUID(); - break; - case NPC_VOLJIN: - VoljinGUID = creature->GetGUID(); - break; - case NPC_HEXLORD_TRIGGER: - HexLordTriggerGUID = creature->GetGUID(); - break; - default: - break; + DoUpdateWorldState(WORLD_STATE_ZULAMAN_TIMER_ENABLED, 1); + DoUpdateWorldState(WORLD_STATE_ZULAMAN_TIMER, 15); + events.ScheduleEvent(EVENT_UPDATE_ZULAMAN_TIMER, 60000); + SpeedRunTimer = 15; + ZulAmanState = data; + SaveToDB(); } + break; + } + default: + break; + } + } + + uint32 GetData(uint32 type) const override + { + switch (type) + { + case DATA_ZULAMAN_STATE: + return ZulAmanState; + default: + break; } - void OnGameObjectCreate(GameObject* go) override - { - switch (go->GetEntry()) - { - case GO_STRANGE_GONG: - StrangeGongGUID = go->GetGUID(); - break; - case GO_MASSIVE_GATE: - MasiveGateGUID = go->GetGUID(); - AddDoor(go, true); - if (ZulAmanState != NOT_STARTED) - go->SetGoState(GO_STATE_ACTIVE); - break; - default: - break; - } - } + return 0; + } - void OnGameObjectRemove(GameObject* go) override - { - switch (go->GetEntry()) - { - case GO_MASSIVE_GATE: - AddDoor(go, false); - break; - default: - break; - } - } + bool SetBossState(uint32 type, EncounterState state) override + { + if (!InstanceScript::SetBossState(type, state)) + return false; - ObjectGuid GetGuidData(uint32 type) const override + if (state == DONE) { - switch (type) + if (ZulAmanState == IN_PROGRESS && SpeedRunTimer) { - case DATA_AKILZON: - return AkilzonGUID; - case DATA_NALORAKK: - return NalorakkGUID; - case DATA_JANALAI: - return JanalaiGUID; - case DATA_HALAZZI: - return HalazziGUID; - case DATA_HEXLORD: - return HexLordMalacrassGUID; - case DATA_DAAKARA: - return DaakaraGUID; - case DATA_HEXLORD_TRIGGER: - return HexLordTriggerGUID; - case DATA_STRANGE_GONG: - return StrangeGongGUID; - case DATA_MASSIVE_GATE: - return MasiveGateGUID; - default: - break; - } + ++ZulAmanBossCount; - return ObjectGuid::Empty; - } - - void SetData(uint32 type, uint32 data) override - { - switch (type) - { - case DATA_ZULAMAN_STATE: + if (ZulAmanBossCount < 2) { - if (data == IN_PROGRESS) - { - DoUpdateWorldState(WORLD_STATE_ZULAMAN_TIMER_ENABLED, 1); - DoUpdateWorldState(WORLD_STATE_ZULAMAN_TIMER, 15); - events.ScheduleEvent(EVENT_UPDATE_ZULAMAN_TIMER, 60000); - SpeedRunTimer = 15; - ZulAmanState = data; - SaveToDB(); - } - break; + SpeedRunTimer = SpeedRunTimer + 5; + DoUpdateWorldState(WORLD_STATE_ZULAMAN_TIMER, SpeedRunTimer); } - default: - break; - } - } - - uint32 GetData(uint32 type) const override - { - switch (type) - { - case DATA_ZULAMAN_STATE: - return ZulAmanState; - default: - break; - } - - return 0; - } - - bool SetBossState(uint32 type, EncounterState state) override - { - if (!InstanceScript::SetBossState(type, state)) - return false; - - if (state == DONE) - { - if (ZulAmanState == IN_PROGRESS && SpeedRunTimer) + else if (ZulAmanBossCount == 4) { - ++ZulAmanBossCount; - - if (ZulAmanBossCount < 2) - { - SpeedRunTimer = SpeedRunTimer + 5; - DoUpdateWorldState(WORLD_STATE_ZULAMAN_TIMER, SpeedRunTimer); - } - else if (ZulAmanBossCount == 4) - { - DoUpdateWorldState(WORLD_STATE_ZULAMAN_TIMER_ENABLED, 0); - events.CancelEvent(EVENT_UPDATE_ZULAMAN_TIMER); - ZulAmanState = DONE; - } + DoUpdateWorldState(WORLD_STATE_ZULAMAN_TIMER_ENABLED, 0); + events.CancelEvent(EVENT_UPDATE_ZULAMAN_TIMER); + ZulAmanState = DONE; } } - - switch (type) - { - case DATA_AKILZON: - break; - case DATA_NALORAKK: - break; - case DATA_JANALAI: - break; - case DATA_HALAZZI: - case DATA_HEXLORD: - case DATA_DAAKARA: - break; - default: - break; - } - - return true; } - void ProcessEvent(WorldObject* /*obj*/, uint32 eventId) override + switch (type) + { + case DATA_AKILZONEVENT: + break; + case DATA_NALORAKKEVENT: + break; + case DATA_JANALAIEVENT: + break; + case DATA_HALAZZIEVENT: + case DATA_HEXLORDEVENT: + case DATA_DAAKARAEVENT: + break; + default: + break; + } + + return true; + } + + void ProcessEvent(WorldObject* /*obj*/, uint32 eventId) override + { + switch (eventId) + { + case EVENT_START_ZULAMAN: + if (Creature* voljin = instance->GetCreature(VoljinGUID)) + { + if (voljin->IsAIEnabled) + voljin->AI()->DoAction(ACTION_START_ZULAMAN); + } + break; + default: + break; + } + } + + void Update(uint32 diff) + { + if (events.Empty()) + return; + + events.Update(diff); + + while (uint32 eventId = events.ExecuteEvent()) { switch (eventId) { - case EVENT_START_ZULAMAN: - if (Creature* voljin = instance->GetCreature(VoljinGUID)) - { - if (voljin->IsAIEnabled) - voljin->AI()->DoAction(ACTION_START_ZULAMAN); - } - break; - default: - break; - } - } - - void Update(uint32 diff) - { - if (events.Empty()) - return; - - events.Update(diff); - - while (uint32 eventId = events.ExecuteEvent()) - { - switch (eventId) + case EVENT_UPDATE_ZULAMAN_TIMER: + SaveToDB(); + DoUpdateWorldState(WORLD_STATE_ZULAMAN_TIMER, --SpeedRunTimer); + if (SpeedRunTimer) + events.ScheduleEvent(EVENT_UPDATE_ZULAMAN_TIMER, 60000); + else { - case EVENT_UPDATE_ZULAMAN_TIMER: - SaveToDB(); - DoUpdateWorldState(WORLD_STATE_ZULAMAN_TIMER, --SpeedRunTimer); - if (SpeedRunTimer) - events.ScheduleEvent(EVENT_UPDATE_ZULAMAN_TIMER, 60000); - else - { - DoUpdateWorldState(WORLD_STATE_ZULAMAN_TIMER_ENABLED, 0); - events.CancelEvent(EVENT_UPDATE_ZULAMAN_TIMER); - ZulAmanState = FAIL; - } - break; - default: - break; + DoUpdateWorldState(WORLD_STATE_ZULAMAN_TIMER_ENABLED, 0); + events.CancelEvent(EVENT_UPDATE_ZULAMAN_TIMER); + ZulAmanState = FAIL; } + break; + default: + break; } } - - void WriteSaveDataMore(std::ostringstream& data) override - { - data << ZulAmanState << ' ' - << SpeedRunTimer << ' ' - << ZulAmanBossCount; - } - - void ReadSaveDataMore(std::istringstream& data) override - { - data >> ZulAmanState; - data >> SpeedRunTimer; - data >> ZulAmanBossCount; - - if (ZulAmanState == IN_PROGRESS && SpeedRunTimer && SpeedRunTimer <= 15) - { - events.ScheduleEvent(EVENT_UPDATE_ZULAMAN_TIMER, 60000); - DoUpdateWorldState(WORLD_STATE_ZULAMAN_TIMER_ENABLED, 1); - DoUpdateWorldState(WORLD_STATE_ZULAMAN_TIMER, SpeedRunTimer); - } - } - - protected: - EventMap events; - ObjectGuid AkilzonGUID; - ObjectGuid NalorakkGUID; - ObjectGuid JanalaiGUID; - ObjectGuid HalazziGUID; - ObjectGuid HexLordMalacrassGUID; - ObjectGuid DaakaraGUID; - ObjectGuid VoljinGUID; - ObjectGuid HexLordTriggerGUID; - ObjectGuid StrangeGongGUID; - ObjectGuid MasiveGateGUID; - uint32 SpeedRunTimer; - uint32 ZulAmanState; - uint32 ZulAmanBossCount; - }; - - InstanceScript* GetInstanceScript(InstanceMap* map) const override - { - return new instance_zulaman_InstanceScript(map); } + + void WriteSaveDataMore(std::ostringstream& data) override + { + data << ZulAmanState << ' ' + << SpeedRunTimer << ' ' + << ZulAmanBossCount; + } + + void ReadSaveDataMore(std::istringstream& data) override + { + data >> ZulAmanState; + data >> SpeedRunTimer; + data >> ZulAmanBossCount; + + if (ZulAmanState == IN_PROGRESS && SpeedRunTimer && SpeedRunTimer <= 15) + { + events.ScheduleEvent(EVENT_UPDATE_ZULAMAN_TIMER, 60000); + DoUpdateWorldState(WORLD_STATE_ZULAMAN_TIMER_ENABLED, 1); + DoUpdateWorldState(WORLD_STATE_ZULAMAN_TIMER, SpeedRunTimer); + } + } + + protected: + EventMap events; + ObjectGuid AkilzonGUID; + ObjectGuid NalorakkGUID; + ObjectGuid JanalaiGUID; + ObjectGuid HalazziGUID; + ObjectGuid HexLordMalacrassGUID; + ObjectGuid DaakaraGUID; + ObjectGuid VoljinGUID; + ObjectGuid HexLordTriggerGUID; + ObjectGuid StrangeGongGUID; + ObjectGuid MasiveGateGUID; + uint32 SpeedRunTimer; + uint32 ZulAmanState; + uint32 ZulAmanBossCount; + }; + + InstanceScript* GetInstanceScript(InstanceMap* map) const override + { + return new instance_zulaman_InstanceScript(map); + } }; void AddSC_instance_zulaman() diff --git a/src/server/scripts/EasternKingdoms/ZulAman/zulaman.cpp b/src/server/scripts/EasternKingdoms/ZulAman/zulaman.cpp index 3b52e6775b2..153040fdcfe 100644 --- a/src/server/scripts/EasternKingdoms/ZulAman/zulaman.cpp +++ b/src/server/scripts/EasternKingdoms/ZulAman/zulaman.cpp @@ -1,6 +1,5 @@ /* * Copyright (C) 2008-2015 TrinityCore - * Copyright (C) 2006-2009 ScriptDev2 * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the @@ -16,421 +15,209 @@ * with this program. If not, see . */ -/* ScriptData -SDName: Zulaman -SD%Complete: 90 -SDComment: Forest Frog will turn into different NPC's. Workaround to prevent new entry from running this script -SDCategory: Zul'Aman -EndScriptData */ - -/* ContentData -npc_forest_frog -EndContentData */ - #include "ScriptMgr.h" #include "ScriptedCreature.h" #include "ScriptedGossip.h" -#include "zulaman.h" #include "Player.h" -#include "SpellInfo.h" +#include "CreatureTextMgr.h" #include "SpellScript.h" - -/*###### -## npc_forest_frog -######*/ - -enum ForestFrog -{ - // Spells - SPELL_REMOVE_AMANI_CURSE = 43732, - SPELL_PUSH_MOJO = 43923, - - // Creatures - NPC_FOREST_FROG = 24396 - -}; - -class npc_forest_frog : public CreatureScript -{ - public: - - npc_forest_frog() - : CreatureScript("npc_forest_frog") - { - } - - struct npc_forest_frogAI : public ScriptedAI - { - npc_forest_frogAI(Creature* creature) : ScriptedAI(creature) - { - instance = creature->GetInstanceScript(); - } - - InstanceScript* instance; - - void Reset() override { } - - void EnterCombat(Unit* /*who*/) override { } - - void DoSpawnRandom() - { - uint32 cEntry = 0; - switch (rand32() % 10) - { - case 0: cEntry = 24397; break; //Mannuth - case 1: cEntry = 24403; break; //Deez - case 2: cEntry = 24404; break; //Galathryn - case 3: cEntry = 24405; break; //Adarrah - case 4: cEntry = 24406; break; //Fudgerick - case 5: cEntry = 24407; break; //Darwen - case 6: cEntry = 24445; break; //Mitzi - case 7: cEntry = 24448; break; //Christian - case 8: cEntry = 24453; break; //Brennan - case 9: cEntry = 24455; break; //Hollee - } - - if (!instance->GetData(TYPE_RAND_VENDOR_1)) - if (rand32() % 10 == 1) cEntry = 24408; //Gunter - if (!instance->GetData(TYPE_RAND_VENDOR_2)) - if (rand32() % 10 == 1) cEntry = 24409; //Kyren - - if (cEntry) me->UpdateEntry(cEntry); - - if (cEntry == 24408) instance->SetData(TYPE_RAND_VENDOR_1, DONE); - if (cEntry == 24409) instance->SetData(TYPE_RAND_VENDOR_2, DONE); - } - - void SpellHit(Unit* caster, const SpellInfo* spell) override - { - if (spell->Id == SPELL_REMOVE_AMANI_CURSE && caster->GetTypeId() == TYPEID_PLAYER && me->GetEntry() == NPC_FOREST_FROG) - { - //increase or decrease chance of mojo? - if (rand32() % 99 == 50) DoCast(caster, SPELL_PUSH_MOJO, true); - else DoSpawnRandom(); - } - } - }; - - CreatureAI* GetAI(Creature* creature) const override - { - return GetInstanceAI(creature); - } -}; - -/*###### -## npc_zulaman_hostage -######*/ - -#define GOSSIP_HOSTAGE1 "I am glad to help you." - -static uint32 HostageEntry[] = {23790, 23999, 24024, 24001}; -static uint32 ChestEntry[] = {186648, 187021, 186672, 186667}; - -class npc_zulaman_hostage : public CreatureScript -{ - public: - npc_zulaman_hostage() : CreatureScript("npc_zulaman_hostage") { } - - bool OnGossipHello(Player* player, Creature* creature) override - { - player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_HOSTAGE1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); - player->SEND_GOSSIP_MENU(player->GetGossipTextId(creature), creature->GetGUID()); - return true; - } - - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override - { - player->PlayerTalkClass->ClearMenus(); - - if (action == GOSSIP_ACTION_INFO_DEF + 1) - player->CLOSE_GOSSIP_MENU(); - - if (!creature->HasFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP)) - return true; - - creature->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP); - - InstanceScript* instance = creature->GetInstanceScript(); - if (instance) - { - //uint8 progress = instance->GetData(DATA_CHESTLOOTED); - instance->SetData(DATA_CHESTLOOTED, 0); - float x, y, z; - creature->GetPosition(x, y, z); - uint32 entry = creature->GetEntry(); - for (uint8 i = 0; i < 4; ++i) - { - if (HostageEntry[i] == entry) - { - creature->SummonGameObject(ChestEntry[i], x-2, y, z, 0, 0, 0, 0, 0, 0); - break; - } - } - } - return true; - } -}; - -/*###### -## npc_harrison_jones -######*/ +#include "zulaman.h" enum Says { - SAY_HARRISON_0 = 0, - SAY_HARRISON_1 = 1, - SAY_HARRISON_2 = 0, - SAY_HARRISON_3 = 1 + // Vol'jin + SAY_INTRO_1 = 0, + SAY_INTRO_2 = 1, + SAY_INTRO_3 = 2, + SAY_INTRO_4 = 3, + SAY_INTRO_FAIL = 4, + + // Hex Lord Malacrass + SAY_HEXLOR_INTRO = 0 }; enum Spells { - SPELL_BANGING_THE_GONG = 45225, - SPELL_STEALTH = 34189, - SPELL_COSMETIC_SPEAR_THROW = 43647 + // Vol'jin + SPELL_BANGING_THE_GONG = 45225 }; enum Events { - GONG_EVENT_1 = 1, - GONG_EVENT_2 = 2, - GONG_EVENT_3 = 3, - GONG_EVENT_4 = 4, - GONG_EVENT_5 = 5, - GONG_EVENT_6 = 6, - GONG_EVENT_7 = 7, - GONG_EVENT_8 = 8, - GONG_EVENT_9 = 9, - GONG_EVENT_10 = 10, - GONG_EVENT_11 = 11 + 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 }; -enum Waypoints +enum Points { - HARRISON_MOVE_1 = 860440, - HARRISON_MOVE_2 = 860441, - HARRISON_MOVE_3 = 860442 + POINT_INTRO = 1, + POINT_STRANGE_GONG = 2, + POINT_START_DOOR_OPENING_1 = 3, + POINT_START_DOOR_OPENING_2 = 4 }; -enum DisplayIds +enum Misc { - MODEL_HARRISON_JONES_0 = 22340, - MODEL_HARRISON_JONES_1 = 22354, - MODEL_HARRISON_JONES_2 = 22347 + ITEM_VIRTUAL_ITEM = 5301 }; -enum EntryIds +Position const VoljinIntroWaypoint[4] = { - NPC_HARRISON_JONES_1 = 24375, - NPC_HARRISON_JONES_2 = 24365, - NPC_AMANISHI_GUARDIAN = 23597, + { 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 }, }; -enum Weapons -{ - WEAPON_MACE = 5301, - WEAPON_SPEAR = 13631 -}; - -class npc_harrison_jones : public CreatureScript +class npc_voljin_zulaman : public CreatureScript { public: + npc_voljin_zulaman() : CreatureScript("npc_voljin_zulaman") { } - npc_harrison_jones() : CreatureScript("npc_harrison_jones") + struct npc_voljin_zulamanAI : public ScriptedAI { - } - - struct npc_harrison_jonesAI : public ScriptedAI - { - npc_harrison_jonesAI(Creature* creature) : ScriptedAI(creature) + npc_voljin_zulamanAI(Creature* creature) : ScriptedAI(creature), _instance(creature->GetInstanceScript()) { - Initialize(); - instance = creature->GetInstanceScript(); + me->SetDisplayId(me->GetCreatureTemplate()->Modelid1); + if (_instance->GetData(DATA_ZULAMAN_STATE) == NOT_STARTED) + me->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP); } - void Initialize() - { - _gongEvent = 0; - _gongTimer = 0; - uiTargetGUID = 0; - } - - InstanceScript* instance; - - uint8 _gongEvent; - uint32 _gongTimer; - uint64 uiTargetGUID; - void Reset() override { - Initialize(); + _gongCount = 0; } - void EnterCombat(Unit* /*who*/) override { } - void sGossipSelect(Player* player, uint32 sender, uint32 action) override { - if (me->GetCreatureTemplate()->GossipMenuId == sender && !action) - { - player->CLOSE_GOSSIP_MENU(); - me->SetFacingToObject(player); + if (_instance->GetData(DATA_ZULAMAN_STATE) != NOT_STARTED) + return; + + if (me->GetCreatureTemplate()->GossipMenuId == sender && !action) + { + _events.Reset(); + me->SetUInt32Value(UNIT_FIELD_MOUNTDISPLAYID, 0); me->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP); - Talk(SAY_HARRISON_0); - _gongEvent = GONG_EVENT_1; - _gongTimer = 4000; - } + me->SetUInt32Value(UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_NONE); + _events.ScheduleEvent(EVENT_INTRO_MOVEPOINT_1, 1000); + Talk(SAY_INTRO_1, player); + me->SetWalk(true); + } } - void SpellHit(Unit*, const SpellInfo* spell) override + void DoAction(int32 action) override { - if (spell->Id == SPELL_COSMETIC_SPEAR_THROW) + if (action == ACTION_START_ZULAMAN) { - me->RemoveAllAuras(); - me->SetEntry(NPC_HARRISON_JONES_2); - me->SetDisplayId(MODEL_HARRISON_JONES_2); - me->SetTarget(ObjectGuid::Empty); - me->SetByteValue(UNIT_FIELD_BYTES_1, 0, UNIT_STAND_STATE_DEAD); - me->SetFlag(UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_DEAD); - instance->SetData(DATA_GONGEVENT, DONE); + if (++_gongCount == 10) + _events.ScheduleEvent(EVENT_START_DOOR_OPENING_1, 500); } } void UpdateAI(uint32 diff) override { - if (_gongEvent) + _events.Update(diff); + while (uint32 eventId = _events.ExecuteEvent()) { - if (_gongTimer <= diff) + switch (eventId) { - switch (_gongEvent) - { - case GONG_EVENT_1: - me->GetMotionMaster()->MovePath(HARRISON_MOVE_1, false); - _gongEvent = GONG_EVENT_2; - _gongTimer = 12000; - break; - case GONG_EVENT_2: - me->SetFacingTo(6.235659f); - Talk(SAY_HARRISON_1); - DoCast(me, SPELL_BANGING_THE_GONG); - me->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + 0, uint32(WEAPON_MACE)); - me->SetSheath(SHEATH_STATE_MELEE); - _gongEvent = GONG_EVENT_3; - _gongTimer = 4000; - break; - case GONG_EVENT_3: - if (GameObject* gong = me->GetMap()->GetGameObject(instance->GetGuidData(GO_STRANGE_GONG))) - gong->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE); - _gongEvent = GONG_EVENT_4; - _gongTimer = 105000; - break; - case GONG_EVENT_4: - me->RemoveAura(SPELL_BANGING_THE_GONG); - if (GameObject* gong = me->GetMap()->GetGameObject(instance->GetGuidData(GO_STRANGE_GONG))) - gong->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE); - - // trigger or gong will need to be scripted to set IN_PROGRESS after enough hits. - // This is temp workaround. - instance->SetData(DATA_GONGEVENT, IN_PROGRESS); // to be removed. - - if (instance->GetData(DATA_GONGEVENT) == IN_PROGRESS) - { - // Players are Now Saved to instance at SPECIAL (Player should be notified?) - me->GetMotionMaster()->MovePath(HARRISON_MOVE_2, false); - _gongEvent = GONG_EVENT_5; - _gongTimer = 5000; - } - else - { - _gongTimer = 1000; - _gongEvent = GONG_EVENT_9; - } - break; - case GONG_EVENT_5: - me->SetEntry(NPC_HARRISON_JONES_1); - me->SetDisplayId(MODEL_HARRISON_JONES_1); - Talk(SAY_HARRISON_2); - _gongTimer = 12000; - _gongEvent = GONG_EVENT_6; - break; - case GONG_EVENT_6: - me->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_STATE_USE_STANDING); - Talk(SAY_HARRISON_3); - _gongTimer = 7000; - _gongEvent = GONG_EVENT_7; - break; - case GONG_EVENT_7: - if (!uiTargetGUID) - { - std::list targetList; - GetCreatureListWithEntryInGrid(targetList, me, NPC_AMANISHI_GUARDIAN, 26.0f); - if (!targetList.empty()) - { - for (std::list::const_iterator itr = targetList.begin(); itr != targetList.end(); ++itr) - { - if (Creature* ptarget = *itr) - { - if (ptarget->GetPositionX() > 120) - { - ptarget->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + 0, uint32(WEAPON_SPEAR)); - ptarget->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC); - ptarget->SetReactState(REACT_PASSIVE); - ptarget->AI()->SetData(0, 1); - } - else - { - ptarget->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC); - ptarget->SetReactState(REACT_PASSIVE); - ptarget->AI()->SetData(0, 2); - } - } - } - } - } - - if (GameObject* gate = me->GetMap()->GetGameObject(instance->GetGuidData(GO_MASSIVE_GATE))) - gate->SetGoState(GO_STATE_ACTIVE); - _gongTimer = 2000; - _gongEvent = GONG_EVENT_8; - break; - case GONG_EVENT_8: - DoCast(me, SPELL_STEALTH); - me->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + 0, uint32(0)); - me->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_ONESHOT_NONE); - me->GetMotionMaster()->MovePath(HARRISON_MOVE_3, false); - _gongTimer = 1000; - _gongEvent = 0; - break; - case GONG_EVENT_9: - me->GetMotionMaster()->MovePoint(0, 120.687f, 1674.0f, 42.0217f); - _gongTimer = 12000; - _gongEvent = GONG_EVENT_10; - break; - case GONG_EVENT_10: - me->SetFacingTo(1.59044f); - _gongEvent = 11; - _gongTimer = 6000; - break; - case GONG_EVENT_11: - me->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP); - - instance->SetData(DATA_GONGEVENT, NOT_STARTED); - _gongEvent = 0; - _gongTimer = 1000; - break; - } + case EVENT_INTRO_MOVEPOINT_1: + me->GetMotionMaster()->MovePoint(POINT_INTRO, VoljinIntroWaypoint[0]); + _events.ScheduleEvent(EVENT_INTRO_MOVEPOINT_2, 1000); + break; + case EVENT_INTRO_MOVEPOINT_2: + me->GetMotionMaster()->MovePoint(POINT_STRANGE_GONG, VoljinIntroWaypoint[1]); + _events.ScheduleEvent(EVENT_INTRO_MOVEPOINT_3, 4000); + break; + case EVENT_INTRO_MOVEPOINT_3: + Talk(SAY_INTRO_2); + _events.ScheduleEvent(EVENT_BANGING_THE_GONG, 3000); + case EVENT_BANGING_THE_GONG: + DoCast(me, SPELL_BANGING_THE_GONG); + if (GameObject* strangeGong = ObjectAccessor::GetGameObject(*me, _instance->GetGuidData(DATA_STRANGE_GONG))) + strangeGong->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE); + me->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID, uint32(ITEM_VIRTUAL_ITEM)); + break; + case EVENT_START_DOOR_OPENING_1: + me->RemoveAura(SPELL_BANGING_THE_GONG); + _events.ScheduleEvent(EVENT_START_DOOR_OPENING_2, 500); + break; + case EVENT_START_DOOR_OPENING_2: + me->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID, uint32(0)); + if (GameObject* strangeGong = ObjectAccessor::GetGameObject(*me, _instance->GetGuidData(DATA_STRANGE_GONG))) + strangeGong->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE); + _events.ScheduleEvent(EVENT_START_DOOR_OPENING_3, 500); + break; + case EVENT_START_DOOR_OPENING_3: + me->GetMotionMaster()->MovePoint(POINT_START_DOOR_OPENING_1, VoljinIntroWaypoint[2]); + break; + case EVENT_START_DOOR_OPENING_4: + _instance->SetData(DATA_ZULAMAN_STATE, IN_PROGRESS); + if (GameObject* masiveGate = ObjectAccessor::GetGameObject(*me, _instance->GetGuidData(DATA_MASSIVE_GATE))) + masiveGate->SetGoState(GO_STATE_ACTIVE); + _events.ScheduleEvent(EVENT_START_DOOR_OPENING_5, 3000); + break; + case EVENT_START_DOOR_OPENING_5: + Talk(SAY_INTRO_4); + _events.ScheduleEvent(EVENT_START_DOOR_OPENING_6, 6000); + 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 = ObjectAccessor::GetCreature(*me, _instance->GetGuidData(DATA_HEXLORD_TRIGGER))) + sCreatureTextMgr->SendChat(hexLordTrigger, SAY_HEXLOR_INTRO, 0, CHAT_MSG_ADDON, LANG_ADDON, TEXT_RANGE_MAP); + break; + default: + break; } - else - _gongTimer -= diff; } } + + void MovementInform(uint32 movementType, uint32 pointId) override + { + if (movementType != POINT_MOTION_TYPE) + return; + + switch (pointId) + { + case POINT_STRANGE_GONG: + if (GameObject* strangeGong = ObjectAccessor::GetGameObject(*me, _instance->GetGuidData(DATA_STRANGE_GONG))) + me->SetFacingToObject(strangeGong); // setInFront + 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); + break; + default: + break; + } + } + + private: + InstanceScript* _instance; + EventMap _events; + uint8 _gongCount; }; CreatureAI* GetAI(Creature* creature) const override { - return GetInstanceAI(creature); + return GetInstanceAI(creature); } }; +// 45226 - Banging the Gong class spell_banging_the_gong : public SpellScriptLoader { public: @@ -458,11 +245,8 @@ class spell_banging_the_gong : public SpellScriptLoader } }; - void AddSC_zulaman() { - new npc_forest_frog(); - new npc_zulaman_hostage(); - new npc_harrison_jones(); + new npc_voljin_zulaman(); new spell_banging_the_gong(); } diff --git a/src/server/scripts/EasternKingdoms/ZulAman/zulaman.h b/src/server/scripts/EasternKingdoms/ZulAman/zulaman.h index 74162f0859d..c8d42b79431 100644 --- a/src/server/scripts/EasternKingdoms/ZulAman/zulaman.h +++ b/src/server/scripts/EasternKingdoms/ZulAman/zulaman.h @@ -1,6 +1,5 @@ /* * Copyright (C) 2008-2015 TrinityCore - * Copyright (C) 2006-2009 ScriptDev2 * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the @@ -19,45 +18,74 @@ #ifndef DEF_ZULAMAN_H #define DEF_ZULAMAN_H +uint32 const EncounterCount = 6; +#define ZulAmanScriptName "instance_zulaman" #define DataHeader "ZA" enum DataTypes { - DATA_GONGEVENT = 0, - DATA_NALORAKKEVENT = 1, - DATA_AKILZONEVENT = 2, - DATA_JANALAIEVENT = 3, - DATA_HALAZZIEVENT = 4, - DATA_HEXLORDEVENT = 5, - DATA_ZULJINEVENT = 6, - DATA_CHESTLOOTED = 7, - TYPE_RAND_VENDOR_1 = 8, - TYPE_RAND_VENDOR_2 = 9 + // BossState + DATA_AKILZONEVENT = 0, + DATA_NALORAKKEVENT = 1, + DATA_JANALAIEVENT = 2, + DATA_HALAZZIEVENT = 3, + DATA_HEXLORDEVENT = 4, + DATA_DAAKARAEVENT = 5, + + // Data64 + DATA_HEXLORD_TRIGGER, + + DATA_STRANGE_GONG, + DATA_MASSIVE_GATE, + + // SetData + DATA_ZULAMAN_STATE }; enum CreatureIds { - NPC_HARRISON_JONES = 24358, - NPC_JANALAI = 23578, - NPC_ZULJIN = 23863, - NPC_HEXLORD = 24239, - NPC_HALAZZI = 23577, - NPC_NALORAKK = 23576 + NPC_AKILZON = 23574, + NPC_NALORAKK = 23576, + NPC_JANALAI = 23578, + NPC_HALAZZI = 23577, + NPC_HEXLORD = 24239, + NPC_DAAKARA = 23863, + + NPC_VOLJIN = 52924, + NPC_HEXLORD_TRIGGER = 24363 }; -enum GameobjectIds +enum GameObjectIds { - GO_DOOR_HALAZZI = 186303, - GO_GATE_ZULJIN = 186304, - GO_GATE_HEXLORD = 186305, - GO_MASSIVE_GATE = 186728, - GO_DOOR_AKILZON = 186858, - GO_DOOR_ZULJIN = 186859, - GO_HARKORS_SATCHEL = 187021, - GO_TANZARS_TRUNK = 186648, - GO_ASHLIS_BAG = 186672, - GO_KRAZS_PACKAGE = 186667, - GO_STRANGE_GONG = 187359 + GO_STRANGE_GONG = 187359, + GO_MASSIVE_GATE = 186728, }; +enum ZulAmanEvents +{ + EVENT_START_ZULAMAN = 15897, + EVENT_UPDATE_ZULAMAN_TIMER = 1, +}; + +enum ZulAmanAction +{ + ACTION_START_ZULAMAN = 1 +}; + +enum ZulAmanWorldStates +{ + WORLD_STATE_ZULAMAN_TIMER_ENABLED = 3104, + WORLD_STATE_ZULAMAN_TIMER = 3106, +}; + +template +CreatureAI* GetZulAmanAI(Creature* creature) +{ + if (InstanceMap* instance = creature->GetMap()->ToInstanceMap()) + if (instance->GetInstanceScript()) + if (instance->GetScriptId() == sObjectMgr->GetScriptId(ZulAmanScriptName)) + return new AI(creature); + return NULL; +} + #endif