Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- Tiempo de trabajo: 10 minutos.
- Autor: Headache en LSRP; DeadSkyTkb en SA-MP Forums.
- Aclaraciones;
- - 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).
- - Sólo LSPD puede taclear, desconozco la ID de la facción SASD, pero es fácil incluirla.
- - Lo probé en mi servidor de pruebas y funciona perfectamente.
- - Compila perfectamente, sin errores ni advertencias.
- */
- #include <a_samp>
- new PuedeTaclear[MAX_PLAYERS]; // Es la nueva variable creada por mí, ésto detectará si el jugador puede o no taclear.
- new Tacleado[MAX_PLAYERS]; // Es la nueva variable creada por mí, ésto detectará si el jugador está tacleado o no.
- new BigEar[MAX_PLAYERS]; // Es la variable que viene por defecto con la callback ProxDetector.
- enum infoj
- {
- pLeader,
- pMember
- };
- new InfoJugador[MAX_PLAYERS][infoj]; // Es una pequeña parte del enum que encontré en el GM.
- // Macro para la función "function".
- #define \
- function%0(%1) \
- forward %0(%1); public %0(%1)
- #define COLOR_WHITE 0xFFFFFFAA // Es el color blanco que encontré en el GM, sirve para enviar mensajes indicativos al jugador.
- #define COLOR_GREY 0xAFAFAFAA // Es el color blanco que encontré en el GM, sirve para enviar mensajes de error al jugador.
- #define COLOR_PURPLE 0xC2A2DAAA // Es el color blanco que encontré en el GM, sirve para enviar mensajes de auto-roles.
- public OnPlayerConnect(playerid)
- {
- 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.
- Tacleado[playerid] = 0; // Fija el valor de la variable en 0, para que al conectarse no esté tacleado.
- return 1;
- }
- public OnPlayerDeath(playerid, killerid, reason)
- {
- 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.
- return 1;
- }
- public OnPlayerCommandText(playerid, cmdtext[]) // Usé el comparador de cadenas strcmp, el GM no usa ningún procesador de comandos (creo).
- {
- new cmd[128];
- if(strcmp(cmd, "/taclear", true) ==0)
- {
- 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.
- {
- if(PuedeTaclear[playerid] == 0) // Si usa el comando y la variable está desactivada (0), la misma será activada.
- {
- PuedeTaclear[playerid] = 1;
- SendClientMessage(playerid, COLOR_WHITE, "Usted ahora puede taclear, para taclear golpée a un jugador. Para desactivar el tacleo use nuevamente /taclear.");
- return 1;
- }
- else // Si usa el comando NO está desactivada (puede ser cualquier valor que NO sea 0), la misma será desactivada.
- {
- PuedeTaclear[playerid] = 0;
- SendClientMessage(playerid, COLOR_WHITE, "Usted ya no puede taclear. Para activar el tacleo use nuevamente /taclear.");
- return 1;
- }
- }
- 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.
- }
- return 0;
- }
- public OnPlayerTakeDamage(playerid, issuerid, Float: amount, weaponid)
- {
- if(issuerid != INVALID_PLAYER_ID) // Detecta que el jugador que produzca daño sea un jugador y no un daño del juego.
- {
- if((weaponid == 0) && PoliciaConTacleo(issuerid)) // Detecta que el jugador que produzca daño tenga puño limpio y sea policía.
- {
- if(Tacleado[playerid] == 0) // Detecta que el jugador que reciba daño NO esté tacleado.
- {
- new string[128], tacleado[128], tacleador[128];
- GetPlayerName(playerid, tacleado, sizeof(tacleado));
- GetPlayerName(issuerid, tacleador, sizeof(tacleador));
- Replace(tacleado, "_", " ");
- Replace(tacleador, "_", " ");
- new tacleo = random(4)+1; // Creamos un random, para que haya posibilidad de fallar al taclear.
- if(tacleo == 1) // En caso de que el tacleo falle, pasará ésto:
- {
- format(string, sizeof(string), "* %s intentó empujar bruscamente a %s en forma de tacleo pero no consiguió taclearlo.", tacleador, tacleador); // Mensaje de autorol.
- ProxDetector(30.0, playerid, string, COLOR_PURPLE,COLOR_PURPLE,COLOR_PURPLE,COLOR_PURPLE,COLOR_PURPLE);
- }
- else // En caso de que el tacleo NO falle, pasará ésto:
- {
- format(string, sizeof(string), "* %s intentó empujar bruscamente a %s en forma de tacleo y consiguió hacerlo.", tacleador, tacleador); // Mensaje de autorol.
- ProxDetector(30.0, playerid, string, COLOR_PURPLE,COLOR_PURPLE,COLOR_PURPLE,COLOR_PURPLE,COLOR_PURPLE);
- GameTextForPlayer(playerid, "TACLEADO", 3000, 3); // Envía éste mensaje en la pantalla al jugador tacleado, dura 3 segundos.
- TogglePlayerControllable(playerid, 0); // Congela al jugador tacleado.
- ApplyAnimation(playerid, "CRACK", "crckdeth2", 4.0, 1, 0, 0, 0, 0); // Aplica la animación de caer al suelo al tacleado.
- Tacleado[playerid] = 1; // Fija la variable de tacleado al tacleado.
- 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.
- }
- }
- }
- }
- return 1;
- }
- forward PoliciaConTacleo(playerid); // Forward de la callback, que por cierto la armé para no hacer muy largo todo.
- public PoliciaConTacleo(playerid) // En ésta callback, el GM detectará si un jugador es policía y puede taclear.
- {
- if(IsPlayerConnected(playerid))
- {
- new lider = InfoJugador[playerid][pLeader];
- new miembro = InfoJugador[playerid][pMember];
- if(miembro == 1 && PuedeTaclear[playerid] == 1) // Detecta si es miembro de la facción 1, o sea, LSPD.
- {
- return 1;
- }
- else if(lider == 1 && PuedeTaclear[playerid] == 1) // Detecta si es LÍDER de la facción 1, o sea, LSPD.
- {
- return 1;
- }
- }
- return 0;
- }
- forward ProxDetector(Float:radi, playerid, string[],col1,col2,col3,col4,col5);
- public ProxDetector(Float:radi, playerid, string[],col1,col2,col3,col4,col5)
- {
- if(IsPlayerConnected(playerid))
- {
- new Float:posx, Float:posy, Float:posz;
- new Float:oldposx, Float:oldposy, Float:oldposz;
- new Float:tempposx, Float:tempposy, Float:tempposz;
- GetPlayerPos(playerid, oldposx, oldposy, oldposz);
- for(new i = 0; i < MAX_PLAYERS; i++)
- {
- if(IsPlayerConnected(i) && (GetPlayerVirtualWorld(playerid) == GetPlayerVirtualWorld(i)))
- {
- if(!BigEar[i])
- {
- GetPlayerPos(i, posx, posy, posz);
- tempposx = (oldposx -posx);
- tempposy = (oldposy -posy);
- tempposz = (oldposz -posz);
- if (((tempposx < radi/16) && (tempposx > -radi/16)) && ((tempposy < radi/16) && (tempposy > -radi/16)) && ((tempposz < radi/16) && (tempposz > -radi/16)))
- {
- SendClientMessage(i, col1, string);
- }
- else if (((tempposx < radi/8) && (tempposx > -radi/8)) && ((tempposy < radi/8) && (tempposy > -radi/8)) && ((tempposz < radi/8) && (tempposz > -radi/8)))
- {
- SendClientMessage(i, col2, string);
- }
- else if (((tempposx < radi/4) && (tempposx > -radi/4)) && ((tempposy < radi/4) && (tempposy > -radi/4)) && ((tempposz < radi/4) && (tempposz > -radi/4)))
- {
- SendClientMessage(i, col3, string);
- }
- else if (((tempposx < radi/2) && (tempposx > -radi/2)) && ((tempposy < radi/2) && (tempposy > -radi/2)) && ((tempposz < radi/2) && (tempposz > -radi/2)))
- {
- SendClientMessage(i, col4, string);
- }
- else if (((tempposx < radi) && (tempposx > -radi)) && ((tempposy < radi) && (tempposy > -radi)) && ((tempposz < radi) && (tempposz > -radi)))
- {
- SendClientMessage(i, col5, string);
- }
- }
- else
- {
- SendClientMessage(i, col1, string);
- }
- }
- }
- }
- return 1;
- }
- forward ProxDetectorS(Float:radi, playerid, targetid);
- public ProxDetectorS(Float:radi, playerid, targetid)
- {
- if(IsPlayerConnected(playerid)&&IsPlayerConnected(targetid))
- {
- new Float:posx, Float:posy, Float:posz;
- new Float:oldposx, Float:oldposy, Float:oldposz;
- new Float:tempposx, Float:tempposy, Float:tempposz;
- GetPlayerPos(playerid, oldposx, oldposy, oldposz);
- GetPlayerPos(targetid, posx, posy, posz);
- tempposx = (oldposx -posx);
- tempposy = (oldposy -posy);
- tempposz = (oldposz -posz);
- if (((tempposx < radi) && (tempposx > -radi)) && ((tempposy < radi) && (tempposy > -radi)) && ((tempposz < radi) && (tempposz > -radi)))
- {
- return 1;
- }
- }
- return 0;
- }
- function Levantarse(playerid) {
- new string[128], sendername[128];
- GetPlayerName(playerid, sendername, sizeof(sendername));
- Replace(sendername, "_", " ");
- ClearAnimations(playerid); // Elimina animaciones al tacleado, ésta sería la de estar en el suelo.
- TogglePlayerControllable(playerid, 1); // Descongela al tacleado.
- ApplyAnimation(playerid, "ped", "getup_front", 4.000000, 0, 0, 0, 0, 0); // Aplica la animación de levantarse al tacleado.
- format(string, sizeof(string), "* %s apoya ambas manos en el suelo y se sostiene con éstas, acto seguido se levanta.", sendername); // Mensaje de autorol.
- ProxDetector(30.0,playerid, string, COLOR_PURPLE,COLOR_PURPLE,COLOR_PURPLE,COLOR_PURPLE,COLOR_PURPLE);
- Tacleado[playerid] = 0;
- return 1;
- }
- Replace(stringo[128], find[128], replace[128])
- {
- new pos;
- while((pos = strfind(stringo, find, true)) != -1)
- {
- strdel(stringo, pos, pos + strlen(find));
- strins(stringo, replace, pos);
- }
- return stringo;
- }
Advertisement
Add Comment
Please, Sign In to add comment