diff options
author | Gustavo <sirikfoll@hotmail.com> | 2016-08-25 03:40:02 -0300 |
---|---|---|
committer | Aokromes <Aokromes@users.noreply.github.com> | 2016-08-25 08:40:02 +0200 |
commit | b459c6607f80701945cb822d8c7519998cad205f (patch) | |
tree | ed00e9f1922e4108b77cd9598d79bd1d28eabaec | |
parent | 526dfca8643d3afb9976eb099281547003dffbb1 (diff) |
Core/Scripts Implement Pit of Saron Cavern event
4 files changed, 227 insertions, 2 deletions
diff --git a/sql/updates/world/3.3.5/2016_99_99_99_world.sql b/sql/updates/world/3.3.5/2016_99_99_99_world.sql new file mode 100644 index 00000000000..cc2a6e9049d --- /dev/null +++ b/sql/updates/world/3.3.5/2016_99_99_99_world.sql @@ -0,0 +1,15 @@ +UPDATE `creature_template` SET `ScriptName`='npc_pit_of_saron_icicle' WHERE `entry`=36847; +DELETE FROM `creature` WHERE `id`=32780 AND `guid` IN (202016,202240,201907,201923,202162,202021,202194,202235,202241,202020,202272,202169,202189,202262,202220,202245,202234,202219,202226,201933,202106,202123,201832,202025,202252,202039,202224,202274,202052,202133,202267,201966,202005,202066,202116,202153,202201,201896,202138,202218,201913,202004,201995,202178,202268,202280,202040,202176,201979,202090,202134,202154,202243,201895,202073,202195,202251,202167,202064,201972,201993,202117,201891,201812,201929,202012,202173,202092,202247,202136,201925,202239); +DELETE FROM `achievement_criteria_data` WHERE `criteria_id`=12994 AND `type`=18; +DELETE FROM `spell_script_names` WHERE `ScriptName`='spell_pos_ice_shards'; +INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES +(70827, 'spell_pos_ice_shards'); + +DELETE FROM `areatrigger_scripts` WHERE `entry` IN (5580,5581); +INSERT INTO `areatrigger_scripts` (`entry`, `ScriptName`) VALUES +(5580, 'at_pit_cavern_entrance'), +(5581, 'at_pit_cavern_end'); + +DELETE FROM `creature_text` WHERE `entry`=36794 AND `groupid`=3; +INSERT INTO `creature_text` (`entry`,`groupid`,`id`,`text`,`type`,`language`,`probability`,`emote`,`duration`,`sound`,`BroadcastTextId`,`TextRange`,`comment`) VALUES +(36794,3,0,'Rimefang, trap them within the tunnel! BURY THEM ALIVE!',14,0,100,0,0,16757,36714,1,'SAY_TYRANNUS_CAVERN_ENTRANCE'); diff --git a/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/instance_pit_of_saron.cpp b/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/instance_pit_of_saron.cpp index 12845d6e2b1..2119a496c47 100644 --- a/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/instance_pit_of_saron.cpp +++ b/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/instance_pit_of_saron.cpp @@ -45,6 +45,8 @@ class instance_pit_of_saron : public InstanceMapScript SetBossNumber(EncounterCount); LoadDoorData(Doors); _teamInInstance = 0; + _cavernActive = 0; + _shardsHit = 0; } void OnPlayerEnter(Player* player) override @@ -153,6 +155,9 @@ class instance_pit_of_saron : public InstanceMapScript if (_teamInInstance == ALLIANCE) creature->UpdateEntry(NPC_MARTIN_VICTUS_2); break; + case NPC_CAVERN_EVENT_TRIGGER: + _cavernstriggersVector.push_back(creature->GetGUID()); + break; default: break; } @@ -224,6 +229,10 @@ class instance_pit_of_saron : public InstanceMapScript { case DATA_TEAM_IN_INSTANCE: return _teamInInstance; + case DATA_ICE_SHARDS_HIT: + return _shardsHit; + case DATA_CAVERN_ACTIVE: + return _cavernActive; default: break; } @@ -231,6 +240,27 @@ class instance_pit_of_saron : public InstanceMapScript return 0; } + void SetData(uint32 type, uint32 data) override + { + switch (type) + { + case DATA_ICE_SHARDS_HIT: + _shardsHit = data; + break; + case DATA_CAVERN_ACTIVE: + if (data) + { + _cavernActive = data; + HandleCavernEventTrigger(true); + } + else + HandleCavernEventTrigger(false); + break; + default: + break; + } + } + ObjectGuid GetGuidData(uint32 type) const override { switch (type) @@ -258,6 +288,18 @@ class instance_pit_of_saron : public InstanceMapScript return ObjectGuid::Empty; } + void HandleCavernEventTrigger(bool activate) + { + for (ObjectGuid guid : _cavernstriggersVector) + if (Creature* trigger = instance->GetCreature(guid)) + { + if (activate) + trigger->m_Events.AddEvent(new ScheduledIcicleSummons(trigger), trigger->m_Events.CalculateTime(1000)); + else + trigger->m_Events.KillAllEvents(false); + } + } + private: ObjectGuid _garfrostGUID; ObjectGuid _krickGUID; @@ -268,8 +310,11 @@ class instance_pit_of_saron : public InstanceMapScript ObjectGuid _tyrannusEventGUID; ObjectGuid _jainaOrSylvanas1GUID; ObjectGuid _jainaOrSylvanas2GUID; + GuidVector _cavernstriggersVector; uint32 _teamInInstance; + uint8 _shardsHit; + uint8 _cavernActive; }; InstanceScript* GetInstanceScript(InstanceMap* map) const override diff --git a/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/pit_of_saron.cpp b/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/pit_of_saron.cpp index a39c4518a4e..0fe4c8144cc 100644 --- a/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/pit_of_saron.cpp +++ b/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/pit_of_saron.cpp @@ -20,7 +20,9 @@ #include "SpellScript.h" #include "SpellAuraEffects.h" #include "pit_of_saron.h" +#include "PassiveAI.h" #include "Vehicle.h" +#include "Player.h" enum Spells { @@ -246,10 +248,140 @@ class spell_trash_npc_glacial_strike : public SpellScriptLoader } }; +class npc_pit_of_saron_icicle : public CreatureScript +{ + public: + npc_pit_of_saron_icicle() : CreatureScript("npc_pit_of_saron_icicle") { } + + struct npc_pit_of_saron_icicleAI : public PassiveAI + { + npc_pit_of_saron_icicleAI(Creature* creature) : PassiveAI(creature) + { + me->SetDisplayId(me->GetCreatureTemplate()->Modelid1); + } + + void IsSummonedBy(Unit* summoner) override + { + _summonerGUID = summoner->GetGUID(); + + _scheduler.Schedule(Milliseconds(3650), [this](TaskContext /*context*/) + { + DoCastSelf(SPELL_ICICLE_FALL_TRIGGER, true); + DoCastSelf(SPELL_ICICLE_FALL_VISUAL); + + if (Unit* caster = ObjectAccessor::GetUnit(*me, _summonerGUID)) + caster->RemoveDynObject(SPELL_ICICLE_SUMMON); + }); + } + + void UpdateAI(uint32 diff) override + { + _scheduler.Update(diff); + } + + private: + TaskScheduler _scheduler; + ObjectGuid _summonerGUID; + }; + + CreatureAI* GetAI(Creature* creature) const override + { + return GetPitOfSaronAI<npc_pit_of_saron_icicleAI>(creature); + } +}; + + +class spell_pos_ice_shards : public SpellScriptLoader +{ + public: + spell_pos_ice_shards() : SpellScriptLoader("spell_pos_ice_shards") { } + + class spell_pos_ice_shards_SpellScript : public SpellScript + { + PrepareSpellScript(spell_pos_ice_shards_SpellScript); + + bool Load() override + { + // This script should execute only in Pit of Saron + if (InstanceMap* instance = GetCaster()->GetMap()->ToInstanceMap()) + if (instance->GetInstanceScript()) + if (instance->GetScriptId() == sObjectMgr->GetScriptId(PoSScriptName)) + return true; + + return false; + } + + void HandleScriptEffect(SpellEffIndex /*effIndex*/) + { + if (GetHitPlayer()) + GetCaster()->GetInstanceScript()->SetData(DATA_ICE_SHARDS_HIT, 1); + } + + void Register() override + { + OnEffectHitTarget += SpellEffectFn(spell_pos_ice_shards_SpellScript::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCHOOL_DAMAGE); + } + }; + + SpellScript* GetSpellScript() const override + { + return new spell_pos_ice_shards_SpellScript(); + } +}; + +enum TyrannusEventCavernEmote +{ + SAY_TYRANNUS_CAVERN_ENTRANCE = 3 +}; + +class at_pit_cavern_entrance : public AreaTriggerScript +{ + public: + at_pit_cavern_entrance() : AreaTriggerScript("at_pit_cavern_entrance") { } + + bool OnTrigger(Player* player, AreaTriggerEntry const* /*areaTrigger*/) override + { + if (InstanceScript* instance = player->GetInstanceScript()) + { + if (instance->GetData(DATA_CAVERN_ACTIVE)) + return true; + + instance->SetData(DATA_CAVERN_ACTIVE, 1); + + if (Creature* tyrannus = ObjectAccessor::GetCreature(*player, instance->GetGuidData(DATA_TYRANNUS_EVENT))) + tyrannus->AI()->Talk(SAY_TYRANNUS_CAVERN_ENTRANCE); + } + return true; + } +}; + +class at_pit_cavern_end : public AreaTriggerScript +{ +public: + at_pit_cavern_end() : AreaTriggerScript("at_pit_cavern_end") { } + + bool OnTrigger(Player* player, AreaTriggerEntry const* /*areaTrigger*/) override + { + if (InstanceScript* instance = player->GetInstanceScript()) + { + instance->SetData(DATA_CAVERN_ACTIVE, 0); + + if (!instance->GetData(DATA_ICE_SHARDS_HIT)) + instance->DoUpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_BE_SPELL_TARGET, SPELL_DONT_LOOK_UP_ACHIEV_CREDIT, 0, player); + } + + return true; + } +}; + void AddSC_pit_of_saron() { new npc_ymirjar_flamebearer(); new npc_iceborn_protodrake(); new npc_geist_ambusher(); + new npc_pit_of_saron_icicle(); new spell_trash_npc_glacial_strike(); + new spell_pos_ice_shards(); + new at_pit_cavern_entrance(); + new at_pit_cavern_end(); } diff --git a/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/pit_of_saron.h b/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/pit_of_saron.h index 8e2b46cba59..24581f2ffdd 100644 --- a/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/pit_of_saron.h +++ b/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/pit_of_saron.h @@ -36,7 +36,9 @@ enum DataTypes DATA_JAINA_SYLVANAS_1 = 5, // GUID of either Jaina or Sylvanas part 1, depending on team, as it's the same spawn. DATA_JAINA_SYLVANAS_2 = 6, // GUID of either Jaina or Sylvanas part 2, depending on team, as it's the same spawn. DATA_TYRANNUS_EVENT = 7, - DATA_TEAM_IN_INSTANCE = 8 + DATA_TEAM_IN_INSTANCE = 8, + DATA_ICE_SHARDS_HIT = 9, + DATA_CAVERN_ACTIVE = 10 }; enum CreatureIds @@ -86,7 +88,8 @@ enum CreatureIds NPC_FORGEMASTER_STALKER = 36495, NPC_EXPLODING_ORB = 36610, NPC_YMIRJAR_DEATHBRINGER = 36892, - NPC_ICY_BLAST = 36731 + NPC_ICY_BLAST = 36731, + NPC_CAVERN_EVENT_TRIGGER = 32780 }; enum GameObjectIds @@ -96,6 +99,36 @@ enum GameObjectIds GO_HALLS_OF_REFLECTION_PORTCULLIS = 201848 }; +enum SpellsIcicle +{ + SPELL_ICICLE_SUMMON = 69424, + SPELL_ICICLE_FALL_TRIGGER = 69426, + SPELL_ICICLE_FALL_VISUAL = 69428, + SPELL_DONT_LOOK_UP_ACHIEV_CREDIT = 72845 +}; + +class ScheduledIcicleSummons : public BasicEvent +{ + public: + ScheduledIcicleSummons(Creature* trigger) : _trigger(trigger) { } + + bool Execute(uint64 /*time*/, uint32 /*diff*/) override + { + if (roll_chance_i(12)) + { + _trigger->CastSpell(_trigger, SPELL_ICICLE_SUMMON, true); + _trigger->m_Events.AddEvent(new ScheduledIcicleSummons(_trigger), _trigger->m_Events.CalculateTime(urand(20000, 35000))); + } + else + _trigger->m_Events. AddEvent(new ScheduledIcicleSummons(_trigger), _trigger->m_Events.CalculateTime(urand(1000,20000))); + + return true; + } + + private: + Creature* _trigger; +}; + template<class AI> AI* GetPitOfSaronAI(Creature* creature) { |