Core/Scripts Implement Pit of Saron Cavern event

(cherry picked from commit b459c6607f)

Rename 2016_99_99_99_world.sql to 2016_08_25_01_world.sql
(cherry picked from commit 05df3cc988)
This commit is contained in:
Gustavo
2016-08-25 08:40:02 +02:00
committed by joschiwald
parent e8df5babe6
commit a4fc7d9d2d
4 changed files with 233 additions and 2 deletions

View File

@@ -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

View File

@@ -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();
}

View File

@@ -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)
{