Decompiled source of Fnf Cosmetics v1.0.0

MoreHead/MoreHead.dll

Decompiled a day 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.Versioning;
using BepInEx;
using BepInEx.Logging;
using HarmonyLib;
using MenuLib;
using Microsoft.CodeAnalysis;
using MoreHead;
using Newtonsoft.Json;
using Photon.Pun;
using UnityEngine;
using UnityEngine.UI;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = "")]
[assembly: AssemblyCompany("MoreHead")]
[assembly: AssemblyConfiguration("Debug")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0")]
[assembly: AssemblyProduct("MoreHead")]
[assembly: AssemblyTitle("MoreHead")]
[assembly: AssemblyVersion("1.0.0.0")]
namespace Microsoft.CodeAnalysis
{
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	internal sealed class EmbeddedAttribute : Attribute
	{
	}
}
namespace System.Runtime.CompilerServices
{
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	[AttributeUsage(AttributeTargets.Class | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Parameter | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter, AllowMultiple = false, Inherited = false)]
	internal sealed class NullableAttribute : Attribute
	{
		public readonly byte[] NullableFlags;

		public NullableAttribute(byte P_0)
		{
			NullableFlags = new byte[1] { P_0 };
		}

		public NullableAttribute(byte[] P_0)
		{
			NullableFlags = P_0;
		}
	}
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	[AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Method | AttributeTargets.Interface | AttributeTargets.Delegate, AllowMultiple = false, Inherited = false)]
	internal sealed class NullableContextAttribute : Attribute
	{
		public readonly byte Flag;

		public NullableContextAttribute(byte P_0)
		{
			Flag = P_0;
		}
	}
}
[BepInPlugin("Mhz.REPOMoreHead", "MoreHead", "1.2.3")]
public class Morehead : BaseUnityPlugin
{
	private const string PluginGuid = "Mhz.REPOMoreHead";

	private const string PluginName = "MoreHead";

	private const string PluginVersion = "1.2.3";

	public static ManualLogSource? Logger;

	public static Morehead? Instance { get; private set; }

	private void Awake()
	{
		//IL_0019: Unknown result type (might be due to invalid IL or missing references)
		//IL_001f: Expected O, but got Unknown
		Instance = this;
		Logger = ((BaseUnityPlugin)this).Logger;
		try
		{
			Harmony val = new Harmony("Mhz.REPOMoreHead");
			val.PatchAll(typeof(PlayerAvatarVisualsPatch));
			val.PatchAll(typeof(PlayerUpdatePatch));
			val.PatchAll(typeof(PlayerAvatarAwakePatch));
			val.PatchAll(typeof(GameDirectorUpdatePatch));
			val.PatchAll(typeof(PlayerRevivePatch));
			string text = "\n\n ███▄ ▄███▓ ▒█████   ██▀███  ▓█████  ██░ ██ ▓█████ ▄▄▄      ▓█████▄ \n▓██▒▀█▀ ██▒▒██▒  ██▒▓██ ▒ ██▒▓█   ▀ ▓██░ ██▒▓█   ▀▒████▄    ▒██▀ ██▌\n▓██    ▓██░▒██░  ██▒▓██ ░▄█ ▒▒███   ▒██▀███░▒███  ▒██  ▀█▄  ░██   █▌\n▒██    ▒██ ▒██   ██░▒███▀█▄  ▒▓█  ▄ ░▓█ ░██ ▒▓█  ▄░██▄▄▄▄██ ░▓█▄   ▌\n▒██▒   ░██▒░ ████▓▒░░██▓ ▒██▒░▒████▒░▓█▒░██▓░▒████▒▓█   ▓██▒░▒████▓   v1.2.3\n░ ▒░   ░  ░░ ▒░▒░▒░ ░ ▒▓ ░▒▓░░░ ▒░ ░ ▒ ░░▒░▒░░ ▒░ ░▒▒   ▓▒█░ ▒▒▓  ▒ \n░  ░      ░  ░ ▒ ▒░   ░▒ ░ ▒░ ░ ░  ░ ▒ ░▒░ ░ ░ ░  ░ ▒   ▒▒ ░ ░ ▒  ▒ \n░      ░   ░ ░ ░ ▒    ░░   ░    ░    ░  ░░ ░   ░    ░   ▒    ░ ░  ░ \n       ░       ░ ░     ░        ░  ░ ░  ░  ░   ░  ░     ░  ░   ░    \n";
			ManualLogSource? logger = Logger;
			if (logger != null)
			{
				logger.LogMessage((object)text);
			}
			HeadDecorationManager.Initialize();
			ConfigManager.Initialize();
			MoreHeadUI.Initialize();
		}
		catch (Exception ex)
		{
			ManualLogSource? logger2 = Logger;
			if (logger2 != null)
			{
				logger2.LogError((object)("Harmony补丁应用失败: " + ex.Message));
			}
		}
	}

	private void OnApplicationQuit()
	{
		ConfigManager.SaveConfig();
	}

	public static bool GetDecorationState(string? name)
	{
		return HeadDecorationManager.GetDecorationState(name);
	}
}
[HarmonyPatch(typeof(PlayerAvatar))]
[HarmonyPatch("Update")]
internal class PlayerUpdatePatch
{
	private static void Postfix(PlayerAvatar __instance)
	{
		if (__instance.photonView.IsMine && GameManager.Multiplayer() && PhotonNetwork.LocalPlayer != null)
		{
		}
	}

	public static void UpdatePlayerDecorations(PlayerAvatar playerAvatar)
	{
		try
		{
			if ((Object)(object)playerAvatar?.playerAvatarVisuals == (Object)null)
			{
				return;
			}
			Dictionary<string, Transform> decorationParentNodes = DecorationUtils.GetDecorationParentNodes(((Component)playerAvatar.playerAvatarVisuals).transform);
			if (decorationParentNodes.Count == 0)
			{
				ManualLogSource? logger = Morehead.Logger;
				if (logger != null)
				{
					logger.LogWarning((object)"找不到任何装饰物父级节点");
				}
				return;
			}
			DecorationUtils.EnsureDecorationContainers(decorationParentNodes);
			foreach (DecorationInfo decoration in HeadDecorationManager.Decorations)
			{
				if (decorationParentNodes.TryGetValue(decoration.ParentTag ?? string.Empty, out var value))
				{
					Transform val = value.Find("HeadDecorations");
					if ((Object)(object)val != (Object)null)
					{
						DecorationUtils.UpdateDecoration(val, decoration.Name ?? string.Empty, decoration.IsVisible);
					}
				}
				else
				{
					ManualLogSource? logger2 = Morehead.Logger;
					if (logger2 != null)
					{
						logger2.LogWarning((object)("找不到装饰物 " + decoration.DisplayName + " 的父级节点: " + decoration.ParentTag));
					}
				}
			}
		}
		catch (Exception ex)
		{
			ManualLogSource? logger3 = Morehead.Logger;
			if (logger3 != null)
			{
				logger3.LogError((object)("更新玩家装饰物时出错: " + ex.Message));
			}
		}
	}

	public static void UpdateMenuPlayerDecorations()
	{
		try
		{
			PlayerAvatarVisuals val = FindMenuPlayerVisuals();
			if ((Object)(object)val == (Object)null)
			{
				return;
			}
			Dictionary<string, Transform> decorationParentNodes = DecorationUtils.GetDecorationParentNodes(((Component)val).transform);
			if (decorationParentNodes.Count == 0)
			{
				ManualLogSource? logger = Morehead.Logger;
				if (logger != null)
				{
					logger.LogWarning((object)"找不到任何菜单角色装饰物父级节点");
				}
				return;
			}
			DecorationUtils.EnsureDecorationContainers(decorationParentNodes);
			foreach (DecorationInfo decoration in HeadDecorationManager.Decorations)
			{
				if (decorationParentNodes.TryGetValue(decoration.ParentTag ?? string.Empty, out var value))
				{
					Transform val2 = value.Find("HeadDecorations");
					if ((Object)(object)val2 != (Object)null)
					{
						Transform val3 = val2.Find(decoration.Name);
						if ((Object)(object)val3 == (Object)null)
						{
							AddMenuDecoration(val2, decoration.Name);
						}
						else
						{
							DecorationUtils.UpdateDecoration(val2, decoration.Name ?? string.Empty, decoration.IsVisible);
						}
					}
				}
				else
				{
					ManualLogSource? logger2 = Morehead.Logger;
					if (logger2 != null)
					{
						logger2.LogWarning((object)("找不到菜单角色装饰物 " + decoration.DisplayName + " 的父级节点: " + decoration.ParentTag));
					}
				}
			}
		}
		catch (Exception ex)
		{
			ManualLogSource? logger3 = Morehead.Logger;
			if (logger3 != null)
			{
				logger3.LogError((object)("更新菜单角色装饰物状态失败: " + ex.Message));
			}
		}
	}

	private static PlayerAvatarVisuals? FindMenuPlayerVisuals()
	{
		if ((Object)(object)PlayerAvatarMenu.instance == (Object)null)
		{
			return null;
		}
		return ((Component)PlayerAvatarMenu.instance).GetComponentInChildren<PlayerAvatarVisuals>();
	}

