Decompiled source of HideFlashlightHand v4.0.0

HideFlashlightHand.dll

Decompiled 2 weeks ago
using System;
using System.Diagnostics;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using BepInEx;
using BepInEx.Configuration;
using BepInEx.Logging;
using HarmonyLib;
using Microsoft.CodeAnalysis;
using UnityEngine;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")]
[assembly: IgnoresAccessChecksTo("")]
[assembly: AssemblyCompany("REPOJP")]
[assembly: AssemblyConfiguration("Release")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0")]
[assembly: AssemblyProduct("zabuMod")]
[assembly: AssemblyTitle("zabuMod")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.0.0.0")]
[module: UnverifiableCode]
[module: RefSafetyRules(11)]
namespace Microsoft.CodeAnalysis
{
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	internal sealed class EmbeddedAttribute : Attribute
	{
	}
}
namespace System.Runtime.CompilerServices
{
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	[AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)]
	internal sealed class RefSafetyRulesAttribute : Attribute
	{
		public readonly int Version;

		public RefSafetyRulesAttribute(int P_0)
		{
			Version = P_0;
		}
	}
}
namespace REPOJP.HideFlashlightHand
{
	[BepInPlugin("REPOJP.HideFlashlightHand", "HideFlashlightHand", "4.0.0")]
	public sealed class HideFlashlightHandPlugin : BaseUnityPlugin
	{
		public const string PluginGuid = "REPOJP.HideFlashlightHand";

		public const string PluginName = "HideFlashlightHand";

		public const string PluginVersion = "4.0.0";

		internal static ConfigEntry<bool> CfgEnableMod;

		internal static ConfigEntry<bool> CfgHideFirstPersonHalo;

		internal static ConfigEntry<bool> CfgRestoreWhenNotFirstPerson;

		internal static ConfigEntry<bool> CfgShowDebugLog;

		internal static ManualLogSource Log;

		private Harmony harmony;

		private void Awake()
		{
			//IL_003e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0048: Expected O, but got Unknown
			//IL_0069: Unknown result type (might be due to invalid IL or missing references)
			//IL_0073: Expected O, but got Unknown
			//IL_0094: Unknown result type (might be due to invalid IL or missing references)
			//IL_009e: Expected O, but got Unknown
			//IL_00bf: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c9: Expected O, but got Unknown
			//IL_00d4: Unknown result type (might be due to invalid IL or missing references)
			//IL_00de: Expected O, but got Unknown
			try
			{
				Log = ((BaseUnityPlugin)this).Logger;
				((Component)this).transform.parent = null;
				Object.DontDestroyOnLoad((Object)(object)((Component)this).gameObject);
				CfgEnableMod = ((BaseUnityPlugin)this).Config.Bind<bool>("General", "EnableMod", true, new ConfigDescription("Enable this mod.このMODを有効化", (AcceptableValueBase)null, Array.Empty<object>()));
				CfgHideFirstPersonHalo = ((BaseUnityPlugin)this).Config.Bind<bool>("Visual", "HideFirstPersonHalo", false, new ConfigDescription("Hide the local first-person halo/flare visual too. The spotlight and flashlight lighting behavior are never disabled.ローカル一人称時のhalo/flare表示も非表示 照射Lightと懐中電灯の照射挙動は無効化しない", (AcceptableValueBase)null, Array.Empty<object>()));
				CfgRestoreWhenNotFirstPerson = ((BaseUnityPlugin)this).Config.Bind<bool>("Visual", "RestoreWhenNotFirstPerson", true, new ConfigDescription("Restore the local flashlight mesh when it is not being rendered as the local first-person hand model.ローカル一人称の手元モデルとして描画されていない場合はローカル懐中電灯メッシュを復元", (AcceptableValueBase)null, Array.Empty<object>()));
				CfgShowDebugLog = ((BaseUnityPlugin)this).Config.Bind<bool>("Debug", "ShowDebugLog", false, new ConfigDescription("Show debug logs.デバッグログを表示", (AcceptableValueBase)null, Array.Empty<object>()));
				harmony = new Harmony("REPOJP.HideFlashlightHand");
				harmony.PatchAll();
				WriteDebugLog("Plugin loaded");
			}
			catch (Exception ex)
			{
				((BaseUnityPlugin)this).Logger.LogError((object)("Failure: HideFlashlightHand Awake\n" + ex));
			}
		}

		private void OnDestroy()
		{
			try
			{
				if (harmony != null)
				{
					harmony.UnpatchSelf();
				}
			}
			catch (Exception ex)
			{
				if (Log != null)
				{
					Log.LogError((object)("Failure: HideFlashlightHand OnDestroy\n" + ex));
				}
			}
		}

		internal static void WriteDebugLog(string message)
		{
			if (Log != null && CfgShowDebugLog != null && CfgShowDebugLog.Value)
			{
				Log.LogInfo((object)message);
			}
		}
	}
	internal static class FlashlightHideCore
	{
		private static readonly FieldInfo CurrentStateField = AccessTools.Field(typeof(FlashlightController), "currentState");

		private static readonly int TriggersLayer = LayerMask.NameToLayer("Triggers");

		internal static void ApplyAfterVanillaUpdate(FlashlightController inst)
		{
			try
			{
				if ((Object)(object)inst == (Object)null || (Object)(object)inst.PlayerAvatar == (Object)null || (Object)(object)inst.mesh == (Object)null || !inst.PlayerAvatar.isLocal)
				{
					return;
				}
				if (HideFlashlightHandPlugin.CfgEnableMod == null || !HideFlashlightHandPlugin.CfgEnableMod.Value)
				{
					RestoreMeshIfVanillaVisible(inst);
					RestoreHaloIfNeeded(inst);
					return;
				}
				if (!IsFirstPersonHandView(inst))
				{
					if (HideFlashlightHandPlugin.CfgRestoreWhenNotFirstPerson != null && HideFlashlightHandPlugin.CfgRestoreWhenNotFirstPerson.Value)
					{
						RestoreMeshIfVanillaVisible(inst);
					}
					RestoreHaloIfNeeded(inst);
					return;
				}
				if (((Renderer)inst.mesh).enabled)
				{
					((Renderer)inst.mesh).enabled = false;
					HideFlashlightHandPlugin.WriteDebugLog("Local first-person flashlight mesh hidden");
				}
				if (HideFlashlightHandPlugin.CfgHideFirstPersonHalo != null && HideFlashlightHandPlugin.CfgHideFirstPersonHalo.Value && (Object)(object)inst.halo != (Object)null && inst.halo.enabled)
				{
					inst.halo.enabled = false;
				}
			}
			catch (Exception ex)
			{
				if (HideFlashlightHandPlugin.Log != null)
				{
					HideFlashlightHandPlugin.Log.LogError((object)("Failure: ApplyAfterVanillaUpdate\n" + ex));
				}
			}
		}

		private static bool IsFirstPersonHandView(FlashlightController inst)
		{
			if ((Object)(object)inst == (Object)null || (Object)(object)inst.PlayerAvatar == (Object)null || (Object)(object)inst.mesh == (Object)null)
			{
				return false;
			}
			if (!inst.PlayerAvatar.isLocal)
			{
				return false;
			}
			if (!IsVanillaMeshExpectedVisible(inst))
			{
				return false;
			}
			if (TriggersLayer >= 0 && ((Component)inst.mesh).gameObject.layer == TriggersLayer)
			{
				return false;
			}
			if (IsUsingClientFollowTransform(inst))
			{
				return false;
			}
			return true;
		}

		private static bool IsUsingClientFollowTransform(FlashlightController inst)
		{
			//IL_0021: 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_0049: 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)
			try
			{
				if ((Object)(object)inst == (Object)null || (Object)(object)inst.FollowTransformClient == (Object)null)
				{
					return false;
				}
				float num = Vector3.Distance(((Component)inst).transform.position, inst.FollowTransformClient.position);
				if (num > 0.03f)
				{
					return false;
				}
				float num2 = Quaternion.Angle(((Component)inst).transform.rotation, inst.FollowTransformClient.rotation);
				if (num2 > 2f)
				{
					return false;
				}
				return true;
			}
			catch
			{
				return false;
			}
		}

		private static void RestoreMeshIfVanillaVisible(FlashlightController inst)
		{
			if (!((Object)(object)inst == (Object)null) && !((Object)(object)inst.mesh == (Object)null) && IsVanillaMeshExpectedVisible(inst) && !((Renderer)inst.mesh).enabled)
			{
				((Renderer)inst.mesh).enabled = true;
				HideFlashlightHandPlugin.WriteDebugLog("Local flashlight mesh restored");
			}
		}

		private static void RestoreHaloIfNeeded(FlashlightController inst)
		{
			if (!((Object)(object)inst == (Object)null) && !((Object)(object)inst.halo == (Object)null) && HideFlashlightHandPlugin.CfgHideFirstPersonHalo != null && HideFlashlightHandPlugin.CfgHideFirstPersonHalo.Value && inst.LightActive && !inst.halo.enabled)
			{
				inst.halo.enabled = true;
			}
		}

		private static bool IsVanillaMeshExpectedVisible(FlashlightController inst)
		{
			if ((Object)(object)inst == (Object)null || (Object)(object)inst.PlayerAvatar == (Object)null)
			{
				return false;
			}
			if (inst.PlayerAvatar.isDisabled)
			{
				return false;
			}
			string currentStateName = GetCurrentStateName(inst);
			switch (currentStateName)
			{
			default:
				return currentStateName == "Outro";
			case "Intro":
			case "LightOn":
			case "Idle":
			case "LightOff":
				return true;
			}
		}

		private static string GetCurrentStateName(FlashlightController inst)
		{
			try
			{
				if (CurrentStateField == null || (Object)(object)inst == (Object)null)
				{
					return string.Empty;
				}
				object value = CurrentStateField.GetValue(inst);
				if (value == null)
				{
					return string.Empty;
				}
				return value.ToString();
			}
			catch
			{
				return string.Empty;
			}
		}
	}
	[HarmonyPatch(typeof(FlashlightController))]
	internal static class FlashlightControllerPatches
	{
		[HarmonyPostfix]
		[HarmonyPatch("Start")]
		private static void Start_Postfix(FlashlightController __instance)
		{
			FlashlightHideCore.ApplyAfterVanillaUpdate(__instance);
		}

		[HarmonyPostfix]
		[HarmonyPatch("Update")]
		private static void Update_Postfix(FlashlightController __instance)
		{
			FlashlightHideCore.ApplyAfterVanillaUpdate(__instance);
		}
	}
}