[Tutorial] Como usar OnPlayerCommandText con ZCMD
#1

Buenas, antes de nada me gustarнa decir que este tutorial no es mio y que ZCMD es una buena forma de procesar los comandos, pero hay un problema utilizando secuencias de comandos, tienen muchos comandos definidos ya, utilizando otros mйtodos que exigen la devoluciуn de llamada OnPlayerCommandText (como strcmp o dcmd). Si deseas utilizar ZCMD allн, tendrнa que convertir todos los comandos en ZCMD. Pero si tienes muchos comandos, podrнa tomar mucho tiempo. Afortunadamente, hay una soluciуn para ese problema.
Puedes colocar el contenido de zcmd.inc dentro de su GameMode / FilterScript;

Define

Primero, elige como quieres definir tus comandos:

Si estas usando: COMMAND:micomando(playerid, params[]), pon esto en tu Script:

pawn Код:
#define COMMAND:%1(%2)          \
            forward cmd_%1(%2); \
            public cmd_%1(%2)
Si no estбs usando ese y estas usando otro como cmd(....), CMD:comando...., command(..) usa el que necesites:

pawn Код:
#define CMD:%1(%2)          \
            forward cmd_%1(%2); \
            public cmd_%1(%2)

//=============

#define command(%1,%2)          \
            forward cmd_%1(%2); \
            public cmd_%1(%2)

//=============

#define cmd(%1,%2)          \
            forward cmd_%1(%2); \
            public cmd_%1(%2)
OnPlayerCommandText

Ahora a la CallBack 'OnPlayerCommandText:

pawn Код:
public OnPlayerCommandText(playerid, cmdtext[])
{
    new
        pos,
        funcname[32];
    while (cmdtext[++pos] > ' ')
    {
        funcname[pos-1] = tolower(cmdtext[pos]);
    }
    format(funcname, sizeof(funcname), "cmd_%s", funcname);
    while (cmdtext[pos] == ' ') pos++;
    if (!cmdtext[pos])
    {
        return CallLocalFunction(funcname, "is", playerid, "");
    }
    return CallLocalFunction(funcname, "is", playerid, cmdtext[pos]);
}
Si quieres cambiar el mensaje de por defecto de cuando el comando no existe.

NOTA: Ъsalo sуlo en el script del GameMode, porque retornando a 1 en un FilterScript desactivarб comandos de otros scripts..

pawn Код:
public OnPlayerCommandText(playerid, cmdtext[])
{
    new
        pos,
        funcname[32];
    while (cmdtext[++pos] > ' ')
    {
        funcname[pos-1] = tolower(cmdtext[pos]);
    }
    format(funcname, sizeof(funcname), "cmd_%s", funcname);
    while (cmdtext[pos] == ' ') pos++;
    if (!cmdtext[pos]) cmdtext[pos] = '';
    if(!CallLocalFunction(funcname, "is", playerid, cmdtext[pos]))
    {
        SendClientMessage(playerid, -1, "[SERVER] Comando {FF0000}erroneo");
    }
    return 1;
}
Y ahн ya habrбs acabado.

EJEMPLO

pawn Код:
public OnPlayerCommandText(playerid, cmdtext[])
{
    if(strcmp(cmdtext, "/ayuda", true) == 0)
    {
        SendClientMessage(playerid, -1, "Comandos disponibles: /suicidarse - /ayuda");
        return 1;
    }

    if(strcmp(cmdtext, "/suicidarse", true) == 0)
    {
        SetPlayerHealth(playerid, 0);
        return 1;
    }

    new
        pos,
        funcname[32];
    while (cmdtext[++pos] > ' ')
    {
        funcname[pos-1] = tolower(cmdtext[pos]);
    }
    format(funcname, sizeof(funcname), "cmd_%s", funcname);
    while (cmdtext[pos] == ' ') pos++;
    if (!cmdtext[pos])
    {
        return CallLocalFunction(funcname, "is", playerid, "");
    }
    return CallLocalFunction(funcname, "is", playerid, cmdtext[pos]);
}
NOTA: No necesitarбs aсadir la lнnea: #include <zcmd>

EDITO: Si quieren una forma MUUUUUCHO mбs fбcil:

Poned encima del gm:

pawn Код:
#include <zcmd>
Y cambiad "OnPlayerCommandText" por:

pawn Код:
public OnPlayerCommandPerformed(playerid, cmdtext[], success)
{
    if(success)
    {
        return 1;
    }
   
    if(strcmp(cmdtext, "/ayuda", true) == 0)
    {
        SendClientMessage(playerid, -1, "Comandos disponibles: ");
        return 1;
    }
   
    if(strcmp(cmdtext, "/morir", true) == 0)
    {
        SetPlayerHealth(playerid, 0);
        return 1;
    }
   
    return 0;
}
Crйditos: ZeeX por el original include ZCMD, MadeMan (por el tutorial en ingles), yo por la traducciуn del tutorial.

PD: No sй si ya lo tradujeron antes, es el motivo por el que lo he hecho yo.
Un saludo, y espero que valoren el esfuerzo.
Reply


Messages In This Thread

Forum Jump:


Users browsing this thread: 1 Guest(s)