/* * Originally written by Xinef - Copyright (C) 2016+ AzerothCore , 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" #include "ScriptedGossip.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, NPC_INQUISITOR_WHITEMANE = 3977, FACTION_FRIENDLY_TO_ALL = 35, DOOR_HIGH_INQUISITOR_ID = 104600, }; enum DataTypes { TYPE_MOGRAINE_AND_WHITE_EVENT = 1, DATA_MOGRAINE = 2, DATA_WHITEMANE = 3, DATA_DOOR_WHITEMANE = 4, DATA_HORSEMAN_EVENT = 5, GAMEOBJECT_PUMPKIN_SHRINE = 6, DATA_VORREL = 7, DATA_ARCANIST_DOAN = 8 }; class instance_scarlet_monastery : public InstanceMapScript { 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) override { if (player->HasAura(AURA_OF_ASHBRINGER)) { std::list 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::iterator itr = ScarletList.begin(); itr != ScarletList.end(); itr++) (*itr)->setFaction(FACTION_FRIENDLY_TO_ALL); } } void OnPlayerAreaUpdate(Player* player, uint32 /*oldArea*/, uint32 /*newArea*/) override { if (player->HasAura(AURA_OF_ASHBRINGER)) { std::list 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::iterator itr = ScarletList.begin(); itr != ScarletList.end(); itr++) (*itr)->setFaction(FACTION_FRIENDLY_TO_ALL); } } void OnGameObjectCreate(GameObject* go) override { switch (go->GetEntry()) { //case ENTRY_PUMPKIN_SHRINE: PumpkinShrineGUID = go->GetGUID(); break; case DOOR_HIGH_INQUISITOR_ID: DoorHighInquisitorGUID = go->GetGUID(); break; } } void OnCreatureCreate(Creature* creature) override { switch (creature->GetEntry()) { case NPC_COMMANDER_MOGRAINE: MograineGUID = creature->GetGUID(); break; case NPC_INQUISITOR_WHITEMANE: WhitemaneGUID = creature->GetGUID(); break; } } void SetData(uint32 type, uint32 data) override { switch(type) { case TYPE_MOGRAINE_AND_WHITE_EVENT: if (data == IN_PROGRESS) { DoUseDoorOrButton(DoorHighInquisitorGUID); encounter = IN_PROGRESS; } if (data == FAIL) { DoUseDoorOrButton(DoorHighInquisitorGUID); encounter = FAIL; } if (data == SPECIAL) encounter = SPECIAL; break; } } uint64 GetData64(uint32 type) const override { switch (type) { case DATA_MOGRAINE: return MograineGUID; case DATA_WHITEMANE: return WhitemaneGUID; case DATA_DOOR_WHITEMANE: return DoorHighInquisitorGUID; } return 0; } uint32 GetData(uint32 type) const override { if (type == TYPE_MOGRAINE_AND_WHITE_EVENT) return encounter; return 0; } private: uint64 DoorHighInquisitorGUID; uint64 MograineGUID; uint64 WhitemaneGUID; uint32 encounter; }; }; 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) { } void Reset() { 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); } }; enum MograineEvents { EVENT_SPELL_CRUSADER_STRIKE = 1, EVENT_SPELL_HAMMER_OF_JUSTICE = 2 }; enum WhitemaneEvents { EVENT_SPELL_HOLY_SMITE = 1, EVENT_SPELL_POWER_WORLD_SHIELD = 2, EVENT_SPELL_HEAL = 3 }; enum Spells { //Mograine Spells SPELL_CRUSADER_STRIKE = 14518, SPELL_HAMMER_OF_JUSTICE = 5589, SPELL_LAY_ON_HANDS = 9257, SPELL_RETRIBUTION_AURA = 8990, SPELL_PERMANENT_FEIGN_DEATH = 29266, //Whitemanes Spells SPELL_SCARLET_RESURRECTION = 9232, SPELL_DEEP_SLEEP = 9256, SPELL_DOMINATE_MIND = 14515, SPELL_HOLY_SMITE = 9481, SPELL_HEAL = 12039, SPELL_POWER_WORD_SHIELD = 22187 }; enum Says { //Mograine says SAY_MO_AGGRO = 0, SAY_MO_KILL = 1, SAY_MO_RESURRECTED = 2, //Whitemane says SAY_WH_INTRO = 0, SAY_WH_KILL = 1, SAY_WH_RESURRECT = 2, }; class npc_mograine : public CreatureScript { public: npc_mograine() : CreatureScript("npc_scarlet_commander_mograine") { } struct npc_mograineAI : public ScriptedAI { npc_mograineAI(Creature* creature) : ScriptedAI(creature) { instance = creature->GetInstanceScript(); } 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() override { //Incase wipe during phase that mograine fake death me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); me->RemoveAurasDueToSpell(SPELL_PERMANENT_FEIGN_DEATH); SayAshbringer = false; timer = 0; step = 1; hasDied = false; heal = false; fakeDeath = false; events.Reset(); } void MoveInLineOfSight(Unit* who) override { 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; } ScriptedAI::MoveInLineOfSight(who); } void EnterCombat(Unit* /*who*/) override { Talk(SAY_MO_AGGRO); me->CallForHelp(150.0f); me->CastSpell(me, SPELL_RETRIBUTION_AURA, true); events.ScheduleEvent(EVENT_SPELL_CRUSADER_STRIKE, urand(1000, 5000)); events.ScheduleEvent(EVENT_SPELL_HAMMER_OF_JUSTICE, urand(6000, 11000)); } void DamageTaken(Unit* /*doneBy*/, uint32& damage, DamageEffectType, SpellSchoolMask) override { if (damage < me->GetHealth() || hasDied || fakeDeath) return; //On first death, fake death and open door, as well as initiate whitemane if exist if (Unit* Whitemane = ObjectAccessor::GetUnit(*me, instance->GetData64(DATA_WHITEMANE))) { instance->SetData(TYPE_MOGRAINE_AND_WHITE_EVENT, IN_PROGRESS); Whitemane->GetMotionMaster()->MovePoint(1, 1163.113370f, 1398.856812f, 32.527786f); me->GetMotionMaster()->MovementExpired(); me->GetMotionMaster()->MoveIdle(); me->SetHealth(0); if (me->IsNonMeleeSpellCast(false)) me->InterruptNonMeleeSpells(false); me->ClearComboPointHolders(); me->RemoveAllAuras(); me->ClearAllReactives(); me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); me->CastSpell(me, SPELL_PERMANENT_FEIGN_DEATH, true); hasDied = true; fakeDeath = true; damage = 0; ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_WHITEMANE))->SetInCombatWithZone(); } } void KilledUnit(Unit* /*victim*/) override { Talk(SAY_MO_KILL); } void SpellHit(Unit* /*who*/, const SpellInfo* spell) override { //When hit with resurrection say text if (spell->Id == SPELL_SCARLET_RESURRECTION) { Talk(SAY_MO_RESURRECTED); fakeDeath = false; instance->SetData(TYPE_MOGRAINE_AND_WHITE_EVENT, SPECIAL); } } void UpdateAI(uint32 diff) override { timer = timer - diff; if (SayAshbringer && step < 15) { if (timer <= 0) { timer = AshbringerEvent(step); step++; } } if (!UpdateVictim()) return; if (hasDied && !heal && instance->GetData(TYPE_MOGRAINE_AND_WHITE_EVENT) == SPECIAL) { //On resurrection, stop fake death and heal whitemane and resume fight if (Unit* Whitemane = ObjectAccessor::GetUnit(*me, instance->GetData64(DATA_WHITEMANE))) { //Incase wipe during phase that mograine fake death me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); me->RemoveAurasDueToSpell(SPELL_PERMANENT_FEIGN_DEATH); me->CastSpell(me, SPELL_RETRIBUTION_AURA, true); me->CastSpell(Whitemane, SPELL_LAY_ON_HANDS, true); events.ScheduleEvent(EVENT_SPELL_CRUSADER_STRIKE, urand(1000, 5000)); events.ScheduleEvent(EVENT_SPELL_HAMMER_OF_JUSTICE, urand(6000, 11000)); if (me->GetVictim()) me->GetMotionMaster()->MoveChase(me->GetVictim()); heal = true; } } //This if-check to make sure mograine does not attack while fake death if (fakeDeath) return; events.Update(diff); if (me->HasUnitState(UNIT_STATE_CASTING)) return; while (uint32 eventId = events.ExecuteEvent()) { switch(eventId) { case EVENT_SPELL_CRUSADER_STRIKE: me->CastSpell(me->GetVictim(), SPELL_CRUSADER_STRIKE, true); events.ScheduleEvent(EVENT_SPELL_CRUSADER_STRIKE, 10000); break; case EVENT_SPELL_HAMMER_OF_JUSTICE: me->CastSpell(me->GetVictim(), SPELL_HAMMER_OF_JUSTICE, true); events.ScheduleEvent(EVENT_SPELL_HAMMER_OF_JUSTICE, 60000); break; } } DoMeleeAttackIfReady(); } private: bool SayAshbringer = false; int timer = 0; int step = 1; bool hasDied; bool heal; bool fakeDeath; EventMap events; InstanceScript* instance; }; CreatureAI* GetAI(Creature* creature) const { return new npc_mograineAI(creature); } }; class boss_high_inquisitor_whitemane : public CreatureScript { public: boss_high_inquisitor_whitemane() : CreatureScript("boss_high_inquisitor_whitemane") { } struct boss_high_inquisitor_whitemaneAI : public ScriptedAI { boss_high_inquisitor_whitemaneAI(Creature* creature) : ScriptedAI(creature) { instance = creature->GetInstanceScript(); } void Reset() override { canResurrectCheck = false; canResurrect = false; Wait_Timer = 7000; Heal_Timer = 10000; } void JustReachedHome() override { instance->SetData(TYPE_MOGRAINE_AND_WHITE_EVENT, FAIL); } void EnterCombat(Unit* /*who*/) override { Talk(SAY_WH_INTRO); events.ScheduleEvent(EVENT_SPELL_HOLY_SMITE, urand(1000, 3000)); events.ScheduleEvent(EVENT_SPELL_POWER_WORLD_SHIELD, 6000); events.ScheduleEvent(EVENT_SPELL_HEAL, 9000); } void DamageTaken(Unit* /*doneBy*/, uint32& damage, DamageEffectType, SpellSchoolMask) override { if (!canResurrectCheck && damage >= me->GetHealth()) damage = me->GetHealth() - 1; } void KilledUnit(Unit* /*victim*/) override { Talk(SAY_WH_KILL); } void UpdateAI(uint32 diff) override { if (!UpdateVictim()) return; if (canResurrect) { //When casting resuruction make sure to delay so on rez when reinstate battle deepsleep runs out if (Wait_Timer <= diff) { if (ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_MOGRAINE))) { DoCast(SPELL_SCARLET_RESURRECTION); Talk(SAY_WH_RESURRECT); canResurrect = false; } } else Wait_Timer -= diff; } //Cast Deep sleep when health is less than 50% if (!canResurrectCheck && !HealthAbovePct(50)) { if (me->IsNonMeleeSpellCast(false)) me->InterruptNonMeleeSpells(false); me->CastSpell(me->GetVictim(), SPELL_DEEP_SLEEP, true); canResurrectCheck = true; canResurrect = true; return; } //while in "resurrect-mode", don't do anything if (canResurrect) return; //If we are <75% hp cast healing spells at self or Mograine if (Heal_Timer <= diff) { Creature* target = NULL; if (!HealthAbovePct(75)) target = me; if (Creature* mograine = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_MOGRAINE))) { // checking canResurrectCheck prevents her healing Mograine while he is "faking death" if (canResurrectCheck && mograine->IsAlive() && !mograine->HealthAbovePct(75)) target = mograine; } if (target) me->CastSpell(target, SPELL_HEAL, true); Heal_Timer = 13000; } else Heal_Timer -= diff; events.Update(diff); if (me->HasUnitState(UNIT_STATE_CASTING)) return; while (uint32 eventId = events.ExecuteEvent()) { switch (eventId) { case EVENT_SPELL_POWER_WORLD_SHIELD: me->CastSpell(me, SPELL_POWER_WORD_SHIELD, true); events.ScheduleEvent(EVENT_SPELL_POWER_WORLD_SHIELD, 15000); break; case EVENT_SPELL_HOLY_SMITE: me->CastSpell(me->GetVictim(), SPELL_HOLY_SMITE, true); events.ScheduleEvent(EVENT_SPELL_HOLY_SMITE, 6000); break; case EVENT_SPELL_HEAL: me->CastSpell(me, SPELL_HEAL, true); break; } } DoMeleeAttackIfReady(); } private: InstanceScript* instance; uint32 Heal_Timer; uint32 Wait_Timer; bool canResurrectCheck; bool canResurrect; EventMap events; }; CreatureAI* GetAI(Creature* creature) const { return new boss_high_inquisitor_whitemaneAI(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(); new boss_high_inquisitor_whitemane(); }