Some mods target the Mono version of the game, which is available by opting into the Steam beta branch "alternate"
Decompiled source of EmployeeMover v1.0.2
Employee Mover.dll
Decompiled a month agousing System; using System.Collections; using System.Collections.Generic; using System.Diagnostics; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using System.Security; using System.Security.Permissions; using Employee_Mover; using HarmonyLib; using Il2CppFishNet.Object; using Il2CppInterop.Runtime.InteropTypes.Arrays; using Il2CppScheduleOne.Employees; using Il2CppScheduleOne.PlayerScripts; using Il2CppScheduleOne.Property; using Il2CppSystem.Collections.Generic; using MelonLoader; using Microsoft.CodeAnalysis; using UnityEngine; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: MelonInfo(typeof(Mod), "Employee Mover", "1.0", "Akermi", null)] [assembly: MelonGame("TVGS", "Schedule I")] [assembly: TargetFramework(".NETCoreApp,Version=v6.0", FrameworkDisplayName = ".NET 6.0")] [assembly: AssemblyCompany("Employee Mover")] [assembly: AssemblyConfiguration("Release")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyInformationalVersion("1.0.0")] [assembly: AssemblyProduct("Employee Mover")] [assembly: AssemblyTitle("Employee Mover")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("1.0.0.0")] [module: UnverifiableCode] namespace Microsoft.CodeAnalysis { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] internal sealed class EmbeddedAttribute : Attribute { } } namespace System.Runtime.CompilerServices { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Parameter | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter, AllowMultiple = false, Inherited = false)] internal sealed class NullableAttribute : Attribute { public readonly byte[] NullableFlags; public NullableAttribute(byte P_0) { NullableFlags = new byte[1] { P_0 }; } public NullableAttribute(byte[] P_0) { NullableFlags = P_0; } } [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Method | AttributeTargets.Interface | AttributeTargets.Delegate, AllowMultiple = false, Inherited = false)] internal sealed class NullableContextAttribute : Attribute { public readonly byte Flag; public NullableContextAttribute(byte P_0) { Flag = P_0; } } } namespace Employee_Mover { public class Mod : MelonMod { public static class SelectedEmployeeTracker { public static Employee LastSelectedEmployee; } [HarmonyPatch(typeof(Cleaner), "SetConfigurer")] private class Patch_Cleaner_SetConfigurer { private static void Postfix(Cleaner __instance) { if ((Object)(object)__instance.CurrentPlayerConfigurer == (Object)(object)((NetworkBehaviour)Player.Local).NetworkObject) { SelectedEmployeeTracker.LastSelectedEmployee = (Employee)(object)__instance; MelonLogger.Msg("[DEBUG] Cleaner selected: " + ((Object)__instance).name); } } } [HarmonyPatch(typeof(Botanist), "SetConfigurer")] private class Patch_Botanist_SetConfigurer { private static void Postfix(Botanist __instance) { if ((Object)(object)__instance.CurrentPlayerConfigurer == (Object)(object)((NetworkBehaviour)Player.Local).NetworkObject) { SelectedEmployeeTracker.LastSelectedEmployee = (Employee)(object)__instance; MelonLogger.Msg("[DEBUG] Botanist selected: " + ((Object)__instance).name); } } } [HarmonyPatch(typeof(Chemist), "SetConfigurer")] private class Patch_Chemist_SetConfigurer { private static void Postfix(Chemist __instance) { if ((Object)(object)__instance.CurrentPlayerConfigurer == (Object)(object)((NetworkBehaviour)Player.Local).NetworkObject) { SelectedEmployeeTracker.LastSelectedEmployee = (Employee)(object)__instance; MelonLogger.Msg("[DEBUG] Chemist selected: " + ((Object)__instance).name); } } } [HarmonyPatch(typeof(Packager), "SetConfigurer")] private class Patch_Packager_SetConfigurer { private static void Postfix(Packager __instance) { if ((Object)(object)__instance.CurrentPlayerConfigurer == (Object)(object)((NetworkBehaviour)Player.Local).NetworkObject) { SelectedEmployeeTracker.LastSelectedEmployee = (Employee)(object)__instance; MelonLogger.Msg("[DEBUG] Packager selected: " + ((Object)__instance).name); } } } [CompilerGenerated] private sealed class <DelayedIdleAssign>d__8 : IEnumerator<object>, IEnumerator, IDisposable { private int <>1__state; private object <>2__current; public Mod <>4__this; object IEnumerator<object>.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public <DelayedIdleAssign>d__8(int <>1__state) { this.<>1__state = <>1__state; } [DebuggerHidden] void IDisposable.Dispose() { <>1__state = -2; } private bool MoveNext() { int num = <>1__state; Mod mod = <>4__this; switch (num) { default: return false; case 0: <>1__state = -1; <>2__current = null; <>1__state = 1; return true; case 1: <>1__state = -1; mod.AssignIdlePointToPlayer(); 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 <StartEmployeeCacheUpdater>d__10 : IEnumerator<object>, IEnumerator, IDisposable { private int <>1__state; private object <>2__current; public Mod <>4__this; object IEnumerator<object>.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public <StartEmployeeCacheUpdater>d__10(int <>1__state) { this.<>1__state = <>1__state; } [DebuggerHidden] void IDisposable.Dispose() { <>1__state = -2; } private bool MoveNext() { //IL_011f: Unknown result type (might be due to invalid IL or missing references) //IL_0129: Expected O, but got Unknown int num = <>1__state; Mod mod = <>4__this; switch (num) { default: return false; case 0: <>1__state = -1; ((MelonBase)mod).LoggerInstance.Msg("[DEBUG] Starting employee cache updater..."); break; case 1: <>1__state = -1; break; } if (mod._mainSceneLoaded) { mod._employeeCache.Clear(); Enumerator<Property> enumerator = Property.OwnedProperties.GetEnumerator(); while (enumerator.MoveNext()) { Property current = enumerator.Current; if (current == null || current.PropertyName == null || current.Employees == null) { continue; } for (int i = 0; i < current.Employees.Count; i++) { Employee val = current.Employees[i]; if (!((Object)(object)val == (Object)null)) { int instanceID = ((Object)val).GetInstanceID(); if (!mod._employeeCache.ContainsKey(instanceID)) { mod._employeeCache[instanceID] = (current, i); } } } } ((MelonBase)mod).LoggerInstance.Msg($"[DEBUG] Employee cache updated with {mod._employeeCache.Count} entries."); <>2__current = (object)new WaitForSeconds(10f); <>1__state = 1; return true; } 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 readonly Dictionary<int, Transform> _idlePointPool = new Dictionary<int, Transform>(); private Dictionary<int, (Property prop, int index)> _employeeCache = new Dictionary<int, (Property, int)>(); private const float EmployeeCacheRefreshInterval = 10f; private bool _mainSceneLoaded; public override void OnInitializeMelon() { //IL_0005: Unknown result type (might be due to invalid IL or missing references) new Harmony("com.akermi.employeemanager").PatchAll(typeof(Mod).Assembly); ((MelonBase)this).LoggerInstance.Msg("[DEBUG] Harmony patches applied."); } public override void OnSceneWasInitialized(int buildIndex, string sceneName) { ((MelonBase)this).LoggerInstance.Msg("[DEBUG] Scene loaded: " + sceneName); if (sceneName == "Main") { _mainSceneLoaded = true; MelonCoroutines.Start(StartEmployeeCacheUpdater()); } } public override void OnLateUpdate() { if (_mainSceneLoaded && Input.GetKeyDown((KeyCode)285)) { ((MelonBase)this).LoggerInstance.Msg("[DEBUG] F4 pressed"); MelonCoroutines.Start(DelayedIdleAssign()); } } [IteratorStateMachine(typeof(<DelayedIdleAssign>d__8))] private IEnumerator DelayedIdleAssign() { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new <DelayedIdleAssign>d__8(0) { <>4__this = this }; } private void AssignIdlePointToPlayer() { //IL_0136: Unknown result type (might be due to invalid IL or missing references) //IL_013b: Unknown result type (might be due to invalid IL or missing references) //IL_0165: Unknown result type (might be due to invalid IL or missing references) Employee lastSelectedEmployee = SelectedEmployeeTracker.LastSelectedEmployee; if ((Object)(object)lastSelectedEmployee == (Object)null) { ((MelonBase)this).LoggerInstance.Warning("[DEBUG] No selected employee."); return; } ((MelonBase)this).LoggerInstance.Msg($"[DEBUG] Selected employee: {((Object)lastSelectedEmployee).name} ({((Object)lastSelectedEmployee).GetInstanceID()})"); if (!_employeeCache.TryGetValue(((Object)lastSelectedEmployee).GetInstanceID(), out (Property, int) value)) { ((MelonBase)this).LoggerInstance.Warning("[DEBUG] Employee " + ((Object)lastSelectedEmployee).name + " not found in cache."); return; } Player local = Player.Local; if ((Object)(object)local == (Object)null) { ((MelonBase)this).LoggerInstance.Warning("[DEBUG] Player.Local is null."); return; } Property item = value.Item1; int item2 = value.Item2; Il2CppReferenceArray<Transform> employeeIdlePoints = item.EmployeeIdlePoints; if (employeeIdlePoints == null || item2 >= ((Il2CppArrayBase<Transform>)(object)employeeIdlePoints).Length) { ((MelonBase)this).LoggerInstance.Warning("[DEBUG] Idle point array invalid or index out of range."); return; } if (!_idlePointPool.TryGetValue(((Object)lastSelectedEmployee).GetInstanceID(), out Transform value2) || (Object)(object)value2 == (Object)null) { value2 = new GameObject("Idle_" + ((Object)lastSelectedEmployee).name) { hideFlags = (HideFlags)61 }.transform; _idlePointPool[((Object)lastSelectedEmployee).GetInstanceID()] = value2; } value2.position = ((Component)local).transform.position; ((Il2CppArrayBase<Transform>)(object)employeeIdlePoints)[item2] = value2; ((MelonBase)this).LoggerInstance.Msg($"[DEBUG] Idle point set for {((Object)lastSelectedEmployee).name} at index {item2} in {item.PropertyName}"); if ((Object)(object)lastSelectedEmployee.WaitOutside != (Object)null) { lastSelectedEmployee.WaitOutside.IdlePoint = value2; } } [IteratorStateMachine(typeof(<StartEmployeeCacheUpdater>d__10))] private IEnumerator StartEmployeeCacheUpdater() { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new <StartEmployeeCacheUpdater>d__10(0) { <>4__this = this }; } public override void OnSceneWasUnloaded(int buildIndex, string sceneName) { if (sceneName == "Main") { _mainSceneLoaded = false; } } } }