void UpdateAI(uint32 diff) override
        {
            if (Repair_Timer <= diff)
            {
                if (instance->GetBossState(DATA_MEKGINEER_STEAMRIGGER) == IN_PROGRESS)
                {
                    if (Creature* mekgineer = instance->GetCreature(DATA_MEKGINEER_STEAMRIGGER))
                    {
                        if (me->IsWithinDistInMap(mekgineer, MAX_REPAIR_RANGE))
                        {
                            //are we already channeling? Doesn't work very well, find better check?
                            if (!me->GetUInt32Value(UNIT_CHANNEL_SPELL))
                            {
                                //me->GetMotionMaster()->MovementExpired();
                                //me->GetMotionMaster()->MoveIdle();

                                DoCast(me, SPELL_REPAIR, true);
                            }
                            Repair_Timer = 5000;
                        }
                        else
                        {
                            //me->GetMotionMaster()->MovementExpired();
                            //me->GetMotionMaster()->MoveFollow(pMekgineer, 0, 0);
                        }
                    }
                } else Repair_Timer = 5000;
            } else Repair_Timer -= diff;

            if (!UpdateVictim())
                return;

            DoMeleeAttackIfReady();
        }
            void UpdateAI(const uint32 diff)
            {
                if (pInstance->GetBossState(DATA_BETHTILAC) != IN_PROGRESS)
                    me->DespawnOrUnsummon();

                if (!UpdateVictim())
                    return;

                events.Update(diff);

                if (me->HasUnitState(UNIT_STATE_CASTING))
                    return;

                while (uint32 eventId = events.ExecuteEvent())
                {
                    switch (eventId)
                    {
                        case EVENT_BURNING_ACID:
                            DoCastAOE(SPELL_BURNING_ACID);
                            events.ScheduleEvent(EVENT_BURNING_ACID, urand(7000, 15000));
                            break;
                        case EVENT_FIERY_WEB_SPIN:
                            if (Unit* pTarget = SelectTarget(SELECT_TARGET_RANDOM, 0, PositionSelector(true, SPELL_FIERY_WEB_SPIN)))
                                DoCast(pTarget, SPELL_FIERY_WEB_SPIN);
                            events.ScheduleEvent(EVENT_FIERY_WEB_SPIN, urand(25000, 30000));
                            break;
                    }
                }

                DoMeleeAttackIfReady();
            }
    bool GossipHello_keeper_norgannon(Player* pPlayer, Creature* pCreature)
    {
        InstanceScript *pInstance = pCreature->GetInstanceScript();
        
        if (pInstance && pPlayer)
            if (pInstance->GetBossState(BOSS_LEVIATHAN) != DONE)
                if (pInstance->GetBossState(BOSS_LEVIATHAN) != SPECIAL)
                {
                    pPlayer->PrepareQuestMenu(pCreature->GetGUID());
                    pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT,GOSSIP_ITEM_1,GOSSIP_SENDER_MAIN,GOSSIP_ACTION_INFO_DEF);
                    pPlayer->SEND_GOSSIP_MENU(13910, pCreature->GetGUID());
                }
        else pPlayer->SEND_GOSSIP_MENU(1, pCreature->GetGUID());

        return true;
    }
            void UpdateAI(const uint32 diff)
            {
                if (pInstance)
                    if (pInstance->GetBossState(DATA_STONE_GUARD) != IN_PROGRESS)
                        me->DespawnOrUnsummon();

                if (preparationTimer)
                {
                    if (preparationTimer <= diff)
                    {
                        isReady = true;
                        preparationTimer = 0;
                    }
                    else
                        preparationTimer -= diff;
                }

                if (isReady && !isExploded)
                    if (me->SelectNearestPlayerNotGM(5.0f))
                    {
                        me->CastSpell(me, SPELL_COBALT_MINE_EXPLOSION, false);
                        me->DespawnOrUnsummon(700);
                        isExploded = true;
                    }
            }
        bool OnTrigger(Player* player, AreaTriggerEntry const* /*areaTrigger*/)
        {
            InstanceScript* instance = player->GetInstanceScript();
            if (!instance || instance->GetBossState(DATA_DEATHBRINGER_SAURFANG) != DONE)
                return true;

            player->TeleportTo(631, 4126.35f, 2769.23f, 350.963f, 0.0f);

            if (instance->GetData(DATA_COLDFLAME_JETS) == NOT_STARTED)
            {
                // Process relocation now, to preload the grid and initialize traps
                player->GetMap()->PlayerRelocation(player, 4126.35f, 2769.23f, 350.963f, 0.0f);

                instance->SetData(DATA_COLDFLAME_JETS, IN_PROGRESS);
                std::list<Creature*> traps;
                GetCreatureListWithEntryInGrid(traps, player, NPC_FROST_FREEZE_TRAP, 120.0f);
                traps.sort(Voragine::ObjectDistanceOrderPred(player));
                bool instant = false;
                for (std::list<Creature*>::iterator itr = traps.begin(); itr != traps.end(); ++itr)
                {
                    (*itr)->AI()->DoAction(instant ? 1000 : 11000);
                    instant = !instant;
                }
            }
            return true;
        }
        void AttackStart(Unit* who) override
        {
            if (instance->GetBossState(DATA_MOGRAINE_AND_WHITE_EVENT) == NOT_STARTED)
                return;

            ScriptedAI::AttackStart(who);
        }
        void AttackStart(Unit* victim) override
        {
            if ((instance->GetBossState(DATA_JEDOGA_SHADOWSEEKER) == IN_PROGRESS) || !victim)
                return;

            ScriptedAI::AttackStart(victim);
        }
        void MoveInLineOfSight(Unit* who) override
        {
            if (!instance || !who || (who->GetTypeId() == TYPEID_UNIT && who->GetEntry() == NPC_JEDOGA_CONTROLLER))
                return;

            if (!bPreDone && who->GetTypeId() == TYPEID_PLAYER && me->GetDistance(who) < 100.0f)
            {
                Talk(TEXT_PREACHING);
                bPreDone = true;
            }

            if (instance->GetBossState(DATA_JEDOGA_SHADOWSEEKER) != IN_PROGRESS || !bOnGround)
                return;

            if (!me->GetVictim() && me->CanCreatureAttack(who))
            {
                float attackRadius = me->GetAttackDistance(who);
                if (me->IsWithinDistInMap(who, attackRadius) && me->IsWithinLOSInMap(who))
                {
                    if (!me->GetVictim())
                    {
                        who->RemoveAurasByType(SPELL_AURA_MOD_STEALTH);
                        AttackStart(who);
                    }
                    else
                    {
                        who->SetInCombatWith(me);
                        me->AddThreat(who, 0.0f);
                    }
                }
            }
        }
