using System; using System.Collections; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Runtime.Versioning; using ExtendedEmployees; using HarmonyLib; using Il2CppInterop.Runtime.InteropTypes.Arrays; using Il2CppScheduleOne.DevUtilities; using Il2CppScheduleOne.Employees; using Il2CppScheduleOne.Messaging; using Il2CppScheduleOne.Money; using Il2CppScheduleOne.NPCs; using Il2CppScheduleOne.Property; using Il2CppScheduleOne.UI; using Il2CppScheduleOne.UI.Phone.ContactsApp; using Il2CppScheduleOne.UI.Phone.Messages; using Il2CppSystem; using Il2CppSystem.Collections.Generic; using MelonLoader; using MelonLoader.Utils; using Newtonsoft.Json; using UnityEngine; using UnityEngine.AI; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)] [assembly: MelonInfo(typeof(Core), "Extended Employees", "1.0.1", "Anton Leigue", null)] [assembly: MelonGame(null, "Schedule I")] [assembly: AssemblyTitle("ExtendedEmployees")] [assembly: AssemblyDescription("")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("")] [assembly: AssemblyProduct("ExtendedEmployees")] [assembly: AssemblyCopyright("Copyright © 2026")] [assembly: AssemblyTrademark("")] [assembly: ComVisible(false)] [assembly: Guid("8c7c2273-d0b4-4ecd-af5b-2c29f40f2450")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: TargetFramework(".NETFramework,Version=v4.7.2", FrameworkDisplayName = ".NET Framework 4.7.2")] [assembly: AssemblyVersion("1.0.0.0")] namespace ExtendedEmployees; public class Core : MelonMod { [CompilerGenerated] private sealed class d__10 : IEnumerator, IDisposable, IEnumerator { private int <>1__state; private object <>2__current; public Core <>4__this; private NPC 5__1; private GameObject 5__2; private Message 5__3; private Enumerator <>s__4; private NPC 5__5; private Exception 5__6; object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public d__10(int <>1__state) { this.<>1__state = <>1__state; } [DebuggerHidden] void IDisposable.Dispose() { 5__1 = null; 5__2 = null; 5__3 = null; <>s__4 = null; 5__5 = null; 5__6 = null; <>1__state = -2; } private bool MoveNext() { //IL_0067: Unknown result type (might be due to invalid IL or missing references) //IL_0071: Expected O, but got Unknown //IL_0211: Unknown result type (might be due to invalid IL or missing references) //IL_021b: Expected O, but got Unknown //IL_02aa: Unknown result type (might be due to invalid IL or missing references) //IL_02b4: Expected O, but got Unknown switch (<>1__state) { default: return false; case 0: <>1__state = -1; goto IL_0046; case 1: <>1__state = -1; goto IL_0046; case 2: { <>1__state = -1; if (<>4__this.contactCreated) { return false; } <>4__this.contactCreated = true; try { 5__1 = null; <>s__4 = NPCManager.NPCRegistry.GetEnumerator(); while (<>s__4.MoveNext()) { 5__5 = <>s__4.Current; if ((Object)(object)5__5 != (Object)null) { 5__1 = 5__5; break; } 5__5 = null; } <>s__4 = null; if ((Object)(object)5__1 == (Object)null) { MelonLogger.Error("Failed finding template NPC"); return false; } 5__2 = Object.Instantiate(((Component)5__1).gameObject); <>4__this.employeeContactNPC = 5__2.GetComponent(); <>4__this.employeeContactNPC.FirstName = "Extended"; <>4__this.employeeContactNPC.LastName = "Employees"; <>4__this.employeeContactNPC.BakedGUID = Guid.NewGuid().ToString(); <>4__this.employeeContactNPC.IsImportant = true; <>4__this.employeeContactNPC.ConversationCanBeHidden = false; <>4__this.employeeContactNPC.ShowRelationshipInfo = false; <>4__this.employeeContactNPC.MugshotSprite = ((App)(object)PlayerSingleton.Instance).AppIcon; <>4__this.employeeConversation = new MSGConversation(<>4__this.employeeContactNPC, "Extended Employees"); <>4__this.employeeConversation.messageHistory = new List(); <>4__this.employeeConversation.messageChainHistory = new List(); <>4__this.employeeConversation.bubbles = new List(); <>4__this.employeeConversation.EntryVisible = true; <>4__this.employeeContactNPC.MSGConversation = <>4__this.employeeConversation; NPCManager.NPCRegistry.Add(<>4__this.employeeContactNPC); 5__3 = new Message("Welcome to Extended Employees.", (ESenderType)1, true, -1); <>4__this.employeeConversation.SendMessage(5__3, true, false); <>4__this.OpenMainDialogue(); MelonLogger.Msg("Extended Employees contact created!"); 5__1 = null; 5__2 = null; 5__3 = null; } catch (Exception ex) { 5__6 = ex; MelonLogger.Error($"Phone contact failed: {5__6}"); } return false; } IL_0046: if (NPCManager.NPCRegistry == null || NPCManager.NPCRegistry.Count == 0) { <>2__current = null; <>1__state = 1; return true; } <>2__current = (object)new WaitForSeconds(2f); <>1__state = 2; return true; } } 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 employeeContactNPC; private MSGConversation employeeConversation; private bool contactCreated = false; private Employee[] cachedEmployees = (Employee[])(object)new Employee[0]; private float refreshTimer = 0f; private static string SavePath = Path.Combine(MelonEnvironment.UserDataDirectory, "ExtendedEmployees.json"); public static bool AutoPayrollEnabled = false; public static Dictionary EmployeeData = new Dictionary(); public override void OnInitializeMelon() { //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_000c: Expected O, but got Unknown Harmony val = new Harmony("extendedemployees"); val.PatchAll(); LoadData(); MelonLogger.Msg("Extended Employees Loaded!"); MelonCoroutines.Start(CreatePhoneContact()); } public override void OnUpdate() { refreshTimer += Time.deltaTime; if (refreshTimer >= 2f) { refreshTimer = 0f; cachedEmployees = Il2CppArrayBase.op_Implicit(Object.FindObjectsOfType()); } Employee[] array = cachedEmployees; foreach (Employee val in array) { if (!((Object)(object)val == (Object)null)) { EmployeeUpgradeData data = GetData(val); NavMeshAgent component = ((Component)val).GetComponent(); if ((Object)(object)component != (Object)null) { component.speed = 3.5f * data.WalkSpeedMultiplier; } if (AutoPayrollEnabled && !val.PaidForToday) { PayEmployee(val); } } } } [IteratorStateMachine(typeof(d__10))] private IEnumerator CreatePhoneContact() { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new d__10(0) { <>4__this = this }; } private void OpenMainDialogue() { //IL_0031: Unknown result type (might be due to invalid IL or missing references) //IL_003b: Expected O, but got Unknown //IL_0059: Unknown result type (might be due to invalid IL or missing references) //IL_0063: Expected O, but got Unknown //IL_0081: Unknown result type (might be due to invalid IL or missing references) //IL_008b: Expected O, but got Unknown //IL_00a9: Unknown result type (might be due to invalid IL or missing references) //IL_00b3: Expected O, but got Unknown employeeConversation.ClearResponses(false); List val = new List(); val.Add(new Response("Manage Employees", "", Action.op_Implicit((Action)delegate { OpenEmployeesMenu(); }), true)); val.Add(new Response("Payroll", "", Action.op_Implicit((Action)delegate { OpenPayrollMenu(); }), true)); val.Add(new Response("Hire Employees", "", Action.op_Implicit((Action)delegate { OpenHirePropertiesMenu(); }), true)); val.Add(new Response("Statistics", "", Action.op_Implicit((Action)delegate { OpenStatsMenu(); }), true)); employeeConversation.ShowResponses(val, 0f, false); } private List GetPlayerOwnedProperties() { List list = new List(); Property[] array = Il2CppArrayBase.op_Implicit(Object.FindObjectsOfType()); Property[] array2 = array; foreach (Property val in array2) { if (!((Object)(object)val == (Object)null) && val.IsOwned && ((Component)val).gameObject.activeInHierarchy && !list.Contains(val)) { list.Add(val); } } return list; } private void OpenEmployeesMenu() { //IL_0016: Unknown result type (might be due to invalid IL or missing references) //IL_001c: Expected O, but got Unknown //IL_0089: Unknown result type (might be due to invalid IL or missing references) //IL_0093: Expected O, but got Unknown //IL_00cc: Unknown result type (might be due to invalid IL or missing references) //IL_00d6: Expected O, but got Unknown employeeConversation.ClearResponses(false); Message val = new Message("Select Property", (ESenderType)1, true, -1); employeeConversation.SendMessage(val, true, false); List val2 = new List(); List playerOwnedProperties = GetPlayerOwnedProperties(); foreach (Property item in playerOwnedProperties) { string propertyName = ((Object)item).name; val2.Add(new Response(propertyName, "", Action.op_Implicit((Action)delegate { OpenPropertyEmployees(propertyName); }), true)); } val2.Add(new Response("Back", "", Action.op_Implicit((Action)delegate { OpenMainDialogue(); }), true)); employeeConversation.ShowResponses(val2, 0f, false); } private void OpenHirePropertiesMenu() { //IL_0016: Unknown result type (might be due to invalid IL or missing references) //IL_001c: Expected O, but got Unknown //IL_0089: Unknown result type (might be due to invalid IL or missing references) //IL_0093: Expected O, but got Unknown //IL_00cc: Unknown result type (might be due to invalid IL or missing references) //IL_00d6: Expected O, but got Unknown employeeConversation.ClearResponses(false); Message val = new Message("Select Property To Hire For", (ESenderType)1, true, -1); employeeConversation.SendMessage(val, true, false); List val2 = new List(); List playerOwnedProperties = GetPlayerOwnedProperties(); foreach (Property item in playerOwnedProperties) { string propertyName = ((Object)item).name; val2.Add(new Response(propertyName, "", Action.op_Implicit((Action)delegate { OpenHireMenu(propertyName); }), true)); } val2.Add(new Response("Back", "", Action.op_Implicit((Action)delegate { OpenMainDialogue(); }), true)); employeeConversation.ShowResponses(val2, 0f, false); } private void OpenHireMenu(string propertyName) { //IL_001c: Unknown result type (might be due to invalid IL or missing references) //IL_0022: Expected O, but got Unknown //IL_00a0: Unknown result type (might be due to invalid IL or missing references) //IL_00aa: Expected O, but got Unknown employeeConversation.ClearResponses(false); Message val = new Message("Hire Employees For " + propertyName, (ESenderType)1, true, -1); employeeConversation.SendMessage(val, true, false); List val2 = new List(); AddHireButton(val2, propertyName, "Botanist", 1200f); AddHireButton(val2, propertyName, "Cleaner", 1000f); AddHireButton(val2, propertyName, "Packager", 1500f); AddHireButton(val2, propertyName, "Chemist", 2000f); val2.Add(new Response("Back", "", Action.op_Implicit((Action)delegate { OpenHirePropertiesMenu(); }), true)); employeeConversation.ShowResponses(val2, 0f, false); } private void AddHireButton(List responses, string propertyName, string employeeType, float price) { //IL_0090: Unknown result type (might be due to invalid IL or missing references) //IL_009a: Expected O, but got Unknown responses.Add(new Response($"Hire {employeeType} [${price}]", "", Action.op_Implicit((Action)delegate { //IL_0084: Unknown result type (might be due to invalid IL or missing references) //IL_008b: Expected O, but got Unknown //IL_0136: Unknown result type (might be due to invalid IL or missing references) //IL_013d: Expected O, but got Unknown //IL_0271: Unknown result type (might be due to invalid IL or missing references) //IL_0278: Expected O, but got Unknown //IL_028e: Unknown result type (might be due to invalid IL or missing references) //IL_018a: Unknown result type (might be due to invalid IL or missing references) //IL_0191: Expected O, but got Unknown //IL_02d7: Unknown result type (might be due to invalid IL or missing references) //IL_02f0: Unknown result type (might be due to invalid IL or missing references) //IL_02dc: Unknown result type (might be due to invalid IL or missing references) //IL_02e1: Unknown result type (might be due to invalid IL or missing references) //IL_02e6: Unknown result type (might be due to invalid IL or missing references) Property val = null; Property[] array = Il2CppArrayBase.op_Implicit(Object.FindObjectsOfType()); Property[] array2 = array; foreach (Property val2 in array2) { if (!((Object)(object)val2 == (Object)null) && val2.IsOwned && ((Object)val2).name == propertyName) { val = val2; break; } } if ((Object)(object)val == (Object)null) { Message val3 = new Message("Failed finding property.", (ESenderType)1, true, -1); employeeConversation.SendMessage(val3, true, false); OpenHireMenu(propertyName); } else { int count = val.Employees.Count; int employeeCapacity = val.EmployeeCapacity; if (count >= employeeCapacity) { Message val4 = new Message($"{propertyName} employee capacity reached.\nEmployees: {count}/{employeeCapacity}", (ESenderType)1, true, -1); employeeConversation.SendMessage(val4, true, false); OpenHireMenu(propertyName); } else if (NetworkSingleton.Instance.onlineBalance < price) { Message val5 = new Message("Not enough money.", (ESenderType)1, true, -1); employeeConversation.SendMessage(val5, true, false); OpenHireMenu(propertyName); } else { NetworkSingleton.Instance.CreateOnlineTransaction("Hire " + employeeType, 0f - price, 1f, "Extended Employees"); refreshTimer = 999f; Message val6 = new Message($"{employeeType} hired for {propertyName}\nEmployees: {count + 1}/{employeeCapacity}", (ESenderType)1, true, -1); employeeConversation.SendMessage(val6, true, false); EEmployeeType val7 = (EEmployeeType)0; switch (employeeType) { case "Botanist": val7 = (EEmployeeType)0; break; case "Cleaner": val7 = (EEmployeeType)3; break; case "Packager": val7 = (EEmployeeType)1; break; case "Chemist": val7 = (EEmployeeType)2; break; } NetworkSingleton.Instance.CreateNewEmployee(val, val7); refreshTimer = 999f; OpenHireMenu(propertyName); } } }), true)); } private void OpenPropertyEmployees(string propertyName) { //IL_0012: Unknown result type (might be due to invalid IL or missing references) //IL_0018: Expected O, but got Unknown //IL_0171: Unknown result type (might be due to invalid IL or missing references) //IL_017b: Expected O, but got Unknown //IL_013b: Unknown result type (might be due to invalid IL or missing references) //IL_0145: Expected O, but got Unknown employeeConversation.ClearResponses(false); Message val = new Message(propertyName, (ESenderType)1, true, -1); employeeConversation.SendMessage(val, true, false); List val2 = new List(); Employee[] array = cachedEmployees; foreach (Employee val3 in array) { if ((Object)(object)val3 == (Object)null) { continue; } string text = "Unknown"; if ((Object)(object)val3.AssignedProperty != (Object)null) { text = ((Object)val3.AssignedProperty).name; } if (!(text != propertyName)) { Employee capturedEmployee = val3; EmployeeUpgradeData data = GetData(val3); val2.Add(new Response($"{((Object)val3).name} | Work {data.WorkSpeedMultiplier:F1}x | Walk {data.WalkSpeedMultiplier:F1}x", "", Action.op_Implicit((Action)delegate { OpenEmployeeSubmenu(capturedEmployee); }), true)); } } val2.Add(new Response("back", "Back", Action.op_Implicit((Action)delegate { OpenEmployeesMenu(); }), true)); employeeConversation.ShowResponses(val2, 0f, false); } private void OpenEmployeeSubmenu(Employee employee) { //IL_00eb: Unknown result type (might be due to invalid IL or missing references) //IL_00f1: Expected O, but got Unknown //IL_0162: Unknown result type (might be due to invalid IL or missing references) //IL_016c: Expected O, but got Unknown //IL_01c9: Unknown result type (might be due to invalid IL or missing references) //IL_01d3: Expected O, but got Unknown //IL_0229: Unknown result type (might be due to invalid IL or missing references) //IL_0233: Expected O, but got Unknown //IL_0251: Unknown result type (might be due to invalid IL or missing references) //IL_025b: Expected O, but got Unknown employeeConversation.ClearResponses(false); EmployeeUpgradeData data = GetData(employee); Message val = new Message($"{((Object)employee).name}\nWork Speed: {data.WorkSpeedMultiplier:F1}x\nWalk Speed: {data.WalkSpeedMultiplier:F1}x\nDaily Wage: ${employee.DailyWage}", (ESenderType)1, true, -1); employeeConversation.SendMessage(val, true, false); List val2 = new List(); val2.Add(new Response($"Work Upgrade [${GetUpgradePrice(data.WorkSpeedMultiplier)}]", "", Action.op_Implicit((Action)delegate { //IL_003a: Unknown result type (might be due to invalid IL or missing references) //IL_0040: Expected O, but got Unknown //IL_014c: Unknown result type (might be due to invalid IL or missing references) //IL_0152: Expected O, but got Unknown //IL_0087: Unknown result type (might be due to invalid IL or missing references) //IL_008e: Expected O, but got Unknown float upgradePrice2 = GetUpgradePrice(data.WorkSpeedMultiplier); if (data.WorkSpeedMultiplier >= 5f) { Message val9 = new Message("Work speed already maxed.", (ESenderType)1, true, -1); employeeConversation.SendMessage(val9, true, false); OpenEmployeeSubmenu(employee); } else if (NetworkSingleton.Instance.onlineBalance < upgradePrice2) { Message val10 = new Message("Not enough money.", (ESenderType)1, true, -1); employeeConversation.SendMessage(val10, true, false); OpenEmployeeSubmenu(employee); } else { NetworkSingleton.Instance.CreateOnlineTransaction("Work Speed Upgrade", 0f - upgradePrice2, 1f, "Extended Employees"); data.WorkSpeedMultiplier += 0.5f; SaveData(); Message val11 = new Message($"{((Object)employee).name} work speed upgraded to {data.WorkSpeedMultiplier:F1}x", (ESenderType)1, true, -1); employeeConversation.SendMessage(val11, true, false); OpenEmployeeSubmenu(employee); } }), true)); val2.Add(new Response($"Speed Upgrade [${GetUpgradePrice(data.WalkSpeedMultiplier)}]", "", Action.op_Implicit((Action)delegate { //IL_003a: Unknown result type (might be due to invalid IL or missing references) //IL_0040: Expected O, but got Unknown //IL_014c: Unknown result type (might be due to invalid IL or missing references) //IL_0152: Expected O, but got Unknown //IL_0087: Unknown result type (might be due to invalid IL or missing references) //IL_008e: Expected O, but got Unknown float upgradePrice = GetUpgradePrice(data.WalkSpeedMultiplier); if (data.WalkSpeedMultiplier >= 5f) { Message val6 = new Message("Walk speed already maxed.", (ESenderType)1, true, -1); employeeConversation.SendMessage(val6, true, false); OpenEmployeeSubmenu(employee); } else if (NetworkSingleton.Instance.onlineBalance < upgradePrice) { Message val7 = new Message("Not enough money.", (ESenderType)1, true, -1); employeeConversation.SendMessage(val7, true, false); OpenEmployeeSubmenu(employee); } else { NetworkSingleton.Instance.CreateOnlineTransaction("Walk Speed Upgrade", 0f - upgradePrice, 1f, "Extended Employees"); data.WalkSpeedMultiplier += 0.5f; SaveData(); Message val8 = new Message($"{((Object)employee).name} walk speed upgraded to {data.WalkSpeedMultiplier:F1}x", (ESenderType)1, true, -1); employeeConversation.SendMessage(val8, true, false); OpenEmployeeSubmenu(employee); } }), true)); val2.Add(new Response($"Pay [${employee.DailyWage}]", "", Action.op_Implicit((Action)delegate { //IL_0029: Unknown result type (might be due to invalid IL or missing references) //IL_002f: Expected O, but got Unknown //IL_00e8: Unknown result type (might be due to invalid IL or missing references) //IL_00ef: Expected O, but got Unknown //IL_00c0: Unknown result type (might be due to invalid IL or missing references) //IL_00c7: Expected O, but got Unknown if (employee.PaidForToday) { Message val3 = new Message(((Object)employee).name + " has already been paid today.", (ESenderType)1, true, -1); employeeConversation.SendMessage(val3, true, false); OpenEmployeeSubmenu(employee); } else { if (PayEmployee(employee)) { Message val4 = new Message($"You paid {((Object)employee).name} ${employee.DailyWage}", (ESenderType)1, true, -1); employeeConversation.SendMessage(val4, true, false); } else { Message val5 = new Message("Not enough money.", (ESenderType)1, true, -1); employeeConversation.SendMessage(val5, true, false); } OpenEmployeeSubmenu(employee); } }), true)); val2.Add(new Response("Back", "", Action.op_Implicit((Action)delegate { OpenEmployeesMenu(); }), true)); employeeConversation.ShowResponses(val2, 0f, false); } private void OpenPayrollMenu() { //IL_0089: Unknown result type (might be due to invalid IL or missing references) //IL_008f: Expected O, but got Unknown //IL_00f0: Unknown result type (might be due to invalid IL or missing references) //IL_00fa: Expected O, but got Unknown //IL_0126: Unknown result type (might be due to invalid IL or missing references) //IL_0130: 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 employeeConversation.ClearResponses(false); float num = 0f; Employee[] array = cachedEmployees; foreach (Employee val in array) { if (!((Object)(object)val == (Object)null) && !val.PaidForToday) { num += val.DailyWage; } } Message val2 = new Message($"Outstanding Payroll: ${num}", (ESenderType)1, true, -1); employeeConversation.SendMessage(val2, true, false); List val3 = new List(); val3.Add(new Response($"Pay All Employees (${num})", "", Action.op_Implicit((Action)delegate { PayAllEmployees(cachedEmployees); OpenPayrollMenu(); }), true)); val3.Add(new Response(AutoPayrollEnabled ? "Auto Payroll [ON]" : "Auto Payroll [OFF]", "", Action.op_Implicit((Action)delegate { AutoPayrollEnabled = !AutoPayrollEnabled; OpenPayrollMenu(); }), true)); val3.Add(new Response("Back", "", Action.op_Implicit((Action)delegate { OpenMainDialogue(); }), true)); employeeConversation.ShowResponses(val3, 0f, false); } private void OpenStatsMenu() { //IL_00cd: Unknown result type (might be due to invalid IL or missing references) //IL_00d3: Expected O, but got Unknown //IL_0105: Unknown result type (might be due to invalid IL or missing references) //IL_010f: Expected O, but got Unknown employeeConversation.ClearResponses(false); int num = 0; float num2 = 0f; Employee[] array = cachedEmployees; foreach (Employee val in array) { if (!((Object)(object)val == (Object)null)) { num++; num2 += val.DailyWage; } } Message val2 = new Message($"Employees: {num}\nPayroll: ${num2}\nAuto Payroll: {AutoPayrollEnabled}", (ESenderType)1, true, -1); employeeConversation.SendMessage(val2, true, false); List val3 = new List(); val3.Add(new Response("Back", "", Action.op_Implicit((Action)delegate { OpenMainDialogue(); }), true)); employeeConversation.ShowResponses(val3, 0f, false); } private float GetUpgradePrice(float currentMultiplier) { return 500f * currentMultiplier; } public static void SaveData() { try { string contents = JsonConvert.SerializeObject((object)EmployeeData, (Formatting)1); File.WriteAllText(SavePath, contents); } catch { } } public static void LoadData() { try { if (!File.Exists(SavePath)) { EmployeeData = new Dictionary(); return; } string text = File.ReadAllText(SavePath); EmployeeData = JsonConvert.DeserializeObject>(text); if (EmployeeData == null) { EmployeeData = new Dictionary(); } } catch { EmployeeData = new Dictionary(); } } public static EmployeeUpgradeData GetData(Employee employee) { if ((Object)(object)employee == (Object)null) { return new EmployeeUpgradeData(); } string text = ((Object)employee).name; if (string.IsNullOrEmpty(text)) { text = ((Object)employee).GetInstanceID().ToString(); } if (!EmployeeData.ContainsKey(text)) { EmployeeData[text] = new EmployeeUpgradeData(); } return EmployeeData[text]; } public static bool PayEmployee(Employee employee) { try { if ((Object)(object)employee == (Object)null) { return false; } if (employee.PaidForToday) { return false; } float dailyWage = employee.DailyWage; if (NetworkSingleton.Instance.onlineBalance < dailyWage) { return false; } NetworkSingleton.Instance.CreateOnlineTransaction("Employee Payment", 0f - dailyWage, 1f, "Extended Employees"); typeof(Employee).GetProperty("PaidForToday")?.SetValue(employee, true); return true; } catch { return false; } } public static void PayAllEmployees(Employee[] employees) { foreach (Employee val in employees) { if (!((Object)(object)val == (Object)null)) { PayEmployee(val); } } } } public class EmployeeUpgradeData { public float WorkSpeedMultiplier = 1f; public float WalkSpeedMultiplier = 1f; } [HarmonyPatch(typeof(Employee), "get_CurrentWorkSpeed")] public class EmployeeSpeedPatch { private static void Postfix(Employee __instance, ref float __result) { EmployeeUpgradeData data = Core.GetData(__instance); __result *= data.WorkSpeedMultiplier; } }