Decompiled source of PlayerFlashlight v1.0.0

BepInEx/plugins/PlayerFlashlight.dll

Decompiled 18 hours ago
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Runtime.Versioning;
using BepInEx;
using BepInEx.Configuration;
using BepInEx.Logging;
using HarmonyLib;
using PlayerFlashlight.Configuration;
using PlayerFlashlight.Localization;
using PlayerFlashlight.Utils;
using TMPro;
using Unity.Collections;
using Unity.Netcode;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.InputSystem;
using UnityEngine.Localization;
using UnityEngine.Localization.Settings;
using UnityEngine.UI;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: AssemblyTitle("PlayerFlashlight")]
[assembly: AssemblyDescription("PlayerFlashlight mod for Old Market Simulator by Ice Box Studio")]
[assembly: AssemblyCompany("Ice Box Studio")]
[assembly: AssemblyProduct("PlayerFlashlight")]
[assembly: AssemblyCopyright("Copyright © 2025 Ice Box Studio")]
[assembly: AssemblyTrademark("")]
[assembly: ComVisible(false)]
[assembly: Guid("C4F63A97-92D1-4D0B-A2BD-56A1B5706A9B")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: TargetFramework(".NETFramework,Version=v4.7.2", FrameworkDisplayName = ".NET Framework 4.7.2")]
[assembly: AssemblyVersion("1.0.0.0")]
namespace PlayerFlashlight
{
	[BepInPlugin("IceBoxStudio.PlayerFlashlight", "PlayerFlashlight", "1.0.0")]
	public class PlayerFlashlight : BaseUnityPlugin
	{
		private static PlayerFlashlight _instance;

		private Harmony _harmony;

		private bool patchesApplied;

		public static PlayerFlashlight Instance => _instance;

		internal static ManualLogSource Logger { get; private set; }

		private void Awake()
		{
			_instance = this;
			Logger = ((BaseUnityPlugin)this).Logger;
			try
			{
				Logger.LogInfo((object)"=============================================");
				Logger.LogInfo((object)("PlayerFlashlight " + LocalizationManager.Instance.GetLocalizedText("plugin.initializing")));
				Logger.LogInfo((object)(LocalizationManager.Instance.GetLocalizedText("plugin.author_prefix") + "Ice Box Studio(https://steamcommunity.com/id/ibox666/)"));
				ConfigManager.Initialize(((BaseUnityPlugin)this).Config);
				ApplyPatches();
				Logger.LogInfo((object)("PlayerFlashlight " + LocalizationManager.Instance.GetLocalizedText("plugin.initialized")));
				Logger.LogInfo((object)"=============================================");
			}
			catch (Exception ex)
			{
				Logger.LogError((object)("PlayerFlashlight 初始化错误: " + ex.Message + "\n" + ex.StackTrace));
			}
		}

		private void ApplyPatches()
		{
			//IL_000e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0018: Expected O, but got Unknown
			if (!patchesApplied)
			{
				try
				{
					_harmony = new Harmony("IceBoxStudio.PlayerFlashlight");
					_harmony.PatchAll();
					patchesApplied = true;
					return;
				}
				catch (Exception ex)
				{
					Logger.LogError((object)("PlayerFlashlight 应用补丁错误: " + ex.Message + "\n" + ex.StackTrace));
					return;
				}
			}
			Logger.LogInfo((object)LocalizationManager.Instance.GetLocalizedText("plugin.patches_skipped"));
		}
	}
	public static class PluginInfo
	{
		public const string PLUGIN_GUID = "IceBoxStudio.PlayerFlashlight";

		public const string PLUGIN_NAME = "PlayerFlashlight";

		public const string PLUGIN_VERSION = "1.0.0";

		public const string PLUGIN_AUTHOR = "Ice Box Studio";

		public const string PLUGIN_DESCRIPTION = "手电在手,天下我有。";
	}
}
namespace PlayerFlashlight.Utils
{
	public static class FlashlightManager
	{
		private const string TOGGLE_SOUND_NAME = "Pop sounds 18";

		private static AudioClip _toggleClip;

		private const string MESSAGE_TOGGLE = "PlayerFlashlight_Toggle";

		private const string MESSAGE_SYNC = "PlayerFlashlight_Sync";

		private const string MESSAGE_ORIENTATION = "PlayerFlashlight_Orientation";

		private const string MESSAGE_ORIENTATION_SYNC = "PlayerFlashlight_OrientationSync";

		private static readonly Dictionary<ulong, bool> _states = new Dictionary<ulong, bool>();

		private static readonly Dictionary<ulong, Light> _lights = new Dictionary<ulong, Light>();

		private static readonly Dictionary<ulong, Light> _lightsByClient = new Dictionary<ulong, Light>();

		private static readonly Dictionary<ulong, ulong> _userToClient = new Dictionary<ulong, ulong>();

		private static readonly Dictionary<ulong, Quaternion> _rotations = new Dictionary<ulong, Quaternion>();

		private static readonly Dictionary<ulong, bool> _predictedClientStates = new Dictionary<ulong, bool>();

		public static void RegisterMessageHandlers()
		{
			//IL_0022: Unknown result type (might be due to invalid IL or missing references)
			//IL_002c: Expected O, but got Unknown
			//IL_003e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0048: Expected O, but got Unknown
			//IL_005a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0064: Expected O, but got Unknown
			//IL_0076: Unknown result type (might be due to invalid IL or missing references)
			//IL_0080: Expected O, but got Unknown
			NetworkManager singleton = NetworkManager.Singleton;
			if (!((Object)(object)singleton == (Object)null))
			{
				singleton.CustomMessagingManager.RegisterNamedMessageHandler("PlayerFlashlight_Toggle", new HandleNamedMessageDelegate(OnToggleMessageReceived));
				singleton.CustomMessagingManager.RegisterNamedMessageHandler("PlayerFlashlight_Sync", new HandleNamedMessageDelegate(OnSyncMessageReceived));
				singleton.CustomMessagingManager.RegisterNamedMessageHandler("PlayerFlashlight_Orientation", new HandleNamedMessageDelegate(OnOrientationMessageReceived));
				singleton.CustomMessagingManager.RegisterNamedMessageHandler("PlayerFlashlight_OrientationSync", new HandleNamedMessageDelegate(OnOrientationSyncReceived));
				singleton.OnClientConnectedCallback -= OnClientConnected;
				singleton.OnClientConnectedCallback += OnClientConnected;
				singleton.OnClientDisconnectCallback -= OnClientDisconnected;
				singleton.OnClientDisconnectCallback += OnClientDisconnected;
			}
		}

