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

FREE Promocodes : 1.0.1 1.0.1

Нет прав для скачивания
C#:
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Text;
using ConVar;
using Newtonsoft.Json;
using Newtonsoft.Json.Converters;
using Oxide.Core;
using Oxide.Core.Plugins;
using Oxide.Game.Rust.Cui;
using Rust;
using UnityEngine;
using Console = System.Console;
using Random = Oxide.Core.Random;

#nullable disable

namespace Oxide.Plugins
{
    [Info("Promocodes", "codeboy", "1.0.1")]
    class Promocodes : RustPlugin
    {
        #region Class

        private class PlayerDataPreform
        {
            public ulong TargetID;
            public PlayerData data;

            public PlayerDataPreform(ulong target, PlayerData data)
            {
                TargetID = target;
                this.data = new()
                {
                    CanUsePromocodes = data.CanUsePromocodes,
                    UsedPromocodes = data.UsedPromocodes,
                    LastSeenDisplayName = data.LastSeenDisplayName
                };
            }
        }

        private class ItemData
        {
            [JsonProperty(Order = 0)] public string Shortname;
            [JsonProperty("Skin", Order = 1)] public ulong SkinID;
            [JsonProperty(Order = 2)] public int Amount;

            [JsonProperty("Display name (still empty if not need to change)", Order = 4)]
            public string DisplayName;

            public Item ToItem()
            {
                Item item = ItemManager.CreateByName(Shortname, Amount, SkinID);
                if (!string.IsNullOrEmpty(DisplayName))
                    item.name = DisplayName;

                var heldEntity = item.GetHeldEntity();
                if (heldEntity != null)
                    heldEntity.SendNetworkUpdate();
                return item;
            }
        }

        private class PlayerData
        {
            public bool CanUsePromocodes = true;
            public TimeUntil nextUsage = 0;
            public List<string> UsedPromocodes = new List<string>();
            public string LastSeenDisplayName = "";

            public void SetCooldown(int cooldown)
            {
                nextUsage = cooldown;
            }

            public int GetCooldown() => (int)nextUsage;
            public bool IsOnCooldown() => GetCooldown() > 0;

            public InputResponse GetStatusForPromocode(string code)
            {
                if (!CanUsePromocodes)
                    return InputResponse.CantUsePromocodes;
                if (UsedPromocodes.Contains(code))
                    return InputResponse.AlreadyUsed;
                if (IsOnCooldown())
                    return InputResponse.OnCooldown;
                return InputResponse.Ok;
            }

            public void SetTaked(string code)
            {
                UsedPromocodes.Add(code);
            }
        }

        private class PromocodeReward
        {
            [JsonConverter(typeof(StringEnumConverter))] [JsonProperty("Reward type (Item, Command)", Order = 0)]
            public RewardType RewardType;

            [JsonProperty("Command -> %STEAMID% - userid | (if type is Command)", Order = 2)]
            public string Command;

            [JsonProperty("Items (if type is Item)", Order = 3)]
            public List<ItemData> Items;
        }

        private class PromocodePreform : Promocode
        {
            public string Key;
        }

        private class Promocode
        {
            [JsonProperty("Promocode name", Order = 0)]
            public string Name;

            [JsonProperty("Number of uses", Order = 1)]
            public int NumberOfUses;

            [JsonProperty("Expiring time", Order = 2)]
            public int ExpiringTime;

            [JsonProperty("Enabled", Order = 3)] public bool Enabled;
            [JsonProperty(Order = 4)] public PromocodeReward Reward;


            public static PromocodePreform CopyToPreform(Promocode promocode, string key)
            {
                PromocodePreform promo = new()
                {
                    Key = key,
                    Name = promocode.Name,
                    NumberOfUses = promocode.NumberOfUses,
                    ExpiringTime = promocode.ExpiringTime,
                    Enabled = promocode.Enabled,
                    Reward = promocode.Reward
                };
                return promo;
            }
        }

        #endregion

        #region Variables

        [PluginReference] private Plugin ImageLibrary;

        public static Promocodes Instance;
        private const string PERM_ADMINSETTINGS = "promocodes.admin";
        private const string Layer = "ui.Promocodes";
        private static readonly DateTime epoch = new DateTime(1970, 1, 1, 0, 0, 0);
        private static int CurrentTime() => (int)DateTime.Now.Subtract(epoch).TotalSeconds;
        private Dictionary<ulong, PlayerData> _players = new();
        private Dictionary<string, Promocode> _promocodes = new();
        private Dictionary<ulong, string> _promocodeInputs = new();
        private Dictionary<string, int> _promocodeUsages = new();

        private Dictionary<BasePlayer, PromocodePreform> _promocodePreforms = new();
        private Dictionary<BasePlayer, PlayerDataPreform> _playerDataPreforms = new();

        private Dictionary<BasePlayer, Dictionary<string, ItemData>> _itemPreforms = new();

        private const int PLAYERS_PER_PAGE = 21;
        private const int PROMOCODES_PER_PAGE = 6;
        private const int ITEMS_PER_PAGE = 28;

        private enum InputResponse : byte
        {
            Ok = 0,
            NotExists = 1,
            CantUsePromocodes = 2,
            AlreadyUsed = 3,
            OnCooldown = 4,
            Expired = 5
        }

        private enum RewardType : byte
        {
            Item = 0,
            Command = 1
        }

        private enum SettingType : byte
        {
            CanUsePromocode = 0,
            EnabledPromocode = 1
        }

        #endregion

        private void OnPlayerDisconnected(BasePlayer player)
        {
            _playerDataPreforms.Remove(player);
            _promocodePreforms.Remove(player);
        }

