- 听众
- 收听
- 积分
- 3894
- 主题
- 回帖
- 0
- 精华
注册时间2008-4-22
最后登录1970-1-1
该用户从未签到
|
发表于 2010-11-3 18:26:09
|
显示全部楼层
- #include <amxmodx>
- #include <engine>
- #include <fakemeta>
- #include <hamsandwich>
- #pragma semicolon 1
- #define MAX_ENTITYS 900+15*32 // (900+15*SERVER_SLOTS) is the calculation cs uses but it can be bypassed by the "-num_edicts <x>"-parameter
- new bool:g_bPlayerInvisible[33];
- new bool:g_bWaterInvisible[33];
- new bool:g_bWaterEntity[MAX_ENTITYS];
- new bool:g_bWaterFound;
- new g_iSpectatedId[33];
- public plugin_init( )
- {
- register_plugin( "Invis", "2.0", "SchlumPF" );
- register_clcmd( "say /invis", "menuInvisDisplay" );
- register_menucmd( register_menuid( "\rInvisibility - SchlumPF^n^n" ), 1023, "menuInvisAction" );
- register_forward( FM_AddToFullPack, "fwdAddToFullPack_Post", 1 );
- RegisterHam( Ham_Spawn, "player", "hamSpawnPlayer_Post", 1 );
- register_event( "SpecHealth2", "eventSpecHealth2", "bd" );
- }
- public plugin_cfg( )
- {
- // precache in a boolean variable whether an entity is func_water or not.
- // this will save a lot performance since AddToFullPack is called very often.
- // i could set the ents iuser variable to avoid using such a huge variable
- // and problems with the "-num_edicts" parameter but this is a lot faster
- // than retrieving pev_iuser in AddToFullPack. another way would have been
- // using a binary system to store the data in less than a huge array but in
- // fact a huge array takes a few kb ram which is for me less than a constant
- // usage of the cpu since i would need to use a few operators to read the data
- // out of the bianry system. all in all a binary storing system is at least a good
- // alternative which some iuser variable of the private ent values (pev) would not be.
- new ent = -1;
- while( ( ent = find_ent_by_class( ent, "func_water" ) ) != 0 )
- {
- // pev( ent, pev_skin ) == CONTENTS_WATER is also true on func_water entities
- if( !g_bWaterFound )
- {
- g_bWaterFound = true;
- }
- g_bWaterEntity[ent] = true;
- }
- // thanks to connor for finding the following two detections
- ent = -1;
- while( ( ent = find_ent_by_class( ent, "func_illusionary" ) ) != 0 )
- {
- if( pev( ent, pev_skin ) == CONTENTS_WATER )
- {
- if( !g_bWaterFound )
- {
- g_bWaterFound = true;
- }
- g_bWaterEntity[ent] = true;
- }
- }
- ent = -1;
- while( ( ent = find_ent_by_class( ent, "func_conveyor" ) ) != 0 )
- {
- if( pev( ent, pev_spawnflags ) == 3 )
- {
- if( !g_bWaterFound )
- {
- g_bWaterFound = true;
- }
- g_bWaterEntity[ent] = true;
- }
- }
- }
- public fwdAddToFullPack_Post( es_handle, e, ent, host, hostflags, player, pset )
- {
- if( player && g_bPlayerInvisible[host] && host != ent && ent != g_iSpectatedId[host] )
- {
- static const Float:corner[8][3] =
- {
- { -4096.0, -4096.0, -4096.0 },
- { -4096.0, -4096.0, 4096.0 },
- { -4096.0, 4096.0, -4096.0 },
- { -4096.0, 4096.0, 4096.0 },
- { 4096.0, -4096.0, -4096.0 },
- { 4096.0, -4096.0, 4096.0 },
- { 4096.0, 4096.0, -4096.0 },
- { 4096.0, 4096.0, 4096.0 }
- };
- // rounded; distance from the map's center to the corners; sqrt( 4096^2 + 4096^2 + 4096^2 )
- static const Float:map_distance = 7094.480108;
- static Float:origin[3];
- get_es( es_handle, ES_Origin, origin );
- static i;
- while( get_distance_f( origin, corner[i] ) > map_distance )
- {
- if( ++i >= sizeof( corner ) )
- {
- // better to nullify the varibale now then doing it each time before the loop
- i = 0;
- }
- }
- set_es( es_handle, ES_Origin, corner[i] );
- set_es( es_handle, ES_Effects, get_es( es_handle, ES_Effects ) | EF_NODRAW );
- }
- else if( g_bWaterInvisible[host] && g_bWaterEntity[ent])
- {
- set_es( es_handle, ES_Effects, get_es( es_handle, ES_Effects ) | EF_NODRAW );
- }
- }
- public hamSpawnPlayer_Post( plr )
- {
- g_iSpectatedId[plr] = 0;
- }
- // thanks to xPaw who told me about this event
- public eventSpecHealth2( plr )
- {
- g_iSpectatedId[plr] = read_data( 2 );
- }
- public menuInvisDisplay( plr )
- {
- static menu[256];
- new len = formatex( menu, 255, "\rInvisibility - SchlumPF^n^n" );
- len += formatex( menu[len], 255 - len, "\r1. \wPlayers: %s^n", g_bPlayerInvisible[plr] ? "invisible" : "visible" );
- if( g_bWaterFound )
- {
- len += formatex( menu[len], 255 - len, "\r2. \wWater: %s^n", g_bWaterInvisible[plr] ? "invisible" : "visible" );
- }
- //else
- //{
- // len += formatex( menu[len], 255 - len, "\r2. \wWater: There is no water on this map!^n" );
- //}
- len += formatex( menu[len], 255 - len, "^n\r0. \wExit" );
- show_menu( plr, ( 1<<0 | 1<<1 | 1<<9 ), menu, -1 );
- return PLUGIN_HANDLED;
- }
- public menuInvisAction( plr, key )
- {
- switch( key )
- {
- case 0:
- {
- g_bPlayerInvisible[plr] = !g_bPlayerInvisible[plr];
- menuInvisDisplay( plr );
- }
- case 1:
- {
- if( g_bWaterFound )
- {
- g_bWaterInvisible[plr] = !g_bWaterInvisible[plr];
- }
- menuInvisDisplay( plr );
- }
- case 9: show_menu( plr, 0, "" );
- }
- }
- public client_connect( plr )
- {
- g_bPlayerInvisible[plr] = false;
- g_bWaterInvisible[plr] = false;
- g_iSpectatedId[plr] = 0;
- }
复制代码 |
|