sscanf & zcmd "multi-command"
#1

So I was creating a multi-command using sscanf and zcmd, but it kept getting stuck after the first stage of the command. (After /editveh faction {whateverid} it returns nothing in the IG chat)

This is the code:
Код:
CMD:editveh(playerid, params[])
{
new vehid;
if(sscanf(params, "s[32]", params)) {SendClientMessage(playerid, -1, "/editveh (option) (vehid)"); SendClientMessage(playerid, -1, "{989898}[OPTIONS]: faction | locked"); return 1;}
if(!strcmp(params, "faction", true, 8))
{
	if(sscanf(params, "s[32]i",params,vehid)) return SendClientMessage(playerid, -1, "/editvehicle faction (vehid)");
	SendClientMessage(playerid, -1, "Vehicle successfully updated.");
}
return 1;
}
Any help/suggestions are much appriciated
Reply
#2

Replace the sscanf with isnull.

Код:
CMD:editveh(playerid, params[])
{
    new vehid;
    if(isnull(params)) {SendClientMessage(playerid, -1, "/editveh (option) (vehid)"); SendClientMessage(playerid, -1, "{989898}[OPTIONS]: faction | locked"); return 1;}
    if(!strcmp(params, "faction", true, 7))
    {
        if(sscanf(params, "s[32]i",params,vehid)) return SendClientMessage(playerid, -1, "/editvehicle faction (vehid)");
        SendClientMessage(playerid, -1, "Vehicle successfully updated.");
    }
    return 1;
}
If you haven't defined isnull, put this at the top of your script:
Код:
#if !defined isnull
    #define isnull(%1) ((!(%1[0])) || (((%1[0]) == '\1') && (!(%1[1]))))
#endif
Reply
#3

It just lacks on the amount of code
Reply
#4

pawn Код:
CMD:editveh(playerid, params[])
{
    if(isnull(params))
    {
        SendClientMessage(playerid, -1, "/editveh (option) (vehid)");
        SendClientMessage(playerid, -1, "{989898}[OPTIONS]: faction | locked");
        return 1;
    }
    if(!strcmp(params, "faction", true, 7) && (!params[7] || params[7] == ' '))
    {
        new vehid;
        if(sscanf(params[7],"i",vehid)) return SendClientMessage(playerid, -1, "/editvehicle faction (vehid)");
        SendClientMessage(playerid, -1, "Vehicle successfully updated.");
    }
    return 1;
}
Reply
#5

It works now, thanks.
Reply
#6

About your sscanf problem, you made "s" as a varible for your vehid, "s" means string which is not id. You can put "u" instead of "s" and try again.
Reply
#7

Okay, so everything worked great until I added more "sub-commands".
Код:
CMD:editveh(playerid, params[])
{
new vehid,input;
if(isnull(params)) {UsageMessage(playerid, "/editveh [option] [vehid]"); SendClientMessage(playerid, -1, "{989898}[OPTIONS]: faction | locked | rental | job"); return 1;}
new dFile[128];
new fileid = vehid -1;
format(dFile, sizeof(dFile),VEHICLE_FOLDER,fileid);
if(!strcmp(params, "faction", true, 8))
{
	if(sscanf(params, "s[32]ii",params,vehid,input)) return UsageMessage(playerid, "/editveh faction (vehid) (faction)");
	if(!fexist(dFile)) return ErrorMessage(playerid, "That file does not exist!");
	DVehicles[fileid][vFaction] = input;
	SaveVehicle(fileid);
	InfoMessage(playerid, "Vehicle successfully updated.");
}
else if(!strcmp(params, "locked", true, 7))
{
	if(sscanf(params, "s[32]ii",params,vehid,input)) return UsageMessage(playerid, "/editveh locked (vehid) (1 = YES, 0 = NO)");
	if(!fexist(dFile)) return ErrorMessage(playerid, "That file does not exist!");
	DVehicles[fileid][vLocked] = input;
	SaveVehicle(fileid);
	InfoMessage(playerid, "Vehicle successfully updated.");
}
else if(!strcmp(params, "rental", true, 7))
{
	if(sscanf(params, "s[32]ii",params,vehid,input)) return UsageMessage(playerid, "/editveh rental (vehid) (1 = YES, 0 = NO)");
	if(!fexist(dFile)) return ErrorMessage(playerid, "That file does not exist!");
	DVehicles[fileid][vRental] = input;
	SaveVehicle(fileid);
	InfoMessage(playerid, "Vehicle successfully updated.");
}
else if(!strcmp(params, "job", true, 7))
{
	if(sscanf(params, "s[32]ii",params,vehid,input)) return UsageMessage(playerid, "/editveh job (vehid) (jobid)");
	if(!fexist(dFile)) return ErrorMessage(playerid, "That file does not exist!");
	DVehicles[fileid][vJob] = input;
	SaveVehicle(fileid);
	InfoMessage(playerid, "Vehicle successfully updated.");
}
return 1;
}
Everything works except "job" (/editveh job).
Any suggestions?
Reply
#8

You see that number on the end of strcmp? Yeah, you need to change that depending on the length of the string you are comparing. In this case "job" is 3 letters, so it should be 3, not 7. Check the wiki page for more info...
Reply
#9

Thanks, it works.
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)