        private void OnPlayerConnected(BasePlayer player)
        {
            if (!_players.ContainsKey(player.userID))
                _players.Add(player.userID, new());
            _players[player.userID].LastSeenDisplayName = player.displayName;
        }

        private void OnServerInitialized()
        {
            LoadData();
            foreach (var x in cfg.Commands)
                cmd.AddChatCommand(x, this, nameof(cmdOpen));

            permission.RegisterPermission(PERM_ADMINSETTINGS, this);
            foreach (var x in BasePlayer.activePlayerList)
                OnPlayerConnected(x);
        }

        private void Unload()
        {
            SaveData();
            foreach (var x in BasePlayer.activePlayerList)
            {
                CuiHelper.DestroyUi(x, Layer);
                CuiHelper.DestroyUi(x, Layer + ".blur.playersettings");
                CuiHelper.DestroyUi(x, Layer + ".blur");
            }
        }

        private void OnServerSave() => SaveData();

        #region Methods

        private void GiveReward(BasePlayer player, Promocode promocode)
        {
            var reward = promocode.Reward;
            switch (reward.RewardType)
            {
                case RewardType.Command:
                {
                    Server.Command(reward.Command.Replace("%STEAMID%", player.UserIDString));
                    break;
                }
                case RewardType.Item:
                {
                    foreach (var x in reward.Items)
                    {
                        var item = x.ToItem();

                        if (!player.inventory.GiveItem(item))
                        {
                            item.Drop(player.GetDropPosition(), player.GetDropVelocity());
                            player.ChatMessage(GetMsg("chat.reward.itemdropped", player.userID));
                        }
                    }

                    break;
                }
            }

            player.ChatMessage(GetMsg("chat.reward.received", player.userID));
        }

        private InputResponse VerifyPromo(BasePlayer player, string promocode, out Promocode promo)
        {
            promo = null!;
            if (string.IsNullOrEmpty(promocode))
                return InputResponse.NotExists;
            
            var promoKV = _promocodes.FirstOrDefault(x => x.Value.Name == promocode);
            promo = promoKV.Value;
            if (promo == null)
                return InputResponse.NotExists;

            if (!promo.Enabled)
                return InputResponse.NotExists;

            if (PromoIsExpired(promoKV.Key))
                return InputResponse.Expired;

            return _players[player.userID].GetStatusForPromocode(promocode);
        }

        private bool PromoIsExpired(string key)
        {
            if (!_promocodes.TryGetValue(key, out var promo))
                return true;


            if (!promo.Enabled)
                return true;

            if (promo.ExpiringTime <= CurrentTime())
                return true;

            if (promo.NumberOfUses > 0)
            {
                if (!_promocodeUsages.TryGetValue(key, out var usages))
                {
                    _promocodeUsages.Add(key, 0);
                    usages = 0;
                }

                if (promo.NumberOfUses <= usages)
                    return true;
            }

            return false;
        }

        private bool PromoUsesLimitReached(string key)
        {
            if (!_promocodes.TryGetValue(key, out var promo))
                return true;

            if (promo.NumberOfUses > 0)
            {
                if (!_promocodeUsages.TryGetValue(key, out var usages))
                {
                    _promocodeUsages.Add(key, 0);
                    usages = 0;
                }

                if (promo.NumberOfUses <= usages)
                    return true;
            }

            return false;
        }

        private void CreateNewPromocode(Promocode preform)
        {
            _promocodes.Add(Guid.NewGuid().ToString(), preform);
        }

        private void cmdOpen(BasePlayer player)
        {
            _promocodeInputs.Remove(player.userID);
            _promocodePreforms.Remove(player);
            CuiHelper.DestroyUi(player, Layer);
            CuiHelper.DestroyUi(player, Layer + ".blur");

            UI_DrawMain(player);
        }

        [ConsoleCommand("p.removepromoitem")]
        private void cmdRemovePromoItem(ConsoleSystem.Arg arg)
        {
            if (arg.Player() == null || arg.Args.IsNullOrEmpty())
                return;

            string key = arg.Args[0];
            var player = arg.Player();

            if (!_itemPreforms.ContainsKey(player))
                return;
            _itemPreforms[player].Remove(key);
            cmdCancelEdit(arg);
            UI_DrawPromocodeItemsEditorPreviewItemsList(player, needFadein: false);
            UI_DrawPromocodeItemsEditorPreviewPages(player);
        }

        [ConsoleCommand("p.canceledit")]
        private void cmdCancelEdit(ConsoleSystem.Arg arg)
        {
            if (arg.Player() == null)
                return;

            var player = arg.Player();

            CuiHelper.DestroyUi(player, Layer + ".main.div" + ".itemcreator.bg" + ".editor.bg");
            CuiHelper.DestroyUi(player, Layer + ".blur.itemsettings");
            UI_DrawPromocodeItemsEditorPreviewItemsList(player, needFadein: false);
            UI_DrawPromocodeItemsEditorPreviewPages(player);
        }

        [ConsoleCommand("p.edititem")]
        private void cmdEditItem(ConsoleSystem.Arg arg)
        {
            if (arg.Player() == null || arg.Args.IsNullOrEmpty())
                return;
            var player = arg.Player();

            var value = arg.Args[0];


            if (!_itemPreforms.TryGetValue(player, out var data))
                return;
            if (value == "new")
            {
                var guid = Guid.NewGuid().ToString();
                _itemPreforms[player].Add(guid, new()
                {
                    Shortname = "rock",
                    SkinID = 0,
                    Amount = 1,
                    DisplayName = ""
                });
                UI_DrawPromocodeItemsEditorPreviewItemsList(player, needFadein: false);
                UI_DrawPromocodeItemsEditorPreviewPages(player);
                return;
            }

            if (!data.ContainsKey(arg.Args[0]))
                return;

            UI_DrawPromocodeItemsEditor(arg.Player(), arg.Args[0]);
        }

