diff options
Diffstat (limited to 'src/scripts')
-rw-r--r-- | src/scripts/EasternKingdoms/ScarletMonastery/instance_scarlet_monastery.cpp | 401 |
1 files changed, 394 insertions, 7 deletions
diff --git a/src/scripts/EasternKingdoms/ScarletMonastery/instance_scarlet_monastery.cpp b/src/scripts/EasternKingdoms/ScarletMonastery/instance_scarlet_monastery.cpp index d515111987..98fda0fc43 100644 --- a/src/scripts/EasternKingdoms/ScarletMonastery/instance_scarlet_monastery.cpp +++ b/src/scripts/EasternKingdoms/ScarletMonastery/instance_scarlet_monastery.cpp @@ -1,27 +1,414 @@ /* * Originally written by Xinef - Copyright (C) 2016+ AzerothCore <www.azerothcore.org>, released under GNU AGPL v3 license: http://github.com/azerothcore/azerothcore-wotlk/LICENSE-AGPL + +REWRITTEN BY XINEF */ #include "ScriptMgr.h" #include "ScriptedCreature.h" +#include "SmartAI.h" + +enum AshbringerEventMisc +{ + AURA_OF_ASHBRINGER = 28282, + NPC_SCARLET_MYRIDON = 4295, + NPC_SCARLET_DEFENDER = 4298, + NPC_SCARLET_CENTURION = 4301, + NPC_SCARLET_SORCERER = 4294, + NPC_SCARLET_WIZARD = 4300, + NPC_SCARLET_ABBOT = 4303, + NPC_SCARLET_MONK = 4540, + NPC_SCARLET_CHAMPION = 4302, + NPC_SCARLET_CHAPLAIN = 4299, + NPC_FAIRBANKS = 4542, + NPC_COMMANDER_MOGRAINE = 3976, + FACTION_FRIENDLY_TO_ALL = 35, +}; class instance_scarlet_monastery : public InstanceMapScript { - public: - instance_scarlet_monastery() : InstanceMapScript("instance_scarlet_monastery", 189) { } +public: + instance_scarlet_monastery() : InstanceMapScript("instance_scarlet_monastery", 189) { } + + InstanceScript* GetInstanceScript(InstanceMap* map) const + { + return new instance_scarlet_monastery_InstanceMapScript(map); + } + + struct instance_scarlet_monastery_InstanceMapScript : public InstanceScript + { + instance_scarlet_monastery_InstanceMapScript(Map* map) : InstanceScript(map) {} + + void OnPlayerEnter(Player* player) + { + if (player->HasAura(AURA_OF_ASHBRINGER)) + { + std::list<Creature*> ScarletList; + player->GetCreatureListWithEntryInGrid(ScarletList, NPC_SCARLET_MYRIDON, 4000.0f); + player->GetCreatureListWithEntryInGrid(ScarletList, NPC_SCARLET_DEFENDER, 4000.0f); + player->GetCreatureListWithEntryInGrid(ScarletList, NPC_SCARLET_CENTURION, 4000.0f); + player->GetCreatureListWithEntryInGrid(ScarletList, NPC_SCARLET_SORCERER, 4000.0f); + player->GetCreatureListWithEntryInGrid(ScarletList, NPC_SCARLET_WIZARD, 4000.0f); + player->GetCreatureListWithEntryInGrid(ScarletList, NPC_SCARLET_ABBOT, 4000.0f); + player->GetCreatureListWithEntryInGrid(ScarletList, NPC_SCARLET_MONK, 4000.0f); + player->GetCreatureListWithEntryInGrid(ScarletList, NPC_SCARLET_CHAMPION, 4000.0f); + player->GetCreatureListWithEntryInGrid(ScarletList, NPC_SCARLET_CHAPLAIN, 4000.0f); + player->GetCreatureListWithEntryInGrid(ScarletList, NPC_COMMANDER_MOGRAINE, 4000.0f); + player->GetCreatureListWithEntryInGrid(ScarletList, NPC_FAIRBANKS, 4000.0f); + if (!ScarletList.empty()) + for (std::list<Creature*>::iterator itr = ScarletList.begin(); itr != ScarletList.end(); itr++) + (*itr)->setFaction(FACTION_FRIENDLY_TO_ALL); + } + } - InstanceScript* GetInstanceScript(InstanceMap* map) const + void OnPlayerAreaUpdate(Player* player, uint32 /*oldArea*/, uint32 /*newArea*/) { - return new instance_scarlet_monastery_InstanceMapScript(map); + if (player->HasAura(AURA_OF_ASHBRINGER)) + { + std::list<Creature*> ScarletList; + player->GetCreatureListWithEntryInGrid(ScarletList, NPC_SCARLET_MYRIDON, 4000.0f); + player->GetCreatureListWithEntryInGrid(ScarletList, NPC_SCARLET_DEFENDER, 4000.0f); + player->GetCreatureListWithEntryInGrid(ScarletList, NPC_SCARLET_CENTURION, 4000.0f); + player->GetCreatureListWithEntryInGrid(ScarletList, NPC_SCARLET_SORCERER, 4000.0f); + player->GetCreatureListWithEntryInGrid(ScarletList, NPC_SCARLET_WIZARD, 4000.0f); + player->GetCreatureListWithEntryInGrid(ScarletList, NPC_SCARLET_ABBOT, 4000.0f); + player->GetCreatureListWithEntryInGrid(ScarletList, NPC_SCARLET_MONK, 4000.0f); + player->GetCreatureListWithEntryInGrid(ScarletList, NPC_SCARLET_CHAMPION, 4000.0f); + player->GetCreatureListWithEntryInGrid(ScarletList, NPC_SCARLET_CHAPLAIN, 4000.0f); + player->GetCreatureListWithEntryInGrid(ScarletList, NPC_COMMANDER_MOGRAINE, 4000.0f); + player->GetCreatureListWithEntryInGrid(ScarletList, NPC_FAIRBANKS, 4000.0f); + if (!ScarletList.empty()) + for (std::list<Creature*>::iterator itr = ScarletList.begin(); itr != ScarletList.end(); itr++) + (*itr)->setFaction(FACTION_FRIENDLY_TO_ALL); + } } + }; +}; + +enum ScarletMonasteryTrashMisc +{ + SAY_WELCOME = 0, + AURA_ASHBRINGER = 28282, + //FACTION_FRIENDLY_TO_ALL = 35, + NPC_HIGHLORD_MOGRAINE = 16440, + SPELL_COSMETIC_CHAIN = 45537, + SPELL_COSMETIC_EXPLODE = 45935, + SPELL_FORGIVENESS = 28697, +}; + +class npc_scarlet_guard : public CreatureScript +{ +public: + npc_scarlet_guard() : CreatureScript("npc_scarlet_guard") { } + + struct npc_scarlet_guardAI : public SmartAI + { + npc_scarlet_guardAI(Creature* creature) : SmartAI(creature) { } - struct instance_scarlet_monastery_InstanceMapScript : public InstanceScript + void Reset() { - instance_scarlet_monastery_InstanceMapScript(Map* map) : InstanceScript(map) {} - }; + SayAshbringer = false; + } + + void MoveInLineOfSight(Unit* who) + { + if (who && who->GetDistance2d(me) < 12.0f) + { + if (Player* player = who->ToPlayer()) + { + if (player->HasAura(AURA_ASHBRINGER) && !SayAshbringer) + { + Talk(SAY_WELCOME); + me->setFaction(FACTION_FRIENDLY_TO_ALL); + me->SetSheath(SHEATH_STATE_UNARMED); + me->SetFacingToObject(player); + me->SetStandState(UNIT_STAND_STATE_KNEEL); + me->AddAura(SPELL_AURA_MOD_ROOT, me); + me->CastSpell(me, SPELL_AURA_MOD_ROOT, true); + SayAshbringer = true; + } + } + } + + SmartAI::MoveInLineOfSight(who); + } + private: + bool SayAshbringer = false; + }; + + CreatureAI* GetAI(Creature* creature) const + { + return new npc_scarlet_guardAI(creature); + } +}; + +class npc_mograine : public CreatureScript +{ +public: + npc_mograine() : CreatureScript("npc_scarlet_commander_mograine") { } + + struct npc_mograineAI : public SmartAI + { + npc_mograineAI(Creature* creature) : SmartAI(creature) { } + + uint32 AshbringerEvent(uint32 uiSteps) + { + Creature* mograine = me->FindNearestCreature(NPC_HIGHLORD_MOGRAINE, 200.0f); + + switch (uiSteps) + { + case 1: + me->GetMotionMaster()->MovePoint(0, 1152.039795f, 1398.405518f, 32.527878f); + return 2 * IN_MILLISECONDS; + case 2: + me->SetSheath(SHEATH_STATE_UNARMED); + me->SetStandState(UNIT_STAND_STATE_KNEEL); + return 2 * IN_MILLISECONDS; + case 3: + Talk(3); + return 10 * IN_MILLISECONDS; + case 4: + me->SummonCreature(NPC_HIGHLORD_MOGRAINE, 1065.130737f, 1399.350586f, 30.763723f, 6.282961f, TEMPSUMMON_TIMED_DESPAWN, 400000)->SetName("Highlord Mograine"); + me->FindNearestCreature(NPC_HIGHLORD_MOGRAINE, 200.0f)->setFaction(FACTION_FRIENDLY_TO_ALL); + return 30 * IN_MILLISECONDS; + case 5: + mograine->StopMovingOnCurrentPos(); + mograine->AI()->Talk(0); + mograine->HandleEmoteCommand(EMOTE_ONESHOT_POINT); + return 4 * IN_MILLISECONDS; + case 6: + me->SetStandState(UNIT_STAND_STATE_STAND); + return 2 * IN_MILLISECONDS; + case 7: + Talk(4); + return 4 * IN_MILLISECONDS; + case 8: + mograine->AI()->Talk(1); + return 11 * IN_MILLISECONDS; + case 9: + mograine->HandleEmoteCommand(EMOTE_ONESHOT_BATTLE_ROAR); + return 4 * IN_MILLISECONDS; + case 10: + me->SetSheath(SHEATH_STATE_UNARMED); + me->SetStandState(UNIT_STAND_STATE_KNEEL); + Talk(5); + return 2 * IN_MILLISECONDS; + case 11: + mograine->CastSpell(me, SPELL_FORGIVENESS, false); + return 1 * IN_MILLISECONDS; + case 12: + mograine->CastSpell(me, SPELL_COSMETIC_CHAIN, true); + return 0.5 * IN_MILLISECONDS; + case 13: + mograine->AI()->Talk(2); + mograine->DespawnOrUnsummon(3 * IN_MILLISECONDS); + mograine->Kill(me, me, true); + return 0; + default: + if(mograine) + mograine->DespawnOrUnsummon(0); + return 0; + } + } + + void Reset() + { + SayAshbringer = false; + timer = 0; + step = 1; + } + + void MoveInLineOfSight(Unit* who) + { + if (who && who->GetDistance2d(me) < 15.0f) + if (Player* player = who->ToPlayer()) + if (player->HasAura(AURA_ASHBRINGER) && !SayAshbringer) + { + me->setFaction(FACTION_FRIENDLY_TO_ALL); + me->SetSheath(SHEATH_STATE_UNARMED); + me->SetStandState(UNIT_STAND_STATE_KNEEL); + me->SetFacingToObject(player); + me->MonsterYell("Bow down! Kneel before the Ashbringer! A new dawn approaches, brothers and sisters! Our message will be delivered to the filth of this world through the chosen one!", LANG_UNIVERSAL, player); + SayAshbringer = true; + } + + SmartAI::MoveInLineOfSight(who); + } + + void UpdateAI(uint32 diff) + { + timer = timer - diff; + if (SayAshbringer && step < 15) + { + if (timer <= 0) + { + timer = AshbringerEvent(step); + step++; + } + } + + if (!UpdateVictim()) + return; + + DoMeleeAttackIfReady(); + } + + private: + bool SayAshbringer = false; + int timer = 0; + int step = 1; + }; + + CreatureAI* GetAI(Creature* creature) const + { + return new npc_mograineAI(creature); + } +}; +class npc_fairbanks : public CreatureScript +{ +public: + npc_fairbanks() : CreatureScript("npc_fairbanks") { } + + bool OnGossipHello(Player* plr, Creature* npc) + { + plr->ADD_GOSSIP_ITEM(0, "Curse? What's going on here, Fairbanks?", GOSSIP_SENDER_MAIN, 1); + plr->SEND_GOSSIP_MENU(100100, npc->GetGUID()); + return true; + } + + bool OnGossipSelect(Player* plr, Creature* npc, uint32 Sender, uint32 uiAction) + { + plr->PlayerTalkClass->ClearMenus(); + + switch (uiAction) + { + case 1: + npc->HandleEmoteCommand(1); + plr->ADD_GOSSIP_ITEM(0, "Mograine?", GOSSIP_SENDER_MAIN, 2); + plr->SEND_GOSSIP_MENU(100101, npc->GetGUID()); + return true; + case 2: + npc->HandleEmoteCommand(1); + plr->ADD_GOSSIP_ITEM(0, "What do you mean?", GOSSIP_SENDER_MAIN, 3); + plr->SEND_GOSSIP_MENU(100102, npc->GetGUID()); + return true; + case 3: + npc->HandleEmoteCommand(1); + plr->ADD_GOSSIP_ITEM(0, "I still do not fully understand.", GOSSIP_SENDER_MAIN, 4); + plr->SEND_GOSSIP_MENU(100103, npc->GetGUID()); + return true; + case 4: + npc->HandleEmoteCommand(1); + plr->ADD_GOSSIP_ITEM(0, "Incredible story. So how did he die?", GOSSIP_SENDER_MAIN, 5); + plr->SEND_GOSSIP_MENU(100104, npc->GetGUID()); + return true; + case 5: + npc->HandleEmoteCommand(1); + plr->ADD_GOSSIP_ITEM(0, "You mean...", GOSSIP_SENDER_MAIN, 6); + plr->SEND_GOSSIP_MENU(100105, npc->GetGUID()); + return true; + case 6: + npc->HandleEmoteCommand(1); + plr->ADD_GOSSIP_ITEM(0, "How do you know all of this?", GOSSIP_SENDER_MAIN, 7); + plr->SEND_GOSSIP_MENU(100106, npc->GetGUID()); + return true; + case 7: + npc->HandleEmoteCommand(1); + plr->ADD_GOSSIP_ITEM(0, "A thousand? For one man?", GOSSIP_SENDER_MAIN, 8); + plr->SEND_GOSSIP_MENU(100107, npc->GetGUID()); + return true; + case 8: + npc->HandleEmoteCommand(5); + plr->ADD_GOSSIP_ITEM(0, "Yet? Yet what?", GOSSIP_SENDER_MAIN, 9); + plr->SEND_GOSSIP_MENU(100108, npc->GetGUID()); + return true; + case 9: + npc->HandleEmoteCommand(1); + plr->ADD_GOSSIP_ITEM(0, "And did he?", GOSSIP_SENDER_MAIN, 10); + plr->SEND_GOSSIP_MENU(100109, npc->GetGUID()); + return true; + case 10: + npc->HandleEmoteCommand(274); + plr->ADD_GOSSIP_ITEM(0, "Continue please, Fairbanks.", GOSSIP_SENDER_MAIN, 11); + plr->SEND_GOSSIP_MENU(100110, npc->GetGUID()); + return true; + case 11: + npc->HandleEmoteCommand(1); + plr->ADD_GOSSIP_ITEM(0, "You mean...", GOSSIP_SENDER_MAIN, 12); + plr->SEND_GOSSIP_MENU(100111, npc->GetGUID()); + return true; + case 12: + npc->HandleEmoteCommand(1); + plr->ADD_GOSSIP_ITEM(0, "You were right, Fairbanks. That is tragic.", GOSSIP_SENDER_MAIN, 13); + plr->SEND_GOSSIP_MENU(100112, npc->GetGUID()); + return true; + case 13: + npc->HandleEmoteCommand(1); + plr->ADD_GOSSIP_ITEM(0, "And you did...", GOSSIP_SENDER_MAIN, 14); + plr->SEND_GOSSIP_MENU(100113, npc->GetGUID()); + return true; + case 14: + npc->HandleEmoteCommand(1); + plr->ADD_GOSSIP_ITEM(0, "You tell an incredible tale, Fairbanks. What of the blade? Is it beyond redemption?", GOSSIP_SENDER_MAIN, 15); + plr->SEND_GOSSIP_MENU(100114, npc->GetGUID()); + return true; + case 15: + npc->HandleEmoteCommand(1); + plr->ADD_GOSSIP_ITEM(0, "But his son is dead.", GOSSIP_SENDER_MAIN, 16); + plr->SEND_GOSSIP_MENU(100115, npc->GetGUID()); + return true; + case 16: + plr->SEND_GOSSIP_MENU(100116, npc->GetGUID()); + // todo: we need to play these 3 emote in sequence, we play only the last one right now. + npc->HandleEmoteCommand(274); + npc->HandleEmoteCommand(1); + npc->HandleEmoteCommand(397); + return true; + } + + return true; + } + + struct npc_fairbanksAI : public SmartAI + { + npc_fairbanksAI(Creature* creature) : SmartAI(creature) { } + + void Reset() + { + SayAshbringer = false; + } + + void MoveInLineOfSight(Unit* who) + { + if (who && who->GetDistance2d(me) < 2.0f) + if (Player* player = who->ToPlayer()) + if (player->HasAura(AURA_ASHBRINGER) && !SayAshbringer) + { + me->setFaction(FACTION_FRIENDLY_TO_ALL); + me->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP); + me->SetSheath(SHEATH_STATE_UNARMED); + me->CastSpell(me, 57767, true); + me->SetDisplayId(16179); + me->SetFacingToObject(player); + SayAshbringer = true; + } + + SmartAI::MoveInLineOfSight(who); + } + private: + bool SayAshbringer = false; + }; + + CreatureAI* GetAI(Creature* creature) const + { + return new npc_fairbanksAI(creature); + } }; void AddSC_instance_scarlet_monastery() { new instance_scarlet_monastery(); + new npc_scarlet_guard(); + new npc_fairbanks(); + new npc_mograine(); } |