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

FREE IQBackpack : 1.0.7 1.0.7

Нет прав для скачивания
C#:
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using ConVar;
using Network;
using Newtonsoft.Json;
using Oxide.Core.Plugins;
using Oxide.Game.Rust.Cui;
using UnityEngine;
namespace Oxide.Plugins {
    [Info("IQBackpack", "SkuliDropek", "1.0.7")]
    [Description("Просто твой любимый рюкзачок :)")]
    class IQBackpack : RustPlugin {
        /// <summary>
        /// Обновление 1.0.х
        /// - Исправил перекладывание предметов в рюкзак через ПКМ/бинд
        /// - Теперь при добавления игрока в группу/выдаче группе или игроку разрешений игрок получит уведомление в чате и его интерфейс и кол-во слотов автоматически обновится
        /// - Теперь при удалении игрока из группы/удалении у группы или игрока разрешений игрок получит уведомление в чате и его интерфейс и кол-во слотов автоматически обновится (если у него предметов было больше, чем допустимое кол-во слотов - они выпадут)
        /// - Добавлена возможность включить закрытие рюкзака при повторном нажатии на UI-рюкзака или использовании бинда/команды - настраивается в конфигурационном файле
        /// - Если у игрока доступно 0 слотов рюкзака - UI более не отобразится
        /// - Если отключена возможность на улучшение рюкзака в меню крафта рюкзака не будут отображаться заблокированные слоты
        /// </summary>
        ///
#region Reference
        [PluginReference]
        Plugin ImageLibrary, IQChat, Battles, Duel;
#region Duel / Battles
        public Boolean IsDuel(UInt64 userID) {
            if (Battles) return (Boolean)Battles?.Call("IsPlayerOnBattle", userID);
            else if (Duel) return (Boolean)Duel?.Call("IsPlayerOnActiveDuel", BasePlayer.FindByID(userID));
            else return false;
        }
#endregion
#region IQChat
        public void SendChat(String Message, BasePlayer player, Chat.ChatChannel channel = Chat.ChatChannel.Global) {
            Configuration.Reference.IQChat Chat = config.References.IQChatSetting;
            if (IQChat) if (Chat.UIAlertUse) IQChat?.Call("API_ALERT_PLAYER_UI", player, Message);
            else IQChat?.Call("API_ALERT_PLAYER", player, Message, Chat.CustomPrefix, Chat.CustomAvatar);
            else player.SendConsoleCommand("chat.add", channel, 0, Message);
        }
#endregion
#region Image Library
        private String GetImage(String fileName, UInt64 skin = 0) {
            var imageId = (String)plugins.Find("ImageLibrary").CallHook("GetImage", fileName, skin);
            if (!string.IsNullOrEmpty(imageId)) return imageId;
            return String.Empty;
        }
        private String GetImage(Configuration.Backpack.BackpackCraft.ItemCraft CItem) {
            String PNG = CItem.SkinID == 0 ? GetImage($"{CItem.Shortname}_128px") : GetImage($"{CItem.Shortname}_128px_{CItem.SkinID}", CItem.SkinID);
            return PNG;
        }
        public Boolean AddImage(String url, String shortname, UInt64 skin = 0) => (Boolean)ImageLibrary?.Call("AddImage", url, shortname, skin);
        public Boolean HasImage(String imageName) => (Boolean)ImageLibrary?.Call("HasImage", imageName);
        private IEnumerator DownloadImages() {
            Puts("Генерируем интерфейс...");
            if (!HasImage($"{config.BackpackItem.UrlBackpack}")) AddImage(config.BackpackItem.UrlBackpack, config.BackpackItem.UrlBackpack);
            foreach (Configuration.Backpack.BackpackCraft BPOption in config.BackpackItem.BackpacOption.Where(c => c.CraftItems != null && c.CraftItems.Count != 0)) foreach (Configuration.Backpack.BackpackCraft.ItemCraft CItem in BPOption.CraftItems) {
                if (CItem.SkinID != 0) {
                    if (!HasImage($"{CItem.Shortname}_128px_{CItem.SkinID}")) AddImage($"http://api.skyplugins.ru/api/getskin/{CItem.SkinID}/128", $"{CItem.Shortname}_128px_{CItem.SkinID}", CItem.SkinID);
                }
                else {
                    if (!HasImage($"{CItem.Shortname}_128px")) AddImage($"http://api.skyplugins.ru/api/getimage/{CItem.Shortname}/128", $"{CItem.Shortname}_128px");
                }
            }
            yield return new WaitForSeconds(0.04f);
            Puts("Интерфейс был успешно сгенерирован!");
            _interface = new InterfaceBuilder();
            timer.Once(3f, () => {
                foreach (BasePlayer player in BasePlayer.allPlayerList) OnPlayerConnected(player);
            }
            );
        }
#endregion
#endregion
#region Vars
        public static IQBackpack _ = null;
        private enum TypeBackpack {
            Wear, OnlyPermission
        }
        private enum TypeDropBackpack {
            NoDrop, DropItems, DropBackpack,
        }
        private enum TypeDurability {
            None, Time, Count,
        }
        private Dictionary<BasePlayer, BackpackBehaviour> PlayerBackpack = new Dictionary<BasePlayer, BackpackBehaviour>();
        private Dictionary<BasePlayer, ShopFrontBehavior> PlayerUpgrades = new Dictionary<BasePlayer, ShopFrontBehavior>();
        private List<BasePlayer> PlayerUseBackpacks = new List<BasePlayer>();
        private Dictionary<BasePlayer, BackpackSpine> SpinesBackpacks = new Dictionary<BasePlayer, BackpackSpine>();
#endregion
#region Configuration
        private static Configuration config = new Configuration();
        private class Configuration {
            [JsonProperty("Настройка рюкзака")]
            public Backpack BackpackItem = new Backpack();
            [JsonProperty("Настройка поддерживающих плагинов")]
            public Reference References = new Reference();
            [JsonProperty("Дополнительная настройка")]
            public Turneds TurnedsSetting = new Turneds();
            internal class Turneds {
                [JsonProperty("Тип работы рюкзака : 0 - требуется надеть его, чтобы пользоватья, 1 - требуются лишь права(из вариаций рюкзаков)")]
                public TypeBackpack Types = TypeBackpack.Wear;
                [JsonProperty("Отображать рюкзак за спиной игрока(модельку рюкзака, работает на всех поворотах и изгибах игрока) [ВНИМАНИЕ, ИСПОЛЬЗУЙТЕ ЭТО НА PVE СЕРВЕРЕ, ИЗ-ЗА ОСОБЕННОСТЕЙ ИГРЫ В ТАКОЙ РЮКЗАК НА СПИНЕ НЕ БУДЕТ ПРОХОДИТЬ УРОН]")]
                public Boolean UseSpineBackpack = false;
                [JsonProperty("Использовать возможность скрафтить рюкзак (true - да/false - нет)")]
                public Boolean UseCrafting = true;
                [JsonProperty("Использовать возможность улучшать рюкзаки и увеличивать в нем слоты (true - да/false - нет) [Дополнительно настраивается в каждом рюкзаке, учтите - это общий параметр, детальная настройка в вариациях рюкзаков]")]
                public Boolean UseUpgradeBackpack = true;
                [JsonProperty("Закрывать рюкзак при повторном нажатии на UI/использовании бинда, если он открыт")]
                public Boolean ClosePressedAgain = true;
                [JsonProperty("Тип выпадения рюкзака : 0 - Не выпадает при смерти, 1 - Выбрасывает предметы вокруг трупа, 2 - Выбрасывает рюкзак с предметами")]
                public TypeDropBackpack TypeDropBackpack = TypeDropBackpack.DropBackpack;
                [JsonProperty("Время удаления рюкзака при выпадении (Работает с : 2 - Выбрасывает рюкзак с предметами)")]
                public Single RemoveBackpack = 200f;
                [JsonProperty("Настройка интерфейса")]
                public VisualBackpackSlot VisualBackpackSlots = new VisualBackpackSlot();
                internal class VisualBackpackSlot {
                    [JsonProperty("Использовать отображение UI рюкзака возле слотов (true - да/false - нет)")]
                    public Boolean UseVisual = true;
                    [JsonProperty("Отображать количество слотов в рюкзаке на UI (true - да/false - нет)")]
                    public Boolean UseSlots = true;
                    [JsonProperty("Отображать полосу заполненности рюкзака на UI (true - да/false - нет)")]
                    public Boolean UseIsFulled = true;
                    [JsonProperty("Разрешить открывать рюкзак нажава на UI интерфейс (true - да/false - нет)")]
                    public Boolean UseButton = true;
                    [JsonProperty("Настройка цветов полосы заполненности")]
                    public ColorProgress ColorProgressBar = new ColorProgress();
                    [JsonProperty("Настройка позиции UI слота с рюкзаком")]
                    public Position PositionSlotVisual = new Position();
                    [JsonProperty("Настройка позиции UI для улучшения рюкзака")]
                    public Position PositionUpgrade = new Position();
                    internal class ColorProgress {
                        [JsonProperty("Цвет полосы заполненности, когда рюкзак заполнен на >30%")]
                        public String ColorMinimal = "0.44 0.53 0.26 1.00";
                        [JsonProperty("Цвет полосы заполненности, когда рюкзак заполнен на >60%")]
                        public String ColorAverage = "0.98 0.53 0.26 1.00";
                        [JsonProperty("Цвет полосы заполненности, когда рюкзак заполнен на >80%")]
                        public String ColorMaximum = "0.98 0.20 0.28 1.00";
                    }
                    internal class Position {
                        public String AnchorMin;
                        public String AnchorMax;
                        public String OffsetMin;
                        public String OffsetMax;
                    }
                }
            }
            internal class Reference {
                [JsonProperty("Настройка IQChat")]
                public IQChat IQChatSetting = new IQChat();
                internal class IQChat {
                    [JsonProperty("IQChat : Кастомный префикс в чате")]
                    public String CustomPrefix = "[IQBackpack]";
                    [JsonProperty("IQChat : Кастомный аватар в чате(Если требуется)")]
                    public String CustomAvatar = "0";
                    [JsonProperty("IQChat : Использовать UI уведомления")]
                    public Boolean UIAlertUse = false;
                }
            }
            internal class Backpack {
                [JsonProperty("Shortname для рюкзака (нужен предмет, который является одеждой)")]
                public String Shortname = "burlap.gloves";
                [JsonProperty("SkinID рюкзака")]
                public UInt64 SkinID = 2726640855;
                [JsonProperty("Ссылка на картинку для отображения рюкзака")]
                public String UrlBackpack = "https://i.imgur.com/rPeKd9R.png";
                [JsonProperty("Вариации рюкзаков по привилегиям (Дается доступный набор игроку, который выше других)")]
                public List<BackpackCraft> BackpacOption = new List<BackpackCraft>();
                internal class BackpackCraft {
                    [JsonProperty("Права для возможности крафтить и носить данный рюкзак(не оставляйте это поле пустым, иначе оно не будет учитываться)")]
                    public String Permissions = "iqbackpack.7slot";
                    [JsonProperty("Количество слотов у данного рюкзака")]
                    public Int32 AmountSlot = 7;
                    [JsonProperty("Черный список предметов для данного рюкзака")]
                    public List<String> BlackListItems = new List<String>();
                    [JsonProperty("Предметы для крафта рюкзака")]
                    public List<ItemCraft> CraftItems = new List<ItemCraft>();
                    [JsonProperty("Настройка улучшений рюкзака (Улучшение будет постепенное в зависимости от листа, сверху -> вниз (максимальное количество слотов - 42))")]
                    public List<UpgradeBackpack> UpgradeList = new List<UpgradeBackpack>();
                    internal class UpgradeBackpack {
                        [JsonProperty("Предметы для улучшения на этот уровень")]
                        public List<ItemCraft> CraftItems = new List<ItemCraft>();
                        [JsonProperty("Сколько слотов добавлять за это улучшение")]
                        public Int32 SlotUpgrade;
                    }
                    internal class ItemCraft {
                        public String Shortname;
                        public UInt64 SkinID;
                        [JsonProperty("Количество")]
                        public Int32 Amount;
                    }
                }
            }
            public static Configuration GetNewConfiguration() {
                return new Configuration {
                    BackpackItem = new Backpack {
                        Shortname = "burlap.gloves", SkinID = 2726640855, UrlBackpack = "https://i.imgur.com/rPeKd9R.png", BackpacOption = new List<Backpack.BackpackCraft> {
                            new Backpack.BackpackCraft {
                                AmountSlot = 7, Permissions = "iqbackpack.7slot", BlackListItems = new List<String> {
                                }
                                , CraftItems = new List<Backpack.BackpackCraft.ItemCraft> {
                                }
                                , UpgradeList = new List<Backpack.BackpackCraft.UpgradeBackpack> {
                                }
                                ,
                            }
                            , new Backpack.BackpackCraft {
                                AmountSlot = 15, Permissions = "iqbackpack.15slot", BlackListItems = new List<String> {
                                    "rocket.launcher", "ammo.rocket.basic", "explosive.satchel", "supply.signal", "explosive.timed",
                                }
                                , CraftItems = new List<Backpack.BackpackCraft.ItemCraft> {
                                    new Backpack.BackpackCraft.ItemCraft {
                                        Shortname = "leather", Amount = 50, SkinID = 0
                                    }
                                    , new Backpack.BackpackCraft.ItemCraft {
                                        Shortname = "cloth", Amount = 200, SkinID = 0
                                    }
                                    , new Backpack.BackpackCraft.ItemCraft {
                                        Shortname = "sewingkit", Amount = 10, SkinID = 0
                                    }
                                    ,
                                }
                                , UpgradeList = new List<Backpack.BackpackCraft.UpgradeBackpack> {
                                    new Backpack.BackpackCraft.UpgradeBackpack {
                                        SlotUpgrade = 3, CraftItems = new List<Backpack.BackpackCraft.ItemCraft> {
                                            new Backpack.BackpackCraft.ItemCraft {
                                                Shortname = "burlap.gloves", Amount = 1, SkinID = 2726640855
                                            }
                                            , new Backpack.BackpackCraft.ItemCraft {
                                                Shortname = "leather", Amount = 150, SkinID = 0
                                            }
                                            , new Backpack.BackpackCraft.ItemCraft {
                                                Shortname = "cloth", Amount = 300, SkinID = 0
                                            }
                                            , new Backpack.BackpackCraft.ItemCraft {
                                                Shortname = "sewingkit", Amount = 5, SkinID = 0
                                            }
                                            , new Backpack.BackpackCraft.ItemCraft {
                                                Shortname = "metal.fragments", Amount = 1000, SkinID = 0
                                            }
                                            ,
                                        }
                                    }
                                    , new Backpack.BackpackCraft.UpgradeBackpack {
                                        SlotUpgrade = 10, CraftItems = new List<Backpack.BackpackCraft.ItemCraft> {
                                            new Backpack.BackpackCraft.ItemCraft {
                                                Shortname = "burlap.gloves", Amount = 1, SkinID = 2726640855
                                            }
                                            , new Backpack.BackpackCraft.ItemCraft {
                                                Shortname = "leather", Amount = 500, SkinID = 0
                                            }
                                            , new Backpack.BackpackCraft.ItemCraft {
                                                Shortname = "cloth", Amount = 1000, SkinID = 0
                                            }
                                            , new Backpack.BackpackCraft.ItemCraft {
                                                Shortname = "sewingkit", Amount = 25, SkinID = 0
                                            }
                                            , new Backpack.BackpackCraft.ItemCraft {
                                                Shortname = "metal.fragments", Amount = 15000, SkinID = 0
                                            }
                                            ,
                                        }
                                    }
                                    ,
                                }
                            }
                        }
                    }
                    , TurnedsSetting = new Turneds {
                        Types = TypeBackpack.Wear, UseCrafting = true, UseUpgradeBackpack = true, ClosePressedAgain = true, UseSpineBackpack = false, TypeDropBackpack = TypeDropBackpack.DropBackpack, RemoveBackpack = 200f, VisualBackpackSlots = new Turneds.VisualBackpackSlot {
                            UseVisual = true, UseSlots = true, UseIsFulled = true, UseButton = true, ColorProgressBar = new Turneds.VisualBackpackSlot.ColorProgress {
                                ColorMinimal = "0.44 0.53 0.26 1.00", ColorAverage = "0.98 0.53 0.26 1.00", ColorMaximum = "0.98 0.20 0.28 1.00",
                            }
                            , PositionSlotVisual = new Turneds.VisualBackpackSlot.Position {
                                AnchorMin = "0.5 0", AnchorMax = "0.5 0", OffsetMin = "-264.276 17.943", OffsetMax = "-203.724 78.087"
                            }
                            , PositionUpgrade = new Turneds.VisualBackpackSlot.Position {
                                AnchorMin = "0.5 0.5", AnchorMax = "0.5 0.5", OffsetMin = "194.836 -36.769", OffsetMax = "575.164 36.785"
                            }
                        }
                        ,
                    }
                    , References = new Reference {
                        IQChatSetting = new Reference.IQChat {
                            CustomAvatar = "0", CustomPrefix = "[IQBackpack] ", UIAlertUse = false,
                        }
                    }
                }
                ;
            }
        }
        protected override void LoadConfig() {
            base.LoadConfig();
            try {
                config = Config.ReadObject<Configuration>();
                if (config == null) LoadDefaultConfig();
            }
            catch {
                PrintWarning("Ошибка " + $"чтения конфигурации 'oxide/config/{Name}', создаём новую конфигурацию!!");
                LoadDefaultConfig();
            }
            NextTick(SaveConfig);
        }
        protected override void LoadDefaultConfig() => config = Configuration.GetNewConfiguration();
        protected override void SaveConfig() => Config.WriteObject(config);
#endregion
#region Data
        public Dictionary<UInt64, BackpackInfo> Backpacks = new Dictionary<UInt64, BackpackInfo>();
        internal class BackpackInfo {
            public Int32 AmountSlot = 0;
            public Int32 IndexUpgrade = -1;
            public List<SavedItem> Items = new List<SavedItem>();
            internal class SavedItem {
                public Int32 TargetSlot;
                public String Shortname;
                public Int32 Itemid;
                public Single Condition;
                public Single Maxcondition;
                public Int32 Amount;
                public Int32 Ammoamount;
                public String Ammotype;
                public Int32 Flamefuel;
                public UInt64 Skinid;
                public String Name;
                public Boolean Weapon;
                public Int32 Blueprint;
                public Single BusyTime;
                public Boolean OnFire;
                public List<SavedItem> Mods;
            }
        }
        void ReadData() => Backpacks = Oxide.Core.Interface.Oxide.DataFileSystem.ReadObject<Dictionary<UInt64, BackpackInfo>>("IQBackpack/Backpacks");
        void WriteData() => Oxide.Core.Interface.Oxide.DataFileSystem.WriteObject("IQBackpack/Backpacks", Backpacks);
#endregion
#region Hooks
        void Init() => ReadData();
        void OnServerInitialized() {
            _ = this;
            ServerMgr.Instance.StartCoroutine(DownloadImages());
            RegisteredPermissions();
            if(config.TurnedsSetting.TypeDropBackpack == TypeDropBackpack.NoDrop) Unsubscribe("OnPlayerDeath");
            if (config.TurnedsSetting.Types == TypeBackpack.OnlyPermission) Unsubscribe("CanWearItem");
            else {
                Unsubscribe("OnUserPermissionGranted");
                Unsubscribe("OnUserPermissionRevoked");
                Unsubscribe("OnUserGroupAdded");
                Unsubscribe("OnUserGroupRemoved");
            }
            if (!config.TurnedsSetting.UseUpgradeBackpack) {
                Unsubscribe("CanLootEntity");
                Unsubscribe("OnItemStacked");
                Unsubscribe("OnItemSplit");
                Unsubscribe("CanStackItem");
            }
            if (!config.TurnedsSetting.UseSpineBackpack) Unsubscribe("OnPlayerDisconnected");
        }
        void OnPlayerDeath(BasePlayer player, HitInfo info) {
            if (player == null) return;
            DropBackpack(player, config.TurnedsSetting.TypeDropBackpack);
            return;
        }
        void OnPlayerConnected(BasePlayer player) {
            if (_interface == null) {
                timer.Once(3f, () => OnPlayerConnected(player));
                return;
            }
            if (player == null) return;
            if (!PlayerBackpack.ContainsKey(player)) PlayerBackpack.Add(player, null);
            if (config.TurnedsSetting.UseUpgradeBackpack) if (!PlayerUpgrades.ContainsKey(player)) PlayerUpgrades.Add(player, null);
            if (!config.TurnedsSetting.VisualBackpackSlots.UseVisual) return;
            if (config.TurnedsSetting.Types == TypeBackpack.Wear) {
                if (GetBackpack(player) == null) return;
            }
            else {
                if (!Backpacks.ContainsKey(player.userID)) Backpacks.Add(player.userID, new BackpackInfo {
                    AmountSlot = GetAvailableSlots(player)
                }
                );
            }
            if (!player.IsDead() && !IsDuel(player.userID)) {
                DrawUI_Backpack_Visual(player);
                BackpackSpawnSpine(player);
            }
        }
        void OnPlayerDisconnected(BasePlayer player, string reason) => BackpackRemoveSpine(player);
        private void OnServerShutdown() => Unload();
        void Unload() {
            ServerMgr.Instance.StopCoroutine(DownloadImages());
            InterfaceBuilder.DestroyAll();
            WriteData();
            foreach (BasePlayer player in BasePlayer.activePlayerList) foreach (Item item in player.inventory.AllItems()) item.SetFlag(global : : Item.Flag.IsLocked, false);
            foreach (BasePlayer player in BasePlayer.activePlayerList.Where(p => PlayerBackpack.ContainsKey(p) && PlayerBackpack[p] != null)) PlayerBackpack[player].Destroy();
            if (config.TurnedsSetting.UseUpgradeBackpack) foreach (BasePlayer player in BasePlayer.activePlayerList.Where(p => PlayerUpgrades.ContainsKey(p) && PlayerUpgrades[p] != null)) PlayerUpgrades[player].Destroy();
            if (SpinesBackpacks != null && SpinesBackpacks.Count != 0) foreach (KeyValuePair<BasePlayer, BackpackSpine> sBp in SpinesBackpacks.Where(bp => bp.Value != null)) sBp.Value.KillParent();
            SpinesBackpacks.Clear();
            _ = null;
        }
#region Backpack Hooks
        public Dictionary<UInt64, List<Connection>> ContainerGetPlayer = new Dictionary<UInt64, List<Connection>>();
        void NetworkIDGetSet(UInt64 NetID, Boolean SetOrRemove, BasePlayer player = null) {
            if (player == null) return;
            if (!ContainerGetPlayer.ContainsKey(NetID)) ContainerGetPlayer.Add(NetID, new List<Connection> {
                player.Connection
            }
            );
            else {
                if (SetOrRemove) {
                    if (!ContainerGetPlayer[NetID].Contains(player.Connection)) ContainerGetPlayer[NetID].Add(player.Connection);
                }
                else {
                    if (ContainerGetPlayer[NetID].Count <= 1) ContainerGetPlayer.Remove(NetID);
                    else ContainerGetPlayer[NetID].Remove(player.Connection);
                }
            }
        }
        object OnLootNetworkUpdate(PlayerLoot loot) {
            if (loot == null) return null;
            BasePlayer player = loot.GetComponent<BasePlayer>();
            if (player == null) return null;
            if (loot.entitySource == null || loot.entitySource.net == null) return null;
            UInt64 NetID = loot.entitySource.net.ID;
            NetworkIDGetSet(NetID, true, player);
            return null;
        }
        void CanLootEntity(BasePlayer player, StorageContainer container) {
            if (container == null || player == null || !(Boolean)(container is Workbench)) return;
            DrawUI_Backpack_Upgrade_Workbench(player);
            return;
        }
        void OnPlayerSleepEnded(BasePlayer player) => OnPlayerConnected(player);
        void OnLootEntityEnd(BasePlayer player, BaseCombatEntity entity) {
            if (entity == null || player == null) return;
            Item backpack = GetBackpack(player);
            if (config.TurnedsSetting.UseUpgradeBackpack) {
                if (entity is Workbench) {
                    CuiHelper.DestroyUi(player, InterfaceBuilder.UI_Backpack_Upgrade_Workbench);
                    CuiHelper.DestroyUi(player, InterfaceBuilder.UI_Backpack_Upgrade_Info);
                    return;
                }
                if (entity is ShopFront) {
                    ShopFrontBehavior upgradeHandler = null;
                    if (PlayerUpgrades.ContainsKey(player) && PlayerUpgrades[player] != null) upgradeHandler = PlayerUpgrades[player];
                    if (upgradeHandler != null) upgradeHandler.Close();
                    CuiHelper.DestroyUi(player, InterfaceBuilder.UI_Backpack_Upgrade_Workbench);
                    CuiHelper.DestroyUi(player, InterfaceBuilder.UI_Backpack_Upgrade_Info);
                    if (config.TurnedsSetting.Types == TypeBackpack.Wear) if (backpack == null) return;
                    DrawUI_Backpack_Visual(player);
                    BackpackSpawnSpine(player);
                    return;
                }
                UInt64 NetID = entity.net.ID;
                NetworkIDGetSet(NetID, false, player);
            }
            if (config.TurnedsSetting.Types == TypeBackpack.Wear) if (backpack == null) return;
            BackpackBehaviour backpackHandler = null;
            if (PlayerBackpack.ContainsKey(player) && PlayerBackpack[player] != null) backpackHandler = PlayerBackpack[player];
            StorageContainer storage = entity as StorageContainer;
            if (player != null && storage != null && backpackHandler != null && storage == backpackHandler.Container) {
                backpackHandler.Close();
                DrawUI_Backpack_Visual(player);
                BackpackSpawnSpine(player);
            }
        }
        object CanWearItem(PlayerInventory inventory, Item item, int targetSlot) {
            if (inventory == null || item == null) return null;
            BasePlayer player = inventory.gameObject.ToBaseEntity() as BasePlayer;
            if (config.TurnedsSetting.Types == TypeBackpack.Wear) if (player != null && item.skin == config.BackpackItem.SkinID) {
                if (!Backpacks.ContainsKey(item.uid) && item.skin == config.BackpackItem.SkinID) Backpacks.Add(item.uid, new BackpackInfo());
                if (GetBackpack(player) != null) return false;
                NextTick(() => {
                    DrawUI_Backpack_Visual(player);
                    BackpackSpawnSpine(player);
                    if (player?.inventory?.loot?.entitySource is Workbench) DrawUI_Backpack_Upgrade_Workbench(player);
                }
                );
            }
            return null;
        }
        void OnItemAddedToContainer(ItemContainer container, Item item) {
            if (item == null || container == null) return;
            BasePlayer player = container.playerOwner;
            if (player == null || player is ScientistNPC || player is HumanNPC || player is NPCPlayer) return;
            if (config.TurnedsSetting.Types == TypeBackpack.Wear) if (item.skin == config.BackpackItem.SkinID) {
                if (GetBackpack(player) == null) {
                    CuiHelper.DestroyUi(player, InterfaceBuilder.UI_Backpack_Visual);
                    BackpackRemoveSpine(player);
                }
            }
            if (config.TurnedsSetting.UseUpgradeBackpack) {
                if (container?.entityOwner is ShopFront || player?.inventory?.loot?.entitySource is ShopFront) {
                    if (PlayerUpgrades.ContainsKey(player) && (container.playerOwner == player || container.uid == (UInt32)player.userID)) if (PlayerUpgrades[player] != null) {
                        PlayerUpgrades[player].VendorLock(true);
                        DrawUI_Backpack_Upgrade_Info_Controller(player);
                    }
                    return;
                }
                if (player?.inventory?.loot?.entitySource is Workbench) {
                    DrawUI_Backpack_Upgrade_Workbench(player);
                    return;
                }
            }
        }
        void OnItemDropped(Item item, BaseEntity entity) {
            if (item == null || entity == null) return;
            BasePlayer player = item.GetOwnerPlayer();
            if (player == null || player is ScientistNPC || player is HumanNPC || player is NPCPlayer) return;
            if (config.TurnedsSetting.Types == TypeBackpack.Wear) if (item.skin == config.BackpackItem.SkinID) {
                NextTick(() => {
                    if (GetBackpack(player) == null) {
                        CuiHelper.DestroyUi(player, InterfaceBuilder.UI_Backpack_Visual);
                        BackpackRemoveSpine(player);
                    }
                }
                );
                return;
            }
            if (config.TurnedsSetting.UseUpgradeBackpack) {
                if ((Boolean)(item?.GetRootContainer()?.entityOwner is ShopFront)) {
                    if (PlayerUpgrades.ContainsKey(player)) {
                        NextTick(() => {
                            if (PlayerUpgrades[player] != null && PlayerUpgrades[player].Container.vendorInventory != null && PlayerUpgrades[player].Container.customerInventory != null) PlayerUpgrades[player].VendorLock(true);
                            DrawUI_Backpack_Upgrade_Info_Controller(player);
                        }
                        );
                    }
                    return;
                }
                if (player?.inventory?.loot?.entitySource is Workbench) {
                    NextTick(() => {
                        DrawUI_Backpack_Upgrade_Workbench(player);
                    }
                    );
                    return;
                }
            }
        }
        void OnItemStacked(Item destinationItem, Item sourceItem, ItemContainer destinationContainer) {
            if (destinationItem == null || sourceItem == null || destinationContainer == null) return;
            BasePlayer player = destinationContainer.playerOwner;
            if (player == null || player is ScientistNPC || player is HumanNPC || player is NPCPlayer) return;
            if (PlayerUpgrades.ContainsKey(player)) {
                if (PlayerUpgrades[player] != null && PlayerUpgrades[player].Container.vendorInventory != null && PlayerUpgrades[player].Container.customerInventory != null) PlayerUpgrades[player].VendorLock(true);
                DrawUI_Backpack_Upgrade_Info_Controller(player);
            }
        }
        private Item OnItemSplit(Item item, int amount) {
            if (item == null) return null;
            if (plugins.Find("Stacks") || plugins.Find("CustomSkinsStacksFix") || plugins.Find("SkinBox")) return null;
            if (item.IsLocked()) {
                Item x = ItemManager.CreateByPartialName(item.info.shortname, amount);
                x.name = item.name;
                x.skin = item.skin;
                x.amount = amount;
                x.SetFlag(global : : Item.Flag.IsLocked, true);
                item.amount -= amount;
                return x;
            }
            return null;
        }
        object CanStackItem(Item item, Item targetItem) {
            if (item == null || targetItem == null) return null;
            BasePlayer player = item.GetOwnerPlayer();
            if (player == null || player is ScientistNPC || player is HumanNPC || player is NPCPlayer) return null;
            if (PlayerUpgrades.ContainsKey(player)) {
                NextTick(() => {
                    if (PlayerUpgrades[player] != null && PlayerUpgrades[player].Container.vendorInventory != null && PlayerUpgrades[player].Container.customerInventory != null) PlayerUpgrades[player].VendorLock(true);
                    DrawUI_Backpack_Upgrade_Info_Controller(player);
                }
                );
            }
            return null;
        }
        object CanAcceptItem(ItemContainer container, Item item) {
            if (container == null || item == null) return null;
            BasePlayer player = container.playerOwner;
            if (player == null) {
                if (config.TurnedsSetting.Types == TypeBackpack.Wear) {
                    NextTick(() => {
                        //// ERROR ???
                        if (item.parent == null || item.parent.entityOwner == null || item.parent.entityOwner.net == null) return;
                        if (item.skin != config.BackpackItem.SkinID) return;
                        UInt64 NetID = item.parent.entityOwner.net.ID;
                        if (NetID == 0) return;
                        if (ContainerGetPlayer.ContainsKey(NetID)) CommunityEntity.ServerInstance.ClientRPCEx(new SendInfo(ContainerGetPlayer[NetID]), null, "DestroyUI", "UI_BACKPACK_VISUAL");
                    }
                    );
                }
                return null;
            }
            if (player is ScientistNPC || player is HumanNPC || player is NPCPlayer) return null;
            if (!PlayerUseBackpacks.Contains(player)) return null;
            if (config.TurnedsSetting.Types == TypeBackpack.Wear) if (item.skin == config.BackpackItem.SkinID) {
                if (item.IsLocked()) return ItemContainer.CanAcceptResult.CannotAccept;
                CuiHelper.DestroyUi(player, InterfaceBuilder.UI_Backpack_Visual);
                BackpackRemoveSpine(player);
                return null;
            }
            if (GetBackpackOption(player).BlackListItems.Contains(item.info.shortname) && item.IsLocked()) return ItemContainer.CanAcceptResult.CannotAccept;
            return null;
        }
#endregion
#region Permissions Hooks
        void OnUserPermissionGranted(string id, string permName) => UpdatePermissions(id, permName, true);
        void OnUserPermissionRevoked(string id, string permName) => UpdatePermissions(id, permName, false);
        void OnUserGroupAdded(string id, string groupName) {
            String[] PermissionsGroup = permission.GetGroupPermissions(groupName);
            if (PermissionsGroup == null) return;
            foreach (var Option in config.BackpackItem.BackpacOption.Where(x => PermissionsGroup.Contains(x.Permissions))) UpdatePermissions(id, Option.Permissions, true);
        }
        void OnUserGroupRemoved(string id, string groupName) {
            String[] PermissionsGroup = permission.GetGroupPermissions(groupName);
            if (PermissionsGroup == null) return;
            foreach (var Option in config.BackpackItem.BackpacOption.Where(x => PermissionsGroup.Contains(x.Permissions))) UpdatePermissions(id, Option.Permissions, false);
        }
        void OnGroupPermissionGranted(string name, string perm) {
            String[] GroupUser = permission.GetUsersInGroup(name);
            if (GroupUser == null) return;
            foreach(String IDs in GroupUser) UpdatePermissions(IDs.Substring(0, 17), perm, true);
        }
        void OnGroupPermissionRevoked(string name, string perm) {
            String[] GroupUser = permission.GetUsersInGroup(name);
            if (GroupUser == null) return;
            foreach (String IDs in GroupUser) UpdatePermissions(IDs.Substring(0, 17), perm, false);
        }
#endregion
#endregion
#region Metods
#region Backpack Permissions
        private void UpdatePermissions(String ID, String Permissions, Boolean IsGranted) {
            UInt64 UserID = UInt64.Parse(ID);
            BasePlayer player = BasePlayer.FindByID(UserID);
            if(player == null) return;
            UInt64 IDBackpack = GetBackpackID(player);
            if (!Backpacks.ContainsKey(IDBackpack)) return;
            player.EndLooting();
            Int32 AvailableSlots = GetAvailableSlots(player);
            if (AvailableSlots < GetBusySlotsBackpack(player)) {
                Int32 Count = Backpacks[IDBackpack].Items.Count - 1;
                foreach (BackpackInfo.SavedItem Sitem in Backpacks[IDBackpack].Items.Take((Backpacks[IDBackpack].Items.Count - AvailableSlots))) {
                    NextTick(() => {
                        Item itemDrop = BuildItem(Sitem);
                        itemDrop.DropAndTossUpwards(player.transform.position, 2f);
                        Backpacks[IDBackpack].Items.RemoveAt(Count);
                        Count--;
                    }
                    );
                }
            }
            Backpacks[IDBackpack].AmountSlot = AvailableSlots;
            NextTick(() => {
                DrawUI_Backpack_Visual(player);
                SendChat(GetLang((IsGranted ? "BACKPACK_GRANT" : "BACKPACK_REVOKE"), player.UserIDString, AvailableSlots), player);
            }
            );
        }
#endregion
#region Backpack Action
        private void OpenBP(BasePlayer player) {
            if (IsDuel(player.userID)) return;
            Item backpack = GetBackpack(player);
            if (config.TurnedsSetting.Types == TypeBackpack.Wear) if (backpack == null) {
                SendChat(GetLang("BACKPACK_NO_WEARING", player.UserIDString), player);
                return;
            }
            BackpackBehaviour backpackHandler = null;
            if (PlayerBackpack.ContainsKey(player)) {
                if (PlayerBackpack[player] != null) backpackHandler = PlayerBackpack[player];
            }
            else PlayerBackpack.Add(player, null);
            if (backpackHandler == null) {
                backpackHandler = player.gameObject.AddComponent<BackpackBehaviour>();
                backpackHandler.Backpack = backpack;
                PlayerBackpack[player] = backpackHandler;
            }
            if (backpackHandler.Container != null) {
                if (config.TurnedsSetting.ClosePressedAgain) player.EndLooting();
                else SendChat(GetLang("BACKPACK_IS_OPENED", player.UserIDString), player);
                return;
            }
            backpackHandler.Open();
        }
        private void BackpackSpawnSpine(BasePlayer player) {
            if (!config.TurnedsSetting.UseSpineBackpack) return;
            if (SpinesBackpacks.ContainsKey(player) && SpinesBackpacks[player] != null) return;
            BackpackSpine backpackSpine = player.gameObject.AddComponent<BackpackSpine>();
            SpinesBackpacks.Add(player, backpackSpine);
        }
        private void BackpackRemoveSpine(BasePlayer player) {
            if (!config.TurnedsSetting.UseSpineBackpack) return;
            if (!SpinesBackpacks.ContainsKey(player) || SpinesBackpacks[player] == null) return;
            SpinesBackpacks[player].KillParent();
            SpinesBackpacks.Remove(player);
        }
#endregion
#region Generate Backpack
        public static StorageContainer CreateContainer(BasePlayer player) {
            StorageContainer storage = GameManager.server.CreateEntity("assets/prefabs/misc/halloween/coffin/coffinstorage.prefab") as StorageContainer;
            if (storage == null) return null;
            var containerEntity = storage as StorageContainer;
            if (containerEntity == null) {
                UnityEngine.Object.Destroy(storage);
                return null;
            }
            UnityEngine.Object.DestroyImmediate(storage.GetComponent<DestroyOnGroundMissing>());
            UnityEngine.Object.DestroyImmediate(storage.GetComponent<GroundWatch>());
            foreach (var collider in storage.GetComponentsInChildren<Collider>()) UnityEngine.Object.DestroyImmediate(collider);
            storage.transform.position = new Vector3(player.ServerPosition.x, player.ServerPosition.y - 100f, player.ServerPosition.z);
            storage.panelName = "generic_resizable";
            ItemContainer container = new ItemContainer {
                playerOwner = player
            }
            ;
            container.ServerInitialize((Item)null, _.GetSlotsBackpack(player));
            if ((Int32)container.uid == 0) container.GiveUID();
            storage.inventory = container;
            storage.OwnerID = player.userID;
            storage._limitedNetworking = false;
            storage.EnableSaving(false);
            storage.SendMessage("SetDeployedBy", player, (SendMessageOptions)SendMessageOptions.DontRequireReceiver);
            storage.Spawn();
            storage.inventory.allowedContents = ItemContainer.ContentsType.Generic;
            return storage;
        }
        private static void PlayerLootContainer(BasePlayer player, StorageContainer container) {
            container.SetFlag(BaseEntity.Flags.Open, true, false);
            player.inventory.loot.StartLootingEntity(container, false);
            player.inventory.loot.AddContainer(container.inventory);
            player.inventory.loot.SendImmediate();
            player.ClientRPCPlayer(null, player, "RPC_OpenLootPanel", "generic_resizable");
            container.DecayTouch();
            container.SendNetworkUpdate();
        }
#endregion
#region Upgrade Backpack
#region Generate Shop Front
        public static ShopFront CreateShopFront(BasePlayer player) {
            ShopFront shopFront = GameManager.server.CreateEntity("assets/prefabs/building/wall.frame.shopfront/wall.frame.shopfront.metal.prefab") as ShopFront;
            if (shopFront == null) return null;
            shopFront.transform.position = new Vector3(player.ServerPosition.x, player.ServerPosition.y + 100f, player.ServerPosition.z);
            shopFront.panelName = "shopfront";
            if (!shopFront) return null;
            UnityEngine.Object.DestroyImmediate(shopFront.GetComponent<DestroyOnGroundMissing>());
            UnityEngine.Object.DestroyImmediate(shopFront.GetComponent<GroundWatch>());
            foreach (var collider in shopFront.GetComponentsInChildren<Collider>()) UnityEngine.Object.DestroyImmediate(collider);
            shopFront._limitedNetworking = true;
            shopFront.EnableSaving(false);
            shopFront.SendMessage("SetDeployedBy", player, (SendMessageOptions)SendMessageOptions.DontRequireReceiver);
            shopFront.Spawn();
            return shopFront;
        }
        private static void PlayerLootContainer(BasePlayer player, ShopFront shopFront, List<Configuration.Backpack.BackpackCraft.ItemCraft> ItemList) {
            shopFront.SetFlag(BaseEntity.Flags.Open, true, false);
            shopFront.vendorInventory.capacity = 12;
            shopFront.customerInventory.capacity = 12;
            shopFront.customerPlayer = player;
            shopFront.customerInventory.playerOwner = player;
            shopFront.customerInventory.uid = (UInt32)player.userID;
            foreach (Configuration.Backpack.BackpackCraft.ItemCraft UpgradeItems in ItemList) {
                Item item = ItemManager.CreateByName(UpgradeItems.Shortname, UpgradeItems.Amount, UpgradeItems.SkinID);
                item.MoveToContainer(shopFront.vendorInventory);
            }
            player.inventory.loot.StartLootingEntity(shopFront, false);
            player.inventory.loot.AddContainer(shopFront.vendorInventory);
            player.ClientRPCPlayer(null, player, "RPC_OpenLootPanel", "shopfront");
            player.inventory.loot.AddContainer(shopFront.customerInventory);
            player.inventory.loot.SendImmediate();
            shopFront.UpdatePlayers();
            shopFront.DecayTouch();
            shopFront.SendNetworkUpdate();
        }
#endregion
        private void OpenUpgradeMenu(BasePlayer player) {
            if (!config.TurnedsSetting.UseUpgradeBackpack) return;
            if (player == null) return;
            ShopFrontBehavior upgradeHandler = null;
            if (PlayerBackpack.ContainsKey(player)) {
                if (PlayerBackpack[player] != null) upgradeHandler = PlayerUpgrades[player];
            }
            else PlayerBackpack.Add(player, null);
            if (upgradeHandler == null) {
                upgradeHandler = player.gameObject.AddComponent<ShopFrontBehavior>();
                PlayerUpgrades[player] = upgradeHandler;
            }
            if (upgradeHandler.Container != null) return;
            upgradeHandler.Open();
        }
        private void UpgradeBackpack(BasePlayer player) {
            if (player == null) return;
            if (!PlayerUpgrades.ContainsKey(player)) return;
            if (!HaveAllItem(player, PlayerUpgrades[player].ItemList, PlayerUpgrades[player].Container.customerInventory)) return;
            Configuration.Backpack.BackpackCraft Option = GetBackpackOption(player);
            if (Option == null) return;
            UInt64 ID = PlayerUpgrades[player].BackpackID;
            Int32 IndexUpgrade = Backpacks[ID].IndexUpgrade;
            if (Option.UpgradeList[IndexUpgrade + 1] == null) return;
            PlayerUpgrades[player].Container.customerInventory.SetLocked(true);
       
// ... [Code preview truncated due to length. Full source in attached file] ...

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