EverWrath/src/server/scripts/EasternKingdoms/SunwellPlateau/instance_sunwell_plateau.cpp
Kargatum 52aa0e9966
feat(License): add new headers information about license (#7941)
Co-authored-by: Francesco Borzì <borzifrancesco@gmail.com>
2021-09-30 13:40:52 +07:00

347 lines
12 KiB
C++

/*
* 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 <http://www.gnu.org/licenses/>.
*/
#include "InstanceScript.h"
#include "Player.h"
#include "ScriptMgr.h"
#include "sunwell_plateau.h"
DoorData const doorData[] =
{
{ GO_FIRE_BARRIER, DATA_FELMYST_DOORS, DOOR_TYPE_PASSAGE, BOUNDARY_NONE },
{ GO_MURUS_GATE_1, DATA_MURU, DOOR_TYPE_ROOM, BOUNDARY_NONE },
{ GO_MURUS_GATE_2, DATA_MURU, DOOR_TYPE_PASSAGE, BOUNDARY_NONE },
{ GO_BOSS_COLLISION_1, DATA_KALECGOS, DOOR_TYPE_ROOM, BOUNDARY_NONE },
{ GO_BOSS_COLLISION_2, DATA_KALECGOS, DOOR_TYPE_ROOM, BOUNDARY_NONE },
{ GO_FORCE_FIELD, DATA_KALECGOS, DOOR_TYPE_ROOM, BOUNDARY_NONE },
{ 0, 0, DOOR_TYPE_ROOM, BOUNDARY_NONE } // END
};
class instance_sunwell_plateau : public InstanceMapScript
{
public:
instance_sunwell_plateau() : InstanceMapScript("instance_sunwell_plateau", 580) { }
struct instance_sunwell_plateau_InstanceMapScript : public InstanceScript
{
instance_sunwell_plateau_InstanceMapScript(Map* map) : InstanceScript(map)
{
SetBossNumber(MAX_ENCOUNTERS);
LoadDoorData(doorData);
}
void OnPlayerEnter(Player* player) override
{
instance->LoadGrid(1477.94f, 643.22f);
instance->LoadGrid(1641.45f, 988.08f);
if (GameObject* gobj = instance->GetGameObject(IceBarrierGUID))
gobj->SendUpdateToPlayer(player);
}
Player const* GetPlayerInMap() const
{
Map::PlayerList const& players = instance->GetPlayers();
if (!players.isEmpty())
{
for (Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr)
{
Player* player = itr->GetSource();
if (player && !player->HasAura(45839))
return player;
}
}
//else
// TC_LOG_DEBUG("scripts", "Instance Sunwell Plateau: GetPlayerInMap, but PlayerList is empty!");
return nullptr;
}
void OnCreatureCreate(Creature* creature) override
{
if (creature->GetSpawnId() > 0 || !creature->GetOwnerGUID().IsPlayer())
creature->CastSpell(creature, SPELL_SUNWELL_RADIANCE, true);
switch (creature->GetEntry())
{
case NPC_KALECGOS:
KalecgosDragonGUID = creature->GetGUID();
break;
case NPC_SATHROVARR:
SathrovarrGUID = creature->GetGUID();
break;
case NPC_BRUTALLUS:
BrutallusGUID = creature->GetGUID();
break;
case NPC_MADRIGOSA:
MadrigosaGUID = creature->GetGUID();
break;
case NPC_FELMYST:
FelmystGUID = creature->GetGUID();
break;
case NPC_GRAND_WARLOCK_ALYTHESS:
AlythessGUID = creature->GetGUID();
break;
case NPC_LADY_SACROLASH:
SacrolashGUID = creature->GetGUID();
break;
case NPC_MURU:
MuruGUID = creature->GetGUID();
break;
case NPC_KILJAEDEN:
KilJaedenGUID = creature->GetGUID();
break;
case NPC_KILJAEDEN_CONTROLLER:
KilJaedenControllerGUID = creature->GetGUID();
break;
case NPC_ANVEENA:
AnveenaGUID = creature->GetGUID();
break;
case NPC_KALECGOS_KJ:
KalecgosKjGUID = creature->GetGUID();
break;
// Xinef: Felmyst encounter
case NPC_DEMONIC_VAPOR_TRAIL:
case NPC_UNYIELDING_DEAD:
if (Creature* felmyst = instance->GetCreature(FelmystGUID))
felmyst->AI()->JustSummoned(creature);
break;
// Xinef: M'uru encounter
case NPC_DARKNESS:
case NPC_VOID_SENTINEL:
case NPC_VOID_SPAWN:
if (Creature* muru = instance->GetCreature(MuruGUID))
muru->AI()->JustSummoned(creature);
break;
// Xinef: Kil'jaeden encounter
case NPC_FELFIRE_PORTAL:
case NPC_VOLATILE_FELFIRE_FIEND:
case NPC_SHIELD_ORB:
case NPC_SINISTER_REFLECTION:
if (Creature* kiljaedenC = instance->GetCreature(KilJaedenControllerGUID))
kiljaedenC->AI()->JustSummoned(creature);
break;
default:
break;
}
}
void OnGameObjectCreate(GameObject* go) override
{
switch (go->GetEntry())
{
case GO_FORCE_FIELD:
case GO_BOSS_COLLISION_1:
case GO_BOSS_COLLISION_2:
case GO_FIRE_BARRIER:
case GO_MURUS_GATE_1:
case GO_MURUS_GATE_2:
AddDoor(go, true);
break;
case GO_ICE_BARRIER:
IceBarrierGUID = go->GetGUID();
go->setActive(true);
break;
case GO_ORB_OF_THE_BLUE_DRAGONFLIGHT1:
blueFlightOrbGUID[0] = go->GetGUID();
break;
case GO_ORB_OF_THE_BLUE_DRAGONFLIGHT2:
blueFlightOrbGUID[1] = go->GetGUID();
break;
case GO_ORB_OF_THE_BLUE_DRAGONFLIGHT3:
blueFlightOrbGUID[2] = go->GetGUID();
break;
case GO_ORB_OF_THE_BLUE_DRAGONFLIGHT4:
blueFlightOrbGUID[3] = go->GetGUID();
break;
default:
break;
}
}
void OnGameObjectRemove(GameObject* go) override
{
switch (go->GetEntry())
{
case GO_FIRE_BARRIER:
case GO_MURUS_GATE_1:
case GO_MURUS_GATE_2:
case GO_BOSS_COLLISION_1:
case GO_BOSS_COLLISION_2:
case GO_FORCE_FIELD:
AddDoor(go, false);
break;
default:
break;
}
}
ObjectGuid GetGuidData(uint32 id) const override
{
switch (id)
{
case NPC_KALECGOS:
return KalecgosDragonGUID;
case NPC_SATHROVARR:
return SathrovarrGUID;
case NPC_BRUTALLUS:
return BrutallusGUID;
case NPC_MADRIGOSA:
return MadrigosaGUID;
case NPC_FELMYST:
return FelmystGUID;
case NPC_GRAND_WARLOCK_ALYTHESS:
return AlythessGUID;
case NPC_LADY_SACROLASH:
return SacrolashGUID;
case NPC_MURU:
return MuruGUID;
case NPC_ANVEENA:
return AnveenaGUID;
case NPC_KALECGOS_KJ:
return KalecgosKjGUID;
case NPC_KILJAEDEN_CONTROLLER:
return KilJaedenControllerGUID;
case NPC_KILJAEDEN:
return KilJaedenGUID;
// Orbs
case DATA_ORB_OF_THE_BLUE_DRAGONFLIGHT_1:
case DATA_ORB_OF_THE_BLUE_DRAGONFLIGHT_2:
case DATA_ORB_OF_THE_BLUE_DRAGONFLIGHT_3:
case DATA_ORB_OF_THE_BLUE_DRAGONFLIGHT_4:
return blueFlightOrbGUID[id - DATA_ORB_OF_THE_BLUE_DRAGONFLIGHT_1];
}
return ObjectGuid::Empty;
}
std::string GetSaveData() override
{
OUT_SAVE_INST_DATA;
std::ostringstream saveStream;
saveStream << "S P " << GetBossSaveData();
OUT_SAVE_INST_DATA_COMPLETE;
return saveStream.str();
}
void Load(char const* str) override
{
if (!str)
{
OUT_LOAD_INST_DATA_FAIL;
return;
}
OUT_LOAD_INST_DATA(str);
char dataHead1, dataHead2;
std::istringstream loadStream(str);
loadStream >> dataHead1 >> dataHead2;
if (dataHead1 == 'S' && dataHead2 == 'P')
{
for (uint32 i = 0; i < MAX_ENCOUNTERS; ++i)
{
uint32 tmpState;
loadStream >> tmpState;
if (tmpState == IN_PROGRESS || tmpState > SPECIAL)
tmpState = NOT_STARTED;
SetBossState(i, EncounterState(tmpState));
}
}
else
OUT_LOAD_INST_DATA_FAIL;
OUT_LOAD_INST_DATA_COMPLETE;
}
protected:
ObjectGuid KalecgosDragonGUID;
ObjectGuid SathrovarrGUID;
ObjectGuid BrutallusGUID;
ObjectGuid MadrigosaGUID;
ObjectGuid FelmystGUID;
ObjectGuid AlythessGUID;
ObjectGuid SacrolashGUID;
ObjectGuid MuruGUID;
ObjectGuid KilJaedenGUID;
ObjectGuid KilJaedenControllerGUID;
ObjectGuid AnveenaGUID;
ObjectGuid KalecgosKjGUID;
ObjectGuid IceBarrierGUID;
ObjectGuid blueFlightOrbGUID[4];
};
InstanceScript* GetInstanceScript(InstanceMap* map) const override
{
return new instance_sunwell_plateau_InstanceMapScript(map);
}
};
enum cataclysmBreath
{
SPELL_CORROSIVE_POISON = 46293,
SPELL_FEVERED_FATIGUE = 46294,
SPELL_HEX = 46295,
SPELL_NECROTIC_POISON = 46296,
SPELL_PIERCING_SHADOW = 46297,
SPELL_SHRINK = 46298,
SPELL_WAVERING_WILL = 46299,
SPELL_WITHERED_TOUCH = 46300
};
class spell_cataclysm_breath : public SpellScriptLoader
{
public:
spell_cataclysm_breath() : SpellScriptLoader("spell_cataclysm_breath") { }
class spell_cataclysm_breath_SpellScript : public SpellScript
{
PrepareSpellScript(spell_cataclysm_breath_SpellScript);
void HandleAfterCast()
{
if (Unit* target = GetExplTargetUnit())
for (uint8 i = 0; i < 4; ++i)
GetCaster()->CastSpell(target, RAND(SPELL_CORROSIVE_POISON, SPELL_FEVERED_FATIGUE, SPELL_HEX, SPELL_NECROTIC_POISON, SPELL_PIERCING_SHADOW, SPELL_SHRINK, SPELL_WAVERING_WILL, SPELL_WITHERED_TOUCH), true);
}
void Register() override
{
AfterCast += SpellCastFn(spell_cataclysm_breath_SpellScript::HandleAfterCast);
}
};
SpellScript* GetSpellScript() const override
{
return new spell_cataclysm_breath_SpellScript();
}
};
void AddSC_instance_sunwell_plateau()
{
new instance_sunwell_plateau();
new spell_cataclysm_breath();
}