	public static void AddMenuDecoration(Transform parent, string? decorationName)
	{
		string decorationName2 = decorationName;
		try
		{
			Transform val = parent.Find(decorationName2);
			if ((Object)(object)val != (Object)null)
			{
				bool decorationState = Morehead.GetDecorationState(decorationName2);
				((Component)val).gameObject.SetActive(decorationState);
				return;
			}
			DecorationInfo decorationInfo = HeadDecorationManager.Decorations.Find((DecorationInfo d) => d.Name != null && d.Name.Equals(decorationName2, StringComparison.OrdinalIgnoreCase));
			if (decorationInfo != null && (Object)(object)decorationInfo.Prefab != (Object)null)
			{
				GameObject val2 = Object.Instantiate<GameObject>(decorationInfo.Prefab, parent);
				((Object)val2).name = decorationName2;
				val2.SetActive(decorationInfo.IsVisible);
				return;
			}
			ManualLogSource? logger = Morehead.Logger;
			if (logger != null)
			{
				logger.LogWarning((object)("AddMenuDecoration: 找不到装饰物 " + decorationName2 + " 或其预制体为空"));
			}
		}
		catch (Exception ex)
		{
			ManualLogSource? logger2 = Morehead.Logger;
			if (logger2 != null)
			{
				logger2.LogError((object)("为菜单角色添加装饰物时出错: " + ex.Message));
			}
		}
	}
}
[HarmonyPatch(typeof(PlayerAvatar))]
[HarmonyPatch("Awake")]
internal class PlayerAvatarAwakePatch
{
	private static void Postfix(PlayerAvatar __instance)
	{
		((Component)__instance).gameObject.AddComponent<HeadDecorationSync>();
	}
}
public class HeadDecorationSync : MonoBehaviourPun
{
	public void SyncAllDecorations()
	{
		try
		{
			string[] array = new string[HeadDecorationManager.Decorations.Count];
			bool[] array2 = new bool[HeadDecorationManager.Decorations.Count];
			string[] array3 = new string[HeadDecorationManager.Decorations.Count];
			for (int i = 0; i < HeadDecorationManager.Decorations.Count; i++)
			{
				DecorationInfo decorationInfo = HeadDecorationManager.Decorations[i];
				array[i] = decorationInfo.Name;
				array2[i] = decorationInfo.IsVisible;
				array3[i] = decorationInfo.ParentTag;
			}
			((MonoBehaviourPun)this).photonView.RPC("UpdateAllDecorations", (RpcTarget)1, new object[3] { array, array2, array3 });
		}
		catch (Exception ex)
		{
			ManualLogSource? logger = Morehead.Logger;
			if (logger != null)
			{
				logger.LogError((object)("同步所有装饰物状态失败: " + ex.Message));
			}
		}
	}

	[PunRPC]
	private void UpdateAllDecorations(string[] names, bool[] states, string[] parentTags)
	{
		try
		{
			PlayerAvatar component = ((Component)this).GetComponent<PlayerAvatar>();
			if ((Object)(object)component == (Object)null || (Object)(object)component.playerAvatarVisuals == (Object)null)
			{
				ManualLogSource? logger = Morehead.Logger;
				if (logger != null)
				{
					logger.LogWarning((object)"找不到PlayerAvatar或PlayerAvatarVisuals组件");
				}
				return;
			}
			Dictionary<string, Transform> decorationParentNodes = DecorationUtils.GetDecorationParentNodes(((Component)component.playerAvatarVisuals).transform);
			if (decorationParentNodes.Count == 0)
			{
				ManualLogSource? logger2 = Morehead.Logger;
				if (logger2 != null)
				{
					logger2.LogWarning((object)"找不到任何装饰物父级节点");
				}
				return;
			}
			DecorationUtils.EnsureDecorationContainers(decorationParentNodes);
			for (int i = 0; i < names.Length; i++)
			{
				string decorationName = names[i];
				bool showDecoration = states[i];
				string key = parentTags[i];
				if (decorationParentNodes.TryGetValue(key, out var value))
				{
					Transform val = value.Find("HeadDecorations");
					if ((Object)(object)val != (Object)null)
					{
						DecorationUtils.UpdateDecoration(val, decorationName, showDecoration);
					}
				}
			}
		}
		catch (Exception ex)
		{
			ManualLogSource? logger3 = Morehead.Logger;
			if (logger3 != null)
			{
				logger3.LogError((object)("RPC更新所有装饰物状态失败: " + ex.Message));
			}
		}
	}
}
[HarmonyPatch(typeof(PlayerAvatarVisuals))]
[HarmonyPatch("Start")]
internal class PlayerAvatarVisualsPatch
{
	private static void Postfix(PlayerAvatarVisuals __instance)
	{
		try
		{
			Dictionary<string, Transform> decorationParentNodes = DecorationUtils.GetDecorationParentNodes(((Component)__instance).transform);
			if (decorationParentNodes.Count == 0)
			{
				ManualLogSource? logger = Morehead.Logger;
				if (logger != null)
				{
					logger.LogWarning((object)$"找不到任何装饰物父级节点 (isMenuAvatar: {__instance.isMenuAvatar})");
				}
				return;
			}
			DecorationUtils.EnsureDecorationContainers(decorationParentNodes);
			if (__instance.isMenuAvatar)
			{
				foreach (KeyValuePair<string, Transform> item in decorationParentNodes)
				{
					string key = item.Key;
					Transform value = item.Value;
					Transform val = value.Find("HeadDecorations");
					if ((Object)(object)val != (Object)null)
					{
						foreach (DecorationInfo decoration in HeadDecorationManager.Decorations)
						{
							if (decoration.ParentTag == key)
							{
								PlayerUpdatePatch.AddMenuDecoration(val, decoration.Name);
							}
						}
					}
				}
				return;
			}
			foreach (DecorationInfo decoration2 in HeadDecorationManager.Decorations)
			{
				if (decorationParentNodes.TryGetValue(decoration2.ParentTag ?? string.Empty, out var value2))
				{
					Transform val2 = value2.Find("HeadDecorations");
					if ((Object)(object)val2 != (Object)null)
					{
						AddNewDecoration(val2, decoration2, __instance);
					}
				}
				else
				{
					ManualLogSource? logger2 = Morehead.Logger;
					if (logger2 != null)
					{
						logger2.LogWarning((object)("初始化时找不到装饰物 " + decoration2.DisplayName + " 的父级节点: " + decoration2.ParentTag));
					}
				}
			}
			if (!GameManager.Multiplayer() || !((Object)(object)__instance.playerAvatar != (Object)null) || !((Object)(object)__instance.playerAvatar.photonView != (Object)null) || !__instance.playerAvatar.photonView.IsMine)
			{
				return;
			}
			try
			{
				HeadDecorationSync component = ((Component)__instance.playerAvatar).GetComponent<HeadDecorationSync>();
				if ((Object)(object)component != (Object)null)
				{
					component.SyncAllDecorations();
					return;
				}
				ManualLogSource? logger3 = Morehead.Logger;
				if (logger3 != null)
				{
					logger3.LogWarning((object)"找不到HeadDecorationSync组件,无法同步初始状态");
				}
			}
			catch (Exception ex)
			{
				ManualLogSource? logger4 = Morehead.Logger;
				if (logger4 != null)
				{
					logger4.LogError((object)("同步初始装饰物状态失败: " + ex.Message));
				}
			}
		}
		catch (Exception ex2)
		{
			ManualLogSource? logger5 = Morehead.Logger;
			if (logger5 != null)
			{
				logger5.LogError((object)$"添加装饰物失败: {ex2.Message} (isMenuAvatar: {__instance.isMenuAvatar})");
			}
		}
	}

	private static void AddNewDecoration(Transform parent, DecorationInfo decoration, PlayerAvatarVisuals __instance)
	{
		Transform val = parent.Find(decoration.Name);
		if ((Object)(object)val != (Object)null)
		{
			((Component)val).gameObject.SetActive(decoration.IsVisible);
			return;
		}
		if ((Object)(object)decoration.Prefab != (Object)null)
		{
			try
			{
				GameObject val2 = Object.Instantiate<GameObject>(decoration.Prefab, parent);
				((Object)val2).name = decoration.Name;
				val2.SetActive(decoration.IsVisible);
				return;
			}
			catch (Exception ex)
			{
				ManualLogSource? logger = Morehead.Logger;
				if (logger != null)
				{
					logger.LogError((object)("实例化预制体时出错: " + ex.Message));
				}
				return;
			}
		}
		ManualLogSource? logger2 = Morehead.Logger;
		if (logger2 != null)
		{
			logger2.LogWarning((object)("AddNewDecoration: 装饰物 " + decoration.DisplayName + " 的预制体为空"));
		}
	}
}
[HarmonyPatch(typeof(GameDirector))]
[HarmonyPatch("Update")]
internal class GameDirectorUpdatePatch
{
	private static gameState previousState;

	private static void Postfix(GameDirector __instance)
	{
		//IL_0002: Unknown result type (might be due to invalid IL or missing references)
		//IL_0008: Invalid comparison between Unknown and I4
		//IL_000b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0011: Invalid comparison between Unknown and I4
		//IL_0023: 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)
		try
		{
			if ((int)previousState != 2 && (int)__instance.currentState == 2)
			{
				SyncAllPlayersDecorations();
			}
			previousState = __instance.currentState;
		}
		catch (Exception ex)
		{
			ManualLogSource? logger = Morehead.Logger;
			if (logger != null)
			{
				logger.LogError((object)("监听游戏状态变化时出错: " + ex.Message));
			}
		}
	}

	private static void SyncAllPlayersDecorations()
	{
		try
		{
			PlayerAvatar val = FindLocalPlayer();
			if ((Object)(object)val != (Object)null)
			{
				PlayerUpdatePatch.UpdatePlayerDecorations(val);
				HeadDecorationSync component = ((Component)val).GetComponent<HeadDecorationSync>();
				if ((Object)(object)component != (Object)null)
				{
					component.SyncAllDecorations();
				}
			}
		}
		catch (Exception ex)
		{
			ManualLogSource? logger = Morehead.Logger;
			if (logger != null)
			{
				logger.LogError((object)("同步所有玩家装饰物状态时出错: " + ex.Message));
			}
		}
	}

