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

FREE CCases : 0.0.1 0.0.1

Нет прав для скачивания
C#:
using System;
using System.Collections.Generic;
using System.Data.SQLite;
using System.Globalization;
using System.Linq;
using Newtonsoft.Json;
using Oxide.Core;
using Oxide.Core.Plugins;
using Oxide.Game.Rust.Cui;
using UnityEngine;
using Random = UnityEngine.Random;
namespace Oxide.Plugins {
    [Info("CCases", "Hougan", "0.0.1")]
    [Description("Ежедневные кейсы для игроков")]
    public class CCases : RustPlugin {
#region Classes
        private class SingleCase {
            internal class CaseItem {
                internal class Execute {
                    internal class ExecuteCommand {
                        [JsonProperty("Выполняемая команда")]
                        public List<string> Commands;
                        [JsonProperty("Уникальное название")]
                        public string ImagePNG;
                        [JsonProperty("Внешнее изображение")]
                        public string ImageURL;
                    }
                    internal class ExecuteItem {
                        [JsonProperty("Короткое название предмета")]
                        public string ShortName;
                        [JsonProperty("Количество предмета")]
                        public int Amount;
                        [JsonProperty("ID скина предмета")]
                        public ulong SkinID;
                        [JsonProperty("Минимальное количество")]
                        public int MinAmount;
                        [JsonProperty("Максимальное количество")]
                        public int MaxAmount;
                    }
                    [JsonProperty("Выпадающая команда")]
                    public ExecuteCommand Command;
                    [JsonProperty("Выпадающий предмет")]
                    public ExecuteItem Item;
                }
                [JsonProperty("Выпавший предмет")]
                public Execute CaseInternal;
                [JsonProperty("Шанс выпадения предметов")]
                public int DropChance;
            }
            [JsonProperty("Ссылка на изображение кейса")]
            public string ImagePNG;
            [JsonProperty("Время для открытия кейса")]
            public int OpenTime;
            [JsonProperty("Список выпадающих предметов")]
            public List<CaseItem> DropItems = new List<CaseItem>();
        }
        private class PlayerInfo {
            internal class Inventory {
                [JsonProperty("Список выпавших предметов")]
                public List<SingleCase.CaseItem.Execute> WonItems = new List<SingleCase.CaseItem.Execute>();
            }
            internal class Complete {
                internal class Join {
                    [JsonProperty("День входа")]
                    public int DayNumber;
                    [JsonProperty("Месяц входа")]
                    public int MonthNumber;
                    public Join(int day, int month) {
                        DayNumber = day;
                        MonthNumber = month;
                    }
                }
                internal class Left {
                    [JsonProperty("Оставшееся время")]
                    public int LeftTime;
                    [JsonProperty("Полное время")]
                    public int AllTime;
                    public Left(int day, int month) {
                        LeftTime = day;
                        AllTime = month;
                    }
                }
                [JsonProperty("Дата в которую игрок зашёл")]
                public Join JoinDate = new Join(0, 0);
                [JsonProperty("Оставшееся время для получения")]
                public Left LeftTime = new Left(0, 0);
            }
            [JsonProperty("Текущий сбор кейсов игрока")]
            public List<Complete> Completes = new List<Complete>();
            [JsonProperty("Собранные игроком вещи")]
            public Inventory PlayerInventory;
            /// <summary>
            /// Получает текущий день
            /// </summary>
            /// <returns>Номер дня</returns>
            public int CurrentIndex() => Completes.Count;
            /// <summary>
            /// Возвращает оставшееся время за день
            /// </summary>
            /// <returns>Секунды до получения награды</returns>
            public int LeftTime() => Completes.Last().LeftTime.LeftTime;
            /// <summary>
            /// Закончил ли игрок получать награду
            /// </summary>
            /// <returns>True/False</returns>
            public bool Finished() => Completes.Last().LeftTime.LeftTime <= 0;
            /// <summary>
            /// Получил ли игрок награду
            /// </summary>
            /// <returns>True/Flase</returns>
            public bool GotPrize() => LeftTime() == -999;
        }
#endregion
#region Variables
        [PluginReference]
        private Plugin ImageLibrary;
        [JsonProperty("Системное название слоя")]
        private string Layer = "UI_CaseInterface";
        [JsonProperty("Системное названия слоя с наградой")]
        private string PrizeLayer = "UI_PrizeInterface";
        [JsonProperty("Список открытых интерфейсов")]
        private List<ulong> OpenMenu = new List<ulong>();
        [JsonProperty("Загружен ли плагин?")]
        private bool PluginInitialized = false;
        [JsonProperty("Информация об игроках")]
        private Dictionary<ulong, PlayerInfo> PlayerInformation = new Dictionary<ulong, PlayerInfo>();
        [JsonProperty("Список доступных для игрока кейсов")]
        private List<SingleCase> CaseList = new List<SingleCase> {
            new SingleCase {
                OpenTime = 60 * 60, ImagePNG = "https://i.imgur.com/xQYmxMo.png", DropItems = new List<SingleCase.CaseItem> {
                    new SingleCase.CaseItem {
                        DropChance = 50, CaseInternal = new SingleCase.CaseItem.Execute {
                            Item = new SingleCase.CaseItem.Execute.ExecuteItem {
                                ShortName = "rifle.ak", Amount = 1, SkinID = 0UL, MinAmount = 1, MaxAmount = 1
                            }
                            , Command = null
                        }
                    }
                    , new SingleCase.CaseItem {
                        DropChance = 50, CaseInternal = new SingleCase.CaseItem.Execute {
                            Item = null, Command = new SingleCase.CaseItem.Execute.ExecuteCommand {
                                Commands = new List<string> {
                                    "o.grant user %STEAMID% admin", "rain 100"
                                }
                                , ImagePNG = "GivingAdmin", ImageURL = "https://lh3.googleusercontent.com/eS496-RroU7sJwkojrcqCQoz8OuZb3E_qZRz8YttwQPdaJNaHld3D2ekxKPZHgrTuA"
                            }
                        }
                    }
                    ,
                }
            }
            , new SingleCase {
                OpenTime = 60 * 60, ImagePNG = "https://i.imgur.com/mrIEwoV.png", DropItems = new List<SingleCase.CaseItem> {
                    new SingleCase.CaseItem {
                        DropChance = 50, CaseInternal = new SingleCase.CaseItem.Execute {
                            Item = new SingleCase.CaseItem.Execute.ExecuteItem {
                                ShortName = "rifle.ak", Amount = 1, SkinID = 0UL, MinAmount = 1, MaxAmount = 1
                            }
                            , Command = null
                        }
                    }
                    , new SingleCase.CaseItem {
                        DropChance = 50, CaseInternal = new SingleCase.CaseItem.Execute {
                            Item = null, Command = new SingleCase.CaseItem.Execute.ExecuteCommand {
                                Commands = new List<string> {
                                    "o.grant user %STEAMID% admin", "rain 100"
                                }
                                , ImagePNG = "GivingAdmin21", ImageURL = "https://lh3.googleusercontent.com/eS496-RroU7sJwkojrcqCQoz8OuZb3E_qZRz8YttwQPdaJNaHld3D2ekxKPZHgrTuA"
                            }
                        }
                    }
                    ,
                }
            }
            , new SingleCase {
                OpenTime = 60 * 60, ImagePNG = "https://i.imgur.com/zYuuvIW.png", DropItems = new List<SingleCase.CaseItem> {
                    new SingleCase.CaseItem {
                        DropChance = 50, CaseInternal = new SingleCase.CaseItem.Execute {
                            Item = new SingleCase.CaseItem.Execute.ExecuteItem {
                                ShortName = "rifle.ak", Amount = 1, SkinID = 0UL, MinAmount = 1, MaxAmount = 1
                            }
                            , Command = null
                        }
                    }
                    , new SingleCase.CaseItem {
                        DropChance = 50, CaseInternal = new SingleCase.CaseItem.Execute {
                            Item = null, Command = new SingleCase.CaseItem.Execute.ExecuteCommand {
                                Commands = new List<string> {
                                    "o.grant user %STEAMID% admin", "rain 100"
                                }
                                , ImagePNG = "GivingAdmin213", ImageURL = "https://lh3.googleusercontent.com/eS496-RroU7sJwkojrcqCQoz8OuZb3E_qZRz8YttwQPdaJNaHld3D2ekxKPZHgrTuA"
                            }
                        }
                    }
                    ,
                }
            }
            , new SingleCase {
                OpenTime = 60 * 60, ImagePNG = "https://i.imgur.com/lEcEuYL.png", DropItems = new List<SingleCase.CaseItem> {
                    new SingleCase.CaseItem {
                        DropChance = 50, CaseInternal = new SingleCase.CaseItem.Execute {
                            Item = new SingleCase.CaseItem.Execute.ExecuteItem {
                                ShortName = "rifle.ak", Amount = 1, SkinID = 0UL, MinAmount = 1, MaxAmount = 1
                            }
                            , Command = null
                        }
                    }
                    , new SingleCase.CaseItem {
                        DropChance = 50, CaseInternal = new SingleCase.CaseItem.Execute {
                            Item = null, Command = new SingleCase.CaseItem.Execute.ExecuteCommand {
                                Commands = new List<string> {
                                    "o.grant user %STEAMID% admin", "rain 100"
                                }
                                , ImagePNG = "GivingAdmi214e2n", ImageURL = "https://lh3.googleusercontent.com/eS496-RroU7sJwkojrcqCQoz8OuZb3E_qZRz8YttwQPdaJNaHld3D2ekxKPZHgrTuA"
                            }
                        }
                    }
                    ,
                }
            }
            , new SingleCase {
                OpenTime = 60 * 60, ImagePNG = "https://i.imgur.com/ZfIYHpV.png", DropItems = new List<SingleCase.CaseItem> {
                    new SingleCase.CaseItem {
                        DropChance = 50, CaseInternal = new SingleCase.CaseItem.Execute {
                            Item = new SingleCase.CaseItem.Execute.ExecuteItem {
                                ShortName = "rifle.ak", Amount = 1, SkinID = 0UL, MinAmount = 1, MaxAmount = 1
                            }
                            , Command = null
                        }
                    }
                    , new SingleCase.CaseItem {
                        DropChance = 50, CaseInternal = new SingleCase.CaseItem.Execute {
                            Item = null, Command = new SingleCase.CaseItem.Execute.ExecuteCommand {
                                Commands = new List<string> {
                                    "o.grant user %STEAMID% admin", "rain 100"
                                }
                                , ImagePNG = "GivingA2132112dmin", ImageURL = "https://lh3.googleusercontent.com/eS496-RroU7sJwkojrcqCQoz8OuZb3E_qZRz8YttwQPdaJNaHld3D2ekxKPZHgrTuA"
                            }
                        }
                    }
                    ,
                }
            }
            , new SingleCase {
                OpenTime = 60 * 60, ImagePNG = "https://i.imgur.com/loq7wMH.png", DropItems = new List<SingleCase.CaseItem> {
                    new SingleCase.CaseItem {
                        DropChance = 50, CaseInternal = new SingleCase.CaseItem.Execute {
                            Item = new SingleCase.CaseItem.Execute.ExecuteItem {
                                ShortName = "rifle.ak", Amount = 1, SkinID = 0UL, MinAmount = 1, MaxAmount = 1
                            }
                            , Command = null
                        }
                    }
                    , new SingleCase.CaseItem {
                        DropChance = 50, CaseInternal = new SingleCase.CaseItem.Execute {
                            Item = null, Command = new SingleCase.CaseItem.Execute.ExecuteCommand {
                                Commands = new List<string> {
                                    "o.grant user %STEAMID% admin", "rain 100"
                                }
                                , ImagePNG = "GivingAasdsaddmin", ImageURL = "https://lh3.googleusercontent.com/eS496-RroU7sJwkojrcqCQoz8OuZb3E_qZRz8YttwQPdaJNaHld3D2ekxKPZHgrTuA"
                            }
                        }
                    }
                    ,
                }
            }
            , new SingleCase {
                OpenTime = 60 * 60, ImagePNG = "https://i.imgur.com/q1hq0Ku.png", DropItems = new List<SingleCase.CaseItem> {
                    new SingleCase.CaseItem {
                        DropChance = 50, CaseInternal = new SingleCase.CaseItem.Execute {
                            Item = new SingleCase.CaseItem.Execute.ExecuteItem {
                                ShortName = "rifle.ak", Amount = 1, SkinID = 0UL, MinAmount = 1, MaxAmount = 1
                            }
                            , Command = null
                        }
                    }
                    , new SingleCase.CaseItem {
                        DropChance = 50, CaseInternal = new SingleCase.CaseItem.Execute {
                            Item = null, Command = new SingleCase.CaseItem.Execute.ExecuteCommand {
                                Commands = new List<string> {
                                    "o.grant user %STEAMID% admin", "rain 100"
                                }
                                , ImagePNG = "Givsaf12ingAdmin", ImageURL = "https://lh3.googleusercontent.com/eS496-RroU7sJwkojrcqCQoz8OuZb3E_qZRz8YttwQPdaJNaHld3D2ekxKPZHgrTuA"
                            }
                        }
                    }
                    ,
                }
            }
            ,
        }
        ;
        [JsonProperty("Изображения плагина")]
        private Dictionary<string, string> PluginImages = new Dictionary<string, string> {
            ["BTN.RETURN"]
            = "https://i.imgur.com/PFaWY5i.png", ["BTN.CLOSE"] = "https://i.imgur.com/3znHdxL.png", ["CASE.DEFAULT"] = "https://i.imgur.com/fsGv9iK.png", ["CASE.FINISH"] = "https://i.imgur.com/OGf3rpj.png"
        }
        ;
#endregion
#region Initialization
        private void OnServerInitialized() {
            if (Interface.Oxide.DataFileSystem.ExistsDatafile("CCases/Players")) {
                PlayerInformation = Interface.Oxide.DataFileSystem.ReadObject<Dictionary<ulong, PlayerInfo>>("CCases/Players");
                // Server.Broadcast(PlayerInformation[76561198121100397].Completes.Last().LeftTime.Item1.ToString());
            }
            if (Interface.Oxide.DataFileSystem.ExistsDatafile("CCases/Cases")) {
                CaseList = Interface.Oxide.DataFileSystem.ReadObject<List<SingleCase>>("CCases/Cases");
            }
            else {
                SaveData();
            }
            ValidateCases();
            timer.Every(59, () => {
                foreach (var check in BasePlayer.activePlayerList) {
                    if (!PlayerInformation.ContainsKey(check.userID)) {
                        OnPlayerInit(check);
                    }
                    var playerInfo = PlayerInformation[check.userID];
                    ValidatePlayer(check);
                    if (playerInfo.Completes.Last().LeftTime.LeftTime > 0 ) {
                        playerInfo.Completes.Last().LeftTime.LeftTime -= 60;
                    }
                    if (playerInfo.Completes.Last().LeftTime.LeftTime < 0 && playerInfo.Completes.Last().LeftTime.LeftTime != -999) {
                        check.ChatMessage("У вас появилась возможность открыть кейс!\n" + "Подробнее: /case");
                        playerInfo.Completes.Last().LeftTime.LeftTime = 0;
                    }
                    if (OpenMenu.Contains(check.userID)) {
                        BasePlayer target = BasePlayer.FindByID(check.userID);
                        if (target != null && target.IsConnected) {
                            UI_MainInterface(target);
                        }
                    }
                }
            }
            ).Callback();
            foreach (var check in PluginImages) ImageLibrary.Call("AddImage", check.Value, check.Key);
        }
#endregion
#region Hooks
        private void Unload() => SaveData();
        private void OnPlayerInit(BasePlayer player) {
            if (!PlayerInformation.ContainsKey(player.userID)) {
                PlayerInfo playerInfo = new PlayerInfo();
                playerInfo.PlayerInventory = new PlayerInfo.Inventory();
                playerInfo.Completes = new List<PlayerInfo.Complete>();
                PlayerInformation.Add(player.userID, playerInfo);
            }
            ValidatePlayer(player);
        }
#endregion
#region Functions
        private void GetPrize(BasePlayer player, SingleCase.CaseItem.Execute execute) {
            if (execute.Command != null) {
                foreach (var check in execute.Command.Commands) Server.Command(check.Replace("%STEAMID%", player.userID.ToString()));
            }
            else {
                if (player.inventory.containerMain.itemList.Count == 24) {
                    player.ChatMessage($"<size=16>Система открытия <color=#4286f4>кейсов</color>:</size>\n" + $"У вас не хватает места в основном инвентаре!");
                    return;
                }
                Item x = ItemManager.CreateByPartialName(execute.Item.ShortName, execute.Item.Amount);
                x.skin = execute.Item.SkinID;
                x.MoveToContainer(player.inventory.containerMain);
            }
            player.ChatMessage($"<size=16>Система открытия <color=#4286f4>кейсов</color>:</size>\n" + $"Вы успешно получили награду!");
            PlayerInformation[player.userID].PlayerInventory.WonItems.Remove(execute);
        }
        private void SaveData() {
            Interface.Oxide.DataFileSystem.WriteObject("CCases/Cases", CaseList);
            Interface.Oxide.DataFileSystem.WriteObject("CCases/Players", PlayerInformation);
        }
        private void OpenCase(BasePlayer player, int caseNumber) {
            PlayerInfo playerInfo = PlayerInformation[player.userID];
            if (playerInfo.Completes.Count < caseNumber) {
                player.ChatMessage($"<size=16>Система открытия <color=#4286f4>кейсов</color>:</size>\n" + $"Вы не можете открывать недоступные кейсы, откройте предыдущий!");
                return;
            }
            var different = DifferentWithToday(playerInfo.Completes.Last().JoinDate);
            if (different != 0) {
                player.ChatMessage($"<size=16>Система открытия <color=#4286f4>кейсов</color>:</size>\n" + $"Возможно ошибка в плагине, сообщите разработчикам #1!");
                ValidatePlayer(player);
                return;
            }
            if (playerInfo.Completes.Last().LeftTime.LeftTime < 0) {
                player.ChatMessage($"<size=16>Система открытия <color=#4286f4>кейсов</color>:</size>\n" + $"Вы уже открыли сегодня плагин, ожидайте начала нового дня!");
                return;
            }
            //PrintWarning($"Генерируем приз для: {CaseList.ElementAt(caseNumber).DropItems[0].CaseInternal.Item.ShortName}");
            var wonItem = GeneratePrize(CaseList.ElementAt(caseNumber));
            if (wonItem == null) {
                player.ChatMessage($"<size=16>Система открытия <color=#4286f4>кейсов</color>:</size>\n" + $"Возможно ошибка в плагине, сообщите разработчикам #2!");
                return;
            }
            playerInfo.PlayerInventory.WonItems.Add(wonItem);
            playerInfo.Completes.Last().LeftTime.LeftTime = -999;
            UI_DrawReward(player, wonItem);
            timer.Once(0.5f, () => {
                UI_DrawReward(player, wonItem);
            }
            );
        }
        private SingleCase.CaseItem.Execute GeneratePrize(SingleCase gCase) {
            var totalPercents = 0;
            gCase.DropItems.ForEach(p => {
                totalPercents += p.DropChance;
            }
            );
            var generateNumber = Random.Range(0, totalPercents);
            totalPercents = 0;
            foreach (var check in gCase.DropItems) {
                if (totalPercents + check.DropChance >= generateNumber) {
                    SingleCase.CaseItem.Execute newCase = check.CaseInternal;
                    if (newCase.Item != null) {
                        newCase.Item.Amount = Oxide.Core.Random.Range(newCase.Item.MinAmount, newCase.Item.MaxAmount);
                    }
                    return check.CaseInternal;
                }
                totalPercents += check.DropChance;
            }
            return null;
        }
        private void StartOpen(BasePlayer player) {
            PlayerInfo playerInfo = PlayerInformation[player.userID];
            if (playerInfo.Completes.Count == CaseList.Count) {
                player.ChatMessage($"<size=16>Система открытия <color=#4286f4>кейсов</color>:</size>\n" + $"Вы открыли все кейсы, как на счёт того, чтобы начать всё по новой?");
                playerInfo.Completes.Clear();
                ValidatePlayer(player);
                return;
            }
            var nCase = CaseList.ElementAt(playerInfo.Completes.Count);
            playerInfo.Completes.Add(new PlayerInfo.Complete() {
                LeftTime = new PlayerInfo.Complete.Left(nCase.OpenTime, nCase.OpenTime), JoinDate = new PlayerInfo.Complete.Join(DateTime.Now.Day, DateTime.Now.Month)
            }
            );
            UI_MainInterface(player);
        }
        private void ValidatePlayer(BasePlayer player) {
            PlayerInfo playerInfo = PlayerInformation[player.userID];
            if (playerInfo.Completes.Count == 0) {
                StartOpen(player);
                return;
            }
            var different = DifferentWithToday(playerInfo.Completes.Last().JoinDate);
            if (different == 1 && playerInfo.Finished()) {
                StartOpen(player);
            }
            else if (different == 1 && (!playerInfo.Finished() || !playerInfo.GotPrize())) {
                player.ChatMessage($"<size=16>Система открытия <color=#4286f4>кейсов</color>:</size>\n" + $"Вы не успели открыть последний кейс, вы начинаете заново!");
                playerInfo.Completes.Clear();
                ValidatePlayer(player);
                return;
            }
        }
        private void ValidateCases() {
            if (CaseList.Count != 7) {
                PrintError("Недостаточное количество кейсов, вы не можете использовать плагин!");
                return;
            }
            for (int i = 0; i < CaseList.Count; i++) {
                SingleCase currentCase = CaseList.ElementAt(i);
                if (string.IsNullOrEmpty(currentCase.ImagePNG)) {
                    PrintError($"Не установлено изображение для кейса #{i}, вы не можете использовать плагин!");
                    return;
                }
                else {
                    ImageLibrary.Call("AddImage", currentCase.ImagePNG, $"Case.{i}");
                }
                if (currentCase.OpenTime <= 0) {
                    PrintError($"Время для открытия кейса #{i} меньше или равно нулю, вы не можете использовать плагин!");
                    return;
                }
                for (int t = 0; t < currentCase.DropItems.Count; t++) {
                    SingleCase.CaseItem currentPrize = currentCase.DropItems.ElementAt(t);
                    if (currentPrize.DropChance == 0) {
                        PrintError($"CASE #{i} | У приза #{t}, шанс выпадения равен нулю, вы не можете использовать плагин!");
                        return;
                    }
                    if (currentPrize.CaseInternal.Item != null && currentPrize.CaseInternal.Item.MaxAmount < currentPrize.CaseInternal.Item.MinAmount) {
                        PrintError($"CASE #{i} | У приза #{t}, максимальное количество меньше минимального, вы не можете использовать плагин!");
                        return;
                    }
                    if (currentPrize.DropChance == 0) {
                        PrintError($"CASE #{i} | У приза #{t}, минимальное количество предметов равно 0, вы не можете использовать плагин!");
                        return;
                    }
                    SingleCase.CaseItem.Execute executePrize = currentPrize.CaseInternal;
                    if (executePrize.Command == null && executePrize.Item == null) {
                        PrintError($"CASE #{i}, Приз #{t} | Награда пуста, вы не можете использовать плагин!");
                        return;
                    }
                    if (executePrize.Command != null && executePrize.Item != null) {
                        PrintWarning($"CASE #{i}, Приз #{t} | Оба варианты награды заполнены, игрок получит обе награды!");
                    }
                    if (executePrize.Command != null && string.IsNullOrEmpty(executePrize.Command.ImagePNG)) {
                        PrintError($"CASE #{i}, Приз #{t} | Не установлено изображение для команды, вы не можете использовать плагин!");
                        return;
                    }
                    if (executePrize.Command != null) {
                        ImageLibrary.Call("AddImage", executePrize.Command.ImageURL, executePrize.Command.ImagePNG);
                    }
                }
            }
            PluginInitialized = true;
            PrintWarning($"Плагин успешно проверен, всё хорошо!");
        }
        private int DifferentWithToday(PlayerInfo.Complete.Join currentDate) {
            DateTime nowTime = DateTime.Now;
            var different = Math.Abs(nowTime.Day - currentDate.DayNumber);
            if (different > 1) return 999;
            if (Math.Abs(nowTime.Month - currentDate.MonthNumber) > 1) return 999;
            return different;
        }
#endregion
#region Commands
        [ChatCommand("case")]
        private void cmdChatCases(BasePlayer player, string command, string[] args) {
            if (OpenMenu.Contains(player.userID)) {
                OpenMenu.Remove(player.userID);
            }
            OpenMenu.Add(player.userID);
            UI_MainInterface(player);
        }
        [ConsoleCommand("UI_CaseHandler")]
        private void cmdConsoleHandler(ConsoleSystem.Arg args) {
            if (!args.HasArgs(1)) return;
            BasePlayer player = args.Player();
            if (player == null) return;
            switch (args.Args[0].ToLower()) {
                case "hide" : {
                    if (OpenMenu.Contains(player.userID)) OpenMenu.Remove(player.userID);
                    break;
                }
                case "open" : {
                    if (OpenMenu.Contains(player.userID)) OpenMenu.Remove(player.userID);
                    PlayerInfo playerInfo = PlayerInformation[player.userID];
                    OpenCase(player, playerInfo.CurrentIndex() - 1);
                    break;
                }
                case "inventory" : {
                    if (OpenMenu.Contains(player.userID)) OpenMenu.Remove(player.userID);
                    if (args.HasArgs(2)) UI_InventoryInterface(player, Convert.ToInt32(args.Args[1]));
                    else UI_InventoryInterface(player);
                    break;
                }
                case "take" : {
                    if (OpenMenu.Contains(player.userID)) OpenMenu.Remove(player.userID);
                    GetPrize(player, PlayerInformation[player.userID].PlayerInventory.WonItems.ElementAt(Convert.ToInt32(args.Args[1])));
                    UI_InventoryInterface(player, Convert.ToInt32(args.Args[2]));
                    break;
                }
            }
        }
#endregion
#region UI
        private static 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 string.Format("{0:F2} {1:F2} {2:F2} {3:F2}", color.r, color.g, color.b, color.a);
        }
        private void UI_DrawReward(BasePlayer player, SingleCase.CaseItem.Execute prize) {
            CuiHelper.DestroyUi(player, PrizeLayer);
            CuiHelper.DestroyUi(player, Layer + ".Open");
            CuiElementContainer container = new CuiElementContainer();
            container.Add(new CuiElement {
                Parent = Layer, Name = PrizeLayer, Components = {
                    new CuiImageComponent {
                        Color = HexToRustFormat("#383E3838")
                    }
                    , new CuiRectTransformComponent {
                        AnchorMin = "0.4079431 0.1378999", AnchorMax = "0.5920569 0.500001", OffsetMax = "0 0"
                    }
                }
            }
            );
            container.Add(new CuiElement {
                Parent = PrizeLayer, Name = Layer + ".Icon", Components = {
                    new CuiImageComponent {
                        Color = HexToRustFormat("#5E82605C")
                    }
                    , new CuiRectTransformComponent {
                        AnchorMin = "0.02857167 0.1857783", AnchorMax = "0.9714283 0.9752498", OffsetMax = "0 0"
                    }
                }
            }
            );
            if (prize.Command != null) {
                container.Add(new CuiElement {
                    Parent = Layer + ".Icon", Components = {
                        new CuiRawImageComponent {
                            Png = (string) ImageLibrary.Call("GetImage", prize.Command.ImagePNG)
                        }
                        , new CuiRectTransformComponent {
                            AnchorMin = "0 0", AnchorMax = "1 1", OffsetMax = "0 0"
                        }
                    }
                }
                );
            }
            else {
                container.Add(new CuiElement {
                    Parent = Layer + ".Icon", Components = {
                        new CuiRawImageComponent {
                            Png = (string) ImageLibrary.Call("GetImage", prize.Item.ShortName)
                        }
                        , new CuiRectTransformComponent {
                            AnchorMin = "0 0", AnchorMax = "1 1", OffsetMax = "0 0"
                        }
                    }
                }
                );
            }
            container.Add(new CuiElement {
                Name = PrizeLayer + ".Get", Parent = PrizeLayer, Components = {
                    new CuiImageComponent {
                        Color = HexToRustFormat("#b2b2b24A")
                    }
                    , new CuiRectTransformComponent {
                        AnchorMin = "0 0", AnchorMax = "1 0.17", OffsetMax = "-5 -3", OffsetMin = "5 3"
                    }
                }
            }
            );
            container.Add(new CuiLabel {
                RectTransform = {
                    AnchorMin = "0 0", AnchorMax = "1 1", OffsetMax = "0 0"
                }
                , Text = {
                    Text = "Принять", Font = "robotocondensed-bold.ttf", FontSize = 18, Align = TextAnchor.MiddleCenter, Color = HexToRustFormat("#afafafFF")
                }
            }
            , PrizeLayer + ".Get");
            container.Add(new CuiButton {
                RectTransform = {
                    AnchorMin = "0 0", AnchorMax = "1 1", OffsetMax = "0 0"
                }
                , Button = {
                    Command = "chat.say /case", Color = "0 0 0 0"
                }
                , Text = {
                    Text = ""
                }
            }
            , PrizeLayer + ".Get");
            CuiHelper.AddUi(player, container);
        }
        private void UI_InventoryInterface(BasePlayer player, int page = 0) {
            CuiHelper.DestroyUi(player, Layer);
            CuiElementContainer container = new CuiElementContainer();
            PlayerInfo playerCases = PlayerInformation[player.userID];
            container.Add(new CuiPanel {
                CursorEnabled = true, RectTransform = {
                    AnchorMin = "0.128711 0.1692131", AnchorMax = "0.871289 0.9363427", OffsetMax = "0 0"
                }
                , Image = {
                    Color = "0 0 0 0"
                }
            }
            , "Overlay", Layer);
            container.Add(new CuiButton {
                RectTransform = {
                    AnchorMin = "-100 100", AnchorMax = "100 100", OffsetMax = "0 0"
                }
                , Button = {
                    Color = HexToRustFormat("#3B3E3DD7"), Command = "UI_CloseCases"
                }
                , Text = {
                    Text = ""
                }
            }
            , Layer);
            container.Add(new CuiElement {
                Parent = Layer, Components = {
                    new CuiImageComponent {
                        Sprite = "assets/content/ui/ui.background.tiletex.psd", Material = "assets/content/ui/uibackgroundblur.mat", Color = "0 0 0 0.9"
                    }
                    , new CuiRectTransformComponent {
                        AnchorMin = "-10 -10", AnchorMax = "10 10", OffsetMax = "0 0"
                    }
                }
            }
            );
            container.Add(new CuiElement {
                Parent = Layer, Components = {
                    new CuiImageComponent {
                        Color = HexToRustFormat("#7C7D7A52")
                    }
                    , new CuiRectTransformComponent {
                        AnchorMin = "0 0", AnchorMax = "1 1", OffsetMax = "0 0"
                    }
                }
            }
            );
            container.Add(new CuiLabel {
                RectTransform = {
                    AnchorMin = "0 0.8934819", AnchorMax = "1 0.9815931", OffsetMax = "0 0"
                }
                , Text = {
                    Text = $"ИНВЕНТАРЬ {page + 1} / {(PlayerInformation[player.userID].PlayerInventory.WonItems.Count / 15) + 1}", Font = "robotocondensed-bold.ttf", FontSize = 26, Align = TextAnchor.MiddleCenter, Color = HexToRustFormat("#B4B4B4FF")
                }
            }
            , Layer);
            int i = 0;
            foreach (var currentCase in PlayerInformation[player.userID].PlayerInventory.WonItems.Skip(page * 15).Take(15)) {
                container.Add(new CuiElement {
                    Parent = Layer, Name = PrizeLayer, Components = {
                        new CuiImageComponent {
                            Color = HexToRustFormat("#383E3838")
                        }
                        , new CuiRectTransformComponent {
                            AnchorMin = $"{0.13312219 + i * 0.16 - Math.Floor((double) i / 5) * 5 * 0.16} {0.6513031 - Math.Floor((double) i / 5) * 0.26}", AnchorMax = $"{0.2383299 + i * 0.16 - Math.Floor((double) i / 5)* 5 * 0.16} {0.8776157 - Math.Floor((double) i / 5) * 0.26}", OffsetMax = "0 0"
                        }
                    }
                }
                );
                container.Add(new CuiElement {
                    Parent = PrizeLayer, Name = Layer + ".Icon", Components = {
                        new CuiImageComponent {
                            Color = HexToRustFormat("#b6b6b662")
                        }
                        , new CuiRectTransformComponent {
                            AnchorMin = "0.02857167 0.1857783", AnchorMax = "0.9714283 0.9752498", OffsetMax = "0 0"
                        }
                    }
                }
                );
                if (currentCase.Command != null) {
                    container.Add(new CuiElement {
                        Parent = Layer + ".Icon", Components = {
                            new CuiRawImageComponent {
                                Png = (string) ImageLibrary.Call("GetImage", currentCase.Command.ImagePNG)
                            }
                            , new CuiRectTransformComponent {
                                AnchorMin = "0 0", AnchorMax = "1 1", OffsetMax = "0 0"
                            }
                        }
                    }
                    );
                }
                else {
                    container.Add(new CuiElement {
                        Parent = Layer + ".Icon", Components = {
                            new CuiRawImageComponent {
                                Png = (string) ImageLibrary.Call("GetImage", currentCase.Item.ShortName)
                            }
                            , new CuiRectTransformComponent {
                                AnchorMin = "0 0", AnchorMax = "1 1", OffsetMax = "0 0"
                            }
                        }
                    }
                    );
                    container.Add(new CuiElement {
                        Parent = Layer + ".Icon", Components = {
                            new CuiTextComponent {
                                Text = currentCase.Item.Amount + " шт.", Font = "robotocondensed-bold.ttf", FontSize = 14, Align = TextAnchor.LowerRight
                            }
                            , new CuiRectTransformComponent {
                                AnchorMin = "1 0", AnchorMax = "1 0", OffsetMin = "-100 0", OffsetMax = "0 50"
                            }
                        }
                    }
                    );
                }
                container.Add(new CuiElement {
                    Name = PrizeLayer + ".Get", Parent = PrizeLayer, Components = {
                        new CuiImageComponent {
                            Color = HexToRustFormat("#b2b2b24A")
                        }
                        , new CuiRectTransformComponent {
                            AnchorMin = "0 0", AnchorMax = "1 0.17", OffsetMax = "-3 -1", OffsetMin = "3 1"
                        }
                    }
                }
                );
                container.Add(new CuiLabel {
                    RectTransform = {
                        AnchorMin = "0 0", AnchorMax = "1 1", OffsetMax = "0 0"
                    }
                    , Text = {
                        Text = "ЗАБРАТЬ", Font = "robotocondensed-bold.ttf", FontSize = 14, Align = TextAnchor.MiddleCenter, Color = HexToRustFormat("#afafafFF")
                    }
                }
                , PrizeLayer + ".Get");
                container.Add(new CuiButton {
                    RectTransform = {
                        AnchorMin = "0 0", AnchorMax = "1 1", OffsetMax = "0 0"
                    }
                    , Button = {
                        Command = $"UI_CaseHandler take {(page * 15) + i} {page}", Color = "0 0 0 0"
                    }
                    , Text = {
                        Text = ""
                    }
                }
                , PrizeLayer + ".Get");
                i++;
            }
#region Отрисовываем кнопки
#region Вернуться в меню
            container.Add(new CuiElement {
                Parent = Layer, Name = Layer + ".BTN", Components = {
                    new CuiRawImageComponent {
                        Png = (string) ImageLibrary.Call("GetImage", "BTN.RETURN")
                    }
                    , new CuiRectTransformComponent {
                        AnchorMin = "0.005531466 0.9502114", AnchorMax = "0.03989122 0.9924564"
                    }
                }
            }
            );
            container.Add(new CuiButton {
                RectTransform = {
                    AnchorMin = "0 0", AnchorMax = "1 1"
                }
                , Button = {
                    Close = Layer, Command = "chat.say /case", Color = "0 0 0 0"
                }
                , Text = {
                    Text = ""
                }
            }
            , Layer + ".BTN");
#endregion
#region Закрыть панель
            container.Add(new CuiElement {
                Parent = Layer, Name = Layer + ".BTN", Components = {
                    new CuiRawImageComponent {
                        Png = (string) ImageLibrary.Call("GetImage", "BTN.CLOSE")
                    }
                    , new CuiRectTransformComponent {
                        AnchorMin = "0.9699283 0.9502114", AnchorMax = "0.9944767 0.991"
                    }
                }
            }
            );
            container.Add(new CuiButton {
                RectTransform = {
                    AnchorMin = "0 0", AnchorMax = "1 1"
                }
                , Button = {
                    Close = Layer, Command = "UI_CaseHandler hide", Color = "0 0 0 0"
                }
                , Text = {
                    Text = ""
                }
            }
            , Layer + ".BTN");
#endregion
#endregion
#region Отрисовываем кнопки влево/вправо
            if (page != 0) {
                container.Add(new CuiButton {
                    RectTransform = {
                        AnchorMin = "0.02761696 0.0328906", AnchorMax = "0.1286165 0.1035001", OffsetMax = "0 0"
                    }
                    , Button = {
                        Command = $"UI_CaseHandler inventory {page-1}", Color = HexToRustFormat("#b2b2b252")
                    }
                    , Text = {
                        Text = "НАЗАД", Font = "robotocondensed-bold.ttf", FontSize = 18, Align = TextAnchor.MiddleCenter, Color = HexToRustFormat("#afafafFF")
                    }
                }
                , Layer);
            }
            if (page + 1 < (int) Math.Ceiling((double) PlayerInformation[player.userID].PlayerInventory.WonItems.Count / 15)) {
                container.Add(new CuiButton {
                    RectTransform = {
                        AnchorMin = "0.88 0.0328906", AnchorMax = "0.98 0.1035001", OffsetMax = "0 0"
                    }
                    , Button = {
                        Command = $"UI_CaseHandler inventory {page+1}", Color = HexToRustFormat("#b2b2b252")
                    }
                    , Text = {
                        Text = "ВПЕРЕД", Font = "robotocondensed-bold.ttf", FontSize = 18, Align = TextAnchor.MiddleCenter, Color = HexToRustFormat("#afafafFF")
                    }
                }
                , Layer);
            }
#endregion
            CuiHelper.AddUi(player, container);
        }
        private void UI_MainInterface(BasePlayer player) {
            CuiHelper.DestroyUi(player, Layer);
            CuiElementContainer container = new CuiElementContainer();
            PlayerInfo playerCases = PlayerInformation[player.userID];
            container.Add(new CuiPanel {
                CursorEnabled = true, RectTransform = {
                    AnchorMin = "0.128711 0.1692131", AnchorMax = "0.871289 0.9363427", OffsetMax = "0 0"
                }
                , Image = {
                    Color = "0 0 0 0"
                }
            }
            , "Overlay", Layer);
            container.Add(new CuiButton {
                RectTransform = {
                    AnchorMin = "-100 100", AnchorMax = "100 100", OffsetMax = "0 0"
                }
                , Button = {
                    Color = HexToRustFormat("#3B3E3DD7"), Command = "UI_CloseCases"
                }
                , Text = {
                    Text = ""
                }
            }
            , Layer);
            container.Add(new CuiElement {
                Parent = Layer, Components = {
                    new CuiImageComponent {
                        Sprite = "assets/content/ui/ui.background.tiletex.psd", Material = "assets/content/ui/uibackgroundblur.mat", Color = "0 0 0 0.9"
                    }
                    , new CuiRectTransformComponent {
                        AnchorMin = "-10 -10", AnchorMax = "10 10", OffsetMax = "0 0"
                    }
                }
            }
            );
            container.Add(new CuiElement {
                Parent = Layer, Components = {
                    new CuiImageComponent {
                        Color = HexToRustFormat("#7C7D7A52")
                    }
                    , new CuiRectTransformComponent {
                        AnchorMin = "0 0", AnchorMax = "1 1", OffsetMax = "0 0"
                    }
                }
            }
            );
            container.Add(new CuiLabel {
                RectTransform = {
                    AnchorMin = "0 0.8934819", AnchorMax = "1 0.9815931", OffsetMax = "0 0"
                }
                , Text = {
                    Text = "ИГРАЙТЕ НА НАШЕМ СЕРВЕРЕ КАЖДЫЙ ДЕНЬ И ПОЛУЧАЙТЕ НАГРАДЫ", Font = "robotocondensed-bold.ttf", FontSize = 26, Align = TextAnchor.MiddleCenter, Color = HexToRustFormat("#B4B4B4FF")
                }
            }
            , Layer);
            container.Add(new CuiLabel {
                RectTransform = {
                    AnchorMin = "0 0.8934819", AnchorMax = "1 0.9815931", OffsetMax = "0 0"
                }
                , Text = {
                    Text = "ИГРАЙТЕ НА НАШЕМ СЕРВЕРЕ КАЖДЫЙ ДЕНЬ И ПОЛУЧАЙТЕ НАГРАДЫ", Font = "robotocondensed-bold.ttf", FontSize = 26, Align = TextAnchor.MiddleCenter, Color = HexToRustFormat("#B4B4B4FF")
                }
 
// ... [Code preview truncated due to length. Full source in attached file] ...

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