        [ConsoleCommand("p.edititems")]
        private void cmdEditItems(ConsoleSystem.Arg arg)
        {
            if (arg.Player() == null)
                return;

            var player = arg.Player();
            if (!_promocodePreforms.TryGetValue(player, out var data))
                return;

            _itemPreforms.Remove(player);
            _itemPreforms.Add(player, new());
            foreach (var x in data.Reward.Items)
                _itemPreforms[player].Add(Guid.NewGuid().ToString(), x);

            UI_DrawPromocodeItemsEditorPreview(player);
            UI_DrawPromocodeItemsEditorPreviewItemsList(player);
            UI_DrawPromocodeItemsEditorPreviewPages(player);
        }

        [ConsoleCommand("p.iteminput")]
        private void cmdItemInput(ConsoleSystem.Arg arg)
        {
            if (arg.Player() == null || arg.Args.IsNullOrEmpty())
                return;

            var player = arg.Player();
            if (!_itemPreforms.ContainsKey(player))
                return;

            var guid = arg.Args[0];
            var type = arg.Args[1];
            var value = ConcatArgs(arg.Args, 2);

            switch (type)
            {
                case "shortname":

                    var def = ItemManager.FindItemDefinition(value);
                    if (def == null)
                        return;

                    _itemPreforms[player][guid].Shortname = value;
                    UI_UpdatePromocodeItemImage(player, guid);
                    break;
                case "skinid":
                    if (!ulong.TryParse(value, out var skin))
                        return;
                    UI_UpdatePromocodeItemImage(player, guid);
                    _itemPreforms[player][guid].SkinID = skin;
                    break;
                case "amount":
                    if (!int.TryParse(value, out var amount))
                        return;

                    if (amount < 1)
                        return;

                    _itemPreforms[player][guid].Amount = amount;
                    break;
                case "displayname":
                    _itemPreforms[player][guid].DisplayName = value;
                    break;
            }
        }

        [ConsoleCommand("p.confirmitems")]
        private void cmdConfirmPromoItem(ConsoleSystem.Arg arg)
        {
            if (arg.Player() == null)
                return;

            var player = arg.Player();
            if (!_itemPreforms.TryGetValue(player, out var itemData))
                return;
            if (!_promocodePreforms.ContainsKey(player))
                return;

            _promocodePreforms[player].Reward.Items.Clear();
            foreach (var x in itemData)
                _promocodePreforms[player].Reward.Items.Add(x.Value);

            cmdCancelItemsEdit(arg);
            if (_promocodePreforms[player].Reward.RewardType == RewardType.Item)
                UI_DrawPromocodeItems(player);
        }

        [ConsoleCommand("p.cancelitemsedit")]
        private void cmdCancelItemsEdit(ConsoleSystem.Arg arg)
        {
            if (arg.Player() == null)
                return;

            _itemPreforms.Remove(arg.Player());
            CuiHelper.DestroyUi(arg.Player(), Layer + ".main.div" + ".itemcreator.bg");
        }

        [ConsoleCommand("p.cancelitem")]
        private void cmdCancelItem(ConsoleSystem.Arg arg)
        {
            if (arg.Player() == null)
                return;

            var player = arg.Player();
        }

        [ConsoleCommand("p.settings")]
        private void cmdSettings(ConsoleSystem.Arg arg)
        {
            if (arg.Player() == null || arg.Args.IsNullOrEmpty())
                return;

            var player = arg.Player();

            if (!player.IPlayer.HasPermission(PERM_ADMINSETTINGS))
                return;

            if (!ulong.TryParse(arg.Args[0], out var targetid))
                return;
            if (!_players.TryGetValue(targetid, out var targetData))
                return;
            _playerDataPreforms.Remove(player);
            _playerDataPreforms.Add(player, new(targetid, targetData));
            UI_DrawPlayerSettings(player);
            UI_DrawUsedPromocodes(player);
            UI_DrawUsedPromocodesPages(player);
            UI_UpdateSetting(player, SettingType.CanUsePromocode, targetData.CanUsePromocodes);
        }

        [ConsoleCommand("p.close")]
        private void cmdClose(ConsoleSystem.Arg arg)
        {
            if (arg.Player() == null)
                return;
            CuiHelper.DestroyUi(arg.Player(), Layer);
            CuiHelper.DestroyUi(arg.Player(), Layer + ".blur");
        }

        [ConsoleCommand("p.drawadmin")]
        private void cmdDrawAdmin(ConsoleSystem.Arg arg)
        {
            if (arg.Player() == null || !arg.Player().IPlayer.HasPermission(PERM_ADMINSETTINGS))
                return;

            UI_DrawAdminSettings(arg.Player());
            UI_DrawAdminButtons(arg.Player());

            UI_DrawPlayers(arg.Player());
            UI_DrawPages(arg.Player());
        }