	private static PlayerAvatar? FindLocalPlayer()
	{
		try
		{
			PlayerAvatar[] array = Object.FindObjectsOfType<PlayerAvatar>();
			PlayerAvatar[] array2 = array;
			foreach (PlayerAvatar val in array2)
			{
				if ((Object)(object)val?.photonView != (Object)null && val.photonView.IsMine)
				{
					return val;
				}
			}
		}
		catch (Exception ex)
		{
			ManualLogSource? logger = Morehead.Logger;
			if (logger != null)
			{
				logger.LogError((object)("查找本地玩家时出错: " + ex.Message));
			}
		}
		return null;
	}
}
[HarmonyPatch(typeof(PlayerAvatar))]
[HarmonyPatch("ReviveRPC")]
internal class PlayerRevivePatch
{
	private static void Postfix(PlayerAvatar __instance)
	{
		try
		{
			if (__instance.photonView.IsMine)
			{
				((MonoBehaviour)__instance).StartCoroutine(DelayedSync(__instance));
			}
		}
		catch (Exception ex)
		{
			ManualLogSource? logger = Morehead.Logger;
			if (logger != null)
			{
				logger.LogError((object)("玩家复活时同步装饰物状态失败: " + ex.Message));
			}
		}
	}

	private static IEnumerator DelayedSync(PlayerAvatar playerAvatar)
	{
		yield return null;
		yield return (object)new WaitForSeconds(0.2f);
		try
		{
			PlayerUpdatePatch.UpdatePlayerDecorations(playerAvatar);
		}
		catch (Exception e2)
		{
			ManualLogSource? logger = Morehead.Logger;
			if (logger != null)
			{
				logger.LogError((object)("更新玩家装饰物状态失败: " + e2.Message));
			}
		}
		yield return (object)new WaitForSeconds(0.1f);
		try
		{
			HeadDecorationSync syncComponent = ((Component)playerAvatar).GetComponent<HeadDecorationSync>();
			if ((Object)(object)syncComponent != (Object)null)
			{
				syncComponent.SyncAllDecorations();
				yield break;
			}
			ManualLogSource? logger2 = Morehead.Logger;
			if (logger2 != null)
			{
				logger2.LogWarning((object)"玩家复活后找不到HeadDecorationSync组件");
			}
		}
		catch (Exception e)
		{
			ManualLogSource? logger3 = Morehead.Logger;
			if (logger3 != null)
			{
				logger3.LogError((object)("同步装饰物状态失败: " + e.Message));
			}
		}
	}
}
namespace MoreHead
{
	public static class ConfigManager
	{
		private const string MOD_DATA_FOLDER = "REPOModData";

		private const string MOD_FOLDER = "MoreHead";

		private const string CONFIG_FILENAME = "MoreHeadConfig.json";

		private static Dictionary<string?, bool> _decorationStates = new Dictionary<string, bool>();

		private static ManualLogSource? Logger => Morehead.Logger;

		private static string NewConfigFilePath => Path.Combine(Application.persistentDataPath, "REPOModData", "MoreHead", "MoreHeadConfig.json");

		private static string BepInExConfigFilePath => Path.Combine(Paths.ConfigPath, "MoreHeadConfig.json");

		private static string OldConfigFilePath
		{
			get
			{
				Morehead? instance = Morehead.Instance;
				return Path.Combine(Path.GetDirectoryName((instance != null) ? ((BaseUnityPlugin)instance).Info.Location : null) ?? string.Empty, "MoreHeadConfig.txt");
			}
		}

		public static void Initialize()
		{
			try
			{
				EnsureModDataDirectoryExists();
				LoadConfig();
				ApplySavedStates();
			}
			catch (Exception ex)
			{
				ManualLogSource? logger = Logger;
				if (logger != null)
				{
					logger.LogError((object)("初始化配置管理器时出错: " + ex.Message));
				}
			}
		}

		private static void EnsureModDataDirectoryExists()
		{
			try
			{
				string text = Path.Combine(Application.persistentDataPath, "REPOModData");
				if (!Directory.Exists(text))
				{
					Directory.CreateDirectory(text);
					ManualLogSource? logger = Logger;
					if (logger != null)
					{
						logger.LogInfo((object)("已创建MOD数据总文件夹: " + text));
					}
				}
				string text2 = Path.Combine(text, "MoreHead");
				if (!Directory.Exists(text2))
				{
					Directory.CreateDirectory(text2);
					ManualLogSource? logger2 = Logger;
					if (logger2 != null)
					{
						logger2.LogInfo((object)("已创建MOD特定文件夹: " + text2));
					}
				}
			}
			catch (Exception ex)
			{
				ManualLogSource? logger3 = Logger;
				if (logger3 != null)
				{
					logger3.LogError((object)("创建MOD数据目录时出错: " + ex.Message));
				}
			}
		}

		private static void LoadConfig()
		{
			try
			{
				_decorationStates.Clear();
				if (File.Exists(NewConfigFilePath) && LoadJsonConfig(NewConfigFilePath))
				{
					ManualLogSource? logger = Logger;
					if (logger != null)
					{
						logger.LogInfo((object)("已从Unity存档位置加载配置: " + NewConfigFilePath));
					}
					return;
				}
				if (File.Exists(BepInExConfigFilePath) && LoadJsonConfig(BepInExConfigFilePath))
				{
					ManualLogSource? logger2 = Logger;
					if (logger2 != null)
					{
						logger2.LogInfo((object)("已从BepInEx配置目录加载配置: " + BepInExConfigFilePath));
					}
					SaveConfigWithoutUpdate();
					ManualLogSource? logger3 = Logger;
					if (logger3 != null)
					{
						logger3.LogInfo((object)("已将配置从BepInEx目录迁移到Unity存档位置: " + NewConfigFilePath));
					}
					try
					{
						File.Delete(BepInExConfigFilePath);
						ManualLogSource? logger4 = Logger;
						if (logger4 != null)
						{
							logger4.LogInfo((object)("已删除BepInEx配置文件: " + BepInExConfigFilePath));
						}
						return;
					}
					catch (Exception ex)
					{
						ManualLogSource? logger5 = Logger;
						if (logger5 != null)
						{
							logger5.LogWarning((object)("删除BepInEx配置文件失败: " + ex.Message));
						}
						return;
					}
				}
				if (!File.Exists(OldConfigFilePath))
				{
					return;
				}
				try
				{
					string[] array = File.ReadAllLines(OldConfigFilePath);
					string[] array2 = array;
					foreach (string text in array2)
					{
						if (!string.IsNullOrWhiteSpace(text))
						{
							string[] array3 = text.Split('=');
							if (array3.Length == 2)
							{
								string key = array3[0].Trim();
								bool value = array3[1].Trim().Equals("1", StringComparison.OrdinalIgnoreCase);
								_decorationStates[key] = value;
							}
						}
					}
					if (_decorationStates.Count <= 0)
					{
						return;
					}
					ManualLogSource? logger6 = Logger;
					if (logger6 != null)
					{
						logger6.LogInfo((object)$"已从旧文本格式加载配置,包含 {_decorationStates.Count} 个装饰物状态");
					}
					SaveConfigWithoutUpdate();
					ManualLogSource? logger7 = Logger;
					if (logger7 != null)
					{
						logger7.LogInfo((object)("已将旧文本格式配置迁移到新的JSON格式: " + NewConfigFilePath));
					}
					try
					{
						File.Delete(OldConfigFilePath);
						ManualLogSource? logger8 = Logger;
						if (logger8 != null)
						{
							logger8.LogInfo((object)("已删除旧文本配置文件: " + OldConfigFilePath));
						}
					}
					catch (Exception ex2)
					{
						ManualLogSource? logger9 = Logger;
						if (logger9 != null)
						{
							logger9.LogWarning((object)("删除旧文本配置文件失败: " + ex2.Message));
						}
					}
				}
				catch (Exception ex3)
				{
					ManualLogSource? logger10 = Logger;
					if (logger10 != null)
					{
						logger10.LogError((object)("从旧文本格式加载配置时出错: " + ex3.Message));
					}
				}
			}
			catch (Exception ex4)
			{
				ManualLogSource? logger11 = Logger;
				if (logger11 != null)
				{
					logger11.LogError((object)("加载配置时出错: " + ex4.Message));
				}
				_decorationStates.Clear();
			}
		}

		private static bool LoadJsonConfig(string filePath)
		{
			//IL_0095: Expected O, but got Unknown
			try
			{
				string text = File.ReadAllText(filePath);
				Dictionary<string, bool> dictionary = JsonConvert.DeserializeObject<Dictionary<string, bool>>(text);
				if (dictionary != null)
				{
					foreach (KeyValuePair<string, bool> item in dictionary)
					{
						_decorationStates[item.Key] = item.Value;
					}
					ManualLogSource? logger = Logger;
					if (logger != null)
					{
						logger.LogInfo((object)$"已从JSON加载配置,包含 {_decorationStates.Count} 个装饰物状态");
					}
					return true;
				}
			}
			catch (JsonException val)
			{
				JsonException val2 = val;
				ManualLogSource? logger2 = Logger;
				if (logger2 != null)
				{
					logger2.LogError((object)("解析JSON配置文件时出错: " + ((Exception)(object)val2).Message));
				}
			}
			catch (Exception ex)
			{
				ManualLogSource? logger3 = Logger;
				if (logger3 != null)
				{
					logger3.LogError((object)("加载JSON配置文件时出错: " + ex.Message));
				}
			}
			return false;
		}

		public static void SaveConfig()
		{
			try
			{
				UpdateConfigData();
				SaveToFile();
			}
			catch (Exception ex)
			{
				ManualLogSource? logger = Logger;
				if (logger != null)
				{
					logger.LogError((object)("保存配置时出错: " + ex.Message));
				}
			}
		}

		private static void SaveConfigWithoutUpdate()
		{
			try
			{
				SaveToFile();
			}
			catch (Exception ex)
			{
				ManualLogSource? logger = Logger;
				if (logger != null)
				{
					logger.LogError((object)("保存配置时出错: " + ex.Message));
				}
			}
		}

		private static void SaveToFile()
		{
			try
			{
				EnsureModDataDirectoryExists();
				string contents = JsonConvert.SerializeObject((object)_decorationStates, (Formatting)1);
				File.WriteAllText(NewConfigFilePath, contents);
			}
			catch (Exception ex)
			{
				ManualLogSource? logger = Logger;
				if (logger != null)
				{
					logger.LogError((object)("写入配置文件时出错: " + ex.Message));
				}
			}
		}

		private static void UpdateConfigData()
		{
			_decorationStates.Clear();
			foreach (DecorationInfo decoration in HeadDecorationManager.Decorations)
			{
				_decorationStates[decoration.Name] = decoration.IsVisible;
			}
		}

		private static void ApplySavedStates()
		{
			try
			{
				int num = 0;
				foreach (DecorationInfo decoration in HeadDecorationManager.Decorations)
				{
					if (_decorationStates.TryGetValue(decoration.Name, out var value))
					{
						decoration.IsVisible = value;
						num++;
					}
				}
				if (num > 0)
				{
					ManualLogSource? logger = Logger;
					if (logger != null)
					{
						logger.LogInfo((object)$"已应用 {num} 个已保存的装饰物状态");
					}
				}
			}
			catch (Exception ex)
			{
				ManualLogSource? logger2 = Logger;
				if (logger2 != null)
				{
					logger2.LogError((object)("应用已保存的装饰物状态时出错: " + ex.Message));
				}
			}
		}
	}
	public static class DecorationUtils
	{
		private const string HEAD_NODE_PATH = "[RIG]/code_lean/code_tilt/ANIM BOT/_____________________________________/ANIM BODY BOT/_____________________________________/ANIM BODY TOP/code_body_top_up/code_body_top_side/_____________________________________/ANIM HEAD BOT/code_head_bot_up/code_head_bot_side/_____________________________________/ANIM HEAD TOP/code_head_top";

		private const string NECK_NODE_PATH = "[RIG]/code_lean/code_tilt/ANIM BOT/_____________________________________/ANIM BODY BOT/_____________________________________/ANIM BODY TOP/code_body_top_up/code_body_top_side/_____________________________________/ANIM HEAD BOT/code_head_bot_up/code_head_bot_side";

		private const string BODY_NODE_PATH = "[RIG]/code_lean/code_tilt/ANIM BOT/_____________________________________/ANIM BODY BOT/_____________________________________/ANIM BODY TOP/code_body_top_up/code_body_top_side/ANIM BODY TOP SCALE";

		private const string HIP_NODE_PATH = "[RIG]/code_lean/code_tilt/ANIM BOT/_____________________________________/ANIM BODY BOT";

		private const string WORLD_NODE_PATH = "[RIG]/code_lean/code_tilt/ANIM BOT";

		public static Dictionary<string, Transform> GetDecorationParentNodes(Transform rootTransform)
		{
			Dictionary<string, Transform> dictionary = new Dictionary<string, Transform>();
			Transform val = rootTransform.Find("[RIG]/code_lean/code_tilt/ANIM BOT/_____________________________________/ANIM BODY BOT/_____________________________________/ANIM BODY TOP/code_body_top_up/code_body_top_side/_____________________________________/ANIM HEAD BOT/code_head_bot_up/code_head_bot_side/_____________________________________/ANIM HEAD TOP/code_head_top");
			if ((Object)(object)val != (Object)null)
			{
				dictionary["head"] = val;
			}
			Transform val2 = rootTransform.Find("[RIG]/code_lean/code_tilt/ANIM BOT/_____________________________________/ANIM BODY BOT/_____________________________________/ANIM BODY TOP/code_body_top_up/code_body_top_side/_____________________________________/ANIM HEAD BOT/code_head_bot_up/code_head_bot_side");
			if ((Object)(object)val2 != (Object)null)
			{
				dictionary["neck"] = val2;
			}
			Transform val3 = rootTransform.Find("[RIG]/code_lean/code_tilt/ANIM BOT/_____________________________________/ANIM BODY BOT/_____________________________________/ANIM BODY TOP/code_body_top_up/code_body_top_side/ANIM BODY TOP SCALE");
			if ((Object)(object)val3 != (Object)null)
			{
				dictionary["body"] = val3;
			}
			Transform val4 = rootTransform.Find("[RIG]/code_lean/code_tilt/ANIM BOT/_____________________________________/ANIM BODY BOT");
			if ((Object)(object)val4 != (Object)null)
			{
				dictionary["hip"] = val4;
			}
			Transform val5 = rootTransform.Find("[RIG]/code_lean/code_tilt/ANIM BOT");
			if ((Object)(object)val5 != (Object)null)
			{
				if (!Object.op_Implicit((Object)(object)((Component)val5).GetComponent<WorldSpaceFollower>()))
				{
					((Component)val5).gameObject.AddComponent<WorldSpaceFollower>();
				}
				dictionary["world"] = val5;
			}
			return dictionary;
		}

		public static void EnsureDecorationContainers(Dictionary<string, Transform> parentNodes)
		{
			//IL_003b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0050: Unknown result type (might be due to invalid IL or missing references)
			//IL_005c: 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)
			foreach (KeyValuePair<string, Transform> parentNode in parentNodes)
			{
				Transform value = parentNode.Value;
				Transform val = value.Find("HeadDecorations");
				if ((Object)(object)val == (Object)null)
				{
					val = new GameObject("HeadDecorations").transform;
					val.SetParent(value, false);
					val.localPosition = Vector3.zero;
					val.localRotation = Quaternion.identity;
					val.localScale = Vector3.one;
				}
			}
		}

		public static void UpdateDecoration(Transform parent, string decorationName, bool showDecoration)
		{
			Transform val = parent.Find(decorationName);
			if ((Object)(object)val != (Object)null && ((Component)val).gameObject.activeSelf != showDecoration)
			{
				((Component)val).gameObject.SetActive(showDecoration);
			}
		}
	}
	public class WorldSpaceFollower : MonoBehaviour
	{
		private Transform? _rootTransform;

		private Vector3 _initialOffset;

		private void Start()
		{
			//IL_002a: 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_003a: 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_004a: 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)
			_rootTransform = ((Component)this).transform.parent;
			if ((Object)(object)_rootTransform != (Object)null)
			{
				_initialOffset = ((Component)this).transform.position - _rootTransform.position;
				((Component)this).transform.rotation = Quaternion.identity;
				((Component)this).transform.localScale = Vector3.one;
			}
		}

		private void LateUpdate()
		{
			//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_0029: 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_0065: Unknown result type (might be due to invalid IL or missing references)
			if ((Object)(object)_rootTransform != (Object)null)
			{
				((Component)this).transform.position = _rootTransform.position + _initialOffset;
				((Component)this).transform.rotation = Quaternion.Euler(0f, _rootTransform.eulerAngles.y, 0f);
				((Component)this).transform.localScale = Vector3.one;
			}
		}
	}
	public class DecorationInfo
	{
		public string? Name { get; set; }

		public string? DisplayName { get; set; }

		public bool IsVisible { get; set; }

		public GameObject? Prefab { get; set; }

		public string? ParentTag { get; set; }

		public string? BundlePath { get; set; }
	}
	public static class HeadDecorationManager
	{
		private static Dictionary<string?, string> parentPathMap = new Dictionary<string, string>
		{
			{ "head", "[RIG]/code_lean/code_tilt/ANIM BOT/_____________________________________/ANIM BODY BOT/_____________________________________/ANIM BODY TOP/code_body_top_up/code_body_top_side/_____________________________________/ANIM HEAD BOT/code_head_bot_up/code_head_bot_side/_____________________________________/ANIM HEAD TOP/code_head_top" },
			{ "neck", "[RIG]/code_lean/code_tilt/ANIM BOT/_____________________________________/ANIM BODY BOT/_____________________________________/ANIM BODY TOP/code_body_top_up/code_body_top_side/_____________________________________/ANIM HEAD BOT/code_head_bot_up/code_head_bot_side" },
			{ "body", "[RIG]/code_lean/code_tilt/ANIM BOT/_____________________________________/ANIM BODY BOT/_____________________________________/ANIM BODY TOP/code_body_top_up/code_body_top_side/ANIM BODY TOP SCALE" },
			{ "hip", "[RIG]/code_lean/code_tilt/ANIM BOT/_____________________________________/ANIM BODY BOT" },
			{ "world", "[RIG]/code_lean/code_tilt/ANIM BOT" }
		};

		private static ManualLogSource? Logger => Morehead.Logger;

		public static List<DecorationInfo> Decorations { get; private set; } = new List<DecorationInfo>();


		public static void Initialize()
		{
			try
			{
				ManualLogSource? logger = Logger;
				if (logger != null)
				{
					logger.LogInfo((object)"正在初始化装饰物管理器...");
				}
				Decorations.Clear();
				LoadAllDecorations();
				ManualLogSource? logger2 = Logger;
				if (logger2 != null)
				{
					logger2.LogInfo((object)$"装饰物管理器初始化完成,共加载了 {Decorations.Count} 个装饰物");
				}
			}
			catch (Exception ex)
			{
				ManualLogSource? logger3 = Logger;
				if (logger3 != null)
				{
					logger3.LogError((object)("初始化装饰物管理器时出错: " + ex.Message));
				}
			}
		}

