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

FREE CraftSystem : 1.0.6 1.0.6

Нет прав для скачивания
C#:
// Все права принадлежат дискорд сообществу https://discord.gg/VgNHPpNrz6
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using Newtonsoft.Json;
using Oxide.Core.Plugins;
using Oxide.Game.Rust.Cui;
using UnityEngine;

namespace Oxide.Plugins
{
    [Info("CraftSystem", "Kira", "1.0.6")] 
    [Description("Craft system for Moon Rust")]
    public class CraftSystem : RustPlugin
    {
        #region [Vars] / [Переменные]

        [PluginReference] private Plugin ImageLibrary;
        private const string UIParent = "UI.CraftSystem";
        private static WaitForSeconds wait = new WaitForSeconds(0.1f);

        #endregion

        #region [Dictionary] / [Словари]

        public class CraftItem
        {
            public string Shortname;
            public string DisplayName;
            public string DisplayNameEng;
            public ulong SkinID;
            public string Image;
            public int Count;
            public List<RequiredItem> RequiredItems = new List<RequiredItem>();

            public class RequiredItem
            {
                public string DisplayName;
                public string Shortname;
                public ulong SkinID;
                public int Count;
            }
        }

        private Dictionary<string, string> Images = new Dictionary<string, string>
        {
            ["UI.CraftSystem.Background"] = "https://i.imgur.com/nGJ20Sw.jpg",
            ["UI.CraftSystem.Button.Active"] = "https://i.imgur.com/Otf0eAB.png",
            ["UI.CraftSystem.Button"] = "https://i.imgur.com/WvazCxc.png",
            ["UI.CraftSystem.Description"] = "https://i.imgur.com/3dqlJES.png",
            ["UI.CraftSystem.Category"] = "https://i.imgur.com/8Xbfwkp.png",
            ["UI.CraftSystem.Craft"] = "https://i.imgur.com/XAKtH3m.png",
            ["UI.CraftSystem.RequiredItem"] = "https://i.imgur.com/wikH8kL.png",
            ["UI.CraftSystem.Category"] = "https://i.imgur.com/8Xbfwkp.png"
        };

        #endregion

        #region [Configuraton] / [Конфигурация]

        private ConfigData _config;

        public class ConfigData
        {
            [JsonProperty(PropertyName = "CraftSystem - Config")]
            public CraftCFG CraftSettings = new CraftCFG();

            public class CraftCFG
            {
                [JsonProperty(PropertyName = "Список крафтов")]
                public List<CraftItem> CraftItems;
            }
        }