		public static void SendToggle()
		{
			//IL_005d: Unknown result type (might be due to invalid IL or missing references)
			NetworkManager singleton = NetworkManager.Singleton;
			if ((Object)(object)singleton == (Object)null || !singleton.IsListening)
			{
				return;
			}
			if (singleton.IsServer || singleton.IsHost)
			{
				HandleToggleOnServer(singleton.LocalClientId);
				BroadcastSync(ulong.MaxValue);
				PlayToggleSoundForClient(singleton.LocalClientId);
				return;
			}
			FastBufferWriter val = default(FastBufferWriter);
			((FastBufferWriter)(ref val))..ctor(0, (Allocator)2, -1);
			try
			{
				singleton.CustomMessagingManager.SendNamedMessage("PlayerFlashlight_Toggle", 0uL, val, (NetworkDelivery)3);
			}
			finally
			{
				((IDisposable)(FastBufferWriter)(ref val)).Dispose();
			}
			EnsureLightForClient(singleton.LocalClientId);
			bool flag = true;
			if (_lightsByClient.TryGetValue(singleton.LocalClientId, out var value) && (Object)(object)value != (Object)null)
			{
				flag = !((Behaviour)value).enabled;
				ApplyLightStateByClientId(singleton.LocalClientId, flag);
			}
			_predictedClientStates[singleton.LocalClientId] = flag;
			PlayToggleSoundForClient(singleton.LocalClientId);
		}

		private static void OnClientConnected(ulong clientId)
		{
			NetworkManager singleton = NetworkManager.Singleton;
			if ((Object)(object)singleton != (Object)null && (singleton.IsServer || singleton.IsHost))
			{
				BroadcastSync(clientId);
				BroadcastAllOrientations(clientId);
			}
		}

		private static void OnClientDisconnected(ulong clientId)
		{
			ulong? userIdByClientId = GetUserIdByClientId(clientId);
			if (userIdByClientId.HasValue)
			{
				_states.Remove(userIdByClientId.Value);
				if (_lights.TryGetValue(userIdByClientId.Value, out var value))
				{
					if ((Object)(object)value != (Object)null)
					{
						Object.Destroy((Object)(object)((Component)value).gameObject);
					}
					_lights.Remove(userIdByClientId.Value);
				}
				_userToClient.Remove(userIdByClientId.Value);
			}
			if (_lightsByClient.TryGetValue(clientId, out var value2))
			{
				if ((Object)(object)value2 != (Object)null)
				{
					Object.Destroy((Object)(object)((Component)value2).gameObject);
				}
				_lightsByClient.Remove(clientId);
			}
			_predictedClientStates.Remove(clientId);
		}

		private static void HandleToggleOnServer(ulong senderClientId)
		{
			ulong? userIdByClientId = GetUserIdByClientId(senderClientId);
			if (userIdByClientId.HasValue)
			{
				bool value;
				bool flag = !_states.TryGetValue(userIdByClientId.Value, out value) || !value;
				_states[userIdByClientId.Value] = flag;
				EnsureLight(userIdByClientId.Value);
				ApplyLightState(userIdByClientId.Value, flag);
			}
		}

		private static void BroadcastSync(ulong targetClientId = ulong.MaxValue)
		{
			//IL_0041: 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)
			//IL_0085: Unknown result type (might be due to invalid IL or missing references)
			//IL_008b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0097: Unknown result type (might be due to invalid IL or missing references)
			//IL_009d: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b2: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b8: 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_0101: Unknown result type (might be due to invalid IL or missing references)
			NetworkManager singleton = NetworkManager.Singleton;
			if ((Object)(object)singleton == (Object)null || !singleton.IsListening)
			{
				return;
			}
			FastBufferWriter val = default(FastBufferWriter);
			((FastBufferWriter)(ref val))..ctor(4 + _states.Count * 17, (Allocator)2, -1);
			try
			{
				int count = _states.Count;
				((FastBufferWriter)(ref val)).WriteValueSafe<int>(ref count, default(ForPrimitives));
				foreach (KeyValuePair<ulong, bool> state in _states)
				{
					ulong key = state.Key;
					ulong valueOrDefault = GetClientIdByUserId(key).GetValueOrDefault();
					((FastBufferWriter)(ref val)).WriteValueSafe<ulong>(ref key, default(ForPrimitives));
					((FastBufferWriter)(ref val)).WriteValueSafe<ulong>(ref valueOrDefault, default(ForPrimitives));
					bool value = state.Value;
					((FastBufferWriter)(ref val)).WriteValueSafe<bool>(ref value, default(ForPrimitives));
				}
				if (targetClientId == ulong.MaxValue)
				{
					foreach (ulong connectedClientsId in singleton.ConnectedClientsIds)
					{
						singleton.CustomMessagingManager.SendNamedMessage("PlayerFlashlight_Sync", connectedClientsId, val, (NetworkDelivery)3);
					}
					return;
				}
				singleton.CustomMessagingManager.SendNamedMessage("PlayerFlashlight_Sync", targetClientId, val, (NetworkDelivery)3);
			}
			finally
			{
				((IDisposable)(FastBufferWriter)(ref val)).Dispose();
			}
		}

		private static void OnToggleMessageReceived(ulong senderClientId, FastBufferReader reader)
		{
			NetworkManager singleton = NetworkManager.Singleton;
			if (!((Object)(object)singleton == (Object)null) && singleton.IsListening && (singleton.IsServer || singleton.IsHost))
			{
				HandleToggleOnServer(senderClientId);
				BroadcastSync(ulong.MaxValue);
			}
		}

		private static void OnSyncMessageReceived(ulong senderClientId, FastBufferReader reader)
		{
			//IL_0006: 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_001f: 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_0031: Unknown result type (might be due to invalid IL or missing references)
			//IL_0037: Unknown result type (might be due to invalid IL or missing references)
			//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)
			int num = default(int);
			((FastBufferReader)(ref reader)).ReadValueSafe<int>(ref num, default(ForPrimitives));
			ulong num2 = default(ulong);
			ulong num3 = default(ulong);
			bool flag = default(bool);
			for (int i = 0; i < num; i++)
			{
				((FastBufferReader)(ref reader)).ReadValueSafe<ulong>(ref num2, default(ForPrimitives));
				((FastBufferReader)(ref reader)).ReadValueSafe<ulong>(ref num3, default(ForPrimitives));
				((FastBufferReader)(ref reader)).ReadValueSafe<bool>(ref flag, default(ForPrimitives));
				bool value;
				bool num4 = !_states.TryGetValue(num2, out value) || value != flag;
				_states[num2] = flag;
				_userToClient[num2] = num3;
				EnsureLightForClient(num3, num2);
				if (num4)
				{
					ApplyLightStateByClientId(num3, flag);
				}
			}
		}

