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

FREE RandomCases : 0.0.1 0.0.1

Нет прав для скачивания
C#:
// Все права принадлежат дискорд сообществу https://discord.gg/VgNHPpNrz6
using Oxide.Core;
using Oxide.Core.Configuration;
using Oxide.Core.Plugins;
using Oxide.Game.Rust.Cui;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;
using System.Linq;
using UnityEngine;
using System.Diagnostics;
// Reference: System.Drawing
namespace Oxide.Plugins {
    [Info("Random Cases", "server-rust.ru", "0.0.1")]
    //  Слив плагинов server-rust by Apolo YouGame
    public class RandomCases : RustPlugin {
#region Classes
        [PluginReference]
        Plugin Duel;
        private bool IsDuelPlayer(BasePlayer player) {
            if (Duel == null) return false;
            var dueler = Duel.Call("IsPlayerOnActiveDuel", player);
            if (dueler is bool) return (bool)dueler;
            return false;
        }
        static RandomCases instance;
        public class CaseDefinition {
            public string Type;
            public string Name;
            public string Images;
            public string Description;
            public int CoolDown;
            public List<CaseItem> Items;
            public CaseItem Open() => Items.GetRandom();
        }
        public class CaseItem {
            public string Shortname;
            public int Min;
            public int Max;
            public int GetRandom() => UnityEngine.Random.Range(Min, Max + 1);
        }
        public class Case {
            public string Type;
            public int CoolDown;
            public int Amount;
            public CaseDefinition info() {
                if (!instance.cases.ContainsKey(Type)) {
                    Interface.Oxide.LogWarning($"[{nameof(RandomCases)}] TYPE '{Type}' not contains in the Dictionary");
                    return null;
                }
                return instance.cases[Type];
            }
        }
        public class CasePlayer {
            public List<Case> CasesQueue = new List<Case>();
            public List<string> Inventory = new List<string>();
            public bool giftcases = false;
            public void OnTimer(ulong steamid, int delay) {
                List<Case> remove = new List<Case>();
                for (var i = CasesQueue.Count - 1; i >= 0; i--) {
                    var c = CasesQueue[i];
                    c.CoolDown -= delay;
                    if (c.Amount <= 0) {
                        remove.Add(c);
                        continue;
                    }
                    if (c.CoolDown <= 0) {
                        if (instance.GiveCase(steamid, c.Type, c)) remove.Add(c);
                    }
                }
                remove.ForEach(c => CasesQueue.Remove(c));
            }
        }
        public Dictionary<string, CaseDefinition> cases = new Dictionary<string, CaseDefinition>();
        public Dictionary<ulong, CasePlayer> players = new Dictionary<ulong, CasePlayer>();
        const int TIMEOUT = 60;
        bool init = false;
#endregion
#region Configuration
        string cmdChatCommand = "case";
        bool enabledGiftCase = false;
        string giftcase = "casename";
        int giftcaseAmount = 5;
        string imagesServerLogo = "https://i.imgur.com/FSGvggs.png";
        private void LoadConfigValues() {
            bool changed = false;
            if (GetConfig("Основные настройки", "Чатовая команда открытия меню кейсов", ref cmdChatCommand)) {
                PrintWarning("Благодарим за скачивание плагина на сайте Server-rust.ru Если вы приобрели этот плагин на другом ресурсе знайте - вы лох который потратил деньги зря)");
                changed = true;
            }
            if (GetConfig("Основные настройки", "Ссылка на логотип сервера, для вывода в окно кейсов", ref imagesServerLogo)) {
                changed = true;
            }
            if (GetConfig("Бонусный кейс", "Выдавать игроку при первом посещении бонусный кейс?", ref enabledGiftCase)) {
                changed = true;
            }
            if (GetConfig("Бонусный кейс", "Название кейса какой выдавать игроку", ref giftcase)) {
                changed = true;
            }
            if (GetConfig("Бонусный кейс", "Количество кейсов выдаваемых игроку (Игрок получает 1 кейс, а остаток выдаеться в N количество времени указаного в data кейса)", ref giftcaseAmount)) {
                changed = true;
            }
            if (changed) SaveConfig();
        }
        private bool GetConfig<T>(string MainMenu, string Key, ref T var) {
            if (Config[MainMenu, Key] != null) {
                var = (T)Convert.ChangeType(Config[MainMenu, Key], typeof(T));
                return false;
            }
            Config[MainMenu, Key] = var;
            return true;
        }
#endregion
#region Oxide
        void OnServerInitialized() {
            instance = this;
            LoadData();
            LoadConfig();
            LoadConfigValues();
            cmd.AddChatCommand(cmdChatCommand, this, cmdChatCase);
            lang.RegisterMessages(Messages, this, "en");
            Messages = lang.GetMessages("en", this);
            timer.Every(TIMEOUT, TimerHandle);
            InitFileManager();
            CommunityEntity.ServerInstance.StartCoroutine(m_FileManager.LoadFile("Serverlogo", imagesServerLogo));
            foreach (var check in cases) {
                CommunityEntity.ServerInstance.StartCoroutine(m_FileManager.LoadFile($"Icon{check.Value.Type}", check.Value.Images));
            }
            foreach (BasePlayer player in BasePlayer.activePlayerList) {
                OnPlayerInit(player);
            }
        }
        void SaveData() {
            players_File.WriteObject(players);
        }
        void Unload() {
            SaveData();
            foreach (BasePlayer player in BasePlayer.activePlayerList) {
                CuiHelper.DestroyUi(player, "randomcase_menu");
                CuiHelper.DestroyUi(player, "randomcases_give");
            }
        }
        void OnServerSave() {
            SaveData();
        }
        void OnPlayerInit(BasePlayer player) {
            CasePlayer casePlayer;
            if (!players.TryGetValue(player.userID, out casePlayer)) {
                casePlayer = new CasePlayer();
                players.Add(player.userID, casePlayer);
            }
            if (enabledGiftCase) {
                if (!casePlayer.giftcases) {
                    GiveCaseGift(player.userID, giftcase, giftcaseAmount);
                }
            }
            PlayerCheck(player);
        }
        void PlayerCheck(BasePlayer player, int Current = 0, Case ccase2 = null) {
            CasePlayer casePlayer;
            if (!players.TryGetValue(player.userID, out casePlayer)) {
                casePlayer = new CasePlayer();
                players.Add(player.userID, casePlayer);
            }
            var reply = 748;
            var x = new Stopwatch();
            x.Start();
            Dictionary<string, int> casesCollapsed = new Dictionary<string, int>();
            foreach (var ccase in casePlayer.Inventory) {
                if (!casesCollapsed.ContainsKey(ccase)) casesCollapsed[ccase] = 0;
                casesCollapsed[ccase]++;
            }
            Dictionary<string, int> casesQueue = new Dictionary<string, int>();
            foreach (var ccase1 in casePlayer.CasesQueue) {
                if (!casesQueue.ContainsKey(ccase1.Type)) casesQueue[ccase1.Type] = 0;
                casesQueue[ccase1.Type]++;
            }
            int Error = 0;
            List<string> QueInventory = new List<string>();
            foreach (var check in casesQueue) {
                if (!cases.ContainsKey(check.Key)) {
                    QueInventory.Add(check.Key);
                    continue;
                }
            }
            foreach (var remove in QueInventory) {
                var caseQueue = ccase2 ?? casePlayer.CasesQueue.Find(c => c.Type == remove);
                casePlayer.CasesQueue.Remove(caseQueue);
                continue;
            }
            List<string> Inventory = new List<string>();
            foreach (var check in casesCollapsed) {
                foreach (var players1 in check.Key) {
                    if (!cases.ContainsKey(check.Key)) {
                        Inventory.Add(check.Key);
                        Error += check.Value;
                    }
                }
            }
            foreach (var remove in Inventory) {
                casePlayer.Inventory.Remove(remove);
                Error--;
                continue;
            }
            if (Error > 0) {
                PlayerCheck(player, Current);
            }
            x.Stop();
        }
        void OnPlayerSleepEnded(BasePlayer player) {
            CasePlayer casePlayer;
            if (players.TryGetValue(player.userID, out casePlayer) && casePlayer.Inventory.Count > 0) SendReply(player, Messages["isHaveCases"]);
        }
#endregion
#region COMMANDS
        [ConsoleCommand("casegive")]
        void cmdRandomCaseGive(ConsoleSystem.Arg arg) {
            BasePlayer player;
            if (arg.Args == null || arg.Args.Length < 3) {
                Puts("Используйте: casegive STEAMID CASE AMOUNT");
                return;
            }
            if (arg.Connection != null) {
                player = arg.Connection.player as BasePlayer;
                if (player != null && player.net.connection.authLevel != 2) return;
            }
            var uid = ulong.Parse(arg.Args[0]);
            CasePlayer casePlayer;
            if (!players.TryGetValue(uid, out casePlayer)) {
                casePlayer = new CasePlayer();
                players.Add(uid, casePlayer);
            }
            for (int i = 1; i < arg.Args.Length; i += 2) {
                var type = arg.Args[i];
                var amount = int.Parse(arg.Args[2]);
                Case cCase = casePlayer.CasesQueue.FirstOrDefault(c => c.Type == type);
                if (cCase == null) {
                    cCase = new Case() {
                        Amount = amount, Type = type, CoolDown = 0
                    }
                    ;
                    casePlayer.CasesQueue.Add(cCase);
                }
                else cCase.Amount += amount;
                GiveCase(uid, type, null, amount);
            }
        }
        [ConsoleCommand("casedrop")]
        void cmdDropUser(ConsoleSystem.Arg arg) {
            if (arg.Connection != null) return;
            ulong userId = arg.GetUInt64(0);
            CasePlayer casePlayer;
            if (arg.Args == null || arg.Args.Length != 1) {
                Puts("Используйте: casedrop STEAMID");
                return;
            }
            if (!players.TryGetValue(userId, out casePlayer)) {
                Puts("У игрока нет кейсов! Или игрок не найден");
                return;
            }
            var commandMsg = $"casegive {userId}";
            foreach (var ccase in casePlayer.Inventory) commandMsg += $" \"{ccase}\" 1";
            foreach (var ccase in casePlayer.CasesQueue) commandMsg += $" \"{ccase.Type}\" {ccase.Amount - 1}";
            players.Remove(userId);
            Puts($"Очищены кейсы {userId}\nДля переноса используйте следующую команду:\n{commandMsg}");
        }
        void cmdChatCase(BasePlayer player, string cmd, string[] args) {
            if (!init) {
                SendReply(player, Messages["plInit"]);
                return;
            }
            CasePlayer casePlayer;
            if (players.TryGetValue(player.userID, out casePlayer)) {
                int i1 = 0;
                string getCases = "";
                foreach (var ccase in casePlayer.CasesQueue) {
                    string name = cases[ccase.Type].Name;
                    getCases = getCases + "Кейсов " + name + " - Осталось: " + ccase.Amount + $"\nСледующий через {FormatTime(TimeSpan.FromSeconds(ccase.CoolDown))}" + "\n";
                    i1++;
                    if (i1 > ccase.Amount) break;
                }
                Puts("1");
                SendReply(player, getCases);
            }
            DrawCases(player, 1);
        }
        [ConsoleCommand("nextpage.case2")]
        void cmdCloseMenu1(ConsoleSystem.Arg arg) {
            if (arg.Connection == null) return;
            var player = arg.Player();
            DrawCases(player, 2);
        }
        [ConsoleCommand("nextpage.case1")]
        void cmdCloseMenu0(ConsoleSystem.Arg arg) {
            if (arg.Connection == null) return;
            var player = arg.Player();
            DrawCases(player, 1);
        }
        [ConsoleCommand("randomcase.open")]
        void cmdOpenCase(ConsoleSystem.Arg arg) {
            if (arg.Connection == null) return;
            var player = arg.Player();
            var ccase = arg.Args[0];
            DrawCaseInfo(player, ccase);
            //  Слив плагинов server-rust by Apolo YouGame
        }
        [ConsoleCommand("openplayercase")]
        void cmdOpenCaseTest(ConsoleSystem.Arg arg) {
            if (arg.Connection == null) return;
            var player = arg.Player();
            var ccase = arg.Args[0];
            var amount = arg.Args[1];
            OpenCase(player, ccase);
            DrawCases(player, 1);
            if (amount != "1") {
                DrawCaseInfo(player, ccase);
                //  Слив плагинов server-rust by Apolo YouGame
            }
        }
        [ConsoleCommand("casesmenuclose")]
        void cmdCloseMenu(ConsoleSystem.Arg arg) {
            if (arg.Connection == null) return;
            var player = arg.Player();
            CuiHelper.DestroyUi(player, "randomcase_menu");
            CuiHelper.DestroyUi(player, "casescontainer");
        }
#endregion
#region CORE
        void SendReply(BasePlayer player, string msg) {
            base.SendReply(player, $"{msg}");
        }
        void TimerHandle() {
            foreach (var rCase in players) rCase.Value.OnTimer(rCase.Key, TIMEOUT);
            SaveData();
        }
        bool GiveCase(ulong userID, string ccase, Case ccase1 = null, int amount = 0) {
            CasePlayer casePlayer;
            if (players.TryGetValue(userID, out casePlayer)) {
                var caseQueue = ccase1 ?? casePlayer.CasesQueue.Find(c => c.Type == ccase);
                if (caseQueue == null) return false;
                caseQueue.Amount--;
                if (caseQueue.info() == null) {
                    casePlayer.CasesQueue.Remove(caseQueue);
                    return false;
                }
                caseQueue.CoolDown = caseQueue.info().CoolDown;
                casePlayer.Inventory.Add(ccase);
                var player = BasePlayer.FindByID(userID);
                Puts($"{(player == null ? userID.ToString() : player.displayName)} получил кейс {ccase} в размере {amount} шт.");
                if (player != null) SendReply(player, Messages["givePlayerCase"], ccase);
                if (caseQueue.Amount == 0) {
                    instance.Puts($"{(player == null ? userID.ToString() : player.displayName)} перестал получать кейс с {ccase}");
                    return true;
                }
            }
            return false;
        }
        void GiveCaseGift(ulong userID, string ccase, int amount) {
            CasePlayer casePlayer;
            if (!players.TryGetValue(userID, out casePlayer)) {
                casePlayer = new CasePlayer();
                players.Add(userID, casePlayer);
            }
            Case cCase = casePlayer.CasesQueue.FirstOrDefault(c => c.Type == ccase);
            if (cCase == null) {
                cCase = new Case() {
                    Amount = amount, Type = ccase, CoolDown = 0
                }
                ;
                casePlayer.CasesQueue.Add(cCase);
            }
            else cCase.Amount += amount;
            casePlayer.giftcases = true;
            SaveData();
            GiveCase(userID, ccase);
        }
        bool OpenCase(BasePlayer player, string ccase) {
            CasePlayer casePlayer;
            if (players.TryGetValue(player.userID, out casePlayer) && casePlayer.Inventory.Contains(ccase)) {
                if (!CanTake(player)) {
                    SendReply(player, Messages["invFull"]);
                    return false;
                }
                if (IsDuelPlayer(player)) {
                    return false;
                }
                casePlayer.Inventory.Remove(ccase);
                var item = cases[ccase].Items.GetRandom();
                var amount = item.GetRandom();
                player.inventory.GiveItem(ItemManager.CreateByName(item.Shortname, amount, 0));
                var x = ItemManager.CreateByPartialName(item.Shortname);
                SendReply(player, Messages["openCases"], cases[ccase].Name, x.info.displayName.english, amount);
                SaveData();
                return true;
            }
            return false;
        }
        bool CanTake(BasePlayer player) => !player.inventory.containerMain.IsFull() || !player.inventory.containerBelt.IsFull();
        public static string FormatTime(TimeSpan time) {
            string result = string.Empty;
            if (time.Days != 0) result += $"{Format(time.Days, "дней", "дня", "день")} ";
            if (time.Hours != 0) result += $"{Format(time.Hours, "часов", "часа", "час")} ";
            if (time.Minutes != 0) result += $"{Format(time.Minutes, "минут", "минуты", "минута")} ";
            return result;
        }
        private static string Format(int units, string form1, string form2, string form3) {
            var tmp = units % 10;
            if (units >= 5 && units <= 20 || tmp >= 5 && tmp <= 9) return $"{units} {form1}";
            if (tmp >= 2 && tmp <= 4) return $"{units} {form2}";
            return $"{units} {form3}";
        }
#endregion
#region UI
        string GUI = "[{\"name\":\"randomcase_menu\",\"parent\":\"Hud\",\"components\":[{\"type\":\"UnityEngine.UI.RawImage\",\"sprite\":\"Assets/Content/UI/UI.Background.Tile.psd\",\"color\":\"0.1647059 0.1254902 0.3372549 0.8527624\"},{\"type\":\"NeedsCursor\"},{\"type\":\"RectTransform\",\"anchormin\":\"0.1 0.2591146\",\"anchormax\":\"0.9 0.8541666\",\"offsetmin\":\"0 0\",\"offsetmax\":\"1 1\"}]},{\"name\":\"randomcase_list\",\"parent\":\"randomcase_menu\",\"components\":[{\"type\":\"UnityEngine.UI.RawImage\",\"sprite\":\"Assets/Content/UI/UI.Background.Tile.psd\",\"color\":\"0 0 0 0.301601\"},{\"type\":\"RectTransform\",\"anchormin\":\"0 0.3934355\",\"anchormax\":\"0.998 0.8973742\",\"offsetmin\":\"0 0\",\"offsetmax\":\"1 1\"}]},{\"name\":\"randomcase.title_bp\",\"parent\":\"randomcase_menu\",\"components\":[{\"type\":\"UnityEngine.UI.RawImage\",\"sprite\":\"Assets/Content/UI/UI.Background.Tile.psd\",\"color\":\"0 0.3803922 0.4 0\"},{\"type\":\"RectTransform\",\"anchormin\":\"0 0.917\",\"anchormax\":\"1 1\",\"offsetmin\":\"0 0\",\"offsetmax\":\"1 1\"}]},{\"name\":\"randomcase.title.text\",\"parent\":\"randomcase.title_bp\",\"components\":[{\"type\":\"UnityEngine.UI.Text\",\"text\":\"{title}\",\"fontSize\":30,\"align\":\"MiddleCenter\"},{\"type\":\"UnityEngine.UI.Outline\",\"color\":\"0 0 0 0.1019608\",\"distance\":\"0.5 -0.5\"},{\"type\":\"RectTransform\",\"anchormin\":\"0 0\",\"anchormax\":\"1 1\",\"offsetmin\":\"0 0\",\"offsetmax\":\"1 1\"}]},{\"name\":\"randomcase_info\",\"parent\":\"randomcase_menu\",\"components\":[{\"type\":\"UnityEngine.UI.RawImage\",\"sprite\":\"Assets/Content/UI/UI.Background.Tile.psd\",\"color\":\"1 1 1 0\"},{\"type\":\"RectTransform\",\"anchormin\":\"0 0\",\"anchormax\":\"1 0.3785851\",\"offsetmin\":\"0 0\",\"offsetmax\":\"1 1\"}]},{\"name\":\"server.logo\",\"parent\":\"randomcase_info\",\"components\":[{\"type\":\"UnityEngine.UI.RawImage\",\"sprite\":\"Assets/Content/UI/UI.Background.Tile.psd\",\"color\":\"1 1 1 0.5468885\",\"png\":\"{server_logo}\"},{\"type\":\"RectTransform\",\"anchormin\":\"0.5979137 0.07877916\",\"anchormax\":\"0.9849928 0.9221781\",\"offsetmin\":\"0 0\",\"offsetmax\":\"1 1\"}]},{\"name\":\"GUIText.randomcase\",\"parent\":\"randomcase_info\",\"components\":[{\"type\":\"UnityEngine.UI.RawImage\",\"sprite\":\"Assets/Content/UI/UI.Background.Tile.psd\",\"color\":\"1 1 1 0\"},{\"type\":\"RectTransform\",\"anchormin\":\"0.005856483 0.02889946\",\"anchormax\":\"0.5896779 0.9768029\",\"offsetmin\":\"0 0\",\"offsetmax\":\"1 1\"}]},{\"name\":\"GUITEXT.customcase\",\"parent\":\"GUIText.randomcase\",\"components\":[{\"type\":\"UnityEngine.UI.Text\",\"text\":\"{customtext}\",\"fontSize\":17,\"align\":\"MiddleCenter\"},{\"type\":\"RectTransform\",\"anchormin\":\"0 0\",\"anchormax\":\"1 1\"}]},{\"name\":\"randomcase_menuClose\",\"parent\":\"randomcase_menu\",\"components\":[{\"type\":\"UnityEngine.UI.Button\",\"command\":\"casesmenuclose\",\"color\":\"0.1647059 0.1254902 0.3372549 0.8196079\"},{\"type\":\"RectTransform\",\"anchormin\":\"0.95 0.9\",\"anchormax\":\"0.998 0.998\",\"offsetmin\":\"0 0\",\"offsetmax\":\"1 1\"}]},{\"name\":\"randomcase_X\",\"parent\":\"randomcase_menuClose\",\"components\":[{\"type\":\"UnityEngine.UI.Text\",\"text\":\"X\",\"fontSize\":22,\"align\":\"MiddleCenter\"},{\"type\":\"RectTransform\",\"anchormin\":\"0 0\",\"anchormax\":\"1 1\",\"offsetmin\":\"0 0\",\"offsetmax\":\"1 1\"}]},{\"name\":\"CuiElement\",\"parent\":\"Overlay\",\"components\":[{\"type\":\"RectTransform\",\"anchormin\":\"0.07320644 0.1302083\",\"anchormax\":\"0.1464129 0.2604167\"}]},{\"name\":\"CuiElement\",\"parent\":\"Overlay\",\"components\":[{\"type\":\"RectTransform\",\"anchormin\":\"0.07320644 0.1302083\",\"anchormax\":\"0.1464129 0.2604167\"}]},{\"name\":\"CuiElement\",\"parent\":\"Overlay\",\"components\":[{\"type\":\"RectTransform\",\"anchormin\":\"0.07320644 0.1302083\",\"anchormax\":\"0.1464129 0.2604167\"}]},{\"name\":\"CuiElement\",\"parent\":\"Overlay\",\"components\":[{\"type\":\"RectTransform\",\"anchormin\":\"0.07320644 0.1302083\",\"anchormax\":\"0.1464129 0.2604167\"}]}]";
        string GUIInfo = "[{\"name\":\"randomcase.info.name\",\"parent\":\"randomcase_info\",\"components\":[{\"type\":\"UnityEngine.UI.RawImage\",\"sprite\":\"Assets/Content/UI/UI.Background.Tile.psd\",\"color\":\"0 0 0 0.1137255\"},{\"type\":\"RectTransform\",\"anchormin\":\"0.005 0.02317023\",\"anchormax\":\"0.58 0.9546165\",\"offsetmin\":\"0 0\",\"offsetmax\":\"1 1\"}]},{\"name\":\"randomcase.info.nametitle\",\"parent\":\"randomcase.info.name\",\"components\":[{\"type\":\"UnityEngine.UI.RawImage\",\"sprite\":\"Assets/Content/UI/UI.Background.Tile.psd\",\"color\":\"0 0 0 0.1137255\"},{\"type\":\"RectTransform\",\"anchormin\":\"0 0.78\",\"anchormax\":\"1 1\",\"offsetmin\":\"0 0\",\"offsetmax\":\"1 1\"}]},{\"name\":\"randomcase.info.texttitle\",\"parent\":\"randomcase.info.nametitle\",\"components\":[{\"type\":\"UnityEngine.UI.Text\",\"text\":\"{1}\",\"fontSize\":20,\"align\":\"MiddleCenter\"},{\"type\":\"RectTransform\",\"anchormin\":\"0.2798101 0\",\"anchormax\":\"1 1\",\"offsetmin\":\"0 0\",\"offsetmax\":\"1 1\"}]},{\"name\":\"randomcase.infotext\",\"parent\":\"randomcase.info.name\",\"components\":[{\"type\":\"UnityEngine.UI.Text\",\"text\":\"{desc}\",\"fontSize\":18,\"align\":\"MiddleCenter\"},{\"type\":\"RectTransform\",\"anchormin\":\"0.2942004 0.2636817\",\"anchormax\":\"1 0.8\",\"offsetmin\":\"0 0\",\"offsetmax\":\"1 1\"}]},{\"name\":\"randomcase.info.down\",\"parent\":\"randomcase.info.name\",\"components\":[{\"type\":\"UnityEngine.UI.Button\",\"color\":\"0 0 0 0.1529412\"},{\"type\":\"RectTransform\",\"anchormin\":\"0.28 0\",\"anchormax\":\"1 0.2384105\",\"offsetmin\":\"0 0\",\"offsetmax\":\"1 1\"}]},{\"name\":\"randomcase.info.col\",\"parent\":\"randomcase.info.down\",\"components\":[{\"type\":\"UnityEngine.UI.Button\",\"color\":\"0.1647059 0.1254902 0.3372549 0.3882353\"},{\"type\":\"RectTransform\",\"anchormin\":\"0 0\",\"anchormax\":\"0.5 1\",\"offsetmin\":\"0 0\",\"offsetmax\":\"1 1\"}]},{\"name\":\"randomcase.info.colinfo\",\"parent\":\"randomcase.info.col\",\"components\":[{\"type\":\"UnityEngine.UI.Text\",\"text\":\"Осталось кейсов: {amount} шт.\",\"fontSize\":18,\"align\":\"MiddleCenter\"},{\"type\":\"RectTransform\",\"anchormin\":\"0 0\",\"anchormax\":\"1 1\",\"offsetmin\":\"0 0\",\"offsetmax\":\"1 1\"}]},{\"name\":\"randomcase.info.button\",\"parent\":\"randomcase.info.down\",\"components\":[{\"type\":\"UnityEngine.UI.Button\",\"command\":\"openplayercase {3} {amount}\",\"color\":\"0 0.9568627 1 0.8196079\"},{\"type\":\"RectTransform\",\"anchormin\":\"0.5 0\",\"anchormax\":\"0.997 1\",\"offsetmin\":\"0 0\",\"offsetmax\":\"1 1\"}]},{\"name\":\"randomcase.info.buttontext\",\"parent\":\"randomcase.info.button\",\"components\":[{\"type\":\"UnityEngine.UI.Text\",\"text\":\"Взять\",\"fontSize\":20,\"align\":\"MiddleCenter\"},{\"type\":\"RectTransform\",\"anchormin\":\"0 0\",\"anchormax\":\"1 1\",\"offsetmin\":\"0 0\",\"offsetmax\":\"1 1\"}]},{\"name\":\"randomcase.info.iconm\",\"parent\":\"randomcase.info.name\",\"components\":[{\"type\":\"UnityEngine.UI.RawImage\",\"sprite\":\"Assets/Content/UI/UI.Background.Tile.psd\",\"png\":\"{0}\"},{\"type\":\"RectTransform\",\"anchormin\":\"0 0\",\"anchormax\":\"0.28 0.989071\",\"offsetmin\":\"0 0\",\"offsetmax\":\"1 1\"}]}]";
        //  Слив плагинов server-rust by Apolo YouGame
        string GUIBuyCases = "[{\"name\":\"randomcases_text\",\"parent\":\"randomcase_list\",\"components\":[{\"type\":\"UnityEngine.UI.RawImage\",\"sprite\":\"Assets/Content/UI/UI.Background.Tile.psd\",\"color\":\"0.1647059 0.1254902 0.3372549 0.3\"},{\"type\":\"RectTransform\",\"anchormin\":\"0 0\",\"anchormax\":\"1 1\"}]},{\"name\":\"randomcases_text.text\",\"parent\":\"randomcases_text\",\"components\":[{\"type\":\"UnityEngine.UI.Text\",\"text\":\"{noCases}\",\"fontSize\":23,\"align\":\"MiddleCenter\"},{\"type\":\"RectTransform\",\"anchormin\":\"0 0\",\"anchormax\":\"1 1\"}]}]}]";
        string HandleArgs(string json, params object[] args) {
            for (int i = 0; i < args.Length; i++) json = json.Replace("{" + i + "}", args[i].ToString());
            return json;
        }
        void DrawCaseInfo(BasePlayer player, string ccase1)  //  Слив плагинов server-rust by Apolo YouGame
        {
            CasePlayer casePlayer;
            if (!players.TryGetValue(player.userID, out casePlayer)) {
                SendReply(player, Messages["plNotCases"]);
                return;
            }
            Dictionary<string, int> casesCollapsed = new Dictionary<string, int>();
            foreach (var ccase in casePlayer.Inventory) {
                if (!casesCollapsed.ContainsKey(ccase)) casesCollapsed[ccase] = 0;
                casesCollapsed[ccase]++;
            }
            var amount = casesCollapsed[ccase1];
            if (casesCollapsed == null) return;
            if (amount <= 0) return;
            CuiHelper.DestroyUi(player, "GUITEXT.customcase");
            CuiHelper.DestroyUi(player, "randomcase.info.name");
            CuiHelper.AddUi(player, HandleArgs(GUIInfo, m_FileManager.GetPng($"Icon{ccase1}"), cases[ccase1].Name, 1).Replace("{3}", ccase1).Replace("{desc}", cases[ccase1].Description)  //  Слив плагинов server-rust by Apolo YouGame.Replace("{desc}", cases[ccase1].Description).Replace("{amount}", casesCollapsed[ccase1].ToString()));
        }
        void DrawCases(BasePlayer player, int page) {
            CasePlayer casePlayer;
            CuiHelper.DestroyUi(player, "randomcase_menu");
            CuiHelper.DestroyUi(player, "casescontainer");
            CuiHelper.DestroyUi(player, "casescontainer1");
            CuiHelper.AddUi(player, GUI.Replace("{server_logo}", m_FileManager.GetPng("Serverlogo")).Replace("{title}", Messages["GUITitle"]).Replace("{customtext}", Messages["customText"]));
            if (!players.TryGetValue(player.userID, out casePlayer)) {
                SendReply(player, Messages["plNotCases"]);
                return;
            }
            var container = new CuiElementContainer();
            float gap = -0.005f;
            float width = 0.19f;
            float height = 0.95f;
            float startxBox = 0.035f;
            float startyBox = 1f - height;
            float xmin = startxBox;
            float ymin = startyBox;
            int i = 0;
            var mainPanel = container.Add(new CuiPanel() {
                Image = {
                    Color = "0 0 0 0"
                }
            }
            , "randomcase_list", "casescontainer");
            var mainPanel1 = container.Add(new CuiPanel() {
                Image = {
                    Color = "0 0 0 0"
                }
            }
            , "GUIText.randomcase", "casescontainer1");
            Dictionary<string, int> casesCollapsed = new Dictionary<string, int>();
            foreach (var ccase in casePlayer.Inventory) {
                if (!casesCollapsed.ContainsKey(ccase)) casesCollapsed[ccase] = 0;
                casesCollapsed[ccase]++;
            }
            if (casesCollapsed.Count == 0 && casePlayer.Inventory.Count == 0) {
                if (casePlayer.CasesQueue.Count == 0) {
                    CuiHelper.DestroyUi(player, "casescontainer1");
                    CuiHelper.AddUi(player, GUIBuyCases.Replace("{noCases}", Messages["nogiveCases"]));
                    return;
                }
                CuiHelper.DestroyUi(player, "casescontainer1");
                CuiHelper.AddUi(player, GUIBuyCases.Replace("{noCases}", Messages["endCases"]));
                return;
            }
            if (page == 1) {
                foreach (var ccase in casesCollapsed) {
                    container.Add(new CuiButton() {
                        Button = {
                            Command = $"randomcase.open {ccase.Key}", Color = "0.1647059 0.1254902 0.3372549 0.5"
                        }
                        , RectTransform = {
                            AnchorMin = xmin + " " + ymin, AnchorMax = (xmin + width) + " " + (ymin + height *1), OffsetMax = "-5 -7", OffsetMin = "4 0"
                        }
                        , Text = {
                            Text = $"", Align = TextAnchor.LowerCenter, Color = "1 1 1 1", FontSize = 18
                        }
                    }
                    , mainPanel, $"ui.case.{cases[ccase.Key].Type}");
                    xmin += width + gap;
                    if (xmin + width >= 1) {
                        xmin = startxBox;
                        ymin -= height + gap;
                    }
                    InitilizeKitImageUI(ref container, cases[ccase.Key].Type);
                    i++;
                    if (!cases.ContainsKey(ccase.Key)) {
                        break;
                    }
                    if (i >= 5) {
                        break;
                    }
                }
                if (casesCollapsed.Count > 5) {
                    container.Add(new CuiButton {
                        Button = {
                            Command = "nextpage.case2", Color = "0.1647059 0.1254902 0.3372549 0.6"
                        }
                        , RectTransform = {
                            AnchorMin = "0.965 0.045", AnchorMax = "0.997 0.97"
                        }
                        , Text = {
                            Text = ">", FontSize = 22, Font = "robotocondensed-regular.ttf", Align = TextAnchor.MiddleCenter
                        }
                    }
                    , mainPanel);
                }
                CuiHelper.AddUi(player, container);
                return;
            }
            if (page == 2) {
                var casesCollapsed1 = casesCollapsed.Skip(5);
                foreach (var ccase in casesCollapsed1) {
                    container.Add(new CuiButton() {
                        Button = {
                            Command = $"randomcase.open {ccase.Key}", Color = "0.1647059 0.1254902 0.3372549 0.5"
                        }
                        , RectTransform = {
                            AnchorMin = xmin + " " + ymin, AnchorMax = (xmin + width) + " " + (ymin + height *1), OffsetMax = "-5 -7", OffsetMin = "4 0"
                        }
                        , Text = {
                            Text = $"", Align = TextAnchor.LowerCenter, Color = "1 1 1 1", FontSize = 18
                        }
                    }
                    , mainPanel, $"ui.case.{cases[ccase.Key].Type}");
                    xmin += width + gap;
                    if (xmin + width >= 1) {
                        xmin = startxBox;
                        ymin -= height + gap;
                    }
                    InitilizeKitImageUI(ref container, cases[ccase.Key].Type);
                    i++;
                }
                if (casesCollapsed.Count > 5) {
                    container.Add(new CuiButton {
                        Button = {
                            Command = "nextpage.case1", Color = "0.1647059 0.1254902 0.3372549 0.6"
                        }
                        , RectTransform = {
                            AnchorMin = "0.002 0.045", AnchorMax = "0.035 0.97"
                        }
                        , Text = {
                            Text = "<", FontSize = 20, Font = "robotocondensed-regular.ttf", Align = TextAnchor.MiddleCenter
                        }
                    }
                    , mainPanel);
                }
                CuiHelper.AddUi(player, container);
            }
        }
        private void InitilizeKitImageUI(ref CuiElementContainer container, string ccase) {
            string image = m_FileManager.GetPng($"Icon{ccase}");
            CuiRawImageComponent imageComp = new CuiRawImageComponent {
                Sprite = "assets/content/textures/generic/fulltransparent.tga", Color = "#FFFFFFFF"
            }
            ;
            if (image != string.Empty) {
                imageComp.Png = image;
            }
            container.Add(new CuiElement {
                Parent = $"ui.case.{ccase}", Components = {
                    imageComp, new CuiRectTransformComponent {
                        AnchorMin = "0 0", AnchorMax = "1 1"
                    }
                }
            }
            );
        }
#endregion
#region DATA
        DynamicConfigFile players_File = Interface.Oxide.DataFileSystem.GetFile("RandomCases/RandomCase_Players");
        void LoadData() {
            if (Interface.Oxide.DataFileSystem.ExistsDatafile("RandomCases/RandomCase_Cases")) cases = Interface.Oxide.DataFileSystem.ReadObject<Dictionary<string, CaseDefinition>>("RandomCases/RandomCase_Cases");
            else {
                cases.Add("weapons", new CaseDefinition() {
                    Name = "Оружие", Type = "weapons", Images = "https://i.imgur.com/w9tvRY8.png", Description = "Описание", CoolDown = 43200, Items = new List<CaseItem> {
                        new CaseItem {
                            Shortname = "rifle.ak", Min = 1, Max = 1
                        }
                    }
                }
                );
                cases.Add("resources", new CaseDefinition() {
                    Name = "Ресурсы", Type = "resources", Images = "https://i.imgur.com/w9tvRY8.png", Description = "Описание", CoolDown = 43200, Items = new List<CaseItem> {
                        new CaseItem {
                            Shortname = "rifle.ak", Min = 1, Max = 1
                        }
                    }
                }
                );
                Interface.Oxide.DataFileSystem.WriteObject("RandomCases/RandomCase_Cases", cases);
            }
            try {
                players = players_File.ReadObject<Dictionary<ulong, CasePlayer>>();
            }
            catch {
                players = new Dictionary<ulong, CasePlayer>();
            }
        }
#endregion
#region File Manager
#region LoadIcon
        private GameObject FileManagerObject;
        private FileManager m_FileManager;
        /// <summary>
        /// Инициализация скрипта взаимодействующего с файлами сервера
        /// </summary>
        void InitFileManager() {
            FileManagerObject = new GameObject("MAP_FileManagerObject");
            m_FileManager = FileManagerObject.AddComponent<FileManager>();
        }
        class FileManager : MonoBehaviour {
            int loaded = 0;
            int needed = 0;
            public bool IsFinished => needed == loaded;
            const ulong MaxActiveLoads = 10;
            Dictionary<string, FileInfo> files = new Dictionary<string, FileInfo>();
            //  Слив плагинов server-rust by Apolo YouGame
            private class FileInfo  //  Слив плагинов server-rust by Apolo YouGame
            {
                public string Url;
                public string Png;
            }
            public string GetPng(string name) => files[name].Png;
            public IEnumerator LoadFile(string name, string url, int size = -1) {
                if (files.ContainsKey(name) && files[name].Url == url && !string.IsNullOrEmpty(files[name].Png)) yield break;
                files[name] = new FileInfo() {
                    Url = url
                }
                ;
                //  Слив плагинов server-rust by Apolo YouGame
                needed++;
                yield return StartCoroutine(LoadImageCoroutine(name, url, size));
            }
            IEnumerator LoadImageCoroutine(string name, string url, int size = -1) {
                using (WWW www = new WWW(url)) {
                    yield return www;
                    if (string.IsNullOrEmpty(www.error)) {
                        var bytes = size == -1 ? www.bytes : Resize(www.bytes, size);
                        var entityId = CommunityEntity.ServerInstance.net.ID;
                        var crc32 = FileStorage.server.Store(bytes, FileStorage.Type.png, entityId).ToString();
                        files[name].Png = crc32;
                    }
                }
                loaded++;
                instance.init = true;
            }
            static byte[] Resize(byte[] bytes, int size) {
                Image img = (Bitmap)(new ImageConverter().ConvertFrom(bytes));
                Bitmap cutPiece = new Bitmap(size, size);
                System.Drawing.Graphics graphic = System.Drawing.Graphics.FromImage(cutPiece);
                graphic.DrawImage(img, new Rectangle(0, 0, size, size), 0, 0, img.Width, img.Height, GraphicsUnit.Pixel);
                graphic.Dispose();
                MemoryStream ms = new MemoryStream();
                cutPiece.Save(ms, ImageFormat.Jpeg);
                return ms.ToArray();
            }
        }
#endregion
#endregion
#region LOCALIZATION
        Dictionary<string, string> Messages = new Dictionary<string, string>() {
            {
                "GUITitle", "ВАШИ СОБРАННЫЕ КЕЙСЫ"
            }
            , {
                "givePlayerCase", "Вы получили кейс {0}"
            }
            , {
                "isHaveCases", "У вас есть не открытые кейсы!\nЧтобы их открыть наберите команду <color=#fee3b4>/case</color>"
            }
            , {
                "plInit", "В данный момент кейсы не активны"
            }
            , {
                "invFull", "У вас переполнен инвентарь!"
            }
            , {
                "openCases", "Вы открыли кейс {0}, и получили: {1} - {2} шт."
            }
            , {
                "plNotCases", "У вас нет кейсов"
            }
            , {
                "endCases", "У Вас закончились кейсы =("
            }
            , {
                "nogiveCases", "У Вас нету кейсов =(\nКупить вы их сможете в магазине сервера <color=#fee3b4>rust.facepunch.com</color>"
            }
            , {
                "customText", "Здесь текст!\nНу или информация о том как получить кейсы\nТекст вы сможете изменить в lang"
            }
            ,
        }
        ;
#endregion
    }
}

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