From 10a6a750e39a2662f278d81abf8a97bfaa2ef539 Mon Sep 17 00:00:00 2001 From: Jackz Date: Mon, 11 Jul 2022 23:04:26 -0500 Subject: [PATCH] Add name spam block plugin --- .gitignore | 2 + README.md | 10 ++++ plugins/sm_namespamblock.smx | Bin 0 -> 5359 bytes scripting/sm_namespamblock.sp | 107 ++++++++++++++++++++++++++++++++++ 4 files changed, 119 insertions(+) create mode 100644 plugins/sm_namespamblock.smx create mode 100644 scripting/sm_namespamblock.sp diff --git a/.gitignore b/.gitignore index 70a136e..45985d3 100644 --- a/.gitignore +++ b/.gitignore @@ -7,6 +7,8 @@ scripting_ext/ !scripting/include/guessswho/* !scripting/hideandseek.sp !scripting/guessswho.sp +!scripting/sm_namespamblock.sp +!plugins/sm_namespamblock.smx .push.settings.jsonc* template.config.js scripting/sm_give.sp diff --git a/README.md b/README.md index ce11bf6..23a7866 100644 --- a/README.md +++ b/README.md @@ -37,6 +37,7 @@ Useful things: * [l4d2_vocalize_control](#l4d2_vocalize_control) - Allows you to locally mute someone from vocalizing * [l4d2_hideandseek](#l4d2_hideandseek) - An enhancement to the base hide and seek mutation * [l4d2_guesswho](#l4d2_guesswho) - Garrys mod's guess who in l4d2, inspired by hide and seek + * [sm_namespamblock](#sm_namespamblock) - Basic plugin that bans players if they change their name in rapid succession ### Modified Others * [200IQBots_FlyYouFools](#200iqbots_flyyoufools) - Improved code to make it support multiple tanks and work better @@ -335,3 +336,12 @@ Vscript required for hud & mutation Gamemode: https://steamcommunity.com/sharedfiles/filedetails/?id=2823719841 Requires l4dtoolz and left4dhooks, and optioanlly skip intro cutscene + +### sm_namespamblock + +If a user changes their name 3 times within 10 seconds, they will be temp banned for 10 minutes. +Requires recompile to change. + +* **Commands:** + * `status2` - Shitty name, but shows all non-admin players, sorted by last joined ascending (up top). Shows steamid and the first name they joined the server as + * `sm_status2` - Same command, but allows /status2 in chat \ No newline at end of file diff --git a/plugins/sm_namespamblock.smx b/plugins/sm_namespamblock.smx new file mode 100644 index 0000000000000000000000000000000000000000..34e87d42b3e20bb679fc3226ad2c767bd5ac6fc8 GIT binary patch literal 5359 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 Y>HE>O+bb`?3kw-Ef>$iv%+;{}0TJ>!qW}N^ literal 0 HcmV?d00001 diff --git a/scripting/sm_namespamblock.sp b/scripting/sm_namespamblock.sp new file mode 100644 index 0000000..db383c4 --- /dev/null +++ b/scripting/sm_namespamblock.sp @@ -0,0 +1,107 @@ +#pragma semicolon 1 +#pragma newdecls required + +//#define DEBUG + +#define PLUGIN_VERSION "1.0" + +#include +#include +//#include + +#define MIN_TIME_BETWEEN_NAME_CHANGES 10000 +#define MAX_NAME_COUNT 3 + +public Plugin myinfo = +{ + name = "Name change Block", + author = "jackzmc", + description = "", + version = PLUGIN_VERSION, + url = "https://github.com/Jackzmc/sourcemod-plugins" +}; + +public void OnPluginStart() { + HookEvent("player_info", Event_PlayerInfo); + RegAdminCmd("status2", Cmd_Status2, ADMFLAG_GENERIC); + RegAdminCmd("sm_status2", Cmd_Status2, ADMFLAG_GENERIC); +} + +char firstName[64][MAXPLAYERS+1]; +int joinTime[MAXPLAYERS+1]; + +public Action Cmd_Status2(int client, int args) { + ArrayList players = new ArrayList(); + for(int i = 1; i <= MaxClients; i++) { + if(IsClientConnected(i) && !IsFakeClient(i) && GetUserAdmin(i) == INVALID_ADMIN_ID) { + players.Push(i); + } + } + players.SortCustom(Sort_Players); + char buffer[64], steamid[32]; + ReplyToCommand(client, "Index\tUserid\tName\tSteamID"); + for(int i = 0; i < players.Length; i++) { + int player = players.Get(i); + GetClientAuthId(player, AuthId_Steam2, buffer, sizeof(buffer)); + GetClientName(player, buffer, sizeof(buffer)); + if(StrEqual(buffer, firstName[player])) + ReplyToCommand(client, "%d.\t#%d\t%s\t%s", player, GetClientUserId(player), buffer, steamid); + else + ReplyToCommand(client, "%d.\t#%d\t%s\t%s (formely %s)", player, GetClientUserId(player), buffer, steamid, firstName[player]); + } + ReplySource src = GetCmdReplySource(); + if(src == SM_REPLY_TO_CONSOLE) + ReplyToCommand(client, "You can ban players by using their userid or steamid with #. \"sm_ban #52 0\" or \"sm_ban #STEAM_1:1:5325325 0\""); + else + ReplyToCommand(client, "You can ban players by using their userid or steamid with #. \"/ban #52 0\" or \"/ban #STEAM_1:1:5325325 0\""); + return Plugin_Handled; +} + +public int Sort_Players(int index1, int index2, ArrayList array, Handle hndl) { + return joinTime[index2] - joinTime[index1]; +} + +static int lastNameChange[MAXPLAYERS+1]; +static int nameChangeCount[MAXPLAYERS+1]; + +public void Event_PlayerInfo(Event event, const char[] name, bool dontBroadcast) { + int client = GetClientOfUserId(event.GetInt("userid")); + if(client && !IsFakeClient(client) && GetUserAdmin(client) == INVALID_ADMIN_ID) { + ++nameChangeCount[client]; + int time = GetTime(); + int diff = time - lastNameChange[client]; + if(diff < MIN_TIME_BETWEEN_NAME_CHANGES && nameChangeCount[client] > MAX_NAME_COUNT) { + char buffer[64]; + Format(buffer, sizeof(buffer), "Excessive name changing (%d in %d seconds)", nameChangeCount[client], diff); + BanClient(client, 20, BANFLAG_AUTO, "Excessive name changing", buffer); + GetClientAuthId(client, AuthId_Steam2, buffer, sizeof(buffer)); + PrintChatToAdmins("%N (steamid %s) hit excessive name change and has been banned temporarily", client, buffer); + } + lastNameChange[client] = time; + } +} + +stock void PrintChatToAdmins(const char[] format, any ...) { + char buffer[254]; + VFormat(buffer, sizeof(buffer), format, 2); + for(int i = 1; i < MaxClients; i++) { + if(IsClientConnected(i) && IsClientInGame(i)) { + AdminId admin = GetUserAdmin(i); + if(admin != INVALID_ADMIN_ID) { + PrintToChat(i, "%s", buffer); + } + } + } + PrintToServer("%s", buffer); +} + + +public void OnClientConnected(int client) { + lastNameChange[client] = 0; + nameChangeCount[client] = 0; + firstName[client][0] = '\0'; + if(!IsFakeClient(client)) { + joinTime[client] = GetTime(); + GetClientName(client, firstName[client], 64 ); + } +}