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 10 months 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; } } } }