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

FREE MenuBase : 1.0.5 1.0.5

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

namespace Oxide.Plugins
{
	[Info("MenuBase", "Forum: https://topplugin.ru Ds: alone_sempai Vk: https://vk.com/rustnastroika", "1.0.5")]
	class MenuBase : RustPlugin
	{
		#region Classes

		internal class Button
		{
			[JsonProperty("Ключ перевода из lang-файла")]
			public string LangKey;
			[JsonProperty("Команда (консольная)")]
			public string Command;
		}
		internal class Section
		{
			[JsonProperty("Позиция")] public int Order;
			[JsonProperty("Ключ перевода из lang-файла")]
			public string LangKey;

			[JsonProperty("Команда для открытия раздела")]
			public string Command;

			[JsonProperty("Нужно рисовать background этим плагином?")]
			public bool NeedDrawBG = true;
		}
		#endregion

		#region Fields

		[PluginReference] private Plugin ImageLibrary, IQEconomic, Volts;

		private const string Layer = "ui.MenuBase.bg";
		private const string Layer_BLUR = "ui.MenuBase.bg.blur";

		private const string GRADIENT_RIGHT = "assets/content/ui/ui.background.transparent.linearltr.tga";
		private const string GRADIENTDOWN_COLOR = "0 0 0 0.7";
		
		private const string WHITE_TRANSPARENT_BACKGROUND = "1 1 1 0.3";
		private const string ORANGE_COLOR = "0.9490196 0.5019608 0.05490196 1";
		private const string BACKGROUND_COLOR = "0.3568628 0.3568628 0.3568628 0.75";

		private const string TEXT_COLOR = "1 1 1 1";

		private const string RED_COLOR = "0.6901961 0.3490196 0.3490196 0.8";
		
		#endregion

		#region Hooks

		private void OnServerInitialized()
		{
			var images = new List<string>();

			foreach (var x in cfg.BaseSettings.Sections)
			{
				images.Add($"Icon_{x.Key}");
			}
			foreach (var x in cfg.MainSettings.Banners)
				images.Add(x.Value);
			images.Add("volts");
			images.Add("coins");
			images.Add("banner_shop");
			images.Add("volts_shop_btn");
			
			GuiManager.LoadImages(images);
		}

		private void Unload()
		{
			GuiManager.Clear();
			foreach (var x in BasePlayer.activePlayerList)
				CuiHelper.DestroyUi(x, Layer_BLUR);
		}
		#endregion

		#region Methods

		private DateTime GetLastWipeDate()
		{
			return SaveRestore.SaveCreatedTime;
		}

		private DateTime GetNextWipeDate()
		{
			return GetLastWipeDate() + TimeSpan.FromDays(7);
		}

		private string GetMonthName(int month)
		{
			return month switch
			{
				1 => "ЯНВАРЯ",
				2 => "ФЕВРАЛЯ",
				3 => "МАРТА",
				4 => "АПРЕЛЯ",
				5 => "МАЯ",
				6 => "ИЮНЯ",
				7 => "ИЮЛЯ",
				8 => "АВГУСТА",
				9 => "СЕНТЯБРЯ",
				10 => "ОКТЯБРЯ",
				11 => "НОЯБРЯ",
				12 => "ДЕКАБРЯ",
				_ => "UNKNOWN"
			};
		}

		private string GetValidLastWipeData()
		{
			var dateTime = GetLastWipeDate();

			return $"{dateTime.Day} {GetMonthName(dateTime.Month)}";
		}

		private string GetValidNextWipeData()
		{
			var dateTime = GetNextWipeDate();

			return $"{dateTime.Day} {GetMonthName(dateTime.Month)}";
		}
		
		private int GetBalanceVolts(BasePlayer player)
		{
			return (int)IQEconomic.Call("API_GET_BALANCE", player.UserIDString);
		}

		private int GetBalanceCoins(BasePlayer player)
		{
			if (!IQEconomic)
				return -1;
			return (int)IQEconomic.Call("API_GET_BALANCE", player.UserIDString);
		}
		private static class GuiManager
		{
			public static void Clear()
			{
				iconImageInfos.Clear();
				FailedLoad.Clear();
			}

			public static string Get(string key)
			{
				if (iconImageInfos.TryGetValue(key, out var id))
					return id.ToString();
				return "";
			}

			private static Dictionary<string, uint> iconImageInfos = new();

			private static List<string> FailedLoad = new();

			internal static void LoadImages(List<string> imageFiles)
			{
				foreach (var x in imageFiles)
				{
					if (iconImageInfos.ContainsKey(x))
						continue;
					iconImageInfos.Add(x, 0);
				}

				ServerMgr.Instance.StartCoroutine(LoadIconsCoroutine());
			}

