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("iVBORw0KGgoAAAANSUhEUgAAAcIAAAHCCAYAAAB8GMlFAAAgAElEQVR4Ae2dCdgl05nHD61bW9rWaGvr1q0xdk0I0mlE7NujZYagMYYxJGIy9sR4GOMZxDoiExFpWwQRgpBHYgudxNI0khAktDVo+7711O/kez/13b73flV1q+qeqvs/z1O36ladOsvvnHr/55w6VTXPnDlznJwIiIAIiIAI9CqBeXs148q3CIiACIiACEBAQqh6IAIiIAIi0NMEJIQ9XfzKvAiIgAiIgIRQdUAEREAERKCnCUgIe7r4lXkREAEREAEJoeqACIiACIhATxOQEPZ08SvzIiACIiACEkLVAREQAREQgZ4mICHs6eJX5kVABERABCSEqgMiIAIiIAI9TUBC2NPFr8yLgAiIgAhICFUHREAEREAEepqAhLCni1+ZFwEREAERkBCqDoiACIiACPQ0AQlhTxe/Mi8CIiACIiAhVB0QAREQARHoaQISwp4ufmVeBERABERAQqg6IAIiIAIi0NMEJIQ9XfzKvAiIgAiIgIRQdUAEREAERKCnCcwXSu4feeSRUJKidNSYwGabbbZJlL0p0TIpWiZEy4hokfuMwFvR5p+j5c5oufquu+6a/tkhbYlAcQTWXHPN4gIfJOR55syZM4iXcg5LCMvh3IuxNIjfxF5k0EGe74/OlSh2AFCnJiMgIYw4SQiTVRb5Sk6gTwCPic7YIflZ8tmGwA3RsVPUS2xDSIcyE5AQRugkhJnrj05sICABbACS/18JYv5Mez5ECWFUBSSEPX8ddAwgEsC1o0BOjhb1ADummSgABPG4qIf4UCLf8iQCbQh0Uwg1a7RNwehQdQhEIrhPlNqZ0SIRLK/YYD2zj315sSomEciZgIQwZ6AKrnwCfYZ4WvkxK8Y+AtOiMrg+WuiRy4lA5QhICCtXZEqwEcDwYoCj/xJBg9K9tXqH3WOvmDskICHsEKBO7w6BSAA1FNod9IPFSu+QspETgcoQkBBWpqiUUCPQZ2jVCzQg4a0lhuGViVLUhkAwb5Zpk8YBh9Zaa60B//Wntwgsuuii9DZyE8F55pnHAxw2bJibf/75/TJ8+HDHwv8PPvig8oA//fRTx2LOXqJB3t9880333nvv+Xzix46Z3w7WiKF74403Lu4gDJ1aAwIPP/xw8LmonBAGT1QJLIxAXiKIACByyyyzjFt77bXdmDFj3C677OIQw151t99+u3vyySfdzJkz3RNPPOHeffdd9/HHH3eKY1pUZhLDTinq/MIJSAgLR6wI8iCQhwjON998boUVVvDid8ABB7glllgij6TVIozJkyc7Fhy94F//+tfu1ltv9c/3vv32235/xh+JYUZwOq08ApV716iGRsurHKHEFIkg0/J5RjCTowe47rrrui222MLtuuuumcLo1ZNmzZrlLr74YkeP8f333+8Ew1QNk3aCr7rnJh0a7eYD9eoRVrd+9VLKeVtMJsfQ3NSpU91XvvKVTOf3+kmjR4923/rWt9yXvvQld+WVV7p77rknKxL1DLOS03mFE9Cs0cIRK4JOCPQNiWZ6W8wmm2zizj77bIlgJwXQd+7GG2/szjjjDLf33nu7oUOHZg0RMdRD91np6bzCCEgIC0OrgDsl0Gc0U88QHTJkiNtjjz3cqaee6saPH99pMnR+jMBBBx3kzj33XLfKKqvE9qbazNy7TxWLPItACgISwhSw5LV0AqmNJrNBGQo95JBDSk9sr0TIvZzzzjvPjRs3LkuWd4gaOHwcWU4EgiEgIQymKJSQOIEsQ6LMCt15553d/vvvHw9K2wUQWHDBBd20adPcqquumiV0vhEpJwLBEJAQBlMUSogRyDIkyszQb3zjG+7rX/+6BaN1CQQuvPBCt9JKK6WNSb3CtMTkv1ACEsJC8SrwjARSD4lus802/qH4jPHptA4IXHbZZf5NPCmDUK8wJTB5L46AhLA4tgo5A4G++0epZomuvvrq7thjj80Qm07Ji8CBBx6YNij1CtMSk//CCEgIC0OrgDMSmJLmvIUWWsh9+9vfdgyNynWPwO677+54xCKlU68wJTB5L4aAhLAYrgo1O4FJaU794he/6HjoW667BGiIHHbYYW6RRRZJkxD1CtPQkt/CCEgIC0OrgNMS6BsWnZj0vMi/23fffZN6l7+CCay44oqOL06kdKlGAFK
// ... [Code preview truncated due to length. Full source in attached file] ...