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 UnlimitedQuota v1.0.8
UnlimitedQuota.dll
Decompiled 5 hours agousing System; using System.Collections; 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 CSync.Extensions; using CSync.Lib; using Entiffo.UnlimitedQuota.Config; using Entiffo.UnlimitedQuota.Util; using HarmonyLib; using Microsoft.CodeAnalysis; using Unity.Netcode; using UnityEngine; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: IgnoresAccessChecksTo("Assembly-CSharp-firstpass")] [assembly: IgnoresAccessChecksTo("Assembly-CSharp")] [assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")] [assembly: AssemblyCompany("UnlimitedQuota")] [assembly: AssemblyConfiguration("Release")] [assembly: AssemblyFileVersion("1.0.8.0")] [assembly: AssemblyInformationalVersion("1.0.8")] [assembly: AssemblyProduct("UnlimitedQuota")] [assembly: AssemblyTitle("UnlimitedQuota")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("1.0.8.0")] [module: UnverifiableCode] [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 Entiffo.UnlimitedQuota { public static class CompanyAutoRoute { private static bool _pending; private static Coroutine? _routine; public static void TryScheduleFromShipPhase(string reason) { if (!Plugin.IsEnabled || (!Plugin.Config.AutoRouteToCompany.Value && !Plugin.Config.AutoLandAtCompany.Value) || !DeadlineApplicator.IsHost() || (Object)(object)StartOfRound.Instance == (Object)null || (Object)(object)TimeOfDay.Instance == (Object)null || StartOfRound.Instance.isChallengeFile || !StartOfRound.Instance.inShipPhase) { return; } TimeOfDay.Instance.UpdateProfitQuotaCurrentTime(); if ((TimeOfDay.Instance.daysUntilDeadline <= 0 || !(TimeOfDay.Instance.timeUntilDeadline > 0f)) && !_pending) { _pending = true; if (_routine != null) { ((MonoBehaviour)StartOfRound.Instance).StopCoroutine(_routine); } _routine = ((MonoBehaviour)StartOfRound.Instance).StartCoroutine(RouteAndMaybeLand(reason)); } } private static IEnumerator RouteAndMaybeLand(string reason) { yield return (object)new WaitForSeconds(0.85f); try { StartOfRound sor = StartOfRound.Instance; TimeOfDay instance = TimeOfDay.Instance; if ((Object)(object)sor == (Object)null || (Object)(object)instance == (Object)null || !((NetworkBehaviour)sor).IsServer || !sor.inShipPhase || sor.isChallengeFile) { yield break; } instance.UpdateProfitQuotaCurrentTime(); if (instance.daysUntilDeadline > 0 && instance.timeUntilDeadline > 0f) { yield break; } bool routed = false; if (Plugin.Config.AutoRouteToCompany.Value) { routed = TryRouteNow(sor, reason); } if (!Plugin.Config.AutoLandAtCompany.Value) { yield break; } float waited = 0f; while (sor.travellingToNewLevel && waited < 45f) { waited += Time.unscaledDeltaTime; yield return null; if ((Object)(object)StartOfRound.Instance == (Object)null) { yield break; } sor = StartOfRound.Instance; } if (sor.travellingToNewLevel || !sor.inShipPhase) { Plugin.Log.LogWarning((object)"Auto-land skipped: still travelling or left ship phase."); yield break; } yield return (object)new WaitForSeconds(1.1f); if (!IsOnCompany(sor)) { Plugin.Log.LogWarning((object)"Auto-land skipped: ship is not at the Company."); } else { TryLandNow(sor, routed, reason); } } finally { _pending = false; _routine = null; } } private static bool TryRouteNow(StartOfRound sor, string reason) { if (sor.travellingToNewLevel) { return false; } int num = FindCompanyLevelIndex(sor); if (num < 0) { Plugin.Log.LogWarning((object)"Auto-route to Company failed: no company moon found in levels list."); return false; } if (IsOnCompany(sor) || sor.currentLevelID == num) { Plugin.DebugLog("Already at Company; skip route (" + reason + ")."); return false; } Terminal val = Object.FindObjectOfType<Terminal>(); if ((Object)(object)val == (Object)null) { return false; } Plugin.Log.LogInfo((object)($"Auto-routing to Company (levels[{num}] '{sor.levels[num].PlanetName}') " + "— 0 days left (" + reason + ").")); sor.ChangeLevelServerRpc(num, val.groupCredits); if ((Object)(object)HUDManager.Instance != (Object)null) { HUDManager.Instance.DisplayTip("UnlimitedQuota", "0 days left — ship routed to the Company.", false, false, "UQ_AutoCompany"); } return true; } private static void TryLandNow(StartOfRound sor, bool justRouted, string reason) { if (!((NetworkBehaviour)sor).IsServer || !sor.inShipPhase || sor.travellingToNewLevel) { return; } StartMatchLever val = Object.FindObjectOfType<StartMatchLever>(); if ((Object)(object)val != (Object)null) { try { val.PlayLeverPullEffectsServerRpc(true); } catch { } } Plugin.Log.LogInfo((object)$"Auto-landing at Company ({reason}, routed={justRouted})."); sor.StartGame(); if ((Object)(object)HUDManager.Instance != (Object)null) { HUDManager.Instance.DisplayTip("UnlimitedQuota", "Landing at the Company…", false, false, "UQ_AutoLand"); } } private static bool IsOnCompany(StartOfRound sor) { if ((Object)(object)sor.currentLevel != (Object)null && IsCompanyLevel(sor.currentLevel)) { return true; } int num = FindCompanyLevelIndex(sor); if (num >= 0) { return sor.currentLevelID == num; } return false; } public static int FindCompanyLevelIndex(StartOfRound sor) { SelectableLevel[] levels = sor.levels; if (levels == null || levels.Length == 0) { return -1; } for (int i = 0; i < levels.Length; i++) { if ((Object)(object)levels[i] != (Object)null && levels[i].levelID == 3) { return i; } } for (int j = 0; j < levels.Length; j++) { if ((Object)(object)levels[j] != (Object)null && IsCompanyLevel(levels[j])) { return j; } } return -1; } public static bool IsCompanyLevel(SelectableLevel level) { if ((Object)(object)level == (Object)null) { return false; } if (level.levelID == 3) { return true; } if (!level.planetHasTime && !level.spawnEnemiesAndScrap) { return true; } string text = level.PlanetName ?? ""; if (text.IndexOf("Company", StringComparison.OrdinalIgnoreCase) < 0) { return text.IndexOf("Gordion", StringComparison.OrdinalIgnoreCase) >= 0; } return true; } } public static class DeadlineApplicator { public static bool IsHost() { if ((Object)(object)TimeOfDay.Instance != (Object)null) { return ((NetworkBehaviour)TimeOfDay.Instance).IsServer; } return false; } public static void ApplyNewQuotaDeadline(TimeOfDay timeOfDay, bool growDailyScrap) { if (Plugin.IsEnabled && !((Object)(object)timeOfDay == (Object)null) && ((NetworkBehaviour)timeOfDay).IsServer && (!((Object)(object)StartOfRound.Instance != (Object)null) || !StartOfRound.Instance.isChallengeFile)) { float num = ComputeFor(timeOfDay); ApplyDays(timeOfDay, num, syncClients: true); SaveState.Save(0f, num, timeOfDay.profitQuota); float num2 = DeadlineCalculator.ResolveStartingQuota(timeOfDay); Plugin.Log.LogInfo((object)($"Deadline days={num} quota={timeOfDay.profitQuota} startQuota={num2:F0} " + $"min={Plugin.Config.MinDeadlineDays.Value} perDay={Plugin.Config.QuotaPerExtraDay.Value}")); } } public static void ApplyOnSaveLoad(TimeOfDay timeOfDay) { if (!Plugin.IsEnabled || (Object)(object)timeOfDay == (Object)null || !((NetworkBehaviour)timeOfDay).IsServer || ((Object)(object)StartOfRound.Instance != (Object)null && StartOfRound.Instance.isChallengeFile)) { return; } float value = Plugin.Config.MinDeadlineDays.Value; float num = ComputeFor(timeOfDay); float num2 = SaveState.LoadDeadlineDays(-1f); if (num2 < value) { ApplyDays(timeOfDay, num, syncClients: true); SaveState.Save(0f, num, timeOfDay.profitQuota); Plugin.Log.LogInfo((object)$"Load: fresh deadline days={num} quota={timeOfDay.profitQuota}"); return; } float num3 = Mathf.Clamp(num, value, 20f); float totalTime = DeadlineCalculator.GetTotalTime(timeOfDay); if (num3 > num2 + 0.01f) { timeOfDay.timeUntilDeadline += (num3 - num2) * totalTime; Plugin.Log.LogInfo((object)$"Load: extended deadline {num2} → {num3} days (quota={timeOfDay.profitQuota})."); } else if (num3 + 0.01f < num2) { float num4 = num3 / Mathf.Max(num2, 1f); timeOfDay.timeUntilDeadline = Mathf.Max(0f, timeOfDay.timeUntilDeadline * num4); Plugin.Log.LogInfo((object)$"Load: shortened deadline {num2} → {num3} days (quota={timeOfDay.profitQuota})."); } timeOfDay.quotaVariables.deadlineDaysAmount = Mathf.RoundToInt(num3); timeOfDay.UpdateProfitQuotaCurrentTime(); SaveState.Save(0f, num3, timeOfDay.profitQuota); if (((NetworkBehaviour)timeOfDay).IsServer) { timeOfDay.SyncTimeClientRpc(timeOfDay.globalTime, (int)timeOfDay.timeUntilDeadline); } } public static void ResetForNewShip(TimeOfDay timeOfDay) { if (Plugin.IsEnabled && !((Object)(object)timeOfDay == (Object)null) && ((NetworkBehaviour)timeOfDay).IsServer) { SaveState.Clear(); float num = ComputeFor(timeOfDay); ApplyDays(timeOfDay, num, syncClients: true); SaveState.Save(0f, num, timeOfDay.profitQuota); Plugin.Log.LogInfo((object)$"ResetShip: deadline days={num} startingQuota={timeOfDay.profitQuota}"); } } public static void ApplyDays(TimeOfDay timeOfDay, float days, bool syncClients) { int deadlineDaysAmount = Mathf.RoundToInt(days); timeOfDay.quotaVariables.deadlineDaysAmount = deadlineDaysAmount; timeOfDay.timeUntilDeadline = DeadlineCalculator.GetTimeUntilDeadline(timeOfDay, days); timeOfDay.UpdateProfitQuotaCurrentTime(); if (syncClients && ((NetworkBehaviour)timeOfDay).IsServer) { timeOfDay.SyncTimeClientRpc(timeOfDay.globalTime, (int)timeOfDay.timeUntilDeadline); } } public static void SyncDeadlineDaysAmount(TimeOfDay timeOfDay) { if (!Plugin.IsEnabled || (Object)(object)timeOfDay == (Object)null || timeOfDay.quotaVariables == null || ((Object)(object)StartOfRound.Instance != (Object)null && StartOfRound.Instance.isChallengeFile)) { return; } float totalTime = DeadlineCalculator.GetTotalTime(timeOfDay); int num = (int)Mathf.Ceil(timeOfDay.timeUntilDeadline / totalTime); if (num > 0 && num > timeOfDay.quotaVariables.deadlineDaysAmount) { timeOfDay.quotaVariables.deadlineDaysAmount = num; if ((Object)(object)StartOfRound.Instance != (Object)null) { timeOfDay.SetBuyingRateForDay(); } } } private static float ComputeFor(TimeOfDay timeOfDay) { return DeadlineCalculator.ComputeDays(timeOfDay.profitQuota, Plugin.Config.MinDeadlineDays.Value, Plugin.Config.QuotaPerExtraDay.Value, DeadlineCalculator.ResolveStartingQuota(timeOfDay)); } } [BepInPlugin("Entiffo.UnlimitedQuota", "UnlimitedQuota", "1.0.8")] [BepInDependency("com.sigurd.csync", "5.0.0")] [BepInDependency(/*Could not decode attribute arguments.*/)] public class Plugin : BaseUnityPlugin { public const string ModGuid = "Entiffo.UnlimitedQuota"; private readonly Harmony _harmony = new Harmony("Entiffo.UnlimitedQuota"); internal static Plugin Instance { get; private set; } internal static ModConfig Config { get; private set; } internal static ManualLogSource Log { get; private set; } internal static bool IsEnabled => Config.Enabled.Value; private void Awake() { Instance = this; Log = ((BaseUnityPlugin)this).Logger; Config = new ModConfig(((BaseUnityPlugin)this).Config); _harmony.PatchAll(typeof(Plugin).Assembly); Log.LogInfo((object)"UnlimitedQuota 1.0.8 loaded (v81 Unlimited Quota)."); } internal static void DebugLog(string message) { if (Config.DebugLogging.Value) { Log.LogInfo((object)message); } } } public static class MyPluginInfo { public const string PLUGIN_GUID = "Entiffo.UnlimitedQuota"; public const string PLUGIN_NAME = "UnlimitedQuota"; public const string PLUGIN_VERSION = "1.0.8"; } } namespace Entiffo.UnlimitedQuota.Util { public static class DeadlineCalculator { public const float MaxDeadlineDays = 20f; public const float FallbackStartingQuota = 130f; public static float ComputeDays(float profitQuota, float minDays, float quotaPerExtraDay, float startingQuota) { float num = Mathf.Max(quotaPerExtraDay, 1f); float num2 = Mathf.Max(startingQuota, 0f); float num3 = Mathf.Floor(Mathf.Max(0f, profitQuota - num2) / num); return Mathf.Clamp(minDays + num3, minDays, 20f); } public static float ResolveStartingQuota(TimeOfDay timeOfDay) { if (timeOfDay?.quotaVariables != null && timeOfDay.quotaVariables.startingQuota > 0) { return timeOfDay.quotaVariables.startingQuota; } return 130f; } public static float GetTotalTime(TimeOfDay timeOfDay) { float num = timeOfDay.totalTime; if (num <= 0f) { num = timeOfDay.lengthOfHours * (float)timeOfDay.numberOfHours; } return Mathf.Max(num, 1f); } public static float GetTimeUntilDeadline(TimeOfDay timeOfDay, float days) { return days * GetTotalTime(timeOfDay); } } public static class SaveState { public const string PreviousDailyKey = "UQ_previousDaily"; public const string DeadlineDaysKey = "UQ_deadlineDays"; public const string PreviousQuotaKey = "UQ_previousQuota"; public static string? CurrentSaveName() { if ((Object)(object)GameNetworkManager.Instance == (Object)null) { return null; } return GameNetworkManager.Instance.currentSaveFileName; } public static float LoadPreviousDaily(float defaultValue) { string text = CurrentSaveName(); if (string.IsNullOrEmpty(text)) { return defaultValue; } return ES3.Load<float>("UQ_previousDaily", text, defaultValue); } public static float LoadDeadlineDays(float defaultValue) { string text = CurrentSaveName(); if (string.IsNullOrEmpty(text)) { return defaultValue; } return ES3.Load<float>("UQ_deadlineDays", text, defaultValue); } public static float LoadPreviousQuota(float defaultValue) { string text = CurrentSaveName(); if (string.IsNullOrEmpty(text)) { return defaultValue; } return ES3.Load<float>("UQ_previousQuota", text, defaultValue); } public static void Save(float previousDaily, float deadlineDays, float profitQuota) { string text = CurrentSaveName(); if (!string.IsNullOrEmpty(text)) { ES3.Save<float>("UQ_previousDaily", previousDaily, text); ES3.Save<float>("UQ_deadlineDays", deadlineDays, text); ES3.Save<float>("UQ_previousQuota", profitQuota, text); } } public static void Clear() { string text = CurrentSaveName(); if (!string.IsNullOrEmpty(text)) { if (ES3.KeyExists("UQ_previousDaily", text)) { ES3.DeleteKey("UQ_previousDaily", text); } if (ES3.KeyExists("UQ_deadlineDays", text)) { ES3.DeleteKey("UQ_deadlineDays", text); } if (ES3.KeyExists("UQ_previousQuota", text)) { ES3.DeleteKey("UQ_previousQuota", text); } } } } } namespace Entiffo.UnlimitedQuota.Patches { [HarmonyPatch(typeof(GameNetworkManager), "ResetSavedGameValues")] internal static class GameNetworkManagerPatches { [HarmonyPostfix] private static void ResetSavedGameValues_Postfix() { if (DeadlineApplicator.IsHost()) { SaveState.Clear(); Plugin.DebugLog("Cleared UnlimitedQuota save keys after ResetSavedGameValues."); } } } [HarmonyPatch(typeof(StartOfRound))] internal static class StartOfRoundPatches { [HarmonyPatch("SetTimeAndPlanetToSavedSettings")] [HarmonyPostfix] private static void SetTimeAndPlanetToSavedSettings_Postfix() { if (!((Object)(object)TimeOfDay.Instance == (Object)null)) { DeadlineApplicator.ApplyOnSaveLoad(TimeOfDay.Instance); CompanyAutoRoute.TryScheduleFromShipPhase("save load"); } } [HarmonyPatch("ResetShip")] [HarmonyPostfix] private static void ResetShip_Postfix() { if (!((Object)(object)TimeOfDay.Instance == (Object)null)) { DeadlineApplicator.ResetForNewShip(TimeOfDay.Instance); } } [HarmonyPatch("SetShipReadyToLand")] [HarmonyPostfix] private static void SetShipReadyToLand_Postfix() { CompanyAutoRoute.TryScheduleFromShipPhase("orbit ready"); } } [HarmonyPatch(typeof(TimeOfDay))] internal static class TimeOfDayPatches { [HarmonyPatch("SetNewProfitQuota")] [HarmonyPrefix] private static void SetNewProfitQuota_Prefix(TimeOfDay __instance, out int __state) { __state = (((Object)(object)__instance != (Object)null) ? __instance.timesFulfilledQuota : (-1)); } [HarmonyPatch("SetNewProfitQuota")] [HarmonyPostfix] [HarmonyAfter(new string[] { "Boxofbiscuits97.QuotraRollover" })] private static void SetNewProfitQuota_Postfix(TimeOfDay __instance, int __state) { if (!((Object)(object)__instance == (Object)null)) { if (__instance.timesFulfilledQuota == __state) { Plugin.DebugLog("Skipped deadline apply: SetNewProfitQuota did not advance " + $"(fulfilled still {__state}). Compatible with Quota Rollover cancel."); } else { DeadlineApplicator.ApplyNewQuotaDeadline(__instance, growDailyScrap: true); } } } [HarmonyPatch("SyncTimeClientRpc")] [HarmonyPostfix] private static void SyncTimeClientRpc_Postfix(TimeOfDay __instance) { DeadlineApplicator.SyncDeadlineDaysAmount(__instance); if ((Object)(object)__instance != (Object)null && ((NetworkBehaviour)__instance).IsServer) { CompanyAutoRoute.TryScheduleFromShipPhase("sync time"); } } } } namespace Entiffo.UnlimitedQuota.Config { public class ModConfig : SyncedConfig2<ModConfig> { public ConfigEntry<bool> DebugLogging { get; private set; } [field: SyncedEntryField] public SyncedEntry<bool> Enabled { get; private set; } [field: SyncedEntryField] public SyncedEntry<float> MinDeadlineDays { get; private set; } [field: SyncedEntryField] public SyncedEntry<float> QuotaPerExtraDay { get; private set; } [field: SyncedEntryField] public SyncedEntry<bool> AutoRouteToCompany { get; private set; } [field: SyncedEntryField] public SyncedEntry<bool> AutoLandAtCompany { get; private set; } public ModConfig(ConfigFile cfg) : base("Entiffo.UnlimitedQuota") { //IL_0017: Unknown result type (might be due to invalid IL or missing references) //IL_0028: Unknown result type (might be due to invalid IL or missing references) //IL_0032: Expected O, but got Unknown //IL_0032: Expected O, but got Unknown //IL_0043: Unknown result type (might be due to invalid IL or missing references) //IL_0058: Unknown result type (might be due to invalid IL or missing references) //IL_0062: Expected O, but got Unknown //IL_0062: Expected O, but got Unknown //IL_0073: 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_0092: Expected O, but got Unknown //IL_0092: Expected O, but got Unknown //IL_00a3: Unknown result type (might be due to invalid IL or missing references) //IL_00b4: Unknown result type (might be due to invalid IL or missing references) //IL_00be: Expected O, but got Unknown //IL_00be: Expected O, but got Unknown //IL_00cf: 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_00ea: Expected O, but got Unknown //IL_00ea: Expected O, but got Unknown //IL_00fb: Unknown result type (might be due to invalid IL or missing references) //IL_010c: Unknown result type (might be due to invalid IL or missing references) //IL_0116: Expected O, but got Unknown //IL_0116: Expected O, but got Unknown Enabled = SyncedBindingExtensions.BindSyncedEntry<bool>(cfg, new ConfigDefinition("General", "Enabled"), true, new ConfigDescription("Master toggle. When false, vanilla deadlines are used.", (AcceptableValueBase)null, Array.Empty<object>())); MinDeadlineDays = SyncedBindingExtensions.BindSyncedEntry<float>(cfg, new ConfigDefinition("Deadline", "MinDeadlineDays"), 3f, new ConfigDescription("Deadline days at the starting quota.", (AcceptableValueBase)null, Array.Empty<object>())); QuotaPerExtraDay = SyncedBindingExtensions.BindSyncedEntry<float>(cfg, new ConfigDefinition("Deadline", "QuotaPerExtraDay"), 200f, new ConfigDescription("How much the profit quota must rise above the starting quota to add +1 deadline day.", (AcceptableValueBase)null, Array.Empty<object>())); AutoRouteToCompany = SyncedBindingExtensions.BindSyncedEntry<bool>(cfg, new ConfigDefinition("Deadline", "AutoRouteToCompany"), true, new ConfigDescription("When 0 days are left, automatically route the ship to the Company.", (AcceptableValueBase)null, Array.Empty<object>())); AutoLandAtCompany = SyncedBindingExtensions.BindSyncedEntry<bool>(cfg, new ConfigDefinition("Deadline", "AutoLandAtCompany"), false, new ConfigDescription("If on, after routing to the Company on day 0, also pull the lever and land automatically. Default off.", (AcceptableValueBase)null, Array.Empty<object>())); DebugLogging = cfg.Bind<bool>(new ConfigDefinition("General", "DebugLogging"), false, new ConfigDescription("Extra logs (local only).", (AcceptableValueBase)null, Array.Empty<object>())); ConfigManager.Register<ModConfig>((SyncedConfig2<ModConfig>)(object)this); } } } namespace System.Runtime.CompilerServices { [AttributeUsage(AttributeTargets.Assembly, AllowMultiple = true)] internal sealed class IgnoresAccessChecksToAttribute : Attribute { public IgnoresAccessChecksToAttribute(string assemblyName) { } } }