Decompiled source of CrossProperty Transportation IL2CPP v1.0.1

CrossPropertyTransport.dll

Decompiled 7 months ago
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Reflection;
using System.Resources;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using CrossPropertyTransport;
using HarmonyLib;
using Il2CppInterop.Runtime.InteropTypes;
using Il2CppScheduleOne.DevUtilities;
using Il2CppScheduleOne.Employees;
using Il2CppScheduleOne.EntityFramework;
using Il2CppScheduleOne.Management;
using Il2CppScheduleOne.NPCs;
using Il2CppScheduleOne.NPCs.Behaviour;
using Il2CppScheduleOne.PlayerScripts;
using Il2CppScheduleOne.Property;
using Il2CppScheduleOne.UI;
using Il2CppScheduleOne.UI.Management;
using Il2CppSystem.Collections.Generic;
using Il2CppTMPro;
using MelonLoader;
using Microsoft.CodeAnalysis;
using UnityEngine;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: MelonInfo(typeof(global::CrossPropertyTransport.CrossPropertyTransport), "CrossPropertyTransport", "1.0.1", "NanobotZ", null)]
[assembly: MelonGame("TVGS", "Schedule I")]
[assembly: TargetFramework(".NETCoreApp,Version=v6.0", FrameworkDisplayName = ".NET 6.0")]
[assembly: AssemblyCompany("CrossPropertyTransport")]
[assembly: AssemblyConfiguration("Release")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0")]
[assembly: AssemblyProduct("CrossPropertyTransport")]
[assembly: AssemblyTitle("CrossPropertyTransport")]
[assembly: NeutralResourcesLanguage("en-US")]
[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.Module, AllowMultiple = false, Inherited = false)]
	internal sealed class RefSafetyRulesAttribute : Attribute
	{
		public readonly int Version;

		public RefSafetyRulesAttribute(int P_0)
		{
			Version = P_0;
		}
	}
}
namespace CrossPropertyTransport
{
	public class CrossPropertyTransport : MelonMod
	{
		internal static List<Property> teleportProperties;

		internal static Vector3 playerTeleportPosition;

		internal static Vector3 playerTeleportForward;

		internal static int? playerTeleportIndex;

		internal static bool PlayerWasTeleporting => playerTeleportIndex.HasValue;

		public override void OnInitializeMelon()
		{
			((MelonBase)this).LoggerInstance.Msg("Initialized.");
		}

		public override void OnUpdate()
		{
			HandleTeleportLogic();
		}

		private static void HandleTeleportLogic()
		{
			//IL_0125: Unknown result type (might be due to invalid IL or missing references)
			//IL_012a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0134: Unknown result type (might be due to invalid IL or missing references)
			//IL_0139: Unknown result type (might be due to invalid IL or missing references)
			//IL_014e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0158: Unknown result type (might be due to invalid IL or missing references)
			if (teleportProperties == null)
			{
				return;
			}
			int num = 0;
			if (Input.GetKeyDown((KeyCode)273))
			{
				num = 1;
			}
			if (Input.GetKeyDown((KeyCode)274))
			{
				num = -1;
			}
			if (num == 0)
			{
				return;
			}
			if (!playerTeleportIndex.HasValue)
			{
				if (num > 0)
				{
					playerTeleportIndex = 1;
				}
				else
				{
					playerTeleportIndex = teleportProperties.Count - 1;
				}
			}
			else
			{
				playerTeleportIndex += num;
				if (playerTeleportIndex >= teleportProperties.Count)
				{
					playerTeleportIndex = 0;
				}
				else if (playerTeleportIndex < 0)
				{
					playerTeleportIndex = teleportProperties.Count - 1;
				}
			}
			Property property = teleportProperties[playerTeleportIndex.Value];
			Transform propertyCrossTransform = Helpers.GetPropertyCrossTransform(null, property);
			PlayerSingleton<PlayerMovement>.Instance.Teleport(propertyCrossTransform.position + Vector3.up * 1f);
			((Component)Player.Local).transform.forward = propertyCrossTransform.forward * -1f;
		}

