/*
* 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 "Creature.h"
#include "GameObject.h"
#include "InstanceScript.h"
#include "Map.h"
#include "ScriptedCreature.h"
#include "zulaman.h"
DungeonEncounterData const encounters[] =
{
{ DATA_AKILZON, {{ 1189 }} },
{ DATA_NALORAKK, {{ 1190 }} },
{ DATA_JANALAI, {{ 1191 }} },
{ DATA_HALAZZI, {{ 1192 }} },
{ DATA_HEXLORD, {{ 1193 }} },
{ DATA_DAAKARA, {{ 1194 }} }
};
class instance_zulaman : public InstanceMapScript
{
public:
instance_zulaman() : InstanceMapScript(ZulamanScriptName, 568) { }
struct instance_zulaman_InstanceScript : public InstanceScript
{
instance_zulaman_InstanceScript(InstanceMap* map) : InstanceScript(map),
ZulAmanState(*this, "TimedRunState", NOT_STARTED)
{
SetHeaders(DataHeader);
SetBossNumber(EncounterCount);
LoadDungeonEncounterData(encounters);
SpeedRunTimer = 15;
ZulAmanBossCount = 0;
}
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_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;
}
return ObjectGuid::Empty;
}
void SetData(uint32 type, uint32 data) override
{
switch (type)
{
case DATA_ZULAMAN_STATE:
{
if (data == IN_PROGRESS)
{
DoUpdateWorldState(WORLD_STATE_ZULAMAN_TIMER_ENABLED, 1);
DoUpdateWorldState(WORLD_STATE_ZULAMAN_TIMER, 15);
events.ScheduleEvent(EVENT_UPDATE_ZULAMAN_TIMER, 1min);
SpeedRunTimer = 15;
ZulAmanState = data;
}
break;
}
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)
{
++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;
}
}
}
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, WorldObject* /*invoker*/) 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) override
{
if (events.Empty())
return;
events.Update(diff);
while (uint32 eventId = events.ExecuteEvent())
{
switch (eventId)
{
case EVENT_UPDATE_ZULAMAN_TIMER:
DoUpdateWorldState(WORLD_STATE_ZULAMAN_TIMER, --SpeedRunTimer);
if (SpeedRunTimer)
events.ScheduleEvent(EVENT_UPDATE_ZULAMAN_TIMER, 1min);
else
{
DoUpdateWorldState(WORLD_STATE_ZULAMAN_TIMER_ENABLED, 0);
events.CancelEvent(EVENT_UPDATE_ZULAMAN_TIMER);
ZulAmanState = FAIL;
}
break;
default:
break;
}
}
}
void AfterDataLoad() override
{
// Speed run cannot be resumed after reset/crash
if (ZulAmanState != NOT_STARTED)
{
SpeedRunTimer = 0;
ZulAmanState.LoadValue(FAIL);
}
}
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;
PersistentInstanceScriptValue ZulAmanState;
uint32 ZulAmanBossCount;
};
InstanceScript* GetInstanceScript(InstanceMap* map) const override
{
return new instance_zulaman_InstanceScript(map);
}
};
void AddSC_instance_zulaman()
{
new instance_zulaman();
}