		private static void EnsureLight(ulong userId)
		{
			//IL_003b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0041: Expected O, but got Unknown
			//IL_0074: Unknown result type (might be due to invalid IL or missing references)
			//IL_0081: 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_00ff: Unknown result type (might be due to invalid IL or missing references)
			//IL_0175: Unknown result type (might be due to invalid IL or missing references)
			//IL_0177: Unknown result type (might be due to invalid IL or missing references)
			//IL_019e: Unknown result type (might be due to invalid IL or missing references)
			//IL_01a0: Unknown result type (might be due to invalid IL or missing references)
			//IL_01ab: Unknown result type (might be due to invalid IL or missing references)
			if (_lights.TryGetValue(userId, out var value) && (Object)(object)value != (Object)null)
			{
				return;
			}
			GameObject val = FindPlayerObjectByUserId(userId);
			if (!((Object)(object)val == (Object)null))
			{
				Transform val2 = FindAttachPoint(val.transform);
				GameObject val3 = new GameObject("PlayerFlashlightLight");
				val3.transform.SetParent(val2 ?? val.transform, false);
				Vector3 val4 = default(Vector3);
				((Vector3)(ref val4))..ctor(0f, 0f, 0.25f);
				val3.transform.localPosition = val4;
				val3.transform.localRotation = Quaternion.identity;
				Light val5 = val3.AddComponent<Light>();
				val5.type = (LightType)0;
				val5.intensity = Mathf.Max(0f, ConfigManager.Intensity.Value);
				val5.range = Mathf.Max(0.1f, ConfigManager.Range.Value);
				val5.spotAngle = Mathf.Clamp(ConfigManager.SpotAngle.Value, 1f, 170f);
				val5.color = Color.white;
				val5.shadows = ConfigManager.GetShadowMode();
				((Behaviour)val5).enabled = false;
				NetworkManager singleton = NetworkManager.Singleton;
				ulong? num = (((Object)(object)singleton != (Object)null) ? GetUserIdByClientId(singleton.LocalClientId) : null);
				FlashlightAligner flashlightAligner = val3.AddComponent<FlashlightAligner>();
				flashlightAligner.AlignToCamera = num.HasValue && num.Value == userId;
				flashlightAligner.FollowPoint = val2 ?? val.transform;
				flashlightAligner.LocalOffset = val4;
				if (_rotations.TryGetValue(userId, out var value2) && !flashlightAligner.AlignToCamera)
				{
					flashlightAligner.UseRemoteRotation = true;
					flashlightAligner.RemoteRotation = value2;
					val3.transform.rotation = value2;
				}
				_lights[userId] = val5;
				ulong? clientIdByUserId = GetClientIdByUserId(userId);
				if (clientIdByUserId.HasValue)
				{
					_lightsByClient[clientIdByUserId.Value] = val5;
					_userToClient[userId] = clientIdByUserId.Value;
				}
			}
		}

		private static void ApplyLightState(ulong userId, bool on)
		{
			if (_lights.TryGetValue(userId, out var value) && (Object)(object)value != (Object)null)
			{
				((Behaviour)value).enabled = on;
			}
		}

		private static GameObject FindPlayerObjectByUserId(ulong userId)
		{
			try
			{
				NetworkManager singleton = NetworkManager.Singleton;
				if ((Object)(object)singleton == (Object)null)
				{
					return null;
				}
				GameManager instance = GameManager.Instance;
				if ((Object)(object)instance == (Object)null)
				{
					return null;
				}
				if (!(AccessTools.Field(typeof(GameManager), "clientIdMap")?.GetValue(instance) is Dictionary<ulong, ulong> dictionary))
				{
					return null;
				}
				foreach (KeyValuePair<ulong, ulong> item in dictionary)
				{
					if (item.Value == userId && singleton.ConnectedClients.TryGetValue(item.Key, out var value))
					{
						NetworkObject obj = value?.PlayerObject;
						return (obj != null) ? ((Component)obj).gameObject : null;
					}
				}
			}
			catch
			{
			}
			return null;
		}

		public static Light GetLightByClientId(ulong clientId)
		{
			_lightsByClient.TryGetValue(clientId, out var value);
			return value;
		}

		private static ulong? GetUserIdByClientId(ulong clientId)
		{
			try
			{
				GameManager instance = GameManager.Instance;
				if (AccessTools.Field(typeof(GameManager), "clientIdMap")?.GetValue(instance) is Dictionary<ulong, ulong> dictionary && dictionary.TryGetValue(clientId, out var value))
				{
					return value;
				}
			}
			catch
			{
			}
			return null;
		}

		private static Transform FindDeepChildByName(Transform parent, string targetName)
		{
			//IL_0029: Unknown result type (might be due to invalid IL or missing references)
			//IL_002f: Expected O, but got Unknown
			if ((Object)(object)parent == (Object)null || string.IsNullOrEmpty(targetName))
			{
				return null;
			}
			string text = targetName.ToLowerInvariant();
			foreach (Transform item in parent)
			{
				Transform val = item;
				if (((Object)val).name != null && ((Object)val).name.ToLowerInvariant() == text)
				{
					return val;
				}
				Transform val2 = FindDeepChildByName(val, targetName);
				if ((Object)(object)val2 != (Object)null)
				{
					return val2;
				}
			}
			return null;
		}

		private static Transform FindAttachPoint(Transform root)
		{
			CustomCharacterController component = ((Component)root).GetComponent<CustomCharacterController>();
			if ((Object)(object)component != (Object)null && (Object)(object)component.CameraFollowPoint != (Object)null)
			{
				return component.CameraFollowPoint;
			}
			return root;
		}

		public static void ReportLocalOrientation(Quaternion rot)
		{
			//IL_0049: Unknown result type (might be due to invalid IL or missing references)
			//IL_0056: Unknown result type (might be due to invalid IL or missing references)
			//IL_0073: Unknown result type (might be due to invalid IL or missing references)
			//IL_0079: 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_0090: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a1: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a7: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b8: Unknown result type (might be due to invalid IL or missing references)
			//IL_00be: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d1: Unknown result type (might be due to invalid IL or missing references)
			NetworkManager singleton = NetworkManager.Singleton;
			if ((Object)(object)singleton == (Object)null || !singleton.IsListening)
			{
				return;
			}
			if (singleton.IsServer || singleton.IsHost)
			{
				ulong? userIdByClientId = GetUserIdByClientId(singleton.LocalClientId);
				if (userIdByClientId.HasValue)
				{
					_rotations[userIdByClientId.Value] = rot;
					BroadcastOrientationToAll(userIdByClientId.Value, rot);
				}
				return;
			}
			FastBufferWriter val = default(FastBufferWriter);
			((FastBufferWriter)(ref val))..ctor(16, (Allocator)2, -1);
			try
			{
				((FastBufferWriter)(ref val)).WriteValueSafe<float>(ref rot.x, default(ForPrimitives));
				((FastBufferWriter)(ref val)).WriteValueSafe<float>(ref rot.y, default(ForPrimitives));
				((FastBufferWriter)(ref val)).WriteValueSafe<float>(ref rot.z, default(ForPrimitives));
				((FastBufferWriter)(ref val)).WriteValueSafe<float>(ref rot.w, default(ForPrimitives));
				singleton.CustomMessagingManager.SendNamedMessage("PlayerFlashlight_Orientation", 0uL, val, (NetworkDelivery)3);
			}
			finally
			{
				((IDisposable)(FastBufferWriter)(ref val)).Dispose();
			}
		}

