Skip to content

Instantly share code, notes, and snippets.

@SanjaySRocks
Created February 11, 2022 05:03
Show Gist options
  • Save SanjaySRocks/8c54b03bb21fd58a2120541855eb9aa8 to your computer and use it in GitHub Desktop.
Save SanjaySRocks/8c54b03bb21fd58a2120541855eb9aa8 to your computer and use it in GitHub Desktop.
Server sleeps when no player on server to reduce load on cpu
// Author: https://github.com/djearthquake
#include amxmodx
#include amxmisc
#include engine_stocks
#define MAX_PLAYERS 32
#if !defined client_disconnect
#define client_disconnected client_disconnect
#endif
new const SzRope_msg[]="Plugin paused due to env_rope would be invisible."
new g_timing, g_iTic_quota, g_iTic_sleep, g_iTic;
public plugin_init()
{
register_plugin("Variable sys_ticrate", "B", ".sρiηX҉.");
g_timing = register_cvar("sys_timing", "1"); //0|1 disables|enables plugin.
g_iTic_sleep = register_cvar("sys_sleep", "32"); //Tic hibernation rate.
g_iTic_quota = register_cvar("sys_quota", "32"); //Tic rate quota.
g_iTic = get_cvar_pointer("sys_ticrate"); //Base tic rate. Only used to launch server with.
set_task(7.5, "@Cpu_saver", 1541,_,_,"b")
}
public client_putinserver(id)
if (get_pcvar_num(g_timing) == 1)
{
remove_task(1541)
if( find_ent(-1,"env_rope") || find_ent(-1,"env_electrified_wire") ) //Rope can disappear over 70fps.
{
set_pcvar_num(g_iTic,70)
log_amx SzRope_msg
server_print "Tic_setting:%i",get_pcvar_num(g_iTic)
pause("a")
}
else if(is_user_connected(id) && !is_user_bot(id))
{
@set_tic()
}
else server_print "bot detected!"
set_task(7.5, "@Cpu_saver", 1541,_,_,"b")
}
public client_remove(id)
{
(get_pcvar_num(g_timing) && iPlayers() < 2) ? set_pcvar_num(g_iTic,get_pcvar_num(g_iTic_sleep)) : @set_tic()
server_print "Tic_setting:%i",get_pcvar_num(g_iTic)
}
stock iPlayers()
{
new players[ MAX_PLAYERS ],iHeadcount;get_players(players,iHeadcount,"ch")
return iHeadcount
}
@set_tic()
{
new iAlloted_Tic = iPlayers() ? get_pcvar_num(g_iTic_quota)*iPlayers() : get_pcvar_num(g_iTic_sleep)
set_pcvar_num(g_iTic, iAlloted_Tic ? iAlloted_Tic : g_iTic_sleep)
server_print "Tic_setting:%i",get_pcvar_num(g_iTic)
}
@Cpu_saver()
{
new iPing,iLoss
new players[ MAX_PLAYERS ],iHeadcount;get_players(players,iHeadcount,"ch")
for(new lot;lot < sizeof players;lot++)
get_user_ping(players[lot],iPing,iLoss)
if(iLoss)
if(iLoss > 2)
{
server_print "%i|%i",iPing,iLoss
set_pcvar_num g_iTic,iLoss > 1 ? 35 : 70
server_print "Tic_setting:%i",get_pcvar_num(g_iTic)
log_amx "Adjusting tic based on turbulence."
}
else
@set_tic()
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment