[Ajuda] sscanf
#1

Bom fiz em zcmd comandos com parвmetros fiz assim com a ajuda do whoo pois tive alguns problemas
pawn Код:
CMD:teste(playerid, params[])
{
    new cmdn[10], Float:quantidadee;

    if(strcmp(cmdn, "vida", true) == 0)
    {
        if(sscanf(params, "s[10]f",cmdn, quantidadee))
        return SendClientMessage(playerid, -1,"/teste [vida] [quantidade]");
        for(new i; i < GetPlayerPoolSize() + 1; i++) if(IsPlayerConnected(i)) SetPlayerHealth(i, quantidadee);
    }
    else if(strcmp(cmdn, "colete", true) == 0)
    {
        if(sscanf(params, "s[10]f",cmdn, quantidadee))
        return SendClientMessage(playerid, -1,"/teste [colete] [quantidade]");
        for(new i; i < GetPlayerPoolSize() + 1; i++) if(IsPlayerConnected(i)) SetPlayerArmour(i, quantidadee);
    }
    else if(strcmp(cmdn, "deagle", true) == 0)
    {
        for(new i; i < GetPlayerPoolSize() + 1; i++) if(IsPlayerConnected(i)) GivePlayerWeapon(i, 24, 50);
    }
    return 1;
}
porem eu digito qualquer parametro exemplo /teste joao 100 seta a vida dele pra 100 posso digitar qualquer coisa que seta a vida dele ... creio que seja problema no sscanf
Reply
#2

O sscanf deve estar fora da condicional de comparaзгo:

Код:
CMD:teste(playerid, params[])
{
	new cmdn[10], Float:quantidadee;

	if(sscanf(params, "s[10]f", cmdn, quantidadee))
		return SendClientMessage(playerid, -1,"/teste [vida] [quantidade]");

	if(strcmp(cmdn, "vida", true) == 0)
	{
		for(new i; i < GetPlayerPoolSize() + 1; i++) if(IsPlayerConnected(i)) SetPlayerHealth(i, quantidadee);
	}
	else if(strcmp(cmdn, "colete", true) == 0)
	{
        if(sscanf(params, "s[10]f",cmdn, quantidadee))
		return SendClientMessage(playerid, -1,"/teste [colete] [quantidade]");
		for(new i; i < GetPlayerPoolSize() + 1; i++) if(IsPlayerConnected(i)) SetPlayerArmour(i, quantidadee);
	}
	else if(strcmp(cmdn, "deagle", true) == 0)
	{
	    for(new i; i < GetPlayerPoolSize() + 1; i++) if(IsPlayerConnected(i)) GivePlayerWeapon(i, 24, 50);
	}
	return 1;
}
Reply
#3

Quote:
Originally Posted by F1N4L
Посмотреть сообщение
O sscanf deve estar fora da condicional de comparaзгo:

Код:
CMD:teste(playerid, params[])
{
	new cmdn[10], Float:quantidadee;

	if(sscanf(params, "s[10]f", cmdn, quantidadee))
		return SendClientMessage(playerid, -1,"/teste [vida] [quantidade]");

	if(strcmp(cmdn, "vida", true) == 0)
	{
		for(new i; i < GetPlayerPoolSize() + 1; i++) if(IsPlayerConnected(i)) SetPlayerHealth(i, quantidadee);
	}
	else if(strcmp(cmdn, "colete", true) == 0)
	{
        if(sscanf(params, "s[10]f",cmdn, quantidadee))
		return SendClientMessage(playerid, -1,"/teste [colete] [quantidade]");
		for(new i; i < GetPlayerPoolSize() + 1; i++) if(IsPlayerConnected(i)) SetPlayerArmour(i, quantidadee);
	}
	else if(strcmp(cmdn, "deagle", true) == 0)
	{
	    for(new i; i < GetPlayerPoolSize() + 1; i++) if(IsPlayerConnected(i)) GivePlayerWeapon(i, 24, 50);
	}
	return 1;
}
Jб tentei colocar fora, mais quando digito /teste deagle ele retorna a mensagem do sscanf.
Reply
#4

Mas й claro, tem que digitar 2 parвmetros (neste caso):
1 String
1 Float

Ex: /teste vida 100.0
Reply
#5

Quote:
Originally Posted by F1N4L
Посмотреть сообщение
Mas й claro, tem que digitar 2 parвmetros (neste caso):
1 String
1 Float

Ex: /teste vida 100.0
vocк nгo entendeu ..
quando eu tiro do comando ele retorna a mensagem do sscanf exemplo se eu digito /teste deagle retorna pra mim /teste vida/colete quantidade, sendo que deagle nгo tem nada haver com vida/colete...
Se vocк ver o cуdigo tem um item a mais nгo tem sу vida e colete
Reply
#6

