diff options
author | Gustavo <sirikfoll@hotmail.com> | 2016-08-25 03:31:48 -0300 |
---|---|---|
committer | Aokromes <Aokromes@users.noreply.github.com> | 2016-08-25 08:31:48 +0200 |
commit | 989aaaa8b5284bc707c94c62e6c50e9df3cbfc84 (patch) | |
tree | 3bae0b3aefa134430af427d54f916e7e848af2a2 /src | |
parent | 0d2ef2ac7155cedead2c7a7cafcd937a4e1dcd99 (diff) |
Scripts/Pet Implemented Argent Squire/Gruntling and Argent Pony Bridle
Diffstat (limited to 'src')
-rw-r--r-- | src/server/scripts/Spells/spell_generic.cpp | 47 | ||||
-rw-r--r-- | src/server/scripts/World/npcs_special.cpp | 159 |
2 files changed, 206 insertions, 0 deletions
diff --git a/src/server/scripts/Spells/spell_generic.cpp b/src/server/scripts/Spells/spell_generic.cpp index e8ad73ceadb..168284b31bc 100644 --- a/src/server/scripts/Spells/spell_generic.cpp +++ b/src/server/scripts/Spells/spell_generic.cpp @@ -4244,6 +4244,52 @@ class spell_gen_clear_debuffs : public SpellScriptLoader } }; +enum PonySpells +{ + ACHIEV_PONY_UP = 3736, + MOUNT_PONY = 29736 +}; + +class spell_gen_pony_mount_check : public SpellScriptLoader +{ + public: + spell_gen_pony_mount_check() : SpellScriptLoader("spell_gen_pony_mount_check") { } + + class spell_gen_pony_mount_check_AuraScript : public AuraScript + { + PrepareAuraScript(spell_gen_pony_mount_check_AuraScript); + + void HandleEffectPeriodic(AuraEffect const* /*aurEff*/) + { + Unit* caster = GetCaster(); + Player* owner = caster->GetOwner()->ToPlayer(); + if (!caster || !owner || !owner->HasAchieved(ACHIEV_PONY_UP)) + return; + + if (owner->IsMounted()) + { + caster->Mount(MOUNT_PONY); + caster->SetSpeedRate(MOVE_RUN, owner->GetSpeedRate(MOVE_RUN)); + } + else if (caster->IsMounted()) + { + caster->Dismount(); + caster->SetSpeedRate(MOVE_RUN, owner->GetSpeedRate(MOVE_RUN)); + } + } + + void Register() override + { + OnEffectPeriodic += AuraEffectPeriodicFn(spell_gen_pony_mount_check_AuraScript::HandleEffectPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY); + } + }; + + AuraScript* GetAuraScript() const + { + return new spell_gen_pony_mount_check_AuraScript(); + } +}; + void AddSC_generic_spell_scripts() { new spell_gen_absorb0_hitlimit1(); @@ -4332,4 +4378,5 @@ void AddSC_generic_spell_scripts() new spell_gen_mixology_bonus(); new spell_gen_landmine_knockback_achievement(); new spell_gen_clear_debuffs(); + new spell_gen_pony_mount_check(); } diff --git a/src/server/scripts/World/npcs_special.cpp b/src/server/scripts/World/npcs_special.cpp index c33d74d0faa..eed92818e83 100644 --- a/src/server/scripts/World/npcs_special.cpp +++ b/src/server/scripts/World/npcs_special.cpp @@ -2528,6 +2528,164 @@ class npc_train_wrecker : public CreatureScript } }; +/*###### +## npc_argent_squire/gruntling +######*/ + +enum Pennants +{ + SPELL_DARNASSUS_PENNANT = 63443, + SPELL_EXODAR_PENNANT = 63439, + SPELL_GNOMEREGAN_PENNANT = 63442, + SPELL_IRONFORGE_PENNANT = 63440, + SPELL_STORMWIND_PENNANT = 62727, + SPELL_SENJIN_PENNANT = 63446, + SPELL_UNDERCITY_PENNANT = 63441, + SPELL_ORGRIMMAR_PENNANT = 63444, + SPELL_SILVERMOON_PENNANT = 63438, + SPELL_THUNDERBLUFF_PENNANT = 63445, + SPELL_AURA_POSTMAN_S = 67376, + SPELL_AURA_SHOP_S = 67377, + SPELL_AURA_BANK_S = 67368, + SPELL_AURA_TIRED_S = 67401, + SPELL_AURA_BANK_G = 68849, + SPELL_AURA_POSTMAN_G = 68850, + SPELL_AURA_SHOP_G = 68851, + SPELL_AURA_TIRED_G = 68852, + SPELL_TIRED_PLAYER = 67334 +}; + +enum ArgentPetGossipOptions +{ + GOSSIP_OPTION_BANK = 0, + GOSSIP_OPTION_SHOP = 1, + GOSSIP_OPTION_MAIL = 2, + GOSSIP_OPTION_DARNASSUS_SENJIN_PENNANT = 3, + GOSSIP_OPTION_EXODAR_UNDERCITY_PENNANT = 4, + GOSSIP_OPTION_GNOMEREGAN_ORGRIMMAR_PENNANT = 5, + GOSSIP_OPTION_IRONFORGE_SILVERMOON_PENNANT = 6, + GOSSIP_OPTION_STORMWIND_THUNDERBLUFF_PENNANT = 7 +}; + +enum Misc +{ + NPC_ARGENT_SQUIRE = 33238 +}; + +struct ArgentPonyBannerSpells +{ + uint32 spellSquire; + uint32 spellGruntling; +}; + +ArgentPonyBannerSpells const bannerSpells[5] = +{ + { SPELL_DARNASSUS_PENNANT, SPELL_SENJIN_PENNANT }, + { SPELL_EXODAR_PENNANT, SPELL_UNDERCITY_PENNANT }, + { SPELL_GNOMEREGAN_PENNANT, SPELL_ORGRIMMAR_PENNANT }, + { SPELL_IRONFORGE_PENNANT, SPELL_SILVERMOON_PENNANT }, + { SPELL_STORMWIND_PENNANT, SPELL_THUNDERBLUFF_PENNANT } +}; + +class npc_argent_squire_gruntling : public CreatureScript +{ +public: + npc_argent_squire_gruntling() : CreatureScript("npc_argent_squire_gruntling") { } + + struct npc_argent_squire_gruntlingAI : public ScriptedAI + { + npc_argent_squire_gruntlingAI(Creature* creature) : ScriptedAI(creature) + { + ScheduleTasks(); + } + + void ScheduleTasks() + { + _scheduler + .Schedule(Seconds(1), [this](TaskContext /*context*/) + { + if (Aura* ownerTired = me->GetOwner()->GetAura(SPELL_TIRED_PLAYER)) + if (Aura* squireTired = me->AddAura(IsArgentSquire() ? SPELL_AURA_TIRED_S : SPELL_AURA_TIRED_G, me)) + squireTired->SetDuration(ownerTired->GetDuration()); + }) + .Schedule(Seconds(1), [this](TaskContext context) + { + if ((me->HasAura(SPELL_AURA_TIRED_S) || me->HasAura(SPELL_AURA_TIRED_G)) && me->HasFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_BANKER | UNIT_NPC_FLAG_MAILBOX | UNIT_NPC_FLAG_VENDOR)) + me->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_BANKER | UNIT_NPC_FLAG_MAILBOX | UNIT_NPC_FLAG_VENDOR); + context.Repeat(); + }); + } + + void sGossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override + { + switch (gossipListId) + { + case GOSSIP_OPTION_BANK: + { + me->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_BANKER); + uint32 _bankAura = IsArgentSquire() ? SPELL_AURA_BANK_S : SPELL_AURA_BANK_G; + if (!me->HasAura(_bankAura)) + DoCastSelf(_bankAura); + + if (!player->HasAura(SPELL_TIRED_PLAYER)) + player->CastSpell(player, SPELL_TIRED_PLAYER, true); + break; + } + case GOSSIP_OPTION_SHOP: + { + me->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_VENDOR); + uint32 _shopAura = IsArgentSquire() ? SPELL_AURA_SHOP_S : SPELL_AURA_SHOP_G; + if (!me->HasAura(_shopAura)) + DoCastSelf(_shopAura); + + if (!player->HasAura(SPELL_TIRED_PLAYER)) + player->CastSpell(player, SPELL_TIRED_PLAYER, true); + break; + } + case GOSSIP_OPTION_MAIL: + { + me->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_MAILBOX); + player->GetSession()->SendShowMailBox(me->GetGUID()); + + uint32 _mailAura = IsArgentSquire() ? SPELL_AURA_POSTMAN_S : SPELL_AURA_POSTMAN_G; + if (!me->HasAura(_mailAura)) + DoCastSelf(_mailAura); + + if (!player->HasAura(SPELL_TIRED_PLAYER)) + player->CastSpell(player, SPELL_TIRED_PLAYER, true); + break; + } + case GOSSIP_OPTION_DARNASSUS_SENJIN_PENNANT: + case GOSSIP_OPTION_EXODAR_UNDERCITY_PENNANT: + case GOSSIP_OPTION_GNOMEREGAN_ORGRIMMAR_PENNANT: + case GOSSIP_OPTION_IRONFORGE_SILVERMOON_PENNANT: + case GOSSIP_OPTION_STORMWIND_THUNDERBLUFF_PENNANT: + if (IsArgentSquire()) + DoCastSelf(bannerSpells[gossipListId - 3].spellSquire, true); + else + DoCastSelf(bannerSpells[gossipListId - 3].spellGruntling, true); + break; + } + player->PlayerTalkClass->SendCloseGossip(); + } + + void UpdateAI(uint32 diff) override + { + _scheduler.Update(diff); + } + + bool IsArgentSquire() const { return me->GetEntry() == NPC_ARGENT_SQUIRE; } + + private: + TaskScheduler _scheduler; + }; + + CreatureAI* GetAI(Creature *creature) const override + { + return new npc_argent_squire_gruntlingAI(creature); + } +}; + void AddSC_npcs_special() { new npc_air_force_bots(); @@ -2553,4 +2711,5 @@ void AddSC_npcs_special() new npc_imp_in_a_ball(); new npc_stable_master(); new npc_train_wrecker(); + new npc_argent_squire_gruntling(); } |