			private static IEnumerator LoadIconsCoroutine()
			{
				for (int i = 0; i < iconImageInfos.Count; i++)
				{
					var imageInfo = iconImageInfos.ElementAtOrDefault(i);
					string url = "file://" + Interface.Oxide.DataDirectory + Path.DirectorySeparatorChar +
					             "/MenuBase/Images/" +
					             imageInfo.Key + ".png";

					using (WWW www = new WWW(url))
					{
						yield return www;

						if (www.error != null)
						{
							FailedLoad.Add(imageInfo.Key);
						}
						else
						{
							var texture = www.texture;
							var imageId = FileStorage.server.Store(texture.EncodeToPNG(), FileStorage.Type.png,
								CommunityEntity.ServerInstance.net.ID);
							iconImageInfos[imageInfo.Key] = imageId;
							GameObject.DestroyImmediate(texture);
						}
					}
				}

				if (FailedLoad.IsNullOrEmpty())
					yield break;
				
				Debug.LogError($"\n\nFailed for loading {FailedLoad.Count} images in plugin MenuBase");
				Debug.LogError("__________________________________");
				for (int i = 0; i < FailedLoad.Count; i++)
					Debug.LogWarning($"[{i + 1}]" + $"{FailedLoad[i]}".PadLeft(31 - (i + 1 >= 10 ? 1 : 0), ' '));
				Debug.LogError("__________________________________\n\n");
					
			}
		}
		#endregion

		#region UI

		#region BaseUI
		private void UI_DrawMain(BasePlayer player)
		{
			CuiHelper.DestroyUi(player, Layer_BLUR);
			var container = new CuiElementContainer();

			container.Add(new CuiPanel()
			{
				Image = { Material = "assets/content/ui/uibackgroundblur-ingamemenu.mat", Color = "0.169 0.162 0.143 0.4", ImageType = Image.Type.Tiled },
				RectTransform = { AnchorMin = "0 0", AnchorMax = "1 1" }
			}, "Overlay", Layer_BLUR);
			container.Add(new CuiPanel()
			{
				Image = { Sprite = "assets/content/ui/ui.background.transparent.radial.psd", Color = "0.21 0.21 0.21 1.00"},
				RectTransform = { AnchorMin = "0 0", AnchorMax = "1 1" }
			}, Layer_BLUR, Layer_BLUR + ".radial");
			
			container.Add(new CuiPanel
			{
				CursorEnabled = true,
				Image = { Color = "1 1 1 0" },
				RectTransform = { AnchorMin = "0.5 0.5", AnchorMax = "0.5 0.5", OffsetMin = "-388.376 -229.226", OffsetMax = "410.776 229.243" }
			}, Layer_BLUR, Layer, Layer);
			
			container.Add(new CuiPanel
			{
				CursorEnabled = false,
				Image = { Color = BACKGROUND_COLOR },
				RectTransform = { AnchorMin = "0.5 0.5", AnchorMax = "0.5 0.5", OffsetMin = "-399.575 -229.235", OffsetMax = "-234.292 229.235" }
			}, Layer, Layer + ".sections.div");
			
			CuiHelper.AddUi(player, container);

			var activeSection = "";

			if (cfg.BaseSettings.Sections.ContainsKey(cfg.BaseSettings.DefaultSection))
				activeSection = cfg.BaseSettings.DefaultSection;
			
			UI_DrawMainDiv(player, cfg.BaseSettings.Sections[activeSection].NeedDrawBG);
			
			UI_DrawSections(player, activeSection);
			
			if (!string.IsNullOrEmpty(activeSection))
				player.SendConsoleCommand(cfg.BaseSettings.Sections[activeSection].Command);
		}

		private void UI_DrawMainDiv(BasePlayer player, bool needDrawBG)
		{
			var container = new CuiElementContainer();
			container.Add(new CuiPanel
			{
				CursorEnabled = false,
				Image = { Color = needDrawBG ? BACKGROUND_COLOR : "0 0 0 0" },
				RectTransform = { AnchorMin = "0.5 0.5", AnchorMax = "0.5 0.5", OffsetMin = "-229.802 -229.232", OffsetMax = "399.578 229.228" }
			}, Layer, Layer + ".main", Layer + ".main");
			container.Add(new CuiPanel
			{
				CursorEnabled = false,
				Image = { Color = "0 0 0 0" },
				RectTransform = { AnchorMin = "0.5 0.5", AnchorMax = "0.5 0.5", OffsetMin = "-229.801 -229.232", OffsetMax = "399.579 229.228" }
			}, Layer, Layer + ".main.div", Layer + ".main.div");
			if (needDrawBG)
				container.Add(new CuiButton
				{
					Button = { Color = RED_COLOR, Close = Layer_BLUR },
					Text = { Text = "X", Font = "permanentmarker.ttf", FontSize = 20, Align = TextAnchor.MiddleCenter, Color = TEXT_COLOR },
					RectTransform = { AnchorMin = "0.5 0.5", AnchorMax = "0.5 0.5", OffsetMin = "285.139 199.674", OffsetMax = "314.69 229.226" }
				}, Layer + ".main.div", Layer + ".main.div" + ".close");
			CuiHelper.AddUi(player, container);
		}
		
