using 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;
}
}
}