#define COLOR_GREEN 0x33AA33AA
#define COLOR_RED 0xAA3333AA
#define CREMA_ADMIN 0xFFFFD4D4
static
Armas[MAX_PLAYERS][13], // Acб guardaremos todas las armas de los jugadores.
Municion[MAX_PLAYERS][13], // Acб guardaremos las municiones de cada arma de los jugadores.
temp_arm[13][2], // Esta variable la utilizaremos para comprobar las armas que tiene el jugador en el momento.
w_nombre[MAX_PLAYER_NAME], // Para almacenar el nombre de las armas/jugadores.
w_str[128], // Para darle un formato a los texto.
Timer_Armas[MAX_PLAYERS]; // Acб crearemos los timers para cada jugador ( que comprueba las armas )
public OnPlayerConnect(playerid) // Callback llamada cada vez que un jugador se conecta.
{
Timer_Armas[playerid] = SetTimerEx("Comprobar_Cheat", 10000, 1, "i", playerid); // Guardamos el timer en la variable para luego destruir el timer ( cuando el jugador sale ) asн no se sigue repitiendo al pedo.
return 1;
}
public OnPlayerDisconnect(playerid)
{
for(new slot = 0; slot < 13; slot++) // Loop para todas los slot de armas
{
Armas[playerid][slot] = 0; // Pasamos cada arma 0.
Municion[playerid][slot] = 0; // Seteamos todas las municiones a 0.
}
KillTimer(Timer_Armas[playerid]); // Destruimos el timer del jugador, asн no se sigue repitiendo al pedo.
return 1;
}
stock EntregarArma(playerid, arma, municion) // Creamos la funciуn.
{
new slot = GetWeaponSlot(arma); // Obtenemos el slot del arma.
if(Armas[playerid][slot] == arma) Municion[playerid][slot] += municion; // Si es el mismo arma le sumamos la municiуn.
else if(Armas[playerid][slot] != arma) Municion[playerid][slot] = municion; // Si es un arma diferente a la del slot, resetea las balas y le pone las nuevas.
Armas[playerid][slot] = arma; // Guardamos el arma que le entregaremos al jugador.
GivePlayerWeapon(playerid, arma, municion); // Le damos el arma.
return 1;
}
Si no tenйs el GetWeaponSlot, te lo dejo acб. |
forward Comprobar_Cheat(playerid);
public Comprobar_Cheat(playerid)
{
if(IsPlayerConnected(playerid)) // Comprobamos que estй conectado ese jugador.
{
for (new W = 0; W < 13; W++) // Hacemos un loop para cada slot de las armas.
{
GetPlayerWeaponData(playerid, W, temp_arm[W][0], temp_arm[W][1]); // Obtenemos las armas de cada slot.
if(temp_arm[W][0] != Armas[playerid][W]) // Comparamos el dato que obtuvimos con el que le dimos nosotros, si es diferente quiere decir que ese arma la sacу con algun hack/truco.
{
GetPlayerName(playerid, w_nombre, sizeof(w_nombre)); // Obtenemos el nombre del jugador.
format(w_str, sizeof(w_str), "**[AVISO]: - Revisб a %s(%i), posible cheat de armas ( /armas ). - **", w_nombre, playerid); // Hacemos el format para el string.
for(new i = 0; i < GetMaxPlayers(); i++) // Loop para todos los players
{
if(IsPlayerAdmin(i) && IsPlayerConnected(i)) // Comprobamos que sea admin y estй conectado.
{
SendClientMessage(i, COLOR_RED, w_str); // Le mandamos el mensaje.
}
}
}
if(temp_arm[W][1] > Municion[playerid][W]) // Esto es lo mismo, pero comprobamos las municiones del arma ( no explico abajo porque es lo mismo que arriba )
{
GetPlayerName(playerid, w_nombre, sizeof(w_nombre));
format(w_str, sizeof(w_str), "**[AVISO]: - Revisб a %s(%i), posible cheat de municion ( /armas ). - **", w_nombre, playerid);
for(new i = 0; i < GetMaxPlayers(); i++)
{
if(IsPlayerAdmin(i) && IsPlayerConnected(i))
{
SendClientMessage(i, COLOR_RED, w_str);
}
}
}
}
}
return 1;
}
public OnPlayerCommandText(playerid, cmdtext[]) // Callback llamado cada vez que escribe un comando.
{
if(!strcmp(cmdtext, "/armas", true)) // Comparamos string, cmdtext y /armas.
{
if(IsPlayerAdmin(playerid)) // Comprobamos que sea administrador RCON el usuario.
{
new tienen = 0; // Definimos una variable para si nadie tiene armas mande un mensaje ( ver mбs abajo )
for(new i = 0; i < GetMaxPlayers(); i++) // Hacemos un loop para todos los jugadores.
{
if(IsPlayerConnected(i)) // Comprobamos que estй conectados.
{
for (new W = 0; W < 13; W++) // Hacemos otro loop para todos los slot de armas ( 13 )
{
GetPlayerWeaponData(i, W, temp_arm[W][0], temp_arm[W][1]); // Obtenemos los datos del slot.
if(temp_arm[W][0] != Armas[i][W] || temp_arm[W][1] > Municion[i][W]) // Si el arma o municion que tiene es diferente al que le dimos, quiere decir que utilizу cheats. Entonces, el cуdigo sigue.
{
GetPlayerName(i, w_nombre, sizeof(w_nombre)); // Obtenemos el nombre del jugador.
format(w_str, sizeof(w_str), "Armas - %s.", w_nombre); // Le damos formato.
SendClientMessage(playerid, CREMA_ADMIN, w_str); Enviamos el mensaje de quienes son las armas.
GetWeaponName(temp_arm[W][0], w_nombre,sizeof(w_nombre)); // Obtenemos el nombre del arma.
format(w_str, sizeof(w_str), "%s - Municion: %i. ( cheat )", w_nombre, temp_arm[W][1]); // Hacemos el format con el nombre y municiуn del arma.
SendClientMessage(playerid, COLOR_RED, w_str); // Mandamos el mensaje
tienen += 1; // Le sumamos 1 a la variable tienen, al final si es 0 quiere decir que nadie tiene armas.
}
if((temp_arm[W][0] == Armas[i][W] && temp_arm[W][1] == Municion[i][W]) && (Municion[i][W] != 0 && Armas[i][W] != 0)) // Acб es lo mismo que arriba, pero como son IGUALES quiere decir que no son cheat, ya uque se la dimos nosotros. ( Lo que sigue es igual que arriba )
{
GetPlayerName(i, w_nombre, sizeof(w_nombre));
format(w_str, sizeof(w_str), "Armas - %s.", w_nombre);
SendClientMessage(playerid, CREMA_ADMIN, w_str);
GetWeaponName(temp_arm[W][0], w_nombre,sizeof(w_nombre));
format(w_str, sizeof(w_str), "%s - Municion: %i.", w_nombre, temp_arm[W][1]);
SendClientMessage(playerid, COLOR_GREEN, w_str);
tienen += 1;
}
}
}
}
if(tienen == 0) // Si tienen es igual a 0 quiere decir que NINGЪN usuario tenнa armas, por lo tanto enviarб el siguiente mensaje.
{
SendClientMessage(playerid, CREMA_ADMIN, "* No hay usuarios con armas."); // Envнa el mensaje.
return 1;
}
}
return 1;
}
return 0;
}
// Ejemplo.
if(!strcmp(cmdtext, "/test", true))
{
EntregarArma(playerid, 29, 999);
EntregarArma(playerid, 30, 999);
EntregarArma(playerid, 31, 999);
return 1;
}
SendClientMessage(playerid, COLOR_RED, w_str); // Mandamos el mensaje
if(CheatDetectado[playerid] == 0)
{
SendClientMessage(playerid, COLOR_RED, w_str); // Mandamos el mensaje
CheatDetectado[playerid] = 1;
}
public OnPlayerUpdate(playerid)
{
if(CheatDetectado[playerid] != 0) return 0;
return 1;
}
for(new playerid,l=GetMaxPlayers();playerid<l;playerid++){
if(IsPlayerConnected(playerid)) // Comprobamos que estй conectado ese jugador.
{
for (new W = 0; W < 13; W++) // Hacemos un loop para cada slot de las armas.
{
GetPlayerWeaponData(playerid, W, temp_arm[W][0], temp_arm[W][1]); // Obtenemos las armas de cada slot.
if(temp_arm[W][0] != Armas[playerid][W]) // Comparamos el dato que obtuvimos con el que le dimos nosotros, si es diferente quiere decir que ese arma la sacу con algun hack/truco.
{
GetPlayerName(playerid, w_nombre, sizeof(w_nombre)); // Obtenemos el nombre del jugador.
format(w_str, sizeof(w_str), "**[AVISO]: - Revisб a %s(%i), posible cheat de armas ( /armas ). - **", w_nombre, playerid); // Hacemos el format para el string.
for(new i = 0; i < GetMaxPlayers(); i++) // Loop para todos los players
{
if(IsPlayerAdmin(i) && IsPlayerConnected(i)) // Comprobamos que sea admin y estй conectado.
{
SendClientMessage(i, COLOR_RED, w_str); // Le mandamos el mensaje.
}
}
}
if(temp_arm[W][1] > Municion[playerid][W]) // Esto es lo mismo, pero comprobamos las municiones del arma ( no explico abajo porque es lo mismo que arriba )
{
GetPlayerName(playerid, w_nombre, sizeof(w_nombre));
format(w_str, sizeof(w_str), "**[AVISO]: - Revisб a %s(%i), posible cheat de municion ( /armas ). - **", w_nombre, playerid);
for(new i = 0; i < GetMaxPlayers(); i++)
{
if(IsPlayerAdmin(i) && IsPlayerConnected(i))
{
SendClientMessage(i, COLOR_RED, w_str);
}
}
}
}
}
return 1;
}
El timer por jugador estб muy al pedo, piensa que con 200 jugadores habrб 200 timers ejecutandose. Es mejor crear uno general en OnFilterScriptInit o OnGameModeInit con un bucle for para todos los jugadores, asн:
pawn Код:
|