Code Snippets

From SA-MP Wiki

Jump to: navigation, search


Contents

Numeric Snippets and Functions

Speed Distance Time Triangle

This triangle equation calculates the speed, distance or time of an entity.

Speed = Distance / Time
Distance = Time / Speed
Time = Distance / Speed

String-based Snippets and Functions

Image:32px-Ambox_warning_orange.png

Note

The string-based functions that are listed here (strtok and split) have a far better alternative available: Sscanf.
Use of these functions is generally discouraged.

Strtok

Extracts a substring where a character or token is found.

Parameters

  • string: the string to split up.
  • index: a numeric position in where to search the string to start from.
  • seperator: the character or token to search for.


Source

//Faster strtok Code by Jeffry
stock strtok(const string[], &index)
{
	new result[20], length = strlen(string), i = index;
	while ((i < length) && (string[i] == ' ')) i++;
	strmid(result,string,i,((index = strfind(string, " ", false, i)) == -1) ? (index = length) : (index) , 20);
	index++;
	return result;
}
 
// Written by DracoBlue.
stock strtok(const string[], &index,seperator=' ')
{
	new length = strlen(string);
	new offset = index;
	new result[MAX_STRING];
	while ((index < length) && (string[index] != seperator) && ((index - offset) < (sizeof(result) - 1)))
	{
		result[index - offset] = string[index];
		index++;
	}
 
	result[index - offset] = EOS;
	if ((index < length) && (string[index] == seperator))
	{
		index++;
	}
	return result;
}

Example

Here we will do a shouting command.

if(strcmp(cmdtext,"/shout",true)==0)
{
   new 
      tmp[128], //The variable for strtok.
      string[128], // A Variable where we store a text/number with information.
      pName[MAX_PLAYER_NAME], //You can use this variable to get the players name later on.
      idx; //Also known as Index,Part of strtok.
 
   tmp = strtok(cmdtext,idx); //This Is where we define tmp to equal strtok.
 
   if(!strlen(tmp)) 
      return SendClientMessage(playerid,COLOR_WHITE,"USAGE:/me[action]");
   //this will see if the playerid filled all parameters,if not send him a message showing him how.
   //now continue with the command.
 
   GetPlayerName(playerid,pName,sizeof(pName));//This Stores the playerid's name in a variable.
   format(string,sizeof(string),"%s Shouts: %s !!",pName,tmp);
   /* In the format up,We used the stored text in the pName variable to show the player's name.
   Then we used the tmp variable to get the text that the player entered.*/
   SendClientMessageToAll(COLOR_WHITE,string); //now we send the formatted string.
   return 1;//make sure it returns something.
}//and close the ending bracket  
 
/* Written by iMatt */
/* Optimized by Vince */

Split

Works similar to strtok, except it splits up the entire string.

Parameters

  • strsrc: String to split up.
  • strdest: A 2D array; where to store the split up pieces.
  • delimiter: A character or token which identifies the beginning and end of substrings.


Source

//Faster (new) split Code [[User:Kaliber|Kaliber]]
stock split(const src[], dest[][], const delimiter)
{
    new n_pos,num,old,str[1];
    str[0] = delimiter;
    while(n_pos != -1)
    {
        n_pos = strfind(src,str,false,n_pos+1);
        strmid(dest[num++], src, (!num)?0:old+1,(n_pos==-1)?strlen(src):n_pos,256);
        old=n_pos;
    }
    return 1;
}
 
// Author unknown. It was probably someone smart like [[User:DracoBlue|DracoBlue]] or [[User:Y_Less|Y_Less]].
stock split(const strsrc[], strdest[][], delimiter)
{
    new i, li;
    new aNum;
    new len;
    while(i <= strlen(strsrc))
    {
        if(strsrc[i] == delimiter || i == strlen(strsrc))
        {
            len = strmid(strdest[aNum], strsrc, li, i, 128);
            strdest[aNum][len] = 0;
            li = i+1;
            aNum++;
        }
        i++;
    }
    return 1;
}

Example

public OnFilterScriptInit()
{
    new tmp[2][7];
    split("Hello World!", tmp, ' ');
    print(tmp[0]);
}
OUTPUTS: Hello 
Personal tools