Advertisement
MONaH-Rasta

Quests

Jul 30th, 2020
166
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 152.89 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Globalization;
  4. using Oxide.Core;
  5. using Oxide.Core.Configuration;
  6. using Oxide.Core.Libraries.Covalence;
  7. using Oxide.Game.Rust.Cui;
  8. using Oxide.Core.Plugins;
  9. using UnityEngine;
  10. using System.Linq;
  11.  
  12. namespace Oxide.Plugins
  13. {
  14.     [Info("Quests", "k1lly0u", "2.3.2")]
  15.     [Description("Creates quests for players to go on to earn rewards, complete with a GUI menu")]
  16.     public class Quests : RustPlugin
  17.     {
  18.         #region Fields
  19.         [PluginReference] Plugin HumanNPC;
  20.         [PluginReference] Plugin ServerRewards;
  21.         [PluginReference] Plugin Economics;
  22.         [PluginReference] Plugin LustyMap;
  23.         [PluginReference] Plugin EventManager;
  24.         [PluginReference] Plugin HuntRPG;
  25.         [PluginReference] Plugin PlayerChallenges;
  26.         [PluginReference] Plugin BetterChat;
  27.  
  28.         ConfigData configData;
  29.  
  30.         QuestData questData;
  31.         PlayerData playerData;
  32.         NPCData vendors;
  33.         ItemNames itemNames;
  34.         private DynamicConfigFile Quest_Data;
  35.         private DynamicConfigFile Player_Data;
  36.         private DynamicConfigFile Quest_Vendors;
  37.         private DynamicConfigFile Item_Names;
  38.  
  39.         private Dictionary<ulong, PlayerQuestData> PlayerProgress;
  40.         private Dictionary<QuestType, Dictionary<string, QuestEntry>> Quest;
  41.  
  42.         private Dictionary<string, ItemDefinition> ItemDefs;
  43.         private Dictionary<string, string> DisplayNames = new Dictionary<string, string>();
  44.  
  45.         private Dictionary<ulong, QuestCreator> ActiveCreations = new Dictionary<ulong, QuestCreator>();
  46.         private Dictionary<ulong, QuestCreator> ActiveEditors = new Dictionary<ulong, QuestCreator>();
  47.  
  48.         private Dictionary<ulong, bool> AddVendor = new Dictionary<ulong, bool>();
  49.  
  50.         private Dictionary<QuestType, List<string>> AllObjectives = new Dictionary<QuestType, List<string>>();
  51.         private Dictionary<uint, Dictionary<ulong, int>> HeliAttackers = new Dictionary<uint, Dictionary<ulong, int>>();
  52.  
  53.         private Dictionary<ulong, List<string>> OpenUI = new Dictionary<ulong, List<string>>();
  54.         private Dictionary<uint, ulong> Looters = new Dictionary<uint, ulong>();
  55.  
  56.         private List<ulong> StatsMenu = new List<ulong>();
  57.         private List<ulong> OpenMenuBind = new List<ulong>();
  58.  
  59.         static string UIMain = "UIMain";
  60.         static string UIPanel = "UIPanel";
  61.         static string UIEntry = "UIEntry";
  62.  
  63.         private string textPrimary;
  64.         private string textSecondary;
  65.         #endregion
  66.  
  67.         #region Classes
  68.         class PlayerQuestData
  69.         {
  70.             public Dictionary<string, PlayerQuestInfo> Quests = new Dictionary<string, PlayerQuestInfo>();
  71.             public List<QuestInfo> RequiredItems = new List<QuestInfo>();
  72.             public ActiveDelivery CurrentDelivery = new ActiveDelivery();
  73.         }
  74.         class PlayerQuestInfo
  75.         {
  76.             public QuestStatus Status;
  77.             public QuestType Type;
  78.             public int AmountCollected = 0;
  79.             public bool RewardClaimed = false;
  80.             public double ResetTime = 0;
  81.         }
  82.         class QuestEntry
  83.         {
  84.             public string QuestName;
  85.             public string Description;
  86.             public string Objective;
  87.             public string ObjectiveName;
  88.             public int AmountRequired;
  89.             public int Cooldown;
  90.             public bool ItemDeduction;
  91.             public List<RewardItem> Rewards;
  92.         }
  93.         class NPCInfo
  94.         {
  95.             public float x;
  96.             public float z;
  97.             public string ID;
  98.             public string Name;
  99.         }
  100.         class DeliveryInfo
  101.         {
  102.             public string Description;
  103.             public NPCInfo Info;
  104.             public RewardItem Reward;
  105.             public float Multiplier;
  106.         }
  107.         class ActiveDelivery
  108.         {
  109.             public string VendorID;
  110.             public string TargetID;
  111.             public float Distance;
  112.         }
  113.         class QuestInfo
  114.         {
  115.             public string ShortName;
  116.             public QuestType Type;
  117.         }
  118.         class RewardItem
  119.         {
  120.             public bool isRP = false;
  121.             public bool isCoins = false;
  122.             public bool isHuntXP = false;
  123.             public string DisplayName;
  124.             public string ShortName;
  125.             public int ID;
  126.             public float Amount;
  127.             public bool BP;
  128.             public ulong Skin;
  129.         }
  130.         class QuestCreator
  131.         {
  132.             public QuestType type;
  133.             public QuestEntry entry;
  134.             public DeliveryInfo deliveryInfo;
  135.             public RewardItem item;
  136.             public string oldEntry;
  137.             public int partNum;
  138.         }
  139.         class ItemNames
  140.         {
  141.             public Dictionary<string, string> DisplayNames = new Dictionary<string, string>();
  142.         }
  143.  
  144.         enum QuestType
  145.         {
  146.             Kill,
  147.             Craft,
  148.             Gather,
  149.             Loot,
  150.             Delivery
  151.         }
  152.         enum QuestStatus
  153.         {
  154.             Pending,
  155.             Completed,
  156.             Open
  157.         }
  158.         #endregion
  159.  
  160.         #region UI Creation
  161.         class QUI
  162.         {
  163.             public static bool disableFade;
  164.             static public CuiElementContainer CreateElementContainer(string panelName, string color, string aMin, string aMax, bool cursor = false)
  165.             {
  166.                 var NewElement = new CuiElementContainer()
  167.                 {
  168.                     {
  169.                         new CuiPanel
  170.                         {
  171.                             Image = {Color = color},
  172.                             RectTransform = {AnchorMin = aMin, AnchorMax = aMax},
  173.                             CursorEnabled = cursor
  174.                         },
  175.                         new CuiElement().Parent = "Overlay",
  176.                         panelName
  177.                     }
  178.                 };
  179.                 return NewElement;
  180.             }
  181.             static public void CreatePanel(ref CuiElementContainer container, string panel, string color, string aMin, string aMax, bool cursor = false)
  182.             {
  183.                 container.Add(new CuiPanel
  184.                 {
  185.                     Image = { Color = color },
  186.                     RectTransform = { AnchorMin = aMin, AnchorMax = aMax },
  187.                     CursorEnabled = cursor
  188.                 },
  189.                 panel);
  190.             }
  191.             static public void CreateLabel(ref CuiElementContainer container, string panel, string color, string text, int size, string aMin, string aMax, TextAnchor align = TextAnchor.MiddleCenter, float fadein = 1.0f)
  192.             {
  193.                 if (disableFade)
  194.                     fadein = 0;
  195.                 container.Add(new CuiLabel
  196.                 {
  197.                     Text = { Color = color, FontSize = size, Align = align, FadeIn = fadein, Text = text },
  198.                     RectTransform = { AnchorMin = aMin, AnchorMax = aMax }
  199.                 },
  200.                 panel);
  201.  
  202.             }
  203.             static public void CreateButton(ref CuiElementContainer container, string panel, string color, string text, int size, string aMin, string aMax, string command, TextAnchor align = TextAnchor.MiddleCenter, float fadein = 1.0f)
  204.             {
  205.                 if (disableFade)
  206.                     fadein = 0;
  207.                 container.Add(new CuiButton
  208.                 {
  209.                     Button = { Color = color, Command = command, FadeIn = fadein },
  210.                     RectTransform = { AnchorMin = aMin, AnchorMax = aMax },
  211.                     Text = { Text = text, FontSize = size, Align = align }
  212.                 },
  213.                 panel);
  214.             }
  215.             static public void LoadImage(ref CuiElementContainer container, string panel, string png, string aMin, string aMax)
  216.             {
  217.                 container.Add(new CuiElement
  218.                 {
  219.                     Parent = panel,
  220.                     Components =
  221.                     {
  222.                         new CuiRawImageComponent {Png = png },
  223.                         new CuiRectTransformComponent {AnchorMin = aMin, AnchorMax = aMax }
  224.                     }
  225.                 });
  226.             }
  227.             static public void CreateTextOverlay(ref CuiElementContainer container, string panel, string text, string color, int size, string aMin, string aMax, TextAnchor align = TextAnchor.MiddleCenter, float fadein = 1.0f)
  228.             {
  229.                 if (disableFade)
  230.                     fadein = 0;
  231.                 container.Add(new CuiLabel
  232.                 {
  233.                     Text = { Color = color, FontSize = size, Align = align, FadeIn = fadein, Text = text },
  234.                     RectTransform = { AnchorMin = aMin, AnchorMax = aMax }
  235.                 },
  236.                 panel);
  237.  
  238.             }
  239.             static public string Color(string hexColor, float alpha)
  240.             {
  241.                 if (hexColor.StartsWith("#"))
  242.                     hexColor = hexColor.TrimStart('#');
  243.                 int red = int.Parse(hexColor.Substring(0, 2), NumberStyles.AllowHexSpecifier);
  244.                 int green = int.Parse(hexColor.Substring(2, 2), NumberStyles.AllowHexSpecifier);
  245.                 int blue = int.Parse(hexColor.Substring(4, 2), NumberStyles.AllowHexSpecifier);
  246.                 return $"{(double)red / 255} {(double)green / 255} {(double)blue / 255} {alpha}";
  247.             }
  248.         }
  249.         #endregion
  250.  
  251.         #region Oxide Hooks
  252.         void Loaded()
  253.         {
  254.             Quest_Data = Interface.Oxide.DataFileSystem.GetFile("Quests/quests_data");
  255.             Player_Data = Interface.Oxide.DataFileSystem.GetFile("Quests/quests_players");
  256.             Quest_Vendors = Interface.Oxide.DataFileSystem.GetFile("Quests/quests_vendors");
  257.             Item_Names = Interface.Oxide.DataFileSystem.GetFile("Quests/quests_itemnames");
  258.             lang.RegisterMessages(Localization, this);
  259.         }
  260.         void OnServerInitialized()
  261.         {
  262.             LoadVariables();
  263.             LoadData();
  264.  
  265.             QUI.disableFade = configData.DisableUI_FadeIn;
  266.             textPrimary = $"<color={configData.Colors.TextColor_Primary}>";
  267.             textSecondary = $"<color={configData.Colors.TextColor_Secondary}>";
  268.  
  269.             ItemDefs = ItemManager.itemList.ToDictionary(i => i.shortname);
  270.             FillObjectiveList();
  271.             AddMapIcons();
  272.             timer.Once(900, () => SaveLoop());
  273.         }
  274.         void Unload()
  275.         {
  276.             foreach (var player in BasePlayer.activePlayerList)
  277.                 DestroyUI(player);
  278.             SavePlayerData();
  279.         }
  280.         void OnPlayerConnected(BasePlayer player)
  281.         {
  282.             if (configData.KeybindOptions.Autoset_KeyBind)
  283.             {
  284.                 if (!string.IsNullOrEmpty(configData.KeybindOptions.KeyBind_Key))
  285.                 {
  286.                     player.Command("bind " + configData.KeybindOptions.KeyBind_Key + " QUI_OpenQuestMenu");
  287.                 }
  288.             }
  289.         }
  290.  
  291.         #region Objective Hooks
  292.         //Kill
  293.         void OnEntityDeath(BaseCombatEntity entity, HitInfo info)
  294.         {
  295.             try
  296.             {
  297.                 if (entity == null || info == null) return;
  298.                 string entname = entity?.ShortPrefabName;
  299.                 if (entname.Contains("scientist"))
  300.                 {
  301.                     entname = "scientist";
  302.                 }
  303.                 if (entname == "testridablehorse")
  304.                 {
  305.                     entname = "horse";
  306.                 }
  307.                 BasePlayer player = null;
  308.  
  309.                 if (info.InitiatorPlayer != null)
  310.                     player = info.InitiatorPlayer;
  311.                 else if (entity.GetComponent<BaseHelicopter>() != null)
  312.                     player = BasePlayer.FindByID(GetLastAttacker(entity.net.ID));
  313.  
  314.                 if (player != null)
  315.                 {
  316.                     if (entity.ToPlayer() != null && entity.ToPlayer() == player) return;
  317.                     if (isPlaying(player)) return;
  318.                     if (hasQuests(player.userID) && isQuestItem(player.userID, entname, QuestType.Kill))
  319.                         ProcessProgress(player, QuestType.Kill, entname);
  320.                 }
  321.             }
  322.             catch (Exception ex)
  323.             {
  324.             }
  325.         }
  326.         void OnEntityTakeDamage(BaseCombatEntity victim, HitInfo info)
  327.         {
  328.             if (victim.GetComponent<BaseHelicopter>() != null && info?.Initiator?.ToPlayer() != null)
  329.             {
  330.                 var heli = victim.GetComponent<BaseHelicopter>();
  331.                 var player = info.Initiator.ToPlayer();
  332.                 if (isPlaying(player)) return;
  333.                 NextTick(() =>
  334.                 {
  335.                     if (heli == null) return;
  336.                     if (!HeliAttackers.ContainsKey(heli.net.ID))
  337.                         HeliAttackers.Add(heli.net.ID, new Dictionary<ulong, int>());
  338.                     if (!HeliAttackers[heli.net.ID].ContainsKey(player.userID))
  339.                         HeliAttackers[heli.net.ID].Add(player.userID, 0);
  340.                     HeliAttackers[heli.net.ID][player.userID]++;
  341.                 });
  342.             }
  343.         }
  344.         // Gather
  345.         void OnDispenserGather(ResourceDispenser dispenser, BaseEntity entity, Item item)
  346.         {
  347.             BasePlayer player = entity?.ToPlayer();
  348.             if (player != null)
  349.                 if (hasQuests(player.userID) && isQuestItem(player.userID, item.info.shortname, QuestType.Gather))
  350.                     ProcessProgress(player, QuestType.Gather, item.info.shortname, item.amount);
  351.         }
  352.  
  353.         void OnDispenserBonus(ResourceDispenser dispenser, BaseEntity entity, Item item) => OnDispenserGather(dispenser, entity, item);
  354.  
  355.         void OnGrowableGather(GrowableEntity growable, Item item, BasePlayer player)
  356.         {
  357.             if (player != null)
  358.                 if (hasQuests(player.userID) && isQuestItem(player.userID, item.info.shortname, QuestType.Gather))
  359.                     ProcessProgress(player, QuestType.Gather, item.info.shortname, item.amount);
  360.         }
  361.         void OnCollectiblePickup(Item item, BasePlayer player)
  362.         {
  363.            if (player != null)
  364.                 if (hasQuests(player.userID) && isQuestItem(player.userID, item.info.shortname, QuestType.Gather))
  365.                     ProcessProgress(player, QuestType.Gather, item.info.shortname, item.amount);
  366.         }
  367.         //Craft
  368.         void OnItemCraftFinished(ItemCraftTask task, Item item)
  369.         {
  370.             var player = task.owner;
  371.             if (player != null)
  372.                 if (hasQuests(player.userID) && isQuestItem(player.userID, item.info.shortname, QuestType.Craft))
  373.                     ProcessProgress(player, QuestType.Craft, item.info.shortname, item.amount);
  374.         }
  375.         //Loot
  376.         void OnItemAddedToContainer(ItemContainer container, Item item)
  377.         {
  378.             if (Looters.ContainsKey(item.uid))
  379.             {
  380.                 if (container.playerOwner != null)
  381.                 {
  382.                     if (Looters[item.uid] != container.playerOwner.userID)
  383.                     {
  384.                         if (hasQuests(container.playerOwner.userID) && isQuestItem(container.playerOwner.userID, item.info.shortname, QuestType.Loot))
  385.                         {
  386.                             ProcessProgress(container.playerOwner, QuestType.Loot, item.info.shortname, item.amount);
  387.                             Looters.Remove(item.uid);
  388.                         }
  389.                     }
  390.                 }
  391.             }
  392.             else if (container.playerOwner != null) Looters.Add(item.uid, container.playerOwner.userID);
  393.         }
  394.         void OnItemRemovedFromContainer(ItemContainer container, Item item)
  395.         {
  396.             ulong id = 0U;
  397.             if (container.entityOwner != null)
  398.                 id = container.entityOwner.OwnerID;
  399.             else if (container.playerOwner != null)
  400.                 id = container.playerOwner.userID;
  401.  
  402.             if (!Looters.ContainsKey(item.uid))
  403.                 Looters.Add(item.uid, id);
  404.         }
  405.         // Delivery and Vendors
  406.         void OnUseNPC(BasePlayer npc, BasePlayer player)
  407.         {
  408.             if (player == null || npc == null) return;
  409.             CheckPlayerEntry(player);
  410.             var npcID = npc.UserIDString;
  411.             if (vendors.QuestVendors.ContainsKey(npcID) && configData.UseNPCVendors)
  412.             {
  413.                 CreateMenu(player);
  414.                 return;
  415.             }
  416.             if (vendors.DeliveryVendors.ContainsKey(npcID))
  417.             {
  418.                 if (hasQuests(player.userID) && PlayerProgress[player.userID].CurrentDelivery.TargetID == npc.UserIDString)
  419.                     AcceptDelivery(player, npcID, 1);
  420.  
  421.                 if (hasQuests(player.userID) && string.IsNullOrEmpty(PlayerProgress[player.userID].CurrentDelivery.TargetID))
  422.                     AcceptDelivery(player, npcID);
  423.                 else SendMSG(player, LA("delInprog", player.UserIDString), LA("Quests", player.UserIDString));
  424.             }
  425.         }
  426.         #endregion
  427.  
  428.         object OnPlayerChat(ConsoleSystem.Arg arg)
  429.         {
  430.             if (BetterChat) return null;
  431.  
  432.             var player = arg.Connection.player as BasePlayer;
  433.             if (player == null)
  434.                 return null;
  435.  
  436.             if (ActiveEditors.ContainsKey(player.userID) || ActiveCreations.ContainsKey(player.userID) || AddVendor.ContainsKey(player.userID))
  437.             {
  438.                 QuestChat(player,arg.Args);
  439.  
  440.                 return false;
  441.             }
  442.             return null;
  443.         }
  444.         object OnBetterChat(Dictionary<string, object> dict)
  445.         {
  446.             var player = (dict["Player"] as IPlayer).Object as BasePlayer;
  447.             if (player == null) return null;
  448.             string message = dict["Message"].ToString();
  449.             if (ActiveEditors.ContainsKey(player.userID) || ActiveCreations.ContainsKey(player.userID) || AddVendor.ContainsKey(player.userID))
  450.             {
  451.                 QuestChat(player, message.Split(' '));
  452.                 return false;
  453.             }
  454.             return dict;
  455.         }
  456.         void QuestChat(BasePlayer player, string[] arg)
  457.         {
  458.             bool isEditing = false;
  459.             bool isCreating = false;
  460.             QuestCreator Creator = new QuestCreator();
  461.             QuestEntry Quest = new QuestEntry();
  462.  
  463.             if (ActiveEditors.ContainsKey(player.userID))
  464.             {
  465.                 isEditing = true;
  466.                 Creator = ActiveEditors[player.userID];
  467.                 Quest = Creator.entry;
  468.             }
  469.             else if (ActiveCreations.ContainsKey(player.userID))
  470.             {
  471.                 isCreating = true;
  472.                 Creator = ActiveCreations[player.userID];
  473.                 Quest = Creator.entry;
  474.             }
  475.             if (AddVendor.ContainsKey(player.userID) && string.Join(" ", arg).Contains("exit"))
  476.             {
  477.                 ExitQuest(player, true);
  478.                 return;
  479.             }
  480.  
  481.             if (!isEditing && !isCreating)
  482.                 return;
  483.  
  484.             var args = string.Join(" ", arg);
  485.             if (args.Contains("exit"))
  486.             {
  487.                 ExitQuest(player, isCreating);
  488.                 return;
  489.             }
  490.  
  491.             if (args.Contains("quest item"))
  492.             {
  493.                 var item = GetItem(player);
  494.                 if (item != null)
  495.                 {
  496.                     if (Creator.type != QuestType.Delivery)
  497.                     {
  498.                         Quest.Rewards.Add(item);
  499.                         Creator.partNum++;
  500.                         if (isCreating)
  501.                             CreationHelp(player, 7);
  502.                         else if (isEditing)
  503.                         {
  504.                             SaveRewardsEdit(player);
  505.                             CreationHelp(player, 10);
  506.                         }
  507.                     }
  508.                     else
  509.                     {
  510.                         Creator.deliveryInfo.Reward = item;
  511.                         DeliveryHelp(player, 4);
  512.                     }
  513.                 }
  514.                 else SendMSG(player, $"{LA("noAItem", player.UserIDString)}'quest item'", LA("QC", player.UserIDString));
  515.  
  516.                 return;
  517.             }
  518.  
  519.             switch (Creator.partNum)
  520.             {
  521.                 case 0:
  522.                     foreach (var type in questData.Quest)
  523.                     {
  524.                         if (type.Value.ContainsKey(args))
  525.                         {
  526.                             SendMSG(player, LA("nameExists", player.UserIDString), LA("QC", player.UserIDString));
  527.                             return;
  528.                         }
  529.                     }
  530.                     Quest.QuestName = args;
  531.                     SendMSG(player, args, "Name:");
  532.                     Creator.partNum++;
  533.                     if (isCreating)
  534.                         CreationHelp(player, 1);
  535.                     else CreationHelp(player, 6);
  536.                     return;
  537.                 case 2:
  538.                     {
  539.                         int amount;
  540.                         if (!int.TryParse(arg[0], out amount))
  541.                         {
  542.                             SendMSG(player, LA("objAmount", player.UserIDString), LA("QC", player.UserIDString));
  543.                             return;
  544.                         }
  545.                         Quest.AmountRequired = amount;
  546.                         SendMSG(player, args, LA("OA", player.UserIDString));
  547.                         Creator.partNum++;
  548.                         if (isCreating)
  549.                             CreationHelp(player, 3);
  550.                         else CreationHelp(player, 6);
  551.                     }
  552.                     return;
  553.                 case 3:
  554.                     {
  555.                         if (Creator.type == QuestType.Delivery)
  556.                         {
  557.                             Creator.deliveryInfo.Description = args;
  558.                             SendMSG(player, args, LA("Desc", player.UserIDString));
  559.                             DeliveryHelp(player, 6);
  560.                             return;
  561.                         }
  562.                         Quest.Description = args;
  563.                         SendMSG(player, args, LA("Desc", player.UserIDString));
  564.                         Creator.partNum++;
  565.                         if (isCreating)
  566.                             CreationHelp(player, 4);
  567.                         else CreationHelp(player, 6);
  568.                     }
  569.                     return;
  570.                 case 5:
  571.                     {
  572.                         if (Creator.type == QuestType.Delivery)
  573.                         {
  574.                             float amount;
  575.                             if (!float.TryParse(arg[0], out amount))
  576.                             {
  577.                                 SendMSG(player, LA("noRM", player.UserIDString), LA("QC", player.UserIDString));
  578.                                 return;
  579.                             }
  580.                             Creator.deliveryInfo.Multiplier = amount;
  581.  
  582.                             SendMSG(player, args, LA("RM", player.UserIDString));
  583.                             Creator.partNum++;
  584.                             DeliveryHelp(player, 5);
  585.                         }
  586.                         else
  587.                         {
  588.                             int amount;
  589.                             if (!int.TryParse(arg[0], out amount))
  590.                             {
  591.                                 SendMSG(player, LA("noRA", player.UserIDString), LA("QC", player.UserIDString));
  592.                                 return;
  593.                             }
  594.                             Creator.item.Amount = amount;
  595.                             Quest.Rewards.Add(Creator.item);
  596.                             Creator.item = new RewardItem();
  597.                             SendMSG(player, args, LA("RA", player.UserIDString));
  598.                             Creator.partNum++;
  599.                             if (isCreating)
  600.                                 CreationHelp(player, 7);
  601.                             else if (isEditing)
  602.                             {
  603.                                 SaveRewardsEdit(player);
  604.                             }
  605.                         }
  606.                         return;
  607.                     }
  608.                 case 6:
  609.                     {
  610.                         int amount;
  611.                         if (!int.TryParse(arg[0], out amount))
  612.                         {
  613.                             SendMSG(player, LA("noCD", player.UserIDString), LA("QC", player.UserIDString));
  614.                             return;
  615.                         }
  616.                         Creator.entry.Cooldown = amount;
  617.                         SendMSG(player, args, LA("CD1", player.UserIDString));
  618.                         CreationHelp(player, 6);
  619.                     }
  620.                     return;
  621.                 default:
  622.                     break;
  623.             }
  624.         }
  625.         #endregion
  626.  
  627.         #region External Calls
  628.         private bool isPlaying(BasePlayer player)
  629.         {
  630.             if (EventManager)
  631.             {
  632.                 var inEvent = EventManager?.Call("isPlaying", player);
  633.                 if (inEvent is bool && (bool)inEvent)
  634.                     return true;
  635.             }
  636.             return false;
  637.         }
  638.         private void CloseMap(BasePlayer player)
  639.         {
  640.             if (LustyMap)
  641.             {
  642.                 LustyMap.Call("DisableMaps", player);
  643.             }
  644.         }
  645.         private void OpenMap(BasePlayer player)
  646.         {
  647.             if (LustyMap)
  648.             {
  649.                 LustyMap.Call("EnableMaps", player);
  650.             }
  651.         }
  652.         private void AddMapMarker(float x, float z, string name, string icon = "special", float r = 0)
  653.         {
  654.             if (LustyMap)
  655.                 LustyMap.Call("AddMarker", x, z, name, icon);
  656.         }
  657.         private void RemoveMapMarker(string name)
  658.         {
  659.             if (LustyMap)
  660.                 LustyMap.Call("RemoveMarker", name);
  661.         }
  662.         private object CanTeleport(BasePlayer player)
  663.         {
  664.             if (!PlayerProgress.ContainsKey(player.userID)) return null;
  665.  
  666.             if (!string.IsNullOrEmpty(PlayerProgress[player.userID].CurrentDelivery.TargetID))
  667.             {
  668.                 return LA("NoTP", player.UserIDString);
  669.             }
  670.             else
  671.                 return null;
  672.         }
  673.         #endregion
  674.  
  675.         #region Objective Lists
  676.         private void FillObjectiveList()
  677.         {
  678.             AllObjectives.Add(QuestType.Loot, new List<string>());
  679.             AllObjectives.Add(QuestType.Craft, new List<string>());
  680.             AllObjectives.Add(QuestType.Kill, new List<string>());
  681.             AllObjectives.Add(QuestType.Gather, new List<string>());
  682.             AllObjectives.Add(QuestType.Delivery, new List<string>());
  683.             GetAllCraftables();
  684.             GetAllItems();
  685.             GetAllKillables();
  686.             GetAllResources();
  687.             foreach (var category in AllObjectives)
  688.                 category.Value.Sort();
  689.  
  690.             if (itemNames.DisplayNames == null || itemNames.DisplayNames.Count < 1)
  691.             {
  692.                 foreach (var item in ItemDefs)
  693.                 {
  694.                     if (!DisplayNames.ContainsKey(item.Key))
  695.                         DisplayNames.Add(item.Key, item.Value.displayName.translated);
  696.                 }
  697.                 SaveDisplayNames();
  698.             }
  699.             else DisplayNames = itemNames.DisplayNames;
  700.         }
  701.         private void GetAllItems()
  702.         {
  703.             foreach (var item in ItemManager.itemList)
  704.                 AllObjectives[QuestType.Loot].Add(item.shortname);
  705.         }
  706.         private void GetAllCraftables()
  707.         {
  708.             foreach (var bp in ItemManager.bpList)
  709.                 if (bp.userCraftable)
  710.                     AllObjectives[QuestType.Craft].Add(bp.targetItem.shortname);
  711.         }
  712.         private void GetAllResources()
  713.         {
  714.             AllObjectives[QuestType.Gather] = new List<string>
  715.             {
  716.                 "wood",
  717.                 "stones",
  718.                 "metal.ore",
  719.                 "hq.metal.ore",
  720.                 "sulfur.ore",
  721.                 "cloth",
  722.                 "bone.fragments",
  723.                 "crude.oil",
  724.                 "fat.animal",
  725.                 "leather",
  726.                 "skull.wolf",
  727.                 "skull.human",
  728.                 "chicken.raw",
  729.                 "mushroom",
  730.                 "meat.boar",
  731.                 "bearmeat",
  732.                 "humanmeat.raw",
  733.                 "wolfmeat.raw"
  734.             };
  735.         }
  736.         private void GetAllKillables()
  737.         {
  738.             AllObjectives[QuestType.Kill] = new List<string>
  739.             {
  740.                 "bear",
  741.                 "boar",
  742.                 "bradleyapc",
  743.                 "chicken",
  744.                 "horse",
  745.                 "stag",
  746.                 "wolf",
  747.                 "autoturret_deployed",
  748.                 "patrolhelicopter",
  749.                 "player",
  750.                 "scientist",
  751.                 "murderer"
  752.             };
  753.             DisplayNames.Add("bear", "Bear");
  754.             DisplayNames.Add("boar", "Boar");
  755.             DisplayNames.Add("bradleyapc", "BradleyAPC");
  756.             DisplayNames.Add("chicken", "Chicken");
  757.             DisplayNames.Add("horse", "Horse");
  758.             DisplayNames.Add("stag", "Stag");
  759.             DisplayNames.Add("wolf", "Wolf");
  760.             DisplayNames.Add("autoturret_deployed", "Auto-Turret");
  761.             DisplayNames.Add("patrolhelicopter", "Helicopter");
  762.             DisplayNames.Add("player", "Player");
  763.             DisplayNames.Add("scientist", "Scientist");
  764.             DisplayNames.Add("murderer", "Murderer");
  765.         }
  766.         #endregion
  767.  
  768.         #region Functions
  769.         void AddMapIcons()
  770.         {
  771.             int deliveryCount = 1;
  772.             foreach(var vendor in vendors.DeliveryVendors)
  773.             {
  774.                 AddMapMarker(vendor.Value.Info.x, vendor.Value.Info.z, vendor.Value.Info.Name, $"{configData.LustyMapIntegration.Icon_Delivery}_{deliveryCount}.png");
  775.                 ++deliveryCount;
  776.             }
  777.             foreach(var vendor in vendors.QuestVendors)
  778.             {
  779.                 AddMapMarker(vendor.Value.x, vendor.Value.z, vendor.Value.Name, $"{configData.LustyMapIntegration.Icon_Vendor}.png");
  780.             }
  781.         }
  782.         private void ProcessProgress(BasePlayer player, QuestType questType, string type, int amount = 0)
  783.         {
  784.             if (string.IsNullOrEmpty(type)) return;
  785.             var data = PlayerProgress[player.userID];
  786.             if (data.RequiredItems.Count > 0)
  787.             {
  788.                 foreach (var entry in data.Quests.Where(x => x.Value.Status == QuestStatus.Pending))
  789.                 {
  790.                     var quest = GetQuest(entry.Key);
  791.                     if (quest != null)
  792.                     {
  793.                         if (type == quest.Objective)
  794.                         {
  795.                             if (amount > 0)
  796.                             {
  797.                                 var amountRequired = quest.AmountRequired - entry.Value.AmountCollected;
  798.                                 if (amount > amountRequired)
  799.                                     amount = amountRequired;
  800.                                 entry.Value.AmountCollected += amount;
  801.  
  802.                                 if (quest.ItemDeduction)
  803.                                     TakeQuestItem(player, type, amount);
  804.                             }
  805.                             else entry.Value.AmountCollected++;
  806.  
  807.                             if (entry.Value.AmountCollected >= quest.AmountRequired)
  808.                                 CompleteQuest(player, entry.Key);
  809.                             return;
  810.                         }
  811.                     }
  812.                 }
  813.             }
  814.         }
  815.         private void TakeQuestItem(BasePlayer player, string item, int amount)
  816.         {
  817.             if (ItemDefs.ContainsKey(item))
  818.             {
  819.                 var itemDef = ItemDefs[item];
  820.                 NextTick(() => player.inventory.Take(null, itemDef.itemid, amount));
  821.             }
  822.             else PrintWarning($"Unable to find definition for: {item}.");
  823.         }
  824.         private void CompleteQuest(BasePlayer player, string questName)
  825.         {
  826.             var data = PlayerProgress[player.userID].Quests[questName];
  827.             var items = PlayerProgress[player.userID].RequiredItems;
  828.             var quest = GetQuest(questName);
  829.             if (quest != null)
  830.             {
  831.                 data.Status = QuestStatus.Completed;
  832.                 data.ResetTime = GrabCurrentTime() + (quest.Cooldown * 60);
  833.  
  834.                 for (int i = 0; i < items.Count; i++)
  835.                 {
  836.                     if (items[i].ShortName == quest.Objective && items[i].Type == data.Type)
  837.                     {
  838.                         items.Remove(items[i]);
  839.                         break;
  840.                     }
  841.                 }
  842.                 SendMSG(player, "", $"{LA("qComple", player.UserIDString)} {questName}. {LA("claRew", player.UserIDString)}");
  843.                 PlayerChallenges?.Call("CompletedQuest", player);
  844.             }
  845.         }
  846.  
  847.         private ItemDefinition FindItemDefinition(string shortname)
  848.         {
  849.             ItemDefinition itemDefinition;
  850.             return ItemDefs.TryGetValue(shortname, out itemDefinition) ? itemDefinition : null;
  851.         }
  852.         private string GetRewardString(List<RewardItem> entry)
  853.         {
  854.             var rewards = "";
  855.             int i = 1;
  856.             foreach (var item in entry)
  857.             {
  858.                 rewards = rewards + $"{(int)item.Amount}x {item.DisplayName}";
  859.                 if (i < entry.Count)
  860.                     rewards = rewards + ", ";
  861.                 i++;
  862.             }
  863.             return rewards;
  864.         }
  865.         private bool GiveReward(BasePlayer player, List<RewardItem> rewards)
  866.         {
  867.             foreach (var reward in rewards)
  868.             {
  869.                 if (reward.isCoins && Economics)
  870.                 {
  871.                     Economics.Call("Deposit", player.UserIDString, (double)reward.Amount);
  872.                 }
  873.                 else if (reward.isRP && ServerRewards)
  874.                 {
  875.                     ServerRewards.Call("AddPoints", player.userID, (int)reward.Amount);
  876.                 }
  877.                 else if (reward.isHuntXP)
  878.                 {
  879.                     HuntRPG?.Call("GiveEXP", player, (int)reward.Amount);
  880.                 }
  881.                 else
  882.                 {
  883.                     if (string.IsNullOrEmpty(reward.ShortName)) return true;
  884.                     var definition = FindItemDefinition(reward.ShortName);
  885.                     if (definition != null)
  886.                     {
  887.                         var item = ItemManager.Create(definition, (int)reward.Amount, reward.Skin);
  888.                         if (item != null)
  889.                         {
  890.                             player.inventory.GiveItem(item, player.inventory.containerMain);
  891.                         }
  892.                     }
  893.                     else PrintWarning($"Quests: Error building item {reward.ShortName} for {player.displayName}");
  894.                 }
  895.             }
  896.             return true;
  897.         }
  898.         private void ReturnItems(BasePlayer player, string itemname, int amount)
  899.         {
  900.             if (amount > 0)
  901.             {
  902.                 var definition = FindItemDefinition(itemname);
  903.                 if (definition != null)
  904.                 {
  905.                     var item = ItemManager.Create(definition, amount);
  906.                     if (item != null)
  907.                     {
  908.                         player.inventory.GiveItem(item);
  909.                         PopupMessage(player, $"{LA("qCancel", player.UserIDString)} {item.amount}x {item.info.displayName.translated} {LA("rewRet", player.UserIDString)}");
  910.                     }
  911.                 }
  912.             }
  913.         }
  914.         private RewardItem GetItem(BasePlayer player)
  915.         {
  916.             Item item = player.GetActiveItem();
  917.             if (item == null) return null;
  918.             var newItem = new RewardItem
  919.             {
  920.                 Amount = item.amount,
  921.                 DisplayName = DisplayNames[item.info.shortname],
  922.                 ID = item.info.itemid,
  923.                 ShortName = item.info.shortname,
  924.                 Skin = item.skin
  925.             };
  926.             return newItem;
  927.         }
  928.  
  929.         private bool hasQuests(ulong player)
  930.         {
  931.             try
  932.             {
  933.                 if(PlayerProgress.ContainsKey(player))
  934.                 {
  935.                     return true;
  936.                 }
  937.                 return false;
  938.             }
  939.             catch
  940.             {
  941.                 Puts($"Error checking quests for {player}");
  942.                 return false;
  943.             }
  944.         }
  945.         private bool isQuestItem(ulong player, string name, QuestType type)
  946.         {
  947.             var data = PlayerProgress[player].RequiredItems;
  948.             for (int i = 0; i < data.Count; i++)
  949.             {
  950.                 if (data[i].ShortName == name && data[i].Type == type)
  951.                     return true;
  952.             }
  953.             return false;
  954.         }
  955.         private void CheckPlayerEntry(BasePlayer player)
  956.         {
  957.             if (!PlayerProgress.ContainsKey(player.userID))
  958.                 PlayerProgress.Add(player.userID, new PlayerQuestData());
  959.         }
  960.  
  961.         private object GetQuestType(string name)
  962.         {
  963.             foreach (var entry in Quest)
  964.                 if (entry.Value.ContainsKey(name))
  965.                     return entry.Key;
  966.             return null;
  967.         }
  968.         private QuestEntry GetQuest(string name)
  969.         {
  970.             var type = GetQuestType(name);
  971.             if (type != null)
  972.             {
  973.                 foreach (var entry in questData.Quest[(QuestType)type])
  974.                 {
  975.                     if (entry.Key == name)
  976.                         return entry.Value;
  977.                 }
  978.             }
  979.             PrintWarning($"Error retrieving quest info for: {name}");
  980.             return null;
  981.         }
  982.  
  983.         private void SaveQuest(BasePlayer player, bool isCreating)
  984.         {
  985.             QuestCreator Creator;
  986.             QuestEntry Quest;
  987.  
  988.             if (isCreating)
  989.                 Creator = ActiveCreations[player.userID];
  990.             else Creator = ActiveEditors[player.userID];
  991.             Quest = Creator.entry;
  992.  
  993.             if (isCreating)
  994.             {
  995.                 if (Creator.type == QuestType.Delivery)
  996.                 {
  997.                     var npc = BasePlayer.FindByID(ulong.Parse(Creator.deliveryInfo.Info.ID));
  998.                     if (npc != null)
  999.                     {
  1000.                         npc.displayName = Creator.deliveryInfo.Info.Name;
  1001.                         npc.SendNetworkUpdateImmediate();
  1002.                     }
  1003.                     vendors.DeliveryVendors.Add(Creator.deliveryInfo.Info.ID, Creator.deliveryInfo);
  1004.                     AddMapMarker(Creator.deliveryInfo.Info.x, Creator.deliveryInfo.Info.z, Creator.deliveryInfo.Info.Name, $"{configData.LustyMapIntegration.Icon_Delivery}_{vendors.DeliveryVendors.Count}.png");
  1005.                     AddVendor.Remove(player.userID);
  1006.                     SaveVendorData();
  1007.                     DestroyUI(player);
  1008.                     if (vendors.DeliveryVendors.Count < 2)
  1009.                         PopupMessage(player, LA("minDV", player.UserIDString));
  1010.                     SendMSG(player, LA("DVSucc", player.UserIDString), LA("QC", player.UserIDString));
  1011.                     OpenMap(player);
  1012.                     return;
  1013.                 }
  1014.                 else questData.Quest[Creator.type].Add(Quest.QuestName, Quest);
  1015.                 ActiveCreations.Remove(player.userID);
  1016.             }
  1017.             else
  1018.             {
  1019.                 questData.Quest[Creator.type].Remove(Creator.oldEntry);
  1020.                 questData.Quest[Creator.type].Add(Quest.QuestName, Quest);
  1021.                 ActiveEditors.Remove(player.userID);
  1022.             }
  1023.             DestroyUI(player);
  1024.             SaveQuestData();
  1025.             SendMSG(player, $"{LA("saveQ", player.UserIDString)} {Quest.QuestName}", LA("QC", player.UserIDString));
  1026.         }
  1027.         private void SaveRewardsEdit(BasePlayer player)
  1028.         {
  1029.             QuestCreator Creator = ActiveEditors[player.userID];
  1030.             QuestEntry Quest = Creator.entry;
  1031.             questData.Quest[Creator.type].Remove(Creator.entry.QuestName);
  1032.             questData.Quest[Creator.type].Add(Quest.QuestName, Quest);
  1033.  
  1034.             DestroyUI(player);
  1035.             SaveQuestData();
  1036.             CreationHelp(player, 10);
  1037.             SendMSG(player, $"{LA("saveQ", player.UserIDString)} {Quest.QuestName}", LA("QC", player.UserIDString));
  1038.         }
  1039.         private void ExitQuest(BasePlayer player, bool isCreating)
  1040.         {
  1041.             if (isCreating)
  1042.                 ActiveCreations.Remove(player.userID);
  1043.             else ActiveEditors.Remove(player.userID);
  1044.  
  1045.             SendMSG(player, LA("QCCancel", player.UserIDString), LA("QC", player.UserIDString));
  1046.             DestroyUI(player);
  1047.         }
  1048.         private void RemoveQuest(string questName)
  1049.         {
  1050.             var Quest = GetQuest(questName);
  1051.             if (Quest == null) return;
  1052.             var Type = (QuestType)GetQuestType(questName);
  1053.             questData.Quest[Type].Remove(questName);
  1054.  
  1055.             foreach (var player in PlayerProgress)
  1056.             {
  1057.                 if (player.Value.Quests.ContainsKey(questName))
  1058.                     player.Value.Quests.Remove(questName);
  1059.             }
  1060.             if (vendors.DeliveryVendors.ContainsKey(Quest.Objective))
  1061.                 vendors.DeliveryVendors.Remove(Quest.Objective);
  1062.             if (vendors.QuestVendors.ContainsKey(Quest.Objective))
  1063.                 vendors.QuestVendors.Remove(Quest.Objective);
  1064.  
  1065.             SaveQuestData();
  1066.             SaveVendorData();
  1067.         }
  1068.  
  1069.         private ulong GetLastAttacker(uint id)
  1070.         {
  1071.             int hits = 0;
  1072.             ulong majorityPlayer = 0U;
  1073.             if (HeliAttackers.ContainsKey(id))
  1074.             {
  1075.                 foreach (var score in HeliAttackers[id])
  1076.                 {
  1077.                     if (score.Value > hits)
  1078.                         majorityPlayer = score.Key;
  1079.                 }
  1080.             }
  1081.             return majorityPlayer;
  1082.         }
  1083.         private string GetTypeDescription(QuestType type)
  1084.         {
  1085.             switch (type)
  1086.             {
  1087.                 case QuestType.Kill:
  1088.                     return LA("KillOBJ");
  1089.                 case QuestType.Craft:
  1090.                     return LA("CraftOBJ");
  1091.                 case QuestType.Gather:
  1092.                     return LA("GatherOBJ");
  1093.                 case QuestType.Loot:
  1094.                     return LA("LootOBJ");
  1095.                 case QuestType.Delivery:
  1096.                     return LA("DelvOBJ");
  1097.             }
  1098.             return "";
  1099.         }
  1100.         private QuestType ConvertStringToType(string type)
  1101.         {
  1102.             switch (type)
  1103.             {
  1104.                 case "gather":
  1105.                 case "Gather":
  1106.                     return QuestType.Gather;
  1107.                 case "loot":
  1108.                 case "Loot":
  1109.                     return QuestType.Loot;
  1110.                 case "craft":
  1111.                 case "Craft":
  1112.                     return QuestType.Craft;
  1113.                 case "delivery":
  1114.                 case "Delivery":
  1115.                     return QuestType.Delivery;
  1116.                 default:
  1117.                     return QuestType.Kill;
  1118.             }
  1119.         }
  1120.  
  1121.         private string isNPCRegistered(string ID)
  1122.         {
  1123.             if (vendors.QuestVendors.ContainsKey(ID)) return LA("aQVReg");
  1124.             if (vendors.DeliveryVendors.ContainsKey(ID)) return LA("aDVReg");
  1125.             return null;
  1126.         }
  1127.         static double GrabCurrentTime() => DateTime.UtcNow.Subtract(new DateTime(1970, 1, 1, 0, 0, 0)).TotalSeconds;
  1128.  
  1129.         private BasePlayer FindEntity(BasePlayer player)
  1130.         {
  1131.             var currentRot = Quaternion.Euler(player.serverInput.current.aimAngles) * Vector3.forward;
  1132.             var rayResult = Ray(player, currentRot);
  1133.             if (rayResult is BasePlayer)
  1134.             {
  1135.                 var ent = rayResult as BasePlayer;
  1136.                 return ent;
  1137.             }
  1138.             return null;
  1139.         }
  1140.         private object Ray(BasePlayer player, Vector3 Aim)
  1141.         {
  1142.             var hits = Physics.RaycastAll(player.transform.position + new Vector3(0f, 1.5f, 0f), Aim);
  1143.             float distance = 50f;
  1144.             object target = null;
  1145.  
  1146.             foreach (var hit in hits)
  1147.             {
  1148.                 if (hit.collider.GetComponentInParent<BaseEntity>() != null)
  1149.                 {
  1150.                     if (hit.distance < distance)
  1151.                     {
  1152.                         distance = hit.distance;
  1153.                         target = hit.collider.GetComponentInParent<BaseEntity>();
  1154.                     }
  1155.                 }
  1156.             }
  1157.             return target;
  1158.         }
  1159.  
  1160.         private void SetVendorName()
  1161.         {
  1162.             foreach(var npc in vendors.DeliveryVendors)
  1163.             {
  1164.                 var player = BasePlayer.FindByID(ulong.Parse(npc.Key));
  1165.                 if (player != null)
  1166.                 {
  1167.                     player.displayName = npc.Value.Info.Name;
  1168.                 }
  1169.             }
  1170.             foreach(var npc in vendors.QuestVendors)
  1171.             {
  1172.                 var player = BasePlayer.FindByID(ulong.Parse(npc.Key));
  1173.                 if (player != null)
  1174.                 {
  1175.                     player.displayName = npc.Value.Name;
  1176.                 }
  1177.             }
  1178.         }
  1179.         private void RemoveVendor(BasePlayer player, string ID, bool isVendor)
  1180.         {
  1181.             if (isVendor)
  1182.             {
  1183.                 RemoveMapMarker(vendors.QuestVendors[ID].Name);
  1184.                 vendors.QuestVendors.Remove(ID);
  1185.  
  1186.                 int i = 1;
  1187.                 foreach(var npc in vendors.QuestVendors)
  1188.                 {
  1189.                     RemoveMapMarker(npc.Value.Name);
  1190.                     AddMapMarker(npc.Value.x, npc.Value.z, npc.Value.Name, $"{configData.LustyMapIntegration.Icon_Vendor}.png");
  1191.                     i++;
  1192.                 }
  1193.             }
  1194.             else
  1195.             {
  1196.                 RemoveMapMarker(vendors.DeliveryVendors[ID].Info.Name);
  1197.                 vendors.DeliveryVendors.Remove(ID);
  1198.  
  1199.                 int i = 1;
  1200.                 foreach (var npc in vendors.DeliveryVendors)
  1201.                 {
  1202.                     RemoveMapMarker(npc.Value.Info.Name);
  1203.                     AddMapMarker(npc.Value.Info.x, npc.Value.Info.z, npc.Value.Info.Name, $"{configData.LustyMapIntegration.Icon_Delivery}_{i}.png");
  1204.                     i++;
  1205.                 }
  1206.                 foreach (var user in PlayerProgress)
  1207.                 {
  1208.                     if (user.Value.Quests.ContainsKey(ID))
  1209.                         user.Value.Quests.Remove(ID);
  1210.                 }
  1211.             }
  1212.             DeleteNPCMenu(player);
  1213.             PopupMessage(player, $"You have successfully removed the npc with ID: {ID}");
  1214.             SaveVendorData();
  1215.         }
  1216.         private string GetRandomNPC(string ID)
  1217.         {
  1218.             List<string> npcIDs = vendors.DeliveryVendors.Keys.ToList();
  1219.             List<string> withoutSelected = npcIDs;
  1220.             if (withoutSelected.Contains(ID))
  1221.                 withoutSelected.Remove(ID);
  1222.             var randNum = UnityEngine.Random.Range(0, withoutSelected.Count - 1);
  1223.             return withoutSelected[randNum];
  1224.         }
  1225.         private string LA(string key, string userID = null) => lang.GetMessage(key, this, userID);
  1226.         #endregion
  1227.  
  1228.         #region UI
  1229.         private void CreateMenu(BasePlayer player)
  1230.         {
  1231.             CloseMap(player);
  1232.  
  1233.             var MenuElement = QUI.CreateElementContainer(UIMain, QUI.Color(configData.Colors.Background_Dark.Color, configData.Colors.Background_Dark.Alpha), "0 0", "0.12 1");
  1234.             QUI.CreatePanel(ref MenuElement, UIMain, QUI.Color(configData.Colors.Background_Light.Color, configData.Colors.Background_Light.Alpha), "0.05 0.01", "0.95 0.99", true);
  1235.             QUI.CreateLabel(ref MenuElement, UIMain, "", $"{textPrimary}Quests</color>", 30, "0.05 0.9", "0.95 1");
  1236.             int i = 0;
  1237.             CreateMenuButton(ref MenuElement, UIMain, LA("Kill", player.UserIDString), "QUI_ChangeElement kill", i); i++;
  1238.             CreateMenuButton(ref MenuElement, UIMain, LA("Gather", player.UserIDString), "QUI_ChangeElement gather", i); i++;
  1239.             CreateMenuButton(ref MenuElement, UIMain, LA("Loot", player.UserIDString), "QUI_ChangeElement loot", i); i++;
  1240.             CreateMenuButton(ref MenuElement, UIMain, LA("Craft", player.UserIDString), "QUI_ChangeElement craft", i); i++;
  1241.             i++;
  1242.             if (HumanNPC)
  1243.                 CreateMenuButton(ref MenuElement, UIMain, LA("Delivery", player.UserIDString), "QUI_ChangeElement delivery", i); i++;
  1244.             CreateMenuButton(ref MenuElement, UIMain, LA("Your Quests", player.UserIDString), "QUI_ChangeElement personal", i); i++;
  1245.  
  1246.             if (player.IsAdmin)
  1247.             {
  1248.                 QUI.CreateButton(ref MenuElement, UIMain, QUI.Color(configData.Colors.Button_Accept.Color, configData.Colors.Button_Accept.Alpha), LA("Create Quest", player.UserIDString), 18, "0.1 0.225", "0.9 0.28", "QUI_ChangeElement creation");
  1249.                 QUI.CreateButton(ref MenuElement, UIMain, QUI.Color(configData.Colors.Button_Pending.Color, configData.Colors.Button_Pending.Alpha), LA("Edit Quest", player.UserIDString), 18, "0.1 0.16", "0.9 0.215", "QUI_ChangeElement editor");
  1250.                 QUI.CreateButton(ref MenuElement, UIMain, QUI.Color(configData.Colors.Button_Cancel.Color, configData.Colors.Button_Cancel.Alpha), LA("Delete Quest", player.UserIDString), 18, "0.1 0.095", "0.9 0.15", "QUI_DeleteQuest");
  1251.             }
  1252.  
  1253.             QUI.CreateButton(ref MenuElement, UIMain, QUI.Color(configData.Colors.Button_Standard.Color, configData.Colors.Button_Standard.Alpha), LA("Close", player.UserIDString), 18, "0.1 0.03", "0.9 0.085", "QUI_DestroyAll");
  1254.             CuiHelper.AddUi(player, MenuElement);
  1255.         }
  1256.         private void CreateEmptyMenu(BasePlayer player)
  1257.         {
  1258.             CloseMap(player);
  1259.  
  1260.             var MenuElement = QUI.CreateElementContainer(UIMain, QUI.Color(configData.Colors.Background_Dark.Color, configData.Colors.Background_Dark.Alpha), "0 0", "0.12 1");
  1261.             QUI.CreatePanel(ref MenuElement, UIMain, QUI.Color(configData.Colors.Background_Light.Color, configData.Colors.Background_Light.Alpha), "0.05 0.01", "0.95 0.99", true);
  1262.             QUI.CreateLabel(ref MenuElement, UIMain, "", $"{textPrimary}Quests</color>", 30, "0.05 0.9", "0.95 1");
  1263.             CreateMenuButton(ref MenuElement, UIMain, LA("Your Quests", player.UserIDString), "QUI_ChangeElement personal", 4);
  1264.  
  1265.             QUI.CreateButton(ref MenuElement, UIMain, QUI.Color(configData.Colors.Button_Standard.Color, configData.Colors.Button_Standard.Alpha), LA("Close", player.UserIDString), 18, "0.1 0.03", "0.9 0.085", "QUI_DestroyAll");
  1266.             CuiHelper.AddUi(player, MenuElement);
  1267.         }
  1268.         private void CreateMenuButton(ref CuiElementContainer container, string panelName, string buttonname, string command, int number)
  1269.         {
  1270.             Vector2 dimensions = new Vector2(0.8f, 0.055f);
  1271.             Vector2 origin = new Vector2(0.1f, 0.75f);
  1272.             Vector2 offset = new Vector2(0, (0.01f + dimensions.y) * number);
  1273.  
  1274.             Vector2 posMin = origin - offset;
  1275.             Vector2 posMax = posMin + dimensions;
  1276.  
  1277.             QUI.CreateButton(ref container, panelName, QUI.Color(configData.Colors.Button_Standard.Color, configData.Colors.Button_Standard.Alpha), buttonname, 18, $"{posMin.x} {posMin.y}", $"{posMax.x} {posMax.y}", command);
  1278.         }
  1279.  
  1280.         private void ListElement(BasePlayer player, QuestType type, int page = 0)
  1281.         {
  1282.             DestroyEntries(player);
  1283.             var Main = QUI.CreateElementContainer(UIPanel, QUI.Color(configData.Colors.Background_Dark.Color, configData.Colors.Background_Dark.Alpha), "0.12 0", "1 1");
  1284.             QUI.CreatePanel(ref Main, UIPanel, QUI.Color(configData.Colors.Background_Light.Color, configData.Colors.Background_Light.Alpha), "0.01 0.01", "0.99 0.99", true);
  1285.             QUI.CreateLabel(ref Main, UIPanel, "", GetTypeDescription(type), 16, "0.1 0.93", "0.9 0.99");
  1286.             QUI.CreateLabel(ref Main, UIPanel, "1 1 1 0.015", type.ToString().ToUpper(), 200, "0.01 0.01", "0.99 0.99");
  1287.             var quests = Quest[type];
  1288.             if (quests.Count > 16)
  1289.             {
  1290.                 var maxpages = (quests.Count - 1) /16 + 1;
  1291.                 if (page < maxpages - 1)
  1292.                     QUI.CreateButton(ref Main, UIPanel, QUI.Color(configData.Colors.Button_Standard.Color, configData.Colors.Button_Standard.Alpha), LA("Next", player.UserIDString), 16, "0.86 0.94", "0.97 0.98", $"QUI_ChangeElement listpage {type} {page + 1}");
  1293.                 if (page > 0)
  1294.                     QUI.CreateButton(ref Main, UIPanel, QUI.Color(configData.Colors.Button_Standard.Color, configData.Colors.Button_Standard.Alpha), LA("Back", player.UserIDString), 16, "0.03 0.94", "0.14 0.98", $"QUI_ChangeElement listpage {type} {page - 1}");
  1295.             }
  1296.             int maxentries = (16 * (page + 1));
  1297.             if (maxentries > quests.Count)
  1298.                 maxentries = quests.Count;
  1299.             int rewardcount = 16 * page;
  1300.             List <string> questNames = new List<string>();
  1301.             foreach (var entry in Quest[type])
  1302.                 questNames.Add(entry.Key);
  1303.  
  1304.             if (quests.Count == 0)
  1305.                 QUI.CreateLabel(ref Main, UIPanel, "", $"{textPrimary}{LA("noQ", player.UserIDString)} {type.ToString().ToLower()} {LA("quests", player.UserIDString)} </color>", 24, "0 0.82", "1 0.9");
  1306.  
  1307.             CuiHelper.AddUi(player, Main);
  1308.  
  1309.             int i = 0;
  1310.             for (int n = rewardcount; n < maxentries; n++)
  1311.             {
  1312.                 CreateQuestEntry(player, quests[questNames[n]], i);
  1313.                 i++;
  1314.             }
  1315.         }
  1316.         private void CreateQuestEntry(BasePlayer player, QuestEntry entry, int num)
  1317.         {
  1318.             Vector2 posMin = CalcQuestPos(num);
  1319.             Vector2 dimensions = new Vector2(0.21f, 0.22f);
  1320.             Vector2 posMax = posMin + dimensions;
  1321.  
  1322.             var panelName = UIEntry + num;
  1323.             AddUIString(player, panelName);
  1324.  
  1325.             var questEntry = QUI.CreateElementContainer(panelName, "0 0 0 0", $"{posMin.x} {posMin.y}", $"{posMax.x} {posMax.y}");
  1326.             QUI.CreatePanel(ref questEntry, panelName, QUI.Color(configData.Colors.Button_Standard.Color, configData.Colors.Button_Standard.Alpha), $"0 0", $"1 1");
  1327.  
  1328.             string buttonCommand = "";
  1329.             string buttonText = "";
  1330.             string buttonColor = "";
  1331.             QuestStatus status = QuestStatus.Open;
  1332.             var prog = PlayerProgress[player.userID].Quests;
  1333.             if (prog.ContainsKey(entry.QuestName))
  1334.             {
  1335.                 status = prog[entry.QuestName].Status;
  1336.                 switch (prog[entry.QuestName].Status)
  1337.                 {
  1338.                     case QuestStatus.Pending:
  1339.  
  1340.                         buttonColor = QUI.Color(configData.Colors.Button_Pending.Color, configData.Colors.Button_Pending.Alpha);
  1341.                         buttonText = LA("Pending", player.UserIDString);
  1342.                         break;
  1343.                     case QuestStatus.Completed:
  1344.                         buttonColor = QUI.Color(configData.Colors.Button_Completed.Color, configData.Colors.Button_Completed.Alpha);
  1345.                         buttonText = LA("Completed", player.UserIDString);
  1346.                         break;
  1347.                 }
  1348.             }
  1349.             else
  1350.             {
  1351.                 buttonColor = QUI.Color(configData.Colors.Button_Accept.Color, configData.Colors.Button_Accept.Alpha);
  1352.                 buttonText = LA("Accept Quest", player.UserIDString);
  1353.                 buttonCommand = $"QUI_AcceptQuest {entry.QuestName}";
  1354.             }
  1355.             QUI.CreateButton(ref questEntry, panelName, buttonColor, buttonText, 14, $"0.72 0.83", $"0.98 0.97", buttonCommand);
  1356.  
  1357.             string rewards = GetRewardString(entry.Rewards);
  1358.             string questInfo = $"{textPrimary}{LA("Status:", player.UserIDString)}</color> {status}";
  1359.             questInfo = questInfo + $"\n{textPrimary}{LA("Description:", player.UserIDString)} </color>{textSecondary}{entry.Description}</color>";
  1360.             questInfo = questInfo + $"\n{textPrimary}{LA("Objective:", player.UserIDString)} </color>{textSecondary}{entry.ObjectiveName}</color>";
  1361.             questInfo = questInfo + $"\n{textPrimary}{LA("Amount Required:", player.UserIDString)} </color>{textSecondary}{entry.AmountRequired}</color>";
  1362.             questInfo = questInfo + $"\n{textPrimary}{LA("Reward:", player.UserIDString)} </color>{textSecondary}{rewards}</color>";
  1363.  
  1364.             QUI.CreateLabel(ref questEntry, panelName, "", $"{entry.QuestName}", 16, $"0.02 0.8", "0.72 0.95", TextAnchor.MiddleLeft);
  1365.             QUI.CreateLabel(ref questEntry, panelName, buttonColor, questInfo, 14, $"0.02 0.01", "0.98 0.78", TextAnchor.UpperLeft);
  1366.  
  1367.             CuiHelper.AddUi(player, questEntry);
  1368.         }
  1369.  
  1370.         private void PlayerStats(BasePlayer player, int page = 0)
  1371.         {
  1372.             DestroyEntries(player);
  1373.             var Main = QUI.CreateElementContainer(UIPanel, QUI.Color(configData.Colors.Background_Dark.Color, configData.Colors.Background_Dark.Alpha), "0.12 0", "1 1");
  1374.             QUI.CreatePanel(ref Main, UIPanel, QUI.Color(configData.Colors.Background_Light.Color, configData.Colors.Background_Light.Alpha), "0.01 0.01", "0.99 0.99", true);
  1375.             QUI.CreateLabel(ref Main, UIPanel, "", LA("yqDesc", player.UserIDString), 16, "0.1 0.93", "0.9 0.99");
  1376.             QUI.CreateLabel(ref Main, UIPanel, "1 1 1 0.015", LA("STATS", player.UserIDString), 200, "0.01 0.01", "0.99 0.99");
  1377.  
  1378.             var stats = PlayerProgress[player.userID];
  1379.             if (stats.Quests.Count > 16)
  1380.             {
  1381.                 var maxpages = (stats.Quests.Count - 1) / 16 + 1;
  1382.                 if (page < maxpages - 1)
  1383.                     QUI.CreateButton(ref Main, UIPanel, QUI.Color(configData.Colors.Button_Standard.Color, configData.Colors.Button_Standard.Alpha), LA("Next", player.UserIDString), 16, "0.86 0.94", "0.97 0.98", $"QUI_ChangeElement statspage {page + 1}");
  1384.                 if (page > 0)
  1385.                     QUI.CreateButton(ref Main, UIPanel, QUI.Color(configData.Colors.Button_Standard.Color, configData.Colors.Button_Standard.Alpha), LA("Back", player.UserIDString), 16, "0.03 0.94", "0.14 0.098", $"QUI_ChangeElement statspage {page - 1}");
  1386.             }
  1387.             int maxentries = (16 * (page + 1));
  1388.             if (maxentries > stats.Quests.Count)
  1389.                 maxentries = stats.Quests.Count;
  1390.             int rewardcount = 16 * page;
  1391.             List<string> questNames = new List<string>();
  1392.             foreach (var entry in stats.Quests)
  1393.                 questNames.Add(entry.Key);
  1394.  
  1395.             if (stats.Quests.Count == 0)
  1396.                 QUI.CreateLabel(ref Main, UIPanel, "", $"{textPrimary}{LA("noQDSaved", player.UserIDString)}</color>", 24, "0 0.82", "1 0.9");
  1397.  
  1398.             CuiHelper.AddUi(player, Main);
  1399.  
  1400.             int i = 0;
  1401.             for (int n = rewardcount; n < maxentries; n++)
  1402.             {
  1403.                 var Quest = GetQuest(questNames[n]);
  1404.                 if (Quest == null) continue;
  1405.                 CreateStatEntry(player, Quest, i);
  1406.                 i++;
  1407.             }
  1408.         }
  1409.         private void CreateStatEntry(BasePlayer player, QuestEntry entry, int num)
  1410.         {
  1411.             Vector2 posMin = CalcQuestPos(num);
  1412.             Vector2 dimensions = new Vector2(0.21f, 0.22f);
  1413.             Vector2 posMax = posMin + dimensions;
  1414.  
  1415.             var panelName = UIEntry + num;
  1416.             AddUIString(player, panelName);
  1417.  
  1418.             var questEntry = QUI.CreateElementContainer(panelName, "0 0 0 0", $"{posMin.x} {posMin.y}", $"{posMax.x} {posMax.y}");
  1419.             QUI.CreatePanel(ref questEntry, panelName, QUI.Color(configData.Colors.Button_Standard.Color, configData.Colors.Button_Standard.Alpha), $"0 0", $"1 1");
  1420.  
  1421.             string statusColor = "";
  1422.             QuestStatus status = QuestStatus.Open;
  1423.             var prog = PlayerProgress[player.userID].Quests;
  1424.             if (prog.ContainsKey(entry.QuestName))
  1425.             {
  1426.                 status = prog[entry.QuestName].Status;
  1427.                 switch (prog[entry.QuestName].Status)
  1428.                 {
  1429.                     case QuestStatus.Pending:
  1430.                         statusColor = QUI.Color(configData.Colors.Button_Pending.Color, configData.Colors.Button_Pending.Alpha);
  1431.                         break;
  1432.                     case QuestStatus.Completed:
  1433.                         statusColor = QUI.Color(configData.Colors.Button_Completed.Color, configData.Colors.Button_Completed.Alpha);
  1434.                         break;
  1435.                 }
  1436.             }
  1437.  
  1438.             if (status != QuestStatus.Completed)
  1439.                 QUI.CreateButton(ref questEntry, panelName, QUI.Color(configData.Colors.Button_Cancel.Color, configData.Colors.Button_Cancel.Alpha), LA("Cancel Quest",player.UserIDString), 16, $"0.75 0.83", $"0.97 0.97", $"QUI_CancelQuest {entry.QuestName}");
  1440.             if (status == QuestStatus.Completed && !prog[entry.QuestName].RewardClaimed)
  1441.                 QUI.CreateButton(ref questEntry, panelName, statusColor, LA("Claim Reward", player.UserIDString), 16, $"0.75 0.83", $"0.97 0.97", $"QUI_ClaimReward {entry.QuestName}");
  1442.             string questStatus = status.ToString();
  1443.             if (status == QuestStatus.Completed && prog[entry.QuestName].RewardClaimed)
  1444.             {
  1445.                 if (prog[entry.QuestName].ResetTime < GrabCurrentTime())
  1446.                     QUI.CreateButton(ref questEntry, panelName, statusColor, LA("Remove", player.UserIDString), 16, $"0.75 0.83", $"0.97 0.97", $"QUI_RemoveCompleted {entry.QuestName}");
  1447.                 else
  1448.                 {
  1449.                     TimeSpan dateDifference = TimeSpan.FromSeconds(prog[entry.QuestName].ResetTime - GrabCurrentTime());
  1450.                     var days = dateDifference.Days;
  1451.                     var hours = dateDifference.Hours;
  1452.                     hours += (days * 24);
  1453.                     var mins = dateDifference.Minutes;
  1454.                     string remaining = string.Format("{0:00}h :{1:00}m", hours, mins);
  1455.                     questStatus = $"{LA("Cooldown:", player.UserIDString)} {remaining}";
  1456.                 }
  1457.  
  1458.             }
  1459.             var rewards = GetRewardString(entry.Rewards);
  1460.             var percent = Math.Round(Convert.ToDouble((float)prog[entry.QuestName].AmountCollected / (float)entry.AmountRequired), 4);
  1461.             //Puts($"Collected: {prog[entry.QuestName].AmountCollected.ToString()}, Required: {entry.AmountRequired.ToString()}, Pct: {percent.ToString()}");
  1462.             string stats = $"{textPrimary}{LA("Status:", player.UserIDString)}</color> {questStatus}";
  1463.             stats += $"\n{textPrimary}{LA("Quest Type:", player.UserIDString)} </color> {textSecondary}{prog[entry.QuestName].Type}</color>";
  1464.             stats += $"\n{textPrimary}{LA("Description:", player.UserIDString)} </color>{textSecondary}{entry.Description}</color>";
  1465.             stats += $"\n{textPrimary}{LA("Objective:", player.UserIDString)} </color>{textSecondary}{entry.AmountRequired}x {entry.ObjectiveName}</color>";
  1466.             stats += $"\n{textPrimary}{LA("Collected:", player.UserIDString)} </color>{textSecondary}{prog[entry.QuestName].AmountCollected}</color> {textPrimary}({percent * 100}%)</color>";
  1467.             stats += $"\n{textPrimary}{LA("Reward:", player.UserIDString)} </color>{textSecondary}{rewards}</color>";
  1468.  
  1469.             QUI.CreateLabel(ref questEntry, panelName, "", $"{entry.QuestName}", 18, $"0.02 0.8", "0.8 0.95", TextAnchor.UpperLeft);
  1470.             QUI.CreateLabel(ref questEntry, panelName, "", stats, 14, $"0.02 0.01", "0.98 0.78", TextAnchor.UpperLeft);
  1471.  
  1472.             CuiHelper.AddUi(player, questEntry);
  1473.         }
  1474.         private void PlayerDelivery(BasePlayer player)
  1475.         {
  1476.             DestroyEntries(player);
  1477.             var Main = QUI.CreateElementContainer(UIPanel, QUI.Color(configData.Colors.Background_Dark.Color, configData.Colors.Background_Dark.Alpha), "0.12 0", "1 1");
  1478.             QUI.CreatePanel(ref Main, UIPanel, QUI.Color(configData.Colors.Background_Light.Color, configData.Colors.Background_Light.Alpha), "0.01 0.01", "0.99 0.99", true);
  1479.             QUI.CreateLabel(ref Main, UIPanel, "", GetTypeDescription(QuestType.Delivery), 16, "0.1 0.93", "0.9 0.99");
  1480.             QUI.CreateLabel(ref Main, UIPanel, "1 1 1 0.015", LA("DELIVERY", player.UserIDString), 200, "0.01 0.01", "0.99 0.99");
  1481.  
  1482.             var npcid = PlayerProgress[player.userID].CurrentDelivery.VendorID;
  1483.             var targetid = PlayerProgress[player.userID].CurrentDelivery.TargetID;
  1484.             if (string.IsNullOrEmpty(npcid))
  1485.                 QUI.CreateLabel(ref Main, UIPanel, "", $"{textPrimary}{LA("noADM", player.UserIDString)}</color>", 24, "0 0.82", "1 0.9");
  1486.             else
  1487.             {
  1488.                 var quest = vendors.DeliveryVendors[npcid];
  1489.                 var target = vendors.DeliveryVendors[targetid];
  1490.                 if (quest != null && target != null)
  1491.                 {
  1492.                     var distance = Vector2.Distance(new Vector2(quest.Info.x, quest.Info.z), new Vector2(target.Info.x, target.Info.z));
  1493.                     var rewardAmount = distance * quest.Multiplier;
  1494.                     if (rewardAmount < 1) rewardAmount = 1;
  1495.                     var briefing = $"{textPrimary}{quest.Info.Name}\n\n</color>";
  1496.                     briefing = briefing + $"{textSecondary}{quest.Description}</color>\n\n";
  1497.                     briefing = briefing + $"{textPrimary}{LA("Destination:", player.UserIDString)} </color>{textSecondary}{target.Info.Name}\nX {target.Info.x}, Z {target.Info.z}</color>\n";
  1498.                     briefing = briefing + $"{textPrimary}{LA("Distance:", player.UserIDString)} </color>{textSecondary}{distance}M</color>\n";
  1499.                     briefing = briefing + $"{textPrimary}{LA("Reward:", player.UserIDString)} </color>{textSecondary}{(int)rewardAmount}x {quest.Reward.DisplayName}</color>";
  1500.                     QUI.CreateLabel(ref Main, UIPanel, "", briefing, 20, "0.15 0.2", "0.85 1", TextAnchor.MiddleLeft);
  1501.  
  1502.                     QUI.CreateButton(ref Main, UIPanel, QUI.Color(configData.Colors.Button_Standard.Color, configData.Colors.Button_Standard.Alpha), LA("Cancel", player.UserIDString), 18, "0.2 0.05", "0.35 0.1", $"QUI_CancelDelivery");
  1503.                 }
  1504.             }
  1505.             CuiHelper.AddUi(player, Main);
  1506.         }
  1507.  
  1508.         private void CreationMenu(BasePlayer player)
  1509.         {
  1510.             DestroyEntries(player);
  1511.             var Main = QUI.CreateElementContainer(UIPanel, QUI.Color(configData.Colors.Background_Dark.Color, configData.Colors.Background_Dark.Alpha), "0.12 0", "1 1");
  1512.             QUI.CreatePanel(ref Main, UIPanel, QUI.Color(configData.Colors.Background_Light.Color, configData.Colors.Background_Light.Alpha), "0.01 0.01", "0.99 0.99", true);
  1513.  
  1514.             int i = 0;
  1515.             QUI.CreateLabel(ref Main, UIPanel, "", $"{textPrimary}{LA("selCreat", player.UserIDString)}</color>", 20, "0.25 0.8", "0.75 0.9");
  1516.             QUI.CreateLabel(ref Main, UIPanel, "1 1 1 0.025", LA("CREATOR", player.UserIDString), 200, "0.01 0.01", "0.99 0.99");
  1517.             CreateNewQuestButton(ref Main, UIPanel, LA("Kill", player.UserIDString), "QUI_NewQuest kill", i); i++;
  1518.             CreateNewQuestButton(ref Main, UIPanel, LA("Gather", player.UserIDString), "QUI_NewQuest gather", i); i++;
  1519.             CreateNewQuestButton(ref Main, UIPanel, LA("Loot", player.UserIDString), "QUI_NewQuest loot", i); i++;
  1520.             CreateNewQuestButton(ref Main, UIPanel, LA("Craft", player.UserIDString), "QUI_NewQuest craft", i); i++;
  1521.             if (HumanNPC)
  1522.                 CreateNewQuestButton(ref Main, UIPanel, LA("Delivery", player.UserIDString), "QUI_NewQuest delivery", i); i++;
  1523.  
  1524.             CuiHelper.AddUi(player, Main);
  1525.         }
  1526.         private void CreationHelp(BasePlayer player, int page = 0)
  1527.         {
  1528.             DestroyEntries(player);
  1529.             QuestCreator quest = null;
  1530.             if (ActiveCreations.ContainsKey(player.userID))
  1531.                 quest = ActiveCreations[player.userID];
  1532.             else if (ActiveEditors.ContainsKey(player.userID))
  1533.                 quest = ActiveEditors[player.userID];
  1534.             if (quest == null) return;
  1535.  
  1536.             var HelpMain = QUI.CreateElementContainer(UIPanel, QUI.Color(configData.Colors.Background_Dark.Color, configData.Colors.Background_Dark.Alpha), "0.4 0.3", "0.95 0.9");
  1537.             QUI.CreatePanel(ref HelpMain, UIPanel, QUI.Color(configData.Colors.Background_Light.Color, configData.Colors.Background_Light.Alpha), "0.01 0.02", "0.99 0.98");
  1538.  
  1539.             switch (page)
  1540.             {
  1541.                 case 0:
  1542.                     QUI.CreateLabel(ref HelpMain, UIPanel, "", $"{textPrimary}{LA("creHelMen", player.UserIDString)}.\n</color> {textSecondary}{LA("creHelFol", player.UserIDString)}.\n\n{LA("creHelExi", player.UserIDString)} </color>{textPrimary}'exit'\n\n\n\n{LA("creHelName", player.UserIDString)}</color>", 20, "0 0", "1 1");
  1543.                 break;
  1544.                 case 1:
  1545.                     var MenuMain = QUI.CreateElementContainer(UIMain, QUI.Color(configData.Colors.Background_Dark.Color, configData.Colors.Background_Dark.Alpha), "0 0", "1 1", true);
  1546.                     QUI.CreatePanel(ref MenuMain, UIMain, QUI.Color(configData.Colors.Background_Light.Color, configData.Colors.Background_Light.Alpha), "0.01 0.01", "0.99 0.99");
  1547.                     QUI.CreateLabel(ref MenuMain, UIMain, "", $"{textPrimary}{LA("creHelObj", player.UserIDString)}</color>", 20, "0.25 0.85", "0.75 0.95");
  1548.                     CuiHelper.AddUi(player, MenuMain);
  1549.                     CreateObjectiveMenu(player);
  1550.                     return;
  1551.                 case 2:
  1552.                     QUI.CreateLabel(ref HelpMain, UIPanel, "", $"{textPrimary}{LA("creHelRA", player.UserIDString)}</color>", 20, "0.25 0.4", "0.75 0.6");
  1553.                     break;
  1554.                 case 3:
  1555.                     QUI.CreateLabel(ref HelpMain, UIPanel, "", $"{textPrimary}{LA("creHelQD", player.UserIDString)}</color>", 20, "0.25 0.4", "0.75 0.6");
  1556.                     break;
  1557.                 case 4:
  1558.                     {
  1559.                         HelpMain = QUI.CreateElementContainer(UIPanel, QUI.Color(configData.Colors.Background_Dark.Color, configData.Colors.Background_Dark.Alpha), "0.4 0.3", "0.95 0.9");
  1560.                         QUI.CreatePanel(ref HelpMain, UIPanel, QUI.Color(configData.Colors.Background_Light.Color, configData.Colors.Background_Light.Alpha), "0.01 0.02", "0.99 0.98", true);
  1561.                         QUI.CreateLabel(ref HelpMain, UIPanel, "", $"{textPrimary}{LA("creHelRT", player.UserIDString)}</color>", 20, "0.25 0.8", "0.75 1");
  1562.                         int i = 0;
  1563.                         if (Economics) CreateRewardTypeButton(ref HelpMain, UIPanel, $"{LA("Coins", player.UserIDString)} (Economics)", "QUI_RewardType coins", i); i++;
  1564.                         if (ServerRewards) CreateRewardTypeButton(ref HelpMain, UIPanel, $"{LA("RP", player.UserIDString)} (ServerRewards)", "QUI_RewardType rp", i); i++;
  1565.                         CreateRewardTypeButton(ref HelpMain, UIPanel, LA("Item", player.UserIDString), "QUI_RewardType item", i); i++;
  1566.                         if (HuntRPG) { CreateRewardTypeButton(ref HelpMain, UIPanel, $"{LA("HuntXP", player.UserIDString)} (HuntRPG)", "QUI_RewardType huntxp", i); i++; }
  1567.                     }
  1568.                     break;
  1569.                 case 5:
  1570.                     if (quest.item.isCoins || quest.item.isRP || quest.item.isHuntXP)
  1571.                         QUI.CreateLabel(ref HelpMain, UIPanel, "", $"{textPrimary}{LA("creHelRewA", player.UserIDString)}</color>", 20, "0.25 0.4", "0.75 0.6");
  1572.                     else
  1573.                     {
  1574.                         HelpMain = QUI.CreateElementContainer(UIPanel, QUI.Color(configData.Colors.Background_Dark.Color, configData.Colors.Background_Dark.Alpha), "0.3 0.8", "0.7 0.97");
  1575.                         QUI.CreatePanel(ref HelpMain, UIPanel, QUI.Color(configData.Colors.Background_Light.Color, configData.Colors.Background_Light.Alpha), "0.01 0.02", "0.99 0.98");
  1576.                         QUI.CreateLabel(ref HelpMain, UIPanel, "", $"{textPrimary}{LA("creHelIH", player.UserIDString)} 'quest item'</color>", 20, "0.1 0", "0.9 1");
  1577.                     }
  1578.                     break;
  1579.                 case 7:
  1580.                     HelpMain = QUI.CreateElementContainer(UIPanel, QUI.Color(configData.Colors.Background_Dark.Color, configData.Colors.Background_Dark.Alpha), "0.4 0.3", "0.95 0.9", true);
  1581.                     QUI.CreatePanel(ref HelpMain, UIPanel, QUI.Color(configData.Colors.Background_Light.Color, configData.Colors.Background_Light.Alpha), "0.01 0.02", "0.99 0.98");
  1582.                     QUI.CreateLabel(ref HelpMain, UIPanel, "", $"{textPrimary}{LA("creHelAR", player.UserIDString)}</color>", 20, "0.1 0", "0.9 1");
  1583.                     QUI.CreateButton(ref HelpMain, UIPanel, QUI.Color(configData.Colors.Button_Standard.Color, configData.Colors.Button_Standard.Alpha), LA("Yes", player.UserIDString), 18, "0.6 0.05", "0.8 0.15", $"QUI_AddReward");
  1584.                     QUI.CreateButton(ref HelpMain, UIPanel, QUI.Color(configData.Colors.Button_Standard.Color, configData.Colors.Button_Standard.Alpha), LA("No", player.UserIDString), 18, "0.2 0.05", "0.4 0.15", $"QUI_RewardFinish");
  1585.                     break;
  1586.                 case 8:
  1587.                     if (quest.type != QuestType.Kill)
  1588.                     {
  1589.                         HelpMain = QUI.CreateElementContainer(UIPanel, QUI.Color(configData.Colors.Background_Dark.Color, configData.Colors.Background_Dark.Alpha), "0.4 0.3", "0.95 0.9", true);
  1590.                         QUI.CreatePanel(ref HelpMain, UIPanel, QUI.Color(configData.Colors.Background_Light.Color, configData.Colors.Background_Light.Alpha), "0.01 0.02", "0.99 0.98");
  1591.                         QUI.CreateLabel(ref HelpMain, UIPanel, "", $"{textPrimary}{LA("creHelID", player.UserIDString)}</color>", 20, "0.1 0", "0.9 1");
  1592.                         QUI.CreateButton(ref HelpMain, UIPanel, QUI.Color(configData.Colors.Button_Standard.Color, configData.Colors.Button_Standard.Alpha), LA("Yes", player.UserIDString), 18, "0.6 0.05", "0.8 0.15", $"QUI_ItemDeduction 1");
  1593.                         QUI.CreateButton(ref HelpMain, UIPanel, QUI.Color(configData.Colors.Button_Standard.Color, configData.Colors.Button_Standard.Alpha), LA("No", player.UserIDString), 18, "0.2 0.05", "0.4 0.15", $"QUI_ItemDeduction 0");
  1594.                     }
  1595.                     else { CreationHelp(player, 9); return; }
  1596.                     break;
  1597.                 case 9:
  1598.                     HelpMain = QUI.CreateElementContainer(UIPanel, QUI.Color(configData.Colors.Background_Dark.Color, configData.Colors.Background_Dark.Alpha), "0.3 0.8", "0.7 0.97");
  1599.                     QUI.CreatePanel(ref HelpMain, UIPanel, QUI.Color(configData.Colors.Background_Light.Color, configData.Colors.Background_Light.Alpha), "0.01 0.02", "0.99 0.98");
  1600.                     QUI.CreateLabel(ref HelpMain, UIPanel, "", $"{textPrimary}{LA("creHelCD", player.UserIDString)}</color>", 20, "0.1 0", "0.9 1");
  1601.                     break;
  1602.                 case 10:
  1603.                     {
  1604.                         HelpMain = QUI.CreateElementContainer(UIPanel, QUI.Color(configData.Colors.Background_Dark.Color, configData.Colors.Background_Dark.Alpha), "0.4 0.3", "0.95 0.9");
  1605.                         QUI.CreatePanel(ref HelpMain, UIPanel, QUI.Color(configData.Colors.Background_Light.Color, configData.Colors.Background_Light.Alpha), "0.01 0.02", "0.99 0.98", true);
  1606.                         QUI.CreateLabel(ref HelpMain, UIPanel, "", $"{textPrimary}{LA("creHelNewRew", player.UserIDString)}</color>", 20, "0.25 0.8", "0.75 1");
  1607.                         QUI.CreateButton(ref HelpMain, UIPanel, QUI.Color(configData.Colors.Button_Standard.Color, configData.Colors.Button_Standard.Alpha), LA("addNewRew", player.UserIDString), 18, "0.7 0.04", "0.95 0.12", $"QUI_AddReward");
  1608.                         QUI.CreateButton(ref HelpMain, UIPanel, QUI.Color(configData.Colors.Button_Standard.Color, configData.Colors.Button_Standard.Alpha), LA("Back", player.UserIDString), 18, "0.05 0.04", "0.3 0.12", $"QUI_EndEditing");
  1609.  
  1610.                         int i = 0;
  1611.                         foreach (var entry in ActiveEditors[player.userID].entry.Rewards)
  1612.                         {
  1613.                             CreateDelEditButton(ref HelpMain, 0.1f, UIPanel, $"{entry.Amount}x {entry.DisplayName}", i, "", 0.35f);
  1614.                             CreateDelEditButton(ref HelpMain, 0.72f, UIPanel, LA("Remove", player.UserIDString), i, $"QUI_RemoveReward {entry.Amount} {entry.DisplayName}");
  1615.                             i++;
  1616.                         }
  1617.                     }
  1618.                     break;
  1619.                 default:
  1620.                     HelpMain = QUI.CreateElementContainer(UIPanel, QUI.Color(configData.Colors.Background_Dark.Color, configData.Colors.Background_Dark.Alpha), "0.4 0.3", "0.95 0.9", true);
  1621.                     QUI.CreatePanel(ref HelpMain, UIPanel, QUI.Color(configData.Colors.Background_Light.Color, configData.Colors.Background_Light.Alpha), "0.01 0.02", "0.99 0.98");
  1622.                     QUI.CreateLabel(ref HelpMain, UIPanel, "", $"{textPrimary}{LA("creHelSQ", player.UserIDString)}</color>", 20, "0.1 0.8", "0.9 0.95");
  1623.                     string questDetails = $"{textPrimary}{LA("Quest Type:", player.UserIDString)}</color> {textSecondary}{quest.type}</color>";
  1624.                     questDetails = questDetails + $"\n{textPrimary}{LA("Name:", player.UserIDString)}</color> {textSecondary}{quest.entry.QuestName}</color>";
  1625.                     questDetails = questDetails + $"\n{textPrimary}{LA("Description:", player.UserIDString)}</color> {textSecondary}{quest.entry.Description}</color>";
  1626.                     questDetails = questDetails + $"\n{textPrimary}{LA("Objective:", player.UserIDString)}</color> {textSecondary}{quest.entry.ObjectiveName}</color>";
  1627.                     questDetails = questDetails + $"\n{textPrimary}{LA("Required Amount:", player.UserIDString)}</color> {textSecondary}{quest.entry.AmountRequired}</color>";
  1628.                     if (quest.type != QuestType.Kill) questDetails = questDetails + $"\n{textPrimary}{LA("Item Deduction:", player.UserIDString)}</color> {textSecondary}{quest.entry.ItemDeduction}</color>";
  1629.                     questDetails = questDetails + $"\n{textPrimary}{LA("CDMin", player.UserIDString)}</color> {textSecondary}{quest.entry.Cooldown}</color>";
  1630.  
  1631.                     var rewards = GetRewardString(quest.entry.Rewards);
  1632.  
  1633.                     questDetails = questDetails + $"\n{textPrimary}{LA("Reward:", player.UserIDString)}</color> {textSecondary}{rewards}</color>";
  1634.  
  1635.                     QUI.CreateLabel(ref HelpMain, UIPanel, "", questDetails, 20, "0.1 0.2", "0.9 0.75", TextAnchor.MiddleLeft);
  1636.                     QUI.CreateButton(ref HelpMain, UIPanel, QUI.Color(configData.Colors.Button_Standard.Color, configData.Colors.Button_Standard.Alpha), LA("Save Quest", player.UserIDString), 18, "0.6 0.05", "0.8 0.15", $"QUI_SaveQuest");
  1637.                     QUI.CreateButton(ref HelpMain, UIPanel, QUI.Color(configData.Colors.Button_Standard.Color, configData.Colors.Button_Standard.Alpha), LA("Cancel", player.UserIDString), 18, "0.2 0.05", "0.4 0.15", $"QUI_ExitQuest");
  1638.                     break;
  1639.             }
  1640.             CuiHelper.AddUi(player, HelpMain);
  1641.         }
  1642.         private void CreateObjectiveMenu(BasePlayer player, int page = 0)
  1643.         {
  1644.             DestroyEntries(player);
  1645.             var HelpMain = QUI.CreateElementContainer(UIPanel, "0 0 0 0", "0 0", "1 1");
  1646.             QuestType type;
  1647.             if (ActiveCreations.ContainsKey(player.userID))
  1648.                 type = ActiveCreations[player.userID].type;
  1649.             else type = ActiveEditors[player.userID].type;
  1650.             var objCount = AllObjectives[type].Count;
  1651.             if (objCount > 100)
  1652.             {
  1653.                 var maxpages = (objCount - 1) / 96 + 1;
  1654.                 if (page < maxpages - 1)
  1655.                     QUI.CreateButton(ref HelpMain, UIPanel, QUI.Color(configData.Colors.Button_Standard.Color, configData.Colors.Button_Standard.Alpha), LA("Next", player.UserIDString), 18, "0.84 0.05", "0.97 0.1", $"QUI_ChangeElement objpage {page + 1}");
  1656.                 if (page > 0)
  1657.                     QUI.CreateButton(ref HelpMain, UIPanel, QUI.Color(configData.Colors.Button_Standard.Color, configData.Colors.Button_Standard.Alpha), LA("Back", player.UserIDString), 18, "0.03 0.05", "0.16 0.1", $"QUI_ChangeElement objpage {page - 1}");
  1658.             }
  1659.             int maxentries = (96 * (page + 1));
  1660.             if (maxentries > objCount)
  1661.                 maxentries = objCount;
  1662.             int rewardcount = 96 * page;
  1663.  
  1664.             int i = 0;
  1665.             for (int n = rewardcount; n < maxentries; n++)
  1666.             {
  1667.                 CreateObjectiveEntry(ref HelpMain, UIPanel, AllObjectives[type][n], i);
  1668.                 i++;
  1669.             }
  1670.             CuiHelper.AddUi(player, HelpMain);
  1671.         }
  1672.         private void DeliveryHelp(BasePlayer player, int page = 0)
  1673.         {
  1674.             DestroyEntries(player);
  1675.             switch (page)
  1676.             {
  1677.                 case 0:
  1678.                     var HelpMain = QUI.CreateElementContainer(UIPanel, QUI.Color(configData.Colors.Background_Dark.Color, configData.Colors.Background_Dark.Alpha), "0.12 0.0", "1 1", true);
  1679.                     QUI.CreatePanel(ref HelpMain, UIPanel, QUI.Color(configData.Colors.Background_Light.Color, configData.Colors.Background_Light.Alpha), "0.01 0.01", "0.99 0.99");
  1680.                     QUI.CreateLabel(ref HelpMain, UIPanel, "", $"{textPrimary}{LA("delHelMen", player.UserIDString)}\n\n</color> {textSecondary}{LA("delHelChoo", player.UserIDString)}.\n\n{LA("creHelExi", player.UserIDString)} </color>{textPrimary}'exit'</color>", 20, "0 0", "1 1");
  1681.                     QUI.CreateButton(ref HelpMain, UIPanel, QUI.Color(configData.Colors.Button_Standard.Color, configData.Colors.Button_Standard.Alpha), LA("Quest Vendor", player.UserIDString), 18, "0.6 0.05", "0.8 0.15", $"QUI_AddVendor 1");
  1682.                     QUI.CreateButton(ref HelpMain, UIPanel, QUI.Color(configData.Colors.Button_Standard.Color, configData.Colors.Button_Standard.Alpha), LA("Delivery Vendor", player.UserIDString), 18, "0.2 0.05", "0.4 0.15", $"QUI_AddVendor 2");
  1683.                     CuiHelper.AddUi(player, HelpMain);
  1684.                     return;
  1685.                 case 1:
  1686.                     var element = QUI.CreateElementContainer(UIMain, QUI.Color(configData.Colors.Background_Dark.Color, configData.Colors.Background_Dark.Alpha), "0.25 0.85", "0.75 0.95");
  1687.                     QUI.CreatePanel(ref element, UIMain, QUI.Color(configData.Colors.Button_Standard.Color, configData.Colors.Button_Standard.Alpha), "0.005 0.04", "0.995 0.96");
  1688.                     QUI.CreateLabel(ref element, UIMain, "", $"{textPrimary}{LA("delHelNewNPC", player.UserIDString)} '/questnpc'</color>", 22, "0 0", "1 1");
  1689.                     CuiHelper.AddUi(player, element);
  1690.                     return;
  1691.                 case 2:
  1692.                     DestroyUI(player);
  1693.                     HelpMain = QUI.CreateElementContainer(UIPanel, QUI.Color(configData.Colors.Background_Dark.Color, configData.Colors.Background_Dark.Alpha), "0.4 0.3", "0.95 0.9");
  1694.                     QUI.CreatePanel(ref HelpMain, UIPanel, QUI.Color(configData.Colors.Background_Light.Color, configData.Colors.Background_Light.Alpha), "0.01 0.02", "0.99 0.98", true);
  1695.                     QUI.CreateLabel(ref HelpMain, UIPanel, "", $"{textSecondary}{LA("delHelMult", player.UserIDString)}</color>\n{textPrimary}{LA("creHelRT", player.UserIDString)}</color>", 18, "0.05 0.82", "0.95 0.98");
  1696.                     int i = 0;
  1697.                     if (Economics) CreateRewardTypeButton(ref HelpMain, UIPanel, "Coins (Economics)", "QUI_RewardType coins", i); i++;
  1698.                     if (ServerRewards) CreateRewardTypeButton(ref HelpMain, UIPanel, "RP (ServerRewards)", "QUI_RewardType rp", i); i++;
  1699.                     CreateRewardTypeButton(ref HelpMain, UIPanel, LA("Item", player.UserIDString), "QUI_RewardType item", i); i++;
  1700.                     if (HuntRPG) { CreateRewardTypeButton(ref HelpMain, UIPanel, "XP (HuntRPG)", "QUI_RewardType huntxp", i); i++; }
  1701.                     CuiHelper.AddUi(player, HelpMain);
  1702.                     return;
  1703.                 case 3:
  1704.                     {
  1705.                         HelpMain = QUI.CreateElementContainer(UIPanel, QUI.Color(configData.Colors.Background_Dark.Color, configData.Colors.Background_Dark.Alpha), "0.4 0.3", "0.95 0.9");
  1706.                         QUI.CreatePanel(ref HelpMain, UIPanel, QUI.Color(configData.Colors.Background_Light.Color, configData.Colors.Background_Light.Alpha), "0.01 0.02", "0.99 0.98");
  1707.                         var quest = ActiveCreations[player.userID];
  1708.                         if (quest.deliveryInfo.Reward.isCoins || quest.deliveryInfo.Reward.isRP || quest.deliveryInfo.Reward.isHuntXP)
  1709.                             DeliveryHelp(player, 4);
  1710.                         else
  1711.                         {
  1712.                             HelpMain = QUI.CreateElementContainer(UIPanel, QUI.Color(configData.Colors.Background_Dark.Color, configData.Colors.Background_Dark.Alpha), "0.3 0.8", "0.7 0.97");
  1713.                             QUI.CreatePanel(ref HelpMain, UIPanel, QUI.Color(configData.Colors.Background_Light.Color, configData.Colors.Background_Light.Alpha), "0.01 0.02", "0.99 0.98");
  1714.                             QUI.CreateLabel(ref HelpMain, UIPanel, "", $"{textPrimary}{LA("creHelIH", player.UserIDString)} 'quest item'</color>", 20, "0.1 0", "0.9 1");
  1715.                             CuiHelper.AddUi(player, HelpMain);
  1716.                         }
  1717.                     }
  1718.                     return;
  1719.                 case 4:
  1720.                     ActiveCreations[player.userID].partNum = 5;
  1721.                     HelpMain = QUI.CreateElementContainer(UIPanel, QUI.Color(configData.Colors.Background_Dark.Color, configData.Colors.Background_Dark.Alpha), "0.4 0.3", "0.95 0.9");
  1722.                     QUI.CreatePanel(ref HelpMain, UIPanel, QUI.Color(configData.Colors.Background_Light.Color, configData.Colors.Background_Light.Alpha), "0.01 0.02", "0.99 0.98");
  1723.                     QUI.CreateLabel(ref HelpMain, UIPanel, "", $"{textPrimary}{LA("delHelRM", player.UserIDString)}</color> {textSecondary}\n\n{LA("delHelRM1", player.UserIDString)}</color>{textPrimary} 2000m</color>{textSecondary} {LA("delHelRM2", player.UserIDString)} </color>{textPrimary}0.25</color>{textSecondary}, {LA("delHelRM3", player.UserIDString)} </color>{textPrimary}500</color>", 20, "0.05 0.1", "0.95 0.9");
  1724.                     CuiHelper.AddUi(player, HelpMain);
  1725.                     return;
  1726.                 case 5:
  1727.                     ActiveCreations[player.userID].partNum = 3;
  1728.                     HelpMain = QUI.CreateElementContainer(UIPanel, QUI.Color(configData.Colors.Background_Dark.Color, configData.Colors.Background_Dark.Alpha), "0.4 0.3", "0.95 0.9");
  1729.                     QUI.CreatePanel(ref HelpMain, UIPanel, QUI.Color(configData.Colors.Background_Light.Color, configData.Colors.Background_Light.Alpha), "0.01 0.02", "0.99 0.98");
  1730.                     QUI.CreateLabel(ref HelpMain, UIPanel, "", $"{textPrimary}{LA("delHelDD", player.UserIDString)}</color>", 20, "0.05 0.1", "0.95 0.9");
  1731.                     CuiHelper.AddUi(player, HelpMain);
  1732.                     return;
  1733.                 case 6:
  1734.                     {
  1735.                         HelpMain = QUI.CreateElementContainer(UIPanel, QUI.Color(configData.Colors.Background_Dark.Color, configData.Colors.Background_Dark.Alpha), "0.4 0.3", "0.95 0.9", true);
  1736.                         QUI.CreatePanel(ref HelpMain, UIPanel, QUI.Color(configData.Colors.Background_Light.Color, configData.Colors.Background_Light.Alpha), "0.01 0.02", "0.99 0.98");
  1737.                         QUI.CreateLabel(ref HelpMain, UIPanel, "", $"{textPrimary}{LA("delHelNewV", player.UserIDString)}</color>", 20, "0.1 0.8", "0.9 0.95");
  1738.  
  1739.                         var quest = ActiveCreations[player.userID];
  1740.                         string questDetails = $"{textPrimary}{LA("Quest Type:", player.UserIDString)}</color> {textSecondary}{quest.type}</color>";
  1741.                         questDetails = questDetails + $"\n{textPrimary}{LA("Name:", player.UserIDString)}</color> {textSecondary}{quest.deliveryInfo.Info.Name}</color>";
  1742.                         questDetails = questDetails + $"\n{textPrimary}{LA("Description:", player.UserIDString)}</color> {textSecondary}{quest.deliveryInfo.Description}</color>";
  1743.                         questDetails = questDetails + $"\n{textPrimary}{LA("Reward:", player.UserIDString)}</color> {textSecondary}{quest.deliveryInfo.Reward.DisplayName}</color>";
  1744.                         questDetails = questDetails + $"\n{textPrimary}{LA("Multiplier:", player.UserIDString)}</color> {textSecondary}{quest.deliveryInfo.Multiplier}</color>";
  1745.  
  1746.                         QUI.CreateLabel(ref HelpMain, UIPanel, "", questDetails, 20, "0.1 0.2", "0.9 0.75", TextAnchor.MiddleLeft);
  1747.                         QUI.CreateButton(ref HelpMain, UIPanel, QUI.Color(configData.Colors.Button_Standard.Color, configData.Colors.Button_Standard.Alpha), LA("Save Quest", player.UserIDString), 18, "0.6 0.05", "0.8 0.15", $"QUI_SaveQuest");
  1748.                         QUI.CreateButton(ref HelpMain, UIPanel, QUI.Color(configData.Colors.Button_Standard.Color, configData.Colors.Button_Standard.Alpha), LA("Cancel", player.UserIDString), 18, "0.2 0.05", "0.4 0.15", $"QUI_ExitQuest");
  1749.                         CuiHelper.AddUi(player, HelpMain);
  1750.                     }
  1751.                     return;
  1752.             default:
  1753.                     return;
  1754.             }
  1755.         }
  1756.         private void AcceptDelivery(BasePlayer player, string npcID, int page = 0)
  1757.         {
  1758.             var quest = vendors.DeliveryVendors[npcID];
  1759.  
  1760.             switch (page)
  1761.             {
  1762.                 case 0:
  1763.                     {
  1764.                         var target = vendors.DeliveryVendors[GetRandomNPC(npcID)];
  1765.                         if (quest != null && target != null)
  1766.                         {
  1767.                             var distance = Vector2.Distance(new Vector2(quest.Info.x, quest.Info.z), new Vector2(target.Info.x, target.Info.z));
  1768.                             var rewardAmount = distance * quest.Multiplier;
  1769.                             if (rewardAmount < 1) rewardAmount = 1;
  1770.                             var briefing = $"{textPrimary}{quest.Info.Name}\n\n</color>";
  1771.                             briefing = briefing + $"{textSecondary}{quest.Description}</color>\n\n";
  1772.                             briefing = briefing + $"{textPrimary}{LA("Destination:", player.UserIDString)} </color>{textSecondary}{target.Info.Name}\nX {target.Info.x}, Z {target.Info.z}</color>\n";
  1773.                             briefing = briefing + $"{textPrimary}{LA("Distance:", player.UserIDString)} </color>{textSecondary}{distance}M</color>\n";
  1774.                             briefing = briefing + $"{textPrimary}{LA("Reward:", player.UserIDString)} </color>{textSecondary}{(int)rewardAmount}x {quest.Reward.DisplayName}</color>";
  1775.  
  1776.                             var VendorUI = QUI.CreateElementContainer(UIPanel, QUI.Color(configData.Colors.Background_Dark.Color, configData.Colors.Background_Dark.Alpha), "0.4 0.3", "0.95 0.9", true);
  1777.                             QUI.CreatePanel(ref VendorUI, UIPanel, QUI.Color(configData.Colors.Background_Light.Color, configData.Colors.Background_Light.Alpha), "0.01 0.02", "0.99 0.98");
  1778.                             QUI.CreateLabel(ref VendorUI, UIPanel, "", briefing, 20, "0.15 0.2", "0.85 1", TextAnchor.MiddleLeft);
  1779.  
  1780.                             QUI.CreateButton(ref VendorUI, UIPanel, QUI.Color(configData.Colors.Button_Standard.Color, configData.Colors.Button_Standard.Alpha), LA("Accept", player.UserIDString), 18, "0.6 0.05", "0.8 0.15", $"QUI_AcceptDelivery {npcID} {target.Info.ID} {distance}");
  1781.                             QUI.CreateButton(ref VendorUI, UIPanel, QUI.Color(configData.Colors.Button_Standard.Color, configData.Colors.Button_Standard.Alpha), LA("Decline", player.UserIDString), 18, "0.2 0.05", "0.4 0.15", $"QUI_DestroyAll");
  1782.                             CuiHelper.AddUi(player, VendorUI);
  1783.                         }
  1784.                     }
  1785.                         return;
  1786.                     case 1:
  1787.                     {
  1788.                         var VendorUI = QUI.CreateElementContainer(UIPanel, QUI.Color(configData.Colors.Background_Dark.Color, configData.Colors.Background_Dark.Alpha), "0.4 0.3", "0.95 0.9", true);
  1789.                         QUI.CreatePanel(ref VendorUI, UIPanel, QUI.Color(configData.Colors.Background_Light.Color, configData.Colors.Background_Light.Alpha), "0.01 0.02", "0.99 0.98");
  1790.                         QUI.CreateLabel(ref VendorUI, UIPanel, "", $"{textPrimary} {LA("delComplMSG", player.UserIDString)}</color>", 22, "0 0", "1 1");
  1791.                         QUI.CreateButton(ref VendorUI, UIPanel, QUI.Color(configData.Colors.Button_Standard.Color, configData.Colors.Button_Standard.Alpha), LA("Claim", player.UserIDString), 18, "0.6 0.05", "0.8 0.15", $"QUI_FinishDelivery {npcID}");
  1792.                         QUI.CreateButton(ref VendorUI, UIPanel, QUI.Color(configData.Colors.Button_Standard.Color, configData.Colors.Button_Standard.Alpha), LA("Cancel", player.UserIDString), 18, "0.2 0.05", "0.4 0.15", $"QUI_DestroyAll");
  1793.                         CuiHelper.AddUi(player, VendorUI);
  1794.                     }
  1795.                     return;
  1796.                 default:
  1797.                     return;
  1798.  
  1799.             }
  1800.         }
  1801.  
  1802.         private void DeletionEditMenu(BasePlayer player, string page, string command)
  1803.         {
  1804.             DestroyEntries(player);
  1805.             var Main = QUI.CreateElementContainer(UIPanel, QUI.Color(configData.Colors.Background_Dark.Color, configData.Colors.Background_Dark.Alpha), "0.12 0", "1 1");
  1806.             QUI.CreatePanel(ref Main, UIPanel, QUI.Color(configData.Colors.Background_Light.Color, configData.Colors.Background_Light.Alpha), "0.01 0.01", "0.99 0.99", true);
  1807.             QUI.CreateLabel(ref Main, UIPanel, "1 1 1 0.025", page, 200, "0.01 0.01", "0.99 0.99");
  1808.  
  1809.             QUI.CreateLabel(ref Main, UIPanel, "", $"{textPrimary}{LA("Kill",player.UserIDString)}</color>", 20, "0 0.87", "0.25 0.92");
  1810.             QUI.CreateLabel(ref Main, UIPanel, "", $"{textPrimary}{LA("Gather", player.UserIDString)}</color>", 20, "0.25 0.87", "0.5 0.92");
  1811.             QUI.CreateLabel(ref Main, UIPanel, "", $"{textPrimary}{LA("Loot", player.UserIDString)}</color>", 20, "0.5 0.87", "0.75 0.92");
  1812.             QUI.CreateLabel(ref Main, UIPanel, "", $"{textPrimary}{LA("Craft", player.UserIDString)}</color>", 20, "0.75 0.87", "1 0.92");
  1813.             if (command == "QUI_ConfirmDelete") QUI.CreateButton(ref Main, UIPanel, QUI.Color(configData.Colors.Button_Standard.Color, configData.Colors.Button_Standard.Alpha), $"{textPrimary}{LA("Delete NPC", player.UserIDString)}</color>", 18, "0.8 0.94", "0.98 0.98", "QUI_DeleteNPCMenu");
  1814.  
  1815.             int killNum = 0;
  1816.             int gatherNum = 0;
  1817.             int lootNum = 0;
  1818.             int craftNum = 0;
  1819.             foreach (var entry in questData.Quest[QuestType.Kill])
  1820.             {
  1821.                 CreateDelEditButton(ref Main, 0.035f, UIPanel, entry.Key, killNum, command);
  1822.                 killNum++;
  1823.             }
  1824.             foreach (var entry in questData.Quest[QuestType.Gather])
  1825.             {
  1826.                 CreateDelEditButton(ref Main, 0.285f, UIPanel, entry.Key, gatherNum, command);
  1827.                 gatherNum++;
  1828.             }
  1829.             foreach (var entry in questData.Quest[QuestType.Loot])
  1830.             {
  1831.                 CreateDelEditButton(ref Main, 0.535f, UIPanel, entry.Key, lootNum, command);
  1832.                 lootNum++;
  1833.             }
  1834.             foreach (var entry in questData.Quest[QuestType.Craft])
  1835.             {
  1836.                 CreateDelEditButton(ref Main, 0.785f, UIPanel, entry.Key, craftNum, command);
  1837.                 craftNum++;
  1838.             }
  1839.             CuiHelper.AddUi(player, Main);
  1840.         }
  1841.         private void DeleteNPCMenu(BasePlayer player)
  1842.         {
  1843.             DestroyEntries(player);
  1844.             var Main = QUI.CreateElementContainer(UIPanel, QUI.Color(configData.Colors.Background_Dark.Color, configData.Colors.Background_Dark.Alpha), "0.12 0", "1 1");
  1845.             QUI.CreatePanel(ref Main, UIPanel, QUI.Color(configData.Colors.Background_Light.Color, configData.Colors.Background_Light.Alpha), "0.01 0.01", "0.99 0.99", true);
  1846.             QUI.CreateLabel(ref Main, UIPanel, "1 1 1 0.025", LA("REMOVER", player.UserIDString), 200, "0.01 0.01", "0.99 0.99");
  1847.  
  1848.             QUI.CreateLabel(ref Main, UIPanel, "", $"{textPrimary}{LA("Delivery Vendors", player.UserIDString)}</color>", 20, "0 0.87", "0.5 0.92");
  1849.             QUI.CreateLabel(ref Main, UIPanel, "", $"{textPrimary}{LA("Quest Vendors", player.UserIDString)}</color>", 20, "0.5 0.87", "1 0.92");
  1850.  
  1851.             int VendorNum = 0;
  1852.             int DeliveryNum = 0;
  1853.             foreach (var entry in vendors.QuestVendors)
  1854.             {
  1855.                 CreateDelVendorButton(ref Main, 0.535f, UIPanel, entry.Value.Name, DeliveryNum, $"QUI_RemoveVendor {entry.Key}");
  1856.                 VendorNum++;
  1857.             }
  1858.             foreach (var entry in vendors.DeliveryVendors)
  1859.             {
  1860.                 CreateDelVendorButton(ref Main, 0.035f, UIPanel, entry.Value.Info.Name, DeliveryNum, $"QUI_RemoveVendor {entry.Key}");
  1861.                 DeliveryNum++;
  1862.             }
  1863.             CuiHelper.AddUi(player, Main);
  1864.         }
  1865.         private void ConfirmDeletion(BasePlayer player, string questName)
  1866.         {
  1867.             var ConfirmDelete = QUI.CreateElementContainer(UIPanel, QUI.Color(configData.Colors.Background_Dark.Color, configData.Colors.Background_Dark.Alpha), "0.2 0.4", "0.8 0.8", true);
  1868.             QUI.CreatePanel(ref ConfirmDelete, UIPanel, QUI.Color(configData.Colors.Background_Light.Color, configData.Colors.Background_Light.Alpha), "0.01 0.02", "0.99 0.98");
  1869.             QUI.CreateLabel(ref ConfirmDelete, UIPanel, "", $"{textPrimary}{LA("confDel", player.UserIDString)} {questName}</color>", 20, "0.1 0.6", "0.9 0.9");
  1870.             QUI.CreateButton(ref ConfirmDelete, UIPanel, QUI.Color(configData.Colors.Button_Standard.Color, configData.Colors.Button_Standard.Alpha), LA("Yes", player.UserIDString), 18, "0.6 0.2", "0.8 0.3", $"QUI_DeleteQuest {questName}");
  1871.             QUI.CreateButton(ref ConfirmDelete, UIPanel, QUI.Color(configData.Colors.Button_Standard.Color, configData.Colors.Button_Standard.Alpha), LA("No", player.UserIDString), 18, "0.2 0.2", "0.4 0.3", $"QUI_DeleteQuest reject");
  1872.  
  1873.             CuiHelper.AddUi(player, ConfirmDelete);
  1874.         }
  1875.         private void ConfirmCancellation(BasePlayer player, string questName)
  1876.         {
  1877.             var ConfirmDelete = QUI.CreateElementContainer(UIPanel, QUI.Color(configData.Colors.Background_Dark.Color, configData.Colors.Background_Dark.Alpha), "0.2 0.4", "0.8 0.8", true);
  1878.             QUI.CreatePanel(ref ConfirmDelete, UIPanel, QUI.Color(configData.Colors.Background_Light.Color, configData.Colors.Background_Light.Alpha), "0.01 0.02", "0.99 0.98");
  1879.             QUI.CreateLabel(ref ConfirmDelete, UIPanel, "", $"{textPrimary}{LA("confCan", player.UserIDString)} {questName}</color>\n{textSecondary}{LA("confCan2", player.UserIDString)}</color>", 20, "0.1 0.6", "0.9 0.9");
  1880.             QUI.CreateButton(ref ConfirmDelete, UIPanel, QUI.Color(configData.Colors.Button_Standard.Color, configData.Colors.Button_Standard.Alpha), LA("Yes", player.UserIDString), 18, "0.6 0.2", "0.8 0.3", $"QUI_ConfirmCancel {questName}");
  1881.             QUI.CreateButton(ref ConfirmDelete, UIPanel, QUI.Color(configData.Colors.Button_Standard.Color, configData.Colors.Button_Standard.Alpha), LA("No", player.UserIDString), 18, "0.2 0.2", "0.4 0.3", $"QUI_ConfirmCancel reject");
  1882.  
  1883.             CuiHelper.AddUi(player, ConfirmDelete);
  1884.         }
  1885.  
  1886.         private void QuestEditorMenu(BasePlayer player)
  1887.         {
  1888.             DestroyEntries(player);
  1889.             var Main = QUI.CreateElementContainer(UIPanel, QUI.Color(configData.Colors.Background_Dark.Color, configData.Colors.Background_Dark.Alpha), "0.12 0", "1 1");
  1890.             QUI.CreatePanel(ref Main, UIPanel, QUI.Color(configData.Colors.Background_Light.Color, configData.Colors.Background_Light.Alpha), "0.01 0.01", "0.99 0.99", true);
  1891.             QUI.CreateLabel(ref Main, UIPanel, "1 1 1 0.025", LA("EDITOR", player.UserIDString), 200, "0.01 0.01", "0.99 0.99");
  1892.  
  1893.             int i = 0;
  1894.             QUI.CreateLabel(ref Main, UIPanel, "", $"{textPrimary}{LA("chaEdi", player.UserIDString)}</color>", 20, "0.25 0.8", "0.75 0.9");
  1895.             CreateNewQuestButton(ref Main, UIPanel, LA("Name", player.UserIDString), "QUI_EditQuestVar name", i); i++;
  1896.             CreateNewQuestButton(ref Main, UIPanel, LA("Description", player.UserIDString), "QUI_EditQuestVar description", i); i++;
  1897.             CreateNewQuestButton(ref Main, UIPanel, LA("Objective", player.UserIDString), "QUI_EditQuestVar objective", i); i++;
  1898.             CreateNewQuestButton(ref Main, UIPanel, LA("Amount", player.UserIDString), "QUI_EditQuestVar amount", i); i++;
  1899.             CreateNewQuestButton(ref Main, UIPanel, LA("Reward", player.UserIDString), "QUI_EditQuestVar reward", i); i++;
  1900.  
  1901.             CuiHelper.AddUi(player, Main);
  1902.         }
  1903.  
  1904.         private void CreateObjectiveEntry(ref CuiElementContainer container, string panelName, string name, int number)
  1905.         {
  1906.             var pos = CalcEntryPos(number);
  1907.             QUI.CreateButton(ref container, panelName, QUI.Color(configData.Colors.Button_Standard.Color, configData.Colors.Button_Standard.Alpha), name, 10, $"{pos[0]} {pos[1]}", $"{pos[2]} {pos[3]}", $"QUI_SelectObj {name}");
  1908.         }
  1909.         private void CreateNewQuestButton(ref CuiElementContainer container, string panelName, string buttonname, string command, int number)
  1910.         {
  1911.             Vector2 dimensions = new Vector2(0.2f, 0.07f);
  1912.             Vector2 origin = new Vector2(0.4f, 0.7f);
  1913.             Vector2 offset = new Vector2(0, (0.01f + dimensions.y) * number);
  1914.  
  1915.             Vector2 posMin = origin - offset;
  1916.             Vector2 posMax = posMin + dimensions;
  1917.  
  1918.             QUI.CreateButton(ref container, panelName, QUI.Color(configData.Colors.Button_Standard.Color, configData.Colors.Button_Standard.Alpha), buttonname, 18, $"{posMin.x} {posMin.y}", $"{posMax.x} {posMax.y}", command);
  1919.         }
  1920.         private void CreateRewardTypeButton(ref CuiElementContainer container, string panelName, string buttonname, string command, int number)
  1921.         {
  1922.             Vector2 dimensions = new Vector2(0.36f, 0.1f);
  1923.             Vector2 origin = new Vector2(0.32f, 0.7f);
  1924.             Vector2 offset = new Vector2(0, (0.01f + dimensions.y) * number);
  1925.  
  1926.             Vector2 posMin = origin - offset;
  1927.             Vector2 posMax = posMin + dimensions;
  1928.  
  1929.             QUI.CreateButton(ref container, panelName, QUI.Color(configData.Colors.Button_Standard.Color, configData.Colors.Button_Standard.Alpha), buttonname, 18, $"{posMin.x} {posMin.y}", $"{posMax.x} {posMax.y}", command);
  1930.         }
  1931.         private void CreateDelEditButton(ref CuiElementContainer container, float xPos, string panelName, string buttonname, int number, string command, float width = 0.18f)
  1932.         {
  1933.             Vector2 dimensions = new Vector2(width, 0.05f);
  1934.             Vector2 origin = new Vector2(xPos, 0.8f);
  1935.             Vector2 offset = new Vector2(0, (-0.01f - dimensions.y) * number);
  1936.  
  1937.             Vector2 posMin = origin + offset;
  1938.             Vector2 posMax = posMin + dimensions;
  1939.  
  1940.             QUI.CreateButton(ref container, panelName, QUI.Color(configData.Colors.Button_Standard.Color, configData.Colors.Button_Standard.Alpha), buttonname, 14, $"{posMin.x} {posMin.y}", $"{posMax.x} {posMax.y}", $"{command} {buttonname}");
  1941.         }
  1942.         private void CreateDelVendorButton(ref CuiElementContainer container, float xPos, string panelName, string buttonname, int number, string command)
  1943.         {
  1944.             if (number > 15) xPos += 0.25f;
  1945.             Vector2 dimensions = new Vector2(0.18f, 0.05f);
  1946.             Vector2 origin = new Vector2(xPos, 0.8f);
  1947.             Vector2 offset = new Vector2(0, (-0.01f - dimensions.y) * number);
  1948.  
  1949.             Vector2 posMin = origin + offset;
  1950.             Vector2 posMax = posMin + dimensions;
  1951.  
  1952.             QUI.CreateButton(ref container, panelName, QUI.Color(configData.Colors.Button_Standard.Color, configData.Colors.Button_Standard.Alpha), buttonname, 14, $"{posMin.x} {posMin.y}", $"{posMax.x} {posMax.y}", command);
  1953.         }
  1954.  
  1955.         private void PopupMessage(BasePlayer player, string msg)
  1956.         {
  1957.             CuiHelper.DestroyUi(player, "PopupMsg");
  1958.             var element = QUI.CreateElementContainer("PopupMsg", QUI.Color(configData.Colors.Background_Dark.Color, configData.Colors.Background_Dark.Alpha), "0.25 0.85", "0.75 0.95");
  1959.             QUI.CreatePanel(ref element, "PopupMsg", QUI.Color(configData.Colors.Button_Standard.Color, configData.Colors.Button_Standard.Alpha), "0.005 0.04", "0.995 0.96");
  1960.             QUI.CreateLabel(ref element, "PopupMsg", "", $"{textPrimary}{msg}</color>", 22, "0 0", "1 1");
  1961.             CuiHelper.AddUi(player, element);
  1962.             timer.Once(3, () => CuiHelper.DestroyUi(player, "PopupMsg"));
  1963.         }
  1964.  
  1965.         private Vector2 CalcQuestPos(int number)
  1966.         {
  1967.             Vector2 position = new Vector2(0.1325f, 0.71f);
  1968.             Vector2 dimensions = new Vector2(0.21f, 0.22f);
  1969.             float offsetY = 0f;
  1970.             float offsetX = 0;
  1971.             if (number >= 0 && number < 4)
  1972.             {
  1973.                 offsetX = (0.005f + dimensions.x) * number;
  1974.             }
  1975.             if (number > 3 && number < 8)
  1976.             {
  1977.                 offsetX = (0.005f + dimensions.x) * (number - 4);
  1978.                 offsetY = (-0.008f - dimensions.y) * 1;
  1979.             }
  1980.             if (number > 7 && number < 12)
  1981.             {
  1982.                 offsetX = (0.005f + dimensions.x) * (number - 8);
  1983.                 offsetY = (-0.008f - dimensions.y) * 2;
  1984.             }
  1985.             if (number > 11 && number < 16)
  1986.             {
  1987.                 offsetX = (0.005f + dimensions.x) * (number - 12);
  1988.                 offsetY = (-0.008f - dimensions.y) * 3;
  1989.             }
  1990.             return new Vector2(position.x + offsetX, position.y + offsetY);
  1991.         }
  1992.         private float[] CalcEntryPos(int number)
  1993.         {
  1994.             Vector2 position = new Vector2(0.014f, 0.8f);
  1995.             Vector2 dimensions = new Vector2(0.12f, 0.055f);
  1996.             float offsetY = 0;
  1997.             float offsetX = 0;
  1998.             if (number >= 0 && number <8)
  1999.             {
  2000.                 offsetX = (0.002f + dimensions.x) * number;
  2001.             }
  2002.             if (number > 7 && number < 16)
  2003.             {
  2004.                 offsetX = (0.002f + dimensions.x) * (number - 8);
  2005.                 offsetY = (-0.0055f - dimensions.y) * 1;
  2006.             }
  2007.             if (number > 15 && number < 24)
  2008.             {
  2009.                 offsetX = (0.002f + dimensions.x) * (number - 16);
  2010.                 offsetY = (-0.0055f - dimensions.y) * 2;
  2011.             }
  2012.             if (number > 23 && number < 32)
  2013.             {
  2014.                 offsetX = (0.002f + dimensions.x) * (number - 24);
  2015.                 offsetY = (-0.0055f - dimensions.y) * 3;
  2016.             }
  2017.             if (number > 31 && number < 40)
  2018.             {
  2019.                 offsetX = (0.002f + dimensions.x) * (number - 32);
  2020.                 offsetY = (-0.0055f - dimensions.y) * 4;
  2021.             }
  2022.             if (number > 39 && number < 48)
  2023.             {
  2024.                 offsetX = (0.002f + dimensions.x) * (number - 40);
  2025.                 offsetY = (-0.0055f - dimensions.y) * 5;
  2026.             }
  2027.             if (number > 47 && number < 56)
  2028.             {
  2029.                 offsetX = (0.002f + dimensions.x) * (number - 48);
  2030.                 offsetY = (-0.0055f - dimensions.y) * 6;
  2031.             }
  2032.             if (number > 55 && number < 64)
  2033.             {
  2034.                 offsetX = (0.002f + dimensions.x) * (number - 56);
  2035.                 offsetY = (-0.0055f - dimensions.y) * 7;
  2036.             }
  2037.             if (number > 63 && number < 72)
  2038.             {
  2039.                 offsetX = (0.002f + dimensions.x) * (number - 64);
  2040.                 offsetY = (-0.0055f - dimensions.y) * 8;
  2041.             }
  2042.             if (number > 71 && number < 80)
  2043.             {
  2044.                 offsetX = (0.002f + dimensions.x) * (number - 72);
  2045.                 offsetY = (-0.0055f - dimensions.y) * 9;
  2046.             }
  2047.             if (number > 79 && number < 88)
  2048.             {
  2049.                 offsetX = (0.002f + dimensions.x) * (number - 80);
  2050.                 offsetY = (-0.0055f - dimensions.y) * 10;
  2051.             }
  2052.             if (number > 87 && number < 96)
  2053.             {
  2054.                 offsetX = (0.002f + dimensions.x) * (number - 88);
  2055.                 offsetY = (-0.0055f - dimensions.y) * 11;
  2056.             }
  2057.             Vector2 offset = new Vector2(offsetX, offsetY);
  2058.             Vector2 posMin = position + offset;
  2059.             Vector2 posMax = posMin + dimensions;
  2060.             return new float[] { posMin.x, posMin.y, posMax.x, posMax.y };
  2061.         }
  2062.  
  2063.         private void AddUIString(BasePlayer player, string name)
  2064.         {
  2065.             if (!OpenUI.ContainsKey(player.userID))
  2066.                 OpenUI.Add(player.userID, new List<string>());
  2067.             OpenUI[player.userID].Add(name);
  2068.         }
  2069.         private void DestroyUI(BasePlayer player)
  2070.         {
  2071.             CuiHelper.DestroyUi(player, UIMain);
  2072.             DestroyEntries(player);
  2073.         }
  2074.         private void DestroyEntries(BasePlayer player)
  2075.         {
  2076.             CuiHelper.DestroyUi(player, UIPanel);
  2077.             if (OpenUI.ContainsKey(player.userID))
  2078.             {
  2079.                 foreach (var entry in OpenUI[player.userID])
  2080.                     CuiHelper.DestroyUi(player, entry);
  2081.                 OpenUI.Remove(player.userID);
  2082.             }
  2083.         }
  2084.         #endregion
  2085.  
  2086.         #region UI Commands
  2087.         [ConsoleCommand("QUI_AcceptQuest")]
  2088.         private void cmdAcceptQuest(ConsoleSystem.Arg arg)
  2089.         {
  2090.             var player = arg.Connection.player as BasePlayer;
  2091.             if (player == null)
  2092.                 return;
  2093.             var questName = string.Join(" ", arg.Args);
  2094.             CheckPlayerEntry(player);
  2095.             var data = PlayerProgress[player.userID].Quests;
  2096.             if (!data.ContainsKey(questName))
  2097.             {
  2098.                 var type = GetQuestType(questName);
  2099.                 if (type != null)
  2100.                 {
  2101.                     var quest = Quest[(QuestType)type][questName];
  2102.                     data.Add(questName, new PlayerQuestInfo { Status = QuestStatus.Pending, Type = (QuestType)type });
  2103.                     PlayerProgress[player.userID].RequiredItems.Add(new QuestInfo { ShortName = quest.Objective, Type = (QuestType)type });
  2104.                     DestroyEntries(player);
  2105.                     ListElement(player, (QuestType)type);
  2106.                     PopupMessage(player, $"{LA("qAccep", player.UserIDString)} {questName}");
  2107.                     return;
  2108.                 }
  2109.             }
  2110.         }
  2111.         [ConsoleCommand("QUI_AcceptDelivery")]
  2112.         private void cmdAcceptDelivery(ConsoleSystem.Arg arg)
  2113.         {
  2114.             var player = arg.Connection.player as BasePlayer;
  2115.             if (player == null)
  2116.                 return;
  2117.             var vendorID = arg.Args[0];
  2118.             var targetID = arg.Args[1];
  2119.             var distance = arg.Args[2];
  2120.             PlayerProgress[player.userID].CurrentDelivery = new ActiveDelivery { VendorID = vendorID, TargetID = targetID, Distance = float.Parse(distance) };
  2121.             PopupMessage(player, LA("dAccep", player.UserIDString));
  2122.             DestroyUI(player);
  2123.         }
  2124.         [ConsoleCommand("QUI_CancelDelivery")]
  2125.         private void cmdCancelDelivery(ConsoleSystem.Arg arg)
  2126.         {
  2127.             var player = arg.Connection.player as BasePlayer;
  2128.             if (player == null)
  2129.                 return;
  2130.             if (!string.IsNullOrEmpty(PlayerProgress[player.userID].CurrentDelivery.TargetID))
  2131.             {
  2132.                 PlayerProgress[player.userID].CurrentDelivery = new ActiveDelivery();
  2133.                 DestroyUI(player);
  2134.                 PopupMessage(player, LA("canConf", player.UserIDString));
  2135.             }
  2136.         }
  2137.         [ConsoleCommand("QUI_FinishDelivery")]
  2138.         private void cmdFinishDelivery(ConsoleSystem.Arg arg)
  2139.         {
  2140.             var player = arg.Connection.player as BasePlayer;
  2141.             if (player == null)
  2142.                 return;
  2143.  
  2144.             if (PlayerProgress[player.userID].CurrentDelivery != null && PlayerProgress[player.userID].CurrentDelivery.TargetID == arg.GetString(0))
  2145.             {
  2146.                 var npcID = PlayerProgress[player.userID].CurrentDelivery.VendorID;
  2147.                 var distance = PlayerProgress[player.userID].CurrentDelivery.Distance;
  2148.                 var quest = vendors.DeliveryVendors[npcID];
  2149.                 var rewardAmount = distance * quest.Multiplier;
  2150.                 if (rewardAmount < 1) rewardAmount = 1;
  2151.  
  2152.                 var reward = quest.Reward;
  2153.                     reward.Amount = rewardAmount;
  2154.                 if (GiveReward(player, new List<RewardItem> { reward }))
  2155.                 {
  2156.                     var rewards = GetRewardString(new List<RewardItem> { reward });
  2157.                     PopupMessage(player, $"{LA("rewRec", player.UserIDString)} {rewards}");
  2158.                     PlayerProgress[player.userID].CurrentDelivery = new ActiveDelivery();
  2159.                 }
  2160.                 DestroyUI(player);
  2161.             }
  2162.         }
  2163.         [ConsoleCommand("QUI_ChangeElement")]
  2164.         private void cmdChangeElement(ConsoleSystem.Arg arg)
  2165.         {
  2166.             var player = arg.Connection.player as BasePlayer;
  2167.             if (player == null)
  2168.                 return;
  2169.             CheckPlayerEntry(player);
  2170.             var panelName = arg.GetString(0);
  2171.             switch (panelName)
  2172.             {
  2173.                 case "kill":
  2174.                     ListElement(player, QuestType.Kill);
  2175.                     return;
  2176.                 case "gather":
  2177.                     ListElement(player, QuestType.Gather);
  2178.                     return;
  2179.                 case "loot":
  2180.                     ListElement(player, QuestType.Loot);
  2181.                     return;
  2182.                 case "craft":
  2183.                     ListElement(player, QuestType.Craft);
  2184.                     return;
  2185.                 case "delivery":
  2186.                     PlayerDelivery(player);
  2187.                     return;
  2188.                 case "personal":
  2189.                     PlayerStats(player);
  2190.                     return;
  2191.                 case "editor":
  2192.                     if (player.IsAdmin)
  2193.                         DeletionEditMenu(player, LA("EDITOR", player.UserIDString), "QUI_EditQuest");
  2194.                     return;
  2195.                 case "creation":
  2196.                     if (player.IsAdmin)
  2197.                     {
  2198.                         if (ActiveCreations.ContainsKey(player.userID))
  2199.                             ActiveCreations.Remove(player.userID);
  2200.                         CreationMenu(player);
  2201.                     }
  2202.                     return;
  2203.                 case "objpage":
  2204.                     if (player.IsAdmin)
  2205.                     {
  2206.                         var pageNumber = arg.GetString(1);
  2207.                         CreateObjectiveMenu(player, int.Parse(pageNumber));
  2208.                     }
  2209.                     return;
  2210.                 case "listpage":
  2211.                     {
  2212.                         var pageNumber = arg.GetString(2);
  2213.                         var type = ConvertStringToType(arg.GetString(1));
  2214.                         ListElement(player, type, int.Parse(pageNumber));
  2215.                     }
  2216.                     return;
  2217.                 case "statspage":
  2218.                     {
  2219.                         var pageNumber = arg.GetString(1);
  2220.                         PlayerStats(player, int.Parse(pageNumber));
  2221.                     }
  2222.                     return;
  2223.             }
  2224.         }
  2225.         [ConsoleCommand("QUI_DestroyAll")]
  2226.         private void cmdDestroyAll(ConsoleSystem.Arg arg)
  2227.         {
  2228.             var player = arg.Connection.player as BasePlayer;
  2229.             if (player == null)
  2230.                 return;
  2231.             if (StatsMenu.Contains(player.userID))
  2232.                 StatsMenu.Remove(player.userID);
  2233.             if (ActiveCreations.ContainsKey(player.userID))
  2234.                 ActiveCreations.Remove(player.userID);
  2235.             if (ActiveEditors.ContainsKey(player.userID))
  2236.                 ActiveEditors.Remove(player.userID);
  2237.             if (OpenMenuBind.Contains(player.userID))
  2238.                 OpenMenuBind.Remove(player.userID);
  2239.             DestroyUI(player);
  2240.             OpenMap(player);
  2241.         }
  2242.         [ConsoleCommand("QUI_NewQuest")]
  2243.         private void cmdNewQuest(ConsoleSystem.Arg arg)
  2244.         {
  2245.             var player = arg.Connection.player as BasePlayer;
  2246.             if (player == null)
  2247.                 return;
  2248.             if (player.IsAdmin)
  2249.             {
  2250.                 var questType = arg.GetString(0);
  2251.                 var Type = ConvertStringToType(questType);
  2252.                 if (Type == QuestType.Delivery)
  2253.                 {
  2254.                     DeliveryHelp(player);
  2255.                     return;
  2256.                 }
  2257.  
  2258.                 ActiveCreations.Add(player.userID, new QuestCreator { type = Type, entry = new QuestEntry { Rewards = new List<RewardItem>() }, item = new RewardItem() });
  2259.                 DestroyUI(player);
  2260.                 CreationHelp(player);
  2261.             }
  2262.         }
  2263.         [ConsoleCommand("QUI_AddVendor")]
  2264.         private void cmdAddVendor(ConsoleSystem.Arg arg)
  2265.         {
  2266.             var player = arg.Connection.player as BasePlayer;
  2267.             if (player == null)
  2268.                 return;
  2269.             if (player.IsAdmin)
  2270.             {
  2271.                 var vendorType = arg.GetString(0);
  2272.                 bool isVendor = false;
  2273.                 if (vendorType == "1")
  2274.                     isVendor = true;
  2275.                 if (!AddVendor.ContainsKey(player.userID))
  2276.                     AddVendor.Add(player.userID, isVendor);
  2277.                 DestroyUI(player);
  2278.                 DeliveryHelp(player, 1);
  2279.             }
  2280.         }
  2281.         [ConsoleCommand("QUI_SelectObj")]
  2282.         private void cmdSelectObj(ConsoleSystem.Arg arg)
  2283.         {
  2284.             var player = arg.Connection.player as BasePlayer;
  2285.             if (player == null)
  2286.                 return;
  2287.             if (player.IsAdmin)
  2288.             {
  2289.                 var questItem = string.Join(" ", arg.Args);
  2290.                 QuestCreator Creator;
  2291.                 if (ActiveCreations.ContainsKey(player.userID))
  2292.                     Creator = ActiveCreations[player.userID];
  2293.                 else Creator = ActiveEditors[player.userID];
  2294.  
  2295.                 Creator.entry.Objective = questItem;
  2296.                 if (DisplayNames.ContainsKey(questItem))
  2297.                     Creator.entry.ObjectiveName = DisplayNames[questItem];
  2298.                 else
  2299.                     Creator.entry.ObjectiveName = questItem;
  2300.  
  2301.                 Creator.partNum++;
  2302.                 DestroyUI(player);
  2303.  
  2304.                 CreationHelp(player, 2);
  2305.             }
  2306.         }
  2307.         [ConsoleCommand("QUI_RewardType")]
  2308.         private void cmdRewardType(ConsoleSystem.Arg arg)
  2309.         {
  2310.             var player = arg.Connection.player as BasePlayer;
  2311.             if (player == null)
  2312.                 return;
  2313.             if (player.IsAdmin)
  2314.             {
  2315.                 var rewardType = arg.GetString(0);
  2316.                 QuestCreator Creator;
  2317.  
  2318.                 if (ActiveCreations.ContainsKey(player.userID))
  2319.                     Creator = ActiveCreations[player.userID];
  2320.                 else Creator = ActiveEditors[player.userID];
  2321.  
  2322.                 bool isRP = false;
  2323.                 bool isCoins = false;
  2324.                 bool isHuntXP = false;
  2325.                 string name = "";
  2326.  
  2327.                 switch (rewardType)
  2328.                 {
  2329.                     case "rp":
  2330.                         isRP = true;
  2331.                         name = LA("RP", player.UserIDString);
  2332.                         break;
  2333.                     case "coins":
  2334.                         isCoins = true;
  2335.                         name = LA("Coins", player.UserIDString);
  2336.                         break;
  2337.                     case "huntxp":
  2338.                         isHuntXP = true;
  2339.                         name = LA("HuntXP", player.UserIDString);
  2340.                         break;
  2341.                     default:
  2342.                         break;
  2343.                 }
  2344.                 Creator.partNum = 5;
  2345.                 if (Creator.type != QuestType.Delivery)
  2346.                 {
  2347.                     Creator.item.isRP = isRP;
  2348.                     Creator.item.isCoins = isCoins;
  2349.                     Creator.item.isHuntXP = isHuntXP;
  2350.                     Creator.item.DisplayName = name;
  2351.                     CreationHelp(player, 5);
  2352.                 }
  2353.                 else
  2354.                 {
  2355.                     Creator.deliveryInfo.Reward.isRP = isRP;
  2356.                     Creator.deliveryInfo.Reward.isCoins = isCoins;
  2357.                     Creator.deliveryInfo.Reward.isHuntXP = isHuntXP;
  2358.                     Creator.deliveryInfo.Reward.DisplayName = name;
  2359.                     DeliveryHelp(player, 3);
  2360.                 }
  2361.             }
  2362.         }
  2363.         [ConsoleCommand("QUI_ClaimReward")]
  2364.         private void cmdClaimReward(ConsoleSystem.Arg arg)
  2365.         {
  2366.             var player = arg.Connection.player as BasePlayer;
  2367.             if (player == null)
  2368.                 return;
  2369.  
  2370.             var questName = string.Join(" ", arg.Args);
  2371.             var quest = GetQuest(questName);
  2372.             if (quest == null) return;
  2373.  
  2374.             if (IsQuestCompleted(player.userID, questName))
  2375.             {
  2376.                 if (GiveReward(player, quest.Rewards))
  2377.                 {
  2378.                     var rewards = GetRewardString(quest.Rewards);
  2379.                     PopupMessage(player, $"{LA("rewRec", player.UserIDString)} {rewards}");
  2380.                     PlayerProgress[player.userID].Quests[questName].RewardClaimed = true;
  2381.                 }
  2382.                 else
  2383.                 {
  2384.                     PopupMessage(player, LA("rewError", player.UserIDString));
  2385.                 }
  2386.             }
  2387.             PlayerStats(player);
  2388.         }
  2389.         bool IsQuestCompleted(ulong playerId, string questName = "") => !string.IsNullOrEmpty(questName) && PlayerProgress[playerId].Quests[questName].Status == QuestStatus.Completed;
  2390.  
  2391.         [ConsoleCommand("QUI_CancelQuest")]
  2392.         private void cmdCancelQuest(ConsoleSystem.Arg arg)
  2393.         {
  2394.             var player = arg.Connection.player as BasePlayer;
  2395.             if (player == null)
  2396.                 return;
  2397.             var questName = string.Join(" ", arg.Args);
  2398.             DestroyUI(player);
  2399.             ConfirmCancellation(player, questName);
  2400.         }
  2401.         [ConsoleCommand("QUI_ItemDeduction")]
  2402.         private void cmdItemDeduction(ConsoleSystem.Arg arg)
  2403.         {
  2404.             var player = arg.Connection.player as BasePlayer;
  2405.             if (player == null)
  2406.                 return;
  2407.             if (player.IsAdmin)
  2408.             {
  2409.                 QuestCreator Creator;
  2410.                 if (ActiveCreations.ContainsKey(player.userID))
  2411.                     Creator = ActiveCreations[player.userID];
  2412.                 else Creator = ActiveEditors[player.userID];
  2413.                 switch (arg.Args[0])
  2414.                 {
  2415.                     case "0":
  2416.                         Creator.entry.ItemDeduction = false;
  2417.                         break;
  2418.                     default:
  2419.                         Creator.entry.ItemDeduction = true;
  2420.                         break;
  2421.                 }
  2422.                 CreationHelp(player, 9);
  2423.             }
  2424.         }
  2425.         [ConsoleCommand("QUI_ConfirmCancel")]
  2426.         private void cmdConfirmCancel(ConsoleSystem.Arg arg)
  2427.         {
  2428.             var player = arg.Connection.player as BasePlayer;
  2429.             if (player == null)
  2430.                 return;
  2431.             var questName = string.Join(" ", arg.Args);
  2432.             if (questName.Contains("reject"))
  2433.             {
  2434.                 DestroyUI(player);
  2435.                 if (StatsMenu.Contains(player.userID))
  2436.                     CreateEmptyMenu(player);
  2437.                 else CreateMenu(player);
  2438.                 PlayerStats(player);
  2439.                 return;
  2440.             }
  2441.             var quest = GetQuest(questName);
  2442.             if (quest == null) return;
  2443.             var info = PlayerProgress[player.userID];
  2444.             var items = info.RequiredItems;
  2445.             for (int i = 0; i < items.Count; i++)
  2446.             {
  2447.                 if (items[i].ShortName == questName && items[i].Type == info.Quests[questName].Type)
  2448.                 {
  2449.                     items.Remove(items[i]);
  2450.                     break;
  2451.                 }
  2452.             }
  2453.             var type = (QuestType)GetQuestType(questName);
  2454.             if (type != QuestType.Delivery && type != QuestType.Kill)
  2455.             {
  2456.                 string questitem = quest.Objective;
  2457.                 int amount = info.Quests[questName].AmountCollected;
  2458.                 if (quest.ItemDeduction)
  2459.                     ReturnItems(player, questitem, amount);
  2460.             }
  2461.             PlayerProgress[player.userID].Quests.Remove(questName);
  2462.  
  2463.             if (StatsMenu.Contains(player.userID))
  2464.                 CreateEmptyMenu(player);
  2465.             else CreateMenu(player);
  2466.  
  2467.             PlayerStats(player);
  2468.         }
  2469.         [ConsoleCommand("QUI_RemoveCompleted")]
  2470.         private void cmdRemoveCompleted(ConsoleSystem.Arg arg)
  2471.         {
  2472.             var player = arg.Connection.player as BasePlayer;
  2473.             if (player == null)
  2474.                 return;
  2475.             var questName = string.Join(" ", arg.Args);
  2476.             var quest = GetQuest(questName);
  2477.             if (quest == null) return;
  2478.             var info = PlayerProgress[player.userID];
  2479.             var items = info.RequiredItems;
  2480.             for (int i = 0; i < items.Count; i++)
  2481.             {
  2482.                 if (items[i].ShortName == questName && items[i].Type == info.Quests[questName].Type)
  2483.                 {
  2484.                     items.Remove(items[i]);
  2485.                     break;
  2486.                 }
  2487.             }
  2488.             PlayerProgress[player.userID].Quests.Remove(questName);
  2489.             PlayerStats(player);
  2490.         }
  2491.         [ConsoleCommand("QUI_DeleteQuest")]
  2492.         private void cmdDeleteQuest(ConsoleSystem.Arg arg)
  2493.         {
  2494.             var player = arg.Connection.player as BasePlayer;
  2495.             if (player == null)
  2496.                 return;
  2497.             if (player.IsAdmin)
  2498.             {
  2499.                 if (arg.Args == null || arg.Args.Length == 0)
  2500.                 {
  2501.                     DeletionEditMenu(player, LA("REMOVER", player.UserIDString), "QUI_ConfirmDelete");
  2502.                     return;
  2503.                 }
  2504.                 if (arg.Args.Length == 1 && arg.Args[0] == "reject")
  2505.                 {
  2506.                     DestroyUI(player);
  2507.                     CreateMenu(player);
  2508.                     DeletionEditMenu(player, LA("REMOVER", player.UserIDString), "QUI_ConfirmDelete");
  2509.                     return;
  2510.                 }
  2511.                 var questName = string.Join(" ", arg.Args);
  2512.                 RemoveQuest(questName);
  2513.                 DestroyUI(player);
  2514.                 CreateMenu(player);
  2515.                 DeletionEditMenu(player, LA("REMOVER", player.UserIDString), "QUI_ConfirmDelete");
  2516.             }
  2517.         }
  2518.         [ConsoleCommand("QUI_DeleteNPCMenu")]
  2519.         private void cmdDeleteNPCMenu(ConsoleSystem.Arg arg)
  2520.         {
  2521.             var player = arg.Connection.player as BasePlayer;
  2522.             if (player == null)
  2523.                 return;
  2524.             if (player.IsAdmin)
  2525.             {
  2526.                 DeleteNPCMenu(player);
  2527.             }
  2528.         }
  2529.         [ConsoleCommand("QUI_RemoveVendor")]
  2530.         private void cmdRemoveVendor(ConsoleSystem.Arg arg)
  2531.         {
  2532.             var player = arg.Connection.player as BasePlayer;
  2533.             if (player == null)
  2534.                 return;
  2535.             if (player.IsAdmin)
  2536.             {
  2537.                 var ID = arg.Args[0];
  2538.                 foreach(var npc in vendors.QuestVendors)
  2539.                 {
  2540.                     if (npc.Key == ID)
  2541.                     {
  2542.                         RemoveVendor(player, ID, true);
  2543.                         return;
  2544.                     }
  2545.                 }
  2546.                 foreach (var npc in vendors.DeliveryVendors)
  2547.                 {
  2548.                     if (npc.Key == ID)
  2549.                     {
  2550.                         RemoveVendor(player, ID, false);
  2551.                         return;
  2552.                     }
  2553.                 }
  2554.             }
  2555.         }
  2556.         [ConsoleCommand("QUI_ConfirmDelete")]
  2557.         private void cmdConfirmDelete(ConsoleSystem.Arg arg)
  2558.         {
  2559.             var player = arg.Connection.player as BasePlayer;
  2560.             if (player == null)
  2561.                 return;
  2562.             if (player.IsAdmin)
  2563.             {
  2564.                 var questName = string.Join(" ", arg.Args);
  2565.                 DestroyUI(player);
  2566.                 ConfirmDeletion(player, questName);
  2567.             }
  2568.         }
  2569.         [ConsoleCommand("QUI_EditQuest")]
  2570.         private void cmdEditQuest(ConsoleSystem.Arg arg)
  2571.         {
  2572.             var player = arg.Connection.player as BasePlayer;
  2573.             if (player == null)
  2574.                 return;
  2575.             if (player.IsAdmin)
  2576.             {
  2577.                 if (ActiveEditors.ContainsKey(player.userID))
  2578.                     ActiveEditors.Remove(player.userID);
  2579.                 ActiveEditors.Add(player.userID, new QuestCreator());
  2580.  
  2581.                 var questName = string.Join(" ", arg.Args);
  2582.                 var Quest = GetQuest(questName);
  2583.                 if (Quest == null) return;
  2584.                 ActiveEditors[player.userID].entry = Quest;
  2585.                 ActiveEditors[player.userID].oldEntry = Quest.QuestName;
  2586.                 ActiveEditors[player.userID].type = (QuestType)GetQuestType(questName);
  2587.                 ActiveEditors[player.userID].item = new RewardItem();
  2588.                 QuestEditorMenu(player);
  2589.             }
  2590.         }
  2591.         [ConsoleCommand("QUI_EditQuestVar")]
  2592.         private void cmdEditQuestVar(ConsoleSystem.Arg arg)
  2593.         {
  2594.             var player = arg.Connection.player as BasePlayer;
  2595.             if (player == null)
  2596.                 return;
  2597.             if (player.IsAdmin)
  2598.             {
  2599.                 if (ActiveEditors.ContainsKey(player.userID))
  2600.                 {
  2601.                     var Creator = ActiveEditors[player.userID];
  2602.  
  2603.                     DestroyUI(player);
  2604.                     switch (arg.Args[0].ToLower())
  2605.                     {
  2606.                         case "name":
  2607.                             CreationHelp(player, 0);
  2608.                             break;
  2609.                         case "description":
  2610.                             Creator.partNum = 3;
  2611.                             CreationHelp(player, 3);
  2612.                             break;
  2613.                         case "objective":
  2614.                             Creator.partNum = 1;
  2615.                             CreationHelp(player, 1);
  2616.                             break;
  2617.                         case "amount":
  2618.                             Creator.partNum = 2;
  2619.                             CreationHelp(player, 2);
  2620.                             break;
  2621.                         case "reward":
  2622.                             Creator.partNum = 4;
  2623.                             CreationHelp(player, 10);
  2624.                             break;
  2625.                         default:
  2626.                             return;
  2627.                     }
  2628.                 }
  2629.             }
  2630.         }
  2631.         [ConsoleCommand("QUI_RemoveReward")]
  2632.         private void cmdEditReward(ConsoleSystem.Arg arg)
  2633.         {
  2634.             var player = arg.Connection.player as BasePlayer;
  2635.             if (player == null)
  2636.                 return;
  2637.             if (player.IsAdmin)
  2638.             {
  2639.                 QuestCreator Creator = ActiveEditors[player.userID];
  2640.                 var amount = arg.Args[0];
  2641.                 var dispName = arg.Args[1];
  2642.                 foreach(var entry in Creator.entry.Rewards)
  2643.                 {
  2644.                     if (entry.Amount == float.Parse(amount) && entry.DisplayName == dispName)
  2645.                     {
  2646.                         Creator.entry.Rewards.Remove(entry);
  2647.                         break;
  2648.                     }
  2649.                 }
  2650.                 SaveRewardsEdit(player);
  2651.             }
  2652.         }
  2653.         [ConsoleCommand("QUI_EndEditing")]
  2654.         private void cmdEndEditing(ConsoleSystem.Arg arg)
  2655.         {
  2656.             var player = arg.Connection.player as BasePlayer;
  2657.             if (player == null)
  2658.                 return;
  2659.             if (player.IsAdmin)
  2660.             {
  2661.                 CreateMenu(player);
  2662.                 DeletionEditMenu(player, LA("EDITOR", player.UserIDString), "QUI_EditQuest");
  2663.             }
  2664.         }
  2665.         [ConsoleCommand("QUI_SaveQuest")]
  2666.         private void cmdSaveQuest(ConsoleSystem.Arg arg)
  2667.         {
  2668.             var player = arg.Connection.player as BasePlayer;
  2669.             if (player == null)
  2670.                 return;
  2671.             if (player.IsAdmin)
  2672.             {
  2673.                 bool creating = false;
  2674.                 if (ActiveCreations.ContainsKey(player.userID))
  2675.                     creating = true;
  2676.                 SaveQuest(player, creating);
  2677.             }
  2678.         }
  2679.         [ConsoleCommand("QUI_ExitQuest")]
  2680.         private void cmdExitQuest(ConsoleSystem.Arg arg)
  2681.         {
  2682.             var player = arg.Connection.player as BasePlayer;
  2683.             if (player == null)
  2684.                 return;
  2685.             if (player.IsAdmin)
  2686.             {
  2687.                 bool creating = false;
  2688.                 if (ActiveCreations.ContainsKey(player.userID))
  2689.                     creating = true;
  2690.                 ExitQuest(player, creating);
  2691.             }
  2692.         }
  2693.         [ConsoleCommand("QUI_AddReward")]
  2694.         private void cmdAddReward(ConsoleSystem.Arg arg)
  2695.         {
  2696.             var player = arg.Connection.player as BasePlayer;
  2697.             if (player == null)
  2698.                 return;
  2699.             if (player.IsAdmin)
  2700.             {
  2701.                 QuestCreator Creator;
  2702.                 if (ActiveCreations.ContainsKey(player.userID))
  2703.                     Creator = ActiveCreations[player.userID];
  2704.                 else Creator = ActiveEditors[player.userID];
  2705.                 Creator.partNum = 4;
  2706.                 CreationHelp(player, 4);
  2707.             }
  2708.         }
  2709.         [ConsoleCommand("QUI_RewardFinish")]
  2710.         private void cmdFinishReward(ConsoleSystem.Arg arg)
  2711.         {
  2712.             var player = arg.Connection.player as BasePlayer;
  2713.             if (player == null)
  2714.                 return;
  2715.             if (player.IsAdmin)
  2716.             {
  2717.                 CreationHelp(player, 8);
  2718.             }
  2719.         }
  2720.         [ConsoleCommand("QUI_OpenQuestMenu")]
  2721.         private void cmdOpenQuestMenu(ConsoleSystem.Arg arg)
  2722.         {
  2723.             var player = arg.Connection.player as BasePlayer;
  2724.             if (player == null)
  2725.                 return;
  2726.             if (!OpenMenuBind.Contains(player.userID))
  2727.             {
  2728.                 cmdOpenMenu(player, "q", new string[0]);
  2729.                 OpenMenuBind.Add(player.userID);
  2730.             }
  2731.         }
  2732.         #endregion
  2733.  
  2734.         #region Chat Commands
  2735.         [ChatCommand("q")]
  2736.         void cmdOpenMenu(BasePlayer player, string command, string[] args)
  2737.         {
  2738.             if (AddVendor.ContainsKey(player.userID)) return;
  2739.             if ((configData.UseNPCVendors && player.IsAdmin) || !configData.UseNPCVendors)
  2740.             {
  2741.                 CheckPlayerEntry(player);
  2742.                 CreateMenu(player);
  2743.                 return;
  2744.             }
  2745.             if (configData.UseNPCVendors)
  2746.             {
  2747.                 CheckPlayerEntry(player);
  2748.                 if (!StatsMenu.Contains(player.userID))
  2749.                     StatsMenu.Add(player.userID);
  2750.  
  2751.                 CreateEmptyMenu(player);
  2752.                 PlayerStats(player);
  2753.                 PopupMessage(player, LA("noVendor", player.UserIDString));
  2754.             }
  2755.         }
  2756.  
  2757.         [ChatCommand("questnpc")]
  2758.         void cmdQuestNPC(BasePlayer player, string command, string[] args)
  2759.         {
  2760.             if (!player.IsAdmin) return;
  2761.             var NPC = FindEntity(player);
  2762.             if (NPC != null)
  2763.             {
  2764.                 var isRegistered = isNPCRegistered(NPC.UserIDString);
  2765.                 if (!string.IsNullOrEmpty(isRegistered))
  2766.                 {
  2767.                     SendMSG(player, isRegistered, LA("Quest NPCs:", player.UserIDString));
  2768.                     return;
  2769.                 }
  2770.                 string name = "";
  2771.                 if (args.Length >= 1)
  2772.                     name = string.Join(" ", args);
  2773.  
  2774.                 if (AddVendor.ContainsKey(player.userID))
  2775.                 {
  2776.                     var pos = new NPCInfo { x = NPC.transform.position.x, z = NPC.transform.position.z, ID = NPC.UserIDString };
  2777.                     if (AddVendor[player.userID])
  2778.                     {
  2779.                         pos.Name = $"QuestVendor_{vendors.QuestVendors.Count + 1}";
  2780.                         vendors.QuestVendors.Add(NPC.UserIDString, pos);
  2781.                         SendMSG(player, LA("newVSucc", player.UserIDString), LA("Quest NPCs:", player.UserIDString));
  2782.                         if (NPC != null)
  2783.                         {
  2784.                             NPC.displayName = pos.Name;
  2785.                             NPC.UpdateNetworkGroup();
  2786.                         }
  2787.                         AddMapMarker(pos.x, pos.z, pos.Name, configData.LustyMapIntegration.Icon_Vendor + ".png");
  2788.                         AddVendor.Remove(player.userID);
  2789.                         SaveVendorData();
  2790.                         DestroyUI(player);
  2791.                         OpenMap(player);
  2792.                         return;
  2793.                     }
  2794.                     else
  2795.                     {
  2796.                         if (string.IsNullOrEmpty(name))
  2797.                             name= $"Delivery_{ vendors.DeliveryVendors.Count + 1}";
  2798.  
  2799.                         if (ActiveCreations.ContainsKey(player.userID))
  2800.                             ActiveCreations.Remove(player.userID);
  2801.                         pos.Name = name;
  2802.  
  2803.                         ActiveCreations.Add(player.userID, new QuestCreator
  2804.                         {
  2805.                             deliveryInfo = new DeliveryInfo
  2806.                             {
  2807.                                 Info = pos,
  2808.                                 Reward = new RewardItem()
  2809.                             },
  2810.                             partNum = 4,
  2811.                             type = QuestType.Delivery
  2812.                         });
  2813.                         DeliveryHelp(player, 2);
  2814.                     }
  2815.                 }
  2816.             }
  2817.             else SendMSG(player, LA("noNPC", player.UserIDString));
  2818.         }
  2819.         #endregion
  2820.  
  2821.         #region Data Management
  2822.         void SaveQuestData()
  2823.         {
  2824.             questData.Quest = Quest;
  2825.             Quest_Data.WriteObject(questData);
  2826.         }
  2827.         void SaveVendorData()
  2828.         {
  2829.             Quest_Vendors.WriteObject(vendors);
  2830.         }
  2831.         void SavePlayerData()
  2832.         {
  2833.             playerData.PlayerProgress = PlayerProgress;
  2834.             Player_Data.WriteObject(playerData);
  2835.         }
  2836.         void SaveDisplayNames()
  2837.         {
  2838.             itemNames.DisplayNames = DisplayNames;
  2839.             Item_Names.WriteObject(itemNames);
  2840.         }
  2841.         private void SaveLoop()
  2842.         {
  2843.             SavePlayerData();
  2844.             timer.Once(900, () => SaveLoop());
  2845.         }
  2846.         void LoadData()
  2847.         {
  2848.             try
  2849.             {
  2850.                 questData = Quest_Data.ReadObject<QuestData>();
  2851.                 Quest = questData.Quest;
  2852.             }
  2853.             catch
  2854.             {
  2855.                 Puts("Couldn't load quest data, creating new datafile");
  2856.                 questData = new QuestData();
  2857.             }
  2858.             try
  2859.             {
  2860.                 vendors = Quest_Vendors.ReadObject<NPCData>();
  2861.             }
  2862.             catch
  2863.             {
  2864.                 Puts("Couldn't load quest vendor data, creating new datafile");
  2865.                 vendors = new NPCData();
  2866.             }
  2867.             try
  2868.             {
  2869.                 playerData = Player_Data.ReadObject<PlayerData>();
  2870.                 PlayerProgress = playerData.PlayerProgress;
  2871.             }
  2872.             catch
  2873.             {
  2874.                 Puts("Couldn't load player data, creating new datafile");
  2875.                 playerData = new PlayerData();
  2876.                 PlayerProgress = new Dictionary<ulong, PlayerQuestData>();
  2877.             }
  2878.             try
  2879.             {
  2880.                 itemNames = Item_Names.ReadObject<ItemNames>();
  2881.             }
  2882.             catch
  2883.             {
  2884.                 Puts("Couldn't load item display name data, creating new datafile");
  2885.                 itemNames = new ItemNames();
  2886.             }
  2887.         }
  2888.         #endregion
  2889.  
  2890.         #region Data Storage
  2891.         class QuestData
  2892.         {
  2893.             public Dictionary<QuestType, Dictionary<string, QuestEntry>> Quest = new Dictionary<QuestType, Dictionary<string, QuestEntry>>
  2894.             {
  2895.                 {QuestType.Craft, new Dictionary<string, QuestEntry>() },
  2896.                 {QuestType.Delivery, new Dictionary<string, QuestEntry>() },
  2897.                 {QuestType.Gather, new Dictionary<string, QuestEntry>() },
  2898.                 {QuestType.Kill, new Dictionary<string, QuestEntry>() },
  2899.                 {QuestType.Loot, new Dictionary<string, QuestEntry>() }
  2900.             };
  2901.         }
  2902.         class PlayerData
  2903.         {
  2904.             public Dictionary<ulong, PlayerQuestData> PlayerProgress = new Dictionary<ulong, PlayerQuestData>();
  2905.         }
  2906.         class NPCData
  2907.         {
  2908.             public Dictionary<string, NPCInfo> QuestVendors = new Dictionary<string, NPCInfo>();
  2909.             public Dictionary<string, DeliveryInfo> DeliveryVendors = new Dictionary<string, DeliveryInfo>();
  2910.         }
  2911.         #endregion
  2912.  
  2913.         #region Config
  2914.         class UIColor
  2915.         {
  2916.             public string Color { get; set; }
  2917.             public float Alpha { get; set; }
  2918.         }
  2919.         class Colors
  2920.         {
  2921.             public string TextColor_Primary { get; set; }
  2922.             public string TextColor_Secondary { get; set; }
  2923.             public UIColor Background_Dark { get; set; }
  2924.             public UIColor Background_Light { get; set; }
  2925.             public UIColor Button_Standard { get; set; }
  2926.             public UIColor Button_Accept { get; set; }
  2927.             public UIColor Button_Completed { get; set; }
  2928.             public UIColor Button_Cancel { get; set; }
  2929.             public UIColor Button_Pending { get; set; }
  2930.         }
  2931.         class Keybinds
  2932.         {
  2933.             public bool Autoset_KeyBind { get; set; }
  2934.             public string KeyBind_Key { get; set; }
  2935.         }
  2936.         class LMIcons
  2937.         {
  2938.             public string Icon_Vendor { get; set; }
  2939.             public string Icon_Delivery { get; set; }
  2940.         }
  2941.         class ConfigData
  2942.         {
  2943.             public Colors Colors { get; set; }
  2944.             public Keybinds KeybindOptions { get; set; }
  2945.             public LMIcons LustyMapIntegration { get; set; }
  2946.             public bool DisableUI_FadeIn { get; set; }
  2947.             public bool UseNPCVendors { get; set; }
  2948.  
  2949.         }
  2950.         private void LoadVariables()
  2951.         {
  2952.             LoadConfigVariables();
  2953.             SaveConfig();
  2954.         }
  2955.         private void LoadConfigVariables()
  2956.         {
  2957.             configData = Config.ReadObject<ConfigData>();
  2958.         }
  2959.         protected override void LoadDefaultConfig()
  2960.         {
  2961.             Puts("Creating a new config file");
  2962.             ConfigData config = new ConfigData
  2963.             {
  2964.                 DisableUI_FadeIn = false,
  2965.  
  2966.                 UseNPCVendors = false,
  2967.                 Colors = new Colors
  2968.                 {
  2969.                     Background_Dark = new UIColor { Color = "#2a2a2a", Alpha = 0.98f },
  2970.                     Background_Light = new UIColor { Color = "#696969", Alpha = 0.3f },
  2971.                     Button_Accept = new UIColor { Color = "#00cd00", Alpha = 0.9f },
  2972.                     Button_Cancel = new UIColor { Color = "#8c1919", Alpha = 0.9f },
  2973.                     Button_Completed = new UIColor { Color = "#829db4", Alpha = 0.9f },
  2974.                     Button_Pending = new UIColor { Color = "#a8a8a8", Alpha = 0.9f },
  2975.                     Button_Standard = new UIColor { Color = "#2a2a2a", Alpha = 0.9f },
  2976.                     TextColor_Primary = "#ce422b",
  2977.                     TextColor_Secondary = "#939393"
  2978.                 },
  2979.                 LustyMapIntegration = new LMIcons
  2980.                 {
  2981.                     Icon_Delivery = "deliveryicon",
  2982.                     Icon_Vendor = "vendoricon"
  2983.                 },
  2984.                 KeybindOptions = new Keybinds
  2985.                 {
  2986.                     Autoset_KeyBind = false,
  2987.                     KeyBind_Key = "k"
  2988.                 }
  2989.             };
  2990.             SaveConfig(config);
  2991.         }
  2992.         void SaveConfig(ConfigData config)
  2993.         {
  2994.             Config.WriteObject(config, true);
  2995.         }
  2996.         #endregion
  2997.  
  2998.         #region Messaging
  2999.         void SendMSG(BasePlayer player, string message, string keyword = "")
  3000.         {
  3001.             message = $"{textSecondary}{message}</color>";
  3002.             if (!string.IsNullOrEmpty(keyword))
  3003.                 message = $"{textPrimary}{keyword}</color> {message}";
  3004.             SendReply(player, message);
  3005.         }
  3006.         Dictionary<string, string> Localization = new Dictionary<string, string>
  3007.         {
  3008.             { "Quests", "Quests:" },
  3009.             { "delInprog", "You already have a delivery mission in progress." },
  3010.             { "QC", "Quest Creator:" },
  3011.             { "noAItem", "Unable to find a active item. Place the item in your hands then type " },
  3012.             { "nameExists", "A quest with this name already exists" },
  3013.             { "objAmount", "You need to enter a objective amount" },
  3014.             { "OA", "Objective Amount:" },
  3015.             { "Desc", "Description:" },
  3016.             { "noRM", "You need to enter a reward multiplier" },
  3017.             { "RM", "Reward Multiplier:" },
  3018.             { "noRA", "You need to enter a reward amount" },
  3019.             { "RA", "Reward Amount:" },
  3020.             { "noCD", "You need to enter a cooldown amount" },
  3021.             { "CD1", "Cooldown Timer (minutes):" },
  3022.             { "qComple", "You have completed the quest" },
  3023.             { "claRew", "You can claim your reward from the quest menu." },
  3024.             { "qCancel", "You have cancelled this quest." },
  3025.             { "rewRet", "has been returned to you" },
  3026.             { "minDV", "Delivery missions require atleast 2 vendors. Add some more vendors to activate delivery missions" },
  3027.             { "DVSucc", "You have successfully added a new delivery vendor" },
  3028.             { "saveQ", "You have successfully saved the quest:" },
  3029.             { "QCCancel", "You have cancelled quest creation" },
  3030.             { "KillOBJ", "Kill quests require you to kill 'X' amount of the target objective" },
  3031.             { "CraftOBJ", "Crafting quests require you to craft 'X' amount of the objective item" },
  3032.             { "GatherOBJ", "Gather quests require you to gather 'X' amount of the objective from resources" },
  3033.             { "LootOBJ", "Loot quests require you to collect 'X' amount of the objective item from containers" },
  3034.             { "DelvOBJ", "Delivery quests require you to deliver a package from one vendor to another" },
  3035.             { "aQVReg", "This NPC is already a registered Quest vendor" },
  3036.             { "aDVReg", "This NPC is already a registed Delivery vendor" },
  3037.             { "Kill", "Kill" },
  3038.             { "Gather", "Gather" },
  3039.             { "Craft", "Craft" },
  3040.             { "Loot", "Loot" },
  3041.             { "Delivery", "Delivery" },
  3042.             { "Your Quests", "Your Quests" },
  3043.             { "Create Quest", "Create Quest" },
  3044.             { "Edit Quest", "Edit Quest" },
  3045.             { "Delete Quest", "Delete Quest" },
  3046.             { "Close", "Close" },
  3047.             { "Next", "Next" },
  3048.             { "Back", "Back" },
  3049.             { "noQ", "The are currently no" },
  3050.             { "quests", "quests" },
  3051.             { "Pending", "Pending" },
  3052.             { "Completed", "Completed" },
  3053.             { "Accept Quest", "Accept Quest" },
  3054.             { "Status:", "Status:" },
  3055.             { "Description:", "Description:" },
  3056.             { "Amount Required:", "Amount Required:" },
  3057.             { "Reward:", "Reward:" },
  3058.             { "yqDesc", "Check your current progress for each quest" },
  3059.             { "STATS", "STATS" },
  3060.             { "noQDSaved", "You don't have any quest data saved" },
  3061.             { "Cancel Quest", "Cancel Quest" },
  3062.             { "Claim Reward", "Claim Reward" },
  3063.             { "Remove", "Remove" },
  3064.             { "Cooldown", "Cooldown" },
  3065.             { "Collected:", "Collected:" },
  3066.             { "Reward Claimed:", "Reward Claimed:" },
  3067.             { "DELIVERY", "DELIVERY" },
  3068.             { "noADM", "You do not have a active delivery mission" },
  3069.             { "Destination:", "Destination:" },
  3070.             { "Distance:", "Distance:" },
  3071.             { "Cancel", "Cancel" },
  3072.             { "selCreat", "Select a quest type to begin creation" },
  3073.             { "CREATOR", "CREATOR" },
  3074.             { "creHelMen", "This is the quest creation help menu" },
  3075.             { "creHelFol", "Follow the instructions given by typing in chat" },
  3076.             { "creHelExi", "You can exit quest creation at any time by typing" },
  3077.             { "creHelName", "To proceed enter the name of your new quest!" },
  3078.             { "creHelObj", "Choose a quest objective from the list" },
  3079.             { "creHelRA", "Enter a required amount" },
  3080.             { "creHelQD", "Enter a quest description" },
  3081.             { "creHelRT", "Choose a reward type" },
  3082.             { "creHelNewRew", "Select a reward to remove, or add a new one" },
  3083.             { "Coins", "Coins" },
  3084.             { "RP", "RP" },
  3085.             { "HuntXP", "XP" },
  3086.             { "Item", "Item" },
  3087.             { "creHelRewA", "Enter a reward amount" },
  3088.             { "creHelIH", "Place the item you want to issue as a reward in your hands and type" },
  3089.             { "creHelAR", "Would you like to add additional rewards?" },
  3090.             { "Yes", "Yes" },
  3091.             { "No", "No" },
  3092.             { "creHelID", "Would you like to enable item deduction (take items from player when collected)?" },
  3093.             { "creHelCD", "Enter a cooldown time (in minutes)" },
  3094.             { "creHelSQ", "You have successfully created a new quest. To confirm click 'Save Quest'" },
  3095.             { "Save Quest", "Save Quest" },
  3096.             { "Name:", "Name:" },
  3097.             { "Objective:", "Objective:" },
  3098.             { "CDMin", "Cooldown (minutes):" },
  3099.             { "Quest Type:", "Quest Type:" },
  3100.             { "Required Amount:", "Required Amount:" },
  3101.             { "Item Deduction:", "Item Deduction:" },
  3102.             { "delHelMen", "Here you can add delivery missions and Quest vendors." },
  3103.             { "delHelChoo", "Choose either a Delivery vendor (delivery mission) or a Quest vendor (npc based quest menu)" },
  3104.             { "Quest Vendor", "Quest Vendor" },
  3105.             { "Delivery Vendor", "Delivery Vendor" },
  3106.             { "delHelNewNPC", "Stand infront of the NPC you wish to add and type" },
  3107.             { "delHelMult", "Delivery mission rewards are based on distance X a multiplier. Keep this in mind when selecting a reward." },
  3108.             { "delHelRM", "Enter a reward multiplier (per unit)." },
  3109.             { "delHelRM1", "For example, if a delivery is" },
  3110.             { "delHelRM2", "away, and the multiplier is" },
  3111.             { "delHelRM3", "the total reward amount would be" },
  3112.             { "delHelDD", "Enter a delivery description." },
  3113.             { "delHelNewV", "You have successfully added a new delivery vendor. To confirm click 'Save Quest'" },
  3114.             { "Accept", "Accept" },
  3115.             { "Decline", "Decline" },
  3116.             { "Claim", "Claim" },
  3117.             { "delComplMSG", "Thanks for making the delivery" },
  3118.             { "Delete NPC", "Delete NPC" },
  3119.             { "REMOVER", "REMOVER" },
  3120.             { "Delivery Vendors", "Delivery Vendors" },
  3121.             { "Quest Vendors", "Quest Vendors" },
  3122.             { "confDel", "Are you sure you want to delete:" },
  3123.             { "confCan", "Are you sure you want to cancel:" },
  3124.             { "confCan2", "Any progress you have made will be lost!" },
  3125.             { "EDITOR", "EDITOR" },
  3126.             { "chaEdi", "Select a value to change" },
  3127.             { "Name", "Name" },
  3128.             { "Description", "Description" },
  3129.             { "Objective", "Objective" },
  3130.             { "Amount", "Amount" },
  3131.             { "Reward", "Reward" },
  3132.             { "qAccep", "You have accepted the quest" },
  3133.             { "dAccep", "You have accepted the delivery mission" },
  3134.             { "canConf", "You have cancelled the delivery mission" },
  3135.             { "rewRec", "You have recieved" },
  3136.             { "rewError", "Unable to issue your reward. Please contact an administrator" },
  3137.             { "Quest NPCs:", "Quest NPCs:" },
  3138.             { "newVSucc", "You have successfully added a new Quest vendor" },
  3139.             { "noNPC", "Unable to find a valid NPC" },
  3140.             { "addNewRew", "Add Reward" },
  3141.             { "NoTP", "You cannot teleport while you are on a delivery mission" },
  3142.             { "noVendor", "To accept new Quests you must find a Quest Vendor" },
  3143.         };
  3144.         #endregion
  3145.     }
  3146. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement