C#:
using Oxide.Core.Plugins;
using UnityEngine;
using System.Text;
using Newtonsoft.Json;
using System.Collections;
using Oxide.Game.Rust.Cui;
using System;
using System.Collections.Generic;
using System.Linq;
using Network;
using ConVar;
namespace Oxide.Plugins {
[Info("IQBackpack", "Mercury", "1.0.19")]
[Description("Просто твой любимый рюкзачок :)")]
class IQBackpack : RustPlugin {
public static StringBuilder sb = new StringBuilder();
class BackpackSpine : FacepunchBehaviour {
Rigidbody rigidbodyBP;
DroppedItemContainer backpack;
BasePlayer player;
public BackpackSpine() {
player = GetComponent<BasePlayer>();
backpack = GameManager.server.CreateEntity("assets/prefabs/misc/item drop/item_drop_backpack.prefab", player.transform.position + new Vector3(0f, -7f, 0f), new Quaternion()) as DroppedItemContainer;
rigidbodyBP = backpack.GetComponent<Rigidbody>();
rigidbodyBP.useGravity = false;
rigidbodyBP.isKinematic = true;
rigidbodyBP.drag = 0;
rigidbodyBP.interpolation = RigidbodyInterpolation.Extrapolate;
backpack.OwnerID = player.userID;
ItemContainer container = new ItemContainer {
playerOwner = player
}
;
container.ServerInitialize((Item)null, _.GetSlotsBackpack(player));
if ((Int32)container.uid == 0) container.GiveUID();
backpack.inventory = container;
backpack.SetFlag(BaseEntity.Flags.Busy, true);
backpack.SetFlag(BaseEntity.Flags.Locked, true);
backpack.Spawn();
backpack.SendNetworkUpdate(BasePlayer.NetworkQueue.Update);
backpack.UpdateNetworkGroup();
backpack.transform.localPosition = new Vector3(-0.05f, 0.03f, 0f);
backpack.transform.localRotation = new Quaternion(-3f, 0f, 3f, 0f);
backpack.SetParent(player, "spine2");
backpack.ResetRemovalTime(Math.Max(99999999999999999, backpack.CalculateRemovalTime()));
enabled = true;
}
public void OnDestroy() => KillParent();
public void KillParent() {
enabled = false;
if (!backpack.IsDestroyed) backpack.Kill();
UnityEngine.GameObject.Destroy(this);
}
}
void Init() => ReadData();
protected override void LoadDefaultConfig() => config = Configuration.GetNewConfiguration();
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;
}
ItemContainer.CanAcceptResult? CanAcceptItem(ItemContainer container, Item item, int targetPos) {
try {
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;
}
else {
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;
}
}
catch (Exception e) {
LogToFile("IQBackpack/Logs", $"===== START ===== \n {e.Message}\n\n{e}\n ===== END =====", this);
PrintWarning("Вышло неизвестное действие!Сообщите разработчику об этом и прикрепите.log (IQBackpack/Debug/Logs)");
throw;
}
return null;
}
private void DrawUI_Backpack_Upgrade_Info(BasePlayer player) {
if (!config.TurnedsSetting.UseUpgradeBackpack || _interface == null) return;
if (!PlayerUpgrades.ContainsKey(player)) return;
String Interface = InterfaceBuilder.GetInterface("UI_Backpack_Upgrade_Info");
if (Interface == null) return;
Interface = Interface.Replace("%BACKPACK_UPGRADE_DESCRIPTION%", GetLang("BACKPACK_UPGRADE_DESCRIPTION", player.UserIDString));
Interface = Interface.Replace("%BACKPACK_UPGRADE_TITLE%", GetLang("BACKPACK_UPGRADE_TITLE", player.UserIDString));
CuiHelper.DestroyUi(player, InterfaceBuilder.UI_Backpack_Upgrade_Workbench);
CuiHelper.DestroyUi(player, InterfaceBuilder.UI_Backpack_Upgrade_Info);
CuiHelper.AddUi(player, Interface);
DrawUI_Backpack_Upgrade_Info_Controller(player);
}
private void OpenBP(BasePlayer player) {
if (GetSlotsBackpack(player) == 0) {
SendChat(GetLang("BACKPACK_NULL", player.UserIDString), player);
return;
}
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();
}
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);
}
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);
}
);
}
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;
}
}
public Dictionary<UInt64, List<Connection>> ContainerGetPlayer = new Dictionary<UInt64, List<Connection>>();
/// <summary>
/// Обновление 1.0.х
/// - Исправлено слияния рюкзака с уже открытым контейнером (влияло на внешний вид)
/// - Добавлена поддержка ArenaTournament
/// - Теперь рюкзак не выпадает после убийства игрока на дуэлях(аренах и т.д)
/// </summary>
///
[PluginReference]
Plugin ImageLibrary, IQChat, Battles, Duel, OneVSOne, ArenaTournament;
private enum TypeDurability {
None, Time, Count,
}
private static InterfaceBuilder _interface;
private void DrawUI_Backpack_Upgrade_Workbench(BasePlayer player) {
if (!config.TurnedsSetting.UseUpgradeBackpack || _interface == null) return;
CuiHelper.DestroyUi(player, InterfaceBuilder.UI_Backpack_Upgrade_Workbench);
String Interface = InterfaceBuilder.GetInterface("UI_Backpack_Upgrade_Workbench");
if (Interface == null) return;
Configuration.Backpack.BackpackCraft BackpackOption = GetBackpackOption(player);
if (BackpackOption == null) return;
UInt64 ID = GetBackpackID(player);
if (!Backpacks.ContainsKey(ID)) return;
Boolean IsUpgrade = (BackpackOption.UpgradeList.Count - 1) < (Backpacks[ID].IndexUpgrade + 1);
Interface = Interface.Replace("%BACKPACK_UPGRADE_WORKBENCH_BUTTON%", GetLang(IsUpgrade ? "BACKPACK_UPGRADE_WORKBENCH_BUTTON_MAXIMUM" : "BACKPACK_UPGRADE_WORKBENCH_BUTTON", player.UserIDString));
Interface = Interface.Replace("%COLOR%", IsUpgrade ? "0.7568628 0.2273419 0.2078431 1" : "0.4431373 0.5450981 0.2627451 1");
Interface = Interface.Replace("%COMMAND%", IsUpgrade ? "" : "backpack.upgrade.menu");
Interface = Interface.Replace("%BACKPACK_UPGRADE_WORKBENCH_DESCRIPTION%", GetLang("BACKPACK_UPGRADE_WORKBENCH_DESCRIPTION", player.UserIDString, GetMaximumUpgradeSlots(player) >= 42 ? 42 : GetMaximumUpgradeSlots(player)));
Interface = Interface.Replace("%BACKPACK_UPGRADE_WORKBENCH_TITLE%", GetLang("BACKPACK_UPGRADE_WORKBENCH_TITLE", player.UserIDString));
CuiHelper.AddUi(player, Interface);
}
public Dictionary<UInt64, BackpackInfo> Backpacks = new Dictionary<UInt64, BackpackInfo>();
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;
}
private Int32 GetSlotsBackpack(BasePlayer player) {
Int32 SlotsBackpack = 0;
if (config.TurnedsSetting.Types == TypeBackpack.Wear) {
Item item = GetBackpack(player);
if (item != null) if (Backpacks.ContainsKey(item.uid)) SlotsBackpack = Backpacks[item.uid].AmountSlot;
}
else {
if (Backpacks.ContainsKey(player.userID)) SlotsBackpack = Backpacks[player.userID].AmountSlot;
}
return SlotsBackpack;
}
private enum TypeBackpack {
Wear, OnlyPermission
}
private List<Item> GetItemBlacklist(BasePlayer player) {
Configuration.Backpack.BackpackCraft Backpack = GetBackpackOption(player);
if (Backpack == null || Backpack.BlackListItems == null || Backpack.BlackListItems.Count == 0) return null;
List<Item> ItemList = new List<Item>();
foreach(Item item in player.inventory.AllItems()) foreach(String Shortname in Backpack.BlackListItems) if (item.info.shortname == Shortname) ItemList.Add(item);
return ItemList;
}
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 OnPlayerSleepEnded(BasePlayer player) => OnPlayerConnected(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 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);
}
}
}
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;
}
}
}
private void DrawUI_Backpack_ItemCrafts(BasePlayer player) {
if (_interface == null) return;
if (!config.TurnedsSetting.UseCrafting || config.TurnedsSetting.Types == TypeBackpack.OnlyPermission) return;
Configuration.Backpack.BackpackCraft BCraft = GetBackpackOption(player);
if (BCraft == null || BCraft.CraftItems == null) return;
Int32 ItemCount = 0;
Single itemMinPosition = 219f;
Single itemWidth = 0.15f;
/// Ширина
Single itemMargin = 0.062f;
/// Расстояние между
Int32 itemCount = BCraft.CraftItems.Count;
Single itemMinHeight = 0.84f;
// Сдвиг по вертикали
Single itemHeight = 0.16f;
/// Высота
Int32 ItemTarget = 5;
if (itemCount > ItemTarget) {
itemMinPosition = 0.5f - ItemTarget / 2f * itemWidth - (ItemTarget - 1) / 2f * itemMargin;
itemCount -= ItemTarget;
}
else itemMinPosition = 0.5f - itemCount / 2f * itemWidth - (itemCount - 1) / 2f * itemMargin;
foreach (Configuration.Backpack.BackpackCraft.ItemCraft item in BCraft.CraftItems) {
String Interface = InterfaceBuilder.GetInterface("UI_Backpack_Craft_Item");
if (Interface == null) return;
Interface = Interface.Replace("%ANCHOR_MIN%", $"{itemMinPosition} {itemMinHeight}");
Interface = Interface.Replace("%ANCHOR_MAX%", $"{itemMinPosition + itemWidth} {itemMinHeight + itemHeight}");
Interface = Interface.Replace("%AMOUNT%", $"{item.Amount}");
Interface = Interface.Replace("%PNG_ITEM%", GetImage(item));
Interface = Interface.Replace("%COLOR_PANEL%", HaveItem(player, item.Shortname, item.Amount, item.SkinID) ? "0.57 1.00 0.65 1.00" : "0.98 0.13 0.18 1.00");
CuiHelper.AddUi(player, Interface);
ItemCount++;
itemMinPosition += (itemWidth + itemMargin);
if (ItemCount % ItemTarget == 0) {
itemMinHeight -= (itemHeight + (itemMargin * 0.5f));
if (itemCount > ItemTarget) {
itemMinPosition = 0.5f - ItemTarget / 2f * itemWidth - (ItemTarget - 1) / 2f * itemMargin;
itemCount -= ItemTarget;
}
else itemMinPosition = 0.5f - itemCount / 2f * itemWidth - (itemCount - 1) / 2f * itemMargin;
}
}
}
protected override void SaveConfig() => Config.WriteObject(config);
private class Configuration {
internal class Turneds {
[JsonProperty("Использовать возможность улучшать рюкзаки и увеличивать в нем слоты (true - да/false - нет) [Дополнительно настраивается в каждом рюкзаке, учтите - это общий параметр, детальная настройка в вариациях рюкзаков]")]
public Boolean UseUpgradeBackpack = true;
internal class VisualBackpackSlot {
[JsonProperty("Разрешить открывать рюкзак нажава на UI интерфейс (true - да/false - нет)")]
public Boolean UseButton = true;
[JsonProperty("Настройка цветов полосы заполненности")]
public ColorProgress ColorProgressBar = new ColorProgress();
internal class ColorProgress {
[JsonProperty("Цвет полосы заполненности, когда рюкзак заполнен на >80%")]
public String ColorMaximum = "0.98 0.20 0.28 1.00";
[JsonProperty("Цвет полосы заполненности, когда рюкзак заполнен на >60%")]
public String ColorAverage = "0.98 0.53 0.26 1.00";
[JsonProperty("Цвет полосы заполненности, когда рюкзак заполнен на >30%")]
public String ColorMinimal = "0.44 0.53 0.26 1.00";
}
internal class Position {
public String AnchorMin;
public String AnchorMax;
public String OffsetMin;
public String OffsetMax;
}
[JsonProperty("Отображать полосу заполненности рюкзака на UI (true - да/false - нет)")]
public Boolean UseIsFulled = true;
[JsonProperty("Использовать отображение UI рюкзака возле слотов (true - да/false - нет)")]
public Boolean UseVisual = true;
[JsonProperty("Отображать количество слотов в рюкзаке на UI (true - да/false - нет)")]
public Boolean UseSlots = true;
[JsonProperty("Настройка позиции UI для улучшения рюкзака")]
public Position PositionUpgrade = new Position();
[JsonProperty("Настройка позиции UI слота с рюкзаком")]
public Position PositionSlotVisual = new Position();
}
[JsonProperty("Тип выпадения рюкзака : 0 - Не выпадает при смерти, 1 - Выбрасывает предметы вокруг трупа, 2 - Выбрасывает рюкзак с предметами")]
public TypeDropBackpack TypeDropBackpack = TypeDropBackpack.DropBackpack;
[JsonProperty("Отображать рюкзак за спиной игрока(модельку рюкзака, работает на всех поворотах и изгибах игрока) [ВНИМАНИЕ, ИСПОЛЬЗУЙТЕ ЭТО НА PVE СЕРВЕРЕ, ИЗ-ЗА ОСОБЕННОСТЕЙ ИГРЫ В ТАКОЙ РЮКЗАК НА СПИНЕ НЕ БУДЕТ ПРОХОДИТЬ УРОН]")]
public Boolean UseSpineBackpack = false;
[JsonProperty("Автоматически очищать инвентарь рюкзаков игроков после вайпа (true - да/false - нет)")]
public Boolean WipeCleaning = false;
[JsonProperty("Тип работы рюкзака : 0 - требуется надеть его, чтобы пользоватья, 1 - требуются лишь права(из вариаций рюкзаков)")]
public TypeBackpack Types = TypeBackpack.Wear;
[JsonProperty("Закрывать рюкзак при повторном нажатии на UI/использовании бинда, если он открыт")]
public Boolean ClosePressedAgain = true;
[JsonProperty("Настройка интерфейса")]
public VisualBackpackSlot VisualBackpackSlots = new VisualBackpackSlot();
[JsonProperty("Использовать возможность скрафтить рюкзак (true - да/false - нет)")]
public Boolean UseCrafting = true;
[JsonProperty("Время удаления рюкзака при выпадении (Работает с : 2 - Выбрасывает рюкзак с предметами)")]
public Single RemoveBackpack = 200f;
}
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, WipeCleaning = false, 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,
}
}
}
;
}
[JsonProperty("Настройка поддерживающих плагинов")]
public Reference References = new Reference();
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;
}
}
[JsonProperty("Настройка рюкзака")]
public Backpack BackpackItem = new Backpack();
[JsonProperty("Дополнительная настройка")]
public Turneds TurnedsSetting = new Turneds();
}
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;
}
public static IQBackpack _ = null;
protected override void LoadConfig() {
base.LoadConfig();
try {
config = Config.ReadObject<Configuration>();
if (config == null) LoadDefaultConfig();
}
catch {
PrintWarning("Ошибка " + $"чтения конфигурации 'oxide/config/{Name}', создаём новую конфигурацию!!");
LoadDefaultConfig();
}
NextTick(SaveConfig);
}
private void OnNewSave(String filename) => ClearData();
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);
}
}
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);
}
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);
}
private void DrawUI_Backpack_Slots_Locked(BasePlayer player) {
if (_interface == null) return;
if (!config.TurnedsSetting.UseCrafting || config.TurnedsSetting.Types == TypeBackpack.OnlyPermission) return;
Int32 AvailableSlots = GetAvailableSlots(player);
Int32 LockedSlots = 42 - AvailableSlots;
for (Int32 LockSlots = LockedSlots; LockSlots > 0; LockSlots--) {
String Interface = InterfaceBuilder.GetInterface("UI_Backpack_Slots_Lock");
if (Interface == null) return;
Interface = Interface.Replace("%INDEX%", $"{42 - LockSlots}");
CuiHelper.AddUi(player, Interface);
}
}
private Dictionary<BasePlayer, BackpackBehaviour> PlayerBackpack = new Dictionary<BasePlayer, BackpackBehaviour>();
private Boolean HaveAllItem(BasePlayer player, List<Configuration.Backpack.BackpackCraft.ItemCraft> BPCraft, ItemContainer contaner = null) {
Int32 TrueItem = 0;
for (Int32 i = 0; i < BPCraft.Count; i++) {
Configuration.Backpack.BackpackCraft.ItemCraft Item = BPCraft[i];
if (HaveItem(player, Item.Shortname, Item.Amount, Item.SkinID, contaner)) TrueItem++;
}
return TrueItem >= BPCraft.Count;
}
private void CheckConnectionPermission(BasePlayer player) {
UInt64 IDBackpack = GetBackpackID(player);
if (!Backpacks.ContainsKey(IDBackpack)) return;
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;
}
private class BackpackBehaviour : FacepunchBehaviour {
public Item Backpack = null;
private BasePlayer Player = null;
public StorageContainer Container = null;
public UInt64 BackpackID = 0;
private Dictionary<Item, Item.Flag> SaveFlags = new Dictionary<Item, Item.Flag>();
private void Awake() {
Player = GetComponent<BasePlayer>();
BackpackID = _.GetBackpackID(Player);
}
private void BlackListAction(Boolean State) {
List<Item> Itemlist = _.GetItemBlacklist(Player);
if (Itemlist == null) return;
foreach (Item item in Itemlist) {
if (State) if (!SaveFlags.ContainsKey(item)) SaveFlags.Add(item, item.flags);
item.SetFlag(global : : Item.Flag.IsLocked, State);
}
if(!State) foreach(KeyValuePair<Item, Item.Flag> Items in SaveFlags) Items.Key.SetFlag(Items.Value, true);
Player.SendNetworkUpdate();
}
public void Open() {
Container = CreateContainer(Player);
PushItems();
LockSlot(true);
_.timer.Once(0.1f, () => PlayerLootContainer(Player, Container));
BlackListAction(true);
if (!_.PlayerUseBackpacks.Contains(Player)) _.PlayerUseBackpacks.Add(Player);
}
public void LockSlot(bool state) {
if (Backpack == null) return;
Backpack.LockUnlock(state);
foreach (var item in Player.inventory.AllItems()) if (item.skin == Backpack.skin) item.LockUnlock(state);
}
public void Close() {
LockSlot(false);
_.Backpacks[BackpackID].Items = SaveItems(Container.inventory.itemList);
Container.inventory.Clear();
Container.Kill();
Container = null;
Destroy(false);
BlackListAction(false);
if (_.PlayerUseBackpacks.Contains(Player)) _.PlayerUseBackpacks.Remove(Player);
}
private void PushItems() {
//_.Unsubscribe("OnItemAddedToContainer");
var items = RestoreItems(_.Backpacks[BackpackID].Items);
for (int i = items.Count - 1; i >= 0; i--) items[i].MoveToContainer(Container.inventory, items[i].position);
// _.Subscribe("OnItemAddedToContainer");
}
public void Destroy(bool isClose = true) {
if (isClose) Close();
UnityEngine.Object.Destroy(this);
}
}
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 RegisteredPermissions() {
foreach (Configuration.Backpack.BackpackCraft BPCraft in config.BackpackItem.BackpacOption) permission.RegisterPermission(BPCraft.Permissions, this);
}
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;
StorageContainer 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 (Collider 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();
container.entityOwner = storage;
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;
//storage.inventory.dirty = true;
return storage;
}
[ConsoleCommand("bp")]
void OpenBackpackConsole(ConsoleSystem.Arg arg) {
BasePlayer player = arg.Player();
if (player == null) return;
player.EndLooting();
timer.Once(0.3f, ()=> OpenBP(player));
}
private Int32 GetSlotsPercent(Single Percent, Single Slots) {
Single ReturnSlot = (((Single)Slots / 100.0f) * Percent);
return (Int32)ReturnSlot;
}
[ChatCommand("upgradebp")]
void UpgradeBPCommand(BasePlayer player) {
if (IsDuel(player.userID)) return;
if (player == null) return;
OpenUpgradeMenu(player);
}
void CanLootEntity(BasePlayer player, StorageContainer container) {
if (container == null || player == null || !(Boolean)(container is Workbench)) return;
DrawUI_Backpack_Upgrade_Workbench(player);
return;
}
static List<Item> RestoreItems(List<BackpackInfo.SavedItem> sItems) {
return sItems.Select(sItem => {
if (sItem.Weapon) return BuildWeapon(sItem);
return BuildItem(sItem);
}
).Where(i => i != null).ToList();
}
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);
// ... [Code preview truncated due to length. Full source in attached file] ...