C#:
// Все права принадлежат дискорд сообществу https://discord.gg/VgNHPpNrz6
// Requires: Babel
using System;
using Oxide.Core.Libraries.Covalence;
using Oxide.Core.Plugins;
namespace Oxide.Plugins
{
[Info("BabelChat", "Wulf/lukespragg", "0.2.1", ResourceId = 1964)]
[Description("Translates chat messages to each player's language preference or server default")]
class BabelChat : CovalencePlugin
{
// Do NOT edit this file, instead edit BabelChat.json in oxide/config
#region Configuration
bool forceDefault;
bool prefixColors;
bool showOriginal;
protected override void LoadDefaultConfig()
{
Config["ForceDefault"] = forceDefault = GetConfig("ForceDefault", false);
Config["PrefixColors"] = prefixColors = GetConfig("PrefixColors", true);
Config["ShowOriginal"] = showOriginal = GetConfig("ShowOriginal", false);
SaveConfig();
}
void Init() => LoadDefaultConfig();
#endregion
#region Chat Translation
[PluginReference] Plugin AntiAds;
[PluginReference] Plugin Babel;
[PluginReference] Plugin BetterChat;
string Translate(IPlayer player, IPlayer target, string message)
{
var to = forceDefault ? lang.GetServerLanguage() : lang.GetLanguage(target.Id);
var from = lang.GetLanguage(player.Id) ?? "auto";
return (string)Babel.Call("Translate", message, to, from);
}
void SendMessage(IPlayer player, IPlayer target, string message)
{
var format = $"{player.Name}: {message}";
if (BetterChat) format = (string)BetterChat.Call("API_GetFormatedMessage", player.Id, message);
else if (prefixColors) switch (covalence.Game)
{
case "7DaysToDie":
format = $"[{Color()}]{player.Name}[ffffff]: {message}";
break;
case "ReignOfKings":
format = $"[{Color()}]{player.Name}[ffffff]: {message}";
break;
case "RustLegacy":
format = $"[color {Color()}]{player.Name}[/color]: {message}";
break;
default:
format = $"<color=#{Color()}>{player.Name}</color>: {message}";
break;
}
#if RUST
var rust = Game.Rust.RustCore.FindPlayerByIdString(target.Id);
rust?.SendConsoleCommand("chat.add", player.Id, format, 1.0);
#else
player.Message(format);
#endif
}
object OnUserChat(IPlayer player, string message)
{
var isAd = AntiAds?.Call("IsAdvertisement", message);
if (AntiAds && isAd != null && (bool)isAd) return null;
foreach (var target in players.Connected)
{
if (Equals(target, player))
{
SendMessage(player, player, message);
continue;
}
var to = forceDefault ? lang.GetServerLanguage() : lang.GetLanguage(target.Id);
var from = lang.GetLanguage(player.Id) ?? "auto";
#if DEBUG
PrintWarning($"To: {to}, From: {from}");
#endif
Action<string> callback = response =>
{
if (showOriginal) response = $"{message} \n{response}";
SendMessage(player, target, response);
};
Babel.Call("Translate", message, to, from, callback);
}
return !BetterChat ? (object)true : null;
}
bool OnBetterChat() => true;
#endregion
#region Helpers
T GetConfig<T>(string name, T value) => Config[name] == null ? value : (T)Convert.ChangeType(Config[name], typeof(T));
static string Color() => $"{new Random().Next(0x1000000):X6}";
#endregion
}
}