// 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 = "";
string MsgColor = "";
int max;
private Dictionary GiftPositions = new Dictionary();
private Dictionary timers = new Dictionary();
private Dictionary giftprep = new Dictionary();
private Dictionary AFK = new Dictionary();
private Dictionary UIinfo = new Dictionary();
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(x.shortname, 0)).ToList());
}
private void CreateLoadOrder()
{
Dictionary newLoadOrder = new Dictionary
{
{ "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(), 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() });
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 GetImageList(string shortname) => (List)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) + "" + MsgColor + msg + "");
}
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 UIColors = new Dictionary
{
{"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 TextColors = new Dictionary
{
{"limegreen", "" }
};
#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 completed = new List();
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().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;
return new float[] { posMin.x, posMin.y, posMax.x, posMax.y };
}
private float[] CalcButtonPos(int number)
{
Vector2 position = new Vector2(0.02f, 0.78f);
Vector2 dimensions = new Vector2(0.15f, 0.15f);
float offsetY = 0;
float offsetX = 0;
if (number >= 0 && number < 6)
{
offsetX = (0.01f + dimensions.x) * number;
}
if (number > 5 && number < 12)
{
offsetX = (0.01f + dimensions.x) * (number - 6);
offsetY = (-0.025f - dimensions.y) * 1;
}
if (number > 11 && number < 18)
{
offsetX = (0.01f + dimensions.x) * (number - 12);
offsetY = (-0.025f - dimensions.y) * 2;
}
if (number > 17 && number < 24)
{
offsetX = (0.01f + dimensions.x) * (number - 18);
offsetY = (-0.025f - dimensions.y) * 3;
}
if (number > 23 && number < 30)
{
offsetX = (0.01f + dimensions.x) * (number - 24);
offsetY = (-0.025f - dimensions.y) * 4;
}
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[] CalcNumButtonPos(int number)
{
Vector2 position = new Vector2(0.05f, 0.75f);
Vector2 dimensions = new Vector2(0.09f, 0.10f);
float offsetY = 0;
float offsetX = 0;
if (number >= 0 && number < 9)
{
offsetX = (0.01f + dimensions.x) * number;
}
if (number > 8 && number < 18)
{
offsetX = (0.01f + dimensions.x) * (number - 9);
offsetY = (-0.02f - dimensions.y) * 1;
}
if (number > 17 && number < 27)
{
offsetX = (0.01f + dimensions.x) * (number - 18);
offsetY = (-0.02f - dimensions.y) * 2;
}
if (number > 26 && number < 36)
{
offsetX = (0.01f + dimensions.x) * (number - 27);
offsetY = (-0.02f - dimensions.y) * 3;
}
if (number > 35 && number < 45)
{
offsetX = (0.01f + dimensions.x) * (number - 36);
offsetY = (-0.02f - dimensions.y) * 4;
}
if (number > 44 && number < 54)
{
offsetX = (0.01f + dimensions.x) * (number - 45);
offsetY = (-0.02f - dimensions.y) * 5;
}
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 };
}
#endregion
#region UI Commands
[ChatCommand("gift")]
private void cmdgift(BasePlayer player, string command, string[] args)
{
Background(player);
return;
}
[ChatCommand("max")]
private void chatmax(BasePlayer player, string command, string[] args)
{
//if not absolut doesnt work... for testing only. To prevent people fucking stuff up.
if (player.userID != 76561197977401750) return;
max = Convert.ToInt32(args[0]);
SetGiftPositions();
}
[ConsoleCommand("UI_AG_GiftMenu")]
private void cmdUI_AG_GiftMenu(ConsoleSystem.Arg arg)
{
var player = arg.Connection.player as BasePlayer;
if (player == null)
return;
int page;
if (arg.Args == null || arg.Args.Length == 0 || !int.TryParse(arg.Args[0], out page)) page = 0;
if (!UIinfo.ContainsKey(player.userID))
UIinfo.Add(player.userID, new Info { page = 0 });
UIinfo[player.userID].page = page;
for (int i = 0; i < max; i++)
CuiHelper.DestroyUi(player, "GiftEntry" + i);
GiftPanel(player);
}
[ConsoleCommand("UI_AG_SelectTime")]
private void cmdUI_AG_SelectTime(ConsoleSystem.Arg arg)
{
var player = arg.Connection.player as BasePlayer;
if (player == null)
return;
int time = Convert.ToInt32(arg.Args[0]);
if (agdata.Gifts.ContainsKey(time))
GetSendMSG(player, "TimeAlreadyExists", time.ToString());
giftprep[player.userID].time = time;
CreateGifts(player, 1);
}
[ConsoleCommand("UI_AG_VIP")]
private void cmdUI_AG_VIP(ConsoleSystem.Arg arg)
{
var player = arg.Connection.player as BasePlayer;
if (player == null)
return;
var answer = arg.Args[0];
if (answer == "true")
giftprep[player.userID].vip = true;
else giftprep[player.userID].vip = false;
UIinfo[player.userID].page = 0;
CreateGifts(player, 2);
}
[ConsoleCommand("UI_AG_ToggleAdmin")]
private void cmdUI_AG_ToggleAdmin(ConsoleSystem.Arg arg)
{
var player = arg.Connection.player as BasePlayer;
if (player == null || !isAuth(player)) return;
if (UIinfo[player.userID].admin)
UIinfo[player.userID].admin = false;
else UIinfo[player.userID].admin = true;
GiftPanel(player);
}
[ConsoleCommand("UI_AG_ChangeCat")]
private void cmdUI_AG_ChangeCat(ConsoleSystem.Arg arg)
{
var player = arg.Connection.player as BasePlayer;
if (player == null || !isAuth(player)) return;
ItemCategory cat = (ItemCategory)Enum.Parse(typeof(ItemCategory), arg.Args[0]);
UIinfo[player.userID].cat = cat;
UIinfo[player.userID].page = 0;
CreateGifts(player, 2);
}
[ConsoleCommand("UI_AG_CreateGifts")]
private void cmdUI_AG_CreateGifts(ConsoleSystem.Arg arg)
{
var player = arg.Connection.player as BasePlayer;
if (player == null || !isAuth(player)) return;
if (arg.Args == null || arg.Args.Length == 0) { DestroyGiftPanel(player, false); CreateGifts(player); }
else
{
int step;
if (!int.TryParse(arg.Args[0], out step)) return;
int page;
if (arg.Args.Length < 2 || !int.TryParse(arg.Args[1], out page)) page = 0;
UIinfo[player.userID].page = page;
CreateGifts(player, step);
}
}
[ConsoleCommand("UI_AG_RedeemGift")]
private void cmdUI_AG_RedeemGift(ConsoleSystem.Arg arg)
{
var player = arg.Connection.player as BasePlayer;
if (player == null)
return;
int ID;
if (!int.TryParse(arg.Args[0], out ID)) return;
if (agdata.Players[player.userID].pendingGift.ContainsKey(ID))
{
if(agdata.Gifts[ID].gifts.Count() > ((player.inventory.containerBelt.capacity - player.inventory.containerBelt.itemList.Count) + (player.inventory.containerWear.capacity - player.inventory.containerWear.itemList.Count) + (player.inventory.containerMain.capacity - player.inventory.containerMain.itemList.Count)))
{
GetSendMSG(player, "NotEnoughSpace");
return;
}
foreach (var entry in agdata.Players[player.userID].pendingGift[ID].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
{
Item item = ItemManager.CreateByItemID(entry.ID, entry.amount, entry.Skin);
if (item != null)
{
player.GiveItem(item);
GetSendMSG(player, "NewGiftGiven", item.amount.ToString(), item.info.displayName.english);
}
}
}
agdata.Players[player.userID].pendingGift.Remove(ID);
}
NewGiftIcon(player);
GiftPanel(player);
}
[ConsoleCommand("UI_AG_RemoveGift")]
private void cmdUI_AG_RemoveGift(ConsoleSystem.Arg arg)
{
var player = arg.Connection.player as BasePlayer;
if (player == null)
return;
int ID;
if (!int.TryParse(arg.Args[0], out ID)) return;
if (agdata.Gifts.ContainsKey(ID))
agdata.Gifts.Remove(ID);
GetSendMSG(player, "GiftRemoved", ID.ToString());
GiftPanel(player);
SaveData();
}
[ConsoleCommand("UI_AG_FinalizeGift")]
private void cmdUI_AG_FinalizeGift(ConsoleSystem.Arg arg)
{
var player = arg.Connection.player as BasePlayer;
if (player == null)
return;
if (agdata.Gifts.ContainsKey(giftprep[player.userID].time))
agdata.Gifts.Remove(giftprep[player.userID].time);
agdata.Gifts.Add(giftprep[player.userID].time, new GiftEntry {ID = giftprep[player.userID].time, gifts = giftprep[player.userID].gifts, vip = giftprep[player.userID].vip });
GetSendMSG(player, "NewGift", giftprep[player.userID].time.ToString());
SaveData();
UIinfo[player.userID].page = 0;
Background(player);
}
[ConsoleCommand("UI_AG_DestroyGiftPanel")]
private void cmdUI_AG_DestroyGiftPanel(ConsoleSystem.Arg arg)
{
var player = arg.Connection.player as BasePlayer;
if (player == null) return;
DestroyGiftPanel(player, true);
}
[ConsoleCommand("UI_AG_CancelGiftCreation")]
private void cmdUI_AG_CancelListing(ConsoleSystem.Arg arg)
{
var player = arg.Connection.player as BasePlayer;
if (player == null)
return;
CancelGiftCreation(player);
}
[ConsoleCommand("UI_AG_SelectGift")]
private void cmdUI_AG_SelectGift(ConsoleSystem.Arg arg)
{
var player = arg.Connection.player as BasePlayer;
if (player == null)
return;
int item;
if (int.TryParse(arg.Args[0], out item)) giftprep[player.userID].currentgift = new Gift { ID = item };
else
{
if (arg.Args[0] == "SR")
giftprep[player.userID].currentgift = new Gift { SR = true };
else if (arg.Args[0] == "ECO")
giftprep[player.userID].currentgift = new Gift { Eco = true };
else if (arg.Args[0] == "AC")
giftprep[player.userID].currentgift = new Gift { AC = true };
}
DestroyGiftPanel(player, false);
NumberPad(player, "UI_AG_SelectAmount", "SelectAmount");
}
[ConsoleCommand("UI_AG_SelectAmount")]
private void cmdUI_AG_SelectPriceAmount(ConsoleSystem.Arg arg)
{
var player = arg.Connection.player as BasePlayer;
if (player == null)
return;
int amount = Convert.ToInt32(arg.Args[0]);
giftprep[player.userID].currentgift.amount = amount;
giftprep[player.userID].gifts.Add(giftprep[player.userID].currentgift);
giftprep[player.userID].currentgift = null;
CreateGifts(player, 99);
}
#endregion
#region Timers
private void SaveLoop()
{
if (timers.ContainsKey("save"))
{
timers["save"].Destroy();
timers.Remove("save");
}
SaveData();
timers.Add("save", timer.Once(600, () => SaveLoop()));
}
private void InfoLoop()
{
if (timers.ContainsKey("info"))
{
timers["info"].Destroy();
timers.Remove("info");
}
if (configData.InfoInterval == 0) return;
foreach (BasePlayer p in BasePlayer.activePlayerList)
{
GetSendMSG(p, "AGInfo");
}
timers.Add("info", timer.Once(configData.InfoInterval * 60, () => InfoLoop()));
}
#endregion
#region Classes
class GiftData
{
public Dictionary Gifts = new Dictionary();
public Dictionary Players = new Dictionary();
}
class GiftEntry
{
public bool vip;
public List gifts = new List();
public int ID;
}
class Gift
{
public ulong Skin;
public int amount;
public int ID;
public bool SR;
public bool Eco;
public bool AC;
}
class playerdata
{
public int PlayerTime;
public Dictionary pendingGift = new Dictionary();
public List ReceivedGifts = new List();
public double ResetTime;
}
class GiftCreation
{
public int time;
public bool vip;
public List gifts = new List();
public Gift currentgift;
}
#endregion
#region Data Management
void SaveData()
{
AGData.WriteObject(agdata);
}
void LoadData()
{
try
{
agdata = AGData.ReadObject();
}
catch
{
Puts("Couldn't load the Absolut Gift Data, creating a new datafile");
agdata = new GiftData();
}
if (agdata.Gifts == null)
agdata.Gifts = new Dictionary();
if (agdata.Players == null)
agdata.Players = new Dictionary();
initialized = true;
}
#endregion
float Default_minx = 0.21f;
float Default_miny = 0.005f;
float Default_maxx = 0.34f;
float Default_maxy = 0.055f;
#region Config
private ConfigData configData;
class ConfigData
{
public int InfoInterval { get; set; }
public bool NoAFK { get; set; }
public bool UseGatherIncrease { get; set; }
public int ResetInDays { get; set; }
public int GiftsPerPanel { get; set; }
public bool HideVIP { get; set; }
public string GiftIconImage { get; set; }
public int UITextSize { get; set; }
public float minx { get; set; }
public float miny { get; set; }
public float maxx { get; set; }
public float maxy { get; set; }
}
private void LoadVariables()
{
LoadConfigVariables();
SaveConfig();
bool changed = false;
if (configData.maxx == new float() && configData.maxy == new float() && configData.minx == new float() && configData.miny == new float())
{
configData.minx = Default_minx;
configData.miny = Default_miny;
configData.maxx = Default_maxx;
configData.maxy = Default_maxy;
changed = true;
}
if (configData.GiftsPerPanel < 4)
{
configData.GiftsPerPanel = 4;
changed = true;
}
else if (configData.GiftsPerPanel > 12)
{
configData.GiftsPerPanel = 12;
Puts("You have Gift Per Panel set above 12. 12 is the max; and has been adjusted for you.");
changed = true;
}
if (configData.UITextSize <= 2)
{
configData.UITextSize = 12;
changed = true;
}
if(changed) SaveConfig(configData);
max = configData.GiftsPerPanel;
}
protected override void LoadDefaultConfig()
{
var config = new ConfigData
{
InfoInterval = 15,
NoAFK = true,
UseGatherIncrease = true,
ResetInDays = 1,
GiftIconImage = "http://i.imgur.com/zMe9ky5.png",
GiftsPerPanel = 4,
UITextSize = 12,
minx = Default_minx,
miny = Default_miny,
maxx = Default_maxx,
maxy = Default_maxy,
};
SaveConfig(config);
}
private void LoadConfigVariables() => configData = Config.ReadObject();
void SaveConfig(ConfigData config) => Config.WriteObject(config, true);
#endregion
#region Messages
Dictionary messages = new Dictionary()
{
{"title", "Absolut Gifts: " },
{"AGInfo", "This server is running Absolut Gifts. Type /gift to access the Gift Menu!"},
{"Next", "Next" },
{"Back", "Back" },
{"First", "First" },
{"Last", "Last" },
{"Close", "Close"},
{"Quit", "Quit"},
{"ImgReload", "Images have been wiped and reloaded!" },
{"ImgRefresh", "Images have been refreshed !" },
{"NewGiftInfo", "New Gift Information for Playing {0} Minute(s)." },
{"GiftDetails", "{1} - {0}" },
{"TimeAlreadyExists", "The select time {0} already exists as a Gift, if you continue the old entry will be removed" },
{"GiftCreationCanceled", "You have successfully cancelled Gift Creation." },
{"ToggleAdmin", "Toggle Admin" },
{"Delete", "Delete" },
{"GiftTitle", "Gift Requirement: {0} Minute(s)" },
{"GiftTitleInProgress", "IN PROGRESS: {0} Minute(s)\nYou have {1} Minute(s) Remaining!" },
{"GiftTitleCompleted", "COMPLETED: {0} Minute(s)" },
{"NewGift", "You have successfully created a new gift for {0} Minute(s)!" },
{"GiftRemoved", "You have deleted the gift for {0} Minute(s)!" },
{"NewGiftGiven", "You have been given {0} {1} for your PlayTime! Thanks for playing on the server today!" },
{"SelectTime", "Select Minute Requirement for this Gift..." },
{"SelectAmount", "Select the amount of the chosen item for this Gift." },
{"CreateGift", "Create a Gift" },
{"ManageGifts", "Manage Gifts" },
{"SelectGift", "Select a Gift Item" },
{"FinalizeGift", "Save Gift" },
{"AddToGift", "Add More..." },
{"Cancel", "Cancel" },
{"NotAuth", "You are not an admin." },
{"VIPGift", "Make this a VIP only gift?" },
{"Yes", "Yes" },
{"No", "No" },
{"Redeem", "Redeem" },
{"CompletedNewGift", "You have been given a new gift for the {0} Minute PlayTime Objective!" },
{"AccumulatedTime", "Accumulated Time: {0}" },
{"NotEnoughSpace", "You do not have enough room to redeem this gift!" },
{"WaitingImageLibrary", "Waiting on Image Library to initialize. Trying again in 60 Seconds" },
};
#endregion
}
}