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

FREE Backpack : 1.0.2 1.0.2

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

namespace Oxide.Plugins
{
    [Info("Backpack", "RustPlugin.ru / EcoSmile","1.0.2")]
    public class Backpack : RustPlugin
    {
        #region Classes

        public class BackpackBox : MonoBehaviour
        {
            public static readonly List<int> sizes = new List<int>() {6,15,30};

            StorageContainer storage;
            BasePlayer owner;

            public void Init(StorageContainer storage, BasePlayer owner)
            {
                this.storage = storage;
                this.owner = owner;
            }
            
            public static BackpackBox Spawn(BasePlayer player,  int size = 1)
            {
                player.EndLooting();
                var storage = SpawnContainer(player,size,false);
                var box = storage.gameObject.AddComponent<BackpackBox>();
                box.Init(storage, player);
                return box;
            }

            static int rayColl = LayerMask.GetMask("Construction", "Deployed", "Tree", "Terrain", "Resource", "World", "Water", "Default", "Prevent Building");

            public static StorageContainer SpawnContainer (BasePlayer player, int size, bool die)
            {
                var pos = player.transform.position;
                if (die)
                {
                    RaycastHit hit;
                    if (Physics.Raycast(new Ray(player.GetCenter(), Vector3.down), out hit, 1000, rayColl, QueryTriggerInteraction.Ignore))
                    {
                        pos = hit.point;
                    }
                }
                else
                {
                    pos -= new Vector3(0, 100, 0);
                }
                return SpawnContainer(player, size, pos);
            }


            private static StorageContainer SpawnContainer(BasePlayer player, int size, Vector3 position)
            {
                var storage = GameManager.server.CreateEntity("assets/prefabs/deployable/small stash/small_stash_deployed.prefab") as StorageContainer;
                if(storage == null) return null;
                storage.transform.position = position;
                storage.panelName = "largewoodbox";
                ItemContainer container = new ItemContainer { playerOwner = player };
                container.ServerInitialize((Item)null, sizes[size]);
                if((int)container.uid == 0)
                    container.GiveUID();
                storage.inventory = container;
                if(!storage) return null;
                storage.SendMessage("SetDeployedBy", player, (SendMessageOptions)1);
                storage.Spawn();
                return storage;
            }

            private void PlayerStoppedLooting(BasePlayer player)
            {
                Interface.Oxide.RootPluginManager.GetPlugin("Backpack").Call("BackpackHide", player.userID);
            }

            public void Close()
            {
                ClearItems();
                storage.Kill();
            }

            public void StartLoot()
            {
                storage.SetFlag(BaseEntity.Flags.Open, true, false);
                owner.inventory.loot.StartLootingEntity(storage, false);
                owner.inventory.loot.AddContainer(storage.inventory);
                owner.inventory.loot.SendImmediate();
                owner.ClientRPCPlayer(null, owner, "RPC_OpenLootPanel", storage.panelName);
                storage.DecayTouch();
                storage.SendNetworkUpdate();
            }

            public void Push(List<Item> items)
            {
                for (int i = items.Count - 1; i >= 0; i--)
                    items[i].MoveToContainer(storage.inventory);
            }

            public void ClearItems()
            {
                storage.inventory.itemList.Clear();
            }

            public List<Item> GetItems => storage.inventory.itemList.Where(i => i != null).ToList();

        }

        #endregion

        #region VARIABLES
        
        public Dictionary<ulong, BackpackBox> openedBackpacks = new Dictionary<ulong, BackpackBox>();
        public Dictionary<ulong, List<SavedItem>> savedBackpacks;
        public Dictionary<ulong, BaseEntity> visualBackpacks = new Dictionary<ulong, BaseEntity>();

        #endregion

        #region DATA

        DynamicConfigFile backpacksFile = Interface.Oxide.DataFileSystem.GetFile("Backpack_Data");

        void LoadBackpacks()
        {
            try
            {
                savedBackpacks = backpacksFile.ReadObject<Dictionary<ulong, List<SavedItem>>>();
            }
            catch (Exception)
            {
                savedBackpacks = new Dictionary<ulong, List<SavedItem>>();
            }
        }

        void SaveBackpacks() => backpacksFile.WriteObject(savedBackpacks);

        #endregion

        #region OXIDE HOOKS
        void OnEntityDeath(BaseCombatEntity ent, HitInfo info)
        {
            if (!(ent is BasePlayer)) return;
            var player = (BasePlayer) ent;
            if (PermissionService.HasPermission(player, BPIGNORE)) return;
            if (InDuel(player)) return;
            BackpackHide(player.userID);
                List<SavedItem> savedItems;
                List<Item> items = new List<Item>();
                if (savedBackpacks.TryGetValue(player.userID, out savedItems))
                {
                    items = RestoreItems(savedItems);
                    savedBackpacks.Remove(player.userID);
                }
                if (items.Count <= 0) return;
                var container = BackpackBox.SpawnContainer(player, GetBackpackSize(player), true);
                if (container == null) return;
                for (int i = items.Count - 1; i >= 0; i--)
                    items[i].MoveToContainer(container.inventory);
                timer.Once(300f, () =>
                {
                    if (container != null && !container.IsDestroyed)
                        container.Kill();
                });
                Effect.server.Run("assets/bundled/prefabs/fx/dig_effect.prefab", container.transform.position);
            
        }
        const string BPIGNORE = "backpack.ignore";
        void Loaded()
        {
            LoadBackpacks();
            PermissionService.RegisterPermissions(this, permisions);
            PermissionService.RegisterPermissions(this, new List<string>() { BPIGNORE });
        }

        void OnServerInitialized()
        {
            InitFileManager();
            ServerMgr.Instance.StartCoroutine(LoadImages());
        }

        private bool loaded = false;
        IEnumerator LoadImages()
        {
            foreach (var name in images.Keys.ToList())
            {
                yield return m_FileManager.StartCoroutine( m_FileManager.LoadFile( name, images[ name ]) );
                images[ name ] = m_FileManager.GetPng( name );
            }
            loaded = true;
            foreach (var player in BasePlayer.activePlayerList) DrawUI( player );
        }

        private Dictionary<string, string> images = new Dictionary<string, string>()
        {
            ["backpackImg"] = "http://i.imgur.com/dJs7pK3.png"
        };
        void Unload(BasePlayer player)
        {
            var keys = openedBackpacks.Keys.ToList();
            for (int i = openedBackpacks.Count - 1; i >= 0; i--)
                BackpackHide(keys[i]);
            SaveBackpacks();
            DestroyUI(player);
        }

        void OnPreServerRestart()
        {
            foreach (var dt in Resources.FindObjectsOfTypeAll<StashContainer>())
                dt.Kill();
            foreach (var ent in Resources.FindObjectsOfTypeAll<TimedExplosive>().Where(ent => ent.name == "backpack"))
                ent.KillMessage();
        }

        void OnPlayerSleepEnded(BasePlayer player)
        {
            DrawUI(player);
        }

        void OnPlayerAspectChanged(BasePlayer player)
        {
            DrawUI(player);
        }
        #endregion

        #region FUNCTIONS

        void BackpackShow(BasePlayer player)
        {
            if (BackpackHide(player.userID)) return;

            if (player.inventory.loot?.entitySource != null) return;
            
            timer.Once(0.1f, () =>
            {
                if (!player.IsOnGround())
                {
                    SendReply(player, "Нельзя открывать рюкзар к полёте!");

                    return;
                }
                List<SavedItem> savedItems;
                List<Item> items = new List<Item>();
                if (savedBackpacks.TryGetValue(player.userID, out savedItems))
                    items = RestoreItems(savedItems);
                var backpackSize = GetBackpackSize(player);
                BackpackBox box = BackpackBox.Spawn(player, backpackSize);
                openedBackpacks.Add(player.userID, box);
                if (items.Count > 0)
                    box.Push(items);
                box.StartLoot();
            });
        }

        int GetBackpackSize(BasePlayer player)
        {
            for (int i = permisions.Count-1; i >= 0; i--)
                if (PermissionService.HasPermission(player, permisions[i]) && (i == 0 || PermissionService.HasPermission(player, permisions[i-1])))
                    return i+1;
                else if (i > 0 && PermissionService.HasPermission(player, permisions[i])) return i;
            return 0;
        }
        

        [HookMethod("BackpackHide")]
        bool BackpackHide(ulong playerId)
        {
            BackpackBox box;
            if (!openedBackpacks.TryGetValue(playerId, out box)) return false;
            openedBackpacks.Remove(playerId);
            if (box == null) return false;
            var items = SaveItems(box.GetItems);
            if (items.Count > 0)
            {
                savedBackpacks[playerId] = SaveItems(box.GetItems);
                //SpawnVisual(BasePlayer.FindByID(player));
            }
            else { savedBackpacks.Remove(playerId); //RemoveVisual(BasePlayer.FindByID(player));
            }
            box.Close();
            var player = BasePlayer.FindByID(playerId);
            if (player)
                DrawUI(player);
            return true;
        }


        #endregion

         #region UI
        void DrawUI(BasePlayer player)
        {
            if (!loaded) return;
            var backpackSize = GetBackpackSize( player );

            List<SavedItem> savedItems;
            List<Item> items = new List<Item>();
            if (!savedBackpacks.TryGetValue( player.userID, out savedItems ))
                savedItems = new List<SavedItem>();
            int backpackCount = savedItems?.Count ?? 0;
            CuiHelper.DestroyUi(player, "backpack.btn" );
            CuiHelper.DestroyUi(player, "backpack.text2" );
            CuiHelper.DestroyUi(player, "backpack.text1" );
            CuiHelper.DestroyUi(player, "backpack.image" );
			if (backpackCount < BackpackBox.sizes[backpackSize] * 0.5){
			CuiHelper.DestroyUi(player, "backpack.btn" );
            CuiHelper.DestroyUi(player, "backpack.text2" );
            CuiHelper.DestroyUi(player, "backpack.text1" );
            CuiHelper.DestroyUi(player, "backpack.image" );
            CuiHelper.AddUi(player, GUI0.Replace("{0}", backpackCount.ToString())//text1.Replace("{1}", BackpackBox.sizes[backpackSize].ToString())//text2.Replace("{2}", images["backpackImg"]));
			}
			if (backpackCount >= BackpackBox.sizes[backpackSize] * 0.5){
			CuiHelper.DestroyUi(player, "backpack.btn" );
            CuiHelper.DestroyUi(player, "backpack.text2" );
            CuiHelper.DestroyUi(player, "backpack.text1" );
            CuiHelper.DestroyUi(player, "backpack.image" );
            CuiHelper.AddUi(player, GUI2.Replace("{0}", backpackCount.ToString())//text1.Replace("{1}", BackpackBox.sizes[backpackSize].ToString())//text2.Replace("{2}", images["backpackImg"]));
			}
			if (backpackCount >= BackpackBox.sizes[backpackSize] - BackpackBox.sizes[backpackSize] * 0.3){
			CuiHelper.DestroyUi(player, "backpack.btn" );
            CuiHelper.DestroyUi(player, "backpack.text2" );
            CuiHelper.DestroyUi(player, "backpack.text1" );
            CuiHelper.DestroyUi(player, "backpack.image" );
            CuiHelper.AddUi(player, GUI1.Replace("{0}", backpackCount.ToString())//text1.Replace("{1}", BackpackBox.sizes[backpackSize].ToString())//text2.Replace("{2}", images["backpackImg"]));
			}
					
        }
        void DestroyUI(BasePlayer player)
        {
            CuiHelper.DestroyUi(player, "backpack.btn");
            CuiHelper.DestroyUi(player, "backpack.text2");
            CuiHelper.DestroyUi(player, "backpack.text1");
            CuiHelper.DestroyUi(player, "backpack.image");
        }
    #region Gui0

        private string GUI0 = @"
[{
	""name"": ""backpack.image"",
	""parent"": ""Overlay"",
	""components"": [{
		""type"": ""UnityEngine.UI.RawImage"", 
		""sprite"": ""assets/content/textures/generic/fulltransparent.tga"",
		""color"": ""1 1 1 1"",
		""png"": ""{2}""
	}, {
		""type"": ""RectTransform"",
		""anchormin"": ""0.29112 0.01944441"",
		""anchormax"": ""0.3416667 0.1027779"",
		""offsetmin"": ""0 0"",
		""offsetmax"": ""1 1""
	}]
}, {
	""name"": ""backpack.text1"",
	""parent"": ""backpack.image"",
	""components"": [{
		""type"": ""UnityEngine.UI.Text"",
		""text"": ""{0}"",
		""fontSize"": 13,
		""align"": ""MiddleCenter"",
		""color"": ""0 0 0 0.7058824""
	}, {
		""type"": ""UnityEngine.UI.Outline"",
		""color"": ""0.19 0.19 0.19 1.00"",
		""distance"": ""0.5 -0.5""
	}, {
		""type"": ""RectTransform"",
		""anchormin"": ""0.220705 0.1333331"",
		""anchormax"": ""0.478305 0.4111103"",
		""offsetmin"": ""0 0"",
		""offsetmax"": ""1 1""
	}]
}, {
	""name"": ""backpack.text2"",
	""parent"": ""backpack.image"",
	""components"": [{
		""type"": ""UnityEngine.UI.Text"",
		""text"": ""{1}"",
		""fontSize"": 13,
		""align"": ""MiddleCenter"",
		""color"": ""0 0 0 0.7061956""
	}, {
		""type"": ""UnityEngine.UI.Outline"",
		""color"": ""0.19 0.19 0.19 1.00"",
		""distance"": ""0.5 -0.5""
	}, {
		""type"": ""RectTransform"",
		""anchormin"": ""0.513671 0.1333331"",
		""anchormax"": ""0.7712711 0.4111103"",
		""offsetmin"": ""0 0"",
		""offsetmax"": ""1 1""
	}]
}, {
	""name"": ""backpack.btn"",
	""parent"": ""Overlay"",
	""components"": [{
		""type"": ""UnityEngine.UI.Button"",
		""command"": ""backpack.open"",
		""color"": ""1 1 1 0""
	}, {
		""type"": ""RectTransform"",
		""anchormin"": ""0.2937759 0.02592597"",
		""anchormax"": ""0.3383071 0.1013889"",
		""offsetmin"": ""0 0"",
		""offsetmax"": ""1 1""
	}]
}]";
        #endregion Gui0
	#region Gui1
	private string GUI1 = @"
[{
	""name"": ""backpack.image"",
	""parent"": ""Overlay"",
	""components"": [{
		""type"": ""UnityEngine.UI.RawImage"",
		""sprite"": ""assets/content/textures/generic/fulltransparent.tga"",
		""color"": ""1 0 0 0.7"",
		""png"": ""{2}""
	}, {
		""type"": ""RectTransform"",
		""anchormin"": ""0.29112 0.01944441"",
		""anchormax"": ""0.3416667 0.1027779"",
		""offsetmin"": ""0 0"",
		""offsetmax"": ""1 1""
	}]
}, {
	""name"": ""backpack.text1"",
	""parent"": ""backpack.image"",
	""components"": [{
		""type"": ""UnityEngine.UI.Text"",
		""text"": ""{0}"",
		""fontSize"": 13,
		""align"": ""MiddleCenter"",
		""color"": ""0 0 0 0.7058824""
	}, {
		""type"": ""UnityEngine.UI.Outline"",
		""color"": ""0.19 0.19 0.19 1.00"",
		""distance"": ""0.5 -0.5""
	}, {
		""type"": ""RectTransform"",
		""anchormin"": ""0.220705 0.1333331"",
		""anchormax"": ""0.478305 0.4111103"",
		""offsetmin"": ""0 0"",
		""offsetmax"": ""1 1""
	}]
}, {
	""name"": ""backpack.text2"",
	""parent"": ""backpack.image"",
	""components"": [{
		""type"": ""UnityEngine.UI.Text"",
		""text"": ""{1}"",
		""fontSize"": 13,
		""align"": ""MiddleCenter"",
		""color"": ""0 0 0 0.7061956""
	}, {
		""type"": ""UnityEngine.UI.Outline"",
		""color"": ""0.19 0.19 0.19 1.00"",
		""distance"": ""0.5 -0.5""
	}, {
		""type"": ""RectTransform"",
		""anchormin"": ""0.513671 0.1333331"",
		""anchormax"": ""0.7712711 0.4111103"",
		""offsetmin"": ""0 0"",
		""offsetmax"": ""1 1""
	}]
}, {
	""name"": ""backpack.btn"",
	""parent"": ""Overlay"",
	""components"": [{
		""type"": ""UnityEngine.UI.Button"",
		""command"": ""backpack.open"",
		""color"": ""1 1 1 0""
	}, {
		""type"": ""RectTransform"",
		""anchormin"": ""0.2937759 0.02592597"",
		""anchormax"": ""0.3383071 0.1013889"",
		""offsetmin"": ""0 0"",
		""offsetmax"": ""1 1""
	}]
}]";
	#endregion Gui1
	#region Gui2
	private string GUI2 = @"
[{
	""name"": ""backpack.image"",
	""parent"": ""Overlay"",
	""components"": [{
		""type"": ""UnityEngine.UI.RawImage"",
		""sprite"": ""assets/content/textures/generic/fulltransparent.tga"",
		""color"": ""1 1 0.5 0.7"",
		""png"": ""{2}""
	}, {
		""type"": ""RectTransform"",
		""anchormin"": ""0.29112 0.01944441"",
		""anchormax"": ""0.3416667 0.1027779"",
		""offsetmin"": ""0 0"",
		""offsetmax"": ""1 1""
	}]
}, {
	""name"": ""backpack.text1"",
	""parent"": ""backpack.image"",
	""components"": [{
		""type"": ""UnityEngine.UI.Text"",
		""text"": ""{0}"",
		""fontSize"": 13,
		""align"": ""MiddleCenter"",
		""color"": ""0 0 0 0.7058824""
	}, {
		""type"": ""UnityEngine.UI.Outline"",
		""color"": ""0.19 0.19 0.19 0.9"",
		""distance"": ""0.5 -0.5""
	}, {
		""type"": ""RectTransform"",
		""anchormin"": ""0.220705 0.1333331"",
		""anchormax"": ""0.478305 0.4111103"",
		""offsetmin"": ""0 0"",
		""offsetmax"": ""1 1""
	}]
}, {
	""name"": ""backpack.text2"",
	""parent"": ""backpack.image"",
	""components"": [{
		""type"": ""UnityEngine.UI.Text"",
		""text"": ""{1}"",
		""fontSize"": 13,
		""align"": ""MiddleCenter"",
		""color"": ""0 0 0 0.7061956""
	}, {
		""type"": ""UnityEngine.UI.Outline"",
		""color"": ""0.19 0.19 0.19 0.9"",
		""distance"": ""0.5 -0.5""
	}, {
		""type"": ""RectTransform"",
		""anchormin"": ""0.513671 0.1333331"",
		""anchormax"": ""0.7712711 0.4111103"",
		""offsetmin"": ""0 0"",
		""offsetmax"": ""1 1""
	}]
}, {
	""name"": ""backpack.btn"",
	""parent"": ""Overlay"",
	""components"": [{
		""type"": ""UnityEngine.UI.Button"",
		""command"": ""backpack.open"",
		""color"": ""1 1 1 0""
	}, {
		""type"": ""RectTransform"",
		""anchormin"": ""0.2937759 0.02592597"",
		""anchormax"": ""0.3383071 0.1013889"",
		""offsetmin"": ""0 0"",
		""offsetmax"": ""1 1""
	}]
}]";


	#endregion Gui2
        #endregion

        #region COMMANDS

        [ChatCommand("bp")]
        void cmdBackpackShow(BasePlayer player, string command, string[] args)
        {
            if (player == null) return;
            /*if (!player.IsAdmin)
            {
                player.ChatMessage("Рюкзак на тех работах, не беспокойтесь, ваши вещи не пропадут!");
                return;
            }*/
           
            if (player == null) return;
            if (player.inventory.loot?.entitySource != null)
            {
                BackpackBox bpBox;
                if (openedBackpacks.TryGetValue(player.userID, out bpBox) &&
                    bpBox.gameObject == player.inventory.loot.entitySource.gameObject)
                {
                    return;
                }
                player.EndLooting();
                NextTick(() => BackpackShow(player));
                return;
            }
            else
            {
                BackpackShow(player);
            }
        }

        [ConsoleCommand("backpack.open")]
        void cmdOnBackPackShowClick(ConsoleSystem.Arg arg)
        {
            var player = arg.Player();
            if (player == null) return;
            if (player.inventory.loot?.entitySource != null)
            {
                BackpackBox bpBox;
                if (openedBackpacks.TryGetValue(player.userID, out bpBox) &&
                    bpBox.gameObject == player.inventory.loot.entitySource.gameObject)
                {
                    return;
                }
                player.EndLooting();
                NextTick(() => BackpackShow(player));
                return;
            }
            else
            {
                BackpackShow(player);
            }
        }

        #endregion

        #region ITEM EXTENSION

        public class SavedItem
        {
            public string shortname;
            public int itemid;
            public float condition;
            public float maxcondition;
            public int amount;
            public int ammoamount;
            public string ammotype;
            public int flamefuel;
            public ulong skinid;
            public bool weapon;
            public List<SavedItem> mods;
        }

        List<SavedItem> SaveItems(List<Item> items) => items.Select(SaveItem).ToList();

        SavedItem SaveItem(Item item)
        {
            SavedItem iItem = new SavedItem
            {
                shortname = item.info?.shortname,
                amount = item.amount,
                mods = new List<SavedItem>(),
                skinid = item.skin
            };
            if (item.info == null) return iItem;
            iItem.itemid = item.info.itemid;
            iItem.weapon = false;
            if (item.hasCondition)
            {
                iItem.condition = item.condition;
                iItem.maxcondition = item.maxCondition;
            }
            FlameThrower flameThrower = item.GetHeldEntity()?.GetComponent<FlameThrower>();
            if(flameThrower != null)
                iItem.flamefuel = flameThrower.ammo;
            if (item.info.category.ToString() != "Weapon") return iItem;
            BaseProjectile weapon = item.GetHeldEntity() as BaseProjectile;
            if (weapon == null) return iItem;
            if (weapon.primaryMagazine == null) return iItem;
            iItem.ammoamount = weapon.primaryMagazine.contents;
            iItem.ammotype = weapon.primaryMagazine.ammoType.shortname;
            iItem.weapon = true;
            if (item.contents != null)
                foreach (var mod in item.contents.itemList)
                    if (mod.info.itemid != 0)
                        iItem.mods.Add(SaveItem(mod));
            return iItem;
        }

        List<Item> RestoreItems(List<SavedItem> sItems)
        {
            return sItems.Select(sItem =>
            {
                if (sItem.weapon) return BuildWeapon(sItem);
                return BuildItem(sItem);
            }).Where(i => i != null).ToList();
        }

        Item BuildItem(SavedItem sItem)
        {
            if (sItem.amount < 1) sItem.amount = 1;
            Item item = ItemManager.CreateByItemID(sItem.itemid, sItem.amount, sItem.skinid);
            if (item.hasCondition)
            {
                item.condition = sItem.condition;
                item.maxCondition = sItem.maxcondition;
            }
            FlameThrower flameThrower = item.GetHeldEntity()?.GetComponent<FlameThrower>();
            if(flameThrower)
                flameThrower.ammo = sItem.flamefuel;
            return item;
        }

        Item BuildWeapon(SavedItem sItem)
        {
            Item item = ItemManager.CreateByItemID(sItem.itemid, 1, sItem.skinid);
            if (item.hasCondition)
            {
                item.condition = sItem.condition;
                item.maxCondition = sItem.maxcondition;
            }
            var weapon = item.GetHeldEntity() as BaseProjectile;
            if (weapon != null)
            {
                var def = ItemManager.FindItemDefinition(sItem.ammotype);
                weapon.primaryMagazine.ammoType = def;
                weapon.primaryMagazine.contents = sItem.ammoamount;
            }

            if (sItem.mods != null)
                foreach (var mod in sItem.mods)
                    item.contents.AddItem(BuildItem(mod).info, 1);
            return item;
        }

        #endregion

        #region EXTERNAL CALLS

        [PluginReference] Plugin Duel;

        bool InDuel(BasePlayer player) => Duel?.Call<bool>("IsPlayerOnActiveDuel", player) ?? false;

        #endregion
        

        public List<string> permisions = new List<string>()
        {
            "backpack.size1",
            "backpack.size2"
        };




        #region File Manager

        private GameObject FileManagerObject;
        private FileManager m_FileManager;

        /// <summary>
        /// Инициализация скрипта взаимодействующего с файлами сервера
        /// </summary>
        void InitFileManager()
        {
            FileManagerObject = new GameObject( "MAP_FileManagerObject" );
            m_FileManager = FileManagerObject.AddComponent<FileManager>();
        }

        class FileManager : MonoBehaviour
        {
            int loaded = 0;
            int needed = 0;

            public bool IsFinished => needed == loaded;
            const ulong MaxActiveLoads = 10;
            Dictionary<string, FileInfo> files = new Dictionary<string, FileInfo>();

            DynamicConfigFile dataFile = Interface.Oxide.DataFileSystem.GetFile( "Backpack/Images" );

            private class FileInfo
            {
                public string Url;
                public string Png;
            }

            public void SaveData()
            {
                dataFile.WriteObject( files );
            }

            public string GetPng( string name ) => files[ name ].Png;

            private void Awake()
            {
                files = dataFile.ReadObject<Dictionary<string, FileInfo>>() ?? new Dictionary<string, FileInfo>();
            }

            public IEnumerator LoadFile( string name, string url )
            {
                if (files.ContainsKey( name ) && files[ name ].Url == url && !string.IsNullOrEmpty( files[ name ].Png )) yield break;
                files[ name ] = new FileInfo() { Url = url };
                needed++;
                yield return StartCoroutine( LoadImageCoroutine( name, url ) );
            }

            IEnumerator LoadImageCoroutine( string name, string url )
            {
                using (WWW www = new WWW( url ))
                {
                    yield return www;
                    using (MemoryStream stream = new MemoryStream())
                    {
                        if (string.IsNullOrEmpty( www.error ))
                        {
                            var entityId = CommunityEntity.ServerInstance.net.ID;
                            var crc32 = FileStorage.server.Store(www.bytes, FileStorage.Type.png, entityId ).ToString();
                            files[ name ].Png = crc32;
                        }
                    }
                }
                loaded++;
            }
        }

        #endregion
		#region permissions
        public static class PermissionService
        {
            public static Permission permission = Interface.GetMod().GetLibrary<Permission>();

            public static bool HasPermission(BasePlayer player, string permissionName)
            {
                if(player == null || string.IsNullOrEmpty(permissionName))
                    return false;

                var uid = player.UserIDString;
                if(permission.UserHasPermission(uid, permissionName))
                    return true;

                return false;
            }

            public static void RegisterPermissions(Plugin owner, List<string> permissions)
            {
                if(owner == null) throw new ArgumentNullException("owner");
                if(permissions == null) throw new ArgumentNullException("commands");

                foreach(var permissionName in permissions.Where(permissionName => !permission.PermissionExists(permissionName)))
                {
                    permission.RegisterPermission(permissionName, owner);
                }
            }
        }
		#endregion
    }
}

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