C#:
// Все права принадлежат дискорд сообществу https://discord.gg/VgNHPpNrz6
using Oxide.Core.Plugins;
using System.Collections.Generic;
using Network;
using Newtonsoft.Json;
using System;
using System.Collections;
using System.ComponentModel;
using System.Linq;
using UnityEngine;
using Oxide.Game.Rust.Cui;
using UnityEngine.UI;
using Oxide.Core.Libraries.Covalence;
using Rust;
using System.Text.RegularExpressions;
using System.Xml;
using System.IO;
using System.Reflection;
using Newtonsoft.Json.Linq;
namespace Oxide.Plugins {
[Info("AdminMenu", "0xF [dsc.gg/0xf-plugins]", "1.0.6")]
[Description("Multifunctional in-game admin menu.")]
public class AdminMenu : RustPlugin {
[PluginReference]
private Plugin ImageLibrary, Economics, ServerRewards, Clans;
private const string PERMISSION_USE = "adminmenu.use";
private const string PERMISSION_FULLACCESS = "adminmenu.fullaccess";
private const string PERMISSION_CONVARS = "adminmenu.convars";
private const string PERMISSION_PERMISSIONMANAGER = "adminmenu.permissionmanager";
private const string PERMISSION_PLUGINMANAGER = "adminmenu.pluginmanager";
private const string PERMISSION_GIVE = "adminmenu.give";
private const string ADMINMENU_IMAGEBASE64 = "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";
private static AdminMenu Instance;
private static Dictionary<string, Panel> panelList;
private static Dictionary<ulong, SteamInfo> cachedSteamInfo = new Dictionary<ulong, SteamInfo>();
private static string ADMINMENU_IMAGECRC;
private MainMenu mainMenu;
private Dictionary<string, string> defaultLang = new Dictionary<string, string>();
static Configuration config;
public AdminMenu() {
Instance = this;
}
public class ButtonArray<T> : List<T> where T : Button {
public ButtonArray() : base() {
}
public ButtonArray(IEnumerable<T> collection) : base(collection) {
}
public IEnumerable<T> GetAllowedButtons(Connection connection) {
return GetAllowedButtons(connection.userid.ToString());
}
public IEnumerable<T> GetAllowedButtons(string userId) {
return this.Where(b => b == null || b.UserHasPermission(userId));
}
}
public class ButtonArray : ButtonArray<Button> {
}
public class QuickMenuButtonArray : ButtonArray<Button> {
public QuickMenuButtonArray() : base() {
Capacity = 5;
}
}
public class UserInfoButtonArray : ButtonArray<Button> {
public UserInfoButtonArray() : base() {
Capacity = 3;
}
}
public class Button {
public enum State {
None = -1, Normal, Pressed, Toggled
}
private string label = null;
private string permission = null;
public string Command {
get;
set;
}
public string[] Args {
get;
set;
}
public Label Label {
get;
set;
}
public virtual int FontSize {
get;
set;
}
= 14;
public ButtonStyle Style {
get;
set;
}
= ButtonStyle.Default;
public string Permission {
get {
return permission;
}
set {
if (string.IsNullOrEmpty(value)) return;
permission = string.Format("adminmenu.{0}", value);
if (!Instance.permission.PermissionExists(permission)) Instance.permission.RegisterPermission(permission, Instance);
}
}
public string FullCommand {
get {
return $"{Command} {string.Join(" ", Args)}";
}
}
public Button() {
}
public Button(string label, string command, params string[] args) {
Label = new Label(label);
Command = command;
Args = args;
if (!all.ContainsKey(FullCommand)) all.Add(FullCommand, this);
}
public Button.State GetState(ConnectionData connectionData) {
if (connectionData.userData.TryGetValue($"button_{this.GetHashCode()}.state", out object state)) return (Button.State)state;
return Button.State.None;
}
public void SetState(ConnectionData connectionData, Button.State state) {
connectionData.userData[$"button_{this.GetHashCode()}.state"] = state;
}
public bool UserHasPermission(Connection connection) {
return UserHasPermission(connection.userid.ToString());
}
public bool UserHasPermission(string userId) {
return permission == null || Instance.permission.UserHasPermission(userId, PERMISSION_FULLACCESS) || Instance.permission.UserHasPermission(userId, Permission);
}
public virtual bool IsPressed(ConnectionData connectionData) {
return GetState(connectionData) == State.Pressed;
}
public virtual bool IsHidden(ConnectionData connectionData) {
return false;
}
internal static Dictionary<string, Button> all = new Dictionary<string, Button>();
}
public class ButtonStyle : ICloneable {
public string BackgroundColor {
get;
set;
}
public string ActiveBackgroundColor {
get;
set;
}
public string TextColor {
get;
set;
}
public object Clone() {
return this.MemberwiseClone();
}
public static ButtonStyle Default => new ButtonStyle {
BackgroundColor = "0.3 0.3 0.3 0.6", ActiveBackgroundColor = "0.2 0.4 0.2 0.6", TextColor = "1 1 1 1",
}
;
}
public class CategoryButton : Button {
public override int FontSize {
get;
set;
}
= 22;
public CategoryButton(string label, string command, params string[] args) : base(label, command, args) {
}
}
public class HideButton : Button {
public HideButton(string label, string command, params string[] args) : base(label, command, args) {
}
public override bool IsHidden(ConnectionData connectionData) {
return connectionData.userData["backcommand"] == null;
}
}
public class ToggleButton : Button {
public ToggleButton(string label, string command, params string[] args) : base(label, command, args) {
}
public bool State {
get;
set;
}
public void Toggle(ConnectionData connectionData) {
State = !State;
SetState(connectionData, State ? Button.State.Toggled : Button.State.Normal);
}
}
[JsonObject(MemberSerialization.OptIn)]
public class BaseCustomButton {
[JsonProperty]
public string Label {
get;
set;
}
= string.Empty;
[JsonProperty]
public string[] Commands {
get;
set;
}
= new string[0];
[JsonProperty]
public string Permission {
get;
set;
}
= string.Empty;
[JsonProperty]
public ButtonStyle Style {
get;
set;
}
= ButtonStyle.Default;
[JsonProperty]
public int[] Position {
get;
set;
}
= new int[2] {
0, 0
}
;
protected virtual string BaseCommand => "custombutton";
private Button _button;
public Button Button {
get {
if (_button == null) _button = GetButton();
return _button;
}
}
private Button GetButton() {
return new Button(Label, BaseCommand, "cb.exec", Commands.GetHashCode().ToString()) {
Permission = Permission.ToLower(), Style = Style
}
;
;
}
}
public class QMCustomButton : BaseCustomButton {
protected override string BaseCommand => "quickmenu.action";
}
public class UserInfoCustomButton : BaseCustomButton {
protected override string BaseCommand => "userinfo.action";
}
public static class SidebarCollection {
private static Dictionary<string, Sidebar> all = new Dictionary<string, Sidebar>();
public static Sidebar TryGet(string key) {
if (all.TryGetValue(key, out Sidebar sidebars)) return sidebars;
return null;
}
public static void Set(string key, Sidebar value) {
all[key] = value;
}
}
public static class ContentCollection {
private static Dictionary<string, Content> all = new Dictionary<string, Content>();
public static Content TryGet(string key) {
if (all.TryGetValue(key, out Content content)) return content;
return null;
}
public static void Set(string key, Content value) {
all[key] = value;
}
}
public static class Collector {
public static void CollectAll() {
CollectPluginsStaff();
}
public static void CollectPluginsStaff() {
List<string> all_permissions = Instance.permission.GetPermissions().ToList();
List<string> pluginNames = new List<string>();
foreach (var plugin in Instance.plugins.GetAll()) {
if (plugin.IsCorePlugin) continue;
string pluginName = plugin.Name;
string pluginNameLower = plugin.ToString().Replace("Oxide.Plugins.", "").ToLower();
IEnumerable<string> permissions = all_permissions.Where(perm => perm.ToLower().Contains($"{pluginNameLower}"));
if (permissions.Count() > 0) {
pluginNames.Add(pluginName);
ContentCollection.Set($"permissions.{pluginName.GetHashCode()}", new PermissionsContent {
plugin = plugin, permissions = permissions.ToArray()
}
);
}
}
pluginNames = pluginNames.OrderBy(name => name).ToList();
int pluginsCount = pluginNames.Count;
int amountPerPage = 12;
int c = Mathf.CeilToInt(pluginsCount / (float)amountPerPage);
for (int i = 0; i < c; i++) {
List<string> range = pluginNames.GetRange(i * amountPerPage, Mathf.Min(amountPerPage, pluginsCount - i * amountPerPage));
ButtonArray<CategoryButton> buttons = new ButtonArray<CategoryButton>();
if (i > 0) buttons.Add(new CategoryButton("PREV PAGE", "permissions.pluginlistpage.open", $"{i - 1}") {
FontSize = 18
}
);
buttons.AddRange(range.Select(name => new CategoryButton(name, "permissions.pluginpermissions.open", name.GetHashCode().ToString()) {
FontSize = 18
}
));
if (i < c - 1) buttons.Add(new CategoryButton("NEXT PAGE", "permissions.pluginlistpage.open", $"{i + 1}") {
FontSize = 18
}
);
SidebarCollection.Set($"pluginpermissions.{i}", new Sidebar() {
AutoActivateCategoryButtonIndex = -1, CategoryButtons = buttons
}
);
}
}
}
public class Configuration {
[JsonProperty(PropertyName = "Text under the ADMIN MENU")]
public string Subtext {
get;
set;
}
= "BY 0XF";
[JsonProperty(PropertyName = "Button to hook (X | F | OFF)")]
[JsonConverter(typeof(Newtonsoft.Json.Converters.StringEnumConverter))]
public ButtonHook ButtonToHook {
get;
set;
}
= ButtonHook.X;
[JsonProperty(PropertyName = "Chat command to show admin menu")]
public string ChatCommand {
get;
set;
}
= "admin";
[JsonProperty(PropertyName = "Theme")]
[JsonConverter(typeof(ThemeConverter))]
public Theme Theme {
get => Themes.CurrentTheme;
set => Themes.CurrentTheme = value;
}
[JsonProperty(PropertyName = "Custom Quick Buttons")]
public List<QMCustomButton> CustomQuickButtons {
get;
set;
}
= new List<QMCustomButton>();
[JsonProperty(PropertyName = "User Custom Buttons")]
public List<UserInfoCustomButton> UserInfoCustomButtons {
get;
set;
}
= new List<UserInfoCustomButton>();
[JsonIgnore]
public Dictionary<int, string[]> HashedCommands {
get;
set;
}
= new Dictionary<int, string[]>();
public static Configuration DefaultConfig() {
return new Configuration() {
CustomQuickButtons = new List<QMCustomButton> {
new QMCustomButton {
Label = "Custom Button", Commands = new[] {
"chat.say \"/custom\"", "adminmenu openinfopanel custom_buttons"
}
, Permission = "fullaccess", Style = new ButtonStyle() {
BackgroundColor = "1 0.2 0.2 0.6", TextColor = "0.95 0.6 0 1",
}
, Position = new int[2] {
0, 4
}
}
}
, UserInfoCustomButtons = new List<UserInfoCustomButton> {
new UserInfoCustomButton {
Label = "Custom Button", Commands = new[] {
"chat.say \"/custom {steamID}\"", "adminmenu openinfopanel custom_buttons"
}
, Permission = "fullaccess", Position = new int[2] {
9, 0
}
}
}
}
;
}
}
public class ConnectionData {
public Connection connection;
public MainMenu currentMainMenu;
public Panel currentPanel;
public Sidebar currentSidebar;
public Content currentContent;
public Dictionary<string, object> userData;
public ConnectionData(BasePlayer player) : this(player.Connection) {
}
public ConnectionData(Connection connection) {
this.connection = connection;
this.userData = new Dictionary<string, object>() {
{
"userId", connection.userid
}
, {
"userinfo.lastuserid", connection.userid
}
, {
"backcommand", null
}
,
}
;
this.UI = new ConnectionUI(this);
try {
Init();
}
catch (Exception ex) {
UnityEngine.Debug.LogException(ex);
}
}
public ConnectionUI UI {
get;
private set;
}
public bool IsAdminMenuDisplay {
get;
set;
}
public bool IsDestroyed {
get;
set;
}
public void Init() {
UI.RenderMainMenu(Instance.mainMenu);
this.currentMainMenu = Instance.mainMenu;
}
public void ShowAdminMenu() {
UI.ShowAdminMenu();
IsAdminMenuDisplay = true;
}
public void HideAdminMenu() {
UI.HideAdminMenu();
IsAdminMenuDisplay = false;
}
public ConnectionData OpenPanel(string panelName) {
if (panelList.TryGetValue(panelName, out Panel panel)) {
if (currentPanel == panel) return null;
if (currentContent != null) currentContent.RestoreUserData(userData);
currentContent = null;
if (currentPanel != null) currentPanel.OnClose(this);
currentPanel = panel;
currentSidebar = currentPanel.Sidebar;
UI.RenderPanel(currentPanel);
currentPanel.OnOpen(this);
Content defaultPanelContent = panel.DefaultContent;
if (defaultPanelContent != null) ShowPanelContent(defaultPanelContent);
if (panel.Sidebar != null && panel.Sidebar.AutoActivateCategoryButtonIndex.HasValue) Instance.HandleCommand(connection, "uipanel.sidebar.button_pressed", panel.Sidebar.AutoActivateCategoryButtonIndex.Value.ToString(), panel.Sidebar.CategoryButtons.GetAllowedButtons(connection).Count().ToString());
return this;
}
else {
Instance.PrintError($"Panel with name \"{panelName}\" not founded!");
return null;
}
}
public void SetSidebar(Sidebar sidebar) {
bool needsChangeContentSize = (currentSidebar != sidebar);
currentSidebar = sidebar;
CUI.Root root = new CUI.Root("AdminMenu_Panel");
if (sidebar != null) UI.AddSidebar(root, sidebar);
else root.Add(new CUI.Element {
DestroyUi = "AdminMenu_Panel_Sidebar"
}
);
root.Render(connection);
if (needsChangeContentSize) {
CUI.Root updateRoot = new CUI.Root();
updateRoot.Add(new CUI.Element {
Components = {
new CuiRectTransformComponent {
OffsetMin = $"{(sidebar != null ? 250 : 0)} 0",
}
}
, Name = "AdminMenu_Panel_Content"
}
);
updateRoot.Update(connection);
}
}
public void ShowPanelContent(Content content) {
if (content == null) {
CUI.Root root = new CUI.Root();
root.Add(new CUI.Element {
DestroyUi = "AdminMenu_Panel_TempContent"
}
);
root.Render(connection);
return;
}
if (currentContent != null) currentContent.RestoreUserData(userData);
currentContent = content;
currentContent.LoadDefaultUserData(userData);
UI.RenderContent(content);
}
public void ShowPanelContent(string contentId) {
ShowPanelContent(currentPanel.TryGetContent(contentId));
}
public void Dispose() {
all.Remove(connection);
}
public static Dictionary<Connection, ConnectionData> all = new Dictionary<Connection, ConnectionData>();
public static ConnectionData Get(Connection connection) {
if (connection == null) return null;
ConnectionData data;
if (all.TryGetValue(connection, out data)) return data;
return null;
}
public static ConnectionData Get(BasePlayer player) {
return Get(player.Connection);
}
public static ConnectionData GetOrCreate(Connection connection) {
if (connection == null) return null;
ConnectionData data = Get(connection);
if (data == null) data = all[connection] = new ConnectionData(connection);
return data;
}
public static ConnectionData GetOrCreate(BasePlayer player) {
return GetOrCreate(player.Connection);
}
}
public class ConnectionUI {
Connection connection;
ConnectionData connectionData;
public ConnectionUI(ConnectionData connectionData) {
this.connectionData = connectionData;
this.connection = connectionData.connection;
}
public void ShowAdminMenu() {
CUI.Root root = new CUI.Root();
root.Add(new CUI.Element {
Components = {
new CuiRectTransformComponent {
AnchorMin = "0 0.00001", AnchorMax = "1 1.00001"
}
}
, Name = "AdminMenu", Update = true
}
);
root.Add(new CUI.Element {
Components = {
new CuiNeedsCursorComponent()
}
, Parent = "AdminMenu", Name = "AdminMenu_Cursor"
}
);
root.Render(connection);
}
public void HideAdminMenu() {
CUI.Root root = new CUI.Root();
root.Add(new CUI.Element {
Components = {
new CuiRectTransformComponent {
AnchorMin = "1000 1000", AnchorMax = "1001 1001"
}
}
, DestroyUi = "AdminMenu_Cursor", Name = "AdminMenu", Update = true
}
);
root.Render(connection);
}
public void DestroyAdminMenu() {
CuiHelper.DestroyUi(connection.player as BasePlayer, "AdminMenu");
connectionData.IsDestroyed = true;
}
public void DestroyAll() {
DestroyAdminMenu();
CuiHelper.DestroyUi(connection.player as BasePlayer, "AdminMenu_OpenButton");
}
public void AddSidebar(CUI.Element element, Sidebar sidebar) {
if (sidebar == null) return;
var sidebarPanel = element.AddPanel(color : Themes.CurrentTheme.GetColorString(Theme.KeyCollection.PANEL_SIDEBAR_BACKGROUND), material : "assets/content/ui/uibackgroundblur-ingamemenu.mat", imageType : Image.Type.Tiled, anchorMin : "0 0", anchorMax : "0 1", offsetMin : "0 0", offsetMax : "250 0", name : "AdminMenu_Panel_Sidebar").AddDestroySelfAttribute();
sidebarPanel.AddPanel(color : "0.217 0.217 0.217 0.796", sprite : "assets/content/ui/ui.background.transparent.linear.psd", material : "assets/content/ui/namefontmaterial.mat", anchorMin : "0 0", anchorMax : "1 1");
IEnumerable<CategoryButton> categoryButtons = sidebar.CategoryButtons.GetAllowedButtons(connection);
if (categoryButtons != null) {
int categoryButtonsCount = categoryButtons.Count();
if (categoryButtonsCount == 0) return;
var sidebarButtonGroup = sidebarPanel.AddContainer(anchorMin : "0 0.5", anchorMax : "1 0.5", offsetMin : $"0 -{categoryButtonsCount * 48 / 2}", offsetMax : $"0 {categoryButtonsCount * 48 / 2}");
for (int i = 0; i < categoryButtonsCount; i++) {
CategoryButton categoryButton = categoryButtons.ElementAt(i);
sidebarButtonGroup.AddButton(command : $"adminmenu uipanel.sidebar.button_pressed {i} {categoryButtonsCount}", color : $"0 0 0 0", anchorMin : "0 1", anchorMax : "1 1", offsetMin : $"16 -{(i + 1) * 48}", offsetMax : $"0 -{i * 48}", name : $"UIPanel_SideBar_Button{i}").AddText(text : categoryButton.Label.Localize(connection), color : "0.969 0.922 0.882 1", font : CUI.Font.RobotoCondensedBold, fontSize : categoryButton.FontSize, align : TextAnchor.MiddleRight, offsetMin : "16 0", offsetMax : "-16 0");
}
}
}
private void AddNavButtons(CUI.Element element, MainMenu mainMenu) {
IEnumerable<Button> navButtons = mainMenu.NavButtons.GetAllowedButtons(connection);
int navButtonsCount = navButtons.Count();
var navButtonGroup = element.AddContainer(anchorMin : "0 0", anchorMax : "1 0", offsetMin : "64 64", offsetMax : $"0 {64 + navButtonsCount * 42}", name : "Navigation ButtonGroup").AddDestroySelfAttribute();
for (int i = 0; i < navButtonsCount; i++) {
Button navButton = navButtons.ElementAtOrDefault(i);
if (navButton == null) continue;
navButtonGroup.AddButton(command : navButton.IsHidden(connectionData) ? null : $"adminmenu navigation.button_pressed {i} {navButtonsCount}", anchorMin : "0 1", anchorMax : "1 1", offsetMin : $"0 -{(i + 1) * 42}", offsetMax : $"0 -{i * 42}").AddText(text : navButton.Label.Localize(connection).ToUpper(), color : $"0.969 0.922 0.882 {(navButton.IsHidden(connectionData) ? 0 : (navButton.IsPressed(connectionData) ? 1 : 0.180f))}", fontSize : 28, font : CUI.Font.RobotoCondensedBold, align : TextAnchor.LowerLeft, overflow : VerticalWrapMode.Truncate, offsetMin : "10 5", name : $"NavigationButtonText{i}");
}
}
public void UpdateNavButtons(MainMenu mainMenu) {
CUI.Root root = new CUI.Root("AdminMenu_Navigation");
AddNavButtons(root, mainMenu);
root.Render(connection);
}
public void RenderOverlayOpenButton() {
CUI.Root root = new CUI.Root("Overlay");
root.AddButton(command : "adminmenu", color : "0.969 0.922 0.882 0.035", material : "assets/icons/greyout.mat", anchorMin : "0 0", anchorMax : "0 0", offsetMin : "0 0", offsetMax : "100 30", name : "AdminMenu_OpenButton").AddDestroySelfAttribute().AddText(text : "ADMIN MENU", color : "0.969 0.922 0.882 0.45", font : CUI.Font.RobotoCondensedBold, fontSize : 14, align : TextAnchor.MiddleCenter);
root.Render(connection);
}
public void RenderMainMenu(MainMenu mainMenu) {
if (mainMenu == null) return;
CUI.Root root = new CUI.Root("Overlay");
var container = root.AddPanel(color : "0.169 0.162 0.143 1", material : "assets/content/ui/uibackgroundblur-mainmenu.mat", imageType : Image.Type.Tiled, anchorMin : "1000 1000", anchorMax : "1001 1001", name : "AdminMenu").AddDestroySelfAttribute();
container.AddPanel(color : "0.301 0.283 0.235 1", sprite : "assets/content/ui/ui.background.transparent.radial.psd", material : "assets/content/ui/namefontmaterial.mat", anchorMin : "0 0", anchorMax : "1 1");
container.AddPanel(color : "0.169 0.162 0.143 0.384", sprite : "assets/content/ui/ui.background.transparent.radial.psd", material : "assets/content/ui/namefontmaterial.mat", anchorMin : "0 0", anchorMax : "1 1");
var navigation = container.AddContainer(anchorMin : "0 0", anchorMax : "0 1", offsetMin : "0 0", offsetMax : "350 0", name : "AdminMenu_Navigation");
var homeButton = navigation.AddContainer( //command: "adminmenu homebutton",
anchorMin : "0 1", anchorMax : "1 1", offsetMin : $"64 -{102f + 32}", offsetMax : "0 -32");
homeButton.AddImage(content : ADMINMENU_IMAGECRC, color : "0.811 0.811 0.811 1", material : "assets/content/ui/namefontmaterial.mat", anchorMin : "0 0", anchorMax : "0 1", offsetMax : $"146.4 0");
homeButton.AddText(text : config.Subtext, color : "0.824 0.824 0.824 1", font : CUI.Font.RobotoCondensedBold, fontSize : 16, anchorMin : "0 0", anchorMax : "0 0", offsetMin : "0 -35", offsetMax : "146.4 -10");
AddNavButtons(navigation, mainMenu);
var body = container.AddContainer(anchorMin : "0 0", anchorMax : "1 1", offsetMin : "350 0", offsetMax : "-64 0", name : "AdminMenu_Body");
var right = container.AddContainer(anchorMin : "1 0", anchorMax : "1 1", offsetMin : "-64 0", offsetMax : "0 0");
root.Render(connection);
connectionData.IsDestroyed = false;
}
public void RenderPanel(Panel panel) {
if (panel == null) return;
CUI.Root root = new CUI.Root("AdminMenu_Body");
var container = root.AddContainer(anchorMin : "0 0", anchorMax : "1 1", name : "AdminMenu_Panel").AddDestroySelfAttribute();
Sidebar sidebar = panel.Sidebar;
if (sidebar != null) AddSidebar(container, sidebar);
CUI.Element panelBackground = container.AddContainer(anchorMin : "0 0", anchorMax : "1 1", offsetMin : $"{(sidebar != null ? 250 : 0)} 0", offsetMax : "0 0", name : "AdminMenu_Panel_Content");
if (true) {
panelBackground = panelBackground.AddPanel(color : "1 1 1 1", material : "assets/content/ui/menuui/mainmenu.panel.mat", imageType : Image.Type.Tiled);
}
root.Render(connection);
}
public void RenderContent(Content content) {
if (content == null) return;
CUI.Root root = new CUI.Root("AdminMenu_Panel_Content");
var container = root.AddContainer(name : "AdminMenu_Panel_TempContent").AddDestroySelfAttribute();
root.Render(connection);
content.Render(connectionData);
}
}
public static class Extensions {
public static string ToCuiString(Color color) {
return string.Format("{0} {1} {2} {3}", new object[] {
color.r, color.g, color.b, color.a
}
);
}
}
public class Label {
private static readonly Regex richTextRegex = new Regex(@"<[^>]*>");
string label;
string langKey;
public Label(string label) {
this.label = label;
if (!string.IsNullOrEmpty(label)) {
this.langKey = richTextRegex.Replace(label.ToPrintable(), string.Empty).Trim();
if (!Instance.defaultLang.ContainsKey(this.langKey)) Instance.defaultLang.Add(this.langKey, label);
}
}
public override string ToString() {
return label;
}
public string Localize(string userId) {
return this.langKey != null ? Instance.lang.GetMessage(this.langKey, Instance, userId) : this.label;
}
public string Localize(Connection connection) {
return Localize(connection.userid.ToString());
}
}
public class MainMenu {
public ButtonArray NavButtons {
get;
set;
}
}
public class Panel {
public virtual Sidebar Sidebar {
get;
set;
}
public virtual Dictionary<string, Content> Content {
get;
set;
}
public Content DefaultContent {
get => TryGetContent("default");
}
public Content TryGetContent(string id) {
if (Content == null) return null;
if (Content.TryGetValue(id, out Content content)) return content;
return null;
}
public virtual void OnOpen(ConnectionData connectionData) {
connectionData.UI.UpdateNavButtons(connectionData.currentMainMenu);
}
public virtual void OnClose(ConnectionData connectionData) {
connectionData.userData["backcommand"] = null;
}
}
public class UserInfoPanel : Panel {
}
public class PermissionPanel : Panel {
public override Sidebar Sidebar {
get => SidebarCollection.TryGet("pluginpermissions.0");
}
public override void OnClose(ConnectionData connectionData) {
connectionData.userData["backcommand"] = null;
}
}
public class Sidebar {
public ButtonArray<CategoryButton> CategoryButtons {
get;
set;
}
public int? AutoActivateCategoryButtonIndex {
get;
set;
}
= 0;
}
public class SteamInfo {
public string Location {
get;
set;
}
public string[] Avatars {
get;
set;
}
public string RegistrationDate {
get;
set;
}
public string RustHours {
get;
set;
}
public override string ToString() {
return string.Join(", ", Location, RegistrationDate, RustHours);
}
}
public class CUI {
private static readonly string[] FontNames = new string[] {
"RobotoCondensed-Bold.ttf", "RobotoCondensed-Regular.ttf", "RobotoMono-Regular.ttf", "DroidSansMono.ttf", "PermanentMarker.ttf"
}
;
public enum Font {
RobotoCondensedBold, RobotoCondensedRegular, RobotoMonoRegular, DroidSansMono, PermanentMarker
}
public static void AddUI(Connection connection, string json) {
CommunityEntity.ServerInstance.ClientRPCEx<string>(new SendInfo {
connection = connection
}
, null, "AddUI", json);
}
[JsonObject(MemberSerialization.OptIn)]
public class Element : CuiElement {
public string elementName;
public new string Name {
get => elementName;
set {
if (value == null) return;
elementName = value;
}
}
public Element ParentElement {
get;
set;
}
public virtual List<Element> Container => ParentElement?.Container;
[JsonProperty("name")]
public string JsonName {
get {
if (Name == null) SetupDefaultName();
return Name;
}
}
public Element() {
}
public Element(Element parent) {
AssignParent(parent);
}
public void SetupDefaultName() {
Name = Guid.NewGuid().ToString().MurmurHashSigned().ToString();
}
public void AssignParent(Element parent) {
if (parent == null) return;
ParentElement = parent;
Parent = ParentElement.Name;
Name = Parent.MurmurHashSigned().ToString();
}
public Element AddDestroySelfAttribute() {
this.DestroyUi = this.Name;
return this;
}
public Element Add(Element element) {
if (element.Name == null && element.ParentElement == null) element.AssignParent(this);
Container.Add(element);
return element;
}
public Element AddText(string text = "Text", string color = "1 1 1 1", Font font = Font.RobotoCondensedRegular, int fontSize = 14, TextAnchor align = TextAnchor.UpperLeft, VerticalWrapMode overflow = VerticalWrapMode.Overflow, string anchorMin = "0 0", string anchorMax = "1 1", string offsetMin = "0 0", string offsetMax = "0 0", float fadeIn = 0f, float fadeOut = 0f, string name = null) {
return Add(new Element(this) {
Components = {
new CuiTextComponent {
Text = text, Color = color, Font = FontNames[(int)font], VerticalOverflow = overflow, FontSize = fontSize, Align = align, FadeIn = fadeIn
}
, new CuiRectTransformComponent() {
AnchorMin = anchorMin, AnchorMax = anchorMax, OffsetMin = offsetMin, OffsetMax = offsetMax
}
,
}
, Name = name, FadeOut = fadeOut
}
);
}
public Element AddOutlinedText(string text = "Text", string color = "1 1 1 1", Font font = Font.RobotoCondensedRegular, int fontSize = 14, TextAnchor align = TextAnchor.UpperLeft, VerticalWrapMode overflow = VerticalWrapMode.Overflow, string outlineColor = "0 0 0 1", float outlineWidth = 1, string anchorMin = "0 0", string anchorMax = "1 1", string offsetMin = "0 0", string offsetMax = "0 0", float fadeIn = 0f, float fadeOut = 0f, string name = null) {
return Add(new Element(this) {
Components = {
new CuiTextComponent {
Text = text, Color = color, Font = FontNames[(int)font], VerticalOverflow = overflow, FontSize = fontSize, Align = align, FadeIn = fadeIn
}
, new CuiOutlineComponent {
Color = outlineColor, Distance = $"{outlineWidth} {outlineWidth}"
}
, new CuiRectTransformComponent() {
AnchorMin = anchorMin, AnchorMax = anchorMax, OffsetMin = offsetMin, OffsetMax = offsetMax
}
,
}
, FadeOut = fadeOut, Name = name
}
);
}
public Element AddInputfield(string command, string text = "Enter text here...", string color = "1 1 1 1", Font font = Font.RobotoCondensedRegular, int fontSize = 14, TextAnchor align = TextAnchor.UpperLeft, InputField.LineType lineType = InputField.LineType.SingleLine, string anchorMin = "0 0", string anchorMax = "1 1", string offsetMin = "0 0", string offsetMax = "0 0", bool @readonly = false, bool needsKeyboard = true, bool autoFocus = false, bool isPassword = false, int charsLimit = 0, string name = null) {
return Add(new Element(this) {
Components = {
new CuiInputFieldComponent {
Text = text, Color = color, Font = FontNames[(int)font], FontSize = fontSize, Align = align, LineType = lineType, Autofocus = autoFocus, Command = command, ReadOnly = @readonly, IsPassword = isPassword, CharsLimit = charsLimit, NeedsKeyboard = needsKeyboard,
}
, new CuiRectTransformComponent() {
AnchorMin = anchorMin, AnchorMax = anchorMax, OffsetMin = offsetMin, OffsetMax = offsetMax
}
,
}
, Name = name
}
);
}
public Element AddPanel(string color = "1 1 1 1", string sprite = "assets/content/ui/ui.background.tile.psd", string material = "assets/content/ui/namefontmaterial.mat", UnityEngine.UI.Image.Type imageType = UnityEngine.UI.Image.Type.Simple, string anchorMin = "0 0", string anchorMax = "1 1", string offsetMin = "0 0", string offsetMax = "0 0", float fadeIn = 0f, float fadeOut = 0f, bool cursorEnabled = false, bool keyboardEnabled = false, string name = null) {
Element element = new Element(this) {
Components = {
new CuiRectTransformComponent {
AnchorMin = anchorMin, AnchorMax = anchorMax, OffsetMin = offsetMin, OffsetMax = offsetMax,
}
, new CuiImageComponent {
Color = color, Sprite = sprite, Material = material, ImageType = imageType, FadeIn = fadeIn,
}
}
, Name = name, FadeOut = fadeOut
}
;
if (cursorEnabled) element.Components.Add(new CuiNeedsCursorComponent());
if (keyboardEnabled) element.Components.Add(new CuiNeedsKeyboardComponent());
return Add(element);
}
public Element AddButton(string command, string close = null, string color = "0 0 0 0", string sprite = "assets/content/ui/ui.background.tile.psd", string material = "assets/icons/iconmaterial.mat", UnityEngine.UI.Image.Type imageType = UnityEngine.UI.Image.Type.Simple, string anchorMin = "0 0", string anchorMax = "1 1", string offsetMin = "0 0", string offsetMax = "0 0", float fadeIn = 0f, float fadeOut = 0f, string name = null) {
return Add(new Element(this) {
Components = {
new CuiRectTransformComponent {
AnchorMin = anchorMin, AnchorMax = anchorMax, OffsetMin = offsetMin, OffsetMax = offsetMax,
}
, new CuiButtonComponent {
Close = close, Command = command, Color = color, Sprite = sprite, Material = material, ImageType = imageType, FadeIn = fadeIn,
}
}
, Name = name, FadeOut = fadeOut
}
);
}
public Element AddImage(string content, string color = "1 1 1 1", string material = "assets/content/ui/namefontmaterial.mat", string anchorMin = "0 0", string anchorMax = "1 1", string offsetMin = "0 0", string offsetMax = "0 0", float fadeIn = 0f, float fadeOut = 0f, string name = null) {
Element element = new Element(this) {
Components = {
new CuiRectTransformComponent() {
AnchorMin = anchorMin, AnchorMax = anchorMax, OffsetMin = offsetMin, OffsetMax = offsetMax
}
,
}
, Name = name, FadeOut = fadeOut
}
;
if (!string.IsNullOrEmpty(content)) {
CuiRawImageComponent rawImageComponent = new CuiRawImageComponent() {
Color = co
// ... [Code preview truncated due to length. Full source in attached file] ...