Иконка ресурса

FREE KitsRP : 1.1.0 1.1.0

Нет прав для скачивания
C#:
// Все права принадлежат дискорд сообществу https://discord.gg/VgNHPpNrz6
using Oxide.Game.Rust.Cui;
using System;
using System.Collections.Generic;
using System.Linq;
using UnityEngine;
using System.Globalization;
using Oxide.Core;
using System.IO;
using Newtonsoft.Json.Linq;
using Oxide.Core.Plugins;

namespace Oxide.Plugins {
	[Info("KitsRP", "Rever", "1.1.0")]
	class KitsRP : RustPlugin {
		private PluginConfig _config;
		private ImagesCache _imagesCache = new ImagesCache();
		private List<Kit> _kits;
		private Dictionary<ulong, Dictionary<string, KitData>> _kitsData;
		private Dictionary<BasePlayer, List<string>> _kitsGUI = new Dictionary<BasePlayer, List<string>>();
		public string KitsDataFName = "KitsRP.taked";
		public string KitsFName = "KitsRP.kits";
		public static string PNGDir = "file://" + Interface.Oxide.DataDirectory + Path.DirectorySeparatorChar + "Kits" + Path.DirectorySeparatorChar;

		#region Классы
		class PluginConfig {
			public Position Position { get; set; }
			public Position CloseButtonPosition { get; set; }
			public Position CloseButtonPositionNext1 { get; set; }
			public Position CloseButtonPositionNext2 { get; set; }
			public Position CloseButtonPositionNext3 { get; set; }
			public string CloseButtonColor { get; set; }
			public string MainBackgroundColor { get; set; }

			public string DefaultKitImage { get; set; }
			public float MarginTop { get; set; }
			public float MarginBottom { get; set; }
			public float MarginBetween { get; set; }
			public float KitWidth { get; set; }
			public string DisableMaskColor { get; set; }
			public string KitBackgroundColor { get; set; }
			public ImageConfig Image { get; set; }
			public LabelConfig Label { get; set; }
			public LabelConfig Amount { get; set; }
			public LabelConfig Time { get; set; }

			public static PluginConfig CreateDefault() {
				return new PluginConfig {
					MainBackgroundColor = "#00000088",
					Position = new Position {
						AnchorMin = "0 0.35",
						AnchorMax = "1 0.65"
					},
					CloseButtonPosition = new Position {
						AnchorMin = "0.95 0.8",
						AnchorMax = "0.997 0.98"
					},
					CloseButtonPositionNext1 = new Position {
						AnchorMin = "0.95 0.6",
						AnchorMax = "0.997 0.78"
					},
					CloseButtonPositionNext2 = new Position {
						AnchorMin = "0.95 0.4",
						AnchorMax = "0.997 0.58"
					},
					CloseButtonPositionNext3 = new Position {
						AnchorMin = "0.95 0.1",
						AnchorMax = "0.997 0.38"
					},
					CloseButtonColor = "0 0 0 0.70",

					DefaultKitImage    = PNGDir + "default.png",
					KitWidth           = 0.12f,
					MarginTop          = 0.04f,
					MarginBottom       = 0.03f,
					DisableMaskColor   = "#000000DD",
					MarginBetween      = 0.01f,
					KitBackgroundColor = "#00000088",

					Image = new ImageConfig {
						Color = "#FFFFFFFF",
						Position = new Position {
							AnchorMin = "0.05 0.15",
							AnchorMax = "0.95 0.95"
						},
						Png = ""
					},
					Label = new LabelConfig {
						Position = new Position {
							AnchorMin = "0 0",
							AnchorMax = "1 0.15"
						},
						FontSize        = 14,
						ForegroundColor = "#FFFFFFFF",
						BackgroundColor = "#00000000",
						TextAnchor      = TextAnchor.MiddleCenter
					},
					Amount = new LabelConfig {
						Position = new Position {
							AnchorMin = "0.05 0.85",
							AnchorMax = "0.95 0.95"
						},
						FontSize        = 14,
						ForegroundColor = "#FFFFFFFF",
						BackgroundColor = "#00000000",
						TextAnchor      = TextAnchor.MiddleCenter
					},
					Time = new LabelConfig {
						Position = new Position {
							AnchorMin = "0 0",
							AnchorMax = "1 1"
						},
						FontSize        = 14,
						ForegroundColor = "#FFFFFFFF",
						BackgroundColor = "#00000000",
						TextAnchor      = TextAnchor.MiddleCenter
					}
				};
			}

			public class LabelConfig {
				public Position Position { get; set; }
				public string ForegroundColor { get; set; }
				public string BackgroundColor { get; set; }
				public int FontSize { get; set; }
				public TextAnchor TextAnchor { get; set; }
			}

			public class ImageConfig {
				public Position Position { get; set; }
				public string Color { get; set; }
				public string Png { get; set; }
			}
		}

		public class Kit {
			public string Name { get; set; }
			public string DisplayName { get; set; }
			public int Amount { get; set; }
			public double Cooldown { get; set; }
			public bool Hide { get; set; }
			public string Permission { get; set; }
			public List<KitItem> Items { get; set; }

			public string Png { get; set; }
		}

		public class KitItem {
			public string ShortName { get; set; }
			public int Amount { get; set; }
			public ulong SkinID { get; set; }
			public string Container { get; set; }
			public float Condition { get; set; }
			public Weapon Weapon { get; set; }
			public List<ItemContent> Content { get; set; }
		}

		public class Weapon {
			public string ammoType { get; set; }
			public int ammoAmount { get; set; }
		}

		public class ItemContent {
			public string ShortName { get; set; }
			public float Condition { get; set; }
			public int Amount { get; set; }
		}

		public class KitData {
			public int Amount { get; set; }
			public double Cooldown { get; set; }
		}

		public class Position {
			public string AnchorMin { get; set; }
			public string AnchorMax { get; set; }
		}

		public class ImagesCache : MonoBehaviour {
			private Dictionary<string, string> _images = new Dictionary<string, string>();

			public void Add(string name, string url) {
				if (_images.ContainsKey(name))
					return;

				using (var www = new WWW(url)) {
					if (www.error != null) {
						print(string.Format("Image loading fail! Error: {0}", www.error));
					} else {
						if (www.bytes == null || www.bytes.Count() == 0) {
							Interface.Oxide.LogError($"Failed to add image for {name}.File address possibly invalide\n {url}");
							return;
						}

						_images[name] = FileStorage.server.Store(www.bytes, FileStorage.Type.png, CommunityEntity.ServerInstance.net.ID).ToString();
					}
				}
			}

			public string Get(string name) {
				if (_images.ContainsKey(name))
					return _images[name];

				return string.Empty;
			}
		}
		#endregion

		#region Хуки Оксида
		protected override void LoadDefaultConfig() {
			Config.Clear();
			Config.WriteObject(PluginConfig.CreateDefault(), true);
		}

		void OnPlayerRespawned(BasePlayer player) {
			if (_kits.Exists(x => x.Name == "autokit")) {
				player.inventory.Strip();
				var kit = _kits.First(x => x.Name == "autokit");
				GiveItems(player, kit);
			}
		}

		private void SaveKits() { Interface.Oxide.DataFileSystem.WriteObject(KitsFName, _kits); }

		private void SaveTakedKits() { Interface.Oxide.DataFileSystem.WriteObject(KitsDataFName, _kitsData); }

		private void LoadMessages() {
			lang.RegisterMessages(new Dictionary<string, string> {
									  ["Kit Was Removed"]   = "<color=#008B8B>[Наборы]:</color> {kitname} был удалён",
									  ["Kit Doesn't Exist"] = "<color=#008B8B>[Наборы]:</color> Этого набора не существует",
									  ["Not Found Player"]  = "<color=#008B8B>[Наборы]:</color> Игрок не найден",
									  ["To Many Player"]    = "<color=#008B8B>[Наборы]:</color> Найдено несколько игроков",
									  ["Permission Denied"] = "<color=#008B8B>[Наборы]:</color> Ты не можешь использовать этот набор",
									  ["Limite Denied"]     = "<color=#008B8B>[Наборы]:</color> Ты уже использовал этот набор максимальное количество раз",
									  ["Cooldown Denied"]   = "<color=#008B8B>[Наборы]:</color> Ты сможешь использовать этот комплект через <color=red>{time}</color>",
									  ["Reset"]             = "<color=#008B8B>[Наборы]:</color> Все данные о использовании наборами игроками стерты!",
									  ["Kit Already Exist"] = "<color=#008B8B>[Наборы]:</color> Этот набор уже существует",
									  ["Kit Created"]       = "<color=#008B8B>[Наборы]:</color> Создан новый набор - {name}",
									  ["Kit Cloned"]        = "<color=#008B8B>[Наборы]:</color> Предметы были скопированы из инвентаря в набор",
									  ["UI Amount"]         = "Осталось: <cpolor=yellow>{amount}</color>",
									  ["Help"]              = "/kit name|add|clone|remove|list|reset",
									  ["Help Add"]          = "/kit add <имя>",
									  ["Help Clone"]        = "/kit clone <имя>",
									  ["Help Remove"]       = "/kit remove <имя>",
									  ["Help Give"]         = "/kit give <имя> <ник|steamID>",
									  ["No Space"]          = "Невозможно получить набор - недостаточно места в инвентаре"
								  },
								  this);
		}

		private void Loaded() {
			_config   = Config.ReadObject<PluginConfig>();
			_kits     = Interface.Oxide.DataFileSystem.ReadObject<List<Kit>>(KitsFName);
			_kitsData = Interface.Oxide.DataFileSystem.ReadObject<Dictionary<ulong, Dictionary<string, KitData>>>(KitsDataFName);
			LoadMessages();
		}

		private void Unload() {
			SaveTakedKits();

			foreach (var player in BasePlayer.activePlayerList) {
				DestroyUI(player);
			}
		}

		void OnServerSave() { SaveTakedKits(); }

		private void OnServerInitialized() {
			foreach (var kit in _kits) {
				_imagesCache.Add(kit.Name, PNGDir + kit.Png + ".png");
				Debug.Log($"{Title.ToLower()}.{kit.Permission}");
				if (!permission.PermissionExists($"{Title.ToLower()}.{kit.Permission}"))
					permission.RegisterPermission($"{Title.ToLower()}.{kit.Permission}", this);
			}

			timer.Repeat(1, 0, RefreshCooldownKitsUI);
		}

		private void OnPlayerDisconnected(BasePlayer player) { _kitsGUI.Remove(player); }
		#endregion

		#region Комманды
		[ConsoleCommand("kit")]
		private void CommandConsoleKit(ConsoleSystem.Arg arg) {
			if (arg.Connection == null)
				return;

			var player = arg.Player();
			if (!arg.HasArgs())
				return;

			var value = arg.Args[0].ToLower();

			if (value == "ui") {
				TriggerUI(player);
				return;
			}

			if (value == "next1") {
				TriggerUI(player);

				TriggerUI1(player);
				return;
			}

			if (value == "next2") {
				TriggerUI(player);

				TriggerUI2(player);
				return;
			}

			if (value == "next3") {
				TriggerUI(player);

				TriggerUI3(player);
				return;
			}

			if (!_kitsGUI.ContainsKey(player))
				return;
			if (!_kitsGUI[player].Contains(value))
				return;

			GiveKit(player, value);
			var container  = new CuiElementContainer();
			var kit        = _kits.First(x => x.Name == value);
			var playerData = GetPlayerData(player.userID, value);

			if (kit.Amount > 0) {
				if (playerData.Amount >= kit.Amount) {
					foreach (var kitname in _kitsGUI[player]) {
						CuiHelper.DestroyUi(player, $"ui.{Title}.{kitname}.button");
						CuiHelper.DestroyUi(player, $"ui.{Title}.{kitname}.amount");
						CuiHelper.DestroyUi(player, $"ui.{Title}.{kitname}");
					}

					InitilizeKitsUI(ref container, player);
					CuiHelper.AddUi(player, container);
					return;
				}

				CuiHelper.DestroyUi(player, $"ui.{Title}.{value}.amount");

				InitilizeAmountLabelUI(ref container, value, GetMsg("UI Amount", player).Replace("{amount}", (kit.Amount - playerData.Amount).ToString()));
			}

			if (kit.Cooldown > 0) {
				var currentTime = GetCurrentTime();

				if (playerData.Cooldown > currentTime) {
					CuiHelper.DestroyUi(player, $"ui.{Title}.{value}.button");
					InitilizeMaskUI(ref container, kit.Name);
					InitilizeCooldownLabelUI(ref container, value, TimeSpan.FromSeconds(playerData.Cooldown - currentTime));
				}
			}

			CuiHelper.AddUi(player, container);
		}

		[ChatCommand("kit")]
		private void CommandChatKit(BasePlayer player, string command, string[] args) {
			if (player == null)
				return;

			if (args.Length == 0) {
				TriggerUI(player);
				return;
			}

			if (!player.IsAdmin) {
				GiveKit(player, args[0].ToLower());
				return;
			}

			switch (args[0].ToLower()) {
				case "help":
					SendReply(player, GetMsg("Help", player));
					return;
				case "add":
					if (args.Length < 2)
						SendReply(player, GetMsg("Help Add", player));
					else
						KitCommandAdd(player, args[1].ToLower());
					return;
				case "clone":
					if (args.Length < 2)
						SendReply(player, GetMsg("Help Clone", player));
					else
						KitCommandClone(player, args[1].ToLower());
					return;
				case "remove":
					if (args.Length < 2)
						SendReply(player, GetMsg("Help Remove", player));
					else
						KitCommandRemove(player, args[1].ToLower());
					return;
				case "list":
					KitCommandList(player);
					return;
				case "reset":
					KitCommandReset(player);
					return;
				case "give":

					if (args.Length < 3) {
						SendReply(player, GetMsg("Help Give", player));
					} else {
						var foundPlayer = FindPlayer(player, args[1].ToLower());
						if (foundPlayer == null)
							return;

						KitCommandGive(player, foundPlayer, args[2].ToLower());
					}

					return;
				default:
					GiveKit(player, args[0].ToLower());
					return;
			}
		}
		#endregion

		#region Логика китов
		private bool GiveKit(BasePlayer player, string kitname) {
			if (string.IsNullOrEmpty(kitname))
				return false;

			if (Interface.Oxide.CallHook("canRedeemKit", player) != null) {
				return false;
			}

			if (!_kits.Exists(x => x.Name == kitname)) {
				SendReply(player, GetMsg("Kit Doesn't Exist", player));
				return false;
			}

			var kit = _kits.First(x => x.Name == kitname);

			if (!string.IsNullOrEmpty(kit.Permission) && !permission.UserHasPermission(player.UserIDString, $"{Title.ToLower()}.{kit.Permission}")) {
				SendReply(player, GetMsg("Permission Denied", player));
				return false;
			}

			var playerData = GetPlayerData(player.userID, kitname);

			if (kit.Amount > 0 && playerData.Amount >= kit.Amount) {
				SendReply(player, GetMsg("Limite Denied", player));
				return false;
			}

			if (kit.Cooldown > 0) {
				var currentTime = GetCurrentTime();

				if (playerData.Cooldown > currentTime) {
					SendReply(player, GetMsg("Cooldown Denied", player).Replace("{time}", TimeExtensions.FormatTime(TimeSpan.FromSeconds(playerData.Cooldown - currentTime))));
					return false;
				}
			}

			int beltcount  = kit.Items.Where(i => i.Container == "belt").Count();
			int wearcount  = kit.Items.Where(i => i.Container == "wear").Count();
			int maincount  = kit.Items.Where(i => i.Container == "main").Count();
			int totalcount = beltcount + wearcount + maincount;

			if (player.inventory.containerBelt.capacity - player.inventory.containerBelt.itemList.Count < beltcount
			|| player.inventory.containerWear.capacity - player.inventory.containerWear.itemList.Count < wearcount
			|| player.inventory.containerMain.capacity - player.inventory.containerMain.itemList.Count < maincount)
				if (totalcount > player.inventory.containerMain.capacity - player.inventory.containerMain.itemList.Count) {
					player.ChatMessage(GetMsg("No Space", player));
					return false;
				}

			GiveItems(player, kit);
			if (kit.Amount > 0)
				playerData.Amount += 1;
			if (kit.Cooldown > 0)
				playerData.Cooldown = GetCurrentTime() + kit.Cooldown;
			SendReply(player, GetMsg("Kit Extradited", player).Replace("{kitname}", kit.DisplayName));
			return true;
		}

		private void KitCommandAdd(BasePlayer player, string kitname) {
			if (_kits.Exists(x => x.Name == kitname)) {
				SendReply(player, GetMsg("Kit Already Exist", player));
				return;
			}

			_kits.Add(new Kit {
				Name        = kitname,
				DisplayName = kitname,
				Cooldown    = 600,
				Hide        = true,
				Permission  = "default",
				Amount      = 0,
				Png         = _config.DefaultKitImage,
				Items       = GetPlayerItems(player)
			});
			permission.RegisterPermission($"{Title.ToLower()}.default", this);
			SendReply(player, GetMsg("Kit Created", player).Replace("{name}", kitname));
			SaveKits();
			SaveTakedKits();
		}

		private void KitCommandClone(BasePlayer player, string kitname) {
			if (!_kits.Exists(x => x.Name == kitname)) {
				SendReply(player, GetMsg("Kit Doesn't Exist", player));
				return;
			}

			_kits.First(x => x.Name == kitname).Items = GetPlayerItems(player);
			SendReply(player, GetMsg("Kit Cloned", player).Replace("{name}", kitname));
			SaveKits();
		}

		private void KitCommandRemove(BasePlayer player, string kitname) {
			if (_kits.RemoveAll(x => x.Name == kitname) <= 0) {
				SendReply(player, GetMsg("Kit Doesn't Exist", player));
				return;
			}

			SendReply(player, GetMsg("Kit Was Removed", player).Replace("{kitname}", kitname));
			SaveKits();
		}

		private void KitCommandList(BasePlayer player) {
			foreach (var kit in _kits)
				SendReply(player, $"{kit.Name} - {kit.DisplayName}");
		}

		private void KitCommandReset(BasePlayer player) {
			_kitsData.Clear();
			SaveTakedKits();
			SendReply(player, GetMsg("Reset", player));
		}

		private void KitCommandGive(BasePlayer player, BasePlayer foundPlayer, string kitname) {
			if (!_kits.Exists(x => x.Name == kitname)) {
				SendReply(player, GetMsg("Kit Doesn't Exist", player));
				return;
			}

			GiveItems(player, _kits.First(x => x.Name == kitname));
		}

		private void GiveItems(BasePlayer player, Kit kit) {
			foreach (var kitem in kit.Items) {
				GiveItem(player.inventory,
						 BuildItem(kitem.ShortName, kitem.Amount, kitem.SkinID, kitem.Condition, kitem.Weapon, kitem.Content),
						 kitem.Container == "belt"
							 ? player.inventory.containerBelt
							 : kitem.Container == "wear"
								 ? player.inventory.containerWear
								 : player.inventory.containerMain);
			}
		}

		private void GiveItem(PlayerInventory inv, Item item, ItemContainer cont = null) {
			if (item == null) return;

			var a = item.MoveToContainer(cont) || item.MoveToContainer(inv.containerBelt) || item.MoveToContainer(inv.containerWear) || item.MoveToContainer(inv.containerMain);
		}

		private Item BuildItem(string ShortName, int Amount, ulong SkinID, float Condition, Weapon weapon, List<ItemContent> Content) {
			try {
				Item item = ItemManager.CreateByName(ShortName, Amount > 1 ? Amount : 1, SkinID);
				item.condition = Condition;

				if (weapon != null) {
					var projItem = item.GetHeldEntity() as BaseProjectile;
					if (projItem == null) return null;

					projItem.primaryMagazine.contents                                 = weapon.ammoAmount;
					(item.GetHeldEntity() as BaseProjectile).primaryMagazine.ammoType = ItemManager.FindItemDefinition(weapon.ammoType);
				}

				if (Content != null) {
					foreach (var cont in Content) {
						Item new_cont = ItemManager.CreateByName(cont.ShortName, cont.Amount);
						new_cont.condition = cont.Condition;
						new_cont.MoveToContainer(item.contents);
					}
				}

				return item;
			} catch (Exception e) {
				return null;
			}
		}
		#endregion

		#region UI
		private void TriggerUI(BasePlayer player) {
			if (_kitsGUI.ContainsKey(player))
				DestroyUI(player);
			else
				InitilizeUI(player);
		}

		private void TriggerUI2(BasePlayer player) { InitilizeUI2(player); }

		private void TriggerUI3(BasePlayer player) { InitilizeUI3(player); }

		private void TriggerUI1(BasePlayer player) { InitilizeUI(player); }

		private void InitilizeUI(BasePlayer player) {
			var kits      = GetKitsForPlayer(player).ToList();
			var container = new CuiElementContainer();
			container.Add(new CuiPanel {
							  Image = {
								  Color = HexToRustFormat(_config.MainBackgroundColor)
							  },
							  RectTransform = {
								  AnchorMin = _config.Position.AnchorMin,
								  AnchorMax = _config.Position.AnchorMax
							  },
							  CursorEnabled = true
						  },
						  name: $"ui.{Title}");
			container.Add(new CuiButton {
							  Button = {
								  Command = "kit ui",
								  Color   = _config.CloseButtonColor
							  },
							  RectTransform = {
								  AnchorMin = _config.CloseButtonPosition.AnchorMin,
								  AnchorMax = _config.CloseButtonPosition.AnchorMax
							  },
							  Text = {
								  Text     = "X",
								  FontSize = 20,
								  Font     = "robotocondensed-regular.ttf",
								  Align    = TextAnchor.MiddleCenter
							  }
						  },
						  $"ui.{Title}");

			foreach (var kit in kits) {
				if (kits.Count > 7) {
					container.Add(new CuiButton {
									  Button = {
										  Command = "kit next2",
										  Color   = "0 0 0 0.15"
									  },
									  RectTransform = {
										  AnchorMin = "0.965 0.3",
										  AnchorMax = "0.997 0.7"
									  },
									  Text = {
										  Text     = ">",
										  FontSize = 20,
										  Font     = "robotocondensed-regular.ttf",
										  Align    = TextAnchor.MiddleCenter
									  }
								  },
								  $"ui.{Title}");
				}
			}

			InitilizeKitsUI(ref container, player);
			CuiHelper.AddUi(player, container);
		}

		private void InitilizeUI2(BasePlayer player) {
			var kits      = GetKitsForPlayer(player).ToList();
			var container = new CuiElementContainer();
			container.Add(new CuiPanel {
							  Image = {
								  Color = HexToRustFormat(_config.MainBackgroundColor)
							  },
							  RectTransform = {
								  AnchorMin = _config.Position.AnchorMin,
								  AnchorMax = _config.Position.AnchorMax
							  },
							  CursorEnabled = true
						  },
						  name: $"ui.{Title}");
			container.Add(new CuiButton {
							  Button = {
								  Command = "kit ui",
								  Color   = _config.CloseButtonColor
							  },
							  RectTransform = {
								  AnchorMin = _config.CloseButtonPosition.AnchorMin,
								  AnchorMax = _config.CloseButtonPosition.AnchorMax
							  },
							  Text = {
								  Text     = "X",
								  FontSize = 20,
								  Font     = "robotocondensed-regular.ttf",
								  Align    = TextAnchor.MiddleCenter
							  }
						  },
						  $"ui.{Title}");

			foreach (var kit in kits) {
				if (kits.Count > 14) {
					container.Add(new CuiButton {
									  Button = {
										  Command = "kit next1",
										  Color   = "0 0 0 0.15"
									  },
									  RectTransform = {
										  AnchorMin = "0.002 0.3",
										  AnchorMax = "0.035 0.7"
									  },
									  Text = {
										  Text     = "<",
										  FontSize = 20,
										  Font     = "robotocondensed-regular.ttf",
										  Align    = TextAnchor.MiddleCenter
									  }
								  },
								  $"ui.{Title}");
					container.Add(new CuiButton {
									  Button = {
										  Command = "kit next3",
										  Color   = "0 0 0 0.15"
									  },
									  RectTransform = {
										  AnchorMin = "0.965 0.3",
										  AnchorMax = "0.997 0.7"
									  },
									  Text = {
										  Text     = ">",
										  FontSize = 20,
										  Font     = "robotocondensed-regular.ttf",
										  Align    = TextAnchor.MiddleCenter
									  }
								  },
								  $"ui.{Title}");
				} else if (kits.Count > 7) {
					container.Add(new CuiButton {
									  Button = {
										  Command = "kit next1",
										  Color   = "0 0 0 0.15"
									  },
									  RectTransform = {
										  AnchorMin = "0.002 0.3",
										  AnchorMax = "0.035 0.7"
									  },
									  Text = {
										  Text     = "<",
										  FontSize = 20,
										  Font     = "robotocondensed-regular.ttf",
										  Align    = TextAnchor.MiddleCenter
									  }
								  },
								  $"ui.{Title}");
				}
			}

			if (kits.Count < 7) {
				InitilizeKitsUI(ref container, player);
			} else {
				InitilizeKitsUINext(ref container, player);
			}

			CuiHelper.AddUi(player, container);
		}

		private void InitilizeUI3(BasePlayer player) {
			var kits      = GetKitsForPlayer(player).ToList();
			var container = new CuiElementContainer();
			container.Add(new CuiPanel {
							  Image = {
								  Color = HexToRustFormat(_config.MainBackgroundColor)
							  },
							  RectTransform = {
								  AnchorMin = _config.Position.AnchorMin,
								  AnchorMax = _config.Position.AnchorMax
							  },
							  CursorEnabled = true
						  },
						  name: $"ui.{Title}");
			container.Add(new CuiButton {
							  Button = {
								  Command = "kit ui",
								  Color   = _config.CloseButtonColor
							  },
							  RectTransform = {
								  AnchorMin = _config.CloseButtonPosition.AnchorMin,
								  AnchorMax = _config.CloseButtonPosition.AnchorMax
							  },
							  Text = {
								  Text     = "X",
								  FontSize = 20,
								  Font     = "robotocondensed-regular.ttf",
								  Align    = TextAnchor.MiddleCenter
							  }
						  },
						  $"ui.{Title}");

			foreach (var kit in kits) {
				if (kits.Count > 14) {
					container.Add(new CuiButton {
									  Button = {
										  Command = "kit next2",
										  Color   = "0 0 0 0.15"
									  },
									  RectTransform = {
										  AnchorMin = "0.002 0.3",
										  AnchorMax = "0.035 0.7"
									  },
									  Text = {
										  Text     = "<",
										  FontSize = 20,
										  Font     = "robotocondensed-regular.ttf",
										  Align    = TextAnchor.MiddleCenter
									  }
								  },
								  $"ui.{Title}");
				} else if (kits.Count > 7) {
					container.Add(new CuiButton {
									  Button = {
										  Command = "kit next1",
										  Color   = _config.CloseButtonColor
									  },
									  RectTransform = {
										  AnchorMin = _config.CloseButtonPositionNext1.AnchorMin,
										  AnchorMax = _config.CloseButtonPositionNext1.AnchorMax
									  },
									  Text = {
										  Text     = "1",
										  FontSize = 20,
										  Font     = "robotocondensed-regular.ttf",
										  Align    = TextAnchor.MiddleCenter
									  }
								  },
								  $"ui.{Title}");
					container.Add(new CuiButton {
									  Button = {
										  Command = "kit next2",
										  Color   = _config.CloseButtonColor
									  },
									  RectTransform = {
										  AnchorMin = _config.CloseButtonPositionNext2.AnchorMin,
										  AnchorMax = _config.CloseButtonPositionNext2.AnchorMax
									  },
									  Text = {
										  Text     = "2",
										  FontSize = 20,
										  Font     = "robotocondensed-regular.ttf",
										  Align    = TextAnchor.MiddleCenter
									  }
								  },
								  $"ui.{Title}");
				}
			}

			if (kits.Count < 14) {
				InitilizeKitsUINext(ref container, player);
			} else if (kits.Count < 7) {
				InitilizeKitsUI(ref container, player);
			} else {
				InitilizeKitsUI2(ref container, player);
			}

			CuiHelper.AddUi(player, container);
		}

		private void DestroyUI(BasePlayer player) {
			if (!_kitsGUI.ContainsKey(player))
				return;

			foreach (var kitname in _kitsGUI[player]) {
				CuiHelper.DestroyUi(player, $"ui.{Title}.{kitname}.time");
				CuiHelper.DestroyUi(player, $"ui.{Title}.{kitname}.mask");
				CuiHelper.DestroyUi(player, $"ui.{Title}.{kitname}.button");
				CuiHelper.DestroyUi(player, $"ui.{Title}.{kitname}.amount");
				CuiHelper.DestroyUi(player, $"ui.{Title}.{kitname}");
			}

			CuiHelper.DestroyUi(player, $"ui.{Title}");
			_kitsGUI.Remove(player);
		}

		private void RefreshCooldownKitsUI() {
			var currentTime = GetCurrentTime();

			foreach (var playerGUIData in _kitsGUI) {
				var container = new CuiElementContainer();
				if (!_kitsData.ContainsKey(playerGUIData.Key.userID)) continue;

				var playerKitsData = _kitsData[playerGUIData.Key.userID];

				foreach (var kitname in playerGUIData.Value) {
					var playerKitData = playerKitsData[kitname];

					if (playerKitData.Cooldown > 0) {
						CuiHelper.DestroyUi(playerGUIData.Key, $"ui.{Title}.{kitname}.time");

						if (playerKitData.Cooldown < currentTime) {
							CuiHelper.DestroyUi(playerGUIData.Key, $"ui.{Title}.{kitname}.mask");
							InitilizeButtonUI(ref container, kitname);
						} else {
							InitilizeCooldownLabelUI(ref container, kitname, TimeSpan.FromSeconds(playerKitData.Cooldown - currentTime));
						}
					}
				}

				CuiHelper.AddUi(playerGUIData.Key, container);
			}
		}

		private void InitilizeKitsUI(ref CuiElementContainer container, BasePlayer player) {
			_kitsGUI[player] = new List<string>();
			var currentTime = GetCurrentTime();
			var kits        = GetKitsForPlayer(player).Take((int)(1.0f / (_config.KitWidth + _config.MarginBetween))).ToList();
			var pos         = 0.490f - (kits.Count * _config.KitWidth + (kits.Count - 1) * _config.MarginBetween) / 2;

			foreach (var kit in kits) {
				_kitsGUI[player].Add(kit.Name);
				var playerData = GetPlayerData(player.userID, kit.Name);

				// Kit panel
				container.Add(new CuiPanel {
								  Image = {
									  Color = HexToRustFormat(_config.KitBackgroundColor)
								  },
								  RectTransform = {
									  AnchorMin = $"{pos} {_config.MarginBottom}",
									  AnchorMax = $"{pos + _config.KitWidth} {1.0f - _config.MarginTop}"
								  }
							  },
							  $"ui.{Title}",
							  $"ui.{Title}.{kit.Name}");
				pos += _config.KitWidth + _config.MarginBetween;
				InitilizeNameLabelUI(ref container, kit.Name, kit.DisplayName);
				InitilizeKitImageUI(ref container, kit.Name);

				if (kit.Amount > 0) {
					InitilizeAmountLabelUI(ref container, kit.Name, GetMsg("UI Amount", player).Replace("{amount}", (kit.Amount - playerData.Amount).ToString()));
				}

				if (kit.Cooldown > 0 && (playerData.Cooldown > currentTime)) {
					InitilizeMaskUI(ref container, kit.Name);
					InitilizeCooldownLabelUI(ref container, kit.Name, TimeSpan.FromSeconds(playerData.Cooldown - currentTime));
				} else {
					InitilizeButtonUI(ref container, kit.Name);
				}
			}
		}

		private void InitilizeKitsUINext(ref CuiElementContainer container, BasePlayer player) {
			_kitsGUI[player] = new List<string>();
			var currentTime = GetCurrentTime();
			var kits        = GetKitsForPlayer(player).Take((int)(1.0f / (_config.KitWidth + _config.MarginBetween)) + 7).ToList();
			var pos         = 0.525f - ((kits.Count - 7) * _config.KitWidth + (kits.Count - 1) * _config.MarginBetween) / 2;
			var kitsAmount  = kits.Skip(7);

			foreach (var kit in kitsAmount) {
				_kitsGUI[player].Add(kit.Name);
				var playerData = GetPlayerData(player.userID, kit.Name);

				// Kit panel
				container.Add(new CuiPanel {
								  Image = {
									  Color = HexToRustFormat(_config.KitBackgroundColor)
								  },
								  RectTransform = {
									  AnchorMin = $"{pos} {_config.MarginBottom}",
									  AnchorMax = $"{pos + _config.KitWidth} {1.0f - _config.MarginTop}"
								  }
							  },
							  $"ui.{Title}",
							  $"ui.{Title}.{kit.Name}");
				pos += _config.KitWidth + _config.MarginBetween;
				InitilizeNameLabelUI(ref container, kit.Name, kit.DisplayName);
				InitilizeKitImageUI(ref container, kit.Name);

				if (kit.Amount > 0) {
					InitilizeAmountLabelUI(ref container, kit.Name, GetMsg("UI Amount", player).Replace("{amount}", (kit.Amount - playerData.Amount).ToString()));
				}

				if (kit.Cooldown > 0 && (playerData.Cooldown > currentTime)) {
					InitilizeMaskUI(ref container, kit.Name);
					InitilizeCooldownLabelUI(ref container, kit.Name, TimeSpan.FromSeconds(playerData.Cooldown - currentTime));
				} else {
					InitilizeButtonUI(ref container, kit.Name);
				}
			}
		}

		private void InitilizeKitsUI2(ref CuiElementContainer container, BasePlayer player) {
			_kitsGUI[player] = new List<string>();
			var currentTime = GetCurrentTime();
			var kits        = GetKitsForPlayer(player).ToList();
			var pos         = 0.56f - ((kits.Count - 14) * _config.KitWidth + (kits.Count - 1) * _config.MarginBetween) / 2;
			var kitsAmount  = kits.Skip(14);

			foreach (var kit in kitsAmount) {
				_kitsGUI[player].Add(kit.Name);
				var playerData = GetPlayerData(player.userID, kit.Name);

				// Kit panel
				container.Add(new CuiPanel {
								  Image = {
									  Color = HexToRustFormat(_config.KitBackgroundColor)
								  },
								  RectTransform = {
									  AnchorMin = $"{pos} {_config.MarginBottom}",
									  AnchorMax = $"{pos + _config.KitWidth} {1.0f - _config.MarginTop}"
								  }
							  },
							  $"ui.{Title}",
							  $"ui.{Title}.{kit.Name}");
				pos += _config.KitWidth + _config.MarginBetween;
				InitilizeNameLabelUI(ref container, kit.Name, kit.DisplayName);
				InitilizeKitImageUI(ref container, kit.Name);

				if (kit.Amount > 0) {
					InitilizeAmountLabelUI(ref container, kit.Name, GetMsg("UI Amount", player).Replace("{amount}", (kit.Amount - playerData.Amount).ToString()));
				}

				if (kit.Cooldown > 0 && (playerData.Cooldown > currentTime)) {
					InitilizeMaskUI(ref container, kit.Name);
					InitilizeCooldownLabelUI(ref container, kit.Name, TimeSpan.FromSeconds(playerData.Cooldown - currentTime));
				} else {
					InitilizeButtonUI(ref container, kit.Name);
				}
			}
		}

		private void InitilizeKitImageUI(ref CuiElementContainer container, string kitname) {
			string image = _imagesCache.Get(kitname);
			CuiRawImageComponent imageComp = new CuiRawImageComponent {
				Sprite = "assets/content/textures/generic/fulltransparent.tga",
				Color  = HexToRustFormat(_config.Image.Color)
			};

			if (image != string.Empty) {
				imageComp.Png = image;
			}

			container.Add(new CuiElement {
				Parent = $"ui.{Title}.{kitname}",
				Components = {
					imageComp,
					new CuiRectTransformComponent {
						AnchorMin = _config.Image.Position.AnchorMin,
						AnchorMax = _config.Image.Position.AnchorMax
					}
				}
			});
		}

		private void InitilizeNameLabelUI(ref CuiElementContainer container, string kitname, string text) {
			var name = container.Add(new CuiPanel {
										 Image = {
											 Color = HexToRustFormat(_config.Label.BackgroundColor)
										 },
										 RectTransform = {
											 AnchorMin = _config.Label.Position.AnchorMin,
											 AnchorMax = _config.Label.Position.AnchorMax
										 }
									 },
									 $"ui.{Title}.{kitname}");
			container.Add(new CuiLabel {
							  Text = {
								  Color    = HexToRustFormat(_config.Label.ForegroundColor),
								  FontSize = _config.Label.FontSize,
								  Align    = _config.Label.TextAnchor,
								  Text     = text
							  }
						  },
						  name);
		}

		private void InitilizeMaskUI(ref CuiElementContainer container, string kitname) {
			var name = container.Add(new CuiPanel {
										 Image = {
											 Color = HexToRustFormat(_config.DisableMaskColor)
										 }
									 },
									 $"ui.{Title}.{kitname}",
									 $"ui.{Title}.{kitname}.mask");
		}

		private void InitilizeAmountLabelUI(ref CuiElementContainer container, string kitname, string text) {
			container.Add(new CuiPanel {
							  Image = {
								  Color = HexToRustFormat(_config.Amount.BackgroundColor)
							  },
							  RectTransform = {
								  AnchorMin = _config.Amount.Position.AnchorMin,
								  AnchorMax = _config.Amount.Position.AnchorMax
							  }
						  },
						  $"ui.{Title}.{kitname}",
						  $"ui.{Title}.{kitname}.amount");
			container.Add(new CuiLabel {
							  Text = {
								  Color    = HexToRustFormat(_config.Amount.ForegroundColor),
								  FontSize = _config.Amount.FontSize,
								  Align    = _config.Amount.TextAnchor,
								  Text     = text
							  }
						  },
						  $"ui.{Title}.{kitname}.amount");
		}

		private void InitilizeButtonUI(ref CuiElementContainer container, string kitname) {
			container.Add(new CuiButton {
							  Button = {
								  Color   = "0 0 0 0",
								  Command = $"kit {kitname}"
							  },
							  RectTransform = {
								  AnchorMin = "0 0",
								  AnchorMax = "1 1"
							  },
							  Text = {
								  Text = ""
							  }
						  },
						  $"ui.{Title}.{kitname}",
						  $"ui.{Title}.{kitname}.button");
		}

		private void InitilizeCooldownLabelUI(ref CuiElementContainer container, string kitname, TimeSpan time) {
			container.Add(new CuiPanel {
							  Image = {
								  Color = HexToRustFormat(_config.Time.BackgroundColor)
							  },
							  RectTransform = {
								  AnchorMin = _config.Time.Position.AnchorMin,
								  AnchorMax = _config.Time.Position.AnchorMax
							  }
						  },
						  $"ui.{Title}.{kitname}",
						  $"ui.{Title}.{kitname}.time");
			container.Add(new CuiLabel {
							  Text = {
								  Color    = HexToRustFormat(_config.Time.ForegroundColor),
								  FontSize = _config.Time.FontSize,
								  Align    = _config.Time.TextAnchor,
								  Text     = "Будет доступен через:\n" + TimeExtensions.FormatShortTime(time)
							  }
						  },
						  $"ui.{Title}.{kitname}.time");
		}
		#endregion

