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] ...