Exemple #9
0
        bool OnGossipHello(Player *player, Creature *npc)
        {
            InstanceScript* instance = npc->GetInstanceScript();

            if (player->IsInCombat())
            {
                player->CLOSE_GOSSIP_MENU();
                npc->MonsterWhisper("You are in combat!", player, true);
                return true;
            }

            if (instance->GetBossState(DATA_LORD_MARROWGAR) == DONE)
            {
                player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, "Lord Marrowgar is dead.", GOSSIP_SENDER_MAIN, 6);
                player->SEND_GOSSIP_MENU(GOSSIP, npc->GetGUID());
                return true;
            }

            if ((!player->GetGroup() || !player->GetGroup()->IsLeader(player->GetGUID())) && !player->IsGameMaster())
            {
                player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, "I'm not the raid leader...", GOSSIP_SENDER_MAIN, 6);
                player->SEND_GOSSIP_MENU(GOSSIP, npc->GetGUID());
                return true;
            }

            player->ADD_GOSSIP_ITEM(0, "Zrusit buff", GOSSIP_SENDER_MAIN, 1);
            player->ADD_GOSSIP_ITEM(0, "5% buff", GOSSIP_SENDER_MAIN, 2);
            player->ADD_GOSSIP_ITEM(0, "10% buff", GOSSIP_SENDER_MAIN, 3);
            player->ADD_GOSSIP_ITEM(0, "15% buff", GOSSIP_SENDER_MAIN, 4);
            player->ADD_GOSSIP_ITEM(0, "30% buff", GOSSIP_SENDER_MAIN, 5);
            player->ADD_GOSSIP_ITEM(0, "Close", GOSSIP_SENDER_MAIN, 6);
            player->SEND_GOSSIP_MENU(GOSSIP, npc->GetGUID());
            return true;
        }
        void DamageTaken(Unit* /*killer*/, uint32 &damage) override
        {
            if (damage < me->GetHealth())
                return;

            //Prevent glitch if in fake death
            if (FakeDeath)
            {
                damage = 0;
                return;
            }
            //Don't really die in all phases of Kael'Thas
            if (instance->GetBossState(DATA_KAELTHAS) == 0)
            {
                //prevent death
                damage = 0;
                FakeDeath = true;

                me->InterruptNonMeleeSpells(false);
                me->SetHealth(0);
                me->StopMoving();
                me->ClearComboPointHolders();
                me->RemoveAllAurasOnDeath();
                me->ModifyAuraState(AURA_STATE_HEALTHLESS_20_PERCENT, false);
                me->ModifyAuraState(AURA_STATE_HEALTHLESS_35_PERCENT, false);
                me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
                me->ClearAllReactives();
                me->SetTarget(ObjectGuid::Empty);
                me->GetMotionMaster()->Clear();
                me->GetMotionMaster()->MoveIdle();
                me->SetStandState(UNIT_STAND_STATE_DEAD);
           }
        }
            void UpdateAI(const uint32 diff)
            {
                if (pInstance && pInstance->GetBossState(DATA_SILVERLAINE) != IN_PROGRESS)
                    me->DespawnOrUnsummon();

                DoMeleeAttackIfReady();
            }
