/*
* This file is part of the AzerothCore 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 "GameEventMgr.h"
#include "GameObjectAI.h"
#include "GameObjectScript.h"
#include "InstanceMapScript.h"
#include "InstanceScript.h"
#include "zulgurub.h"
DoorData const doorData[] =
{
{ GO_FORCEFIELD, DATA_ARLOKK, DOOR_TYPE_ROOM },
{ 0, 0, DOOR_TYPE_ROOM }
};
ObjectData const creatureData[] =
{
{ NPC_HIGH_PRIEST_THEKAL, DATA_THEKAL },
{ NPC_ZEALOT_LORKHAN, DATA_LORKHAN },
{ NPC_ZEALOT_ZATH, DATA_ZATH },
{ NPC_PRIESTESS_MARLI, DATA_MARLI },
{ 0, 0 }
};
class instance_zulgurub : public InstanceMapScript
{
public:
instance_zulgurub(): InstanceMapScript(ZGScriptName, MAP_ZUL_GURUB) { }
struct instance_zulgurub_InstanceMapScript : public InstanceScript
{
instance_zulgurub_InstanceMapScript(Map* map) : InstanceScript(map)
{
SetHeaders(DataHeader);
SetBossNumber(EncounterCount);
LoadDoorData(doorData);
LoadObjectData(creatureData, nullptr);
}
void OnCreatureCreate(Creature* creature) override
{
InstanceScript::OnCreatureCreate(creature);
switch (creature->GetEntry())
{
case NPC_JINDO_THE_HEXXER:
_jindoTheHexxerGUID = creature->GetGUID();
break;
case NPC_VILEBRANCH_SPEAKER:
_vilebranchSpeakerGUID = creature->GetGUID();
break;
case NPC_ARLOKK:
_arlokkGUID = creature->GetGUID();
break;
case NPC_HAKKAR:
_hakkarGUID = creature->GetGUID();
break;
case NPC_SPAWN_OF_MARLI:
if (Creature* marli = GetCreature(DATA_MARLI))
{
marli->AI()->JustSummoned(creature);
}
break;
case NPC_GAHZRANKA:
_gahzrankaGUID = creature->GetGUID();
break;
case NPC_GRILEK:
case NPC_HAZZARAH:
case NPC_RENATAKI:
case NPC_WUSHOOLAY:
_edgeOfMadnessGUID = creature->GetGUID();
break;
default:
break;
}
}
void OnGameObjectCreate(GameObject* go) override
{
InstanceScript::OnGameObjectCreate(go);
switch (go->GetEntry())
{
case GO_GONG_OF_BETHEKK:
_goGongOfBethekkGUID = go->GetGUID();
if (GetBossState(DATA_ARLOKK) == DONE)
go->SetGameObjectFlag(GO_FLAG_NOT_SELECTABLE);
else
go->RemoveGameObjectFlag(GO_FLAG_NOT_SELECTABLE);
break;
default:
break;
}
}
ObjectGuid GetGuidData(uint32 uiData) const override
{
switch (uiData)
{
case DATA_JINDO:
return _jindoTheHexxerGUID;
case NPC_ARLOKK:
return _arlokkGUID;
case GO_GONG_OF_BETHEKK:
return _goGongOfBethekkGUID;
case DATA_HAKKAR:
return _hakkarGUID;
case DATA_EDGE_OF_MADNESS:
return _edgeOfMadnessGUID;
}
return ObjectGuid::Empty;
}
uint32 GetData(uint32 type) const override
{
if (type == DATA_GAHZRANKA)
{
return _gahzrankaGUID || GetBossState(DATA_GAHZRANKA) == DONE;
}
return 0;
}
void RemoveHakkarPowerStack()
{
if (Creature* hakkar = instance->GetCreature(_hakkarGUID))
{
hakkar->CastSpell(hakkar, SPELL_HAKKAR_POWER_DOWN, true);
}
}
bool SetBossState(uint32 type, EncounterState state) override
{
if (!InstanceScript::SetBossState(type, state))
return false;
switch (type)
{
case DATA_JEKLIK:
case DATA_VENOXIS:
case DATA_MARLI:
case DATA_ARLOKK:
case DATA_THEKAL:
if (state == DONE)
RemoveHakkarPowerStack();
break;
default:
break;
}
return true;
}
private:
// If all High Priest bosses were killed. Ohgan is added too.
// Jindo is needed for healfunction.
ObjectGuid _jindoTheHexxerGUID;
ObjectGuid _vilebranchSpeakerGUID;
ObjectGuid _arlokkGUID;
ObjectGuid _goGongOfBethekkGUID;
ObjectGuid _hakkarGUID;
ObjectGuid _gahzrankaGUID;
ObjectGuid _edgeOfMadnessGUID;
};
InstanceScript* GetInstanceScript(InstanceMap* map) const override
{
return new instance_zulgurub_InstanceMapScript(map);
}
};
enum EdgeOfMadnessEnum
{
EVENT_EDGE_OF_MADNESS_GRILEK = 27,
EVENT_EDGE_OF_MADNESS_HAZZARAH = 28,
EVENT_EDGE_OF_MADNESS_RENATAKI = 29,
EVENT_EDGE_OF_MADNESS_WUSHOOLAY = 30
};
std::vector> BrazierOfMadnessContainer =
{
{ EVENT_EDGE_OF_MADNESS_GRILEK, NPC_GRILEK },
{ EVENT_EDGE_OF_MADNESS_HAZZARAH, NPC_HAZZARAH },
{ EVENT_EDGE_OF_MADNESS_RENATAKI, NPC_RENATAKI },
{ EVENT_EDGE_OF_MADNESS_WUSHOOLAY, NPC_WUSHOOLAY }
};
Position const edgeOfMagnessSummonPos = { -11901.229f, -1906.366f, 65.358f, 0.942f };
struct go_brazier_of_madness : public GameObjectAI
{
go_brazier_of_madness(GameObject* go) : GameObjectAI(go) { }
bool GossipHello(Player* /*player*/, bool reportUse) override
{
if (reportUse)
{
return true;
}
if (InstanceScript* instanceScript = me->GetInstanceScript())
{
if (instanceScript->GetGuidData(DATA_EDGE_OF_MADNESS))
{
return false;
}
}
uint32 bossEntry = 0;
for (uint8 i = 0; i < 4; ++i)
{
if (sGameEventMgr->IsActiveEvent(BrazierOfMadnessContainer[i].first))
{
bossEntry = BrazierOfMadnessContainer[i].second;
break;
}
}
if (bossEntry)
{
me->SummonCreature(bossEntry, edgeOfMagnessSummonPos, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 2 * HOUR * IN_MILLISECONDS);
}
return false;
}
};
void AddSC_instance_zulgurub()
{
new instance_zulgurub();
RegisterGameObjectAI(go_brazier_of_madness);
}