Core/Scripts: Boss Jedoga Shadowseeker rewrite (#20279)

* Core/Scripts: Boss Jedoga Shadowseeker rewrite

Added all missing spells and visuals
Added Twilight volunteers in the fight
Fixed Jedoga Controller's behavior, mostly moved to boss_prince_taldaram, where they belong
Updated script register model
Misc updates and improvements
Updated instance model
This commit is contained in:
Gustavo
2017-09-25 17:17:42 -03:00
committed by GitHub
parent cb9b9f7247
commit f1ff7e642f
5 changed files with 518 additions and 687 deletions

View File

@@ -37,13 +37,7 @@ enum AKDataTypes
// Additional Data
DATA_SPHERE_1 = 5,
DATA_SPHERE_2 = 6,
DATA_PRINCE_TALDARAM_PLATFORM = 7,
DATA_PL_JEDOGA_TARGET = 8,
DATA_ADD_JEDOGA_OPFER = 9,
DATA_ADD_JEDOGA_INITIAND = 10,
DATA_JEDOGA_TRIGGER_SWITCH = 11,
DATA_JEDOGA_RESET_INITIANDS = 12,
DATA_ALL_INITIAND_DEAD = 13
DATA_PRINCE_TALDARAM_PLATFORM = 7
};
enum AKCreatureIds
@@ -59,7 +53,9 @@ enum AKCreatureIds
NPC_AHNKAHAR_SWARMER = 30178,
// Jedoga Shadowseeker
NPC_INITIAND = 30114,
NPC_TWILIGHT_INITIATE = 30114,
NPC_TWILIGHT_VOLUNTEER = 30385,
NPC_TWILIGHT_WORSHIPPER = 30111,
NPC_JEDOGA_CONTROLLER = 30181,
// Amanitar
@@ -88,4 +84,6 @@ inline AI* GetAhnKahetAI(T* obj)
return GetInstanceAI<AI>(obj, AhnKahetScriptName);
}
#define RegisterAhnKahetCreatureAI(ai_name) RegisterCreatureAIWithFactory(ai_name, GetAhnKahetAI)
#endif // AHNKAHET_H_

View File

@@ -53,7 +53,8 @@ enum Spells
enum Misc
{
DATA_EMBRACE_DMG = 20000,
H_DATA_EMBRACE_DMG = 40000
H_DATA_EMBRACE_DMG = 40000,
SUMMON_GROUP_CONTROLLERS = 1
};
#define DATA_SPHERE_DISTANCE 25.0f
@@ -104,6 +105,9 @@ class boss_prince_taldaram : public CreatureScript
_flameSphereTargetGUID.Clear();
_embraceTargetGUID.Clear();
_embraceTakenDamage = 0;
if (!CheckSpheres())
me->SummonCreatureGroup(SUMMON_GROUP_CONTROLLERS);
}
void EnterCombat(Unit* /*who*/) override
@@ -125,6 +129,10 @@ class boss_prince_taldaram : public CreatureScript
case NPC_FLAME_SPHERE_2:
case NPC_FLAME_SPHERE_3:
summon->AI()->SetGUID(_flameSphereTargetGUID);
break;
case NPC_JEDOGA_CONTROLLER:
summon->CastSpell(me, SPELL_BEAM_VISUAL);
break;
default:
return;
}
@@ -266,13 +274,15 @@ class boss_prince_taldaram : public CreatureScript
void RemovePrison()
{
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
summons.DespawnEntry(NPC_JEDOGA_CONTROLLER);
me->RemoveAurasDueToSpell(SPELL_BEAM_VISUAL);
me->SetHomePosition(me->GetPositionX(), me->GetPositionY(), DATA_GROUND_POSITION_Z, me->GetOrientation());
DoCast(SPELL_HOVER_FALL);
me->SetDisableGravity(false);
me->GetMotionMaster()->MoveLand(0, me->GetHomePosition());
Talk(SAY_WARNING);
instance->HandleGameObject(instance->GetGuidData(DATA_PRINCE_TALDARAM_PLATFORM), true);
if (GameObject* platform = instance->GetGameObject(DATA_PRINCE_TALDARAM_PLATFORM))
instance->HandleGameObject(platform->GetGUID(), true);
}
private:
@@ -395,7 +405,7 @@ class go_prince_taldaram_sphere : public GameObjectScript
bool GossipHello(Player* /*player*/) override
{
Creature* princeTaldaram = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_PRINCE_TALDARAM));
Creature* princeTaldaram = instance->GetCreature(DATA_PRINCE_TALDARAM);
if (princeTaldaram && princeTaldaram->IsAlive())
{
me->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);

