diff options
author | Trista <aconstantgoal@abv.bg> | 2013-03-08 04:45:15 +0200 |
---|---|---|
committer | Trista <aconstantgoal@abv.bg> | 2013-03-08 04:55:44 +0200 |
commit | 17061cb9e52d409f70dbe063b73cae9cd02c7db3 (patch) | |
tree | 46f736cbc875bf8025bb5b2de8949ae2a94e25ae /src | |
parent | 3a9c26225ef9737cac3095ab8aa24e271b9800f0 (diff) |
Scripts/Icecrown: Add script* support for Borrowed Technology/Volatility quests
* There are heavy core problems that make it not fully functional for now.
1) Enter vehicle of 31578 is being overriding the vehicle aura of the accessory so it kicks it out. (both get applied to 1, but instead decoy should be to 0).
2) Even if mentioned above get fixed the accessory is supposed to implicitly hit another passenger with explosion
and no seat flags for it even unknown.
3) Armored Decoy doesn't keep emote from freeze mechanic when enter vehicle connected with a not supported flag.
4) Vehicle speed seems too fast (there is some general vehicle not correct speed problem with spline being involved).
Connected with: #5757
Diffstat (limited to 'src')
-rw-r--r-- | src/server/scripts/Northrend/zone_icecrown.cpp | 88 | ||||
-rw-r--r-- | src/server/scripts/Spells/spell_quest.cpp | 81 |
2 files changed, 169 insertions, 0 deletions
diff --git a/src/server/scripts/Northrend/zone_icecrown.cpp b/src/server/scripts/Northrend/zone_icecrown.cpp index d5641b0fcc7..457eaccec8c 100644 --- a/src/server/scripts/Northrend/zone_icecrown.cpp +++ b/src/server/scripts/Northrend/zone_icecrown.cpp @@ -32,6 +32,7 @@ EndContentData */ #include "ScriptedGossip.h" #include "SpellAuras.h" #include "Player.h" +#include "TemporarySummon.h" /*###### ## npc_arete @@ -874,6 +875,92 @@ public: } }; +/*###### +## Borrowed Technology - Id: 13291, The Solution Solution (daily) - Id: 13292, Volatility - Id: 13239, Volatiliy - Id: 13261 (daily) +######*/ + +enum BorrowedTechnologyAndVolatility +{ + // Spells + SPELL_GRAB = 59318, + SPELL_PING_BUNNY = 59375, + SPELL_IMMOLATION = 54690, + SPELL_EXPLOSION = 59335, + SPELL_RIDE = 56687, + + // Points + POINT_GRAB_DECOY = 1, + POINT_FLY_AWAY = 2, + + // Events + EVENT_FLY_AWAY = 1 +}; + +class npc_frostbrood_skytalon : public CreatureScript +{ + public: + npc_frostbrood_skytalon() : CreatureScript("npc_frostbrood_skytalon") { } + + struct npc_frostbrood_skytalonAI : public VehicleAI + { + npc_frostbrood_skytalonAI(Creature* creature) : VehicleAI(creature) { } + + EventMap events; + + void IsSummonedBy(Unit* summoner) + { + me->GetMotionMaster()->MovePoint(POINT_GRAB_DECOY, summoner->GetPositionX(), summoner->GetPositionY(), summoner->GetPositionZ()); + } + + void MovementInform(uint32 type, uint32 id) + { + if (type != POINT_MOTION_TYPE) + return; + + if (id == POINT_GRAB_DECOY) + if (TempSummon* summon = me->ToTempSummon()) + if (Unit* summoner = summon->GetSummoner()) + DoCast(summoner, SPELL_GRAB); + } + + void UpdateAI(uint32 diff) + { + VehicleAI::UpdateAI(diff); + events.Update(diff); + + while (uint32 eventId = events.ExecuteEvent()) + { + if (eventId == EVENT_FLY_AWAY) + { + Position randomPosOnRadius; + randomPosOnRadius.m_positionZ = (me->GetPositionZ() + 40.0f); + me->GetNearPoint2D(randomPosOnRadius.m_positionX, randomPosOnRadius.m_positionY, 40.0f, me->GetAngle(me)); + me->GetMotionMaster()->MovePoint(POINT_FLY_AWAY, randomPosOnRadius); + } + } + } + + void SpellHit(Unit* /*caster*/, SpellInfo const* spell) + { + switch (spell->Id) + { + case SPELL_EXPLOSION: + DoCast(me, SPELL_IMMOLATION); + break; + case SPELL_RIDE: + DoCastAOE(SPELL_PING_BUNNY); + events.ScheduleEvent(EVENT_FLY_AWAY, 100); + break; + } + } + }; + + CreatureAI* GetAI(Creature* creature) const + { + return new npc_frostbrood_skytalonAI(creature); + } +}; + void AddSC_icecrown() { new npc_arete; @@ -883,4 +970,5 @@ void AddSC_icecrown() new npc_vereth_the_cunning; new npc_tournament_training_dummy; new npc_blessed_banner(); + new npc_frostbrood_skytalon(); } diff --git a/src/server/scripts/Spells/spell_quest.cpp b/src/server/scripts/Spells/spell_quest.cpp index 49a47a17392..3036c52876d 100644 --- a/src/server/scripts/Spells/spell_quest.cpp +++ b/src/server/scripts/Spells/spell_quest.cpp @@ -1561,6 +1561,85 @@ class spell_q12527_zuldrak_rat : public SpellScriptLoader } }; +// 13291 - Borrowed Technology/13292 - The Solution Solution /Daily//13239 - Volatility/13261 - Volatiliy /Daily// +enum Quest13291_13292_13239_13261Data +{ + // NPCs + NPC_SKYTALON = 31583, + NPC_DECOY = 31578, + // Spells + SPELL_RIDE = 56687 +}; + +class spell_q13291_q13292_q13239_q13261_frostbrood_skytalon_grab_decoy : public SpellScriptLoader +{ + public: + spell_q13291_q13292_q13239_q13261_frostbrood_skytalon_grab_decoy() : SpellScriptLoader("spell_q13291_q13292_q13239_q13261_frostbrood_skytalon_grab_decoy") { } + + class spell_q13291_q13292_q13239_q13261_frostbrood_skytalon_grab_decoy_SpellScript : public SpellScript + { + PrepareSpellScript(spell_q13291_q13292_q13239_q13261_frostbrood_skytalon_grab_decoy_SpellScript); + + bool Validate(SpellInfo const* /*spell*/) + { + if (!sSpellMgr->GetSpellInfo(SPELL_RIDE)) + return false; + + return true; + } + + void HandleDummy(SpellEffIndex /*effIndex*/) + { + if (!GetHitCreature()) + return; + // TO DO: Being triggered is hack, but in checkcast it doesn't pass aurastate requirements. + // Beside that the decoy won't keep it's freeze animation state when enter. + GetHitCreature()->CastSpell(GetCaster(), SPELL_RIDE, true); + } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_q13291_q13292_q13239_q13261_frostbrood_skytalon_grab_decoy_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_q13291_q13292_q13239_q13261_frostbrood_skytalon_grab_decoy_SpellScript(); + } +}; + +class spell_q13291_q13292_q13239_q13261_armored_decoy_summon_skytalon : public SpellScriptLoader +{ + public: + spell_q13291_q13292_q13239_q13261_armored_decoy_summon_skytalon() : SpellScriptLoader("spell_q13291_q13292_q13239_q13261_armored_decoy_summon_skytalon") { } + + class spell_q13291_q13292_q13239_q13261_armored_decoy_summon_skytalon_SpellScript : public SpellScript + { + PrepareSpellScript(spell_q13291_q13292_q13239_q13261_armored_decoy_summon_skytalon_SpellScript); + + void ChangeSummonPos(SpellEffIndex /*effIndex*/) + { + // Adjust effect summon position + WorldLocation summonPos = *GetExplTargetDest(); + Position offset = { 0.0f, 0.0f, 20.0f, 0.0f }; + summonPos.RelocateOffset(offset); + SetExplTargetDest(summonPos); + GetHitDest()->RelocateOffset(offset); + } + + void Register() + { + OnEffectHit += SpellEffectFn(spell_q13291_q13292_q13239_q13261_armored_decoy_summon_skytalon_SpellScript::ChangeSummonPos, EFFECT_0, SPELL_EFFECT_SUMMON); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_q13291_q13292_q13239_q13261_armored_decoy_summon_skytalon_SpellScript(); + } +}; + void AddSC_quest_spell_scripts() { new spell_q55_sacred_cleansing(); @@ -1599,4 +1678,6 @@ void AddSC_quest_spell_scripts() new spell_q11010_q11102_q11023_q11008_check_fly_mount(); new spell_q12372_azure_on_death_force_whisper(); new spell_q12527_zuldrak_rat(); + new spell_q13291_q13292_q13239_q13261_frostbrood_skytalon_grab_decoy(); + new spell_q13291_q13292_q13239_q13261_armored_decoy_summon_skytalon(); } |