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 MultipleUseUpgrades v1.2.1
MultipleUseUpgrades.dll
Decompiled a year agousing System; 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.Configuration; using BepInEx.Logging; using HarmonyLib; 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: IgnoresAccessChecksTo("Assembly-CSharp-firstpass")] [assembly: IgnoresAccessChecksTo("Assembly-CSharp")] [assembly: IgnoresAccessChecksTo("Autodesk.Fbx")] [assembly: IgnoresAccessChecksTo("Facepunch.Steamworks.Win64")] [assembly: IgnoresAccessChecksTo("FbxBuildTestAssets")] [assembly: IgnoresAccessChecksTo("Klattersynth")] [assembly: IgnoresAccessChecksTo("Photon3Unity3D")] [assembly: IgnoresAccessChecksTo("PhotonChat")] [assembly: IgnoresAccessChecksTo("PhotonRealtime")] [assembly: IgnoresAccessChecksTo("PhotonUnityNetworking")] [assembly: IgnoresAccessChecksTo("PhotonUnityNetworking.Utilities")] [assembly: IgnoresAccessChecksTo("PhotonVoice.API")] [assembly: IgnoresAccessChecksTo("PhotonVoice")] [assembly: IgnoresAccessChecksTo("PhotonVoice.PUN")] [assembly: IgnoresAccessChecksTo("SingularityGroup.HotReload.Runtime")] [assembly: IgnoresAccessChecksTo("SingularityGroup.HotReload.Runtime.Public")] [assembly: IgnoresAccessChecksTo("Sirenix.OdinInspector.Attributes")] [assembly: IgnoresAccessChecksTo("Sirenix.Serialization.Config")] [assembly: IgnoresAccessChecksTo("Sirenix.Serialization")] [assembly: IgnoresAccessChecksTo("Sirenix.Utilities")] [assembly: IgnoresAccessChecksTo("Unity.AI.Navigation")] [assembly: IgnoresAccessChecksTo("Unity.Formats.Fbx.Runtime")] [assembly: IgnoresAccessChecksTo("Unity.InputSystem")] [assembly: IgnoresAccessChecksTo("Unity.InputSystem.ForUI")] [assembly: IgnoresAccessChecksTo("Unity.Postprocessing.Runtime")] [assembly: IgnoresAccessChecksTo("Unity.RenderPipelines.Core.Runtime")] [assembly: IgnoresAccessChecksTo("Unity.RenderPipelines.Core.ShaderLibrary")] [assembly: IgnoresAccessChecksTo("Unity.RenderPipelines.ShaderGraph.ShaderGraphLibrary")] [assembly: IgnoresAccessChecksTo("Unity.TextMeshPro")] [assembly: IgnoresAccessChecksTo("Unity.Timeline")] [assembly: IgnoresAccessChecksTo("Unity.VisualScripting.Antlr3.Runtime")] [assembly: IgnoresAccessChecksTo("Unity.VisualScripting.Core")] [assembly: IgnoresAccessChecksTo("Unity.VisualScripting.Flow")] [assembly: IgnoresAccessChecksTo("Unity.VisualScripting.State")] [assembly: IgnoresAccessChecksTo("UnityEngine.ARModule")] [assembly: IgnoresAccessChecksTo("UnityEngine.NVIDIAModule")] [assembly: IgnoresAccessChecksTo("UnityEngine.UI")] [assembly: IgnoresAccessChecksTo("websocket-sharp")] [assembly: AssemblyCompany("khalliv")] [assembly: AssemblyConfiguration("Debug")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyInformationalVersion("1.0.0")] [assembly: AssemblyProduct("MultipleUseUpgrades")] [assembly: AssemblyTitle("MultipleUseUpgrades")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("1.0.0.0")] [module: UnverifiableCode] [module: RefSafetyRules(11)] namespace Microsoft.CodeAnalysis { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] internal sealed class EmbeddedAttribute : Attribute { } } namespace System.Runtime.CompilerServices { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.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 MultipleUseUpgrades { [HarmonyPatch(typeof(PlayerController))] internal static class ExamplePlayerControllerPatch { [HarmonyPrefix] [HarmonyPatch("Start")] private static void Start_Prefix(PlayerController __instance) { MultipleUseUpgrades.Logger.LogDebug((object)$"{__instance} Start Prefix"); } [HarmonyPostfix] [HarmonyPatch("Start")] private static void Start_Postfix(PlayerController __instance) { MultipleUseUpgrades.Logger.LogDebug((object)$"{__instance} Start Postfix"); } } [BepInPlugin("khalliv.MultipleUseUpgrades", "MultipleUseUpgrades", "1.2.1")] public class MultipleUseUpgrades : BaseUnityPlugin { internal static ConfigEntry<int> Config_ChanceToNotUseUpUpgrade; internal static ConfigEntry<int> Config_MaximumUsesPerUpgrade; internal static readonly Dictionary<int, int> ItemUpgradeUsesNetworked = new Dictionary<int, int>(); internal static readonly Dictionary<ItemUpgrade, int> ItemUpgradeUsesSinglePlayer = new Dictionary<ItemUpgrade, int>(); internal static MultipleUseUpgrades Instance { get; private set; } = null; internal static ManualLogSource Logger => Instance._logger; private ManualLogSource _logger => ((BaseUnityPlugin)this).Logger; internal Harmony? Harmony { get; set; } private void Awake() { Instance = this; ((Component)this).gameObject.transform.parent = null; ((Object)((Component)this).gameObject).hideFlags = (HideFlags)61; SetupConfigs(); Patch(); Logger.LogInfo((object)$"{((BaseUnityPlugin)this).Info.Metadata.GUID} v{((BaseUnityPlugin)this).Info.Metadata.Version} has loaded!"); } internal void Patch() { //IL_001a: Unknown result type (might be due to invalid IL or missing references) //IL_001f: Unknown result type (might be due to invalid IL or missing references) //IL_0021: Expected O, but got Unknown //IL_0026: Expected O, but got Unknown if (Harmony == null) { Harmony val = new Harmony(((BaseUnityPlugin)this).Info.Metadata.GUID); Harmony val2 = val; Harmony = val; } Harmony.PatchAll(typeof(MultipleUseUpgradesPatches)); } internal void Unpatch() { Harmony? harmony = Harmony; if (harmony != null) { harmony.UnpatchSelf(); } } private void SetupConfigs() { //IL_0025: Unknown result type (might be due to invalid IL or missing references) //IL_002f: Expected O, but got Unknown //IL_0057: Unknown result type (might be due to invalid IL or missing references) //IL_0061: Expected O, but got Unknown Config_ChanceToNotUseUpUpgrade = ((BaseUnityPlugin)this).Config.Bind<int>("General", "ChanceToNotUseUpUpgrade", 25, new ConfigDescription("The chance to not use up an upgrade.", (AcceptableValueBase)(object)new AcceptableValueRange<int>(0, 100), Array.Empty<object>())); Config_MaximumUsesPerUpgrade = ((BaseUnityPlugin)this).Config.Bind<int>("General", "MaximumUsesPerUpgrade", 3, new ConfigDescription("The maximum number of uses per upgrade.", (AcceptableValueBase)(object)new AcceptableValueRange<int>(1, 100), Array.Empty<object>())); } } internal class MultipleUseUpgradesPatches { [HarmonyPatch(typeof(PlayerAvatar), "LoadingLevelAnimationCompleted")] [HarmonyPostfix] private static void PlayerAvatar_LoadingLevelAnimationCompleted_Postfix(PlayerAvatar __instance) { if (!GameManager.Multiplayer()) { MultipleUseUpgrades.ItemUpgradeUsesSinglePlayer.Clear(); } else if (SemiFunc.IsMasterClient()) { MultipleUseUpgrades.ItemUpgradeUsesNetworked.Clear(); } } [HarmonyPatch(typeof(ItemUpgrade), "PlayerUpgrade")] [HarmonyPrefix] private static bool ItemUpgrade_PlayerUpgrade_Patch(ItemUpgrade __instance) { //IL_01fd: Unknown result type (might be due to invalid IL or missing references) if (!SemiFunc.IsMasterClientOrSingleplayer()) { return true; } int value = MultipleUseUpgrades.Config_ChanceToNotUseUpUpgrade.Value; int value2 = MultipleUseUpgrades.Config_MaximumUsesPerUpgrade.Value; if (value == 0 || value2 <= 1) { if (SemiFunc.IsMultiplayer()) { MultipleUseUpgrades.ItemUpgradeUsesNetworked.Remove(__instance.photonView.ViewID); } else { MultipleUseUpgrades.ItemUpgradeUsesSinglePlayer.Remove(__instance); } return true; } int num = Random.Range(1, 101); if (num <= value) { if (__instance.upgradeDone) { return false; } if (GameManager.Multiplayer()) { int viewID = __instance.photonView.ViewID; if (!MultipleUseUpgrades.ItemUpgradeUsesNetworked.TryAdd(viewID, 1)) { MultipleUseUpgrades.ItemUpgradeUsesNetworked[viewID]++; if (MultipleUseUpgrades.ItemUpgradeUsesNetworked[viewID] >= value2) { MultipleUseUpgrades.ItemUpgradeUsesNetworked.Remove(viewID); return true; } } } else if (!MultipleUseUpgrades.ItemUpgradeUsesSinglePlayer.TryAdd(__instance, 1)) { MultipleUseUpgrades.ItemUpgradeUsesSinglePlayer[__instance]++; if (MultipleUseUpgrades.ItemUpgradeUsesSinglePlayer[__instance] >= value2) { MultipleUseUpgrades.ItemUpgradeUsesSinglePlayer.Remove(__instance); return true; } } __instance.upgradeEvent.Invoke(); PlayerAvatar val = SemiFunc.PlayerAvatarGetFromPhotonID(__instance.itemToggle.playerTogglePhotonID); if (val.isLocal) { StatsUI.instance.Fetch(); StatsUI.instance.ShowStats(); CameraGlitch.Instance.PlayUpgrade(); } else { GameDirector.instance.CameraImpact.ShakeDistance(5f, 1f, 6f, ((Component)__instance).transform.position, 0.2f); } if (SemiFunc.IsMasterClientOrSingleplayer()) { val.playerHealth.MaterialEffectOverride((Effect)0); } StatsManager.instance.itemsPurchased[__instance.itemAttributes.item.itemAssetName] = Mathf.Max(StatsManager.instance.itemsPurchased[__instance.itemAttributes.item.itemAssetName] - 1, 0); __instance.itemToggle.ToggleItem(false, -1); MultipleUseUpgrades.Logger.LogInfo((object)(((Object)__instance).name + " has not been used up!")); return false; } if (GameManager.Multiplayer()) { MultipleUseUpgrades.ItemUpgradeUsesNetworked.Remove(__instance.photonView.ViewID); } else { MultipleUseUpgrades.ItemUpgradeUsesSinglePlayer.Remove(__instance); } return true; } } }