aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.cpp2
-rw-r--r--src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.h2
-rw-r--r--src/server/scripts/Northrend/IcecrownCitadel/instance_icecrown_citadel.cpp123
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