		private void UI_DrawSections(BasePlayer player, string activeSection)
		{
			var container = new CuiElementContainer();

			container.Add(new CuiPanel
			{
				CursorEnabled = false,
				Image = { Color = "1 1 1 0" },
				RectTransform = { AnchorMin = "0.5 0.5", AnchorMax = "0.5 0.5", OffsetMin = "-82.64 -229.233", OffsetMax = "82.64 229.237" },
			}, Layer + ".sections.div", Layer + ".sections.div" + ".items", Layer + ".sections.div" + ".items");

			float minxNonActive = -82.64f;
			float maxxNonActive = 82.64f; 
			float miny = 193.244f;
			float maxy = 229.2341f;

			float minxActive = -109.0284f;
			float maxxActive = 80.63995f;


			string imagePosNonActiveMin = "-81.792 -9.342";
			string imagePosNonActiveMax = "-58.108 9.342";
			
			
			string imagePosActiveMin = "-86.792 -9.342";
			string imagePosActiveMax = "-63.108 9.342";

			float TextNonActiveOffset = 20f;
			
			foreach (var x in cfg.BaseSettings.Sections.OrderBy(x => x.Value.Order))
			{
				bool isActive = x.Key == activeSection;

				container.Add(new CuiElement()
				{
					Name = Layer + ".sections.div" + ".items" + $".{x.Key}" + ".bg",
					Parent = Layer + ".sections.div" + ".items",
					Components =
					{
						new CuiImageComponent() { Color = isActive ? GRADIENTDOWN_COLOR : "0 0 0 0" },
						new CuiRectTransformComponent() { AnchorMin = "0.5 0.5", AnchorMax = "0.5 0.5", OffsetMin = $"{(isActive ? minxActive : minxNonActive)} {miny}", OffsetMax =  $"{(isActive ? maxxActive : maxxNonActive)} {maxy}" }
					}
				});
				container.Add(new CuiButton
				{
					Button = { Color = "0 0 0 0", Command = isActive ? "" : $"mb.section {x.Key}" },
					RectTransform = { AnchorMin = "0 0", AnchorMax = "1 1" }
				}, Layer + ".sections.div" + ".items" + $".{x.Key}" + ".bg", Layer + ".sections.div" + ".items" + $".{x.Key}");
				
				container.Add(new CuiPanel
				{
					Image = { Color = isActive ? ORANGE_COLOR : "1 1 1 0" },
					RectTransform =
					{
						AnchorMin = "0 0",
						AnchorMax = "1 1",
						OffsetMin = "0 3",
						OffsetMax = "0 0"
					}
				}, Layer + ".sections.div" + ".items" + $".{x.Key}", Layer + ".sections.div" + ".items" + $".{x.Key}" + ".background");


				container.Add(new CuiElement()
				{
					Parent = Layer + ".sections.div" + ".items" + $".{x.Key}" + ".background",
					Components =
					{
						new CuiRawImageComponent() { Png = GuiManager.Get($"Icon_{x.Key}") },
						new CuiRectTransformComponent() { AnchorMin = "0.5 0.5", AnchorMax = "0.5 0.5", OffsetMin = isActive ? imagePosActiveMin : imagePosNonActiveMin, OffsetMax = isActive ? imagePosActiveMax : imagePosNonActiveMax }
					}
				});

				container.Add(new CuiElement
				{
					Parent = Layer + ".sections.div" + ".items" + $".{x.Key}" + ".background",
					Components = {
						new CuiTextComponent { Text = GetMsg(x.Value.LangKey, player), Font = "robotocondensed-regular.ttf", FontSize = 12, Align = isActive ? TextAnchor.MiddleCenter : TextAnchor.MiddleLeft, Color = TEXT_COLOR },
						new CuiRectTransformComponent { AnchorMin = "0.5 0.5", AnchorMax = "0.5 0.5", OffsetMin = $"{(-73.317 + (!isActive ? TextNonActiveOffset : 0))} -16.182", OffsetMax = "94.834 16.182" }
					}
				});

				
				miny -= 35.989f;
				maxy -= 35.989f;
			}
			CuiHelper.AddUi(player, container);
		}
		#endregion

		#region Main page

		private void UI_DrawMainPage(BasePlayer player)
		{
			var container = new CuiElementContainer();
			
			container.Add(new CuiPanel
			{
				CursorEnabled = false,
				Image = { Color = "1 1 1 0" },
				RectTransform = { AnchorMin = "0.5 0.5", AnchorMax = "0.5 0.5", OffsetMin = "-309.405 130.694", OffsetMax = "61.589 222.516" }
			}, Layer + ".main.div", Layer + ".main.div" + ".player.div");

			container.Add(new CuiPanel
			{
				CursorEnabled = false,
				Image = { Color = "1 1 1 0.3", Sprite = GRADIENT_RIGHT },
				RectTransform = { AnchorMin = "0.5 0.5", AnchorMax = "0.5 0.5", OffsetMin = "-185.502 -40.583", OffsetMax = "185.498 44.005" }
			}, Layer + ".main.div" + ".player.div", Layer + ".main.div" + ".player.div" + ".gradient.sprite");

			container.Add(new CuiElement()
			{
				Name = Layer + ".main.div" + ".player.div" + ".avatar.div",
				Parent = Layer + ".main.div" + ".player.div",
				Components =
				{
					new CuiRawImageComponent() { Color = GRADIENTDOWN_COLOR },
					new CuiRectTransformComponent() { AnchorMin = "0.5 0.5", AnchorMax = "0.5 0.5", OffsetMin = "-185.5 -45.911", OffsetMax = "-98.004 45.911" }
				}
			});


			container.Add(new CuiElement()
			{
				Parent = Layer + ".main.div" + ".player.div" + ".avatar.div",
				Components =
				{
					new CuiImageComponent() { Color = ORANGE_COLOR },
					new CuiOutlineComponent()
					{
						Distance	= "2 2", Color = ORANGE_COLOR
					},
					new CuiRectTransformComponent()
					{
						AnchorMin = "0.5 0.5", AnchorMax = "0.5 0.5", OffsetMin = "-41.901 -41.422",
						OffsetMax = "42.171 44.182"
					}
				}
			});
			container.Add(new CuiElement()
			{
				Parent = Layer + ".main.div" + ".player.div" + ".avatar.div",
				Components =
				{
					new CuiRawImageComponent() { SteamId = player.UserIDString },
					new CuiRectTransformComponent() { AnchorMin = "0.5 0.5", AnchorMax = "0.5 0.5", OffsetMin = "-41.901 -41.422", OffsetMax = "42.171 44.182" }
				}
			});

			container.Add(new CuiElement
			{
				Parent = Layer + ".main.div" + ".player.div",
				Components = {
								new CuiTextComponent { Text = player.displayName, Font = "robotocondensed-bold.ttf", FontSize = 19, Align = TextAnchor.UpperLeft, Color = TEXT_COLOR },
								new CuiRectTransformComponent { AnchorMin = "0.5 0.5", AnchorMax = "0.5 0.5", OffsetMin = "-92.4 18.375", OffsetMax = "187.4 44.005" }
							}
			});

			container.Add(new CuiPanel
			{
				CursorEnabled = false,
				Image = { Color = "1 1 1 0" },
				RectTransform = { AnchorMin = "0.5 0.5", AnchorMax = "0.5 0.5", OffsetMin = "-90.2 -31.717", OffsetMax = "27.637 14.6" }
			}, Layer + ".main.div" + ".player.div", Layer + ".main.div" + ".player.div" + ".balance.div");

			container.Add(new CuiPanel
			{
				CursorEnabled = false,
				Image = { Color = "1 1 1 0" },
				RectTransform = { AnchorMin = "0.5 0.5", AnchorMax = "0.5 0.5", OffsetMin = "-58.92 0", OffsetMax = "58.92 23.159" }
			}, Layer + ".main.div" + ".player.div" + ".balance.div", Layer + ".main.div" + ".player.div" + ".balance.div" + ".coins.div");
			
			// container.Add(new CuiElement()
			// {
			// 	Parent = Layer + ".main.div" + ".player.div" + ".balance.div" + ".coins.div",
			// 	Components =
			// 	{
			// 		new CuiRawImageComponent() { Png = GuiManager.Get("coins") },
			// 		new CuiRectTransformComponent()
			// 		{
			// 			AnchorMin = "0.5 0.5", AnchorMax = "0.5 0.5", OffsetMin = "-58.243 -8.443", OffsetMax = "-38.957 10.843"
			// 		}
			// 	}
			// });
			// ❍
			container.Add(new CuiElement()
			{
				Parent = Layer + ".main.div" + ".player.div" + ".balance.div" + ".coins.div",
				Components =
				{
					new CuiTextComponent() { Text = "❍", FontSize = 14, Align = TextAnchor.LowerCenter },
					new CuiRectTransformComponent() { 	AnchorMin = "0.5 0.5", AnchorMax = "0.5 0.5", OffsetMin = "-58.243 -9.443", OffsetMax = "-38.957 9.843" }
				}
			});
			container.Add(new CuiElement
			{
				Parent = Layer + ".main.div" + ".player.div" + ".balance.div" + ".coins.div",
				Components = {
								new CuiTextComponent { Text = GetBalanceCoins(player).ToString(), Font = "robotocondensed-bold.ttf", FontSize = 14, Align = TextAnchor.MiddleLeft, Color = "1 1 1 1" },
								new CuiRectTransformComponent { AnchorMin = "0.5 0.5", AnchorMax = "0.5 0.5", OffsetMin = "-33.132 -12.729", OffsetMax = "58.92 9.129" }
							}
			});

			container.Add(new CuiPanel
			{
				CursorEnabled = false,
				Image = { Color = "1 1 1 0" },
				RectTransform = { AnchorMin = "0.5 0.5", AnchorMax = "0.5 0.5", OffsetMin = "-58.918 -23.16", OffsetMax = "58.922 0" }
			}, Layer + ".main.div" + ".player.div" + ".balance.div", Layer + ".main.div" + ".player.div" + ".balance.div" + ".volts.div");

			container.Add(new CuiElement()
			{
				Parent = Layer + ".main.div" + ".player.div" + ".balance.div" + ".volts.div",
				Components =
				{
					new CuiTextComponent() { Text = "<color=orange><size=14><b>ϟ</b></size></color>", FontSize = 10, Align = TextAnchor.MiddleCenter},
					new CuiRectTransformComponent() { 	AnchorMin = "0.5 0.5", AnchorMax = "0.5 0.5", OffsetMin = "-58.243 -10.643",
									OffsetMax = "-38.957 8.643" }
				}
			});
			
			// container.Add(new CuiElement()
			// {
			// 	Parent = Layer + ".main.div" + ".player.div" + ".balance.div" + ".volts.div",
			// 	Components =
			// 	{
			// 		new CuiRawImageComponent() { Png = GuiManager.Get("volts") },
			// 		new CuiRectTransformComponent()
			// 		{
			// 			AnchorMin = "0.5 0.5", AnchorMax = "0.5 0.5", OffsetMin = "-58.243 -9.643",
			// 			OffsetMax = "-38.957 9.643"
			// 		}
			// 	}
			// });

			container.Add(new CuiElement
			{
				Parent = Layer + ".main.div" + ".player.div" + ".balance.div" + ".volts.div",
				Components = {
								new CuiTextComponent { Text = GetBalanceVolts(player).ToString(), Font = "robotocondensed-bold.ttf", FontSize = 14, Align = TextAnchor.MiddleLeft, Color = "1 1 1 1" },
								new CuiRectTransformComponent { AnchorMin = "0.5 0.5", AnchorMax = "0.5 0.5", OffsetMin = "-33.132 -12.729", OffsetMax = "58.92 9.129" }
							}
			});
			
			
			container.Add(new CuiPanel
			{
				CursorEnabled = false,
				Image = { Color = "1 1 1 0" },
				RectTransform = { AnchorMin = "0.5 0.5", AnchorMax = "0.5 0.5", OffsetMin = "-272.49 8.31", OffsetMax = "270.01 105.097" }
			}, Layer + ".main.div", Layer + ".main.div" + ".serverinfo.div");

			container.Add(new CuiPanel
			{
				CursorEnabled = false,
				Image = { Color = WHITE_TRANSPARENT_BACKGROUND },
				RectTransform = { AnchorMin = "0.5 0.5", AnchorMax = "0.5 0.5", OffsetMin = "-271.25 11.264", OffsetMax = "271.25 27.129" }
			}, Layer + ".main.div" + ".serverinfo.div", Layer + ".main.div" + ".serverinfo.div" + ".online.bg");

			container.Add(new CuiPanel
			{
				CursorEnabled = false,
				Image = { Color = "0.345098 0.7843138 0.345098 1" },
				RectTransform = { AnchorMin = "0 0", AnchorMax = $"{BasePlayer.activePlayerList.Count / (float)ConVar.Server.maxplayers} 1", OffsetMin = "0 0", OffsetMax = "0 0" }
			}, Layer + ".main.div" + ".serverinfo.div" + ".online.bg");

			container.Add(new CuiElement
			{
				Parent = Layer + ".main.div" + ".serverinfo.div" + ".online.bg",
				Components = {
								new CuiTextComponent { Text = $"ОНЛАЙН: {BasePlayer.activePlayerList.Count}/{ConVar.Server.maxplayers}", Font = "robotocondensed-bold.ttf", FontSize = 16, Align = TextAnchor.UpperLeft, Color = TEXT_COLOR },
								new CuiRectTransformComponent { AnchorMin = "0.5 0.5", AnchorMax = "0.5 0.5", OffsetMin = "-271.246 9.013", OffsetMax = "-27.834 30.387" }
							}
			});
			
			container.Add(new CuiElement
			{
				Parent = Layer + ".main.div" + ".serverinfo.div" + ".online.bg",
				Components = {
								new CuiTextComponent { Text = ConVar.Server.hostname.ToUpper(), Font = "robotocondensed-bold.ttf", FontSize = 16, Align = TextAnchor.UpperRight, Color = TEXT_COLOR },
								new CuiRectTransformComponent { AnchorMin = "0.5 0.5", AnchorMax = "0.5 0.5", OffsetMin = "-127.834 9.013", OffsetMax = "271.246 30.387" }
							}
			});

			container.Add(new CuiPanel
			{
				CursorEnabled = false,
				Image = { Color = "1 1 1 0" },
				RectTransform = { AnchorMin = "0.5 0.5", AnchorMax = "0.5 0.5", OffsetMin = "-271.25 -48.394", OffsetMax = "271.25 6.5" }
			}, Layer + ".main.div" + ".serverinfo.div", Layer + ".main.div" + ".serverinfo.div" + ".wipe.div");

			container.Add(new CuiPanel
			{
				CursorEnabled = false,
				Image = { Color = "1 1 1 0" },
				RectTransform = { AnchorMin = "0.5 0.5", AnchorMax = "0.5 0.5", OffsetMin = "-271.25 1.557", OffsetMax = "271.25 27.447" }
			}, Layer + ".main.div" + ".serverinfo.div" + ".wipe.div", Layer + ".main.div" + ".serverinfo.div" + ".wipe.div" + ".current.div");

			container.Add(new CuiPanel
			{
				CursorEnabled = false,
				Image = { Color = WHITE_TRANSPARENT_BACKGROUND },
				RectTransform = { AnchorMin = "0.5 0.5", AnchorMax = "0.5 0.5", OffsetMin = "-271.25 -12.946", OffsetMax = "68.097 12.945" }
			}, Layer + ".main.div" + ".serverinfo.div" + ".wipe.div" + ".current.div", Layer + ".main.div" + ".serverinfo.div" + ".wipe.div" + ".current.div" + ".text.bg");

			container.Add(new CuiElement
			{
				Parent = Layer + ".main.div" + ".serverinfo.div" + ".wipe.div" + ".current.div" + ".text.bg",
				Components = {
								new CuiTextComponent { Text = "ВАЙП БЫЛ:", Font = "robotocondensed-bold.ttf", FontSize = 16, Align = TextAnchor.MiddleCenter, Color = TEXT_COLOR },
								new CuiRectTransformComponent { AnchorMin = "0.5 0.5", AnchorMax = "0.5 0.5", OffsetMin = "-169.672 -12.946", OffsetMax = "169.668 12.945" }
							}
			});

			container.Add(new CuiPanel
			{
				CursorEnabled = false,
				Image = { Color = "0.3568628 0.3568628 0.3568628 0.8" },
				RectTransform = { AnchorMin = "0.5 0.5", AnchorMax = "0.5 0.5", OffsetMin = "73.986 -12.946", OffsetMax = "271.254 12.945" }
			}, Layer + ".main.div" + ".serverinfo.div" + ".wipe.div" + ".current.div", Layer + ".main.div" + ".serverinfo.div" + ".wipe.div" + ".current.div" + ".date.bg");

			container.Add(new CuiElement
			{
				Parent = Layer + ".main.div" + ".serverinfo.div" + ".wipe.div" + ".current.div" + ".date.bg",
				Components = {
								new CuiTextComponent { Text = GetValidLastWipeData(), Font = "robotocondensed-bold.ttf", FontSize = 16, Align = TextAnchor.MiddleCenter, Color = TEXT_COLOR },
								new CuiRectTransformComponent { AnchorMin = "0.5 0.5", AnchorMax = "0.5 0.5", OffsetMin = "-98.635 -12.946", OffsetMax = "98.635 12.945" }
							}
			});

			container.Add(new CuiPanel
			{
				CursorEnabled = false,
				Image = { Color = "1 1 1 0" },
				RectTransform = { AnchorMin = "0.5 0.5", AnchorMax = "0.5 0.5", OffsetMin = "-271.25 -27.447", OffsetMax = "271.25 -1.557" }
			}, Layer + ".main.div" + ".serverinfo.div" + ".wipe.div", Layer + ".main.div" + ".serverinfo.div" + ".wipe.div" + ".next.div");

			container.Add(new CuiPanel
			{
				CursorEnabled = false,
				Image = { Color = WHITE_TRANSPARENT_BACKGROUND },
				RectTransform = { AnchorMin = "0.5 0.5", AnchorMax = "0.5 0.5", OffsetMin = "-271.25 -12.946", OffsetMax = "68.097 12.945" }
			}, Layer + ".main.div" + ".serverinfo.div" + ".wipe.div" + ".next.div", Layer + ".main.div" + ".serverinfo.div" + ".wipe.div" + ".next.div" + ".text.bg");

			container.Add(new CuiElement
			{
				Parent = Layer + ".main.div" + ".serverinfo.div" + ".wipe.div" + ".next.div" + ".text.bg",
				Components = {
								new CuiTextComponent { Text = "СЛЕДУЮЩИЙ ВАЙП:", Font = "robotocondensed-bold.ttf", FontSize = 16, Align = TextAnchor.MiddleCenter, Color = TEXT_COLOR },
								new CuiRectTransformComponent { AnchorMin = "0.5 0.5", AnchorMax = "0.5 0.5", OffsetMin = "-169.672 -12.946", OffsetMax = "169.668 12.945" }
							}
			});

			container.Add(new CuiPanel
			{
				CursorEnabled = false,
				Image = { Color = "0.3568628 0.3568628 0.3568628 0.8" },
				RectTransform = { AnchorMin = "0.5 0.5", AnchorMax = "0.5 0.5", OffsetMin = "73.986 -12.946", OffsetMax = "271.254 12.945" }
			}, Layer + ".main.div" + ".serverinfo.div" + ".wipe.div" + ".next.div", Layer + ".main.div" + ".serverinfo.div" + ".wipe.div" + ".next.div" + ".date.bg");

			container.Add(new CuiElement
			{
				Parent = Layer + ".main.div" + ".serverinfo.div" + ".wipe.div" + ".next.div" + ".date.bg",
				Components = {
								new CuiTextComponent { Text = GetValidNextWipeData(), Font = "robotocondensed-bold.ttf", FontSize = 16, Align = TextAnchor.MiddleCenter, Color = TEXT_COLOR },
								new CuiRectTransformComponent { AnchorMin = "0.5 0.5", AnchorMax = "0.5 0.5", OffsetMin = "-98.635 -12.946", OffsetMax = "98.635 12.945" }
							}
			});

			
			CuiHelper.AddUi(player, container);
			
			UI_DrawButtons(player);
			
			var banner = cfg.MainSettings.Banners.First();
			UI_DrawBanner(player, banner.Key, true);
			UI_DrawBannerPages(player, banner.Key);
		}

