C#:
// Все права принадлежат дискорд сообществу https://discord.gg/VgNHPpNrz6
/*
TODO:
- Add chat/console commands to check ping
- Add optional banning instead of kicking
- Add warning and timed kick option
*/
using System;
using System.Collections.Generic;
namespace Oxide.Plugins
{
[Info("Ping", "Wulf/lukespragg", "1.2.3")]
[Description("Automatic kicking of players with high pings.")]
class Ping : CovalencePlugin
{
// Do NOT edit this file, instead edit Ping.json in oxide/config and Ping.en.json in oxide/lang,
// or create a language file for another language using the 'en' file as a default.#region Configuration
bool BroadcastKick => GetConfig("BroadcastKick", true);
bool HighPingKick => GetConfig("HighPingKick", true);
int PingLimit => GetConfig("PingLimit", 200);
protected override void LoadDefaultConfig()
{
Config["BroadcastKick"] = BroadcastKick;
Config["HighPingKick"] = HighPingKick;
Config["PingLimit"] = PingLimit; // Milliseconds
SaveConfig();
}
#endregion
#region Localization
void LoadDefaultMessages()
{
var messages = new Dictionary<string, string>
{
{"PingTooHigh", "Ping is too high: {ping}ms"},
{"PlayerKicked", "{name} kicked for high ping ({ping}ms)"}
//{"YourPing", "You have a ping of {ping}ms"}
};
lang.RegisterMessages(messages, this);
}
#endregion
#region Initialization
void Loaded()
{
#if !HURTWORLD && !RUST
throw new NotSupportedException("This plugin does not support this game");
#endif
LoadDefaultConfig();
LoadDefaultMessages();
permission.RegisterPermission("ping.bypass", this);
//cmd.AddChatCommand(config.Settings.Command, this, ChatPing);
//cmd.AddConsoleCommand("global." + config.Settings.Command, this, ConsolePing);
}
#endregion
#region Ping Check
void HandlePing(string name, string steamId, int ping)
{
if (HasPermission(steamId, "ping.bypass") || ping < PingLimit) return;
if (BroadcastKick)
server.Broadcast(GetMessage("PlayerKicked").Replace("{name}", name).Replace("{ping}", ping.ToString()));
if (HighPingKick)
players.GetOnlinePlayer(steamId).Kick(GetMessage("PingTooHigh").Replace("{ping}", ping.ToString()));
}
#if HURTWORLD
void OnPlayerInit(PlayerSession session)
{
timer.In(5f, () =>
{
if (!session.IsLoaded) return;
HandlePing(session.Name, session.SteamId.ToString(), session.Player.averagePing);
});
}
#endif
#if RUST
void OnPlayerInit(BasePlayer player)
{
timer.In(5f, () =>
{
if (!player.IsConnected()) return;
HandlePing(player.displayName, player.UserIDString, Network.Net.sv.GetAveragePing(player.net.connection));
});
#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
}
}