1. /*                 
  2.                     ********************************
  3.                         rLibrary - Radar Library
  4.                     ********************************
  5. Descrição:
  6.     Permite implantar radares de velocidade pela cidade.
  7.     Quando um jogador passar pelo radar acima da velocidade, será pego pelo radar.
  8. Versão:
  9.     2.3
  10. Developer:
  11.     Synchr0.
  12. ChangeLOG:
  13.     09/02/2012:
  14.         LSR_OnPlayerConnect() "Removido".
  15.     18/06/2011:
  16.         Correções minimas.
  17.     30/12/2010:
  18.         Novas funções de attach.
  19.     28/12/2010:
  20.         Novas funções.
  21.     23/12/2010:
  22.         Flash alternativo.
  23.         Novo parâmetro na callback OnPlayerEnterRadar.
  24.     20/11/2010:
  25.         Alterações no Timer.
  26.     19/09/2010:
  27.         CallBack OnPlayerEnterRadar agora retorna velocidade em que o jogador passou no radar.
  28.     18/09/2010:
  29.         Primeira versão
  30. Natives:
  31.     native CreateRadar(Float:x, Float:y, Float:z, speedmax, radiacao, pickup, ativado, virtualword = -1);
  32.     native DestroyRadar(lrid);
  33.     native RadarExiste(lrid);
  34.     native SetRadarPos(lrid, Float:x, Float:y, Float:z);
  35.     native SetRadarVirtualWorld(lrid, virtualworld);
  36.     native SetRadarAtivado(lrid, toggle);
  37.     native SetRadarVelocidadeMax(lrid, velocidade);
  38.     native SetRadarRadiacao(lrid, Float:radiacao);
  39.     native SetRadarPickup(lrid, pickupid);
  40.     native ObterRadarPos(lrid, &Float:x, &Float:y, &Float:z);
  41.     native ObterRadarVirtualWorld(lrid);
  42.     native LoadStaticRadarsFromFile(const filename[]);
  43.     native GetPlayerSpeed(playerid, bool:velo);
  44.     native GetVehicleSpeed(vehicleid);
  45.     native AttachRadarToPlayer(playerid, velocidade);
  46.     native DettachRadarToPlayer(playerid);
  47.     native IsPlayerRadarAttached(playerid);
  48. */
  49. #include "a_samp"
  50.  
  51. #define MAX_Radar               100
  52. #define LSR_TIME_CHECK          1500
  53. #define ObterVelocidadeJogador  GetPlayerSpeed
  54. #define ObterVelocidadeVeiculo  GetVehicleSpeed
  55.  
  56. enum lrdef
  57. {
  58.     LSR_VW,
  59.     LSR_OID,
  60.     Float:LSR_X,
  61.     Float:LSR_Y,
  62.     Float:LSR_Z,
  63.     LSR_speedmax,
  64.     LSR_radiacao,
  65.     LSR_pickup,
  66.     LSR_ativado
  67. };
  68. static  LSR_Timer, LSR_Total, LSR_Radar[MAX_Radar][lrdef];
  69.  
  70. #define LSR_CheckTimerAd() if(!LSR_Timer) LSR_Timer = SetTimer("CheckRadar", LSR_TIME_CHECK, 1)
  71. #define LSR_CheckTimerRe() if(!LSR_Total){KillTimer(LSR_Timer); LSR_Timer = 0;}
  72.  
  73. forward CheckRadar();
  74. forward HideRadar(playerid);
  75. forward OnPlayerEnterRadar(playerid, speed, radarid);
  76. forward UseFlashRadar();
  77. forward MoverPickup(lrid,Float:x,Float:y,Float:z);
  78.  
  79. new Text:Flash;
  80. new bool:UseFlash;
  81.  
  82. stock CreateRadar(Float:x, Float:y, Float:z, speedmax, radiacao, pickup, ativado, virtualword = -1)
  83. {
  84.     new bid = LSR_ProcurarIDLivre();
  85.     if(bid == -1)
  86.     {
  87.         printf("[rLibrary:] Limite de radares exedido! (Max:%d) Adicione um valor no MAX_RADAR ou apague algum...", MAX_Radar);
  88.         return 0;
  89.     }
  90.     LSR_Radar[bid][LSR_OID] = CreatePickup(pickup,1,x,y,z+2,-1);
  91.     LSR_Radar[bid][LSR_X] = x;
  92.     LSR_Radar[bid][LSR_Y] = y;
  93.     LSR_Radar[bid][LSR_Z] = z;
  94.     LSR_Radar[bid][LSR_speedmax] = speedmax;
  95.     LSR_Radar[bid][LSR_VW] = virtualword;
  96.     LSR_Radar[bid][LSR_radiacao] = radiacao;
  97.     LSR_Radar[bid][LSR_pickup] = pickup;
  98.     LSR_Radar[bid][LSR_ativado] = ativado;
  99.     LSR_CheckTimerAd();
  100.     LSR_Total++;
  101.     return bid;
  102. }
  103.  
  104. stock DestroyRadar(lrid)
  105. {
  106.     if(!LSR_Radar[lrid][LSR_OID]) return 0;
  107.     LSR_Total--;
  108.     DestroyPickup(LSR_Radar[lrid][LSR_pickup]);
  109.     LSR_Radar[lrid][LSR_OID] = 0;
  110.     LSR_CheckTimerRe()
  111.     return 1;
  112. }
  113.  
  114. stock RadarExiste(lrid) return (!LSR_Radar[lrid][LSR_OID]) ? 0 : 1;
  115.  
  116. stock SetRadarPos(lrid, Float:x, Float:y, Float:z)
  117. {
  118.     if(!LSR_Radar[lrid][LSR_OID]) return 0;
  119.     LSR_Radar[lrid][LSR_X] = x;
  120.     LSR_Radar[lrid][LSR_Y] = y;
  121.     LSR_Radar[lrid][LSR_Z] = z;
  122.     return MoverPickup(LSR_Radar[lrid][LSR_OID], x, y, z);
  123. }
  124.  
  125. stock SetRadarAtivado(lrid, toggle)
  126. {
  127.     if(!LSR_Radar[lrid][LSR_OID]) return 0;
  128.     if(toggle == 1 || toggle == true){LSR_Radar[lrid][LSR_ativado] = 1;}
  129.     if(toggle == 0 || toggle == false){LSR_Radar[lrid][LSR_ativado] = 0;}
  130.     return MoverPickup(LSR_Radar[lrid][LSR_OID], x, y, z);
  131. }
  132.  
  133. stock SetRadarVelocidadeMax(lrid, velocidade)
  134. {
  135.     if(!LSR_Radar[lrid][LSR_OID]) return 0;
  136.     return LSR_Radar[lrid][LSR_speedmax] = velocidade;
  137. }
  138.  
  139. stock SetRadarRadiacao(lrid, Float:radiacao)
  140. {
  141.     if(!LSR_Radar[lrid][LSR_OID]) return 0;
  142.     return LSR_Radar[lrid][LSR_radiacao] = radiacao;
  143. }
  144.  
  145.  
  146. stock SetRadarPickup(lrid, pickupid)
  147. {
  148.     if(!LSR_Radar[lrid][LSR_OID]) return 0;
  149.     LSR_Radar[lrid][LSR_pickup] = pickupid;
  150.     return MoverPickup(lrid, LSR_Radar[lrid][LSR_X], LSR_Radar[lrid][LSR_Y], LSR_Radar[lrid][LSR_Z]+2);
  151. }
  152.  
  153. public MoverPickup(lrid,Float:x,Float:y,Float:z)
  154. {
  155.     if(LSR_Radar[lrid][LSR_OID])
  156.     {
  157.         DestroyPickup(LSR_Radar[lrid][LSR_OID]);
  158.         LSR_Radar[lrid][LSR_X] = x;
  159.         LSR_Radar[lrid][LSR_Y] = y;
  160.         LSR_Radar[lrid][LSR_Z] = z;
  161.         CreatePickup(LSR_Radar[lrid][LSR_pickup], 1, x, y, z, -1);
  162.         return 1;
  163.     }
  164.     return 0;
  165. }
  166.  
  167. stock SetRadarVirtualWorld(lrid, virtualworld)
  168. {
  169.     if(!LSR_Radar[lrid][LSR_OID]) return 0;
  170.     LSR_Radar[lrid][LSR_VW] = virtualworld;
  171.     DestroyPickup(LSR_Radar[lrid][LSR_OID]);
  172.     new x = LSR_Radar[lrid][LSR_X];
  173.     new y = LSR_Radar[lrid][LSR_Y];
  174.     new z = LSR_Radar[lrid][LSR_Z];
  175.     CreatePickup(LSR_Radar[lrid][LSR_pickup], 1, x, y, z, virtualworld);
  176.     return 1;
  177. }
  178.  
  179. stock ObterRadarPos(lrid, &Float:x, &Float:y, &Float:z)
  180. {
  181.     if(!LSR_Radar[lrid][LSR_OID])
  182.     {
  183.         x = 0.0;
  184.         y = 0.0;
  185.         z = 0.0;
  186.     }
  187.     x = LSR_Radar[lrid][LSR_X];
  188.     y = LSR_Radar[lrid][LSR_Y];
  189.     z = LSR_Radar[lrid][LSR_Z];
  190. }
  191.  
  192. stock ObterRadarVirtualWorld(lrid)
  193. {
  194.     if(!LSR_Radar[lrid][LSR_OID]) return 0;
  195.     return LSR_Radar[lrid][LSR_VW];
  196. }
  197.  
  198. public CheckRadar()
  199. {
  200.     for(new i = 0; i < MAX_PLAYERS; i++)
  201.     {
  202.         if(GetPVarInt(i, "RadarAttached") == 1){RadarForPlayer(i, GetPVarInt(i, "RadarAttachedSpeed"), 999);}
  203.         for(new b = 1; b <= LSR_Total; b++)
  204.         {
  205.             if(LSR_Radar[b][LSR_OID])
  206.             {
  207.                 if(LSR_Radar[b][LSR_ativado] == 1)
  208.                 {
  209.                     if(LSR_Radar[b][LSR_VW] == -1 || GetPlayerVirtualWorld(i) == LSR_Radar[b][LSR_VW])
  210.                     {
  211.                         if(IsPlayerInRangeOfPoint(i, LSR_Radar[b][LSR_radiacao], LSR_Radar[b][LSR_X], LSR_Radar[b][LSR_Y], LSR_Radar[b][LSR_Z]))
  212.                         {
  213.                             if(GetPlayerState(i) == PLAYER_STATE_DRIVER)
  214.                             {
  215.                                 RadarForPlayer(i, LSR_Radar[b][LSR_speedmax], LSR_Radar[b][LSR_OID]);
  216.                             }  
  217.                         }
  218.                     }
  219.                 }
  220.             }
  221.         }
  222.     }
  223. }
  224.  
  225. stock LSR_ProcurarIDLivre()
  226. {
  227.     for(new b = 1; b < MAX_Radar; b++) if(!LSR_Radar[b][LSR_OID]) return b;
  228.     return -1;
  229. }
  230.  
  231. stock GetPlayerSpeed(playerid, bool:velo)
  232. {
  233.     new Float:Vx,Float:Vy,Float:Vz,Float:rtn;
  234.     if(IsPlayerInAnyVehicle(playerid)) GetVehicleVelocity(GetPlayerVehicleID(playerid),Vx,Vy,Vz); else GetPlayerVelocity(playerid,Vx,Vy,Vz);
  235.     rtn = floatsqroot(floatabs(floatpower(Vx + Vy + Vz,2)));
  236.     return velo?floatround(rtn * 100 * 1.61):floatround(rtn * 100);
  237. }
  238.  
  239. stock GetVehicleSpeed(vehicleid)
  240. {
  241.     new Float:X, Float:Y, Float:Z;
  242.     GetVehicleVelocity(vehicleid, X, Y, Z);
  243.     return floatround(floatsqroot(X * X + Y * Y + Z * Z) * 180);
  244. }
  245.  
  246. stock token_by_delim(const string[], return_str[], delim, start_index)
  247. {
  248.     new x=0;
  249.     while(string[start_index] != EOS && string[start_index] != delim) {
  250.         return_str[x] = string[start_index];
  251.         x++;
  252.         start_index++;
  253.     }
  254.     return_str[x] = EOS;
  255.     if(string[start_index] == EOS) start_index = (-1);
  256.     return start_index;
  257. }
  258.  
  259. stock LoadStaticRadarsFromFile(const filename[])
  260. {
  261.     new File:file_ptr;
  262.     new line[256];
  263.     new var_from_line[64];
  264.     new Float:SpawnX;
  265.     new Float:SpawnY;
  266.     new Float:SpawnZ;
  267.     new SpeedMax;
  268.     new Radiation, Pickup;
  269.     new Ativado, VirtualWorld;
  270.     new index;
  271.     new radars_loaded;
  272.  
  273.     file_ptr = fopen(filename,filemode:io_read);
  274.     if(!file_ptr) return 0;
  275.  
  276.     radars_loaded = 0;
  277.  
  278.     while(fread(file_ptr,line,256) > 0)
  279.     {
  280.         index = 0;
  281.  
  282.         // Read X, Y, Z, Rotation
  283.         index = token_by_delim(line,var_from_line,',',index);
  284.         if(index == (-1)) continue;
  285.         SpawnX = floatstr(var_from_line);
  286.  
  287.         index = token_by_delim(line,var_from_line,',',index+1);
  288.         if(index == (-1)) continue;
  289.         SpawnY = floatstr(var_from_line);
  290.  
  291.         index = token_by_delim(line,var_from_line,',',index+1);
  292.         if(index == (-1)) continue;
  293.         SpawnZ = floatstr(var_from_line);
  294.  
  295.         // Read Speed Max
  296.         index = token_by_delim(line,var_from_line,',',index+1);
  297.         if(index == (-1)) continue;
  298.         SpeedMax = strval(var_from_line);
  299.  
  300.         // Read Radiation, Pickup
  301.         index = token_by_delim(line,var_from_line,',',index+1);
  302.         if(index == (-1)) continue;
  303.         Radiation = strval(var_from_line);
  304.        
  305.         index = token_by_delim(line,var_from_line,',',index+1);
  306.         if(index == (-1)) continue;
  307.         Pickup = strval(var_from_line);
  308.        
  309.         //Read Ativado, VirtualWorld
  310.         index = token_by_delim(line,var_from_line,',',index+1);
  311.         if(index == (-1)) continue;
  312.         Ativado = strval(var_from_line);
  313.  
  314.         index = token_by_delim(line,var_from_line,';',index+1);
  315.         VirtualWorld = strval(var_from_line);
  316.  
  317.         CreateRadar(SpawnX, SpawnY, SpawnZ, SpeedMax, Radiation, Pickup, Ativado, VirtualWorld);
  318.         radars_loaded++;
  319.     }
  320.  
  321.     fclose(file_ptr);
  322.     printf("[rLibrary:] %d Radares carregados do arquivo: %s",radars_loaded,filename);
  323.     return radars_loaded;
  324. }
  325.  
  326. stock AttachRadarToPlayer(playerid, velocidade)
  327. {
  328.     SetPVarInt(playerid, "RadarAttached", true);
  329.     SetPVarInt(playerid, "RadarAttachedSpeed", velocidade);
  330.     return 1;
  331. }
  332.  
  333. stock DettachRadarToPlayer(playerid)
  334. {
  335.     DeletePVar(playerid, "RadarAttached");
  336.     DeletePVar(playerid, "RadarAttachedSpeed");
  337.     return 1;
  338. }
  339.  
  340. stock IsPlayerRadarAttached(playerid)
  341. {
  342.     if(SetPVarInt(playerid, "RadarAttached") == true) return true;
  343.     return false;
  344. }
  345.  
  346. stock RadarForPlayer(playerid, speedlimit, radarid)
  347. {
  348.     new currentspeed = GetPlayerSpeed(playerid, true);
  349.     if(currentspeed >= speedlimit)
  350.     {
  351.         if(UseFlash == true){TextDrawShowForPlayer(playerid, Flash); SetTimerEx("HideRadar", 1000, 0, "d", playerid);}
  352.         PlayerPlaySound(playerid,1132,0.0,0.0,0.0);
  353.         OnPlayerEnterRadar(playerid, currentspeed, radarid);
  354.     }
  355.     return 1;
  356. }
  357.  
  358. public HideRadar(playerid)
  359. {
  360.     TextDrawHideForPlayer(playerid, Flash);
  361.     return 1;
  362. }
  363.  
  364. public UseFlashRadar()
  365. {
  366.     UseFlash = true;
  367.     Flash = TextDrawCreate(635.000000, 432.000000, "__");
  368.     TextDrawBackgroundColor(Flash, 255);
  369.     TextDrawFont(Flash, 1);
  370.     TextDrawLetterSize(Flash, 0.500000, -45.900001);
  371.     TextDrawColor(Flash, -256);
  372.     TextDrawSetOutline(Flash, 0);
  373.     TextDrawSetProportional(Flash, 1);
  374.     TextDrawSetShadow(Flash, 1);
  375.     TextDrawUseBox(Flash, 1);
  376.     TextDrawBoxColor(Flash, -86);
  377.     TextDrawTextSize(Flash, 6.000000, 35.000000);
  378.     return 1;
  379. }