Ayuda params[]
#1

pues quisiera saber si se puede hacer un macro de params[] (como los params que utiliza dcmd)
Reply
#2

lo que quieres es usar params en comandos de strcmp? porque ZCMD ya lleva definido params.
Reply
#3

Si lo quieres en OnPlayerCommandText:
Sscanf
pawn Код:
public OnPlayerCommandText(playerid, cmdtext[])
{
    new cmd[20], params[80];
    sscanf(cmdtext, "ss", cmd, params);
    //...
    return 0;
}
Strtok
pawn Код:
public OnPlayerCommandText(playerid, cmdtext[])
{
    new idx, cmd[20], params[80];
    cmd = strtok(cmdtext, idx);
    params = strtok(cmdtext, index);
    //...
    return 0;
}
Creo que todos los demбs lo traen incluido.
Reply
#4

Quote:
Originally Posted by Bu11Sh0t
Посмотреть сообщение
Si lo quieres en OnPlayerCommandText:
Sscanf
pawn Код:
public OnPlayerCommandText(playerid, cmdtext[])
{
    new cmd[20], params[80];
    sscanf(cmdtext, "ss", cmd, params);
    //...
    return 0;
}
Strtok
pawn Код:
public OnPlayerCommandText(playerid, cmdtext[])
{
    new idx, cmd[20], params[80];
    cmd = strtok(cmdtext, idx);
    params = strtok(cmdtext, index);
    //...
    return 0;
}
Creo que todos los demбs lo traen incluido.
pero no quiero usar sscanf, ni ningun procesador (ya que estoy creando uno y necesito saber como es esto) entonces esos params me daran los datos asi? ejemplo params[0] params[1] params[2]?

saludos
Reply
#5

Quote:
Originally Posted by Shiny_David
Посмотреть сообщение
pero no quiero usar sscanf, ni ningun procesador (ya que estoy creando uno y necesito saber como es esto) entonces esos params me daran los datos asi? ejemplo params[0] params[1] params[2]?

saludos
Vas a necesitar una funciуn para separar a params, params es la variable que almacena todo lo que va despues del comando, por lo tanto si pones params[0], params[1] y params[2] funcionarнa mal.
Ejemplo, ingresas el comando /sethealth 0 100, params serнa igual a "0 100", si lo usas asi, params[0] serнa el 0 y params[1] serнa el espacio que le sigue.
Acб es donde entra en juego strtok o sscanf, si no queres usar sscanf el plugin, hay una versiуn el cуdigo de sscanf, obviamente sigue siendo rбpida pero es menos ineficiente que el plugin que estб hecho en C++.
pawn Код:
/*----------------------------------------------------------------------------*-
Function:
    sscanf
Params:
    string[] - String to extract parameters from.
    format[] - Parameter types to get.
    {Float,_}:... - Data return variables.
Return:
    0 - Successful, not 0 - fail.
Notes:
    A fail is either insufficient variables to store the data or insufficient
    data for the format string - excess data is disgarded.
 
    A string in the middle of the input data is extracted as a single word, a
    string at the end of the data collects all remaining text.
 
    The format codes are:
 
    c - A character.
    d, i - An integer.
    h, x - A hex number (e.g. a colour).
    f - A float.
    s - A string.
    z - An optional string.
    pX - An additional delimiter where X is another character.
    '' - Encloses a litteral string to locate.
    u - User, takes a name, part of a name or an id and returns the id if they're connected.
 
    Now has IsNumeric integrated into the code.
 
    Added additional delimiters in the form of all whitespace and an
    optioanlly specified one in the format string.
-*----------------------------------------------------------------------------*/

 
stock sscanf(string[], format[], {Float,_}:...)
{
    #if defined isnull
        if (isnull(string))
    #else
        if (string[0] == 0 || (string[0] == 1 && string[1] == 0))
    #endif
        {
            return format[0];
        }
    #pragma tabsize 4
    new
        formatPos = 0,
        stringPos = 0,
        paramPos = 2,
        paramCount = numargs(),
        delim = ' ';
    while (string[stringPos] && string[stringPos] <= ' ')
    {
        stringPos++;
    }
    while (paramPos < paramCount && string[stringPos])
    {
        switch (format[formatPos++])
        {
            case '\0':
            {
                return 0;
            }
            case 'i', 'd':
            {
                new
                    neg = 1,
                    num = 0,
                    ch = string[stringPos];
                if (ch == '-')
                {
                    neg = -1;
                    ch = string[++stringPos];
                }
                do
                {
                    stringPos++;
                    if ('0' <= ch <= '9')
                    {
                        num = (num * 10) + (ch - '0');
                    }
                    else
                    {
                        return -1;
                    }
                }
                while ((ch = string[stringPos]) > ' ' && ch != delim);
                setarg(paramPos, 0, num * neg);
            }
            case 'h', 'x':
            {
                new
                    num = 0,
                    ch = string[stringPos];
                do
                {
                    stringPos++;
                    switch (ch)
                    {
                        case 'x', 'X':
                        {
                            num = 0;
                            continue;
                        }
                        case '0' .. '9':
                        {
                            num = (num << 4) | (ch - '0');
                        }
                        case 'a' .. 'f':
                        {
                            num = (num << 4) | (ch - ('a' - 10));
                        }
                        case 'A' .. 'F':
                        {
                            num = (num << 4) | (ch - ('A' - 10));
                        }
                        default:
                        {
                            return -1;
                        }
                    }
                }
                while ((ch = string[stringPos]) > ' ' && ch != delim);
                setarg(paramPos, 0, num);
            }
            case 'c':
            {
                setarg(paramPos, 0, string[stringPos++]);
            }
            case 'f':
            {
 
                new changestr[16], changepos = 0, strpos = stringPos;    
                while(changepos < 16 && string[strpos] && string[strpos] != delim)
                {
                    changestr[changepos++] = string[strpos++];
                    }
                changestr[changepos] = '\0';
                setarg(paramPos,0,_:floatstr(changestr));
            }
            case 'p':
            {
                delim = format[formatPos++];
                continue;
            }
            case '\'':
            {
                new
                    end = formatPos - 1,
                    ch;
                while ((ch = format[++end]) && ch != '\'') {}
                if (!ch)
                {
                    return -1;
                }
                format[end] = '\0';
                if ((ch = strfind(string, format[formatPos], false, stringPos)) == -1)
                {
                    if (format[end + 1])
                    {
                        return -1;
                    }
                    return 0;
                }
                format[end] = '\'';
                stringPos = ch + (end - formatPos);
                formatPos = end + 1;
            }
            case 'u':
            {
                new
                    end = stringPos - 1,
                    id = 0,
                    bool:num = true,
                    ch;
                while ((ch = string[++end]) && ch != delim)
                {
                    if (num)
                    {
                        if ('0' <= ch <= '9')
                        {
                            id = (id * 10) + (ch - '0');
                        }
                        else
                        {
                            num = false;
                        }
                    }
                }
                if (num && IsPlayerConnected(id))
                {
                    setarg(paramPos, 0, id);
                }
                else
                {
                    #if !defined foreach
                        #define foreach(%1,%2) for (new %2 = 0; %2 < MAX_PLAYERS; %2++) if (IsPlayerConnected(%2))
                        #define __SSCANF_FOREACH__
                    #endif
                    string[end] = '\0';
                    num = false;
                    new
                        name[MAX_PLAYER_NAME];
                    id = end - stringPos;
                    foreach (Player, playerid)
                    {
                        GetPlayerName(playerid, name, sizeof (name));
                        if (!strcmp(name, string[stringPos], true, id))
                        {
                            setarg(paramPos, 0, playerid);
                            num = true;
                            break;
                        }
                    }
                    if (!num)
                    {
                        setarg(paramPos, 0, INVALID_PLAYER_ID);
                    }
                    string[end] = ch;
                    #if defined __SSCANF_FOREACH__
                        #undef foreach
                        #undef __SSCANF_FOREACH__
                    #endif
                }
                stringPos = end;
            }
            case 's', 'z':
            {
                new
                    i = 0,
                    ch;
                if (format[formatPos])
                {
                    while ((ch = string[stringPos++]) && ch != delim)
                    {
                        setarg(paramPos, i++, ch);
                    }
                    if (!i)
                    {
                        return -1;
                    }
                }
                else
                {
                    while ((ch = string[stringPos++]))
                    {
                        setarg(paramPos, i++, ch);
                    }
                }
                stringPos--;
                setarg(paramPos, i, '\0');
            }
            default:
            {
                continue;
            }
        }
        while (string[stringPos] && string[stringPos] != delim && string[stringPos] > ' ')
        {
            stringPos++;
        }
        while (string[stringPos] && (string[stringPos] == delim || string[stringPos] <= ' '))
        {
            stringPos++;
        }
        paramPos++;
    }
    do
    {
        if ((delim = format[formatPos++]) > ' ')
        {
            if (delim == '\'')
            {
                while ((delim = format[formatPos++]) && delim != '\'') {}
            }
            else if (delim != 'z')
            {
                return delim;
            }
        }
    }
    while (delim > ' ');
    return 0;
}
Reply
#6

Como logro personal o para aprender, esta bueno que quieras hacer tu propio procesador de comandos, pero si lo haces con el unico fin de "hacer un server completamente de 0 sin usar nada externo", es una perdida de tiempo ya que estarias reinventando la rueda. Justamente para evitar eso es que se lanzan los includes en este foro, para que los scripters puedan concentrarse mas en lo que no esta hecho y se olviden de cosas como sistema de cuentas, funciones miselaneas, etc.

Sobre el tema, la idea de un procesador de comandos es algo simple si se la plantea general.

Input del jugador:
Код:
/micomando parametros[]
Donde "micomando" representa el comando ingresado por el jugador y "parametros[]" representa los parametros que el jugador ingreso.

Tu lo que quieres hacer es detectar dentro de 'cmdtext[]' (almacena "/micomando parametros[]") 'micomando' y por separado 'parametros[]'.

Indiscutiblemente acabaras detectandolos mediante el espacio que los separa. Una vez que logras obtener en 2 arrays diferentes lo que es 'micomando' y lo que es 'parametros[]' puedes mediante el metodo que prefieras llamar al comando.

El metodo que utilizan los procesadores de comandos mas rapidos (ZCMD, YCMD) es crear cada comando como un 'callback' y llamarlo mediante la funcion "CallLocalFunction' con los parametros ya procesados.
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)