Decompiled source of REPO SteamNetworking Lib v0.1.1

plugins/RepoSteamNetworking/RepoSteamNetworking.dll

Decompiled 2 weeks ago
using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using System.Text;
using System.Threading;
using System.Timers;
using BepInEx;
using BepInEx.Bootstrap;
using BepInEx.Logging;
using HarmonyLib;
using Microsoft.CodeAnalysis;
using RepoSteamNetworking.API;
using RepoSteamNetworking.API.Asset;
using RepoSteamNetworking.API.Unity;
using RepoSteamNetworking.API.VersionCompat;
using RepoSteamNetworking.Networking;
using RepoSteamNetworking.Networking.Attributes;
using RepoSteamNetworking.Networking.Data;
using RepoSteamNetworking.Networking.NetworkedProperties;
using RepoSteamNetworking.Networking.Packets;
using RepoSteamNetworking.Networking.Registries;
using RepoSteamNetworking.Networking.Serialization;
using RepoSteamNetworking.Networking.Unity;
using RepoSteamNetworking.Odin.Formatters;
using RepoSteamNetworking.Prefab;
using RepoSteamNetworking.Prefab.Modifications;
using RepoSteamNetworking.Utils;
using RepoSteamNetworking.Utils.Tween;
using Sirenix.Serialization;
using Steamworks;
using Steamworks.Data;
using UnityEngine;
using UnityEngine.Events;
using UnityEngine.UI.CoroutineTween;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: IgnoresAccessChecksTo("Assembly-CSharp-firstpass")]
[assembly: IgnoresAccessChecksTo("Assembly-CSharp")]
[assembly: IgnoresAccessChecksTo("Autodesk.Fbx")]
[assembly: IgnoresAccessChecksTo("Facepunch.Steamworks.Win64")]
[assembly: IgnoresAccessChecksTo("FbxBuildTestAssets")]
[assembly: IgnoresAccessChecksTo("Klattersynth")]
[assembly: IgnoresAccessChecksTo("Photon3Unity3D")]
[assembly: IgnoresAccessChecksTo("PhotonChat")]
[assembly: IgnoresAccessChecksTo("PhotonRealtime")]
[assembly: IgnoresAccessChecksTo("PhotonUnityNetworking")]
[assembly: IgnoresAccessChecksTo("PhotonUnityNetworking.Utilities")]
[assembly: IgnoresAccessChecksTo("PhotonVoice.API")]
[assembly: IgnoresAccessChecksTo("PhotonVoice")]
[assembly: IgnoresAccessChecksTo("PhotonVoice.PUN")]
[assembly: IgnoresAccessChecksTo("SingularityGroup.HotReload.Runtime")]
[assembly: IgnoresAccessChecksTo("SingularityGroup.HotReload.Runtime.Public")]
[assembly: IgnoresAccessChecksTo("Sirenix.OdinInspector.Attributes")]
[assembly: IgnoresAccessChecksTo("Sirenix.Serialization.Config")]
[assembly: IgnoresAccessChecksTo("Sirenix.Serialization")]
[assembly: IgnoresAccessChecksTo("Sirenix.Utilities")]
[assembly: IgnoresAccessChecksTo("Unity.AI.Navigation")]
[assembly: IgnoresAccessChecksTo("Unity.Formats.Fbx.Runtime")]
[assembly: IgnoresAccessChecksTo("Unity.InputSystem")]
[assembly: IgnoresAccessChecksTo("Unity.InputSystem.ForUI")]
[assembly: IgnoresAccessChecksTo("Unity.Postprocessing.Runtime")]
[assembly: IgnoresAccessChecksTo("Unity.RenderPipelines.Core.Runtime")]
[assembly: IgnoresAccessChecksTo("Unity.RenderPipelines.Core.ShaderLibrary")]
[assembly: IgnoresAccessChecksTo("Unity.RenderPipelines.ShaderGraph.ShaderGraphLibrary")]
[assembly: IgnoresAccessChecksTo("Unity.TextMeshPro")]
[assembly: IgnoresAccessChecksTo("Unity.Timeline")]
[assembly: IgnoresAccessChecksTo("Unity.VisualScripting.Antlr3.Runtime")]
[assembly: IgnoresAccessChecksTo("Unity.VisualScripting.Core")]
[assembly: IgnoresAccessChecksTo("Unity.VisualScripting.Flow")]
[assembly: IgnoresAccessChecksTo("Unity.VisualScripting.State")]
[assembly: IgnoresAccessChecksTo("UnityEngine.ARModule")]
[assembly: IgnoresAccessChecksTo("UnityEngine.NVIDIAModule")]
[assembly: IgnoresAccessChecksTo("UnityEngine.UI")]
[assembly: IgnoresAccessChecksTo("websocket-sharp")]
[assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")]
[assembly: RegisterFormatter(typeof(BitFlagsFormatter), 0)]
[assembly: RegisterFormatter(typeof(NetworkTransformDeltaFormatter), 0)]
[assembly: AssemblyCompany("Rune580")]
[assembly: AssemblyConfiguration("Release")]
[assembly: AssemblyFileVersion("0.1.1.0")]
[assembly: AssemblyInformationalVersion("0.1.1+52aa028d65410e8d0c63d6127f93cd5b2609ddb9")]
[assembly: AssemblyProduct("RepoSteamNetworking")]
[assembly: AssemblyTitle("RepoSteamNetworking")]
[assembly: AssemblyMetadata("RepositoryUrl", "https://github.com/Rune580/RepoSteamNetworking")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("0.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 RepoSteamNetworking
{
	[RSNVersionCompatibility(VersionCompatibility.Any, false)]
	[BepInPlugin("com.rune580.reposteamnetworking", "Repo Steam Networking", "0.1.1")]
	public class RepoSteamNetworkingPlugin : BaseUnityPlugin
	{
		private void Awake()
		{
			Logging.SetLogSource(((BaseUnityPlugin)this).Logger);
			Harmony.CreateAndPatchAll(Assembly.GetExecutingAssembly(), "com.rune580.reposteamnetworking");
			RegisterPackets();
		}

		private void RegisterPackets()
		{
			RepoSteamNetwork.RegisterPacket<HandshakeStartAuthPacket>();
			RepoSteamNetwork.RegisterPacket<HandshakeAuthConnectionPacket>();
			RepoSteamNetwork.RegisterPacket<HandshakeStatusPacket>();
			RepoSteamNetwork.AddCallback<HandshakeStatusPacket>(PacketHandler.OnHandshakeStatusReceived);
			RepoSteamNetwork.RegisterPacket<ClientModVersionRegistryPacket>();
			RepoSteamNetwork.AddCallback<ClientModVersionRegistryPacket>(PacketHandler.OnClientModVersionRegistryReceived);
			RepoSteamNetwork.RegisterPacket<ServerModVersionRegistryStatusPacket>();
			RepoSteamNetwork.AddCallback<ServerModVersionRegistryStatusPacket>(PacketHandler.OnServerModVersionRegistryReceived);
			RepoSteamNetwork.RegisterPacket<SetConnectionPalettesPacket>();
			RepoSteamNetwork.AddCallback<SetConnectionPalettesPacket>(PacketHandler.OnSetConnectionPalettesReceived);
			RepoSteamNetwork.RegisterPacket<CallRPCPacket>();
			RepoSteamNetwork.AddCallback<CallRPCPacket>(PacketHandler.OnCallRPCPacketReceived);
			RepoSteamNetwork.RegisterPacket<NetworkedPropertiesDataPacket>();
			RepoSteamNetwork.AddCallback<NetworkedPropertiesDataPacket>(NetworkedPropertyManager.OnNetworkedPropertiesPacketReceived);
			RepoSteamNetwork.RegisterPacket<InstantiateNetworkedPrefabPacket>();
			RepoSteamNetwork.AddCallback<InstantiateNetworkedPrefabPacket>(PacketHandler.OnInstantiateNetworkedPrefabPacketReceived);
		}
	}
	public static class MyPluginInfo
	{
		public const string PLUGIN_GUID = "com.rune580.reposteamnetworking";

		public const string PLUGIN_NAME = "Repo Steam Networking";

		public const string PLUGIN_VERSION = "0.1.1";
	}
}
namespace RepoSteamNetworking.Utils
{
	public struct BitFlags
	{
		private bool[] _bits;

		public bool this[int index]
		{
			get
			{
				return _bits[index];
			}
			set
			{
				if (_bits == null)
				{
					_bits = new bool[8];
				}
				while (index >= _bits.Length)
				{
					Array.Resize(ref _bits, _bits.Length * 2);
				}
				_bits[index] = value;
			}
		}

		public BitFlags(byte bits)
		{
			_bits = new bool[8];
			for (int i = 0; i < _bits.Length; i++)
			{
				_bits[i] = (bits & (1 << i)) != 0;
			}
		}

		public BitFlags(ushort bits)
		{
			_bits = new bool[16];
			for (int i = 0; i < _bits.Length; i++)
			{
				_bits[i] = (bits & (1 << i)) != 0;
			}
		}

		public BitFlags(byte[] bytes)
		{
			_bits = new bool[bytes.Length * 8];
			for (int i = 0; i < _bits.Length; i++)
			{
				int num = i / 8;
				_bits[i] = (bytes[num] & (1 << i - 8 * num)) != 0;
			}
		}

		public void SetFromBytes(byte[] bytes)
		{
			_bits = new bool[bytes.Length * 8];
			for (int i = 0; i < _bits.Length; i++)
			{
				int num = i / 8;
				_bits[i] = (bytes[num] & (1 << i - 8 * num)) != 0;
			}
		}

		public byte[] AsByteArray()
		{
			byte[] array = new byte[_bits.Length / 8];
			for (int i = 0; i < _bits.Length; i++)
			{
				int num = i / 8;
				array[num] |= (byte)((_bits[i] ? 1u : 0u) << i);
			}
			return array;
		}
	}
	internal static class ComponentUtils
	{
		private const BindingFlags Flags = BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.FlattenHierarchy;

		public static IEnumerable<FieldInfo> GetAllSerializedFields(this Component component)
		{
			return from type in ((object)component).GetType().GetFields(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.FlattenHierarchy)
				where type.IsDefined(typeof(SerializeField), inherit: false) || type.IsPublic
				select type;
		}

		public static Component GetOrAddComponent(this GameObject gameObject, string assemblyQualifiedName)
		{
			Type type = Type.GetType(assemblyQualifiedName);
			Component component = gameObject.GetComponent(type);
			if (Object.op_Implicit((Object)(object)component))
			{
				return component;
			}
			return gameObject.AddComponent(type);
		}

		public static Component GetOrAddComponent(this Transform transform, string assemblyQualifiedName)
		{
			return ((Component)transform).gameObject.GetOrAddComponent(assemblyQualifiedName);
		}

		public static void SetFieldValues(this Component component, Dictionary<string, object?> values)
		{
			Type type = ((object)component).GetType();
			foreach (KeyValuePair<string, object> value3 in values)
			{
				value3.Deconstruct(out var key, out var value);
				string text = key;
				object value2 = value;
				FieldInfo field = type.GetField(text, BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.FlattenHierarchy);
				if ((object)field == null)
				{
					Logging.Warn("Failed to find field " + text + " on component " + type.Name + "!");
				}
				else
				{
					field.SetValue(component, value2);
				}
			}
		}
	}
	internal static class Logging
	{
		private static ManualLogSource? _logSource;

		internal static void SetLogSource(ManualLogSource logSource)
		{
			_logSource = logSource;
		}

		public static void Error(object data)
		{
			Error(data.ToString());
		}

		public static void Warn(object data)
		{
			Warn(data.ToString());
		}

		public static void Info(object data)
		{
			Info(data.ToString());
		}

		public static void Debug(object data)
		{
			Debug(data.ToString());
		}

		public static void Error(string msg)
		{
			if (_logSource == null)
			{
				Debug.LogError((object)("[Repo Steam Networking] [Error] " + msg));
			}
			else
			{
				_logSource.LogError((object)msg);
			}
		}

		public static void Warn(string msg)
		{
			if (_logSource == null)
			{
				Debug.LogWarning((object)("[Repo Steam Networking] [Warning] " + msg));
			}
			else
			{
				_logSource.LogWarning((object)msg);
			}
		}

		public static void Info(string msg)
		{
			if (_logSource == null)
			{
				Debug.Log((object)("[Repo Steam Networking] [Info] " + msg));
			}
			else
			{
				_logSource.LogInfo((object)msg);
			}
		}

		public static void Debug(string msg)
		{
			if (_logSource == null)
			{
				Debug.Log((object)("[Repo Steam Networking] [Debug] " + msg));
			}
			else
			{
				_logSource.LogDebug((object)msg);
			}
		}

		public static string DebugFormat(this object obj, bool showTypeName = false, bool newLine = false, int depth = 0)
		{
			Type type = obj.GetType();
			StringBuilder stringBuilder = new StringBuilder();
			if (showTypeName)
			{
				stringBuilder.Append(type.Name + " ");
			}
			stringBuilder.Append("( ");
			PropertyInfo[] properties = type.GetProperties();
			foreach (PropertyInfo obj2 in properties)
			{
				if (newLine)
				{
					stringBuilder.AppendLine();
				}
				string name = obj2.Name;
				object value = obj2.GetValue(obj);
				if (depth > 0)
				{
					try
					{
						stringBuilder.Append(value.DebugFormat(showTypeName, newLine, depth - 1));
					}
					catch
					{
						stringBuilder.Append($"{name}: {value},");
					}
				}
				else
				{
					stringBuilder.Append($"{name}: {value},");
				}
				if (!newLine)
				{
					stringBuilder.Append(" ");
				}
			}
			FieldInfo[] fields = type.GetFields();
			foreach (FieldInfo obj4 in fields)
			{
				if (newLine)
				{
					stringBuilder.AppendLine();
				}
				string name2 = obj4.Name;
				object value2 = obj4.GetValue(obj);
				if (depth > 0)
				{
					try
					{
						stringBuilder.Append(value2.DebugFormat(showTypeName, newLine, depth - 1));
					}
					catch
					{
						stringBuilder.Append($"{name2}: {value2},");
					}
				}
				else
				{
					stringBuilder.Append($"{name2}: {value2},");
				}
				if (!newLine)
				{
					stringBuilder.Append(" ");
				}
			}
			if (newLine)
			{
				stringBuilder.AppendLine();
			}
			stringBuilder.Append(")");
			return stringBuilder.ToString();
		}

		public static string DebugFormatArray<T>(this IEnumerable<T> array)
		{
			StringBuilder stringBuilder = new StringBuilder();
			foreach (T item in array)
			{
				stringBuilder.Append($"{item},");
			}
			return stringBuilder.ToString().TrimEnd(',');
		}
	}
	internal class MethodHandler : IEquatable<MethodHandler>
	{
		private readonly MethodInfo _method;

		private readonly object? _target;

		private MethodHandler(MethodInfo method, object? target = null)
		{
			_method = method;
			_target = target;
		}

		public void Invoke(params object[] parameters)
		{
			_method.Invoke(_target, parameters);
		}

		public static MethodHandler FromAction<T1>(Action<T1> action)
		{
			MethodInfo method = action.Method;
			object target = action.Target;
			return new MethodHandler(method, target);
		}

		public bool Equals(MethodHandler? other)
		{
			if ((object)other == null)
			{
				return false;
			}
			if ((object)this == other)
			{
				return true;
			}
			if (_method.Name != other._method.Name)
			{
				return false;
			}
			if (_target != other._target)
			{
				return false;
			}
			ParameterInfo[] parameters = _method.GetParameters();
			ParameterInfo[] parameters2 = other._method.GetParameters();
			if (parameters.Length != parameters2.Length)
			{
				return false;
			}
			for (int i = 0; i < parameters.Length; i++)
			{
				if (parameters[i] != parameters2[i])
				{
					return false;
				}
			}
			return true;
		}

		public override bool Equals(object? obj)
		{
			if (obj == null)
			{
				return false;
			}
			if (this == obj)
			{
				return true;
			}
			if (obj.GetType() != GetType())
			{
				return false;
			}
			return Equals((MethodHandler)obj);
		}

		public override int GetHashCode()
		{
			return HashCode.Combine(_method, _target);
		}

		public static bool operator ==(MethodHandler? left, MethodHandler? right)
		{
			return object.Equals(left, right);
		}

		public static bool operator !=(MethodHandler? left, MethodHandler? right)
		{
			return !object.Equals(left, right);
		}
	}
	internal static class ReflectionUtils
	{
		public static IEnumerable<Type> GetLoadableTypes(this Assembly assembly)
		{
			try
			{
				return assembly.GetTypes();
			}
			catch (ReflectionTypeLoadException ex)
			{
				return ex.Types.Where((Type t) => (object)t != null);
			}
		}

		public static BepInPlugin? GetPluginInfoFromAssembly(this Assembly assembly)
		{
			return assembly.GetLoadableTypes().SelectMany((Type type) => ((MemberInfo)type).GetCustomAttributes<BepInPlugin>()).FirstOrDefault();
		}
	}
	internal class RPCMethodHelper
	{
		private readonly Dictionary<int, Dictionary<int, MethodInfo>> _methodInfoCache = new Dictionary<int, Dictionary<int, MethodInfo>>();

		public void InvokeRPC(object target, string methodName, object[] parameters)
		{
			GetMethodInfo(target, methodName, parameters)?.Invoke(target, parameters);
		}

		private MethodInfo? GetMethodInfo(object target, string methodName, object[] parameters)
		{
			int hashcodeFromTarget = GetHashcodeFromTarget(target);
			if (!_methodInfoCache.TryGetValue(hashcodeFromTarget, out Dictionary<int, MethodInfo> value))
			{
				value = (_methodInfoCache[hashcodeFromTarget] = new Dictionary<int, MethodInfo>());
			}
			Type[] array = parameters.Select((object parameter) => parameter.GetType()).ToArray();
			int hashcodeFromMethod = GetHashcodeFromMethod(methodName, array);
			if (!value.TryGetValue(hashcodeFromMethod, out var value2))
			{
				value2 = (value[hashcodeFromMethod] = target.GetType().GetMethod(methodName, BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.FlattenHierarchy, null, CallingConventions.Any, array, Array.Empty<ParameterModifier>()));
			}
			if ((object)value2 == null)
			{
				Logging.Error("Failed to find RPC method " + methodName + " on " + target.GetType().Name + " with parameter types " + array.Select((Type type) => type.FullName).ToArray().DebugFormatArray());
				return null;
			}
			return value2;
		}

		private static int GetHashcodeFromTarget(object target)
		{
			Type type = target.GetType();
			return (type.Assembly.FullName + type.FullName).GetHashCode();
		}

		private static int GetHashcodeFromMethod(string methodName, Type[] parameterTypes)
		{
			string seed = methodName + ",";
			seed = parameterTypes.Aggregate(seed, (string current, Type parameterType) => current + parameterType.Assembly.FullName + parameterType.FullName + ",");
			seed = seed.TrimEnd(',');
			return seed.GetHashCode();
		}
	}
	internal static class SteamIdUtils
	{
		private static readonly Dictionary<ulong, string> CachedSteamIds = new Dictionary<ulong, string>();

		public static string GetLobbyName(this SteamId steamId)
		{
			//IL_0007: Unknown result type (might be due to invalid IL or missing references)
			//IL_0008: Unknown result type (might be due to invalid IL or missing references)
			//IL_0013: Unknown result type (might be due to invalid IL or missing references)
			//IL_0028: Unknown result type (might be due to invalid IL or missing references)
			//IL_002d: 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_00ce: Unknown result type (might be due to invalid IL or missing references)
			if (CachedSteamIds.TryGetValue(SteamId.op_Implicit(steamId), out string value))
			{
				return value;
			}
			Lobby currentLobby = RepoSteamNetwork.GetCurrentLobby();
			SteamFriends.RequestUserInformation(steamId, true);
			string[] array = ((Lobby)(ref currentLobby)).Members.Where((Friend friend) => SteamId.op_Implicit(friend.Id) == SteamId.op_Implicit(steamId)).SelectMany((Friend friend) => ((Friend)(ref friend)).NameHistory).ToArray();
			if (array.Length == 0)
			{
				return $"SteamId: {steamId.Value}";
			}
			string text = array.First();
			if (string.IsNullOrEmpty(text))
			{
				return $"SteamId: {steamId.Value}";
			}
			CachedSteamIds[SteamId.op_Implicit(steamId)] = text;
			return text;
		}
	}
	internal static class SubIdentityHelper
	{
		public static void RegisterAllSubIdentities(this GameObject gameObject)
		{
			IEnumerable<ISteamNetworkSubIdentity> enumerable = gameObject.GetComponentsInChildren<Component>().OfType<ISteamNetworkSubIdentity>();
			RepoSteamNetworkIdentity repoSteamNetworkIdentity = null;
			foreach (ISteamNetworkSubIdentity item in enumerable)
			{
				if (repoSteamNetworkIdentity == null)
				{
					repoSteamNetworkIdentity = item.GetNetworkIdentity();
				}
				repoSteamNetworkIdentity.RegisterSubIdentity(item);
			}
		}
	}
	internal static class TransformUtils
	{
		public static string GetPathFromParent(this Transform current, Transform target)
		{
			string text = ((Object)current).name;
			Transform parent = current.parent;
			while ((Object)(object)parent != (Object)(object)target && Object.op_Implicit((Object)(object)parent))
			{
				text = ((Object)parent).name + "/" + text;
				parent = parent.parent;
			}
			return text;
		}
	}
	internal static class VariableDeltaHelper
	{
		public static object Add(object left, object right)
		{
			//IL_00d7: Unknown result type (might be due to invalid IL or missing references)
			//IL_00dc: 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_00f1: Unknown result type (might be due to invalid IL or missing references)
			//IL_021d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0220: Unknown result type (might be due to invalid IL or missing references)
			//IL_0225: Unknown result type (might be due to invalid IL or missing references)
			//IL_0101: Unknown result type (might be due to invalid IL or missing references)
			//IL_0106: Unknown result type (might be due to invalid IL or missing references)
			//IL_0233: Unknown result type (might be due to invalid IL or missing references)
			//IL_0236: Unknown result type (might be due to invalid IL or missing references)
			//IL_023b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0116: Unknown result type (might be due to invalid IL or missing references)
			//IL_011b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0249: Unknown result type (might be due to invalid IL or missing references)
			//IL_024c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0251: 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_0130: Unknown result type (might be due to invalid IL or missing references)
			//IL_025f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0262: Unknown result type (might be due to invalid IL or missing references)
			//IL_0267: Unknown result type (might be due to invalid IL or missing references)
			//IL_0143: Unknown result type (might be due to invalid IL or missing references)
			//IL_0148: Unknown result type (might be due to invalid IL or missing references)
			//IL_0275: Unknown result type (might be due to invalid IL or missing references)
			//IL_0278: Unknown result type (might be due to invalid IL or missing references)
			//IL_027d: Unknown result type (might be due to invalid IL or missing references)
			//IL_028b: Unknown result type (might be due to invalid IL or missing references)
			//IL_028e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0293: Unknown result type (might be due to invalid IL or missing references)
			if (!(left is byte b))
			{
				if (!(left is sbyte b2))
				{
					if (!(left is ushort num))
					{
						if (!(left is short num2))
						{
							if (!(left is uint num3))
							{
								if (!(left is int num4))
								{
									if (!(left is ulong num5))
									{
										if (!(left is long num6))
										{
											if (!(left is float num7))
											{
												if (!(left is double num8))
												{
													if (!(left is Vector2 val))
													{
														if (!(left is Vector2Int val2))
														{
															if (!(left is Vector3 val3))
															{
																if (!(left is Vector3Int val4))
																{
																	if (!(left is Vector4 val5))
																	{
																		if (left is Color val6)
																		{
																			return val6 + (Color)right;
																		}
																		throw new ArgumentOutOfRangeException("left", left, null);
																	}
																	return val5 + (Vector4)right;
																}
																return val4 + (Vector3Int)right;
															}
															return val3 + (Vector3)right;
														}
														return val2 + (Vector2Int)right;
													}
													return val + (Vector2)right;
												}
												return num8 + (double)right;
											}
											return num7 + (float)right;
										}
										return num6 + (long)right;
									}
									return num5 + (ulong)right;
								}
								return num4 + (int)right;
							}
							return num3 + (uint)right;
						}
						return num2 + (short)right;
					}
					return num + (ushort)right;
				}
				return b2 + (sbyte)right;
			}
			return b + (byte)right;
		}
	}
}
namespace RepoSteamNetworking.Utils.Tween
{
	public struct Vector3Tween : ITweenValue
	{
		private class Vector3TweenCallback : UnityEvent<Vector3>
		{
		}

		private Vector3TweenCallback? _target;

		public bool ignoreTimeScale { get; set; }

		public float duration { get; set; }

		public Vector3 StartValue { get; set; }

		public Vector3 TargetValue { get; set; }

		public void TweenValue(float floatPercentage)
		{
			//IL_000a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0010: Unknown result type (might be due to invalid IL or missing references)
			//IL_0016: Unknown result type (might be due to invalid IL or missing references)
			//IL_001b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0022: Unknown result type (might be due to invalid IL or missing references)
			if (ValidTarget())
			{
				Vector3 val = Vector3.Lerp(StartValue, TargetValue, floatPercentage);
				((UnityEvent<Vector3>)_target).Invoke(val);
			}
		}

		public void AddOnChangedCallback(UnityAction<Vector3> callback)
		{
			if (_target == null)
			{
				_target = new Vector3TweenCallback();
			}
			((UnityEvent<Vector3>)_target).AddListener(callback);
		}

		public bool ValidTarget()
		{
			return _target != null;
		}
	}
}
namespace RepoSteamNetworking.Prefab
{
	internal class PrefabComponentState
	{
		public readonly string FullTypeName;

		public readonly FieldInfo[] SerializableFields;

		public readonly Dictionary<string, object?> Values = new Dictionary<string, object>();

		public uint ComponentIndex;

		public PrefabComponentState(Component component)
		{
			FullTypeName = ((object)component).GetType().AssemblyQualifiedName;
			List<FieldInfo> list = new List<FieldInfo>();
			foreach (FieldInfo allSerializedField in component.GetAllSerializedFields())
			{
				if ((object)allSerializedField != null)
				{
					list.Add(allSerializedField);
					Values[allSerializedField.Name] = allSerializedField.GetValue(component);
				}
			}
			SerializableFields = list.ToArray();
		}

		public bool AreFieldsEqual(PrefabComponentState other)
		{
			return GetChangedValues(other).Count == 0;
		}

		public Dictionary<string, object?> GetChangedValues(PrefabComponentState other)
		{
			Dictionary<string, object> dictionary = new Dictionary<string, object>();
			HashSet<string> hashSet = other.Values.Keys.ToHashSet();
			foreach (var (text2, obj2) in Values)
			{
				if (!other.Values.TryGetValue(text2, out object value))
				{
					dictionary[text2] = null;
				}
				else if (obj2 != value)
				{
					dictionary[text2] = value;
				}
				else if (!hashSet.Remove(text2))
				{
					dictionary[text2] = null;
				}
			}
			foreach (string item in hashSet)
			{
				dictionary[item] = other.Values[item];
			}
			return dictionary;
		}
	}
	internal class PrefabGameObjectState
	{
		public readonly string PrefabPath;

		public readonly PrefabComponentState[] Components;

		public readonly PrefabGameObjectState[] Children;

		private PrefabState _prefab;

		private readonly Dictionary<string, int> _pathChildMap = new Dictionary<string, int>();

		private readonly Dictionary<string, int> _pathComponentMap = new Dictionary<string, int>();

		public string Name => PrefabPath.Split('/', StringSplitOptions.RemoveEmptyEntries).Last();

		public string ParentPrefabPath
		{
			get
			{
				if (!(PrefabPath == Name))
				{
					return PrefabPath.Replace("/" + Name, "");
				}
				return string.Empty;
			}
		}

		public PrefabGameObjectState(string currentPath, GameObject gameObject, PrefabState prefab)
		{
			//IL_0142: Unknown result type (might be due to invalid IL or missing references)
			//IL_0149: Expected O, but got Unknown
			_prefab = prefab;
			PrefabPath = (string.IsNullOrEmpty(currentPath) ? ((Object)gameObject).name : (currentPath + "/" + ((Object)gameObject).name));
			_prefab.AddChildPath(PrefabPath);
			Component[] components = gameObject.GetComponents<Component>();
			Components = new PrefabComponentState[components.Length];
			Dictionary<string, uint> dictionary = new Dictionary<string, uint>();
			for (int i = 0; i < components.Length; i++)
			{
				PrefabComponentState prefabComponentState = new PrefabComponentState(components[i]);
				if (!dictionary.TryGetValue(prefabComponentState.FullTypeName, out var value))
				{
					value = (dictionary[prefabComponentState.FullTypeName] = 0u);
				}
				prefabComponentState.ComponentIndex = value++;
				dictionary[prefabComponentState.FullTypeName] = value;
				string text = $"{PrefabPath}:{prefabComponentState.FullTypeName}-{prefabComponentState.ComponentIndex}";
				_prefab.AddComponentPath(text);
				_pathComponentMap[text] = i;
				Components[i] = prefabComponentState;
			}
			List<PrefabGameObjectState> list = new List<PrefabGameObjectState>();
			int num2 = 0;
			foreach (Transform item in gameObject.transform)
			{
				Transform val = item;
				PrefabGameObjectState prefabGameObjectState = new PrefabGameObjectState(PrefabPath, ((Component)val).gameObject, _prefab);
				list.Add(prefabGameObjectState);
				_prefab.AddChildPath(prefabGameObjectState.PrefabPath);
				_pathChildMap[prefabGameObjectState.PrefabPath] = num2++;
			}
			Children = list.ToArray();
		}

		public bool TryGetChild(string path, out PrefabGameObjectState child)
		{
			child = null;
			if (!_pathChildMap.TryGetValue(path, out var value))
			{
				return false;
			}
			child = Children[value];
			return true;
		}

		public bool TryGetComponent(string componentPath, out PrefabComponentState component)
		{
			component = null;
			string text = componentPath.Split(':').First();
			if (PrefabPath != text)
			{
				if (!TryGetChild(text, out PrefabGameObjectState child))
				{
					return false;
				}
				return child.TryGetComponent(componentPath, out component);
			}
			if (!_pathComponentMap.TryGetValue(componentPath, out var value))
			{
				return false;
			}
			component = Components[value];
			return true;
		}
	}
	internal class PrefabState
	{
		public readonly PrefabGameObjectState Root;

		private readonly HashSet<string> _childPaths = new HashSet<string>();

		private readonly HashSet<string> _componentPaths = new HashSet<string>();

		public PrefabState(GameObject gameObject)
		{
			Root = new PrefabGameObjectState("", gameObject, this);
		}

		public bool TryGetGameObject(string path, out PrefabGameObjectState gameObject)
		{
			if (string.IsNullOrEmpty(path) || path == Root.Name)
			{
				gameObject = Root;
				return true;
			}
			return Root.TryGetChild(path, out gameObject);
		}

		public void AddChildPath(string path)
		{
			_childPaths.Add(path);
		}

		public void AddComponentPath(string path)
		{
			_componentPaths.Add(path);
		}

		public bool TryGetComponent(string componentPath, out PrefabComponentState component)
		{
			return Root.TryGetComponent(componentPath, out component);
		}

		public PrefabModifications GetModifications(PrefabState modifiedPrefab)
		{
			HashSet<string> hashSet = new HashSet<string>(modifiedPrefab._childPaths);
			HashSet<string> hashSet2 = new HashSet<string>(modifiedPrefab._componentPaths);
			HashSet<string> removedChildPaths = new HashSet<string>();
			HashSet<string> removedComponentPaths = new HashSet<string>();
			PrefabModifications prefabModifications = new PrefabModifications();
			foreach (string childPath3 in _childPaths)
			{
				if (removedChildPaths.Any((string removedPath) => childPath3.Contains(removedPath)))
				{
					continue;
				}
				PrefabGameObjectState gameObject;
				if (childPath3 == Root.Name)
				{
					gameObject = modifiedPrefab.Root;
				}
				else if (!modifiedPrefab.TryGetGameObject(childPath3, out gameObject))
				{
					removedChildPaths.Add(childPath3);
					prefabModifications.AddModification(new GameObjectRemovedModification(childPath3));
					continue;
				}
				TryGetGameObject(childPath3, out PrefabGameObjectState gameObject2);
				PrefabComponentState[] components = gameObject2.Components;
				foreach (PrefabComponentState prefabComponentState in components)
				{
					string text = $"{gameObject2.PrefabPath}:{prefabComponentState.FullTypeName}-{prefabComponentState.ComponentIndex}";
					if (!gameObject.TryGetComponent(text, out PrefabComponentState component))
					{
						removedComponentPaths.Add(text);
						prefabModifications.AddModification(new ComponentRemovedModification(text));
						continue;
					}
					Dictionary<string, object> changedValues = prefabComponentState.GetChangedValues(component);
					if (changedValues.Count > 0)
					{
						hashSet2.Remove(text);
						prefabModifications.AddModification(new ComponentValuesModification(text, changedValues));
					}
					else
					{
						hashSet2.Remove(text);
					}
				}
				foreach (string item in hashSet2.Where((string otherComponentPath) => !removedComponentPaths.Any(otherComponentPath.Contains)))
				{
					if (!gameObject.TryGetComponent(item, out PrefabComponentState component2))
					{
						Logging.Error("Failed to find component in Modified Prefab even though path came from said prefab?");
					}
					else
					{
						prefabModifications.AddModification(new ComponentAddedModification(item, component2.Values));
					}
				}
				hashSet.Remove(childPath3);
			}
			IOrderedEnumerable<string> orderedEnumerable = from otherChild in hashSet
				where !removedChildPaths.Any(otherChild.Contains)
				select otherChild into childPath
				orderby childPath.Split('/').Length
				select childPath;
			HashSet<string> hashSet3 = new HashSet<string>();
			foreach (string childPath2 in orderedEnumerable)
			{
				if (!hashSet3.Any((string addedPath) => childPath2.Contains(addedPath)))
				{
					if (!modifiedPrefab.TryGetGameObject(childPath2, out PrefabGameObjectState gameObject3))
					{
						Logging.Error("Failed to find child in Modified Prefab even though path came from said prefab?");
						continue;
					}
					prefabModifications.AddModification(new GameObjectAddedModification(gameObject3));
					hashSet3.Add(childPath2);
				}
			}
			return prefabModifications;
		}
	}
}
namespace RepoSteamNetworking.Prefab.Modifications
{
	[Serializable]
	public abstract class BasePrefabModification
	{
		internal abstract void Apply(GameObject prefabRoot);
	}
	[Serializable]
	public class ComponentAddedModification : BasePrefabModification
	{
		public string ComponentPath;

		public Dictionary<string, object?> Values;

		public string FullTypeName => ComponentPath.Split(':').Last().Split('-')
			.First();

		public string PrefabPath => ComponentPath.Split(':').First();

		public ComponentAddedModification()
		{
			ComponentPath = string.Empty;
			Values = new Dictionary<string, object>();
		}

		public ComponentAddedModification(string componentPath, Dictionary<string, object?> values)
		{
			ComponentPath = componentPath;
			Values = values;
		}

		internal override void Apply(GameObject prefabRoot)
		{
			((PrefabPath == ((Object)prefabRoot).name) ? prefabRoot.transform : prefabRoot.transform.Find(PrefabPath)).GetOrAddComponent(FullTypeName).SetFieldValues(Values);
		}
	}
	[Serializable]
	public class ComponentRemovedModification : BasePrefabModification
	{
		public string ComponentPath;

		public string FullTypeName => ComponentPath.Split(':').Last().Split('-')
			.First();

		public string PrefabPath => ComponentPath.Split(':').First();

		public ComponentRemovedModification()
		{
			ComponentPath = string.Empty;
		}

		public ComponentRemovedModification(string componentPath)
		{
			ComponentPath = componentPath;
		}

		internal override void Apply(GameObject prefabRoot)
		{
			Object.DestroyImmediate((Object)(object)((PrefabPath == ((Object)prefabRoot).name) ? prefabRoot.transform : prefabRoot.transform.Find(PrefabPath)).GetOrAddComponent(FullTypeName));
		}
	}
	[Serializable]
	public class ComponentValuesModification : BasePrefabModification
	{
		public string ComponentPath;

		public Dictionary<string, object?> Values;

		public string FullTypeName => ComponentPath.Split(':').Last().Split('-')
			.First();

		public string PrefabPath => ComponentPath.Split(':').First();

		public ComponentValuesModification()
		{
			ComponentPath = string.Empty;
			Values = new Dictionary<string, object>();
		}

		public ComponentValuesModification(string componentPath, Dictionary<string, object?> values)
		{
			ComponentPath = componentPath;
			Values = values;
		}

		internal override void Apply(GameObject prefabRoot)
		{
			((PrefabPath == ((Object)prefabRoot).name) ? prefabRoot.transform : prefabRoot.transform.Find(PrefabPath)).GetOrAddComponent(FullTypeName).SetFieldValues(Values);
		}
	}
	[Serializable]
	public class GameObjectAddedModification : BasePrefabModification
	{
		public string Name;

		public string ParentPrefabPath;

		[SerializeField]
		private BasePrefabModification[] Modifications;

		public GameObjectAddedModification()
		{
			Name = string.Empty;
			ParentPrefabPath = string.Empty;
			Modifications = Array.Empty<BasePrefabModification>();
		}

		internal GameObjectAddedModification(PrefabGameObjectState gameObjectState)
		{
			Name = gameObjectState.Name;
			ParentPrefabPath = gameObjectState.ParentPrefabPath;
			List<BasePrefabModification> list = new List<BasePrefabModification>();
			PrefabComponentState[] components = gameObjectState.Components;
			foreach (PrefabComponentState prefabComponentState in components)
			{
				string componentPath = $"{gameObjectState.PrefabPath}:{prefabComponentState.FullTypeName}-{prefabComponentState.ComponentIndex}";
				list.Add(new ComponentAddedModification(componentPath, prefabComponentState.Values));
			}
			PrefabGameObjectState[] children = gameObjectState.Children;
			foreach (PrefabGameObjectState gameObjectState2 in children)
			{
				list.Add(new GameObjectAddedModification(gameObjectState2));
			}
			Modifications = list.ToArray();
		}

		internal override void Apply(GameObject prefabRoot)
		{
			//IL_0033: Unknown result type (might be due to invalid IL or missing references)
			Transform val = ((ParentPrefabPath == ((Object)prefabRoot).name) ? prefabRoot.transform : prefabRoot.transform.Find(ParentPrefabPath));
			new GameObject(Name).transform.SetParent(((Component)val).transform);
			BasePrefabModification[] modifications = Modifications;
			for (int i = 0; i < modifications.Length; i++)
			{
				modifications[i].Apply(prefabRoot);
			}
		}
	}
	[Serializable]
	public class GameObjectRemovedModification : BasePrefabModification
	{
		public string PrefabPath;

		public GameObjectRemovedModification()
		{
			PrefabPath = string.Empty;
		}

		public GameObjectRemovedModification(string prefabPath)
		{
			PrefabPath = prefabPath;
		}

		internal override void Apply(GameObject prefabRoot)
		{
			Object.DestroyImmediate((Object)(object)((PrefabPath == ((Object)prefabRoot).name) ? prefabRoot.transform : prefabRoot.transform.Find(PrefabPath)));
		}
	}
	internal class PrefabModifications
	{
		private readonly List<BasePrefabModification> _modifications = new List<BasePrefabModification>();

		public BasePrefabModification[] AsArray()
		{
			return _modifications.ToArray();
		}

		public PrefabModifications()
		{
		}

		public PrefabModifications(BasePrefabModification[] modifications)
		{
			_modifications = new List<BasePrefabModification>(modifications);
		}

		public void AddModification(BasePrefabModification modification)
		{
			_modifications.Add(modification);
		}

		public void ApplyModifications(GameObject prefabRoot)
		{
			foreach (BasePrefabModification modification in _modifications)
			{
				modification.Apply(prefabRoot);
			}
		}
	}
}
namespace RepoSteamNetworking.Patches
{
	public static class SteamManagerPatches
	{
		[HarmonyPatch(typeof(SteamManager), "Awake")]
		public static class OnAwakePatch
		{
			public static void Postfix(SteamManager __instance)
			{
				RepoSteamNetworkManager.CreateSingleton(((Component)__instance).gameObject);
				RepoNetworkingServer.CreateSingleton(((Component)__instance).gameObject);
				RepoNetworkingClient.CreateSingleton(((Component)__instance).gameObject);
			}
		}

		[HarmonyPatch(typeof(SteamManager), "OnLobbyCreated")]
		public static class OnLobbyCreatedPatch
		{
			public static void Postfix(Lobby _lobby)
			{
				//IL_0005: Unknown result type (might be due to invalid IL or missing references)
				RepoNetworkingServer.Instance.StartSocketServer(_lobby);
			}
		}

		[HarmonyPatch(typeof(SteamManager), "OnLobbyEntered")]
		public static class OnLobbyEnteredPatch
		{
			public static void Postfix(Lobby _lobby)
			{
				//IL_0005: Unknown result type (might be due to invalid IL or missing references)
				RepoNetworkingClient.Instance.ConnectToServer(_lobby);
			}
		}

		[HarmonyPatch(typeof(SteamManager), "LeaveLobby")]
		public static class OnLeaveLobbyPatch
		{
			public static void Prefix(SteamManager __instance)
			{
				//IL_0006: Unknown result type (might be due to invalid IL or missing references)
				if (((Lobby)(ref __instance.currentLobby)).IsOwnedBy(SteamClient.SteamId))
				{
					RepoNetworkingServer.Instance.StopSocketServer();
				}
				RepoNetworkingClient.Instance.DisconnectFromServer();
			}
		}
	}
}
namespace RepoSteamNetworking.Odin.Formatters
{
	public class BitFlagsFormatter : MinimalBaseFormatter<BitFlags>
	{
		private static readonly Serializer<byte> ByteSerializer = Serializer.Get<byte>();

		public override void Read(ref BitFlags value, IDataReader reader)
		{
			byte b = ByteSerializer.ReadValue(reader);
			byte[] array = new byte[b];
			for (int i = 0; i < b; i++)
			{
				array[i] = ByteSerializer.ReadValue(reader);
			}
			value.SetFromBytes(array);
		}

		public override void Write(ref BitFlags value, IDataWriter writer)
		{
			byte[] array = value.AsByteArray();
			ByteSerializer.WriteValue((byte)array.Length, writer);
			byte[] array2 = array;
			foreach (byte b in array2)
			{
				ByteSerializer.WriteValue(b, writer);
			}
		}
	}
	public class NetworkTransformDeltaFormatter : MinimalBaseFormatter<NetworkTransformDelta>
	{
		private static readonly Serializer<BitFlags> BitFlagsSerializer = Serializer.Get<BitFlags>();

		private static readonly Serializer<float> FloatSerializer = Serializer.Get<float>();

		public override void Read(ref NetworkTransformDelta value, IDataReader reader)
		{
			BitFlags bitFlags = BitFlagsSerializer.ReadValue(reader);
			if (bitFlags[0])
			{
				value.PositionX = FloatSerializer.ReadValue(reader);
			}
			if (bitFlags[1])
			{
				value.PositionY = FloatSerializer.ReadValue(reader);
			}
			if (bitFlags[2])
			{
				value.PositionZ = FloatSerializer.ReadValue(reader);
			}
			if (bitFlags[3])
			{
				value.RotationX = FloatSerializer.ReadValue(reader);
			}
			if (bitFlags[4])
			{
				value.RotationY = FloatSerializer.ReadValue(reader);
			}
			if (bitFlags[5])
			{
				value.RotationZ = FloatSerializer.ReadValue(reader);
			}
			if (bitFlags[6])
			{
				value.ScaleX = FloatSerializer.ReadValue(reader);
			}
			if (bitFlags[7])
			{
				value.ScaleY = FloatSerializer.ReadValue(reader);
			}
			if (bitFlags[8])
			{
				value.ScaleZ = FloatSerializer.ReadValue(reader);
			}
		}

		public override void Write(ref NetworkTransformDelta value, IDataWriter writer)
		{
			BitFlags bitFlags = default(BitFlags);
			bitFlags[0] = value.PositionX.HasValue;
			bitFlags[1] = value.PositionY.HasValue;
			bitFlags[2] = value.PositionZ.HasValue;
			bitFlags[3] = value.RotationX.HasValue;
			bitFlags[4] = value.RotationY.HasValue;
			bitFlags[5] = value.RotationZ.HasValue;
			bitFlags[6] = value.ScaleX.HasValue;
			bitFlags[7] = value.ScaleY.HasValue;
			bitFlags[8] = value.ScaleZ.HasValue;
			BitFlags bitFlags2 = bitFlags;
			BitFlagsSerializer.WriteValue(bitFlags2, writer);
			if (value.PositionX.HasValue)
			{
				FloatSerializer.WriteValue(value.PositionX.Value, writer);
			}
			if (value.PositionY.HasValue)
			{
				FloatSerializer.WriteValue(value.PositionY.Value, writer);
			}
			if (value.PositionZ.HasValue)
			{
				FloatSerializer.WriteValue(value.PositionZ.Value, writer);
			}
			if (value.RotationX.HasValue)
			{
				FloatSerializer.WriteValue(value.RotationX.Value, writer);
			}
			if (value.RotationY.HasValue)
			{
				FloatSerializer.WriteValue(value.RotationY.Value, writer);
			}
			if (value.RotationZ.HasValue)
			{
				FloatSerializer.WriteValue(value.RotationZ.Value, writer);
			}
			if (value.ScaleX.HasValue)
			{
				FloatSerializer.WriteValue(value.ScaleX.Value, writer);
			}
			if (value.ScaleY.HasValue)
			{
				FloatSerializer.WriteValue(value.ScaleY.Value, writer);
			}
			if (value.ScaleZ.HasValue)
			{
				FloatSerializer.WriteValue(value.ScaleZ.Value, writer);
			}
		}
	}
}
namespace RepoSteamNetworking.Networking
{
	internal static class NetworkAssetDatabase
	{
		private struct NetworkAssetBundle
		{
			public AssetBundle Bundle { get; set; }

			public bool Managed { get; set; }
		}

		private static readonly Dictionary<AssetBundleReference, NetworkAssetBundle> AssetBundles = new Dictionary<AssetBundleReference, NetworkAssetBundle>();

		public static AssetBundleReference RegisterAssetBundle(AssetBundle assetBundle, string modGuid, string bundleName, bool managed)
		{
			AssetBundleReference assetBundleReference = (modGuid, bundleName);
			AssetBundles[assetBundleReference] = new NetworkAssetBundle
			{
				Bundle = assetBundle,
				Managed = managed
			};
			Logging.Info("Registered Networked AssetBundle " + assetBundleReference.ToString() + "!");
			return assetBundleReference;
		}

		public static T? LoadAsset<T>(PrefabReference prefabRef) where T : Object
		{
			if (!AssetBundles.TryGetValue(prefabRef.BundleReference, out var value))
			{
				Logging.Error($"Failed to find AssetBundle with reference: {prefabRef.BundleReference}");
				return default(T);
			}
			if (value.Managed)
			{
				return default(T);
			}
			return value.Bundle.LoadAsset<T>(prefabRef.assetPath);
		}

		public static AssetBundleRequest? LoadAssetAsync<T>(PrefabReference prefabRef) where T : Object
		{
			if (!AssetBundles.TryGetValue(prefabRef.BundleReference, out var value))
			{
				Logging.Error($"Failed to find AssetBundle with reference: {prefabRef.BundleReference}");
				return null;
			}
			if (value.Managed)
			{
				return null;
			}
			return value.Bundle.LoadAssetAsync<T>(prefabRef.assetPath);
		}

		public static IEnumerable<PrefabReference> GetAllAssets(AssetBundleReference bundleRef)
		{
			return from path in AssetBundles[bundleRef].Bundle.GetAllAssetNames()
				select bundleRef.GetPrefabReference(path);
		}
	}
	public enum NetworkDestination
	{
		HostOnly,
		ClientsOnly,
		Everyone,
		PacketTarget,
		EveryoneExcludingSender
	}
	internal static class PacketHandler
	{
		public static void OnHandshakeStatusReceived(HandshakeStatusPacket packet)
		{
			RepoNetworkingClient.Instance.SetConnectionVerified(packet.Success);
			if (!packet.Success)
			{
				Logging.Error("Failed to verify with server! Either something has gone terribly wrong, or steam is down!");
				return;
			}
			Logging.Info("Successfully verified connection with server!");
			Logging.Info("Sending mod compat registry to server to verify mod list compatibility.");
			RepoSteamNetwork.SendPacket(VersionCompatRegistry.CreateRegistryPacket(), NetworkDestination.HostOnly);
		}

		public static void OnClientModVersionRegistryReceived(ClientModVersionRegistryPacket packet)
		{
			//IL_0035: Unknown result type (might be due to invalid IL or missing references)
			//IL_0201: Unknown result type (might be due to invalid IL or missing references)
			//IL_0228: Unknown result type (might be due to invalid IL or missing references)
			ClientModVersionRegistryPacket packet2 = packet;
			if (!RepoNetworkingServer.Instance.ServerActive)
			{
				Logging.Warn("Client registry was received on an invalid server?!");
				return;
			}
			ServerModVersionRegistryStatusPacket serverModVersionRegistryStatusPacket = new ServerModVersionRegistryStatusPacket();
			string lobbyName = packet2.Header.Sender.GetLobbyName();
			foreach (var (text2, version2) in packet2.ModVersions)
			{
				if (!VersionCompatRegistry.IsCompatible(text2, version2, out Version serverModVersion, out VersionCompatibility serverCompatibility))
				{
					if ((object)serverModVersion == null)
					{
						Logging.Warn("Client " + lobbyName + " has mod " + text2 + " that requires RepoSteamNetworking, but said mod is not present (or failed to register) on Server!");
					}
					else
					{
						Logging.Warn($"Client {lobbyName} has mod {text2} with version {version2}, They need to have {serverCompatibility.CreateVersionRequirementString(serverModVersion)}!");
						serverModVersionRegistryStatusPacket.AddIncompatible(text2, serverModVersion, serverCompatibility);
					}
				}
			}
			string[] array = (from guid in VersionCompatRegistry.ModGuids
				where !packet2.ModVersions.ContainsKey(guid)
				where !VersionCompatRegistry.IsOptional(guid)
				select guid).ToArray();
			foreach (string text3 in array)
			{
				Logging.Warn("Client " + lobbyName + " is missing required mod " + text3 + "!");
				if (VersionCompatRegistry.TryGetCompatInfo(text3, out RSNVersionCompatibilityAttribute compatInfo) && VersionCompatRegistry.TryGetVersion(text3, out Version version3))
				{
					serverModVersionRegistryStatusPacket.AddIncompatible(text3, version3, compatInfo.Compatibility);
				}
			}
			if (serverModVersionRegistryStatusPacket.HasIncompatibilities())
			{
				Logging.Warn("Client " + lobbyName + " has a mismatch in mod versions or is missing required mods! There may be issues during play, Please ensure that all players have the same mod list and versions!");
			}
			Logging.Info("Sending mod compat response to client " + lobbyName + ".");
			serverModVersionRegistryStatusPacket.SetTarget(packet2.Header.Sender);
			RepoSteamNetwork.SendPacket(serverModVersionRegistryStatusPacket, NetworkDestination.PacketTarget);
			if (RepoNetworkingServer.Instance.SocketManager.TryGetSteamUserConnection(packet2.Header.Sender, out SteamUserConnection userConnection))
			{
				userConnection.SetValidated();
				if (!userConnection.IsLobbyHost)
				{
					Logging.Info($"Sending Connection Palettes [ModNetworkGuidRegistry: {ModNetworkGuidRegistry.Palette.Count()} Entries] [BehaviourIdRegistry: {BehaviourIdRegistry.Palette.Count()} Entries] to {userConnection.UserName}");
					SetConnectionPalettesPacket packet3 = new SetConnectionPalettesPacket
					{
						GuidPalette = ModNetworkGuidRegistry.Palette,
						BehaviourIdPalette = BehaviourIdRegistry.Palette
					};
					userConnection.SendPacket(packet3);
				}
			}
		}

		public static void OnServerModVersionRegistryReceived(ServerModVersionRegistryStatusPacket packet)
		{
			if (packet.ModIncompatibilities.Length == 0)
			{
				Logging.Info("Mod lists are compatible between server and client!");
				return;
			}
			ServerModVersionRegistryStatusPacket.ServerModRegistryEntry[] modIncompatibilities = packet.ModIncompatibilities;
			for (int i = 0; i < modIncompatibilities.Length; i++)
			{
				ServerModVersionRegistryStatusPacket.ServerModRegistryEntry serverModRegistryEntry = modIncompatibilities[i];
				if (!VersionCompatRegistry.TryGetVersion(serverModRegistryEntry.Guid, out Version version))
				{
					Logging.Warn("Server requires a mod that isn't installed (or failed to register)! Mod Id: " + serverModRegistryEntry.Guid + " Version: " + serverModRegistryEntry.Compatibility.CreateVersionRequirementString(serverModRegistryEntry.Version) + "!");
				}
				else
				{
					Logging.Warn($"Mod Id: {serverModRegistryEntry.Guid} Version: {version} requires {serverModRegistryEntry.Compatibility.CreateVersionRequirementString(serverModRegistryEntry.Version)}");
				}
			}
			Logging.Warn("There's a mismatch in mods and or mod versions! You are responsible for any issues you may encounter!");
		}

		public static void OnSetConnectionPalettesReceived(SetConnectionPalettesPacket packet)
		{
			RepoSteamNetworkManager.Instance.SetModGuidPalette(packet.GuidPalette);
			RepoSteamNetworkManager.Instance.SetBehaviourIdPalette(packet.BehaviourIdPalette);
		}

		public static void OnCallRPCPacketReceived(CallRPCPacket packet)
		{
			RepoSteamNetwork.InvokeRPC(packet.NetworkId, packet.GuidPaletteId, packet.SubId, packet.MethodName, packet.Parameters);
		}

		public static void OnInstantiateNetworkedPrefabPacketReceived(InstantiateNetworkedPrefabPacket packet)
		{
			//IL_0043: Unknown result type (might be due to invalid IL or missing references)
			//IL_0049: 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)
			//IL_0026: Unknown result type (might be due to invalid IL or missing references)
			if (packet.HasTarget)
			{
				RepoSteamNetworkManager.Instance.InstantiateNetworkPrefab(packet.NetworkId, packet.Prefab, packet.TargetTransform, packet.Position, packet.Rotation);
			}
			else
			{
				RepoSteamNetworkManager.Instance.InstantiateNetworkPrefab(packet.NetworkId, packet.Prefab, packet.Position, packet.Rotation);
			}
		}
	}
	internal class RepoNetworkConnectionManager : ConnectionManager
	{
		private Lobby _currentLobby;

		internal bool Verified;

		public RepoNetworkConnectionManager()
		{
			Logging.Info("Creating new ConnectionManager");
		}

		public override void OnConnectionChanged(ConnectionInfo info)
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			((ConnectionManager)this).OnConnectionChanged(info);
		}

		public override void OnConnecting(ConnectionInfo info)
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			((ConnectionManager)this).OnConnecting(info);
		}

		public override void OnConnected(ConnectionInfo info)
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			((ConnectionManager)this).OnConnected(info);
			Logging.Info("Connected to server!");
		}

		public override void OnDisconnected(ConnectionInfo info)
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			((ConnectionManager)this).OnDisconnected(info);
			Logging.Info("Disconnected from server!");
		}

		public override void OnMessage(IntPtr data, int size, long messageNum, long recvTime, int channel)
		{
			((ConnectionManager)this).OnMessage(data, size, messageNum, recvTime, channel);
			byte[] array = new byte[size];
			Marshal.Copy(data, array, 0, size);
			if (!Verified)
			{
				SocketMessage socketMessage = new SocketMessage(array);
				NetworkPacket networkPacket = NetworkPacketRegistry.CreatePacket(socketMessage.ReadPacketHeader().PacketId);
				if (networkPacket is HandshakeStatusPacket)
				{
					RepoSteamNetwork.OnClientMessageReceived(array);
					return;
				}
				if (!(networkPacket is HandshakeStartAuthPacket handshakeStartAuthPacket))
				{
					Logging.Warn(string.Format("Expected {0} from Server but got {1} instead!", "HandshakeStartAuthPacket", networkPacket.GetType()));
					return;
				}
				handshakeStartAuthPacket.Deserialize(socketMessage);
				Logging.Info("Sending handshake to server to verify connection!");
				ClientAuthHandshakeOneShot.Run(handshakeStartAuthPacket.ClientKey);
			}
			else
			{
				RepoSteamNetwork.OnClientMessageReceived(array);
			}
		}

		public void SetLobby(Lobby lobby)
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			_currentLobby = lobby;
		}
	}
	internal class RepoNetworkSocketManager : SocketManager
	{
		private readonly List<SteamUserConnection> _steamUserConnections = new List<SteamUserConnection>();

		private readonly Dictionary<uint, int> _connectionIdSteamUserConnectionLut = new Dictionary<uint, int>();

		private readonly Dictionary<ulong, int> _steamIdSteamUserConnectionLut = new Dictionary<ulong, int>();

		public IReadOnlyCollection<SteamUserConnection> UserConnections => _steamUserConnections;

		public RepoNetworkSocketManager()
		{
			Logging.Info("Creating new SocketManager");
		}

		public override void OnConnecting(Connection connection, ConnectionInfo info)
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			//IL_000a: Unknown result type (might be due to invalid IL or missing references)
			((SocketManager)this).OnConnecting(connection, info);
			((Connection)(ref connection)).Accept();
		}

		public override void OnConnected(Connection connection, ConnectionInfo info)
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			//IL_0009: Unknown result type (might be due to invalid IL or missing references)
			//IL_000a: Unknown result type (might be due to invalid IL or missing references)
			((SocketManager)this).OnConnected(connection, info);
			AddNewSteamUserConnection(connection, info);
		}

		private void AddNewSteamUserConnection(Connection connection, ConnectionInfo info)
		{
			//IL_0000: Unknown result type (might be due to invalid IL or missing references)
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			//IL_000f: Unknown result type (might be due to invalid IL or missing references)
			SteamUserConnection steamUserConnection = new SteamUserConnection(connection, info);
			ulong value = ((NetIdentity)(ref info.identity)).SteamId.Value;
			int count = _steamUserConnections.Count;
			_connectionIdSteamUserConnectionLut[((Connection)(ref connection)).Id] = count;
			_steamIdSteamUserConnectionLut[value] = count;
			_steamUserConnections.Add(steamUserConnection);
			steamUserConnection.StartVerification();
		}

		public bool TryGetSteamUserConnection(uint connectionId, out SteamUserConnection userConnection)
		{
			userConnection = null;
			if (!_connectionIdSteamUserConnectionLut.TryGetValue(connectionId, out var value))
			{
				return false;
			}
			userConnection = _steamUserConnections[value];
			return (object)userConnection != null;
		}

		public bool TryGetSteamUserConnection(SteamId steamId, out SteamUserConnection userConnection)
		{
			//IL_0009: Unknown result type (might be due to invalid IL or missing references)
			userConnection = null;
			if (!_steamIdSteamUserConnectionLut.TryGetValue(steamId.Value, out var value))
			{
				return false;
			}
			userConnection = _steamUserConnections[value];
			return (object)userConnection != null;
		}

		private void RemoveSteamUserConnection(SteamUserConnection userConnection)
		{
			_connectionIdSteamUserConnectionLut.Remove(userConnection.ConnectionId);
			_steamUserConnections.Remove(userConnection);
		}

		public override void OnDisconnected(Connection connection, ConnectionInfo info)
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			((SocketManager)this).OnDisconnected(connection, info);
			if (!TryGetSteamUserConnection(((Connection)(ref connection)).Id, out SteamUserConnection userConnection))
			{
				Logging.Info($"Connection {((Connection)(ref connection)).Id} has disconnected!");
				return;
			}
			SteamUserConnection.ConnectionStatus status = userConnection.Status;
			if (status != SteamUserConnection.ConnectionStatus.Verified && status == SteamUserConnection.ConnectionStatus.VerifiedAndValid)
			{
				Logging.Info($"Connection {((Connection)(ref connection)).Id} has disconnected!");
			}
			else
			{
				Logging.Info("Client " + userConnection.UserName + " has disconnected!");
			}
			RemoveSteamUserConnection(userConnection);
		}

		public override void OnMessage(Connection connection, NetIdentity identity, IntPtr data, int size, long messageNum, long recvTime, int channel)
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			//IL_0002: 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_012c: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d8: 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)
			((SocketManager)this).OnMessage(connection, identity, data, size, messageNum, recvTime, channel);
			byte[] array = new byte[size];
			Marshal.Copy(data, array, 0, size);
			if (!TryGetSteamUserConnection(((Connection)(ref connection)).Id, out SteamUserConnection userConnection))
			{
				Logging.Warn("Received message from unknown connection");
				return;
			}
			if (userConnection.Status == SteamUserConnection.ConnectionStatus.Unverified)
			{
				SocketMessage socketMessage = new SocketMessage(array);
				PacketHeader packetHeader = socketMessage.ReadPacketHeader();
				NetworkPacket networkPacket = NetworkPacketRegistry.CreatePacket(packetHeader.PacketId);
				if (!(networkPacket is HandshakeAuthConnectionPacket handshakeAuthConnectionPacket) || packetHeader.Destination != 0)
				{
					Logging.Warn($"Received {networkPacket.GetType()} packet from an unverified connection {((Connection)(ref connection)).Id}! dropping packet...");
					return;
				}
				handshakeAuthConnectionPacket.Deserialize(socketMessage);
				if (userConnection.VerifyAuth(handshakeAuthConnectionPacket))
				{
					userConnection.SetVerified();
					SendHandshakeStatus(((NetIdentity)(ref identity)).SteamId, success: true);
					userConnection.StartModListValidation();
				}
				else
				{
					Logging.Warn("Handshake failed!");
					SendHandshakeStatus(((NetIdentity)(ref identity)).SteamId, success: false);
				}
				return;
			}
			if (userConnection.Status != SteamUserConnection.ConnectionStatus.VerifiedAndValid)
			{
				NetworkPacket networkPacket2 = NetworkPacketRegistry.CreatePacket(new SocketMessage(array).ReadPacketHeader().PacketId);
				if (!(networkPacket2 is ClientModVersionRegistryPacket))
				{
					Logging.Warn($"Received {networkPacket2.GetType()} packet from Client {userConnection.UserName}! Expected mod list compatibility packet! dropping packet...");
					return;
				}
			}
			RepoSteamNetwork.OnHostReceivedMessage(array, connection, identity);
		}

		private void SendHandshakeStatus(SteamId target, bool success)
		{
			//IL_000d: Unknown result type (might be due to invalid IL or missing references)
			HandshakeStatusPacket handshakeStatusPacket = new HandshakeStatusPacket();
			handshakeStatusPacket.Success = success;
			handshakeStatusPacket.SetTarget(target);
			RepoSteamNetwork.SendPacket(handshakeStatusPacket, NetworkDestination.PacketTarget);
		}

		public void Reset()
		{
			_connectionIdSteamUserConnectionLut.Clear();
			_steamIdSteamUserConnectionLut.Clear();
			foreach (SteamUserConnection steamUserConnection in _steamUserConnections)
			{
				steamUserConnection.Close();
			}
			_steamUserConnections.Clear();
		}
	}
	public class SteamUserConnection : IEquatable<SteamUserConnection>
	{
		public enum ConnectionStatus
		{
			Unverified,
			Verified,
			VerifiedAndValid,
			Closed
		}

		private string _clientKey = "";

		private Connection _connection;

		private ConnectionInfo _info;

		private readonly System.Timers.Timer _timer;

		[CompilerGenerated]
		private string <UserName>k__BackingField = "";

		public uint ConnectionId => ((Connection)(ref _connection)).Id;

		public SteamId SteamId { get; private set; }

		public ConnectionStatus Status { get; private set; }

		public ConnectionState State => ((ConnectionInfo)(ref _info)).State;

		public bool IsLobbyHost
		{
			get
			{
				//IL_0000: Unknown result type (might be due to invalid IL or missing references)
				//IL_0005: Unknown result type (might be due to invalid IL or missing references)
				//IL_0009: Unknown result type (might be due to invalid IL or missing references)
				Lobby currentLobby = RepoSteamNetwork.GetCurrentLobby();
				return ((Lobby)(ref currentLobby)).IsOwnedBy(SteamId);
			}
		}

		public string UserName
		{
			get
			{
				//IL_000f: Unknown result type (might be due to invalid IL or missing references)
				if (string.IsNullOrEmpty(<UserName>k__BackingField))
				{
					<UserName>k__BackingField = SteamId.GetLobbyName();
				}
				return <UserName>k__BackingField;
			}
		}

		internal SteamUserConnection(Connection connection, ConnectionInfo info)
		{
			//IL_001d: Unknown result type (might be due to invalid IL or missing references)
			//IL_001e: 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_0025: 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_0052: Unknown result type (might be due to invalid IL or missing references)
			//IL_0057: 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)
			_connection = connection;
			_info = info;
			_timer = new System.Timers.Timer(10000.0);
			_timer.AutoReset = false;
			Status = ConnectionStatus.Unverified;
			NetIdentity identity = info.identity;
			if (((NetIdentity)(ref identity)).IsSteamId)
			{
				SteamId = ((NetIdentity)(ref identity)).SteamId;
			}
			else
			{
				Logging.Error("NetIdentity was not a SteamID");
			}
		}

		internal void StartVerification()
		{
			//IL_0027: Unknown result type (might be due to invalid IL or missing references)
			//IL_002c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0045: Unknown result type (might be due to invalid IL or missing references)
			_clientKey = RepoNetworkingServer.Instance.CreateAuthKey();
			SocketMessage socketMessage = new HandshakeStartAuthPacket
			{
				ClientKey = _clientKey,
				Header = 
				{
					Sender = RepoSteamNetwork.CurrentSteamId
				}
			}.Serialize(NetworkDestination.Everyone);
			((Connection)(ref _connection)).SendMessage(socketMessage.GetBytes(), (SendType)8);
			_timer.Elapsed += OnHandshakeTimeout;
			_timer.Start();
			Logging.Info($"Waiting for Connection {ConnectionId} to verify...");
		}

		internal void StartModListValidation()
		{
			_timer.Elapsed += OnValidationTimeout;
			_timer.Start();
			Logging.Info("Waiting for Client " + UserName + " to validate mod list compatibility...");
		}

		internal bool VerifyAuth(HandshakeAuthConnectionPacket packet)
		{
			//IL_0005: Unknown result type (might be due to invalid IL or missing references)
			//IL_000a: Unknown result type (might be due to invalid IL or missing references)
			//IL_000f: Unknown result type (might be due to invalid IL or missing references)
			//IL_003a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0045: 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)
			//IL_005f: Unknown result type (might be due to invalid IL or missing references)
			Lobby currentLobby = RepoNetworkingServer.Instance.CurrentLobby;
			string memberData = ((Lobby)(ref currentLobby)).GetMemberData(((Lobby)(ref currentLobby)).Owner, _clientKey);
			if (string.IsNullOrWhiteSpace(memberData) || memberData != packet.AuthKey)
			{
				return false;
			}
			if (SteamId.op_Implicit(((Lobby)(ref currentLobby)).Id) != SteamId.op_Implicit(packet.LobbyId))
			{
				return false;
			}
			if (SteamId.op_Implicit(SteamId) == SteamId.op_Implicit(packet.PlayerId))
			{
				return true;
			}
			return false;
		}

		internal void SetVerified()
		{
			Status = ConnectionStatus.Verified;
			Logging.Info($"Connection {ConnectionId} is now verified as Client {UserName}!");
			RepoNetworkingServer.Instance.RemoveAuthKey(_clientKey);
			_timer.Elapsed -= OnHandshakeTimeout;
			_timer.Stop();
		}

		internal void SetValidated()
		{
			if (Status == ConnectionStatus.Verified)
			{
				_timer.Elapsed -= OnValidationTimeout;
				_timer.Stop();
				_timer.Dispose();
				Status = ConnectionStatus.VerifiedAndValid;
			}
		}

		private void OnHandshakeTimeout(object sender, ElapsedEventArgs e)
		{
			_timer.Elapsed -= OnHandshakeTimeout;
			_timer.Stop();
			Logging.Warn($"Connection {ConnectionId} failed to verify in time, dropping connection...");
			RepoNetworkingServer.Instance.RemoveAuthKey(_clientKey);
			DropConnection();
		}

		private void OnValidationTimeout(object sender, ElapsedEventArgs e)
		{
			_timer.Elapsed -= OnValidationTimeout;
			_timer.Stop();
			Logging.Warn("Client " + UserName + " failed to validate mod list compatibility in time, dropping connection...");
			DropConnection();
		}

		private void DropConnection()
		{
			_timer.Dispose();
			Close();
		}

		public void Close()
		{
			if (_timer.Enabled)
			{
				_timer.Stop();
				_timer.Dispose();
			}
			try
			{
				((Connection)(ref _connection)).Close(false, 0, "Closing Connection");
			}
			catch
			{
			}
			Status = ConnectionStatus.Closed;
		}

		public Result SendMessage(byte[] data, SendType sendType = 8)
		{
			//IL_0007: Unknown result type (might be due to invalid IL or missing references)
			//IL_0008: Unknown result type (might be due to invalid IL or missing references)
			return ((Connection)(ref _connection)).SendMessage(data, sendType);
		}

		public void SendPacket<TPacket>(TPacket packet) where TPacket : NetworkPacket
		{
			//IL_000c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0011: Unknown result type (might be due to invalid IL or missing references)
			packet.Header.Target = SteamId;
			RepoSteamNetwork.SendPacket(packet, NetworkDestination.PacketTarget);
		}

		public bool Equals(SteamUserConnection? other)
		{
			if ((object)other == null)
			{
				return false;
			}
			if ((object)this == other)
			{
				return true;
			}
			return ConnectionId.Equals(other.ConnectionId);
		}

		public override bool Equals(object? obj)
		{
			if (obj == null)
			{
				return false;
			}
			if (this == obj)
			{
				return true;
			}
			if (obj.GetType() != GetType())
			{
				return false;
			}
			return Equals((SteamUserConnection)obj);
		}

		public override int GetHashCode()
		{
			return ConnectionId.GetHashCode();
		}

		public static bool operator ==(SteamUserConnection? left, SteamUserConnection? right)
		{
			return object.Equals(left, right);
		}

		public static bool operator !=(SteamUserConnection? left, SteamUserConnection? right)
		{
			return !object.Equals(left, right);
		}
	}
}
namespace RepoSteamNetworking.Networking.Unity
{
	internal class ClientAuthHandshakeOneShot : MonoBehaviour
	{
		[CompilerGenerated]
		private sealed class <SendAuthHandshake>d__3 : IEnumerator<object>, IEnumerator, IDisposable
		{
			private int <>1__state;

			private object <>2__current;

			public ClientAuthHandshakeOneShot <>4__this;

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

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

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

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

			private bool MoveNext()
			{
				//IL_003c: Unknown result type (might be due to invalid IL or missing references)
				//IL_0041: 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_008a: Unknown result type (might be due to invalid IL or missing references)
				//IL_0063: Unknown result type (might be due to invalid IL or missing references)
				//IL_006d: Expected O, but got Unknown
				int num = <>1__state;
				ClientAuthHandshakeOneShot clientAuthHandshakeOneShot = <>4__this;
				if (num != 0)
				{
					if (num != 1)
					{
						return false;
					}
					<>1__state = -1;
				}
				else
				{
					<>1__state = -1;
					if (string.IsNullOrEmpty(clientAuthHandshakeOneShot._clientKey))
					{
						Logging.Error("ClientAuthHandshakeOneShot: No client key provided!");
						return false;
					}
				}
				Lobby currentLobby = RepoNetworkingClient.Instance.CurrentLobby;
				if (string.IsNullOrWhiteSpace(((Lobby)(ref currentLobby)).GetMemberData(((Lobby)(ref currentLobby)).Owner, clientAuthHandshakeOneShot._clientKey)))
				{
					<>2__current = (object)new WaitForSeconds(0.5f);
					<>1__state = 1;
					return true;
				}
				HandshakeAuthConnectionPacket handshakeAuthConnectionPacket = new HandshakeAuthConnectionPacket();
				handshakeAuthConnectionPacket.SetData(RepoNetworkingClient.Instance.CurrentLobby, clientAuthHandshakeOneShot._clientKey);
				RepoSteamNetwork.SendPacket(handshakeAuthConnectionPacket, NetworkDestination.HostOnly);
				Object.Destroy((Object)(object)((Component)clientAuthHandshakeOneShot).gameObject, 1f);
				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 string? _clientKey;

		private IEnumerator? _coroutine;

		private void Start()
		{
			_coroutine = SendAuthHandshake();
			if (_coroutine != null)
			{
				((MonoBehaviour)this).StartCoroutine(_coroutine);
			}
		}

		[IteratorStateMachine(typeof(<SendAuthHandshake>d__3))]
		private IEnumerator? SendAuthHandshake()
		{
			//yield-return decompiler failed: Unexpected instruction in Iterator.Dispose()
			return new <SendAuthHandshake>d__3(0)
			{
				<>4__this = this
			};
		}

		public static void Run(string clientKey)
		{
			//IL_0005: Unknown result type (might be due to invalid IL or missing references)
			//IL_0019: Expected O, but got Unknown
			GameObject obj = Object.Instantiate<GameObject>(new GameObject("ClientAuthHandshakeOneShot"), ((Component)RepoNetworkingClient.Instance).transform);
			obj.SetActive(false);
			obj.AddComponent<ClientAuthHandshakeOneShot>()._clientKey = clientKey;
			obj.SetActive(true);
		}
	}
	[RequireComponent(typeof(Rigidbody), typeof(NetworkTransform))]
	[DisallowMultipleComponent]
	public class NetworkRigidbody : MonoBehaviour
	{
		private Rigidbody _rigidbody;