Quote:
Originally Posted by Jorgeeee
Посмотреть сообщение
vocк nгo entendeu ..
quando eu tiro do comando ele retorna a mensagem do sscanf exemplo se eu digito /teste deagle retorna pra mim /teste vida/colete quantidade, sendo que deagle nгo tem nada haver com vida/colete...
Se vocк ver o cуdigo tem um item a mais nгo tem sу vida e colete
tenta com isnull. nгo testei!
PHP код:
CMD:teste(playeridparams[])
{
    new 
cmdn[10], Float:quantidadee;
    if(
isnull(params))
        return 
SendClientMessage(playerid, -1,"/teste [colete/vida] [quantidade] or /teste [deagle]");
    if(
strcmp(params"vida"true) == 0)
    {
        if(
sscanf(params"s[10]f"cmdnquantidadee))
            return 
SendClientMessage(playerid, -1,"/teste [vida] [quantidade]"); 
        for(new 
iGetPlayerPoolSize() + 1i++) if(IsPlayerConnected(i)) SetPlayerHealth(iquantidadee);
    }
    else if(
strcmp(params"colete"true) == 0)
    {
        if(
sscanf(params"s[10]f",cmdnquantidadee))
            return 
SendClientMessage(playerid, -1,"/teste [colete] [quantidade]");
        for(new 
iGetPlayerPoolSize() + 1i++) if(IsPlayerConnected(i)) SetPlayerArmour(iquantidadee);
    }
    else if(
strcmp(params"deagle"true) == 0)
    {
        for(new 
iGetPlayerPoolSize() + 1i++) if(IsPlayerConnected(i)) GivePlayerWeapon(i2450);
    }
    return 
1;

Reply
#7

Eu entendi o motivo e vc nгo quer entender o que estou falando.
Quando vc usa sscanf e utiliza 2 argumentos, vc precisa usar dois argumentos, independentemente se vai precisar de seus valores, vc й obrigado a usar os dois argumentos.

Ex.: /teste deagle 0.0

0.0 nгo й utilizado, mas й o ultimo argumento de sscanf e vc й obrigado a colocar qualquer valor float aleatуrio para realizar o comando.
Reply
#8

Quote:
Originally Posted by F1N4L
Посмотреть сообщение
Eu entendi o motivo e vc nгo quer entender o que estou falando.
Quando vc usa sscanf e utiliza 2 argumentos, vc precisa usar dois argumentos, independentemente se vai precisar de seus valores, vc й obrigado a usar os dois argumentos.

Ex.: /teste deagle 0.0

0.0 nгo й utilizado, mas й o ultimo argumento de sscanf e vc й obrigado a colocar qualquer valor float aleatуrio para realizar o comando.
entгo eu teria que usar /teste colete 100.0 ou /teste vida 100.0
Reply
#9

Quote:
Originally Posted by F1N4L
Посмотреть сообщение
Eu entendi o motivo e vc nгo quer entender o que estou falando.
Quando vc usa sscanf e utiliza 2 argumentos, vc precisa usar dois argumentos, independentemente se vai precisar de seus valores, vc й obrigado a usar os dois argumentos.

Ex.: /teste deagle 0.0

0.0 nгo й utilizado, mas й o ultimo argumento de sscanf e vc й obrigado a colocar qualquer valor float aleatуrio para realizar o comando.
Nгo.

Topic
Usa o argumento opcional do sscanf. Que dб um valor default quando um valor nгo й passado.
Код:
CMD:teste(playerid, params[])
{
	new cmdn[10], Float:quantidadee;

	if(sscanf(params, "s[10] F(100.0)", cmdn, quantidadee))
		return SendClientMessage(playerid, -1,"/teste [vida] [quantidade]");

	if(strcmp(cmdn, "vida", true) == 0)
	{
		for(new i; i < GetPlayerPoolSize() + 1; i++) if(IsPlayerConnected(i)) SetPlayerHealth(i, quantidadee);
	}
	else if(strcmp(cmdn, "colete", true) == 0)
	{
		for(new i; i < GetPlayerPoolSize() + 1; i++) if(IsPlayerConnected(i)) SetPlayerArmour(i, quantidadee);
	}
	else if(strcmp(cmdn, "deagle", true) == 0)
	{
	    for(new i; i < GetPlayerPoolSize() + 1; i++) if(IsPlayerConnected(i)) GivePlayerWeapon(i, 24, 50);
	}
	return 1;
}
@EDIT
Estou com uma dъvida na parte:
Код:
if(sscanf(params, "s[10] F(100.0)", cmdn, quantidadee))
Eu acredito se vocк por "s[10] F(100.0)" ele vai pegar tudo como string. Mesmo se usar vida 100.0. Entгo botei um "espaзo". Vocк pode usar o comando:

Quote:

/teste vida

ou
Quote:

/teste vida 50

Se o primeiro nгo funcionar, tenta usar:
Quote:

/teste vida (com um espaзo em branco depois de vida)

e me diz se funcionou
Reply
#10

Quote:
Originally Posted by TheJoaoPedro
Посмотреть сообщение
Nгo.
Por um acaso ele inseriu 100.0 como valor padrгo?
Baseando pelo cуdigo dele, minha explicaзгo nгo estб errada!
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)