		internal static void OpenManagementUI()
		{
			//IL_004c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0051: Unknown result type (might be due to invalid IL or missing references)
			//IL_0060: Unknown result type (might be due to invalid IL or missing references)
			//IL_0065: Unknown result type (might be due to invalid IL or missing references)
			List<Property> list = new List<Property>();
			Enumerator<Property> enumerator = Property.OwnedProperties.GetEnumerator();
			while (enumerator.MoveNext())
			{
				Property current = enumerator.Current;
				if (!((Object)(object)current == (Object)null))
				{
					list.Add(current);
				}
			}
			if (list.Count > 1)
			{
				teleportProperties = list;
				playerTeleportPosition = ((Component)Player.Local).transform.position;
				playerTeleportForward = ((Component)Player.Local).transform.forward;
			}
		}

		internal static void CloseManagementUI()
		{
			//IL_000c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0020: Unknown result type (might be due to invalid IL or missing references)
			if (PlayerWasTeleporting)
			{
				PlayerSingleton<PlayerMovement>.Instance.Teleport(playerTeleportPosition);
				((Component)Player.Local).transform.forward = playerTeleportForward;
				playerTeleportIndex = null;
			}
			teleportProperties = null;
		}
	}
	internal static class Helpers
	{
		private static readonly Dictionary<string, Transform> propertyCrossTransformDict;

		static Helpers()
		{
			//IL_001e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0032: Unknown result type (might be due to invalid IL or missing references)
			//IL_0050: Unknown result type (might be due to invalid IL or missing references)
			//IL_0064: Unknown result type (might be due to invalid IL or missing references)
			//IL_0082: Unknown result type (might be due to invalid IL or missing references)
			//IL_0096: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b4: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c8: 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_00fa: Unknown result type (might be due to invalid IL or missing references)
			//IL_0118: Unknown result type (might be due to invalid IL or missing references)
			//IL_012c: Unknown result type (might be due to invalid IL or missing references)
			//IL_014a: Unknown result type (might be due to invalid IL or missing references)
			//IL_015e: Unknown result type (might be due to invalid IL or missing references)
			propertyCrossTransformDict = new Dictionary<string, Transform>();
			CreateCrossPlatformGameObject("RV", new Vector3(11.543796f, 0.970375f, -75.74756f), new Vector3(-0.020820871f, -0.047304332f, 0.9986635f));
			CreateCrossPlatformGameObject("MotelRoom", new Vector3(-66.22975f, 1.6867679f, 82.86325f), new Vector3(0.99759513f, -0.0008907849f, 0.06930524f));
			CreateCrossPlatformGameObject("Sweatshop", new Vector3(-60.897114f, -3.034998f, 146.39929f), new Vector3(0.7232971f, -0.008608431f, 0.6904833f));
			CreateCrossPlatformGameObject("Bungalow", new Vector3(-160.01097f, -3.0348783f, 114.80028f), new Vector3(0.9974299f, 0.0034683319f, 0.07156569f));
			CreateCrossPlatformGameObject("Barn", new Vector3(177.10942f, 0.96622044f, -8.631995f), new Vector3(-0.9965599f, 0.02527189f, -0.078929305f));
			CreateCrossPlatformGameObject("DocksWarehouse", new Vector3(-73.51609f, -1.455f, -55.68945f), new Vector3(0.99936974f, -0.015709592f, 0.03183621f));
			CreateCrossPlatformGameObject("Manor", new Vector3(161.44713f, 10.99f, -74.11461f), new Vector3(0.32149658f, -0.061523672f, -0.94491005f));
		}

		private static void CreateCrossPlatformGameObject(string name, Vector3 position, Vector3 forward)
		{
			//IL_000b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0011: Expected O, but got Unknown
			//IL_001d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0029: Unknown result type (might be due to invalid IL or missing references)
			GameObject val = new GameObject(name + "_CrossPlatform");
			Object.DontDestroyOnLoad((Object)(object)val);
			val.transform.position = position;
			val.transform.forward = forward;
			propertyCrossTransformDict.Add(name, val.transform);
		}

		internal static Transform GetCrossTransform(Employee employee, BuildableItem buildableItem)
		{
			if ((Object)(object)buildableItem == (Object)null || (Object)(object)buildableItem.ParentProperty == (Object)null)
			{
				return null;
			}
			if ((Object)(object)employee == (Object)null)
			{
				return null;
			}
			if ((Object)(object)employee.AssignedProperty == (Object)(object)buildableItem.ParentProperty)
			{
				return null;
			}
			return GetPropertyCrossTransform(employee, employee.AssignedProperty);
		}

