Scripts/Icecrown Citadel

* Traps after Deathbringer Saurfang will not turn off anymore
* Fixed Valithria Dreamwalker adds not attacking players

Closes #2343
Closes #2485
Closes #2815
This commit is contained in:
Shauren
2011-09-19 12:21:36 +02:00
parent 872c2d4d63
commit ff66d933d8
5 changed files with 85 additions and 34 deletions
@@ -339,9 +339,7 @@ class boss_valithria_dreamwalker : public CreatureScript
_instance->SendEncounterUnit(ENCOUNTER_FRAME_REMOVE, me);
me->RemoveAurasDueToSpell(SPELL_CORRUPTION_VALITHRIA);
DoCast(me, SPELL_ACHIEVEMENT_CHECK);
float x, y, z;
me->GetPosition(x, y, z);
me->CastSpell(x, y, z, SPELL_DREAMWALKERS_RAGE, false);
DoCastAOE(SPELL_DREAMWALKERS_RAGE);
_events.ScheduleEvent(EVENT_DREAM_SLIP, 3500);
if (Creature* lichKing = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_VALITHRIA_LICH_KING)))
lichKing->AI()->EnterEvadeMode();
@@ -529,7 +527,7 @@ class npc_green_dragon_combat_trigger : public CreatureScript
void JustReachedHome()
{
BossAI::JustReachedHome();
_JustReachedHome();
DoAction(ACTION_DEATH);
}
@@ -537,7 +535,7 @@ class npc_green_dragon_combat_trigger : public CreatureScript
{
if (action == ACTION_DEATH)
{
instance->SetBossState(DATA_VALITHRIA_DREAMWALKER, FAIL);
instance->SetBossState(DATA_VALITHRIA_DREAMWALKER, NOT_STARTED);
me->m_Events.AddEvent(new ValithriaDespawner(me), me->m_Events.CalculateTime(5000));
}
}
@@ -1180,6 +1178,13 @@ class spell_dreamwalker_summoner : public SpellScriptLoader
{
PrepareSpellScript(spell_dreamwalker_summoner_SpellScript);
bool Load()
{
if (!GetCaster()->GetInstanceScript())
return false;
return true;
}
void FilterTargets(std::list<Unit*>& targets)
{
targets.remove_if(Trinity::UnitAuraCheck(true, SPELL_RECENTLY_SPAWNED));
@@ -1191,9 +1196,19 @@ class spell_dreamwalker_summoner : public SpellScriptLoader
targets.push_back(target);
}
void HandleForceCast(SpellEffIndex effIndex)
{
PreventHitDefaultEffect(effIndex);
if (!GetHitUnit())
return;
GetHitUnit()->CastSpell(GetCaster(), GetSpellInfo()->Effects[effIndex].TriggerSpell, true, NULL, NULL, GetCaster()->GetInstanceScript()->GetData64(DATA_VALITHRIA_LICH_KING));
}
void Register()
{
OnUnitTargetSelect += SpellUnitTargetFn(spell_dreamwalker_summoner_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENTRY);
OnEffect += SpellEffectFn(spell_dreamwalker_summoner_SpellScript::HandleForceCast, EFFECT_0, SPELL_EFFECT_FORCE_CAST);
}
};
@@ -1220,7 +1235,7 @@ class spell_dreamwalker_summon_suppresser : public SpellScriptLoader
return;
std::list<Creature*> summoners;
GetCreatureListWithEntryInGrid(summoners, caster, 22515, 100.0f);
GetCreatureListWithEntryInGrid(summoners, caster, NPC_WORLD_TRIGGER, 100.0f);
summoners.remove_if(Trinity::UnitAuraCheck(true, SPELL_RECENTLY_SPAWNED));
Trinity::RandomResizeList(summoners, 2);
if (summoners.empty())
@@ -1236,8 +1251,6 @@ class spell_dreamwalker_summon_suppresser : public SpellScriptLoader
{
OnEffectPeriodic += AuraEffectPeriodicFn(spell_dreamwalker_summon_suppresser_AuraScript::PeriodicTick, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL);
}
int32 _decayRate;
};
AuraScript* GetAuraScript() const
@@ -1246,6 +1259,43 @@ class spell_dreamwalker_summon_suppresser : public SpellScriptLoader
}
};
class spell_dreamwalker_summon_suppresser_effect : public SpellScriptLoader
{
public:
spell_dreamwalker_summon_suppresser_effect() : SpellScriptLoader("spell_dreamwalker_summon_suppresser_effect") { }
class spell_dreamwalker_summon_suppresser_effect_SpellScript : public SpellScript
{
PrepareSpellScript(spell_dreamwalker_summon_suppresser_effect_SpellScript);
bool Load()
{
if (!GetCaster()->GetInstanceScript())
return false;
return true;
}
void HandleForceCast(SpellEffIndex effIndex)
{
PreventHitDefaultEffect(effIndex);
if (!GetHitUnit())
return;
GetHitUnit()->CastSpell(GetCaster(), GetSpellInfo()->Effects[effIndex].TriggerSpell, true, NULL, NULL, GetCaster()->GetInstanceScript()->GetData64(DATA_VALITHRIA_LICH_KING));
}
void Register()
{
OnEffect += SpellEffectFn(spell_dreamwalker_summon_suppresser_effect_SpellScript::HandleForceCast, EFFECT_0, SPELL_EFFECT_FORCE_CAST);
}
};
SpellScript* GetSpellScript() const
{
return new spell_dreamwalker_summon_suppresser_effect_SpellScript();
}
};
class spell_dreamwalker_summon_dream_portal : public SpellScriptLoader
{
public:
@@ -1402,6 +1452,7 @@ void AddSC_boss_valithria_dreamwalker()
new spell_dreamwalker_decay_periodic_timer();
new spell_dreamwalker_summoner();
new spell_dreamwalker_summon_suppresser();
new spell_dreamwalker_summon_suppresser_effect();
new spell_dreamwalker_summon_dream_portal();
new spell_dreamwalker_summon_nightmare_portal();
new spell_dreamwalker_nightmare_cloud();
@@ -273,6 +273,11 @@ enum EventIds
EVENT_AWAKEN_WARD_4 = 22909,
};
enum MovementPoints
{
POINT_LAND = 1,
};
class FrostwingVrykulSearcher
{
public:
@@ -666,10 +671,6 @@ class npc_frost_freeze_trap : public CreatureScript
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;
}
@@ -761,7 +762,6 @@ class boss_sister_svalna : public CreatureScript
_EnterCombat();
if (Creature* crok = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_CROK_SCOURGEBANE)))
crok->AI()->Talk(SAY_CROK_COMBAT_SVALNA);
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_ATTACKABLE_1);
events.ScheduleEvent(EVENT_SVALNA_COMBAT, 9000);
events.ScheduleEvent(EVENT_IMPALING_SPEAR, urand(40000, 50000));
events.ScheduleEvent(EVENT_AETHER_SHIELD, urand(100000, 110000));
@@ -835,17 +835,30 @@ class boss_sister_svalna : public CreatureScript
}
}
void MovementInform(uint32 type, uint32 id)
{
if (type != POINT_MOTION_TYPE || id != POINT_LAND)
return;
_isEventInProgress = false;
me->setActive(false);
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_OOC_NOT_ATTACKABLE | UNIT_FLAG_PASSIVE);
}
void SpellHitTarget(Unit* target, SpellInfo const* spell)
{
switch (spell->Id)
{
case SPELL_REVIVE_CHAMPION:
{
if (!_isEventInProgress)
break;
_isEventInProgress = false;
me->setActive(false);
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_OOC_NOT_ATTACKABLE | UNIT_FLAG_PASSIVE);
Position pos;
me->GetPosition(&pos);
me->UpdateGroundPositionZ(pos.GetPositionX(), pos.GetPositionY(), pos.m_positionZ);
me->GetMotionMaster()->MovePoint(POINT_LAND, pos);
break;
}
case SPELL_IMPALING_SPEAR_KILL:
me->Kill(target);
break;
@@ -884,7 +897,6 @@ class boss_sister_svalna : public CreatureScript
me->CastSpell(me, SPELL_REVIVE_CHAMPION, false);
break;
case EVENT_SVALNA_COMBAT:
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_ATTACKABLE_1);
me->SetReactState(REACT_DEFENSIVE);
Talk(SAY_SVALNA_AGGRO);
break;
@@ -1987,8 +1999,7 @@ class at_icc_shutdown_traps : public AreaTriggerScript
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);
instance->SetData(DATA_COLDFLAME_JETS, DONE);
return true;
}
};
@@ -41,6 +41,7 @@ class icecrown_citadel_teleport : public GameObjectScript
player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, "Teleport to the Deathbringer's Rise.", GOSSIP_SENDER_ICC_PORT, DEATHBRINGER_S_RISE_TELEPORT);
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);
// TODO: Gauntlet event before Sindragosa
if (instance->GetBossState(DATA_VALITHRIA_DREAMWALKER) == DONE)
player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, "Teleport to Sindragosa's Lair", GOSSIP_SENDER_ICC_PORT, SINDRAGOSA_S_LAIR_TELEPORT);
}
@@ -207,9 +207,6 @@ class instance_icecrown_citadel : public InstanceMapScript
if (TeamInInstance == ALLIANCE)
creature->UpdateEntry(NPC_SE_SKYBREAKER_MARINE, ALLIANCE);
break;
case NPC_FROST_FREEZE_TRAP:
ColdflameJetGUIDs.insert(creature->GetGUID());
break;
case NPC_FESTERGUT:
FestergutGUID = creature->GetGUID();
break;
@@ -310,12 +307,6 @@ class instance_icecrown_citadel : public InstanceMapScript
return entry;
}
void OnCreatureRemove(Creature* creature)
{
if (creature->GetEntry() == NPC_FROST_FREEZE_TRAP)
ColdflameJetGUIDs.erase(creature->GetGUID());
}
void OnCreatureDeath(Creature* creature)
{
switch (creature->GetEntry())
@@ -792,12 +783,7 @@ class instance_icecrown_citadel : public InstanceMapScript
case DATA_COLDFLAME_JETS:
ColdflameJetsState = data;
if (ColdflameJetsState == DONE)
{
SaveToDB();
for (std::set<uint64>::iterator itr = ColdflameJetGUIDs.begin(); itr != ColdflameJetGUIDs.end(); ++itr)
if (Creature* trap = instance->GetCreature(*itr))
trap->AI()->DoAction(ACTION_STOP_TRAPS);
}
break;
case DATA_BLOOD_QUICKENING_STATE:
{
@@ -1090,7 +1076,6 @@ class instance_icecrown_citadel : public InstanceMapScript
}
protected:
std::set<uint64> ColdflameJetGUIDs;
uint64 LadyDeathwisperElevatorGUID;
uint64 DeathbringerSaurfangGUID;
uint64 DeathbringerSaurfangDoorGUID;