		private void Awake()
		{
			_rigidbody = ((Component)this).GetComponent<Rigidbody>();
			if (!Object.op_Implicit((Object)(object)_rigidbody))
			{
				Logging.Warn("No Rigidbody attached!");
			}
			else
			{
				SetupRigidbody();
			}
		}

		private void SetupRigidbody()
		{
			if (!RepoSteamNetwork.HasHostAuthority)
			{
				_rigidbody.isKinematic = true;
			}
		}
	}
	[RequireComponent(typeof(Transform))]
	[DisallowMultipleComponent]
	[GenerateBehaviourId]
	public class NetworkTransform : MonoBehaviour, INetworkedPropertyListener, ISteamNetworkSubIdentity
	{
		public bool syncPositionX = true;

		public bool syncPositionY = true;

		public bool syncPositionZ = true;

		public bool syncRotationX = true;

		public bool syncRotationY = true;

		public bool syncRotationZ = true;

		public bool syncScaleX = true;

		public bool syncScaleY = true;

		public bool syncScaleZ = true;

		public float positionThreshold = 0.001f;

		public float rotationThreshold = 0.01f;

		public float scaleThreshold = 0.01f;

		public bool doInterpolation;

		public int ticksPerSecond = 30;

		private double _timer;

		private Vector3 _lastValidPosition;

