diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/server/scripts/Spells/spell_generic.cpp | 92 |
1 files changed, 92 insertions, 0 deletions
diff --git a/src/server/scripts/Spells/spell_generic.cpp b/src/server/scripts/Spells/spell_generic.cpp index 71724805fd8..338f7f0519f 100644 --- a/src/server/scripts/Spells/spell_generic.cpp +++ b/src/server/scripts/Spells/spell_generic.cpp @@ -4023,6 +4023,96 @@ class spell_gen_impatient_mind : public AuraScript } }; +enum DefenderOfAzerothData +{ + SPELL_DEATH_GATE_TELEPORT_STORMWIND = 316999, + SPELL_DEATH_GATE_TELEPORT_ORGRIMMAR = 317000, + + QUEST_DEFENDER_OF_AZEROTH_ALLIANCE = 58902, + QUEST_DEFENDER_OF_AZEROTH_HORDE = 58903, + + NPC_NAZGRIM = 161706, + NPC_TROLLBANE = 161707, + NPC_WHITEMANE = 161708, + NPC_MOGRAINE = 161709, +}; + +struct BindLocation +{ + BindLocation(uint32 mapId, float x, float y, float z, float o, uint32 areaId) + : Loc(mapId, x, y, z, o), AreaId(areaId) { } + WorldLocation Loc; + uint32 AreaId; +}; + +BindLocation const StormwindInnLoc(0, -8868.1f, 675.82f, 97.9f, 5.164778709411621093f, 5148); +BindLocation const OrgrimmarInnLoc(1, 1573.18f, -4441.62f, 16.06f, 1.818284034729003906f, 8618); + +class spell_defender_of_azeroth_death_gate_selector : public SpellScript +{ + PrepareSpellScript(spell_defender_of_azeroth_death_gate_selector); + + bool Validate(SpellInfo const* /*spell*/) override + { + return ValidateSpellInfo( + { + SPELL_DEATH_GATE_TELEPORT_STORMWIND, + SPELL_DEATH_GATE_TELEPORT_ORGRIMMAR + }); + } + + void HandleDummy(SpellEffIndex /*effIndex*/) + { + Player* player = GetHitUnit()->ToPlayer(); + if (!player) + return; + + if (player->GetQuestStatus(QUEST_DEFENDER_OF_AZEROTH_ALLIANCE) == QUEST_STATUS_NONE && player->GetQuestStatus(QUEST_DEFENDER_OF_AZEROTH_HORDE) == QUEST_STATUS_NONE) + return; + + BindLocation bindLoc = player->GetTeam() == ALLIANCE ? StormwindInnLoc : OrgrimmarInnLoc; + player->SetHomebind(bindLoc.Loc, bindLoc.AreaId); + player->SendBindPointUpdate(); + player->SendPlayerBound(player->GetGUID(), bindLoc.AreaId); + + player->CastSpell(player, player->GetTeam() == ALLIANCE ? SPELL_DEATH_GATE_TELEPORT_STORMWIND : SPELL_DEATH_GATE_TELEPORT_ORGRIMMAR); + } + + void Register() override + { + OnEffectHitTarget += SpellEffectFn(spell_defender_of_azeroth_death_gate_selector::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); + } +}; + +class spell_defender_of_azeroth_speak_with_mograine : public SpellScript +{ + PrepareSpellScript(spell_defender_of_azeroth_speak_with_mograine); + + void HandleDummy(SpellEffIndex /*effIndex*/) + { + if (!GetCaster()) + return; + + Player* player = GetCaster()->ToPlayer(); + if (!player) + return; + + if (Creature* nazgrim = GetHitUnit()->FindNearestCreature(NPC_NAZGRIM, 10.0f)) + nazgrim->HandleEmoteCommand(EMOTE_ONESHOT_POINT, player); + if (Creature* trollbane = GetHitUnit()->FindNearestCreature(NPC_TROLLBANE, 10.0f)) + trollbane->HandleEmoteCommand(EMOTE_ONESHOT_POINT, player); + if (Creature* whitemane = GetHitUnit()->FindNearestCreature(NPC_WHITEMANE, 10.0f)) + whitemane->HandleEmoteCommand(EMOTE_ONESHOT_POINT, player); + + // @TODO: spawntracking - show death gate for casting player + } + + void Register() override + { + OnEffectHitTarget += SpellEffectFn(spell_defender_of_azeroth_speak_with_mograine::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); + } +}; + void AddSC_generic_spell_scripts() { RegisterAuraScript(spell_gen_absorb0_hitlimit1); @@ -4142,4 +4232,6 @@ void AddSC_generic_spell_scripts() RegisterSpellScript(spell_gen_azgalor_rain_of_fire_hellfire_citadel); RegisterAuraScript(spell_gen_face_rage); RegisterAuraScript(spell_gen_impatient_mind); + RegisterSpellScript(spell_defender_of_azeroth_death_gate_selector); + RegisterSpellScript(spell_defender_of_azeroth_speak_with_mograine); } |