C#:
using Oxide.Core.Plugins;
using Oxide.Game.Rust.Cui;
using UnityEngine;
using System.Collections.Generic;
using Newtonsoft.Json;
namespace Oxide.Plugins
{
[Info("MenuSystem", "Chibubrik", "1.0.1")]
class MenuSystem : RustPlugin
{
#region Вар
private string Layer = "Menu_UI";
[PluginReference] Plugin ImageLibrary, GameStoresRUST, CaseSystem, WipeCalendar, WipeBlock, SoReport, SkillSystem, InfoMenu, TopChat, PassSystem;
Dictionary<ulong, string> ActiveButton = new Dictionary<ulong, string>();
Dictionary<ulong, string> ActiveButton2 = new Dictionary<ulong, string>();
Dictionary<ulong, string> ActiveButton3 = new Dictionary<ulong, string>();
//Управляет высотой пункта меню
readonly float HEIGHT_MENU_ELEMENT = 0.118f;
Dictionary<string, string> Command = new Dictionary<string, string>()
{
["ГЛАВНАЯ"] = "info",
["-"] = "-",
["ВИКИПЕДИЯ"] = "wiki",
["КОРЗИНА"] = "store",
["КЕЙСЫ"] = "case",
["КАЛЕНДАРЬ"] = "cal",
["ВАЙПБЛОК"] = "block",
["РЕПОРТ"] = "report",
["СКИЛЫ"] = "skill",
["НАСТРОЙКИ"] = "settings",
["БАТЛПАСС"] = "pass"
};
Dictionary<string, string> Set = new Dictionary<string, string>()
{
["ЧАТ"] = "chat",
["Настройка1"] = "set1",
["Настройка 2"] = "set2",
["Настройка 3"] = "set3",
["Настройка 4"] = "set4",
["Телепортация"] = "tpset"
};
void SettingsActions(BasePlayer player, string name){
switch(name){
case "chat":TopChat.Call("InitializeInterface", player);break;
case "tpset":if (plugins.Find("Detonator")) plugins.Find("Detonator").Call("InitializeInterface", player);break;
case "set1":InfoMenu?.Call("CreateTab", player, "settings", 0);break;
case "set2":InfoMenu?.Call("CreateTab", player, "settings", 1);break;
case "set3":InfoMenu?.Call("CreateTab", player, "settings", 2);break;
case "set4":InfoMenu?.Call("CreateTab", player, "settings", 3);break;
}
}
#endregion
#region Хуки
void OnServerInitialized()
{
ImageLibrary.Call("AddImage", "https://imgur.com/C2g6QoA.png", "Background");
}
#endregion
#region Команды
[ChatCommand("menu")]
void ChatMenu(BasePlayer player) => MenuUI(player, "info");
[ChatCommand("store")]
void ChatStore(BasePlayer player) => MenuUI(player, "store");
[ChatCommand("info")]
void ChatInfo(BasePlayer player) => MenuUI(player, "info");
[ChatCommand("case")]
void ChatCase(BasePlayer player) => MenuUI(player, "case");
[ChatCommand("wipe")]
void ChatCal(BasePlayer player) => MenuUI(player, "cal");
[ChatCommand("block")]
void ChatBlock(BasePlayer player) => MenuUI(player, "block");
[ChatCommand("report")]
void ChatReport(BasePlayer player) => MenuUI(player, "report");
[ChatCommand("skill")]
void ChatSkill(BasePlayer player) => MenuUI(player, "skill");
[ChatCommand("settings")]
void ChatSet(BasePlayer player) => MenuUI(player, "settings");
[ChatCommand("pass")]
void ChaPass(BasePlayer player) => MenuUI(player, "pass");
[ConsoleCommand("closemenusystem")]
void ConsoleCloseMenu(ConsoleSystem.Arg args)
{
var player = args.Player();
DestroyUI(player);
CuiHelper.DestroyUi(player, Layer);
}
[ConsoleCommand("menu")]
void ConsoleMenu(ConsoleSystem.Arg args)
{
var player = args.Player();
ActiveButton[player.userID] = args.Args[0];
UI(player, args.Args[0]);
ButtonUI(player);
}
[ConsoleCommand("settings")]
void ConsoleSettings(ConsoleSystem.Arg args)
{
var player = args.Player();
SettingsUI(player);
}
[ConsoleCommand("set")]
void ConsoleSet(ConsoleSystem.Arg args)
{
var player = args.Player();
if (args.Args==null || args.Args.Length<1) return;
ActiveButton3[player.userID] = args.Args[0];
SettingsUI(player, args.Args[0]);
}
#endregion
#region Интерфейс
void MenuUI(BasePlayer player, string name = "info")
{
ActiveButton[player.userID] = name;
ActiveButton3[player.userID] = "chat";
CuiHelper.DestroyUi(player, Layer);
var container = new CuiElementContainer();
container.Add(new CuiPanel
{
CursorEnabled = true,
RectTransform = { AnchorMin = "0 0", AnchorMax = "1 1", OffsetMax = "0 0" },
Image = { Color = "0 0 0 0.9" },
}, "Overlay", Layer);
container.Add(new CuiElement
{
Parent = Layer,
Components =
{
new CuiRawImageComponent { Png = (string) ImageLibrary.Call("GetImage", "Background") },
new CuiRectTransformComponent { AnchorMin = "0 0", AnchorMax = "1 1", OffsetMax = "0 0" }
}
});
container.Add(new CuiPanel
{
RectTransform = { AnchorMin = "0.05 0.8", AnchorMax = "0.24 0.88", OffsetMax = "0 0" },
Image = { Color = "0 0 0 0" }
}, Layer, "Logo");
container.Add(new CuiElement
{
Parent = "Logo",
Components =
{
new CuiImageComponent { Sprite = "assets/content/ui/menuui/rustlogo-normal-transparent.png" },
new CuiRectTransformComponent { AnchorMin = "0 0", AnchorMax = "1 1", OffsetMax = "0 0" }
}
});
container.Add(new CuiPanel
{
RectTransform = { AnchorMin = "0.068 0.17", AnchorMax = "0.2 0.73", OffsetMax = "0 0" },
Image = { Color = "0 0 0 0" }
}, Layer, "Button");
container.Add(new CuiButton
{
RectTransform = { AnchorMin = "0.945 0.91", AnchorMax = $"1 1", OffsetMax = "0 0" },
Button = { Color = "0 0 0 0", Close = Layer },
Text = { Text = $"✖", Color = "1 1 1 0.5", Align = TextAnchor.MiddleCenter, FontSize = 50, Font = "robotocondensed-bold.ttf" }
}, Layer);
CuiHelper.AddUi(player, container);
ButtonUI(player);
UI(player, name);
}
void UI(BasePlayer player, string name)
{
DestroyUI(player);
if (name == "info")
InfoMenu?.Call("CreateMenu", player, "main");
if (name == "wiki")
InfoMenu?.Call("CreateMenu", player, "wiki");
if (name == "store")
GameStoresRUST?.Call("InitializeStore", player);
if (name == "case")
CaseSystem?.Call("CaseUI", player);
if (name == "cal")
WipeCalendar.Call("CreateGui", player);
if (name == "block")
WipeBlock.Call("DrawBlockGUI", player);
if (name == "report")
SoReport.Call("StartUi", player);
if (name == "skill")
SkillSystem.Call("SkillUI", player);
if (name == "settings")
SettingsUI(player);
if (name == "pass")
PassSystem.Call("PassUI", player);
}
void ButtonUI(BasePlayer player)
{
CuiHelper.DestroyUi(player, "Command");
var container = new CuiElementContainer();
container.Add(new CuiPanel
{
RectTransform = { AnchorMin = "0 0.13", AnchorMax = "1 1", OffsetMax = "0 0" },
Image = { Color = "0 0 0 0" }
}, "Button", "Command");
float width = 1f, height = HEIGHT_MENU_ELEMENT, startxBox = 0f, startyBox = 0.995f - height, xmin = startxBox, ymin = startyBox;
foreach (var check in Command)
{
if (check.Key!="-"){
var color = ActiveButton[player.userID] == check.Value ? "1 1 1 1" : "1 1 1 0.3";
container.Add(new CuiButton
{
RectTransform = { AnchorMin = $"{xmin} {ymin}", AnchorMax = $"{xmin + width} {ymin + height * 1}", OffsetMin = "0 1", OffsetMax = "0 -1" },
Button = { Color = "0 0 0 0", Command = $"menu {check.Value}" },
Text = { Text = check.Key, Color = color, Align = TextAnchor.MiddleLeft, FontSize = 25, Font = "robotocondensed-bold.ttf" }
}, "Command");
xmin += width;
if (xmin + width >= 1)
{
xmin = startxBox;
ymin -= height;
}
}else{
ymin -= (float)(height/3);
}
}
CuiHelper.AddUi(player, container);
}
void SettingsUI(BasePlayer player, string name = "chat")
{
if (player==null) return;
if (!ActiveButton3.ContainsKey(player.userID)) return;
CuiHelper.DestroyUi(player, "Settingsmain");
CuiHelper.DestroyUi(player, "UI_SettingsLayer.WINDOW_FRAME");
CuiHelper.DestroyUi(player, "InfoMenu_base");
CuiHelper.DestroyUi(player, "InfoMenu_main");
CuiHelper.DestroyUi(player, "InfoMenu_content");
var container = new CuiElementContainer();
container.Add(new CuiPanel
{
RectTransform = { AnchorMin = "0.276 0", AnchorMax = "0.945 1", OffsetMax = "0 0" },
Image = { Color = "0.117 0.121 0.109 0" }
}, Layer, "Settingsmain");
container.Add(new CuiPanel
{
RectTransform = { AnchorMin = "0 0", AnchorMax = "0.289 1", OffsetMax = "0 0" },
Image = { Color = "0.549 0.270 0.215 0.7", Material = "" }
}, "Settingsmain", "Left");
container.Add(new CuiLabel
{
RectTransform = { AnchorMin = "0.09 0.91", AnchorMax = $"1 1", OffsetMax = "0 0" },
Text = { Text = $"НАСТРОЙКИ", Color = "0.929 0.882 0.847 0.8", Align = TextAnchor.MiddleLeft, FontSize = 33, Font = "robotocondensed-bold.ttf" }
}, "Left");
float width = 1f, height = 0.06f, startxBox = 0f, startyBox = 0.6f - height, xmin = startxBox, ymin = startyBox;
foreach (var check in Set)
{
var color = ActiveButton3[player.userID] == check.Value ? "0.149 0.145 0.137 0.8" : "0 0 0 0";
container.Add(new CuiButton
{
RectTransform = { AnchorMin = $"{xmin} {ymin}", AnchorMax = $"{xmin + width} {ymin + height * 1}", OffsetMin = "0 1", OffsetMax = "0 -1" },
Button = { Color = color, Command = $"set {check.Value}" },
Text = { Text = $"{check.Key} ", Color = "1 1 1 0.8", Align = TextAnchor.MiddleRight, FontSize = 18, Font = "robotocondensed-bold.ttf" }
}, "Left");
xmin += width;
if (xmin + width >= 1)
{
xmin = startxBox;
ymin -= height;
}
}
CuiHelper.AddUi(player, container);
SettingsActions(player,name);
}
void MapUI(BasePlayer player) {
player.Command("map.open");
player.Command("map_settings");
}
#endregion
#region Хелпер
void DestroyUI(BasePlayer player)
{
CuiHelper.DestroyUi(player, "Info");
CuiHelper.DestroyUi(player, "Calendar");
CuiHelper.DestroyUi(player, "Block");
CuiHelper.DestroyUi(player, "Skill_UI");
CuiHelper.DestroyUi(player, "ReportMain");
CuiHelper.DestroyUi(player, "settings");
CuiHelper.DestroyUi(player, "Settingsmain");
CuiHelper.DestroyUi(player, "UI_SettingsLayer.WINDOW_FRAME");
CuiHelper.DestroyUi(player, "Pass");
CuiHelper.DestroyUi(player, "UI_GameStoresRUST_Store");
CuiHelper.DestroyUi(player, "Case_UI");
CuiHelper.DestroyUi(player, "ReportBMod");
CuiHelper.DestroyUi(player, "InfoMenu_base");
CuiHelper.DestroyUi(player, "InfoMenu_main");
CuiHelper.DestroyUi(player, "InfoMenu_content");
}
#endregion
}
}