enigma513

Creador de Velocimetro v0.2.1

Jan 19th, 2013
583
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Pawn 13.15 KB | None | 0 0
  1. /*  Creador de Velocimetro v0.2.1
  2. Script creado para Extreme Latin Role Play por enigma513
  3. Este script puede ser editado, distribuido siempre y cuando se conserven los creditos
  4.  
  5. Es mi primer include, por ahora le saque las funciones de kilometraje, gasolina, cuadro de info, seran agregadas en proximas versiones
  6.  
  7. Creditos:
  8. Script: enigma513
  9. foreach: Y_Less
  10. TextDraw Editor: Zamaroht
  11. GetSpeed, IsABike: No estoy seguro de quien es.
  12.  
  13. Idea: Me motive al mirar que irinel habia hecho un buen velocimetro
  14.  
  15. Test:
  16. Oscar
  17. */
  18. //native FijarVelocimetro(Float:CentroX, Float:CentroY, Float:RadioCircunf, Float:MaxVeloc, Float:MaxAngulo, color_letra, MaxPuntos);
  19. //native DestruirVelocimetro();
  20. //native AddExtTDSpeedo(Text:TextID);
  21. //native AddDigitalVelocimetro(playerid, PlayerText:TextID);
  22.  
  23. /*
  24. CentroX             Es la pos en X del centro de la circunferencia, del punto de donde saldria la aguja del velocimetro
  25. CentroY             Es la pos en X del centro de la circunferencia, del punto de donde saldria la aguja del velocimetro
  26. RadioCircunf        Es el radio de la circunferencia, que tan alejados estaran los numeros
  27. MaxVeloc            Maxima velocidad registrada
  28. MaxAngulo           Maximo Angulo, es para la posicion de los numeros en el velocimetro, se pueden usar valores como 90 o 180
  29. color_letra         Es el color de los numeros
  30. MaxPuntos           El maximo de puntos que tendra la aguja (maximo 10)
  31. */
  32.  
  33. #if defined _Vel_Ext_included
  34.     #endinput
  35. #endif
  36. #define _Vel_Ext_included
  37.  
  38. #include <a_samp>
  39. #include <foreach>
  40. #include <float>
  41.  
  42. #define FUNCION:%0(%1)  forward %0(%1); \
  43.                         public %0(%1)
  44.  
  45. //-----------------------------------Configurar------------------------------------------//
  46. #define VEL_TIMER           200//Cada cuanto se actualizara el velocimetro
  47. #define Vel_Intervalo       10 //Tu velocidad maxima entre este numero, te dara la separacion
  48. #define MAX_TEXT_SLOTS      11 //Para puntos ( VelocimetroX[Vel_MaxPuntos] )
  49. #define MAX_TEXT_ANADIDOS   10 //Para agregar TD externos
  50. //---------------------------------------------------------------------------------------//
  51.  
  52.  
  53. #define Vel_Frecuencia      Vel_Intervalo+1
  54.  
  55. new Text:TextVelAg[Vel_Frecuencia];
  56. new VelocTimer, VelocimetroShowing[MAX_PLAYERS] = { 0, ...};
  57.  
  58. enum anadinfo
  59. {
  60.     Anad_Creado,
  61.     Text: Anad_ID
  62. };
  63. new TextAnadidos[MAX_TEXT_ANADIDOS][anadinfo];
  64.  
  65. enum DigInfo
  66. {
  67.     bool: Dig_Creado,
  68.     PlayerText: Dig_ID
  69. };
  70. new TextDigital[MAX_PLAYERS][DigInfo];
  71.  
  72. enum tdinfo
  73. {
  74.     PlayerText: Text_ID,
  75.     Text_Creado,
  76.     Text_Tipo
  77. };
  78. new TextCreado[MAX_PLAYERS][MAX_TEXT_SLOTS][tdinfo];
  79.  
  80. enum velinfo
  81. {
  82.     bool: Vel_Creado,
  83.     Float:Vel_CentroX,
  84.     Float:Vel_CentroY,
  85.     Float:Vel_Radio,
  86.     Float:Vel_MaxVeloc,
  87.     Float:Vel_MaxAngulo,
  88.     Vel_color_fondo,
  89.     Float:Vel_PosFondoX,
  90.     Float:Vel_PosFondoY,
  91.     Float:Vel_FondoTextSizeX,
  92.     Float:Vel_FondoTextSizeY,
  93.     Vel_color_letra,
  94.     Vel_MaxPuntos,
  95.     Float:Vel_Factor
  96. };
  97. new VelocimetroX[velinfo];
  98.  
  99. new Iterator:TextSlot[MAX_PLAYERS]<MAX_TEXT_SLOTS>;
  100.  
  101. public OnFilterScriptInit()
  102. {
  103.     Itter_Init(TextSlot);
  104.     return CallLocalFunction("VelExt_OnFilterScriptInit", "");
  105. }
  106. #if defined _ALS_OnFilterScriptInit
  107.     #undef OnFilterScriptInit
  108. #else
  109.     #define _ALS_OnFilterScriptInit
  110. #endif
  111. #define OnFilterScriptInit VelExt_OnFilterScriptInit
  112. forward VelExt_OnFilterScriptInit();
  113.  
  114. public OnGameModeInit()
  115. {
  116.     Itter_Init(TextSlot);
  117.     return CallLocalFunction("VelExt_OnGameModeInit", "");
  118. }
  119. #if defined _ALS_OnGameModeInit
  120.     #undef OnGameModeInit
  121. #else
  122.     #define _ALS_OnGameModeInit
  123. #endif
  124. #define OnGameModeInit VelExt_OnGameModeInit
  125. forward VelExt_OnGameModeInit();
  126.  
  127. public OnFilterScriptExit()
  128. {
  129.     DestruirVelocimetro();
  130.     for(new i; i<MAX_PLAYERS; i++) Itter_Clear(TextSlot[i]);
  131.     return CallLocalFunction("VelExt_OnFilterScriptExit", "");
  132. }
  133. #if defined _ALS_OnFilterScriptExit
  134.     #undef OnFilterScriptExit
  135. #else
  136.     #define _ALS_OnFilterScriptExit
  137. #endif
  138. #define OnFilterScriptExit VelExt_OnFilterScriptExit
  139. forward VelExt_OnFilterScriptExit();
  140.  
  141. public OnGameModeExit()
  142. {
  143.     DestruirVelocimetro();
  144.     return CallLocalFunction("VelExt_OnGameModeExit", "");
  145. }
  146. #if defined _ALS_OnGameModeExit
  147.     #undef OnGameModeExit
  148. #else
  149.     #define _ALS_OnGameModeExit
  150. #endif
  151. #define OnGameModeExit VelExt_OnGameModeExit
  152. forward VelExt_OnGameModeExit();
  153.  
  154. public OnPlayerDisconnect(playerid, reason)
  155. {
  156.     DestruirTodoTextCreado(playerid);
  157.     VelocimetroShowing[playerid] = 0;
  158.     TextDigital[playerid][Dig_Creado] = false;
  159.     return CallLocalFunction("VelExt_OnPlayerDisconnect", "");
  160. }
  161. #if defined _ALS_OnPlayerDisconnect
  162.     #undef OnPlayerDisconnect
  163. #else
  164.     #define _ALS_OnPlayerDisconnect
  165. #endif
  166. #define OnPlayerDisconnect VelExt_OnPlayerDisconnect
  167. forward VelExt_OnPlayerDisconnect(playerid, reason);
  168.  
  169. FUNCION: VelocimetroUpdate()
  170. {
  171.     new Float: KMH;
  172.     foreach(new i: Player)
  173.     {
  174.         if(IsPlayerInAnyVehicle(i))
  175.         {
  176.             if(VelocimetroShowing[i] == 0)
  177.             {
  178.                 for(new v; v<Vel_Frecuencia; v++)
  179.                 {
  180.                     TextDrawShowForPlayer(i, TextVelAg[v]);
  181.                 }
  182.                 for(new v; v<MAX_TEXT_ANADIDOS; v++)
  183.                 {
  184.                     if(TextAnadidos[v][Anad_Creado])
  185.                     {
  186.                         TextDrawShowForPlayer(i, TextAnadidos[v][Anad_ID]);
  187.                     }
  188.                 }
  189.             }
  190.             KMH = GetSpeed(i);
  191.             S_VelocimetroAguja(i,true,"_",KMH,1);
  192.             VelocimetroShowing[i] = 1;
  193.             if(TextDigital[i][Dig_Creado])
  194.             {
  195.                 new string[15];
  196.                 format(string, 15, "%0.0f km/h",KMH);
  197.                 S_VelocTexto(i,true,string);
  198.             }
  199.         }
  200.         else
  201.         {
  202.             if(VelocimetroShowing[i] == 1)
  203.             {
  204.                 for(new v; v<Vel_Frecuencia; v++)
  205.                 {
  206.                     TextDrawHideForPlayer(i, Text:TextVelAg[v]);
  207.                 }
  208.                 for(new v; v<MAX_TEXT_ANADIDOS; v++)
  209.                 {
  210.                     if(TextAnadidos[v][Anad_Creado])
  211.                     {
  212.                         TextDrawHideForPlayer(i, Text:TextAnadidos[v][Anad_ID]);
  213.                     }
  214.                 }
  215.                 S_VelocimetroAguja(i,false,"_",0.0,1);
  216.                 VelocimetroShowing[i] = 0;
  217.                 S_VelocTexto(i,false,"_");
  218.             }
  219.         }
  220.     }
  221.     return 1;
  222. }
  223. FUNCION: S_VelocimetroAguja(playerid,bool: crear,string[],Float: valor, Numero)
  224. {
  225.     new slot = ObtenerTextPlayerId(playerid,Numero);
  226.     if(crear)
  227.     {
  228.         if(TextCreado[playerid][slot][Text_Creado] == 1) PlayerTextDrawDestroy(playerid,TextCreado[playerid][slot][Text_ID]);
  229.  
  230.         if(valor > VelocimetroX[Vel_MaxVeloc])valor = VelocimetroX[Vel_MaxVeloc];
  231.         if(valor < 0)valor = 0.0;
  232.         new Float: coord[2], Float: QuePuntoAg;
  233.         QuePuntoAg = floatsub(1.0, floatmul(Numero,0.10));
  234.        
  235.         coord[0] = floatadd(floatmul(floatcos(floatmul(valor,VelocimetroX[Vel_Factor]),degrees), floatmul(VelocimetroX[Vel_Radio],-QuePuntoAg)),VelocimetroX[Vel_CentroX]);
  236.         coord[1] = floatadd(floatmul(floatsin(floatmul(valor,VelocimetroX[Vel_Factor]),degrees), floatmul(VelocimetroX[Vel_Radio],-QuePuntoAg)),VelocimetroX[Vel_CentroY]);
  237.         TextCreado[playerid][slot][Text_ID] = CreatePlayerTextDraw(playerid, coord[0], coord[1], ".");
  238.         TextCreado[playerid][slot][Text_Creado] = 1;
  239.         if(!Itter_Contains(TextSlot[playerid],slot)) Itter_Add(TextSlot[playerid],slot);
  240.         TextCreado[playerid][slot][Text_Tipo] = Numero;
  241.         PlayerTextDrawAlignment(playerid,TextCreado[playerid][slot][Text_ID], 2);
  242.         PlayerTextDrawBackgroundColor(playerid,TextCreado[playerid][slot][Text_ID], 255);
  243.         PlayerTextDrawFont(playerid,TextCreado[playerid][slot][Text_ID], 1);
  244.         PlayerTextDrawLetterSize(playerid,TextCreado[playerid][slot][Text_ID], 0.500000, 1.000000);
  245.         PlayerTextDrawColor(playerid,TextCreado[playerid][slot][Text_ID], VelocimetroX[Vel_color_letra]);
  246.         PlayerTextDrawSetOutline(playerid,TextCreado[playerid][slot][Text_ID], 1);
  247.         PlayerTextDrawSetProportional(playerid,TextCreado[playerid][slot][Text_ID], 1);
  248.         PlayerTextDrawSetShadow(playerid,TextCreado[playerid][slot][Text_ID], 1);
  249.  
  250.         PlayerTextDrawShow(playerid,TextCreado[playerid][slot][Text_ID]);
  251.     }
  252.     else
  253.     {
  254.         DestruirTextCreado(playerid,slot);
  255.     }
  256.     if(Numero < VelocimetroX[Vel_MaxPuntos])
  257.     {
  258.         Numero++;
  259.         S_VelocimetroAguja(playerid,crear,string,valor,Numero);
  260.     }
  261.     return 1;
  262. }
  263. FUNCION: S_VelocTexto(playerid,bool: crear,string[])
  264. {
  265.     if(TextDigital[playerid][Dig_Creado])
  266.     {
  267.         if(crear)
  268.         {
  269.             PlayerTextDrawSetString(playerid,TextDigital[playerid][Dig_ID],string);
  270.             PlayerTextDrawShow(playerid,TextDigital[playerid][Dig_ID]);
  271.         }
  272.         else
  273.         {
  274.             PlayerTextDrawHide(playerid,TextDigital[playerid][Dig_ID]);
  275.         }
  276.     }
  277.     return 1;
  278. }
  279. FUNCION:CargarTextdraw()
  280. {
  281.     new Numeros_Frecuencia = floatround(floatdiv(VelocimetroX[Vel_MaxVeloc],Vel_Intervalo));
  282.    
  283.     for(new i=0, v=0; i<= VelocimetroX[Vel_MaxVeloc] && v <= Vel_Frecuencia; i+= Numeros_Frecuencia)
  284.     {
  285.         new Float: coord[2],textovel[10], val;
  286.         val = i;
  287.         coord[0] = floatadd(floatmul(floatcos(floatmul(float(val),VelocimetroX[Vel_Factor]),degrees), -VelocimetroX[Vel_Radio]),VelocimetroX[Vel_CentroX]);
  288.         coord[1] = floatadd(floatmul(floatsin(floatmul(float(val),VelocimetroX[Vel_Factor]),degrees), -VelocimetroX[Vel_Radio]),VelocimetroX[Vel_CentroY]);
  289.         format(textovel,9,"%d",i);
  290.  
  291.         TextVelAg[v] = TextDrawCreate(coord[0], coord[1], textovel);
  292.         TextDrawAlignment(TextVelAg[v], 2);
  293.         TextDrawBackgroundColor(TextVelAg[v], 255);
  294.         TextDrawFont(TextVelAg[v], 2);
  295.         TextDrawLetterSize(TextVelAg[v], 0.200000, 0.799998);
  296.         TextDrawColor(TextVelAg[v], VelocimetroX[Vel_color_letra]);
  297.         TextDrawSetOutline(TextVelAg[v], 1);
  298.         TextDrawSetProportional(TextVelAg[v], 1);
  299.         TextDrawSetShadow(TextVelAg[v], 1);
  300.         v++;
  301.     }
  302.     return 1;
  303. }
  304.  
  305. stock FijarVelocimetro(Float:CentroX, Float:CentroY, Float:RadioCircunf, Float:MaxVeloc, Float:MaxAngulo, color_letra, MaxPuntos = 3)
  306. {
  307.     if(VelocimetroX[Vel_Creado])
  308.     {
  309.         DestruirVelocimetro();
  310.     }
  311.     VelocimetroX[Vel_CentroX] = CentroX;
  312.     VelocimetroX[Vel_CentroY] = CentroY;
  313.     VelocimetroX[Vel_Radio] = RadioCircunf;
  314.     VelocimetroX[Vel_MaxVeloc] = MaxVeloc;
  315.     VelocimetroX[Vel_MaxAngulo] = MaxAngulo;
  316.     VelocimetroX[Vel_color_letra] = color_letra;
  317.     if(0 > MaxPuntos > 10) VelocimetroX[Vel_MaxPuntos] = 10;
  318.     else VelocimetroX[Vel_MaxPuntos] = MaxPuntos;
  319.     VelocimetroX[Vel_Factor] = floatdiv(VelocimetroX[Vel_MaxAngulo],VelocimetroX[Vel_MaxVeloc]);
  320.     VelocimetroX[Vel_Creado] = true;
  321.     CargarTextdraw();
  322.     VelocTimer = SetTimer("VelocimetroUpdate",VEL_TIMER,1);
  323.     return 1;
  324. }
  325. stock DestruirVelocimetro()
  326. {
  327.     if(VelocimetroX[Vel_Creado])
  328.     {
  329.         KillTimer(VelocTimer);
  330.         for(new i; i<Vel_Frecuencia;i++)
  331.         {
  332.             TextDrawDestroy(TextVelAg[i]);
  333.         }
  334.         for(new i; i<MAX_TEXT_ANADIDOS; i++)
  335.         {
  336.             if(TextAnadidos[i][Anad_Creado])
  337.             {
  338.                 TextAnadidos[i][Anad_Creado] = 0;
  339.                 TextDrawDestroy(TextAnadidos[i][Anad_ID]);
  340.             }
  341.         }
  342.         VelocimetroX[Vel_Creado] = false;
  343.         foreach(new i: Player)
  344.         {
  345.             DestruirTodoTextCreado(i);
  346.             VelocimetroShowing[i] = 0;
  347.         }
  348.     }
  349.     return 1;
  350. }
  351. stock AddExtTDSpeedo(Text:TextID)
  352. {
  353.     new slot = ObtenerAnadSlot();
  354.     if(slot != -1)
  355.     {
  356.         TextAnadidos[slot][Anad_Creado] = 1;
  357.         TextAnadidos[slot][Anad_ID] = TextID;
  358.         return 1;
  359.     }
  360.     else print("Incrementa el numero de MAX_TEXT_ANADIDOS");
  361.     return 0;
  362. }
  363. stock AddDigitalVelocimetro(playerid, PlayerText:TextID)
  364. {
  365.     TextDigital[playerid][Dig_Creado] = true;
  366.     TextDigital[playerid][Dig_ID] = TextID;
  367.     return 1;
  368. }
  369.  
  370. stock GetSpeed(playerid)//gear system
  371. {
  372.     new Float:ST[3];
  373.     GetVehicleVelocity(GetPlayerVehicleID(playerid),ST[0],ST[1],ST[2]);
  374.  
  375.     return floatround(1.61*floatsqroot(floatpower(floatabs(ST[0]), 2.0) + floatpower(floatabs(ST[1]), 2.0) + floatpower(floatabs(ST[2]), 2.0)) * 100.3);
  376. }
  377. stock IsABike(vehid)//randomkid88
  378. {
  379.     new modelid = GetVehicleModel(vehid);
  380.     if(modelid == 509||modelid ==510||modelid ==581||modelid ==522||modelid ==521||modelid ==523||modelid ==586||modelid ==481||modelid ==462||modelid ==448||modelid ==461||modelid ==463||modelid ==468||modelid ==471) return 1;
  381.     else return 0;
  382. }
  383.  
  384. FUNCION: TextDrawSlot(playerid)
  385. {
  386.     new slot = Itter_Free(TextSlot[playerid]);
  387.     if(!TextCreado[playerid][slot][Text_Creado]) return slot;
  388.     return -1;
  389. }
  390. FUNCION: DestruirTextCreado(playerid,&SlotText)
  391. {
  392.     if(TextCreado[playerid][SlotText][Text_Creado])
  393.     {
  394.         PlayerTextDrawHide(playerid,TextCreado[playerid][SlotText][Text_ID]);
  395.         PlayerTextDrawDestroy(playerid,TextCreado[playerid][SlotText][Text_ID]);
  396.         TextCreado[playerid][SlotText][Text_ID] = PlayerText:INVALID_TEXT_DRAW;
  397.         TextCreado[playerid][SlotText][Text_Creado] = 0;
  398.         TextCreado[playerid][SlotText][Text_Tipo] = 0;
  399.         Itter_SafeRemove(TextSlot[playerid],SlotText,SlotText);
  400.         return 1;
  401.     }
  402.     return 0;
  403. }
  404. stock DestruirTodoTextCreado(playerid)
  405. {
  406.     foreach(new i: TextSlot[playerid])
  407.     {
  408.         DestruirTextCreado(playerid,i);
  409.     }
  410.     TextDigital[playerid][Dig_Creado] = false;
  411.     PlayerTextDrawDestroy(playerid,TextDigital[playerid][Dig_ID]);
  412.     return 1;
  413. }
  414. FUNCION: ObtenerTextPlayerId(playerid,Tipo)
  415. {
  416.     foreach(new i: TextSlot[playerid])
  417.     {
  418.         if(TextCreado[playerid][i][Text_Creado] == 1)
  419.         {
  420.             if(TextCreado[playerid][i][Text_Tipo] == Tipo) return i;
  421.         }
  422.     }
  423.     return TextDrawSlot(playerid);
  424. }
  425. FUNCION: ObtenerAnadSlot()
  426. {
  427.     for(new i; i<MAX_TEXT_ANADIDOS; i++)
  428.     {
  429.         if(!TextAnadidos[i][Anad_Creado])return i;
  430.     }
  431.     return -1;
  432. }
Advertisement
Add Comment
Please, Sign In to add comment