PHP Code:
#pragma semicolon 1
#include <multicolors>
#pragma newdecls required
static const int SPECMODE_FIRSTPERSON = 4,
SPECMODE_3RDPERSON = 5;
static const float UPDATE_INTERVAL = 1.5;
static const char PLUGIN_VERSION[] = "1.2.0";
Handle HintTimers[MAXPLAYERS+1];
bool g_bEnabled,
g_bAllowed,
g_bAdminOnly,
g_bNoAdmins;
public Plugin myinfo =
{
name = "Spectator List",
author = "GoD-Tony (rewritten by Grey83)",
description = "View who is spectating you in CSGO",
version = PLUGIN_VERSION,
url = "https://forums.alliedmods.net/showthread.php?t=135353"
};
public void OnPluginStart()
{
CreateConVar("sm_speclist_version", PLUGIN_VERSION, "Spectator List CSGO Version", FCVAR_SPONLY|FCVAR_REPLICATED|FCVAR_NOTIFY|FCVAR_DONTRECORD);
ConVar CVar;
HookConVarChange((CVar = CreateConVar("sm_speclist_enabled","1","Enables the spectator list for all players by default.", FCVAR_NONE, true, 0.0, true, 1.0)), CVarChange_Enabled);
g_bEnabled = CVar.BoolValue;
HookConVarChange((CVar = CreateConVar("sm_speclist_allowed","1","Allows players to enable spectator list manually when disabled by default.", FCVAR_NONE, true, 0.0, true, 1.0)), CVarChange_Allowed);
g_bAllowed = CVar.BoolValue;
HookConVarChange((CVar = CreateConVar("sm_speclist_adminonly","0","Only admins can use the features of this plugin.", FCVAR_NONE, true, 0.0, true, 1.0)), CVarChange_AdminOnly);
g_bAdminOnly = CVar.BoolValue;
HookConVarChange((CVar = CreateConVar("sm_speclist_noadmins", "1","Don't show non-admins that admins are spectating them.", FCVAR_NONE, true, 0.0, true, 1.0)), CVarChange_NoAdmins);
g_bNoAdmins = CVar.BoolValue;
RegConsoleCmd("sm_speclist", Cmd_SpecList);
RegConsoleCmd("sm_izleyicilistesi", Cmd_SpecList);
RegConsoleCmd("sm_izliste", Cmd_SpecList);
AutoExecConfig(true, "plugin.speclist_csgo");
}
public void CVarChange_Enabled(ConVar CVar, const char[] oldValue, const char[] newValue)
{
g_bEnabled = CVar.BoolValue;
if(g_bEnabled) CreateAllHintTimers();
else KillAllHintTimers();
}
public void CVarChange_Allowed(ConVar CVar, const char[] oldValue, const char[] newValue)
{
g_bAllowed = CVar.BoolValue;
}
public void CVarChange_AdminOnly(ConVar CVar, const char[] oldValue, const char[] newValue)
{
g_bAdminOnly = CVar.BoolValue;
if(g_bAdminOnly)KillAllHintTimers();
{
KillAllHintTimers();
CreateAllHintTimers();
}
}
public void CVarChange_NoAdmins(ConVar CVar, const char[] oldValue, const char[] newValue)
{
g_bNoAdmins = CVar.BoolValue;
if(g_bNoAdmins)
{
KillAllHintTimers();
CreateAllHintTimers();
}
}
void KillAllHintTimers() // Kill all of the active timers.
{
for(int i = 1; i <= MaxClients; i++) KillHintTimer(i);
}
void CreateAllHintTimers() // Enable timers on all players in game.
{
for(int i = 1; i <= MaxClients; i++)
{
if(!IsClientInGame(i)) continue;
CreateHintTimer(i);
}
}
public void OnClientPostAdminCheck(int client)
{
if(g_bEnabled) CreateHintTimer(client);
}
public void OnClientDisconnect(int client)
{
if(IsClientInGame(client)) KillHintTimer(client);
}
// Using 'sm_speclist' to toggle the spectator list per player.
public Action Cmd_SpecList(int client, int args)
{
if(HintTimers[client] != null)
{
KillHintTimer(client);
CReplyToCommand(client, "{default}[{darkred}İzleyici{default}]{green} Liste devre dışı bırakıldı!");
}
else if(g_bEnabled || g_bAllowed)
{
CreateHintTimer(client);
CReplyToCommand(client, "{default}[{darkred}İzleyici{default}]{green} Liste aktif edildi!");
}
return Plugin_Handled;
}
public Action Timer_UpdateHint(Handle timer, any client)
{
static int num;
static char buffer[512];
buffer[0] = '\0';
if(IsPlayerAlive(client)) FillSpecList(client, client, buffer, sizeof(buffer), num);
else
{
static int iSpecMode;
iSpecMode = GetEntProp(client, Prop_Send, "m_iObserverMode");
if(iSpecMode == 4 || iSpecMode == 5)
FillSpecList(client, GetEntPropEnt(client, Prop_Send, "m_hObserverTarget"), buffer, sizeof(buffer), num);
}
if(num)
{
FormatEx(buffer, sizeof(buffer), "Izleyenler (%i):\n%s", num, buffer);
PrintHintText(client, buffer);
}
return Plugin_Continue;
}
void FillSpecList(int client, int target, char[] speclist, int listmaxsize, int num)
{
num = 0;
static char sName[32];
for(int i = 1; i <= MaxClients; i++)
{
if(i == client || i == target) continue;
if(!IsClientInGame(i) || !IsClientObserver(i)) continue;
static int iSpecMode;
iSpecMode = GetEntProp(i, Prop_Send, "m_iObserverMode");
if(iSpecMode != SPECMODE_FIRSTPERSON && iSpecMode != SPECMODE_3RDPERSON) continue;
if(GetEntPropEnt(i, Prop_Send, "m_hObserverTarget") == target)
{
num++;
if(GetClientName(i, sName, sizeof(sName))) FormatEx(speclist, listmaxsize, "%s\n%s", speclist, sName);
}
}
}
void CreateHintTimer(int client)
{
// If AdminOnly is enabled, make sure we only create timers on admins.
if(!g_bAdminOnly || (g_bAdminOnly && IsPlayerAdmin(client))) HintTimers[client] = CreateTimer(UPDATE_INTERVAL, Timer_UpdateHint, client, TIMER_REPEAT|TIMER_FLAG_NO_MAPCHANGE);
}
void KillHintTimer(int client)
{
if(HintTimers[client] != null)
{
KillTimer(HintTimers[client]);
HintTimers[client] = null;
}
}
bool IsPlayerAdmin(int client)
{
return (IsClientInGame(client) && GetUserAdmin(client) != INVALID_ADMIN_ID);
}