1 |
/* |
/* |
2 |
Grab+ v1.2.2 |
Grab+ v1.2.3 |
3 |
Copyright (C) 2007 Ian (Juan) Cammarata |
Copyright (C) 2007 Ian (Juan) Cammarata |
4 |
|
|
5 |
This program is free software: you can redistribute it and/or modify |
This program is free software: you can redistribute it and/or modify |
17 |
-------------------------------------------------------------------------------- |
-------------------------------------------------------------------------------- |
18 |
|
|
19 |
http://ian.cammarata.us/projects/grab_plus |
http://ian.cammarata.us/projects/grab_plus |
20 |
Nov 16 08:08 |
Nov 21 11:03 |
21 |
|
|
22 |
|
|
23 |
Description: |
Description: |
102 |
Change Log: |
Change Log: |
103 |
Key (+ added | - removed | c changed | f fixed) |
Key (+ added | - removed | c changed | f fixed) |
104 |
|
|
105 |
|
v1.2.3 (Nov 21, 2007) |
106 |
|
c: A few more small optimizations. |
107 |
|
f: Bloodstream for choke wasn't aligned with player. |
108 |
|
f: Bad message disconnect error when players were choked. ( stupid SVC_DAMAGE define ) |
109 |
|
|
110 |
v1.2.2 (Nov 16, 2007) |
v1.2.2 (Nov 16, 2007) |
111 |
c: A few small code optimizations. |
c: A few small code optimizations. |
112 |
|
|
134 |
#include <amxmisc> |
#include <amxmisc> |
135 |
#include <fakemeta> |
#include <fakemeta> |
136 |
|
|
137 |
#define VERSION "1.2.2" |
new const VERSION[ ] = "1.2.3" |
138 |
|
new const TRKCVAR[ ] = "grab_plus_version" |
139 |
#define ADMIN ADMIN_LEVEL_A |
#define ADMIN ADMIN_LEVEL_A |
140 |
|
|
141 |
#define TSK_CHKE 50 |
#define TSK_CHKE 50 |
142 |
|
|
|
#define SVC_DAMAGE 19 |
|
143 |
#define SF_FADEOUT 0 |
#define SF_FADEOUT 0 |
144 |
|
|
145 |
new client_data[33][4] |
new client_data[33][4] |
161 |
|
|
162 |
//Pseudo Constants |
//Pseudo Constants |
163 |
new MAXPLAYERS |
new MAXPLAYERS |
164 |
new SVC_SCREENFADE, SVC_SCREENSHAKE |
new SVC_SCREENFADE, SVC_SCREENSHAKE, WTF_DAMAGE |
165 |
|
|
166 |
public plugin_init( ) |
public plugin_init( ) |
167 |
{ |
{ |
168 |
register_plugin( "Grab+", VERSION, "Ian Cammarata" ) |
register_plugin( "Grab+", VERSION, "Ian Cammarata" ) |
169 |
register_cvar( "grab_plus_version", VERSION, FCVAR_SERVER ) |
register_cvar( TRKCVAR, VERSION, FCVAR_SERVER ) |
170 |
set_cvar_string( "grab_plus_version", VERSION ) |
set_cvar_string( TRKCVAR, VERSION ) |
171 |
|
|
172 |
p_enabled = register_cvar( "gp_enabled", "1" ) |
p_enabled = register_cvar( "gp_enabled", "1" ) |
173 |
p_players_only = register_cvar( "gp_players_only", "0" ) |
p_players_only = register_cvar( "gp_players_only", "0" ) |
213 |
|
|
214 |
SVC_SCREENFADE = get_user_msgid( "ScreenFade" ) |
SVC_SCREENFADE = get_user_msgid( "ScreenFade" ) |
215 |
SVC_SCREENSHAKE = get_user_msgid( "ScreenShake" ) |
SVC_SCREENSHAKE = get_user_msgid( "ScreenShake" ) |
216 |
|
WTF_DAMAGE = get_user_msgid( "Damage" ) |
217 |
} |
} |
218 |
|
|
219 |
public plugin_precache( ) |
public plugin_precache( ) |
223 |
|
|
224 |
public fm_player_prethink( id ) |
public fm_player_prethink( id ) |
225 |
{ |
{ |
226 |
|
new target |
227 |
//Search for a target |
//Search for a target |
228 |
if ( client_data[id][GRABBED] == -1 ) |
if ( client_data[id][GRABBED] == -1 ) |
229 |
{ |
{ |
235 |
ret[1] += orig[1] |
ret[1] += orig[1] |
236 |
ret[2] += orig[2] |
ret[2] += orig[2] |
237 |
|
|
238 |
new target = traceline( orig, ret, id, ret ) |
target = traceline( orig, ret, id, ret ) |
239 |
|
|
240 |
if( 0 < target <= MAXPLAYERS ) |
if( 0 < target <= MAXPLAYERS ) |
241 |
{ |
{ |
271 |
} |
} |
272 |
} |
} |
273 |
} |
} |
274 |
|
|
275 |
|
target = client_data[id][GRABBED] |
276 |
//If they've grabbed something |
//If they've grabbed something |
277 |
if( client_data[id][GRABBED] > 0 ) |
if( target > 0 ) |
278 |
{ |
{ |
|
new target = client_data[id][GRABBED] |
|
279 |
if( !pev_valid( target ) || ( pev( target, pev_health ) < 1 && pev( target, pev_max_health ) ) ) |
if( !pev_valid( target ) || ( pev( target, pev_health ) < 1 && pev( target, pev_max_health ) ) ) |
280 |
{ |
{ |
281 |
unset_grabbed( id ) |
unset_grabbed( id ) |
287 |
do_choke( id ) |
do_choke( id ) |
288 |
|
|
289 |
//Push and pull |
//Push and pull |
290 |
if ( client_data[id][FLAGS] & CDF_IN_PULL ) |
new cdf = client_data[id][FLAGS] |
291 |
|
if ( cdf & CDF_IN_PULL ) |
292 |
do_pull( id ) |
do_pull( id ) |
293 |
else if ( client_data[id][FLAGS] & CDF_IN_PUSH ) |
else if ( cdf & CDF_IN_PUSH ) |
294 |
do_push( id ) |
do_push( id ) |
295 |
|
|
296 |
grab_think( id ) |
if( target > MAXPLAYERS ) grab_think( id ) |
297 |
} |
} |
298 |
if( client_data[id][GRABBER] > 0 ) grab_think( client_data[id][GRABBER] ) |
|
299 |
|
//If they're grabbed |
300 |
|
target = client_data[id][GRABBER] |
301 |
|
if( target > 0 ) grab_think( target ) |
302 |
|
|
303 |
return FMRES_IGNORED |
return FMRES_IGNORED |
304 |
} |
} |
305 |
|
|
306 |
public grab_think ( id ) |
public grab_think( id ) //id of the grabber |
307 |
{ |
{ |
308 |
new target = client_data[id][GRABBED] |
new target = client_data[id][GRABBED] |
309 |
|
|
505 |
if( client_data[id][FLAGS] & CDF_NO_CHOKE || id == target || target > MAXPLAYERS) return |
if( client_data[id][FLAGS] & CDF_NO_CHOKE || id == target || target > MAXPLAYERS) return |
506 |
|
|
507 |
new dmg = get_pcvar_num( p_choke_dmg ) |
new dmg = get_pcvar_num( p_choke_dmg ) |
508 |
new Float:vec[3] |
new vec[3] |
509 |
get_target_origin_f( target ) |
FVecIVec( get_target_origin_f( target ), vec ) |
510 |
|
|
511 |
message_begin( MSG_ONE, SVC_SCREENSHAKE, _, target ) |
message_begin( MSG_ONE, SVC_SCREENSHAKE, _, target ) |
512 |
write_short( 999999 ) //amount |
write_short( 999999 ) //amount |
524 |
write_byte( 200 ) //a |
write_byte( 200 ) //a |
525 |
message_end( ) |
message_end( ) |
526 |
|
|
527 |
message_begin( MSG_ONE, SVC_DAMAGE, _, target ) |
message_begin( MSG_ONE, WTF_DAMAGE, _, target ) |
528 |
write_byte( 0 ) //damage armor |
write_byte( 0 ) //damage armor |
529 |
write_byte( dmg ) //damage health |
write_byte( dmg ) //damage health |
530 |
write_long( DMG_CRUSH ) //damage type |
write_long( DMG_CRUSH ) //damage type |
531 |
write_coord( floatround( vec[0] ) ) //origin[x] |
write_coord( vec[0] ) //origin[x] |
532 |
write_coord( floatround( vec[1] ) ) //origin[y] |
write_coord( vec[1] ) //origin[y] |
533 |
write_coord( floatround( vec[2] ) ) //origin[z] |
write_coord( vec[2] ) //origin[z] |
534 |
message_end( ) |
message_end( ) |
535 |
|
|
536 |
message_begin( MSG_BROADCAST, SVC_TEMPENTITY ) |
message_begin( MSG_BROADCAST, SVC_TEMPENTITY ) |
537 |
write_byte( TE_BLOODSTREAM ) |
write_byte( TE_BLOODSTREAM ) |
538 |
write_coord( floatround( vec[0] ) ) //pos.x |
write_coord( vec[0] ) //pos.x |
539 |
write_coord( floatround( vec[1] ) ) //pos.y |
write_coord( vec[1] ) //pos.y |
540 |
write_coord( floatround( vec[2] ) + 15 ) //pos.z |
write_coord( vec[2] + 15 ) //pos.z |
541 |
write_coord( random_num( 0, 255 ) ) //vec.x |
write_coord( random_num( 0, 255 ) ) //vec.x |
542 |
write_coord( random_num( 0, 255 ) ) //vec.y |
write_coord( random_num( 0, 255 ) ) //vec.y |
543 |
write_coord( random_num( 0, 255 ) ) //vec.z |
write_coord( random_num( 0, 255 ) ) //vec.z |
683 |
|
|
684 |
stock get_view_pos( const id, Float:vViewPos[3] ) |
stock get_view_pos( const id, Float:vViewPos[3] ) |
685 |
{ |
{ |
686 |
new Float:ofs[3] |
new Float:vOfs[3] |
687 |
pev( id, pev_origin, vViewPos ) |
pev( id, pev_origin, vViewPos ) |
688 |
pev( id, pev_view_ofs, ofs ) |
pev( id, pev_view_ofs, vOfs ) |
689 |
|
|
690 |
vViewPos[0] += ofs[0] |
vViewPos[0] += vOfs[0] |
691 |
vViewPos[1] += ofs[1] |
vViewPos[1] += vOfs[1] |
692 |
vViewPos[2] += ofs[2] |
vViewPos[2] += vOfs[2] |
693 |
} |
} |
694 |
|
|
695 |
stock Float:vel_by_aim( id, speed = 1 ) |
stock Float:vel_by_aim( id, speed = 1 ) |