Please disclose if any significant portion of your mod was created using AI tools by adding the 'AI Generated' category. Failing to do so may result in the mod being removed from Thunderstore.
Decompiled source of BagConfig v1.0.3
BepInEx/plugins/BagConfig.dll
Decompiled 5 months agousing System; using System.Collections; using System.Collections.Generic; using System.Collections.Specialized; using System.Diagnostics; using System.Globalization; using System.Linq; using System.Reflection; using System.Reflection.Emit; using System.Runtime.CompilerServices; using System.Security; using System.Security.Permissions; using BagConfig.Dependency; using BagConfig.InputUtils; using BagConfig.Networking; using BagConfig.Patches; using BagConfig.Utils; using BepInEx; using BepInEx.Bootstrap; using BepInEx.Configuration; using BepInEx.Logging; using GameNetcodeStuff; using HarmonyLib; using HarmonyLib.Public.Patching; using JetBrains.Annotations; using LethalCompanyInputUtils.Api; using LethalConfig; using LethalConfig.ConfigItems; using LethalConfig.ConfigItems.Options; using LobbyCompatibility.Enums; using LobbyCompatibility.Features; using Microsoft.CodeAnalysis; using Mono.Cecil; using Mono.Cecil.Cil; using Mono.Collections.Generic; using MonoMod.RuntimeDetour; using MonoMod.Utils; using Unity.Collections; using Unity.Netcode; using UnityEngine; using UnityEngine.InputSystem; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: IgnoresAccessChecksTo("AmazingAssets.TerrainToMesh")] [assembly: IgnoresAccessChecksTo("Assembly-CSharp-firstpass")] [assembly: IgnoresAccessChecksTo("Assembly-CSharp")] [assembly: IgnoresAccessChecksTo("ClientNetworkTransform")] [assembly: IgnoresAccessChecksTo("com.olegknyazev.softmask")] [assembly: IgnoresAccessChecksTo("DissonanceVoip")] [assembly: IgnoresAccessChecksTo("EasyTextEffects")] [assembly: IgnoresAccessChecksTo("Facepunch Transport for Netcode for GameObjects")] [assembly: IgnoresAccessChecksTo("Facepunch.Steamworks.Win64")] [assembly: IgnoresAccessChecksTo("Unity.AI.Navigation")] [assembly: IgnoresAccessChecksTo("Unity.Animation.Rigging")] [assembly: IgnoresAccessChecksTo("Unity.Animation.Rigging.DocCodeExamples")] [assembly: IgnoresAccessChecksTo("Unity.Burst")] [assembly: IgnoresAccessChecksTo("Unity.Burst.Unsafe")] [assembly: IgnoresAccessChecksTo("Unity.Collections")] [assembly: IgnoresAccessChecksTo("Unity.Collections.LowLevel.ILSupport")] [assembly: IgnoresAccessChecksTo("Unity.InputSystem")] [assembly: IgnoresAccessChecksTo("Unity.InputSystem.ForUI")] [assembly: IgnoresAccessChecksTo("Unity.Jobs")] [assembly: IgnoresAccessChecksTo("Unity.Mathematics")] [assembly: IgnoresAccessChecksTo("Unity.Multiplayer.Tools.Common")] [assembly: IgnoresAccessChecksTo("Unity.Multiplayer.Tools.MetricTypes")] [assembly: IgnoresAccessChecksTo("Unity.Multiplayer.Tools.NetStats")] [assembly: IgnoresAccessChecksTo("Unity.Multiplayer.Tools.NetStatsMonitor.Component")] [assembly: IgnoresAccessChecksTo("Unity.Multiplayer.Tools.NetStatsMonitor.Configuration")] [assembly: IgnoresAccessChecksTo("Unity.Multiplayer.Tools.NetStatsMonitor.Implementation")] [assembly: IgnoresAccessChecksTo("Unity.Multiplayer.Tools.NetStatsReporting")] [assembly: IgnoresAccessChecksTo("Unity.Multiplayer.Tools.NetworkProfiler.Runtime")] [assembly: IgnoresAccessChecksTo("Unity.Multiplayer.Tools.NetworkSolutionInterface")] [assembly: IgnoresAccessChecksTo("Unity.Netcode.Components")] [assembly: IgnoresAccessChecksTo("Unity.Netcode.Runtime")] [assembly: IgnoresAccessChecksTo("Unity.Networking.Transport")] [assembly: IgnoresAccessChecksTo("Unity.ProBuilder.Csg")] [assembly: IgnoresAccessChecksTo("Unity.ProBuilder")] [assembly: IgnoresAccessChecksTo("Unity.ProBuilder.KdTree")] [assembly: IgnoresAccessChecksTo("Unity.ProBuilder.Poly2Tri")] [assembly: IgnoresAccessChecksTo("Unity.ProBuilder.Stl")] [assembly: IgnoresAccessChecksTo("Unity.Profiling.Core")] [assembly: IgnoresAccessChecksTo("Unity.RenderPipelines.Core.Runtime")] [assembly: IgnoresAccessChecksTo("Unity.RenderPipelines.Core.ShaderLibrary")] [assembly: IgnoresAccessChecksTo("Unity.RenderPipelines.HighDefinition.Config.Runtime")] [assembly: IgnoresAccessChecksTo("Unity.RenderPipelines.HighDefinition.Runtime")] [assembly: IgnoresAccessChecksTo("Unity.RenderPipelines.ShaderGraph.ShaderGraphLibrary")] [assembly: IgnoresAccessChecksTo("Unity.Services.Authentication")] [assembly: IgnoresAccessChecksTo("Unity.Services.Core.Analytics")] [assembly: IgnoresAccessChecksTo("Unity.Services.Core.Components")] [assembly: IgnoresAccessChecksTo("Unity.Services.Core.Configuration")] [assembly: IgnoresAccessChecksTo("Unity.Services.Core.Device")] [assembly: IgnoresAccessChecksTo("Unity.Services.Core")] [assembly: IgnoresAccessChecksTo("Unity.Services.Core.Environments")] [assembly: IgnoresAccessChecksTo("Unity.Services.Core.Environments.Internal")] [assembly: IgnoresAccessChecksTo("Unity.Services.Core.Internal")] [assembly: IgnoresAccessChecksTo("Unity.Services.Core.Networking")] [assembly: IgnoresAccessChecksTo("Unity.Services.Core.Registration")] [assembly: IgnoresAccessChecksTo("Unity.Services.Core.Scheduler")] [assembly: IgnoresAccessChecksTo("Unity.Services.Core.Telemetry")] [assembly: IgnoresAccessChecksTo("Unity.Services.Core.Threading")] [assembly: IgnoresAccessChecksTo("Unity.Services.QoS")] [assembly: IgnoresAccessChecksTo("Unity.Services.Relay")] [assembly: IgnoresAccessChecksTo("Unity.TextMeshPro")] [assembly: IgnoresAccessChecksTo("Unity.Timeline")] [assembly: IgnoresAccessChecksTo("Unity.VisualEffectGraph.Runtime")] [assembly: IgnoresAccessChecksTo("UnityEngine.ARModule")] [assembly: IgnoresAccessChecksTo("UnityEngine.NVIDIAModule")] [assembly: IgnoresAccessChecksTo("UnityEngine.UI")] [assembly: AssemblyCompany("mattymatty")] [assembly: AssemblyConfiguration("Release")] [assembly: AssemblyFileVersion("1.0.3")] [assembly: AssemblyInformationalVersion("1.0.3+867df470be87d0129e569a7e0a6dcfcb6e1b1e17")] [assembly: AssemblyProduct("BagConfig")] [assembly: AssemblyTitle("BagConfig - Plugin")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("1.0.3.0")] [module: UnverifiableCode] [module: RefSafetyRules(11)] namespace Microsoft.CodeAnalysis { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] internal sealed class EmbeddedAttribute : Attribute { } } namespace System.Runtime.CompilerServices { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)] internal sealed class RefSafetyRulesAttribute : Attribute { public readonly int Version; public RefSafetyRulesAttribute(int P_0) { Version = P_0; } } } namespace BagConfig { [BepInPlugin("mattymatty.BagConfig", "BagConfig", "1.0.3")] [BepInDependency(/*Could not decode attribute arguments.*/)] [BepInDependency(/*Could not decode attribute arguments.*/)] [BepInDependency(/*Could not decode attribute arguments.*/)] internal class BagConfig : BaseUnityPlugin { internal static readonly ISet<Hook> Hooks = new HashSet<Hook>(); internal static readonly Harmony Harmony = new Harmony("mattymatty.BagConfig"); public const string GUID = "mattymatty.BagConfig"; public const string NAME = "BagConfig"; public const string VERSION = "1.0.3"; internal static ManualLogSource Log; public static BagConfig INSTANCE { get; private set; } private void Awake() { INSTANCE = this; Log = ((BaseUnityPlugin)this).Logger; try { if (LobbyCompatibilityChecker.Enabled) { LobbyCompatibilityChecker.Init(); } if (InputUtilsProxy.Enabled) { InputUtilsProxy.Init(); } Log.LogInfo((object)"Initializing Configs"); PluginConfig.Init(); Log.LogInfo((object)"Patching Methods"); PatchLateJoin.Init(); Harmony.PatchAll(); BeltBagPatch.Patch(); Log.LogInfo((object)"BagConfig v1.0.3 Loaded!"); } catch (Exception ex) { Log.LogError((object)("Exception while initializing: \n" + ex)); } } } internal static class PluginConfig { public static class Misc { public static ConfigEntry<bool> Tooltip { get; internal set; } public static ConfigEntry<bool> DropAll { get; internal set; } public static ConfigEntry<bool> HideBag { get; internal set; } public static ConfigEntry<float> GrabRange { get; internal set; } } public static class Host { public static ConfigEntry<bool> Capacity { get; internal set; } public static ConfigEntry<bool> Category { get; internal set; } public static ConfigEntry<bool> Range { get; internal set; } public static ConfigEntry<bool> AllowVanilla { get; internal set; } } public static class Limits { public static StringDictionary ItemCategoryAssociations = new StringDictionary(); public static readonly Dictionary<string, ICategoryConfig> CategoryConfigs = new Dictionary<string, ICategoryConfig>(); public static ConfigEntry<int> Capacity { get; internal set; } public static ConfigEntry<string> ItemCategories { get; internal set; } } public interface ICategoryConfig { string CategoryName { get; } bool Allow { get; } int Limit { get; } } public class StaticCategoryConfig : ICategoryConfig { public string CategoryName { get; } public bool Allow { get; } public int Limit { get; } public StaticCategoryConfig(string categoryName, bool allow, int limit) { CategoryName = categoryName; Allow = allow; Limit = limit; } } public class BepInExCategoryConfig : ICategoryConfig { private readonly ConfigEntry<bool> _allowConfig; private readonly ConfigEntry<int> _limitConfig; public string CategoryName { get; } public bool Allow => _allowConfig.Value; public int Limit => _limitConfig.Value; public BepInExCategoryConfig(string categoryName, bool allow = false, int max = -1) { //IL_0039: Unknown result type (might be due to invalid IL or missing references) //IL_0043: Expected O, but got Unknown //IL_008e: Unknown result type (might be due to invalid IL or missing references) //IL_0098: Expected O, but got Unknown CategoryName = categoryName; _allowConfig = ((BaseUnityPlugin)BagConfig.INSTANCE).Config.Bind<bool>("Limit." + CategoryName, "Allow", allow, new ConfigDescription("Allow grabbing this category!", (AcceptableValueBase)null, Array.Empty<object>())); _limitConfig = ((BaseUnityPlugin)BagConfig.INSTANCE).Config.Bind<int>("Limit." + CategoryName, "Max Amount", max, new ConfigDescription("How many items of this category can be stored at the same time?", (AcceptableValueBase)(object)new AcceptableValueRange<int>(-1, Limits.Capacity?.Value ?? int.MaxValue), Array.Empty<object>())); if (LethalConfigProxy.Enabled) { LethalConfigProxy.AddConfig(_allowConfig); LethalConfigProxy.AddConfig(_limitConfig); } } } private const string ToolsCategory = "Tools"; private const string DenyCategory = "Deny"; private const string OneHandedCategory = "One Handed Scrap"; private const string TwoHandedCategory = "Two Handed Scrap"; internal static void Init() { //IL_0085: Unknown result type (might be due to invalid IL or missing references) //IL_008f: Expected O, but got Unknown //IL_0122: Unknown result type (might be due to invalid IL or missing references) //IL_012c: Expected O, but got Unknown //IL_014c: Unknown result type (might be due to invalid IL or missing references) //IL_0156: Expected O, but got Unknown ConfigFile config = ((BaseUnityPlugin)BagConfig.INSTANCE).Config; Misc.Tooltip = config.Bind<bool>("Miscellaneous", "Tooltip", true, "Show a tooltip if the target item cannot be stored"); Misc.DropAll = config.Bind<bool>("Miscellaneous", "Add Empty Bag Action", true, "Add action to Drop the entire bag inventory"); Misc.HideBag = config.Bind<bool>("Miscellaneous", "Hide Bag When Pocketed", false, "Hide the bag when in pocket ( also disables opening it by looking down )"); Misc.GrabRange = config.Bind<float>("Miscellaneous", "Grab Range", 4f, new ConfigDescription("Max range for grabbing items with the bag", (AcceptableValueBase)(object)new AcceptableValueRange<float>(0f, 20f), Array.Empty<object>())); Host.Capacity = config.Bind<bool>("Host Settings", "Enforce Capacity", true, "Server-side check to limit the bag Capacity"); Host.Category = config.Bind<bool>("Host Settings", "Enforce Restrictions", true, "Server-side check to limit the items allowed inside the Bag"); Host.Range = config.Bind<bool>("Host Settings", "Enforce Range", true, "Server-side check to limit the grab range"); Host.AllowVanilla = config.Bind<bool>("Host Settings", "Allow Vanilla Clients", false, "Allow clients w/o the mod to join the lobby"); Limits.Capacity = config.Bind<int>("Limits", "Capacity", 15, new ConfigDescription("How many items can the bag store", (AcceptableValueBase)(object)new AcceptableValueRange<int>(0, int.MaxValue), Array.Empty<object>())); Limits.ItemCategories = config.Bind<string>("Limits", "Item Categories", "Body: Deny", new ConfigDescription("Dictionary describing the association between a Item and a Category name", (AcceptableValueBase)null, Array.Empty<object>())); Limits.CategoryConfigs["Tools"] = new BepInExCategoryConfig("Tools", allow: true); Limits.CategoryConfigs["One Handed Scrap"] = new BepInExCategoryConfig("One Handed Scrap"); Limits.CategoryConfigs["Two Handed Scrap"] = new BepInExCategoryConfig("Two Handed Scrap"); Limits.CategoryConfigs["Deny"] = new StaticCategoryConfig("Deny", allow: false, 0); ProcessCategories(Limits.ItemCategories); Limits.ItemCategories.SettingChanged += delegate { ProcessCategories(Limits.ItemCategories); }; if (LethalConfigProxy.Enabled) { LethalConfigProxy.AddConfig(Misc.Tooltip); LethalConfigProxy.AddConfig(Misc.DropAll, requiresRestart: true); LethalConfigProxy.AddConfig(Misc.HideBag); LethalConfigProxy.AddConfig(Misc.GrabRange); LethalConfigProxy.AddConfig(Limits.Capacity); LethalConfigProxy.AddConfig(Limits.ItemCategories); LethalConfigProxy.AddConfig(Host.Capacity); LethalConfigProxy.AddConfig(Host.Category); LethalConfigProxy.AddConfig(Host.Range); LethalConfigProxy.AddConfig(Host.AllowVanilla, requiresRestart: true); LethalConfigProxy.AddButton("Fixes", "Fix Locked BeltBags", "Re-Enable all BeltBags that are in a broken state", "Fix", delegate { NamedMessages.FixBagsClientRpc(); }, () => ((Object)(object)StartOfRound.Instance == (Object)null) ? (false, "You need to be in a lobby to call this") : ((!GameNetworkManager.Instance.isHostingGame) ? (false, "Only host can call this function") : (true, ""))); } CleanAndSave(); static void ProcessCategories(ConfigEntry<string> entry) { Limits.ItemCategoryAssociations = ProcessDictionary(entry); foreach (string value3 in Limits.ItemCategoryAssociations.Values) { if (!Limits.CategoryConfigs.ContainsKey(value3)) { Limits.CategoryConfigs[value3] = new BepInExCategoryConfig(value3, allow: true); } } } static StringDictionary ProcessDictionary(ConfigEntry<string> entry) { string value = entry.Value; StringDictionary stringDictionary = new StringDictionary(); string[] array = value.Split(","); foreach (string text in array) { string text2 = text.Trim(); string[] array2 = text2.Split(":"); if (array2.Length != 2) { BagConfig.Log.LogError((object)("Item Association: malformed Entry! " + text2)); } else { string text3 = array2[0].Trim(); string value2 = array2[1].Trim(); if (stringDictionary.ContainsKey(text3)) { BagConfig.Log.LogWarning((object)("Item Association: " + text3 + " was already defined - overwriting!")); } stringDictionary[text3] = value2; } } return stringDictionary; } } internal static void CleanAndSave() { ConfigFile config = ((BaseUnityPlugin)BagConfig.INSTANCE).Config; PropertyInfo propertyInfo = AccessTools.Property(((object)config).GetType(), "OrphanedEntries"); Dictionary<ConfigDefinition, string> dictionary = (Dictionary<ConfigDefinition, string>)propertyInfo.GetValue(config, null); dictionary.Clear(); config.Save(); } public static ICategoryConfig GetBagCategory(this GrabbableObject grabbable) { if (Limits.ItemCategoryAssociations.ContainsKey(grabbable.itemProperties.itemName)) { return Limits.CategoryConfigs[Limits.ItemCategoryAssociations[grabbable.itemProperties.itemName]]; } bool isScrap = grabbable.itemProperties.isScrap; bool twoHanded = grabbable.itemProperties.twoHanded; if (!isScrap) { return Limits.CategoryConfigs["Tools"]; } if (!twoHanded) { return Limits.CategoryConfigs["One Handed Scrap"]; } return Limits.CategoryConfigs["Two Handed Scrap"]; } } public static class MyPluginInfo { public const string PLUGIN_GUID = "mattymatty.BagConfig"; public const string PLUGIN_NAME = "BagConfig"; public const string PLUGIN_VERSION = "1.0.3"; } } namespace BagConfig.Utils { public static class NgoUtils { private static readonly MethodInfo BeginSendClientRpc = AccessTools.Method(typeof(NetworkBehaviour), "__beginSendClientRpc", (Type[])null, (Type[])null); private static readonly MethodInfo BeginSendServerRpc = AccessTools.Method(typeof(NetworkBehaviour), "__beginSendServerRpc", (Type[])null, (Type[])null); private static readonly __RpcExecStage ClientRpcStage; private static readonly __RpcExecStage ServerRpcStage; public static bool IsRPCClientStage(this NetworkBehaviour self) { //IL_001b: Unknown result type (might be due to invalid IL or missing references) //IL_0020: Unknown result type (might be due to invalid IL or missing references) NetworkManager networkManager = self.NetworkManager; if ((Object)(object)networkManager == (Object)null || !networkManager.IsListening) { return false; } if (self.__rpc_exec_stage != ClientRpcStage || (!networkManager.IsClient && !networkManager.IsHost)) { return false; } return true; } public static bool IsRPCServerStage(this NetworkBehaviour self) { //IL_001b: Unknown result type (might be due to invalid IL or missing references) //IL_0020: Unknown result type (might be due to invalid IL or missing references) NetworkManager networkManager = self.NetworkManager; if ((Object)(object)networkManager == (Object)null || !networkManager.IsListening) { return false; } if (self.__rpc_exec_stage != ServerRpcStage || (!networkManager.IsServer && !networkManager.IsHost)) { return false; } return true; } internal static bool TryGetRpcID(this MethodInfo methodInfo, out uint rpcID) { //IL_002c: Unknown result type (might be due to invalid IL or missing references) //IL_0031: Unknown result type (might be due to invalid IL or missing references) //IL_0071: Unknown result type (might be due to invalid IL or missing references) //IL_0076: Unknown result type (might be due to invalid IL or missing references) //IL_0046: Unknown result type (might be due to invalid IL or missing references) //IL_004b: Unknown result type (might be due to invalid IL or missing references) Collection<Instruction> instructions = PatchManager.GetMethodPatcher((MethodBase)methodInfo).CopyOriginal().Definition.Body.Instructions; rpcID = 0u; for (int i = 0; i < instructions.Count; i++) { if (instructions[i].OpCode == OpCodes.Ldc_I4 && instructions[i - 1].OpCode == OpCodes.Ldarg_0) { rpcID = (uint)(int)instructions[i].Operand; } if (!(instructions[i].OpCode != OpCodes.Call)) { object operand = instructions[i].Operand; MethodReference val = (MethodReference)((operand is MethodReference) ? operand : null); if (val != null && (Extensions.Is((MemberReference)(object)val, (MemberInfo)BeginSendClientRpc) || Extensions.Is((MemberReference)(object)val, (MemberInfo)BeginSendServerRpc))) { BagConfig.Log.LogDebug((object)$"Rpc Id found for {methodInfo.Name}: {rpcID}U"); return true; } } } BagConfig.Log.LogFatal((object)("Cannot find Rpc ID for " + methodInfo.Name)); return false; } static NgoUtils() { //IL_004e: Unknown result type (might be due to invalid IL or missing references) //IL_004a: Unknown result type (might be due to invalid IL or missing references) //IL_004f: Unknown result type (might be due to invalid IL or missing references) //IL_0050: Unknown result type (might be due to invalid IL or missing references) //IL_006d: Unknown result type (might be due to invalid IL or missing references) //IL_0069: Unknown result type (might be due to invalid IL or missing references) //IL_006e: Unknown result type (might be due to invalid IL or missing references) //IL_006f: Unknown result type (might be due to invalid IL or missing references) string unityVersion = Application.unityVersion; __RpcExecStage clientRpcStage = ((!(unityVersion == "2022.3.9f1")) ? ((__RpcExecStage)1) : ((__RpcExecStage)2)); ClientRpcStage = clientRpcStage; string unityVersion2 = Application.unityVersion; clientRpcStage = ((!(unityVersion2 == "2022.3.9f1")) ? ((__RpcExecStage)1) : ((__RpcExecStage)1)); ServerRpcStage = clientRpcStage; } } } namespace BagConfig.Patches { [HarmonyPatch] internal static class BeltBagPatch { private class CategoryCount { public int Count; } [HarmonyPatch(typeof(BeltBagItem), "PutObjectInBagLocalClient")] private static class OnItemPutObjectInBag { [UsedImplicitly] private static void Prefix(BeltBagItem __instance, GrabbableObject gObject, ref bool __state) { __state = __instance.objectsInBag.Contains(gObject); } [UsedImplicitly] private static void Postfix(BeltBagItem __instance, GrabbableObject gObject, ref bool __state) { if (__state) { return; } PluginConfig.ICategoryConfig bagCategory = gObject.GetBagCategory(); ConditionalWeakTable<PluginConfig.ICategoryConfig, CategoryCount> orCreateValue = CategoryMemory.GetOrCreateValue(__instance); orCreateValue.GetOrCreateValue(bagCategory).Count++; LungProp val = (LungProp)(object)((gObject is LungProp) ? gObject : null); if (val != null) { if (val.isLungDocked) { val.isLungDocked = false; if (val.disconnectAnimation != null) { ((MonoBehaviour)val).StopCoroutine(val.disconnectAnimation); } val.disconnectAnimation = ((MonoBehaviour)val).StartCoroutine(val.DisconnectFromMachinery()); } if (val.isLungDockedInElevator) { val.isLungDockedInElevator = false; ((Component)val).gameObject.GetComponent<AudioSource>().PlayOneShot(val.disconnectSFX); } } if (!((GrabbableObject)__instance).hasBeenHeld) { ((GrabbableObject)__instance).hasBeenHeld = true; if (!((GrabbableObject)__instance).isInShipRoom && !StartOfRound.Instance.inShipPhase && StartOfRound.Instance.currentLevel.spawnEnemiesAndScrap) { RoundManager instance = RoundManager.Instance; instance.valueOfFoundScrapItems += ((GrabbableObject)__instance).scrapValue; } } } } [CompilerGenerated] private sealed class <EmptyBagCoroutine>d__4 : IEnumerator<object>, IEnumerator, IDisposable { private int <>1__state; private object <>2__current; public BeltBagItem @this; object IEnumerator<object>.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public <EmptyBagCoroutine>d__4(int <>1__state) { this.<>1__state = <>1__state; } [DebuggerHidden] void IDisposable.Dispose() { <>1__state = -2; } private bool MoveNext() { //IL_0026: Unknown result type (might be due to invalid IL or missing references) //IL_0030: Expected O, but got Unknown switch (<>1__state) { default: return false; case 0: <>1__state = -1; break; case 1: <>1__state = -1; break; } if (this.@this.objectsInBag.Count > 0) { this.@this.RemoveObjectFromBag(0); <>2__current = (object)new WaitForEndOfFrame(); <>1__state = 1; return true; } return false; } bool IEnumerator.MoveNext() { //ILSpy generated this explicit interface implementation from .override directive in MoveNext return this.MoveNext(); } [DebuggerHidden] void IEnumerator.Reset() { throw new NotSupportedException(); } } internal static bool Enabled; private static readonly Action<GrabbableObject, bool> BaseInteractMethod; private static readonly ConditionalWeakTable<BeltBagItem, ConditionalWeakTable<PluginConfig.ICategoryConfig, CategoryCount>> CategoryMemory; internal static void Patch() { //IL_0037: Unknown result type (might be due to invalid IL or missing references) //IL_0049: Unknown result type (might be due to invalid IL or missing references) //IL_004a: Unknown result type (might be due to invalid IL or missing references) //IL_0054: Expected O, but got Unknown MethodInfo methodInfo = AccessTools.Method(typeof(BeltBagItem), "ItemInteractLeftRight", (Type[])null, (Type[])null); MethodInfo methodInfo2 = AccessTools.Method(typeof(BeltBagPatch), "OverrideGrab", (Type[])null, (Type[])null); BagConfig.Hooks.Add(new Hook((MethodBase)methodInfo, methodInfo2, new HookConfig { Priority = -999 })); } static BeltBagPatch() { Enabled = false; CategoryMemory = new ConditionalWeakTable<BeltBagItem, ConditionalWeakTable<PluginConfig.ICategoryConfig, CategoryCount>>(); MethodInfo meth = AccessTools.Method(typeof(GrabbableObject), "ItemInteractLeftRight", (Type[])null, (Type[])null); DynamicMethod dynamicMethod = new DynamicMethod("Base.ItemInteractLeftRight", null, new Type[2] { typeof(GrabbableObject), typeof(bool) }, typeof(BeltBagItem)); ILGenerator iLGenerator = dynamicMethod.GetILGenerator(); iLGenerator.Emit(OpCodes.Ldarg_0); iLGenerator.Emit(OpCodes.Ldarg_1); iLGenerator.Emit(OpCodes.Call, meth); iLGenerator.Emit(OpCodes.Ret); BaseInteractMethod = (Action<GrabbableObject, bool>)dynamicMethod.CreateDelegate(typeof(Action<GrabbableObject, bool>)); } [IteratorStateMachine(typeof(<EmptyBagCoroutine>d__4))] private static IEnumerator EmptyBagCoroutine(BeltBagItem @this) { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new <EmptyBagCoroutine>d__4(0) { @this = @this }; } internal static void TryDumpItems(BeltBagItem @this, bool checkInHand = true) { if (PluginConfig.Misc.DropAll.Value && !((Object)(object)((GrabbableObject)@this).playerHeldBy == (Object)null) && (!checkInHand || !((Object)(object)((GrabbableObject)@this).playerHeldBy.currentlyHeldObjectServer != (Object)(object)@this))) { ((MonoBehaviour)@this).StartCoroutine(EmptyBagCoroutine(@this)); } } internal static void TryGrabItem(BeltBagItem @this, bool checkInHand = true) { //IL_007d: Unknown result type (might be due to invalid IL or missing references) //IL_0092: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)((GrabbableObject)@this).playerHeldBy == (Object)null || (checkInHand && (Object)(object)((GrabbableObject)@this).playerHeldBy.currentlyHeldObjectServer != (Object)(object)@this) || @this.tryingAddToBag) { return; } if (@this.objectsInBag.Count >= PluginConfig.Limits.Capacity.Value) { if (PluginConfig.Misc.Tooltip.Value) { HUDManager.Instance.DisplayTip("Belt bag Info", "This bag is Full!", false, false, "LC_Tip1"); } } else { RaycastHit val = default(RaycastHit); if (!Physics.Raycast(((Component)((GrabbableObject)@this).playerHeldBy.gameplayCamera).transform.position, ((Component)((GrabbableObject)@this).playerHeldBy.gameplayCamera).transform.forward, ref val, PluginConfig.Misc.GrabRange.Value, GameNetworkManager.Instance.localPlayerController.interactableObjectsMask)) { return; } ManualLogSource log = BagConfig.Log; Transform parent = ((Component)((RaycastHit)(ref val)).collider).transform.parent; log.LogDebug((object)("Grab Hit: " + ((parent != null) ? ((Object)parent).name : null) + "." + ((Object)((Component)((RaycastHit)(ref val)).collider).gameObject).name)); if (((Component)((RaycastHit)(ref val)).collider).gameObject.layer == 8 || ((Component)((RaycastHit)(ref val)).collider).tag != "PhysicsProp") { return; } GrabbableObject component = ((Component)((RaycastHit)(ref val)).collider).gameObject.GetComponent<GrabbableObject>(); if (!@this.CanBePutInBag(component)) { return; } if (@this.CheckBagFilters(component, out var limited, out var disallowed)) { @this.TryAddObjectToBag(component); } else if (PluginConfig.Misc.Tooltip.Value) { if (!disallowed && limited) { PluginConfig.ICategoryConfig bagCategory = component.GetBagCategory(); HUDManager.Instance.DisplayTip("Belt bag Info", "Cannot store any more " + bagCategory.CategoryName + " inside of the bag!", false, false, "LC_Tip1"); } else { HUDManager.Instance.DisplayTip("Belt bag Info", "Cannot store " + component.itemProperties.itemName + " inside of the bag!", false, false, "LC_Tip1"); } } } } private static void OverrideGrab(Action<BeltBagItem, bool> orig, BeltBagItem @this, bool right) { if (!Enabled) { orig(@this, arg2: false); return; } BaseInteractMethod((GrabbableObject)(object)@this, right); if (!InputUtilsProxy.Enabled) { if (right) { TryDumpItems(@this); } else { TryGrabItem(@this); } } } private static bool CanBePutInBag(this BeltBagItem @this, GrabbableObject grabbable) { if (Object.op_Implicit((Object)(object)grabbable) && (Object)(object)grabbable != (Object)(object)@this && !grabbable.isHeld && !grabbable.isHeldByEnemy) { return grabbable.itemProperties.itemId != 123984; } return false; } private static bool CheckBagFilters(this BeltBagItem @this, GrabbableObject grabbable, out bool limited, out bool disallowed) { limited = false; PluginConfig.ICategoryConfig bagCategory = grabbable.GetBagCategory(); disallowed = !bagCategory.Allow; int limit = bagCategory.Limit; if (limit < 0) { return !disallowed; } if (limit == 0) { limited = true; return false; } ConditionalWeakTable<PluginConfig.ICategoryConfig, CategoryCount> orCreateValue = CategoryMemory.GetOrCreateValue(@this); if (orCreateValue.TryGetValue(bagCategory, out var value) && value.Count >= limit) { limited = true; return false; } return !disallowed; } [HarmonyPrefix] [HarmonyPatch(typeof(StartOfRound), "Start")] private static void AddBagTooltip(StartOfRound __instance) { if (!PluginConfig.Misc.DropAll.Value) { return; } BeltBagItem val = default(BeltBagItem); foreach (Item items in __instance.allItemsList.itemsList) { if (Object.op_Implicit((Object)(object)items.spawnPrefab) && items.spawnPrefab.TryGetComponent<BeltBagItem>(ref val)) { Array.Resize(ref items.toolTips, items.toolTips.Length + 1); items.toolTips[^1] = "Empty Bag: [E]"; break; } } } [HarmonyPostfix] [HarmonyPatch(typeof(BeltBagItem), "RemoveFromBagLocalClientNonElevatorParent")] [HarmonyPatch(typeof(BeltBagItem), "RemoveFromBagLocalClient")] private static void TrackRemove(BeltBagItem __instance, NetworkObjectReference objectRef) { ConditionalWeakTable<PluginConfig.ICategoryConfig, CategoryCount> orCreateValue = CategoryMemory.GetOrCreateValue(__instance); NetworkObject val = default(NetworkObject); GrabbableObject grabbable = default(GrabbableObject); if (((NetworkObjectReference)(ref objectRef)).TryGet(ref val, (NetworkManager)null) && ((Component)val).TryGetComponent<GrabbableObject>(ref grabbable)) { PluginConfig.ICategoryConfig bagCategory = grabbable.GetBagCategory(); orCreateValue.GetOrCreateValue(bagCategory).Count--; } if (__instance.objectsInBag.Count == 0) { orCreateValue.Clear(); } } [HarmonyPrefix] [HarmonyPatch(typeof(BeltBagItem), "TryAddObjectToBagServerRpc")] private static bool EnforceLimits(BeltBagItem __instance, NetworkObjectReference netObjectRef, int playerWhoAdded) { //IL_0091: Unknown result type (might be due to invalid IL or missing references) //IL_00b1: Unknown result type (might be due to invalid IL or missing references) //IL_00a0: Unknown result type (might be due to invalid IL or missing references) if (!((NetworkBehaviour)(object)__instance).IsRPCServerStage()) { return true; } NetworkObject val = default(NetworkObject); if (!((NetworkObjectReference)(ref netObjectRef)).TryGet(ref val, (NetworkManager)null)) { return true; } GrabbableObject component = ((Component)val).GetComponent<GrabbableObject>(); if (!__instance.CanBePutInBag(component)) { __instance.CancelAddObjectToBagClientRpc(playerWhoAdded); return false; } if (PluginConfig.Host.Capacity.Value && __instance.objectsInBag.Count >= PluginConfig.Limits.Capacity.Value) { __instance.CancelAddObjectToBagClientRpc(playerWhoAdded); return false; } if (PluginConfig.Host.Category.Value && !__instance.CheckBagFilters(component, out var _, out var _)) { __instance.CancelAddObjectToBagClientRpc(playerWhoAdded); return false; } if (PluginConfig.Host.Range.Value) { Vector3 position = ((Component)component).transform.position; PlayerControllerB playerHeldBy = ((GrabbableObject)__instance).playerHeldBy; if (Vector3.Distance(position, (playerHeldBy != null) ? ((Component)playerHeldBy.gameplayCamera).transform.position : Vector3.positiveInfinity) > PluginConfig.Misc.GrabRange.Value) { __instance.CancelAddObjectToBagClientRpc(playerWhoAdded); return false; } } return true; } [HarmonyPostfix] [HarmonyPatch(typeof(BeltBagItem), "CancelAddObjectToBagClientRpc")] private static void OnServerRefusal(int playerWhoAdded) { if (!((Object)(object)StartOfRound.Instance.allPlayerScripts[playerWhoAdded] != (Object)(object)GameNetworkManager.Instance.localPlayerController)) { HUDManager.Instance.DisplayTip("Belt bag Info", "Host refused your grab request!", true, false, "LC_Tip1"); } } [HarmonyTranspiler] [HarmonyPatch(typeof(BeltBagItem), "RemoveObjectFromBag")] private static IEnumerable<CodeInstruction> FixDrop(IEnumerable<CodeInstruction> instructions, ILGenerator ilGenerator) { //IL_0037: Unknown result type (might be due to invalid IL or missing references) //IL_003d: Expected O, but got Unknown //IL_0053: Unknown result type (might be due to invalid IL or missing references) //IL_0059: Expected O, but got Unknown //IL_008f: Unknown result type (might be due to invalid IL or missing references) //IL_0095: Expected O, but got Unknown //IL_00aa: Unknown result type (might be due to invalid IL or missing references) //IL_00b0: Expected O, but got Unknown //IL_00c5: Unknown result type (might be due to invalid IL or missing references) //IL_00cb: Expected O, but got Unknown List<CodeInstruction> list = instructions.ToList(); MethodInfo methodInfo = AccessTools.Method(typeof(GrabbableObject), "GetItemFloorPosition", (Type[])null, (Type[])null); MethodInfo methodInfo2 = AccessTools.Method(typeof(BeltBagPatch), "FixVerticalOffset", (Type[])null, (Type[])null); CodeMatcher val = new CodeMatcher((IEnumerable<CodeInstruction>)list, ilGenerator); val.MatchForward(true, (CodeMatch[])(object)new CodeMatch[1] { new CodeMatch((OpCode?)OpCodes.Call, (object)methodInfo, (string)null) }); if (val.IsInvalid) { BagConfig.Log.LogError((object)"Patch RemoveObjectFromBag, Fail - 1 "); return list; } val.Advance(1); val.InsertAndAdvance((CodeInstruction[])(object)new CodeInstruction[1] { new CodeInstruction(OpCodes.Ldarg_0, (object)null) }); val.InsertAndAdvance((CodeInstruction[])(object)new CodeInstruction[1] { new CodeInstruction(OpCodes.Ldarg_1, (object)null) }); val.InsertAndAdvance((CodeInstruction[])(object)new CodeInstruction[1] { new CodeInstruction(OpCodes.Call, (object)methodInfo2) }); return val.Instructions(); } private static Vector3 FixVerticalOffset(Vector3 position, BeltBagItem beltBagItem, int index) { //IL_000e: Unknown result type (might be due to invalid IL or missing references) //IL_0027: Unknown result type (might be due to invalid IL or missing references) //IL_0028: Unknown result type (might be due to invalid IL or missing references) //IL_0038: Unknown result type (might be due to invalid IL or missing references) //IL_003d: Unknown result type (might be due to invalid IL or missing references) //IL_0042: Unknown result type (might be due to invalid IL or missing references) //IL_0044: Unknown result type (might be due to invalid IL or missing references) //IL_0045: Unknown result type (might be due to invalid IL or missing references) //IL_0055: Unknown result type (might be due to invalid IL or missing references) //IL_005a: Unknown result type (might be due to invalid IL or missing references) //IL_005f: Unknown result type (might be due to invalid IL or missing references) //IL_0061: Unknown result type (might be due to invalid IL or missing references) //IL_0025: Unknown result type (might be due to invalid IL or missing references) if (beltBagItem.objectsInBag.Count <= index) { return position; } GrabbableObject val = beltBagItem.objectsInBag[index]; if (!Object.op_Implicit((Object)(object)val)) { return position; } position += Vector3.down * ((GrabbableObject)beltBagItem).itemProperties.verticalOffset; position += Vector3.up * val.itemProperties.verticalOffset; return position; } [HarmonyPostfix] [HarmonyPatch(typeof(BeltBagItem), "PocketItem")] private static void HideWhenInPocket(BeltBagItem __instance) { if (((NetworkBehaviour)__instance).IsOwner && PluginConfig.Misc.HideBag.Value) { ((Component)__instance.useBagTrigger).GetComponent<Collider>().enabled = false; ((GrabbableObject)__instance).EnableItemMeshes(false); } } [HarmonyPrefix] [HarmonyPatch(typeof(StartOfRound), "Start")] private static void OnLobbyJoin(StartOfRound __instance) { Enabled = ((NetworkBehaviour)__instance).IsServer; } [HarmonyPostfix] [HarmonyPatch(typeof(StartOfRound), "OnClientConnect")] private static void OnClientJoined(StartOfRound __instance, ulong clientId) { if (((NetworkBehaviour)__instance).IsServer) { NamedMessages.HostPresentClientRpc(new <>z__ReadOnlySingleElementList<ulong>(clientId)); } } [HarmonyPrefix] [HarmonyPatch(typeof(MenuManager), "Start")] private static void OnMainMenu() { Enabled = false; } } [HarmonyPatch] internal class NetworkManagerPatch { [HarmonyPostfix] [HarmonyPatch(typeof(NetworkManager), "Initialize")] private static void AfterInitialize() { BagConfig.Log.LogInfo((object)"Registering Named Messages!"); NamedMessages.RegisterNamedMessages(); } [HarmonyPostfix] [HarmonyPatch(typeof(GameNetworkManager), "SetInstanceValuesBackToDefault")] public static void SetInstanceValuesBackToDefault() { if (!((Object)(object)NetworkManager.Singleton == (Object)null) && NetworkManager.Singleton.CustomMessagingManager != null) { BagConfig.Log.LogInfo((object)"Unregistering Named Messages!"); NamedMessages.UnregisterNamedMessages(); } } [HarmonyPostfix] [HarmonyPatch(typeof(NetworkManager), "SetSingleton")] private static void RegisterPrefab() { //IL_0012: Unknown result type (might be due to invalid IL or missing references) //IL_0018: Expected O, but got Unknown //IL_001a: Unknown result type (might be due to invalid IL or missing references) //IL_0021: Unknown result type (might be due to invalid IL or missing references) if (!PluginConfig.Host.AllowVanilla.Value) { GameObject val = new GameObject("BagConfig Prefab"); ((Object)val).hideFlags = (HideFlags)(((Object)val).hideFlags | 0x3D); Object.DontDestroyOnLoad((Object)(object)val); NetworkObject val2 = val.AddComponent<NetworkObject>(); val2.GlobalObjectIdHash = GetHash("mattymatty.BagConfig"); NetworkManager.Singleton.PrefabHandler.AddNetworkPrefab(val); } static uint GetHash(string value) { return value?.Aggregate(17u, (uint current, char c) => (current * 31) ^ c) ?? 0; } } } internal static class PatchLateJoin { private static uint _tryAddObjectToBagClientRpc; internal static void Init() { MethodInfo methodInfo = AccessTools.Method(typeof(BeltBagItem), "TryAddObjectToBagClientRpc", (Type[])null, (Type[])null); if (!methodInfo.TryGetRpcID(out _tryAddObjectToBagClientRpc)) { throw new MissingMemberException("BeltBagItem", "TryAddObjectToBagClientRpc"); } } [HarmonyPostfix] [HarmonyPatch(typeof(StartOfRound), "SyncAlreadyHeldObjectsClientRpc")] private static void SyncItemsInBags(StartOfRound __instance, NetworkObjectReference[] gObjects, int joiningClientId) { //IL_001a: Unknown result type (might be due to invalid IL or missing references) //IL_0020: Invalid comparison between Unknown and I4 //IL_003e: Unknown result type (might be due to invalid IL or missing references) //IL_0043: Unknown result type (might be due to invalid IL or missing references) //IL_0084: Unknown result type (might be due to invalid IL or missing references) //IL_0089: Unknown result type (might be due to invalid IL or missing references) //IL_008d: Unknown result type (might be due to invalid IL or missing references) //IL_0097: Unknown result type (might be due to invalid IL or missing references) //IL_00ab: Unknown result type (might be due to invalid IL or missing references) //IL_00ad: Unknown result type (might be due to invalid IL or missing references) //IL_00b2: Unknown result type (might be due to invalid IL or missing references) //IL_00b4: Unknown result type (might be due to invalid IL or missing references) //IL_00bd: Unknown result type (might be due to invalid IL or missing references) //IL_00c0: Unknown result type (might be due to invalid IL or missing references) //IL_00c5: Unknown result type (might be due to invalid IL or missing references) //IL_00cd: Unknown result type (might be due to invalid IL or missing references) //IL_00d3: Unknown result type (might be due to invalid IL or missing references) //IL_00da: Unknown result type (might be due to invalid IL or missing references) //IL_00f6: Unknown result type (might be due to invalid IL or missing references) NetworkManager networkManager = ((NetworkBehaviour)__instance).NetworkManager; if ((Object)(object)networkManager == (Object)null || !networkManager.IsListening || (int)((NetworkBehaviour)__instance).__rpc_exec_stage == 2 || (!networkManager.IsServer && !networkManager.IsHost)) { return; } NetworkObject val2 = default(NetworkObject); BeltBagItem val3 = default(BeltBagItem); for (int i = 0; i < gObjects.Length; i++) { NetworkObjectReference val = gObjects[i]; if (!((NetworkObjectReference)(ref val)).TryGet(ref val2, (NetworkManager)null) || !((Component)val2).TryGetComponent<BeltBagItem>(ref val3)) { continue; } foreach (GrabbableObject item in val3.objectsInBag) { NetworkObjectReference val4 = NetworkObjectReference.op_Implicit(((NetworkBehaviour)item).NetworkObject); ClientRpcParams val5 = default(ClientRpcParams); val5.Send = new ClientRpcSendParams { TargetClientIds = new <>z__ReadOnlySingleElementList<ulong>((ulong)joiningClientId) }; ClientRpcParams val6 = val5; FastBufferWriter val7 = ((NetworkBehaviour)val3).__beginSendClientRpc(_tryAddObjectToBagClientRpc, val6, (RpcDelivery)0); ((FastBufferWriter)(ref val7)).WriteValueSafe<NetworkObjectReference>(ref val4, default(ForNetworkSerializable)); BytePacker.WriteValueBitPacked(val7, ((GrabbableObject)val3).playerHeldBy.actualClientId); ((NetworkBehaviour)val3).__endSendClientRpc(ref val7, _tryAddObjectToBagClientRpc, val6, (RpcDelivery)0); } } } } } namespace BagConfig.Networking { internal static class NamedMessages { [CompilerGenerated] private static class <>O { public static HandleNamedMessageDelegate <0>__OnHostPresentClientRpc; public static HandleNamedMessageDelegate <1>__OnFixBagsClientRpc; } private static readonly string BaseName = typeof(NamedMessages).FullName; private static readonly string HostPresentClientRpcMessage = BaseName + "|HostPresentClientRpc"; private static readonly string FixBagsClientRpcMessage = BaseName + "|FixBagsClientRpc"; internal static void RegisterNamedMessages() { //IL_001f: Unknown result type (might be due to invalid IL or missing references) //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_002a: Expected O, but got Unknown //IL_004e: Unknown result type (might be due to invalid IL or missing references) //IL_0053: Unknown result type (might be due to invalid IL or missing references) //IL_0059: Expected O, but got Unknown CustomMessagingManager customMessagingManager = NetworkManager.Singleton.CustomMessagingManager; string hostPresentClientRpcMessage = HostPresentClientRpcMessage; object obj = <>O.<0>__OnHostPresentClientRpc; if (obj == null) { HandleNamedMessageDelegate val = OnHostPresentClientRpc; <>O.<0>__OnHostPresentClientRpc = val; obj = (object)val; } customMessagingManager.RegisterNamedMessageHandler(hostPresentClientRpcMessage, (HandleNamedMessageDelegate)obj); CustomMessagingManager customMessagingManager2 = NetworkManager.Singleton.CustomMessagingManager; string fixBagsClientRpcMessage = FixBagsClientRpcMessage; object obj2 = <>O.<1>__OnFixBagsClientRpc; if (obj2 == null) { HandleNamedMessageDelegate val2 = OnFixBagsClientRpc; <>O.<1>__OnFixBagsClientRpc = val2; obj2 = (object)val2; } customMessagingManager2.RegisterNamedMessageHandler(fixBagsClientRpcMessage, (HandleNamedMessageDelegate)obj2); } internal static void UnregisterNamedMessages() { NetworkManager.Singleton.CustomMessagingManager.UnregisterNamedMessageHandler(HostPresentClientRpcMessage); NetworkManager.Singleton.CustomMessagingManager.UnregisterNamedMessageHandler(FixBagsClientRpcMessage); } internal static void HostPresentClientRpc(IReadOnlyList<ulong> targets = null) { //IL_0041: Unknown result type (might be due to invalid IL or missing references) //IL_0029: Unknown result type (might be due to invalid IL or missing references) if (NetworkManager.Singleton.IsServer) { FastBufferWriter val = default(FastBufferWriter); ((FastBufferWriter)(ref val))..ctor(0, (Allocator)2, -1); if (targets == null) { NetworkManager.Singleton.CustomMessagingManager.SendNamedMessageToAll(HostPresentClientRpcMessage, val, (NetworkDelivery)3); } else { NetworkManager.Singleton.CustomMessagingManager.SendNamedMessage(HostPresentClientRpcMessage, targets, val, (NetworkDelivery)3); } } } private static void OnHostPresentClientRpc(ulong senderId, FastBufferReader data) { if (senderId == 0L) { BeltBagPatch.Enabled = true; } } internal static void FixBagsClientRpc(IReadOnlyList<ulong> targets = null) { //IL_0041: Unknown result type (might be due to invalid IL or missing references) //IL_0029: Unknown result type (might be due to invalid IL or missing references) if (NetworkManager.Singleton.IsServer) { FastBufferWriter val = default(FastBufferWriter); ((FastBufferWriter)(ref val))..ctor(0, (Allocator)2, -1); if (targets == null) { NetworkManager.Singleton.CustomMessagingManager.SendNamedMessageToAll(FixBagsClientRpcMessage, val, (NetworkDelivery)3); } else { NetworkManager.Singleton.CustomMessagingManager.SendNamedMessage(FixBagsClientRpcMessage, targets, val, (NetworkDelivery)3); } } } private static void OnFixBagsClientRpc(ulong senderId, FastBufferReader data) { if (senderId == 0L && !((Object)(object)StartOfRound.Instance == (Object)null)) { BagConfig.Log.LogWarning((object)"Host requested all beltBags to be freed!"); BeltBagItem[] array = Object.FindObjectsByType<BeltBagItem>((FindObjectsInactive)1, (FindObjectsSortMode)0); BeltBagItem[] array2 = array; foreach (BeltBagItem val in array2) { BagConfig.Log.LogDebug((object)$"Fixing status of 0x{((NetworkBehaviour)val).NetworkObjectId:X}, was: {val.tryingAddToBag}"); val.tryingAddToBag = false; val.tryingCheckBag = false; } } } } } namespace BagConfig.InputUtils { public class BagInputs : LcInputActions { public static BagInputs Instance { get; } [InputAction(/*Could not decode attribute arguments.*/)] public InputAction DropAll { get; set; } [InputAction(/*Could not decode attribute arguments.*/)] public InputAction GrabOne { get; set; } static BagInputs() { Instance = new BagInputs(); Instance.DropAll.performed += delegate { if (BeltBagPatch.Enabled && TryGetBeltBag(out var beltBag3)) { BeltBagPatch.TryDumpItems(beltBag3); } static bool TryGetBeltBag(out BeltBagItem beltBag) { beltBag = null; GameNetworkManager instance = GameNetworkManager.Instance; if ((Object)(object)instance == (Object)null) { return false; } GrabbableObject currentlyHeldObjectServer = instance.localPlayerController.currentlyHeldObjectServer; BeltBagItem val = (BeltBagItem)(object)((currentlyHeldObjectServer is BeltBagItem) ? currentlyHeldObjectServer : null); if (val == null) { return false; } beltBag = val; return true; } }; Instance.GrabOne.performed += delegate { if (BeltBagPatch.Enabled && BagInputs.<.cctor>g__TryGetBeltBag|0_2(out BeltBagItem beltBag2)) { BeltBagPatch.TryGrabItem(beltBag2); } }; } } } namespace BagConfig.Dependency { public static class InputUtilsProxy { private static bool? _enabled; public static bool Enabled { get { bool valueOrDefault = _enabled.GetValueOrDefault(); if (!_enabled.HasValue) { valueOrDefault = Chainloader.PluginInfos.ContainsKey("com.rune580.LethalCompanyInputUtils"); _enabled = valueOrDefault; } return _enabled.Value; } } [MethodImpl(MethodImplOptions.NoInlining | MethodImplOptions.NoOptimization)] internal static void Init() { if (Enabled) { _ = BagInputs.Instance; } } } public static class LethalConfigProxy { public struct CanModifyResult { public readonly bool CanModify; public readonly string Reason; public CanModifyResult(bool canModify, string reason) { CanModify = canModify; Reason = reason; } public static implicit operator CanModifyResult((bool result, string reason) tuple) { return new CanModifyResult(tuple.result, tuple.reason); } public static implicit operator (bool result, string reason)(CanModifyResult result) { return (result.CanModify, result.Reason); } } public delegate CanModifyResult CanModifyDelegate(); private static bool? _enabled; public static bool Enabled { get { bool valueOrDefault = _enabled.GetValueOrDefault(); if (!_enabled.HasValue) { valueOrDefault = Chainloader.PluginInfos.ContainsKey("ainavt.lc.lethalconfig"); _enabled = valueOrDefault; } return _enabled.Value; } } [MethodImpl(MethodImplOptions.NoInlining | MethodImplOptions.NoOptimization)] public static void AddConfig(ConfigEntry<string> entry, bool requiresRestart = false) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_000d: Unknown result type (might be due to invalid IL or missing references) //IL_001e: Expected O, but got Unknown //IL_0019: Unknown result type (might be due to invalid IL or missing references) //IL_0023: Expected O, but got Unknown LethalConfigManager.AddConfigItem((BaseConfigItem)new TextInputFieldConfigItem(entry, new TextInputFieldOptions { RequiresRestart = requiresRestart, Name = GetPrettyConfigName<string>(entry) })); } [MethodImpl(MethodImplOptions.NoInlining | MethodImplOptions.NoOptimization)] public static void AddConfig(ConfigEntry<bool> entry, bool requiresRestart = false) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_000d: Unknown result type (might be due to invalid IL or missing references) //IL_001e: Expected O, but got Unknown //IL_0019: Unknown result type (might be due to invalid IL or missing references) //IL_0023: Expected O, but got Unknown LethalConfigManager.AddConfigItem((BaseConfigItem)new BoolCheckBoxConfigItem(entry, new BoolCheckBoxOptions { RequiresRestart = requiresRestart, Name = GetPrettyConfigName<bool>(entry) })); } [MethodImpl(MethodImplOptions.NoInlining | MethodImplOptions.NoOptimization)] public static void AddConfig(ConfigEntry<float> entry, bool requiresRestart = false) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_000d: Unknown result type (might be due to invalid IL or missing references) //IL_001e: Expected O, but got Unknown //IL_0019: Unknown result type (might be due to invalid IL or missing references) //IL_0023: Expected O, but got Unknown LethalConfigManager.AddConfigItem((BaseConfigItem)new FloatInputFieldConfigItem(entry, new FloatInputFieldOptions { RequiresRestart = requiresRestart, Name = GetPrettyConfigName<float>(entry) })); } [MethodImpl(MethodImplOptions.NoInlining | MethodImplOptions.NoOptimization)] public static void AddConfig(ConfigEntry<int> entry, bool requiresRestart = false) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_000d: Unknown result type (might be due to invalid IL or missing references) //IL_001e: Expected O, but got Unknown //IL_0019: Unknown result type (might be due to invalid IL or missing references) //IL_0023: Expected O, but got Unknown LethalConfigManager.AddConfigItem((BaseConfigItem)new IntInputFieldConfigItem(entry, new IntInputFieldOptions { RequiresRestart = requiresRestart, Name = GetPrettyConfigName<int>(entry) })); } [MethodImpl(MethodImplOptions.NoInlining | MethodImplOptions.NoOptimization)] public static void AddButton(string section, string name, string description, string buttonText, Action callback, CanModifyDelegate canModify = null) { //IL_0021: Unknown result type (might be due to invalid IL or missing references) //IL_002b: Expected O, but got Unknown //IL_0026: Unknown result type (might be due to invalid IL or missing references) //IL_002c: Expected O, but got Unknown //IL_0041: Unknown result type (might be due to invalid IL or missing references) //IL_004b: Expected O, but got Unknown GenericButtonConfigItem val = new GenericButtonConfigItem(section, name, description, buttonText, (GenericButtonHandler)delegate { callback?.Invoke(); }); if (canModify != null) { ((BaseOptions)val.ButtonOptions).CanModifyCallback = (CanModifyDelegate)(() => CanModifyResult.op_Implicit(((bool result, string reason))canModify())); } LethalConfigManager.AddConfigItem((BaseConfigItem)(object)val); } private static string GetPrettyConfigName<T>(ConfigEntry<T> entry) { return CultureInfo.InvariantCulture.TextInfo.ToTitleCase(((ConfigEntryBase)entry).Definition.Key.Replace("_", " ")); } } public static class LobbyCompatibilityChecker { private static bool? _enabled; public static bool Enabled { get { bool valueOrDefault = _enabled.GetValueOrDefault(); if (!_enabled.HasValue) { valueOrDefault = Chainloader.PluginInfos.ContainsKey("BMX.LobbyCompatibility"); _enabled = valueOrDefault; } return _enabled.Value; } } [MethodImpl(MethodImplOptions.NoInlining | MethodImplOptions.NoOptimization)] public static void Init() { PluginHelper.RegisterPlugin("mattymatty.BagConfig", Version.Parse("1.0.3"), (CompatibilityLevel)0, (VersionStrictness)2); } } } namespace System.Runtime.CompilerServices { [AttributeUsage(AttributeTargets.Assembly, AllowMultiple = true)] internal sealed class IgnoresAccessChecksToAttribute : Attribute { public IgnoresAccessChecksToAttribute(string assemblyName) { } } } [CompilerGenerated] internal sealed class <>z__ReadOnlySingleElementList<T> : IEnumerable, ICollection, IList, IEnumerable<T>, IReadOnlyCollection<T>, IReadOnlyList<T>, ICollection<T>, IList<T> { private sealed class Enumerator : IDisposable, IEnumerator, IEnumerator<T> { object IEnumerator.Current => _item; T IEnumerator<T>.Current => _item; public Enumerator(T item) { _item = item; } bool IEnumerator.MoveNext() { if (!_moveNextCalled) { return _moveNextCalled = true; } return false; } void IEnumerator.Reset() { _moveNextCalled = false; } void IDisposable.Dispose() { } } int ICollection.Count => 1; bool ICollection.IsSynchronized => false; object ICollection.SyncRoot => this; object IList.this[int index] { get { if (index != 0) { throw new IndexOutOfRangeException(); } return _item; } set { throw new NotSupportedException(); } } bool IList.IsFixedSize => true; bool IList.IsReadOnly => true; int IReadOnlyCollection<T>.Count => 1; T IReadOnlyList<T>.this[int index] { get { if (index != 0) { throw new IndexOutOfRangeException(); } return _item; } } int ICollection<T>.Count => 1; bool ICollection<T>.IsReadOnly => true; T IList<T>.this[int index] { get { if (index != 0) { throw new IndexOutOfRangeException(); } return _item; } set { throw new NotSupportedException(); } } public <>z__ReadOnlySingleElementList(T item) { _item = item; } IEnumerator IEnumerable.GetEnumerator() { return new Enumerator(_item); } void ICollection.CopyTo(Array array, int index) { array.SetValue(_item, index); } int IList.Add(object value) { throw new NotSupportedException(); } void IList.Clear() { throw new NotSupportedException(); } bool IList.Contains(object value) { return EqualityComparer<T>.Default.Equals(_item, (T)value); } int IList.IndexOf(object value) { if (!EqualityComparer<T>.Default.Equals(_item, (T)value)) { return -1; } return 0; } void IList.Insert(int index, object value) { throw new NotSupportedException(); } void IList.Remove(object value) { throw new NotSupportedException(); } void IList.RemoveAt(int index) { throw new NotSupportedException(); } IEnumerator<T> IEnumerable<T>.GetEnumerator() { return new Enumerator(_item); } void ICollection<T>.Add(T item) { throw new NotSupportedException(); } void ICollection<T>.Clear() { throw new NotSupportedException(); } bool ICollection<T>.Contains(T item) { return EqualityComparer<T>.Default.Equals(_item, item); } void ICollection<T>.CopyTo(T[] array, int arrayIndex) { array[arrayIndex] = _item; } bool ICollection<T>.Remove(T item) { throw new NotSupportedException(); } int IList<T>.IndexOf(T item) { if (!EqualityComparer<T>.Default.Equals(_item, item)) { return -1; } return 0; } void IList<T>.Insert(int index, T item) { throw new NotSupportedException(); } void IList<T>.RemoveAt(int index) { throw new NotSupportedException(); } }