142 lines
3.3 KiB
SourcePawn
142 lines
3.3 KiB
SourcePawn
#include <sourcemod>
|
|
|
|
#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(!argc && (StrEqual(command, "kill") || StrEqual(command, "explode")))
|
|
return Plugin_Continue;
|
|
|
|
if(StrEqual(command, "setang"))
|
|
return Plugin_Continue;
|
|
|
|
if(!IsClientAuthorized(client) || !CheckCommandAccess(client, "", ADMFLAG_CHEATS))
|
|
return Plugin_Handled;
|
|
|
|
if(StrEqual(command, "noclip") && IsPlayerAlive(client))
|
|
ShowActivity2(client, "[SM] ", "toggled noclip on himself.");
|
|
|
|
LogAction(client, -1, "\"%L\" used cheat command: \"%s\"", client, command);
|
|
|
|
return Plugin_Continue;
|
|
}
|
|
|
|
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))
|
|
{
|
|
impulse = 0;
|
|
return Plugin_Changed;
|
|
}
|
|
|
|
return Plugin_Continue;
|
|
}
|
|
|
|
stock void MakeCheatCommand(const char[] name)
|
|
{
|
|
int Flags = GetCommandFlags(name);
|
|
if(Flags != INVALID_FCVAR_FLAGS)
|
|
SetCommandFlags(name, FCVAR_CHEAT | Flags);
|
|
}
|