Scripts/Magister Terrace: Felblood Kaelthas rewrite

Cherrypick of ae440400aa
This commit is contained in:
Ovah
2019-01-28 15:01:20 -03:00
committed by Keader
parent fd69c133b1
commit 00958c9178
6 changed files with 590 additions and 671 deletions

View File

@@ -16,13 +16,14 @@
*/
#include "ScriptMgr.h"
#include "CreatureAI.h"
#include "EventMap.h"
#include "GameObject.h"
#include "InstanceScript.h"
#include "magisters_terrace.h"
#include "Map.h"
#include "MotionMaster.h"
#include "ScriptedCreature.h"
#include "ObjectAccessor.h"
#include "TemporarySummon.h"
/*
@@ -32,17 +33,24 @@
3 - Kael'thas Sunstrider
*/
ObjectData const creatureData[] =
{
{ BOSS_KAELTHAS_SUNSTRIDER, DATA_KAELTHAS_SUNSTRIDER },
{ 0, 0 } // END
};
DoorData const doorData[] =
{
{ GO_SELIN_DOOR, DATA_SELIN, DOOR_TYPE_PASSAGE },
{ GO_SELIN_ENCOUNTER_DOOR, DATA_SELIN, DOOR_TYPE_ROOM },
{ GO_VEXALLUS_DOOR, DATA_VEXALLUS, DOOR_TYPE_PASSAGE },
{ GO_DELRISSA_DOOR, DATA_DELRISSA, DOOR_TYPE_PASSAGE },
{ GO_KAEL_DOOR, DATA_KAELTHAS, DOOR_TYPE_ROOM },
{ 0, 0, DOOR_TYPE_ROOM } // END
{ GO_SELIN_DOOR, DATA_SELIN, DOOR_TYPE_PASSAGE },
{ GO_SELIN_ENCOUNTER_DOOR, DATA_SELIN, DOOR_TYPE_ROOM },
{ GO_VEXALLUS_DOOR, DATA_VEXALLUS, DOOR_TYPE_PASSAGE },
{ GO_DELRISSA_DOOR, DATA_DELRISSA, DOOR_TYPE_PASSAGE },
{ GO_ASYLUM_DOOR, DATA_KAELTHAS_SUNSTRIDER, DOOR_TYPE_ROOM },
{ 0, 0, DOOR_TYPE_ROOM } // END
};
Position const KalecgosSpawnPos = { 164.3747f, -397.1197f, 2.151798f, 1.66219f };
Position const KaelthasTrashGroupDistanceComparisonPos = { 150.0f, 141.0f, -14.4f };
class instance_magisters_terrace : public InstanceMapScript
{
@@ -51,13 +59,19 @@ class instance_magisters_terrace : public InstanceMapScript
struct instance_magisters_terrace_InstanceMapScript : public InstanceScript
{
instance_magisters_terrace_InstanceMapScript(Map* map) : InstanceScript(map)
instance_magisters_terrace_InstanceMapScript(InstanceMap* map) : InstanceScript(map)
{
SetHeaders(DataHeader);
SetBossNumber(EncounterCount);
LoadObjectData(creatureData, nullptr);
LoadDoorData(doorData);
Initialize();
}
DelrissaDeathCount = 0;
void Initialize()
{
_delrissaDeathCount = 0;
_kaelthasIntroState = 0;
}
uint32 GetData(uint32 type) const override
@@ -65,7 +79,9 @@ class instance_magisters_terrace : public InstanceMapScript
switch (type)
{
case DATA_DELRISSA_DEATH_COUNT:
return DelrissaDeathCount;
return _delrissaDeathCount;
case DATA_KAELTHAS_INTRO_STATE:
return _kaelthasIntroState;
default:
break;
}
@@ -78,13 +94,13 @@ class instance_magisters_terrace : public InstanceMapScript
{
case DATA_DELRISSA_DEATH_COUNT:
if (data == SPECIAL)
++DelrissaDeathCount;
_delrissaDeathCount++;
else
DelrissaDeathCount = 0;
_delrissaDeathCount = 0;
break;
case DATA_KAELTHAS_STATUES:
HandleGameObject(KaelStatue[0], data != 0);
HandleGameObject(KaelStatue[1], data != 0);
case DATA_KAELTHAS_INTRO_STATE:
_kaelthasIntroState = data;
SaveToDB();
break;
default:
break;
@@ -93,6 +109,8 @@ class instance_magisters_terrace : public InstanceMapScript
void OnCreatureCreate(Creature* creature) override
{
InstanceScript::OnCreatureCreate(creature);
switch (creature->GetEntry())
{
case NPC_SELIN:
@@ -105,6 +123,45 @@ class instance_magisters_terrace : public InstanceMapScript
case NPC_HUMAN_KALECGOS:
KalecgosGUID = creature->GetGUID();
break;
case NPC_COILSKAR_WITCH:
case NPC_SUNBLADE_WARLOCK:
case NPC_SUNBLADE_MAGE_GUARD:
case NPC_SISTER_OF_TORMENT:
case NPC_ETHEREUM_SMUGGLER:
case NPC_SUNBLADE_BLOOD_KNIGHT:
if (creature->GetDistance(KaelthasTrashGroupDistanceComparisonPos) < 10.0f)
_kaelthasPreTrashGUIDs.insert(creature->GetGUID());
default:
break;
}
}
void OnUnitDeath(Unit* unit) override
{
if (unit->GetTypeId() != TYPEID_UNIT)
return;
switch (unit->GetEntry())
{
case NPC_COILSKAR_WITCH:
case NPC_SUNBLADE_WARLOCK:
case NPC_SUNBLADE_MAGE_GUARD:
case NPC_SISTER_OF_TORMENT:
case NPC_ETHEREUM_SMUGGLER:
case NPC_SUNBLADE_BLOOD_KNIGHT:
if (_kaelthasPreTrashGUIDs.find(unit->GetGUID()) != _kaelthasPreTrashGUIDs.end())
{
_kaelthasPreTrashGUIDs.erase(unit->GetGUID());
if (_kaelthasPreTrashGUIDs.size() == 0)
{
if (Creature* kaelthas = GetCreature(DATA_KAELTHAS_SUNSTRIDER))
{
kaelthas->AI()->SetData(DATA_KAELTHAS_INTRO, IN_PROGRESS);
SetData(DATA_KAELTHAS_INTRO_STATE, DONE);
}
}
}
break;
default:
break;
}
@@ -112,50 +169,24 @@ class instance_magisters_terrace : public InstanceMapScript
void OnGameObjectCreate(GameObject* go) override
{
InstanceScript::OnGameObjectCreate(go);
switch (go->GetEntry())
{
case GO_VEXALLUS_DOOR:
case GO_SELIN_DOOR:
case GO_SELIN_ENCOUNTER_DOOR:
case GO_DELRISSA_DOOR:
case GO_KAEL_DOOR:
AddDoor(go, true);
break;
case GO_KAEL_STATUE_1:
KaelStatue[0] = go->GetGUID();
break;
case GO_KAEL_STATUE_2:
KaelStatue[1] = go->GetGUID();
break;
case GO_ESCAPE_ORB:
EscapeOrbGUID = go->GetGUID();
_statueGUIDs.push_back(go->GetGUID());
break;
default:
break;
}
}
void OnGameObjectRemove(GameObject* go) override
{
switch (go->GetEntry())
{
case GO_VEXALLUS_DOOR:
case GO_SELIN_DOOR:
case GO_SELIN_ENCOUNTER_DOOR:
case GO_DELRISSA_DOOR:
case GO_KAEL_DOOR:
AddDoor(go, false);
break;
default:
break;
}
}
void ProcessEvent(WorldObject* /*obj*/, uint32 eventId) override
void ProcessEvent(WorldObject* obj, uint32 eventId) override
{
if (eventId == EVENT_SPAWN_KALECGOS)
if (!instance->GetCreature(KalecgosGUID) && Events.Empty())
Events.ScheduleEvent(EVENT_SPAWN_KALECGOS, 1min);
if (!ObjectAccessor::GetCreature(*obj, KalecgosGUID) && Events.Empty())
Events.ScheduleEvent(EVENT_SPAWN_KALECGOS, Minutes(1));
}
void Update(uint32 diff) override
@@ -163,13 +194,11 @@ class instance_magisters_terrace : public InstanceMapScript
Events.Update(diff);
if (Events.ExecuteEvent() == EVENT_SPAWN_KALECGOS)
{
if (Creature* kalecgos = instance->SummonCreature(NPC_KALECGOS, KalecgosSpawnPos))
{
kalecgos->GetMotionMaster()->MovePath(PATH_KALECGOS_FLIGHT, false);
kalecgos->AI()->Talk(SAY_KALECGOS_SPAWN);
}
}
}
bool SetBossState(uint32 type, EncounterState state) override
@@ -181,7 +210,14 @@ class instance_magisters_terrace : public InstanceMapScript
{
case DATA_DELRISSA:
if (state == IN_PROGRESS)
DelrissaDeathCount = 0;
_delrissaDeathCount = 0;
break;
case DATA_KAELTHAS_SUNSTRIDER:
if (state == NOT_STARTED)
{
for (ObjectGuid guid : _statueGUIDs)
HandleGameObject(guid, false);
}
break;
default:
break;
@@ -197,10 +233,6 @@ class instance_magisters_terrace : public InstanceMapScript
return SelinGUID;
case DATA_DELRISSA:
return DelrissaGUID;
case DATA_KAEL_STATUE_LEFT:
return KaelStatue[0];
case DATA_KAEL_STATUE_RIGHT:
return KaelStatue[1];
case DATA_ESCAPE_ORB:
return EscapeOrbGUID;
default:
@@ -209,14 +241,26 @@ class instance_magisters_terrace : public InstanceMapScript
return ObjectGuid::Empty;
}
void WriteSaveDataMore(std::ostringstream& data) override
{
data << _kaelthasIntroState;
}
void ReadSaveDataMore(std::istringstream& data) override
{
data >> _kaelthasIntroState;
}
protected:
EventMap Events;
ObjectGuid SelinGUID;
ObjectGuid DelrissaGUID;
ObjectGuid KaelStatue[2];
ObjectGuid EscapeOrbGUID;
ObjectGuid KalecgosGUID;
uint32 DelrissaDeathCount;
GuidVector _statueGUIDs;
GuidSet _kaelthasPreTrashGUIDs;
uint8 _delrissaDeathCount;
uint8 _kaelthasIntroState;
};
InstanceScript* GetInstanceScript(InstanceMap* map) const override

View File

@@ -1,6 +1,5 @@
/*
* Copyright (C) 2008-2019 TrinityCore <https://www.trinitycore.org/>
* Copyright (C) 2006-2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
*
* 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
@@ -28,26 +27,47 @@ uint32 const EncounterCount = 4;
enum MTDataTypes
{
// Encounter states
DATA_SELIN,
DATA_VEXALLUS,
DATA_DELRISSA,
DATA_KAELTHAS,
DATA_KAEL_STATUE_LEFT,
DATA_KAEL_STATUE_RIGHT,
DATA_KAELTHAS_SUNSTRIDER,
// Encounter related
DATA_KAELTHAS_INTRO,
DATA_DELRISSA_DEATH_COUNT,
DATA_KAELTHAS_STATUES,
// Additional data
DATA_KAELTHAS_INTRO_STATE,
DATA_ESCAPE_ORB
};
enum MTCreatureIds
{
NPC_SELIN = 24723,
NPC_DELRISSA = 24560,
NPC_FEL_CRYSTAL = 24722,
NPC_KALECGOS = 24844,
NPC_HUMAN_KALECGOS = 24848
// Bosses
BOSS_KAELTHAS_SUNSTRIDER = 24664,
// Encounter related
/*Kael'thas Sunstrider*/
NPC_ARCANE_SPHERE = 24708,
NPC_FLAME_STRIKE = 24666,
NPC_PHOENIX = 24674,
NPC_PHOENIX_EGG = 24675,
NPC_SELIN = 24723,
NPC_DELRISSA = 24560,
NPC_FEL_CRYSTAL = 24722,
NPC_KALECGOS = 24844,
// Event related
NPC_HUMAN_KALECGOS = 24848,
NPC_COILSKAR_WITCH = 24696,
NPC_SUNBLADE_WARLOCK = 24686,
NPC_SUNBLADE_MAGE_GUARD = 24683,
NPC_SISTER_OF_TORMENT = 24697,
NPC_ETHEREUM_SMUGGLER = 24698,
NPC_SUNBLADE_BLOOD_KNIGHT = 24684,
};
enum MTGameObjectIds
@@ -56,7 +76,7 @@ enum MTGameObjectIds
GO_SELIN_DOOR = 187979,
GO_SELIN_ENCOUNTER_DOOR = 188065,
GO_DELRISSA_DOOR = 187770,
GO_KAEL_DOOR = 188064,
GO_ASYLUM_DOOR = 188064,
GO_KAEL_STATUE_1 = 188165,
GO_KAEL_STATUE_2 = 188166,
GO_ESCAPE_ORB = 188173
@@ -83,4 +103,6 @@ inline AI* GetMagistersTerraceAI(T* obj)
return GetInstanceAI<AI>(obj, MGTScriptName);
}
#define RegisterMagistersTerraceCreatureAI(ai_name) RegisterCreatureAIWithFactory(ai_name, GetMagistersTerraceAI)
#endif