		private Vector3 _lastValidRotation;

		private Vector3 _lastValidScale;

		private readonly TweenRunner<Vector3Tween> _positionTweenRunner = new TweenRunner<Vector3Tween>();

		private readonly TweenRunner<Vector3Tween> _rotationTweenRunner = new TweenRunner<Vector3Tween>();

		private readonly TweenRunner<Vector3Tween> _scaleTweenRunner = new TweenRunner<Vector3Tween>();

		private NetworkTransformDelta _transformDeltaBackingField;

		private RepoSteamNetworkIdentity _networkIdentity;

		[NetworkedProperty(CallbackMethodName = "OnReceivedDelta")]
		public NetworkTransformDelta TransformDelta
		{
			get
			{
				return _transformDeltaBackingField;
			}
			set
			{
				if (RepoSteamNetwork.IsServer && !(_transformDeltaBackingField == value))
				{
					_transformDeltaBackingField = value;
					SendNetworkedPropertyData(_transformDeltaBackingField, 0u, 0);
				}
			}
		}

		private Vector3 PositionMask => new Vector3((float)(syncPositionX ? 1 : 0), (float)(syncPositionY ? 1 : 0), (float)(syncPositionZ ? 1 : 0));

		private Vector3 RotationMask => new Vector3((float)(syncRotationX ? 1 : 0), (float)(syncRotationY ? 1 : 0), (float)(syncRotationZ ? 1 : 0));

