/
foreks73
/
ServerInfoPlugin
Обзор
Документация
Войти
/
foreks73
/
ServerInfoPlugin
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
ServerInfoPlugin.cs
980 строк
39 KB
foreks73
upload files
11 июн 2025, 18:04
11 июн 2025, 18:04
2f0f623
Код
Авторство
О чём код?
using System; using System.Collections.Generic; using System.Linq; using Oxide.Core; using Oxide.Core.Plugins; using Oxide.Game.Rust.Cui; using UnityEngine; using Newtonsoft.Json; namespace Oxide.Plugins { [Info("Server Info Plugin", "YourName", "1.0.0")] [Description("Показывает информацию о сервере с событиями и онлайном")] public class ServerInfoPlugin : RustPlugin { #region Configuration private Configuration config; public class Configuration { [JsonProperty("Позиция UI (AnchorMin)")] public string AnchorMin { get; set; } = "0.01 0.7"; [JsonProperty("Позиция UI (AnchorMax)")] public string AnchorMax { get; set; } = "0.25 0.99"; [JsonProperty("Цвет фона")] public string BackgroundColor { get; set; } = "0.1 0.1 0.1 0.8"; [JsonProperty("Цвет текста")] public string TextColor { get; set; } = "1 1 1 1"; [JsonProperty("Размер шрифта")] public int FontSize { get; set; } = 12; [JsonProperty("Обновление каждые X секунд")] public float UpdateInterval { get; set; } = 5f; [JsonProperty("Показывать Bradley")] public bool ShowBradley { get; set; } = true; [JsonProperty("Показывать Helicopter")] public bool ShowHelicopter { get; set; } = true; [JsonProperty("Показывать Airdrop")] public bool ShowAirdrop { get; set; } = true; [JsonProperty("Показывать Cargo Ship")] public bool ShowCargoShip { get; set; } = true; [JsonProperty("Показывать кнопку закрытия")] public bool ShowCloseButton { get; set; } = false; [JsonProperty("Автоматически показывать при входе")] public bool AutoShowOnConnect { get; set; } = true; [JsonProperty("Скрывать при засыпании")] public bool HideOnSleep { get; set; } = true; [JsonProperty("Сохранять данные событий")] public bool SaveEventData { get; set; } = true; [JsonProperty("Уведомления в чат о событиях")] public bool ChatNotifications { get; set; } = true; [JsonProperty("Иконки")] public IconSettings Icons { get; set; } = new IconSettings(); public class IconSettings { [JsonProperty("Онлайн игроки")] public string OnlineIcon { get; set; } = "👥"; [JsonProperty("Спящие игроки")] public string SleepingIcon { get; set; } = "😴"; [JsonProperty("Входящие игроки")] public string JoiningIcon { get; set; } = "🚪"; [JsonProperty("Время")] public string TimeIcon { get; set; } = "🕐"; [JsonProperty("Bradley")] public string BradleyIcon { get; set; } = "🚗"; [JsonProperty("Helicopter")] public string HelicopterIcon { get; set; } = "🚁"; [JsonProperty("Airdrop")] public string AirdropIcon { get; set; } = "📦"; [JsonProperty("Cargo Ship")] public string CargoShipIcon { get; set; } = "🚢"; [JsonProperty("Вайп")] public string WipeIcon { get; set; } = "🔄"; } } protected override void LoadConfig() { base.LoadConfig(); try { config = Config.ReadObject<Configuration>(); if (config == null) throw new Exception(); } catch { PrintError("Ошибка в конфигурации! Создаю новую..."); LoadDefaultConfig(); } SaveConfig(); } protected override void LoadDefaultConfig() { config = new Configuration(); } protected override void SaveConfig() => Config.WriteObject(config); #endregion #region Fields private Timer updateTimer; private readonly Dictionary<ulong, string> playerPanels = new Dictionary<ulong, string>(); private const string PanelName = "ServerInfoPanel"; private struct ServerEvents { public bool BradleyActive; public bool HelicopterActive; public bool AirdropActive; public bool CargoShipActive; public DateTime? BradleySpawnTime; public DateTime? HelicopterSpawnTime; public DateTime? AirdropSpawnTime; public DateTime? CargoShipSpawnTime; } private ServerEvents currentEvents; private Dictionary<string, string> messages = new Dictionary<string, string> { ["NoPermission"] = "У вас нет разрешения на использование этой команды", ["PanelShown"] = "Панель информации показана", ["PanelHidden"] = "Панель информации скрыта", ["ConfigReloaded"] = "Конфигурация перезагружена", ["UnknownCommand"] = "Неизвестная команда", ["NoActiveEvents"] = "В данный момент нет активных событий", ["ActiveEvents"] = "Активные события:", ["ServerStats"] = "СТАТИСТИКА СЕРВЕРА", ["Players"] = "Игроки:", ["Online"] = "Онлайн:", ["Sleeping"] = "Спящие:", ["Queued"] = "В очереди:", ["Maximum"] = "Максимум:", ["Time"] = "Время:", ["GameTime"] = "Игровое:", ["RealTime"] = "Реальное:", ["Date"] = "Дата:", ["Events"] = "События:", ["Active"] = "Активен", ["Inactive"] = "Неактивен" }; #endregion #region Hooks void Init() { LoadConfig(); currentEvents = new ServerEvents(); // Регистрируем разрешения permission.RegisterPermission("serverinfo.use", this); permission.RegisterPermission("serverinfo.admin", this); // Загружаем данные событий если включено if (config.SaveEventData) { LoadEventData(); } } void OnServerInitialized() { StartUpdateTimer(); CheckExistingEvents(); } void Unload() { updateTimer?.Destroy(); // Сохраняем данные событий if (config.SaveEventData) { SaveEventData(); } foreach (var player in BasePlayer.activePlayerList) { DestroyUI(player); } } void OnPlayerConnected(BasePlayer player) { if (config.AutoShowOnConnect) { timer.Once(1f, () => CreateUI(player)); } } void OnPlayerDisconnected(BasePlayer player) { DestroyUI(player); } void OnPlayerSleepEnded(BasePlayer player) { if (player != null && player.IsConnected && config.AutoShowOnConnect) { timer.Once(2f, () => CreateUI(player)); } } void OnPlayerSleep(BasePlayer player) { if (player != null && config.HideOnSleep) { DestroyUI(player); } } protected override void LoadDefaultMessages() { lang.RegisterMessages(messages, this); } void OnServerSave() { if (config.SaveEventData) { SaveEventData(); } } // События для отслеживания void OnEntitySpawned(BaseEntity entity) { if (entity == null) return; switch (entity.ShortPrefabName) { case "bradleyapc": if (config.ShowBradley) { currentEvents.BradleyActive = true; currentEvents.BradleySpawnTime = DateTime.Now; if (config.ChatNotifications) PrintToChat($"{config.Icons.BradleyIcon} Bradley APC заспавнился!"); } break; case "patrolhelicopter": if (config.ShowHelicopter) { currentEvents.HelicopterActive = true; currentEvents.HelicopterSpawnTime = DateTime.Now; if (config.ChatNotifications) PrintToChat($"{config.Icons.HelicopterIcon} Patrol Helicopter прилетел!"); } break; case "supply_drop": if (config.ShowAirdrop) { currentEvents.AirdropActive = true; currentEvents.AirdropSpawnTime = DateTime.Now; if (config.ChatNotifications) PrintToChat($"{config.Icons.AirdropIcon} Airdrop сброшен!"); } break; case "cargoship": if (config.ShowCargoShip) { currentEvents.CargoShipActive = true; currentEvents.CargoShipSpawnTime = DateTime.Now; if (config.ChatNotifications) PrintToChat($"{config.Icons.CargoShipIcon} Cargo Ship прибыл!"); } break; } } void OnEntityKill(BaseEntity entity) { if (entity == null) return; switch (entity.ShortPrefabName) { case "bradleyapc": currentEvents.BradleyActive = false; currentEvents.BradleySpawnTime = null; break; case "patrolhelicopter": currentEvents.HelicopterActive = false; currentEvents.HelicopterSpawnTime = null; break; case "supply_drop": currentEvents.AirdropActive = false; currentEvents.AirdropSpawnTime = null; break; case "cargoship": currentEvents.CargoShipActive = false; currentEvents.CargoShipSpawnTime = null; if (config.ChatNotifications) PrintToChat($"{config.Icons.CargoShipIcon} Cargo Ship покинул карту!"); break; } } void OnEntityDeath(BaseCombatEntity entity, HitInfo info) { if (entity == null) return; switch (entity.ShortPrefabName) { case "bradleyapc": currentEvents.BradleyActive = false; currentEvents.BradleySpawnTime = null; if (config.ChatNotifications) PrintToChat($"{config.Icons.BradleyIcon} Bradley APC уничтожен!"); break; case "patrolhelicopter": currentEvents.HelicopterActive = false; currentEvents.HelicopterSpawnTime = null; if (config.ChatNotifications) PrintToChat($"{config.Icons.HelicopterIcon} Patrol Helicopter уничтожен!"); break; } } void OnEntitySpawned(CH47HelicopterAIController entity) { if (config.ChatNotifications) PrintToChat("🚁 CH47 Chinook прилетел на событие!"); } #endregion #region UI Methods void CreateUI(BasePlayer player) { if (player == null || !player.IsConnected) return; DestroyUI(player); var container = new CuiElementContainer(); var panelId = PanelName + player.userID; // Основная панель container.Add(new CuiPanel { Image = { Color = config.BackgroundColor, Material = "assets/content/ui/uibackgroundblur-ingamemenu.mat" }, RectTransform = { AnchorMin = config.AnchorMin, AnchorMax = config.AnchorMax }, CursorEnabled = false }, "Overlay", panelId); // Заголовок с тенью container.Add(new CuiLabel { Text = { Text = "📊 ИНФОРМАЦИЯ СЕРВЕРА", FontSize = config.FontSize + 4, Align = TextAnchor.MiddleCenter, Color = "0 0 0 0.5" }, RectTransform = { AnchorMin = "0.01 0.89", AnchorMax = "1.01 0.99" } }, panelId); container.Add(new CuiLabel { Text = { Text = "📊 ИНФОРМАЦИЯ СЕРВЕРА", FontSize = config.FontSize + 4, Align = TextAnchor.MiddleCenter, Color = config.TextColor }, RectTransform = { AnchorMin = "0 0.9", AnchorMax = "1 1" } }, panelId); // Информация об игроках var playersInfo = GetPlayersInfo(); container.Add(new CuiLabel { Text = { Text = playersInfo, FontSize = config.FontSize, Align = TextAnchor.UpperLeft, Color = config.TextColor }, RectTransform = { AnchorMin = "0.05 0.7", AnchorMax = "0.95 0.9" } }, panelId); // Время сервера и вайп var timeInfo = GetTimeInfo() + "\n" + GetWipeInfo(); container.Add(new CuiLabel { Text = { Text = timeInfo, FontSize = config.FontSize, Align = TextAnchor.UpperLeft, Color = config.TextColor }, RectTransform = { AnchorMin = "0.05 0.5", AnchorMax = "0.95 0.7" } }, panelId); // События var eventsInfo = GetEventsInfo(); container.Add(new CuiLabel { Text = { Text = eventsInfo, FontSize = config.FontSize, Align = TextAnchor.UpperLeft, Color = config.TextColor }, RectTransform = { AnchorMin = "0.05 0.1", AnchorMax = "0.95 0.5" } }, panelId); // Кнопка закрытия (опционально) if (config.ShowCloseButton) { container.Add(new CuiButton { Button = { Command = "serverinfo.toggle", Color = "0.8 0.2 0.2 0.8" }, RectTransform = { AnchorMin = "0.85 0.02", AnchorMax = "0.98 0.08" }, Text = { Text = "✕", FontSize = 12, Align = TextAnchor.MiddleCenter, Color = "1 1 1 1" } }, panelId); } CuiHelper.AddUi(player, container); playerPanels[player.userID] = panelId; } void DestroyUI(BasePlayer player) { if (player == null) return; if (playerPanels.ContainsKey(player.userID)) { CuiHelper.DestroyUi(player, playerPanels[player.userID]); playerPanels.Remove(player.userID); } } void UpdateUI() { foreach (var player in BasePlayer.activePlayerList.ToList()) { if (player != null && player.IsConnected) { CreateUI(player); } } } #endregion #region Info Methods string GetPlayersInfo() { var online = BasePlayer.activePlayerList.Count; var sleeping = BasePlayer.sleepingPlayerList.Count; var joining = ServerMgr.Instance.connectionQueue.Queued; return $"{config.Icons.OnlineIcon} Онлайн: <color=#00ff00>{online}</color>\n" + $"{config.Icons.SleepingIcon} Спящие: <color=#ffff00>{sleeping}</color>\n" + $"{config.Icons.JoiningIcon} В очереди: <color=#ff8800>{joining}</color>"; } string GetTimeInfo() { var gameTime = TOD_Sky.Instance.Cycle.Hour; var realTime = DateTime.Now; return $"{config.Icons.TimeIcon} Игровое время: <color=#87ceeb>{gameTime:F1}:00</color>\n" + $"{config.Icons.TimeIcon} Реальное время: <color=#87ceeb>{realTime:HH:mm}</color>"; } string GetEventsInfo() { var events = new List<string>(); if (config.ShowBradley) { if (currentEvents.BradleyActive) { var time = currentEvents.BradleySpawnTime.HasValue ? $" ({GetTimeSince(currentEvents.BradleySpawnTime.Value)})" : ""; events.Add($"{config.Icons.BradleyIcon} Bradley: <color=#ff0000>Активен{time}</color>"); } else { events.Add($"{config.Icons.BradleyIcon} Bradley: <color=#808080>Неактивен</color>"); } } if (config.ShowHelicopter) { if (currentEvents.HelicopterActive) { var time = currentEvents.HelicopterSpawnTime.HasValue ? $" ({GetTimeSince(currentEvents.HelicopterSpawnTime.Value)})" : ""; events.Add($"{config.Icons.HelicopterIcon} Helicopter: <color=#ff0000>Активен{time}</color>"); } else { events.Add($"{config.Icons.HelicopterIcon} Helicopter: <color=#808080>Неактивен</color>"); } } if (config.ShowAirdrop) { if (currentEvents.AirdropActive) { var time = currentEvents.AirdropSpawnTime.HasValue ? $" ({GetTimeSince(currentEvents.AirdropSpawnTime.Value)})" : ""; events.Add($"{config.Icons.AirdropIcon} Airdrop: <color=#00ff00>Активен{time}</color>"); } else { events.Add($"{config.Icons.AirdropIcon} Airdrop: <color=#808080>Неактивен</color>"); } } if (config.ShowCargoShip) { if (currentEvents.CargoShipActive) { var time = currentEvents.CargoShipSpawnTime.HasValue ? $" ({GetTimeSince(currentEvents.CargoShipSpawnTime.Value)})" : ""; events.Add($"{config.Icons.CargoShipIcon} Cargo Ship: <color=#0080ff>Активен{time}</color>"); } else { events.Add($"{config.Icons.CargoShipIcon} Cargo Ship: <color=#808080>Неактивен</color>"); } } return string.Join("\n", events); } string GetTimeSince(DateTime time) { var span = DateTime.Now - time; if (span.TotalMinutes < 1) return $"{(int)span.TotalSeconds}с"; else if (span.TotalHours < 1) return $"{(int)span.TotalMinutes}м"; else return $"{(int)span.TotalHours}ч {(int)span.Minutes}м"; } string GetWipeInfo() { try { var wipeTime = SaveRestore.SaveCreatedTime; var timeSinceWipe = DateTime.Now - wipeTime; string wipeString; if (timeSinceWipe.TotalDays >= 1) wipeString = $"{(int)timeSinceWipe.TotalDays}д {timeSinceWipe.Hours}ч"; else if (timeSinceWipe.TotalHours >= 1) wipeString = $"{(int)timeSinceWipe.TotalHours}ч {timeSinceWipe.Minutes}м"; else wipeString = $"{(int)timeSinceWipe.TotalMinutes}м"; return $"{config.Icons.WipeIcon} Вайп: {wipeTime:dd.MM.yyyy} ({wipeString} назад)"; } catch { return $"{config.Icons.WipeIcon} Вайп: Неизвестно"; } } #endregion #region Helper Methods void StartUpdateTimer() { updateTimer?.Destroy(); updateTimer = timer.Every(config.UpdateInterval, UpdateUI); } void CheckExistingEvents() { // Проверяем существующие события при загрузке плагина foreach (var entity in BaseEntity.saveList.ToArray()) { if (entity == null) continue; switch (entity.ShortPrefabName) { case "bradleyapc": if (config.ShowBradley && !entity.IsDestroyed) { currentEvents.BradleyActive = true; currentEvents.BradleySpawnTime = DateTime.Now; } break; case "patrolhelicopter": if (config.ShowHelicopter && !entity.IsDestroyed) { currentEvents.HelicopterActive = true; currentEvents.HelicopterSpawnTime = DateTime.Now; } break; case "supply_drop": if (config.ShowAirdrop && !entity.IsDestroyed) { currentEvents.AirdropActive = true; currentEvents.AirdropSpawnTime = DateTime.Now; } break; case "cargoship": if (config.ShowCargoShip && !entity.IsDestroyed) { currentEvents.CargoShipActive = true; currentEvents.CargoShipSpawnTime = DateTime.Now; } break; } } } bool HasPermission(BasePlayer player, string perm) { return permission.UserHasPermission(player.UserIDString, perm); } string GetMessage(string key, string userId = null) => lang.GetMessage(key, this, userId); #endregion #region Data Storage void SaveEventData() { var data = new Dictionary<string, object> { ["BradleyActive"] = currentEvents.BradleyActive, ["HelicopterActive"] = currentEvents.HelicopterActive, ["AirdropActive"] = currentEvents.AirdropActive, ["CargoShipActive"] = currentEvents.CargoShipActive, ["BradleySpawnTime"] = currentEvents.BradleySpawnTime?.ToBinary(), ["HelicopterSpawnTime"] = currentEvents.HelicopterSpawnTime?.ToBinary(), ["AirdropSpawnTime"] = currentEvents.AirdropSpawnTime?.ToBinary(), ["CargoShipSpawnTime"] = currentEvents.CargoShipSpawnTime?.ToBinary() }; Interface.Oxide.DataFileSystem.WriteObject("ServerInfoPlugin_Events", data); } void LoadEventData() { try { var data = Interface.Oxide.DataFileSystem.ReadObject<Dictionary<string, object>>("ServerInfoPlugin_Events"); if (data != null) { currentEvents.BradleyActive = Convert.ToBoolean(data["BradleyActive"]); currentEvents.HelicopterActive = Convert.ToBoolean(data["HelicopterActive"]); currentEvents.AirdropActive = Convert.ToBoolean(data["AirdropActive"]); currentEvents.CargoShipActive = Convert.ToBoolean(data["CargoShipActive"]); if (data["BradleySpawnTime"] != null) currentEvents.BradleySpawnTime = DateTime.FromBinary(Convert.ToInt64(data["BradleySpawnTime"])); if (data["HelicopterSpawnTime"] != null) currentEvents.HelicopterSpawnTime = DateTime.FromBinary(Convert.ToInt64(data["HelicopterSpawnTime"])); if (data["AirdropSpawnTime"] != null) currentEvents.AirdropSpawnTime = DateTime.FromBinary(Convert.ToInt64(data["AirdropSpawnTime"])); if (data["CargoShipSpawnTime"] != null) currentEvents.CargoShipSpawnTime = DateTime.FromBinary(Convert.ToInt64(data["CargoShipSpawnTime"])); } } catch (Exception ex) { PrintError($"Ошибка загрузки данных событий: {ex.Message}"); } } #endregion #region Commands [ChatCommand("serverinfo")] void ServerInfoCommand(BasePlayer player, string command, string[] args) { if (!HasPermission(player, "serverinfo.use")) { SendReply(player, GetMessage("NoPermission", player.UserIDString)); return; } if (args.Length == 0) { SendReply(player, "Доступные команды:\n" + "/serverinfo show - показать панель\n" + "/serverinfo hide - скрыть панель\n" + "/serverinfo reload - перезагрузить конфиг (только админ)"); return; } switch (args[0].ToLower()) { case "show": CreateUI(player); SendReply(player, GetMessage("PanelShown", player.UserIDString)); break; case "hide": DestroyUI(player); SendReply(player, GetMessage("PanelHidden", player.UserIDString)); break; case "reload": if (!HasPermission(player, "serverinfo.admin")) { SendReply(player, GetMessage("NoPermission", player.UserIDString)); return; } LoadConfig(); StartUpdateTimer(); UpdateUI(); SendReply(player, GetMessage("ConfigReloaded", player.UserIDString)); break; default: SendReply(player, GetMessage("UnknownCommand", player.UserIDString)); break; } } [ChatCommand("events")] void EventsCommand(BasePlayer player, string command, string[] args) { if (!HasPermission(player, "serverinfo.use")) { SendReply(player, GetMessage("NoPermission", player.UserIDString)); return; } var activeEvents = new List<string>(); if (currentEvents.BradleyActive) activeEvents.Add($"{config.Icons.BradleyIcon} Bradley APC"); if (currentEvents.HelicopterActive) activeEvents.Add($"{config.Icons.HelicopterIcon} Patrol Helicopter"); if (currentEvents.AirdropActive) activeEvents.Add($"{config.Icons.AirdropIcon} Airdrop"); if (currentEvents.CargoShipActive) activeEvents.Add($"{config.Icons.CargoShipIcon} Cargo Ship"); if (activeEvents.Count > 0) { SendReply(player, GetMessage("ActiveEvents", player.UserIDString) + "\n" + string.Join("\n", activeEvents)); } else { SendReply(player, GetMessage("NoActiveEvents", player.UserIDString)); } } [ChatCommand("serverstats")] void ServerStatsCommand(BasePlayer player, string command, string[] args) { if (!HasPermission(player, "serverinfo.use")) { SendReply(player, GetMessage("NoPermission", player.UserIDString)); return; } var stats = $"📊 <color=#00ff00>{GetMessage("ServerStats", player.UserIDString)}</color>\n\n" + $"👥 {GetMessage("Players", player.UserIDString)}\n" + $" • {GetMessage("Online", player.UserIDString)} {BasePlayer.activePlayerList.Count}\n" + $" • {GetMessage("Sleeping", player.UserIDString)} {BasePlayer.sleepingPlayerList.Count}\n" + $" • {GetMessage("Queued", player.UserIDString)} {ServerMgr.Instance.connectionQueue.Queued}\n" + $" • {GetMessage("Maximum", player.UserIDString)} {ConVar.Server.maxplayers}\n\n" + $"🕐 {GetMessage("Time", player.UserIDString)}\n" + $" • {GetMessage("GameTime", player.UserIDString)} {TOD_Sky.Instance.Cycle.Hour:F1}:00\n" + $" • {GetMessage("RealTime", player.UserIDString)} {DateTime.Now:HH:mm:ss}\n" + $" • {GetMessage("Date", player.UserIDString)} {DateTime.Now:dd.MM.yyyy}\n\n" + $"🎯 {GetMessage("Events", player.UserIDString)}\n"; if (currentEvents.BradleyActive) stats += $" • {config.Icons.BradleyIcon} Bradley: {GetMessage("Active", player.UserIDString)}\n"; if (currentEvents.HelicopterActive) stats += $" • {config.Icons.HelicopterIcon} Helicopter: {GetMessage("Active", player.UserIDString)}\n"; if (currentEvents.AirdropActive) stats += $" • {config.Icons.AirdropIcon} Airdrop: {GetMessage("Active", player.UserIDString)}\n"; if (currentEvents.CargoShipActive) stats += $" • {config.Icons.CargoShipIcon} Cargo Ship: {GetMessage("Active", player.UserIDString)}\n"; if (!currentEvents.BradleyActive && !currentEvents.HelicopterActive && !currentEvents.AirdropActive && !currentEvents.CargoShipActive) { stats += $" • {GetMessage("NoActiveEvents", player.UserIDString)}\n"; } SendReply(player, stats); } [ConsoleCommand("serverinfo.force_update")] void ForceUpdateCommand(ConsoleSystem.Arg arg) { if (arg.Player() != null && !HasPermission(arg.Player(), "serverinfo.admin")) return; CheckExistingEvents(); UpdateUI(); Puts("Принудительное обновление информации о сервере выполнено"); } [ConsoleCommand("serverinfo.reset_events")] void ResetEventsCommand(ConsoleSystem.Arg arg) { if (arg.Player() != null && !HasPermission(arg.Player(), "serverinfo.admin")) return; currentEvents = new ServerEvents(); UpdateUI(); Puts("События сброшены"); } [ConsoleCommand("serverinfo.toggle")] void ToggleCommand(ConsoleSystem.Arg arg) { var player = arg.Player(); if (player == null) return; if (!HasPermission(player, "serverinfo.use")) { SendReply(player, GetMessage("NoPermission", player.UserIDString)); return; } if (playerPanels.ContainsKey(player.userID)) { DestroyUI(player); SendReply(player, GetMessage("PanelHidden", player.UserIDString)); } else { CreateUI(player); SendReply(player, GetMessage("PanelShown", player.UserIDString)); } } [ChatCommand("serverinfo.bind")] void BindCommand(BasePlayer player, string command, string[] args) { if (!HasPermission(player, "serverinfo.use")) { SendReply(player, GetMessage("NoPermission", player.UserIDString)); return; } SendReply(player, "Для привязки горячей клавиши используйте:\nbind [клавиша] \"serverinfo.toggle\"\nНапример: bind f1 \"serverinfo.toggle\""); } #endregion #region API // API для других плагинов [HookMethod("GetServerInfo")] public Dictionary<string, object> GetServerInfo() { return new Dictionary<string, object> { ["online"] = BasePlayer.activePlayerList.Count, ["sleeping"] = BasePlayer.sleepingPlayerList.Count, ["queued"] = ServerMgr.Instance.connectionQueue.Queued, ["maxplayers"] = ConVar.Server.maxplayers, ["bradley_active"] = currentEvents.BradleyActive, ["helicopter_active"] = currentEvents.HelicopterActive, ["airdrop_active"] = currentEvents.AirdropActive, ["cargoship_active"] = currentEvents.CargoShipActive, ["bradley_time"] = currentEvents.BradleySpawnTime?.ToString("HH:mm:ss"), ["helicopter_time"] = currentEvents.HelicopterSpawnTime?.ToString("HH:mm:ss"), ["airdrop_time"] = currentEvents.AirdropSpawnTime?.ToString("HH:mm:ss"), ["cargoship_time"] = currentEvents.CargoShipSpawnTime?.ToString("HH:mm:ss"), ["game_time"] = TOD_Sky.Instance.Cycle.Hour, ["real_time"] = DateTime.Now.ToString("HH:mm:ss"), ["server_name"] = ConVar.Server.hostname, ["server_description"] = ConVar.Server.description, ["wipe_date"] = SaveRestore.SaveCreatedTime.ToString("dd.MM.yyyy") }; } [HookMethod("IsEventActive")] public bool IsEventActive(string eventName) { switch (eventName.ToLower()) { case "bradley": return currentEvents.BradleyActive; case "helicopter": return currentEvents.HelicopterActive; case "airdrop": return currentEvents.AirdropActive; case "cargoship": return currentEvents.CargoShipActive; default: return false; } } [HookMethod("GetEventTime")] public string GetEventTime(string eventName) { DateTime? time = null; switch (eventName.ToLower()) { case "bradley": time = currentEvents.BradleySpawnTime; break; case "helicopter": time = currentEvents.HelicopterSpawnTime; break; case "airdrop": time = currentEvents.AirdropSpawnTime; break; case "cargoship": time = currentEvents.CargoShipSpawnTime; break; } return time?.ToString("HH:mm:ss") ?? "Неактивен"; } [HookMethod("ShowPanelForPlayer")] public void ShowPanelForPlayer(BasePlayer player) { if (player != null && player.IsConnected) { CreateUI(player); } } [HookMethod("HidePanelForPlayer")] public void HidePanelForPlayer(BasePlayer player) { if (player != null) { DestroyUI(player); } } [HookMethod("GetActiveEventsCount")] public int GetActiveEventsCount() { int count = 0; if (currentEvents.BradleyActive) count++; if (currentEvents.HelicopterActive) count++; if (currentEvents.AirdropActive) count++; if (currentEvents.CargoShipActive) count++; return count; } [HookMethod("GetActiveEventsList")] public List<string> GetActiveEventsList() { var events = new List<string>(); if (currentEvents.BradleyActive) events.Add("bradley"); if (currentEvents.HelicopterActive) events.Add("helicopter"); if (currentEvents.AirdropActive) events.Add("airdrop"); if (currentEvents.CargoShipActive) events.Add("cargoship"); return events; } #endregion } }