		private static void LoadAllDecorations()
		{
			try
			{
				Morehead? instance = Morehead.Instance;
				string directoryName = Path.GetDirectoryName((instance != null) ? ((BaseUnityPlugin)instance).Info.Location : null);
				if (string.IsNullOrEmpty(directoryName))
				{
					ManualLogSource? logger = Logger;
					if (logger != null)
					{
						logger.LogError((object)"无法获取MOD所在目录");
					}
					return;
				}
				string text = Path.Combine(directoryName, "Decorations");
				if (!Directory.Exists(text))
				{
					Directory.CreateDirectory(text);
					ManualLogSource? logger2 = Logger;
					if (logger2 != null)
					{
						logger2.LogInfo((object)("已创建装饰物目录: " + text));
					}
				}
				List<string> list = new List<string>();
				string[] files = Directory.GetFiles(text, "*.hhh");
				list.AddRange(files);
				try
				{
					string pluginPath = Paths.PluginPath;
					if (!string.IsNullOrEmpty(pluginPath) && Directory.Exists(pluginPath))
					{
						string[] files2 = Directory.GetFiles(pluginPath, "*.hhh", SearchOption.AllDirectories);
						list.AddRange(files2);
						ManualLogSource? logger3 = Logger;
						if (logger3 != null)
						{
							logger3.LogInfo((object)$"在plugins目录中找到 {files2.Length} 个.hhh文件");
						}
					}
					else
					{
						ManualLogSource? logger4 = Logger;
						if (logger4 != null)
						{
							logger4.LogWarning((object)"无法找到BepInEx/plugins目录,将只加载本地装饰物");
						}
					}
				}
				catch (Exception ex)
				{
					ManualLogSource? logger5 = Logger;
					if (logger5 != null)
					{
						logger5.LogError((object)("搜索plugins目录时出错: " + ex.Message));
					}
				}
				list = list.Distinct().ToList();
				if (list.Count == 0)
				{
					ManualLogSource? logger6 = Logger;
					if (logger6 != null)
					{
						logger6.LogWarning((object)"未找到任何装饰物包文件,请确保.hhh文件已放置");
					}
				}
				else
				{
					ManualLogSource? logger7 = Logger;
					if (logger7 != null)
					{
						logger7.LogInfo((object)$"找到 {list.Count} 个装饰物包文件");
					}
					if (files.Length != 0)
					{
						ManualLogSource? logger8 = Logger;
						if (logger8 != null)
						{
							logger8.LogInfo((object)$"- Decorations目录: {files.Length} 个文件");
						}
					}
				}
				foreach (string item in list)
				{
					LoadDecorationBundle(item);
				}
			}
			catch (Exception ex2)
			{
				ManualLogSource? logger9 = Logger;
				if (logger9 != null)
				{
					logger9.LogError((object)("加载装饰物时出错: " + ex2.Message));
				}
			}
		}

		private static void LoadDecorationBundle(string bundlePath)
		{
			AssetBundle val = null;
			try
			{
				if (!File.Exists(bundlePath))
				{
					ManualLogSource? logger = Logger;
					if (logger != null)
					{
						logger.LogWarning((object)("文件不存在: " + bundlePath));
					}
					return;
				}
				FileInfo fileInfo = new FileInfo(bundlePath);
				if (fileInfo.Length < 1024)
				{
					ManualLogSource? logger2 = Logger;
					if (logger2 != null)
					{
						logger2.LogWarning((object)$"文件过小,可能不是有效的AssetBundle: {bundlePath}, 大小: {fileInfo.Length} 字节");
					}
					return;
				}
				string fileNameWithoutExtension = Path.GetFileNameWithoutExtension(bundlePath);
				string parentTag = "head";
				string text = fileNameWithoutExtension;
				if (fileNameWithoutExtension.Contains("_"))
				{
					string[] array = fileNameWithoutExtension.Split('_');
					if (array.Length >= 2)
					{
						string text2 = array[^1].ToLower();
						if (parentPathMap.ContainsKey(text2))
						{
							parentTag = text2;
							text = string.Join("_", array, 0, array.Length - 1);
						}
					}
				}
				string text3 = EnsureUniqueName(text);
				if (text3 != text)
				{
					ManualLogSource? logger3 = Logger;
					if (logger3 != null)
					{
						logger3.LogWarning((object)("检测到重名,将基础名称从 " + text + " 修改为 " + text3));
					}
					text = text3;
				}
				try
				{
					val = AssetBundle.LoadFromFile(bundlePath);
					if ((Object)(object)val == (Object)null)
					{
						ManualLogSource? logger4 = Logger;
						if (logger4 != null)
						{
							logger4.LogError((object)("无法加载AssetBundle,文件可能已损坏或不是有效的AssetBundle: " + bundlePath));
						}
						return;
					}
				}
				catch (Exception ex)
				{
					ManualLogSource? logger5 = Logger;
					if (logger5 != null)
					{
						logger5.LogError((object)("加载AssetBundle时出错,文件可能不是有效的AssetBundle: " + bundlePath + ", 错误: " + ex.Message));
					}
					return;
				}
				try
				{
					string[] allAssetNames;
					try
					{
						allAssetNames = val.GetAllAssetNames();
					}
					catch (Exception ex2)
					{
						ManualLogSource? logger6 = Logger;
						if (logger6 != null)
						{
							logger6.LogError((object)("获取AssetBundle资源名称时出错: " + bundlePath + ", 错误: " + ex2.Message));
						}
						val.Unload(true);
						return;
					}
					if (allAssetNames.Length == 0)
					{
						ManualLogSource? logger7 = Logger;
						if (logger7 != null)
						{
							logger7.LogWarning((object)("AssetBundle不包含任何资源: " + bundlePath));
						}
						val.Unload(true);
						return;
					}
					bool flag = false;
					GameObject val2 = null;
					string[] array2 = allAssetNames;
					foreach (string text4 in array2)
					{
						try
						{
							val2 = val.LoadAsset<GameObject>(text4);
							if ((Object)(object)val2 != (Object)null)
							{
								flag = true;
								break;
							}
						}
						catch (Exception ex3)
						{
							ManualLogSource? logger8 = Logger;
							if (logger8 != null)
							{
								logger8.LogWarning((object)("加载资源 " + text4 + " 时出错: " + ex3.Message));
							}
						}
					}
					if (!flag || (Object)(object)val2 == (Object)null)
					{
						ManualLogSource? logger9 = Logger;
						if (logger9 != null)
						{
							logger9.LogWarning((object)("AssetBundle不包含有效的GameObject资源: " + bundlePath));
						}
						val.Unload(true);
						return;
					}
					string text5 = ((Object)val2).name;
					string text6 = EnsureUniqueDisplayName(text5);
					if (text6 != text5)
					{
						ManualLogSource? logger10 = Logger;
						if (logger10 != null)
						{
							logger10.LogWarning((object)("检测到显示名称重复,将显示名称从 " + text5 + " 修改为 " + text6));
						}
						text5 = text6;
					}
					DecorationInfo decorationInfo = new DecorationInfo
					{
						Name = text,
						DisplayName = text5,
						IsVisible = false,
						Prefab = val2,
						ParentTag = parentTag,
						BundlePath = bundlePath
					};
					Decorations.Add(decorationInfo);
					ManualLogSource? logger11 = Logger;
					if (logger11 != null)
					{
						logger11.LogInfo((object)("成功加载装饰物: " + decorationInfo.DisplayName + ", 标签: " + decorationInfo.ParentTag));
					}
					val.Unload(false);
				}
				catch (Exception ex4)
				{
					ManualLogSource? logger12 = Logger;
					if (logger12 != null)
					{
						logger12.LogError((object)("处理AssetBundle时出错: " + ex4.Message));
					}
					if ((Object)(object)val != (Object)null)
					{
						val.Unload(true);
					}
				}
			}
			catch (Exception ex5)
			{
				ManualLogSource? logger13 = Logger;
				if (logger13 != null)
				{
					logger13.LogError((object)("加载装饰物包时出错: " + ex5.Message + ", 路径: " + bundlePath));
				}
				if ((Object)(object)val != (Object)null)
				{
					val.Unload(true);
				}
			}
		}

		private static string EnsureUniqueName(string baseName)
		{
			string name = baseName;
			int num = 1;
			while (Decorations.Any((DecorationInfo d) => d.Name != null && d.Name.Equals(name, StringComparison.OrdinalIgnoreCase)))
			{
				name = $"{baseName}({num})";
				num++;
			}
			return name;
		}

		private static string EnsureUniqueDisplayName(string baseDisplayName)
		{
			string displayName = baseDisplayName;
			int num = 1;
			while (Decorations.Any((DecorationInfo d) => d.DisplayName != null && d.DisplayName.Equals(displayName, StringComparison.OrdinalIgnoreCase)))
			{
				displayName = $"{baseDisplayName}({num})";
				num++;
			}
			return displayName;
		}

		private static string? GetParentTagFromPrefab(GameObject prefab)
		{
			string text = ((Object)prefab).name.ToLower();
			foreach (string key in parentPathMap.Keys)
			{
				if (key != null && text.Contains(key))
				{
					return key;
				}
			}
			return null;
		}

		public static bool GetDecorationState(string? name)
		{
			string name2 = name;
			DecorationInfo decorationInfo = Decorations.FirstOrDefault((DecorationInfo d) => d.Name != null && d.Name.Equals(name2, StringComparison.OrdinalIgnoreCase));
			if (decorationInfo == null)
			{
				ManualLogSource? logger = Logger;
				if (logger != null)
				{
					logger.LogWarning((object)("GetDecorationState: 找不到装饰物 " + name2));
				}
			}
			return decorationInfo?.IsVisible ?? false;
		}