Exemple #12
0
            void UpdateAI(const uint32 diff)
            {
                if (pInstance->GetBossState(DATA_GARAJAL) != DONE)
                    return;

                events.Update(diff);

                while (uint32 eventId = events.ExecuteEvent())
                {
                    switch (eventId)
                    {
                        case EVENT_GROWTH:
                            if (me->GetFloatValue(OBJECT_FIELD_SCALE_X) < ghostScale)
                            {
                                me->SetObjectScale(me->GetFloatValue(OBJECT_FIELD_SCALE_X) + (ghostScale / 10.0f));
                                events.ScheduleEvent(EVENT_GROWTH, 200);
                            }
                            break;
                        case EVENT_TALK_DEATH:
                            Talk(TALK_DEATH);
                            break;
                        case EVENT_SUMMON_PORTAL:
                            me->CastSpell(me, SPELL_SPIRITUAL_PORTAL, true);
                            break;
                        case EVENT_DISAPPEAR:
                            if (Creature* spiritualPortal = me->FindNearestCreature(NPC_SPIRITUAL_PORTAL, 50.0f))
                                spiritualPortal->DespawnOrUnsummon(5000);
                            me->DespawnOrUnsummon(500);
                            break;
                        default:
                            break;
                    }
                }
            }
Exemple #13
0
            void Reset()
            {
                _Reset();

                if (pInstance->GetBossState(DATA_GARAJAL) != DONE)
                    pInstance->SetBossState(DATA_GARAJAL, NOT_STARTED);

                pInstance->SendEncounterUnit(ENCOUNTER_FRAME_DISENGAGE, me);

                pInstance->DoRemoveAurasDueToSpellOnPlayers(SPELL_VOODOO_DOLL_VISUAL);
                pInstance->DoRemoveAurasDueToSpellOnPlayers(SPELL_VOODOO_DOLL_SHARE);
                pInstance->DoRemoveAurasDueToSpellOnPlayers(SPELL_CLONE_VISUAL);
                pInstance->DoRemoveAurasDueToSpellOnPlayers(SPELL_CROSSED_OVER);
                pInstance->DoRemoveAurasDueToSpellOnPlayers(SPELL_LIFE_FRAGILE_THREAD);
                pInstance->DoRemoveAurasDueToSpellOnPlayers(SPELL_SOUL_CUT_DAMAGE);
                pInstance->DoRemoveAurasDueToSpellOnPlayers(SPELL_SOUL_CUT_SUICIDE);
                pInstance->DoRemoveAurasDueToSpellOnPlayers(SPELL_BANISHMENT);

                events.ScheduleEvent(EVENT_SECONDARY_ATTACK,        urand(5000, 10000));
                events.ScheduleEvent(EVENT_SUMMON_TOTEM,            urand(27500, 32500));
                events.ScheduleEvent(EVENT_SUMMON_SHADOWY_MINION,   urand(10000, 15000));
                events.ScheduleEvent(EVENT_BANISHMENT,              90000);
                events.ScheduleEvent(EVENT_VOODOO_DOLL,             2500);
                events.ScheduleEvent(EVENT_FINAL_DESTINATION,       361000); // 6 min & 10s

                me->AddAura(SPELL_STRONG_MOJO, me);
                me->CastSpell(me, SPELL_TAP_THE_SPIRIT_WORLD, true);
            }
