aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGustavo <sirikfoll@hotmail.com>2016-08-25 03:40:02 -0300
committerAokromes <Aokromes@users.noreply.github.com>2016-08-25 08:40:02 +0200
commitb459c6607f80701945cb822d8c7519998cad205f (patch)
treeed00e9f1922e4108b77cd9598d79bd1d28eabaec
parent526dfca8643d3afb9976eb099281547003dffbb1 (diff)
Core/Scripts Implement Pit of Saron Cavern event
-rw-r--r--sql/updates/world/3.3.5/2016_99_99_99_world.sql15
-rw-r--r--src/server/scripts/Northrend/FrozenHalls/PitOfSaron/instance_pit_of_saron.cpp45
-rw-r--r--src/server/scripts/Northrend/FrozenHalls/PitOfSaron/pit_of_saron.cpp132
-rw-r--r--src/server/scripts/Northrend/FrozenHalls/PitOfSaron/pit_of_saron.h37
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)
{