package ai.npc.NFWalker;import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map;import java.util.Random;import l2r.gameserver.enums.CtrlIntention;import l2r.gameserver.model.Location;import l2r.gameserver.model.actor.L2Npc;import l2r.gameserver.model.quest.Quest;import l2r.gameserver.network.clientpackets.Say2;import l2r.gameserver.network.serverpackets.NpcSay;publicclassNFWalkerAI extends Quest{privatestatic final int WALKER_NPC_ID =20116;private final Map<String,Route> routes =newHashMap<>();private final Map<Integer,Integer> npcIndexes =newHashMap<>();private final Map<Integer,Boolean> npcReverse =newHashMap<>();private final Map<Integer,String> npcCurrentRoute =newHashMap<>();publicNFWalkerAI(){
super(-1,NFWalkerAI.class.getSimpleName(),"ai/npc/NFWalker");
loadRoutes();
addSpawnId(WALKER_NPC_ID);}privatevoid loadRoutes(){// Route 1 DataRoute route1 =newRoute("route1");
route1.addPoint(newRoutePoint(0,149363,172341,-941,0,false,""));
route1.addPoint(newRoutePoint(1,148568,172328,-980,5,true,"Puff"));
route1.addPoint(newRoutePoint(2,148536,172792,-980,0,false,""));// Route 2 DataRoute route2 =newRoute("route2");
route2.addPoint(newRoutePoint(0,149363,172341,-941,0,false,""));
route2.addPoint(newRoutePoint(1,150248,172328,-980,5,true,"Rise my children! Bring me the servants of the god! Let them be offered to our god Bifrons!"));
route2.addPoint(newRoutePoint(2,150248,172776,-980,0,false,""));// Add routes to the map
routes.put("route1", route1);
routes.put("route2", route2);}@OverridepublicString onSpawn(L2Npc npc){if(npc.getId()== WALKER_NPC_ID){
selectInitialRouteForNpc(npc);}return super.onSpawn(npc);}@OverridepublicString onAdvEvent(String event, L2Npc npc, l2r.gameserver.model.actor.instance.L2PcInstance player){if(event.equalsIgnoreCase("move")){
moveNpc(npc);}elseif(event.equalsIgnoreCase("check_reached")){
checkIfReached(npc);}return null;}privatevoid moveNpc(L2Npc npc){String routeName = npcCurrentRoute.get(npc.getObjectId());Route route = routes.get(routeName);Integer pointIndex = npcIndexes.get(npc.getObjectId());if(route != null && pointIndex != null){RoutePoint point = route.getPoints().get(pointIndex);if(point.isRun()){
npc.setRunning();}else{
npc.setWalking();}if(!point.getChat().isEmpty()){
npc.broadcastPacket(newNpcSay(npc.getObjectId(),Say2.NPC_ALL, npc.getId(), point.getChat()));}
npc.getAI().setIntention(CtrlIntention.AI_INTENTION_MOVE_TO,newLocation(point.getX(), point.getY(), point.getZ()));// Log movement intentionSystem.out.println("NPC "+ npc.getObjectId()+" moving to "+ point.getX()+", "+ point.getY()+", "+ point.getZ());// Schedule a check to see if the NPC has reached its destination
startQuestTimer("check_reached",1000, npc, null);}}privatevoid checkIfReached(L2Npc npc){String routeName = npcCurrentRoute.get(npc.getObjectId());Route route = routes.get(routeName);Integer pointIndex = npcIndexes.get(npc.getObjectId());if(route != null && pointIndex != null){RoutePoint point = route.getPoints().get(pointIndex);Location currentLocation = npc.getLocation();Location targetLocation =newLocation(point.getX(), point.getY(), point.getZ());// Check if the NPC has reached the target locationif(currentLocation.equals(targetLocation)){// Log that the NPC has reached the targetSystem.out.println("NPC "+ npc.getObjectId()+" reached target "+ targetLocation);// Schedule the next movement
startQuestTimer("move", point.getDelay()*1000, npc, null);if(!npcReverse.get(npc.getObjectId())){
pointIndex++;if(pointIndex >= route.getPoints().size()){
npcReverse.put(npc.getObjectId(),true);
pointIndex = route.getPoints().size()-1;}}else{
pointIndex--;if(pointIndex <0){
npcReverse.put(npc.getObjectId(),false);
pointIndex =0;// Choose a new route after completing the current one in both directions
switchRouteForNpc(npc);return;}}
npcIndexes.put(npc.getObjectId(), pointIndex);}else{// Check again after 1 second
startQuestTimer("check_reached",1000, npc, null);}}}privatevoid selectInitialRouteForNpc(L2Npc npc){// Randomly select either route1 or route2String selectedRouteName ="route"+(newRandom().nextInt(2)+1);
npcCurrentRoute.put(npc.getObjectId(), selectedRouteName);
npcIndexes.put(npc.getObjectId(),0);
npcReverse.put(npc.getObjectId(),false);
startQuestTimer("move",5000, npc, null);// Log initial route selectionSystem.out.println("NPC "+ npc.getObjectId()+" selected initial route "+ selectedRouteName);}privatevoid switchRouteForNpc(L2Npc npc){String currentRoute = npcCurrentRoute.get(npc.getObjectId());String newRoute = currentRoute.equals("route1")?"route2":"route1";
npcCurrentRoute.put(npc.getObjectId(), newRoute);
npcIndexes.put(npc.getObjectId(),0);
npcReverse.put(npc.getObjectId(),false);
startQuestTimer("move",5000, npc, null);// Log route switchingSystem.out.println("NPC "+ npc.getObjectId()+" switched to route "+ newRoute);}privatestaticclassRoute{privateList<RoutePoint> points =newArrayList<>();publicRoute(String name){}publicvoid addPoint(RoutePoint point){
points.add(point);}publicList<RoutePoint> getPoints(){return points;}}privatestaticclassRoutePoint{privateint id;privateint x, y, z, delay;private boolean run;privateString chat;publicRoutePoint(int id,int x,int y,int z,int delay, boolean run,String chat){this.id = id;this.x = x;this.y = y;this.z = z;this.delay = delay;this.run = run;this.chat = chat;}publicint getId(){return id;}publicint getX(){return x;}publicint getY(){return y;}publicint getZ(){return z;}publicint getDelay(){return delay;}public boolean isRun(){return run;}publicString getChat(){return chat;}}}
I looking for help, with this, the npc not start to move.
Im trying to create, an NPC wich have multiple walk routes basic logic is
random pick a route complite the route
like Route 1 start form zero (0 -> 1 -> 2(or more) -> 1 -> 0)
When the npc return to 0, the script should pic the other route and start again.
And if there is a message like point 1 here "route1.addPoint(new RoutePoint(1, 148568, 172328, -980, 5, true, "Puff"));"
The npc should display the chat message.
Currently my problem is the npc not moving, but if I manage it to start moving its randomly move between the route 1 and 2 set of coordinates. Currently for me its a nightmare.
You can post now and register later.
If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.
DISCORD :
utchiha_market
telegram :
https://t.me/utchiha_market
SELLIX STORE :
https://utchiha.sellpass.io/
Join our server for more products :
https://discord.gg/uthciha-services
https://campsite.bio/utchihaamkt
@Celestine come on now. that guy is full of himself. Grow up and take actions.
Bringing this up (full convo here)
I couldnt care less if people are getting requests or not, i'm happy for everyone but being so arrogant is a true talent.
DISCORD :
utchiha_market
telegram :
https://t.me/utchiha_market
SELLIX STORE :
https://utchiha.sellpass.io/
Join our server for more products :
https://discord.gg/uthciha-services
https://campsite.bio/utchihaamkt
DISCORD :
utchiha_market
telegram :
https://t.me/utchiha_market
SELLIX STORE :
https://utchiha.sellpass.io/
Join our server for more products :
https://discord.gg/uthciha-services
https://campsite.bio/utchihaamkt
We remind you that right now you can create a new character and get the benefits of the bonus-start, which will begin on April 19th.
These advantages include:
— 10 sets of buff scrolls (phys or mage, depending on class),
— 10 packs of +50% Drop/Spoil runes (2 hours each),
— 10 packs of +50% Exp runes (2 hours each).
Moreover, characters between level 21 and 30 will receive upon login:
— 6 sets of buff scrolls,
— 6 packs of +50% Drop/Spoil runes (2h each),
— 6 packs of +50% Exp runes (2h each).
Don't miss the chance to start your adventure on Airin!
Question
Starfire868686
I looking for help, with this, the npc not start to move.
Im trying to create, an NPC wich have multiple walk routes basic logic is
random pick a route complite the route
like Route 1 start form zero (0 -> 1 -> 2(or more) -> 1 -> 0)
When the npc return to 0, the script should pic the other route and start again.
And if there is a message like point 1 here "route1.addPoint(new RoutePoint(1, 148568, 172328, -980, 5, true, "Puff"));"
The npc should display the chat message.
Currently my problem is the npc not moving, but if I manage it to start moving its randomly move between the route 1 and 2 set of coordinates. Currently for me its a nightmare.
I hope anyone can help somhow.
2 answers to this question
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.