		public static void SetDecorationState(string name, bool isVisible)
		{
			string name2 = name;
			DecorationInfo decorationInfo = Decorations.FirstOrDefault((DecorationInfo d) => d.Name != null && d.Name.Equals(name2, StringComparison.OrdinalIgnoreCase));
			if (decorationInfo != null)
			{
				decorationInfo.IsVisible = isVisible;
				ManualLogSource? logger = Logger;
				if (logger != null)
				{
					logger.LogInfo((object)$"设置装饰物 {decorationInfo.DisplayName} 显示状态为: {isVisible}");
				}
			}
			else
			{
				ManualLogSource? logger2 = Logger;
				if (logger2 != null)
				{
					logger2.LogWarning((object)("SetDecorationState: 找不到装饰物 " + name2));
				}
			}
		}

		public static bool ToggleDecorationState(string? name)
		{
			string name2 = name;
			DecorationInfo decorationInfo = Decorations.FirstOrDefault((DecorationInfo d) => d.Name != null && d.Name.Equals(name2, StringComparison.OrdinalIgnoreCase));
			if (decorationInfo != null)
			{
				decorationInfo.IsVisible = !decorationInfo.IsVisible;
				return decorationInfo.IsVisible;
			}
			ManualLogSource? logger = Logger;
			if (logger != null)
			{
				logger.LogWarning((object)("ToggleDecorationState: 找不到装饰物 " + name2));
			}
			return false;
		}

		public static string GetParentPath(string parentTag)
		{
			if (parentPathMap.TryGetValue(parentTag.ToLower(), out string value))
			{
				return value;
			}
			return parentPathMap["head"];
		}

		public static void DisableAllDecorations()
		{
			try
			{
				int num = 0;
				foreach (DecorationInfo decoration in Decorations)
				{
					if (decoration.IsVisible)
					{
						decoration.IsVisible = false;
						num++;
					}
				}
			}
			catch (Exception ex)
			{
				ManualLogSource? logger = Logger;
				if (logger != null)
				{
					logger.LogError((object)("关闭所有装饰物时出错: " + ex.Message));
				}
			}
		}
	}
	public static class MoreHeadUI
	{
		private static REPOButton? menuButton;

		private static REPOPopupPage? decorationsPage;

		private static Dictionary<string?, REPOButton> decorationButtons = new Dictionary<string, REPOButton>();

		private static string currentTagFilter = "ALL";

		private static Dictionary<string, REPOButton> tagFilterButtons = new Dictionary<string, REPOButton>();

		private static Dictionary<string, REPOPopupPage?> tagPageCache = new Dictionary<string, REPOPopupPage>();

		private static Dictionary<string, Dictionary<string, REPOButton>> tagPageButtonCache = new Dictionary<string, Dictionary<string, REPOButton>>();

		private const string BUTTON_NAME = "<color=#FF0000>M</color><color=#FF3300>O</color><color=#FF6600>R</color><color=#FF9900>E</color><color=#FFCC00>H</color><color=#FFDD00>E</color><color=#FFEE00>A</color><color=#FFFF00>D</color>";

		private const string PAGE_TITLE = "Rotate robot: A/D";

		private static readonly string[] ALL_TAGS = new string[6] { "ALL", "HEAD", "NECK", "BODY", "HIP", "WORLD" };

		private static ManualLogSource? Logger => Morehead.Logger;

		public static void Initialize()
		{
			//IL_0013: Unknown result type (might be due to invalid IL or missing references)
			//IL_001d: Expected O, but got Unknown
			//IL_002c: 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_0052: Expected O, but got Unknown
			try
			{
				menuButton = new REPOButton("<color=#FF0000>M</color><color=#FF3300>O</color><color=#FF6600>R</color><color=#FF9900>E</color><color=#FFCC00>H</color><color=#FFDD00>E</color><color=#FFEE00>A</color><color=#FFFF00>D</color>", (Action)OnMenuButtonClick);
				MenuAPI.AddElementToEscapeMenu((REPOElement)(object)menuButton, new Vector2(0f, 0f));
				decorationsPage = new REPOPopupPage("Rotate robot: A/D", (Action<REPOPopupPage>)SetupPopupPage);
				PreCreateTagPages();
			}
			catch (Exception ex)
			{
				ManualLogSource? logger = Logger;
				if (logger != null)
				{
					logger.LogError((object)("初始化UI时出错: " + ex.Message));
				}
			}
		}

		private static void PreCreateTagPages()
		{
			//IL_002e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0034: Expected O, but got Unknown
			try
			{
				tagPageCache.Clear();
				string[] aLL_TAGS = ALL_TAGS;
				foreach (string text in aLL_TAGS)
				{
					REPOPopupPage val = new REPOPopupPage("Rotate robot: A/D", (Action<REPOPopupPage>)SetupPopupPage);
					string text2 = currentTagFilter;
					currentTagFilter = text;
					CreatePageContentForTag(val, text);
					tagPageCache[text] = val;
					currentTagFilter = text2;
				}
			}
			catch (Exception ex)
			{
				ManualLogSource? logger = Logger;
				if (logger != null)
				{
					logger.LogError((object)("预创建标签页面缓存时出错: " + ex.Message));
				}
			}
		}

		private static void SetupPopupPage(REPOPopupPage page)
		{
			//IL_000d: 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)
			try
			{
				page.SetSize(new Vector2(300f, 350f));
				page.SetBackgroundDimming(true);
				page.SetMaskPadding((Padding?)new Padding(10f, 50f, 20f, 10f));
				AddAuthorCredit(page);
			}
			catch (Exception ex)
			{
				ManualLogSource? logger = Logger;
				if (logger != null)
				{
					logger.LogError((object)("设置弹出页面属性时出错: " + ex.Message));
				}
			}
		}

		private static void AddAuthorCredit(REPOPopupPage page)
		{
			//IL_0026: Unknown result type (might be due to invalid IL or missing references)
			//IL_002c: Expected O, but got Unknown
			//IL_0038: Unknown result type (might be due to invalid IL or missing references)
			try
			{
				REPOButton val = new REPOButton("<size=10><color=#FFFFA0>Masaicker</color> and <color=#FFFFA0>Yuriscat</color> co-developed.\n由<color=#FFFFA0>马赛克了</color>和<color=#FFFFA0>尤里的猫</color>共同制作。</size>", (Action)delegate
				{
				});
				((REPOSimplePage)page).AddElementToPage((REPOElement)(object)val, new Vector2(300f, 345f));
				try
				{
					MenuManager obj = Object.FindObjectOfType<MenuManager>();
					if (obj != null)
					{
						((MonoBehaviour)obj).StartCoroutine(DelayedStyleAuthorCredit(val));
					}
				}
				catch (Exception ex)
				{
					ManualLogSource? logger = Logger;
					if (logger != null)
					{
						logger.LogWarning((object)("无法修改作者标记样式: " + ex.Message));
					}
				}
			}
			catch (Exception ex2)
			{
				ManualLogSource? logger2 = Logger;
				if (logger2 != null)
				{
					logger2.LogError((object)("添加作者标记时出错: " + ex2.Message));
				}
			}
		}

		private static IEnumerator DelayedStyleAuthorCredit(REPOButton button)
		{
			yield return null;
			try
			{
				GameObject buttonObj = null;
				Button[] allButtons = Object.FindObjectsOfType<Button>();
				Button[] array = allButtons;
				foreach (Button btn in array)
				{
					if (((Object)btn).name.Contains("Masaicker") && ((Object)btn).name.Contains("Yuriscat"))
					{
						buttonObj = ((Component)btn).gameObject;
						break;
					}
				}
				if (!((Object)(object)buttonObj != (Object)null))
				{
					yield break;
				}
				Button buttonComponent = buttonObj.GetComponent<Button>();
				if (!((Object)(object)buttonComponent != (Object)null))
				{
					yield break;
				}
				((Selectable)buttonComponent).interactable = false;
				Image[] images = buttonObj.GetComponentsInChildren<Image>();
				Image[] array2 = images;
				foreach (Image image in array2)
				{
					if ((Object)(object)((Component)image).gameObject != (Object)(object)((Component)buttonComponent).gameObject)
					{
						((Behaviour)image).enabled = false;
					}
				}
			}
			catch (Exception e)
			{
				ManualLogSource? logger = Logger;
				if (logger != null)
				{
					logger.LogWarning((object)("修改作者标记样式失败: " + e.Message));
				}
			}
		}

		private static void OnMenuButtonClick()
		{
			//IL_0033: Unknown result type (might be due to invalid IL or missing references)
			//IL_003d: Expected O, but got Unknown
			try
			{
				if (tagPageCache.TryGetValue(currentTagFilter, out REPOPopupPage value))
				{
					decorationsPage = value;
				}
				else
				{
					decorationsPage = new REPOPopupPage("Rotate robot: A/D", (Action<REPOPopupPage>)SetupPopupPage);
					CreatePageContent();
				}
				REPOPopupPage? obj = decorationsPage;
				if (obj != null)
				{
					((REPOSimplePage)obj).OpenPage(false);
				}
				SetHeaderPosition();
				MovePlayerAvatarToFront();
				AdjustMenuScrollBoxPosition();
				UpdateButtonStates();
			}
			catch (Exception ex)
			{
				ManualLogSource? logger = Logger;
				if (logger != null)
				{
					logger.LogError((object)("打开设置页面时出错: " + ex.Message));
				}
			}
		}

		private static void SetHeaderPosition()
		{
			try
			{
				MonoBehaviour obj = Object.FindObjectOfType<MonoBehaviour>();
				if (obj != null)
				{
					obj.StartCoroutine(DelayedSetHeaderPosition());
				}
			}
			catch (Exception ex)
			{
				ManualLogSource? logger = Logger;
				if (logger != null)
				{
					logger.LogError((object)("设置标题位置时出错: " + ex.Message));
				}
			}
		}

