diff options
Diffstat (limited to 'src')
3 files changed, 58 insertions, 69 deletions
diff --git a/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.cpp b/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.cpp index 4247ad8b670..f59134a2715 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.cpp @@ -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; } }; diff --git a/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.h b/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.h index 4707248ea68..4ac39246b7b 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.h +++ b/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.h @@ -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 diff --git a/src/server/scripts/Northrend/IcecrownCitadel/instance_icecrown_citadel.cpp b/src/server/scripts/Northrend/IcecrownCitadel/instance_icecrown_citadel.cpp index 79cb67e5bc7..4fccd61d53e 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/instance_icecrown_citadel.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/instance_icecrown_citadel.cpp @@ -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 |