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] ...