// // 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 # #include #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 #. 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; } //-----------------------------------------------