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

FREE Tournament : 1.0.0 1.0.0

Нет прав для скачивания
C#:
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using Newtonsoft.Json;
using Oxide.Core;
using Oxide.Core.Plugins;
using Oxide.Game.Rust.Cui;
using UnityEngine;
namespace Oxide.Plugins {
    [Info("Tournament", "Xavier", "1.0.0")]
    public class Tournament : RustPlugin {
        [PluginReference]
        private Plugin Clans;
        public class CupSettings {
            public ulong ownerclan;
            public bool isremove;
            public uint build;
            // МАРКЕР
            public VendingMachineMapMarker Marker;
        }
        public List<CupSettings> ClanData = new List<CupSettings>();
        void AddMarker(CupSettings settings) {
            string name = Clans?.Call("ClanAlready", settings.ownerclan) as string;
            var vendingMarker = GameManager.server.CreateEntity("assets/prefabs/deployable/vendingmachine/vending_mapmarker.prefab", (Vector3) BaseNetworkable.serverEntities.Find(settings.build)?.transform.position).GetComponent<VendingMachineMapMarker>();
            vendingMarker.markerShopName = name;
            vendingMarker.Spawn();
            vendingMarker.enabled = false;
            settings.Marker = vendingMarker;
            WriteData();
        }
        void RemoveMarker(CupSettings settings) {
            // ReSharper disable once Unity.NoNullPropagation
            settings.Marker?.Kill();
        }
        void OnServerInitialized() {
            ReadData();
            if (ClanData.Count > 0) {
                foreach (var cup in ClanData) {
                    var entity = BaseNetworkable.serverEntities.Find(cup.build);
                    if (entity == null && cup.isremove == false) {
                        cup.isremove = true;
                    }
                    if (entity != null && cup.isremove == false) {
                        //AddMarker(cup);
                    }
                }
            }
            time += TimeSpan.FromSeconds(config.times);
            timer.Every(1f, () => {
                time -= TimeSpan.FromSeconds(1);
            }
            );
            if (!Oxide.Core.Interface.Oxide.DataFileSystem.ExistsDatafile("Tournament/Data")) Oxide.Core.Interface.Oxide.DataFileSystem.WriteObject("Tournament/Data", ClanData);
        }
        void OnServerSave() {
            WriteData();
        }
#region Configuration
        private Configur config;
        private class Configur {
            [JsonProperty("Изначальное время в секундах")]
            public int times = 600;
            public static Configur GetNewConfiguration() {
                return new Configur {
                }
                ;
            }
        }
        protected override void LoadDefaultConfig() {
            config = Configur.GetNewConfiguration();
            PrintWarning("Создание начальной конфигурации плагина!!!");
        }
        protected override void LoadConfig() {
            base.LoadConfig();
            config = Config.ReadObject<Configur>();
        }
        protected override void SaveConfig() {
            Config.WriteObject(config);
        }
#endregion
        void ReadData() => ClanData = Oxide.Core.Interface.Oxide.DataFileSystem.ReadObject<List<CupSettings>>("Tournament/Data");
        void WriteData() => Oxide.Core.Interface.Oxide.DataFileSystem.WriteObject("Tournament/Data", ClanData);
        TimeSpan time = TimeSpan.FromSeconds(0);
        public static string FormatShortTime(TimeSpan time) {
            string result = string.Empty;
            result += $"{time.Hours.ToString("00")}:";
            result += $"{time.Minutes.ToString("00")}:";
            result += $"{time.Seconds.ToString("00")}";
            return result;
        }
        [ConsoleCommand("tournament")]
        void testcm(ConsoleSystem.Arg arg) {
            if(arg == null) return;
            if(arg.Player() != null && arg.Player().IsAdmin == false) return;
            var player = arg.Player();
            switch(arg.Args[0]) {
                case "time" : {
                    if(arg.Player() == null) Puts($"{FormatShortTime(time)}");
                    else player.ConsoleMessage($"<color=green><size=20>{time} до начала</size></color>");
                    break;
                }
                case "addtime" : {
                    var tim = int.Parse(arg.Args[1]);
                    time += TimeSpan.FromSeconds(tim);
                    if(arg.Player() == null) Puts($"{tim} сек.добавлено");
                    else player.ConsoleMessage($"<color=green><size=20>{tim} сек.добавленоn\n{time} до начала</size></color>");
                    break;
                }
                case "removetime" : {
                    var tim = int.Parse(arg.Args[1]);
                    time -= TimeSpan.FromSeconds(tim);
                    if(arg.Player() == null) Puts($"{tim} сек.убавлено");
                    else player.ConsoleMessage($"<color=green><size=20>{tim} сек.убавлено\n{time} до начала</size></color>");
                    break;
                }
            }
        }
        void Unload() {
            if (ClanData.Count > 0) {
                foreach (var cup in ClanData) {
                    if (cup.isremove == false || cup != null) {
                        RemoveMarker(cup);
                    }
                }
            }
            WriteData();
            foreach(var player in BasePlayer.activePlayerList) CuiHelper.DestroyUi(player, CupLayer);
        }
        string CanRemove(BasePlayer player, BaseEntity entity) {
            if (!(entity as BuildingPrivlidge)) return null;
            var find = ClanData.FirstOrDefault(p => p.build == entity.net.ID);
            if (find != null && find.isremove == false) {
                return "Вы не имеете право удалять данный шкаф!";
            }
            return null;
        }
        object OnEntityTakeDamage(BaseCombatEntity entity, HitInfo info) {
            if (entity == null || info == null) return null;
            if (info.InitiatorPlayer == null) return null;
            if (entity as BuildingPrivlidge) {
                var find = ClanData.FirstOrDefault(p => p.build == entity.net.ID);
                if (find != null) {
                    var clan = Clans?.CallHook("CheckClans", entity.net.ID, info.InitiatorPlayer.OwnerID);
                    if (clan is bool && (bool)clan) {
                        info.InitiatorPlayer.ChatMessage("Вы не имеете право уничтожать турнирный шкаф своего же клана!");
                        info.damageTypes.ScaleAll(0f);
                        return false;
                    }
                    if (entity.OwnerID == info.InitiatorPlayer.userID) {
                        info.InitiatorPlayer.ChatMessage("Вы не имеете право уничтожать турнирный шкаф своего же клана!");
                        info.damageTypes.ScaleAll(0f);
                        return false;
                    }
                }
            }
            return null;
        }
        bool CheckTournament(ulong owner) {
            var find = ClanData.FirstOrDefault(p => p.ownerclan == owner);
            if (find == null) {
                return false;
            }
            if (find.isremove) {
                return false;
            }
            return true;
        }
        void OnEntityDeath(BaseCombatEntity entity, HitInfo info) {
            if (entity == null) return;
            if (entity as BuildingPrivlidge && info != null && info.InitiatorPlayer != null) {
                var find = ClanData.FirstOrDefault(p => p.build == entity.net.ID);
                if (find != null) {
                    if (find.isremove == true) {
                        info.InitiatorPlayer.ChatMessage("Произошла критическая ошибка! Плагин не выдал очки");
                        return;
                    }
                    Clans?.CallHook("ScoreRemove", find.ownerclan, info.InitiatorPlayer.userID);
                    info.InitiatorPlayer.ChatMessage("Вы уничтожили турнирный шкаф чужого клана!");
                    find.isremove = true;
                    string name = Clans?.Call("ClanAlready", find.ownerclan) as string;
                    RemoveMarker(find);
                    LogToFile("Tournament", $"Клан {name} вылетел из турнира в {DateTime.Now.ToString(CultureInfo.InvariantCulture)}", this);
                }
            }
        }
        public string CupLayer = "UI_CupLayer";
        [ConsoleCommand("registration.clanssss")]
        void RegClan(ConsoleSystem.Arg args) {
            BasePlayer player = args.Player();
            uint ent = uint.Parse(args.Args[0]);
            ClanData.Add(new CupSettings() {
                ownerclan = player.userID, isremove = false, build = ent
            }
            );
            player.ChatMessage("Вы успешно зарегистрировались на турнир!");
            CuiHelper.DestroyUi(player, CupLayer);
            //AddMarker(new CupSettings(){ownerclan = player.userID,isremove = false,build = ent});
            string name = Clans?.Call("ClanAlready", new CupSettings() {
                ownerclan = player.userID, isremove = false, build = ent
            }
            .ownerclan) as string;
            LogToFile("Tournament", $"Клан {name} зарегистрировались на турнир в {DateTime.Now.ToString(CultureInfo.InvariantCulture)}", this);
            WriteData();
        }
        private static string HexToCuiColor(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}";
        }
        void ui(BasePlayer player) {
            var text = $"До начала - {FormatShortTime(time)}";
            if(time < TimeSpan.FromSeconds(0)) text = $"Турнир начался!";
            CuiElementContainer container = new CuiElementContainer();
            container.Add(new CuiElement {
                Name = "txt", Parent = CupLayer, Components = {
                    new CuiTextComponent {
                        Text = text, FontSize = 16, Align = TextAnchor.MiddleCenter,
                    }
                    , new CuiRectTransformComponent {
                        AnchorMin = "0.08181816 0.0208335", AnchorMax = "0.9454545 0.4166667"
                    }
                }
            }
            );
            CuiHelper.DestroyUi(player, "txt");
            CuiHelper.AddUi(player, container);
        }
        private readonly Dictionary<ulong, Timer> timers = new Dictionary<ulong, Timer>();
        private void OnLootEntity(BasePlayer player, BaseEntity entity) {
            if (player == null || entity == null) return;
            if (entity as BuildingPrivlidge) {
                CuiHelper.DestroyUi(player, CupLayer);
                if (entity.OwnerID != player.userID) return;
                CuiElementContainer container = new CuiElementContainer();
                container.Add(new CuiPanel {
                    CursorEnabled = false, RectTransform = {
                        AnchorMin = "0.5 0", AnchorMax = "0.5 0", OffsetMin = "-230 440", OffsetMax = "210 600"
                    }
                    , Image = {
                        Color = "0 0 0 0"
                    }
                }
                , "Overlay", CupLayer);
                timers[player.userID] = timer.Every(0.5f, () => {
                    ui(player);
                }
                );
                object clan = Clans?.CallHook("ClanCount", player.userID);
                if (clan is bool && !(bool) clan) {
                    container.Add(new CuiButton {
                        RectTransform = {
                            AnchorMin = "0.08181816 0.3208335", AnchorMax = "0.9454545 0.7166667"
                        }
                        , Button = {
                            Color = HexToCuiColor("#919191BA"), Command = $""
                        }
                        , Text = {
                            Text = $"Ошибка! Возможно вы не состоите в клане, или же не являетесь главой клана в котором вы состоите", Align = TextAnchor.MiddleCenter, Font = "robotocondensed-regular.ttf", FontSize = 24
                        }
                    }
                    , CupLayer);
                    CuiHelper.AddUi(player, container);
                    return;
                }
                var build = entity.GetBuildingPrivilege(entity.WorldSpaceBounds()).GetBuilding();
                var foundationlist = build.decayEntities.ToList().FindAll(p => p.PrefabName == "assets/prefabs/building core/foundation/foundation.prefab" || p.PrefabName == "assets/prefabs/building core/foundation.triangle/foundation.triangle.prefab");
                if (foundationlist.Count < 1) {
                    container.Add(new CuiButton {
                        RectTransform = {
                            AnchorMin = "0.08181816 0.3208335", AnchorMax = "0.9454545 0.7166667"
                        }
                        , Button = {
                            Color = HexToCuiColor("#919191BA"), Command = $""
                        }
                        , Text = {
                            Text = $"Необходимо иметь 50 фундаментов!", Align = TextAnchor.MiddleCenter, Font = "robotocondensed-regular.ttf", FontSize = 24
                        }
                    }
                    , CupLayer);
                    CuiHelper.AddUi(player, container);
                    return;
                }
                var find = ClanData.FirstOrDefault(p => p.ownerclan == player.userID);
                if (find != null) {
                    if (find.isremove == true) {
                        container.Add(new CuiButton {
                            RectTransform = {
                                AnchorMin = "0.08181816 0.3208335", AnchorMax = "0.9454545 0.7166667"
                            }
                            , Button = {
                                Color = HexToCuiColor("#919191BA"), Command = $""
                            }
                            , Text = {
                                Text = $"Ваш шкаф уже был уничтожен! вы вылетели с турнира!", Align = TextAnchor.MiddleCenter, Font = "robotocondensed-regular.ttf", FontSize = 24
                            }
                        }
                        , CupLayer);
                        CuiHelper.AddUi(player, container);
                        return;
                    }
                    container.Add(new CuiButton {
                        RectTransform = {
                            AnchorMin = "0.08181816 0.3208335", AnchorMax = "0.9454545 0.7166667"
                        }
                        , Button = {
                            Color = HexToCuiColor("#919191BA"), Command = $""
                        }
                        , Text = {
                            Text = $"Ошибка! Ваш клан уже зарегистрирован на турнир!", Align = TextAnchor.MiddleCenter, Font = "robotocondensed-regular.ttf", FontSize = 24
                        }
                    }
                    , CupLayer);
                    CuiHelper.AddUi(player, container);
                    return;
                }
                container.Add(new CuiButton {
                    RectTransform = {
                        AnchorMin = "0.08181816 0.3208335", AnchorMax = "0.9454545 0.7166667"
                    }
                    , Button = {
                        Color = HexToCuiColor("#919191BA"), Command = $"registration.clanssss {entity.net.ID}"
                    }
                    , Text = {
                        Text = $"ЗАРЕГИСТРИРОВАТЬСЯ НА ТУРНИР!", Align = TextAnchor.MiddleCenter, Font = "robotocondensed-regular.ttf", FontSize = 24
                    }
                }
                , CupLayer);
                CuiHelper.AddUi(player, container);
            }
        }
        private void OnLootEntityEnd(BasePlayer player, BaseCombatEntity entity) => CuiHelper.DestroyUi(player, CupLayer);
        object OnEntityGroundMissing(BaseEntity entity) {
            if (entity == null) return null;
            if (ClanData.Any(p => p.build == entity.net.ID)) {
                return false;
            }
            return null;
        }
    }
}

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