[Ajuda] Problema com sscanf
#1

Olб, peguei mais ou menos o jeito de usar o sscanf com 2 ou mais parametros, porйm e se os parвmetros forem alternativos? й o caso desse filterscript de gps https://sampforum.blast.hk/showthread.php?tid=107687 . No comando
do FS ou o player digita /gps off OU digita /gps id.
Como transformar isso para ycmd com sscanf?

pawn Код:
new cmd[64],tmp[64],idx;
    cmd = strtok(cmdtext,idx);
    if(!strcmp(cmd, "/gps", true))
    {
        tmp = strtok(cmdtext,idx);
        if(!strlen(tmp)) return SendClientMessage(playerid, 0xFFFFFFAA, "Use: /gps [playerid / off]");
        if(!strcmp(tmp, "off", true)) {
            if(HaveGPS[playerid]) {
                KillTimer(GPSTimer[playerid]);
                HaveGPS[playerid] = false;
                GPSTimer[playerid] = 0;
                DisablePlayerCheckpoint(playerid);
                SendClientMessage(playerid, 0xFFFF00AA, "GPS: Desligado.");
            }else SendClientMessage(playerid, 0xFF0000AA, "GPS: Seu GPS estб desligado !");
            return 1;
        }
        if(IsPlayerConnected(strval(tmp))) {
            if(strval(tmp) != playerid) {
                if(HaveGPS[playerid]) {
                    KillTimer(GPSTimer[playerid]);
                    HaveGPS[playerid] = false;
                    GPSTimer[playerid] = 0;
                }
                GPSTimer[playerid] = SetTimerEx("GPSUpdate", 500, true, "dd", playerid,strval(tmp));
                HaveGPS[playerid] = true;
                new str[128],nick[24];
                GetPlayerName(strval(tmp),nick,24);
                format(str,128,"GPS: Ligado, alvo: %s (ID: %d)",nick,strval(tmp));
                SendClientMessage(playerid, 0xFFFF00AA, str);
            }else SendClientMessage(playerid, 0xFF0000AA, "GPS: Use corretamente o seu GPS !");
        }else SendClientMessage(playerid, 0xFF0000AA, "GPS: Alvo nгo encontrado(ID errado) !");
        return 1;
    }
@edit >>>> seria esse o caminho?

pawn Код:
new id, off;
if( sscanf( params, "us", ID || off) ) return SendClientMessage(playerid, -1, "Uso: /gps (ID / off)]");
Reply
#2

Armazena o que ele digitar em uma string e depois caso ele digitar um id converte para um inteiro.
Exemplo:
pawn Код:
CMD:exmeplo(playerid, params[])
{
    new st[11];
    if(sscanf(params, "s[10]", st)) return SendClientMessage(playerid, -1, "/exemplo [numero / off]");
    if(strcmp(st, "off", true) == 0)
    {
         SendClientMessage(playerid, -1, "Exemplo OFF");
         return 1; // Usando return para nгo continuar lendo o que tem abaixo dentro desta callback
    }
    new i = strval(st);
    new str[20];
    format(str, sizeof str, "Exemplo %d", i);
    SendClientMessage(playerid, -1, str);
    return 1;
}
Reply
#3

