diff options
5 files changed, 85 insertions, 34 deletions
diff --git a/sql/updates/world/2011_09_19_00_world_spell_script_names.sql b/sql/updates/world/2011_09_19_00_world_spell_script_names.sql new file mode 100644 index 00000000000..5360210cef1 --- /dev/null +++ b/sql/updates/world/2011_09_19_00_world_spell_script_names.sql @@ -0,0 +1,3 @@ +DELETE FROM `spell_script_names` WHERE `ScriptName`='spell_dreamwalker_summon_suppresser_effect'; +INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES +(70936, 'spell_dreamwalker_summon_suppresser_effect'); diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_valithria_dreamwalker.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_valithria_dreamwalker.cpp index 436622549d5..fd8f2b3714a 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_valithria_dreamwalker.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_valithria_dreamwalker.cpp @@ -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(); diff --git a/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.cpp b/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.cpp index 2f51e0683fb..16cb0c50beb 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.cpp @@ -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; } }; diff --git a/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel_teleport.cpp b/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel_teleport.cpp index 01391f029ce..41bed882166 100755 --- a/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel_teleport.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel_teleport.cpp @@ -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); } diff --git a/src/server/scripts/Northrend/IcecrownCitadel/instance_icecrown_citadel.cpp b/src/server/scripts/Northrend/IcecrownCitadel/instance_icecrown_citadel.cpp index 890fb66cb2b..41705ca0e78 100755 --- a/src/server/scripts/Northrend/IcecrownCitadel/instance_icecrown_citadel.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/instance_icecrown_citadel.cpp @@ -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; |