Advertisement
darkside3d1

NPC Schedule Navigation MK II

Oct 13th, 2018
87
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. var sched = [0,-1,-1,500,-1,-1,1000,-1,-1,1500,-1,-1,-1,-1,-1,2000,2500,3000,3500,4000,4500,5000,5500,6000,-1,-1,6500,-1,-1,7000,7500,8000,8500,9000,9500,10000,-1,-1,-1,-1,-1,-1,10500,-1,-1,11000,-1,11500,-1,12000,-1,12500,13000,13500,-1,14000,-1,14500,15000,15500,16000,16500,17000,17500,18000,18500,19000,19500,20000,20500,21000,21500,22000,22500,23000,23500
  2. ];
  3. var toX = [37,44,44,44,44,44,44,44,41,41,33,32,30,39,28,28,28,28,28,28,28,28,28,28,39,36,36,34,28,28,28,28,28,28,28,28,34,31,33,38,41,44,44,44,44,44,41,41,41,41,32,32,32,32,38,38,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37
  4. ];
  5. var toY = [81,80,80,80,80,80,80,80,80,80,76,70,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,70,72,79,80,80,80,80,80,80,80,80,80,81,81,81,81,80,80,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81
  6. ];
  7. var toZ = [143,142,140,140,145,143,143,144,143,143,157,174,187,195,197,197,197,197,197,197,197,197,197,197,195,195,195,198,197,197,197,197,197,197,197,197,191,187,176,161,150,140,140,145,143,143,143,143,139,139,146,146,146,146,140,140,143,143,143,143,143,143,143,143,143,143,143,143,143,143,143,143,143,143,143,143
  8. ];
  9. var speed = 2;
  10. var worldtime = 0;
  11. var id = 0;
  12. var testc = 24000;
  13. var nextId = 0;
  14. var myX = 0;
  15. var myY = 0;
  16. var myZ = 0;
  17. var isStopped = false;
  18. var isDay = true;
  19. var check = false;
  20. var isNav = false;
  21.  
  22. function init(event){
  23. event.npc.say("Testing, 1, 2, 3.");
  24. event.npc.timers.stop(2);
  25. event.npc.timers.start(2, 200, false); //Slow this down once code done.
  26. worldtime = (event.npc.world.getTime() % 24000);
  27. isDay = event.npc.world.isDay();
  28. //Check current point in schedule. Error catches despawning.
  29. testc = 24000;
  30. for(var c = 0; c < sched.length; c++){
  31. if(sched[c] > -1 && worldtime - sched[c] > -1 && worldtime - sched[c] < testc){
  32. testc = worldtime - sched[c];
  33. id = c;
  34. } // end if statement
  35. } // End for loop
  36.  
  37. //Check next major point in schedule. This needs to be moved from init!
  38. for(var i =id; i < sched.length; i++){
  39. if(sched[i]>sched[id]){
  40. nextId = i;
  41. break;}
  42. }
  43.    
  44. event.npc.say("The current schedule time is " + sched[id] + ".");  
  45. } //end init event
  46.  
  47. function interact(event){
  48. } //end interact event
  49.  
  50. function target(event){
  51. isStopped = true;
  52. event.npc.say("I see something!");
  53. } //end target event
  54.  
  55. function targetLost(event){
  56. isStopped = false;
  57. event.npc.say("I lost them...");
  58. } //end lost target event
  59.  
  60. function timer(event){
  61. if(event.id == 2){
  62.  worldtime = (event.npc.world.getTime() % 24000);
  63. if(isDay == false){
  64. isDay = event.npc.world.isDay();
  65.     if(isDay == true){
  66.     id = 0;
  67.     }
  68. }
  69.  
  70. event.npc.say("The time is " + worldtime + " and the current schedule id is " + id + ".");
  71.  
  72. if(worldtime>=sched[id]){
  73.     if(isStopped==false){
  74.         myX = event.npc.getBlockX();
  75.         myY = event.npc.getBlockY();
  76.         myZ = event.npc.getBlockZ();
  77.         if(myX == toX[id]  &&  myY >= toY[id] - 1 && myZ == toZ[id]){
  78.     event.npc.say("It's time to move.");
  79.     id = id+1; //loop id once reaches end.
  80.     event.npc.timers.stop(2);
  81.     event.npc.timers.start(2, 10, false);
  82.         }
  83.          else{
  84.          if((myX >= toX[id] -20 && myX <= toX[id] +20 && myY >= toY[id] -20 && myY <= toY[id] +20 && myZ >= toZ[id] -20 && myZ <= toZ[id] +20)){ //Is the NPC within navigating range?
  85.              event.npc.say("I'm moving to " + toX[id] + ", " + toY[id] + " ," + toZ[id] + ".");
  86. isNav = event.npc.isNavigating();
  87. if (isNav == false){
  88.              event.npc.navigateTo(toX[id],toY[id],toZ[id],speed);
  89.                                                  }
  90.              event.npc.timers.stop(2);
  91.              event.npc.timers.start(2, 20, false);
  92.              }
  93.              else{
  94.                  event.npc.say("I'm lost!");
  95.                  check = true;
  96.                  testc = 24000;
  97.                 for(var c = 0; c < sched.length; c++){
  98.                 if(sched[c] > -1 && worldtime - sched[c] > -1 && worldtime - sched[c] < testc){
  99.                 testc = worldtime - sched[c];
  100.                 id = c;
  101.             } // end if statement
  102.             } // End for loop
  103. for(var i =id; i < sched.length; i++){
  104. if(sched[i]>sched[id]){
  105. nextId = i;
  106. break;}
  107. }
  108. if (check = false){
  109. for (var n = id+1; n < nextId; n++){
  110. if(myX >= toX[n] -20 && myX <= toX[n] +20 && myY >= toY[n] -20 && myY <= toY[n] +20 && myZ >= toZ[n] -20 && myZ <= toZ[n] +20){
  111. id = n;
  112. check = false;
  113. break;
  114. }
  115. }
  116. }else{
  117. event.npc.setPosition(toX[id],toY[id],toZ[id]);
  118. check = false;
  119. }
  120.                  event.npc.timers.stop(2);
  121.                  event.npc.timers.start(2, 20, false);
  122.              
  123.                  }
  124.          }
  125.     }
  126.     else //isStopped==true; Aggression is inconsistent, and character may continue navigating mid-fight, or keep fighting.
  127.     {
  128.     event.npc.timers.stop(2);
  129.     event.npc.timers.start(2, 100, false);
  130.     }
  131. }
  132. else {
  133. event.npc.say("I'm where I need to be.");
  134. event.npc.timers.stop(2);
  135. event.npc.timers.start(2, 200, false); //slow this down once code done.
  136.     }
  137.   }   //End world time check
  138. } //end timer events
  139.  
  140. //Not happy with this code. Checks are too resource heavy. Main issue is that if the NPC gets stuck at a point they will constantly try to nav to that point and their schedule will not update.
  141. //Working on MK III, another rewrite, will use time blocks that are easier to index in the array, and force teleport the character if they are stuck. Will add arrays for time and animations too.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement