[Ajuda] Strval tmp entre outros
#1

Pessoal eu nгo entendi como se faz para getar muitas coisas em um comando por exemplo:
pawn Код:
if(strcmp(cmd, "/banip", true) == 0 || strcmp(cmd, "/banirip", true) == 0)
Temos o banip ai vai ter que digitar /banip [id] [motivo] como faзo para pegar o ID e o Motivo?
oque significa esses strval tmp e outros tipos assim, nгo consigo entender como faz isso!
Alguem poderia sу fazer um tut ai? ou passar um Post do forum? (procurei no search mais n achei nada)

Obs: Eu sei que vгo falar do sscanf mais eu nгo curti muito ele atй porque nunca mechi com ele e meu GM ta todo em strcmp
Reply
#2

strval

tmp, pode ser muita coisa, so vendo o codigo... mas provavelmente deve ser para defenir o maximo de celulas em ua string
Reply
#3

Quote:
Originally Posted by PT
Посмотреть сообщение
strval

tmp, pode ser muita coisa, so vendo o codigo... mas provavelmente deve ser para defenir o maximo de celulas em ua string
Mano eu sei que tem na wiki
ja li tudo la mais nгo entendi nada oque realmente isso faz
Reply
#4

Vamos lб amigo:

Nesse tipo de comando vocк vai usar uma funзгo chamada strtok, ela serve para pegar o espaзo e identificar o que vem escrito depois do comando, usando ela funcionaria mais ou menos assim seu comando (nгo testei caso tenha erro avise aн):

pawn Код:
if(strcmp(cmd, "/banip", true) == 0 || strcmp(cmd, "/banirip", true) == 0)
{
    if(!IsPlayerAdmin(playerid)) return SendClientMessage(playerid, 0xFFFFAA, "Vocк nгo й administrador."); //Caso o player nгo for adm no caso eu usei a RCON como referкncia, no seu GM vocк modifica
    new tmpex[128]; //Criei a variбvel tmpex que vai servir para armazenar o valor depois do primeiro espaзo ou seja o id
    new idxex; // Servirб de apoio para funзгo strtok pois vai pegar o нnicio do id
    tmpex = strtok(cmdtext, idxex); // Aqui vai atribuir para tmp o reconhecimento do id, pois o strtok vai pegar o espaзo que vem depois
    if(!strlen(tmpex)) // Caso o usuбrio nгo digite o id
    {
        SendClientMessage(playerid,0xFFFFAA,"Uso correto: /banip [id] [motivo].");
        return 1;
    }
    new playerban = strval(tmpex); //Strval serve para passar uma string de texto para um valor inteiro, ou seja tranforma o texto em nъmero, no caso o texto pegado й o id
    if(!IsPlayerConnected(playerban)) return SendClientMessage(playerid, 0xFFFFAA, "Esse ID nгo estб conectado.");
    /* Aн vocк usarб a funзгo abaixo para pegar o motivo, nгo vou explicar pois nгo conheзo muito bem essa funзгo, vou estudб-la melhor qualquer coisa te explico */
    new length = strlen(cmdtext);
    while ((idxex < length) && (cmdtext[idxex] <= ' '))// Aqui servirб para detectar o texto apуs o segundo espaзo
    {
        idxex++;
    }
    new offset = idxex;
    new result[64];//Aqui serб armazenado o motivo do banimento
    while ((idxex < length) && ((idxex - offset) < (sizeof(result) - 1)))
    {
        result[idxex - offset] = cmdtext[idxex];
        idxex++;
    }
    result[idxex - offset] = EOS;
    if(!strlen(result))//Caso nгo digite o motivo
    {
        SendClientMessage(playerid,0xFFFFAA,"Uso correto: /banip [id] [motivo].");
        return 1;
    }
    new aviso[256];
    format(aviso, 256,"%s foi banido pelo ADM %s motivo: %s.",pNome(playerban), pNome(playerid), result);
    SendClientMessageToAll(0xFFFFAA, aviso);
    Ban(playerban);
}
A funзгo pNome que eu criei
pawn Код:
stock pNome(playerid)
{
new nome[MAX_PLAYER_NAME];
GetPlayerName(playerid, nome, sizeof(nome));
return nome;
}
Reply
#5

Quote:
Originally Posted by NathanLive
Посмотреть сообщение
Vamos lб amigo:

Nesse tipo de comando vocк vai usar uma funзгo chamada strtok, ela serve para pegar o espaзo e identificar o que vem escrito depois do comando, usando ela funcionaria mais ou menos assim seu comando (nгo testei caso tenha erro avise aн):

