Decompiled source of Dakotas Hats v1.1.0

Dakota's hats/Dakotahats.dll

Decompiled 2 weeks ago
using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using BepInEx;
using BepInEx.Configuration;
using BepInEx.Logging;
using HarmonyLib;
using MenuLib;
using MenuLib.MonoBehaviors;
using MenuLib.Structs;
using Microsoft.CodeAnalysis;
using MoreHead;
using Newtonsoft.Json;
using Photon.Pun;
using TMPro;
using UnityEngine;

[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("YMC_MHZ")]
[assembly: AssemblyConfiguration("Debug")]
[assembly: AssemblyCopyright("Copyright © 2025")]
[assembly: AssemblyDescription("一个简单好玩的装饰模组,提供unitypackage,供玩家自行导入模型。")]
[assembly: AssemblyFileVersion("1.3.9.0")]
[assembly: AssemblyInformationalVersion("1.3.9+25faefb2e5f0c84e2b9564d63c147f71d30303b0")]
[assembly: AssemblyProduct("MoreHead")]
[assembly: AssemblyTitle("MoreHead")]
[assembly: AssemblyVersion("1.3.9.0")]
[module: RefSafetyRules(11)]
namespace Microsoft.CodeAnalysis
{
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	internal sealed class EmbeddedAttribute : Attribute
	{
	}
}
namespace System.Runtime.CompilerServices
{
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	[AttributeUsage(AttributeTargets.Class | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Parameter | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter, AllowMultiple = false, Inherited = false)]
	internal sealed class NullableAttribute : Attribute
	{
		public readonly byte[] NullableFlags;

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

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

		public NullableContextAttribute(byte P_0)
		{
			Flag = P_0;
		}
	}
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	[AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)]
	internal sealed class RefSafetyRulesAttribute : Attribute
	{
		public readonly int Version;

		public RefSafetyRulesAttribute(int P_0)
		{
			Version = P_0;
		}
	}
}
[BepInPlugin("Mhz.REPOMoreHead", "MoreHead", "1.3.9")]
public class Morehead : BaseUnityPlugin
{
	private const string PluginGuid = "Mhz.REPOMoreHead";

	private const string PluginName = "MoreHead";

	private const string PluginVersion = "1.3.9";

	public static ManualLogSource? Logger;

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

	public static string GetPluginVersion()
	{
		return "1.3.9";
	}

	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));
			val.PatchAll(typeof(MenuManagerStartPatch));
			val.PatchAll(typeof(MenuButtonHoveringPatch));
			val.PatchAll(typeof(MenuButtonHoverEndPatch));
			val.PatchAll(typeof(MenuPageStateSetPatch));
			string text = "\n\n ███▄ ▄███▓ ▒█████   ██▀███  ▓█████  ██░ ██ ▓█████ ▄▄▄      ▓█████▄ \n▓██▒▀█▀ ██▒▒██▒  ██▒▓██ ▒ ██▒▓█   ▀ ▓██░ ██▒▓█   ▀▒████▄    ▒██▀ ██▌\n▓██    ▓██░▒██░  ██▒▓██ ░▄█ ▒▒███   ▒██▀███░▒███  ▒██  ▀█▄  ░██   █▌\n▒██    ▒██ ▒██   ██░▒███▀█▄  ▒▓█  ▄ ░▓█ ░██ ▒▓█  ▄░██▄▄▄▄██ ░▓█▄   ▌\n▒██▒   ░██▒░ ████▓▒░░██▓ ▒██▒░▒████▒░▓█▒░██▓░▒████▒▓█   ▓██▒░▒████▓   v1.3.9\n░ ▒░   ░  ░░ ▒░▒░▒░ ░ ▒▓ ░▒▓░░░ ▒░ ░ ▒ ░░▒░▒░░ ▒░ ░▒▒   ▓▒█░ ▒▒▓  ▒ \n░  ░      ░  ░ ▒ ▒░   ░▒ ░ ▒░ ░ ░  ░ ▒ ░▒░ ░ ░ ░  ░ ▒   ▒▒ ░ ░ ▒  ▒ \n░      ░   ░ ░ ░ ▒    ░░   ░    ░    ░  ░░ ░   ░    ░   ▒    ░ ░  ░ \n       ░       ░ ░     ░        ░  ░ ░  ░  ░   ░  ░     ░  ░   ░    \n";
			ManualLogSource? logger = Logger;
			if (logger != null)
			{
				logger.LogMessage((object)text);
			}
			HeadDecorationManager.Initialize();
			ConfigManager.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(MenuManager))]
[HarmonyPatch("Start")]
internal class MenuManagerStartPatch
{
	[HarmonyPostfix]
	private static void Postfix()
	{
		try
		{
			if ((Object)(object)MenuManager.instance != (Object)null && MenuManager.instance.menuPages != null && MenuManager.instance.menuPages.Count > 0)
			{
				MoreHeadUI.Initialize();
				MoreHeadUI.InitializeShortcutListener();
				return;
			}
			ManualLogSource? logger = Morehead.Logger;
			if (logger != null)
			{
				logger.LogWarning((object)"MenuManager未准备好,无法初始化UI");
			}
		}
		catch (Exception arg)
		{
			ManualLogSource? logger2 = Morehead.Logger;
			if (logger2 != null)
			{
				logger2.LogError((object)$"在MenuManager.Start补丁中初始化UI时出错: {arg}");
			}
		}
	}
}
[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
{
	[CompilerGenerated]
	private sealed class <DelayedSync>d__1 : IEnumerator<object>, IEnumerator, IDisposable
	{
		private int <>1__state;

		private object <>2__current;

		public PlayerAvatar playerAvatar;

		private Exception <e>5__1;

		private HeadDecorationSync <syncComponent>5__2;

		private Exception <e>5__3;

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

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

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

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

		private bool MoveNext()
		{
			//IL_0051: Unknown result type (might be due to invalid IL or missing references)
			//IL_005b: Expected O, but got Unknown
			//IL_00b3: Unknown result type (might be due to invalid IL or missing references)
			//IL_00bd: Expected O, but got Unknown
			switch (<>1__state)
			{
			default:
				return false;
			case 0:
				<>1__state = -1;
				<>2__current = null;
				<>1__state = 1;
				return true;
			case 1:
				<>1__state = -1;
				<>2__current = (object)new WaitForSeconds(0.2f);
				<>1__state = 2;
				return true;
			case 2:
				<>1__state = -1;
				try
				{
					PlayerUpdatePatch.UpdatePlayerDecorations(playerAvatar);
				}
				catch (Exception ex)
				{
					<e>5__1 = ex;
					ManualLogSource? logger3 = Morehead.Logger;
					if (logger3 != null)
					{
						logger3.LogError((object)("更新玩家装饰物状态失败: " + <e>5__1.Message));
					}
				}
				<>2__current = (object)new WaitForSeconds(0.1f);
				<>1__state = 3;
				return true;
			case 3:
				<>1__state = -1;
				try
				{
					<syncComponent>5__2 = ((Component)playerAvatar).GetComponent<HeadDecorationSync>();
					if ((Object)(object)<syncComponent>5__2 != (Object)null)
					{
						<syncComponent>5__2.SyncAllDecorations();
					}
					else
					{
						ManualLogSource? logger = Morehead.Logger;
						if (logger != null)
						{
							logger.LogWarning((object)"玩家复活后找不到HeadDecorationSync组件");
						}
					}
					<syncComponent>5__2 = null;
				}
				catch (Exception ex)
				{
					<e>5__3 = ex;
					ManualLogSource? logger2 = Morehead.Logger;
					if (logger2 != null)
					{
						logger2.LogError((object)("同步装饰物状态失败: " + <e>5__3.Message));
					}
				}
				return false;
			}
		}

		bool IEnumerator.MoveNext()
		{
			//ILSpy generated this explicit interface implementation from .override directive in MoveNext
			return this.MoveNext();
		}

		[DebuggerHidden]
		void IEnumerator.Reset()
		{
			throw new NotSupportedException();
		}
	}

	private static 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));
			}
		}
	}

	[IteratorStateMachine(typeof(<DelayedSync>d__1))]
	private static IEnumerator DelayedSync(PlayerAvatar playerAvatar)
	{
		//yield-return decompiler failed: Unexpected instruction in Iterator.Dispose()
		return new <DelayedSync>d__1(0)
		{
			playerAvatar = playerAvatar
		};
	}
}
public class DecorationButtonMarker : MonoBehaviour
{
	public DecorationInfo? Decoration { get; set; }

