--- grab_plus.sma 2007/10/30 09:08:11 1 +++ grab_plus.sma 2007/10/30 23:44:10 5 @@ -73,6 +73,8 @@ Credits: +Thanks to vittu for contributing code (changed all engine/fun module stuff to fakemeta). + Thanks to all the coders who worked on the original Jedi Force Grab plugin for all their ideas: SpaceDude KCE @@ -98,6 +100,12 @@ Change Log: Key (+ added | - removed | c changed | f fixed) +v1.2 (Nov ??, 2007) ++: Cvars gp_screenfade and gp_glow to enable/disable these features. ++: Cvar gp_glow_a controls to control alpha of screenfade and glow. +c: Removed dependency of engine and fun modules. Thanks to vittu for doing all the work. +f: Fixed compile bug with amxx 1.8.0 (Compiles with 1.7x as well). + v1.1 (Oct 16, 2007) +: Grab a few types of entities other than players. +: Cvar gp_playersonly. @@ -109,15 +117,14 @@ #include #include -#include -#include #include -#define VERSION "1.1" +#define VERSION "1.2b1" #define ADMIN ADMIN_LEVEL_A #define TSK_CHKE 50 +#define SVC_DAMAGE 19 #define SF_FADEOUT 0 new client_data[33][4] @@ -134,12 +141,12 @@ new p_enabled, p_playersonly new p_throwforce, p_mindist, p_speed, p_grabforce new p_choketime, p_chokedmg -new p_glow_r, p_glow_b, p_glow_g +new p_glow_r, p_glow_b, p_glow_g, p_glow_a +new p_fade, p_glow //Pseudo Constants new MAXPLAYERS -new SVC_SCREENFADE, SVC_SCREENSHAKE, SVC_DAMAGE - +new SVC_SCREENFADE, SVC_SCREENSHAKE public plugin_init( ) { @@ -161,6 +168,10 @@ p_glow_r = register_cvar( "gp_glow_r", "50" ) p_glow_g = register_cvar( "gp_glow_g", "0" ) p_glow_b = register_cvar( "gp_glow_b", "0" ) + p_glow_a = register_cvar( "gp_glow_a", "200" ) + + p_fade = register_cvar( "gp_screenfade", "1" ) + p_glow = register_cvar( "gp_glow", "1" ) register_clcmd( "amx_grab", "force_grab", ADMIN, "Grab client & teleport to you." ) register_clcmd( "grab_toggle", "grab_toggle", ADMIN, "press once to grab and again to release" ) @@ -184,7 +195,6 @@ SVC_SCREENFADE = get_user_msgid( "ScreenFade" ) SVC_SCREENSHAKE = get_user_msgid( "ScreenShake" ) - SVC_DAMAGE = get_user_msgid( "Damage" ) return PLUGIN_CONTINUE } @@ -201,14 +211,17 @@ if ( client_data[id][GRABBED] == -1 ) { new Float:orig[3], Float:ret[3] - entity_get_vector( id, EV_VEC_origin, orig ) - entity_get_vector( id, EV_VEC_view_ofs, ret ) + pev( id, pev_origin, orig ) + pev( id, pev_view_ofs, ret ) for( new i = 0; i < 3; i++ ) orig[i] += ret[i] - velocity_by_aim( id, 1, ret ) + engfunc( EngFunc_GetAimVector, id, 1, ret ) for( new i = 0; i < 3; i++ ) ret[i] = orig[i] + ( ret[i] * 9999 ) - new target = trace_line( id, orig, ret, ret ) + new tr = 0 + engfunc( EngFunc_TraceLine, orig, ret, 0, id, tr ) + new target = get_tr2( tr, TR_pHit ) + get_tr2( tr, TR_vecEndPos, ret ) if( 0 < target <= MAXPLAYERS ) { @@ -226,14 +239,14 @@ } else { - new ent = find_ent_in_sphere( -1, ret, 12.0) + new ent = engfunc( EngFunc_FindEntityInSphere, -1, ret, 12.0 ) while( !target && ent > 0 ) { movetype = pev( ent, pev_movetype ) if( ( movetype == MOVETYPE_WALK || movetype == MOVETYPE_STEP || movetype == MOVETYPE_TOSS ) && ent != id ) target = ent - ent = find_ent_in_sphere( ent, ret, 12.0) + ent = engfunc( EngFunc_FindEntityInSphere, ent, ret, 12.0 ) } } if( target ) @@ -281,9 +294,9 @@ new Float:tmpvec[3], Float:tmpvec2[3], Float:dest[3], Float:torig[3], Float:tvel[3] new len = client_data[id][GRAB_LEN] - entity_get_vector( id, EV_VEC_origin, dest ) - entity_get_vector( id, EV_VEC_view_ofs, tmpvec ) - velocity_by_aim( id, len, tmpvec2 ) + pev( id, pev_origin, dest ) + pev( id, pev_view_ofs, tmpvec ) + engfunc(EngFunc_GetAimVector, id, len, tmpvec2) torig = get_target_origin_f( target ) new force = get_pcvar_num( p_grabforce ) @@ -294,20 +307,20 @@ tvel[i] = ( dest[i] - torig[i] ) * force } - entity_set_vector( target, EV_VEC_velocity, tvel ) + set_pev( target, pev_velocity, tvel ) } stock Float:get_target_origin_f( id ) { new Float:orig[3] - entity_get_vector( id, EV_VEC_origin, orig ) + pev( id, pev_origin, orig ) //If grabbed is not a player, move origin to center if( id > MAXPLAYERS ) { new Float:mins[3], Float:maxs[3] - entity_get_vector( id, EV_VEC_mins, mins ) - entity_get_vector( id, EV_VEC_maxs, maxs ) + pev( id, pev_mins, mins ) + pev( id, pev_maxs, maxs ) if( !mins[2] ) orig[2] += maxs[2] / 2 } @@ -335,15 +348,18 @@ public screenfade_in( id ) { - message_begin( MSG_ONE, SVC_SCREENFADE, _, id ) - write_short( 10000 ) //duration - write_short( 0 ) //hold - write_short( SF_FADE_IN + SF_FADE_ONLYONE ) //flags - write_byte( get_pcvar_num( p_glow_r ) ) //r - write_byte( get_pcvar_num( p_glow_g ) ) //g - write_byte( get_pcvar_num( p_glow_b ) ) //b - write_byte( 127 ) //a - message_end( ) + if( get_pcvar_num( p_fade ) ) + { + message_begin( MSG_ONE, SVC_SCREENFADE, _, id ) + write_short( 10000 ) //duration + write_short( 0 ) //hold + write_short( SF_FADE_IN + SF_FADE_ONLYONE ) //flags + write_byte( get_pcvar_num( p_glow_r ) ) //r + write_byte( get_pcvar_num( p_glow_g ) ) //g + write_byte( get_pcvar_num( p_glow_b ) ) //b + write_byte( get_pcvar_num( p_glow_a ) / 2 ) //a + message_end( ) + } } public throw( id ) @@ -352,8 +368,8 @@ if( target > 0 ) { new Float:pVelocity[3] - velocity_by_aim( id, get_pcvar_num(p_throwforce), pVelocity ) - entity_set_vector( target, EV_VEC_velocity, pVelocity ) + engfunc( EngFunc_GetAimVector, id, get_pcvar_num( p_throwforce ), pVelocity ) + set_pev( target, pev_velocity, pVelocity ) unset_grabbed( id ) return PLUGIN_HANDLED } @@ -365,39 +381,53 @@ new target = client_data[id][GRABBED] if( target > 0 && pev_valid( target ) ) { - set_rendering( target ) + set_pev( target, pev_renderfx, kRenderFxNone ) + set_pev( target, pev_rendercolor, {255.0, 255.0, 255.0} ) + set_pev( target, pev_rendermode, kRenderNormal ) + set_pev( target, pev_renderamt, 16.0 ) + if( 0 < target <= MAXPLAYERS ) client_data[target][GRABBER] = 0 } client_data[id][GRABBED] = 0 - message_begin( MSG_ONE, SVC_SCREENFADE, _, id ) - write_short( 10000 ) //duration - write_short( 0 ) //hold - write_short( SF_FADEOUT ) //flags - write_byte( get_pcvar_num( p_glow_r ) ) //r - write_byte( get_pcvar_num( p_glow_g ) ) //g - write_byte( get_pcvar_num( p_glow_b ) ) //b - write_byte( 127 ) //a - message_end( ) + if( get_pcvar_num( p_fade ) ) + { + message_begin( MSG_ONE, SVC_SCREENFADE, _, id ) + write_short( 10000 ) //duration + write_short( 0 ) //hold + write_short( SF_FADEOUT ) //flags + write_byte( get_pcvar_num( p_glow_r ) ) //r + write_byte( get_pcvar_num( p_glow_g ) ) //g + write_byte( get_pcvar_num( p_glow_b ) ) //b + write_byte( get_pcvar_num( p_glow_a ) / 2 ) //a + message_end( ) + } } //Grabs onto someone public set_grabbed( id, target ) { - set_rendering( target, - kRenderFxGlowShell, - get_pcvar_num( p_glow_r ), - get_pcvar_num( p_glow_g ), - get_pcvar_num( p_glow_b ), - kRenderTransColor, - 255 ) + if( get_pcvar_num( p_glow ) ) + { + new Float:color[3] + color[0] = get_pcvar_float( p_glow_r ) + color[1] = get_pcvar_float( p_glow_g ) + color[2] = get_pcvar_float( p_glow_b ) + set_pev(target, pev_renderfx, kRenderFxGlowShell) + set_pev(target, pev_rendercolor, color) + set_pev(target, pev_rendermode, kRenderTransColor) + set_pev(target, pev_renderamt, get_pcvar_float( p_glow_b ) ) + } if( 0 < target <= MAXPLAYERS ) client_data[target][GRABBER] = id client_data[id][FLAGS] = 0 client_data[id][GRABBED] = target - client_data[id][GRAB_LEN] = floatround( entity_range( target, id ) ) + new Float:torig[3], Float:orig[3] + pev( target, pev_origin, torig ) + pev( id, pev_origin, orig ) + client_data[id][GRAB_LEN] = floatround( get_distance_f( torig, orig ) ) if( client_data[id][GRAB_LEN] < get_pcvar_num( p_mindist ) ) client_data[id][GRAB_LEN] = get_pcvar_num( p_mindist ) } @@ -534,19 +564,22 @@ new Float:tmpvec[3], Float:tmpvec2[3], Float:orig[3], Float:torig[3], Float:trace_ret[3] new bool:safe = false, i - entity_get_vector( id, EV_VEC_origin, orig ) - entity_get_vector( id, EV_VEC_view_ofs, tmpvec ) + pev( id, pev_origin, orig ) + pev( id, pev_view_ofs, tmpvec ) for( i = 0; i < 3; i++ ) tmpvec[i] += orig[i] - velocity_by_aim( id, get_pcvar_num( p_mindist ), tmpvec2 ) + engfunc( EngFunc_GetAimVector, id, get_pcvar_num( p_mindist ), tmpvec2 ) for( new j = 1; j < 11 && !safe; j++ ) { for( i = 0; i < 3; i++ ) torig[i] = tmpvec[i] + tmpvec2[i] * j - trace_line( id, tmpvec, torig, trace_ret ) + new tr = 0 + engfunc( EngFunc_TraceLine, tmpvec, torig, 0, id, tr ) + get_tr2( tr, TR_vecEndPos, trace_ret ) + if( get_distance_f( trace_ret, torig ) ) break - if( !trace_hull( torig, HULL_HUMAN ) ) safe = true + if( !_trace_hull( torig, HULL_HUMAN ) ) safe = true } //Still not safe? Then find another safe spot somewhere around the grabber @@ -562,8 +595,11 @@ case 2 : torig[i] = orig[i] - ( i == 2 ? 80 : 40 ) } - trace_line( id, tmpvec, torig, trace_ret ) - if( !trace_hull( torig, HULL_HUMAN ) && !get_distance_f( trace_ret, torig ) ) safe = true + new tr2 = 0 + engfunc( EngFunc_TraceLine, tmpvec, torig, 0, id, tr2 ) + get_tr2( tr2, TR_vecEndPos, trace_ret ) + + if( !_trace_hull( torig, HULL_HUMAN ) && !get_distance_f( trace_ret, torig ) ) safe = true try[0]++ if( try[0] == 3 ) @@ -580,7 +616,7 @@ if( safe ) { - entity_set_vector( targetid, EV_VEC_origin, torig ) + set_pev( targetid, pev_origin, torig ) set_grabbed( id, targetid ) screenfade_in( id ) } @@ -618,3 +654,19 @@ else if( client_data[id][GRABBER] ) unset_grabbed( client_data[id][GRABBER] ) } + +//Complements of vittu +//Complements of fakemeta_util, cause i was too lazy to add this in as not a function +_trace_hull(const Float:origin[3], hull, ignoredent = 0, ignoremonsters = 0) { + new result = 0; + engfunc(EngFunc_TraceHull, origin, origin, ignoremonsters, hull, ignoredent > 0 ? ignoredent : 0, 0); + + if (get_tr2(0, TR_StartSolid)) + result += 1; + if (get_tr2(0, TR_AllSolid)) + result += 2; + if (!get_tr2(0, TR_InOpen)) + result += 4; + + return result; +}