		internal static Transform GetPropertyCrossTransform(Employee employee, Property property)
		{
			if (propertyCrossTransformDict.TryGetValue(((Object)((Component)property).gameObject).name, out var value))
			{
				return value;
			}
			Melon<CrossPropertyTransport>.Logger.Msg("Property '" + ((Object)((Component)property).gameObject).name + "' doesn't have a predetermined CrossTransform, using NPC's idle point");
			if ((Object)(object)employee != (Object)null)
			{
				IdleBehaviour waitOutside = employee.WaitOutside;
				Transform val = ((waitOutside != null) ? waitOutside.IdlePoint : null) ?? null;
				if ((Object)(object)val != (Object)null)
				{
					return val;
				}
				Melon<CrossPropertyTransport>.Logger.Msg("NPC doesn't have an idle point, using NPC's current positon");
				return ((Component)employee).transform;
			}
			return property.NPCSpawnPoint;
		}
	}
	[HarmonyPatch(typeof(ObjectSelector), "IsObjectTypeValid")]
	public static class Patch_ObjectSelector_IsObjectTypeValid
	{
		internal static void Postfix(ref string reason, ref bool __result)
		{
			if (reason == "Wrong property")
			{
				reason = string.Empty;
				__result = true;
			}
		}
	}
	[HarmonyPatch(typeof(MoveItemBehaviour), "GetSourceAccessPoint")]
	public static class Patch_MoveItemBehaviour_GetSourceAccessPoint
	{
		internal static bool Prefix(MoveItemBehaviour __instance, ref Transform __result, TransitRoute route)
		{
			if (route.Source == null)
			{
				return true;
			}
			BuildableItem buildableItem = ((Il2CppObjectBase)route.Source).TryCast<BuildableItem>();
			Transform crossTransform = Helpers.GetCrossTransform(((Il2CppObjectBase)((Behaviour)__instance).Npc).TryCast<Employee>(), buildableItem);
			if ((Object)(object)crossTransform != (Object)null)
			{
				__result = crossTransform;
				return false;
			}
			return true;
		}
	}
	[HarmonyPatch(typeof(MoveItemBehaviour), "GetDestinationAccessPoint")]
	public static class Patch_MoveItemBehaviour_GetDestinationAccessPoint
	{
		internal static bool Prefix(MoveItemBehaviour __instance, ref Transform __result, TransitRoute route)
		{
			if (route.Destination == null)
			{
				return true;
			}
			BuildableItem buildableItem = ((Il2CppObjectBase)route.Destination).TryCast<BuildableItem>();
			Transform crossTransform = Helpers.GetCrossTransform(((Il2CppObjectBase)((Behaviour)__instance).Npc).TryCast<Employee>(), buildableItem);
			if ((Object)(object)crossTransform != (Object)null)
			{
				__result = crossTransform;
				return false;
			}
			return true;
		}
	}
	[HarmonyPatch(typeof(MoveItemBehaviour), "IsAtSource")]
	public static class Patch_MoveItemBehaviour_IsAtSource
	{
		internal static bool Prefix(MoveItemBehaviour __instance, ref bool __result)
		{
			//IL_0044: Unknown result type (might be due to invalid IL or missing references)
			//IL_0054: Unknown result type (might be due to invalid IL or missing references)
			TransitRoute assignedRoute = __instance.assignedRoute;
			if (((assignedRoute != null) ? assignedRoute.Destination : null) == null)
			{
				return true;
			}
			BuildableItem buildableItem = ((Il2CppObjectBase)__instance.assignedRoute.Source).TryCast<BuildableItem>();
			Transform crossTransform = Helpers.GetCrossTransform(((Il2CppObjectBase)((Behaviour)__instance).Npc).TryCast<Employee>(), buildableItem);
			if ((Object)(object)crossTransform != (Object)null)
			{
				__result = Vector3.Distance(crossTransform.position, ((Component)((Behaviour)__instance).Npc).transform.position) <= 2f;
				return false;
			}
			return true;
		}
	}
	[HarmonyPatch(typeof(MoveItemBehaviour), "IsAtDestination")]
	public static class Patch_MoveItemBehaviour_IsAtDestination
	{
		internal static bool Prefix(MoveItemBehaviour __instance, ref bool __result)
		{
			//IL_0044: Unknown result type (might be due to invalid IL or missing references)
			//IL_0054: Unknown result type (might be due to invalid IL or missing references)
			TransitRoute assignedRoute = __instance.assignedRoute;
			if (((assignedRoute != null) ? assignedRoute.Destination : null) == null)
			{
				return true;
			}
			BuildableItem buildableItem = ((Il2CppObjectBase)__instance.assignedRoute.Destination).TryCast<BuildableItem>();
			Transform crossTransform = Helpers.GetCrossTransform(((Il2CppObjectBase)((Behaviour)__instance).Npc).TryCast<Employee>(), buildableItem);
			if ((Object)(object)crossTransform != (Object)null)
			{
				__result = Vector3.Distance(crossTransform.position, ((Component)((Behaviour)__instance).Npc).transform.position) <= 2f;
				return false;
			}
			return true;
		}
	}
	[HarmonyPatch(typeof(NPCMovement), "CanGetTo", new Type[]
	{
		typeof(ITransitEntity),
		typeof(float)
	})]
	public static class Patch_NPCMovement_CanGetTo
	{
		public static bool Prefix(NPCMovement __instance, ref bool __result, ITransitEntity entity)
		{
			Packager val = ((Il2CppObjectBase)__instance.npc).TryCast<Packager>();
			if ((Object)(object)val == (Object)null)
			{
				return true;
			}
			BuildableItem val2 = ((Il2CppObjectBase)entity).TryCast<BuildableItem>();
			if ((Object)(object)val2 == (Object)null)
			{
				return true;
			}
			if ((Object)(object)((Employee)val).AssignedProperty == (Object)(object)val2.ParentProperty)
			{
				return true;
			}
			__result = true;
			return false;
		}
	}
	[HarmonyPatch(typeof(ObjectSelector), "Open")]
	public static class Patch_ObjectSelector_Open
	{
		public static void Postfix(ObjectSelector __instance)
		{
			if (__instance.selectionTitle != null)
			{
				string text = __instance.selectionTitle.ToLower();
				if (text.Contains("source") || text.Contains("destination"))
				{
					__instance.selectionTitle += "<br><br>Use UP/DOWN arrow key<br>to teleport to other properties";
					__instance.UpdateInstructions();
					CrossPropertyTransport.OpenManagementUI();
				}
			}
		}
	}
	[HarmonyPatch(typeof(ObjectSelector), "Close")]
	public static class Patch_ObjectSelector_Close
	{
		public static void Prefix()
		{
			CrossPropertyTransport.CloseManagementUI();
		}
	}
	[HarmonyPatch(typeof(TransitEntitySelector), "Open")]
	public static class Patch_TransitEntitySelector_Open
	{
		public static void Postfix(TransitEntitySelector __instance)
		{
			__instance.selectionTitle += "<br><br>Use UP/DOWN arrow key<br>to teleport to other properties";
			__instance.UpdateInstructions();
			CrossPropertyTransport.OpenManagementUI();
		}
	}
	[HarmonyPatch(typeof(TransitEntitySelector), "Close")]
	public static class Patch_TransitEntitySelector_Close
	{
		public static void Prefix()
		{
			CrossPropertyTransport.CloseManagementUI();
		}
	}
	[HarmonyPatch(typeof(HUD), "ShowTopScreenText")]
	public static class Patch_HUD_ShowTopScreenText
	{
		internal static bool Prefix(HUD __instance, string t)
		{
			//IL_0034: Unknown result type (might be due to invalid IL or missing references)
			((TMP_Text)__instance.topScreenText).text = t;
			__instance.topScreenText_Background.sizeDelta = new Vector2(((TMP_Text)__instance.topScreenText).preferredWidth + 30f, ((TMP_Text)__instance.topScreenText).preferredHeight + 30f);
			((Component)__instance.topScreenText_Background).gameObject.SetActive(true);
			return false;
		}
	}
}