using System; using System.Diagnostics; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using BepInEx; using BepInEx.Configuration; using BepInEx.Core.Logging.Interpolation; using BepInEx.Logging; using BepInEx.Unity.IL2CPP; using Gatekeeper.EnvironmentStuff; using Gatekeeper.EnvironmentStuff.TradersAltar; using HarmonyLib; using MerchantAltarMinimumPayout.Core; using Microsoft.CodeAnalysis; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)] [assembly: AssemblyCompany("prom")] [assembly: AssemblyProduct("Merchant Altar Minimum Payout")] [assembly: AssemblyTitle("GatekeeperMerchantAltarMinimumPayout")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: TargetFramework(".NETCoreApp,Version=v6.0", FrameworkDisplayName = ".NET 6.0")] [assembly: AssemblyVersion("1.0.0.0")] [module: RefSafetyRules(11)] namespace Microsoft.CodeAnalysis { [CompilerGenerated] [Embedded] internal sealed class EmbeddedAttribute : Attribute { } } namespace System.Runtime.CompilerServices { [CompilerGenerated] [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] [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] [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 MerchantAltarMinimumPayout { [BepInPlugin("com.prom.gatekeeper.merchantaltarminimum", "Merchant Altar Minimum Payout", "1.0.0")] [BepInProcess("Gatekeeper.exe")] public sealed class Plugin : BasePlugin { internal const string PluginGuid = "com.prom.gatekeeper.merchantaltarminimum"; internal const string PluginName = "Merchant Altar Minimum Payout"; internal const string PluginVersion = "1.0.0"; private static ConfigEntry? _minimumPayout; private static ManualLogSource? _log; private Harmony? _harmony; public override void Load() { //IL_0180: Unknown result type (might be due to invalid IL or missing references) //IL_0187: Expected O, but got Unknown //IL_00ca: Unknown result type (might be due to invalid IL or missing references) //IL_00d4: Expected O, but got Unknown //IL_00dd: Unknown result type (might be due to invalid IL or missing references) //IL_00ea: Expected O, but got Unknown //IL_00f7: Unknown result type (might be due to invalid IL or missing references) //IL_00fe: Expected O, but got Unknown _log = ((BasePlugin)this).Log; _minimumPayout = ((BasePlugin)this).Config.Bind("General", "MerchantAltarMinimumPayout", 100u, "Absolute minimum Prism payout from the Merchant's Altar. Restart the game after changing this value."); bool flag = default(bool); try { MethodInfo methodInfo = typeof(TradersAltarRepaired).GetMethod("Awake", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, null, Type.EmptyTypes, null) ?? throw new MissingMethodException(typeof(TradersAltarRepaired).FullName, "Awake()"); if (methodInfo.DeclaringType != typeof(TradersAltarRepaired)) { throw new InvalidOperationException("Resolved Awake() was not declared by TradersAltarRepaired; refusing to patch a broader type."); } MethodInfo methodInfo2 = typeof(Plugin).GetMethod("TradersAltarRepairedAwakePostfix", BindingFlags.Static | BindingFlags.NonPublic) ?? throw new MissingMethodException(typeof(Plugin).FullName, "TradersAltarRepairedAwakePostfix"); _harmony = new Harmony("com.prom.gatekeeper.merchantaltarminimum"); _harmony.Patch((MethodBase)methodInfo, (HarmonyMethod)null, new HarmonyMethod(methodInfo2), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null); ManualLogSource log = ((BasePlugin)this).Log; BepInExInfoLogInterpolatedStringHandler val = new BepInExInfoLogInterpolatedStringHandler(62, 2, ref flag); if (flag) { ((BepInExLogInterpolatedStringHandler)val).AppendLiteral("Patched only "); ((BepInExLogInterpolatedStringHandler)val).AppendFormatted(typeof(TradersAltarRepaired).FullName); ((BepInExLogInterpolatedStringHandler)val).AppendLiteral(".Awake(); configured MerchantAltarMinimumPayout="); ((BepInExLogInterpolatedStringHandler)val).AppendFormatted(_minimumPayout.Value); ((BepInExLogInterpolatedStringHandler)val).AppendLiteral("."); } log.LogInfo(val); } catch (Exception ex) { Harmony? harmony = _harmony; if (harmony != null) { harmony.UnpatchSelf(); } ManualLogSource log2 = ((BasePlugin)this).Log; BepInExErrorLogInterpolatedStringHandler val2 = new BepInExErrorLogInterpolatedStringHandler(52, 1, ref flag); if (flag) { ((BepInExLogInterpolatedStringHandler)val2).AppendLiteral("Failed closed; no Merchant's Altar patch is active: "); ((BepInExLogInterpolatedStringHandler)val2).AppendFormatted(ex); } log2.LogError(val2); } } private static void TradersAltarRepairedAwakePostfix(TradersAltarRepaired __instance) { //IL_0180: Unknown result type (might be due to invalid IL or missing references) //IL_0187: Expected O, but got Unknown //IL_0030: Unknown result type (might be due to invalid IL or missing references) //IL_0052: Expected I4, but got Unknown //IL_0084: Unknown result type (might be due to invalid IL or missing references) //IL_008b: Expected O, but got Unknown bool flag = default(bool); try { TradersAltarRepairedInfo interactableObjectInfo = ((NetworkInteractable)(object)__instance).InteractableObjectInfo; if (interactableObjectInfo == null) { ManualLogSource? log = _log; if (log != null) { log.LogError((object)"TradersAltarRepaired has no TradersAltarRepairedInfo; MinPrice was not changed."); } return; } AltarInfoSnapshot original = new AltarInfoSnapshot((int)interactableObjectInfo.ItemReferencePrice, interactableObjectInfo.OmniCost, interactableObjectInfo.MinPrice, interactableObjectInfo.Multiplier, interactableObjectInfo.DeprecationStep); interactableObjectInfo.MinPrice = MinimumPayoutPolicy.WithMinimumPayout(original, _minimumPayout.Value).MinPrice; ManualLogSource log2 = _log; if (log2 != null) { BepInExInfoLogInterpolatedStringHandler val = new BepInExInfoLogInterpolatedStringHandler(104, 6, ref flag); if (flag) { ((BepInExLogInterpolatedStringHandler)val).AppendLiteral("Merchant's Altar MinPrice "); ((BepInExLogInterpolatedStringHandler)val).AppendFormatted(original.MinPrice); ((BepInExLogInterpolatedStringHandler)val).AppendLiteral(" -> "); ((BepInExLogInterpolatedStringHandler)val).AppendFormatted(interactableObjectInfo.MinPrice); ((BepInExLogInterpolatedStringHandler)val).AppendLiteral("; "); ((BepInExLogInterpolatedStringHandler)val).AppendLiteral("preserved ItemReferencePrice="); ((BepInExLogInterpolatedStringHandler)val).AppendFormatted(original.ItemReferencePrice); ((BepInExLogInterpolatedStringHandler)val).AppendLiteral(", OmniCost="); ((BepInExLogInterpolatedStringHandler)val).AppendFormatted(original.OmniCost); ((BepInExLogInterpolatedStringHandler)val).AppendLiteral(", "); ((BepInExLogInterpolatedStringHandler)val).AppendLiteral("Multiplier="); ((BepInExLogInterpolatedStringHandler)val).AppendFormatted(original.Multiplier); ((BepInExLogInterpolatedStringHandler)val).AppendLiteral(", DeprecationStep="); ((BepInExLogInterpolatedStringHandler)val).AppendFormatted(original.DeprecationStep); ((BepInExLogInterpolatedStringHandler)val).AppendLiteral("."); } log2.LogInfo(val); } } catch (Exception ex) { ManualLogSource log3 = _log; if (log3 != null) { BepInExErrorLogInterpolatedStringHandler val2 = new BepInExErrorLogInterpolatedStringHandler(43, 1, ref flag); if (flag) { ((BepInExLogInterpolatedStringHandler)val2).AppendLiteral("Merchant's Altar MinPrice was not changed: "); ((BepInExLogInterpolatedStringHandler)val2).AppendFormatted(ex); } log3.LogError(val2); } } } } } namespace MerchantAltarMinimumPayout.Core { internal readonly record struct AltarInfoSnapshot(int ItemReferencePrice, uint OmniCost, uint MinPrice, float Multiplier, float DeprecationStep); internal static class MinimumPayoutPolicy { internal static AltarInfoSnapshot WithMinimumPayout(AltarInfoSnapshot original, uint minimumPayout) { return original with { MinPrice = minimumPayout }; } } }