コード例 #1
0
            void UpdateAI(uint32 diff)
            {
                events2.Update(diff);
                switch (events2.ExecuteEvent())
                {
                    case EVENT_AKAMA_START_ENCOUNTER:
                        me->RemoveAura(SPELL_STEALTH);
                        me->SetWalk(true);
                        me->GetMotionMaster()->MovePoint(POINT_START, 517.4877f, 400.7993f, 112.7837f, false);
                        events2.ScheduleEvent(EVENT_AKAMA_START_CHANNEL, 11000);
                        break;
                    case EVENT_AKAMA_START_CHANNEL:
                        me->CastSpell(me, SPELL_AKAMA_SOUL_CHANNEL, false);
                        if (Creature* shade = ObjectAccessor::GetCreature(*me, instance->GetData64(NPC_SHADE_OF_AKAMA)))
                        {
                            shade->AI()->AttackStart(me);
                            shade->GetMotionMaster()->Clear();
                            shade->AI()->DoAction(ACTION_START_ENCOUNTER);
                        }
                        break;
                    case EVENT_AKAMA_SCENE0:
                        me->SetWalk(true);
                        me->GetMotionMaster()->MovePoint(POINT_CHANNEL_SOUL, 467.0f, 400.7993f, 118.537f);
                        break;
                    case EVENT_AKAMA_SCENE1:
                        me->CastSpell(me, SPELL_AKAMA_SOUL_RETRIEVE, true);
                        break;
                    case EVENT_AKAMA_SCENE2:
                        Talk(SAY_BROKEN_FREE_0);
                        break;
                    case EVENT_AKAMA_SCENE3:
                        me->SummonCreatureGroup(SUMMON_GROUP_BROKENS);
                        break;
                    case EVENT_AKAMA_SCENE4:
                        Talk(SAY_BROKEN_FREE_1);
                        break;
                    case EVENT_AKAMA_SCENE5:
                        for (SummonList::const_iterator itr = summons.begin(); itr != summons.end(); ++itr)
                            if (Creature* broken = ObjectAccessor::GetCreature(*me, *itr))
                                broken->SetStandState(UNIT_STAND_STATE_KNEEL);
                        Talk(SAY_BROKEN_FREE_2);
                        break;
                    case EVENT_AKAMA_SCENE6:
                        if (Creature* broken = summons.GetCreatureWithEntry(NPC_ASHTONGUE_BROKEN))
                            broken->AI()->Talk(SAY_BROKEN_S1);
                        break;
                    case EVENT_AKAMA_SCENE7:
                        for (SummonList::const_iterator itr = summons.begin(); itr != summons.end(); ++itr)
                            if (Creature* broken = ObjectAccessor::GetCreature(*me, *itr))
                                broken->AI()->Talk(SAY_BROKEN_S2);
                        break;
                }

                if (!UpdateVictim())
                    return;

                events.Update(diff);
                if (me->HasUnitState(UNIT_STATE_CASTING))
                    return;

                switch (events.ExecuteEvent())
                {
                    case EVENT_SPELL_CHAIN_LIGHTNING:
                        me->CastSpell(me->GetVictim(), SPELL_CHAIN_LIGHTNING, false);
                        events.ScheduleEvent(EVENT_SPELL_CHAIN_LIGHTNING, urand(10000, 15000));
                        break;
                    case EVENT_SPELL_DESTRUCTIVE_POISON:
                        me->CastSpell(me, SPELL_DESTRUCTIVE_POISON, false);
                        events.ScheduleEvent(EVENT_SPELL_DESTRUCTIVE_POISON, urand(4000, 5000));
                        break;
                }

                DoMeleeAttackIfReady();
            }