[Tutorial] Creando 2 anticheats | Bбsicos | Ъtiles
#1

Creando anticheats | 2 Tipos
Bueno, para empezar un saludo a todos los que esten leyendo este tutorial, bueno hoy dнa me enseсaron como crear algunos tipos de anticheats, y bueno quiero explicar 2 de ellos, que a mi parecer es fбcil de hacer.. Espero comprensiуn, supongo que es difнcil hablar sobre esto, y puedo recibir un montуn de criticas. Ya que hay un montуn de maneras de manejar o crear un anticheat, yo solo enseсo mi manera.. Tambiйn les expreso que no postearй mucho cуdigo, la idea es aprender a hacerlo uno mismo y aprender el concepto base.

________________________________________________

Anticheat de vida/armadura
Bueno para empezar quiero recalcar que hay 2 maneras para realizar nuestros anticheats, y 2do, y creo que si estas leyendo este tutorial es por que ya saben que crear un anticheat propio es mejor que hacerlo desde un include, FS, etc.

1era Manera: Variables
їVariables?, asн es, pareciese que las variables nos acompaсaran a todas partes. Creo yo que esta manerб es bastante eficaz, al igual que la 2da manera, pero haya ustedes cual utilizarбn

їEn que consta esta manera?

Para empezar, lo que se debe hacer es almacenar en una variable de tipo Flotante (o Float), la vida de nuestro jugador.

Se debe alterar esta variable cada vez que en nuestro script aumentemos o disminuyamos la vida de nuestro jugador. Para eso podemos crear algun stock parecido a esto para ahorrarnos el trabajo.

pawn Код:
stock DarVida(playerid, vida)
{
  SetPlayerHealth(playerid, vida)
  InfoJugador[playerid][pVida] = vida;
}
Ademбs deberemos ajustar nuestra callback OnPlayerTakeDamage, para que cuando este recibe daсo, la vida del jugador y su variable baje de acuerdo al daсo recibido.

Ok, їCual es el propуsito de almacenar la vida de un jugador?
Es muy usual que los programas cheaters proporcione solamente vida al jugador, pero nuestras variables delatarбn al jugador.

EJ:

El jugador tiene 100 de vida
La variable de "vida" de ese jugador dice que tiene 50
Resultado = Hay una probabilidad de mas del 95% de que ese jugador sea un cheater. (El otro 5% son las personas que acudirбn pidiendo desban en tu foro )


________________________________________________

2da Manera: Lуgica
Le llamo lуgica a este mйtodo ya que su creaciуn es eso, una simple lуgica.

їEn que consta esta manera?
Bueno, algo ъtil que podemos hacer, es que nuestro jugador siempre posea una cantidad de vida(o chaleco) de 99.0, para estй mйtodo debemos estar seguros de que el jugador nunca tendrб la manera de obtener 100.0 de vida.

їEn que cosas debo tener cuidado?
# Mбquinas de comida por defecto de GTA
Fнjense siempre de que estas mбquinas sean borradas del mapa ni tampoco agregarlas en un interior o un mapa creado por ustedes, al usarlas el jugador serб capaz de obtener 100.0 de vida, y serб baneado/kickeado errуneamente.

# Comandos de administraciуn
Comandos como el /darvida , /darchaleco, si utilizan este mйtodo pуnganle una restricciуn para que los administradores puedan establecer el chaleco o vida de una persona hasta el lнmite deseado; en este caso 99.0

# El script propiamente tal
Cualquier funciуn que usйis aseguraos no sobresar la cantidad expresada (99.0)

# Menъs por defecto de GTA
Los menъ como lo son el del Ammu-Nation, o los del Cluckin Bell/Burger Shot. Si los tienen activados, estos le permitirбn al jugador tener una vida de 100.0 o un chaleco al 100.0

Resultado del anticheat

Nuestros jugadores, solo pueden tener 99.0 de vida
Un jugador dice tener 100.0 de vida
Resultado = Ese jugador tiene una probabilidad enorme de ser un cheater


________________________________________________

Paso final para los 2 mйtodos
Bueno una vez escogido uno de los mйtodos, pueden crear un timer, que cheque cada X tiempo la Armadura o Vida de nuestro jugador.

Si la vida de nuestro jugador ha pasado el lнmite entonces recibirб un Ban/Kick. EJ:
pawn Код:
public OnPlayerSpawn(playerid)
{
     SetPlayerHealth(playerid, 99);
    TimerHack[playerid] = SetTimerEx("VerHack", 8000, true, "i", playerid);
     //Recuerden detener el timer si el player se desconecta ' KillTimer(TimerHack[playerid]); '
    return 1;
}

