C#:
using System;
using System.Collections.Generic;
using System.Linq;
using Newtonsoft.Json;
using Oxide.Core;
using Oxide.Core.Plugins;
using UnityEngine;
using Oxide.Game.Rust.Cui;
using Network;
using VLB;
namespace Oxide.Plugins {
[Info("CraftMenu", "David", "1.1.74")]
[Description("Simple craft menu for uncraftable items.")]
public class CraftMenu : RustPlugin {
int _bpsTotal = 0;
int _bpsDefault = 0;
string click = "assets/bundled/prefabs/fx/notice/item.select.fx.prefab";
string pageChange = "assets/bundled/prefabs/fx/notice/loot.copy.fx.prefab";
string research = "assets/prefabs/deployable/research table/effects/research-success.prefab";
string craft = "assets/bundled/prefabs/fx/notice/loot.start.fx.prefab";
string[] db;
string[] f;
string[] ca;
string[] ba;
string[] ia = {
"0.22 0.17", "0.78 0.83", "0.22 0.17", "0.78 0.83", "0.24 0.14", "0.76 0.82", "0.24 0.14", "0.76 0.82", "0.24 0.14", "0.76 0.82"
}
;
private void OnServerInitialized() {
LoadConfig();
LoadData();
LoadPlayerData();
LoadNamesData();
DownloadImages();
//ImageQueCheck();
ConsoleSystem.Run(ConsoleSystem.Option.Server.Quiet(), "server.uselegacyworkbenchinteraction true");
if (config.main.perms == false) {
config.main.perms = false;
SaveConfig();
}
if (config.ct == null) {
Puts($"\n*******************************************************************\nConfig update is required. Make backup of your old one, delete it from config folder and reload plugin again.\n*******************************************************************");
Interface.Oxide.UnloadPlugin("CraftMenu");
return;
}
RegisterPerms();
permission.RegisterPermission($"craftmenu.use", this);
_bpsTotal = bps.Count();
foreach (string bp in bps.Keys) {
if (bps[bp].ResearchCost == 0) _bpsDefault++;
}
AddMonoComponent();
}
void Unload() {
foreach (var _player in BasePlayer.activePlayerList) DestroyCui(_player);
ConsoleSystem.Run(ConsoleSystem.Option.Server.Quiet(), "server.uselegacyworkbenchinteraction false");
DestroyMonoComponent();
}
void OnNewSave() {
if (config.main.wipe) {
PrintWarning("New save detected, Wiping Player Blueprints....");
playerBps = new Dictionary<ulong, PlayerBps>();
PrintWarning("Player Blueprints Wiped.");
}
SavePlayerData();
}
void OnPlayerDisconnected(BasePlayer player) {
if (!config.ct.craftQue) return;
var run = player.GetComponent<CraftingQue>();
if (run == null) return;
else run.CancelAll(player);
UnityEngine.Object.Destroy(run);
}
void OnPlayerConnected(BasePlayer player) {
if (config.ct.craftQue) player.gameObject.GetOrAddComponent<CraftingQue>();
}
void OnEntityDeath(BasePlayer player, HitInfo info) {
if (player == null) return;
if (!config.ct.craftQue) return;
var run = player.GetComponent<CraftingQue>();
if (run == null) return;
else run.CancelAll(player);
}
private void OnLootEntity(BasePlayer player, Workbench bench) {
if (!permission.UserHasPermission(player.UserIDString, "craftmenu.use")) return;
if (!config.ct.craftQue) player.gameObject.GetOrAddComponent<CraftingQue>();
if (!playerBps.ContainsKey(player.userID)) {
playerBps.Add(player.userID, new PlayerBps());
SavePlayerData();
}
if (bench.PrefabName.Contains("1")) {
CreateBaseCui(player, 1);
ShowBps(player, 1, "all");
}
if (bench.PrefabName.Contains("2")) {
CreateBaseCui(player, 2);
ShowBps(player, 2, "all");
}
if (bench.PrefabName.Contains("3")) {
CreateBaseCui(player, 3);
ShowBps(player, 3, "all");
}
}
private void OnLootEntityEnd(BasePlayer player, Workbench bench) {
DestroyCui(player);
}
private void GetDefaultImages() {
db = "{\"file\":{\"file_id\":\"525\",\"file_name\":\"s\",\"file_image\":{\"name\":\"'5'0'2'93'4'250'573'7'8'0'620'1'0.6'92'0'4'1'39'0'49'2'59'0'8'1'19'7'9'4'1'3'82'0'59'2'4'7'.gif\",\"url\":\"https:\\/\\/codefling.com\\/uploads\\/monthly_2022_02\\/1528951962_50293425057378062010.69204139049259081197941382059247.gif.cafa79ad4e60c4e0ff86b58a358b3fa4.gif\",\"size\":\"2211771\"},\"file_version\":\"3.0.2\",\"file_author\":\"s\",\"file_price\":\"$s\"}}".Split('\'');
ca = new string[] {
$"{db[23]}.{db[19]}{db[12]} {db[10]}", $"{db[19]}.{db[19]}{db[27]}5 {db[17]}", $"{db[33]}.{db[2]}{db[28]} {db[33]}", $"{db[19]}.{db[12]}9 {db[17]}", $"{db[15]}.{db[12]}{db[28]} {db[2]}", $"{db[15]}.{db[3]}{db[28]} {db[30]}", $"{db[19]}.{db[21]}9 {db[2]}", $"{db[23]}.{db[18]} {db[25]}", $"{db[2]}.{db[18]} {db[19]}", $"{db[2]}.{db[20]} {db[25]}", $"{db[23]}.{db[20]} {db[19]}", $"{db[33]}.{db[22]} {db[17]}", $"{db[15]}.{db[22]} {db[2]}", $"{db[13]}{db[28]} {db[30]}"
}
;
ba = new string[] {
$"{db[24]}.{db[27]} {db[18]}", $"{db[15]}.{db[23]} {db[2]}.{db[9]}{db[1]}", $"{db[12]} {db[12]}", $"{db[23]}.{db[2]} {db[13]}{db[28]}", $"{db[30]} {db[2]}.{db[24]}{db[29]}", $"{db[33]}.{db[23]} {db[15]}.{db[1]}{db[31]}", $"{db[12]} {db[13]}{db[9]}", $"{db[15]}.{db[2]} {db[33]}.{db[31]}6", $"{db[17]} {db[2]}.{db[1]}{db[3]}", $"{db[23]}.{db[33]} {db[2]}.{db[3]}", $"{db[30]} {db[2]}.{db[31]}{db[1]}", $"{db[2]}.{db[23]} {db[2]}.{db[2]}{db[5]}", $"{db[17]} {db[23]}.{db[17]}{db[28]}"
}
;
f = new string[] {
"1 1 1 0.6", "1 1 1 0.4"
}
;
}
private void RegisterPerms() {
if (config.main.perms) {
foreach (string item in config.main.cat.Keys) permission.RegisterPermission($"craftmenu.{item}", this);
}
}
[ConsoleCommand("craftmenu_admin")]
private void craftmenu_admin(ConsoleSystem.Arg arg) {
var player = arg?.Player();
var args = arg.Args;
if (arg.Player() != null) {
if (!player.IsAdmin) return;
}
if (args[0] == "wipe") {
if (args.Length > 1) {
if (!playerBps.ContainsKey(Convert.ToUInt64(args[1]))) {
Puts($"Player {args[1]} have no blueprints to wipe.");
return;
}
playerBps.Remove(Convert.ToUInt64(args[1]));
Puts($"BPs for player {args[1]} wiped.");
return;
}
Puts($"Blueprints has been wiped.");
playerBps.Clear();
SavePlayerData();
return;
}
}
[ConsoleCommand("craftmenu_cmd")]
private void craftmenu_cmd(ConsoleSystem.Arg arg) {
var player = arg?.Player();
var args = arg.Args;
if (arg.Player() == null) return;
if (args == null) return;
if (args[0] == "select") {
CreateBp(player, Convert.ToInt32(args[1]), args[2], Convert.ToInt32(args[3]), true);
PlayFx(player, click);
return;
}
if (args[0] == "category") {
ShowBps(player, Convert.ToInt32(args[2]), args[1]);
PlayFx(player, pageChange);
return;
}
if (args[0] == "pageup") {
if (Convert.ToInt32(args[3]) < 0) return;
ShowBps(player, Convert.ToInt32(args[2]), args[1], Convert.ToInt32(args[3]));
PlayFx(player, pageChange);
return;
}
if (args[0] == "pagedown") {
ShowBps(player, Convert.ToInt32(args[2]), args[1], Convert.ToInt32(args[3]));
PlayFx(player, pageChange);
return;
}
if (args[0] == "craft") {
CraftItem(player, Convert.ToInt32(args[1]), args[2], Convert.ToInt32(args[3]));
return;
}
if (args[0] == "research") {
ResearchItem(player, Convert.ToInt32(args[1]), args[2], Convert.ToInt32(args[3]));
return;
}
}
private List<string> CreateBpOrder(BasePlayer player, int tier, string category) {
List<string> bpOrder = new List<string>();
List<string> lockedBps = new List<string>();
foreach (string item in bps.Keys) {
if (category == "all") {
if (playerBps[player.userID].bp.Contains(item)) {
if (bps[item].Tier <= tier) {
bpOrder.Insert(0, item);
}
else {
bpOrder.Add(item);
}
continue;
}
else {
lockedBps.Add(item);
continue;
}
}
if (bps[item].Category == category) {
if (playerBps[player.userID].bp.Contains(item)) {
if (bps[item].Tier <= tier) {
bpOrder.Insert(0, item);
}
else {
bpOrder.Add(item);
}
}
else {
lockedBps.Add(item);
continue;
}
}
}
foreach (string item in lockedBps) {
bpOrder.Add(item);
}
bpOrder.Insert(0, "null");
return bpOrder;
}
private bool CheckInv(BasePlayer player, string shortName, int amount) {
var itemDef = ItemManager.FindItemDefinition(shortName);
if (itemDef == null) return false;
int invAmount = player.inventory.GetAmount(itemDef.itemid);
if (invAmount < amount) return false;
return true;
}
bool IsSkinID(string str) {
foreach (char c in str) {
if (c < '0' || c > '9') return false;
}
return true;
}
private int ItemAmount_Skin(ItemContainer container, ulong? skin) {
var items = Facepunch.Pool.Get<List<Item>>();
items.AddRange(container.itemList.Where(x => x.skin == skin.Value));
var currentAmount = items.Sum(x => x.amount);
Facepunch.Pool.FreeUnmanaged(ref items);
return currentAmount;
}
private void TakeItems_Skin(int amount, ItemContainer container, ulong? skin) {
if (amount == 0 || skin == 0) return;
var items = Facepunch.Pool.Get<List<Item>>();
items.AddRange(container.itemList.Where(x => x.skin == skin.Value));
var amountLeft = amount;
foreach (var item in items) {
if (amountLeft <= 0) break;
var oldItemAmount = item.amount;
if (amountLeft >= item.amount) item.Remove();
else item.amount -= amountLeft;
amountLeft -= oldItemAmount;
}
Facepunch.Pool.FreeUnmanaged(ref items);
}
private bool _CanCraft(BasePlayer player, string shortName) {
foreach (string item in bps[shortName].Resources.Keys) {
if (IsSkinID(item)) {
if (_GetAmount(player, Convert.ToUInt64(item)) < bps[shortName].Resources[item]) return false;
/* if (ItemAmount_Skin(player.inventory.containerBelt, Convert.ToUInt64(item)) +
ItemAmount_Skin(player.inventory.containerMain, Convert.ToUInt64(item)) < bps[shortName].Resources[item])
return false; */
}
else {
var itemDef = ItemManager.FindItemDefinition(item);
int invAmount = player.inventory.GetAmount(itemDef.itemid);
if (invAmount < bps[shortName].Resources[item]) return false;
}
}
return true;
}
private void CraftItem(BasePlayer player, int tier, string shortName, int index) {
string _shortname = shortName;
if (shortName.Contains("{")) {
int charsToRemove = shortName.Length - shortName.IndexOf("{");
_shortname = shortName.Remove(shortName.Length - charsToRemove);
}
if (shortName.Contains("militaryflamethrower")) {
_shortname = shortName.Replace("militaryflamethrower", "military flamethrower");
}
if (!_CanCraft(player, shortName)) {
CreateBp(player, tier, shortName, index, true);
PlayFx(player, click);
return;
}
else {
foreach (string _item in bps[shortName].Resources.Keys) {
if (IsSkinID(_item)) {
/* ulong skin = Convert.ToUInt64(_item);
int amount = bps[shortName].Resources[_item]; */
/* int belt = ItemAmount_Skin(player.inventory.containerBelt, skin);
int main = ItemAmount_Skin(player.inventory.containerMain, skin); */
if (!TakeFromInventory(player, bps[shortName].Resources[_item], Convert.ToUInt64(_item))) return;
/* if (belt + main >= amount)
{
if (main >= amount)
{
main = amount;
TakeItems_Skin(main, player.inventory.containerMain, skin);
return;
}
TakeItems_Skin(main, player.inventory.containerMain, skin);
amount -= main;
TakeItems_Skin(amount, player.inventory.containerBelt, skin);
} */
}
else {
var itemDef = ItemManager.FindItemDefinition(_item);
if (itemDef == null) {
SendReply(player, $" <color=#C2291D>!</color> '{_item}' <color=#C2291D>is not correct shortname.</color>");
return;
}
player.inventory.Take(null, itemDef.itemid, bps[shortName].Resources[_item]);
}
}
var item = ItemManager.CreateByName(_shortname, 1, bps[shortName].SkinID);
if (item != null) {
if (config.ct.craftQue) {
var run = player.GetComponent<CraftingQue>();
if (run != null) run.AddToQue(player, shortName);
else RefundItem(player, shortName);
PlayFx(player, craft);
}
else {
item.name = bps[shortName].Name;
player.GiveItem(item);
CreateBp(player, tier, shortName, index, true);
PlayFx(player, craft);
return;
}
}
else {
SendReply(player, $" <color=#C2291D>!</color> '{item}' <color=#C2291D>is not correct shortname.</color>");
return;
}
}
}
private void ResearchItem(BasePlayer player, int tier, string shortName, int index) {
if (!CheckInv(player, "scrap", bps[shortName].ResearchCost)) {
CreateBp(player, tier, shortName, index, true);
PlayFx(player, click);
return;
}
else {
var itemDef = ItemManager.FindItemDefinition("scrap");
if (itemDef == null) {
SendReply(player, $" <color=#C2291D>!</color> Error, please contact developer.</color>");
return;
}
player.inventory.Take(null, itemDef.itemid, bps[shortName].ResearchCost);
playerBps[player.userID].bp.Add(shortName);
SavePlayerData();
CreateBp(player, tier, shortName, index, true);
PlayFx(player, research);
}
}
private void RefundItem(BasePlayer player, string shortName) {
foreach (string item in bps[shortName].Resources.Keys) {
var _item = ItemManager.CreateByName($"{item}", bps[shortName].Resources[item]);
player.GiveItem(_item);
}
}
private void CreateItemMono(BasePlayer player, string shortName) {
string _shortname = shortName;
if (shortName.Contains("{")) {
int charsToRemove = shortName.Length - shortName.IndexOf("{");
_shortname = shortName.Remove(shortName.Length - charsToRemove);
}
var item = ItemManager.CreateByName(_shortname, 1, bps[shortName].SkinID);
if (item != null) {
item.name = bps[shortName].Name;
player.GiveItem(item);
}
}
private bool TakeFromInventory(BasePlayer player, int amount, ulong skinid) {
if (player == null) return false;
if (_GetAmount(player, skinid) < amount) return false;
if (RemoveItem(player, amount, skinid)) return true;
return false;
}
private int _GetAmount(BasePlayer player, ulong skin) {
var items = Facepunch.Pool.Get<List<Item>>();
items.AddRange(player.inventory.containerBelt.itemList .Where(item => item.skin == skin));
items.AddRange(player.inventory.containerMain.itemList .Where(item => item.skin == skin));
var currentAmount = items.Sum(x => x.amount);
Facepunch.Pool.FreeUnmanaged(ref items);
return currentAmount;
}
private bool RemoveItem(BasePlayer player, int amount, ulong? skin) {
if (amount == 0) return false;
var items = Facepunch.Pool.Get<List<Item>>();
try {
items.AddRange(player.inventory.containerBelt.itemList .Where(item => item.skin == skin));
items.AddRange(player.inventory.containerMain.itemList .Where(item => item.skin == skin));
var amountLeft = amount;
foreach (var item in items) {
if (amountLeft <= 0) break;
item.MarkDirty();
var oldItemAmount = item.amount;
if (amountLeft >= item.amount) {
item.MarkDirty();
item.Remove();
}
else item.amount -= amountLeft;
amountLeft -= oldItemAmount;
}
}
catch {
SendReply(player, "Something failed while taking items, please let server admin know about it.");
Puts($"Something failed while taking items from {player} -> (shortname: null/amount:{amount}/skin:{skin})");
return false;
}
Facepunch.Pool.FreeUnmanaged(ref items);
return true;
}
[ConsoleCommand("craftmenu_cancel")]
private void craftmenu_cancel(ConsoleSystem.Arg arg) {
var player = arg?.Player();
if (arg.Player() == null) return;
var args = arg.Args;
if (args[0] == null) return;
int index = Convert.ToInt32(args[0]);
var run = player.GetComponent<CraftingQue>();
if (run == null) player.gameObject.GetOrAddComponent<CraftingQue>();
if (run != null) {
run.CancelCraft(player, index);
}
}
[ConsoleCommand("craftmenu_addtoque")]
private void craftmenu_addtoque(ConsoleSystem.Arg arg) {
var player = arg?.Player();
if (arg.Player() == null) return;
if (!player.IsAdmin) return;
var args = arg.Args;
if (args[0] == null) return;
var run = player.GetComponent<CraftingQue>();
if (run == null) player.gameObject.GetOrAddComponent<CraftingQue>();
if (run != null) run.AddToQue(player, args[0]);
}
[ConsoleCommand("craftmenu_openquepanel")]
private void craftmenu_openquepanel(ConsoleSystem.Arg arg) {
var player = arg?.Player();
if (arg.Player() == null) return;
var run = player.GetComponent<CraftingQue>();
if (run == null) player.gameObject.GetOrAddComponent<CraftingQue>();
if (run != null) run.OpenQuePanel(player);
}
private void PlayFx(BasePlayer player, string fx) {
if (!config.main.fx) return;
if (player == null) return;
var EffectInstance = new Effect();
EffectInstance.Init(Effect.Type.Generic, player, 0, Vector3.up, Vector3.zero);
EffectInstance.pooledstringid = StringPool.Get(fx);
NetWrite netWrite = Net.sv.StartWrite();
netWrite.PacketID(Message.Type.Effect);
EffectInstance.WriteToStream(netWrite);
netWrite.Send(new SendInfo(player.net.connection));
EffectInstance.Clear();
}
static CraftMenu plugin;
private void Init() => plugin = this;
private void AddMonoComponent() {
foreach (var _player in BasePlayer.activePlayerList) _player.gameObject.GetOrAddComponent<CraftingQue>();
}
private void DestroyMonoComponent() {
foreach (var _player in BasePlayer.activePlayerList) {
var run = _player.GetComponent<CraftingQue>();
if (run == null) return;
else run.CancelAll(_player);
UnityEngine.Object.Destroy(run);
}
}
private class CraftingQue : MonoBehaviour {
BasePlayer player;
List<string> craftOrder = new List<string>();
bool craftPanelOpen = false;
int progress;
void Awake() => player = GetComponent<BasePlayer>();
public void CancelAll(BasePlayer player) {
if (craftOrder.Count != 0) {
foreach (string item in craftOrder) {
plugin.RefundItem(player, item);
}
CuiHelper.DestroyUi(player, "ql_base");
CancelInvoke(nameof(CraftProgress));
}
craftOrder.Clear();
}
public void OpenQuePanel(BasePlayer player) {
if (!craftPanelOpen) {
plugin.CreateQuePanel(player, craftOrder);
craftPanelOpen = true;
}
else {
CuiHelper.DestroyUi(player, "qPanel_panel");
craftPanelOpen = false;
}
}
public void CancelCraft(BasePlayer player, int index) {
plugin.RefundItem(player, craftOrder[index]);
craftOrder.RemoveAt(index);
plugin.CreateQueButton(player, craftOrder.Count);
if (craftOrder.Count <= 0) {
CuiHelper.DestroyUi(player, "ql_base");
CancelInvoke(nameof(CraftProgress));
}
else {
if (craftPanelOpen) plugin.CreateQuePanel(player, craftOrder);
if (craftOrder.Count <= 1) {
CuiHelper.DestroyUi(player, "qPanel_panel");
}
if (index == 0) {
CancelInvoke(nameof(CraftProgress));
if (plugin.config.ct.excp.ContainsKey(craftOrder[0])) progress = plugin.config.ct.excp[craftOrder[0]];
else progress = plugin.config.ct.defaultTime;
InvokeRepeating(nameof(CraftProgress), 1f, 1f);
}
}
}
void CraftProgress() {
progress -= 1;
plugin.CreateTimer(player, craftOrder[0], progress);
if (progress <= 0) {
plugin.CreateItemMono(player, craftOrder[0]);
craftOrder.RemoveAt(0);
int itemsLeft = craftOrder.Count();
if (itemsLeft <= 1) {
CuiHelper.DestroyUi(player, "ql_base_quetext_btn");
CuiHelper.DestroyUi(player, "qPanel_panel");
}
else {
plugin.CreateQueButton(player, itemsLeft);
if (craftPanelOpen) plugin.CreateQuePanel(player, craftOrder);
}
if (itemsLeft <= 0) {
CancelInvoke(nameof(CraftProgress));
CuiHelper.DestroyUi(player, "ql_base");
}
else {
CuiHelper.DestroyUi(player, "qTimer");
CuiHelper.DestroyUi(player, "qTimerName");
if (plugin.config.ct.excp.ContainsKey(craftOrder[0])) progress = plugin.config.ct.excp[craftOrder[0]];
else progress = plugin.config.ct.defaultTime;
}
}
}
public void AddToQue(BasePlayer player, string itemName) {
if (player == null) return;
if (craftOrder == null) {
//s
}
craftOrder.Add(itemName);
if (IsInvoking(nameof(CraftProgress)) == false) {
if (plugin.config.ct.excp.ContainsKey(craftOrder[0])) progress = plugin.config.ct.excp[craftOrder[0]];
else progress = plugin.config.ct.defaultTime;
InvokeRepeating(nameof(CraftProgress), 0.1f, 1f);
plugin.CreateCraftQueLayout(player);
}
if (craftOrder.Count > 1) {
plugin.CreateQueButton(player, craftOrder.Count);
if (craftPanelOpen) plugin.CreateQuePanel(player, craftOrder);
}
}
}
private void CreateBaseCui(BasePlayer player, int tier = 1) {
var _baseCraftCui = CUIClass.CreateOverlay("empty", "0 0 0 0", "0 0", "0 0", false, 0.0f, "assets/icons/iconmaterial.mat");
//assets/content/ui/uibackgroundblur.mat
CUIClass.CreatePanel(ref _baseCraftCui, "baseCraft_main", "Overlay", "0 0 0 0", $"{db[2]}.{db[1]} 0.{db[23]}", $"{db[10]}.{db[1]} 0.{db[10]}", false, 0.1f, 0f, "assets/icons/iconmaterial.mat", $"{db[12]}{db[14]} {db[6]}", $"{db[7]} {db[11]}");
CUIClass.CreateText(ref _baseCraftCui, "baseCraft_title_text", "baseCraft_main", f[0], $"<size=21><b>BLUEPRINTS</b></size>", 12, "0.00 1", "1 1.2", TextAnchor.LowerLeft, $"robotocondensed-regular.ttf", 0.1f);
CUIClass.CreateText(ref _baseCraftCui, "baseCraft_title_count", "baseCraft_main", f[0], $"UNLOCKED {playerBps[player.userID].bp.Count() + _bpsDefault}/{_bpsTotal}", 12, "0.00 1.01", "0.99 1.2", TextAnchor.LowerRight, $"robotocondensed-regular.ttf", 0.1f);
CUIClass.CreatePanel(ref _baseCraftCui, "baseCraft_category_panel", "baseCraft_main", "0.70 0.67 0.65 0.17", "0.0 0.93", "1 1", true, 0.1f, 0f, "assets/content/ui/uibackgroundblur.mat");
CUIClass.CreateButton(ref _baseCraftCui, "baseCraft_category_btnAll", "baseCraft_category_panel", "0.70 0.67 0.65 0.0", "", 11, ca[0], ca[1], $"craftmenu_cmd category all {tier}", "", "1 1 1 0.7", 0.1f, TextAnchor.MiddleCenter, $"robotocondensed-bold.ttf", "assets/icons/iconmaterial.mat");
CUIClass.PullFromAssets(ref _baseCraftCui, "bc_ci_all", "baseCraft_category_btnAll", "1 1 1 0.5", "assets/icons/community_servers.png", 0.1f, 0f, "0.1 0.15", "0.96 0.83");
int index = 1;
foreach (string category in config.main.cat.Keys) {
int a1 = 0 + index;
int a2 = 1 + index;
if (index == 1) {
a1 = 2;
a2 = 3;
}
if (index == 2) {
a1 = 4;
a2 = 5;
}
if (index == 3) {
a1 = 6;
a2 = 7;
}
if (index == 4) {
a1 = 8;
a2 = 9;
}
if (index == 5) {
a1 = 10;
a2 = 11;
}
if (index == 6) {
a1 = 12;
a2 = 13;
}
CUIClass.CreateButton(ref _baseCraftCui, $"baseCraft_category_btn{index}", "baseCraft_category_panel", "0.70 0.67 0.65 0.0", "", 11, ca[a1], ca[a2], $"craftmenu_cmd category {category} {tier}", "", "1 1 1 0.7", 0.1f, TextAnchor.MiddleCenter, $"robotocondensed-bold.ttf", "assets/icons/iconmaterial.mat");
if (config.main.cat[category].StartsWith("assets")) {
int b1 = 0;
int b2 = 1;
if (config.main.cat[category] == "assets/icons/construction.png") {
b1 = 2;
b2 = 3;
}
if (config.main.cat[category] == "assets/icons/clothing.png") {
b1 = 4;
b2 = 5;
}
if (config.main.cat[category] == "assets/icons/bullet.png") {
b1 = 6;
b2 = 7;
}
if (config.main.cat[category] == "assets/icons/medical.png") {
b1 = 8;
b2 = 9;
}
CUIClass.PullFromAssets(ref _baseCraftCui, $"category_btn_asset{index}", $"baseCraft_category_btn{index}", f[1], config.main.cat[category], 0.1f, 0f, ia[b1], ia[b2]);
}
else CUIClass.CreateImage(ref _baseCraftCui, $"category_btn_asset{index}", $"baseCraft_category_btn{index}", Img($"{config.main.cat[category]}"), "0 0", "1 1", 0.1f);
index++;
}
CUIClass.CreatePanel(ref _baseCraftCui, "baseCraft_blueprints_panel", "baseCraft_main", "0.70 0.67 0.65 0.0", "0.0 0.0", "1 0.92", false, 0.1f, 0f, "assets/icons/iconmaterial.mat");
DestroyCui(player);
CuiHelper.AddUi(player, _baseCraftCui);
CuiHelper.DestroyUi(player, "empty");
}
private void DestroyCui(BasePlayer player) {
CuiHelper.DestroyUi(player, "empty");
CuiHelper.DestroyUi(player, "baseCraft_main");
}
private void CreatePageBtns(BasePlayer player, string category, int tier, int currentPage) {
var _pageBtns = CUIClass.CreateOverlay("empty", "0 0 0 0", "0 0", "0 0", false, 0.0f, "assets/icons/iconmaterial.mat");
//assets/content/ui/uibackgroundblur.mat
int pageup = currentPage - 1;
int pagedown = 1 + currentPage;
CUIClass.CreateButton(ref _pageBtns, "craft_page_up", "baseCraft_category_panel", "0.80 0.25 0.16 0.0", "▲", 11, "0.86 0.16", $"0.89 0.84", $"craftmenu_cmd pageup {category} {tier} {pageup}", "", f[1], 0.1f, TextAnchor.MiddleCenter, $"robotocondensed-bold.ttf", "assets/icons/iconmaterial.mat");
CUIClass.CreateButton(ref _pageBtns, "craft_page_down", "baseCraft_category_panel", "0.80 0.25 0.16 0.0", "▼", 11, "0.89 0.16", $"0.94 0.84", $"craftmenu_cmd pageup {category} {tier} {pagedown}", "", f[1], 0.1f, TextAnchor.MiddleCenter, $"robotocondensed-bold.ttf", "assets/icons/iconmaterial.mat");
CUIClass.CreateText(ref _pageBtns, "bp_page_count", "baseCraft_category_panel", f[1], $"{currentPage + 1}", 11, "0.94 0.0", "0.98 1", TextAnchor.MiddleCenter, $"robotocondensed-regular.ttf", 0.1f);
CuiHelper.DestroyUi(player, "craft_page_up");
CuiHelper.DestroyUi(player, "craft_page_down");
CuiHelper.DestroyUi(player, "bp_page_count");
CuiHelper.AddUi(player, _pageBtns);
CuiHelper.DestroyUi(player, "empty");
}
private void ShowBps(BasePlayer player, int tier, string category, int page = 0) {
List<string> bpOrder = CreateBpOrder(player, tier, category);
int index = 6 * page;
for (int i = 1; i < 7; i++) CuiHelper.DestroyUi(player, $"baseCraft_bp_{i}");
int totalItems = bpOrder.Count() - 1;
for (int i = 1; i < 7; i++) {
if (totalItems < index + i) break;
CreateBp(player, tier, bpOrder[index + i], i);
}
if (bpOrder.Count() > 7) CreatePageBtns(player, category, tier, page);
else {
CuiHelper.DestroyUi(player, "craft_page_up");
CuiHelper.DestroyUi(player, "craft_page_down");
CuiHelper.DestroyUi(player, "bp_page_count");
}
}
private void CreateBp(BasePlayer player, int tier, string shortName, int index, bool selected = false) {
string bpUi = $"baseCraft_bp_{index}";
string anchorMin = ba[1];
string anchorMax = ba[2];
if (index == 2) {
anchorMin = ba[3];
anchorMax = ba[4];
}
if (index == 3) {
anchorMin = ba[5];
anchorMax = ba[6];
}
if (index == 4) {
anchorMin = ba[7];
anchorMax = ba[8];
}
if (index == 5) {
anchorMin = ba[9];
anchorMax = ba[10];
}
if (index == 6) {
anchorMin = ba[11];
anchorMax = ba[12];
}
string img = $"{bps[shortName].Image}";
if (!img.StartsWith("http")) img = shortName;
string resource = "";
foreach (string item in bps[shortName].Resources.Keys) {
string itemDisplayName = "";
var itemDef = ItemManager.FindItemDefinition(item);
if (itemDef != null) {
itemDisplayName = itemDef.displayName.translated;
}
if (nameReplace.ContainsKey(item)) itemDisplayName = nameReplace[item];
if (IsSkinID(item)) {
if (ItemAmount_Skin(player.inventory.containerBelt, Convert.ToUInt64(item)) + ItemAmount_Skin(player.inventory.containerMain, Convert.ToUInt64(item)) < bps[shortName].Resources[item]) resource = resource + $"<color=#d0b255>{bps[shortName].Resources[item]} {itemDisplayName}</color>, ";
else resource = resource + $"{bps[shortName].Resources[item]} {itemDisplayName}, ";
}
else {
if (CheckInv(player, item, bps[shortName].Resources[item])) resource = resource + $"{bps[shortName].Resources[item]} {itemDisplayName}, ";
else resource = resource + $"<color=#d0b255>{bps[shortName].Resources[item]} {itemDisplayName}</color>, ";
}
}
resource = resource.Remove(resource.Length - 2);
var _createBps = CUIClass.CreateOverlay("empty", "0 0 0 0", "0 0", "0 0", false, 0.0f, "assets/icons/iconmaterial.mat");
//assets/content/ui/uibackgroundblur.mat
if (selected) {
if (bps[shortName].Tier > tier) {
if (config.main.perms && !permission.UserHasPermission(player.UserIDString, $"craftmenu.{bps[shortName].Category}")) {
CUIClass.CreateText(ref _createBps, "selected_btn", bpUi, "1 1 1 0.25", $"<size=10>YOU CAN'T CRAFT THIS ITEM</size>", 12, "0.8 0.19", $"0.98 0.83", TextAnchor.MiddleCenter, $"robotocondensed-regular.ttf", 0.1f);
}
else {
CUIClass.CreateText(ref _createBps, "selected_btn", bpUi, "1 1 1 0.25", $"<b><size=15>TIER {bps[shortName].Tier}</size></b>\nREQUIRED", 12, "0.8 0.19", $"0.98 0.83", TextAnchor.MiddleCenter, $"robotocondensed-regular.ttf", 0.1f);
}
}
else {
if (bps[shortName].ResearchCost != 0) {
if (playerBps[player.userID].bp.Contains(shortName)) {
if (config.main.perms && !permission.UserHasPermission(player.UserIDString, $"craftmenu.{bps[shortName].Category}")) {
CUIClass.CreateText(ref _createBps, "selected_btn", bpUi, "1 1 1 0.25", $"<size=10>YOU CAN'T CRAFT THIS ITEM</size>", 12, "0.8 0.19", $"0.98 0.83", TextAnchor.MiddleCenter, $"robotocondensed-regular.ttf", 0.1f);
}
else {
if (_CanCraft(player, shortName)) {
CUIClass.CreateButton(ref _createBps, "selected_btn", bpUi, "0.38 0.51 0.16 0.85", " CRAFT", 11, "0.8 0.19", $"0.98 0.83", $"craftmenu_cmd craft {tier} {shortName} {index}", "", f[0], 0.1f, TextAnchor.MiddleCenter, $"robotocondensed-bold.ttf", "assets/content/ui/uibackgroundblur.mat");
CUIClass.PullFromAssets(ref _createBps, "bp_craftBtn_icon", "selected_btn", "1 1 1 0.65", "assets/icons/tools.png", 0.1f, 0f, "0.14 0.34", "0.32 0.67");
}
else {
CUIClass.CreateButton(ref _createBps, "selected_btn", bpUi, "0.70 0.67 0.65 0.17", "NOT ENOUGH\nRESOURCES", 11, "0.8 0.19", $"0.98 0.83", $"", "", f[1], 0.1f, TextAnchor.MiddleCenter, $"robotocondensed-bold.ttf", "assets/content/ui/uibackgroundblur.mat");
}
}
}
else {
if (config.main.perms && !permission.UserHasPermission(player.UserIDString, $"craftmenu.{bps[shortName].Category}")) {
CUIClass.CreateText(ref _createBps, "selected_btn", bpUi, "1 1 1 0.25", $"<size=10>YOU CAN'T CRAFT THIS ITEM</size>", 12, "0.8 0.19", $"0.98 0.83", TextAnchor.MiddleCenter, $"robotocondensed-regular.ttf", 0.1f);
}
else {
CUIClass.CreateButton(ref _createBps, "selected_btn", bpUi, "0.70 0.67 0.65 0.17", "RESEARCH\n", 11, "0.8 0.19", $"0.98 0.83", $"craftmenu_cmd research {tier} {shortName} {index}", "", f[0], 0.1f, TextAnchor.MiddleCenter, $"robotocondensed-regular.ttf", "assets/content/ui/uibackgroundblur.mat");
//CUIClass.CreateImage(ref _createBps, "btn_research_scrapImg", "selected_btn", Img("https://rustlabs.com/img/items180/scrap.png"), "0.16 0.12", "0.43 0.48", 0.1f);
CUIClass.GameIcon(ref _createBps, "btn_research_scrapImg", "selected_btn", -932201673, 0, 0f, 0f, "0.16 0.12", "0.43 0.48");
CUIClass.CreateText(ref _createBps, "btn_research_cost", "selected_btn", f[1], $"{bps[shortName].ResearchCost}", 12, "0.3 0", "0.80 0.5", TextAnchor.UpperRight, $"robotocondensed-bold.ttf", 0.1f);
}
}
}
else {
if (config.main.perms && !permission.UserHasPermission(player.UserIDString, $"craftmenu.{bps[shortName].Category}")) {
CUIClass.CreateText(ref _createBps, "selected_btn", bpUi, "1 1 1 0.25", $"<size=10>YOU CAN'T CRAFT THIS ITEM</size>", 12, "0.8 0.19", $"0.98 0.83", TextAnchor.MiddleCenter, $"robotocondensed-regular.ttf", 0.1f);
}
else {
if (_CanCraft(player, shortName)) {
CUIClass.CreateButton(ref _createBps, "selected_btn", bpUi, "0.38 0.51 0.16 0.85", " CRAFT", 11, "0.8 0.19", $"0.98 0.83", $"craftmenu_cmd craft {tier} {shortName} {index}", "", f[0], 0.1f, TextAnchor.MiddleCenter, $"robotocondensed-bold.ttf", "assets/content/ui/uibackgroundblur.mat");
CUIClass.PullFromAssets(ref _createBps, "bp_craftBtn_icon", "selected_btn", "1 1 1 0.65", "assets/icons/tools.png", 0.1f, 0f, "0.14 0.34", "0.32 0.67");
}
else {
CUIClass.CreateButton(ref _createBps, "selected_btn", bpUi, "0.70 0.67 0.65 0.17", "NOT ENOUGH\nRESOURCES", 11, "0.8 0.19", $"0.98 0.83", $"", "", f[1], 0.1f, TextAnchor.MiddleCenter, $"robotocondensed-bold.ttf", "assets/content/ui/uibackgroundblur.mat");
}
}
}
}
}
else {
//BASE
CUIClass.CreatePanel(ref _createBps, bpUi, "baseCraft_blueprints_panel", $"0.{db[27]}0 0.6{db[8]} {db[13]}5 {db[23]}.{db[2]}{db[8]}", anchorMin, anchorMax, false, 0.1f, 0f, "assets/content/ui/uibackgroundblur.mat");
//data
if (img.StartsWith("http")) CUIClass.CreateImage(ref _createBps, "bp_image", bpUi, Img($"{img}"), "0.02 0.12", "0.14 0.88", 0.1f);
else {
var itemDef = ItemManager.FindItemDefinition(img.Split('{')[0]);
if (itemDef != null) {
CUIClass.GameIcon(ref _createBps, "bp_image", bpUi, itemDef.itemid, bps[shortName].SkinID, 0f, 0f, "0.02 0.12", "0.14 0.88");
}
}
CUIClass.CreateText(ref _createBps, "bp_name", bpUi, f[1], $"{bps[shortName].Name}", 17, $"0.{db[30]}7 0.{db[16]}{db[1]}", "0.80 0.88", TextAnchor.MiddleLeft, $"robotocondensed-bold.ttf", 0.1f);
CUIClass.CreateText(ref _createBps, "bp_resource", bpUi, f[1], resource, 11, $"{db[15]}.{db[25]}{db[27]} -{db[2]}.{db[17]}4", "0.80 0.46", TextAnchor.UpperLeft, $"robotocondensed-regular.ttf", 0.1f);
if (bps[shortName].ResearchCost != 0) {
//if needs to be reseached
if (playerBps[player.userID].bp.Contains(shortName)) {
//bp available
CUIClass.PullFromAssets(ref _createBps, "bp_available", bpUi, "1 1 1 0.18", "assets/icons/check.png", 0.1f, 0f, "0.85 0.22", "0.945 0.87");
}
else {
//locked
CUIClass.PullFromAssets(ref _createBps, "bp_lock", bpUi, "1 1 1 0.18", "assets/icons/bp-lock.png", 0.1f, 0f, "0.85 0.22", "0.945 0.87");
}
}
else {
//bp available
CUIClass.PullFromAssets(ref _createBps, "bp_available", bpUi, "1 1 1 0.18", "assets/icons/check.png", 0.1f, 0f, "0.85 0.22", "0.945 0.87");
}
//select btn
CUIClass.CreateButton(ref _createBps, "select_btn", bpUi, "0 0 0 0", "", 11, "0 0", $"1 1", $"craftmenu_cmd select {tier} {shortName} {index}", "", f[1], 1f, TextAnchor.MiddleCenter, $"robotocondensed-bold.ttf", "assets/icons/iconmaterial.mat");
}
if (!selected) CuiHelper.DestroyUi(player, bpUi);
else CuiHelper.DestroyUi(player, "selected_btn");
CuiHelper.AddUi(player, _createBps);
CuiHelper.DestroyUi(player, "empty");
}
private void DestroyBps(BasePlayer player) {
CuiHelper.DestroyUi(player, "empty");
CuiHelper.DestroyUi(player, "baseCraft_main");
}
string[] anchors = {
"index", "0.86 0.0-0.98 1", "0.72 0.0-0.84 1", "0.58 0.0-0.70 1", "0.44 0.0-0.56 1", "0.30 0.0-0.42 1", "0.16 0.0-0.28 1", "0.02 0.0-0.14 1",
}
;
private void CreateCraftQueLayout(BasePlayer player, string itemName = "default") {
var qL = CUIClass.CreateOverlay("empty", "0 0 0 0", "0 0", "0 0", false, 0.0f, "assets/icons/iconmaterial.mat");
//assets/content/ui/uibackgroundblur.mat
CUIClass.CreatePanel(ref qL, "ql_base", "Overlay", "0.10 0.40 0.60 1", "1 0.0", "1 0.0", false, 0.3f, 0f, "assets/content/ui/uibackgroundblur.mat", "-398 16", "-220 43");
CUIClass.PullFromAssets(ref qL, "ql_base_gearicon", "ql_base", "0.20 0.6 0.8 1", "assets/icons/gear.png", 0.3f, 0f, "0.02 0.25", "0.11 0.75");
CUIClass.CreateButton(ref qL, "ql_base_btn_cancel_current", "ql_base", "0.70 0.67 0.65 0.17", "", 11, "-0.15 0.02", $"-0.01 0.98", $"craftmenu_cancel 0", "", "1 1 1 0.7", 1f, TextAnchor.MiddleCenter, $"robotocondensed-bold.ttf", "assets/content/ui/uibackgroundblur.mat");
CUIClass.PullFromAssets(ref qL, "ql_base_crossicon1", "ql_base_btn_cancel_current", "1 1 1 0.45", "assets/icons/vote_down.png", 0.1f, 0f, "0.0 0", "1 1");
CuiHelper.DestroyUi(player, "empty");
CuiHelper.DestroyUi(player, "ql_base");
CuiHelper.AddUi(player, qL);
CuiHelper.DestroyUi(player, "empty");
}
private void CreateTimer(BasePlayer player, string itemName, int seconds) {
string displayName = bps[itemName].Name;
if (displayName.Length > 16) {
displayName = displayName.Remove(16);
displayName += ".";
}
string s = "king";
string result = s.Remove(s.Length - 1);
var qTimer = CUIClass.CreateOverlay("empty", "0 0 0 0", "0 0", "0 0", false, 0.0f, "assets/icons/iconmaterial.mat");
//assets/content/ui/uibackgroundblur.mat
CUIClass.CreateText(ref qTimer, "qTimer", "ql_base", f[0], $"{seconds}s", 13, "0.13 0.00", "0.96 1", TextAnchor.MiddleRight, $"robotocondensed-regular.ttf", 0.0f);
CUIClass.CreateText(ref qTimer, "qTimerName", "ql_base", "1 1 1 0.8", $"{displayName.ToUpper()}", 13, "0.13 0.00", "1 1", Te
// ... [Code preview truncated due to length. Full source in attached file] ...