PHP Code:
// #define ENABLE_SHOTS_DAMAGE
#define SEMICLIP_RENDERING_RADIUS 400.0
// DON'T EDIT BELOW
#include < amxmodx >
#include < engine >
#include < fakemeta >
#include < hamsandwich >
#pragma semicolon 1
#define PLUGIN "SemiClip"
#define VERSION "0.2.0"
const Float:SEMICLIP_RADIUS = SEMICLIP_RENDERING_RADIUS;
const groupNone = 0;
new const PLAYER_CLASS[] = "player";
new g_iMaxPlayers;
#define IsPlayer(%0) ( 1 <= (%0) <= g_iMaxPlayers )
#define MaskEnt(%0) ( 1<<(%0 & 31) )
new g_bitIsPlayerInSphere;
#define MarkPlayerInSphere(%0) g_bitIsPlayerInSphere |= MaskEnt(%0)
#define IsPlayerInSphere(%0) ( g_bitIsPlayerInSphere & MaskEnt(%0) )
new g_bitBots;
#define MarkPlayerBot(%0) g_bitBots |= MaskEnt(%0)
#define ClearPlayerBot(%0) g_bitBots &= ~MaskEnt(%0)
#define IsUserBot(%0) ( g_bitBots & MaskEnt(%0) )
new g_iPlayers[32], g_iNum;
new g_iLastPlayerIndex;
new HamHook:g_iHhPreThink, HamHook:g_iHhPreThinkPost;
new g_iFhAddToFullPackPost;
new bool:g_bPreThinkHooked;
#if defined ENABLE_SHOTS_DAMAGE
new HamHook:g_iHhPostThink, HamHook:g_iHhPostThinkPost;
new bool:g_bPostThinkHooked;
#endif
new bool:g_bReadPackets = true;
public plugin_init()
{
register_plugin( PLUGIN, VERSION, "ConnorMcLeod" );
register_forward(FM_CmdStart, "OnCmdStart", false);
DisableHamForward( g_iHhPreThink = RegisterHam(Ham_Player_PreThink, PLAYER_CLASS, "OnCBasePlayer_PreThink", false) );
DisableHamForward( g_iHhPreThinkPost = RegisterHam(Ham_Player_PreThink, PLAYER_CLASS, "OnCBasePlayer_PreThink_P", true) );
#if defined ENABLE_SHOTS_DAMAGE
DisableHamForward( g_iHhPostThink = RegisterHam(Ham_Player_PostThink, PLAYER_CLASS, "OnCBasePlayer_PostThink", false) );
DisableHamForward( g_iHhPostThinkPost = RegisterHam(Ham_Player_PostThink, PLAYER_CLASS, "OnCBasePlayer_PostThink_P", true) );
#endif
RegisterHam(Ham_Spawn, PLAYER_CLASS, "OnCBasePlayer_Spawn_P", true);
RegisterHam(Ham_Killed, PLAYER_CLASS, "OnCBasePlayer_Killed_P", true);
register_forward(FM_UpdateClientData, "OnUpdateClientData_P", true);
g_iMaxPlayers = get_maxplayers();
}
public client_putinserver(id)
{
if( is_user_bot(id) )
{
MarkPlayerBot(id);
}
else
{
ClearPlayerBot(id);
}
}
public OnCmdStart(id)
{
if( !g_bReadPackets )
{
g_bReadPackets = true;
SetPlayersGroups ;;
}
if( g_iLastPlayerIndex && is_user_alive(g_iLastPlayerIndex) )
{
entity_set_int id, EV_INT_groupinfo, MaskEnt(g_iLastPlayerIndex) ;
}
if( is_user_alive(id) )
{
entity_set_int id, EV_INT_groupinfo, MaskEnt(id) ;
if( !IsUserBot(id) )
{
if( !g_bPreThinkHooked )
{
EnableHamForward g_iHhPreThink ;
EnableHamForward g_iHhPreThinkPost ;
g_bPreThinkHooked = true;
}
}
else if( g_bPreThinkHooked )
{
DisableHamForward g_iHhPreThink ;
DisableHamForward g_iHhPreThinkPost ;
g_bPreThinkHooked = false;
}
#if defined ENABLE_SHOTS_DAMAGE
if( !g_bPostThinkHooked )
{
EnableHamForward g_iHhPostThink ;
EnableHamForward g_iHhPostThinkPost ;
g_bPostThinkHooked = true;
}
#endif
}
else
{
entity_set_int id, EV_INT_groupinfo, groupNone ;
g_iLastPlayerIndex = id;
if( g_bPreThinkHooked )
{
DisableHamForward g_iHhPreThink ;
DisableHamForward g_iHhPreThinkPost ;
g_bPreThinkHooked = false;
}
#if defined ENABLE_SHOTS_DAMAGE
if( g_bPostThinkHooked )
{
DisableHamForward g_iHhPostThink ;
DisableHamForward g_iHhPostThinkPost ;
g_bPostThinkHooked = false;
}
#endif
}
}
public OnCBasePlayer_PreThink(id)
{
entity_set_int id, EV_INT_groupinfo, groupNone ;
}
public OnCBasePlayer_PreThink_P(id)
{
entity_set_int id, EV_INT_groupinfo, MaskEnt(id) ;
}
#if defined ENABLE_SHOTS_DAMAGE
public OnCBasePlayer_PostThink(id)
{
entity_set_int id, EV_INT_groupinfo, groupNone ;
}
public OnCBasePlayer_PostThink_P(id)
{
entity_set_int id, EV_INT_groupinfo, MaskEnt(id) ;
}
#endif
public OnCBasePlayer_Spawn_P(id)
{
if( is_user_alive(id) )
{
entity_set_int id, EV_INT_groupinfo, MaskEnt(id) ;
}
}
public OnCBasePlayer_Killed_P(id)
{
if( !is_user_alive(id) )
{
entity_set_int id, EV_INT_groupinfo, groupNone ;
}
}
SetPlayersGroups()
{
static id;
get_players g_iPlayers, g_iNum, "a" ;
for(--g_iNum; g_iNum>=0; g_iNum--)
{
id = g_iPlayers[ g_iNum ];
entity_set_int id, EV_INT_groupinfo, MaskEnt(id) ;
}
}
public server_frame()
{
g_iLastPlayerIndex = 0;
g_bReadPackets = false;
SetPlayersGroups ;;
}
public OnUpdateClientData_P(id, sendweapons, cd)
{
entity_set_int id, EV_INT_groupinfo, groupNone ;
if( !IsUserBot(id) && is_user_alive(id) )
{
if( !g_iFhAddToFullPackPost )
{
g_iFhAddToFullPackPost = register_forward(FM_AddToFullPack, "OnAddToFullPack_P", true);
}
g_bitIsPlayerInSphere = 0;
g_iNum = find_sphere_class(id, PLAYER_CLASS, SEMICLIP_RADIUS, g_iPlayers, g_iMaxPlayers);
for(--g_iNum; g_iNum>=0; g_iNum--)
{
MarkPlayerInSphere( g_iPlayers[ g_iNum ] );
}
}
}
public OnAddToFullPack_P(es, e, ent, id, hostflags, player, pSet)
{
if( player )
{
if( get_orig_retval() )
{
set_es es, ES_Solid, SOLID_NOT ; // should be useless since SEMICLIP_RADIUS gonna never be set to 72 or less
if( IsPlayerInSphere(ent) )
{
set_es es, ES_RenderMode, kRenderTransAlpha ;
set_es es, ES_RenderAmt, floatround(entity_range(id, ent) * 255.0 / SEMICLIP_RADIUS, floatround_floor) ;
}
}
}
else
{
entity_set_int id, EV_INT_groupinfo, MaskEnt(id) ;
unregister_forward FM_AddToFullPack, g_iFhAddToFullPackPost, true ;
g_iFhAddToFullPackPost = 0;
}
}