		private void UI_DrawButtons(BasePlayer player)
		{
			var container = new CuiElementContainer();
			container.Add(new CuiPanel
			{
				CursorEnabled = false,
				Image = { Color = "1 1 1 0" },
				RectTransform = { AnchorMin = "0.5 0.5", AnchorMax = "0.5 0.5", OffsetMin = "-223.67 -62.21", OffsetMax = "233.024 -29.937" }
			}, Layer + ".main.div", Layer + ".main.div" + ".buttons.div");

			float minx = -228.35f;
			float maxx = -84.743f;  
			float miny = -16.13659f;
			float maxy = 16.13641f;

			foreach (var x in cfg.MainSettings.Buttons)
			{
				container.Add(new CuiButton
				{
					Button = { Color = WHITE_TRANSPARENT_BACKGROUND, Command = $"mb.info.openapi {x.Value.Command}" },
					Text = { Text = GetMsg(x.Value.LangKey, player), Font = "robotocondensed-bold.ttf", FontSize = 13, Align = TextAnchor.MiddleCenter, Color = TEXT_COLOR },
					RectTransform = { AnchorMin = "0.5 0.5", AnchorMax = "0.5 0.5", OffsetMin = $"{minx} {miny}", OffsetMax = $"{maxx} {maxy}" }
				}, Layer + ".main.div" + ".buttons.div");
				
				minx += 156.547f;
				maxx += 156.547f;
			}

			CuiHelper.AddUi(player, container);
		}

