mirror of
https://github.com/mod-playerbots/azerothcore-wotlk.git
synced 2026-01-16 10:30:27 +00:00
refactor(Scripts/AhnKahet): Move Ancient Nerubian Device script to SAI (#17734)
This commit is contained in:
@@ -33,8 +33,6 @@ enum AhnkahetData
|
||||
// Other data
|
||||
// Teldram encounter related
|
||||
DATA_PRINCE_TALDARAM_PLATFORM,
|
||||
DATA_TELDRAM_SPHERE1,
|
||||
DATA_TELDRAM_SPHERE2,
|
||||
};
|
||||
|
||||
enum AhnKahetCreatures
|
||||
@@ -66,6 +64,18 @@ enum AhnKahetActions
|
||||
ACTION_REMOVE_PRISON = -1
|
||||
};
|
||||
|
||||
enum AhnKahetTexts
|
||||
{
|
||||
SAY_SPHERE_ACTIVATED = 0
|
||||
};
|
||||
|
||||
enum AhnKahetPersistentData
|
||||
{
|
||||
DATA_TELDRAM_SPHERE1,
|
||||
DATA_TELDRAM_SPHERE2,
|
||||
MAX_PERSISTENT_DATA
|
||||
};
|
||||
|
||||
template <class AI, class T>
|
||||
inline AI* GetAhnKahetAI(T* obj)
|
||||
{
|
||||
|
||||
@@ -74,7 +74,7 @@ enum Event
|
||||
|
||||
enum Yells
|
||||
{
|
||||
SAY_SPHERE_ACTIVATED = 0,
|
||||
//SAY_SPHERE_ACTIVATED = 0,
|
||||
SAY_REMOVE_PRISON = 1,
|
||||
SAY_AGGRO = 2,
|
||||
SAY_SLAY = 3,
|
||||
@@ -212,7 +212,7 @@ struct boss_taldaram : public BossAI
|
||||
BossAI::InitializeAI();
|
||||
|
||||
// Event not started
|
||||
if (instance->GetData(DATA_TELDRAM_SPHERE1) != DONE || instance->GetData(DATA_TELDRAM_SPHERE2) != DONE)
|
||||
if (instance->GetPersistentData(DATA_TELDRAM_SPHERE1) != DONE || instance->GetPersistentData(DATA_TELDRAM_SPHERE2) != DONE)
|
||||
{
|
||||
me->SetImmuneToAll(true);
|
||||
me->SetDisableGravity(true);
|
||||
@@ -226,7 +226,7 @@ struct boss_taldaram : public BossAI
|
||||
return;
|
||||
}
|
||||
|
||||
if (instance->GetData(DATA_TELDRAM_SPHERE1) == DONE && instance->GetData(DATA_TELDRAM_SPHERE2) == DONE)
|
||||
if (instance->GetPersistentData(DATA_TELDRAM_SPHERE1) == DONE && instance->GetPersistentData(DATA_TELDRAM_SPHERE2) == DONE)
|
||||
{
|
||||
DoAction(ACTION_REMOVE_PRISON_AT_RESET);
|
||||
}
|
||||
@@ -490,44 +490,6 @@ private:
|
||||
}
|
||||
};
|
||||
|
||||
/// @todo: Turn into new script type when Gossips have been updated
|
||||
class go_prince_taldaram_sphere : public GameObjectScript
|
||||
{
|
||||
public:
|
||||
go_prince_taldaram_sphere() : GameObjectScript("go_prince_taldaram_sphere") {}
|
||||
|
||||
bool OnGossipHello(Player* pPlayer, GameObject* go) override
|
||||
{
|
||||
if (pPlayer && pPlayer->IsInCombat())
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
InstanceScript* pInstance = go->GetInstanceScript();
|
||||
if (!pInstance)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
go->SetGameObjectFlag(GO_FLAG_NOT_SELECTABLE);
|
||||
go->SetGoState(GO_STATE_ACTIVE);
|
||||
|
||||
uint32 const objectIndex = go->GetEntry() == GO_TELDARAM_SPHERE1 ? DATA_TELDRAM_SPHERE1 : DATA_TELDRAM_SPHERE2;
|
||||
if (pInstance->GetData(objectIndex) == NOT_STARTED)
|
||||
{
|
||||
Creature* taldaram = ObjectAccessor::GetCreature(*go, pInstance->GetGuidData(DATA_PRINCE_TALDARAM));
|
||||
if (taldaram && taldaram->IsAlive())
|
||||
{
|
||||
taldaram->AI()->Talk(SAY_SPHERE_ACTIVATED);
|
||||
}
|
||||
|
||||
pInstance->SetData(objectIndex, DONE);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
};
|
||||
|
||||
// 55931 - Conjure Flame Sphere
|
||||
class spell_prince_taldaram_conjure_flame_sphere : public SpellScript
|
||||
{
|
||||
@@ -581,7 +543,6 @@ void AddSC_boss_taldaram()
|
||||
{
|
||||
RegisterAhnKahetCreatureAI(npc_taldaram_flamesphere);
|
||||
RegisterAhnKahetCreatureAI(boss_taldaram);
|
||||
new go_prince_taldaram_sphere();
|
||||
|
||||
// Spells
|
||||
RegisterSpellScript(spell_prince_taldaram_conjure_flame_sphere);
|
||||
|
||||
@@ -20,7 +20,18 @@
|
||||
#include "ScriptedCreature.h"
|
||||
#include "SpellScript.h"
|
||||
#include "ahnkahet.h"
|
||||
#include <array>
|
||||
|
||||
ObjectData const creatureData[] =
|
||||
{
|
||||
{ NPC_PRINCE_TALDARAM, DATA_PRINCE_TALDARAM },
|
||||
{ 0, 0 }
|
||||
};
|
||||
|
||||
DoorData const doorData[] =
|
||||
{
|
||||
{ GO_TELDARAM_DOOR, DATA_PRINCE_TALDARAM, DOOR_TYPE_PASSAGE },
|
||||
{ 0, 0, DOOR_TYPE_ROOM }
|
||||
};
|
||||
|
||||
class instance_ahnkahet : public InstanceMapScript
|
||||
{
|
||||
@@ -29,180 +40,78 @@ public:
|
||||
|
||||
struct instance_ahnkahet_InstanceScript : public InstanceScript
|
||||
{
|
||||
instance_ahnkahet_InstanceScript(Map* pMap) : InstanceScript(pMap), canSaveBossStates(false)
|
||||
instance_ahnkahet_InstanceScript(Map* pMap) : InstanceScript(pMap)
|
||||
{
|
||||
SetHeaders(DataHeader);
|
||||
SetBossNumber(MAX_ENCOUNTER);
|
||||
teldaramSpheres.fill(NOT_STARTED);
|
||||
SetPersistentDataCount(MAX_PERSISTENT_DATA);
|
||||
LoadObjectData(creatureData, nullptr);
|
||||
LoadDoorData(doorData);
|
||||
}
|
||||
|
||||
void OnCreatureCreate(Creature* pCreature) override
|
||||
void OnGameObjectCreate(GameObject* go) 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())
|
||||
switch (go->GetEntry())
|
||||
{
|
||||
case GO_TELDARAM_PLATFORM:
|
||||
{
|
||||
taldaramPlatform_GUID = pGo->GetGUID();
|
||||
if (IsAllSpheresActivated() || GetBossState(DATA_PRINCE_TALDARAM) == DONE)
|
||||
{
|
||||
HandleGameObject(ObjectGuid::Empty, true, pGo);
|
||||
}
|
||||
|
||||
taldaramPlatform_GUID = go->GetGUID();
|
||||
HandleGameObject(ObjectGuid::Empty, IsAllSpheresActivated(), go);
|
||||
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)
|
||||
if (GetPersistentData(go->GetEntry() == GO_TELDARAM_SPHERE1 ? 0 : 1) == DONE || GetBossState(DATA_PRINCE_TALDARAM) == DONE)
|
||||
{
|
||||
pGo->SetGoState(GO_STATE_ACTIVE);
|
||||
pGo->SetGameObjectFlag(GO_FLAG_NOT_SELECTABLE);
|
||||
go->SetGoState(GO_STATE_ACTIVE);
|
||||
go->SetGameObjectFlag(GO_FLAG_NOT_SELECTABLE);
|
||||
}
|
||||
else
|
||||
{
|
||||
pGo->RemoveGameObjectFlag(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);
|
||||
go->RemoveGameObjectFlag(GO_FLAG_NOT_SELECTABLE);
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
InstanceScript::OnGameObjectCreate(go);
|
||||
}
|
||||
|
||||
bool SetBossState(uint32 type, EncounterState state) override
|
||||
void SetData(uint32 type, uint32 /*data*/) override
|
||||
{
|
||||
if (!InstanceScript::SetBossState(type, state))
|
||||
uint8 index = type == DATA_TELDRAM_SPHERE1 ? 0 : 1;
|
||||
|
||||
if ((type == DATA_TELDRAM_SPHERE1 || type == DATA_TELDRAM_SPHERE2) && GetPersistentData(index) != DONE)
|
||||
{
|
||||
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;
|
||||
StorePersistentData(index, DONE);
|
||||
SaveToDB();
|
||||
|
||||
if (IsAllSpheresActivated())
|
||||
if (Creature* taldaram = GetCreature(DATA_PRINCE_TALDARAM))
|
||||
{
|
||||
HandleGameObject(taldaramPlatform_GUID, true, nullptr);
|
||||
|
||||
Creature* teldaram = instance->GetCreature(princeTaldaram_GUID);
|
||||
if (teldaram && teldaram->IsAlive())
|
||||
if (taldaram->IsAlive())
|
||||
{
|
||||
teldaram->AI()->DoAction(ACTION_REMOVE_PRISON);
|
||||
taldaram->AI()->Talk(SAY_SPHERE_ACTIVATED);
|
||||
|
||||
if (IsAllSpheresActivated())
|
||||
{
|
||||
HandleGameObject(taldaramPlatform_GUID, true, nullptr);
|
||||
taldaram->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;
|
||||
}
|
||||
|
||||
void ReadSaveDataMore(std::istringstream& data) override
|
||||
{
|
||||
data >> teldaramSpheres[0];
|
||||
data >> teldaramSpheres[1];
|
||||
|
||||
canSaveBossStates = true;
|
||||
}
|
||||
|
||||
void WriteSaveDataMore(std::ostringstream& data) override
|
||||
{
|
||||
data << teldaramSpheres[0] << ' '
|
||||
<< teldaramSpheres[1];
|
||||
}
|
||||
|
||||
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<uint32, 2> 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;
|
||||
return GetBossState(DATA_PRINCE_TALDARAM) == DONE ||
|
||||
(GetPersistentData(DATA_TELDRAM_SPHERE1) == DONE && GetPersistentData(DATA_TELDRAM_SPHERE2) == DONE);
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user