diff --git a/plugins/adminslots.sma b/plugins/adminslots.sma index 53f5d24d..e73a577e 100755 --- a/plugins/adminslots.sma +++ b/plugins/adminslots.sma @@ -14,64 +14,97 @@ #include #include -new g_ResPtr -new g_HidePtr -new g_sv_visiblemaxplayers +new CvarReservation; +new CvarHideSlots; + +new CvarHandleMaxVisiblePlayers; public plugin_init() { - register_plugin("Slots Reservation", AMXX_VERSION_STR, "AMXX Dev Team") - register_dictionary("adminslots.txt") - register_dictionary("common.txt") - g_ResPtr = register_cvar("amx_reservation", "0", FCVAR_PROTECTED) - g_HidePtr = register_cvar("amx_hideslots", "0") - g_sv_visiblemaxplayers = get_cvar_pointer("sv_visiblemaxplayers") + register_plugin("Slots Reservation", AMXX_VERSION_STR, "AMXX Dev Team"); + + register_dictionary("adminslots.txt"); + register_dictionary("common.txt"); + + hook_cvar_change(create_cvar("amx_reservation", "0", FCVAR_PROTECTED, fmt("%L", LANG_SERVER, "CVAR_RESERVATION"), .has_min = true, .min_val = 0.0, .has_max = true, .max_val = float(MaxClients - 1)), "@OnReservationChange"); + hook_cvar_change(create_cvar("amx_hideslots" , "0", FCVAR_NONE , fmt("%L", LANG_SERVER, "CVAR_HIDESLOTS") , .has_min = true, .min_val = 0.0, .has_max = true, .max_val = 1.0), "@OnHideSlotsChange"); + + CvarHandleMaxVisiblePlayers = get_cvar_pointer("sv_visiblemaxplayers"); } -public plugin_cfg() +@OnReservationChange(const handle, const oldValue[], const newValue[]) { - set_task(3.0, "MapLoaded") + CvarReservation = strtol(newValue); + + setVisibleSlots(); } -public MapLoaded() +@OnHideSlotsChange(const handle, const oldValue[], const newValue[]) { - if (get_pcvar_num(g_HidePtr)) - { - setVisibleSlots(get_playersnum(1), MaxClients - get_pcvar_num(g_ResPtr)) - } + CvarHideSlots = strtol(newValue); + + setVisibleSlots(); } public client_authorized(id) { - new players = get_playersnum(1) - new limit = MaxClients - get_pcvar_num(g_ResPtr) - - if (access(id, ADMIN_RESERVATION) || (players <= limit)) - { - if (get_pcvar_num(g_HidePtr)) - setVisibleSlots(players, limit) - return - } - - server_cmd("kick #%d ^"%L^"", get_user_userid(id), id, "DROPPED_RES") + setVisibleSlots(id); } public client_remove(id) { - if (get_pcvar_num(g_HidePtr)) - { - setVisibleSlots(get_playersnum(1), MaxClients - get_pcvar_num(g_ResPtr)) - } + setVisibleSlots(); } -setVisibleSlots(players, limit) +setVisibleSlots(const playerId = 0) { - new num = players + 1 + if ((playerId == 0 && !CvarHideSlots) || !CvarReservation) + { + if (get_pcvar_num(CvarHandleMaxVisiblePlayers) > 0) + { + resetVisibleSlots(MaxClients); + } - if (players == MaxClients) - num = MaxClients - else if (players < limit) - num = limit - - set_pcvar_num(g_sv_visiblemaxplayers, num) + return; + } + + new const playersCount = get_playersnum_ex(GetPlayers_IncludeConnecting); + new const freeVisibleSlots = MaxClients - CvarReservation; + + if (playerId != 0) + { + if (playersCount > freeVisibleSlots && !access(playerId, ADMIN_RESERVATION)) + { + server_cmd("kick #%d ^"%L^"", get_user_userid(playerId), playerId, "DROPPED_RES"); + return; + } + + if (!CvarHideSlots) + { + return; + } + } + + new maxVisiblePlayers = playersCount + 1; + + if (playersCount == MaxClients) + { + maxVisiblePlayers = MaxClients; + } + else if (playersCount < freeVisibleSlots) + { + maxVisiblePlayers = freeVisibleSlots; + } + + resetVisibleSlots(maxVisiblePlayers); +} + +resetVisibleSlots(value) +{ + if (value == MaxClients) + { + value = -1; // Default sv_visiblemaxplayers value. + } + + set_pcvar_num(CvarHandleMaxVisiblePlayers, value); } diff --git a/plugins/lang/adminslots.txt b/plugins/lang/adminslots.txt index e6fc8276..a97e63a6 100755 --- a/plugins/lang/adminslots.txt +++ b/plugins/lang/adminslots.txt @@ -1,8 +1,12 @@ [en] DROPPED_RES = Dropped due to slot reservation +CVAR_RESERVATION = Amount of slots to reserve +CVAR_HIDESLOTS = If you set this to 1, you can hide slots on your server.^nIf the server's public and hidden slots are full, you must manually connect with the "connect" console command. [de] DROPPED_RES = Sorry, dieser Slot ist reserviert +CVAR_RESERVATION = Anzahl der zu reservierenden Slots +CVAR_HIDESLOTS = Wenn diese CVAR auf 1 gesetzt wird, können Slots auf Ihrem Server ausgeblendet werden.^nWenn die öffentlichen Slots auf dem Server "voll" sind und weitere freie Slots ausgeblendet sind, müssen Sie die Verbindung manuell über den Konsolenbefehl "connect" herstellen. [sr] DROPPED_RES = Server je pun, nemate pristup rezervisanim mestima