HLMOD.HU Forrás Megtekintés - www.hlmod.hu
  1. #include <amxmodx>
  2. #include <amxmisc>
  3. #include <fakemeta>
  4. #include <hamsandwich>
  5.  
  6. // COMMENT THIS LINE IF YOU DONT WANT TO USE LANG FILE AND SEE HUD MESSAGES
  7. #define HUD_MESSAGES
  8.  
  9. new Float:g_flLastTouch[ 33 ];
  10. new g_Pointer_FriendlyFire;
  11. new g_iMsg_DeathMsg;
  12. new g_iHookedDeathMsg;
  13. new g_Cvar_Enabled;
  14. new g_iMaxplayers;
  15.  
  16. #define ERROR 0
  17. #define HEGRENADE 1
  18. #define FLASHBANG 2
  19. #define SMOKENADE 3
  20.  
  21. new g_szGrenadeNames[ ][ ] = {
  22. "", // ERROR
  23. "weapon_hegrenade",
  24. "weapon_flashbang",
  25. "weapon_smokegrenade"
  26. };
  27.  
  28. public plugin_init() {
  29. register_plugin( "Grenade Touch Damage", "1.3", "xPaw" );
  30.  
  31. #if defined HUD_MESSAGES
  32. register_dictionary( "grenadetouchdmg.txt" );
  33. #endif
  34.  
  35. g_Cvar_Enabled = register_cvar( "grenade_touch_dmg", "1", FCVAR_SERVER );
  36.  
  37. g_iMaxplayers = get_maxplayers( );
  38. g_iMsg_DeathMsg = get_user_msgid( "DeathMsg" );
  39.  
  40. if( cstrike_running( ) ) {
  41. g_Pointer_FriendlyFire = get_cvar_pointer( "mp_friendlyfire" );
  42.  
  43. RegisterHam( Ham_Touch, "grenade", "FwdHamTouch_Grenade" );
  44. } else
  45. set_fail_state( "Only Counter-Strike Mod allowed!" );
  46. }
  47.  
  48. public MsgDeathMsg( ) {
  49. set_msg_arg_int( 3, ARG_BYTE, 1 );
  50. set_msg_arg_string( 4, "grenade" );
  51.  
  52. return PLUGIN_CONTINUE;
  53. }
  54.  
  55. public FwdHamTouch_Grenade( iEntity, iTouched ) {
  56. if( !get_pcvar_num( g_Cvar_Enabled ) )
  57. return HAM_IGNORED;
  58.  
  59. if( !( 1 <= iTouched <= g_iMaxplayers ) )
  60. return HAM_IGNORED;
  61.  
  62. static Float:flGmTime;
  63. flGmTime = get_gametime();
  64.  
  65. if( g_flLastTouch[iTouched] < flGmTime ) {
  66. new iOwner = pev( iEntity, pev_owner );
  67.  
  68. if( iOwner == iTouched )
  69. return HAM_IGNORED;
  70.  
  71. if( is_user_connected( iOwner ) ) {
  72. if( !get_pcvar_num( g_Pointer_FriendlyFire ) && ( get_user_team( iTouched ) == get_user_team( iOwner ) ) )
  73. return HAM_IGNORED;
  74.  
  75. if( pev( iTouched, pev_takedamage ) == DAMAGE_NO )
  76. return HAM_IGNORED;
  77.  
  78. new Float:flVelocity[ 3 ];
  79. pev( iEntity, pev_velocity, flVelocity );
  80.  
  81. new Float:flSpeed = vector_length( flVelocity );
  82. new Float:flDamage = ( flSpeed * 0.15 ) / 13.0;
  83.  
  84. if( flSpeed > 100.0 ) { // anti grenade stuck bug damage fix
  85. g_iHookedDeathMsg = register_message( g_iMsg_DeathMsg, "MsgDeathMsg" );
  86.  
  87. new iType = GetGrenadeType( iEntity );
  88. if( iType != ERROR )
  89. set_pev( iEntity, pev_classname, g_szGrenadeNames[ iType ] );
  90.  
  91. ExecuteHamB( Ham_TakeDamage, iTouched, iEntity, iOwner, flDamage, DMG_GENERIC );
  92.  
  93. if( g_iHookedDeathMsg ) {
  94. unregister_message( g_iMsg_DeathMsg, g_iHookedDeathMsg );
  95.  
  96. g_iHookedDeathMsg = 0;
  97. }
  98.  
  99. if( iType != ERROR )
  100. set_pev( iEntity, pev_classname, "grenade" );
  101.  
  102. #if defined HUD_MESSAGES
  103. new iReceivedDamage = pev( iTouched, pev_dmg_take );
  104.  
  105. new szName[ 32 ], szNameOwner[ 32 ];
  106. get_user_name( iTouched, szName, 31 );
  107. get_user_name( iOwner, szNameOwner, 31 );
  108.  
  109. set_hudmessage( 250, 150, 0, -1.0, 0.30, 0, 6.0, 6.0, 0.5, 0.4, 4 );
  110.  
  111. if( !is_user_alive( iTouched ) ) {
  112. show_hudmessage( iOwner, "%L", iOwner, "GTD_KILLED", szName );
  113. show_hudmessage( iTouched, "%L", iTouched, "GTD_KILLED2", szNameOwner );
  114. } else {
  115. show_hudmessage( iOwner, "%L", iOwner, "GTD_MADEDMG", szName, iReceivedDamage );
  116. show_hudmessage( iTouched, "%L", iTouched, "GTD_LOSTHP", szNameOwner, iReceivedDamage );
  117. }
  118. #endif
  119. }
  120. }
  121.  
  122. g_flLastTouch[iTouched] = flGmTime + 0.4;
  123. }
  124.  
  125. return HAM_IGNORED;
  126. }
  127.  
  128. stock GetGrenadeType( iEntity ) {
  129. if( !pev_valid( iEntity ) )
  130. return ERROR;
  131.  
  132. new szModel[ 32 ];
  133. pev( iEntity, pev_model, szModel, charsmax( szModel ) );
  134.  
  135. if( szModel[ 7 ] != 'w' && szModel[ 8 ] != '_' )
  136. return ERROR;
  137.  
  138. switch( szModel[ 9 ] ) {
  139. case 'h': return HEGRENADE;
  140. case 'f': return FLASHBANG;
  141. case 's': return SMOKENADE;
  142. default : return ERROR;
  143. }
  144.  
  145. return ERROR;
  146. }