	public bool HasHandledHover { get; set; }
}
[HarmonyPatch(typeof(MenuButton))]
[HarmonyPatch("OnHovering")]
internal class MenuButtonHoveringPatch
{
	[HarmonyPostfix]
	private static void Postfix(MenuButton __instance)
	{
		try
		{
			if ((Object)(object)__instance == (Object)null || (Object)(object)((Component)__instance).gameObject == (Object)null || !((Component)__instance).gameObject.activeInHierarchy)
			{
				return;
			}
			DecorationButtonMarker decorationButtonMarker = null;
			try
			{
				foreach (DecorationButtonMarker value2 in MoreHeadUI.buttonMarkers.Values)
				{
					if ((Object)(object)value2 != (Object)null && (Object)(object)((Component)value2).gameObject != (Object)null && (Object)(object)((Component)value2).gameObject == (Object)(object)((Component)__instance).gameObject)
					{
						decorationButtonMarker = value2;
						break;
					}
				}
			}
			catch (Exception)
			{
				return;
			}
			if ((Object)(object)decorationButtonMarker == (Object)null || decorationButtonMarker.Decoration == null || decorationButtonMarker.HasHandledHover)
			{
				return;
			}
			DecorationInfo decoration = decorationButtonMarker.Decoration;
			if (string.IsNullOrEmpty(decoration.ModName))
			{
				return;
			}
			if (MoreHeadUI.decorationButtons.TryGetValue(decoration.Name ?? string.Empty, out REPOButton value))
			{
				if ((Object)(object)value == (Object)null || (Object)(object)value.labelTMP == (Object)null)
				{
					return;
				}
				if (!((TMP_Text)value.labelTMP).text.Contains(decoration.ModName))
				{
					((TMP_Text)value.labelTMP).text = ((TMP_Text)value.labelTMP).text + " <size=12><color=#AAAAAA>- " + decoration.ModName + "</color></size>";
				}
			}
			decorationButtonMarker.HasHandledHover = true;
		}
		catch (Exception ex2)
		{
			ManualLogSource? logger = Morehead.Logger;
			if (logger != null)
			{
				logger.LogError((object)("MenuButton.OnHovering补丁出错: " + ex2.Message + "\n" + ex2.StackTrace));
			}
		}
	}
}
[HarmonyPatch(typeof(MenuButton))]
[HarmonyPatch("OnHoverEnd")]
internal class MenuButtonHoverEndPatch
{
	[HarmonyPostfix]
	private static void Postfix(MenuButton __instance)
	{
		try
		{
			if ((Object)(object)__instance == (Object)null || (Object)(object)((Component)__instance).gameObject == (Object)null || !((Component)__instance).gameObject.activeInHierarchy)
			{
				return;
			}
			DecorationButtonMarker decorationButtonMarker = null;
			try
			{
				foreach (DecorationButtonMarker value3 in MoreHeadUI.buttonMarkers.Values)
				{
					if ((Object)(object)value3 != (Object)null && (Object)(object)((Component)value3).gameObject != (Object)null && (Object)(object)((Component)value3).gameObject == (Object)(object)((Component)__instance).gameObject)
					{
						decorationButtonMarker = value3;
						break;
					}
				}
			}
			catch (Exception)
			{
				return;
			}
			if ((Object)(object)decorationButtonMarker == (Object)null || decorationButtonMarker.Decoration == null)
			{
				return;
			}
			DecorationInfo decoration = decorationButtonMarker.Decoration;
			if (string.IsNullOrEmpty(decoration.ModName))
			{
				return;
			}
			if (MoreHeadUI.decorationButtons.TryGetValue(decoration.Name ?? string.Empty, out REPOButton value))
			{
				if ((Object)(object)value == (Object)null || (Object)(object)value.labelTMP == (Object)null)
				{
					return;
				}
				string text = ((TMP_Text)value.labelTMP).text;
				string value2 = " <size=12><color=#AAAAAA>- " + decoration.ModName + "</color></size>";
				int num = text.IndexOf(value2);
				if (num != -1)
				{
					((TMP_Text)value.labelTMP).text = text.Substring(0, num).TrimEnd();
				}
			}
			decorationButtonMarker.HasHandledHover = false;
		}
		catch (Exception ex2)
		{
			ManualLogSource? logger = Morehead.Logger;
			if (logger != null)
			{
				logger.LogError((object)("MenuButton.OnHoverEnd补丁出错: " + ex2.Message + "\n" + ex2.StackTrace));
			}
		}
	}
}
[HarmonyPatch(typeof(MenuPage))]
[HarmonyPatch("PageStateSet")]
internal class MenuPageStateSetPatch
{
	[HarmonyPostfix]
	private static void Postfix(MenuPage __instance, PageState pageState)
	{
		//IL_0002: Unknown result type (might be due to invalid IL or missing references)
		//IL_0004: Invalid comparison between Unknown and I4
		//IL_0006: Unknown result type (might be due to invalid IL or missing references)
		//IL_0008: Invalid comparison between Unknown and I4
		try
		{
			if (((int)pageState == 2 || (int)pageState == 3) && (Object)(object)MoreHeadUI.decorationsPage != (Object)null && (Object)(object)__instance == (Object)(object)MoreHeadUI.decorationsPage.menuPage)
			{
				MoreHeadUI.SafeDestroyAvatar();
			}
		}
		catch (Exception ex)
		{
			ManualLogSource? logger = Morehead.Logger;
			if (logger != null)
			{
				logger.LogError((object)("MenuPage.PageStateSet补丁出错: " + ex.Message + "\n" + ex.StackTrace));
			}
		}
	}
}
namespace MoreHead
{
	public static class ConfigManager
	{
		private class ConfigData
		{
			public Dictionary<int, Dictionary<string, bool>> OutfitStates { get; set; } = new Dictionary<int, Dictionary<string, bool>>();


			public int CurrentOutfitIndex { get; set; } = 1;

		}

		private const string MOD_DATA_FOLDER = "REPOModData";

		private const string MOD_FOLDER = "MoreHead";

		private const string CONFIG_FILENAME = "MoreHeadConfig.json";

		private const string OUTFIT_CONFIG_FILENAME = "MoreHeadOutfits.json";

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

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

		private static ManualLogSource? Logger => Morehead.Logger;

		public static int CurrentOutfitIndex { get; private set; } = 1;


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

		private static string OutfitConfigFilePath => Path.Combine(Application.persistentDataPath, "REPOModData", "MoreHead", "MoreHeadOutfits.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();
				InitializeOutfitStates();
				LoadConfig();
				ApplyOutfit(CurrentOutfitIndex);
			}
			catch (Exception ex)
			{
				ManualLogSource? logger = Logger;
				if (logger != null)
				{
					logger.LogError((object)("初始化配置管理器时出错: " + ex.Message));
				}
			}
		}