forward VerHack(playerid);
public VerHack(playerid)
{
    new Float:vida;
    GetPlayerHealth(playerid, vida);
    new string[256];
    if(vida >= 100 && GetPlayerState(playerid) == PLAYER_STATE_SPAWNED)
    {
        format(string, sizeof(string), "[DR.CROSSOV3R]: Ha baneado a %s | Hack de vida", PlayerName(playerid));
        SendClientMessageToAll(AMARILLO, string);
        Ban(playerid);
    }
    return 1;
}
Update 1: Agregada otra condicional en el timer del "VerHack". Cuando un jugador muere, el hack puede detectar que tiene 100 de vida, y banearlo errуneamente, para esto obtenemos el "Estado" del jugador, y SI ES QUE ESTA SPAWNEADO, lo banearб.

Espero, que hayan entendido, gracias.
Reply
#2

Muy buen tutorial, tienes un error en la funciуn dar vida:

pawn Код:
stock DarVida(playerid, vida)
{
  SetPlayerHealth(playerid, vida)
  InfoJugador[playerid][pVida] += vida;
}
Si usted pone = sin sumar el valor que ya contiene la variable entonces se setearб el valor puesto en la funciуn DarVida.

Yo prefiero hacer algo asi:

pawn Код:
#include <a_samp>

enum
{
   PLAYER_MONEY_HACK
};

static gFHACK[1];

public OnPlayerUpdate(playerid)
{
    if(playerid != INVALID_PLAYER_ID)
    {
         if(GetPlayerMoney(playerid) != GetPVarInt(playerid, "FAntiMoneyHack"))
         {
             ResetPlayerMoney(playerid);
             GivePlayerMoney(playerid, GetPVarInt(playerid, "FAntiMoneyHack"));
             CallLocalFunction("OnPlayerHack", "ii", playerid, PLAYER_MONEY_HACK);
         }
    }
    return 1;
}

stock AntiMoneyHack(playerid, dinero)
{
    switch(dinero)
    {
        case '-':
        {
           SetPVarInt(playerid, "FAntiMoneyHack", GetPVarInt(playerid, "FAntiMoneyHack")-dinero);
           MONEY: GivePlayerMoney(playerid, GetPVarInt(playerid, "FAntiMoneyHack"));
        }
        default:
        {
           SetPVarInt(playerid, "FAntiMoneyHack", GetPVarInt(playerid, "FAntiMoneyHack")+dinero);
           goto MONEY;
        }
    }
    return 1;
}

#if defined _FHACK_GivePlayerMoney
    #undef GivePlayerMoney
#else
    #define _FHACK_GivePlayerMoney
#endif
#define GivePlayerMoney AntiMoneyHack

forward OnPlayerHack(playerid, hackid);

public OnGameModeInit()
{
    gFHACK[0] = funcidx("FHACK_GivePlayerMoney") != -1;
    if (funcidx("FHACK_OnGameModeInit") != -1)
    {
        return CallLocalFunction("FHACK_OnGameModeInit", "");
    }
    return 1;
}

#if defined _FHACK_OnGameModeInit
    #undef OnGameModeInit
#else
    #define _FHACK_OnGameModeInit
#endif
#define OnGameModeInit FHACK_OnGameModeInit
forward FHACK_OnGameModeInit();
Modo de uso:

pawn Код:
CMD:dinero(playerid, params[])
{
    GivePlayerMoney(playerid, 100);
    return 1;
}
Usted puede utilizar la funciуn GivePlayerMoney sin necesidad de utilizar otra.

pawn Код:
public OnPlayerHack(playerid, hackid)
{
    if(hackid == PLAYER_MONEY_HACK)
    {
        SendClientMessage(playerid, -1, "El AntiCheat detect[o que usaste un MoneyHack.");
    }
    return 1;
}
No lo testee pero deberia funcionar.

Muy buйn tutorial.

Un saludo.
Reply
#3

Bueno a mi servio y a mi parecer ordenado y bien explicado
Reply
#4

Gracias por informar, un saludo para ti tambiйn.
Reply
#5

Muy bueno te felicito aun que yo antes hice uno con variables tiene como un 20% de probabilidades de ser falso, bueno en mi caso en fin exelente tutorial.

Saludos.
Reply
#6

