[Tutorial] Como crear comandos.
#1

Hola todos, en este tutorial aprenderemos a crear comandos con o sin parбmetros. Debemos saber que existen muchos metodos para crear comandos entre los cuales estan:
  • strcmp
  • strock
  • dcmd
  • zcmd
Y muchos otros mбs metodos. En este tutorial utilizaremos dcmd y zcmd, debido a que son los mбs faciles de crear y mбs eficientes por ahora. Tambiйn utilizaremos sscanf para checkear los parametros del comando.
_________________________________________________
Sscanf
Para poder utilizarlo debemos agregar el siguiente codigo a nuestro script (se recomienda agregarlo al final):
Sscanf (link).
Despuйs de haberlos agregado ya estara listo para ser usado en conjunto con los comandos. Recuerda que para poder crear los comandos ya debe estar agregado al script.
_________________________________________________
Comandos con dcmd
Para poder crearlos necesitamos agregar el siguiente codigo (agregarlo en la parte de los "#define"):
pawn Код:
#define dcmd(%1,%2,%3) if (!strcmp((%3)[1], #%1, true, (%2)) && ((((%3)[(%2) + 1] == '\0') && (dcmd_%1(playerid, ""))) || (((%3)[(%2) + 1] == ' ') && (dcmd_%1(playerid, (%3)[(%2) + 2]))))) return 1
Despuйs de agregado este codigo nos vamos a el callback OnPlayerCommandText y comenzamos a crear nuestros comandos. Antes de crearlos necesitamos declararlos, por lo que debemos hacerlo de la siguiente forma:
pawn Код:
public OnPlayerCommandText(playerid, cmdtext[])
{
  dcmd(comando, lengh, cmdtext);
  //comando = nombre del comando.
  //lengh = tamaсo del comando (cantidad de carбcteres).
  //cmdtext = no se cambia, siempre va eso.
  return 0; // return 0; se puede cambiar por un mensaje, por ejemplo: return SendClientMessage(playerid, color, "comando desconocido.");
}
Por ejemplo, los comandos /morir y /vida:
pawn Код:
public OnPlayerCommandText(playerid, cmdtext[])
{
  dcmd(morir, 5, cmdtext);
  dcmd(vida, 4, cmdtext);
  return SendClientMessage(playerid, 0xFFFFFFFF, "Comando desconocido.");
}
Entonces, ya declaramos el comando que vamos a hacer, ahora vamos a crearlo. Para crearlo lo debemos hacer de la siguiente forma:
pawn Код:
dcmd_comando(playerid, params[]) // en donde dice comando ponemos el nombre del comando ya declarado arriba...
{
  //efecto del comando
  return 1;
}
Por ejemplo los comandos /holatodos y /chao:
pawn Код:
public OnPlayerCommandText(playerid, cmdtext[])
{
  dcmd(holatodos, 9, cmdtext);
  dcmd(chao, 4, cmdtext);
  return 0; // esta vez quiero que cuando el comando sea desconocido se muestre el mensaje por defecto "Unknown command." por lo que pongo return 0;
}

dcmd_holatodos(playerid, params[])
{
  // efecto del comando
  return 1;
}

dcmd_chao(playerid, params[])
{
  //efecto
  return 1; // siempre se pone return 1; al final del comando  
}
Antes de seguir, debemos saber que existen varios tipos de comandos:
  • Sin Parametros (ejemplo: /morir)
  • Uniparametros (ejemplo: /mundo [id del mundo])
  • Multiparametros(ejemplo: /vehiculo [id del veh'] [color del veh'])
Comandos con parametros
Para crear comandos con parametros necesitamos utilizar sscanf, por ejemplo /matar [id] (para matar a alguien, tiene un parametro que es "id"):
pawn Код:
dcmd_matar(playerid, params[])
{
  new id; // necesitamos crear una varible para guardar el id del jugador que queremos matar.
  new string; // para hacer el mensaje de muerte
  if(sscanf(params, "u", id)) // esto checkea si escribiste todos los parametros, si no lo hiciste se manda el mensaje de error de abajo
  {
    SendClientMessage(playerid, 0xFFFFFFFF, "Uso correcto: /matar [player id]"); // es el mensaje que se manda si no se escribieron los parametros (el id)
  }  
  else if(IsPlayerConnected(id)) return SendClientMessage(playerid, 0xFFFFFFFF, "Ese jugador no esta conectado!"); // esto es opcional, lo puse solo para ver si el jugador esta conectado.
  else // esto es lo que pasa si los parametros fueron introducidos correctamente, es decir, si pusiste el id del jugador y si el jugador esta conectado
  {
    SetPlayerHealth(id, 0.0); // se cambia la vida del jugador a 0
    format(string, sizeof(string), "Has matado al jugador numero %d!", id); // aqui creamos el mensaje que vamos a dar, dandole formato al "string"
    SendClientMessage(playerid, 0xFFFFFFFF, string); // se manda el mensaje guardado en string.
  }
  return 1;
}
Por lo que observaras, el sscanf en este caso, sirve para ver si el jugador introdujo los parametros, pero para esto necesitamos saber como utilizarlo correctamente:

