Please disclose if your mod was created primarily 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 CevasScrapRebalance v1.2.0
Ceva's Scrap Rebalance.dll
Decompiled 2 years agousing System; using System.Collections; using System.Collections.Generic; using System.Diagnostics; using System.Globalization; 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 StaticNetcodeLib; 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 = ".NET Standard 2.1")] [assembly: AssemblyCompany("EliteMasterEric")] [assembly: AssemblyConfiguration("Debug")] [assembly: AssemblyDescription("Rebalances scrap properties to be more fair.")] [assembly: AssemblyFileVersion("1.2.0.0")] [assembly: AssemblyInformationalVersion("1.2.0")] [assembly: AssemblyProduct("Ceva's Scrap Rebalance")] [assembly: AssemblyTitle("Ceva's Scrap Rebalance")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("1.2.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.Module, AllowMultiple = false, Inherited = false)] internal sealed class RefSafetyRulesAttribute : Attribute { public readonly int Version; public RefSafetyRulesAttribute(int P_0) { Version = P_0; } } } namespace CevaScrapRebalance { [StaticNetcode] internal class NetworkRPC { [ServerRpc(RequireOwnership = false)] public static void BroadcastApparatusValueServerRpc(NetworkObjectReference gameObjectRef) { //IL_0010: Unknown result type (might be due to invalid IL or missing references) //IL_004e: Unknown result type (might be due to invalid IL or missing references) Plugin.Instance.PluginLogger.LogDebug((object)$"Server received Apparatus sync request: ({gameObjectRef})"); if (Plugin.Instance.PluginConfig.ShouldApplyAnyChanges()) { int value = ScrapValueCalculator.CalculateApparatusScrapValue(); float weight = ScrapValueCalculator.CalculateApparatusScrapWeight(); ScrapHandedness twoHanded = ScrapValueCalculator.CalculateApparatusTwoHanded(); ScrapConductivity conductive = ScrapValueCalculator.CalculateApparatusConductive(); BroadcastApparatusValueClientRpc(gameObjectRef, value, weight, twoHanded, conductive); } } [ClientRpc] public static void BroadcastApparatusValueClientRpc(NetworkObjectReference gameObjectRef, int value, float weight, ScrapHandedness twoHanded, ScrapConductivity conductive) { //IL_0018: 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) Plugin.Instance.PluginLogger.LogDebug((object)$"Client received Apparatus sync request: ({gameObjectRef}) ({value}, {weight}, {twoHanded}, {conductive})"); NetworkObject val = default(NetworkObject); if (!((NetworkObjectReference)(ref gameObjectRef)).TryGet(ref val, (NetworkManager)null)) { Plugin.Instance.PluginLogger.LogError((object)$"Could not retrieve Apparatus from NetworkObjectReference: ({gameObjectRef})"); } LungProp component = ((Component)val).GetComponent<LungProp>(); if (weight > 0f && Plugin.Instance.PluginConfig.ShouldApplyScrapWeightChanges()) { Plugin.Instance.PluginLogger.LogInfo((object)("Setting Apparatus weight to " + weight)); ((GrabbableObject)component).itemProperties.weight = weight; } else { Plugin.Instance.PluginLogger.LogInfo((object)"Leaving Apparatus weight as default"); } if (value > 0 && Plugin.Instance.PluginConfig.ShouldApplyScrapValueChanges()) { Plugin.Instance.PluginLogger.LogInfo((object)("Setting Apparatus scrap value to " + value)); ((GrabbableObject)component).SetScrapValue(value); } else { Plugin.Instance.PluginLogger.LogInfo((object)"Leaving Apparatus scrap value as default"); } if (Plugin.Instance.PluginConfig.ShouldApplyScrapHandednessChanges()) { switch (twoHanded) { case ScrapHandedness.OneHanded: Plugin.Instance.PluginLogger.LogInfo((object)"Setting Apparatus to two-handed..."); ScrapValueCalculator.DisableItemTwoHanded(((GrabbableObject)component).itemProperties); break; case ScrapHandedness.TwoHanded: Plugin.Instance.PluginLogger.LogInfo((object)"Setting Apparatus to one-handed..."); ScrapValueCalculator.EnableItemTwoHanded(((GrabbableObject)component).itemProperties); break; case ScrapHandedness.Default: Plugin.Instance.PluginLogger.LogInfo((object)"Leaving Apparatus handedness as default"); break; default: Plugin.Instance.PluginLogger.LogInfo((object)"Leaving Apparatus handedness as default"); break; } } if (Plugin.Instance.PluginConfig.ShouldApplyScrapConductivityChanges()) { switch (conductive) { case ScrapConductivity.NonConductive: Plugin.Instance.PluginLogger.LogInfo((object)"Enabling Apparatus conductivity..."); ((GrabbableObject)component).itemProperties.isConductiveMetal = false; break; case ScrapConductivity.Conductive: Plugin.Instance.PluginLogger.LogInfo((object)"Disabling Apparatus conductivity..."); ((GrabbableObject)component).itemProperties.isConductiveMetal = true; break; case ScrapConductivity.Default: Plugin.Instance.PluginLogger.LogInfo((object)"Leaving Apparatus conductivity as default"); break; default: Plugin.Instance.PluginLogger.LogInfo((object)"Leaving Apparatus conductivity as default"); break; } } } } public static class PluginInfo { public const string PLUGIN_ID = "cevascraprebalance"; public const string PLUGIN_NAME = "CevaScrapRebalance"; public const string PLUGIN_VERSION = "1.2.0"; public const string PLUGIN_GUID = "com.elitemastereric.cevascraprebalance"; } [BepInPlugin("com.elitemastereric.cevascraprebalance", "CevaScrapRebalance", "1.2.0")] [BepInDependency(/*Could not decode attribute arguments.*/)] public class Plugin : BaseUnityPlugin { public ManualLogSource PluginLogger; internal PluginConfig PluginConfig; public static Plugin Instance { get; private set; } private void Awake() { //IL_0019: Unknown result type (might be due to invalid IL or missing references) //IL_001f: Expected O, but got Unknown Instance = this; PluginLogger = ((BaseUnityPlugin)this).Logger; Harmony val = new Harmony("com.elitemastereric.cevascraprebalance"); val.PatchAll(); PluginLogger.LogInfo((object)"Plugin CevaScrapRebalance (com.elitemastereric.cevascraprebalance) is loaded!"); LoadConfig(); } private void LoadConfig() { PluginConfig = new PluginConfig(); PluginConfig.BindConfig(((BaseUnityPlugin)this).Config); } } internal class PluginConfig { public readonly string[] LEVELS = new string[11] { "Level1Experimentation", "Level2Assurance", "Level3Vow", "Level4March", "Level5Rend", "Level6Dine", "Level7Offense", "Level8Titan", "Level9Artifice", "Level10Adamance", "Level11Embrion" }; public readonly string[] SCRAPS = new string[56] { "Airhorn", "Bell", "BigBolt", "Bottles", "Brush", "Candy", "CashRegister", "ChemicalJug", "Clock", "ClownHorn", "Comedy", "ControlPad", "CookieMoldPan", "DustPan", "EasterEgg", "EggBeater", "FancyLamp", "Flask", "GarbageLid", "Gift", "GoldBar", "GoldenCup", "Hairdryer", "HomemadeFlashbang", "JarOfPickles", "LargeAxle", "LaserPointer", "Magic7Ball", "MagnifyingGlass", "MetalSheet", "Mug", "OldPhone", "Painting", "PerfumeBottle", "PillBottle", "PlasticCup", "PlasticFish", "RedSoda", "Remote", "Ring", "RubberDucky", "SoccerBall", "SteeringWheel", "StopSign", "TeaKettle", "Teeth", "ToiletPaper", "Toothpaste", "ToyCube", "ToyRobot", "ToyTrain", "Tragedy", "VTypeEngine", "WhoopieCushion", "YieldSign", "ZedDog" }; private Dictionary<string, ScrapConfig> ScrapConfigs; private ConfigEntry<bool> EnableScrapValueChanges; private ConfigEntry<bool> EnableScrapWeightChanges; private ConfigEntry<bool> EnableScrapRarityChanges; private ConfigEntry<bool> EnableScrapHandednessChanges; private ConfigEntry<bool> EnableScrapConductivityChanges; private ConfigEntry<int> MeteorShowerChance; public PluginConfig() { ScrapConfigs = new Dictionary<string, ScrapConfig>(); } public void BindConfig(ConfigFile config) { EnableScrapValueChanges = config.Bind<bool>("General", "EnableScrapValueChanges", true, "Whether to apply scrap value changes, false to disable for all items"); EnableScrapWeightChanges = config.Bind<bool>("General", "EnableScrapWeightChanges", true, "Whether to apply scrap weight changes, false to disable for all items"); EnableScrapRarityChanges = config.Bind<bool>("General", "EnableScrapRarityChanges", true, "Whether to apply scrap rarity changes, false to disable for all items"); EnableScrapHandednessChanges = config.Bind<bool>("General", "EnableScrapHandednessChanges", true, "Whether to apply scrap handedness changes, false to disable for all items"); EnableScrapConductivityChanges = config.Bind<bool>("General", "EnableScrapConductivityChanges", true, "Whether to apply scrap conductivity changes, false to disable for all items"); MeteorShowerChance = config.Bind<int>("Weather and Events", "MeteorShowerChance", -1, "The chance of a meteor shower (-1 = default, 0 = never, 7 = 0.7%, 1000 = 100%)"); BuildAndStoreScrapConfig(config, "Apparatus", "Apparatus Properties", useRarities: false); BuildAndStoreScrapConfig(config, "Key", "Key Properties", useRarities: false, usePriceRange: false); string[] sCRAPS = SCRAPS; foreach (string item in sCRAPS) { BuildAndStoreScrapConfig(config, item); } } private void BuildAndStoreScrapConfig(ConfigFile config, string item, string category = null, bool useRarities = true, bool usePriceRange = true) { ScrapConfigs[item] = BuildScrapConfig(config, item, category, useRarities, usePriceRange); } private ScrapConfig BuildScrapConfig(ConfigFile config, string item, string category = null, bool useRarities = true, bool usePriceRange = true) { if (category == null) { category = item + " Properties"; } return new ScrapConfig(usePriceRange ? config.Bind<int>(category, item + "MinScrapValue", -1, "The minimum scrap value of " + item) : config.Bind<int>(category, item + "ScrapValue", -1, "The scrap value of " + item), usePriceRange ? config.Bind<int>(category, item + "MaxScrapValue", -1, "The maximum scrap value of " + item) : null, config.Bind<float>(category, item + "ScrapWeight", -1f, "The weight scrap value of " + item), useRarities ? BuildScrapConfigRarities(config, item, category) : null, config.Bind<ScrapHandedness>(category, item + "ScrapTwoHanded", ScrapHandedness.Default, "Whether the item " + item + " is two handed"), config.Bind<ScrapConductivity>(category, item + "ScrapConductivity", ScrapConductivity.Default, "Whether the item " + item + " is conductive")); } public Dictionary<string, ConfigEntry<int>> BuildScrapConfigRarities(ConfigFile config, string item, string category) { Dictionary<string, ConfigEntry<int>> dictionary = new Dictionary<string, ConfigEntry<int>>(); string[] lEVELS = LEVELS; foreach (string text in lEVELS) { dictionary[text] = config.Bind<int>(category, item + "ScrapRarity" + text, -1, "The scrap rarity of " + item + " on " + text + "(-1 to use default)"); } return dictionary; } public int CalculateMeteorShowerChance() { return MeteorShowerChance.Value; } public bool ShouldApplyScrapValueChanges() { return EnableScrapValueChanges.Value; } public bool ShouldApplyScrapWeightChanges() { return EnableScrapWeightChanges.Value; } public bool ShouldApplyScrapRarityChanges() { return EnableScrapRarityChanges.Value; } public bool ShouldApplyScrapHandednessChanges() { return EnableScrapHandednessChanges.Value; } public bool ShouldApplyScrapConductivityChanges() { return EnableScrapConductivityChanges.Value; } public bool ShouldApplyAnyChanges() { return ShouldApplyScrapValueChanges() || ShouldApplyScrapWeightChanges() || ShouldApplyScrapRarityChanges() || ShouldApplyScrapHandednessChanges() || ShouldApplyScrapConductivityChanges(); } public ScrapConfig FetchScrapConfig(string item) { return ScrapConfigs[item]; } public bool HasScrapConfig(string item) { return ScrapConfigs.ContainsKey(item); } public static string SanitizeScrapKey(string key) { return new CultureInfo("en-US", useUserOverride: false).TextInfo.ToTitleCase(key.Replace("-", " ").ToLower()).Replace(" ", ""); } } internal readonly record struct ScrapConfig(ConfigEntry<int> minValue, ConfigEntry<int> maxValue, ConfigEntry<float> weight, Dictionary<string, ConfigEntry<int>> rarities, ConfigEntry<ScrapHandedness> twoHanded, ConfigEntry<ScrapConductivity> conductive); internal enum ScrapHandedness { Default, OneHanded, TwoHanded } internal enum ScrapConductivity { Default, Conductive, NonConductive } internal class ScrapValueCalculator { public const double BASE_SCRAP_MULTIPLIER = 2.5; public const float WEIGHT_MULTIPLIER = 105f; internal static void ApplyForItem(string sceneName, SpawnableItemWithRarity item) { Item spawnableItem = item.spawnableItem; string text = PluginConfig.SanitizeScrapKey(spawnableItem.itemName); if (!HasScrapConfig(text) || !Plugin.Instance.PluginConfig.ShouldApplyAnyChanges()) { Plugin.Instance.PluginLogger.LogDebug((object)("Item " + text + " has no scrap config, leaving numbers as default.")); return; } Plugin.Instance.PluginLogger.LogDebug((object)("Item " + text + " has a scrap config, applying custom values...")); int num = CalculateScrapMinValue(text); int num2 = CalculateScrapMaxValue(text); if (num > num2 && num2 >= 0) { Plugin.Instance.PluginLogger.LogWarning((object)" - Item min value is greater than max value. Swapping..."); int num3 = num2; num = num2; num2 = num3; } if (num >= 0 && Plugin.Instance.PluginConfig.ShouldApplyScrapValueChanges()) { Plugin.Instance.PluginLogger.LogDebug((object)(" - Min Value: " + num)); spawnableItem.minValue = num; } else { Plugin.Instance.PluginLogger.LogDebug((object)" - Min Value: DEFAULT"); } if (num2 >= 0 && Plugin.Instance.PluginConfig.ShouldApplyScrapValueChanges()) { Plugin.Instance.PluginLogger.LogDebug((object)(" - Max Value: " + num2)); spawnableItem.maxValue = num2; } else { Plugin.Instance.PluginLogger.LogDebug((object)" - Max Value: DEFAULT"); } float num4 = CalculateScrapWeight(text); float weight = CalculateScrapInternalWeight(text); if (num4 >= 0f && Plugin.Instance.PluginConfig.ShouldApplyScrapWeightChanges()) { Plugin.Instance.PluginLogger.LogDebug((object)(" - Weight: " + num4 + " (" + weight + ")")); spawnableItem.weight = weight; } else { Plugin.Instance.PluginLogger.LogDebug((object)" - Weight: DEFAULT"); } int num5 = CalculateScrapRarity(text, sceneName); if (num5 >= 0 && Plugin.Instance.PluginConfig.ShouldApplyScrapRarityChanges()) { Plugin.Instance.PluginLogger.LogDebug((object)(" - Rarity (" + sceneName + "): " + num5)); item.rarity = num5; } else { Plugin.Instance.PluginLogger.LogDebug((object)(" - Rarity (" + sceneName + "): DEFAULT")); } if (Plugin.Instance.PluginConfig.ShouldApplyScrapHandednessChanges()) { ApplyItemTwoHanded(text, spawnableItem); } if (Plugin.Instance.PluginConfig.ShouldApplyScrapConductivityChanges()) { ApplyItemConductive(text, spawnableItem); } } internal static int CalculateApparatusScrapValue() { ScrapConfig scrapConfig = Plugin.Instance.PluginConfig.FetchScrapConfig("Apparatus"); int num = scrapConfig.minValue.Value; int num2 = scrapConfig.maxValue.Value; if (num < 0 && num2 < 0) { return -1; } if (num < 0) { num = 80; } if (num2 < 0) { num2 = 80; } if (num == num2) { return num; } if (num > num2) { Plugin.Instance.PluginLogger.LogWarning((object)" - Item min value is greater than max value. Swapping..."); int num3 = num2; num = num2; num2 = num3; } return RoundManager.Instance.AnomalyRandom.Next(num, num2); } internal static float CalculateApparatusScrapWeight() { ScrapConfig scrapConfig = Plugin.Instance.PluginConfig.FetchScrapConfig("Apparatus"); if (scrapConfig.weight.Value < 0f) { return -1f; } return CalculateInternalWeight(scrapConfig.weight.Value); } internal static ScrapHandedness CalculateApparatusTwoHanded() { return Plugin.Instance.PluginConfig.FetchScrapConfig("Apparatus").twoHanded.Value; } internal static void ApplyApparatusTwoHanded(Item properties) { switch (CalculateApparatusTwoHanded()) { case ScrapHandedness.OneHanded: DisableItemTwoHanded(properties); break; case ScrapHandedness.TwoHanded: EnableItemTwoHanded(properties); break; case ScrapHandedness.Default: break; } } internal static ScrapConductivity CalculateApparatusConductive() { return Plugin.Instance.PluginConfig.FetchScrapConfig("Apparatus").conductive.Value; } internal static void ApplyApparatusConductive(Item properties) { switch (CalculateApparatusConductive()) { case ScrapConductivity.NonConductive: properties.isConductiveMetal = false; break; case ScrapConductivity.Conductive: properties.isConductiveMetal = true; break; case ScrapConductivity.Default: break; } } internal static bool HasScrapConfig(string item) { return Plugin.Instance.PluginConfig.HasScrapConfig(item); } internal static int CalculateScrapMinValue(string item) { return (int)Math.Floor((double)Plugin.Instance.PluginConfig.FetchScrapConfig(item).minValue.Value * 2.5); } internal static int CalculateScrapMaxValue(string item) { return (int)Math.Floor((double)Plugin.Instance.PluginConfig.FetchScrapConfig(item).maxValue.Value * 2.5); } internal static float CalculateScrapWeight(string item) { return Plugin.Instance.PluginConfig.FetchScrapConfig(item).weight.Value; } internal static float CalculateScrapInternalWeight(string item) { return CalculateInternalWeight(CalculateScrapWeight(item)); } internal static int CalculateScrapRarity(string item, string scene) { ScrapConfig scrapConfig = Plugin.Instance.PluginConfig.FetchScrapConfig(item); if (!scrapConfig.rarities.ContainsKey(scene)) { return -1; } return scrapConfig.rarities[scene]?.Value ?? (-1); } internal static void ApplyItemTwoHanded(string item, Item properties) { if (HasScrapConfig(item)) { switch (Plugin.Instance.PluginConfig.FetchScrapConfig(item).twoHanded.Value) { case ScrapHandedness.OneHanded: DisableItemTwoHanded(properties); break; case ScrapHandedness.TwoHanded: EnableItemTwoHanded(properties); break; case ScrapHandedness.Default: break; } } } internal static void ApplyItemConductive(string item, Item properties) { if (HasScrapConfig(item)) { switch (Plugin.Instance.PluginConfig.FetchScrapConfig(item).conductive.Value) { case ScrapConductivity.NonConductive: properties.isConductiveMetal = false; break; case ScrapConductivity.Conductive: properties.isConductiveMetal = true; break; case ScrapConductivity.Default: break; } } } internal static void EnableItemTwoHanded(Item properties) { properties.twoHanded = true; properties.twoHandedAnimation = true; properties.grabAnim = "HoldLung"; } internal static void DisableItemTwoHanded(Item properties) { properties.twoHanded = false; properties.twoHandedAnimation = false; properties.grabAnim = ""; } internal static float CalculateInternalWeight(float weight) { return weight / 105f + 1f; } internal static void ApplyForClipboard(ClipboardItem item) { ((GrabbableObject)item).itemProperties.isScrap = false; ((GrabbableObject)item).itemProperties.minValue = 0; ((GrabbableObject)item).itemProperties.maxValue = 0; ((GrabbableObject)item).SetScrapValue(0); } internal static void ApplyForKey(KeyItem item) { Item itemProperties = ((GrabbableObject)item).itemProperties; Plugin.Instance.PluginLogger.LogDebug((object)"Item Key has a scrap config, applying custom values..."); itemProperties.isScrap = true; int value = Plugin.Instance.PluginConfig.FetchScrapConfig("Key").minValue.Value; if (value >= 0 && Plugin.Instance.PluginConfig.ShouldApplyScrapValueChanges()) { Plugin.Instance.PluginLogger.LogDebug((object)(" - Value: " + value)); itemProperties.minValue = value; itemProperties.maxValue = value; ((GrabbableObject)item).SetScrapValue(value); } float num = CalculateScrapWeight("Key"); float weight = CalculateScrapInternalWeight("Key"); if (num >= 0f && Plugin.Instance.PluginConfig.ShouldApplyScrapWeightChanges()) { Plugin.Instance.PluginLogger.LogDebug((object)(" - Weight: " + num + " (" + weight + ")")); itemProperties.weight = weight; } else { Plugin.Instance.PluginLogger.LogDebug((object)" - Weight: DEFAULT"); } if (Plugin.Instance.PluginConfig.ShouldApplyScrapHandednessChanges()) { ApplyItemTwoHanded("Key", itemProperties); } if (Plugin.Instance.PluginConfig.ShouldApplyScrapConductivityChanges()) { ApplyItemConductive("Key", itemProperties); } } } } namespace CevaScrapRebalance.Patch { [HarmonyPatch(typeof(LungProp))] [HarmonyPatch("DisconnectFromMachinery")] internal class LungPropDisconnectFromMachineryPatch { public static void Postfix(LungProp __instance, ref IEnumerator __result) { try { Action prefixAction = delegate { Console.WriteLine("--> beginning"); }; Action postfixAction = delegate { Console.WriteLine("--> end"); HandleApparatusGrab(__instance); }; Action<object> preItemAction = delegate(object item) { Console.WriteLine($"--> before {item}"); }; Action<object> postItemAction = delegate(object item) { Console.WriteLine($"--> after {item}"); }; Func<object, object> itemAction = delegate(object item) { string text = item?.ToString() + "+"; Console.WriteLine($"--> item {item} => {text}"); return text; }; SimpleEnumerator simpleEnumerator = new SimpleEnumerator { enumerator = __result, prefixAction = prefixAction, postfixAction = postfixAction, preItemAction = preItemAction, postItemAction = postItemAction, itemAction = itemAction }; __result = simpleEnumerator.GetEnumerator(); } catch (Exception ex) { Plugin.Instance.PluginLogger.LogError((object)("Error in MimicDoorAttackPatch.Postfix: " + ex)); Plugin.Instance.PluginLogger.LogError((object)ex.StackTrace); } } private static void HandleApparatusGrab(LungProp apparatus) { //IL_001c: Unknown result type (might be due to invalid IL or missing references) Plugin.Instance.PluginLogger.LogInfo((object)"Apparatus retrieved, fixing properties..."); NetworkRPC.BroadcastApparatusValueServerRpc(NetworkObjectReference.op_Implicit(((Component)apparatus).gameObject)); } } internal class SimpleEnumerator : IEnumerable { public IEnumerator enumerator; public Action prefixAction; public Action postfixAction; public Action<object> preItemAction; public Action<object> postItemAction; public Func<object, object> itemAction; IEnumerator IEnumerable.GetEnumerator() { return GetEnumerator(); } public IEnumerator GetEnumerator() { prefixAction(); while (enumerator.MoveNext()) { object item = enumerator.Current; preItemAction(item); yield return itemAction(item); postItemAction(item); } postfixAction(); } } [HarmonyPatch(typeof(GrabbableObject))] [HarmonyPatch("Start")] internal class GrabbableObjectStartPatch2 { public static void Postfix(GrabbableObject __instance) { //IL_0025: Unknown result type (might be due to invalid IL or missing references) //IL_002f: Expected O, but got Unknown if (__instance is ClipboardItem) { Plugin.Instance.PluginLogger.LogInfo((object)"Clipboard spawned, applying Clipboard values..."); ScrapValueCalculator.ApplyForClipboard((ClipboardItem)__instance); } } } [HarmonyPatch(typeof(RoundManager))] [HarmonyPatch("Start")] internal class RoundManagerStartPatch { public static void Postfix(RoundManager __instance) { if (Plugin.Instance.PluginConfig.ShouldApplyAnyChanges()) { Plugin.Instance.PluginLogger.LogInfo((object)"Game initialized, applying custom Key values..."); ApplyForKey(__instance); } } private static void ApplyForKey(RoundManager instance) { KeyItem component = instance.keyPrefab.GetComponent<KeyItem>(); if ((Object)(object)component == (Object)null) { Plugin.Instance.PluginLogger.LogError((object)"Could not retrieve key prefab from RoundManager!"); } else { ScrapValueCalculator.ApplyForKey(component); } } } [HarmonyPatch(typeof(GrabbableObject))] [HarmonyPatch("Start")] internal class GrabbableObjectStartPatch1 { public static void Postfix(GrabbableObject __instance) { //IL_003d: Unknown result type (might be due to invalid IL or missing references) //IL_0047: Expected O, but got Unknown if (Plugin.Instance.PluginConfig.ShouldApplyAnyChanges() && __instance is KeyItem) { Plugin.Instance.PluginLogger.LogInfo((object)"Key spawned, applying custom Key values..."); ScrapValueCalculator.ApplyForKey((KeyItem)__instance); } } } [HarmonyPatch(typeof(TimeOfDay))] [HarmonyPatch("Start")] internal class TimeOfDayStartPatch { public static void Postfix(TimeOfDay __instance) { int num = Plugin.Instance.PluginConfig.CalculateMeteorShowerChance(); if (num >= 0) { Plugin.Instance.PluginLogger.LogInfo((object)"Game initialized, applying Meteor Shower values..."); __instance.overrideMeteorChance = num; } else { Plugin.Instance.PluginLogger.LogInfo((object)"Game initialized, leaving Meteor Shower values at default..."); } } } [HarmonyPatch(typeof(StartOfRound))] [HarmonyPatch("Start")] internal class StartOfRoundStartPatch { public static void Postfix(StartOfRound __instance) { if (Plugin.Instance.PluginConfig.ShouldApplyAnyChanges()) { Plugin.Instance.PluginLogger.LogInfo((object)"Game initialized, applying custom scrap values..."); ApplyForLevels(__instance.levels); } } private static void ApplyForLevels(SelectableLevel[] levels) { if (!Plugin.Instance.PluginConfig.ShouldApplyAnyChanges()) { return; } foreach (SelectableLevel val in levels) { foreach (SpawnableItemWithRarity item in val.spawnableScrap) { ScrapValueCalculator.ApplyForItem(val.sceneName, item); } } } } } namespace System.Runtime.CompilerServices { internal static class IsExternalInit { } }