[Tutorial] Uso correcto de params con sscanf en ZCMD e YCMD
#1

Tutorial -Uso correcto de params con sscanf en ZCMD e YCMD
Buenas hoy os vengo con un pequeсo tutorial de como usar sscanf correctamente en los procesadores de comandos ZCMD e YCMD.

Empezamos este metodo que les voy a explicar evita las creaciones de Variables y asi al mismo tiempo consumimos menos Byte y hacemos una pequeсa optimizaciуn en el comando, ya que este metodo al no crear una Variable cada vez que se ejecuta el comando entonces hace la lectura del codigo un poco mas rapida.

Muchos cometen el error de que al usar sscanf crean una Variable para cada parametro del sscanf.

Ejemplo ZCMD:

pawn Код:
CMD:dardinero(playerid, params[])
{
    new dinero, jugador;
    if(!sscanf(params, "ri", jugador, dinero))
    {
        GivePlayerMoney(jugador, dinero);
    }
    else SendClientMessage(playerid, -1 "Uso: /dardinero [ID] [DINERO]");
    return 1;
}
Ejemplo YCMD:

pawn Код:
YCMD:dardinero(playerid, params[], help)
{
    new dinero, jugador;
    if(help) return SendClientMessage(playerid, -1 "Este comando sirve para entregar dinero a un jugador.");
    if(!sscanf(params, "ri", jugador, dinero))
    {
        GivePlayerMoney(jugador, dinero);
    }
    else SendClientMessage(playerid, -1 "Uso: /dardinero [ID] [DINERO]");
    return 1;
}
Como podemos notar en el ejemplo es lo que hacen muchas personas, pero esto en verdad no deberia ir asi.

Deberia ir de esta manera, ejemplo:

Ejemplo ZCMD:

pawn Код:
CMD:dardinero(playerid, params[])
{
    if(!sscanf(params, "ri", params[0], params[1]))
    {
        GivePlayerMoney(params[0], params[1]);
    }
    else SendClientMessage(playerid, -1 "Uso: /dardinero [ID] [DINERO]");
    return 1;
}
pawn Код:
YCMD:dardinero(playerid, params[], help)
{
    if(help) return SendClientMessage(playerid, -1 "Este comando sirve para entregar dinero a un jugador.");
    if(!sscanf(params, "ri", params[0], params[1]))
    {
        GivePlayerMoney(params[0], params[1]);
    }
    else SendClientMessage(playerid, -1 "Uso: /dardinero [ID] [DINERO]");
    return 1;
}
Bueno el parametro "params[]" sirve para agregar parametros a un comando o mejor dicho para que entiendan, opciones a un comando.

їComo usarlo?

Bueno es sumamente facil, simplemente asignaremos a cada parametro "params" un slot para almacenar el dato insertado en el sscanf para luego ser usado en una determinada funciуn, Ejemplo: "params[0]", params[1], params[2]", entonces "params[0]" este almacenara un dato diferente a "params[1] y params[2]" ya que contienen diferentes slots, cada slot se asigna entre los " [] ", Ejemplo: params[0], params[1], ect.

Ejemplo ZCMD:

pawn Код:
CMD:banear(playerid, params[])
{
    new string[128]; // Definimos este array para almacenar el formato del texto al usar la funciуn format().
    if(!sscanf(params, "rs[128]", params[0], params[1]))
    {
        format(string, sizeof(string), "Un administrador te ha baneado. razуn: %s", params[1]); // Aqui ponemos params[1], porque este almacena el "STRING" insertado en el sscanf o mejor dicho almacena la razуn del baneo.
        SendClientMessage(params[0], -1, string); // Esto enviarб el mensaje que contiene la funciуn format, al usuario baneado.
        Ban(params[0]); // Aqui ponemos params[0], porque este almacena la ID del jugador insertado en el sscanf.
    }
    else SendClientMessage(playerid, -1 "Uso: /banear [ID] [RAZУN]");
    return 1;
}
Ejemplo YCMD:

pawn Код:
YCMD:banear(playerid, params[], help)
{
    new string[128]; // Definimos este array para almacenar el formato del texto al usar la funciуn format().
    if(help) return SendClientMessage(playerid, -1 "Este comando sirve para banear a un jugador.");
    if(!sscanf(params, "rs[128]", params[0], params[1]))
    {
        format(string, sizeof(string), "Un administrador te ha baneado. razуn: %s", params[1]); // Aqui ponemos params[1], porque este almacena el "STRING" insertado en el sscanf o mejor dicho almacena la razуn del baneo.
        SendClientMessage(params[0], -1, string); // Esto enviarб el mensaje que contiene la funciуn format, al usuario baneado.
        Ban(params[0]); // Aqui ponemos params[0], porque este almacena la ID del jugador insertado en el sscanf.
    }
    else SendClientMessage(playerid, -1 "Uso: /banear [ID] [RAZУN]");
    return 1;
}
Recordad que un slot "params" puede almacenar numericos, string, float, ect. Asi que no hay necesidad de definir una Variable para cada parametro del sscanf, simplemente usamos un slot de "params[]".

Fin del tutorial, espero que les haya gustado, cualquier duda postear por este mismo post.


Creditos: oOFotherOo - Creador del tutorial.

Un saludo.
Reply
#2

Que buena la intenciуn de este tutorial, pero la primera forma que dejaste de ejemplo es la mejor, porque el cуdigo es mбs entendible, es mejor poner GivePlayerMoney(jugadorid,cantidad); que poner params[0],params[1].

con lo que dices de las dimenciones en realidad son celdas o slots, los arrays en pawn solo soportan hasta 3 dimensiones.

pawn Код:
Array[MAX_PLAYERS]; //En primea dimension.
Array[MAX_PLAYERS][MAX_CARS]; //En segunda
Array[MAX_PLAYERS][MAX_CARS][DATA]; //En tercera
Reply
#3

Quote:
Originally Posted by Daniel-92
Посмотреть сообщение
Que buena la intenciуn de este tutorial, pero la primera forma que dejaste de ejemplo es la mejor, porque el cуdigo es mбs entendible, es mejor poner GivePlayerMoney(jugadorid,cantidad); que poner params[0],params[1].

con lo que dices de las dimenciones en realidad son celdas o slots, los arrays en pawn solo soportan hasta 3 dimensiones.

pawn Код:
Array[MAX_PLAYERS]; //En primea dimension.
Array[MAX_PLAYERS][MAX_CARS]; //En segunda
Array[MAX_PLAYERS][MAX_CARS][DATA]; //En tercera
El codigo es mas entendible pero diria que a la vez mas lento, en seguida arreglo eso es que me travo con algunas cosas ya que no se me da muy bien explicar.

Un saludo.
Reply
#4

buen tuto . brother xp. hay me lo leo mas tarde

PD: Conectate al skype )!
Reply
#5

Que es eso de "ri" o "rs" ?
Reply
#6

Quote:
Originally Posted by elvago
Посмотреть сообщение
Que es eso de "ri" o "rs" ?
Disculpa se me olvidу explicar esa parte.
Код:
El parametro "r" en sscanf es para procesar el ID o Nombre de un jugador. 

El parametro "s" en sscanf es para procesar una cadena de strings.

El parametro "i" en sscanf es para procesar un numerico.
Un saludo.
Reply
#7

Muy buen tuto amigo Les servirб para los que quieran aprender a como funciona un poco sscanf y zcmd/ycmd
Reply
#8

LOL, hace unos minutos pense que manejaba al 100% el zcmd con sscanf, y ahora veo que hago lo que dices que NO se debe hacer xD. Pero en que afecta? es decir, el resultado al final es lo mismo no?
Reply
#9

Quote:
Originally Posted by CrossOv3r
Посмотреть сообщение
LOL, hace unos minutos pense que manejaba al 100% el zcmd con sscanf, y ahora veo que hago lo que dices que NO se debe hacer xD. Pero en que afecta? es decir, el resultado al final es lo mismo no?
Si basicamente lo mismo, aunque de esta forma se ejecutarian un poco mas rapido los comandos, pero de la otra forma el codigo es mas entendible y menos confuso.

Un saludo.
Reply
#10

Quote:
Originally Posted by CrossOv3r
Посмотреть сообщение
LOL, hace unos minutos pense que manejaba al 100% el zcmd con sscanf, y ahora veo que hago lo que dices que NO se debe hacer xD. Pero en que afecta? es decir, el resultado al final es lo mismo no?
En Algunas Veces Afecta Mucho,Ya que da Warnings (Aveces) Y eso sifnifica que no se utiliza Correctamente. O No esta Siendo utilizada y sera tomada como estorbo.


їContesta tu Pregunta?
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)