        [ConsoleCommand("p.button")]
        private void cmdButton(ConsoleSystem.Arg arg)
        {
            if (arg.Player() == null || arg.Args.IsNullOrEmpty())
                return;

            var player = arg.Player();
            if (!player.IPlayer.HasPermission(PERM_ADMINSETTINGS))
                return;

            string button = arg.Args[0];

            CuiHelper.DestroyUi(arg.Player(), Layer + ".main.div");
            var container = new CuiElementContainer();
            container.Add(new CuiPanel
            {
                CursorEnabled = false,
                Image = { Color = "1 1 1 0" },
                RectTransform =
                {
                    AnchorMin = "0.5 0.5", AnchorMax = "0.5 0.5", OffsetMin = "-310.97 -153.662",
                    OffsetMax = "310.97 147.736"
                }
            }, Layer, Layer + ".main.div");
            CuiHelper.AddUi(arg.Player(), container);
            switch (button)
            {
                case "promocodes":
                    UI_DrawPromocodes(player);
                    UI_DrawPromocodesList(player);
                    UI_DrawPromocodesPages(player);
                    break;
                case "players":
                    UI_DrawPlayers(player);
                    UI_DrawPages(player);
                    break;
            }

            UI_DrawAdminButtons(player, button);
        }

        [ConsoleCommand("p.input")]
        private void cmdInput(ConsoleSystem.Arg arg)
        {
            if (arg.Player() == null || arg.Args.IsNullOrEmpty())
                return;

            var player = arg.Player();

            if (!_promocodeInputs.ContainsKey(player.userID))
                _promocodeInputs.Add(player.userID, "");

            _promocodeInputs[player.userID] = string.Join(" ", arg.Args);
        }

        private void AddPromoUsage(string code)
        {
            if (string.IsNullOrEmpty(code))
                return;
            
            _promocodeUsages.TryAdd(code, 0);
            
            _promocodeUsages[code] += 1;
        }

        [ConsoleCommand("p.confirm")]
        private void cmdConfirmPromocode(ConsoleSystem.Arg arg)
        {
            if (arg.Player() == null)
                return;

            var player = arg.Player();
            if (_players[player.userID].IsOnCooldown())
            {
                UI_UpdateStatus(player, "ui.error.oncooldown",
                    FormatCooldownTime(_players[player.userID].GetCooldown()));
                return;
            }

            if (!_promocodeInputs.TryGetValue(player.userID, out var code))
                return;


            var response = VerifyPromo(player, code, out var validatedPromocode);
            _players[player.userID].SetCooldown(cfg.Cooldown);
            switch (response)
            {
                case InputResponse.Ok:
                    GiveReward(player, validatedPromocode);
                    _players[player.userID].SetTaked(code);
                    AddPromoUsage(_promocodes.FirstOrDefault(x => x.Value.Name == code).Key);
                    UI_UpdateStatus(player, "ui.reward.successreceived");
                    break;
                case InputResponse.AlreadyUsed:
                    UI_UpdateStatus(player, "ui.error.alreadyused");
                    break;
                case InputResponse.NotExists:
                    UI_UpdateStatus(player, "ui.error.notexists");
                    break;
                case InputResponse.OnCooldown:
                    UI_UpdateStatus(player, "ui.error.oncooldown",
                        FormatCooldownTime(_players[player.userID].GetCooldown()));
                    break;
                case InputResponse.CantUsePromocodes:
                    UI_UpdateStatus(player, "ui.error.cantusepromocodes");
                    break;
                case InputResponse.Expired:
                    UI_UpdateStatus(player, "ui.error.expired");
                    break;
                default:
                    throw new ArgumentOutOfRangeException("InputResponse");
            }
        }

        private string FormatCooldownTime(int remainingTime)
        {
            TimeSpan span = TimeSpan.FromSeconds(remainingTime);
            return span.ToString(@"mm\:ss");
        }

        private string FormatExpiringData(int time)
        {
            DateTime dateTime = DateTime.Now + TimeSpan.FromSeconds(time);
            return dateTime.ToString("dd.MM");
        }

        private string FormatExpiringTime(int time)
        {
            TimeSpan span = TimeSpan.FromSeconds(time);
            return span.ToString(@"hh\:mm");
        }

        #endregion

        #region Cfg

        private ConfigData cfg;

        public class ConfigData
        {
            [JsonProperty("Cooldown for promocode", Order = 0)]
            public int Cooldown;

            [JsonProperty("Commands to open UI", Order = 1)]
            public List<string> Commands;
        }

        protected override void LoadDefaultConfig()
        {
            var config = new ConfigData()
            {
                Commands = new()
                {
                    "promocode",
                    "promo",
                    "code",
                    "pc",
                    "p"
                },
                Cooldown = 65
            };
            SaveConfig(config);
        }

        protected override void LoadConfig()
        {
            base.LoadConfig();
            cfg = Config.ReadObject<ConfigData>();
            SaveConfig(cfg);
        }

        private void SaveConfig(object config)
        {
            Config.WriteObject(config, true);
        }

        #endregion

        #region UI