		private Vector3 ScaleMask => new Vector3((float)(syncScaleX ? 1 : 0), (float)(syncScaleY ? 1 : 0), (float)(syncScaleZ ? 1 : 0));

		private double TimePerTick => 1f / (float)ticksPerSecond;

		public string ModGuid => "com.rune580.reposteamnetworking";

		public uint SubId { get; set; }

		public bool IsValid { get; set; }

		private void Awake()
		{
			//IL_0007: Unknown result type (might be due to invalid IL or missing references)
			//IL_000c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0018: Unknown result type (might be due to invalid IL or missing references)
			//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)
			//IL_002e: Unknown result type (might be due to invalid IL or missing references)
			_lastValidPosition = ((Component)this).transform.position;
			_lastValidRotation = ((Component)this).transform.eulerAngles;
			_lastValidScale = ((Component)this).transform.localScale;
			_positionTweenRunner.Init((MonoBehaviour)(object)this);
			_rotationTweenRunner.Init((MonoBehaviour)(object)this);
			_scaleTweenRunner.Init((MonoBehaviour)(object)this);
		}

		private void Update()
		{
			if (RepoSteamNetwork.IsServer && !RepoSteamNetwork.IsSinglePlayer)
			{
				_timer += Time.deltaTime;
				if (_timer >= TimePerTick)
				{
					TrySyncProperties();
					_timer -= TimePerTick;
				}
			}
		}