		private static void OnOrientationMessageReceived(ulong senderClientId, FastBufferReader reader)
		{
			//IL_002f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0035: Unknown result type (might be due to invalid IL or missing references)
			//IL_0042: Unknown result type (might be due to invalid IL or missing references)
			//IL_0048: Unknown result type (might be due to invalid IL or missing references)
			//IL_0055: Unknown result type (might be due to invalid IL or missing references)
			//IL_005b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0068: Unknown result type (might be due to invalid IL or missing references)
			//IL_006e: Unknown result type (might be due to invalid IL or missing references)
			//IL_009f: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ad: Unknown result type (might be due to invalid IL or missing references)
			NetworkManager singleton = NetworkManager.Singleton;
			if (!((Object)(object)singleton == (Object)null) && singleton.IsListening && (singleton.IsServer || singleton.IsHost))
			{
				float num = default(float);
				((FastBufferReader)(ref reader)).ReadValueSafe<float>(ref num, default(ForPrimitives));
				float num2 = default(float);
				((FastBufferReader)(ref reader)).ReadValueSafe<float>(ref num2, default(ForPrimitives));
				float num3 = default(float);
				((FastBufferReader)(ref reader)).ReadValueSafe<float>(ref num3, default(ForPrimitives));
				float num4 = default(float);
				((FastBufferReader)(ref reader)).ReadValueSafe<float>(ref num4, default(ForPrimitives));
				Quaternion val = default(Quaternion);
				((Quaternion)(ref val))..ctor(num, num2, num3, num4);
				ulong? userIdByClientId = GetUserIdByClientId(senderClientId);
				if (userIdByClientId.HasValue)
				{
					_rotations[userIdByClientId.Value] = val;
					BroadcastOrientationToAll(userIdByClientId.Value, val);
				}
			}
		}

		private static void OnOrientationSyncReceived(ulong senderClientId, FastBufferReader reader)
		{
			//IL_0006: 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_0019: Unknown result type (might be due to invalid IL or missing references)
			//IL_001f: 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_0032: 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_0045: 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_0058: Unknown result type (might be due to invalid IL or missing references)
			//IL_0065: Unknown result type (might be due to invalid IL or missing references)
			//IL_006b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0085: Unknown result type (might be due to invalid IL or missing references)
			//IL_008d: Unknown result type (might be due to invalid IL or missing references)
			ulong key = default(ulong);
			((FastBufferReader)(ref reader)).ReadValueSafe<ulong>(ref key, default(ForPrimitives));
			ulong clientId = default(ulong);
			((FastBufferReader)(ref reader)).ReadValueSafe<ulong>(ref clientId, default(ForPrimitives));
			float num = default(float);
			((FastBufferReader)(ref reader)).ReadValueSafe<float>(ref num, default(ForPrimitives));
			float num2 = default(float);
			((FastBufferReader)(ref reader)).ReadValueSafe<float>(ref num2, default(ForPrimitives));
			float num3 = default(float);
			((FastBufferReader)(ref reader)).ReadValueSafe<float>(ref num3, default(ForPrimitives));
			float num4 = default(float);
			((FastBufferReader)(ref reader)).ReadValueSafe<float>(ref num4, default(ForPrimitives));
			Quaternion val = default(Quaternion);
			((Quaternion)(ref val))..ctor(num, num2, num3, num4);
			_rotations[key] = val;
			ApplyOrientationToLightByClientId(clientId, val);
		}

		private static void BroadcastOrientationToAll(ulong userId, Quaternion rot)
		{
			//IL_0038: Unknown result type (might be due to invalid IL or missing references)
			//IL_003e: Unknown result type (might be due to invalid IL or missing references)
			//IL_004b: 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_0063: Unknown result type (might be due to invalid IL or missing references)
			//IL_0069: Unknown result type (might be due to invalid IL or missing references)
			//IL_007b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0081: Unknown result type (might be due to invalid IL or missing references)
			//IL_0093: Unknown result type (might be due to invalid IL or missing references)
			//IL_0099: 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_00b1: Unknown result type (might be due to invalid IL or missing references)
			//IL_00dd: Unknown result type (might be due to invalid IL or missing references)
			NetworkManager singleton = NetworkManager.Singleton;
			if ((Object)(object)singleton == (Object)null || !singleton.IsListening)
			{
				return;
			}
			FastBufferWriter val = default(FastBufferWriter);
			((FastBufferWriter)(ref val))..ctor(32, (Allocator)2, -1);
			try
			{
				ulong valueOrDefault = GetClientIdByUserId(userId).GetValueOrDefault();
				((FastBufferWriter)(ref val)).WriteValueSafe<ulong>(ref userId, default(ForPrimitives));
				((FastBufferWriter)(ref val)).WriteValueSafe<ulong>(ref valueOrDefault, default(ForPrimitives));
				((FastBufferWriter)(ref val)).WriteValueSafe<float>(ref rot.x, default(ForPrimitives));
				((FastBufferWriter)(ref val)).WriteValueSafe<float>(ref rot.y, default(ForPrimitives));
				((FastBufferWriter)(ref val)).WriteValueSafe<float>(ref rot.z, default(ForPrimitives));
				((FastBufferWriter)(ref val)).WriteValueSafe<float>(ref rot.w, default(ForPrimitives));
				foreach (ulong connectedClientsId in singleton.ConnectedClientsIds)
				{
					singleton.CustomMessagingManager.SendNamedMessage("PlayerFlashlight_OrientationSync", connectedClientsId, val, (NetworkDelivery)3);
				}
			}
			finally
			{
				((IDisposable)(FastBufferWriter)(ref val)).Dispose();
			}
		}

		private static void BroadcastAllOrientations(ulong targetClientId)
		{
			//IL_0061: 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_0074: Unknown result type (might be due to invalid IL or missing references)
			//IL_007a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0085: 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_0095: Unknown result type (might be due to invalid IL or missing references)
			//IL_009b: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a6: 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_00b6: 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_00c7: 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_00d7: Unknown result type (might be due to invalid IL or missing references)
			//IL_00dd: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e8: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ed: 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_00fe: Unknown result type (might be due to invalid IL or missing references)
			//IL_0111: Unknown result type (might be due to invalid IL or missing references)
			NetworkManager singleton = NetworkManager.Singleton;
			if ((Object)(object)singleton == (Object)null || !singleton.IsListening)
			{
				return;
			}
			FastBufferWriter val = default(FastBufferWriter);
			foreach (KeyValuePair<ulong, Quaternion> rotation in _rotations)
			{
				((FastBufferWriter)(ref val))..ctor(32, (Allocator)2, -1);
				try
				{
					ulong valueOrDefault = GetClientIdByUserId(rotation.Key).GetValueOrDefault();
					ulong key = rotation.Key;
					((FastBufferWriter)(ref val)).WriteValueSafe<ulong>(ref key, default(ForPrimitives));
					((FastBufferWriter)(ref val)).WriteValueSafe<ulong>(ref valueOrDefault, default(ForPrimitives));
					Quaternion value = rotation.Value;
					((FastBufferWriter)(ref val)).WriteValueSafe<float>(ref value.x, default(ForPrimitives));
					value = rotation.Value;
					((FastBufferWriter)(ref val)).WriteValueSafe<float>(ref value.y, default(ForPrimitives));
					value = rotation.Value;
					((FastBufferWriter)(ref val)).WriteValueSafe<float>(ref value.z, default(ForPrimitives));
					value = rotation.Value;
					((FastBufferWriter)(ref val)).WriteValueSafe<float>(ref value.w, default(ForPrimitives));
					singleton.CustomMessagingManager.SendNamedMessage("PlayerFlashlight_OrientationSync", targetClientId, val, (NetworkDelivery)3);
				}
				finally
				{
					((IDisposable)(FastBufferWriter)(ref val)).Dispose();
				}
			}
		}

