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

FREE BackPackPro : 1.2.3 1.2.3

Нет прав для скачивания
C#:
using Newtonsoft.Json;
using Oxide.Core;
using Oxide.Game.Rust.Cui;
using System;
using System.Collections.Generic;
using System.Linq;
using UnityEngine;
using Newtonsoft.Json.Serialization;
using System.Globalization;
using System.Collections;
using UnityEngine.Networking;
namespace Oxide.Plugins {
    //  Changes in 1.2.1
    //  Added support for QuickSort
    //  Added config option Sort (default true) to toggle sort button in UI.//  Fixed issues resulting from sleeping player being killed.//  Fixed physical backpack not updating when group/permissions are changed.//  Added pagination for backpacks on ground.//  Changes in 1.2.2
    //  Fixed loot box closing when trying to go to page number that is too high.//  Shortened delays in opening backpacks via button and command.//  Misc null checks.//  Fixed blacklist not working.[Info("BackPackPro", "Damo(Steenamaroo)", "1.2.3")]  // Written by Damo - WIP fixed by Steenamaroo
    [Description("Unlimited capacity backpack, and display the backpack solid model")]
    public class BackPackPro : RustPlugin {
#region Setup
        List<string> HookNames = new List<string>() {
            "OnGroupPermissionGranted", "OnGroupPermissionRevoked", "OnUserPermissionGranted", "OnUserPermissionRevoked", "OnItemAddedToContainer", "OnEntityKill", "OnEntityDeath"
        }
        ;
        private void LoadConfigVariables() {
            configData = Config.ReadObject<ConfigData>();
            SaveConfig(configData);
        }
        void RegisterPermissions() {
            permission.RegisterPermission(NodropPermission, this);
            permission.RegisterPermission(AdminPermission, this);
            for (int i = 0; i < ModelSizePermission.Count; i++) permission.RegisterPermission(ModelSizePermission[i], this);
            for (int i = 0; i < configData.PermissionsList.Count();
            i++) {
                permission.RegisterPermission(configData.PermissionsList[i], this);
                _Permissions.Add(configData.PermissionsList[i]);
            }
        }
        private void Init() {
            bpp = this;
            foreach (var hook in HookNames) Unsubscribe(hook);
            LoadData(out storedData, bpp.Name);
        }
        private void OnServerInitialized() {
            LoadConfigVariables();
            RegisterPermissions();
            if (configData.Backpack_Icon.Backpack_Icon) {
                gameObject = new GameObject();
                image_id = gameObject.AddComponent<ImageCache>();
                if (!string.IsNullOrEmpty(configData.Backpack_Icon.Image_URL)) image_id.Installation_picture(configData.Backpack_Icon.Image_URL);
                Installation_data_picture();
            }
            Model_size_installation(configData.Physical_backpack.Model_size, configData.Physical_backpack.IS_default_backpack);
            AddChatCommands(configData.Custom_command);
            timer.Once(1f, () =>  // Needed?
            {
                foreach (var hook in HookNames) Subscribe(hook);
                foreach (var player in BasePlayer.activePlayerList) OnPlayerConnected(player);
            }
            );
        }
        void AddChatCommands(CustomCommand c) {
            cmd.AddChatCommand(c._Opencommand, this, nameof(CmdBackPackProShow));
            cmd.AddChatCommand(c._3D_Model_command, this, nameof(Backpack_Modelcmd));
            cmd.AddConsoleCommand(c._Console_command_Open, this, nameof(Backpack_Opencmd));
        }
#endregion
        private void Unload() {
            foreach (var bag in DroppedBags) {
                if (bag.Value.Bag != null && !bag.Value.Bag.IsDestroyed) bag.Value.Bag.Kill();
                foreach (var itemcontainer in bag.Value.Containers) itemcontainer.Clear();
            }
            ItemManager.DoRemoves();
            SaveData();
            image_id?.OnDestroy();
            if (!string.IsNullOrEmpty(Builtpictur)) FileStorage.server.RemoveEntityNum(uint.MaxValue, Convert.ToUInt32(Builtpictur));
            foreach (var player in BasePlayer.activePlayerList) {
                OnPlayerDisconnected(player);
                CuiHelper.DestroyUi(player, "DroppedBagUI");
                CuiHelper.DestroyUi(player, "_Box_InfoUI");
                CuiHelper.DestroyUi(player, "_Box_ItemUI");
            }
            foreach (var item in Has_physical_model.Where(x => x.Value != null && !x.Value.IsDestroyed)) item.Value.Kill();
            bpp = null;
            configData = null;
        }
#region Hooks
        private void OnEntityTakeDamage(BaseCombatEntity entity, HitInfo info) {
            if (entity != null && info != null && entity.skinID == Protect_skin_ID) info.damageTypes.Clear();
        }
        List<ulong> ViolationProtected = new List<ulong>();
        object OnPlayerViolation(BasePlayer player, AntiHackType type, float amount) => ViolationProtected.Contains(player.userID) || Has_physical_model.ContainsKey(player.userID) ? false : (object)null;
        private void OnPlayerRespawned(BasePlayer player) {
            DataControl data = ReadOnlyBox(player);
            if (data == null) return;
            BoxItemCountUI(player, data.GetItemCount());
            AddPhysicalBackpack(player);
        }
        private void OnPlayerConnected(BasePlayer player) {
            DataControl data = ReadOnlyBox(player);
            if (data == null) return;
            BoxItemCountUI(player, data.GetItemCount());
            AddPhysicalBackpack(player);
        }
        private void OnPlayerSleep(BasePlayer player) => KillBackpack(player, false);
        private void OnEntityMounted(BaseMountable entity, BasePlayer player) => KillBackpack(player, false);
        private void OnEntityDismounted(BaseMountable bm, BasePlayer player) => AddPhysicalBackpack(player);
        private void OnPlayerDisconnected(BasePlayer player) {
            var id = player.userID;
            ViolationProtected.Add(id);
            timer.Once(30f, () => ViolationProtected.Remove(id));
            KillBackpack(player, false);
            DataControl data;
            if (Player_container_information.TryGetValue(player.userID, out data)) {
                if (Player_view_container.Contains(player.userID)) data.SaveBox();
                data.DestroyBox(player.userID);
            }
            if (TextJL.ContainsKey(player.userID)) TextJL.Remove(player.userID);
        }
        private void OnEntityDeath(BasePlayer player, HitInfo info) => OnEntityKill(player);
        private void OnEntityKill(BasePlayer player) {
            CuiHelper.DestroyUi(player, "DroppedBagUI");
            KillBackpack(player, false);
            if (configData.Dropped && player.userID.IsSteamId()) {
                DataControl data = ReadOnlyBox(player);
                if (data == null || permission.UserHasPermission(player.UserIDString, NodropPermission)) return;
                CuiHelper.DestroyUi(player, "_Box_ItemUI");
                if (data.GetItemCount() > 0) data.DroppedBackpack(player.transform.position, player.userID, player.displayName);
            }
        }
#endregion
#region LootHooks
        private object CanLootPlayer(BasePlayer looted, BasePlayer looter) => Player_view_container.Contains(looter.userID) && looter == looted || permission.UserHasPermission(looter.UserIDString, AdminPermission) ? true : (object)null;
        private void OnItemAddedToContainer(ItemContainer container, Item item) {
            if (container?.entityOwner == null || container?.playerOwner == null || !configData.BlacklistSettings.Enable_blacklist) return;
            if (container.entityOwner is RelationshipManager && Player_view_container.Contains(container.playerOwner.userID)) if (configData.BlacklistSettings.blacklist.Contains(item.info.displayName.translated)) container.playerOwner.GiveItem(item);
        }
        private void OnPlayerLootEnd(PlayerLoot playerLoot) {
            var player = (BasePlayer)playerLoot.gameObject.ToBaseEntity();
            if (Player_view_container.Contains(player.userID)) {
                DataControl data;
                if (Player_container_information.TryGetValue(player.userID, out data)) {
                    data.SaveBox();
                    BoxItemCountUI(player, data.GetItemCount());
                    Interface.CallHook("OnBackpackClosed", player, player.userID, data.Container_box);
                }
                CuiHelper.DestroyUi(player, "_Box_InfoUI");
                Player_view_container.Remove(player.userID);
            }
            if (Admin_viewing_containers.ContainsKey(player.userID)) {
                var Look = Admin_viewing_containers[player.userID];
                DataControl data;
                if (Player_container_information.TryGetValue(Look, out data)) {
                    data.SaveBox();
                    Interface.CallHook("OnBackpackClosed", player, player.userID, data.Container_box);
                }
                CuiHelper.DestroyUi(player, "_Box_InfoUI");
                Admin_viewing_containers.Remove(player.userID);
            }
            CuiHelper.DestroyUi(player, "DroppedBagUI");
        }
#endregion
#region Create/Destroy
        private int Default3DInfo = 0;
        private class Model_Info {
            public Vector3 pos;
            public float size;
            public string part;
        }
        public enum Sizes {
            mini, small, medium, large, giant
        }
        private void Model_size_installation(string text, bool isBackpack) {
            Sizes num;
            if (Enum.TryParse<Sizes>(text.ToLower(), out num)) Default3DInfo = isBackpack ? (int)num + 5 : (int)num;
        }
        private readonly Dictionary<int, Model_Info> Permission_3DInfo = new Dictionary<int, Model_Info>() {
            {
                0, new Model_Info {
                    size = 0.6f, pos = new Vector3(0f, 0.35f, -.17f)
                }
            }
            , {
                1, new Model_Info {
                    size = 0.8f, pos = new Vector3(0f, 0.35f, -.19f)
                }
            }
            , {
                2, new Model_Info {
                    size = 1f, pos = new Vector3(0f, 0.35f, -.21f)
                }
            }
            , {
                3, new Model_Info {
                    size = 1.3f, pos = new Vector3(0f, 0.35f, -.23f)
                }
            }
            , {
                4, new Model_Info {
                    size = 1.6f, pos = new Vector3(0f, 0.35f, -.25f)
                }
            }
            , {
                5, new Model_Info {
                    size = 0.6f, pos = new Vector3(-0.15f, 0.03f, 0f)
                }
            }
            , {
                6, new Model_Info {
                    size = 0.8f, pos = new Vector3(-0.1f, 0.03f, 0f)
                }
            }
            , {
                7, new Model_Info {
                    size = 1f, pos = new Vector3(-0.05f, 0.03f, 0f)
                }
            }
            , {
                8, new Model_Info {
                    size = 1.3f, pos = new Vector3(-0.05f, 0.03f, 0f)
                }
            }
            , {
                9, new Model_Info {
                    size = 1.6f, pos = new Vector3(-0.05f, 0.03f, 0f)
                }
            }
            ,
        }
        ;
        private void AddPhysicalBackpack(BasePlayer Player) {
            if (!Player.userID.IsSteamId()) return;
            if (Has_physical_model.ContainsKey(Player.userID) || Disable_3D_Backpack_Model.Contains(Player.userID) || GetSize(Player) == 0) return;
            ulong userID = Player.userID;
            int ModeSize = GetModelSize(Player);
            if (ModeSize < 0 && !configData.Physical_backpack.Enable_default_model_Display) return;
            var Model = CreatebasicMode(ModeSize >= 0 ? ModeSize : Default3DInfo, Player);
            Has_physical_model.Add(Player.userID, Model);
            timer.Once(2.7f, () => {
                if (Player != null && Player.IsAlive() && Model != null && Has_physical_model.ContainsKey(userID)) {
                    Model.transform.localPosition = Permission_3DInfo[ModeSize >= 0 ? ModeSize : Default3DInfo].pos;
                    if (Model is DroppedItemContainer) {
                        Model.transform.localPosition += Vector3.left / 8;
                        Model.transform.localRotation = new Quaternion(-3f, 0f, 3f, 0f);
                        Model.SetParent(Player, "spine1");
                    }
                    else {
                        Model.transform.localRotation = Quaternion.Euler(85, 183, 0);
                        Model.SetParent(Player, "pelvis");
                    }
                }
                else {
                    if (Has_physical_model.ContainsKey(userID)) {
                        foreach (var item in Has_physical_model) if (item.Value != null) item.Value.Kill();
                        Has_physical_model.Remove(userID);
                    }
                }
            }
            );
        }
        private BaseEntity CreatebasicMode(int key, BasePlayer player) {
            Model_Info info = Permission_3DInfo[key];
            BaseEntity Model = GameManager.server.CreateEntity(key < 5 ? Small_stash_prefabs : Backpack_prefabs);
            if (info.size != 1f) {
                SphereEntity sphere = DoShrink(Model, info.size, player);
                Model.SetParent(sphere);
            }
            Model.skinID = Protect_skin_ID;
            Model.SetFlag(BaseEntity.Flags.Busy, true);
            Model.SetFlag(BaseEntity.Flags.Locked, true);
            Model.Spawn();
            Model.SendNetworkUpdate(BasePlayer.NetworkQueue.Update);
            Model.UpdateNetworkGroup();
            if (key < 5) {
                Model._limitedNetworking = false;
                Model.enableSaving = false;
                Model.GetComponent<BoxCollider>().enabled = false;
            }
            var rigidbodyBP = Model.GetComponent<Rigidbody>();
            if (rigidbodyBP != null) {
                rigidbodyBP.useGravity = false;
                rigidbodyBP.isKinematic = true;
                rigidbodyBP.drag = 0;
                rigidbodyBP.interpolation = RigidbodyInterpolation.Extrapolate;
            }
            DroppedItemContainer container = Model as DroppedItemContainer;
            if (container) container.ResetRemovalTime(9999999);
            return Model;
        }
        private SphereEntity DoShrink(BaseEntity Model, float Size, BasePlayer player) {
            SphereEntity sphere = GameManager.server.CreateEntity(SpherePrefab, player.transform.TransformPoint(Vector3.up * 10), Quaternion.identity) as SphereEntity;
            sphere.enableSaving = false;
            sphere.lerpSpeed = 0f;
            sphere.currentRadius = sphere.lerpRadius = Size;
            sphere.transform.localScale = new Vector3(Size, Size, Size);
            sphere.SetParent(sphere.GetParentEntity());
            sphere.Spawn();
            timer.Once(2.5f, () => {
                if (Model != null && !Model.IsDestroyed) Model.SetParent(null, true, true);
                if (sphere != null && !sphere.IsDestroyed) sphere.Kill();
            }
            );
            return sphere;
        }
        private void KillBackpack(BasePlayer player, bool add) {
            if (player?.net?.connection == null || player.IsNpc || !player.IsAlive() || player.IsSleeping()) return;
            CuiHelper.DestroyUi(player, "_Box_InfoUI");
            if (Has_physical_model.ContainsKey(player.userID)) {
                var item = Has_physical_model[player.userID];
                if (item != null && !item.IsDestroyed) item.Kill();
                Has_physical_model.Remove(player.userID);
            }
            if (!add) return;
            timer.Once(0.5f, () => {
                if (player != null && player.IsAlive()) AddPhysicalBackpack(player);
            }
            );
        }
#endregion
#region Permissions
        private readonly List<string> ModelSizePermission = new List<string> {
            {
                "backpackpro.smallstash.mini"
            }
            , {
                "backpackpro.smallstash.small"
            }
            , {
                "backpackpro.smallstash.medium"
            }
            , {
                "backpackpro.smallstash.large"
            }
            , {
                "backpackpro.smallstash.mgiant"
            }
            , {
                "backpackpro.backpack.mini"
            }
            , {
                "backpackpro.backpack.small"
            }
            , {
                "backpackpro.backpack.medium"
            }
            , {
                "backpackpro.backpack.large"
            }
            , {
                "backpackpro.backpack.mgiant"
            }
            ,
        }
        ;
        private void OnGroupPermissionGranted(string group, string perm) {
            if (ModelSizePermission.Contains(perm)) {
                for (int i = 0; i < ModelSizePermission.Count; i++) if (ModelSizePermission[i] != perm) permission.RevokeGroupPermission(group, ModelSizePermission[i]);
                UpdateGroupPlayers(group);
            }
        }
        private void OnGroupPermissionRevoked(string group, string perm) {
            if (ModelSizePermission.Contains(perm)) UpdateGroupPlayers(group);
        }
        void UpdateGroupPlayers(string group) {
            foreach (var player in BasePlayer.activePlayerList) if (permission.UserHasGroup(player.UserIDString, group)) KillBackpack(player, true);
        }
        private void OnUserPermissionGranted(string userId, string perm) {
            if (ModelSizePermission.Contains(perm)) {
                for (int i = 0; i < ModelSizePermission.Count; i++) if (ModelSizePermission[i] != perm) permission.RevokeUserPermission(userId, ModelSizePermission[i]);
                KillBackpack(BasePlayer.Find(userId), true);
            }
        }
        private void OnUserPermissionRevoked(string userId, string perm) {
            if (ModelSizePermission.Contains(perm)) KillBackpack(BasePlayer.Find(userId), true);
        }
#endregion
#region Helpers
        private int GetModelSize(BasePlayer player) {
            for (int i = ModelSizePermission.Count - 1; i >= 0; i--) if (permission.UserHasPermission(player.UserIDString, ModelSizePermission[i])) return i;
            return -1;
        }
        private HashSet<ulong> Buffer = new HashSet<ulong>();
        private int GetSize(BasePlayer player) {
            int Size = 0;
            for (int i = _Permissions.Count - 1; i >= 0; i--) {
                if (permission.UserHasPermission(player.UserIDString, _Permissions[i])) {
                    Size = Convert.ToInt32(_Permissions[i].Replace(_Check_name, ""));
                    break;
                }
            }
            if (storedData.Id.ContainsKey(player.userID) && Size < storedData.Id[player.userID]) Size = storedData.Id[player.userID];
            return Size;
        }
        private BasePlayer FindPlayer(string nameOrIdOrIp) {
            foreach (var player in BasePlayer.allPlayerList) if (player.UserIDString == nameOrIdOrIp || (player?.net?.connection != null && (player.displayName.Contains(nameOrIdOrIp, CompareOptions.OrdinalIgnoreCase) || player.net.connection.ipaddress == nameOrIdOrIp))) return player;
            return null;
        }
        private void UpPltext(BasePlayer player, string[] args) {
            if (!player.userID.IsSteamId() || args.Length <= 0) {
                if (TextJL.ContainsKey(player.userID)) TextJL.Remove(player.userID);
                return;
            }
            if (!TextJL.ContainsKey(player.userID)) TextJL.Add(player.userID, args[0]);
            TextJL[player.userID] = args[0];
        }
#endregion
        private class ImageCache : MonoBehaviour {
            public string Picture_ID = null;
            public void Installation_picture(string link) => StartCoroutine(_IEnumerator(link));
            public void OnDestroy() {
                if (!string.IsNullOrEmpty(Picture_ID)) FileStorage.server.RemoveEntityNum(uint.MaxValue, Convert.ToUInt32(Picture_ID));
            }
            private IEnumerator _IEnumerator(string link) {
                using (UnityWebRequest www = UnityWebRequest.Get(link)) {
                    yield return www.SendWebRequest();
                    if (www?.downloadHandler?.data != null) {
                        Texture2D texture = new Texture2D(2, 2);
                        texture.LoadImage(www.downloadHandler.data);
                        if (texture != null) {
                            byte[] bytes = texture.EncodeToPNG();
                            if (bytes != null) Picture_ID = FileStorage.server.Store(bytes, FileStorage.Type.png, CommunityEntity.ServerInstance.net.ID).ToString();
                            DestroyImmediate(texture);
                        }
                    }
                }
            }
        }
        private const string Backpack_prefabs = "assets/prefabs/misc/item drop/item_drop_backpack.prefab";
        private const string Small_stash_prefabs = "assets/prefabs/deployable/small stash/small_stash_deployed.prefab";
        private const string SpherePrefab = "assets/prefabs/visualization/sphere.prefab";
        private const string PrflootPanelName = "generic_resizable";
        private ImageCache image_id;
        private GameObject gameObject;
        private static BackPackPro bpp;
        private HashSet<ulong> Player_view_container = new HashSet<ulong>();
        private Dictionary<ulong, DataControl> Player_container_information = new Dictionary<ulong, DataControl>();
        private Dictionary<ulong, ulong> Admin_viewing_containers = new Dictionary<ulong, ulong>();
        private List<string> _Permissions = new List<string>();
        private const string _Check_name = "backpackpro.size", _Path_name = "BackPackPro/", AdminPermission = "backpackpro.admin", NodropPermission = "backpackpro.nodrop";
        private const ulong Protect_skin_ID = 1001;
        private Dictionary<ulong, BaseEntity> Has_physical_model = new Dictionary<ulong, BaseEntity>();
        private HashSet<ulong> Disable_3D_Backpack_Model = new HashSet<ulong>();
        public class DataControl {
            public ulong playerID = 0;
            public int Numbe_of_boxes;
            public int BBPages;
            public ItemContainer Container_box = new ItemContainer();
            public List<List<ItemData>> Item_data_list = new List<List<ItemData>>();
            public void SaveBox() {
                while (Item_data_list.Count <= BBPages) Item_data_list.Add(new List<ItemData>());
                Item_data_list[BBPages] = Container_box.itemList.Select(ItemData.CopyItem).ToList();
                SaveData(Item_data_list, playerID.ToString());
                Container_box.Clear();
                ItemManager.DoRemoves();
            }
            public void DestroyBox(ulong userID) {
                Container_box.Kill();
                ItemManager.DoRemoves();
                bpp.Player_container_information.Remove(userID);
            }
            public int GetItemCount() {
                int temp = 0;
                foreach (var item in Item_data_list) temp += item.Count;
                return temp;
            }
            public void DroppedBackpack(Vector3 position, ulong userID, string userName) {
                DroppedItemContainer container = CreateContainer(position, userID, userName);
                if (container == null) return;
                container.Spawn();
                container.ResetRemovalTime(Math.Max(bpp.configData.Deathseconds, container.CalculateRemovalTime()));
                bpp.DroppedBags.Add(container.net.ID, new Dropped() {
                    Bag = container
                }
                );
                for (int i = 0; i < Item_data_list.Count; i++) {
                    var ic = new ItemContainer();
                    ic.isServer = true;
                    ic.capacity = 48;
                    ic.allowedContents = ItemContainer.ContentsType.Generic;
                    bpp.DroppedBags[container.net.ID].Containers.Add(ic);
                    foreach (var ProItem in Item_data_list[i]) {
                        var item = ProItem.GetItem();
                        item.MoveToContainer(ic);
                    }
                }
                Item_data_list.Clear();
                SaveData(Item_data_list, userID.ToString());
                ItemManager.DoRemoves();
            }
            private DroppedItemContainer CreateContainer(Vector3 position, ulong userID, string userName) {
                DroppedItemContainer container = GameManager.server.CreateEntity(Backpack_prefabs, position + new Vector3(0, 0, 0), Quaternion.identity) as DroppedItemContainer;
                container.lootPanelName = PrflootPanelName;
                container.playerName = userName;
                container.playerSteamID = userID;
                container.inventory = new ItemContainer();
                container.inventory.ServerInitialize(null, 48);
                container.inventory.GiveUID();
                container.inventory.entityOwner = RelationshipManager.ServerInstance;
                container.inventory.SetFlag(ItemContainer.Flag.NoItemInput, true);
                return container;
            }
        }
        private void BoxInstallItems(List<ItemData> ItemList, ItemContainer container, BasePlayer player) {
            foreach (var BackPackProItem in ItemList) {
                var item = BackPackProItem.GetItem();
                if (item != null) if (!item.MoveToContainer(container, item.position)) player.GiveItem(item);
            }
        }
        public class ItemData {
            public int ID, Amount, FlameFuel, BlueprintTarget, Ammo, AmmoType, DataInt, Position = -1;
            public float Fuel, Condition, MaxCondition = -1;
            public bool IsBlueprint;
            public ulong Skin;
            public string Name, Text;
            public List<ItemData> Contents = new List<ItemData>();
            public Item GetItem() {
                if (Amount == 0) return null;
                Item item = ItemManager.CreateByItemID(ID, Amount, Skin);
                if (item == null) return null;
                item.position = Position;
                if (IsBlueprint) {
                    item.blueprintTarget = BlueprintTarget;
                    return item;
                }
                item.fuel = Fuel;
                item.condition = Condition;
                item.name = Name;
                item.text = Text;
                if (MaxCondition != -1) item.maxCondition = MaxCondition;
                if (Contents != null && Contents.Count > 0) {
                    if (item.contents == null) {
                        item.contents = new ItemContainer();
                        item.contents.ServerInitialize(null, Contents.Count);
                        item.contents.GiveUID();
                        item.contents.parent = item;
                    }
                    foreach (var contentItem in Contents) contentItem.GetItem()?.MoveToContainer(item.contents);
                }
                BaseProjectile.Magazine magazine = item.GetHeldEntity()?.GetComponent<BaseProjectile>()?.primaryMagazine;
                if (magazine != null) {
                    magazine.contents = Ammo;
                    magazine.ammoType = ItemManager.FindItemDefinition(AmmoType);
                }
                FlameThrower flameThrower = item.GetHeldEntity()?.GetComponent<FlameThrower>();
                if (flameThrower != null) flameThrower.ammo = FlameFuel;
                if (DataInt > 0) item.instanceData = new ProtoBuf.Item.InstanceData {
                    ShouldPool = false, dataInt = DataInt
                }
                ;
                return item;
            }
            public static ItemData CopyItem(Item item) => new ItemData() {
                ID = item.info.itemid, Position = item.position, Name = item.name, Text = item.text, Fuel = item.fuel, Skin = item.skin, Amount = item.amount, Condition = item.condition, MaxCondition = item.maxCondition, IsBlueprint = item.IsBlueprint(), BlueprintTarget = item.blueprintTarget, DataInt = item.instanceData?.dataInt ?? 0, Contents = item.contents?.itemList?.Select(CopyItem).ToList(), FlameFuel = item.GetHeldEntity()?.GetComponent<FlameThrower>()?.ammo ?? 0, Ammo = item.GetHeldEntity()?.GetComponent<BaseProjectile>()?.primaryMagazine?.contents ?? 0, AmmoType = item.GetHeldEntity()?.GetComponent<BaseProjectile>()?.primaryMagazine?.ammoType?.itemid ?? 0,
            }
            ;
        }
        Dictionary<uint, Dropped> DroppedBags = new Dictionary<uint, Dropped>();
        public class Dropped {
            public DroppedItemContainer Bag;
            public List<ItemContainer> Containers = new List<ItemContainer>();
        }
        object CanLootEntity(BasePlayer player, DroppedItemContainer container) {
            if (DroppedBags.ContainsKey(container.net.ID)) {
                var test = DroppedBags[container.net.ID];
                container.inventory = test.Containers[0];
                DroppedBagView(player, container.net.ID, test.Containers.Count(), 0);
            }
            return null;
        }
        private void DroppedBagView(BasePlayer player, uint BoxID, int boxes, int page = 0) {
            CuiHelper.DestroyUi(player, "DroppedBagUI");
            var elements = new CuiElementContainer();
            var Mian = elements.Add(CuiBg(".5 0", ".5 0", "300 20", "410 100"), "Overlay", "DroppedBagUI");
            if (boxes > 1) {
                if (page > 0) elements.Add(DMButton(null, $"bppnext {BoxID} {boxes} {page - 1}", "0.7", ".3 1", "|◄", 14, "0.435 0.533 0.259.8"), Mian);
                elements.Add(CuiText(Mian, $"{page + 1}", ".3.7", ".7 1", "1 1 1 1", 16));
                if (boxes > page + 1) elements.Add(DMButton(null, $"bppnext {BoxID} {boxes} {page + 1}", ".7.7", "1 1", "►|", 14, "0.435 0.533 0.259.8"), Mian);
            }
            CuiHelper.AddUi(player, elements);
        }
        [ConsoleCommand("bppnext")]
        private void DroppedBagPageChange(ConsoleSystem.Arg arg) {
            if (arg?.Args?.Count() == 0 || arg.Player() == null) return;
            var container = Convert.ToUInt32(arg.Args[0]);
            int boxes = Convert.ToInt16(arg.Args[1]);
            int page = Convert.ToInt16(arg.Args[2]);
            DroppedBags[container].Bag.inventory = DroppedBags[container].Containers[page];
            LootBox(arg.Player(), DroppedBags[container].Bag.inventory);
            DroppedBagView(arg.Player(), container, boxes, page);
        }
        private DataControl InstallationBox(BasePlayer player, int num1 = 0, bool Admin = false) {
            int Size = GetSize(player);
            if (Size == 0) return null;
            if (Admin) if (!HaveData(player.UserIDString)) return null;
            int BoxSL = Size % 48 > 0 ? Size / 48 + 1 : Size / 48;
            if (BoxSL <= num1) return null;
            int LastSL = BoxSL > 1 ? Size - (BoxSL - 1) * 48 : Size;
            int ContainerSize = BoxSL - 1 == num1 ? LastSL : 48;
            DataControl data;
            if (!Player_container_information.TryGetValue(player.userID, out data)) {
                Player_container_information[player.userID] = data = new DataControl();
                data.playerID = player.userID;
                data.Container_box.isServer = true;
                data.Container_box.allowedContents = ItemContainer.ContentsType.Generic;
                data.Container_box.GiveUID();
                data.Container_box.capacity = ContainerSize;
                data.Container_box.entityOwner = RelationshipManager.ServerInstance;
                data.Container_box.playerOwner = player;
                if (HaveData(player.UserIDString)) {
                    LoadData(out data.Item_data_list, player.UserIDString);
                    if (data.Item_data_list.Count > num1) BoxInstallItems(data.Item_data_list[num1], data.Container_box, player);
                }
                data.BBPages = num1;
            }
            else {
                if (data.Container_box.capacity != ContainerSize) data.Container_box.capacity = ContainerSize;
                if (data.Item_data_list.Count > num1) BoxInstallItems(data.Item_data_list[num1], data.Container_box, player);
                data.BBPages = num1;
            }
            data.Numbe_of_boxes = BoxSL;
            return data;
        }
        private DataControl ReadOnlyBox(BasePlayer player, int num1 = 0) {
            int Size = GetSize(player);
            if (Size == 0) return null;
            int BoxSL = Size % 48 > 0 ? Size / 48 + 1 : Size / 48;
            if (BoxSL <= num1) return null;
            int LastSL = BoxSL > 1 ? Size - (BoxSL - 1) * 48 : Size;
            int ContainerSize = BoxSL - 1 == num1 ? LastSL : 48;
            DataControl data;
            if (!Player_container_information.TryGetValue(player.userID, out data)) {
                Player_container_information[player.userID] = data = new DataControl();
                data.playerID = player.userID;
                data.Container_box.isServer = true;
                data.Container_box.allowedContents = ItemContainer.ContentsType.Generic;
                data.Container_box.GiveUID();
                data.Container_box.capacity = ContainerSize;
                data.Container_box.entityOwner = RelationshipManager.ServerInstance;
                data.Container_box.playerOwner = player;
                if (HaveData(player.UserIDString)) LoadData(out data.Item_data_list, player.UserIDString);
                data.BBPages = num1;
                data.Numbe_of_boxes = BoxSL;
            }
            return data;
        }
        private void LootBox(BasePlayer player, ItemContainer container) {
            player.inventory.loot.Clear();
            player.inventory.loot.PositionChecks = false;
            player.inventory.loot.entitySource = container.entityOwner ?? player;
            player.inventory.loot.itemSource = null;
            player.inventory.loot.MarkDirty();
            player.inventory.loot.AddContainer(container);
            player.inventory.loot.SendImmediate();
            player.ClientRPCPlayer(null, player, "RPC_OpenLootPanel", PrflootPanelName);
            Interface.CallHook("OnBackpackOpened", player, player.userID, container);
        }
#region lang
        private string GetLang(string langKey, string playerId = null, params object[] args) => string.Format(lang.GetMessage(langKey, this, playerId), args);
        protected override void LoadDefaultMessages() {
            lang.RegisterMessages(new Dictionary<string, string> {
                {
                    "NoPermission", "<size=15>[ BackPackPro ]</size> Not have permission !"
                }
                , {
                    "NotFound", "<size=15>[ BackPackPro ]</size> This player was not found !"
                }
                , {
                    "NoStats", "<size=15>[ BackPackPro ]</size> No stats found for this player !"
                }
                , {
                    "CapacityAdd", "{0}'s backpack capacity increased from {1} to {2} !"
                }
                , {
                    "Disabled", "<size=15>[ BackPackPro ]</size> 3d backpack model <color=#FF0000>Disabled</color> !"
                }
                , {
                    "Enable", "<size=15>[ BackPackPro ]</size> 3d backpack model <color=#66FF00>Enable</color> !"
                }
                , {
                    "Sort", "Sort"
                }
                ,
            }
            , this, "en");
            lang.RegisterMessages(new Dictionary<string, string> {
                {
                    "Sort", "整理"
                }
                , {
                    "NoPermission", "<size=15>[ BackPackPro ]</size> 没有权限 !"
                }
                , {
                    "NotFound", "<size=15>[ BackPackPro ]</size> 未发现这个玩家 !"
                }
                , {
                    "NoStats", "<size=15>[ BackPackPro ]</size> 未发现这个玩家的数据信息 !"
                }
                , {
                    "CapacityAdd", "{0} 的背包容量从 {1} 增加到 {2} !"
                }
                , {
                    "Disabled", "<size=15>[ BackPackPro ]</size> 3D模背包模型 <color=#FF0000>禁用</color> !"
                }
                , {
                    "Enable", "<size=15>[ BackPackPro ]</size> 3D模背包模型 <color=#66FF00>启用</color> !"
                }
                ,
            }
            , this, "zh-CN");
        }
#endregion
        private void Backpack_Modelcmd(BasePlayer player) {
            if (GetModelSize(player) > -1 || configData.Physical_backpack.Enable_default_model_Display) {
                if (Disable_3D_Backpack_Model.Contains(player.userID)) {
                    Disable_3D_Backpack_Model.Remove(player.userID);
                    player.ChatMessage(GetLang("Enable", player.UserIDString));
                    AddPhysicalBackpack(player);
                }
                else {
                    KillBackpack(player, false);
                    Disable_3D_Backpack_Model.Add(player.userID);
                    player.ChatMessage(GetLang("Disabled", player.UserIDString));
                }
            }
            else player.ChatMessage(GetLang("NoPermission", player.UserIDString));
        }
        private void Backpack_Opencmd(ConsoleSystem.Arg arg) {
            timer.Once(0.1f, () => {
                if (arg.Player() == null) return;
                OpenContainer(arg.Player());
            }
            );
        }
        private void OpenContainer(BasePlayer player) {
            if (Player_view_container.Contains(player.userID) || Buffer.Contains(player.userID)) return;
            Buffer.Add(player.userID);
            timer.Once(0.1f, () => Buffer.Remove(player.userID) );
            if (player.inventory.loot?.entitySource != null) player.EndLooting();
            if (player == null) return;
            DataControl data = InstallationBox(player);
            if (data != null) {
                NextTick(() => {
                    if (data?.Container_box != null && player != null) {
                        LootBox(player, data.Container_box);
                        BoxInfoUI(player, data.Container_box.capacity, data.Numbe_of_boxes);
                        Player_view_container.Add(player.userID);
                        AddPhysicalBackpack(player);
                    }
                }
                );
            }
            else player.ChatMessage(GetLang("NoPermission", player.UserIDString));
        }
        private void CmdBackPackProShow(BasePlayer player, string command, string[] args) {
            if (args.Length == 0) timer.Once(0.2f, () => OpenContainer(player));
            else if (args.Length == 1) {
                if (Buffer.Contains(player.userID)) return;
                if (!permission.UserHasPermission(player.UserIDString, AdminPermission)) {
                    player.ChatMessage(GetLang("NoPermission", player.UserIDString));
                    return;
                }
                else {
                    var Target = FindPlayer(args[0]);
                    if (Target == null) {
                        player.ChatMessage(GetLang("NotFound", player.UserIDString));
                        return;
                    }
                    DataControl data = InstallationBox(Target, 0, true);
                    if (data == null) {
                        player.ChatMessage(GetLang("NoStats", player.UserIDString));
                        return;
                    }
                    if (player.inventory.loot?.entitySource != null) player.EndLooting();
                    timer.Once(0.2f, () => {
                        if (!Admin_viewing_containers.ContainsKey(player.userID)) Admin_viewing_containers[player.userID] = Target.userID;
                        else Admin_viewing_containers[player.userID] = Target.userID;
                        BoxInfoUI(player, data.Container_box.capacity, data.Numbe_of_boxes, 0, Target.userID);
                        LootBox(player, data.Container_box);
                    }
                    );
                }
            }
        }
        [ConsoleCommand("backpackpro.cmd")]
        private void Entitybackpackcmd(ConsoleSystem.Arg arg) {
            if (arg?.Args?.Count() == 0 || arg.Player() == null) return;
            ulong PlayerUserID = arg.Player().userID;
            try {
                switch (arg.Args[0]) {
                    case "sort" : DataControl box;
                    if (Player_container_information.TryGetValue(PlayerUserID, out box)) {
                        if (box.Container_box != null) {
                            if (box.Container_box.itemList.Count < 1) return;
                            var a = box.Container_box.itemList;
                            a.Sort((x, y) => x.info.itemid.CompareTo(y.info.itemid) + x.skin.CompareTo(y.skin));
                            a = a.OrderBy(b => b.info.category).ToList();
                            while (box.Container_box.itemList.Count > 0) box.Container_box.itemList[0].RemoveFromContainer();
                            foreach (var c in a) c.MoveToContainer(box.Container_box);
                        }
                    }
                    break;
                    case "next" : if (arg.Args.Length < 4) return;
                    int num1 = int.Parse(arg.Args[2]);
                    if (num1 < 0) num1 = 0;
                    ulong TargetuseID = ulong.Parse(arg.Args[3]);
                    arg.Player().EndLooting();
                    if (Buffer.Contains(arg.Player().userID)) return;
                    bool last = false;
                    DataControl data = null;
                    if (Player_container_information.TryGetValue(arg.Player().userID, out data)) if (data.Container_box.capacity < 48) last = true;
                    data = InstallationBox(arg.Player(), num1);
                    if (data == null) return;
                    timer.Once(last ? 0.2f : 0f, () => {
                        if (data == null || arg.Player() == null) return;
                        if (TargetuseID == 0) {
                            LootBox(arg.Player(), data.Container_box);
                            Player_view_container.Add(PlayerUserID);
                            BoxInfoUI(arg.Player(), data.Container_box.capacity, data.Numbe_of_boxes, num1);
                        }
                        else {
                            var Target = FindPlayer(arg.Args[3]);
                            if (Target == null) return;
                            LootBox(arg.Player(), data.Container_box);
                            BoxInfoUI(arg.Player(), data.Container_box.capacity, data.Numbe_of_boxes, num1, TargetuseID);
                            if (!Admin_viewing_containers.ContainsKey(PlayerUserID)) Admin_viewing_containers.Add(PlayerUserID, TargetuseID);
                        }
                    }
                    );
                    break;
                }
            }
            catch {
                Puts("backpackpro.cmd error!");
            }
        }
        [ConsoleCommand("backpackpro.tz")]
        private void tiaozhuancmd(ConsoleSystem.Arg arg) {
            if (arg.Player() == null) return;
            if (Buffer.Contains(arg.Player().userID)) return;
            var txt = pltext(arg.Player());
            if (txt != null) {
                try {
                    int num1 = int.Parse(txt);
                    num1--;
                    if (num1 < 0) return;
                    arg.Player().EndLooting();
                    bool last = false;
                    DataControl data = null;
                    if (Player_container_information.TryGetValue(arg.Player().userID, out data)) if (data.Container_box.capacity < 48) last = true;
                    timer.Once(last ? 0.2f : 0, () => {
                        int numofboxes = Convert.ToInt16(arg.Args[0]);
                        if (num1 >= numofboxes) num1 = numofboxes - 1;
                        data = InstallationBox(arg.Player(), num1);
                        if (data == null) return;
                        LootBox(arg.Player(), data.Container_box);
                        Player_view_container.Add(arg.Player().userID);
                        BoxInfoUI(arg.Player(), data.Container_box.capacity, data.Numbe_of_boxes, num1);
                    }
                    );
                }
                catch {
                }
            }
        }
        private string Builtpictur = null;
        private byte[] Builtpicturedata = Convert.FromBase64String("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
// ... [Code preview truncated due to length. Full source in attached file] ...

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

Другие ресурсы пользователя 15FPS

Сверху