Exemple #14
0
        void UpdateAI(uint32 uiDiff) override
        {
            // Despawn if the encounter is not running
            if (instance->GetBossState(DATA_IONAR) != IN_PROGRESS)
            {
                me->DespawnOrUnsummon();
                return;
            }

            // Prevent them to follow players through the whole instance
            if (uiCheckTimer <= uiDiff)
            {
                Creature* ionar = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_IONAR));
                if (ionar && ionar->IsAlive())
                {
                    if (me->GetDistance(ionar) > DATA_MAX_SPARK_DISTANCE)
                    {
                        Position pos = ionar->GetPosition();

                        me->SetSpeed(MOVE_RUN, 2.0f);
                        me->GetMotionMaster()->Clear();
                        me->GetMotionMaster()->MovePoint(DATA_POINT_CALLBACK, pos);
                    }
                }
                else
                    me->DespawnOrUnsummon();
                uiCheckTimer = 2*IN_MILLISECONDS;
            }
            else
                uiCheckTimer -= uiDiff;

            // No melee attack at all!
        }
        void MoveDown()
        {
            bOpFerokFail = false;

            instance->SetData(DATA_JEDOGA_TRIGGER_SWITCH, 0);
            me->GetMotionMaster()->MovePoint(1, JedogaPosition[1]);
            me->ApplySpellImmune(0, IMMUNITY_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, false);
            me->ApplySpellImmune(0, IMMUNITY_DAMAGE, SPELL_SCHOOL_MASK_MAGIC, false);
            me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE + UNIT_FLAG_NON_ATTACKABLE);

            me->RemoveAurasDueToSpell(SPELL_SPHERE_VISUAL);

            bOnGround = true;

            if (UpdateVictim())
            {
                AttackStart(me->GetVictim());
                me->GetMotionMaster()->MoveChase(me->GetVictim());
            }
            else
            {
                if (Unit* target = ObjectAccessor::GetUnit(*me, instance->GetGuidData(DATA_PL_JEDOGA_TARGET)))
                {
                    AttackStart(target);
                    instance->SetData(DATA_JEDOGA_RESET_INITIANDS, 0);
                    if (instance->GetBossState(DATA_JEDOGA_SHADOWSEEKER) != IN_PROGRESS)
                        EnterCombat(target);
                }
                else if (!me->IsInCombat())
                    EnterEvadeMode();
            }
        }
        void MoveInLineOfSight(Unit* who) override

        {
            if ((instance->GetBossState(DATA_JEDOGA_SHADOWSEEKER) == IN_PROGRESS) || !who)
                return;

            ScriptedAI::MoveInLineOfSight(who);
        }
        bool OnGossipHello(Player* /*player*/, GameObject* go) override
        {
            InstanceScript* instance = go->GetInstanceScript();
            if (!instance)
                return false;

            if (go->GetEntry() == GO_ACCESS_PANEL_HYDRO && (instance->GetBossState(DATA_HYDROMANCER_THESPIA) == DONE || instance->GetBossState(DATA_HYDROMANCER_THESPIA) == SPECIAL))
                instance->SetBossState(DATA_HYDROMANCER_THESPIA, SPECIAL);

            if (go->GetEntry() == GO_ACCESS_PANEL_MEK && (instance->GetBossState(DATA_MEKGINEER_STEAMRIGGER) == DONE || instance->GetBossState(DATA_MEKGINEER_STEAMRIGGER) == SPECIAL))
                instance->SetBossState(DATA_MEKGINEER_STEAMRIGGER, SPECIAL);

            go->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
            go->SetGoState(GO_STATE_ACTIVE);

            return true;
        }
 void Reset()
 {
     bPhase = false;
     events.Reset();
     summons.DespawnAll();
     if (pInstance)
         if (pInstance->GetBossState(DATA_MINDBENDER_GHURSHA) == DONE || bPhase)
             me->setFaction(35);
 }
