I try to add waypoints via MoonScriptCreatureAI, but nothing happens.
I test some similar script (Black Temple) but no creature would walk, maybe it is a general problem?
I'am grateful for a code suggestion, or a link to a working waypoint script in ArcEmu branch (Perhaps there is one script which works in it).
#define SINCLARI_SAY_1 "Prison guards, we are oleaving! These adventurers are taking over! Go go go!" #define SINCLARY_SAY_2 "I'm locking the door. Good luck, and thank you for doing this." #define SINCLARI_MAX_WP 4 static LocationExtra SinclariWP[] = // Sinclari WPS { { }, // 0 { 1829.10f, 798.63f, 44.36345f, 3.97056f, Flag_Walk }, // 1 walkt to crystal activation { 1828.521f, 803.797f, 44.3641f, 0.00f, Flag_Walk }, // 2 sayevent { 1818.361328f, 803.875f, 44.36453f, 3.134f, Flag_Walk }, // 3 walk outside { 1820.027f, 803.97162f, 44.3635f, 0.00f, Flag_Walk } // 4 walk behind door and locking it }; /////////////////////////////////////////////////////// //Lieutnant Sinclari StartEvent class SinclariAI : public MoonScriptCreatureAI { public: MOONSCRIPT_FACTORY_FUNCTION(SinclariAI, MoonScriptCreatureAI); SinclariAI(Creature* pCreature) : MoonScriptCreatureAI(pCreature) { SetMoveType(Move_DontMoveWP); for (int i = 1; i < 4; ++i) { AddWaypoint(CreateWaypoint(i, 0, SinclariWP[i].addition, SinclariWP[i])); } phase = 0; } void OnReachWP(uint32 iWaypointId, bool bForwards) { switch (iWaypointId) { case 0: { phase++; sEventMgr.AddEvent(_unit, &Creature::CallScriptUpdate, EVENT_SCRIPT_UPDATE_EVENT, 1000, 1, EVENT_FLAG_DO_NOT_EXECUTE_IN_WORLD_CONTEXT); LOG_DEBUG("SINCLARI OnReachWP: Case 0!"); } break; case 1: { SetMoveType(Move_WantedWP); SetWaypointToMove(2); LOG_DEBUG("SINCLARI OnReachWP: Case 1!"); } break; case 2: { phase++; LOG_DEBUG("SINCLARI OnReachWP: Case 2!"); } break; case 3: { _unit->SendChatMessage(CHAT_MSG_MONSTER_SAY, LANG_UNIVERSAL, SINCLARI_SAY_1); LOG_DEBUG("SINCLARI OnReachWP: Case 3!"); } break; case 4: { LOG_DEBUG("SINCLARI OnReachWP: Case 4!"); } break; case 5: { _unit->SendChatMessage(CHAT_MSG_MONSTER_SAY, LANG_UNIVERSAL, SINCLARY_SAY_2); LOG_DEBUG("SINCLARI OnReachWP: Case 5!"); } break; } } void AIUpdate() { switch (phase) { case 0: { LOG_DEBUG("SINCLARI AIUpdate: Case 0!"); } break; case 1: { SetWaypointToMove(1); LOG_DEBUG("SINCLARI AIUpdate: Case 1!"); } break; case 2: { //After closing the door, instance is in progress TheVioletHoldScript* pInstance = (TheVioletHoldScript*)_unit->GetMapMgr()->GetScript(); pInstance->SetInstanceData(Data_EncounterState, MAP_VIOLET_HOLD, State_InProgress); LOG_DEBUG("SINCLARI AIUpdate: Case 2!"); } break; } } protected: uint32 phase; }; enum SinclariGossipTexts { SINCLARI_ON_HELLO = 13853, SINCLARI_ON_FINISH = 13854, SINCLARI_OUTSIDE = 14271 }; #define SINCLARI_MENU_1 "Activate the crystals when we get in trouble, right" #define SINCLARI_MENU_2 "Get your people to safety, we'll keep the Blue Dragonflight's forces at bay." #define SINCLARI_MENU_3 "I'm not fighting, so send me in now!" /////////////////////////////////////////////////////// //Lieutnant Sinclari Gossip and init events //Sinclari Gossip class SinclariGossip : public GossipScript { public: void GossipHello(Object* pObject, Player* pPlayer) { TheVioletHoldScript* pInstance = (TheVioletHoldScript*)pPlayer->GetMapMgr()->GetScript(); if (!pInstance) return; GossipMenu* menu; //Page 1: Textid and first menu item if (pInstance->GetInstanceData(Data_EncounterState, MAP_VIOLET_HOLD) == State_NotStarted); { objmgr.CreateGossipMenuForPlayer(&menu, pObject->GetGUID(), SINCLARI_ON_HELLO, pPlayer); menu->AddItem(Arcemu::Gossip::ICON_CHAT, SINCLARI_MENU_1, 1); menu->SendTo(pPlayer); } //If VioletHold is started, Sinclari has this item for people who aould join. if (pInstance->GetInstanceData(Data_EncounterState, MAP_VIOLET_HOLD) == State_InProgress) { objmgr.CreateGossipMenuForPlayer(&menu, pObject->GetGUID(), SINCLARI_OUTSIDE, pPlayer); menu->AddItem(Arcemu::Gossip::ICON_CHAT, SINCLARI_MENU_3, 3); menu->SendTo(pPlayer); } }; void GossipSelectOption(Object* pObject, Player* pPlayer, uint32 Id, uint32 IntId, const char* Code) { TheVioletHoldScript* pInstance = (TheVioletHoldScript*)pPlayer->GetMapMgr()->GetScript(); if (!pInstance) return; switch (IntId) { case 0: GossipHello(pObject, pPlayer); break; case 1: { GossipMenu* menu; objmgr.CreateGossipMenuForPlayer(&menu, pObject->GetGUID(), SINCLARI_ON_FINISH, pPlayer); menu->AddItem(Arcemu::Gossip::ICON_CHAT, SINCLARI_MENU_2, 2); menu->SendTo(pPlayer); // New Encounter State included pInstance->SetInstanceData(Data_EncounterState, MAP_VIOLET_HOLD, State_PreProgress); }break; case 2: { TO_CREATURE(pObject)->SetUInt32Value(UNIT_NPC_FLAGS, 0); TO_CREATURE(pObject)->GetScript()->OnReachWP(0, 0); }break; case 3: { Arcemu::Gossip::Menu::Complete(pPlayer); pPlayer->SafeTeleport(pPlayer->GetInstanceID(), MAP_VIOLET_HOLD, 1830.531006f, 803.939758f, 44.340508f, 6.281611f); }break; } } };
It switch to AIUpdate Case 1, but "SetWaypointToMove(1);" didn't work...