HLMOD.HU Forrás Megtekintés - www.hlmod.hu
  1. /*
  2. amx_freeze
  3.   by Drekes
  4.  
  5.   Description:
  6.   Makes it able for admins to freeze a player, this will make him unable to move or jump.
  7.  
  8.   Cvars:
  9.   amx_freeze_knife_only 0/1 Makes a frozen player hold only his knife
  10.  
  11. Command:
  12. amx_freeze <@all/@T/@CT/player> <0/1> <seconds>
  13.  
  14. seconds is optional.
  15.  
  16.   Changelog:
  17.   v1.0: - Release
  18.  
  19.   v1.1: - Merged several functions. darkgod's suggestion
  20.   - Remade the activity code. darkgod's suggestion
  21.   - Changed the numtime code. darkgod's suggestion
  22.   - Added a timer. Elite Taco's suggestion
  23.   - Added cvar for game-monitor
  24.  
  25.   v1.2: - Changed way of freezing Many peoples suggestion
  26.   - knife only (cvar)
  27.  
  28.   v1.3: - Added @ct/@t/@all support ConnorMcleod's suggestion.
  29.   - Filtered curweapon ConnorMcleod's suggestion.
  30.   - changed timer code.
  31.  
  32. v1.4: - Converted to fakemeta.
  33. - Made cstrike version.
  34.  
  35. v1.5: - Blocked players view when frozen. ConnorMcleod's suggestion.
  36. - Used bits to check and set frozen players. ConnorMcleod's suggestion.
  37.  
  38. v1.6: - Remove reduntant code. ConnorMcleod's suggestion.
  39. - Removed cstrike version since
  40. get_user_team isn't used anymore.
  41. - unregistered PlayerPreThink when it's not
  42. needed. ConnorMcLeod's suggestion.
  43.  
  44. v1.7: - optimized code ConnorMcLeod's suggestion.
  45.  
  46. v1.8: - Changed syntax of command Seta00's suggestion.
  47.  
  48.   Credits:
  49.   - RedRobster: Helping me find an annoying mistake that kept crashing my server.
  50. - Bugsy: For the bitfield tutorial and the macro's.
  51. - ConnorMcleod / ArkShine / Seta00: Suggestions to improve the plugin.
  52. - All the other people that suggested and helped improving the plugin
  53. */
  54.  
  55. #pragma semicolon 1
  56.  
  57. #include <amxmodx>
  58. #include <amxmisc>
  59. #include <fakemeta>
  60.  
  61. #define VERSION "1.8"
  62.  
  63. #define Freeze(%1) (frozen |= (1<<(%1&31)))
  64. #define UnFreeze(%1) (frozen &= ~(1<<(%1&31)))
  65. #define IsFrozen(%1) (frozen & (1<<(%1&31)))
  66.  
  67. enum teams
  68. {
  69. ALL,
  70. T,
  71. CT
  72. };
  73.  
  74. new const g_TeamNames[teams][] =
  75. {
  76. "all players",
  77. "terrorists",
  78. "counter-terrorists"
  79. };
  80.  
  81. new cvar_knife;
  82. new frozen;
  83. new g_PreThinkId;
  84.  
  85. new Float: g_Angles[33][3];
  86.  
  87. public plugin_init()
  88. {
  89. register_plugin("amx freeze", VERSION, "Drekes");
  90.  
  91. register_concmd("amx_freeze", "Cmd_Freeze", ADMIN_KICK, "<player> <0/1> <seconds> ^"Freeze/unfreeze a player^"");
  92.  
  93. register_event("CurWeapon", "Event_CurWeapon", "be", "1=1", "2!29");
  94.  
  95.  
  96. register_cvar("freeze_version", VERSION, FCVAR_SERVER | FCVAR_SPONLY);
  97. cvar_knife = register_cvar("amx_freeze_knife_only", "1");
  98.  
  99. }
  100.  
  101. public client_disconnect(id)
  102. {
  103. if(IsFrozen(id))
  104. UnFreeze(id);
  105.  
  106. if(!frozen && g_PreThinkId)
  107. {
  108. unregister_forward(FM_PlayerPreThink, g_PreThinkId);
  109.  
  110. g_PreThinkId = 0;
  111. }
  112. }
  113.  
  114. public Cmd_Freeze(id, level, cid)
  115. {
  116. if(!cmd_access(id, level, cid, 3))
  117. return PLUGIN_HANDLED;
  118.  
  119. new admin_name[34];
  120. get_user_name(id, admin_name, charsmax(admin_name));
  121.  
  122. new target[34], szOn[3], szTime[6];
  123.  
  124. read_argv(1, target, charsmax(target));
  125. read_argv(2, szOn, charsmax(szOn));
  126. read_argv(3, szTime, charsmax(szTime));
  127.  
  128. new iOn = str_to_num(szOn);
  129. new Float: fTime = str_to_float(szTime);
  130.  
  131. if(target[0] == '@')
  132. {
  133. new players[32], pnum;
  134. new teams: team;
  135.  
  136. switch(target[1])
  137. {
  138. case 'A', 'a':
  139. {
  140. get_players(players, pnum);
  141.  
  142. team = ALL;
  143. }
  144.  
  145. case 'T', 't':
  146. {
  147. get_players(players, pnum, "ae", "TERRORIST");
  148.  
  149. team = T;
  150. }
  151.  
  152. case 'C', 'c':
  153. {
  154. get_players(players, pnum, "ae", "CT");
  155.  
  156. team = CT;
  157. }
  158. }
  159.  
  160. for(new i = 0; i < pnum; i++)
  161. freeze(players[i], iOn, fTime);
  162.  
  163. show_activity(id, admin_name, "%sfroze %s", iOn == 0 ? "un" : "", g_TeamNames[team]);
  164. log_amx("%s %sfroze %s", admin_name, iOn == 0 ? "un" : "", g_TeamNames[team]);
  165.  
  166. return PLUGIN_HANDLED;
  167. }
  168.  
  169. new player = cmd_target(id, target, CMDTARGET_OBEY_IMMUNITY | CMDTARGET_ALLOW_SELF);
  170.  
  171. if(!player)
  172. return PLUGIN_HANDLED;
  173.  
  174. freeze(player, iOn, fTime);
  175.  
  176. new plName[34];
  177. get_user_name(player, plName, charsmax(plName));
  178.  
  179. show_activity(id, admin_name, "%slefagyasztotta %s -t", iOn == 0 ? "un" : "", plName);
  180. log_amx("%s %sfroze %s", admin_name, iOn == 0 ? "un" : "", plName);
  181.  
  182. return PLUGIN_HANDLED;
  183. }
  184.  
  185. freeze(id, on, Float:Time)
  186. {
  187. if(!is_user_alive(id))
  188. return PLUGIN_HANDLED;
  189.  
  190. if(!on)
  191. {
  192. UnFreeze(id);
  193.  
  194. set_pev(id, pev_flags, pev(id, pev_flags) & ~FL_FROZEN);
  195. set_pev(id, pev_fixangle, 0);
  196.  
  197. if(!frozen && g_PreThinkId)
  198. {
  199. unregister_forward(FM_PlayerPreThink, g_PreThinkId);
  200.  
  201. g_PreThinkId = 0;
  202. }
  203. }
  204.  
  205. else
  206. {
  207. if(get_pcvar_num(cvar_knife))
  208. engclient_cmd(id, "weapon_knife");
  209.  
  210. if(!frozen && !g_PreThinkId)
  211. g_PreThinkId = register_forward(FM_PlayerPreThink, "Fwd_PlayerPreThink");
  212.  
  213. Freeze(id);
  214.  
  215. set_pev(id, pev_flags, pev(id, pev_flags) | FL_FROZEN);
  216. pev(id, pev_v_angle, g_Angles[id]);
  217.  
  218. if(Time)
  219. set_task(Time, "Task_Unfreeze", id);
  220. }
  221.  
  222. return PLUGIN_HANDLED;
  223. }
  224.  
  225. public Task_Unfreeze(id)
  226. {
  227. if(is_user_connected(id))
  228. {
  229. UnFreeze(id);
  230.  
  231. set_pev(id, pev_flags, pev(id, pev_flags) & ~FL_FROZEN);
  232. set_pev(id, pev_fixangle, 0);
  233.  
  234. client_print(id, print_chat, "[AMXX] Ki lettel olvasztva.");
  235.  
  236. if(!frozen && g_PreThinkId)
  237. {
  238. unregister_forward(FM_PlayerPreThink, g_PreThinkId);
  239.  
  240. g_PreThinkId = 0;
  241. }
  242. }
  243. }
  244.  
  245. public Event_CurWeapon(id)
  246. {
  247. if(IsFrozen(id))
  248. {
  249. if(is_user_alive(id) && get_pcvar_num(cvar_knife))
  250. engclient_cmd(id, "weapon_knife");
  251. }
  252. }
  253.  
  254. public Fwd_PlayerPreThink(id)
  255. {
  256. if(IsFrozen(id))
  257. {
  258. if(is_user_alive(id))
  259. {
  260. set_pev(id, pev_v_angle, g_Angles[id]);
  261. set_pev(id, pev_fixangle, 1);
  262. }
  263. }
  264. }
  265.  
  266.