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

FREE GUICreator : 1.4.1 1.4.1

Нет прав для скачивания
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] ...

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