Advertisement
whiplk

[INCLUDE] - iNPC(teste)

Nov 23rd, 2013
104
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Pawn 4.96 KB | None | 0 0
  1. const Float: CORRER = 0.0084;
  2. const Float: COUPE = 0.006;
  3. const Float: ANDAR = 0.0016;
  4.  
  5. const FOOT_RATE = 200;
  6.  
  7. const Float: Z_CORRECTION = 0.075;
  8.  
  9. const CALL_SYNC = 10;
  10.  
  11. native SetNPCVelocity(npc, Float:x, Float:y, Float:z);
  12. native SetNPCPos(npc, Float:x, Float:y, Float:z);
  13. native CreateBuild(npc, Float:x, Float:y, Float:z);
  14. native SaveBuild(npc);
  15. native SetNPCTime(npc, time);
  16. native SetNPCKey(npc, key);
  17. native GetNPCKey(npc);
  18.  
  19. native SetNPCArmour(npc, armour);
  20. native GetNPCArmour(npc);
  21.  
  22. native SetNPCWeapon(npc, armour);
  23. native GetNPCWeapon(npc);
  24.  
  25. native SetNPCHealth(npc, health);
  26. native GetNPCHealth(npc);
  27.  
  28. native SetNPCSpecialAction(npc, anime);
  29. native GetNPCSpecialAction(npc);
  30.  
  31. native SetNPCAngle(npc, Float:w, Float:x, Float:y, Float:z);
  32.  
  33. #define KEYUP       0x00FF
  34. #define KEYDOWN     0xFF00
  35.  
  36. stock IsNPCConnected[MAX_PLAYERS char];
  37.  
  38. native SetNPCUpDownKey(npc,key) ;
  39.  
  40. native FinishBuild(npc);
  41.  
  42. stock PlayBuild(npc) return SendClientMessage(npc, -1, "L");
  43.  
  44. stock StopBuild(npc) return SendClientMessage(npc, -1, "U");
  45.  
  46. stock SetNPCRepeat(npc, bool: repeat)     return SendClientMessage(npc, -1,  repeat ? "R" : "N" );
  47.  
  48. stock CreateINPC(npcname[]) {
  49.  
  50.     static i ;
  51.    
  52.     for( i = 0; i != MAX_PLAYERS; i++) {
  53.         if(!IsPlayerNPC(i) && !IsPlayerConnected(i) && !IsNPCConnected {i}) {
  54.             IsNPCConnected {i} = 1;
  55.             break;
  56.         }
  57.     }
  58.    
  59.     ConnectNPC(npcname, "INPC");
  60.  
  61.     return i;
  62. }
  63.  
  64. stock DestroyINPC(npcid) {
  65.  
  66.     StopBuild(npc);
  67.     Kick(npc);
  68. }
  69.  
  70. stock bool: IsNPCArmed(npc) return !!GetPlayerWeapon(npc);
  71.  
  72. stock SetNPCVirtualWorld(npc, virtual) return SetPlayerVirtualWorld(npc, virtual);
  73.  
  74. stock GetNPCVirtualWorld(npc) return GetPlayerVirtualWorld(npc);
  75.  
  76. stock SetNPCInterior(npc, inte) return SetPlayerInterior(npc, inte);
  77. stock GetNPCInterior(npc) return GetPlayerInterior(npc);
  78.  
  79. stock GetNPCSkin(npc) return GetPlayerSkin(npc);
  80.  
  81. stock IsPlayerNearOfNPC(playerid, npc , Float:dis) {
  82.  
  83.     static Float:x, Float:y, Float:z;
  84.    
  85.     GetNPCPos(npc, x , y ,z);
  86.    
  87.     return IsPlayerInRangeOfPoint(playerid, dis, x ,y ,z );
  88. }
  89.  
  90.  
  91. stock MoveNPC(npc, Float:toX, Float:toY, Float:toZ, Float: speed) {
  92.  
  93.     toZ += Z_CORRECTION;
  94.    
  95.     if(speed < 0.0005) {
  96.         #if defined DEBUG
  97.         printf("Erro: NPC %d está muito lento (vel %f)", npc,speed);
  98.         #endif
  99.         return false;
  100.     }
  101.  
  102.     static Float: pos[4];
  103.  
  104.  
  105.     if(!GetPlayerPos(npc, pos[0] , pos[1] , pos[2])) return false;
  106.  
  107.     static Float: vel[2], Float: distancia;
  108.  
  109.     pos[3] = atan2( toY - pos[1], toX - pos[0] );
  110.  
  111.     vel[0]= (speed * floatcos(pos[3], degrees));
  112.     vel[1]= (speed * floatsin(pos[3], degrees));
  113.  
  114.     distancia = floatsqroot( (toX - pos[0]) * ( toX - pos[0] ) + ( toY - pos[1] ) * ( toY - pos[1] ) + ( toZ - pos[2] ) * ( toZ - pos[2] ) );
  115.  
  116.     if(distancia < 1.0) {
  117.         #if defined DEBUG
  118.         printf("Erro: O NPC está muito próximo do destino (%f metros)", npc, distancia);
  119.         #endif
  120.         return false;
  121.     }
  122.  
  123.     static tempo, blocos;
  124.  
  125.     tempo = floatround( distancia / speed );
  126.  
  127.     if(!tempo) {
  128.         #if defined DEBUG
  129.         printf("Erro: NPC %d está demorando muito pouco tempo para chegar no destino (tempo %d)", npc,tempo);
  130.         #endif
  131.         return false;
  132.     }
  133.  
  134.  
  135.     blocos= tempo / FOOT_RATE;
  136.  
  137.     if(!blocos) {
  138.         #if defined DEBUG
  139.         printf("Erro: NPC %d não tem nenhum caminho para ser calculado (%d blocos)", npc,blocos);
  140.         #endif
  141.         return false;
  142.     }
  143.  
  144.  
  145.  
  146.     static Float: parteX, Float: parteY, Float: parteZ, Float: w;
  147.  
  148.     tempo = tempo / blocos;
  149.  
  150.     parteX = pos[0];
  151.     parteX = pos[1];
  152.     parteZ = pos[2];
  153.  
  154.     Euler2Quat( 90 - pos[3]  , w, parteX, parteY, parteZ);
  155.  
  156.     SetNPCAngle(npc, w, parteX, parteY, parteZ);
  157.  
  158.     parteX = (toX-pos[0])/blocos;
  159.     parteY = (toY-pos[1])/blocos;
  160.     parteZ = (toZ-pos[2])/blocos;
  161.  
  162.  
  163.     SetNPCVelocity(npc, vel[0], vel[1], 0.0);
  164.  
  165.     SetNPCUpDownKey(npc, KEYUP);
  166.  
  167.     CreateBuild(npc, pos[0], pos[1], pos[2]);
  168.  
  169.     static i ;
  170.  
  171.     for(  i = 0;  i != blocos; ++ i) {
  172.         SetNPCPos(npc, pos[0] + (i * parteX), pos[1] + (i * parteY), (pos[2] + (i * parteZ)));
  173.         SetNPCTime(npc, FOOT_RATE * i);
  174.         SaveBuild(npc);
  175.  
  176.     }
  177.  
  178.     SetNPCUpDownKey(npc, 0);
  179.     SetNPCTime(npc, FOOT_RATE * (blocos + 1));
  180.     SetNPCVelocity(npc, 0.0, 0.0, 0.0);
  181.     SaveBuild(npc);
  182.  
  183.     FinishBuild(npc);
  184.  
  185.     PlayBuild(npc);
  186.  
  187.     return true;
  188. }
  189.  
  190. #define IsNPCNearOfPlayer IsPlayerNearOfNPC
  191.  
  192. stock SetNPCSkin(npc, skin) return SetPlayerSkin(npc, skin);
  193.  
  194. stock SetNPCAngleToXYZ(npc, Float:x2, Float:y2, Float:z2) {
  195.  
  196.     static Float: x1, Float: y1 , Float: z1, Float: w, Float: a;
  197.  
  198.     if(!GetPlayerPos(npc, x1 , y1 , z1)) return false;
  199.  
  200.     a = atan2(y2 - y1 , x2 - x1);
  201.    
  202.     while(a < 0)        a += 360.0;
  203.     while(a > 360)      a -= 360.0;
  204.  
  205.     Euler2Quat( 90.0 - angle, w, x2, y2, z2);
  206.  
  207.     SetNPCAngle(npc, w, x2, y2, z2);
  208.  
  209.     return true;
  210. }
  211.  
  212.  
  213. stock Euler2Quat(Float: angle, &Float:w, &Float:x, &Float:y, &Float:z) {
  214.  
  215.     static
  216.         Float:s
  217.     ;
  218.  
  219.     s = (angle *(3.14/180)) / 2;
  220.  
  221.     z = floatsin(s);
  222.  
  223.     x *= z;
  224.     y *= z;
  225.  
  226.  
  227.     w = floatcos(s);
  228.  
  229.     return true;
  230. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement