C#:
// Все права принадлежат дискорд сообществу https://discord.gg/VgNHPpNrz6
/*
TODO:
- Add optional banning instead of kicking
- Add warning and timed kick option
- Fix "a connected player can't be found in the player list (kicked)" in H2o
*/
using System;
using System.Collections.Generic;
using Oxide.Core.Libraries.Covalence;
namespace Oxide.Plugins
{
[Info("Ping", "Wulf/lukespragg", "1.3.1")]
[Description("Ping command and 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 the oxide/lang directory,
// or create a new language file for another language using the 'en' file as a default.#region Configuration
const string permBypass = "ping.bypass";
bool adminExcluded;
bool highPingKick;
bool kickNotices;
int pingLimit;
protected override void LoadDefaultConfig()
{
Config["AdminExluded"] = adminExcluded = GetConfig("AdminExcluded", true);
Config["HighPingKick"] = highPingKick = GetConfig("HighPingKick", true);
Config["KickNotices"] = kickNotices = GetConfig("KickNotices", true);
Config["PingLimit"] = pingLimit = GetConfig("PingLimit", 200); // Milliseconds
SaveConfig();
}
#endregion
#region Localization
void LoadDefaultMessages()
{
lang.RegisterMessages(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"
}, this);
}
#endregion
#region Initialization
void Init()
{
LoadDefaultConfig();
LoadDefaultMessages();
permission.RegisterPermission(permBypass, this);
}
#endregion
#region Chat Command
[Command("ping")]
void ChatPing(IPlayer player, string command, string[] args) => player.Reply(Lang("YourPing").Replace("{ping}", player.ConnectedPlayer.Ping.ToString()));
#endregion
#region Ping Check
void HandlePing(string name, string id, int ping)
{
if (IsAllowed(id, permBypass) || (adminExcluded && IsAdmin(id)) || ping < pingLimit) return;
if (!highPingKick) return;
var player = players.GetOnlinePlayer(id);
player?.Kick(Lang("PingTooHigh").Replace("{ping}", ping.ToString()));
if (kickNotices)
{
Puts(Lang("PlayerKicked").Replace("{name}", name).Replace("{ping}", ping.ToString()));
server.Broadcast(Lang("PlayerKicked").Replace("{name}", name).Replace("{ping}", ping.ToString()));
}
}
#if HIDEHOLDOUT
void OnPlayerConnected(PlayerInfos player)
{
timer.In(5f, () =>
{
if (!player.connected) return;
HandlePing(player.Nickname, player.account_id, player.NetPlayer.averagePing);
});
}
#endif
#if HURTWORLD
void OnPlayerInit(PlayerSession session)
{
timer.In(5f, () =>
{
if (!session.IsLoaded) return;
HandlePing(session.Name, session.SteamId.ToString(), session.Player.averagePing);
});
}
#endif
#if REIGNOFKINGS
void OnPlayerConnected(CodeHatch.Engine.Networking.Player player)
{
timer.In(5f, () =>
{
if (!player.Connection.IsConnected) return;
HandlePing(player.Name, player.Id.ToString(), player.Connection.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
#if RUSTLEGACY
void OnPlayerConnected(NetUser netUser)
{
timer.In(5f, () =>
{
if (!netUser.connected) return;
HandlePing(netUser.displayName, netUser.userID.ToString(), netUser.networkPlayer.averagePing);
});
}
#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 Lang(string key, string id = null) => lang.GetMessage(key, this, id);
bool IsAllowed(string id, string perm) => permission.UserHasPermission(id, perm);
bool IsAdmin(string id) => permission.UserHasGroup(id, "admin");
#endregion
}
}