28.08.2013, 06:24
Hello, I have recently started programming in pawn, and am trying to create a /su command that will search an array of strings (charges), and find the closest match if any. For this, I have used the ReturnUser function from the GF script (though modified), and can't figure out where I'm going wrong.
Here's a little test array I used for testing if this can work or not.
Here's the stock code where I think my problem lies. Keep in mind that this was used to search for partial names before in the GF script, so I haven't removed those comments:
And here is where I'm using that stock code in my actual program:
I am getting the argument mismatch error on "crimeID = ReturnSu(crimSearch);" As far as I can tell, I am passing it a string, which it should accept as an argument.
I use the zcmd format for commands, but from what I understand, the "s" in the sscanf line searches for the first string in the command, and assigns it to crimSearch. If you need any more information, feel free to ask.
Here's a little test array I used for testing if this can work or not.
Код:
new crimeArray[600]={"Reckless Driving", "Vehicular Homicide", "vehicular manslaughter", "vehicular assault",
"hit and run", "water eluding", "air eluding"};
Код:
stock ReturnSu(text[], playerid)
{
new pos = 0;
while (text[pos] < 0x21) // Strip out leading spaces
{
if (text[pos] == 0) return 0; // No passed text
pos++;
}
// They entered [part of] a name or the id search failed (check names just incase)
new len = strlen(text[pos]);
new count = 0;
new crimeID;
new crime[MAX_PLAYER_NAME];
for (new i = 0; i < sizeof(crimeArray); i++)
{
if (strcmp(crimeArray[i], text[pos], true, len) == 0) // Check segment of name
{
if (len == strlen(text)) // Exact match
{
return i; // Return the exact player on an exact match
}
else // Partial match
{
count++;
crimeID = i;
}
}
}
if (count != 1)
{
if (count)
{
SendClientMessage(playerid, 0xFF0000AA, "Multiple charges found, please narrow search.");
}
else
{
SendClientMessage(playerid, 0xFF0000AA, "No matching charge found.");
}
}
return crimeID; // INVALID_PLAYER_ID for bad return
}
Код:
COMMAND:su(playerid, params[])
{
new crimSearch, crimeID;
if(!sscanf(params, "s[64]", crimSearch))
{
crimeID = ReturnSu(crimSearch);
SCM(playerid, RED, crimeArray[crimeID]);
}
else SCM(playerid, YELLOW, "Usage: /su (player id/part of name)");
}
I use the zcmd format for commands, but from what I understand, the "s" in the sscanf line searches for the first string in the command, and assigns it to crimSearch. If you need any more information, feel free to ask.


u(playerid, params[])" was set to "playerid". I just need to pass the id of he who called the command to the script, so that the script can send the messages that are part of the stock code itself.