		private static void InitializeOutfitStates()
		{
			for (int i = 1; i <= 5; i++)
			{
				if (!_outfitStates.ContainsKey(i))
				{
					_outfitStates[i] = new Dictionary<string, bool>();
				}
			}
		}

		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();
				LoadOutfitConfig();
				if (File.Exists(NewConfigFilePath) && LoadJsonConfig(NewConfigFilePath))
				{
					if (_outfitStates[1].Count == 0)
					{
						_outfitStates[1] = new Dictionary<string, bool>(_decorationStates);
						SaveOutfitConfig();
						ManualLogSource? logger = Logger;
						if (logger != null)
						{
							logger.LogInfo((object)"已将单套配置迁移到第1套装备方案");
						}
					}
					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));
					}
					if (_outfitStates[1].Count == 0)
					{
						_outfitStates[1] = new Dictionary<string, bool>(_decorationStates);
						SaveOutfitConfig();
						ManualLogSource? logger4 = Logger;
						if (logger4 != null)
						{
							logger4.LogInfo((object)"已将单套配置迁移到第1套装备方案");
						}
					}
					try
					{
						File.Delete(BepInExConfigFilePath);
						ManualLogSource? logger5 = Logger;
						if (logger5 != null)
						{
							logger5.LogInfo((object)("已删除BepInEx配置文件: " + BepInExConfigFilePath));
						}
						return;
					}
					catch (Exception ex)
					{
						ManualLogSource? logger6 = Logger;
						if (logger6 != null)
						{
							logger6.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? logger7 = Logger;
					if (logger7 != null)
					{
						logger7.LogInfo((object)$"已从旧文本格式加载配置,包含 {_decorationStates.Count} 个装饰物状态");
					}
					SaveConfigWithoutUpdate();
					ManualLogSource? logger8 = Logger;
					if (logger8 != null)
					{
						logger8.LogInfo((object)("已将旧文本格式配置迁移到新的JSON格式: " + NewConfigFilePath));
					}
					if (_outfitStates[1].Count == 0)
					{
						_outfitStates[1] = new Dictionary<string, bool>(_decorationStates);
						SaveOutfitConfig();
						ManualLogSource? logger9 = Logger;
						if (logger9 != null)
						{
							logger9.LogInfo((object)"已将单套配置迁移到第1套装备方案");
						}
					}
					try
					{
						File.Delete(OldConfigFilePath);
						ManualLogSource? logger10 = Logger;
						if (logger10 != null)
						{
							logger10.LogInfo((object)("已删除旧文本配置文件: " + OldConfigFilePath));
						}
					}
					catch (Exception ex2)
					{
						ManualLogSource? logger11 = Logger;
						if (logger11 != null)
						{
							logger11.LogWarning((object)("删除旧文本配置文件失败: " + ex2.Message));
						}
					}
				}
				catch (Exception ex3)
				{
					ManualLogSource? logger12 = Logger;
					if (logger12 != null)
					{
						logger12.LogError((object)("从旧文本格式加载配置时出错: " + ex3.Message));
					}
				}
			}
			catch (Exception ex4)
			{
				ManualLogSource? logger13 = Logger;
				if (logger13 != null)
				{
					logger13.LogError((object)("加载配置时出错: " + ex4.Message));
				}
				_decorationStates.Clear();
			}
		}

		private static void LoadOutfitConfig()
		{
			try
			{
				InitializeOutfitStates();
				if (File.Exists(OutfitConfigFilePath))
				{
					string text = File.ReadAllText(OutfitConfigFilePath);
					ConfigData configData = JsonConvert.DeserializeObject<ConfigData>(text);
					if (configData != null)
					{
						_outfitStates.Clear();
						foreach (KeyValuePair<int, Dictionary<string, bool>> outfitState in configData.OutfitStates)
						{
							_outfitStates[outfitState.Key] = new Dictionary<string, bool>();
							foreach (KeyValuePair<string, bool> item in outfitState.Value)
							{
								_outfitStates[outfitState.Key][item.Key] = item.Value;
							}
						}
						CurrentOutfitIndex = configData.CurrentOutfitIndex;
						if (CurrentOutfitIndex < 1 || CurrentOutfitIndex > 5)
						{
							CurrentOutfitIndex = 1;
						}
						return;
					}
				}
				InitializeOutfitStates();
			}
			catch (Exception ex)
			{
				ManualLogSource? logger = Logger;
				if (logger != null)
				{
					logger.LogError((object)("加载多套装备方案配置时出错: " + ex.Message));
				}
				InitializeOutfitStates();
			}
		}

		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();
				SaveCurrentOutfit();
			}
			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 SaveOutfitConfig()
		{
			try
			{
				EnsureModDataDirectoryExists();
				ConfigData configData = new ConfigData
				{
					OutfitStates = new Dictionary<int, Dictionary<string, bool>>(),
					CurrentOutfitIndex = CurrentOutfitIndex
				};
				foreach (KeyValuePair<int, Dictionary<string, bool>> outfitState in _outfitStates)
				{
					configData.OutfitStates[outfitState.Key] = new Dictionary<string, bool>();
					foreach (KeyValuePair<string, bool> item in outfitState.Value)
					{
						if (item.Key != null)
						{
							configData.OutfitStates[outfitState.Key][item.Key] = item.Value;
						}
					}
				}
				string contents = JsonConvert.SerializeObject((object)configData, (Formatting)1);
				File.WriteAllText(OutfitConfigFilePath, 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;
			}
		}

		public 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 void SwitchOutfit(int outfitIndex)
		{
			if (outfitIndex < 1 || outfitIndex > 5)
			{
				ManualLogSource? logger = Logger;
				if (logger != null)
				{
					logger.LogWarning((object)$"无效的装备方案索引: {outfitIndex},索引应在1-5之间");
				}
				return;
			}
			try
			{
				SaveCurrentOutfitState();
				CurrentOutfitIndex = outfitIndex;
				ApplyOutfit(outfitIndex);
				SaveAllConfigs();
			}
			catch (Exception ex)
			{
				ManualLogSource? logger2 = Logger;
				if (logger2 != null)
				{
					logger2.LogError((object)("切换装备方案时出错: " + ex.Message));
				}
			}
		}

		private static void SaveCurrentOutfitState()
		{
			try
			{
				if (CurrentOutfitIndex < 1 || CurrentOutfitIndex > 5)
				{
					ManualLogSource? logger = Logger;
					if (logger != null)
					{
						logger.LogWarning((object)$"无效的当前装备方案索引: {CurrentOutfitIndex},重置为1");
					}
					CurrentOutfitIndex = 1;
				}
				Dictionary<string, bool> dictionary = new Dictionary<string, bool>();
				foreach (DecorationInfo decoration in HeadDecorationManager.Decorations)
				{
					dictionary[decoration.Name] = decoration.IsVisible;
				}
				_outfitStates[CurrentOutfitIndex] = dictionary;
			}
			catch (Exception ex)
			{
				ManualLogSource? logger2 = Logger;
				if (logger2 != null)
				{
					logger2.LogError((object)("保存当前装备状态到方案时出错: " + ex.Message));
				}
			}
		}

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

		private static void ApplyOutfit(int outfitIndex)
		{
			try
			{
				if (!_outfitStates.TryGetValue(outfitIndex, out Dictionary<string, bool> value))
				{
					ManualLogSource? logger = Logger;
					if (logger != null)
					{
						logger.LogWarning((object)$"找不到装备方案 {outfitIndex},使用空方案");
					}
					value = new Dictionary<string, bool>();
					_outfitStates[outfitIndex] = value;
				}
				int num = 0;
				foreach (DecorationInfo decoration in HeadDecorationManager.Decorations)
				{
					decoration.IsVisible = false;
				}
				foreach (DecorationInfo decoration2 in HeadDecorationManager.Decorations)
				{
					if (value.TryGetValue(decoration2.Name, out var value2))
					{
						decoration2.IsVisible = value2;
						num++;
					}
				}
			}
			catch (Exception ex)
			{
				ManualLogSource? logger2 = Logger;
				if (logger2 != null)
				{
					logger2.LogError((object)("应用装备方案时出错: " + ex.Message));
				}
			}
		}

		public static void SaveCurrentOutfit()
		{
			try
			{
				SaveCurrentOutfitState();
				SaveOutfitConfig();
			}
			catch (Exception ex)
			{
				ManualLogSource? logger = Logger;
				if (logger != null)
				{
					logger.LogError((object)("保存当前装备状态到方案时出错: " + ex.Message));
				}
			}
		}

		public static int GetCurrentOutfitIndex()
		{
			return CurrentOutfitIndex;
		}
	}
	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 LEFT_ARM_NODE_PATH = "[RIG]/code_lean/code_tilt/ANIM BOT/_____________________________________/ANIM BODY BOT/_____________________________________/ANIM BODY TOP/code_body_top_up/code_body_top_side/_____________________________________/ANIM ARM L/code_arm_l";

		private const string RIGHT_ARM_NODE_PATH = "[RIG]/code_lean/code_tilt/ANIM BOT/_____________________________________/ANIM BODY BOT/_____________________________________/ANIM BODY TOP/code_body_top_up/code_body_top_side/_____________________________________/ANIM ARM R/code_arm_r_parent/code_arm_r/ANIM ARM R SCALE";

		private const string LEFT_LEG_NODE_PATH = "[RIG]/code_lean/code_tilt/ANIM BOT/code_leg_twist/_____________________________________/ANIM LEG L BOT/_____________________________________/ANIM LEG L TOP";

		private const string RIGHT_LEG_NODE_PATH = "[RIG]/code_lean/code_tilt/ANIM BOT/code_leg_twist/_____________________________________/ANIM LEG R BOT/_____________________________________/ANIM LEG R TOP";

		public static Dictionary<string, Transform> GetDecorationParentNodes(Transform rootTransform)
		{
			//IL_0211: Unknown result type (might be due to invalid IL or missing references)
			//IL_0218: Expected O, but got Unknown
			//IL_022e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0240: Unknown result type (might be due to invalid IL or missing references)
			//IL_0252: Unknown result type (might be due to invalid IL or missing references)
			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/_____________________________________/ANIM BODY BOT/_____________________________________/ANIM BODY TOP/code_body_top_up/code_body_top_side/_____________________________________/ANIM ARM L/code_arm_l");
			if ((Object)(object)val5 != (Object)null)
			{
				dictionary["leftarm"] = val5;
			}
			Transform val6 = rootTransform.Find("[RIG]/code_lean/code_tilt/ANIM BOT/_____________________________________/ANIM BODY BOT/_____________________________________/ANIM BODY TOP/code_body_top_up/code_body_top_side/_____________________________________/ANIM ARM R/code_arm_r_parent/code_arm_r/ANIM ARM R SCALE");
			if ((Object)(object)val6 != (Object)null)
			{
				dictionary["rightarm"] = val6;
			}
			Transform val7 = rootTransform.Find("[RIG]/code_lean/code_tilt/ANIM BOT/code_leg_twist/_____________________________________/ANIM LEG L BOT/_____________________________________/ANIM LEG L TOP");
			if ((Object)(object)val7 != (Object)null)
			{
				dictionary["leftleg"] = val7;
			}
			Transform val8 = rootTransform.Find("[RIG]/code_lean/code_tilt/ANIM BOT/code_leg_twist/_____________________________________/ANIM LEG R BOT/_____________________________________/ANIM LEG R TOP");
			if ((Object)(object)val8 != (Object)null)
			{
				dictionary["rightleg"] = val8;
			}
			if ((Object)(object)rootTransform != (Object)null)
			{
				bool flag = false;
				PlayerAvatar componentInChildren = ((Component)rootTransform.parent).GetComponentInChildren<PlayerAvatar>();
				if ((Object)(object)componentInChildren != (Object)null)
				{
					flag = !SemiFunc.IsMultiplayer() || ((Object)(object)componentInChildren.photonView != (Object)null && componentInChildren.photonView.IsMine);
				}
				Transform val9 = rootTransform.Find("WorldDecorationFollower");
				if ((Object)(object)val9 != (Object)null)
				{
					if (flag)
					{
						((Component)val9).gameObject.SetActive(false);
					}
					else
					{
						((Component)val9).gameObject.SetActive(true);
					}
					dictionary["world"] = val9;
				}
				else
				{
					GameObject val10 = new GameObject("WorldDecorationFollower");
					val10.transform.SetParent(rootTransform, false);
					val10.transform.localPosition = Vector3.zero;
					val10.transform.localRotation = Quaternion.identity;
					val10.transform.localScale = Vector3.one;
					val10.AddComponent<WorldSpaceFollower>();
					if (flag)
					{
						val10.SetActive(false);
					}
					else
					{
						val10.SetActive(true);
					}
					dictionary["world"] = val10.transform;
				}
			}
			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 string? ModName { get; set; }
	}
	public static class HeadDecorationManager
	{
		private static ConfigEntry<bool>? _enableVerboseLogging;

		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" },
			{ "leftarm", "[RIG]/code_lean/code_tilt/ANIM BOT/_____________________________________/ANIM BODY BOT/_____________________________________/ANIM BODY TOP/code_body_top_up/code_body_top_side/_____________________________________/ANIM ARM L/code_arm_l" },
			{ "rightarm", "[RIG]/code_lean/code_tilt/ANIM BOT/_____________________________________/ANIM BODY BOT/_____________________________________/ANIM BODY TOP/code_body_top_up/code_body_top_side/_____________________________________/ANIM ARM R/code_arm_r_parent/code_arm_r/ANIM ARM R SCALE" },
			{ "leftleg", "[RIG]/code_lean/code_tilt/ANIM BOT/code_leg_twist/_____________________________________/ANIM LEG L BOT/_____________________________________/ANIM LEG L TOP" },
			{ "rightleg", "[RIG]/code_lean/code_tilt/ANIM BOT/code_leg_twist/_____________________________________/ANIM LEG R BOT/_____________________________________/ANIM LEG R TOP" },
			{ "world", "" }
		};

		private static Dictionary<string, List<DecorationInfo>> externalDecorations = new Dictionary<string, List<DecorationInfo>>();

		private static ManualLogSource? Logger => Morehead.Logger;

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


		public static void Initialize()
		{
			try
			{
				Morehead? instance = Morehead.Instance;
				_enableVerboseLogging = ((instance != null) ? ((BaseUnityPlugin)instance).Config.Bind<bool>("Logging", "EnableVerboseLogging", true, "启用模型加载日志(默认开启) Enable model loading logs (default: on)") : null);
				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);
					}
					else
					{
						ManualLogSource? logger3 = Logger;
						if (logger3 != null)
						{
							logger3.LogWarning((object)"无法找到BepInEx/plugins目录,将只加载本地装饰物");
						}
					}
				}
				catch (Exception ex)
				{
					ManualLogSource? logger4 = Logger;
					if (logger4 != null)
					{
						logger4.LogError((object)("搜索plugins目录时出错: " + ex.Message));
					}
				}
				list = list.Distinct().ToList();
				if (list.Count == 0)
				{
					ManualLogSource? logger5 = Logger;
					if (logger5 != null)
					{
						logger5.LogWarning((object)"未找到任何装饰物包文件,请确保.hhh文件已放置");
					}
				}
				foreach (string item in list)
				{
					LoadDecorationBundle(item);
				}
			}
			catch (Exception ex2)
			{
				ManualLogSource? logger6 = Logger;
				if (logger6 != null)
				{
					logger6.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,
						ModName = GetModNameFromPath(bundlePath)
					};
					Decorations.Add(decorationInfo);
					ConfigEntry<bool>? enableVerboseLogging = _enableVerboseLogging;
					if (enableVerboseLogging == null || enableVerboseLogging.Value)
					{
						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 bool LoadExternalAssetBundle(byte[] bundleData, string resourceName)
		{
			try
			{
				string text = Path.Combine(Path.GetTempPath(), resourceName);
				File.WriteAllBytes(text, bundleData);
				LoadDecorationBundle(text);
				try
				{
					File.Delete(text);
				}
				catch (Exception ex)
				{
					ManualLogSource? logger = Logger;
					if (logger != null)
					{
						logger.LogWarning((object)("清理临时文件失败: " + ex.Message));
					}
				}
				return true;
			}
			catch (Exception ex2)
			{
				ManualLogSource? logger2 = Logger;
				if (logger2 != null)
				{
					logger2.LogError((object)("加载外部AB包失败: " + ex2.Message));
				}
				return false;
			}
		}

		public static void LoadExternalAssetBundlesFromAssembly(Assembly assembly)
		{
			try
			{
				int num = 0;
				string name2 = assembly.GetName().Name;
				string location = assembly.Location;
				string fileName = Path.GetFileName(location);
				if (!externalDecorations.ContainsKey(name2))
				{
					externalDecorations[name2] = new List<DecorationInfo>();
				}
				else
				{
					externalDecorations[name2].Clear();
				}
				int count = Decorations.Count;
				string[] manifestResourceNames = assembly.GetManifestResourceNames();
				IEnumerable<string> enumerable = manifestResourceNames.Where((string name) => name.EndsWith(".hhh", StringComparison.OrdinalIgnoreCase));
				if (!enumerable.Any())
				{
					ManualLogSource? logger = Logger;
					if (logger != null)
					{
						logger.LogWarning((object)("在DLL " + name2 + " 中未找到.hhh资源"));
					}
					return;
				}
				ManualLogSource? logger2 = Logger;
				if (logger2 != null)
				{
					logger2.LogInfo((object)$"在DLL {name2} 中找到 {enumerable.Count()} 个.hhh资源");
				}
				foreach (string item in enumerable)
				{
					try
					{
						string text = item.Substring(0, item.Length - 4);
						string text2 = ((!text.Contains(".")) ? text : text.Split('.').Last());
						ManualLogSource? logger3 = Logger;
						if (logger3 != null)
						{
							logger3.LogInfo((object)("处理资源: " + item + ", 提取文件名: " + text2));
						}
						byte[] array;
						using (Stream stream = assembly.GetManifestResourceStream(item))
						{
							if (stream == null)
							{
								continue;
							}
							array = new byte[stream.Length];
							stream.Read(array, 0, array.Length);
							goto IL_01bc;
						}
						IL_01bc:
						if (LoadExternalAssetBundle(array, text2 + ".hhh"))
						{
							num++;
						}
					}
					catch (Exception ex)
					{
						ManualLogSource? logger4 = Logger;
						if (logger4 != null)
						{
							logger4.LogError((object)("加载资源 " + item + " 失败: " + ex.Message));
						}
					}
				}
				if (num > 0)
				{
					for (int i = count; i < Decorations.Count; i++)
					{
						DecorationInfo decorationInfo = Decorations[i];
						decorationInfo.ModName = fileName;
						externalDecorations[name2].Add(decorationInfo);
					}
					ManualLogSource? logger5 = Logger;
					if (logger5 != null)
					{
						logger5.LogInfo((object)$"成功从DLL {name2} 加载了 {num} 个资源,已保存到外部装饰物记录中");
					}
					ConfigManager.ApplySavedStates();
				}
			}
			catch (Exception ex2)
			{
				ManualLogSource? logger6 = Logger;
				if (logger6 != null)
				{
					logger6.LogError((object)("从DLL加载资源失败: " + ex2.Message));
				}
			}
		}

		public static List<DecorationInfo> GetDecorationsFromAssembly(Assembly assembly)
		{
			string name = assembly.GetName().Name;
			if (externalDecorations.TryGetValue(name, out List<DecorationInfo> value))
			{
				return value;
			}
			return new List<DecorationInfo>();
		}

		public static List<GameObject> GetDecorationGameObjectsFromAssembly(Assembly assembly)
		{
			List<GameObject> list = new List<GameObject>();
			foreach (DecorationInfo item in GetDecorationsFromAssembly(assembly))
			{
				if ((Object)(object)item.Prefab != (Object)null)
				{
					list.Add(item.Prefab);
				}
			}
			return list;
		}

		public static DecorationInfo GetDecorationByName(Assembly assembly, string decorationName)
		{
			string decorationName2 = decorationName;
			List<DecorationInfo> decorationsFromAssembly = GetDecorationsFromAssembly(assembly);
			return decorationsFromAssembly.FirstOrDefault((DecorationInfo d) => (d.Name != null && d.Name.Equals(decorationName2, StringComparison.OrdinalIgnoreCase)) || (d.DisplayName != null && d.DisplayName.Equals(decorationName2, StringComparison.OrdinalIgnoreCase)));
		}

		public static List<DecorationInfo> FindDecorationsByPartialName(Assembly assembly, string partialName)
		{
			string partialName2 = partialName;
			if (string.IsNullOrEmpty(partialName2))
			{
				return new List<DecorationInfo>();
			}
			List<DecorationInfo> decorationsFromAssembly = GetDecorationsFromAssembly(assembly);
			return decorationsFromAssembly.Where((DecorationInfo d) => (d.Name != null && d.Name.IndexOf(partialName2, StringComparison.OrdinalIgnoreCase) >= 0) || (d.DisplayName != null && d.DisplayName.IndexOf(partialName2, StringComparison.OrdinalIgnoreCase) >= 0)).ToList();
		}

		public static void RecreateUI()
		{
			try
			{
				MoreHeadUI.RecreateUI();
			}
			catch (Exception ex)
			{
				ManualLogSource? logger = Logger;
				if (logger != null)
				{
					logger.LogError((object)("重新创建UI时出错: " + ex.Message));
				}
			}
		}

		private static string? GetModNameFromPath(string? bundlePath)
		{
			try
			{
				if (string.IsNullOrEmpty(bundlePath))
				{
					return null;
				}
				string pluginPath = Paths.PluginPath;
				if (string.IsNullOrEmpty(pluginPath) || !Directory.Exists(pluginPath))
				{
					return null;
				}
				if (!bundlePath.StartsWith(pluginPath, StringComparison.OrdinalIgnoreCase))
				{
					return null;
				}
				string directoryName = Path.GetDirectoryName(bundlePath);
				if (string.IsNullOrEmpty(directoryName))
				{
					return null;
				}
				string text = directoryName;
				while (!string.IsNullOrEmpty(text))
				{
					DirectoryInfo? parent = Directory.GetParent(text);
					if (parent == null || parent.FullName.Equals(pluginPath, StringComparison.OrdinalIgnoreCase))
					{
						break;
					}
					text = Directory.GetParent(text)?.FullName ?? string.Empty;
				}
				if (string.IsNullOrEmpty(text))
				{
					return null;
				}
				string fileName = Path.GetFileName(text);
				string[] array = fileName.Split('-');
				if (array.Length <= 1)
				{
					return fileName;
				}
				string text2 = array[^1];
				bool flag = IsLikelyVersionNumber(text2);
				if (flag && array.Length > 2)
				{
					return array[^2];
				}
				if (flag)
				{
					return array[0];
				}
				return text2;
			}
			catch (Exception ex)
			{
				ManualLogSource? logger = Morehead.Logger;
				if (logger != null)
				{
					logger.LogError((object)("获取模组名称时出错: " + ex.Message));
				}
				return null;
			}
		}

		private static bool IsLikelyVersionNumber(string text)
		{
			if (text.Length == 0 || !char.IsDigit(text[0]))
			{
				return false;
			}
			bool flag = false;
			bool flag2 = false;
			foreach (char c in text)
			{
				if (char.IsDigit(c))
				{
					flag = true;
				}
				else if (c == '.' || c == '_' || c == '-')
				{
					flag2 = true;
				}
			}
			return flag && flag2;
		}
	}
	public static class MoreHeadUI
	{
		private class ShortcutKeyListener : MonoBehaviour
		{
			public static ShortcutKeyListener? Instance { get; private set; }

			private void Awake()
			{
				if ((Object)(object)Instance != (Object)null && (Object)(object)Instance != (Object)(object)this)
				{
					Object.Destroy((Object)(object)((Component)this).gameObject);
					return;
				}
				Instance = this;
				Object.DontDestroyOnLoad((Object)(object)((Component)this).gameObject);
			}

			private void OnDestroy()
			{
				if ((Object)(object)Instance == (Object)(object)this)
				{
					Instance = null;
				}
			}

			private void Update()
			{
				//IL_000f: Unknown result type (might be due to invalid IL or missing references)
				//IL_0010: Unknown result type (might be due to invalid IL or missing references)
				for (int i = 1; i <= 5; i++)
				{
					KeyCode val = (KeyCode)(282 + (i - 1));
					if (Input.GetKeyDown(val))
					{
						SwitchOutfitWithShortcut(i);
					}
				}
			}
		}

		[Serializable]
		[CompilerGenerated]
		private sealed class <>c
		{
			public static readonly <>c <>9 = new <>c();

			public static BuilderDelegate <>9__17_0;

			public static BuilderDelegate <>9__17_1;

			public static Func<DecorationInfo, bool> <>9__18_0;

			public static Action <>9__22_1;

			public static BuilderDelegate <>9__22_0;

			public static BuilderDelegate <>9__34_0;

			public static Func<DecorationInfo, bool> <>9__38_0;

			public static Func<DecorationInfo, string> <>9__38_1;

			public static Func<DecorationInfo, bool> <>9__38_2;

			public static Func<DecorationInfo, string> <>9__38_3;

			public static BuilderDelegate <>9__40_0;

			public static BuilderDelegate <>9__40_1;

			internal void <Initialize>b__17_0(Transform parent)
			{
				//IL_0022: Unknown result type (might be due to invalid IL or missing references)
				MenuAPI.CreateREPOButton("<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, parent, Vector2.zero);
			}

			internal void <Initialize>b__17_1(Transform parent)
			{
				//IL_0022: Unknown result type (might be due to invalid IL or missing references)
				MenuAPI.CreateREPOButton("<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, parent, Vector2.zero);
			}

			internal bool <InitializeDataCache>b__18_0(DecorationInfo decoration)
			{
				return LIMB_TAGS.Contains(decoration.ParentTag?.ToUpper());
			}

			internal void <AddAuthorCredit>b__22_0(Transform parent)
			{
				//IL_0030: Unknown result type (might be due to invalid IL or missing references)
				MenuAPI.CreateREPOButton("<size=10><color=#FFFFA0>Masaicker</color> and <color=#FFFFA0>Yuriscat</color> co-developed.\n由<color=#FFFFA0>马赛克了</color>和<color=#FFFFA0>尤里的猫</color>共同制作。</size>", (Action)delegate
				{
				}, parent, new Vector2(300f, 329f));
			}

			internal void <AddAuthorCredit>b__22_1()
			{
			}

			internal void <CreateAvatarPreview>b__34_0(Transform parent)
			{
				//IL_000c: Unknown result type (might be due to invalid IL or missing references)
				avatarPreview = MenuAPI.CreateREPOAvatarPreview(parent, new Vector2(420f, 10f), false, (Color?)null);
			}

			internal bool <CreateAllDecorationButtons>b__38_0(DecorationInfo decoration)
			{
				return IsBuiltInDecoration(decoration);
			}

			internal string <CreateAllDecorationButtons>b__38_1(DecorationInfo decoration)
			{
				return decoration.DisplayName;
			}

			internal bool <CreateAllDecorationButtons>b__38_2(DecorationInfo decoration)
			{
				return !IsBuiltInDecoration(decoration);
			}

			internal string <CreateAllDecorationButtons>b__38_3(DecorationInfo decoration)
			{
				return decoration.DisplayName;
			}

			internal void <AddActionButtons>b__40_0(Transform parent)
			{
				//IL_002c: Unknown result type (might be due to invalid IL or missing references)
				MenuAPI.CreateREPOButton("<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, parent, new Vector2(301f, 0f));
			}

			internal void <AddActionButtons>b__40_1(Transform parent)
			{
				//IL_002c: Unknown result type (might be due to invalid IL or missing references)
				MenuAPI.CreateREPOButton("<size=18><color=#FFAA00>CLEAR ALL</color></size>", (Action)OnDisableAllButtonClick, parent, new Vector2(401f, 0f));
			}
		}

		[CompilerGenerated]
		private sealed class <DelayedOpenMoreHeadUI>d__20 : IEnumerator<object>, IEnumerator, IDisposable
		{
			private int <>1__state;

			private object <>2__current;

			private Exception <e>5__1;

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

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

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

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

			private bool MoveNext()
			{
				//IL_005e: Unknown result type (might be due to invalid IL or missing references)
				switch (<>1__state)
				{
				default:
					return false;
				case 0:
					<>1__state = -1;
					<>2__current = null;
					<>1__state = 1;
					return true;
				case 1:
					<>1__state = -1;
					try
					{
						if ((Object)(object)decorationsPage == (Object)null)
						{
							decorationsPage = MenuAPI.CreateREPOPopupPage(PAGE_TITLE, true, true, 0f, (Vector2?)new Vector2(-299f, 10f));
							SetupPopupPage(decorationsPage);
							CreateAllDecorationButtons(decorationsPage);
							CreateTagFilterButtons(decorationsPage);
							AddAuthorCredit(decorationsPage);
							AddActionButtons(decorationsPage);
						}
						decorationsPage.OpenPage(false);
						MonoBehaviour obj = Object.FindObjectOfType<MonoBehaviour>();
						if (obj != null)
						{
							obj.StartCoroutine(DelayedShowTagDecorations(currentTagFilter));
						}
						UpdateAvatarPreview();
						UpdateButtonStates();
					}
					catch (Exception ex)
					{
						<e>5__1 = ex;
						ManualLogSource? logger = Logger;
						if (logger != null)
						{
							logger.LogError((object)("延迟打开设置页面时出错: " + <e>5__1.Message));
						}
					}
					return false;
				}
			}

			bool IEnumerator.MoveNext()
			{
				//ILSpy generated this explicit interface implementation from .override directive in MoveNext
				return this.MoveNext();
			}

			[DebuggerHidden]
			void IEnumerator.Reset()
			{
				throw new NotSupportedException();
			}
		}

		[CompilerGenerated]
		private sealed class <DelayedShowTagDecorations>d__42 : IEnumerator<object>, IEnumerator, IDisposable
		{
			private int <>1__state;

			private object <>2__current;

			public string tag;

			private Exception <e>5__1;

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

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

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

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

			private bool MoveNext()
			{
				switch (<>1__state)
				{
				default:
					return false;
				case 0:
					<>1__state = -1;
					<>2__current = null;
					<>1__state = 1;
					return true;
				case 1:
					<>1__state = -1;
					try
					{
						ShowTagDecorations(tag);
					}
					catch (Exception ex)
					{
						<e>5__1 = ex;
						ManualLogSource? logger = Logger;
						if (logger != null)
						{
							logger.LogError((object)("延迟显示标签装饰物时出错: " + <e>5__1.Message));
						}
					}
					return false;
				}
			}

			bool IEnumerator.MoveNext()
			{
				//ILSpy generated this explicit interface implementation from .override directive in MoveNext
				return this.MoveNext();
			}

			[DebuggerHidden]
			void IEnumerator.Reset()
			{
				throw new NotSupportedException();
			}
		}

		public static REPOPopupPage? decorationsPage;

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

		public static Dictionary<string?, DecorationButtonMarker?> buttonMarkers = new Dictionary<string, DecorationButtonMarker>();

		private static Dictionary<string, List<REPOScrollViewElement>> tagScrollViewElements = new Dictionary<string, List<REPOScrollViewElement>>();

		private static string currentTagFilter = "ALL";

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

		private static Dictionary<string, List<DecorationInfo>> decorationDataCache = new Dictionary<string, List<DecorationInfo>>();

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

		private static REPOAvatarPreview? avatarPreview;

		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 static readonly string PAGE_TITLE = "Rotate robot: A/D <size=12><color=#AAAAAA>v" + Morehead.GetPluginVersion() + "</color></size>";

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

		private static readonly string[] FULL_TAGS = new string[10] { "ALL", "HEAD", "NECK", "BODY", "HIP", "LEFTARM", "RIGHTARM", "LEFTLEG", "RIGHTLEG", "WORLD" };

		private static readonly string[] LIMB_TAGS = new string[4] { "LEFTARM", "RIGHTARM", "LEFTLEG", "RIGHTLEG" };

		private static Dictionary<int, REPOButton> outfitButtons = new Dictionary<int, REPOButton>();

		private static ManualLogSource? Logger => Morehead.Logger;

		public static void Initialize()
		{
			//IL_0016: Unknown result type (might be due to invalid IL or missing references)
			//IL_001b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0021: Expected O, but got Unknown
			//IL_003b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0040: Unknown result type (might be due to invalid IL or missing references)
			//IL_0046: Expected O, but got Unknown
			try
			{
				object obj = <>c.<>9__17_0;
				if (obj == null)
				{
					BuilderDelegate val = delegate(Transform parent)
					{
						//IL_0022: Unknown result type (might be due to invalid IL or missing references)
						MenuAPI.CreateREPOButton("<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, parent, Vector2.zero);
					};
					<>c.<>9__17_0 = val;
					obj = (object)val;
				}
				MenuAPI.AddElementToEscapeMenu((BuilderDelegate)obj);
				object obj2 = <>c.<>9__17_1;
				if (obj2 == null)
				{
					BuilderDelegate val2 = delegate(Transform parent)
					{
						//IL_0022: Unknown result type (might be due to invalid IL or missing references)
						MenuAPI.CreateREPOButton("<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, parent, Vector2.zero);
					};
					<>c.<>9__17_1 = val2;
					obj2 = (object)val2;
				}
				MenuAPI.AddElementToLobbyMenu((BuilderDelegate)obj2);
				InitializeDataCache();
				ManualLogSource? logger = Logger;
				if (logger != null)
				{
					logger.LogInfo((object)"MoreHead UI已初始化");
				}
			}
			catch (Exception ex)
			{
				ManualLogSource? logger2 = Logger;
				if (logger2 != null)
				{
					logger2.LogError((object)("初始化UI时出错: " + ex.Message));
				}
			}
		}

		private static void InitializeDataCache()
		{
			try
			{
				decorationDataCache.Clear();
				buttonTextCache.Clear();
				string[] aLL_TAGS = ALL_TAGS;
				foreach (string tag in aLL_TAGS)
				{
					List<DecorationInfo> list = ((!(tag == "LIMBS")) ? HeadDecorationManager.Decorations.Where((DecorationInfo decoration) => tag == "ALL" || decoration.ParentTag?.ToUpper() == tag).ToList() : HeadDecorationManager.Decorations.Where((DecorationInfo decoration) => LIMB_TAGS.Contains(decoration.ParentTag?.ToUpper())).ToList());
					decorationDataCache[tag] = list;
					buttonTextCache[tag] = new Dictionary<string, string>();
					foreach (DecorationInfo item in list)
					{
						string buttonText = GetButtonText(item, item.IsVisible);
						buttonTextCache[tag][item.Name ?? string.Empty] = buttonText;
					}
				}
				ManualLogSource? logger = Logger;
				if (logger != null)
				{
					logger.LogInfo((object)"数据缓存初始化完成");
				}
			}
			catch (Exception ex)
			{
				ManualLogSource? logger2 = Logger;
				if (logger2 != null)
				{
					logger2.LogError((object)("初始化数据缓存时出错: " + ex.Message));
				}
			}
		}

		private static void OnMenuButtonClick()
		{
			try
			{
				if ((Object)(object)MenuPageEsc.instance != (Object)null)
				{
					MenuPageEsc.instance.ButtonEventContinue();
				}
				MonoBehaviour obj = Object.FindObjectOfType<MonoBehaviour>();
				if (obj != null)
				{
					obj.StartCoroutine(DelayedOpenMoreHeadUI());
				}
			}
			catch (Exception ex)
			{
				ManualLogSource? logger = Logger;
				if (logger != null)
				{
					logger.LogError((object)("打开设置页面时出错: " + ex.Message));
				}
			}
		}

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

		private static void SetupPopupPage(REPOPopupPage page)
		{
			//IL_0042: 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)
			try
			{
				if ((Object)(object)((Component)page).gameObject != (Object)null)
				{
					((Object)((Component)page).gameObject).name = "MoreHead_Page";
				}
				page.pageDimmerVisibility = true;
				page.maskPadding = new Padding(10f, 10f, 20f, 10f);
				((Transform)((TMP_Text)page.headerTMP).rectTransform).position = new Vector3(170f, 344f, 0f);
				page.pageDimmerOpacity = 0.85f;
				page.scrollView.scrollSpeed = 4f;
			}
			catch (Exception ex)
			{
				ManualLogSource? logger = Logger;
				if (logger != null)
				{
					logger.LogError((object)("设置弹出页面属性时出错: " + ex.Message));
				}
			}
		}

		private static void AddAuthorCredit(REPOPopupPage page)
		{
			//IL_0017: Unknown result type (might be due to invalid IL or missing references)
			//IL_001c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0022: Expected O, but got Unknown
			try
			{
				object obj = <>c.<>9__22_0;
				if (obj == null)
				{
					BuilderDelegate val = delegate(Transform parent)
					{
						//IL_0030: Unknown result type (might be due to invalid IL or missing references)
						MenuAPI.CreateREPOButton("<size=10><color=#FFFFA0>Masaicker</color> and <color=#FFFFA0>Yuriscat</color> co-developed.\n由<color=#FFFFA0>马赛克了</color>和<color=#FFFFA0>尤里的猫</color>共同制作。</size>", (Action)delegate
						{
						}, parent, new Vector2(300f, 329f));
					};
					<>c.<>9__22_0 = val;
					obj = (object)val;
				}
				page.AddElement((BuilderDelegate)obj);
			}
			catch (Exception ex)
			{
				ManualLogSource? logger = Logger;
				if (logger != null)
				{
					logger.LogError((object)("添加作者标记时出错: " + ex.Message));
				}
			}
		}

		private static bool IsBuiltInDecoration(DecorationInfo decoration)
		{
			string bundlePath = decoration.BundlePath;
			if (string.IsNullOrEmpty(bundlePath))
			{
				return false;
			}
			Morehead? instance = Morehead.Instance;
			string directoryName = Path.GetDirectoryName((instance != null) ? ((BaseUnityPlugin)instance).Info.Location : null);
			if (string.IsNullOrEmpty(directoryName))
			{
				return false;
			}
			string value = Path.Combine(directoryName, "Decorations");
			return bundlePath.StartsWith(value);
		}

		private static void CreateTagFilterButtons(REPOPopupPage? page)
		{
			//IL_0176: Unknown result type (might be due to invalid IL or missing references)
			//IL_0180: Expected O, but got Unknown
			try
			{
				tagFilterButtons.Clear();
				CreateOutfitButtons(page);
				for (int i = 0; i < ALL_TAGS.Length; i++)
				{
					string text = ALL_TAGS[i];
					string text2 = text.ToLower();
					int num = i;
					if (1 == 0)
					{
					}
					string text3 = text2 switch
					{
						"head" => "#00AAFF", 
						"neck" => "#AA00FF", 
						"body" => "#FFAA00", 
						"hip" => "#FF00AA", 
						"limbs" => "#AACCAA", 
						"world" => "#00FFAA", 
						_ => "#FFFFFF", 
					};
					if (1 == 0)
					{
					}
					string text4 = text3;
					string buttonText = ((text2 == currentTagFilter.ToLower()) ? ("<size=13><u><color=" + text4 + ">" + text + "</color></u></size>") : ("<size=13><color=" + text4 + "50>" + text + "</color></size>"));
					string tagForCallback = ((text2 == "all") ? "ALL" : text);
					int xPosition = 50 + i * 35;
					if (page == null)
					{
						continue;
					}
					page.AddElement((BuilderDelegate)delegate(Transform parent)
					{
						//IL_0033: Unknown result type (might be due to invalid IL or missing references)
						REPOButton value = MenuAPI.CreateREPOButton(buttonText, (Action)delegate
						{
							OnTagFilterButtonClick(tagForCallback);
						}, parent, new Vector2((float)xPosition, 20f));
						tagFilterButtons[tagForCallback] = value;
					});
				}
			}
			catch (Exception ex)
			{
				ManualLogSource? logger = Logger;
				if (logger != null)
				{
					logger.LogError((object)("创建标签筛选按钮时出错: " + ex.Message));
				}
			}
		}

		private static void OnTagFilterButtonClick(string tag)
		{
			try
			{
				if (tag == currentTagFilter)
				{
					REPOPopupPage? obj = decorationsPage;
					if (obj != null)
					{
						obj.scrollView.SetScrollPosition(0f);
					}
				}
				else
				{
					ShowTagDecorations(tag);
					UpdateTagButtonHighlights();
					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;
				}
				if (decorationDataCache.TryGetValue(currentTagFilter, out List<DecorationInfo> value))
				{
					foreach (DecorationInfo item in value)
					{
						if (!decorationButtons.TryGetValue(item.Name ?? string.Empty, out REPOButton value2))
						{
							continue;
						}
						if (buttonTextCache.TryGetValue(currentTagFilter, out Dictionary<string, string> value3) && value3.TryGetValue(item.Name ?? string.Empty, out var value4))
						{
							value4 = GetButtonText(item, item.IsVisible);
							value3[item.Name ?? string.Empty] = value4;
						}
						else
						{
							value4 = GetButtonText(item, item.IsVisible);
							if (buttonTextCache.TryGetValue(currentTagFilter, out value3))
							{
								value3[item.Name ?? string.Empty] = value4;
							}
						}
						((TMP_Text)value2.labelTMP).text = value4;
					}
				}
				UpdateTagButtonHighlights();
				UpdateOutfitButtonHighlights();
			}
			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", 
							"limbs" => "#AACCAA", 
							"world" => "#00FFAA", 
							_ => "#FFFFFF", 
						};
						if (1 == 0)
						{
						}
						string text5 = text4;
						string text6 = ((text2 == currentTagFilter) ? ("<size=13><u><color=" + text5 + ">" + text + "</color></u></size>") : ("<size=13><color=" + text5 + "50>" + text + "</color></size>"));
						((TMP_Text)value.labelTMP).text = 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);
				string buttonText = GetButtonText(decorationInfo, isEnabled);
				string[] aLL_TAGS = ALL_TAGS;
				foreach (string text in aLL_TAGS)
				{
					bool flag = false;
					if (text == "ALL")
					{
						flag = true;
					}
					else if (text == "LIMBS" && LIMB_TAGS.Contains(decorationInfo.ParentTag?.ToUpper()))
					{
						flag = true;
					}
					else if (decorationInfo.ParentTag?.ToUpper() == text)
					{
						flag = true;
					}
					if (flag && buttonTextCache.TryGetValue(text, out Dictionary<string, string> value))
					{
						value[decorationName2 ?? string.Empty] = buttonText;
					}
				}
				if (decorationButtons.TryGetValue(decorationName2 ?? string.Empty, out REPOButton value2))
				{
					((TMP_Text)value2.labelTMP).text = buttonText;
					if (buttonMarkers.TryGetValue(decorationName2 ?? string.Empty, out DecorationButtonMarker value3) && value3?.Decoration != null && !string.IsNullOrEmpty(value3.Decoration.ModName) && !((TMP_Text)value2.labelTMP).text.Contains(value3.Decoration.ModName))
					{
						((TMP_Text)value2.labelTMP).text = ((TMP_Text)value2.labelTMP).text + " <size=12><color=#AAAAAA>- " + value3.Decoration.ModName + "</color></size>";
					}
				}
				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", 
				"leftarm" => "#88CC88", 
				"rightarm" => "#88CC88", 
				"leftleg" => "#88BBEE", 
				"rightleg" => "#88BBEE", 
				"world" => "#00FFAA", 
				_ => "#AAAAAA", 
			};
			if (1 == 0)
			{
			}
			string text5 = text4;
			string text6 = "";
			if (LIMB_TAGS.Contains(text2.ToUpper()))
			{
				string text7 = text2.ToLower();
				if (1 == 0)
				{
				}
				text4 = text7 switch
				{
					"leftarm" => "L-ARM", 
					"rightarm" => "R-ARM", 
					"leftleg" => "L-LEG", 
					"rightleg" => "R-LEG", 
					_ => text2, 
				};
				if (1 == 0)
				{
				}
				string text8 = text4;
				text6 = "<color=" + text5 + "><size=12>(" + text8 + ")</size></color> ";
			}
			else
			{
				text6 = "<color=" + text5 + "><size=12>(" + text2 + ")</size></color> ";
			}
			return "<size=16>" + (isEnabled ? "<color=#00FF00>[+]</color>" : "<color=#FF0000>[-]</color>") + " " + text6 + text + "</size>";
		}

		private static void OnCloseButtonClick()
		{
			try
			{
				REPOPopupPage? obj = decorationsPage;
				if (obj != null)
				{
					obj.ClosePage(true);
				}
			}
			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 UpdateAvatarPreview()
		{
			try
			{
				if (!((Object)(object)decorationsPage == (Object)null))
				{
					if ((Object)(object)avatarPreview != (Object)null)
					{
						SafeDestroyAvatar();
					}
					CreateAvatarPreview(decorationsPage);
				}
			}
			catch (Exception ex)
			{
				ManualLogSource? logger = Logger;
				if (logger != null)
				{
					logger.Lo