C#:
using Oxide.Core;
using UnityEngine;
using System;
using System.Collections.Generic;
using ConVar;
using System.Collections;
using Oxide.Core.Plugins;
using System.Linq;
using Oxide.Game.Rust.Cui;
using System.Text;
using Newtonsoft.Json;
namespace Oxide.Plugins {
[Info("IQKits", "Sempai#3239", "1.1.9")]
[Description("Лучшие наборы из всех,которые есть")]
internal class IQKits : RustPlugin {
[ConsoleCommand("kit")]
private void IQKITS_ConsoleCommand(ConsoleSystem.Arg arg) {
BasePlayer player = arg.Player();
if (arg == null || arg.Args == null || arg.Args.Length < 2) {
if (player != null) {
PagePlayers[player] = 0;
Interface_IQ_Kits(player);
}
return;
}
if (player != null && !player.IsAdmin) return;
switch (arg.Args[0]) {
case "create" : case "createkit" : case "add" : case "new" : {
if (player == null || !player.IsAdmin) 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 || !player.IsAdmin) return;
String NameKit = arg.Args[1];
if (String.IsNullOrWhiteSpace(NameKit)) {
PrintToConsole(player, "Введите корректное название!");
return;
}
KitRemove(player, NameKit);
break;
}
case "give" : {
if (player != null && !player.IsAdmin) return;
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;
}
}
}
protected override void LoadConfig() {
base.LoadConfig();
try {
config = Config.ReadObject<Configuration>();
if (config == null) LoadDefaultConfig();
}
catch {
PrintWarning($"Ошибка чтения #57 конфигурации 'oxide/config/{Name}', создаём новую конфигурацию!!");
LoadDefaultConfig();
}
NextTick(SaveConfig);
}
private Int32 GET_SKILL_COOLDOWN_PERCENT() {
return (Int32)IQPlagueSkill?.CallHook("API_GET_COOLDOWN_IQKITS");
}
private void GiveItem(BasePlayer player, Item item, ItemContainer cont = null) {
if (item == null) return;
PlayerInventory inv = player.inventory;
Boolean 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());
}
protected override void LoadDefaultConfig() {
config = Configuration.GetNewConfiguration();
}
protected override void SaveConfig() {
Config.WriteObject(config);
}
[JsonProperty("Дата с информацией о игроках")]
public Hash<UInt64, DataKitsUser> DataKitsUserList = new Hash<UInt64, DataKitsUser>();
private void DestroyKits(BasePlayer player) {
CuiHelper.DestroyUi(player, $"BTN_BACK_BUTTON");
CuiHelper.DestroyUi(player, $"BTN_NEXT_BUTTON");
for (Int32 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}");
}
}
public Boolean HasImage(String imageName) {
return (Boolean)ImageLibrary?.Call("HasImage", imageName);
}
public void SendChat(BasePlayer player, String Message, Chat.ChatChannel channel = Chat.ChatChannel.Global) {
Configuration.ReferenceSettings.IQChatSettings 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);
}
public static String FormatTime(TimeSpan time) {
String result = String.Empty;
if (time.Days != 0) result = $"{Format(time.Days, "дней", "дня", "день")}";
if (time.Hours != 0 && time.Days == 0) result = $"{Format(time.Hours, "часов", "часа", "час")}";
if (time.Minutes != 0 && time.Hours == 0 && time.Days == 0) result = $"{Format(time.Minutes, "минут", "минуты", "минута")}";
if (time.Seconds != 0 && time.Days == 0 && time.Minutes == 0 && time.Hours == 0) result = $"{Format(time.Seconds, "секунд", "секунды", "секунда")}";
return result;
}
private enum BiomeType {
None, Arid, Temperate, Tundra, Arctic
}
private void Interface_Alert_Kits(BasePlayer player, String Message) {
DestroyAlert(player);
CuiElementContainer container = new CuiElementContainer();
Configuration.InterfaceSettings Interface = config.InterfaceSetting;
Single FadeIn = Interface.InterfaceFadeIn;
Single FadeOut = Interface.InterfaceFadeOut;
String AlertBackground = $"INFO_ALERT_BACKGROUND_{Interface.PNGAlert}";
container.Add(new CuiElement {
FadeOut = FadeOut, Parent = IQKITS_OVERLAY, Name = $"INFO_ALERT_BACKGROUND", Components = {
new CuiRawImageComponent {
FadeIn = FadeIn, Png = GetImage(AlertBackground), Color = HexToRustFormat(Interface.HEXBlock)
}
, new CuiRectTransformComponent {
AnchorMin = "0.3213542 0.01018518", AnchorMax = $"0.6958333 0.1101852"
}
,
}
}
);
container.Add(new CuiLabel {
FadeOut = FadeOut, RectTransform = {
AnchorMin = "0 0", AnchorMax = "1 1"
}
, Text = {
FadeIn = FadeIn, Text = Message.ToUpper(), Color = HexToRustFormat(Interface.HEXLabels), Font = "robotocondensed-bold.ttf", Align = TextAnchor.MiddleCenter
}
}
, "INFO_ALERT_BACKGROUND", "TITLE_ALERT");
CuiHelper.AddUi(player, container);
timer.Once(2.5f, () => {
DestroyAlert(player);
}
);
}
private void Interface_Loaded_Kits(BasePlayer player) {
RegisteredDataUser(player);
IEnumerable<KeyValuePair<String, Configuration.Kits>> Kits = GetKits(player);
if (Kits == null || Kits.Skip(4 * (PagePlayers[player])).Take(4).Count() == 0) return;
CuiElementContainer container = new CuiElementContainer();
Configuration.InterfaceSettings Interface = config.InterfaceSetting;
Single FadeIn = Interface.InterfaceFadeIn;
Single FadeOut = Interface.InterfaceFadeOut;
Int32 CountKitPage = Kits.Skip(4 * (PagePlayers[player] + 1)).Take(4).Count();
Int32 x = 0, y = 0, i = 0;
foreach (KeyValuePair<String, Configuration.Kits> Kit in Kits.Skip(4 * (PagePlayers[player])).Take(4)) {
DataKitsUser.InfoKits Data = DataKitsUserList[player.userID].InfoKitsList[Kit.Key];
Boolean IsCooldown = Data.Cooldown >= CurrentTime();
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}");
container.Add(new CuiPanel {
FadeOut = FadeOut, CursorEnabled = true, RectTransform = {
AnchorMin = $"0 0", AnchorMax = $"0.4365226 1"
}
, //
Image = {
FadeIn = FadeIn, Color = HexToRustFormat(Interface.HEXBlock)
}
}
, $"KIT_PANEL_{i}", $"AVATAR_PANEL_{i}");
if (String.IsNullOrWhiteSpace(Kit.Value.Sprite)) {
CuiRawImageComponent 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"
}
,
}
}
);
}
else {
container.Add(new CuiElement {
FadeOut = FadeOut, Parent = $"AVATAR_PANEL_{i}", Name = $"AVATAR_{i}", Components = {
new CuiImageComponent {
FadeIn = FadeIn, Sprite = Kit.Value.Sprite
}
, new CuiRectTransformComponent {
AnchorMin = "0.0775194 0.07364181", AnchorMax = $"0.9224806 0.9185845"
}
,
}
}
);
}
container.Add(new CuiPanel {
FadeOut = FadeOut, CursorEnabled = true, RectTransform = {
AnchorMin = $"0.4602368 0.6472726", AnchorMax = $"1 1"
}
, Image = {
FadeIn = FadeIn, Color = HexToRustFormat(Interface.HEXBlock)
}
}
, $"KIT_PANEL_{i}", $"DISPLAY_NAME_PANEL_{i}");
container.Add(new CuiLabel {
FadeOut = FadeOut, RectTransform = {
AnchorMin = "0 0", AnchorMax = "0.965517 0.9449963"
}
, Text = {
FadeIn = FadeIn, Text = GetLang("UI_DISPLAY_NAME_KIT", player.UserIDString, Kit.Value.DisplayName.ToUpper()), Color = HexToRustFormat(Interface.HEXLabels), Font = "robotocondensed-bold.ttf", Align = TextAnchor.UpperRight
}
}
, $"DISPLAY_NAME_PANEL_{i}", $"TITLE_KIT_{i}");
container.Add(new CuiPanel {
FadeOut = FadeOut, CursorEnabled = true, RectTransform = {
AnchorMin = $"0.4602368 0.2519316", AnchorMax = $"1 0.6046609"
}
, Image = {
FadeIn = FadeIn, Color = HexToRustFormat(Interface.HEXBlock)
}
}
, $"KIT_PANEL_{i}", $"COOLDOWN_PANEL_{i}");
Double XMax = IsCooldown ? (Double)((Data.Cooldown - CurrentTime()) * Math.Pow(Kit.Value.CoolDown, -1)) : Data.Amount != 0 ? (Double)((Data.Amount) * Math.Pow(Kit.Value.Amount, -1)) : 1;
container.Add(new CuiPanel {
FadeOut = FadeOut, CursorEnabled = true, RectTransform = {
AnchorMin = $"0 0", AnchorMax = $"{XMax} 1", OffsetMin = "1 1", OffsetMax = "-2 -1"
}
, Image = {
FadeIn = FadeIn, Color = HexToRustFormat(Interface.HEXCooldowns)
}
}
, $"COOLDOWN_PANEL_{i}", $"COOLDOWN_LINE_{i}");
String InfoAmountAndCooldown = IsCooldown ? GetLang("UI_COOLDONW_KIT", player.UserIDString, FormatTime(TimeSpan.FromSeconds(Data.Cooldown - CurrentTime()))) : Data.Amount != 0 ? GetLang("UI_AMOUNT_KIT", player.UserIDString, Data.Amount) : GetLang("UI_COOLDONW_KIT_NO", player.UserIDString);
container.Add(new CuiLabel {
FadeOut = FadeOut, RectTransform = {
AnchorMin = "0 0", AnchorMax = "0.965517 0.9449963"
}
, Text = {
FadeIn = FadeIn, Text = InfoAmountAndCooldown, Color = HexToRustFormat(Interface.HEXLabels), Font = "robotocondensed-bold.ttf", Align = TextAnchor.UpperRight
}
}
, $"COOLDOWN_PANEL_{i}", $"COOLDOWN_TITLE{i}");
container.Add(new CuiButton {
FadeOut = FadeOut - 0.2f, RectTransform = {
AnchorMin = "0.465313 0", AnchorMax = "0.7258226 0.2170226"
}
, Button = {
FadeIn = FadeIn, Command = $"kit_ui_func information {Kit.Key}", Color = HexToRustFormat(Interface.HEXInfoItemButton),
}
, Text = {
FadeIn = FadeIn, Text = GetLang("UI_BTN_WHAT_INFO", player.UserIDString), Color = HexToRustFormat(Interface.HEXLabelsInfoItemButton), Align = TextAnchor.MiddleCenter
}
}
, $"KIT_PANEL_{i}", $"WHAT_INFO_{i}");
String KeyLangTake = IsCooldown ? GetLang("UI_BTN_TAKE_KIT_BLOCK", player.UserIDString) : Data.Amount != 0 ? GetLang("UI_BTN_TAKE_KIT", player.UserIDString, Data.Amount) : GetLang("UI_BTN_TAKE_KIT", player.UserIDString);
String HexButtonTake = IsCooldown ? Interface.HEXInfoItemButton : Data.Amount != 0 ? Interface.HEXAccesButton : Interface.HEXAccesButton;
String HexButtonLabelTake = IsCooldown ? Interface.HEXLabelsInfoItemButton : Data.Amount != 0 ? Interface.HEXLabelsAccesButton : Interface.HEXLabelsAccesButton;
String CommandButtonTake = IsCooldown ? "" : Data.Amount != 0 ? $"kit_ui_func take.kit {Kit.Key}" : $"kit_ui_func take.kit {Kit.Key}";
container.Add(new CuiButton {
FadeOut = FadeOut - 0.2f, RectTransform = {
AnchorMin = "0.7394261 0", AnchorMax = "1 0.2170733"
}
, Button = {
FadeIn = FadeIn, Command = CommandButtonTake, Color = HexToRustFormat(HexButtonTake)
}
, Text = {
FadeIn = FadeIn, Text = KeyLangTake, Color = HexToRustFormat(HexButtonLabelTake), Align = TextAnchor.MiddleCenter
}
}
, $"KIT_PANEL_{i}", $"TAKE_KIT_{i}");
x++;
if (x >= 2) {
x = 0;
y++;
}
i++;
if (x == 2 && y == 1) break;
}
if (PagePlayers[player] != 0) {
container.Add(new CuiButton {
FadeOut = FadeOut - 0.2f, RectTransform = {
AnchorMin = "0 0", AnchorMax = "0.1015625 0.05462963"
}
, Button = {
FadeIn = FadeIn, Command = "kit_ui_func back.page", Color = "0 0 0 0"
}
, Text = {
FadeIn = FadeIn, Text = GetLang("UI_BACK_BTN", player.UserIDString), Color = HexToRustFormat(Interface.HEXLabels), Align = TextAnchor.MiddleCenter
}
}
, IQKITS_OVERLAY, $"BTN_BACK_BUTTON");
}
if (CountKitPage != 0) {
container.Add(new CuiButton {
FadeOut = FadeOut - 0.2f, RectTransform = {
AnchorMin = "0.89895 0", AnchorMax = "1 0.05462963"
}
, Button = {
FadeIn = FadeIn, Command = $"kit_ui_func next.page", Color = "0 0 0 0"
}
, Text = {
FadeIn = FadeIn, Text = GetLang("UI_NEXT_BTN", player.UserIDString), Color = HexToRustFormat(Interface.HEXLabels), Align = TextAnchor.MiddleCenter
}
}
, IQKITS_OVERLAY, $"BTN_NEXT_BUTTON");
}
CuiHelper.AddUi(player, container);
}
private void DestroyInfoKits(BasePlayer player) {
for (Int32 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");
}
private enum TypeAutoKit {
Single, List, PriorityList, BiomeList,
}
private enum TypeKits {
Cooldown, Amount, Started, AmountCooldown,
}
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) {
Configuration.Kits.ItemsKit iteminfo = ItemToKit(item, ContainerItem.containerWear);
kititems.Add(iteminfo);
}
}
foreach (Item item in player.inventory.containerMain.itemList) {
if (item != null) {
Configuration.Kits.ItemsKit iteminfo = ItemToKit(item, ContainerItem.containerMain);
kititems.Add(iteminfo);
}
}
foreach (Item item in player.inventory.containerBelt.itemList) {
if (item != null) {
Configuration.Kits.ItemsKit iteminfo = ItemToKit(item, ContainerItem.containerBelt);
kititems.Add(iteminfo);
}
}
return kititems;
}
private 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 = "", UseRaidBlock = false, RankUser = "", Sprite = "assets/icons/gear.png", TypeKit = TypeKits.Cooldown, ItemKits = GetPlayerItems(player), WipeOpened = 0,
}
);
SaveConfig();
SendChat(player, $"Набор с ключем {NameKit} успешно создан");
}
private void Init() {
ReadData();
}
private IEnumerable<KeyValuePair<String, Configuration.Kits>> GetKits(BasePlayer player) {
IEnumerable<KeyValuePair<String, Configuration.Kits>> Kits = 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.ContainsKey(k.Key) && 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)) && !IsRaidBlocked(player, k.Value.UseRaidBlock) && IsRank(player.userID, k.Value.RankUser) ));
return Kits;
}
private IEnumerator DownloadImages() {
Puts("AddImages SkyPlugins.ru...");
foreach (KeyValuePair<String, Configuration.Kits> Kit in config.KitList) {
foreach (Configuration.Kits.ItemsKit img in Kit.Value.ItemKits.Where(i => !String.IsNullOrWhiteSpace(i.Shortname))) {
if (!HasImage($"{img.Shortname}_128px")) AddImage($"https://api.skyplugins.ru/api/getimage/{img.Shortname}/128", $"{img.Shortname}_128px");
}
}
yield return new WaitForSeconds(0.04f);
Puts("AddImages SkyPlugins.ru - completed..");
}
private Boolean IS_SKILL_RARE(BasePlayer player) {
return (Boolean)IQPlagueSkill?.CallHook("API_IS_RARE_SKILL_KITS", player);
}
private System.Object OnPlayerRespawned(BasePlayer player) {
player.inventory.Strip();
AutoKitGive(player);
return null;
}
private void ReadData() {
if ((Oxide.Core.Interface.Oxide.DataFileSystem.GetFile("IQKits/KitsData") != null && Oxide.Core.Interface.Oxide.DataFileSystem.ReadObject<Hash<UInt64, DataKitsUser>>("IQKits/KitsData").Count > 0) && (Oxide.Core.Interface.Oxide.DataFileSystem.GetFile("IQSystem/IQKits/KitsData") == null || Oxide.Core.Interface.Oxide.DataFileSystem.ReadObject<Hash<UInt64, DataKitsUser>>("IQSystem/IQKits/KitsData").Count == 0)) {
DataKitsUserList = Oxide.Core.Interface.Oxide.DataFileSystem.ReadObject<Hash<UInt64, DataKitsUser>>("IQKits/KitsData");
PrintWarning($"Миграция дата-файла..");
NextTick(() => {
Oxide.Core.Interface.Oxide.DataFileSystem.WriteObject("IQSystem/IQKits/KitsData", DataKitsUserList);
DataKitsUserList = Oxide.Core.Interface.Oxide.DataFileSystem.ReadObject<Hash<UInt64, DataKitsUser>>("IQSystem/IQKits/KitsData");
PrintWarning($"Миграция дата-файла завершена!\nПеренесено {DataKitsUserList.Count} записей");
}
);
}
else DataKitsUserList = Oxide.Core.Interface.Oxide.DataFileSystem.ReadObject<Hash<UInt64, DataKitsUser>>("IQSystem/IQKits/KitsData");
}
private void CheckKit() {
foreach (KeyValuePair<UInt64, DataKitsUser> Data in DataKitsUserList) {
UInt64 PlayerID = Data.Key;
foreach (KeyValuePair<String, Configuration.Kits> kitList in config.KitList.Where(k => DataKitsUserList[PlayerID].InfoKitsList.ContainsKey(k.Key))) {
String KitKey = kitList.Key;
DataKitsUser.InfoKits DataPlayer = Data.Value.InfoKitsList[KitKey];
if (!permission.UserHasPermission(PlayerID.ToString(), kitList.Value.Permission)) DataKitsUserList[PlayerID].InfoKitsList.Remove(KitKey);
}
}
}
private void OnServerInitialized() {
PrintWarning("\n-----------------------------\n" + " Author - Sempai#3239\n" + " VK - https://vk.com/rustnastroika/n" + " Discord - https://discord.gg/5DPTsRmd3G/n" if(ImageLibrary == null) {
NextTick(() => {
PrintError("Для корректной работы плагина требуется установить плагин ImageLibrary (https://umod.org/plugins/image-library)");
Interface.Oxide.UnloadPlugin(Name);
}
);
}
RegisteredPermissions();
LoadedImage();
foreach (BasePlayer p in BasePlayer.activePlayerList) OnPlayerConnected(p);
}
private Int32 API_KIT_PLAYER_GET_AMOUNT(BasePlayer player, String KitKey) {
if (player == null) return 0;
if (String.IsNullOrWhiteSpace(KitKey)) return 0;
if (!DataKitsUserList.ContainsKey(player.userID)) {
PrintError($"API_KIT_PLAYER_GET_AMOUNT : Такого игрока не существует в дата-файле");
return 0;
}
if (!config.KitList.ContainsKey(KitKey)) {
PrintError($"API_KIT_PLAYER_GET_AMOUNT : Ключа {KitKey} не существует");
return 0;
}
if (!DataKitsUserList[player.userID].InfoKitsList.ContainsKey(KitKey)) {
PrintError($"API_KIT_PLAYER_GET_AMOUNT : У игрока нет данного набора {KitKey}");
return 0;
}
return DataKitsUserList[player.userID].InfoKitsList[KitKey].Amount;
}
private Int32 API_KIT_PLAYER_GET_COOLDOWN(BasePlayer player, String KitKey) {
if (player == null) return 0;
if (String.IsNullOrWhiteSpace(KitKey)) return 0;
if (!DataKitsUserList.ContainsKey(player.userID)) {
PrintError($"API_KIT_PLAYER_GET_COOLDOWN : Такого игрока не существует в дата-файле");
return 0;
}
if (!config.KitList.ContainsKey(KitKey)) {
PrintError($"API_KIT_PLAYER_GET_COOLDOWN : Ключа {KitKey} не существует");
return 0;
}
if (!DataKitsUserList[player.userID].InfoKitsList.ContainsKey(KitKey)) {
PrintError($"API_KIT_PLAYER_GET_COOLDOWN : У игрока нет данного набора {KitKey}");
return 0;
}
return DataKitsUserList[player.userID].InfoKitsList[KitKey].Cooldown;
}
private String API_KIT_GET_ITEMS(String KitKey) {
Configuration.Kits Kit = config.KitList[KitKey];
if (Kit == null) return String.Empty;
List<ShortInfoKit> ShortKitList = new List<ShortInfoKit>();
foreach (Configuration.Kits.ItemsKit KitItems in Kit.ItemKits.Where(x => !String.IsNullOrWhiteSpace(x.Shortname))) ShortKitList.Add(new ShortInfoKit {
Shortname = KitItems.Shortname, Amount = KitItems.Amount, SkinID = KitItems.SkinID
}
);
return JsonConvert.SerializeObject(ShortKitList);
}
private 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} успешно удален");
}
private List<String> API_KIT_GET_ALL_KIT_LIST() {
List<String> KitList = new List<String>();
foreach (KeyValuePair<String, Configuration.Kits> Kit in config.KitList) KitList.Add(Kit.Key);
return KitList;
}
private void Interface_Info_Kits(BasePlayer player, String KitKey) {
DestroyInfoKits(player);
CuiElementContainer container = new CuiElementContainer();
Configuration.InterfaceSettings Interface = config.InterfaceSetting;
Single FadeIn = Interface.InterfaceFadeIn;
Single FadeOut = Interface.InterfaceFadeOut;
Configuration.Kits Kit = config.KitList[KitKey];
container.Add(new CuiElement {
FadeOut = FadeOut, Parent = IQKITS_OVERLAY, Name = $"INFO_BACKGROUND", Components = {
new CuiRawImageComponent {
FadeIn = FadeIn, Png = GetImage($"INFO_BACKGROUND_{Interface.PNGInfoPanel}"), Color = HexToRustFormat(Interface.HEXBlock)
}
, new CuiRectTransformComponent {
AnchorMin = "0.4005208 0.2416667", AnchorMax = $"0.5958334 0.825"
}
,
}
}
);
container.Add(new CuiButton {
FadeOut = FadeOut - 0.2f, RectTransform = {
AnchorMin = "0.02933349 0.01269239", AnchorMax = "0.9706663 0.1111111"
}
, Button = {
FadeIn = FadeIn, Command = $"kit_ui_func hide.info", Color = HexToRustFormat(Interface.HEXInfoItemButton)
}
, Text = {
FadeIn = FadeIn, Text = GetLang("UI_HIDE_BTN", player.UserIDString), Color = HexToRustFormat(Interface.HEXLabelsInfoItemButton), Align = TextAnchor.MiddleCenter
}
}
, $"INFO_BACKGROUND", $"HIDE_INFO_BTN");
container.Add(new CuiLabel {
FadeOut = FadeOut, RectTransform = {
AnchorMin = "0.3916669 0.1444444", AnchorMax = "0.60625 0.237037"
}
, Text = {
FadeIn = FadeIn, Text = GetLang("UI_WHAT_INFO_TITLE", player.UserIDString, Kit.DisplayName.ToUpper()), Color = HexToRustFormat(Interface.HEXLabels), Font = "robotocondensed-bold.ttf", Align = TextAnchor.UpperCenter
}
}
, IQKITS_OVERLAY, $"TITLE_KIT_INFO");
Int32 ItemCount = 0;
Single itemMinPosition = 219f;
Single itemWidth = 0.413646f - 0.24f;
/// Ширина
Single itemMargin = 0.439895f - 0.415f;
/// Расстояние между
Int32 itemCount = Kit.ItemKits.Count;
Single itemMinHeight = 0.89f;
// Сдвиг по вертикали
Single itemHeight = 0.1f;
/// Высота
Int32 ItemTarget = 5;
if (itemCount > ItemTarget) {
itemMinPosition = 0.5f - ItemTarget / 2f * itemWidth - (ItemTarget - 1) / 2f * itemMargin;
itemCount -= ItemTarget;
}
else {
itemMinPosition = 0.5f - itemCount / 2f * itemWidth - (itemCount - 1) / 2f * itemMargin;
}
Int32 i = 0;
foreach (Configuration.Kits.ItemsKit Item in Kit.ItemKits.Take(35)) {
container.Add(new CuiElement {
FadeOut = FadeOut, Parent = "INFO_BACKGROUND", Name = $"KIT_ITEM_{i}", Components = // debug
{
new CuiImageComponent {
FadeIn = FadeIn, Color = HexToRustFormat("#37353E77")
}
, new CuiRectTransformComponent {
AnchorMin = $"{itemMinPosition} {itemMinHeight}", AnchorMax = $"{itemMinPosition + itemWidth} {itemMinHeight + itemHeight}"
}
, new CuiOutlineComponent {
Color = HexToRustFormat(Interface.HEXBlockItemInfo), Distance = "0 -1.5", UseGraphicAlpha = true
}
}
}
);
if (String.IsNullOrWhiteSpace(Item.Sprite)) {
CuiRawImageComponent ComponentAvatar = !String.IsNullOrWhiteSpace(Item.PNG) ? new CuiRawImageComponent {
FadeIn = FadeIn, Png = GetImage($"ITEM_KIT_PNG_{Item.PNG}")
}
: new CuiRawImageComponent {
FadeIn = FadeIn, Png = GetImage($"{Item.Shortname}_128px")
}
;
container.Add(new CuiElement {
FadeOut = FadeOut, Parent = $"KIT_ITEM_{i}", Name = $"ITEM_{i}", Components = {
ComponentAvatar, new CuiRectTransformComponent {
AnchorMin = "0 0", AnchorMax = $"1 1"
}
,
}
}
);
}
else {
container.Add(new CuiElement {
FadeOut = FadeOut, Parent = $"KIT_ITEM_{i}", Name = $"ITEM_{i}", Components = {
new CuiImageComponent {
FadeIn = FadeIn, Sprite = Item.Sprite
}
, new CuiRectTransformComponent {
AnchorMin = "0 0", AnchorMax = $"1 1"
}
,
}
}
);
}
if (Item.Rare != 0) {
Int32 Rare = IQPlagueSkill ? IS_SKILL_RARE(player) ? Item.Rare + GET_SKILL_RARE_PERCENT() : Item.Rare : Item.Rare;
if (Rare >= 100) continue;
container.Add(new CuiPanel {
FadeOut = FadeOut, RectTransform = {
AnchorMin = "0 0", AnchorMax = "1 1"
}
, Image = {
FadeIn = FadeIn, Color = HexToRustFormat(Interface.HEXBackground)
}
}
, $"KIT_ITEM_{i}", $"RARE_BACKGROUND_{i}");
container.Add(new CuiLabel {
FadeOut = FadeOut, RectTransform = {
AnchorMin = "0 0", AnchorMax = "1 1"
}
, Text = {
FadeIn = FadeIn, Text = $"{Rare}%", FontSize = 10, Color = HexToRustFormat(Interface.HEXLabels), Font = "robotocondensed-bold.ttf", Align = TextAnchor.MiddleCenter
}
}
, $"RARE_BACKGROUND_{i}", $"RARE_LABEL_{i}");
}
container.Add(new CuiLabel {
FadeOut = FadeOut, RectTransform = {
AnchorMin = "0 0", AnchorMax = "0.930693 0.2688163"
}
, Text = {
FadeIn = FadeIn, Text = $"x{Item.Amount}", FontSize = 10, Color = HexToRustFormat(Interface.HEXLabels), Font = "robotocondensed-bold.ttf", Align = TextAnchor.MiddleRight
}
}
, $"KIT_ITEM_{i}", $"KIT_ITEM_AMOUNT_{i}");
i++;
ItemCount++;
itemMinPosition += (itemWidth + itemMargin);
if (ItemCount % ItemTarget == 0) {
itemMinHeight -= (itemHeight + (itemMargin * 1f));
if (itemCount > ItemTarget) {
itemMinPosition = 0.5f - ItemTarget / 2f * itemWidth - (ItemTarget - 1) / 2f * itemMargin;
itemCount -= ItemTarget;
}
else {
itemMinPosition = 0.5f - itemCount / 2f * itemWidth - (itemCount - 1) / 2f * itemMargin;
}
}
}
CuiHelper.AddUi(player, container);
}
private Boolean IsRank(UInt64 userID, String Key) {
if (!IQRankSystem) return true;
if (String.IsNullOrWhiteSpace(Key)) return true;
return (Boolean)IQRankSystem?.Call("API_GET_AVAILABILITY_RANK_USER", userID, Key);
}
private List<String> API_KIT_GET_AUTO_KIT_LIST() {
List<String> KitList = new List<String>();
for (Int32 i = 0; i < config.GeneralSetting.AutoKitSettings.KitListRandom.Count; i++) KitList.Add(config.GeneralSetting.AutoKitSettings.KitListRandom[i].StartKitKey);
return KitList;
}
private static Double CurrentTime() {
return DateTime.UtcNow.Subtract(epoch).TotalSeconds;
}
/// <summary>
/// Обновление 1.1.9
/// - Корректировка перезарядки в UI
/// /// </summary>
[PluginReference]
private readonly Plugin ImageLibrary, IQPlagueSkill, IQChat, IQRankSystem;
private IEnumerator UI_UpdateCooldown(BasePlayer player) {
Configuration.InterfaceSettings Interface = config.InterfaceSetting;
IEnumerable<KeyValuePair<String, Configuration.Kits>> Kits = GetKits(player);
while (player.HasFlag(BaseEntity.Flags.Reserved3)) {
Int32 i = 0;
foreach (KeyValuePair<String, Configuration.Kits> Kit in Kits.Skip(4 * (PagePlayers[player])).Take(4)) {
CuiElementContainer container = new CuiElementContainer();
CuiHelper.DestroyUi(player, $"COOLDOWN_LINE_{i}");
CuiHelper.DestroyUi(player, $"COOLDOWN_TITLE{i}");
DataKitsUser.InfoKits Data = DataKitsUserList[player.userID].InfoKitsList[Kit.Key];
Boolean IsCooldown = Data.Cooldown >= CurrentTime();
Double XMax = IsCooldown ? (Double)((Data.Cooldown - CurrentTime()) * Math.Pow(Kit.Value.CoolDown, -1)) : Data.Amount != 0 ? (Double)((Data.Amount) * Math.Pow(Kit.Value.Amount, -1)) : 1;
container.Add(new CuiPanel {
CursorEnabled = true, RectTransform = {
AnchorMin = $"0 0", AnchorMax = $"{XMax} 1", OffsetMin = "1 1", OffsetMax = "-2 -1"
}
, Image = {
Color = HexToRustFormat(Interface.HEXCooldowns)
}
}
, $"COOLDOWN_PANEL_{i}", $"COOLDOWN_LINE_{i}");
String InfoAmountAndCooldown = IsCooldown ? GetLang("UI_COOLDONW_KIT", player.UserIDString, FormatTime(TimeSpan.FromSeconds(Data.Cooldown - CurrentTime()))) : Data.Amount != 0 ? GetLang("UI_AMOUNT_KIT", player.UserIDString, Data.Amount) : GetLang("UI_COOLDONW_KIT_NO", player.UserIDString);
container.Add(new CuiLabel {
RectTransform = {
AnchorMin = "0 0", AnchorMax = "0.965517 0.9449963"
}
, Text = {
Text = InfoAmountAndCooldown, Color = HexToRustFormat(Interface.HEXLabels), Font = "robotocondensed-bold.ttf", Align = TextAnchor.UpperRight
}
}
, $"COOLDOWN_PANEL_{i}", $"COOLDOWN_TITLE{i}");
i++;
CuiHelper.AddUi(player, container);
}
yield return new WaitForSeconds(1);
}
}
private void CachingImage(BasePlayer player) {
Configuration.InterfaceSettings Interface = config.InterfaceSetting;
foreach (KeyValuePair<String, Configuration.Kits> Kit in config.KitList.Where(k => !String.IsNullOrWhiteSpace(k.Value.PNG))) {
SendImage(player, $"KIT_{Kit.Value.PNG}");
foreach (Configuration.Kits.ItemsKit ItemKit in Kit.Value.ItemKits.Where(ik => !String.IsNullOrWhiteSpace(ik.Shortname))) SendImage(player, $"{ItemKit.Shortname}_128px");
foreach (Configuration.Kits.ItemsKit 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}");
}
[ConsoleCommand("kit_ui_func")]
private 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;
}
}
}
public static DateTime RealTime = DateTime.Now.Date;
private void KitEdit(BasePlayer player, String NameKit) {
if (!player.IsAdmin) return;
if (!config.KitList.ContainsKey(NameKit)) {
SendChat(player, "Ключ данного набора не существует!");
return;
}
Configuration.Kits Kit = config.KitList[NameKit];
Kit.ItemKits = GetPlayerItems(player);
SaveConfig();
SendChat(player, $"Предметы набора с ключем {NameKit} успешно изменены, настройки сохранены");
}
private void Unload() {
foreach (BasePlayer player in BasePlayer.activePlayerList) DestroyAll(player);
if (DownloadImage != null) ServerMgr.Instance.StopCoroutine(DownloadImage);
CheckKit();
WriteData();
PlayersRoutine = null;
DownloadImage = null;
}
public static StringBuilder sb = new StringBuilder();
private String GetRankName(String Key) {
String Rank = String.Empty;
if (!IQRankSystem) return Rank;
return (String)IQRankSystem?.Call("API_GET_RANK_NAME", Key);
}
private void OnNewSave(String filename) {
ClearData();
}
private static Configuration config = new Configuration();
public Boolean IsRareDrop(Int32 Rare) {
return UnityEngine.Random.Range(0, 100) >= (100 - (Rare > 100 ? 100 : Rare));
}
public static Int32 WipeTime = RealTime.Subtract(TimeCreatedSave).Days;
public Dictionary<BasePlayer, Int32> PagePlayers = new Dictionary<BasePlayer, Int32>();
private void ClearData() {
if (!config.GeneralSetting.AutoWipeClearKits) return;
DataKitsUserList.Clear();
WriteData();
}
public void SendImage(BasePlayer player, String imageName, UInt64 imageId = 0) {
ImageLibrary?.Call("SendImage", player, imageName, imageId);
}
private class Configuration {
internal class Kits {
[JsonProperty("Тип набора(0 - С перезарядкой, 1 - Лимитированый, 2 - Стартовый(АвтоКит), 3 - Лимитированый с перезарядкой)")]
public TypeKits TypeKit;
[JsonProperty("Отображаемое имя")]
public String DisplayName;
[JsonProperty("Через сколько дней вайпа будет доступен набор")]
public Int32 WipeOpened;
[JsonProperty("Разрешить использовать этот набор во время рейдблока (true - да/false - нет)")]
public Boolean UseRaidBlock = true;
[JsonProperty("IQRankSystem : Разрешить использовать этот набор только по рангу (Впишите ключ с рангом).Если вам это не нужно - оставьте поле пустым")]
public String RankUser = "";
[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 Int32 CoolDown;
[JsonProperty("Количество сколько наборов можно взять")]
public Int32 Amount;
[JsonProperty("Предметы , которые будут даваться в данном наборе")]
public List<ItemsKit> ItemKits = new List<ItemsKit>();
internal class ItemsKit {
[JsonProperty("Выберите контейнер в который будет перенесен предмет(0 - Одежда, 1 - Панель быстрого дос
// ... [Code preview truncated due to length. Full source in attached file] ...