//
|
|
// Base FS for Sanandreas Multiplayer 0.3
|
|
// Contains /pm /kick /ban commands - it also features
|
|
// a basic anti flood system, and admin chatting for rcon admins
|
|
// using # <message>
|
|
|
|
#include <a_samp>
|
|
#include "../include/gl_common.inc"
|
|
|
|
#define ADMINFS_MESSAGE_COLOR 0xFF444499
|
|
#define PM_INCOMING_COLOR 0xFFFF22AA
|
|
#define PM_OUTGOING_COLOR 0xFFCC2299
|
|
|
|
static iPlayerChatTime[MAX_PLAYERS];
|
|
static szPlayerChatMsg[MAX_PLAYERS][128];
|
|
|
|
//------------------------------------------------
|
|
|
|
stock IsPlayerFlooding(playerid)
|
|
{
|
|
if(GetTickCount() - iPlayerChatTime[playerid] < 2000)
|
|
return 1;
|
|
|
|
return 0;
|
|
}
|
|
|
|
//------------------------------------------------
|
|
|
|
public OnFilterScriptInit()
|
|
{
|
|
print("\n--Base FS loaded.\n");
|
|
return 1;
|
|
}
|
|
|
|
//------------------------------------------------
|
|
|
|
public OnPlayerText(playerid, text[])
|
|
{
|
|
// Is the player flooding?
|
|
if(IsPlayerFlooding(playerid) && !IsPlayerAdmin(playerid))
|
|
{
|
|
SendClientMessage(playerid, 0xFF0000FF, "* You can only send a message once every two seconds.");
|
|
return 0;
|
|
}
|
|
|
|
// Now we handle the admin chat, will be #<message>.
|
|
if( (text[0] == '#' || text[0] == '@') && strlen(text) > 1)
|
|
{
|
|
new str[128];
|
|
new szPlayerName[MAX_PLAYER_NAME];
|
|
GetPlayerName(playerid, szPlayerName, MAX_PLAYER_NAME);
|
|
|
|
if(IsPlayerAdmin(playerid))
|
|
{
|
|
format(str, 128, "Admin %s: %s", szPlayerName, text[1]);
|
|
|
|
for(new iPlayerID; iPlayerID < MAX_PLAYERS; iPlayerID++)
|
|
{
|
|
if(!IsPlayerConnected(iPlayerID)) continue;
|
|
if(!IsPlayerAdmin(iPlayerID)) continue;
|
|
SendClientMessage(iPlayerID, PM_INCOMING_COLOR, str);
|
|
}
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
// Okay, now it's time for anti repeating.
|
|
if(!IsPlayerAdmin(playerid))
|
|
{
|
|
if(strlen(text) == strlen(szPlayerChatMsg[playerid]) && !strcmp(szPlayerChatMsg[playerid], text, false))
|
|
{
|
|
SendClientMessage(playerid, 0xFF0000FF, "* Please do not repeat yourself.");
|
|
format(szPlayerChatMsg[playerid], 128, "%s", text);
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
format(szPlayerChatMsg[playerid], 128, "%s", text);
|
|
iPlayerChatTime[playerid] = GetTickCount();
|
|
return 1;
|
|
}
|
|
|
|
//------------------------------------------------
|
|
|
|
public OnPlayerDisconnect(playerid, reason)
|
|
{
|
|
#pragma unused reason
|
|
|
|
iPlayerChatTime[playerid] = 0;
|
|
szPlayerChatMsg[playerid] = "";
|
|
return 1;
|
|
}
|
|
|
|
//------------------------------------------------
|
|
|
|
public OnPlayerCommandText(playerid, cmdtext[])
|
|
{
|
|
if(IsPlayerFlooding(playerid) && !IsPlayerAdmin(playerid))
|
|
{
|
|
SendClientMessage(playerid, 0xFF0000FF, "* You can only use commands once every two seconds.");
|
|
return 1;
|
|
}
|
|
|
|
iPlayerChatTime[playerid] = GetTickCount();
|
|
|
|
new cmd[256];
|
|
new tmp[256];
|
|
new Message[256];
|
|
new gMessage[256];
|
|
new pName[MAX_PLAYER_NAME+1];
|
|
new iName[MAX_PLAYER_NAME+1];
|
|
new idx;
|
|
|
|
cmd = strtok(cmdtext, idx);
|
|
|
|
// PM Command
|
|
if(strcmp("/pm", cmd, true) == 0)
|
|
{
|
|
tmp = strtok(cmdtext,idx);
|
|
|
|
if(!strlen(tmp) || strlen(tmp) > 5) {
|
|
SendClientMessage(playerid,ADMINFS_MESSAGE_COLOR,"Usage: /pm (id) (message)");
|
|
return 1;
|
|
}
|
|
|
|
new id = strval(tmp);
|
|
gMessage = strrest(cmdtext,idx);
|
|
|
|
if(!strlen(gMessage)) {
|
|
SendClientMessage(playerid,ADMINFS_MESSAGE_COLOR,"Usage: /pm (id) (message)");
|
|
return 1;
|
|
}
|
|
|
|
if(!IsPlayerConnected(id)) {
|
|
SendClientMessage(playerid,ADMINFS_MESSAGE_COLOR,"/pm : Bad player ID");
|
|
}
|
|
|
|
if(playerid != id) {
|
|
GetPlayerName(id,iName,sizeof(iName));
|
|
GetPlayerName(playerid,pName,sizeof(pName));
|
|
format(Message,sizeof(Message),">> %s(%d): %s",iName,id,gMessage);
|
|
SendClientMessage(playerid,PM_OUTGOING_COLOR,Message);
|
|
format(Message,sizeof(Message),"** %s(%d): %s",pName,playerid,gMessage);
|
|
SendClientMessage(id,PM_INCOMING_COLOR,Message);
|
|
PlayerPlaySound(id,1085,0.0,0.0,0.0);
|
|
|
|
printf("PM: %s",Message);
|
|
|
|
}
|
|
else {
|
|
SendClientMessage(playerid,ADMINFS_MESSAGE_COLOR,"You cannot PM yourself");
|
|
}
|
|
return 1;
|
|
}
|
|
|
|
//Kick Command
|
|
if(strcmp("/kick", cmd, true) == 0)
|
|
{
|
|
if(IsPlayerAdmin(playerid)) {
|
|
tmp = strtok(cmdtext,idx);
|
|
if(!strlen(tmp) || strlen(tmp) > 5) {
|
|
return SendClientMessage(playerid,ADMINFS_MESSAGE_COLOR,"Usage: /kick (id) [reason]");
|
|
}
|
|
|
|
new id = strval(tmp);
|
|
|
|
if(!IsPlayerConnected(id)) {
|
|
SendClientMessage(playerid,ADMINFS_MESSAGE_COLOR,"/kick : Bad player ID");
|
|
return 1;
|
|
}
|
|
|
|
gMessage = strrest(cmdtext,idx);
|
|
|
|
GetPlayerName(id,iName,sizeof(iName));
|
|
SendClientMessage(id,ADMINFS_MESSAGE_COLOR,"-- You have been kicked from the server.");
|
|
|
|
if(strlen(gMessage) > 0) {
|
|
format(Message,sizeof(Message),"Reason: %s",gMessage);
|
|
SendClientMessage(id,ADMINFS_MESSAGE_COLOR,Message);
|
|
}
|
|
|
|
format(Message,sizeof(Message),">> %s(%d) has been kicked.",iName,id);
|
|
SendClientMessage(playerid,ADMINFS_MESSAGE_COLOR,Message);
|
|
|
|
Kick(id);
|
|
return 1;
|
|
} else {
|
|
SendClientMessage(playerid,ADMINFS_MESSAGE_COLOR,"/kick : You are not an admin");
|
|
return 1;
|
|
}
|
|
}
|
|
|
|
//Ban Command
|
|
if(strcmp("/ban", cmd, true) == 0)
|
|
{
|
|
if(IsPlayerAdmin(playerid)) {
|
|
tmp = strtok(cmdtext,idx);
|
|
if(!strlen(tmp) || strlen(tmp) > 5) {
|
|
return SendClientMessage(playerid,ADMINFS_MESSAGE_COLOR,"Usage: /ban (id) [reason]");
|
|
}
|
|
|
|
new id = strval(tmp);
|
|
|
|
if(!IsPlayerConnected(id)) {
|
|
SendClientMessage(playerid,ADMINFS_MESSAGE_COLOR,"/ban : Bad player ID");
|
|
return 1;
|
|
}
|
|
|
|
gMessage = strrest(cmdtext,idx);
|
|
|
|
GetPlayerName(id,iName,sizeof(iName));
|
|
SendClientMessage(id,ADMINFS_MESSAGE_COLOR,"-- You have been banned from the server.");
|
|
|
|
if(strlen(gMessage) > 0) {
|
|
format(Message,sizeof(Message),"Reason: %s",gMessage);
|
|
SendClientMessage(id,ADMINFS_MESSAGE_COLOR,Message);
|
|
}
|
|
|
|
format(Message,sizeof(Message),">> %s(%d) has been banned.",iName,id);
|
|
SendClientMessage(playerid,ADMINFS_MESSAGE_COLOR,Message);
|
|
|
|
Ban(id);
|
|
return 1;
|
|
} else {
|
|
SendClientMessage(playerid,ADMINFS_MESSAGE_COLOR,"/ban : You are not an admin");
|
|
return 1;
|
|
}
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
//-----------------------------------------------
|