		private static void ApplyOrientationToLightByClientId(ulong clientId, Quaternion rot)
		{
			//IL_003d: Unknown result type (might be due to invalid IL or missing references)
			//IL_003e: 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)
			if (_lightsByClient.TryGetValue(clientId, out var value) && (Object)(object)value != (Object)null)
			{
				FlashlightAligner component = ((Component)value).gameObject.GetComponent<FlashlightAligner>();
				if ((Object)(object)component != (Object)null && !component.AlignToCamera)
				{
					component.UseRemoteRotation = true;
					component.RemoteRotation = rot;
					((Component)component).transform.rotation = rot;
				}
			}
		}

		private static ulong? GetClientIdByUserId(ulong userId)
		{
			try
			{
				GameManager instance = GameManager.Instance;
				if (AccessTools.Field(typeof(GameManager), "clientIdMap")?.GetValue(instance) is Dictionary<ulong, ulong> dictionary)
				{
					foreach (KeyValuePair<ulong, ulong> item in dictionary)
					{
						if (item.Value == userId)
						{
							return item.Key;
						}
					}
				}
			}
			catch
			{
			}
			return null;
		}

		public static void EnsureLightForClient(ulong clientId, ulong? userIdOpt = null)
		{
			//IL_00e1: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e6: Unknown result type (might be due to invalid IL or missing references)
			//IL_0114: Unknown result type (might be due to invalid IL or missing references)
			//IL_011a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0121: 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_0131: Unknown result type (might be due to invalid IL or missing references)
			//IL_0199: Unknown result type (might be due to invalid IL or missing references)
			//IL_01a5: Unknown result type (might be due to invalid IL or missing references)
			//IL_01dd: Unknown result type (might be due to invalid IL or missing references)
			//IL_01df: Unknown result type (might be due to invalid IL or missing references)
			if (_lightsByClient.TryGetValue(clientId, out var value) && (Object)(object)value != (Object)null)
			{
				return;
			}
			NetworkManager singleton = NetworkManager.Singleton;
			if ((Object)(object)singleton == (Object)null)
			{
				return;
			}
			NetworkObject val = null;
			if (singleton.IsServer || singleton.IsHost)
			{
				if (!singleton.ConnectedClients.TryGetValue(clientId, out var value2))
				{
					return;
				}
				val = value2.PlayerObject;
			}
			else
			{
				HashSet<NetworkObject> hashSet = singleton.SpawnManager?.SpawnedObjectsList;
				if (hashSet == null)
				{
					return;
				}
				foreach (NetworkObject item in hashSet)
				{
					if ((Object)(object)item != (Object)null && item.IsPlayerObject && item.OwnerClientId == clientId)
					{
						val = item;
						break;
					}
				}
			}
			if ((Object)(object)val == (Object)null)
			{
				return;
			}
			GameObject gameObject = ((Component)val).gameObject;
			Transform val2 = FindAttachPoint(gameObject.transform);
			GameObject val3 = new GameObject("PlayerFlashlightLight");
			val3.transform.SetParent(val2 ?? gameObject.transform, false);
			Vector3 val4 = default(Vector3);
			((Vector3)(ref val4))..ctor(0f, 0f, 0.25f);
			val3.transform.localPosition = val4;
			val3.transform.localRotation = Quaternion.identity;
			Light val5 = val3.AddComponent<Light>();
			val5.type = (LightType)0;
			val5.intensity = Mathf.Max(0f, ConfigManager.Intensity.Value);
			val5.range = Mathf.Max(0.1f, ConfigManager.Range.Value);
			val5.spotAngle = Mathf.Clamp(ConfigManager.SpotAngle.Value, 1f, 170f);
			val5.color = Color.white;
			val5.shadows = ConfigManager.GetShadowMode();
			((Behaviour)val5).enabled = false;
			FlashlightAligner flashlightAligner = val3.AddComponent<FlashlightAligner>();
			flashlightAligner.AlignToCamera = singleton.LocalClientId == clientId;
			flashlightAligner.FollowPoint = val2 ?? gameObject.transform;
			flashlightAligner.LocalOffset = val4;
			if (userIdOpt.HasValue)
			{
				_lights[userIdOpt.Value] = val5;
				_userToClient[userIdOpt.Value] = clientId;
			}
			_lightsByClient[clientId] = val5;
			if (_predictedClientStates.TryGetValue(clientId, out var value3))
			{
				ApplyLightStateByClientId(clientId, value3);
				return;
			}
			ulong? num = userIdOpt ?? GetUserIdByClientId(clientId);
			bool value4 = false;
			if (num.HasValue)
			{
				_states.TryGetValue(num.Value, out value4);
			}
			ApplyLightStateByClientId(clientId, value4);
		}

		public static void ResetAll()
		{
			try
			{
				foreach (KeyValuePair<ulong, Light> light in _lights)
				{
					Light value = light.Value;
					if ((Object)(object)value != (Object)null)
					{
						Object.Destroy((Object)(object)((Component)value).gameObject);
					}
				}
				foreach (KeyValuePair<ulong, Light> item in _lightsByClient)
				{
					Light value2 = item.Value;
					if ((Object)(object)value2 != (Object)null)
					{
						Object.Destroy((Object)(object)((Component)value2).gameObject);
					}
				}
				_states.Clear();
				_lights.Clear();
				_lightsByClient.Clear();
				_userToClient.Clear();
				_rotations.Clear();
				_predictedClientStates.Clear();
			}
			catch
			{
			}
		}

		private static void ApplyLightStateByClientId(ulong clientId, bool on)
		{
			//IL_0073: Unknown result type (might be due to invalid IL or missing references)
			if (_lightsByClient.TryGetValue(clientId, out var value) && (Object)(object)value != (Object)null)
			{
				((Behaviour)value).enabled = on;
				value.intensity = Mathf.Max(0f, ConfigManager.Intensity.Value);
				value.range = Mathf.Max(0.1f, ConfigManager.Range.Value);
				value.spotAngle = Mathf.Clamp(ConfigManager.SpotAngle.Value, 1f, 170f);
				value.shadows = ConfigManager.GetShadowMode();
			}
		}

