Иконка ресурса

FREE CraftingTable : 1.1.0 1.1.0

Нет прав для скачивания
C#:
// Все права принадлежат дискорд сообществу https://discord.gg/VgNHPpNrz6
using Facepunch;
using Newtonsoft.Json;
using Oxide.Core;
using Oxide.Game.Rust.Cui;
using System;
using System.Collections.Generic;
using System.Linq;
using UnityEngine;
namespace Oxide.Plugins {
    [Info("CraftingTable", "Jake_Rich", "1.1.0", ResourceId = 2498)]
    [Description("Centralized controller for modded custom crafting recipes")]
    public partial class CraftingTable : RustPlugin {
        public static CraftingTable _plugin {
            get;
            set;
        }
        public static CraftMenuController CraftController {
            get;
            set;
        }
        public static UIBaseElement CraftTableIcon {
            get;
            set;
        }
#region Hooks
        void Init() {
            _plugin = this;
        }
        void OnServerInitialized() {
            SetupUI();
            CraftController = new CraftMenuController();
            foreach (var entity in GameObject.FindObjectsOfType<BaseEntity>()) {
                OnEntitySpawned(entity);
            }
        }
        void Unload() {
            CraftTableIcon.HideAll();
            CraftController.OnUnload();
            foreach (var entity in GameObject.FindObjectsOfType<BaseEntity>()) {
                OnEntityKilled(entity);
            }
        }
        void OnPlayerInput(BasePlayer player, InputState input) {
            if (!GetPlayerData(player).LookingAtTable) {
                return;
            }
            if (input.WasJustPressed(BUTTON.USE)) {
                CraftController.ShowPlayer(player);
            }
        }
        void OnEntitySpawned(BaseEntity entity) {
            if (entity.PrefabName == "assets/prefabs/deployable/table/table.deployed.prefab") {
                entity.gameObject.AddComponent<CraftTableTrigger>();
            }
        }
        void OnEntityKilled(BaseEntity entity) {
            if (entity.PrefabName == "assets/prefabs/deployable/table/table.deployed.prefab") {
                GameObject.Destroy(entity.GetComponent<CraftTableTrigger>());
            }
        }
        void OnItemCraftFinished(ItemCraftTask task, Item item) {
            Puts("OnItemCraftFinished()");
        }
#endregion
#region UI Settings
        public void SetupUI() {
            CraftTableIcon = new UIBaseElement(new Vector2(0.40f, 0.40f), new Vector2(0.60f, 0.60f));
            float dotSize = 0.007f;
            float fadeIn = 0.25f;
            UIImage crosshairDot = new UIImage(new Vector2(0.5f - dotSize, 0.5f - dotSize * 2), new Vector2(0.5f + dotSize, 0.5f + dotSize * 2), CraftTableIcon);
            crosshairDot.Image.Sprite = "assets/icons/circle_closed.png";
            UIImage openIconSprite = new UIImage(new Vector2(0.46f, 0.73f), new Vector2(0.54f, 0.90f), CraftTableIcon);
            openIconSprite.Image.Sprite = "assets/icons/open.png";
            openIconSprite.Image.FadeIn = fadeIn;
            UILabel openIconText = new UILabel(new Vector2(0, 0.5f), new Vector2(1f, 0.8f), lang.GetMessage("Open", this), 14, parent : CraftTableIcon);
            openIconText.text.FadeIn = fadeIn;
        }
#endregion
#region LangAPI
        public Dictionary<string, string> LangAPI = new Dictionary<string, string>() {
            {
                "Open", "Open"
            }
            ,
        }
        ;
#endregion
#region PlayerData
        public class PlayerData {
            private BasePlayer _player {
                get;
                set;
            }
            public bool LookingAtTable {
                get;
                set;
            }
            public bool UsingCraftMenu {
                get;
                set;
            }
            public int SelectedModIndex {
                get;
                set;
            }
            public int SelectedPage {
                get;
                set;
            }
            public int SelectedItemIndex {
                get;
                set;
            }
            public int CraftAmount {
                get;
                set;
            }
            public PlayerData(BasePlayer player) {
                _player = player;
            }
            public PlayerData() {
            }
        }
        public static PlayerData GetPlayerData(BasePlayer player) {
            PlayerData data;
            if (!playerData.TryGetValue(player, out data)) {
                data = new PlayerData(player);
                playerData.Add(player, data);
            }
            return data;
        }
        public static Dictionary<BasePlayer, PlayerData> playerData {
            get;
            set;
        }
        = new Dictionary<BasePlayer, PlayerData>();
#endregion
#region Recipe Classes
        public class CraftRecipe {
            public List<ItemAmount> RequiredIngredients {
                get;
                set;
            }
            = new List<ItemAmount>();
            public string ItemName {
                get;
                set;
            }
            public string Description {
                get;
                set;
            }
            public ItemAmount ResultItem {
                get;
                set;
            }
            public float CraftTime {
                get;
                set;
            }
            public CraftRecipe() {
            }
            public CraftRecipe(string itemName, float craftTime, string description, string productShortname, int productAmount, ulong productSkin, params ItemAmount[] ingredients) {
                ItemName = itemName;
                CraftTime = craftTime;
                Description = description;
                ResultItem = new ItemAmount(productShortname, productAmount, productSkin);
                RequiredIngredients.AddRange(ingredients);
            }
            public bool HasItems(BasePlayer player, int amount) {
                if (amount > 10000 || amount < 1) {
                    _plugin.PrintError($"HasItems() out of range! {amount}");
                    return false;
                }
                Item[] items = player.inventory.AllItems();
                foreach (var item in RequiredIngredients) {
                    if (items.Where(x => x.skin == item.skinID && x.info.shortname == item.shortname).Sum(x => x.amount) < item.amount * amount) {
                        return false;
                    }
                }
                return true;
            }
            public List<Item> TakeItems(BasePlayer player, int amount) {
                List<Item> items = new List<Item>();
                foreach(var ingredient in RequiredIngredients) {
                    int amountLeft = ingredient.amount * amount;
                    foreach(var item in player.inventory.AllItems()) {
                        if (item.skin == ingredient.skinID && item.info.shortname == ingredient.shortname) {
                            if (item.amount > amountLeft) {
                                item.UseItem(amountLeft);
                                amountLeft = 0;
                                break;
                            }
                            item.Remove(0f);
                        }
                    }
                    items.Add(ItemManager.CreateByName(ingredient.shortname, ingredient.amount * amount, ingredient.skinID));
                }
                return items;
            }
            public void AddIngredient(string shortname, int amount = 1, ulong skin = 0) {
                RequiredIngredients.Add(new ItemAmount(shortname, amount, skin));
            }
        }
        public class ItemAmount {
            public string shortname {
                get;
                set;
            }
            public int amount {
                get;
                set;
            }
            public ulong skinID {
                get;
                set;
            }
            public ItemAmount() {
            }
            public ItemAmount(string shortname, int amount = 1, ulong skinID = 0) {
                this.shortname = shortname;
                this.amount = amount;
                this.skinID = skinID;
            }
            public int ItemID() {
                var item = ItemManager.itemList.FirstOrDefault(x => x.shortname == shortname);
                if (item == null) {
                    return -1;
                }
                return item.itemid;
            }
        }
#endregion
#region Classes
        public class CraftTableTrigger : LookingAtTrigger {
            private BaseEntity _this {
                get;
                set;
            }
            void Awake() {
                Init();
            }
            public override void Init() {
                base.Init();
                _this = GetComponent<BaseEntity>();
            }
            public override void OnPlayerLookAtEntity(BasePlayer player, BaseEntity entity) {
                base.OnPlayerLookAtEntity(player, entity);
                if (entity == _this) {
                    CraftController.ShowIcon(player);
                }
            }
            public override void OnPlayerStopLookingAtEntity(BasePlayer player, BaseEntity entity) {
                base.OnPlayerStopLookingAtEntity(player, entity);
                if (entity == _this) {
                    CraftController.HideIcon(player);
                }
            }
            public override void OnPlayerEnter(BasePlayer player) {
                base.OnPlayerEnter(player);
            }
            public override void OnPlayerExit(BasePlayer player) {
                base.OnPlayerExit(player);
                CraftController.HideIcon(player);
                CraftController.HidePlayer(player);
            }
        }
#endregion
#region ImageLibary
        [PluginReference]
        RustPlugin ImageLibrary;
        public static string GetItemURL(string shortname, ulong skinID) {
            if (_plugin.ImageLibrary == null) {
                _plugin.PrintError("ImageLibrary not found!");
                return "";
            }
            string url = _plugin.ImageLibrary.Call("GetImage", shortname, skinID, true) as string;
            _plugin.Puts($"GetImage() returned {url}");
            return url;
        }
        public static void GetSteamWorkshopURL(string shortname, ulong skinID) {
            string targetURL = $"http://steamcommunity.com/sharedfiles/filedetails/?id={skinID}";
            _plugin.webrequest.EnqueueGet(targetURL, (code, response) => {
                if (code != 200) {
                    return;
                }
                //_plugin.Puts(response);
                int startIndex = response.IndexOf("ShowEnlargedImagePreview(");
                int index = response.IndexOf('\'', startIndex);
                int endIndex = response.IndexOf('\'', index + 1);
                string url = response.Substring(index + 1, endIndex - index - 1);
                //_plugin.Puts($"URL: {url} Start: {startIndex} {index} {endIndex}");
                AddImage(url, shortname, skinID);
            }
            , _plugin, null, 30f);
        }
        public static void AddImage(string url, string shortname, ulong skinID) {
            _plugin.ImageLibrary.Call("AddImage", url, shortname, skinID);
        }
#endregion
        public class ModSettings {
            public string Identifier {
                get;
                set;
            }
            public string PluginName {
                get;
                set;
            }
            public List<CraftRecipe> Recipes {
                get;
                set;
            }
            = new List<CraftRecipe>();
            public int Index {
                get;
                set;
            }
        }
        ItemManager manager;
        List<ItemBlueprint> itemList;
        public class CraftMenuController {
            private UIPanel MainPanel {
                get;
                set;
            }
            private UIPanel PluginNamePanel {
                get;
                set;
            }
            private UILabel PluginNameLabel {
                get;
                set;
            }
            private UIPanel ItemGrid {
                get;
                set;
            }
            private UIPanel ItemDescription {
                get;
                set;
            }
            private UILabel ItemAmountLabel {
                get;
                set;
            }
            private UIButton ExitButton {
                get;
                set;
            }
            private List<UIBaseElement> RequiredIngredients {
                get;
                set;
            }
            = new List<UIBaseElement>();
            private Timer _timer {
                get;
                set;
            }
            //private UIPanel CraftTimePanel { get; set; }
            //private UIPanel MainPage { get; set; }
            private List<ModSettings> Mods {
                get {
                    return _mods;
                }
            }
            private List<ModSettings> _mods = new List<ModSettings>();
            private int _itemsPerPage = 0;
            public CraftMenuController() {
                _plugin.itemList = ItemManager.bpList;
                Mods.Add(new ModSettings() {
                    PluginName = "TestPlugin", Recipes = new List<CraftRecipe>() {
                        new CraftRecipe() {
                            CraftTime = 1f, ItemName = "Stones", Description = "Totally not a test description! Crafting one wood into 5 stones is 100% a balanced recipe ready for rust! Perhaps if we make this description really long and rambly, we will be able to see how word wrap works, and how long descriptions look! (Hint: They look pretty damn decent)", ResultItem= new ItemAmount() {
                                amount = 5, shortname = "stones", skinID = 0,
                            }
                            , RequiredIngredients = new List<ItemAmount>() {
                                new ItemAmount() {
                                    amount = 1, skinID = 0, shortname = "wood",
                                }
                                ,
                            }
                            ,
                        }
                        , new CraftRecipe() {
                            CraftTime = 10f, ItemName = "AK Magazine", Description = "Ak47 Magazine.Holds 30 bullets", ResultItem= new ItemAmount() {
                                amount = 1, shortname = "pistol.eoka", skinID = 946778674,
                            }
                            , RequiredIngredients = new List<ItemAmount>() {
                                new ItemAmount() {
                                    amount = 100, skinID = 0, shortname = "wood",
                                }
                                , new ItemAmount() {
                                    amount = 1000, skinID = 0, shortname = "metal.fragments",
                                }
                            }
                            ,
                        }
                        , new CraftRecipe() {
                            CraftTime = 30f, ItemName = "5Rnd Bolt Clip", ResultItem = new ItemAmount("pistol.eoka", 1, 946779217), Description = "A 5 Round Clip for the bolt action rifle.", RequiredIngredients = new List<ItemAmount>() {
                                new ItemAmount("wood", 100), new ItemAmount("metal.fragments", 500),
                            }
                            ,
                        }
                    }
                    ,
                }
                );
                SetupUI();
                foreach (var plugin in Interface.Oxide.RootPluginManager.GetPlugins()) {
                    OnPluginAdded(plugin);
                }
                Interface.Oxide.RootPluginManager.OnPluginAdded += OnPluginAdded;
                Interface.Oxide.RootPluginManager.OnPluginRemoved += OnPluginRemoved;
                foreach (var mod in Mods) {
                    SetupImages(mod);
                }
                _timer = _plugin.timer.Every(0.1f, TimerLoop);
            }
            private void SetupImages(ModSettings mod) {
                foreach (var recipe in mod.Recipes) {
                    if (GetItemURL(recipe.ResultItem.shortname, recipe.ResultItem.skinID) != "39274839") {
                        continue;
                    }
                    GetSteamWorkshopURL(recipe.ResultItem.shortname, recipe.ResultItem.skinID);
                }
            }
            private void OnPluginAddedOrRemoved() {
                //TODO: Fix any changes based on a mod's setings being added or removed
                MainPanel.HideAll();
                ExitButton.HideAll();
                //TODO: Combine all these elements under one central base element
                PluginNamePanel.HideAll();
                //TODO: Update craft grid without hiding for all players
                _mods = _mods.OrderBy(x=>x.PluginName).ToList();
                foreach (var mod in _mods) {
                    mod.Recipes = mod.Recipes.OrderBy(x => x.ItemName).ToList();
                }
                _plugin.Puts($"{Mods.Count}");
            }
            private void OnPluginAdded(Core.Plugins.Plugin plugin) {
                var response = plugin.Call("GetCraftingRecipes") as string;
                if (response == null) {
                    return;
                }
                ModSettings pluginSettings;
                try {
                    pluginSettings = JsonConvert.DeserializeObject<ModSettings>(response);
                }
                catch {
                    return;
                }
                if (pluginSettings == null) {
                    //_plugin.Puts($"OnPluginAdded({plugin.Name})");
                    return;
                }
                _plugin.Puts($"Loaded Mod for {plugin.Name}");
                if (pluginSettings.PluginName == "" || pluginSettings.PluginName == null) {
                    pluginSettings.PluginName = plugin.Name;
                }
                pluginSettings.Identifier = $"{plugin.Name}{plugin.Author}";
                Mods.Add(pluginSettings);
                SetupImages(pluginSettings);
                OnPluginAddedOrRemoved();
            }
            private void OnPluginRemoved(Core.Plugins.Plugin plugin) {
                Mods.RemoveAll(x => x.Identifier == $"{plugin.Name}{plugin.Author}");
                OnPluginAddedOrRemoved();
            }
            public void OnUnload() {
                _timer?.Destroy();
                Interface.Oxide.RootPluginManager.OnPluginAdded -= OnPluginAdded;
                Interface.Oxide.RootPluginManager.OnPluginRemoved -= OnPluginRemoved;
                MainPanel.HideAll();
                PluginNamePanel.HideAll();
                ExitButton.HideAll();
                //CraftTimePanel.HideAll();
            }
            //Public stuff here
            public void ShowPlayer(BasePlayer player) {
                _plugin.ImageLibrary.Call("AddImage", "https://steamuserimages-a.akamaihd.net/ugc/868480752631015567/4E31DE0C85B1EA124A757B52AA63939D70721310/", "pistol.eoka", 946778674);
                var data = GetPlayerData(player);
                data.UsingCraftMenu = true;
                data.SelectedModIndex = -1;
                data.SelectedPage = -1;
                data.SelectedItemIndex = -1;
                CraftTableIcon.Hide(player);
                MainPanel.Show(player);
                PluginNamePanel.Show(player);
                ExitButton.Show(player);
            }
            public void HidePlayer(BasePlayer player) {
                var data = GetPlayerData(player);
                data.UsingCraftMenu = false;
                data.SelectedModIndex = -1;
                data.SelectedPage = -1;
                data.SelectedItemIndex = -1;
                MainPanel.Hide(player);
                PluginNamePanel.Hide(player);
                ExitButton.Hide(player);
            }
            public void ShowIcon(BasePlayer player) {
                var data = GetPlayerData(player);
                if (data.UsingCraftMenu) {
                    return;
                }
                data.LookingAtTable = true;
                CraftTableIcon.Show(player);
            }
            public void HideIcon(BasePlayer player) {
                var data = GetPlayerData(player);
                data.LookingAtTable = false;
                CraftTableIcon.Hide(player);
            }
            private void SetupUI() {
                MainPanel = new UIPanel(new Vector2(0.15f, 0.175f), new Vector2(0.95f, 0.90f), null, "0 0 0 0.70");
                MainPanel.CursorEnabled = true;
                PluginNamePanel = new UIPanel(new Vector2(0.4f, 0.92f), new Vector2(0.6f, 0.98f));
                PluginNamePanel.conditionalShow = delegate (BasePlayer player) {
                    var data = GetPlayerData(player);
                    return data.SelectedModIndex != -1;
                }
                ;
                PluginNameLabel = new UILabel(new Vector2(0, 0), new Vector2(1, 1), "Plugin Name Here", 16, parent : PluginNamePanel);
                PluginNameLabel.variableText = delegate (BasePlayer player) {
                    var data = GetPlayerData(player);
                    if (data.SelectedModIndex == -1) {
                        return "";
                    }
                    if (data.SelectedModIndex < 0 || data.SelectedModIndex > Mods.Count) {
                        return "";
                    }
                    return Mods[data.SelectedModIndex].PluginName;
                }
                ;
                Vector2 craftTimePos = new Vector2(0.85f, 0.1525f);
                ExitButton = new UIButton(new Vector2(0.92f, 0.90f), new Vector2(0.95f, 0.93f), "X", "1 0 0 1", "1 1 1 1", 20);
                ExitButton.AddCallback((player) => {
                    HidePlayer(player);
                }
                );
                //CraftTimePanel = new UIPanel(craftTimePos, 0.13f, 0.039f, null, "1 1 0 1");
                /*CraftTimePanel.conditionalPosition = delegate (BasePlayer player)
                {
                    int statuses = player.inventory.crafting.queue.Count > 0 ? 1 : 0;

                    if (player.metabolism.comfort.value > 0)
                    {
                        statuses++;
                    }

                    if (player.metabolism.bleeding.value > 0)
                    {
                        statuses++;
                    }

                    if (player.metabolism.calories.value < 40f)
                    {
                        statuses++;
                    }

                    if (player.metabolism.hydration.value < 40f)
                    {
                        statuses++;
                    }

                    if (player.metabolism.temperature.value < 7f)
                    {
                        statuses++;
                    }

                    return craftTimePos + new Vector2(0, 0.046f * statuses);
                };

                CraftTimePanel.Show(BasePlayer.activePlayerList);    */
                SetupUI_ModList();
                SetupUI_CraftGrid();
                SetupUI_ItemDescription();
            }
            private void SetupUI_ModList() {
                float height = 0.08f;
                for (int i = 0; i< Mathf.FloorToInt((1f / height));
                i++) {
                    int index = i;
                    UIButton modPanel = new UIButton(new Vector2(0f, 1f - (((index + 1) * height) - 0.01f)), new Vector2(0.125f, 1f - (index * height)), "", "1 0 0 0.7", parent : MainPanel);
                    modPanel.AddCallback((player)=> {
                        _plugin.Puts($"Clicked mod {index} / {Mods.Count}!");
                        SetModPage(player, index);
                    }
                    );
                    modPanel.conditionalShow = delegate (BasePlayer player) {
                        return index < Mods.Count;
                    }
                    ;
                    UILabel modName = new UILabel(new Vector2(0.03f, 0f), new Vector2(1f, 1f), "", parent : modPanel, alignment : TextAnchor.MiddleLeft);
                    modName.variableText = delegate (BasePlayer player) {
                        if (index > Mods.Count - 1 || index < 0) {
                            return "";
                        }
                        return Mods[index].PluginName;
                    }
                    ;
                    UILabel recipeCount = new UILabel(new Vector2(0.03f, 0f), new Vector2(0.97f, 1f), "", parent : modPanel, alignment : TextAnchor.MiddleRight);
                    recipeCount.variableText = delegate (BasePlayer player) {
                        if (index > Mods.Count - 1 || index < 0) {
                            return "";
                        }
                        return Mods[index].Recipes.Count.ToString();
                    }
                    ;
                }
            }
            private void SetupUI_CraftGrid() {
                ItemGrid = new UIPanel(new Vector2(0.14f, 0.01f), new Vector2(0.6f, 1f), MainPanel, "0 1 0 0");
                float width = 6;
                float height = 6;
                _itemsPerPage = (int)(width * height);
                for (int x = 0; x < width; x++) {
                    for (int y = 0; y < height; y++) {
                        int index = (int)(y * height + x);
                        //Need to delcare a new variable for each callback
                        Vector2 size = new Vector2(1f / width, 1f / height);
                        Vector2 pos = new Vector2(x * size.x, 1f -(y + 1) * size.y);
                        UIRawImage itemIcon = new UIRawImage(pos + new Vector2(0.005f, 0f), pos + size * 0.95f, ItemGrid);
                        UIButton itemButton = new UIButton(pos + new Vector2(0.005f, 0f), pos + size * 0.95f, $"", "0 1 1 0.00001", fontSize : 12, parent : ItemGrid);
                        //UIRawImage itemIcon = new UIRawImage(new Vector2(0f, 0f), new Vector2(1f, 1f), itemButton);
                        itemIcon.variablePNGURL = delegate (BasePlayer player) {
                            var data = GetPlayerData(player);
                            if (data.SelectedModIndex == -1) {
                                return null;
                            }
                            var mod = GetModPage(data);
                            if (mod == null) {
                                return "";
                            }
                            if (index < 0 || index > mod.Recipes.Count - 1) {
                                return "";
                            }
                            var recipe = mod.Recipes[index];
                            return GetItemURL(recipe.ResultItem.shortname, recipe.ResultItem.skinID);
                        }
                        ;
                        itemButton.AddCallback((player) => {
                            _plugin.Puts($"Clicked mod {index}!");
                            SetCraftItemIndex(player, index);
                        }
                        );
                        itemButton.conditionalShow = delegate (BasePlayer player) {
                            var data = GetPlayerData(player);
                            var mod = GetModPage(data);
                            if (mod == null) {
                                return false;
                            }
                            if (mod.Recipes.Count <= index) {
                                return false;
                            }
                            return true;
                        }
                        ;
                        /*itemButton.variableText = delegate (BasePlayer player)
                        {
                            var data = GetPlayerData(player);
                            var mod = GetModPage(data);
                            if (mod == null)
                            {
                                return "";
                            }
                            if (index < 0 || index > mod.CustomRecipes.Count - 1)
                            {
                                return "";
                            }
                            var recipe = mod.CustomRecipes[index];
                            return recipe.ResultItem.shortname;
                        };*/
                    }
                }
            }
            private void SetupUI_ItemDescription() {
                ItemDescription = new UIPanel(new Vector2(0.605f, 0f), new Vector2(1f, 1f), MainPanel, "0 1 0 0.50");
                ItemDescription.conditionalShow = delegate (BasePlayer player) {
                    var data = GetPlayerData(player);
                    return data.SelectedItemIndex != -1;
                }
                ;
#region Top Right Values
                UIPanel craftTimePanel = new UIPanel(new Vector2(0.8f, 0.93f), 0.18f, 0.05f, ItemDescription);
                UILabel craftTimeLabel = new UILabel(new Vector2(0, 0), new Vector2(1, 1), "", parent : craftTimePanel);
                craftTimeLabel.variableText = delegate (BasePlayer player) {
                    var data = GetPlayerData(player);
                    var recipe = GetRecipe(data);
                    if (recipe == null) {
                        return "";
                    }
                    return $"{Math.Round(recipe.CraftTime,1)} second{(recipe.CraftTime > 1f ? "s" : "")}";
                }
                ;
                UIPanel resultAmountPanel = new UIPanel(new Vector2(0.8f, 0.875f), 0.18f, 0.05f, ItemDescription);
                UILabel resultAmountText = new UILabel(new Vector2(0, 0), new Vector2(1, 1), "", parent : resultAmountPanel);
                resultAmountText.variableText = delegate (BasePlayer player) {
                    var data = GetPlayerData(player);
                    var recipe = GetRecipe(data);
                    if (recipe == null) {
                        return "";
                    }
                    return $"x{recipe.ResultItem.amount}";
                }
                ;
#endregion
#region Item Icon
                UIRawImage itemIcon = new UIRawImage(new Vector2(0.05f, 0.91f), 0.150f, 0.150f, ItemDescription);
                itemIcon.variablePNGURL = delegate (BasePlayer player) {
                    var data = GetPlayerData(player);
                    var recipe = GetRecipe(data);
                    if (recipe == null) {
                        return "";
                    }
                    return GetItemURL(recipe.ResultItem.shortname, recipe.ResultItem.skinID);
                }
                ;
#endregion
#region Name and Description
                UILabel itemName = new UILabel(new Vector2(0.2f, resultAmountPanel.min.y), new Vector2(0.80f, craftTimePanel.max.y), "Item Name Here", 20, "0.9 0.9 0.9  s 1", ItemDescription);
                itemName.variableText = delegate (BasePlayer player) {
                    var data = GetPlayerData(player);
                    var recipe = GetRecipe(data);
                    if (recipe == null) {
                        return "";
                    }
                    return recipe.ItemName;
                }
                ;
                UILabel itemDescription = new UILabel(new Vector2(0.05f, 0.4f), new Vector2(0.95f, 0.85f), "", 13, "1 1 1 1", ItemDescription, TextAnchor.UpperLeft);
                itemDescription.variableText = delegate (BasePlayer player) {
                    var data = GetPlayerData(player);
                    var recipe = GetRecipe(data);
                    if (recipe == null) {
                        return "";
                    }
                    return recipe.Description;
                }
                ;
#endregion
#region Required Materials
                int panelCount = 6;
                float MaxY = 0.35f;
                float MinY = 0.08f;
                float height = (MaxY - MinY) / panelCount;
                UILabel requiredItemsLabel1 = new UILabel(new Vector2(0f, MaxY + 0.015f), new Vector2(0.2f, MaxY + 0.08f), "Amount", parent : ItemDescription, alignment : TextAnchor.LowerCenter);
                UILabel requiredItemsLabel2 = new UILabel(new Vector2(0.2f, MaxY + 0.015f), new Vector2(0.6f, MaxY + 0.08f), "Item Name", parent : ItemDescription, alignment : TextAnchor.LowerCenter);
                UILabel requiredItemsLabel3 = new UILabel(new Vector2(0.6f, MaxY + 0.015f), new Vector2(0.8f, MaxY + 0.08f), "Total Amount", parent : ItemDescription, alignment : TextAnchor.LowerCenter);
                UILabel requiredItemsLabel4 = new UILabel(new Vector2(0.8f, MaxY + 0.015f), new Vector2(1.0f, MaxY + 0.08f), "Have", parent : ItemDescription, alignment : TextAnchor.LowerCenter);
                for (int i = 0; i < panelCount; i++) {
                    int index = i;
                    UIPanel panel = new UIPanel(new Vector2(0.01f, MaxY - height * (i + 1) + 0.005f), new Vector2(0.97f, MaxY - height * i), ItemDescription);
                    panel.conditionalShow = delegate (BasePlayer player) {
                        var data = GetPlayerData(player);
                        var recipe = GetRecipe(data);
                        if (recipe == null) {
                            return false;
                        }
                        return index < recipe.RequiredIngredients.Count;
                    }
                    ;
                    UILabel requiredAmountPerItem = new UILabel(new Vector2(0f, 0f), new Vector2(0.2f, 1f), "", 12, "1 1 1 1", panel, TextAnchor.MiddleCenter);
                    requiredAmountPerItem.variableText = delegate (BasePlayer player) {
                        var data = GetPlayerData(player);
                        var recipe = GetRecipe(data);
                        if (recipe == null) {
                            return "";
                        }
                        if (index > recipe.RequiredIngredients.Count - 1) {
                            return "";
                        }
                        return recipe.RequiredIngredients[index].amount.ToString();
                    }
                    ;
                    UILabel requiredItemName = new UILabel(new Vector2(0.2f, 0f), new Vector2(0.6f, 1f), "", 12, "1 1 1 1", panel, TextAnchor.MiddleCenter);
                    requiredItemName.variableText = delegate (BasePlayer player) {
                        var data = GetPlayerData(player);
                        var recipe = GetRecipe(data);
                        if (recipe == null) {
                            return "";
                        }
                        if (index > recipe.RequiredIngredients.Count - 1) {
                            return "";
                        }
                        var shortname = recipe.RequiredIngredients[index].shortname;
                        return ItemManager.itemList.First(x => x.shortname == shortname).displayName.english;
                    }
                    ;
                    UILabel requiredTotalAmount = new UILabel(new Vector2(0.6f, 0f), new Vector2(0.8f, 1f), "", 12, "1 1 1 1", panel, TextAnchor.MiddleCenter);
                    requiredTotalAmount.variableText = delegate (BasePlayer player) {
                        var data = GetPlayerData(player);
                        var recipe = GetRecipe(data);
                        if (recipe == null) {
                            return "";
                        }
                        if (index > recipe.RequiredIngredients.Count - 1) {
                            return "";
                        }
                        return (recipe.RequiredIngredients[index].amount * data.CraftAmount).ToString();
                    }
                    ;
                    RequiredIngredients.Add(requiredTotalAmount);
                    /*UILabel requiredItemName = new UILabel(new Vector2(0.2f, 0f), new Vector2(0.6f, 1f), "", 12, "1 1 1 1", panel, TextAnchor.MiddleCenter);
                    requiredItemName.variableText = delegate (BasePlayer player)
                    {
                        var data = GetPlayerData(player);
                        var recipe = GetRecipe(data);
                        if (recipe == null)
                        {
                            return "";
                        }
                        if (index > recipe.RequiredIngredients.Count - 1)
                        {
                            return "";
                        }
                        return recipe.RequiredIngredients[index].shortname;
                    };*/
                    //UILabel requiredAmount = new UILabel(new Vector2(0.01f, MaxY - height * i), new Vector2(0.97f, MaxY - height * i), "Text");
                }
#endregion
#region Craft Amount
                UIPanel itemAmountPanel = new UIPanel(new Vector2(0.15f, 0.01f), new Vector2(0.3f, 0.07f), ItemDescription, "0 0 0 0.70");
                ItemAmountLabel = new UILabel(new Vector2(0.1f, 0), new Vector2(1, 1), parent : itemAmountPanel, labelText : "1", alignment : TextAnchor.MiddleLeft);
                ItemAmountLabel.variableText = delegate (BasePlayer player) {
                    var data = GetPlayerData(player);
                    return data.CraftAmount.ToString();
                }
                ;
                UIButton itemAmountLess = new UIButton(new Vector2(0.03f, 0.01f), new Vector2(0.13f, 0.07f), "", fontSize : 24, parent : ItemDescription);
                itemAmountLess.AddCallback((player) => {
                    AddCraftAmount(player, -1);
                }
                );
                itemAmountLess.textComponent.Align = TextAnchor.UpperCenter;
                UILabel itemAmountLessLabel = new UILabel(new Vector2(0f, 0.3f), new Vector2(1f, 1.3f), "_", 26, parent : itemAmountLess);
                UIButton itemAmountMore = new UIButton(new Vector2(0.32f, 0.01f), new Vector2(0.42f, 0.07f), "+", fontSize : 26, parent : ItemDescription);
                itemAmountMore.AddCallback((player) => {
                    AddCraftAmount(player, 1);
                }
                );
#endregion
#region Craft Button
                UIButton craftButton = new UIButton(new Vector2(0.75f, 0.01f), new Vector2(0.97f, 0.07f), "CRAFT", fontSize : 14, parent : ItemDescription);
                craftButton.AddCallback((player) => {
                    CraftButtonClicked(player);
                }
                );
#endregion
            }
            private void SetCraftPage(BasePlayer player, ModSettings mod, int index) {
            }
            private void SetModPage(BasePlayer player, int index) {
                if (index < 0 || index > Mods.Count - 1) {
                    _plugin.PrintError($"SwitchModPage() index out of range! ({index})");
                    return;
                }
                var data = GetPlayerData(player);
                data.SelectedModIndex = index;
                ModSettings mod = Mods[index];
                PluginNamePanel.Refresh(player);
                ItemGrid.Refresh(player);
            }
            private void SetCraftItemIndex(BasePlayer player, int index) {
                _plugin.Puts($"SetCraftItemIndex() {index}");
                var data = GetPlayerData(player);
                var mod = GetModPage(data);
                if (mod == null) {
                    return;
                }
                data.SelectedItemIndex = index;
                data.CraftAmount = 1;
                ItemDescription.Refresh(player);
            }
            private void SetCraftAmount(BasePlayer player, int amount) {
                var data = GetPlayerData(player);
                data.CraftAmount = amount;
                data.CraftAmount = Mathf.Clamp(data.CraftAmount, 1, 10000);
                ItemAmountLabel.Refresh(player);
                foreach (var label in RequiredIngredients) {
                    //label.Refresh(player);
                }
            }
            private void AddCraftAmount(BasePlayer player, int amount) {
                var data = GetPlayerData(player);
                data.CraftAmount += amount;
                data.CraftAmount = Mathf.Clamp(data.CraftAmount, 1, 10000);
                ItemAmountLabel.Refresh(player);
                foreach(var label in RequiredIngredients) {
                    //label.Refresh(player);
                }
            }
            private void CraftButtonClicked(BasePlayer player) {
                _plugin.Puts("CraftButtonClicked()");
                var data = GetPlayerData(player);
                var recipe = GetRecipe(data);
                if (recipe == null) {
                    _plugin.PrintError($"CraftButtonClicked() recipe is null!");
                    return;
                }
                if (!recipe.HasItems(player, data.CraftAmount)) {
                    _plugin.PrintError($"CraftButtonClicked() player doesn't have items!");
                    return;
                }
                QueueRecipe(player, recipe, data.CraftAmount);
            }
            private void QueueRecipe(BasePlayer player, CraftRecipe recipe, int amount) {
                var crafter = player.inventory.crafting;
                //TODO: Collect ingredients
                //TODO: Put taken items into task
                //TODO: Need to create a ItemBlueprint per custom recipe (or do something custom)
                ItemCraftTask task = Pool.Get<ItemCraftTask>();
                task.endTime = 0f;
                crafter.taskUID++;
                task.taskUID = crafter.taskUID;
                task.owner = player;
                task.amount = amount;
                task.blueprint = ItemManager.bpList.FirstOrDefault(x => x.targetItem.shortname == recipe.ResultItem.shortname);
                task.skinID = (int)recipe.ResultItem.skinID;
                task.takenItems = recipe.TakeItems(player, amount);
                crafter.queue.Enqueue(task);
                if (task.owner != null) {
                    task.owner.Command("note.craft_add", new object[] {
                        task.taskUID, recipe.ResultItem.ItemID(), amount, task.skinID
                    }
                    );
                }
            }
            private void TimerLoop() {
                //CraftTimePanel.RefreshAll();
                //_plugin.Puts($"TimerLoop()");
            }
            private ModSettings GetModPage(PlayerData playerdata) {
                if (playerdata.SelectedModIndex < 0 || playerdata.SelectedModIndex > Mods.Count - 1) {
                    //_plugin.PrintError($"GetModPage() index out of range! ({playerdata.SelectedModIndex})");
                    return null;
                }
                return Mods[playerdata.SelectedModIndex];
            }
            private CraftRecipe GetRecipe(PlayerData playerData) {
                var mod = GetModPage(playerData);
                if (mod == null) {
                    return null;
                }
                if (playerData.SelectedItemIndex < 0 || playerData.SelectedItemIndex > mod.Recipes.Count - 1) {
                    return null;
                }
                return mod.Recipes[playerData.SelectedItemIndex];
            }
        }
    }
#region JakeUIFramework class
    public partial class CraftingTable : RustPlugin {
#region Jake's UI Framework
        private Dictionary<string, UIButton> UIButtonCallBacks {
            get;
            set;
        }
        = new Dictionary<string, UIButton>();
        void OnButtonClick(ConsoleSystem.Arg arg) {
            UIButton button;
            if (UIButtonCallBacks.TryGetValue(arg.cmd.Name, out button)) {
                button.OnClicked(arg);
                return;
            }
            Puts("Unknown button command: {0}", arg.cmd.Name);
        }
        public class UIElement : UIBaseElement {
            public CuiElement Element {
                get;
                protected set;
            }
            public UIOutline Outline {
                get;
                set;
            }
            public CuiRectTransformComponent transform {
                get;
                protected set;
            }
            public float FadeOut {
                get {
                    return Element == null ? _fadeOut : Element.FadeOut;
                }
                set {
                    if (Element != null) {
                        Element.FadeOut = value;
                    }
                    _fadeOut = value;
                }
            }
            private float _fadeOut = 0f;
            public string Name {
                get {
                    return Element.Name;
                }
            }
            public UIElement(UIBaseElement parent = null) : base(parent) {
            }
            public UIElement(Vector2 position, float width, float height, UIBaseElement parent = null) : this(position, new Vector2(position.x + width, position.y + height), parent) {
            }
            public UIElement(Vector2 min, Vector2 max, UIBaseElement parent = null) : base(min, max, parent) {
                transform = new CuiRectTransformComponent();
                Element = new CuiElement {
                    Name = CuiHelper.GetGuid(), Parent = this.parent == null ? this.Parent : this.parent.Parent, Components = {
                        transform,
                    }
                    , FadeOut = _fadeOut,
                }
                ;
                UpdatePlacement();
                Init();
            }
            public void AddOutline(string color = "0 0 0 1", string distance = "1 -1") {
                Outline = new UIOutline(color, distance);
                Element.Components.Add(Outline.component);
            }
            public virtual void Init() {
            }
            public override void Show(BasePlayer player, bool children = true) {
                if (this is UIElement) {
                    if (!CanShow(player)) {
                        return;
                    }
                }
                if (AddPlayer(player)) {
                    SafeAddUi(player, Element);
                }
                base.Show(player, children);
            }
            public override void Hide(BasePlayer player, bool children = true) {
                base.Hide(player, children);
                if (RemovePlayer(player)) {
                    SafeDestroyUi(player, Element);
                }
            }
            public override void UpdatePlacement() {
                base.UpdatePlacement();
                if (transform != null) {
                    transform.AnchorMin = $
// ... [Code preview truncated due to length. Full source in attached file] ...

Автор
15FPS
Скачиваний
0
Просмотры
1
Первый выпуск
Обновление
Оценка
0.00 звёзд 0 оценок
Сверху