aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rwxr-xr-xsrc/server/game/Scripting/ScriptLoader.cpp2
-rwxr-xr-xsrc/server/game/Spells/SpellMgr.cpp4
-rw-r--r--src/server/scripts/Northrend/CMakeLists.txt1
-rw-r--r--src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.cpp137
-rwxr-xr-xsrc/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.h5
-rwxr-xr-xsrc/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel_teleport.cpp2
-rwxr-xr-xsrc/server/scripts/Northrend/IcecrownCitadel/instance_icecrown_citadel.cpp31
7 files changed, 180 insertions, 2 deletions
diff --git a/src/server/game/Scripting/ScriptLoader.cpp b/src/server/game/Scripting/ScriptLoader.cpp
index e4bb4318fb8..cb1b2c8a81e 100755
--- a/src/server/game/Scripting/ScriptLoader.cpp
+++ b/src/server/game/Scripting/ScriptLoader.cpp
@@ -476,6 +476,7 @@ void AddSC_boss_blood_queen_lana_thel();
void AddSC_boss_sindragosa();
void AddSC_icecrown_citadel_teleport();
void AddSC_instance_icecrown_citadel();
+void AddSC_icecrown_citadel();
void AddSC_dalaran();
void AddSC_borean_tundra();
@@ -1166,6 +1167,7 @@ void AddNorthrendScripts()
AddSC_boss_sindragosa();
AddSC_icecrown_citadel_teleport();
AddSC_instance_icecrown_citadel();
+ AddSC_icecrown_citadel();
AddSC_dalaran();
AddSC_borean_tundra();
diff --git a/src/server/game/Spells/SpellMgr.cpp b/src/server/game/Spells/SpellMgr.cpp
index e1c85ce1460..9a823ad68ce 100755
--- a/src/server/game/Spells/SpellMgr.cpp
+++ b/src/server/game/Spells/SpellMgr.cpp
@@ -3644,6 +3644,7 @@ void SpellMgr::LoadSpellCustomAttr()
case 26029: // dark glare
case 37433: // spout
case 43140: case 43215: // flame breath
+ case 70461: // Coldflame Trap
mSpellCustomAttr[i] |= SPELL_ATTR0_CU_CONE_LINE;
count++;
break;
@@ -3988,6 +3989,9 @@ void SpellMgr::LoadSpellCustomAttr()
spellInfo->EffectImplicitTargetB[0] = 0;
count++;
break;
+ case 70460: // Coldflame Jets
+ spellInfo->DurationIndex = 1; // 10 seconds
+ break;
case 71413: // Green Ooze Summon (Professor Putricide)
case 71414: // Orange Ooze Summon (Professor Putricide)
spellInfo->EffectImplicitTargetA[0] = TARGET_DEST_DEST;
diff --git a/src/server/scripts/Northrend/CMakeLists.txt b/src/server/scripts/Northrend/CMakeLists.txt
index 2ff4974c7a4..898fe59c054 100644
--- a/src/server/scripts/Northrend/CMakeLists.txt
+++ b/src/server/scripts/Northrend/CMakeLists.txt
@@ -144,6 +144,7 @@ set(scripts_STAT_SRCS
Northrend/VioletHold/boss_erekem.cpp
Northrend/VioletHold/violet_hold.cpp
Northrend/IcecrownCitadel/instance_icecrown_citadel.cpp
+ Northrend/IcecrownCitadel/icecrown_citadel.cpp
Northrend/IcecrownCitadel/icecrown_citadel.h
Northrend/IcecrownCitadel/icecrown_citadel_teleport.cpp
Northrend/IcecrownCitadel/boss_lord_marrowgar.cpp
diff --git a/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.cpp b/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.cpp
new file mode 100644
index 00000000000..2c8856d716b
--- /dev/null
+++ b/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.cpp
@@ -0,0 +1,137 @@
+/*
+ * Copyright (C) 2008-2010 TrinityCore <http://www.trinitycore.org/>
+ *
+ * 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
+ * Free Software Foundation; either version 2 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 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 "ObjectMgr.h"
+#include "ScriptMgr.h"
+#include "SpellScript.h"
+#include "SpellAuraEffects.h"
+#include "icecrown_citadel.h"
+
+enum Spells
+{
+ // Frost Freeze Trap
+ SPELL_COLDFLAME_JETS = 70460,
+};
+
+enum Events
+{
+ // Frost Freeze Trap
+ EVENT_ACTIVATE_TRAP = 1,
+};
+
+class npc_frost_freeze_trap : public CreatureScript
+{
+ public:
+ npc_frost_freeze_trap() : CreatureScript("npc_frost_freeze_trap") { }
+
+ struct npc_frost_freeze_trapAI: public Scripted_NoMovementAI
+ {
+ npc_frost_freeze_trapAI(Creature* creature) : Scripted_NoMovementAI(creature)
+ {
+ }
+
+ void DoAction(const int32 action)
+ {
+ switch (action)
+ {
+ case 1000:
+ case 11000:
+ events.ScheduleEvent(EVENT_ACTIVATE_TRAP, uint32(action));
+ break;
+ case ACTION_STOP_TRAPS:
+ me->RemoveAurasDueToSpell(SPELL_COLDFLAME_JETS);
+ events.CancelEvent(EVENT_ACTIVATE_TRAP);
+ break;
+ default:
+ break;
+ }
+ }
+
+ void UpdateAI(const uint32 diff)
+ {
+ events.Update(diff);
+
+ if (events.ExecuteEvent() == EVENT_ACTIVATE_TRAP)
+ {
+ DoCast(me, SPELL_COLDFLAME_JETS);
+ events.ScheduleEvent(EVENT_ACTIVATE_TRAP, 22000);
+ }
+ }
+
+ private:
+ EventMap events;
+ };
+
+ CreatureAI* GetAI(Creature* creature) const
+ {
+ return new npc_frost_freeze_trapAI(creature);
+ }
+};
+
+class at_icc_saurfang_portal : public AreaTriggerScript
+{
+ public:
+ at_icc_saurfang_portal() : AreaTriggerScript("at_icc_saurfang_portal") { }
+
+ bool OnTrigger(Player* player, AreaTriggerEntry const* /*areaTrigger*/)
+ {
+ InstanceScript* instance = player->GetInstanceScript();
+ if (!instance || instance->GetBossState(DATA_DEATHBRINGER_SAURFANG) != DONE)
+ return true;
+
+ player->TeleportTo(631, 4126.35f, 2769.23f, 350.963f, 0.0f);
+
+ if (instance->GetData(DATA_COLDFLAME_JETS) == NOT_STARTED)
+ {
+ // Process relocation now, to preload the grid and initialize traps
+ player->GetMap()->PlayerRelocation(player, 4126.35f, 2769.23f, 350.963f, 0.0f);
+
+ instance->SetData(DATA_COLDFLAME_JETS, IN_PROGRESS);
+ std::list<Creature*> traps;
+ GetCreatureListWithEntryInGrid(traps, player, NPC_FROST_FREEZE_TRAP, 120.0f);
+ traps.sort(Trinity::ObjectDistanceOrderPred(player));
+ bool instant = false;
+ for (std::list<Creature*>::iterator itr = traps.begin(); itr != traps.end(); ++itr)
+ {
+ (*itr)->AI()->DoAction(instant ? 1000 : 11000);
+ instant = !instant;
+ }
+ }
+ return true;
+ }
+};
+
+class at_icc_shutdown_traps : public AreaTriggerScript
+{
+ public:
+ at_icc_shutdown_traps() : AreaTriggerScript("at_icc_shutdown_traps") { }
+
+ bool OnTrigger(Player* player, AreaTriggerEntry const* /*areaTrigger*/)
+ {
+ if (InstanceScript* instance = player->GetInstanceScript())
+ if (instance->GetData(DATA_COLDFLAME_JETS) == IN_PROGRESS)
+ instance->SetData(DATA_COLDFLAME_JETS, DONE);
+ return true;
+ }
+};
+
+void AddSC_icecrown_citadel()
+{
+ new npc_frost_freeze_trap();
+ new at_icc_saurfang_portal();
+ new at_icc_shutdown_traps();
+}
diff --git a/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.h b/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.h
index e2b78757f47..5f09434064f 100755
--- a/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.h
+++ b/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.h
@@ -68,6 +68,7 @@ enum DataTypes
DATA_SINDRAGOSA_FROSTWYRMS = 22,
DATA_SPINESTALKER = 23,
DATA_RIMEFANG = 24,
+ DATA_COLDFLAME_JETS = 25,
};
#define MAX_ENCOUNTER 12
@@ -118,6 +119,7 @@ enum CreaturesIds
NPC_SE_HIGH_OVERLORD_SAURFANG = 37187,
NPC_SE_KOR_KRON_REAVER = 37920,
NPC_SE_SKYBREAKER_MARINE = 37830,
+ NPC_FROST_FREEZE_TRAP = 37744,
// Festergut
NPC_FESTERGUT = 36626,
@@ -255,6 +257,9 @@ enum AchievementCriteriaIds
enum SharedActions
{
+ // Coldflame Traps
+ ACTION_STOP_TRAPS = -377440,
+
// Festergut
ACTION_FESTERGUT_COMBAT = -366260,
ACTION_FESTERGUT_GAS = -366261,
diff --git a/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel_teleport.cpp b/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel_teleport.cpp
index 7875f3a3c1a..4b423b1a8c5 100755
--- a/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel_teleport.cpp
+++ b/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel_teleport.cpp
@@ -39,7 +39,7 @@ class icecrown_citadel_teleport : public GameObjectScript
player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, "Teleport to the Rampart of Skulls.", GOSSIP_SENDER_ICC_PORT, RAMPART_OF_SKULLS_TELEPORT);
if (instance->GetBossState(DATA_GUNSHIP_EVENT) == DONE)
player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, "Teleport to the Deathbringer's Rise.", GOSSIP_SENDER_ICC_PORT, DEATHBRINGER_S_RISE_TELEPORT);
- if (instance->GetBossState(DATA_DEATHBRINGER_SAURFANG) == DONE)
+ if (instance->GetData(DATA_COLDFLAME_JETS) == DONE)
player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, "Teleport to the Upper Spire.", GOSSIP_SENDER_ICC_PORT, UPPER_SPIRE_TELEPORT);
if (instance->GetBossState(DATA_VALITHRIA_DREAMWALKER) == DONE)
player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, "Teleport to the Sindragosa's Lair", GOSSIP_SENDER_ICC_PORT, SINDRAGOSA_S_LAIR_TELEPORT);
diff --git a/src/server/scripts/Northrend/IcecrownCitadel/instance_icecrown_citadel.cpp b/src/server/scripts/Northrend/IcecrownCitadel/instance_icecrown_citadel.cpp
index f3fbef29ce8..17728a9e2e3 100755
--- a/src/server/scripts/Northrend/IcecrownCitadel/instance_icecrown_citadel.cpp
+++ b/src/server/scripts/Northrend/IcecrownCitadel/instance_icecrown_citadel.cpp
@@ -28,6 +28,7 @@ static const DoorData doorData[] =
{GO_ICEWALL, DATA_LORD_MARROWGAR, DOOR_TYPE_PASSAGE, BOUNDARY_NONE},
{GO_DOODAD_ICECROWN_ICEWALL02, DATA_LORD_MARROWGAR, DOOR_TYPE_PASSAGE, BOUNDARY_NONE},
{GO_ORATORY_OF_THE_DAMNED_ENTRANCE, DATA_LADY_DEATHWHISPER, DOOR_TYPE_ROOM, BOUNDARY_N },
+ {GO_SAURFANG_S_DOOR, DATA_DEATHBRINGER_SAURFANG, DOOR_TYPE_PASSAGE, BOUNDARY_NONE},
{GO_ORANGE_PLAGUE_MONSTER_ENTRANCE, DATA_FESTERGUT, DOOR_TYPE_ROOM, BOUNDARY_E },
{GO_GREEN_PLAGUE_MONSTER_ENTRANCE, DATA_ROTFACE, DOOR_TYPE_ROOM, BOUNDARY_E },
{GO_SCIENTIST_ENTRANCE, DATA_PROFESSOR_PUTRICIDE, DOOR_TYPE_ROOM, BOUNDARY_E },
@@ -84,6 +85,7 @@ class instance_icecrown_citadel : public InstanceMapScript
isOozeDanceEligible = true;
isNauseaEligible = true;
isOrbWhispererEligible = true;
+ coldflameJetsState = NOT_STARTED;
}
void OnPlayerEnter(Player* player)
@@ -154,6 +156,9 @@ class instance_icecrown_citadel : public InstanceMapScript
if (teamInInstance == ALLIANCE)
creature->UpdateEntry(NPC_SE_SKYBREAKER_MARINE, ALLIANCE);
break;
+ case NPC_FROST_FREEZE_TRAP:
+ coldflameJets.insert(creature->GetGUID());
+ break;
case NPC_FESTERGUT:
festergut = creature->GetGUID();
break;
@@ -196,6 +201,12 @@ class instance_icecrown_citadel : public InstanceMapScript
}
}
+ void OnCreatureRemove(Creature* creature)
+ {
+ if (creature->GetEntry() == NPC_FROST_FREEZE_TRAP)
+ coldflameJets.erase(creature->GetGUID());
+ }
+
void OnGameObjectCreate(GameObject* go)
{
switch (go->GetEntry())
@@ -230,6 +241,7 @@ class instance_icecrown_citadel : public InstanceMapScript
break;
case GO_SAURFANG_S_DOOR:
saurfangDoor = go->GetGUID();
+ AddDoor(go, true);
break;
case GO_DEATHBRINGER_S_CACHE_10N:
case GO_DEATHBRINGER_S_CACHE_25N:
@@ -285,6 +297,7 @@ class instance_icecrown_citadel : public InstanceMapScript
case GO_ICEWALL:
case GO_LORD_MARROWGAR_S_ENTRANCE:
case GO_ORATORY_OF_THE_DAMNED_ENTRANCE:
+ case GO_SAURFANG_S_DOOR:
case GO_ORANGE_PLAGUE_MONSTER_ENTRANCE:
case GO_GREEN_PLAGUE_MONSTER_ENTRANCE:
case GO_SCIENTIST_ENTRANCE:
@@ -316,6 +329,8 @@ class instance_icecrown_citadel : public InstanceMapScript
return spinestalkerTrash;
case DATA_RIMEFANG:
return rimefangTrash;
+ case DATA_COLDFLAME_JETS:
+ return coldflameJetsState;
default:
break;
}
@@ -490,6 +505,13 @@ class instance_icecrown_citadel : public InstanceMapScript
if (Creature* rime = instance->GetCreature(rimefang))
rime->AI()->DoAction(ACTION_START_FROSTWYRM);
break;
+ case DATA_COLDFLAME_JETS:
+ coldflameJetsState = data;
+ if (coldflameJetsState == DONE)
+ for (std::set<uint64>::iterator itr = coldflameJets.begin(); itr != coldflameJets.end(); ++itr)
+ if (Creature* trap = instance->GetCreature(*itr))
+ trap->AI()->DoAction(ACTION_STOP_TRAPS);
+ break;
default:
break;
}
@@ -673,7 +695,7 @@ class instance_icecrown_citadel : public InstanceMapScript
OUT_SAVE_INST_DATA;
std::ostringstream saveStream;
- saveStream << "I C " << GetBossSaveData();
+ saveStream << "I C " << GetBossSaveData() << uint32(coldflameJetsState);
OUT_SAVE_INST_DATA_COMPLETE;
return saveStream.str();
@@ -704,6 +726,11 @@ class instance_icecrown_citadel : public InstanceMapScript
tmpState = NOT_STARTED;
SetBossState(i, EncounterState(tmpState));
}
+ uint32 jets = 0;
+ loadStream >> jets;
+ if (jets)
+ jets = DONE;
+ coldflameJetsState = jets;
} else OUT_LOAD_INST_DATA_FAIL;
OUT_LOAD_INST_DATA_COMPLETE;
@@ -729,7 +756,9 @@ class instance_icecrown_citadel : public InstanceMapScript
uint64 sindragosa;
uint64 spinestalker;
uint64 rimefang;
+ std::set<uint64> coldflameJets;
uint32 teamInInstance;
+ uint8 coldflameJetsState;
uint8 frostwyrms;
uint8 spinestalkerTrash;
uint8 rimefangTrash;