hookear SetPlayerHealth y comparar con GetPlayerHealth
#1

Buenas, ultimamente estube desarrollando para mi anticheat de vida y he tenido esta preocupacion, pasa que lo hice desde un include y mi servidor consta de un Filterscript y un Gamemode, osea que tengo que incluir ese include en el FS y en el GM tambien, pasa que en el FS me llama SetPlayerHealth y hookea correctamente, pero no pasa eso en el GM, me explico mejor:
Mi include seria asi:
pawn Код:
new Vida[100];
new Float:VVida[100];
new bool:ya;
stock DarVida(jugador,Float:vida)
{
    Vida[jugador] = floatround(vida);
    return SetPlayerHealth(jugador,Vida[jugador]);
}

#if defined _ALS_SetPlayerHealth
    #undef SetPlayerHealth
#else
    #define _ALS_SetPlayerHealth
#endif
#define SetPlayerHealth DarVida

forward Detectar();
public Detectar()
{
    foreach(Player,i)
    {
        if(IsPlayerSpawned(i))
        {
            GetPlayerHealth(i,VVida[i]);
            if(Vida[i] != floatround(VVida[i]))
            {
                EnviarMensajeAdmins(ADMIN,"[Mini Misiones|Staff] Se ha detectado a un jugador haciendo hack de vida");
                printf("Vida[i]: %i, GetPlayerHealth(i): %i",Vida[i],floatround(VVida[i]));
            }
        }
    }
    return 1;
}

public OnPlayerConnect(playerid)
{
    if(ya == false) SetTimer("Detectar",3000,true);
    ya = true;
    #if defined AC_OnPlayerConnect
        return AC_OnPlayerConnect(playerid);
    #else
        return 1;
    #endif
}

#if defined AC_OnPlayerConnect
    forward AC_OnPlayerConnect(playerid);
#endif
#if defined _ALS_OnPlayerConnect
    #undef OnPlayerConnect
#else
    #define _ALS_OnPlayerConnect
#endif
#define OnPlayerConnect AC_OnPlayerConnect
Como ven tiene un temporizador de 3 segundos que obtiene la vida del jugador y comprueba si la vida del jugador es igual a la vida que esta seteada en SetPlayerHealth, y si no es igual se le advierte a los administradores. Este seria mi codigo en el FS:
pawn Код:
#include <Anticheat>//Mi anticheat

public OnPlayerSpawn(playerid)
{
       SetPlayerHealth(playerid,100.0);//Le doy vida al 100 cuando el jugador spawnea, esta funcion esta hookeada
       return 1;
}
Y tras comprobar por prints encuentro que salen dos prints, me sale asi:
Код:
Vida[i]: 100, GetPlayerHealth(i): 100
Vida[i]: 0, GetPlayerHealth(i): 100
Primero pense que seria un bug del include, pero luego probe desincluyendo <Anticheat> de mi GM y solo me salia un print:
Код:
Vida[i]: 100, GetPlayerHealth(i): 100
Y el Detectar() ya no decia que tenia cheat. El tema esta en que tambien necesitare incluir <Anticheat> en mi GM, si alguien me podria ayudar se lo agradeceria muchisimo! Saludos!
Reply
#2

Tu error es creer que los includes unen los scripts de los fs al gm pero no es asн, cuando complilas todo el contenido del include es unido con el del pwn entonces tu script estб duplicado tanto en el fs como en el gamemode por lo tanto si te das dinero en el gm el script del fs te detectara como hack igual pasaria si te das dinero en el gm el script del fs serб el que te detecte como hack, lo que tienes que hacer es crear una funciуn pъblica en el gm y llamarla desde el fs

En tu include convierte la funciуn local a una funcion publica para que pueda ser llamada remotamente desde otro script
pawn Код:
forward DarVida(jugador,Float:vida)
public  DarVida(jugador,Float:vida)
{
    Vida[jugador] = floatround(vida);
    return SetPlayerHealth(jugador,Vida[jugador]);
}
Y desde el fs ya puedes llamar a tu funciуn
pawn Код:
DarVida(playerid,Float:vida) {
    CallRemoteFunction("DarVida","if",playerid,vida);
}
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)