		private static IEnumerator DelayedSetHeaderPosition()
		{
			yield return null;
			try
			{
				FieldInfo headerTransformField = typeof(REPOPopupPage).GetField("headerTransform", BindingFlags.Instance | BindingFlags.NonPublic);
				if (headerTransformField != null)
				{
					object? value = headerTransformField.GetValue(decorationsPage);
					RectTransform headerTransform = (RectTransform)((value is RectTransform) ? value : null);
					if ((Object)(object)headerTransform != (Object)null)
					{
						((Transform)headerTransform).localPosition = new Vector3(185.5049f, 360f, 0f);
						yield break;
					}
					ManualLogSource? logger = Logger;
					if (logger != null)
					{
						logger.LogWarning((object)"headerTransform为空");
					}
				}
				else
				{
					ManualLogSource? logger2 = Logger;
					if (logger2 != null)
					{
						logger2.LogWarning((object)"找不到headerTransform字段");
					}
				}
			}
			catch (Exception e)
			{
				ManualLogSource? logger3 = Logger;
				if (logger3 != null)
				{
					logger3.LogError((object)("延迟设置标题位置时出错: " + e.Message));
				}
			}
		}

		private static void CreatePageContent()
		{
			CreatePageContentForTag(decorationsPage, currentTagFilter);
		}

		private static void CreatePageContentForTag(REPOPopupPage? page, string tag)
		{
			//IL_0183: Unknown result type (might be due to invalid IL or missing references)
			//IL_0189: Expected O, but got Unknown
			//IL_019a: Unknown result type (might be due to invalid IL or missing references)
			//IL_01b6: Unknown result type (might be due to invalid IL or missing references)
			//IL_01bc: Expected O, but got Unknown
			//IL_00d2: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d9: Expected O, but got Unknown
			//IL_01cd: 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)
			try
			{
				int num = 0;
				decorationButtons.Clear();
				if (!tagPageButtonCache.ContainsKey(tag))
				{
					tagPageButtonCache[tag] = new Dictionary<string, REPOButton>();
				}
				else
				{
					tagPageButtonCache[tag].Clear();
				}
				for (int i = 0; i < HeadDecorationManager.Decorations.Count; i++)
				{
					DecorationInfo decoration = HeadDecorationManager.Decorations[i];
					if (tag == "ALL" || decoration.ParentTag?.ToLower() == tag.ToLower())
					{
						REPOButton val = new REPOButton(GetButtonText(decoration, decoration.IsVisible), (Action)delegate
						{
							OnDecorationButtonClick(decoration.Name);
						});
						int num2 = -(60 + num * 20);
						if (page != null)
						{
							page.AddElementToScrollView((REPOElement)(object)val, new Vector2(0f, (float)num2));
						}
						decorationButtons[decoration.Name ?? string.Empty] = val;
						tagPageButtonCache[tag][decoration.Name ?? string.Empty] = val;
						num++;
					}
				}
				CreateTagFilterButtons(page);
				REPOButton val2 = new REPOButton("<size=18><color=#FFFFFF>C</color><color=#E6E6E6>L</color><color=#CCCCCC>O</color><color=#B3B3B3>S</color><color=#999999>E</color></size>", (Action)OnCloseButtonClick);
				if (page != null)
				{
					((REPOSimplePage)page).AddElementToPage((REPOElement)(object)val2, new Vector2(301f, 0f));
				}
				REPOButton val3 = new REPOButton("<size=18><color=#FFAA00>CLEAR ALL</color></size>", (Action)OnDisableAllButtonClick);
				if (page != null)
				{
					((REPOSimplePage)page).AddElementToPage((REPOElement)(object)val3, new Vector2(401f, 0f));
				}
			}
			catch (Exception ex)
			{
				ManualLogSource? logger = Logger;
				if (logger != null)
				{
					logger.LogError((object)("创建页面内容时出错: " + ex.Message));
				}
			}
		}

		private static void CreateTagFilterButtons(REPOPopupPage? page)
		{
			//IL_0146: Unknown result type (might be due to invalid IL or missing references)
			//IL_014d: Expected O, but got Unknown
			//IL_0166: Unknown result type (might be due to invalid IL or missing references)
			try
			{
				tagFilterButtons.Clear();
				for (int i = 0; i < ALL_TAGS.Length; i++)
				{
					string text = ALL_TAGS[i];
					string text2 = text.ToLower();
					if (1 == 0)
					{
					}
					string text3 = text2 switch
					{
						"head" => "#00AAFF", 
						"neck" => "#AA00FF", 
						"body" => "#FFAA00", 
						"hip" => "#FF00AA", 
						"world" => "#00FFAA", 
						_ => "#FFFFFF", 
					};
					if (1 == 0)
					{
					}
					string text4 = text3;
					string text5 = ((text2 == currentTagFilter.ToLower()) ? ("<size=14><b><color=" + text4 + ">" + text + "</color></b></size>") : ("<size=14><color=" + text4 + "50>" + text + "</color></size>"));
					string tagForCallback = ((text2 == "all") ? "ALL" : text);
					REPOButton val = new REPOButton(text5, (Action)delegate
					{
						OnTagFilterButtonClick(tagForCallback);
					});
					int num = 70 + i * 40;
					if (page != null)
					{
						((REPOSimplePage)page).AddElementToPage((REPOElement)(object)val, new Vector2((float)num, 20f));
					}
					tagFilterButtons[tagForCallback] = val;
				}
			}
			catch (Exception ex)
			{
				ManualLogSource? logger = Logger;
				if (logger != null)
				{
					logger.LogError((object)("创建标签筛选按钮时出错: " + ex.Message));
				}
			}
		}

		private static void OnTagFilterButtonClick(string tag)
		{
			//IL_005c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0066: Expected O, but got Unknown
			try
			{
				if (!(tag == currentTagFilter))
				{
					currentTagFilter = tag;
					REPOPopupPage? obj = decorationsPage;
					if (obj != null)
					{
						((REPOSimplePage)obj).ClosePage(true);
					}
					if (tagPageCache.TryGetValue(tag, out REPOPopupPage value))
					{
						decorationsPage = value;
					}
					else
					{
						decorationsPage = new REPOPopupPage("Rotate robot: A/D", (Action<REPOPopupPage>)SetupPopupPage);
						CreatePageContent();
						tagPageCache[tag] = decorationsPage;
					}
					REPOPopupPage? obj2 = decorationsPage;
					if (obj2 != null)
					{
						((REPOSimplePage)obj2).OpenPage(false);
					}
					SetHeaderPosition();
					MovePlayerAvatarToFront();
					AdjustMenuScrollBoxPosition();
					UpdateButtonStates();
				}
			}
			catch (Exception ex)
			{
				ManualLogSource? logger = Logger;
				if (logger != null)
				{
					logger.LogError((object)("切换标签筛选时出错: " + ex.Message));
				}
			}
		}

		private static void UpdateButtonStates()
		{
			try
			{
				if (decorationButtons.Count == 0)
				{
					return;
				}
				foreach (DecorationInfo decoration in HeadDecorationManager.Decorations)
				{
					if ((currentTagFilter == "ALL" || decoration.ParentTag?.ToLower() == currentTagFilter.ToLower()) && decorationButtons.TryGetValue(decoration.Name ?? string.Empty, out REPOButton value))
					{
						value.SetText(GetButtonText(decoration, decoration.IsVisible));
					}
				}
				UpdateTagButtonHighlights();
			}
			catch (Exception ex)
			{
				ManualLogSource? logger = Logger;
				if (logger != null)
				{
					logger.LogError((object)("更新按钮状态时出错: " + ex.Message));
				}
			}
		}

		private static void UpdateTagButtonHighlights()
		{
			try
			{
				string[] aLL_TAGS = ALL_TAGS;
				foreach (string text in aLL_TAGS)
				{
					string text2 = ((text == "ALL") ? "ALL" : text);
					if (tagFilterButtons.TryGetValue(text2, out REPOButton value))
					{
						string text3 = text.ToLower();
						if (1 == 0)
						{
						}
						string text4 = text3 switch
						{
							"head" => "#00AAFF", 
							"neck" => "#AA00FF", 
							"body" => "#FFAA00", 
							"hip" => "#FF00AA", 
							"world" => "#00FFAA", 
							_ => "#FFFFFF", 
						};
						if (1 == 0)
						{
						}
						string text5 = text4;
						string text6 = ((text2 == currentTagFilter) ? ("<size=14><b><color=" + text5 + ">" + text + "</color></b></size>") : ("<size=14><color=" + text5 + "50>" + text + "</color></size>"));
						value.SetText(text6);
					}
				}
			}
			catch (Exception ex)
			{
				ManualLogSource? logger = Logger;
				if (logger != null)
				{
					logger.LogError((object)("更新标签按钮高亮状态时出错: " + ex.Message));
				}
			}
		}

		private static void OnDecorationButtonClick(string? decorationName)
		{
			string decorationName2 = decorationName;
			try
			{
				DecorationInfo decorationInfo = HeadDecorationManager.Decorations.FirstOrDefault((DecorationInfo d) => d.Name != null && d.Name.Equals(decorationName2, StringComparison.OrdinalIgnoreCase));
				if (decorationInfo == null)
				{
					ManualLogSource? logger = Logger;
					if (logger != null)
					{
						logger.LogWarning((object)("OnDecorationButtonClick: 找不到装饰物: " + decorationName2));
					}
					return;
				}
				bool isEnabled = HeadDecorationManager.ToggleDecorationState(decorationName2);
				foreach (KeyValuePair<string, Dictionary<string, REPOButton>> item in tagPageButtonCache)
				{
					string key = item.Key;
					Dictionary<string, REPOButton> value = item.Value;
					if ((key == "ALL" || decorationInfo.ParentTag?.ToLower() == key.ToLower()) && value.TryGetValue(decorationName2 ?? string.Empty, out var value2))
					{
						value2.SetText(GetButtonText(decorationInfo, isEnabled));
					}
				}
				UpdateDecorations();
				ConfigManager.SaveConfig();
			}
			catch (Exception ex)
			{
				ManualLogSource? logger2 = Logger;
				if (logger2 != null)
				{
					logger2.LogError((object)("切换装饰物 " + decorationName2 + " 状态时出错: " + ex.Message));
				}
			}
		}