		private static void PlayToggleSoundForClient(ulong clientId)
		{
			//IL_0089: Unknown result type (might be due to invalid IL or missing references)
			try
			{
				if ((Object)(object)_toggleClip == (Object)null)
				{
					_toggleClip = FindAudioClipByName("Pop sounds 18");
				}
				AudioClip toggleClip = _toggleClip;
				if (!((Object)(object)toggleClip == (Object)null))
				{
					Transform val = null;
					if (_lightsByClient.TryGetValue(clientId, out var value) && (Object)(object)value != (Object)null)
					{
						val = ((Component)value).transform;
					}
					GameManager instance = GameManager.Instance;
					if ((Object)(object)instance != (Object)null && (Object)(object)instance.audioSource != (Object)null)
					{
						instance.audioSource.PlayOneShot(toggleClip, 0.2f);
					}
					else if ((Object)(object)val != (Object)null)
					{
						AudioSource.PlayClipAtPoint(toggleClip, val.position, 0.2f);
					}
				}
			}
			catch
			{
			}
		}

		private static AudioClip FindAudioClipByName(string name)
		{
			try
			{
				AudioClip[] array = Resources.FindObjectsOfTypeAll<AudioClip>();
				string b = (name ?? string.Empty).Trim();
				foreach (AudioClip val in array)
				{
					if (!((Object)(object)val == (Object)null) && string.Equals(((Object)val).name ?? string.Empty, b, StringComparison.OrdinalIgnoreCase))
					{
						return val;
					}
				}
			}
			catch
			{
			}
			return null;
		}
	}
	public class FlashlightAligner : MonoBehaviour
	{
		public bool AlignToCamera;

		public Transform FollowPoint;

		public Vector3 LocalOffset = new Vector3(0f, 0f, 0.25f);

		public bool UseRemoteRotation;

		public Quaternion RemoteRotation;

		private const float SendInterval = 0.05f;

		private const float AngleThreshold = 0.25f;

		private float _lastSentTime;

		private Quaternion _lastSentRot;

		private void LateUpdate()
		{
			//IL_001b: 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_00be: 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)
			//IL_004f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0056: Unknown result type (might be due to invalid IL or missing references)
			//IL_0072: Unknown result type (might be due to invalid IL or missing references)
			//IL_0079: Unknown result type (might be due to invalid IL or missing references)
			//IL_007f: Unknown result type (might be due to invalid IL or missing references)
			//IL_009a: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a1: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a2: Unknown result type (might be due to invalid IL or missing references)
			//IL_0088: Unknown result type (might be due to invalid IL or missing references)
			//IL_008d: Unknown result type (might be due to invalid IL or missing references)
			if ((Object)(object)FollowPoint != (Object)null)
			{
				((Component)this).transform.position = FollowPoint.TransformPoint(LocalOffset);
			}
			if (AlignToCamera)
			{
				Camera main = Camera.main;
				if ((Object)(object)main != (Object)null)
				{
					Quaternion rotation = ((Component)main).transform.rotation;
					((Component)this).transform.rotation = rotation;
					float unscaledTime = Time.unscaledTime;
					if (unscaledTime - _lastSentTime >= 0.05f && (_lastSentRot == default(Quaternion) || Quaternion.Angle(_lastSentRot, rotation) >= 0.25f))
					{
						FlashlightManager.ReportLocalOrientation(rotation);
						_lastSentRot = rotation;
						_lastSentTime = unscaledTime;
					}
				}
			}
			else if (UseRemoteRotation)
			{
				((Component)this).transform.rotation = RemoteRotation;
			}
		}
	}
	public static class InputActionBindingHelper
	{
		public static InputAction CreateButtonAction(string actionName, string hotkey, Action onPerformed)
		{
			//IL_0024: Unknown result type (might be due to invalid IL or missing references)
			//IL_002a: Expected O, but got Unknown
			string text = BuildBindingPath(hotkey);
			if (string.IsNullOrWhiteSpace(text))
			{
				return null;
			}
			InputAction val = new InputAction(actionName, (InputActionType)1, text, (string)null, (string)null, (string)null);
			if (onPerformed != null)
			{
				val.performed += delegate
				{
					onPerformed();
				};
			}
			val.Enable();
			return val;
		}

		public static string BuildBindingPath(string hotkey)
		{
			if (string.IsNullOrWhiteSpace(hotkey))
			{
				return null;
			}
			string text = hotkey.Trim();
			if (text.Contains("<") && text.Contains(">"))
			{
				return text;
			}
			string text2 = text.ToLowerInvariant();
			return text2 switch
			{
				"leftbutton" => "<Mouse>/leftButton", 
				"rightbutton" => "<Mouse>/rightButton", 
				"middlebutton" => "<Mouse>/middleButton", 
				"backbutton" => "<Mouse>/backButton", 
				"forwardbutton" => "<Mouse>/forwardButton", 
				"buttonsouth" => "<Gamepad>/buttonSouth", 
				"buttoneast" => "<Gamepad>/buttonEast", 
				"buttonwest" => "<Gamepad>/buttonWest", 
				"buttonnorth" => "<Gamepad>/buttonNorth", 
				"leftshoulder" => "<Gamepad>/leftShoulder", 
				"rightshoulder" => "<Gamepad>/rightShoulder", 
				"lefttrigger" => "<Gamepad>/leftTrigger", 
				"righttrigger" => "<Gamepad>/rightTrigger", 
				"dpadup" => "<Gamepad>/dpad/up", 
				"dpaddown" => "<Gamepad>/dpad/down", 
				"dpadleft" => "<Gamepad>/dpad/left", 
				"dpadright" => "<Gamepad>/dpad/right", 
				"startbutton" => "<Gamepad>/start", 
				"selectbutton" => "<Gamepad>/select", 
				"leftstickpress" => "<Gamepad>/leftStickPress", 
				"rightstickpress" => "<Gamepad>/rightStickPress", 
				_ => "<Keyboard>/" + text2, 
			};
		}

