[Half-Life AMXX] / grab_plus.sma Repository:
ViewVC logotype

Diff of /grab_plus.sma

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 1, Tue Oct 30 09:08:11 2007 UTC revision 28, Wed Nov 21 18:04:40 2007 UTC
# Line 1  Line 1 
1  /*  /*
2  Grab+ v1.1  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 it under  This program is free software: you can redistribute it and/or modify
6  the terms of the GNU General Public License as published by the Free Software  it under the terms of the GNU Affero General Public License as
7  Foundation; either version 2 of the License, or (at your option) any later  published by the Free Software Foundation, either version 3 of the
8  version.  License, or (at your option) any later version.
9    
10  This program is distributed in the hope that it will be useful, but WITHOUT ANY  This program is distributed in the hope that it will be useful,
11  WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A  but WITHOUT ANY WARRANTY; without even the implied warranty of
12  PARTICULAR PURPOSE. See the GNU General Public License for more details.  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13    GNU Affero General Public License for more details.
14    
15  You should have received a copy of the GNU General Public License along with  You should have received a copy of the GNU Affero General Public License
16  this program; go to http://www.opensource.org/licenses/gpl-license.php  along with this program.  If not, see <http://www.gnu.org/licenses/>.
17  --------------------------------------------------------------------------------  --------------------------------------------------------------------------------
18    
19  http://ian.cammarata.us/projects/grab_plus  http://ian.cammarata.us/projects/grab_plus
20  Oct 16 21:03  Nov 21 11:03
21    
22    
23  Description:  Description:
24  This is a remake from scratch of SpaceDude's Jedi Force Grab plugin.  It has many additional features and optimizations, is less spammy, multilingual and requires fewer binds.  This is a remake from scratch of SpaceDude's Jedi Force Grab plugin.  It has many additional features and optimizations, is less spammy, multilingual and requires fewer binds.
25    
26    
 See it in Action:  
 http://www.game-monitor.com/search.php?search=grab_plus_version&type=variable&game=all&location=all  
   
   
27  Features:  Features:
28  Multilingual  Multilingual
29  Screenfade to indicate grab activity instead of chat spam.  Screenfade to indicate grab activity instead of chat spam.
# Line 47  Line 44 
44    
45  +pull/+push (or invnext/invprev): Pulls/pushes the grabbed towards/away from you as you hold the button.  +pull/+push (or invnext/invprev): Pulls/pushes the grabbed towards/away from you as you hold the button.
46    
47  +use : Chokes the grabbed (it damages the grabbed with 5 (cvar: gp_chokedmg) hp per 1.5 (cvar: gp_choketime) seconds)  +use : Chokes the grabbed (it damages the grabbed with 5 (cvar: gp_choke_dmg) hp per 1.5 (cvar: gp_choke_time) seconds)
48  drop - Throws the grabbed with 1500 velocity. (cvar: gp_throwforce)  drop - Throws the grabbed with 1500 velocity. (cvar: gp_throw_force)
49    
50    
51  Cvars (First value is default):  Cvars (First value is default):
52  gp_enabled <1|0> Enables all plugin functionality.  gp_enabled <1|0> Enables all plugin functionality.
53  gp_playersonly <0|1> Disables admins grabbing entities other than players.  gp_players_only <0|1> Disables admins grabbing entities other than players.
54    
55  gp_min_dist <90|...> Min distance between the grabber and grabbed.  gp_min_dist <90|...> Min distance between the grabber and grabbed.
56  gp_grabforce <8|...> Sets the amount of force used when grabbing players.  gp_grab_force <8|...> Sets the amount of force used when grabbing players.
57  gp_throwforce <1500|...> Sets the power used when throwing players.  gp_throw_force <1500|...> Sets the power used when throwing players.
58  gp_speed <5|...> How fast the grabbed moves when using push and pull.  gp_speed <5|...> How fast the grabbed moves when using push and pull.
59    
60  gp_choketime <1.5|...> Time frequency for choking.  gp_choke_time <1.5|...> Time frequency for choking.
61  gp_chokedmg <5|...> Amount of damage done with each choke.  gp_choke_dmg <5|...> Amount of damage done with each choke.
62    gp_auto_choke <1|0> Enable/disable choking automatically with +pull command.
63  gp_glow_r <50|0-255> Sets red amount for glow.  
64  gp_glow_g <0|0-255> Sets green amount for glow.  gp_screen_fade <1|0> Enables/disables screenfade when grabbing.
65  gp_glow_b <0|0-255> Sets blue amount for glow.  gp_glow <1|0> Enables/disables glowing for grabbed objects.
66    
67    gp_glow_r <50|0-255> Sets red amount for glow and screenfade.
68    gp_glow_g <0|0-255> Sets green amount for glow and screenfade.
69    gp_glow_b <0|0-255> Sets blue amount for glow and screenfade.
70    gp_glow_a <0|0-255> Sets alpha for glow and screenfade.
71    
72    
73  Notes:  Notes:
# Line 73  Line 75 
75    
76    
77  Credits:  Credits:
78    Thanks to vittu for contributing code (changed all engine/fun module stuff to fakemeta).
79    
80  Thanks to all the coders who worked on the original Jedi Force Grab plugin for all their ideas:  Thanks to all the coders who worked on the original Jedi Force Grab plugin for all their ideas:
81  SpaceDude  SpaceDude
82  KCE  KCE
# Line 98  Line 102 
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)
111    c: A few small code optimizations.
112    
113    v1.2.1 (Nov 12, 2007)
114    f: Eliminated two run time warnings in the player prethink function.
115    
116    v1.2 (Nov 06, 2007)
117    +: Cvars gp_screen_fade and gp_glow to enable/disable these features.
118    +: Cvar gp_glow_a controls to control alpha of screenfade and glow.
119    +: Cvar gp_auto_choke to enable/disable choking automatically with +pull command.
120    c: Removed dependency of engine and fun modules.  Thanks to vittu for doing most of the work.
121    c: Made cvar names more consistent by adding more underscores.
122    f: Fixed compile bug with amxx 1.8.0 (Compiles with 1.7.x as well).
123    
124  v1.1 (Oct 16, 2007)  v1.1 (Oct 16, 2007)
125  +: Grab a few types of entities other than players.  +: Grab a few types of entities other than players.
126  +: Cvar gp_playersonly.  +: Cvar gp_players_only.
127    
128  v1.0 (Oct 13, 2007)  v1.0 (Oct 13, 2007)
129  !: Initial release  !: Initial release
# Line 109  Line 132 
132    
133  #include <amxmodx>  #include <amxmodx>
134  #include <amxmisc>  #include <amxmisc>
 #include <fun>  
 #include <engine>  
135  #include <fakemeta>  #include <fakemeta>
136    
137  #define VERSION "1.1"  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
# Line 131  Line 153 
153  #define CDF_NO_CHOKE  (1<<2)  #define CDF_NO_CHOKE  (1<<2)
154    
155  //Cvar Pointers  //Cvar Pointers
156  new p_enabled, p_playersonly  new p_enabled, p_players_only
157  new p_throwforce, p_mindist, p_speed, p_grabforce  new p_throw_force, p_min_dist, p_speed, p_grab_force
158  new p_choketime, p_chokedmg  new p_choke_time, p_choke_dmg, p_auto_choke
159  new p_glow_r, p_glow_b, p_glow_g  new p_glow_r, p_glow_b, p_glow_g, p_glow_a
160    new p_fade, p_glow
161    
162  //Pseudo Constants  //Pseudo Constants
163  new MAXPLAYERS  new MAXPLAYERS
164  new SVC_SCREENFADE, SVC_SCREENSHAKE, SVC_DAMAGE  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_playersonly = register_cvar( "gp_playersonly", "0" )          p_players_only = register_cvar( "gp_players_only", "0" )
174    
175          p_mindist = register_cvar ( "gp_min_dist", "90" )          p_min_dist = register_cvar ( "gp_min_dist", "90" )
176          p_throwforce = register_cvar( "gp_throwforce", "1500" )          p_throw_force = register_cvar( "gp_throw_force", "1500" )
177          p_grabforce = register_cvar( "gp_grabforce", "8" )          p_grab_force = register_cvar( "gp_grab_force", "8" )
178          p_speed = register_cvar( "gp_speed", "5" )          p_speed = register_cvar( "gp_speed", "5" )
179    
180          p_choketime = register_cvar( "gp_choketime", "1.5" )          p_choke_time = register_cvar( "gp_choke_time", "1.5" )
181          p_chokedmg = register_cvar( "gp_chokedmg", "5" )          p_choke_dmg = register_cvar( "gp_choke_dmg", "5" )
182            p_auto_choke = register_cvar( "gp_auto_choke", "1" )
183    
184          p_glow_r = register_cvar( "gp_glow_r", "50" )          p_glow_r = register_cvar( "gp_glow_r", "50" )
185          p_glow_g = register_cvar( "gp_glow_g", "0" )          p_glow_g = register_cvar( "gp_glow_g", "0" )
186          p_glow_b = register_cvar( "gp_glow_b", "0" )          p_glow_b = register_cvar( "gp_glow_b", "0" )
187            p_glow_a = register_cvar( "gp_glow_a", "200" )
188    
189            p_fade = register_cvar( "gp_screen_fade", "1" )
190            p_glow = register_cvar( "gp_glow", "1" )
191    
192          register_clcmd( "amx_grab", "force_grab", ADMIN, "Grab client & teleport to you." )          register_clcmd( "amx_grab", "force_grab", ADMIN, "Grab client & teleport to you." )
193          register_clcmd( "grab_toggle", "grab_toggle", ADMIN, "press once to grab and again to release" )          register_clcmd( "grab_toggle", "grab_toggle", ADMIN, "press once to grab and again to release" )
# Line 178  Line 205 
205    
206          register_event( "DeathMsg", "DeathMsg", "a" )          register_event( "DeathMsg", "DeathMsg", "a" )
207    
208            register_forward( FM_PlayerPreThink, "fm_player_prethink" )
209    
210          register_dictionary( "grab_plus.txt" )          register_dictionary( "grab_plus.txt" )
211    
212          MAXPLAYERS = get_maxplayers()          MAXPLAYERS = get_maxplayers()
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          SVC_DAMAGE = get_user_msgid( "Damage" )          WTF_DAMAGE = get_user_msgid( "Damage" )
   
         return PLUGIN_CONTINUE  
217  }  }
218    
219  public plugin_precache( )  public plugin_precache( )
220  {  {
221          precache_sound( "player/PL_PAIN2.WAV" )          precache_sound( "player/PL_PAIN2.WAV" )
         return PLUGIN_CONTINUE  
222  }  }
223    
224  public client_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          {          {
230                  new Float:orig[3], Float:ret[3]                  new Float:orig[3], Float:ret[3]
231                  entity_get_vector( id, EV_VEC_origin, orig )                  get_view_pos( id, orig )
232                  entity_get_vector( id, EV_VEC_view_ofs, ret )                  ret = vel_by_aim( id, 9999 )
233    
234                  for( new i = 0; i < 3; i++ ) orig[i] += ret[i]                  ret[0] += orig[0]
235                  velocity_by_aim( id, 1, ret )                  ret[1] += orig[1]
236                  for( new i = 0; i < 3; i++ ) ret[i] = orig[i] + ( ret[i] * 9999 )                  ret[2] += orig[2]
237    
238                  new target = trace_line( id, orig, ret, ret )                  target = traceline( orig, ret, id, ret )
239    
240                  if( 0 < target <= MAXPLAYERS )                  if( 0 < target <= MAXPLAYERS )
241                  {                  {
242                          if( is_grabbed( target, id ) ) return PLUGIN_CONTINUE                          if( is_grabbed( target, id ) ) return FMRES_IGNORED
243                          set_grabbed( id, target )                          set_grabbed( id, target )
244                  }                  }
245                  else if( !get_pcvar_num( p_playersonly ) )                  else if( !get_pcvar_num( p_players_only ) )
246                  {                  {
247                          new movetype                          new movetype
248                          if( target )                          if( target && pev_valid( target ) )
249                          {                          {
250                                  movetype = pev( target, pev_movetype )                                  movetype = pev( target, pev_movetype )
251                                  if( !( movetype == MOVETYPE_WALK || movetype == MOVETYPE_STEP || movetype == MOVETYPE_TOSS ) )                                  if( !( movetype == MOVETYPE_WALK || movetype == MOVETYPE_STEP || movetype == MOVETYPE_TOSS ) )
252                                          return PLUGIN_CONTINUE                                          return FMRES_IGNORED
253                          }                          }
254                          else                          else
255                          {                          {
256                                  new ent = find_ent_in_sphere( -1, ret, 12.0)                                  target = 0
257                                    new ent = engfunc( EngFunc_FindEntityInSphere, -1, ret, 12.0 )
258                                  while( !target && ent > 0 )                                  while( !target && ent > 0 )
259                                  {                                  {
260                                          movetype = pev( ent, pev_movetype )                                          movetype = pev( ent, pev_movetype )
261                                          if( ( movetype == MOVETYPE_WALK || movetype == MOVETYPE_STEP || movetype == MOVETYPE_TOSS )                                          if( ( movetype == MOVETYPE_WALK || movetype == MOVETYPE_STEP || movetype == MOVETYPE_TOSS )
262                                                          && ent != id  )                                                          && ent != id  )
263                                                  target = ent                                                  target = ent
264                                          ent = find_ent_in_sphere( ent, ret, 12.0)                                          ent = engfunc( EngFunc_FindEntityInSphere, ent, ret, 12.0 )
265                                  }                                  }
266                          }                          }
267                          if( target )                          if( target )
268                          {                          {
269                                  if( is_grabbed( target, id ) ) return PLUGIN_CONTINUE                                  if( is_grabbed( target, id ) ) return FMRES_IGNORED
270                                  set_grabbed( id, target )                                  set_grabbed( id, target )
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 )
282                          return PLUGIN_CONTINUE                          return FMRES_IGNORED
283                  }                  }
284    
285                  //Use key choke                  //Use key choke
# Line 258  Line 287 
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          }          }
         if( client_data[id][GRABBER] > 0 ) grab_think( client_data[id][GRABBER] )  
298    
299          return PLUGIN_CONTINUE          //If they're grabbed
300            target = client_data[id][GRABBER]
301            if( target > 0 ) grab_think( target )
302    
303            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    
# Line 278  Line 311 
311          if( pev( target, pev_movetype ) == MOVETYPE_FLY && !(pev( target, pev_button ) & IN_JUMP ) ) client_cmd( target, "+jump;wait;-jump" )          if( pev( target, pev_movetype ) == MOVETYPE_FLY && !(pev( target, pev_button ) & IN_JUMP ) ) client_cmd( target, "+jump;wait;-jump" )
312    
313          //Move targeted client          //Move targeted client
314          new Float:tmpvec[3], Float:tmpvec2[3], Float:dest[3], Float:torig[3], Float:tvel[3]          new Float:tmpvec[3], Float:tmpvec2[3], Float:torig[3], Float:tvel[3]
315          new len = client_data[id][GRAB_LEN]  
316            get_view_pos( id, tmpvec )
317    
318            tmpvec2 = vel_by_aim( id, client_data[id][GRAB_LEN] )
319    
         entity_get_vector( id, EV_VEC_origin, dest )  
         entity_get_vector( id, EV_VEC_view_ofs, tmpvec )  
         velocity_by_aim( id, len, tmpvec2 )  
320          torig = get_target_origin_f( target )          torig = get_target_origin_f( target )
321    
322          new force = get_pcvar_num( p_grabforce )          new force = get_pcvar_num( p_grab_force )
323    
324          for( new i = 0; i < 3; i++ )          tvel[0] = ( ( tmpvec[0] + tmpvec2[0] ) - torig[0] ) * force
325          {          tvel[1] = ( ( tmpvec[1] + tmpvec2[1] ) - torig[1] ) * force
326                  dest[i] += tmpvec[i] + tmpvec2[i]          tvel[2] = ( ( tmpvec[2] + tmpvec2[2] ) - torig[2] ) * force
                 tvel[i] = ( dest[i] - torig[i] ) * force  
         }  
327    
328          entity_set_vector( target, EV_VEC_velocity, tvel )          set_pev( target, pev_velocity, tvel )
329  }  }
330    
331  stock Float:get_target_origin_f( id )  stock Float:get_target_origin_f( id )
332  {  {
333          new Float:orig[3]          new Float:orig[3]
334          entity_get_vector( id, EV_VEC_origin, orig )          pev( id, pev_origin, orig )
335    
336          //If grabbed is not a player, move origin to center          //If grabbed is not a player, move origin to center
337          if( id > MAXPLAYERS )          if( id > MAXPLAYERS )
338          {          {
339                  new Float:mins[3], Float:maxs[3]                  new Float:mins[3], Float:maxs[3]
340                  entity_get_vector( id, EV_VEC_mins, mins )                  pev( id, pev_mins, mins )
341                  entity_get_vector( id, EV_VEC_maxs, maxs )                  pev( id, pev_maxs, maxs )
342    
343                  if( !mins[2] ) orig[2] += maxs[2] / 2                  if( !mins[2] ) orig[2] += maxs[2] / 2
344          }          }
# Line 335  Line 366 
366    
367  public screenfade_in( id )  public screenfade_in( id )
368  {  {
369            if( get_pcvar_num( p_fade ) )
370            {
371          message_begin( MSG_ONE, SVC_SCREENFADE, _, id )          message_begin( MSG_ONE, SVC_SCREENFADE, _, id )
372          write_short( 10000 ) //duration          write_short( 10000 ) //duration
373          write_short( 0 ) //hold          write_short( 0 ) //hold
# Line 342  Line 375 
375          write_byte( get_pcvar_num( p_glow_r ) ) //r          write_byte( get_pcvar_num( p_glow_r ) ) //r
376          write_byte( get_pcvar_num( p_glow_g ) ) //g          write_byte( get_pcvar_num( p_glow_g ) ) //g
377          write_byte( get_pcvar_num( p_glow_b ) ) //b          write_byte( get_pcvar_num( p_glow_b ) ) //b
378          write_byte( 127 ) //a                  write_byte( get_pcvar_num( p_glow_a ) / 2 ) //a
379          message_end( )          message_end( )
380  }  }
381    }
382    
383  public throw( id )  public throw( id )
384  {  {
385          new target = client_data[id][GRABBED]          new target = client_data[id][GRABBED]
386          if( target > 0 )          if( target > 0 )
387          {          {
388                  new Float:pVelocity[3]                  set_pev( target, pev_velocity, vel_by_aim( id, get_pcvar_num(p_throw_force) ) )
                 velocity_by_aim( id, get_pcvar_num(p_throwforce), pVelocity )  
                 entity_set_vector( target, EV_VEC_velocity, pVelocity )  
389                  unset_grabbed( id )                  unset_grabbed( id )
390                  return PLUGIN_HANDLED                  return PLUGIN_HANDLED
391          }          }
392    
393          return PLUGIN_CONTINUE          return PLUGIN_CONTINUE
394  }  }
395    
# Line 365  Line 398 
398          new target = client_data[id][GRABBED]          new target = client_data[id][GRABBED]
399          if( target > 0 && pev_valid( target ) )          if( target > 0 && pev_valid( target ) )
400          {          {
401                  set_rendering( target )                  set_pev( target, pev_renderfx, kRenderFxNone )
402                    set_pev( target, pev_rendercolor, {255.0, 255.0, 255.0} )
403                    set_pev( target, pev_rendermode, kRenderNormal )
404                    set_pev( target, pev_renderamt, 16.0 )
405    
406                  if( 0 < target <= MAXPLAYERS )                  if( 0 < target <= MAXPLAYERS )
407                          client_data[target][GRABBER] = 0                          client_data[target][GRABBER] = 0
408          }          }
409          client_data[id][GRABBED] = 0          client_data[id][GRABBED] = 0
410    
411            if( get_pcvar_num( p_fade ) )
412            {
413          message_begin( MSG_ONE, SVC_SCREENFADE, _, id )          message_begin( MSG_ONE, SVC_SCREENFADE, _, id )
414          write_short( 10000 ) //duration          write_short( 10000 ) //duration
415          write_short( 0 ) //hold          write_short( 0 ) //hold
# Line 378  Line 417 
417          write_byte( get_pcvar_num( p_glow_r ) ) //r          write_byte( get_pcvar_num( p_glow_r ) ) //r
418          write_byte( get_pcvar_num( p_glow_g ) ) //g          write_byte( get_pcvar_num( p_glow_g ) ) //g
419          write_byte( get_pcvar_num( p_glow_b ) ) //b          write_byte( get_pcvar_num( p_glow_b ) ) //b
420          write_byte( 127 ) //a                  write_byte( get_pcvar_num( p_glow_a ) / 2 ) //a
421          message_end( )          message_end( )
422  }  }
423    }
424    
425  //Grabs onto someone  //Grabs onto someone
426  public set_grabbed( id, target )  public set_grabbed( id, target )
427  {  {
428          set_rendering( target,          if( get_pcvar_num( p_glow ) )
429                  kRenderFxGlowShell,          {
430                  get_pcvar_num( p_glow_r ),                  new Float:color[3]
431                  get_pcvar_num( p_glow_g ),                  color[0] = get_pcvar_float( p_glow_r )
432                  get_pcvar_num( p_glow_b ),                  color[1] = get_pcvar_float( p_glow_g )
433                  kRenderTransColor,                  color[2] = get_pcvar_float( p_glow_b )
434                  255 )                  set_pev( target, pev_renderfx, kRenderFxGlowShell )
435                    set_pev( target, pev_rendercolor, color )
436                    set_pev( target, pev_rendermode, kRenderTransColor )
437                    set_pev( target, pev_renderamt, get_pcvar_float( p_glow_a ) )
438            }
439    
440          if( 0 < target <= MAXPLAYERS )          if( 0 < target <= MAXPLAYERS )
441                  client_data[target][GRABBER] = id                  client_data[target][GRABBER] = id
442          client_data[id][FLAGS] = 0          client_data[id][FLAGS] = 0
443          client_data[id][GRABBED] = target          client_data[id][GRABBED] = target
444          client_data[id][GRAB_LEN] = floatround( entity_range( target, id ) )          new Float:torig[3], Float:orig[3]
445          if( client_data[id][GRAB_LEN] < get_pcvar_num( p_mindist ) ) client_data[id][GRAB_LEN] = get_pcvar_num( p_mindist )          pev( target, pev_origin, torig )
446            pev( id, pev_origin, orig )
447            client_data[id][GRAB_LEN] = floatround( get_distance_f( torig, orig ) )
448            if( client_data[id][GRAB_LEN] < get_pcvar_num( p_min_dist ) ) client_data[id][GRAB_LEN] = get_pcvar_num( p_min_dist )
449  }  }
450    
451  public push( id )  public push( id )
# Line 439  Line 486 
486    
487  public do_pull( id )  public do_pull( id )
488  {  {
489          new mindist = get_pcvar_num( p_mindist )          new mindist = get_pcvar_num( p_min_dist )
490          new len = client_data[id][GRAB_LEN]          new len = client_data[id][GRAB_LEN]
491    
492          if( len > mindist )          if( len > mindist )
# Line 448  Line 495 
495                  if( len < mindist ) len = mindist                  if( len < mindist ) len = mindist
496                  client_data[id][GRAB_LEN] = len                  client_data[id][GRAB_LEN] = len
497          }          }
498          else do_choke( id )          else if( get_pcvar_num( p_auto_choke ) )
499                    do_choke( id )
500  }  }
501    
502  public do_choke( id )  public do_choke( id )
# Line 456  Line 504 
504          new target = client_data[id][GRABBED]          new target = client_data[id][GRABBED]
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_chokedmg )          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
# Line 476  Line 524 
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
# Line 504  Line 552 
552          emit_sound( target, CHAN_BODY, "player/PL_PAIN2.WAV", VOL_NORM, ATTN_NORM, 0, PITCH_NORM )          emit_sound( target, CHAN_BODY, "player/PL_PAIN2.WAV", VOL_NORM, ATTN_NORM, 0, PITCH_NORM )
553    
554          client_data[id][FLAGS] ^= CDF_NO_CHOKE          client_data[id][FLAGS] ^= CDF_NO_CHOKE
555          set_task( get_pcvar_float( p_choketime ), "clear_no_choke", TSK_CHKE + id )          set_task( get_pcvar_float( p_choke_time ), "clear_no_choke", TSK_CHKE + id )
556  }  }
557    
558  public clear_no_choke( tskid )  public clear_no_choke( tskid )
# Line 531  Line 579 
579          }          }
580    
581          //Safe to tp target to aim spot?          //Safe to tp target to aim spot?
582          new Float:tmpvec[3], Float:tmpvec2[3], Float:orig[3], Float:torig[3], Float:trace_ret[3]          new Float:tmpvec[3], Float:orig[3], Float:torig[3], Float:trace_ret[3]
583          new bool:safe = false, i          new bool:safe = false, i
584    
585          entity_get_vector( id, EV_VEC_origin, orig )          get_view_pos( id, orig )
586          entity_get_vector( id, EV_VEC_view_ofs, tmpvec )          tmpvec = vel_by_aim( id, get_pcvar_num( p_min_dist ) )
         for( i = 0; i < 3; i++ ) tmpvec[i] += orig[i]  
         velocity_by_aim( id, get_pcvar_num( p_mindist ), tmpvec2 )  
587    
588          for( new j = 1; j < 11 && !safe; j++ )          for( new j = 1; j < 11 && !safe; j++ )
589          {          {
590                  for( i = 0; i < 3; i++ )                  torig[0] = orig[0] + tmpvec[i] * j
591                          torig[i] = tmpvec[i] + tmpvec2[i] * j                  torig[1] = orig[1] + tmpvec[i] * j
592                    torig[2] = orig[2] + tmpvec[i] * j
593    
594                    traceline( tmpvec, torig, id, trace_ret )
595    
                 trace_line( id, tmpvec, torig, trace_ret )  
596                  if( get_distance_f( trace_ret, torig ) ) break                  if( get_distance_f( trace_ret, torig ) ) break
597                  if( !trace_hull( torig, HULL_HUMAN ) ) safe = true  
598                    engfunc( EngFunc_TraceHull, torig, torig, 0, HULL_HUMAN, 0, 0 )
599                    if ( !get_tr2( 0, TR_StartSolid ) && !get_tr2( 0, TR_AllSolid ) && get_tr2( 0, TR_InOpen ) )
600                            safe = true
601          }          }
602    
603          //Still not safe? Then find another safe spot somewhere around the grabber          //Still not safe? Then find another safe spot somewhere around the grabber
604            pev( id, pev_origin, orig )
605          new try[3]          new try[3]
606          orig[2] += 2          orig[2] += 2
607          while( try[2] < 3 && !safe )          while( try[2] < 3 && !safe )
# Line 562  Line 614 
614                                  case 2 : torig[i] = orig[i] - ( i == 2 ? 80 : 40 )                                  case 2 : torig[i] = orig[i] - ( i == 2 ? 80 : 40 )
615                          }                          }
616    
617                  trace_line( id, tmpvec, torig, trace_ret )                  traceline( tmpvec, torig, id, trace_ret )
618                  if( !trace_hull( torig, HULL_HUMAN ) && !get_distance_f( trace_ret, torig ) ) safe = true  
619                    engfunc( EngFunc_TraceHull, torig, torig, 0, HULL_HUMAN, 0, 0 )
620                    if ( !get_tr2( 0, TR_StartSolid ) && !get_tr2( 0, TR_AllSolid ) && get_tr2( 0, TR_InOpen )
621                                    && !get_distance_f( trace_ret, torig ) ) safe = true
622    
623                  try[0]++                  try[0]++
624                  if( try[0] == 3 )                  if( try[0] == 3 )
# Line 580  Line 635 
635    
636          if( safe )          if( safe )
637          {          {
638                  entity_set_vector( targetid, EV_VEC_origin, torig )                  set_pev( targetid, pev_origin, torig )
639                  set_grabbed( id, targetid )                  set_grabbed( id, targetid )
640                  screenfade_in( id )                  screenfade_in( id )
641          }          }
# Line 618  Line 673 
673          else if( client_data[id][GRABBER] )          else if( client_data[id][GRABBER] )
674                  unset_grabbed( client_data[id][GRABBER] )                  unset_grabbed( client_data[id][GRABBER] )
675  }  }
676    
677    stock traceline( const Float:vStart[3], const Float:vEnd[3], const pIgnore, Float:vHitPos[3] )
678    {
679            engfunc( EngFunc_TraceLine, vStart, vEnd, 0, pIgnore, 0 )
680            get_tr2( 0, TR_vecEndPos, vHitPos )
681            return get_tr2( 0, TR_pHit )
682    }
683    
684    stock get_view_pos( const id, Float:vViewPos[3] )
685    {
686            new Float:vOfs[3]
687            pev( id, pev_origin, vViewPos )
688            pev( id, pev_view_ofs, vOfs )
689    
690            vViewPos[0] += vOfs[0]
691            vViewPos[1] += vOfs[1]
692            vViewPos[2] += vOfs[2]
693    }
694    
695    stock Float:vel_by_aim( id, speed = 1 )
696    {
697            new Float:v1[3], Float:vBlah[3]
698            pev( id, pev_v_angle, v1 )
699            engfunc( EngFunc_AngleVectors, v1, v1, vBlah, vBlah )
700    
701            v1[0] *= speed
702            v1[1] *= speed
703            v1[2] *= speed
704    
705            return v1
706    }

Legend:
Removed from v.1  
changed lines
  Added in v.28

Contact
ViewVC Help
Powered by ViewVC 1.0.4