Exemple #19
0
    bool OnTrigger(Player* player, const AreaTriggerEntry* /*at*/)
    {
        if (player->isGameMaster())
            return false;

        InstanceScript* instance = player->GetInstanceScript();
        if (!instance || instance->IsEncounterInProgress() || instance->GetBossState(BOSS_KELTHUZAD) == DONE)
            return false;

        Creature* pKelthuzad = Unit::GetCreature(*player, instance->GetData64(DATA_KELTHUZAD));
        if (!pKelthuzad)
            return false;

        boss_kelthuzad::boss_kelthuzadAI* pKelthuzadAI = CAST_AI(boss_kelthuzad::boss_kelthuzadAI, pKelthuzad->AI());
        if (!pKelthuzadAI)
            return false;

        pKelthuzadAI->AttackStart(player);
        if (GameObject* trigger = instance->instance->GetGameObject(instance->GetData64(DATA_KELTHUZAD_TRIGGER)))
        {
            if (trigger->getLootState() == GO_READY)
                trigger->UseDoorOrButton();

            // Note: summon must be done by trigger and not by KT.
            // Otherwise, they attack immediately as KT is in combat.
            for (uint8 i = 0; i < MAX_ABOMINATIONS; ++i)
            {
                if (Creature* sum = trigger->SummonCreature(NPC_ABOMINATION, PosAbominations[i]))
                {
                    pKelthuzadAI->spawns.Summon(sum);
                    sum->GetMotionMaster()->MoveRandom(9.0f);
                    sum->SetReactState(REACT_DEFENSIVE);
                }
            }
            for (uint8 i = 0; i < MAX_WASTES; ++i)
            {
                if (Creature* sum = trigger->SummonCreature(NPC_WASTE, PosWastes[i]))
                {
                    pKelthuzadAI->spawns.Summon(sum);
                    sum->GetMotionMaster()->MoveRandom(5.0f);
                    sum->SetReactState(REACT_DEFENSIVE);
                }
            }
            for (uint8 i = 0; i < MAX_WEAVERS; ++i)
            {
                if (Creature* sum = trigger->SummonCreature(NPC_WEAVER, PosWeavers[i]))
                {
                    pKelthuzadAI->spawns.Summon(sum);
                    sum->GetMotionMaster()->MoveRandom(9.0f);
                    sum->SetReactState(REACT_DEFENSIVE);
                }
            }
        }

        return true;
    }
Exemple #20
0
            void Reset() override
            {
                Initialize();

                if (instance->GetData(DATA_WARDEN_2) == DONE)
                    Init = true;

                if (instance->GetBossState(DATA_HARBINGER_SKYRISS) == DONE)
                    Talk(SAY_COMPLETE);
            }