		public static string FormatHotkeyForDisplay(string s)
		{
			if (string.IsNullOrWhiteSpace(s))
			{
				return string.Empty;
			}
			s = s.Trim();
			if (s.Length == 1)
			{
				return s.ToUpperInvariant();
			}
			if (s[0] == 'f' || s[0] == 'F')
			{
				bool flag = true;
				for (int i = 1; i < s.Length; i++)
				{
					if (!char.IsDigit(s[i]))
					{
						flag = false;
						break;
					}
				}
				if (flag)
				{
					return ("F" + s.Substring(1)).ToUpperInvariant();
				}
			}
			string text = s.ToLowerInvariant();
			switch (text)
			{
			case "leftbutton":
				return "Mouse Left";
			case "rightbutton":
				return "Mouse Right";
			case "middlebutton":
				return "Mouse Middle";
			case "backbutton":
				return "Mouse Back";
			case "forwardbutton":
				return "Mouse Forward";
			case "buttonsouth":
				return "Gamepad A";
			case "buttoneast":
				return "Gamepad B";
			case "buttonwest":
				return "Gamepad X";
			case "buttonnorth":
				return "Gamepad Y";
			case "leftshoulder":
				return "Gamepad LB";
			case "rightshoulder":
				return "Gamepad RB";
			case "lefttrigger":
				return "Gamepad LT";
			case "righttrigger":
				return "Gamepad RT";
			case "dpadup":
				return "D-Pad Up";
			case "dpaddown":
				return "D-Pad Down";
			case "dpadleft":
				return "D-Pad Left";
			case "dpadright":
				return "D-Pad Right";
			case "startbutton":
				return "Gamepad Start";
			case "selectbutton":
				return "Gamepad Select";
			case "leftstickpress":
				return "Left Stick Press";
			case "rightstickpress":
				return "Right Stick Press";
			default:
				switch (text.Length)
				{
				case 5:
					switch (text[0])
					{
					case 's':
						if (!(text == "slash"))
						{
							break;
						}
						return "/";
					case 'm':
						if (!(text == "minus"))
						{
							break;
						}
						return "-";
					case 'c':
						if (!(text == "comma"))
						{
							break;
						}
						return ",";
					case 'q':
						if (!(text == "quote"))
						{
							break;
						}
						return "'";
					}
					break;
				case 9:
					switch (text[4])
					{
					case 's':
						if (!(text == "backslash"))
						{
							break;
						}
						return "\\";
					case 'c':
						if (!(text == "semicolon"))
						{
							break;
						}
						return ";";
					case 'q':
						if (!(text == "backquote"))
						{
							break;
						}
						return "`";
					}
					break;
				case 6:
					switch (text[0])
					{
					case 'e':
						if (!(text == "equals"))
						{
							break;
						}
						return "=";
					case 'p':
						if (!(text == "period"))
						{
							break;
						}
						return ".";
					}
					break;
				case 4:
					if (!(text == "plus"))
					{
						break;
					}
					return "+";
				case 11:
					if (!(text == "leftbracket"))
					{
						break;
					}
					return "[";
				case 12:
					if (!(text == "rightbracket"))
					{
						break;
					}
					return "]";
				}
				break;
			case null:
				break;
			}
			switch (text)
			{
			case "alt":
			case "ctrl":
			case "shift":
			case "enter":
			case "space":
			case "escape":
			case "esc":
			case "tab":
			case "backspace":
			case "capslock":
				return char.ToUpper(s[0]) + s.Substring(1).ToLowerInvariant();
			case "leftalt":
				return "LeftAlt";
			case "rightalt":
				return "RightAlt";
			case "leftctrl":
				return "LeftCtrl";
			case "rightctrl":
				return "RightCtrl";
			case "leftshift":
				return "LeftShift";
			case "rightshift":
				return "RightShift";
			default:
				return char.ToUpper(s[0]) + s.Substring(1).ToLowerInvariant();
			}
		}
	}
}
namespace PlayerFlashlight.Patches
{
	[HarmonyPatch(typeof(GameManager))]
	public static class GameManagerPatch
	{
		[HarmonyPatch("OnNetworkSpawn")]
		[HarmonyPostfix]
		private static void OnNetworkSpawn_Postfix()
		{
			FlashlightManager.RegisterMessageHandlers();
		}

		[HarmonyPatch("OnNetworkDespawn")]
		[HarmonyPostfix]
		private static void OnNetworkDespawn_Postfix()
		{
			FlashlightManager.ResetAll();
		}
	}
	[HarmonyPatch(typeof(UIManager))]
	public static class UIManagerHotkeyPatch
	{
		private static InputAction _toggleAction;

		[HarmonyPatch("Awake")]
		[HarmonyPostfix]
		private static void Awake_Postfix()
		{
			InitializeHotkey();
		}

		private static void InitializeHotkey()
		{
			try
			{
				if (_toggleAction != null)
				{
					_toggleAction.Disable();
					_toggleAction.Dispose();
					_toggleAction = null;
				}
				string value = ConfigManager.Hotkey.Value;
				_toggleAction = InputActionBindingHelper.CreateButtonAction("ToggleFlashlight", string.IsNullOrWhiteSpace(value) ? "l" : value, delegate
				{
					if (!IsAnyTextInputFocused())
					{
						FlashlightManager.SendToggle();
					}
				});
			}
			catch (Exception ex)
			{
				ManualLogSource logger = PlayerFlashlight.Logger;
				if (logger != null)
				{
					logger.LogError((object)("初始化手电筒快捷键失败: " + ex.Message));
				}
			}
		}

		private static bool IsAnyTextInputFocused()
		{
			EventSystem current = EventSystem.current;
			GameObject val = (((Object)(object)current != (Object)null) ? current.currentSelectedGameObject : null);
			if ((Object)(object)val != (Object)null)
			{
				if ((Object)(object)val.GetComponentInParent<TMP_InputField>() != (Object)null)
				{
					return true;
				}
				if ((Object)(object)val.GetComponentInParent<InputField>() != (Object)null)
				{
					return true;
				}
			}
			TMP_InputField[] array = Object.FindObjectsOfType<TMP_InputField>();
			foreach (TMP_InputField val2 in array)
			{
				if ((Object)(object)val2 != (Object)null && val2.isFocused)
				{
					return true;
				}
			}
			InputField[] array2 = Object.FindObjectsOfType<InputField>();
			foreach (InputField val3 in array2)
			{
				if ((Object)(object)val3 != (Object)null && val3.isFocused)
				{
					return true;
				}
			}
			return false;
		}
	}
	[HarmonyPatch(typeof(ExampleCharacterSetup))]
	public static class ExampleCharacterSetupPatch
	{
		[HarmonyPatch("OnNetworkSpawn")]
		[HarmonyPostfix]
		private static void OnNetworkSpawn_Postfix(ExampleCharacterSetup __instance)
		{
			NetworkObject networkObject = ((NetworkBehaviour)__instance).NetworkObject;
			if (!((Object)(object)networkObject == (Object)null))
			{
				FlashlightManager.EnsureLightForClient(networkObject.OwnerClientId);
			}
		}
	}
}
namespace PlayerFlashlight.Localization
{
	public static class LocalizationHelper
	{
		public static Dictionary<string, string> GetDefaultTranslations(string language)
		{
			Dictionary<string, string> dictionary = new Dictionary<string, string>();
			switch (language)
			{
			case "zh":
				dictionary.Add("plugin.initializing", "开始初始化...");
				dictionary.Add("plugin.author_prefix", "作者:");
				dictionary.Add("plugin.initialized", "初始化成功!");
				dictionary.Add("plugin.patches_skipped", "补丁已应用,跳过...");
				dictionary.Add("config.enable_mod_desc", "是否启用模组");
				dictionary.Add("config.hotkey_desc", "手电筒开关快捷键");
				dictionary.Add("config.intensity_desc", "手电筒亮度");
				dictionary.Add("config.spot_angle_desc", "手电筒光锥角度");
				dictionary.Add("config.range_desc", "手电筒照明范围(米)");
				dictionary.Add("config.shadow_mode_desc", "阴影模式");
				break;
			case "zh-Hant":
				dictionary.Add("plugin.initializing", "開始初始化...");
				dictionary.Add("plugin.author_prefix", "作者:");
				dictionary.Add("plugin.initialized", "初始化成功!");
				dictionary.Add("plugin.patches_skipped", "補丁已應用,跳過...");
				dictionary.Add("config.enable_mod_desc", "是否啟用模組");
				dictionary.Add("config.hotkey_desc", "手電筒開關快捷鍵");
				dictionary.Add("config.intensity_desc", "手電筒亮度");
				dictionary.Add("config.spot_angle_desc", "手電筒光錐角度");
				dictionary.Add("config.range_desc", "手電筒照明範圍(米)");
				dictionary.Add("config.shadow_mode_desc", "陰影模式");
				break;
			case "en":
				dictionary.Add("plugin.initializing", "is initializing...");
				dictionary.Add("plugin.author_prefix", "Author: ");
				dictionary.Add("plugin.initialized", "initialized successfully!");
				dictionary.Add("plugin.patches_skipped", "Patches already applied, skipping...");
				dictionary.Add("config.enable_mod_desc", "Whether to enable mod");
				dictionary.Add("config.hotkey_desc", "Flashlight toggle hotkey");
				dictionary.Add("config.intensity_desc", "Flashlight intensity");
				dictionary.Add("config.spot_angle_desc", "Flashlight spot angle");
				dictionary.Add("config.range_desc", "Flashlight range (meters)");
				dictionary.Add("config.shadow_mode_desc", "Shadow mode");
				break;
			case "ja":
				dictionary.Add("plugin.initializing", "初期化中...");
				dictionary.Add("plugin.author_prefix", "作者:");
				dictionary.Add("plugin.initialized", "初期化完了!");
				dictionary.Add("plugin.patches_skipped", "パッチは既に適用されています。スキップします...");
				dictionary.Add("config.enable_mod_desc", "MODを有効にするかどうか");
				dictionary.Add("config.hotkey_desc", "懐中電灯の切り替えホットキー");
				dictionary.Add("config.intensity_desc", "懐中電灯の明るさ");
				dictionary.Add("config.spot_angle_desc", "懐中電灯の照射角度");
				dictionary.Add("config.range_desc", "懐中電灯の照射範囲(メートル)");
				dictionary.Add("config.shadow_mode_desc", "影モード");
				break;
			}
			return dictionary;
		}
	}
	public class LocalizationManager
	{
		private static LocalizationManager _instance;

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