		#region Helpers 
		private KitData GetPlayerData(ulong userID, string name) {
			if (!_kitsData.ContainsKey(userID)) _kitsData[userID]             = new Dictionary<string, KitData>();
			if (!_kitsData[userID].ContainsKey(name)) _kitsData[userID][name] = new KitData();
			return _kitsData[userID][name];
		}

		private List<KitItem> GetPlayerItems(BasePlayer player) {
			List<KitItem> kititems = new List<KitItem>();

			foreach (Item item in player.inventory.containerWear.itemList) {
				if (item != null) {
					var iteminfo = ItemToKit(item, "wear");
					kititems.Add(iteminfo);
				}
			}

			foreach (Item item in player.inventory.containerMain.itemList) {
				if (item != null) {
					var iteminfo = ItemToKit(item, "main");
					kititems.Add(iteminfo);
				}
			}

			foreach (Item item in player.inventory.containerBelt.itemList) {
				if (item != null) {
					var iteminfo = ItemToKit(item, "belt");
					kititems.Add(iteminfo);
				}
			}

			return kititems;
		}

		string GetMsg(string key, BasePlayer player = null) => lang.GetMessage(key, this, player == null ? null : player.UserIDString);

		private KitItem ItemToKit(Item item, string container) {
			KitItem kitem = new KitItem();
			kitem.Amount    = item.amount;
			kitem.Container = container;
			kitem.SkinID    = item.skin;
			kitem.ShortName = item.info.shortname;
			kitem.Condition = item.condition;
			kitem.Weapon    = null;
			kitem.Content   = null;

			if (item.info.category == ItemCategory.Weapon) {
				BaseProjectile weapon = item.GetHeldEntity() as BaseProjectile;

				if (weapon != null) {
					kitem.Weapon            = new Weapon();
					kitem.Weapon.ammoType   = weapon.primaryMagazine.ammoType.shortname;
					kitem.Weapon.ammoAmount = weapon.primaryMagazine.contents;
				}
			}

			if (item.contents != null) {
				kitem.Content = new List<ItemContent>();

				foreach (var cont in item.contents.itemList) {
					kitem.Content.Add(new ItemContent() {
						Amount    = cont.amount,
						Condition = cont.condition,
						ShortName = cont.info.shortname
					});
				}
			}

			return kitem;
		}

		private List<Kit> GetKitsForPlayer(BasePlayer player) {
			return _kits.Where(kit => kit.Hide == false
								  && (string.IsNullOrEmpty(kit.Permission) || permission.UserHasPermission(player.UserIDString, $"{Title.ToLower()}.{kit.Permission}"))
								  && (kit.Amount == 0 || (kit.Amount > 0 && GetPlayerData(player.userID, kit.Name).Amount < kit.Amount))).ToList();
		}

		private BasePlayer FindPlayer(BasePlayer player, string nameOrID) {
			ulong id;

			if (ulong.TryParse(nameOrID, out id) && nameOrID.StartsWith("7656119") && nameOrID.Length == 17) {
				var findedPlayer = BasePlayer.FindByID(id);

				if (findedPlayer == null || !findedPlayer.IsConnected) {
					SendReply(player, GetMsg("Not Found Player", player));
					return null;
				}

				return findedPlayer;
			}

			var foundPlayers = BasePlayer.activePlayerList.Where(x => x.displayName.ToLower().Contains(nameOrID.ToLower()));

			if (foundPlayers.Count() == 0) {
				SendReply(player, GetMsg("Not Found Player", player));
				return null;
			}

			if (foundPlayers.Count() > 1) {
				SendReply(player, GetMsg("To Many Player", player));
				return null;
			}

			return foundPlayers.First();
		}

		private double GetCurrentTime() => new TimeSpan(DateTime.UtcNow.Ticks).TotalSeconds;

		private static string HexToRustFormat(string hex) {
			if (string.IsNullOrEmpty(hex)) {
				hex = "#FFFFFFFF";
			}

			var str = hex.Trim('#');
			if (str.Length == 6)
				str += "FF";

			if (str.Length != 8) {
				throw new InvalidOperationException("Cannot convert a wrong format.");
			}

			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);
			var   a     = byte.Parse(str.Substring(6, 2), NumberStyles.HexNumber);
			Color color = new Color32(r, g, b, a);
			return string.Format("{0:F2} {1:F2} {2:F2} {3:F2}", color.r, color.g, color.b, color.a);
		}

		private static class TimeExtensions {
			public static string FormatShortTime(TimeSpan time) {
				string result = string.Empty;
				if (time.Days != 0)
					result += $"{time.Days} д.";
				if (time.Hours != 0)
					result += $"{time.Hours} ч.";
				if (time.Minutes != 0)
					result += $"{time.Minutes} м.";
				if (time.Seconds != 0)
					result += $"{time.Seconds} с.";
				return result;
			}

			public static string FormatTime(TimeSpan time) {
				string result = string.Empty;
				if (time.Days != 0)
					result += $"{Format(time.Days, "дней", "дня", "день")} ";
				if (time.Hours != 0)
					result += $"{Format(time.Hours, "часов", "часа", "час")} ";
				if (time.Minutes != 0)
					result += $"{Format(time.Minutes, "минут", "минуты", "минута")} ";
				if (time.Seconds != 0)
					result += $"{Format(time.Seconds, "секунд", "секунды", "секунда")} ";
				return result;
			}

			private static string Format(int units, string form1, string form2, string form3) {
				var tmp = units % 10;
				if (units >= 5 && units <= 20 || tmp >= 5 && tmp <= 9)
					return $"{units} {form1}";
				if (tmp >= 2 && tmp <= 4)
					return $"{units} {form2}";

				return $"{units} {form3}";
			}
		}
		#endregion
	}
}

Автор
15FPS
Скачиваний
0
Просмотры
1
Первый выпуск
Обновление
Оценка
0.00 звёзд 0 оценок
Сверху