C#:
using System;
using System.Collections;
using System.Collections.Generic;
using Newtonsoft.Json;
using Oxide.Core.Plugins;
using Oxide.Game.Rust.Cui;
using UnityEngine;
using System.Linq;
using System.Text;
using ConVar;
namespace Oxide.Plugins {
[Info("IQKits", "Mercury", "0.0.6")]
[Description("Лучшие наборы из всех,которые есть")]
class IQKits : RustPlugin {
/// <summary>
/// Обновление 0.0.2
/// - Добавил дополнительную проверку на юзера
/// - Поправил удаление набора
/// - Исправил шанс выпадения предмета
/// - Добавлена возможность открывать набор после N дня вайпа
/// - Добавлена возможность выдавать автоматический набор с учетом N дня вайпа
///
/// /// Обновление 0.0.3
/// - Исправил появление наборов после N дня вайпа
/// Обновление 0.0.4
/// - Исправил обновление таймера китов (Спам в F1)
/// - Поправил отображение таймера на китах
/// - Убран спам в консоль если не был создан стартовый набор
/// - Добавлена команда на выдачу набора игроку
/// - Чатовая команда : /kit give NickOrID КлючНабора
/// - Консольная команда : kit give NickOrID КлючНабора
/// - Добавил новый тип выдачи автоматического набора "По приоритету"
///
/// Обновление 0.0.5
/// - Исправление отображения наборов с правами
/// Обновление 0.0.6
/// - Поправил запись наборов в дата файл
/// - Исправил выдачу автоматического кита по ключу
/// - Добавлено множество API
/// </summary>
#region Reference
[PluginReference]
Plugin ImageLibrary, IQPlagueSkill, IQChat;
#region IQChat
public void SendChat(BasePlayer player, string Message, Chat.ChatChannel channel = Chat.ChatChannel.Global) {
var Chat = config.ReferenceSetting.IQChatSetting;
if (IQChat) IQChat?.Call("API_ALERT_PLAYER", player, Message, Chat.CustomPrefix, Chat.CustomAvatar);
else player.SendConsoleCommand("chat.add", channel, 0, Message);
}
#endregion
#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 IQPlagueSkill
bool IS_SKILL_COOLDOWN(BasePlayer player) => (bool)IQPlagueSkill?.CallHook("API_IS_COOLDOWN_SKILL_KITS", player);
bool IS_SKILL_RARE(BasePlayer player) => (bool)IQPlagueSkill?.CallHook("API_IS_RARE_SKILL_KITS", player);
int GET_SKILL_COOLDOWN_PERCENT() => (int)IQPlagueSkill?.CallHook("API_GET_COOLDOWN_IQKITS");
int GET_SKILL_RARE_PERCENT() => (int)IQPlagueSkill?.CallHook("API_GET_RARE_IQKITS");
#endregion
#endregion
#region Vars
public static DateTime TimeCreatedSave = SaveRestore.SaveCreatedTime.Date;
public static DateTime RealTime = DateTime.Now.Date;
public static int WipeTime = RealTime.Subtract(TimeCreatedSave).Days;
enum TypeKits {
Cooldown, Amount, Started, AmountCooldown,
}
enum ContainerItem {
containerWear, containerBelt, containerMain
}
public Dictionary<BasePlayer, int> PagePlayers = new Dictionary<BasePlayer, int>();
#endregion
#region Configuration
private static Configuration config = new Configuration();
private class Configuration {
[JsonProperty("Общие настройки")]
public GeneralSettings GeneralSetting = new GeneralSettings();
[JsonProperty("Настройки интерфейса")]
public InterfaceSettings InterfaceSetting = new InterfaceSettings();
[JsonProperty("Настройка наборов")]
public Dictionary<string, Kits> KitList = new Dictionary<string, Kits>();
[JsonProperty("Настройки плагинов совместимости")]
public ReferenceSettings ReferenceSetting = new ReferenceSettings();
internal class ReferenceSettings {
[JsonProperty("Настройки IQChat")]
public IQChatSettings IQChatSetting = new IQChatSettings();
internal class IQChatSettings {
[JsonProperty("IQChat : Кастомный префикс в чате")]
public string CustomPrefix;
[JsonProperty("IQChat : Кастомный аватар в чате(Если требуется)")]
public string CustomAvatar;
}
}
internal class GeneralSettings {
[JsonProperty("Ключ стартового набора(Дается при возрождении)(если включен список нескольких наборов, данная функция отключается)")]
public string StartKitKey;
[JsonProperty("Использовать сразу несколько стартовых наборов(они будут выбираться случайно)")]
public bool UseStartedKitList;
[JsonProperty("Использовать тип выдачи набора из листа по доступности(Условно, если есть 2 привилегии VIP и Premium - выдаваться будет тот, который выше указан в листе)")]
public bool UsePrimoryKitList;
[JsonProperty("Список ключей стартового набора(Дается при возрождении)")]
public List<KitRandom> StartedKitList = new List<KitRandom>();
internal class KitRandom {
[JsonProperty("Ключ набора")]
public string StartKitKey;
[JsonProperty("Права для набора(не оставляйте это поле пустым)")]
public string Permissions;
}
}
internal class InterfaceSettings {
[JsonProperty("HEX: Цвет заднего фона")]
public string HEXBackground;
[JsonProperty("HEX: Цвет текста")]
public string HEXLabels;
[JsonProperty("HEX: Кнопки с информацией")]
public string HEXInfoItemButton;
[JsonProperty("HEX: Цвет текста на кнопке с информацией")]
public string HEXLabelsInfoItemButton;
[JsonProperty("HEX: Цвет кнопки забрать")]
public string HEXAccesButton;
[JsonProperty("HEX: Цвет текста на кнопке забрать")]
public string HEXLabelsAccesButton;
[JsonProperty("HEX: Цвет полосы перезарядки")]
public string HEXCooldowns;
[JsonProperty("HEX: Цвет блоков с информацией")]
public string HEXBlock;
[JsonProperty("HEX: Цвет блоков на которых будут лежать предметы")]
public string HEXBlockItemInfo;
[JsonProperty("Время появления интерфейса(его плавность)")]
public float InterfaceFadeOut;
[JsonProperty("Время исчезновения интерфейса(его плавность)")]
public float InterfaceFadeIn;
[JsonProperty("PNG заднего фона с информацией о том,что находится в наборе")]
public string PNGInfoPanel;
[JsonProperty("PNG заднего фона уведомления")]
public string PNGAlert;
}
internal class Kits {
[JsonProperty("Тип набора(0 - С перезарядкой, 1 - Лимитированый, 2 - Стартовый(АвтоКит), 3 - Лимитированый с перезарядкой)")]
public TypeKits TypeKit;
[JsonProperty("Отображаемое имя")]
public string DisplayName;
[JsonProperty("Через сколько дней вайпа будет доступен набор")]
public int WipeOpened;
[JsonProperty("Права")]
public string Permission;
[JsonProperty("PNG(128x128)")]
public string PNG;
[JsonProperty("Sprite(Установится если отсутствует PNG)")]
public string Sprite;
[JsonProperty("Shortname(Установится если отсутствует PNG и Sprite)")]
public string Shortname;
[JsonProperty("Время перезарядки набора")]
public int CoolDown;
[JsonProperty("Количество сколько наборов можно взять")]
public int Amount;
[JsonProperty("Предметы , которые будут даваться в данном наборе")]
public List<ItemsKit> ItemKits = new List<ItemsKit>();
internal class ItemsKit {
[JsonProperty("Выберите контейнер в который будет перенесен предмет(0 - Одежда, 1 - Панель быстрого доступа, 2 - Рюкзак)")]
public ContainerItem ContainerItemType;
[JsonProperty("Название предмета")]
public string DisplayName;
[JsonProperty("Shortname предмета")]
public string Shortname;
[JsonProperty("Количество(Если это команда,так-же указывайте число)")]
public int Amount;
[JsonProperty("Шанс на выпадения предмета(Оставьте 0 - если не нужен шанс)")]
public int Rare;
[JsonProperty("SkinID предмета")]
public ulong SkinID;
[JsonProperty("PNG предмета(если установлена команда)")]
public string PNG;
[JsonProperty("Sprite(Если установлена команда и не установлен PNG)")]
public string Sprite;
[JsonProperty("Команда(%STEAMID% заменится на ID пользователя)")]
public string Command;
}
}
public static Configuration GetNewConfiguration() {
return new Configuration {
ReferenceSetting = new ReferenceSettings {
IQChatSetting = new ReferenceSettings.IQChatSettings {
CustomAvatar = "", CustomPrefix = "",
}
,
}
, KitList = new Dictionary<string, Kits> {
#region Start Kits
["start1"]
= new Kits {
TypeKit = TypeKits.Started, Amount = 0, CoolDown = 0, WipeOpened = 0, DisplayName = "Новичок", Permission = "iqkits.start1", PNG = "", Shortname = "", Sprite = "", ItemKits = new List<Kits.ItemsKit> {
new Kits.ItemsKit {
DisplayName = "Ak103", Amount = 1, Command = "", PNG = "", Shortname = "rifle.ak", Rare = 0, Sprite = "", SkinID = 0,
}
, new Kits.ItemsKit {
DisplayName = "Ak104", Amount = 1, Command = "", PNG = "", Shortname = "rifle.ak", Rare = 0, Sprite = "", SkinID = 0,
}
,
}
,
}
, ["start2"] = new Kits {
TypeKit = TypeKits.Started, Amount = 0, CoolDown = 0, WipeOpened = 0, DisplayName = "Новичок #2", Permission = "iqkits.start2", PNG = "", Shortname = "", Sprite = "", ItemKits = new List<Kits.ItemsKit> {
new Kits.ItemsKit {
DisplayName = "Ak103", Amount = 1, Command = "", PNG = "", Shortname = "rifle.ak", Rare = 0, Sprite = "", SkinID = 0,
}
, new Kits.ItemsKit {
DisplayName = "Ak104", Amount = 1, Command = "", PNG = "", Shortname = "rifle.ak", Rare = 0, Sprite = "", SkinID = 0,
}
,
}
,
}
, ["start3Premium"] = new Kits {
TypeKit = TypeKits.Started, Amount = 0, CoolDown = 0, WipeOpened = 0, DisplayName = "Премиум новичок", Permission = "iqkits.premium", PNG = "", Shortname = "", Sprite = "", ItemKits = new List<Kits.ItemsKit> {
new Kits.ItemsKit {
DisplayName = "Ak103", Amount = 1, Command = "", PNG = "", Shortname = "rifle.ak", Rare = 0, Sprite = "", SkinID = 0,
}
, new Kits.ItemsKit {
DisplayName = "Ak104", Amount = 1, Command = "", PNG = "", Shortname = "rifle.ak", Rare = 0, Sprite = "", SkinID = 0,
}
,
}
,
}
,
#endregion
#region Kits
["hunter"]
= new Kits {
TypeKit = TypeKits.Cooldown, Amount = 0, CoolDown = 300, WipeOpened = 2, DisplayName = "Охотник", Permission = "iqkits.default", PNG = "", Shortname = "rifle.ak", Sprite = "", ItemKits = new List<Kits.ItemsKit> {
new Kits.ItemsKit {
ContainerItemType = ContainerItem.containerMain, DisplayName = "Ak103", Amount = 1, Command = "", PNG = "", Shortname = "rifle.ak", Rare = 0, Sprite = "", SkinID = 0,
}
, new Kits.ItemsKit {
ContainerItemType = ContainerItem.containerMain, DisplayName = "Ak104", Amount = 1, Command = "", PNG = "", Shortname = "rifle.ak", Rare = 0, Sprite = "", SkinID = 0,
}
,
}
,
}
, ["med"] = new Kits {
TypeKit = TypeKits.Amount, Amount = 10, CoolDown = 0, WipeOpened = 1, DisplayName = "Медик", Permission = "iqkits.default", PNG = "", Shortname = "", Sprite = "assets/icons/broadcast.png", ItemKits = new List<Kits.ItemsKit> {
new Kits.ItemsKit {
ContainerItemType = ContainerItem.containerMain, DisplayName = "Ak103", Amount = 1, Command = "", PNG = "", Shortname = "rifle.ak", Rare = 0, Sprite = "", SkinID = 0,
}
, new Kits.ItemsKit {
ContainerItemType = ContainerItem.containerMain, DisplayName = "Ak104", Amount = 1, Command = "", PNG = "", Shortname = "rifle.ak", Rare = 0, Sprite = "", SkinID = 0,
}
,
}
,
}
, ["food"] = new Kits {
TypeKit = TypeKits.AmountCooldown, Amount = 10, CoolDown = 300, DisplayName = "Еда", WipeOpened = 2, Permission = "iqkits.default", PNG = "https://i.imgur.com/rSWlSlN.png", Shortname = "", Sprite = "", ItemKits = new List<Kits.ItemsKit> {
new Kits.ItemsKit {
ContainerItemType = ContainerItem.containerMain, DisplayName = "Ak103", Amount = 1, Command = "", PNG = "", Shortname = "rifle.ak", Rare = 0, Sprite = "", SkinID = 0,
}
, new Kits.ItemsKit {
ContainerItemType = ContainerItem.containerMain, DisplayName = "Ak104", Amount = 1, Command = "", PNG = "", Shortname = "rifle.ak", Rare = 0, Sprite = "", SkinID = 0,
}
,
}
,
}
,
#endregion
}
, GeneralSetting = new GeneralSettings {
UseStartedKitList = false, UsePrimoryKitList = false, StartedKitList = new List<GeneralSettings.KitRandom> {
new GeneralSettings.KitRandom {
Permissions = "iqkits.default", StartKitKey = "start1"
}
, new GeneralSettings.KitRandom {
Permissions = "iqkits.vip", StartKitKey = "hunter"
}
,
}
, StartKitKey = "start1",
}
, InterfaceSetting = new InterfaceSettings {
HEXBackground = "#0000006A", HEXBlock = "#646361A6", HEXAccesButton = "#708a47", HEXBlockItemInfo = "#3D492837", HEXInfoItemButton = "#8a6347", HEXCooldowns = "#708A47D8", HEXLabels = "#FFFFFFFF", HEXLabelsAccesButton = "#C9E39FFF", HEXLabelsInfoItemButton = "#C9E39FFF", InterfaceFadeIn = 0.35f, InterfaceFadeOut = 0.35f, PNGAlert = "https://i.imgur.com/g4Mzn9a.png", PNGInfoPanel = "https://i.imgur.com/9kbOqHK.png",
}
}
;
}
}
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 Data
[JsonProperty("Дата с информацией о игроках")]
public Dictionary<ulong, DataKitsUser> DataKitsUserList = new Dictionary<ulong, DataKitsUser>();
public class DataKitsUser {
[JsonProperty("Информация о наборах игрока")]
public Dictionary<string, InfoKits> InfoKitsList = new Dictionary<string, InfoKits>();
internal class InfoKits {
public int Amount;
public int Cooldown;
}
}
void ReadData() => DataKitsUserList = Oxide.Core.Interface.Oxide.DataFileSystem.ReadObject<Dictionary<ulong, DataKitsUser>>("IQKits/KitsData");
void WriteData() => Oxide.Core.Interface.Oxide.DataFileSystem.WriteObject("IQKits/KitsData", DataKitsUserList);
void RegisteredDataUser(BasePlayer player) {
if (!DataKitsUserList.ContainsKey(player.userID)) DataKitsUserList.Add(player.userID, new DataKitsUser {
InfoKitsList = new Dictionary<string, DataKitsUser.InfoKits> {
}
}
);
foreach (var Kit in config.KitList.Where(x => (String.IsNullOrWhiteSpace(x.Value.Permission) || permission.UserHasPermission(player.UserIDString, x.Value.Permission)) && !DataKitsUserList[player.userID].InfoKitsList.ContainsKey(x.Key))) DataKitsUserList[player.userID].InfoKitsList.Add(Kit.Key, new DataKitsUser.InfoKits {
Amount = Kit.Value.Amount, Cooldown = 0
}
);
}
#endregion
#region Metods
#region Images
void LoadedImage() {
var Interface = config.InterfaceSetting;
foreach (var Kit in config.KitList.Where(k => !String.IsNullOrWhiteSpace(k.Value.PNG))) {
if (!HasImage($"KIT_{Kit.Value.PNG}")) AddImage(Kit.Value.PNG, $"KIT_{Kit.Value.PNG}");
foreach (var img in Kit.Value.ItemKits.Where(i => !String.IsNullOrWhiteSpace(i.PNG))) {
if (!HasImage($"ITEM_KIT_PNG_{img.PNG}")) AddImage(img.PNG, $"ITEM_KIT_PNG_{img.PNG}");
}
}
if (!HasImage($"INFO_BACKGROUND_{Interface.PNGInfoPanel}")) AddImage(Interface.PNGInfoPanel, $"INFO_BACKGROUND_{Interface.PNGInfoPanel}");
if (!HasImage($"INFO_ALERT_BACKGROUND_{Interface.PNGAlert}")) AddImage(Interface.PNGAlert, $"INFO_ALERT_BACKGROUND_{Interface.PNGAlert}");
ServerMgr.Instance.StartCoroutine(DownloadImages());
}
private IEnumerator DownloadImages() {
PrintError("AddImages SkyPlugins.ru...");
foreach (var Kit in config.KitList) foreach (var img in Kit.Value.ItemKits.Where(i => !String.IsNullOrWhiteSpace(i.Shortname))) {
if (!HasImage($"{img.Shortname}_128px")) AddImage($"http://rust.skyplugins.ru/getimage/{img.Shortname}/128", $"{img.Shortname}_128px");
}
yield return new WaitForSeconds(0.04f);
PrintError("AddImages SkyPlugins.ru - completed..");
}
void CachingImage(BasePlayer player) {
var Interface = config.InterfaceSetting;
foreach (var Kit in config.KitList.Where(k => !String.IsNullOrWhiteSpace(k.Value.PNG))) {
SendImage(player, $"KIT_{Kit.Value.PNG}");
foreach (var ItemKit in Kit.Value.ItemKits.Where(ik => !String.IsNullOrWhiteSpace(ik.Shortname))) SendImage(player, $"{ItemKit.Shortname}_128px");
foreach (var img in Kit.Value.ItemKits.Where(i => !String.IsNullOrWhiteSpace(i.PNG))) if (!HasImage($"ITEM_KIT_PNG_{img.PNG}")) AddImage(img.PNG, $"ITEM_KIT_PNG_{img.PNG}");
}
SendImage(player, $"INFO_BACKGROUND_{Interface.PNGInfoPanel}");
SendImage(player, $"INFO_ALERT_BACKGROUND_{Interface.PNGAlert}");
}
#endregion
#region Registered Permissions
void RegisteredPermissions() {
var GeneralSettings = config.GeneralSetting;
var KitList = config.KitList;
foreach(var PermissionGeneral in GeneralSettings.StartedKitList) if (!permission.PermissionExists(PermissionGeneral.Permissions, this)) permission.RegisterPermission(PermissionGeneral.Permissions, this);
foreach (var PermissionKits in KitList) if (!permission.PermissionExists(PermissionKits.Value.Permission, this)) permission.RegisterPermission(PermissionKits.Value.Permission, this);
}
#endregion
#region AutoKit
void AutoKitGive(BasePlayer player) {
if (player == null) return;
var GeneralSettings = config.GeneralSetting;
var KitList = config.KitList;
if (GeneralSettings.UseStartedKitList) {
List<Configuration.GeneralSettings.KitRandom> RandomingKit = new List<Configuration.GeneralSettings.KitRandom>();
foreach (var StartedKitList in GeneralSettings.StartedKitList.Where(k => permission.UserHasPermission(player.UserIDString, k.Permissions) && KitList.ContainsKey(k.StartKitKey) && WipeTime >= KitList[k.StartKitKey].WipeOpened)) RandomingKit.Add(StartedKitList);
var RandomKit = RandomingKit.GetRandom();
if (RandomKit == null) return;
ParseAndGive(player, RandomKit.StartKitKey);
}
else if(GeneralSettings.UsePrimoryKitList) {
var Kit = GeneralSettings.StartedKitList.FirstOrDefault(k => permission.UserHasPermission(player.UserIDString, k.Permissions) && KitList.ContainsKey(k.StartKitKey) && WipeTime >= KitList[k.StartKitKey].WipeOpened);
if (Kit == null) return;
ParseAndGive(player, Kit.StartKitKey);
}
else {
if (String.IsNullOrWhiteSpace(GeneralSettings.StartKitKey) || !KitList.ContainsKey(GeneralSettings.StartKitKey)) {
PrintWarning("У вас не верно указан стартовый ключ, такого набора не существует! Игрок не получил его автоматически");
return;
}
ParseAndGive(player, GeneralSettings.StartKitKey);
}
}
#endregion
#region TakeKit
void TakeKit(BasePlayer player, string KitKey) {
var Kit = config.KitList[KitKey];
var ItemKit = Kit.ItemKits;
var Data = DataKitsUserList[player.userID].InfoKitsList[KitKey];
if (Data.Cooldown >= CurrentTime()) return;
int BeltAmount = ItemKit.Where(i => i.ContainerItemType == ContainerItem.containerBelt).Count();
int WearAmount = ItemKit.Where(i => i.ContainerItemType == ContainerItem.containerWear).Count();
int MainAmount = ItemKit.Where(i => i.ContainerItemType == ContainerItem.containerMain).Count();
int Total = BeltAmount + WearAmount + MainAmount;
if ((player.inventory.containerBelt.capacity - player.inventory.containerBelt.itemList.Count) < BeltAmount || (player.inventory.containerWear.capacity - player.inventory.containerWear.itemList.Count) < WearAmount || (player.inventory.containerMain.capacity - player.inventory.containerMain.itemList.Count) < MainAmount) if (Total > (player.inventory.containerMain.capacity - player.inventory.containerMain.itemList.Count)) {
Interface_Alert_Kits(player, GetLang("UI_ALERT_FULL_INVENTORY", player.UserIDString));
return;
}
switch (Kit.TypeKit) {
case TypeKits.Cooldown : {
int Cooldown = IQPlagueSkill ? IS_SKILL_COOLDOWN(player) ? (Kit.CoolDown - (Kit.CoolDown / 100 * GET_SKILL_COOLDOWN_PERCENT())) : Kit.CoolDown : Kit.CoolDown;
Data.Cooldown = Convert.ToInt32(CurrentTime() + Cooldown);
break;
}
case TypeKits.Amount : {
Data.Amount--;
break;
}
case TypeKits.AmountCooldown : {
int Cooldown = IQPlagueSkill ? IS_SKILL_COOLDOWN(player) ? (Kit.CoolDown - (Kit.CoolDown / 100 * GET_SKILL_COOLDOWN_PERCENT())) : Kit.CoolDown : Kit.CoolDown;
Data.Amount--;
Data.Cooldown = Convert.ToInt32(CurrentTime() + Cooldown);
break;
}
}
ParseAndGive(player, KitKey);
DestroyKits(player);
Interface_Loaded_Kits(player);
Interface_Alert_Kits(player, GetLang("UI_ALERT_ACCES_KIT", player.UserIDString, Kit.DisplayName));
}
void ParseAndGive(BasePlayer player, string KitKey) {
var Kit = config.KitList[KitKey];
var ItemKit = Kit.ItemKits;
foreach (var Item in ItemKit) {
if (Item.Rare != 0) {
int Rare = IQPlagueSkill ? IS_SKILL_RARE(player) ? Item.Rare + GET_SKILL_RARE_PERCENT() : Item.Rare : Item.Rare;
if (!IsRareDrop(Rare)) continue;
}
if (!String.IsNullOrWhiteSpace(Item.Command)) rust.RunServerCommand(Item.Command.Replace("%STEAMID%", player.UserIDString));
else {
Item item = ItemManager.CreateByName(Item.Shortname, Item.Amount > 1 ? Item.Amount : 1, Item.SkinID);
if (!String.IsNullOrWhiteSpace(Item.DisplayName)) item.name = Item.DisplayName;
GiveItem(player, item, Item.ContainerItemType == ContainerItem.containerBelt ? player.inventory.containerBelt : Item.ContainerItemType == ContainerItem.containerWear ? player.inventory.containerWear : player.inventory.containerMain);
}
}
}
private void GiveItem(BasePlayer player, Item item, ItemContainer cont = null) {
if (item == null) return;
var inv = player.inventory;
var MovedContainer = item.MoveToContainer(cont) || item.MoveToContainer(inv.containerMain);
if (!MovedContainer) {
if (cont == inv.containerBelt) MovedContainer = item.MoveToContainer(inv.containerWear);
if (cont == inv.containerWear) MovedContainer = item.MoveToContainer(inv.containerBelt);
}
if (!MovedContainer) item.Drop(player.GetCenter(), player.GetDropVelocity());
}
#endregion
#region Kit Metods Admin
#region Kit Add
void CreateNewKit(BasePlayer player, string NameKit) {
if (!player.IsAdmin) return;
if (config.KitList.ContainsKey(NameKit)) {
SendChat(player, "Ключ данного набора уже существует!");
return;
}
config.KitList.Add(NameKit, new Configuration.Kits {
Amount = 0, CoolDown = 300, DisplayName = NameKit, Permission = "iqkits.setting", PNG = "", Shortname = "", Sprite = "assets/icons/gear.png", TypeKit = TypeKits.Cooldown, ItemKits = GetPlayerItems(player)
}
);
SaveConfig();
SendChat(player, $"Набор с ключем {NameKit} успешно создан");
}
private List<Configuration.Kits.ItemsKit> GetPlayerItems(BasePlayer player) {
List<Configuration.Kits.ItemsKit> kititems = new List<Configuration.Kits.ItemsKit>();
foreach (Item item in player.inventory.containerWear.itemList) {
if (item != null) {
var iteminfo = ItemToKit(item, ContainerItem.containerWear);
kititems.Add(iteminfo);
}
}
foreach (Item item in player.inventory.containerMain.itemList) {
if (item != null) {
var iteminfo = ItemToKit(item, ContainerItem.containerMain);
kititems.Add(iteminfo);
}
}
foreach (Item item in player.inventory.containerBelt.itemList) {
if (item != null) {
var iteminfo = ItemToKit(item, ContainerItem.containerBelt);
kititems.Add(iteminfo);
}
}
return kititems;
}
private Configuration.Kits.ItemsKit ItemToKit(Item item, ContainerItem containerItem) {
Configuration.Kits.ItemsKit ItemsKit = new Configuration.Kits.ItemsKit();
ItemsKit.Amount = item.amount;
ItemsKit.ContainerItemType = containerItem;
ItemsKit.Shortname = item.info.shortname;
ItemsKit.SkinID = item.skin;
ItemsKit.Rare = 0;
ItemsKit.PNG = "";
ItemsKit.Sprite = "";
ItemsKit.Command = "";
ItemsKit.DisplayName = "";
return ItemsKit;
}
#endregion
#region Kit Remove
void KitRemove(BasePlayer player, string NameKit) {
if (!player.IsAdmin) return;
if (!config.KitList.ContainsKey(NameKit)) {
SendChat(player, "Набора с таким ключем не существует!");
return;
}
config.KitList.Remove(NameKit);
SaveConfig();
SendChat(player, $"Набора с ключем {NameKit} успешно удален");
}
#endregion
#endregion
public bool IsRareDrop(int Rare) => UnityEngine.Random.Range(0, 100) >= (100 - (Rare > 100 ? 100 : Rare));
#endregion
#region Hooks
object OnPlayerRespawned(BasePlayer player) {
player.inventory.Strip();
AutoKitGive(player);
return null;
}
private void OnServerInitialized() {
RegisteredPermissions();
ReadData();
LoadedImage();
if (!Oxide.Core.Interface.Oxide.DataFileSystem.ExistsDatafile("IQKits/KitsData.backup")) Oxide.Core.Interface.Oxide.DataFileSystem.WriteObject("IQKits/KitsData.backup", DataKitsUserList);
foreach (BasePlayer p in BasePlayer.activePlayerList) OnPlayerConnected(p);
}
void OnPlayerConnected(BasePlayer player) {
CachingImage(player);
RegisteredDataUser(player);
}
void OnPlayerDisconnected(BasePlayer player, string reason) => player.SetFlag(BaseEntity.Flags.Reserved3, false);
void Unload() {
foreach (BasePlayer player in BasePlayer.activePlayerList) DestroyAll(player);
ServerMgr.Instance.StopCoroutine(DownloadImages());
CheckKit();
WriteData();
}
#endregion
#region Commands
[ChatCommand("kit")]
void IQKITS_ChatCommand(BasePlayer player, string cmd, string[] arg) {
if (arg.Length < 2 || arg == null || arg == null) {
PagePlayers[player] = 0;
Interface_IQ_Kits(player);
return;
}
switch (arg[0]) {
case "create" : case "createkit" : case "add" : case "new" : {
string NameKit = arg[1];
if(string.IsNullOrWhiteSpace(NameKit)) {
SendChat(player, "Введите корректное название!");
return;
}
CreateNewKit(player, NameKit);
break;
}
case "remove" : case "delete" : case "revoke" : {
string NameKit = arg[1];
if (string.IsNullOrWhiteSpace(NameKit)) {
SendChat(player, "Введите корректное название!");
return;
}
KitRemove(player, NameKit);
break;
}
case "give" : {
String IDarName = arg[1];
if(String.IsNullOrWhiteSpace(IDarName)) {
SendChat(player, "Введите корректное имя или ID");
return;
}
BasePlayer TargetUser = BasePlayer.Find(IDarName);
if(TargetUser == null) {
SendChat(player, "Такого игрока нет на сервере");
return;
}
String KitKey = arg[2];
if(String.IsNullOrWhiteSpace(KitKey)) {
SendChat(player, "Введите корректный ключ набора");
return;
}
if(!config.KitList.ContainsKey(KitKey)) {
SendChat(player, "Набора с данным ключем не существует");
return;
}
ParseAndGive(TargetUser, KitKey);
break;
}
}
}
[ConsoleCommand("kit")]
void IQKITS_ConsoleCommand(ConsoleSystem.Arg arg) {
BasePlayer player = arg.Player();
if (player != null) if (arg.Args.Length < 2 || arg == null || arg == null) {
PagePlayers[player] = 0;
Interface_IQ_Kits(player);
return;
}
switch (arg.Args[0]) {
case "create" : case "createkit" : case "add" : case "new" : {
if (player == null) return;
string NameKit = arg.Args[1];
if (string.IsNullOrWhiteSpace(NameKit)) {
PrintToConsole(player, "Введите корректное название!");
return;
}
CreateNewKit(player, NameKit);
break;
}
case "remove" : case "delete" : case "revoke" : {
if (player == null) return;
string NameKit = arg.Args[1];
if (string.IsNullOrWhiteSpace(NameKit)) {
PrintToConsole(player, "Введите корректное название!");
return;
}
KitRemove(player, NameKit);
break;
}
case "give" : {
String IDarName = arg.Args[1];
if (String.IsNullOrWhiteSpace(IDarName)) {
if (player != null) PrintToConsole(player, "Введите корректное имя или ID");
PrintError("Введите корректное имя или ID");
return;
}
BasePlayer TargetUser = BasePlayer.Find(IDarName);
if (TargetUser == null) {
if (player != null) PrintToConsole(player, "Такого игрока нет на сервере");
PrintError("Такого игрока нет на сервере");
return;
}
String KitKey = arg.Args[2];
if (String.IsNullOrWhiteSpace(KitKey)) {
if (player != null) PrintToConsole(player, "Введите корректный ключ набора");
PrintError("Введите корректный ключ набора");
return;
}
if (!config.KitList.ContainsKey(KitKey)) {
if (player != null) PrintToConsole(player, "Набора с данным ключем не существует");
PrintError("Набора с данным ключем не существует");
return;
}
ParseAndGive(TargetUser, KitKey);
if (player != null) PrintToConsole(player, "Успешно выдан набор");
break;
}
}
}
[ConsoleCommand("kit_ui_func")]
void IQKITS_UI_Func(ConsoleSystem.Arg arg) {
BasePlayer player = arg.Player();
if(player == null) {
PrintWarning("Это консольная команда должна отыгрываться от игрока!");
return;
}
string Key = arg.Args[0];
switch(Key) {
case "information" : {
string KitKey = arg.Args[1];
Interface_Info_Kits(player, KitKey);
break;
}
case "take.kit" : {
string KitKey = arg.Args[1];
TakeKit(player, KitKey);
break;
}
case "close.ui" : {
DestroyAll(player);
break;
}
case "hide.info" : {
DestroyInfoKits(player);
break;
}
case "next.page" : {
DestroyKits(player);
PagePlayers[player]++;
Interface_Loaded_Kits(player);
break;
}
case "back.page" : {
DestroyKits(player);
PagePlayers[player]--;
Interface_Loaded_Kits(player);
break;
}
}
}
#endregion
#region Interface
void DestroyAll(BasePlayer player) {
DestroyAlert(player);
DestroyInfoKits(player);
DestroyKits(player);
CuiHelper.DestroyUi(player, "CLOSE_BTN");
CuiHelper.DestroyUi(player, "DESCRIPTION");
CuiHelper.DestroyUi(player, "TITLE");
CuiHelper.DestroyUi(player, IQKITS_OVERLAY);
player.SetFlag(BaseEntity.Flags.Reserved3, false);
ServerMgr.Instance.StopCoroutine(UI_UpdateCooldown(player));
}
void DestroyKits(BasePlayer player) {
CuiHelper.DestroyUi(player, $"BTN_BACK_BUTTON");
CuiHelper.DestroyUi(player, $"BTN_NEXT_BUTTON");
for (int i = 0; i < 4; i++) {
CuiHelper.DestroyUi(player, $"WHAT_INFO_{i}");
CuiHelper.DestroyUi(player, $"TAKE_KIT_{i}");
CuiHelper.DestroyUi(player, $"COOLDOWN_LINE_{i}");
CuiHelper.DestroyUi(player, $"COOLDOWN_TITLE{i}");
CuiHelper.DestroyUi(player, $"COOLDOWN_PANEL_{i}");
CuiHelper.DestroyUi(player, $"TITLE_KIT_{i}");
CuiHelper.DestroyUi(player, $"DISPLAY_NAME_PANEL_{i}");
CuiHelper.DestroyUi(player, $"AVATAR_{i}");
CuiHelper.DestroyUi(player, $"AVATAR_PANEL_{i}");
CuiHelper.DestroyUi(player, $"KIT_PANEL_{i}");
}
}
void DestroyAlert(BasePlayer player) {
CuiHelper.DestroyUi(player, $"TITLE_ALERT");
CuiHelper.DestroyUi(player, $"INFO_ALERT_BACKGROUND");
}
void DestroyInfoKits(BasePlayer player) {
for (int i = 0; i < 40; i++) {
CuiHelper.DestroyUi(player, $"KIT_ITEM_AMOUNT_{i}");
CuiHelper.DestroyUi(player, $"RARE_LABEL_{i}");
CuiHelper.DestroyUi(player, $"RARE_BACKGROUND_{i}");
CuiHelper.DestroyUi(player, $"KIT_ITEM_{i}");
CuiHelper.DestroyUi(player, $"ITEM_{i}");
}
CuiHelper.DestroyUi(player, $"TITLE_KIT_INFO");
CuiHelper.DestroyUi(player, $"HIDE_INFO_BTN");
CuiHelper.DestroyUi(player, $"INFO_BACKGROUND");
}
public static string IQKITS_OVERLAY = "IQKITS_OVERLAY";
void Interface_IQ_Kits(BasePlayer player) {
DestroyAll(player);
player.SetFlag(BaseEntity.Flags.Reserved3, true);
CuiElementContainer container = new CuiElementContainer();
var Interface = config.InterfaceSetting;
float FadeIn = Interface.InterfaceFadeIn;
float FadeOut = Interface.InterfaceFadeOut;
container.Add(new CuiPanel {
FadeOut = FadeOut, CursorEnabled = true, RectTransform = {
AnchorMin = "0 0", AnchorMax = "1 1"
}
, Image = {
FadeIn = FadeIn, Color = HexToRustFormat(Interface.HEXBackground), Material = "assets/content/ui/uibackgroundblur-ingamemenu.mat"
}
}
, "Overlay", IQKITS_OVERLAY);
container.Add(new CuiLabel {
FadeOut = FadeOut, RectTransform = {
AnchorMin = "0 0.915", AnchorMax = "1 1"
}
, Text = {
FadeIn = FadeIn, Text = GetLang("UI_TITLE", player.UserIDString), Color = HexToRustFormat(Interface.HEXLabels), Font = "robotocondensed-bold.ttf", Align = TextAnchor.MiddleCenter
}
}
, IQKITS_OVERLAY, "TITLE");
container.Add(new CuiLabel {
FadeOut = FadeOut, RectTransform = {
AnchorMin = "0 0.8925912", AnchorMax = "1 0.9351871"
}
, Text = {
FadeIn = FadeIn, Text = GetLang("UI_DESCRIPTION", player.UserIDString), Color = HexToRustFormat(Interface.HEXLabels), Font = "robotocondensed-bold.ttf", Align = TextAnchor.MiddleCenter
}
}
, IQKITS_OVERLAY, "DESCRIPTION");
container.Add(new CuiButton {
FadeOut = FadeOut - 0.2f, RectTransform = {
AnchorMin = "0.8718751798 0.9388889", AnchorMax = "1 1"
}
, Button = {
FadeIn = FadeIn, Command = $"kit_ui_func close.ui", Color = "0 0 0 0"
}
, Text = {
FadeIn = FadeIn, Text = GetLang("UI_CLOSE_BTN", player.UserIDString), Color = HexToRustFormat(Interface.HEXLabels), Align = TextAnchor.MiddleCenter
}
}
, IQKITS_OVERLAY, "CLOSE_BTN");
CuiHelper.AddUi(player, container);
Interface_Loaded_Kits(player);
ServerMgr.Instance.StartCoroutine(UI_UpdateCooldown(player));
}
#region LoadedKits
void Interface_Loaded_Kits(BasePlayer player) {
RegisteredDataUser(player);
CuiElementContainer container = new CuiElementContainer();
var Interface = config.InterfaceSetting;
float FadeIn = Interface.InterfaceFadeIn;
float FadeOut = Interface.InterfaceFadeOut;
int CountKitPage = config.KitList.Where(k => ((k.Value.TypeKit != TypeKits.Started && WipeTime >= k.Value.WipeOpened) && (((k.Value.TypeKit == TypeKits.Amount || k.Value.TypeKit == TypeKits.AmountCooldown) && DataKitsUserList[player.userID].InfoKitsList[k.Key].Amount > 0) || k.Value.TypeKit == TypeKits.Cooldown) && (String.IsNullOrWhiteSpace(k.Value.Permission) || permission.UserHasPermission(player.UserIDString, k.Value.Permission)))).Skip(4 * (PagePlayers[player] + 1)).Take(4).Count();
int x = 0, y = 0, i = 0;
foreach (var Kit in config.KitList.Where(k => ((k.Value.TypeKit != TypeKits.Started && WipeTime >= k.Value.WipeOpened) && (((k.Value.TypeKit == TypeKits.Amount || k.Value.TypeKit == TypeKits.AmountCooldown) && DataKitsUserList[player.userID].InfoKitsList[k.Key].Amount > 0) || k.Value.TypeKit == TypeKits.Cooldown) && (String.IsNullOrWhiteSpace(k.Value.Permission) || permission.UserHasPermission(player.UserIDString, k.Value.Permission)))).Skip(4 * PagePlayers[player]).Take(4)) {
var Data = DataKitsUserList[player.userID].InfoKitsList[Kit.Key];
container.Add(new CuiPanel {
FadeOut = FadeOut, CursorEnabled = true, RectTransform = {
AnchorMin = $"{0.08385417 + (x * 0.52)} {0.5842593 - (y * 0.342)}", AnchorMax = $"{0.3916667 + (x * 0.52)} {0.8231534 - (y * 0.342)}"
}
, Image = {
FadeIn = FadeIn, Color = "0 0 0 0"
}
}
, IQKITS_OVERLAY, $"KIT_PANEL_{i}");
#region Avatar
container.Add(new CuiPanel {
FadeOut = FadeOut, CursorEnabled = true, RectTransform = {
AnchorMin = $"0 0", AnchorMax = $"0.43654821798 1"
}
, Image = {
FadeIn = FadeIn, Color = HexToRustFormat(Interface.HEXBlock)
}
}
, $"KIT_PANEL_{i}", $"AVATAR_PANEL_{i}");
if (String.IsNullOrWhiteSpace(Kit.Value.Sprite)) {
var ComponentAvatar = !String.IsNullOrWhiteSpace(Kit.Value.PNG) ? new CuiRawImageComponent {
FadeIn = FadeIn, Png = GetImage($"KIT_{Kit.Value.PNG}")
}
: new CuiRawImageComponent {
FadeIn = FadeIn, Png = GetImage(Kit.Value.Shortname)
}
;
container.Add(new CuiElement {
FadeOut = FadeOut, Parent = $"AVATAR_PANEL_{i}", Name = $"AVATAR_{i}", Components = {
ComponentAvatar, new CuiRectTransformComponent {
AnchorMin = "0.0775194 0.07364181", AnchorMax = $"0.9224806 0.9185845"
}
,
// ... [Code preview truncated due to length. Full source in attached file] ...