		private void TrySyncProperties()
		{
			//IL_0006: Unknown result type (might be due to invalid IL or missing references)
			//IL_000b: Unknown result type (might be due to invalid IL or missing references)
			//IL_000c: Unknown result type (might be due to invalid IL or missing references)
			//IL_000e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0014: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ab: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b0: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b1: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b3: 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_0027: Unknown result type (might be due to invalid IL or missing references)
			//IL_0028: Unknown result type (might be due to invalid IL or missing references)
			//IL_0150: 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_0156: 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)
			//IL_015e: Unknown result type (might be due to invalid IL or missing references)
			//IL_00cc: Unknown result type (might be due to invalid IL or missing references)
			//IL_00cd: Unknown result type (might be due to invalid IL or missing references)
			//IL_003f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0171: Unknown result type (might be due to invalid IL or missing references)
			//IL_0172: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e4: Unknown result type (might be due to invalid IL or missing references)
			//IL_0067: Unknown result type (might be due to invalid IL or missing references)
			//IL_0189: Unknown result type (might be due to invalid IL or missing references)
			//IL_010c: 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)
			//IL_01b1: 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_01d9: Unknown result type (might be due to invalid IL or missing references)
			Vector3 position = ((Component)this).transform.position;
			if (VectorsChanged(position, _lastValidPosition, PositionMask, positionThreshold))
			{
				_lastValidPosition = position;
				if (syncPositionX)
				{
					NetworkTransformDelta transformDelta = TransformDelta;
					transformDelta.PositionX = position.x;
					TransformDelta = transformDelta;
				}
				if (syncPositionY)
				{
					NetworkTransformDelta transformDelta = TransformDelta;
					transformDelta.PositionY = position.y;
					TransformDelta = transformDelta;
				}
				if (syncPositionZ)
				{
					NetworkTransformDelta transformDelta = TransformDelta;
					transformDelta.PositionZ = position.z;
					TransformDelta = transformDelta;
				}
			}
			Vector3 eulerAngles = ((Component)this).transform.eulerAngles;
			if (VectorsChanged(eulerAngles, _lastValidRotation, RotationMask, rotationThreshold))
			{
				_lastValidRotation = eulerAngles;
				if (syncRotationX)
				{
					NetworkTransformDelta transformDelta = TransformDelta;
					transformDelta.RotationX = eulerAngles.x;
					TransformDelta = transformDelta;
				}
				if (syncRotationY)
				{
					NetworkTransformDelta transformDelta = TransformDelta;
					transformDelta.RotationY = eulerAngles.y;
					TransformDelta = transformDelta;
				}
				if (syncRotationZ)
				{
					NetworkTransformDelta transformDelta = TransformDelta;
					transformDelta.RotationZ = eulerAngles.z;
					TransformDelta = transformDelta;
				}
			}
			Vector3 localScale = ((Component)this).transform.localScale;
			if (VectorsChanged(localScale, _lastValidScale, ScaleMask, scaleThreshold))
			{
				_lastValidScale = localScale;
				if (syncScaleX)
				{
					NetworkTransformDelta transformDelta = TransformDelta;
					transformDelta.ScaleX = localScale.x;
					TransformDelta = transformDelta;
				}
				if (syncScaleY)
				{
					NetworkTransformDelta transformDelta = TransformDelta;
					transformDelta.ScaleY = localScale.y;
					TransformDelta = transformDelta;
				}
				if (syncScaleZ)
				{
					NetworkTransformDelta transformDelta = TransformDelta;
					transformDelta.ScaleZ = localScale.z;
					TransformDelta = transformDelta;
				}
			}
		}

