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

FREE IQCraftSystem : 0.0.8 0.0.8

Нет прав для скачивания
C#:
using Newtonsoft.Json;
using System.Collections.Generic;
using Oxide.Core.Plugins;
using System.Linq;
using System;
using System.Text;
using UnityEngine;
using Oxide.Game.Rust.Cui;
using System.Collections;
namespace Oxide.Plugins {
    [Info("IQCraftSystem", "https://topplugin.ru/ / https://discord.com/invite/5DPTsRmd3G", "0.0.8")]
    [Description("Удобная система крафта")]
    class IQCraftSystem : RustPlugin {
        /// <summary>
        /// Обновление 0.0.4
        /// - Исправлена подгрузка иконок для крафта
        /// Обновление 0.0.5
        /// - Исправил снятие баланса при крафте с использованием IQEconomic
        /// Обновление 0.0.6
        /// - Исправил проблему с крафтом предметов в условии которых есть прдемет со SkinID
        /// - Исправил проблему когда при смене категорий учмитывалась страница старых категорий
        /// - Изменен метод отрисовки категорий
        /// - Добавлена возможность отключать каждую категорию
        /// - Добавлено удаление всего UI при выгрузке плагина
        /// - Добавлена возможность крафта предметов по пермишенсу
        /// - Добавлена перезарядка на крафт предмета
        /// - Добавил обводку текста в требываемых предметах для крафта
        /// Обновление 0.0.7
        /// - Поправил метод с крафтом предмета
        ///
#region Reference
        [PluginReference]
        Plugin ImageLibrary, IQEconomic, IQPlagueSkill, IQRankSystem;
#region ImageLibrary
        private string GetImage(string fileName, ulong skin = 0) {
            var imageId = (string)plugins.Find("ImageLibrary").CallHook("GetImage", fileName, skin);
            if (!string.IsNullOrEmpty(imageId)) return imageId;
            return string.Empty;
        }
        public bool AddImage(string url, string shortname, ulong skin = 0) => (bool)ImageLibrary?.Call("AddImage", url, shortname, skin);
        public void SendImage(BasePlayer player, string imageName, ulong imageId = 0) => ImageLibrary?.Call("SendImage", player, imageName, imageId);
        public bool HasImage(string imageName) => (bool)ImageLibrary?.Call("HasImage", imageName);
#endregion
#region IQEconomic
        int IQEconomicGetBalance(ulong userID) => (int)IQEconomic?.Call("API_GET_BALANCE", userID);
        void IQEconomicRemoveBalance(ulong userID, int Balance) => IQEconomic?.Call("API_REMOVE_BALANCE", userID, Balance);
#endregion
#region IQPlagueSkill
        bool IQPlagueSkillISAdvanced(BasePlayer player) => (bool)IQPlagueSkill?.Call("API_IS_ADVANCED_CRAFT", player);
#endregion
#region IQRankSystem
        bool IQRankSystemAvaliability(BasePlayer player, string RankKey) => (bool)IQRankSystem?.Call("API_GET_AVAILABILITY_RANK_USER", player.userID, RankKey);
        string IQRankSystemGetName(string RankKey) => (string)IQRankSystem?.Call("API_GET_RANK_NAME", RankKey);
        bool IQRankRankReality(string RankKey) => (bool)IQRankSystem?.Call("API_IS_RANK_REALITY", RankKey);
#endregion
#endregion
#region Vars
        string CustomItemShortname = "electric.flasherlight";
        public Dictionary<BasePlayer, int> PagePlayers = new Dictionary<BasePlayer, int>();
        Dictionary<BasePlayer, CategoryItem> CategoryActive = new Dictionary<BasePlayer, CategoryItem>();
        public enum CategoryItem {
            Weapon, Tools, Construction, Items, Attirie, Electrical, Transport, Fun, Custom, Entity, All
        }
#endregion
#region Data
        [JsonProperty("Информация о крафте")]
        public Hash<ulong, DataCraft> DataCrafts = new Hash<ulong, DataCraft>();
        public class DataCraft {
            [JsonProperty("Информация о предметах")]
            public Dictionary<String, Int32> CooldownCraft = new Dictionary<String, Int32>();
        }
        void ReadData() {
            DataCrafts = Oxide.Core.Interface.Oxide.DataFileSystem.ReadObject<Hash<ulong, DataCraft>>("IQCraftSystem/CraftUsers");
        }
        void WriteData() {
            Oxide.Core.Interface.Oxide.DataFileSystem.WriteObject("IQCraftSystem/CraftUsers", DataCrafts);
        }
        void RegisteredDataUser(ulong player) {
            Boolean IsUsedCooldonw = config.ItemSetting.Count(x => x.Value.Cooldown > 0) != 0;
            if (!IsUsedCooldonw) return;
            if (!DataCrafts.ContainsKey(player)) DataCrafts.Add(player, new DataCraft {
                CooldownCraft = new Dictionary<string, int> {
                }
            }
            );
        }
#endregion
#region Configuration
        private static Configuration config = new Configuration();
        private class Configuration {
            [JsonProperty("Настройка интерфейса плагина")]
            public InterfaceSettings InterfaceSetting = new InterfaceSettings();
            [JsonProperty("Настройка предметов, которые возможно скрафтить")]
            public Dictionary<string, ItemSettings> ItemSetting = new Dictionary<string, ItemSettings>();
#region ItemSettings
            internal class ItemSettings {
                [JsonProperty("Перезарядка на крафт предмета (Если она не нужна, поставьте значение 0")]
                public Int32 Cooldown;
                [JsonProperty("Права для доступа к этому крафту (оставьте поле пустым - будет доступно всем)")]
                public String Permission;
                [JsonProperty("К какой категории относится данный предмет : 0 - Оружие, 1 - Инструменты, 2 - Конструкции, 3 - Итемы, 4 - Одежда, 5 - Электричество, 6 - Транспорт, 7 - Фановые, 8 - Кастомные(команды), 9 - Иные(Крафтит префабы и предметы по типу Переработчика)")]
                public CategoryItem CategoryItems;
                [JsonProperty("Отображаемое имя")]
                public string DisplayName;
                [JsonProperty("Описание (Необязательно)")]
                public string Description;
                [JsonProperty("Shortname (Подходит ко всем категориям КРОМЕ : 6 - Транспорт и 8 - Кастомные(команды) и 9 - Иные(Крафтит префабы и предметы по типу Переработчика)")]
                public string Shortname;
                [JsonProperty("SkinID (Подходит ко всем категориям (Если вы используете категорию 6 - Транспорт или - 9 - Иные , обязательно устанавливайте SkinID для иконки)")]
                public ulong SkinID;
                [JsonProperty("PNG (Подходит только к категории : 6 - Транспорт и 8 - Кастомные(команды) и 9 - Иные(Крафтит префабы и предметы по типу Переработчика))")]
                public string PNG;
                [JsonProperty("Команда (Подходит только к категории : 8 - Кастомные(команды) %STEAMID% - заменится на Steam64ID игрока)")]
                public string Command;
                [JsonProperty("Префаб для транспорта (Подходит только к категории 6 - Транспорт)")]
                public string PrefabNameTransport;
                [JsonProperty("Префаб для предметов (Подходит только к категории 9 - Иные(Крафтит префабы и предметы по типу Переработчика))")]
                public string PrefabEntity;
                [JsonProperty("Какой уровень верстака требуется для крафта нужен, если верстак не требуется, установите 0")]
                public int WorkBenchLevel;
                [JsonProperty("IQEconomic : Сколько требуется валюты для крафта данного предмета(Устновите 0 если не требуется)")]
                public int IQEconomicPrice;
                [JsonProperty("IQPlagueSkill : Требуется ли нейтральный навык в IQPlagueSkill для крафта данного предмета(true - да/false - нет)")]
                public bool IQPlagueSkillCraft;
                [JsonProperty("IQRankSystem : Укажите ранг, который требуется для крафта данного предмета(Если не нужно, оставьте поле пустым)")]
                public string IQRankSystemRank;
                [JsonProperty("Список предметов требующихся для крафта")]
                public List<ItemForCraft> ItemListForCraft = new List<ItemForCraft>();
                internal class ItemForCraft {
                    [JsonProperty("Shortname")]
                    public string Shortname;
                    [JsonProperty("Количество")]
                    public int Amount;
                    [JsonProperty("SkinID если требуется")]
                    public ulong SkinID;
                    [JsonProperty("PNG для кастомных предметов (не забудьте установить SkinID)")]
                    public string PNG;
                }
            }
#endregion
#region Interface
            internal class InterfaceSettings {
                [JsonProperty("Основные настройки")]
                public GeneralSettings GeneralSetting = new GeneralSettings();
                [JsonProperty("Настройка категорий")]
                public CategorySettings CategorySetting = new CategorySettings();
                [JsonProperty("Настройка требований")]
                public RequiresSettings RequiresSetting = new RequiresSettings();
                internal class GeneralSettings {
                    [JsonProperty("Ссылка на картинку выбранного предмета")]
                    public string PNGActive;
                    [JsonProperty("Ссылка на картинку не выбранного предмета")]
                    public string PNGInActive;
                    [JsonProperty("Ссылка на логотип в меню крафта")]
                    public string PNGLogo;
                    [JsonProperty("Ссылка на картинку закрытия")]
                    public string PNGCloseButton;
                    [JsonProperty("HEX Заднего фона главного меню")]
                    public string HexBackground;
                    [JsonProperty("HEX Кнопки СОЗДАТЬ")]
                    public string HexButtonCreate;
                }
                internal class RequiresSettings {
                    [JsonProperty("HEX : Цвет если требование выполнено")]
                    public string RequiresDoTrueColor;
                    [JsonProperty("HEX : Цвет если требование не выполнено")]
                    public string RequiresDoFalseColor;
                    [JsonProperty("Символ выполненного требования")]
                    public string RequiresDoTrue;
                    [JsonProperty("HEX : Цвет если условие не требования")]
                    public string RequiresDoFalse;
                    [JsonProperty("PNG : Иконка для требования верстака")]
                    public string PNGRequiresWorckbench;
                    [JsonProperty("PNG : Иконка для требования валюты с IQEconomic")]
                    public string PNGRequiresIQEconomic;
                    [JsonProperty("PNG : Иконка для требования ранга с IQRankSystem")]
                    public string PNGRequiresIQRankSystem;
                    [JsonProperty("PNG : Иконка для требования навыка с IQPlagueSkill")]
                    public string PNGRequiresIQPlagueSkill;
                }
                internal class CategorySettings {
                    [JsonProperty("Настройка цветов не выбранных иконок под каждую категорию")]
                    public ColorCategoryIcon ColorCategoryIcons = new ColorCategoryIcon();
                    [JsonProperty("Настройка PNG иконок категорий")]
                    public PNGCategoryIcon PNGCategoryIcons = new PNGCategoryIcon();
                    [JsonProperty("Включения и отключения категорий")]
                    public TurnedCategory TurnedCategorys = new TurnedCategory();
                    internal class PNGCategoryIcon {
                        [JsonProperty("PNG : Иконка категории всех предметов")]
                        public string PNGAll;
                        [JsonProperty("PNG : Иконка категории оружия")]
                        public string PNGWeapon;
                        [JsonProperty("PNG : Иконка категории инструментов")]
                        public string PNGTools;
                        [JsonProperty("PNG : Иконка категории конструкций")]
                        public string PNGConstruction;
                        [JsonProperty("PNG : Иконка категории предметов")]
                        public string PNGItems;
                        [JsonProperty("PNG : Иконка категории одежды")]
                        public string PNGAttirie;
                        [JsonProperty("PNG : Иконка категории электрики")]
                        public string PNGElectrical;
                        [JsonProperty("PNG : Иконка категории транспорта")]
                        public string PNGTransport;
                        [JsonProperty("PNG : Иконка категории фана")]
                        public string PNGFun;
                        [JsonProperty("PNG : Иконка кастомных предметов")]
                        public string PNGCustom;
                    }
                    internal class ColorCategoryIcon {
                        [JsonProperty("HEX : Цвет панели с предметом категории всех предметов")]
                        public string AllItemsColor;
                        [JsonProperty("HEX : Цвет панели с предметом категории оружий")]
                        public string WeaponColor;
                        [JsonProperty("HEX : Цвет панели с предметом категории интсрументов")]
                        public string ToolsColor;
                        [JsonProperty("HEX : Цвет панели с предметом категории конструкций")]
                        public string ConstructionColor;
                        [JsonProperty("HEX : Цвет панели с предметом категории предметов")]
                        public string ItemsColor;
                        [JsonProperty("HEX : Цвет панели с предметом категории одежды")]
                        public string AttirieColor;
                        [JsonProperty("HEX : Цвет панели с предметом категории электрики")]
                        public string ElectricalColor;
                        [JsonProperty("HEX : Цвет панели с предметом категории транспорта")]
                        public string TransportColor;
                        [JsonProperty("HEX : Цвет панели с предметом категории фана")]
                        public string FunColor;
                        [JsonProperty("HEX : Цвет панели с предметом категории кастомных предметов")]
                        public string CustomColor;
                    }
                    internal class TurnedCategory {
                        [JsonProperty("Включить категорию оружие?")]
                        public Boolean TurnWeapon;
                        [JsonProperty("Включить категории инструментов")]
                        public Boolean TurnTools;
                        [JsonProperty("Включить категории конструкций")]
                        public Boolean TurnConstruction;
                        [JsonProperty("Включить категории предметов")]
                        public Boolean TurnItems;
                        [JsonProperty("Включить категории одежды")]
                        public Boolean TurnAttirie;
                        [JsonProperty("Включить категории электрики")]
                        public Boolean TurnElectrical;
                        [JsonProperty("Включить категории транспорта")]
                        public Boolean TurnTransport;
                        [JsonProperty("Включить категории фана")]
                        public Boolean TurnFun;
                        [JsonProperty("Включить кастомных предметов")]
                        public Boolean TurnCustom;
                    }
                }
            }
#endregion
            public static Configuration GetNewConfiguration() {
                return new Configuration {
#region Interface
                    InterfaceSetting = new InterfaceSettings {
                        GeneralSetting = new InterfaceSettings.GeneralSettings {
                            PNGActive = "https://i.imgur.com/46KFe3X.png", PNGInActive = "https://i.imgur.com/31iuKXn.png", PNGLogo = "https://i.imgur.com/K29MfYR.png", PNGCloseButton = "https://i.imgur.com/mirRxLy.png", HexBackground = "#0C0C0C95", HexButtonCreate = "#C35F2FFF",
                        }
                        , RequiresSetting = new InterfaceSettings.RequiresSettings {
                            RequiresDoFalse = "×", RequiresDoTrue = "✓", RequiresDoFalseColor = "#FF3366", RequiresDoTrueColor = "#CCFFCC", PNGRequiresIQEconomic = "https://i.imgur.com/q0UjhJJ.png", PNGRequiresIQPlagueSkill = "https://i.imgur.com/f3isgi4.png", PNGRequiresIQRankSystem = "https://i.imgur.com/0ZFPmrZ.png", PNGRequiresWorckbench = "https://i.imgur.com/bxG5ofY.png",
                        }
                        , CategorySetting = new InterfaceSettings.CategorySettings {
                            PNGCategoryIcons = new InterfaceSettings.CategorySettings.PNGCategoryIcon {
                                PNGAll = "https://i.imgur.com/V1dUiuy.png", PNGWeapon = "https://i.imgur.com/XwDBNoW.png", PNGAttirie = "https://i.imgur.com/F25qevg.png", PNGConstruction = "https://i.imgur.com/WPG9YMb.png", PNGCustom = "https://i.imgur.com/jyobxIs.png", PNGElectrical = "https://i.imgur.com/7bYVThO.png", PNGFun = "https://i.imgur.com/iWQLRa5.png", PNGItems = "https://i.imgur.com/Rucen7r.png", PNGTools = "https://i.imgur.com/XJzPl6z.png", PNGTransport = "https://i.imgur.com/M9BsGiI.png",
                            }
                            , ColorCategoryIcons = new InterfaceSettings.CategorySettings.ColorCategoryIcon {
                                AllItemsColor = "#DECADEFF", AttirieColor = "#59A27AFF", ConstructionColor = "#B4D455FF", CustomColor = "#9077E2FF", ElectricalColor = "#00DDDDFF", FunColor = "#FFAABBFF", ItemsColor = "#FF2288FF", ToolsColor = "#EE3B00FF", TransportColor = "#D395FFFF", WeaponColor = "#7F4EFFFF",
                            }
                            ,
                        }
                        ,
                    }
                    ,
#endregion
#region ItemSetting
                    ItemSetting = new Dictionary<string, ItemSettings> {
                        ["ak47"]
                        = new ItemSettings {
                            CategoryItems = CategoryItem.Weapon, Permission = "iqcraftsystem.ak47", Cooldown = 0, Command = "", Description = "Хорошее оружие для стрельбы на дальние и средние дистанции", DisplayName = "АК-47", PNG = "", PrefabEntity = "", PrefabNameTransport = "", Shortname = "rifle.ak", SkinID = 0, WorkBenchLevel = 0, IQEconomicPrice = 0, IQRankSystemRank = "", IQPlagueSkillCraft = false, ItemListForCraft = new List<ItemSettings.ItemForCraft> {
                                new ItemSettings.ItemForCraft {
                                    Shortname = "wood", Amount = 500, PNG = "", SkinID = 0
                                }
                                , new ItemSettings.ItemForCraft {
                                    Shortname = "scrap", Amount = 15, PNG = "", SkinID = 0
                                }
                                , new ItemSettings.ItemForCraft {
                                    Shortname = "explosives", Amount = 1, PNG = "", SkinID = 0
                                }
                                , new ItemSettings.ItemForCraft {
                                    Shortname = "metal.refined", Amount = 100, PNG = "", SkinID = 0
                                }
                                ,
                            }
                        }
                        , ["jackhammer"] = new ItemSettings {
                            CategoryItems = CategoryItem.Tools, Permission = "", Cooldown = 5000, Command = "", Description = "", DisplayName = "Jackhammer", PNG = "", PrefabEntity = "", PrefabNameTransport = "", Shortname = "jackhammer", SkinID = 0, WorkBenchLevel = 1, IQEconomicPrice = 0, IQRankSystemRank = "", IQPlagueSkillCraft = false, ItemListForCraft = new List<ItemSettings.ItemForCraft> {
                                new ItemSettings.ItemForCraft {
                                    Shortname = "wood", Amount = 500, PNG = "", SkinID = 0
                                }
                                , new ItemSettings.ItemForCraft {
                                    Shortname = "scrap", Amount = 15, PNG = "", SkinID = 0
                                }
                                , new ItemSettings.ItemForCraft {
                                    Shortname = "explosives", Amount = 1, PNG = "", SkinID = 0
                                }
                                , new ItemSettings.ItemForCraft {
                                    Shortname = "metal.refined", Amount = 100, PNG = "", SkinID = 0
                                }
                                ,
                            }
                        }
                        , ["hazmatsuit"] = new ItemSettings {
                            CategoryItems = CategoryItem.Attirie, Permission = "", Cooldown = 0, Command = "", Description = "", DisplayName = "Хазмат", PNG = "", PrefabEntity = "", PrefabNameTransport = "", Shortname = "hazmatsuit", SkinID = 0, WorkBenchLevel = 3, IQEconomicPrice = 0, IQRankSystemRank = "", IQPlagueSkillCraft = false, ItemListForCraft = new List<ItemSettings.ItemForCraft> {
                                new ItemSettings.ItemForCraft {
                                    Shortname = "metal.refined", Amount = 100, PNG = "", SkinID = 0
                                }
                                ,
                            }
                        }
                        , ["floor.ladder.hatch"] = new ItemSettings {
                            CategoryItems = CategoryItem.Construction, Permission = "", Cooldown = 0, Command = "", Description = "Удобно спргынуть и не вернуться", DisplayName = "Люк", PNG = "", PrefabEntity = "", PrefabNameTransport = "", Shortname = "floor.ladder.hatch", SkinID = 0, WorkBenchLevel = 1, IQEconomicPrice = 0, IQRankSystemRank = "", IQPlagueSkillCraft = false, ItemListForCraft = new List<ItemSettings.ItemForCraft> {
                                new ItemSettings.ItemForCraft {
                                    Shortname = "metal.refined", Amount = 100, PNG = "", SkinID = 0
                                }
                                ,
                            }
                        }
                        , ["privilegy3d"] = new ItemSettings {
                            CategoryItems = CategoryItem.Custom, Permission = "", Cooldown = 0, Command = "say GivePrivilegy", Description = "Целая привилегия на 3 целых дня, самый лучший вариант", DisplayName = "ПРИВИЛЕГИЯ 3 ДНЯ", PNG = "https://i.imgur.com/vLCj3kO.png", PrefabEntity = "", PrefabNameTransport = "", Shortname = "", SkinID = 0, WorkBenchLevel = 1, IQEconomicPrice = 0, IQRankSystemRank = "", IQPlagueSkillCraft = false, ItemListForCraft = new List<ItemSettings.ItemForCraft> {
                                new ItemSettings.ItemForCraft {
                                    Shortname = "metal.refined", Amount = 100, PNG = "", SkinID = 0
                                }
                                , new ItemSettings.ItemForCraft {
                                    Shortname = "metal.refined", Amount = 100, PNG = "", SkinID = 0
                                }
                                , new ItemSettings.ItemForCraft {
                                    Shortname = "metal.refined", Amount = 100, PNG = "", SkinID = 0
                                }
                                , new ItemSettings.ItemForCraft {
                                    Shortname = "metal.refined", Amount = 100, PNG = "", SkinID = 0
                                }
                                ,
                            }
                        }
                        , ["turret"] = new ItemSettings {
                            CategoryItems = CategoryItem.Electrical, Permission = "", Cooldown = 0, Command = "", Description = "", DisplayName = "Турель", PNG = "", PrefabEntity = "", PrefabNameTransport = "", Shortname = "autoturret", SkinID = 0, WorkBenchLevel = 1, IQEconomicPrice = 0, IQRankSystemRank = "", IQPlagueSkillCraft = false, ItemListForCraft = new List<ItemSettings.ItemForCraft> {
                                new ItemSettings.ItemForCraft {
                                    Shortname = "metal.refined", Amount = 100, PNG = "", SkinID = 0
                                }
                                ,
                            }
                        }
                        , ["tree"] = new ItemSettings {
                            CategoryItems = CategoryItem.Entity, Permission = "", Cooldown = 0, Command = "", Description = "Возьми и всади дерево", DisplayName = "Дерево", PNG = "https://i.imgur.com/XnuUmyZ.png", PrefabEntity = "assets/bundled/prefabs/autospawn/resource/v2_temp_forest/pine_c.prefab", PrefabNameTransport = "", Shortname = "", SkinID = 1337, WorkBenchLevel = 1, IQEconomicPrice = 0, IQRankSystemRank = "", IQPlagueSkillCraft = false, ItemListForCraft = new List<ItemSettings.ItemForCraft> {
                                new ItemSettings.ItemForCraft {
                                    Shortname = "wood", Amount = 100, PNG = "", SkinID = 0
                                }
                                ,
                            }
                        }
                        , ["firewerk"] = new ItemSettings {
                            CategoryItems = CategoryItem.Fun, Permission = "", Cooldown = 0, Command = "", Description = "Взорвик небо", DisplayName = "Фейверк", PNG = "", PrefabEntity = "", PrefabNameTransport = "", Shortname = "firework.romancandle.red", SkinID = 0, WorkBenchLevel = 1, IQEconomicPrice = 0, IQRankSystemRank = "", IQPlagueSkillCraft = false, ItemListForCraft = new List<ItemSettings.ItemForCraft> {
                                new ItemSettings.ItemForCraft {
                                    Shortname = "wood", Amount = 100, PNG = "", SkinID = 0
                                }
                                ,
                            }
                        }
                        , ["swetilnik"] = new ItemSettings {
                            CategoryItems = CategoryItem.Items, Permission = "", Cooldown = 0, Command = "", Description = "", DisplayName = "Светилка на стенку", PNG = "", PrefabEntity = "", PrefabNameTransport = "", Shortname = "xmas.lightstring", SkinID = 0, WorkBenchLevel = 1, IQEconomicPrice = 0, IQRankSystemRank = "", IQPlagueSkillCraft = false, ItemListForCraft = new List<ItemSettings.ItemForCraft> {
                                new ItemSettings.ItemForCraft {
                                    Shortname = "wood", Amount = 100, PNG = "", SkinID = 0
                                }
                                ,
                            }
                        }
                        , ["copter"] = new ItemSettings {
                            CategoryItems = CategoryItem.Transport, Permission = "", Cooldown = 0, Command = "", Description = "", DisplayName = "Коптер", PNG = "https://i.imgur.com/kC8tfXF.png", PrefabEntity = "", PrefabNameTransport = "assets/content/vehicles/minicopter/minicopter.entity.prefab", Shortname = "", SkinID = 3333, WorkBenchLevel = 1, IQEconomicPrice = 0, IQRankSystemRank = "", IQPlagueSkillCraft = false, ItemListForCraft = new List<ItemSettings.ItemForCraft> {
                                new ItemSettings.ItemForCraft {
                                    Shortname = "wood", Amount = 100, PNG = "", SkinID = 0
                                }
                                ,
                            }
                        }
                        ,
                    }
                    ,
#endregion
                }
                ;
            }
        }
        protected override void LoadConfig() {
            base.LoadConfig();
            try {
                config = Config.ReadObject<Configuration>();
                if (config == null) LoadDefaultConfig();
            }
            catch {
                PrintWarning($"Ошибка чтения #57 конфигурации 'oxide/config/{Name}', создаём новую конфигурацию!!");
                LoadDefaultConfig();
            }
            NextTick(SaveConfig);
        }
        protected override void LoadDefaultConfig() => config = Configuration.GetNewConfiguration();
        protected override void SaveConfig() => Config.WriteObject(config);
#endregion
#region Metods
#region Cooldown Craft
        public void SetCooldown(BasePlayer player, String KeyItem) {
            Int32 Cooldown = Convert.ToInt32(config.ItemSetting[KeyItem].Cooldown + CurrentTime());
            if (Cooldown - CurrentTime() <= 1) return;
            if (!DataCrafts.ContainsKey(player.userID)) RegisteredDataUser(player.userID);
            if (!DataCrafts[player.userID].CooldownCraft.ContainsKey(KeyItem)) DataCrafts[player.userID].CooldownCraft.Add(KeyItem, Cooldown);
            else DataCrafts[player.userID].CooldownCraft[KeyItem] = Cooldown;
        }
        public String GetCooldown(BasePlayer player, String KeyItem) {
            String ResultCooldown = FormatTime(TimeSpan.FromSeconds(GetCooldownTime(DataCrafts[player.userID].CooldownCraft[KeyItem])), player.UserIDString);
            return ResultCooldown;
        }
        public Boolean IsCooldown(BasePlayer player, String KeyItem) {
            if (!DataCrafts.ContainsKey(player.userID)) {
                RegisteredDataUser(player.userID);
                return false;
            }
            if (!DataCrafts[player.userID].CooldownCraft.ContainsKey(KeyItem)) return false;
            if(GetCooldownTime(DataCrafts[player.userID].CooldownCraft[KeyItem]) > 0) return true;
            else {
                DataCrafts[player.userID].CooldownCraft.Remove(KeyItem);
                return false;
            }
        }
        public Double GetCooldownTime(Int32 Cooldown) => (Cooldown - CurrentTime());
        static readonly DateTime epoch = new DateTime(1970, 1, 1, 0, 0, 0);
        static Double CurrentTime() {
            return DateTime.UtcNow.Subtract(epoch).TotalSeconds;
        }
        public String FormatTime(TimeSpan time, String UserID) {
            String Result = String.Empty;
            String Days = GetLang("TITLE_FORMAT_LOCKED_DAYS", UserID);
            String Hourse = GetLang("TITLE_FORMAT_LOCKED_HOURSE", UserID);
            String Minutes = GetLang("TITLE_FORMAT_LOCKED_MINUTES", UserID);
            String Seconds = GetLang("TITLE_FORMAT_LOCKED_SECONDS", UserID);
            if (time.Seconds != 0) Result = $"{Format(time.Seconds, Seconds, Seconds, Seconds)}";
            if (time.Minutes != 0) Result = $"{Format(time.Minutes, Minutes, Minutes, Minutes)}";
            if (time.Hours != 0) Result = $"{Format(time.Hours, Hourse, Hourse, Hourse)}";
            if (time.Days != 0) Result = $"{Format(time.Days, Days, Days, Days)}";
            return Result;
        }
        private String Format(Int32 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 Loaded Icons
        void LoadedIcon() {
            PrintWarning("Начинаю загрузку иконок..");
            var Interface = config.InterfaceSetting;
            var Category = Interface.CategorySetting.PNGCategoryIcons;
            var Items = config.ItemSetting;
            var Requires = Interface.RequiresSetting;
            if (!HasImage($"LOGO_{Interface.GeneralSetting.PNGLogo}")) AddImage(Interface.GeneralSetting.PNGLogo, $"LOGO_{Interface.GeneralSetting.PNGLogo}");
            if (!HasImage($"ACTIVE_ITEM_{Interface.GeneralSetting.PNGActive}")) AddImage(Interface.GeneralSetting.PNGActive, $"ACTIVE_ITEM_{Interface.GeneralSetting.PNGActive}");
            if (!HasImage($"IN_ACTIVE_ITEM_{Interface.GeneralSetting.PNGInActive}")) AddImage(Interface.GeneralSetting.PNGInActive, $"IN_ACTIVE_ITEM_{Interface.GeneralSetting.PNGInActive}");
            if (!HasImage($"CLOSE_BUTTON_{Interface.GeneralSetting.PNGCloseButton}")) AddImage(Interface.GeneralSetting.PNGCloseButton, $"CLOSE_BUTTON_{Interface.GeneralSetting.PNGCloseButton}");
            if (!HasImage($"CATEGORY_{Category.PNGAll}")) AddImage(Category.PNGAll, $"CATEGORY_{Category.PNGAll}");
            if (!HasImage($"CATEGORY_{Category.PNGAttirie}")) AddImage(Category.PNGAttirie, $"CATEGORY_{Category.PNGAttirie}");
            if (!HasImage($"CATEGORY_{Category.PNGConstruction}")) AddImage(Category.PNGConstruction, $"CATEGORY_{Category.PNGConstruction}");
            if (!HasImage($"CATEGORY_{Category.PNGCustom}")) AddImage(Category.PNGCustom, $"CATEGORY_{Category.PNGCustom}");
            if (!HasImage($"CATEGORY_{Category.PNGElectrical}")) AddImage(Category.PNGElectrical, $"CATEGORY_{Category.PNGElectrical}");
            if (!HasImage($"CATEGORY_{Category.PNGFun}")) AddImage(Category.PNGFun, $"CATEGORY_{Category.PNGFun}");
            if (!HasImage($"CATEGORY_{Category.PNGItems}")) AddImage(Category.PNGItems, $"CATEGORY_{Category.PNGItems}");
            if (!HasImage($"CATEGORY_{Category.PNGTools}")) AddImage(Category.PNGTools, $"CATEGORY_{Category.PNGTools}");
            if (!HasImage($"CATEGORY_{Category.PNGTransport}")) AddImage(Category.PNGTransport, $"CATEGORY_{Category.PNGTransport}");
            if (!HasImage($"CATEGORY_{Category.PNGWeapon}")) AddImage(Category.PNGWeapon, $"CATEGORY_{Category.PNGWeapon}");
            if (!HasImage($"REQUIRES_WORKBENCH_{Requires.PNGRequiresWorckbench}")) AddImage(Requires.PNGRequiresWorckbench, $"REQUIRES_WORKBENCH_{Requires.PNGRequiresWorckbench}");
            if (!HasImage($"REQUIRES_IQRANKSYSTEM_{Requires.PNGRequiresIQRankSystem}")) AddImage(Requires.PNGRequiresIQRankSystem, $"REQUIRES_IQRANKSYSTEM_{Requires.PNGRequiresIQRankSystem}");
            if (!HasImage($"REQUIRES_IQPLAGUESKILL_{Requires.PNGRequiresIQPlagueSkill}")) AddImage(Requires.PNGRequiresIQPlagueSkill, $"REQUIRES_IQPLAGUESKILL_{Requires.PNGRequiresIQPlagueSkill}");
            if (!HasImage($"REQUIRES_IQECONOMIC_{Requires.PNGRequiresIQEconomic}")) AddImage(Requires.PNGRequiresIQEconomic, $"REQUIRES_IQECONOMIC_{Requires.PNGRequiresIQEconomic}");
            foreach (var Icon in Items.Where(x => x.Value.CategoryItems == CategoryItem.Custom || x.Value.CategoryItems == CategoryItem.Transport || x.Value.CategoryItems == CategoryItem.Entity)) if (!HasImage($"ITEM_{Icon.Value.PNG}")) AddImage(Icon.Value.PNG, $"ITEM_{Icon.Value.PNG}");
            foreach(var Item in Items) foreach(var ItemCraft in Item.Value.ItemListForCraft) if (!HasImage($"ITEM_CRAFT_{ItemCraft.PNG}")) AddImage(ItemCraft.PNG, $"ITEM_CRAFT_{ItemCraft.PNG}");
            ServerMgr.Instance.StartCoroutine(DownloadImages());
            PrintWarning("Загрузка иконок завершена");
        }
        private IEnumerator DownloadImages() {
            var Items = config.ItemSetting;
            PrintError("AddImages SkyPlugins.ru...");
            foreach (var Item in Items) {
                if (Item.Value.SkinID != 0) {
                    if (!HasImage($"{Item.Value.Shortname}_128px_{Item.Value.SkinID}")) AddImage($"https://api.skyplugins.ru/api/getskin/{Item.Value.SkinID}/128", $"{Item.Value.Shortname}_128px_{Item.Value.SkinID}", Item.Value.SkinID);
                    if (!HasImage($"{Item.Value.Shortname}_256px_{Item.Value.SkinID}")) AddImage($"https://api.skyplugins.ru/api/getskin/{Item.Value.SkinID}/128", $"{Item.Value.Shortname}_256px_{Item.Value.SkinID}", Item.Value.SkinID);
                }
                else {
                    if (!String.IsNullOrWhiteSpace(Item.Value.Shortname)) {
                        if (!HasImage($"{Item.Value.Shortname}_128px")) AddImage($"https://api.skyplugins.ru/api/getimage/{Item.Value.Shortname}/128", $"{Item.Value.Shortname}_128px");
                        if (!HasImage($"{Item.Value.Shortname}_256px")) AddImage($"https://api.skyplugins.ru/api/getimage/{Item.Value.Shortname}/256", $"{Item.Value.Shortname}_256px");
                    }
                }
                foreach (var ItemCraft in Item.Value.ItemListForCraft.Where(x => !String.IsNullOrEmpty(x.Shortname))) {
                    if (ItemCraft.SkinID != 0) {
                        if (!HasImage($"{ItemCraft.Shortname}_128px_{ItemCraft.SkinID}")) AddImage($"https://api.skyplugins.ru/api/getskin/{ItemCraft.SkinID}/128", $"{ItemCraft.Shortname}_128px_{ItemCraft.SkinID}", ItemCraft.SkinID);
                    }
                    else {
                        if (!HasImage($"{ItemCraft.Shortname}_128px")) AddImage($"https://api.skyplugins.ru/api/getimage/{ItemCraft.Shortname}/128", $"{ItemCraft.Shortname}_128px");
                    }
                }
            }
            yield return new WaitForSeconds(0.04f);
            PrintError("AddImages SkyPlugins.ru - completed..");
        }
        void CachingImage(BasePlayer player) {
            var Interface = config.InterfaceSetting;
            var Category = Interface.CategorySetting.PNGCategoryIcons;
            var Items = config.ItemSetting;
            var Requires = Interface.RequiresSetting;
            SendImage(player, $"REQUIRES_IQECONOMIC_{Requires.PNGRequiresIQEconomic}");
            SendImage(player, $"REQUIRES_IQPLAGUESKILL_{Requires.PNGRequiresIQPlagueSkill}");
            SendImage(player, $"REQUIRES_IQRANKSYSTEM_{Requires.PNGRequiresIQRankSystem}");
            SendImage(player, $"REQUIRES_WORKBENCH_{Requires.PNGRequiresWorckbench}");
            SendImage(player, $"LOGO_{Interface.GeneralSetting.PNGLogo}");
            SendImage(player, $"CLOSE_BUTTON_{Interface.GeneralSetting.PNGCloseButton}");
            SendImage(player, $"ACTIVE_ITEM_{Interface.GeneralSetting.PNGActive}");
            SendImage(player, $"IN_ACTIVE_ITEM_{Interface.GeneralSetting.PNGInActive}");
            SendImage(player, $"CATEGORY_{Category.PNGAll}");
            SendImage(player, $"CATEGORY_{Category.PNGAttirie}");
            SendImage(player, $"CATEGORY_{Category.PNGConstruction}");
            SendImage(player, $"CATEGORY_{Category.PNGCustom}");
            SendImage(player, $"CATEGORY_{Category.PNGElectrical}");
            SendImage(player, $"CATEGORY_{Category.PNGFun}");
            SendImage(player, $"CATEGORY_{Category.PNGItems}");
            SendImage(player, $"CATEGORY_{Category.PNGTools}");
            SendImage(player, $"CATEGORY_{Category.PNGTransport}");
            SendImage(player, $"CATEGORY_{Category.PNGWeapon}");
            foreach (var Icon in Items.Where(x => x.Value.CategoryItems == CategoryItem.Custom || x.Value.CategoryItems == CategoryItem.Transport || x.Value.CategoryItems == CategoryItem.Entity)) SendImage(player, $"ITEM_{Icon.Value.PNG}");
            foreach (var Item in Items) foreach (var ItemCraft in Item.Value.ItemListForCraft) SendImage(player, $"ITEM_CRAFT_{ItemCraft.PNG}");
        }
#endregion
#region Check Metods
        public bool DoWorkbenchLevel(BasePlayer player, int NeededWorkbenchLevel) => (bool)(player.currentCraftLevel >= NeededWorkbenchLevel);
        public bool DoBalanceIQEconomic(BasePlayer player, int NeededBalance) => (bool)(IQEconomicGetBalance(player.userID) >= NeededBalance);
        public bool DoSkillIQPlagueSkill(BasePlayer player) => (bool)IQPlagueSkillISAdvanced(player);
        public bool DoRankIQRankSystem(BasePlayer player, string RankKey) => (bool)IQRankSystemAvaliability(player, RankKey);
        public bool IS_Item_Player(BasePlayer player, string Shortname, int Amount, ulong SkinID = 0) {
            int ItemAmount = 0;
            foreach (var ItemRequires in player.inventory.AllItems()) {
                if (ItemRequires == null) continue;
                if (ItemRequires.info.shortname != Shortname) continue;
                if (ItemRequires.skin != SkinID) continue;
                ItemAmount += ItemRequires.amount;
            }
            return ItemAmount >= Amount;
        }
        bool Is_Full_Item_Pack(BasePlayer player, List<Configuration.ItemSettings.ItemForCraft> itemForCraftList) {
            int TrueItem = 0;
            for(int i = 0; i < itemForCraftList.Count; i++) {
                var Item = itemForCraftList[i];
                if (IS_Item_Player(player, Item.Shortname, Item.Amount, Item.SkinID)) TrueItem++;
            }
            return TrueItem >= itemForCraftList.Count;
        }
#endregion
        public void Register(string Permissions) {
            if (!String.IsNullOrWhiteSpace(Permissions)) if (!permission.PermissionExists(Permissions, this)) permission.RegisterPermission(Permissions, this);
        }
        void GiveItemUser(ulong userID, string ItemKey) {
            var Item = config.ItemSetting[ItemKey];
            BasePlayer player = BasePlayer.FindByID(userID);
            switch (Item.CategoryItems) {
                case CategoryItem.Weapon : case CategoryItem.Attirie : case CategoryItem.Construction : case CategoryItem.Electrical : case CategoryItem.Fun : case CategoryItem.Items : case CategoryItem.Tools :  // ITEM
                {
                    Item item = ItemManager.CreateByName(Item.Shortname, 1, Item.SkinID);
                    if (!String.IsNullOrWhiteSpace(Item.DisplayName)) item.name = Item.DisplayName;
                    player.GiveItem(item);
                    break;
                }
                case CategoryItem.Custom :  // COMMAND
                {
                    rust.RunServerCommand(Item.Command.Replace("%STEAMID%", player.UserIDString));
                    break;
                }
                case CategoryItem.Transport :  // ENTITY
                case CategoryItem.Entity : {
                    Item item = ItemManager.CreateByName(CustomItemShortname, 1, Item.SkinID);
                    if (!String.IsNullOrWhiteSpace(Item.DisplayName)) item.name = Item.DisplayName;
                    player.GiveItem(item);
                    break;
                }
            }
        }
#region Craft Metods
        void SpawnItem(BaseEntity entity) {
            if (entity == null) return;
            var ItemSpawn = config.ItemSetting.FirstOrDefault(x => x.Value.SkinID == entity.skinID).Value;
            if (ItemSpawn == null) return;
            if (ItemSpawn.CategoryItems == CategoryItem.Entity || ItemSpawn.CategoryItems == CategoryItem.Transport) {
                string Prefab = ItemSpawn.CategoryItems == CategoryItem.Transport ? ItemSpawn.PrefabNameTransport : ItemSpawn.PrefabEntity;
                BaseEntity SpawnedEntity = (BaseEntity)GameManager.server.CreateEntity(Prefab, entity.transform.position, entity.transform.rotation);
                if (SpawnedEntity == null) return;
                SpawnedEntity.Spawn();
                NextTick(() => entity.Kill());
            }
        }
        void CraftingItem(BasePlayer player, string ItemKey) {
            var Item = config.ItemSetting[ItemKey];
            foreach (var ItemTake in Item.ItemListForCraft) {
                Item Take = player.inventory.AllItems().FirstOrDefault(i => i.skin == ItemTake.SkinID && i.info.shortname == ItemTake.Shortname);
                if (Take == null) continue;
                player.inventory.Take(null, Take.info.itemid, ItemTake.Amount);
            }
            if (Item.IQEconomicPrice != 0) IQEconomicRemoveBalance(player.userID, Item.IQEconomicPrice);
            switch (Item.CategoryItems) {
                case CategoryItem.Weapon : case CategoryItem.Attirie : case CategoryItem.Construction : case CategoryItem.Electrical : case CategoryItem.Fun : case CategoryItem.Items : case CategoryItem.Tools :  // ITEM
                {
                    Item item = ItemManager.CreateByName(Item.Shortname, 1, Item.SkinID);
                    if (!String.IsNullOrWhiteSpace(Item.DisplayName)) item.name = Item.DisplayName;
                    player.GiveItem(item);
                    break;
                }
                case CategoryItem.Custom :  // COMMAND
                {
                    rust.RunServerCommand(Item.Command.Replace("%STEAMID%", player.UserIDString));
                    break;
                }
                case CategoryItem.Transport :  // ENTITY
                case CategoryItem.Entity : {
                    Item item = ItemManager.CreateByName(CustomItemShortname, 1, Item.SkinID);
                    if (!String.IsNullOrWhiteSpace(Item.DisplayName)) item.name = Item.DisplayName;
                    player.GiveItem(item);
                    break;
                }
            }
            SetCooldown(player, ItemKey);
            if (IsCooldown(player, ItemKey)) DestroyItemInfo(player);
            else UI_Information_Craft(player, ItemKey);
            DestroyItem(player);
            LoadedItems(player, CategoryItem.All, -1);
        }
#endregion
#endregion
#region Hooks
        private void OnEntityBuilt(Planner plan, GameObject go) {
            SpawnItem(go.ToBaseEntity());
        }
        private void Init() => ReadData();
        private void OnServerInitialized() {
            LoadedIcon();
            foreach (var p in BasePlayer.activePlayerList) OnPlayerConnected(p);
            foreach (var Item in config.ItemSetting) Register(Item.Value.Permission);
            CategoryListLoad();
        }
        void Unload() {
            foreach (BasePlayer player in BasePlayer.activePlayerList) DestroyAll(player);
            ServerMgr.Instance.StopCoroutine(DownloadImages());
            WriteData();
        }
        void OnPlayerConnected(BasePlayer player) {
            CachingImage(player);
            RegisteredDataUser(player.userID);
        }
#endregion
#region Commands
        [ChatCommand("craft")]
        void IQCraftSystemCommand(BasePlayer player) {
            PagePlayers[player] = 0;
            UI_CraftMenu(player);
        }
        [ConsoleCommand("craft_give")]
        void IQCraftSystemCmdGiveItem(ConsoleSystem.Arg arg) {
            if (arg == null || arg.Args == null || arg.Args.Length < 2) {
                PrintWarning("Используйте синтаксис : craft_give SteamID Ключ(из кфг)");
                return;
            }
            if(arg.Args[0] == null || String.IsNullOrWhiteSpace(arg.Args[0])) {
                PrintWarning("Вы неверно указали SteamID\nИспользуйте синтаксис : craft_give SteamID Ключ(из кфг)");
                return;
            }
            ulong userID = ulong.Parse(arg.Args[0]);
            if(arg.Args[1] == null || String.IsNullOrWhiteSpace(arg.Args[1])) {
                PrintWarning("Вы неверно указали ключ из кфг\nИспользуйте синтаксис : craft_give SteamID Ключ(из кфг)");
                return;
            }
            string ItemKey = (string)arg.Args[1];
            if(!config.ItemSetting.ContainsKey(ItemKey)) {
                PrintWarning("Такого ключа не существует в конфигурации, используйте верный ключ!");
                return;
            }
            GiveItemUser(userID, ItemKey);
        }
        [ConsoleCommand("func_craft")]
        void IQCraftSsytemFunc(ConsoleSystem.Arg arg) {
            BasePlayer player = arg.Player();
            if (player == null) return;
            string Action = arg.Args[0];
            switch(Action) {
                case "close_ui" : {
                    DestroyAll(player);
                    break;
                }
                case "select_category" : {
// ... [Code preview truncated due to length. Full source in attached file] ...

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