200 lines
		
	
	
		
			4.1 KiB
		
	
	
	
		
			SourcePawn
		
	
	
	
	
	
			
		
		
	
	
			200 lines
		
	
	
		
			4.1 KiB
		
	
	
	
		
			SourcePawn
		
	
	
	
	
	
| #pragma semicolon 1
 | |
| 
 | |
| #define PLUGIN_AUTHOR "RumbleFrog, SourceBans++ Dev Team"
 | |
| #define PLUGIN_VERSION "1.6.4"
 | |
| 
 | |
| #include <sourcemod>
 | |
| #include <sourcebanspp>
 | |
| 
 | |
| #pragma newdecls required
 | |
| 
 | |
| #define Chat_Prefix "[SourceBans++] "
 | |
| 
 | |
| enum
 | |
| {
 | |
| 	Cooldown = 0,
 | |
| 	MinLen,
 | |
| 	Settings_Count
 | |
| };
 | |
| 
 | |
| ConVar Convars[Settings_Count];
 | |
| 
 | |
| bool bInReason[MAXPLAYERS + 1];
 | |
| 
 | |
| int iMinLen = 10
 | |
| 	, iTargetCache[MAXPLAYERS + 1];
 | |
| 
 | |
| float fCooldown = 60.0
 | |
| 	, fNextUse[MAXPLAYERS + 1];
 | |
| 
 | |
| public Plugin myinfo =
 | |
| {
 | |
| 	name = "SourceBans++ Report Plugin",
 | |
| 	author = PLUGIN_AUTHOR,
 | |
| 	description = "Adds ability for player to report offending players",
 | |
| 	version = PLUGIN_VERSION,
 | |
| 	url = "https://sbpp.github.io"
 | |
| };
 | |
| 
 | |
| public void OnPluginStart()
 | |
| {
 | |
| 	CreateConVar("sbpp_report_version", PLUGIN_VERSION, "SBPP Report Version", FCVAR_REPLICATED | FCVAR_SPONLY | FCVAR_DONTRECORD | FCVAR_NOTIFY);
 | |
| 
 | |
| 	Convars[Cooldown] = CreateConVar("sbpp_report_cooldown", "60.0", "Cooldown in seconds between per report per user", FCVAR_NONE, true, 0.0, false);
 | |
| 	Convars[MinLen] = CreateConVar("sbpp_report_minlen", "10", "Minimum reason length", FCVAR_NONE, true, 0.0, false);
 | |
| 
 | |
| 	LoadTranslations("sourcereport.phrases");
 | |
| 
 | |
| 	RegConsoleCmd("sm_report", CmdReport, "Initialize Report");
 | |
| 
 | |
| 	Convars[Cooldown].AddChangeHook(OnConvarChanged);
 | |
| 	Convars[MinLen].AddChangeHook(OnConvarChanged);
 | |
| }
 | |
| 
 | |
| public Action CmdReport(int iClient, int iArgs)
 | |
| {
 | |
| 	if (!IsValidClient(iClient))
 | |
| 		return Plugin_Handled;
 | |
| 
 | |
| 	if (OnCooldown(iClient))
 | |
| 	{
 | |
| 		PrintToChat(iClient, "%s%T", Chat_Prefix, "In Cooldown", iClient, GetRemainingTime(iClient));
 | |
| 
 | |
| 		return Plugin_Handled;
 | |
| 	}
 | |
| 
 | |
| 	Menu PList = new Menu(ReportMenu);
 | |
| 
 | |
| 	char sName[MAX_NAME_LENGTH], sIndex[4];
 | |
| 
 | |
| 	for (int i = 0; i <= MaxClients; i++)
 | |
| 	{
 | |
| 		if (!IsValidClient(i))
 | |
| 			continue;
 | |
| 
 | |
| 		GetClientName(i, sName, sizeof sName);
 | |
| 		IntToString(i, sIndex, sizeof sIndex);
 | |
| 
 | |
| 		PList.AddItem(sIndex, sName);
 | |
| 	}
 | |
| 
 | |
| 	PList.Display(iClient, MENU_TIME_FOREVER);
 | |
| 
 | |
| 	return Plugin_Handled;
 | |
| }
 | |
| 
 | |
| public int ReportMenu(Menu menu, MenuAction action, int iClient, int iItem)
 | |
