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

FREE Backpacks : 1.2.0 1.2.0

Нет прав для скачивания
C#:
// Все права принадлежат дискорд сообществу https://discord.gg/VgNHPpNrz6
using System.Collections.Generic;
using Newtonsoft.Json;
using UnityEngine;
using Oxide.Core;
using System.Linq;
using System;
namespace Oxide.Plugins {
    [Info("Backpacks", "LaserHydra", "1.2.0", ResourceId = 1408)]
    [Description("Allows players to have Backpacks which provides them extra inventory space.")]
    class Backpacks : RustPlugin {
        ////////////////////////////////////////
        ///     UI Builder
        ////////////////////////////////////////
        class UIColor {
            double red;
            double green;
            double blue;
            double alpha;
            public UIColor(double red, double green, double blue, double alpha) {
                this.red = red;
                this.green = green;
                this.blue = blue;
                this.alpha = alpha;
            }
            public string GetString() {
                return $"{red.ToString()} {green.ToString()} {blue.ToString()} {alpha.ToString()}";
            }
        }
        class UIObject {
            List<object> ui = new List<object>();
            List<string> objectList = new List<string>();
            public UIObject() {
            }
            string RandomString() {
                string chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
                List<char> charList = chars.ToList();
                string random = "";
                for (int i = 0; i <= UnityEngine.Random.Range(5, 10);
                i++) random = random + charList[UnityEngine.Random.Range(0, charList.Count - 1)];
                return random;
            }
            public void Draw(BasePlayer player) {
                CommunityEntity.ServerInstance.ClientRPCEx(new Network.SendInfo() {
                    connection = player.net.connection
                }
                , null, "AddUI", new Facepunch.ObjectList(JsonConvert.SerializeObject(ui).Replace("{NEWLINE}", Environment.NewLine)));
            }
            public void Destroy(BasePlayer player) {
                foreach(string uiName in objectList) CommunityEntity.ServerInstance.ClientRPCEx(new Network.SendInfo() {
                    connection = player.net.connection
                }
                , null, "DestroyUI", new Facepunch.ObjectList(uiName));
            }
            public string AddPanel(string name, double left, double top, double width, double height, UIColor color, bool mouse = false, string parent = "HUD/Overlay") {
                name = name + RandomString();
                string type = "";
                if (mouse) type = "NeedsCursor";
                ui.Add(new Dictionary<string, object> {
                    {
                        "name", name
                    }
                    , {
                        "parent", parent
                    }
                    , {
                        "components", new List<object> {
                            new Dictionary<string, string> {
                                {
                                    "type", "UnityEngine.UI.Image"
                                }
                                , {
                                    "color", color.GetString()
                                }
                            }
                            , new Dictionary<string, string> {
                                {
                                    "type", "RectTransform"
                                }
                                , {
                                    "anchormin", $"{left.ToString()} {((1 - top) - height).ToString()}"
                                }
                                , {
                                    "anchormax", $"{(left + width).ToString()} {(1 - top).ToString()}"
                                }
                            }
                            , new Dictionary<string, string> {
                                {
                                    "type", type
                                }
                            }
                        }
                    }
                }
                );
                objectList.Add(name);
                return name;
            }
            public string AddText(string name, double left, double top, double width, double height, UIColor color, string text, int textsize = 15, string parent = "HUD/Overlay", int alignmode = 0) {
                name = name + RandomString();
                text = text.Replace("\n", "{NEWLINE}");
                string align = "";
                switch (alignmode) {
                    case 0 : {
                        align = "LowerCenter";
                        break;
                    }
                    ;
                    case 1 : {
                        align = "LowerLeft";
                        break;
                    }
                    ;
                    case 2 : {
                        align = "LowerRight";
                        break;
                    }
                    ;
                    case 3 : {
                        align = "MiddleCenter";
                        break;
                    }
                    ;
                    case 4 : {
                        align = "MiddleLeft";
                        break;
                    }
                    ;
                    case 5 : {
                        align = "MiddleRight";
                        break;
                    }
                    ;
                    case 6 : {
                        align = "UpperCenter";
                        break;
                    }
                    ;
                    case 7 : {
                        align = "UpperLeft";
                        break;
                    }
                    ;
                    case 8 : {
                        align = "UpperRight";
                        break;
                    }
                    ;
                }
                ui.Add(new Dictionary<string, object> {
                    {
                        "name", name
                    }
                    , {
                        "parent", parent
                    }
                    , {
                        "components", new List<object> {
                            new Dictionary<string, string> {
                                {
                                    "type", "UnityEngine.UI.Text"
                                }
                                , {
                                    "text", text
                                }
                                , {
                                    "fontSize", textsize.ToString()
                                }
                                , {
                                    "color", color.GetString()
                                }
                                , {
                                    "align", align
                                }
                            }
                            , new Dictionary<string, string> {
                                {
                                    "type", "RectTransform"
                                }
                                , {
                                    "anchormin", $"{left.ToString()} {((1 - top) - height).ToString()}"
                                }
                                , {
                                    "anchormax", $"{(left + width).ToString()} {(1 - top).ToString()}"
                                }
                            }
                        }
                    }
                }
                );
                objectList.Add(name);
                return name;
            }
            public string AddButton(string name, double left, double top, double width, double height, UIColor color, string command = "", string parent = "HUD/Overlay", string closeUi = "") {
                name = name + RandomString();
                ui.Add(new Dictionary<string, object> {
                    {
                        "name", name
                    }
                    , {
                        "parent", parent
                    }
                    , {
                        "components", new List<object> {
                            new Dictionary<string, string> {
                                {
                                    "type", "UnityEngine.UI.Button"
                                }
                                , {
                                    "close", closeUi
                                }
                                , {
                                    "command", command
                                }
                                , {
                                    "color", color.GetString()
                                }
                                , {
                                    "imagetype", "Tiled"
                                }
                            }
                            , new Dictionary<string, string> {
                                {
                                    "type", "RectTransform"
                                }
                                , {
                                    "anchormin", $"{left.ToString()} {((1 - top) - height).ToString()}"
                                }
                                , {
                                    "anchormax", $"{(left + width).ToString()} {(1 - top).ToString()}"
                                }
                            }
                        }
                    }
                }
                );
                objectList.Add(name);
                return name;
            }
        }
        UIObject ui = new UIObject();
        public Dictionary<string, BaseEntity> activeBackpacks = new Dictionary<string, BaseEntity>();
        string backpackEntity = "assets/prefabs/deployable/woodenbox/woodbox_deployed.prefab";
        ////////////////////////////////////////
        ///	 Data File Handling
        ////////////////////////////////////////
        Dictionary<string, Backpack> backpacks;
        void LoadData() {
            backpacks = Interface.GetMod().DataFileSystem.ReadObject<Dictionary<string, Backpack>>("Backpack_Data");
        }
        void SaveData() {
            Interface.GetMod().DataFileSystem.WriteObject("Backpack_Data", backpacks);
        }
        ////////////////////////////////////////
        ///	 Classes
        ////////////////////////////////////////
        class BackpackItem {
            public int amount;
            public int skinid;
            public int slot;
            public int itemid;
            public bool blueprint;
        }
        class Backpack {
            public List<BackpackItem> items = new List<BackpackItem>();
        }
        ////////////////////////////////////////
        ///	 On Plugin Loaded
        ////////////////////////////////////////
        void Loaded() {
            if(!permission.PermissionExists("backpack.use")) permission.RegisterPermission("backpack.use", this);
            LoadData();
            LoadConfig();
            if((int)Config["Settings", "Backpack Size (1-3)"] == 1) backpackEntity = "assets/prefabs/deployable/small stash/small_stash_deployed.prefab";
            else if((int)Config["Settings", "Backpack Size (1-3)"] == 3) backpackEntity = "assets/prefabs/deployable/large wood storage/box.wooden.large.prefab";
            if((bool) Config["Settings", "Use UI"]) ui.AddText("backpackButtonText", 0, 0, 1, 1, new UIColor(1, 1, 1, 1), "<b>Backpack</b>", 20, ui.AddButton("backpackButton", 0.01, 0.95, 0.10, 0.03, new UIColor(0.45, 0.6, 0.2, 0.9), "backpack.open"), 3);
            foreach (BasePlayer player in BasePlayer.activePlayerList) ui.Draw(player);
        }
        ////////////////////////////////////////
        ///     Config Handling
        ////////////////////////////////////////
        void LoadConfig() {
            SetConfig("Settings", "Backpack Size (1-3)", 2);
            SetConfig("Settings", "Drop on Death", true);
            SetConfig("Settings", "Use UI", true);
            SaveConfig();
        }
        protected override void LoadDefaultConfig() {
            Puts("Generating new configfile...");
            LoadConfig();
        }
        ////////////////////////////////////////
        ///	 Death Handling
        ////////////////////////////////////////
        void OnEntityDeath(BaseCombatEntity victim, HitInfo hitInfo) {
            if(!(bool)Config["Settings", "Drop on Death"]) return;
            if(victim != null && victim.ToPlayer() != null) {
                BasePlayer player = victim.ToPlayer();
                if(backpacks.ContainsKey(player.UserIDString) && backpacks[player.UserIDString].items.Count >= 1) {
                    BaseEntity backpack = GameManager.server.CreateEntity(backpackEntity, new Vector3(player.transform.position.x, player.transform.position.y, player.transform.position.z));
                    backpack.SendMessage("SetDeployedBy", player, UnityEngine.SendMessageOptions.DontRequireReceiver);
                    backpack.Spawn(true);
                    StorageContainer loot = backpack.GetComponent<StorageContainer>();
                    foreach (BackpackItem backpackItem in backpacks[player.userID.ToString()].items) {
                        Item item = ItemManager.CreateByItemID(backpackItem.itemid, backpackItem.amount, backpackItem.blueprint, backpackItem.skinid);
                        item.MoveToContainer(loot.inventory, backpackItem.slot);
                    }
                    backpacks[player.UserIDString].items.Clear();
                    SaveData();
                    SendChatMessage(player, "Backpack", "Your Backpack was dropped at the position of your death.");
                }
            }
            else if(victim != null && activeBackpacks.ContainsValue(victim)) {
                foreach(string player in activeBackpacks.Keys) {
                    if (activeBackpacks[player] == victim) backpacks[player] = new Backpack();
                }
            }
        }
        ////////////////////////////////////////
        ///	 Commands
        ////////////////////////////////////////
        [ConsoleCommand("backpack.open")]
        void ccmdBackpack(ConsoleSystem.Arg arg) {
            if(arg != null && arg.connection != null && arg.connection.player != null) {
                BasePlayer player = (BasePlayer)arg.connection.player;
                cmdBackpack(player);
                ui.Destroy(player);
            }
        }
        [ChatCommand("backpack")]
        void cmdBackpack(BasePlayer player) {
            if(!permission.UserHasPermission(player.UserIDString, "backpack.use")) {
                SendChatMessage(player, "Backpack", "You don't' have permission to use this command!");
                return;
            }
            OpenBackpack(player);
            SendChatMessage(player, "Backpack", "Backpack opened.");
        }
        ////////////////////////////////////////
        ///	 Backpack Handling
        ////////////////////////////////////////
        void OpenBackpack(BasePlayer player) {
            if (!backpacks.ContainsKey(player.UserIDString)) backpacks.Add(player.UserIDString, new Backpack());
            BaseEntity backpack = GameManager.server.CreateEntity(backpackEntity, new Vector3(player.transform.position.x, player.transform.position.y - 1, player.transform.position.z));
            backpack.SendMessage("SetDeployedBy", player, UnityEngine.SendMessageOptions.DontRequireReceiver);
            backpack.Spawn(true);
            StorageContainer loot = backpack.GetComponent<StorageContainer>();
            foreach (BackpackItem backpackItem in backpacks[player.userID.ToString()].items) {
                Item item = ItemManager.CreateByItemID(backpackItem.itemid, backpackItem.amount, backpackItem.blueprint, backpackItem.skinid);
                item.MoveToContainer(loot.inventory, backpackItem.slot);
            }
            backpack.gameObject.AddComponent<LootingHandler>();
            loot.PlayerOpenLoot(player);
            activeBackpacks[player.UserIDString] = backpack;
        }
        void CloseBackpack(BasePlayer player) {
            string uid = player.UserIDString;
            if (activeBackpacks.ContainsKey(uid)) {
                BaseEntity box = activeBackpacks[uid] as BaseEntity;
                StorageContainer loot = box.GetComponent<StorageContainer>();
                Backpack backpack = new Backpack();
                foreach (Item item in loot.inventory.itemList) {
                    BackpackItem backpackItem = new BackpackItem();
                    backpackItem.amount = item.amount;
                    backpackItem.blueprint = item.IsBlueprint();
                    backpackItem.itemid = item.info.itemid;
                    backpackItem.skinid = item.skin;
                    backpackItem.slot = item.position;
                    backpack.items.Add(backpackItem);
                }
                backpacks[uid] = backpack;
                SaveData();
                loot.inventory.itemList.Clear();
                box.Kill();
                activeBackpacks.Remove(uid);
                SendChatMessage(player, "Backpack", "Backpack closed.");
                ui.Draw(player);
            }
        }
        ////////////////////////////////////////
        ///     UI Handling
        ////////////////////////////////////////
        void OnPlayerInit(BasePlayer player) {
            ui.Draw(player);
        }
        void OnPlayerDisconnected(BasePlayer player) {
            ui.Destroy(player);
        }
        void Unloaded() {
            foreach (BasePlayer player in BasePlayer.activePlayerList) ui.Destroy(player);
        }
        ////////////////////////////////////////
        ///     Config Setup
        ////////////////////////////////////////
        void SetConfig(string Arg1, object Arg2, object Arg3 = null, object Arg4 = null) {
            if (Arg4 == null) {
                Config[Arg1, Arg2.ToString()] = Config[Arg1, Arg2.ToString()] ?? Arg3;
            }
            else if (Arg3 == null) {
                Config[Arg1] = Config[Arg1] ?? Arg2;
            }
            else {
                Config[Arg1, Arg2.ToString(), Arg3.ToString()] = Config[Arg1, Arg2.ToString(), Arg3.ToString()] ?? Arg4;
            }
        }
        ////////////////////////////////////////
        ///	 Chat Handling
        ////////////////////////////////////////
        void BroadcastChat(string prefix, string msg = null) => PrintToChat(msg == null ? prefix : "<color=#00FF8D>" + prefix + "</color>: " + msg);
        void SendChatMessage(BasePlayer player, string prefix, string msg = null) => SendReply(player, msg == null ? prefix : "<color=#00FF8D>" + prefix + "</color>: " + msg);
        ////////////////////////////////////////
        ///	 Looting Handler
        ////////////////////////////////////////
        class LootingHandler : MonoBehaviour {
            private void PlayerStoppedLooting(BasePlayer player) {
                Interface.Oxide.RootPluginManager.GetPlugin("Backpacks").Call("CloseBackpack", player);
            }
        }
    }
}

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