Some mods target the Mono version of the game, which is available by opting into the Steam beta branch "alternate"
Decompiled source of Property Upgrades v1.0.5
Mods/PropertyUpgrades_Mono.dll
Decompiled 2 months agousing System; using System.Collections; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Linq; using System.Reflection; using System.Resources; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using System.Security; using System.Security.Permissions; using FluffyUnderware.DevTools.Extensions; using HarmonyLib; using MelonLoader; using MelonLoader.Preferences; using MelonLoader.Utils; using Microsoft.CodeAnalysis; using Newtonsoft.Json; using Newtonsoft.Json.Linq; using PropertyUpgrades; using PropertyUpgrades.BuilderNPC; using S1API.Entities; using S1API.Messaging; using ScheduleOne.Delivery; using ScheduleOne.DevUtilities; using ScheduleOne.EntityFramework; using ScheduleOne.Money; using ScheduleOne.NPCs; using ScheduleOne.ObjectScripts; using ScheduleOne.Persistence; using ScheduleOne.PlayerScripts; using ScheduleOne.Property; using UnityEngine; using UnityEngine.Events; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: MelonInfo(typeof(Core), "PropertyUpgrades", "1.0.4", "weedeej", null)] [assembly: MelonGame("TVGS", "Schedule I")] [assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")] [assembly: IgnoresAccessChecksTo("Assembly-CSharp")] [assembly: AssemblyCompany("PropertyUpgrades")] [assembly: AssemblyConfiguration("Release")] [assembly: AssemblyFileVersion("1.0.4")] [assembly: AssemblyInformationalVersion("1.0.0+e007300a0b716f453436826d262fb203eaf6eac9")] [assembly: AssemblyProduct("PropertyUpgrades")] [assembly: AssemblyTitle("PropertyUpgrades")] [assembly: NeutralResourcesLanguage("en-US")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("1.0.4.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; } } } public class GroundDetector : MonoBehaviour { [Header("Detection Settings")] [Tooltip("How far down from the origin point to check.")] [SerializeField] private float detectionDistance = 1.1f; [Tooltip("Which physics layers should be considered 'ground' or 'interactable below'?")] [SerializeField] private LayerMask groundLayerMask; [Tooltip("Optional offset from the player's transform position to start the raycast.")] [SerializeField] private Vector3 originOffset = Vector3.zero; [Tooltip("Should the detection ignore trigger colliders? Usually true for ground checks.")] [SerializeField] private QueryTriggerInteraction triggerInteraction = (QueryTriggerInteraction)1; private GameObject _objectCurrentlyUnderneath; public GameObject ObjectCurrentlyUnderneath => _objectCurrentlyUnderneath; private void Start() { //IL_000b: Unknown result type (might be due to invalid IL or missing references) //IL_0010: Unknown result type (might be due to invalid IL or missing references) groundLayerMask = LayerMask.op_Implicit(LayerMask.NameToLayer("Invisible")); } private void Update() { _objectCurrentlyUnderneath = FindObjectUnderneathRaycast(); } public GameObject FindObjectUnderneathRaycast() { //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_000c: Unknown result type (might be due to invalid IL or missing references) //IL_0011: Unknown result type (might be due to invalid IL or missing references) //IL_0016: Unknown result type (might be due to invalid IL or missing references) //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_002f: Unknown result type (might be due to invalid IL or missing references) RaycastHit val = default(RaycastHit); if (Physics.Raycast(((Component)this).transform.position + originOffset, Vector3.down, ref val, detectionDistance, LayerMask.op_Implicit(groundLayerMask), triggerInteraction)) { if ((Object)(object)((Component)((RaycastHit)(ref val)).collider).transform == (Object)(object)((Component)this).transform && (Object)(object)((Component)((RaycastHit)(ref val)).collider).gameObject == (Object)(object)((Component)this).gameObject) { return null; } return ((Component)((RaycastHit)(ref val)).collider).gameObject; } return null; } public static GameObject GetObjectUnderneath(Transform originTransform, float distance, LayerMask layers, Vector3 offset = default(Vector3), QueryTriggerInteraction queryTriggers = 1) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_0007: Unknown result type (might be due to invalid IL or missing references) //IL_000c: Unknown result type (might be due to invalid IL or missing references) //IL_0014: Unknown result type (might be due to invalid IL or missing references) //IL_001a: Unknown result type (might be due to invalid IL or missing references) RaycastHit val = default(RaycastHit); if (Physics.Raycast(originTransform.position + offset, Vector3.down, ref val, distance, LayerMask.op_Implicit(layers), queryTriggers)) { if ((Object)(object)((Component)((RaycastHit)(ref val)).collider).transform == (Object)(object)originTransform) { return null; } return ((Component)((RaycastHit)(ref val)).collider).gameObject; } return null; } } namespace PropertyUpgrades { [HarmonyPatch(typeof(Property), "Awake")] public static class PropertyAwakePatch { public static void Postfix(Property __instance) { if (!(__instance.PropertyName == "RV")) { ModSaveManager modSaveManager = new ModSaveManager().Load(); if (modSaveManager.saveData.ContainsKey(__instance.PropertyName)) { PropertyData propertyData = modSaveManager.saveData[__instance.PropertyName]; ModUtilities.ApplyPropertyData(__instance, propertyData); } } } } [HarmonyPatch(typeof(MixingStation), "Start")] public static class MixtimePatch { public static void Postfix(MixingStation __instance) { string propertyName = ((BuildableItem)__instance).ParentProperty.PropertyName; if (!(propertyName == "RV")) { ModSaveManager modSaveManager = new ModSaveManager().LoadTemp(); int mixTimePerItemReduction = modSaveManager.saveData[propertyName].MixTimePerItemReduction; if (modSaveManager.saveData.ContainsKey(propertyName) && mixTimePerItemReduction > 0) { ModUtilities.ApplyMixingUpgrade(__instance, mixTimePerItemReduction); } } } } public class Core : MelonMod { [CompilerGenerated] private sealed class <DelayedStart>d__2 : IEnumerator<object>, IEnumerator, IDisposable { private int <>1__state; private object <>2__current; object IEnumerator<object>.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public <DelayedStart>d__2(int <>1__state) { this.<>1__state = <>1__state; } [DebuggerHidden] void IDisposable.Dispose() { <>1__state = -2; } private bool MoveNext() { //IL_001d: Unknown result type (might be due to invalid IL or missing references) //IL_0027: Expected O, but got Unknown //IL_004e: Unknown result type (might be due to invalid IL or missing references) //IL_0058: Expected O, but got Unknown switch (<>1__state) { default: return false; case 0: <>1__state = -1; <>2__current = (object)new WaitForSeconds(3f); <>1__state = 1; return true; case 1: { <>1__state = -1; ModSaveManager modSaveManager = new ModSaveManager(); Singleton<SaveManager>.Instance.onSaveStart.AddListener(new UnityAction(modSaveManager.Save)); Builder.InitBuilder(modSaveManager); return false; } } } bool IEnumerator.MoveNext() { //ILSpy generated this explicit interface implementation from .override directive in MoveNext return this.MoveNext(); } [DebuggerHidden] void IEnumerator.Reset() { throw new NotSupportedException(); } } public override void OnInitializeMelon() { MelonPreferences.Load(); MelonPreferences.CreateCategory("PropertyUpgrades", "Property Upgrades"); MelonPreferences.CreateEntry<int>("PropertyUpgrades", "MaxEmployeeCount", 15, "Max Employee Count", "Maximum employee count a property can have", false, false, (ValueValidator)null); MelonPreferences.CreateEntry<int>("PropertyUpgrades", "MaxLoadingDocks", 5, "Max Loading Docks", "Maximum loading docks a player can buy for a property", false, false, (ValueValidator)null); MelonPreferences.CreateEntry<double>("PropertyUpgrades", "MaxAdditionalGrowthRate", 5.0, "Max Add Growth Rate", "Maximum additional growth rate a player can get", false, false, (ValueValidator)null); MelonPreferences.CreateEntry<int>("PropertyUpgrades", "MaxMixTimeReduction", 4, "Max Mix Time Reduction", "Maximum time(seconds) PER ITEM reduction a mixer can have (mk1 & 2)", false, false, (ValueValidator)null); MelonPreferences.CreateCategory("PropertyUpgrades_Translation", "Property Upgrades Translation").SetFilePath(Path.Combine(MelonEnvironment.UserDataDirectory, "PropertyUpgrades_Translation.cfg")); MelonPreferences.CreateEntry<string>("PropertyUpgrades_Translation", "BuilderNPC_Name", "Builder", (string)null, (string)null, false, false, (ValueValidator)null); MelonPreferences.CreateEntry<string>("PropertyUpgrades_Translation", "ResetMessage", "Hello! I'm the Builder. I can help you with property upgrades.", (string)null, (string)null, false, false, (ValueValidator)null); MelonPreferences.CreateEntry<string>("PropertyUpgrades_Translation", "WhatElse", "What else do you want to do?", (string)null, (string)null, false, false, (ValueValidator)null); MelonPreferences.CreateEntry<string>("PropertyUpgrades_Translation", "EmployeeUpgrade", "Employee upgrade at ({{PropertyName}}) completed", "EmployeeUpgrade", "Do not remove '{{PropertyName}}'", false, false, (ValueValidator)null); MelonPreferences.CreateEntry<string>("PropertyUpgrades_Translation", "PotUpgrade", "Plant Growth upgrade at ({{PropertyName}}) completed", "PotUpgrade", "Do not remove '{{PropertyName}}'", false, false, (ValueValidator)null); MelonPreferences.CreateEntry<string>("PropertyUpgrades_Translation", "MixerUpgrade", "Mixing time upgrade at ({{PropertyName}}) completed", "MixerUpgrade", "Do not remove '{PropertyName}}'", false, false, (ValueValidator)null); MelonPreferences.CreateEntry<string>("PropertyUpgrades_Translation", "LoadingDockUpgrade", "Loading Dock upgrade at ({{PropertyName}}) completed", "LoadingDockUpgrade", "Do not remove '{{PropertyName}}'", false, false, (ValueValidator)null); MelonPreferences.CreateEntry<string>("PropertyUpgrades_Translation", "NoBankBalance", "You don't have enough money in the bank for this upgrade.", (string)null, (string)null, false, false, (ValueValidator)null); MelonPreferences.CreateEntry<string>("PropertyUpgrades_Translation", "GoBack", "Go back", (string)null, (string)null, false, false, (ValueValidator)null); MelonPreferences.CreateEntry<string>("PropertyUpgrades_Translation", "AddEmployee", "+1 Employee (${{Price}})", "AddEmployee", "Do not remove '{{Price}}'", false, false, (ValueValidator)null); MelonPreferences.CreateEntry<string>("PropertyUpgrades_Translation", "AddPlantGrowth", "+0.25 Plant Growth (${{Price}})", "AddPlantGrowth", "Do not remove '{{Price}}'", false, false, (ValueValidator)null); MelonPreferences.CreateEntry<string>("PropertyUpgrades_Translation", "AddLoadingDock", "+1 Loading Dock (${{Price}})", "AddLoadingDock", "Do not remove '{{Price}}'", false, false, (ValueValidator)null); MelonPreferences.CreateEntry<string>("PropertyUpgrades_Translation", "ReduceMixTime", "-1s MixTime Per Item (${{Price}})", "ReduceMixTime", "Do not remove '{{Price}}'", false, false, (ValueValidator)null); MelonPreferences.CreateEntry<string>("PropertyUpgrades_Translation", "NoUpgrades", "{{PropertyName}} no longer have available upgrades.", "Do not remove '{{PropertyName}}'", (string)null, false, false, (ValueValidator)null); MelonPreferences.CreateEntry<string>("PropertyUpgrades_Translation", "PropertyStats", "{{PropertyName}} Stats:\nEmployee Capacity: {{employeeCap}}\nAddtional Growth Rate: {{ExtraGrowSpeedMultiplier}}\nMix time reduction: -{{MixTimePerItemReduction}}s\nExtra Docks: {{ExtraLoadingDocksCount}}\n\nWhat would you like to do?", "PropertyStats", "Do not remove/change strings enclosed in {{}}", false, false, (ValueValidator)null); MelonPreferences.CreateEntry<string>("PropertyUpgrades_Translation", "StandOnTopOfDock", "You need to stand on top of the of the extra loading dock.", (string)null, (string)null, false, false, (ValueValidator)null); MelonPreferences.CreateEntry<string>("PropertyUpgrades_Translation", "DockRemoved", "Loading dock removed.", (string)null, (string)null, false, false, (ValueValidator)null); MelonPreferences.CreateEntry<string>("PropertyUpgrades_Translation", "InPlace", "I'm in place", (string)null, (string)null, false, false, (ValueValidator)null); MelonPreferences.CreateEntry<string>("PropertyUpgrades_Translation", "WhichProperty", "I can help you with that. Which property would you like to upgrade?", (string)null, (string)null, false, false, (ValueValidator)null); MelonPreferences.CreateEntry<string>("PropertyUpgrades_Translation", "IdkWhichProperty", "I don't know which property you want to upgrade.", (string)null, (string)null, false, false, (ValueValidator)null); MelonPreferences.CreateEntry<string>("PropertyUpgrades_Translation", "MoveToWhere", "Move to the location you want {{entity}} placed.", "MoveToWhere", "Do not remove/change strings enclosed in {{}}", false, false, (ValueValidator)null); MelonPreferences.CreateEntry<string>("PropertyUpgrades_Translation", "UpgradeProperty", "Upgrade Property", (string)null, (string)null, false, false, (ValueValidator)null); MelonPreferences.CreateEntry<string>("PropertyUpgrades_Translation", "RemoveDock", "Remove Loading Dock", (string)null, (string)null, false, false, (ValueValidator)null); MelonPreferences.Save(); ModSaveManager.ClearTemp(); ((MelonBase)this).LoggerInstance.Msg("Initialized."); } public override void OnSceneWasLoaded(int buildIndex, string sceneName) { ((MelonMod)this).OnSceneWasLoaded(buildIndex, sceneName); if (!(sceneName != "Main")) { MelonCoroutines.Start(DelayedStart()); } } [IteratorStateMachine(typeof(<DelayedStart>d__2))] private IEnumerator DelayedStart() { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new <DelayedStart>d__2(0); } } public class ExtraLoadingDock { [JsonProperty("Position")] [JsonConverter(typeof(Vector3Converter))] public Vector3 Position { get; set; } [JsonProperty("Rotation")] [JsonConverter(typeof(Vector3Converter))] public Vector3 Rotation { get; set; } } public class PropertyData { [JsonProperty("EmployeeCapacity")] public int EmployeeCapacity { get; set; } [JsonProperty("MixTimePerItemReduction")] public int MixTimePerItemReduction { get; set; } [JsonProperty("ExtraGrowSpeedMultiplier")] public float ExtraGrowSpeedMultiplier { get; set; } [JsonProperty("ExtraLoadingDocks")] public ExtraLoadingDock[] ExtraLoadingDocks { get; set; } } public class ModSaveManager { private string saveFilePath; private string tempSaveFilePath; public Dictionary<string, PropertyData> saveData = new Dictionary<string, PropertyData>(); public ModSaveManager() { string loadedGameFolderPath = Singleton<LoadManager>.Instance.LoadedGameFolderPath; int startIndex = loadedGameFolderPath.IndexOf("Saves\\") + 5; string[] array = loadedGameFolderPath.Substring(startIndex).Split(new char[1] { '\\' }, StringSplitOptions.RemoveEmptyEntries); saveFilePath = Path.Combine(MelonEnvironment.UserDataDirectory, "Property Upgrades", array[0] + "_" + array[1] + ".json"); tempSaveFilePath = Path.Combine(MelonEnvironment.UserDataDirectory, "Property Upgrades", "_temp_" + array[0] + "_" + array[1] + ".json"); if (!Directory.Exists(Path.Combine(MelonEnvironment.UserDataDirectory, "Property Upgrades"))) { Directory.CreateDirectory(Path.Combine(MelonEnvironment.UserDataDirectory, "Property Upgrades")); } } public void Save() { try { string contents = JsonConvert.SerializeObject((object)saveData, (Formatting)1); File.WriteAllText(saveFilePath, contents); } catch (Exception ex) { MelonLogger.Error("Failed to save data: " + ex.Message); } } public void SaveTemp() { try { string contents = JsonConvert.SerializeObject((object)saveData, (Formatting)1); File.WriteAllText(tempSaveFilePath, contents); } catch (Exception ex) { MelonLogger.Error("Failed to save data: " + ex.Message); } } public ModSaveManager Load() { if (!File.Exists(saveFilePath)) { return this; } string text = File.ReadAllText(saveFilePath); saveData = JsonConvert.DeserializeObject<Dictionary<string, PropertyData>>(text); return this; } public ModSaveManager LoadTemp() { if (!File.Exists(tempSaveFilePath) && !File.Exists(saveFilePath)) { return this; } string text = File.ReadAllText(File.Exists(tempSaveFilePath) ? tempSaveFilePath : saveFilePath); saveData = JsonConvert.DeserializeObject<Dictionary<string, PropertyData>>(text); return this; } public static void ClearTemp() { if (!Directory.Exists(Path.Combine(MelonEnvironment.UserDataDirectory, "Property Upgrades"))) { Directory.CreateDirectory(Path.Combine(MelonEnvironment.UserDataDirectory, "Property Upgrades")); } string[] files = Directory.GetFiles(Path.Combine(MelonEnvironment.UserDataDirectory, "Property Upgrades"), "_temp_*.json"); foreach (string path in files) { try { File.Delete(path); } catch (Exception ex) { MelonLogger.Error("Failed to delete temp file: " + ex.Message); } } } } public class Limits { public int MaxEmployeeCount; public int MaxLoadingDocks; public float MaxAdditionalGrowthRate; public int MaxMixTimeReduction; public Limits() { try { MaxEmployeeCount = MelonPreferences.GetEntryValue<int>("PropertyUpgrades", "MaxEmployeeCount"); MaxLoadingDocks = MelonPreferences.GetEntryValue<int>("PropertyUpgrades", "MaxLoadingDocks"); MaxAdditionalGrowthRate = Convert.ToSingle(MelonPreferences.GetEntryValue<double>("PropertyUpgrades", "MaxAdditionalGrowthRate")); MaxMixTimeReduction = MelonPreferences.GetEntryValue<int>("PropertyUpgrades", "MaxMixTimeReduction"); } catch (Exception arg) { MelonLogger.Error($"Failed to load limits: {arg}"); MaxEmployeeCount = 15; MaxLoadingDocks = 5; MaxAdditionalGrowthRate = 5f; MaxMixTimeReduction = 4; } } } public class ModUtilities { public static float PlayerYDistanceToSubtractForDecal = 0.9762f; public static T[] GetBuildableItemScriptsFromProperty<T>(Property property) where T : class { return (from x in property.BuildableItems where x is T select x as T).ToArray(); } public static Texture2D LoadCustomImage(string fileName, int width = 2, int height = 2) { //IL_001f: Unknown result type (might be due to invalid IL or missing references) //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_002b: Expected O, but got Unknown //IL_002d: Expected O, but got Unknown string path = Path.Combine(MelonEnvironment.UserDataDirectory, fileName); if (!File.Exists(path)) { return null; } byte[] array = File.ReadAllBytes(path); Texture2D val = new Texture2D(width, height); ImageConversion.LoadImage(val, array); return val; } public static void AddExtraDock(Property targetProperty, Vector3 playerPos, Quaternion playerRot, bool addToSaveManager = false, ModSaveManager saveManager = null) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_0008: Unknown result type (might be due to invalid IL or missing references) //IL_0014: Unknown result type (might be due to invalid IL or missing references) //IL_0025: Unknown result type (might be due to invalid IL or missing references) //IL_002e: Unknown result type (might be due to invalid IL or missing references) Vector3 position = default(Vector3); ((Vector3)(ref position))..ctor(playerPos.x, playerPos.y - PlayerYDistanceToSubtractForDecal, playerPos.z); ExtraLoadingDock extraLoadingDock = new ExtraLoadingDock { Position = position, Rotation = ((Quaternion)(ref playerRot)).eulerAngles }; AddExtraDock(targetProperty, extraLoadingDock); if (addToSaveManager && saveManager != null) { PropertyData propertyData = saveManager.saveData[targetProperty.PropertyName]; propertyData.ExtraLoadingDocks = propertyData.ExtraLoadingDocks.Append(extraLoadingDock).ToArray(); } } public static void AddExtraDock(Property targetProperty, ExtraLoadingDock loadingDock) { //IL_0118: Unknown result type (might be due to invalid IL or missing references) //IL_013a: Unknown result type (might be due to invalid IL or missing references) //IL_0140: Unknown result type (might be due to invalid IL or missing references) //IL_0145: Unknown result type (might be due to invalid IL or missing references) //IL_008f: Unknown result type (might be due to invalid IL or missing references) //IL_0095: Unknown result type (might be due to invalid IL or missing references) //IL_009a: Unknown result type (might be due to invalid IL or missing references) if (targetProperty.LoadingDockCount < 1) { MelonLogger.Msg((object)1); Property val = Property.Properties.Find((Property property) => property.PropertyName == "Barn"); MelonLogger.Msg((object)2); if ((Object)(object)val == (Object)null) { MelonLogger.Msg((object)3); MelonLogger.Error("Failed to find base property for loading dock: Barn"); return; } MelonLogger.Msg((object)4); GameObject gameObject = ((Component)val.LoadingDocks[0]).gameObject; MelonLogger.Msg((object)5); GameObject val2 = Object.Instantiate<GameObject>(gameObject, loadingDock.Position, Quaternion.Euler(loadingDock.Rotation)); MelonLogger.Msg((object)6); LoadingDock component = val2.GetComponent<LoadingDock>(); MelonLogger.Msg((object)7); component.ParentProperty = targetProperty; MelonLogger.Msg((object)8); targetProperty.LoadingDocks = targetProperty.LoadingDocks.Append(val2.GetComponent<LoadingDock>()).ToArray(); MelonLogger.Msg((object)9); } else { MelonLogger.Msg((object)10); MelonLogger.Msg($"Adding extra loading dock to {targetProperty.LoadingDockCount} at {loadingDock.Position}"); GameObject val3 = Object.Instantiate<GameObject>(((Component)targetProperty.LoadingDocks[0]).gameObject, loadingDock.Position, Quaternion.Euler(loadingDock.Rotation)); targetProperty.LoadingDocks = targetProperty.LoadingDocks.Append(val3.GetComponent<LoadingDock>()).ToArray(); } } public static void ApplyPropertyData(Property property, PropertyData propertyData) { //IL_0029: Unknown result type (might be due to invalid IL or missing references) //IL_0051: Unknown result type (might be due to invalid IL or missing references) //IL_0056: Unknown result type (might be due to invalid IL or missing references) //IL_005b: Unknown result type (might be due to invalid IL or missing references) //IL_005c: Unknown result type (might be due to invalid IL or missing references) //IL_005d: Unknown result type (might be due to invalid IL or missing references) if (property.EmployeeCapacity < propertyData.EmployeeCapacity) { int num = propertyData.EmployeeCapacity - property.EmployeeCapacity; for (int i = 0; i < num; i++) { Transform obj = property.EmployeeIdlePoints[0]; Vector3 val = obj.position + new Vector3(Random.Range(0f, 2f), 0f, Random.Range(0f, 2f)); Transform element = Object.Instantiate<Transform>(obj, val, Quaternion.identity); property.EmployeeIdlePoints = property.EmployeeIdlePoints.Append(element).ToArray(); } } property.EmployeeCapacity = propertyData.EmployeeCapacity; ExtraLoadingDock[] extraLoadingDocks = propertyData.ExtraLoadingDocks; foreach (ExtraLoadingDock loadingDock in extraLoadingDocks) { AddExtraDock(property, loadingDock); } } public static void ApplyMixingUpgrade(MixingStation mixingStation, int mixTimeReduction) { if (mixingStation.MixTimePerItem - mixTimeReduction <= 1) { mixingStation.MixTimePerItem = 1; } else { mixingStation.MixTimePerItem -= mixTimeReduction; } } } public class Vector3Converter : JsonConverter<Vector3> { public override void WriteJson(JsonWriter writer, Vector3 value, JsonSerializer serializer) { //IL_0012: Unknown result type (might be due to invalid IL or missing references) //IL_0029: Unknown result type (might be due to invalid IL or missing references) //IL_0040: Unknown result type (might be due to invalid IL or missing references) writer.WriteStartObject(); writer.WritePropertyName("x"); writer.WriteValue(value.x); writer.WritePropertyName("y"); writer.WriteValue(value.y); writer.WritePropertyName("z"); writer.WriteValue(value.z); writer.WriteEndObject(); } public override Vector3 ReadJson(JsonReader reader, Type objectType, Vector3 existingValue, bool hasExistingValue, JsonSerializer serializer) { //IL_005c: Unknown result type (might be due to invalid IL or missing references) JObject obj = JObject.Load(reader); JToken obj2 = obj["x"]; float num = ((obj2 != null) ? Extensions.Value<float>((IEnumerable<JToken>)obj2) : 0f); JToken obj3 = obj["y"]; float num2 = ((obj3 != null) ? Extensions.Value<float>((IEnumerable<JToken>)obj3) : 0f); JToken obj4 = obj["z"]; float num3 = ((obj4 != null) ? Extensions.Value<float>((IEnumerable<JToken>)obj4) : 0f); return new Vector3(num, num2, num3); } } } namespace PropertyUpgrades.BuilderNPC { public class Builder : NPC { [CompilerGenerated] private sealed class <ResetCoro>d__4 : IEnumerator<object>, IEnumerator, IDisposable { private int <>1__state; private object <>2__current; public ModSaveManager saveManager; object IEnumerator<object>.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public <ResetCoro>d__4(int <>1__state) { this.<>1__state = <>1__state; } [DebuggerHidden] void IDisposable.Dispose() { <>1__state = -2; } private bool MoveNext() { //IL_0037: Unknown result type (might be due to invalid IL or missing references) //IL_0041: Expected O, but got Unknown switch (<>1__state) { default: return false; case 0: <>1__state = -1; <>2__current = (object)new WaitUntil((Func<bool>)(() => NPC.Get<Builder>() != null)); <>1__state = 1; return true; case 1: <>1__state = -1; new ResponsesLogic(NPC.Get<Builder>(), saveManager); return false; } } bool IEnumerator.MoveNext() { //ILSpy generated this explicit interface implementation from .override directive in MoveNext return this.MoveNext(); } [DebuggerHidden] void IEnumerator.Reset() { throw new NotSupportedException(); } } public Builder() : base("builder_npc", MelonPreferences.GetEntryValue<string>("PropertyUpgrades_Translation", "BuilderNPC_Name"), "", (Sprite)null) { } public static Builder InitBuilder(ModSaveManager saveManager) { Builder builder = GetBuilder(); NPCManager.GetNPC("builder_npc").ConversationCanBeHidden = false; ResetConversation(saveManager); return builder; } public static Builder GetBuilder() { return (Builder)(object)NPC.Get<Builder>(); } public static void ResetConversation(ModSaveManager saveManager) { MelonCoroutines.Start(ResetCoro(saveManager)); } [IteratorStateMachine(typeof(<ResetCoro>d__4))] private static IEnumerator ResetCoro(ModSaveManager saveManager) { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new <ResetCoro>d__4(0) { saveManager = saveManager }; } } public class ResponsesLogic { public enum Action { UpgradeProperty, SetTargetProperty, PositionLoadingBay, RemoveLoadingDock } public enum PropertyUpgrade { AddEmployee, AddPlantGrowthMultipler, ReduceMixingTime, AddLoadingDock } [CompilerGenerated] private sealed class <>c__DisplayClass10_0 { public ResponsesLogic <>4__this; public float addLoadingBayPrice; internal void <ShowPositionLoadingBayResponse>b__0() { MelonCoroutines.Start(<>4__this.UpgradeProperty(PropertyUpgrade.AddLoadingDock, addLoadingBayPrice)); } internal void <ShowPositionLoadingBayResponse>b__1() { <>4__this.Reset(); } } [CompilerGenerated] private sealed class <>c__DisplayClass11_0 { public Property property; public ResponsesLogic <>4__this; internal void <ShowPropertiesResponse>b__0() { <>4__this.SendAction(Action.SetTargetProperty, property); } } [CompilerGenerated] private sealed class <>c__DisplayClass14_0 { public GroundDetector groundDetector; public LoadingDock loadingDock; internal bool <RemoveLoadingBay>b__0() { return (Object)(object)groundDetector.ObjectCurrentlyUnderneath != (Object)null; } internal bool <RemoveLoadingBay>b__1() { return (Object)(object)loadingDock != (Object)null; } internal bool <RemoveLoadingBay>b__2(ExtraLoadingDock dock) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0011: Unknown result type (might be due to invalid IL or missing references) return dock.Position != ((Component)loadingDock).transform.position; } } [CompilerGenerated] private sealed class <>c__DisplayClass15_0 { public ResponsesLogic <>4__this; public float addEmployeePrice; public float extraGrowSpeedPrice; public float mixTimeReductionPrice; internal void <ShowAvailableUpgradesResponse>b__0() { <>4__this.Reset(); } internal void <ShowAvailableUpgradesResponse>b__1() { MelonCoroutines.Start(<>4__this.UpgradeProperty(PropertyUpgrade.AddEmployee, addEmployeePrice)); } internal void <ShowAvailableUpgradesResponse>b__2() { <>4__this.SendAction(Action.PositionLoadingBay); } internal void <ShowAvailableUpgradesResponse>b__3() { MelonCoroutines.Start(<>4__this.UpgradeProperty(PropertyUpgrade.AddPlantGrowthMultipler, extraGrowSpeedPrice)); } internal void <ShowAvailableUpgradesResponse>b__4() { MelonCoroutines.Start(<>4__this.UpgradeProperty(PropertyUpgrade.ReduceMixingTime, mixTimeReductionPrice)); } } [CompilerGenerated] private sealed class <RemoveLoadingBay>d__14 : IEnumerator<object>, IEnumerator, IDisposable { private int <>1__state; private object <>2__current; public ResponsesLogic <>4__this; private <>c__DisplayClass14_0 <>8__1; private MoneyManager <moneyManager>5__2; object IEnumerator<object>.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public <RemoveLoadingBay>d__14(int <>1__state) { this.<>1__state = <>1__state; } [DebuggerHidden] void IDisposable.Dispose() { <>8__1 = null; <moneyManager>5__2 = null; <>1__state = -2; } private bool MoveNext() { //IL_008a: Unknown result type (might be due to invalid IL or missing references) //IL_0094: Expected O, but got Unknown //IL_014e: Unknown result type (might be due to invalid IL or missing references) //IL_0158: Expected O, but got Unknown int num = <>1__state; ResponsesLogic responsesLogic = <>4__this; switch (num) { default: return false; case 0: <>1__state = -1; <>8__1 = new <>c__DisplayClass14_0(); <>8__1.groundDetector = ((Component)responsesLogic.player).GetComponent<GroundDetector>(); if ((Object)(object)<>8__1.groundDetector == (Object)null) { <>8__1.groundDetector = ((Component)responsesLogic.player).gameObject.AddComponent<GroundDetector>(); } <>2__current = (object)new WaitUntil((Func<bool>)(() => (Object)(object)<>8__1.groundDetector.ObjectCurrentlyUnderneath != (Object)null)); <>1__state = 1; return true; case 1: <>1__state = -1; if (((Object)<>8__1.groundDetector.ObjectCurrentlyUnderneath).name != "Collider") { responsesLogic.Reset(MelonPreferences.GetEntryValue<string>("PropertyUpgrades_Translation", "StandOnTopOfDock")); MelonCoroutines.Start(responsesLogic.RemoveLoadingBay()); return false; } <moneyManager>5__2 = NetworkSingleton<MoneyManager>.Instance; if (<moneyManager>5__2.onlineBalance < 1000f) { responsesLogic.Reset(MelonPreferences.GetEntryValue<string>("PropertyUpgrades_Translation", "NoBankBalance")); return false; } <>8__1.loadingDock = <>8__1.groundDetector.ObjectCurrentlyUnderneath.GetComponentInParent<LoadingDock>(); <>2__current = (object)new WaitUntil((Func<bool>)(() => (Object)(object)<>8__1.loadingDock != (Object)null)); <>1__state = 2; return true; case 2: { <>1__state = -1; string text = <>8__1.loadingDock.ParentProperty.PropertyName.Trim(); PropertyData propertyData = responsesLogic.saveManager.saveData[text]; propertyData.ExtraLoadingDocks = propertyData.ExtraLoadingDocks.Where((ExtraLoadingDock dock) => dock.Position != ((Component)<>8__1.loadingDock).transform.position).ToArray(); <>8__1.loadingDock.ParentProperty.LoadingDocks = ArrayExt.Remove<LoadingDock>(<>8__1.loadingDock.ParentProperty.LoadingDocks, <>8__1.loadingDock); responsesLogic.Reset(MelonPreferences.GetEntryValue<string>("PropertyUpgrades_Translation", "DockRemoved")); Object.Destroy((Object)(object)((Component)<>8__1.loadingDock).gameObject); <moneyManager>5__2.CreateOnlineTransaction("Remove Loading Dock", -1000f, 1f, "Loading dock removal (" + text + ")"); return false; } } } bool IEnumerator.MoveNext() { //ILSpy generated this explicit interface implementation from .override directive in MoveNext return this.MoveNext(); } [DebuggerHidden] void IEnumerator.Reset() { throw new NotSupportedException(); } } [CompilerGenerated] private sealed class <ShowAvailableUpgradesResponse>d__15 : IEnumerator<object>, IEnumerator, IDisposable { private int <>1__state; private object <>2__current; public ResponsesLogic <>4__this; object IEnumerator<object>.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public <ShowAvailableUpgradesResponse>d__15(int <>1__state) { this.<>1__state = <>1__state; } [DebuggerHidden] void IDisposable.Dispose() { <>1__state = -2; } private bool MoveNext() { //IL_00c8: Unknown result type (might be due to invalid IL or missing references) //IL_00cd: Unknown result type (might be due to invalid IL or missing references) //IL_00e2: Unknown result type (might be due to invalid IL or missing references) //IL_00f9: Expected O, but got Unknown //IL_018d: Unknown result type (might be due to invalid IL or missing references) //IL_0192: Unknown result type (might be due to invalid IL or missing references) //IL_01b8: Unknown result type (might be due to invalid IL or missing references) //IL_01cf: Expected O, but got Unknown //IL_012f: Unknown result type (might be due to invalid IL or missing references) //IL_0134: Unknown result type (might be due to invalid IL or missing references) //IL_015e: Unknown result type (might be due to invalid IL or missing references) //IL_0175: Expected O, but got Unknown //IL_01e0: Unknown result type (might be due to invalid IL or missing references) //IL_01e5: Unknown result type (might be due to invalid IL or missing references) //IL_020f: Unknown result type (might be due to invalid IL or missing references) //IL_0226: Expected O, but got Unknown //IL_0237: Unknown result type (might be due to invalid IL or missing references) //IL_023c: Unknown result type (might be due to invalid IL or missing references) //IL_0266: Unknown result type (might be due to invalid IL or missing references) //IL_027d: Expected O, but got Unknown int num = <>1__state; ResponsesLogic responsesLogic = <>4__this; if (num != 0) { return false; } <>1__state = -1; <>c__DisplayClass15_0 CS$<>8__locals0 = new <>c__DisplayClass15_0 { <>4__this = <>4__this }; PropertyData propertyData = responsesLogic.saveManager.saveData[responsesLogic.targetProperty.PropertyName]; int employeeCapacity = propertyData.EmployeeCapacity; CS$<>8__locals0.addEmployeePrice = employeeCapacity * 1250; CS$<>8__locals0.mixTimeReductionPrice = (((float)propertyData.MixTimePerItemReduction == 0f) ? 5000f : ((float)propertyData.MixTimePerItemReduction * 5000f)); CS$<>8__locals0.extraGrowSpeedPrice = propertyData.ExtraGrowSpeedMultiplier * 5000f; float num2 = (((float)propertyData.ExtraLoadingDocks.Length == 0f) ? 10000f : ((float)propertyData.ExtraLoadingDocks.Length * 10000f)); List<Response> list = new List<Response> { new Response { Text = MelonPreferences.GetEntryValue<string>("PropertyUpgrades_Translation", "GoBack"), OnTriggered = delegate { CS$<>8__locals0.<>4__this.Reset(); } } }; Limits limits = new Limits(); if (responsesLogic.targetProperty.EmployeeCapacity < limits.MaxEmployeeCount && responsesLogic.targetProperty.PropertyName != "Motel Room") { list.Add(new Response { Text = MelonPreferences.GetEntryValue<string>("PropertyUpgrades_Translation", "AddEmployee").Replace("{{Price}}", CS$<>8__locals0.addEmployeePrice.ToString()), OnTriggered = delegate { MelonCoroutines.Start(CS$<>8__locals0.<>4__this.UpgradeProperty(PropertyUpgrade.AddEmployee, CS$<>8__locals0.addEmployeePrice)); } }); } if (responsesLogic.targetProperty.LoadingDocks.Length < limits.MaxLoadingDocks) { list.Add(new Response { Text = MelonPreferences.GetEntryValue<string>("PropertyUpgrades_Translation", "AddLoadingDock").Replace("{{Price}}", num2.ToString()), OnTriggered = delegate { CS$<>8__locals0.<>4__this.SendAction(Action.PositionLoadingBay); } }); } if (propertyData.ExtraGrowSpeedMultiplier < limits.MaxAdditionalGrowthRate) { list.Add(new Response { Text = MelonPreferences.GetEntryValue<string>("PropertyUpgrades_Translation", "AddPlantGrowth").Replace("{{Price}}", CS$<>8__locals0.extraGrowSpeedPrice.ToString()), OnTriggered = delegate { MelonCoroutines.Start(CS$<>8__locals0.<>4__this.UpgradeProperty(PropertyUpgrade.AddPlantGrowthMultipler, CS$<>8__locals0.extraGrowSpeedPrice)); } }); } if (propertyData.MixTimePerItemReduction < limits.MaxMixTimeReduction) { list.Add(new Response { Text = MelonPreferences.GetEntryValue<string>("PropertyUpgrades_Translation", "ReduceMixTime").Replace("{{Price}}", CS$<>8__locals0.mixTimeReductionPrice.ToString()), OnTriggered = delegate { MelonCoroutines.Start(CS$<>8__locals0.<>4__this.UpgradeProperty(PropertyUpgrade.ReduceMixingTime, CS$<>8__locals0.mixTimeReductionPrice)); } }); } if (list.Count == 1) { responsesLogic.Reset(MelonPreferences.GetEntryValue<string>("PropertyUpgrades_Translation", "NoUpgrades").Replace("{{PropertyName}}", responsesLogic.targetProperty.PropertyName)); return false; } string message = MelonPreferences.GetEntryValue<string>("PropertyUpgrades_Translation", "PropertyStats").Replace("{{PropertyName}}", responsesLogic.targetProperty.PropertyName).Replace("{{employeeCap}}", employeeCapacity.ToString()) .Replace("{{ExtraGrowSpeedMultiplier}}", propertyData.ExtraGrowSpeedMultiplier.ToString()) .Replace("{{MixTimePerItemReduction}}", propertyData.MixTimePerItemReduction.ToString()) .Replace("{{ExtraLoadingDocksCount}}", propertyData.ExtraLoadingDocks.Length.ToString()); responsesLogic.ShowResponses(list, message); return false; } bool IEnumerator.MoveNext() { //ILSpy generated this explicit interface implementation from .override directive in MoveNext return this.MoveNext(); } [DebuggerHidden] void IEnumerator.Reset() { throw new NotSupportedException(); } } [CompilerGenerated] private sealed class <ShowPositionLoadingBayResponse>d__10 : IEnumerator<object>, IEnumerator, IDisposable { private int <>1__state; private object <>2__current; public ResponsesLogic <>4__this; object IEnumerator<object>.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public <ShowPositionLoadingBayResponse>d__10(int <>1__state) { this.<>1__state = <>1__state; } [DebuggerHidden] void IDisposable.Dispose() { <>1__state = -2; } private bool MoveNext() { //IL_009f: Unknown result type (might be due to invalid IL or missing references) //IL_00a4: Unknown result type (might be due to invalid IL or missing references) //IL_00b9: Unknown result type (might be due to invalid IL or missing references) //IL_00d0: Expected O, but got Unknown //IL_00d1: Unknown result type (might be due to invalid IL or missing references) //IL_00d6: Unknown result type (might be due to invalid IL or missing references) //IL_00eb: Unknown result type (might be due to invalid IL or missing references) //IL_0102: Expected O, but got Unknown int num = <>1__state; ResponsesLogic responsesLogic = <>4__this; if (num != 0) { return false; } <>1__state = -1; <>c__DisplayClass10_0 CS$<>8__locals0 = new <>c__DisplayClass10_0 { <>4__this = <>4__this }; if ((Object)(object)responsesLogic.targetProperty == (Object)null) { responsesLogic.Reset(MelonPreferences.GetEntryValue<string>("PropertyUpgrades_Translation", "IdkWhichProperty")); return false; } PropertyData propertyData = responsesLogic.saveManager.saveData[responsesLogic.targetProperty.PropertyName]; CS$<>8__locals0.addLoadingBayPrice = (((float)propertyData.ExtraLoadingDocks.Length == 0f) ? 10000f : ((float)propertyData.ExtraLoadingDocks.Length * 10000f)); List<Response> responses = new List<Response> { new Response { Text = MelonPreferences.GetEntryValue<string>("PropertyUpgrades_Translation", "InPlace"), OnTriggered = delegate { MelonCoroutines.Start(CS$<>8__locals0.<>4__this.UpgradeProperty(PropertyUpgrade.AddLoadingDock, CS$<>8__locals0.addLoadingBayPrice)); } }, new Response { Text = MelonPreferences.GetEntryValue<string>("PropertyUpgrades_Translation", "GoBack"), OnTriggered = delegate { CS$<>8__locals0.<>4__this.Reset(); } } }; responsesLogic.ShowResponses(responses, MelonPreferences.GetEntryValue<string>("PropertyUpgrades_Translation", "MoveToWhere").Replace("{{entity}}", "loading bay")); return false; } bool IEnumerator.MoveNext() { //ILSpy generated this explicit interface implementation from .override directive in MoveNext return this.MoveNext(); } [DebuggerHidden] void IEnumerator.Reset() { throw new NotSupportedException(); } } [CompilerGenerated] private sealed class <ShowPropertiesResponse>d__11 : IEnumerator<object>, IEnumerator, IDisposable { private int <>1__state; private object <>2__current; public ResponsesLogic <>4__this; object IEnumerator<object>.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public <ShowPropertiesResponse>d__11(int <>1__state) { this.<>1__state = <>1__state; } [DebuggerHidden] void IDisposable.Dispose() { <>1__state = -2; } private bool MoveNext() { //IL_0067: Unknown result type (might be due to invalid IL or missing references) //IL_006c: Unknown result type (might be due to invalid IL or missing references) //IL_007e: Unknown result type (might be due to invalid IL or missing references) //IL_0093: Expected O, but got Unknown int num = <>1__state; ResponsesLogic responsesLogic = <>4__this; if (num != 0) { return false; } <>1__state = -1; MelonCoroutines.Start(responsesLogic.UpdateProperties()); List<Response> list = new List<Response>(); using (List<Property>.Enumerator enumerator = responsesLogic.ownedProperties.GetEnumerator()) { while (enumerator.MoveNext()) { <>c__DisplayClass11_0 CS$<>8__locals0 = new <>c__DisplayClass11_0 { <>4__this = responsesLogic, property = enumerator.Current }; if ((Object)(object)CS$<>8__locals0.property != (Object)null) { Response item = new Response { Text = CS$<>8__locals0.property.PropertyName, OnTriggered = delegate { CS$<>8__locals0.<>4__this.SendAction(Action.SetTargetProperty, CS$<>8__locals0.property); } }; list.Add(item); } } } responsesLogic.ShowResponses(list, MelonPreferences.GetEntryValue<string>("PropertyUpgrades_Translation", "WhichProperty")); return false; } bool IEnumerator.MoveNext() { //ILSpy generated this explicit interface implementation from .override directive in MoveNext return this.MoveNext(); } [DebuggerHidden] void IEnumerator.Reset() { throw new NotSupportedException(); } } [CompilerGenerated] private sealed class <ShowRemoveBayResponses>d__13 : IEnumerator<object>, IEnumerator, IDisposable { private int <>1__state; private object <>2__current; public ResponsesLogic <>4__this; object IEnumerator<object>.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public <ShowRemoveBayResponses>d__13(int <>1__state) { this.<>1__state = <>1__state; } [DebuggerHidden] void IDisposable.Dispose() { <>1__state = -2; } private bool MoveNext() { //IL_0020: Unknown result type (might be due to invalid IL or missing references) //IL_0025: Unknown result type (might be due to invalid IL or missing references) //IL_003a: Unknown result type (might be due to invalid IL or missing references) //IL_0051: Expected O, but got Unknown //IL_0052: Unknown result type (might be due to invalid IL or missing references) //IL_0057: Unknown result type (might be due to invalid IL or missing references) //IL_0076: Unknown result type (might be due to invalid IL or missing references) //IL_008d: Expected O, but got Unknown int num = <>1__state; ResponsesLogic CS$<>8__locals0 = <>4__this; if (num != 0) { return false; } <>1__state = -1; List<Response> responses = new List<Response> { new Response { Text = MelonPreferences.GetEntryValue<string>("PropertyUpgrades_Translation", "GoBack"), OnTriggered = delegate { CS$<>8__locals0.Reset(MelonPreferences.GetEntryValue<string>("PropertyUpgrades_Translation", "WhatElse")); } }, new Response { Text = MelonPreferences.GetEntryValue<string>("PropertyUpgrades_Translation", "InPlace") + "($1000)", OnTriggered = delegate { MelonCoroutines.Start(CS$<>8__locals0.RemoveLoadingBay()); } } }; CS$<>8__locals0.ShowResponses(responses, MelonPreferences.GetEntryValue<string>("PropertyUpgrades_Translation", "StandOnTopOfDock")); return false; } bool IEnumerator.MoveNext() { //ILSpy generated this explicit interface implementation from .override directive in MoveNext return this.MoveNext(); } [DebuggerHidden] void IEnumerator.Reset() { throw new NotSupportedException(); } } [CompilerGenerated] private sealed class <UpdateProperties>d__12 : IEnumerator<object>, IEnumerator, IDisposable { private int <>1__state; private object <>2__current; public ResponsesLogic <>4__this; public bool save; object IEnumerator<object>.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public <UpdateProperties>d__12(int <>1__state) { this.<>1__state = <>1__state; } [DebuggerHidden] void IDisposable.Dispose() { <>1__state = -2; } private bool MoveNext() { int num = <>1__state; ResponsesLogic CS$<>8__locals0 = <>4__this; if (num != 0) { return false; } <>1__state = -1; CS$<>8__locals0.ownedProperties = Property.OwnedProperties.Where(delegate(Property property) { if (property.PropertyName == "RV") { return false; } if (CS$<>8__locals0.saveManager.saveData.ContainsKey(property.PropertyName)) { return true; } PropertyData value = new PropertyData { EmployeeCapacity = property.EmployeeCapacity, MixTimePerItemReduction = 0, ExtraGrowSpeedMultiplier = 1f, ExtraLoadingDocks = Array.Empty<ExtraLoadingDock>() }; CS$<>8__locals0.saveManager.saveData.Add(property.PropertyName, value); return true; }).ToList(); if (!save) { return false; } CS$<>8__locals0.saveManager.Save(); return false; } bool IEnumerator.MoveNext() { //ILSpy generated this explicit interface implementation from .override directive in MoveNext return this.MoveNext(); } [DebuggerHidden] void IEnumerator.Reset() { throw new NotSupportedException(); } } [CompilerGenerated] private sealed class <UpgradeProperty>d__16 : IEnumerator<object>, IEnumerator, IDisposable { private int <>1__state; private object <>2__current; public float price; public ResponsesLogic <>4__this; public PropertyUpgrade upgrade; object IEnumerator<object>.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public <UpgradeProperty>d__16(int <>1__state) { this.<>1__state = <>1__state; } [DebuggerHidden] void IDisposable.Dispose() { <>1__state = -2; } private bool MoveNext() { //IL_00d7: Unknown result type (might be due to invalid IL or missing references) //IL_00ff: Unknown result type (might be due to invalid IL or missing references) //IL_0104: Unknown result type (might be due to invalid IL or missing references) //IL_0109: Unknown result type (might be due to invalid IL or missing references) //IL_010b: Unknown result type (might be due to invalid IL or missing references) //IL_010d: Unknown result type (might be due to invalid IL or missing references) //IL_0321: Unknown result type (might be due to invalid IL or missing references) //IL_0326: Unknown result type (might be due to invalid IL or missing references) //IL_0333: Unknown result type (might be due to invalid IL or missing references) //IL_0338: Unknown result type (might be due to invalid IL or missing references) //IL_0340: Unknown result type (might be due to invalid IL or missing references) //IL_0342: Unknown result type (might be due to invalid IL or missing references) int num = <>1__state; ResponsesLogic responsesLogic = <>4__this; if (num != 0) { return false; } <>1__state = -1; MoneyManager instance = NetworkSingleton<MoneyManager>.Instance; if (instance.onlineBalance < price) { responsesLogic.Reset(MelonPreferences.GetEntryValue<string>("PropertyUpgrades_Translation", "NoBankBalance")); return false; } PropertyData propertyData = responsesLogic.saveManager.saveData[responsesLogic.targetProperty.PropertyName]; switch (upgrade) { case PropertyUpgrade.AddEmployee: { instance.CreateOnlineTransaction("Property Upgrade", 0f - price, 1f, "Employee upgrade (" + responsesLogic.targetProperty.PropertyName + ")"); Property targetProperty = responsesLogic.targetProperty; targetProperty.EmployeeCapacity++; Transform obj2 = responsesLogic.targetProperty.EmployeeIdlePoints[0]; Vector3 val = obj2.position + new Vector3(Random.Range(0f, 2f), 0f, Random.Range(0f, 2f)); Transform element = Object.Instantiate<Transform>(obj2, val, Quaternion.identity); responsesLogic.targetProperty.EmployeeIdlePoints = responsesLogic.targetProperty.EmployeeIdlePoints.Append(element).ToArray(); propertyData.EmployeeCapacity = responsesLogic.targetProperty.EmployeeCapacity; responsesLogic.npc.SendTextMessage(MelonPreferences.GetEntryValue<string>("PropertyUpgrades_Translation", "EmployeeUpgrade").Replace("{{PropertyName}}", responsesLogic.targetProperty.PropertyName), (Response[])null, 1f, true); break; } case PropertyUpgrade.AddPlantGrowthMultipler: { instance.CreateOnlineTransaction("Property Upgrade", 0f - price, 1f, "Plant growth upgrade (" + responsesLogic.targetProperty.PropertyName + ")"); Pot[] buildableItemScriptsFromProperty2 = ModUtilities.GetBuildableItemScriptsFromProperty<Pot>(responsesLogic.targetProperty); foreach (Pot obj in buildableItemScriptsFromProperty2) { obj.GrowSpeedMultiplier += 0.25f; } propertyData.ExtraGrowSpeedMultiplier += 0.25f; responsesLogic.npc.SendTextMessage(MelonPreferences.GetEntryValue<string>("PropertyUpgrades_Translation", "PotUpgrade").Replace("{{PropertyName}}", responsesLogic.targetProperty.PropertyName), (Response[])null, 1f, true); break; } case PropertyUpgrade.ReduceMixingTime: { instance.CreateOnlineTransaction("Property Upgrade", 0f - price, 1f, "Mixing time upgrade (" + responsesLogic.targetProperty.PropertyName + ")"); MixingStation[] buildableItemScriptsFromProperty = ModUtilities.GetBuildableItemScriptsFromProperty<MixingStation>(responsesLogic.targetProperty); propertyData.MixTimePerItemReduction++; MixingStation[] array = buildableItemScriptsFromProperty; for (int i = 0; i < array.Length; i++) { ModUtilities.ApplyMixingUpgrade(array[i], propertyData.MixTimePerItemReduction); } responsesLogic.npc.SendTextMessage(MelonPreferences.GetEntryValue<string>("PropertyUpgrades_Translation", "MixerUpgrade").Replace("{{PropertyName}}", responsesLogic.targetProperty.PropertyName), (Response[])null, 1f, true); break; } case PropertyUpgrade.AddLoadingDock: { instance.CreateOnlineTransaction("Property Upgrade", 0f - price, 1f, "Loading dock upgrade (" + responsesLogic.targetProperty.PropertyName + ")"); Vector3 position = ((Component)responsesLogic.player).transform.position; Quaternion rotation = ((Component)responsesLogic.player).transform.rotation; ModUtilities.AddExtraDock(responsesLogic.targetProperty, position, rotation, addToSaveManager: true, responsesLogic.saveManager); responsesLogic.npc.SendTextMessage(MelonPreferences.GetEntryValue<string>("PropertyUpgrades_Translation", "LoadingDockUpgrade").Replace("{{PropertyName}}", responsesLogic.targetProperty.PropertyName), (Response[])null, 1f, true); break; } } responsesLogic.saveManager.SaveTemp(); responsesLogic.Reset(MelonPreferences.GetEntryValue<string>("PropertyUpgrades_Translation", "WhatElse")); return false; } bool IEnumerator.MoveNext() { //ILSpy generated this explicit interface implementation from .override directive in MoveNext return this.MoveNext(); } [DebuggerHidden] void IEnumerator.Reset() { throw new NotSupportedException(); } } private NPC npc; private NPC s1npc; private Property targetProperty; private List<Property> ownedProperties; private ModSaveManager saveManager; private Player player; public ResponsesLogic(NPC npc, ModSaveManager saveManager) { this.npc = npc; this.saveManager = saveManager; try { saveManager.Load(); MelonCoroutines.Start(UpdateProperties(save: true)); } catch (Exception ex) { MelonLogger.Error((object)ex); } s1npc = NPCManager.GetNPC(npc.ID); player = Player.Local; Reset(); } public ResponsesLogic SendAction(Action action, Property newTargetProperty = null, bool isRemoveLoadingDock = false) { switch (action) { case Action.UpgradeProperty: MelonCoroutines.Start(ShowPropertiesResponse()); break; case Action.SetTargetProperty: targetProperty = newTargetProperty; if (!isRemoveLoadingDock) { MelonCoroutines.Start(ShowAvailableUpgradesResponse()); } break; case Action.PositionLoadingBay: MelonCoroutines.Start(ShowPositionLoadingBayResponse()); break; case Action.RemoveLoadingDock: MelonCoroutines.Start(ShowRemoveBayResponses()); break; } return this; } [IteratorStateMachine(typeof(<ShowPositionLoadingBayResponse>d__10))] private IEnumerator ShowPositionLoadingBayResponse() { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new <ShowPositionLoadingBayResponse>d__10(0) { <>4__this = this }; } [IteratorStateMachine(typeof(<ShowPropertiesResponse>d__11))] private IEnumerator ShowPropertiesResponse() { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new <ShowPropertiesResponse>d__11(0) { <>4__this = this }; } [IteratorStateMachine(typeof(<UpdateProperties>d__12))] private IEnumerator UpdateProperties(bool save = false) { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new <UpdateProperties>d__12(0) { <>4__this = this, save = save }; } [IteratorStateMachine(typeof(<ShowRemoveBayResponses>d__13))] private IEnumerator ShowRemoveBayResponses() { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new <ShowRemoveBayResponses>d__13(0) { <>4__this = this }; } [IteratorStateMachine(typeof(<RemoveLoadingBay>d__14))] private IEnumerator RemoveLoadingBay() { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new <RemoveLoadingBay>d__14(0) { <>4__this = this }; } [IteratorStateMachine(typeof(<ShowAvailableUpgradesResponse>d__15))] private IEnumerator ShowAvailableUpgradesResponse() { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new <ShowAvailableUpgradesResponse>d__15(0) { <>4__this = this }; } [IteratorStateMachine(typeof(<UpgradeProperty>d__16))] private IEnumerator UpgradeProperty(PropertyUpgrade upgrade, float price) { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new <UpgradeProperty>d__16(0) { <>4__this = this, upgrade = upgrade, price = price }; } private void ShowResponses(List<Response> responses, string message) { npc.SendTextMessage(message, responses.ToArray(), 1f, true); } private void Reset(string message = null) { if (message == null) { message = MelonPreferences.GetEntryValue<string>("PropertyUpgrades_Translation", "ResetMessage"); } targetProperty = null; ShowResponses(GenerateResponses(), message); } private List<Response> GenerateResponses() { //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_000b: Unknown result type (might be due to invalid IL or missing references) //IL_0016: Unknown result type (might be due to invalid IL or missing references) //IL_002d: Expected O, but got Unknown //IL_002e: Unknown result type (might be due to invalid IL or missing references) //IL_0033: Unknown result type (might be due to invalid IL or missing references) //IL_003e: Unknown result type (might be due to invalid IL or missing references) //IL_0055: Expected O, but got Unknown return new List<Response> { new Response { Text = "Upgrade Property", OnTriggered = delegate { SendAction(Action.UpgradeProperty); } }, new Response { Text = "Remove Loading Dock", OnTriggered = delegate { SendAction(Action.RemoveLoadingDock); } } }; } } } namespace System.Runtime.CompilerServices { [AttributeUsage(AttributeTargets.Assembly, AllowMultiple = true)] internal sealed class IgnoresAccessChecksToAttribute : Attribute { internal IgnoresAccessChecksToAttribute(string assemblyName) { } } }