| {
 | |
| 	switch (action)
 | |
| 	{
 | |
| 		case MenuAction_Select:
 | |
| 		{
 | |
| 			char sIndex[4];
 | |
| 
 | |
| 			menu.GetItem(iItem, sIndex, sizeof sIndex);
 | |
| 
 | |
| 			iTargetCache[iClient] = StringToInt(sIndex);
 | |
| 
 | |
| 			bInReason[iClient] = true;
 | |
| 
 | |
| 			PrintToChat(iClient, "%s%T", Chat_Prefix, "Reason Prompt", iClient);
 | |
| 		}
 | |
| 		case MenuAction_End:
 | |
| 			delete menu;
 | |
| 	}
 | |
| }
 | |
| 
 | |
| public Action OnClientSayCommand(int iClient, const char[] sCommand, const char[] sArgs)
 | |
| {
 | |
| 	if (!bInReason[iClient])
 | |
| 		return Plugin_Continue;
 | |
| 
 | |
| 	if (!IsValidClient(iClient) || (iTargetCache[iClient] != -1 && !IsValidClient(iTargetCache[iClient])))
 | |
| 	{
 | |
| 		ResetInReason(iClient);
 | |
| 
 | |
| 		return Plugin_Continue;
 | |
| 	}
 | |
| 
 | |
| 	if (StrEqual(sArgs, "cancel", false))
 | |
| 	{
 | |
| 		PrintToChat(iClient, "%s%T", Chat_Prefix, "Report Canceled", iClient);
 | |
| 
 | |
| 		ResetInReason(iClient);
 | |
| 
 | |
| 		return Plugin_Stop;
 | |
| 	}
 | |
| 
 | |
| 	if (strlen(sArgs) < iMinLen)
 | |
| 	{
 | |
| 		PrintToChat(iClient, "%s%T", Chat_Prefix, "Reason Short Need More", iClient);
 | |
| 
 | |
| 		return Plugin_Stop;
 | |
| 	}
 | |
| 
 | |
| 	SBPP_ReportPlayer(iClient, iTargetCache[iClient], sArgs);
 | |
| 
 | |
| 	AddCooldown(iClient);
 | |
| 
 | |
| 	ResetInReason(iClient);
 | |
| 
 | |
| 	return Plugin_Stop;
 | |
| }
 | |
| 
 | |
| public void SBPP_OnReportPlayer(int iReporter, int iTarget, const char[] sReason)
 | |
| {
 | |
| 	if (!IsValidClient(iReporter))
 | |
| 		return;
 | |
| 
 | |
| 	PrintToChat(iReporter, "%s%T", Chat_Prefix, "Report Sent", iReporter);
 | |
| }
 | |
| 
 | |
| void ResetInReason(int iClient)
 | |
| {
 | |
| 	bInReason[iClient] = false;
 | |
| 	iTargetCache[iClient] = -1;
 | |
| }
 | |
| 
 | |
| void AddCooldown(int iClient)
 | |
| {
 | |
| 	fNextUse[iClient] = GetGameTime() + fCooldown;
 | |
| }
 | |
| 
 | |
| bool OnCooldown(int iClient)
 | |
| {
 | |
| 	return (fNextUse[iClient] - GetGameTime()) > 0.0;
 | |
| }
 | |
| 
 | |
| float GetRemainingTime(int iClient)
 | |
| {
 | |
| 	float fOffset = fNextUse[iClient] - GetGameTime();
 | |
| 
 | |
| 	if (fOffset > 0.0)
 | |
| 		return fOffset;
 | |
| 	else
 | |
| 		return 0.0;
 | |
| }
 | |
| 
 | |
| public void OnConvarChanged(ConVar convar, const char[] oldValue, const char[] newValue)
 | |
| {
 | |
| 	if (convar == Convars[Cooldown])
 | |
| 		fCooldown = Convars[Cooldown].FloatValue;
 | |
| 	else if (convar == Convars[MinLen])
 | |
| 		iMinLen = Convars[MinLen].IntValue;
 | |
| }
 | |
| 
 | |
| stock bool IsValidClient(int iClient, bool bAlive = false)
 | |
| {
 | |
| 	if (iClient >= 1 &&
 | |
| 	iClient <= MaxClients &&
 | |
| 	IsClientConnected(iClient) &&
 | |
| 	IsClientInGame(iClient) &&
 | |
| 	!IsFakeClient(iClient) &&
 | |
| 	(bAlive == false || IsPlayerAlive(iClient)))
 | |
| 	{
 | |
| 		return true;
 | |
| 	}
 | |
| 
 | |
| 	return false;
 | |
| }
 |