pawn Код:
if(strcmp(cmd, "/banip", true) == 0 || strcmp(cmd, "/banirip", true) == 0)
{
    if(!IsPlayerAdmin(playerid)) return SendClientMessage(playerid, 0xFFFFAA, "Vocк nгo й administrador."); //Caso o player nгo for adm no caso eu usei a RCON como referкncia, no seu GM vocк modifica
    new tmpex[128]; //Criei a variбvel tmpex que vai servir para armazenar o valor depois do primeiro espaзo ou seja o id
    new idxex; // Servirб de apoio para funзгo strtok pois vai pegar o нnicio do id
    tmpex = strtok(cmdtext, idxex); // Aqui vai atribuir para tmp o reconhecimento do id, pois o strtok vai pegar o espaзo que vem depois
    if(!strlen(tmpex)) // Caso o usuбrio nгo digite o id
    {
        SendClientMessage(playerid,0xFFFFAA,"Uso correto: /banip [id] [motivo].");
        return 1;
    }
    new playerban = strval(tmpex); //Strval serve para passar uma string de texto para um valor inteiro, ou seja tranforma o texto em nъmero, no caso o texto pegado й o id
    if(!IsPlayerConnected(playerban)) return SendClientMessage(playerid, 0xFFFFAA, "Esse ID nгo estб conectado.");
    /* Aн vocк usarб a funзгo abaixo para pegar o motivo, nгo vou explicar pois nгo conheзo muito bem essa funзгo, vou estudб-la melhor qualquer coisa te explico */
    new length = strlen(cmdtext);
    while ((idxex < length) && (cmdtext[idxex] <= ' '))// Aqui servirб para detectar o texto apуs o segundo espaзo
    {
        idxex++;
    }
    new offset = idxex;
    new result[64];//Aqui serб armazenado o motivo do banimento
    while ((idxex < length) && ((idxex - offset) < (sizeof(result) - 1)))
    {
        result[idxex - offset] = cmdtext[idxex];
        idxex++;
    }
    result[idxex - offset] = EOS;
    if(!strlen(result))//Caso nгo digite o motivo
    {
        SendClientMessage(playerid,0xFFFFAA,"Uso correto: /banip [id] [motivo].");
        return 1;
    }
    new aviso[256];
    format(aviso, 256,"%s foi banido pelo ADM %s motivo: %s.",pNome(playerban), pNome(playerid), result);
    SendClientMessageToAll(0xFFFFAA, aviso);
    Ban(playerban);
}
A funзгo pNome que eu criei
pawn Код:
stock pNome(playerid)
{
new nome[MAX_PLAYER_NAME];
GetPlayerName(playerid, nome, sizeof(nome));
return nome;
}
Hm... nгo resolveu tudo pois entendi atй onde vocк sabia tbm ^^
Mais vai ganhar rep.

Se alguem poder dar uma complementada ai na parte que ele sabe mais ou menos eu agradeзo!
Reply
#6

Pois й esses cуdigos sгo meio confusos mesmo, dei uma olhada melhor aqui vamos ver se ajuda:
pawn Код:
new length = strlen(cmdtext);//Aqui vai pegar o tamanho total do comando do usuбrio, pois o comando fica armazenado nessa variбvel (cmdtext)
    while ((idxex < length) && (cmdtext[idxex] <= ' '))// Aqui vai criar um while para resolver o seguinte, enquanto o index for menor que o tamanho total da variбvel (lembre-se o index extб posicionado sobre a posiзгo do primeiro espaзo pois utilizamos a strtok ali em cima)
    //E enquanto nгo acha o caracter que comeзa o segundo espaзo do comando
    {
        idxex++;//vai aumentar o caracter um por um atй identificar a posiзгo inicial do segundo espaзo
    }
    new offset = idxex;//Variбvel decorativa que vai servir apenas para cauculo ali embaixo
    new result[64];//Aqui serб armazenado o motivo do banimento
Atй essa parte eu entendi, o outro while que complica tudo.
Reply
#7

Dei uma olhada aqui no search para ver se achava explicaзгo e tals encontrei esse tutorial, vк se ajuda:
https://sampforum.blast.hk/showthread.php?tid=358864
Reply
#8

Blz valeu pela ajuda
Reply
#9

Vini , strcmp e strtok em comandos estб meio ultrapassado na minha opiniгo .
Tente evoluir seu cуdigo pra bCMD ou ZCMD com sscanf2 ...
Mais ai a escolha й sua , sу te falo o seguinte :
Eu uso ZCMD desde que vi a simplicidade de um comando com parвmetros !
Reply
#10

@Edit ja arrumei!

Hm... eu nгo acho que estб ultrapassado nгo!
Prefiro usar coisas da a_samp mesmo atй porque й muito mais dificil haver bugs!
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)