Код:
#include <amxmodx>
#include <amxmisc>
static const PLUGIN[] = "Advanced Admin Slots"
static const VERSION[] = "0.1.0"
static const AUTHOR[] = "SAMURAI"
new g_cmdLoopback[16]
new g_maxplayers
public plugin_init() {
register_plugin(PLUGIN, VERSION, AUTHOR)
register_cvar("amx_reservation","3")
#if defined HIDE_RESERVEDSLOTS
set_task(7.1, "set_maxplayers", 147258369)
#endif
format(g_cmdLoopback, 15, "amxres%c%c%c%c" ,
random_num('A','Z'), random_num('A','Z'), random_num('A','Z'), random_num('A','Z'))
register_clcmd(g_cmdLoopback, "ackSignal")
g_maxplayers = get_maxplayers()
}
#if defined HIDE_RESERVEDSLOTS
public set_maxplayers() {
if(get_cvar_num("amx_reservation") > 0)
set_cvar_num("sv_visiblemaxplayers", g_maxplayers - 1)
}
#endif
public ackSignal(id) {
server_cmd("kick #%d %s", get_user_userid(id),("Dropped due to slot reservation"))
}
public client_authorized(id) {
new players = get_playersnum(1)
new limit = g_maxplayers - 1
new resType = get_cvar_num("amx_reservation")
if(!resType) return PLUGIN_CONTINUE
new who
if(players > limit) {
if(get_user_flags(id) & ADMIN_RESERVATION) {
switch(resType) {
case 1:
who = kickShortestPlayingTime()
case 2:
who = kickLongestPlayingTime()
case 3:
who = kickLag()
case 4:
who = steamCon()
case 5:
who = fraGS()
}
if(who) {
new name[32]
get_user_name(who, name, 31)
client_cmd(id, ("echo ^"* %s was kicked to free this slot^""), name)
}
return PLUGIN_CONTINUE
}
client_cmd(id, g_cmdLoopback)
return PLUGIN_HANDLED
}
return PLUGIN_CONTINUE
}
kickShortestPlayingTime() {
new who = 0, itime, shortest = 0x7fffffff
for(new i = 1; i <= g_maxplayers; ++i) {
if(!is_user_connected(i) && !is_user_connecting(i))
continue
if(get_user_flags(i) & ADMIN_RESERVATION)
continue
itime = get_user_time(i)
if(shortest > itime) {
shortest = itime
who = i
}
}
if(who) {
client_cmd(who,("echo ^"Dropped due to shortest playing time to free slot for an admin^";%s"), g_cmdLoopback)
}
return who
}
kickLongestPlayingTime() {
new who = 0, itime, longest = -1
for(new i = 1; i <= g_maxplayers; ++i) {
if(!is_user_connected(i) && !is_user_connecting(i))
continue
if(get_user_flags(i) & ADMIN_RESERVATION)
continue
itime = get_user_time(i)
if(longest < itime) {
longest = itime
who = i
}
}
if(who) {
client_cmd(who,("echo ^"Dropped due to longest playing time to free slot for an admin^";%s"), g_cmdLoopback)
}
return who
}
kickLag() {
new who = 0, ping, loss, worst = -1
for(new i = 1; i <= g_maxplayers; ++i) {
if(!is_user_connected(i) && !is_user_connecting(i))
continue
if(get_user_flags(i) & ADMIN_RESERVATION)
continue
get_user_ping(i, ping, loss)
if(ping > worst) {
worst = ping
who = i
}
}
if(who) {
client_cmd(who,("echo ^"Dropped due to high ping to free slot for an admin^";%s"), g_cmdLoopback)
}
return who
}
steamCon() {
new who = 0, ping, loss, worst = -1
for(new i = 1; i <= g_maxplayers; ++i) {
if(!is_user_connected(i) && !is_user_connecting(i))
continue
new uid[32]
get_user_authid(i,uid,31)
if(equal(uid,"STEAM_ID_PENDING"))
continue
get_user_ping(i, ping, loss)
if(ping > worst) {
worst = ping
who = i
}
}
if(who) {
client_cmd(who,"echo Dropped because has entered one player with STEAM, Free Slot for him;disconnect")
}
return who
}
fraGS() {
new who = 0
for(new i = 1; i <= g_maxplayers; ++i) {
if(!is_user_connected(i) && !is_user_connecting(i))
continue
if( get_user_flags(i) & ADMIN_RESERVATION )
continue
new frags = get_user_frags(i)
new deaths = get_user_deaths(i)
if(frags < deaths) {
who = i
}
}
if(who) {
client_cmd(who,"echo Dropped because your are an nood;disconnect")
}
return who
}