Anti money funciona solo para una id
#1

Bueno resulta que este anti money solo funciona para la id 0 osea siendo id 1 podes usar cheats normalmente.
їQue puede ser?

Код:
new Dinero[MAX_PLAYERS];

forward ChecarMoney(playerid);

OnGamemodeInit 
SetTimer("ChecarMoney", 1000, true);

stock SetPlayerMoney(playerid, amount)
{
    ResetPlayerMoney(playerid);
    Dinero[playerid] = amount;
    GivePlayerMoney(playerid, amount);
    return 1;
}

public ChecarMoney(playerid)
{
	for(new i = 0; i < MAX_PLAYERS; i++)
     {
     if(IsPlayerConnected(i))
 	   {
 	      if(GetPlayerMoney(i) != Dinero[playerid])
        {
            SetPlayerMoney(playerid, Dinero[playerid]);
        }
    }
}
}
Reply
#2

Hola, supongo que asн deberнa funcionar.

pawn Код:
public ChecarMoney(playerid)
{
    for(new i = 0; i < MAX_PLAYERS; i++)
    {
        if(IsPlayerConnected(i))
        {
            if(GetPlayerMoney(i) != Dinero[i])
            {
                SetPlayerMoney(i, Dinero[i]);
            }
        }
    }
}
Creo que en la 0.3.7 hay que usar GetPlayerPoolSize y no MAX_PLAYERS, pero no estoy seguro.
Reply
#3

"ChecarMoney" no debe usar el parбmetro playerid, no tiene sentido.
Reply
#4

Exactamente como dice aoEXE, el parбmetro que estбs enviandole con la funciуn no deberнa estar ahн. Estбs enviando un Timer sin parбmetros por lo que la funciуn deberнa ir sin йl

pawn Код:
SetTimer("Probar", 5000, true); // Este Timer no recibe parбmetros, por lo tanto, la funciуn tendrнa que ser asн..

forward Probar();
public Probar()
{
   SendClientMessageToAll(-1, "Hola mundo");
   return 1;
}

Ahora, si vos queres un Timer que se ejecute para cada jugador, cumpliendo distintas funciones para йl, deberнas usar esta funciуn:

SetTimerEx("Probar", 5000, true, "i", playerid); // Enviamos el parбmetro 'i' haciendo referencia a que vamos a enviar un nъmero entero, y luego le pasamos la variable playerid, el cual enviarнa la ID del jugador hacia la funciуn.

Entonces ahora sн:

forward Probar(playerid);
public Probar(playerid)
{
   SendClientMessage(playerid, -1, "Soy un Timer que te espнa");
   return 1;
}
Esta informaciуn tambiйn la encontras en la wiki de sa-mp. Pero creo que no habrнa problema al ejecutar esa comprobaciуn en OnPlayerUpdate, debido a que comprueba, setea y listo.

pawn Код:
public OnPlayerUpdate(playerid);
{
   if(GetPlayerMoney(playerid) != Dinero[playerid])
   {
      SetPlayerMoney(playerid, Dinero[playerid]);
   }
   return 1;
}
Reply
#5

їPor quй intentas comparar el valor que se esta obteniendo de todos los jugadores con la variable del un jugador?

No puedes hacer lo que anteriormente dije, la condicional nunca se cumplirнa y por lo tanto las personas a partir de la ID 1 podrнan hackear, como dices tu. Ademбs de lo anterior, repones el dinero del jugador ID x al valor que este (suponiendo) ya ha de tener.

Quote:
Originally Posted by Juance
Посмотреть сообщение
Esta informaciуn tambiйn la encontras en la wiki de sa-mp. Pero creo que no habrнa problema al ejecutar esa comprobaciуn en OnPlayerUpdate, debido a que comprueba, setea y listo.

pawn Код:
public OnPlayerUpdate(playerid);
{
   if(GetPlayerMoney(playerid) != Dinero[playerid])
   {
      SetPlayerMoney(playerid, Dinero[playerid]);
   }
   return 1;
}
Sobre eso, dependiendo de cuanta cantidad de chequeos tenga el callback, puede llegar a lagear mucho el servidor ya que el callback es llamado unas 90 veces por segundo. Un timer de 1 o 2 segundos podrнa ser suficiente para que la persona que esta intentando hackear no pueda gastar dicho dinero.

Quote:
Originally Posted by Mamoru
Посмотреть сообщение
Creo que en la 0.3.7 hay que usar GetPlayerPoolSize y no MAX_PLAYERS, pero no estoy seguro.
No, no es necesario usar GetPlayerPoolSize en la 0.3.7, sin embargo, con esta puedes saltarte chequear que un usuario este conectado dado a que devuelve la ID mбs alta del servidor. Podrнas hacer:

pawn Код:
#undef MAX_PLAYERS//Quita la definiciуn de MAX_PLAYERS dada por SA-MP, que es 500.

#define MAX_PLAYERS GetPlayerPoolSize()//Estariamos usando el valor mбs alto de jugadores, en vez de chequear 500 usuarios de los cuales gran mayoria podrнan estar desconectados.

//Entonces

for(new i = 0 , j = MAX_PLAYERS; i < j ; i++)//Se usa j para no repetir el llamado de la funciуn en cada bъcle.
{
       if(GetPlayerMoney(i) != Dinero[i])
       {
             SetPlayerMoney(i, Dinero[i]);
       }
}
Edit:

Me di cuenta de que si defines MAX_PLAYERS como GetPlayerPoolSIze, teniendo arrays que usen el MAX_PLAYERS, causarб un colapso del compilador. Entonces...
pawn Код:
#define MAX_PLAYERS 100//Para arrays
#define MAX_BPLAYERS GetPlayerPoolSize()//para bucles
//O simplemente a las arrays ponles el nъmero de jugadores.
Reply
#6

Код:
new Dinero[MAX_PLAYERS];

forward ChecarMoney();

OnGamemodeInit 
SetTimer("ChecarMoney", 1000, true);

stock SetPlayerMoney(playerid, amount)
{
    ResetPlayerMoney(playerid);
    Dinero[playerid] = amount;
    GivePlayerMoney(playerid, amount);
    return 1;
}

public ChecarMoney()
{
	for(new i = 0; i < MAX_PLAYERS; i++)
     {
     if(IsPlayerConnected(i))
 	   {
 	      if(GetPlayerMoney(i) > Dinero[i])
        {
            SetPlayerMoney(playerid, Dinero[i]);
        }
    }
}
}
Reply
#7

Quote:
Originally Posted by xXmAn40100Xx
Посмотреть сообщение
No, no es necesario usar GetPlayerPoolSize en la 0.3.7, sin embargo, con esta puedes saltarte chequear que un usuario este conectado dado a que devuelve la ID mбs alta del servidor. Podrнas hacer:

pawn Код:
#undef MAX_PLAYERS//Quita la definiciуn de MAX_PLAYERS dada por SA-MP, que es 500.

#define MAX_PLAYERS GetPlayerPoolSize()//Estariamos usando el valor mбs alto de jugadores, en vez de chequear 500 usuarios de los cuales gran mayoria podrнan estar desconectados.

//Entonces

for(new i = 0 , j = MAX_PLAYERS; i < j ; i++)//Se usa j para no repetir el llamado de la funciуn en cada bъcle.
{
       if(GetPlayerMoney(i) != Dinero[i])
       {
             SetPlayerMoney(i, Dinero[i]);
       }
}
A LA MIERDA LA MEMORIA ESTБTICA
Reply
#8

Simple, usa el include foreach y solucionado.. no tendras un loop tan largo innecesariamente
Reply
#9

їPara quй usar una funciуn que compruebe todos los usuarios? no van a morirse por usar OnPlayerUpdate. Obviamente no vas a meter 10 mil lineas ahн, pero podes colocar una comprobaciуn como lo es el dinero.
Reply
#10

*borren este msg, error de post*
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)