Exemple #21
0
            bool CanProgress()
            {
                if (Phase == 7 && instance->GetData(DATA_WARDEN_4) == DONE)
                    return true;
                if (Phase == 6 && instance->GetData(DATA_WARDEN_3) == DONE)
                    return true;
                if (Phase == 5 && instance->GetData(DATA_WARDEN_2) == DONE)
                    return true;
                if (Phase == 4)
                    return true;
                if (Phase == 3 && instance->GetData(DATA_WARDEN_1) == DONE)
                    return true;
                if (Phase == 2 && instance->GetBossState(DATA_HARBINGER_SKYRISS) == IN_PROGRESS)
                    return true;
                if (Phase == 1 && instance->GetBossState(DATA_HARBINGER_SKYRISS) == IN_PROGRESS)
                    return true;

                return false;
            }
Exemple #22
0
    bool OnGossipHello(Player* player, Creature* creature) override
    {
        InstanceScript* instance = creature->GetInstanceScript();
        if (!instance)
            return true;

        // What gossip menu shall we send?
        uint32 gossipMenuId = GOSSIP_MENU_NO_TIME_TO_WASTE;

        if (instance->GetBossState(DATA_VAULT_OF_LIGHTS) == NOT_STARTED) // gossipMenuId already set, only add gossip option
            AddGossipItemFor(player, gossipMenuId, GOSSIP_OPTION_WE_ARE_READY, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF);
        else if (instance->GetBossState(DATA_VAULT_OF_LIGHTS) != DONE)
            gossipMenuId = GOSSIP_MENU_DESTROY_ELEMENTAL;
        else // To-do: There might be another gossip text before and while fighting Anraphet. Check retail.
            gossipMenuId = GOSSIP_MENU_OCH_ITS_NOT_EASY;

        SendGossipMenuFor(player, player->GetGossipTextId(gossipMenuId, creature), creature->GetGUID());
        return true;
    }
