HLMOD.HU Forrás Megtekintés - www.hlmod.hu
  1. #include <amxmodx>
  2. #include <reapi>
  3.  
  4. #pragma semicolon 1
  5.  
  6. #define ACCESS_LEVEL_IMMUNITY (ADMIN_MENU|ADMIN_LEVEL_H)
  7. // Immunitás jogát itt tudod beállítani
  8.  
  9. #define TIME_AFK_CHECK 15.0
  10. // Mennyi időközönként ellenőrizze, hogy valaki afk-e, minél kevesebb az idő, annál nagyobb terhelést kap a szerver.
  11. // Ha a NOROUND aktiv (CSDM esetén pl), érdemes a TIME_AFK_CHECK-nek kissebb értéket adni, mivel spawnkor nem indul új kör. // a fordítás lehet nem tökéletes
  12.  
  13. #define MAX_AFK_WARNING 3 // Hányszor figyelmeztesse a játékos.
  14. #define TIME_SPECT_CHECK 60.0 // Mennyi időközönként ellenőrizze, hogy valaki néző-e, minél kevesebb az idő, annál nagyobb terhelést kap a szerver.
  15. #define MAX_SPECT_CHECK_PL 2 // Hány ellenőrzés után rúgja ki a szerver
  16. #define MIN_PLAYERS_CHECK 30 // Hány játékosnál ellenőrizze a nézőket, csak ha aktív a MAX_SPECT_CHECK_PL
  17. // #define NOROUND // Végtelen kör esetén használandó. Pl: CSDM, GunGame
  18. #define BOMB_TRANSFER
  19. // Ha az AFK nál van a bomba akkor eldobja vagy másnak adja
  20. // Ha csak azt szeretnénk, hogy csak eldobja a bombát
  21. // Akkor aktiváld NOROUND-ot
  22.  
  23. #define get_bit(%1,%2) (%1 & (1 << (%2 & 31)))
  24. #define set_bit(%1,%2) %1 |= (1 << (%2 & 31))
  25. #define clr_bit(%1,%2) %1 &= ~(1 << (%2 & 31))
  26.  
  27. new Float:g_fOldOrigin[33][3], Float:g_fOldAngles[33][3];
  28. new g_bitValid;
  29. #if defined NOROUND
  30. new g_bitSpec;
  31. #endif
  32. new g_iWarning[33];
  33. new pnum, players[32];
  34. new g_count[33];
  35.  
  36. public plugin_init()
  37. {
  38. #if defined NOROUND
  39. RegisterHookChain(RG_CBasePlayer_Spawn, "PlrSpwn_Post", true);
  40. #define VERSION "1.4.1 [NoRnd]"
  41. #else
  42. register_logevent("LeRoundStart", 2, "1=Round_Start");
  43. #define VERSION "1.4.1 [Rnd]"
  44. #endif
  45. register_plugin("AFK Control", VERSION, "neygomon");
  46. set_task(TIME_SPECT_CHECK, "SpectatorCheck", .flags = "b");
  47. }
  48.  
  49. public client_putinserver(id)
  50. {
  51. if(is_user_bot(id) || is_user_hltv(id) || get_user_flags(id) & ACCESS_LEVEL_IMMUNITY)
  52. clr_bit(g_bitValid, id);
  53. else set_bit(g_bitValid, id);
  54. g_count[id] = 0;
  55. #if defined NOROUND
  56. clr_bit(g_bitSpec, id);
  57. #endif
  58. }
  59. #if defined NOROUND
  60. public client_disconnected(id)
  61. remove_task(id);
  62.  
  63. public PlrSpwn_Post(id)
  64. if(is_user_alive(id))
  65. LeRoundStart(id);
  66. #endif
  67. public LeRoundStart(id)
  68. {
  69. #if defined NOROUND
  70. if(!get_bit(g_bitSpec, id))
  71. {
  72. get_entvar(id, var_origin, g_fOldOrigin[id]);
  73. get_entvar(id, var_angles, g_fOldAngles[id]);
  74.  
  75. if(!task_exists(id))
  76. set_task(TIME_AFK_CHECK, "AfkCheck", id, .flags = "b");
  77. else change_task(id, TIME_AFK_CHECK);
  78. }
  79. #else
  80. static freezetime;
  81. if(!freezetime) freezetime = get_cvar_pointer("mp_freezetime");
  82. if(get_pcvar_num(freezetime) > 0)
  83. GoCheckPlayers();
  84. else set_task(1.0, "GoCheckPlayers");
  85. #endif
  86. }
  87.  
  88. public GoCheckPlayers()
  89. {
  90. get_players(players, pnum, "ah");
  91. for(new i; i < pnum; i++)
  92. {
  93. g_iWarning[players[i]] = 0;
  94. get_entvar(players[i], var_origin, g_fOldOrigin[players[i]]);
  95. get_entvar(players[i], var_angles, g_fOldAngles[players[i]]);
  96. }
  97.  
  98. if(!task_exists(87892789))
  99. set_task(TIME_AFK_CHECK, "AfkCheck", 87892789, .flags = "b");
  100. else change_task(87892789, TIME_AFK_CHECK);
  101. }
  102.  
  103. public AfkCheck(id)
  104. {
  105. if(id == 87892789)
  106. get_players(players, pnum, "ah");
  107. else if(!is_user_connected(id))
  108. return;
  109. else players[0] = id, pnum = 1;
  110.  
  111. for(new i, Float:fNewOrigin[3], Float:fNewAngles[3], szName[32]; i < pnum; i++)
  112. {
  113. get_entvar(players[i], var_origin, fNewOrigin);
  114. get_entvar(players[i], var_angles, fNewAngles);
  115.  
  116. if(!xs_vec_equal(g_fOldOrigin[players[i]], fNewOrigin) || !xs_vec_equal(g_fOldAngles[players[i]], fNewAngles))
  117. {
  118. g_iWarning[players[i]] = 0;
  119. xs_vec_copy(fNewOrigin, g_fOldOrigin[players[i]]);
  120. xs_vec_copy(fNewAngles, g_fOldAngles[players[i]]);
  121. continue;
  122. }
  123.  
  124. get_entvar(players[i], var_netname, szName, charsmax(szName));
  125. if(++g_iWarning[players[i]] >= MAX_AFK_WARNING)
  126. {
  127. user_kill(players[i], 1);
  128. engclient_cmd(players[i], "jointeam", "6");
  129. client_cmd(players[i], "spk events/friend_died");
  130. ChatColor(0, players[i], "^4[AFKControl] ^3Játékos: ^1%s ^3spectatorba helyezve, mert ^1AFK", szName);
  131. #if defined NOROUND
  132. set_bit(g_bitSpec, players[i]);
  133. remove_task(players[i]);
  134. #endif
  135. }
  136. else
  137. {
  138. client_cmd(players[i], "spk events/tutor_msg");
  139. ChatColor(players[i], 0, "^4[AFKControl] ^3Nem mozdulsz! Figyelmeztetések: ^1%i^3/^1%i", g_iWarning[players[i]], MAX_AFK_WARNING);
  140. }
  141. #if !defined NOROUND
  142. if(get_entvar(players[i], var_weapons) & (1 << CSW_C4))
  143. {
  144. ChatColor(0, players[i], "^4[^4AFKControl] ^3Játékos: ^1%s ^3eldobta a bombát, mert ^1AFK", szName);
  145. #if defined BOMB_TRANSFER
  146. rg_transfer_c4(players[i], 0);
  147. #else
  148. engclient_cmd(players[i], "drop", "weapon_c4");
  149. #endif
  150. }
  151. #endif
  152. }
  153. }
  154.  
  155. public SpectatorCheck()
  156. {
  157. if(get_playersnum() < MIN_PLAYERS_CHECK)
  158. return;
  159.  
  160. new players[32], pnum;
  161. get_players(players, pnum, "h");
  162. for(new i, szName[32]; i < pnum; i++)
  163. {
  164. if(!get_bit(g_bitValid, players[i]))
  165. continue;
  166.  
  167. switch(get_member(players[i], m_iTeam))
  168. {
  169. case 0, 3:
  170. {
  171. if(++g_count[players[i]] >= MAX_SPECT_CHECK_PL)
  172. {
  173. get_entvar(players[i], var_netname, szName, charsmax(szName));
  174. ChatColor(0, players[i], "^4[AFKControl] ^3Játékos:^1 %s ^3túl sok időt töltött a nézők között ezért kirúgva", szName);
  175. server_cmd("kick #%d Tul sok ideig voltal nezo", get_user_userid(players[i]));
  176. }
  177. }
  178. }
  179. }
  180. }
  181.  
  182. stock bool:xs_vec_equal(const Float:vec1[], const Float:vec2[])
  183. return (vec1[0] == vec2[0]) && (vec1[1] == vec2[1]) && (vec1[2] == vec2[2]);
  184.  
  185. stock xs_vec_copy(const Float:vecIn[], Float:vecOut[])
  186. {
  187. vecOut[0] = vecIn[0];
  188. vecOut[1] = vecIn[1];
  189. vecOut[2] = vecIn[2];
  190. }
  191.  
  192. stock ChatColor(id, id2, const szMessage[], any:...)
  193. {
  194. if(id && !is_user_connected(id))
  195. return;
  196.  
  197. new szMsg[190]; vformat(szMsg, charsmax(szMsg), szMessage, 4);
  198.  
  199. message_begin(id ? MSG_ONE : MSG_ALL, 76, .player = id);
  200. write_byte(id2 ? id2 : id);
  201. write_string(szMsg);
  202. message_end();
  203. }