Tutorial of strtok

From SA-MP

Jump to: navigation, search

strtok tutorial

strtok is a function made to control space between the command and the value following it. Always thought that doing those commands that have a space and then something is hard? This guide shall help you.

public OnPlayerCommandText(playerid, cmdtext[])
{
    new tmp[128], string[128], cmd[128], idx, giveplayerid, sendername, giveplayer;
    cmd = strtok(cmdtext, idx);
    GetPlayerName(playerid, sendername, sizeof(sendername));
    if(strcmp(cmd, "/akill", true) == 0)
    {
        if(!IsPlayerAdmin(playerid)) return SendClientMessage(playerid, 0x919191FF, "You must be admin to admin-kill someone.");
        tmp = strtok(cmdtext, idx);
        if(!strlen(tmp)) return SendClientMessage(playerid, 0x919191FF, "Usage: \"/akill [ID]\"");
        giveplayerid = strval(tmp);
        GetPlayerName(giveplayerid, giveplayer, sizeof(giveplayer));
        if(!IsPlayerConnected(giveplayerid))SendClientMessage(playerid, 0x919191FF, "Player not found.");
        SetPlayerHealth(giveplayerid, 0); 
        format(string, sizeof(string), "Admin %s[%i] killed you!", sendername, playerid);
        SendClientMessage(giveplayerid, 0xE21D2CFF, string);
        format(string, sizeof(string), "Killed %s[%i]!", giveplayer, giveplayerid);
        SendClientMessage(playerid, 0xE21D2CFF, string);
        return 1;
   }
}

Explanation

giveplayerid = strval(tmp);

That means that 'giveplayerid' is assigned to tmp's value.

if(!strlen(tmp)) return SendClientMessage();

When no 'giveplayerid' is inserted (aka. when you write /akill instead of /akill ID)

GetPlayerName(playerid, sendername, sizeof(sendername));
GetPlayerName(giveplayerid, giveplayer, sizeof(giveplayer));

To form a correct message (e.g: "Kyeman(ID 4) killed !damo!spiderman(ID 2)") we'll need to get the name into variables. PS: Always get the 'giveplayerid' name AFTER you've assigned it to 'tmp'.

Not good enough? Watch this:

if(strcmp(cmd, "/ban", true) == 0)
{
    if(!IsPlayerAdmin(playerid)) return SendClientMessage(playerid, 0x919191FF, "BE ADMIN!"); // when player isn't admin, don't let to use command
    tmp = strtok(cmdtext, idx); // We assign that we use strtok in this command to 'tmp'
    if(!strlen(tmp)) return SendClientMessage(playerid, 0x919191FF, "USAGE: /ban [id]"); // If no ID is given
    giveplayerid = strval(tmp); // Now we assign the 'giveplayerid'
    if(!IsPlayerConnected(giveplayerid)) return SendClientMessage(playerid, 0x919191FF, "That player isn't connected!"); // when 'giveplayerid' isn't online
    Ban(giveplayerid);
    return 1;
}

Explanation

if(!IsPlayerAdmin(playerid))

If the player isn't admin, return the message and stop processing

tmp = strtok(cmdtext, idx);

We assign the usage of strtok to 'tmp'

if(!strlen(tmp))<pawn>
If any ID isn't included in command, return the message and stop processing
<pawn>giveplayerid = strval(tmp);

We assign 'giveplayerid' to tmp

if(!IsPlayerConnected(giveplayerid))

If 'giveplayerid' isn't connected, return message and stop processing

Ban(giveplayerid);

Finally the effect of command, everyone understands it.

Personal tools