C#:
// Все права принадлежат дискорд сообществу https://discord.gg/VgNHPpNrz6
/*
TODO:
- Add option for dynamic number of slots based on 'reserved.slot' usage
- Add option to KickForReserved to allow full maxplayers usage until needed
- Add option to use reserved slot only if no regular slots available
*/
using System;
using System.Collections.Generic;
namespace Oxide.Plugins
{
[Info("Reserved", "Wulf/lukespragg", "1.0.0")]
[Description("Reserves a number of slots so that reserved players can connect.")]
class Reserved : CovalencePlugin
{
// Do NOT edit this file, instead edit Reserved.json in oxide/config and Reserved.en.json in oxide/lang,
// or create a language file for another language using the 'en' file as a default.#region Configuration
//int UseDynamicSlots => GetConfig("UseDynamicSlots", true);
//bool KickForReserved => GetConfig("KickForReserved", false);
int ReservedSlots => GetConfig("ReservedSlots", 5);
protected override void LoadDefaultConfig()
{
//Config["UseDynamicSlots"] = UseDynamicSlots;
//Config["KickForReserved"] = KickForReserved;
Config["ReservedSlots"] = ReservedSlots;
SaveConfig();
}
#endregion
#region Localization
void LoadDefaultMessages()
{
var messages = new Dictionary<string, string>
{
{"ReservedSlotsOnly", "Only reserved slots available"}
};
lang.RegisterMessages(messages, this);
}
#endregion
#region Initialization
void Loaded()
{
#if !HURTWORLD && !RUST
throw new NotSupportedException($"This plugin does not support {(covalence.Game ?? "this game")}");
#endif
LoadDefaultConfig();
LoadDefaultMessages();
permission.RegisterPermission("reserved.slot", this);
}
#endregion
#region Reserved Check
#if HURTWORLD
object CanClientLogin(PlayerSession session)
{
var curPlayers = GameManager.Instance.GetPlayerCount();
var maxPlayers = GameManager.Instance.ServerConfig.MaxPlayers;
if ((curPlayers + ReservedSlots) >= maxPlayers && !HasPermission(session.SteamId.ToString(), "reserved.slot"))
{
GameManager.Instance.KickPlayer(session.SteamId.ToString(), GetMessage("ReservedSlotsOnly", session.SteamId.ToString()));
return true;
}
return null;
}
#endif
#if RUST
object CanClientLogin(Network.Connection connection)
{
var curPlayers = BasePlayer.activePlayerList.Count;
var maxPlayers = ConVar.Server.maxplayers;
if ((curPlayers + ReservedSlots) >= maxPlayers && !HasPermission(connection.userid.ToString(), "reserved.slot"))
{
return GetMessage("ReservedSlotsOnly", connection.userid.ToString());
}
return null;
}
#endif
#endregion
#region Helper Methods
T GetConfig<T>(string name, T defaultValue)
{
if (Config[name] == null) return defaultValue;
return (T)Convert.ChangeType(Config[name], typeof(T));
}
string GetMessage(string key, string steamId = null) => lang.GetMessage(key, this, steamId);
bool HasPermission(string steamId, string perm) => permission.UserHasPermission(steamId, perm);
#endregion
}
}