HLMOD.HU Forrás Megtekintés - www.hlmod.hu
  1. #include <amxmodx>
  2. #include <fakemeta>
  3.  
  4. #pragma semicolon 1
  5.  
  6. #define DISTANCE 120
  7.  
  8. new g_iTeam[33];
  9. new bool:g_bSolid[33];
  10. new bool:g_bHasSemiclip[33];
  11. new Float:g_fOrigin[33][3];
  12.  
  13. new bool:g_bSemiclipEnabled;
  14.  
  15. new g_iForwardId[3];
  16. new g_iMaxPlayers;
  17. new g_iCvar[3];
  18.  
  19. public plugin_init( )
  20. {
  21. register_plugin( "(Team-)Semiclip", "1.2", "SchlumPF*" );
  22.  
  23. g_iCvar[0] = register_cvar( "semiclip_enabled", "1" );
  24. g_iCvar[1] = register_cvar( "semiclip_teamclip", "0" );
  25. g_iCvar[2] = register_cvar( "semiclip_transparancy", "1" );
  26.  
  27. register_forward( FM_ClientCommand, "fwdClientCommand" );
  28.  
  29. if( get_pcvar_num( g_iCvar[0] ) )
  30. {
  31. g_iForwardId[0] = register_forward( FM_PlayerPreThink, "fwdPlayerPreThink" );
  32. g_iForwardId[1] = register_forward( FM_PlayerPostThink, "fwdPlayerPostThink" );
  33. g_iForwardId[2] = register_forward( FM_AddToFullPack, "fwdAddToFullPack_Post", 1 );
  34.  
  35. g_bSemiclipEnabled = true;
  36. }
  37. else
  38. g_bSemiclipEnabled = false;
  39.  
  40. g_iMaxPlayers = get_maxplayers( );
  41. }
  42.  
  43. public fwdPlayerPreThink( plr )
  44. {
  45. static id, last_think;
  46.  
  47. if( last_think > plr )
  48. {
  49. for( id = 1 ; id <= g_iMaxPlayers ; id++ )
  50. {
  51. if( is_user_alive( id ) )
  52. {
  53. if( get_pcvar_num( g_iCvar[1] ) )
  54. g_iTeam[id] = get_user_team( id );
  55.  
  56. g_bSolid[id] = pev( id, pev_solid ) == SOLID_SLIDEBOX ? true : false;
  57. pev( id, pev_origin, g_fOrigin[id] );
  58. }
  59. else
  60. g_bSolid[id] = false;
  61. }
  62. }
  63.  
  64. last_think = plr;
  65.  
  66. if( g_bSolid[plr] )
  67. {
  68. for( id = 1 ; id <= g_iMaxPlayers ; id++ )
  69. {
  70. if( g_bSolid[id] && get_distance_f( g_fOrigin[plr], g_fOrigin[id] ) <= DISTANCE && id != plr )
  71. {
  72. if( get_pcvar_num( g_iCvar[1] ) && g_iTeam[plr] != g_iTeam[id] )
  73. return FMRES_IGNORED;
  74.  
  75. set_pev( id, pev_solid, SOLID_NOT );
  76. g_bHasSemiclip[id] = true;
  77. }
  78. }
  79. }
  80.  
  81. return FMRES_IGNORED;
  82. }
  83.  
  84. public fwdPlayerPostThink( plr )
  85. {
  86. static id;
  87.  
  88. for( id = 1 ; id <= g_iMaxPlayers ; id++ )
  89. {
  90. if( g_bHasSemiclip[id] )
  91. {
  92. set_pev( id, pev_solid, SOLID_SLIDEBOX );
  93. g_bHasSemiclip[id] = false;
  94. }
  95. }
  96. }
  97.  
  98. public fwdAddToFullPack_Post( es_handle, e, ent, host, hostflags, player, pset )
  99. {
  100. if( player )
  101. {
  102. if( g_bSolid[host] && g_bSolid[ent] && get_distance_f( g_fOrigin[host], g_fOrigin[ent] ) <= DISTANCE )
  103. {
  104. if( get_pcvar_num( g_iCvar[1] ) && g_iTeam[host] != g_iTeam[ent] )
  105. return FMRES_IGNORED;
  106.  
  107. set_es( es_handle, ES_Solid, SOLID_NOT ); // makes semiclip flawless
  108.  
  109. if( get_pcvar_num( g_iCvar[2] ) == 1 )
  110. {
  111. set_es( es_handle, ES_RenderMode, kRenderTransAlpha );
  112. set_es( es_handle, ES_RenderAmt, 85 );
  113. }
  114. else if( get_pcvar_num( g_iCvar[2] ) == 2 )
  115. {
  116. set_es( es_handle, ES_Effects, EF_NODRAW );
  117. set_es( es_handle, ES_Solid, SOLID_NOT );
  118. }
  119. }
  120. }
  121.  
  122. return FMRES_IGNORED;
  123. }
  124.  
  125. // is there a better way to detect changings of g_iCvar[0]?
  126. public fwdClientCommand( plr )
  127. {
  128. // use the forwards just when needed, for good performance
  129. if( !get_pcvar_num( g_iCvar[0] ) && g_bSemiclipEnabled )
  130. {
  131. unregister_forward( FM_PlayerPreThink, g_iForwardId[0] );
  132. unregister_forward( FM_PlayerPostThink, g_iForwardId[1] );
  133. unregister_forward( FM_AddToFullPack, g_iForwardId[2], 1 );
  134.  
  135. g_bSemiclipEnabled = false;
  136. }
  137. else if( get_pcvar_num( g_iCvar[0] ) && !g_bSemiclipEnabled )
  138. {
  139. g_iForwardId[0] = register_forward( FM_PlayerPreThink, "fwdPlayerPreThink" );
  140. g_iForwardId[1] = register_forward( FM_PlayerPostThink, "fwdPlayerPostThink" );
  141. g_iForwardId[2] = register_forward( FM_AddToFullPack, "fwdAddToFullPack_Post", 1 );
  142.  
  143. g_bSemiclipEnabled = true;
  144. }
  145. }
  146.