HLMOD.HU Forrás Megtekintés - www.hlmod.hu
  1. #include <amxmodx>
  2. #include <fakemeta>
  3. #include <hamsandwich>
  4.  
  5. #define PLUGIN "Nade Semiclip"
  6. #define VERSION "2.4"
  7. #define AUTHOR "JustGo"
  8.  
  9. #define OFFSET_TEAM 114
  10. #define fm_get_user_team(%1) get_pdata_int(%1,OFFSET_TEAM)
  11. #define is_grenade_c4(%1) (get_pdata_int(%1, 96) & (1<<8)) // 96 is the C4 offset
  12.  
  13. #define SEMI_CLIP_DISTANCE 100.0
  14.  
  15. new cvar_nade_semiclip, g_nade_semiclip
  16.  
  17. public plugin_init()
  18. {
  19. register_plugin(PLUGIN, VERSION, AUTHOR)
  20.  
  21. register_event("HLTV", "event_round_start", "a", "1=0", "2=0")
  22.  
  23. RegisterHam(Ham_Think, "grenade", "Think_Grenade")
  24.  
  25. register_forward(FM_SetModel, "SetModel")
  26. register_forward(FM_ShouldCollide, "ShouldCollide")
  27.  
  28. cvar_nade_semiclip = register_cvar( "nade_semiclip", "1" )
  29. }
  30.  
  31. public event_round_start()
  32. {
  33. g_nade_semiclip = get_pcvar_num( cvar_nade_semiclip )
  34. }
  35.  
  36. // Grenade Think Forward
  37. public Think_Grenade(entity)
  38. {
  39. if(!g_nade_semiclip)
  40. return HAM_IGNORED
  41.  
  42. if(!pev_valid(entity))
  43. return HAM_IGNORED
  44.  
  45. if(is_grenade_c4(entity))
  46. return HAM_IGNORED
  47.  
  48. static Float:dmgtime
  49. pev(entity, pev_dmgtime, dmgtime)
  50.  
  51. if(dmgtime <= get_gametime())
  52. set_pev(entity, pev_owner,pev(entity,pev_iuser2)); // fix for other plugin that gets flasher name or stuff like that.
  53.  
  54. return HAM_IGNORED;
  55. }
  56.  
  57. public SetModel(iEntity, const Model[])
  58. {
  59. if(!g_nade_semiclip)
  60. return FMRES_IGNORED
  61.  
  62. if(!is_grenade(iEntity))
  63. return FMRES_IGNORED
  64.  
  65. static id; id = pev(iEntity, pev_owner)
  66. if(!pev(iEntity,pev_iuser2))
  67. {
  68. set_pev(iEntity,pev_iuser2,id) //remeber the real nade owner
  69. set_pev(iEntity,pev_iuser1,fm_get_user_team(id)) // remeber the nade owner team
  70. }
  71.  
  72. return FMRES_IGNORED
  73. }
  74.  
  75. public ShouldCollide(playerindex, entindex)
  76. {
  77. if(!g_nade_semiclip)
  78. return FMRES_IGNORED
  79.  
  80. if(!is_user_alive(playerindex) || !is_grenade(entindex))
  81. return FMRES_IGNORED
  82.  
  83. // Get damage time of grenade
  84. static Float:dmgtime
  85. pev(entindex, pev_dmgtime, dmgtime)
  86.  
  87. if(dmgtime <= get_gametime())
  88. return FMRES_IGNORED
  89.  
  90. if(close_enough(playerindex,entindex))
  91. {
  92. if(g_nade_semiclip == 1 && (fm_get_user_team( playerindex ) != pev(entindex,pev_iuser1)))
  93. return FMRES_IGNORED
  94.  
  95. set_pev(entindex,pev_owner,playerindex)
  96. }
  97.  
  98. return FMRES_IGNORED
  99. }
  100.  
  101. is_grenade(iEntity)
  102. {
  103. if( !pev_valid(iEntity) )
  104. return 0
  105.  
  106. static class[9]
  107. pev(iEntity, pev_classname, class, charsmax(class))
  108. if( !equal(class, "grenade") )
  109. return 0
  110.  
  111. if (is_grenade_c4(iEntity))
  112. return 0
  113.  
  114. return 1
  115. }
  116.  
  117. public bool:close_enough(ent1, ent2)
  118. {
  119. static Float:origin[3], Float:origin2[3]
  120.  
  121. pev(ent1, pev_origin, origin )
  122. pev(ent2, pev_origin, origin2 )
  123.  
  124. if( get_distance_f( origin, origin2 ) <= SEMI_CLIP_DISTANCE )
  125. return true
  126.  
  127. return false
  128. }