        private ConfigData GetDefaultConfig()
        {
            return new ConfigData
            {
                CraftSettings = new ConfigData.CraftCFG
                {
                    CraftItems = new List<CraftItem>
                    {
                        new CraftItem
                        {
                            Shortname = "metal.facemask",
                            DisplayName = "Улучшенный шлем1",
                            Count = 1,
                            Image = "https://rustlabs.com/img/items180/smg.mp5.png",
                            RequiredItems = new List<CraftItem.RequiredItem>
                            {
                                new CraftItem.RequiredItem
                                {
                                    DisplayName = "Assault Rifle",
                                    Shortname = "rifle.ak",
                                    Count = 1000
                                },
                                new CraftItem.RequiredItem
                                {
                                    DisplayName = "Rock",
                                    Shortname = "rock",
                                    Count = 1000
                                },
                                new CraftItem.RequiredItem
                                {
                                    DisplayName = "Metal Ore",
                                    Shortname = "metal.ore",
                                    Count = 1000
                                },
                                new CraftItem.RequiredItem
                                {
                                    DisplayName = "Meteor Dust",
                                    Shortname = "ducttape",
                                    Count = 1000,
                                    SkinID = 2814895972
                                }
                            }
                        },
                        new CraftItem
                        {
                            Shortname = "metal.plate.torso",
                            DisplayName = "Улучшенный нагрудник",
                            Count = 1,
                            Image = "https://rustlabs.com/img/items180/smg.mp5.png",
                            RequiredItems = new List<CraftItem.RequiredItem>
                            {
                                new CraftItem.RequiredItem
                                {
                                    Shortname = "wood",
                                    Count = 1000
                                },
                                new CraftItem.RequiredItem
                                {
                                    Shortname = "stones",
                                    Count = 1000
                                },
                                new CraftItem.RequiredItem
                                {
                                    Shortname = "metal.ore",
                                    Count = 1000
                                },
                                new CraftItem.RequiredItem
                                {
                                    Shortname = "sulfur.ore",
                                    Count = 1000
                                }
                            }
                        },
                        new CraftItem
                        {
                            Shortname = "hoodie",
                            DisplayName = "Улучшенное худи",
                            Count = 1,
                            Image = "https://rustlabs.com/img/items180/smg.mp5.png",
                            RequiredItems = new List<CraftItem.RequiredItem>
                            {
                                new CraftItem.RequiredItem
                                {
                                    Shortname = "wood",
                                    Count = 1000
                                },
                                new CraftItem.RequiredItem
                                {
                                    Shortname = "stones",
                                    Count = 1000
                                },
                                new CraftItem.RequiredItem
                                {
                                    Shortname = "metal.ore",
                                    Count = 1000
                                },
                                new CraftItem.RequiredItem
                                {
                                    Shortname = "sulfur.ore",
                                    Count = 1000
                                }
                            }
                        },
                        new CraftItem
                        {
                            Shortname = "roadsign.kilt",
                            DisplayName = "Улучшенный килт",
                            Count = 1,
                            Image = "https://rustlabs.com/img/items180/smg.mp5.png",
                            RequiredItems = new List<CraftItem.RequiredItem>
                            {
                                new CraftItem.RequiredItem
                                {
                                    Shortname = "wood",
                                    Count = 1000
                                },
                                new CraftItem.RequiredItem
                                {
                                    Shortname = "stones",
                                    Count = 1000
                                },
                                new CraftItem.RequiredItem
                                {
                                    Shortname = "metal.ore",
                                    Count = 1000
                                },
                                new CraftItem.RequiredItem
                                {
                                    Shortname = "sulfur.ore",
                                    Count = 1000
                                }
                            }
                        },
                        new CraftItem
                        {
                            Shortname = "pants",
                            DisplayName = "Улучшенные штаны",
                            Count = 1,
                            Image = "https://rustlabs.com/img/items180/smg.mp5.png",
                            RequiredItems = new List<CraftItem.RequiredItem>
                            {
                                new CraftItem.RequiredItem
                                {
                                    Shortname = "wood",
                                    Count = 1000
                                },
                                new CraftItem.RequiredItem
                                {
                                    Shortname = "stones",
                                    Count = 1000
                                },
                                new CraftItem.RequiredItem
                                {
                                    Shortname = "metal.ore",
                                    Count = 1000
                                },
                                new CraftItem.RequiredItem
                                {
                                    Shortname = "sulfur.ore",
                                    Count = 1000
                                }
                            }
                        },
                        new CraftItem
                        {
                            Shortname = "shoes.boots",
                            DisplayName = "Улучшенные ботинки",
                            Count = 1,
                            Image = "https://rustlabs.com/img/items180/smg.mp5.png",
                            RequiredItems = new List<CraftItem.RequiredItem>
                            {
                                new CraftItem.RequiredItem
                                {
                                    Shortname = "wood",
                                    Count = 1000
                                },
                                new CraftItem.RequiredItem
                                {
                                    Shortname = "stones",
                                    Count = 1000
                                },
                                new CraftItem.RequiredItem
                                {
                                    Shortname = "metal.ore",
                                    Count = 1000
                                },
                                new CraftItem.RequiredItem
                                {
                                    Shortname = "sulfur.ore",
                                    Count = 1000
                                }
                            }
                        },
                        new CraftItem
                        {
                            Shortname = "tactical.gloves",
                            DisplayName = "Улучшенные перчатки",
                            Count = 1,
                            Image = "https://rustlabs.com/img/items180/smg.mp5.png",
                            RequiredItems = new List<CraftItem.RequiredItem>
                            {
                                new CraftItem.RequiredItem
                                {
                                    Shortname = "wood",
                                    Count = 1000
                                },
                                new CraftItem.RequiredItem
                                {
                                    Shortname = "stones",
                                    Count = 1000
                                },
                                new CraftItem.RequiredItem
                                {
                                    Shortname = "metal.ore",
                                    Count = 1000
                                },
                                new CraftItem.RequiredItem
                                {
                                    Shortname = "sulfur.ore",
                                    Count = 1000
                                }
                            }
                        }
                    }
                }
            };
        }

        protected override void LoadConfig()
        {
            base.LoadConfig();

            try
            {
                _config = Config.ReadObject<ConfigData>();
            }
            catch
            {
                LoadDefaultConfig();
            }

            SaveConfig();
        }

        protected override void LoadDefaultConfig()
        {
            PrintError("Файл конфигурации поврежден (или не существует), создан новый!");
            _config = GetDefaultConfig();
        }

        protected override void SaveConfig()
        {
            Config.WriteObject(_config);
        }

        #endregion

        #region [Lang]

        protected override void LoadDefaultMessages()
        {
            var ru = new Dictionary<string, string>
            {
                ["metal.facemask"] = "Mask",
                ["metal.plate.torso"] = "Mask",
                ["hoodie"] = "Mask",
                ["roadsign.kilt"] = "Mask",
                ["pants"] = "Mask",
                ["shoes.boots"] = "Mask",
                ["tactical.gloves"] = "Mask",
                ["CRAFT"] = "КРАФТ",
                ["CATEGORY1"] = "CATEGORY1",
                ["CATEGORY2"] = "CATEGORY2",
                ["CATEGORY3"] = "CATEGORY3",
                ["EXIT"] = "ВЫХОД"
            };

            var en = new Dictionary<string, string>
            {
                ["metal.facemask"] = "Mask",
                ["metal.plate.torso"] = "Mask",
                ["hoodie"] = "Mask",
                ["roadsign.kilt"] = "Mask",
                ["pants"] = "Mask",
                ["shoes.boots"] = "Mask",
                ["tactical.gloves"] = "Mask",
                ["CRAFT"] = "CRAFT",
                ["CATEGORY1"] = "CATEGORY1",
                ["CATEGORY2"] = "CATEGORY2",
                ["CATEGORY3"] = "CATEGORY3",
                ["EXIT"] = "EXIT"
            };
            lang.RegisterMessages(ru, this, "ru");
            lang.RegisterMessages(en, this);
        }

        #endregion

        #region [DrawUI] / [Отрисовка UI]

        private void DrawUI_Main(BasePlayer player)
        {
            var ui = new CuiElementContainer();
            ui.Add(new CuiPanel
            {
                CursorEnabled = true,
                Image =
                {
                    Color = "0 0 0 0"
                },
                RectTransform =
                {
                    AnchorMin = "0 0",
                    AnchorMax = "1 1"
                }
            }, "Overlay", UIParent);
            ui.Add(new CuiElement
            {
                Parent = UIParent,
                Components =
                {
                    new CuiRawImageComponent
                    {
                        Png = GetImage("UI.CraftSystem.Background")
                    },
                    new CuiRectTransformComponent
                    {
                        AnchorMin = "0 0",
                        AnchorMax = "1 1"
                    }
                }
            });
            ui.Add(new CuiElement
            {
                Name = $"{UIParent}.ServerName",
                Parent = UIParent,
                Components =
                {
                    new CuiImageComponent
                    {
                        Color = "0.15 0.24 0.38 0.36"
                    },
                    new CuiRectTransformComponent
                    {
                        AnchorMin = "0.04062501 0.8648148",
                        AnchorMax = "0.165625 0.9333333"
                    }
                }
            });

            ui.Add(new CuiLabel
            {
                Text =
                {
                    Align = TextAnchor.MiddleCenter,
                    Color = "0.67 0.74 0.88 1.00",
                    Text = ConVar.Server.hostname.ToUpper(),
                    FontSize = 15
                },
                RectTransform =
                {
                    AnchorMin = "0 0",
                    AnchorMax = "1 1"
                }
            }, $"{UIParent}.ServerName");

            ui.Add(new CuiButton
            {
                Button =
                {
                    Close = UIParent,
                    Color = "0.84 0.47 0.47 0.24"
                },
                Text =
                {
                    Align = TextAnchor.MiddleCenter,
                    FontSize = 15,
                    Text = lang.GetMessage("EXIT", this, player.UserIDString)
                },
                RectTransform =
                {
                    AnchorMin = "0.8760417 0.8648148",
                    AnchorMax = "0.959375 0.9333336"
                }
            }, UIParent);

            CuiHelper.DestroyUi(player, UIParent);
            CuiHelper.AddUi(player, ui);
            DrawUI_Categories(player, "metal.facemask");
        }

        private void DrawUI_Categories(BasePlayer player, string Category)
        {
            var ui = new CuiElementContainer();

            var y = 0;
            foreach (var item in _config.CraftSettings.CraftItems)
            {
                CuiHelper.DestroyUi(player, $"{UIParent}.Button.{y}");
                ui.Add(new CuiElement
                {
                    Name = $"{UIParent}.Button.{y}",
                    Parent = UIParent,
                    Components =
                    {
                        new CuiRawImageComponent
                        {
                            Png = GetImage(item.Shortname == Category
                                ? "UI.CraftSystem.Button.Active"
                                : "UI.CraftSystem.Button")
                        },
                        new CuiRectTransformComponent
                        {
                            AnchorMin = $"0.040625 {0.6916667 - (y * 0.0868819166666667)}",
                            AnchorMax = $"0.2916667 {0.7703702 - (y * 0.0868819166666667)}"
                        }
                    }
                });

                var name = " ";
                if (lang.GetLanguage(player.UserIDString) == "ru") name = item.DisplayName;
                if (lang.GetLanguage(player.UserIDString) == "en") name = item.DisplayNameEng;
                ui.Add(new CuiButton
                {
                    Button =
                    {
                        Command = $"craft.select {item.Shortname}",
                        Color = "0 0 0 0"
                    },
                    Text =
                    {
                        Align = TextAnchor.MiddleCenter,
                        FontSize = 15,
                        Color = "0.67 0.74 0.88 1.00",
                        Text = name
                    },
                    RectTransform =
                    {
                        AnchorMin = "0 0",
                        AnchorMax = "1 1"
                    }
                }, $"{UIParent}.Button.{y}");
                y++;
            }

            CuiHelper.AddUi(player, ui);
        }

        private void DrawUI_SelectItem(BasePlayer player, CraftItem item)
        {
            var ui = new CuiElementContainer
            {
                new CuiElement
                {
                    Name = $"{UIParent}.Description",
                    Parent = UIParent,
                    Components =
                    {
                        new CuiRawImageComponent
                        {
                            Png = GetImage("UI.CraftSystem.Description")
                        },
                        new CuiRectTransformComponent
                        {
                            AnchorMin = "0.7083334 0.162037",
                            AnchorMax = "0.871875 0.7777778"
                        }
                    }
                },
                new CuiElement
                {
                    Name = $"{UIParent}.Item.Icon",
                    Parent = UIParent,
                    Components =
                    {
                        new CuiRawImageComponent
                        { 
                            Color = "1 1 1 1",
                            Png = (string) ImageLibrary.Call("GetImage", $"{item.Shortname}_{item.SkinID}")
                        },
                        new CuiRectTransformComponent
                        {
                            AnchorMin = "0.3666667 0.262963",
                            AnchorMax = "0.6333333 0.7370371"
                        }
                    }
                },
                {
                    new CuiLabel
                    {
                        Text =
                        {
                            Align = TextAnchor.UpperLeft,
                            FontSize = 15,
                            Color = "0.67 0.74 0.88 1.00",
                            Text = $"{lang.GetMessage(item.Shortname, this, player.UserIDString)}",
                            Font = "robotocondensed-regular.ttf"
                        },
                        RectTransform =
                        {
                            AnchorMin = "0.1 0.05",
                            AnchorMax = "0.9 0.95"
                        }
                    },
                    $"{UIParent}.Description", $"{UIParent}.Item.Description"
                },
                new CuiElement
                {
                    Name = $"{UIParent}.Item.Craft",
                    Parent = UIParent,
                    Components =
                    {
                        new CuiRawImageComponent
                        {
                            Color = "1 1 1 1",
                            Png = GetImage("UI.CraftSystem.Craft")
                        },
                        new CuiRectTransformComponent
                        {
                            AnchorMin = "0.3927083 0.03703703",
                            AnchorMax = "0.6072916 0.1296296"
                        }
                    }
                },
                {
                    new CuiButton
                    {
                        Button =
                        {
                            Command = $"craft.item {item.Shortname}",
                            Color = "0 0 0 0"
                        },
                        Text =
                        {
                            Align = TextAnchor.MiddleCenter,
                            FontSize = 25,
                            Text = lang.GetMessage("CRAFT", this, player.UserIDString),
                            Color = "0.67 0.74 0.88 1.00"
                        },
                        RectTransform =
                        {
                            AnchorMin = "0 0",
                            AnchorMax = "1 0.95"
                        }
                    },
                    $"{UIParent}.Item.Craft", $"{UIParent}.Item.Craft.Button"
                }
            };


            var ry = 0;
            foreach (var ritem in item.RequiredItems)
            {
                ui.Add(new CuiElement
                {
                    Name = $"{UIParent}.Item.Craft.{ry}",
                    Parent = UIParent,
                    Components =
                    {
                        new CuiRawImageComponent
                        {
                            Color = "1 1 1 1",
                            Png = GetImage("UI.CraftSystem.RequiredItem")
                        },
                        new CuiRectTransformComponent
                        {
                            AnchorMin = $"0.876041 {0.6287037 - ry * 0.1555545}",
                            AnchorMax = $"0.959375 {0.7777778 - ry * 0.1555545}"
                        }
                    }
                });

                var color = GetAvalibleItem(player, ritem.Shortname, ritem.Count, ritem.SkinID)
                    ? "0.67 0.74 0.88 1"
                    : "0.84 0.47 0.47 1";

                ui.Add(new CuiLabel
                {
                    Text =
                    {
                        Align = TextAnchor.MiddleCenter,
                        FontSize = 11,
                        Color = color,
                        Text = $"{ritem.DisplayName} x{ritem.Count}",
                        Font = "robotocondensed-regular.ttf"
                    },
                    RectTransform =
                    {
                        AnchorMin = "0 0",
                        AnchorMax = "1 0.2"
                    }
                }, $"{UIParent}.Item.Craft.{ry}");

                ui.Add(new CuiElement
                {
                    Parent = $"{UIParent}.Item.Craft.{ry}",
                    Components =
                    { 
                        new CuiRawImageComponent
                        {
                            Color = "1 1 1 1",
                            Png = (string) ImageLibrary.Call("GetImage", ritem.Shortname, ritem.SkinID)
                        },
                        new CuiRectTransformComponent
                        {
                            AnchorMin = "0.15 0.15",
                            AnchorMax = "0.85 0.85"
                        }
                    }
                });
                ry++;
            }

            CuiHelper.DestroyUi(player, $"{UIParent}.Item.Icon");
            CuiHelper.DestroyUi(player, $"{UIParent}.Description");
            CuiHelper.DestroyUi(player, $"{UIParent}.Item.Craft.Button");
            CuiHelper.DestroyUi(player, $"{UIParent}.Item.Craft");
            for (var i = 0; i <= 4; i++)
            {
                CuiHelper.DestroyUi(player, $"{UIParent}.Item.Craft.{i}");
            }

            CuiHelper.AddUi(player, ui);
            DrawUI_Categories(player, item.Shortname);
        }

        #endregion

        #region [Hooks] / [Крюки]

        // ReSharper disable once UnusedMember.Local
        private void OnServerInitialized()
        {
            ServerMgr.Instance.StartCoroutine(LoadImages());
            var image = new KeyValuePair<string, ulong>("ducttape", 2814895972);
            var list = new List<KeyValuePair<string, ulong>> {image};
            ImageLibrary.Call("LoadImageList", Name, list);
        }

        #endregion

        #region [Commands] / [Команды]

        [ChatCommand("craft")]
        // ReSharper disable once UnusedMember.Local
        private void OpenCraft(BasePlayer player)
        {
            DrawUI_Main(player);
            DrawUI_SelectItem(player, _config.CraftSettings.CraftItems[0]);
        }

        [ConsoleCommand("craft.select")]
        // ReSharper disable once UnusedMember.Local
        private void SelectItemCMD(ConsoleSystem.Arg args)
        {
            if (args.Player() == null) return;
            var player = args.Player();
            if (args.Args.Length < 1) return;
            var item = args.Args[0];
            var obj = _config.CraftSettings.CraftItems.Find(x => x.Shortname == item);
            DrawUI_SelectItem(player, obj);
        }

        [ConsoleCommand("craft.item")]
        // ReSharper disable once UnusedMember.Local
        private void CraftItemCMD(ConsoleSystem.Arg args)
        {
            if (args.Player() == null) return;
            var player = args.Player();
            Craft(player, _config.CraftSettings.CraftItems.Find(x => x.Shortname == args.Args[0]));
        }

        [ConsoleCommand("craft.close")]
        // ReSharper disable once UnusedMember.Local
        private void CloseCraft(ConsoleSystem.Arg args)
        {
            CuiHelper.DestroyUi(args.Player(), UIParent);
        }

        #endregion

        #region [Helpers] / [Вспомогательный код]

        private static void Craft(BasePlayer player, CraftItem craftItem)
        {
            var list = (from ritem in craftItem.RequiredItems
                where GetAvalibleItem(player, ritem.Shortname, ritem.Count, ritem.SkinID)
                select player.inventory.FindItemID(craftItem.Shortname)).ToList();

            if (list.Count < 4) return;
            foreach (var critem in craftItem.RequiredItems)
                player.inventory.Take(null, ItemManager.FindItemDefinition(critem.Shortname).itemid, critem.Count);


            var item = ItemManager.CreateByName(craftItem.Shortname, craftItem.Count);
            item.name = craftItem.Shortname;
            item.skin = craftItem.SkinID;
            player.GiveItem(item);
            player.ChatMessage($"Crafted : {craftItem.DisplayName}");
            CuiHelper.DestroyUi(player, UIParent);
        }

        private static bool GetAvalibleItem(BasePlayer player, string shortname, int count, ulong skinid)
        {
            var item = player.inventory.FindItemID(shortname);
            if (item == null) return false;
            if (item.skin != skinid) return false;
            return item.amount >= count;
        }

        private IEnumerator LoadImages()
        {
            ImageLibrary.Call("AddImage", "https://i.imgur.com/fQgrkDH.png", "ducctape.2814895972");
            foreach (var image in Images)
            {
                ImageLibrary.Call("AddImage", image.Value, image.Key);
                yield return wait;
            }

            foreach (var item in _config.CraftSettings.CraftItems)
            {
                ImageLibrary.Call("AddImage", item.Image, $"{item.Shortname}_{item.SkinID}");
                yield return wait;
            } 

            yield return 0;
        }

        private string GetImage(string name)
        {
            return (string) ImageLibrary.Call("GetImage", name);
        }

        #endregion
    }
}

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