pawn Код:
sscanf(lo que queremos ver si estб, "tipo de parametro o variable", la variable ya definida);
Como en el comando que hicimos, lo que queremos ver es si el jugador introdujo el parametro, entonces el sscanf va a checkear si esta "params". Entonces sustituimos "lo que queremos ver si esta" por params.
pawn Код:
sscanf(params, "tipo de parametro o variable", la variable ya definida);
Lo siguiente es ver que tipo de variable vamos a checkear. A continuaciуn los tipos de variables y sus respectivos ejemplos:

c - Un caracter. (ejemplo: a, b, c, d...)
d, i - Un numero o cifra. (ejemplo: 1, 2, 3, 14, 10048...)
h, x - Un numero hexadecimal. (ejemplo: colores: 0xFFFFFFFF).
f - Un decimal. (ejemplo: una coodernada 1025.0777).
s - Un string o texto. (ejemplo: "casa" o "pera")
z - Un texto opcional. (ejemplo: la razon de una expulsiуn la cual no siempre tienes que poner)
pX - Un delimitador, siendo la letra "x" un caracter. (ejemplo: ps, la s seria el delimitador)
u - Un jugador o ID de un jugador.

Debido a que el tipo de variable que estamos buscando es el ID de un jugador utilizamos "u" (cambiamos "tipo de parametro o variable" por "u")

pawn Код:
sscanf(params, "u", la variable ya definida);
Y por ultimo la variable a la cual le vamos a asignar el parametro (tenemos que crearla primero), que en este caso es "id" (new id. Cambiamos "la variable ya definida" por "id"
pawn Код:
sscanf(params, "u", id);
Ya tenemos nuestro sscanf listo!
Recomiendo investigar como utilizar el if, else if y el else para poder controlar tu comando y limitarlo a lo que tu quieras. Por ahora utilizamos el if para ver si sscanf no detecto nada, si no lo hizo entonces pasa lo que esta entre brackets {} (el mensaje de como usar el comando).

Comandos sin parametros
Estos son mucho mбs simples de hacer, lo unico que necesitas es declarar que no vas a utilizar el parametro y hacer las limitaciones de su uso. Ejemplo: /morir

pawn Код:
dcmd_morir(playerid, params[])
{
  #pragma unused params // se coloca esto para declarar que no vamos a utilizar un parametro
  SetPlayerHealth(playerid, 0.0); // el efecto, morir!
  return 1; // siempre se coloca al final del comando
}
_________________________________________________

Comandos con zcmd

Son muchos mas faciles de realizar que los que utilizan dcmd. Para crearlos necesitamos agregar a nuestros includes (Carpeta de tu sever > Pawno > Includes) este .INC:
http://solidfiles.com/d/879d1213462f...16d464e90c8cf9

Despuйs de haberlos descargado en la carpeta de "includes" nos vamos a nuestro script, en la parte de arriba donde estan todos los #include <> y agregamos:
pawn Код:
#include <zcmd>
Tambiйn debemos recordar poner el sscanf lo cual ya dijimos como hacerlo... Ahora procedemos a crear nuestros comandos.
Con el zcmd no necesitamos el callback "OnPlayerCommandText" por lo que lo borramos y lo sustituimos por:
pawn Код:
public OnPlayerCommandReceived(playerid, cmdtext[])
{
  // esto lo puedes utilizar para muchas cosas como por ejemplo hacer que en la consola aparesca el mensaje que escribiste
  new string[80];
  format(string, sizeof(string), "* %s (ID:%d) has typed: %s", pName(playerid), playerid, cmdtext);
  printf("[Command] %s: %s", pName(playerid), cmdtext); // imprime el comando que escribiste en la consola!
  return 1;
}

public OnPlayerCommandPerformed(playerid, cmdtext[], success)
{
  if(!success)
  {
    //lo que quieres que pase si el comando no existe, por ejemplo: SendClientMessage(playerid, 0xFFFFFFFF, "Comando desconocido.");  
    return 1;
  }
  return 1;
}
Despuйs de agregado esto podemos empezar a hacer nuestros comandos normalmente, OJO, no los tenemos que declarar primero como en el caso de los hechos en dcmd.

Ejemplos:

pawn Код:
//estos comandos se pueden hacer de varias formas:

CMD:nombredelcomando(playerid, params[])
COMMAND:nombredelcomando(playerid, params[])
cmd(nombredelcomando, playerid, params[])
command(nombredelcomando, playerid, params[])

//vamos a utilizar la primera

CMD:matar(playerid, params[])
{
  new id; // necesitamos crear una variable para guardar el id del jugador que queremos matar.
  new string; // para hacer el mensaje de muerte
  if(sscanf(params, "u", id)) // esto checkea si escribiste todos los parametros, si no lo hiciste se manda el mensaje de error de abajo
  {
    SendClientMessage(playerid, 0xFFFFFFFF, "Uso correcto: /matar [player id]"); // es el mensaje que se manda si no se escribieron los parametros (el id)
  }  
  else if(IsPlayerConnected(id)) return SendClientMessage(playerid, 0xFFFFFFFF, "Ese jugador no esta conectado!"); // esto es opcional, lo puse solo para ver si el jugador esta conectado.
  else // esto es lo que pasa si los parametros fueron introducidos correctamente, es decir, si pusiste el id del jugador y si el jugador esta conectado
  {
    SetPlayerHealth(id, 0.0); // se cambia la vida del jugador a 0
    format(string, sizeof(string), "Has matado al jugador numero %d!", id); // aqui creamos el mensaje que vamos a dar, dandole formato al "string"
    SendClientMessage(playerid, 0xFFFFFFFF, string); // se manda el mensaje guardado en string.
  }
  return 1;
}
Se hace exactamente igual que el dcmd, utilizando sscanf, lo ъnico es que en vez de utilizar dcmd_matar utilizamos CMD:matar.

Otro ejemplo:

pawn Код:
command(morir, playerid, params[])
{
  #pragma unused params // se coloca esto para declarar que no vamos a utilizar un parametro
  SetPlayerHealth(playerid, 0.0); // el efecto, morir!
  return 1; // siempre se coloca al final del comando
}
Como acabamos de ver, ponemos primero command y despues ponemos entre parentesis: (nombredelcomando, playerid, params[]).

Bueno, eso ha sido todo el tutorial, espero que saquen lo que necesiten, lo utilizen y que lo disfruten!

Thanks!
Reply
#2

Eres un crack tio Ni te imaginas lo que me a servido Muchas gracias!!
Reply
#3

muy bueno amigo excelente aporte
Reply
#4

Cualquier duda pregunten dentro de este topic para tratar de mantener el foro limpio.
Reply
#5

pawn Код:
dcmd(morir, 5, cmdtext);
їEse 5 quй quiere decir?
Reply
#6

Quote:
Originally Posted by CristianTdj
pawn Код:
dcmd(morir, 5, cmdtext);
їEse 5 quй quiere decir?
Es el largo del comando. Como morir tiene 5 letras, hay que poner un 5.
Reply
#7

Excelente dato tutorial, vere que hago en mi GM
Reply
#8

Quote:
Originally Posted by Zamaroht
Quote:
Originally Posted by CristianTdj
pawn Код:
dcmd(morir, 5, cmdtext);
їEse 5 quй quiere decir?
Es el largo del comando. Como morir tiene 5 letras, hay que poner un 5.
Ah, ok gracias.
Reply
#9

Interesante
Reply
#10

Hice un comando para el Hadmin y me fue bien con dcmd, gracias
Reply
#11

Bueno, no se si se han dado cuenta, pero para los que utilizamos sscanf, ya saliу una version nueva de sscanf (sscanf 2.0) y ya habrб que actualizar la guнa tambiйn.
Reply
#12

muy buen aporte sirve para los q no sabemos sobre algunas cosas xq siempre uso strcmp o dcmd
Reply
#13

їLos textos "u" pueden ser separados no?

Ej: "Jugador CristianTdj os saluda".
Reply
#14

Quote:
Originally Posted by CristianTdj
їLos textos "u" pueden ser separados no?

Ej: "Jugador CristianTdj os saluda".
XDDD fuera de esto Muy buen post (como en taringa xD)

Reply
#15

Quote:
Originally Posted by xenowort
Quote:
Originally Posted by CristianTdj
їLos textos "u" pueden ser separados no?

Ej: "Jugador CristianTdj os saluda".
XDDD fuera de esto Muy buen post (como en taringa xD)
ї?

їPuedo hacer lo que dije?
Reply
#16

Quote:
Originally Posted by CristianTdj
Quote:
Originally Posted by xenowort
Quote:
Originally Posted by CristianTdj
їLos textos "u" pueden ser separados no?

Ej: "Jugador CristianTdj os saluda".
XDDD fuera de esto Muy buen post (como en taringa xD)
ї?

їPuedo hacer lo que dije?
no entendi exactamente lo que queres hacer, pero si no entendi mal, podrias usar la funcion split, para separar el texto entre "u"

espero que te sirva
Reply
#17

Los textos "u" pueden significar dos cosas, nombre del jugador o el ID, no importa donde lo pongas...

Code:
sscanf(params, "du", int, id);
sscanf(params, "ussss", id, string, string, string, string);
Reply
#18

Quote:
Originally Posted by SAWC™
Los textos "u" pueden significar dos cosas, nombre del jugador o el ID, no importa donde lo pongas...

Code:
sscanf(params, "du", int, id);
sscanf(params, "ussss", id, string, string, string, string);
ah, xD no habia entendido nada tonces.
perdon
Reply
#19

Quote:
Originally Posted by CristianTdj
Quote:
Originally Posted by xenowort
Quote:
Originally Posted by CristianTdj
їLos textos "u" pueden ser separados no?

Ej: "Jugador CristianTdj os saluda".
XDDD fuera de esto Muy buen post (como en taringa xD)
ї?

їPuedo hacer lo que dije?
Que cosa xD?
Reply
#20

Como crearia un comando de chat administrativo?
Como crearia un comando para dar administrador?

їQuй hace que los sistemas no se mesclen? Osea, todo estб junto, como hago para separar un sistema de comandos de otro?
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)