using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using BepInEx;
using BepInEx.Logging;
using HarmonyLib;
using MenuLib;
using Microsoft.CodeAnalysis;
using MoreHead;
using Newtonsoft.Json;
using Photon.Pun;
using UnityEngine;
using UnityEngine.UI;
[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = "")]
[assembly: AssemblyCompany("MoreHead")]
[assembly: AssemblyConfiguration("Debug")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0")]
[assembly: AssemblyProduct("MoreHead")]
[assembly: AssemblyTitle("MoreHead")]
[assembly: AssemblyVersion("1.0.0.0")]
namespace Microsoft.CodeAnalysis
{
[CompilerGenerated]
[Microsoft.CodeAnalysis.Embedded]
internal sealed class EmbeddedAttribute : Attribute
{
}
}
namespace System.Runtime.CompilerServices
{
[CompilerGenerated]
[Microsoft.CodeAnalysis.Embedded]
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Parameter | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter, AllowMultiple = false, Inherited = false)]
internal sealed class NullableAttribute : Attribute
{
public readonly byte[] NullableFlags;
public NullableAttribute(byte P_0)
{
NullableFlags = new byte[1] { P_0 };
}
public NullableAttribute(byte[] P_0)
{
NullableFlags = P_0;
}
}
[CompilerGenerated]
[Microsoft.CodeAnalysis.Embedded]
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Method | AttributeTargets.Interface | AttributeTargets.Delegate, AllowMultiple = false, Inherited = false)]
internal sealed class NullableContextAttribute : Attribute
{
public readonly byte Flag;
public NullableContextAttribute(byte P_0)
{
Flag = P_0;
}
}
}
[BepInPlugin("Mhz.REPOMoreHead", "MoreHead", "1.2.3")]
public class Morehead : BaseUnityPlugin
{
private const string PluginGuid = "Mhz.REPOMoreHead";
private const string PluginName = "MoreHead";
private const string PluginVersion = "1.2.3";
public static ManualLogSource? Logger;
public static Morehead? Instance { get; private set; }
private void Awake()
{
//IL_0019: Unknown result type (might be due to invalid IL or missing references)
//IL_001f: Expected O, but got Unknown
Instance = this;
Logger = ((BaseUnityPlugin)this).Logger;
try
{
Harmony val = new Harmony("Mhz.REPOMoreHead");
val.PatchAll(typeof(PlayerAvatarVisualsPatch));
val.PatchAll(typeof(PlayerUpdatePatch));
val.PatchAll(typeof(PlayerAvatarAwakePatch));
val.PatchAll(typeof(GameDirectorUpdatePatch));
val.PatchAll(typeof(PlayerRevivePatch));
string text = "\n\n ███▄ ▄███▓ ▒█████ ██▀███ ▓█████ ██░ ██ ▓█████ ▄▄▄ ▓█████▄ \n▓██▒▀█▀ ██▒▒██▒ ██▒▓██ ▒ ██▒▓█ ▀ ▓██░ ██▒▓█ ▀▒████▄ ▒██▀ ██▌\n▓██ ▓██░▒██░ ██▒▓██ ░▄█ ▒▒███ ▒██▀███░▒███ ▒██ ▀█▄ ░██ █▌\n▒██ ▒██ ▒██ ██░▒███▀█▄ ▒▓█ ▄ ░▓█ ░██ ▒▓█ ▄░██▄▄▄▄██ ░▓█▄ ▌\n▒██▒ ░██▒░ ████▓▒░░██▓ ▒██▒░▒████▒░▓█▒░██▓░▒████▒▓█ ▓██▒░▒████▓ v1.2.3\n░ ▒░ ░ ░░ ▒░▒░▒░ ░ ▒▓ ░▒▓░░░ ▒░ ░ ▒ ░░▒░▒░░ ▒░ ░▒▒ ▓▒█░ ▒▒▓ ▒ \n░ ░ ░ ░ ▒ ▒░ ░▒ ░ ▒░ ░ ░ ░ ▒ ░▒░ ░ ░ ░ ░ ▒ ▒▒ ░ ░ ▒ ▒ \n░ ░ ░ ░ ░ ▒ ░░ ░ ░ ░ ░░ ░ ░ ░ ▒ ░ ░ ░ \n ░ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░ \n";
ManualLogSource? logger = Logger;
if (logger != null)
{
logger.LogMessage((object)text);
}
HeadDecorationManager.Initialize();
ConfigManager.Initialize();
MoreHeadUI.Initialize();
}
catch (Exception ex)
{
ManualLogSource? logger2 = Logger;
if (logger2 != null)
{
logger2.LogError((object)("Harmony补丁应用失败: " + ex.Message));
}
}
}
private void OnApplicationQuit()
{
ConfigManager.SaveConfig();
}
public static bool GetDecorationState(string? name)
{
return HeadDecorationManager.GetDecorationState(name);
}
}
[HarmonyPatch(typeof(PlayerAvatar))]
[HarmonyPatch("Update")]
internal class PlayerUpdatePatch
{
private static void Postfix(PlayerAvatar __instance)
{
if (__instance.photonView.IsMine && GameManager.Multiplayer() && PhotonNetwork.LocalPlayer != null)
{
}
}
public static void UpdatePlayerDecorations(PlayerAvatar playerAvatar)
{
try
{
if ((Object)(object)playerAvatar?.playerAvatarVisuals == (Object)null)
{
return;
}
Dictionary<string, Transform> decorationParentNodes = DecorationUtils.GetDecorationParentNodes(((Component)playerAvatar.playerAvatarVisuals).transform);
if (decorationParentNodes.Count == 0)
{
ManualLogSource? logger = Morehead.Logger;
if (logger != null)
{
logger.LogWarning((object)"找不到任何装饰物父级节点");
}
return;
}
DecorationUtils.EnsureDecorationContainers(decorationParentNodes);
foreach (DecorationInfo decoration in HeadDecorationManager.Decorations)
{
if (decorationParentNodes.TryGetValue(decoration.ParentTag ?? string.Empty, out var value))
{
Transform val = value.Find("HeadDecorations");
if ((Object)(object)val != (Object)null)
{
DecorationUtils.UpdateDecoration(val, decoration.Name ?? string.Empty, decoration.IsVisible);
}
}
else
{
ManualLogSource? logger2 = Morehead.Logger;
if (logger2 != null)
{
logger2.LogWarning((object)("找不到装饰物 " + decoration.DisplayName + " 的父级节点: " + decoration.ParentTag));
}
}
}
}
catch (Exception ex)
{
ManualLogSource? logger3 = Morehead.Logger;
if (logger3 != null)
{
logger3.LogError((object)("更新玩家装饰物时出错: " + ex.Message));
}
}
}
public static void UpdateMenuPlayerDecorations()
{
try
{
PlayerAvatarVisuals val = FindMenuPlayerVisuals();
if ((Object)(object)val == (Object)null)
{
return;
}
Dictionary<string, Transform> decorationParentNodes = DecorationUtils.GetDecorationParentNodes(((Component)val).transform);
if (decorationParentNodes.Count == 0)
{
ManualLogSource? logger = Morehead.Logger;
if (logger != null)
{
logger.LogWarning((object)"找不到任何菜单角色装饰物父级节点");
}
return;
}
DecorationUtils.EnsureDecorationContainers(decorationParentNodes);
foreach (DecorationInfo decoration in HeadDecorationManager.Decorations)
{
if (decorationParentNodes.TryGetValue(decoration.ParentTag ?? string.Empty, out var value))
{
Transform val2 = value.Find("HeadDecorations");
if ((Object)(object)val2 != (Object)null)
{
Transform val3 = val2.Find(decoration.Name);
if ((Object)(object)val3 == (Object)null)
{
AddMenuDecoration(val2, decoration.Name);
}
else
{
DecorationUtils.UpdateDecoration(val2, decoration.Name ?? string.Empty, decoration.IsVisible);
}
}
}
else
{
ManualLogSource? logger2 = Morehead.Logger;
if (logger2 != null)
{
logger2.LogWarning((object)("找不到菜单角色装饰物 " + decoration.DisplayName + " 的父级节点: " + decoration.ParentTag));
}
}
}
}
catch (Exception ex)
{
ManualLogSource? logger3 = Morehead.Logger;
if (logger3 != null)
{
logger3.LogError((object)("更新菜单角色装饰物状态失败: " + ex.Message));
}
}
}
private static PlayerAvatarVisuals? FindMenuPlayerVisuals()
{
if ((Object)(object)PlayerAvatarMenu.instance == (Object)null)
{
return null;
}
return ((Component)PlayerAvatarMenu.instance).GetComponentInChildren<PlayerAvatarVisuals>();
}
public static void AddMenuDecoration(Transform parent, string? decorationName)
{
string decorationName2 = decorationName;
try
{
Transform val = parent.Find(decorationName2);
if ((Object)(object)val != (Object)null)
{
bool decorationState = Morehead.GetDecorationState(decorationName2);
((Component)val).gameObject.SetActive(decorationState);
return;
}
DecorationInfo decorationInfo = HeadDecorationManager.Decorations.Find((DecorationInfo d) => d.Name != null && d.Name.Equals(decorationName2, StringComparison.OrdinalIgnoreCase));
if (decorationInfo != null && (Object)(object)decorationInfo.Prefab != (Object)null)
{
GameObject val2 = Object.Instantiate<GameObject>(decorationInfo.Prefab, parent);
((Object)val2).name = decorationName2;
val2.SetActive(decorationInfo.IsVisible);
return;
}
ManualLogSource? logger = Morehead.Logger;
if (logger != null)
{
logger.LogWarning((object)("AddMenuDecoration: 找不到装饰物 " + decorationName2 + " 或其预制体为空"));
}
}
catch (Exception ex)
{
ManualLogSource? logger2 = Morehead.Logger;
if (logger2 != null)
{
logger2.LogError((object)("为菜单角色添加装饰物时出错: " + ex.Message));
}
}
}
}
[HarmonyPatch(typeof(PlayerAvatar))]
[HarmonyPatch("Awake")]
internal class PlayerAvatarAwakePatch
{
private static void Postfix(PlayerAvatar __instance)
{
((Component)__instance).gameObject.AddComponent<HeadDecorationSync>();
}
}
public class HeadDecorationSync : MonoBehaviourPun
{
public void SyncAllDecorations()
{
try
{
string[] array = new string[HeadDecorationManager.Decorations.Count];
bool[] array2 = new bool[HeadDecorationManager.Decorations.Count];
string[] array3 = new string[HeadDecorationManager.Decorations.Count];
for (int i = 0; i < HeadDecorationManager.Decorations.Count; i++)
{
DecorationInfo decorationInfo = HeadDecorationManager.Decorations[i];
array[i] = decorationInfo.Name;
array2[i] = decorationInfo.IsVisible;
array3[i] = decorationInfo.ParentTag;
}
((MonoBehaviourPun)this).photonView.RPC("UpdateAllDecorations", (RpcTarget)1, new object[3] { array, array2, array3 });
}
catch (Exception ex)
{
ManualLogSource? logger = Morehead.Logger;
if (logger != null)
{
logger.LogError((object)("同步所有装饰物状态失败: " + ex.Message));
}
}
}
[PunRPC]
private void UpdateAllDecorations(string[] names, bool[] states, string[] parentTags)
{
try
{
PlayerAvatar component = ((Component)this).GetComponent<PlayerAvatar>();
if ((Object)(object)component == (Object)null || (Object)(object)component.playerAvatarVisuals == (Object)null)
{
ManualLogSource? logger = Morehead.Logger;
if (logger != null)
{
logger.LogWarning((object)"找不到PlayerAvatar或PlayerAvatarVisuals组件");
}
return;
}
Dictionary<string, Transform> decorationParentNodes = DecorationUtils.GetDecorationParentNodes(((Component)component.playerAvatarVisuals).transform);
if (decorationParentNodes.Count == 0)
{
ManualLogSource? logger2 = Morehead.Logger;
if (logger2 != null)
{
logger2.LogWarning((object)"找不到任何装饰物父级节点");
}
return;
}
DecorationUtils.EnsureDecorationContainers(decorationParentNodes);
for (int i = 0; i < names.Length; i++)
{
string decorationName = names[i];
bool showDecoration = states[i];
string key = parentTags[i];
if (decorationParentNodes.TryGetValue(key, out var value))
{
Transform val = value.Find("HeadDecorations");
if ((Object)(object)val != (Object)null)
{
DecorationUtils.UpdateDecoration(val, decorationName, showDecoration);
}
}
}
}
catch (Exception ex)
{
ManualLogSource? logger3 = Morehead.Logger;
if (logger3 != null)
{
logger3.LogError((object)("RPC更新所有装饰物状态失败: " + ex.Message));
}
}
}
}
[HarmonyPatch(typeof(PlayerAvatarVisuals))]
[HarmonyPatch("Start")]
internal class PlayerAvatarVisualsPatch
{
private static void Postfix(PlayerAvatarVisuals __instance)
{
try
{
Dictionary<string, Transform> decorationParentNodes = DecorationUtils.GetDecorationParentNodes(((Component)__instance).transform);
if (decorationParentNodes.Count == 0)
{
ManualLogSource? logger = Morehead.Logger;
if (logger != null)
{
logger.LogWarning((object)$"找不到任何装饰物父级节点 (isMenuAvatar: {__instance.isMenuAvatar})");
}
return;
}
DecorationUtils.EnsureDecorationContainers(decorationParentNodes);
if (__instance.isMenuAvatar)
{
foreach (KeyValuePair<string, Transform> item in decorationParentNodes)
{
string key = item.Key;
Transform value = item.Value;
Transform val = value.Find("HeadDecorations");
if ((Object)(object)val != (Object)null)
{
foreach (DecorationInfo decoration in HeadDecorationManager.Decorations)
{
if (decoration.ParentTag == key)
{
PlayerUpdatePatch.AddMenuDecoration(val, decoration.Name);
}
}
}
}
return;
}
foreach (DecorationInfo decoration2 in HeadDecorationManager.Decorations)
{
if (decorationParentNodes.TryGetValue(decoration2.ParentTag ?? string.Empty, out var value2))
{
Transform val2 = value2.Find("HeadDecorations");
if ((Object)(object)val2 != (Object)null)
{
AddNewDecoration(val2, decoration2, __instance);
}
}
else
{
ManualLogSource? logger2 = Morehead.Logger;
if (logger2 != null)
{
logger2.LogWarning((object)("初始化时找不到装饰物 " + decoration2.DisplayName + " 的父级节点: " + decoration2.ParentTag));
}
}
}
if (!GameManager.Multiplayer() || !((Object)(object)__instance.playerAvatar != (Object)null) || !((Object)(object)__instance.playerAvatar.photonView != (Object)null) || !__instance.playerAvatar.photonView.IsMine)
{
return;
}
try
{
HeadDecorationSync component = ((Component)__instance.playerAvatar).GetComponent<HeadDecorationSync>();
if ((Object)(object)component != (Object)null)
{
component.SyncAllDecorations();
return;
}
ManualLogSource? logger3 = Morehead.Logger;
if (logger3 != null)
{
logger3.LogWarning((object)"找不到HeadDecorationSync组件,无法同步初始状态");
}
}
catch (Exception ex)
{
ManualLogSource? logger4 = Morehead.Logger;
if (logger4 != null)
{
logger4.LogError((object)("同步初始装饰物状态失败: " + ex.Message));
}
}
}
catch (Exception ex2)
{
ManualLogSource? logger5 = Morehead.Logger;
if (logger5 != null)
{
logger5.LogError((object)$"添加装饰物失败: {ex2.Message} (isMenuAvatar: {__instance.isMenuAvatar})");
}
}
}
private static void AddNewDecoration(Transform parent, DecorationInfo decoration, PlayerAvatarVisuals __instance)
{
Transform val = parent.Find(decoration.Name);
if ((Object)(object)val != (Object)null)
{
((Component)val).gameObject.SetActive(decoration.IsVisible);
return;
}
if ((Object)(object)decoration.Prefab != (Object)null)
{
try
{
GameObject val2 = Object.Instantiate<GameObject>(decoration.Prefab, parent);
((Object)val2).name = decoration.Name;
val2.SetActive(decoration.IsVisible);
return;
}
catch (Exception ex)
{
ManualLogSource? logger = Morehead.Logger;
if (logger != null)
{
logger.LogError((object)("实例化预制体时出错: " + ex.Message));
}
return;
}
}
ManualLogSource? logger2 = Morehead.Logger;
if (logger2 != null)
{
logger2.LogWarning((object)("AddNewDecoration: 装饰物 " + decoration.DisplayName + " 的预制体为空"));
}
}
}
[HarmonyPatch(typeof(GameDirector))]
[HarmonyPatch("Update")]
internal class GameDirectorUpdatePatch
{
private static gameState previousState;
private static void Postfix(GameDirector __instance)
{
//IL_0002: Unknown result type (might be due to invalid IL or missing references)
//IL_0008: Invalid comparison between Unknown and I4
//IL_000b: Unknown result type (might be due to invalid IL or missing references)
//IL_0011: Invalid comparison between Unknown and I4
//IL_0023: Unknown result type (might be due to invalid IL or missing references)
//IL_0028: Unknown result type (might be due to invalid IL or missing references)
try
{
if ((int)previousState != 2 && (int)__instance.currentState == 2)
{
SyncAllPlayersDecorations();
}
previousState = __instance.currentState;
}
catch (Exception ex)
{
ManualLogSource? logger = Morehead.Logger;
if (logger != null)
{
logger.LogError((object)("监听游戏状态变化时出错: " + ex.Message));
}
}
}
private static void SyncAllPlayersDecorations()
{
try
{
PlayerAvatar val = FindLocalPlayer();
if ((Object)(object)val != (Object)null)
{
PlayerUpdatePatch.UpdatePlayerDecorations(val);
HeadDecorationSync component = ((Component)val).GetComponent<HeadDecorationSync>();
if ((Object)(object)component != (Object)null)
{
component.SyncAllDecorations();
}
}
}
catch (Exception ex)
{
ManualLogSource? logger = Morehead.Logger;
if (logger != null)
{
logger.LogError((object)("同步所有玩家装饰物状态时出错: " + ex.Message));
}
}
}
private static PlayerAvatar? FindLocalPlayer()
{
try
{
PlayerAvatar[] array = Object.FindObjectsOfType<PlayerAvatar>();
PlayerAvatar[] array2 = array;
foreach (PlayerAvatar val in array2)
{
if ((Object)(object)val?.photonView != (Object)null && val.photonView.IsMine)
{
return val;
}
}
}
catch (Exception ex)
{
ManualLogSource? logger = Morehead.Logger;
if (logger != null)
{
logger.LogError((object)("查找本地玩家时出错: " + ex.Message));
}
}
return null;
}
}
[HarmonyPatch(typeof(PlayerAvatar))]
[HarmonyPatch("ReviveRPC")]
internal class PlayerRevivePatch
{
private static void Postfix(PlayerAvatar __instance)
{
try
{
if (__instance.photonView.IsMine)
{
((MonoBehaviour)__instance).StartCoroutine(DelayedSync(__instance));
}
}
catch (Exception ex)
{
ManualLogSource? logger = Morehead.Logger;
if (logger != null)
{
logger.LogError((object)("玩家复活时同步装饰物状态失败: " + ex.Message));
}
}
}
private static IEnumerator DelayedSync(PlayerAvatar playerAvatar)
{
yield return null;
yield return (object)new WaitForSeconds(0.2f);
try
{
PlayerUpdatePatch.UpdatePlayerDecorations(playerAvatar);
}
catch (Exception e2)
{
ManualLogSource? logger = Morehead.Logger;
if (logger != null)
{
logger.LogError((object)("更新玩家装饰物状态失败: " + e2.Message));
}
}
yield return (object)new WaitForSeconds(0.1f);
try
{
HeadDecorationSync syncComponent = ((Component)playerAvatar).GetComponent<HeadDecorationSync>();
if ((Object)(object)syncComponent != (Object)null)
{
syncComponent.SyncAllDecorations();
yield break;
}
ManualLogSource? logger2 = Morehead.Logger;
if (logger2 != null)
{
logger2.LogWarning((object)"玩家复活后找不到HeadDecorationSync组件");
}
}
catch (Exception e)
{
ManualLogSource? logger3 = Morehead.Logger;
if (logger3 != null)
{
logger3.LogError((object)("同步装饰物状态失败: " + e.Message));
}
}
}
}
namespace MoreHead
{
public static class ConfigManager
{
private const string MOD_DATA_FOLDER = "REPOModData";
private const string MOD_FOLDER = "MoreHead";
private const string CONFIG_FILENAME = "MoreHeadConfig.json";
private static Dictionary<string?, bool> _decorationStates = new Dictionary<string, bool>();
private static ManualLogSource? Logger => Morehead.Logger;
private static string NewConfigFilePath => Path.Combine(Application.persistentDataPath, "REPOModData", "MoreHead", "MoreHeadConfig.json");
private static string BepInExConfigFilePath => Path.Combine(Paths.ConfigPath, "MoreHeadConfig.json");
private static string OldConfigFilePath
{
get
{
Morehead? instance = Morehead.Instance;
return Path.Combine(Path.GetDirectoryName((instance != null) ? ((BaseUnityPlugin)instance).Info.Location : null) ?? string.Empty, "MoreHeadConfig.txt");
}
}
public static void Initialize()
{
try
{
EnsureModDataDirectoryExists();
LoadConfig();
ApplySavedStates();
}
catch (Exception ex)
{
ManualLogSource? logger = Logger;
if (logger != null)
{
logger.LogError((object)("初始化配置管理器时出错: " + ex.Message));
}
}
}
private static void EnsureModDataDirectoryExists()
{
try
{
string text = Path.Combine(Application.persistentDataPath, "REPOModData");
if (!Directory.Exists(text))
{
Directory.CreateDirectory(text);
ManualLogSource? logger = Logger;
if (logger != null)
{
logger.LogInfo((object)("已创建MOD数据总文件夹: " + text));
}
}
string text2 = Path.Combine(text, "MoreHead");
if (!Directory.Exists(text2))
{
Directory.CreateDirectory(text2);
ManualLogSource? logger2 = Logger;
if (logger2 != null)
{
logger2.LogInfo((object)("已创建MOD特定文件夹: " + text2));
}
}
}
catch (Exception ex)
{
ManualLogSource? logger3 = Logger;
if (logger3 != null)
{
logger3.LogError((object)("创建MOD数据目录时出错: " + ex.Message));
}
}
}
private static void LoadConfig()
{
try
{
_decorationStates.Clear();
if (File.Exists(NewConfigFilePath) && LoadJsonConfig(NewConfigFilePath))
{
ManualLogSource? logger = Logger;
if (logger != null)
{
logger.LogInfo((object)("已从Unity存档位置加载配置: " + NewConfigFilePath));
}
return;
}
if (File.Exists(BepInExConfigFilePath) && LoadJsonConfig(BepInExConfigFilePath))
{
ManualLogSource? logger2 = Logger;
if (logger2 != null)
{
logger2.LogInfo((object)("已从BepInEx配置目录加载配置: " + BepInExConfigFilePath));
}
SaveConfigWithoutUpdate();
ManualLogSource? logger3 = Logger;
if (logger3 != null)
{
logger3.LogInfo((object)("已将配置从BepInEx目录迁移到Unity存档位置: " + NewConfigFilePath));
}
try
{
File.Delete(BepInExConfigFilePath);
ManualLogSource? logger4 = Logger;
if (logger4 != null)
{
logger4.LogInfo((object)("已删除BepInEx配置文件: " + BepInExConfigFilePath));
}
return;
}
catch (Exception ex)
{
ManualLogSource? logger5 = Logger;
if (logger5 != null)
{
logger5.LogWarning((object)("删除BepInEx配置文件失败: " + ex.Message));
}
return;
}
}
if (!File.Exists(OldConfigFilePath))
{
return;
}
try
{
string[] array = File.ReadAllLines(OldConfigFilePath);
string[] array2 = array;
foreach (string text in array2)
{
if (!string.IsNullOrWhiteSpace(text))
{
string[] array3 = text.Split('=');
if (array3.Length == 2)
{
string key = array3[0].Trim();
bool value = array3[1].Trim().Equals("1", StringComparison.OrdinalIgnoreCase);
_decorationStates[key] = value;
}
}
}
if (_decorationStates.Count <= 0)
{
return;
}
ManualLogSource? logger6 = Logger;
if (logger6 != null)
{
logger6.LogInfo((object)$"已从旧文本格式加载配置,包含 {_decorationStates.Count} 个装饰物状态");
}
SaveConfigWithoutUpdate();
ManualLogSource? logger7 = Logger;
if (logger7 != null)
{
logger7.LogInfo((object)("已将旧文本格式配置迁移到新的JSON格式: " + NewConfigFilePath));
}
try
{
File.Delete(OldConfigFilePath);
ManualLogSource? logger8 = Logger;
if (logger8 != null)
{
logger8.LogInfo((object)("已删除旧文本配置文件: " + OldConfigFilePath));
}
}
catch (Exception ex2)
{
ManualLogSource? logger9 = Logger;
if (logger9 != null)
{
logger9.LogWarning((object)("删除旧文本配置文件失败: " + ex2.Message));
}
}
}
catch (Exception ex3)
{
ManualLogSource? logger10 = Logger;
if (logger10 != null)
{
logger10.LogError((object)("从旧文本格式加载配置时出错: " + ex3.Message));
}
}
}
catch (Exception ex4)
{
ManualLogSource? logger11 = Logger;
if (logger11 != null)
{
logger11.LogError((object)("加载配置时出错: " + ex4.Message));
}
_decorationStates.Clear();
}
}
private static bool LoadJsonConfig(string filePath)
{
//IL_0095: Expected O, but got Unknown
try
{
string text = File.ReadAllText(filePath);
Dictionary<string, bool> dictionary = JsonConvert.DeserializeObject<Dictionary<string, bool>>(text);
if (dictionary != null)
{
foreach (KeyValuePair<string, bool> item in dictionary)
{
_decorationStates[item.Key] = item.Value;
}
ManualLogSource? logger = Logger;
if (logger != null)
{
logger.LogInfo((object)$"已从JSON加载配置,包含 {_decorationStates.Count} 个装饰物状态");
}
return true;
}
}
catch (JsonException val)
{
JsonException val2 = val;
ManualLogSource? logger2 = Logger;
if (logger2 != null)
{
logger2.LogError((object)("解析JSON配置文件时出错: " + ((Exception)(object)val2).Message));
}
}
catch (Exception ex)
{
ManualLogSource? logger3 = Logger;
if (logger3 != null)
{
logger3.LogError((object)("加载JSON配置文件时出错: " + ex.Message));
}
}
return false;
}
public static void SaveConfig()
{
try
{
UpdateConfigData();
SaveToFile();
}
catch (Exception ex)
{
ManualLogSource? logger = Logger;
if (logger != null)
{
logger.LogError((object)("保存配置时出错: " + ex.Message));
}
}
}
private static void SaveConfigWithoutUpdate()
{
try
{
SaveToFile();
}
catch (Exception ex)
{
ManualLogSource? logger = Logger;
if (logger != null)
{
logger.LogError((object)("保存配置时出错: " + ex.Message));
}
}
}
private static void SaveToFile()
{
try
{
EnsureModDataDirectoryExists();
string contents = JsonConvert.SerializeObject((object)_decorationStates, (Formatting)1);
File.WriteAllText(NewConfigFilePath, contents);
}
catch (Exception ex)
{
ManualLogSource? logger = Logger;
if (logger != null)
{
logger.LogError((object)("写入配置文件时出错: " + ex.Message));
}
}
}
private static void UpdateConfigData()
{
_decorationStates.Clear();
foreach (DecorationInfo decoration in HeadDecorationManager.Decorations)
{
_decorationStates[decoration.Name] = decoration.IsVisible;
}
}
private static void ApplySavedStates()
{
try
{
int num = 0;
foreach (DecorationInfo decoration in HeadDecorationManager.Decorations)
{
if (_decorationStates.TryGetValue(decoration.Name, out var value))
{
decoration.IsVisible = value;
num++;
}
}
if (num > 0)
{
ManualLogSource? logger = Logger;
if (logger != null)
{
logger.LogInfo((object)$"已应用 {num} 个已保存的装饰物状态");
}
}
}
catch (Exception ex)
{
ManualLogSource? logger2 = Logger;
if (logger2 != null)
{
logger2.LogError((object)("应用已保存的装饰物状态时出错: " + ex.Message));
}
}
}
}
public static class DecorationUtils
{
private const string HEAD_NODE_PATH = "[RIG]/code_lean/code_tilt/ANIM BOT/_____________________________________/ANIM BODY BOT/_____________________________________/ANIM BODY TOP/code_body_top_up/code_body_top_side/_____________________________________/ANIM HEAD BOT/code_head_bot_up/code_head_bot_side/_____________________________________/ANIM HEAD TOP/code_head_top";
private const string NECK_NODE_PATH = "[RIG]/code_lean/code_tilt/ANIM BOT/_____________________________________/ANIM BODY BOT/_____________________________________/ANIM BODY TOP/code_body_top_up/code_body_top_side/_____________________________________/ANIM HEAD BOT/code_head_bot_up/code_head_bot_side";
private const string BODY_NODE_PATH = "[RIG]/code_lean/code_tilt/ANIM BOT/_____________________________________/ANIM BODY BOT/_____________________________________/ANIM BODY TOP/code_body_top_up/code_body_top_side/ANIM BODY TOP SCALE";
private const string HIP_NODE_PATH = "[RIG]/code_lean/code_tilt/ANIM BOT/_____________________________________/ANIM BODY BOT";
private const string WORLD_NODE_PATH = "[RIG]/code_lean/code_tilt/ANIM BOT";
public static Dictionary<string, Transform> GetDecorationParentNodes(Transform rootTransform)
{
Dictionary<string, Transform> dictionary = new Dictionary<string, Transform>();
Transform val = rootTransform.Find("[RIG]/code_lean/code_tilt/ANIM BOT/_____________________________________/ANIM BODY BOT/_____________________________________/ANIM BODY TOP/code_body_top_up/code_body_top_side/_____________________________________/ANIM HEAD BOT/code_head_bot_up/code_head_bot_side/_____________________________________/ANIM HEAD TOP/code_head_top");
if ((Object)(object)val != (Object)null)
{
dictionary["head"] = val;
}
Transform val2 = rootTransform.Find("[RIG]/code_lean/code_tilt/ANIM BOT/_____________________________________/ANIM BODY BOT/_____________________________________/ANIM BODY TOP/code_body_top_up/code_body_top_side/_____________________________________/ANIM HEAD BOT/code_head_bot_up/code_head_bot_side");
if ((Object)(object)val2 != (Object)null)
{
dictionary["neck"] = val2;
}
Transform val3 = rootTransform.Find("[RIG]/code_lean/code_tilt/ANIM BOT/_____________________________________/ANIM BODY BOT/_____________________________________/ANIM BODY TOP/code_body_top_up/code_body_top_side/ANIM BODY TOP SCALE");
if ((Object)(object)val3 != (Object)null)
{
dictionary["body"] = val3;
}
Transform val4 = rootTransform.Find("[RIG]/code_lean/code_tilt/ANIM BOT/_____________________________________/ANIM BODY BOT");
if ((Object)(object)val4 != (Object)null)
{
dictionary["hip"] = val4;
}
Transform val5 = rootTransform.Find("[RIG]/code_lean/code_tilt/ANIM BOT");
if ((Object)(object)val5 != (Object)null)
{
if (!Object.op_Implicit((Object)(object)((Component)val5).GetComponent<WorldSpaceFollower>()))
{
((Component)val5).gameObject.AddComponent<WorldSpaceFollower>();
}
dictionary["world"] = val5;
}
return dictionary;
}
public static void EnsureDecorationContainers(Dictionary<string, Transform> parentNodes)
{
//IL_003b: Unknown result type (might be due to invalid IL or missing references)
//IL_0050: Unknown result type (might be due to invalid IL or missing references)
//IL_005c: Unknown result type (might be due to invalid IL or missing references)
//IL_0068: Unknown result type (might be due to invalid IL or missing references)
foreach (KeyValuePair<string, Transform> parentNode in parentNodes)
{
Transform value = parentNode.Value;
Transform val = value.Find("HeadDecorations");
if ((Object)(object)val == (Object)null)
{
val = new GameObject("HeadDecorations").transform;
val.SetParent(value, false);
val.localPosition = Vector3.zero;
val.localRotation = Quaternion.identity;
val.localScale = Vector3.one;
}
}
}
public static void UpdateDecoration(Transform parent, string decorationName, bool showDecoration)
{
Transform val = parent.Find(decorationName);
if ((Object)(object)val != (Object)null && ((Component)val).gameObject.activeSelf != showDecoration)
{
((Component)val).gameObject.SetActive(showDecoration);
}
}
}
public class WorldSpaceFollower : MonoBehaviour
{
private Transform? _rootTransform;
private Vector3 _initialOffset;
private void Start()
{
//IL_002a: Unknown result type (might be due to invalid IL or missing references)
//IL_0035: Unknown result type (might be due to invalid IL or missing references)
//IL_003a: Unknown result type (might be due to invalid IL or missing references)
//IL_003f: Unknown result type (might be due to invalid IL or missing references)
//IL_004a: Unknown result type (might be due to invalid IL or missing references)
//IL_005b: Unknown result type (might be due to invalid IL or missing references)
_rootTransform = ((Component)this).transform.parent;
if ((Object)(object)_rootTransform != (Object)null)
{
_initialOffset = ((Component)this).transform.position - _rootTransform.position;
((Component)this).transform.rotation = Quaternion.identity;
((Component)this).transform.localScale = Vector3.one;
}
}
private void LateUpdate()
{
//IL_001e: Unknown result type (might be due to invalid IL or missing references)
//IL_0024: Unknown result type (might be due to invalid IL or missing references)
//IL_0029: Unknown result type (might be due to invalid IL or missing references)
//IL_0045: Unknown result type (might be due to invalid IL or missing references)
//IL_0054: Unknown result type (might be due to invalid IL or missing references)
//IL_0065: Unknown result type (might be due to invalid IL or missing references)
if ((Object)(object)_rootTransform != (Object)null)
{
((Component)this).transform.position = _rootTransform.position + _initialOffset;
((Component)this).transform.rotation = Quaternion.Euler(0f, _rootTransform.eulerAngles.y, 0f);
((Component)this).transform.localScale = Vector3.one;
}
}
}
public class DecorationInfo
{
public string? Name { get; set; }
public string? DisplayName { get; set; }
public bool IsVisible { get; set; }
public GameObject? Prefab { get; set; }
public string? ParentTag { get; set; }
public string? BundlePath { get; set; }
}
public static class HeadDecorationManager
{
private static Dictionary<string?, string> parentPathMap = new Dictionary<string, string>
{
{ "head", "[RIG]/code_lean/code_tilt/ANIM BOT/_____________________________________/ANIM BODY BOT/_____________________________________/ANIM BODY TOP/code_body_top_up/code_body_top_side/_____________________________________/ANIM HEAD BOT/code_head_bot_up/code_head_bot_side/_____________________________________/ANIM HEAD TOP/code_head_top" },
{ "neck", "[RIG]/code_lean/code_tilt/ANIM BOT/_____________________________________/ANIM BODY BOT/_____________________________________/ANIM BODY TOP/code_body_top_up/code_body_top_side/_____________________________________/ANIM HEAD BOT/code_head_bot_up/code_head_bot_side" },
{ "body", "[RIG]/code_lean/code_tilt/ANIM BOT/_____________________________________/ANIM BODY BOT/_____________________________________/ANIM BODY TOP/code_body_top_up/code_body_top_side/ANIM BODY TOP SCALE" },
{ "hip", "[RIG]/code_lean/code_tilt/ANIM BOT/_____________________________________/ANIM BODY BOT" },
{ "world", "[RIG]/code_lean/code_tilt/ANIM BOT" }
};
private static ManualLogSource? Logger => Morehead.Logger;
public static List<DecorationInfo> Decorations { get; private set; } = new List<DecorationInfo>();
public static void Initialize()
{
try
{
ManualLogSource? logger = Logger;
if (logger != null)
{
logger.LogInfo((object)"正在初始化装饰物管理器...");
}
Decorations.Clear();
LoadAllDecorations();
ManualLogSource? logger2 = Logger;
if (logger2 != null)
{
logger2.LogInfo((object)$"装饰物管理器初始化完成,共加载了 {Decorations.Count} 个装饰物");
}
}
catch (Exception ex)
{
ManualLogSource? logger3 = Logger;
if (logger3 != null)
{
logger3.LogError((object)("初始化装饰物管理器时出错: " + ex.Message));
}
}
}
private static void LoadAllDecorations()
{
try
{
Morehead? instance = Morehead.Instance;
string directoryName = Path.GetDirectoryName((instance != null) ? ((BaseUnityPlugin)instance).Info.Location : null);
if (string.IsNullOrEmpty(directoryName))
{
ManualLogSource? logger = Logger;
if (logger != null)
{
logger.LogError((object)"无法获取MOD所在目录");
}
return;
}
string text = Path.Combine(directoryName, "Decorations");
if (!Directory.Exists(text))
{
Directory.CreateDirectory(text);
ManualLogSource? logger2 = Logger;
if (logger2 != null)
{
logger2.LogInfo((object)("已创建装饰物目录: " + text));
}
}
List<string> list = new List<string>();
string[] files = Directory.GetFiles(text, "*.hhh");
list.AddRange(files);
try
{
string pluginPath = Paths.PluginPath;
if (!string.IsNullOrEmpty(pluginPath) && Directory.Exists(pluginPath))
{
string[] files2 = Directory.GetFiles(pluginPath, "*.hhh", SearchOption.AllDirectories);
list.AddRange(files2);
ManualLogSource? logger3 = Logger;
if (logger3 != null)
{
logger3.LogInfo((object)$"在plugins目录中找到 {files2.Length} 个.hhh文件");
}
}
else
{
ManualLogSource? logger4 = Logger;
if (logger4 != null)
{
logger4.LogWarning((object)"无法找到BepInEx/plugins目录,将只加载本地装饰物");
}
}
}
catch (Exception ex)
{
ManualLogSource? logger5 = Logger;
if (logger5 != null)
{
logger5.LogError((object)("搜索plugins目录时出错: " + ex.Message));
}
}
list = list.Distinct().ToList();
if (list.Count == 0)
{
ManualLogSource? logger6 = Logger;
if (logger6 != null)
{
logger6.LogWarning((object)"未找到任何装饰物包文件,请确保.hhh文件已放置");
}
}
else
{
ManualLogSource? logger7 = Logger;
if (logger7 != null)
{
logger7.LogInfo((object)$"找到 {list.Count} 个装饰物包文件");
}
if (files.Length != 0)
{
ManualLogSource? logger8 = Logger;
if (logger8 != null)
{
logger8.LogInfo((object)$"- Decorations目录: {files.Length} 个文件");
}
}
}
foreach (string item in list)
{
LoadDecorationBundle(item);
}
}
catch (Exception ex2)
{
ManualLogSource? logger9 = Logger;
if (logger9 != null)
{
logger9.LogError((object)("加载装饰物时出错: " + ex2.Message));
}
}
}
private static void LoadDecorationBundle(string bundlePath)
{
AssetBundle val = null;
try
{
if (!File.Exists(bundlePath))
{
ManualLogSource? logger = Logger;
if (logger != null)
{
logger.LogWarning((object)("文件不存在: " + bundlePath));
}
return;
}
FileInfo fileInfo = new FileInfo(bundlePath);
if (fileInfo.Length < 1024)
{
ManualLogSource? logger2 = Logger;
if (logger2 != null)
{
logger2.LogWarning((object)$"文件过小,可能不是有效的AssetBundle: {bundlePath}, 大小: {fileInfo.Length} 字节");
}
return;
}
string fileNameWithoutExtension = Path.GetFileNameWithoutExtension(bundlePath);
string parentTag = "head";
string text = fileNameWithoutExtension;
if (fileNameWithoutExtension.Contains("_"))
{
string[] array = fileNameWithoutExtension.Split('_');
if (array.Length >= 2)
{
string text2 = array[^1].ToLower();
if (parentPathMap.ContainsKey(text2))
{
parentTag = text2;
text = string.Join("_", array, 0, array.Length - 1);
}
}
}
string text3 = EnsureUniqueName(text);
if (text3 != text)
{
ManualLogSource? logger3 = Logger;
if (logger3 != null)
{
logger3.LogWarning((object)("检测到重名,将基础名称从 " + text + " 修改为 " + text3));
}
text = text3;
}
try
{
val = AssetBundle.LoadFromFile(bundlePath);
if ((Object)(object)val == (Object)null)
{
ManualLogSource? logger4 = Logger;
if (logger4 != null)
{
logger4.LogError((object)("无法加载AssetBundle,文件可能已损坏或不是有效的AssetBundle: " + bundlePath));
}
return;
}
}
catch (Exception ex)
{
ManualLogSource? logger5 = Logger;
if (logger5 != null)
{
logger5.LogError((object)("加载AssetBundle时出错,文件可能不是有效的AssetBundle: " + bundlePath + ", 错误: " + ex.Message));
}
return;
}
try
{
string[] allAssetNames;
try
{
allAssetNames = val.GetAllAssetNames();
}
catch (Exception ex2)
{
ManualLogSource? logger6 = Logger;
if (logger6 != null)
{
logger6.LogError((object)("获取AssetBundle资源名称时出错: " + bundlePath + ", 错误: " + ex2.Message));
}
val.Unload(true);
return;
}
if (allAssetNames.Length == 0)
{
ManualLogSource? logger7 = Logger;
if (logger7 != null)
{
logger7.LogWarning((object)("AssetBundle不包含任何资源: " + bundlePath));
}
val.Unload(true);
return;
}
bool flag = false;
GameObject val2 = null;
string[] array2 = allAssetNames;
foreach (string text4 in array2)
{
try
{
val2 = val.LoadAsset<GameObject>(text4);
if ((Object)(object)val2 != (Object)null)
{
flag = true;
break;
}
}
catch (Exception ex3)
{
ManualLogSource? logger8 = Logger;
if (logger8 != null)
{
logger8.LogWarning((object)("加载资源 " + text4 + " 时出错: " + ex3.Message));
}
}
}
if (!flag || (Object)(object)val2 == (Object)null)
{
ManualLogSource? logger9 = Logger;
if (logger9 != null)
{
logger9.LogWarning((object)("AssetBundle不包含有效的GameObject资源: " + bundlePath));
}
val.Unload(true);
return;
}
string text5 = ((Object)val2).name;
string text6 = EnsureUniqueDisplayName(text5);
if (text6 != text5)
{
ManualLogSource? logger10 = Logger;
if (logger10 != null)
{
logger10.LogWarning((object)("检测到显示名称重复,将显示名称从 " + text5 + " 修改为 " + text6));
}
text5 = text6;
}
DecorationInfo decorationInfo = new DecorationInfo
{
Name = text,
DisplayName = text5,
IsVisible = false,
Prefab = val2,
ParentTag = parentTag,
BundlePath = bundlePath
};
Decorations.Add(decorationInfo);
ManualLogSource? logger11 = Logger;
if (logger11 != null)
{
logger11.LogInfo((object)("成功加载装饰物: " + decorationInfo.DisplayName + ", 标签: " + decorationInfo.ParentTag));
}
val.Unload(false);
}
catch (Exception ex4)
{
ManualLogSource? logger12 = Logger;
if (logger12 != null)
{
logger12.LogError((object)("处理AssetBundle时出错: " + ex4.Message));
}
if ((Object)(object)val != (Object)null)
{
val.Unload(true);
}
}
}
catch (Exception ex5)
{
ManualLogSource? logger13 = Logger;
if (logger13 != null)
{
logger13.LogError((object)("加载装饰物包时出错: " + ex5.Message + ", 路径: " + bundlePath));
}
if ((Object)(object)val != (Object)null)
{
val.Unload(true);
}
}
}
private static string EnsureUniqueName(string baseName)
{
string name = baseName;
int num = 1;
while (Decorations.Any((DecorationInfo d) => d.Name != null && d.Name.Equals(name, StringComparison.OrdinalIgnoreCase)))
{
name = $"{baseName}({num})";
num++;
}
return name;
}
private static string EnsureUniqueDisplayName(string baseDisplayName)
{
string displayName = baseDisplayName;
int num = 1;
while (Decorations.Any((DecorationInfo d) => d.DisplayName != null && d.DisplayName.Equals(displayName, StringComparison.OrdinalIgnoreCase)))
{
displayName = $"{baseDisplayName}({num})";
num++;
}
return displayName;
}
private static string? GetParentTagFromPrefab(GameObject prefab)
{
string text = ((Object)prefab).name.ToLower();
foreach (string key in parentPathMap.Keys)
{
if (key != null && text.Contains(key))
{
return key;
}
}
return null;
}
public static bool GetDecorationState(string? name)
{
string name2 = name;
DecorationInfo decorationInfo = Decorations.FirstOrDefault((DecorationInfo d) => d.Name != null && d.Name.Equals(name2, StringComparison.OrdinalIgnoreCase));
if (decorationInfo == null)
{
ManualLogSource? logger = Logger;
if (logger != null)
{
logger.LogWarning((object)("GetDecorationState: 找不到装饰物 " + name2));
}
}
return decorationInfo?.IsVisible ?? false;
}
public static void SetDecorationState(string name, bool isVisible)
{
string name2 = name;
DecorationInfo decorationInfo = Decorations.FirstOrDefault((DecorationInfo d) => d.Name != null && d.Name.Equals(name2, StringComparison.OrdinalIgnoreCase));
if (decorationInfo != null)
{
decorationInfo.IsVisible = isVisible;
ManualLogSource? logger = Logger;
if (logger != null)
{
logger.LogInfo((object)$"设置装饰物 {decorationInfo.DisplayName} 显示状态为: {isVisible}");
}
}
else
{
ManualLogSource? logger2 = Logger;
if (logger2 != null)
{
logger2.LogWarning((object)("SetDecorationState: 找不到装饰物 " + name2));
}
}
}
public static bool ToggleDecorationState(string? name)
{
string name2 = name;
DecorationInfo decorationInfo = Decorations.FirstOrDefault((DecorationInfo d) => d.Name != null && d.Name.Equals(name2, StringComparison.OrdinalIgnoreCase));
if (decorationInfo != null)
{
decorationInfo.IsVisible = !decorationInfo.IsVisible;
return decorationInfo.IsVisible;
}
ManualLogSource? logger = Logger;
if (logger != null)
{
logger.LogWarning((object)("ToggleDecorationState: 找不到装饰物 " + name2));
}
return false;
}
public static string GetParentPath(string parentTag)
{
if (parentPathMap.TryGetValue(parentTag.ToLower(), out string value))
{
return value;
}
return parentPathMap["head"];
}
public static void DisableAllDecorations()
{
try
{
int num = 0;
foreach (DecorationInfo decoration in Decorations)
{
if (decoration.IsVisible)
{
decoration.IsVisible = false;
num++;
}
}
}
catch (Exception ex)
{
ManualLogSource? logger = Logger;
if (logger != null)
{
logger.LogError((object)("关闭所有装饰物时出错: " + ex.Message));
}
}
}
}
public static class MoreHeadUI
{
private static REPOButton? menuButton;
private static REPOPopupPage? decorationsPage;
private static Dictionary<string?, REPOButton> decorationButtons = new Dictionary<string, REPOButton>();
private static string currentTagFilter = "ALL";
private static Dictionary<string, REPOButton> tagFilterButtons = new Dictionary<string, REPOButton>();
private static Dictionary<string, REPOPopupPage?> tagPageCache = new Dictionary<string, REPOPopupPage>();
private static Dictionary<string, Dictionary<string, REPOButton>> tagPageButtonCache = new Dictionary<string, Dictionary<string, REPOButton>>();
private const string BUTTON_NAME = "<color=#FF0000>M</color><color=#FF3300>O</color><color=#FF6600>R</color><color=#FF9900>E</color><color=#FFCC00>H</color><color=#FFDD00>E</color><color=#FFEE00>A</color><color=#FFFF00>D</color>";
private const string PAGE_TITLE = "Rotate robot: A/D";
private static readonly string[] ALL_TAGS = new string[6] { "ALL", "HEAD", "NECK", "BODY", "HIP", "WORLD" };
private static ManualLogSource? Logger => Morehead.Logger;
public static void Initialize()
{
//IL_0013: Unknown result type (might be due to invalid IL or missing references)
//IL_001d: Expected O, but got Unknown
//IL_002c: Unknown result type (might be due to invalid IL or missing references)
//IL_0048: Unknown result type (might be due to invalid IL or missing references)
//IL_0052: Expected O, but got Unknown
try
{
menuButton = new REPOButton("<color=#FF0000>M</color><color=#FF3300>O</color><color=#FF6600>R</color><color=#FF9900>E</color><color=#FFCC00>H</color><color=#FFDD00>E</color><color=#FFEE00>A</color><color=#FFFF00>D</color>", (Action)OnMenuButtonClick);
MenuAPI.AddElementToEscapeMenu((REPOElement)(object)menuButton, new Vector2(0f, 0f));
decorationsPage = new REPOPopupPage("Rotate robot: A/D", (Action<REPOPopupPage>)SetupPopupPage);
PreCreateTagPages();
}
catch (Exception ex)
{
ManualLogSource? logger = Logger;
if (logger != null)
{
logger.LogError((object)("初始化UI时出错: " + ex.Message));
}
}
}
private static void PreCreateTagPages()
{
//IL_002e: Unknown result type (might be due to invalid IL or missing references)
//IL_0034: Expected O, but got Unknown
try
{
tagPageCache.Clear();
string[] aLL_TAGS = ALL_TAGS;
foreach (string text in aLL_TAGS)
{
REPOPopupPage val = new REPOPopupPage("Rotate robot: A/D", (Action<REPOPopupPage>)SetupPopupPage);
string text2 = currentTagFilter;
currentTagFilter = text;
CreatePageContentForTag(val, text);
tagPageCache[text] = val;
currentTagFilter = text2;
}
}
catch (Exception ex)
{
ManualLogSource? logger = Logger;
if (logger != null)
{
logger.LogError((object)("预创建标签页面缓存时出错: " + ex.Message));
}
}
}
private static void SetupPopupPage(REPOPopupPage page)
{
//IL_000d: Unknown result type (might be due to invalid IL or missing references)
//IL_0035: Unknown result type (might be due to invalid IL or missing references)
try
{
page.SetSize(new Vector2(300f, 350f));
page.SetBackgroundDimming(true);
page.SetMaskPadding((Padding?)new Padding(10f, 50f, 20f, 10f));
AddAuthorCredit(page);
}
catch (Exception ex)
{
ManualLogSource? logger = Logger;
if (logger != null)
{
logger.LogError((object)("设置弹出页面属性时出错: " + ex.Message));
}
}
}
private static void AddAuthorCredit(REPOPopupPage page)
{
//IL_0026: Unknown result type (might be due to invalid IL or missing references)
//IL_002c: Expected O, but got Unknown
//IL_0038: Unknown result type (might be due to invalid IL or missing references)
try
{
REPOButton val = new REPOButton("<size=10><color=#FFFFA0>Masaicker</color> and <color=#FFFFA0>Yuriscat</color> co-developed.\n由<color=#FFFFA0>马赛克了</color>和<color=#FFFFA0>尤里的猫</color>共同制作。</size>", (Action)delegate
{
});
((REPOSimplePage)page).AddElementToPage((REPOElement)(object)val, new Vector2(300f, 345f));
try
{
MenuManager obj = Object.FindObjectOfType<MenuManager>();
if (obj != null)
{
((MonoBehaviour)obj).StartCoroutine(DelayedStyleAuthorCredit(val));
}
}
catch (Exception ex)
{
ManualLogSource? logger = Logger;
if (logger != null)
{
logger.LogWarning((object)("无法修改作者标记样式: " + ex.Message));
}
}
}
catch (Exception ex2)
{
ManualLogSource? logger2 = Logger;
if (logger2 != null)
{
logger2.LogError((object)("添加作者标记时出错: " + ex2.Message));
}
}
}
private static IEnumerator DelayedStyleAuthorCredit(REPOButton button)
{
yield return null;
try
{
GameObject buttonObj = null;
Button[] allButtons = Object.FindObjectsOfType<Button>();
Button[] array = allButtons;
foreach (Button btn in array)
{
if (((Object)btn).name.Contains("Masaicker") && ((Object)btn).name.Contains("Yuriscat"))
{
buttonObj = ((Component)btn).gameObject;
break;
}
}
if (!((Object)(object)buttonObj != (Object)null))
{
yield break;
}
Button buttonComponent = buttonObj.GetComponent<Button>();
if (!((Object)(object)buttonComponent != (Object)null))
{
yield break;
}
((Selectable)buttonComponent).interactable = false;
Image[] images = buttonObj.GetComponentsInChildren<Image>();
Image[] array2 = images;
foreach (Image image in array2)
{
if ((Object)(object)((Component)image).gameObject != (Object)(object)((Component)buttonComponent).gameObject)
{
((Behaviour)image).enabled = false;
}
}
}
catch (Exception e)
{
ManualLogSource? logger = Logger;
if (logger != null)
{
logger.LogWarning((object)("修改作者标记样式失败: " + e.Message));
}
}
}
private static void OnMenuButtonClick()
{
//IL_0033: Unknown result type (might be due to invalid IL or missing references)
//IL_003d: Expected O, but got Unknown
try
{
if (tagPageCache.TryGetValue(currentTagFilter, out REPOPopupPage value))
{
decorationsPage = value;
}
else
{
decorationsPage = new REPOPopupPage("Rotate robot: A/D", (Action<REPOPopupPage>)SetupPopupPage);
CreatePageContent();
}
REPOPopupPage? obj = decorationsPage;
if (obj != null)
{
((REPOSimplePage)obj).OpenPage(false);
}
SetHeaderPosition();
MovePlayerAvatarToFront();
AdjustMenuScrollBoxPosition();
UpdateButtonStates();
}
catch (Exception ex)
{
ManualLogSource? logger = Logger;
if (logger != null)
{
logger.LogError((object)("打开设置页面时出错: " + ex.Message));
}
}
}
private static void SetHeaderPosition()
{
try
{
MonoBehaviour obj = Object.FindObjectOfType<MonoBehaviour>();
if (obj != null)
{
obj.StartCoroutine(DelayedSetHeaderPosition());
}
}
catch (Exception ex)
{
ManualLogSource? logger = Logger;
if (logger != null)
{
logger.LogError((object)("设置标题位置时出错: " + ex.Message));
}
}
}
private static IEnumerator DelayedSetHeaderPosition()
{
yield return null;
try
{
FieldInfo headerTransformField = typeof(REPOPopupPage).GetField("headerTransform", BindingFlags.Instance | BindingFlags.NonPublic);
if (headerTransformField != null)
{
object? value = headerTransformField.GetValue(decorationsPage);
RectTransform headerTransform = (RectTransform)((value is RectTransform) ? value : null);
if ((Object)(object)headerTransform != (Object)null)
{
((Transform)headerTransform).localPosition = new Vector3(185.5049f, 360f, 0f);
yield break;
}
ManualLogSource? logger = Logger;
if (logger != null)
{
logger.LogWarning((object)"headerTransform为空");
}
}
else
{
ManualLogSource? logger2 = Logger;
if (logger2 != null)
{
logger2.LogWarning((object)"找不到headerTransform字段");
}
}
}
catch (Exception e)
{
ManualLogSource? logger3 = Logger;
if (logger3 != null)
{
logger3.LogError((object)("延迟设置标题位置时出错: " + e.Message));
}
}
}
private static void CreatePageContent()
{
CreatePageContentForTag(decorationsPage, currentTagFilter);
}
private static void CreatePageContentForTag(REPOPopupPage? page, string tag)
{
//IL_0183: Unknown result type (might be due to invalid IL or missing references)
//IL_0189: Expected O, but got Unknown
//IL_019a: Unknown result type (might be due to invalid IL or missing references)
//IL_01b6: Unknown result type (might be due to invalid IL or missing references)
//IL_01bc: Expected O, but got Unknown
//IL_00d2: Unknown result type (might be due to invalid IL or missing references)
//IL_00d9: Expected O, but got Unknown
//IL_01cd: Unknown result type (might be due to invalid IL or missing references)
//IL_00f3: Unknown result type (might be due to invalid IL or missing references)
try
{
int num = 0;
decorationButtons.Clear();
if (!tagPageButtonCache.ContainsKey(tag))
{
tagPageButtonCache[tag] = new Dictionary<string, REPOButton>();
}
else
{
tagPageButtonCache[tag].Clear();
}
for (int i = 0; i < HeadDecorationManager.Decorations.Count; i++)
{
DecorationInfo decoration = HeadDecorationManager.Decorations[i];
if (tag == "ALL" || decoration.ParentTag?.ToLower() == tag.ToLower())
{
REPOButton val = new REPOButton(GetButtonText(decoration, decoration.IsVisible), (Action)delegate
{
OnDecorationButtonClick(decoration.Name);
});
int num2 = -(60 + num * 20);
if (page != null)
{
page.AddElementToScrollView((REPOElement)(object)val, new Vector2(0f, (float)num2));
}
decorationButtons[decoration.Name ?? string.Empty] = val;
tagPageButtonCache[tag][decoration.Name ?? string.Empty] = val;
num++;
}
}
CreateTagFilterButtons(page);
REPOButton val2 = new REPOButton("<size=18><color=#FFFFFF>C</color><color=#E6E6E6>L</color><color=#CCCCCC>O</color><color=#B3B3B3>S</color><color=#999999>E</color></size>", (Action)OnCloseButtonClick);
if (page != null)
{
((REPOSimplePage)page).AddElementToPage((REPOElement)(object)val2, new Vector2(301f, 0f));
}
REPOButton val3 = new REPOButton("<size=18><color=#FFAA00>CLEAR ALL</color></size>", (Action)OnDisableAllButtonClick);
if (page != null)
{
((REPOSimplePage)page).AddElementToPage((REPOElement)(object)val3, new Vector2(401f, 0f));
}
}
catch (Exception ex)
{
ManualLogSource? logger = Logger;
if (logger != null)
{
logger.LogError((object)("创建页面内容时出错: " + ex.Message));
}
}
}
private static void CreateTagFilterButtons(REPOPopupPage? page)
{
//IL_0146: Unknown result type (might be due to invalid IL or missing references)
//IL_014d: Expected O, but got Unknown
//IL_0166: Unknown result type (might be due to invalid IL or missing references)
try
{
tagFilterButtons.Clear();
for (int i = 0; i < ALL_TAGS.Length; i++)
{
string text = ALL_TAGS[i];
string text2 = text.ToLower();
if (1 == 0)
{
}
string text3 = text2 switch
{
"head" => "#00AAFF",
"neck" => "#AA00FF",
"body" => "#FFAA00",
"hip" => "#FF00AA",
"world" => "#00FFAA",
_ => "#FFFFFF",
};
if (1 == 0)
{
}
string text4 = text3;
string text5 = ((text2 == currentTagFilter.ToLower()) ? ("<size=14><b><color=" + text4 + ">" + text + "</color></b></size>") : ("<size=14><color=" + text4 + "50>" + text + "</color></size>"));
string tagForCallback = ((text2 == "all") ? "ALL" : text);
REPOButton val = new REPOButton(text5, (Action)delegate
{
OnTagFilterButtonClick(tagForCallback);
});
int num = 70 + i * 40;
if (page != null)
{
((REPOSimplePage)page).AddElementToPage((REPOElement)(object)val, new Vector2((float)num, 20f));
}
tagFilterButtons[tagForCallback] = val;
}
}
catch (Exception ex)
{
ManualLogSource? logger = Logger;
if (logger != null)
{
logger.LogError((object)("创建标签筛选按钮时出错: " + ex.Message));
}
}
}
private static void OnTagFilterButtonClick(string tag)
{
//IL_005c: Unknown result type (might be due to invalid IL or missing references)
//IL_0066: Expected O, but got Unknown
try
{
if (!(tag == currentTagFilter))
{
currentTagFilter = tag;
REPOPopupPage? obj = decorationsPage;
if (obj != null)
{
((REPOSimplePage)obj).ClosePage(true);
}
if (tagPageCache.TryGetValue(tag, out REPOPopupPage value))
{
decorationsPage = value;
}
else
{
decorationsPage = new REPOPopupPage("Rotate robot: A/D", (Action<REPOPopupPage>)SetupPopupPage);
CreatePageContent();
tagPageCache[tag] = decorationsPage;
}
REPOPopupPage? obj2 = decorationsPage;
if (obj2 != null)
{
((REPOSimplePage)obj2).OpenPage(false);
}
SetHeaderPosition();
MovePlayerAvatarToFront();
AdjustMenuScrollBoxPosition();
UpdateButtonStates();
}
}
catch (Exception ex)
{
ManualLogSource? logger = Logger;
if (logger != null)
{
logger.LogError((object)("切换标签筛选时出错: " + ex.Message));
}
}
}
private static void UpdateButtonStates()
{
try
{
if (decorationButtons.Count == 0)
{
return;
}
foreach (DecorationInfo decoration in HeadDecorationManager.Decorations)
{
if ((currentTagFilter == "ALL" || decoration.ParentTag?.ToLower() == currentTagFilter.ToLower()) && decorationButtons.TryGetValue(decoration.Name ?? string.Empty, out REPOButton value))
{
value.SetText(GetButtonText(decoration, decoration.IsVisible));
}
}
UpdateTagButtonHighlights();
}
catch (Exception ex)
{
ManualLogSource? logger = Logger;
if (logger != null)
{
logger.LogError((object)("更新按钮状态时出错: " + ex.Message));
}
}
}
private static void UpdateTagButtonHighlights()
{
try
{
string[] aLL_TAGS = ALL_TAGS;
foreach (string text in aLL_TAGS)
{
string text2 = ((text == "ALL") ? "ALL" : text);
if (tagFilterButtons.TryGetValue(text2, out REPOButton value))
{
string text3 = text.ToLower();
if (1 == 0)
{
}
string text4 = text3 switch
{
"head" => "#00AAFF",
"neck" => "#AA00FF",
"body" => "#FFAA00",
"hip" => "#FF00AA",
"world" => "#00FFAA",
_ => "#FFFFFF",
};
if (1 == 0)
{
}
string text5 = text4;
string text6 = ((text2 == currentTagFilter) ? ("<size=14><b><color=" + text5 + ">" + text + "</color></b></size>") : ("<size=14><color=" + text5 + "50>" + text + "</color></size>"));
value.SetText(text6);
}
}
}
catch (Exception ex)
{
ManualLogSource? logger = Logger;
if (logger != null)
{
logger.LogError((object)("更新标签按钮高亮状态时出错: " + ex.Message));
}
}
}
private static void OnDecorationButtonClick(string? decorationName)
{
string decorationName2 = decorationName;
try
{
DecorationInfo decorationInfo = HeadDecorationManager.Decorations.FirstOrDefault((DecorationInfo d) => d.Name != null && d.Name.Equals(decorationName2, StringComparison.OrdinalIgnoreCase));
if (decorationInfo == null)
{
ManualLogSource? logger = Logger;
if (logger != null)
{
logger.LogWarning((object)("OnDecorationButtonClick: 找不到装饰物: " + decorationName2));
}
return;
}
bool isEnabled = HeadDecorationManager.ToggleDecorationState(decorationName2);
foreach (KeyValuePair<string, Dictionary<string, REPOButton>> item in tagPageButtonCache)
{
string key = item.Key;
Dictionary<string, REPOButton> value = item.Value;
if ((key == "ALL" || decorationInfo.ParentTag?.ToLower() == key.ToLower()) && value.TryGetValue(decorationName2 ?? string.Empty, out var value2))
{
value2.SetText(GetButtonText(decorationInfo, isEnabled));
}
}
UpdateDecorations();
ConfigManager.SaveConfig();
}
catch (Exception ex)
{
ManualLogSource? logger2 = Logger;
if (logger2 != null)
{
logger2.LogError((object)("切换装饰物 " + decorationName2 + " 状态时出错: " + ex.Message));
}
}
}
private static string GetButtonText(DecorationInfo decoration, bool isEnabled)
{
string text = decoration.DisplayName?.ToUpper() ?? "UNKNOWN";
string text2 = decoration.ParentTag ?? "unknown";
string text3 = text2.ToLower();
if (1 == 0)
{
}
string text4 = text3 switch
{
"head" => "#00AAFF",
"neck" => "#AA00FF",
"body" => "#FFAA00",
"hip" => "#FF00AA",
"world" => "#00FFAA",
_ => "#AAAAAA",
};
if (1 == 0)
{
}
string text5 = text4;
return "<size=16>" + (isEnabled ? "<color=#00FF00>[+]</color>" : "<color=#FF0000>[-]</color>") + " <color=" + text5 + "><size=12>(" + text2 + ")</size></color> " + text + "</size>";
}
private static void OnCloseButtonClick()
{
try
{
MenuManager.instance.PageCloseAll();
}
catch (Exception ex)
{
ManualLogSource? logger = Logger;
if (logger != null)
{
logger.LogError((object)("关闭页面时出错: " + ex.Message));
}
}
}
private static void UpdateDecorations()
{
try
{
PlayerAvatar val = FindLocalPlayer();
if ((Object)(object)val != (Object)null)
{
PlayerUpdatePatch.UpdatePlayerDecorations(val);
HeadDecorationSync component = ((Component)val).GetComponent<HeadDecorationSync>();
if ((Object)(object)component != (Object)null)
{
component.SyncAllDecorations();
}
}
PlayerUpdatePatch.UpdateMenuPlayerDecorations();
}
catch (Exception ex)
{
ManualLogSource? logger = Logger;
if (logger != null)
{
logger.LogError((object)("更新装饰物状态时出错: " + ex.Message));
}
}
}
private static PlayerAvatar? FindLocalPlayer()
{
try
{
PlayerAvatar[] array = Object.FindObjectsOfType<PlayerAvatar>();
PlayerAvatar[] array2 = array;
foreach (PlayerAvatar val in array2)
{
if ((Object)(object)val?.photonView != (Object)null && val.photonView.IsMine)
{
return val;
}
}
}
catch (Exception ex)
{
ManualLogSource? logger = Logger;
if (logger != null)
{
logger.LogError((object)("查找本地玩家时出错: " + ex.Message));
}
}
return null;
}
private static void MovePlayerAvatarToFront()
{
try
{
MonoBehaviour obj = Object.FindObjectOfType<MonoBehaviour>();
if (obj != null)
{
obj.StartCoroutine(DelayedMovePlayerAvatarToFront());
}
}
catch (Exception ex)
{
ManualLogSource? logger = Logger;
if (logger != null)
{
logger.LogError((object)("移动玩家模型时出错: " + ex.Message));
}
}
}
private static IEnumerator DelayedMovePlayerAvatarToFront()
{
yield return null;
try
{
PlayerAvatarMenuHover playerAvatarHover = Object.FindObjectOfType<PlayerAvatarMenuHover>();
GameObject playerAvatarObj = null;
if ((Object)(object)playerAvatarHover != (Object)null)
{
playerAvatarObj = ((Component)((Component)playerAvatarHover).transform.parent).gameObject;
if (((Object)playerAvatarObj).name != "Menu Element Player Avatar")
{
playerAvatarObj = null;
}
}
if ((Object)(object)playerAvatarObj == (Object)null)
{
playerAvatarObj = GameObject.Find("Menu Element Player Avatar");
}
if ((Object)(object)playerAvatarObj != (Object)null)
{
object? value = AccessTools.Field(typeof(REPOPopupPage), "menuPage").GetValue(decorationsPage);
MenuPage menuPage = (MenuPage)((value is MenuPage) ? value : null);
if ((Object)(object)menuPage != (Object)null)
{
playerAvatarObj.transform.SetParent(((Component)menuPage).transform, true);
playerAvatarObj.transform.SetAsLastSibling();
playerAvatarObj.transform.localPosition = new Vector3(-76f, -30f, 0f);
}
}
else
{
ManualLogSource? logger = Logger;
if (logger != null)
{
logger.LogWarning((object)"找不到玩家模型对象");
}
}
}
catch (Exception e)
{
ManualLogSource? logger2 = Logger;
if (logger2 != null)
{
logger2.LogError((object)("延迟移动玩家模型时出错: " + e.Message));
}
}
}
private static void AdjustMenuScrollBoxPosition()
{
try
{
MonoBehaviour obj = Object.FindObjectOfType<MonoBehaviour>();
if (obj != null)
{
obj.StartCoroutine(DelayedAdjustMenuScrollBoxPosition());
}
}
catch (Exception ex)
{
ManualLogSource? logger = Logger;
if (logger != null)
{
logger.LogError((object)("调整MenuScrollBox位置时出错: " + ex.Message));
}
}
}
private static IEnumerator DelayedAdjustMenuScrollBoxPosition()
{
yield return null;
yield return null;
try
{
object? value = AccessTools.Field(typeof(REPOPopupPage), "menuScrollBox").GetValue(decorationsPage);
MenuScrollBox menuScrollBox = (MenuScrollBox)((value is MenuScrollBox) ? value : null);
if ((Object)(object)menuScrollBox != (Object)null)
{
RectTransform rectTransform = ((Component)menuScrollBox).GetComponent<RectTransform>();
if ((Object)(object)rectTransform != (Object)null)
{
Vector3 currentPosition2 = ((Transform)rectTransform).localPosition;
Vector3 newPosition2 = new Vector3(currentPosition2.x, currentPosition2.y + 20f, currentPosition2.z);
((Transform)rectTransform).localPosition = newPosition2;
yield break;
}
ManualLogSource? logger = Logger;
if (logger != null)
{
logger.LogWarning((object)"无法获取MenuScrollBox的RectTransform组件");
}
yield break;
}
ManualLogSource? logger2 = Logger;
if (logger2 != null)
{
logger2.LogWarning((object)"无法获取MenuScrollBox组件");
}
object? value2 = AccessTools.Field(typeof(REPOPopupPage), "menuPage").GetValue(decorationsPage);
MenuPage menuPage = (MenuPage)((value2 is MenuPage) ? value2 : null);
if (!((Object)(object)menuPage != (Object)null))
{
yield break;
}
ManualLogSource? logger3 = Logger;
if (logger3 != null)
{
logger3.LogInfo((object)"成功获取MenuPage组件,尝试查找MenuScrollBox");
}
foreach (Transform item in ((Component)menuPage).transform)
{
Transform child = item;
ManualLogSource? logger4 = Logger;
if (logger4 != null)
{
logger4.LogInfo((object)("找到子对象: " + ((Object)child).name));
}
if (!((Object)child).name.Contains("ScrollBox") && !((Object)(object)((Component)child).GetComponent<MenuScrollBox>() != (Object)null))
{
continue;
}
RectTransform scrollBoxTransform = (RectTransform)(object)((child is RectTransform) ? child : null);
if ((Object)(object)scrollBoxTransform != (Object)null)
{
Vector3 currentPosition = ((Transform)scrollBoxTransform).localPosition;
Vector3 newPosition = (((Transform)scrollBoxTransform).localPosition = new Vector3(currentPosition.x, currentPosition.y + 20f, currentPosition.z));
ManualLogSource? logger5 = Logger;
if (logger5 != null)
{
logger5.LogInfo((object)$"通过替代方法调整MenuScrollBox位置: 从 {currentPosition} 到 {newPosition}");
}
}
break;
}
}
catch (Exception e)
{
ManualLogSource? logger6 = Logger;
if (logger6 != null)
{
logger6.LogError((object)("调整MenuScrollBox位置时出错: " + e.Message + "\n" + e.StackTrace));
}
}
}
private static void OnDisableAllButtonClick()
{
try
{
HeadDecorationManager.DisableAllDecorations();
foreach (DecorationInfo decoration in HeadDecorationManager.Decorations)
{
foreach (KeyValuePair<string, Dictionary<string, REPOButton>> item in tagPageButtonCache)
{
string key = item.Key;
Dictionary<string, REPOButton> value = item.Value;
if ((key == "ALL" || decoration.ParentTag?.ToLower() == key.ToLower()) && value.TryGetValue(decoration.Name ?? string.Empty, out var value2))
{
value2.SetText(GetButtonText(decoration, isEnabled: false));
}
}
}
UpdateDecorations();
ConfigManager.SaveConfig();
}
catch (Exception ex)
{
ManualLogSource? logger = Logger;
if (logger != null)
{
logger.LogError((object)("关闭所有装饰物时出错: " + ex.Message));
}
}
}
}
}