C#:
// Все права принадлежат дискорд сообществу https://discord.gg/VgNHPpNrz6
using Newtonsoft.Json;
using Oxide.Core;
using Oxide.Core.Libraries.Covalence;
using Oxide.Core.Plugins;
using Oxide.Game.Rust.Cui;
using System.Globalization;
using UnityEngine;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using Oxide.Core;
using Oxide.Core.Configuration;
using Oxide.Core.Libraries;
using Oxide.Game.Rust.Cui;
using Oxide.Core.Plugins;
using Oxide.Plugins;
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using UnityEngine;
using Facepunch.Math;
using UnityEngine.UI;
namespace Oxide.Plugins {
[Info("PlayerKits", "Ifte", "1.0.0")]
[Description("Create kits for players.")]
public class PlayerKits : RustPlugin {
/*------------------------------------
*
* PlayerKits by Ifte
* Support: https://discord.gg/cCWadjcapr
* Fiverr: https://www.fiverr.com/s/e2pkYY
* CODECCREATION
*
------------------------------------*/
#region Variables
[PluginReference]
Plugin ImageLibrary, ZoneManager;
private Configuration config;
private PlayerData playerData;
private KitsUIData _data;
private readonly string AdminPerm = "PlayerKits.admin";
private readonly string AutoKitPerm = "PlayerKits.changeautokit";
private static double CurrentTime => DateTime.UtcNow.Subtract(Epoch).TotalSeconds;
private static DateTime Epoch = new DateTime(1970, 1, 1, 0, 0, 0);
private static double LastWipeTime;
private enum NotifyType {
SUCCESS, ERROR
}
private Dictionary<string, string> Images = new Dictionary<string, string>();
#endregion
#region Config & Lang
protected override void LoadConfig() {
base.LoadConfig();
config = Config.ReadObject<Configuration>();
}
protected override void LoadDefaultConfig() {
config = new Configuration();
}
protected override void SaveConfig() {
Config.WriteObject(config, true);
}
private class Configuration {
[JsonProperty(PropertyName = "Kit Chat Commands")]
public string[] Commands = new[] {
"kitmenu", "kitlist", "kits"
}
;
[JsonProperty(PropertyName = "Chat Prefix")]
public string Prefix = "<color=#FFD700>[PlayerKits]</color> »";
[JsonProperty(PropertyName = "Chat Avator")]
public ulong Avatar = 0;
[JsonProperty(PropertyName = "Setting")]
public SettingsKits Settings = new SettingsKits();
[JsonProperty(PropertyName = "UI Settings")]
public KitsUISetting UI = new KitsUISetting();
}
private class SettingsKits {
[JsonProperty(PropertyName = "Wipe player data when the server is wiped")]
public bool WipePlayerDataOnWipe = true;
[JsonProperty(PropertyName = "Give spawn kits to players")]
public bool SpawnKits = true;
[JsonProperty(PropertyName = "Allow players to toggle spawn kits on spawn")]
public bool AllowToggleSpawn = true;
}
private class KitsUISetting {
[JsonProperty(PropertyName = "Background UI")]
public HexColor bacground = new HexColor("#000000", 90);
[JsonProperty(PropertyName = "Background Image Full")]
public string bacgroundImgFull = "";
[JsonProperty(PropertyName = "Topbar UI")]
public TopBarUISetting topbar = new TopBarUISetting();
[JsonProperty(PropertyName = "Category UI")]
public CategoryUISetting category = new CategoryUISetting();
[JsonProperty(PropertyName = "Kit List UI")]
public KitListUISetting kitList = new KitListUISetting();
}
private class TopBarUISetting {
[JsonProperty(PropertyName = "Background Color")]
public HexColor bacground = new HexColor("#000000", 0);
[JsonProperty(PropertyName = "Background Image")]
public string backgroundImage = "";
[JsonProperty(PropertyName = "Display Name")]
public string DisplayName = "PLAYER KITS";
[JsonProperty(PropertyName = "Logo URL")]
public string logourl = "https://rustlabs.com/img/skins/324/10197.png";
[JsonProperty(PropertyName = "Bar Color")]
public HexColor barColor = new HexColor("#BFBFAC", 100);
}
private class CategoryUISetting {
[JsonProperty(PropertyName = "Background Color")]
public HexColor bacground = new HexColor("#000000", 0);
[JsonProperty(PropertyName = "Background Image")]
public string backgroundImage = "";
[JsonProperty(PropertyName = "Display Name")]
public string DisplayName = "CATEGORY";
[JsonProperty(PropertyName = "Category List Active Color")]
public HexColor cateBoxColorActive = new HexColor("#FFC700", 60);
[JsonProperty(PropertyName = "Category List Inactive Color")]
public HexColor cateBoxColorInactive = new HexColor("#3C4B24", 60);
}
private class KitListUISetting {
[JsonProperty(PropertyName = "Background Color")]
public HexColor bacground = new HexColor("#000000", 0);
[JsonProperty(PropertyName = "Background Image")]
public string backgroundImage = "";
[JsonProperty(PropertyName = "Kit Background Color")]
public HexColor kitBack = new HexColor("#1B201B", 90);
[JsonProperty(PropertyName = "Kit Description Color")]
public HexColor kitDesc = new HexColor("#BFBFAC", 100);
[JsonProperty(PropertyName = "Kit Bookmark Icon")]
public string kitBookmarkIcon = "https://i.postimg.cc/VkyrF9vf/star.png";
[JsonProperty(PropertyName = "Kit Description Font")]
public string kitDescFont = "robotocondensed-bold.ttf";
[JsonProperty(PropertyName = "Kit Description Font Size")]
public int kitDescSize = 12;
[JsonProperty(PropertyName = "Kit Infos Name Color")]
public HexColor kitInfo = new HexColor("#9CD293", 100);
[JsonProperty(PropertyName = "Kit Infos Value Color")]
public HexColor kitInfoValue = new HexColor("#E7E277", 100);
[JsonProperty(PropertyName = "Kit Icons Color")]
public HexColor kitIconsColor = new HexColor("#9CD293", 100);
[JsonProperty(PropertyName = "Kit Limit Icon")]
public string kitLimitIcon = "https://i.postimg.cc/Rhsdz9t2/warning.png";
[JsonProperty(PropertyName = "Kit Cooldown Icon")]
public string kitCoolIcon = "https://i.postimg.cc/hj0MpVtD/timer-1.png";
[JsonProperty(PropertyName = "Kit WipeCooldown Icon")]
public string kitWipeCoolIcon = "https://i.postimg.cc/0j2n3rzp/time.png";
}
#endregion
#region Init
private void OnServerInitialized() {
permission.RegisterPermission(AdminPerm, this);
permission.RegisterPermission(AutoKitPerm, this);
LoadData();
LoadImages();
CheckKits();
RegisterAllKitsPerms();
RegisterKitCommands(cmd, this);
LoadPlayerData();
LastWipeTime = SaveRestore.SaveCreatedTime.Subtract(Epoch).TotalSeconds;
}
private void Unload() {
SaveData();
SavePlayerData();
foreach (var player in BasePlayer.activePlayerList) {
CuiHelper.DestroyUi(player, "PLAYER_KITS");
}
}
private void OnNewSave(string FileName) {
if (config.Settings.WipePlayerDataOnWipe) {
playerData.Wipe();
SavePlayerData();
Puts($"New save detected, wiping PlayerData.");
}
}
private void OnServerSave() {
SaveData();
SavePlayerData();
}
#endregion
#region Commands
private void KitMenuCommand(BasePlayer player, string cmd, string[] args) {
if (player == null) return;
if (args.Length == 0) {
KitsShow_UI(player);
return;
}
string command = args[0].ToLower();
string identifier = string.Join(" ", args.Skip(1));
// Extract the kit identifier (ID or Name)
switch (command) {
case "remove" : case "delete" : if (!IsAdmin(player)) {
CM(player, "You don't have permission to use this command.");
return;
}
DeleteKit(player, identifier);
return;
case "list" : if (!IsAdmin(player)) {
CM(player, "You don't have permission to use this command.");
return;
}
//show list
ShowKits(player);
return;
case "edit" : if (!IsAdmin(player)) {
CM(player, "You don't have permission to use this command.");
return;
}
if (args.Length != 2) {
CM(player, "You must specify a kit name.");
return;
}
Kits editKit = FindKit(identifier);
if (editKit != null) {
KitsShow_UI(player);
CreateOrEditKit(player, editKit);
}
return;
case "give" : if (!IsAdmin(player)) {
CM(player, "You don't have permission to use this command.");
return;
}
if (args.Length != 3) {
CM(player, "You must specify target player and a kit name.");
return;
}
BasePlayer target = FindPlayer(args[1]);
if (target == null) {
CM(player, "Failed to find a player with the specified name or ID.");
return;
}
string FullName = string.Join("", args.Skip(2));
Kits giveKit = FindKit(FullName);
if (giveKit == null) {
CM(player, "The kit <color=#ce422b>{0}</color> does not exist.".Replace("{0}", giveKit.Name));
return;
}
GiveKit(target, giveKit);
CM(player, "You have given <color=#ce422b>{0}</color> the kit <color=#ce422b>{1}</color>.".Replace("{0}", target.displayName).Replace("{1}", giveKit.Name));
return;
case "reset" : if (!IsAdmin(player)) {
CM(player, "You don't have permission to use this command.");
return;
}
playerData.Wipe();
SavePlayerData();
CM(player, "You have wiped player usage data.");
return;
case "help" : if (!IsAdmin(player)) {
CM(player, "You don't have permission to use this command.");
return;
}
ShowHelpMessageAdmin(player);
return;
case "create" : if (!IsAdmin(player)) {
CM(player, "You don't have permission to use this command.");
return;
}
if (args.Length != 2) {
CM(player, "You must specify a kit name.");
return;
}
string kitName = identifier;
int randomNumber = GetRandom();
Kits createKit = new Kits {
ID = randomNumber, Name = kitName, Description = "This is a kit description.\nPlease use as you fit.", Cooldown = 0, WipeCooldown = 0, AutoKit = false, AutoKitWeight = 0, UsesLimit = 0, Permission = string.Empty,
}
;
_data.KitsUI_Data.Add(randomNumber, createKit);
SaveData();
if (createKit != null) {
KitsShow_UI(player);
CreateOrEditKit(player, createKit, true);
}
return;
case "autokit" : if (!permission.UserHasPermission(player.UserIDString, AutoKitPerm)) {
CM(player, "You don't have permission to use this command.");
return;
}
if (!config.Settings.AllowToggleSpawn) {
CM(player, "You are not allowed to change Auto/Spawn Kits.");
return;
}
playerData[player.userID].ClaimAutoKits = !playerData[player.userID].ClaimAutoKits;
SavePlayerData();
if (playerData[player.userID].ClaimAutoKits) {
CM(player, $"You have enabled your Auto/Spawn kits.");
}
else {
CM(player, $"You have disabled your Auto/Spawn kits.");
}
return;
case "convert" : //
return;
}
}
private void ConsoleKitCommand(ConsoleSystem.Arg args) {
BasePlayer player = args.Player();
string command = args.Args[0].ToLower();
string identifier = string.Join(" ", args.Args.Skip(1));
// Extract the kit identifier (ID or Name)
switch (command) {
case "give" : if (args.Args.Length != 3) {
Puts("You must specify target player and a kit name.");
return;
}
BasePlayer target = FindPlayer(args.Args[1]);
if (target == null) {
Puts("Failed to find a player with the specified name or ID.");
return;
}
string FullName = string.Join("", args.Args.Skip(2));
Kits giveKit = FindKit(FullName);
if (giveKit == null) {
Puts("The kit {0} does not exist.".Replace("{0}", giveKit.Name));
return;
}
GiveItemsTo(target, giveKit);
Puts("You have given {0}the kit {1}.".Replace("{0}", target.displayName).Replace("{1}", giveKit.Name));
return;
case "list" : ShowKits();
return;
case "remove" : case "delete" : DeleteKit(player, identifier);
return;
case "reset" : playerData.Wipe();
SavePlayerData();
Puts("You have wiped player usage data.");
return;
}
}
private void CMDKitsUI(IPlayer p, string cmd, string[] args) {
var player = p.Object as BasePlayer;
if (player == null) return;
string command = args[0].ToLower();
string identifier = string.Join(" ", args.Skip(1));
// Extract the kit identifier (ID or Name)
switch (command) {
case "remove" : case "delete" : if (!IsAdmin(player)) {
CM(player, "You don't have permission to use this command.");
return;
}
DeleteKit(player, identifier);
return;
case "list" : if (!IsAdmin(player)) {
CM(player, "You don't have permission to use this command.");
return;
}
//show list
return;
case "edit" : if (!IsAdmin(player)) {
CM(player, "You don't have permission to use this command.");
return;
}
Kits editKit = FindKit(identifier);
if (editKit != null) {
CreateOrEditKit(player, editKit);
}
return;
case "give" : if (!IsAdmin(player)) {
CM(player, "You don't have permission to use this command.");
return;
}
if (args.Length != 3) {
CM(player, "You must specify target player and a kit name.");
return;
}
BasePlayer target = FindPlayer(args[0]);
if (target == null) {
CM(player, "Failed to find a player with the specified name or ID.");
return;
}
string FullName = string.Join("", args.Skip(2));
Kits giveKit = FindKit(FullName);
if (giveKit == null) {
CM(player, "The kit <color=#ce422b>{0}</color> does not exist.".Replace("{0}", giveKit.Name));
return;
}
GiveKit(target, giveKit);
CM(player, "You have given <color=#ce422b>{0}</color> the kit <color=#ce422b>{1}</color>.".Replace("{0}", target.displayName).Replace("{1}", giveKit.Name));
return;
case "reset" : if (!IsAdmin(player)) {
CM(player, "You don't have permission to use this command.");
return;
}
playerData.Wipe();
SavePlayerData();
CM(player, "You have wiped player usage data.");
return;
case "help" : if (!IsAdmin(player)) {
CM(player, "You don't have permission to use this command.");
return;
}
//message
return;
}
}
[ConsoleCommand("pkitcon")]
private void NewKitConsole(ConsoleSystem.Arg args) {
BasePlayer player = args.Player();
if (player == null) return;
var command = args.Args[0];
switch (command) {
case "close" : CuiHelper.DestroyUi(player, "PLAYER_KITS");
return;
case "closepreview" : CuiHelper.DestroyUi(player, "KitPreviews");
return;
case "closeediting" : CuiHelper.DestroyUi(player, "CreatingKit");
return;
case "select" : Kits kit = FindKitByID(args.GetInt(1));
//KitsShow_UI(player, kit);
KitPreviews(player, kit);
return;
case "page" : int page = args.GetInt(1);
string category = args.GetString(2);
KitsShow_UI(player, page, category);
return;
case "editkit" : Kits kitedit = FindKitByID(args.GetInt(1));
CuiHelper.DestroyUi(player, "KitPreviews");
CreateOrEditKit(player, kitedit);
return;
case "createkit" : int randomNumber = GetRandom();
Kits createKit = new Kits {
ID = randomNumber, Name = "Kit Name", Description = "This is a kit description.Please use as you fit.Get this kit from www.kitstore.com/kits.More kits available Soon", Cooldown = 0, WipeCooldown = 0, AutoKit = false, AutoKitWeight = 0, UsesLimit = 0, Permission = string.Empty, EnableKit = true, Color = "#FFFF61",
}
;
_data.KitsUI_Data.Add(randomNumber, createKit);
createKit.WearItems = GetKitItems(player.inventory.containerWear);
createKit.BeltItems = GetKitItems(player.inventory.containerBelt);
createKit.MainItems = GetKitItems(player.inventory.containerMain);
SaveData();
CreateOrEditKit(player, createKit, true);
return;
case "delete" : Kits DelKit = FindKitByID(args.GetInt(1));
RemoveKitByID(DelKit.ID);
SaveData();
KitsShow_UI(player);
CM(player, $"<color=#FFD700>{DelKit.Name}</color> deleted from kits.");
return;
case "savekit" : Kits SaveKit = FindKitByID(args.GetInt(1));
if (!HasKitItems(SaveKit)) {
//ShowNotify(player, "Please save at least 1 item for your Kit to be saved.");
NotifyMessage(player, NotifyType.ERROR, "Please save at least 1 item for your kit to be saved.");
PlaySound(player, "assets/prefabs/locks/keypad/effects/lock.code.denied.prefab");
return;
}
KitsShow_UI(player);
return;
case "copyinv" : Kits CopyInvKit = FindKitByID(args.GetInt(1));
CopyInvKit.WearItems = GetKitItems(player.inventory.containerWear);
CopyInvKit.BeltItems = GetKitItems(player.inventory.containerBelt);
CopyInvKit.MainItems = GetKitItems(player.inventory.containerMain);
SaveData();
//ShowNotify(player, "You have copied your inventory to this kit.");
NotifyMessage(player, NotifyType.SUCCESS, $"You have copied your inventory to <color=#FFD700>{CopyInvKit.Name}</color>");
PlaySound(player, "assets/prefabs/locks/keypad/effects/lock.code.denied.prefab");
return;
case "changeName" : Kits nameKit = FindKitByID(args.GetInt(1));
nameKit.Name = string.Join(" ", args.Args.Skip(2));
SaveData();
CreateOrEditKit(player, nameKit);
return;
case "changeDes" : Kits desKit = FindKitByID(args.GetInt(1));
desKit.Description = string.Join(" ", args.Args.Skip(2));
SaveData();
CreateOrEditKit(player, desKit);
return;
case "changePerm" : Kits permKit = FindKitByID(args.GetInt(1));
permKit.Permission = args.GetString(2);
RegisterKitPerm(args.GetString(2));
SaveData();
CreateOrEditKit(player, permKit);
return;
case "changeColor" : Kits col = FindKitByID(args.GetInt(1));
col.Color = args.GetString(2);
SaveData();
CreateOrEditKit(player, col);
return;
case "changeCategory" : Kits chType = FindKitByID(args.GetInt(1));
chType.Category = string.Join(" ", args.Args.Skip(2));
SaveData();
CreateOrEditKit(player, chType);
return;
case "changeCool" : Kits coolKit = FindKitByID(args.GetInt(1));
coolKit.Cooldown = args.GetInt(2);
SaveData();
CreateOrEditKit(player, coolKit);
return;
case "changeUses" : Kits usesKit = FindKitByID(args.GetInt(1));
usesKit.UsesLimit = args.GetInt(2);
SaveData();
CreateOrEditKit(player, usesKit);
return;
case "changeWipe" : Kits wipeKit = FindKitByID(args.GetInt(1));
wipeKit.WipeCooldown = args.GetInt(2);
SaveData();
CreateOrEditKit(player, wipeKit);
return;
case "changeIMG" : Kits imgKit = FindKitByID(args.GetInt(1));
//imgKit.ImageURL = args.GetString(2);
SaveData();
//AddImage(imgKit.ImageURL);
LoadImages();
CreateOrEditKit(player, imgKit);
return;
case "changeShowKit" : Kits showKitChange = FindKitByID(args.GetInt(1));
//showKitChange.ShowWithoutPerm = !showKitChange.ShowWithoutPerm;
SaveData();
CreateOrEditKit(player, showKitChange);
return;
case "changeAuto" : Kits autoKit = FindKitByID(args.GetInt(1));
autoKit.AutoKit = !autoKit.AutoKit;
SaveData();
CreateOrEditKit(player, autoKit);
return;
case "changeKitEnable" : //$"pkitcon changeKitEnable {kit.ID}"
Kits colorBarKit = FindKitByID(args.GetInt(1));
colorBarKit.EnableKit = !colorBarKit.EnableKit;
SaveData();
CreateOrEditKit(player, colorBarKit);
return;
case "changeTypeColor" : Kits typeColorKit = FindKitByID(args.GetInt(1));
//typeColorKit.TypeColor = args.GetString(2);
SaveData();
CreateOrEditKit(player, typeColorKit);
return;
case "changePri" : Kits priKit = FindKitByID(args.GetInt(1));
int num = args.GetInt(2);
if (num > 100) {
num = 100;
}
if (num <= 0) {
num = 1;
}
priKit.AutoKitWeight = num;
SaveData();
CreateOrEditKit(player, priKit);
return;
case "redeemkit" : Kits rKit = FindKitByID(args.GetInt(1));
GiveKit(player, rKit);
return;
case "cautoadmin" : playerData[player.userID].ShowAutoKitList = !playerData[player.userID].ShowAutoKitList;
SavePlayerData();
KitsShow_UI(player);
return;
case "selectCate" : string cate = args.GetString(1).Replace("_", " ");
KitsShow_UI(player, 1, cate);
return;
case "bookmark" : Kits bmKit = FindKitByID(args.GetInt(1));
if (playerData.Find(player.userID, out PlayerData.PlayerUsageData playerUsageData)) {
if (playerUsageData.FavKits.Contains(bmKit.ID)) {
playerUsageData.FavKits.Remove(bmKit.ID);
KitsShow_UI(player);
}
else {
playerUsageData.FavKits.Add(bmKit.ID);
KitsShow_UI(player);
}
}
return;
}
}
#endregion
#region Hooks
private void OnPlayerRespawned(BasePlayer player) {
if (player == null || !config.Settings.SpawnKits || !playerData[player.userID].ClaimAutoKits) return;
List<Kits> AutoKits = _data.KitsUI_Data.Values.Where(kit => kit.AutoKit && (string.IsNullOrEmpty(kit.Permission) || permission.UserHasPermission(player.UserIDString, kit.Permission))).ToList();
float highestWeight = 0.0f;
Kits highestWeightKit = null;
foreach (Kits kit in AutoKits) {
// Check if the weight of the current kit is higher than the highest weight
if (kit.AutoKitWeight > highestWeight) {
highestWeight = kit.AutoKitWeight;
highestWeightKit = kit;
}
}
if (highestWeightKit != null) {
player.inventory.Strip();
GiveItemsTo(player, highestWeightKit);
}
}
#endregion
#region Methods
private string FormatTime(double time) {
TimeSpan dateDifference = TimeSpan.FromSeconds(time);
int days = dateDifference.Days;
int hours = dateDifference.Hours;
int mins = dateDifference.Minutes;
int secs = dateDifference.Seconds;
if (days > 0) return $"{days:00}d:{hours:00}h";
if (hours > 0) return $"{hours:00}h:{mins:00}m";
return mins > 0 ? $"{mins:00}m:{secs:00}s" : $"{secs}s";
}
private int GetRandom() {
System.Random random = new System.Random();
int randomNumber;
do {
randomNumber = random.Next(1000, 99999999);
}
while (GetKitIDS().Contains(randomNumber));
return randomNumber;
}
private HashSet<int> GetKitIDS() {
HashSet<int> kitIDS = new HashSet<int>();
foreach(var id in _data.KitsUI_Data.Values) {
if (id != null) {
kitIDS.Add(id.ID);
}
}
return kitIDS;
}
private bool HasBookMarkKit(BasePlayer player, int ID) {
if (playerData.Find(player.userID, out PlayerData.PlayerUsageData playerUsageData)) {
if (playerUsageData.FavKits.Count > 0) {
foreach (int num in playerUsageData.FavKits) {
if (num == ID) return true;
}
}
}
return false;
}
private HashSet<string> GetCategorys() {
HashSet<string> categories = new HashSet<string>();
categories.Add("ALL KITS");
categories.Add("FAVORITES");
foreach (var kit in _data.KitsUI_Data.Values) {
if (kit.Category != null && !string.IsNullOrEmpty(kit.Category)) {
categories.Add(kit.Category);
}
}
return categories;
}
private void ShowHelpMessageAdmin(BasePlayer player) {
string message = "<color=#FFD700>PlayerKits Help</color>\n» /kits - Shows Kits UI\n» /kits <color=#FFD700>list</color> - Shows Kits list\n» /kits <color=#FFD700>create</color> <Name> - Shows Kits create UI\n» /kits <color=#FFD700>edit</color> <Name/ID>< - Shows Kits edit UI\n» /kits <color=#FFD700>give</color> <PlayerName/SteamID> <Name/ID> - Give kit to specific player\n» /kits <color=#FFD700>reset</color> - Reset all player data";
Player.Message(player, message, config.Avatar);
}
private void CM(BasePlayer player, string message) {
if (player == null) return;
if (message == null) return;
Player.Message(player, config.Prefix + " " + message, config.Avatar);
}
private bool IsAdmin(BasePlayer player) => permission.UserHasPermission(player.UserIDString, AdminPerm);
private BasePlayer FindPlayer(string partialNameOrID) => BasePlayer.allPlayerList.FirstOrDefault<BasePlayer>((BasePlayer x) => x.UserIDString.Equals(partialNameOrID) || x.displayName.Equals(partialNameOrID, StringComparison.OrdinalIgnoreCase) || x.displayName.Contains(partialNameOrID, CompareOptions.OrdinalIgnoreCase));
private void PlaySound(BasePlayer player, string path) => Effect.server.Run(path, player, 2, Vector3.zero, new Vector3(0f, 2f, 0f));
private void AddImage(string url) {
if (string.IsNullOrEmpty(url)) return;
if (!ImageLibrary.Call<bool>("HasImage", url)) ImageLibrary.Call("AddImage", url, url);
timer.In(1f, () => {
if (Images.ContainsKey(url)) Images.Remove(url);
Images.Add(url, ImageLibrary.Call<string>("GetImage", url));
}
);
}
private void LoadImages() {
if (ImageLibrary == null) {
PrintError("[ImageLibrary] not found!");
return;
}
//
AddImage("https://i.postimg.cc/Rhh5bMFt/check.png");
AddImage("https://i.postimg.cc/j5sgvcZG/Error-2.png");
///
AddImage(config.UI.topbar.backgroundImage);
AddImage(config.UI.topbar.logourl);
AddImage(config.UI.kitList.backgroundImage);
AddImage(config.UI.kitList.kitLimitIcon);
AddImage(config.UI.kitList.kitCoolIcon);
AddImage(config.UI.kitList.kitWipeCoolIcon);
AddImage(config.UI.kitList.kitBookmarkIcon);
foreach (var kit in _data.KitsUI_Data.Values) {
var allItems = kit.MainItems.Concat(kit.WearItems).Concat(kit.BeltItems);
foreach (var item in allItems) {
if (!string.IsNullOrEmpty(item.ImageURL)) {
AddImage(item.ImageURL);
}
}
}
}
private string GetImage(string url) {
return Images[url];
}
private class HexColorCopy {
[JsonProperty(PropertyName = "Hexa Color")]
public string Hex;
[JsonProperty(PropertyName = "Opacity(0 - 100)")]
public float Alpha;
public string Color() {
if (string.IsNullOrEmpty(Hex)) Hex = "#FFFFFF";
var str = Hex.Trim('#');
if (str.Length != 6) throw new Exception(Hex);
var r = byte.Parse(str.Substring(0, 2), NumberStyles.HexNumber);
var g = byte.Parse(str.Substring(2, 2), NumberStyles.HexNumber);
var b = byte.Parse(str.Substring(4, 2), NumberStyles.HexNumber);
return $"{(double)r / 255} {(double)g / 255} {(double)b / 255} {Alpha / 100}";
}
public HexColorCopy(string hex, float alpha) {
Hex = hex;
Alpha = alpha;
}
}
private string HexConvert(string Color, float Alpha) {
var str = Color.Trim('#');
if (str.Length != 6) throw new Exception("Invalid hexadecimal color");
var r = byte.Parse(str.Substring(0, 2), NumberStyles.HexNumber);
var g = byte.Parse(str.Substring(2, 2), NumberStyles.HexNumber);
var b = byte.Parse(str.Substring(4, 2), NumberStyles.HexNumber);
return $"{(double)r / 255} {(double)g / 255} {(double)b / 255} {Alpha / 100}";
}
private class HexColor {
[JsonProperty(PropertyName = "Hexa Color(#FFFFFF,100)")]
public string Hex;
public string Color() {
if (string.IsNullOrEmpty(Hex)) Hex = "#FFFFFF,100";
// Set default value if not provided
var parts = Hex.Split(',');
if (parts.Length != 2) throw new Exception("Invalid format for Hexa Color");
var str = parts[0].Trim('#');
if (str.Length != 6) throw new Exception("Invalid hexadecimal color");
if (!float.TryParse(parts[1], out var alpha)) throw new Exception("Invalid alpha value");
var r = byte.Parse(str.Substring(0, 2), NumberStyles.HexNumber);
var g = byte.Parse(str.Substring(2, 2), NumberStyles.HexNumber);
var b = byte.Parse(str.Substring(4, 2), NumberStyles.HexNumber);
return $"{(double)r / 255} {(double)g / 255} {(double)b / 255} {alpha / 100}";
}
public HexColor(string hex, float alpha) {
Hex = $"{hex},{alpha}";
}
}
private void RegisterKitCommands(Game.Rust.Libraries.Command cmd, Plugin plugin) {
for(int i = 0; i < config.Commands.Length; i++) {
cmd.AddChatCommand(config.Commands[i], plugin, "KitMenuCommand");
cmd.AddConsoleCommand(config.Commands[i], plugin, "ConsoleKitCommand");
}
}
#endregion
#region UIs
private void NotifyMessage(BasePlayer player, NotifyType type, string Message) {
var container = new CuiElementContainer();
if (type == NotifyType.SUCCESS) {
container.Add(new CuiPanel {
CursorEnabled = false, Image = {
Color = "0.3568628 0.4392157 0.2196078 1", Material = "assets/content/ui/uibackgroundblur-ingamemenu.mat"
}
, RectTransform = {
AnchorMin = "0.5 0.5", AnchorMax = "0.5 0.5", OffsetMin = "371.86 184.22", OffsetMax = "631.86 244.22"
}
}
, "Overlay", "NotifyUI");
container.Add(new CuiPanel {
CursorEnabled = false, Image = {
Color = "0 0 0 0.4"
}
, RectTransform = {
AnchorMin = "0.5 0.5", AnchorMax = "0.5 0.5", OffsetMin = "-130 -30", OffsetMax = "-70 30"
}
}
, "NotifyUI", "Panel_4656");
container.Add(new CuiElement {
Name = "Image_464", Parent = "NotifyUI", Components = {
new CuiRawImageComponent {
Color = "1 1 1 1", Png = GetImage("https://i.postimg.cc/Rhh5bMFt/check.png")
}
, new CuiRectTransformComponent {
AnchorMin = "0.5 0.5", AnchorMax = "0.5 0.5", OffsetMin = "-116.4 -14", OffsetMax = "-88.4 14"
}
}
}
);
container.Add(new CuiElement {
Name = "Title", Parent = "NotifyUI", Components = {
new CuiTextComponent {
Text = "SUCCESS!", Font = "robotocondensed-bold.ttf", FontSize = 14, Align = TextAnchor.UpperLeft, Color = "1 1 1 1"
}
, new CuiRectTransformComponent {
AnchorMin = "0.5 0.5", AnchorMax = "0.5 0.5", OffsetMin = "-62.3 0", OffsetMax = "113.7 20.668"
}
}
}
);
container.Add(new CuiElement {
Name = "Desc", Parent = "NotifyUI", Components = {
new CuiTextComponent {
Text = Message, Font = "robotocondensed-regular.ttf", FontSize = 11, Align = TextAnchor.UpperLeft, Color = "1 1 1 1"
}
, new CuiRectTransformComponent {
AnchorMin = "0.5 0.5", AnchorMax = "0.5 0.5", OffsetMin = "-62.3 -28", OffsetMax = "113.7 0"
}
}
}
);
CuiHelper.DestroyUi(player, "NotifyUI");
CuiHelper.AddUi(player, container);
}
else if (type == NotifyType.ERROR) {
container.Add(new CuiPanel {
CursorEnabled = false, Image = {
Color = "0.8039216 0.254902 0.1686275 1", Material = "assets/content/ui/uibackgroundblur-ingamemenu.mat"
}
, RectTransform = {
AnchorMin = "0.5 0.5", AnchorMax = "0.5 0.5", OffsetMin = "371.86 184.22", OffsetMax = "631.86 244.22"
}
}
, "Overlay", "NotifyUI");
container.Add(new CuiPanel {
CursorEnabled = false, Image = {
Color = "0 0 0 0.4"
}
, RectTransform = {
AnchorMin = "0.5 0.5", AnchorMax = "0.5 0.5", OffsetMin = "-130 -30", OffsetMax = "-70 30"
}
}
, "NotifyUI", "Panel_4656");
container.Add(new CuiElement {
Name = "Image_464", Parent = "NotifyUI", Components = {
new CuiRawImageComponent {
Color = "0.7686275 1 0.3803922 1", Png = GetImage("https://i.postimg.cc/j5sgvcZG/Error-2.png")
}
, new CuiRectTransformComponent {
AnchorMin = "0.5 0.5", AnchorMax = "0.5 0.5", OffsetMin = "-116.4 -14", OffsetMax = "-88.4 14"
}
}
}
);
container.Add(new CuiElement {
Name = "Title", Parent = "NotifyUI", Components = {
new CuiTextComponent {
Text = "ERROR!", Font = "robotocondensed-bold.ttf", FontSize = 14, Align = TextAnchor.UpperLeft, Color = "1 1 1 1"
}
, new CuiRectTransformComponent {
AnchorMin = "0.5 0.5", AnchorMax = "0.5 0.5", OffsetMin = "-62.3 0", OffsetMax = "113.7 20.668"
}
}
}
);
container.Add(new CuiElement {
Name = "Desc", Parent = "NotifyUI", Components = {
new CuiTextComponent {
Text = Message, Font = "robotocondensed-regular.ttf", FontSize = 11, Align = TextAnchor.UpperLeft, Color = "1 1 1 1"
}
, new CuiRectTransformComponent {
AnchorMin = "0.5 0.5", AnchorMax = "0.5 0.5", OffsetMin = "-62.3 -28", OffsetMax = "113.7 0"
}
}
}
);
CuiHelper.DestroyUi(player, "NotifyUI");
CuiHelper.AddUi(player, container);
}
timer.In(5, () => {
CuiHelper.DestroyUi(player, "NotifyUI");
}
);
}
private void ShowNotify(BasePlayer player, string Message) {
var container = new CuiElementContainer();
container.Add(new CuiPanel {
CursorEnabled = false, Image = {
Color = "0 0 0 1"
}
, RectTransform = {
AnchorMin = "0.5 0.5", AnchorMax = "0.5 0.5", OffsetMin = "371.858 190.925", OffsetMax = "604.342 257.875"
}
}
, "Overlay", "Notify");
container.Add(new CuiPanel {
CursorEnabled = false, Image = {
Color = "0.1411765 0.1372549 0.1372549 1", Sprite = "assets/content/ui/ui.background.transparent.linearltr.tga"
}
, RectTransform = {
AnchorMin = "0.5 0.5", AnchorMax = "0.5 0.5", OffsetMin = "-116.241 -33.984", OffsetMax = "116.239 33.984"
}
}
, "Notify", "Gradient");
container.Add(new CuiElement {
Name = "Image_4415", Parent = "Notify", Components = {
new CuiRawImageComponent {
Color = "1 1 1 1", Sprite = "assets/icons/info.png"
}
, new CuiRectTransformComponent {
AnchorMin = "0.5 0.5", AnchorMax = "0.5 0.5", OffsetMin = "-107.3 -12.5", OffsetMax = "-82.3 12.5"
}
}
}
);
container.Add(new CuiElement {
Name = "Type", Parent = "Notify", Components = {
new CuiTextComponent {
Text = "WARNING!", Font = "robotocondensed-bold.ttf", FontSize = 14, Align = TextAnchor.MiddleLeft, Color = "1 0.3411765 0.3411765 1"
}
, new CuiRectTransformComponent {
AnchorMin = "0.5 0.5", AnchorMax = "0.5 0.5", OffsetMin = "-78.737 5.061", OffsetMax = "52.937 28.339"
}
}
}
);
container.Add(new CuiElement {
Name = "Msg", Parent = "Notify", Components = {
new CuiTextComponent {
Text = Message, Font = "robotocondensed-regular.ttf", FontSize = 12, Align = TextAnchor.UpperLeft, Color = "1 1 1 1"
}
, new CuiRectTransformComponent {
AnchorMin = "0.5 0.5", AnchorMax = "0.5 0.5", OffsetMin = "-78.738 -37.786", OffsetMax = "112.476 0"
}
}
}
);
CuiHelper.DestroyUi(player, "Notify");
CuiHelper.AddUi(player, container);
timer.In(5, () => {
CuiHelper.DestroyUi(player, "Notify");
}
);
}
private string CheckRedeemable(BasePlayer player, Kits kit) {
string ClaimBTN = "REDEEM";
if (!string.IsNullOrEmpty(kit.Permission) && !permission.UserHasPermission(player.UserIDString, kit.Permission)) {
return ClaimBTN = "LOCKED";
}
else if (kit.WipeCooldown > 0 && IsOnWipeCooldown(kit)) {
return ClaimBTN = "WAIT " + FormatTime(TimeLeftBeforeKitCanBeUsed(kit));
}
else if (playerData.Find(player.userID, out PlayerData.PlayerUsageData playerUsageData)) {
if (kit.Cooldown > 0) {
double cooldownRem = playerUsageData.GetCooldownRemaining(kit.ID);
if (cooldownRem > 0) {
return ClaimBTN = "Wait " + FormatTime(playerData[player.userID].GetCooldownRemaining(kit.ID));
}
}
if (kit.UsesLimit > 0) {
int currentUses = playerUsageData.GetKitUses(kit.ID);
if (currentUses >= kit.UsesLimit) {
return ClaimBTN = "Limit Reached";
}
}
}
return ClaimBTN;
}
private void KitsShow_UI(BasePlayer player, int currentPage = 1, string Category = "") {
var container = new CuiElementContainer();
if (string.IsNullOrEmpty(config.UI.bacgroundImgFull)) {
container.Add(new CuiPanel {
CursorEnabled = true, Image = {
Color = config.UI.bacground.Color(), Material = "assets/content/ui/uibackgroundblur.mat"
}
, RectTransform = {
AnchorMin = "0.5 0.5", AnchorMax = "0.5 0.5", OffsetMin = "-640.002 -360.001", OffsetMax = "639.998 360.009"
}
}
, "Overlay", "PLAYER_KITS");
}
else {
container.Add(new CuiElement {
Name = "PLAYER_KITS", Parent = "Overlay", Components = {
new CuiNeedsCursorComponent(), new CuiRawImageComponent {
Color = config.UI.bacground.Color(), Png = GetImage(config.UI.bacgroundImgFull)
}
, new CuiRectTransformComponent {
AnchorMin = "0.5 0.5", AnchorMax = "0.5 0.5", OffsetMin = "-640.002 -360.001", OffsetMax = "639.998 360.009"
}
}
}
);
}
#region TOP BAR
if (string.IsNullOrEmpty(config.UI.topbar.backgroundImage)) {
container.Add(new CuiPanel {
Image = {
// ... [Code preview truncated due to length. Full source in attached file] ...