Anyways, you need DHook module and a script like this.
PHP Code:
#include <sourcemod>
#include <dhooks>
#include <cstrike>
#define COMMAND_ACCESS "sm_chat" /** REQUIRED ACCESS FOR ESP (ANY COMMAND YOU WANT) */
#define FLAG_ACCESS ADMFLAG_BAN /** IF COMMAND NOT FOUND, REQUIRED FLAG (ANY FLAG YOU WANT) */
Handle g_MP_FC = INVALID_HANDLE; /** MP_FORCECAMERA */
Handle g_IsValidTarget = INVALID_HANDLE;
public void OnPluginStart()
{
if (g_MP_FC == INVALID_HANDLE) g_MP_FC = FindConVar("mp_forcecamera");
if (g_MP_FC != INVALID_HANDLE)
{
Handle Data = LoadGameConfigFile("allow-spec.games");
if (Data != INVALID_HANDLE)
{
g_IsValidTarget = DHookCreate(GameConfGetOffset(Data, "IsValidObserverTarget"), HookType_Entity, \
ReturnType_Bool, ThisPointer_CBaseEntity, IsValidTarget);
if (g_IsValidTarget != INVALID_HANDLE)
{
DHookAddParam(g_IsValidTarget, HookParamType_CBaseEntity);
}
CloseHandle(Data);
}
}
}
public void OnClientPostAdminCheck(Client)
{
if (g_MP_FC != INVALID_HANDLE && g_IsValidTarget != INVALID_HANDLE && \
!IsFakeClient(Client) && !IsClientInKickQueue(Client) && !IsClientSourceTV(Client) && \
CheckCommandAccess(Client, COMMAND_ACCESS, FLAG_ACCESS))
{
SendConVarValue(Client, g_MP_FC, "0");
DHookEntity(g_IsValidTarget, true, Client);
}
}
public MRESReturn IsValidTarget(int Owner, Handle Return, Handle Params)
{
static int Target;
if (DHookIsNullParam(Params, 1) || \
Owner < 1 || Owner > MaxClients || \
!IsClientInGame(Owner) || IsPlayerAlive(Owner) || GetClientTeam(Owner) <= CS_TEAM_SPECTATOR || \
IsClientInKickQueue(Owner) || IsClientSourceTV(Owner))
{
return MRES_Ignored;
}
Target = DHookGetParam(Params, 1);
if (Target < 1 || Target > MaxClients || \
!IsClientInGame(Target) || !IsPlayerAlive(Target) || GetClientTeam(Target) <= CS_TEAM_SPECTATOR || \
IsClientInKickQueue(Target) || IsClientSourceTV(Target))
{
return MRES_Ignored;
}
DHookSetReturn(Return, true);
return MRES_Override;
}
Also, this thread must be moved to SourceMod forums.