View File

@@ -16,9 +16,9 @@
*/
#include "ScriptMgr.h"
#include "AreaBoundary.h"
#include "ahnkahet.h"
#include "Creature.h"
#include "CreatureAI.h"
#include "GameObject.h"
#include "InstanceScript.h"
#include "Map.h"
@@ -29,6 +29,27 @@ DoorData const doorData[] =
{ 0, 0, DOOR_TYPE_ROOM } // END
};
ObjectData const creatureData[] =
{
{ NPC_ELDER_NADOX, DATA_ELDER_NADOX },
{ NPC_PRINCE_TALDARAM, DATA_PRINCE_TALDARAM },
{ NPC_JEDOGA_SHADOWSEEKER, DATA_JEDOGA_SHADOWSEEKER },
{ NPC_AMANITAR, DATA_AMANITAR },
{ NPC_HERALD_VOLAZJ, DATA_HERALD_VOLAZJ },
{ 0, 0 }
};
ObjectData const gameObjectData[] =
{
{ GO_PRINCE_TALDARAM_PLATFORM, DATA_PRINCE_TALDARAM_PLATFORM },
{ 0, 0 } //END
};
BossBoundaryData const boundaries =
{
{ DATA_JEDOGA_SHADOWSEEKER, new ParallelogramBoundary(Position(460.365f, -661.997f, -20.985f), Position(364.958f,-790.211f, -14.207f), Position(347.436f,-657.978f,14.478f)) }
};
class instance_ahnkahet : public InstanceMapScript
{
public:
@@ -41,46 +62,20 @@ class instance_ahnkahet : public InstanceMapScript
SetHeaders(DataHeader);
SetBossNumber(EncounterCount);
LoadDoorData(doorData);
SwitchTrigger = 0;
LoadObjectData(creatureData, gameObjectData);
LoadBossBoundaries(boundaries);
SpheresState[0] = 0;
SpheresState[1] = 0;
}
void OnCreatureCreate(Creature* creature) override
{
switch (creature->GetEntry())
{
case NPC_ELDER_NADOX:
ElderNadoxGUID = creature->GetGUID();
break;
case NPC_PRINCE_TALDARAM:
PrinceTaldaramGUID = creature->GetGUID();
break;
case NPC_JEDOGA_SHADOWSEEKER:
JedogaShadowseekerGUID = creature->GetGUID();
break;
case NPC_AMANITAR:
AmanitarGUID = creature->GetGUID();
break;
case NPC_HERALD_VOLAZJ:
HeraldVolazjGUID = creature->GetGUID();
break;
case NPC_INITIAND:
InitiandGUIDs.insert(creature->GetGUID());
break;
default:
break;
}
}
void OnGameObjectCreate(GameObject* go) override
{
InstanceScript::OnGameObjectCreate(go);
switch (go->GetEntry())
{
case GO_PRINCE_TALDARAM_PLATFORM:
PrinceTaldaramPlatformGUID = go->GetGUID();
if (GetBossState(DATA_PRINCE_TALDARAM) == DONE)
HandleGameObject(ObjectGuid::Empty, true, go);
break;
@@ -102,21 +97,6 @@ class instance_ahnkahet : public InstanceMapScript
else
go->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
break;
case GO_PRINCE_TALDARAM_GATE:
AddDoor(go, true);
break;
default:
break;
}
}
void OnGameObjectRemove(GameObject* go) override
{
switch (go->GetEntry())
{
case GO_PRINCE_TALDARAM_GATE:
AddDoor(go, false);
break;
default:
break;
}
@@ -130,20 +110,6 @@ class instance_ahnkahet : public InstanceMapScript
case DATA_SPHERE_2:
SpheresState[type - DATA_SPHERE_1] = data;
break;
case DATA_JEDOGA_TRIGGER_SWITCH:
SwitchTrigger = data;
break;
case DATA_JEDOGA_RESET_INITIANDS:
for (ObjectGuid guid : InitiandGUIDs)
{
if (Creature* creature = instance->GetCreature(guid))
{
creature->Respawn();
if (!creature->IsInEvadeMode())
creature->AI()->EnterEvadeMode();
}
}
break;
default:
break;
}
@@ -156,99 +122,12 @@ class instance_ahnkahet : public InstanceMapScript
case DATA_SPHERE_1:
case DATA_SPHERE_2:
return SpheresState[type - DATA_SPHERE_1];
case DATA_ALL_INITIAND_DEAD:
for (ObjectGuid guid : InitiandGUIDs)
{
Creature* cr = instance->GetCreature(guid);
if (!cr || cr->IsAlive())
return 0;
}
return 1;
case DATA_JEDOGA_TRIGGER_SWITCH:
return SwitchTrigger;
default:
break;
}
return 0;
}
void SetGuidData(uint32 type, ObjectGuid data) override
{
switch (type)
{
case DATA_ADD_JEDOGA_OPFER:
JedogaSacrifices = data;
break;
case DATA_PL_JEDOGA_TARGET:
JedogaTarget = data;
break;
default:
break;
}
}
ObjectGuid GetGuidData(uint32 type) const override
{
switch (type)
{
case DATA_ELDER_NADOX:
return ElderNadoxGUID;
case DATA_PRINCE_TALDARAM:
return PrinceTaldaramGUID;
case DATA_JEDOGA_SHADOWSEEKER:
return JedogaShadowseekerGUID;
case DATA_AMANITAR:
return AmanitarGUID;
case DATA_HERALD_VOLAZJ:
return HeraldVolazjGUID;
case DATA_PRINCE_TALDARAM_PLATFORM:
return PrinceTaldaramPlatformGUID;
case DATA_ADD_JEDOGA_INITIAND:
{
GuidVector vInitiands;
vInitiands.reserve(InitiandGUIDs.size());
for (ObjectGuid guid : InitiandGUIDs)
{
Creature* cr = instance->GetCreature(guid);
if (cr && cr->IsAlive())
vInitiands.push_back(guid);
}
if (vInitiands.empty())
return ObjectGuid::Empty;
return Trinity::Containers::SelectRandomContainerElement(vInitiands);
}
case DATA_ADD_JEDOGA_OPFER:
return JedogaSacrifices;
case DATA_PL_JEDOGA_TARGET:
return JedogaTarget;
default:
break;
}
return ObjectGuid::Empty;
}
bool SetBossState(uint32 type, EncounterState state) override
{
if (!InstanceScript::SetBossState(type, state))
return false;
switch (type)
{
case DATA_JEDOGA_SHADOWSEEKER:
if (state == DONE)
{
for (ObjectGuid guid : InitiandGUIDs)
if (Creature* cr = instance->GetCreature(guid))
cr->DespawnOrUnsummon();
}
break;
default:
break;
}
return true;
}
void WriteSaveDataMore(std::ostringstream& data) override
{
data << SpheresState[0] << ' ' << SpheresState[1];
@@ -261,20 +140,7 @@ class instance_ahnkahet : public InstanceMapScript
}
protected:
ObjectGuid ElderNadoxGUID;
ObjectGuid PrinceTaldaramGUID;
ObjectGuid JedogaShadowseekerGUID;
ObjectGuid AmanitarGUID;
ObjectGuid HeraldVolazjGUID;
ObjectGuid PrinceTaldaramPlatformGUID;
ObjectGuid JedogaSacrifices;
ObjectGuid JedogaTarget;
GuidSet InitiandGUIDs;
uint32 SpheresState[2];
uint8 SwitchTrigger;
};
InstanceScript* GetInstanceScript(InstanceMap* map) const override