Иконка ресурса

FREE RestartGUI : 1.0.0 1.0.0

Нет прав для скачивания
C#:
using System;
using System.Globalization;
using Newtonsoft.Json;
using Oxide.Core;
using Oxide.Core.Plugins;
using Oxide.Game.Rust.Cui;
using UnityEngine;
using Console = ConVar.Console;
using Time = Oxide.Core.Libraries.Time;

namespace Oxide.Plugins
{
[Info("RestartGUI", "Foxyd | topplugin.ru", "1.0.0")]
    public class RestartGUI : RustPlugin
    {
        private const string Layer = "RestartLayer";
        
        private static class RestartConfig
        {
            public static int Time = 0;

            public static bool Restart = false;

            public static bool First = true;
        }
        
        #region Config

        private Configuration config = new Configuration();
        
        private class Configuration
        {
            [JsonProperty("Время рестарта")] 
            public string Time = "4:55";

            [JsonProperty("Время до рестарта")] 
            public int RestartTime = 300;

            [JsonProperty("Сообщение о рестарте")] 
            public string RestartTimerText = "Сервер перезагрузится через {0} секунд";
			
			[JsonProperty("Звук")]
            public string Effect = "assets/bundled/prefabs/fx/notice/item.select.fx.prefab";

        }

        protected override void LoadConfig()
        {
            base.LoadConfig();

            try
            {
                config = Config.ReadObject<Configuration>();
                if(config == null) throw new Exception();
            }
            catch
            {
                Config.WriteObject(config, false, $"{Interface.Oxide.ConfigDirectory}/{Name}.jsonError");
                PrintError("Ошибка в конфигурации плагина RestartGUI");
                
                LoadDefaultConfig();
            }
        }

        protected override void LoadDefaultConfig() => config = new Configuration();

        protected override void SaveConfig() => Config.WriteObject(config);

        #endregion

        #region Hook

        private void OnServerInitialized()
        {
            LoadConfig();
        }

        private void OnTick()
        {
            if (DateTime.Now.ToString("t") != config.Time || RestartConfig.Restart) return;
            
            RestartConfig.Restart = true;
            ExecuteRestart(config.RestartTime);
        }
        
        #endregion
        
        #region Command

        [ConsoleCommand("restart")]
        private void ConsoleReload(ConsoleSystem.Arg arg)
        {
            if (!arg.IsServerside) return;

            var args = arg.Args ?? new string[0];
            
            switch (args.Length)
            {
                case 0:
                {
                    if (RestartConfig.Restart)
                    {
                        ResetConfig();
                        return;
                    }

                    RestartConfig.Restart = true;
                    ExecuteRestart(config.RestartTime);
                    return;
                }
                case 1:
                {
                    if (RestartConfig.Restart || args[0].ToLower() == "stop")
                    {
                        ResetConfig();
                        return;
                    }

                    int time;

                    if (!int.TryParse(args[0], out time)) return;
                
                    ResetConfig();
                    RestartConfig.Restart = true;
                    ExecuteRestart(time);
                    break;
                }
            }
        }

        [ChatCommand("restart")]
        private void CMDReload(BasePlayer player, string cmd, string[] args)
        {
            if (!player.IsAdmin) return;
            
            switch (args.Length)
            {
                case 0:
                {
                    if (RestartConfig.Restart)
                    {
                        ResetConfig();
                        return;
                    }

                    RestartConfig.Restart = true;
                    ExecuteRestart(config.RestartTime);
                    return;
                }
                case 1:
                {
                    if (RestartConfig.Restart || args[0].ToLower() == "stop")
                    {
                        ResetConfig();
                        return;
                    }

                    int time;

                    if (!int.TryParse(args[0], out time)) return;
                
                    ResetConfig();
                    RestartConfig.Restart = true;
                    ExecuteRestart(time);
                    break;
                }
            }
        }
        
        #endregion

        #region Method

        private void ExecuteRestart(int time)
        {
            if (!RestartConfig.Restart)
            {
                DestroyGUI();
                ResetConfig();
                return;
            }

            if (RestartConfig.First)
            {
                RestartConfig.Time = time;
                RestartConfig.First = false;
            }

            if (RestartConfig.Time == 0)
            {
                ConVar.Global.quit(null);
                return;
            }
            
            CuiElementContainer container = new CuiElementContainer
            {
                {
                    new CuiPanel
                    {
                        Image = { Color = HexToRustFormat("#00000070") },
                        RectTransform = { AnchorMin = "0 0.7694442", AnchorMax = "1 0.8249997" }
                    }, "Hud", Layer
                },
                new CuiElement
                {
                    Parent = Layer,
                    Components =
                    {
                        new CuiTextComponent{ Align = TextAnchor.MiddleCenter, Color = "1 1 1 1", FontSize = 20, Text = string.Format(config.RestartTimerText, $"{RestartConfig.Time}")},
                        new CuiOutlineComponent { Color = "0 0 0 1", Distance = "0.7 0.7" },
                        new CuiRectTransformComponent{ AnchorMin = "0 0", AnchorMax = "1 1" }
                    }
                }
            };
            
            DestroyGUI();
            DrawGUI(container);
            
			foreach (var player in BasePlayer.activePlayerList)
                EffectNetwork.Send(new Effect(config.Effect, player, 0, Vector3.zero, Vector3.forward), player.net.connection);

            RestartConfig.Time--;
            
            timer.Once(1f, () => { ExecuteRestart(RestartConfig.Time);});
        }

        private void ResetConfig()
        {
            RestartConfig.Time = 0;
            RestartConfig.Restart = false;
            RestartConfig.First = true;
        }
        
        private void DrawGUI(CuiElementContainer container)
        { 
            foreach (var x in BasePlayer.activePlayerList)
                CuiHelper.AddUi(x, container);
        }
        private void DestroyGUI()
        {
            foreach (var x in BasePlayer.activePlayerList)
                CuiHelper.DestroyUi(x, Layer);
        }
        #endregion

        #region HEX

        private string HexToRustFormat(string hex)
        {
            if (string.IsNullOrEmpty(hex))
            {
                hex = "#FFFFFFFF";
            }

            var str = hex.Trim('#');

            if (str.Length == 6)
                str += "FF";

            if (str.Length != 8)
            {
                throw new Exception(hex);
                throw new InvalidOperationException("Cannot convert a wrong format.");
            }

            var r = byte.Parse(str.Substring(0, 2), NumberStyles.HexNumber);
            var g = byte.Parse(str.Substring(2, 2), NumberStyles.HexNumber);
            var b = byte.Parse(str.Substring(4, 2), NumberStyles.HexNumber);
            var a = byte.Parse(str.Substring(6, 2), NumberStyles.HexNumber);

            Color color = new Color32(r, g, b, a);

            return $"{color.r:F2} {color.g:F2} {color.b:F2} {color.a:F2}";
        }

        #endregion
    }
}

Автор
15FPS
Скачиваний
0
Просмотры
1
Первый выпуск
Обновление
Оценка
0.00 звёзд 0 оценок

Другие ресурсы пользователя 15FPS

Сверху