		private string _currentLocale = "zh";

		public static readonly string[] SupportedLanguages = new string[12]
		{
			"zh", "zh-Hant", "en", "fr", "de", "ja", "ko", "pt", "ru", "es",
			"tr", "uk"
		};

		public static LocalizationManager Instance => _instance ?? (_instance = new LocalizationManager());

		private LocalizationManager()
		{
			Initialize();
		}

		public void Initialize()
		{
			//IL_0013: 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)
			if ((Object)(object)LocalizationSettings.SelectedLocale != (Object)null)
			{
				LocaleIdentifier identifier = LocalizationSettings.SelectedLocale.Identifier;
				_currentLocale = ((LocaleIdentifier)(ref identifier)).Code;
			}
			string[] supportedLanguages = SupportedLanguages;
			foreach (string text in supportedLanguages)
			{
				Dictionary<string, string> defaultTranslations = LocalizationHelper.GetDefaultTranslations(text);
				if (defaultTranslations != null && defaultTranslations.Count > 0)
				{
					_localizations[text] = defaultTranslations;
				}
			}
			LocalizationSettings.SelectedLocaleChanged += OnGameLanguageChanged;
		}

		private void OnGameLanguageChanged(Locale locale)
		{
			//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)
			if ((Object)(object)locale != (Object)null)
			{
				LocaleIdentifier identifier = locale.Identifier;
				string code = ((LocaleIdentifier)(ref identifier)).Code;
				if (_localizations.ContainsKey(code))
				{
					_currentLocale = code;
				}
				else
				{
					_currentLocale = "en";
				}
			}
		}

		public string GetLocalizedText(string key, params object[] args)
		{
			if (string.IsNullOrEmpty(_currentLocale) || !_localizations.ContainsKey(_currentLocale))
			{
				_currentLocale = "en";
			}
			if (_localizations.ContainsKey(_currentLocale) && _localizations[_currentLocale].TryGetValue(key, out var value))
			{
				if (args.Length == 0)
				{
					return value;
				}
				return string.Format(value, args);
			}
			if (_currentLocale != "en" && _localizations.ContainsKey("en") && _localizations["en"].TryGetValue(key, out var value2))
			{
				if (args.Length == 0)
				{
					return value2;
				}
				return string.Format(value2, args);
			}
			if (_localizations.ContainsKey("zh") && _localizations["zh"].TryGetValue(key, out var value3))
			{
				if (args.Length == 0)
				{
					return value3;
				}
				return string.Format(value3, args);
			}
			return key;
		}
	}
}
namespace PlayerFlashlight.Configuration
{
	public static class ConfigManager
	{
		public static ConfigEntry<string> Hotkey { get; private set; }

		public static ConfigEntry<float> Intensity { get; private set; }

		public static ConfigEntry<float> Range { get; private set; }

		public static ConfigEntry<float> SpotAngle { get; private set; }

		public static ConfigEntry<string> ShadowMode { get; private set; }

		public static void Initialize(ConfigFile config)
		{
			//IL_0104: Unknown result type (might be due to invalid IL or missing references)
			//IL_010e: Expected O, but got Unknown
			Hotkey = config.Bind<string>("General", "Hotkey", "l", LocalizationManager.Instance.GetLocalizedText("config.hotkey_desc"));
			Intensity = config.Bind<float>("Flashlight", "Intensity", 50f, LocalizationManager.Instance.GetLocalizedText("config.intensity_desc"));
			SpotAngle = config.Bind<float>("Flashlight", "SpotAngle", 60f, LocalizationManager.Instance.GetLocalizedText("config.spot_angle_desc"));
			Range = config.Bind<float>("Flashlight", "Range", 36f, LocalizationManager.Instance.GetLocalizedText("config.range_desc"));
			ShadowMode = config.Bind<string>("Flashlight", "ShadowMode", "None", new ConfigDescription(LocalizationManager.Instance.GetLocalizedText("config.shadow_mode_desc"), (AcceptableValueBase)(object)new AcceptableValueList<string>(new string[3] { "None", "Hard", "Soft" }), Array.Empty<object>()));
		}

		public static LightShadows GetShadowMode()
		{
			string a = ShadowMode.Value?.Trim();
			if (!string.Equals(a, "Hard", StringComparison.OrdinalIgnoreCase))
			{
				if (!string.Equals(a, "Soft", StringComparison.OrdinalIgnoreCase))
				{
					return (LightShadows)0;
				}
				return (LightShadows)2;
			}
			return (LightShadows)1;
		}
	}
}