/*
* 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 Affero General Public License as published by the
* Free Software Foundation; either version 3 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 Affero 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 "ScriptedCreature.h"
#include "ahnkahet.h"
#include "Player.h"
#include "SpellScript.h"
#include
class instance_ahnkahet : public InstanceMapScript
{
public:
instance_ahnkahet() : InstanceMapScript(AhnahetScriptName, 619) { }
struct instance_ahnkahet_InstanceScript : public InstanceScript
{
instance_ahnkahet_InstanceScript(Map* pMap) : InstanceScript(pMap), canSaveBossStates(false)
{
SetBossNumber(MAX_ENCOUNTER);
teldaramSpheres.fill(NOT_STARTED);
}
void OnCreatureCreate(Creature* pCreature) override
{
switch (pCreature->GetEntry())
{
case NPC_ELDER_NADOX:
elderNadox_GUID = pCreature->GetGUID();
break;
case NPC_PRINCE_TALDARAM:
princeTaldaram_GUID = pCreature->GetGUID();
break;
case NPC_JEDOGA_SHADOWSEEKER:
jedogaShadowseeker_GUID = pCreature->GetGUID();
break;
case NPC_HERALD_JOLAZJ:
heraldVolazj_GUID = pCreature->GetGUID();
break;
case NPC_AMANITAR:
amanitar_GUID = pCreature->GetGUID();
break;
}
}
void OnGameObjectCreate(GameObject* pGo) override
{
switch (pGo->GetEntry())
{
case GO_TELDARAM_PLATFORM:
{
taldaramPlatform_GUID = pGo->GetGUID();
if (IsAllSpheresActivated() || GetBossState(DATA_PRINCE_TALDARAM) == DONE)
{
HandleGameObject(ObjectGuid::Empty, true, pGo);
}
break;
}
case GO_TELDARAM_SPHERE1:
case GO_TELDARAM_SPHERE2:
{
if (teldaramSpheres.at(pGo->GetEntry() == GO_TELDARAM_SPHERE1 ? 0 : 1) == DONE || GetBossState(DATA_PRINCE_TALDARAM) == DONE)
{
pGo->SetGoState(GO_STATE_ACTIVE);
pGo->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
}
else
{
pGo->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
}
break;
}
case GO_TELDARAM_DOOR:
{
taldaramGate_GUID = pGo->GetGUID(); // Web gate past Prince Taldaram
if (GetBossState(DATA_PRINCE_TALDARAM) == DONE)
{
HandleGameObject(ObjectGuid::Empty, true, pGo);
}
break;
}
}
}
bool SetBossState(uint32 type, EncounterState state) override
{
if (!InstanceScript::SetBossState(type, state))
{
return false;
}
if (type == DATA_PRINCE_TALDARAM && state == DONE)
{
HandleGameObject(taldaramGate_GUID, true);
}
if (canSaveBossStates)
{
SaveToDB();
}
return true;
}
void SetData(uint32 type, uint32 data) override
{
if (type == DATA_TELDRAM_SPHERE1 || type == DATA_TELDRAM_SPHERE2)
{
teldaramSpheres[type == DATA_TELDRAM_SPHERE1 ? 0 : 1] = data;
SaveToDB();
if (IsAllSpheresActivated())
{
HandleGameObject(taldaramPlatform_GUID, true, nullptr);
Creature* teldaram = instance->GetCreature(princeTaldaram_GUID);
if (teldaram && teldaram->IsAlive())
{
teldaram->AI()->DoAction(ACTION_REMOVE_PRISON);
}
}
}
}
uint32 GetData(uint32 type) const override
{
switch (type)
{
case DATA_TELDRAM_SPHERE1:
return teldaramSpheres.at(0);
case DATA_TELDRAM_SPHERE2:
return teldaramSpheres.at(1);
}
return 0;
}
ObjectGuid GetGuidData(uint32 type) const override
{
switch (type)
{
case DATA_ELDER_NADOX:
return elderNadox_GUID;
case DATA_PRINCE_TALDARAM:
return princeTaldaram_GUID;
case DATA_JEDOGA_SHADOWSEEKER:
return jedogaShadowseeker_GUID;
case DATA_HERALD_VOLAZJ:
return heraldVolazj_GUID;
case DATA_AMANITAR:
return amanitar_GUID;
}
return ObjectGuid::Empty;
}
std::string GetSaveData() override
{
OUT_SAVE_INST_DATA;
std::ostringstream saveStream;
// Encounter states
saveStream << "A K " << GetBossSaveData();
// Extra data
saveStream << teldaramSpheres[0] << ' ' << teldaramSpheres[1];
OUT_SAVE_INST_DATA_COMPLETE;
return saveStream.str();
}
void Load(const char* in) override
{
if (!in)
{
OUT_LOAD_INST_DATA_FAIL;
return;
}
OUT_LOAD_INST_DATA(in);
char dataHead1, dataHead2;
std::istringstream loadStream(in);
loadStream >> dataHead1 >> dataHead2;
if (dataHead1 == 'A' && dataHead2 == 'K')
{
// Encounter states
for (uint8 i = 0; i < MAX_ENCOUNTER; ++i)
{
uint32 tmpState;
loadStream >> tmpState;
if (tmpState == IN_PROGRESS || tmpState > SPECIAL)
{
tmpState = NOT_STARTED;
}
SetBossState(i, EncounterState(tmpState));
}
// Extra data
loadStream >> teldaramSpheres[0] >> teldaramSpheres[1];
}
else
{
OUT_LOAD_INST_DATA_FAIL;
return;
}
canSaveBossStates = true;
OUT_LOAD_INST_DATA_COMPLETE;
}
private:
ObjectGuid elderNadox_GUID;
ObjectGuid princeTaldaram_GUID;
ObjectGuid jedogaShadowseeker_GUID;
ObjectGuid heraldVolazj_GUID;
ObjectGuid amanitar_GUID;
// Teldaram related
ObjectGuid taldaramPlatform_GUID;
ObjectGuid taldaramGate_GUID;
std::array teldaramSpheres; // Used to identify activation status for sphere activation
bool canSaveBossStates; // Indicates that it is safe to trigger SaveToDB call in SetBossState
bool IsAllSpheresActivated() const
{
return teldaramSpheres.at(0) == DONE && teldaramSpheres.at(1) == DONE;
}
};
InstanceScript* GetInstanceScript(InstanceMap* map) const override
{
return new instance_ahnkahet_InstanceScript(map);
}
};
// 56702 Shadow Sickle
// 59103 Shadow Sickle
class spell_shadow_sickle_periodic_damage : public SpellScriptLoader
{
public:
spell_shadow_sickle_periodic_damage() : SpellScriptLoader("spell_shadow_sickle_periodic_damage") { }
class spell_shadow_sickle_periodic_damage_AuraScript : public AuraScript
{
PrepareAuraScript(spell_shadow_sickle_periodic_damage_AuraScript);
void HandlePeriodic(AuraEffect const* /*aurEff*/)
{
GetCaster()->CastSpell(nullptr, SPELL_SHADOW_SICKLE);
}
void Register() override
{
OnEffectPeriodic += AuraEffectPeriodicFn(spell_shadow_sickle_periodic_damage_AuraScript::HandlePeriodic, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL);
}
};
AuraScript* GetAuraScript() const override
{
return new spell_shadow_sickle_periodic_damage_AuraScript();
}
};
void AddSC_instance_ahnkahet()
{
new instance_ahnkahet;
new spell_shadow_sickle_periodic_damage();
}