sm-plugins/Sourcebans++/scripting/sbpp_report.sp

200 lines
4.1 KiB
SourcePawn
Raw Normal View History

2023-01-27 16:21:44 +01:00
#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;
}