Quote:
Originally Posted by xSDx
Посмотреть сообщение
Muy bueno te felicito aun que yo antes hice uno con variables tiene como un 20% de probabilidades de ser falso, bueno en mi caso en fin exelente tutorial.

Saludos.
Ajбm... y la lуgica? Yo uso ese... es decir, con ese, solo hay que ser cuidadoso. Gracias por las felicitaciones
Reply
#7

la logica nunca la probe pero tambien es una exelente manera.

Saludos y exelente tutorial.
Reply
#8

Quote:
Originally Posted by oOFotherOo
Посмотреть сообщение
Muy buen tutorial, tienes un error en la funciуn dar vida:

pawn Код:
stock DarVida(playerid, vida)
{
  SetPlayerHealth(playerid, vida)
  InfoJugador[playerid][pVida] += vida;
}
Si usted pone = sin sumar el valor que ya contiene la variable entonces se setearб el valor puesto en la funciуn DarVida.

Yo prefiero hacer algo asi:

pawn Код:
#include <a_samp>

enum
{
   PLAYER_MONEY_HACK
};

static gFHACK[1];

public OnPlayerUpdate(playerid)
{
    if(playerid != INVALID_PLAYER_ID)
    {
         if(GetPlayerMoney(playerid) != GetPVarInt(playerid, "FAntiMoneyHack"))
         {
             ResetPlayerMoney(playerid);
             GivePlayerMoney(playerid, GetPVarInt(playerid, "FAntiMoneyHack"));
             CallLocalFunction("OnPlayerHack", "ii", playerid, PLAYER_MONEY_HACK);
         }
    }
    return 1;
}

stock AntiMoneyHack(playerid, dinero)
{
    switch(dinero)
    {
        case '-':
        {
           SetPVarInt(playerid, "FAntiMoneyHack", GetPVarInt(playerid, "FAntiMoneyHack")-dinero);
           MONEY: GivePlayerMoney(playerid, GetPVarInt(playerid, "FAntiMoneyHack"));
        }
        default:
        {
           SetPVarInt(playerid, "FAntiMoneyHack", GetPVarInt(playerid, "FAntiMoneyHack")+dinero);
           goto MONEY;
        }
    }
    return 1;
}

#if defined _FHACK_GivePlayerMoney
    #undef GivePlayerMoney
#else
    #define _FHACK_GivePlayerMoney
#endif
#define GivePlayerMoney AntiMoneyHack

forward OnPlayerHack(playerid, hackid);

public OnGameModeInit()
{
    gFHACK[0] = funcidx("FHACK_GivePlayerMoney") != -1;
    if (funcidx("FHACK_OnGameModeInit") != -1)
    {
        return CallLocalFunction("FHACK_OnGameModeInit", "");
    }
    return 1;
}

#if defined _FHACK_OnGameModeInit
    #undef OnGameModeInit
#else
    #define _FHACK_OnGameModeInit
#endif
#define OnGameModeInit FHACK_OnGameModeInit
forward FHACK_OnGameModeInit();
Modo de uso:

pawn Код:
CMD:dinero(playerid, params[])
{
    GivePlayerMoney(playerid, 100);
    return 1;
}
Usted puede utilizar la funciуn GivePlayerMoney sin necesidad de utilizar otra.

pawn Код:
public OnPlayerHack(playerid, hackid)
{
    if(hackid == PLAYER_MONEY_HACK)
    {
        SendClientMessage(playerid, -1, "El AntiCheat detect[o que usaste un MoneyHack.");
    }
    return 1;
}
No lo testee pero deberia funcionar.

Muy buйn tutorial.

Un saludo.
Tu tienes error, la funcion no le aumenta vida, si no que se la establece, por lo tanto usarla con += provocarб errores en el sistema y expulsion por error
Reply
#9

Quote:
Originally Posted by Josstaa
Посмотреть сообщение
Tu tienes error, la funcion no le aumenta vida, si no que se la establece, por lo tanto usarla con += provocarб errores en el sistema y expulsion por error
Tienes toda la razуn, SetPlayerHealth establece la vida del jugador no la suma...

PD: Te amo xD, como amigo.

Muchas gracias por tu aclaraciуn.

Un saludo.
Reply
#10

Aun no arreglas el tutorial, arreglalo o puede ser borrado por estar mal.

Quote:
Originally Posted by Josstaa
Посмотреть сообщение
Tu tienes error, la funcion no le aumenta vida, si no que se la establece, por lo tanto usarla con += provocarб errores en el sistema y expulsion por error
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)