Advertisement
ipsBruno

(Pawn) MoveNPC

Oct 27th, 2013
233
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.08 KB | None | 0 0
  1. /*
  2.  *
  3.  * @MOVE NPC
  4.  * @Extract com INPC.inc
  5.  * @Author: Bruno da Silva
  6.  * @Url: ipsbr.net
  7.  *
  8. */
  9.  
  10. stock MoveNPC(npc, Float:toX, Float:toY, Float:toZ, Float: speed) {
  11.  
  12.         toZ += Z_CORRECTION;
  13.  
  14.         if(speed < 0.0005) {
  15.                 #if defined DEBUG
  16.                 printf("Erro: NPC %d está muito lento (vel %f)", npc,speed);
  17.                 #endif
  18.                 return false;
  19.         }
  20.  
  21.         static Float: pos[4];
  22.  
  23.  
  24.         if(!GetPlayerPos(npc, pos[0] , pos[1] , pos[2])) return false;
  25.  
  26.         static Float: vel[2], Float: distancia;
  27.  
  28.         pos[3] = atan2( toY - pos[1], toX - pos[0] );
  29.  
  30.         vel[0]= (speed * floatcos(pos[3], degrees));
  31.         vel[1]= (speed * floatsin(pos[3], degrees));
  32.  
  33.         distancia = floatsqroot( (toX - pos[0]) * ( toX - pos[0] ) + ( toY - pos[1] ) * ( toY - pos[1] ) + ( toZ - pos[2] ) * ( toZ - pos[2] ) );
  34.  
  35.         if(distancia < 1.0) {
  36.                 #if defined DEBUG
  37.                 printf("Erro: O NPC está muito próximo do destino (%f metros)", npc, distancia);
  38.                 #endif
  39.                 return false;
  40.         }
  41.  
  42.         static tempo, blocos;
  43.  
  44.         tempo = floatround( distancia / speed );
  45.  
  46.         if(!tempo) {
  47.                 #if defined DEBUG
  48.                 printf("Erro: NPC %d está demorando muito pouco tempo para chegar no destino (tempo %d)", npc,tempo);
  49.                 #endif
  50.                 return false;
  51.         }
  52.  
  53.  
  54.         blocos= tempo / FOOT_RATE;
  55.  
  56.         if(!blocos) {
  57.                 #if defined DEBUG
  58.                 printf("Erro: NPC %d não tem nenhum caminho para ser calculado (%d blocos)", npc,blocos);
  59.                 #endif
  60.                 return false;
  61.         }
  62.  
  63.  
  64.  
  65.         static Float: parteX, Float: parteY, Float: parteZ, Float: w;
  66.  
  67.         tempo = tempo / blocos;
  68.  
  69.         parteX = pos[0];
  70.         parteX = pos[1];
  71.         parteZ = pos[2];
  72.  
  73.         Euler2Quat( 90 - pos[3]  , w, parteX, parteY, parteZ);
  74.  
  75.         SetNPCAngle(npc, w, parteX, parteY, parteZ);
  76.  
  77.         parteX = (toX-pos[0])/blocos;
  78.         parteY = (toY-pos[1])/blocos;
  79.         parteZ = (toZ-pos[2])/blocos;
  80.  
  81.  
  82.         SetNPCVelocity(npc, vel[0], vel[1], 0.0);
  83.  
  84.         SetNPCUpDownKey(npc, KEYUP);
  85.  
  86.         CreateBuild(npc, pos[0], pos[1], pos[2]);
  87.  
  88.         static i ;
  89.  
  90.         for(  i = 0;  i != blocos; ++ i) {
  91.                 SetNPCPos(npc, pos[0] + (i * parteX), pos[1] + (i * parteY), (pos[2] + (i * parteZ)));
  92.                 SetNPCTime(npc, FOOT_RATE * i);
  93.                 SaveBuild(npc);
  94.  
  95.         }
  96.  
  97.         SetNPCUpDownKey(npc, 0);
  98.         SetNPCTime(npc, FOOT_RATE * (blocos + 1));
  99.         SetNPCVelocity(npc, 0.0, 0.0, 0.0);
  100.         SaveBuild(npc);
  101.  
  102.         FinishBuild(npc);
  103.  
  104.         PlayBuild(npc);
  105.  
  106.         return true;
  107. }
  108.  
  109.  
  110. stock Euler2Quat(Float: angle, &Float:w, &Float:x, &Float:y, &Float:z) {
  111.  
  112.         static
  113.         Float:s
  114.         ;
  115.  
  116.         s = (angle *(3.14/180)) / 2;
  117.  
  118.         z = floatsin(s);
  119.  
  120.         x *= z;
  121.         y *= z;
  122.  
  123.  
  124.         w = floatcos(s);
  125.  
  126.         return true;
  127. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement