Se pueden usar parametros sin includes?
#1

No me diran que use sscanf es que tengo problemas con el mismo, quisiera saber si solo con OnPlayerCommandText se puede y como eje: uno de dar dinero...gracias sin ningun include...
Reply
#2

Si, con Strtok.

https://sampwiki.blast.hk/wiki/Strtok
Reply
#3

si se puede.
ej:

pawn Код:
if(!strcmp(cmp, "/dardinero", true)){
    new tmp[2][256];
    tmp[0] = strtok(cmdtext, idx);
    tmp[1] = strtok(cmdtext, idx);
    if(!strlen(tmp[0]) || !strlen(tmp[1]) || !IsNumeric(tmp[0]) || !IsNumeric(tmp[1]))return SendClientMessage(playerid, 0xFFFFFFFF, "Uso: /dardinero <playerid> <cantidad>");
    new id=strval(tmp[0]);
    if(!IsPlayerConnected(id))return SendClientMessage(playerid, 0xFF0000FF, "Error: el jugador no se encuentra conectado");
    new monto=strval(tmp[1]);
    new str[128];
    SetPlayerMoney(playerid, GetPlayerMoney(playerid)-monto);
    SetPlayerMoney(id, GetPlayerMoney(id)+monto);
    GetPlayerName(playerid, str, MAX_PLAYER_NAME);
    format(str, 128, "Server: %s(%i) te ha dado $%i", str, playerid, monto);
    SendClientMessage(id, 0x00FF00FF, str);
    return SendClientMessage(playerid, 0x00FF00FF, "Server: Transerencia realizada con exito!");
}
no lo testie, y lo scriptie recien aca asi nomas, supongo q funciona.
Reply
#4

Puedes usar strcmp (el sistema de comandos que ves) con sscanf. Creo que es lo que buscaas.
Reply
#5

Quote:
Originally Posted by SuperMarioRol
Посмотреть сообщение
Puedes usar strcmp (el sistema de comandos que ves) con sscanf. Creo que es lo que buscaas.
Si puedes, pero igual vas a usar strtok.
Reply
#6

Quote:
Originally Posted by admantis
Посмотреть сообщение
Si puedes, pero igual vas a usar strtok.
si usas sscanf no hay necesidad de usar strtok. creo quisiste decir strcmp...
Reply
#7

Quote:
Originally Posted by the_chaoz
Посмотреть сообщение
si usas sscanf no hay necesidad de usar strtok. creo quisiste decir strcmp...
Con strcmp y OnPlayerCommandText no existe una funciуn (como en zcmd que es params) para conseguir la data de la cadena luego del comando (params) escribido, para eso debes usar strtok o zcmd, si no es que yo no conozca una manera.
Reply
#8

Usб GetParam de Slice, estб en el topic de funciones ъtiles de la secciуn inglesa.
Reply
#9

Quote:
Originally Posted by MrDeath537
Посмотреть сообщение
Usб GetParam de Slice, estб en el topic de funciones ъtiles de la secciуn inglesa.
O podes usar sscanf versiуn en cуdigo:
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
#10

pawn Код:
dcmd_dardinero(playerid, params[]) //Fuera de cualquier callback, NUNCA dentro de OnPlayerCommandText, puedes ponerlo justo encima
{
    new pid; //Le he llamado PID
    new dinero; //Nuevo
    if(Info[playerid][Nivel] == 5) //Perfecto
    {

    if(sscanf(params,"ui", pid, dinero) ) return SendClientMessage(playerid, COLOR_ROJO, "ERROR: usa /dardinero (playerid) (cantidad)");
    if(IsPlayerConnected(pid))
    {
    GivePlayerMoney(pid, dinero); //Esto estaba mal, era mas simple
    } else return SendClientMessage(playerid, COLOR_ROJO, "ERROR: Jugador no conectado");
    }
    else
    {
    SendClientMessage(playerid,COLOR_ROJO,Errornivel3);
    }
    return 1;
}
simplemente ayuden en esi ahora cuando por ejemplo se pone: /dardinero sale el mensaje de que no puse el id y cantidad...pero al poner /dardinero [playerid] no sale el mensaje lo que genera crash osea solo deberia ocultarse al poner /dardinero [playerid] [cantidad]...
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)