Cara muito obrigado, deu certinho, o code ficou assim:
pawn Код:
YCMD:gps(playerid, params[], help)
{
    new gp[12];
   
    if( help ) return SendClientMessage(playerid, -1, "Este comando o ajuda a localizar um player no mapa.");
    if( sscanf( params, "s[11]", gp) ) return SendClientMessage(playerid, -1, "Uso: /gps (ID / off)]");
    if(strcmp(gp, "off", true) == 0)
    {
        if(HaveGPS[playerid]) {
            KillTimer(GPSTimer[playerid]);
            HaveGPS[playerid] = false;
            GPSTimer[playerid] = 0;
            DisablePlayerCheckpoint(playerid);
            SendClientMessage(playerid, 0xFFFF00AA, "GPS: Desligado.");
        }else SendClientMessage(playerid, 0xFF0000AA, "GPS: Seu GPS estб desligado !");
        return 1;
    }
    if(IsPlayerConnected(strval(gp))) {
        if(strval(gp) != playerid) {
            if(HaveGPS[playerid]) {
                KillTimer(GPSTimer[playerid]);
                HaveGPS[playerid] = false;
                GPSTimer[playerid] = 0;
            }
            GPSTimer[playerid] = SetTimerEx("GPSUpdate", 500, true, "dd", playerid,strval(gp));
            HaveGPS[playerid] = true;
            new str[128],nick[24];
            GetPlayerName(strval(gp),nick,24);
            format(str,128,"GPS: Ligado, alvo: %s (ID: %d)",nick,strval(gp));
            SendClientMessage(playerid, 0xFFFF00AA, str);
        }else SendClientMessage(playerid, 0xFF0000AA, "GPS: Use corretamente o seu GPS !");
    }else SendClientMessage(playerid, 0xFF0000AA, "GPS: Alvo nгo encontrado(ID errado) !");
    return 1;
}
Quote:

rep++

Reply
#4

pawn Код:
YCMD:gps(playerid, params[], help)
{
    #pragma unused help
   
    new sstr[5];
    if(sscanf(params, "s[5]", sstr))
        return SendClientMessage(playerid, 0xFFFFFFAA, "Use: /gps [playerid / off]");
   
    if(!strcmp(sstr, "off", true))
    {
        if(!HaveGPS[playerid])
            return SendClientMessage(playerid, 0xFF0000AA, "GPS: Seu GPS estб desligado !");
        KillTimer(GPSTimer[playerid]);
        HaveGPS[playerid] = false;
        GPSTimer[playerid] = 0;
        DisablePlayerCheckpoint(playerid);
        SendClientMessage(playerid, 0xFFFF00AA, "GPS: Desligado.");
        return 1;
    }
    else
    {
        if(!IsPlayerConnected(strval(sstr)))
            return SendClientMessage(playerid, 0xFF0000AA, "GPS: Alvo nгo encontrado(ID errado) !");
        if(strval(sstr) == playerid)
            return SendClientMessage(playerid, 0xFF0000AA, "GPS: Use corretamente o seu GPS !");   
        if(HaveGPS[playerid])
        {
            KillTimer(GPSTimer[playerid]);
            HaveGPS[playerid] = false;
            GPSTimer[playerid] = 0;
        }
        GPSTimer[playerid] = SetTimerEx("GPSUpdate", 500, true, "dd", playerid, strval(sstr));
        HaveGPS[playerid] = true;
         
        new str[80], nick[MAX_PLAYER_NAME];
        GetPlayerName(strval(sstr), nick, MAX_PLAYER_NAME);
        format(str, sizeof(str),"GPS: Ligado, alvo: %s (ID: %d)", nick, strval(sstr));
        SendClientMessage(playerid, 0xFFFF00AA, str);
    }
    return 1;
}
eu te aconselhei a dividir em 2 comandos pois nao sabia seu level de conhecimento.

Porem quando vc mexe com algo que envolva nome coloque sempre MAX_PLAYER_NAME nunca se sabe se esse valor sera alterado um dia assim a atualizacao do seu script fica mais facil.

qualquer coisa manda PM.

cumprimentos
Reply
#5

Quote:
Originally Posted by PT
Посмотреть сообщение
eu te aconselhei a dividir em 2 comandos pois nao sabia seu level de conhecimento.

Porem quando vc mexe com algo que envolva nome coloque sempre MAX_PLAYER_NAME nunca se sabe se esse valor sera alterado um dia assim a atualizacao do seu script fica mais facil.

qualquer coisa manda PM.

cumprimentos
Obrigado pelas dicas e desculpas por nгo esperar seu pm de volta rsrs.

Quote:

You must spread some Reputation around before giving it to PT again

Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)