C#:
// Все права принадлежат дискорд сообществу https://discord.gg/VgNHPpNrz6
//#define DEBUG
using Oxide.Core.Plugins;
using Oxide.Game.Rust.Cui;
using System;
using System.Collections.Generic;
using UnityEngine;
namespace Oxide.Plugins {
[Info("GUICreator", "kOhm", "1.4.1")]
[Description("API Plugin for centralized GUI creation and management")]
public partial class GUICreator : RustPlugin {
[PluginReference]
private Plugin ImageLibrary;
private static GUICreator PluginInstance = null;
public GUICreator() {
PluginInstance = this;
}
public const int offsetResX = 1280;
public const int offsetResY = 720;
}
}
namespace Oxide.Plugins {
using Oxide.Core.Plugins;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using UnityEngine;
public partial class GUICreator {
public enum gametipType {
gametip, warning, error
}
public void customGameTip(BasePlayer player, string text, float duration = 0, gametipType type = gametipType.gametip) {
GuiTracker.getGuiTracker(player).destroyGui(this, "gameTip");
GuiContainer container = new GuiContainer(this, "gameTip");
switch (type) {
case gametipType.gametip : //container.addImage("gametip", new Rectangle(375, 844, 1170, 58, 1920, 1080, true), "bgTex", GuiContainer.Layer.overall, new GuiColor("#25639BF0"), 0.5f, 1);
container.addPlainPanel("gametip", new Rectangle(375, 844, 1170, 58, 1920, 1080, true), GuiContainer.Layer.overall, new GuiColor("#25639BF4"), 0.5f, 1, GuiContainer.Blur.greyout);
container.addText("gametip_txt", new Rectangle(433, 844, 1112, 58, 1920, 1080, true), GuiContainer.Layer.overall, new GuiText(text, 20, new GuiColor("#FFFFFFD9")), 0.5f, 1);
container.addImage("gametip_icon", new Rectangle(375, 844, 58, 58, 1920, 1080, true), "gameTipIcon", GuiContainer.Layer.overall, new GuiColor("#FFFFFFD9"), 0.5f, 1);
break;
case gametipType.warning : container.addPlainPanel("gametip", new Rectangle(375, 844, 1170, 58, 1920, 1080, true), GuiContainer.Layer.overall, new GuiColor("#DED502F0"), 0.5f, 1);
container.addText("gametip_txt", new Rectangle(433, 844, 1112, 58, 1920, 1080, true), GuiContainer.Layer.overall, new GuiText(text, 20, new GuiColor("#000000D9")), 0.5f, 1);
container.addImage("gametip_icon", new Rectangle(375, 844, 58, 58, 1920, 1080, true), "warning_alpha", GuiContainer.Layer.overall, new GuiColor("#FFFFFFD9"), 0.5f, 1);
break;
case gametipType.error : //container.addImage("gametip", new Rectangle(375, 844, 1170, 58, 1920, 1080, true), "bgTex", GuiContainer.Layer.overall, new GuiColor("#BB0000F0"), 0.5f, 1);
container.addPlainPanel("gametip", new Rectangle(375, 844, 1170, 58, 1920, 1080, true), GuiContainer.Layer.overall, new GuiColor("#BB0000F0"), 0.5f, 1, GuiContainer.Blur.greyout);
container.addText("gametip_txt", new Rectangle(433, 844, 1112, 58, 1920, 1080, true), GuiContainer.Layer.overall, new GuiText(text, 20, new GuiColor("#FFFFFFD9")), 0.5f, 1);
container.addImage("gametip_icon", new Rectangle(375, 844, 58, 58, 1920, 1080, true), "white_cross", GuiContainer.Layer.overall, new GuiColor("#FFFFFFD9"), 0.5f, 1);
break;
}
if (duration != 0) {
Timer closeTimer = timer.Once(duration, () => {
GuiTracker.getGuiTracker(player).destroyGui(this, container);
}
);
container.timers.Add(closeTimer);
}
container.display(player);
}
public void Tickbox(BasePlayer player, Plugin plugin, Rectangle parentRectangle, GuiContainer.Layer layer, string name, string parentContainer, Action<BasePlayer, string[]> onTick, Action<BasePlayer, string[]> onUntick, bool initialState = false, bool disabled = false, float fadeIn = 0, float fadeOut = 0) {
GuiContainer c = new GuiContainer(plugin, name + "_APITickbox", parentContainer);
GuiColor lightGrey = new GuiColor(0.5f, 0.5f, 0.5f, 1);
GuiColor darkGrey = new GuiColor(0.8f, 0.8f, 0.8f, 1);
if(initialState) {
Rectangle fgPos = new Rectangle(0.15f, 0.15f, 0.72f, 0.72f, 1f, 1f, true).WithParent(parentRectangle);
c.addPlainButton("bg", parentRectangle, layer, disabled ? lightGrey : GuiColor.White, fadeIn, fadeOut, callback : disabled ? null : onUntick);
c.addPlainButton("fg", fgPos, layer, disabled ? darkGrey : GuiColor.Black, fadeIn, fadeOut, callback : disabled ? null : onUntick);
}
else {
c.addPlainButton("bg", parentRectangle, layer, disabled ? lightGrey : GuiColor.White, fadeIn, fadeOut, callback : disabled ? null : onTick);
}
c.display(player);
}
public void PlayerSearch(BasePlayer player, string name, Action<BasePlayer> callback) {
if (string.IsNullOrEmpty(name)) return;
ulong id;
ulong.TryParse(name, out id);
List<BasePlayer> results = BasePlayer.allPlayerList.Where((p) => p.displayName.ToUpper().Contains(name.ToUpper()) || p.userID == id).ToList();
if(results == null || results.Count == 0) {
prompt(player, "Player search", "No players found!");
return;
}
if(results.Count == 1) {
callback(results[0]);
return;
}
Action<PlayerSummary[]> cb = (pss) => {
var help = new List<KeyValuePair<BasePlayer, PlayerSummary>>();
foreach(PlayerSummary ps in pss) {
help.Add(new KeyValuePair<BasePlayer, PlayerSummary>(results.Find(p => p.UserIDString == ps.steamid), ps));
}
SendPlayerSearchUI(player, help.ToArray(), callback);
}
;
GetSteamUserData(results.Select(p => p.userID).ToList(), cb);
}
private void SendPlayerSearchUI(BasePlayer player, KeyValuePair<BasePlayer, PlayerSummary>[] results, Action<BasePlayer> callback, int page = 0) {
List<List<KeyValuePair<BasePlayer, PlayerSummary>>> listOfLists = SplitIntoChunks(results.ToList(), 5);
GuiContainer c = new GuiContainer(PluginInstance, "PlayerSearch");
//clickout
c.addPlainButton("close", new Rectangle(), GuiContainer.Layer.overall, new GuiColor(0, 0, 0, 0.3f), 0.1f, 0.1f, blur : GuiContainer.Blur.medium);
GuiColor black60 = new GuiColor(0, 0, 0, 0.6f);
GuiColor black40 = new GuiColor(0, 0, 0, 0.4f);
GuiColor white70 = new GuiColor(1, 1, 1, 0.7f);
//background
Rectangle bgPos = new Rectangle(710, 260, 500, 560, 1920, 1080, true);
c.addPlainPanel("background", bgPos, GuiContainer.Layer.overall, black60, 0.2f, 0, GuiContainer.Blur.medium);
c.addPlainPanel("background2", bgPos, GuiContainer.Layer.overall, black60, 0.2f, 0, GuiContainer.Blur.greyout);
//header
Rectangle headerPos = new Rectangle(710, 260, 500, 60, 1920, 1080, true);
GuiText headerText = new GuiText("Players found:", 20, white70);
c.addText("header", headerPos, GuiContainer.Layer.overall, headerText, 0.2f, 0);
//navigators
if (page != 0) {
//up
Rectangle upPos = new Rectangle(945, 325, 30, 30, 1920, 1080, true);
Action<BasePlayer, string[]> upCb = (p, a) => {
SendPlayerSearchUI(player, results, callback, page - 1);
}
;
c.addButton("upbtn", upPos, GuiContainer.Layer.overall, white70, 0.2f, 0, callback : upCb, imgName : "triangle_up");
}
if (page != listOfLists.Count - 1) {
//down
Rectangle downPos = new Rectangle(945, 785, 30, 30, 1920, 1080, true);
Action<BasePlayer, string[]> downCb = (p, a) => {
SendPlayerSearchUI(player, results, callback, page + 1);
}
;
c.addButton("downbtn", downPos, GuiContainer.Layer.overall, white70, 0.2f, 0, callback : downCb, imgName : "triangle_down");
}
c.display(player);
//entries
int count = 0;
int sizeEach = 80;
int gap = 5;
foreach (KeyValuePair<BasePlayer, PlayerSummary> kvp in listOfLists[page]) {
int ccount = count;
int csizeEach = sizeEach;
int cgap = gap;
Action imageCb = () => {
SendEntry(player, kvp, ccount, csizeEach, cgap, callback);
}
;
registerImage(PluginInstance, kvp.Key.UserIDString, kvp.Value.avatarfull, imageCb, true);
count++;
}
}
private void SendEntry(BasePlayer player, KeyValuePair<BasePlayer, PlayerSummary> kvp, int count, int sizeEach, int gap, Action<BasePlayer> callback) {
if (GuiTracker.getGuiTracker(player).getContainer(PluginInstance, "PlayerSearch") == null) return;
GuiColor black60 = new GuiColor(0, 0, 0, 0.6f);
GuiColor black40 = new GuiColor(0, 0, 0, 0.4f);
GuiColor white70 = new GuiColor(1, 1, 1, 0.7f);
GuiContainer c = new GuiContainer(PluginInstance, $"{count}ImageContainer", "PlayerSearch");
//background
Rectangle entryBgPos = new Rectangle(715, 360 + count * (sizeEach + gap), 490, 80, 1920, 1080, true);
c.addPlainPanel($"{count}EntryBG", entryBgPos, GuiContainer.Layer.overall, black60, 0.2f, 0);
//ID
Rectangle idPos = new Rectangle(795, 365 + count * (sizeEach + gap), 405, 35, 1920, 1080, true);
GuiText idText = new GuiText($"[{kvp.Key.userID}]", 14, white70);
c.addText($"{count}id", idPos, GuiContainer.Layer.overall, idText, 0.2f, 0);
//Name
Rectangle namePos = new Rectangle(795, 400 + count * (sizeEach + gap), 405, 35, 1920, 1080, true);
GuiText nameText = new GuiText($"{kvp.Key.displayName}", getFontsizeByFramesize(kvp.Key.displayName.Length, namePos), white70);
c.addText($"{count}name", namePos, GuiContainer.Layer.overall, nameText, 0.2f, 0);
//button
Action<BasePlayer, string[]> buttonCb = (p2, a) => {
GuiTracker.getGuiTracker(player).destroyGui(PluginInstance, "PlayerSearch");
callback(kvp.Key);
}
;
c.addPlainButton($"{count}btnOverlay", entryBgPos, GuiContainer.Layer.overall, new GuiColor(0, 0, 0, 0), 0.2f, 0, callback : buttonCb, CursorEnabled : true);
Rectangle imgPos = new Rectangle(720, 365 + count * (sizeEach + gap), 70, 70, 1920, 1080, true);
c.addButton($"{count}Image", imgPos, GuiContainer.Layer.overall, null, 0.2f, 0, callback : buttonCb, close : "PlayerSearch", imgName : kvp.Key.UserIDString);
c.display(player);
}
public void prompt(BasePlayer player, string header, string msg, Action<BasePlayer, string[]> Callback = null) {
GuiContainer containerGUI = new GuiContainer(this, "prompt");
containerGUI.addPlainButton("close", new Rectangle(), GuiContainer.Layer.overall, new GuiColor(0, 0, 0, 0.3f), 0.1f, 0.1f, blur : GuiContainer.Blur.medium);
containerGUI.addPlainPanel("background", new Rectangle(710, 390, 500, 300, 1920, 1080, true), GuiContainer.Layer.overall, new GuiColor(0, 0, 0, 0.6f), 0.1f, 0.1f, GuiContainer.Blur.medium);
containerGUI.addPanel("header", new Rectangle(710, 390, 500, 60, 1920, 1080, true), GuiContainer.Layer.overall, new GuiColor(0, 0, 0, 0), 0.1f, 0.1f, new GuiText(header, 25, new GuiColor(1, 1, 1, 0.7f)));
containerGUI.addPanel("msg", new Rectangle(735, 400, 450, 150, 1920, 1080, true), GuiContainer.Layer.overall, new GuiColor(0, 0, 0, 0), 0.1f, 0.1f, new GuiText(msg, 14, new GuiColor(1, 1, 1, 0.7f)));
containerGUI.addPlainButton("ok", new Rectangle(860, 520, 200, 50, 1920, 1080, true), GuiContainer.Layer.overall, new GuiColor(0, 0, 1, 0.6f), 0.1f, 0.1f, new GuiText("OK", 20, new GuiColor(1, 1, 1, 0.7f)), Callback, "prompt");
containerGUI.display(player);
}
public void BigConfirmPrompt(BasePlayer player, string header, string msg, Action<BasePlayer, string[]> yesCallback, Action<BasePlayer, string[]> noCallback) {
GuiContainer containerGUI = new GuiContainer(this, "prompt");
containerGUI.addPlainButton("close", new Rectangle(), GuiContainer.Layer.overall, new GuiColor(0, 0, 0, 0.3f), 0.1f, 0.1f, callback : noCallback, blur : GuiContainer.Blur.medium);
containerGUI.addPlainPanel("background", new Rectangle(710, 390, 500, 300, 1920, 1080, true), GuiContainer.Layer.overall, new GuiColor(0, 0, 0, 0.6f), 0.1f, 0.1f, GuiContainer.Blur.medium);
containerGUI.addPanel("header", new Rectangle(710, 390, 500, 60, 1920, 1080, true), GuiContainer.Layer.overall, new GuiColor(0, 0, 0, 0), 0.1f, 0.1f, new GuiText(header, 25, new GuiColor(1, 1, 1, 0.7f)));
containerGUI.addPanel("msg", new Rectangle(735, 450, 450, 150, 1920, 1080, true), GuiContainer.Layer.overall, new GuiColor(0, 0, 0, 0), 0.1f, 0.1f, new GuiText(msg, 10, new GuiColor(1, 1, 1, 0.7f)));
containerGUI.addPlainButton("yes", new Rectangle(740, 620, 200, 50, 1920, 1080, true), GuiContainer.Layer.overall, new GuiColor(0, 1, 0, 0.6f), 0.1f, 0.1f, new GuiText("YES", 20, new GuiColor(1, 1, 1, 0.7f)), yesCallback, "prompt");
containerGUI.addPlainButton("no", new Rectangle(980, 620, 200, 50, 1920, 1080, true), GuiContainer.Layer.overall, new GuiColor(1, 0, 0, 0.6f), 0.1f, 0.1f, new GuiText("NO", 20, new GuiColor(1, 1, 1, 0.7f)), noCallback, "prompt");
containerGUI.display(player);
}
public void SmallConfirmPrompt(BasePlayer player, string header, Action<BasePlayer, string[]> yesCallback, Action<BasePlayer, string[]> noCallback) {
GuiContainer containerGUI = new GuiContainer(this, "prompt");
containerGUI.addPlainButton("close", new Rectangle(), GuiContainer.Layer.overall, new GuiColor(0, 0, 0, 0.3f), 0.1f, 0.1f, callback : noCallback, blur : GuiContainer.Blur.medium);
containerGUI.addPlainPanel("background", new Rectangle(710, 465, 500, 150, 1920, 1080, true), GuiContainer.Layer.overall, new GuiColor(0, 0, 0, 0.6f), 0.1f, 0.1f, GuiContainer.Blur.medium);
containerGUI.addPanel("header", new Rectangle(710, 465, 500, 60, 1920, 1080, true), GuiContainer.Layer.overall, new GuiColor(0, 0, 0, 0), 0.1f, 0.1f, new GuiText(header, 25, new GuiColor(1, 1, 1, 0.7f)));
containerGUI.addPlainButton("yes", new Rectangle(740, 545, 200, 50, 1920, 1080, true), GuiContainer.Layer.overall, new GuiColor(0, 1, 0, 0.6f), 0.1f, 0.1f, new GuiText("YES", 20, new GuiColor(1, 1, 1, 0.7f)), yesCallback, "prompt");
containerGUI.addPlainButton("no", new Rectangle(980, 545, 200, 50, 1920, 1080, true), GuiContainer.Layer.overall, new GuiColor(1, 0, 0, 0.6f), 0.1f, 0.1f, new GuiText("NO", 20, new GuiColor(1, 1, 1, 0.7f)), noCallback, "prompt");
containerGUI.display(player);
}
private class Submission {
public string Input {
get;
set;
}
= null;
}
public void SubmitPrompt(BasePlayer player, string header, Action<BasePlayer, string> inputCallback) {
GuiContainer containerGUI = new GuiContainer(this, "prompt");
containerGUI.addPlainButton("close", new Rectangle(), GuiContainer.Layer.overall, new GuiColor(0, 0, 0, 0.3f), 0.1f, 0.1f, blur : GuiContainer.Blur.medium);
containerGUI.addPlainPanel("background", new Rectangle(710, 425, 500, 230, 1920, 1080, true), GuiContainer.Layer.overall, new GuiColor(0, 0, 0, 0.6f), 0.1f, 0.1f, GuiContainer.Blur.medium);
containerGUI.addPanel("header", new Rectangle(710, 435, 500, 60, 1920, 1080, true), GuiContainer.Layer.overall, new GuiColor(0, 0, 0, 0), 0.1f, 0.1f, new GuiText(header, 25, new GuiColor(1, 1, 1, 0.7f)));
Submission submission = new Submission();
Action< BasePlayer, string[]> inputFieldCallback = (p, a) => {
submission.Input = string.Join(" ", a);
}
;
containerGUI.addInput("input", new Rectangle(735, 505, 450, 60, 1920, 1080, true), inputFieldCallback, GuiContainer.Layer.overall, null, new GuiColor(1, 1, 1, 1), 100, new GuiText("", 14, new GuiColor(0, 0, 0, 1)), 0.1f, 0.1f);
Action<BasePlayer, string[]> cb = (p, a) => {
inputCallback(p, submission.Input);
}
;
containerGUI.addPlainButton("submit", new Rectangle(860, 583, 200, 50, 1920, 1080, true), GuiContainer.Layer.overall, new GuiColor(1, 0, 0, 0.6f), 0.1f, 0.1f, new GuiText("SUBMIT", 20, new GuiColor(1, 1, 1, 0.7f)), cb, "prompt");
containerGUI.display(player);
}
public void dropdown(Plugin plugin, BasePlayer player, List<string> options, Rectangle rectangle, GuiContainer.Layer layer, string parent, GuiColor panelColor, GuiColor textColor, Action<string> callback, bool allowNew = false, int page = 0, Predicate<string> predicate = null) {
if (allowNew) options.Add("(add new)");
int maxItems = 5;
rectangle.H *= ((float)options.Count / (float)maxItems);
List<List<string>> ListOfLists = SplitIntoChunks<string>(options, maxItems);
GuiContainer container = new GuiContainer(plugin, "dropdown_API", parent);
double cfX = rectangle.W / 300;
double cfY = rectangle.H / 570;
Action<BasePlayer, string[]> up = (bPlayer, input) => {
dropdown(plugin, player, options, rectangle, layer, parent, panelColor, textColor, callback, allowNew, page - 1, predicate);
}
;
Action<BasePlayer, string[]> down = (bPlayer, input) => {
dropdown(plugin, player, options, rectangle, layer, parent, panelColor, textColor, callback, allowNew, page + 1, predicate);
}
;
if (page > 0) container.addPlainButton("dropdown_up", new Rectangle(0, 1, 298, 36, 300, 570, true), new GuiColor(1, 1, 1, 0.4f), 0, 0, new GuiText("<b>∧</b>", (int)Math.Floor(22 * cfY), new GuiColor("black")), up, parent : "dropdown_background");
if (page < ListOfLists.Count - 1) container.addPlainButton("dropdown_up", new Rectangle(0, 533, 298, 37, 300, 570, true), new GuiColor(1, 1, 1, 0.4f), 0, 0, new GuiText("<b>∨</b>", (int)Math.Floor(22 * cfY), new GuiColor("black")), down, parent : "dropdown_background");
int count = 0;
foreach (string option in ListOfLists[page]) {
int hEach = (int)(rectangle.H / ListOfLists[page].Count);
Rectangle pos = new Rectangle(0, 0 + (count*hEach), rectangle.W, hEach, rectangle.W, rectangle.H, true).WithParent(rectangle);
Action<BasePlayer, string[]> btnCallback = null;
if (option == "(add new)") {
btnCallback = (bPlayer, input) => dropdownAddNew(plugin, player, pos, callback, predicate);
}
else {
string selected = option;
btnCallback = (bPlayer, input) => {
callback(selected);
}
;
}
container.addPlainButton($"dropdown_option_{option}", pos, layer, panelColor, 0, 0, new GuiText(option, color : textColor), btnCallback, blur : GuiContainer.Blur.strong);
count++;
}
container.display(player);
}
private void dropdownAddNew(Plugin plugin, BasePlayer player, Rectangle rectangle, Action<string> callback, Predicate<string> predicate) {
GuiContainer container = new GuiContainer(this, "dropdown_addNew", "dropdown_API");
Action<BasePlayer, string[]> inputCallback = (bPlayer, input) => {
if (input.Length == 0) return;
GuiTracker.getGuiTracker(player).destroyGui(PluginInstance, "dropdown_addNew");
StringBuilder newName = new StringBuilder();
int i = 1;
foreach (string s in input) {
newName.Append(s);
if (i != input.Length) newName.Append(" ");
i++;
}
if (predicate != null) {
if (!predicate(newName.ToString())) {
prompt(player, "Your input is invalid!", "INVALID INPUT");
dropdownAddNew(plugin, player, rectangle, callback, predicate);
return;
}
}
callback(newName.ToString());
GuiTracker.getGuiTracker(player).destroyGui(PluginInstance, container);
}
;
container.addInput("dropdown_addNew_input", rectangle, inputCallback, GuiContainer.Layer.menu, null, new GuiColor("white"), 15, new GuiText("", color : new GuiColor("black")), 0, 0);
container.display(player);
}
public void registerImage(Plugin plugin, string name, string url, Action callback = null, bool force = false, int? imgSizeX = null, int? imgSizeY = null) {
string safeName = $"{plugin.Name}_{name}";
if (!force && ImageLibrary.Call<bool>("HasImage", safeName, (ulong)0)) {
callback?.Invoke();
}
else {
if (imgSizeX != null && imgSizeY != null) {
var il = new GameObject("WebObject").AddComponent<ImageLoader>();
il.StartCoroutine(il.DownloadImage(url, (b) => {
//byte[] img = ImageLoader.Resize(b, imgSizeX.Value, imgSizeY.Value);
//(bool)AddImageData(string imageName, byte[]array, ulong imageId, Action callback = null)
ImageLibrary.Call("AddImageData", safeName, b, (ulong)0, callback);
}
, imgSizeX, imgSizeY));
}
else {
ImageLibrary.Call("AddImage", url, safeName, (ulong)0, callback);
}
}
}
public bool HasImage(Plugin plugin, string name) {
string safeName = $"{plugin.Name}_{name}";
if (ImageLibrary.Call<bool>("HasImage", safeName, (ulong)0)) {
return true;
}
return false;
}
}
}
namespace Oxide.Plugins {
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
public partial class GUICreator {
public class Command {
const string flagSymbols = "/-";
public string fullString;
public string name;
public List<string> args = new List<string>();
public Dictionary<string, List<string>> flags = new Dictionary<string, List<string>>();
public Command(string fullString) {
this.fullString = fullString;
string[] split = Regex.Split(fullString, " ");
if (split.Length < 1) return;
name = split.First();
if (split.Length < 2) return;
split = split.Skip(1).ToArray();
List<string> flag = null;
foreach (string arg in split) {
if (flagSymbols.Contains(arg.First())) {
string sanitizedFlag = arg.Substring(1);
if (!flags.ContainsKey(sanitizedFlag)) {
flags.Add(sanitizedFlag, new List<string>());
}
flag = flags[sanitizedFlag];
}
else if (flag != null) flag.Add(arg);
else args.Add(arg);
}
}
public override string ToString() {
StringBuilder sb = new StringBuilder($"{name} ");
foreach (string arg in args) {
sb.Append($"{arg} ");
}
foreach (string flag in flags.Keys) {
sb.Append($"\n{flag}: ");
foreach (string arg in flags[flag]) {
sb.Append($"{arg} ");
}
}
return sb.ToString();
}
}
}
}
namespace Oxide.Plugins {
using Facepunch.Extend;
using Oxide.Core.Plugins;
using Oxide.Game.Rust.Cui;
using System;
using System.Collections.Generic;
using UnityEngine;
public partial class GUICreator {
public void InitCommands() {
cmd.AddConsoleCommand("gui.close", this, nameof(closeUi));
cmd.AddConsoleCommand("gui.input", this, nameof(OnGuiInput));
cmd.AddConsoleCommand("gui.list", this, nameof(listContainers));
cmd.AddChatCommand("player", this, nameof(PlayerSearchCommand));
cmd.AddChatCommand("guidemo", this, nameof(demoCommand));
cmd.AddChatCommand("img", this, nameof(imgPreviewCommand));
cmd.AddChatCommand("imgraw", this, nameof(imgrawPreviewCommand));
}
private void PlayerSearchCommand(BasePlayer player, string command, string[] args) {
if (args.Length == 0) return;
PlayerSearch(player, args[0], (p) => player.ChatMessage($"player selected: {p.displayName}"));
}
private void closeUi(ConsoleSystem.Arg arg) {
GuiTracker.getGuiTracker(arg.Player()).destroyAllGui();
}
private void listContainers(ConsoleSystem.Arg arg) {
BasePlayer player = arg.Player();
if (arg.Args != null) player = BasePlayer.FindByID(ulong.Parse(arg.Args[0]));
if (player == null) return;
GuiTracker tracker = GuiTracker.getGuiTracker(player);
if (tracker.activeGuiContainers.Count == 0) {
SendReply(arg, "you don't have any active guiContainers!");
return;
}
foreach (GuiContainer container in tracker.activeGuiContainers) {
SendReply(arg, $"Plugin: {container.plugin.Name}, Container: {container.name}, Parent: {container.parent}:");
foreach (GuiElement element in container) {
SendReply(arg, $"- Element: {element.Name}, Parent: {element.Parent}, ParentElement: {element.ParentElement?.Name ?? "null"}");
}
}
}
private void OnGuiInput(ConsoleSystem.Arg arg) {
//gui.input pluginName containerName inputName --close elementNames...--input text...if (arg.Args.Length < 3)
{
SendReply(arg, "OnGuiInput: not enough arguments given!");
return;
}
BasePlayer player = arg.Player();
if (player == null) return;
#if DEBUG2
SendReply(arg, $"OnGuiInput: gui.input {arg.FullString}");
player.ChatMessage($"OnGuiInput: gui.input {arg.FullString}");
#endif
GuiTracker tracker = GuiTracker.getGuiTracker(player);
#region parsing
Command cmd = new Command("gui.input " + arg.FullString);
#if DEBUG
player.ChatMessage(cmd.ToString());
#endif
Plugin plugin = Manager.GetPlugin(cmd.args[0]);
if (plugin == null) {
SendReply(arg, "OnGuiInput: Plugin not found!");
return;
}
GuiContainer container = tracker.getContainer(plugin, cmd.args[1]);
if (container == null) {
SendReply(arg, "OnGuiInput: Container not found!");
return;
}
string inputName = cmd.args[2];
bool closeContainer = false;
if (inputName == "close" || inputName == "close_btn") closeContainer = true;
#endregion
#region execution
string[] input = null;
if (cmd.flags.ContainsKey("-input")) input = cmd.flags["-input"].ToArray();
if (!container.runCallback(inputName, player, input)) {
#if DEBUG
SendReply(arg, $"OnGuiInput: Callback for {plugin.Name} {container.name} {inputName} wasn't found");
#endif
}
if (cmd.flags.ContainsKey("-close")) {
foreach (string name in cmd.flags["-close"]) {
if (name == container.name) tracker.destroyGui(plugin, container);
else tracker.destroyGui(plugin, container, name);
}
}
if (closeContainer) tracker.destroyGui(plugin, container);
#endregion
}
private void demoCommand(BasePlayer player, string command, string[] args) {
if (!permission.UserHasPermission(player.UserIDString, "gui.demo")) {
PrintToChat(player, lang.GetMessage("noPermission", this, player.UserIDString));
return;
}
if (args.Length == 0) {
GuiContainer container = new GuiContainer(this, "demo");
container.addPanel("demo_panel", new Rectangle(0.25f, 0.5f, 0.25f, 0.25f), GuiContainer.Layer.hud, new GuiColor(0, 1, 0, 1), 1, 1, new GuiText("This is a regular panel", 30));
container.addPanel("demo_img", new Rectangle(0.25f, 0.25f, 0.25f, 0.25f), FadeIn : 1, FadeOut : 1, text : new GuiText("this is an image with writing on it", 30, color : new GuiColor(1, 1, 1, 1)), imgName : "flower");
Action<BasePlayer, string[]> heal = (bPlayer, input) => {
bPlayer.Heal(10);
}
;
container.addButton("demo_healButton", new Rectangle(0.5f, 0.5f, 0.25f, 0.25f), GuiContainer.Layer.hud, null, 1, 1, new GuiText("heal me", 40), heal, null, false, "flower");
Action<BasePlayer, string[]> hurt = (bPlayer, input) => {
bPlayer.Hurt(10);
}
;
container.addButton("demo_hurtButton", new Rectangle(0.5f, 0.25f, 0.25f, 0.25f), new GuiColor(1, 0, 0, 0.5f), 1, 1, new GuiText("hurt me", 40), hurt);
container.addText("demo_inputLabel", new Rectangle(0.375f, 0.85f, 0.25f, 0.1f), new GuiText("Print to chat:", 30, null, TextAnchor.LowerCenter), 1, 1);
Action<BasePlayer, string[]> inputCallback = (bPlayer, input) => {
PrintToChat(bPlayer, string.Concat(input));
}
;
container.addInput("demo_input", new Rectangle(0.375f, 0.75f, 0.25f, 0.1f), inputCallback, GuiContainer.Layer.hud, null, new GuiColor("white"), 100, new GuiText("", 50), 1, 1);
container.addButton("close", new Rectangle(0.1f, 0.1f, 0.1f, 0.1f), new GuiColor("red"), 1, 0, new GuiText("close", 50));
container.display(player);
GuiContainer container2 = new GuiContainer(this, "demo_child", "demo");
container2.addPanel("layer1", new Rectangle(1400, 800, 300, 100, 1920, 1080, true), GuiContainer.Layer.overall, new GuiColor("red"), 1, 1, new GuiText("overall", align : TextAnchor.LowerLeft));
container2.addPanel("layers_label", new Rectangle(1400, 800, 300, 100, 1920, 1080, true), GuiContainer.Layer.overall, null, 1, 1, new GuiText("Available layers:", 20, align : TextAnchor.UpperLeft));
container2.addPanel("layer2", new Rectangle(1425, 825, 300, 100, 1920, 1080, true), GuiContainer.Layer.overlay, new GuiColor("yellow"), 1, 1, new GuiText("overlay", align : TextAnchor.LowerLeft));
container2.addPanel("layer3", new Rectangle(1450, 850, 300, 100, 1920, 1080, true), GuiContainer.Layer.menu, new GuiColor("green"), 1, 1, new GuiText("menu", align : TextAnchor.LowerLeft));
container2.addPanel("layer4", new Rectangle(1475, 875, 300, 100, 1920, 1080, true), GuiContainer.Layer.hud, new GuiColor("blue"), 1, 1, new GuiText("hud", align : TextAnchor.LowerLeft));
container2.addPanel("layer5", new Rectangle(1500, 900, 300, 100, 1920, 1080, true), GuiContainer.Layer.under, new GuiColor("purple"), 1, 1, new GuiText("under", align : TextAnchor.LowerLeft));
container2.display(player);
GuiContainer container3 = new GuiContainer(this, "demo_anchors", "demo");
container3.addPlainPanel("bl", new Rectangle(20, 960, 100, 100, 1920, 1080, true, Rectangle.Anchors.BottomLeft), GuiContainer.Layer.menu, new GuiColor("white"), 1, 1);
container3.addPlainPanel("cl", new Rectangle(20, 490, 100, 100, 1920, 1080, true, Rectangle.Anchors.CenterLeft), GuiContainer.Layer.menu, new GuiColor("white"), 1, 1);
container3.addPlainPanel("ul", new Rectangle(20, 20, 100, 100, 1920, 1080, true, Rectangle.Anchors.UpperLeft), GuiContainer.Layer.menu, new GuiColor("white"), 1, 1);
container3.addPlainPanel("uc", new Rectangle(910, 20, 100, 100, 1920, 1080, true, Rectangle.Anchors.UpperCenter), GuiContainer.Layer.menu, new GuiColor("white"), 1, 1);
container3.addPlainPanel("ur", new Rectangle(1800, 20, 100, 100, 1920, 1080, true, Rectangle.Anchors.UpperRight), GuiContainer.Layer.menu, new GuiColor("white"), 1, 1);
container3.addPlainPanel("cr", new Rectangle(1800, 490, 100, 100, 1920, 1080, true, Rectangle.Anchors.CenterRight), GuiContainer.Layer.menu, new GuiColor("white"), 1, 1);
container3.addPlainPanel("br", new Rectangle(1800, 960, 100, 100, 1920, 1080, true, Rectangle.Anchors.BottomRight), GuiContainer.Layer.menu, new GuiColor("white"), 1, 1);
container3.addPlainPanel("bc", new Rectangle(910, 960, 100, 100, 1920, 1080, true, Rectangle.Anchors.BottomCenter), GuiContainer.Layer.menu, new GuiColor("white"), 1, 1);
container3.display(player);
customGameTip(player, "This is a custom gametip!", 5);
return;
}
else if (args.Length >= 3) {
if (args[0] == "gametip") customGameTip(player, args[2], 3f, (gametipType)Enum.Parse(typeof(gametipType), args[1]));
}
}
private void imgPreviewCommand(BasePlayer player, string command, string[] args) {
if (!permission.UserHasPermission(player.UserIDString, "gui.demo")) {
PrintToChat(player, lang.GetMessage("noPermission", this, player.UserIDString));
return;
}
imgPreview(player, args[0]);
}
public void imgPreview(BasePlayer player, string url) {
Action callback = () => {
Rectangle rectangle = new Rectangle(710, 290, 500, 500, 1920, 1080, true);
GuiContainer container = new GuiContainer(PluginInstance, $"imgPreview");
container.addRawImage($"img", rectangle, ImageLibrary.Call<string>("GetImage", $"GUICreator_preview_{url}"), "Hud");
container.addPlainButton("close", new Rectangle(0.15f, 0.15f, 0.1f, 0.1f), new GuiColor(1, 0, 0, 0.8f), 0, 0, new GuiText("close"));
container.display(player);
}
;
if (ImageLibrary.Call<bool>("HasImage", $"GUICreator_preview_{url}", (ulong)0)) {
callback();
}
else ImageLibrary.Call<bool>("AddImage", url, $"GUICreator_preview_{url}", (ulong)0, callback);
}
private void imgrawPreviewCommand(BasePlayer player, string command, string[] args) {
if (!permission.UserHasPermission(player.UserIDString, "gui.demo")) {
PrintToChat(player, lang.GetMessage("noPermission", this, player.UserIDString));
return;
}
GuiContainer container = new GuiContainer(this, "imgPreview");
container.addRawImage("img", new Rectangle(710, 290, 500, 500, 1920, 1080, true), args[0], GUICreator.GuiContainer.Layer.hud);
container.addPlainButton("close", new Rectangle(0.15f, 0.15f, 0.1f, 0.1f), new GuiColor(1, 0, 0, 0.8f), 0, 0, new GuiText("close"));
container.display(player);
}
}
}
namespace Oxide.Plugins {
public partial class GUICreator {
private static ConfigData config;
private class ConfigData {
public string steamAPIKey;
public string gameTipIcon;
}
private ConfigData GetDefaultConfig() {
return new ConfigData {
steamAPIKey = "", gameTipIcon = "https://i.imgur.com/VFBB8ib.png"
}
;
}
protected override void LoadConfig() {
base.LoadConfig();
try {
config = Config.ReadObject<ConfigData>();
}
catch {
LoadDefaultConfig();
}
SaveConfig();
}
protected override void LoadDefaultConfig() {
PrintError("Configuration file is corrupt(or doesn't exist), creating new one!");
config = GetDefaultConfig();
}
protected override void SaveConfig() {
Config.WriteObject(config);
}
}
}
namespace Oxide.Plugins {
using Oxide.Game.Rust.Cui;
public partial class GUICreator {
public class ExtendedCuiElementContainer : CuiElementContainer {
public string Add(CuiInputField InputField, string Parent = "Hud", string Name = "") {
if (string.IsNullOrEmpty(Name)) Name = CuiHelper.GetGuid();
CuiElement element = new CuiElement() {
Name = Name, Parent = Parent, FadeOut = InputField.FadeOut, Components = {
InputField.InputField, InputField.RectTransform
}
}
;
//if (InputField.Image != null) element.Components.Add(InputField.Image);
if (InputField.CursorEnabled) element.Components.Add(new CuiNeedsCursorComponent());
Add(element);
return Name;
}
}
}
}
namespace Oxide.Plugins {
using ConVar;
using Newtonsoft.Json;
using Oxide.Core.Plugins;
using Oxide.Game.Rust.Cui;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using UnityEngine;
public partial class GUICreator {
public class GuiContainer : List<GuiElement> {
public Plugin plugin;
public string name;
public string parent;
public List<Timer> timers = new List<Timer>();
public Action<BasePlayer> closeCallback;
private Dictionary<string, Action<BasePlayer, string[]>> callbacks = new Dictionary<string, Action<BasePlayer, string[]>>();
private ExtendedCuiElementContainer CuiContainer {
get {
ExtendedCuiElementContainer container = new ExtendedCuiElementContainer();
foreach(GuiElement e in this) {
container.Add(e);
}
return container;
}
}
public GuiContainer(Plugin plugin, string name, string parent = null, Action<BasePlayer> closeCallback = null) {
this.plugin = plugin;
this.name = removeWhiteSpaces(name);
this.parent = removeWhiteSpaces(parent);
this.closeCallback = closeCallback;
}
public enum Layer {
overall, overlay, menu, hud, under
}
;
//Rust UI elements (inventory, Health, etc.) are between the hud and the menu layer
public static List<string> layers = new List<string> {
"Overall", "Overlay", "Hud.Menu", "Hud", "Under"
}
;
public enum Blur {
slight, medium, strong, greyout, none
}
;
public static List<string> blurs = new List<string> {
"assets/content/ui/uibackgroundblur-notice.mat", "assets/content/ui/uibackgroundblur-ingamemenu.mat", "assets/content/ui/uibackgroundblur.mat", "assets/icons/greyout.mat"
}
;
public void display(BasePlayer player) {
if (this.Count == 0) return;
foreach (CuiElement element in this) {
if (!string.IsNullOrEmpty(element.Name)) element.Name = PluginInstance.prependContainerName(this, element.Name);
if (!string.IsNullOrEmpty(element.Parent) && !layers.Contains(element.Parent)) element.Parent = PluginInstance.prependContainerName(this, element.Parent);
}
GuiTracker.getGuiTracker(player).addGuiToTracker(plugin, this);
#if DEBUG
PluginInstance.Puts(JsonConvert.SerializeObject(this));
player.ConsoleMessage(JsonConvert.SerializeObject(this));
#endif
CuiHelper.AddUi(player, CuiContainer);
}
public void destroy(BasePlayer player) {
GuiTracker.getGuiTracker(player).destroyGui(plugin, this);
}
public void registerCallback(string name, Action<BasePlayer, string[]> callback) {
name = removeWhiteSpaces(name);
if (callbacks.ContainsKey(name)) callbacks.Remove(name);
callbacks.Add(name, callback);
}
public bool runCallback(string name, BasePlayer player, string[] input) {
name = removeWhiteSpaces(name);
if (!callbacks.ContainsKey(name)) return false;
try {
callbacks[name](player, input);
return true;
}
catch (Exception E) {
PluginInstance.Puts($"Failed to run callback: {name}, {E.Message}");
return false;
}
}
private void purgeDuplicates(string name) {
foreach (GuiElement element in this) {
if (element.Name == name) {
PluginInstance.Puts($"Duplicate element: {element.Name} in container: {this.name}");
this.Remove(element);
return;
}
}
}
private GuiElement GetParent(string name) {
foreach (GuiElement e in this) {
if (e.Name == name) {
return e;
}
}
return null;
}
public List<GuiElement> addPanel(string name, Rectangle rectangle, Layer layer, GuiColor panelColor = null, float FadeIn = 0, float FadeOut = 0, GuiText text = null, string imgName = null, Blur blur = Blur.none) {
return addPanel(name, rectangle, null, layer, panelColor, FadeIn, FadeOut, text, imgName, blur);
}
public List<GuiElement> addPanel(string name, Rectangle rectangle, string parent = "Hud", GuiColor panelColor = null, float FadeIn = 0, float FadeOut = 0, GuiText text = null, string imgName = null, Blur blur = Blur.none) {
return addPanel(name, rectangle, GetParent(parent), Layer.hud, panelColor, FadeIn, FadeOut, text, imgName, blur);
}
public List<GuiElement> addPanel(string name, Rectangle rectangle, GuiElement parent, Layer layer, GuiColor panelColor = null, float FadeIn = 0, float FadeOut = 0, GuiText text = null, string imgName = null, Blur blur = Blur.none) {
if (string.IsNullOrEmpty(name)) name = "panel";
purgeDuplicates(name);
List<GuiElement> panel = GuiPanel.GetNewGuiPanel(plugin, name, rectangle, parent, layer, panelColor, FadeIn, FadeOut, text, imgName, blur);
AddRange(panel);
return panel;
}
public GuiPlainPanel addPlainPanel(string name, Rectangle rectangle, Layer layer, GuiColor panelColor = null, float FadeIn = 0, float FadeOut = 0, Blur blur = Blur.none) {
return addPlainPanel(name, rectangle, null, layer, panelColor, FadeIn, FadeOut, blur);
}
public GuiPlainPanel addPlainPanel(string name, Rectangle rectangle, string parent, GuiColor panelColor = null, float FadeIn = 0, float FadeOut = 0, Blur blur = Blur.none) {
return addPlainPanel(name, rectangle, GetParent(parent), Layer.hud, panelColor, FadeIn, FadeOut, blur);
}
public GuiPlainPanel addPlainPanel(string name, Rectangle rectangle, GuiElement parent = null, Layer layer = Layer.hud, GuiColor panelColor = null, float FadeIn = 0, float FadeOut = 0, Blur blur = Blur.none) {
if (string.IsNullOrEmpty(name)) name = "plainPanel";
purgeDuplicates(name);
GuiPlainPanel pp = GuiPlainPanel.GetNewGuiPlainPanel(name, rectangle, parent, layer, panelColor, FadeIn, FadeOut, blur);
Add(pp);
return pp;
}
public GuiImage addImage(string name, Rectangle rectangle, string imgName, Layer layer, GuiColor panelColor = null, float FadeIn = 0, float FadeOut = 0) {
return addImage(name, rectangle, imgName, null, layer , panelColor, FadeIn, FadeOut);
}
public GuiImage addImage(string name, Rectangle rectangle, string imgName, string parent = "Hud", GuiColor panelColor = null, float FadeIn = 0, float FadeOut = 0) {
return addImage(name, rectangle, imgName, GetParent(parent), Layer.hud, panelColor, FadeIn, FadeOut);
}
public GuiImage addImage(string name, Rectangle rectangle, string imgName, GuiElement Parent, Layer layer, GuiColor panelColor = null, float FadeIn = 0, float FadeOut = 0) {
if (string.IsNullOrEmpty(name)) name = "image";
purgeDuplicates(name);
GuiImage img = GuiImage.GetNewGuiImage(plugin, name, rectangle, imgName, false, Parent, layer, panelColor, FadeIn, FadeOut);
Add(img);
return img;
}
public GuiImage addRawImage(string name, Rectangle rectangle, string imgData, Layer layer, GuiColor panelColor = null, float FadeIn = 0, float FadeOut = 0) {
return addRawImage(name, rectangle, imgData, null, layer, panelColor, FadeIn, FadeOut);
}
public GuiImage addRawImage(string name, Rectangle rectangle, string imgData, string parent = "Hud",
// ... [Code preview truncated due to length. Full source in attached file] ...