#include amxmodx
#include amxmisc
#include cstrike
#include fakemeta
#include hamsandwich
#define VERSION "0.0.5"
#define MAX_PLAYERS 32
#define SetUserReversed(%1) g_bMigraineux |= 1<<(%1 & 31)
#define ClearUserReversed(%1) g_bMigraineux &= ~( 1<<(%1 & 31) )
#define HasUserMigraine(%1) g_bMigraineux & 1<<(%1 & 31)
enum _:GlobalState {None, Terrorists, Cts, All}
new g_bMigraineux
new Float:g_vecPunchAngles[MAX_PLAYERS+1][3]
new g_iFfPlayerPreThink
new g_iGlobalState
public plugin_init()
{
register_plugin("Migraine", VERSION, "ConnorMcLeod")
RegisterHam(Ham_Spawn, "player", "Player_Spawn_Post", 1)
register_concmd("amx_migraine", "AdminCommand_Migraine", ADMIN_LEVEL_A, "- < name/@CT/@TE/@ALL > < 0/1 >")
}
public client_putinserver( id )
{
ClearUserReversed(id)
CheckForward()
}
public client_disconnect( id )
{
ClearUserReversed(id)
CheckForward()
}
public Player_Spawn_Post( id )
{
if( is_user_alive(id) )
{
switch( g_iGlobalState )
{
case Terrorists, Cts:
{
if( g_iGlobalState == _:cs_get_user_team(id) )
{
SetUserReversed(id)
}
else
{
ClearUserReversed(id)
CheckForward()
}
}
case All:
{
SetUserReversed(id)
CheckForward()
}
}
}
}
public AdminCommand_Migraine(id, level, cid)
{
if( cmd_access(id, level, cid, 3) )
{
new szTarget[32], szOnOff[2], iPlayer, iOnOff
read_argv(1, szTarget, charsmax(szTarget))
read_argv(2, szOnOff, charsmax(szOnOff))
switch( szOnOff[0] )
{
case '0':
{
iOnOff = 0
}
case '1':
{
iOnOff = 1
}
default:
{
return PLUGIN_HANDLED
}
}
if( szTarget[0] == '@' )
{
if( !iOnOff )
{
g_bMigraineux = 0
g_iGlobalState = None
CheckForward()
for(new i; i<sizeof(g_vecPunchAngles); i++)
{
g_vecPunchAngles[iPlayer][0] = 0.0
g_vecPunchAngles[iPlayer][1] = 0.0
}
return PLUGIN_HANDLED
}
new iPlayers[MAX_PLAYERS], iNum
get_players(iPlayers, iNum)
for(new i; i<iNum; i++)
{
iPlayer = iPlayers[i]
switch( szTarget[1] )
{
case 'a','A':
{
g_iGlobalState = All
SetUserReversed(iPlayer)
}
case 't', 'T':
{
g_iGlobalState = Terrorists
if( cs_get_user_team(iPlayer) == CS_TEAM_T )
{
SetUserReversed(iPlayer)
}
else
{
ClearUserReversed(iPlayer)
}
}
case 'c', 'C':
{
g_iGlobalState = Cts
if( cs_get_user_team(iPlayer) == CS_TEAM_CT )
{
SetUserReversed(iPlayer)
}
else
{
ClearUserReversed(iPlayer)
}
}
default:
{
return PLUGIN_HANDLED
}
}
g_vecPunchAngles[iPlayer][0] = 0.0
g_vecPunchAngles[iPlayer][1] = 0.0
}
}
else
{
iPlayer = cmd_target(id, szTarget, CMDTARGET_OBEY_IMMUNITY|CMDTARGET_ALLOW_SELF)
if( iPlayer )
{
if( iOnOff )
{
SetUserReversed(iPlayer)
}
else
{
ClearUserReversed(iPlayer)
}
g_vecPunchAngles[iPlayer][0] = 0.0
g_vecPunchAngles[iPlayer][1] = 0.0
}
}
CheckForward()
}
return PLUGIN_HANDLED
}
public PlayerPreThink( id )
{
if(HasUserMigraine(id) && is_user_alive(id))
{
if( g_vecPunchAngles[id][1] < 180.0 )
{
g_vecPunchAngles[id][1] += 2.0
g_vecPunchAngles[id][0] = g_vecPunchAngles[id][1] * 2.0
}
else
{
g_vecPunchAngles[id][0] = 0.0
}
static Float:vecPunchAngle[3]
vecPunchAngle[0] = g_vecPunchAngles[id][0]
vecPunchAngle[1] = g_vecPunchAngles[id][0]
vecPunchAngle[2] = g_vecPunchAngles[id][1]
set_pev(id, pev_punchangle, vecPunchAngle)
}
}
CheckForward()
{
if( !g_bMigraineux != !g_iFfPlayerPreThink )
{
if( g_bMigraineux )
{
g_iFfPlayerPreThink = register_forward(FM_PlayerPreThink, "PlayerPreThink")
}
else
{
unregister_forward(FM_PlayerPreThink, g_iFfPlayerPreThink)
g_iFfPlayerPreThink = 0
}
}
}