From eefb23882b6a2693153aa2ce61d09664c5632388 Mon Sep 17 00:00:00 2001 From: BotoX Date: Thu, 9 Aug 2018 19:35:44 +0200 Subject: [PATCH] batch remove trailing spaces and convert windows \r\n line endings to linux \n i don't want to have to do this again, fix your shitty code editors @commiters !!! --- .../scripting/include/AntiBhopCheat.inc | 2 +- AutoRecorder/scripting/AutoRecorder.sp | 442 ++-- .../scripting/ConVarSuppression.sp | 234 +-- Discord/scripting/Discord.sp | 1796 ++++++++--------- .../scripting/FixPointTeleport.sp | 18 +- ForceInputs/scripting/ForceInputs.sp | 4 +- FunMode/scripting/FunMode.sp | 2 +- .../scripting/PlayerscountInHostname.sp | 10 +- PushNades/scripting/PushNades.sp | 64 +- RadioMute/scripting/RadioMute.sp | 330 +-- TeamManager/scripting/include/TeamManager.inc | 72 +- _entWatch4/scripting/entWatch-core.sp | 118 +- _entWatch4/scripting/entWatch-interface.sp | 8 +- _entWatch4/scripting/entWatch-messages.sp | 20 +- _entWatch4/scripting/entWatch-restrictions.sp | 56 +- .../scripting/include/entWatch_core.inc | 2 +- .../include/entWatch_restrictions.inc | 2 +- custom-chatcolors/scripting/include/ccc.inc | 42 +- includes/SteamWorks.inc | 10 +- includes/dhooks.inc | 96 +- includes/multicolors.inc | 30 +- includes/multicolors/colors.inc | 208 +- includes/multicolors/morecolors.inc | 128 +- includes/zr_grenade_effects.inc | 80 +- .../scripting/include/mapchooser_extended.inc | 14 +- .../scripting/include/nativevotes.inc | 124 +- .../scripting/mapchooser_extended.sp | 2 +- sourcebans/scripting/sourcecomms.sp | 6 +- zr_tools/scripting/include/zr_tools.inc | 2 +- zr_tools/scripting/zr_tools.sp | 62 +- 30 files changed, 1992 insertions(+), 1992 deletions(-) diff --git a/AntiBhopCheat/scripting/include/AntiBhopCheat.inc b/AntiBhopCheat/scripting/include/AntiBhopCheat.inc index 0b968fb1..c71338b1 100644 --- a/AntiBhopCheat/scripting/include/AntiBhopCheat.inc +++ b/AntiBhopCheat/scripting/include/AntiBhopCheat.inc @@ -2,5 +2,5 @@ #endinput #endif #define _AntiBhopCheat_Included - + forward void AntiBhopCheat_OnClientDetected(int client, char[] sReason, char[] sStats); \ No newline at end of file diff --git a/AutoRecorder/scripting/AutoRecorder.sp b/AutoRecorder/scripting/AutoRecorder.sp index 3c56751d..8ea8d012 100644 --- a/AutoRecorder/scripting/AutoRecorder.sp +++ b/AutoRecorder/scripting/AutoRecorder.sp @@ -1,221 +1,221 @@ -#pragma semicolon 1 -#include - -ConVar g_hTvEnabled; -ConVar g_hAutoRecord; -ConVar g_hMinPlayersStart; -ConVar g_hIgnoreBots; -ConVar g_hTimeStart; -ConVar g_hTimeStop; -ConVar g_hFinishMap; -ConVar g_hDemoPath; -ConVar g_hMaxLength; - -bool g_bIsRecording = false; -bool g_bIsManual = false; - -int g_iStartedRecording; - -// Default: o=rx,g=rx,u=rwx | 755 -#define DIRECTORY_PERMISSIONS (FPERM_O_READ|FPERM_O_EXEC | FPERM_G_READ|FPERM_G_EXEC | FPERM_U_READ|FPERM_U_WRITE|FPERM_U_EXEC) - -public Plugin myinfo = -{ - name = "Auto Recorder", - author = "Stevo.TVR", - description = "Automates SourceTV recording based on player count and time of day.", - version = "1.2.0", - url = "http://www.theville.org" -} - -public void OnPluginStart() -{ - g_hAutoRecord = CreateConVar("sm_autorecord_enable", "1", "Enable automatic recording", _, true, 0.0, true, 1.0); - g_hMinPlayersStart = CreateConVar("sm_autorecord_minplayers", "4", "Minimum players on server to start recording", _, true, 0.0); - g_hIgnoreBots = CreateConVar("sm_autorecord_ignorebots", "1", "Ignore bots in the player count", _, true, 0.0, true, 1.0); - g_hTimeStart = CreateConVar("sm_autorecord_timestart", "-1", "Hour in the day to start recording (0-23, -1 disables)"); - g_hTimeStop = CreateConVar("sm_autorecord_timestop", "-1", "Hour in the day to stop recording (0-23, -1 disables)"); - g_hFinishMap = CreateConVar("sm_autorecord_finishmap", "1", "If 1, continue recording until the map ends", _, true, 0.0, true, 1.0); - g_hDemoPath = CreateConVar("sm_autorecord_path", "demos/", "Path to store recorded demos"); - g_hMaxLength = CreateConVar("sm_autorecord_maxlength", "0", "Maximum length of demos in seconds, 0 to disable", _, true, 0.0); - - AutoExecConfig(true, "autorecorder"); - - RegAdminCmd("sm_record", Command_Record, ADMFLAG_KICK, "Starts a SourceTV demo"); - RegAdminCmd("sm_stoprecord", Command_StopRecord, ADMFLAG_KICK, "Stops the current SourceTV demo"); - - HookEvent("round_start", OnRoundStart); - - g_hTvEnabled = FindConVar("tv_enable"); - - static char sPath[PLATFORM_MAX_PATH]; - GetConVarString(g_hDemoPath, sPath, sizeof(sPath)); - - if(!DirExists(sPath)) - CreateDirectory(sPath, DIRECTORY_PERMISSIONS); - - HookConVarChange(g_hMinPlayersStart, OnConVarChanged); - HookConVarChange(g_hIgnoreBots, OnConVarChanged); - HookConVarChange(g_hTimeStart, OnConVarChanged); - HookConVarChange(g_hTimeStop, OnConVarChanged); - HookConVarChange(g_hDemoPath, OnConVarChanged); - - CreateTimer(300.0, Timer_CheckStatus, _, TIMER_REPEAT); - - StopRecord(); - CheckStatus(); -} - -public void OnRoundStart(Event hEvent, const char[] sEvent, bool bDontBroadcast) -{ - int maxLength = GetConVarInt(g_hMaxLength); - if(g_bIsRecording && maxLength > 0 && GetTime() >= g_iStartedRecording + maxLength) - { - StopRecord(); - CheckStatus(); - } -} - -public void OnConVarChanged(ConVar convar, const char[] oldValue, const char[] newValue) -{ - if(convar == g_hDemoPath) - { - if(!DirExists(newValue)) - CreateDirectory(newValue, DIRECTORY_PERMISSIONS); - } - else - CheckStatus(); -} - -public void OnMapEnd() -{ - if(g_bIsRecording) - { - StopRecord(); - g_bIsManual = false; - } -} - -public void OnClientPutInServer(int client) -{ - CheckStatus(); -} - -public void OnClientDisconnect_Post(int client) -{ - CheckStatus(); -} - -public Action Timer_CheckStatus(Handle hTimer) -{ - CheckStatus(); -} - -public Action Command_Record(int client, int args) -{ - if(g_bIsRecording) - { - ReplyToCommand(client, "[SM] SourceTV is already recording!"); - return Plugin_Handled; - } - - StartRecord(); - g_bIsManual = true; - - ReplyToCommand(client, "[SM] SourceTV is now recording..."); - - return Plugin_Handled; -} - -public Action Command_StopRecord(int client, int args) -{ - if(!g_bIsRecording) - { - ReplyToCommand(client, "[SM] SourceTV is not recording!"); - return Plugin_Handled; - } - - StopRecord(); - - if(g_bIsManual) - { - g_bIsManual = false; - CheckStatus(); - } - - ReplyToCommand(client, "[SM] Stopped recording."); - - return Plugin_Handled; -} - -void CheckStatus() -{ - if(GetConVarBool(g_hAutoRecord) && !g_bIsManual) - { - int iMinClients = GetConVarInt(g_hMinPlayersStart); - - int iTimeStart = GetConVarInt(g_hTimeStart); - int iTimeStop = GetConVarInt(g_hTimeStop); - bool bReverseTimes = (iTimeStart > iTimeStop); - - static char sCurrentTime[4]; - FormatTime(sCurrentTime, sizeof(sCurrentTime), "%H", GetTime()); - int iCurrentTime = StringToInt(sCurrentTime); - - if(GetPlayerCount() >= iMinClients+1 && (iTimeStart < 0 || (iCurrentTime >= iTimeStart && (bReverseTimes || iCurrentTime < iTimeStop)))) - { - StartRecord(); - } - else if(g_bIsRecording && !GetConVarBool(g_hFinishMap) && (iTimeStop < 0 || iCurrentTime >= iTimeStop)) - { - StopRecord(); - } - } -} - -int GetPlayerCount() -{ - if(!GetConVarBool(g_hIgnoreBots)) - return GetClientCount(false) - 1; - - int iNumPlayers = 0; - for(int i = 1; i <= MaxClients; i++) - { - if(IsClientConnected(i) && !IsFakeClient(i)) - iNumPlayers++; - } - - return iNumPlayers; -} - -void StartRecord() -{ - if(GetConVarBool(g_hTvEnabled) && !g_bIsRecording) - { - static char sPath[PLATFORM_MAX_PATH]; - static char sMap[PLATFORM_MAX_PATH]; - static char sTime[16]; - - GetConVarString(g_hDemoPath, sPath, sizeof(sPath)); - FormatTime(sTime, sizeof(sTime), "%Y%m%d-%H%M%S", GetTime()); - GetCurrentMap(sMap, sizeof(sMap)); - - // replace slashes in map path name with dashes, to prevent fail on workshop maps - ReplaceString(sMap, sizeof(sMap), "/", "-", false); - - ServerCommand("tv_record \"%s/auto-%s-%s\"", sPath, sTime, sMap); - g_bIsRecording = true; - g_iStartedRecording = GetTime(); - - LogMessage("Recording to auto-%s-%s.dem", sTime, sMap); - } -} - -void StopRecord() -{ - if(GetConVarBool(g_hTvEnabled)) - { - ServerCommand("tv_stoprecord"); - g_bIsRecording = false; - } -} +#pragma semicolon 1 +#include + +ConVar g_hTvEnabled; +ConVar g_hAutoRecord; +ConVar g_hMinPlayersStart; +ConVar g_hIgnoreBots; +ConVar g_hTimeStart; +ConVar g_hTimeStop; +ConVar g_hFinishMap; +ConVar g_hDemoPath; +ConVar g_hMaxLength; + +bool g_bIsRecording = false; +bool g_bIsManual = false; + +int g_iStartedRecording; + +// Default: o=rx,g=rx,u=rwx | 755 +#define DIRECTORY_PERMISSIONS (FPERM_O_READ|FPERM_O_EXEC | FPERM_G_READ|FPERM_G_EXEC | FPERM_U_READ|FPERM_U_WRITE|FPERM_U_EXEC) + +public Plugin myinfo = +{ + name = "Auto Recorder", + author = "Stevo.TVR", + description = "Automates SourceTV recording based on player count and time of day.", + version = "1.2.0", + url = "http://www.theville.org" +} + +public void OnPluginStart() +{ + g_hAutoRecord = CreateConVar("sm_autorecord_enable", "1", "Enable automatic recording", _, true, 0.0, true, 1.0); + g_hMinPlayersStart = CreateConVar("sm_autorecord_minplayers", "4", "Minimum players on server to start recording", _, true, 0.0); + g_hIgnoreBots = CreateConVar("sm_autorecord_ignorebots", "1", "Ignore bots in the player count", _, true, 0.0, true, 1.0); + g_hTimeStart = CreateConVar("sm_autorecord_timestart", "-1", "Hour in the day to start recording (0-23, -1 disables)"); + g_hTimeStop = CreateConVar("sm_autorecord_timestop", "-1", "Hour in the day to stop recording (0-23, -1 disables)"); + g_hFinishMap = CreateConVar("sm_autorecord_finishmap", "1", "If 1, continue recording until the map ends", _, true, 0.0, true, 1.0); + g_hDemoPath = CreateConVar("sm_autorecord_path", "demos/", "Path to store recorded demos"); + g_hMaxLength = CreateConVar("sm_autorecord_maxlength", "0", "Maximum length of demos in seconds, 0 to disable", _, true, 0.0); + + AutoExecConfig(true, "autorecorder"); + + RegAdminCmd("sm_record", Command_Record, ADMFLAG_KICK, "Starts a SourceTV demo"); + RegAdminCmd("sm_stoprecord", Command_StopRecord, ADMFLAG_KICK, "Stops the current SourceTV demo"); + + HookEvent("round_start", OnRoundStart); + + g_hTvEnabled = FindConVar("tv_enable"); + + static char sPath[PLATFORM_MAX_PATH]; + GetConVarString(g_hDemoPath, sPath, sizeof(sPath)); + + if(!DirExists(sPath)) + CreateDirectory(sPath, DIRECTORY_PERMISSIONS); + + HookConVarChange(g_hMinPlayersStart, OnConVarChanged); + HookConVarChange(g_hIgnoreBots, OnConVarChanged); + HookConVarChange(g_hTimeStart, OnConVarChanged); + HookConVarChange(g_hTimeStop, OnConVarChanged); + HookConVarChange(g_hDemoPath, OnConVarChanged); + + CreateTimer(300.0, Timer_CheckStatus, _, TIMER_REPEAT); + + StopRecord(); + CheckStatus(); +} + +public void OnRoundStart(Event hEvent, const char[] sEvent, bool bDontBroadcast) +{ + int maxLength = GetConVarInt(g_hMaxLength); + if(g_bIsRecording && maxLength > 0 && GetTime() >= g_iStartedRecording + maxLength) + { + StopRecord(); + CheckStatus(); + } +} + +public void OnConVarChanged(ConVar convar, const char[] oldValue, const char[] newValue) +{ + if(convar == g_hDemoPath) + { + if(!DirExists(newValue)) + CreateDirectory(newValue, DIRECTORY_PERMISSIONS); + } + else + CheckStatus(); +} + +public void OnMapEnd() +{ + if(g_bIsRecording) + { + StopRecord(); + g_bIsManual = false; + } +} + +public void OnClientPutInServer(int client) +{ + CheckStatus(); +} + +public void OnClientDisconnect_Post(int client) +{ + CheckStatus(); +} + +public Action Timer_CheckStatus(Handle hTimer) +{ + CheckStatus(); +} + +public Action Command_Record(int client, int args) +{ + if(g_bIsRecording) + { + ReplyToCommand(client, "[SM] SourceTV is already recording!"); + return Plugin_Handled; + } + + StartRecord(); + g_bIsManual = true; + + ReplyToCommand(client, "[SM] SourceTV is now recording..."); + + return Plugin_Handled; +} + +public Action Command_StopRecord(int client, int args) +{ + if(!g_bIsRecording) + { + ReplyToCommand(client, "[SM] SourceTV is not recording!"); + return Plugin_Handled; + } + + StopRecord(); + + if(g_bIsManual) + { + g_bIsManual = false; + CheckStatus(); + } + + ReplyToCommand(client, "[SM] Stopped recording."); + + return Plugin_Handled; +} + +void CheckStatus() +{ + if(GetConVarBool(g_hAutoRecord) && !g_bIsManual) + { + int iMinClients = GetConVarInt(g_hMinPlayersStart); + + int iTimeStart = GetConVarInt(g_hTimeStart); + int iTimeStop = GetConVarInt(g_hTimeStop); + bool bReverseTimes = (iTimeStart > iTimeStop); + + static char sCurrentTime[4]; + FormatTime(sCurrentTime, sizeof(sCurrentTime), "%H", GetTime()); + int iCurrentTime = StringToInt(sCurrentTime); + + if(GetPlayerCount() >= iMinClients+1 && (iTimeStart < 0 || (iCurrentTime >= iTimeStart && (bReverseTimes || iCurrentTime < iTimeStop)))) + { + StartRecord(); + } + else if(g_bIsRecording && !GetConVarBool(g_hFinishMap) && (iTimeStop < 0 || iCurrentTime >= iTimeStop)) + { + StopRecord(); + } + } +} + +int GetPlayerCount() +{ + if(!GetConVarBool(g_hIgnoreBots)) + return GetClientCount(false) - 1; + + int iNumPlayers = 0; + for(int i = 1; i <= MaxClients; i++) + { + if(IsClientConnected(i) && !IsFakeClient(i)) + iNumPlayers++; + } + + return iNumPlayers; +} + +void StartRecord() +{ + if(GetConVarBool(g_hTvEnabled) && !g_bIsRecording) + { + static char sPath[PLATFORM_MAX_PATH]; + static char sMap[PLATFORM_MAX_PATH]; + static char sTime[16]; + + GetConVarString(g_hDemoPath, sPath, sizeof(sPath)); + FormatTime(sTime, sizeof(sTime), "%Y%m%d-%H%M%S", GetTime()); + GetCurrentMap(sMap, sizeof(sMap)); + + // replace slashes in map path name with dashes, to prevent fail on workshop maps + ReplaceString(sMap, sizeof(sMap), "/", "-", false); + + ServerCommand("tv_record \"%s/auto-%s-%s\"", sPath, sTime, sMap); + g_bIsRecording = true; + g_iStartedRecording = GetTime(); + + LogMessage("Recording to auto-%s-%s.dem", sTime, sMap); + } +} + +void StopRecord() +{ + if(GetConVarBool(g_hTvEnabled)) + { + ServerCommand("tv_stoprecord"); + g_bIsRecording = false; + } +} diff --git a/ConVarSuppression/scripting/ConVarSuppression.sp b/ConVarSuppression/scripting/ConVarSuppression.sp index 8625c97d..b0cd80d6 100644 --- a/ConVarSuppression/scripting/ConVarSuppression.sp +++ b/ConVarSuppression/scripting/ConVarSuppression.sp @@ -1,118 +1,118 @@ -#pragma semicolon 1 -#include - -#define PLUGIN_PREFIX "\x04[ConVar Suppression]\x03 " -#define PLUGIN_VERSION "1.0" - -new Handle:g_hGlobalTrie = INVALID_HANDLE; - -public Plugin:myinfo = -{ - name = "ConVar Suppression", /* https://www.youtube.com/watch?v=ZhjtChtUmBE&hd=1 */ - author = "Kyle Sanderson", - description = "Atleast we have candy.", - version = PLUGIN_VERSION, - url = "http://www.SourceMod.net/" -}; - -public OnPluginStart() -{ - g_hGlobalTrie = CreateTrie(); - HookEvent("server_cvar", Event_ServerCvar, EventHookMode_Pre); - RegAdminCmd("sm_suppressconvar", OnSupressConVar, ADMFLAG_ROOT, "Supress a ConVar from displaying changes to Clients."); - - CreateConVar("sm_convarsuppression_version", PLUGIN_VERSION, "Version string for ConVar Supression.", FCVAR_REPLICATED|FCVAR_DONTRECORD|FCVAR_NOTIFY); - - AutoExecConfig(true, "plugin.ConVarSupression"); -} - -public Action:OnSupressConVar(client, argc) -{ - if (client && !IsClientInGame(client)) /* Isn't needed, but makes me feel safe inside. */ - { - return Plugin_Handled; - } - - decl String:sCommand[256]; - - if (argc < 2) - { - if (!GetCmdArg(0, sCommand, sizeof(sCommand))) - { - return Plugin_Handled; - } - - ReplyToCommand(client, "%s%s ", PLUGIN_PREFIX, sCommand); - return Plugin_Handled; - } - - if (!GetCmdArg(2, sCommand, sizeof(sCommand))) - { - return Plugin_Handled; - } - - TrimString(sCommand); - new iValue = -1; - - if (!IsCharNumeric(sCommand[0])) - { - switch (CharToLower(sCommand[0])) - { - case 'd': - { - iValue = 0; - } - - case 'e': - { - iValue = 1; - } - } - } - else - { - iValue = StringToInt(sCommand); - } - - if (!GetCmdArg(1, sCommand, sizeof(sCommand))) - { - return Plugin_Handled; - } - - switch (iValue) - { - case 0: - { - RemoveFromTrie(g_hGlobalTrie, sCommand); - if (client) - { - ReplyToCommand(client, "%sRemoved ConVar: %s", PLUGIN_PREFIX, sCommand); - } - } - - case 1: - { - SetTrieValue(g_hGlobalTrie, sCommand, 1, true); - if (client) - { - ReplyToCommand(client, "%sAdded Hook for ConVar: %s", PLUGIN_PREFIX, sCommand); - } - } - - default: - { - ReplyToCommand(client, "%sIllegal Input for Enabled/Disabled with ConVar: %s", PLUGIN_PREFIX, sCommand); - } - } - - return Plugin_Handled; -} - -public Action:Event_ServerCvar(Handle:event, const String:name[], bool:dontBroadcast) -{ - decl String:sConVarName[64]; - new iValue; - - GetEventString(event, "cvarname", sConVarName, sizeof(sConVarName)); - return (GetTrieValue(g_hGlobalTrie, sConVarName, iValue) && iValue) ? Plugin_Handled : Plugin_Continue; +#pragma semicolon 1 +#include + +#define PLUGIN_PREFIX "\x04[ConVar Suppression]\x03 " +#define PLUGIN_VERSION "1.0" + +new Handle:g_hGlobalTrie = INVALID_HANDLE; + +public Plugin:myinfo = +{ + name = "ConVar Suppression", /* https://www.youtube.com/watch?v=ZhjtChtUmBE&hd=1 */ + author = "Kyle Sanderson", + description = "Atleast we have candy.", + version = PLUGIN_VERSION, + url = "http://www.SourceMod.net/" +}; + +public OnPluginStart() +{ + g_hGlobalTrie = CreateTrie(); + HookEvent("server_cvar", Event_ServerCvar, EventHookMode_Pre); + RegAdminCmd("sm_suppressconvar", OnSupressConVar, ADMFLAG_ROOT, "Supress a ConVar from displaying changes to Clients."); + + CreateConVar("sm_convarsuppression_version", PLUGIN_VERSION, "Version string for ConVar Supression.", FCVAR_REPLICATED|FCVAR_DONTRECORD|FCVAR_NOTIFY); + + AutoExecConfig(true, "plugin.ConVarSupression"); +} + +public Action:OnSupressConVar(client, argc) +{ + if (client && !IsClientInGame(client)) /* Isn't needed, but makes me feel safe inside. */ + { + return Plugin_Handled; + } + + decl String:sCommand[256]; + + if (argc < 2) + { + if (!GetCmdArg(0, sCommand, sizeof(sCommand))) + { + return Plugin_Handled; + } + + ReplyToCommand(client, "%s%s ", PLUGIN_PREFIX, sCommand); + return Plugin_Handled; + } + + if (!GetCmdArg(2, sCommand, sizeof(sCommand))) + { + return Plugin_Handled; + } + + TrimString(sCommand); + new iValue = -1; + + if (!IsCharNumeric(sCommand[0])) + { + switch (CharToLower(sCommand[0])) + { + case 'd': + { + iValue = 0; + } + + case 'e': + { + iValue = 1; + } + } + } + else + { + iValue = StringToInt(sCommand); + } + + if (!GetCmdArg(1, sCommand, sizeof(sCommand))) + { + return Plugin_Handled; + } + + switch (iValue) + { + case 0: + { + RemoveFromTrie(g_hGlobalTrie, sCommand); + if (client) + { + ReplyToCommand(client, "%sRemoved ConVar: %s", PLUGIN_PREFIX, sCommand); + } + } + + case 1: + { + SetTrieValue(g_hGlobalTrie, sCommand, 1, true); + if (client) + { + ReplyToCommand(client, "%sAdded Hook for ConVar: %s", PLUGIN_PREFIX, sCommand); + } + } + + default: + { + ReplyToCommand(client, "%sIllegal Input for Enabled/Disabled with ConVar: %s", PLUGIN_PREFIX, sCommand); + } + } + + return Plugin_Handled; +} + +public Action:Event_ServerCvar(Handle:event, const String:name[], bool:dontBroadcast) +{ + decl String:sConVarName[64]; + new iValue; + + GetEventString(event, "cvarname", sConVarName, sizeof(sConVarName)); + return (GetTrieValue(g_hGlobalTrie, sConVarName, iValue) && iValue) ? Plugin_Handled : Plugin_Continue; } \ No newline at end of file diff --git a/Discord/scripting/Discord.sp b/Discord/scripting/Discord.sp index 424a6796..c2b28dbc 100644 --- a/Discord/scripting/Discord.sp +++ b/Discord/scripting/Discord.sp @@ -1,898 +1,898 @@ -#pragma semicolon 1 - -#include -#include -#include -#include -#include -#include "sdktools_functions.inc" - -#include -#include - -#pragma newdecls required - -#include "SteamAPI.secret" // #define STEAM_API_KEY "" -#include "Discord.secret" // #define DISCORD_* - -Regex g_Regex_Clyde = null; - -ConVar g_Cvar_HostIP = null; -ConVar g_Cvar_HostPort = null; -ConVar g_Cvar_HostName = null; - -ArrayList g_arrQueuedMessages = null; - -Handle g_hDataTimer = null; -Handle g_hReplaceConfigFile = null; - -UserMsg g_umSayText2 = INVALID_MESSAGE_ID; - -bool g_bLoadedLate; -bool g_bTimerDone; -bool g_bProcessingData; -bool g_bGotReplaceFile; -bool g_bTeamChat; - -char g_sReplacePath[PLATFORM_MAX_PATH]; -char g_sAvatarURL[MAXPLAYERS + 1][128]; - -int g_iPlayersAtPOST = 0; -int g_iRatelimitRemaining = 5; -int g_iRatelimitReset; - -float g_fReportCooldown[MAXPLAYERS + 1]; - -public Plugin myinfo = -{ - name = "Discord core", - author = "Obus", - description = "Implements live chat and map reporting for Discord.", - version = "1.1.0", - url = "" -} - -public APLRes AskPluginLoad2(Handle hThis, bool bLate, char[] sError, int err_max) -{ - g_bLoadedLate = bLate; - - return APLRes_Success; -} - -public void OnPluginStart() -{ - char sRegexErr[32]; - RegexError RegexErr; - - g_Regex_Clyde = CompileRegex(".*(clyde).*", PCRE_CASELESS, sRegexErr, sizeof(sRegexErr), RegexErr); - - if (RegexErr != REGEX_ERROR_NONE) - LogError("Could not compile \"Clyde\" regex (err: %s)", sRegexErr); - - g_hReplaceConfigFile = CreateKeyValues("AutoReplace"); - BuildPath(Path_SM, g_sReplacePath, sizeof(g_sReplacePath), "configs/custom-chatcolorsreplace.cfg"); - - if (FileToKeyValues(g_hReplaceConfigFile, g_sReplacePath)) - g_bGotReplaceFile = true; - - g_arrQueuedMessages = CreateArray(ByteCountToCells(1024)); - - g_hDataTimer = CreateTimer(0.333, Timer_DataProcessor, INVALID_HANDLE, TIMER_REPEAT); - - g_Cvar_HostIP = FindConVar("hostip"); - g_Cvar_HostPort = FindConVar("hostport"); - g_Cvar_HostName = FindConVar("hostname"); - - g_umSayText2 = GetUserMessageId("SayText2"); - - if (g_umSayText2 == INVALID_MESSAGE_ID) - SetFailState("This game doesn't support SayText2 user messages."); - - HookUserMessage(g_umSayText2, Hook_UserMessage, false); - - HookEvent("player_say", EventHook_PlayerSay, EventHookMode_Post); - - AddCommandListener(CommandListener_SmChat, "sm_chat"); - - RegConsoleCmd("sm_report", Command_Report); - - if (g_bLoadedLate) - { - for (int i = 1; i <= MaxClients; i++) - { - if (!IsClientAuthorized(i)) - continue; - - static char sAuthID32[32]; - - GetClientAuthId(i, AuthId_Steam2, sAuthID32, sizeof(sAuthID32)); - OnClientAuthorized(i, sAuthID32); - } - } -} - -public void OnPluginEnd() -{ - delete g_arrQueuedMessages; - delete g_hDataTimer; - - UnhookUserMessage(g_umSayText2, Hook_UserMessage, false); - UnhookEvent("player_say", EventHook_PlayerSay, EventHookMode_Post); -} - -public void OnClientPutInServer(int client) -{ - g_fReportCooldown[client] = 0.0; - - if (!g_bTimerDone) - return; - - int iClientCount = GetClientCount(false); - - if (iClientCount >= g_iPlayersAtPOST+10) - FormatStatusAndPOST(g_iPlayersAtPOST = iClientCount); -} - -public void OnClientAuthorized(int client, const char[] sAuthID32) -{ - if (IsFakeClient(client)) - return; - - char sAuthID64[32]; - - if (!Steam32IDtoSteam64ID(sAuthID32, sAuthID64, sizeof(sAuthID64))) - return; - - static char sRequest[256]; - - FormatEx(sRequest, sizeof(sRequest), "http://api.steampowered.com/ISteamUser/GetPlayerSummaries/v0002/?key=%s&steamids=%s&format=vdf", STEAM_API_KEY, sAuthID64); - - Handle hRequest = SteamWorks_CreateHTTPRequest(k_EHTTPMethodGET, sRequest); - - if (!hRequest || - !SteamWorks_SetHTTPRequestContextValue(hRequest, client) || - !SteamWorks_SetHTTPCallbacks(hRequest, OnTransferComplete) || - !SteamWorks_SendHTTPRequest(hRequest)) - { - delete hRequest; - } -} - -public void OnMapStart() -{ - g_bTimerDone = false; - CreateTimer(10.0, Timer_OnMapStart); -} - -public Action Timer_OnMapStart(Handle hThis) -{ - g_bTimerDone = true; - FormatStatusAndPOST(g_iPlayersAtPOST = GetClientCount(false)); -} - -public Action Timer_DataProcessor(Handle hThis) -{ - if (!g_bProcessingData) - return; - - if (g_iRatelimitRemaining == 0 && GetTime() < g_iRatelimitReset) - return; - - //PrintToServer("[Timer_DataProcessor] Array Length #1: %d", g_arrQueuedMessages.Length); - - char sContent[1024]; - g_arrQueuedMessages.GetString(0, sContent, sizeof(sContent)); - g_arrQueuedMessages.Erase(0); - - char sURL[128]; - g_arrQueuedMessages.GetString(0, sURL, sizeof(sURL)); - g_arrQueuedMessages.Erase(0); - - if (g_arrQueuedMessages.Length == 0) - g_bProcessingData = false; - - //PrintToServer("[Timer_DataProcessor] Array Length #2: %d", g_arrQueuedMessages.Length); - - //PrintToServer("%s | %s", sURL, sContent); - - Handle hRequest = SteamWorks_CreateHTTPRequest(k_EHTTPMethodPOST, sURL); - - JSONObject RequestJSON = view_as(json_load(sContent)); - - if (!hRequest || - !SteamWorks_SetHTTPRequestContextValue(hRequest, RequestJSON) || - !SteamWorks_SetHTTPCallbacks(hRequest, OnHTTPRequestCompleted) || - !SteamWorks_SetHTTPRequestRawPostBody(hRequest, "application/json", sContent, strlen(sContent)) || - !SteamWorks_SetHTTPRequestNetworkActivityTimeout(hRequest, 10) || - !SteamWorks_SendHTTPRequest(hRequest)) - { - LogError("Discord SteamWorks_CreateHTTPRequest failed."); - - delete RequestJSON; - delete hRequest; - - return; - } -} - -public void FormatStatusAndPOST(int iCurrentClients) -{ - char sFinal[512]; - char sCurrentMap[32]; - char sServerName[64]; - int iServerIP = g_Cvar_HostIP.IntValue; - int iServerPort = g_Cvar_HostPort.IntValue; - - GetCurrentMap(sCurrentMap, sizeof(sCurrentMap)); - g_Cvar_HostName.GetString(sServerName, sizeof(sServerName)); - - char sTitle[64]; - char sDescription[256]; - - strcopy(sTitle, sizeof(sTitle), sServerName); - Format(sDescription, sizeof(sDescription), "Current Map: **%s**\nCurrent Players: **%d/%d**\nQuick Join: **steam://connect/%d.%d.%d.%d:%d**", - sCurrentMap, iCurrentClients, MaxClients, iServerIP >>> 24 & 255, iServerIP >>> 16 & 255, iServerIP >>> 8 & 255, iServerIP & 255, iServerPort); - - JSONRootNode hJSONFinal = new JSONObject(); - JSONObject hEmbeds = new JSONObject(); - JSONArray arrEmbeds = new JSONArray(); - - (view_as(hJSONFinal)).SetString("username", "MapInfo"); - hEmbeds.SetInt("color", 0xFF0000); - hEmbeds.SetString("title", sTitle); - hEmbeds.SetString("description", sDescription); - arrEmbeds.Append(hEmbeds); - (view_as(hJSONFinal)).Set("embeds", arrEmbeds); - - //hJSONFinal.DumpToServer(); - - hJSONFinal.ToString(sFinal, sizeof(sFinal), 0); - - HTTPPostJSON(DISCORD_MAPWEBHOOK_URL, sFinal); - - delete hJSONFinal; -} - -public Action Hook_UserMessage(UserMsg msg_id, Handle bf, const players[], int playersNum, bool reliable, bool init) -{ - char sMessageName[32]; - char sMessageSender[64]; - int iAuthor = BfReadByte(bf); - bool bIsChat = view_as(BfReadByte(bf)); if (bIsChat) bIsChat=false; //fucking compiler shut the fuck up REEEEEE - BfReadString(bf, sMessageName, sizeof(sMessageName), false); - BfReadString(bf, sMessageSender, sizeof(sMessageSender), false); - - if (iAuthor <= 0 || iAuthor > MaxClients) - return; - - if (strlen(sMessageName) == 0 || strlen(sMessageSender) == 0) - return; - - if (strcmp(sMessageName, "#Cstrike_Name_Change") == 0) - return; - - if (sMessageName[13] == 'C' || sMessageName[13] == 'T' || sMessageName[13] == 'S') - g_bTeamChat = true; - else - g_bTeamChat = false; -} - -public void EventHook_PlayerSay(Event hThis, const char[] sName, bool bDontBroadcast) -{ - int iUserID = GetEventInt(hThis, "userid"); - int iClient = GetClientOfUserId(iUserID); - char sMessageText[192]; - - GetEventString(hThis, "text", sMessageText, sizeof(sMessageText)); - - //PrintToServer("[EventHook_PlayerSay] Fired for %N: %s", iClient, sMessageText); - - TrimString(sMessageText); - - if (strlen(sMessageText) == 0) - return; - - char sClientName[64]; - - GetClientName(iClient, sClientName, sizeof(sClientName)); - - if (g_bGotReplaceFile) - { - char sPart[192]; - char sBuff[192]; - int CurrentIndex = 0; - int NextIndex = 0; - - while(NextIndex != -1 && CurrentIndex < sizeof(sMessageText)) - { - NextIndex = BreakString(sMessageText[CurrentIndex], sPart, sizeof(sPart)); - - KvGetString(g_hReplaceConfigFile, sPart, sBuff, sizeof(sBuff), NULL_STRING); - - if(sBuff[0]) - { - ReplaceString(sMessageText[CurrentIndex], sizeof(sMessageText) - CurrentIndex, sPart, sBuff); - CurrentIndex += strlen(sBuff); - } - else - CurrentIndex += NextIndex; - } - } - - if (g_bTeamChat) - { - if (sMessageText[0] == '@') - return; - - char sMessageFinal[256]; - char sTeamName[32]; - - GetTeamName(GetClientTeam(iClient), sTeamName, sizeof(sTeamName)); - - if (sTeamName[0] == 'C') - Format(sMessageFinal, sizeof(sMessageFinal), "(Counter-Terrorist) %s", sMessageText); - else if (sTeamName[0] == 'T') - Format(sMessageFinal, sizeof(sMessageFinal), "(Terrorist) %s", sMessageText); - else - Format(sMessageFinal, sizeof(sMessageFinal), "(Spectator) %s", sMessageText); - - if (g_sAvatarURL[iClient][0] != '\0') - Discord_POST(DISCORD_LIVEWEBHOOK_URL, sMessageFinal, true, sClientName, true, g_sAvatarURL[iClient]); - else - Discord_POST(DISCORD_LIVEWEBHOOK_URL, sMessageFinal, true, sClientName); - - return; - } - - if (g_sAvatarURL[iClient][0] != '\0') - Discord_POST(DISCORD_LIVEWEBHOOK_URL, sMessageText, true, sClientName, true, g_sAvatarURL[iClient]); - else - Discord_POST(DISCORD_LIVEWEBHOOK_URL, sMessageText, true, sClientName); -} - -stock bool Steam32IDtoSteam64ID(const char[] sSteam32ID, char[] sSteam64ID, int Size) -{ - if (strlen(sSteam32ID) < 11 || strncmp(sSteam32ID[0], "STEAM_0:", 8) || strcmp(sSteam32ID, "STEAM_ID_PENDING") == 0) - { - sSteam64ID[0] = 0; - return false; - } - - int iUpper = 765611979; - int isSteam64ID = StringToInt(sSteam32ID[10]) * 2 + 60265728 + sSteam32ID[8] - 48; - - int iDiv = isSteam64ID / 100000000; - int iIdx = 9 - (iDiv ? (iDiv / 10 + 1) : 0); - iUpper += iDiv; - - IntToString(isSteam64ID, sSteam64ID[iIdx], Size - iIdx); - iIdx = sSteam64ID[9]; - IntToString(iUpper, sSteam64ID, Size); - sSteam64ID[9] = iIdx; - - return true; -} - -stock void Discord_MakeStringSafe(const char[] sOrigin, char[] sOut, int iOutSize) -{ - int iDataLen = strlen(sOrigin); - int iCurIndex; - - for (int i = 0; i < iDataLen && iCurIndex < iOutSize; i++) - { - if (sOrigin[i] < 0x20 && sOrigin[i] != 0x0) - { - //sOut[iCurIndex] = 0x20; - //iCurIndex++; - continue; - } - - switch (sOrigin[i]) - { - // case '"': - // { - // strcopy(sOut[iCurIndex], iOutSize, "\\u0022"); - // iCurIndex += 6; - - // continue; - // } - // case '\\': - // { - // strcopy(sOut[iCurIndex], iOutSize, "\\u005C"); - // iCurIndex += 6; - - // continue; - // } - case '@': - { - strcopy(sOut[iCurIndex], iOutSize, "@​"); //@ + zero-width space - iCurIndex += 4; - - continue; - } - case '`': - { - strcopy(sOut[iCurIndex], iOutSize, "\\`"); - iCurIndex += 2; - - continue; - } - case '_': - { - strcopy(sOut[iCurIndex], iOutSize, "\\_"); - iCurIndex += 2; - - continue; - } - case '~': - { - strcopy(sOut[iCurIndex], iOutSize, "\\~"); - iCurIndex += 2; - - continue; - } - default: - { - sOut[iCurIndex] = sOrigin[i]; - iCurIndex++; - } - } - } -} - -stock int OnTransferComplete(Handle hRequest, bool bFailure, bool bRequestSuccessful, EHTTPStatusCode eStatusCode, int client) -{ - if (bFailure || !bRequestSuccessful || eStatusCode != k_EHTTPStatusCode200OK) - { - if (eStatusCode != k_EHTTPStatusCode429TooManyRequests) - LogError("SteamAPI HTTP Response failed: %d", eStatusCode); - - delete hRequest; - return; - } - - int iBodyLength; - SteamWorks_GetHTTPResponseBodySize(hRequest, iBodyLength); - - char[] sData = new char[iBodyLength]; - SteamWorks_GetHTTPResponseBodyData(hRequest, sData, iBodyLength); - - delete hRequest; - - APIWebResponse(sData, client); -} - -stock void APIWebResponse(const char[] sData, int client) -{ - KeyValues kvResponse = new KeyValues("SteamAPIResponse"); - - if (!kvResponse.ImportFromString(sData, "SteamAPIResponse")) - { - LogError("kvResponse.ImportFromString(\"SteamAPIResponse\") in APIWebResponse failed."); - - delete kvResponse; - return; - } - - if (!kvResponse.JumpToKey("players")) - { - LogError("kvResponse.JumpToKey(\"players\") in APIWebResponse failed."); - - delete kvResponse; - return; - } - - if (!kvResponse.GotoFirstSubKey()) - { - LogError("kvResponse.GotoFirstSubKey() in APIWebResponse failed."); - - delete kvResponse; - return; - } - - kvResponse.GetString("avatarfull", g_sAvatarURL[client], sizeof(g_sAvatarURL[])); - - delete kvResponse; -} - -stock void HTTPPostJSON(const char[] sURL, const char[] sText) -{ - // if (g_iRatelimitRemaining > 0 && !g_bProcessingData && GetTime() < g_iRatelimitReset) - // { - Handle hRequest = SteamWorks_CreateHTTPRequest(k_EHTTPMethodPOST, sURL); - - JSONObject RequestJSON = view_as(json_load(sText)); - - if (!hRequest || - !SteamWorks_SetHTTPRequestContextValue(hRequest, RequestJSON) || - !SteamWorks_SetHTTPCallbacks(hRequest, OnHTTPRequestCompleted) || - !SteamWorks_SetHTTPRequestRawPostBody(hRequest, "application/json", sText, strlen(sText)) || - !SteamWorks_SetHTTPRequestNetworkActivityTimeout(hRequest, 15) || - !SteamWorks_SendHTTPRequest(hRequest)) - { - LogError("Discord SteamWorks_CreateHTTPRequest failed."); - - delete RequestJSON; - delete hRequest; - - return; - } - // } - // else - // { - // g_arrQueuedMessages.PushString(sText); - // g_arrQueuedMessages.PushString(sURL); - // g_bProcessingData = true; - // } - - //delete hRequest; -} - -stock void Discord_POST(const char[] sURL, char[] sText, bool bUsingUsername=false, char[] sUsername=NULL_STRING, bool bUsingAvatar=false, char[] sAvatarURL=NULL_STRING, bool bSafe=true, bool bTimestamp=true) -{ - //PrintToServer("[Discord_POST] Called with text: %s", sText); - - if (bTimestamp) - { - int iTime = GetTime(); - char sTime[32]; - FormatTime(sTime, sizeof(sTime), "%r", iTime); - Format(sText, 2048, "[%s] %s", sTime, sText); - } - - JSONRootNode hJSONRoot = new JSONObject(); - char sSafeText[4096]; - char sFinal[4096]; - - if (bUsingUsername) - { - TrimString(sUsername); - - if (g_Regex_Clyde.Match(sUsername) > 0 || strlen(sUsername) < 2) - (view_as(hJSONRoot)).SetString("username", "Invalid Name"); - else - (view_as(hJSONRoot)).SetString("username", sUsername); - } - - if (bUsingAvatar) - (view_as(hJSONRoot)).SetString("avatar_url", sAvatarURL); - - if (bSafe) - { - Discord_MakeStringSafe(sText, sSafeText, sizeof(sSafeText)); - } - else - { - Format(sSafeText, sizeof(sSafeText), "%s", sText); - } - - (view_as(hJSONRoot)).SetString("content", sSafeText); - (view_as(hJSONRoot)).ToString(sFinal, sizeof(sFinal), 0); - - //hJSONRoot.DumpToServer(); - - delete hJSONRoot; - - if ((g_iRatelimitRemaining > 0 || GetTime() >= g_iRatelimitReset) && !g_bProcessingData) - { - //PrintToServer("[Discord_POST] Have allowances and not processing data"); - - Handle hRequest = SteamWorks_CreateHTTPRequest(k_EHTTPMethodPOST, sURL); - - JSONObject RequestJSON = view_as(json_load(sFinal)); - - if (!hRequest || - !SteamWorks_SetHTTPRequestContextValue(hRequest, RequestJSON) || - !SteamWorks_SetHTTPCallbacks(hRequest, OnHTTPRequestCompleted) || - !SteamWorks_SetHTTPRequestRawPostBody(hRequest, "application/json", sFinal, strlen(sFinal)) || - !SteamWorks_SetHTTPRequestNetworkActivityTimeout(hRequest, 10) || - !SteamWorks_SendHTTPRequest(hRequest)) - { - LogError("Discord SteamWorks_CreateHTTPRequest failed."); - - delete RequestJSON; - delete hRequest; - - return; - } - } - else - { - //PrintToServer("[Discord_POST] Have allowances? [%s] | Is processing data? [%s]", g_iRatelimitRemaining > 0 ? "YES":"NO", g_bProcessingData?"YES":"NO"); - g_arrQueuedMessages.PushString(sFinal); - g_arrQueuedMessages.PushString(sURL); - g_bProcessingData = true; - } - - //delete hRequest; //nonono -} - -public int OnHTTPRequestCompleted(Handle hRequest, bool bFailure, bool bRequestSuccessful, EHTTPStatusCode eStatusCode, JSONObject RequestJSON) -{ - if (bFailure || !bRequestSuccessful || (eStatusCode != k_EHTTPStatusCode200OK && eStatusCode != k_EHTTPStatusCode204NoContent)) - { - LogError("Discord HTTP request failed: %d", eStatusCode); - - if (eStatusCode == k_EHTTPStatusCode400BadRequest) - { - char sData[2048]; - - (view_as(RequestJSON)).ToString(sData, sizeof(sData), 0); - - LogError("Malformed request? Dumping request data:\n%s", sData); - } - else if (eStatusCode == k_EHTTPStatusCode429TooManyRequests) - { - g_iRatelimitRemaining = 0; - g_iRatelimitReset = GetTime() + 5; - } - - delete RequestJSON; - delete hRequest; - - return; - } - - static int iLastRatelimitRemaining = 0; - static int iLastRatelimitReset = 0; - char sTmp[32]; - bool bHeaderExists = SteamWorks_GetHTTPResponseHeaderValue(hRequest, "x-ratelimit-remaining", sTmp, sizeof(sTmp)); - - if (!bHeaderExists) - LogError("x-ratelimit-remaining header value could not be retrieved"); - - int iRatelimitRemaining = StringToInt(sTmp); - - bHeaderExists = SteamWorks_GetHTTPResponseHeaderValue(hRequest, "x-ratelimit-reset", sTmp, sizeof(sTmp)); - - if (!bHeaderExists) - LogError("x-ratelimit-reset header value could not be retrieved"); - - int iRatelimitReset = StringToInt(sTmp); - - if (iRatelimitRemaining < iLastRatelimitRemaining || iRatelimitReset >= iLastRatelimitReset) //don't be fooled by different completion times - { - g_iRatelimitRemaining = iRatelimitRemaining; - g_iRatelimitReset = iRatelimitReset; - } - - //PrintToServer("limit: %d | remaining: %d || reset %d - now %d", g_iRatelimitLimit, g_iRatelimitRemaining, g_iRatelimitReset, GetTime()); - - delete RequestJSON; - delete hRequest; -} - -stock bool IsValidClient(int client) -{ - return (client > 0 && client <= MaxClients && IsClientInGame(client)); -} - -public Action CommandListener_SmChat(int client, const char[] sCommand, int argc) -{ - if (client <= 0) - return Plugin_Continue; - - char sText[256]; - char sUsername[32]; - - GetCmdArgString(sText, sizeof(sText)); - GetClientName(client, sUsername, sizeof(sUsername)); - - if (g_sAvatarURL[client][0] != '\0') - Discord_POST(DISCORD_ADMINCHAT_WEBHOOKURL, sText, true, sUsername, true, g_sAvatarURL[client]); - else - Discord_POST(DISCORD_ADMINCHAT_WEBHOOKURL, sText, true, sUsername); - - return Plugin_Continue; -} - -public Action OnClientSayCommand(int client, const char[] sCommand, const char[] sArgs) -{ - if (client <= 0 || !IsClientInGame(client) || BaseComm_IsClientGagged(client)) - return Plugin_Continue; - - char sFinal[256]; - char sUsername[MAX_NAME_LENGTH]; - - GetClientName(client, sUsername, sizeof(sUsername)); - - if (strcmp(sCommand, "say_team") == 0) - { - if (sArgs[0] == '@') - { - bool bAdmin = CheckCommandAccess(client, "", ADMFLAG_GENERIC, true); - Format(sFinal, sizeof(sFinal), "%s%s", bAdmin ? "" : "To Admins: ", sArgs[1]); - if (g_sAvatarURL[client][0] != '\0') - Discord_POST(DISCORD_ADMINCHAT_WEBHOOKURL, sFinal, true, sUsername, true, g_sAvatarURL[client]); - else - Discord_POST(DISCORD_ADMINCHAT_WEBHOOKURL, sFinal, true, sUsername); - - if (!bAdmin) - { - //g_iReplyTargetSerial = GetClientSerial(client); - //g_iReplyType = REPLYTYPE_CHAT; - } - - return Plugin_Continue; - } - - char sTeamName[32]; - - GetTeamName(GetClientTeam(client), sTeamName, sizeof(sTeamName)); - Format(sFinal, sizeof(sFinal), "(%s) ", sTeamName); - } - - return Plugin_Continue; -} - -public Action OnLogAction(Handle hSource, Identity ident, int client, int target, const char[] sMsg) -{ - if (client <= 0) - return; - - if ((StrContains(sMsg, "sm_psay", false)!= -1) || (StrContains(sMsg, "sm_chat", false)!= -1)) - return;// dont log sm_psay and sm_chat - - char sFinal[256]; - char sCurrentMap[32]; - char sClientName[64]; - - GetCurrentMap(sCurrentMap, sizeof(sCurrentMap)); - Format(sFinal, sizeof(sFinal), "[ %s ]```%s```", sCurrentMap, sMsg); - - GetClientName(client, sClientName, sizeof(sClientName)); - - if (g_sAvatarURL[client][0] != '\0') - Discord_POST(DISCORD_ADMINLOGS_WEBHOOKURL, sFinal, true, sClientName, true, g_sAvatarURL[client], false); - else - Discord_POST(DISCORD_ADMINLOGS_WEBHOOKURL, sFinal, true, sClientName, false, "", false); - - return; -} - - -public void AntiBhopCheat_OnClientDetected(int client, char[] sReason, char[] sStats) -{ - char sUsername[MAX_NAME_LENGTH]; - GetClientName(client, sUsername, sizeof(sUsername)); - - char currentMap[64]; - GetCurrentMap(currentMap, sizeof(currentMap)); - - char sMessage[4096]; - Format(sMessage, sizeof(sMessage), "```%s - Tick: %d``````%s\n%s```", currentMap, GetGameTickCount(), sReason, sStats); - - if (g_sAvatarURL[client][0] != '\0') - Discord_POST(DISCORD_ANTIBHOPCHEAT_WEBHOOKURL, sMessage, true, sUsername, true, g_sAvatarURL[client], false); - else - Discord_POST(DISCORD_ANTIBHOPCHEAT_WEBHOOKURL, sMessage, true, sUsername, false, "", false); -} - -public int entWatch_OnClientBanned(int admin, int iLenght, int client) -{ - char sUsername[MAX_NAME_LENGTH]; - GetClientName(client, sUsername, sizeof(sUsername)); - - char currentMap[64]; - GetCurrentMap(currentMap, sizeof(currentMap)); - - char sMessageTmp[4096]; - - if (iLenght == 0) - { - Format(sMessageTmp, sizeof(sMessageTmp), "%L got temporarily restricted by %L", client, admin); - } - else if (iLenght == -1) - { - Format(sMessageTmp, sizeof(sMessageTmp), "%L got PERMANENTLY restricted by %L", client, admin); - } - else - { - Format(sMessageTmp, sizeof(sMessageTmp), "%L got restricted by %L for %d minutes", client, admin, iLenght); - } - - - char sMessage[4096]; - Format(sMessage, sizeof(sMessage), "```%s - Tick: %d``````%s```", currentMap, GetGameTickCount(), sMessageTmp); - - if (g_sAvatarURL[client][0] != '\0') - Discord_POST(DISCORD_ENTWATCH_WEBHOOKURL, sMessage, true, sUsername, true, g_sAvatarURL[client], false); - else - Discord_POST(DISCORD_ENTWATCH_WEBHOOKURL, sMessage, true, sUsername, false, "", false); -} - -public int entWatch_OnClientUnbanned(int admin, int client) -{ - char sUsername[MAX_NAME_LENGTH]; - GetClientName(client, sUsername, sizeof(sUsername)); - - char currentMap[64]; - GetCurrentMap(currentMap, sizeof(currentMap)); - - char sMessageTmp[4096]; - Format(sMessageTmp, sizeof(sMessageTmp), "%L got unrestricted by %L", client, admin); - - char sMessage[4096]; - Format(sMessage, sizeof(sMessage), "```%s - Tick: %d``````%s```", currentMap, GetGameTickCount(), sMessageTmp); - - if (g_sAvatarURL[client][0] != '\0') - Discord_POST(DISCORD_ENTWATCH_WEBHOOKURL, sMessage, true, sUsername, true, g_sAvatarURL[client], false); - else - Discord_POST(DISCORD_ENTWATCH_WEBHOOKURL, sMessage, true, sUsername, false, "", false); -} - -public Action Command_Report(int client, int argc) -{ - if (BaseComm_IsClientGagged(client)) - return Plugin_Handled; - - if (argc < 2) - { - ReplyToCommand(client, "[SM] Usage: sm_report "); - return Plugin_Handled; - } - - if (g_fReportCooldown[client] > GetGameTime()) - { - ReplyToCommand(client, "[SM] Please wait another %d seconds before sending another report.", RoundToNearest(g_fReportCooldown[client] - GetGameTime())); - return Plugin_Handled; - } - - int iTarget; - char sTarget[32]; - - GetCmdArg(1, sTarget, sizeof(sTarget)); - - if ((iTarget = FindTarget(client, sTarget, true, false)) <= 0) - return Plugin_Handled; - - char sFormatted[4096]; - char sReportText[128]; - char sClientAuthID32[32]; - char sTargetAuthID32[32]; - char sCurrentMap[32]; - int iClientUID = GetClientUserId(client); - int iTargetUID = GetClientUserId(iTarget); - - GetCmdArgString(sReportText, sizeof(sReportText)); - Format(sReportText, sizeof(sReportText) - strlen(sTarget) + 1, sReportText[strlen(sTarget) + 1]); - - if (sReportText[0] == '"') - StripQuotes(sReportText); - - GetClientAuthId(client, AuthId_Steam3, sClientAuthID32, sizeof(sClientAuthID32)); - GetClientAuthId(iTarget, AuthId_Steam3, sTargetAuthID32, sizeof(sTargetAuthID32)); - - GetCurrentMap(sCurrentMap, sizeof(sCurrentMap)); - - Format(sFormatted, sizeof(sFormatted), - "@here\n```%s - Tick: %d``````Reporter: %N (#%d)\nTarget: %N (#%d)\nReason: %s\n```", - sCurrentMap, GetGameTickCount(), client, iClientUID, iTarget, iTargetUID, sReportText); - - char sUsername[MAX_NAME_LENGTH]; - GetClientName(client, sUsername, sizeof(sUsername)); - - if (g_sAvatarURL[client][0] != '\0') - Discord_POST(DISCORD_REPORT_WEBHOOKURL, sFormatted, true, sUsername, true, g_sAvatarURL[client], false); - else - Discord_POST(DISCORD_REPORT_WEBHOOKURL, sFormatted, true, sUsername, false, "", false); - - Format(sFormatted, sizeof(sFormatted), "#%d \"%N\" reported #%d \"%N\" for:\n\x04[Reports]\x01 %s", iClientUID, client, iTargetUID, iTarget, sReportText); - - for (int i = 1; i <= MaxClients; i++) - { - if (!IsClientInGame(i) || !IsClientAuthorized(i)) - continue; - - if (!CheckCommandAccess(i, "", ADMFLAG_GENERIC, true)) - continue; - - PrintToChat(i, "\x01\x04[Reports]\x01 %s", sFormatted); - } - - g_fReportCooldown[client] = GetGameTime() + 30.0; - - ReplyToCommand(client, "\x01\x04[Reports]\x01 Your report was successfully submitted!"); - - return Plugin_Handled; -} +#pragma semicolon 1 + +#include +#include +#include +#include +#include +#include "sdktools_functions.inc" + +#include +#include + +#pragma newdecls required + +#include "SteamAPI.secret" // #define STEAM_API_KEY "" +#include "Discord.secret" // #define DISCORD_* + +Regex g_Regex_Clyde = null; + +ConVar g_Cvar_HostIP = null; +ConVar g_Cvar_HostPort = null; +ConVar g_Cvar_HostName = null; + +ArrayList g_arrQueuedMessages = null; + +Handle g_hDataTimer = null; +Handle g_hReplaceConfigFile = null; + +UserMsg g_umSayText2 = INVALID_MESSAGE_ID; + +bool g_bLoadedLate; +bool g_bTimerDone; +bool g_bProcessingData; +bool g_bGotReplaceFile; +bool g_bTeamChat; + +char g_sReplacePath[PLATFORM_MAX_PATH]; +char g_sAvatarURL[MAXPLAYERS + 1][128]; + +int g_iPlayersAtPOST = 0; +int g_iRatelimitRemaining = 5; +int g_iRatelimitReset; + +float g_fReportCooldown[MAXPLAYERS + 1]; + +public Plugin myinfo = +{ + name = "Discord core", + author = "Obus", + description = "Implements live chat and map reporting for Discord.", + version = "1.1.0", + url = "" +} + +public APLRes AskPluginLoad2(Handle hThis, bool bLate, char[] sError, int err_max) +{ + g_bLoadedLate = bLate; + + return APLRes_Success; +} + +public void OnPluginStart() +{ + char sRegexErr[32]; + RegexError RegexErr; + + g_Regex_Clyde = CompileRegex(".*(clyde).*", PCRE_CASELESS, sRegexErr, sizeof(sRegexErr), RegexErr); + + if (RegexErr != REGEX_ERROR_NONE) + LogError("Could not compile \"Clyde\" regex (err: %s)", sRegexErr); + + g_hReplaceConfigFile = CreateKeyValues("AutoReplace"); + BuildPath(Path_SM, g_sReplacePath, sizeof(g_sReplacePath), "configs/custom-chatcolorsreplace.cfg"); + + if (FileToKeyValues(g_hReplaceConfigFile, g_sReplacePath)) + g_bGotReplaceFile = true; + + g_arrQueuedMessages = CreateArray(ByteCountToCells(1024)); + + g_hDataTimer = CreateTimer(0.333, Timer_DataProcessor, INVALID_HANDLE, TIMER_REPEAT); + + g_Cvar_HostIP = FindConVar("hostip"); + g_Cvar_HostPort = FindConVar("hostport"); + g_Cvar_HostName = FindConVar("hostname"); + + g_umSayText2 = GetUserMessageId("SayText2"); + + if (g_umSayText2 == INVALID_MESSAGE_ID) + SetFailState("This game doesn't support SayText2 user messages."); + + HookUserMessage(g_umSayText2, Hook_UserMessage, false); + + HookEvent("player_say", EventHook_PlayerSay, EventHookMode_Post); + + AddCommandListener(CommandListener_SmChat, "sm_chat"); + + RegConsoleCmd("sm_report", Command_Report); + + if (g_bLoadedLate) + { + for (int i = 1; i <= MaxClients; i++) + { + if (!IsClientAuthorized(i)) + continue; + + static char sAuthID32[32]; + + GetClientAuthId(i, AuthId_Steam2, sAuthID32, sizeof(sAuthID32)); + OnClientAuthorized(i, sAuthID32); + } + } +} + +public void OnPluginEnd() +{ + delete g_arrQueuedMessages; + delete g_hDataTimer; + + UnhookUserMessage(g_umSayText2, Hook_UserMessage, false); + UnhookEvent("player_say", EventHook_PlayerSay, EventHookMode_Post); +} + +public void OnClientPutInServer(int client) +{ + g_fReportCooldown[client] = 0.0; + + if (!g_bTimerDone) + return; + + int iClientCount = GetClientCount(false); + + if (iClientCount >= g_iPlayersAtPOST+10) + FormatStatusAndPOST(g_iPlayersAtPOST = iClientCount); +} + +public void OnClientAuthorized(int client, const char[] sAuthID32) +{ + if (IsFakeClient(client)) + return; + + char sAuthID64[32]; + + if (!Steam32IDtoSteam64ID(sAuthID32, sAuthID64, sizeof(sAuthID64))) + return; + + static char sRequest[256]; + + FormatEx(sRequest, sizeof(sRequest), "http://api.steampowered.com/ISteamUser/GetPlayerSummaries/v0002/?key=%s&steamids=%s&format=vdf", STEAM_API_KEY, sAuthID64); + + Handle hRequest = SteamWorks_CreateHTTPRequest(k_EHTTPMethodGET, sRequest); + + if (!hRequest || + !SteamWorks_SetHTTPRequestContextValue(hRequest, client) || + !SteamWorks_SetHTTPCallbacks(hRequest, OnTransferComplete) || + !SteamWorks_SendHTTPRequest(hRequest)) + { + delete hRequest; + } +} + +public void OnMapStart() +{ + g_bTimerDone = false; + CreateTimer(10.0, Timer_OnMapStart); +} + +public Action Timer_OnMapStart(Handle hThis) +{ + g_bTimerDone = true; + FormatStatusAndPOST(g_iPlayersAtPOST = GetClientCount(false)); +} + +public Action Timer_DataProcessor(Handle hThis) +{ + if (!g_bProcessingData) + return; + + if (g_iRatelimitRemaining == 0 && GetTime() < g_iRatelimitReset) + return; + + //PrintToServer("[Timer_DataProcessor] Array Length #1: %d", g_arrQueuedMessages.Length); + + char sContent[1024]; + g_arrQueuedMessages.GetString(0, sContent, sizeof(sContent)); + g_arrQueuedMessages.Erase(0); + + char sURL[128]; + g_arrQueuedMessages.GetString(0, sURL, sizeof(sURL)); + g_arrQueuedMessages.Erase(0); + + if (g_arrQueuedMessages.Length == 0) + g_bProcessingData = false; + + //PrintToServer("[Timer_DataProcessor] Array Length #2: %d", g_arrQueuedMessages.Length); + + //PrintToServer("%s | %s", sURL, sContent); + + Handle hRequest = SteamWorks_CreateHTTPRequest(k_EHTTPMethodPOST, sURL); + + JSONObject RequestJSON = view_as(json_load(sContent)); + + if (!hRequest || + !SteamWorks_SetHTTPRequestContextValue(hRequest, RequestJSON) || + !SteamWorks_SetHTTPCallbacks(hRequest, OnHTTPRequestCompleted) || + !SteamWorks_SetHTTPRequestRawPostBody(hRequest, "application/json", sContent, strlen(sContent)) || + !SteamWorks_SetHTTPRequestNetworkActivityTimeout(hRequest, 10) || + !SteamWorks_SendHTTPRequest(hRequest)) + { + LogError("Discord SteamWorks_CreateHTTPRequest failed."); + + delete RequestJSON; + delete hRequest; + + return; + } +} + +public void FormatStatusAndPOST(int iCurrentClients) +{ + char sFinal[512]; + char sCurrentMap[32]; + char sServerName[64]; + int iServerIP = g_Cvar_HostIP.IntValue; + int iServerPort = g_Cvar_HostPort.IntValue; + + GetCurrentMap(sCurrentMap, sizeof(sCurrentMap)); + g_Cvar_HostName.GetString(sServerName, sizeof(sServerName)); + + char sTitle[64]; + char sDescription[256]; + + strcopy(sTitle, sizeof(sTitle), sServerName); + Format(sDescription, sizeof(sDescription), "Current Map: **%s**\nCurrent Players: **%d/%d**\nQuick Join: **steam://connect/%d.%d.%d.%d:%d**", + sCurrentMap, iCurrentClients, MaxClients, iServerIP >>> 24 & 255, iServerIP >>> 16 & 255, iServerIP >>> 8 & 255, iServerIP & 255, iServerPort); + + JSONRootNode hJSONFinal = new JSONObject(); + JSONObject hEmbeds = new JSONObject(); + JSONArray arrEmbeds = new JSONArray(); + + (view_as(hJSONFinal)).SetString("username", "MapInfo"); + hEmbeds.SetInt("color", 0xFF0000); + hEmbeds.SetString("title", sTitle); + hEmbeds.SetString("description", sDescription); + arrEmbeds.Append(hEmbeds); + (view_as(hJSONFinal)).Set("embeds", arrEmbeds); + + //hJSONFinal.DumpToServer(); + + hJSONFinal.ToString(sFinal, sizeof(sFinal), 0); + + HTTPPostJSON(DISCORD_MAPWEBHOOK_URL, sFinal); + + delete hJSONFinal; +} + +public Action Hook_UserMessage(UserMsg msg_id, Handle bf, const players[], int playersNum, bool reliable, bool init) +{ + char sMessageName[32]; + char sMessageSender[64]; + int iAuthor = BfReadByte(bf); + bool bIsChat = view_as(BfReadByte(bf)); if (bIsChat) bIsChat=false; //fucking compiler shut the fuck up REEEEEE + BfReadString(bf, sMessageName, sizeof(sMessageName), false); + BfReadString(bf, sMessageSender, sizeof(sMessageSender), false); + + if (iAuthor <= 0 || iAuthor > MaxClients) + return; + + if (strlen(sMessageName) == 0 || strlen(sMessageSender) == 0) + return; + + if (strcmp(sMessageName, "#Cstrike_Name_Change") == 0) + return; + + if (sMessageName[13] == 'C' || sMessageName[13] == 'T' || sMessageName[13] == 'S') + g_bTeamChat = true; + else + g_bTeamChat = false; +} + +public void EventHook_PlayerSay(Event hThis, const char[] sName, bool bDontBroadcast) +{ + int iUserID = GetEventInt(hThis, "userid"); + int iClient = GetClientOfUserId(iUserID); + char sMessageText[192]; + + GetEventString(hThis, "text", sMessageText, sizeof(sMessageText)); + + //PrintToServer("[EventHook_PlayerSay] Fired for %N: %s", iClient, sMessageText); + + TrimString(sMessageText); + + if (strlen(sMessageText) == 0) + return; + + char sClientName[64]; + + GetClientName(iClient, sClientName, sizeof(sClientName)); + + if (g_bGotReplaceFile) + { + char sPart[192]; + char sBuff[192]; + int CurrentIndex = 0; + int NextIndex = 0; + + while(NextIndex != -1 && CurrentIndex < sizeof(sMessageText)) + { + NextIndex = BreakString(sMessageText[CurrentIndex], sPart, sizeof(sPart)); + + KvGetString(g_hReplaceConfigFile, sPart, sBuff, sizeof(sBuff), NULL_STRING); + + if(sBuff[0]) + { + ReplaceString(sMessageText[CurrentIndex], sizeof(sMessageText) - CurrentIndex, sPart, sBuff); + CurrentIndex += strlen(sBuff); + } + else + CurrentIndex += NextIndex; + } + } + + if (g_bTeamChat) + { + if (sMessageText[0] == '@') + return; + + char sMessageFinal[256]; + char sTeamName[32]; + + GetTeamName(GetClientTeam(iClient), sTeamName, sizeof(sTeamName)); + + if (sTeamName[0] == 'C') + Format(sMessageFinal, sizeof(sMessageFinal), "(Counter-Terrorist) %s", sMessageText); + else if (sTeamName[0] == 'T') + Format(sMessageFinal, sizeof(sMessageFinal), "(Terrorist) %s", sMessageText); + else + Format(sMessageFinal, sizeof(sMessageFinal), "(Spectator) %s", sMessageText); + + if (g_sAvatarURL[iClient][0] != '\0') + Discord_POST(DISCORD_LIVEWEBHOOK_URL, sMessageFinal, true, sClientName, true, g_sAvatarURL[iClient]); + else + Discord_POST(DISCORD_LIVEWEBHOOK_URL, sMessageFinal, true, sClientName); + + return; + } + + if (g_sAvatarURL[iClient][0] != '\0') + Discord_POST(DISCORD_LIVEWEBHOOK_URL, sMessageText, true, sClientName, true, g_sAvatarURL[iClient]); + else + Discord_POST(DISCORD_LIVEWEBHOOK_URL, sMessageText, true, sClientName); +} + +stock bool Steam32IDtoSteam64ID(const char[] sSteam32ID, char[] sSteam64ID, int Size) +{ + if (strlen(sSteam32ID) < 11 || strncmp(sSteam32ID[0], "STEAM_0:", 8) || strcmp(sSteam32ID, "STEAM_ID_PENDING") == 0) + { + sSteam64ID[0] = 0; + return false; + } + + int iUpper = 765611979; + int isSteam64ID = StringToInt(sSteam32ID[10]) * 2 + 60265728 + sSteam32ID[8] - 48; + + int iDiv = isSteam64ID / 100000000; + int iIdx = 9 - (iDiv ? (iDiv / 10 + 1) : 0); + iUpper += iDiv; + + IntToString(isSteam64ID, sSteam64ID[iIdx], Size - iIdx); + iIdx = sSteam64ID[9]; + IntToString(iUpper, sSteam64ID, Size); + sSteam64ID[9] = iIdx; + + return true; +} + +stock void Discord_MakeStringSafe(const char[] sOrigin, char[] sOut, int iOutSize) +{ + int iDataLen = strlen(sOrigin); + int iCurIndex; + + for (int i = 0; i < iDataLen && iCurIndex < iOutSize; i++) + { + if (sOrigin[i] < 0x20 && sOrigin[i] != 0x0) + { + //sOut[iCurIndex] = 0x20; + //iCurIndex++; + continue; + } + + switch (sOrigin[i]) + { + // case '"': + // { + // strcopy(sOut[iCurIndex], iOutSize, "\\u0022"); + // iCurIndex += 6; + + // continue; + // } + // case '\\': + // { + // strcopy(sOut[iCurIndex], iOutSize, "\\u005C"); + // iCurIndex += 6; + + // continue; + // } + case '@': + { + strcopy(sOut[iCurIndex], iOutSize, "@​"); //@ + zero-width space + iCurIndex += 4; + + continue; + } + case '`': + { + strcopy(sOut[iCurIndex], iOutSize, "\\`"); + iCurIndex += 2; + + continue; + } + case '_': + { + strcopy(sOut[iCurIndex], iOutSize, "\\_"); + iCurIndex += 2; + + continue; + } + case '~': + { + strcopy(sOut[iCurIndex], iOutSize, "\\~"); + iCurIndex += 2; + + continue; + } + default: + { + sOut[iCurIndex] = sOrigin[i]; + iCurIndex++; + } + } + } +} + +stock int OnTransferComplete(Handle hRequest, bool bFailure, bool bRequestSuccessful, EHTTPStatusCode eStatusCode, int client) +{ + if (bFailure || !bRequestSuccessful || eStatusCode != k_EHTTPStatusCode200OK) + { + if (eStatusCode != k_EHTTPStatusCode429TooManyRequests) + LogError("SteamAPI HTTP Response failed: %d", eStatusCode); + + delete hRequest; + return; + } + + int iBodyLength; + SteamWorks_GetHTTPResponseBodySize(hRequest, iBodyLength); + + char[] sData = new char[iBodyLength]; + SteamWorks_GetHTTPResponseBodyData(hRequest, sData, iBodyLength); + + delete hRequest; + + APIWebResponse(sData, client); +} + +stock void APIWebResponse(const char[] sData, int client) +{ + KeyValues kvResponse = new KeyValues("SteamAPIResponse"); + + if (!kvResponse.ImportFromString(sData, "SteamAPIResponse")) + { + LogError("kvResponse.ImportFromString(\"SteamAPIResponse\") in APIWebResponse failed."); + + delete kvResponse; + return; + } + + if (!kvResponse.JumpToKey("players")) + { + LogError("kvResponse.JumpToKey(\"players\") in APIWebResponse failed."); + + delete kvResponse; + return; + } + + if (!kvResponse.GotoFirstSubKey()) + { + LogError("kvResponse.GotoFirstSubKey() in APIWebResponse failed."); + + delete kvResponse; + return; + } + + kvResponse.GetString("avatarfull", g_sAvatarURL[client], sizeof(g_sAvatarURL[])); + + delete kvResponse; +} + +stock void HTTPPostJSON(const char[] sURL, const char[] sText) +{ + // if (g_iRatelimitRemaining > 0 && !g_bProcessingData && GetTime() < g_iRatelimitReset) + // { + Handle hRequest = SteamWorks_CreateHTTPRequest(k_EHTTPMethodPOST, sURL); + + JSONObject RequestJSON = view_as(json_load(sText)); + + if (!hRequest || + !SteamWorks_SetHTTPRequestContextValue(hRequest, RequestJSON) || + !SteamWorks_SetHTTPCallbacks(hRequest, OnHTTPRequestCompleted) || + !SteamWorks_SetHTTPRequestRawPostBody(hRequest, "application/json", sText, strlen(sText)) || + !SteamWorks_SetHTTPRequestNetworkActivityTimeout(hRequest, 15) || + !SteamWorks_SendHTTPRequest(hRequest)) + { + LogError("Discord SteamWorks_CreateHTTPRequest failed."); + + delete RequestJSON; + delete hRequest; + + return; + } + // } + // else + // { + // g_arrQueuedMessages.PushString(sText); + // g_arrQueuedMessages.PushString(sURL); + // g_bProcessingData = true; + // } + + //delete hRequest; +} + +stock void Discord_POST(const char[] sURL, char[] sText, bool bUsingUsername=false, char[] sUsername=NULL_STRING, bool bUsingAvatar=false, char[] sAvatarURL=NULL_STRING, bool bSafe=true, bool bTimestamp=true) +{ + //PrintToServer("[Discord_POST] Called with text: %s", sText); + + if (bTimestamp) + { + int iTime = GetTime(); + char sTime[32]; + FormatTime(sTime, sizeof(sTime), "%r", iTime); + Format(sText, 2048, "[%s] %s", sTime, sText); + } + + JSONRootNode hJSONRoot = new JSONObject(); + char sSafeText[4096]; + char sFinal[4096]; + + if (bUsingUsername) + { + TrimString(sUsername); + + if (g_Regex_Clyde.Match(sUsername) > 0 || strlen(sUsername) < 2) + (view_as(hJSONRoot)).SetString("username", "Invalid Name"); + else + (view_as(hJSONRoot)).SetString("username", sUsername); + } + + if (bUsingAvatar) + (view_as(hJSONRoot)).SetString("avatar_url", sAvatarURL); + + if (bSafe) + { + Discord_MakeStringSafe(sText, sSafeText, sizeof(sSafeText)); + } + else + { + Format(sSafeText, sizeof(sSafeText), "%s", sText); + } + + (view_as(hJSONRoot)).SetString("content", sSafeText); + (view_as(hJSONRoot)).ToString(sFinal, sizeof(sFinal), 0); + + //hJSONRoot.DumpToServer(); + + delete hJSONRoot; + + if ((g_iRatelimitRemaining > 0 || GetTime() >= g_iRatelimitReset) && !g_bProcessingData) + { + //PrintToServer("[Discord_POST] Have allowances and not processing data"); + + Handle hRequest = SteamWorks_CreateHTTPRequest(k_EHTTPMethodPOST, sURL); + + JSONObject RequestJSON = view_as(json_load(sFinal)); + + if (!hRequest || + !SteamWorks_SetHTTPRequestContextValue(hRequest, RequestJSON) || + !SteamWorks_SetHTTPCallbacks(hRequest, OnHTTPRequestCompleted) || + !SteamWorks_SetHTTPRequestRawPostBody(hRequest, "application/json", sFinal, strlen(sFinal)) || + !SteamWorks_SetHTTPRequestNetworkActivityTimeout(hRequest, 10) || + !SteamWorks_SendHTTPRequest(hRequest)) + { + LogError("Discord SteamWorks_CreateHTTPRequest failed."); + + delete RequestJSON; + delete hRequest; + + return; + } + } + else + { + //PrintToServer("[Discord_POST] Have allowances? [%s] | Is processing data? [%s]", g_iRatelimitRemaining > 0 ? "YES":"NO", g_bProcessingData?"YES":"NO"); + g_arrQueuedMessages.PushString(sFinal); + g_arrQueuedMessages.PushString(sURL); + g_bProcessingData = true; + } + + //delete hRequest; //nonono +} + +public int OnHTTPRequestCompleted(Handle hRequest, bool bFailure, bool bRequestSuccessful, EHTTPStatusCode eStatusCode, JSONObject RequestJSON) +{ + if (bFailure || !bRequestSuccessful || (eStatusCode != k_EHTTPStatusCode200OK && eStatusCode != k_EHTTPStatusCode204NoContent)) + { + LogError("Discord HTTP request failed: %d", eStatusCode); + + if (eStatusCode == k_EHTTPStatusCode400BadRequest) + { + char sData[2048]; + + (view_as(RequestJSON)).ToString(sData, sizeof(sData), 0); + + LogError("Malformed request? Dumping request data:\n%s", sData); + } + else if (eStatusCode == k_EHTTPStatusCode429TooManyRequests) + { + g_iRatelimitRemaining = 0; + g_iRatelimitReset = GetTime() + 5; + } + + delete RequestJSON; + delete hRequest; + + return; + } + + static int iLastRatelimitRemaining = 0; + static int iLastRatelimitReset = 0; + char sTmp[32]; + bool bHeaderExists = SteamWorks_GetHTTPResponseHeaderValue(hRequest, "x-ratelimit-remaining", sTmp, sizeof(sTmp)); + + if (!bHeaderExists) + LogError("x-ratelimit-remaining header value could not be retrieved"); + + int iRatelimitRemaining = StringToInt(sTmp); + + bHeaderExists = SteamWorks_GetHTTPResponseHeaderValue(hRequest, "x-ratelimit-reset", sTmp, sizeof(sTmp)); + + if (!bHeaderExists) + LogError("x-ratelimit-reset header value could not be retrieved"); + + int iRatelimitReset = StringToInt(sTmp); + + if (iRatelimitRemaining < iLastRatelimitRemaining || iRatelimitReset >= iLastRatelimitReset) //don't be fooled by different completion times + { + g_iRatelimitRemaining = iRatelimitRemaining; + g_iRatelimitReset = iRatelimitReset; + } + + //PrintToServer("limit: %d | remaining: %d || reset %d - now %d", g_iRatelimitLimit, g_iRatelimitRemaining, g_iRatelimitReset, GetTime()); + + delete RequestJSON; + delete hRequest; +} + +stock bool IsValidClient(int client) +{ + return (client > 0 && client <= MaxClients && IsClientInGame(client)); +} + +public Action CommandListener_SmChat(int client, const char[] sCommand, int argc) +{ + if (client <= 0) + return Plugin_Continue; + + char sText[256]; + char sUsername[32]; + + GetCmdArgString(sText, sizeof(sText)); + GetClientName(client, sUsername, sizeof(sUsername)); + + if (g_sAvatarURL[client][0] != '\0') + Discord_POST(DISCORD_ADMINCHAT_WEBHOOKURL, sText, true, sUsername, true, g_sAvatarURL[client]); + else + Discord_POST(DISCORD_ADMINCHAT_WEBHOOKURL, sText, true, sUsername); + + return Plugin_Continue; +} + +public Action OnClientSayCommand(int client, const char[] sCommand, const char[] sArgs) +{ + if (client <= 0 || !IsClientInGame(client) || BaseComm_IsClientGagged(client)) + return Plugin_Continue; + + char sFinal[256]; + char sUsername[MAX_NAME_LENGTH]; + + GetClientName(client, sUsername, sizeof(sUsername)); + + if (strcmp(sCommand, "say_team") == 0) + { + if (sArgs[0] == '@') + { + bool bAdmin = CheckCommandAccess(client, "", ADMFLAG_GENERIC, true); + Format(sFinal, sizeof(sFinal), "%s%s", bAdmin ? "" : "To Admins: ", sArgs[1]); + if (g_sAvatarURL[client][0] != '\0') + Discord_POST(DISCORD_ADMINCHAT_WEBHOOKURL, sFinal, true, sUsername, true, g_sAvatarURL[client]); + else + Discord_POST(DISCORD_ADMINCHAT_WEBHOOKURL, sFinal, true, sUsername); + + if (!bAdmin) + { + //g_iReplyTargetSerial = GetClientSerial(client); + //g_iReplyType = REPLYTYPE_CHAT; + } + + return Plugin_Continue; + } + + char sTeamName[32]; + + GetTeamName(GetClientTeam(client), sTeamName, sizeof(sTeamName)); + Format(sFinal, sizeof(sFinal), "(%s) ", sTeamName); + } + + return Plugin_Continue; +} + +public Action OnLogAction(Handle hSource, Identity ident, int client, int target, const char[] sMsg) +{ + if (client <= 0) + return; + + if ((StrContains(sMsg, "sm_psay", false)!= -1) || (StrContains(sMsg, "sm_chat", false)!= -1)) + return;// dont log sm_psay and sm_chat + + char sFinal[256]; + char sCurrentMap[32]; + char sClientName[64]; + + GetCurrentMap(sCurrentMap, sizeof(sCurrentMap)); + Format(sFinal, sizeof(sFinal), "[ %s ]```%s```", sCurrentMap, sMsg); + + GetClientName(client, sClientName, sizeof(sClientName)); + + if (g_sAvatarURL[client][0] != '\0') + Discord_POST(DISCORD_ADMINLOGS_WEBHOOKURL, sFinal, true, sClientName, true, g_sAvatarURL[client], false); + else + Discord_POST(DISCORD_ADMINLOGS_WEBHOOKURL, sFinal, true, sClientName, false, "", false); + + return; +} + + +public void AntiBhopCheat_OnClientDetected(int client, char[] sReason, char[] sStats) +{ + char sUsername[MAX_NAME_LENGTH]; + GetClientName(client, sUsername, sizeof(sUsername)); + + char currentMap[64]; + GetCurrentMap(currentMap, sizeof(currentMap)); + + char sMessage[4096]; + Format(sMessage, sizeof(sMessage), "```%s - Tick: %d``````%s\n%s```", currentMap, GetGameTickCount(), sReason, sStats); + + if (g_sAvatarURL[client][0] != '\0') + Discord_POST(DISCORD_ANTIBHOPCHEAT_WEBHOOKURL, sMessage, true, sUsername, true, g_sAvatarURL[client], false); + else + Discord_POST(DISCORD_ANTIBHOPCHEAT_WEBHOOKURL, sMessage, true, sUsername, false, "", false); +} + +public int entWatch_OnClientBanned(int admin, int iLenght, int client) +{ + char sUsername[MAX_NAME_LENGTH]; + GetClientName(client, sUsername, sizeof(sUsername)); + + char currentMap[64]; + GetCurrentMap(currentMap, sizeof(currentMap)); + + char sMessageTmp[4096]; + + if (iLenght == 0) + { + Format(sMessageTmp, sizeof(sMessageTmp), "%L got temporarily restricted by %L", client, admin); + } + else if (iLenght == -1) + { + Format(sMessageTmp, sizeof(sMessageTmp), "%L got PERMANENTLY restricted by %L", client, admin); + } + else + { + Format(sMessageTmp, sizeof(sMessageTmp), "%L got restricted by %L for %d minutes", client, admin, iLenght); + } + + + char sMessage[4096]; + Format(sMessage, sizeof(sMessage), "```%s - Tick: %d``````%s```", currentMap, GetGameTickCount(), sMessageTmp); + + if (g_sAvatarURL[client][0] != '\0') + Discord_POST(DISCORD_ENTWATCH_WEBHOOKURL, sMessage, true, sUsername, true, g_sAvatarURL[client], false); + else + Discord_POST(DISCORD_ENTWATCH_WEBHOOKURL, sMessage, true, sUsername, false, "", false); +} + +public int entWatch_OnClientUnbanned(int admin, int client) +{ + char sUsername[MAX_NAME_LENGTH]; + GetClientName(client, sUsername, sizeof(sUsername)); + + char currentMap[64]; + GetCurrentMap(currentMap, sizeof(currentMap)); + + char sMessageTmp[4096]; + Format(sMessageTmp, sizeof(sMessageTmp), "%L got unrestricted by %L", client, admin); + + char sMessage[4096]; + Format(sMessage, sizeof(sMessage), "```%s - Tick: %d``````%s```", currentMap, GetGameTickCount(), sMessageTmp); + + if (g_sAvatarURL[client][0] != '\0') + Discord_POST(DISCORD_ENTWATCH_WEBHOOKURL, sMessage, true, sUsername, true, g_sAvatarURL[client], false); + else + Discord_POST(DISCORD_ENTWATCH_WEBHOOKURL, sMessage, true, sUsername, false, "", false); +} + +public Action Command_Report(int client, int argc) +{ + if (BaseComm_IsClientGagged(client)) + return Plugin_Handled; + + if (argc < 2) + { + ReplyToCommand(client, "[SM] Usage: sm_report "); + return Plugin_Handled; + } + + if (g_fReportCooldown[client] > GetGameTime()) + { + ReplyToCommand(client, "[SM] Please wait another %d seconds before sending another report.", RoundToNearest(g_fReportCooldown[client] - GetGameTime())); + return Plugin_Handled; + } + + int iTarget; + char sTarget[32]; + + GetCmdArg(1, sTarget, sizeof(sTarget)); + + if ((iTarget = FindTarget(client, sTarget, true, false)) <= 0) + return Plugin_Handled; + + char sFormatted[4096]; + char sReportText[128]; + char sClientAuthID32[32]; + char sTargetAuthID32[32]; + char sCurrentMap[32]; + int iClientUID = GetClientUserId(client); + int iTargetUID = GetClientUserId(iTarget); + + GetCmdArgString(sReportText, sizeof(sReportText)); + Format(sReportText, sizeof(sReportText) - strlen(sTarget) + 1, sReportText[strlen(sTarget) + 1]); + + if (sReportText[0] == '"') + StripQuotes(sReportText); + + GetClientAuthId(client, AuthId_Steam3, sClientAuthID32, sizeof(sClientAuthID32)); + GetClientAuthId(iTarget, AuthId_Steam3, sTargetAuthID32, sizeof(sTargetAuthID32)); + + GetCurrentMap(sCurrentMap, sizeof(sCurrentMap)); + + Format(sFormatted, sizeof(sFormatted), + "@here\n```%s - Tick: %d``````Reporter: %N (#%d)\nTarget: %N (#%d)\nReason: %s\n```", + sCurrentMap, GetGameTickCount(), client, iClientUID, iTarget, iTargetUID, sReportText); + + char sUsername[MAX_NAME_LENGTH]; + GetClientName(client, sUsername, sizeof(sUsername)); + + if (g_sAvatarURL[client][0] != '\0') + Discord_POST(DISCORD_REPORT_WEBHOOKURL, sFormatted, true, sUsername, true, g_sAvatarURL[client], false); + else + Discord_POST(DISCORD_REPORT_WEBHOOKURL, sFormatted, true, sUsername, false, "", false); + + Format(sFormatted, sizeof(sFormatted), "#%d \"%N\" reported #%d \"%N\" for:\n\x04[Reports]\x01 %s", iClientUID, client, iTargetUID, iTarget, sReportText); + + for (int i = 1; i <= MaxClients; i++) + { + if (!IsClientInGame(i) || !IsClientAuthorized(i)) + continue; + + if (!CheckCommandAccess(i, "", ADMFLAG_GENERIC, true)) + continue; + + PrintToChat(i, "\x01\x04[Reports]\x01 %s", sFormatted); + } + + g_fReportCooldown[client] = GetGameTime() + 30.0; + + ReplyToCommand(client, "\x01\x04[Reports]\x01 Your report was successfully submitted!"); + + return Plugin_Handled; +} diff --git a/FixPointTeleport/scripting/FixPointTeleport.sp b/FixPointTeleport/scripting/FixPointTeleport.sp index 3103e48d..b9654573 100644 --- a/FixPointTeleport/scripting/FixPointTeleport.sp +++ b/FixPointTeleport/scripting/FixPointTeleport.sp @@ -31,19 +31,19 @@ public void OnPluginStart() SetFailState("Couldn't load \"FixPointTeleport.games\" game config!"); return; } - + // CBaseCombatWeapon::FallInit() StartPrepSDKCall(SDKCall_Entity); - + if (!PrepSDKCall_SetFromConf(hGameConf, SDKConf_Virtual, "FallInit")) { CloseHandle(hGameConf); SetFailState("PrepSDKCall_SetFromConf(hGameConf, SDKConf_Virtual, \"FallInit\") failed!"); return; } - + hFallInit = EndPrepSDKCall(); - + // CBaseEntity::Teleport(Vector const*, QAngle const*, Vector const*) int iOffset; if ((iOffset = GameConfGetOffset(hGameConf, "Teleport")) == -1) @@ -52,25 +52,25 @@ public void OnPluginStart() SetFailState("GameConfGetOffset(hGameConf, \"Teleport\") failed!"); return; } - + if ((hTeleport = DHookCreate(iOffset, HookType_Entity, ReturnType_Void, ThisPointer_CBaseEntity, OnEntityTeleport)) == INVALID_HANDLE) { CloseHandle(hGameConf); SetFailState("DHookCreate(iOffset, HookType_Entity, ReturnType_Void, ThisPointer_CBaseEntity, OnEntityTeleport) failed!"); return; } - + DHookAddParam(hTeleport, HookParamType_VectorPtr); DHookAddParam(hTeleport, HookParamType_ObjectPtr); DHookAddParam(hTeleport, HookParamType_VectorPtr); - + // Late load. int entity = INVALID_ENT_REFERENCE; while ((entity = FindEntityByClassname(entity, "weapon_*")) != INVALID_ENT_REFERENCE) { OnEntityCreated(entity, "weapon_*"); } - + CloseHandle(hGameConf); } @@ -95,7 +95,7 @@ public MRESReturn OnEntityTeleport(int entity, Handle hParams) // Dont reinitialize, if we dont have spawnflags or are missing the start constrained spawnflag. if (!HasEntProp(entity, Prop_Data, "m_spawnflags") || (GetEntProp(entity, Prop_Data, "m_spawnflags") & SF_WEAPON_START_CONSTRAINED) == 0) return; - + SDKCall(hFallInit, entity); } } \ No newline at end of file diff --git a/ForceInputs/scripting/ForceInputs.sp b/ForceInputs/scripting/ForceInputs.sp index 1b71afd7..de073c53 100644 --- a/ForceInputs/scripting/ForceInputs.sp +++ b/ForceInputs/scripting/ForceInputs.sp @@ -134,7 +134,7 @@ public Action Command_ForceInput(int client, int args) AcceptEntityInput(entity, sArguments[1], client, client); ReplyToCommand(client, "[SM] Input successful."); - + char sClassname[64]; char sTargetname[64]; GetEntPropString(entity, Prop_Data, "m_iClassname", sClassname, sizeof(sClassname)); @@ -157,7 +157,7 @@ public Action Command_ForceInput(int client, int args) AcceptEntityInput(entity, sArguments[1], client, client); ReplyToCommand(client, "[SM] Input successful."); - + char sClassname[64]; char sTargetname[64]; GetEntPropString(entity, Prop_Data, "m_iClassname", sClassname, sizeof(sClassname)); diff --git a/FunMode/scripting/FunMode.sp b/FunMode/scripting/FunMode.sp index 20991708..ee7d4f01 100644 --- a/FunMode/scripting/FunMode.sp +++ b/FunMode/scripting/FunMode.sp @@ -239,7 +239,7 @@ public void RequestFrame_ClientSpawnPost(int client) int ent = GivePlayerItem(client, "weapon_smokegrenade"); EquipPlayerWeapon(client, ent); - + //PrintToChatAll("%N spawned in and got a smoke", client); char sHumanClassName[64]; diff --git a/PlayerscountInHostname/scripting/PlayerscountInHostname.sp b/PlayerscountInHostname/scripting/PlayerscountInHostname.sp index 7bb52cb4..652736ed 100644 --- a/PlayerscountInHostname/scripting/PlayerscountInHostname.sp +++ b/PlayerscountInHostname/scripting/PlayerscountInHostname.sp @@ -1,7 +1,7 @@ #include #pragma semicolon 1 -public Plugin:myinfo = +public Plugin:myinfo = { name = "Players count in hostname", author = "D1maxa", @@ -18,7 +18,7 @@ new Handle:formatted_hostname = INVALID_HANDLE; public OnPluginStart() { hostname = FindConVar("hostname"); - sv_visiblemaxplayers = FindConVar("sv_visiblemaxplayers"); + sv_visiblemaxplayers = FindConVar("sv_visiblemaxplayers"); formatted_hostname=CreateConVar("sm_formatted_hostname", "My Server %d/%d", "Formatted string for dynamic hostname",FCVAR_PLUGIN); } @@ -26,12 +26,12 @@ public OnMapStart() { g_NumClients=0; } - + public OnConfigsExecuted() { SetNumberOfPlayersInHostname(); } - + public OnClientConnected(client) { if(!IsFakeClient(client)) @@ -44,7 +44,7 @@ public OnClientConnected(client) public OnClientDisconnect(client) { if(!IsFakeClient(client)) - { + { g_NumClients--; SetNumberOfPlayersInHostname(); } diff --git a/PushNades/scripting/PushNades.sp b/PushNades/scripting/PushNades.sp index 3e80995e..636a079a 100644 --- a/PushNades/scripting/PushNades.sp +++ b/PushNades/scripting/PushNades.sp @@ -12,7 +12,7 @@ Handle g_hCVar_PushStrength = INVALID_HANDLE; Handle g_hCVar_PushScale = INVALID_HANDLE; -public Plugin myinfo = +public Plugin myinfo = { name = "PushNades", author = "Neon", @@ -22,37 +22,37 @@ public Plugin myinfo = } public void OnPluginStart() -{ +{ g_hCVar_PushNadesEnabled = CreateConVar("sm_hegrenade_push_enabled", "0", "Enable PushBack for HE-Grenades", 0, true, 0.0, true, 1.0); g_hCVar_PushScale = CreateConVar("sm_hegrenade_push_scale", "0", "Make the push scale with the distance to the explosion", 0, true, 0.0, true, 1.0); g_hCVar_PushRange = CreateConVar("sm_hegrenade_push_range", "500", "Range arround Explosion in which Zombies are affected by the push."); g_hCVar_PushStrength = CreateConVar("sm_hegrenade_push_strength", "2500", "How strong the HE-Grenade pushes back"); - HookEvent("hegrenade_detonate", OnHEDetonate); + HookEvent("hegrenade_detonate", OnHEDetonate); } -public void OnMapStart() +public void OnMapStart() { } -public Action OnHEDetonate(Event hEvent, const char[] sEvent, bool bDontBroadcast) +public Action OnHEDetonate(Event hEvent, const char[] sEvent, bool bDontBroadcast) { if (!GetConVarBool(g_hCVar_PushNadesEnabled)) return Plugin_Continue; - + float fNadeOrigin[3]; - fNadeOrigin[0] = hEvent.GetFloat("x"); + fNadeOrigin[0] = hEvent.GetFloat("x"); fNadeOrigin[1] = hEvent.GetFloat("y"); fNadeOrigin[2] = hEvent.GetFloat("z"); - + int iOwner = GetClientOfUserId(hEvent.GetInt("userid")); - + if (!IsValidClient(iOwner, false)) - return Plugin_Continue; - + return Plugin_Continue; + if (!IsPlayerAlive(iOwner) || !ZR_IsClientHuman(iOwner)) return Plugin_Continue; - + for (int client = 1; client <= MaxClients; client++) { if (IsValidClient(client, false)) @@ -60,43 +60,43 @@ public Action OnHEDetonate(Event hEvent, const char[] sEvent, bool bDontBroadcas if (IsPlayerAlive(client) && ZR_IsClientZombie(client)) { float fZombieOrigin[3]; - GetClientAbsOrigin(client, fZombieOrigin); - - float fDistance = GetVectorDistance(fZombieOrigin, fNadeOrigin, false); - float fMaxRange = GetConVarFloat(g_hCVar_PushRange); - + GetClientAbsOrigin(client, fZombieOrigin); + + float fDistance = GetVectorDistance(fZombieOrigin, fNadeOrigin, false); + float fMaxRange = GetConVarFloat(g_hCVar_PushRange); + if (fDistance <= fMaxRange) - { + { float fOwnerOrigin[3]; GetClientAbsOrigin(iOwner, fOwnerOrigin); - - float fPushVector[3]; + + float fPushVector[3]; MakeVectorFromPoints(fOwnerOrigin, fZombieOrigin, fPushVector); - - float fCurrentVector[3]; + + float fCurrentVector[3]; //GetEntPropVector(iOwner, Prop_Data, "m_vecVelocity", fCurrentVector); - + float fPushStrength = GetConVarFloat(g_hCVar_PushStrength); - - float fDistanceScalingFactor = 1.0; + + float fDistanceScalingFactor = 1.0; if (GetConVarBool(g_hCVar_PushScale)) fDistanceScalingFactor = 1.0 - ((1.0/fMaxRange) * fDistance); - - + + NormalizeVector(fPushVector, fPushVector); - fPushVector[0] *= fPushStrength * fDistanceScalingFactor; - fPushVector[1] *= fPushStrength * fDistanceScalingFactor; + fPushVector[0] *= fPushStrength * fDistanceScalingFactor; + fPushVector[1] *= fPushStrength * fDistanceScalingFactor; fPushVector[2] *= fPushStrength * fDistanceScalingFactor; fPushVector[0] += fCurrentVector[0]; fPushVector[1] += fCurrentVector[1]; - fPushVector[2] += fCurrentVector[2]; - + fPushVector[2] += fCurrentVector[2]; + TeleportEntity(client, NULL_VECTOR, NULL_VECTOR, fPushVector); } } } - + } return Plugin_Continue; } diff --git a/RadioMute/scripting/RadioMute.sp b/RadioMute/scripting/RadioMute.sp index 4628d7ed..d043bfc2 100644 --- a/RadioMute/scripting/RadioMute.sp +++ b/RadioMute/scripting/RadioMute.sp @@ -1,165 +1,165 @@ -#pragma semicolon 1 - -#include - -#pragma newdecls required - -bool g_bProtoBuf; -bool g_bBlocked[MAXPLAYERS + 1]; - -int g_iMessageClient = -1; - -public Plugin myinfo = -{ - name = "RadioMute", - description = "Very simple plugin to block players from using the in-game radio in supported games.", - author = "Obus", - version = "1.0.1", - url = "" -} - -public void OnPluginStart() -{ - LoadTranslations("common.phrases"); - - if(GetFeatureStatus(FeatureType_Native, "GetUserMessageType") == FeatureStatus_Available && GetUserMessageType() == UM_Protobuf) - g_bProtoBuf = true; - - UserMsg RadioText = GetUserMessageId("RadioText"); - - if (RadioText == INVALID_MESSAGE_ID) - SetFailState("This game does not support the \"RadioText\" UserMessage."); - - UserMsg SendAudio = GetUserMessageId("SendAudio"); - - if (SendAudio == INVALID_MESSAGE_ID) - SetFailState("This game does not support the \"SendAudio\" UserMessage."); - - RegAdminCmd("sm_radiomute", Command_RadioMute, ADMFLAG_BAN, "Block a client from using the in-game radio."); - RegAdminCmd("sm_radiounmute", Command_RadioUnmute, ADMFLAG_BAN, "Unblock a client from using the in-game radio."); - - HookUserMessage(RadioText, _hkRadioText, true); - HookUserMessage(SendAudio, _hkSendAudio, true); -} - -public void OnClientDisconnect(int client) -{ - g_bBlocked[client] = false; -} - -public Action Command_RadioMute(int client, int argc) -{ - if (argc < 1) - { - ReplyToCommand(client, "[SM] Usage: sm_radiomute "); - - return Plugin_Handled; - } - - char sArgs[64]; - char sTargetName[MAX_TARGET_LENGTH]; - int iTargets[MAXPLAYERS]; - int iTargetCount; - bool bIsML; - - GetCmdArg(1, sArgs, sizeof(sArgs)); - - if ((iTargetCount = ProcessTargetString(sArgs, client, iTargets, MAXPLAYERS, COMMAND_FILTER_CONNECTED, sTargetName, sizeof(sTargetName), bIsML)) <= 0) - { - ReplyToTargetError(client, iTargetCount); - - return Plugin_Handled; - } - - for (int i = 0; i < iTargetCount; i++) - { - g_bBlocked[iTargets[i]] = true; - } - - ShowActivity2(client, "\x01[SM] \x04", "\x01Radio muted \x04%s\x01", sTargetName); - LogAction(client, -1, "\"%L\" radio muted \"%s\"", client, sTargetName); - - return Plugin_Handled; -} - -public Action Command_RadioUnmute(int client, int argc) -{ - if (argc < 1) - { - ReplyToCommand(client, "[SM] Usage: sm_radiounmute "); - - return Plugin_Handled; - } - - char sArgs[64]; - char sTargetName[MAX_TARGET_LENGTH]; - int iTargets[MAXPLAYERS]; - int iTargetCount; - bool bIsML; - - GetCmdArg(1, sArgs, sizeof(sArgs)); - - if ((iTargetCount = ProcessTargetString(sArgs, client, iTargets, MAXPLAYERS, COMMAND_FILTER_CONNECTED, sTargetName, sizeof(sTargetName), bIsML)) <= 0) - { - ReplyToTargetError(client, iTargetCount); - - return Plugin_Handled; - } - - for (int i = 0; i < iTargetCount; i++) - { - g_bBlocked[iTargets[i]] = false; - } - - ShowActivity2(client, "\x01[SM] \x04", "\x01Radio unmuted \x04%s\x01", sTargetName); - LogAction(client, -1, "\"%L\" radio unmuted \"%s\"", client, sTargetName); - - return Plugin_Handled; -} - -public Action _hkRadioText(UserMsg msg_id, Handle bf, const int[] players, int playersNum, bool reliable, bool init) -{ - if (g_bProtoBuf) - { - g_iMessageClient = PbReadInt(bf, "client"); - } - else - { - BfReadByte(bf); - g_iMessageClient = BfReadByte(bf); - } - - if (g_bBlocked[g_iMessageClient]) - { - return Plugin_Handled; - } - - return Plugin_Continue; -} - -public Action _hkSendAudio(UserMsg msg_id, Handle bf, const int[] players, int playersNum, bool reliable, bool init) -{ - if (g_iMessageClient == -1) - return Plugin_Continue; - - char sSound[128]; - - if(g_bProtoBuf) - PbReadString(bf, "radio_sound", sSound, sizeof(sSound)); - else - BfReadString(bf, sSound, sizeof(sSound), false); - - if (strncmp(sSound[6], "lock", 4, false) == 0) - return Plugin_Continue; - - if (g_bBlocked[g_iMessageClient]) - { - g_iMessageClient = -1; - - return Plugin_Handled; - } - - g_iMessageClient = -1; - - return Plugin_Continue; -} +#pragma semicolon 1 + +#include + +#pragma newdecls required + +bool g_bProtoBuf; +bool g_bBlocked[MAXPLAYERS + 1]; + +int g_iMessageClient = -1; + +public Plugin myinfo = +{ + name = "RadioMute", + description = "Very simple plugin to block players from using the in-game radio in supported games.", + author = "Obus", + version = "1.0.1", + url = "" +} + +public void OnPluginStart() +{ + LoadTranslations("common.phrases"); + + if(GetFeatureStatus(FeatureType_Native, "GetUserMessageType") == FeatureStatus_Available && GetUserMessageType() == UM_Protobuf) + g_bProtoBuf = true; + + UserMsg RadioText = GetUserMessageId("RadioText"); + + if (RadioText == INVALID_MESSAGE_ID) + SetFailState("This game does not support the \"RadioText\" UserMessage."); + + UserMsg SendAudio = GetUserMessageId("SendAudio"); + + if (SendAudio == INVALID_MESSAGE_ID) + SetFailState("This game does not support the \"SendAudio\" UserMessage."); + + RegAdminCmd("sm_radiomute", Command_RadioMute, ADMFLAG_BAN, "Block a client from using the in-game radio."); + RegAdminCmd("sm_radiounmute", Command_RadioUnmute, ADMFLAG_BAN, "Unblock a client from using the in-game radio."); + + HookUserMessage(RadioText, _hkRadioText, true); + HookUserMessage(SendAudio, _hkSendAudio, true); +} + +public void OnClientDisconnect(int client) +{ + g_bBlocked[client] = false; +} + +public Action Command_RadioMute(int client, int argc) +{ + if (argc < 1) + { + ReplyToCommand(client, "[SM] Usage: sm_radiomute "); + + return Plugin_Handled; + } + + char sArgs[64]; + char sTargetName[MAX_TARGET_LENGTH]; + int iTargets[MAXPLAYERS]; + int iTargetCount; + bool bIsML; + + GetCmdArg(1, sArgs, sizeof(sArgs)); + + if ((iTargetCount = ProcessTargetString(sArgs, client, iTargets, MAXPLAYERS, COMMAND_FILTER_CONNECTED, sTargetName, sizeof(sTargetName), bIsML)) <= 0) + { + ReplyToTargetError(client, iTargetCount); + + return Plugin_Handled; + } + + for (int i = 0; i < iTargetCount; i++) + { + g_bBlocked[iTargets[i]] = true; + } + + ShowActivity2(client, "\x01[SM] \x04", "\x01Radio muted \x04%s\x01", sTargetName); + LogAction(client, -1, "\"%L\" radio muted \"%s\"", client, sTargetName); + + return Plugin_Handled; +} + +public Action Command_RadioUnmute(int client, int argc) +{ + if (argc < 1) + { + ReplyToCommand(client, "[SM] Usage: sm_radiounmute "); + + return Plugin_Handled; + } + + char sArgs[64]; + char sTargetName[MAX_TARGET_LENGTH]; + int iTargets[MAXPLAYERS]; + int iTargetCount; + bool bIsML; + + GetCmdArg(1, sArgs, sizeof(sArgs)); + + if ((iTargetCount = ProcessTargetString(sArgs, client, iTargets, MAXPLAYERS, COMMAND_FILTER_CONNECTED, sTargetName, sizeof(sTargetName), bIsML)) <= 0) + { + ReplyToTargetError(client, iTargetCount); + + return Plugin_Handled; + } + + for (int i = 0; i < iTargetCount; i++) + { + g_bBlocked[iTargets[i]] = false; + } + + ShowActivity2(client, "\x01[SM] \x04", "\x01Radio unmuted \x04%s\x01", sTargetName); + LogAction(client, -1, "\"%L\" radio unmuted \"%s\"", client, sTargetName); + + return Plugin_Handled; +} + +public Action _hkRadioText(UserMsg msg_id, Handle bf, const int[] players, int playersNum, bool reliable, bool init) +{ + if (g_bProtoBuf) + { + g_iMessageClient = PbReadInt(bf, "client"); + } + else + { + BfReadByte(bf); + g_iMessageClient = BfReadByte(bf); + } + + if (g_bBlocked[g_iMessageClient]) + { + return Plugin_Handled; + } + + return Plugin_Continue; +} + +public Action _hkSendAudio(UserMsg msg_id, Handle bf, const int[] players, int playersNum, bool reliable, bool init) +{ + if (g_iMessageClient == -1) + return Plugin_Continue; + + char sSound[128]; + + if(g_bProtoBuf) + PbReadString(bf, "radio_sound", sSound, sizeof(sSound)); + else + BfReadString(bf, sSound, sizeof(sSound), false); + + if (strncmp(sSound[6], "lock", 4, false) == 0) + return Plugin_Continue; + + if (g_bBlocked[g_iMessageClient]) + { + g_iMessageClient = -1; + + return Plugin_Handled; + } + + g_iMessageClient = -1; + + return Plugin_Continue; +} diff --git a/TeamManager/scripting/include/TeamManager.inc b/TeamManager/scripting/include/TeamManager.inc index 0c514ef8..ab800c7d 100644 --- a/TeamManager/scripting/include/TeamManager.inc +++ b/TeamManager/scripting/include/TeamManager.inc @@ -1,36 +1,36 @@ -#if defined _TeamManager_include - #endinput -#endif -#define _TeamManager_include - -/** - * Called when warmup ends - * - * @return None - */ -forward void TeamManager_WarmupEnd(); - -/** - * Returns the status of warmup - * - * @return bool inwarmup - */ -native bool TeamManager_InWarmup(); - -public SharedPlugin __pl_TeamManager = -{ - name = "TeamManager", - file = "TeamManager.smx", -#if defined REQUIRE_PLUGIN - required = 1 -#else - required = 0 -#endif -}; - -#if !defined REQUIRE_PLUGIN -public void __pl_TeamManager_SetNTVOptional() -{ - MarkNativeAsOptional("TeamManager_InWarmup"); -} -#endif +#if defined _TeamManager_include + #endinput +#endif +#define _TeamManager_include + +/** + * Called when warmup ends + * + * @return None + */ +forward void TeamManager_WarmupEnd(); + +/** + * Returns the status of warmup + * + * @return bool inwarmup + */ +native bool TeamManager_InWarmup(); + +public SharedPlugin __pl_TeamManager = +{ + name = "TeamManager", + file = "TeamManager.smx", +#if defined REQUIRE_PLUGIN + required = 1 +#else + required = 0 +#endif +}; + +#if !defined REQUIRE_PLUGIN +public void __pl_TeamManager_SetNTVOptional() +{ + MarkNativeAsOptional("TeamManager_InWarmup"); +} +#endif diff --git a/_entWatch4/scripting/entWatch-core.sp b/_entWatch4/scripting/entWatch-core.sp index 70280190..f677298e 100644 --- a/_entWatch4/scripting/entWatch-core.sp +++ b/_entWatch4/scripting/entWatch-core.sp @@ -49,11 +49,11 @@ public Plugin myinfo = public APLRes AskPluginLoad2(Handle hMyself, bool bLate, char[] sError, int errorSize) { g_bLate = bLate; - + CreateNative("EW_GetItemCount", Native_GetItemCount); CreateNative("EW_GetItemArray", Native_GetItemArray); CreateNative("EW_SetItemArray", Native_SetItemArray); - + RegPluginLibrary("entWatch-core"); return APLRes_Success; } @@ -68,23 +68,23 @@ public void OnPluginStart() g_hFwd_OnClientItemPickup = CreateGlobalForward("EW_OnClientItemPickup", ET_Ignore, Param_Array, Param_Cell, Param_Cell); g_hFwd_OnClientItemActivate = CreateGlobalForward("EW_OnClientItemActivate", ET_Ignore, Param_Array, Param_Cell, Param_Cell); g_hFwd_OnClientItemDisconnect = CreateGlobalForward("EW_OnClientItemDisconnect", ET_Ignore, Param_Array, Param_Cell, Param_Cell); - + g_hFwd_OnClientItemCanPickup = CreateGlobalForward("EW_OnClientItemCanPickup", ET_Hook, Param_Array, Param_Cell, Param_Cell); g_hFwd_OnClientItemCanActivate = CreateGlobalForward("EW_OnClientItemCanActivate", ET_Hook, Param_Array, Param_Cell, Param_Cell); g_hArray_Items = new ArrayList(512); g_hArray_Config = new ArrayList(512); - + HookEvent("player_death", OnClientDeath); HookEvent("round_start", OnRoundStart); - + if (g_bLate) { for (int client = 1; client <= MaxClients; client++) { if (!IsClientInGame(client) || IsFakeClient(client)) continue; - + SDKHook(client, SDKHook_WeaponEquipPost, OnWeaponPickup); SDKHook(client, SDKHook_WeaponDropPost, OnWeaponDrop); SDKHook(client, SDKHook_WeaponCanUse, OnWeaponTouch); @@ -99,25 +99,25 @@ public void OnMapStart() { g_hArray_Items.Clear(); g_hArray_Config.Clear(); - + char sCurrentMap[128]; GetCurrentMap(sCurrentMap, sizeof(sCurrentMap)); String_ToLower(sCurrentMap, sCurrentMap, sizeof(sCurrentMap)); - + char sFilePathDefault[PLATFORM_MAX_PATH]; char sFilePathOverride[PLATFORM_MAX_PATH]; - + BuildPath(Path_SM, sFilePathDefault, sizeof(sFilePathDefault), "configs/entwatch/%s.cfg", sCurrentMap); BuildPath(Path_SM, sFilePathOverride, sizeof(sFilePathOverride), "configs/entwatch/%s.override.cfg", sCurrentMap); - + KeyValues hConfig = new KeyValues("items"); - + if (FileExists(sFilePathOverride)) { if (!hConfig.ImportFromFile(sFilePathOverride)) { LogMessage("Unable to load config \"%s\"!", sFilePathOverride); - + delete hConfig; return; } @@ -128,13 +128,13 @@ public void OnMapStart() if (!hConfig.ImportFromFile(sFilePathDefault)) { LogMessage("Unable to load config \"%s\"!", sFilePathDefault); - + delete hConfig; return; } else LogMessage("Loaded config \"%s\"", sFilePathDefault); } - + if (hConfig.GotoFirstSubKey()) { do @@ -144,7 +144,7 @@ public void OnMapStart() hConfig.GetString("short", itemArray[item_short], sizeof(itemArray[item_short])); hConfig.GetString("color", itemArray[item_color], sizeof(itemArray[item_color])); hConfig.GetString("filter", itemArray[item_filter], sizeof(itemArray[item_filter])); - + itemArray[item_weaponid] = hConfig.GetNum("weaponid"); itemArray[item_buttonid] = hConfig.GetNum("buttonid"); itemArray[item_triggerid] = hConfig.GetNum("triggerid"); @@ -152,12 +152,12 @@ public void OnMapStart() itemArray[item_mode] = hConfig.GetNum("mode"); itemArray[item_maxuses] = hConfig.GetNum("maxuses"); itemArray[item_cooldown] = hConfig.GetNum("cooldown"); - + g_hArray_Config.PushArray(itemArray, sizeof(itemArray)); - } + } while (hConfig.GotoNextKey()); } - + delete hConfig; return; } @@ -173,7 +173,7 @@ public void OnRoundStart(Event hEvent, const char[] sEvent, bool bDontBroadcast) { any itemArray[items]; g_hArray_Items.GetArray(index, itemArray, sizeof(itemArray)); - + if (itemArray[item_owned] && itemArray[item_owner] >= 0) g_hArray_Items.Erase(index); } @@ -202,19 +202,19 @@ public void OnEntitySpawned(int entity) { any itemArray[items]; g_hArray_Items.GetArray(index, itemArray, sizeof(itemArray)); - + if (RegisterItem(itemArray, entity)) { g_hArray_Items.SetArray(index, itemArray, sizeof(itemArray)); return; } } - + for (int index; index < g_hArray_Config.Length; index++) { any itemArray[items]; g_hArray_Config.GetArray(index, itemArray, sizeof(itemArray)); - + if (RegisterItem(itemArray, entity)) { g_hArray_Items.PushArray(itemArray, sizeof(itemArray)); @@ -245,7 +245,7 @@ stock bool RegisterItem(any[] itemArray, int entity) (itemArray[item_weapon] && Entity_GetParent(entity) == itemArray[item_weapon]))) { SDKHook(entity, SDKHook_Use, OnButtonPress); - + itemArray[item_button] = entity; return true; } @@ -258,7 +258,7 @@ stock bool RegisterItem(any[] itemArray, int entity) SDKHook(entity, SDKHook_StartTouch, OnTriggerTouch); SDKHook(entity, SDKHook_EndTouch, OnTriggerTouch); SDKHook(entity, SDKHook_Touch, OnTriggerTouch); - + itemArray[item_trigger] = entity; return true; } @@ -278,25 +278,25 @@ public void OnEntityDestroyed(int entity) { any itemArray[items]; g_hArray_Items.GetArray(index, itemArray, sizeof(itemArray)); - + if (itemArray[item_weapon] && itemArray[item_weapon] == entity) { g_hArray_Items.Erase(index); return; } - + if (itemArray[item_button] && itemArray[item_button] == entity) { itemArray[item_button] = INVALID_ENT_REFERENCE; - + g_hArray_Items.SetArray(index, itemArray, sizeof(itemArray)); return; } - + if (itemArray[item_trigger] && itemArray[item_trigger] == entity) { itemArray[item_trigger] = INVALID_ENT_REFERENCE; - + g_hArray_Items.SetArray(index, itemArray, sizeof(itemArray)); return; } @@ -328,18 +328,18 @@ public void OnClientDisconnect(int client) { any itemArray[items]; g_hArray_Items.GetArray(index, itemArray, sizeof(itemArray)); - + if (itemArray[item_owned] && itemArray[item_owner] == client) { itemArray[item_owner] = INVALID_ENT_REFERENCE; itemArray[item_owned] = false; - + Call_StartForward(g_hFwd_OnClientItemDisconnect); Call_PushArray(itemArray, sizeof(itemArray)); Call_PushCell(client); Call_PushCell(index); Call_Finish(); - + g_hArray_Items.SetArray(index, itemArray, sizeof(itemArray)); } } @@ -352,25 +352,25 @@ public void OnClientDisconnect(int client) public void OnClientDeath(Event hEvent, const char[] sEvent, bool bDontBroadcast) { int client = GetClientOfUserId(hEvent.GetInt("userid")); - + if (Client_IsValid(client) && !IsFakeClient(client) && g_hArray_Items.Length) { for (int index; index < g_hArray_Items.Length; index++) { any itemArray[items]; g_hArray_Items.GetArray(index, itemArray, sizeof(itemArray)); - + if (itemArray[item_owned] && itemArray[item_owner] == client) { itemArray[item_owner] = INVALID_ENT_REFERENCE; itemArray[item_owned] = false; - + Call_StartForward(g_hFwd_OnClientItemDeath); Call_PushArray(itemArray, sizeof(itemArray)); Call_PushCell(client); Call_PushCell(index); Call_Finish(); - + g_hArray_Items.SetArray(index, itemArray, sizeof(itemArray)); } } @@ -388,18 +388,18 @@ public Action OnWeaponPickup(int client, int weapon) { any itemArray[items]; g_hArray_Items.GetArray(index, itemArray, sizeof(itemArray)); - + if (itemArray[item_weapon] && itemArray[item_weapon] == weapon) { itemArray[item_owner] = client; itemArray[item_owned] = true; - + Call_StartForward(g_hFwd_OnClientItemPickup); Call_PushArray(itemArray, sizeof(itemArray)); Call_PushCell(client); Call_PushCell(index); Call_Finish(); - + g_hArray_Items.SetArray(index, itemArray, sizeof(itemArray)); return; } @@ -418,18 +418,18 @@ public Action OnWeaponDrop(int client, int weapon) { any itemArray[items]; g_hArray_Items.GetArray(index, itemArray, sizeof(itemArray)); - + if (itemArray[item_weapon] && itemArray[item_weapon] == weapon) { itemArray[item_owner] = INVALID_ENT_REFERENCE; itemArray[item_owned] = false; - + Call_StartForward(g_hFwd_OnClientItemDrop); Call_PushArray(itemArray, sizeof(itemArray)); Call_PushCell(client); Call_PushCell(index); Call_Finish(); - + g_hArray_Items.SetArray(index, itemArray, sizeof(itemArray)); return; } @@ -447,12 +447,12 @@ public Action OnButtonPress(int button, int client) if (HasEntProp(button, Prop_Data, "m_bLocked") && GetEntProp(button, Prop_Data, "m_bLocked")) return Plugin_Handled; - + for (int index; index < g_hArray_Items.Length; index++) { any itemArray[items]; g_hArray_Items.GetArray(index, itemArray, sizeof(itemArray)); - + if (itemArray[item_button] && itemArray[item_button] == button) { if (itemArray[item_owned] && itemArray[item_owner] == client) @@ -463,7 +463,7 @@ public Action OnButtonPress(int button, int client) Call_PushCell(client); Call_PushCell(index); Call_Finish(aResult); - + if ((aResult == Plugin_Continue) || (aResult == Plugin_Changed)) { switch(itemArray[item_mode]) @@ -498,7 +498,7 @@ public Action OnButtonPress(int button, int client) if (itemArray[item_nextuse] < RoundToCeil(GetEngineTime())) { itemArray[item_uses]++; - + if (itemArray[item_uses] >= itemArray[item_maxuses]) { itemArray[item_nextuse] = RoundToCeil(GetEngineTime()) + itemArray[item_cooldown]; @@ -508,17 +508,17 @@ public Action OnButtonPress(int button, int client) else return Plugin_Handled; } } - + if (itemArray[item_filter][0]) Entity_SetName(client, itemArray[item_filter]); - + Call_StartForward(g_hFwd_OnClientItemActivate); Call_PushArray(itemArray, sizeof(itemArray)); Call_PushCell(client); Call_PushCell(index); Call_Finish(); } - + g_hArray_Items.SetArray(index, itemArray, sizeof(itemArray)); return aResult; } @@ -539,7 +539,7 @@ public Action OnTriggerTouch(int trigger, int client) { any itemArray[items]; g_hArray_Items.GetArray(index, itemArray, sizeof(itemArray)); - + if (itemArray[item_trigger] && itemArray[item_trigger] == trigger) { Action aResult; @@ -548,7 +548,7 @@ public Action OnTriggerTouch(int trigger, int client) Call_PushCell(client); Call_PushCell(index); Call_Finish(aResult); - + g_hArray_Items.SetArray(index, itemArray, sizeof(itemArray)); return aResult; } @@ -568,7 +568,7 @@ public Action OnWeaponTouch(int client, int weapon) { any itemArray[items]; g_hArray_Items.GetArray(index, itemArray, sizeof(itemArray)); - + if (itemArray[item_weapon] && itemArray[item_weapon] == weapon) { Action aResult; @@ -577,7 +577,7 @@ public Action OnWeaponTouch(int client, int weapon) Call_PushCell(client); Call_PushCell(index); Call_Finish(aResult); - + g_hArray_Items.SetArray(index, itemArray, sizeof(itemArray)); return aResult; } @@ -600,12 +600,12 @@ public int Native_GetItemCount(Handle hPlugin, int numParams) public int Native_GetItemArray(Handle hPlugin, int numParams) { any itemArray[items]; - + int index = GetNativeCell(1); int size = GetNativeCell(3); - + g_hArray_Items.GetArray(index, itemArray, size); - + SetNativeArray(2, itemArray, size); } @@ -615,11 +615,11 @@ public int Native_GetItemArray(Handle hPlugin, int numParams) public int Native_SetItemArray(Handle hPlugin, int numParams) { any itemArray[items]; - + int index = GetNativeCell(1); int size = GetNativeCell(3); - + GetNativeArray(2, itemArray, size); - + g_hArray_Items.SetArray(index, itemArray, size); } \ No newline at end of file diff --git a/_entWatch4/scripting/entWatch-interface.sp b/_entWatch4/scripting/entWatch-interface.sp index 7d3be40a..e80fe95e 100644 --- a/_entWatch4/scripting/entWatch-interface.sp +++ b/_entWatch4/scripting/entWatch-interface.sp @@ -33,12 +33,12 @@ public void OnGameFrame() { char sHUDFormat[250]; char sHUDBuffer[64]; - + for (int index; index < EW_GetItemCount(); index++) { any itemArray[items]; EW_GetItemArray(index, itemArray, sizeof(itemArray)); - + if (itemArray[item_display] & DISPLAY_HUD) { if (itemArray[item_owned] && itemArray[item_owner] >= 0) @@ -101,7 +101,7 @@ public void OnGameFrame() Format(sHUDBuffer, sizeof(sHUDBuffer), "%s [%s]: %N", itemArray[item_short], "N/A", itemArray[item_owner]); } } - + if (strlen(sHUDFormat) + strlen(sHUDBuffer) <= sizeof(sHUDFormat) - 2) { Format(sHUDFormat, sizeof(sHUDFormat), "%s\n%s", sHUDFormat, sHUDBuffer); @@ -110,7 +110,7 @@ public void OnGameFrame() } } } - + Handle hMessage = StartMessageAll("KeyHintText"); BfWriteByte(hMessage, 1); BfWriteString(hMessage, sHUDFormat); diff --git a/_entWatch4/scripting/entWatch-messages.sp b/_entWatch4/scripting/entWatch-messages.sp index 5812e95b..721633e2 100644 --- a/_entWatch4/scripting/entWatch-messages.sp +++ b/_entWatch4/scripting/entWatch-messages.sp @@ -44,10 +44,10 @@ public void EW_OnClientItemDrop(any[] itemArray, int client, int index) { char sName[32]; GetClientName(client, sName, sizeof(sName)); - + char sAuth[32]; GetClientAuthId(client, AuthId_Steam2, sAuth, sizeof(sAuth)); - + CRemoveTags(sName, sizeof(sName)); CPrintToChatAll(MESSAGEFORMAT, "E01B5D", "EDEDED", sName, "E562BA", "B2B2B2", sAuth, "E562BA", "Item Drop", itemArray[item_color], itemArray[item_name]); } @@ -62,10 +62,10 @@ public void EW_OnClientItemDeath(any[] itemArray, int client, int index) { char sName[32]; GetClientName(client, sName, sizeof(sName)); - + char sAuth[32]; GetClientAuthId(client, AuthId_Steam2, sAuth, sizeof(sAuth)); - + CRemoveTags(sName, sizeof(sName)); CPrintToChatAll(MESSAGEFORMAT, "E01B5D", "EDEDED", sName, "F1B567", "B2B2B2", sAuth, "F1B567", "Item Death", itemArray[item_color], itemArray[item_name]); } @@ -80,10 +80,10 @@ public void EW_OnClientItemPickup(any[] itemArray, int client, int index) { char sName[32]; GetClientName(client, sName, sizeof(sName)); - + char sAuth[32]; GetClientAuthId(client, AuthId_Steam2, sAuth, sizeof(sAuth)); - + CRemoveTags(sName, sizeof(sName)); CPrintToChatAll(MESSAGEFORMAT, "E01B5D", "EDEDED", sName, "C9EF66", "B2B2B2", sAuth, "C9EF66", "Item Pickup", itemArray[item_color], itemArray[item_name]); } @@ -98,10 +98,10 @@ public void EW_OnClientItemDisconnect(any[] itemArray, int client, int index) { char sName[32]; GetClientName(client, sName, sizeof(sName)); - + char sAuth[32]; GetClientAuthId(client, AuthId_Steam2, sAuth, sizeof(sAuth)); - + CRemoveTags(sName, sizeof(sName)); CPrintToChatAll(MESSAGEFORMAT, "E01B5D", "EDEDED", sName, "F1B567", "B2B2B2", sAuth, "F1B567", "Item Disconnect", itemArray[item_color], itemArray[item_name]); } @@ -116,10 +116,10 @@ public void EW_OnClientItemActivate(any[] itemArray, int client, int index) { char sName[32]; GetClientName(client, sName, sizeof(sName)); - + char sAuth[32]; GetClientAuthId(client, AuthId_Steam2, sAuth, sizeof(sAuth)); - + CRemoveTags(sName, sizeof(sName)); CPrintToChatAll(MESSAGEFORMAT, "E01B5D", "EDEDED", sName, "67ADDF", "B2B2B2", sAuth, "67ADDF", "Item Activate", itemArray[item_color], itemArray[item_name]); } diff --git a/_entWatch4/scripting/entWatch-restrictions.sp b/_entWatch4/scripting/entWatch-restrictions.sp index d7993d55..ad776f6b 100644 --- a/_entWatch4/scripting/entWatch-restrictions.sp +++ b/_entWatch4/scripting/entWatch-restrictions.sp @@ -48,7 +48,7 @@ public APLRes AskPluginLoad2(Handle hMyself, bool bLate, char[] sError, int erro CreateNative("EW_ClientRestrict", Native_ClientRestrict); CreateNative("EW_ClientUnrestrict", Native_ClientUnrestrict); CreateNative("EW_ClientRestricted", Native_ClientRestricted); - + RegPluginLibrary("entWatch-restrictions"); return APLRes_Success; } @@ -60,14 +60,14 @@ public void OnPluginStart() { LoadTranslations("common.phrases"); LoadTranslations("entWatch.restrictions.phrases"); - + g_hFwd_OnClientRestricted = CreateGlobalForward("EW_OnClientRestricted", ET_Ignore, Param_Cell, Param_Cell, Param_Cell); g_hFwd_OnClientUnrestricted = CreateGlobalForward("EW_OnClientUnrestricted", ET_Ignore, Param_Cell, Param_Cell); - + g_hCookie_RestrictIssued = RegClientCookie("EW_RestrictIssued", "", CookieAccess_Private); g_hCookie_RestrictLength = RegClientCookie("EW_RestrictLength", "", CookieAccess_Private); g_hCookie_RestrictExpire = RegClientCookie("EW_RestrictExpire", "", CookieAccess_Private); - + RegAdminCmd("sm_eban", Command_ClientRestrict, ADMFLAG_BAN); RegAdminCmd("sm_eunban", Command_ClientUnrestrict, ADMFLAG_UNBAN); } @@ -102,18 +102,18 @@ public Action Command_ClientRestrict(int client, int args) CReplyToCommand(client, "\x07%s[entWatch] \x07%sUsage: sm_eban <#userid/name> [duration]", "E01B5D", "F16767"); return Plugin_Handled; } - + char sTarget[32]; char sLength[32]; GetCmdArg(1, sTarget, sizeof(sTarget)); GetCmdArg(2, sLength, sizeof(sLength)); - + int target; if ((target = FindTarget(client, sTarget, true)) == -1) return Plugin_Handled; - + int length = StringToInt(sLength); - + if (ClientRestrict(client, target, length)) { if (length) @@ -127,7 +127,7 @@ public Action Command_ClientRestrict(int client, int args) LogAction(client, target, "%L restricted %L permanently.", client, target); } } - + return Plugin_Handled; } @@ -141,20 +141,20 @@ public Action Command_ClientUnrestrict(int client, int args) CReplyToCommand(client, "\x07%s[entWatch] \x07%sUsage: sm_eunban <#userid/name>", "E01B5D", "F16767"); return Plugin_Handled; } - + char sTarget[32]; GetCmdArg(1, sTarget, sizeof(sTarget)); - + int target; if ((target = FindTarget(client, sTarget, true)) == -1) return Plugin_Handled; - + if (ClientUnrestrict(client, target)) { CPrintToChatAll("\x07%s[entWatch] \x07%s%N\x07%s unrestricted \x07%s%N\x07%s.", "E01B5D", "EDEDED", client, "F16767", "EDEDED", target, "F16767"); LogAction(client, target, "%L unrestricted %L.", client, target); } - + return Plugin_Handled; } @@ -181,25 +181,25 @@ stock bool ClientRestrict(int client, int target, int length) { if (!Client_IsValid(client) || !Client_IsValid(target) || !AreClientCookiesCached(target) || ClientRestricted(target)) return false; - + int issued = GetTime(); int second = length * 60; int expire = issued + second; - + g_iRestrictIssued[target] = issued; g_iRestrictLength[target] = length; g_iRestrictExpire[target] = expire; - + SetClientCookieInt(target, g_hCookie_RestrictIssued, issued); SetClientCookieInt(target, g_hCookie_RestrictLength, length); SetClientCookieInt(target, g_hCookie_RestrictExpire, expire); - + Call_StartForward(g_hFwd_OnClientRestricted); Call_PushCell(client); Call_PushCell(target); Call_PushCell(length); Call_Finish(); - + return true; } @@ -210,20 +210,20 @@ stock bool ClientUnrestrict(int client, int target) { if (!Client_IsValid(client) || !Client_IsValid(target) || !AreClientCookiesCached(target) || !ClientRestricted(target)) return false; - + g_iRestrictIssued[target] = 0; g_iRestrictLength[target] = 0; g_iRestrictExpire[target] = 0; - + SetClientCookieInt(target, g_hCookie_RestrictIssued, 0); SetClientCookieInt(target, g_hCookie_RestrictLength, 0); SetClientCookieInt(target, g_hCookie_RestrictExpire, 0); - + Call_StartForward(g_hFwd_OnClientUnrestricted); Call_PushCell(client); Call_PushCell(target); Call_Finish(); - + return true; } @@ -234,19 +234,19 @@ stock bool ClientRestricted(int client) { if (!Client_IsValid(client)) return false; - + //Block them when loading cookies.. if (!AreClientCookiesCached(client)) return true; - + //Permanent restriction.. if (g_iRestrictExpire[client] && g_iRestrictLength[client] == 0) return true; - + //Limited restriction.. if (g_iRestrictExpire[client] && g_iRestrictExpire[client] >= GetTime()) return true; - + return false; } @@ -281,7 +281,7 @@ stock void SetClientCookieInt(int client, Handle hCookie, int value) { char sValue[32]; IntToString(value, sValue, sizeof(sValue)); - + SetClientCookie(client, hCookie, sValue); } @@ -292,6 +292,6 @@ stock int GetClientCookieInt(int client, Handle hCookie) { char sValue[32]; GetClientCookie(client, hCookie, sValue, sizeof(sValue)); - + return StringToInt(sValue); } \ No newline at end of file diff --git a/_entWatch4/scripting/include/entWatch_core.inc b/_entWatch4/scripting/include/entWatch_core.inc index 70296a55..b160d8cc 100644 --- a/_entWatch4/scripting/include/entWatch_core.inc +++ b/_entWatch4/scripting/include/entWatch_core.inc @@ -8,7 +8,7 @@ public SharedPlugin __pl_entWatch_core = { name = "entWatch-core", file = "entWatch-core.smx", - + #if defined REQUIRE_PLUGIN required = 1 #else diff --git a/_entWatch4/scripting/include/entWatch_restrictions.inc b/_entWatch4/scripting/include/entWatch_restrictions.inc index fb2147ef..cf6569e7 100644 --- a/_entWatch4/scripting/include/entWatch_restrictions.inc +++ b/_entWatch4/scripting/include/entWatch_restrictions.inc @@ -8,7 +8,7 @@ public SharedPlugin __pl_entWatch_core = { name = "entWatch-restrictions", file = "entWatch-restrictions.smx", - + #if defined REQUIRE_PLUGIN required = 1 #else diff --git a/custom-chatcolors/scripting/include/ccc.inc b/custom-chatcolors/scripting/include/ccc.inc index e59c6533..da632fc8 100644 --- a/custom-chatcolors/scripting/include/ccc.inc +++ b/custom-chatcolors/scripting/include/ccc.inc @@ -23,69 +23,69 @@ enum CCC_ColorType { /** * Gets a client's color as a hexadecimal integer. - * + * * @param client Client index * @param type Color type to retreive * @param alpha Pass a boolean variable by reference here and it will be true if the color has alpha specified or false if it doesn't (or is a stock color) * @return Color as a hexadecimal integer (use %X in formatting to get a hexadecimal string) - * + * * On error/errors: Invalid client index or client is not in game */ native int CCC_GetColor(int client, CCC_ColorType type, bool &alpha = false); /** * Sets a client's color as a hexadecimal integer. - * + * * @param client Client index * @param type Color type to set * @param color Integer representation of the color (use StringToInt(input, 16) to convert a hexadecimal string) or one of the color defines * @param alpha Are you specifying a color with alpha? * @return True if the color is updated successfully, false otherwise - * + * * On error/errors: Invalid client index or client is not in game */ native int CCC_SetColor(int client, CCC_ColorType type, int color, bool alpha); /** * Gets a client's tag - * + * * @param client Client index * @param buffer Buffer to store the tag in * @param maxlen Maximum buffer length * @noreturn - * + * * On error/errors: Invalid client index or client is not in game */ native int CCC_GetTag(int client, char[] buffer, int maxlen); /** * Sets a client's tag - * + * * @param client Client index * @param tag String containing the new tag * @noreturn - * + * * On error/errors: Invalid client index or client is not in game */ native void CCC_SetTag(int client, const char[] tag); /** * Resets a client's color to the value in the config file. - * + * * @param client Client index * @param type Color type to restore * @noreturn - * + * * On error/errors: Invalid client index or client is not in game */ native int CCC_ResetColor(int client, CCC_ColorType type); /** * Resets a client's tag to the value in the config file. - * + * * @param client Client index * @noreturn - * + * * On error/errors: Invalid client index or client is not in game */ native int CCC_ResetTag(int client); @@ -93,7 +93,7 @@ native int CCC_ResetTag(int client); /** * Called when a cilent's name is about to be colored * DO NOT START A NEW USERMESSAGE (i.e. PrintToChat, PrintToChatAll) WITHIN THIS FORWARD - * + * * @param client Client index * @return Plugin_Handled to prevent coloring, Plugin_Continue to allow coloring */ @@ -103,7 +103,7 @@ native int CCC_ResetTag(int client); /** * Called when a client's chat is about to be colored * DO NOT START A NEW USERMESSAGE (i.e. PrintToChat, PrintToChatAll) WITHIN THIS FORWARD - * + * * @param client Client index * @return Plugin_Handled to prevent coloring, Plugin_Continue to allow coloring */ @@ -113,7 +113,7 @@ native int CCC_ResetTag(int client); /** * Called when a client's name is about to be tagged * DO NOT START A NEW USERMESSAGE (i.e. PrintToChat, PrintToChatAll) WITHIN THIS FORWARD - * + * * @param client Client index * @return Plugin_Handled to prevent tagging, Plugin_Continue to allow tagging */ @@ -123,7 +123,7 @@ native int CCC_ResetTag(int client); /** * Called when a client's name is about to be tagged * DO NOT START A NEW USERMESSAGE (i.e. PrintToChat, PrintToChatAll) WITHIN THIS FORWARD - * + * * @param client Client index * @param message Chat message that will be printed * @param type What type of color will be applied. If this is CCC_TagColor, it controls whether the tag will be applied at all, not whether the tag will be colored. @@ -133,7 +133,7 @@ native int CCC_ResetTag(int client); /** * Called when a message has been fully colored and will be sent, unless further plugins modify it through Simple Chat Processor - * + * * @param client Recieving client index * @param author Author client index * @param message Message @@ -144,7 +144,7 @@ forward Action CCC_OnChatMessage(int client, int author, const char[] message); /** * Called when a client's colors and tag are about to be loaded from the config file * At this point, the client has NO COLORS - * + * * @param client Client index * @return Plugin_Handled or Plugin_Stop to prevent loading, Plugin_Continue or Plugin_Changed to allow */ @@ -152,7 +152,7 @@ forward Action CCC_OnUserConfigPreLoaded(int client); /** * Called when a client's colors and tag have been loaded from the config file - * + * * @param client Client index * @noreturn */ @@ -160,14 +160,14 @@ forward void CCC_OnUserConfigLoaded(int client); /** * Called when the configuration file is reloaded with the sm_reloadccc command - * + * * @noreturn */ forward void CCC_OnConfigReloaded(); native int CCC_UpdateIgnoredArray(bool IgnoredArray[(MAXPLAYERS + 1) * (MAXPLAYERS + 1)]); -public SharedPlugin __pl_ccc = +public SharedPlugin __pl_ccc = { name = "ccc", file = "custom-chatcolors.smx", diff --git a/includes/SteamWorks.inc b/includes/SteamWorks.inc index 7c4b2d40..146cd5fe 100644 --- a/includes/SteamWorks.inc +++ b/includes/SteamWorks.inc @@ -15,7 +15,7 @@ enum EUserHasLicenseForAppResult enum EResult { k_EResultOK = 1, // success - k_EResultFail = 2, // generic failure + k_EResultFail = 2, // generic failure k_EResultNoConnection = 3, // no/failed network connection // k_EResultNoConnectionRetry = 4, // OBSOLETE - removed k_EResultInvalidPassword = 5, // password/ticket is invalid @@ -80,8 +80,8 @@ enum EResult k_EResultCannotUseOldPassword = 64, // The requested new password is not legal k_EResultInvalidLoginAuthCode = 65, // account login denied due to auth code invalid k_EResultAccountLogonDeniedNoMail = 66, // account login denied due to 2nd factor auth failure - and no mail has been sent - k_EResultHardwareNotCapableOfIPT = 67, // - k_EResultIPTInitError = 68, // + k_EResultHardwareNotCapableOfIPT = 67, // + k_EResultIPTInitError = 68, // k_EResultParentalControlRestricted = 69, // operation failed due to parental control restrictions for current user k_EResultFacebookQueryError = 70, // Facebook query returned an error k_EResultExpiredLoginAuthCode = 71, // account login denied due to auth code expired @@ -105,7 +105,7 @@ enum EHTTPMethod k_EHTTPMethodDELETE, k_EHTTPMethodOPTIONS, - // The remaining HTTP methods are not yet supported, per rfc2616 section 5.1.1 only GET and HEAD are required for + // The remaining HTTP methods are not yet supported, per rfc2616 section 5.1.1 only GET and HEAD are required for // a compliant general purpose server. We'll likely add more as we find uses for them. // k_EHTTPMethodTRACE, @@ -258,7 +258,7 @@ forward SteamWorks_TokenRequested(String:sToken[], maxlen); forward SteamWorks_OnClientGroupStatus(authid, groupid, bool:isMember, bool:isOfficer); -public Extension:__ext_SteamWorks = +public Extension:__ext_SteamWorks = { name = "SteamWorks", file = "SteamWorks.ext", diff --git a/includes/dhooks.inc b/includes/dhooks.inc index 1224c130..54aaf5de 100644 --- a/includes/dhooks.inc +++ b/includes/dhooks.inc @@ -95,7 +95,7 @@ typeset ListenCB { //Deleted function void (int entity); - + //Created function void (int entity, const char[] classname); }; @@ -108,42 +108,42 @@ typeset DHookCallback { //Function Example: void Ham::Test() with this pointer ignore function MRESReturn (); - + //Function Example: void Ham::Test() with this pointer passed function MRESReturn (int pThis); - + //Function Example: void Ham::Test(int cake) with this pointer ignore function MRESReturn (Handle hParams); - + //Function Example: void Ham::Test(int cake) with this pointer passed function MRESReturn (int pThis, Handle hParams); - + //Function Example: int Ham::Test() with this pointer ignore function MRESReturn (Handle hReturn); - + //Function Example: int Ham::Test() with this pointer passed function MRESReturn (int pThis, Handle hReturn); - + //Function Example: int Ham::Test(int cake) with this pointer ignore function MRESReturn (Handle hReturn, Handle hParams); - + //Function Example: int Ham::Test(int cake) with this pointer passed function MRESReturn (int pThis, Handle hReturn, Handle hParams); - + //Address NOW - + //Function Example: void Ham::Test() with this pointer passed function MRESReturn (Address pThis); - + //Function Example: void Ham::Test(int cake) with this pointer passed function MRESReturn (Address pThis, Handle hParams); - + //Function Example: int Ham::Test() with this pointer passed function MRESReturn (Address pThis, Handle hReturn); - + //Function Example: int Ham::Test(int cake) with this pointer passed function MRESReturn (Address pThis, Handle hReturn, Handle hParams); - + }; /* Adds an entity listener hook @@ -171,7 +171,7 @@ native bool DHookRemoveEntityListener(ListenType type, ListenCB callback); * @param returntype Type type of return * @param thistype Type of this pointer or ignore (ignore can be used if not needed) * @param callback Callback function - * + * * @return Returns setup handle for the hook or INVALID_HANDLE. */ native Handle DHookCreate(int offset, HookType hooktype, ReturnType returntype, ThisPointerType thistype, DHookCallback callback); @@ -182,7 +182,7 @@ native Handle DHookCreate(int offset, HookType hooktype, ReturnType returntype, * @param type Param type * @param size Used for Objects (not Object ptr) to define the size of the object. * @param flag Used to change the pass type. - * + * * @error Invalid setup handle or too many params added (request upping the max in thread) * @noreturn */ @@ -190,170 +190,170 @@ native void DHookAddParam(Handle setup, HookParamType type, int size=-1, DHookPa //native DHookAddParam(Handle:setup, HookParamType:type); /* Hook entity - * + * * @param setup Setup handle to use to add the hook. * @param post True to make the hook a post hook. (If you need to change the retunr value or need the return value use a post hook! If you need to change params and return use a pre and post hook!) * @param entity Entity index to hook on. * @param removalcb Callback for when the hook is removed (Entity hooks are auto-removed on entity destroyed and will call this callback) - * + * * @error Invalid setup handle, invalid entity or invalid hook type. * @return -1 on fail a hookid on success */ native int DHookEntity(Handle setup, bool post, int entity, DHookRemovalCB removalcb=INVALID_FUNCTION); /* Hook gamerules - * + * * @param setup Setup handle to use to add the hook. * @param post True to make the hook a post hook. (If you need to change the retunr value or need the return value use a post hook! If you need to change params and return use a pre and post hook!) * @param removalcb Callback for when the hook is removed (Game rules hooks are auto-removed on map end and will call this callback) - * + * * @error Invalid setup handle, failing to get gamerules pointer or invalid hook type. * @return -1 on fail a hookid on success */ native int DHookGamerules(Handle setup, bool post, DHookRemovalCB removalcb=INVALID_FUNCTION); /* Hook a raw pointer - * + * * @param setup Setup handle to use to add the hook. * @param post True to make the hook a post hook. (If you need to change the retunr value or need the return value use a post hook! If you need to change params and return use a pre and post hook!) * @param addr This pointer address. * @param removalcb Callback for when the hook is removed (Entity hooks are auto-removed on entity destroyed and will call this callback) - * + * * @error Invalid setup handle, invalid address or invalid hook type. * @return -1 on fail a hookid on success */ native int DHookRaw(Handle setup, bool post, Address addr, DHookRemovalCB removalcb=INVALID_FUNCTION); /* Remove hook by hook id - * + * * @param hookid Hook id to remove - * + * * @return true on success false otherwise * @note This will not fire the removal callback! */ native bool DHookRemoveHookID(int hookid); /* Get param value (Only use for: int, entity, bool or float param types) - * + * * @param hParams Handle to params structure * @param num Param number to get. (Example if the function has 2 params and you need the value of the first param num would be 1. 0 Will return the number of params stored) - * + * * @error Invalid handle. Invalid param number. Invalid param type. * @return value if num greater than 0. If 0 returns paramcount. */ native any DHookGetParam(Handle hParams, int num); /* Get vector param value - * + * * @param hParams Handle to params structure * @param num Param number to get. (Example if the function has 2 params and you need the value of the first param num would be 1.) * @param vec Vector buffer to store result. - * + * * @error Invalid handle. Invalid param number. Invalid param type. * @noreturn */ native void DHookGetParamVector(Handle hParams, int num, float vec[3]); /* Get string param value - * + * * @param hParams Handle to params structure * @param num Param number to get. (Example if the function has 2 params and you need the value of the first param num would be 1.) * @param buffer String buffer to store result * @param size Buffer size - * + * * @error Invalid handle. Invalid param number. Invalid param type. * @noreturn */ native void DHookGetParamString(Handle hParams, int num, char[] buffer, int size); /* Set param value (Only use for: int, entity, bool or float param types) - * + * * @param hParams Handle to params structure * @params num Param number to set (Example if the function has 2 params and you need to set the value of the first param num would be 1.) * @param value Value to set it as (only pass int, bool, float or entity index) - * + * * @error Invalid handle. Invalid param number. Invalid param type. * @noreturn */ native void DHookSetParam(Handle hParams, int num, any value); /* Set vector param value - * + * * @param hParams Handle to params structure * @params num Param number to set (Example if the function has 2 params and you need to set the value of the first param num would be 1.) * @param vec Value to set vector as. - * + * * @error Invalid handle. Invalid param number. Invalid param type. * @noreturn */ native void DHookSetParamVector(Handle hParams, int num, float vec[3]); /* Set string param value - * + * * @param hParams Handle to params structure * @params num Param number to set (Example if the function has 2 params and you need to set the value of the first param num would be 1.) * @param value Value to set string as. - * + * * @error Invalid handle. Invalid param number. Invalid param type. * @noreturn */ native void DHookSetParamString(Handle hParams, int num, char[] value); /* Get return value (Only use for: int, entity, bool or float return types) - * + * * @param hReturn Handle to return structure - * + * * @error Invalid Handle, invalid type. * @return Returns default value if prehook returns actual value if post hook. */ native any DHookGetReturn(Handle hReturn); /* Get return vector value - * + * * @param hReturn Handle to return structure * @param vec Vector buffer to store result in. (In pre hooks will be default value (0.0,0.0,0.0)) - * + * * @error Invalid Handle, invalid type. * @noreturn */ native void DHookGetReturnVector(Handle hReturn, float vec[3]); /* Get return string value - * + * * @param hReturn Handle to return structure * @param buffer String buffer to store result in. (In pre hooks will be default value "") * @param size String buffer size - * + * * @error Invalid Handle, invalid type. * @noreturn */ native void DHookGetReturnString(Handle hReturn, char[] buffer, int size); /* Set return value (Only use for: int, entity, bool or float return types) - * + * * @param hReturn Handle to return structure * @param value Value to set return as - * + * * @error Invalid Handle, invalid type. * @noreturn */ native void DHookSetReturn(Handle hReturn, any value); /* Set return vector value - * + * * @param hReturn Handle to return structure * @param vec Value to set return vector as - * + * * @error Invalid Handle, invalid type. * @noreturn */ native void DHookSetReturnVector(Handle hReturn, float vec[3]); /* Set return string value - * + * * @param hReturn Handle to return structure * @param value Value to set return string as - * + * * @error Invalid Handle, invalid type. * @noreturn */ diff --git a/includes/multicolors.inc b/includes/multicolors.inc index e3d31c88..64ebc4c0 100644 --- a/includes/multicolors.inc +++ b/includes/multicolors.inc @@ -91,14 +91,14 @@ stock void CPrintToChatObservers(int target, const char[] message, any ...) if (!g_bCFixColors) CFixColors(); - + for(int client = 1; client <= MaxClients; client++) { if(IsClientInGame(client) && !IsPlayerAlive(client) && !IsFakeClient(client)) { int observee = GetEntPropEnt(client, Prop_Send, "m_hObserverTarget"); int ObserverMode = GetEntProp(client, Prop_Send, "m_iObserverMode"); - + if(observee == target && (ObserverMode == 4 || ObserverMode == 5)) { CPrintToChat(client, buffer); @@ -125,7 +125,7 @@ stock void CPrintToChatEx(int client, int author, const char[] message, any ...) if (!g_bCFixColors) CFixColors(); - + if (!IsSource2009()) C_PrintToChatEx(client, author, "%s", buffer); else @@ -170,14 +170,14 @@ stock void CPrintToChatObserversEx(int target, const char[] message, any ...) if (!g_bCFixColors) CFixColors(); - + for(int client = 1; client <= MaxClients; client++) { if(IsClientInGame(client) && !IsPlayerAlive(client) && !IsFakeClient(client)) { int observee = GetEntPropEnt(client, Prop_Send, "m_hObserverTarget"); int ObserverMode = GetEntProp(client, Prop_Send, "m_iObserverMode"); - + if(observee == target && (ObserverMode == 4 || ObserverMode == 5)) { CPrintToChatEx(client, target, buffer); @@ -189,7 +189,7 @@ stock void CPrintToChatObserversEx(int target, const char[] message, any ...) /** * Replies to a command with colors - * + * * @param client Client to reply to * @param message Message (formatting rules) * @noreturn @@ -212,7 +212,7 @@ stock void CReplyToCommand(int author, const char[] message, any ...) /** * Replies to a command with colors - * + * * @param client Client to reply to * @param author Client to use for {teamcolor} * @param message Message (formatting rules) @@ -236,12 +236,12 @@ stock void CReplyToCommand(int author, const char[] message, any ...) /** - * Displays usage of an admin command to users depending on the - * setting of the sm_show_activity cvar. + * Displays usage of an admin command to users depending on the + * setting of the sm_show_activity cvar. * - * This version does not display a message to the originating client - * if used from chat triggers or menus. If manual replies are used - * for these cases, then this function will suffice. Otherwise, + * This version does not display a message to the originating client + * if used from chat triggers or menus. If manual replies are used + * for these cases, then this function will suffice. Otherwise, * CShowActivity2() is slightly more useful. * Supports color tags. * @@ -295,7 +295,7 @@ stock void CShowActivityEx(int author, const char[] tag, const char[] message, a /** * Displays usage of an admin command to users depending on the setting of the sm_show_activity cvar. - * All users receive a message in their chat text, except for the originating client, + * All users receive a message in their chat text, except for the originating client, * who receives the message based on the current ReplySource. * Supports color tags. * @@ -339,7 +339,7 @@ stock void CFormatColor(char[] message, int maxlength, int author = -1) { if (author == 0) author = -1; - + C_Format(message, maxlength, author); } else @@ -355,7 +355,7 @@ stock void CFormatColor(char[] message, int maxlength, int author = -1) /** * Removes color tags from a message - * + * * @param message Message to remove tags from * @param maxlen Maximum buffer length * @noreturn diff --git a/includes/multicolors/colors.inc b/includes/multicolors/colors.inc index 17bf1b18..0cf750af 100644 --- a/includes/multicolors/colors.inc +++ b/includes/multicolors/colors.inc @@ -5,13 +5,13 @@ * Version: 2.0.0-MC * * * **************************************************************************/ - + #if defined _colors_included #endinput #endif #define _colors_included - + #define MAX_MESSAGE_LENGTH 250 #define MAX_COLORS 18 @@ -62,27 +62,27 @@ static Handle sm_show_activity = null; * @param client Client index. * @param szMessage Message (formatting rules). * @return No return - * + * * On error/Errors: If the client is not connected an error will be thrown. */ stock void C_PrintToChat(int client, const char[] szMessage, any ...) { if (client <= 0 || client > MaxClients) ThrowError("Invalid client index %d", client); - + if (!IsClientInGame(client)) ThrowError("Client %d is not in game", client); - + char szBuffer[MAX_MESSAGE_LENGTH]; char szCMessage[MAX_MESSAGE_LENGTH]; SetGlobalTransTarget(client); - + Format(szBuffer, sizeof(szBuffer), "\x01%s", szMessage); VFormat(szCMessage, sizeof(szCMessage), szBuffer, 3); - + int index = C_Format(szCMessage, sizeof(szCMessage)); - + if (index == NO_INDEX) PrintToChat(client, "%s", szCMessage); else @@ -98,7 +98,7 @@ stock void C_PrintToChat(int client, const char[] szMessage, any ...) * @param szMessage Formatting rules. * @param ... Variable number of format parameters. * @return No return - * + * * On error/Errors: If the client is not connected or invalid. */ stock void C_ReplyToCommand(int client, const char[] szMessage, any ...) @@ -106,7 +106,7 @@ stock void C_ReplyToCommand(int client, const char[] szMessage, any ...) char szCMessage[MAX_MESSAGE_LENGTH]; SetGlobalTransTarget(client); VFormat(szCMessage, sizeof(szCMessage), szMessage, 3); - + if (client == 0) { C_RemoveTags(szCMessage, sizeof(szCMessage)); @@ -133,7 +133,7 @@ stock void C_ReplyToCommand(int client, const char[] szMessage, any ...) * @param szMessage Formatting rules. * @param ... Variable number of format parameters. * @return No return - * + * * On error/Errors: If the client is not connected or invalid. */ stock void C_ReplyToCommandEx(int client, int author, const char[] szMessage, any ...) @@ -141,7 +141,7 @@ stock void C_ReplyToCommandEx(int client, int author, const char[] szMessage, an char szCMessage[MAX_MESSAGE_LENGTH]; SetGlobalTransTarget(client); VFormat(szCMessage, sizeof(szCMessage), szMessage, 4); - + if (client == 0) { C_RemoveTags(szCMessage, sizeof(szCMessage)); @@ -169,17 +169,17 @@ stock void C_ReplyToCommandEx(int client, int author, const char[] szMessage, an stock void C_PrintToChatAll(const char[] szMessage, any ...) { char szBuffer[MAX_MESSAGE_LENGTH]; - + MuCo_LoopClients(i) { if (i > 0 && IsClientInGame(i) && !IsFakeClient(i) && !C_SkipList[i]) { SetGlobalTransTarget(i); VFormat(szBuffer, sizeof(szBuffer), szMessage, 2); - + C_PrintToChat(i, "%s", szBuffer); } - + C_SkipList[i] = false; } } @@ -192,30 +192,30 @@ stock void C_PrintToChatAll(const char[] szMessage, any ...) * @param author Author index whose color will be used for teamcolor tag. * @param szMessage Message (formatting rules). * @return No return - * + * * On error/Errors: If the client or author are not connected an error will be thrown. */ stock void C_PrintToChatEx(int client, int author, const char[] szMessage, any ...) { if (client <= 0 || client > MaxClients) ThrowError("Invalid client index %d", client); - + if (!IsClientInGame(client)) ThrowError("Client %d is not in game", client); - + if (author < 0 || author > MaxClients) ThrowError("Invalid client index %d", author); - + char szBuffer[MAX_MESSAGE_LENGTH]; char szCMessage[MAX_MESSAGE_LENGTH]; SetGlobalTransTarget(client); - + Format(szBuffer, sizeof(szBuffer), "\x01%s", szMessage); VFormat(szCMessage, sizeof(szCMessage), szBuffer, 4); - + int index = C_Format(szCMessage, sizeof(szCMessage), author); - + if (index == NO_INDEX) PrintToChat(client, "%s", szCMessage); else @@ -229,29 +229,29 @@ stock void C_PrintToChatEx(int client, int author, const char[] szMessage, any . * @param author Author index whos color will be used for teamcolor tag. * @param szMessage Message (formatting rules). * @return No return - * + * * On error/Errors: If the author is not connected an error will be thrown. */ stock void C_PrintToChatAllEx(int author, const char[] szMessage, any ...) { if (author < 0 || author > MaxClients) ThrowError("Invalid client index %d", author); - + if (!IsClientInGame(author)) ThrowError("Client %d is not in game", author); - + char szBuffer[MAX_MESSAGE_LENGTH]; - + MuCo_LoopClients(i) { if (i > 0 && IsClientInGame(i) && !IsFakeClient(i) && !C_SkipList[i]) { SetGlobalTransTarget(i); VFormat(szBuffer, sizeof(szBuffer), szMessage, 3); - + C_PrintToChatEx(i, author, "%s", szBuffer); } - + C_SkipList[i] = false; } } @@ -266,7 +266,7 @@ stock void C_RemoveTags(char[] szMessage, int maxlength) { for (int i = 0; i < MAX_COLORS; i++) ReplaceString(szMessage, maxlength, C_Tag[i], "", false); - + ReplaceString(szMessage, maxlength, "{teamcolor}", "", false); } @@ -281,10 +281,10 @@ stock bool C_ColorAllowed(C_Colors color) if (!C_EventIsHooked) { C_SetupProfile(); - + C_EventIsHooked = true; } - + return C_Profile_Colors[color]; } @@ -301,13 +301,13 @@ stock void C_ReplaceColor(C_Colors color, C_Colors newColor) if (!C_EventIsHooked) { C_SetupProfile(); - + C_EventIsHooked = true; } - + C_Profile_Colors[color] = C_Profile_Colors[newColor]; C_Profile_TeamIndex[color] = C_Profile_TeamIndex[newColor]; - + C_TagReqSayText2[color] = C_TagReqSayText2[newColor]; Format(C_TagCode[color], sizeof(C_TagCode[]), C_TagCode[newColor]); } @@ -318,7 +318,7 @@ stock void C_ReplaceColor(C_Colors color, C_Colors newColor) * to those funcions to skip specified client when printing * message to all clients. After message is printed client will * no more be skipped. - * + * * @param client Client index * @return No return */ @@ -326,7 +326,7 @@ stock void C_SkipNextClient(int client) { if (client <= 0 || client > MaxClients) ThrowError("Invalid client index %d", client); - + C_SkipList[client] = true; } @@ -336,7 +336,7 @@ stock void C_SkipNextClient(int client) * @param szMessage String. * @param maxlength Maximum length of the string buffer. * @return Client index that can be used for SayText2 author index - * + * * On error/Errors: If there is more then one team color is used an error will be thrown. */ stock int C_Format(char[] szMessage, int maxlength, int author = NO_INDEX) @@ -346,25 +346,25 @@ stock int C_Format(char[] szMessage, int maxlength, int author = NO_INDEX) { C_SetupProfile(); HookEvent("server_spawn", C_Event_MapStart, EventHookMode_PostNoCopy); - + C_EventIsHooked = true; } - + int iRandomPlayer = NO_INDEX; - + // On CS:GO set invisible precolor - if (GetEngineVersion() == Engine_CSGO) + if (GetEngineVersion() == Engine_CSGO) { Format(szMessage, maxlength, " %s", szMessage); } - + /* If author was specified replace {teamcolor} tag */ if (author != NO_INDEX) { if (C_Profile_SayText2) { ReplaceString(szMessage, maxlength, "{teamcolor}", "\x03", false); - + iRandomPlayer = author; } /* If saytext2 is not supported by game replace {teamcolor} with green tag */ @@ -373,18 +373,18 @@ stock int C_Format(char[] szMessage, int maxlength, int author = NO_INDEX) } else ReplaceString(szMessage, maxlength, "{teamcolor}", "", false); - + /* For other color tags we need a loop */ for (int i = 0; i < MAX_COLORS; i++) { /* If tag not found - skip */ if (StrContains(szMessage, C_Tag[i], false) == -1) continue; - + /* If tag is not supported by game replace it with green tag */ else if (!C_Profile_Colors[i]) ReplaceString(szMessage, maxlength, C_Tag[i], C_TagCode[Color_Green], false); - + /* If tag doesn't need saytext2 simply replace */ else if (!C_TagReqSayText2[i]) ReplaceString(szMessage, maxlength, C_Tag[i], C_TagCode[i], false); @@ -395,16 +395,16 @@ stock int C_Format(char[] szMessage, int maxlength, int author = NO_INDEX) /* If saytext2 is not supported by game replace tag with green tag */ if (!C_Profile_SayText2) ReplaceString(szMessage, maxlength, C_Tag[i], C_TagCode[Color_Green], false); - + /* Game supports saytext2 */ - else + else { /* If random player for tag wasn't specified replace tag and find player */ if (iRandomPlayer == NO_INDEX) { /* Searching for valid client for tag */ iRandomPlayer = C_FindRandomPlayerByTeam(C_Profile_TeamIndex[i]); - + /* If player not found replace tag with green color tag */ if (iRandomPlayer == NO_PLAYER) ReplaceString(szMessage, maxlength, C_Tag[i], C_TagCode[Color_Green], false); @@ -412,7 +412,7 @@ stock int C_Format(char[] szMessage, int maxlength, int author = NO_INDEX) /* If player was found simply replace */ else ReplaceString(szMessage, maxlength, C_Tag[i], C_TagCode[i], false); - + } /* If found another team color tag throw error */ else @@ -421,10 +421,10 @@ stock int C_Format(char[] szMessage, int maxlength, int author = NO_INDEX) ThrowError("Using two team colors in one message is not allowed"); } } - + } } - + return iRandomPlayer; } @@ -444,7 +444,7 @@ stock int C_FindRandomPlayerByTeam(int color_team) { if (i > 0 && IsClientInGame(i) && GetClientTeam(i) == color_team) return i; - } + } } return NO_PLAYER; @@ -461,8 +461,8 @@ stock int C_FindRandomPlayerByTeam(int color_team) stock void C_SayText2(int client, int author, const char[] szMessage) { Handle hBuffer = StartMessageOne("SayText2", client, USERMSG_RELIABLE|USERMSG_BLOCKHOOKS); - - if(GetFeatureStatus(FeatureType_Native, "GetUserMessageType") == FeatureStatus_Available && GetUserMessageType() == UM_Protobuf) + + if(GetFeatureStatus(FeatureType_Native, "GetUserMessageType") == FeatureStatus_Available && GetUserMessageType() == UM_Protobuf) { PbSetInt(hBuffer, "ent_idx", author); PbSetBool(hBuffer, "chat", true); @@ -478,12 +478,12 @@ stock void C_SayText2(int client, int author, const char[] szMessage) BfWriteByte(hBuffer, true); BfWriteString(hBuffer, szMessage); } - + EndMessage(); } /** - * Creates game color profile + * Creates game color profile * This function must be edited if you want to add more games support * * @return No return. @@ -491,7 +491,7 @@ stock void C_SayText2(int client, int author, const char[] szMessage) stock void C_SetupProfile() { EngineVersion engine = GetEngineVersion(); - + if (engine == Engine_CSS) { C_Profile_Colors[Color_Lightgreen] = true; @@ -540,7 +540,7 @@ stock void C_SetupProfile() C_Profile_Colors[Color_Lightgreen] = true; C_Profile_Colors[Color_Red] = true; C_Profile_Colors[Color_Blue] = true; - C_Profile_Colors[Color_Olive] = true; + C_Profile_Colors[Color_Olive] = true; C_Profile_TeamIndex[Color_Lightgreen] = SERVER_INDEX; C_Profile_TeamIndex[Color_Red] = 3; C_Profile_TeamIndex[Color_Blue] = 2; @@ -590,18 +590,18 @@ stock void C_SetupProfile() public Action C_Event_MapStart(Event event, const char[] name, bool dontBroadcast) { C_SetupProfile(); - + MuCo_LoopClients(i) C_SkipList[i] = false; } /** - * Displays usage of an admin command to users depending on the - * setting of the sm_show_activity cvar. + * Displays usage of an admin command to users depending on the + * setting of the sm_show_activity cvar. * - * This version does not display a message to the originating client - * if used from chat triggers or menus. If manual replies are used - * for these cases, then this function will suffice. Otherwise, + * This version does not display a message to the originating client + * if used from chat triggers or menus. If manual replies are used + * for these cases, then this function will suffice. Otherwise, * C_ShowActivity2() is slightly more useful. * Supports color tags. * @@ -615,14 +615,14 @@ stock int C_ShowActivity(int client, const char[] format, any ...) { if (sm_show_activity == null) sm_show_activity = FindConVar("sm_show_activity"); - + char tag[] = "[SM] "; - + char szBuffer[MAX_MESSAGE_LENGTH]; //char szCMessage[MAX_MESSAGE_LENGTH]; int value = GetConVarInt(sm_show_activity); ReplySource replyto = GetCmdReplySource(); - + char name[MAX_NAME_LENGTH] = "Console"; char sign[MAX_NAME_LENGTH] = "ADMIN"; bool display_in_chat = false; @@ -630,7 +630,7 @@ stock int C_ShowActivity(int client, const char[] format, any ...) { if (client < 0 || client > MaxClients || !IsClientConnected(client)) ThrowError("Client index %d is invalid", client); - + GetClientName(client, name, sizeof(name)); AdminId id = GetUserAdmin(client); if (id == INVALID_ADMIN_ID @@ -638,13 +638,13 @@ stock int C_ShowActivity(int client, const char[] format, any ...) { sign = "PLAYER"; } - + /* Display the message to the client? */ if (replyto == SM_REPLY_TO_CONSOLE) { SetGlobalTransTarget(client); VFormat(szBuffer, sizeof(szBuffer), format, 3); - + C_RemoveTags(szBuffer, sizeof(szBuffer)); PrintToConsole(client, "%s%s\n", tag, szBuffer); display_in_chat = true; @@ -654,16 +654,16 @@ stock int C_ShowActivity(int client, const char[] format, any ...) { SetGlobalTransTarget(LANG_SERVER); VFormat(szBuffer, sizeof(szBuffer), format, 3); - + C_RemoveTags(szBuffer, sizeof(szBuffer)); PrintToServer("%s%s\n", tag, szBuffer); } - + if (!value) { return 1; } - + MuCo_LoopClients(i) { if (i == 0 @@ -688,7 +688,7 @@ stock int C_ShowActivity(int client, const char[] format, any ...) newsign = name; } VFormat(szBuffer, sizeof(szBuffer), format, 3); - + C_PrintToChatEx(i, client, "%s%s: %s", tag, newsign, szBuffer); } } @@ -707,12 +707,12 @@ stock int C_ShowActivity(int client, const char[] format, any ...) newsign = name; } VFormat(szBuffer, sizeof(szBuffer), format, 3); - + C_PrintToChatEx(i, client, "%s%s: %s", tag, newsign, szBuffer); } } } - + return 1; } @@ -731,12 +731,12 @@ stock int C_ShowActivityEx(int client, const char[] tag, const char[] format, an { if (sm_show_activity == null) sm_show_activity = FindConVar("sm_show_activity"); - + char szBuffer[MAX_MESSAGE_LENGTH]; //char szCMessage[MAX_MESSAGE_LENGTH]; int value = GetConVarInt(sm_show_activity); ReplySource replyto = GetCmdReplySource(); - + char name[MAX_NAME_LENGTH] = "Console"; char sign[MAX_NAME_LENGTH] = "ADMIN"; bool display_in_chat = false; @@ -744,7 +744,7 @@ stock int C_ShowActivityEx(int client, const char[] tag, const char[] format, an { if (client < 0 || client > MaxClients || !IsClientConnected(client)) ThrowError("Client index %d is invalid", client); - + GetClientName(client, name, sizeof(name)); AdminId id = GetUserAdmin(client); if (id == INVALID_ADMIN_ID @@ -752,13 +752,13 @@ stock int C_ShowActivityEx(int client, const char[] tag, const char[] format, an { sign = "PLAYER"; } - + /* Display the message to the client? */ if (replyto == SM_REPLY_TO_CONSOLE) { SetGlobalTransTarget(client); VFormat(szBuffer, sizeof(szBuffer), format, 4); - + C_RemoveTags(szBuffer, sizeof(szBuffer)); PrintToConsole(client, "%s%s\n", tag, szBuffer); display_in_chat = true; @@ -768,16 +768,16 @@ stock int C_ShowActivityEx(int client, const char[] tag, const char[] format, an { SetGlobalTransTarget(LANG_SERVER); VFormat(szBuffer, sizeof(szBuffer), format, 4); - + C_RemoveTags(szBuffer, sizeof(szBuffer)); PrintToServer("%s%s\n", tag, szBuffer); } - + if (!value) { return 1; } - + MuCo_LoopClients(i) { if (i == 0 @@ -802,7 +802,7 @@ stock int C_ShowActivityEx(int client, const char[] tag, const char[] format, an newsign = name; } VFormat(szBuffer, sizeof(szBuffer), format, 4); - + C_PrintToChatEx(i, client, "%s%s: %s", tag, newsign, szBuffer); } } @@ -821,18 +821,18 @@ stock int C_ShowActivityEx(int client, const char[] tag, const char[] format, an newsign = name; } VFormat(szBuffer, sizeof(szBuffer), format, 4); - + C_PrintToChatEx(i, client, "%s%s: %s", tag, newsign, szBuffer); } } } - + return 1; } /** * Displays usage of an admin command to users depending on the setting of the sm_show_activity cvar. - * All users receive a message in their chat text, except for the originating client, + * All users receive a message in their chat text, except for the originating client, * who receives the message based on the current ReplySource. * Supports color tags. * @@ -847,19 +847,19 @@ stock int C_ShowActivity2(int client, const char[] tag, const char[] format, any { if (sm_show_activity == null) sm_show_activity = FindConVar("sm_show_activity"); - + char szBuffer[MAX_MESSAGE_LENGTH]; //char szCMessage[MAX_MESSAGE_LENGTH]; int value = GetConVarInt(sm_show_activity); // ReplySource replyto = GetCmdReplySource(); - + char name[MAX_NAME_LENGTH] = "Console"; char sign[MAX_NAME_LENGTH] = "ADMIN"; if (client != 0) { if (client < 0 || client > MaxClients || !IsClientConnected(client)) ThrowError("Client index %d is invalid", client); - + GetClientName(client, name, sizeof(name)); AdminId id = GetUserAdmin(client); if (id == INVALID_ADMIN_ID @@ -867,30 +867,30 @@ stock int C_ShowActivity2(int client, const char[] tag, const char[] format, any { sign = "PLAYER"; } - + SetGlobalTransTarget(client); VFormat(szBuffer, sizeof(szBuffer), format, 4); - - /* We don't display directly to the console because the chat text - * simply gets added to the console, so we don't want it to print + + /* We don't display directly to the console because the chat text + * simply gets added to the console, so we don't want it to print * twice. - */ + */ C_PrintToChatEx(client, client, "%s%s", tag, szBuffer); } else { SetGlobalTransTarget(LANG_SERVER); VFormat(szBuffer, sizeof(szBuffer), format, 4); - + C_RemoveTags(szBuffer, sizeof(szBuffer)); PrintToServer("%s%s\n", tag, szBuffer); } - + if (!value) { return 1; } - + MuCo_LoopClients(i) { if (i == 0 @@ -915,7 +915,7 @@ stock int C_ShowActivity2(int client, const char[] tag, const char[] format, any newsign = name; } VFormat(szBuffer, sizeof(szBuffer), format, 4); - + C_PrintToChatEx(i, client, "%s%s: %s", tag, newsign, szBuffer); } } @@ -934,11 +934,11 @@ stock int C_ShowActivity2(int client, const char[] tag, const char[] format, any newsign = name; } VFormat(szBuffer, sizeof(szBuffer), format, 4); - + C_PrintToChatEx(i, client, "%s%s: %s", tag, newsign, szBuffer); } } } - - return 1; + + return 1; } diff --git a/includes/multicolors/morecolors.inc b/includes/multicolors/morecolors.inc index ecf74136..9b7e51e8 100644 --- a/includes/multicolors/morecolors.inc +++ b/includes/multicolors/morecolors.inc @@ -29,11 +29,11 @@ static Handle sm_show_activity = INVALID_HANDLE; /** * Prints a message to a specific client in the chat area. * Supports color tags. - * + * * @param client Client index. * @param message Message (formatting rules). * @noreturn - * + * * On error/Errors: If the client is not connected an error will be thrown. */ stock void MC_PrintToChat(int client, const char[] message, any ...) { @@ -55,7 +55,7 @@ stock void MC_PrintToChat(int client, const char[] message, any ...) { /** * Prints a message to all clients in the chat area. * Supports color tags. - * + * * @param client Client index. * @param message Message (formatting rules). * @noreturn @@ -79,12 +79,12 @@ stock void MC_PrintToChatAll(const char[] message, any ...) { /** * Prints a message to a specific client in the chat area. * Supports color tags and teamcolor tag. - * + * * @param client Client index. * @param author Author index whose color will be used for teamcolor tag. * @param message Message (formatting rules). * @noreturn - * + * * On error/Errors: If the client or author are not connected an error will be thrown */ stock void MC_PrintToChatEx(int client, int author, const char[] message, any ...) { @@ -116,7 +116,7 @@ stock void MC_PrintToChatEx(int client, int author, const char[] message, any .. * @param author Author index whose color will be used for teamcolor tag. * @param message Message (formatting rules). * @noreturn - * + * * On error/Errors: If the author is not connected an error will be thrown. */ stock void MC_PrintToChatAllEx(int author, const char[] message, any ...) { @@ -143,7 +143,7 @@ stock void MC_PrintToChatAllEx(int author, const char[] message, any ...) { /** * Sends a SayText2 usermessage - * + * * @param client Client to send usermessage to * @param message Message to send * @noreturn @@ -191,7 +191,7 @@ stock void MC_SendMessage(int client, const char[] message, int author = 0) { * MC_PrintToChatAll or MC_PrintToChatAllEx. It causes those functions * to skip the specified client when printing the message. * After printing the message, the client will no longer be skipped. - * + * * @param client Client index * @noreturn */ @@ -204,7 +204,7 @@ stock void MC_SkipNextClient(int client) { /** * Checks if the colors trie is initialized and initializes it if it's not (used internally) - * + * * @return No return */ stock void MC_CheckTrie() { @@ -221,7 +221,7 @@ stock void MC_CheckTrie() { * @param removeTags Optional boolean value to determine whether we're replacing tags with colors, or just removing tags, used by MC_RemoveTags * @param maxlen Optional value for max buffer length, used by MC_RemoveTags * @noreturn - * + * * On error/Errors: If the client index passed for author is invalid or not in game. */ stock void MC_ReplaceColorCodes(char[] buffer, int author = 0, bool removeTags = false, int maxlen = MAX_BUFFER_LENGTH) { @@ -243,12 +243,12 @@ stock void MC_ReplaceColorCodes(char[] buffer, int author = 0, bool removeTags = } int cursor = 0; int value; - char tag[32], buff[32]; + char tag[32], buff[32]; char[] output = new char[maxlen]; - + strcopy(output, maxlen, buffer); // Since the string's size is going to be changing, output will hold the replaced string and we'll search buffer - + Handle regex = CompileRegex("{[a-zA-Z0-9]+}"); for(int i = 0; i < 1000; i++) { // The RegEx extension is quite flaky, so we have to loop here :/. This loop is supposed to be infinite and broken by return, but conditions have been added to be safe. if(MatchRegex(regex, buffer[cursor]) < 1) { @@ -262,11 +262,11 @@ stock void MC_ReplaceColorCodes(char[] buffer, int author = 0, bool removeTags = strcopy(buff, sizeof(buff), tag); ReplaceString(buff, sizeof(buff), "{", ""); ReplaceString(buff, sizeof(buff), "}", ""); - + if(!GetTrieValue(MC_Trie, buff, value)) { continue; } - + if(removeTags) { ReplaceString(output, maxlen, tag, "", false); } else { @@ -279,7 +279,7 @@ stock void MC_ReplaceColorCodes(char[] buffer, int author = 0, bool removeTags = /** * Gets a part of a string - * + * * @param input String to get the part from * @param output Buffer to write to * @param maxlen Max length of output buffer @@ -301,7 +301,7 @@ stock void CSubString(const char[] input, char[] output, int maxlen, int start, /** * Converts a string to lowercase - * + * * @param buffer String to convert * @noreturn */ @@ -334,7 +334,7 @@ stock bool MC_AddColor(const char[] name, int color) { /** * Removes color tags from a message - * + * * @param message Message to remove tags from * @param maxlen Maximum buffer length * @noreturn @@ -345,7 +345,7 @@ stock void MC_RemoveTags(char[] message, int maxlen) { /** * Replies to a command with colors - * + * * @param client Client to reply to * @param message Message (formatting rules) * @noreturn @@ -364,7 +364,7 @@ stock void MC_ReplyToCommand(int client, const char[] message, any ...) { /** * Replies to a command with colors - * + * * @param client Client to reply to * @param author Client to use for {teamcolor} * @param message Message (formatting rules) @@ -383,12 +383,12 @@ stock void MC_ReplyToCommandEx(int client, int author, const char[] message, any } /** - * Displays usage of an admin command to users depending on the - * setting of the sm_show_activity cvar. + * Displays usage of an admin command to users depending on the + * setting of the sm_show_activity cvar. * - * This version does not display a message to the originating client - * if used from chat triggers or menus. If manual replies are used - * for these cases, then this function will suffice. Otherwise, + * This version does not display a message to the originating client + * if used from chat triggers or menus. If manual replies are used + * for these cases, then this function will suffice. Otherwise, * MC_ShowActivity2() is slightly more useful. * Supports color tags. * @@ -402,14 +402,14 @@ stock int MC_ShowActivity(int client, const char[] format, any ...) { if (sm_show_activity == INVALID_HANDLE) sm_show_activity = FindConVar("sm_show_activity"); - + char tag[] = "[SM] "; - + char szBuffer[MC_MAX_MESSAGE_LENGTH]; //char szCMessage[MC_MAX_MESSAGE_LENGTH]; int value = GetConVarInt(sm_show_activity); ReplySource replyto = GetCmdReplySource(); - + char name[MAX_NAME_LENGTH] = "Console"; char sign[MAX_NAME_LENGTH] = "ADMIN"; bool display_in_chat = false; @@ -417,7 +417,7 @@ stock int MC_ShowActivity(int client, const char[] format, any ...) { if (client < 0 || client > MaxClients || !IsClientConnected(client)) ThrowError("Client index %d is invalid", client); - + GetClientName(client, name, sizeof(name)); AdminId id = GetUserAdmin(client); if (id == INVALID_ADMIN_ID @@ -425,13 +425,13 @@ stock int MC_ShowActivity(int client, const char[] format, any ...) { sign = "PLAYER"; } - + /* Display the message to the client? */ if (replyto == SM_REPLY_TO_CONSOLE) { SetGlobalTransTarget(client); VFormat(szBuffer, sizeof(szBuffer), format, 3); - + MC_RemoveTags(szBuffer, sizeof(szBuffer)); PrintToConsole(client, "%s%s\n", tag, szBuffer); display_in_chat = true; @@ -441,16 +441,16 @@ stock int MC_ShowActivity(int client, const char[] format, any ...) { SetGlobalTransTarget(LANG_SERVER); VFormat(szBuffer, sizeof(szBuffer), format, 3); - + MC_RemoveTags(szBuffer, sizeof(szBuffer)); PrintToServer("%s%s\n", tag, szBuffer); } - + if (!value) { return 1; } - + MuCo_LoopClients(i) { if (i == 0 @@ -475,7 +475,7 @@ stock int MC_ShowActivity(int client, const char[] format, any ...) newsign = name; } VFormat(szBuffer, sizeof(szBuffer), format, 3); - + MC_PrintToChatEx(i, client, "%s%s: %s", tag, newsign, szBuffer); } } @@ -494,12 +494,12 @@ stock int MC_ShowActivity(int client, const char[] format, any ...) newsign = name; } VFormat(szBuffer, sizeof(szBuffer), format, 3); - + MC_PrintToChatEx(i, client, "%s%s: %s", tag, newsign, szBuffer); } } } - + return 1; } @@ -518,12 +518,12 @@ stock int MC_ShowActivityEx(int client, const char[] tag, const char[] format, a { if (sm_show_activity == INVALID_HANDLE) sm_show_activity = FindConVar("sm_show_activity"); - + char szBuffer[MC_MAX_MESSAGE_LENGTH]; //char szCMessage[MC_MAX_MESSAGE_LENGTH]; int value = GetConVarInt(sm_show_activity); ReplySource replyto = GetCmdReplySource(); - + char name[MAX_NAME_LENGTH] = "Console"; char sign[MAX_NAME_LENGTH] = "ADMIN"; bool display_in_chat = false; @@ -531,7 +531,7 @@ stock int MC_ShowActivityEx(int client, const char[] tag, const char[] format, a { if (client < 0 || client > MaxClients || !IsClientConnected(client)) ThrowError("Client index %d is invalid", client); - + GetClientName(client, name, sizeof(name)); AdminId id = GetUserAdmin(client); if (id == INVALID_ADMIN_ID @@ -539,13 +539,13 @@ stock int MC_ShowActivityEx(int client, const char[] tag, const char[] format, a { sign = "PLAYER"; } - + /* Display the message to the client? */ if (replyto == SM_REPLY_TO_CONSOLE) { SetGlobalTransTarget(client); VFormat(szBuffer, sizeof(szBuffer), format, 4); - + MC_RemoveTags(szBuffer, sizeof(szBuffer)); PrintToConsole(client, "%s%s\n", tag, szBuffer); display_in_chat = true; @@ -555,16 +555,16 @@ stock int MC_ShowActivityEx(int client, const char[] tag, const char[] format, a { SetGlobalTransTarget(LANG_SERVER); VFormat(szBuffer, sizeof(szBuffer), format, 4); - + MC_RemoveTags(szBuffer, sizeof(szBuffer)); PrintToServer("%s%s\n", tag, szBuffer); } - + if (!value) { return 1; } - + MuCo_LoopClients(i) { if (i == 0 @@ -589,7 +589,7 @@ stock int MC_ShowActivityEx(int client, const char[] tag, const char[] format, a newsign = name; } VFormat(szBuffer, sizeof(szBuffer), format, 4); - + MC_PrintToChatEx(i, client, "%s%s: %s", tag, newsign, szBuffer); } } @@ -608,18 +608,18 @@ stock int MC_ShowActivityEx(int client, const char[] tag, const char[] format, a newsign = name; } VFormat(szBuffer, sizeof(szBuffer), format, 4); - + MC_PrintToChatEx(i, client, "%s%s: %s", tag, newsign, szBuffer); } } } - + return 1; } /** * Displays usage of an admin command to users depending on the setting of the sm_show_activity cvar. - * All users receive a message in their chat text, except for the originating client, + * All users receive a message in their chat text, except for the originating client, * who receives the message based on the current ReplySource. * Supports color tags. * @@ -634,19 +634,19 @@ stock int MC_ShowActivity2(int client, const char[] tag, const char[] format, an { if (sm_show_activity == INVALID_HANDLE) sm_show_activity = FindConVar("sm_show_activity"); - + char szBuffer[MC_MAX_MESSAGE_LENGTH]; //char szCMessage[MC_MAX_MESSAGE_LENGTH]; int value = GetConVarInt(sm_show_activity); // ReplySource replyto = GetCmdReplySource(); - + char name[MAX_NAME_LENGTH] = "Console"; char sign[MAX_NAME_LENGTH] = "ADMIN"; if (client != 0) { if (client < 0 || client > MaxClients || !IsClientConnected(client)) ThrowError("Client index %d is invalid", client); - + GetClientName(client, name, sizeof(name)); AdminId id = GetUserAdmin(client); if (id == INVALID_ADMIN_ID @@ -654,12 +654,12 @@ stock int MC_ShowActivity2(int client, const char[] tag, const char[] format, an { sign = "PLAYER"; } - + SetGlobalTransTarget(client); VFormat(szBuffer, sizeof(szBuffer), format, 4); - - /* We don't display directly to the console because the chat text - * simply gets added to the console, so we don't want it to print + + /* We don't display directly to the console because the chat text + * simply gets added to the console, so we don't want it to print * twice. */ MC_PrintToChatEx(client, client, "%s%s", tag, szBuffer); @@ -668,16 +668,16 @@ stock int MC_ShowActivity2(int client, const char[] tag, const char[] format, an { SetGlobalTransTarget(LANG_SERVER); VFormat(szBuffer, sizeof(szBuffer), format, 4); - + MC_RemoveTags(szBuffer, sizeof(szBuffer)); PrintToServer("%s%s\n", tag, szBuffer); } - + if (!value) { return 1; } - + MuCo_LoopClients(i) { if (i == 0 @@ -702,7 +702,7 @@ stock int MC_ShowActivity2(int client, const char[] tag, const char[] format, an newsign = name; } VFormat(szBuffer, sizeof(szBuffer), format, 4); - + MC_PrintToChatEx(i, client, "%s%s: %s", tag, newsign, szBuffer); } } @@ -721,18 +721,18 @@ stock int MC_ShowActivity2(int client, const char[] tag, const char[] format, an newsign = name; } VFormat(szBuffer, sizeof(szBuffer), format, 4); - + MC_PrintToChatEx(i, client, "%s%s: %s", tag, newsign, szBuffer); } } } - - return 1; + + return 1; } /** * Determines whether a color name exists - * + * * @param color The color name to check * @return True if the color exists, false otherwise */ diff --git a/includes/zr_grenade_effects.inc b/includes/zr_grenade_effects.inc index 3bebf126..80e3fd0c 100644 --- a/includes/zr_grenade_effects.inc +++ b/includes/zr_grenade_effects.inc @@ -1,48 +1,48 @@ -/** - * Called when a player is about to be freezed by a grenade - * - * @param client The victim index - * @param attacker The client index who threw the grenade - * @param duration The freeze duration, set by reference - * @return Plugin_Changed to apply new values, Plugin_Contninue to allow as is and >= Plugin_Handled to block - */ -forward Action:ZR_OnClientFreeze(client, attacker, &Float:duration); +/** + * Called when a player is about to be freezed by a grenade + * + * @param client The victim index + * @param attacker The client index who threw the grenade + * @param duration The freeze duration, set by reference + * @return Plugin_Changed to apply new values, Plugin_Contninue to allow as is and >= Plugin_Handled to block + */ +forward Action:ZR_OnClientFreeze(client, attacker, &Float:duration); -/** - * Called when a player has been freezed by a grenade - * - * @param client The victim index - * @param attacker The client index who threw the grenade - * @param duration The freeze duration - * @noreturn - */ -forward ZR_OnClientFreezed(client, attacker, Float:duration); +/** + * Called when a player has been freezed by a grenade + * + * @param client The victim index + * @param attacker The client index who threw the grenade + * @param duration The freeze duration + * @noreturn + */ +forward ZR_OnClientFreezed(client, attacker, Float:duration); -/** - * Called when a player is about to be ignited by a grenade - * - * @param client The victim index - * @param attacker The client index who threw the grenade - * @param duration The ignite duration, set by reference - * @return Plugin_Changed to apply new values, Plugin_Contninue to allow as is and >= Plugin_Handled to block - */ -forward Action:ZR_OnClientIgnite(client, attacker, &Float:duration); +/** + * Called when a player is about to be ignited by a grenade + * + * @param client The victim index + * @param attacker The client index who threw the grenade + * @param duration The ignite duration, set by reference + * @return Plugin_Changed to apply new values, Plugin_Contninue to allow as is and >= Plugin_Handled to block + */ +forward Action:ZR_OnClientIgnite(client, attacker, &Float:duration); -/** - * Called when a player has been ignited by a grenade - * - * @param client The victim index - * @param attacker The client index who threw the grenade - * @param duration The freeze duration - * @noreturn - */ -forward ZR_OnClientIgnited(client, attacker, Float:duration); +/** + * Called when a player has been ignited by a grenade + * + * @param client The victim index + * @param attacker The client index who threw the grenade + * @param duration The freeze duration + * @noreturn + */ +forward ZR_OnClientIgnited(client, attacker, Float:duration); -/** +/** * Called when a grenade will get his effect - * + * * @param client Client that throw the grenade * @param grenade Grenade index * @return Plugin_Continue to allow as is and Plugin_Handled to block effect in the grenade - */ -forward Action:ZR_OnGrenadeEffect(client, grenade); \ No newline at end of file + */ +forward Action:ZR_OnGrenadeEffect(client, grenade); \ No newline at end of file diff --git a/mapchooser_extended/scripting/include/mapchooser_extended.inc b/mapchooser_extended/scripting/include/mapchooser_extended.inc index 551d3e57..93ee089e 100644 --- a/mapchooser_extended/scripting/include/mapchooser_extended.inc +++ b/mapchooser_extended/scripting/include/mapchooser_extended.inc @@ -12,7 +12,7 @@ * This program is free software; you can redistribute it and/or modify it under * the terms of the GNU General Public License, version 3.0, as published by the * Free Software Foundation. - * + * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more @@ -52,7 +52,7 @@ enum CanNominateResult /** * Called whenever warning timer starts - * + * */ forward void OnMapVoteWarningStart(); @@ -68,7 +68,7 @@ forward void OnMapVoteWarningTick(int time); /** * Called whenever vote starts - * + * * @deprecated Will be removed in MapChooser 1.8. Use OnMapVoteStarted instead. */ forward void OnMapVoteStart(); @@ -81,7 +81,7 @@ forward void OnMapVoteEnd(const char[] map); /** * Is a map on the current game's official list? * This should be treated as informative only. - * + * * @param map Name of map to check * @return true if it's on the list of official maps for this game */ @@ -89,7 +89,7 @@ native bool IsMapOfficial(const char[] map); /** * Is nominate allowed? - * + * * @return A CanNominateResult corresponding to whether a vote is allowed or not */ native CanNominateResult CanNominate(); @@ -97,7 +97,7 @@ native CanNominateResult CanNominate(); /** * Add map to nomination exclude list. * Known as cooldown. - * + * * @param map Name of map * @param cooldown Cooldown, interpretation depends on mode. * @param mode 0: Normal, use cooldown value from config/default. @@ -130,7 +130,7 @@ native int GetMapGroup(const char[] map, char[] group, int size); // >=0 = Group _max -> Group full native int GetMapGroupRestriction(const char[] map, int client = 0); -public SharedPlugin __pl_mapchooser_extended = +public SharedPlugin __pl_mapchooser_extended = { name = "mapchooser", file = "mapchooser_extended.smx", diff --git a/mapchooser_extended/scripting/include/nativevotes.inc b/mapchooser_extended/scripting/include/nativevotes.inc index 9be97909..ff88dae7 100644 --- a/mapchooser_extended/scripting/include/nativevotes.inc +++ b/mapchooser_extended/scripting/include/nativevotes.inc @@ -8,7 +8,7 @@ * This program is free software; you can redistribute it and/or modify it under * the terms of the GNU General Public License, version 3.0, as published by the * Free Software Foundation. - * + * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more @@ -28,7 +28,7 @@ * * Version: $Id$ */ - + #include #include @@ -66,7 +66,7 @@ MenuAction_Display A menu is about to be displayed (param1=client). If you choo MenuAction_Select An item was selected (param1=client, param2=item). For subplugin support. MenuAction_End A vote has fully ended and the vote object is ready to be cleaned up param1 is MenuEnd reason, either MenuEnd_VotingCancelled or MenuEnd_VotingDone -MenuAction_VoteEnd A vote sequence has succeeded (param1=chosen item) +MenuAction_VoteEnd A vote sequence has succeeded (param1=chosen item) This is not called if NativeVotes_SetResultCallback has been used on the vote. You should call NativeVotes_DisplayPass or NativeVotes_DisplayPassEx after this MenuAction_VoteStart A vote sequence has started (nothing passed). Use this instead of MenuAction_Start @@ -181,17 +181,17 @@ enum NativeVotesCallFailType /* * Is a specific vote type supported by this game? - * + * * @param voteType Vote type */ native bool:NativeVotes_IsVoteTypeSupported(NativeVotesType:voteType); /** * Creates a new, empty vote. - * + * * @param handler Function which will receive vote actions. * @param voteType Vote type, cannot be changed after set - * @param actions Optionally set which actions to receive. Start, + * @param actions Optionally set which actions to receive. Start, * Cancel, and End will always be received regardless * of whether they are set or not. They are also * the only default actions. @@ -202,9 +202,9 @@ native Handle:NativeVotes_Create(MenuHandler:handler, NativeVotesType:voteType, /** * Frees all handles related to a vote. - * + * * THIS MUST BE CALLED TO AVOID HANDLE LEAKS - * + * * @param vote Vote handle * @noreturn */ @@ -261,13 +261,13 @@ native NativeVotes_RemoveAllItems(Handle:vote); * @return True on success, false if position is invalid. * @error Invalid Handlem */ -native bool:NativeVotes_GetItem(Handle:vote, - position, - String:infoBuf[], +native bool:NativeVotes_GetItem(Handle:vote, + position, + String:infoBuf[], infoBufLen, String:dispBuf[]="", dispBufLen=0); - + /** * Returns the number of items in a vote. * @@ -325,9 +325,9 @@ native NativeVotes_GetTitle(Handle:vote, String:buffer[], maxlength); /** * Sets the target userid for vote * This should be used instead of SetArgument for votes that target players - * + * * Also sets target SteamID - * + * * @param vote Vote Handle. * @param userid Client index of target player * @param setDetails If true, also sets vote details to client's name @@ -367,7 +367,7 @@ native bool:NativeVotes_IsVoteInProgress(); /** * Returns a style's maximum items - * + * * @return Maximum items */ native NativeVotes_GetMaxItems(); @@ -376,7 +376,7 @@ native NativeVotes_GetMaxItems(); * Sets a vote's option flags. * * If a certain bit is not supported, it will be stripped before being set. - * + * * NOTE: This is currently unused, but reserved for future use. * * @param menu Builtin Vote Handle. @@ -407,11 +407,11 @@ native NativeVotes_Cancel(); /** * Callback for when a vote has ended and results are available. - * + * * Due to SourceMod Forward limitations in plugins, multi-dimension arrays can't be passed * to forwards. This means we have to split the client_info and item_info arrays into * their components. - * + * * @param vote The vote being voted on. * @param num_votes Number of votes tallied in total. * @param num_clients Number of clients who could vote. @@ -433,13 +433,13 @@ typedef NativeVotes_VoteHandler = function int (Handle vote, /** * Function to convert client/vote arrays into their two-dimensional versions, * which can then be passed to a standard vote handler. - * + * * client_info and item_info are the resulting arrays. - * + * * Note: When declaring client_info and item_info, you'll probably want to declare them like this: * new client_info[num_clients][2]; * new item_info[num_items][2]; - * + * * @param num_clients Number of clients who could vote. * @param client_indexes Array of client indexes. Parallel with client_votes. * @param client_votes Array of client votes. Parallel with client_indexes. @@ -457,7 +457,7 @@ stock NativeVotes_FixResults(num_clients, num_items, const item_indexes[], const item_votes[], - client_info[][], + client_info[][], item_info[][]) { for (new i = 0; i < num_clients; ++i) @@ -465,7 +465,7 @@ stock NativeVotes_FixResults(num_clients, client_info[i][VOTEINFO_CLIENT_INDEX] = client_indexes[i]; client_info[i][VOTEINFO_CLIENT_ITEM] = client_votes[i]; } - + for (new i = 0; i < num_items; ++i) { item_info[i][VOTEINFO_ITEM_INDEX] = item_indexes[i]; @@ -494,8 +494,8 @@ native NativeVotes_SetResultCallback(Handle:vote, NativeVotes_VoteHandler:callba native NativeVotes_CheckVoteDelay(); /** - * Returns whether a client is in the pool of clients allowed - * to participate in the current vote. This is determined by + * Returns whether a client is in the pool of clients allowed + * to participate in the current vote. This is determined by * the client list passed to NativeVotes_Display(). * * @param client Client index. @@ -509,16 +509,16 @@ native bool:NativeVotes_IsClientInVotePool(client); * * @param client Client index. * @param revotes True to allow revotes, false otherwise. - * @return True on success, false if the client is in the vote pool + * @return True on success, false if the client is in the vote pool * but cannot vote again. - * @error No vote in progress, client is not in the voting pool, + * @error No vote in progress, client is not in the voting pool, * or client index is invalid. */ native bool:NativeVotes_RedrawClientVote(client, bool:revotes=true); /** * Retrieve the vote type - * + * * @param vote NativeVotes Handle. * @return The built in vote type * @error Invalid Handle @@ -527,9 +527,9 @@ native NativeVotesType:NativeVotes_GetType(Handle:vote); /** * Set the team this vote is for, or NATIVEVOTES_ALL_TEAMS for all teams. - * + * * Defaults to NATIVEVOTES_ALL_TEAMS if not explicitly set. - * + * * @param vote NativeVotes Handle. * @param team Team number this vote is for * @noreturn @@ -539,7 +539,7 @@ native NativeVotes_SetTeam(Handle:vote, team); /** * Retrieve the team this vote is for - * + * * @param vote NativeVotes Handle. * @return Team index or NATIVEVOTES_ALL_TEAMS for all teams. * @error Invalid Handle @@ -549,9 +549,9 @@ native NativeVotes_GetTeam(Handle:vote); /** * Set the client index of the player who initiated the vote. * Use NATIVEVOTES_SERVER_INDEX if initiated by the server itself. - * + * * Defaults to NATIVEVOTES_SERVER_INDEX if not explicitly set. - * + * * @param vote NativeVotes Handle. * @param client Client who initiated the vote or NATIVEVOTES_SERVER_INDEX * @noreturn @@ -560,9 +560,9 @@ native NativeVotes_GetTeam(Handle:vote); native NativeVotes_SetInitiator(Handle:vote, client); /** - * Retrieve the client index of the player who initiated the vote or NATIVEVOTES_SERVER_INDEX if + * Retrieve the client index of the player who initiated the vote or NATIVEVOTES_SERVER_INDEX if * initiated by the server itself. - * + * * @param Vote handle * @return Client index or NATIVEVOTES_SERVER_INDEX * @error Invalid Handle @@ -570,8 +570,8 @@ native NativeVotes_SetInitiator(Handle:vote, client); native NativeVotes_GetInitiator(Handle:vote); /** - * Broadcasts a vote to a list of clients. The most selected item will be - * returned through MenuAction_VoteEnd. On a tie, a random item will be returned + * Broadcasts a vote to a list of clients. The most selected item will be + * returned through MenuAction_VoteEnd. On a tie, a random item will be returned * from a list of the tied items. * * Note that MenuAction_VoteStart, MenuAction_VoteCancel, MenuAction_VoteEnd, and MenuAction_End are all @@ -599,7 +599,7 @@ stock bool:NativeVotes_DisplayToAll(Handle:vote, time) { new total = 0; decl players[MaxClients]; - + for (new i=1; i<=MaxClients; i++) { if (!IsClientInGame(i) || IsFakeClient(i)) @@ -608,7 +608,7 @@ stock bool:NativeVotes_DisplayToAll(Handle:vote, time) } players[total++] = i; } - + return NativeVotes_Display(vote, players, total, time); } @@ -628,7 +628,7 @@ stock bool:NativeVotes_DisplayToTeam(Handle:vote, team, time) new total; decl players[MaxClients]; - + for (new i=1; i<=MaxClients; i++) { if (!IsClientInGame(i) || IsFakeClient(i) || (GetClientTeam(i) != team)) @@ -637,7 +637,7 @@ stock bool:NativeVotes_DisplayToTeam(Handle:vote, team, time) } players[total++] = i; } - + return NativeVotes_Display(vote, players, total, time); } @@ -654,7 +654,7 @@ stock bool:NativeVotes_DisplayToAllNonSpectators(Handle:vote, time) { new total; decl players[MaxClients]; - + for (new i=1; i<=MaxClients; i++) { if (!IsClientInGame(i) || IsFakeClient(i) || (GetClientTeam(i) < 2)) @@ -663,7 +663,7 @@ stock bool:NativeVotes_DisplayToAllNonSpectators(Handle:vote, time) } players[total++] = i; } - + return NativeVotes_Display(vote, players, total, time); } @@ -673,7 +673,7 @@ stock bool:NativeVotes_DisplayToAllNonSpectators(Handle:vote, time) * You MUST call one of the NativeVotesDisplayPass* or NativeVotes_DisplayFail functions * to hide the vote screen for users who didn't vote, and to clear out their selection * for the next vote. - * + * * @param vote Vote handle * @param details Normally the item that won the vote or format string. Also used for custom vote winners * @param ... Variable number of format parameters. @@ -687,7 +687,7 @@ native NativeVotes_DisplayPass(Handle:vote, const String:details[]=""); * You MUST call one of the NativeVotesDisplayPass* or NativeVotes_DisplayFail functions * to hide the vote screen for users who didn't vote, and to clear out their selection * for the next vote. - * + * * @param vote Vote handle * @param client client to display to * @param format A format string. @@ -702,7 +702,7 @@ native NativeVotes_DisplayPassCustomToOne(Handle:vote, client, const String:form * You MUST call one of the NativeVotesDisplayPass* or NativeVotes_DisplayFail functions * to hide the vote screen for users who didn't vote, and to clear out their selection * for the next vote. - * + * * @param vote Vote handle * @param format A format string. * @param any Variable number of format parameters @@ -711,7 +711,7 @@ native NativeVotes_DisplayPassCustomToOne(Handle:vote, client, const String:form stock NativeVotes_DisplayPassCustom(Handle:vote, const String:format[], any:...) { decl String:buffer[192]; - + for (new i = 1; i <= MaxClients; ++i) { if (IsClientInGame(i)) @@ -731,7 +731,7 @@ stock NativeVotes_DisplayPassCustom(Handle:vote, const String:format[], any:...) * You MUST call one of NativeVotes_DisplayPass, NativeVotes_DisplayPassEx, * or NativeVotes_DisplayFail to hide the vote screen for users who didn't vote * and to clear out their selection for the next vote. - * + * * #param vote Vote handle * @param passType The pass screen to display * @param details Normally the item that won the vote. Also used for custom vote winners @@ -745,17 +745,17 @@ native NativeVotes_DisplayPassEx(Handle:vote, NativeVotesPassType:passType, cons * You MUST call one of NativeVotes_DisplayPass, NativeVotes_DisplayPassEx, * or NativeVotes_DisplayFail to hide the vote screen for users who didn't vote, * and to clear out their selection for the next vote. - * + * * @param reason Vote failure reason from NativeVotesFailType enum * @noreturn */ native NativeVotes_DisplayFail(Handle:vote, NativeVotesFailType:reason=NativeVotesFail_Generic); /** - * Quick stock to determine whether voting is allowed. This doesn't let you - * fine-tune a reason for not voting, so it's not recommended for lazily + * Quick stock to determine whether voting is allowed. This doesn't let you + * fine-tune a reason for not voting, so it's not recommended for lazily * telling clients that voting isn't allowed. - * + * * @return True if voting is allowed, false if voting is in progress * or the cooldown is active. */ @@ -765,15 +765,15 @@ stock bool:NativeVotes_IsNewVoteAllowed() { return false; } - + return true; } /** * Used when callvote is called with no arguments. - * + * * This is used to configure the VoteSetup usermessage on TF2 and CS:GO - * + * * @param client Client, in case the votes are restricted by client * @param voteTypes Populate this array with the vote types this server supports * Custom and multiple choice votes are not supported from @@ -787,9 +787,9 @@ stock bool:NativeVotes_IsNewVoteAllowed() /** * Forward for "callvote" handling - * + * * You should respond to this by starting a vote or by calling NativeVotes_DisplayCallVoteFail - * + * * @param client Client * @param voteType Type of vote being called. This will NEVER be a multiple-choice or custom vote. * @param voteArgument Vote argument or blank if the vote type has no argument. @@ -803,7 +803,7 @@ stock bool:NativeVotes_IsNewVoteAllowed() /** * Register a plugin as a vote manager. * This is used to abstract away the details of the callvote command. - * + * * @param callHandler Handler for callvote commands. * @param setupHandler Handler to override the which vote types your server supports. Only useful on TF2 and CS:GO. * @noreturn @@ -814,7 +814,7 @@ stock bool:NativeVotes_IsNewVoteAllowed() * Send a call vote fail screen to a user * Used to respond to a callvote with invalid arguments or for other reasons * (such as trying to target an admin for a kick/ban vote) - * + * * @param client The client to display the fail screen to * @param reason A vote call fail reason * @param time For NativeVotesCallFail_Recent, the number of seconds until the vote @@ -825,7 +825,7 @@ native NativeVotes_DisplayCallVoteFail(client, NativeVotesCallFailType:reason, t /** * Redraws the vote title from inside a MenuAction_Display callback * Not supported on L4D - * + * * @param text Vote title to draw * @error If called from outside MenuAction_Display * @return Plugin_Changed if the change is allowed, Plugin_Continue if it isn't. @@ -835,7 +835,7 @@ native Action:NativeVotes_RedrawVoteTitle(const String:text[]); /** * Redraws the vote text from inside a MenuAction_DisplayItem callback. * Only supported on multiple-choice votes - * + * * @param text Vote text to draw. * @error If called from outside MenuAction_DisplayItem * @return Plugin_Changed if the change is allowed, Plugin_Continue if it isn't. @@ -859,7 +859,7 @@ stock NativeVotes_GetInfo(param2, &winningVotes, &totalVotes) /** * Do not edit below this line! */ -public SharedPlugin:__pl_nativevotes = +public SharedPlugin:__pl_nativevotes = { name = "nativevotes", file = "nativevotes.smx", diff --git a/mapchooser_extended/scripting/mapchooser_extended.sp b/mapchooser_extended/scripting/mapchooser_extended.sp index 0232f79f..2562d1b9 100644 --- a/mapchooser_extended/scripting/mapchooser_extended.sp +++ b/mapchooser_extended/scripting/mapchooser_extended.sp @@ -2327,7 +2327,7 @@ void CheckMapRestrictions(bool time = false, bool players = false) CPrintToChat(client, "[MCE] %t", "Nomination Removed Time Error", map); } } - + if (players) { int PlayerRestriction = InternalGetMapPlayerRestriction(map); diff --git a/sourcebans/scripting/sourcecomms.sp b/sourcebans/scripting/sourcecomms.sp index 27173b21..6c6008d9 100644 --- a/sourcebans/scripting/sourcecomms.sp +++ b/sourcebans/scripting/sourcecomms.sp @@ -1342,7 +1342,7 @@ public Query_UnBlockSelect(Handle:owner, Handle:hndl, const String:error[], any: #endif TempUnBlock(data); // Datapack closed inside. - + switch (type) { case TYPE_UNMUTE: @@ -1358,7 +1358,7 @@ public Query_UnBlockSelect(Handle:owner, Handle:hndl, const String:error[], any: LogAction(admin, target, "\"%L\" temporary unsilenced \"%L\" (reason \"%s\")", admin, target, reason); } } - + return; } else @@ -2385,7 +2385,7 @@ stock ProcessUnBlock(client, targetId = 0, type, String:sReason[] = "", const St TempUnBlock(dataPack); } - + switch (type) { case TYPE_UNMUTE: diff --git a/zr_tools/scripting/include/zr_tools.inc b/zr_tools/scripting/include/zr_tools.inc index f8d6e17a..ed9b8654 100644 --- a/zr_tools/scripting/include/zr_tools.inc +++ b/zr_tools/scripting/include/zr_tools.inc @@ -86,7 +86,7 @@ native bool:ZRT_IsRoundActive(); *********************************** -----------------------------------*/ -public SharedPlugin:__pl_zr_tools = +public SharedPlugin:__pl_zr_tools = { name = "zr_tools", file = "zr_tools.smx", diff --git a/zr_tools/scripting/zr_tools.sp b/zr_tools/scripting/zr_tools.sp index 97a19d88..8da12507 100644 --- a/zr_tools/scripting/zr_tools.sp +++ b/zr_tools/scripting/zr_tools.sp @@ -9,7 +9,7 @@ new Handle:kv; new Handle:hPlayerClasses, String:sClassPath[PLATFORM_MAX_PATH] = "configs/zr/playerclasses.txt"; new bool:g_RoundEnd = false; -public Plugin:myinfo = +public Plugin:myinfo = { name = "[ZR] Tools", author = "FrozDark", @@ -26,18 +26,18 @@ public APLRes:AskPluginLoad2(Handle:myself, bool:late, String:error[], err_max) CreateNative("ZRT_GetClientAttributeValueFloat", Native_GetClientAttributeValueFloat); CreateNative("ZRT_PlayerHasAttribute", Native_PlayerHasAttribute); CreateNative("ZRT_IsRoundActive", Native_IsRoundActive); - + RegPluginLibrary("zr_tools"); - + return APLRes_Success; } public OnPluginStart() { CreateConVar("zr_tools_version", PLUGIN_VERSION, "Zombie:Reloaded tools plugin version", FCVAR_PLUGIN|FCVAR_SPONLY|FCVAR_REPLICATED|FCVAR_NOTIFY|FCVAR_CHEAT|FCVAR_DONTRECORD); - + RegAdminCmd("zr_tools_reload", Command_Reload, ADMFLAG_ROOT); - + HookEvent("round_start", Event_RoundStart); HookEvent("round_end", Event_RoundEnd); } @@ -69,10 +69,10 @@ public OnConfigsExecuted() CloseHandle(kv); } kv = CreateKeyValues("classes"); - + decl String:buffer[PLATFORM_MAX_PATH]; BuildPath(Path_SM, buffer, sizeof(buffer), "%s", sClassPath); - + if (!FileToKeyValues(kv, buffer)) { SetFailState("Class data file \"%s\" not found", buffer); @@ -104,13 +104,13 @@ public Native_PlayerHasAttribute(Handle:plugin, numParams) { new client = GetNativeCell(1); ValidateClient(client); - + decl String:attrib[32]; GetNativeString(2, attrib, sizeof(attrib)); - + decl String:className[64], String:buffer[64]; ZR_GetClassDisplayName(client, className, sizeof(className), ZR_CLASS_CACHE_PLAYER); - + new bool:result = false; if (KvGotoFirstSubKey(kv)) { @@ -120,14 +120,14 @@ public Native_PlayerHasAttribute(Handle:plugin, numParams) if (StrEqual(buffer, className, false)) { KvGetString(kv, attrib, buffer, sizeof(buffer), "0"); - + result = bool:(StrContains("yes|1|true", buffer, false) != -1); break; } } while (KvGotoNextKey(kv)); } KvRewind(kv); - + return result; } @@ -135,14 +135,14 @@ public Native_GetClientAttributeString(Handle:plugin, numParams) { new client = GetNativeCell(1); ValidateClient(client); - + decl String:attrib[32]; GetNativeString(2, attrib, sizeof(attrib)); - + decl String:className[64], String:buffer[PLATFORM_MAX_PATH]; buffer[0] = '\0'; ZR_GetClassDisplayName(client, className, sizeof(className), ZR_CLASS_CACHE_PLAYER); - + new bytes; if (KvGotoFirstSubKey(kv)) { @@ -152,14 +152,14 @@ public Native_GetClientAttributeString(Handle:plugin, numParams) if (StrEqual(buffer, className, false)) { KvGetString(kv, attrib, buffer, sizeof(buffer), ""); - + SetNativeString(3, buffer, GetNativeCell(4), true, bytes); break; } } while (KvGotoNextKey(kv)); } KvRewind(kv); - + if (!buffer[0]) { GetNativeString(5, buffer, sizeof(buffer)); @@ -172,15 +172,15 @@ public Native_GetClientAttributeValue(Handle:plugin, numParams) { new client = GetNativeCell(1); ValidateClient(client); - + decl String:attrib[32]; GetNativeString(2, attrib, sizeof(attrib)); - + decl String:className[64], String:buffer[PLATFORM_MAX_PATH]; ZR_GetClassDisplayName(client, className, sizeof(className), ZR_CLASS_CACHE_PLAYER); - + new result = -1; - + if (KvGotoFirstSubKey(kv)) { do @@ -194,7 +194,7 @@ public Native_GetClientAttributeValue(Handle:plugin, numParams) } while (KvGotoNextKey(kv)); } KvRewind(kv); - + return result; } @@ -202,15 +202,15 @@ public Native_GetClientAttributeValueFloat(Handle:plugin, numParams) { new client = GetNativeCell(1); ValidateClient(client); - + decl String:attrib[32]; GetNativeString(2, attrib, sizeof(attrib)); - + decl String:className[64], String:buffer[PLATFORM_MAX_PATH]; ZR_GetClassDisplayName(client, className, sizeof(className), ZR_CLASS_CACHE_PLAYER); - + new Float:result = -1.0; - + if (KvGotoFirstSubKey(kv)) { do @@ -224,7 +224,7 @@ public Native_GetClientAttributeValueFloat(Handle:plugin, numParams) } while (KvGotoNextKey(kv)); } KvRewind(kv); - + return _:result; } @@ -232,10 +232,10 @@ public Native_GetClientClassSectionName(Handle:plugin, numParams) { new client = GetNativeCell(1); ValidateClient(client); - + decl String:className[64], String:buffer[64]; ZR_GetClassDisplayName(client, className, sizeof(className), ZR_CLASS_CACHE_PLAYER); - + new bytes; if (KvGotoFirstSubKey(kv)) { @@ -245,14 +245,14 @@ public Native_GetClientClassSectionName(Handle:plugin, numParams) if (StrEqual(buffer, className, false)) { KvGetSectionName(kv, buffer, sizeof(buffer)); - + SetNativeString(2, buffer, GetNativeCell(3), true, bytes); break; } } while (KvGotoNextKey(kv)); } KvRewind(kv); - + return bytes; }