/*
* This file is part of the TrinityCore Project. See AUTHORS file for Copyright information
*
* 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
* Free Software Foundation; either version 2 of the License, or (at your
* option) any later version.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*
* You should have received a copy of the GNU General Public License along
* with this program. If not, see .
*/
#include "ScriptMgr.h"
#include "CreatureTextMgr.h"
#include "GameObject.h"
#include "InstanceScript.h"
#include "MotionMaster.h"
#include "ObjectAccessor.h"
#include "Player.h"
#include "ScriptedCreature.h"
#include "zulaman.h"
enum Says
{
// 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
{
// Vol'jin
SPELL_BANGING_THE_GONG = 45225
};
enum Events
{
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 Points
{
POINT_INTRO = 1,
POINT_STRANGE_GONG = 2,
POINT_START_DOOR_OPENING_1 = 3,
POINT_START_DOOR_OPENING_2 = 4
};
enum Misc
{
ITEM_VIRTUAL_ITEM = 5301,
GOSSIP_MENU_START_INTRO = 12797,
};
Position const VoljinIntroWaypoint[4] =
{
{ 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 },
};
class npc_voljin_zulaman : public CreatureScript
{
public:
npc_voljin_zulaman() : CreatureScript("npc_voljin_zulaman") { }
struct npc_voljin_zulamanAI : public ScriptedAI
{
npc_voljin_zulamanAI(Creature* creature) : ScriptedAI(creature), _instance(creature->GetInstanceScript())
{
me->SetDisplayFromModel(0);
if (_instance->GetData(DATA_ZULAMAN_STATE) == NOT_STARTED)
me->SetNpcFlag(UNIT_NPC_FLAG_GOSSIP);
}
void Reset() override
{
_gongCount = 0;
}
bool OnGossipSelect(Player* player, uint32 menuId, uint32 gossipListId) override
{
if (_instance->GetData(DATA_ZULAMAN_STATE) != NOT_STARTED)
return true;
if (menuId == GOSSIP_MENU_START_INTRO && !gossipListId)
{
_events.Reset();
me->SetMountDisplayId(0);
me->RemoveNpcFlag(UNIT_NPC_FLAG_GOSSIP);
me->ReplaceAllDynamicFlags(UNIT_DYNFLAG_NONE);
_events.ScheduleEvent(EVENT_INTRO_MOVEPOINT_1, 1s);
Talk(SAY_INTRO_1, player);
me->SetWalk(true);
}
return false;
}
void DoAction(int32 action) override
{
if (action == ACTION_START_ZULAMAN)
{
if (++_gongCount == 10)
_events.ScheduleEvent(EVENT_START_DOOR_OPENING_1, 500ms);
}
}
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, 1s);
break;
case EVENT_INTRO_MOVEPOINT_2:
me->GetMotionMaster()->MovePoint(POINT_STRANGE_GONG, VoljinIntroWaypoint[1]);
_events.ScheduleEvent(EVENT_INTRO_MOVEPOINT_3, 4s);
break;
case EVENT_INTRO_MOVEPOINT_3:
Talk(SAY_INTRO_2);
_events.ScheduleEvent(EVENT_BANGING_THE_GONG, 3s);
break;
case EVENT_BANGING_THE_GONG:
DoCast(me, SPELL_BANGING_THE_GONG);
if (GameObject* strangeGong = ObjectAccessor::GetGameObject(*me, _instance->GetGuidData(DATA_STRANGE_GONG)))
strangeGong->RemoveFlag(GO_FLAG_NOT_SELECTABLE);
me->SetVirtualItem(0, uint32(ITEM_VIRTUAL_ITEM));
break;
case EVENT_START_DOOR_OPENING_1:
me->RemoveAura(SPELL_BANGING_THE_GONG);
_events.ScheduleEvent(EVENT_START_DOOR_OPENING_2, 500ms);
break;
case EVENT_START_DOOR_OPENING_2:
me->SetVirtualItem(0, uint32(0));
if (GameObject* strangeGong = ObjectAccessor::GetGameObject(*me, _instance->GetGuidData(DATA_STRANGE_GONG)))
strangeGong->SetFlag(GO_FLAG_NOT_SELECTABLE);
_events.ScheduleEvent(EVENT_START_DOOR_OPENING_3, 500ms);
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, 3s);
break;
case EVENT_START_DOOR_OPENING_5:
Talk(SAY_INTRO_4);
_events.ScheduleEvent(EVENT_START_DOOR_OPENING_6, 6s);
break;
case EVENT_START_DOOR_OPENING_6:
_events.ScheduleEvent(EVENT_START_DOOR_OPENING_7, 6s);
break;
case EVENT_START_DOOR_OPENING_7:
if (Creature* hexLordTrigger = ObjectAccessor::GetCreature(*me, _instance->GetGuidData(DATA_HEXLORD_TRIGGER)))
sCreatureTextMgr->SendChat(hexLordTrigger, SAY_HEXLOR_INTRO, nullptr, CHAT_MSG_ADDON, LANG_ADDON, TEXT_RANGE_MAP);
break;
default:
break;
}
}
}
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, 4500ms);
break;
default:
break;
}
}
private:
InstanceScript* _instance;
EventMap _events;
uint8 _gongCount = 0;
};
CreatureAI* GetAI(Creature* creature) const override
{
return GetZulAmanAI(creature);
}
};
void AddSC_zulaman()
{
new npc_voljin_zulaman();
}