using System; using System.Collections; using System.Collections.Generic; using System.Diagnostics; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using BepInEx; using BepInEx.Logging; using HarmonyLib; using Microsoft.CodeAnalysis; 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(".NETFramework,Version=v4.7.2", FrameworkDisplayName = ".NET Framework 4.7.2")] [assembly: AssemblyVersion("0.0.0.0")] [module: RefSafetyRules(11)] namespace Microsoft.CodeAnalysis { [CompilerGenerated] [Embedded] internal sealed class EmbeddedAttribute : Attribute { } } namespace System.Runtime.CompilerServices { [CompilerGenerated] [Embedded] [AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)] internal sealed class RefSafetyRulesAttribute : Attribute { public readonly int Version; public RefSafetyRulesAttribute(int P_0) { Version = P_0; } } } namespace PeakMenuChinese { internal static class ChineseDisplayNameIntegration { private static bool _patched; public static void Apply(ManualLogSource log) { try { if (!TryApply(log)) { StartRetryer(log); log.LogInfo((object)"[PEAK_MENU_中文物品名] PEAK_MENU_CN 尚未就绪,已启动延时重试挂载"); } } catch (Exception ex) { log.LogWarning((object)("[PEAK_MENU_中文物品名] 挂载流程异常(不影响其它功能): " + ex.Message)); } } internal static bool TryApply(ManualLogSource log) { //IL_0077: Unknown result type (might be due to invalid IL or missing references) //IL_007e: Expected O, but got Unknown //IL_0092: Unknown result type (might be due to invalid IL or missing references) //IL_0099: Expected O, but got Unknown if (_patched) { return true; } try { Type type = AccessTools.TypeByName("P.E.A.K_MENU.Features.ItemSpawn.ItemCatalogService"); if (type == null) { return false; } MethodInfo methodInfo = AccessTools.Method(type, "ResolveDisplayName", new Type[1] { typeof(Item) }, (Type[])null); if (methodInfo == null) { log.LogWarning((object)"[PEAK_MENU_中文物品名] 未找到 ResolveDisplayName(Item),跳过"); return false; } Harmony val = new Harmony("peakmenu.chinese.ChineseDisplayName"); HarmonyMethod val2 = new HarmonyMethod(typeof(ResolveDisplayNamePatch).GetMethod("Prefix")); val.Patch((MethodBase)methodInfo, val2, (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null); _patched = true; ForceRefreshCatalog(log); log.LogInfo((object)"[PEAK_MENU_中文物品名] 已挂载:PEAK_MENU_CN 物品列表将优先显示中文"); return true; } catch (Exception ex) { log.LogWarning((object)("[PEAK_MENU_中文物品名] 单次挂载尝试失败(将重试): " + ex.Message)); return false; } } private static void StartRetryer(ManualLogSource log) { //IL_0007: Unknown result type (might be due to invalid IL or missing references) //IL_000d: Expected O, but got Unknown try { GameObject val = new GameObject("ChinesePatchRetryer"); Object.DontDestroyOnLoad((Object)(object)val); ChinesePatchRetryer chinesePatchRetryer = val.AddComponent(); chinesePatchRetryer.Init(log); } catch (Exception ex) { log.LogWarning((object)("[PEAK_MENU_中文物品名] 启动重试器失败(将放弃中文补丁): " + ex.Message)); } } private static void ForceRefreshCatalog(ManualLogSource log) { try { Type type = AccessTools.TypeByName("P.E.A.K_MENU.Features.ItemSpawn.ItemSpawnRuntime"); if (type == null) { return; } PropertyInfo propertyInfo = AccessTools.Property(type, "Catalog"); if (propertyInfo == null || propertyInfo.GetGetMethod(nonPublic: true) == null) { return; } object value = propertyInfo.GetValue(null); if (value != null) { MethodInfo methodInfo = AccessTools.Method(value.GetType(), "ForceRefresh", (Type[])null, (Type[])null); if (!(methodInfo == null)) { methodInfo.Invoke(value, null); log.LogInfo((object)"[PEAK_MENU_中文物品名] 已强制刷新物品目录"); } } } catch (Exception ex) { log.LogWarning((object)("[PEAK_MENU_中文物品名] 强制刷新目录失败(可忽略): " + ex.Message)); } } internal static void ForceRefreshOnce(ManualLogSource log) { ForceRefreshCatalog(log); } } internal class ChinesePatchRetryer : MonoBehaviour { private ManualLogSource _log; private int _attempts; private const int MaxAttempts = 60; public void Init(ManualLogSource log) { _log = log; } private IEnumerator Start() { while (_attempts < 60) { _attempts++; if (ChineseDisplayNameIntegration.TryApply(_log)) { for (int i = 0; i < 10; i++) { ChineseDisplayNameIntegration.ForceRefreshOnce(_log); yield return (object)new WaitForSeconds(0.5f); } Object.Destroy((Object)(object)((Component)this).gameObject); yield break; } yield return (object)new WaitForSeconds(0.5f); } _log.LogWarning((object)"[PEAK_MENU_中文物品名] 多次重试仍未找到 PEAK_MENU_CN,放弃中文补丁(不影响其它功能)"); Object.Destroy((Object)(object)((Component)this).gameObject); } } internal static class ResolveDisplayNamePatch { public static bool Prefix(Item item, ref string __result) { try { if ((Object)(object)item != (Object)null) { string name = ((Object)item).name; if (!string.IsNullOrEmpty(name) && ChineseNameMap.Map.TryGetValue(name, out var value)) { __result = value; return false; } string name2 = item.GetName(); if (!string.IsNullOrEmpty(name2) && !name2.StartsWith("LOC:", StringComparison.OrdinalIgnoreCase)) { __result = name2; return false; } } } catch (Exception ex) { ManualLogSource log = Plugin.Log; if (log != null) { log.LogWarning((object)("[PEAK_MENU_中文物品名] 解析物品名异常: " + ex.Message)); } } return true; } } internal static class ChineseNameMap { public static readonly Dictionary Map = new Dictionary(StringComparer.OrdinalIgnoreCase) { { "AK", "AK 突击步枪" }, { "Apple Berry Weird", "怪味苹果莓" }, { "ClimbingChalk", "攀岩粉" }, { "Cure-Some", "缓和药剂" }, { "Darkberry", "暗莓" }, { "Energy Elixir", "能量精油" }, { "Lollipop_Evil", "邪糖果" }, { "Matchbook", "火柴盒" }, { "Painkillers", "止痛药" }, { "Skyberry", "天空莓" }, { "Wand of Wind", "风之杖" }, { "Warpsketball", "传送篮球" }, { "Wonderberry", "奇幻莓" }, { "WildDogMilk", "野生狗奶" } }; } [BepInPlugin("peakmenu.chinese", "PEAK_MENU_CN Plus", "1.0.0")] [BepInDependency(/*Could not decode attribute arguments.*/)] public class Plugin : BaseUnityPlugin { internal static ManualLogSource Log; private void Awake() { Log = ((BaseUnityPlugin)this).Logger; try { ChineseDisplayNameIntegration.Apply(Log); } catch (Exception ex) { Log.LogWarning((object)("[PEAK_MENU_CN Plus] 初始化失败(不影响游戏): " + ex.Message)); } } } }