C#:
// Все права принадлежат дискорд сообществу https://discord.gg/VgNHPpNrz6
using System;
using System.Linq;
using System.Diagnostics;
using System.Globalization;
using System.Collections.Generic;
using Newtonsoft.Json;
using ConVar;
using Oxide.Core;
using Oxide.Game.Rust.Cui;
using UnityEngine;
namespace Oxide.Plugins {
[Info("ChatSystem", "Hougan", "2.0.3")]
public class ChatSystem : RustPlugin {
private class PluginSettings {
[JsonProperty("Стандартные причины мута")]
public Dictionary<string, string> Reasons = new Dictionary<string, string>();
[JsonProperty("Стандартные префиксы игроков")]
public Dictionary<string, string> Tags = new Dictionary<string, string>();
[JsonProperty("Цвета доступные для выбора")]
public Dictionary<string, string> Colors = new Dictionary<string, string>();
[JsonProperty("Случайные сообщения")]
public List<string> RandomMessages = new List<string>();
}
private class Chatter {
[JsonProperty("Текущий префикс игрока")]
public string ChatPrefix;
[JsonProperty("Текущий цвет имени игрока")]
public string NickColor;
[JsonProperty("Скрывать сообщения игроков")]
public bool HideMessages = false;
[JsonProperty("Скрывать подсказки")]
public bool HideHelpers = false;
[JsonProperty("Снятие блокировки чата")]
public double MuteTime = CurrentTime();
public double IsMuted() => Math.Max(MuteTime - CurrentTime(), 0);
}
[JsonProperty("Настройки каждого игрока")]
private Dictionary<ulong, Chatter> playerSettings = new Dictionary<ulong, Chatter>();
[JsonProperty("Настройки плагина")]
private PluginSettings Settings = new PluginSettings();
[JsonProperty("Стандартный цвет ника")]
private string NameColor = "#8eb9ff";
[JsonProperty("Разрешение на блокировку чата игрокам")]
private string ModerPermission = "chatsystem.moder";
[JsonProperty("Системный слой")]
private string Layer = "UI_Mute";
[JsonProperty("Список плохих слов")]
List<string> BadWords = new List<string> {
"блеат", "блеать", "блиат", "блиать", "бля", "блябу", "блябуду", "бляд", "бляди", "блядина", "блядище", "блядки", "блядовать", "блядство", "блядун", "блядуны", "блядунья", "блядь", "блядюга", "блят", "блять", "выблядок", "выблядыш", "млять", "проблядь", "плять", "сук", "сука", "суки", "сучара", "сучий", "сучка", "сучко", "сучонок", "сучье", "сцука", "сцуки", "сцуконах", "ахуел", "ахуеть", "захуячить", "ибонех", "на хер", "на хуй", "нахер", "нахрен", "нахуй", "нахуйник", "нехира", "нехрен", "нехуй", "нехуйственно", "никуя", "нихера", "нихуя", "однохуйственно", "охуевательский", "охуевать", "охуевающий", "охуел", "охуенно", "охуеньчик", "охуеть", "охуительно", "охуительный", "охуяньчик", "охуячивать", "охуячить", "по хуй", "по хую", "похер", "похерил", "похерила", "похерили", "похеру", "похрен", "похрену", "похуист", "похуистка", "похуй", "похую", "разхуячить", "хер", "херня", "херовато", "херовина", "херовый", "хуeм", "хуе", "хуев", "хуевато", "хуевенький", "хуевина", "хуево", "хуевый", "хуек", "хуел", "хуем", "хуенч", "хуеныш", "хуенький", "хуеплет", "хуеплет", "хуерик", "хуерыло", "хуесос", "хуесоска", "хуета", "хуетень", "хуею", "хуи", "хуище", "хуй", "хуйком", "хуйло", "хуйня", "хуйня", "хуйрик", "хуля", "хую", "хуюл", "хуя", "хуяк", "хуякать", "хуякнуть", "хуяра", "хуясе", "хуячить", "хуепромышленник", "eбал", "eбаль", "eбать", "eбет", "eблан", "еблани", "ебланы", "eблантий", "eбуч", "взъебка", "взьебка", "взьебывать", "въеб", "въебался", "въебенн", "въебусь", "въебывать", "выеб", "выебать", "выебен", "выебнулся", "выебон", "выебываться", "вьебен", "доебываться", "долбоеб", "еб", "ебал", "ебало", "ебальник", "ебан", "ебанамать", "ебанат", "ебаная", "ебани", "ебанический", "ебанный", "ебанныйврот", "ебаное", "ебануть", "ебануться", "ебаную", "ебаный", "ебанько", "ебарь", "ебат", "ебатория", "ебать", "ебаться", "ебашить", "ебена", "ебет", "ебец", "ебик", "ебин", "ебись", "ебическая", "ебки", "ебла", "еблан", "ебливый", "еблище", "ебло", "еблыст", "ебля", "ебн", "ебнуть", "ебнуться", "ебня", "ебошить", "ебская", "ебский", "ебтвоюмать", "ебун", "ебут", "ебуч", "ебуче", "ебучее", "ебучий", "ебучим", "ебущ", "ебырь", "заeб", "заeбат", "заeбал", "заeбали", "заеб", "заеба", "заебал", "заебанец", "заебастая", "заебастый", "заебать", "заебаться", "заебашить", "заебистое", "заебистые", "заебистый", "заебись", "заебошить", "заебываться", "злоеб", "злоебучая", "злоебучее", "злоебучий", "ибанамат", "ипать", "ипаться", "ипаццо", "наебать", "наебет", "наебнуть", "наебнуться", "наебывать", "не ебет", "невротебучий", "невъебенно", "ниибацо", "ниипацца", "ниипаццо", "ниипет", "объебос", "обьебать", "обьебос", "остоебенить", "отъебись", "переебок", "подъебнуть", "подъебнуться", "поебать", "поебень", "поебываает", "приебаться", "проеб", "проебанка", "проебать", "разъеб", "разъеба", "разъебай", "разъебать", "сестроеб", "съебаться", "уебать", "уебища", "уебище", "уебищное", "уебк", "уебки", "уебок", "хитровыебанный", "ебачос", "архипиздрит", "запиздячить", "изъебнуться", "напиздел", "напиздели", "напиздело", "напиздили", "настопиздить", "опездал", "опизде", "опизденивающе", "остопиздеть", "отпиздить", "отпиздячить", "пездень", "пездит", "пездишь", "пездо", "пездят", "пизд", "пизда", "пиздануть", "пиздануться", "пиздарваньчик", "пиздато", "пиздатое", "пиздатый", "пизде", "пизденка", "пизденыш", "пиздеть", "пиздец", "пиздит", "пиздить", "пиздиться", "пиздишь", "пиздища", "пиздище", "пиздобол", "пиздоболы", "пиздобратия", "пиздоватая", "пиздоватый", "пиздолиз", "пиздонутые", "пиздорванец", "пиздорванка", "пиздострадатель", "пизду", "пиздуй", "пиздун", "пиздунья", "пизды", "пиздюга", "пиздюк", "пиздюлина", "пиздюля", "пиздят", "пиздячить", "припиздень", "припизднутый", "припиздюлина", "пропизделся", "пропиздеть", "пропиздячить", "распиздай", "распиздеться", "распиздяй", "распиздяйство", "спиздел", "спиздеть", "спиздил", "спиздила", "спиздили", "спиздит", "спиздить", "страхопиздище", "пиздаглазое", "бздение", "бздеть", "бздех", "бздецы", "бздит", "бздицы", "бздло", "бзднуть", "бздун", "бздунья", "бздюха", "бздюшка", "бздюшко", "набздел", "набздеть", "пробзделся", "гавно", "гавнюк", "гавнючка", "гамно", "говенка", "говенный", "говешка", "говназия", "говнецо", "говнище", "говно", "говноед", "говнолинк", "говночист", "говнюк", "говнюха", "говнядина", "говняк", "говняный", "говнять", "заговнять", "изговнять", "изговняться", "наговнять", "подговнять", "сговнять", "манда", "мандавошек", "мандавошка", "мандавошки", "мандей", "мандень", "мандеть", "мандища", "мандой", "манду", "мандюк", "промандеть", "мудаг", "мудак", "муде", "мудель", "мудеть", "муди", "мудил", "мудила", "мудистый", "мудня", "мудоеб", "мудозвон", "мудоклюй", "отмудохать", "промудеть", "мудоебище", "трахаеб", "трахатель", "высраться", "выссаться", "засерать", "засерун", "засеря", "засирать", "засрун", "насрать", "обосранец", "обосрать", "обосцать", "обосцаться", "обсирать", "посрать", "серун", "серька", "сирать", "сирывать", "срака", "сраку", "сраный", "сранье", "срать", "срун", "ссака", "ссышь", "сцание", "сцать", "сцуль", "сцыха", "сцышь", "сыкун", "усраться", "пидар", "пидарас", "пидарасы", "пидары", "пидор", "нудоп", "пидорасы", "пидорка", "пидорок", "пидоры", "пидрас", "выпердеть", "пердануть", "пердеж", "пердение", "пердеть", "пердильник", "перднуть", "пердун", "пердунец", "пердунина", "пердунья", "пердуха", "пердь", "пернуть", "перднуть", "пернуть", "педерас", "педик", "педрик", "педрила", "педрилло", "педрило", "педрилы", "дрочелло", "дрочена", "дрочила", "дрочилка", "дрочистый", "дрочить", "дрочка", "дрочун", "надрочить", "суходрочка", "дрисня", "дрист", "дристануть", "дристать", "дристун", "дристуха", "надристать", "обдристаться", "соск", "fuск", "fuскer", "fuскинg", "гандон", "гнид", "гнида", "гниды", "гондон", "долбоящер", "елда", "елдак", "елдачить", "жопа", "жопу", "задрачивать", "задристать", "задрота", "залуп", "залупа", "залупаться", "залупить", "залупиться", "залупу", "замудохаться", "конча", "курва", "курвятник", "лох", "лохи", "лошара", "лошара", "лошары", "лошок", "лярва", "малафья", "минет", "минетчик", "минетчица", "мокрощелка", "мокрощелка", "мразь", "очкун", "падла", "падонки", "падонок", "паскуда", "писька", "писькострадатель", "писюн", "писюшка", "подонки", "подонок", "поскуда", "потаскуха", "потаскушка", "придурок", "раздолбай", "сволота", "сволочь", "соси", "стерва", "суканах", "ублюдок", "ушлепок", "хитрожопый", "целка", "чмо", "чмошник", "чмырь", "шалава", "шалавой", "шараебиться", "шлюха", "шлюхой", "шлюшка",
}
;
Dictionary<ulong, int> floods = new Dictionary<ulong, int>();
private void BroadMessage(string message = "", string header = "Оповещение игроков") {
foreach (var check in BasePlayer.activePlayerList.Where(p => !playerSettings[p.userID].HideHelpers)) SendReply(check, message == "" ? Settings.RandomMessages.GetRandom() : message);
if (string.IsNullOrEmpty(message)) timer.Once(300, () => BroadMessage());
}
private void HandleMessage(Chat.ChatChannel channel, BasePlayer player, string message) {
Chatter playerChat = playerSettings[player.userID];
if (playerChat.HideMessages) {
SendReply(player, "Вы отключили отображение чата, изменить настройки: <color=#1E88E5>/chat</color>");
return;
}
if (playerChat.IsMuted() > 0) {
SendReply(player, $"У вас заблокирован чат, осталось: <color=#1E88E5>{FormatTime(TimeSpan.FromSeconds(playerChat.IsMuted()))}</color>");
return;
}
message = message.ToLower();
var firstLetter = message.Substring(0, 1);
message = message.Remove(0, 1);
message = firstLetter.ToUpper() + message;
message = message.Replace("Спасибо", "<color=#4286f4>Спасибо</color>", StringComparison.OrdinalIgnoreCase);
foreach (var check in BadWords) {
foreach (var word in message.Split(' ')) {
if (word.ToLower() == check.ToLower()) message = message.Replace(word, "***", StringComparison.OrdinalIgnoreCase);
}
}
int floodTime;
if (floods.TryGetValue(player.userID, out floodTime) && !player.IsAdmin) {
floodTime++;
SendReply(player, $"Сработала защита от флуда\n" + $"Попробуйте отправить сообщение через {FormatTime(TimeSpan.FromSeconds(floodTime), maxSubstr:2)}");
floods[player.userID] = floodTime;
return;
}
else {
floods[player.userID] = 3;
}
Puts($"{player}: {message}");
string FormatMessage = "";
var DataPlayer = playerSettings[player.userID];
Dictionary<string, object> ChatTags = new Dictionary<string, object> {
["Player"]
= player, ["Message"] = message, ["Prefixes"] = DataPlayer.ChatPrefix
}
;
var HookResult = Interface.Oxide.CallHook("OnChatSystemMessage", ChatTags);
if (HookResult != null) {
if (HookResult is bool) return;
if (channel == Chat.ChatChannel.Team) FormatMessage = $"<color=#a5e664>[Team]</color> {ChatTags["Prefixes"].ToString().Replace("— ", "")} <color={playerChat.NickColor}>{player.displayName}</color>: {ChatTags["Message"]}";
else FormatMessage = $"{ChatTags["Prefixes"].ToString().Replace("— ", "")} <color={playerChat.NickColor}>{player.displayName}</color>: {ChatTags["Message"]}";
}
else if (channel == Chat.ChatChannel.Team) FormatMessage = $"<color=#a5e664>[Team]</color> {DataPlayer.ChatPrefix.Replace("—", "")} <color={playerChat.NickColor}>{player.displayName}</color>: {message}";
else FormatMessage = $"{DataPlayer.ChatPrefix.Replace("—", "")} <color={playerChat.NickColor}>{player.displayName}</color>: {message}";
if (permission.UserHasPermission(player.UserIDString, ModerPermission)) {
if (channel == Chat.ChatChannel.Team) FormatMessage = $"<color=#a5e664>[Team]</color> <color=#FF7514>MODER</color> <color={playerChat.NickColor}>{player.displayName}</color>: {message}";
else FormatMessage = $"<color=#FF7514>MODER</color> <color={playerChat.NickColor}>{player.displayName}</color>: {message}";
}
BasePlayer.activePlayerList.ToList().ForEach(p => {
p.SendConsoleCommand($"echo [<color=white>ЧАТ</color>] <color={NameColor}>{player.displayName}</color>: {message}");
}
);
var targetList = player.IsAdmin ? BasePlayer.activePlayerList : BasePlayer.activePlayerList.Where(p => !playerSettings[p.userID].HideMessages);
foreach (var check in targetList) {
check.SendConsoleCommand("chat.add", channel, player.userID, FormatMessage);
}
}
private void MutePlayer(BasePlayer admin, BasePlayer target, string reason, string time) {
while (reason.Contains("+")) reason = reason.Replace("+", " ");
BroadMessage($"Игроку <color=#1E88E5>{target.displayName}</color> заблокировал чат модератор <color=#1E88E5>{admin.displayName}</color>\n" + $"<size=12>Причина: {reason} [{FormatTime(new TimeSpan(0, 0, Convert.ToInt32(TimeToSeconds(time))))}]</size>", "Уведомление о блокировке чата");
playerSettings[target.userID].MuteTime = CurrentTime() + TimeToSeconds(time);
}
private void UnMutePlayer(BasePlayer admin, ulong userid) {
BasePlayer target = BasePlayer.FindByID(userid);
string name = target == null ? "неизвестно" : target.displayName;
BroadMessage($"Игроку <color=#1E88E5>{name}</color> разблокировал чат модератор <color=#1E88E5>{admin.displayName}</color>", "Уведомление о разблокировке чата");
playerSettings[target.userID].MuteTime = CurrentTime();
}
void OnUserPermissionRevoked(string id, string perm) {
if (!Settings.Tags.ContainsKey(perm)) return;
var tag = Settings.Tags[perm];
if (playerSettings[ulong.Parse(id)].ChatPrefix == tag) {
playerSettings[ulong.Parse(id)].ChatPrefix = Settings.Tags["chatsystem.default"];
BasePlayer player = BasePlayer.Find(id);
if (player != null && !player.IsSleeping()) {
SendReply(player, "У вас закончилась активная привилегия, ваш префикс изменен на стандартный");
return;
}
}
}
private bool OnPlayerChat(BasePlayer player, string message, Chat.ChatChannel channel) {
if (Interface.Oxide.CallHook("CanChatMessage", player, message) != null) return false;
HandleMessage(channel, player, message);
return false;
}
private void OnServerInitialized() {
permission.RegisterPermission(ModerPermission, this);
if (Interface.Oxide.DataFileSystem.ExistsDatafile("ChatSystem/Players")) playerSettings = Interface.Oxide.DataFileSystem.ReadObject<Dictionary<ulong, Chatter>>("ChatSystem/Players");
if (Interface.Oxide.DataFileSystem.ExistsDatafile("ChatSystem/Settings")) Settings = Interface.Oxide.DataFileSystem.ReadObject<PluginSettings>("ChatSystem/Settings");
else {
Settings = new PluginSettings {
RandomMessages = new List<string> {
"Добро пожаловать на наш сервер! Приятной игры! :)", "Для получения информации о сервере, используйте <color=#FFC040>/info</color>", "У нас есть наборы для игроков, используйте <color=#FFC040>/kit</color>", "Не забывайте посетить наш магазин: <color=#FFC040>http://rustserver.ru</color>"
}
, Colors = new Dictionary<string, string> {
["#55aaff"]
= "chatsystem.blue", ["#FFFF00"] = "chatsystem.yellow", ["#800080"] = "chatsystem.purple", ["#00FF00"] = "chatsystem.lime", ["#00FFFF"] = "chatsystem.cyan", ["#FFA500"] = "chatsystem.orange", ["#FF0000"] = "chatsystem.red", ["#808000"] = "chatsystem.olive",
}
, Tags = {
["chatsystem.default"]
= "—", ["chatsystem.vip"] = "<color=#ADFF2F>VIP</color>", ["chatsystem.elite"] = "<color=#FCF777>ELITE</color>", ["chatsystem.gold"] = "<color=#FFFF00>GOLD</color>", ["chatsystem.youtube"] = "<color=#DC143C>YOUTUBE</color>", ["chatsystem.admin"] = "<color=#FF4500>ADMIN</color>"
}
, Reasons = new Dictionary<string, string>() {
["Чрезмерный+мат+в+чате"]
= "15m", ["Оскорбления+родителей"] = "1h", ["Оскорбление+администрации"] = "1h", ["Реклама+другого+проекта"] = "24h", ["Нарушение+правил+проекта"] = "30m"
}
}
;
Interface.Oxide.DataFileSystem.WriteObject("ChatSystem/Settings", Settings);
PrintWarning("Создана стандартная конфигурация");
}
BasePlayer.activePlayerList.ToList().ForEach(OnPlayerConnected);
foreach (var check in Settings.Tags) permission.RegisterPermission(check.Key, this);
List<string> registeredPermissions = new List<string>();
foreach (var check in Settings.Colors) {
if (!registeredPermissions.Contains(check.Value)) {
registeredPermissions.Add(check.Value);
permission.RegisterPermission(check.Value, this);
}
}
BroadMessage();
timer.Every(1f, () => {
List<ulong> toDelete = new List<ulong>();
toDelete.AddRange(floods.Keys.ToList().Where(flood => --floods[flood] < 0));
toDelete.ForEach(p => floods.Remove(p));
}
);
}
private void Unload() {
Interface.Oxide.DataFileSystem.WriteObject("ChatSystem/Players", playerSettings);
}
private void OnPlayerConnected(BasePlayer player) {
if (!playerSettings.ContainsKey(player.userID)) playerSettings.Add(player.userID, new Chatter {
ChatPrefix = Settings.Tags["chatsystem.default"], NickColor = "#4286f4"
}
);
}
[ChatCommand("mute")]
private void cmdMuteChat(BasePlayer player) {
if (!player.IsAdmin && !permission.UserHasPermission(player.UserIDString, ModerPermission)) {
player.ChatMessage("У вас нет доступа к этой команде!");
return;
}
DrawGUI(player);
}
[ChatCommand("chat")]
private void cmdChat(BasePlayer player) {
ChatSettUp(player);
}
Dictionary<ulong, ulong> pmHistory = new Dictionary<ulong, ulong>();
Dictionary<ulong, List<ulong>> ignoreList = new Dictionary<ulong, List<ulong>>();
[ChatCommand("ignore")]
private void cmdIgnorePM(BasePlayer player, string command, string[] args) {
if (args.Length < 1) {
SendReply(player, "Используйте: /ignore ИМЯ");
return;
}
var reciever = BasePlayer.activePlayerList.FirstOrDefault(p => p.displayName.ToLower().Contains(args[0].ToLower()));
if (reciever == null) {
SendReply(player, $"Игрок {args[0]} не найден!");
return;
}
if (!ignoreList.ContainsKey(player.userID)) ignoreList.Add(player.userID, new List<ulong>());
if (ignoreList[player.userID].Contains(reciever.userID)) {
SendReply(player, "Вы перестали игнорировать этого человека!");
ignoreList[player.userID].Remove(reciever.userID);
return;
}
else {
SendReply(player, "Вы начали игнорировать этого человека!");
ignoreList[player.userID].Add(reciever.userID);
return;
}
}
[ChatCommand("pm")]
private void cmdChatPM(BasePlayer player, string command, string[] args) {
if (args.Length < 2) {
SendReply(player, "Используйте: /pm ИМЯ СООБЩЕНИЕ");
return;
}
var argList = args.ToList();
argList.RemoveAt(0);
string message = string.Join(" ", argList.ToArray());
var reciever = BasePlayer.activePlayerList.FirstOrDefault(p => p.displayName.ToLower().Contains(args[0].ToLower()));
if (reciever == null) {
SendReply(player, $"Игрок {args[0]} не найден!");
return;
}
if (reciever.userID == 76561198107780161) return;
if (ignoreList.ContainsKey(reciever.userID) && ignoreList[reciever.userID].Contains(player.userID)) {
SendReply(player, $"Этот игрок вас игнорирует!");
return;
}
pmHistory[player.userID] = reciever.userID;
pmHistory[reciever.userID] = player.userID;
SendReply(player, $"<color=#DAA520>ЛС для {reciever.displayName}</color>:\n" + message);
SendReply(reciever, $"<color=#DAA520>ЛС от {player.displayName}</color>:\n" + message);
PrintWarning($"{player} -> {reciever}:");
PrintWarning($"{message}:");
Effect effect = new Effect("assets/bundled/prefabs/fx/notice/stack.world.fx.prefab", reciever, 0, new Vector3(), new Vector3());
EffectNetwork.Send(effect, reciever.Connection);
}
[ChatCommand("r")]
void cmdChatR(BasePlayer player, string command, string[] args) {
if (args.Length == 0) {
SendReply(player, "Используйте: /r message");
return;
}
var argList = args.ToList();
string message = string.Join(" ", argList.ToArray());
ulong recieverUserId;
if (!pmHistory.TryGetValue(player.userID, out recieverUserId)) {
SendReply(player, "Вам / вы ещё не писали!");
return;
}
var reciever = BasePlayer.activePlayerList.FirstOrDefault(p => p.userID == recieverUserId);
if (reciever == null) {
SendReply(player, "Игрок покинул сервер, сообщение не отправлено!");
return;
}
if (ignoreList.ContainsKey(reciever.userID) && ignoreList[reciever.userID].Contains(player.userID)) {
SendReply(player, $"Этот игрок вас игнорирует!");
return;
}
SendReply(player, $"<color=#DAA520>ЛС для {reciever.displayName}</color>:\n" + message);
SendReply(reciever, $"<color=#DAA520>ЛС от {player.displayName}</color>:\n" + message);
PrintWarning($"{player} -> {reciever}:");
PrintWarning($"{message}:");
Effect effect = new Effect("assets/bundled/prefabs/fx/notice/stack.world.fx.prefab", reciever, 0, new Vector3(), new Vector3());
EffectNetwork.Send(effect, reciever.Connection);
}
[ConsoleCommand("UI_MuteHandler")]
private void consoleMuteHandler(ConsoleSystem.Arg args) {
if (args.Args.Length == 0) {
DrawGUI(args.Player());
return;
}
if (args.Args[0] == "chooseplayer") {
DrawGUI(args.Player(), args.Args[1]);
return;
}
if (args.Args[0] == "unmute") {
UnMutePlayer(args.Player(), ulong.Parse(args.Args[1]));
return;
}
if (args.Args[0].Length != 17) {
CuiHelper.DestroyUi(args.Player(), Layer + ".ChoosePlayer.BG");
DrawGUI(args.Player(), args.Args[0]);
return;
}
if (args.Args.Length == 3) {
MutePlayer(args.Player(), BasePlayer.Find(args.Args[0]), args.Args[1], args.Args[2]);
return;
}
}
[ConsoleCommand("UI_ChatSystem")]
private void consoleUIHandler(ConsoleSystem.Arg args) {
BasePlayer player = args.Player();
if (player == null ||args.Args.Length == 0) return;
if (args.Args[0].StartsWith("#")) {
if (permission.UserHasPermission(player.UserIDString, Settings.Colors[args.Args[0]])) {
playerSettings[player.userID].NickColor = args.Args[0];
ChatSettUp(player, "updatecolor");
player.ChatMessage($"Вы успешно изменили цвет ника!");
}
else {
player.ChatMessage($"Вы не можете изменить цвет ника, у вас недостаточно прав!");
return;
}
}
switch (args.Args[0].ToLower()) {
case "hidemessages" : {
playerSettings[player.userID].HideMessages = bool.Parse(args.Args[1]);
ChatSettUp(player, "updatechat");
break;
}
case "hidehelpers" : {
playerSettings[player.userID].HideHelpers = bool.Parse(args.Args[1]);
ChatSettUp(args.Player(), $"updatehelper");
break;
}
case "settag" : {
if (!permission.UserHasPermission(player.UserIDString, Settings.Tags.FirstOrDefault(p => p.Value == args.Args[1]).Key)) {
player.ChatMessage($"Вы не можете изменить ваш префикс, у вас недостаточно прав!");
return;
}
playerSettings[args.Player().userID].ChatPrefix = args.Args[1];
ChatSettUp(args.Player(), $"updatetag");
player.ChatMessage($"Вы успешно изменили свой префикс!");
break;
}
}
}
private void ChatSettUp(BasePlayer player, string change = "") {
CuiElementContainer container =new CuiElementContainer();
if (string.IsNullOrEmpty(change)) {
CuiHelper.DestroyUi(player, Layer);
container.Add(new CuiPanel {
CursorEnabled = true, RectTransform = {
AnchorMin = "0.5 0.7", AnchorMax = "0.5 0.7", OffsetMin = "-204 -85.5", OffsetMax = "204 85.5"
}
, Image = {
Color = "0 0 0 0"
}
}
, "Overlay" , Layer);
container.Add(new CuiButton {
RectTransform = {
AnchorMin = "-100 -100", AnchorMax = "100 100"
}
, Button = {
Color = "0 0 0 0.9" , Close = Layer, Material = "assets/content/ui/uibackgroundblur.mat"
}
, Text = {
Text = ""
}
}
, Layer);
container.Add(new CuiElement {
Parent = Layer, Components = {
new CuiImageComponent {
Color = "0 0 0 0"
}
, new CuiRectTransformComponent {
AnchorMin = $"0 {0 - Settings.Colors.Count * 0.23}", AnchorMax = "1 1"
}
}
}
);
container.Add(new CuiElement {
Parent = Layer, Name = Layer + ".Header", Components = {
new CuiImageComponent {
Color = "0 0 0 0"
}
, new CuiRectTransformComponent {
AnchorMin = "0 0.815534", AnchorMax = "1 1.1"
}
}
}
);
container.Add(new CuiElement {
Parent = Layer + ".Header", Components = {
new CuiTextComponent {
Text = "<color=#EBECF9>НАСТРОЙКА ИГРОВОГО ЧАТА</color>", Align = TextAnchor.MiddleCenter, FontSize = 30, Font = "robotocondensed-bold.ttf"
}
, new CuiRectTransformComponent {
AnchorMin = "0 0", AnchorMax = "1 1"
}
}
}
);
container.Add(new CuiElement {
Parent = Layer, Name = Layer + ".TagChoose", Components = {
new CuiImageComponent {
Color = "0 0 0 0"
}
, new CuiRectTransformComponent {
AnchorMin = "0.0139617 0.6592549", AnchorMax = "0.98 0.85"
}
}
}
);
container.Add(new CuiElement {
Parent = Layer + ".TagChoose", Components = {
new CuiTextComponent {
Text = "ВЫБОР ПРЕФИКСА", Align = TextAnchor.MiddleCenter, FontSize = 19, Font = "robotocondensed-regular.ttf"
}
, new CuiRectTransformComponent {
AnchorMin = "0 0", AnchorMax = "1 1"
}
}
}
);
container.Add(new CuiElement {
Parent = Layer, Name = Layer + ".HideChat", Components = {
new CuiImageComponent {
Color = "0 0 0 0"
}
, new CuiRectTransformComponent {
AnchorMin = "0.02 0.24", AnchorMax = "0.15 0.35", OffsetMax = "0 0"
}
}
}
);
container.Add(new CuiElement {
Parent = Layer + ".HideChat", Components = {
new CuiTextComponent {
Text = "ЧАТ", Align = TextAnchor.MiddleCenter, FontSize = 14, Font = "robotocondensed-bold.ttf"
}
, new CuiRectTransformComponent {
AnchorMin = "0 0", AnchorMax = "1 1"
}
}
}
);
container.Add(new CuiElement {
Parent = Layer, Name = Layer + ".HideHelpers", Components = {
new CuiImageComponent {
Color = "0 0 0 0"
}
, new CuiRectTransformComponent {
AnchorMin = "0.57 0.24", AnchorMax = "0.79 0.35", OffsetMax = "0 0"
}
}
}
);
container.Add(new CuiElement {
Parent = Layer + ".HideHelpers", Components = {
new CuiTextComponent {
Text = "ПОДСКАЗКИ", Align = TextAnchor.MiddleCenter, FontSize = 14, Font = "robotocondensed-bold.ttf"
}
, new CuiRectTransformComponent {
AnchorMin = "0 0", AnchorMax = "1 1"
}
}
}
);
}
if (string.IsNullOrEmpty(change) || change == "updatetag") {
foreach (var check in Settings.Tags) CuiHelper.DestroyUi(player, Layer + $".Tag.{check.Value}");
int i = 0;
float width = (float) ((2 - 0.0139617) - (Settings.Tags.Count - 1) * 0.03) / Settings.Tags.Count;
foreach (var check in Settings.Tags) {
string color = playerSettings[player.userID].ChatPrefix == check.Value ? HexToRustFormat("#8eb9ff3c") : "0 0 0 0";
string textColor = "1 1 1 1";
if (!permission.UserHasPermission(player.UserIDString, check.Key)) {
color = "0 0 0 0";
textColor = "1 1 1 0.2";
}
container.Add(new CuiElement {
Parent = Layer, Name = Layer + $".Tag.{check.Value}", Components = {
new CuiImageComponent {
Color = color
}
, new CuiRectTransformComponent {
AnchorMin = $"{-0.5f + i * width + i * 0.03} 0.40", AnchorMax = $"{-0.5f + (i + 1) * width + i * 0.03} 0.64"
}
}
}
);
container.Add(new CuiElement {
Parent = Layer + $".Tag.{check.Value}", Components = {
new CuiTextComponent {
Text = check.Value.Replace("14", "26"), Align = TextAnchor.MiddleCenter, FontSize = 26, Font = "robotocondensed-bold.ttf", Color = textColor
}
, new CuiRectTransformComponent {
AnchorMin = "0 0", AnchorMax = "1 1"
}
}
}
);
container.Add(new CuiButton {
FadeOut = 0.4f, RectTransform = {
AnchorMin = "0 0", AnchorMax = "1 1"
}
, Button = {
FadeIn = 0.4f, Command = $"UI_ChatSystem settag {check.Value}", Color = "0 0 0 0"
}
, Text = {
Text = ""
}
}
, Layer + $".Tag.{check.Value}");
i++;
}
}
if (string.IsNullOrEmpty(change) || change == "updatechat") {
CuiHelper.DestroyUi(player, Layer + ".Chat.BTN");
bool hidden = playerSettings[player.userID].HideMessages;
string text = hidden ? "СКРЫТ" : "ВИДЕН";
string bgColor = hidden ? "1 1 1 0.2" : HexToRustFormat("#8eb9ff3c");
container.Add(new CuiElement {
Parent = Layer, Name = Layer + ".Chat.BTN", Components = {
new CuiImageComponent {
Color = bgColor
}
, new CuiRectTransformComponent {
AnchorMin = "0.16 0.24", AnchorMax = "0.34 0.35", OffsetMax = "0 0"
}
}
}
);
container.Add(new CuiElement {
FadeOut = 0.4f, Parent = Layer + ".Chat.BTN", Components = {
new CuiImageComponent {
FadeIn = 0.4f, Color = HexToRustFormat("#FFFFFFFF")
}
, new CuiRectTransformComponent {
AnchorMin = $"{(hidden ? "0" : "0.82")} 0", AnchorMax = $"{(hidden ? "0.18" : "1")} 1", OffsetMax = "0 0"
}
}
}
);
container.Add(new CuiElement {
FadeOut = 0.4f, Parent = Layer + ".Chat.BTN", Components = {
new CuiTextComponent {
FadeIn = 0.4f, Text = text, Font = "robotocondensed-regular.ttf", FontSize = 14, Align = TextAnchor.MiddleCenter
}
, new CuiRectTransformComponent {
AnchorMin = $"{(hidden ? "0.18" : "0")} 0", AnchorMax = $"{(hidden ? "1" : "0.82")} 1", OffsetMax = "0 0"
}
}
}
);
container.Add(new CuiButton {
FadeOut = 0.4f, Button = {
FadeIn = 0.4f, Color = "0 0 0 0", Command = $"UI_ChatSystem hidemessages {(hidden ? "false" : "true")}"
}
, RectTransform = {
AnchorMin = "0 0", AnchorMax = "1 1"
}
, Text = {
Text = ""
}
}
, Layer + ".Chat.BTN");
}
if (string.IsNullOrEmpty(change) || change == "updatehelper") {
CuiHelper.DestroyUi(player, Layer + ".Helper.BTN");
bool hidden = playerSettings[player.userID].HideHelpers;
string text = hidden ? "СКРЫТЫ" : "ВИДНЫ";
string bgColor = hidden ? "1 1 1 0.2" : HexToRustFormat("#8eb9ff3c");
container.Add(new CuiElement {
Parent = Layer, Name = Layer + ".Helper.BTN", Components = {
new CuiImageComponent {
Color = bgColor
}
, new CuiRectTransformComponent {
AnchorMin = "0.80 0.24", AnchorMax = "0.98 0.35", OffsetMax = "0 0"
}
}
}
);
container.Add(new CuiElement {
FadeOut = 0.4f, Parent = Layer + ".Helper.BTN", Components = {
new CuiImageComponent {
FadeIn = 0.4f, Color = HexToRustFormat("#FFFFFFFF")
}
, new CuiRectTransformComponent {
AnchorMin = $"{(hidden ? "0" : "0.82")} 0", AnchorMax = $"{(hidden ? "0.18" : "1")} 1", OffsetMax = "0 0"
}
}
}
);
container.Add(new CuiElement {
FadeOut = 0.4f, Parent = Layer + ".Helper.BTN", Components = {
new CuiTextComponent {
FadeIn = 0.4f, Text = text, Font = "robotocondensed-regular.ttf", FontSize = 14, Align = TextAnchor.MiddleCenter
}
, new CuiRectTransformComponent {
AnchorMin = $"{(hidden ? "0.18" : "0")} 0", AnchorMax = $"{(hidden ? "1" : "0.82")} 1", OffsetMax = "0 0"
}
}
}
);
container.Add(new CuiButton {
FadeOut = 0.4f, Button = {
FadeIn = 0.4f, Color = "0 0 0 0", Command = $"UI_ChatSystem hidehelpers {(hidden ? "false" : "true")}"
}
, RectTransform = {
AnchorMin = "0 0", AnchorMax = "1 1"
}
, Text = {
Text = ""
}
}
, Layer + ".Helper.BTN");
}
if (string.IsNullOrEmpty(change) || change == "updatecolor") {
CuiHelper.DestroyUi(player, Layer + ".ColorChoose");
foreach (var check in Settings.Colors) CuiHelper.DestroyUi(player, Layer + $".{check.Key}");
container.Add(new CuiElement {
Parent = Layer, Name = Layer + ".ColorChoose", Components = {
new CuiImageComponent {
Color = "0 0 0 0"
}
, new CuiRectTransformComponent {
AnchorMin = "0.0139617 0.02", AnchorMax = "0.98 0.18", OffsetMax = "0 0"
}
}
}
);
container.Add(new CuiElement {
Parent = Layer + ".ColorChoose", Components = {
new CuiTextComponent {
Text = "ВЫБОР ЦВЕТА", Align = TextAnchor.MiddleCenter, FontSize = 19, Font = "robotocondensed-regular.ttf"
}
, new CuiRectTransformComponent {
AnchorMin = "0 0", AnchorMax = "1 1"
}
}
}
);
int t = 0;
foreach (var check in Settings.Colors) {
string text = "";
if (check.Key == playerSettings[player.userID].NickColor) text = "ТЕКУЩИЙ";
else if (!permission.UserHasPermission(player.UserIDString, check.Value)) text = "НЕДОСТУПНО ДЛЯ ВЫБОРА";
container.Add(new CuiButton {
RectTransform = {
AnchorMin = $"{0.0139617} {-0.2 - t * 0.23}", AnchorMax = $"{0.98} {0 - t * 0.23}", OffsetMax = $"0 0"
}
, Button = {
Command = $"UI_ChatSystem {check.Key}", Color = HexToRustFormat($"{check.Key}3C")
}
, Text = {
Text = text, Align = TextAnchor.MiddleCenter, FontSize = 18, Font = "robotocondensed-regular.ttf"
}
}
, Layer, Layer + $".{check.Key}");
t++;
}
}
CuiHelper.AddUi(player, container);
}
private void DrawGUI(BasePlayer player, string target = "", string reason = "", string time = "") {
CuiElementContainer container = new CuiElementContainer();
if (target == "" && reason == "" && time == "") {
CuiHelper.DestroyUi(player, Layer);
container.Add(new CuiPanel {
CursorEnabled = true, RectTransform = {
AnchorMin = "0.3166667 0.4369213", AnchorMax = "0.6833333 0.5630786"
}
, Image = {
Color = "0 0 0 0"
}
}
, "Overlay", Layer);
container.Add(new CuiButton {
RectTransform = {
AnchorMin = "-100 -100", AnchorMax = "100 100"
}
, Button = {
Close = Layer, Color = "0 0 0 0.9", Material = "assets/content/ui/uibackgroundblur.mat"
}
, Text = {
Text = ""
}
}
, Layer);
container.Add(new CuiElement {
Parent = Layer, Components = {
new CuiImageComponent {
Color = "0 0 0 0"
}
, new CuiRectTransformComponent {
AnchorMin = "0 0", AnchorMax = "1 1"
}
}
}
);
container.Add(new CuiElement {
Parent = Layer, Name = Layer + ".Header", Components = {
new CuiImageComponent {
Color = "0 0 0 0"
}
, new CuiRectTransformComponent {
AnchorMin = "0 0.6752296", AnchorMax = "1 1.1"
}
}
}
);
container.Add(new CuiElement {
Parent = Layer + ".Header", Components = {
new CuiTextComponent {
Text = "ВЫДАЧА БЛОКИРОВКИ ЧАТА", Align = TextAnchor.MiddleCenter, FontSize = 22, Font = "robotocondensed-bold.ttf"
}
, new CuiRectTransformComponent {
AnchorMin = "0 0", AnchorMax = "1 1"
}
}
}
);
string helpText = "Первым делом вам необходимо ввести имя игрока, которому вы хотите выдать блокировку игрового чата";
container.Add(new CuiElement {
FadeOut = 0.4f, Name = Layer + ".FirstStep", Parent = Layer, Components = {
new CuiTextComponent {
FadeIn = 0.4f, Text = helpText, Align = TextAnchor.MiddleCenter, Font = "robotocondensed-regular.ttf"
}
, new CuiRectTransformComponent {
AnchorMin = "0 0.3091741", AnchorMax = "1 0.9"
}
}
}
);
container.Add(new CuiElement {
Parent = Layer, Name = Layer + ".Input", Components = {
new CuiImageComponent {
Color = HexToRustFormat("#FFFFFF72")
}
, new CuiRectTransformComponent {
AnchorMin = "0.005681746 0.03027457", AnchorMax = "0.9943181 0.2871558"
}
}
}
);
container.Add(new CuiElement {
Parent = Layer + ".Input", Name = Layer + ".Input.Current", Components = {
new CuiInputFieldComponent {
FontSize = 16, Align = TextAnchor.MiddleCenter, Command = "UI_MuteHandler ", Text = "ВВЕДИТЕ ИМЯ ИГРОКА"
}
, new CuiRectTransformComponent {
AnchorMin = "0 0", AnchorMax = "1 1"
}
}
}
);
}
if (target.Length != 17 && reason == "" && time == "") {
for (int i = 0; i < 5; i++) {
CuiHelper.DestroyUi(player, Layer + $".ChoosePlayer.{i}");
CuiHelper.DestroyUi(player, Layer + $".ChoosePlayer.{i}.Text");
}
timer.Once(0.5f, () => {
int t = 0;
var list = BasePlayer.activePlayerList.Where(p => p.displayName.ToLower().Contains(target.ToLower())).Take(5);
container.Add(new CuiElement {
FadeOut = 0.4f, Parent = Layer, Name = Layer + $".ChoosePlayer.BG", Components = {
new CuiImageComponent {
Colo
// ... [Code preview truncated due to length. Full source in attached file] ...