Advertisement
ipsBruno

(Pawn) RNPC Seguir Jogador

Jul 20th, 2014
414
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Pawn 5.06 KB | None | 0 0
  1. #include a_samp
  2. #include rnpc
  3. #include mapandreas
  4.  
  5. #define MAX_ROTA 500
  6. #undef MAX_PLAYERS
  7. #define MAX_PLAYERS 15
  8.  
  9.  
  10. #define VELOCIDADE 0.005
  11.  
  12. new Float:RotasAlvoX[MAX_PLAYERS][MAX_PLAYERS][MAX_ROTA];
  13. new Float:RotasAlvoY[MAX_PLAYERS][MAX_PLAYERS][MAX_ROTA];
  14. new Float:RotasAlvoZ[MAX_PLAYERS][MAX_PLAYERS][MAX_ROTA];
  15.  
  16. new seguindo[MAX_PLAYERS] = {-1, ...};
  17.  
  18. new contagemSeguindo[MAX_PLAYERS];
  19. new casaAtualSeguindo[MAX_PLAYERS];
  20.  
  21. public OnGameModeInit() {
  22.     MapAndreas_Init(2);
  23.     AddPlayerClass(144, 1958.3783,1343.1572,15.3746, 0.0, 0, 0, 0, 0, 0, 0);
  24.     AddPlayerClass(056, 1958.3783,1343.1572,15.3746, 0.0, 0, 0, 0, 0, 0, 0);
  25.     SetTimer("UpdatePlayers", 700, true);
  26.  
  27.     SetTimer("checarBOT", 1000, true);
  28.     return true;
  29. }
  30.  
  31. main() {
  32.  
  33. }
  34.  
  35. public OnGameModeExit(){
  36.  
  37.  
  38.  
  39.  
  40.     return true;
  41. }
  42.  
  43.  
  44.  
  45. public OnPlayerCommandText(playerid, cmdtext[]) {
  46.  
  47.     if(cmdtext[1] == 'c') {
  48.         ConnectRNPC("TestNpc");
  49.     }
  50.     return true;
  51. }
  52.  
  53.  
  54. public OnPlayerRequestSpawn(playerid) {
  55.  
  56.     return true;
  57. }
  58.  
  59. public OnPlayerDeath(playerid, killerid, reason)
  60. {
  61.     SetPVarInt(playerid, "sapawn", 0);
  62.     return true;
  63. }
  64. public OnPlayerSpawn(playerid) {
  65.  
  66.     SetPlayerPos(playerid, 1759.0189,-1898.1260,13.5622); // todos jogadores nasceram aqui
  67.     SetPVarInt(playerid, "sapawn", 1);
  68.     return true;
  69. }
  70. public OnPlayerConnect(playerid) {
  71.  
  72.     return true;
  73. }
  74.  
  75. public OnPlayerRequestClass(playerid,classid) {
  76.     return true;
  77. }
  78.  
  79. UpdatePlayers();
  80. public UpdatePlayers() {
  81.  
  82.     for(new i; i < MAX_PLAYERS; i++) {
  83.         if(IsPlayerConnected(i)) OnPlayerUpdateEx(i);
  84.     }
  85.     return true;
  86. }
  87.  
  88. OnPlayerUpdateEx(playerid);
  89. public OnPlayerUpdateEx(playerid) {
  90.  
  91.     if(IsPlayerNPC(playerid) || !GetPVarInt(playerid, "sapawn")) return true;
  92.  
  93.  
  94.     static Float:x, Float:y, Float:z;
  95.     GetPlayerPos(playerid, x, y, z);
  96.  
  97.     for(new i; i < MAX_PLAYERS; i++) {
  98.         if(IsPlayerNPC(i) && IsPlayerInRangeOfPoint(i, 60.0, x, y, z)) {
  99.             CalcularRota(i, playerid);
  100.         }
  101.     }
  102.  
  103.  
  104.  
  105.  
  106.     return true;
  107.  
  108. }
  109.  
  110.  
  111. /*
  112. * Algorítimo para desviar edifícios
  113. * Criado por Bruno da Silva
  114. * Começado 04:24 20/07/2014
  115. */
  116.  
  117.  
  118. checarBOT();
  119. public checarBOT() {
  120.  
  121.     for(new npcid; npcid < MAX_PLAYERS; npcid++) {
  122.  
  123.         if(!IsPlayerNPC(npcid) || seguindo[npcid] == -1) continue;
  124.  
  125.         new playerid = seguindo[npcid];
  126.  
  127.         static Float: x, Float:y, Float:z;
  128.  
  129.         GetPlayerPos(playerid, x,y,z);
  130.  
  131.         RotasAlvoX[playerid][npcid][contagemSeguindo[npcid]] = x;
  132.         RotasAlvoY[playerid][npcid][contagemSeguindo[npcid]] = y;
  133.         RotasAlvoZ[playerid][npcid][contagemSeguindo[npcid]] = z;
  134.  
  135.         contagemSeguindo[npcid]++;
  136.  
  137.         if( contagemSeguindo[npcid] == MAX_ROTA ) {
  138.             contagemSeguindo[npcid] = 0;
  139.         }
  140.  
  141.     }
  142.  
  143. }
  144.  
  145. stock CalcularRota(npcid, playerid) {
  146.  
  147.     static Float: x, Float:y, Float:z, Float: angle, Float: pz, Float: px, Float:py;
  148.  
  149.     GetPlayerPos(npcid, x,y,z);
  150.     GetPlayerFacingAngle(npcid, angle);
  151.  
  152.     if(seguindo[npcid] == -1) {
  153.         seguindo[npcid] = playerid;
  154.  
  155.         SendClientMessage(playerid, -1, "Tá te seguindo");
  156.  
  157.         GetPlayerPos(playerid, px,py,pz);
  158.  
  159.         MoveRNPC(npcid, px,py,pz, 0.007);
  160.  
  161.         contagemSeguindo[npcid] = 0;
  162.         casaAtualSeguindo[npcid] = 0;
  163.     }
  164.     else {
  165.         GetPlayerPos(seguindo[npcid], x,y,z);
  166.  
  167.         if(casaAtualSeguindo[npcid] < contagemSeguindo[npcid]) {
  168.             /*
  169.             if(Poligonal(npcid, seguindo[npcid])) {
  170.                 contagemSeguindo[npcid] = 0;
  171.                 casaAtualSeguindo[npcid] = 0;
  172.                 SendClientMessage(0, -1, "INDO RETO");
  173.                 MoveRNPC(npcid,x,y,z, VELOCIDADE);
  174.             }
  175.             */
  176.  
  177.             MoveRNPC(npcid, RotasAlvoX[playerid][npcid][casaAtualSeguindo[npcid]] ,RotasAlvoY[playerid][npcid][casaAtualSeguindo[npcid]],RotasAlvoZ[playerid][npcid][casaAtualSeguindo[npcid]], VELOCIDADE);
  178.             casaAtualSeguindo[npcid]++;
  179.  
  180.             if( casaAtualSeguindo[npcid] == MAX_ROTA ) {
  181.                 casaAtualSeguindo[npcid] = 0;
  182.             }
  183.         }
  184.  
  185.         if(!IsPlayerInRangeOfPoint(npcid, 60.0, x, y, z)) {
  186.             SendClientMessage(seguindo[npcid], -1, "Parou de te segui");
  187.  
  188.             contagemSeguindo[npcid] = 0;
  189.             casaAtualSeguindo[npcid] = 0;
  190.  
  191.             return seguindo[npcid] = -1;
  192.         }
  193.  
  194.     }
  195.  
  196.  
  197.  
  198.     return true;
  199.  
  200. }
  201.  
  202.  
  203. stock Poligonal(npcid, playerid) {
  204.  
  205.     static Float:nPos[3], Float:pPos[3];
  206.  
  207.     GetPlayerPos(npcid,nPos[0],nPos[1],nPos[2]);
  208.     GetPlayerPos(playerid,pPos[0],pPos[1],pPos[2]);
  209.  
  210.  
  211.     if(nPos[2] != pPos[2]) return false;
  212.  
  213.     if(nPos[0] > pPos[0]) {
  214.  
  215.         for( ; nPos[0] > pPos[0]; nPos[0] -= 0.66) {
  216.             if(nPos[1] > pPos[1]) {
  217.                 for( ; nPos[1] > pPos[1]; nPos[1] -= 0.66) {
  218.                     MapAndreas_FindZ_For2DCoord(nPos[0], nPos[1], pPos[2]);
  219.                     if(nPos[2] != pPos[2]) return false;
  220.                 }
  221.             }
  222.             else {
  223.                 for( ; nPos[1] < pPos[1]; nPos[1] += 0.66) {
  224.                     MapAndreas_FindZ_For2DCoord(nPos[0], nPos[1], pPos[2]);
  225.                     if(nPos[2] != pPos[2]) return false;
  226.                 }
  227.             }
  228.         }
  229.     }
  230.     else {
  231.         for( ; nPos[0] < pPos[0]; nPos[0] += 0.66) {
  232.             if(nPos[1] > pPos[1]) {
  233.                 for( ; nPos[1] > pPos[1]; nPos[1] -= 0.66) {
  234.                     MapAndreas_FindZ_For2DCoord(nPos[0], nPos[1], pPos[2]);
  235.                     if(nPos[2] != pPos[2]) return false;
  236.                 }
  237.             }
  238.  
  239.  
  240.             for( ; nPos[1] < pPos[1]; nPos[1] += 0.66) {
  241.                 MapAndreas_FindZ_For2DCoord(nPos[0], nPos[1], pPos[2]);
  242.                 if(nPos[2] != pPos[2]) return false;
  243.             }
  244.         }
  245.     }
  246.     return true;
  247. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement