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 SCPequipment v1.0.0
Amnestics.dll
Decompiled a year agousing System; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Linq; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Serialization; using System.Runtime.Versioning; using System.Security; using System.Security.Permissions; using Amnestics.Behaviour; using Amnestics.Misc; using Amnestics.NetcodePatcher; using Amnestics.Util; using BepInEx; using BepInEx.Configuration; using BepInEx.Logging; using CSync.Extensions; using CSync.Lib; using CustomItemBehaviourLibrary.AbstractItems; using HarmonyLib; using LethalLib.Modules; using Microsoft.CodeAnalysis; using UnityEngine; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)] [assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("0.0.0.0")] [module: UnverifiableCode] [module: RefSafetyRules(11)] [module: NetcodePatchedAssembly] internal class <Module> { static <Module>() { } } 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 Amnestics { [BepInPlugin("com.github.WhiteSpike.Amnestics", "Amnestics", "1.0.0")] [BepInDependency(/*Could not decode attribute arguments.*/)] [BepInDependency(/*Could not decode attribute arguments.*/)] [BepInDependency(/*Could not decode attribute arguments.*/)] public class Plugin : BaseUnityPlugin { internal static readonly Harmony harmony = new Harmony("com.github.WhiteSpike.Amnestics"); internal static readonly ManualLogSource mls = Logger.CreateLogSource("Amnestics"); public static PluginConfig Config; private void Awake() { //IL_017a: Unknown result type (might be due to invalid IL or missing references) //IL_017f: Unknown result type (might be due to invalid IL or missing references) //IL_0195: Unknown result type (might be due to invalid IL or missing references) //IL_019a: Unknown result type (might be due to invalid IL or missing references) //IL_01b0: Unknown result type (might be due to invalid IL or missing references) //IL_01b5: Unknown result type (might be due to invalid IL or missing references) Config = new PluginConfig(((BaseUnityPlugin)this).Config); IEnumerable<Type> enumerable; try { enumerable = Assembly.GetExecutingAssembly().GetTypes(); } catch (ReflectionTypeLoadException ex) { enumerable = ex.Types.Where((Type t) => t != null); } foreach (Type item in enumerable) { MethodInfo[] methods = item.GetMethods(BindingFlags.Instance | BindingFlags.Static | BindingFlags.NonPublic); MethodInfo[] array = methods; foreach (MethodInfo methodInfo in array) { object[] customAttributes = methodInfo.GetCustomAttributes(typeof(RuntimeInitializeOnLoadMethodAttribute), inherit: false); if (customAttributes.Length != 0) { methodInfo.Invoke(null, null); } } } string text = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "amnestics"); AssetBundle val = AssetBundle.LoadFromFile(text); string text2 = "Assets/Amnestics/"; Item val2 = ScriptableObject.CreateInstance<Item>(); ((Object)val2).name = "amnesticsItemProperties"; val2.allowDroppingAheadOfPlayer = SyncedEntry<bool>.op_Implicit(Config.DROP_AHEAD_PLAYER); val2.canBeGrabbedBeforeGameStart = SyncedEntry<bool>.op_Implicit(Config.GRABBED_BEFORE_START); val2.canBeInspected = false; val2.creditsWorth = SyncedEntry<int>.op_Implicit(Config.PRICE); val2.verticalOffset = 0.04f; val2.restingRotation = new Vector3(-90f, 0f, 0f); val2.rotationOffset = new Vector3(0f, 90f, 0f); val2.positionOffset = new Vector3(0f, 0.12f, 0.02f); val2.weight = 0.99f + (float)(SyncedEntry<int>.op_Implicit(Config.WEIGHT) - 1) / 100f; val2.twoHanded = false; val2.itemIcon = val.LoadAsset<Sprite>(text2 + "Icon.png"); val2.spawnPrefab = val.LoadAsset<GameObject>(text2 + "Amnestics.prefab"); val2.dropSFX = val.LoadAsset<AudioClip>(text2 + "Drop.ogg"); val2.grabSFX = val.LoadAsset<AudioClip>(text2 + "Grab.ogg"); val2.pocketSFX = val.LoadAsset<AudioClip>(text2 + "Pocket.ogg"); val2.throwSFX = val.LoadAsset<AudioClip>(text2 + "Throw.ogg"); val2.highestSalePercentage = SyncedEntry<int>.op_Implicit(Config.HIGHEST_SALE_PERCENTAGE); val2.itemName = "Amnestics"; val2.itemSpawnsOnGround = true; val2.isConductiveMetal = SyncedEntry<bool>.op_Implicit(Config.CONDUCTIVE); val2.requiresBattery = false; val2.batteryUsage = 0f; AmnesticsBehaviour amnesticsBehaviour = val2.spawnPrefab.AddComponent<AmnesticsBehaviour>(); ((GrabbableObject)amnesticsBehaviour).itemProperties = val2; ((GrabbableObject)amnesticsBehaviour).grabbable = true; ((GrabbableObject)amnesticsBehaviour).grabbableToEnemies = true; NetworkPrefabs.RegisterNetworkPrefab(val2.spawnPrefab); TerminalNode val3 = SetupInfoNode(); Items.RegisterShopItem(val2, (TerminalNode)null, (TerminalNode)null, val3, val2.creditsWorth); mls.LogInfo((object)"Amnestics 1.0.0 has been loaded successfully."); } internal static TerminalNode SetupInfoNode() { TerminalNode val = ScriptableObject.CreateInstance<TerminalNode>(); val.displayText = val.displayText + GetDisplayInfo() + "\n"; val.clearPreviousText = true; return val; } public static string GetDisplayInfo() { return "Recharges items' battery life when interacting"; } } public static class PluginInfo { public const string PLUGIN_GUID = "Amnestics"; public const string PLUGIN_NAME = "Amnestics"; public const string PLUGIN_VERSION = "1.0.0"; } } namespace Amnestics.Util { internal static class Constants { internal const string ITEM_SCAN_NODE_KEY_FORMAT = "Enable scan node of {0}"; internal const bool ITEM_SCAN_NODE_DEFAULT = true; internal const string ITEM_SCAN_NODE_DESCRIPTION = "Shows a scan node on the item when scanning"; internal const string AMNESTICS_PRICE_KEY = "Amnestics price"; internal const int AMNESTICS_PRICE_DEFAULT = 50; internal const string AMNESTICS_PRICE_DESCRIPTION = "Price for Amnestics."; internal const string AMNESTICS_WEIGHT_KEY = "Item weight"; internal const int AMNESTICS_WEIGHT_DEFAULT = 5; internal const string AMNESTICS_WEIGHT_DESCRIPTION = "Weight (in lbs)"; internal const string AMNESTICS_TWO_HANDED_KEY = "Two Handed Item"; internal const bool AMNESTICS_TWO_HANDED_DEFAULT = true; internal const string AMNESTICS_TWO_HANDED_DESCRIPTION = "One or two handed item."; internal const string AMNESTICS_CONDUCTIVE_KEY = "Conductive"; internal const bool AMNESTICS_CONDUCTIVE_DEFAULT = true; internal const string AMNESTICS_CONDUCTIVE_DESCRIPTION = "Wether it attracts lightning to the item or not. (Or other mechanics that rely on item being conductive)"; internal const string AMNESTICS_DROP_AHEAD_PLAYER_KEY = "Drop ahead of player when dropping"; internal const bool AMNESTICS_DROP_AHEAD_PLAYER_DEFAULT = false; internal const string AMNESTICS_DROP_AHEAD_PLAYER_DESCRIPTION = "If on, the item will drop infront of the player. Otherwise, drops underneath them and slightly infront."; internal const string AMNESTICS_GRABBED_BEFORE_START_KEY = "Grabbable before game start"; internal const bool AMNESTICS_GRABBED_BEFORE_START_DEFAULT = false; internal const string AMNESTICS_GRABBED_BEFORE_START_DESCRIPTION = "Allows wether the item can be grabbed before hand or not"; internal const string AMNESTICS_HIGHEST_SALE_PERCENTAGE_KEY = "Highest Sale Percentage"; internal const int AMNESTICS_HIGHEST_SALE_PERCENTAGE_DEFAULT = 50; internal const string AMNESTICS_HIGHEST_SALE_PERCENTAGE_DESCRIPTION = "Maximum percentage of sale allowed when this item is selected for a sale."; internal const string AMNESTICS_USAGES_KEY = "Recharge Usages"; internal const int AMNESTICS_USAGES_DEFAULT = 1; internal const string AMNESTICS_USAGES_DESCRIPTION = "Amount of times the item can be used to recharge your sanity"; internal const string AMNESTICS_RECHARGE_PERCENTAGE_KEY = "Recharge Percentage"; internal const int AMNESTICS_RECHARGE_PERCENTAGE_DEFAULT = 100; internal const string AMNESTICS_RECHARGE_PERCENTAGE_DESCRIPTION = "Amount (%) of sanity recharge it provides to the item when used"; internal const string AMNESTICS_RECHARGE_OVERTIME_KEY = "Recharge over time"; internal const float AMNESTICS_RECHARGE_OVERTIME_DEFAULT = 10f; internal const string AMNESTICS_RECHARGE_OVERTIME_DESCRIPTION = "Amount of time (in seconds) where you replenish sanity after consuming the item."; internal const string AMNESTICS_RECHARGE_OVERTIME_RATE_KEY = "Recharge overtime rate"; internal const float AMNESTICS_RECHARGE_OVERTIME_RATE_DEFAULT = 3f; internal const string AMNESTICS_RECHARGE_OVERTIME_RATE_DESCRIPTION = "Rate of which you gain sanity after consuming the item during the recharge over time buff"; internal const string AMNESTICS_DESTROY_KEY = "Destroy Item when Exausted"; internal const bool AMNESTICS_DESTROY_DEFAULT = true; internal const string AMNESTICS_DESTROY_DESCRIPTION = "When you can no longer recharge sanity with the ammnestics, the ammnestics get cleared from your inventory"; internal static readonly string AMNESTICS_SCAN_NODE_KEY = string.Format("Enable scan node of {0}", "Amnestics"); } } namespace Amnestics.Misc { [DataContract] public class PluginConfig : SyncedConfig2<PluginConfig> { [field: SyncedEntryField] public SyncedEntry<bool> SCAN_NODE { get; set; } [field: SyncedEntryField] public SyncedEntry<int> PRICE { get; set; } [field: SyncedEntryField] public SyncedEntry<int> WEIGHT { get; set; } [field: SyncedEntryField] public SyncedEntry<bool> DROP_AHEAD_PLAYER { get; set; } [field: SyncedEntryField] public SyncedEntry<bool> GRABBED_BEFORE_START { get; set; } [field: SyncedEntryField] public SyncedEntry<bool> CONDUCTIVE { get; set; } [field: SyncedEntryField] public SyncedEntry<int> HIGHEST_SALE_PERCENTAGE { get; set; } [field: SyncedEntryField] public SyncedEntry<int> USAGES { get; set; } [field: SyncedEntryField] public SyncedEntry<int> RECHARGE_PERCENTAGE { get; set; } [field: SyncedEntryField] public SyncedEntry<float> RECHARGE_OVERTIME { get; set; } [field: SyncedEntryField] public SyncedEntry<float> RECHARGE_OVERTIME_RATE { get; set; } [field: SyncedEntryField] public SyncedEntry<bool> DESTROY { get; set; } public PluginConfig(ConfigFile cfg) : base("com.github.WhiteSpike.Amnestics") { string text = "Amnestics"; PRICE = SyncedBindingExtensions.BindSyncedEntry<int>(cfg, text, "Amnestics price", 50, "Price for Amnestics."); WEIGHT = SyncedBindingExtensions.BindSyncedEntry<int>(cfg, text, "Item weight", 5, "Weight (in lbs)"); SCAN_NODE = SyncedBindingExtensions.BindSyncedEntry<bool>(cfg, text, Constants.AMNESTICS_SCAN_NODE_KEY, true, "Shows a scan node on the item when scanning"); DROP_AHEAD_PLAYER = SyncedBindingExtensions.BindSyncedEntry<bool>(cfg, text, "Drop ahead of player when dropping", false, "If on, the item will drop infront of the player. Otherwise, drops underneath them and slightly infront."); CONDUCTIVE = SyncedBindingExtensions.BindSyncedEntry<bool>(cfg, text, "Conductive", true, "Wether it attracts lightning to the item or not. (Or other mechanics that rely on item being conductive)"); GRABBED_BEFORE_START = SyncedBindingExtensions.BindSyncedEntry<bool>(cfg, text, "Grabbable before game start", false, "Allows wether the item can be grabbed before hand or not"); HIGHEST_SALE_PERCENTAGE = SyncedBindingExtensions.BindSyncedEntry<int>(cfg, text, "Highest Sale Percentage", 50, "Maximum percentage of sale allowed when this item is selected for a sale."); USAGES = SyncedBindingExtensions.BindSyncedEntry<int>(cfg, text, "Recharge Usages", 1, "Amount of times the item can be used to recharge your sanity"); RECHARGE_PERCENTAGE = SyncedBindingExtensions.BindSyncedEntry<int>(cfg, text, "Recharge Percentage", 100, "Amount (%) of sanity recharge it provides to the item when used"); RECHARGE_OVERTIME = SyncedBindingExtensions.BindSyncedEntry<float>(cfg, text, "Recharge over time", 10f, "Amount of time (in seconds) where you replenish sanity after consuming the item."); RECHARGE_OVERTIME_RATE = SyncedBindingExtensions.BindSyncedEntry<float>(cfg, text, "Recharge overtime rate", 3f, "Rate of which you gain sanity after consuming the item during the recharge over time buff"); DESTROY = SyncedBindingExtensions.BindSyncedEntry<bool>(cfg, text, "Destroy Item when Exausted", true, "When you can no longer recharge sanity with the ammnestics, the ammnestics get cleared from your inventory"); ConfigManager.Register<PluginConfig>((SyncedConfig2<PluginConfig>)this); } } internal static class Metadata { public const string GUID = "com.github.WhiteSpike.Amnestics"; public const string NAME = "Amnestics"; public const string VERSION = "1.0.0"; } } namespace Amnestics.Behaviour { internal class AmnesticsBehaviour : ReplenishSanityBehaviour { internal const string ITEM_NAME = "Amnestics"; protected bool KeepScanNode => SyncedEntry<bool>.op_Implicit(Plugin.Config.SCAN_NODE); public override void Start() { ((GrabbableObject)this).Start(); if (!KeepScanNode) { Object.Destroy((Object)(object)((Component)this).gameObject.GetComponentInChildren<ScanNodeProperties>()); } base.rechargeUsages = SyncedEntry<int>.op_Implicit(Plugin.Config.USAGES); base.sanityReplenish = (float)SyncedEntry<int>.op_Implicit(Plugin.Config.RECHARGE_PERCENTAGE) / 100f; base.sanityOvertime = SyncedEntry<float>.op_Implicit(Plugin.Config.RECHARGE_OVERTIME); base.sanityOvertimeReplenish = SyncedEntry<float>.op_Implicit(Plugin.Config.RECHARGE_OVERTIME_RATE); base.destroyUponExaustion = SyncedEntry<bool>.op_Implicit(Plugin.Config.DESTROY); } protected override void __initializeVariables() { ((ReplenishSanityBehaviour)this).__initializeVariables(); } protected internal override string __getTypeName() { return "AmnesticsBehaviour"; } } } namespace System.Runtime.CompilerServices { [AttributeUsage(AttributeTargets.Assembly, AllowMultiple = true)] internal sealed class IgnoresAccessChecksToAttribute : Attribute { public IgnoresAccessChecksToAttribute(string assemblyName) { } } } namespace Amnestics.NetcodePatcher { [AttributeUsage(AttributeTargets.Module)] internal class NetcodePatchedAssemblyAttribute : Attribute { } }
Batteries.dll
Decompiled a year agousing System; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Linq; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Serialization; using System.Runtime.Versioning; using System.Security; using System.Security.Permissions; using Batteries.Behaviour; using Batteries.Misc; using Batteries.NetcodePatcher; using Batteries.Util; using BepInEx; using BepInEx.Bootstrap; using BepInEx.Configuration; using BepInEx.Logging; using CSync.Extensions; using CSync.Lib; using CustomItemBehaviourLibrary.AbstractItems; using CustomItemBehaviourLibrary.Compatibility; using HarmonyLib; using LethalLib.Modules; using Microsoft.CodeAnalysis; using MoreShipUpgrades.UpgradeComponents.TierUpgrades.Player; using UnityEngine; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)] [assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("0.0.0.0")] [module: UnverifiableCode] [module: RefSafetyRules(11)] [module: NetcodePatchedAssembly] internal class <Module> { static <Module>() { } } 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 CustomItemBehaviourLibrary.Compatibility { internal static class LategameCompatibility { public static bool Enabled => Chainloader.PluginInfos.ContainsKey("com.malco.lethalcompany.moreshipupgrades"); public static float GetGrabDistance() { return MechanicalArms.GetIncreasedGrabDistance(GameNetworkManager.Instance.localPlayerController.grabDistance); } } } namespace Batteries { [BepInPlugin("com.github.WhiteSpike.Batteries", "Batteries", "1.0.0")] [BepInDependency(/*Could not decode attribute arguments.*/)] [BepInDependency(/*Could not decode attribute arguments.*/)] [BepInDependency(/*Could not decode attribute arguments.*/)] [BepInDependency(/*Could not decode attribute arguments.*/)] public class Plugin : BaseUnityPlugin { internal static readonly Harmony harmony = new Harmony("com.github.WhiteSpike.Batteries"); internal static readonly ManualLogSource mls = Logger.CreateLogSource("Batteries"); public static PluginConfig Config; private void Awake() { //IL_016e: Unknown result type (might be due to invalid IL or missing references) //IL_0173: Unknown result type (might be due to invalid IL or missing references) //IL_0189: Unknown result type (might be due to invalid IL or missing references) //IL_018e: Unknown result type (might be due to invalid IL or missing references) //IL_01a4: Unknown result type (might be due to invalid IL or missing references) //IL_01a9: Unknown result type (might be due to invalid IL or missing references) Config = new PluginConfig(((BaseUnityPlugin)this).Config); IEnumerable<Type> enumerable; try { enumerable = Assembly.GetExecutingAssembly().GetTypes(); } catch (ReflectionTypeLoadException ex) { enumerable = ex.Types.Where((Type t) => t != null); } foreach (Type item in enumerable) { MethodInfo[] methods = item.GetMethods(BindingFlags.Instance | BindingFlags.Static | BindingFlags.NonPublic); MethodInfo[] array = methods; foreach (MethodInfo methodInfo in array) { object[] customAttributes = methodInfo.GetCustomAttributes(typeof(RuntimeInitializeOnLoadMethodAttribute), inherit: false); if (customAttributes.Length != 0) { methodInfo.Invoke(null, null); } } } string text = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "batteries"); AssetBundle val = AssetBundle.LoadFromFile(text); string text2 = "Assets/Batteries/"; Item val2 = ScriptableObject.CreateInstance<Item>(); ((Object)val2).name = "batteriesItemProperties"; val2.allowDroppingAheadOfPlayer = SyncedEntry<bool>.op_Implicit(Config.DROP_AHEAD_PLAYER); val2.canBeGrabbedBeforeGameStart = SyncedEntry<bool>.op_Implicit(Config.GRABBED_BEFORE_START); val2.canBeInspected = false; val2.creditsWorth = SyncedEntry<int>.op_Implicit(Config.PRICE); val2.restingRotation = new Vector3(0f, 0f, 0f); val2.rotationOffset = new Vector3(0f, 0f, 180f); val2.positionOffset = new Vector3(0f, 0.15f, -0.04f); val2.weight = 0.99f + (float)(SyncedEntry<int>.op_Implicit(Config.WEIGHT) - 1) / 100f; val2.twoHanded = false; val2.itemIcon = val.LoadAsset<Sprite>(text2 + "Icon.png"); val2.spawnPrefab = val.LoadAsset<GameObject>(text2 + "Battery.prefab"); val2.dropSFX = val.LoadAsset<AudioClip>(text2 + "Drop.ogg"); val2.grabSFX = val.LoadAsset<AudioClip>(text2 + "Grab.ogg"); val2.pocketSFX = val.LoadAsset<AudioClip>(text2 + "Pocket.ogg"); val2.throwSFX = val.LoadAsset<AudioClip>(text2 + "Throw.ogg"); val2.highestSalePercentage = SyncedEntry<int>.op_Implicit(Config.HIGHEST_SALE_PERCENTAGE); val2.itemName = "Batteries"; val2.itemSpawnsOnGround = true; val2.isConductiveMetal = SyncedEntry<bool>.op_Implicit(Config.CONDUCTIVE); val2.requiresBattery = false; val2.batteryUsage = 0f; BatteriesBehaviour batteriesBehaviour = val2.spawnPrefab.AddComponent<BatteriesBehaviour>(); ((GrabbableObject)batteriesBehaviour).itemProperties = val2; ((GrabbableObject)batteriesBehaviour).grabbable = true; ((GrabbableObject)batteriesBehaviour).grabbableToEnemies = true; NetworkPrefabs.RegisterNetworkPrefab(val2.spawnPrefab); TerminalNode val3 = SetupInfoNode(); Items.RegisterShopItem(val2, (TerminalNode)null, (TerminalNode)null, val3, val2.creditsWorth); Item val4 = Object.Instantiate<Item>(val2); ((Object)val4).name = "scrapBatteriesItemProperties"; val4.isScrap = true; val4.minValue = SyncedEntry<int>.op_Implicit(Config.MINIMUM_SCRAP_VALUE); val4.maxValue = SyncedEntry<int>.op_Implicit(Config.MAXIMUM_SCRAP_VALUE); val4.itemName = "Scrap Batteries"; val4.spawnPrefab = val.LoadAsset<GameObject>(text2 + "ScrapBattery.prefab"); batteriesBehaviour = val4.spawnPrefab.AddComponent<BatteriesBehaviour>(); ((GrabbableObject)batteriesBehaviour).itemProperties = val4; ((GrabbableObject)batteriesBehaviour).grabbable = true; ((GrabbableObject)batteriesBehaviour).grabbableToEnemies = true; NetworkPrefabs.RegisterNetworkPrefab(val4.spawnPrefab); Items.RegisterScrap(val4, SyncedEntry<int>.op_Implicit(Config.RARITY), (LevelTypes)(-1)); mls.LogInfo((object)"Batteries 1.0.0 has been loaded successfully."); } internal static TerminalNode SetupInfoNode() { TerminalNode val = ScriptableObject.CreateInstance<TerminalNode>(); val.displayText = val.displayText + GetDisplayInfo() + "\n"; val.clearPreviousText = true; return val; } public static string GetDisplayInfo() { return "Recharges items' battery life when interacting"; } } public static class PluginInfo { public const string PLUGIN_GUID = "Batteries"; public const string PLUGIN_NAME = "Batteries"; public const string PLUGIN_VERSION = "1.0.0"; } } namespace Batteries.Util { internal static class Constants { internal const string ITEM_SCAN_NODE_KEY_FORMAT = "Enable scan node of {0}"; internal const bool ITEM_SCAN_NODE_DEFAULT = true; internal const string ITEM_SCAN_NODE_DESCRIPTION = "Shows a scan node on the item when scanning"; internal const string BATTERIES_PRICE_KEY = "Batteries price"; internal const int BATTERIES_PRICE_DEFAULT = 50; internal const string BATTERIES_PRICE_DESCRIPTION = "Price for Batteries."; internal const string BATTERIES_WEIGHT_KEY = "Item weight"; internal const int BATTERIES_WEIGHT_DEFAULT = 5; internal const string BATTERIES_WEIGHT_DESCRIPTION = "Weight (in lbs)"; internal const string BATTERIES_TWO_HANDED_KEY = "Two Handed Item"; internal const bool BATTERIES_TWO_HANDED_DEFAULT = true; internal const string BATTERIES_TWO_HANDED_DESCRIPTION = "One or two handed item."; internal const string BATTERIES_CONDUCTIVE_KEY = "Conductive"; internal const bool BATTERIES_CONDUCTIVE_DEFAULT = true; internal const string BATTERIES_CONDUCTIVE_DESCRIPTION = "Wether it attracts lightning to the item or not. (Or other mechanics that rely on item being conductive)"; internal const string BATTERIES_DROP_AHEAD_PLAYER_KEY = "Drop ahead of player when dropping"; internal const bool BATTERIES_DROP_AHEAD_PLAYER_DEFAULT = false; internal const string BATTERIES_DROP_AHEAD_PLAYER_DESCRIPTION = "If on, the item will drop infront of the player. Otherwise, drops underneath them and slightly infront."; internal const string BATTERIES_GRABBED_BEFORE_START_KEY = "Grabbable before game start"; internal const bool BATTERIES_GRABBED_BEFORE_START_DEFAULT = false; internal const string BATTERIES_GRABBED_BEFORE_START_DESCRIPTION = "Allows wether the item can be grabbed before hand or not"; internal const string BATTERIES_HIGHEST_SALE_PERCENTAGE_KEY = "Highest Sale Percentage"; internal const int BATTERIES_HIGHEST_SALE_PERCENTAGE_DEFAULT = 50; internal const string BATTERIES_HIGHEST_SALE_PERCENTAGE_DESCRIPTION = "Maximum percentage of sale allowed when this item is selected for a sale."; internal const string BATTERIES_RARITY_KEY = "Scrap Rarity"; internal const int BATTERIES_RARITY_DEFAULT = 100; internal const string BATTERIES_RARITY_DESCRIPTION = "Spawn Weight of the item spawning as a scrap"; internal const string BATTERIES_MINIMUM_SCRAP_VALUE_KEY = "Minimum Scrap Value"; internal const int BATTERIES_MINIMUM_SCRAP_VALUE_DEFAULT = 25; internal const string BATTERIES_MINIMUM_SCRAP_VALUE_DESCRIPTION = "Minimum value that the scrap version can have. (Before the scrap multipler (0.4))"; internal const string BATTERIES_MAXIMUM_SCRAP_VALUE_KEY = "Maximum Scrap Value"; internal const int BATTERIES_MAXIMUM_SCRAP_VALUE_DEFAULT = 35; internal const string BATTERIES_MAXIMUM_SCRAP_VALUE_DESCRIPTION = "Maximum value that the scrap version can have. (Before the scrap multipler (0.4))"; internal const string BATTERIES_USAGES_KEY = "Recharge Usages"; internal const int BATTERIES_USAGES_DEFAULT = 1; internal const string BATTERIES_USAGES_DESCRIPTION = "Amount of times the item can be used to recharge items"; internal const string BATTERIES_RECHARGE_PERCENTAGE_KEY = "Recharge Percentage"; internal const int BATTERIES_RECHARGE_PERCENTAGE_DEFAULT = 100; internal const string BATTERIES_RECHARGE_PERCENTAGE_DESCRIPTION = "Amount (%) of recharge it provides to the item when used"; internal const string BATTERIES_OVERCHARGE_KEY = "Overcharge Battery Life"; internal const bool BATTERIES_OVERCHARGE_DEFAULT = false; internal const string BATTERIES_OVERCHARGE_DESCRIPTION = "Wether the battery life of the recharged item can exceed 100%"; internal const string BATTERIES_DESTROY_KEY = "Destroy Item when Exausted"; internal const bool BATTERIES_DESTROY_DEFAULT = true; internal const string BATTERIES_DESTROY_DESCRIPTION = "When you can no longer recharge items with the battery, the battery gets cleared from your inventory"; internal static readonly string BATTERIES_SCAN_NODE_KEY = string.Format("Enable scan node of {0}", "Batteries"); } } namespace Batteries.Misc { [DataContract] public class PluginConfig : SyncedConfig2<PluginConfig> { [field: SyncedEntryField] public SyncedEntry<bool> SCAN_NODE { get; set; } [field: SyncedEntryField] public SyncedEntry<int> PRICE { get; set; } [field: SyncedEntryField] public SyncedEntry<int> WEIGHT { get; set; } [field: SyncedEntryField] public SyncedEntry<bool> DROP_AHEAD_PLAYER { get; set; } [field: SyncedEntryField] public SyncedEntry<bool> GRABBED_BEFORE_START { get; set; } [field: SyncedEntryField] public SyncedEntry<bool> CONDUCTIVE { get; set; } [field: SyncedEntryField] public SyncedEntry<int> HIGHEST_SALE_PERCENTAGE { get; set; } [field: SyncedEntryField] public SyncedEntry<int> RARITY { get; set; } [field: SyncedEntryField] public SyncedEntry<int> MINIMUM_SCRAP_VALUE { get; set; } [field: SyncedEntryField] public SyncedEntry<int> MAXIMUM_SCRAP_VALUE { get; set; } [field: SyncedEntryField] public SyncedEntry<int> USAGES { get; set; } [field: SyncedEntryField] public SyncedEntry<int> RECHARGE_PERCENTAGE { get; set; } [field: SyncedEntryField] public SyncedEntry<bool> OVERCHARGE { get; set; } [field: SyncedEntryField] public SyncedEntry<bool> DESTROY { get; set; } public PluginConfig(ConfigFile cfg) : base("com.github.WhiteSpike.Batteries") { string text = "Batteries"; PRICE = SyncedBindingExtensions.BindSyncedEntry<int>(cfg, text, "Batteries price", 50, "Price for Batteries."); WEIGHT = SyncedBindingExtensions.BindSyncedEntry<int>(cfg, text, "Item weight", 5, "Weight (in lbs)"); SCAN_NODE = SyncedBindingExtensions.BindSyncedEntry<bool>(cfg, text, Constants.BATTERIES_SCAN_NODE_KEY, true, "Shows a scan node on the item when scanning"); DROP_AHEAD_PLAYER = SyncedBindingExtensions.BindSyncedEntry<bool>(cfg, text, "Drop ahead of player when dropping", false, "If on, the item will drop infront of the player. Otherwise, drops underneath them and slightly infront."); CONDUCTIVE = SyncedBindingExtensions.BindSyncedEntry<bool>(cfg, text, "Conductive", true, "Wether it attracts lightning to the item or not. (Or other mechanics that rely on item being conductive)"); GRABBED_BEFORE_START = SyncedBindingExtensions.BindSyncedEntry<bool>(cfg, text, "Grabbable before game start", false, "Allows wether the item can be grabbed before hand or not"); HIGHEST_SALE_PERCENTAGE = SyncedBindingExtensions.BindSyncedEntry<int>(cfg, text, "Highest Sale Percentage", 50, "Maximum percentage of sale allowed when this item is selected for a sale."); RARITY = SyncedBindingExtensions.BindSyncedEntry<int>(cfg, text, "Scrap Rarity", 100, "Spawn Weight of the item spawning as a scrap"); MINIMUM_SCRAP_VALUE = SyncedBindingExtensions.BindSyncedEntry<int>(cfg, text, "Minimum Scrap Value", 25, "Minimum value that the scrap version can have. (Before the scrap multipler (0.4))"); MAXIMUM_SCRAP_VALUE = SyncedBindingExtensions.BindSyncedEntry<int>(cfg, text, "Maximum Scrap Value", 35, "Maximum value that the scrap version can have. (Before the scrap multipler (0.4))"); USAGES = SyncedBindingExtensions.BindSyncedEntry<int>(cfg, text, "Recharge Usages", 1, "Amount of times the item can be used to recharge items"); RECHARGE_PERCENTAGE = SyncedBindingExtensions.BindSyncedEntry<int>(cfg, text, "Recharge Percentage", 100, "Amount (%) of recharge it provides to the item when used"); OVERCHARGE = SyncedBindingExtensions.BindSyncedEntry<bool>(cfg, text, "Overcharge Battery Life", false, "Wether the battery life of the recharged item can exceed 100%"); DESTROY = SyncedBindingExtensions.BindSyncedEntry<bool>(cfg, text, "Destroy Item when Exausted", true, "When you can no longer recharge items with the battery, the battery gets cleared from your inventory"); ConfigManager.Register<PluginConfig>((SyncedConfig2<PluginConfig>)this); } } internal static class Metadata { public const string GUID = "com.github.WhiteSpike.Batteries"; public const string NAME = "Batteries"; public const string VERSION = "1.0.0"; } } namespace Batteries.Behaviour { internal class BatteriesBehaviour : ReplenishBatteryBehaviour { internal const string ITEM_NAME = "Batteries"; private RaycastHit hit; protected bool KeepScanNode => SyncedEntry<bool>.op_Implicit(Plugin.Config.SCAN_NODE); public override void Start() { ((GrabbableObject)this).Start(); if (((GrabbableObject)this).itemProperties.isScrap) { ((Component)this).gameObject.GetComponentInChildren<ScanNodeProperties>().nodeType = 2; } if (!KeepScanNode) { Object.Destroy((Object)(object)((Component)this).gameObject.GetComponentInChildren<ScanNodeProperties>()); } base.rechargeUsages = SyncedEntry<int>.op_Implicit(Plugin.Config.USAGES); base.rechargePercentage = (float)SyncedEntry<int>.op_Implicit(Plugin.Config.RECHARGE_PERCENTAGE) / 100f; base.canOvercharge = SyncedEntry<bool>.op_Implicit(Plugin.Config.OVERCHARGE); base.destroyUponOutOfUsages = SyncedEntry<bool>.op_Implicit(Plugin.Config.DESTROY); } protected override bool CanRechargeItem(GrabbableObject grabbableObject) { return grabbableObject.itemProperties.requiresBattery && grabbableObject.insertedBattery.charge + base.rechargePercentage <= (base.canOvercharge ? float.MaxValue : 1f); } protected override bool CanRechargeItems() { return base.rechargeUsages > 0f; } protected override GrabbableObject GrabItemToRecharge() { //IL_0022: Unknown result type (might be due to invalid IL or missing references) float grabDistance = ((GrabbableObject)this).playerHeldBy.grabDistance; if (LategameCompatibility.Enabled) { grabDistance = LategameCompatibility.GetGrabDistance(); } if (!Physics.Raycast(((GrabbableObject)this).playerHeldBy.interactRay, ref hit, grabDistance, ((GrabbableObject)this).playerHeldBy.interactableObjectsMask) || ((Component)((RaycastHit)(ref hit)).collider).gameObject.layer == 8 || ((Component)((RaycastHit)(ref hit)).collider).gameObject.layer == 30) { return null; } return ((Component)((Component)((RaycastHit)(ref hit)).collider).transform).gameObject.GetComponent<GrabbableObject>(); } protected override void __initializeVariables() { ((ReplenishBatteryBehaviour)this).__initializeVariables(); } protected internal override string __getTypeName() { return "BatteriesBehaviour"; } } } namespace System.Runtime.CompilerServices { [AttributeUsage(AttributeTargets.Assembly, AllowMultiple = true)] internal sealed class IgnoresAccessChecksToAttribute : Attribute { public IgnoresAccessChecksToAttribute(string assemblyName) { } } } namespace Batteries.NetcodePatcher { [AttributeUsage(AttributeTargets.Module)] internal class NetcodePatchedAssemblyAttribute : Attribute { } }
ChargeableJailbird.dll
Decompiled a year agousing System; using System.Collections; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Linq; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using System.Security; using System.Security.Permissions; using BepInEx; using BepInEx.Logging; using ChargeableJailbird.Behaviours; using ChargeableJailbird.NetcodePatcher; using GameNetcodeStuff; using LethalLib.Modules; using Microsoft.CodeAnalysis; using Unity.Netcode; using UnityEngine; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)] [assembly: IgnoresAccessChecksTo("Assembly-CSharp")] [assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")] [assembly: AssemblyCompany("ChargeableJailbird")] [assembly: AssemblyConfiguration("Debug")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyInformationalVersion("1.0.0+8674ec67b29b04305150a5c7ddd419e611ff36b0")] [assembly: AssemblyProduct("a Recharge-able jailbird for lethal company")] [assembly: AssemblyTitle("ChargeableJailbird")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("1.0.0.0")] [module: UnverifiableCode] [module: RefSafetyRules(11)] [module: NetcodePatchedAssembly] internal class <Module> { static <Module>() { } } 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 ChargeableJailbird { public static class MyPluginInfo { public const string PLUGIN_GUID = "com.elmish.lethalcompany.chargeablejailbird"; public const string PLUGIN_NAME = "ChargeableJailbird"; public const string PLUGIN_VERSION = "1.0.0"; } [BepInPlugin("com.elmish.lethalcompany.chargeablejailbird", "ChargeableJailbird", "1.0.0")] public class Plugin : BaseUnityPlugin { internal static ManualLogSource Logger; private static Item jailbirditemprops; private void Awake() { Logger = ((BaseUnityPlugin)this).Logger; Logger.LogInfo((object)"Plugin com.elmish.lethalcompany.chargeablejailbird is loaded!"); LoadAssetBundle(); Patch(); } private void Patch() { Type[] types = Assembly.GetExecutingAssembly().GetTypes(); Type[] array = types; foreach (Type type in array) { MethodInfo[] methods = type.GetMethods(BindingFlags.Instance | BindingFlags.Static | BindingFlags.NonPublic); MethodInfo[] array2 = methods; foreach (MethodInfo methodInfo in array2) { object[] customAttributes = methodInfo.GetCustomAttributes(typeof(RuntimeInitializeOnLoadMethodAttribute), inherit: false); if (customAttributes.Length != 0) { methodInfo.Invoke(null, null); } } } } private void LoadAssetBundle() { using (Stream stream = Assembly.GetExecutingAssembly().GetManifestResourceStream("ChargeableJailbird.Resources.jailbirdassets")) { AssetBundle val = AssetBundle.LoadFromStream(stream); if ((Object)(object)val == (Object)null) { Logger.LogError((object)"JAILBIRD BUNDLE IS NULL"); return; } jailbirditemprops = val.LoadAsset<Item>("JailbirdItemProps"); if ((Object)(object)jailbirditemprops == (Object)null) { Logger.LogError((object)"JAILBIRD ITEM IS NULL"); return; } ChargeableJailbird.Behaviours.ChargeableJailbird chargeableJailbird = jailbirditemprops.spawnPrefab.AddComponent<ChargeableJailbird.Behaviours.ChargeableJailbird>(); ((GrabbableObject)chargeableJailbird).itemProperties = jailbirditemprops; ((GrabbableObject)chargeableJailbird).grabbable = true; chargeableJailbird.reelUpSFX = val.LoadAsset<AudioClip>("ShovelReelUp"); chargeableJailbird.swingSFX[0] = val.LoadAsset<AudioClip>("Jailbirdswing1"); chargeableJailbird.swingSFX[1] = val.LoadAsset<AudioClip>("ShovelSwing"); chargeableJailbird.hitSFX = (AudioClip[])(object)new AudioClip[1]; chargeableJailbird.hitSFX[0] = val.LoadAsset<AudioClip>("Normal_Hit"); chargeableJailbird.jailbirdAudio = ((Component)jailbirditemprops.spawnPrefab.transform).GetComponent<AudioSource>(); chargeableJailbird.jailbirdAudio.spatialize = true; } Utilities.FixMixerGroups(jailbirditemprops.spawnPrefab); TerminalNode val2 = ScriptableObject.CreateInstance<TerminalNode>(); val2.clearPreviousText = true; val2.displayText = "???"; Items.RegisterShopItem(jailbirditemprops, (TerminalNode)null, (TerminalNode)null, val2, 300); NetworkPrefabs.RegisterNetworkPrefab(jailbirditemprops.spawnPrefab); Logger.LogInfo((object)"successfully set-up item"); } } } namespace ChargeableJailbird.Behaviours { public class ChargeableJailbird : GrabbableObject { public int shovelHitForce = 3; public bool reelingUp; public bool isHoldingButton; private RaycastHit rayHit; private Coroutine reelingUpCoroutine; private RaycastHit[] objectsHitByShovel; private List<RaycastHit> objectsHitByShovelList = new List<RaycastHit>(); public AudioClip reelUpSFX; public AudioClip[] swingSFX = (AudioClip[])(object)new AudioClip[2]; public AudioClip[] hitSFX; public AudioSource jailbirdAudio; private PlayerControllerB previousPlayerHeldBy; private int shovelMask = 1084754248; private GameObject blueGlow; public override void Start() { ((GrabbableObject)this).Start(); blueGlow = ((Component)((Component)this).transform.Find("jailbird/Mesh_Jailbird/blue_glow")).gameObject; base.insertedBattery.charge = 1f; Plugin.Logger.LogMessage((object)"new jailbird created"); } public override void GrabItem() { ((GrabbableObject)this).GrabItem(); if ((double)base.insertedBattery.charge == 0.5) { base.insertedBattery.charge = 0.001f; } } public override void ItemActivate(bool used, bool buttonDown = true) { if ((Object)(object)base.playerHeldBy == (Object)null) { return; } isHoldingButton = buttonDown; if (!reelingUp && buttonDown) { reelingUp = true; previousPlayerHeldBy = base.playerHeldBy; if (reelingUpCoroutine != null) { ((MonoBehaviour)this).StopCoroutine(reelingUpCoroutine); } reelingUpCoroutine = ((MonoBehaviour)this).StartCoroutine(reelUpShovel()); } } private IEnumerator reelUpShovel() { base.playerHeldBy.activatingItem = true; base.playerHeldBy.twoHanded = true; base.playerHeldBy.playerBodyAnimator.ResetTrigger("shovelHit"); base.playerHeldBy.playerBodyAnimator.SetBool("reelingUp", true); jailbirdAudio.PlayOneShot(reelUpSFX); ReelUpSFXServerRpc(); yield return (object)new WaitForSeconds(0.35f); yield return (object)new WaitUntil((Func<bool>)(() => !isHoldingButton || !base.isHeld)); SwingSFXServerRpc(); yield return (object)new WaitForSeconds((shovelHitForce == 3) ? 0.15f : 0f); SwingShovel(!base.isHeld); yield return (object)new WaitForSeconds(0.13f); yield return (object)new WaitForEndOfFrame(); HitShovel(!base.isHeld); yield return (object)new WaitForSeconds(0.3f); reelingUp = false; reelingUpCoroutine = null; } public override void DiscardItem() { if ((Object)(object)base.playerHeldBy != (Object)null) { base.playerHeldBy.activatingItem = false; } if (base.insertedBattery.charge < 0.5f) { base.insertedBattery.charge = 0.5f; } ((GrabbableObject)this).DiscardItem(); } public void SwingShovel(bool cancel = false) { //IL_0033: Unknown result type (might be due to invalid IL or missing references) previousPlayerHeldBy.playerBodyAnimator.SetBool("reelingUp", false); if (!cancel) { previousPlayerHeldBy.UpdateSpecialAnimationValue(true, (short)((Component)previousPlayerHeldBy).transform.localEulerAngles.y, 0.4f, false); } } public void HitShovel(bool cancel = false) { //IL_0063: Unknown result type (might be due to invalid IL or missing references) //IL_0078: Unknown result type (might be due to invalid IL or missing references) //IL_0082: Unknown result type (might be due to invalid IL or missing references) //IL_0087: Unknown result type (might be due to invalid IL or missing references) //IL_00a1: Unknown result type (might be due to invalid IL or missing references) //IL_045b: Unknown result type (might be due to invalid IL or missing references) //IL_0109: Unknown result type (might be due to invalid IL or missing references) //IL_010e: Unknown result type (might be due to invalid IL or missing references) //IL_012c: Unknown result type (might be due to invalid IL or missing references) //IL_0131: Unknown result type (might be due to invalid IL or missing references) //IL_01f7: Unknown result type (might be due to invalid IL or missing references) //IL_01fc: Unknown result type (might be due to invalid IL or missing references) //IL_015d: Unknown result type (might be due to invalid IL or missing references) //IL_0162: Unknown result type (might be due to invalid IL or missing references) //IL_0219: Unknown result type (might be due to invalid IL or missing references) //IL_021e: Unknown result type (might be due to invalid IL or missing references) //IL_0186: Unknown result type (might be due to invalid IL or missing references) //IL_018b: Unknown result type (might be due to invalid IL or missing references) //IL_0241: Unknown result type (might be due to invalid IL or missing references) //IL_0246: Unknown result type (might be due to invalid IL or missing references) //IL_024a: Unknown result type (might be due to invalid IL or missing references) //IL_024f: Unknown result type (might be due to invalid IL or missing references) //IL_02bc: Unknown result type (might be due to invalid IL or missing references) //IL_02c1: Unknown result type (might be due to invalid IL or missing references) //IL_026b: Unknown result type (might be due to invalid IL or missing references) //IL_0278: Unknown result type (might be due to invalid IL or missing references) //IL_027d: Unknown result type (might be due to invalid IL or missing references) //IL_0281: Unknown result type (might be due to invalid IL or missing references) //IL_02cc: Unknown result type (might be due to invalid IL or missing references) //IL_02d1: Unknown result type (might be due to invalid IL or missing references) //IL_0329: Unknown result type (might be due to invalid IL or missing references) //IL_032e: Unknown result type (might be due to invalid IL or missing references) //IL_0368: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)previousPlayerHeldBy == (Object)null) { Debug.LogError((object)"Previousplayerheldby is null on this client when HitShovel is called."); return; } previousPlayerHeldBy.activatingItem = false; bool flag = false; bool flag2 = false; bool flag3 = false; int num = -1; if (!cancel) { previousPlayerHeldBy.twoHanded = false; objectsHitByShovel = Physics.SphereCastAll(((Component)previousPlayerHeldBy.gameplayCamera).transform.position + ((Component)previousPlayerHeldBy.gameplayCamera).transform.right * -0.35f, 0.8f, ((Component)previousPlayerHeldBy.gameplayCamera).transform.forward, 1.5f, shovelMask, (QueryTriggerInteraction)2); objectsHitByShovelList = objectsHitByShovel.OrderBy((RaycastHit x) => ((RaycastHit)(ref x)).distance).ToList(); List<EnemyAI> list = new List<EnemyAI>(); IHittable val2 = default(IHittable); for (int i = 0; i < objectsHitByShovelList.Count; i++) { RaycastHit val = objectsHitByShovelList[i]; if (((Component)((RaycastHit)(ref val)).transform).gameObject.layer != 8) { val = objectsHitByShovelList[i]; if (((Component)((RaycastHit)(ref val)).transform).gameObject.layer != 11) { val = objectsHitByShovelList[i]; if (!((Component)((RaycastHit)(ref val)).transform).TryGetComponent<IHittable>(ref val2)) { continue; } val = objectsHitByShovelList[i]; if ((Object)(object)((RaycastHit)(ref val)).transform == (Object)(object)((Component)previousPlayerHeldBy).transform) { continue; } val = objectsHitByShovelList[i]; if (!(((RaycastHit)(ref val)).point == Vector3.zero)) { Vector3 position = ((Component)previousPlayerHeldBy.gameplayCamera).transform.position; RaycastHit val3 = objectsHitByShovelList[i]; if (Physics.Linecast(position, ((RaycastHit)(ref val3)).point, ref val, StartOfRound.Instance.collidersAndRoomMaskAndDefault, (QueryTriggerInteraction)1)) { continue; } } flag = true; Vector3 forward = ((Component)previousPlayerHeldBy.gameplayCamera).transform.forward; try { val = objectsHitByShovelList[i]; EnemyAICollisionDetect component = ((Component)((RaycastHit)(ref val)).transform).GetComponent<EnemyAICollisionDetect>(); if ((Object)(object)component != (Object)null) { if (!((Object)(object)component.mainScript == (Object)null) && !list.Contains(component.mainScript)) { goto IL_035f; } continue; } val = objectsHitByShovelList[i]; if (!((Object)(object)((Component)((RaycastHit)(ref val)).transform).GetComponent<PlayerControllerB>() != (Object)null)) { goto IL_035f; } if (!flag3) { flag3 = true; goto IL_035f; } goto end_IL_02c3; IL_035f: bool flag4 = val2.Hit(shovelHitForce, forward, previousPlayerHeldBy, true, 1); if (flag4 && (Object)(object)component != (Object)null) { list.Add(component.mainScript); if (shovelHitForce == 3) { StunEnemiesServerRpc(((NetworkBehaviour)component.mainScript).NetworkObjectId); } HitEnemyWithShovelServerRpc(); } if (!flag2) { flag2 = flag4; } end_IL_02c3:; } catch (Exception arg) { Debug.Log((object)$"Exception caught when hitting object with shovel from player #{previousPlayerHeldBy.playerClientId}: {arg}"); } continue; } } val = objectsHitByShovelList[i]; if (((RaycastHit)(ref val)).collider.isTrigger) { continue; } flag = true; val = objectsHitByShovelList[i]; string tag = ((Component)((RaycastHit)(ref val)).collider).gameObject.tag; for (int j = 0; j < StartOfRound.Instance.footstepSurfaces.Length; j++) { if (StartOfRound.Instance.footstepSurfaces[j].surfaceTag == tag) { num = j; break; } } } } if (flag) { RoundManager.PlayRandomClip(jailbirdAudio, hitSFX, true, 1f, 0, 1000); Object.FindObjectOfType<RoundManager>().PlayAudibleNoise(((Component)this).transform.position, 17f, 0.8f, 0, false, 0); if (!flag2 && num != -1) { jailbirdAudio.PlayOneShot(StartOfRound.Instance.footstepSurfaces[num].hitSurfaceSFX); WalkieTalkie.TransmitOneShotAudio(jailbirdAudio, StartOfRound.Instance.footstepSurfaces[num].hitSurfaceSFX, 1f); } base.playerHeldBy.playerBodyAnimator.SetTrigger("shovelHit"); HitShovelServerRpc(num); } } private void HitSurfaceWithShovel(int hitSurfaceID) { try { jailbirdAudio.PlayOneShot(StartOfRound.Instance.footstepSurfaces[hitSurfaceID].hitSurfaceSFX); WalkieTalkie.TransmitOneShotAudio(jailbirdAudio, StartOfRound.Instance.footstepSurfaces[hitSurfaceID].hitSurfaceSFX, 1f); } catch (Exception ex) { Plugin.Logger.LogError((object)ex); } } public void OnJailbirdHit() { if (shovelHitForce == 3) { base.insertedBattery.charge = 0.001f; shovelHitForce = 1; blueGlow.SetActive(false); } } public override void ChargeBatteries() { ((GrabbableObject)this).ChargeBatteries(); if (base.insertedBattery.charge == 1f) { shovelHitForce = 3; blueGlow.SetActive(true); } } public void TryStunEnemy(ulong enemyID) { RoundManager.Instance.RefreshEnemiesList(); foreach (EnemyAI spawnedEnemy in RoundManager.Instance.SpawnedEnemies) { if (((NetworkBehaviour)spawnedEnemy).NetworkObjectId == enemyID) { Plugin.Logger.LogMessage((object)$"found enemy with id {enemyID}"); spawnedEnemy.SetEnemyStunned(true, 4.5f, (PlayerControllerB)null); return; } } Plugin.Logger.LogError((object)$"could not find enemy with id {enemyID}"); } [ServerRpc] public void HitEnemyWithShovelServerRpc() { //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_002e: Invalid comparison between Unknown and I4 //IL_00d2: Unknown result type (might be due to invalid IL or missing references) //IL_00dc: Invalid comparison between Unknown and I4 //IL_00a5: Unknown result type (might be due to invalid IL or missing references) //IL_00ae: Unknown result type (might be due to invalid IL or missing references) //IL_00b3: Unknown result type (might be due to invalid IL or missing references) //IL_00c2: Unknown result type (might be due to invalid IL or missing references) //IL_007a: Unknown result type (might be due to invalid IL or missing references) //IL_0084: Invalid comparison between Unknown and I4 NetworkManager networkManager = ((NetworkBehaviour)this).NetworkManager; if (networkManager == null || !networkManager.IsListening) { return; } if ((int)((NetworkBehaviour)this).__rpc_exec_stage != 1 && (networkManager.IsClient || networkManager.IsHost)) { if (((NetworkBehaviour)this).OwnerClientId != networkManager.LocalClientId) { if ((int)networkManager.LogLevel <= 1) { Debug.LogError((object)"Only the owner can invoke a ServerRpc that requires ownership!"); } return; } ServerRpcParams val = default(ServerRpcParams); FastBufferWriter val2 = ((NetworkBehaviour)this).__beginSendServerRpc(4051162151u, val, (RpcDelivery)0); ((NetworkBehaviour)this).__endSendServerRpc(ref val2, 4051162151u, val, (RpcDelivery)0); } if ((int)((NetworkBehaviour)this).__rpc_exec_stage == 1 && (networkManager.IsServer || networkManager.IsHost)) { HitEnemyWithShovelClientRpc(); } } [ClientRpc] public void HitEnemyWithShovelClientRpc() { //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_002e: Invalid comparison between Unknown and I4 //IL_008c: Unknown result type (might be due to invalid IL or missing references) //IL_0096: Invalid comparison between Unknown and I4 //IL_005f: Unknown result type (might be due to invalid IL or missing references) //IL_0068: 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_007c: Unknown result type (might be due to invalid IL or missing references) NetworkManager networkManager = ((NetworkBehaviour)this).NetworkManager; if (networkManager != null && networkManager.IsListening) { if ((int)((NetworkBehaviour)this).__rpc_exec_stage != 2 && (networkManager.IsServer || networkManager.IsHost)) { ClientRpcParams val = default(ClientRpcParams); FastBufferWriter val2 = ((NetworkBehaviour)this).__beginSendClientRpc(749202693u, val, (RpcDelivery)0); ((NetworkBehaviour)this).__endSendClientRpc(ref val2, 749202693u, val, (RpcDelivery)0); } if ((int)((NetworkBehaviour)this).__rpc_exec_stage == 2 && (networkManager.IsClient || networkManager.IsHost)) { OnJailbirdHit(); } } } [ServerRpc] public void HitShovelServerRpc(int hitSurfaceID) { //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_002e: Invalid comparison between Unknown and I4 //IL_00df: Unknown result type (might be due to invalid IL or missing references) //IL_00e9: Invalid comparison between Unknown and I4 //IL_00a5: Unknown result type (might be due to invalid IL or missing references) //IL_00ae: Unknown result type (might be due to invalid IL or missing references) //IL_00b3: Unknown result type (might be due to invalid IL or missing references) //IL_00b7: Unknown result type (might be due to invalid IL or missing references) //IL_00cf: Unknown result type (might be due to invalid IL or missing references) //IL_007a: Unknown result type (might be due to invalid IL or missing references) //IL_0084: Invalid comparison between Unknown and I4 NetworkManager networkManager = ((NetworkBehaviour)this).NetworkManager; if (networkManager == null || !networkManager.IsListening) { return; } if ((int)((NetworkBehaviour)this).__rpc_exec_stage != 1 && (networkManager.IsClient || networkManager.IsHost)) { if (((NetworkBehaviour)this).OwnerClientId != networkManager.LocalClientId) { if ((int)networkManager.LogLevel <= 1) { Debug.LogError((object)"Only the owner can invoke a ServerRpc that requires ownership!"); } return; } ServerRpcParams val = default(ServerRpcParams); FastBufferWriter val2 = ((NetworkBehaviour)this).__beginSendServerRpc(3129188199u, val, (RpcDelivery)0); BytePacker.WriteValueBitPacked(val2, hitSurfaceID); ((NetworkBehaviour)this).__endSendServerRpc(ref val2, 3129188199u, val, (RpcDelivery)0); } if ((int)((NetworkBehaviour)this).__rpc_exec_stage == 1 && (networkManager.IsServer || networkManager.IsHost)) { HitShovelClientRpc(hitSurfaceID); } } [ClientRpc] public void HitShovelClientRpc(int hitSurfaceID) { //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_002e: Invalid comparison between Unknown and I4 //IL_0099: Unknown result type (might be due to invalid IL or missing references) //IL_00a3: Invalid comparison between Unknown and I4 //IL_005f: Unknown result type (might be due to invalid IL or missing references) //IL_0068: 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_0071: 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) NetworkManager networkManager = ((NetworkBehaviour)this).NetworkManager; if (networkManager != null && networkManager.IsListening) { if ((int)((NetworkBehaviour)this).__rpc_exec_stage != 2 && (networkManager.IsServer || networkManager.IsHost)) { ClientRpcParams val = default(ClientRpcParams); FastBufferWriter val2 = ((NetworkBehaviour)this).__beginSendClientRpc(9340190u, val, (RpcDelivery)0); BytePacker.WriteValueBitPacked(val2, hitSurfaceID); ((NetworkBehaviour)this).__endSendClientRpc(ref val2, 9340190u, val, (RpcDelivery)0); } if ((int)((NetworkBehaviour)this).__rpc_exec_stage == 2 && (networkManager.IsClient || networkManager.IsHost)) { HitSurfaceWithShovel(hitSurfaceID); } } } [ServerRpc] public void ReelUpSFXServerRpc() { //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_002e: Invalid comparison between Unknown and I4 //IL_00d2: Unknown result type (might be due to invalid IL or missing references) //IL_00dc: Invalid comparison between Unknown and I4 //IL_00a5: Unknown result type (might be due to invalid IL or missing references) //IL_00ae: Unknown result type (might be due to invalid IL or missing references) //IL_00b3: Unknown result type (might be due to invalid IL or missing references) //IL_00c2: Unknown result type (might be due to invalid IL or missing references) //IL_007a: Unknown result type (might be due to invalid IL or missing references) //IL_0084: Invalid comparison between Unknown and I4 NetworkManager networkManager = ((NetworkBehaviour)this).NetworkManager; if (networkManager == null || !networkManager.IsListening) { return; } if ((int)((NetworkBehaviour)this).__rpc_exec_stage != 1 && (networkManager.IsClient || networkManager.IsHost)) { if (((NetworkBehaviour)this).OwnerClientId != networkManager.LocalClientId) { if ((int)networkManager.LogLevel <= 1) { Debug.LogError((object)"Only the owner can invoke a ServerRpc that requires ownership!"); } return; } ServerRpcParams val = default(ServerRpcParams); FastBufferWriter val2 = ((NetworkBehaviour)this).__beginSendServerRpc(3945880777u, val, (RpcDelivery)0); ((NetworkBehaviour)this).__endSendServerRpc(ref val2, 3945880777u, val, (RpcDelivery)0); } if ((int)((NetworkBehaviour)this).__rpc_exec_stage == 1 && (networkManager.IsServer || networkManager.IsHost)) { ReelUpSFXClientRpc(); } } [ClientRpc] public void ReelUpSFXClientRpc() { //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_002e: Invalid comparison between Unknown and I4 //IL_008c: Unknown result type (might be due to invalid IL or missing references) //IL_0096: Invalid comparison between Unknown and I4 //IL_005f: Unknown result type (might be due to invalid IL or missing references) //IL_0068: 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_007c: Unknown result type (might be due to invalid IL or missing references) NetworkManager networkManager = ((NetworkBehaviour)this).NetworkManager; if (networkManager != null && networkManager.IsListening) { if ((int)((NetworkBehaviour)this).__rpc_exec_stage != 2 && (networkManager.IsServer || networkManager.IsHost)) { ClientRpcParams val = default(ClientRpcParams); FastBufferWriter val2 = ((NetworkBehaviour)this).__beginSendClientRpc(2997558882u, val, (RpcDelivery)0); ((NetworkBehaviour)this).__endSendClientRpc(ref val2, 2997558882u, val, (RpcDelivery)0); } if ((int)((NetworkBehaviour)this).__rpc_exec_stage == 2 && (networkManager.IsClient || networkManager.IsHost)) { jailbirdAudio.PlayOneShot(reelUpSFX); } } } [ServerRpc] public void SwingSFXServerRpc() { //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_002e: Invalid comparison between Unknown and I4 //IL_00d2: Unknown result type (might be due to invalid IL or missing references) //IL_00dc: Invalid comparison between Unknown and I4 //IL_00a5: Unknown result type (might be due to invalid IL or missing references) //IL_00ae: Unknown result type (might be due to invalid IL or missing references) //IL_00b3: Unknown result type (might be due to invalid IL or missing references) //IL_00c2: Unknown result type (might be due to invalid IL or missing references) //IL_007a: Unknown result type (might be due to invalid IL or missing references) //IL_0084: Invalid comparison between Unknown and I4 NetworkManager networkManager = ((NetworkBehaviour)this).NetworkManager; if (networkManager == null || !networkManager.IsListening) { return; } if ((int)((NetworkBehaviour)this).__rpc_exec_stage != 1 && (networkManager.IsClient || networkManager.IsHost)) { if (((NetworkBehaviour)this).OwnerClientId != networkManager.LocalClientId) { if ((int)networkManager.LogLevel <= 1) { Debug.LogError((object)"Only the owner can invoke a ServerRpc that requires ownership!"); } return; } ServerRpcParams val = default(ServerRpcParams); FastBufferWriter val2 = ((NetworkBehaviour)this).__beginSendServerRpc(907157750u, val, (RpcDelivery)0); ((NetworkBehaviour)this).__endSendServerRpc(ref val2, 907157750u, val, (RpcDelivery)0); } if ((int)((NetworkBehaviour)this).__rpc_exec_stage == 1 && (networkManager.IsServer || networkManager.IsHost)) { SwingSFXClientRpc(); } } [ClientRpc] public void SwingSFXClientRpc() { //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_002e: Invalid comparison between Unknown and I4 //IL_008c: Unknown result type (might be due to invalid IL or missing references) //IL_0096: Invalid comparison between Unknown and I4 //IL_005f: Unknown result type (might be due to invalid IL or missing references) //IL_0068: 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_007c: Unknown result type (might be due to invalid IL or missing references) NetworkManager networkManager = ((NetworkBehaviour)this).NetworkManager; if (networkManager != null && networkManager.IsListening) { if ((int)((NetworkBehaviour)this).__rpc_exec_stage != 2 && (networkManager.IsServer || networkManager.IsHost)) { ClientRpcParams val = default(ClientRpcParams); FastBufferWriter val2 = ((NetworkBehaviour)this).__beginSendClientRpc(3430652948u, val, (RpcDelivery)0); ((NetworkBehaviour)this).__endSendClientRpc(ref val2, 3430652948u, val, (RpcDelivery)0); } if ((int)((NetworkBehaviour)this).__rpc_exec_stage == 2 && (networkManager.IsClient || networkManager.IsHost)) { jailbirdAudio.PlayOneShot(swingSFX[(shovelHitForce != 3) ? 1u : 0u]); } } } [ServerRpc] public void StunEnemiesServerRpc(ulong enemyID) { //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_002e: Invalid comparison between Unknown and I4 //IL_00df: Unknown result type (might be due to invalid IL or missing references) //IL_00e9: Invalid comparison between Unknown and I4 //IL_00a5: Unknown result type (might be due to invalid IL or missing references) //IL_00ae: Unknown result type (might be due to invalid IL or missing references) //IL_00b3: Unknown result type (might be due to invalid IL or missing references) //IL_00b7: Unknown result type (might be due to invalid IL or missing references) //IL_00cf: Unknown result type (might be due to invalid IL or missing references) //IL_007a: Unknown result type (might be due to invalid IL or missing references) //IL_0084: Invalid comparison between Unknown and I4 NetworkManager networkManager = ((NetworkBehaviour)this).NetworkManager; if (networkManager == null || !networkManager.IsListening) { return; } if ((int)((NetworkBehaviour)this).__rpc_exec_stage != 1 && (networkManager.IsClient || networkManager.IsHost)) { if (((NetworkBehaviour)this).OwnerClientId != networkManager.LocalClientId) { if ((int)networkManager.LogLevel <= 1) { Debug.LogError((object)"Only the owner can invoke a ServerRpc that requires ownership!"); } return; } ServerRpcParams val = default(ServerRpcParams); FastBufferWriter val2 = ((NetworkBehaviour)this).__beginSendServerRpc(3625734691u, val, (RpcDelivery)0); BytePacker.WriteValueBitPacked(val2, enemyID); ((NetworkBehaviour)this).__endSendServerRpc(ref val2, 3625734691u, val, (RpcDelivery)0); } if ((int)((NetworkBehaviour)this).__rpc_exec_stage == 1 && (networkManager.IsServer || networkManager.IsHost)) { StunEnemiesClientRpc(enemyID); } } [ClientRpc] public void StunEnemiesClientRpc(ulong enemyID) { //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_002e: Invalid comparison between Unknown and I4 //IL_0099: Unknown result type (might be due to invalid IL or missing references) //IL_00a3: Invalid comparison between Unknown and I4 //IL_005f: Unknown result type (might be due to invalid IL or missing references) //IL_0068: 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_0071: 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) NetworkManager networkManager = ((NetworkBehaviour)this).NetworkManager; if (networkManager != null && networkManager.IsListening) { if ((int)((NetworkBehaviour)this).__rpc_exec_stage != 2 && (networkManager.IsServer || networkManager.IsHost)) { ClientRpcParams val = default(ClientRpcParams); FastBufferWriter val2 = ((NetworkBehaviour)this).__beginSendClientRpc(1610222793u, val, (RpcDelivery)0); BytePacker.WriteValueBitPacked(val2, enemyID); ((NetworkBehaviour)this).__endSendClientRpc(ref val2, 1610222793u, val, (RpcDelivery)0); } if ((int)((NetworkBehaviour)this).__rpc_exec_stage == 2 && (networkManager.IsClient || networkManager.IsHost)) { TryStunEnemy(enemyID); } } } protected override void __initializeVariables() { ((GrabbableObject)this).__initializeVariables(); } [RuntimeInitializeOnLoadMethod] internal static void InitializeRPCS_ChargeableJailbird() { //IL_0011: Unknown result type (might be due to invalid IL or missing references) //IL_001b: Expected O, but got Unknown //IL_002c: Unknown result type (might be due to invalid IL or missing references) //IL_0036: Expected O, but got Unknown //IL_0047: Unknown result type (might be due to invalid IL or missing references) //IL_0051: Expected O, but got Unknown //IL_0062: Unknown result type (might be due to invalid IL or missing references) //IL_006c: Expected O, but got Unknown //IL_007d: Unknown result type (might be due to invalid IL or missing references) //IL_0087: Expected O, but got Unknown //IL_0098: Unknown result type (might be due to invalid IL or missing references) //IL_00a2: Expected O, but got Unknown //IL_00b3: Unknown result type (might be due to invalid IL or missing references) //IL_00bd: Expected O, but got Unknown //IL_00ce: Unknown result type (might be due to invalid IL or missing references) //IL_00d8: Expected O, but got Unknown //IL_00e9: Unknown result type (might be due to invalid IL or missing references) //IL_00f3: Expected O, but got Unknown //IL_0104: Unknown result type (might be due to invalid IL or missing references) //IL_010e: Expected O, but got Unknown NetworkManager.__rpc_func_table.Add(4051162151u, new RpcReceiveHandler(__rpc_handler_4051162151)); NetworkManager.__rpc_func_table.Add(749202693u, new RpcReceiveHandler(__rpc_handler_749202693)); NetworkManager.__rpc_func_table.Add(3129188199u, new RpcReceiveHandler(__rpc_handler_3129188199)); NetworkManager.__rpc_func_table.Add(9340190u, new RpcReceiveHandler(__rpc_handler_9340190)); NetworkManager.__rpc_func_table.Add(3945880777u, new RpcReceiveHandler(__rpc_handler_3945880777)); NetworkManager.__rpc_func_table.Add(2997558882u, new RpcReceiveHandler(__rpc_handler_2997558882)); NetworkManager.__rpc_func_table.Add(907157750u, new RpcReceiveHandler(__rpc_handler_907157750)); NetworkManager.__rpc_func_table.Add(3430652948u, new RpcReceiveHandler(__rpc_handler_3430652948)); NetworkManager.__rpc_func_table.Add(3625734691u, new RpcReceiveHandler(__rpc_handler_3625734691)); NetworkManager.__rpc_func_table.Add(1610222793u, new RpcReceiveHandler(__rpc_handler_1610222793)); } private static void __rpc_handler_4051162151(NetworkBehaviour target, FastBufferReader reader, __RpcParams rpcParams) { //IL_0023: 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_0029: 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_008c: 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) //IL_0055: Invalid comparison between Unknown and I4 NetworkManager networkManager = target.NetworkManager; if (networkManager == null || !networkManager.IsListening) { return; } if (rpcParams.Server.Receive.SenderClientId != target.OwnerClientId) { if ((int)networkManager.LogLevel <= 1) { Debug.LogError((object)"Only the owner can invoke a ServerRpc that requires ownership!"); } } else { target.__rpc_exec_stage = (__RpcExecStage)1; ((ChargeableJailbird)(object)target).HitEnemyWithShovelServerRpc(); target.__rpc_exec_stage = (__RpcExecStage)0; } } private static void __rpc_handler_749202693(NetworkBehaviour target, FastBufferReader reader, __RpcParams rpcParams) { //IL_0029: Unknown result type (might be due to invalid IL or missing references) //IL_003f: Unknown result type (might be due to invalid IL or missing references) NetworkManager networkManager = target.NetworkManager; if (networkManager != null && networkManager.IsListening) { target.__rpc_exec_stage = (__RpcExecStage)2; ((ChargeableJailbird)(object)target).HitEnemyWithShovelClientRpc(); target.__rpc_exec_stage = (__RpcExecStage)0; } } private static void __rpc_handler_3129188199(NetworkBehaviour target, FastBufferReader reader, __RpcParams rpcParams) { //IL_0023: 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_0029: Unknown result type (might be due to invalid IL or missing references) //IL_0070: Unknown result type (might be due to invalid IL or missing references) //IL_0083: Unknown result type (might be due to invalid IL or missing references) //IL_009d: 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) //IL_0055: Invalid comparison between Unknown and I4 NetworkManager networkManager = target.NetworkManager; if (networkManager == null || !networkManager.IsListening) { return; } if (rpcParams.Server.Receive.SenderClientId != target.OwnerClientId) { if ((int)networkManager.LogLevel <= 1) { Debug.LogError((object)"Only the owner can invoke a ServerRpc that requires ownership!"); } } else { int hitSurfaceID = default(int); ByteUnpacker.ReadValueBitPacked(reader, ref hitSurfaceID); target.__rpc_exec_stage = (__RpcExecStage)1; ((ChargeableJailbird)(object)target).HitShovelServerRpc(hitSurfaceID); target.__rpc_exec_stage = (__RpcExecStage)0; } } private static void __rpc_handler_9340190(NetworkBehaviour target, FastBufferReader reader, __RpcParams rpcParams) { //IL_0023: Unknown result type (might be due to invalid IL or missing references) //IL_0036: 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) NetworkManager networkManager = target.NetworkManager; if (networkManager != null && networkManager.IsListening) { int hitSurfaceID = default(int); ByteUnpacker.ReadValueBitPacked(reader, ref hitSurfaceID); target.__rpc_exec_stage = (__RpcExecStage)2; ((ChargeableJailbird)(object)target).HitShovelClientRpc(hitSurfaceID); target.__rpc_exec_stage = (__RpcExecStage)0; } } private static void __rpc_handler_3945880777(NetworkBehaviour target, FastBufferReader reader, __RpcParams rpcParams) { //IL_0023: 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_0029: 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_008c: 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) //IL_0055: Invalid comparison between Unknown and I4 NetworkManager networkManager = target.NetworkManager; if (networkManager == null || !networkManager.IsListening) { return; } if (rpcParams.Server.Receive.SenderClientId != target.OwnerClientId) { if ((int)networkManager.LogLevel <= 1) { Debug.LogError((object)"Only the owner can invoke a ServerRpc that requires ownership!"); } } else { target.__rpc_exec_stage = (__RpcExecStage)1; ((ChargeableJailbird)(object)target).ReelUpSFXServerRpc(); target.__rpc_exec_stage = (__RpcExecStage)0; } } private static void __rpc_handler_2997558882(NetworkBehaviour target, FastBufferReader reader, __RpcParams rpcParams) { //IL_0029: Unknown result type (might be due to invalid IL or missing references) //IL_003f: Unknown result type (might be due to invalid IL or missing references) NetworkManager networkManager = target.NetworkManager; if (networkManager != null && networkManager.IsListening) { target.__rpc_exec_stage = (__RpcExecStage)2; ((ChargeableJailbird)(object)target).ReelUpSFXClientRpc(); target.__rpc_exec_stage = (__RpcExecStage)0; } } private static void __rpc_handler_907157750(NetworkBehaviour target, FastBufferReader reader, __RpcParams rpcParams) { //IL_0023: 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_0029: 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_008c: 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) //IL_0055: Invalid comparison between Unknown and I4 NetworkManager networkManager = target.NetworkManager; if (networkManager == null || !networkManager.IsListening) { return; } if (rpcParams.Server.Receive.SenderClientId != target.OwnerClientId) { if ((int)networkManager.LogLevel <= 1) { Debug.LogError((object)"Only the owner can invoke a ServerRpc that requires ownership!"); } } else { target.__rpc_exec_stage = (__RpcExecStage)1; ((ChargeableJailbird)(object)target).SwingSFXServerRpc(); target.__rpc_exec_stage = (__RpcExecStage)0; } } private static void __rpc_handler_3430652948(NetworkBehaviour target, FastBufferReader reader, __RpcParams rpcParams) { //IL_0029: Unknown result type (might be due to invalid IL or missing references) //IL_003f: Unknown result type (might be due to invalid IL or missing references) NetworkManager networkManager = target.NetworkManager; if (networkManager != null && networkManager.IsListening) { target.__rpc_exec_stage = (__RpcExecStage)2; ((ChargeableJailbird)(object)target).SwingSFXClientRpc(); target.__rpc_exec_stage = (__RpcExecStage)0; } } private static void __rpc_handler_3625734691(NetworkBehaviour target, FastBufferReader reader, __RpcParams rpcParams) { //IL_0023: 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_0029: Unknown result type (might be due to invalid IL or missing references) //IL_0070: Unknown result type (might be due to invalid IL or missing references) //IL_0083: Unknown result type (might be due to invalid IL or missing references) //IL_009d: 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) //IL_0055: Invalid comparison between Unknown and I4 NetworkManager networkManager = target.NetworkManager; if (networkManager == null || !networkManager.IsListening) { return; } if (rpcParams.Server.Receive.SenderClientId != target.OwnerClientId) { if ((int)networkManager.LogLevel <= 1) { Debug.LogError((object)"Only the owner can invoke a ServerRpc that requires ownership!"); } } else { ulong enemyID = default(ulong); ByteUnpacker.ReadValueBitPacked(reader, ref enemyID); target.__rpc_exec_stage = (__RpcExecStage)1; ((ChargeableJailbird)(object)target).StunEnemiesServerRpc(enemyID); target.__rpc_exec_stage = (__RpcExecStage)0; } } private static void __rpc_handler_1610222793(NetworkBehaviour target, FastBufferReader reader, __RpcParams rpcParams) { //IL_0023: Unknown result type (might be due to invalid IL or missing references) //IL_0036: 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) NetworkManager networkManager = target.NetworkManager; if (networkManager != null && networkManager.IsListening) { ulong enemyID = default(ulong); ByteUnpacker.ReadValueBitPacked(reader, ref enemyID); target.__rpc_exec_stage = (__RpcExecStage)2; ((ChargeableJailbird)(object)target).StunEnemiesClientRpc(enemyID); target.__rpc_exec_stage = (__RpcExecStage)0; } } protected internal override string __getTypeName() { return "ChargeableJailbird"; } } } namespace System.Runtime.CompilerServices { [AttributeUsage(AttributeTargets.Assembly, AllowMultiple = true)] internal sealed class IgnoresAccessChecksToAttribute : Attribute { public IgnoresAccessChecksToAttribute(string assemblyName) { } } } namespace ChargeableJailbird.NetcodePatcher { [AttributeUsage(AttributeTargets.Module)] internal class NetcodePatchedAssemblyAttribute : Attribute { } }
ReindogFan1372.Pincers.dll
Decompiled a year agousing System; using System.Collections; using System.Collections.Generic; using System.Diagnostics; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using System.Security; using System.Security.Permissions; using BepInEx; using BepInEx.Bootstrap; using BepInEx.Configuration; using BepInEx.Logging; using CustomItemBehaviourLibrary.AbstractItems; using GameNetcodeStuff; using HarmonyLib; using LethalLevelLoader; using Microsoft.CodeAnalysis; using Pincers.Patches; using TMPro; using Unity.Netcode; using UnityEngine; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)] [assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = "")] [assembly: IgnoresAccessChecksTo("AmazingAssets.TerrainToMesh")] [assembly: IgnoresAccessChecksTo("Assembly-CSharp-firstpass")] [assembly: IgnoresAccessChecksTo("Assembly-CSharp")] [assembly: IgnoresAccessChecksTo("ClientNetworkTransform")] [assembly: IgnoresAccessChecksTo("CustomItemBehaviourLibrary")] [assembly: IgnoresAccessChecksTo("DissonanceVoip")] [assembly: IgnoresAccessChecksTo("Facepunch Transport for Netcode for GameObjects")] [assembly: IgnoresAccessChecksTo("Facepunch.Steamworks.Win64")] [assembly: IgnoresAccessChecksTo("LethalLevelLoader")] [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.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("ReindogFan1372.Pincers")] [assembly: AssemblyConfiguration("Debug")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyInformationalVersion("1.0.0")] [assembly: AssemblyProduct("Pincers")] [assembly: AssemblyTitle("ReindogFan1372.Pincers")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("1.0.0.0")] [module: UnverifiableCode] namespace Microsoft.CodeAnalysis { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] internal sealed class EmbeddedAttribute : Attribute { } } namespace System.Runtime.CompilerServices { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Parameter | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter, AllowMultiple = false, Inherited = false)] internal sealed class NullableAttribute : Attribute { public readonly byte[] NullableFlags; public NullableAttribute(byte P_0) { NullableFlags = new byte[1] { P_0 }; } public NullableAttribute(byte[] P_0) { NullableFlags = P_0; } } [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Method | AttributeTargets.Interface | AttributeTargets.Delegate, AllowMultiple = false, Inherited = false)] internal sealed class NullableContextAttribute : Attribute { public readonly byte Flag; public NullableContextAttribute(byte P_0) { Flag = P_0; } } } namespace Pincers { [BepInPlugin("ReindogFan1372.Pincers", "Pincers", "1.0.0")] [BepInDependency(/*Could not decode attribute arguments.*/)] public class Pincers : BaseUnityPlugin { public static Pincers Instance { get; private set; } internal static ManualLogSource Logger { get; private set; } internal static Harmony? Harmony { get; set; } internal static MyModConfig PincersModConfig { get; private set; } private void Awake() { Logger = ((BaseUnityPlugin)this).Logger; Instance = this; PincersModConfig = new MyModConfig(((BaseUnityPlugin)this).Config); AssetBundleLoader.AddOnExtendedModLoadedListener((Action<ExtendedMod>)OnExtendedModRegistered, "ReindogFan1372Pincer", "PincerMod"); Patch(); Logger.LogInfo((object)"ReindogFan1372.Pincers v1.0.0 has loaded!"); } internal static void Patch() { //IL_000d: Unknown result type (might be due to invalid IL or missing references) //IL_0012: Unknown result type (might be due to invalid IL or missing references) //IL_0018: Expected O, but got Unknown if (Harmony == null) { Harmony = new Harmony("ReindogFan1372.Pincers"); } Logger.LogDebug((object)"Patching..."); Harmony.PatchAll(typeof(PincerDepositItemDesk)); Harmony.PatchAll(typeof(PincerGrabPlace)); Harmony.PatchAll(typeof(PincerGrabPatch)); TrySoftPatch("com.github.WhiteSpike.CustomItemBehaviourLibrary", typeof(ContainerPatch)); Logger.LogDebug((object)"Finished patching!"); } internal static void Unpatch() { Logger.LogDebug((object)"Unpatching..."); Harmony? harmony = Harmony; if (harmony != null) { harmony.UnpatchSelf(); } Logger.LogDebug((object)"Finished unpatching!"); } internal static void TrySoftPatch(string pluginName, Type type) { if (Chainloader.PluginInfos.ContainsKey(pluginName)) { Harmony.CreateClassProcessor(type, true).Patch(); Logger.LogInfo((object)(pluginName + "found, enabling compatability patch.")); } } internal static void OnExtendedModRegistered(ExtendedMod myMod) { //IL_00c5: Unknown result type (might be due to invalid IL or missing references) //IL_00cc: Expected O, but got Unknown //IL_00d3: Unknown result type (might be due to invalid IL or missing references) //IL_00da: Expected O, but got Unknown if ((Object)(object)myMod == (Object)null) { return; } foreach (ExtendedItem extendedItem in myMod.ExtendedItems) { if (extendedItem.Item.itemName == "Pincers") { extendedItem.Item.creditsWorth = PincersModConfig.price.Value; extendedItem.Item.twoHanded = PincersModConfig.twoHanded.Value; extendedItem.Item.isScrap = PincersModConfig.isScrap.Value; if (PincersModConfig.isScrap.Value) { int value = PincersModConfig.spawnWeight.Value; StringWithRarity item = new StringWithRarity("Vanilla", value); StringWithRarity item2 = new StringWithRarity("Custom", value); extendedItem.LevelMatchingProperties.levelTags.Clear(); extendedItem.LevelMatchingProperties.levelTags.TrimExcess(); extendedItem.LevelMatchingProperties.levelTags.Add(item2); extendedItem.LevelMatchingProperties.levelTags.Add(item); } } } } } internal class MyModConfig { public readonly ConfigEntry<bool> twoHanded; public readonly ConfigEntry<bool> isScrap; public readonly ConfigEntry<int> spawnWeight; public readonly ConfigEntry<int> price; public readonly ConfigEntry<bool> twoHandedPickup; public readonly ConfigEntry<bool> twoHandedPickupNatural; public MyModConfig(ConfigFile cfg) { cfg.SaveOnConfigSet = false; twoHanded = cfg.Bind<bool>("Pincers", "require two handed?", false, "should the Pincers be two handed?"); isScrap = cfg.Bind<bool>("Pincers", "is scrap??", false, "should the Pincers be able to be found inside dungeons"); spawnWeight = cfg.Bind<int>("Pincers", "Spawn Weight", 0, "if marked as scrap, how rare should the Pincers be? 30-40 is roughly normal vanilla weighting for standard scrap"); price = cfg.Bind<int>("Pincers", "Price of the item", 70, "If purchasable, how much should the item cost to buy?"); twoHandedPickup = cfg.Bind<bool>("Pincers", "Become Two Handed when picking up an item?", true, "Should the Pincers switch to two handed when picking up an item?"); twoHandedPickupNatural = cfg.Bind<bool>("Pincers", "Become Two Handed only when picking up a two-handed item?", true, "Should the Pincers only switch to two handed when picking up a naturally two handed item? (Requires Two Handed Pickup Enabled)"); ClearOrphanedEntries(cfg); cfg.Save(); cfg.SaveOnConfigSet = true; } private static void ClearOrphanedEntries(ConfigFile cfg) { PropertyInfo propertyInfo = AccessTools.Property(typeof(ConfigFile), "OrphanedEntries"); Dictionary<ConfigDefinition, string> dictionary = (Dictionary<ConfigDefinition, string>)propertyInfo.GetValue(cfg); dictionary.Clear(); } } public static class MyPluginInfo { public const string PLUGIN_GUID = "ReindogFan1372.Pincers"; public const string PLUGIN_NAME = "Pincers"; public const string PLUGIN_VERSION = "1.0.0"; } } namespace Pincers.Patches { [HarmonyPatch(typeof(ContainerBehaviour))] public class ContainerPatch { [HarmonyPatch("StoreItemInContainer")] [HarmonyPrefix] public static bool StoreItemInContainerPrefix(ref PlayerControllerB playerInteractor, ContainerBehaviour __instance) { //IL_005e: Unknown result type (might be due to invalid IL or missing references) //IL_0063: Unknown result type (might be due to invalid IL or missing references) //IL_0068: Unknown result type (might be due to invalid IL or missing references) //IL_006c: 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_0075: Unknown result type (might be due to invalid IL or missing references) //IL_00aa: 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_00b0: Unknown result type (might be due to invalid IL or missing references) //IL_00c1: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)playerInteractor.currentlyHeldObjectServer == (Object)null) { return true; } PincersObject pincersObject = default(PincersObject); if (!((Component)playerInteractor.currentlyHeldObjectServer).TryGetComponent<PincersObject>(ref pincersObject)) { return true; } if ((Object)(object)pincersObject.objectHeldByPincers == (Object)null) { return true; } Collider container = (Collider)(object)__instance.container; Vector3 val = RoundManager.RandomPointInBounds(container.bounds); Bounds bounds = container.bounds; val.y = ((Bounds)(ref bounds)).max.y; val.y += pincersObject.objectHeldByPincers.itemProperties.verticalOffset; val = ((Component)((Component)__instance).GetComponent<NetworkObject>()).transform.InverseTransformPoint(val); GrabbableObject objectHeldByPincers = pincersObject.objectHeldByPincers; playerInteractor.DiscardHeldObject(true, ((Component)__instance).GetComponent<NetworkObject>(), val, false); objectHeldByPincers.EnableItemMeshes(!__instance.makeItemsInvisible); __instance.UpdateContainerWeightServerRpc(); return false; } } public class PincersObject : GrabbableObject { [HideInInspector] public GrabbableObject objectHeldByPincers; public Transform holdPoint; [HideInInspector] public AudioSource pincerAudioSource; public AudioClip pincerGrabClip; public AudioClip pincerDropClip; public void Awake() { } public override void Start() { ((GrabbableObject)this).Start(); } public override void OnNetworkSpawn() { ((NetworkBehaviour)this).OnNetworkSpawn(); pincerAudioSource = ((Component)this).GetComponent<AudioSource>(); base.itemProperties.twoHanded = Pincers.PincersModConfig.twoHanded.Value; } public override void LateUpdate() { //IL_002d: 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_0065: 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_007b: Unknown result type (might be due to invalid IL or missing references) //IL_0082: Unknown result type (might be due to invalid IL or missing references) //IL_0087: Unknown result type (might be due to invalid IL or missing references) //IL_0088: 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_009a: Unknown result type (might be due to invalid IL or missing references) //IL_009f: 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) ((GrabbableObject)this).LateUpdate(); if ((Object)(object)objectHeldByPincers != (Object)null) { ((Component)objectHeldByPincers).transform.rotation = holdPoint.rotation; ((Component)objectHeldByPincers).transform.Rotate(base.itemProperties.rotationOffset); ((Component)objectHeldByPincers).transform.position = holdPoint.position; Vector3 positionOffset = base.itemProperties.positionOffset; positionOffset = holdPoint.rotation * positionOffset; Transform transform = ((Component)objectHeldByPincers).transform; transform.position += positionOffset; } } public override void EnableItemMeshes(bool enable) { ((GrabbableObject)this).EnableItemMeshes(enable); if ((Object)(object)objectHeldByPincers == (Object)null) { return; } MeshRenderer[] componentsInChildren = ((Component)objectHeldByPincers).GetComponentsInChildren<MeshRenderer>(); for (int i = 0; i < componentsInChildren.Length; i++) { if (!((Component)componentsInChildren[i]).gameObject.CompareTag("DoNotSet") && !((Component)componentsInChildren[i]).gameObject.CompareTag("InteractTrigger")) { ((Renderer)componentsInChildren[i]).enabled = enable; } } SkinnedMeshRenderer[] componentsInChildren2 = ((Component)objectHeldByPincers).GetComponentsInChildren<SkinnedMeshRenderer>(); for (int j = 0; j < componentsInChildren2.Length; j++) { ((Renderer)componentsInChildren2[j]).enabled = enable; Debug.Log((object)("DISABLING/ENABLING SKINNEDMESH: " + ((Object)((Component)componentsInChildren2[j]).gameObject).name)); } } public void PincerGrabTwoHanded(bool toggle) { if (Pincers.PincersModConfig.twoHandedPickup.Value && ((NetworkBehaviour)this).IsOwner) { base.itemProperties.twoHanded = toggle; if (Object.op_Implicit((Object)(object)base.playerHeldBy)) { base.playerHeldBy.twoHanded = toggle; } HUDManager.Instance.ClearControlTips(); ((Behaviour)HUDManager.Instance.holdingTwoHandedItem).enabled = toggle; ((GrabbableObject)this).SetControlTipsForItem(); SyncPincerTwoHandedServerRpc(toggle); } } [ServerRpc(RequireOwnership = false)] public void SyncPincerTwoHandedServerRpc(bool toggle) { SyncPincerTwoHandedClientRpc(toggle); } [ClientRpc] public void SyncPincerTwoHandedClientRpc(bool toggle) { if (!((NetworkBehaviour)this).IsOwner) { base.itemProperties.twoHanded = toggle; if (Object.op_Implicit((Object)(object)base.playerHeldBy)) { base.playerHeldBy.twoHanded = toggle; } } } } [HarmonyPatch(typeof(PlayerControllerB))] public class PincerGrabPatch { [HarmonyPatch("BeginGrabObject")] [HarmonyPrefix] public static bool BeginGrabObjectPrefix(Camera ___gameplayCamera, float ___grabDistance, int ___interactableObjectsMask, float ___sinkingValue, bool ___inSpecialInteractAnimation, PlayerControllerB __instance) { //IL_0059: Unknown result type (might be due to invalid IL or missing references) //IL_0064: 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_0075: Unknown result type (might be due to invalid IL or missing references) //IL_00d1: Unknown result type (might be due to invalid IL or missing references) //IL_00e7: Unknown result type (might be due to invalid IL or missing references) //IL_00f3: Unknown result type (might be due to invalid IL or missing references) //IL_00fd: Unknown result type (might be due to invalid IL or missing references) //IL_0102: Unknown result type (might be due to invalid IL or missing references) //IL_02c1: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)__instance.currentlyHeldObjectServer == (Object)null) { return true; } PincersObject pincersObject = default(PincersObject); if (!((Component)__instance.currentlyHeldObjectServer).TryGetComponent<PincersObject>(ref pincersObject)) { return true; } if ((Object)(object)pincersObject.objectHeldByPincers != (Object)null) { return false; } __instance.interactRay = new Ray(((Component)___gameplayCamera).transform.position, ((Component)___gameplayCamera).transform.forward); if (!Physics.Raycast(__instance.interactRay, ref __instance.hit, ___grabDistance, ___interactableObjectsMask) || ((Component)((RaycastHit)(ref __instance.hit)).collider).gameObject.layer == 8 || !(((Component)((RaycastHit)(ref __instance.hit)).collider).tag == "PhysicsProp") || ___sinkingValue > 0.73f || Physics.Linecast(((Component)___gameplayCamera).transform.position, ((Component)((RaycastHit)(ref __instance.hit)).collider).transform.position + ((Component)__instance).transform.up * 0.16f, 1073741824, (QueryTriggerInteraction)1)) { return false; } __instance.currentlyGrabbingObject = ((Component)((Component)((RaycastHit)(ref __instance.hit)).collider).transform).gameObject.GetComponent<GrabbableObject>(); if (!GameNetworkManager.Instance.gameHasStarted && !__instance.currentlyGrabbingObject.itemProperties.canBeGrabbedBeforeGameStart && (Object)(object)StartOfRound.Instance.testRoom == (Object)null) { return false; } if ((Object)(object)__instance.currentlyGrabbingObject == (Object)null || ___inSpecialInteractAnimation || __instance.currentlyGrabbingObject.isHeld || __instance.currentlyGrabbingObject.isPocketed) { return false; } NetworkObject networkObject = ((NetworkBehaviour)__instance.currentlyGrabbingObject).NetworkObject; if ((Object)(object)networkObject == (Object)null || !networkObject.IsSpawned) { return false; } if (__instance.currentlyGrabbingObject.grabbable) { __instance.isGrabbingObjectAnimation = true; ((Behaviour)__instance.cursorIcon).enabled = false; ((TMP_Text)__instance.cursorTip).text = ""; __instance.carryWeight = Mathf.Clamp(__instance.carryWeight + (__instance.currentlyGrabbingObject.itemProperties.weight - 1f), 1f, 10f); if (__instance.currentlyGrabbingObject.itemProperties.grabAnimationTime > 0f) { __instance.grabObjectAnimationTime = __instance.currentlyGrabbingObject.itemProperties.grabAnimationTime; } else { __instance.grabObjectAnimationTime = 0.4f; } if (!__instance.isTestingPlayer) { __instance.GrabObjectServerRpc(NetworkObjectReference.op_Implicit(networkObject)); } if (__instance.grabObjectCoroutine != null) { ((MonoBehaviour)__instance).StopCoroutine(__instance.grabObjectCoroutine); } __instance.grabObjectCoroutine = ((MonoBehaviour)__instance).StartCoroutine(GrabObjectPincerFix(__instance)); } return false; } [HarmonyPatch("GrabObjectClientRpc")] [HarmonyPrefix] public static bool GrabObjectClientRpcPrefix(bool grabValidated, NetworkObjectReference grabbedObject, PlayerControllerB __instance) { //IL_002a: Unknown result type (might be due to invalid IL or missing references) //IL_0030: Invalid comparison between Unknown and I4 //IL_0090: 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) { return true; } if ((int)((NetworkBehaviour)__instance).__rpc_exec_stage != 2 || (!networkManager.IsClient && !networkManager.IsHost)) { return true; } if ((Object)(object)__instance.currentlyHeldObjectServer == (Object)null) { return true; } PincersObject pincersObject = default(PincersObject); if (!((Component)__instance.currentlyHeldObjectServer).TryGetComponent<PincersObject>(ref pincersObject)) { return true; } GrabbableObject componentInChildren = ((Component)NetworkObjectReference.op_Implicit(grabbedObject)).gameObject.GetComponentInChildren<GrabbableObject>(); if (grabValidated) { componentInChildren.EnablePhysics(false); componentInChildren.hasHitGround = false; componentInChildren.isInFactory = __instance.isInsideFactory; __instance.SetItemInElevator(__instance.isInHangarShipRoom, __instance.isInElevator, componentInChildren); if (!((NetworkBehaviour)__instance).IsOwner) { componentInChildren.parentObject = pincersObject.holdPoint; __instance.isHoldingObject = true; __instance.carryWeight = Mathf.Clamp(__instance.carryWeight + (componentInChildren.itemProperties.weight - 1f), 1f, 10f); if ((Object)(object)componentInChildren.itemProperties.grabSFX != (Object)null) { __instance.itemAudio.PlayOneShot(componentInChildren.itemProperties.grabSFX, 1f); pincersObject.pincerAudioSource.PlayOneShot(pincersObject.pincerGrabClip, 1f); } if ((Object)(object)componentInChildren.playerHeldBy != (Object)null) { Debug.Log((object)$"playerHeldBy on grabbed object: {componentInChildren.playerHeldBy}"); } else { Debug.Log((object)"grabbed object playerHeldBy is null"); } } } else { Debug.Log((object)$"Player #{__instance.playerClientId}: Was grabbing object {((NetworkBehaviour)componentInChildren).NetworkObjectId} validated by server? : {grabValidated}"); if (((NetworkBehaviour)__instance).IsOwner) { Debug.Log((object)"Local client got grab invalidated"); __instance.grabInvalidated = true; } } pincersObject.objectHeldByPincers = componentInChildren; return false; } public static IEnumerator GrabObjectPincerFix(PlayerControllerB __instance) { PincersObject pincer = default(PincersObject); if ((Object)(object)__instance.currentlyHeldObjectServer == (Object)null || !((Component)__instance.currentlyHeldObjectServer).TryGetComponent<PincersObject>(ref pincer)) { yield break; } __instance.grabbedObjectValidated = false; yield return (object)new WaitForSeconds(0.1f); __instance.currentlyGrabbingObject.parentObject = pincer.holdPoint; if ((Object)(object)__instance.currentlyGrabbingObject.itemProperties.grabSFX != (Object)null) { __instance.itemAudio.PlayOneShot(__instance.currentlyGrabbingObject.itemProperties.grabSFX, 1f); pincer.pincerAudioSource.PlayOneShot(pincer.pincerGrabClip, 1f); } while (!__instance.currentlyGrabbingObject.wasOwnerLastFrame && !__instance.grabInvalidated) { Debug.Log((object)$"grabInvalidated: {__instance.grabInvalidated}"); yield return null; } if (__instance.grabInvalidated) { __instance.grabInvalidated = false; Debug.Log((object)("Grab was invalidated on object: " + ((Object)__instance.currentlyGrabbingObject).name)); if ((Object)(object)__instance.currentlyGrabbingObject.playerHeldBy != (Object)null) { Debug.Log((object)$"playerHeldBy on currentlyGrabbingObject 2: {__instance.currentlyGrabbingObject.playerHeldBy}"); } if ((Object)(object)__instance.currentlyGrabbingObject.parentObject == (Object)(object)__instance.localItemHolder) { if ((Object)(object)__instance.currentlyGrabbingObject.playerHeldBy != (Object)null) { Debug.Log((object)$"Grab invalidated; giving grabbed object to the client who got it first; {__instance.currentlyGrabbingObject.playerHeldBy}"); __instance.currentlyGrabbingObject.parentObject = __instance.currentlyGrabbingObject.playerHeldBy.serverItemHolder; } else { Debug.Log((object)"Grab invalidated; no other client has possession of it, so set its parent object to null."); __instance.currentlyGrabbingObject.parentObject = null; } } __instance.SetSpecialGrabAnimationBool(false, (GrabbableObject)(object)pincer); if ((Object)(object)__instance.currentlyHeldObjectServer != (Object)null) { } __instance.carryWeight = Mathf.Clamp(__instance.carryWeight - (__instance.currentlyGrabbingObject.itemProperties.weight - 1f), 1f, 10f); __instance.isGrabbingObjectAnimation = false; __instance.currentlyGrabbingObject = null; yield break; } pincer.objectHeldByPincers = __instance.currentlyGrabbingObject; __instance.grabbedObjectValidated = true; if (Pincers.PincersModConfig.twoHandedPickupNatural.Value) { if (pincer.objectHeldByPincers.itemProperties.twoHanded) { pincer.PincerGrabTwoHanded(toggle: true); } } else { pincer.PincerGrabTwoHanded(toggle: true); } __instance.isHoldingObject = true; yield return (object)new WaitForSeconds(__instance.grabObjectAnimationTime - 0.2f); __instance.isGrabbingObjectAnimation = false; } [HarmonyPatch("DiscardHeldObject")] [HarmonyPrefix] public static bool DiscardHeldObjectPrefix(ref bool placeObject, ref NetworkObject parentObjectTo, ref Vector3 placePosition, ref bool matchRotationOfParent, PlayerControllerB __instance) { //IL_0245: Unknown result type (might be due to invalid IL or missing references) //IL_024a: Unknown result type (might be due to invalid IL or missing references) //IL_0254: Unknown result type (might be due to invalid IL or missing references) //IL_0259: Unknown result type (might be due to invalid IL or missing references) //IL_025e: Unknown result type (might be due to invalid IL or missing references) //IL_0263: Unknown result type (might be due to invalid IL or missing references) //IL_026d: Unknown result type (might be due to invalid IL or missing references) //IL_008a: Unknown result type (might be due to invalid IL or missing references) //IL_008f: Unknown result type (might be due to invalid IL or missing references) //IL_0099: Unknown result type (might be due to invalid IL or missing references) //IL_009e: Unknown result type (might be due to invalid IL or missing references) //IL_00af: Unknown result type (might be due to invalid IL or missing references) //IL_00b9: Unknown result type (might be due to invalid IL or missing references) //IL_05c2: Unknown result type (might be due to invalid IL or missing references) //IL_05c8: Unknown result type (might be due to invalid IL or missing references) //IL_05ca: Unknown result type (might be due to invalid IL or missing references) //IL_05cf: Unknown result type (might be due to invalid IL or missing references) //IL_05dd: Unknown result type (might be due to invalid IL or missing references) //IL_05e2: Unknown result type (might be due to invalid IL or missing references) //IL_05e6: Unknown result type (might be due to invalid IL or missing references) //IL_04bb: Unknown result type (might be due to invalid IL or missing references) //IL_04e8: Unknown result type (might be due to invalid IL or missing references) //IL_04ef: Unknown result type (might be due to invalid IL or missing references) //IL_04f5: Unknown result type (might be due to invalid IL or missing references) //IL_02ab: Unknown result type (might be due to invalid IL or missing references) //IL_02b0: Unknown result type (might be due to invalid IL or missing references) //IL_02ba: Unknown result type (might be due to invalid IL or missing references) //IL_02bf: Unknown result type (might be due to invalid IL or missing references) //IL_02c4: Unknown result type (might be due to invalid IL or missing references) //IL_02c9: Unknown result type (might be due to invalid IL or missing references) //IL_02d3: Unknown result type (might be due to invalid IL or missing references) //IL_02d8: Unknown result type (might be due to invalid IL or missing references) //IL_014a: Unknown result type (might be due to invalid IL or missing references) //IL_014f: Unknown result type (might be due to invalid IL or missing references) //IL_0159: Unknown result type (might be due to invalid IL or missing references) //IL_015e: Unknown result type (might be due to invalid IL or missing references) //IL_0163: Unknown result type (might be due to invalid IL or missing references) //IL_0168: Unknown result type (might be due to invalid IL or missing references) //IL_0172: Unknown result type (might be due to invalid IL or missing references) //IL_00f7: Unknown result type (might be due to invalid IL or missing references) //IL_00fc: Unknown result type (might be due to invalid IL or missing references) //IL_0106: Unknown result type (might be due to invalid IL or missing references) //IL_010b: Unknown result type (might be due to invalid IL or missing references) //IL_011c: Unknown result type (might be due to invalid IL or missing references) //IL_0126: Unknown result type (might be due to invalid IL or missing references) //IL_012b: Unknown result type (might be due to invalid IL or missing references) //IL_061d: Unknown result type (might be due to invalid IL or missing references) //IL_061f: Unknown result type (might be due to invalid IL or missing references) //IL_0624: Unknown result type (might be due to invalid IL or missing references) //IL_0605: Unknown result type (might be due to invalid IL or missing references) //IL_0607: Unknown result type (might be due to invalid IL or missing references) //IL_060c: Unknown result type (might be due to invalid IL or missing references) //IL_0552: Unknown result type (might be due to invalid IL or missing references) //IL_0558: Unknown result type (might be due to invalid IL or missing references) //IL_055a: Unknown result type (might be due to invalid IL or missing references) //IL_0543: Unknown result type (might be due to invalid IL or missing references) //IL_042b: Unknown result type (might be due to invalid IL or missing references) //IL_0430: Unknown result type (might be due to invalid IL or missing references) //IL_0414: Unknown result type (might be due to invalid IL or missing references) //IL_0419: Unknown result type (might be due to invalid IL or missing references) //IL_01f7: Unknown result type (might be due to invalid IL or missing references) //IL_01fc: Unknown result type (might be due to invalid IL or missing references) //IL_0206: Unknown result type (might be due to invalid IL or missing references) //IL_020b: Unknown result type (might be due to invalid IL or missing references) //IL_0210: Unknown result type (might be due to invalid IL or missing references) //IL_0215: Unknown result type (might be due to invalid IL or missing references) //IL_021f: Unknown result type (might be due to invalid IL or missing references) //IL_0224: Unknown result type (might be due to invalid IL or missing references) //IL_01b0: Unknown result type (might be due to invalid IL or missing references) //IL_01b5: Unknown result type (might be due to invalid IL or missing references) //IL_01bf: Unknown result type (might be due to invalid IL or missing references) //IL_01c4: Unknown result type (might be due to invalid IL or missing references) //IL_01c9: Unknown result type (might be due to invalid IL or missing references) //IL_01ce: Unknown result type (might be due to invalid IL or missing references) //IL_01d8: Unknown result type (might be due to invalid IL or missing references) //IL_01dd: Unknown result type (might be due to invalid IL or missing references) //IL_055f: Unknown result type (might be due to invalid IL or missing references) //IL_056d: Unknown result type (might be due to invalid IL or missing references) //IL_0572: Unknown result type (might be due to invalid IL or missing references) //IL_0576: Unknown result type (might be due to invalid IL or missing references) //IL_0435: Unknown result type (might be due to invalid IL or missing references) //IL_0441: Unknown result type (might be due to invalid IL or missing references) //IL_045f: Unknown result type (might be due to invalid IL or missing references) //IL_048c: Unknown result type (might be due to invalid IL or missing references) //IL_04a0: Unknown result type (might be due to invalid IL or missing references) //IL_062e: Unknown result type (might be due to invalid IL or missing references) //IL_0644: Unknown result type (might be due to invalid IL or missing references) //IL_0667: Unknown result type (might be due to invalid IL or missing references) //IL_0674: Unknown result type (might be due to invalid IL or missing references) //IL_05ad: Unknown result type (might be due to invalid IL or missing references) //IL_05af: Unknown result type (might be due to invalid IL or missing references) //IL_05b4: Unknown result type (might be due to invalid IL or missing references) //IL_0593: Unknown result type (might be due to invalid IL or missing references) //IL_0595: Unknown result type (might be due to invalid IL or missing references) //IL_059a: Unknown result type (might be due to invalid IL or missing references) //IL_0326: Unknown result type (might be due to invalid IL or missing references) //IL_032b: Unknown result type (might be due to invalid IL or missing references) //IL_0337: Unknown result type (might be due to invalid IL or missing references) //IL_039c: Unknown result type (might be due to invalid IL or missing references) //IL_03a1: Unknown result type (might be due to invalid IL or missing references) //IL_03a6: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)__instance.currentlyHeldObjectServer == (Object)null) { return true; } PincersObject pincersObject = default(PincersObject); if (!((Component)__instance.currentlyHeldObjectServer).TryGetComponent<PincersObject>(ref pincersObject)) { return true; } if ((Object)(object)pincersObject.objectHeldByPincers == (Object)null) { return true; } if (!placeObject) { Transform val = null; Ray val2 = default(Ray); if (pincersObject.objectHeldByPincers.itemProperties.allowDroppingAheadOfPlayer) { ((Ray)(ref val2))..ctor(pincersObject.holdPoint.position + Vector3.up * 0.4f, ((Component)__instance.gameplayCamera).transform.forward); if (Physics.Raycast(val2, ref __instance.hit, 4f, 1342179585, (QueryTriggerInteraction)1)) { val = ((Component)((RaycastHit)(ref __instance.hit)).collider).gameObject.transform; Debug.DrawRay(pincersObject.holdPoint.position + Vector3.up * 0.4f, ((Component)__instance.gameplayCamera).transform.forward * 1.7f, Color.yellow, 3f); } else { ((Ray)(ref val2))..ctor(pincersObject.holdPoint.position + Vector3.up * 0.4f, -Vector3.up); if (Physics.Raycast(val2, ref __instance.hit, 4f, 1342179585, (QueryTriggerInteraction)1)) { val = ((Component)((RaycastHit)(ref __instance.hit)).collider).gameObject.transform; Debug.DrawRay(pincersObject.holdPoint.position + Vector3.up * 0.4f, -Vector3.up * 1.7f, Color.yellow, 3f); } else { Debug.DrawRay(pincersObject.holdPoint.position + Vector3.up * 0.4f, -Vector3.up * 1.7f, Color.red, 3f); } } } else { ((Ray)(ref val2))..ctor(pincersObject.holdPoint.position + Vector3.up * 0.4f, -Vector3.up); if (Physics.Raycast(val2, ref __instance.hit, 4f, 1342179585, (QueryTriggerInteraction)1)) { val = ((Component)((RaycastHit)(ref __instance.hit)).collider).gameObject.transform; Debug.DrawRay(pincersObject.holdPoint.position + Vector3.up * 0.4f, -Vector3.up * 1.7f, Color.yellow, 3f); } } if ((Object)(object)val != (Object)null) { PlayerPhysicsRegion componentInChildren = ((Component)val).GetComponentInChildren<PlayerPhysicsRegion>(); if ((Object)(object)componentInChildren != (Object)null && componentInChildren.allowDroppingItems && componentInChildren.itemDropCollider.ClosestPoint(((RaycastHit)(ref __instance.hit)).point) == ((RaycastHit)(ref __instance.hit)).point) { NetworkObject component = ((Component)val).GetComponent<NetworkObject>(); if ((Object)(object)component != (Object)null) { Debug.Log((object)"parenting item to physics parent"); placePosition = ((Component)component).transform.InverseTransformPoint(((Ray)(ref val2)).GetPoint(Mathf.Clamp(((RaycastHit)(ref __instance.hit)).distance - 0.3f, 0.01f, 500f))); parentObjectTo = component; placeObject = true; matchRotationOfParent = false; } else { Debug.LogError((object)("Error: physics region transform does not have network object?: " + ((Object)((Component)val).gameObject).name)); } } } } if (placeObject) { if ((Object)(object)parentObjectTo == (Object)null) { __instance.throwingObject = true; placePosition = ((!__instance.isInElevator) ? StartOfRound.Instance.propsContainer.InverseTransformPoint(placePosition) : StartOfRound.Instance.elevatorTransform.InverseTransformPoint(placePosition)); int num = (int)((Component)__instance).transform.localEulerAngles.y; __instance.SetObjectAsNoLongerHeld(__instance.isInElevator, __instance.isInHangarShipRoom, placePosition, pincersObject.objectHeldByPincers, num); pincersObject.PincerGrabTwoHanded(toggle: false); __instance.ThrowObjectServerRpc(NetworkObjectReference.op_Implicit(((Component)pincersObject.objectHeldByPincers).gameObject.GetComponent<NetworkObject>()), __instance.isInElevator, __instance.isInHangarShipRoom, placePosition, num); } else { __instance.PlaceGrabbableObject(((Component)parentObjectTo).transform, placePosition, matchRotationOfParent, pincersObject.objectHeldByPincers); pincersObject.PincerGrabTwoHanded(toggle: false); __instance.PlaceObjectServerRpc(NetworkObjectReference.op_Implicit(((Component)pincersObject.objectHeldByPincers).gameObject.GetComponent<NetworkObject>()), NetworkObjectReference.op_Implicit(parentObjectTo), placePosition, matchRotationOfParent); } return false; } __instance.throwingObject = true; bool flag = __instance.isInElevator; Bounds bounds; Vector3 val4; if (!__instance.isInElevator) { Vector3 val3 = ((!pincersObject.objectHeldByPincers.itemProperties.allowDroppingAheadOfPlayer) ? pincersObject.objectHeldByPincers.GetItemFloorPosition(default(Vector3)) : __instance.DropItemAheadOfPlayer()); bounds = __instance.playersManager.shipBounds.bounds; if (!((Bounds)(ref bounds)).Contains(val3)) { val4 = __instance.playersManager.propsContainer.InverseTransformPoint(val3); } else { flag = true; val4 = __instance.playersManager.elevatorTransform.InverseTransformPoint(val3); } } else { Vector3 itemFloorPosition = pincersObject.objectHeldByPincers.GetItemFloorPosition(default(Vector3)); bounds = __instance.playersManager.shipBounds.bounds; if (!((Bounds)(ref bounds)).Contains(itemFloorPosition)) { flag = false; val4 = __instance.playersManager.propsContainer.InverseTransformPoint(itemFloorPosition); } else { val4 = __instance.playersManager.elevatorTransform.InverseTransformPoint(itemFloorPosition); } } int num2 = (int)((Component)__instance).transform.localEulerAngles.y; __instance.SetObjectAsNoLongerHeld(flag, __instance.isInHangarShipRoom, val4, pincersObject.objectHeldByPincers, num2); pincersObject.PincerGrabTwoHanded(toggle: false); __instance.ThrowObjectServerRpc(NetworkObjectReference.op_Implicit(((NetworkBehaviour)pincersObject.objectHeldByPincers).NetworkObject), flag, __instance.isInHangarShipRoom, val4, num2); return false; } [HarmonyPatch("PlaceObjectClientRpc")] [HarmonyPrefix] public static bool PlaceObjectClientRpcPrefix(ref NetworkObjectReference parentObjectReference, Vector3 placePositionOffset, bool matchRotationOfParent, ref NetworkObjectReference grabbedObject, PlayerControllerB __instance) { //IL_002c: Unknown result type (might be due to invalid IL or missing references) //IL_0032: Invalid comparison between Unknown and I4 //IL_0104: Unknown result type (might be due to invalid IL or missing references) //IL_00f3: 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) { return true; } if ((int)((NetworkBehaviour)__instance).__rpc_exec_stage != 2 || (!networkManager.IsClient && !networkManager.IsHost)) { return true; } if ((Object)(object)__instance.currentlyHeldObjectServer == (Object)null) { return true; } PincersObject pincersObject = default(PincersObject); if (!((Component)__instance.currentlyHeldObjectServer).TryGetComponent<PincersObject>(ref pincersObject)) { return true; } if ((Object)(object)pincersObject.objectHeldByPincers == (Object)null) { return true; } NetworkObject val = default(NetworkObject); if (((NetworkObjectReference)(ref grabbedObject)).TryGet(ref val, (NetworkManager)null)) { GrabbableObject component = ((Component)val).GetComponent<GrabbableObject>(); if (!((NetworkBehaviour)__instance).IsOwner) { NetworkObject val2 = default(NetworkObject); if (((NetworkObjectReference)(ref parentObjectReference)).TryGet(ref val2, (NetworkManager)null)) { __instance.PlaceGrabbableObject(((Component)val2).transform, placePositionOffset, matchRotationOfParent, component); } else { __instance.PlaceGrabbableObject((Transform)null, placePositionOffset, matchRotationOfParent, component); Debug.LogError((object)$"Reference to parent object when placing was missing. object: {component} placed by {((Object)((Component)__instance).gameObject).name}"); } } if (!component.itemProperties.syncDiscardFunction) { component.playerHeldBy = null; } else { Debug.LogError((object)"The server did not have a reference to the held object (when attempting to PLACE object on client.)"); } if (((NetworkBehaviour)__instance).IsOwner) { __instance.throwingObject = false; } pincersObject.objectHeldByPincers = null; pincersObject.pincerAudioSource.PlayOneShot(pincersObject.pincerDropClip, 1f); } return false; } [HarmonyPatch("ThrowObjectClientRpc")] [HarmonyPrefix] public static bool ThrowObjectClientRpcPrefix(bool droppedInElevator, bool droppedInShipRoom, Vector3 targetFloorPosition, ref NetworkObjectReference grabbedObject, int floorYRot, PlayerControllerB __instance) { //IL_002c: Unknown result type (might be due to invalid IL or missing references) //IL_0032: Invalid comparison between Unknown and I4 //IL_00db: 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) { return true; } if ((int)((NetworkBehaviour)__instance).__rpc_exec_stage != 2 || (!networkManager.IsClient && !networkManager.IsHost)) { return true; } if ((Object)(object)__instance.currentlyHeldObjectServer == (Object)null) { return true; } PincersObject pincersObject = default(PincersObject); if (!((Component)__instance.currentlyHeldObjectServer).TryGetComponent<PincersObject>(ref pincersObject)) { return true; } if ((Object)(object)pincersObject.objectHeldByPincers == (Object)null) { return true; } NetworkObject val = default(NetworkObject); if (((NetworkObjectReference)(ref grabbedObject)).TryGet(ref val, (NetworkManager)null)) { GrabbableObject component = ((Component)val).GetComponent<GrabbableObject>(); if (!((NetworkBehaviour)__instance).IsOwner) { __instance.SetObjectAsNoLongerHeld(droppedInElevator, droppedInShipRoom, targetFloorPosition, component, -1); } if (!component.itemProperties.syncDiscardFunction) { component.playerHeldBy = null; } } else { Debug.LogError((object)"The server did not have a reference to the held object (when attempting to THROW on client.)"); } if (((NetworkBehaviour)__instance).IsOwner) { __instance.throwingObject = false; } pincersObject.objectHeldByPincers = null; pincersObject.pincerAudioSource.PlayOneShot(pincersObject.pincerDropClip, 1f); return false; } [HarmonyPatch("SetObjectAsNoLongerHeld")] [HarmonyPrefix] public static bool SetObjectAsNoLongerHeldPrefix(bool droppedInElevator, bool droppedInShipRoom, Vector3 targetFloorPosition, GrabbableObject dropObject, int floorYRot, PlayerControllerB __instance) { //IL_00be: Unknown result type (might be due to invalid IL or missing references) //IL_00f4: Unknown result type (might be due to invalid IL or missing references) //IL_00f9: Unknown result type (might be due to invalid IL or missing references) //IL_00fe: Unknown result type (might be due to invalid IL or missing references) //IL_0104: Unknown result type (might be due to invalid IL or missing references) //IL_0105: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)__instance.currentlyHeldObjectServer == (Object)null) { return true; } PincersObject pincersObject = default(PincersObject); if (!((Component)__instance.currentlyHeldObjectServer).TryGetComponent<PincersObject>(ref pincersObject)) { return true; } if ((Object)(object)pincersObject.objectHeldByPincers == (Object)null) { return true; } dropObject.heldByPlayerOnServer = false; dropObject.parentObject = null; if (droppedInElevator) { ((Component)dropObject).transform.SetParent(__instance.playersManager.elevatorTransform, true); } else { ((Component)dropObject).transform.SetParent(__instance.playersManager.propsContainer, true); } __instance.SetItemInElevator(droppedInShipRoom, droppedInElevator, dropObject); dropObject.EnablePhysics(true); dropObject.EnableItemMeshes(true); ((Component)dropObject).transform.localScale = dropObject.originalScale; dropObject.isHeld = false; dropObject.isPocketed = false; dropObject.fallTime = 0f; dropObject.startFallingPosition = ((Component)dropObject).transform.parent.InverseTransformPoint(((Component)dropObject).transform.position); dropObject.targetFloorPosition = targetFloorPosition; dropObject.floorYRot = floorYRot; __instance.carryWeight = Mathf.Clamp(__instance.carryWeight - (dropObject.itemProperties.weight - 1f), 1f, 10f); return false; } [HarmonyPatch("PlaceGrabbableObject")] [HarmonyPrefix] public static bool PlaceGrabbableObjectPrefix(Transform parentObject, Vector3 positionOffset, bool matchRotationOfParent, GrabbableObject placeObject, PlayerControllerB __instance) { //IL_00a7: Unknown result type (might be due to invalid IL or missing references) //IL_00ac: Unknown result type (might be due to invalid IL or missing references) //IL_00b8: Unknown result type (might be due to invalid IL or missing references) //IL_00c9: Unknown result type (might be due to invalid IL or missing references) //IL_00d1: Unknown result type (might be due to invalid IL or missing references) //IL_00d2: Unknown result type (might be due to invalid IL or missing references) //IL_0106: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)__instance.currentlyHeldObjectServer == (Object)null) { return true; } PincersObject pincersObject = default(PincersObject); if (!((Component)__instance.currentlyHeldObjectServer).TryGetComponent<PincersObject>(ref pincersObject)) { return true; } if ((Object)(object)pincersObject.objectHeldByPincers == (Object)null) { return true; } placeObject.EnablePhysics(true); placeObject.EnableItemMeshes(true); placeObject.isHeld = false; placeObject.isPocketed = false; placeObject.heldByPlayerOnServer = false; __instance.SetItemInElevator(__instance.isInHangarShipRoom, __instance.isInElevator, placeObject); placeObject.parentObject = null; ((Component)placeObject).transform.SetParent(parentObject, true); placeObject.startFallingPosition = ((Component)placeObject).transform.localPosition; ((Component)placeObject).transform.localScale = placeObject.originalScale; ((Component)placeObject).transform.localPosition = positionOffset; placeObject.targetFloorPosition = positionOffset; if (!matchRotationOfParent) { placeObject.fallTime = 0f; } else { ((Component)placeObject).transform.localEulerAngles = new Vector3(0f, 0f, 0f); placeObject.fallTime = 1.1f; } placeObject.OnPlaceObject(); __instance.carryWeight = Mathf.Clamp(__instance.carryWeight - (placeObject.itemProperties.weight - 1f), 1f, 10f); return false; } } [HarmonyPatch(typeof(PlaceableObjectsSurface))] public class PincerGrabPlace { [HarmonyPatch("PlaceObject")] [HarmonyPrefix] public static bool PlaceObjectPrefix(PlayerControllerB playerWhoTriggered, PlaceableObjectsSurface __instance) { //IL_0099: Unknown result type (might be due to invalid IL or missing references) //IL_009e: Unknown result type (might be due to invalid IL or missing references) //IL_009f: 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) //IL_00e2: Unknown result type (might be due to invalid IL or missing references) //IL_00d2: 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_00d8: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)playerWhoTriggered.currentlyHeldObjectServer == (Object)null) { return true; } PincersObject pincersObject = default(PincersObject); if (!((Component)playerWhoTriggered.currentlyHeldObjectServer).TryGetComponent<PincersObject>(ref pincersObject)) { return true; } if ((Object)(object)pincersObject.objectHeldByPincers == (Object)null) { return true; } if (!playerWhoTriggered.isHoldingObject || playerWhoTriggered.isGrabbingObjectAnimation || !((Object)(object)playerWhoTriggered.currentlyHeldObjectServer != (Object)null)) { return false; } Debug.Log((object)"Placing object in storage"); Vector3 val = __instance.itemPlacementPosition(((Component)playerWhoTriggered.gameplayCamera).transform, pincersObject.objectHeldByPincers); if (!(val == Vector3.zero)) { if ((Object)(object)__instance.parentTo != (Object)null) { val = ((Component)__instance.parentTo).transform.InverseTransformPoint(val); } playerWhoTriggered.DiscardHeldObject(true, __instance.parentTo, val, false); Debug.Log((object)"discard held object called from placeobject"); } return false; } } [HarmonyPatch(typeof(DepositItemsDesk))] public class PincerDepositItemDesk { [HarmonyPatch("PlaceItemOnCounter")] [HarmonyPrefix] public static bool PlaceItemOnCounterPrefix(PlayerControllerB playerWhoTriggered, DepositItemsDesk __instance) { //IL_0096: Unknown result type (might be due to invalid IL or missing references) //IL_009b: 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) //IL_00aa: Unknown result type (might be due to invalid IL or missing references) //IL_00af: Unknown result type (might be due to invalid IL or missing references) //IL_00b3: Unknown result type (might be due to invalid IL or missing references) //IL_00c2: Unknown result type (might be due to invalid IL or missing references) //IL_00c4: Unknown result type (might be due to invalid IL or missing references) //IL_00ce: 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_00d8: Unknown result type (might be due to invalid IL or missing references) //IL_00dd: Unknown result type (might be due to invalid IL or missing references) //IL_012b: Unknown result type (might be due to invalid IL or missing references) //IL_012d: Unknown result type (might be due to invalid IL or missing references) //IL_0132: Unknown result type (might be due to invalid IL or missing references) //IL_0145: Unknown result type (might be due to invalid IL or missing references) //IL_0158: Unknown result type (might be due to invalid IL or missing references) //IL_00fd: Unknown result type (might be due to invalid IL or missing references) //IL_0102: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)playerWhoTriggered.currentlyHeldObjectServer == (Object)null) { return true; } PincersObject pincersObject = default(PincersObject); if (!((Component)playerWhoTriggered.currentlyHeldObjectServer).TryGetComponent<PincersObject>(ref pincersObject)) { return true; } if ((Object)(object)pincersObject.objectHeldByPincers == (Object)null) { return true; } if (((Component)__instance.deskObjectsContainer).GetComponentsInChildren<GrabbableObject>().Length < 12 && !__instance.inGrabbingObjectsAnimation && (Object)(object)GameNetworkManager.Instance != (Object)null && (Object)(object)playerWhoTriggered == (Object)(object)GameNetworkManager.Instance.localPlayerController) { Vector3 val = RoundManager.RandomPointInBounds(((Collider)__instance.triggerCollider).bounds); Bounds bounds = ((Collider)__instance.triggerCollider).bounds; val.y = ((Bounds)(ref bounds)).min.y; RaycastHit val2 = default(RaycastHit); if (Physics.Raycast(new Ray(val + Vector3.up * 3f, Vector3.down), ref val2, 8f, 1048640, (QueryTriggerInteraction)2)) { val = ((RaycastHit)(ref val2)).point; } val.y += pincersObject.objectHeldByPincers.itemProperties.verticalOffset; val = ((Component)__instance.deskObjectsContainer).transform.InverseTransformPoint(val); __instance.AddObjectToDeskServerRpc(NetworkObjectReference.op_Implicit(((Component)pincersObject.objectHeldByPincers).gameObject.GetComponent<NetworkObject>())); playerWhoTriggered.DiscardHeldObject(true, __instance.deskObjectsContainer, val, false); Debug.Log((object)"discard held object called from deposit items desk"); } return false; } } } namespace System.Runtime.CompilerServices { [AttributeUsage(AttributeTargets.Assembly, AllowMultiple = true)] internal sealed class IgnoresAccessChecksToAttribute : Attribute { public IgnoresAccessChecksToAttribute(string assemblyName) { } } }
SCPContainer.dll
Decompiled a year agousing System; using System.Diagnostics; using System.IO; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Serialization; using System.Runtime.Versioning; using System.Security; using System.Security.Permissions; using BepInEx; using BepInEx.Configuration; using BepInEx.Logging; using CSync.Extensions; using CSync.Lib; using CustomItemBehaviourLibrary.AbstractItems; using GameNetcodeStuff; using HarmonyLib; using LethalCompanyInputUtils.Api; using LethalLib.Extras; using LethalLib.Modules; using Microsoft.CodeAnalysis; using SCPContainer.Behaviour; using SCPContainer.Compat; using SCPContainer.Input; using SCPContainer.Misc; using SCPContainer.NetcodePatcher; using SCPContainer.Util; using Unity.Netcode; using UnityEngine; using UnityEngine.InputSystem; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)] [assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("0.0.0.0")] [module: UnverifiableCode] [module: RefSafetyRules(11)] [module: NetcodePatchedAssembly] internal class <Module> { static <Module>() { } } namespace Microsoft.CodeAnalysis { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] internal sealed class EmbeddedAttribute : Attribute { } } namespace System.Runtime.CompilerServices { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Parameter | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter, AllowMultiple = false, Inherited = false)] internal sealed class NullableAttribute : Attribute { public readonly byte[] NullableFlags; public NullableAttribute(byte P_0) { NullableFlags = new byte[1] { P_0 }; } public NullableAttribute(byte[] P_0) { NullableFlags = P_0; } } [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Method | AttributeTargets.Interface | AttributeTargets.Delegate, AllowMultiple = false, Inherited = false)] internal sealed class NullableContextAttribute : Attribute { public readonly byte Flag; public NullableContextAttribute(byte P_0) { Flag = P_0; } } [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 SCPContainer { [BepInPlugin("com.github.WhiteSpike.SCPContainer", "SCP Container", "1.0.0")] [BepInDependency(/*Could not decode attribute arguments.*/)] [BepInDependency(/*Could not decode attribute arguments.*/)] [BepInDependency(/*Could not decode attribute arguments.*/)] [BepInDependency(/*Could not decode attribute arguments.*/)] public class Plugin : BaseUnityPlugin { internal static readonly Harmony harmony = new Harmony("com.github.WhiteSpike.SCPContainer"); internal static readonly ManualLogSource mls = Logger.CreateLogSource("SCP Container"); public static PluginConfig Config; private void Awake() { //IL_00a7: Unknown result type (might be due to invalid IL or missing references) //IL_00ac: Unknown result type (might be due to invalid IL or missing references) //IL_00c1: Unknown result type (might be due to invalid IL or missing references) //IL_00c6: Unknown result type (might be due to invalid IL or missing references) //IL_00db: Unknown result type (might be due to invalid IL or missing references) //IL_00e0: Unknown result type (might be due to invalid IL or missing references) //IL_0168: Unknown result type (might be due to invalid IL or missing references) //IL_02b8: Unknown result type (might be due to invalid IL or missing references) //IL_02bd: Unknown result type (might be due to invalid IL or missing references) //IL_02de: Unknown result type (might be due to invalid IL or missing references) //IL_02e3: Unknown result type (might be due to invalid IL or missing references) //IL_02f4: Unknown result type (might be due to invalid IL or missing references) //IL_02f9: Unknown result type (might be due to invalid IL or missing references) //IL_02fe: Unknown result type (might be due to invalid IL or missing references) //IL_0308: Expected O, but got Unknown //IL_0311: Unknown result type (might be due to invalid IL or missing references) //IL_0316: Unknown result type (might be due to invalid IL or missing references) //IL_0327: Expected O, but got Unknown Config = new PluginConfig(((BaseUnityPlugin)this).Config); string text = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "scpcontainer"); AssetBundle val = AssetBundle.LoadFromFile(text); string text2 = "Assets/SCP Container/"; Item val2 = ScriptableObject.CreateInstance<Item>(); ((Object)val2).name = "SCPContainerItemProperties"; val2.allowDroppingAheadOfPlayer = SyncedEntry<bool>.op_Implicit(Config.DROP_AHEAD_PLAYER); val2.canBeGrabbedBeforeGameStart = SyncedEntry<bool>.op_Implicit(Config.GRABBED_BEFORE_START); val2.canBeInspected = false; val2.creditsWorth = SyncedEntry<int>.op_Implicit(Config.PRICE); val2.floorYOffset = 0; val2.restingRotation = new Vector3(0f, 0f, 0f); val2.rotationOffset = new Vector3(0f, 90f, 0f); val2.positionOffset = new Vector3(0f, -0.35f, 0.3f); val2.verticalOffset = 0f; val2.weight = 0.99f + (float)SyncedEntry<int>.op_Implicit(Config.WEIGHT) / 100f; val2.isScrap = false; val2.twoHanded = true; val2.itemIcon = val.LoadAsset<Sprite>(text2 + "Icon.png"); val2.spawnPrefab = val.LoadAsset<GameObject>(text2 + "SCPContainer.prefab"); val2.spawnPrefab.transform.localScale = new Vector3(0.7f, 0.7f, 0.7f); val2.dropSFX = val.LoadAsset<AudioClip>(text2 + "Drop.ogg"); val2.grabSFX = val.LoadAsset<AudioClip>(text2 + "Grab.ogg"); val2.pocketSFX = val.LoadAsset<AudioClip>(text2 + "Pocket.ogg"); val2.throwSFX = val.LoadAsset<AudioClip>(text2 + "Throw.ogg"); val2.highestSalePercentage = SyncedEntry<int>.op_Implicit(Config.HIGHEST_SALE_PERCENTAGE); val2.itemName = "SCP Container"; val2.itemSpawnsOnGround = true; val2.isConductiveMetal = SyncedEntry<bool>.op_Implicit(Config.CONDUCTIVE); val2.requiresBattery = false; val2.batteryUsage = 0f; val2.twoHandedAnimation = true; val2.grabAnim = "HoldJetpack"; ScpContainerBehaviour scpContainerBehaviour = val2.spawnPrefab.AddComponent<ScpContainerBehaviour>(); ((GrabbableObject)scpContainerBehaviour).itemProperties = val2; ((GrabbableObject)scpContainerBehaviour).grabbable = true; ((GrabbableObject)scpContainerBehaviour).grabbableToEnemies = true; Utilities.FixMixerGroups(val2.spawnPrefab); NetworkPrefabs.RegisterNetworkPrefab(val2.spawnPrefab); TerminalNode val3 = SetupInfoNode(); Items.RegisterShopItem(val2, (TerminalNode)null, (TerminalNode)null, val3, val2.creditsWorth); if (SyncedEntry<bool>.op_Implicit(Config.SCRAP)) { AnimationCurve curve = new AnimationCurve((Keyframe[])(object)new Keyframe[3] { new Keyframe(0f, 0f), new Keyframe(1f - Config.RARITY.Value, 1f), new Keyframe(1f, 1f) }); SpawnableMapObjectDef val4 = ScriptableObject.CreateInstance<SpawnableMapObjectDef>(); val4.spawnableMapObject = new SpawnableMapObject { prefabToSpawn = val2.spawnPrefab }; MapObjects.RegisterMapObject(val4, (LevelTypes)(-1), (Func<SelectableLevel, AnimationCurve>)((SelectableLevel _) => curve)); } InputUtilsCompat.Init(); harmony.PatchAll(typeof(Keybinds)); mls.LogInfo((object)"SCP Container 1.0.0 has been loaded successfully."); } internal static TerminalNode SetupInfoNode() { TerminalNode val = ScriptableObject.CreateInstance<TerminalNode>(); val.displayText = val.displayText + GetDisplayInfo() + "\n"; val.clearPreviousText = true; return val; } public static string GetDisplayInfo() { return $"A portable container which has a maximum capacity of {Config.MAXIMUM_AMOUNT_ITEMS.Value}" + $" and reduces the effective weight of the inserted items by {Config.WEIGHT_REDUCTION_MULTIPLIER.Value * 100f} %.\n" + " Helps subjudgate negative effects from item carried within\n" + $"It weighs {Config.WEIGHT.Value} lbs"; } } public static class PluginInfo { public const string PLUGIN_GUID = "SCPContainer"; public const string PLUGIN_NAME = "SCPContainer"; public const string PLUGIN_VERSION = "1.0.0"; } } namespace SCPContainer.Util { internal static class Constants { internal const string ITEM_SCAN_NODE_KEY_FORMAT = "Enable scan node of {0}"; internal const bool ITEM_SCAN_NODE_DEFAULT = true; internal const string ITEM_SCAN_NODE_DESCRIPTION = "Shows a scan node on the item when scanning"; internal const string SCP_CONTAINER_PRICE_KEY = "SCP Container price"; internal const int SCP_CONTAINER_PRICE_DEFAULT = 500; internal const string SCP_CONTAINER_PRICE_DESCRIPTION = "Price for SCP Container."; internal const string SCP_CONTAINER_WEIGHT_KEY = "Item weight"; internal const int SCP_CONTAINER_WEIGHT_DEFAULT = 15; internal const string SCP_CONTAINER_WEIGHT_DESCRIPTION = "Weight (in lbs)"; internal const string SCP_CONTAINER_CONDUCTIVE_KEY = "Conductive"; internal const bool SCP_CONTAINER_CONDUCTIVE_DEFAULT = true; internal const string SCP_CONTAINER_CONDUCTIVE_DESCRIPTION = "Wether it attracts lightning to the item or not. (Or other mechanics that rely on item being conductive)"; internal const string SCP_CONTAINER_DROP_AHEAD_PLAYER_KEY = "Drop ahead of player when dropping"; internal const bool SCP_CONTAINER_DROP_AHEAD_PLAYER_DEFAULT = true; internal const string SCP_CONTAINER_DROP_AHEAD_PLAYER_DESCRIPTION = "If on, the item will drop infront of the player. Otherwise, drops underneath them and slightly infront."; internal const string SCP_CONTAINER_GRABBED_BEFORE_START_KEY = "Grabbable before game start"; internal const bool SCP_CONTAINER_GRABBED_BEFORE_START_DEFAULT = true; internal const string SCP_CONTAINER_GRABBED_BEFORE_START_DESCRIPTION = "Allows wether the item can be grabbed before hand or not"; internal const string SCP_CONTAINER_HIGHEST_SALE_PERCENTAGE_KEY = "Highest Sale Percentage"; internal const int SCP_CONTAINER_HIGHEST_SALE_PERCENTAGE_DEFAULT = 50; internal const string SCP_CONTAINER_HIGHEST_SALE_PERCENTAGE_DESCRIPTION = "Maximum percentage of sale allowed when this item is selected for a sale."; internal const string SCP_CONTAINER_MAXIMUM_AMOUNT_ITEMS_KEY = "Maximum amount of items for SCP Container"; internal const int SCP_CONTAINER_MAXIMUM_AMOUNT_ITEMS_DEFAULT = 4; internal const string SCP_CONTAINER_MAXIMUM_AMOUNT_ITEMS_DESCRIPTION = "Amount of items allowed before the SCP Container is considered full"; internal const string SCP_CONTAINER_RARITY_KEY = "Spawn Chance of the SCP Container Item"; internal const float SCP_CONTAINER_RARITY_DEFAULT = 0.1f; internal const string SCP_CONTAINER_RARITY_DESCRIPTION = "How likely it is for a SCP Container item to spawn when landing on a moon. (0.1 = 10%)"; internal const string SCP_CONTAINER_WEIGHT_REDUCTION_MULTIPLIER_KEY = "Weight reduction multiplier for SCP Container"; internal const float SCP_CONTAINER_WEIGHT_REDUCTION_MULTIPLIER_DEFAULT = 0.7f; internal const string SCP_CONTAINER_WEIGHT_REDUCTION_MUTLIPLIER_DESCRIPTION = "How much an item's weight will be ignored to the SCP Container's total weight"; internal const string SCP_CONTAINER_SCRAP_KEY = "Scrap Item"; internal const bool SCP_CONTAINER_SCRAP_DEFAULT = false; internal const string SCP_CONTAINER_SCRAP_DESCRIPTION = "If true, it can spawn inside the facility. It won't have a scrap value to be sold for The Company."; internal const string DROP_ALL_ITEMS_SCP_CONTAINER_KEYBIND_NAME = "Drop all items from container"; internal const string DROP_ALL_ITEMS_SCP_CONTAINER_DEFAULT_KEYBIND = "<Mouse>/middleButton"; internal static readonly string SCP_CONTAINER_SCAN_NODE_KEY = string.Format("Enable scan node of {0}", "SCP Container"); } } namespace SCPContainer.Misc { [DataContract] public class PluginConfig : SyncedConfig2<PluginConfig> { [field: SyncedEntryField] public SyncedEntry<bool> SCAN_NODE { get; set; } [field: SyncedEntryField] public SyncedEntry<int> PRICE { get; set; } [field: SyncedEntryField] public SyncedEntry<int> WEIGHT { get; set; } [field: SyncedEntryField] public SyncedEntry<bool> DROP_AHEAD_PLAYER { get; set; } [field: SyncedEntryField] public SyncedEntry<bool> GRABBED_BEFORE_START { get; set; } [field: SyncedEntryField] public SyncedEntry<bool> CONDUCTIVE { get; set; } [field: SyncedEntryField] public SyncedEntry<int> HIGHEST_SALE_PERCENTAGE { get; set; } [field: SyncedEntryField] public SyncedEntry<int> MAXIMUM_AMOUNT_ITEMS { get; set; } [field: SyncedEntryField] public SyncedEntry<float> WEIGHT_REDUCTION_MULTIPLIER { get; set; } [field: SyncedEntryField] public SyncedEntry<bool> SCRAP { get; set; } [field: SyncedEntryField] public SyncedEntry<float> RARITY { get; set; } public PluginConfig(ConfigFile cfg) : base("com.github.WhiteSpike.SCPContainer") { string text = "SCP Container"; PRICE = SyncedBindingExtensions.BindSyncedEntry<int>(cfg, text, "SCP Container price", 500, "Price for SCP Container."); WEIGHT = SyncedBindingExtensions.BindSyncedEntry<int>(cfg, text, "Item weight", 15, "Weight (in lbs)"); SCAN_NODE = SyncedBindingExtensions.BindSyncedEntry<bool>(cfg, text, Constants.SCP_CONTAINER_SCAN_NODE_KEY, true, "Shows a scan node on the item when scanning"); DROP_AHEAD_PLAYER = SyncedBindingExtensions.BindSyncedEntry<bool>(cfg, text, "Drop ahead of player when dropping", true, "If on, the item will drop infront of the player. Otherwise, drops underneath them and slightly infront."); CONDUCTIVE = SyncedBindingExtensions.BindSyncedEntry<bool>(cfg, text, "Conductive", true, "Wether it attracts lightning to the item or not. (Or other mechanics that rely on item being conductive)"); GRABBED_BEFORE_START = SyncedBindingExtensions.BindSyncedEntry<bool>(cfg, text, "Grabbable before game start", true, "Allows wether the item can be grabbed before hand or not"); HIGHEST_SALE_PERCENTAGE = SyncedBindingExtensions.BindSyncedEntry<int>(cfg, text, "Highest Sale Percentage", 50, "Maximum percentage of sale allowed when this item is selected for a sale."); MAXIMUM_AMOUNT_ITEMS = SyncedBindingExtensions.BindSyncedEntry<int>(cfg, text, "Maximum amount of items for SCP Container", 4, "Amount of items allowed before the SCP Container is considered full"); WEIGHT_REDUCTION_MULTIPLIER = SyncedBindingExtensions.BindSyncedEntry<float>(cfg, text, "Weight reduction multiplier for SCP Container", 0.7f, "How much an item's weight will be ignored to the SCP Container's total weight"); SCRAP = SyncedBindingExtensions.BindSyncedEntry<bool>(cfg, text, "Scrap Item", false, "If true, it can spawn inside the facility. It won't have a scrap value to be sold for The Company."); RARITY = SyncedBindingExtensions.BindSyncedEntry<float>(cfg, text, "Spawn Chance of the SCP Container Item", 0.1f, "How likely it is for a SCP Container item to spawn when landing on a moon. (0.1 = 10%)"); ConfigManager.Register<PluginConfig>((SyncedConfig2<PluginConfig>)this); } } internal static class Metadata { public const string GUID = "com.github.WhiteSpike.SCPContainer"; public const string NAME = "SCP Container"; public const string VERSION = "1.0.0"; } internal static class Tools { internal enum NodeType { GENERAL, DANGER, SCRAP } private static GameObject CreateCanvasScanNode(ref GameObject objectToAddScanNode) { //IL_000e: Unknown result type (might be due to invalid IL or missing references) //IL_0013: Unknown result type (might be due to invalid IL or missing references) //IL_0018: Unknown result type (might be due to invalid IL or missing references) GameObject val = Object.Instantiate<GameObject>(GameObject.CreatePrimitive((PrimitiveType)3), objectToAddScanNode.transform.position, Quaternion.Euler(Vector3.zero), objectToAddScanNode.transform); ((Object)val).name = "ScanNode"; val.layer = LayerMask.NameToLayer("ScanNode"); Object.Destroy((Object)(object)val.GetComponent<MeshRenderer>()); Object.Destroy((Object)(object)val.GetComponent<MeshFilter>()); return val; } private static void AddScanNode(GameObject objectToAddScanNode, NodeType nodeType, string header = "LGU Scan Node", string subText = "Used for LGU stuff", int creatureScanID = -1, int minRange = 2, int maxRange = 7) { GameObject val = CreateCanvasScanNode(ref objectToAddScanNode); ScanNodeProperties scanNodeProperties = val.AddComponent<ScanNodeProperties>(); ChangeScanNode(ref scanNodeProperties, nodeType, header, subText, creatureScanID, 0, minRange, maxRange); } public static void AddGeneralScanNode(GameObject objectToAddScanNode, string header = "LGU Scan Node", string subText = "Used for LGU stuff", int creatureScanID = -1, int minRange = 2, int maxRange = 7) { AddScanNode(objectToAddScanNode, NodeType.GENERAL, header, subText, creatureScanID, minRange, maxRange); } public static void ChangeScanNode(ref ScanNodeProperties scanNodeProperties, NodeType nodeType, string header = "LGU Scan Node", string subText = "Used for LGU stuff", int creatureScanID = -1, int scrapValue = 0, int minRange = 2, int maxRange = 7) { scanNodeProperties.headerText = header; scanNodeProperties.subText = subText; scanNodeProperties.nodeType = (int)nodeType; scanNodeProperties.creatureScanID = creatureScanID; scanNodeProperties.scrapValue = scrapValue; scanNodeProperties.minRange = minRange; scanNodeProperties.maxRange = maxRange; } } } namespace SCPContainer.Input { internal class IngameKeybinds : LcInputActions { public static IngameKeybinds Instance; [InputAction("<Mouse>/middleButton", Name = "Drop all items from container")] public InputAction SCPContainerKey { get; set; } internal static InputActionAsset GetAsset() { return ((LcInputActions)Instance).Asset; } } [HarmonyPatch] internal static class Keybinds { public static InputActionAsset Asset; public static InputActionMap ActionMap; public static InputAction SCPContainerAction; public static PlayerControllerB localPlayerController => StartOfRound.Instance?.localPlayerController; [HarmonyPatch(typeof(PreInitSceneScript), "Awake")] [HarmonyPrefix] public static void AddToKeybindMenu() { //IL_0010: Unknown result type (might be due to invalid IL or missing references) //IL_0015: Unknown result type (might be due to invalid IL or missing references) Asset = InputUtilsCompat.Asset; ActionMap = Asset.actionMaps[0]; SCPContainerAction = InputUtilsCompat.SCPContainerKey; } [HarmonyPatch(typeof(StartOfRound), "OnEnable")] [HarmonyPostfix] public static void OnEnable() { Asset.Enable(); SCPContainerAction.performed += OnSCPContainerActionActionPerformed; } [HarmonyPatch(typeof(StartOfRound), "OnDisable")] [HarmonyPostfix] public static void OnDisable() { Asset.Disable(); SCPContainerAction.performed -= OnSCPContainerActionActionPerformed; } private static void OnSCPContainerActionActionPerformed(CallbackContext context) { if (!((Object)(object)localPlayerController == (Object)null) && localPlayerController.isPlayerControlled && (!((NetworkBehaviour)localPlayerController).IsServer || localPlayerController.isHostPlayerObject) && Object.op_Implicit((Object)(object)localPlayerController.currentlyHeldObjectServer)) { ScpContainerBehaviour component = ((Component)localPlayerController.currentlyHeldObjectServer).GetComponent<ScpContainerBehaviour>(); if (Object.op_Implicit((Object)(object)component)) { ((ContainerBehaviour)component).UpdateContainerDrop(); } } } } } namespace SCPContainer.Compat { public static class InputUtilsCompat { internal static InputActionAsset Asset => IngameKeybinds.GetAsset(); public static InputAction SCPContainerKey => IngameKeybinds.Instance.SCPContainerKey; internal static void Init() { IngameKeybinds.Instance = new IngameKeybinds(); } } } namespace SCPContainer.Behaviour { internal class ScpContainerBehaviour : ContainerBehaviour { internal const string ITEM_NAME = "SCP Container"; internal const string ITEM_DESCRIPTION = "Allows carrying dangerous items"; protected bool KeepScanNode => SyncedEntry<bool>.op_Implicit(Plugin.Config.SCAN_NODE); public override void Start() { //IL_0050: Unknown result type (might be due to invalid IL or missing references) ((ContainerBehaviour)this).Start(); if (!KeepScanNode) { Object.Destroy((Object)(object)((Component)this).gameObject.GetComponentInChildren<ScanNodeProperties>()); } PluginConfig config = Plugin.Config; base.maximumAmountItems = config.MAXIMUM_AMOUNT_ITEMS.Value; base.weightReduceMultiplier = config.WEIGHT_REDUCTION_MULTIPLIER.Value; base.restriction = (Restrictions)2; base.maximumWeightAllowed = 0f; base.noiseRange = 0f; base.sloppiness = 1f; base.lookSensitivityDrawback = 1f; base.makeItemsInvisible = true; base.playSounds = false; base.wheelsClip = Array.Empty<AudioClip>(); } protected override bool ShowDepositPrompts() { PlayerControllerB localPlayerController = GameNetworkManager.Instance.localPlayerController; return localPlayerController.isHoldingObject && (Object)(object)((GrabbableObject)this).playerHeldBy != (Object)(object)localPlayerController; } protected override void SetupScanNodeProperties() { ScanNodeProperties scanNodeProperties = ((Component)this).GetComponentInChildren<ScanNodeProperties>(); if ((Object)(object)scanNodeProperties != (Object)null) { Tools.ChangeScanNode(ref scanNodeProperties, (Tools.NodeType)scanNodeProperties.nodeType, "SCP Container", "Allows carrying dangerous items"); } else { Tools.AddGeneralScanNode(((Component)this).gameObject, "SCP Container", "Allows carrying dangerous items"); } } protected override string[] SetupContainerTooltips() { string bindingDisplayString = InputActionRebindingExtensions.GetBindingDisplayString(IngameKeybinds.Instance.SCPContainerKey, (DisplayStringOptions)0, (string)null); return new string[1] { "Drop all items: [" + bindingDisplayString + "]" }; } protected override void __initializeVariables() { ((ContainerBehaviour)this).__initializeVariables(); } protected internal override string __getTypeName() { return "ScpContainerBehaviour"; } } } namespace System.Runtime.CompilerServices { [AttributeUsage(AttributeTargets.Assembly, AllowMultiple = true)] internal sealed class IgnoresAccessChecksToAttribute : Attribute { public IgnoresAccessChecksToAttribute(string assemblyName) { } } } namespace SCPContainer.NetcodePatcher { [AttributeUsage(AttributeTargets.Module)] internal class NetcodePatchedAssemblyAttribute : Attribute { } }