        private void UI_DrawAdminButtons(BasePlayer player, string active = "players")
        {
            CuiHelper.DestroyUi(player, Layer + ".buttons.div");
            var container = new CuiElementContainer();
            container.Add(new CuiPanel
            {
                CursorEnabled = false,
                Image = { Color = "1 1 1 0" },
                RectTransform =
                {
                    AnchorMin = "0.5 1", AnchorMax = "0.5 1", OffsetMin = "-310.971 -36.598",
                    OffsetMax = "310.969 0.337"
                }
            }, Layer, Layer + ".buttons.div");

            container.Add(new CuiButton
            {
                Button =
                {
                    Color = active == "players"
                        ? "0.1085371 0.03844785 0.3018868 1"
                        : "0.1773929 0.06581526 0.4811321 1",
                    Command = active == "players" ? "" : "p.button players"
                },
                Text =
                {
                    Text = GetMsg("ui.admin.sections.players", player.userID), Font = "robotocondensed-bold.ttf",
                    FontSize = 15, Align = TextAnchor.MiddleCenter,
                    Color = active == "players" ? "0.3538625 0.3001513 0.6698113 1" : "0.5499007 0.4764151 1 1"
                },
                RectTransform =
                {
                    AnchorMin = "0.5 0.5", AnchorMax = "0.5 0.5", OffsetMin = "-308 -15.858", OffsetMax = "-208 15.858"
                }
            }, Layer + ".buttons.div", Layer + ".buttons.div" + ".players.btn");

            container.Add(new CuiButton
            {
                Button =
                {
                    Color = active == "promocodes"
                        ? "0.1085371 0.03844785 0.3018868 1"
                        : "0.1773929 0.06581526 0.4811321 1",
                    Command = active == "promocodes" ? "" : "p.button promocodes"
                },
                Text =
                {
                    Text = GetMsg("ui.admin.sections.promocodes", player.userID), Font = "robotocondensed-bold.ttf",
                    FontSize = 15,
                    Align = TextAnchor.MiddleCenter,
                    Color = active == "promocodes" ? "0.3538625 0.3001513 0.6698113 1" : "0.5499007 0.4764151 1 1"
                },
                RectTransform =
                {
                    AnchorMin = "0.5 0.5", AnchorMax = "0.5 0.5", OffsetMin = "-205.7 -15.858",
                    OffsetMax = "-105.7 15.858"
                }
            }, Layer + ".buttons.div", Layer + ".buttons.div" + ".promocodes.btn");

            container.Add(new CuiButton
            {
                Button = { Color = "0.1085371 0.03844785 0.3018868 1", Command = "p.close" },
                RectTransform =
                {
                    AnchorMin = "0.5 0.5", AnchorMax = "0.5 0.5", OffsetMin = "284.234 -9.272",
                    OffsetMax = "307.897 14.392"
                }
            }, Layer + ".buttons.div", Layer + ".buttons.div" + ".close");

            container.Add(new CuiPanel
            {
                CursorEnabled = false,
                Image = { Color = "0.3538625 0.3001513 0.6698113 1", Sprite = "assets/icons/close.png" },
                RectTransform =
                    { AnchorMin = "0.5 0.5", AnchorMax = "0.5 0.5", OffsetMin = "-7.5 -7.5", OffsetMax = "7.5 7.5" }
            }, Layer + ".buttons.div" + ".close", Layer + ".buttons.div" + ".close" + ".sprite");

            CuiHelper.AddUi(player, container);
        }

        private void UI_DrawPages(BasePlayer player, int page = 0)
        {
            CuiHelper.DestroyUi(player, Layer + ".main.div" + ".pages");

            bool canNext = _players.Skip((page + 1) * PLAYERS_PER_PAGE).Count() > 0;
            bool canPrev = page > 0;

            var container = new CuiElementContainer();
            container.Add(new CuiPanel
            {
                CursorEnabled = false,
                Image = { Color = "1 1 1 0" },
                RectTransform =
                {
                    AnchorMin = "0.5 0.5", AnchorMax = "0.5 0.5", OffsetMin = "129.414 -150.694",
                    OffsetMax = "304.986 -123.866"
                }
            }, Layer + ".main.div", Layer + ".main.div" + ".pages");

            container.Add(new CuiButton
            {
                Button =
                {
                    Color = canNext ? "0.1085371 0.03844785 0.3018868 1" : "0.1085371 0.03844785 0.3018868 0.5",
                    Command = canNext ? $"p.changepage {page + 1}" : ""
                },
                Text =
                {
                    Text = GetMsg("ui.admin.pages.char.next", player.userID), Font = "robotocondensed-regular.ttf",
                    FontSize = 24, Align = TextAnchor.MiddleCenter,
                    Color = canNext ? "0.3538625 0.3001513 0.6698113 1" : "0.3538625 0.3001513 0.6698113 0.5"
                },
                RectTransform =
                    { AnchorMin = "0.5 0.5", AnchorMax = "0.5 0.5", OffsetMin = "58.372 -16", OffsetMax = "90.372 16" }
            }, Layer + ".main.div" + ".pages", Layer + ".main.div" + ".pages" + ".next");

            container.Add(new CuiButton
            {
                Button =
                {
                    Color = canPrev ? "0.1085371 0.03844785 0.3018868 1" : "0.1085371 0.03844785 0.3018868 0.5",
                    Command = canPrev ? $"p.changepage {page - 1}" : ""
                },
                Text =
                {
                    Text = GetMsg("ui.admin.pages.char.previous", player.userID), Font = "robotocondensed-regular.ttf",
                    FontSize = 24, Align = TextAnchor.MiddleCenter,
                    Color = canPrev ? "0.3538625 0.3001513 0.6698113 1" : "0.3538625 0.3001513 0.6698113 0.5"
                },
                RectTransform =
                    { AnchorMin = "0.5 0.5", AnchorMax = "0.5 0.5", OffsetMin = "-90.9 -16", OffsetMax = "-58.9 16" }
            }, Layer + ".main.div" + ".pages", Layer + ".main.div" + ".pages" + ".previous");

            container.Add(new CuiElement
            {
                Name = Layer + ".main.div" + ".pages" + ".currentPage",
                Parent = Layer + ".main.div" + ".pages",
                Components =
                {
                    new CuiTextComponent
                    {
                        Text = (page + 1).ToString(), Font = "robotocondensed-bold.ttf", FontSize = 17,
                        Align = TextAnchor.MiddleCenter, Color = "0.3538625 0.3001513 0.6698113 1"
                    },
                    new CuiRectTransformComponent
                    {
                        AnchorMin = "0.5 0.5", AnchorMax = "0.5 0.5", OffsetMin = "-58.899 -13.414",
                        OffsetMax = "58.371 13.414"
                    }
                }
            });
            CuiHelper.AddUi(player, container);
        }