bool MuradinBronzebeard::OnGossipHello(Player* player, Creature* creature)
{
    InstanceScript* instance = creature->GetInstanceScript();
    if (instance && instance->GetBossState(DATA_DEATHBRINGER_SAURFANG) != DONE)
    {
        player->ADD_GOSSIP_ITEM(0, "Lasst es beginnen...", 631, -ACTION_START_EVENT + 1);
        player->SEND_GOSSIP_MENU(DEFAULT_GOSSIP_MESSAGE, creature->GetGUID());
    }

    return true;
}
        bool _OnTrigger(Player* player, AreaTriggerEntry const* /*areaTrigger*/) override
        {
            InstanceScript* instance = player->GetInstanceScript();
            if (!instance || instance->GetBossState(BOSS_ANUBREKHAN) != NOT_STARTED)
                return true;

            if (Creature* anub = ObjectAccessor::GetCreature(*player, instance->GetGuidData(DATA_ANUBREKHAN)))
                anub->AI()->Talk(SAY_GREET);

            return true;
        }
        bool OnTrigger(Player* player, AreaTriggerEntry const* /*areaTrigger*/) override
        {
            InstanceScript* instance = player->GetInstanceScript();
            if (!instance || instance->GetData(DATA_HAD_FAERLINA_GREET) || instance->GetBossState(BOSS_FAERLINA) != NOT_STARTED)
                return true;

            if (Creature* faerlina = ObjectAccessor::GetCreature(*player, instance->GetGuidData(DATA_FAERLINA)))
                faerlina->AI()->Talk(SAY_GREET);
            instance->SetData(DATA_HAD_FAERLINA_GREET, 1u);

            return true;
        }
    bool OnGossipHello(Player *pPlayer, GameObject *pGO)
    {
        InstanceScript* pInstance = pGO->GetInstanceScript();
        if (!pInstance)
            return false;

        pPlayer->ADD_GOSSIP_ITEM(0, "Expedition Base Camp", GOSSIP_SENDER_MAIN, BASE_CAMP);
        //pPlayer->ADD_GOSSIP_ITEM(0, "Formation Grounds", GOSSIP_SENDER_MAIN, GROUNDS);
        //if (pInstance->GetBossState(BOSS_LEVIATHAN) == DONE || pPlayer->isGameMaster())
        {
            pPlayer->ADD_GOSSIP_ITEM(0, "Colossal Forge", GOSSIP_SENDER_MAIN, FORGE);
            if (pInstance->GetBossState(BOSS_XT002) == DONE || pPlayer->isGameMaster())
            {
                pPlayer->ADD_GOSSIP_ITEM(0, "Scrapyard", GOSSIP_SENDER_MAIN, SCRAPYARD);
                pPlayer->ADD_GOSSIP_ITEM(0, "Antechamber of Ulduar", GOSSIP_SENDER_MAIN, ANTECHAMBER);
                if (pInstance->GetBossState(BOSS_KOLOGARN) == DONE || pPlayer->isGameMaster())
                {
                    pPlayer->ADD_GOSSIP_ITEM(0, "Shattered Walkway", GOSSIP_SENDER_MAIN, WALKWAY);
                    if (pInstance->GetBossState(BOSS_AURIAYA) == DONE || pPlayer->isGameMaster())
                    {
                        pPlayer->ADD_GOSSIP_ITEM(0, "Conservatory of Life", GOSSIP_SENDER_MAIN, CONSERVATORY);
                        if (pInstance->GetBossState(BOSS_MIMIRON) == FAIL || pInstance->GetBossState(BOSS_MIMIRON) == DONE || pPlayer->isGameMaster())
                        {
                            pPlayer->ADD_GOSSIP_ITEM(0, "Spark of Imagination", GOSSIP_SENDER_MAIN, SPARK_IMAGINATION);
                            if (pInstance->GetBossState(BOSS_VEZAX) == DONE || pPlayer->isGameMaster())
                                pPlayer->ADD_GOSSIP_ITEM(0, "Descent into Madness", GOSSIP_SENDER_MAIN, DESCENT_MADNESS);
                        }
                    }
                }
            }
        }
        pPlayer->SEND_GOSSIP_MENU(DEFAULT_GOSSIP_MESSAGE, pGO->GetGUID());
        return true;
    }
        bool OnGossipHello(Player* player, GameObject* /*go*/)
        {
            InstanceScript* Instance = player->GetInstanceScript();
            if (!Instance)
                return false;

            Creature* Ossirian = player->FindNearestCreature(NPC_OSSIRIAN, 30.0f);
            if (!Ossirian || Instance->GetBossState(DATA_OSSIRIAN) != IN_PROGRESS)
                return false;

            Ossirian->AI()->DoAction(ACTION_TRIGGER_WEAKNESS);
            return true;
        }
	bool OnGossipHello(Player* pPlayer, Creature* pCreature) {
		InstanceScript* pInstance = pCreature->GetInstanceScript();
		if (pInstance && pInstance->GetBossState(TYPE_RAZORSCALE) == NOT_STARTED
				&& pPlayer) {
			pPlayer->PrepareGossipMenu(pCreature);

			pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ITEM_1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF);
			pPlayer->SEND_GOSSIP_MENU(13853, pCreature->GetGUID());
		} else
			pPlayer->SEND_GOSSIP_MENU(13910, pCreature->GetGUID());

		return true;
	}
        void Reset() override
        {
            Initialize();

            me->GetMotionMaster()->MoveTargetedHome();

            if (instance->GetBossState(DATA_GORTOK_PALEHOOF) == IN_PROGRESS)
            {
                Creature* palehoof = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_GORTOK_PALEHOOF));
                if (palehoof && palehoof->IsAlive())
                    palehoof->AI()->Reset();
            }
        }
            void Reset()
            {
                if (instance->GetBossState(DATA_SHADE_OF_AKAMA) == DONE)
                {
                    me->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP);
                    return;
                }

                me->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP);
                me->CastSpell(me, SPELL_STEALTH, true);
                events.Reset();
                events2.Reset();
            }