C#:
// Requires: ImageLibrary
using System.Collections.Generic;
using System;
using System.Linq;
using UnityEngine;
using Oxide.Core.Configuration;
using Oxide.Game.Rust.Cui;
using Oxide.Core;
using Oxide.Core.Plugins;
namespace Oxide.Plugins {
[Info("Absolut Gifts", "Absolut", "1.5.2")]
[Description("Daily gift reward system")]
class AbsolutGifts : RustPlugin {
[PluginReference]
Plugin ImageLibrary, ServerRewards, Economics, AbsolutCombat;
GiftData agdata;
private DynamicConfigFile AGData;
bool initialized;
int GlobalTime = 0;
string TitleColor = "<color=orange>";
string MsgColor = "<color=#A9A9A9>";
int max;
private Dictionary<int, float[]> GiftPositions = new Dictionary<int, float[]>();
private Dictionary<string, Timer> timers = new Dictionary<string, Timer>();
private Dictionary<ulong, GiftCreation> giftprep = new Dictionary<ulong, GiftCreation>();
private Dictionary<ulong, Vector3> AFK = new Dictionary<ulong, Vector3>();
private Dictionary<ulong, Info> UIinfo = new Dictionary<ulong, Info>();
class Info {
public bool open;
public int page;
public bool admin;
public ItemCategory cat = ItemCategory.All;
}
#region Server Hooks
void Loaded() {
AGData = Interface.Oxide.DataFileSystem.GetFile("AbsolutGifts_Data");
lang.RegisterMessages(messages, this);
}
void Unload() {
foreach (var entry in timers) entry.Value.Destroy();
timers.Clear();
foreach (BasePlayer p in BasePlayer.activePlayerList) {
DestroyPlayer(p);
}
if (initialized) SaveData();
}
void OnServerInitialized() {
initialized = false;
LoadVariables();
LoadData();
LoadImages();
permission.RegisterPermission(this.Name + ".vip", this);
permission.RegisterPermission(this.Name + ".admin", this);
timers.Add("info", timer.Once(900, () => InfoLoop()));
timers.Add("save", timer.Once(600, () => SaveLoop()));
SaveData();
SetGiftPositions();
timer.Once(5, () => {
foreach (BasePlayer p in BasePlayer.activePlayerList) OnPlayerConnected(p);
}
);
timers.Add("time", timer.Once(60, () => ChangeGlobalTime()));
}
void LoadImages() {
if (!ImageLibrary) return;
if (timers.ContainsKey("imageloading")) {
timers["imageloading"].Destroy();
timers.Remove("imageloading");
}
if (!isReady()) {
Puts(GetMSG("WaitingImageLibrary"));
timers.Add("imageloading", timer.Once(60, () => LoadImages()));
return;
}
;
if (string.IsNullOrEmpty(configData.GiftIconImage)) AddImage("http://i.imgur.com/zMe9ky5.png", "newgift", (ulong)ResourceId);
else AddImage(configData.GiftIconImage, "newgift", (ulong)ResourceId);
CreateLoadOrder();
LoadAllItemImages();
if (timers.ContainsKey("imageloading")) {
timers["imageloading"].Destroy();
timers.Remove("imageloading");
}
}
private void LoadAllItemImages() {
ImageLibrary.Call("LoadImageList", Title, ItemManager.itemList.Select(x => new KeyValuePair<string, ulong>(x.shortname, 0)).ToList());
}
private void CreateLoadOrder() {
Dictionary<string, string> newLoadOrder = new Dictionary<string, string> {
{
"sr", "http://oxidemod.org/data/resource_icons/1/1751.jpg?1456924271"
}
, {
"eco", "http://oxidemod.org/data/resource_icons/0/717.jpg?1465675504"
}
, {
"ac", "http://oxidemod.org/data/resource_icons/2/2103.jpg?1472590458"
}
,
}
;
ImageLibrary.Call("ImportImageList", Title, newLoadOrder, (ulong)ResourceId, true);
}
private void OnPlayerDisconnected(BasePlayer player) {
DestroyPlayer(player);
}
private void OnPlayerConnected(BasePlayer player) {
if (player != null) {
GetSendMSG(player, "AGInfo");
InitializePlayer(player);
}
}
private void OnPlayerRespawned(BasePlayer player) {
NewGiftIcon(player);
}
private void InitializePlayer(BasePlayer player) {
if (!UIinfo.ContainsKey(player.userID)) UIinfo.Add(player.userID, new Info {
page = 0
}
);
if (!agdata.Players.ContainsKey(player.userID)) {
agdata.Players.Add(player.userID, new playerdata {
PlayerTime = 0, ReceivedGifts = new List<int>(), ResetTime = GrabCurrentTime() + (configData.ResetInDays * 86400)
}
);
}
else {
//Puts($"CurrentTime: {GrabCurrentTime()}");
if (GrabCurrentTime() >= agdata.Players[player.userID].ResetTime) {
//Puts("Time is Greater");
agdata.Players[player.userID].ReceivedGifts.Clear();
agdata.Players[player.userID].pendingGift.Clear();
agdata.Players[player.userID].PlayerTime = 0;
agdata.Players[player.userID].ResetTime = GrabCurrentTime() + (configData.ResetInDays * 86400);
if (UIinfo[player.userID].open) GiftPanel(player);
SaveData();
}
}
double timeremaining = agdata.Players[player.userID].ResetTime - GrabCurrentTime();
if (timers.ContainsKey(player.UserIDString)) {
timers[player.UserIDString].Destroy();
timers.Remove(player.UserIDString);
}
timers.Add(player.UserIDString, timer.Once((float)timeremaining, () => InitializePlayer(player)));
NewGiftIcon(player);
}
private void DestroyPlayer(BasePlayer player) {
if (!agdata.Players.ContainsKey(player.userID)) agdata.Players.Add(player.userID, new playerdata {
PlayerTime = 0, ReceivedGifts = new List<int>()
}
);
if (timers.ContainsKey(player.UserIDString)) {
timers[player.UserIDString].Destroy();
timers.Remove(player.UserIDString);
}
DestroyGiftPanel(player, true);
CuiHelper.DestroyUi(player, PanelIcon);
CuiHelper.DestroyUi(player, PanelOnScreen);
}
static double GrabCurrentTime() => DateTime.UtcNow.Subtract(new DateTime(1970, 1, 1, 0, 0, 0)).TotalSeconds;
#endregion
#region Player Hooks
#endregion
#region Functions
private string TryForImage(string shortname, ulong skin = 99) {
if (!ImageLibrary) return "https://i.imgur.com/yxESUQJ.png";
if (shortname.Contains("http") || shortname.Contains("www")) return shortname;
if (skin == 99) skin = (ulong)ResourceId;
return GetImage(shortname, skin, true);
}
public string GetImage(string shortname, ulong skin = 0, bool returnUrl = false) => (string)ImageLibrary.Call("GetImage", shortname.ToLower(), skin, returnUrl);
public bool HasImage(string shortname, ulong skin = 0) => (bool)ImageLibrary.Call("HasImage", shortname.ToLower(), skin);
public bool AddImage(string url, string shortname, ulong skin = 0) => (bool)ImageLibrary?.Call("AddImage", url, shortname.ToLower(), skin);
public List<ulong> GetImageList(string shortname) => (List<ulong>)ImageLibrary.Call("GetImageList", shortname.ToLower());
public bool isReady() => (bool)ImageLibrary?.Call("IsReady");
private void CancelGiftCreation(BasePlayer player) {
DestroyGiftPanel(player, false);
if (giftprep.ContainsKey(player.userID)) giftprep.Remove(player.userID);
GetSendMSG(player, "GiftCreationCanceled");
UIinfo[player.userID].page = 0;
Background(player);
}
public void DestroyGiftPanel(BasePlayer player, bool background) {
if (UIinfo.ContainsKey(player.userID)) {
UIinfo[player.userID].open = false;
UIinfo[player.userID].page = 0;
}
if (background) CuiHelper.DestroyUi(player, PanelStatic);
CuiHelper.DestroyUi(player, PanelGift);
CuiHelper.DestroyUi(player, PanelTime);
for (int i = 0; i < max; i++) CuiHelper.DestroyUi(player, "GiftEntry" + i);
}
void ChangeGlobalTime() {
if (timers.ContainsKey("time")) {
timers["time"].Destroy();
timers.Remove("time");
}
GlobalTime++;
timers.Add("time", timer.Once(60, () => ChangeGlobalTime()));
CheckPlayers();
}
private void CheckPlayers() {
foreach (BasePlayer player in BasePlayer.activePlayerList) if (agdata.Players.ContainsKey(player.userID)) {
if (configData.NoAFK) if (CheckAFK(player)) continue;
agdata.Players[player.userID].PlayerTime++;
int giftIndex = 0;
if (permission.UserHasPermission(player.UserIDString, this.Title + ".vip")) giftIndex = agdata.Gifts.Where(k => !agdata.Players[player.userID].ReceivedGifts.Contains(k.Key)).OrderBy(k => k.Key).Select(k => k.Key).FirstOrDefault();
else giftIndex = agdata.Gifts.Where(k => !k.Value.vip && !agdata.Players[player.userID].ReceivedGifts.Contains(k.Key)).OrderBy(k => k.Key).Select(k => k.Key).FirstOrDefault();
if (giftIndex != 0 && giftIndex <= agdata.Players[player.userID].PlayerTime) {
OnScreen(player, "CompletedNewGift", giftIndex.ToString());
ProcessGift(player, giftIndex);
}
if (UIinfo[player.userID].open) PlayerTimeCounter(player);
}
else InitializePlayer(player);
}
bool CheckAFK(BasePlayer player) {
if (player == null) return false;
if (!AFK.ContainsKey(player.userID)) {
AFK.Add(player.userID, player.transform.position);
//Puts("Not in Dictionary");
return false;
}
else if (AFK[player.userID] == player.transform.position) {
//Puts("Same Position - AFK");
return true;
}
else if (AFK[player.userID] != player.transform.position) {
AFK[player.userID] = player.transform.position;
//Puts("New Position - Not AFK");
}
return false;
}
private void ProcessGift(BasePlayer player, int GiftIndex) {
if (!agdata.Gifts.ContainsKey(GiftIndex)) return;
var Gift = agdata.Gifts[GiftIndex];
if (Gift.gifts.Where(k => !k.AC && !k.SR && !k.Eco).Count() == 0) foreach (var entry in Gift.gifts) {
if (entry.SR) {
ServerRewards?.Call("AddPoints", player.userID.ToString(), entry.amount);
GetSendMSG(player, "NewGiftGiven", entry.amount.ToString(), "ServerRewards Points");
}
else if (entry.Eco) {
Economics.Call("DepositS", player.userID.ToString(), entry.amount);
GetSendMSG(player, "NewGiftGiven", entry.amount.ToString(), "Economics");
}
else if (entry.AC) {
AbsolutCombat.Call("AddMoney", player.userID.ToString(), entry.amount, false);
GetSendMSG(player, "NewGiftGiven", entry.amount.ToString(), "AbsolutCombat Money");
}
}
else {
agdata.Players[player.userID].pendingGift.Add(GiftIndex, Gift);
NewGiftIcon(player);
}
agdata.Players[player.userID].ReceivedGifts.Add(GiftIndex);
}
private void CreateNumberPadButton(ref CuiElementContainer container, string panelName, int i, int number, string command) {
var pos = CalcNumButtonPos(i);
UI.CreateButton(ref container, panelName, UIColors["buttonbg"], number.ToString(), 12, $"{pos[0]} {pos[1]}", $"{pos[2]} {pos[3]}", $"{command} {number}");
}
private void GetSendMSG(BasePlayer player, string message, string arg1 = "", string arg2 = "", string arg3 = "", string arg4 = "") {
string msg = string.Format(lang.GetMessage(message, this, player.UserIDString), arg1, arg2, arg3, arg4);
SendReply(player, TitleColor + lang.GetMessage("title", this, player.UserIDString) + "</color>" + MsgColor + msg + "</color>");
}
private string GetMSG(string message, BasePlayer player = null, string arg1 = "", string arg2 = "", string arg3 = "", string arg4 = "") {
string p = null;
if (player != null) p = player.UserIDString;
if (messages.ContainsKey(message)) return string.Format(lang.GetMessage(message, this, p), arg1, arg2, arg3, arg4);
else return message;
}
bool isAuth(BasePlayer player) {
if (player.net.connection != null) if (player.net.connection.authLevel < 2 && !permission.UserHasPermission(player.UserIDString, this.Title + ".admin")) return false;
return true;
}
#endregion
#region UI Creation
private string PanelStatic = "PanelStatic";
private string PanelGift = "PanelGift";
private string PanelIcon = "PanelIcon";
private string PanelOnScreen = "PanelOnScreen";
private string PanelTime = "PanelTime";
public class UI {
static public CuiElementContainer CreateOverlayContainer(string panelName, string color, string aMin, string aMax, bool cursor = false) {
var NewElement = new CuiElementContainer() {
{
new CuiPanel {
Image = {
Color = color
}
, RectTransform = {
AnchorMin = aMin, AnchorMax = aMax
}
, CursorEnabled = cursor
}
, new CuiElement().Parent = "Overlay", panelName
}
}
;
return NewElement;
}
static public void CreatePanel(ref CuiElementContainer element, string panel, string color, string aMin, string aMax, bool cursor = false) {
element.Add(new CuiPanel {
Image = {
Color = color
}
, RectTransform = {
AnchorMin = aMin, AnchorMax = aMax
}
, CursorEnabled = cursor
}
, panel);
}
static public void CreateLabel(ref CuiElementContainer element, string panel, string color, string text, int size, string aMin, string aMax, TextAnchor align = TextAnchor.MiddleCenter) {
element.Add(new CuiLabel {
Text = {
Color = color, FontSize = size, Align = align, FadeIn = 1.0f, Text = text
}
, RectTransform = {
AnchorMin = aMin, AnchorMax = aMax
}
}
, panel);
}
static public void CreateButton(ref CuiElementContainer element, string panel, string color, string text, int size, string aMin, string aMax, string command, TextAnchor align = TextAnchor.MiddleCenter) {
element.Add(new CuiButton {
Button = {
Color = color, Command = command, FadeIn = 1.0f
}
, RectTransform = {
AnchorMin = aMin, AnchorMax = aMax
}
, Text = {
Text = text, FontSize = size, Align = align
}
}
, panel);
}
static public void LoadImage(ref CuiElementContainer container, string panel, string img, string aMin, string aMax) {
if (img.StartsWith("http") || img.StartsWith("www")) {
container.Add(new CuiElement {
Parent = panel, Components = {
new CuiRawImageComponent {
Url = img, Sprite = "assets/content/textures/generic/fulltransparent.tga"
}
, new CuiRectTransformComponent {
AnchorMin = aMin, AnchorMax = aMax
}
}
}
);
}
else container.Add(new CuiElement {
Parent = panel, Components = {
new CuiRawImageComponent {
Png = img, Sprite = "assets/content/textures/generic/fulltransparent.tga"
}
, new CuiRectTransformComponent {
AnchorMin = aMin, AnchorMax = aMax
}
}
}
);
}
static public void CreateTextOutline(ref CuiElementContainer element, string panel, string colorText, string colorOutline, string text, int size, string aMin, string aMax, TextAnchor align = TextAnchor.MiddleCenter) {
element.Add(new CuiElement {
Parent = panel, Components = {
new CuiTextComponent {
Color = colorText, FontSize = size, Align = align, Text = text
}
, new CuiOutlineComponent {
Distance = "1 1", Color = colorOutline
}
, new CuiRectTransformComponent {
AnchorMax = aMax, AnchorMin = aMin
}
}
}
);
}
static public void CreateTextOverlay(ref CuiElementContainer element, string panel, string text, string color, int size, string aMin, string aMax, TextAnchor align = TextAnchor.MiddleCenter, float fadein = 1.0f) {
//if (configdata.DisableUI_AG_FadeIn)
// fadein = 0;
element.Add(new CuiLabel {
Text = {
Color = color, FontSize = size, Align = align, FadeIn = fadein, Text = text
}
, RectTransform = {
AnchorMin = aMin, AnchorMax = aMax
}
}
, panel);
}
}
private Dictionary<string, string> UIColors = new Dictionary<string, string> {
{
"black", "0 0 0 1.0"
}
, {
"dark", "0.1 0.1 0.1 0.98"
}
, {
"header", "1 1 1 0.3"
}
, {
"light", ".564.564.564 1.0"
}
, {
"grey1", "0.6 0.6 0.6 1.0"
}
, {
"brown", "0.3 0.16 0.0 1.0"
}
, {
"yellow", "0.9 0.9 0.0 1.0"
}
, {
"limegreen", "0.42 1.0 0 1.0"
}
, {
"blue", "0.2 0.6 1.0 1.0"
}
, {
"red", "1.0 0.1 0.1 1.0"
}
, {
"white", "1 1 1 1"
}
, {
"green", "0.28 0.82 0.28 1.0"
}
, {
"grey", "0.85 0.85 0.85 1.0"
}
, {
"lightblue", "0.6 0.86 1.0 1.0"
}
, {
"buttonbg", "0.2 0.2 0.2 0.7"
}
, {
"buttongreen", "0.133 0.965 0.133 0.9"
}
, {
"buttonred", "0.964 0.133 0.133 0.9"
}
, {
"buttongrey", "0.8 0.8 0.8 0.9"
}
, {
"orange", "1.0 0.64 0.10 1.0"
}
}
;
private Dictionary<string, string> TextColors = new Dictionary<string, string> {
{
"limegreen", "<color=#6fff00>"
}
}
;
#endregion
#region UI Panels
void Background(BasePlayer player) {
CuiHelper.DestroyUi(player, PanelStatic);
if (!UIinfo.ContainsKey(player.userID)) UIinfo.Add(player.userID, new Info {
page = 0
}
);
UIinfo[player.userID].open = true;
var element = UI.CreateOverlayContainer(PanelStatic, "0 0 0 0", "0.2 0.15", "0.8 0.85", true);
CuiHelper.AddUi(player, element);
GiftPanel(player);
}
void PlayerTimeCounter(BasePlayer player) {
CuiHelper.DestroyUi(player, PanelTime);
if (!UIinfo.ContainsKey(player.userID)) UIinfo.Add(player.userID, new Info {
page = 0
}
);
var element = UI.CreateOverlayContainer(PanelTime, "0 0 0 0", "0.2 0.85", "0.8 0.95");
UI.CreateTextOutline(ref element, PanelTime, UIColors["white"], UIColors["black"], GetMSG("AccumulatedTime", player, agdata.Players[player.userID].PlayerTime.ToString()), 30, $"0 0", $"1 1", TextAnchor.MiddleCenter);
CuiHelper.AddUi(player, element);
}
void GiftPanel(BasePlayer player) {
CuiHelper.DestroyUi(player, PanelGift);
var element = UI.CreateOverlayContainer(PanelGift, "0.1 0.1 0.1 0.8", "0.2 0.15", "0.8 0.85");
//UI.CreatePanel(ref element, PanelGift, UIColors["dark"], "0.0", "1 1");
var i = 0;
var page = UIinfo[player.userID].page;
double count = agdata.Gifts.Count();
//Puts(count.ToString());
int entriesallowed = max;
double remainingentries = count - (page * entriesallowed);
double totalpages = (Math.Floor(count / entriesallowed));
if (remainingentries > entriesallowed) {
UI.CreateButton(ref element, PanelGift, UIColors["header"], GetMSG("Next", player), 16, "0.76 0.02", "0.86 0.075", $"UI_AG_GiftMenu {page + 1}");
}
if (page > 0) {
UI.CreateButton(ref element, PanelGift, UIColors["header"], GetMSG("Back", player), 16, "0.65 0.02", "0.75 0.075", $"UI_AG_GiftMenu {page - 1}");
}
if (isAuth(player)) {
UI.CreateButton(ref element, PanelGift, UIColors["header"], GetMSG("ToggleAdmin", player), 12, "0.03 0.02", "0.13 0.075", $"UI_AG_ToggleAdmin");
if (UIinfo[player.userID].admin) UI.CreateButton(ref element, PanelGift, UIColors["orange"], GetMSG("CreateGift", player), 12, "0.16 0.02", "0.26 0.075", $"UI_AG_CreateGifts");
}
UI.CreateButton(ref element, PanelGift, UIColors["buttonred"], GetMSG("Close", player), 16, "0.87 0.02", "0.97 0.075", $"UI_AG_DestroyGiftPanel");
CuiHelper.AddUi(player, element);
int n = 0;
int shownentries = page * entriesallowed;
List<int> completed = new List<int>();
if (agdata.Players.ContainsKey(player.userID)) foreach (var entry in agdata.Players[player.userID].ReceivedGifts) completed.Add(entry);
foreach (var entry in agdata.Gifts.OrderBy(kvp => kvp.Key)) {
i++;
if (i < shownentries + 1) continue;
if (i <= shownentries + entriesallowed) {
CreateGiftMenuEntry(player, entry.Key, n);
n++;
}
if (n >= entriesallowed) break;
}
PlayerTimeCounter(player);
}
private void CreateGifts(BasePlayer player, int step = 0) {
var i = 0;
CuiElementContainer element = UI.CreateOverlayContainer(PanelGift, "0.1 0.1 0.1 0.8", "0.3 0.3", "0.7 0.9");
switch (step) {
case 0 : CuiHelper.DestroyUi(player, PanelGift);
if (giftprep.ContainsKey(player.userID)) giftprep.Remove(player.userID);
giftprep.Add(player.userID, new GiftCreation());
//UI.CreateLabel(ref element, PanelGift, UIColors["black"], $"{TextColors["limegreen"]} {GetMSG("SelectGiftTimer")}", 20, "0.05 0", ".95 1", TextAnchor.MiddleCenter);
NumberPad(player, "UI_AG_SelectTime", "SelectTime");
return;
case 1 : CuiHelper.DestroyUi(player, PanelGift);
element = UI.CreateOverlayContainer(PanelGift, "0.1 0.1 0.1 0.8", "0.4 0.3", "0.6 0.6");
UI.CreateLabel(ref element, PanelGift, UIColors["limegreen"], GetMSG("VIPGift", player, giftprep[player.userID].time.ToString()), 20, "0.05.4", ".95.95");
UI.CreateButton(ref element, PanelGift, UIColors["buttonbg"], GetMSG("Yes", player), 18, "0.2 0.05", "0.4 0.25", $"UI_AG_VIP true", TextAnchor.MiddleCenter);
UI.CreateButton(ref element, PanelGift, UIColors["buttonred"], GetMSG("No", player), 18, "0.6 0.05", "0.8 0.25", $"UI_AG_VIP false");
break;
case 2 : CuiHelper.DestroyUi(player, PanelGift);
var cat = UIinfo[player.userID].cat;
float[] pos;
UI.CreatePanel(ref element, PanelGift, "0 0 0 0", $".0001 0.0001", $"0.0002 0.0002");
UI.CreateLabel(ref element, PanelGift, UIColors["limegreen"], GetMSG("SelectGift", player, giftprep[player.userID].time.ToString()), 20, "0.05.95", ".95 1", TextAnchor.MiddleCenter);
foreach (var entry in Enum.GetValues(typeof(ItemCategory)).Cast<ItemCategory>().ToList().OrderBy(k=> k == ItemCategory.All).ThenBy(k=>k.ToString().First())) {
if (entry == ItemCategory.Search || entry == ItemCategory.Common) continue;
pos = FilterButton(i);
if(cat == entry) UI.CreateButton(ref element, PanelGift, UIColors["yellow"], entry.ToString(), 10, $"{pos[0]} {pos[1]}", $"{pos[2]} {pos[3]}", $"UI_AG_ChangeCat {entry.ToString()}");
else UI.CreateButton(ref element, PanelGift, UIColors["black"], entry.ToString(), 10, $"{pos[0]} {pos[1]}", $"{pos[2]} {pos[3]}", $"UI_AG_ChangeCat {entry.ToString()}");
i++;
}
var itemList = ItemManager.itemList.Where(k => cat != ItemCategory.All ? k.category == cat : k.category != ItemCategory.All).Select(k => k).ToList();
double count = itemList.Count();
var page = UIinfo[player.userID].page;
double entriesallowed = 30;
double remainingentries = count - (page * (entriesallowed));
double totalpages = (Math.Floor(count / (entriesallowed))) - 1;
{
if (remainingentries > entriesallowed) {
UI.CreateButton(ref element, PanelGift, UIColors["header"], GetMSG("Next", player), 16, "0.85 0.02", "0.95 0.075", $"UI_AG_CreateGifts {2} {page + 1}");
}
if (page > 0) {
UI.CreateButton(ref element, PanelGift, UIColors["header"], GetMSG("Back", player), 16, "0.74 0.02", "0.84 0.075", $"UI_AG_CreateGifts {2} {page - 1}");
}
}
i = 0;
int n = 0;
pos = CalcButtonPos(n);
double shownentries = page * entriesallowed;
if (page == 0 && (cat == ItemCategory.All || cat == ItemCategory.Search || cat == ItemCategory.Common)) {
if (ServerRewards) {
UI.LoadImage(ref element, PanelGift, TryForImage("SR"), $"{pos[0] + 0.005f} {pos[1] + 0.005f}", $"{pos[2] - 0.005f} {pos[3] - 0.005f}");
UI.CreateButton(ref element, PanelGift, "0 0 0 0", "", 12, $"{pos[0]} {pos[1]}", $"{pos[2]} {pos[3]}", $"UI_AG_SelectGift SR");
n++;
i++;
}
if (Economics) {
pos = CalcButtonPos(n);
UI.LoadImage(ref element, PanelGift, TryForImage("ECO"), $"{pos[0] + 0.005f} {pos[1] + 0.005f}", $"{pos[2] - 0.005f} {pos[3] - 0.005f}");
UI.CreateButton(ref element, PanelGift, "0 0 0 0", "", 12, $"{pos[0]} {pos[1]}", $"{pos[2]} {pos[3]}", $"UI_AG_SelectGift ECO");
n++;
i++;
}
if (AbsolutCombat) {
pos = CalcButtonPos(n);
UI.LoadImage(ref element, PanelGift, TryForImage("AC"), $"{pos[0] + 0.005f} {pos[1] + 0.005f}", $"{pos[2] - 0.005f} {pos[3] - 0.005f}");
UI.CreateButton(ref element, PanelGift, "0 0 0 0", "", 12, $"{pos[0]} {pos[1]}", $"{pos[2]} {pos[3]}", $"UI_AG_SelectGift AC");
n++;
i++;
}
//if (configData.UseGatherIncrease)
//{
// pos = CalcButtonPos(n);
// UI.LoadImage(ref element, PanelGift, TryForImage("GATHER"), $"{pos[0] + 0.005f} {pos[1] + 0.005f}", $"{pos[2] - 0.005f} {pos[3] - 0.005f}");
// UI.CreateButton(ref element, PanelGift, "0 0 0 0", "", 12, $"{pos[0]} {pos[1]}", $"{pos[2]} {pos[3]}", $"UI_AG_SelectGift GATHER");
// n++;
// i++;
//}
}
foreach (var item in itemList.OrderBy(k=>k.displayName.english)) {
i++;
if (i < shownentries + 1) continue;
else if (i <= shownentries + entriesallowed) {
pos = CalcButtonPos(n);
UI.CreatePanel(ref element, PanelGift, UIColors["header"], $"{pos[0]} {pos[1]}", $"{pos[2]} {pos[3]}");
UI.LoadImage(ref element, PanelGift, TryForImage(item.shortname, 0), $"{pos[0] + 0.005f} {pos[1] + 0.005f}", $"{pos[2] - 0.005f} {pos[3] - 0.005f}");
//UI.CreateLabel(ref element, PanelGift, UIColors["limegreen"], item.shortname, 14, $"{pos[0]} {pos[1]}", $"{pos[2]} {pos[3]}", TextAnchor.MiddleCenter);
UI.CreateButton(ref element, PanelGift, "0 0 0 0", "", 12, $"{pos[0]} {pos[1]}", $"{pos[2]} {pos[3]}", $"UI_AG_SelectGift {item.itemid}");
n++;
}
}
UI.CreateButton(ref element, PanelGift, UIColors["buttonred"], GetMSG("Close", player), 16, "0.03 0.02", "0.13 0.075", $"UI_AG_DestroyGiftPanel");
break;
default : CuiHelper.DestroyUi(player, PanelGift);
UI.CreatePanel(ref element, PanelGift, "0 0 0 0", $".0001 0.0001", $"0.0002 0.0002");
UI.CreateLabel(ref element, PanelGift, UIColors["limegreen"], GetMSG("NewGiftInfo", player, giftprep[player.userID].time.ToString()), 20, "0.05.8", ".95.95");
string GiftDetails = "";
var alt = "";
foreach (var entry in giftprep[player.userID].gifts) if (entry.ID != 0) GiftDetails += $"{GetMSG("GiftDetails", player, GetDisplayNameFromSN(entry.ID), entry.amount.ToString())}\n";
else {
if (entry.AC) alt = "AbsolutCombat Money";
if (entry.Eco) alt = "Economics";
if (entry.SR) alt = "ServerRewards Points";
GiftDetails += $"{GetMSG("GiftDetails", player, alt, entry.amount.ToString())}\n";
}
UI.CreateLabel(ref element, PanelGift, UIColors["limegreen"], GiftDetails, 20, "0.1 0.16", "0.9 0.75", TextAnchor.MiddleLeft);
UI.CreateButton(ref element, PanelGift, UIColors["buttonbg"], GetMSG("FinalizeGift", player), 18, "0.2 0.05", "0.4 0.15", $"UI_AG_FinalizeGift", TextAnchor.MiddleCenter);
if (giftprep[player.userID].gifts.Count() < 9) UI.CreateButton(ref element, PanelGift, UIColors["buttonbg"], GetMSG("AddToGift", player), 18, "0.401 0.05", "0.599 0.15", $"UI_AG_CreateGifts {2} {0}", TextAnchor.MiddleCenter);
UI.CreateButton(ref element, PanelGift, UIColors["buttonred"], GetMSG("Cancel", player), 18, "0.6 0.05", "0.8 0.15", $"UI_AG_CancelGiftCreation");
break;
}
CuiHelper.AddUi(player, element);
}
string GetDisplayNameFromSN(int id) {
ItemDefinition def = ItemManager.FindItemDefinition(id);
if (def != null) return def.displayName.translated;
else return id.ToString();
}
private void CreateGiftMenuEntry(BasePlayer player, int ID, int num) {
var panelName = "GiftEntry" + num;
CuiHelper.DestroyUi(player, "GiftEntry" + num);
var pos = GiftPos(num);
CuiElementContainer container = UI.CreateOverlayContainer(panelName, UIColors["header"], $"{pos[0]} {pos[1]}", $"{pos[2]} {pos[3]}");
//UI.CreatePanel(ref container, panelName, UIColors["header"], $"{pos[0]} {pos[1]}", $"{pos[2]} {pos[3]}");
if (agdata.Gifts[ID].vip) {
if (configData.HideVIP && !permission.UserHasPermission(player.UserIDString, this.Title + ".vip")) return;
UI.CreateLabel(ref container, panelName, UIColors["red"], "VIP", 30, $"0 0", $"1 1", TextAnchor.MiddleCenter);
}
var i = 0;
float[] loc;
foreach (var entry in agdata.Gifts[ID].gifts) {
var item = ItemManager.CreateByItemID(entry.ID);
{
loc = giftentrypos(i);
UI.CreatePanel(ref container, panelName, UIColors["buttonbg"], $"{loc[0]} {loc[1]}", $"{loc[2]} {loc[3]}");
if (item != null) UI.LoadImage(ref container, panelName, TryForImage(item.info.shortname, entry.Skin), $"{loc[0]} {loc[1]}", $"{loc[2]} {loc[3]}");
else if (entry.Eco) UI.LoadImage(ref container, panelName, TryForImage("ECO"), $"{loc[0]} {loc[1]}", $"{loc[2]} {loc[3]}");
else if (entry.SR) UI.LoadImage(ref container, panelName, TryForImage("SR"), $"{loc[0]} {loc[1]}", $"{loc[2]} {loc[3]}");
else if (entry.AC) UI.LoadImage(ref container, panelName, TryForImage("AC"), $"{loc[0]} {loc[1]}", $"{loc[2]} {loc[3]}");
UI.CreateLabel(ref container, panelName, UIColors["limegreen"], entry.amount.ToString(), configData.UITextSize, $"{loc[0]} {loc[1]}", $"{loc[2]} {loc[3]}", TextAnchor.LowerCenter);
i++;
}
}
loc = giftentrypos(9);
if (isAuth(player) && UIinfo[player.userID].admin) {
UI.CreateTextOutline(ref container, panelName, UIColors["white"], UIColors["black"], GetMSG("GiftTitle", player, ID.ToString()), configData.UITextSize, "0 0", "1 1", TextAnchor.UpperCenter);
UI.CreateButton(ref container, panelName, UIColors["buttonred"], GetMSG("Delete", player), (int)(configData.UITextSize *.8), $"{loc[0]} {loc[1]}", $"{loc[2]} {loc[3]}", $"UI_AG_RemoveGift {ID}");
}
else if (agdata.Players[player.userID].ReceivedGifts.Contains(ID)) {
UI.CreateTextOutline(ref container, panelName, UIColors["green"], UIColors["black"], GetMSG("GiftTitleCompleted", player, ID.ToString()), configData.UITextSize, "0 0", "1 1", TextAnchor.UpperCenter);
if (agdata.Players[player.userID].pendingGift.ContainsKey(ID)) UI.CreateButton(ref container, panelName, UIColors["green"], GetMSG("Redeem", player), (int)(configData.UITextSize *.8), $"{loc[0]} {loc[1]}", $"{loc[2]} {loc[3]}", $"UI_AG_RedeemGift {ID}");
}
else {
UI.CreateTextOutline(ref container, panelName, UIColors["white"], UIColors["black"], GetMSG("GiftTitle", player, ID.ToString()), configData.UITextSize, "0 0", "1 1", TextAnchor.UpperCenter);
}
CuiHelper.AddUi(player, container);
}
void NewGiftIcon(BasePlayer player) {
CuiHelper.DestroyUi(player, PanelIcon);
if (!agdata.Players.ContainsKey(player.userID) || agdata.Players[player.userID].pendingGift.Count() < 1) return;
var element = UI.CreateOverlayContainer(PanelIcon, "0 0 0 0", $"{configData.minx} {configData.miny}", $"{configData.maxx} {configData.maxy}");
UI.LoadImage(ref element, PanelIcon, TryForImage("NewGift"), "0 0", "1 1");
UI.CreateButton(ref element, PanelIcon, "0 0 0 0", "", 12, "0 0", "1 1", "UI_AG_GiftMenu");
CuiHelper.AddUi(player, element);
}
private void NumberPad(BasePlayer player, string cmd, string title) {
CuiHelper.DestroyUi(player, PanelGift);
var element = UI.CreateOverlayContainer(PanelGift, UIColors["dark"], "0.35 0.3", "0.65 0.7");
UI.CreatePanel(ref element, PanelGift, UIColors["light"], "0.01 0.02", "0.99 0.98");
UI.CreateLabel(ref element, PanelGift, UIColors["limegreen"], GetMSG(title, player), 16, "0.1 0.85", "0.9.98", TextAnchor.UpperCenter);
var n = 1;
var i = 0;
if (title == "SelectTime") {
while (n < 20) {
CreateNumberPadButton(ref element, PanelGift, i, n, cmd);
i++;
n++;
}
while (n >= 20 && n < 60) {
CreateNumberPadButton(ref element, PanelGift, i, n, cmd);
i++;
n += 5;
}
while (n >= 60 && n < 240) {
CreateNumberPadButton(ref element, PanelGift, i, n, cmd);
i++;
n += 30;
}
while (n >= 240 && n <= 1470) {
CreateNumberPadButton(ref element, PanelGift, i, n, cmd);
i++;
n += 60;
}
}
else if (title == "SelectAmount") {
while (n < 10) {
CreateNumberPadButton(ref element, PanelGift, i, n, cmd);
i++;
n++;
}
while (n >= 10 && n < 25) {
CreateNumberPadButton(ref element, PanelGift, i, n, cmd);
i++;
n += 5;
}
while (n >= 25 && n < 200) {
CreateNumberPadButton(ref element, PanelGift, i, n, cmd);
i++;
n += 25;
}
while (n >= 200 && n <= 950) {
CreateNumberPadButton(ref element, PanelGift, i, n, cmd);
i++;
n += 50;
}
while (n >= 1000 && n <= 10000) {
CreateNumberPadButton(ref element, PanelGift, i, n, cmd);
i++;
n += 500;
}
}
UI.CreateButton(ref element, PanelGift, UIColors["buttonred"], GetMSG("Quit", player), 10, "0.03 0.02", "0.13 0.075", $"UI_AG_CancelGiftCreation");
CuiHelper.AddUi(player, element);
}
void OnScreen(BasePlayer player, string msg, string arg1 = "", string arg2 = "", string arg3 = "") {
if (timers.ContainsKey("Onscreen_"+player.userID.ToString())) {
timers["Onscreen_" + player.userID.ToString()].Destroy();
timers.Remove("Onscreen_" + player.userID.ToString());
}
CuiHelper.DestroyUi(player, PanelOnScreen);
var element = UI.CreateOverlayContainer(PanelOnScreen, "0.0 0.0 0.0 0.0", "0.15 0.8", "0.85.9");
UI.CreateTextOutline(ref element, PanelOnScreen, UIColors["white"], UIColors["black"], GetMSG(msg, player, arg1, arg2, arg3), 24, "0.0 0.0", "1.0 1.0");
CuiHelper.AddUi(player, element);
timers.Add("Onscreen_" + player.userID.ToString(), timer.Once(4, () => CuiHelper.DestroyUi(player, PanelOnScreen)));
}
#endregion
#region UI Calculations
void SetGiftPositions() {
GiftPositions.Clear();
int rows = 2;
int columns = 2;
if (max > 4) {
if (max <= 6) columns = 3;
else if (max <= 8) columns = 4;
else if (max <= 10) columns = 5;
else if (max <= 12) columns = 6;
}
//int rows = configData.GiftsPerPanel > 8 4;
//if (max % rows > 0)
//{
// if (max % 3 == 0) rows = 3;
// else if (max % 2 == 0) rows = 2;
// else max++;
//}
//Puts($"Number: {number}");
//Puts($"Max: {max}");
//int columns = max / rows;
//Puts($"Columns: {columns} - Rows {rows}");
//"0.2 0.15", "0.8 0.85"
Vector2 position = new Vector2(0.205f, .848f);
Vector2 dimensions = new Vector2();
dimensions.x = (.6f - (.005f * rows)) / rows;
dimensions.y = (.6f - (.01f * columns)) / columns;
position.y =.848f - dimensions.y;
float gap = (.6f - (dimensions.x * rows)) / (rows+1);
position.x =.2f + gap;
//position.x = (float)(1 - ((dimensions.x +.005f) * root));
int testValue = 0;
for (int i = 0; i < max; i++) {
float offsetY = 0;
float offsetX = 0;
if (i%columns != 0) {
testValue = i;
// Puts($"Index: {i}: TestValue {testValue}");
while (testValue - columns > 0) {
testValue -= columns;
// Puts($">>Index: {i}: TestValue {testValue}");
}
offsetY = (-0.01f - dimensions.y) * testValue;
}
offsetX = (dimensions.x + gap) * (i < columns ? 0 : (int)Math.Floor((double)i / columns));
Vector2 offset = new Vector2(offsetX, offsetY);
Vector2 posMin = position + offset;
Vector2 posMax = posMin + dimensions;
GiftPositions.Add(i, new float[] {
posMin.x, posMin.y, posMax.x, posMax.y
}
);
}
//foreach (var entry in GiftPositions)
// Puts($"{entry.Key}: MinX{entry.Value[0]}, MaxX{entry.Value[2]}, MinY{entry.Value[1]}, MaxY{entry.Value[3]}");
}
private float[] GiftPos(int number) {
return GiftPositions[number];
}
//private float[] GiftPos(int number)
//{
// Vector2 position = new Vector2(0.03f, 0.525f);
// Vector2 dimensions = new Vector2(0.46f, 0.425f);
// float offsetY = 0;
// float offsetX = 0;
// if (number >= 0 && number < 2)
// {
// offsetY = (-0.01f - dimensions.y) * number;
// }
// if (number > 1 && number < 4)
// {
// offsetX = dimensions.x + 0.005f;
// offsetY = (-0.01f - dimensions.y) * (number - 2);
// }
// Vector2 offset = new Vector2(offsetX, offsetY);
// Vector2 posMin = position + offset;
// Vector2 posMax = posMin + dimensions;
// return new float[] { posMin.x, posMin.y, posMax.x, posMax.y };
//}
private float[] FilterButton(int number) {
Vector2 position = new Vector2(0.01f, 1.01f);
Vector2 dimensions = new Vector2(0.1f, 0.04f);
float offsetY = 0;
float offsetX = 0;
if (number >= 0 && number < 10) {
offsetX = (0.01f + dimensions.x) * number;
}
if (number >= 10 && number < 20) {
offsetX = (0.01f + dimensions.x) * (number - 10);
offsetY = (-0.005f - dimensions.y) * 1;
}
Vector2 offset = new Vector2(offsetX, offsetY);
Vector2 posMin = position + offset;
Vector2 posMax = posMin + dimensions;
return new float[] {
posMin.x, posMin.y, posMax.x, posMax.y
}
;
}
private float[] BackgroundButton(int number) {
Vector2 position = new Vector2(0.3f, 0.97f);
Vector2 dimensions = new Vector2(0.035f, 0.03f);
float offsetY = 0;
float offsetX = 0;
offsetX = (0.005f + dimensions.x) * number;
Vector2 offset = new Vector2(offsetX, offsetY);
Vector2 posMin = position + offset;
Vector2 posMax = posMin + dimensions;
return new float[] {
posMin.x, posMin.y, posMax.x, posMax.y
}
;
}
private float[] giftentrypos(int number) {
Vector2 position = new Vector2(0.005f, 0.42f);
Vector2 dimensions = new Vector2(0.19f, 0.35f);
if (max > 4) {
if (max <= 6) dimensions.x = 0.15f;
else if (max <= 8) {
dimensions.x = 0.12f;
dimensions.y =.38f;
}
else if (max <= 10) dimensions.x = 0.1f;
else if (max <= 12) dimensions.x = 0.08f;
}
float gap = (1 - (dimensions.x *5)) / 6;
position.x = gap;
float offsetY = 0;
float offsetX = 0;
if (number >= 0 && number < 5) {
offsetX = (gap + dimensions.x) * number;
}
if (number > 4 && number < 10) {
offsetX = (gap + dimensions.x) * (number - 5);
offsetY = (-0.03f - dimensions.y) * 1;
}
Vector2 offset = new Vector2(offsetX, offsetY);
Vector2 posMin = position + offset;
Vector2 posMax = posMin + dimensions;
// ... [Code preview truncated due to length. Full source in attached file] ...