Headache

[FS] Tacleos - Headache

Mar 21st, 2013
143
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 9.57 KB | None | 0 0
  1. /*
  2.     Tiempo de trabajo: 10 minutos.
  3.     Autor: Headache en LSRP; DeadSkyTkb en SA-MP Forums.
  4.     Aclaraciones;
  5.     - Tengo una versión antigua del GM que me dio un amigo, por ende, conozco un par de variables y me basé en tales (a no ser que se hayan cambiado).
  6.     - Sólo LSPD puede taclear, desconozco la ID de la facción SASD, pero es fácil incluirla.
  7.     - Lo probé en mi servidor de pruebas y funciona perfectamente.
  8.     - Compila perfectamente, sin errores ni advertencias.
  9. */
  10.  
  11. #include <a_samp>
  12.  
  13. new PuedeTaclear[MAX_PLAYERS]; // Es la nueva variable creada por mí, ésto detectará si el jugador puede o no taclear.
  14. new Tacleado[MAX_PLAYERS]; // Es la nueva variable creada por mí, ésto detectará si el jugador está tacleado o no.
  15. new BigEar[MAX_PLAYERS]; // Es la variable que viene por defecto con la callback ProxDetector.
  16.  
  17. enum infoj
  18. {
  19.     pLeader,
  20.     pMember
  21. };
  22. new InfoJugador[MAX_PLAYERS][infoj]; // Es una pequeña parte del enum que encontré en el GM.
  23.  
  24. // Macro para la función "function".
  25. #define \                                                  
  26.             function%0(%1) \                                
  27.                             forward %0(%1); public %0(%1)  
  28.  
  29. #define COLOR_WHITE 0xFFFFFFAA // Es el color blanco que encontré en el GM, sirve para enviar mensajes indicativos al jugador.
  30. #define COLOR_GREY 0xAFAFAFAA // Es el color blanco que encontré en el GM, sirve para enviar mensajes de error al jugador.
  31. #define COLOR_PURPLE 0xC2A2DAAA // Es el color blanco que encontré en el GM, sirve para enviar mensajes de auto-roles.
  32.  
  33. public OnPlayerConnect(playerid)
  34. {
  35.     PuedeTaclear[playerid] = 0; // Fija el valor de la variable en 0, para que al conectarse no se pueda taclear, y se deba activar mediante el comando.
  36.     Tacleado[playerid] = 0; // Fija el valor de la variable en 0, para que al conectarse no esté tacleado.
  37.     return 1;
  38. }
  39.  
  40. public OnPlayerDeath(playerid, killerid, reason)
  41. {
  42.     PuedeTaclear[playerid] = 0; // Fija el valor de la variable en 0, para que al morir no se pueda taclear, y se deba activar mediante el comando.
  43.     return 1;
  44. }
  45.  
  46. public OnPlayerCommandText(playerid, cmdtext[]) // Usé el comparador de cadenas strcmp, el GM no usa ningún procesador de comandos (creo).
  47. {
  48.     new cmd[128];
  49.    
  50.     if(strcmp(cmd, "/taclear", true) ==0)
  51.     {
  52.         if(InfoJugador[playerid][pLeader] == 1 || InfoJugador[playerid][pMember] == 1) // Detecta si el jugador que usa el comando es de la facción 1, o sea, policía.
  53.         {
  54.             if(PuedeTaclear[playerid] == 0) // Si usa el comando y la variable está desactivada (0), la misma será activada.
  55.             {
  56.                 PuedeTaclear[playerid] = 1;
  57.                 SendClientMessage(playerid, COLOR_WHITE, "Usted ahora puede taclear, para taclear golpée a un jugador. Para desactivar el tacleo use nuevamente /taclear.");
  58.                 return 1;
  59.             }
  60.             else // Si usa el comando NO está desactivada (puede ser cualquier valor que NO sea 0), la misma será desactivada.
  61.             {
  62.                 PuedeTaclear[playerid] = 0;
  63.                 SendClientMessage(playerid, COLOR_WHITE, "Usted ya no puede taclear. Para activar el tacleo use nuevamente /taclear.");
  64.                 return 1;
  65.             }
  66.         }
  67.         return SendClientMessage(playerid, COLOR_GREY, "Usted no es policía."); // Si el jugador no es de la facción 1 (policía) recibe éste mensaje.
  68.     }
  69.     return 0;
  70. }
  71.  
  72. public OnPlayerTakeDamage(playerid, issuerid, Float: amount, weaponid)
  73. {
  74.     if(issuerid != INVALID_PLAYER_ID) // Detecta que el jugador que produzca daño sea un jugador y no un daño del juego.
  75.     {
  76.         if((weaponid == 0) && PoliciaConTacleo(issuerid)) // Detecta que el jugador que produzca daño tenga puño limpio y sea policía.
  77.         {
  78.             if(Tacleado[playerid] == 0) // Detecta que el jugador que reciba daño NO esté tacleado.
  79.             {
  80.                 new string[128], tacleado[128], tacleador[128];
  81.                 GetPlayerName(playerid, tacleado, sizeof(tacleado));
  82.                 GetPlayerName(issuerid, tacleador, sizeof(tacleador));
  83.                 Replace(tacleado, "_", " ");
  84.                 Replace(tacleador, "_", " ");
  85.                 new tacleo = random(4)+1; // Creamos un random, para que haya posibilidad de fallar al taclear.
  86.                 if(tacleo == 1) // En caso de que el tacleo falle, pasará ésto:
  87.                 {
  88.                     format(string, sizeof(string), "* %s intentó empujar bruscamente a %s en forma de tacleo pero no consiguió taclearlo.", tacleador, tacleador); // Mensaje de autorol.
  89.                     ProxDetector(30.0, playerid, string, COLOR_PURPLE,COLOR_PURPLE,COLOR_PURPLE,COLOR_PURPLE,COLOR_PURPLE);
  90.                 }
  91.                 else // En caso de que el tacleo NO falle, pasará ésto:
  92.                 {
  93.                     format(string, sizeof(string), "* %s intentó empujar bruscamente a %s en forma de tacleo y consiguió hacerlo.", tacleador, tacleador); // Mensaje de autorol.
  94.                     ProxDetector(30.0, playerid, string, COLOR_PURPLE,COLOR_PURPLE,COLOR_PURPLE,COLOR_PURPLE,COLOR_PURPLE);
  95.                     GameTextForPlayer(playerid, "TACLEADO", 3000, 3); // Envía éste mensaje en la pantalla al jugador tacleado, dura 3 segundos.
  96.                     TogglePlayerControllable(playerid, 0); // Congela al jugador tacleado.
  97.                     ApplyAnimation(playerid, "CRACK", "crckdeth2", 4.0, 1, 0, 0, 0, 0); // Aplica la animación de caer al suelo al tacleado.
  98.                     Tacleado[playerid] = 1; // Fija la variable de tacleado al tacleado.
  99.                     SetTimerEx("Levantarse", 3000, false, "i", playerid); //Cuenta regresiva de una función en un timer de 3 segundos, al pasar los 3 segundos, ejecutará tal función.
  100.                 }
  101.             }
  102.         }
  103.     }
  104.     return 1;
  105. }
  106.  
  107. forward PoliciaConTacleo(playerid); // Forward de la callback, que por cierto la armé para no hacer muy largo todo.
  108. public PoliciaConTacleo(playerid) // En ésta callback, el GM detectará si un jugador es policía y puede taclear.
  109. {
  110.     if(IsPlayerConnected(playerid))
  111.     {
  112.         new lider = InfoJugador[playerid][pLeader];
  113.         new miembro = InfoJugador[playerid][pMember];
  114.         if(miembro == 1 && PuedeTaclear[playerid] == 1) // Detecta si es miembro de la facción 1, o sea, LSPD.
  115.         {
  116.             return 1;
  117.         }
  118.         else if(lider == 1 && PuedeTaclear[playerid] == 1) // Detecta si es LÍDER de la facción 1, o sea, LSPD.
  119.         {
  120.             return 1;
  121.         }
  122.     }
  123.     return 0;
  124. }
  125.  
  126. forward ProxDetector(Float:radi, playerid, string[],col1,col2,col3,col4,col5);
  127. public ProxDetector(Float:radi, playerid, string[],col1,col2,col3,col4,col5)
  128. {
  129.     if(IsPlayerConnected(playerid))
  130.     {
  131.         new Float:posx, Float:posy, Float:posz;
  132.         new Float:oldposx, Float:oldposy, Float:oldposz;
  133.         new Float:tempposx, Float:tempposy, Float:tempposz;
  134.         GetPlayerPos(playerid, oldposx, oldposy, oldposz);
  135.         for(new i = 0; i < MAX_PLAYERS; i++)
  136.         {
  137.             if(IsPlayerConnected(i) && (GetPlayerVirtualWorld(playerid) == GetPlayerVirtualWorld(i)))
  138.             {
  139.                 if(!BigEar[i])
  140.                 {
  141.                     GetPlayerPos(i, posx, posy, posz);
  142.                     tempposx = (oldposx -posx);
  143.                     tempposy = (oldposy -posy);
  144.                     tempposz = (oldposz -posz);
  145.                     if (((tempposx < radi/16) && (tempposx > -radi/16)) && ((tempposy < radi/16) && (tempposy > -radi/16)) && ((tempposz < radi/16) && (tempposz > -radi/16)))
  146.                     {
  147.                         SendClientMessage(i, col1, string);
  148.                     }
  149.                     else if (((tempposx < radi/8) && (tempposx > -radi/8)) && ((tempposy < radi/8) && (tempposy > -radi/8)) && ((tempposz < radi/8) && (tempposz > -radi/8)))
  150.                     {
  151.                         SendClientMessage(i, col2, string);
  152.                     }
  153.                     else if (((tempposx < radi/4) && (tempposx > -radi/4)) && ((tempposy < radi/4) && (tempposy > -radi/4)) && ((tempposz < radi/4) && (tempposz > -radi/4)))
  154.                     {
  155.                         SendClientMessage(i, col3, string);
  156.                     }
  157.                     else if (((tempposx < radi/2) && (tempposx > -radi/2)) && ((tempposy < radi/2) && (tempposy > -radi/2)) && ((tempposz < radi/2) && (tempposz > -radi/2)))
  158.                     {
  159.                         SendClientMessage(i, col4, string);
  160.                     }
  161.                     else if (((tempposx < radi) && (tempposx > -radi)) && ((tempposy < radi) && (tempposy > -radi)) && ((tempposz < radi) && (tempposz > -radi)))
  162.                     {
  163.                         SendClientMessage(i, col5, string);
  164.                     }
  165.                 }
  166.                 else
  167.                 {
  168.                     SendClientMessage(i, col1, string);
  169.                 }
  170.             }
  171.         }
  172.     }
  173.     return 1;
  174. }
  175.  
  176. forward ProxDetectorS(Float:radi, playerid, targetid);
  177. public ProxDetectorS(Float:radi, playerid, targetid)
  178. {
  179.     if(IsPlayerConnected(playerid)&&IsPlayerConnected(targetid))
  180.     {
  181.         new Float:posx, Float:posy, Float:posz;
  182.         new Float:oldposx, Float:oldposy, Float:oldposz;
  183.         new Float:tempposx, Float:tempposy, Float:tempposz;
  184.         GetPlayerPos(playerid, oldposx, oldposy, oldposz);
  185.         GetPlayerPos(targetid, posx, posy, posz);
  186.         tempposx = (oldposx -posx);
  187.         tempposy = (oldposy -posy);
  188.         tempposz = (oldposz -posz);
  189.         if (((tempposx < radi) && (tempposx > -radi)) && ((tempposy < radi) && (tempposy > -radi)) && ((tempposz < radi) && (tempposz > -radi)))
  190.         {
  191.             return 1;
  192.         }
  193.     }
  194.     return 0;
  195. }
  196.  
  197. function Levantarse(playerid) {
  198.     new string[128], sendername[128];
  199.     GetPlayerName(playerid, sendername, sizeof(sendername));
  200.     Replace(sendername, "_", " ");
  201.     ClearAnimations(playerid); // Elimina animaciones al tacleado, ésta sería la de estar en el suelo.
  202.     TogglePlayerControllable(playerid, 1); // Descongela al tacleado.
  203.     ApplyAnimation(playerid, "ped", "getup_front", 4.000000, 0, 0, 0, 0, 0); // Aplica la animación de levantarse al tacleado.
  204.     format(string, sizeof(string), "* %s apoya ambas manos en el suelo y se sostiene con éstas, acto seguido se levanta.", sendername); // Mensaje de autorol.
  205.     ProxDetector(30.0,playerid, string, COLOR_PURPLE,COLOR_PURPLE,COLOR_PURPLE,COLOR_PURPLE,COLOR_PURPLE);
  206.     Tacleado[playerid] = 0;
  207.     return 1;
  208. }
  209.  
  210. Replace(stringo[128], find[128], replace[128])
  211. {
  212.     new pos;
  213.     while((pos = strfind(stringo, find, true)) != -1)
  214.     {
  215.         strdel(stringo, pos, pos + strlen(find));
  216.         strins(stringo, replace, pos);
  217.     }
  218.     return stringo;
  219. }
Advertisement
Add Comment
Please, Sign In to add comment