mirror of
https://github.com/TrinityCore/TrinityCore.git
synced 2026-01-18 00:18:43 +01:00
Core/Scripts Implement Pit of Saron Cavern event
(cherry picked from commitb459c6607f) Rename 2016_99_99_99_world.sql to 2016_08_25_01_world.sql (cherry picked from commit05df3cc988)
This commit is contained in:
@@ -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');
|
||||
@@ -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
|
||||
|
||||
@@ -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,146 @@ 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*/, bool entered) override
|
||||
{
|
||||
if (!entered)
|
||||
return true;
|
||||
|
||||
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*/, bool entered) override
|
||||
{
|
||||
if (!entered)
|
||||
return true;
|
||||
|
||||
if (InstanceScript* instance = player->GetInstanceScript())
|
||||
{
|
||||
instance->SetData(DATA_CAVERN_ACTIVE, 0);
|
||||
|
||||
if (!instance->GetData(DATA_ICE_SHARDS_HIT))
|
||||
instance->DoUpdateCriteria(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();
|
||||
}
|
||||
|
||||
@@ -36,7 +36,9 @@ enum POSDataTypes
|
||||
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 POSCreatureIds
|
||||
@@ -86,7 +88,8 @@ enum POSCreatureIds
|
||||
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 POSGameObjectIds
|
||||
@@ -96,6 +99,36 @@ enum POSGameObjectIds
|
||||
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)
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user