		private void UI_DrawBanner(BasePlayer player, int bannerID, bool first = false)
		{
			var container = new CuiElementContainer();
			if (first)
			{
				container.Add(new CuiPanel
				{
					CursorEnabled = false,
					Image = { Color = "1 1 1 0" },
					RectTransform = { AnchorMin = "0.5 0.5", AnchorMax = "0.5 0.5", OffsetMin = "-308.7 -229.225", OffsetMax = "308.747 -72.995" }
				}, Layer + ".main.div", Layer + ".main.div" + ".banners.div");
			}

			container.Add(new CuiElement()
			{
				Name = Layer + ".main.div" + ".banners.div" + ".banner",
				Parent = Layer + ".main.div" + ".banners.div",
				DestroyUi = Layer + ".main.div" + ".banners.div" + ".banner",
				Components =
				{
					new CuiRawImageComponent() { Png = GuiManager.Get(cfg.MainSettings.Banners[bannerID]) },
					new CuiRectTransformComponent() { AnchorMin = "0.5 0.5", AnchorMax = "0.5 0.5", OffsetMin = "-279.072 -78.115", OffsetMax = "279.078 78.115" }
				}
			});

			CuiHelper.AddUi(player, container);
		}

		private void UI_DrawBannerPages(BasePlayer player, int bannerID)
		{
			var container = new CuiElementContainer();
			container.Add(new CuiButton
			{
				Button = { Color = WHITE_TRANSPARENT_BACKGROUND, Command = $"mb.bannerpage {bannerID - 1}" },
				Text = { Text = "<", Font = "robotocondensed-regular.ttf", FontSize = 14, Align = TextAnchor.MiddleCenter, Color = TEXT_COLOR },
				RectTransform = { AnchorMin = "0.5 0.5", AnchorMax = "0.5 0.5", OffsetMin = "-308.72 -78.115", OffsetMax = "-279.071 78.115" }
			}, Layer + ".main.div" + ".banners.div", Layer + ".main.div" + ".banners.div" + ".previousbutton.div", Layer + ".main.div" + ".banners.div" + ".previousbutton.div");

			container.Add(new CuiButton
			{
				Button = { Color = WHITE_TRANSPARENT_BACKGROUND, Command = $"mb.bannerpage {bannerID + 1}" },
				Text = { Text = ">", Font = "robotocondensed-regular.ttf", FontSize = 14, Align = TextAnchor.MiddleCenter, Color = TEXT_COLOR },
				RectTransform = { AnchorMin = "0.5 0.5", AnchorMax = "0.5 0.5", OffsetMin = "279.075 -78.115", OffsetMax = "308.725 78.115" }
			}, Layer + ".main.div" + ".banners.div", Layer + ".main.div" + ".banners.div" + ".nextbutton.div", Layer + ".main.div" + ".banners.div" + ".nextbutton.div");
			CuiHelper.AddUi(player, container);
		}
		#endregion

