Advertisement
Guest User

Infinity jump

a guest
Nov 8th, 2012
1,750
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 33.68 KB | None | 0 0
  1. /*
  2. * Infinite-Jumping (Bunny Hop, Double Jump & Initial Jump)
  3. *
  4. * Description:
  5. * Lets user auto jump when holding down space. This plugin includes the DoubleJump plugin too. This plugin should work for all games.
  6. *
  7. * Installation:
  8. * Place infinite-jumping.smx into your '<moddir>/addons/sourcemod/plugins/' folder.
  9. * Place plugin.infinite-jumping.cfg into your '<moddir>/cfg/sourcemod/' folder.
  10. *
  11. *
  12. * For more information see: http://forums.alliedmods.net/showthread.php?p=1239361 OR http://www.mannisfunhouse.eu/
  13. */
  14.  
  15. /*****************************************************************
  16.  
  17.  
  18. C O M P I L E O P T I O N S
  19.  
  20.  
  21. *****************************************************************/
  22. // enforce semicolons after each code statement
  23. #pragma semicolon 1
  24.  
  25. /*****************************************************************
  26.  
  27.  
  28. P L U G I N I N F O
  29.  
  30.  
  31. *****************************************************************/
  32. #define PLUGIN_NAME "Infinite Jumping"
  33. #define PLUGIN_TAG "sm"
  34. #define PLUGIN_PRINT_PREFIX "[SM]"
  35. #define PLUGIN_AUTHOR "Chanz"
  36. #define PLUGIN_DESCRIPTION "Lets user auto jump when holding down space. This plugin includes the DoubleJump plugin too."
  37. #define PLUGIN_VERSION "2.14.40"
  38. #define PLUGIN_URL "http://forums.alliedmods.net/showthread.php?p=1239361 OR http://www.mannisfunhouse.eu/"
  39.  
  40. public Plugin:myinfo = {
  41. name = PLUGIN_NAME,
  42. author = PLUGIN_AUTHOR,
  43. description = PLUGIN_DESCRIPTION,
  44. version = PLUGIN_VERSION,
  45. url = PLUGIN_URL
  46. }
  47.  
  48. /*****************************************************************
  49.  
  50.  
  51. P L U G I N I N C L U D E S
  52.  
  53.  
  54. *****************************************************************/
  55. #include <sourcemod>
  56. #include <sdktools>
  57. #undef REQUIRE_EXTENSIONS
  58. #include <clientprefs>
  59. #include <smlib>
  60. #include <smlib/pluginmanager>
  61.  
  62. /*****************************************************************
  63.  
  64.  
  65. P L U G I N D E F I N E S
  66.  
  67.  
  68. *****************************************************************/
  69. #define TIMER_THINK 10.0
  70.  
  71. /*****************************************************************
  72.  
  73.  
  74. G L O B A L V A R S
  75.  
  76.  
  77. *****************************************************************/
  78. //ConVar Handles:
  79. new Handle:g_cvarFlag_Infinite = INVALID_HANDLE;
  80. new Handle:g_cvarFlag_Double = INVALID_HANDLE;
  81. new Handle:g_cvarFlag_PerfectDouble = INVALID_HANDLE;
  82. new Handle:g_cvarFlag_GameSlowDowns = INVALID_HANDLE;
  83. new Handle:g_cvarFlag_ForwardBoost = INVALID_HANDLE;
  84. new Handle:g_cvarBoost_Initial = INVALID_HANDLE;
  85. new Handle:g_cvarBoost_Double = INVALID_HANDLE;
  86. new Handle:g_cvarMax_DoubleJumps = INVALID_HANDLE;
  87. new Handle:g_cvarOr_Stamina = INVALID_HANDLE;
  88. new Handle:g_cvarOr_SlowDownOnHurt = INVALID_HANDLE;
  89. new Handle:g_cvarBoost_Forward = INVALID_HANDLE;
  90. new Handle:g_cvarBoost_Forward_WSAD = INVALID_HANDLE;
  91.  
  92. //ConVars runtime saver:
  93. new String:g_szPlugin_Flag_Infinite[11] = "";
  94. new String:g_szPlugin_Flag_Double[11] = "";
  95. new String:g_szPlugin_Flag_PerfectDouble[11] = "";
  96. new String:g_szPlugin_Flag_GameSlowDowns[11] = "";
  97. new String:g_szPlugin_Flag_ForwardBoost[11] = "";
  98. new Float:g_flPlugin_Boost_Initial = 0.0;
  99. new Float:g_flPlugin_Boost_Double = 0.0;
  100. new g_iPlugin_Max_DoubleJumps = 0;
  101. new Float:g_flPlugin_Or_Stamina = 0.0;
  102. new Float:g_flPlugin_Or_SlowDownOnHurt = 1.0;
  103. new Float:g_flPlugin_Boost_Forward = 0.0;
  104. new g_iPlugin_Boost_Forward_WSAD = 1;
  105.  
  106. //Cookies
  107. new bool:g_bCookiesEnabled = false;
  108.  
  109. new Handle:g_hCookie_BanTime = INVALID_HANDLE;
  110. new Handle:g_hCookie_Switch = INVALID_HANDLE;
  111.  
  112. new g_iCooMem_BanTime[MAXPLAYERS+1];
  113. new bool:g_bCooMem_Switch[MAXPLAYERS+1];
  114. new bool:g_bIsBanned[MAXPLAYERS+1];
  115.  
  116. //Allow list for Clients:
  117. new bool:g_bAllow_InfiniteJump[MAXPLAYERS+1];
  118. new bool:g_bAllow_DoubleJump[MAXPLAYERS+1];
  119. new bool:g_bAllow_PerfectDoubleJump[MAXPLAYERS+1];
  120. new bool:g_bAllow_AntiSlowDowns[MAXPLAYERS+1];
  121. new bool:g_bAllow_ForwardBoost[MAXPLAYERS+1];
  122.  
  123. //Counter
  124. new g_iDoubleJumps[MAXPLAYERS+1];
  125.  
  126. //Offsets
  127. new g_Offset_m_flStamina = -1;
  128. new g_Offset_m_flVelocityModifier = -1;
  129.  
  130. /*****************************************************************
  131.  
  132.  
  133. F O R W A R D P U B L I C S
  134.  
  135.  
  136. *****************************************************************/
  137. public APLRes:AskPluginLoad2(Handle:myself, bool:late, String:error[], err_max){
  138.  
  139. MarkNativeAsOptional("SetCookieMenuItem");
  140. MarkNativeAsOptional("RegClientCookie");
  141. MarkNativeAsOptional("AreClientCookiesCached");
  142. MarkNativeAsOptional("SetClientCookie");
  143. MarkNativeAsOptional("GetClientCookie");
  144. return APLRes_Success;
  145. }
  146.  
  147. public OnPluginStart() {
  148.  
  149. //Init for smlib
  150. SMLib_OnPluginStart(PLUGIN_NAME,PLUGIN_TAG,PLUGIN_VERSION,PLUGIN_AUTHOR,PLUGIN_DESCRIPTION,PLUGIN_URL);
  151.  
  152. //Translations (you should use it always when printing something to clients)
  153. //Always with plugin. as prefix, the short name and .phrases as postfix.
  154. decl String:translationsName[PLATFORM_MAX_PATH];
  155. Format(translationsName,sizeof(translationsName),"plugin.%s.phrases",g_sPlugin_Short_Name);
  156. File_LoadTranslations(translationsName);
  157.  
  158.  
  159. //ConVars
  160. g_cvarFlag_Infinite = CreateConVarEx("flags_infinite", "0", "Automatic rejump.\n\"1\" = force on.\n\"0\" = force off.\n\"<adminflag>\" = admin with this flag can (a,b,c,d,...).\nSee: addons/sourcemod/configs/admin_levels.cfg for more info.",FCVAR_PLUGIN);
  161. g_cvarFlag_Double = CreateConVarEx("flags_double", "0", "Rejump in mid air.\n\"\" = everyone can.\n\"0\" = noone can.\n\"<adminflag>\" = admin with this flag can (a,b,c,d,...).\nSee: addons/sourcemod/configs/admin_levels.cfg for more info.",FCVAR_PLUGIN);
  162. g_cvarFlag_PerfectDouble = CreateConVarEx("flags_perfectdouble", "0", "Jump automatic in mid air when jump is pressed.\n\"\" = everyone can.\n\"0\" = noone can.\n\"<adminflag>\" = admin with this flag can (a,b,c,d,...).\nSee: addons/sourcemod/configs/admin_levels.cfg for more info.",FCVAR_PLUGIN);
  163. g_cvarFlag_GameSlowDowns = CreateConVarEx("flags_gameslowdowns", "", "Bypass game slow downs as stamina or slow down on hurt.\n\"\" = everyone can.\n\"0\" = noone can.\n\"<adminflag>\" = admin with this flag can (a,b,c,d,...).\nSee: addons/sourcemod/configs/admin_levels.cfg for more info.",FCVAR_PLUGIN);
  164. g_cvarFlag_ForwardBoost = CreateConVarEx("flags_forwardboost", "0", "Automatic forward boost by each jump.\n\"\" = everyone can.\n\"0\" = noone can.\n\"<adminflag>\" = admin with this flag can (a,b,c,d,...).\nSee: addons/sourcemod/configs/admin_levels.cfg for more info.",FCVAR_PLUGIN);
  165.  
  166. g_cvarBoost_Initial = CreateConVarEx("boost_initial", "0.0", "If you wish to jump higher or lower, then change this value.\nIn units per second.\nnegative values = players can't jump that high anymore\n0.0 = normal jump height\npositive values = players can jump heigher.",FCVAR_PLUGIN);
  167. g_cvarBoost_Double = CreateConVarEx("boost_double", "290.0", "The amount of vertical boost, to apply when mid air double jumping.\nIn units per second.\nnegative values = player are pushed down in mid air, when double/multi jump.\n0.0 = only falling can be stopped, when jump is pressed in mid air.\npositive values = players can jump heigher, when pressing space in midair",FCVAR_PLUGIN);
  168. g_cvarMax_DoubleJumps = CreateConVarEx("max_doublejumps", "1", "The maximum number of re-jumps allowed while in mid air.\n if you want to disable this, don't set it to 0 instead use the sm_infinitejumpging_flags_double console var.",FCVAR_PLUGIN,true,0.0);
  169. g_cvarOr_Stamina = CreateConVarEx("override_stamina", "0.0", "This will be the new stamina value when you land.\n0.0 = full stamina/no speed is lost.\n-1.0 = let the engine handle how much speed a player looses.\nExample: 1315.0 is the default value in css, but use -1.0 instead if you wish to disable.",FCVAR_PLUGIN);
  170. g_cvarOr_SlowDownOnHurt = CreateConVarEx("override_slowdownonhurt", "1.0", "This will override the speed ratio when hurt.\n1.0 = no speed is lost.\n0.5 = 50% slower.\n0.0 = stops\n2.0 = 100% faster.\n-1.0 = let the engine/game handle how much speed players loose.",FCVAR_PLUGIN);
  171. g_cvarBoost_Forward = CreateConVarEx("boost_forward", "50.0", "Amount of boost per second to push the client forward when jumping.\nIn units per second.\nBe careful this value adds ontop of the velocity at each jump.",FCVAR_PLUGIN);
  172. g_cvarBoost_Forward_WSAD = CreateConVarEx("boost_forward_wsad", "1", "If this is 1 then players need to press W,S,A,D (movement keys) and jump, to receive a boost (adds basicly more control).",FCVAR_PLUGIN,true,0.0,true,1.0);
  173.  
  174.  
  175. //ConVar runtime saver
  176. GetConVarString (g_cvarFlag_Infinite,g_szPlugin_Flag_Infinite,sizeof(g_szPlugin_Flag_Infinite));
  177. GetConVarString (g_cvarFlag_Double,g_szPlugin_Flag_Double,sizeof(g_szPlugin_Flag_Double));
  178. GetConVarString (g_cvarFlag_PerfectDouble,g_szPlugin_Flag_PerfectDouble,sizeof(g_szPlugin_Flag_PerfectDouble));
  179. GetConVarString (g_cvarFlag_GameSlowDowns,g_szPlugin_Flag_GameSlowDowns,sizeof(g_szPlugin_Flag_GameSlowDowns));
  180. GetConVarString (g_cvarFlag_ForwardBoost,g_szPlugin_Flag_ForwardBoost,sizeof(g_szPlugin_Flag_ForwardBoost));
  181.  
  182. g_flPlugin_Boost_Initial = GetConVarFloat(g_cvarBoost_Initial);
  183. g_flPlugin_Boost_Double = GetConVarFloat(g_cvarBoost_Double);
  184. g_iPlugin_Max_DoubleJumps = GetConVarInt(g_cvarMax_DoubleJumps);
  185. g_flPlugin_Or_Stamina = GetConVarFloat(g_cvarOr_Stamina);
  186. g_flPlugin_Or_SlowDownOnHurt = GetConVarFloat(g_cvarOr_SlowDownOnHurt);
  187. g_flPlugin_Boost_Forward = GetConVarFloat(g_cvarBoost_Forward);
  188. g_iPlugin_Boost_Forward_WSAD = GetConVarInt(g_cvarBoost_Forward_WSAD);
  189.  
  190.  
  191. //ConVar Hooks
  192. HookConVarChange(g_cvarFlag_Infinite,ConVarChange_Flag_Infinite);
  193. HookConVarChange(g_cvarFlag_Double,ConVarChange_Flag_Double);
  194. HookConVarChange(g_cvarFlag_PerfectDouble,ConVarChange_Flag_PerfectDouble);
  195. HookConVarChange(g_cvarFlag_GameSlowDowns,ConVarChange_Flag_GameSlowDowns);
  196. HookConVarChange(g_cvarFlag_ForwardBoost,ConVarChange_Flag_ForwardBoost);
  197.  
  198. HookConVarChange(g_cvarBoost_Initial,ConVarChange_Boost_Initial);
  199. HookConVarChange(g_cvarBoost_Double,ConVarChange_Boost_Double);
  200. HookConVarChange(g_cvarMax_DoubleJumps,ConVarChange_Max_DoubleJumps);
  201. HookConVarChange(g_cvarOr_Stamina,ConVarChange_Or_Stamina);
  202. HookConVarChange(g_cvarOr_SlowDownOnHurt,ConVarChange_Or_SlowDownOnHurt);
  203. HookConVarChange(g_cvarBoost_Forward,ConVarChange_Boost_Forward);
  204. HookConVarChange(g_cvarBoost_Forward_WSAD,ConVarChange_Boost_Forward_WSAD);
  205.  
  206.  
  207. //Admin Commands
  208. RegAdminCmd("sm_ban_autojump",Command_Ban,ADMFLAG_BAN,"Bans a player for a certain time from Infinite Jumping");
  209.  
  210. //User Commands
  211. //RegConsoleCmd("sm_jumping_reset",Command_Reset,"Resets all your personal Infinite Jumping settings to default values");
  212. RegConsoleCmd("sm_bunny", Command_AutoJump, "On/Off Infinite (Auto) Jumping");
  213.  
  214.  
  215. g_bCookiesEnabled = (GetExtensionFileStatus("clientprefs.ext") == 1);
  216.  
  217. if (g_bCookiesEnabled) {
  218. // prepare title for clientPref menu
  219. decl String:menutitle[64];
  220. Format(menutitle, sizeof(menutitle), "%s",PLUGIN_NAME);
  221. SetCookieMenuItem(PrefMenu, 0, menutitle);
  222.  
  223.  
  224. //Cookies
  225. g_hCookie_BanTime = RegClientCookie("infjumping_bantime","How long a client is banned from Infinite Jumping",CookieAccess_Protected);
  226. g_hCookie_Switch = RegClientCookie("infjumping_switch","Disables/Enables Infinite Jumping",CookieAccess_Public);
  227.  
  228.  
  229. for (new client=1; client <= MaxClients; client++) {
  230.  
  231. if (!IsClientInGame(client)) {
  232. continue;
  233. }
  234.  
  235. if (!AreClientCookiesCached(client)) {
  236. continue;
  237. }
  238.  
  239. ClientIngameAndCookiesCached(client);
  240. }
  241. }
  242.  
  243. //Event Hooks
  244. HookEventEx("player_hurt", Event_Player_Hurt);
  245.  
  246. //Timer
  247. CreateTimer(TIMER_THINK,Timer_Think,INVALID_HANDLE,TIMER_REPEAT);
  248.  
  249. //Auto Config
  250. AutoExecConfig(true,"plugin.infinite-jumping");
  251. }
  252.  
  253. public OnMapStart() {
  254.  
  255. // hax against valvefail (thx psychonic for fix)
  256. if(GuessSDKVersion() == SOURCE_SDK_EPISODE2VALVE){
  257. SetConVarString(g_cvarVersion, PLUGIN_VERSION);
  258. }
  259. }
  260.  
  261. public OnConfigsExecuted(){
  262.  
  263. ClientAll_Init();
  264. }
  265.  
  266. public OnClientConnected(client){
  267.  
  268. Client_Init(client);
  269. }
  270.  
  271. public OnClientPostAdminCheck(client){
  272.  
  273. Client_Init(client);
  274. }
  275.  
  276. public OnClientCookiesCached(client){
  277.  
  278. if (IsClientInGame(client)) {
  279. ClientIngameAndCookiesCached(client);
  280. }
  281. }
  282.  
  283. public OnClientPutInServer(client){
  284. g_bCooMem_Switch[client] = true;
  285. if (g_bCookiesEnabled && AreClientCookiesCached(client)) {
  286. ClientIngameAndCookiesCached(client);
  287. }
  288. }
  289.  
  290. public Action:OnPlayerRunCmd(client, &buttons, &impulse, Float:vel[3], Float:angles[3], &weapon){
  291.  
  292. if(g_iPlugin_Enable != 1){
  293. //PrintToChatAll("[%s] Plugin Disabled",PLUGIN_NAME);
  294. return Plugin_Continue;
  295. }
  296.  
  297. if(!IsClientInGame(client) || !IsPlayerAlive(client) || IsFakeClient(client)){
  298. //PrintToChatAll("[%s] client: %d is not ingame, alive or a bot",PLUGIN_NAME);
  299. return Plugin_Continue;
  300. }
  301.  
  302. return Client_HandleJumping(client,buttons);
  303. }
  304.  
  305. /****************************************************************
  306.  
  307.  
  308. C A L L B A C K F U N C T I O N S
  309.  
  310.  
  311. ****************************************************************/
  312. public Action:Timer_Think(Handle:timer){
  313.  
  314. for(new client=1;client<=MaxClients;client++){
  315.  
  316. if(!Client_IsValid(client,true)){
  317. continue;
  318. }
  319.  
  320. if(!Client_IsBanned(client) && g_bIsBanned[client]){
  321. g_bIsBanned[client] = false;
  322. Client_PrintToChat(client,false,"{B}%s %t",PLUGIN_PRINT_PREFIX,"You have been unbanned",PLUGIN_NAME);
  323. }
  324. }
  325. return Plugin_Continue;
  326. }
  327.  
  328.  
  329. public Action:Command_AutoJump(client, args){
  330.  
  331. if (g_bCooMem_Switch[client]) {
  332. g_bCooMem_Switch[client] = false;
  333. Client_PrintToChat(client, false, "{R}%s %t",PLUGIN_PRINT_PREFIX,"You Disabled",PLUGIN_NAME);
  334.  
  335. if (g_bCookiesEnabled) {
  336. SetClientCookie(client, g_hCookie_Switch, "off");
  337. }
  338. }
  339. else {
  340. g_bCooMem_Switch[client] = true;
  341. Client_PrintToChat(client, false, "{B}%s %t",PLUGIN_PRINT_PREFIX,"You Enabled",PLUGIN_NAME);
  342.  
  343. if (g_bCookiesEnabled) {
  344. SetClientCookie(client, g_hCookie_Switch, "on");
  345. }
  346. }
  347. return Plugin_Handled;
  348. }
  349.  
  350. public PrefMenu(client, CookieMenuAction:action, any:info, String:buffer[], maxlen){
  351.  
  352. if (action == CookieMenuAction_SelectOption) {
  353. DisplaySettingsMenu(client);
  354. }
  355. }
  356.  
  357. public PrefMenuHandler(Handle:prefmenu, MenuAction:action, client, item){
  358.  
  359. if (action == MenuAction_Select) {
  360. decl String:preference[8];
  361.  
  362. GetMenuItem(prefmenu, item, preference, sizeof(preference));
  363.  
  364. g_bCooMem_Switch[client] = bool:StringToInt(preference);
  365.  
  366. if (g_bCooMem_Switch[client]) {
  367. SetClientCookie(client, g_hCookie_Switch, "on");
  368. Client_PrintToChat(client,false,"{B}%s %t",PLUGIN_PRINT_PREFIX,"You Enabled",PLUGIN_NAME);
  369. }
  370. else {
  371. SetClientCookie(client, g_hCookie_Switch, "off");
  372. Client_PrintToChat(client,false,"{R}%s %t",PLUGIN_PRINT_PREFIX,"You Disabled",PLUGIN_NAME);
  373. }
  374.  
  375. DisplaySettingsMenu(client);
  376. }
  377. else if (action == MenuAction_End) {
  378. CloseHandle(prefmenu);
  379. }
  380. }
  381.  
  382. public ConVarChange_Flag_Infinite(Handle:cvar, const String:oldVal[], const String:newVal[]){
  383.  
  384. strcopy(g_szPlugin_Flag_Infinite,sizeof(g_szPlugin_Flag_Infinite),newVal);
  385. ClientAll_CheckJumpFlags();
  386. }
  387.  
  388. public ConVarChange_Flag_Double(Handle:cvar, const String:oldVal[], const String:newVal[]){
  389.  
  390. strcopy(g_szPlugin_Flag_Double,sizeof(g_szPlugin_Flag_Double),newVal);
  391. ClientAll_CheckJumpFlags();
  392. }
  393.  
  394. public ConVarChange_Flag_PerfectDouble(Handle:cvar, const String:oldVal[], const String:newVal[]){
  395.  
  396. strcopy(g_szPlugin_Flag_PerfectDouble,sizeof(g_szPlugin_Flag_PerfectDouble),newVal);
  397. ClientAll_CheckJumpFlags();
  398. }
  399.  
  400. public ConVarChange_Flag_GameSlowDowns(Handle:cvar, const String:oldVal[], const String:newVal[]){
  401.  
  402. strcopy(g_szPlugin_Flag_GameSlowDowns,sizeof(g_szPlugin_Flag_GameSlowDowns),newVal);
  403. ClientAll_CheckJumpFlags();
  404. }
  405.  
  406. public ConVarChange_Flag_ForwardBoost(Handle:cvar, const String:oldVal[], const String:newVal[]){
  407.  
  408. strcopy(g_szPlugin_Flag_ForwardBoost,sizeof(g_szPlugin_Flag_ForwardBoost),newVal);
  409. ClientAll_CheckJumpFlags();
  410. }
  411.  
  412. public ConVarChange_Boost_Initial(Handle:cvar, const String:oldVal[], const String:newVal[]){
  413.  
  414. g_flPlugin_Boost_Initial = StringToFloat(newVal);
  415. }
  416.  
  417. public ConVarChange_Boost_Double(Handle:cvar, const String:oldVal[], const String:newVal[]){
  418.  
  419. g_flPlugin_Boost_Double = StringToFloat(newVal);
  420. }
  421.  
  422. public ConVarChange_Max_DoubleJumps(Handle:cvar, const String:oldVal[], const String:newVal[]){
  423.  
  424. g_iPlugin_Max_DoubleJumps = StringToInt(newVal);
  425. }
  426.  
  427. public ConVarChange_Or_Stamina(Handle:cvar, const String:oldVal[], const String:newVal[]){
  428.  
  429. g_flPlugin_Or_Stamina = StringToFloat(newVal);
  430. }
  431.  
  432. public ConVarChange_Or_SlowDownOnHurt(Handle:cvar, const String:oldVal[], const String:newVal[]){
  433.  
  434. g_flPlugin_Or_SlowDownOnHurt = StringToFloat(newVal);
  435. }
  436.  
  437. public ConVarChange_Boost_Forward(Handle:cvar, const String:oldVal[], const String:newVal[]){
  438.  
  439. g_flPlugin_Boost_Forward = StringToFloat(newVal);
  440. }
  441.  
  442. public ConVarChange_Boost_Forward_WSAD(Handle:cvar, const String:oldVal[], const String:newVal[]){
  443.  
  444. g_iPlugin_Boost_Forward_WSAD = StringToInt(newVal);
  445. }
  446.  
  447. public Action:Command_Ban(client,args){
  448.  
  449. if(args < 1){
  450. decl String:command[32];
  451. GetCmdArg(0,command,sizeof(command));
  452. Client_Reply(client,"%s %t",PLUGIN_PRINT_PREFIX,"Usage: Ban",command);
  453. return Plugin_Handled;
  454. }
  455.  
  456. decl String:target[MAX_TARGET_LENGTH];
  457. GetCmdArg(1,target,sizeof(target));
  458. decl String:arg2[11];
  459. GetCmdArg(2,arg2,sizeof(arg2));
  460.  
  461. decl String:target_name[MAX_TARGET_LENGTH];
  462. decl target_list[MAXPLAYERS+1];
  463. decl bool:tn_is_ml;
  464.  
  465. new target_count = ProcessTargetString(
  466. target,
  467. client,
  468. target_list,
  469. sizeof(target_list),
  470. COMMAND_FILTER_NO_BOTS,
  471. target_name,
  472. sizeof(target_name),
  473. tn_is_ml
  474. );
  475.  
  476. if (target_count <= 0) {
  477. ReplyToTargetError(client, target_count);
  478. return Plugin_Handled;
  479. }
  480.  
  481. new bantime = StringToInt(arg2);
  482.  
  483. if(bantime != 0){
  484.  
  485. Client_PrintToConsole(client,"\n%s Banned %d players from %s for %d minutes:",PLUGIN_PRINT_PREFIX,target_count,PLUGIN_NAME,bantime);
  486. }
  487. else {
  488.  
  489. Client_PrintToConsole(client,"\n%s Unbanned %d players from %s:",PLUGIN_PRINT_PREFIX,target_count,PLUGIN_NAME);
  490. }
  491.  
  492. new i=0;
  493. new String:targetName[MAX_NAME_LENGTH];
  494. for (i=0;i<target_count;++i) {
  495.  
  496. GetClientName(target_list[i],targetName,sizeof(targetName));
  497. Client_PrintToConsole(client,"\n%s",targetName);
  498. if(bantime != 0){
  499.  
  500. Client_Ban(target_list[i],client,bantime);
  501. }
  502. else {
  503.  
  504. Client_UnBan(target_list[i],client);
  505. }
  506. }
  507.  
  508. Client_PrintToConsole(client,"\n-----------------------\n");
  509.  
  510. if(bantime != 0){
  511.  
  512. Client_PrintToChat(client,false,"{R}%s %t",PLUGIN_PRINT_PREFIX,"See console output");
  513. }
  514.  
  515. return Plugin_Handled;
  516. }
  517.  
  518. Client_Ban(client,banner,bantime){
  519.  
  520. new String:bannerName[MAX_NAME_LENGTH];
  521. GetClientName(banner,bannerName,sizeof(bannerName));
  522.  
  523. new String:szTime[11];
  524. g_iCooMem_BanTime[client] = GetTime()+bantime*60;
  525. IntToString(bantime,szTime,sizeof(szTime));
  526.  
  527. if(g_bCookiesEnabled){
  528. SetClientCookie(client,g_hCookie_BanTime,szTime);
  529. }
  530. g_bIsBanned[client] = true;
  531.  
  532. Client_PrintToChat(client,false,"{R}%s %t",PLUGIN_PRINT_PREFIX,"You have been banned by",PLUGIN_NAME,bannerName,bantime);
  533. }
  534.  
  535.  
  536. Client_UnBan(client,banner){
  537.  
  538. new String:bannerName[MAX_NAME_LENGTH];
  539. GetClientName(banner,bannerName,sizeof(bannerName));
  540.  
  541. g_iCooMem_BanTime[client] = 0;
  542.  
  543. if(g_bCookiesEnabled){
  544. SetClientCookie(client,g_hCookie_BanTime,"0");
  545. }
  546. g_bIsBanned[client] = false;
  547.  
  548. Client_PrintToChat(client,false,"{R}%s %t",PLUGIN_PRINT_PREFIX,"You have been unbanned by",PLUGIN_NAME,bannerName);
  549. }
  550.  
  551. public Action:Event_Player_Hurt(Handle:event, const String:name[], bool:dontBroadcast){
  552.  
  553. if(g_iPlugin_Enable == 0){
  554. return Plugin_Continue;
  555. }
  556.  
  557. if(g_flPlugin_Or_SlowDownOnHurt == -1.0){
  558. return Plugin_Continue;
  559. }
  560.  
  561. if(g_Offset_m_flVelocityModifier < 1){
  562. return Plugin_Continue;
  563. }
  564.  
  565. new client = GetClientOfUserId(GetEventInt(event, "userid"));
  566.  
  567. if(!g_bAllow_AntiSlowDowns[client] || IsFakeClient(client)){
  568. return Plugin_Continue;
  569. }
  570.  
  571. Client_PrintDebug(client,"setting your: m_flVelocityModifier (off: %d) to: %f",g_Offset_m_flVelocityModifier,g_flPlugin_Or_SlowDownOnHurt);
  572.  
  573. SetEntDataFloat(client, g_Offset_m_flVelocityModifier, g_flPlugin_Or_SlowDownOnHurt, true);
  574.  
  575. return Plugin_Continue;
  576. }
  577.  
  578. /*****************************************************************
  579.  
  580.  
  581. P L U G I N F U N C T I O N S
  582.  
  583.  
  584. *****************************************************************/
  585. bool:Client_IsBanned(client){
  586.  
  587. return (g_iCooMem_BanTime[client] > GetTime());
  588. }
  589.  
  590. DisplaySettingsMenu(client){
  591.  
  592. decl String:MenuItem[128];
  593. new Handle:prefmenu = CreateMenu(PrefMenuHandler);
  594.  
  595. Format(MenuItem, sizeof(MenuItem), "%s", PLUGIN_NAME);
  596. SetMenuTitle(prefmenu, MenuItem);
  597.  
  598. new String:checked[] = String:0x9A88E2;
  599.  
  600. Format(MenuItem, sizeof(MenuItem), "%t [%s]", "Enabled", g_bCooMem_Switch[client] ? checked : " ");
  601. AddMenuItem(prefmenu, "1", MenuItem);
  602.  
  603. Format(MenuItem, sizeof(MenuItem), "%t [%s]", "Disabled", g_bCooMem_Switch[client] ? " " : checked);
  604. AddMenuItem(prefmenu, "0", MenuItem);
  605.  
  606. DisplayMenu(prefmenu, client, MENU_TIME_FOREVER);
  607. }
  608.  
  609.  
  610. ClientIngameAndCookiesCached(client){
  611.  
  612. new String:buffer[255];
  613. GetClientCookie(client,g_hCookie_BanTime,buffer,sizeof(buffer));
  614. g_iCooMem_BanTime[client] = StringToInt(buffer);
  615. g_bIsBanned[client] = Client_IsBanned(client);
  616.  
  617. GetClientCookie(client,g_hCookie_Switch,buffer,sizeof(buffer));
  618. g_bCooMem_Switch[client] = (!StrEqual(buffer,"off",false));
  619. }
  620.  
  621. enum VelocityOverride {
  622.  
  623. VelocityOvr_None = 0,
  624. VelocityOvr_Velocity,
  625. VelocityOvr_OnlyWhenNegative,
  626. VelocityOvr_InvertReuseVelocity
  627. };
  628. //Thank you DarthNinja & javalia for this.
  629. stock Client_Push(client, Float:clientEyeAngle[3], Float:power, VelocityOverride:override[3]=VelocityOvr_None)
  630. {
  631. decl Float:forwardVector[3],
  632. Float:newVel[3];
  633.  
  634. GetAngleVectors(clientEyeAngle, forwardVector, NULL_VECTOR, NULL_VECTOR);
  635. NormalizeVector(forwardVector, forwardVector);
  636. ScaleVector(forwardVector, power);
  637.  
  638. Entity_GetAbsVelocity(client,newVel);
  639.  
  640. for(new i=0;i<3;i++){
  641. switch(override[i]){
  642. case VelocityOvr_Velocity:{
  643. newVel[i] = 0.0;
  644. }
  645. case VelocityOvr_OnlyWhenNegative:{
  646. if(newVel[i] < 0.0){
  647. newVel[i] = 0.0;
  648. }
  649. }
  650. case VelocityOvr_InvertReuseVelocity:{
  651. if(newVel[i] < 0.0){
  652. newVel[i] *= -1.0;
  653. }
  654. }
  655. }
  656.  
  657. newVel[i] += forwardVector[i];
  658. }
  659.  
  660. Entity_SetAbsVelocity(client,newVel);
  661. }
  662.  
  663. Client_ForceJump(client,Float:power){
  664.  
  665. Client_Push(client,Float:{-90.0,0.0,0.0},power,VelocityOverride:{VelocityOvr_None,VelocityOvr_None,VelocityOvr_None});
  666. }
  667.  
  668. Client_DoubleJump(client) {
  669.  
  670. if((1 <= g_iDoubleJumps[client] <= g_iPlugin_Max_DoubleJumps)){
  671.  
  672. g_iDoubleJumps[client]++;
  673.  
  674. Client_Push(client,Float:{-90.0,0.0,0.0},g_flPlugin_Boost_Double,VelocityOverride:{VelocityOvr_None,VelocityOvr_None,VelocityOvr_Velocity});
  675. }
  676. }
  677.  
  678.  
  679. stock Action:Client_HandleJumping(client, &buttons){
  680.  
  681. if(g_bIsBanned[client]){
  682. return Plugin_Continue;
  683. }
  684.  
  685. if(!g_bCooMem_Switch[client]){
  686. return Plugin_Continue;
  687. }
  688.  
  689. if(Client_GetWaterLevel(client) > Water_Level:WATER_LEVEL_FEET_IN_WATER){
  690. //PrintToChatAll("[%s] Water level: %d",PLUGIN_NAME,Client_GetWaterLevel(client));
  691. return Plugin_Continue;
  692. }
  693.  
  694. if(Client_IsOnLadder(client)){
  695. //PrintToChatAll("[%s] is on ladder",PLUGIN_NAME);
  696. return Plugin_Continue;
  697. }
  698.  
  699. static ls_iLastButtons[MAXPLAYERS+1] = {0,...};
  700. static ls_iLastFlags[MAXPLAYERS+1] = {0,...};
  701.  
  702. new flags = GetEntityFlags(client);
  703. //new m_bDucked = GetEntProp(client,Prop_Send,"m_bDucked",1);
  704. //new m_bDucking = GetEntProp(client,Prop_Send,"m_bDucking",1);
  705.  
  706. decl Float:clientEyeAngles[3];
  707. GetClientEyeAngles(client,clientEyeAngles);
  708.  
  709. //PrintToChat(client,"m_bDucked: %d; m_bDucking: %d",m_bDucked,m_bDucking);
  710. //new Float:m_flStamina = GetEntDataFloat(client,g_Offset_m_flStamina);
  711. //Client_PrintDebug(client,"your m_flStamina value: %f",m_flStamina);
  712. //PrintToChat(client,"buttons: %d",buttons);
  713.  
  714. if(flags & FL_ONGROUND){
  715. g_iDoubleJumps[client] = 1;
  716. }
  717.  
  718. if(buttons & IN_JUMP){
  719.  
  720. //PrintToChat(client,"m_bDucked: %d; m_bDucking: %d",m_bDucked,m_bDucking);
  721.  
  722. if(flags & FL_ONGROUND){
  723.  
  724. if(g_bAllow_InfiniteJump[client] && g_flPlugin_Boost_Initial != 0.0){
  725.  
  726. Client_ForceJump(client,g_flPlugin_Boost_Initial);
  727. }
  728.  
  729. //boost client
  730. if(g_bAllow_ForwardBoost[client] && g_flPlugin_Boost_Forward != 0.0){
  731.  
  732. clientEyeAngles[0] = 0.0;
  733.  
  734. if(g_iPlugin_Boost_Forward_WSAD == 0){
  735.  
  736. Client_Push(client,clientEyeAngles,g_flPlugin_Boost_Forward,VelocityOverride:{VelocityOvr_None,VelocityOvr_None,VelocityOvr_None});
  737. }
  738. else {
  739.  
  740. if(buttons & IN_FORWARD){
  741. Client_Push(client,clientEyeAngles,g_flPlugin_Boost_Forward,VelocityOverride:{VelocityOvr_None,VelocityOvr_None,VelocityOvr_None});
  742. }
  743.  
  744. if(buttons & IN_BACK){
  745. clientEyeAngles[1] += 180.0;
  746. Client_Push(client,clientEyeAngles,g_flPlugin_Boost_Forward,VelocityOverride:{VelocityOvr_None,VelocityOvr_None,VelocityOvr_None});
  747. }
  748.  
  749. if(buttons & IN_MOVELEFT){
  750. clientEyeAngles[1] += 90.0;
  751. Client_Push(client,clientEyeAngles,g_flPlugin_Boost_Forward,VelocityOverride:{VelocityOvr_None,VelocityOvr_None,VelocityOvr_None});
  752. }
  753.  
  754. if(buttons & IN_MOVERIGHT){
  755. clientEyeAngles[1] += -90.0;
  756. Client_Push(client,clientEyeAngles,g_flPlugin_Boost_Forward,VelocityOverride:{VelocityOvr_None,VelocityOvr_None,VelocityOvr_None});
  757. }
  758. }
  759. }
  760.  
  761. ls_iLastButtons[client] = buttons;
  762. }
  763. else {
  764.  
  765. if(g_bAllow_AntiSlowDowns[client] && g_Offset_m_flStamina != -1 && g_flPlugin_Or_Stamina != -1.0){
  766. //you dont loose speed in css when you hit the ground with this:
  767. SetEntDataFloat(client, g_Offset_m_flStamina, g_flPlugin_Or_Stamina, true);
  768. }
  769.  
  770. if(g_bAllow_DoubleJump[client]){
  771.  
  772. if(g_bAllow_PerfectDoubleJump[client]){
  773.  
  774. decl Float:clientVel[3];
  775. Entity_GetAbsVelocity(client,clientVel);
  776.  
  777. if(clientVel[2] < 0.0){
  778.  
  779. Client_DoubleJump(client);
  780. }
  781. }
  782. else if(!(ls_iLastButtons[client] & IN_JUMP)){
  783.  
  784. Client_DoubleJump(client);
  785. }
  786. }
  787.  
  788. ls_iLastButtons[client] = buttons;
  789.  
  790. //set this here to protect ls_iLastButtons from this changes:
  791. if(g_bAllow_InfiniteJump[client]){
  792.  
  793. buttons &= ~IN_JUMP;
  794. }
  795. }
  796. }
  797. else {
  798.  
  799. //Disabled because scroll wheel users are at a big disadvantage
  800. /*if(g_Offset_m_flStamina != -1 && g_flPlugin_Or_Stamina != -1.0 && ls_iLastButtons[client] & IN_JUMP){
  801.  
  802. Client_PrintDebug(client,"setting your stamina to 1315.0");
  803. //SetEntDataFloat(client, g_Offset_m_flStamina, 1315.0, true);
  804. }*/
  805.  
  806. //need to be set when IN_JUMP is not pressed & set this here to protect ls_iLastButtons from this changes:
  807. ls_iLastButtons[client] = buttons;
  808. }
  809.  
  810. ls_iLastFlags[client] = flags;
  811.  
  812. return Plugin_Continue;
  813. }
  814.  
  815.  
  816.  
  817. //This function will be called within SMLib_OnPluginStart.
  818. stock ClientAll_Init(){
  819.  
  820. for(new client=1;client<=MaxClients;client++){
  821.  
  822. if(!IsClientInGame(client)){
  823. continue;
  824. }
  825.  
  826. Client_Init(client);
  827. }
  828. }
  829.  
  830. stock Client_Init(client){
  831.  
  832. //Variables
  833. Client_InitVars(client);
  834.  
  835. //Functions
  836. Client_CheckJumpFlags(client);
  837. Client_GetOffsetsFrom(client);
  838. }
  839.  
  840. stock Client_InitVars(client){
  841.  
  842. //Plugin Client Vars
  843. g_bAllow_InfiniteJump[client] = false;
  844. g_bAllow_DoubleJump[client] = false;
  845. g_bAllow_PerfectDoubleJump[client] = false;
  846. g_bAllow_AntiSlowDowns[client] = false;
  847. g_bAllow_ForwardBoost[client] = false;
  848. }
  849.  
  850. stock Client_GetOffsetsFrom(client){
  851.  
  852. if(g_Offset_m_flStamina != -1 && g_Offset_m_flVelocityModifier != -1){
  853. return;
  854. }
  855.  
  856. if(!IsValidEntity(client)){
  857. return;
  858. }
  859.  
  860. decl String:netclass[64];
  861.  
  862. GetEntityNetClass(client,netclass,sizeof(netclass));
  863.  
  864. g_Offset_m_flStamina = FindSendPropInfo(netclass,"m_flStamina");
  865. g_Offset_m_flVelocityModifier = FindSendPropInfo(netclass,"m_flVelocityModifier");
  866.  
  867. Server_PrintDebug("Offsets from client %d: m_flStamina: %d; m_flVelocityModifier: %d",client,g_Offset_m_flStamina,g_Offset_m_flVelocityModifier);
  868. }
  869.  
  870. stock ClientAll_CheckJumpFlags(){
  871.  
  872. for(new client=1;client<=MaxClients;client++){
  873.  
  874. if(!IsClientInGame(client)){
  875. continue;
  876. }
  877.  
  878. Client_CheckJumpFlags(client);
  879. }
  880. }
  881.  
  882.  
  883. stock Client_CheckJumpFlags(client){
  884.  
  885. new AdminId:adminid = GetUserAdmin(client);
  886. new AdminFlag:flag;
  887.  
  888. //g_bAllow_InfiniteJump:
  889. if(StrEqual(g_szPlugin_Flag_Infinite,"0",false)){
  890.  
  891. Client_PrintDebug(client,"You are NOT allowed to infinite jump now! (%s)",g_szPlugin_Flag_Infinite);
  892. g_bAllow_InfiniteJump[client] = false;
  893. }
  894. else if(FindFlagByChar(g_szPlugin_Flag_Infinite[0],flag)){
  895.  
  896. if(adminid == INVALID_ADMIN_ID){
  897.  
  898. Client_PrintDebug(client,"You are NOT allowed to infinite jump now! (%s)",g_szPlugin_Flag_Infinite);
  899. g_bAllow_InfiniteJump[client] = false;
  900. }
  901. else if(GetAdminFlag(adminid,flag)){
  902.  
  903. Client_PrintDebug(client,"You are allowed to infinite jump now! (%s)",g_szPlugin_Flag_Infinite);
  904. g_bAllow_InfiniteJump[client] = true;
  905. }
  906. else {
  907.  
  908. Client_PrintDebug(client,"You are NOT allowed to infinite jump now! (%s)",g_szPlugin_Flag_Infinite);
  909. g_bAllow_InfiniteJump[client] = false;
  910. }
  911. }
  912. else {
  913.  
  914. Client_PrintDebug(client,"You are allowed to infinite jump now! (%s)",g_szPlugin_Flag_Infinite);
  915. g_bAllow_InfiniteJump[client] = true;
  916. }
  917.  
  918. //g_bAllow_DoubleJump:
  919. if(StrEqual(g_szPlugin_Flag_Double,"0",false)){
  920.  
  921. Client_PrintDebug(client,"You are NOT allowed to double jump now! (%s)",g_szPlugin_Flag_Double);
  922. g_bAllow_DoubleJump[client] = false;
  923. }
  924. else if(FindFlagByChar(g_szPlugin_Flag_Double[0],flag)){
  925.  
  926. if(adminid == INVALID_ADMIN_ID){
  927.  
  928. Client_PrintDebug(client,"You are NOT allowed to double jump now! (%s)",g_szPlugin_Flag_Double);
  929. g_bAllow_DoubleJump[client] = false;
  930. }
  931. else if(GetAdminFlag(adminid,flag)){
  932.  
  933. Client_PrintDebug(client,"You are allowed to double jump now! (%s)",g_szPlugin_Flag_Double);
  934. g_bAllow_DoubleJump[client] = true;
  935. }
  936. else {
  937.  
  938. Client_PrintDebug(client,"You are NOT allowed to double jump now! (%s)",g_szPlugin_Flag_Double);
  939. g_bAllow_DoubleJump[client] = false;
  940. }
  941. }
  942. else {
  943.  
  944. Client_PrintDebug(client,"You are allowed to double jump now! (%s)",g_szPlugin_Flag_Double);
  945. g_bAllow_DoubleJump[client] = true;
  946. }
  947.  
  948. //g_bAllow_PerfectDoubleJump:
  949. if(StrEqual(g_szPlugin_Flag_PerfectDouble,"0",false)){
  950.  
  951. Client_PrintDebug(client,"You are NOT allowed to perfectdouble jump now! (%s)",g_szPlugin_Flag_PerfectDouble);
  952. g_bAllow_PerfectDoubleJump[client] = false;
  953. }
  954. else if(FindFlagByChar(g_szPlugin_Flag_PerfectDouble[0],flag)){
  955.  
  956. if(adminid == INVALID_ADMIN_ID){
  957.  
  958. Client_PrintDebug(client,"You are NOT allowed to perfectdouble jump now! (%s)",g_szPlugin_Flag_PerfectDouble);
  959. g_bAllow_PerfectDoubleJump[client] = false;
  960. }
  961. else if(GetAdminFlag(adminid,flag)){
  962.  
  963. Client_PrintDebug(client,"You are allowed to perfectdouble jump now! (%s)",g_szPlugin_Flag_PerfectDouble);
  964. g_bAllow_PerfectDoubleJump[client] = true;
  965. }
  966. else {
  967.  
  968. Client_PrintDebug(client,"You are NOT allowed to perfectdouble jump now! (%s)",g_szPlugin_Flag_PerfectDouble);
  969. g_bAllow_PerfectDoubleJump[client] = false;
  970. }
  971. }
  972. else {
  973.  
  974. Client_PrintDebug(client,"You are allowed to perfectdouble jump now! (%s)",g_szPlugin_Flag_PerfectDouble);
  975. g_bAllow_PerfectDoubleJump[client] = true;
  976. }
  977.  
  978.  
  979.  
  980. //g_bAllow_AntiSlowDowns:
  981. if(StrEqual(g_szPlugin_Flag_GameSlowDowns,"0",false)){
  982.  
  983. Client_PrintDebug(client,"You are NOT allowed to perfectdouble jump now! (%s)",g_szPlugin_Flag_GameSlowDowns);
  984. g_bAllow_AntiSlowDowns[client] = false;
  985. }
  986. else if(FindFlagByChar(g_szPlugin_Flag_GameSlowDowns[0],flag)){
  987.  
  988. if(adminid == INVALID_ADMIN_ID){
  989.  
  990. Client_PrintDebug(client,"You are NOT allowed to perfectdouble jump now! (%s)",g_szPlugin_Flag_GameSlowDowns);
  991. g_bAllow_AntiSlowDowns[client] = false;
  992. }
  993. else if(GetAdminFlag(adminid,flag)){
  994.  
  995. Client_PrintDebug(client,"You are allowed to perfectdouble jump now! (%s)",g_szPlugin_Flag_GameSlowDowns);
  996. g_bAllow_AntiSlowDowns[client] = true;
  997. }
  998. else {
  999.  
  1000. Client_PrintDebug(client,"You are NOT allowed to perfectdouble jump now! (%s)",g_szPlugin_Flag_GameSlowDowns);
  1001. g_bAllow_AntiSlowDowns[client] = false;
  1002. }
  1003. }
  1004. else {
  1005.  
  1006. Client_PrintDebug(client,"You are allowed to perfectdouble jump now! (%s)",g_szPlugin_Flag_GameSlowDowns);
  1007. g_bAllow_AntiSlowDowns[client] = true;
  1008. }
  1009.  
  1010.  
  1011.  
  1012.  
  1013. //g_bAllow_ForwardBoost:
  1014. if(StrEqual(g_szPlugin_Flag_ForwardBoost,"0",false)){
  1015.  
  1016. Client_PrintDebug(client,"You are NOT allowed to perfectdouble jump now! (%s)",g_szPlugin_Flag_ForwardBoost);
  1017. g_bAllow_ForwardBoost[client] = false;
  1018. }
  1019. else if(FindFlagByChar(g_szPlugin_Flag_ForwardBoost[0],flag)){
  1020.  
  1021. if(adminid == INVALID_ADMIN_ID){
  1022.  
  1023. Client_PrintDebug(client,"You are NOT allowed to perfectdouble jump now! (%s)",g_szPlugin_Flag_ForwardBoost);
  1024. g_bAllow_ForwardBoost[client] = false;
  1025. }
  1026. else if(GetAdminFlag(adminid,flag)){
  1027.  
  1028. Client_PrintDebug(client,"You are allowed to perfectdouble jump now! (%s)",g_szPlugin_Flag_ForwardBoost);
  1029. g_bAllow_ForwardBoost[client] = true;
  1030. }
  1031. else {
  1032.  
  1033. Client_PrintDebug(client,"You are NOT allowed to perfectdouble jump now! (%s)",g_szPlugin_Flag_ForwardBoost);
  1034. g_bAllow_ForwardBoost[client] = false;
  1035. }
  1036. }
  1037. else {
  1038.  
  1039. Client_PrintDebug(client,"You are allowed to perfectdouble jump now! (%s)",g_szPlugin_Flag_ForwardBoost);
  1040. g_bAllow_ForwardBoost[client] = true;
  1041. }
  1042. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement