Axdrell Posted September 28, 2021 Report Share Posted September 28, 2021 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(); } Link to comment Share on other sites More sharing options...
Recommended Posts