Scripts/ICC: 94b60ff followup

(cherry picked from commit eb6ea57e7f)
This commit is contained in:
ccrs
2019-06-29 19:38:16 +02:00
committed by Shauren
parent 934b72262d
commit 5e3ba5e96f
3 changed files with 58 additions and 69 deletions

View File

@@ -1846,7 +1846,7 @@ struct npc_entrance_faction_leader : public ScriptedAI
{
if (menuId == ICC_BUFF_MENUID_ALLY || menuId == ICC_BUFF_MENUID_HORDE)
if (InstanceScript* instance = me->GetInstanceScript())
instance->SetData(DATA_ICC_BUFF, 0);
instance->SetData(DATA_FACTION_BUFF, 0);
return false;
}
};

View File

@@ -130,7 +130,7 @@ enum ICDataTypes
DATA_BLOOD_QUEEN_LANA_THEL_COUNCIL = 42,
DATA_BLOOD_PRINCE_COUNCIL_INTRO = 43,
DATA_SINDRAGOSA_INTRO = 44,
DATA_ICC_BUFF = 45 // used by conditions
DATA_FACTION_BUFF = 45 // used by conditions
};
enum ICCreaturesIds

View File

@@ -17,6 +17,7 @@
#include "icecrown_citadel.h"
#include "AreaBoundary.h"
#include "Creature.h"
#include "CreatureAI.h"
#include "InstanceScript.h"
#include "Map.h"
@@ -29,6 +30,7 @@
#include "TransportMgr.h"
#include "WorldStatePackets.h"
#include <sstream>
#include <unordered_set>
enum EventIds
{
@@ -70,32 +72,32 @@ BossBoundaryData const boundaries =
DoorData const doorData[] =
{
{GO_LORD_MARROWGAR_S_ENTRANCE, DATA_LORD_MARROWGAR, DOOR_TYPE_ROOM },
{GO_ICEWALL, DATA_LORD_MARROWGAR, DOOR_TYPE_PASSAGE },
{GO_DOODAD_ICECROWN_ICEWALL02, DATA_LORD_MARROWGAR, DOOR_TYPE_PASSAGE },
{GO_ORATORY_OF_THE_DAMNED_ENTRANCE, DATA_LADY_DEATHWHISPER, DOOR_TYPE_ROOM },
{GO_SAURFANG_S_DOOR, DATA_DEATHBRINGER_SAURFANG, DOOR_TYPE_PASSAGE },
{GO_ORANGE_PLAGUE_MONSTER_ENTRANCE, DATA_FESTERGUT, DOOR_TYPE_ROOM },
{GO_GREEN_PLAGUE_MONSTER_ENTRANCE, DATA_ROTFACE, DOOR_TYPE_ROOM },
{GO_SCIENTIST_ENTRANCE, DATA_PROFESSOR_PUTRICIDE, DOOR_TYPE_ROOM },
{GO_CRIMSON_HALL_DOOR, DATA_BLOOD_PRINCE_COUNCIL, DOOR_TYPE_ROOM },
{GO_BLOOD_ELF_COUNCIL_DOOR, DATA_BLOOD_PRINCE_COUNCIL, DOOR_TYPE_PASSAGE },
{GO_BLOOD_ELF_COUNCIL_DOOR_RIGHT, DATA_BLOOD_PRINCE_COUNCIL, DOOR_TYPE_PASSAGE },
{GO_DOODAD_ICECROWN_BLOODPRINCE_DOOR_01, DATA_BLOOD_QUEEN_LANA_THEL, DOOR_TYPE_ROOM },
{GO_DOODAD_ICECROWN_GRATE_01, DATA_BLOOD_QUEEN_LANA_THEL, DOOR_TYPE_PASSAGE },
{GO_GREEN_DRAGON_BOSS_ENTRANCE, DATA_SISTER_SVALNA, DOOR_TYPE_PASSAGE },
{GO_GREEN_DRAGON_BOSS_ENTRANCE, DATA_VALITHRIA_DREAMWALKER, DOOR_TYPE_ROOM },
{GO_GREEN_DRAGON_BOSS_EXIT, DATA_VALITHRIA_DREAMWALKER, DOOR_TYPE_PASSAGE },
{GO_DOODAD_ICECROWN_ROOSTPORTCULLIS_01, DATA_VALITHRIA_DREAMWALKER, DOOR_TYPE_SPAWN_HOLE },
{GO_DOODAD_ICECROWN_ROOSTPORTCULLIS_02, DATA_VALITHRIA_DREAMWALKER, DOOR_TYPE_SPAWN_HOLE },
{GO_DOODAD_ICECROWN_ROOSTPORTCULLIS_03, DATA_VALITHRIA_DREAMWALKER, DOOR_TYPE_SPAWN_HOLE },
{GO_DOODAD_ICECROWN_ROOSTPORTCULLIS_04, DATA_VALITHRIA_DREAMWALKER, DOOR_TYPE_SPAWN_HOLE },
{GO_SINDRAGOSA_ENTRANCE_DOOR, DATA_SINDRAGOSA, DOOR_TYPE_ROOM },
{GO_SINDRAGOSA_SHORTCUT_ENTRANCE_DOOR, DATA_SINDRAGOSA, DOOR_TYPE_PASSAGE },
{GO_SINDRAGOSA_SHORTCUT_EXIT_DOOR, DATA_SINDRAGOSA, DOOR_TYPE_PASSAGE },
{GO_ICE_WALL, DATA_SINDRAGOSA, DOOR_TYPE_ROOM },
{GO_ICE_WALL, DATA_SINDRAGOSA, DOOR_TYPE_ROOM },
{0, 0, DOOR_TYPE_ROOM } // END
{ GO_LORD_MARROWGAR_S_ENTRANCE, DATA_LORD_MARROWGAR, DOOR_TYPE_ROOM },
{ GO_ICEWALL, DATA_LORD_MARROWGAR, DOOR_TYPE_PASSAGE },
{ GO_DOODAD_ICECROWN_ICEWALL02, DATA_LORD_MARROWGAR, DOOR_TYPE_PASSAGE },
{ GO_ORATORY_OF_THE_DAMNED_ENTRANCE, DATA_LADY_DEATHWHISPER, DOOR_TYPE_ROOM },
{ GO_SAURFANG_S_DOOR, DATA_DEATHBRINGER_SAURFANG, DOOR_TYPE_PASSAGE },
{ GO_ORANGE_PLAGUE_MONSTER_ENTRANCE, DATA_FESTERGUT, DOOR_TYPE_ROOM },
{ GO_GREEN_PLAGUE_MONSTER_ENTRANCE, DATA_ROTFACE, DOOR_TYPE_ROOM },
{ GO_SCIENTIST_ENTRANCE, DATA_PROFESSOR_PUTRICIDE, DOOR_TYPE_ROOM },
{ GO_CRIMSON_HALL_DOOR, DATA_BLOOD_PRINCE_COUNCIL, DOOR_TYPE_ROOM },
{ GO_BLOOD_ELF_COUNCIL_DOOR, DATA_BLOOD_PRINCE_COUNCIL, DOOR_TYPE_PASSAGE },
{ GO_BLOOD_ELF_COUNCIL_DOOR_RIGHT, DATA_BLOOD_PRINCE_COUNCIL, DOOR_TYPE_PASSAGE },
{ GO_DOODAD_ICECROWN_BLOODPRINCE_DOOR_01, DATA_BLOOD_QUEEN_LANA_THEL, DOOR_TYPE_ROOM },
{ GO_DOODAD_ICECROWN_GRATE_01, DATA_BLOOD_QUEEN_LANA_THEL, DOOR_TYPE_PASSAGE },
{ GO_GREEN_DRAGON_BOSS_ENTRANCE, DATA_SISTER_SVALNA, DOOR_TYPE_PASSAGE },
{ GO_GREEN_DRAGON_BOSS_ENTRANCE, DATA_VALITHRIA_DREAMWALKER, DOOR_TYPE_ROOM },
{ GO_GREEN_DRAGON_BOSS_EXIT, DATA_VALITHRIA_DREAMWALKER, DOOR_TYPE_PASSAGE },
{ GO_DOODAD_ICECROWN_ROOSTPORTCULLIS_01, DATA_VALITHRIA_DREAMWALKER, DOOR_TYPE_SPAWN_HOLE },
{ GO_DOODAD_ICECROWN_ROOSTPORTCULLIS_02, DATA_VALITHRIA_DREAMWALKER, DOOR_TYPE_SPAWN_HOLE },
{ GO_DOODAD_ICECROWN_ROOSTPORTCULLIS_03, DATA_VALITHRIA_DREAMWALKER, DOOR_TYPE_SPAWN_HOLE },
{ GO_DOODAD_ICECROWN_ROOSTPORTCULLIS_04, DATA_VALITHRIA_DREAMWALKER, DOOR_TYPE_SPAWN_HOLE },
{ GO_SINDRAGOSA_ENTRANCE_DOOR, DATA_SINDRAGOSA, DOOR_TYPE_ROOM },
{ GO_SINDRAGOSA_SHORTCUT_ENTRANCE_DOOR, DATA_SINDRAGOSA, DOOR_TYPE_PASSAGE },
{ GO_SINDRAGOSA_SHORTCUT_EXIT_DOOR, DATA_SINDRAGOSA, DOOR_TYPE_PASSAGE },
{ GO_ICE_WALL, DATA_SINDRAGOSA, DOOR_TYPE_ROOM },
{ GO_ICE_WALL, DATA_SINDRAGOSA, DOOR_TYPE_ROOM },
{ 0, 0, DOOR_TYPE_ROOM } // END
};
// this doesnt have to only store questgivers, also can be used for related quest spawns
@@ -140,17 +142,17 @@ class instance_icecrown_citadel : public InstanceMapScript
LoadDoorData(doorData);
TeamInInstance = 0;
HeroicAttempts = MaxHeroicAttempts;
IsBonedEligible = true;
IsOozeDanceEligible = true;
IsNauseaEligible = true;
IsOrbWhispererEligible = true;
ColdflameJetsState = NOT_STARTED;
UpperSpireTeleporterActiveState = NOT_STARTED;
BloodQuickeningState = NOT_STARTED;
BloodQuickeningMinutes = 0;
BloodPrinceIntro = 1;
SindragosaIntro = 1;
ICCBuffActive = 1;
IsBonedEligible = true;
IsOozeDanceEligible = true;
IsNauseaEligible = true;
IsOrbWhispererEligible = true;
IsFactionBuffActive = true;
}
// A function to help reduce the number of lines for teleporter management.
@@ -185,22 +187,21 @@ class instance_icecrown_citadel : public InstanceMapScript
if (GetBossState(DATA_LADY_DEATHWHISPER) == DONE && GetBossState(DATA_ICECROWN_GUNSHIP_BATTLE) != DONE)
SpawnGunship();
if (ICCBuffActive)
{
uint32 spellId = TeamInInstance == ALLIANCE ? SPELL_STRENGHT_OF_WRYNN : SPELL_HELLSCREAMS_WARSONG;
player->CastSpell(player, spellId, true);
}
if (IsFactionBuffActive)
DoCastSpellOnPlayer(player, TeamInInstance == ALLIANCE ? SPELL_STRENGHT_OF_WRYNN : SPELL_HELLSCREAMS_WARSONG);
}
void OnPlayerLeave(Player* player) override
{
DoRemoveAurasDueToSpellOnPlayer(player, TeamInInstance == ALLIANCE ? SPELL_STRENGHT_OF_WRYNN : SPELL_HELLSCREAMS_WARSONG, true, true);
}
void OnCreatureCreate(Creature* creature) override
{
if (creature->IsPet() && creature->GetOwnerGUID().IsPlayer())
if (creature->IsGuardian() && creature->GetOwnerGUID().IsPlayer())
{
uint32 spellId = TeamInInstance == ALLIANCE ? SPELL_STRENGHT_OF_WRYNN : SPELL_HELLSCREAMS_WARSONG;
if (ICCBuffActive)
creature->CastSpell(creature, spellId, true);
else
creature->RemoveAurasDueToSpell(spellId);
if (IsFactionBuffActive)
creature->CastSpell(creature, TeamInInstance == ALLIANCE ? SPELL_STRENGHT_OF_WRYNN : SPELL_HELLSCREAMS_WARSONG, true);
}
switch (creature->GetEntry())
@@ -734,8 +735,8 @@ class instance_icecrown_citadel : public InstanceMapScript
return BloodPrinceIntro;
case DATA_SINDRAGOSA_INTRO:
return SindragosaIntro;
case DATA_ICC_BUFF:
return ICCBuffActive;
case DATA_FACTION_BUFF:
return IsFactionBuffActive ? 1 : 0;
default:
break;
}
@@ -827,7 +828,7 @@ class instance_icecrown_citadel : public InstanceMapScript
if (!HeroicAttempts)
{
for (ObjectGuid bossGuid : {ProfessorPutricideGUID, BloodQueenLanaThelGUID, SindragosaGUID, TheLichKingGUID})
for (ObjectGuid const& bossGuid : { ProfessorPutricideGUID, BloodQueenLanaThelGUID, SindragosaGUID, TheLichKingGUID })
{
if (Creature* boss = instance->GetCreature(bossGuid))
if (boss->IsAlive())
@@ -1090,22 +1091,10 @@ class instance_icecrown_citadel : public InstanceMapScript
case DATA_SINDRAGOSA_INTRO:
SindragosaIntro = data;
break;
case DATA_ICC_BUFF:
ICCBuffActive = data;
if (!ICCBuffActive)
{
uint32 spellId = TeamInInstance == ALLIANCE ? SPELL_STRENGHT_OF_WRYNN : SPELL_HELLSCREAMS_WARSONG;
Map::PlayerList const& players = instance->GetPlayers();
for (Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr)
{
if (Player* player = itr->GetSource())
{
player->RemoveAurasDueToSpell(spellId);
if (Pet* pet = player->GetPet())
pet->RemoveAurasDueToSpell(spellId);
}
}
}
case DATA_FACTION_BUFF:
IsFactionBuffActive = data ? true : false;
if (!IsFactionBuffActive)
DoRemoveAurasDueToSpellOnPlayers(TeamInInstance == ALLIANCE ? SPELL_STRENGHT_OF_WRYNN : SPELL_HELLSCREAMS_WARSONG, true, true);
break;
default:
break;
@@ -1431,14 +1420,12 @@ class instance_icecrown_citadel : public InstanceMapScript
transport->EnableMovement(false);
break;
case EVENT_PLAYERS_GUNSHIP_SAURFANG:
{
if (Creature* captain = source->FindNearestCreature(TeamInInstance == HORDE ? NPC_IGB_HIGH_OVERLORD_SAURFANG : NPC_IGB_MURADIN_BRONZEBEARD, 100.0f))
captain->AI()->DoAction(ACTION_EXIT_SHIP);
if (GameObject* go = source->ToGameObject())
if (Transport* transport = go->ToTransport())
transport->EnableMovement(false);
break;
}
case EVENT_QUAKE:
if (GameObject* warning = instance->GetGameObject(FrozenThroneWarningGUID))
warning->SetGoState(GO_STATE_ACTIVE);
@@ -1471,6 +1458,8 @@ class instance_icecrown_citadel : public InstanceMapScript
}
}
break;
default:
break;
}
}
@@ -1531,19 +1520,19 @@ class instance_icecrown_citadel : public InstanceMapScript
uint32 TeamInInstance;
uint32 ColdflameJetsState;
uint32 UpperSpireTeleporterActiveState;
std::set<ObjectGuid::LowType> FrostwyrmGUIDs;
std::set<ObjectGuid::LowType> SpinestalkerTrash;
std::set<ObjectGuid::LowType> RimefangTrash;
std::unordered_set<ObjectGuid::LowType> FrostwyrmGUIDs;
std::unordered_set<ObjectGuid::LowType> SpinestalkerTrash;
std::unordered_set<ObjectGuid::LowType> RimefangTrash;
uint32 BloodQuickeningState;
uint32 HeroicAttempts;
uint16 BloodQuickeningMinutes;
uint8 BloodPrinceIntro;
uint8 SindragosaIntro;
uint8 ICCBuffActive;
bool IsBonedEligible;
bool IsOozeDanceEligible;
bool IsNauseaEligible;
bool IsOrbWhispererEligible;
bool IsFactionBuffActive;
};
InstanceScript* GetInstanceScript(InstanceMap* map) const override