Decompiled source of SewerEmployees v1.0.3

SewerEmployees-IL2CPP.dll

Decompiled a month ago
using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using HarmonyLib;
using Il2Cpp;
using Il2CppFishNet;
using Il2CppInterop.Runtime;
using Il2CppInterop.Runtime.InteropTypes;
using Il2CppInterop.Runtime.InteropTypes.Arrays;
using Il2CppScheduleOne.Delivery;
using Il2CppScheduleOne.DevUtilities;
using Il2CppScheduleOne.Map;
using Il2CppScheduleOne.PlayerScripts;
using Il2CppScheduleOne.Property;
using Il2CppSystem;
using Il2CppSystem.Collections.Generic;
using MelonLoader;
using Microsoft.CodeAnalysis;
using SewerEmployees;
using SewerEmployees.Helpers;
using UnityEngine;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: MelonInfo(typeof(global::SewerEmployees.SewerEmployees), "SewerEmployees", "1.0.3", "k073l", null)]
[assembly: MelonColor(1, 210, 105, 30)]
[assembly: MelonGame("TVGS", "Schedule I")]
[assembly: TargetFramework(".NETCoreApp,Version=v6.0", FrameworkDisplayName = ".NET 6.0")]
[assembly: AssemblyCompany("SewerEmployees-IL2CPP")]
[assembly: AssemblyConfiguration("Release IL2CPP")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0")]
[assembly: AssemblyProduct("SewerEmployees-IL2CPP")]
[assembly: AssemblyTitle("SewerEmployees-IL2CPP")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.0.0.0")]
[module: UnverifiableCode]
[module: RefSafetyRules(11)]
namespace Microsoft.CodeAnalysis
{
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	internal sealed class EmbeddedAttribute : Attribute
	{
	}
}
namespace System.Runtime.CompilerServices
{
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	[AttributeUsage(AttributeTargets.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;
		}
	}
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	[AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)]
	internal sealed class RefSafetyRulesAttribute : Attribute
	{
		public readonly int Version;

		public RefSafetyRulesAttribute(int P_0)
		{
			Version = P_0;
		}
	}
}
namespace SewerEmployees
{
	public static class BuildInfo
	{
		public const string Name = "SewerEmployees";

		public const string Description = "Adds employees to the sewer office";

		public const string Author = "k073l";

		public const string Version = "1.0.3";
	}
	public class SewerEmployees : MelonMod
	{
		private static Instance Logger;

		internal const int EmployeeCapacity = 5;

		public override void OnInitializeMelon()
		{
			Logger = ((MelonBase)this).LoggerInstance;
			Logger.Msg("SewerEmployees initialized");
		}
	}
	[HarmonyPatch]
	internal class SewerOfficePatch
	{
		[CompilerGenerated]
		private sealed class <DelayedForceLod>d__6 : IEnumerator<object>, IEnumerator, IDisposable
		{
			private int <>1__state;

			private object <>2__current;

			public LODGroup group;

			object IEnumerator<object>.Current
			{
				[DebuggerHidden]
				get
				{
					return <>2__current;
				}
			}

			object IEnumerator.Current
			{
				[DebuggerHidden]
				get
				{
					return <>2__current;
				}
			}

			[DebuggerHidden]
			public <DelayedForceLod>d__6(int <>1__state)
			{
				this.<>1__state = <>1__state;
			}

			[DebuggerHidden]
			void IDisposable.Dispose()
			{
				<>1__state = -2;
			}

			private bool MoveNext()
			{
				switch (<>1__state)
				{
				default:
					return false;
				case 0:
					<>1__state = -1;
					<>2__current = null;
					<>1__state = 1;
					return true;
				case 1:
					<>1__state = -1;
					group.ForceLOD(0);
					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 <DelayedGetBay>d__7 : IEnumerator<object>, IEnumerator, IDisposable
		{
			private int <>1__state;

			private object <>2__current;

			public Property sewerOfficeProperty;

			public Property templateProperty;

			object IEnumerator<object>.Current
			{
				[DebuggerHidden]
				get
				{
					return <>2__current;
				}
			}

			object IEnumerator.Current
			{
				[DebuggerHidden]
				get
				{
					return <>2__current;
				}
			}

			[DebuggerHidden]
			public <DelayedGetBay>d__7(int <>1__state)
			{
				this.<>1__state = <>1__state;
			}

			[DebuggerHidden]
			void IDisposable.Dispose()
			{
				<>1__state = -2;
			}

			private bool MoveNext()
			{
				switch (<>1__state)
				{
				default:
					return false;
				case 0:
					<>1__state = -1;
					<>2__current = null;
					<>1__state = 1;
					return true;
				case 1:
					<>1__state = -1;
					_getBay(sewerOfficeProperty, templateProperty);
					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 static Manor _manorInstance;

		private static Guid _bayGuid = new Guid("71b1ce64-2385-4228-afe2-e0f599115e2b");

		private static Guid _parkingGuid = new Guid("0bf90426-b51b-4ba5-a8b6-bfc9017e69d0");

		[HarmonyPostfix]
		[HarmonyPatch(typeof(Manor), "Awake")]
		private static void Manor_Awake_Postfix(Manor __instance)
		{
			_manorInstance = __instance;
		}

		[HarmonyPostfix]
		[HarmonyPatch(typeof(SewerOffice), "Awake")]
		private static void Awake_Postfix(SewerOffice __instance)
		{
			//IL_0062: Unknown result type (might be due to invalid IL or missing references)
			//IL_0068: Expected O, but got Unknown
			//IL_0097: Unknown result type (might be due to invalid IL or missing references)
			//IL_0098: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d1: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d3: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d5: Unknown result type (might be due to invalid IL or missing references)
			//IL_00da: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f5: Unknown result type (might be due to invalid IL or missing references)
			//IL_0151: Unknown result type (might be due to invalid IL or missing references)
			//IL_015f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0161: Unknown result type (might be due to invalid IL or missing references)
			if ((Object)(object)_manorInstance == (Object)null)
			{
				Melon<SewerEmployees>.Logger.Error("Manor instance is null");
				return;
			}
			Transform val = ((IEnumerable<Transform>)((Property)_manorInstance).EmployeeIdlePoints).FirstOrDefault();
			if ((Object)(object)val == (Object)null)
			{
				Melon<SewerEmployees>.Logger.Error("No idle point found for bungalow employee");
				return;
			}
			GameObject val2 = new GameObject("EmployeeIdlePoints");
			val2.transform.SetParent(((Component)__instance).transform);
			Vector3 val3 = default(Vector3);
			((Vector3)(ref val3))..ctor(37.89f, -8.26f, 69.47f);
			List<Transform> list = new List<Transform>();
			Vector3 val4 = val3;
			List<float> list2 = new List<float>();
			Vector3 val5 = default(Vector3);
			for (int i = 0; i < 5; i++)
			{
				int num = 0;
				bool flag = false;
				Vector3 val6;
				do
				{
					((Vector3)(ref val5))..ctor(0f, 0f, Random.Range(-3f, 8f));
					val6 = val4 + val5;
					flag = true;
					foreach (float item in list2)
					{
						if (Mathf.Abs(val6.z - item) < 0.8f)
						{
							flag = false;
							break;
						}
					}
					num++;
				}
				while (!flag && num < 20);
				list2.Add(val6.z);
				Transform val7 = Object.Instantiate<Transform>(val, val6, Quaternion.identity);
				val7.SetParent(val2.transform);
				list.Add(val7);
			}
			((Property)__instance).EmployeeIdlePoints = Il2CppReferenceArray<Transform>.op_Implicit(list.ToArray());
			((Property)__instance).EmployeeCapacity = 5;
			_getBin((Property)(object)__instance);
			MelonCoroutines.Start(DelayedGetBay((Property)(object)__instance, (Property)(object)_manorInstance));
			Melon<SewerEmployees>.Logger.Msg("Sewer office modified");
		}

		private static void _getBin(Property sewerOfficeProperty)
		{
			//IL_003f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0044: Unknown result type (might be due to invalid IL or missing references)
			//IL_00aa: Unknown result type (might be due to invalid IL or missing references)
			//IL_00fe: Unknown result type (might be due to invalid IL or missing references)
			//IL_0155: Unknown result type (might be due to invalid IL or missing references)
			//IL_01ac: Unknown result type (might be due to invalid IL or missing references)
			GameObject val = GameObject.Find("@Properties/Manor/Skip bin");
			if ((Object)(object)val == (Object)null)
			{
				Melon<SewerEmployees>.Logger.Error("No Manor object found");
				return;
			}
			GameObject val2 = Object.Instantiate<GameObject>(val, new Vector3(50.7f, -9f, 40.88f), Quaternion.identity);
			val2.transform.SetParent(((Component)sewerOfficeProperty).transform);
			Transform val3 = val2.transform.Find("Stand point");
			if ((Object)(object)val3 == (Object)null)
			{
				Melon<SewerEmployees>.Logger.Error("No stand point found in bin");
				return;
			}
			((Component)val3).transform.position = new Vector3(50.7f, -9f, 43.12f);
			Transform val4 = val2.transform.Find("Trash spawn point");
			if ((Object)(object)val4 == (Object)null)
			{
				Melon<SewerEmployees>.Logger.Error("No trash spawn point found in bin");
				return;
			}
			((Component)val4).transform.position = new Vector3(50.7f, -7f, 40.12f);
			Transform val5 = val2.transform.Find("Trash spawner");
			if ((Object)(object)val5 == (Object)null)
			{
				Melon<SewerEmployees>.Logger.Error("No trash spawner found in bin");
				return;
			}
			((Component)val5).transform.position = new Vector3(50.7f, -8f, 40.12f);
			Transform val6 = val2.transform.Find("Trash remover");
			if ((Object)(object)val6 == (Object)null)
			{
				Melon<SewerEmployees>.Logger.Error("No trash remover found in bin");
				return;
			}
			((Component)val6).transform.position = new Vector3(50.7f, -7.8f, 40.12f);
			Transform obj = val2.transform.Find("skip bin");
			object obj2;
			if (obj == null)
			{
				obj2 = null;
			}
			else
			{
				GameObject gameObject = ((Component)obj).gameObject;
				obj2 = ((gameObject != null) ? gameObject.GetComponent<LODGroup>() : null);
			}
			LODGroup val7 = (LODGroup)obj2;
			MelonDebug.Msg($"Found bin lod group {(Object)(object)val7 != (Object)null}. State: {((val7 != null) ? new bool?(val7.enabled) : null)}");
			if ((Object)(object)val7 != (Object)null)
			{
				val7.enabled = false;
			}
			Transform obj3 = val2.transform.Find("skip bin/Bin_LOD1");
			GameObject val8 = ((obj3 != null) ? ((Component)obj3).gameObject : null);
			if ((Object)(object)val8 != (Object)null)
			{
				val8.SetActive(true);
			}
			if ((Object)(object)val7 != (Object)null)
			{
				val7.enabled = true;
				MelonCoroutines.Start(Utils.WaitForPlayer(DelayedForceLod(val7)));
			}
			PropertyDisposalArea component = val2.GetComponent<PropertyDisposalArea>();
			if ((Object)(object)component == (Object)null)
			{
				Melon<SewerEmployees>.Logger.Error("No PropertyDisposalArea found in bin");
			}
			else
			{
				sewerOfficeProperty.DisposalArea = component;
			}
		}

		[IteratorStateMachine(typeof(<DelayedForceLod>d__6))]
		private static IEnumerator DelayedForceLod(LODGroup group)
		{
			//yield-return decompiler failed: Unexpected instruction in Iterator.Dispose()
			return new <DelayedForceLod>d__6(0)
			{
				group = group
			};
		}

		[IteratorStateMachine(typeof(<DelayedGetBay>d__7))]
		private static IEnumerator DelayedGetBay(Property sewerOfficeProperty, Property templateProperty)
		{
			//yield-return decompiler failed: Unexpected instruction in Iterator.Dispose()
			return new <DelayedGetBay>d__7(0)
			{
				sewerOfficeProperty = sewerOfficeProperty,
				templateProperty = templateProperty
			};
		}

		private static void _getBay(Property sewerOfficeProperty, Property templateProperty)
		{
			//IL_00d9: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e6: Unknown result type (might be due to invalid IL or missing references)
			//IL_0103: Unknown result type (might be due to invalid IL or missing references)
			//IL_0110: Unknown result type (might be due to invalid IL or missing references)
			//IL_0137: Unknown result type (might be due to invalid IL or missing references)
			//IL_0153: Unknown result type (might be due to invalid IL or missing references)
			MelonLogger.Msg($"Manor docks when cloning: {((templateProperty == null) ? null : ((Il2CppArrayBase<LoadingDock>)(object)templateProperty.LoadingDocks)?.Length)}");
			Vector3 position = default(Vector3);
			((Vector3)(ref position))..ctor(55.45f, -9f, 38.09f);
			LoadingDock val = ((IEnumerable<LoadingDock>)templateProperty.LoadingDocks).ElementAt(0);
			LoadingDock val2 = Object.Instantiate<LoadingDock>(val, ((Component)sewerOfficeProperty).transform, false);
			((Component)val2).gameObject.SetActive(false);
			LoadingDock component = ((Component)val2).GetComponent<LoadingDock>();
			ParkingLot parking = component.Parking;
			component.BakedGUID = ((object)(Guid)(ref _bayGuid)).ToString();
			parking.BakedGUID = ((object)(Guid)(ref _parkingGuid)).ToString();
			component.SetGUID(_bayGuid);
			parking.SetGUID(_parkingGuid);
			((Object)val2).name = "Loading Dock SewerOffice";
			((Component)val2).transform.position = position;
			((Component)val2).transform.rotation = Quaternion.identity;
			component.ParentProperty = sewerOfficeProperty;
			((Component)val2).gameObject.SetActive(true);
			val.SetGUID(new Guid(val.BakedGUID));
			val.Parking.SetGUID(new Guid(val.Parking.BakedGUID));
			List<LoadingDock> list = ((IEnumerable<LoadingDock>)sewerOfficeProperty.LoadingDocks).ToList();
			list.Add(component);
			sewerOfficeProperty.LoadingDocks = Il2CppReferenceArray<LoadingDock>.op_Implicit(list.ToArray());
		}

		[HarmonyPatch(typeof(LoadingDock), "Awake")]
		[HarmonyPrefix]
		private static bool DontRegisterIfExists(LoadingDock __instance)
		{
			//IL_0007: Unknown result type (might be due to invalid IL or missing references)
			return !GUIDManager.IsGUIDAlreadyRegistered(new Guid(__instance.BakedGUID));
		}

		[HarmonyPatch(typeof(ParkingLot), "Awake")]
		[HarmonyPrefix]
		private static bool DontRegisterParkingIfExists(ParkingLot __instance)
		{
			//IL_0007: Unknown result type (might be due to invalid IL or missing references)
			return !GUIDManager.IsGUIDAlreadyRegistered(new Guid(__instance.BakedGUID));
		}
	}
}
namespace SewerEmployees.Helpers
{
	public static class Il2CppListExtensions
	{
		public static IEnumerable<T> AsEnumerable<T>(this List<T> list)
		{
			return list ?? new List<T>();
		}

		public static List<T> ToIl2CppList<T>(this IEnumerable<T> source)
		{
			List<T> val = new List<T>();
			foreach (T item in source)
			{
				val.Add(item);
			}
			return val;
		}

		public static List<T> ConvertToList<T>(List<T> il2CppList)
		{
			List<T> list = new List<T>();
			T[] collection = Il2CppArrayBase<T>.op_Implicit(il2CppList.ToArray());
			list.AddRange(collection);
			return list;
		}

		public static IEnumerable<T> AsEnumerable<T>(this List<T> list)
		{
			IEnumerable<T> result;
			if (list != null)
			{
				result = ((IEnumerable<T>)list._items).Take(list._size);
			}
			else
			{
				IEnumerable<T> enumerable = Array.Empty<T>();
				result = enumerable;
			}
			return result;
		}
	}
	public static class Utils
	{
		[CompilerGenerated]
		private sealed class <WaitForNetwork>d__4 : IEnumerator<object>, IEnumerator, IDisposable
		{
			private int <>1__state;

			private object <>2__current;

			public IEnumerator routine;

			object IEnumerator<object>.Current
			{
				[DebuggerHidden]
				get
				{
					return <>2__current;
				}
			}

			object IEnumerator.Current
			{
				[DebuggerHidden]
				get
				{
					return <>2__current;
				}
			}

			[DebuggerHidden]
			public <WaitForNetwork>d__4(int <>1__state)
			{
				this.<>1__state = <>1__state;
			}

			[DebuggerHidden]
			void IDisposable.Dispose()
			{
				<>1__state = -2;
			}

			private bool MoveNext()
			{
				switch (<>1__state)
				{
				default:
					return false;
				case 0:
					<>1__state = -1;
					break;
				case 1:
					<>1__state = -1;
					break;
				}
				if (!InstanceFinder.IsServer && !InstanceFinder.IsClient)
				{
					<>2__current = null;
					<>1__state = 1;
					return true;
				}
				MelonCoroutines.Start(routine);
				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 <WaitForNetworkSingleton>d__6<T> : IEnumerator<object>, IEnumerator, IDisposable where T : notnull, NetworkSingleton<T>
		{
			private int <>1__state;

			private object <>2__current;

			public IEnumerator coroutine;

			object IEnumerator<object>.Current
			{
				[DebuggerHidden]
				get
				{
					return <>2__current;
				}
			}

			object IEnumerator.Current
			{
				[DebuggerHidden]
				get
				{
					return <>2__current;
				}
			}

			[DebuggerHidden]
			public <WaitForNetworkSingleton>d__6(int <>1__state)
			{
				this.<>1__state = <>1__state;
			}

			[DebuggerHidden]
			void IDisposable.Dispose()
			{
				<>1__state = -2;
			}

			private bool MoveNext()
			{
				switch (<>1__state)
				{
				default:
					return false;
				case 0:
					<>1__state = -1;
					goto IL_0044;
				case 1:
					<>1__state = -1;
					goto IL_0044;
				case 2:
					{
						<>1__state = -1;
						return false;
					}
					IL_0044:
					if (!NetworkSingleton<T>.InstanceExists)
					{
						<>2__current = null;
						<>1__state = 1;
						return true;
					}
					<>2__current = coroutine;
					<>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();
			}
		}

		[CompilerGenerated]
		private sealed class <WaitForNotNull>d__5 : IEnumerator<object>, IEnumerator, IDisposable
		{
			private int <>1__state;

			private object <>2__current;

			public object obj;

			public float timeout;

			public Action onTimeout;

			public Action onFinish;

			private float <startTime>5__1;

			object IEnumerator<object>.Current
			{
				[DebuggerHidden]
				get
				{
					return <>2__current;
				}
			}

			object IEnumerator.Current
			{
				[DebuggerHidden]
				get
				{
					return <>2__current;
				}
			}

			[DebuggerHidden]
			public <WaitForNotNull>d__5(int <>1__state)
			{
				this.<>1__state = <>1__state;
			}

			[DebuggerHidden]
			void IDisposable.Dispose()
			{
				<>1__state = -2;
			}

			private bool MoveNext()
			{
				switch (<>1__state)
				{
				default:
					return false;
				case 0:
					<>1__state = -1;
					<startTime>5__1 = Time.time;
					break;
				case 1:
					<>1__state = -1;
					break;
				}
				if (obj == null)
				{
					if (!float.IsNaN(timeout) && Time.time - <startTime>5__1 > timeout)
					{
						onTimeout?.Invoke();
						return false;
					}
					<>2__current = null;
					<>1__state = 1;
					return true;
				}
				onFinish?.Invoke();
				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 <WaitForPlayer>d__3 : IEnumerator<object>, IEnumerator, IDisposable
		{
			private int <>1__state;

			private object <>2__current;

			public IEnumerator routine;

			object IEnumerator<object>.Current
			{
				[DebuggerHidden]
				get
				{
					return <>2__current;
				}
			}

			object IEnumerator.Current
			{
				[DebuggerHidden]
				get
				{
					return <>2__current;
				}
			}

			[DebuggerHidden]
			public <WaitForPlayer>d__3(int <>1__state)
			{
				this.<>1__state = <>1__state;
			}

			[DebuggerHidden]
			void IDisposable.Dispose()
			{
				<>1__state = -2;
			}

			private bool MoveNext()
			{
				switch (<>1__state)
				{
				default:
					return false;
				case 0:
					<>1__state = -1;
					break;
				case 1:
					<>1__state = -1;
					break;
				}
				if ((Object)(object)Player.Local == (Object)null || (Object)(object)((Component)Player.Local).gameObject == (Object)null)
				{
					<>2__current = null;
					<>1__state = 1;
					return true;
				}
				MelonCoroutines.Start(routine);
				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 static readonly Instance Logger = new Instance("SewerEmployees-Utils");

		public static List<T> GetAllComponentsInChildrenRecursive<T>(GameObject obj) where T : Component
		{
			List<T> list = new List<T>();
			if ((Object)(object)obj == (Object)null)
			{
				return list;
			}
			T[] array = Il2CppArrayBase<T>.op_Implicit(obj.GetComponents<T>());
			if (array.Length != 0)
			{
				list.AddRange(array);
			}
			for (int i = 0; i < obj.transform.childCount; i++)
			{
				Transform child = obj.transform.GetChild(i);
				list.AddRange(GetAllComponentsInChildrenRecursive<T>(((Component)child).gameObject));
			}
			return list;
		}

		public static bool Is<T>(object obj, out T result) where T : Object
		{
			Object val = (Object)((obj is Object) ? obj : null);
			if (val != null)
			{
				Type val2 = Il2CppType.Of<T>();
				Type il2CppType = val.GetIl2CppType();
				if (val2.IsAssignableFrom(il2CppType))
				{
					result = ((Il2CppObjectBase)val).TryCast<T>();
					return result != null;
				}
			}
			result = default(T);
			return false;
		}

		[IteratorStateMachine(typeof(<WaitForPlayer>d__3))]
		public static IEnumerator WaitForPlayer(IEnumerator routine)
		{
			//yield-return decompiler failed: Unexpected instruction in Iterator.Dispose()
			return new <WaitForPlayer>d__3(0)
			{
				routine = routine
			};
		}

		[IteratorStateMachine(typeof(<WaitForNetwork>d__4))]
		public static IEnumerator WaitForNetwork(IEnumerator routine)
		{
			//yield-return decompiler failed: Unexpected instruction in Iterator.Dispose()
			return new <WaitForNetwork>d__4(0)
			{
				routine = routine
			};
		}

		[IteratorStateMachine(typeof(<WaitForNotNull>d__5))]
		public static IEnumerator WaitForNotNull(object? obj, float timeout = float.NaN, Action onTimeout = null, Action onFinish = null)
		{
			//yield-return decompiler failed: Unexpected instruction in Iterator.Dispose()
			return new <WaitForNotNull>d__5(0)
			{
				obj = obj,
				timeout = timeout,
				onTimeout = onTimeout,
				onFinish = onFinish
			};
		}

		[IteratorStateMachine(typeof(<WaitForNetworkSingleton>d__6<>))]
		public static IEnumerator WaitForNetworkSingleton<T>(IEnumerator coroutine) where T : NetworkSingleton<T>
		{
			//yield-return decompiler failed: Unexpected instruction in Iterator.Dispose()
			return new <WaitForNetworkSingleton>d__6<T>(0)
			{
				coroutine = coroutine
			};
		}
	}
}

SewerEmployees-Mono.dll

Decompiled a month ago
using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using FishNet;
using HarmonyLib;
using MelonLoader;
using Microsoft.CodeAnalysis;
using ScheduleOne.Delivery;
using ScheduleOne.DevUtilities;
using ScheduleOne.Map;
using ScheduleOne.PlayerScripts;
using ScheduleOne.Property;
using SewerEmployees;
using SewerEmployees.Helpers;
using UnityEngine;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: MelonInfo(typeof(global::SewerEmployees.SewerEmployees), "SewerEmployees", "1.0.3", "k073l", null)]
[assembly: MelonColor(1, 210, 105, 30)]
[assembly: MelonGame("TVGS", "Schedule I")]
[assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")]
[assembly: AssemblyCompany("SewerEmployees-Mono")]
[assembly: AssemblyConfiguration("Release Mono")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0")]
[assembly: AssemblyProduct("SewerEmployees-Mono")]
[assembly: AssemblyTitle("SewerEmployees-Mono")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.0.0.0")]
[module: UnverifiableCode]
[module: RefSafetyRules(11)]
namespace Microsoft.CodeAnalysis
{
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	internal sealed class EmbeddedAttribute : Attribute
	{
	}
}
namespace System.Runtime.CompilerServices
{
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	[AttributeUsage(AttributeTargets.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;
		}
	}
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	[AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)]
	internal sealed class RefSafetyRulesAttribute : Attribute
	{
		public readonly int Version;

		public RefSafetyRulesAttribute(int P_0)
		{
			Version = P_0;
		}
	}
}
namespace SewerEmployees
{
	public static class BuildInfo
	{
		public const string Name = "SewerEmployees";

		public const string Description = "Adds employees to the sewer office";

		public const string Author = "k073l";

		public const string Version = "1.0.3";
	}
	public class SewerEmployees : MelonMod
	{
		private static Instance Logger;

		internal const int EmployeeCapacity = 5;

		public override void OnInitializeMelon()
		{
			Logger = ((MelonBase)this).LoggerInstance;
			Logger.Msg("SewerEmployees initialized");
		}
	}
	[HarmonyPatch]
	internal class SewerOfficePatch
	{
		[CompilerGenerated]
		private sealed class <DelayedForceLod>d__6 : IEnumerator<object>, IEnumerator, IDisposable
		{
			private int <>1__state;

			private object <>2__current;

			public LODGroup group;

			object IEnumerator<object>.Current
			{
				[DebuggerHidden]
				get
				{
					return <>2__current;
				}
			}

			object IEnumerator.Current
			{
				[DebuggerHidden]
				get
				{
					return <>2__current;
				}
			}

			[DebuggerHidden]
			public <DelayedForceLod>d__6(int <>1__state)
			{
				this.<>1__state = <>1__state;
			}

			[DebuggerHidden]
			void IDisposable.Dispose()
			{
				<>1__state = -2;
			}

			private bool MoveNext()
			{
				switch (<>1__state)
				{
				default:
					return false;
				case 0:
					<>1__state = -1;
					<>2__current = null;
					<>1__state = 1;
					return true;
				case 1:
					<>1__state = -1;
					group.ForceLOD(0);
					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 <DelayedGetBay>d__7 : IEnumerator<object>, IEnumerator, IDisposable
		{
			private int <>1__state;

			private object <>2__current;

			public Property sewerOfficeProperty;

			public Property templateProperty;

			object IEnumerator<object>.Current
			{
				[DebuggerHidden]
				get
				{
					return <>2__current;
				}
			}

			object IEnumerator.Current
			{
				[DebuggerHidden]
				get
				{
					return <>2__current;
				}
			}

			[DebuggerHidden]
			public <DelayedGetBay>d__7(int <>1__state)
			{
				this.<>1__state = <>1__state;
			}

			[DebuggerHidden]
			void IDisposable.Dispose()
			{
				<>1__state = -2;
			}

			private bool MoveNext()
			{
				switch (<>1__state)
				{
				default:
					return false;
				case 0:
					<>1__state = -1;
					<>2__current = null;
					<>1__state = 1;
					return true;
				case 1:
					<>1__state = -1;
					_getBay(sewerOfficeProperty, templateProperty);
					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 static Manor _manorInstance;

		private static Guid _bayGuid = new Guid("71b1ce64-2385-4228-afe2-e0f599115e2b");

		private static Guid _parkingGuid = new Guid("0bf90426-b51b-4ba5-a8b6-bfc9017e69d0");

		[HarmonyPostfix]
		[HarmonyPatch(typeof(Manor), "Awake")]
		private static void Manor_Awake_Postfix(Manor __instance)
		{
			_manorInstance = __instance;
		}

		[HarmonyPostfix]
		[HarmonyPatch(typeof(SewerOffice), "Awake")]
		private static void Awake_Postfix(SewerOffice __instance)
		{
			//IL_0062: Unknown result type (might be due to invalid IL or missing references)
			//IL_0068: Expected O, but got Unknown
			//IL_0097: Unknown result type (might be due to invalid IL or missing references)
			//IL_0098: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d1: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d3: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d5: Unknown result type (might be due to invalid IL or missing references)
			//IL_00da: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f5: Unknown result type (might be due to invalid IL or missing references)
			//IL_0151: Unknown result type (might be due to invalid IL or missing references)
			//IL_015f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0161: Unknown result type (might be due to invalid IL or missing references)
			if ((Object)(object)_manorInstance == (Object)null)
			{
				Melon<SewerEmployees>.Logger.Error("Manor instance is null");
				return;
			}
			Transform val = ((Property)_manorInstance).EmployeeIdlePoints.FirstOrDefault();
			if ((Object)(object)val == (Object)null)
			{
				Melon<SewerEmployees>.Logger.Error("No idle point found for bungalow employee");
				return;
			}
			GameObject val2 = new GameObject("EmployeeIdlePoints");
			val2.transform.SetParent(((Component)__instance).transform);
			Vector3 val3 = default(Vector3);
			((Vector3)(ref val3))..ctor(37.89f, -8.26f, 69.47f);
			List<Transform> list = new List<Transform>();
			Vector3 val4 = val3;
			List<float> list2 = new List<float>();
			Vector3 val5 = default(Vector3);
			for (int i = 0; i < 5; i++)
			{
				int num = 0;
				bool flag = false;
				Vector3 val6;
				do
				{
					((Vector3)(ref val5))..ctor(0f, 0f, Random.Range(-3f, 8f));
					val6 = val4 + val5;
					flag = true;
					foreach (float item in list2)
					{
						if (Mathf.Abs(val6.z - item) < 0.8f)
						{
							flag = false;
							break;
						}
					}
					num++;
				}
				while (!flag && num < 20);
				list2.Add(val6.z);
				Transform val7 = Object.Instantiate<Transform>(val, val6, Quaternion.identity);
				val7.SetParent(val2.transform);
				list.Add(val7);
			}
			((Property)__instance).EmployeeIdlePoints = list.ToArray();
			((Property)__instance).EmployeeCapacity = 5;
			_getBin((Property)(object)__instance);
			MelonCoroutines.Start(DelayedGetBay((Property)(object)__instance, (Property)(object)_manorInstance));
			Melon<SewerEmployees>.Logger.Msg("Sewer office modified");
		}

		private static void _getBin(Property sewerOfficeProperty)
		{
			//IL_003f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0044: Unknown result type (might be due to invalid IL or missing references)
			//IL_00aa: Unknown result type (might be due to invalid IL or missing references)
			//IL_00fe: Unknown result type (might be due to invalid IL or missing references)
			//IL_0155: Unknown result type (might be due to invalid IL or missing references)
			//IL_01ac: Unknown result type (might be due to invalid IL or missing references)
			GameObject val = GameObject.Find("@Properties/Manor/Skip bin");
			if ((Object)(object)val == (Object)null)
			{
				Melon<SewerEmployees>.Logger.Error("No Manor object found");
				return;
			}
			GameObject val2 = Object.Instantiate<GameObject>(val, new Vector3(50.7f, -9f, 40.88f), Quaternion.identity);
			val2.transform.SetParent(((Component)sewerOfficeProperty).transform);
			Transform val3 = val2.transform.Find("Stand point");
			if ((Object)(object)val3 == (Object)null)
			{
				Melon<SewerEmployees>.Logger.Error("No stand point found in bin");
				return;
			}
			((Component)val3).transform.position = new Vector3(50.7f, -9f, 43.12f);
			Transform val4 = val2.transform.Find("Trash spawn point");
			if ((Object)(object)val4 == (Object)null)
			{
				Melon<SewerEmployees>.Logger.Error("No trash spawn point found in bin");
				return;
			}
			((Component)val4).transform.position = new Vector3(50.7f, -7f, 40.12f);
			Transform val5 = val2.transform.Find("Trash spawner");
			if ((Object)(object)val5 == (Object)null)
			{
				Melon<SewerEmployees>.Logger.Error("No trash spawner found in bin");
				return;
			}
			((Component)val5).transform.position = new Vector3(50.7f, -8f, 40.12f);
			Transform val6 = val2.transform.Find("Trash remover");
			if ((Object)(object)val6 == (Object)null)
			{
				Melon<SewerEmployees>.Logger.Error("No trash remover found in bin");
				return;
			}
			((Component)val6).transform.position = new Vector3(50.7f, -7.8f, 40.12f);
			Transform obj = val2.transform.Find("skip bin");
			object obj2;
			if (obj == null)
			{
				obj2 = null;
			}
			else
			{
				GameObject gameObject = ((Component)obj).gameObject;
				obj2 = ((gameObject != null) ? gameObject.GetComponent<LODGroup>() : null);
			}
			LODGroup val7 = (LODGroup)obj2;
			MelonDebug.Msg($"Found bin lod group {(Object)(object)val7 != (Object)null}. State: {((val7 != null) ? new bool?(val7.enabled) : null)}");
			if ((Object)(object)val7 != (Object)null)
			{
				val7.enabled = false;
			}
			Transform obj3 = val2.transform.Find("skip bin/Bin_LOD1");
			GameObject val8 = ((obj3 != null) ? ((Component)obj3).gameObject : null);
			if ((Object)(object)val8 != (Object)null)
			{
				val8.SetActive(true);
			}
			if ((Object)(object)val7 != (Object)null)
			{
				val7.enabled = true;
				MelonCoroutines.Start(Utils.WaitForPlayer(DelayedForceLod(val7)));
			}
			PropertyDisposalArea component = val2.GetComponent<PropertyDisposalArea>();
			if ((Object)(object)component == (Object)null)
			{
				Melon<SewerEmployees>.Logger.Error("No PropertyDisposalArea found in bin");
			}
			else
			{
				sewerOfficeProperty.DisposalArea = component;
			}
		}

		[IteratorStateMachine(typeof(<DelayedForceLod>d__6))]
		private static IEnumerator DelayedForceLod(LODGroup group)
		{
			//yield-return decompiler failed: Unexpected instruction in Iterator.Dispose()
			return new <DelayedForceLod>d__6(0)
			{
				group = group
			};
		}

		[IteratorStateMachine(typeof(<DelayedGetBay>d__7))]
		private static IEnumerator DelayedGetBay(Property sewerOfficeProperty, Property templateProperty)
		{
			//yield-return decompiler failed: Unexpected instruction in Iterator.Dispose()
			return new <DelayedGetBay>d__7(0)
			{
				sewerOfficeProperty = sewerOfficeProperty,
				templateProperty = templateProperty
			};
		}

		private static void _getBay(Property sewerOfficeProperty, Property templateProperty)
		{
			//IL_00e7: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f4: Unknown result type (might be due to invalid IL or missing references)
			MelonLogger.Msg($"Manor docks when cloning: {templateProperty?.LoadingDocks?.Length}");
			Vector3 position = default(Vector3);
			((Vector3)(ref position))..ctor(55.45f, -9f, 38.09f);
			LoadingDock val = templateProperty.LoadingDocks.ElementAt(0);
			LoadingDock val2 = Object.Instantiate<LoadingDock>(val, ((Component)sewerOfficeProperty).transform, false);
			((Component)val2).gameObject.SetActive(false);
			LoadingDock component = ((Component)val2).GetComponent<LoadingDock>();
			ParkingLot parking = component.Parking;
			component.BakedGUID = _bayGuid.ToString();
			parking.BakedGUID = _parkingGuid.ToString();
			component.SetGUID(_bayGuid);
			parking.SetGUID(_parkingGuid);
			((Object)val2).name = "Loading Dock SewerOffice";
			((Component)val2).transform.position = position;
			((Component)val2).transform.rotation = Quaternion.identity;
			component.ParentProperty = sewerOfficeProperty;
			((Component)val2).gameObject.SetActive(true);
			val.SetGUID(new Guid(val.BakedGUID));
			val.Parking.SetGUID(new Guid(val.Parking.BakedGUID));
			List<LoadingDock> list = sewerOfficeProperty.LoadingDocks.ToList();
			list.Add(component);
			sewerOfficeProperty.LoadingDocks = list.ToArray();
		}

		[HarmonyPatch(typeof(LoadingDock), "Awake")]
		[HarmonyPrefix]
		private static bool DontRegisterIfExists(LoadingDock __instance)
		{
			return !GUIDManager.IsGUIDAlreadyRegistered(new Guid(__instance.BakedGUID));
		}

		[HarmonyPatch(typeof(ParkingLot), "Awake")]
		[HarmonyPrefix]
		private static bool DontRegisterParkingIfExists(ParkingLot __instance)
		{
			return !GUIDManager.IsGUIDAlreadyRegistered(new Guid(__instance.BakedGUID));
		}
	}
}
namespace SewerEmployees.Helpers
{
	public static class Il2CppListExtensions
	{
		public static IEnumerable<T> AsEnumerable<T>(this List<T> list)
		{
			return list ?? new List<T>();
		}
	}
	public static class Utils
	{
		[CompilerGenerated]
		private sealed class <WaitForNetwork>d__4 : IEnumerator<object>, IEnumerator, IDisposable
		{
			private int <>1__state;

			private object <>2__current;

			public IEnumerator routine;

			object IEnumerator<object>.Current
			{
				[DebuggerHidden]
				get
				{
					return <>2__current;
				}
			}

			object IEnumerator.Current
			{
				[DebuggerHidden]
				get
				{
					return <>2__current;
				}
			}

			[DebuggerHidden]
			public <WaitForNetwork>d__4(int <>1__state)
			{
				this.<>1__state = <>1__state;
			}

			[DebuggerHidden]
			void IDisposable.Dispose()
			{
				<>1__state = -2;
			}

			private bool MoveNext()
			{
				switch (<>1__state)
				{
				default:
					return false;
				case 0:
					<>1__state = -1;
					break;
				case 1:
					<>1__state = -1;
					break;
				}
				if (!InstanceFinder.IsServer && !InstanceFinder.IsClient)
				{
					<>2__current = null;
					<>1__state = 1;
					return true;
				}
				MelonCoroutines.Start(routine);
				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 <WaitForNetworkSingleton>d__6<T> : IEnumerator<object>, IEnumerator, IDisposable where T : notnull, NetworkSingleton<T>
		{
			private int <>1__state;

			private object <>2__current;

			public IEnumerator coroutine;

			object IEnumerator<object>.Current
			{
				[DebuggerHidden]
				get
				{
					return <>2__current;
				}
			}

			object IEnumerator.Current
			{
				[DebuggerHidden]
				get
				{
					return <>2__current;
				}
			}

			[DebuggerHidden]
			public <WaitForNetworkSingleton>d__6(int <>1__state)
			{
				this.<>1__state = <>1__state;
			}

			[DebuggerHidden]
			void IDisposable.Dispose()
			{
				<>1__state = -2;
			}

			private bool MoveNext()
			{
				switch (<>1__state)
				{
				default:
					return false;
				case 0:
					<>1__state = -1;
					goto IL_0044;
				case 1:
					<>1__state = -1;
					goto IL_0044;
				case 2:
					{
						<>1__state = -1;
						return false;
					}
					IL_0044:
					if (!NetworkSingleton<T>.InstanceExists)
					{
						<>2__current = null;
						<>1__state = 1;
						return true;
					}
					<>2__current = coroutine;
					<>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();
			}
		}

		[CompilerGenerated]
		private sealed class <WaitForNotNull>d__5 : IEnumerator<object>, IEnumerator, IDisposable
		{
			private int <>1__state;

			private object <>2__current;

			public object obj;

			public float timeout;

			public Action onTimeout;

			public Action onFinish;

			private float <startTime>5__1;

			object IEnumerator<object>.Current
			{
				[DebuggerHidden]
				get
				{
					return <>2__current;
				}
			}

			object IEnumerator.Current
			{
				[DebuggerHidden]
				get
				{
					return <>2__current;
				}
			}

			[DebuggerHidden]
			public <WaitForNotNull>d__5(int <>1__state)
			{
				this.<>1__state = <>1__state;
			}

			[DebuggerHidden]
			void IDisposable.Dispose()
			{
				<>1__state = -2;
			}

			private bool MoveNext()
			{
				switch (<>1__state)
				{
				default:
					return false;
				case 0:
					<>1__state = -1;
					<startTime>5__1 = Time.time;
					break;
				case 1:
					<>1__state = -1;
					break;
				}
				if (obj == null)
				{
					if (!float.IsNaN(timeout) && Time.time - <startTime>5__1 > timeout)
					{
						onTimeout?.Invoke();
						return false;
					}
					<>2__current = null;
					<>1__state = 1;
					return true;
				}
				onFinish?.Invoke();
				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 <WaitForPlayer>d__3 : IEnumerator<object>, IEnumerator, IDisposable
		{
			private int <>1__state;

			private object <>2__current;

			public IEnumerator routine;

			object IEnumerator<object>.Current
			{
				[DebuggerHidden]
				get
				{
					return <>2__current;
				}
			}

			object IEnumerator.Current
			{
				[DebuggerHidden]
				get
				{
					return <>2__current;
				}
			}

			[DebuggerHidden]
			public <WaitForPlayer>d__3(int <>1__state)
			{
				this.<>1__state = <>1__state;
			}

			[DebuggerHidden]
			void IDisposable.Dispose()
			{
				<>1__state = -2;
			}

			private bool MoveNext()
			{
				switch (<>1__state)
				{
				default:
					return false;
				case 0:
					<>1__state = -1;
					break;
				case 1:
					<>1__state = -1;
					break;
				}
				if ((Object)(object)Player.Local == (Object)null || (Object)(object)((Component)Player.Local).gameObject == (Object)null)
				{
					<>2__current = null;
					<>1__state = 1;
					return true;
				}
				MelonCoroutines.Start(routine);
				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 static readonly Instance Logger = new Instance("SewerEmployees-Utils");

		public static List<T> GetAllComponentsInChildrenRecursive<T>(GameObject obj) where T : Component
		{
			List<T> list = new List<T>();
			if ((Object)(object)obj == (Object)null)
			{
				return list;
			}
			T[] components = obj.GetComponents<T>();
			if (components.Length != 0)
			{
				list.AddRange(components);
			}
			for (int i = 0; i < obj.transform.childCount; i++)
			{
				Transform child = obj.transform.GetChild(i);
				list.AddRange(GetAllComponentsInChildrenRecursive<T>(((Component)child).gameObject));
			}
			return list;
		}

		public static bool Is<T>(object obj, out T result) where T : class
		{
			if (obj is T val)
			{
				result = val;
				return true;
			}
			result = null;
			return false;
		}

		[IteratorStateMachine(typeof(<WaitForPlayer>d__3))]
		public static IEnumerator WaitForPlayer(IEnumerator routine)
		{
			//yield-return decompiler failed: Unexpected instruction in Iterator.Dispose()
			return new <WaitForPlayer>d__3(0)
			{
				routine = routine
			};
		}

		[IteratorStateMachine(typeof(<WaitForNetwork>d__4))]
		public static IEnumerator WaitForNetwork(IEnumerator routine)
		{
			//yield-return decompiler failed: Unexpected instruction in Iterator.Dispose()
			return new <WaitForNetwork>d__4(0)
			{
				routine = routine
			};
		}

		[IteratorStateMachine(typeof(<WaitForNotNull>d__5))]
		public static IEnumerator WaitForNotNull(object? obj, float timeout = float.NaN, Action onTimeout = null, Action onFinish = null)
		{
			//yield-return decompiler failed: Unexpected instruction in Iterator.Dispose()
			return new <WaitForNotNull>d__5(0)
			{
				obj = obj,
				timeout = timeout,
				onTimeout = onTimeout,
				onFinish = onFinish
			};
		}

		[IteratorStateMachine(typeof(<WaitForNetworkSingleton>d__6<>))]
		public static IEnumerator WaitForNetworkSingleton<T>(IEnumerator coroutine) where T : NetworkSingleton<T>
		{
			//yield-return decompiler failed: Unexpected instruction in Iterator.Dispose()
			return new <WaitForNetworkSingleton>d__6<T>(0)
			{
				coroutine = coroutine
			};
		}
	}
}
namespace System.Runtime.CompilerServices
{
	[AttributeUsage(AttributeTargets.Assembly, AllowMultiple = true)]
	internal sealed class IgnoresAccessChecksToAttribute : Attribute
	{
		public IgnoresAccessChecksToAttribute(string assemblyName)
		{
		}
	}
}