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

FREE ServerPanelInstaller : 2.0.5 2.0.5

Нет прав для скачивания
C#:
// Requires: ServerPanel
// #define TESTING
using System;
using System.Collections;
using System.Collections.Generic;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Security.Cryptography;
using System.Text;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using Oxide.Core;
using Oxide.Core.Libraries.Covalence;
using Oxide.Core.Plugins;
using Oxide.Game.Rust.Cui;
using Rust;
using UnityEngine;
using UnityEngine.Networking;
using UnityEngine.UI;
#if CARBON
using Carbon.Base;
using Carbon.Modules;
#endif
namespace Oxide.Plugins;
[Info("ServerPanel Installer", "Mevent", "2.0.5")]
public class ServerPanelInstaller : RustPlugin {
#region Fields
    [PluginReference]
    private Plugin ImageLibrary = null, ServerPanelPopUps = null;
    private static ServerPanelInstaller Instance;
    private ServerPanel ServerPanel;
#if CARBON
    private ImageDatabaseModule imageDatabase;
#endif
    private bool _enabledImageLibrary;
    private const string PERM_ADMIN = "serverpanelinstaller.admin", CmdMainConsole = "UI_ServerPanelInstaller", Layer = "UI.Server.Panel.Installer";
#endregion
#region Hooks
    private void Init() {
        Instance = this;
    }
    private void OnServerInitialized() {
        ServerPanel = (ServerPanel) plugins.Find(nameof(ServerPanel));
        LoadServerPanelTemplatesData();
        RegisterPermissions();
        RegisterCommands();
    }
    private void Unload() {
        Instance = null;
    }
#endregion
#region Commands
    private void CmdOpenInstaller(IPlayer covPlayer, string command, string[] args) {
        var player = covPlayer.Object as BasePlayer;
        if (player == null) return;
        if (!permission.UserHasPermission(player.UserIDString, PERM_ADMIN)) {
            PrintError($"Player {player.UserIDString} does not have permission to install server panel!");
            return;
        }
        ShowInstallerUI(player);
    }
    [ConsoleCommand(CmdMainConsole)]
    private void ConsoleMainInstaller(ConsoleSystem.Arg arg) {
        var player = arg.Player();
        if (player == null) return;
        switch (arg.GetString(0)) {
            case "cancel" : {
                PanelInstaller.Destroy(player.userID);
                break;
            }
            case "finish" : {
                PanelInstaller.Finish(player.userID);
                break;
            }
            case "change_step" : {
                if (!arg.HasArgs(2)) return;
                var panelInstaller = PanelInstaller.Get(player.userID);
                if (panelInstaller == null) return;
                var nextStep = arg.GetInt(1);
                switch (nextStep) {
                    case 4 : {
                        if (panelInstaller.SelectedTemplate < 0) {
                            ErrorUi(player, "Please select a template!");
                            return;
                        }
                        if (!panelInstaller.CleanInstall) nextStep = 5;
                        break;
                    }
                }
                panelInstaller.SetStep(nextStep);
                ShowInstallerUI(player);
                break;
            }
            case "set_field" : {
                if (!arg.HasArgs(3)) return;
                var field = arg.GetString(1);
                if (string.IsNullOrEmpty(field)) return;
                var value = string.Join(" ", arg.Args.Skip(2));
                if (string.IsNullOrEmpty(value)) return;
                var panelInstaller = PanelInstaller.Get(player.userID);
                if (panelInstaller == null) return;
                panelInstaller.SetField(field, value);
                UpdateUI(player, container => {
                    LoopPreConfigFields(player, container);
                }
                );
                break;
            }
            case "select_template" : {
                if (!arg.HasArgs(2)) return;
                var templateIndex = arg.GetInt(1);
                var panelInstaller = PanelInstaller.Get(player.userID);
                if (panelInstaller == null) return;
                panelInstaller.SelectTemplate(templateIndex);
                UpdateUI(player, container => {
                    LoopTemplates(player, container);
                }
                );
                break;
            }
            case "toggle_clean_install" : {
                var panelInstaller = PanelInstaller.Get(player.userID);
                if (panelInstaller == null) return;
                panelInstaller.CleanInstall = !panelInstaller.CleanInstall;
                ShowInstallerUI(player);
                break;
            }
        }
    }
#endregion
#region Interface
    private const int UI_Installer_Template_Margin_X = 19, UI_Installer_Template_Margin_Y = 20, UI_Installer_Template_Width = 350, UI_Installer_Template_Height = 192;
    private void ShowInstallerUI(BasePlayer player) {
        var installer = PanelInstaller.GetOrCreate(player.userID);
        var container = new CuiElementContainer();
#region Background
        container.Add(new CuiPanel {
            CursorEnabled = true, Image = {
                Material = "assets/content/ui/namefontmaterial.mat", Color = "0 0 0 1"
            }
            , RectTransform = {
                AnchorMin = "0 0", AnchorMax = "1 1"
            }
        }
        , API_GetInstallerBackground(), Layer, Layer);
#endregion Background
#region Header
        container.Add(new CuiPanel {
            Image = {
                Color = HexToCuiColor("#929292", 5), Material = "assets/content/ui/namefontmaterial.mat"
            }
            , RectTransform = {
                AnchorMin = "0 1", AnchorMax = "1 1", OffsetMin = "0 -112", OffsetMax = "0 0"
            }
        }
        , Layer, Layer + ".Header", Layer + ".Header");
#region Title
        container.Add(new CuiElement {
            Parent = Layer + ".Header", Components = {
                new CuiTextComponent {
                    Text = Msg(player, UIHeaderTitle), Font = "robotocondensed-bold.ttf", FontSize = 32, Align = TextAnchor.LowerLeft, Color = "0.6 0.6078432 0.6117647 1"
                }
                , new CuiRectTransformComponent {
                    AnchorMin = "0 0", AnchorMax = "1 1", OffsetMin = "90 46", OffsetMax = "0 0"
                }
            }
        }
        );
#endregion Title
#region Description
        container.Add(new CuiElement {
            Parent = Layer + ".Header", Components = {
                new CuiTextComponent {
                    Text = Msg(player, UIHeaderDescription), Font = "robotocondensed-regular.ttf", FontSize = 14, Align = TextAnchor.UpperLeft, Color = "0.6 0.6078432 0.6117647 1"
                }
                , new CuiRectTransformComponent {
                    AnchorMin = "0 0", AnchorMax = "1 1", OffsetMin = "90 0", OffsetMax = "0 -68"
                }
            }
        }
        );
#endregion Description
#region Icon
        container.Add(new CuiElement {
            Parent = Layer + ".Header", Components = {
                new CuiRawImageComponent {
                    Png = GetImage("ServerPanel_Installer_HeaderIcon")
                }
                , new CuiRectTransformComponent {
                    AnchorMin = "0 0.5", AnchorMax = "0 0.5", OffsetMin = "45 -20", OffsetMax = "80 20"
                }
            }
        }
        );
#endregion Icon
#region Button.Close
        container.Add(new CuiPanel {
            Image = {
                Color = "0.8941177 0.2509804 0.1568628 1", Material = "assets/content/ui/namefontmaterial.mat"
            }
            , RectTransform = {
                AnchorMin = "1 1", AnchorMax = "1 1", OffsetMin = "-40 -40", OffsetMax = "0 0"
            }
        }
        , Layer + ".Header", Layer + ".Header.Button.Close", Layer + ".Header.Button.Close");
#region Icon
        container.Add(new CuiPanel {
            Image = {
                Color = "1 1 1 0.9", Sprite = "assets/icons/close.png"
            }
            , RectTransform = {
                AnchorMin = "0.5 0.5", AnchorMax = "0.5 0.5", OffsetMin = "-11 -11", OffsetMax = "11 11"
            }
        }
        , Layer + ".Header.Button.Close");
#endregion Icon
        container.Add(new CuiElement {
            Parent = Layer + ".Header.Button.Close", Components = {
                new CuiButtonComponent {
                    Close = Layer, Color = "0 0 0 0"
                }
                , new CuiRectTransformComponent()
            }
        }
        );
#endregion
#endregion Header
#region Steps
        switch (installer.step) {
            case 1 : ShowWelcomeStep(player, container, installer.step);
            break;
            case 2 : ShowDependenciesStep(player, container, installer.step);
            break;
            case 3 : ShowSelectTemplateStep(player, container, installer.step);
            break;
            case 4 : ShowPreConfigureStep(player, container, installer.step);
            break;
            case 5 : ShowFinishStep(player, container);
            break;
        }
#endregion
        CuiHelper.AddUi(player, container);
    }
    private void ErrorUi(BasePlayer player, string msg) {
        var container = new CuiElementContainer();
        container.Add(new CuiPanel {
            RectTransform = {
                AnchorMin = "0 0", AnchorMax = "1 1"
            }
            , Image = {
                Color = HexToCuiColor("#161617", 85)
            }
        }
        , API_GetInstallerBackground(), Layer + ".Modal", Layer + ".Modal");
        container.Add(new CuiPanel {
            RectTransform = {
                AnchorMin = "0.5 0.5", AnchorMax = "0.5 0.5", OffsetMin = "-127.5 -75", OffsetMax = "127.5 140"
            }
            , Image = {
                Color = HexToCuiColor("#FF4B4B")
            }
        }
        , Layer + ".Modal", Layer + ".Modal.Main");
        container.Add(new CuiLabel {
            RectTransform = {
                AnchorMin = "0 1", AnchorMax = "1 1", OffsetMin = "0 -165", OffsetMax = "0 0"
            }
            , Text = {
                Text = "XXX", Align = TextAnchor.MiddleCenter, Font = "robotocondensed-bold.ttf", FontSize = 120, Color = HexToCuiColor("#FFFFFF")
            }
        }
        , Layer + ".Modal.Main");
        container.Add(new CuiLabel {
            RectTransform = {
                AnchorMin = "0 1", AnchorMax = "1 1", OffsetMin = "0 -175", OffsetMax = "0 -155"
            }
            , Text = {
                Text = $"{msg}", Align = TextAnchor.MiddleCenter, Font = "robotocondensed-regular.ttf", FontSize = 12, Color = HexToCuiColor("#FFFFFF")
            }
        }
        , Layer + ".Modal.Main");
        container.Add(new CuiButton {
            RectTransform = {
                AnchorMin = "0 0", AnchorMax = "1 0", OffsetMin = "0 0", OffsetMax = "0 30"
            }
            , Text = {
                Text = "X", Align = TextAnchor.MiddleCenter, Font = "robotocondensed-regular.ttf", FontSize = 12, Color = HexToCuiColor("#FFFFFF")
            }
            , Button = {
                Color = HexToCuiColor("#CD3838"), Close = Layer + ".Modal"
            }
        }
        , Layer + ".Modal.Main");
        CuiHelper.AddUi(player, container);
    }
#region UI.Steps
    private void ShowFinishStep(BasePlayer player, CuiElementContainer container) {
#region Background
        container.Add(new CuiPanel {
            Image = {
                Color = "0 0 0 0"
            }
            , RectTransform = {
                AnchorMin = "0 0.5", AnchorMax = "1 0.5", OffsetMin = "0 -360", OffsetMax = "0 248"
            }
        }
        , Layer, Layer + ".Main", Layer + ".Main");
#endregion
#region Label.Welcome
        container.Add(new CuiElement {
            Parent = Layer + ".Main", Components = {
                new CuiTextComponent {
                    Text = Msg(player, UIFinishTitle), Font = "robotocondensed-regular.ttf", FontSize = 32, Align = TextAnchor.MiddleCenter, Color = "0.8862745 0.8588235 0.827451 1"
                }
                , new CuiRectTransformComponent {
                    AnchorMin = "0.5 0.5", AnchorMax = "0.5 0.5", OffsetMin = "-400 196", OffsetMax = "400 252"
                }
            }
        }
        );
#endregion Label.Welcome
#region Label.Thank.For.Buy
        container.Add(new CuiElement {
            Parent = Layer + ".Main", Components = {
                new CuiTextComponent {
                    Text = Msg(player, UIFinishDescription), Font = "robotocondensed-regular.ttf", FontSize = 16, Align = TextAnchor.UpperCenter, Color = "0.8862745 0.8588235 0.827451 1"
                }
                , new CuiRectTransformComponent {
                    AnchorMin = "0.5 0.5", AnchorMax = "0.5 0.5", OffsetMin = "-400 -114", OffsetMax = "400 151"
                }
            }
        }
        );
#endregion Label.Thank.For.Buy
#region QR.Panel
        container.Add(new CuiPanel {
            Image = {
                Color = "0 0 0 0"
            }
            , RectTransform = {
                AnchorMin = "0.5 0", AnchorMax = "0.5 0", OffsetMin = "-120 63", OffsetMax = "120 137"
            }
        }
        , Layer + ".Main", Layer + ".QR.Panel");
#region qr code
        container.Add(new CuiElement {
            Parent = Layer + ".QR.Panel", Components = {
                new CuiRawImageComponent {
                    Png = GetImage("ServerPanel_Installer_Mevent_Discord_QR")
                }
                , new CuiRectTransformComponent {
                    AnchorMin = "0 0.5", AnchorMax = "0 0.5", OffsetMin = "0 -37", OffsetMax = "74 37"
                }
            }
        }
        );
#endregion qr code
#region title
        container.Add(new CuiElement {
            Parent = Layer + ".QR.Panel", Components = {
                new CuiTextComponent {
                    Text = Msg(player, UIQRMeventDiscordTitle), Font = "robotocondensed-regular.ttf", FontSize = 14, Align = TextAnchor.MiddleLeft, Color = "0.8862745 0.8588235 0.827451 1"
                }
                , new CuiRectTransformComponent {
                    AnchorMin = "0 0", AnchorMax = "1 1", OffsetMin = "90 40", OffsetMax = "0 -12"
                }
            }
        }
        );
#endregion title
#region description
        container.Add(new CuiElement {
            Parent = Layer + ".QR.Panel", Components = {
                new CuiInputFieldComponent {
                    Text = "https://discord.gg/mevent", Font = "robotocondensed-regular.ttf", FontSize = 11, Align = TextAnchor.UpperLeft, Color = "0.8862745 0.8588235 0.827451 0.5019608", HudMenuInput = true
                }
                , new CuiRectTransformComponent {
                    AnchorMin = "0 0", AnchorMax = "1 1", OffsetMin = "90 0", OffsetMax = "0 -35"
                }
            }
        }
        );
#endregion description
#endregion QR.Panel
#region Btn.Start.Install
        container.Add(new CuiButton {
            Button = {
                Material = "assets/content/ui/namefontmaterial.mat", Color = "0 0.372549 0.7176471 1", Command = $"{CmdMainConsole} finish", Close = Layer
            }
            , Text = {
                Text = Msg(player, BtnFinish), Font = "robotocondensed-regular.ttf", FontSize = 15, Align = TextAnchor.MiddleCenter, Color = "0.8862745 0.8588235 0.827451 1"
            }
            , RectTransform = {
                AnchorMin = "0.5 0.5", AnchorMax = "0.5 0.5", OffsetMin = "-120 -114", OffsetMax = "120 -54"
            }
        }
        , Layer + ".Main");
#endregion Btn.Start.Install
#region Line
        container.Add(new CuiPanel {
            Image = {
                Color = "0.2156863 0.2156863 0.2156863 0.5019608"
            }
            , RectTransform = {
                AnchorMin = "0 1", AnchorMax = "1 1", OffsetMin = "360 -127", OffsetMax = "-360 -125"
            }
        }
        , Layer + ".Main");
#endregion Line
    }
    private const int PreConfig_Field_Margin_X = 19, PreConfig_Field_Margin_Y = 20, PreConfig_Field_Width = 220, PreConfig_Field_Height = 65;
    private void ShowPreConfigureStep(BasePlayer player, CuiElementContainer container, int step) {
#region Background
        container.Add(new CuiPanel {
            Image = {
                Color = "0 0 0 0"
            }
            , RectTransform = {
                AnchorMin = "0 0.5", AnchorMax = "1 0.5", OffsetMin = "0 -360", OffsetMax = "0 248"
            }
        }
        , Layer, Layer + ".Main", Layer + ".Main");
#endregion
        var panelInstaller = PanelInstaller.Get(player.userID);
#region Label.Welcome
        container.Add(new CuiElement {
            Parent = Layer + ".Main", Components = {
                new CuiTextComponent {
                    Text = Msg(player, UIPreConfigureTitle), Font = "robotocondensed-regular.ttf", FontSize = 32, Align = TextAnchor.MiddleCenter, Color = "0.8862745 0.8588235 0.827451 1"
                }
                , new CuiRectTransformComponent {
                    AnchorMin = "0 0", AnchorMax = "1 1", OffsetMin = "0 500", OffsetMax = "0 -52"
                }
            }
        }
        );
#endregion Label.Welcome
#region Line
        container.Add(new CuiPanel {
            Image = {
                Color = "0.2156863 0.2156863 0.2156863 0.5019608"
            }
            , RectTransform = {
                AnchorMin = "0 1", AnchorMax = "1 1", OffsetMin = "280 -127", OffsetMax = "-280 -125"
            }
        }
        , Layer + ".Main");
#endregion Line
#region Label.Thank.For.Buy
        container.Add(new CuiElement {
            Parent = Layer + ".Main", Components = {
                new CuiTextComponent {
                    Text = Msg(player, UIPreConfigureDescription), Font = "robotocondensed-regular.ttf", FontSize = 16, Align = TextAnchor.UpperCenter, Color = "0.8862745 0.8588235 0.827451 1"
                }
                , new CuiRectTransformComponent {
                    AnchorMin = "0 0", AnchorMax = "1 1", OffsetMin = "50 410", OffsetMax = "-50 -153"
                }
            }
        }
        );
#endregion Label.Thank.For.Buy
#region ScrollView
        container.Add(new CuiPanel {
            Image = {
                Color = "0 0 0 0"
            }
            , RectTransform = {
                AnchorMin = "0.5 1", AnchorMax = "0.5 1", OffsetMin = "-360 -616", OffsetMax = "377 -200"
            }
        }
        , Layer + ".Main", Layer + ".ScrollView", Layer + ".ScrollView");
#endregion ScrollView
#region Fields
        LoopPreConfigFields(player, container);
#endregion
#region Hover
        container.Add(new CuiElement {
            Name = Layer + ".Hover", Parent = Layer + ".Main", Components = {
                new CuiRawImageComponent {
                    Color = "0 0 0 1", Sprite = "assets/content/ui/UI.Background.Transparent.Linear.psd"
                }
                , new CuiRectTransformComponent {
                    AnchorMin = "0 0", AnchorMax = "1 0", OffsetMin = "0 0", OffsetMax = "0 105"
                }
            }
        }
        );
#endregion Hover
#region Btn.Accept
        container.Add(new CuiButton {
            Button = {
                Color = "0 0.372549 0.7176471 1", Command = $"{CmdMainConsole} change_step {step + 1}"
            }
            , Text = {
                Text = Msg(player, BtnAccept), Font = "robotocondensed-regular.ttf", FontSize = 15, Align = TextAnchor.MiddleCenter, Color = "0.8862745 0.8588235 0.827451 1"
            }
            , RectTransform = {
                AnchorMin = "0.5 0", AnchorMax = "0.5 0", OffsetMin = "10 20", OffsetMax = "140 62"
            }
        }
        , Layer + ".Main");
#endregion Btn.Accept
#region Btn.Go.Back
        container.Add(new CuiButton {
            RectTransform = {
                AnchorMin = "0.5 0", AnchorMax = "0.5 0", OffsetMin = "-140 20", OffsetMax = "-10 62"
            }
            , Text = {
                Text = Msg(player, BtnGoBack), Font = "robotocondensed-regular.ttf", FontSize = 15, Align = TextAnchor.MiddleCenter, Color = "0.8862745 0.8588235 0.827451 0.6"
            }
            , Button = {
                Color = "0.145098 0.145098 0.145098 1", Command = $"{CmdMainConsole} change_step {step - 1}"
            }
        }
        , Layer + ".Main");
#endregion Btn.Go.Back
    }
    private static void LoopPreConfigFields(BasePlayer player, CuiElementContainer container) {
        var panelInstaller = PanelInstaller.Get(player.userID);
        var offsetX = 0;
        var offsetY = 0;
        for (var i = 0; i < panelInstaller.Fields.Count; i++) {
            var panelField = panelInstaller.Fields[i];
            container.Add(new CuiPanel {
                Image = {
                    Color = "0 0 0 0"
                }
                , RectTransform = {
                    AnchorMin = "0 1", AnchorMax = "0 1", OffsetMin = $"{offsetX} {offsetY - PreConfig_Field_Height}", OffsetMax = $"{offsetX + PreConfig_Field_Width} {offsetY}"
                }
            }
            , Layer + ".ScrollView", Layer + $".Fields.{i}", Layer + $".Fields.{i}");
#region Title
            container.Add(new CuiElement {
                Parent = Layer + $".Fields.{i}", Components = {
                    new CuiTextComponent {
                        Text = panelField.Title, Font = "robotocondensed-regular.ttf", FontSize = 12, Align = TextAnchor.UpperLeft, Color = "0.8862745 0.8588235 0.827451 0.5019608"
                    }
                    , new CuiRectTransformComponent {
                        AnchorMin = "0 0", AnchorMax = "1 1", OffsetMin = "0 42", OffsetMax = "0 0"
                    }
                }
            }
            );
#endregion Title
#region Input.Panel
            container.Add(new CuiPanel {
                Image = {
                    Color = "0.572549 0.572549 0.572549 0.2"
                }
                , RectTransform = {
                    AnchorMin = "0 0", AnchorMax = "1 1", OffsetMin = "0 0", OffsetMax = "0 -23"
                }
            }
            , Layer + $".Fields.{i}", Layer + $".Fields.{i}.Input.Panel");
#region Value
            container.Add(new CuiElement {
                Parent = Layer + $".Fields.{i}.Input.Panel", Components = {
                    new CuiInputFieldComponent {
                        Text = $"{panelField.Value}", Font = "robotocondensed-regular.ttf", FontSize = 14, Align = TextAnchor.MiddleLeft, Color = HexToCuiColor("#FFFFFF"), Command = $"{CmdMainConsole} set_field {panelField.Key}", HudMenuInput = true, NeedsKeyboard = true
                    }
                    , new CuiRectTransformComponent {
                        AnchorMin = "0 0", AnchorMax = "1 1", OffsetMin = "15 0", OffsetMax = "0 0"
                    }
                }
            }
            );
#endregion Value
#endregion Input.Panel
#region Calculate Position
            if ((i + 1) % 3 == 0) {
                offsetX = 0;
                offsetY = offsetY - PreConfig_Field_Height - PreConfig_Field_Margin_Y;
            }
            else {
                offsetX += PreConfig_Field_Width + PreConfig_Field_Margin_X;
            }
#endregion
        }
    }
    private void ShowSelectTemplateStep(BasePlayer player, CuiElementContainer container, int step) {
        var panelInstaller = PanelInstaller.Get(player.userID);
        if (panelInstaller == null) return;
        var templateLines = Mathf.CeilToInt(_allTemplates.Count / 3f);
        var totalHeight = templateLines * UI_Installer_Template_Height + (templateLines - 1) * UI_Installer_Template_Margin_Y;
        totalHeight += 100;
        var scrollWidth = UI_Installer_Template_Width * 3 + UI_Installer_Template_Margin_X * 2;
#region Background
        container.Add(new CuiPanel {
            Image = {
                Color = "0 0 0 0"
            }
            , RectTransform = {
                AnchorMin = "0 0.5", AnchorMax = "1 0.5", OffsetMin = "0 -360", OffsetMax = "0 248"
            }
        }
        , Layer, Layer + ".Main", Layer + ".Main");
#endregion
#region Label.Message
        container.Add(new CuiElement {
            Parent = Layer + ".Main", Components = {
                new CuiTextComponent {
                    Text = Msg(player, UISelectTemplateDescription), Font = "robotocondensed-regular.ttf", FontSize = 16, Align = TextAnchor.UpperCenter, Color = "0.8862745 0.8588235 0.827451 1"
                }
                , new CuiRectTransformComponent {
                    AnchorMin = "0 0", AnchorMax = "1 1", OffsetMin = "50 476", OffsetMax = "-50 -60"
                }
            }
        }
        );
#endregion Label.Message
#region Line
        container.Add(new CuiPanel {
            Image = {
                Color = HexToCuiColor("#373737", 50)
            }
            , RectTransform = {
                AnchorMin = "0.5 1", AnchorMax = "0.5 1", OffsetMin = $"-{Math.Round(scrollWidth / 2f, 2)} -159", OffsetMax = $"{Math.Round(scrollWidth / 2f, 2)} -157"
            }
        }
        , Layer + ".Main");
#endregion Line
#region ScrollView
        container.Add(new CuiPanel {
            Image = {
                Color = "0 0 0 0"
            }
            , RectTransform = {
                AnchorMin = "0.5 1", AnchorMax = "0.5 1", OffsetMin = $"-{Math.Round(scrollWidth / 2f, 2)} -597", OffsetMax = $"{Math.Round(scrollWidth / 2f, 2) + 17} -181"
            }
        }
        , Layer + ".Main", Layer + ".ScrollBackground");
        container.Add(new CuiElement {
            Parent = Layer + ".ScrollBackground", Name = Layer + ".ScrollView", DestroyUi = Layer + ".ScrollView", Components = {
                new CuiImageComponent {
                    Color = "0 0 0 0"
                }
                , new CuiScrollViewComponent {
                    MovementType = ScrollRect.MovementType.Clamped, Vertical = true, Inertia = true, Horizontal = false, Elasticity = 0.25f, DecelerationRate = 0.3f, ScrollSensitivity = 24f, ContentTransform = new CuiRectTransform {
                        AnchorMin = "0 1", AnchorMax = "1 1", OffsetMin = $"0 -{totalHeight}", OffsetMax = "0 0"
                    }
                    , VerticalScrollbar = new CuiScrollbar {
                        Size = 5f, AutoHide = false, HandleColor = HexToCuiColor("#D74933")
                    }
                }
            }
        }
        );
#endregion ScrollView
#region Templates
        LoopTemplates(player, container);
#endregion
#region Hover
        container.Add(new CuiElement {
            Name = Layer + ".Hover", Parent = Layer + ".Main", Components = {
                new CuiRawImageComponent {
                    Color = "0 0 0 1", Sprite = "assets/content/ui/UI.Background.Transparent.Linear.psd"
                }
                , new CuiRectTransformComponent {
                    AnchorMin = "0 0", AnchorMax = "1 0", OffsetMin = "0 0", OffsetMax = "0 105"
                }
            }
        }
        );
#endregion Hover
#region Btn.Start.Install
        container.Add(new CuiButton {
            Button = {
                Material = "assets/content/ui/namefontmaterial.mat", Color = "0 0.372549 0.7176471 1", Command = $"{CmdMainConsole} change_step {step + 1}"
            }
            , Text = {
                Text = Msg(player, BtnContinueInstalling), Font = "robotocondensed-regular.ttf", FontSize = 15, Align = TextAnchor.MiddleCenter, Color = "0.8862745 0.8588235 0.827451 1"
            }
            , RectTransform = {
                AnchorMin = "0.5 0", AnchorMax = "0.5 0", OffsetMin = "10 20", OffsetMax = "140 62"
            }
        }
        , Layer + ".Main");
#endregion Btn.Start.Install
#region Btn.Go.Back
        container.Add(new CuiButton {
            RectTransform = {
                AnchorMin = "0.5 0", AnchorMax = "0.5 0", OffsetMin = "-140 20", OffsetMax = "-10 62"
            }
            , Text = {
                Text = Msg(player, BtnGoBack), Font = "robotocondensed-regular.ttf", FontSize = 15, Align = TextAnchor.MiddleCenter, Color = "0.8862745 0.8588235 0.827451 0.6"
            }
            , Button = {
                Material = "assets/content/ui/namefontmaterial.mat", Color = "0.145098 0.145098 0.145098 1", Command = $"{CmdMainConsole} change_step {step - 1}"
            }
        }
        , Layer + ".Main");
#endregion Btn.Go.Back
#region Btn.Clean.Installation
        container.Add(new CuiElement {
            Name = Layer + ".Btn.Clean.Installation", Parent = Layer + ".Main", Components = {
                new CuiButtonComponent {
                    Color = HexToCuiColor("#FFFFFF", 80), Command = $"{CmdMainConsole} toggle_clean_install"
                }
                , new CuiRectTransformComponent {
                    AnchorMin = "0.5 0", AnchorMax = "0.5 0", OffsetMin = "-550 30", OffsetMax = "-528 52"
                }
            }
        }
        );
        if (panelInstaller.CleanInstall) container.Add(new CuiElement {
            Parent = Layer + ".Btn.Clean.Installation", Components = {
                new CuiImageComponent {
                    Color = HexToCuiColor("#E44028")
                }
                , new CuiRectTransformComponent {
                    AnchorMin = "0.5 0.5", AnchorMax = "0.5 0.5", OffsetMin = "-9 -9", OffsetMax = "9 9"
                }
            }
        }
        );
        else container.Add(new CuiElement {
            Parent = Layer + ".Btn.Clean.Installation", Components = {
                new CuiImageComponent {
                    Color = HexToCuiColor("#252525")
                }
                , new CuiRectTransformComponent {
                    AnchorMin = "0.5 0.5", AnchorMax = "0.5 0.5", OffsetMin = "-10 -10", OffsetMax = "10 10"
                }
            }
        }
        );
        container.Add(new CuiElement {
            Parent = Layer + ".Btn.Clean.Installation", Components = {
                new CuiTextComponent {
                    Text = Msg(player, UICleanInstall), Font = "robotocondensed-bold.ttf", FontSize = 14, Align = TextAnchor.MiddleLeft, Color = HexToCuiColor("#FFFFFF", 80)
                }
                , new CuiRectTransformComponent {
                    AnchorMin = "0 1", AnchorMax = "0 1", OffsetMin = "30 -32", OffsetMax = "360 10"
                }
            }
        }
        );
#endregion Btn.Clean.Installation
    }
    private void LoopTemplates(BasePlayer player, CuiElementContainer container) {
        var panelInstaller = PanelInstaller.Get(player.userID);
        var offsetX = 0;
        var offsetY = 0;
        for (var i = 0; i < _allTemplates.Count; i++) {
            var panelTemplate = _allTemplates[i];
            var isSelected = panelInstaller.SelectedTemplate == i;
            container.Add(new CuiElement {
                Name = Layer + $".Templates.{i}", DestroyUi = Layer + $".Templates.{i}", Parent = Layer + ".ScrollView", Components = {
                    new CuiImageComponent {
                        Color = "0 0 0 0"
                    }
                    , new CuiRectTransformComponent {
                        AnchorMin = "0 1", AnchorMax = "0 1", OffsetMin = $"{offsetX} {offsetY - UI_Installer_Template_Height}", OffsetMax = $"{offsetX + UI_Installer_Template_Width} {offsetY}"
                    }
                }
            }
            );
#region Banner Image
            container.Add(new CuiElement {
                Parent = Layer + $".Templates.{i}", Components = {
                    new CuiRawImageComponent {
                        Png = GetImage(panelTemplate.BannerURL)
                    }
                    , new CuiRectTransformComponent {
                        AnchorMin = "0.5 0", AnchorMax = "0.5 0", OffsetMin = "-175 0", OffsetMax = "175 160"
                    }
                }
            }
            );
#endregion
#region Outline
            container.Add(new CuiElement {
                Parent = Layer + $".Templates.{i}", Components = {
                    new CuiRawImageComponent {
                        Png = GetImage(isSelected ? "ServerPanel_Installer_BannerOutline_Selected" : "ServerPanel_Installer_BannerOutline")
                    }
                    , new CuiRectTransformComponent {
                        AnchorMin = "0 0", AnchorMax = "1 1", OffsetMin = "0 0", OffsetMax = "0 0"
                    }
                }
            }
            );
#endregion
#region Title
            container.Add(new CuiElement {
                Parent = Layer + $".Templates.{i}", Components = {
                    new CuiTextComponent {
                        Text = panelTemplate.Title, Font = "robotocondensed-regular.ttf", FontSize = 15, Align = TextAnchor.MiddleLeft, Color = "0.8862745 0.8588235 0.827451 1"
                    }
                    , new CuiRectTransformComponent {
                        AnchorMin = "0 0", AnchorMax = "1 1", OffsetMin = "58 160", OffsetMax = "0 0"
                    }
                }
            }
            );
#endregion
#region Button
            container.Add(new CuiElement {
                Parent = Layer + $".Templates.{i}", Components = {
                    new CuiButtonComponent {
                        Color = "0 0 0 0", Command = $"{CmdMainConsole} select_template {i}"
                    }
                    , new CuiRectTransformComponent()
                }
            }
            );
#endregion
#region Calculate Position
            if ((i + 1) % 3 == 0) {
                offsetX = 0;
                offsetY = offsetY - UI_Installer_Template_Height - UI_Installer_Template_Margin_Y;
            }
            else {
                offsetX += UI_Installer_Template_Width + UI_Installer_Template_Margin_X;
            }
#endregion
        }
    }
    private const int Dependency_Height = 58, Dependency_Margin_Y = 12;
    private void ShowDependenciesStep(BasePlayer player, CuiElementContainer container, int step) {
#region Background
        container.Add(new CuiPanel {
            Image = {
                Color = "0 0 0 0"
            }
            , RectTransform = {
                AnchorMin = "0 0.5", AnchorMax = "1 0.5", OffsetMin = "0 -360", OffsetMax = "0 248"
            }
        }
        , Layer, Layer + ".Main", Layer + ".Main");
#endregion
#region Label.Message
        container.Add(new CuiElement {
            Parent = Layer + ".Main", Components = {
                new CuiTextComponent {
                    Text = Msg(player, UIDependenciesDescription), Font = "robotocondensed-regular.ttf", FontSize = 16, Align = TextAnchor.UpperCenter, Color = "0.8862745 0.8588235 0.827451 1"
                }
                , new CuiRectTransformComponent {
                    AnchorMin = "0.5 0.5", AnchorMax = "0.5 0.5", OffsetMin = "-400 171", OffsetMax = "400 244"
                }
            }
        }
        );
#endregion Label.Message
#region Line
        container.Add(new CuiPanel {
            Image = {
                Color = "0.2156863 0.2156863 0.2156863 0.5019608"
            }
            , RectTransform = {
                AnchorMin = "0 1", AnchorMax = "1 1", OffsetMin = "280 -135", OffsetMax = "-280 -133"
            }
        }
        , Layer + ".Main");
#endregion Line
#region ScrollView
        var totalHeight = GetInstallerDependencies().Count * Dependency_Height + (GetInstallerDependencies().Count - 1) * Dependency_Margin_Y;
        totalHeight += 100;
        container.Add(new CuiPanel {
            Image = {
                Color = "0 0 0 0"
            }
            , RectTransform = {
                AnchorMin = "0.5 0.5", AnchorMax = "0.5 0.5", OffsetMin = "-360 -262", OffsetMax = "377 148"
            }
        }
        , Layer + ".Main", Layer + ".ScrollBackground", Layer + ".ScrollBackground");
        container.Add(new CuiElement {
            Parent = Layer + ".ScrollBackground", Name = Layer + ".ScrollView", DestroyUi = Layer + ".ScrollView", Components = {
                new CuiScrollViewComponent {
                    MovementType = ScrollRect.MovementType.Elastic, Vertical = true, Inertia = true, Horizontal = false, Elasticity = 0.25f, DecelerationRate = 0.3f, ScrollSensitivity = 24f, ContentTransform = new CuiRectTransform {
                        AnchorMin = "0 1", AnchorMax = "1 1", OffsetMin = $"0 -{totalHeight}", OffsetMax = "0 0"
                    }
                    , VerticalScrollbar = new CuiScrollbar {
                        Size = 5f, AutoHide = false, HandleColor = HexToCuiColor("#D74933")
                    }
                }
            }
        }
        );
#endregion ScrollView
#region Dependencies
        var mainOffset = 0;
        foreach (var panelDependency in GetInstallerDependencies().OrderByDescending(panelDependency => panelDependency, new PanelDependencyComparer())) {
            var status = panelDependency.GetStatus();
            container.Add(new CuiPanel {
                Image = {
                    Color = "0.572549 0.572549 0.572549 0.2"
                }
                , RectTransform = {
                    AnchorMin = "0 1", AnchorMax = "0 1", OffsetMin = $"0 {mainOffset - Dependency_Height}", OffsetMax = $"720 {mainOffset}"
                }
            }
            , Layer + ".ScrollView", Layer + $".Dependencies.{panelDependency.PluginName}", Layer + $".Dependencies.{panelDependency.PluginName}");
#region Title
            container.Add(new CuiElement {
                Parent = Layer + $".Dependencies.{panelDependency.PluginName}", Components = {
                    new CuiTextComponent {
                        Text = panelDependency.PluginName, Font = "robotocondensed-bold.ttf", FontSize = 15, Align = TextAnchor.MiddleLeft, Color = HexToCuiColor("#E2DBD3")
                    }
                    , new CuiRectTransformComponent {
                        AnchorMin = "0 0", AnchorMax = "1 1", OffsetMin = "46 0", OffsetMax = "-495 0"
                    }
                }
            }
            );
#endregion
#region Status.Icon
            var colorIcon = GetColorFromDependencyStatus(status);
            container.Add(new CuiElement {
                Parent = Layer + $".Dependencies.{panelDependency.PluginName}", Components = {
                    new CuiRawImageComponent {
                        Color = colorIcon, Sprite = "assets/content/ui/Waypoint.Outline.TeamTop.png"
                    }
                    , new CuiRectTransformComponent {
                        AnchorMin = "0 0.5", AnchorMax = "0 0.5", OffsetMin = "18 -9", OffsetMax = "36 9"
                    }
                }
            }
            );
#endregion Status.Icon
#region Status.Title
            container.Add(new CuiElement {
                Parent = Layer + $".Dependencies.{panelDependency.PluginName}", Components = {
                    new CuiTextComponent {
                        Text = panelDependency.Messages[status].Title, Font = "robotocondensed-bold.ttf", FontSize = 14, Align = TextAnchor.LowerLeft, Color = HexToCuiColor("#E2DBD3")
                    }
                    , new CuiRectTransformComponent {
                        AnchorMin = "0 0", AnchorMax = "1 1", OffsetMin = "250 26", OffsetMax = "0 0"
                    }
                }
            }
            );
#endregion Status.Title
#region Status.Description
            container.Add(new CuiElement {
                Parent = Layer + $".Dependencies.{panelDependency.PluginName}", Components = {
                    new CuiInputFieldComponent {
                        Text = panelDependency.Messages[status].Description, ReadOnly = true, Font = "robotocondensed-regular.ttf", FontSize = 12, Align = TextAnchor.UpperLeft, Color = HexToCuiColor("#E2DBD3", 50)
                    }
                    , new CuiRectTransformComponent {
                        AnchorMin = "0 0", AnchorMax = "1 1", OffsetMin = "250 0", OffsetMax = "0 -35"
                    }
                }
            }
            );
#endregion Status.Description
#region Line
            container.Add(new CuiPanel {
                Image = {
                    Color = "0.2156863 0.2156863 0.2156863 1"
                }
                , RectTransform = {
                    AnchorMin = "0 0", AnchorMax = "0 1", OffsetMin = "224 9", OffsetMax = "226 -13"
                }
            }
            , Layer + $".Dependencies.{panelDependency.PluginName}");
#endregion
            mainOffset = mainOffset - Dependency_Height - Dependency_Margin_Y;
        }
#endregion
#region Hover
        container.Add(new CuiElement {
            Name = Layer + ".Hover", Parent = Layer + ".Main", Components = {
                new CuiRawImageComponent {
                    Color = "0 0 0 1", Sprite = "assets/content/ui/UI.Background.Transparent.Linear.psd"
                }
                , new CuiRectTransformComponent {
                    AnchorMin = "0 0", AnchorMax = "1 0", OffsetMin = "0 0", OffsetMax = "0 105"
                }
            }
        }
        );
#endregion Hover
#region Btn.Start.Install
        container.Add(new CuiButton {
            Button = {
                Material = "assets/content/ui/namefontmaterial.mat", Color = "0 0.372549 0.7176471 1", Command = $"{CmdMainConsole} change_step {step + 1}"
            }
            , Text = {
                Text = Msg(player, BtnContinueInstalling), Font = "robotocondensed-regular.ttf", FontSize = 15, Align = TextAnchor.MiddleCenter, Color = "0.8862745 0.8588235 0.827451 1"
            }
            , RectTransform = {
                AnchorMin = "0.5 0", AnchorMax = "0.5 0", OffsetMin = "10 20", OffsetMax = "140 62"
            }
        }
        , Layer + ".Main");
#endregion Btn.Start.Install
#region Btn.Go.Back
        container.Add(new CuiButton {
            RectTransform = {
                AnchorMin = "0.5 0", AnchorMax = "0.5 0", OffsetMin = "-140 20", OffsetMax = "-10 62"
            }
            , Text = {
                Text = Msg(player, BtnGoBack), Font = "robotocondensed-regular.ttf", FontSize = 15, Align = TextAnchor.MiddleCenter, Color = "0.8862745 0.8588235 0.827451 0.6"
            }
            , Button = {
                Material = "assets/content/ui/namefontmaterial.mat", Color = "0.145098 0.145098 0.145098 1", Command = $"{CmdMainConsole} change_step {step - 1}"
            }
        }
        , Layer + ".Main");
#endregion Btn.Go.Back
    }
    private void ShowWelcomeStep(BasePlayer player, CuiElementContainer container, int step) {
#region Background
        container.Add(new CuiPanel {
            Image = {
                Color = "0 0 0 0"
            }
            , RectTransform = {
                AnchorMin = "0 0.5", AnchorMax = "1 0.5", OffsetMin = "0 -360", OffsetMax = "0 248"
            }
        }
        , Layer, Layer + ".Main", Layer + ".Main");
#endregion
#region Label.Welcome
        container.Add(new CuiElement {
            Parent = Layer + ".Main", Components = {
                new CuiTextComponent {
                    Text = Msg(player, UIWelcome), Font = "robotocondensed-regular.ttf", FontSize = 32, Align = TextAnchor.MiddleCenter, Color = "0.8862745 0.8588235 0.827451 1"
                }
                , new CuiRectTransformComponent {
                    AnchorMin = "0.5 0.5", AnchorMax = "0.5 0.5", OffsetMin = "-400 196", OffsetMax = "400 252"
                }
            }
        }
        );
#endregion Label.Welcome
#region Label.Thank.For.Buy
        container.Add(new CuiElement {
            Parent = Layer + ".Main", Components = {
                new CuiTextComponent {
                    Text = Msg(player, UIThankForBuying), Font = "robotocondensed-regular.ttf", FontSize = 16, Align = TextAnchor.UpperCenter, Color = "0.8862745 0.8588235 0.827451 1"
                }
                , new CuiRectTransformComponent {
                    AnchorMin = "0.5 0.5", AnchorMax = "0.5 0.5", OffsetMin = "-400 -84", OffsetMax = "400 151"
                }
            }
        }
        );
#endregion Label.Thank.For.Buy
#region Btn.Start.Install
        container.Add(new CuiButton {
            Button = {
                Material = "assets/content/ui/namefontmaterial.mat", Color = "0 0.372549 0.7176471 1", Command = $"{CmdMainConsole} change_step {step + 1}"
            }
            , Text = {
                Text = Msg(player, BtnStartInstall), Font = "robotocondensed-regular.ttf", FontSize = 15, Align = TextAnchor.MiddleCenter, Color = "0.8862745 0.8588235 0.827451 1"
            }
            , RectTransform = {
                AnchorMin = "0.5 0.5", AnchorMax = "0.5 0.5", OffsetMin = "-120 -96", OffsetMax = "120 -36"
            }
        }
        , Layer + ".Main");
#endregion Btn.Start.Install
#region Btn.Cancel
        container.Add(new CuiPanel {
            Image = {
                Color = "0 0 0 0"
            }
            , RectTransform = {
                AnchorMin = "0.5 0.5", AnchorMax = "0.5 0.5", OffsetMin = "-120 -151", OffsetMax = "120 -121"
            }
        }
        , Layer + ".Main", Layer + ".Btn.Cancel");
#region Title
        container.Add(new CuiElement {
            Parent = Layer + ".Btn.Cancel", Components = {
                new CuiTextComponent {
                    Text = Msg(player, BtnCancelAndClose), Font = "robotocondensed-regular.ttf", FontSize = 14, Align = TextAnchor.MiddleCenter, Color = "0.8862745 0.8588235 0.827451 0.5019608"
                }
                , new CuiRectTransformComponent {
                    AnchorMin = "0 0", AnchorMax = "1 1", OffsetMin = "22 0", OffsetMax = "0 0"
                }
            }
        }
        );
#endregion Title
#region Icon
        container.Add(new CuiElement {
            Parent = Layer + ".Btn.Cancel", Components = {
                new CuiImageComponent {
                    Color = "0.8862745 0.8588235 0.827451 0.5019608", Sprite = "assets/icons/close.png"
                }
                , new CuiRectTransformComponent {
                    AnchorMin = "0.5 0.5", AnchorMax = "0.5 0.5", OffsetMin = "-112 -7", OffsetMax = "-98 7"
                }
            }
        }
        );
#endregion Icon
#region Button
        container.Add(new CuiElement {
            Parent = Layer + ".Btn.Cancel", Components = {
                new CuiButtonComponent {
                    Color = "0 0 0 0", Command = $"{CmdMainConsole} cancel", Close = Layer
                }
                , new CuiRectTransformComponent()
            }
        }
        );
#endregion Button
#endregion Btn.Cancel
#region Line
        container.Add(new CuiPanel {
            Image = {
                Color = "0.2156863 0.2156863 0.2156863 0.5019608"
            }
            , RectTransform = {
                
// ... [Code preview truncated due to length. Full source in attached file] ...

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