Jump to content
TrinityCore

Axdrell

Plebs
  • Posts

    1
  • Joined

  • Last visited

Posts posted by Axdrell

  1. Hi,

    I am trying to make a novice shaman NPC (from echo isles area) attack the tikki target with a lightning bolt (spell 20802). I have tried using a Smart Script and C++ script (see below) but no luck. I looked at other scripts provided within the trinitycore source code for guidance. Yet, I am not able to get the NPC to attack the target. Below is a sample class with the intended actions scripts. Neither is working. I am able to create Smart scripts using cosmetic spells with no problem. However, the cosmetic spells do not provide the spells and the rotation I want to use. Any help you can provide is  greatly appreciated. I am able to compile the code below without errors. The C++ creature script has also been assigned to the NPC (server restarted of course). I tried creating this script in the latest version of trinitycore (shadowlands) and older trinitycore code (legion, BFA, etc).

    Thanks so much.

    Is it a limitation of the Wow Client?

    #include "ScriptMgr.h"
    #include "ScriptedCreature.h"

    enum Spells
    {
        SPELL_LIGHTNINGBOLT = 20802,
        SPELL_HEALINGWAVE = 72014,
        SPELL_FLAMESHOCK = 58940,
        //TESTING
        SPELL_CHAINHEAL = 72014,  //NPC=38326 - Darkspear Shaman
        SPELL_BOLT = 73212
    };

     enum Events
    {
        EVENT_LIGHTNINGBOLT = 1,
        EVENT_HEALINGWAVE = 2,
        EVENT_FLAMESHOCK = 3
    };

    enum Creatures
    {
        HIT_TARGET    = 38038
    };

    class npc_shaman_trainee : public CreatureScript // Used by the Darkspear Shaman Novice trainee to attack a tiki practice target.
    {
        public:
            npc_shaman_trainee() : CreatureScript("npc_shaman_novice") { }
            
            CreatureAI* GetAI(Creature* creature) const override
            {
                return new npc_shaman_traineeAI(creature);
            }
            
            struct npc_shaman_traineeAI : public ScriptedAI
            {
                npc_shaman_traineeAI(Creature* creature) : ScriptedAI(creature)
                {
                }
                
                EventMap events;

                void Reset() override
                {
                    //_Reset();
                    events.Reset();
                    if (Creature* target = me->FindNearestCreature(38038, 50.0f))
                    me->CastSpell(target, SPELL_LIGHTNINGBOLT, true);
                }
                
                void EnterCombat(Unit* /*who*/) override
                {
                    events.ScheduleEvent(EVENT_LIGHTNINGBOLT, 8000);
                    events.ScheduleEvent(EVENT_HEALINGWAVE, 12000);
                    events.ScheduleEvent(EVENT_FLAMESHOCK , 10000);
                }
                
                void KilledUnit(Unit * /*victim*/) override
                {
                }
                
                void JustDied(Unit * /*victim*/) override
                {
                }

                void UpdateAI(uint32 diff) override
                {
                    if (!UpdateVictim())
                        return;
                        
                    events.Update(diff);

                   // if (me->HasUnitState(UNIT_STATE_CASTING))
                   //     return;
                        
                    while (uint32 eventId = events.ExecuteEvent())
                    {
                        switch (eventId)
                        {
                            case EVENT_LIGHTNINGBOLT:
                                if (Creature* target = me->FindNearestCreature(HIT_TARGET,525.0f,true))
                                {
                                    if (me->GetVictim() == target)
                                    {
                                    //if (Unit *target = SelectTarget(SELECT_TARGET_RANDOM, 1))
                                    DoCast(target, SPELL_LIGHTNINGBOLT, true);
                                    }
                                    events.ScheduleEvent(EVENT_LIGHTNINGBOLT, 8000);
                                }
                                break;
                                
                            case EVENT_HEALINGWAVE:
                                DoCast(me, SPELL_HEALINGWAVE);
                                events.ScheduleEvent(EVENT_HEALINGWAVE, 12000);
                                break;
                                
                            case EVENT_FLAMESHOCK:
                                if (Creature* target = me->FindNearestCreature(HIT_TARGET, 525.0f,true))
                                {
                                //if (Unit *target = SelectTarget(SELECT_TARGET_RANDOM, 1))
                                DoCast(target, SPELL_FLAMESHOCK, true);
                                }
                                events.ScheduleEvent(EVENT_FLAMESHOCK, 10000);
                                break;
                        }
                    }
                    
                    DoMeleeAttackIfReady();
                }
            };
    };

     

     

    class npc_test : public CreatureScript
    {
    public:
        npc_test() : CreatureScript("npc_test") { }

        CreatureAI* GetAI(Creature* creature) const override
        {
            return new npc_testAI(creature);
        }

        struct npc_testAI : public ScriptedAI
        {
            npc_testAI(Creature* creature) : ScriptedAI(creature)
            {
                instance = creature->GetInstanceScript();
            }
            InstanceScript *instance;
            EventMap events;

            void Reset() override
            {
                events.Reset();
            }

            void EnterCombat(Unit* /*who*/) override
            {
                if (Creature* thrall = me->FindNearestCreature(38038, 100.0f, true))
                    thrall->SetReactState(REACT_AGGRESSIVE);
                events.ScheduleEvent(EVENT_LIGHTNINGBOLT, urand(2000, 5000));
            }

            void JustDied(Unit* /*Kill*/) override
            {
              
            }

            void UpdateAI(uint32 diff) override

            {
                events.Update(diff);

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

                while (uint32 eventId = events.ExecuteEvent())
                {
                    switch (eventId)
                    {
                        case EVENT_LIGHTNINGBOLT:
                            if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
                            {
                                me->CastSpell(target, SPELL_LIGHTNINGBOLT, false);
                            }
                            events.ScheduleEvent(EVENT_LIGHTNINGBOLT, urand(12000, 15000));
                            break;
                    }
                }

                DoMeleeAttackIfReady();
            }
        };

    };

     

    void AddSC_GameAreaNPCS()
    {
        new npc_shaman_trainee();
        new npc_test();
    }

×
×
  • Create New...