Decompiled source of BetterCruiserSync v1.0.5

BetterCruiserSync.dll

Decompiled a month ago
using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using BepInEx;
using BepInEx.Logging;
using HarmonyLib;
using Microsoft.CodeAnalysis;
using UnityEngine;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")]
[assembly: AssemblyCompany("BetterCruiserSync")]
[assembly: AssemblyConfiguration("Release")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0+27d05d3b52b0f21302e02ea33987399093513e66")]
[assembly: AssemblyProduct("BetterCruiserSync")]
[assembly: AssemblyTitle("BetterCruiserSync")]
[assembly: AssemblyVersion("1.0.0.0")]
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 BetterCruiserSync
{
	[BepInPlugin("MysticDEV.BetterCruiserSync", "BetterCruiserSync", "1.0.5")]
	public class CruiserSyncFixPlugin : BaseUnityPlugin
	{
		[CompilerGenerated]
		private sealed class <RequestSyncFromHost>d__10 : IEnumerator<object>, IEnumerator, IDisposable
		{
			private int <>1__state;

			private object <>2__current;

			public VehicleController vehicle;

			private Traverse <vehicleTraverse>5__2;

			private bool <receivedResponse>5__3;

			private float <waitTime>5__4;

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

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

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

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

			private bool MoveNext()
			{
				//IL_0161: Unknown result type (might be due to invalid IL or missing references)
				//IL_0166: Unknown result type (might be due to invalid IL or missing references)
				//IL_0088: Unknown result type (might be due to invalid IL or missing references)
				//IL_008d: Unknown result type (might be due to invalid IL or missing references)
				//IL_003d: Unknown result type (might be due to invalid IL or missing references)
				//IL_0047: Expected O, but got Unknown
				//IL_0125: Unknown result type (might be due to invalid IL or missing references)
				//IL_012f: Expected O, but got Unknown
				//IL_00be: Unknown result type (might be due to invalid IL or missing references)
				//IL_00c3: Unknown result type (might be due to invalid IL or missing references)
				switch (<>1__state)
				{
				default:
					return false;
				case 0:
				{
					<>1__state = -1;
					ManualLogSource? logger3 = CruiserSyncFixPlugin.logger;
					if (logger3 != null)
					{
						logger3.LogInfo((object)"[BetterCruiserSync] CLIENT: Requesting sync from host...");
					}
					<>2__current = (object)new WaitForSeconds(5f);
					<>1__state = 1;
					return true;
				}
				case 1:
				{
					<>1__state = -1;
					if (vehicle.magnetedToShip)
					{
						<vehicleTraverse>5__2 = Traverse.Create((object)vehicle);
						if (<vehicleTraverse>5__2.Field("magnetTargetPosition").GetValue<Vector3>() == Vector3.zero)
						{
							ManualLogSource? logger4 = CruiserSyncFixPlugin.logger;
							if (logger4 != null)
							{
								logger4.LogInfo((object)"[BetterCruiserSync] CLIENT: DESYNC DETECTED: Requesting state from host");
							}
							<receivedResponse>5__3 = false;
							try
							{
								vehicle.MagnetCarServerRpc(Vector3.zero, Vector3.zero, (int)GameNetworkManager.Instance.localPlayerController.playerClientId);
								ManualLogSource? logger5 = CruiserSyncFixPlugin.logger;
								if (logger5 != null)
								{
									logger5.LogInfo((object)"[BetterCruiserSync] CLIENT: Sync request sent to host, waiting for response...");
								}
							}
							catch (Exception arg)
							{
								ManualLogSource? logger6 = CruiserSyncFixPlugin.logger;
								if (logger6 != null)
								{
									logger6.LogError((object)$"[BetterCruiserSync] CLIENT: Failed to send sync request: {arg}");
								}
							}
							<waitTime>5__4 = 0f;
							goto IL_0190;
						}
						ManualLogSource? logger7 = CruiserSyncFixPlugin.logger;
						if (logger7 != null)
						{
							logger7.LogInfo((object)"[BetterCruiserSync] CLIENT: Cruiser already has position data, no sync needed");
						}
						goto IL_01e2;
					}
					ManualLogSource? logger8 = CruiserSyncFixPlugin.logger;
					if (logger8 != null)
					{
						logger8.LogInfo((object)"[BetterCruiserSync] CLIENT: Cruiser not magnetized, no sync needed");
					}
					break;
				}
				case 2:
					{
						<>1__state = -1;
						<waitTime>5__4 += 0.5f;
						if (!(<vehicleTraverse>5__2.Field("magnetTargetPosition").GetValue<Vector3>() != Vector3.zero))
						{
							goto IL_0190;
						}
						ManualLogSource? logger = CruiserSyncFixPlugin.logger;
						if (logger != null)
						{
							logger.LogInfo((object)"[BetterCruiserSync] CLIENT: Received response from host! Position synced.");
						}
						<receivedResponse>5__3 = true;
						goto IL_019d;
					}
					IL_019d:
					if (!<receivedResponse>5__3)
					{
						ManualLogSource? logger2 = CruiserSyncFixPlugin.logger;
						if (logger2 != null)
						{
							logger2.LogInfo((object)"[BetterCruiserSync] CLIENT: No response from host - calculating position locally...");
						}
						CalculateAndFixCruiserPosition(vehicle, <vehicleTraverse>5__2);
					}
					goto IL_01e2;
					IL_0190:
					if (<waitTime>5__4 < 3f)
					{
						<>2__current = (object)new WaitForSeconds(0.5f);
						<>1__state = 2;
						return true;
					}
					goto IL_019d;
					IL_01e2:
					<vehicleTraverse>5__2 = null;
					break;
				}
				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 <RequestSyncOnGameStart>d__9 : IEnumerator<object>, IEnumerator, IDisposable
		{
			private int <>1__state;

			private object <>2__current;

			public VehicleController cruiser;

			private Traverse <vehicleTraverse>5__2;

			private bool <receivedResponse>5__3;

			private float <waitTime>5__4;

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

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

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

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

			private bool MoveNext()
			{
				//IL_0028: Unknown result type (might be due to invalid IL or missing references)
				//IL_0032: Expected O, but got Unknown
				//IL_014c: 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_0073: Unknown result type (might be due to invalid IL or missing references)
				//IL_0078: 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_011a: Expected O, but got Unknown
				//IL_00a9: Unknown result type (might be due to invalid IL or missing references)
				//IL_00ae: Unknown result type (might be due to invalid IL or missing references)
				switch (<>1__state)
				{
				default:
					return false;
				case 0:
					<>1__state = -1;
					<>2__current = (object)new WaitForSeconds(1f);
					<>1__state = 1;
					return true;
				case 1:
					<>1__state = -1;
					if (!cruiser.magnetedToShip)
					{
						break;
					}
					<vehicleTraverse>5__2 = Traverse.Create((object)cruiser);
					if (<vehicleTraverse>5__2.Field("magnetTargetPosition").GetValue<Vector3>() == Vector3.zero)
					{
						ManualLogSource? logger2 = CruiserSyncFixPlugin.logger;
						if (logger2 != null)
						{
							logger2.LogInfo((object)"[BetterCruiserSync] CLIENT: Game started, DESYNC DETECTED: Requesting state from host");
						}
						<receivedResponse>5__3 = false;
						try
						{
							cruiser.MagnetCarServerRpc(Vector3.zero, Vector3.zero, (int)GameNetworkManager.Instance.localPlayerController.playerClientId);
							ManualLogSource? logger3 = CruiserSyncFixPlugin.logger;
							if (logger3 != null)
							{
								logger3.LogInfo((object)"[BetterCruiserSync] CLIENT: Sync request sent to host");
							}
						}
						catch (Exception arg)
						{
							ManualLogSource? logger4 = CruiserSyncFixPlugin.logger;
							if (logger4 != null)
							{
								logger4.LogError((object)$"[BetterCruiserSync] CLIENT: Failed to send sync request: {arg}");
							}
						}
						<waitTime>5__4 = 0f;
						goto IL_017b;
					}
					goto IL_01b6;
				case 2:
					{
						<>1__state = -1;
						<waitTime>5__4 += 0.5f;
						if (!(<vehicleTraverse>5__2.Field("magnetTargetPosition").GetValue<Vector3>() != Vector3.zero))
						{
							goto IL_017b;
						}
						ManualLogSource? logger = CruiserSyncFixPlugin.logger;
						if (logger != null)
						{
							logger.LogInfo((object)"[BetterCruiserSync] CLIENT: Position synced from host!");
						}
						<receivedResponse>5__3 = true;
						goto IL_0188;
					}
					IL_01b6:
					<vehicleTraverse>5__2 = null;
					break;
					IL_017b:
					if (<waitTime>5__4 < 3f)
					{
						<>2__current = (object)new WaitForSeconds(0.5f);
						<>1__state = 2;
						return true;
					}
					goto IL_0188;
					IL_0188:
					if (!<receivedResponse>5__3)
					{
						ManualLogSource? logger5 = CruiserSyncFixPlugin.logger;
						if (logger5 != null)
						{
							logger5.LogInfo((object)"[BetterCruiserSync] CLIENT: No response - calculating position locally");
						}
						CalculateAndFixCruiserPosition(cruiser, <vehicleTraverse>5__2);
					}
					goto IL_01b6;
				}
				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 <SendCruiserStateOnGameStart>d__8 : IEnumerator<object>, IEnumerator, IDisposable
		{
			private int <>1__state;

			private object <>2__current;

			public VehicleController cruiser;

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

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

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

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

			private bool MoveNext()
			{
				//IL_001d: Unknown result type (might be due to invalid IL or missing references)
				//IL_0027: Expected O, but got Unknown
				//IL_006f: Unknown result type (might be due to invalid IL or missing references)
				//IL_0074: Unknown result type (might be due to invalid IL or missing references)
				//IL_007f: Unknown result type (might be due to invalid IL or missing references)
				//IL_0084: Unknown result type (might be due to invalid IL or missing references)
				//IL_008b: Unknown result type (might be due to invalid IL or missing references)
				//IL_008e: Unknown result type (might be due to invalid IL or missing references)
				switch (<>1__state)
				{
				default:
					return false;
				case 0:
					<>1__state = -1;
					<>2__current = (object)new WaitForSeconds(1f);
					<>1__state = 1;
					return true;
				case 1:
					<>1__state = -1;
					if (cruiser.magnetedToShip)
					{
						ManualLogSource? logger = CruiserSyncFixPlugin.logger;
						if (logger != null)
						{
							logger.LogInfo((object)"[BetterCruiserSync] HOST: Game started, sending cruiser state to all clients");
						}
						Traverse obj = Traverse.Create((object)cruiser);
						Vector3 value = obj.Field("magnetTargetPosition").GetValue<Vector3>();
						Quaternion value2 = obj.Field("magnetTargetRotation").GetValue<Quaternion>();
						cruiser.MagnetCarClientRpc(value, ((Quaternion)(ref value2)).eulerAngles, 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 <SendCruiserStateToNewClient>d__5 : IEnumerator<object>, IEnumerator, IDisposable
		{
			private int <>1__state;

			private object <>2__current;

			public ulong clientId;

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

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

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

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

			private bool MoveNext()
			{
				//IL_0042: Unknown result type (might be due to invalid IL or missing references)
				//IL_004c: Expected O, but got Unknown
				//IL_00b4: Unknown result type (might be due to invalid IL or missing references)
				//IL_00b9: Unknown result type (might be due to invalid IL or missing references)
				//IL_00c4: Unknown result type (might be due to invalid IL or missing references)
				//IL_00c9: 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_00e2: Unknown result type (might be due to invalid IL or missing references)
				//IL_00f7: 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)
				switch (<>1__state)
				{
				default:
					return false;
				case 0:
				{
					<>1__state = -1;
					ManualLogSource? logger4 = CruiserSyncFixPlugin.logger;
					if (logger4 != null)
					{
						logger4.LogInfo((object)$"[BetterCruiserSync] HOST: Waiting briefly for client {clientId} connection to stabilize...");
					}
					<>2__current = (object)new WaitForSeconds(5f);
					<>1__state = 1;
					return true;
				}
				case 1:
				{
					<>1__state = -1;
					VehicleController attachedVehicle = StartOfRound.Instance.attachedVehicle;
					if ((Object)(object)attachedVehicle != (Object)null && attachedVehicle.magnetedToShip)
					{
						ManualLogSource? logger = CruiserSyncFixPlugin.logger;
						if (logger != null)
						{
							logger.LogInfo((object)$"[BetterCruiserSync] HOST: Sending cruiser state to new client {clientId}");
						}
						Traverse obj = Traverse.Create((object)attachedVehicle);
						Vector3 value = obj.Field("magnetTargetPosition").GetValue<Vector3>();
						Quaternion value2 = obj.Field("magnetTargetRotation").GetValue<Quaternion>();
						ManualLogSource? logger2 = CruiserSyncFixPlugin.logger;
						if (logger2 != null)
						{
							logger2.LogInfo((object)$"[BetterCruiserSync] HOST: Cruiser state - Pos: {value}, Rot: {((Quaternion)(ref value2)).eulerAngles}");
						}
						attachedVehicle.MagnetCarClientRpc(value, ((Quaternion)(ref value2)).eulerAngles, (int)clientId);
					}
					else
					{
						ManualLogSource? logger3 = CruiserSyncFixPlugin.logger;
						if (logger3 != null)
						{
							logger3.LogInfo((object)"[BetterCruiserSync] HOST: No magnetized cruiser found");
						}
					}
					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 ManualLogSource? logger;

		private readonly Harmony harmony = new Harmony("MysticDEV.BetterCruiserSync");

		private void Awake()
		{
			logger = ((BaseUnityPlugin)this).Logger;
			harmony.PatchAll(typeof(CruiserSyncFixPlugin));
			logger.LogInfo((object)"[BetterCruiserSync] Plugin loaded!");
		}

		[HarmonyPatch(typeof(VehicleController), "MagnetCarServerRpc")]
		[HarmonyPostfix]
		private static void MagnetCarServerRpcPostfix(VehicleController __instance, Vector3 targetPosition, Vector3 targetRotation, int playerWhoSent)
		{
			//IL_0049: Unknown result type (might be due to invalid IL or missing references)
			//IL_004e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0059: Unknown result type (might be due to invalid IL or missing references)
			//IL_005e: Unknown result type (might be due to invalid IL or missing references)
			//IL_006f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0077: Unknown result type (might be due to invalid IL or missing references)
			//IL_008c: Unknown result type (might be due to invalid IL or missing references)
			//IL_008f: Unknown result type (might be due to invalid IL or missing references)
			if (GameNetworkManager.Instance.isHostingGame && __instance.magnetedToShip)
			{
				ManualLogSource? obj = logger;
				if (obj != null)
				{
					obj.LogInfo((object)$"[BetterCruiserSync] HOST: Received ServerRpc from player {playerWhoSent}, sending current magnet state to all clients");
				}
				Traverse obj2 = Traverse.Create((object)__instance);
				Vector3 value = obj2.Field("magnetTargetPosition").GetValue<Vector3>();
				Quaternion value2 = obj2.Field("magnetTargetRotation").GetValue<Quaternion>();
				ManualLogSource? obj3 = logger;
				if (obj3 != null)
				{
					obj3.LogInfo((object)$"[BetterCruiserSync] HOST: Current state - Pos: {value}, Rot: {((Quaternion)(ref value2)).eulerAngles}");
				}
				__instance.MagnetCarClientRpc(value, ((Quaternion)(ref value2)).eulerAngles, playerWhoSent);
			}
		}

		[HarmonyPatch(typeof(StartOfRound), "OnClientConnect")]
		[HarmonyPostfix]
		private static void OnClientConnectPostfix(ulong clientId)
		{
			if (GameNetworkManager.Instance.isHostingGame)
			{
				ManualLogSource? obj = logger;
				if (obj != null)
				{
					obj.LogInfo((object)$"[BetterCruiserSync] HOST: Client {clientId} connected, checking cruiser state...");
				}
				((MonoBehaviour)StartOfRound.Instance).StartCoroutine(SendCruiserStateToNewClient(clientId));
			}
		}

		[IteratorStateMachine(typeof(<SendCruiserStateToNewClient>d__5))]
		private static IEnumerator SendCruiserStateToNewClient(ulong clientId)
		{
			//yield-return decompiler failed: Unexpected instruction in Iterator.Dispose()
			return new <SendCruiserStateToNewClient>d__5(0)
			{
				clientId = clientId
			};
		}

		[HarmonyPatch(typeof(VehicleController), "Start")]
		[HarmonyPostfix]
		private static void VehicleStartPatch(VehicleController __instance)
		{
			if (!GameNetworkManager.Instance.isHostingGame)
			{
				((MonoBehaviour)__instance).StartCoroutine(RequestSyncFromHost(__instance));
			}
		}

		[HarmonyPatch(typeof(StartOfRound), "StartGame")]
		[HarmonyPostfix]
		private static void StartGamePostfix()
		{
			ManualLogSource? obj = logger;
			if (obj != null)
			{
				obj.LogInfo((object)"[BetterCruiserSync] Game started (lever pulled), checking cruiser sync...");
			}
			VehicleController attachedVehicle = StartOfRound.Instance.attachedVehicle;
			if ((Object)(object)attachedVehicle != (Object)null)
			{
				if (GameNetworkManager.Instance.isHostingGame)
				{
					((MonoBehaviour)StartOfRound.Instance).StartCoroutine(SendCruiserStateOnGameStart(attachedVehicle));
				}
				else
				{
					((MonoBehaviour)StartOfRound.Instance).StartCoroutine(RequestSyncOnGameStart(attachedVehicle));
				}
			}
		}

		[IteratorStateMachine(typeof(<SendCruiserStateOnGameStart>d__8))]
		private static IEnumerator SendCruiserStateOnGameStart(VehicleController cruiser)
		{
			//yield-return decompiler failed: Unexpected instruction in Iterator.Dispose()
			return new <SendCruiserStateOnGameStart>d__8(0)
			{
				cruiser = cruiser
			};
		}

		[IteratorStateMachine(typeof(<RequestSyncOnGameStart>d__9))]
		private static IEnumerator RequestSyncOnGameStart(VehicleController cruiser)
		{
			//yield-return decompiler failed: Unexpected instruction in Iterator.Dispose()
			return new <RequestSyncOnGameStart>d__9(0)
			{
				cruiser = cruiser
			};
		}

		[IteratorStateMachine(typeof(<RequestSyncFromHost>d__10))]
		private static IEnumerator RequestSyncFromHost(VehicleController vehicle)
		{
			//yield-return decompiler failed: Unexpected instruction in Iterator.Dispose()
			return new <RequestSyncFromHost>d__10(0)
			{
				vehicle = vehicle
			};
		}

		private static void CalculateAndFixCruiserPosition(VehicleController vehicle, Traverse vehicleTraverse)
		{
			//IL_001f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0024: Unknown result type (might be due to invalid IL or missing references)
			//IL_002f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0030: Unknown result type (might be due to invalid IL or missing references)
			//IL_0035: Unknown result type (might be due to invalid IL or missing references)
			//IL_0046: Unknown result type (might be due to invalid IL or missing references)
			//IL_0068: Unknown result type (might be due to invalid IL or missing references)
			//IL_0092: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ac: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ec: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ee: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f3: Unknown result type (might be due to invalid IL or missing references)
			//IL_0105: Unknown result type (might be due to invalid IL or missing references)
			//IL_0120: Unknown result type (might be due to invalid IL or missing references)
			//IL_0125: Unknown result type (might be due to invalid IL or missing references)
			//IL_0126: Unknown result type (might be due to invalid IL or missing references)
			//IL_012b: Unknown result type (might be due to invalid IL or missing references)
			//IL_013d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0159: Unknown result type (might be due to invalid IL or missing references)
			//IL_0170: Unknown result type (might be due to invalid IL or missing references)
			//IL_0188: Unknown result type (might be due to invalid IL or missing references)
			//IL_01a0: Unknown result type (might be due to invalid IL or missing references)
			//IL_0216: Unknown result type (might be due to invalid IL or missing references)
			//IL_0223: Unknown result type (might be due to invalid IL or missing references)
			ManualLogSource? obj = logger;
			if (obj != null)
			{
				obj.LogInfo((object)"[BetterCruiserSync] CLIENT: Starting local position calculation");
			}
			Vector3 position = StartOfRound.Instance.magnetPoint.position;
			Vector3 val = StartOfRound.Instance.elevatorTransform.InverseTransformPoint(position);
			ManualLogSource? obj2 = logger;
			if (obj2 != null)
			{
				obj2.LogInfo((object)$"[BetterCruiserSync] CLIENT: Raw magnetTargetPosition from magnet point: {val}");
			}
			val.z -= 2f;
			val.y = Mathf.Clamp(val.y, 2.2f, 2.6f);
			ManualLogSource? obj3 = logger;
			if (obj3 != null)
			{
				obj3.LogInfo((object)$"[BetterCruiserSync] CLIENT: Adjusted magnetTargetPosition: {val}");
			}
			float num = Mathf.Round((StartOfRound.Instance.elevatorTransform.eulerAngles.y + 90f) / 90f) * 90f;
			float num2 = Random.Range(-1f, 1f);
			Vector3 val2 = default(Vector3);
			((Vector3)(ref val2))..ctor(num2, num, 0f);
			Quaternion val3 = Quaternion.Euler(val2);
			ManualLogSource? obj4 = logger;
			if (obj4 != null)
			{
				obj4.LogInfo((object)$"[BetterCruiserSync] CLIENT: Target rotation: {val2}");
			}
			Vector3 val4 = StartOfRound.Instance.elevatorTransform.position + val;
			ManualLogSource? obj5 = logger;
			if (obj5 != null)
			{
				obj5.LogInfo((object)$"[BetterCruiserSync] CLIENT: World target position: {val4}");
			}
			vehicleTraverse.Field("magnetTargetPosition").SetValue((object)val);
			vehicleTraverse.Field("magnetTargetRotation").SetValue((object)val3);
			vehicleTraverse.Field("magnetStartPosition").SetValue((object)val4);
			vehicleTraverse.Field("magnetStartRotation").SetValue((object)val3);
			vehicleTraverse.Field("magnetTime").SetValue((object)1f);
			vehicleTraverse.Field("magnetRotationTime").SetValue((object)1f);
			vehicleTraverse.Field("finishedMagneting").SetValue((object)true);
			StartOfRound.Instance.isObjectAttachedToMagnet = true;
			StartOfRound.Instance.attachedVehicle = vehicle;
			((Component)vehicle).transform.position = val4;
			((Component)vehicle).transform.rotation = val3;
			if ((Object)(object)vehicle.mainRigidbody != (Object)null)
			{
				vehicle.mainRigidbody.isKinematic = true;
			}
			vehicle.CollectItemsInTruck();
			ManualLogSource? obj6 = logger;
			if (obj6 != null)
			{
				obj6.LogInfo((object)"[BetterCruiserSync] CLIENT: Local calculation complete!");
			}
		}

		[HarmonyPatch(typeof(VehicleController), "MagnetCarClientRpc")]
		[HarmonyPrefix]
		private static void MagnetCarClientRpcPrefix(Vector3 targetPosition, Vector3 targetRotation, int playerWhoSent)
		{
			//IL_000f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0015: Unknown result type (might be due to invalid IL or missing references)
			ManualLogSource? obj = logger;
			if (obj != null)
			{
				obj.LogInfo((object)$"[BetterCruiserSync] MagnetCarClientRpc received! Pos: {targetPosition}, Rot: {targetRotation}, Player: {playerWhoSent}");
			}
		}
	}
}