HLMOD.HU Forrás Megtekintés - www.hlmod.hu
  1.  
  2. #include < amxmodx >
  3.  
  4. #include < fakemeta >
  5. #include < hamsandwich >
  6. #include < xs >
  7.  
  8. #pragma semicolon 1
  9.  
  10. #define IsPlayer(%1) (1 <= %1 <= gMaxPlayers)
  11. #define write_coord_f(%0) (engfunc( EngFunc_WriteCoord, %0 ))
  12. #define BREAK_TRANS 0x20
  13.  
  14. const m_bLightSmoke = 114;
  15. const m_bIsC4 = 96;
  16. const m_XoGrenade = 5;
  17.  
  18. new gSpriteShockwave;
  19. new gMaxPlayers;
  20. new gExplodeModel;
  21. new gCvarKnockBackPower;
  22. new gCvarExplosionRadius;
  23. new gCvarInstantExplode;
  24.  
  25. new const gFbExplodeSound[ ] = "x/x_shoot1.wav";
  26. new const gFbExplodeModel[ ] = "models/w_flashbang.mdl";
  27.  
  28. public plugin_init( )
  29. {
  30. register_plugin( "ShockWave FB", "1.1.0", "tuty" );
  31.  
  32. RegisterHam( Ham_Think, "grenade", "bacon_Think" );
  33. RegisterHam( Ham_Touch, "grenade", "bacon_Touch", 1 );
  34.  
  35. gCvarInstantExplode = register_cvar( "fb_instantexplo", "1" );
  36. gCvarKnockBackPower = register_cvar( "fb_knockback", "200.0" );
  37. gCvarExplosionRadius = register_cvar( "fb_exploradius", "350.0" );
  38.  
  39. gMaxPlayers = get_maxplayers( );
  40. }
  41.  
  42. public plugin_precache( )
  43. {
  44. gSpriteShockwave = precache_model( "sprites/shockwave.spr" );
  45. gExplodeModel = precache_model( gFbExplodeModel );
  46.  
  47. precache_sound( gFbExplodeSound );
  48. }
  49.  
  50. public bacon_Think( iEnt )
  51. {
  52. new Float:flGameTime = get_gametime( );
  53. new iOwner;
  54.  
  55. new Float:flDmgTime;
  56. pev( iEnt, pev_dmgtime, flDmgTime );
  57.  
  58. if( flDmgTime <= flGameTime
  59. && get_pdata_int( iEnt, m_bLightSmoke, m_XoGrenade ) == 0
  60. && !( get_pdata_int( iEnt, m_bIsC4, m_XoGrenade ) & ( 1<<8 ) )
  61. && IsPlayer( ( iOwner = pev( iEnt, pev_owner ) ) ) )
  62. {
  63. emit_sound( iEnt, CHAN_WEAPON, gFbExplodeSound, VOL_NORM, ATTN_NORM, 0, PITCH_NORM );
  64. UTIL_KnockBack( iEnt, iOwner, get_pcvar_float( gCvarKnockBackPower ), get_pcvar_float( gCvarExplosionRadius ) );
  65.  
  66. set_pev( iEnt, pev_flags, pev( iEnt, pev_flags ) | FL_KILLME );
  67.  
  68. return HAM_SUPERCEDE;
  69. }
  70.  
  71. return HAM_IGNORED;
  72. }
  73.  
  74. public bacon_Touch( iEnt )
  75. {
  76. if( get_pdata_int( iEnt, m_bLightSmoke, m_XoGrenade ) == 0
  77. && !( get_pdata_int( iEnt, m_bIsC4, m_XoGrenade ) & ( 1<<8 ) )
  78. && IsPlayer( ( pev( iEnt, pev_owner ) ) )
  79. && get_pcvar_num( gCvarInstantExplode ) == 1 )
  80. {
  81. set_pev( iEnt, pev_dmgtime, 0.0 );
  82.  
  83. return HAM_HANDLED;
  84. }
  85.  
  86. return HAM_IGNORED;
  87. }
  88.  
  89. stock UTIL_KnockBack( iEnt, id, Float:flKnockBack, Float:flRadius )
  90. {
  91. new Float:flEntOrigin[ 3 ];
  92. pev( iEnt, pev_origin, flEntOrigin );
  93.  
  94. UTIL_BreakModel( flEntOrigin, gExplodeModel, BREAK_TRANS );
  95.  
  96. UTIL_Cylinder( flEntOrigin, 100 );
  97. UTIL_Cylinder( flEntOrigin, 200 );
  98. UTIL_Cylinder( flEntOrigin, floatround( get_pcvar_float( gCvarExplosionRadius ) ) );
  99.  
  100. new iClient = FM_NULLENT, Float:flClientOrigin[ 3 ], Float:flDistance;
  101.  
  102. while( ( iClient = engfunc( EngFunc_FindEntityInSphere, iClient, flEntOrigin, flRadius ) ) )
  103. {
  104. if( IsPlayer( iClient )
  105. && is_user_alive( iClient )
  106. && get_user_team( id ) != get_user_team( iClient ) )
  107. {
  108. pev( iClient, pev_origin, flClientOrigin );
  109. flDistance = get_distance_f( flEntOrigin, flClientOrigin );
  110.  
  111. if( flDistance <= flRadius )
  112. {
  113. new Float:flVelocity[ 3 ];
  114.  
  115. xs_vec_sub( flClientOrigin, flEntOrigin, flClientOrigin );
  116. xs_vec_normalize( flClientOrigin, flClientOrigin );
  117. pev( iClient, pev_velocity, flVelocity );
  118.  
  119. xs_vec_mul_scalar( flClientOrigin, floatmul( flKnockBack, 800.0 ), flClientOrigin );
  120. xs_vec_add( flVelocity, flClientOrigin, flVelocity );
  121.  
  122. set_pev( iClient, pev_velocity, flVelocity );
  123. }
  124. }
  125. }
  126. }
  127.  
  128. stock UTIL_Cylinder( Float:flOrigin[ 3 ], flRadius )
  129. {
  130. engfunc( EngFunc_MessageBegin, MSG_PVS, SVC_TEMPENTITY, flOrigin );
  131. write_byte( TE_BEAMCYLINDER );
  132. write_coord_f( flOrigin[ 0 ] );
  133. write_coord_f( flOrigin[ 1 ] );
  134. write_coord_f( flOrigin[ 2 ] );
  135. write_coord_f( flOrigin[ 0 ] );
  136. write_coord_f( flOrigin[ 1 ] );
  137. write_coord_f( flOrigin[ 2 ] + flRadius );
  138. write_short( gSpriteShockwave );
  139. write_byte( 0 );
  140. write_byte( 0 );
  141. write_byte( 4 );
  142. write_byte( 40 );
  143. write_byte( 0 );
  144. write_byte( 10 );
  145. write_byte( 255 );
  146. write_byte( 10 );
  147. write_byte( 200 );
  148. write_byte( 0 );
  149. message_end( );
  150. }
  151.  
  152. stock UTIL_BreakModel( Float:flOrigin[ 3 ], model, flags )
  153. {
  154. engfunc( EngFunc_MessageBegin, MSG_PVS, SVC_TEMPENTITY, flOrigin, 0 );
  155. write_byte( TE_BREAKMODEL );
  156. write_coord_f( flOrigin[ 0 ] );
  157. write_coord_f( flOrigin[ 1 ] );
  158. write_coord_f( flOrigin[ 2 ] );
  159. write_coord( 16 );
  160. write_coord( 16 );
  161. write_coord( 16 );
  162. write_coord( random_num( -20, 20 ) );
  163. write_coord( random_num( -20, 20 ) );
  164. write_coord( 10 );
  165. write_byte( 10 );
  166. write_short( model );
  167. write_byte( 10 );
  168. write_byte( 9 );
  169. write_byte( flags );
  170. message_end( );
  171. }
  172.