From 8cdcb01100f439645aa9d9ab9b1d33007e879b7f Mon Sep 17 00:00:00 2001 From: zaCade Date: Sat, 8 Dec 2018 21:12:39 +0100 Subject: [PATCH] Misc: Move shared stuff to shared git. --- AdminCheats/scripting/AdminCheats.sp | 130 + AdminIcon/scripting/AdminIcon.sp | 73 + .../scripting/AdvancedTargeting.sp | 493 +++ .../scripting/include/AdvancedTargeting.inc | 26 + AntiFlood/scripting/AntiFlood.sp | 71 + AntiJumpSpam/scripting/AntiJumpSpam.sp | 115 + AntiPingMask/scripting/AntiPingMask.sp | 79 + AutoRecorder/scripting/AutoRecorder.sp | 221 ++ .../scripting/ConVarSuppression.sp | 118 + Extend/gamedata/Extend.games.txt | 25 + Extend/scripting/Extend.sp | 387 ++ ExtraCommands/scripting/ExtraCommands.sp | 1377 +++++++ FixAngles/scripting/FixAngles.sp | 47 + FixGameUI/scripting/FixGameUI.sp | 129 + .../gamedata/FixPlayerEquip.games.txt | 14 + FixPlayerEquip/scripting/FixPlayerEquip.sp | 112 + .../gamedata/FixPointTeleport.games.txt | 19 + .../scripting/FixPointTeleport.sp | 101 + Flashlight/scripting/Flashlight.sp | 44 + ForceInputs/scripting/ForceInputs.sp | 206 ++ FullUpdate/gamedata/FullUpdate.games.txt | 20 + FullUpdate/scripting/FullUpdate.sp | 106 + FullUpdate/scripting/include/FullUpdate.inc | 24 + GlowColors/configs/GlowColors.cfg | 18 + GlowColors/scripting/GlowColors.sp | 535 +++ InfoMessage/configs/info_messages/test.txt | 10 + InfoMessage/scripting/InfoMessage.sp | 115 + KnifeAlert/scripting/KnifeAlert.sp | 112 + MapAdmin/configs/MapAdmin.cfg | 3137 ++++++++++++++++ MapAdmin/scripting/MapAdmin.sp | 342 ++ NameFilter/configs/NameFilter.cfg | 21 + NameFilter/scripting/NameFilter.sp | 350 ++ NapalmLagFix/gamedata/napalmlagfix.games.txt | 28 + NapalmLagFix/scripting/NapalmLagFix.sp | 70 + .../gamedata/NoGrenadeRinging.games.txt | 15 + .../scripting/NoGrenadeRinging.sp | 49 + NoShake/scripting/NoShake.sp | 91 + .../scripting/PlayerVisibility.sp | 339 ++ .../configs/PointServerCommandFilter.cfg | 139 + .../PointServerCommandFilter.example.cfg | 74 + .../scripting/PointServerCommandFilter.sp | 592 +++ QuickSwitch/scripting/QuickSwitch.sp | 73 + RoundTime/scripting/RoundTime.sp | 28 + .../ZE_FFVII_Mako_Reactor_V6_B08.cfg | 67 + .../ze_FFVII_Mako_Reactor_v1_4_1.cfg | 49 + .../savelevel/ze_FFVII_Mako_Reactor_v3_1.cfg | 49 + .../savelevel/ze_FFXII_Feywood_b3_1.cfg | 60 + .../savelevel/ze_FFXII_Paramina_Rift_v1_3.cfg | 92 + .../savelevel/ze_FFXII_Paramina_Rift_v1_4.cfg | 92 + .../configs/savelevel/ze_TESV_Skyrim_v3.cfg | 76 + .../savelevel/ze_harry_potter_v1_3.cfg | 76 + .../savelevel/ze_harry_potter_v2_1.cfg | 76 + .../savelevel/ze_lila_panic_escape_v3_1.cfg | 92 + .../ze_lotr_minas_tirith_v2_2fix.cfg | 92 + .../savelevel/ze_lotr_minas_tirith_v3_5.cfg | 92 + .../savelevel/ze_tesv_skyrim_v4fix.cfg | 76 + SaveLevel/scripting/SaveLevel.sp | 521 +++ SelectiveBhop/scripting/SelectiveBhop.sp | 416 +++ .../scripting/include/SelectiveBhop.inc | 26 + SlopeFix/scripting/SlopeFix.sp | 150 + .../materials/decals/spraymanager/1.vmt | 6 + .../materials/decals/spraymanager/1.vtf | Bin 0 -> 8400 bytes .../materials/decals/spraymanager/2.vmt | 6 + .../materials/decals/spraymanager/2.vtf | Bin 0 -> 8400 bytes .../materials/decals/spraymanager/3.vmt | 8 + .../materials/decals/spraymanager/3.vtf | Bin 0 -> 5552 bytes SprayManager/scripting/SprayManager.sp | 3201 +++++++++++++++++ Status/gamedata/serverfps.games.txt | 45 + Status/scripting/Status.sp | 204 ++ Status/scripting/include/serverfps.inc | 49 + StopSound/scripting/StopSound.sp | 693 ++++ .../translations/plugin.stopsound.phrases.txt | 68 + SvGravityFix/scripting/SvGravityFix.sp | 38 + TeamManager/scripting/TeamManager.sp | 206 ++ Teleport/scripting/Teleport.sp | 330 ++ WeaponCleaner/scripting/WeaponCleaner.sp | 305 ++ .../configs/custom-chatcolors.cfg | 59 + .../configs/custom-chatcolorsbans.cfg | 3 + .../configs/custom-chatcolorsreplace.cfg | 67 + .../scripting/custom-chatcolors.sp | 3113 ++++++++++++++++ custom-chatcolors/scripting/include/ccc.inc | 191 + .../translations/allchat.phrases.txt | 58 + entWatch/gamedata/plugin.entWatch.txt | 28 + entWatch/scripting/entWatch.sp | 2644 ++++++++++++++ entWatch/scripting/include/entWatch.inc | 150 + entWatch/translations/entWatch.phrases.txt | 47 + entWatch/translations/fr/entWatch.phrases.txt | 47 + entWatch/translations/ru/entWatch.phrases.txt | 47 + includes/CSSFixes.inc | 30 + includes/SteamWorks.inc | 383 ++ includes/connect.inc | 42 + includes/dhooks.inc | 485 +++ includes/outputinfo.inc | 63 + includes/zombiereloaded.inc | 67 + includes/zr/class.zr.inc | 127 + includes/zr/infect.zr.inc | 133 + includes/zr/respawn.zr.inc | 95 + 97 files changed, 25215 insertions(+) create mode 100644 AdminCheats/scripting/AdminCheats.sp create mode 100644 AdminIcon/scripting/AdminIcon.sp create mode 100644 AdvancedTargeting/scripting/AdvancedTargeting.sp create mode 100644 AdvancedTargeting/scripting/include/AdvancedTargeting.inc create mode 100644 AntiFlood/scripting/AntiFlood.sp create mode 100644 AntiJumpSpam/scripting/AntiJumpSpam.sp create mode 100644 AntiPingMask/scripting/AntiPingMask.sp create mode 100644 AutoRecorder/scripting/AutoRecorder.sp create mode 100644 ConVarSuppression/scripting/ConVarSuppression.sp create mode 100644 Extend/gamedata/Extend.games.txt create mode 100644 Extend/scripting/Extend.sp create mode 100644 ExtraCommands/scripting/ExtraCommands.sp create mode 100644 FixAngles/scripting/FixAngles.sp create mode 100644 FixGameUI/scripting/FixGameUI.sp create mode 100644 FixPlayerEquip/gamedata/FixPlayerEquip.games.txt create mode 100644 FixPlayerEquip/scripting/FixPlayerEquip.sp create mode 100644 FixPointTeleport/gamedata/FixPointTeleport.games.txt create mode 100644 FixPointTeleport/scripting/FixPointTeleport.sp create mode 100644 Flashlight/scripting/Flashlight.sp create mode 100644 ForceInputs/scripting/ForceInputs.sp create mode 100644 FullUpdate/gamedata/FullUpdate.games.txt create mode 100644 FullUpdate/scripting/FullUpdate.sp create mode 100644 FullUpdate/scripting/include/FullUpdate.inc create mode 100644 GlowColors/configs/GlowColors.cfg create mode 100644 GlowColors/scripting/GlowColors.sp create mode 100644 InfoMessage/configs/info_messages/test.txt create mode 100644 InfoMessage/scripting/InfoMessage.sp create mode 100644 KnifeAlert/scripting/KnifeAlert.sp create mode 100644 MapAdmin/configs/MapAdmin.cfg create mode 100644 MapAdmin/scripting/MapAdmin.sp create mode 100644 NameFilter/configs/NameFilter.cfg create mode 100644 NameFilter/scripting/NameFilter.sp create mode 100644 NapalmLagFix/gamedata/napalmlagfix.games.txt create mode 100644 NapalmLagFix/scripting/NapalmLagFix.sp create mode 100644 NoGrenadeRinging/gamedata/NoGrenadeRinging.games.txt create mode 100644 NoGrenadeRinging/scripting/NoGrenadeRinging.sp create mode 100644 NoShake/scripting/NoShake.sp create mode 100644 PlayerVisibility/scripting/PlayerVisibility.sp create mode 100644 PointServerCommandFilter/configs/PointServerCommandFilter.cfg create mode 100644 PointServerCommandFilter/configs/PointServerCommandFilter.example.cfg create mode 100644 PointServerCommandFilter/scripting/PointServerCommandFilter.sp create mode 100644 QuickSwitch/scripting/QuickSwitch.sp create mode 100644 RoundTime/scripting/RoundTime.sp create mode 100644 SaveLevel/configs/savelevel/ZE_FFVII_Mako_Reactor_V6_B08.cfg create mode 100644 SaveLevel/configs/savelevel/ze_FFVII_Mako_Reactor_v1_4_1.cfg create mode 100644 SaveLevel/configs/savelevel/ze_FFVII_Mako_Reactor_v3_1.cfg create mode 100644 SaveLevel/configs/savelevel/ze_FFXII_Feywood_b3_1.cfg create mode 100644 SaveLevel/configs/savelevel/ze_FFXII_Paramina_Rift_v1_3.cfg create mode 100644 SaveLevel/configs/savelevel/ze_FFXII_Paramina_Rift_v1_4.cfg create mode 100644 SaveLevel/configs/savelevel/ze_TESV_Skyrim_v3.cfg create mode 100644 SaveLevel/configs/savelevel/ze_harry_potter_v1_3.cfg create mode 100644 SaveLevel/configs/savelevel/ze_harry_potter_v2_1.cfg create mode 100644 SaveLevel/configs/savelevel/ze_lila_panic_escape_v3_1.cfg create mode 100644 SaveLevel/configs/savelevel/ze_lotr_minas_tirith_v2_2fix.cfg create mode 100644 SaveLevel/configs/savelevel/ze_lotr_minas_tirith_v3_5.cfg create mode 100644 SaveLevel/configs/savelevel/ze_tesv_skyrim_v4fix.cfg create mode 100644 SaveLevel/scripting/SaveLevel.sp create mode 100644 SelectiveBhop/scripting/SelectiveBhop.sp create mode 100644 SelectiveBhop/scripting/include/SelectiveBhop.inc create mode 100644 SlopeFix/scripting/SlopeFix.sp create mode 100644 SprayManager/content/materials/decals/spraymanager/1.vmt create mode 100644 SprayManager/content/materials/decals/spraymanager/1.vtf create mode 100644 SprayManager/content/materials/decals/spraymanager/2.vmt create mode 100644 SprayManager/content/materials/decals/spraymanager/2.vtf create mode 100644 SprayManager/content/materials/decals/spraymanager/3.vmt create mode 100644 SprayManager/content/materials/decals/spraymanager/3.vtf create mode 100644 SprayManager/scripting/SprayManager.sp create mode 100644 Status/gamedata/serverfps.games.txt create mode 100644 Status/scripting/Status.sp create mode 100644 Status/scripting/include/serverfps.inc create mode 100644 StopSound/scripting/StopSound.sp create mode 100644 StopSound/translations/plugin.stopsound.phrases.txt create mode 100644 SvGravityFix/scripting/SvGravityFix.sp create mode 100644 TeamManager/scripting/TeamManager.sp create mode 100644 Teleport/scripting/Teleport.sp create mode 100644 WeaponCleaner/scripting/WeaponCleaner.sp create mode 100644 custom-chatcolors/configs/custom-chatcolors.cfg create mode 100644 custom-chatcolors/configs/custom-chatcolorsbans.cfg create mode 100644 custom-chatcolors/configs/custom-chatcolorsreplace.cfg create mode 100644 custom-chatcolors/scripting/custom-chatcolors.sp create mode 100644 custom-chatcolors/scripting/include/ccc.inc create mode 100644 custom-chatcolors/translations/allchat.phrases.txt create mode 100644 entWatch/gamedata/plugin.entWatch.txt create mode 100644 entWatch/scripting/entWatch.sp create mode 100644 entWatch/scripting/include/entWatch.inc create mode 100644 entWatch/translations/entWatch.phrases.txt create mode 100644 entWatch/translations/fr/entWatch.phrases.txt create mode 100644 entWatch/translations/ru/entWatch.phrases.txt create mode 100644 includes/CSSFixes.inc create mode 100644 includes/SteamWorks.inc create mode 100644 includes/connect.inc create mode 100644 includes/dhooks.inc create mode 100644 includes/outputinfo.inc create mode 100644 includes/zombiereloaded.inc create mode 100644 includes/zr/class.zr.inc create mode 100644 includes/zr/infect.zr.inc create mode 100644 includes/zr/respawn.zr.inc diff --git a/AdminCheats/scripting/AdminCheats.sp b/AdminCheats/scripting/AdminCheats.sp new file mode 100644 index 00000000..36dac769 --- /dev/null +++ b/AdminCheats/scripting/AdminCheats.sp @@ -0,0 +1,130 @@ +#include + +#pragma semicolon 1 +#pragma newdecls required + +#define PLUGIN_VERSION "1.0" +public Plugin myinfo = +{ + name = "AdminCheats", + author = "BotoX", + description = "Allows usage of (most) cheat commands for admins.", + version = PLUGIN_VERSION, + url = "" +}; + +ConVar g_CVar_sv_cheats; + +public void OnPluginStart() +{ + g_CVar_sv_cheats = FindConVar("sv_cheats"); + g_CVar_sv_cheats.Flags &= ~FCVAR_NOTIFY; + g_CVar_sv_cheats.Flags &= ~FCVAR_REPLICATED; + g_CVar_sv_cheats.AddChangeHook(OnConVarChanged); + g_CVar_sv_cheats.SetInt(1); + + MakeCheatCommand("give"); + + int NumHooks = 0; + char sConCommand[128]; + bool IsCommand; + int Flags; + Handle hSearch = FindFirstConCommand(sConCommand, sizeof(sConCommand), IsCommand, Flags); + do + { + if(IsCommand && Flags & FCVAR_CHEAT) + { + AddCommandListener(OnCheatCommand, sConCommand); + NumHooks++; + } + } + while(FindNextConCommand(hSearch, sConCommand, sizeof(sConCommand), IsCommand, Flags)); + + AddCommandListener(OnCheatCommand, "kill"); NumHooks++; + AddCommandListener(OnCheatCommand, "explode"); NumHooks++; + + PrintToServer("Hooked %d cheat commands.", NumHooks); + + UpdateClients(); +} + +public void OnPluginEnd() +{ + g_CVar_sv_cheats.SetInt(0); + g_CVar_sv_cheats.Flags |= FCVAR_NOTIFY; + g_CVar_sv_cheats.Flags |= FCVAR_REPLICATED; +} + +public void OnConVarChanged(ConVar convar, const char[] oldValue, const char[] newValue) +{ + g_CVar_sv_cheats.SetInt(1); + CreateTimer(0.1, Timer_UpdateClients); +} + +public Action Timer_UpdateClients(Handle timer, Handle hndl) +{ + UpdateClients(); +} + +public void UpdateClients() +{ + for(int i = 1; i <= MaxClients; i++) + { + if(IsClientInGame(i) && !IsFakeClient(i) && IsClientAuthorized(i)) + OnClientPostAdminCheck(i); + } +} + +public void OnClientPutInServer(int client) +{ + if(IsFakeClient(client)) + return; + + SendConVarValue(client, g_CVar_sv_cheats, "0"); +} + +public void OnClientPostAdminCheck(int client) +{ + if(IsFakeClient(client)) + return; + + if(g_CVar_sv_cheats.BoolValue && CheckCommandAccess(client, "", ADMFLAG_CHEATS)) + SendConVarValue(client, g_CVar_sv_cheats, "1"); + else + SendConVarValue(client, g_CVar_sv_cheats, "0"); +} + +public Action OnCheatCommand(int client, const char[] command, int argc) +{ + if(client == 0) + return Plugin_Continue; + + if(IsClientAuthorized(client) && CheckCommandAccess(client, "", ADMFLAG_CHEATS)) + return Plugin_Continue; + + if(!argc && (StrEqual(command, "kill") || StrEqual(command, "explode"))) + return Plugin_Continue; + + return Plugin_Handled; +} + +public Action OnPlayerRunCmd(int client, int &buttons, int &impulse, float vel[3], float angles[3], int &weapon, int &subtype, int &cmdnum, int &tickcount, int &seed, int mouse[2]) +{ + if(!impulse) + return Plugin_Continue; + + if(impulse == 100 || impulse == 201) + return Plugin_Continue; + + if(IsClientAuthorized(client) && CheckCommandAccess(client, "", ADMFLAG_CHEATS)) + return Plugin_Continue; + + return Plugin_Handled; +} + +stock void MakeCheatCommand(const char[] name) +{ + int Flags = GetCommandFlags(name); + if(Flags != INVALID_FCVAR_FLAGS) + SetCommandFlags(name, FCVAR_CHEAT | Flags); +} diff --git a/AdminIcon/scripting/AdminIcon.sp b/AdminIcon/scripting/AdminIcon.sp new file mode 100644 index 00000000..8e91798b --- /dev/null +++ b/AdminIcon/scripting/AdminIcon.sp @@ -0,0 +1,73 @@ +#pragma semicolon 1 +#pragma newdecls required + +#include +#include +#include + +bool g_bIsAdmin[MAXPLAYERS + 1] = {false, ...}; + +public Plugin myinfo = +{ + name = "AdminIcon", + author = "BotoX", + description = "Gives admins a defuser.", + version = "1.0", + url = "" +}; + +public void OnPluginStart() +{ + for(int client = 1; client <= MaxClients; client++) + { + g_bIsAdmin[client] = false; + if(IsClientInGame(client) && !IsFakeClient(client) && IsClientAuthorized(client)) + OnClientPostAdminCheck(client); + } +} + +public void OnClientConnected(int client) +{ + g_bIsAdmin[client] = false; +} + +public void OnClientDisconnect(int client) +{ + g_bIsAdmin[client] = false; +} + +public void OnClientPostAdminCheck(int client) +{ + if(IsFakeClient(client)) + return; + + if(GetAdminFlag(GetUserAdmin(client), Admin_Generic)) + g_bIsAdmin[client] = true; +} + +public void OnGameFrame() +{ + for(int client = 1; client <= MaxClients; client++) + { + if(g_bIsAdmin[client]) + { + if(IsClientObserver(client)) + SetEntProp(client, Prop_Send, "m_bHasDefuser", 0); + else + SetEntProp(client, Prop_Send, "m_bHasDefuser", 1); + } + } +} + +public void OnEntityCreated(int entity, const char[] classname) +{ + if(IsValidEntity(entity) && StrEqual(classname, "item_defuser")) + { + SDKHook(entity, SDKHook_Spawn, OnWeaponSpawned); + } +} + +public void OnWeaponSpawned(int entity) +{ + AcceptEntityInput(entity, "Kill"); +} diff --git a/AdvancedTargeting/scripting/AdvancedTargeting.sp b/AdvancedTargeting/scripting/AdvancedTargeting.sp new file mode 100644 index 00000000..130bf0de --- /dev/null +++ b/AdvancedTargeting/scripting/AdvancedTargeting.sp @@ -0,0 +1,493 @@ +#pragma semicolon 1 + +#pragma dynamic 128*1024 + +#include +#include +#include +#include +#include + +#pragma newdecls required + +Handle g_FriendsArray[MAXPLAYERS + 1] = {INVALID_HANDLE, ...}; +bool g_bLateLoad = false; + +#include "SteamAPI.secret" //#define STEAM_API_KEY here + +public Plugin myinfo = +{ + name = "Advanced Targeting", + author = "BotoX + Obus", + description = "Adds extra targeting methods", + version = "1.2", + url = "https://github.com/CSSZombieEscape/sm-plugins/tree/master/AdvancedTargeting/" +} + +public void OnPluginStart() +{ + AddMultiTargetFilter("@admins", Filter_Admin, "Admins", false); + AddMultiTargetFilter("@!admins", Filter_NotAdmin, "Not Admins", false); + AddMultiTargetFilter("@friends", Filter_Friends, "Steam Friends", false); + AddMultiTargetFilter("@!friends", Filter_NotFriends, "Not Steam Friends", false); + AddMultiTargetFilter("@random", Filter_Random, "a Random Player", false); + AddMultiTargetFilter("@randomct", Filter_RandomCT, "a Random CT", false); + AddMultiTargetFilter("@randomt", Filter_RandomT, "a Random T", false); + + RegConsoleCmd("sm_admins", Command_Admins, "Currently online admins."); + RegConsoleCmd("sm_friends", Command_Friends, "Currently online friends."); + + if(g_bLateLoad) + { + char sSteam32ID[32]; + for(int i = 1; i <= MaxClients; i++) + { + if(IsClientInGame(i) && !IsFakeClient(i) && IsClientAuthorized(i) && + GetClientAuthId(i, AuthId_Steam2, sSteam32ID, sizeof(sSteam32ID))) + { + OnClientAuthorized(i, sSteam32ID); + } + } + } +} + +public void OnPluginEnd() +{ + RemoveMultiTargetFilter("@admins", Filter_Admin); + RemoveMultiTargetFilter("@!admins", Filter_NotAdmin); + RemoveMultiTargetFilter("@friends", Filter_Friends); + RemoveMultiTargetFilter("@!friends", Filter_NotFriends); + RemoveMultiTargetFilter("@random", Filter_Random); + RemoveMultiTargetFilter("@randomct", Filter_RandomCT); + RemoveMultiTargetFilter("@randomt", Filter_RandomT); +} + +public APLRes AskPluginLoad2(Handle myself, bool late, char[] error, int err_max) +{ + CreateNative("IsClientFriend", Native_IsClientFriend); + CreateNative("ReadClientFriends", Native_ReadClientFriends); + RegPluginLibrary("AdvancedTargeting"); + + g_bLateLoad = late; + return APLRes_Success; +} + +public Action Command_Admins(int client, int args) +{ + char aBuf[1024]; + char aBuf2[MAX_NAME_LENGTH]; + for(int i = 1; i <= MaxClients; i++) + { + if(IsClientInGame(i) && !IsFakeClient(i) && GetAdminFlag(GetUserAdmin(i), Admin_Generic)) + { + GetClientName(i, aBuf2, sizeof(aBuf2)); + StrCat(aBuf, sizeof(aBuf), aBuf2); + StrCat(aBuf, sizeof(aBuf), ", "); + } + } + + if(strlen(aBuf)) + { + aBuf[strlen(aBuf) - 2] = 0; + ReplyToCommand(client, "[SM] Admins currently online: %s", aBuf); + } + else + ReplyToCommand(client, "[SM] Admins currently online: none"); + + return Plugin_Handled; +} + +public Action Command_Friends(int client, int args) +{ + if(!client) + return Plugin_Handled; + + if(g_FriendsArray[client] == INVALID_HANDLE) + { + PrintToChat(client, "[SM] Could not read your friendslist, your profile must be set to public!"); + return Plugin_Handled; + } + + char aBuf[1024]; + char aBuf2[MAX_NAME_LENGTH]; + for(int i = 1; i <= MaxClients; i++) + { + if(IsClientInGame(i) && !IsFakeClient(i) && IsClientAuthorized(i)) + { + int Steam3ID = GetSteamAccountID(i); + + if(FindValueInArray(g_FriendsArray[client], Steam3ID) != -1) + { + GetClientName(i, aBuf2, sizeof(aBuf2)); + StrCat(aBuf, sizeof(aBuf), aBuf2); + StrCat(aBuf, sizeof(aBuf), ", "); + } + } + } + + if(strlen(aBuf)) + { + aBuf[strlen(aBuf) - 2] = 0; + PrintToChat(client, "[SM] Friends currently online: %s", aBuf); + } + else + PrintToChat(client, "[SM] Friends currently online: none"); + + return Plugin_Handled; +} + +public bool Filter_Admin(const char[] sPattern, Handle hClients, int client) +{ + for(int i = 1; i <= MaxClients; i++) + { + if(IsClientInGame(i) && !IsFakeClient(i) && GetAdminFlag(GetUserAdmin(i), Admin_Generic)) + { + PushArrayCell(hClients, i); + } + } + + return true; +} + +public bool Filter_NotAdmin(const char[] sPattern, Handle hClients, int client) +{ + for(int i = 1; i <= MaxClients; i++) + { + if(IsClientInGame(i) && !IsFakeClient(i) && !GetAdminFlag(GetUserAdmin(i), Admin_Generic)) + { + PushArrayCell(hClients, i); + } + } + + return true; +} + +public bool Filter_Friends(const char[] sPattern, Handle hClients, int client) +{ + if(g_FriendsArray[client] == INVALID_HANDLE) + { + PrintToChat(client, "[SM] Could not read your friendslist, your profile must be set to public!"); + return false; + } + + for(int i = 1; i <= MaxClients; i++) + { + if(i != client && IsClientInGame(i) && !IsFakeClient(i) && IsClientAuthorized(i)) + { + int Steam3ID = GetSteamAccountID(i); + + if(FindValueInArray(g_FriendsArray[client], Steam3ID) != -1) + PushArrayCell(hClients, i); + } + } + + return true; +} + +public bool Filter_NotFriends(const char[] sPattern, Handle hClients, int client) +{ + if(g_FriendsArray[client] == INVALID_HANDLE) + { + PrintToChat(client, "[SM] Could not read your friendslist, your profile must be set to public!"); + return false; + } + + for(int i = 1; i <= MaxClients; i++) + { + if(i != client && IsClientInGame(i) && !IsFakeClient(i) && IsClientAuthorized(i)) + { + int Steam3ID = GetSteamAccountID(i); + + if(FindValueInArray(g_FriendsArray[client], Steam3ID) == -1) + PushArrayCell(hClients, i); + } + } + + return true; +} + +public bool Filter_Random(const char[] sPattern, Handle hClients, int client) +{ + int iRand = GetRandomInt(1, MaxClients); + + if(IsClientInGame(iRand) && IsPlayerAlive(iRand)) + PushArrayCell(hClients, iRand); + else + Filter_Random(sPattern, hClients, client); + + return true; +} + +public bool Filter_RandomCT(const char[] sPattern, Handle hClients, int client) +{ + int iCTCount = GetTeamClientCount(CS_TEAM_CT); + + if(!iCTCount) + return false; + + int[] iCTs = new int[iCTCount]; + + int iCurIndex; + + for(int i = 1; i <= MaxClients; i++) + { + if(!IsClientInGame(i) || GetClientTeam(i) != CS_TEAM_CT) + continue; + + if(!IsPlayerAlive(i)) + { + iCTCount--; + continue; + } + + iCTs[iCurIndex] = i; + iCurIndex++; + } + + PushArrayCell(hClients, iCTs[GetRandomInt(0, iCTCount-1)]); + + return true; +} + +public bool Filter_RandomT(const char[] sPattern, Handle hClients, int client) +{ + int iTCount = GetTeamClientCount(CS_TEAM_T); + + if(!iTCount) + return false; + + int[] iTs = new int[iTCount]; + + int iCurIndex; + + for(int i = 1; i <= MaxClients; i++) + { + if(!IsClientInGame(i) || GetClientTeam(i) != CS_TEAM_T) + continue; + + if(!IsPlayerAlive(i)) + { + iTCount--; + continue; + } + + iTs[iCurIndex] = i; + iCurIndex++; + } + + PushArrayCell(hClients, iTs[GetRandomInt(0, iTCount-1)]); + + return true; +} + +public void OnClientAuthorized(int client, const char[] auth) +{ + if(IsFakeClient(client)) + return; + + char sSteam64ID[32]; + Steam32IDtoSteam64ID(auth, sSteam64ID, sizeof(sSteam64ID)); + + static char sRequest[256]; + FormatEx(sRequest, sizeof(sRequest), "http://api.steampowered.com/ISteamUser/GetFriendList/v0001/?key=%s&steamid=%s&relationship=friend&format=vdf", STEAM_API_KEY, sSteam64ID); + + Handle hRequest = SteamWorks_CreateHTTPRequest(k_EHTTPMethodGET, sRequest); + if (!hRequest || + !SteamWorks_SetHTTPRequestContextValue(hRequest, client) || + !SteamWorks_SetHTTPCallbacks(hRequest, OnTransferComplete) || + !SteamWorks_SendHTTPRequest(hRequest)) + { + CloseHandle(hRequest); + } +} + +public void OnClientDisconnect(int client) +{ + if(g_FriendsArray[client] != INVALID_HANDLE) + CloseHandle(g_FriendsArray[client]); + + g_FriendsArray[client] = INVALID_HANDLE; +} + +public int OnTransferComplete(Handle hRequest, bool bFailure, bool bRequestSuccessful, EHTTPStatusCode eStatusCode, int client) +{ + if(bFailure || !bRequestSuccessful || eStatusCode != k_EHTTPStatusCode200OK) + { + // Private profile or maybe steam down? + //LogError("SteamAPI HTTP Response failed: %d", eStatusCode); + CloseHandle(hRequest); + return; + } + + int Length; + SteamWorks_GetHTTPResponseBodySize(hRequest, Length); + + char[] sData = new char[Length]; + SteamWorks_GetHTTPResponseBodyData(hRequest, sData, Length); + //SteamWorks_GetHTTPResponseBodyCallback(hRequest, APIWebResponse, client); + + CloseHandle(hRequest); + + APIWebResponse(sData, client); +} + +public void APIWebResponse(const char[] sData, int client) +{ + KeyValues Response = new KeyValues("SteamAPIResponse"); + if(!Response.ImportFromString(sData, "SteamAPIResponse")) + { + LogError("ImportFromString(sData, \"SteamAPIResponse\") failed."); + delete Response; + return; + } + + if(!Response.JumpToKey("friends")) + { + LogError("JumpToKey(\"friends\") failed."); + delete Response; + return; + } + + // No friends? + if(!Response.GotoFirstSubKey()) + { + //LogError("GotoFirstSubKey() failed."); + delete Response; + return; + } + + if(g_FriendsArray[client] != INVALID_HANDLE) + CloseHandle(g_FriendsArray[client]); + + g_FriendsArray[client] = CreateArray(); + + char sCommunityID[32]; + do + { + Response.GetString("steamid", sCommunityID, sizeof(sCommunityID)); + + PushArrayCell(g_FriendsArray[client], Steam64toSteam3(sCommunityID)); + } + while(Response.GotoNextKey()); + + delete Response; +} + + +stock bool Steam32IDtoSteam64ID(const char[] sSteam32ID, char[] sSteam64ID, int Size) +{ + if(strlen(sSteam32ID) < 11 || strncmp(sSteam32ID[0], "STEAM_0:", 8)) + { + 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 int Steam64toSteam3(const char[] sSteam64ID) +{ + if(strlen(sSteam64ID) != 17) + return 0; + + // convert SteamID64 to array of integers + int aSteam64ID[17]; + for(int i = 0; i < 17; i++) + aSteam64ID[i] = sSteam64ID[i] - 48; + + // subtract individual SteamID64 identifier (0x0110000100000000) + int aSteam64IDIdent[] = {7, 6, 5, 6, 1, 1, 9, 7, 9, 6, 0, 2, 6, 5, 7, 2, 8}; + int Carry = 0; + for(int i = 16; i >= 0; i--) + { + if(aSteam64ID[i] < aSteam64IDIdent[i] + Carry) + { + aSteam64ID[i] = aSteam64ID[i] - aSteam64IDIdent[i] - Carry + 10; + Carry = 1; + } + else + { + aSteam64ID[i] = aSteam64ID[i] - aSteam64IDIdent[i] - Carry; + Carry = 0; + } + } + + char aBuf[17]; + int j = 0; + bool ZereosDone = false; + for(int i = 0; i < 17; i++) + { + if(!ZereosDone && !aSteam64ID[i]) + continue; + ZereosDone = true; + + aBuf[j++] = aSteam64ID[i] + 48; + } + + return StringToInt(aBuf); +} + +public int Native_IsClientFriend(Handle plugin, int numParams) +{ + int client = GetNativeCell(1); + int friend = GetNativeCell(2); + + if(client > MaxClients || client <= 0 || friend > MaxClients || friend <= 0) + { + ThrowNativeError(SP_ERROR_NATIVE, "Client is not valid."); + return -1; + } + + if(!IsClientInGame(client) || !IsClientInGame(friend)) + { + ThrowNativeError(SP_ERROR_NATIVE, "Client is not in-game."); + return -1; + } + + if(IsFakeClient(client) || IsFakeClient(friend)) + { + ThrowNativeError(SP_ERROR_NATIVE, "Client is fake-client."); + return -1; + } + + if(g_FriendsArray[client] == INVALID_HANDLE) + return -1; + + if(IsClientAuthorized(friend)) + { + int Steam3ID = GetSteamAccountID(friend); + + if(FindValueInArray(g_FriendsArray[client], Steam3ID) != -1) + return 1; + } + + return 0; +} + +public int Native_ReadClientFriends(Handle plugin, int numParams) +{ + int client = GetNativeCell(1); + + if(client > MaxClients || client <= 0) + { + ThrowNativeError(SP_ERROR_NATIVE, "Client is not valid."); + return -1; + } + + if(g_FriendsArray[client] != INVALID_HANDLE) + return 1; + + return 0; +} diff --git a/AdvancedTargeting/scripting/include/AdvancedTargeting.inc b/AdvancedTargeting/scripting/include/AdvancedTargeting.inc new file mode 100644 index 00000000..8ffd3ad2 --- /dev/null +++ b/AdvancedTargeting/scripting/include/AdvancedTargeting.inc @@ -0,0 +1,26 @@ +#if defined _AdvancedTargeting_Included + #endinput +#endif +#define _AdvancedTargeting_Included + +native int IsClientFriend(int client, int friend); +native int ReadClientFriends(int client); + +public SharedPlugin __pl_AdvancedTargeting = +{ + name = "AdvancedTargeting", + file = "AdvancedTargeting.smx", +#if defined REQUIRE_PLUGIN + required = 1, +#else + required = 0, +#endif +}; + +#if !defined REQUIRE_PLUGIN +public __pl_AdvancedTargeting_SetNTVOptional() +{ + MarkNativeAsOptional("IsClientFriend"); + MarkNativeAsOptional("ReadClientFriends"); +} +#endif diff --git a/AntiFlood/scripting/AntiFlood.sp b/AntiFlood/scripting/AntiFlood.sp new file mode 100644 index 00000000..8fa66f84 --- /dev/null +++ b/AntiFlood/scripting/AntiFlood.sp @@ -0,0 +1,71 @@ +#include + +#pragma semicolon 1 +#pragma newdecls required + +int g_Client_CommandCount[MAXPLAYERS + 1]; +float g_Client_LastFlood[MAXPLAYERS + 1]; + +#define MAX_COMMANDS 100 +#define INTERVAL 1.0 + +public Plugin myinfo = +{ + name = "AntiFlood", + author = "BotoX", + description = "", + version = "1.0", + url = "" +}; + +public void OnPluginStart() +{ + /* Late load */ + for(int client = 1; client <= MaxClients; client++) + { + if(IsClientInGame(client)) + OnClientConnected(client); + } + + AddCommandListener(OnAnyCommand, ""); +} + +public void OnClientConnected(int client) +{ + g_Client_CommandCount[client] = 0; + g_Client_LastFlood[client] = 0.0; +} + +//public Action OnClientCommand(int client, int args) +public Action OnAnyCommand(int client, const char[] command, int argc) +{ + if(FloodCheck(client)) + return Plugin_Handled; + + return Plugin_Continue; +} + +public void OnClientSettingsChanged(int client) +{ + FloodCheck(client); +} + +bool FloodCheck(int client) +{ + if(client <= 0 || client > MaxClients) + return false; + + if(++g_Client_CommandCount[client] <= MAX_COMMANDS) + return false; + + float Time = GetGameTime(); + if(Time >= g_Client_LastFlood[client] + INTERVAL) + { + g_Client_LastFlood[client] = Time; + g_Client_CommandCount[client] = 0; + return false; + } + + KickClientEx(client, "STOP FLOODING THE SERVER!!!"); + return true; +} diff --git a/AntiJumpSpam/scripting/AntiJumpSpam.sp b/AntiJumpSpam/scripting/AntiJumpSpam.sp new file mode 100644 index 00000000..d34550a2 --- /dev/null +++ b/AntiJumpSpam/scripting/AntiJumpSpam.sp @@ -0,0 +1,115 @@ +#pragma semicolon 1 + +#include +#include + +#undef REQUIRE_PLUGIN +#tryinclude +#define REQUIRE_PLUGIN + +#pragma newdecls required + +bool g_bZRLoaded; + +ConVar g_cvarJumpsUntilBlock = null; +ConVar g_cvarIntervalBetweenJumps = null; +ConVar g_cvarCooldownInterval = null; + +float g_fLastJumpTime[MAXPLAYERS + 1]; + +int g_iFastJumpCount[MAXPLAYERS + 1]; + +public Plugin myinfo = +{ + name = "Anti Jump Spam", + author = "Obus", + description = "Prevents clients from spamming jump to avoid knockback in crawl spaces.", + version = "1.0.0", + url = "" +} + +public void OnPluginStart() +{ + g_cvarJumpsUntilBlock = CreateConVar("sm_ajs_jumpsuntilblock", "5", "Successive jumps until anti jump-spam kicks in."); + g_cvarIntervalBetweenJumps = CreateConVar("sm_ajs_jumpinterval", "0.2", "If a client jumps faster than this their jumps will be blocked after the amount of jumps specified in \"sm_ajs_jumpsuntilblock\" is reached."); + g_cvarCooldownInterval = CreateConVar("sm_ajs_cooldowninterval", "0.0", "Changes the amount of time required for a jump to not be considered spam anymore. (Setting this to 0 makes the interval sm_ajs_jumpinterval * 2)"); + + AutoExecConfig(true, "plugin.antijumpspam"); +} + +public void OnAllPluginsLoaded() +{ + g_bZRLoaded = LibraryExists("zombiereloaded"); +} + +public void OnLibraryAdded(const char[] sName) +{ + if (strcmp(sName, "zombiereloaded", false) == 0) + g_bZRLoaded = true; +} + +public void OnLibraryRemoved(const char[] sName) +{ + if (strcmp(sName, "zombiereloaded", false) == 0) + g_bZRLoaded = false; +} + +public void OnClientDisconnect(int client) +{ + g_fLastJumpTime[client] = 0.0; + g_iFastJumpCount[client] = 0; +} + +public Action OnPlayerRunCmd(int client, int &buttons) +{ + static bool bHoldingJump[MAXPLAYERS + 1]; + +#if defined _zr_included + if (!IsPlayerAlive(client) || (g_bZRLoaded && !ZR_IsClientZombie(client)) || (!g_bZRLoaded && GetClientTeam(client) != CS_TEAM_T)) + return Plugin_Continue; +#else + if (!IsPlayerAlive(client) || GetClientTeam(client) != CS_TEAM_T) + return Plugin_Continue; +#endif + + if (buttons & IN_JUMP && GetEntityFlags(client) & FL_ONGROUND) + { + float fCurTime = GetEngineTime(); + float fTimeSinceLastJump = fCurTime - g_fLastJumpTime[client]; + + if (!bHoldingJump[client]) + { + if (fTimeSinceLastJump > (g_cvarCooldownInterval.FloatValue > 0.0 ? g_cvarCooldownInterval.FloatValue : g_cvarIntervalBetweenJumps.FloatValue * 2.0) && g_iFastJumpCount[client] > 0) + { + int iJumpsToDeduct = RoundToFloor(fTimeSinceLastJump / (g_cvarCooldownInterval.FloatValue > 0.0 ? g_cvarCooldownInterval.FloatValue : g_cvarIntervalBetweenJumps.FloatValue * 2)); + + iJumpsToDeduct = iJumpsToDeduct <= g_iFastJumpCount[client] ? iJumpsToDeduct : g_iFastJumpCount[client]; + + g_iFastJumpCount[client] -= iJumpsToDeduct; + } + } + + if (g_iFastJumpCount[client] >= g_cvarJumpsUntilBlock.IntValue) + { + buttons &= ~IN_JUMP; + + return Plugin_Continue; + } + + if (!bHoldingJump[client]) + { + bHoldingJump[client] = true; + + if (fTimeSinceLastJump < g_cvarIntervalBetweenJumps.FloatValue) + g_iFastJumpCount[client]++; + + g_fLastJumpTime[client] = fCurTime; + } + } + else if (bHoldingJump[client]) + { + bHoldingJump[client] = false; + } + + return Plugin_Continue; +} diff --git a/AntiPingMask/scripting/AntiPingMask.sp b/AntiPingMask/scripting/AntiPingMask.sp new file mode 100644 index 00000000..40a2cae2 --- /dev/null +++ b/AntiPingMask/scripting/AntiPingMask.sp @@ -0,0 +1,79 @@ +#pragma semicolon 1 +#pragma newdecls required + +#include +#include + +#define REMIND_INTERVAL 5.0 + +bool g_IsMasked[MAXPLAYERS + 1] = {false, ...}; + +public Plugin myinfo = +{ + name = "AntiPingMask", + author = "BotoX", + description = "Shows real ping when client tries to mask it.", + version = "1.0", + url = "" +}; + +public void OnClientDisconnect(int client) +{ + g_IsMasked[client] = false; +} + +public void OnMapStart() +{ + CreateTimer(REMIND_INTERVAL, Timer_Remind, _, TIMER_REPEAT | TIMER_FLAG_NO_MAPCHANGE); +} + +public Action Timer_Remind(Handle Timer, any Data) +{ + for(int client = 1; client <= MaxClients; client++) + { + if(g_IsMasked[client] && IsClientInGame(client)) + PrintToChat(client, "[SM] Please turn off your pingmask! (cl_cmdrate 100)"); + } +} + +public void OnClientSettingsChanged(int client) +{ + static char sCmdRate[32]; + GetClientInfo(client, "cl_cmdrate", sCmdRate, sizeof(sCmdRate)); + bool bBadCmdRate = !IsNatural(sCmdRate); + + if(bBadCmdRate) + g_IsMasked[client] = true; + else + g_IsMasked[client] = false; +} + +public void OnGameFrame() +{ + for(int client = 1; client <= MaxClients; client++) + { + if(g_IsMasked[client]) + ForcePing(client); + } +} + +public void ForcePing(int client) +{ + int iResEnt = GetPlayerResourceEntity(); + if(iResEnt == -1) + return; + + int iLatency = RoundToNearest(GetClientAvgLatency(client, NetFlow_Outgoing) * 1000.0); + SetEntProp(iResEnt, Prop_Send, "m_iPing", iLatency, _, client); +} + +stock bool IsNatural(const char[] sString) +{ + for(int i = 0; sString[i]; i++) + { + if(!IsCharNumeric(sString[i])) + return false; + } + + return true; +} diff --git a/AutoRecorder/scripting/AutoRecorder.sp b/AutoRecorder/scripting/AutoRecorder.sp new file mode 100644 index 00000000..8ea8d012 --- /dev/null +++ b/AutoRecorder/scripting/AutoRecorder.sp @@ -0,0 +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; + } +} diff --git a/ConVarSuppression/scripting/ConVarSuppression.sp b/ConVarSuppression/scripting/ConVarSuppression.sp new file mode 100644 index 00000000..b0cd80d6 --- /dev/null +++ b/ConVarSuppression/scripting/ConVarSuppression.sp @@ -0,0 +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; +} \ No newline at end of file diff --git a/Extend/gamedata/Extend.games.txt b/Extend/gamedata/Extend.games.txt new file mode 100644 index 00000000..3c6177e2 --- /dev/null +++ b/Extend/gamedata/Extend.games.txt @@ -0,0 +1,25 @@ +"Games" +{ + "#default" + { + "Addresses" + { + "GameOver" + { + "linux" + { + "signature" "g_fGameOver" + } + } + } + + "Signatures" + { + "g_fGameOver" + { + "library" "server" + "linux" "@g_fGameOver" + } + } + } +} diff --git a/Extend/scripting/Extend.sp b/Extend/scripting/Extend.sp new file mode 100644 index 00000000..442bcca4 --- /dev/null +++ b/Extend/scripting/Extend.sp @@ -0,0 +1,387 @@ +#pragma semicolon 1 +#pragma newdecls required + +#include +#include + +#define VOTE_NO "###no###" +#define VOTE_YES "###yes###" + +ConVar g_cvarExtendVoteTime = null; +ConVar g_cvarExtendVotePercent = null; +ConVar g_cvarMpMaxRounds = null; +ConVar g_cvarMpFragLimit = null; +ConVar g_cvarMpWinLimit = null; +ConVar g_cvarMpTimeLimit = null; + +bool g_bGameOver = false; +Address g_pGameOver; + +public Plugin myinfo = +{ + name = "Map extend tools", + author = "Obus + BotoX", + description = "Adds map extension commands.", + version = "1.0", + url = "" +}; + +public void OnPluginStart() +{ + LoadTranslations("common.phrases"); + LoadTranslations("basevotes.phrases"); + + g_cvarMpMaxRounds = FindConVar("mp_maxrounds"); + g_cvarMpFragLimit = FindConVar("mp_fraglimit"); + g_cvarMpWinLimit = FindConVar("mp_winlimit"); + g_cvarMpTimeLimit = FindConVar("mp_timelimit"); + + g_cvarExtendVoteTime = CreateConVar("sm_extendvote_time", "15", "Time that will be added to mp_timelimit shall the extend vote succeed", FCVAR_NONE, true, 1.0); + g_cvarExtendVotePercent = CreateConVar("sm_extendvote_percent", "0.6", "Percentage of \"yes\" votes required to consider the vote successful", FCVAR_NONE, true, 0.05, true, 1.0); + + AutoExecConfig(true, "plugin.Extend"); + + if (g_cvarMpMaxRounds != null) + RegAdminCmd("sm_extend_rounds", Command_Extend_Rounds, ADMFLAG_GENERIC, "Add more rounds to mp_maxrounds"); + else + LogMessage("Failed to find \"mp_maxrounds\" console variable, related commands will be disabled."); + + if (g_cvarMpFragLimit != null) + RegAdminCmd("sm_extend_frags", Command_Extend_Frags, ADMFLAG_GENERIC, "Add more frags to mp_fraglimit"); + else + LogMessage("Failed to find \"mp_fraglimit\" console variable, related commands will be disabled."); + + if (g_cvarMpWinLimit != null) + RegAdminCmd("sm_extend_wins", Command_Extend_Wins, ADMFLAG_GENERIC, "Add more wins to mp_winlimit"); + else + LogMessage("Failed to find \"mp_winlimit\" console variable, related commands will be disabled."); + + if (g_cvarMpTimeLimit != null) + { + RegAdminCmd("sm_extend", Command_Extend, ADMFLAG_GENERIC, "Add more time to mp_timelimit"); + RegAdminCmd("sm_extend_time", Command_Extend, ADMFLAG_GENERIC, "Add more time to mp_timelimit"); + RegAdminCmd("sm_extendvote", Command_ExtendVote, ADMFLAG_GENERIC, "sm_extendvote [time] - Start an extendvote"); + RegAdminCmd("sm_voteextend", Command_ExtendVote, ADMFLAG_GENERIC, "sm_voteextend [time] - Start an extendvote"); + RegAdminCmd("sm_extend_vote", Command_ExtendVote, ADMFLAG_GENERIC, "sm_extend_vote [time] - Start an extendvote"); + } + else + { + LogMessage("Failed to find \"mp_timelimit\" console variable, related commands will be disabled."); + } + + Handle hGameConf = LoadGameConfigFile("Extend.games"); + if(hGameConf == INVALID_HANDLE) + { + g_bGameOver = false; + LogError("Couldn't load Extend.games game config! GameOver cancel disabled."); + return; + } + + if(!(g_pGameOver = GameConfGetAddress(hGameConf, "GameOver"))) + { + g_bGameOver = false; + CloseHandle(hGameConf); + LogError("Couldn't get GameOver address from game config! GameOver cancel disabled."); + return; + } + + g_bGameOver = true; + CloseHandle(hGameConf); +} + +public Action Command_Extend_Rounds(int client, int argc) +{ + if (argc < 1) + { + ReplyToCommand(client, "[SM] Usage: sm_extend_rounds "); + return Plugin_Handled; + } + + char sArgs[16]; + + GetCmdArg(1, sArgs, sizeof(sArgs)); + + if (sArgs[0] == '-') + { + int iRoundsToDeduct; + + if (!StringToIntEx(sArgs[1], iRoundsToDeduct)) + { + ReplyToCommand(client, "[SM] Invalid value"); + return Plugin_Handled; + } + + g_cvarMpMaxRounds.IntValue -= iRoundsToDeduct; + + LogAction(client, -1, "\"%L\" deducted \"%d\" rounds from \"mp_maxrounds\"", client, iRoundsToDeduct); + + return Plugin_Handled; + } + + int iRoundsToAdd; + + if (!StringToIntEx(sArgs, iRoundsToAdd)) + { + ReplyToCommand(client, "[SM] Invalid value"); + return Plugin_Handled; + } + + g_cvarMpMaxRounds.IntValue += iRoundsToAdd; + CancelGameOver(); + + LogAction(client, -1, "\"%L\" added \"%d\" rounds to \"mp_maxrounds\"", client, iRoundsToAdd); + + return Plugin_Handled; +} + +public Action Command_Extend_Frags(int client, int argc) +{ + if (argc < 1) + { + ReplyToCommand(client, "[SM] Usage: sm_extend_frags "); + return Plugin_Handled; + } + + char sArgs[16]; + + GetCmdArg(1, sArgs, sizeof(sArgs)); + + if (sArgs[0] == '-') + { + int iFragsToDeduct; + + if (!StringToIntEx(sArgs[1], iFragsToDeduct)) + { + ReplyToCommand(client, "[SM] Invalid value"); + return Plugin_Handled; + } + + g_cvarMpFragLimit.IntValue -= iFragsToDeduct; + + LogAction(client, -1, "\"%L\" deducted \"%d\" frags from \"mp_fraglimit\"", client, iFragsToDeduct); + + return Plugin_Handled; + } + + int iFragsToAdd; + + if (!StringToIntEx(sArgs, iFragsToAdd)) + { + ReplyToCommand(client, "[SM] Invalid value"); + return Plugin_Handled; + } + + g_cvarMpFragLimit.IntValue += iFragsToAdd; + CancelGameOver(); + + LogAction(client, -1, "\"%L\" added \"%d\" frags to \"mp_fraglimit\"", client, iFragsToAdd); + + return Plugin_Handled; +} + +public Action Command_Extend_Wins(int client, int argc) +{ + if (argc < 1) + { + ReplyToCommand(client, "[SM] Usage: sm_extend_wins "); + return Plugin_Handled; + } + + char sArgs[16]; + + GetCmdArg(1, sArgs, sizeof(sArgs)); + + if (sArgs[0] == '-') + { + int iWinsToDeduct; + + if (!StringToIntEx(sArgs[1], iWinsToDeduct)) + { + ReplyToCommand(client, "[SM] Invalid value"); + return Plugin_Handled; + } + + g_cvarMpWinLimit.IntValue -= iWinsToDeduct; + + LogAction(client, -1, "\"%L\" deducted \"%d\" wins from \"mp_winlimit\"", client, iWinsToDeduct); + + return Plugin_Handled; + } + + int iWinsToAdd; + + if (!StringToIntEx(sArgs, iWinsToAdd)) + { + ReplyToCommand(client, "[SM] Invalid value"); + return Plugin_Handled; + } + + g_cvarMpWinLimit.IntValue += iWinsToAdd; + CancelGameOver(); + + LogAction(client, -1, "\"%L\" added \"%d\" wins to \"mp_winlimit\"", client, iWinsToAdd); + + return Plugin_Handled; +} + +public Action Command_Extend(int client, int argc) +{ + if (argc < 1) + { + ReplyToCommand(client, "[SM] Usage: sm_extend