		private static string GetButtonText(DecorationInfo decoration, bool isEnabled)
		{
			string text = decoration.DisplayName?.ToUpper() ?? "UNKNOWN";
			string text2 = decoration.ParentTag ?? "unknown";
			string text3 = text2.ToLower();
			if (1 == 0)
			{
			}
			string text4 = text3 switch
			{
				"head" => "#00AAFF", 
				"neck" => "#AA00FF", 
				"body" => "#FFAA00", 
				"hip" => "#FF00AA", 
				"world" => "#00FFAA", 
				_ => "#AAAAAA", 
			};
			if (1 == 0)
			{
			}
			string text5 = text4;
			return "<size=16>" + (isEnabled ? "<color=#00FF00>[+]</color>" : "<color=#FF0000>[-]</color>") + " <color=" + text5 + "><size=12>(" + text2 + ")</size></color> " + text + "</size>";
		}

		private static void OnCloseButtonClick()
		{
			try
			{
				MenuManager.instance.PageCloseAll();
			}
			catch (Exception ex)
			{
				ManualLogSource? logger = Logger;
				if (logger != null)
				{
					logger.LogError((object)("关闭页面时出错: " + ex.Message));
				}
			}
		}

		private static void UpdateDecorations()
		{
			try
			{
				PlayerAvatar val = FindLocalPlayer();
				if ((Object)(object)val != (Object)null)
				{
					PlayerUpdatePatch.UpdatePlayerDecorations(val);
					HeadDecorationSync component = ((Component)val).GetComponent<HeadDecorationSync>();
					if ((Object)(object)component != (Object)null)
					{
						component.SyncAllDecorations();
					}
				}
				PlayerUpdatePatch.UpdateMenuPlayerDecorations();
			}
			catch (Exception ex)
			{
				ManualLogSource? logger = Logger;
				if (logger != null)
				{
					logger.LogError((object)("更新装饰物状态时出错: " + ex.Message));
				}
			}
		}

		private static PlayerAvatar? FindLocalPlayer()
		{
			try
			{
				PlayerAvatar[] array = Object.FindObjectsOfType<PlayerAvatar>();
				PlayerAvatar[] array2 = array;
				foreach (PlayerAvatar val in array2)
				{
					if ((Object)(object)val?.photonView != (Object)null && val.photonView.IsMine)
					{
						return val;
					}
				}
			}
			catch (Exception ex)
			{
				ManualLogSource? logger = Logger;
				if (logger != null)
				{
					logger.LogError((object)("查找本地玩家时出错: " + ex.Message));
				}
			}
			return null;
		}

		private static void MovePlayerAvatarToFront()
		{
			try
			{
				MonoBehaviour obj = Object.FindObjectOfType<MonoBehaviour>();
				if (obj != null)
				{
					obj.StartCoroutine(DelayedMovePlayerAvatarToFront());
				}
			}
			catch (Exception ex)
			{
				ManualLogSource? logger = Logger;
				if (logger != null)
				{
					logger.LogError((object)("移动玩家模型时出错: " + ex.Message));
				}
			}
		}

		private static IEnumerator DelayedMovePlayerAvatarToFront()
		{
			yield return null;
			try
			{
				PlayerAvatarMenuHover playerAvatarHover = Object.FindObjectOfType<PlayerAvatarMenuHover>();
				GameObject playerAvatarObj = null;
				if ((Object)(object)playerAvatarHover != (Object)null)
				{
					playerAvatarObj = ((Component)((Component)playerAvatarHover).transform.parent).gameObject;
					if (((Object)playerAvatarObj).name != "Menu Element Player Avatar")
					{
						playerAvatarObj = null;
					}
				}
				if ((Object)(object)playerAvatarObj == (Object)null)
				{
					playerAvatarObj = GameObject.Find("Menu Element Player Avatar");
				}
				if ((Object)(object)playerAvatarObj != (Object)null)
				{
					object? value = AccessTools.Field(typeof(REPOPopupPage), "menuPage").GetValue(decorationsPage);
					MenuPage menuPage = (MenuPage)((value is MenuPage) ? value : null);
					if ((Object)(object)menuPage != (Object)null)
					{
						playerAvatarObj.transform.SetParent(((Component)menuPage).transform, true);
						playerAvatarObj.transform.SetAsLastSibling();
						playerAvatarObj.transform.localPosition = new Vector3(-76f, -30f, 0f);
					}
				}
				else
				{
					ManualLogSource? logger = Logger;
					if (logger != null)
					{
						logger.LogWarning((object)"找不到玩家模型对象");
					}
				}
			}
			catch (Exception e)
			{
				ManualLogSource? logger2 = Logger;
				if (logger2 != null)
				{
					logger2.LogError((object)("延迟移动玩家模型时出错: " + e.Message));
				}
			}
		}

		private static void AdjustMenuScrollBoxPosition()
		{
			try
			{
				MonoBehaviour obj = Object.FindObjectOfType<MonoBehaviour>();
				if (obj != null)
				{
					obj.StartCoroutine(DelayedAdjustMenuScrollBoxPosition());
				}
			}
			catch (Exception ex)
			{
				ManualLogSource? logger = Logger;
				if (logger != null)
				{
					logger.LogError((object)("调整MenuScrollBox位置时出错: " + ex.Message));
				}
			}
		}

		private static IEnumerator DelayedAdjustMenuScrollBoxPosition()
		{
			yield return null;
			yield return null;
			try
			{
				object? value = AccessTools.Field(typeof(REPOPopupPage), "menuScrollBox").GetValue(decorationsPage);
				MenuScrollBox menuScrollBox = (MenuScrollBox)((value is MenuScrollBox) ? value : null);
				if ((Object)(object)menuScrollBox != (Object)null)
				{
					RectTransform rectTransform = ((Component)menuScrollBox).GetComponent<RectTransform>();
					if ((Object)(object)rectTransform != (Object)null)
					{
						Vector3 currentPosition2 = ((Transform)rectTransform).localPosition;
						Vector3 newPosition2 = new Vector3(currentPosition2.x, currentPosition2.y + 20f, currentPosition2.z);
						((Transform)rectTransform).localPosition = newPosition2;
						yield break;
					}
					ManualLogSource? logger = Logger;
					if (logger != null)
					{
						logger.LogWarning((object)"无法获取MenuScrollBox的RectTransform组件");
					}
					yield break;
				}
				ManualLogSource? logger2 = Logger;
				if (logger2 != null)
				{
					logger2.LogWarning((object)"无法获取MenuScrollBox组件");
				}
				object? value2 = AccessTools.Field(typeof(REPOPopupPage), "menuPage").GetValue(decorationsPage);
				MenuPage menuPage = (MenuPage)((value2 is MenuPage) ? value2 : null);
				if (!((Object)(object)menuPage != (Object)null))
				{
					yield break;
				}
				ManualLogSource? logger3 = Logger;
				if (logger3 != null)
				{
					logger3.LogInfo((object)"成功获取MenuPage组件,尝试查找MenuScrollBox");
				}
				foreach (Transform item in ((Component)menuPage).transform)
				{
					Transform child = item;
					ManualLogSource? logger4 = Logger;
					if (logger4 != null)
					{
						logger4.LogInfo((object)("找到子对象: " + ((Object)child).name));
					}
					if (!((Object)child).name.Contains("ScrollBox") && !((Object)(object)((Component)child).GetComponent<MenuScrollBox>() != (Object)null))
					{
						continue;
					}
					RectTransform scrollBoxTransform = (RectTransform)(object)((child is RectTransform) ? child : null);
					if ((Object)(object)scrollBoxTransform != (Object)null)
					{
						Vector3 currentPosition = ((Transform)scrollBoxTransform).localPosition;
						Vector3 newPosition = (((Transform)scrollBoxTransform).localPosition = new Vector3(currentPosition.x, currentPosition.y + 20f, currentPosition.z));
						ManualLogSource? logger5 = Logger;
						if (logger5 != null)
						{
							logger5.LogInfo((object)$"通过替代方法调整MenuScrollBox位置: 从 {currentPosition} 到 {newPosition}");
						}
					}
					break;
				}
			}
			catch (Exception e)
			{
				ManualLogSource? logger6 = Logger;
				if (logger6 != null)
				{
					logger6.LogError((object)("调整MenuScrollBox位置时出错: " + e.Message + "\n" + e.StackTrace));
				}
			}
		}

		private static void OnDisableAllButtonClick()
		{
			try
			{
				HeadDecorationManager.DisableAllDecorations();
				foreach (DecorationInfo decoration in HeadDecorationManager.Decorations)
				{
					foreach (KeyValuePair<string, Dictionary<string, REPOButton>> item in tagPageButtonCache)
					{
						string key = item.Key;
						Dictionary<string, REPOButton> value = item.Value;
						if ((key == "ALL" || decoration.ParentTag?.ToLower() == key.ToLower()) && value.TryGetValue(decoration.Name ?? string.Empty, out var value2))
						{
							value2.SetText(GetButtonText(decoration, isEnabled: false));
						}
					}
				}
				UpdateDecorations();
				ConfigManager.SaveConfig();
			}
			catch (Exception ex)
			{
				ManualLogSource? logger = Logger;
				if (logger != null)
				{
					logger.LogError((object)("关闭所有装饰物时出错: " + ex.Message));
				}
			}
		}
	}
}