[Tutorial] [SA:MP] Ban command.

Results 1 to 1 of 1
  1. #1
    Apprentice Lukasas is offline
    MemberRank
    Oct 2008 Join Date
    18Posts

    [Tutorial] [SA:MP] Ban command.

    Hello,

    I want to see you how to create a ban command with saving text to log.

    ok lets start.

    First to news:
    Code:
    new File:kickingpe;
    new File:baningpe;
    
    stock sscanf(string[], format[], {Float,_}:...)
    {
    	#if defined isnull
    		if (isnull(string))
    	#else
    		if (string[0] == 0 || (string[0] == 1 && string[1] == 0))
    	#endif
    		{
    			return format[0];
    		}
    	new
    		formatPos = 0,
    		stringPos = 0,
    		paramPos = 2,
    		paramCount = numargs(),
    		delim = ' ';
    	while (string[stringPos] && string[stringPos] <= ' ')
    	{
    		stringPos++;
    	}
    	while (paramPos < paramCount && string[stringPos])
    	{
    		switch (format[formatPos++])
    		{
    			case '\0':
    			{
    				return 0;
    			}
    			case 'i', 'd':
    			{
    				new
    					neg = 1,
    					num = 0,
    					ch = string[stringPos];
    				if (ch == '-')
    				{
    					neg = -1;
    					ch = string[++stringPos];
    				}
    				do
    				{
    					stringPos++;
    					if ('0' <= ch <= '9')
    					{
    						num = (num * 10) + (ch - '0');
    					}
    					else
    					{
    						return -1;
    					}
    				}
    				while ((ch = string[stringPos]) > ' ' && ch != delim);
    				setarg(paramPos, 0, num * neg);
    			}
    			case 'h', 'x':
    			{
    				new
    					num = 0,
    					ch = string[stringPos];
    				do
    				{
    					stringPos++;
    					switch (ch)
    					{
    						case 'x', 'X':
    						{
    							num = 0;
    							continue;
    						}
    						case '0' .. '9':
    						{
    							num = (num << 4) | (ch - '0');
    						}
    						case 'a' .. 'f':
    						{
    							num = (num << 4) | (ch - ('a' - 10));
    						}
    						case 'A' .. 'F':
    						{
    							num = (num << 4) | (ch - ('A' - 10));
    						}
    						default:
    						{
    							return -1;
    						}
    					}
    				}
    				while ((ch = string[stringPos]) > ' ' && ch != delim);
    				setarg(paramPos, 0, num);
    			}
    			case 'c':
    			{
    				setarg(paramPos, 0, string[stringPos++]);
    			}
    			case 'f':
    			{
    				setarg(paramPos, 0, _:floatstr(string[stringPos]));
    			}
    			case 'p':
    			{
    				delim = format[formatPos++];
    				continue;
    			}
    			case '\'':
    			{
    				new
    					end = formatPos - 1,
    					ch;
    				while ((ch = format[++end]) && ch != '\'') {}
    				if (!ch)
    				{
    					return -1;
    				}
    				format[end] = '\0';
    				if ((ch = strfind(string, format[formatPos], false, stringPos)) == -1)
    				{
    					if (format[end + 1])
    					{
    						return -1;
    					}
    					return 0;
    				}
    				format[end] = '\'';
    				stringPos = ch + (end - formatPos);
    				formatPos = end + 1;
    			}
    			case 'u':
    			{
    				new
    					end = stringPos - 1,
    					id = 0,
    					bool:num = true,
    					ch;
    				while ((ch = string[++end]) && ch != delim)
    				{
    					if (num)
    					{
    						if ('0' <= ch <= '9')
    						{
    							id = (id * 10) + (ch - '0');
    						}
    						else
    						{
    							num = false;
    						}
    					}
    				}
    				if (num && IsPlayerConnected(id))
    				{
    					setarg(paramPos, 0, id);
    				}
    				else
    				{
    					#if !defined foreach
    						#define foreach(%1,%2) for (new %2 = 0; %2 < MAX_PLAYERS; %2++) if (IsPlayerConnected(%2))
    						#define __SSCANF_FOREACH__
    					#endif
    					string[end] = '\0';
    					num = false;
    					new
    						name[MAX_PLAYER_NAME];
    					id = end - stringPos;
    					foreach (Player, playerid)
    					{
    						GetPlayerName(playerid, name, sizeof (name));
    						if (!strcmp(name, string[stringPos], true, id))
    						{
    							setarg(paramPos, 0, playerid);
    							num = true;
    							break;
    						}
    					}
    					if (!num)
    					{
    						setarg(paramPos, 0, INVALID_PLAYER_ID);
    					}
    					string[end] = ch;
    					#if defined __SSCANF_FOREACH__
    						#undef foreach
    						#undef __SSCANF_FOREACH__
    					#endif
    				}
    				stringPos = end;
    			}
    			case 's', 'z':
    			{
    				new
    					i = 0,
    					ch;
    				if (format[formatPos])
    				{
    					while ((ch = string[stringPos++]) && ch != delim)
    					{
    						setarg(paramPos, i++, ch);
    					}
    					if (!i)
    					{
    						return -1;
    					}
    				}
    				else
    				{
    					while ((ch = string[stringPos++]))
    					{
    						setarg(paramPos, i++, ch);
    					}
    				}
    				stringPos--;
    				setarg(paramPos, i, '\0');
    			}
    			default:
    			{
    				continue;
    			}
    		}
    		while (string[stringPos] && string[stringPos] != delim && string[stringPos] > ' ')
    		{
    			stringPos++;
    		}
    		while (string[stringPos] && (string[stringPos] == delim || string[stringPos] <= ' '))
    		{
    			stringPos++;
    		}
    		paramPos++;
    	}
    	do
    	{
    		if ((delim = format[formatPos++]) > ' ')
    		{
    			if (delim == '\'')
    			{
    				while ((delim = format[formatPos++]) && delim != '\'') {}
    			}
    			else if (delim != 'z')
    			{
    				return delim;
    			}
    		}
    	}
    	while (delim > ' ');
    	return 0;
    }
    now to public OnPlayerCommandText(playerid, cmdtext[])
    Code:
    if(strcmp(cmdtext, "/ban", true) == 0)
    {
    if(!IsPlayerAdmin(playerid)) // check if is player admin
    {
    	SendClientMessage(playerid, 0xFF0000FF, "You aren't admin.");
    	return 1;
    }
    
    new idplayer,
    	reason[256],
    	bannedby[MAX_PLAYER_NAME],
    	bannedwho[MAX_PLAYER_NAME],
    	forplayersban[256],
    	savetofilestr[256],
    	yearban,
    	monthban,
    	dayban,
    	hourban,
    	minuteban,
    	secondban,
    	banip[16];
    
    if(sscanf(cmdtext, "ds", idplayer, reason)) // this is definicion /command id text with all and if it is empty
    {
    	SendClientMessage(playerid, 0xFF0000FF, "Use: /ban id reason");
    	return 1;
    }
    
    if(!IsPlayerConnected(idplayer)) // check valid ID
    {
    	SendClientMessage(playerid, 0xFF0000FF, "Invalid ID");
    	return 1;
    }
    
    GetPlayerName(playerid, bannedby, sizeof(bannedby)); // name of admin
    GetPlayerName(idplayer, bannedwho, sizeof(bannedwho)); // name of selected player
    GetPlayerIp(idplayer, banip, sizeof(banip)); // ip of selected player
    format(forplayersban, sizeof(forplayersban), "Player %s (%d) was been banned %s. Reason: %s.", bannedwho, idplayer, bannedby, reason); // text to all players
    SendClientMessageToAll(0xFF0000FF, forplayersban);
    baningpe = fopen("banned.log", io_append); // opening file banned.log
    getdate(yearban, monthban, dayban); // getting date
    gettime(hourban, minuteban, secondban); // getting time
    format(savetofilestr, sizeof(savetofilestr), "[%02d:%02d:%02d | %02d/%02d/%d] %s IP: %s\n",hourban, minuteban, secondban, dayban, monthban, yearban, forplayersban, banip); // formating text to file
    fwrite(baningpe, savetofilestr); // writting text to file
    fclose(baningpe); // closing file
    return 1;
    }
    for this script you must create file in scriptfiles name "banned.log" (without ")

    This is my work no copy (command)
    Last edited by Lukasas; 11-10-09 at 08:02 PM.




Advertisement