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

FREE Sklad : 1.0.2 1.0.2

Нет прав для скачивания
C#:
using Newtonsoft.Json;
using Oxide.Core.Plugins;
using Oxide.Game.Rust.Cui;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using UnityEngine;



namespace Oxide.Plugins
{

    [Info("Sklad", "15FPS", "1.0.2")]
    class Sklad : RustPlugin
    {
        [PluginReference] private Plugin ImageLibrary;
        private static Sklad instance;
        private const string storageLayer = "Storage";
        private static PluginData _data;

        private void SaveData() => Oxide.Core.Interface.Oxide.DataFileSystem.WriteObject(Name, _data);

        private void LoadData()
        {
            try
            {
                _data = Oxide.Core.Interface.Oxide.DataFileSystem.ReadObject<PluginData>(Name);
            }
            catch (Exception e)
            {
                PrintError(e.ToString());
            }

            if (_data == null) _data = new PluginData();
        }

        private class PluginData
        {
            [JsonProperty(PropertyName = "Players Data", ObjectCreationHandling = ObjectCreationHandling.Replace)]
            public Dictionary<ulong, List<DataItem>> PlayersData = new Dictionary<ulong, List<DataItem>>();
        }

        public class DataItem
        {
            [JsonProperty(PropertyName = "Тип предмета")]
            public ItemTypes Type;

            [JsonProperty(PropertyName = "Предмет")]
            public ItemClass item;

            [JsonProperty(PropertyName = "Команда")]
            public string Command;

            [JsonProperty(PropertyName = "Отображаемое имя (если ковычки - дефолт из игры)")]
            public string DisplayName;

            [JsonProperty(PropertyName = "Количество")]
            public int Amount;

            [JsonProperty(PropertyName = "Картинка (если пусто - по шортнейму)")]
            public string ImageURL;

            public Item ToItem()
            {
                var newItem = ItemManager.CreateByName(item.ShortName, Amount, item.SkinID);

                if (newItem == null)
                {
                    instance?.PrintError($"Error creating item with shortname '{item.ShortName}'");
                    return null;
                }

                if (!string.IsNullOrEmpty(DisplayName)) newItem.name = DisplayName;
                return newItem;
            }

            public void GiveCmd(BasePlayer player)
            {
                string command = Command.Replace("\n", "|")
                    .Replace("%steamid%", player.UserIDString, StringComparison.OrdinalIgnoreCase).Replace("%username%",
                        player.displayName, StringComparison.OrdinalIgnoreCase);
                instance?.Server.Command(command);
            }
        }
        public enum ItemTypes
        {
            Item,
            Command
        }
        public class ItemClass
        {
            [JsonProperty(PropertyName = "Короткое название предмета")]
            public string ShortName;

            [JsonProperty(PropertyName = "Skin ID предмета")]
            public ulong SkinID;
        }
        private static List<DataItem> GetUserData(ulong userID)
        {
            if (!_data.PlayersData.ContainsKey(userID))
                _data.PlayersData.Add(userID, new List<DataItem>());

            return _data.PlayersData[userID];
        }

        private void CmdChatOpenStorage(BasePlayer player, string command, string[] args)
        {
            StorageUI(player);
        }
        private string GetMessage(string messageKey, string playerID, params object[] args) => string.Format(lang.GetMessage(messageKey, this, playerID), args);
        [ChatCommand($"sklad")]
        void CmdChatOpenStoragjjjde(BasePlayer player, string command, string[] args)
        {
            StorageUI(player);
        }
        private void StorageUI(BasePlayer player, int page = 0)
        {
            var userData = GetUserData(player.userID);
            if (userData == null) return;

            var container = new CuiElementContainer();

            container.Add(new CuiPanel
            {
                CursorEnabled = true,
                RectTransform =
                    {AnchorMin = "0.5 0.5", AnchorMax = "0.5 0.5", OffsetMin = "-450 -255", OffsetMax = "450 255"},
                Image = { Color = "0.024 0.017 0.17 0.76" }
            }, "Overlay", storageLayer);
            container.Add(new CuiButton
            {
                RectTransform = { AnchorMin = "10 10", AnchorMax = "-10 -10" },
                Text = { Text = "" },
                Button = { Color = "0 0 0 0", Close = storageLayer }
            }, storageLayer);

            container.Add(new CuiLabel
            {
                RectTransform = { AnchorMin = "0 1", AnchorMax = "1 1", OffsetMin = "40 -65", OffsetMax = "-40 0" },
                Text =
                {
                    Text = GetMessage("UI.Storage", player.UserIDString), FontSize = 38,
                    Align = TextAnchor.MiddleCenter
                }
            }, storageLayer, storageLayer + ".Logo");

            container.Add(new CuiPanel
            {
                RectTransform = { AnchorMin = "0 0", AnchorMax = "1 0", OffsetMax = "0 1" },
                Image = { Color = "1 1 1 1" }
            }, storageLayer + ".Logo", storageLayer + ".Logo.Line");
            container.Add(new CuiElement
            {
                Name = storageLayer + ".Logo.Image",
                Parent = storageLayer + ".Logo",
                Components =
                {
                    new CuiImageComponent {Png = ImageLibrary.Call<string>("GetImage", "ME_Logo_image")},
                    new CuiRectTransformComponent
                        {AnchorMin = "0.5 0.5", AnchorMax = "0.5 0.5", OffsetMin = "-142 -26", OffsetMax = "-90 26"}
                }
            });

            if (userData.Count > 0)
            {
                var items = userData.Skip(page * 32).Take(32).ToList();

                var tempList = items.Take(8).ToList();
                var ySwitch = 180;
                var xSwitch = -(((10 * (tempList.Count - 1)) + 90 * tempList.Count) / 2);
                for (int i = 0; i < items.Count; i++)
                {
                    var item = items[i];
                    if (item == null) continue;

                    container.Add(new CuiPanel
                    {
                        RectTransform =
                        {
                            AnchorMin = "0.5 0.5", AnchorMax = "0.5 0.5", OffsetMin = $"{xSwitch} {ySwitch - 90}",
                            OffsetMax = $"{xSwitch + 90} {ySwitch}"
                        },
                        Image = { Color = "0.64 0.62 1 0.3" }
                    }, storageLayer, storageLayer + $".Item.{i}");

                    container.Add(new CuiElement
                    {
                        Parent = storageLayer + $".Item.{i}",
                        Components =
                        {
                            new CuiRawImageComponent
                            {
                                Png = ImageLibrary.Call<string>("GetImage",
                                    !string.IsNullOrEmpty(item.ImageURL) ? item.ImageURL : item.item.ShortName)
                            },
                            new CuiRectTransformComponent {AnchorMin = "0 0", AnchorMax = "1 1"}
                        }
                    });

                    container.Add(new CuiButton
                    {
                        RectTransform = { AnchorMin = "0 0", AnchorMax = "1 1" },
                        Text = { Text = "" },
                        Button =
                        {
                            Command = $"Sklad openmodal {page} {userData.IndexOf(item)}", Color = "0 0 0 0"
                        }
                    }, storageLayer + $".Item.{i}");

                    xSwitch += 100;

                    if ((i + 1) % 8 == 0)
                    {
                        ySwitch -= 100;
                        tempList = items.Skip(8).Take(8).ToList();
                        xSwitch = -(((10 * (tempList.Count - 1)) + 90 * tempList.Count) / 2);
                    }
                }

                container.Add(new CuiButton
                {
                    RectTransform = { AnchorMin = "0 0", AnchorMax = "0 0", OffsetMin = "40 10", OffsetMax = "120 35" },
                    Button = { Color = "0 0 0 0", Command = page - 1 >= 0 ? $"Sklad modalpage {page - 1}" : "" },
                    Text =
                    {
                        Text = GetMessage("UI.Back", player.UserIDString), FontSize = 20, Align = TextAnchor.LowerLeft,
                        Font = "robotocondensed-bold.ttf"
                    }
                }, storageLayer);
                container.Add(new CuiButton
                {
                    RectTransform = { AnchorMin = "1 0", AnchorMax = "1 0", OffsetMin = "-120 10", OffsetMax = "-40 35" },
                    Button =
                    {
                        Color = "0 0 0 0",
                        Command = userData.Count > (page + 1) * 32 ? $"Sklad modalpage {page + 1}" : ""
                    },
                    Text =
                    {
                        Text = GetMessage("UI.Next", player.UserIDString), FontSize = 20, Align = TextAnchor.LowerRight,
                        Font = "robotocondensed-bold.ttf"
                    }
                }, storageLayer);
            }
            else
            {
                container.Add(new CuiLabel
                {
                    RectTransform = { AnchorMin = "0 0", AnchorMax = "1 1" },
                    Text =
                    {
                        Text = GetMessage("UI.StorageEmpty", player.UserIDString), FontSize = 38,
                        Align = TextAnchor.MiddleCenter, Font = "robotocondensed-bold.ttf"
                    }
                }, storageLayer);
            }

            CuiHelper.DestroyUi(player, storageLayer);
            CuiHelper.AddUi(player, container);
        }
        private const string modalLayer = ".Modal.Give";

        private void ModalGiveUI(BasePlayer player, int page, int itemid)
        {
            if (player == null) return;

            var data = GetUserData(player.userID);
            if (data == null || itemid < 0 || data.Count <= itemid) return;
            var item = data[itemid];
            if (item == null) return;

            var container = new CuiElementContainer();

            container.Add(new CuiButton
            {
                RectTransform = { AnchorMin = "0 0", AnchorMax = "1 1" },
                Button = { Close = modalLayer, Color = "0 0 0 0.95" },
                Text = { Text = "" }
            }, "Overlay", modalLayer);

            container.Add(new CuiPanel
            {
                RectTransform =
                    {AnchorMin = "0.5 0.5", AnchorMax = "0.5 0.5", OffsetMin = "-150 -200", OffsetMax = "150 200"},
                Image = { Color = "0.71 0.69 1 0.3" }
            }, modalLayer, modalLayer + ".Main");

            container.Add(new CuiElement
            {
                Parent = modalLayer + ".Main",
                Components =
                {
                    new CuiRawImageComponent
                    {
                        Png = ImageLibrary.Call<string>("GetImage",
                            !string.IsNullOrEmpty(item.ImageURL) ? item.ImageURL : item.item.ShortName)
                    },
                    new CuiRectTransformComponent
                        {AnchorMin = "0.5 0.75", AnchorMax = "0.5 0.75", OffsetMin = "-64 -64", OffsetMax = "64 64"}
                }
            });

            var itemInfo = !string.IsNullOrEmpty(item.DisplayName)
                ? item.DisplayName
                : ItemManager.FindItemDefinition(item.item.ShortName)?.displayName.translated ?? "";

            container.Add(new CuiLabel
            {
                RectTransform = { AnchorMin = "0.1 0", AnchorMax = "1 0.45" },
                Text =
                {
                    Text = GetMessage("MODAL.ItemInfo", player.UserIDString, itemInfo, item.Amount),
                    Align = TextAnchor.UpperLeft, FontSize = 18, Color = "1 1 1 1",
                    Font = "robotocondensed-bold.ttf"
                }
            }, modalLayer + ".Main");

            container.Add(new CuiButton
            {
                RectTransform =
                    {AnchorMin = "0.5 0", AnchorMax = "0.5 0", OffsetMin = "-100 20", OffsetMax = "100 70"},
                Button = { Command = $"Sklad giveitem {page} {itemid}", Color = "1 1 1 0.3" },
                Text =
                {
                    Text = GetMessage("MODAL.Give", player.UserIDString), Align = TextAnchor.MiddleCenter,
                    FontSize = 18, Color = "1 1 1 1", Font = "robotocondensed-bold.ttf"
                }
            }, modalLayer + ".Main");

            CuiHelper.DestroyUi(player, modalLayer);
            CuiHelper.AddUi(player, container);
        }
        [ConsoleCommand("add")]
        private void cmdg(ConsoleSystem.Arg arg)
        {
            switch (arg.Args[0].ToLower())
            {
                
                
                case "item":
                    //add item 76561199032370579 wood 666 0
                    {

                        var players = arg.Args[1];
                        string convertPlayer = players;
                        var d = _data;
                        ulong UserID = Convert.ToUInt64(convertPlayer);
                        var item = arg.Args[2];
                        var amounts = arg.Args[3];
                        string convertamounts = amounts;
                        int amount = Convert.ToInt32(convertamounts);
                        var skins = arg.Args[4];
                        string convertskins = skins;
                        ulong SkinID = Convert.ToUInt64(convertskins);
                        if (d.PlayersData.ContainsKey(UserID))
                        {
                            d.PlayersData[UserID].Add(new DataItem
                            {
                                Command = string.Empty,
                                item = new ItemClass { ShortName = item, SkinID = SkinID },
                                Amount = amount,
                                Type = ItemTypes.Item,
                                DisplayName = string.Empty,
                                ImageURL = string.Empty,
                            });
                            SaveData();
                            return;
                        }
                        d.PlayersData.Add(UserID, new List<DataItem>());
                        SaveData();
                        Server.Command($"add item {UserID} {item} {amount} {SkinID}");
                        break;
                    }
                case "command":
                    // add command 76561199032370579 https://i.imgur.com/AL8UVUS.png bigBOI give %STEAMID% wood.use 7d
                    {
                        var players = arg.Args[1];
                        string convertPlayer = players;
                        var d = _data;
                        ulong UserID = Convert.ToUInt64(convertPlayer);
                        var url = arg.Args[2];
                        var name = arg.Args[3];



                        var msg = string.Empty;
                        for (var i = 4; i < arg.Args.Length; i++)
                             msg = $"{msg} {arg.Args[i]}";
                        if (d.PlayersData.ContainsKey(UserID))
                        {
                            d.PlayersData[UserID].Add(new DataItem
                            {
                                Command = msg,
                                item = new ItemClass { ShortName = string.Empty, SkinID = 0 },
                                Amount = 0,
                                Type = ItemTypes.Command,
                                DisplayName = name,
                                ImageURL = url,
                            });

                            SaveData();
                            return;
                        }
                        d.PlayersData.Add(UserID, new List<DataItem>());
                        SaveData();
                        Server.Command($"add command {UserID} {url} {name} {msg}");
                        break;
                    }
                
            }
        }
        [ConsoleCommand("Sklad")]
        private void CmdConsole(ConsoleSystem.Arg args)
        {
            var player = args.Player();
            if (player == null) return;

            if (!args.HasArgs())
            {
                player.SendConsoleCommand("chat.say /sklad");
                return;
            }

            switch (args.Args[0].ToLower())
            {
                case "openmodal":
                    {
                        int page, itemid = 0;
                        if (!args.HasArgs(3) || !int.TryParse(args.Args[1], out page) ||
                            !int.TryParse(args.Args[2], out itemid)) return;
                        ModalGiveUI(player, page, itemid);
                        break;
                    }
                case "modalpage":
                    {
                        var page = 0;
                        if (!args.HasArgs(2) || !int.TryParse(args.Args[1], out page)) return;
                        StorageUI(player, page);
                        break;
                    }
                case "giveitem":
                    {
                        int page, itemid = 0;
                        if (!args.HasArgs(3) || !int.TryParse(args.Args[1], out page) ||
                            !int.TryParse(args.Args[2], out itemid)) return;
                        var dataItems = GetUserData(player.userID);
                        if (dataItems == null) return;

                        if (itemid >= 0 && dataItems.Count > itemid)
                        {
                            var item = dataItems[itemid];

                            if (item == null)
                            {
                                PrintError("Error getting item from data");
                                return;
                            }

                            GiveItem(player, item);
                        }

                        CuiHelper.DestroyUi(player, modalLayer);

                        StorageUI(player);
                        break;
                    }
            }
        }
        private void GiveItem(BasePlayer player, DataItem item)
        {
            var userData = GetUserData(player.userID);
            if (userData == null) return;

            if (item.Type == ItemTypes.Command)
            {
                item.GiveCmd(player);
            }
            else
            {
                var toItem = item.ToItem();
                if (toItem != null)
                {
                    player.GiveItem(toItem, BaseEntity.GiveItemReason.PickedUp);
                }
                else
                {
                    SendReply(player, GetMessage("ErrorItemCreating", player.UserIDString));
                }
            }

            if (userData.Contains(item))
                userData.Remove(item);

            SaveData();
        }
        private void OnServerInitialized() 
        {
            LoadData();
            PrintWarning("  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
            PrintWarning($"     {Name} v{Version} loading");
            if (!ImageLibrary)
            {
                PrintError("   Install plugin: 'ImageLibrary'");
                Core.Interface.Oxide.UnloadPlugin(Title);
                return;
            }

            PrintWarning("        Plugin loaded - OK");
            PrintWarning("  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");

            ImageLibrary.Call("AddImage", "https://i.imgur.com/Okt1BMH.png", "ME_Background_image");
            ImageLibrary.Call("AddImage", "https://i.imgur.com/DpLldC8.png", "ME_Logo_image");
            foreach (var img in _data.PlayersData.SelectMany(p => p.Value))
            {
                if (!string.IsNullOrEmpty(img.ImageURL))
                    ImageLibrary.Call("AddImage", img.ImageURL, img.ImageURL);
            }

        }















        protected override void LoadDefaultMessages()
        {
            lang.RegisterMessages(new Dictionary<string, string>
            {
                {"UI.Back", "<b>BACK</b>"},
                {"UI.Next", "<b>NEXT</b>"},
                {"UI.Storage", "<b>STORAGE</b>"},
                {"UI.StorageEmpty", "<b>STORAGE IS EMPTY</b>"},
                {"MODAL.Give", "<b>TAKE</b>"},
                {"MODAL.ItemInfo", "Name: {0}\n\nAmount: {1}"},
            }, this);
            lang.RegisterMessages(new Dictionary<string, string>
            {
                
                {"UI.Back", "<b>НАЗАД</b>"},
                {"UI.Next", "<b>ДАЛЕЕ</b>"},
                {"UI.Storage", "<b>СКЛАД</b>"},
                {"UI.StorageEmpty", "<b>СКЛАД ПУСТ</b>"},
                {"MODAL.Give", "<b>ЗАБРАТЬ</b>"},
                {"MODAL.ItemInfo", "Название: {0}\n\nКоличество: {1}"},

            }, this, "ru");
        }
    }
}

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