		#endregion

		#region Commands

		[ConsoleCommand("mb.info.openapi")]
		private void cmdOpenAPI(ConsoleSystem.Arg arg)
		{
			if (arg.Player() == null || arg.Args.IsNullOrEmpty())
				return;

			string command = arg.Args[0];

			arg.Player().SendConsoleCommand("mb.info.open");
			UI_DrawMainDiv(arg.Player(), true);
			UI_DrawSections(arg.Player(), "info");
			arg.Player().Command(string.Join(" ", arg.Args));
		}

		[ConsoleCommand("mb.bannerpage")]
		private void cmdBannerPage(ConsoleSystem.Arg arg)
		{
			if (arg.Player() == null || arg.Args.IsNullOrEmpty())
				return;

			if (!int.TryParse(arg.Args[0], out var bannerID))
				return;

			if (!cfg.MainSettings.Banners.ContainsKey(bannerID))
				bannerID = cfg.MainSettings.Banners.First().Key;

			var player = arg.Player();
			
			UI_DrawBanner(player, bannerID);
			UI_DrawBannerPages(player, bannerID);
		}

		[ConsoleCommand("mb.section")]
		private void cmdSection(ConsoleSystem.Arg arg)
		{
			if (arg.Player() == null || arg.Args.IsNullOrEmpty())
				return;

			var sectionKey = arg.Args[0];
			if (!cfg.BaseSettings.Sections.TryGetValue(sectionKey, out var section))
				return;

			Effect x = new Effect("assets/bundled/prefabs/fx/notice/loot.drag.grab.fx.prefab", arg.Player(), 0, new Vector3(), new Vector3());
			EffectNetwork.Send(x, arg.Player().Connection);

			Interface.CallHook("OnSectionChanged", arg.Player(), sectionKey);

			var player = arg.Player();

			player.SendConsoleCommand(section.Command);
			UI_DrawMainDiv(player, section.NeedDrawBG);
			UI_DrawSections(player, sectionKey);
		}

		[ConsoleCommand("mb.openmain")]
		private void cmdOpenMain(ConsoleSystem.Arg arg)
		{
			if (arg.Player() == null)
				return;
			
			UI_DrawMainPage(arg.Player());
		}

		[ConsoleCommand("menu.open")]
		private void cmdOpenConsole(ConsoleSystem.Arg arg)
		{
			if (arg.Player() == null)
				return;
			
			cmdOpen(arg.Player());
		}
		[ChatCommand("menu")]
		private void cmdOpen(BasePlayer player)
		{
			UI_DrawMain(player);
		}

		#endregion
		
		#region Config
		private ConfigData cfg;

		public class ConfigData
		{
			[JsonProperty("Общие настройки", Order = 0)] public BaseUISettings BaseSettings;
			[JsonProperty("Настройки главного меню", Order = 1)] public MainPageSettings MainSettings;
			
			internal class BaseUISettings
			{
				[JsonProperty("Какой раздел открывать по умолчанию?", Order = 0)]
				public string DefaultSection;
				[JsonProperty("Разделы", Order = 1)] public Dictionary<string, Section> Sections;		
			}

			internal class MainPageSettings
			{
				[JsonProperty("Баннеры (номер - файл изображения)")] public Dictionary<int, string> Banners;
				[JsonProperty("Кнопки (max 3)")] public Dictionary<string, Button> Buttons;		
			}
		}

		protected override void LoadDefaultConfig()
		{
			var config = new ConfigData
			{
				BaseSettings = new()
				{
					DefaultSection = "menu",
					Sections = new()
					{
						["menu"] = new()
						{
							LangKey = "section_menu",
							Order = 0,
							
							Command = "mb.openmain"
						},
						["info"] = new()
						{
							LangKey = "section_info",
							Order = 8,
							Command = "mb.info.open"
						},
						["case"] = new()
						{
							LangKey = "section_case",
							Order = 3,
							NeedDrawBG = false,
							Command = "mb.case.open"
						},
						["rewards"] = new()
						{
							LangKey = "section_rewards",
							Order = 1,
							
							Command = "mb.daily.open"
						},
						["shop"] = new()
						{
							LangKey = "section_shop",
							Order = 6,
							Command = "mb.shop",
							NeedDrawBG = false
						},
						["skin"] = new()
						{
							LangKey = "section_skin",
							Order = 2,
							
							Command = "mb.skins"
						},
						["block"] = new()
						{
							LangKey = "section_block",
							Order = 7,
							Command = "mb.block.open"
						},
						["store"] = new()
						{
							LangKey = "section_store",
							Order = 9,
							Command = ""
						},
						["alertraid"] = new()
						{
							LangKey = "section_alertraid",
							Order = 5,
							Command = "mb.alert.open"
						}
					}
				},
				MainSettings = new()
				{
					Banners = new()
					{
						[0] = "imagelink1",
						[1] = "imagelink2"
					},
					Buttons = new()
					{
						["commands"] = new()
						{
							LangKey = "btn.commands",
							Command = "mb.info.category commands"
						},
						["faq"] = new()
						{
							LangKey = "btn.faq",
							Command = "mb.info.category faq"
						},
						["info"] = new()
						{
							LangKey = "btn.info",
							Command = "mb.info.category help"
						}
					}
				}
			};
			SaveConfig(config);
		}

		protected override void LoadConfig()
		{
			base.LoadConfig();
			cfg = Config.ReadObject<ConfigData>();
			SaveConfig(cfg);

			cfg.MainSettings.Banners = cfg.MainSettings.Banners.OrderBy(x => x.Key).ToDictionary(x => x.Key, x => x.Value);
		}

		private void SaveConfig(object config)
		{
			Config.WriteObject(config, true);
		}
		#endregion

		#region Langs
		private void LoadDefaultMessages()
		{
			lang.RegisterMessages(new Dictionary<string, string>
			{
				["section_menu"] = "MAIN",
				["section_rewards"] = "DAILY REWARDS",
				["section_skin"] = "SKINS",
				["section_case"] = "CASES",
				["section_kits"] = "KITS",
				["section_alertraid"] = "RAID ALERTS",
				["section_shop"] = "SHOP",
				["section_block"] = "BLOCK",
				["section_info"] = "INFO",
				["section_store"] = "STORE",
				["btn.faq"] = "FAQ",
				["btn.commands"] = "COMMANDS",
				["btn.info"] = "INFO"
			}, this);

			lang.RegisterMessages(new Dictionary<string, string>
			{
				["section_menu"] = "ГЛАВНАЯ",
				["section_rewards"] = "ЕЖЕДНЕВНЫЕ НАГРАДЫ",
				["section_skin"] = "СКИНЫ",
				["section_case"] = "КЕЙСЫ",
				["section_kits"] = "НАБОРЫ",
				["section_alertraid"] = "ОПОВЕЩЕНИЯ О РЕЙДЕ",
				["section_shop"] = "МАГАЗИН",
				["section_block"] = "БЛОКИРОВКА",
				["section_info"] = "ИНФОРМАЦИЯ",
				["section_store"] = "КОРЗИНА",
				["btn.faq"] = "ВОПРОСЫ",
				["btn.commands"] = "КОМАНДЫ",
				["btn.info"] = "ИНФО"
			}, this, "ru");
		}
		private string GetMsg(string key, ulong id, params object[] args) =>
			string.Format(lang.GetMessage(key, this, id.ToString()), args);

		private string GetMsg(string key, BasePlayer player, params object[] args) =>
			GetMsg(key, player.userID, args);

		#endregion

		#region API

		[HookMethod("API_GetImage")]
		private string API_GetImage(string key) => GuiManager.Get(key);

		#endregion
	}
}

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