        private void UI_DrawPromocodesPages(BasePlayer player, int page = 0)
        {
            CuiHelper.DestroyUi(player, Layer + ".main.div" + ".pages");

            bool canNext = _promocodes.Skip((page + 1) * PLAYERS_PER_PAGE).Any();
            bool canPrev = page > 0;

            var container = new CuiElementContainer();
            container.Add(new CuiPanel
            {
                CursorEnabled = false,
                Image = { Color = "1 1 1 0" },
                RectTransform =
                {
                    AnchorMin = "0.5 0.5", AnchorMax = "0.5 0.5", OffsetMin = "129.414 -150.694",
                    OffsetMax = "304.986 -123.866"
                }
            }, Layer + ".main.div", Layer + ".main.div" + ".pages");

            container.Add(new CuiButton
            {
                Button =
                {
                    Color = canNext ? "0.1085371 0.03844785 0.3018868 1" : "0.1085371 0.03844785 0.3018868 0.5",
                    Command = canNext ? $"p.changepromocodespage {page + 1}" : ""
                },
                Text =
                {
                    Text = GetMsg("ui.admin.pages.char.next", player.userID), Font = "robotocondensed-regular.ttf",
                    FontSize = 24, Align = TextAnchor.MiddleCenter,
                    Color = canNext ? "0.3538625 0.3001513 0.6698113 1" : "0.3538625 0.3001513 0.6698113 0.5"
                },
                RectTransform =
                    { AnchorMin = "0.5 0.5", AnchorMax = "0.5 0.5", OffsetMin = "58.372 -16", OffsetMax = "90.372 16" }
            }, Layer + ".main.div" + ".pages", Layer + ".main.div" + ".pages" + ".next");

            container.Add(new CuiButton
            {
                Button =
                {
                    Color = canPrev ? "0.1085371 0.03844785 0.3018868 1" : "0.1085371 0.03844785 0.3018868 0.5",
                    Command = canPrev ? $"p.changepromocodespage {page - 1}" : ""
                },
                Text =
                {
                    Text = GetMsg("ui.admin.pages.char.previous", player.userID), Font = "robotocondensed-regular.ttf",
                    FontSize = 24, Align = TextAnchor.MiddleCenter,
                    Color = canPrev ? "0.3538625 0.3001513 0.6698113 1" : "0.3538625 0.3001513 0.6698113 0.5"
                },
                RectTransform =
                    { AnchorMin = "0.5 0.5", AnchorMax = "0.5 0.5", OffsetMin = "-90.9 -16", OffsetMax = "-58.9 16" }
            }, Layer + ".main.div" + ".pages", Layer + ".main.div" + ".pages" + ".previous");

            container.Add(new CuiElement
            {
                Name = Layer + ".main.div" + ".pages" + ".currentPage",
                Parent = Layer + ".main.div" + ".pages",
                Components =
                {
                    new CuiTextComponent
                    {
                        Text = (page + 1).ToString(), Font = "robotocondensed-bold.ttf", FontSize = 17,
                        Align = TextAnchor.MiddleCenter, Color = "0.3538625 0.3001513 0.6698113 1"
                    },
                    new CuiRectTransformComponent
                    {
                        AnchorMin = "0.5 0.5", AnchorMax = "0.5 0.5", OffsetMin = "-58.899 -13.414",
                        OffsetMax = "58.371 13.414"
                    }
                }
            });
            CuiHelper.AddUi(player, container);
        }

        private void UI_DrawPromocodeEditItems(BasePlayer player)
        {
            var container = new CuiElementContainer();
            CuiHelper.AddUi(player, container);
        }

