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

FREE RockEvent : 1.0.2 1.0.2

Нет прав для скачивания
C#:
// Все права принадлежат дискорд сообществу https://discord.gg/VgNHPpNrz6
using System;
using Oxide.Core.Plugins;
using Oxide.Game.Rust.Cui;
using System.Collections.Generic;
using Newtonsoft.Json;
using UnityEngine;
using System.Linq;
using Oxide.Core.Libraries.Covalence;
namespace Oxide.Plugins {
    [Info("RockEvent", "cheese", "1.0.2")]
    public class RockEvent : RustPlugin {
        [PluginReference]
        private Plugin ComponentsEvent;
        Timer timers;
        bool EventHasStart = false;
        string WorkLayer = "RockEvent.Main";
        DateTime canceldate;
        int count;
        int allcount;
        private List<BaseEntity> SpawnedStones = new List<BaseEntity>();
        private HashSet<Tuple<Vector3, Quaternion>> _spawnData = new HashSet<Tuple<Vector3, Quaternion>>();
        private const int ScanHeight = 100;
        private static int GetBlockMask => LayerMask.GetMask("Construction", "Prevent Building", "Water");
        private static bool MaskIsBlocked(int mask) => GetBlockMask == (GetBlockMask | (1 << mask));
        private Dictionary<MonumentInfo, float> monuments {
            get;
            set;
        }
        = new Dictionary<MonumentInfo, float>();
#region config
        private PluginConfig cfg;
        public class PluginConfig {
            [JsonProperty("Основные настройки")]
            public Settings MainSettings = new Settings();
            [JsonProperty("Настройки выигрышей")]
            public AccesSets AccesSettings = new AccesSets();
            [JsonProperty("Дополнительные настройки")]
            public AdditionalSettings AddSettings = new AdditionalSettings();
            public class Settings {
                [JsonProperty("Включить автоматичесский старт ивента?")]
                public bool AutoStartEvent = true;
                [JsonProperty("Включить ли минимальное количество игроков для старта ивента?")]
                public bool MinPlayers = true;
                [JsonProperty("Минимальное количество игроков для старта ивента")]
                public int MinPlayersCount = 5;
                [JsonProperty("Время для начала ивента после старта сервера, перезагрузки плагина (первый раз)")]
                public float FirstStartTime = 300f;
                [JsonProperty("Время для начала ивента в последующие разы (второй, третий и тд)")]
                public float RepeatTime = 86400f;
                [JsonProperty("Время до конца ивента (в минутах)")]
                public double EventDuration = 60.0;
            }
            public class AccesSets {
                [JsonProperty("Название пермишна для использования команды /rockevent (с приставкой RockEvent)")]
                public string StartPermission = "RockEvent.Use";
            }
            public class AdditionalSettings {
                [JsonProperty("Цвет выделения текста в интерфейсе")]
                public string Color = "#CF1E1E";
            }
        }
        private void Init() {
            cfg = Config.ReadObject<PluginConfig>();
            Config.WriteObject(cfg);
        }
        protected override void LoadDefaultConfig() {
            Config.WriteObject(new PluginConfig(), true);
        }
#endregion
#region Hooks
        void Unload() {
            StopEvent();
            InvokeHandler.Instance.CancelInvoke(StartEvent);
            foreach (var player in BasePlayer.activePlayerList) CuiHelper.DestroyUi(player, WorkLayer);
        }
        [PluginReference]
        private Plugin ImageLibrary;
        private void OnServerInitialized() {
            permission.RegisterPermission(cfg.AccesSettings.StartPermission, this);
            if (cfg.MainSettings.AutoStartEvent) InvokeHandler.Instance.InvokeRepeating(StartEvent, cfg.MainSettings.FirstStartTime, cfg.MainSettings.RepeatTime);
            foreach (var player in BasePlayer.activePlayerList) OnPlayerConnected(player);
            _spawnData.Clear();
            SpawnedStones.Clear();
            GeneratePositions();
            ImageLibrary?.Call("AddImage", "https://imgur.com/p32BmxD.png", "rockss");
            AddCovalenceCommand("openInforock", nameof(CmdMenuOpen1rock));
            AddCovalenceCommand("closeInforock", nameof(CmdMenuClose1rock));
        }
        private void OnPlayerConnected(BasePlayer player) {
            if (player.IsNpc) return;
            if (player.IsReceivingSnapshot) {
                NextTick(() => OnPlayerConnected(player));
                return;
            }
            if (EventHasStart) {
                MainGUIrock(player);
            }
        }
        void OnEntityDeath(BaseEntity entity, HitInfo info) {
            if (SpawnedStones.Contains(entity)) {
                allcount -= 1;
                SpawnedStones.Remove(entity);
            }
        }
#endregion
#region API
        [HookMethod("RockEventIsStart")]
        public object RockEventIsStart() {
            if (EventHasStart) return "";
            else return null;
        }
        bool ComponentsEventIsStart() {
            var result = ComponentsEvent?.Call("ComponentsEventIsStart");
            if (result != null) return true;
            else return false;
        }
#endregion
#region Methods
        void StartEvent() {
            if (EventHasStart == true) return;
            if (ComponentsEventIsStart() == true) {
                Puts("Невозможно начать ивент так как в данный момент запущен ивент \"Фарм компонентов\"");
                EventLog("Невозможно начать ивент так как в данный момент запущен ивент \"Фарм компонентов\"");
                return;
            }
            EventHasStart = true;
            if (cfg.MainSettings.MinPlayers == true) {
                if (BasePlayer.activePlayerList.Count < cfg.MainSettings.MinPlayersCount) {
                    EventLog("Недостаточно игроков для старта ивента");
                    Puts("Недостаточно игроков для старта ивента");
                    return;
                }
            }
            canceldate = DateTime.Now.AddMinutes(cfg.MainSettings.EventDuration);
            foreach (var player in BasePlayer.activePlayerList) {
                player.ChatMessage("Начался ивент <color=#a0c4a6>Двойной фарм</color>");
                //player.ChatMessage(Messages["StartEvent"]);
                MainGUIrock(player);
                linesrock(player);
            }
            timers = timer.Every(1f, ()=> {
                foreach (var player in BasePlayer.activePlayerList) {
                    if (openPanelrock.ContainsKey(player)) {
                        if (openPanelrock.ContainsValue(true)) {
                            float rocktime = TimeRockEvent();
                            timerUIrock(player, TimeSpan.FromSeconds(rocktime));
                        }
                    }
                    linesrock(player);
                }
            }
            );
            EventLog("Ивент успешно начался!");
            Puts("Ивент успешно начался!");
            InvokeHandler.Instance.InvokeRepeating(SpawnStone, 1f, 900f);
            InvokeHandler.Instance.InvokeRepeating(StopEventRepeat, 0, 1f);
        }
        void StopEventRepeat() {
            int time = TimeRockEvent();
            if(time < 0) StopEvent();
        }
        void StopEvent() {
            if (EventHasStart == false) return;
            EventHasStart = false;
            InvokeHandler.Instance.CancelInvoke(SpawnStone);
            EventLog("Ивент \"Двойные камни\" остановлен или закончился!");
            Puts("Ивент \"Двойные камни\" остановлен или закончился!");
            foreach (var player in BasePlayer.activePlayerList) {
                CuiHelper.DestroyUi(player, WorkLayer);
                player.ChatMessage("Закончился ивент <color=#a0c4a6>Двойной фарм</color>");
                CuiHelper.DestroyUi(player, "MainGUIrock");
                timers.Destroy();
                openPanelrock[player] = false;
            }
            Puts($"Удалено: {allcount} камней");
            foreach (var entity in SpawnedStones) if (!entity.IsDestroyed) entity.AdminKill();
            _spawnData.Clear();
            SpawnedStones.Clear();
            count = 0;
            allcount = 0;
        }
        private void GeneratePositions() {
            _spawnData.Clear();
            var generationSuccess = 0;
            var islandSize = ConVar.Server.worldsize / 2;
            for (var i = 0; i < 500 * 6; i++) {
                if (generationSuccess >= 500 * 2) {
                    break;
                }
                var x = Core.Random.Range(-islandSize, islandSize);
                var z = Core.Random.Range(-islandSize, islandSize);
                var original = new Vector3(x, ScanHeight, z);
                while (IsMonumentPosition(original) || IsOnRoad(original)) {
                    x = Core.Random.Range(-islandSize, islandSize);
                    z = Core.Random.Range(-islandSize, islandSize);
                    original = new Vector3(x, ScanHeight, z);
                }
                var data = GetClosestValidPosition(original);
                if (data.Item1 != Vector3.zero) {
                    _spawnData.Add(data);
                    generationSuccess++;
                }
            }
        }
        private bool IsMonumentPosition(Vector3 target) {
            foreach (var monument in monuments) {
                if (InRange(monument.Key.transform.position, target, monument.Value)) {
                    return true;
                }
            }
            return false;
        }
        private void SetupMonuments() {
            foreach (var monument in TerrainMeta.Path?.Monuments?.ToArray() ?? UnityEngine.Object.FindObjectsOfType<MonumentInfo>()) {
                if (string.IsNullOrEmpty(monument.displayPhrase.translated)) {
                    float size = monument.name.Contains("power_sub") ? 35f : Mathf.Max(monument.Bounds.size.Max(), 75f);
                    monuments[monument] = monument.name.Contains("cave") ? 75f : monument.name.Contains("OilrigAI") ? 150f : size;
                }
                else {
                    monuments[monument] = GetMonumentFloat(monument.displayPhrase.translated.TrimEnd());
                }
            }
        }
        private float GetMonumentFloat(string monumentName) {
            switch (monumentName) {
                case "Abandoned Cabins" : return 54f;
                case "Abandoned Supermarket" : return 50f;
                case "Airfield" : return 200f;
                case "Bandit Camp" : return 125f;
                case "Giant Excavator Pit" : return 225f;
                case "Harbor" : return 150f;
                case "HQM Quarry" : return 37.5f;
                case "Large Oil Rig" : return 200f;
                case "Launch Site" : return 300f;
                case "Lighthouse" : return 48f;
                case "Military Tunnel" : return 100f;
                case "Mining Outpost" : return 45f;
                case "Oil Rig" : return 100f;
                case "Outpost" : return 250f;
                case "Oxum's Gas Station" : return 65f;
                case "Power Plant" : return 140f;
                case "Satellite Dish" : return 90f;
                case "Sewer Branch" : return 100f;
                case "Stone Quarry" : return 27.5f;
                case "Sulfur Quarry" : return 27.5f;
                case "The Dome" : return 70f;
                case "Train Yard" : return 150f;
                case "Water Treatment Plant" : return 185f;
                case "Water Well" : return 24f;
                case "Wild Swamp" : return 24f;
            }
            return 300f;
        }
        private static bool InRange(Vector3 a, Vector3 b, float distance, bool ex = true) {
            if (!ex) {
                return (a - b).sqrMagnitude <= distance * distance;
            }
            return (new Vector3(a.x, 0f, a.z) - new Vector3(b.x, 0f, b.z)).sqrMagnitude <= distance * distance;
        }
        private Tuple<Vector3, Quaternion> GetClosestValidPosition(Vector3 original) {
            var target = original - new Vector3(0, 200, 0);
            RaycastHit hitInfo;
            if (Physics.Linecast(original, target, out hitInfo) == false) {
                return new Tuple<Vector3, Quaternion>(Vector3.zero, Quaternion.identity);
            }
            var position = hitInfo.point;
            var collider = hitInfo.collider;
            var colliderLayer = 4;
            if (collider != null && collider.gameObject != null) {
                colliderLayer = collider.gameObject.layer;
            }
            if (collider == null) {
                return new Tuple<Vector3, Quaternion>(Vector3.zero, Quaternion.identity);
            }
            if (MaskIsBlocked(colliderLayer) || colliderLayer != 23) {
                return new Tuple<Vector3, Quaternion>(Vector3.zero, Quaternion.identity);
            }
            if (IsValidPosition(position) == false) {
                return new Tuple<Vector3, Quaternion>(Vector3.zero, Quaternion.identity);
            }
            var rotation = Quaternion.FromToRotation(Vector3.up, hitInfo.normal) * Quaternion.Euler(Vector3.zero);
            return new Tuple<Vector3, Quaternion>(position, rotation);
        }
        private bool IsValidPosition(Vector3 position) {
            var entities = new List<BuildingBlock>();
            Vis.Entities(position, 25, entities);
            return entities.Count == 0;
        }
        bool IsOnRoad(Vector3 target) {
            RaycastHit hitInfo;
            if (!Physics.Raycast(target, Vector3.down, out hitInfo, 66f, LayerMask.GetMask("Terrain", "World", "Construction", "Water"), QueryTriggerInteraction.Ignore) || hitInfo.collider == null) return false;
            if (hitInfo.collider.name.ToLower().Contains("road")) return true;
            return false;
        }
        string RandomStonePrefab() {
            var number = Oxide.Core.Random.Range(1, 3);
            if (number == 1) return "assets/bundled/prefabs/autospawn/resource/ores/stone-ore.prefab";
            if (number == 2) return "assets/bundled/prefabs/autospawn/resource/ores/metal-ore.prefab";
            if (number == 3) return "assets/bundled/prefabs/autospawn/resource/ores/sulfur-ore.prefab";
            return "assets/bundled/prefabs/autospawn/resource/ores/stone-ore.prefab";
        }
        void SpawnStone() {
            GenerateStones();
            timer.Once(2f, () => {
                Puts($"Сгенерировано: {count} камней, всего за ивент: {allcount}");
                count = 0;
            }
            );
        }
        private int GenerateStones() {
            var counter = 0;
            var neededCount = 1000;
            for (var i = 0; i < neededCount; i++) {
                var spawnData = GetValidSpawnData();
                if (spawnData.Item1 == Vector3.zero) {
                    GeneratePositions();
                }
                spawnData = GetValidSpawnData();
                var stone = GameManager.server.CreateEntity(RandomStonePrefab(), spawnData.Item1, spawnData.Item2);
                stone.Spawn();
                Vector3 pos = new Vector3(2, 0, 0);
                var stone2 = GameManager.server.CreateEntity(RandomStonePrefab(), stone.GetNetworkPosition() + pos, stone.GetNetworkRotation());
                stone2.Spawn();
                SpawnedStones.Add(stone);
                SpawnedStones.Add(stone2);
                count++;
                allcount++;
                count++;
                allcount++;
            }
            return counter;
        }
        private Tuple<Vector3, Quaternion> GetValidSpawnData() {
            if (!_spawnData.Any()) {
                return new Tuple<Vector3, Quaternion>(Vector3.zero, Quaternion.identity);
            }
            for (var i = 0; i < 25; i++) {
                var number = Core.Random.Range(0, _spawnData.Count);
                var spawnData = _spawnData.ElementAt(number);
                _spawnData.Remove(spawnData);
                if (IsValidPosition(spawnData.Item1)) return spawnData;
            }
            return new Tuple<Vector3, Quaternion>(Vector3.zero, Quaternion.identity);
        }
#endregion
#region Commands [Команды]
        [ConsoleCommand("rockevent.start")]
        private void ConsoleForcedEventStart(ConsoleSystem.Arg args) {
            if (!args.IsAdmin || args.IsClientside) return;
            if (EventHasStart == true) return;
            Puts("Принудительный старт ивента \"Двойные камни\"");
            EventLog("CONSOLE запустил принудительный старт ивента \"Двойные камни\"");
            StartEvent();
        }
        [ConsoleCommand("rockevent.stop")]
        private void ConsoleForcedEventStop(ConsoleSystem.Arg args) {
            if (!args.IsAdmin || args.IsClientside) return;
            if (EventHasStart == false) return;
            Puts("Принудительная остановка ивента \"Двойные камни\"");
            EventLog("CONSOLE принудительно остановил ивент \"Двойные камни\"");
            StopEvent();
        }
        [ConsoleCommand("rockevent.ui.close")]
        void ConsoleUIClose(ConsoleSystem.Arg args) {
            var player = args.Player();
            if (player == null) return;
            if (EventHasStart == false) return;
            CuiHelper.DestroyUi(player, "text");
            CuiHelper.DestroyUi(player, "button");
            CuiHelper.DestroyUi(player, "helptext");
            var container = new CuiElementContainer();
            container.Add(new CuiElement {
                FadeOut = 0.1f, Parent = WorkLayer, Name = "text", Components = {
                    new CuiTextComponent {
                        Text = ">", Align = TextAnchor.UpperLeft, FontSize = 12, Font = "RobotoCondensed-regular.ttf"
                    }
                    , new CuiRectTransformComponent {
                        AnchorMin = "0.478572 0.5733339", AnchorMax = "0.5404768 0.9200007"
                    }
                    , new CuiOutlineComponent {
                        Color = "0 0 0 0.25", Distance = "0.5 0.5"
                    }
                }
            }
            );
            container.Add(new CuiButton {
                RectTransform = {
                    AnchorMin = "0 0", AnchorMax = "1 1"
                }
                , Button = {
                    Command = "rockevent.ui.open", Color = "0 0 0 0"
                }
                , Text = {
                    Text = ""
                }
            }
            , "text", "button");
            CuiHelper.AddUi(player, container);
        }
        [ConsoleCommand("rockevent.ui.open")]
        void ConsoleUIOpen(ConsoleSystem.Arg args) {
            var player = args.Player();
            if (player == null) return;
            if (EventHasStart == false) return;
            CuiHelper.DestroyUi(player, "text");
            CuiHelper.DestroyUi(player, "button");
            var container = new CuiElementContainer();
            container.Add(new CuiElement {
                Parent = WorkLayer, Name = "helptext", Components = {
                    new CuiTextComponent {
                        Text = $"На карте спавнятся двойные камни, собирайте их пока есть время!", Align = TextAnchor.UpperLeft, FontSize = 12, Font = "RobotoCondensed-regular.ttf"
                    }
                    , new CuiRectTransformComponent {
                        AnchorMin = "0.02380949 0", AnchorMax = "1 0.5866665"
                    }
                    , new CuiOutlineComponent {
                        Color = "0 0 0 0.25", Distance = "0.5 0.5"
                    }
                }
            }
            );
            container.Add(new CuiElement {
                FadeOut = 0.1f, Parent = WorkLayer, Name = "text", Components = {
                    new CuiTextComponent {
                        Text = "x", Align = TextAnchor.UpperLeft, FontSize = 12, Font = "RobotoCondensed-regular.ttf"
                    }
                    , new CuiRectTransformComponent {
                        AnchorMin = "0.478572 0.5733339", AnchorMax = "0.5404768 0.9200007"
                    }
                    , new CuiOutlineComponent {
                        Color = "0 0 0 0.25", Distance = "0.5 0.5"
                    }
                }
            }
            );
            container.Add(new CuiButton {
                RectTransform = {
                    AnchorMin = "0 0", AnchorMax = "1 1"
                }
                , Button = {
                    Command = "rockevent.ui.close", Color = "0 0 0 0"
                }
                , Text = {
                    Text = ""
                }
            }
            , "text", "button");
            CuiHelper.AddUi(player, container);
        }
        [ChatCommand("rockevent")]
        void ChatForcedEventHandler(BasePlayer player, string command, string[] args) {
            if (player == null) return;
            if (!permission.UserHasPermission(player.UserIDString, cfg.AccesSettings.StartPermission)) return;
            if (args.Length < 1) {
                player.ChatMessage(" <color=#CF1E1E>/rockevent start</color> - запустить ивент Двойные камни\n <color=#CF1E1E>/rockevent stop</color> - остановить ивент Двойные камни\n <color=#CF1E1E>/rockevent tp</color> - телепортироваться к рандомному камню");
                return;
            }
            if (args[0] == "start") {
                if (EventHasStart == true) {
                    player.ChatMessage(" Ивент <color=#CF1E1E>Двойные камни</color> уже запущен");
                    return;
                }
                player.ChatMessage(" Вы успешно запустили ивент <color=#CF1E1E>Двойные камни</color>");
                Puts($"{player.displayName}/{player.userID} запустил принудительный старт ивента \"Двойные камни\"");
                EventLog($"{player.displayName}/{player.userID} запустил принудительный старт ивента \"Двойные камни\"");
                StartEvent();
            }
            if (args[0] == "stop") {
                if (EventHasStart == false) {
                    player.ChatMessage(" Ивент <color=#CF1E1E>Двойные камни</color> не был запущен");
                    return;
                }
                player.ChatMessage(" Вы успешно остановили ивент <color=#CF1E1E>Двойные камни</color>");
                Puts($"{player.displayName}/{player.userID} запустил принудительную остановку ивента \"Двойные камни\"");
                EventLog($"{player.displayName}/{player.userID} запустил принудительную остановку ивента \"Двойные камни\"");
                StopEvent();
            }
            if (args[0] == "tp") {
                if (EventHasStart == false) {
                    player.ChatMessage(" Ивент <color=#CF1E1E>Двойные камни</color> не был запущен");
                    return;
                }
                foreach (var entity in SpawnedStones) {
                    if (entity == null || entity.IsDestroyed) return;
                    player.Teleport(entity.transform.position);
                }
            }
        }
#endregion
#region Helpers
        void EventLog(string text) {
            LogToFile("Events", text, this, true);
        }
#endregion
#region GUI
        public Dictionary<BasePlayer, bool> openPanelrock = new Dictionary<BasePlayer, bool>();
        public void MainGUIrock(BasePlayer player) {
            var c = new CuiElementContainer();
            UI.AddImage(ref c, "Overlay", "MainGUIrock", "0 0 0 0", "", "", "1 0.5", "1 0.5", $"-44.182 -77.661", $"-3.618 -48.735");
            UI.AddImage(ref c, "MainGUIrock", "mainrock", "0.5 0.5 0.5 0.25", "", "assets/icons/greyout.mat", "0.5 0.5", "0.5 0.5", "-20.282 -41.715", "20.283 -2.035");
            UI.AddRawImage(ref c, "mainrock", "rock.icons", ImageLibrary?.Call<string>("GetImage", "rockss"), "1 1 1 0.9", "", "", "0 0", "1 1", "6 7", "-7 -6");
            UI.AddImage(ref c, "MainGUIrock", "linesrock", "0 0 0 0", "", "assets/icons/greyout.mat", "0.5 0.5", "0.5 0.5", "-20.282 -41.715", "20.283 -39.185");
            UI.AddButton(ref c, "mainrock", "openrock", "openInforock", "", "0 0 0 0", "", "", "0 0", "1 1", "", "");
            CuiHelper.DestroyUi(player, "MainGUIrock");
            CuiHelper.AddUi(player, c);
        }
        public void InfoMenurock(BasePlayer player) {
            var c = new CuiElementContainer();
            UI.AddImage(ref c, "MainGUIrock", "inforock", "0.5 0.5 0.5 0.25", "", "assets/icons/greyout.mat", "0.5 0.5", "0.5 0.5", "-223.521 -41.715", "-24.017 -2.035");
            UI.AddText(ref c, "inforock", "textrock", "1 1 1 0.9", $"По карте больше камней \nДобывайте больше ресурсов!", TextAnchor.UpperLeft, 10, "0.5 0.5", "0.5 0.5", "-94.187 -20", "91.911 6.411");
            UI.AddButton(ref c, "inforock", "closerock", "closeInforock", "", "0.70 0.00 0.00 0.8", "", "assets/icons/greyout.mat", "0.5 0.5", "0.5 0.5", "85.23 5.691", "99.752 19.875");
            UI.AddText(ref c, "closerock", "closesrock", "1 1 1 0.9", $"☓", TextAnchor.MiddleCenter, 10, "0.5 0.5", "0.5 0.5", "-6.737 -6.201", "6.737 6.202");
            CuiHelper.DestroyUi(player, "inforock");
            CuiHelper.AddUi(player, c);
        }
        public void timerUIrock(BasePlayer player, TimeSpan time) {
            var c = new CuiElementContainer();
            if(time.Seconds < 10) {
                UI.AddText(ref c, "inforock", "rock", "1 1 1 0.9", $"До конца двойного фарма [{time.Minutes}:0{time.Seconds}]", TextAnchor.UpperLeft, 12, "0.5 0.5", "0.5 0.5", "-94.187 -4.775", "85.183 19.875");
            }
            else {
                UI.AddText(ref c, "inforock", "rock", "1 1 1 0.9", $"До конца двойного фарма [{time.Minutes}:{time.Seconds}]", TextAnchor.UpperLeft, 12, "0.5 0.5", "0.5 0.5", "-94.187 -4.775", "85.183 19.875");
            }
            CuiHelper.DestroyUi(player, "rock");
            CuiHelper.AddUi(player, c);
        }
        public void linesrock(BasePlayer player) {
            var c = new CuiElementContainer();
            CuiHelper.DestroyUi(player, "linerock");
            double timeLines = ((double)TimeRockEvent() / (cfg.MainSettings.EventDuration * 60));
            UI.AddImage(ref c, "linesrock", "linerock", "1 1 1 1", "", "assets/icons/greyout.mat", "0 0", $"{timeLines} 1", "", "");
            CuiHelper.AddUi(player, c);
        }
#endregion
#region Hooks
        private void CmdMenuOpen1rock(IPlayer user, string cmd, string[] args) {
            var player = user?.Object as BasePlayer;
            if (player == null) return;
            consoleOpenrock(player);
            openPanelrock[player] = true;
        }
        private void CmdMenuClose1rock(IPlayer user, string cmd, string[] args) {
            var player = user?.Object as BasePlayer;
            if (player == null) return;
            CuiHelper.DestroyUi(player, "inforock");
            openPanelrock[player] = false;
        }
        public void consoleOpenrock(BasePlayer player) {
            float rocktime = TimeRockEvent();
            InfoMenurock(player);
            timerUIrock(player, TimeSpan.FromSeconds(rocktime));
        }
#endregion
#region Support
        private int TimeRockEvent() {
            TimeSpan timetocancel = DateTime.Now - canceldate;
            var pp = (int)timetocancel.TotalSeconds * -1;
            return pp;
        }
        private static string FormatTime(TimeSpan time) {
            return ($"{FormatMinutes(time.Minutes)}:{FormatSeconds(time.Seconds)}");
        }
        private static string FormatMinutes(int minutes) => FormatUnits2(minutes);
        private static string FormatSeconds(int seconds) => FormatUnits(seconds);
        private static string FormatUnits2(int units) {
            var tmp = units % 10;
            if (units >= 10) return $"{units}";
            if (units >= 0 && units <= 10) return $"{units}";
            return $"{units}";
        }
        private static string FormatUnits(int units) {
            var tmp = units % 10;
            if (units >= 10) return $"{units}";
            if (units >= 0 && units <= 10) return $"0{units}";
            return $"0{units}";
        }
        public static class UI {
            public static void AddImage(ref CuiElementContainer container, string parrent, string name, string color, string sprite, string mat, string aMin, string aMax, string oMin, string oMax, string outline = "", string dist = "") {
                if (string.IsNullOrEmpty(sprite) && !string.IsNullOrEmpty(mat)) container.Add(new CuiElement() {
                    Parent = parrent, Name = name, Components = {
                        new CuiImageComponent {
                            Color = color, Material = "assets/icons/greyout.mat"
                        }
                        , new CuiRectTransformComponent {
                            AnchorMin = aMin, AnchorMax = aMax, OffsetMin = oMin, OffsetMax = oMax
                        }
                    }
                }
                );
                if (string.IsNullOrEmpty(sprite) && string.IsNullOrEmpty(mat)) container.Add(new CuiElement() {
                    Parent = parrent, Name = name, Components = {
                        new CuiImageComponent {
                            Color = color
                        }
                        , new CuiRectTransformComponent {
                            AnchorMin = aMin, AnchorMax = aMax, OffsetMin = oMin, OffsetMax = oMax
                        }
                    }
                }
                );
            }
            public static void AddRawImage(ref CuiElementContainer container, string parrent, string name, string png, string color, string sprite, string mat, string aMin, string aMax, string oMin, string oMax) {
                if (string.IsNullOrEmpty(sprite) && string.IsNullOrEmpty(mat)) container.Add(new CuiElement() {
                    Parent = parrent, Name = name, Components = {
                        new CuiRawImageComponent {
                            Color = color, Png = png
                        }
                        , new CuiOutlineComponent {
                            Color = "0 0 0 0", Distance = "0 0"
                        }
                        , new CuiRectTransformComponent {
                            AnchorMin = aMin, AnchorMax = aMax, OffsetMin = oMin, OffsetMax = oMax
                        }
                    }
                }
                );
            }
            public static void AddText(ref CuiElementContainer container, string parrent, string name, string color, string text, TextAnchor align, int size, string aMin, string aMax, string oMin, string oMax, string outColor = "0 0 0 0", string font = "robotocondensed-bold.ttf", string dist = "0.5 0.5", float FadeIN = 0f, float FadeOut = 0f) {
                container.Add(new CuiElement() {
                    Parent = parrent, Name = name, FadeOut = FadeOut, Components = {
                        new CuiTextComponent {
                            Color = color, Text = text, Align = align, FontSize = size, Font = font, FadeIn = FadeIN
                        }
                        , new CuiOutlineComponent {
                            Color = outColor, Distance = dist
                        }
                        , new CuiRectTransformComponent {
                            AnchorMin = aMin, AnchorMax = aMax, OffsetMin = oMin, OffsetMax = oMax
                        }
                    }
                }
                );
            }
            public static void AddButton(ref CuiElementContainer container, string parrent, string name, string cmd, string close, string color, string sprite, string mat, string aMin, string aMax, string oMin, string oMax, string outline = "", string dist = "") {
                if (!string.IsNullOrEmpty(sprite) && !string.IsNullOrEmpty(mat)) container.Add(new CuiElement() {
                    Parent = parrent, Name = name, Components = {
                        new CuiButtonComponent {
                            Command = cmd, Color = color, Close = close, Sprite = sprite, Material = "assets/icons/greyout.mat",
                        }
                        , new CuiRectTransformComponent {
                            AnchorMin = aMin, AnchorMax = aMax, OffsetMin = oMin, OffsetMax = oMax
                        }
                    }
                }
                );
                if (!string.IsNullOrEmpty(sprite) && !string.IsNullOrEmpty(mat) && !string.IsNullOrEmpty(outline)) container.Add(new CuiElement() {
                    Parent = parrent, Name = name, Components = {
                        new CuiButtonComponent {
                            Command = cmd, Color = color, Close = close, Sprite = sprite, Material = "assets/icons/greyout.mat",
                        }
                        , new CuiOutlineComponent {
                            Color = outline, Distance = dist
                        }
                        , new CuiRectTransformComponent {
                            AnchorMin = aMin, AnchorMax = aMax, OffsetMin = oMin, OffsetMax = oMax
                        }
                    }
                }
                );
                if (string.IsNullOrEmpty(sprite) && !string.IsNullOrEmpty(mat)) container.Add(new CuiElement() {
                    Parent = parrent, Name = name, Components = {
                        new CuiButtonComponent {
                            Command = cmd, Color = color, Close = close, Material = "assets/icons/greyout.mat",
                        }
                        , new CuiRectTransformComponent {
                            AnchorMin = aMin, AnchorMax = aMax, OffsetMin = oMin, OffsetMax = oMax
                        }
                    }
                }
                );
                if (!string.IsNullOrEmpty(sprite) && string.IsNullOrEmpty(mat)) container.Add(new CuiElement() {
                    Parent = parrent, Name = name, Components = {
                        new CuiButtonComponent {
                            Command = cmd, Color = color, Close = close, Sprite = sprite
                        }
                        , new CuiRectTransformComponent {
                            AnchorMin = aMin, AnchorMax = aMax, OffsetMin = oMin, OffsetMax = oMax
                        }
                    }
                }
                );
                if (string.IsNullOrEmpty(sprite) && string.IsNullOrEmpty(mat)) container.Add(new CuiElement() {
                    Parent = parrent, Name = name, Components = {
                        new CuiButtonComponent {
                            Command = cmd, Color = color, Close = close,
                        }
                        , new CuiRectTransformComponent {
                            AnchorMin = aMin, AnchorMax = aMax, OffsetMin = oMin, OffsetMax = oMax
                        }
                    }
                }
                );
            }
        }
#endregion
    }
}

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