		private void OnReceivedDelta(NetworkTransformDelta oldDelta, NetworkTransformDelta delta)
		{
			//IL_0015: Unknown result type (might be due to invalid IL or missing references)
			//IL_001a: 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_0089: 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_00f8: Unknown result type (might be due to invalid IL or missing references)
			//IL_016f: 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_0171: Unknown result type (might be due to invalid IL or missing references)
			//IL_0165: Unknown result type (might be due to invalid IL or missing references)
			//IL_0166: Unknown result type (might be due to invalid IL or missing references)
			//IL_0167: Unknown result type (might be due to invalid IL or missing references)
			if (!RepoSteamNetwork.IsServer && !RepoSteamNetwork.IsSinglePlayer)
			{
				Vector3 position = ((Component)this).transform.position;
				if (delta.PositionX.HasValue)
				{
					position.x = delta.PositionX.Value;
				}
				if (delta.PositionY.HasValue)
				{
					position.y = delta.PositionY.Value;
				}
				if (delta.PositionZ.HasValue)
				{
					position.z = delta.PositionZ.Value;
				}
				Vector3 eulerAngles = ((Component)this).transform.eulerAngles;
				if (delta.RotationX.HasValue)
				{
					eulerAngles.x = delta.RotationX.Value;
				}
				if (delta.RotationY.HasValue)
				{
					eulerAngles.y = delta.RotationY.Value;
				}
				if (delta.RotationZ.HasValue)
				{
					eulerAngles.z = delta.RotationZ.Value;
				}
				Vector3 localScale = ((Component)this).transform.localScale;
				if (delta.ScaleX.HasValue)
				{
					localScale.x = delta.ScaleX.Value;
				}
				if (delta.ScaleY.HasValue)
				{
					localScale.y = delta.ScaleY.Value;
				}
				if (delta.ScaleZ.HasValue)
				{
					localScale.z = delta.ScaleZ.Value;
				}
				if (doInterpolation)
				{
					TweenTransform(position, eulerAngles, localScale);
				}
				else
				{
					SetTransform(position, eulerAngles, localScale);
				}
			}
		}

		private void TweenTransform(Vector3 position, Vector3 rotation, Vector3 scale)
		{
			//IL_0000: Unknown result type (might be due to invalid IL or missing references)
			//IL_0007: 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_007e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0039: Unknown result type (might be due to invalid IL or missing references)
			//IL_0045: 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_00f5: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b0: Unknown result type (might be due to invalid IL or missing references)
			//IL_00bc: Unknown result type (might be due to invalid IL or missing references)
			//IL_0127: Unknown result type (might be due to invalid IL or missing references)
			//IL_0133: Unknown result type (might be due to invalid IL or missing references)
			if (position != ((Component)this).transform.position)
			{
				Vector3Tween vector3Tween = default(Vector3Tween);
				vector3Tween.duration = (float)TimePerTick;
				vector3Tween.ignoreTimeScale = true;
				vector3Tween.StartValue = ((Component)this).transform.position;
				vector3Tween.TargetValue = position;
				Vector3Tween vector3Tween2 = vector3Tween;
				vector3Tween2.AddOnChangedCallback(TweenCallbackPosition);
				_positionTweenRunner.StopTween();
				_positionTweenRunner.StartTween(vector3Tween2);
			}
			if (rotation != ((Component)this).transform.eulerAngles)
			{
				Vector3Tween vector3Tween = default(Vector3Tween);
				vector3Tween.duration = (float)TimePerTick;
				vector3Tween.ignoreTimeScale = true;
				vector3Tween.StartValue = ((Component)this).transform.eulerAngles;
				vector3Tween.TargetValue = rotation;
				Vector3Tween vector3Tween3 = vector3Tween;
				vector3Tween3.AddOnChangedCallback(TweenCallbackRotation);
				_rotationTweenRunner.StopTween();
				_rotationTweenRunner.StartTween(vector3Tween3);
			}
			if (scale != ((Component)this).transform.localScale)
			{
				Vector3Tween vector3Tween = default(Vector3Tween);
				vector3Tween.duration = (float)TimePerTick;
				vector3Tween.ignoreTimeScale = true;
				vector3Tween.StartValue = ((Component)this).transform.localScale;
				vector3Tween.TargetValue = scale;
				Vector3Tween vector3Tween4 = vector3Tween;
				vector3Tween4.AddOnChangedCallback(TweenCallbackScale);
				_scaleTweenRunner.StopTween();
				_scaleTweenRunner.StartTween(vector3Tween4);
			}
		}