        private void UI_DrawPromocodeEdit(BasePlayer player)
        {
            CuiHelper.DestroyUi(player, Layer + ".main.div" + ".promocode.settings");

            if (!_promocodePreforms.TryGetValue(player, out var data))
                return;

            var container = new CuiElementContainer();
            container.Add(new CuiElement()
            {
                Name = Layer + ".blur.promocodesettings",
                Parent = Layer + ".main.div",
                Components =
                {
                    new CuiButtonComponent()
                    {
                        Color = "0 0 0 0.8",
                        Material = "assets/content/ui/uibackgroundblur-ingamemenu.mat"
                    },
                    new CuiRectTransformComponent() { AnchorMin = "-100 -100", AnchorMax = "100 100" }
                }
            });
            container.Add(new CuiPanel
            {
                CursorEnabled = false,
                Image = { Color = "0.0471698 0.0471698 0.0471698 0.6980392" },
                RectTransform =
                {
                    AnchorMin = "0.5 0.5", AnchorMax = "0.5 0.5", OffsetMin = "-123.485 -143.235",
                    OffsetMax = "123.485 143.235"
                }
            }, Layer + ".main.div", Layer + ".main.div" + ".promocode.settings");

            _promocodeUsages.TryGetValue(data.Key, out var usages);
            container.Add(new CuiElement
            {
                Name = Layer + ".main.div" + ".promocode.settings" + ".usages",
                Parent = Layer + ".main.div" + ".promocode.settings",
                Components =
                {
                    new CuiTextComponent
                    {
                        Text = GetMsg("ui.admin.promocodes.settings.usedamount", player.userID, usages),
                        Font = "robotocondensed-regular.ttf", FontSize = 13, Align = TextAnchor.UpperRight,
                        Color = "0.8078431 0.7803922 0.7411765 1"
                    },
                    new CuiRectTransformComponent
                    {
                        AnchorMin = "0.5 0.5", AnchorMax = "0.5 0.5", OffsetMin = "23.574 29.526",
                        OffsetMax = "119.211 51.9"
                    }
                }
            });
            container.Add(new CuiButton
            {
                Button = { Color = "0.1085371 0.03844785 0.3018868 1", Command = "p.canceleditpromo" },
                Text =
                {
                    Text = GetMsg("ui.admin.cancel", player.userID), Font = "robotocondensed-bold.ttf",
                    FontSize = 22, Align = TextAnchor.MiddleCenter,
                    Color = "0.3538625 0.3001513 0.6698113 1"
                },
                RectTransform =
                {
                    AnchorMin = "0.5 0.5", AnchorMax = "0.5 0.5", OffsetMin = "-123.483 -143.235",
                    OffsetMax = "-0.003 -113.334"
                }
            }, Layer + ".main.div" + ".promocode.settings", Layer + ".main.div" + ".promocode.settings" + ".cancelZmV5Zwp=");

            container.Add(new CuiButton
            {
                Button = { Color = "0.1773929 0.06581526 0.4811321 1", Command = "p.confirmeditpromo" },
                Text =
                {
                    Text = GetMsg("ui.admin.confirm", player.userID), Font = "robotocondensed-bold.ttf",
                    FontSize = 22, Align = TextAnchor.MiddleCenter,
                    Color = "0.5499007 0.4764151 1 1"
                },
                RectTransform =
                {
                    AnchorMin = "0.5 0.5", AnchorMax = "0.5 0.5", OffsetMin = "-0.003 -143.235",
                    OffsetMax = "123.477 -113.334"
                }
            }, Layer + ".main.div" + ".promocode.settings", Layer + ".main.div" + ".promocode.settings" + ".confirm");

            container.Add(new CuiPanel
                {
                    CursorEnabled = false,
                    Image = { Color = "0.1085371 0.03844785 0.3018868 1" },
                    RectTransform =
                    {
                        AnchorMin = "0.5 0.5", AnchorMax = "0.5 0.5", OffsetMin = "-119.208 98.751",
                        OffsetMax = "119.208 126.049"
                    }
                }, Layer + ".main.div" + ".promocode.settings",
                Layer + ".main.div" + ".promocode.settings" + ".name.input.bg");

            container.Add(new CuiElement
            {
                Name = Layer + ".main.div" + ".promocode.settings" + ".name.input.bg" + ".input",
                Parent = Layer + ".main.div" + ".promocode.settings" + ".name.input.bg",
                Components =
                {
                    new CuiInputFieldComponent
                    {
                        Color = "0.8078431 0.7803922 0.7411765 0.4", Font = "robotocondensed-bold.ttf", FontSize = 14,
                        Align = TextAnchor.MiddleLeft,
                        CharsLimit = 0, IsPassword = false, Text = data.Name, Command = "p.changepromocodesetting name "
                    },
                    new CuiNeedsKeyboardComponent(),
                    new CuiRectTransformComponent
                    {
                        AnchorMin = "0.5 0.5", AnchorMax = "0.5 0.5", OffsetMin = "-115.677 -13.649",
                        OffsetMax = "119.21 13.649"
                    }
                }
            });

            container.Add(new CuiElement
            {
                Name = Layer + ".main.div" + ".promocode.settings" + ".name.input.bg" + ".label",
                Parent = Layer + ".main.div" + ".promocode.settings" + ".name.input.bg",
                Components =
                {
                    new CuiTextComponent
                    {
                        Text = GetMsg("ui.admin.promocodes.settings.namelabel", player.userID),
                        Font = "robotocondensed-regular.ttf", FontSize = 11,
                        Align = TextAnchor.UpperLeft, Color = "0.8078431 0.7803922 0.7411765 1"
                    },
                    new CuiRectTransformComponent
                    {
                        AnchorMin = "0.5 0.5", AnchorMax = "0.5 0.5", OffsetMin = "-119.21 0",
                        OffsetMax = "119.21 27.298"
                    }
                }
            });

            container.Add(new CuiPanel
                {
                    CursorEnabled = false,
                    Image = { Color = "0.1085371 0.03844785 0.3018868 1" },
                    RectTransform =
                    {
                        AnchorMin = "0.5 0.5", AnchorMax = "0.5 0.5", OffsetMin = "-119.208 59.851",
                        OffsetMax = "0.002 87.149"
                    }
                }, Layer + ".main.div" + ".promocode.settings",
                Layer + ".main.div" + ".promocode.settings" + ".uses.input.bg");

            container.Add(new CuiElement
            {
                Name = Layer + ".main.div" + ".promocode.settings" + ".uses.input.bg" + ".input",
                Parent = Layer + ".main.div" + ".promocode.settings" + ".uses.input.bg",
                Components =
                {
                    new CuiInputFieldComponent
                    {
                        Color = "0.8078431 0.7803922 0.7411765 0.4", Font = "robotocondensed-bold.ttf", FontSize = 14,
                        Align = TextAnchor.MiddleLeft,
                        CharsLimit = 8, IsPassword = false, Text = data.NumberOfUses.ToString(),
                        Command = "p.changepromocodesetting uses "
                    },
                    new CuiRectTransformComponent
                    {
                        AnchorMin = "0.5 0.5", AnchorMax = "0.5 0.5", OffsetMin = "-56.074 -13.649",
                        OffsetMax = "59.606 13.649"
                    }
                }
            });

            container.Add(new CuiElement
            {
                Name = Layer + ".main.div" + ".promocode.settings" + ".uses.input.bg" + ".label",
                Parent = Layer + ".main.div" + ".promocode.settings" + ".uses.input.bg",
                Components =
                {
                    new CuiTextComponent
                    {
                        Text = GetMsg("ui.admin.promocodes.settings.useslabel", player.userID),
                        Font = "robotocondensed-regular.ttf", FontSize = 11,
                        Align = TextAnchor.UpperLeft, Color = "0.8078431 0.7803922 0.7411765 1"
                    },
                    new CuiRectTransformComponent
                    {
                        AnchorMin = "0.5 0.5", AnchorMax = "0.5 0.5", OffsetMin = "-59.606 0",
                        OffsetMax = "59.604 27.298"
                    }
                }
            });

            container.Add(new CuiPanel
                {
                    CursorEnabled = false,
                    Image = { Color = "1 1 1 0" },
                    RectTransform =
                    {
                        AnchorMin = "0.5 0.5", AnchorMax = "0.5 0.5", OffsetMin = "-119.208 7.151",
                        OffsetMax = "119.212 51.9"
                    }
                }, Layer + ".main.div" + ".promocode.settings",
                Layer + ".main.div" + ".promocode.settings" + ".expiretime.bg");

            container.Add(new CuiButton
                {
                    Button = { Color = "0.1085371 0.03844785 0.3018868 1", Command = "p.addtime 60" },
                    Text =
                    {
                        Text = $"+{GetMsg("ui.admin.promocodes.settings.1minute", player.userID)}",
                        Font = "robotocondensed-bold.ttf", FontSize = 12, Align = TextAnchor.MiddleCenter,
                        Color = "0.3538625 0.3001513 0.6698113 1"
                    },
                    RectTransform =
                    {
                        AnchorMin = "0.5 0.5", AnchorMax = "0.5 0.5", OffsetMin = "-119.21 -22.374",
                        OffsetMax = "-88.355 0"
                    }
                }, Layer + ".main.div" + ".promocode.settings" + ".expiretime.bg",
                Layer + ".main.div" + ".promocode.settings" + ".expiretime.bg" + ".add.1m");

            container.Add(new CuiButton
                {
                    Button = { Color = "0.1085371 0.03844785 0.3018868 1", Command = "p.addtime 3600" },
                    Text =
                    {
                        Text = $"+{GetMsg("ui.admin.promocodes.settings.1hour", player.userID)}",
                        Font = "robotocondensed-bold.ttf", FontSize = 12, Align = TextAnchor.MiddleCenter,
                        Color = "0.3538625 0.3001513 0.6698113 1"
                    },
                    RectTransform =
                    {
                        AnchorMin = "0.5 0.5", AnchorMax = "0.5 0.5", OffsetMin = "-86.928 -22.374",
                        OffsetMax = "-56.072 0"
                    }
                }, Layer + ".main.div" + ".promocode.settings" + ".expiretime.bg",
                Layer + ".main.div" + ".promocode.settings" + ".expiretime.bg" + ".add.1h");

            container.Add(new CuiButton
                {
                    Button = { Color = "0.1085371 0.03844785 0.3018868 1", Command = "p.addtime 86400" },
                    Text =
                    {
                        Text = $"+{GetMsg("ui.admin.promocodes.settings.1day", player.userID)}",
                        Font = "robotocondensed-bold.ttf", FontSize = 12, Align = TextAnchor.MiddleCenter,
                        Color = "0.3538625 0.3001513 0.6698113 1"
                    },
                    RectTransform =
                    {
                        AnchorMin = "0.5 0.5", AnchorMax = "0.5 0.5", OffsetMin = "-54.628 -22.374",
                        OffsetMax = "-23.772 0"
                    }
                }, Layer + ".main.div" + ".promocode.settings" + ".expiretime.bg",
                Layer + ".main.div" + ".promocode.settings" + ".expiretime.bg" + ".add.1d");

            container.Add(new CuiButton
                {
                    Button = { Color = "0.1085371 0.03844785 0.3018868 1", Command = "p.addtime -60" },
                    Text =
                    {
                        Text = $"-{GetMsg("ui.admin.promocodes.settings.1minute", player.userID)}",
                        Font = "robotocondensed-bold.ttf", FontSize = 12, Align = TextAnchor.MiddleCenter,
                        Color = "0.3538625 0.3001513 0.6698113 1"
                    },
                    RectTransform =
                    {
                        AnchorMin = "0.5 0.5", AnchorMax = "0.5 0.5", OffsetMin = "23.572 -22.374",
                        OffsetMax = "54.428 0"
                    }
                }, Layer + ".main.div" + ".promocode.settings" + ".expiretime.bg",
                Layer + ".main.div" + ".promocode.settings" + ".expiretime.bg" + ".remove.1m");

            container.Add(new CuiButton
                {
                    Button = { Color = "0.1085371 0.03844785 0.3018868 1", Command = "p.addtime -3600" },
                    Text =
                    {
                        Text = $"-{GetMsg("ui.admin.promocodes.settings.1hour", player.userID)}",
                        Font = "robotocondensed-bold.ttf", FontSize = 12, Align = TextAnchor.MiddleCenter,
                        Color = "0.3538625 0.3001513 0.6698113 1"
                    },
                    RectTransform =
                    {
                        AnchorMin = "0.5 0.5", AnchorMax = "0.5
// ... [Code preview truncated due to length. Full source in attached file] ...

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