C#:
using System.Text;
using UnityEngine;
using System;
using Oxide.Core.Plugins;
using ConVar;
using System.Collections.Generic;
using Oxide.Core;
using Oxide.Game.Rust.Cui;
using Newtonsoft.Json;
using System.Collections;
using System.Linq;
namespace Oxide.Plugins {
[Info("IQKits", "sborka", "1.3.10")]
[Description("Киты")]
internal class IQKits : RustPlugin {
private Boolean API_IS_KIT_PLAYER(BasePlayer player, String KitKey) {
if (player == null) return false;
if (String.IsNullOrWhiteSpace(KitKey)) return false;
if (!DataKitsUserList.ContainsKey(player.userID)) return false;
if (!config.KitList.ContainsKey(KitKey)) return false;
return DataKitsUserList[player.userID].InfoKitsList.ContainsKey(KitKey);
}
private Boolean API_IS_KIT(String KitKey) {
if (String.IsNullOrWhiteSpace(KitKey)) return false;
return config.KitList.ContainsKey(KitKey);
}
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);
}
private void OnServerShutdown() => Unload();
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_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);
}
);
}
public static DateTime RealTime = DateTime.Now.Date;
private String GetRankName(String Key) {
String Rank = String.Empty;
if (!IQRankSystem) return Rank;
return (String)IQRankSystem?.Call("API_GET_RANK_NAME", Key);
}
private void RegisteredPermissions() {
Configuration.GeneralSettings GeneralSettings = config.GeneralSetting;
Dictionary<String, Configuration.Kits> KitList = config.KitList;
foreach (Configuration.GeneralSettings.AutoKit.KitSettings PermissionGeneral in GeneralSettings.AutoKitSettings.KitListRandom) {
if (!permission.PermissionExists(PermissionGeneral.Permissions, this)) permission.RegisterPermission(PermissionGeneral.Permissions, this);
}
foreach (Configuration.GeneralSettings.AutoKit.KitSettings PermissionGeneral in GeneralSettings.AutoKitSettings.KitListPriority) {
if (!permission.PermissionExists(PermissionGeneral.Permissions, this)) permission.RegisterPermission(PermissionGeneral.Permissions, this);
}
foreach (Configuration.GeneralSettings.AutoKit.BiomeKits PermissionGeneral in GeneralSettings.AutoKitSettings.BiomeStartedKitList) {
if (!permission.PermissionExists(PermissionGeneral.Kits.Permissions, this)) permission.RegisterPermission(PermissionGeneral.Kits.Permissions, this);
}
foreach (KeyValuePair<String, Configuration.Kits> PermissionKits in KitList) {
if (!permission.PermissionExists(PermissionKits.Value.Permission, this)) permission.RegisterPermission(PermissionKits.Value.Permission, this);
}
}
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 void Interface_IQ_Kits(BasePlayer player) {
DestroyAll(player);
player.SetFlag(BaseEntity.Flags.Reserved3, true);
CuiElementContainer container = new CuiElementContainer();
Configuration.InterfaceSettings Interface = config.InterfaceSetting;
Single FadeIn = Interface.InterfaceFadeIn;
Single 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");
if (Interface.CloseType) {
container.Add(new CuiButton {
FadeOut = FadeOut - 0.2f, RectTransform = {
AnchorMin = "0.871875 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");
}
else {
container.Add(new CuiButton {
FadeOut = FadeOut - 0.2f, RectTransform = {
AnchorMin = "0 0", AnchorMax = "1 1"
}
, Button = {
FadeIn = FadeIn, Command = $"kit_ui_func close.ui", Color = "0 0 0 0"
}
, Text = {
FadeIn = FadeIn, Text = ""
}
}
, IQKITS_OVERLAY, "CLOSE_BTN");
}
CuiHelper.AddUi(player, container);
Interface_Loaded_Kits(player);
PlayersRoutine[player] = ServerMgr.Instance.StartCoroutine(UI_UpdateCooldown(player));
}
public Coroutine DownloadImage = null;
private Dictionary<BasePlayer, Coroutine> PlayersRoutine = new Dictionary<BasePlayer, Coroutine>();
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 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;
}
public Boolean AddImage(String url, String shortname, UInt64 skin = 0) {
return (Boolean)ImageLibrary?.Call("AddImage", url, shortname, skin);
}
public Boolean HasImage(String imageName) {
return (Boolean)ImageLibrary?.Call("HasImage", imageName);
}
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());
}
public void SendImage(BasePlayer player, String imageName, UInt64 imageId = 0) {
ImageLibrary?.Call("SendImage", player, imageName, imageId);
}
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;
}
public String GetLang(String LangKey, String userID = null, params System.Object[] args) {
sb.Clear();
if (args != null) {
sb.AppendFormat(lang.GetMessage(LangKey, this, userID), args);
return sb.ToString();
}
return lang.GetMessage(LangKey, this, userID);
}
private 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);
if (PlayersRoutine != null) if (PlayersRoutine.ContainsKey(player) && PlayersRoutine[player] != null) {
ServerMgr.Instance.StopCoroutine(PlayersRoutine[player]);
PlayersRoutine[player] = null;
}
}
private String API_KIT_GET_NAME(String KitKey) {
if (String.IsNullOrWhiteSpace(KitKey)) return "NONE";
if (!config.KitList.ContainsKey(KitKey)) return "NONE";
return config.KitList[KitKey].DisplayName;
}
protected override void SaveConfig() {
Config.WriteObject(config);
}
private enum TypeContent {
Ammo, Contents
}
private String GetImage(String fileName, UInt64 skin = 0) {
String imageId = (String)plugins.Find("ImageLibrary").CallHook("GetImage", fileName, skin);
if (!String.IsNullOrEmpty(imageId)) return imageId;
return String.Empty;
}
private void API_KIT_GIVE(BasePlayer player, String KitKey) {
if (player == null) return;
if (!config.KitList.ContainsKey(KitKey)) {
PrintError($"Ключа {KitKey} не существует, набор не выдан!");
return;
}
ParseAndGive(player, KitKey);
}
private static readonly DateTime epoch = new DateTime(1970, 1, 1, 0, 0, 0);
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 OnPlayerDisconnected(BasePlayer player, String reason) {
player.SetFlag(BaseEntity.Flags.Reserved3, false);
if (PlayersRoutine.ContainsKey(player)) PlayersRoutine.Remove(player);
}
private void OnPlayerConnected(BasePlayer player) {
CachingImage(player);
RegisteredDataUser(player);
if (!PlayersRoutine.ContainsKey(player)) PlayersRoutine.Add(player, null);
}
private void LoadedImage() {
Configuration.InterfaceSettings Interface = config.InterfaceSetting;
foreach (KeyValuePair<String, Configuration.Kits> 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 (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}");
}
}
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}");
DownloadImage = ServerMgr.Instance.StartCoroutine(DownloadImages());
}
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 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 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 void ParseAndGive(BasePlayer player, String KitKey) {
Configuration.Kits Kit = config.KitList[KitKey];
List<Configuration.Kits.ItemsKit> ItemKit = Kit.ItemKits;
foreach (Configuration.Kits.ItemsKit Item in ItemKit) {
if (Item.Rare != 0) {
Int32 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 {
Int32 Amount = Item.RandomDropSettings.UseRandomItems ? UnityEngine.Random.Range(Item.RandomDropSettings.MinAmount, Item.RandomDropSettings.MaxAmount) : (Item.Amount > 1 ? Item.Amount : 1);
Item item = ItemManager.CreateByName(Item.Shortname, Amount, Item.SkinID);
if (!String.IsNullOrWhiteSpace(Item.DisplayName)) item.name = Item.DisplayName;
foreach (Configuration.Kits.ItemsKit.ItemContents Content in Item.ContentsItem) {
Item ItemContent = ItemManager.CreateByName(Content.Shortname, Content.Amount);
ItemContent.condition = Content.Condition;
switch (Content.ContentType) {
case TypeContent.Contents : {
ItemContent.MoveToContainer(item.contents);
break;
}
case TypeContent.Ammo : {
BaseProjectile Weapon = item.GetHeldEntity() as BaseProjectile;
if (Weapon != null) {
Weapon.primaryMagazine.contents = ItemContent.amount;
Weapon.primaryMagazine.ammoType = ItemManager.FindItemDefinition(Content.Shortname);
}
break;
}
}
}
GiveItem(player, item, Item.ContainerItemType == ContainerItem.containerBelt ? player.inventory.containerBelt : Item.ContainerItemType == ContainerItem.containerWear ? player.inventory.containerWear : player.inventory.containerMain);
}
}
}
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 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 System.Object OnPlayerRespawned(BasePlayer player) {
player.inventory.Strip();
AutoKitGive(player);
return null;
}
private Boolean IS_SKILL_COOLDOWN(BasePlayer player) {
return (Boolean)IQPlagueSkill?.CallHook("API_IS_COOLDOWN_SKILL_KITS", player);
}
private Int32 API_KIT_GET_MAX_COOLDOWN(String KitKey) {
if (String.IsNullOrWhiteSpace(KitKey)) return 0;
if (!config.KitList.ContainsKey(KitKey)) {
PrintError($"API_KIT_GET_MAX_COOLDOWN : Ключа {KitKey} не существует!");
return 0;
}
return config.KitList[KitKey].CoolDown;
}
[ChatCommand("kit")]
private void IQKITS_ChatCommand(BasePlayer player, String cmd, String[] arg) {
if (player.HasFlag(BaseEntity.Flags.Reserved3)) return;
if (arg.Length == 1) {
String KitKey = arg[0];
if (String.IsNullOrWhiteSpace(KitKey)) {
SendChat(player, GetLang("CHAT_ALERT_PLAYER_KIT_COMMAND_EMPTY_KEY", player.UserIDString));
return;
}
if (!DataKitsUserList[player.userID].InfoKitsList.ContainsKey(KitKey)) {
String KistList = String.Empty;
foreach (KeyValuePair<String, DataKitsUser.InfoKits> keyValuePair in DataKitsUserList[player.userID].InfoKitsList.OrderBy(x => x.Value.Cooldown >= CurrentTime()).Where(k => config.KitList.ContainsKey(k.Key) && ((config.KitList[k.Key].TypeKit != TypeKits.Started && WipeTime >= config.KitList[k.Key].WipeOpened) && (((config.KitList[k.Key].TypeKit == TypeKits.Amount || config.KitList[k.Key].TypeKit == TypeKits.AmountCooldown) && (DataKitsUserList[player.userID].InfoKitsList.ContainsKey(k.Key) && DataKitsUserList[player.userID].InfoKitsList[k.Key].Amount > 0)) || config.KitList[k.Key].TypeKit == TypeKits.Cooldown)))) {
Boolean IsCooldown = keyValuePair.Value.Cooldown >= CurrentTime();
String InfoAmountAndCooldown = IsCooldown ? GetLang("CHAT_ALERT_PLAYER_INFO_KIT_LIST_KIT_FORMAT_COOLDOWN", player.UserIDString, keyValuePair.Key, FormatTime(TimeSpan.FromSeconds(keyValuePair.Value.Cooldown - CurrentTime()))) : keyValuePair.Value.Amount != 0 ? GetLang("CHAT_ALERT_PLAYER_INFO_KIT_LIST_KIT_FORMAT_AMOUNT", player.UserIDString, keyValuePair.Key, keyValuePair.Value.Amount) : GetLang("CHAT_ALERT_PLAYER_INFO_KIT_LIST_KIT_FORMAT_YES", player.UserIDString, keyValuePair.Key);
KistList += InfoAmountAndCooldown;
}
SendChat(player, GetLang("CHAT_ALERT_PLAYER_INFO_KIT_LIST", player.UserIDString, KistList));
return;
}
TakeKit(player, KitKey, true);
return;
}
if (arg.Length < 2) {
PagePlayers[player] = 0;
Interface_IQ_Kits(player);
return;
}
switch (arg[0]) {
case "create" : case "createkit" : case "add" : case "new" : {
if (!player.IsAdmin) return;
String NameKit = arg[1];
if (String.IsNullOrWhiteSpace(NameKit)) {
SendChat(player, "Введите корректное название!");
return;
}
CreateNewKit(player, NameKit);
break;
}
case "remove" : case "delete" : case "revoke" : {
if (!player.IsAdmin) return;
String NameKit = arg[1];
if (String.IsNullOrWhiteSpace(NameKit)) {
SendChat(player, "Введите корректное название!");
return;
}
KitRemove(player, NameKit);
break;
}
case "copy" : case "edit" : {
if (!player.IsAdmin) return;
String NameKit = arg[1];
if (String.IsNullOrWhiteSpace(NameKit)) {
SendChat(player, "Введите корректное название!");
return;
}
KitEdit(player, NameKit);
break;
}
case "give" : {
if (!player.IsAdmin) return;
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;
}
}
}
private void Init() {
ReadData();
}
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}");
}
if (Item.RandomDropSettings.UseRandomItems) {
string amount = $"x{Item.RandomDropSettings.MinAmount}-{Item.RandomDropSettings.MaxAmount}";
container.Add(new CuiLabel {
FadeOut = FadeOut, RectTransform = {
AnchorMin = "0 0", AnchorMax = "0.930693 0.2688163"
}
, Text = {
FadeIn = FadeIn, Text = amount, FontSize = amount.Length > 7 ? 8 : amount.Length > 9 ? 7 : 10, Color = HexToRustFormat(Interface.HEXLabels), Font = "robotocondensed-bold.ttf", Align = TextAnchor.MiddleRight
}
}
, $"KIT_ITEM_{i}", $"KIT_ITEM_AMOUNT_{i}");
}
else {
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 enum TypeAutoKit {
Single, List, PriorityList, BiomeList,
}
private Int32 GET_SKILL_RARE_PERCENT() {
return (Int32)IQPlagueSkill?.CallHook("API_GET_RARE_IQKITS");
}
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 void DestroyAlert(BasePlayer player) {
CuiHelper.DestroyUi(player, $"TITLE_ALERT");
CuiHelper.DestroyUi(player, $"INFO_ALERT_BACKGROUND");
}
public class DataKitsUser {
[JsonProperty("Информация о наборах игрока")]
public Dictionary<String, InfoKits> InfoKitsList = new Dictionary<String, InfoKits>();
internal class InfoKits {
public Int32 Amount;
public Int32 Cooldown;
}
}
private enum TypeKits {
Cooldown, Amount, Started, AmountCooldown,
}
private void OnServerInitialized() {
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 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.43654976 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.72584976 0.21704976"
}
, 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"
}
// ... [Code preview truncated due to length. Full source in attached file] ...