		private void SetTransform(Vector3 position, Vector3 rotation, Vector3 scale)
		{
			//IL_0006: Unknown result type (might be due to invalid IL or missing references)
			//IL_0012: Unknown result type (might be due to invalid IL or missing references)
			//IL_001e: Unknown result type (might be due to invalid IL or missing references)
			((Component)this).transform.position = position;
			((Component)this).transform.eulerAngles = rotation;
			((Component)this).transform.localScale = scale;
		}

		private void TweenCallbackPosition(Vector3 position)
		{
			//IL_0006: Unknown result type (might be due to invalid IL or missing references)
			((Component)this).transform.position = position;
		}

		private void TweenCallbackRotation(Vector3 rotation)
		{
			//IL_0006: Unknown result type (might be due to invalid IL or missing references)
			((Component)this).transform.eulerAngles = rotation;
		}

		private void TweenCallbackScale(Vector3 scale)
		{
			//IL_0006: Unknown result type (might be due to invalid IL or missing references)
			((Component)this).transform.localScale = scale;
		}

		private static Vector3 MaskVector(Vector3 vector, Vector3 mask)
		{
			//IL_0000: Unknown result type (might be due to invalid IL or missing references)
			//IL_0006: Unknown result type (might be due to invalid IL or missing references)
			//IL_000d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0013: Unknown result type (might be due to invalid IL or missing references)
			//IL_001a: 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)
			//IL_0027: Unknown result type (might be due to invalid IL or missing references)
			return new Vector3(vector.x * mask.x, vector.y * mask.y, vector.z * mask.z);
		}

		private static bool VectorsChanged(Vector3 left, Vector3 right, Vector3 mask, float threshold)
		{
			//IL_0000: Unknown result type (might be due to invalid IL or missing references)
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			//IL_0007: Unknown result type (might be due to invalid IL or missing references)
			//IL_0008: Unknown result type (might be due to invalid IL or missing references)
			//IL_0009: Unknown result type (might be due to invalid IL or missing references)
			return Vector3.Distance(MaskVector(left, mask), MaskVector(right, mask)) > threshold;
		}

		private void SendNetworkedPropertyData(object value, uint propId, byte changeKind)
		{
			RepoSteamNetworkIdentity networkIdentity = GetNetworkIdentity();
			NetworkedPropertyManager.AddNetworkedPropertyDataToQueue(value, networkIdentity.NetworkId, ModGuid, SubId, "RepoSteamNetworking.Networking.Unity.NetworkTransform", propId, changeKind);
		}

		public virtual void OnNetworkedPropertiesDataReceived(string targetClass, NetworkedPropertyChange[] props)
		{
			if (!(targetClass != "RepoSteamNetworking.Networking.Unity.NetworkTransform"))
			{
				for (int i = 0; i < props.Length; i++)
				{
					NetworkedPropertyChange networkedPropertyChange = props[i];
					SetNetworkedPropertyValue(networkedPropertyChange.PropertyId, networkedPropertyChange.Value);
				}
			}
		}

		private void SetNetworkedPropertyValue(uint propId, object value)
		{
			if (propId == 0)
			{
				NetworkTransformDelta oldDelta = (NetworkTransformDelta)value;
				_transformDeltaBackingField = (NetworkTransformDelta)value;
				OnReceivedDelta(oldDelta, (NetworkTransformDelta)value);
			}
		}

		public RepoSteamNetworkIdentity GetNetworkIdentity()
		{
			if (!Object.op_Implicit((Object)(object)_networkIdentity))
			{
				_networkIdentity = ((Component)this).GetComponentInParent<RepoSteamNetworkIdentity>(true);
			}
			return _networkIdentity;
		}
	}
	public class RepoNetworkingClient : MonoBehaviour
	{
		private static RepoNetworkingClient? _instance;

		private bool _clientActive;

		private RepoNetworkConnectionManager? _connectionManager;

		public static RepoNetworkingClient Instance => _instance;

		internal Lobby CurrentLobby { get; private set; }

		internal bool ClientActive
		{
			get
			{
				if (_instance != null)
				{
					return _clientActive;
				}
				return false;
			}
		}

		internal static void CreateSingleton(GameObject parent)
		{
			//IL_0026: Unknown result type (might be due to invalid IL or missing references)
			//IL_0036: Expected O, but got Unknown
			if (_instance != null)
			{
				Logging.Warn("RepoNetworkingClient already initialized!");
				return;
			}
			VersionCompatRegistry.InitRegistry();
			ModNetworkGuidRegistry.Init();
			BehaviourIdRegistry.Init();
			Object.Instantiate<GameObject>(new GameObject("RepoNetworkingClient"), parent.transform).AddComponent<RepoNetworkingClient>();
			Logging.Info("Created RepoNetworkingClient");
		}

		private void Awake()
		{
			_instance = this;
			Object.DontDestroyOnLoad((Object)(object)this);
		}

		private void Update()
		{
			if (_clientActive && _connectionManager != null)
			{
				((ConnectionManager)_connectionManager).Receive(32);
			}
		}

		public void ConnectToServer(Lobby lobby)
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			//IL_000a: Unknown result type (might be due to invalid IL or missing references)
			//IL_000f: Unknown result type (might be due to invalid IL or missing references)
			//IL_002c: Unknown result type (might be due to invalid IL or missing references)
			CurrentLobby = lobby;
			_connectionManager = SteamNetworkingSockets.ConnectRelay<RepoNetworkConnectionManager>(((Lobby)(ref lobby)).Owner.Id, 0);
			_clientActive = true;
			_connectionManager.SetLobby(lobby);
		}

		public void DisconnectFromServer()
		{
			RepoNetworkConnectionManager? connectionManager = _connectionManager;
			if (connectionManager != null)
			{
				((ConnectionManager)connectionManager).Close();
			}
			_clientActive = false;
		}

		public void SendSocketMessageToServer(SocketMessage message)
		{
			//IL_0025: Unknown result type (might be due to invalid IL or missing references)
			if (_connectionManager == null)
			{
				Logging.Info("No connection to server, can't send message!");
			}
			else
			{
				((Connection)(ref ((ConnectionManager)_connectionManager).Connection)).SendMessage(message.GetBytes(), (SendType)8);
			}
		}

		internal void SetConnectionVerified(bool verified)
		{
			if (_connectionManager != null)
			{
				_connectionManager.Verified = verified;
			}
		}
	}
	public class RepoNetworkingServer : MonoBehaviour
	{
		private static RepoNetworkingServer? _instance;

		private bool _serverActive;

		public static RepoNetworkingServer Instance => _instance;

		internal Lobby CurrentLobby { get; private set; }

		internal RepoNetworkSocketManager? SocketManager { get; private set; }

		internal bool ServerActive
		{
			get
			{
				if (_instance != null)
				{
					return _serverActive;
				}
				return false;
			}
		}

		internal static void CreateSingleton(GameObject parent)
		{
			//IL_0026: Unknown result type (might be due to invalid IL or missing references)
			//IL_0036: Expected O, but got Unknown
			if (_instance != null)
			{
				Logging.Warn("RepoNetworkingServer already initialized!");
				return;
			}
			VersionCompatRegistry.InitRegistry();
			ModNetworkGuidRegistry.Init();
			BehaviourIdRegistry.Init();
			Object.Instantiate<GameObject>(new GameObject("RepoNetworkingServer"), parent.transform).AddComponent<RepoNetworkingServer>();
			Logging.Info("Created RepoNetworkingServer");
		}

		private void Awake()
		{
			_instance = this;
			((Object)this).hideFlags = (HideFlags)61;
			Object.DontDestroyOnLoad((Object)(object)this);
		}

		private void Update()
		{
			if (_serverActive && SocketManager != null)
			{
				((SocketManager)SocketManager).Receive(32);
			}
		}

		public void StartSocketServer(Lobby lobby)
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			CurrentLobby = lobby;
			SocketManager = SteamNetworkingSockets.CreateRelaySocket<RepoNetworkSocketManager>(0);
			_serverActive = true;
			RepoSteamNetworkManager.Instance.SetModGuidPalette(ModNetworkGuidRegistry.Palette);
			RepoSteamNetworkManager.Instance.SetBehaviourIdPalette(BehaviourIdRegistry.Palette);
		}

		public string CreateAuthKey()
		{
			//IL_0033: Unknown result type (might be due to invalid IL or missing references)
			//IL_0038: Unknown result type (might be due to invalid IL or missing references)
			string text = Guid.NewGuid().ToString();
			string text2 = "RSN_" + Guid.NewGuid();
			Lobby currentLobby = CurrentLobby;
			((Lobby)(ref currentLobby)).SetMemberData(text2, text);
			return text2;
		}

		public void RemoveAuthKey(string clientKey)
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			//IL_0006: Unknown result type (might be due to invalid IL or missing references)
			Lobby currentLobby = CurrentLobby;
			((Lobby)(ref currentLobby)).SetMemberData(clientKey, string.Empty);
		}

		public void StopSocketServer()
		{
			RepoNetworkSocketManager? socketManager = SocketManager;
			if (socketManager != null)
			{
				((SocketManager)socketManager).Close();
			}
			SocketManager?.Reset();
			_serverActive = false;
		}

		public void SendSocketMessageToClients(SocketMessage message, SteamId excludeSteamId = default(SteamId))
		{
			//IL_002e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0034: Invalid comparison between Unknown and I4
			//IL_005a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0040: Unknown result type (might be due to invalid IL or missing references)
			//IL_004a: Unknown result type (might be due to invalid IL or missing references)
			if (SocketManager == null)
			{
				Logging.Info("No server to send messages, can't send message!");
				return;
			}
			foreach (SteamUserConnection userConnection in SocketManager.UserConnections)
			{
				if ((int)userConnection.State == 3 && (!((SteamId)(ref excludeSteamId)).IsValid || SteamId.op_Implicit(userConnection.SteamId) != SteamId.op_Implicit(excludeSteamId)))
				{
					userConnection.SendMessage(message.GetBytes(), (SendType)8);
				}
			}
		}

		public void SendSocketMessageToTarget(SocketMessage message, SteamId target)
		{
			//IL_0019: Unknown result type (might be due to invalid IL or missing references)
			//IL_003a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0040: Invalid comparison between Unknown and I4
			//IL_0028: 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_0047: Unknown result type (might be due to invalid IL or missing references)
			SteamUserConnection userConnection;
			if (SocketManager == null)
			{
				Logging.Info("No server to send messages, can't send message!");
			}
			else if (!SocketManager.TryGetSteamUserConnection(target, out userConnection))
			{
				Logging.Info($"No valid connection found for {target}!");
			}
			else if ((int)userConnection.State != 3)
			{
				Logging.Info($"Can't send message to unconnected client {target}");
			}
			else
			{
				userConnection.SendMessage(message.GetBytes(), (SendType)8);
			}
		}
	}
	public class RepoSteamNetworkManager : MonoBehaviour
	{
		private const float NetworkPropertySyncInterval = 1f / 30f;

		private static RepoSteamNetworkManager? _instance;

		private readonly Dictionary<uint, RepoSteamNetworkIdentity> _networkObjects = new Dictionary<uint, RepoSteamNetworkIdentity>();

		private ModNetworkGuidPalette _guidPalette = new ModNetworkGuidPalette();

		private BehaviourIdPalette _behaviourIdPalette = new BehaviourIdPalette();

		private float _networkPropertySyncTimer;

		[CompilerGenerated]
		private uint <NewNetworkId>k__BackingField;

		public static RepoSteamNetworkManager Instance => _instance;

		internal uint NewNetworkId => <NewNetworkId>k__BackingField++;

		private void Awake()
		{
			_instance = this;
			((Object)this).hideFlags = (HideFlags)61;
			Object.DontDestroyOnLoad((Object)(object)this);
		}

		private void Update()
		{
			_networkPropertySyncTimer += Time.deltaTime;
			while (_networkPropertySyncTimer >= 1f / 30f)
			{
				_networkPropertySyncTimer -= 1f / 30f;
				NetworkedPropertyManager.Sy