diff options
author | Shauren <shauren.trinity@gmail.com> | 2011-02-08 17:54:40 +0100 |
---|---|---|
committer | Shauren <shauren.trinity@gmail.com> | 2011-02-08 17:54:40 +0100 |
commit | bf8e88c0b8130ff931d9798d26973f55b08e8049 (patch) | |
tree | 8233fda34f5286e9a0f24ff973e7ab971e335852 | |
parent | 8d8e63a86697d7bd57d705997811c4083a551cb9 (diff) |
Scripts/Icecrown Citadel: Implemented traps after Deathbringer Saurfang
11 files changed, 208 insertions, 4 deletions
diff --git a/sql/scripts/world_scripts_full.sql b/sql/scripts/world_scripts_full.sql index 5aac3170c27..8f3aa125b13 100644 --- a/sql/scripts/world_scripts_full.sql +++ b/sql/scripts/world_scripts_full.sql @@ -9,7 +9,7 @@ UPDATE `gameobject_template` SET `ScriptName`=''; UPDATE `outdoorpvp_template` SET `ScriptName`=''; /* AREA TRIGGERS */ -DELETE FROM `areatrigger_scripts` WHERE `entry` IN (822,5284,5285,5286,5287,4871,4872,4873,5108,5332,5338,5334,5340,5369,5423,5633,5604); +DELETE FROM `areatrigger_scripts` WHERE `entry` IN (822,5284,5285,5286,5287,4871,4872,4873,5108,5332,5338,5334,5340,5369,5423,5633,5604,5698,5649); DELETE FROM `areatrigger_scripts` WHERE `entry` BETWEEN 1726 AND 1740; INSERT INTO `areatrigger_scripts` (`entry`,`ScriptName`) VALUES (822, 'at_map_chamber'), @@ -43,7 +43,9 @@ INSERT INTO `areatrigger_scripts` (`entry`,`ScriptName`) VALUES (5369, 'at_RX_214_repair_o_matic_station'), (5423, 'at_RX_214_repair_o_matic_station'), (5633, 'at_tyrannus_event_starter'), -(5604, 'at_sindragosa_lair'); +(5604, 'at_sindragosa_lair'), +(5698, 'at_icc_saurfang_portal'), +(5649, 'at_icc_shutdown_traps'); /* WORLD BOSS */ UPDATE `creature_template` SET `ScriptName`='boss_ysondre' WHERE `entry`=14887; @@ -847,6 +849,7 @@ UPDATE `creature_template` SET `ScriptName`='boss_deathbringer_saurfang' WHERE ` UPDATE `creature_template` SET `ScriptName`='npc_high_overlord_saurfang_icc' WHERE `entry`=37187; UPDATE `creature_template` SET `ScriptName`='npc_muradin_bronzebeard_icc' WHERE `entry`=37200; UPDATE `creature_template` SET `ScriptName`='npc_saurfang_event' WHERE `entry` IN (37920,37830); +UPDATE `creature_template` SET `ScriptName`='npc_frost_freeze_trap' WHERE `entry`=37744; UPDATE `creature_template` SET `ScriptName`='boss_festergut' WHERE `entry`=36626; UPDATE `creature_template` SET `ScriptName`='npc_stinky_icc' WHERE `entry`=37025; UPDATE `creature_template` SET `ScriptName`='boss_rotface' WHERE `entry`=36627; diff --git a/sql/updates/world/2011_02_08_0_world_areatrigger_scripts.sql b/sql/updates/world/2011_02_08_0_world_areatrigger_scripts.sql new file mode 100644 index 00000000000..c7a29e0428d --- /dev/null +++ b/sql/updates/world/2011_02_08_0_world_areatrigger_scripts.sql @@ -0,0 +1,4 @@ +DELETE FROM `areatrigger_scripts` WHERE `entry` IN (5698,5649); +INSERT INTO `areatrigger_scripts` (`entry`,`ScriptName`) VALUES +(5698,'at_icc_saurfang_portal'), +(5649,'at_icc_shutdown_traps'); diff --git a/sql/updates/world/2011_02_08_0_world_instance_saurfang_traps.sql b/sql/updates/world/2011_02_08_0_world_instance_saurfang_traps.sql new file mode 100644 index 00000000000..2f3450e61d4 --- /dev/null +++ b/sql/updates/world/2011_02_08_0_world_instance_saurfang_traps.sql @@ -0,0 +1,18 @@ +UPDATE `creature_template` SET `minlevel`=80,`maxlevel`=80,`faction_A`=14,`faction_H`=14,`unit_flags`=0x02000000,`flags_extra`=128,`InhabitType`=7 WHERE `entry`=37744; +UPDATE `creature_template` SET `RegenHealth`=0 WHERE `entry` IN (36980,38320,38321,38322); -- Ice Tomb health regen + +SET @GUID := 137731; +DELETE FROM `creature` WHERE `id`=37744; +INSERT INTO `creature` (`guid`,`id`,`map`,`spawnMask`,`phaseMask`,`modelid`,`equipment_id`,`position_x`,`position_y`,`position_z`,`orientation`,`spawntimesecs`,`spawndist`,`currentwaypoint`,`curhealth`,`curmana`,`DeathState`,`MovementType`,`npcflag`,`unit_flags`,`dynamicflags`) VALUES +(@GUID+00,37744,631,15,1,0,0,4135.74658,2781.60156,353.163574,4.729,120,0,0,1,0,0,0,0,0,0), +(@GUID+01,37744,631,15,1,0,0,4156.65100,2781.51831,353.001343,4.729,120,0,0,1,0,0,0,0,0,0), +(@GUID+02,37744,631,15,1,0,0,4159.71300,2735.11279,355.224200,6.248,120,0,0,1,0,0,0,0,0,0), +(@GUID+03,37744,631,15,1,0,0,4159.79900,2804.18848,355.288116,0.017,120,0,0,1,0,0,0,0,0,0), +(@GUID+04,37744,631,15,1,0,0,4160.11200,2788.29419,352.943756,6.260,120,0,0,1,0,0,0,0,0,0), +(@GUID+05,37744,631,15,1,0,0,4183.78467,2751.65723,353.090027,3.124,120,0,0,1,0,0,0,0,0,0), +(@GUID+06,37744,631,15,1,0,0,4192.59700,2733.27954,355.288116,4.712,120,0,0,1,0,0,0,0,0,0), +(@GUID+07,37744,631,15,1,0,0,4193.00700,2829.08423,355.361328,4.694,120,0,0,1,0,0,0,0,0,0), +(@GUID+08,37744,631,15,1,0,0,4201.84900,2750.52612,353.001343,0.017,120,0,0,1,0,0,0,0,0,0), +(@GUID+09,37744,631,15,1,0,0,4224.70557,2804.10864,355.288100,3.140,120,0,0,1,0,0,0,0,0,0), +(@GUID+10,37744,631,15,1,0,0,4224.83500,2735.23600,355.288116,3.140,120,0,0,1,0,0,0,0,0,0), +(@GUID+11,37744,631,15,1,0,0,4225.13800,2788.18848,353.032745,3.141,120,0,0,1,0,0,0,0,0,0); diff --git a/sql/updates/world/2011_02_08_0_world_scriptname.sql b/sql/updates/world/2011_02_08_0_world_scriptname.sql new file mode 100644 index 00000000000..79dff902f24 --- /dev/null +++ b/sql/updates/world/2011_02_08_0_world_scriptname.sql @@ -0,0 +1 @@ +UPDATE `creature_template` SET `ScriptName`='npc_frost_freeze_trap' WHERE `entry`=37744; 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; |