Decompiled source of Radiance v0.2.1
Radiance.dll
Decompiled a week ago
The result has been truncated due to the large size, download it to view full contents!
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 System.Security; using System.Security.Permissions; using System.Text; using System.Text.RegularExpressions; using BepInEx; using BepInEx.Configuration; using BepInEx.Logging; using GlobalEnums; using HarmonyLib; using HutongGames.PlayMaker; using HutongGames.PlayMaker.Actions; using Microsoft.CodeAnalysis; using Radiance.Behaviours.Common; using Radiance.Behaviours.Fixed; using Radiance.Behaviours.ImmortalLight; using Radiance.Managers; using Radiance.Patches; using Radiance.Tools; using Satchel; using Satchel.Futils; using TeamCherry.Localization; using UnityEngine; using UnityEngine.Audio; using UnityEngine.Events; using UnityEngine.SceneManagement; [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 = ".NET Standard 2.1")] [assembly: AssemblyCompany("Radiance")] [assembly: AssemblyConfiguration("Debug")] [assembly: AssemblyFileVersion("0.2.1.0")] [assembly: AssemblyInformationalVersion("0.2.1+91f3f6a9060da0e21b6ffbce8e7c13bd955dbf9d")] [assembly: AssemblyProduct("Radiance")] [assembly: AssemblyTitle("Radiance")] [assembly: AssemblyMetadata("RepositoryUrl", "https://github.com/xieedechunniunai/Radiance")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("0.2.1.0")] [module: UnverifiableCode] [module: RefSafetyRules(11)] namespace Microsoft.CodeAnalysis { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] internal sealed class EmbeddedAttribute : Attribute { } } namespace System.Runtime.CompilerServices { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.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; } } } namespace BepInEx { [AttributeUsage(AttributeTargets.Class, Inherited = false, AllowMultiple = false)] [Conditional("CodeGeneration")] internal sealed class BepInAutoPluginAttribute : Attribute { public BepInAutoPluginAttribute(string? id = null, string? name = null, string? version = null) { } } } namespace BepInEx.Preloader.Core.Patching { [AttributeUsage(AttributeTargets.Class, Inherited = false, AllowMultiple = false)] [Conditional("CodeGeneration")] internal sealed class PatcherAutoPluginAttribute : Attribute { public PatcherAutoPluginAttribute(string? id = null, string? name = null, string? version = null) { } } } namespace Satchel { public static class FsmUtil { public static bool TryGetState(this PlayMakerFSM fsm, string stateName, out FsmState? state) { object obj; if (fsm == null) { obj = null; } else { Fsm fsm2 = fsm.Fsm; obj = ((fsm2 != null) ? fsm2.GetState(stateName) : null); } state = (FsmState?)obj; return state != null; } public static FsmState GetValidState(this PlayMakerFSM fsm, string stateName) { if (fsm.TryGetState(stateName, out FsmState state)) { return state; } throw new ArgumentException("FSM \"" + ((fsm != null) ? fsm.FsmName : null) + "\" does not have state \"" + stateName + "\""); } public static FsmTransition? GetTransition(this FsmState state, string onEventName) { if (((state != null) ? state.Transitions : null) == null) { return null; } FsmTransition[] transitions = state.Transitions; foreach (FsmTransition val in transitions) { if (((val != null) ? val.EventName : null) == onEventName) { return val; } } return null; } public static FsmTransition? GetTransition(this PlayMakerFSM fsm, string fromStateName, string onEventName) { return fsm.GetValidState(fromStateName).GetTransition(onEventName); } public static void ChangeTransition(this FsmState state, string onEventName, string toStateName) { FsmTransition val = state.GetTransition(onEventName) ?? throw new ArgumentException("State \"" + state.Name + "\" does not have transition \"" + onEventName + "\""); val.ToState = toStateName; val.ToFsmState = state.Fsm.GetState(toStateName); } public static void ChangeTransition(this PlayMakerFSM fsm, string fromStateName, string onEventName, string toStateName) { fsm.GetValidState(fromStateName).ChangeTransition(onEventName, toStateName); } public static void RemoveTransition(this FsmState state, string onEventName) { string onEventName2 = onEventName; if (((state != null) ? state.Transitions : null) != null && state.Transitions.Length != 0) { state.Transitions = state.Transitions.Where((FsmTransition t) => ((t != null) ? t.EventName : null) != onEventName2).ToArray(); } } public static void RemoveTransition(this PlayMakerFSM fsm, string fromStateName, string onEventName) { fsm.GetValidState(fromStateName).RemoveTransition(onEventName); } public static FsmStateAction GetAction(this FsmState state, int index) { return state.Actions[index]; } public static FsmStateAction GetAction(this PlayMakerFSM fsm, string stateName, int index) { return fsm.GetValidState(stateName).GetAction(index); } public static T? GetAction<T>(this FsmState state, int index) where T : FsmStateAction { FsmStateAction action = state.GetAction(index); return (T)(object)((action is T) ? action : null); } public static T? GetAction<T>(this PlayMakerFSM fsm, string stateName, int index) where T : FsmStateAction { FsmStateAction action = fsm.GetAction(stateName, index); return (T)(object)((action is T) ? action : null); } public static void InsertAction(this FsmState state, FsmStateAction action, int index) { if (state == null || action == null) { return; } FsmStateAction[] array = state.Actions ?? Array.Empty<FsmStateAction>(); index = Math.Clamp(index, 0, array.Length); List<FsmStateAction> list = new List<FsmStateAction>(array.Length + 1); for (int i = 0; i < array.Length; i++) { if (i == index) { list.Add(action); } list.Add(array[i]); } if (index == array.Length) { list.Add(action); } state.Actions = list.ToArray(); action.Init(state); } public static void InsertAction(this PlayMakerFSM fsm, string stateName, FsmStateAction action, int index) { fsm.GetValidState(stateName).InsertAction(action, index); } public static void RemoveAction(this FsmState state, int index) { if (((state != null) ? state.Actions : null) != null && index >= 0 && index < state.Actions.Length) { List<FsmStateAction> list = state.Actions.ToList(); list.RemoveAt(index); state.Actions = list.ToArray(); } } public static void RemoveAction(this PlayMakerFSM fsm, string stateName, int index) { fsm.GetValidState(stateName).RemoveAction(index); } public static void AddCustomAction(this FsmState state, Action method) { CustomFsmAction action = new CustomFsmAction { method = method }; FsmStateAction[] actions = state.Actions; state.InsertAction((FsmStateAction)(object)action, (actions != null) ? actions.Length : 0); } public static void AddCustomAction(this PlayMakerFSM fsm, string stateName, Action method) { fsm.GetValidState(stateName).AddCustomAction(method); } public static void InsertCustomAction(this FsmState state, Action method, int index) { state.InsertAction((FsmStateAction)(object)new CustomFsmAction { method = method }, index); } public static void InsertCustomAction(this PlayMakerFSM fsm, string stateName, Action method, int index) { fsm.GetValidState(stateName).InsertCustomAction(method, index); } public static void InsertCustomAction(this FsmState state, Action<FsmState> method, int index) { Action<FsmState> method2 = method; FsmState state2 = state; state2.InsertAction((FsmStateAction)(object)new CustomFsmAction { method = delegate { method2(state2); } }, index); } public static void InsertCustomAction(this PlayMakerFSM fsm, string stateName, Action<PlayMakerFSM> method, int index) { Action<PlayMakerFSM> method2 = method; PlayMakerFSM fsm2 = fsm; fsm2.GetValidState(stateName).InsertCustomAction((Action)delegate { method2(fsm2); }, index); } } public static class GameObjectUtils { public static T GetAddComponent<T>(this GameObject go) where T : Component { T val = go.GetComponent<T>(); if ((Object)(object)val == (Object)null) { val = go.AddComponent<T>(); } return val; } public static GameObject? FindGameObjectInChildren(this GameObject gameObject, string name, bool useBaseName = false) { if ((Object)(object)gameObject == (Object)null) { return null; } Transform[] componentsInChildren = gameObject.GetComponentsInChildren<Transform>(true); foreach (Transform val in componentsInChildren) { if (val.GetName(useBaseName) == name) { return ((Component)val).gameObject; } } return null; } public static void FindAllChildren(this GameObject go, List<GameObject> allGoList) { if (!((Object)(object)go == (Object)null) && allGoList != null) { for (int i = 0; i < go.transform.childCount; i++) { GameObject gameObject = ((Component)go.transform.GetChild(i)).gameObject; allGoList.Add(gameObject); } for (int j = 0; j < go.transform.childCount; j++) { ((Component)go.transform.GetChild(j)).gameObject.FindAllChildren(allGoList); } } } public static List<GameObject> GetAllGameObjects(this Scene scene) { List<GameObject> list = new List<GameObject>(); GameObject[] rootGameObjects = ((Scene)(ref scene)).GetRootGameObjects(); foreach (GameObject val in rootGameObjects) { list.Add(val); val.FindAllChildren(list); } return list; } public static string GetName(this Transform transform, bool useBaseName = false) { return ((Component)transform).gameObject.GetName(useBaseName); } public static string GetName(this GameObject go, bool useBaseName = false) { string name = ((Object)go).name; if (!useBaseName) { return name; } name = name.ToLowerInvariant(); name = name.Replace("(clone)", string.Empty).Trim(); name = name.Replace("cln", string.Empty).Trim(); name = Regex.Replace(name, "\\([0-9+]+\\)", string.Empty).Trim(); name = Regex.Replace(name, "[0-9+]+$", string.Empty).Trim(); return name.Replace("(clone)", string.Empty).Trim(); } } public static class SceneUtils { public static Scene getCurrentScene() { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_0009: Unknown result type (might be due to invalid IL or missing references) return SceneManager.GetActiveScene(); } } } namespace Satchel.Futils { public class CustomFsmAction : FsmStateAction { public Action? method; public CustomFsmAction() { } public CustomFsmAction(Action method) { this.method = method; } public override void Reset() { method = null; ((FsmStateAction)this).Reset(); } public override void OnEnter() { method?.Invoke(); ((FsmStateAction)this).Finish(); } } public static class FsmVariables { public static NamedVariable[]? GetVariables<T>(this PlayMakerFSM fsm) where T : NamedVariable, new() { if ((Object)(object)fsm == (Object)null) { return null; } FsmVariables fsmVariables = fsm.FsmVariables; Type typeFromHandle = typeof(T); if (typeFromHandle == typeof(FsmFloat)) { return (NamedVariable[]?)(object)fsmVariables.FloatVariables; } if (typeFromHandle == typeof(FsmInt)) { return (NamedVariable[]?)(object)fsmVariables.IntVariables; } if (typeFromHandle == typeof(FsmBool)) { return (NamedVariable[]?)(object)fsmVariables.BoolVariables; } if (typeFromHandle == typeof(FsmString)) { return (NamedVariable[]?)(object)fsmVariables.StringVariables; } if (typeFromHandle == typeof(FsmVector2)) { return (NamedVariable[]?)(object)fsmVariables.Vector2Variables; } if (typeFromHandle == typeof(FsmVector3)) { return (NamedVariable[]?)(object)fsmVariables.Vector3Variables; } if (typeFromHandle == typeof(FsmColor)) { return (NamedVariable[]?)(object)fsmVariables.ColorVariables; } if (typeFromHandle == typeof(FsmRect)) { return (NamedVariable[]?)(object)fsmVariables.RectVariables; } if (typeFromHandle == typeof(FsmQuaternion)) { return (NamedVariable[]?)(object)fsmVariables.QuaternionVariables; } if (typeFromHandle == typeof(FsmGameObject)) { return (NamedVariable[]?)(object)fsmVariables.GameObjectVariables; } if (typeFromHandle == typeof(FsmObject)) { return (NamedVariable[]?)(object)fsmVariables.ObjectVariables; } return null; } public static void SetVariables<T>(this PlayMakerFSM fsm, NamedVariable[] namedVariables) where T : NamedVariable, new() { if ((Object)(object)fsm == (Object)null || namedVariables == null) { return; } FsmVariables fsmVariables = fsm.FsmVariables; Type typeFromHandle = typeof(T); if (typeFromHandle == typeof(FsmFloat)) { fsmVariables.FloatVariables = Array.ConvertAll(namedVariables, (Converter<NamedVariable, FsmFloat>)((NamedVariable v) => (FsmFloat)v)); } else if (typeFromHandle == typeof(FsmInt)) { fsmVariables.IntVariables = Array.ConvertAll(namedVariables, (Converter<NamedVariable, FsmInt>)((NamedVariable v) => (FsmInt)v)); } else if (typeFromHandle == typeof(FsmBool)) { fsmVariables.BoolVariables = Array.ConvertAll(namedVariables, (Converter<NamedVariable, FsmBool>)((NamedVariable v) => (FsmBool)v)); } else if (typeFromHandle == typeof(FsmString)) { fsmVariables.StringVariables = Array.ConvertAll(namedVariables, (Converter<NamedVariable, FsmString>)((NamedVariable v) => (FsmString)v)); } else if (typeFromHandle == typeof(FsmVector2)) { fsmVariables.Vector2Variables = Array.ConvertAll(namedVariables, (Converter<NamedVariable, FsmVector2>)((NamedVariable v) => (FsmVector2)v)); } else if (typeFromHandle == typeof(FsmVector3)) { fsmVariables.Vector3Variables = Array.ConvertAll(namedVariables, (Converter<NamedVariable, FsmVector3>)((NamedVariable v) => (FsmVector3)v)); } else if (typeFromHandle == typeof(FsmColor)) { fsmVariables.ColorVariables = Array.ConvertAll(namedVariables, (Converter<NamedVariable, FsmColor>)((NamedVariable v) => (FsmColor)v)); } else if (typeFromHandle == typeof(FsmRect)) { fsmVariables.RectVariables = Array.ConvertAll(namedVariables, (Converter<NamedVariable, FsmRect>)((NamedVariable v) => (FsmRect)v)); } else if (typeFromHandle == typeof(FsmQuaternion)) { fsmVariables.QuaternionVariables = Array.ConvertAll(namedVariables, (Converter<NamedVariable, FsmQuaternion>)((NamedVariable v) => (FsmQuaternion)v)); } else if (typeFromHandle == typeof(FsmGameObject)) { fsmVariables.GameObjectVariables = Array.ConvertAll(namedVariables, (Converter<NamedVariable, FsmGameObject>)((NamedVariable v) => (FsmGameObject)v)); } else if (typeFromHandle == typeof(FsmObject)) { fsmVariables.ObjectVariables = Array.ConvertAll(namedVariables, (Converter<NamedVariable, FsmObject>)((NamedVariable v) => (FsmObject)v)); } } public static void AddVariable<T>(this PlayMakerFSM fsm, string name) where T : NamedVariable, new() { fsm.AddGetVariable<T>(name); } public static T? AddGetVariable<T>(this PlayMakerFSM fsm, string name) where T : NamedVariable, new() { NamedVariable[] variables = fsm.GetVariables<T>(); if (variables == null) { return default(T); } List<T> list = new List<T>(Array.ConvertAll(variables, (NamedVariable v) => (T)(object)v)); T val = new T(); ((NamedVariable)val).Name = name; T val2 = val; list.Add(val2); fsm.SetVariables<T>(Array.ConvertAll(list.ToArray(), (T v) => (NamedVariable)(object)v)); return val2; } public static T? GetVariable<T>(this PlayMakerFSM fsm, string name) where T : NamedVariable, new() { NamedVariable[] variables = fsm.GetVariables<T>(); if (variables == null) { return default(T); } NamedVariable[] array = variables; foreach (NamedVariable val in array) { T val2 = (T)(object)((val is T) ? val : null); if (val2 != null && ((NamedVariable)val2).Name == name) { return val2; } } return default(T); } } } namespace Radiance { [BepInPlugin("io.github.xieedechunniunai.radiance", "Radiance", "0.2.1")] public class RadiancePlugin : BaseUnityPlugin { private Harmony? _harmony; private GameObject? _radianceManager; public const string Id = "io.github.xieedechunniunai.radiance"; public static RadiancePlugin? Instance { get; private set; } public static string Name => "Radiance"; public static string Version => "0.2.1"; private void Awake() { //IL_0026: Unknown result type (might be due to invalid IL or missing references) //IL_0030: Expected O, but got Unknown Instance = this; Log.Init(((BaseUnityPlugin)this).Logger); Configuration.Init(((BaseUnityPlugin)this).Config); _harmony = new Harmony("io.github.xieedechunniunai.radiance"); _harmony.PatchAll(typeof(FsmFixPatches)); _harmony.PatchAll(typeof(GodfinderIconPatches)); _harmony.PatchAll(typeof(RadiancePatches)); _harmony.PatchAll(typeof(MemoryScenePatches)); _harmony.PatchAll(typeof(SceneTransitionPatches)); _harmony.PatchAll(typeof(Tk2dCollectionPatches)); _harmony.PatchAll(typeof(RadiantOrbFixPatches)); Log.Info("Harmony patches applied"); Configuration.EnableMod.SettingChanged += OnRuntimeFeatureSettingChanged; Configuration.EnableImmortalLight.SettingChanged += OnRuntimeFeatureSettingChanged; Configuration.EnableVanillaRadianceFix.SettingChanged += OnRuntimeFeatureSettingChanged; SceneManager.activeSceneChanged += OnSceneChange; Log.InfoAlways("Plugin " + Name + " (io.github.xieedechunniunai.radiance) has loaded!"); } private void OnRuntimeFeatureSettingChanged(object sender, EventArgs e) { RadiancePatches.RefreshFeatureBehavioursInScene(); } private void OnSceneChange(Scene oldScene, Scene newScene) { if (((Scene)(ref oldScene)).name == "Menu_Title") { CreateManager(); } } private void CreateManager() { //IL_0028: Unknown result type (might be due to invalid IL or missing references) //IL_0032: Expected O, but got Unknown _radianceManager = GameObject.Find("RadianceManager"); if ((Object)(object)_radianceManager == (Object)null) { _radianceManager = new GameObject("RadianceManager"); Object.DontDestroyOnLoad((Object)(object)_radianceManager); AssetManager assetManager = _radianceManager.AddComponent<AssetManager>(); _radianceManager.AddComponent<RadianceSceneManager>(); _radianceManager.AddComponent<ConfigUI>(); Log.Info("Created persistent RadianceManager"); ((MonoBehaviour)this).StartCoroutine(assetManager.PreloadAllAssets()); } else { Log.Info("Found existing persistent RadianceManager"); } } private void OnDestroy() { if (Configuration.IsInitialized) { Configuration.EnableMod.SettingChanged -= OnRuntimeFeatureSettingChanged; Configuration.EnableImmortalLight.SettingChanged -= OnRuntimeFeatureSettingChanged; Configuration.EnableVanillaRadianceFix.SettingChanged -= OnRuntimeFeatureSettingChanged; } SceneManager.activeSceneChanged -= OnSceneChange; } } internal sealed class ConfigUI : MonoBehaviour { private bool _showGui; private Vector2 _scrollPosition; private Rect _windowRect = new Rect(20f, 20f, 480f, 420f); private readonly Dictionary<string, string> _texts = new Dictionary<string, string> { { "window_title_cn", "Radiance 配置面板" }, { "window_title_en", "Radiance Config Panel" }, { "language_cn", "语言" }, { "language_en", "Language" }, { "enable_mod_cn", "模组总开关" }, { "enable_mod_en", "Enable Mod" }, { "enable_mod_desc_cn", "启用或禁用整个 Radiance 模组" }, { "enable_mod_desc_en", "Enable or disable the entire Radiance mod" }, { "enable_immortal_cn", "启用永恒之光" }, { "enable_immortal_en", "Enable ImmortalLight" }, { "enable_immortal_desc_cn", "一个强大的辐光mod" }, { "enable_immortal_desc_en", "A powerful Radiance mod" }, { "enable_vanilla_fix_cn", "修复原版辐光" }, { "enable_vanilla_fix_en", "Fix Vanilla Radiance" }, { "enable_vanilla_fix_desc_cn", "光球消散后仍造成伤害、P4动画过渡期受伤BUG修复" }, { "enable_vanilla_fix_desc_en", "Orb damage after dissipate, hit during Final Impact transition, etc." }, { "enable_shader_compat_cn", "Shader 兼容" }, { "enable_shader_compat_en", "Shader Compatibility" }, { "enable_shader_compat_desc_cn", "HK1 资源运行时 shader 修复,关闭 Mac 可能失效" }, { "enable_shader_compat_desc_en", "Runtime fix for HK1 shaders. Off may break on Mac" }, { "enable_collection_namespace_cn", "图集命名空间" }, { "enable_collection_namespace_en", "Collection Namespace" }, { "enable_collection_namespace_desc_cn", "为 Patchwork 皮肤 mod 隔离 tk2d 图集" }, { "enable_collection_namespace_desc_en", "Isolate tk2d collections for Patchwork skin mod" }, { "enable_compat_diagnostics_cn", "兼容诊断日志" }, { "enable_compat_diagnostics_en", "Compatibility Diagnostics" }, { "enable_compat_diagnostics_desc_cn", "输出 shader/皮肤兼容详细日志(调试用)" }, { "enable_compat_diagnostics_desc_en", "Verbose logs for shader/skin compatibility (debug)" }, { "apply_cn", "应用并保存" }, { "apply_en", "Apply & Save" }, { "reset_cn", "恢复默认值" }, { "reset_en", "Reset Defaults" }, { "close_cn", "关闭面板" }, { "close_en", "Close Panel" }, { "tip_cn", "打开/关闭配置面板" }, { "tip_en", "Open/close config panel" }, { "config_key_cn", "快捷键" }, { "config_key_en", "Hotkey" } }; private void Update() { //IL_0008: Unknown result type (might be due to invalid IL or missing references) if (Configuration.IsInitialized && Input.GetKeyDown(Configuration.GetConfigPanelKeyCode())) { _showGui = !_showGui; } } private void OnGUI() { //IL_0023: Unknown result type (might be due to invalid IL or missing references) //IL_002f: Unknown result type (might be due to invalid IL or missing references) //IL_0044: Expected O, but got Unknown //IL_003f: Unknown result type (might be due to invalid IL or missing references) //IL_0044: Unknown result type (might be due to invalid IL or missing references) if (_showGui && Configuration.IsInitialized) { _windowRect = GUI.Window(((Object)this).GetInstanceID(), _windowRect, new WindowFunction(DrawWindow), GetText("window_title")); } } private void DrawWindow(int windowId) { //IL_0003: 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_0020: Unknown result type (might be due to invalid IL or missing references) //IL_01f0: Unknown result type (might be due to invalid IL or missing references) _scrollPosition = GUILayout.BeginScrollView(_scrollPosition, (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.Height(300f) }); DrawLanguageSwitch(); GUILayout.Space(8f); DrawToggleRow(GetText("enable_mod"), GetText("enable_mod_desc"), Configuration.EnableMod); DrawToggleRow(GetText("enable_immortal"), GetText("enable_immortal_desc"), Configuration.EnableImmortalLight); DrawToggleRow(GetText("enable_vanilla_fix"), GetText("enable_vanilla_fix_desc"), Configuration.EnableVanillaRadianceFix); DrawToggleRow(GetText("enable_shader_compat"), GetText("enable_shader_compat_desc"), Configuration.EnableShaderCompatFix); DrawToggleRow(GetText("enable_collection_namespace"), GetText("enable_collection_namespace_desc"), Configuration.EnableCollectionNamespace); DrawToggleRow(GetText("enable_compat_diagnostics"), GetText("enable_compat_diagnostics_desc"), Configuration.EnableCompatDiagnostics); GUILayout.Space(8f); DrawConfigKeyRow(); GUILayout.Space(10f); GUILayout.Label(GetText("tip") + ": " + (Configuration.ConfigPanelKey?.Value ?? "F6"), Array.Empty<GUILayoutOption>()); GUILayout.EndScrollView(); GUILayout.Space(8f); GUILayout.BeginHorizontal(Array.Empty<GUILayoutOption>()); if (GUILayout.Button(GetText("apply"), Array.Empty<GUILayoutOption>())) { ApplyAndSave(); } if (GUILayout.Button(GetText("reset"), Array.Empty<GUILayoutOption>())) { ResetToDefaults(); } if (GUILayout.Button(GetText("close"), Array.Empty<GUILayoutOption>())) { _showGui = false; } GUILayout.EndHorizontal(); GUI.DragWindow(new Rect(0f, 0f, 10000f, 24f)); } private void DrawLanguageSwitch() { GUILayout.BeginHorizontal(Array.Empty<GUILayoutOption>()); GUILayout.Label(GetText("language"), (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.Width(80f) }); bool value = Configuration.UseEnglish.Value; if (GUILayout.Button("中文", value ? GUI.skin.button : GUI.skin.box, Array.Empty<GUILayoutOption>())) { Configuration.UseEnglish.Value = false; } if (GUILayout.Button("ENGLISH", value ? GUI.skin.box : GUI.skin.button, Array.Empty<GUILayoutOption>())) { Configuration.UseEnglish.Value = true; } GUILayout.EndHorizontal(); } private static void DrawToggleRow(string label, string? description, ConfigEntry<bool> entry) { //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_0050: Unknown result type (might be due to invalid IL or missing references) //IL_0071: Unknown result type (might be due to invalid IL or missing references) bool flag = GUILayout.Toggle(entry.Value, label, Array.Empty<GUILayoutOption>()); if (flag != entry.Value) { entry.Value = flag; } if (!string.IsNullOrEmpty(description)) { Color color = GUI.color; GUI.color = new Color(0.7f, 0.7f, 0.7f); GUILayout.Label(description, GUI.skin.label, Array.Empty<GUILayoutOption>()); GUI.color = color; } } private void DrawConfigKeyRow() { GUILayout.BeginHorizontal(Array.Empty<GUILayoutOption>()); GUILayout.Label(GetText("config_key"), (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.Width(80f) }); string text = GUILayout.TextField(Configuration.ConfigPanelKey?.Value ?? "F6", (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.Width(80f) }); if (!string.IsNullOrWhiteSpace(text) && !string.Equals(text, Configuration.ConfigPanelKey?.Value, StringComparison.Ordinal)) { Configuration.ConfigPanelKey.Value = text.Trim(); } GUILayout.EndHorizontal(); } private void ApplyAndSave() { try { RadiancePlugin? instance = RadiancePlugin.Instance; if (instance != null) { ((BaseUnityPlugin)instance).Config.Save(); } Log.InfoAlways("[ConfigUI] Applied and saved configuration."); } catch (Exception ex) { Log.Error("[ConfigUI] Failed to apply config: " + ex.Message); } } private void ResetToDefaults() { try { Configuration.ResetToDefaults(); RadiancePlugin? instance = RadiancePlugin.Instance; if (instance != null) { ((BaseUnityPlugin)instance).Config.Save(); } Log.InfoAlways("[ConfigUI] Reset configuration to defaults."); } catch (Exception ex) { Log.Error("[ConfigUI] Failed to reset config: " + ex.Message); } } private string GetText(string key) { string text = (Configuration.UseEnglish.Value ? "_en" : "_cn"); string value; return _texts.TryGetValue(key + text, out value) ? value : key; } } internal static class Configuration { public static bool IsInitialized { get; private set; } public static ConfigEntry<bool> EnableMod { get; private set; } public static ConfigEntry<bool> UseEnglish { get; private set; } public static ConfigEntry<bool> EnableImmortalLight { get; private set; } public static ConfigEntry<bool> EnableVanillaRadianceFix { get; private set; } public static ConfigEntry<bool> EnableShaderCompatFix { get; private set; } public static ConfigEntry<bool> EnableCollectionNamespace { get; private set; } public static ConfigEntry<bool> EnableCompatDiagnostics { get; private set; } public static ConfigEntry<string> ConfigPanelKey { get; private set; } public static bool IsModEnabled => IsInitialized && EnableMod.Value; public static bool IsImmortalLightEnabled => IsModEnabled && EnableImmortalLight.Value; public static bool IsVanillaRadianceFixEnabled => IsModEnabled && EnableVanillaRadianceFix.Value; public static bool IsShaderCompatEnabled => IsModEnabled && EnableShaderCompatFix.Value; public static bool IsCollectionNamespaceEnabled => IsModEnabled && EnableCollectionNamespace.Value; public static bool IsCompatDiagnosticsEnabled => IsModEnabled && EnableCompatDiagnostics.Value; public static void Init(ConfigFile config) { if (!IsInitialized) { EnableMod = config.Bind<bool>("General", "EnableMod", true, "[EN] Master switch: enable or disable the entire Radiance mod.\n[中] 模组总开关:启用或禁用整个 Radiance 模组。"); EnableImmortalLight = config.Bind<bool>("Features", "EnableImmortalLight", false, "[EN] Enable ImmortalLight content: Belltown entry point and custom GG_Radiance story flow.\n[中] 永恒之光内容:从 Belltown 进入入口及自定义剧情流程。"); EnableVanillaRadianceFix = config.Bind<bool>("Features", "EnableVanillaRadianceFix", true, "[EN] Fix vanilla Absolute Radiance bugs: orphan orb damage after dissipate, getting hit during Death Ready→Final Impact transition.\n[中] 修复原版无上辐光 bug:Orb 消散后仍造成伤害、Death Ready 到 Final Impact 过渡期受伤等。"); EnableShaderCompatFix = config.Bind<bool>("Compatibility", "EnableShaderCompatFix", true, "[EN] Runtime shader compatibility for HK1 assets. Disable to use original shaders (may break on Mac).\n[中] HK1 资源的运行时 shader 兼容。关闭则使用原版 shader(Mac 可能失效)。"); EnableCollectionNamespace = config.Bind<bool>("Compatibility", "EnableCollectionNamespace", true, "[EN] Rename tk2d collections with (HK1) suffix for Patchwork skin mod compatibility.\n[中] 为 tk2d 图集添加 (HK1) 后缀,以兼容 Patchwork 皮肤 mod。"); EnableCompatDiagnostics = config.Bind<bool>("Compatibility", "EnableCompatDiagnostics", false, "[EN] Emit verbose logs for shader and skin compatibility (for debugging).\n[中] 输出 shader/皮肤兼容相关的详细日志(用于调试)。"); ConfigPanelKey = config.Bind<string>("UI", "ConfigPanelKey", "F6", "[EN] Hotkey to open/close the in-game config panel.\n[中] 打开/关闭配置面板的快捷键。"); UseEnglish = config.Bind<bool>("UI", "UseEnglish", false, "[EN] Use English in the in-game config panel.\n[中] 配置面板使用英文显示。"); IsInitialized = true; } } public static void ResetToDefaults() { if (IsInitialized) { EnableMod.Value = (bool)((ConfigEntryBase)EnableMod).DefaultValue; UseEnglish.Value = (bool)((ConfigEntryBase)UseEnglish).DefaultValue; EnableImmortalLight.Value = (bool)((ConfigEntryBase)EnableImmortalLight).DefaultValue; EnableVanillaRadianceFix.Value = (bool)((ConfigEntryBase)EnableVanillaRadianceFix).DefaultValue; EnableShaderCompatFix.Value = (bool)((ConfigEntryBase)EnableShaderCompatFix).DefaultValue; EnableCollectionNamespace.Value = (bool)((ConfigEntryBase)EnableCollectionNamespace).DefaultValue; EnableCompatDiagnostics.Value = (bool)((ConfigEntryBase)EnableCompatDiagnostics).DefaultValue; ConfigPanelKey.Value = (string)((ConfigEntryBase)ConfigPanelKey).DefaultValue; } } public static KeyCode GetConfigPanelKeyCode() { //IL_0023: 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_0041: Unknown result type (might be due to invalid IL or missing references) //IL_0042: Unknown result type (might be due to invalid IL or missing references) //IL_004d: Unknown result type (might be due to invalid IL or missing references) if (!IsInitialized || string.IsNullOrWhiteSpace(ConfigPanelKey.Value)) { return (KeyCode)287; } if (Enum.TryParse<KeyCode>(ConfigPanelKey.Value.Trim(), ignoreCase: true, out KeyCode result)) { return result; } return (KeyCode)287; } } } namespace Radiance.Tools { public static class FsmAnalyzer { private static readonly string DefaultOutputDir = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "BepInEx", "plugins", "Radiance", "temp"); public static void AnalyzeAllFsms(GameObject gameObject, string? outputDir = null) { if ((Object)(object)gameObject == (Object)null) { Log.Error("[FsmAnalyzer] GameObject 为空"); return; } string text = outputDir ?? DefaultOutputDir; Directory.CreateDirectory(text); PlayMakerFSM[] components = gameObject.GetComponents<PlayMakerFSM>(); Log.Info($"[FsmAnalyzer] 开始分析 {((Object)gameObject).name} 的 {components.Length} 个 FSM"); string text2 = DateTime.Now.ToString("yyyy-MM-dd_HH-mm-ss"); string text3 = SanitizeFileName(((Object)gameObject).name); PlayMakerFSM[] array = components; foreach (PlayMakerFSM val in array) { string text4 = SanitizeFileName(val.FsmName); string text5 = text3 + "_" + text4 + "_" + text2 + ".txt"; string outputPath = Path.Combine(text, text5); WriteFsmReport(val, outputPath); Log.Info("[FsmAnalyzer] 已输出: " + text5); } string outputPath2 = Path.Combine(text, text3 + "_Summary_" + text2 + ".txt"); WriteSummaryReport(gameObject, components, outputPath2); Log.Info("[FsmAnalyzer] 已输出汇总: " + text3 + "_Summary_" + text2 + ".txt"); } public static void WriteFsmReport(PlayMakerFSM fsm, string outputPath) { //IL_06a6: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)fsm == (Object)null) { return; } StringBuilder stringBuilder = new StringBuilder(); stringBuilder.AppendLine("================================================================================"); stringBuilder.AppendLine("FSM 报告: " + fsm.FsmName); stringBuilder.AppendLine("GameObject: " + ((Object)((Component)fsm).gameObject).name); stringBuilder.AppendLine("路径: " + GetGameObjectPath(((Component)fsm).gameObject)); stringBuilder.AppendLine($"生成时间: {DateTime.Now:yyyy-MM-dd HH:mm:ss}"); stringBuilder.AppendLine("================================================================================"); stringBuilder.AppendLine("当前状态: " + fsm.ActiveStateName); stringBuilder.AppendLine("起始状态: " + fsm.Fsm.StartState); FsmState[] fsmStates = fsm.FsmStates; stringBuilder.AppendLine($"\n--- 所有状态 ({fsmStates.Length}个) ---"); FsmState[] array = fsmStates; foreach (FsmState val in array) { stringBuilder.AppendLine(" - " + val.Name); } FsmEvent[] fsmEvents = fsm.FsmEvents; stringBuilder.AppendLine($"\n--- 所有事件 ({fsmEvents.Length}个) ---"); FsmEvent[] array2 = fsmEvents; foreach (FsmEvent val2 in array2) { stringBuilder.AppendLine($" - {val2.Name} (IsGlobal: {val2.IsGlobal})"); } FsmTransition[] fsmGlobalTransitions = fsm.FsmGlobalTransitions; stringBuilder.AppendLine($"\n--- 全局转换 ({fsmGlobalTransitions.Length}个) ---"); FsmTransition[] array3 = fsmGlobalTransitions; foreach (FsmTransition val3 in array3) { FsmEvent fsmEvent = val3.FsmEvent; stringBuilder.AppendLine(" " + ((fsmEvent != null) ? fsmEvent.Name : null) + " -> " + val3.toState); } stringBuilder.AppendLine("\n================================================================================"); stringBuilder.AppendLine("各状态详情"); stringBuilder.AppendLine("================================================================================"); FsmState[] array4 = fsmStates; foreach (FsmState val4 in array4) { stringBuilder.AppendLine("\n【状态: " + val4.Name + "】"); stringBuilder.AppendLine(" 转换:"); if (val4.Transitions != null && val4.Transitions.Length != 0) { FsmTransition[] transitions = val4.Transitions; foreach (FsmTransition val5 in transitions) { FsmEvent fsmEvent2 = val5.FsmEvent; stringBuilder.AppendLine(" " + (((fsmEvent2 != null) ? fsmEvent2.Name : null) ?? "(null)") + " -> " + val5.toState); } } else { stringBuilder.AppendLine(" (无转换)"); } FsmStateAction[] actions = val4.Actions; stringBuilder.AppendLine($" 动作 ({((actions != null) ? actions.Length : 0)}个):"); if (val4.Actions != null && val4.Actions.Length != 0) { for (int n = 0; n < val4.Actions.Length; n++) { FsmStateAction val6 = val4.Actions[n]; if (val6 == null) { stringBuilder.AppendLine($" [{n}] (null)"); continue; } stringBuilder.AppendLine($" [{n}] {((object)val6).GetType().Name}"); AnalyzeActionVariables(stringBuilder, val6, n); } } else { stringBuilder.AppendLine(" (无动作)"); } } FsmVariables fsmVariables = fsm.FsmVariables; stringBuilder.AppendLine("\n================================================================================"); stringBuilder.AppendLine("FSM 变量"); stringBuilder.AppendLine("================================================================================"); stringBuilder.AppendLine($"Bool: {fsmVariables.BoolVariables.Length}, Int: {fsmVariables.IntVariables.Length}, Float: {fsmVariables.FloatVariables.Length}, String: {fsmVariables.StringVariables.Length}"); stringBuilder.AppendLine($"GameObject: {fsmVariables.GameObjectVariables.Length}, Object: {fsmVariables.ObjectVariables.Length}, Vector3: {fsmVariables.Vector3Variables.Length}"); stringBuilder.AppendLine("\n Float 变量:"); FsmFloat[] floatVariables = fsmVariables.FloatVariables; foreach (FsmFloat val7 in floatVariables) { stringBuilder.AppendLine($" {((NamedVariable)val7).Name} = {val7.Value}"); } stringBuilder.AppendLine("\n Bool 变量:"); FsmBool[] boolVariables = fsmVariables.BoolVariables; foreach (FsmBool val8 in boolVariables) { stringBuilder.AppendLine($" {((NamedVariable)val8).Name} = {val8.Value}"); } stringBuilder.AppendLine("\n Int 变量:"); FsmInt[] intVariables = fsmVariables.IntVariables; foreach (FsmInt val9 in intVariables) { stringBuilder.AppendLine($" {((NamedVariable)val9).Name} = {val9.Value}"); } stringBuilder.AppendLine("\n String 变量:"); FsmString[] stringVariables = fsmVariables.StringVariables; foreach (FsmString val10 in stringVariables) { stringBuilder.AppendLine(" " + ((NamedVariable)val10).Name + " = \"" + val10.Value + "\""); } stringBuilder.AppendLine("\n GameObject 变量:"); FsmGameObject[] gameObjectVariables = fsmVariables.GameObjectVariables; foreach (FsmGameObject val11 in gameObjectVariables) { string text = (((Object)(object)val11.Value != (Object)null) ? ((Object)val11.Value).name : "(null)"); stringBuilder.AppendLine(" " + ((NamedVariable)val11).Name + " = " + text); } stringBuilder.AppendLine("\n Vector3 变量:"); FsmVector3[] vector3Variables = fsmVariables.Vector3Variables; foreach (FsmVector3 val12 in vector3Variables) { stringBuilder.AppendLine($" {((NamedVariable)val12).Name} = {val12.Value}"); } Directory.CreateDirectory(Path.GetDirectoryName(outputPath) ?? "."); File.WriteAllText(outputPath, stringBuilder.ToString(), Encoding.UTF8); } private static void WriteSummaryReport(GameObject gameObject, PlayMakerFSM[] fsms, string outputPath) { GameObject gameObject2 = gameObject; StringBuilder stringBuilder = new StringBuilder(); stringBuilder.AppendLine("================================================================================"); stringBuilder.AppendLine("FSM 汇总报告: " + ((Object)gameObject2).name); stringBuilder.AppendLine("路径: " + GetGameObjectPath(gameObject2)); stringBuilder.AppendLine($"生成时间: {DateTime.Now:yyyy-MM-dd HH:mm:ss}"); stringBuilder.AppendLine($"FSM 数量: {fsms.Length}"); stringBuilder.AppendLine("================================================================================"); foreach (PlayMakerFSM val in fsms) { stringBuilder.AppendLine("\n【" + val.FsmName + "】"); stringBuilder.AppendLine($" 状态数: {val.FsmStates.Length}"); stringBuilder.AppendLine($" 事件数: {val.FsmEvents.Length}"); stringBuilder.AppendLine(" 起始状态: " + val.Fsm.StartState); stringBuilder.AppendLine(" 状态列表:"); FsmState[] fsmStates = val.FsmStates; foreach (FsmState val2 in fsmStates) { FsmStateAction[] actions = val2.Actions; int num = ((actions != null) ? actions.Length : 0); FsmTransition[] transitions = val2.Transitions; int num2 = ((transitions != null) ? transitions.Length : 0); stringBuilder.AppendLine($" - {val2.Name} ({num} actions, {num2} transitions)"); } } stringBuilder.AppendLine("\n================================================================================"); stringBuilder.AppendLine("子对象 FSM"); stringBuilder.AppendLine("================================================================================"); PlayMakerFSM[] componentsInChildren = gameObject2.GetComponentsInChildren<PlayMakerFSM>(true); PlayMakerFSM[] array = componentsInChildren.Where((PlayMakerFSM f) => (Object)(object)((Component)f).gameObject != (Object)(object)gameObject2).ToArray(); stringBuilder.AppendLine($"子对象 FSM 数量: {array.Length}"); PlayMakerFSM[] array2 = array; foreach (PlayMakerFSM val3 in array2) { stringBuilder.AppendLine($" {GetGameObjectPath(((Component)val3).gameObject)} -> {val3.FsmName} ({val3.FsmStates.Length} states)"); } Directory.CreateDirectory(Path.GetDirectoryName(outputPath) ?? "."); File.WriteAllText(outputPath, stringBuilder.ToString(), Encoding.UTF8); } private static void AnalyzeActionVariables(StringBuilder sb, FsmStateAction action, int actionIndex) { try { Type type = ((object)action).GetType(); FieldInfo[] fields = type.GetFields(BindingFlags.Instance | BindingFlags.Public); FieldInfo[] array = fields; foreach (FieldInfo fieldInfo in array) { object value = fieldInfo.GetValue(action); if (value != null) { string text = FormatValue(value, action); sb.AppendLine(" " + fieldInfo.Name + ": " + text); } } } catch (Exception ex) { sb.AppendLine(" (分析变量时出错: " + ex.Message + ")"); } } private static string FormatValue(object value, FsmStateAction action) { //IL_023b: Unknown result type (might be due to invalid IL or missing references) //IL_024f: Unknown result type (might be due to invalid IL or missing references) //IL_0263: Unknown result type (might be due to invalid IL or missing references) //IL_0277: Unknown result type (might be due to invalid IL or missing references) //IL_02bd: Unknown result type (might be due to invalid IL or missing references) //IL_02ce: Unknown result type (might be due to invalid IL or missing references) //IL_02df: Unknown result type (might be due to invalid IL or missing references) if (1 == 0) { } FsmFloat val = (FsmFloat)((value is FsmFloat) ? value : null); string result; if (val == null) { FsmInt val2 = (FsmInt)((value is FsmInt) ? value : null); if (val2 == null) { FsmBool val3 = (FsmBool)((value is FsmBool) ? value : null); if (val3 == null) { FsmString val4 = (FsmString)((value is FsmString) ? value : null); if (val4 == null) { FsmEvent val5 = (FsmEvent)((value is FsmEvent) ? value : null); if (val5 == null) { FsmGameObject val6 = (FsmGameObject)((value is FsmGameObject) ? value : null); if (val6 == null) { FsmOwnerDefault val7 = (FsmOwnerDefault)((value is FsmOwnerDefault) ? value : null); if (val7 == null) { FsmColor val8 = (FsmColor)((value is FsmColor) ? value : null); if (val8 == null) { FsmVector3 val9 = (FsmVector3)((value is FsmVector3) ? value : null); if (val9 == null) { FsmObject val10 = (FsmObject)((value is FsmObject) ? value : null); if (val10 == null) { GameObject val11 = (GameObject)((value is GameObject) ? value : null); result = ((val11 == null) ? $"{value} ({value.GetType().Name})" : ("GO:" + ((Object)val11).name)); } else { result = (((NamedVariable)val10).UseVariable ? ("[Obj变量:" + ((NamedVariable)val10).Name + "]") : ("Obj:" + (((object)val10.Value)?.GetType().Name ?? "(null)"))); } } else { result = (((NamedVariable)val9).UseVariable ? ("[V3变量:" + ((NamedVariable)val9).Name + "]") : $"({val9.Value.x:F2},{val9.Value.y:F2},{val9.Value.z:F2})"); } } else { result = (((NamedVariable)val8).UseVariable ? ("[Color变量:" + ((NamedVariable)val8).Name + "]") : $"RGBA({val8.Value.r:F2},{val8.Value.g:F2},{val8.Value.b:F2},{val8.Value.a:F2})"); } } else { result = FormatOwnerDefault(val7, action); } } else { result = (((NamedVariable)val6).UseVariable ? ("[GO变量:" + ((NamedVariable)val6).Name + "]") : (((Object)(object)val6.Value != (Object)null) ? ("GO:" + ((Object)val6.Value).name) : "GO:(null)")); } } else { result = "[Event:" + val5.Name + "]"; } } else { result = (((NamedVariable)val4).UseVariable ? ("[String变量:" + ((NamedVariable)val4).Name + "]") : ("\"" + val4.Value + "\"")); } } else { result = (((NamedVariable)val3).UseVariable ? ("[Bool变量:" + ((NamedVariable)val3).Name + "]") : $"{val3.Value}"); } } else { result = (((NamedVariable)val2).UseVariable ? ("[Int变量:" + ((NamedVariable)val2).Name + "]") : $"{val2.Value}"); } } else { result = (((NamedVariable)val).UseVariable ? ("[Float变量:" + ((NamedVariable)val).Name + "]") : $"{val.Value}"); } if (1 == 0) { } return result; } private static string FormatOwnerDefault(FsmOwnerDefault od, FsmStateAction action) { //IL_0003: Unknown result type (might be due to invalid IL or missing references) //IL_0008: Unknown result type (might be due to invalid IL or missing references) //IL_0009: Unknown result type (might be due to invalid IL or missing references) //IL_000b: Invalid comparison between Unknown and I4 try { OwnerDefaultOption ownerOption = od.OwnerOption; if ((int)ownerOption == 0) { return "[Owner]"; } if (od.GameObject != null && (Object)(object)od.GameObject.Value != (Object)null) { return "GO:" + ((Object)od.GameObject.Value).name; } if (od.GameObject != null && ((NamedVariable)od.GameObject).UseVariable) { return "[GO变量:" + ((NamedVariable)od.GameObject).Name + "]"; } } catch { } return "[OwnerDefault]"; } private static string GetGameObjectPath(GameObject obj) { if ((Object)(object)obj == (Object)null) { return "(null)"; } string text = ((Object)obj).name; Transform parent = obj.transform.parent; while ((Object)(object)parent != (Object)null) { text = ((Object)parent).name + "/" + text; parent = parent.parent; } return text; } private static string SanitizeFileName(string name) { char[] invalidFileNameChars = Path.GetInvalidFileNameChars(); return string.Join("_", name.Split(invalidFileNameChars, StringSplitOptions.RemoveEmptyEntries)); } } public static class FsmStateBuilder { public struct StateDefinition { public string Name; public string Description; public StateDefinition(string name, string description = "") { Name = name; Description = description; } } public static FsmState CreateState(Fsm fsm, string name, string description = "") { //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_0007: Unknown result type (might be due to invalid IL or missing references) //IL_000f: Unknown result type (might be due to invalid IL or missing references) //IL_0018: Expected O, but got Unknown return new FsmState(fsm) { Name = name, Description = description }; } public static FsmState CreateState(PlayMakerFSM pmFsm, string name, string description = "") { return CreateState(pmFsm.Fsm, name, description); } public static FsmState CreateAndAddState(PlayMakerFSM pmFsm, string name, string description = "") { FsmState val = CreateState(pmFsm.Fsm, name, description); AddStateToFsm(pmFsm, val); return val; } public static void AddStateToFsm(PlayMakerFSM pmFsm, FsmState state) { List<FsmState> list = pmFsm.Fsm.States.ToList(); list.Add(state); pmFsm.Fsm.States = list.ToArray(); } public static void AddStatesToFsm(PlayMakerFSM pmFsm, params FsmState[] statesToAdd) { List<FsmState> list = pmFsm.Fsm.States.ToList(); list.AddRange(statesToAdd); pmFsm.Fsm.States = list.ToArray(); } public static FsmState[] CreateStates(Fsm fsm, params StateDefinition[] definitions) { FsmState[] array = (FsmState[])(object)new FsmState[definitions.Length]; for (int i = 0; i < definitions.Length; i++) { array[i] = CreateState(fsm, definitions[i].Name, definitions[i].Description); } return array; } public static FsmState[] CreateStates(Fsm fsm, params (string name, string description)[] definitions) { FsmState[] array = (FsmState[])(object)new FsmState[definitions.Length]; for (int i = 0; i < definitions.Length; i++) { array[i] = CreateState(fsm, definitions[i].name, definitions[i].description); } return array; } public static FsmState[] CreateAndAddStates(PlayMakerFSM pmFsm, params (string name, string description)[] definitions) { FsmState[] array = CreateStates(pmFsm.Fsm, definitions); AddStatesToFsm(pmFsm, array); return array; } public static FsmState? FindState(PlayMakerFSM pmFsm, string stateName) { string stateName2 = stateName; return ((IEnumerable<FsmState>)pmFsm.FsmStates).FirstOrDefault((Func<FsmState, bool>)((FsmState s) => s.Name == stateName2)); } public static bool StateExists(PlayMakerFSM pmFsm, string stateName) { string stateName2 = stateName; return pmFsm.FsmStates.Any((FsmState s) => s.Name == stateName2); } public static FsmState GetOrCreateState(PlayMakerFSM pmFsm, string name, string description = "") { FsmState val = FindState(pmFsm, name); if (val != null) { return val; } return CreateAndAddState(pmFsm, name, description); } public static FsmTransition CreateFinishedTransition(FsmState targetState) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_0012: Unknown result type (might be due to invalid IL or missing references) //IL_001e: Unknown result type (might be due to invalid IL or missing references) //IL_0026: Expected O, but got Unknown return new FsmTransition { FsmEvent = FsmEvent.Finished, toState = targetState.Name, toFsmState = targetState }; } public static FsmTransition CreateTransition(FsmEvent fsmEvent, FsmState targetState) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_000e: Unknown result type (might be due to invalid IL or missing references) //IL_001a: Unknown result type (might be due to invalid IL or missing references) //IL_0022: Expected O, but got Unknown return new FsmTransition { FsmEvent = fsmEvent, toState = targetState.Name, toFsmState = targetState }; } public static void SetFinishedTransition(FsmState state, FsmState targetState) { state.Transitions = (FsmTransition[])(object)new FsmTransition[1] { CreateFinishedTransition(targetState) }; } public static int ForceSetTransition(PlayMakerFSM pmFsm, string fromStateName, string eventName, string targetStateName) { FsmState val = FindState(pmFsm, fromStateName); FsmState val2 = FindState(pmFsm, targetStateName); if (val == null || val2 == null || val.Transitions == null) { return 0; } FsmTransition[] transitions = val.Transitions; foreach (FsmTransition val3 in transitions) { object obj; if (val3 == null) { obj = null; } else { FsmEvent fsmEvent = val3.FsmEvent; obj = ((fsmEvent != null) ? fsmEvent.Name : null); } if (!((string?)obj != eventName)) { val3.toState = val2.Name; val3.toFsmState = val2; return 1; } } return 0; } public static void AddTransition(FsmState state, FsmTransition transition) { List<FsmTransition> list = state.Transitions?.ToList() ?? new List<FsmTransition>(); list.Add(transition); state.Transitions = list.ToArray(); } public static FsmEvent GetOrCreateEvent(PlayMakerFSM pmFsm, string eventName) { FsmEvent fsmEvent = FsmEvent.GetFsmEvent(eventName); List<FsmEvent> list = pmFsm.Fsm.Events.ToList(); if (!list.Contains(fsmEvent)) { list.Add(fsmEvent); pmFsm.Fsm.Events = list.ToArray(); } return fsmEvent; } public static FsmEvent[] RegisterEvents(PlayMakerFSM pmFsm, params string[] eventNames) { List<FsmEvent> list = pmFsm.Fsm.Events.ToList(); FsmEvent[] array = (FsmEvent[])(object)new FsmEvent[eventNames.Length]; for (int i = 0; i < eventNames.Length; i++) { array[i] = FsmEvent.GetFsmEvent(eventNames[i]); if (!list.Contains(array[i])) { list.Add(array[i]); } } pmFsm.Fsm.Events = list.ToArray(); return array; } public static void ReinitializeFsm(PlayMakerFSM pmFsm) { } public static void ReinitializeFsmVariables(PlayMakerFSM pmFsm) { pmFsm.FsmVariables.Init(); } } internal static class Log { private static ManualLogSource? _logSource; private static string LogPrefix => $"[{Assembly.GetExecutingAssembly().GetName().Version}] "; internal static void Init(ManualLogSource logSource) { _logSource = logSource; } internal static void Debug(object debug) { ManualLogSource? logSource = _logSource; if (logSource != null) { logSource.LogDebug((object)(LogPrefix + debug)); } } internal static void Info(object info) { if (Configuration.IsInitialized && Configuration.IsCompatDiagnosticsEnabled) { ManualLogSource? logSource = _logSource; if (logSource != null) { logSource.LogInfo((object)(LogPrefix + info)); } } } internal static void InfoAlways(object info) { ManualLogSource? logSource = _logSource; if (logSource != null) { logSource.LogInfo((object)(LogPrefix + info)); } } internal static void Warn(object warning) { ManualLogSource? logSource = _logSource; if (logSource != null) { logSource.LogWarning((object)(LogPrefix + warning)); } } internal static void Error(object error) { ManualLogSource? logSource = _logSource; if (logSource != null) { logSource.LogError((object)(LogPrefix + error)); } } } } namespace Radiance.Patches { [HarmonyPatch] internal static class FsmFixPatches { [HarmonyPostfix] [HarmonyPatch(typeof(PlayMakerFSM), "OnEnable")] private static void FixFsmEventHandlersOnEnable(PlayMakerFSM __instance) { if (!Configuration.IsModEnabled || (Object)(object)__instance == (Object)null) { return; } try { Fsm fsm = __instance.Fsm; if (fsm == null || fsm.States == null) { return; } FsmState[] states = fsm.States; foreach (FsmState val in states) { if (((val != null) ? val.Actions : null) == null) { continue; } FsmStateAction[] actions = val.Actions; foreach (FsmStateAction val2 in actions) { if (val2 != null) { try { val2.OnPreprocess(); } catch { } } } } __instance.AddEventHandlerComponents(); } catch (Exception ex) { Log.Debug("[FsmFixPatch] 修复 FSM 事件处理组件失败: " + ((Object)((Component)__instance).gameObject).name + "/" + __instance.FsmName + " - " + ex.Message); } } } [HarmonyPatch] internal static class GodfinderIconPatches { [HarmonyPrefix] [HarmonyPatch(typeof(ShowGodfinderIcon), "OnEnter")] private static bool SkipShowGodfinderIcon() { if (!Configuration.IsModEnabled) { return true; } return !RadianceSceneManager.IsInCustomScene; } [HarmonyPrefix] [HarmonyPatch(typeof(GodfinderIcon), "Show")] private static bool SkipHideGodfinderIcon() { if (!Configuration.IsModEnabled) { return true; } return !RadianceSceneManager.IsInCustomScene; } } [HarmonyPatch] internal static class MemoryScenePatches { [HarmonyPostfix] [HarmonyPatch(typeof(GameManager), "IsMemoryScene", new Type[] { })] private static void ForceMemoryInCustomScene(ref bool __result) { if (Configuration.IsModEnabled && RadianceSceneManager.IsInCustomScene) { __result = true; } } } [HarmonyPatch] internal static class RadiancePatches { public delegate void FsmHandler(PlayMakerFSM fsm); private const string TargetGameObjectName = "Absolute Radiance"; private const string TargetControlFsmName = "Control"; private static readonly Dictionary<string, FsmHandler> FsmHandlers = new Dictionary<string, FsmHandler> { { "Control", HandleControlFsm } }; [HarmonyPrefix] [HarmonyPatch(typeof(PlayMakerFSM), "Start")] private static void MountRadianceBehaviours(PlayMakerFSM __instance) { if (!Configuration.IsModEnabled || (Object)(object)__instance == (Object)null || ((Object)((Component)__instance).gameObject).name != "Absolute Radiance" || !FsmHandlers.TryGetValue(__instance.FsmName, out FsmHandler value)) { return; } Log.Info("[RadiancePatch] 发现目标 FSM: Absolute Radiance/" + __instance.FsmName); try { value(__instance); } catch (Exception ex) { Log.Error("[RadiancePatch] 处理 FSM [" + __instance.FsmName + "] 失败: " + ex.Message); } } private static void HandleControlFsm(PlayMakerFSM fsm) { PlayMakerFSM fsm2 = fsm; SyncImmortalLightBehaviour(fsm2); SyncVanillaRadianceFixBehaviour(fsm2); MountBehaviour(fsm2, delegate(RadianceReturnOnDialogueBehavior b) { b.Initialize(fsm2); }); } private static T MountBehaviour<T>(PlayMakerFSM fsm, Action<T>? initializer = null) where T : MonoBehaviour { T val = ((Component)fsm).gameObject.GetComponent<T>(); if ((Object)(object)val == (Object)null) { val = ((Component)fsm).gameObject.AddComponent<T>(); Log.Info("[RadiancePatch] 已挂载 " + typeof(T).Name + " 组件"); } initializer?.Invoke(val); return val; } private static void UnmountBehaviour<T>(PlayMakerFSM fsm) where T : MonoBehaviour { T component = ((Component)fsm).gameObject.GetComponent<T>(); if (!((Object)(object)component == (Object)null)) { Object.Destroy((Object)(object)component); Log.Info("[RadiancePatch] 已卸载 " + typeof(T).Name + " 组件"); } } private static void SyncImmortalLightBehaviour(PlayMakerFSM fsm) { PlayMakerFSM fsm2 = fsm; if (Configuration.IsImmortalLightEnabled) { MountBehaviour(fsm2, delegate(RadianceImmortalLightBehavior b) { b.Initialize(fsm2); }); } else { UnmountBehaviour<RadianceImmortalLightBehavior>(fsm2); } } private static void SyncVanillaRadianceFixBehaviour(PlayMakerFSM fsm) { PlayMakerFSM fsm2 = fsm; if (Configuration.IsModEnabled && Configuration.EnableVanillaRadianceFix.Value) { MountBehaviour(fsm2, delegate(RadianceVanillaFixBehavior b) { b.Initialize(fsm2); }); } else { UnmountBehaviour<RadianceVanillaFixBehavior>(fsm2); } } public static void RefreshFeatureBehavioursInScene() { PlayMakerFSM[] array = Object.FindObjectsByType<PlayMakerFSM>((FindObjectsInactive)1, (FindObjectsSortMode)0); PlayMakerFSM[] array2 = array; foreach (PlayMakerFSM val in array2) { if (!((Object)(object)val == (Object)null) && !(((Object)((Component)val).gameObject).name != "Absolute Radiance") && !(val.FsmName != "Control")) { SyncImmortalLightBehaviour(val); SyncVanillaRadianceFixBehaviour(val); } } } public static void RefreshImmortalLightBehavioursInScene() { RefreshFeatureBehavioursInScene(); } public static void RegisterFsmHandler(string fsmName, FsmHandler handler) { if (FsmHandlers.ContainsKey(fsmName)) { Log.Warn("[RadiancePatch] FSM 处理器 [" + fsmName + "] 已存在,将被覆盖"); } FsmHandlers[fsmName] = handler; Log.Info("[RadiancePatch] 已注册 FSM 处理器: " + fsmName); } public static void UnregisterFsmHandler(string fsmName) { if (FsmHandlers.Remove(fsmName)) { Log.Info("[RadiancePatch] 已注销 FSM 处理器: " + fsmName); } } } [HarmonyPatch] internal static class RadiantOrbFixPatches { private const string RadiantOrbName = "Radiant Orb"; [HarmonyPostfix] [HarmonyPatch(typeof(SpawnObjectFromGlobalPool), "OnEnter")] private static void OnRadiantOrbSpawned(SpawnObjectFromGlobalPool __instance) { if (Configuration.IsVanillaRadianceFixEnabled) { FsmGameObject storeObject = __instance.storeObject; GameObject val = ((storeObject != null) ? storeObject.Value : null); if (!((Object)(object)val == (Object)null) && ((Object)val).name.Contains("Radiant Orb") && !((Object)(object)val.GetComponent<RadiantOrbDissipateFixBehavior>() != (Object)null)) { val.AddComponent<RadiantOrbDissipateFixBehavior>(); } } } } [HarmonyPatch] internal static class SceneTransitionPatches { [HarmonyPrefix] [HarmonyPatch(typeof(GameManager), "BeginSceneTransition")] private static bool InterceptSceneTransition(SceneLoadInfo info) { if (!Configuration.IsModEnabled) { return true; } if (!RadianceSceneManager.IsInCustomScene && info.SceneName == "GG_Radiance") { RadianceSceneManager instance = RadianceSceneManager.Instance; if ((Object)(object)instance != (Object)null) { Log.Info("[SceneTransitionPatch] 拦截 TransitionPoint 入场: GG_Radiance,转为 AssetBundle 加载"); instance.EnterViaTransitionPoint(); return false; } } if (RadianceSceneManager.IsInCustomScene) { RadianceSceneManager instance2 = RadianceSceneManager.Instance; if ((Object)(object)instance2 != (Object)null) { Log.Info("[SceneTransitionPatch] 自定义场景内场景转换: " + info.SceneName + ",执行清理"); instance2.CleanupCustomScene(); } } return true; } } [HarmonyPatch] internal static class Tk2dCollectionPatches { [HarmonyPrefix] [HarmonyPriority(800)] [HarmonyPatch(typeof(tk2dSpriteCollectionData), "Init")] private static void NamespaceBeforeInit(tk2dSpriteCollectionData __instance) { if (Configuration.IsModEnabled) { SkinCompatibilityService.TryNamespaceBeforeCollectionInit(__instance, "tk2d.Init.Prefix"); } } } } namespace Radiance.Managers { internal sealed class AssetManager : MonoBehaviour { [CompilerGenerated] private sealed class <EnsureBundleLoadedAsync>d__15 : IEnumerator<object>, IEnumerator, IDisposable { private int <>1__state; private object <>2__current; public AssetManager <>4__this; private AssetBundleCreateRequest <req>5__1; object IEnumerator<object>.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public <EnsureBundleLoadedAsync>d__15(int <>1__state) { this.<>1__state = <>1__state; } [DebuggerHidden] void IDisposable.Dispose() { <req>5__1 = null; <>1__state = -2; } private bool MoveNext() { switch (<>1__state) { default: return false; case 0: <>1__state = -1; if ((Object)(object)<>4__this._bundle != (Object)null) { if (string.IsNullOrEmpty(<>4__this._scenePathInBundle)) { <>4__this.ResolveScenePath(); } return false; } if (<>4__this._bundleBytes == null) { <>4__this._bundleBytes = <>4__this.GetEmbeddedBundleBytes(); } if (<>4__this._bundleBytes == null) { Log.Error("[AssetManager] 无法获取嵌入的 radiance.bundle 字节数据"); return false; } <req>5__1 = AssetBundle.LoadFromMemoryAsync(<>4__this._bundleBytes); <>2__current = <req>5__1; <>1__state = 1; return true; case 1: <>1__state = -1; <>4__this._bundle = <req>5__1.assetBundle; if ((Object)(object)<>4__this._bundle == (Object)null) { Log.Error("[AssetManager] AssetBundle.LoadFromMemoryAsync 失败"); return false; } <>4__this.ResolveScenePath(); 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 <LoadRadianceSceneSingleAsync>d__13 : IEnumerator<object>, IEnumerator, IDisposable { private int <>1__state; private object <>2__current; public AssetManager <>4__this; private AsyncOperation <op>5__1; object IEnumerator<object>.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public <LoadRadianceSceneSingleAsync>d__13(int <>1__state) { this.<>1__state = <>1__state; } [DebuggerHidden] void IDisposable.Dispose() { <op>5__1 = null; <>1__state = -2; } private bool MoveNext() { switch (<>1__state) { default: return false; case 0: <>1__state = -1; <>2__current = <>4__this.EnsureBundleLoadedAsync(); <>1__state = 1; return true; case 1: <>1__state = -1; if (string.IsNullOrEmpty(<>4__this._scenePathInBundle)) { Log.Error("[AssetManager] scenePath 为空,无法加载 GG_Radiance 场景"); return false; } Log.Info("[AssetManager] 加载场景(Single):" + <>4__this._scenePathInBundle); <op>5__1 = SceneManager.LoadSceneAsync(<>4__this._scenePathInBundle, (LoadSceneMode)0); if (<op>5__1 == null) { Log.Error("[AssetManager] SceneManager.LoadSceneAsync 返回 null"); return false; } <>2__current = <op>5__1; <>1__state = 2; return true; case 2: <>1__state = -1; 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 <PreloadAllAssets>d__12 : IEnumerator<object>, IEnumerator, IDisposable { private int <>1__state; private object <>2__current; public AssetManager <>4__this; object IEnumerator<object>.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public <PreloadAllAssets>d__12(int <>1__state) { this.<>1__state = <>1__state; } [DebuggerHidden] void IDisposable.Dispose() { <>1__state = -2; } private bool MoveNext() { switch (<>1__state) { default: return false; case 0: <>1__state = -1; if (<>4__this._isPreloaded || <>4__this._isPreloading) { goto IL_0064; } <>4__this._isPreloading = true; <>2__current = <>4__this.EnsureBundleLoadedAsync(); <>1__state = 2; return true; case 1: <>1__state = -1; goto IL_0064; case 2: { <>1__state = -1; <>4__this._isPreloaded = true; <>4__this._isPreloading = false; Log.Info("[AssetManager] 预加载完成"); return false; } IL_0064: if (<>4__this._isPreloading) { <>2__current = null; <>1__state = 1; return true; } 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 const string EmbeddedBundleName = "Radiance.Asset.radiance.bundle"; private const string EmbeddedBundleSuffix = ".radiance.bundle"; private byte[]? _bundleBytes; private AssetBundle? _bundle; private string? _scenePathInBundle; private bool _isPreloaded; private bool _isPreloading; public bool IsBundleLoaded => (Object)(object)_bundle != (Object)null; public bool IsPreloaded => _isPreloaded; private void Awake() { Log.Info("[AssetManager] 已初始化(Scene bundle 模式)"); } [IteratorStateMachine(typeof(<PreloadAllAssets>d__12))] public IEnumerator PreloadAllAssets() { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new <PreloadAllAssets>d__12(0) { <>4__this = this }; } [IteratorStateMachine(typeof(<LoadRadianceSceneSingleAsync>d__13))] public IEnumerator LoadRadianceSceneSingleAsync() { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new <LoadRadianceSceneSingleAsync>d__13(0) { <>4__this = this }; } public void UnloadBundleKeepLoadedAssets() { if (!((Object)(object)_bundle == (Object)null)) { _bundle.Unload(false); Resources.UnloadUnusedAssets(); _bundle = null; } } [IteratorStateMachine(typeof(<EnsureBundleLoadedAsync>d__15))] private IEnumerator EnsureBundleLoadedAsync() { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new <EnsureBundleLoadedAsync>d__15(0) { <>4__this = this }; } private void ResolveScenePath() { if ((Object)(object)_bundle == (Object)null) { return; } string[] allScenePaths = _bundle.GetAllScenePaths(); if (allScenePaths == null || allScenePaths.Length == 0) { Log.Error("[AssetManager] radiance.bundle 内没有 Scene。请确认打包的是 Scene bundle(包含 GG_Radiance.unity)"); return; } _scenePathInBundle = allScenePaths.FirstOrDefault((string p) => p.IndexOf("gg_radiance", StringComparison.OrdinalIgnoreCase) >= 0) ?? allScenePaths[0]; Log.Info("[AssetManager] ScenePaths: " + string.Join(", ", allScenePaths)); Log.Info("[AssetManager] 选用 scenePath: " + _scenePathInBundle); } private byte[]? GetEmbeddedBundleBytes() { try { Assembly executingAssembly = Assembly.GetExecutingAssembly(); Stream manifestResourceStream = executingAssembly.GetManifestResourceStream("Radiance.Asset.radiance.bundle"); if (manifestResourceStream == null) { string[] manifestResourceNames = executingAssembly.GetManifestResourceNames(); string text = manifestResourceNames.FirstOrDefault((string n) => n.EndsWith(".radiance.bundle", StringComparison.OrdinalIgnoreCase)); if (string.IsNullOrEmpty(text)) { Log.Error("[AssetManager] 未找到嵌入资源:Radiance.Asset.radiance.bundle(也没有匹配 .radiance.bundle 的资源)"); Log.Debug("[AssetManager] 可用嵌入资源:" + string.Join(", ", manifestResourceNames)); return null; } manifestResourceStream = executingAssembly.GetManifestResourceStream(text); Log.Warn("[AssetManager] EmbeddedBundleName 不匹配,使用兜底资源名:" + text); } using (manifestResourceStream) { using MemoryStream memoryStream = new MemoryStream(); manifestResourceStream.CopyTo(memoryStream); return memoryStream.ToArray(); } } catch (Exception ex) { Log.Error("[AssetManager] 读取嵌入 bundle 失败:" + ex.Message); return null; } } private void OnDestroy() { if ((Object)(object)_bundle != (Object)null) { _bundle.Unload(false); _bundle = null; } _bundleBytes = null; } } public class RadianceSceneManager : MonoBehaviour, IWorldRumblePreventer { [CompilerGenerated] private sealed class <EnsureCustomSceneAudioState>d__55 : IEnumerator<object>, IEnumerator, IDisposable { private int <>1__state; private object <>2__current; public RadianceSceneManager <>4__this; private GameManager <gm>5__1; private CustomSceneManager <sm>5__2; private CameraController <cameraController>5__3; object IEnumerator<object>.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public <EnsureCustomSceneAudioState>d__55(int <>1__state) { this.<>1__state = <>1__state; } [DebuggerHidden] void IDisposable.Dispose() { <gm>5__1 = null; <sm>5__2 = null; <cameraController>5__3 = null; <>1__state = -2; } private bool MoveNext() { //IL_008f: Unknown result type (might be due to invalid IL or missing references) //IL_0099: Expected O, but got Unknown //IL_0161: Unknown result type (might be due to invalid IL or missing references) //IL_016b: Expected O, but got Unknown switch (<>1__state) { default: return false; case 0: { <>1__state = -1; <gm>5__1 = GameManager._instance; GameManager obj = <gm>5__1; <sm>5__2 = ((obj != null) ? obj.sm : null); <cameraController>5__3 = GameCameras.instance?.cameraController; if ((Object)(object)<cameraController>5__3 != (Object)null) { <cameraController>5__3.PositionToHero(true); <>2__current = (object)new WaitForSecondsRealtime(0.15f); <>1__state = 1; return true; } goto IL_00aa; } case 1: <>1__state = -1; goto IL_00aa; case 2: { <>1__state = -1; break; } IL_00aa: if ((Object)(object)<gm>5__1 == (Object)null || (Object)(object)<sm>5__2 == (Object)null || (Object)(object)<gm>5__1.AudioManager == (Object)null) { return false; } if (<sm>5__2.IsAudioSnapshotsApplied) { return false; } if (!HasCustomSceneAudioConfig(<sm>5__2)) { <gm>5__1.AudioManager.StopAndClearMusic(); <gm>5__1.AudioManager.StopAndClearAtmos(); AudioManager.CustomSceneManagerReady(); Log.Info("[RadianceSceneManager] 未检测到场景音频配置,已清理旧场景音乐/氛围"); return false; } if ((Object)(object)<cameraController>5__3 != (Object)null) { <cameraController>5__3.PositionToHero(true); <>2__current = (object)new WaitForSecondsRealtime(0.15f); <>1__state = 2; return true; } break; } if (!<sm>5__2.IsAudioSnapshotsApplied) { AudioManager.CustomSceneManagerReady(); Log.Warn("[RadianceSceneManager] 场景音频回调未触发,已执行 Ready 兜底"); } 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 <EnterCustomSceneRoutine>d__41 : IEnumerator<object>, IEnumerator, IDisposable { private int <>1__state; private object <>2__current; public string customSceneName; public Vector3 spawnPosition; public string targetSceneName; public RadianceSceneManager <>4__this; private HeroController <hero>5__1; private AssetManager <assetManager>5__2; private Exception <ex>5__3; object IEnumerator<object>.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public <EnterCustomSceneRoutine>d__41(int <>1__state) { this.<>1__state = <>1__state; } [DebuggerHidden] void IDisposable.Dispose() { <hero>5__1 = null; <assetManager>5__2 = null; <ex>5__3 = null; <>1__state = -2; } private bool MoveNext() { //IL_0193: Unknown result type (might be due to invalid IL or missing references) //IL_019d: Expected O, but got Unknown //IL_01ed: Unknown result type (might be due to invalid IL or missing references) //IL_01f2: Unknown result type (might be due to invalid IL or missing references) //IL_0203: Unknown result type (might be due to invalid IL or missing references) //IL_020e: Unknown result type (might be due to invalid IL or missing references) //IL_021a: Unknown result type (might be due to invalid IL or missing references) //IL_0225: Unknown result type (might be due to invalid IL or missing references) //IL_022c: Unknown result type (might be due to invalid IL or missing references) //IL_022e: Unknown result type (might be due to invalid IL or missing references) //IL_0233: Unknown result type (might be due to invalid IL or missing references) //IL_023f: Expected O, but got Unknown switch (<>1__state) { default: return false; case 0: <>1__state = -1; Log.Info("[RadianceSceneManager] 开始进入自定义场景: " + customSceneName); <hero>5__1 = HeroController.instance; if ((Object)(object)<hero>5__1 == (Object)null || (Object)(object)GameManager._instance == (Object)null) { Log.Error("[RadianceSceneManager] HeroController 或 GameManager 为空"); return false; } <>4__this._targetSceneName = (string.IsNullOrEmpty(targetSceneName) ? "GG_Radiance" : targetSceneName); <>4__this.SaveReturnInfo(); <>4__this.DisablePlayerControl(); <>2__current = <>4__this.PlayEnterAnimation(<hero>5__1); <>1__state = 1; return true; case 1: <>1__state = -1; <>4__this._pendingCustomSceneName = customSceneName; if (<>4__this._targetSceneName == "GG_Radiance") { <assetManager>5__2 = ((Component)<>4__this).GetComponent<AssetManager>(); if ((Object)(object)<assetManager>5__2 == (Object)null) { Log.Error("[RadianceSceneManager] AssetManager 未找到"); <>4__this._pendingCustomSceneName = null; <>4__this.EnablePlayerControl(); return false; } try { GameManager instance = GameManager._instance; if (instance != null) { PlayMakerFSM screenFader_fsm = instance.screenFader_fsm; if (screenFader_fsm != null) { screenFader_fsm.SendEvent("SCENE FADE OUT"); } } } catch { } <>2__current = (object)new WaitForSeconds(0.5f); <>1__state = 2; return true; } try { GameManager._instance.BeginSceneTransition(new SceneLoadInfo { SceneName = <>4__this._targetSceneName, EntryGateName = "", HeroLeaveDirection = (GatePosition)5, EntryDelay = 0f, WaitForSceneTransitionCameraFade = true, Visualization = (SceneLoadVisualizations)0, AlwaysUnloadUnusedAssets = false }); Log.Info("[RadianceSceneManager] 传送到: " + <>4__this._targetSceneName); } catch (Exception ex) { <ex>5__3 = ex; Log.Error("[RadianceSceneManager] 传送失败: " + <ex>5__3.Message); <>4__this._pendingCustomSceneName = null; <>4__this._targetSceneName = ""; <>4__this.EnablePlayerControl(); } break; case 2: <>1__state = -1; <>2__current = <assetManager>5__2.LoadRadianceSceneSingleAsync(); <>1__state = 3; return true; case 3: <>1__state = -1; Log.Info("[RadianceSceneManager] 加载 GG_Radiance 成功"); <assetManager>5__2 = null; break; } 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 <LoadFromTransitionPointRoutine>d__43 : IEnumerator<object>, IEnumerator, IDisposable { private int <>1__state; private object <>2__current; public RadianceSceneManager <>4__this; private AssetManager <assetManager>5__1; object IEnumerator<object>.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public <LoadFromTransitionPointRoutine>d__43(int <>1__state) { this.<>1__state = <>1__state; } [DebuggerHidden] void IDisposable.Dispose() { <assetManager>5__1 = null; <>1__state = -2; } private bool MoveNext() { switch (<>1__state) { default: return false; case 0: <>1__state = -1; <assetManager>5__1 = ((Component)<>4__this).GetComponent<AssetManager>(); if ((Object)(object)<assetManager>5__1 == (Object)null) { Log.Error("[RadianceSceneManager] AssetManager 未找到"); <>4__this._pendingCustomSceneName = null; <>4__this._targetSceneName = ""; <>4__this.EnablePlayerControl(); return false; } if (!<assetManager>5__1.IsPreloaded) { Log.Info("[RadianceSceneManager] 等待资源预加载..."); goto IL_00c4; } goto IL_0130; case 1: <>1__state = -1; goto IL_00c4; case 2: { <>1__state = -1; Log.Info("[RadianceSceneManager] TransitionPoint 触发: GG_Radiance 加载成功"); return false; } IL_00c4: if ((Object)(object)<assetManager>5__1 != (Object)null && !<assetManager>5__1.IsPreloaded) { <>2__current = null; <>1__state = 1; return true; } if ((Object)(object)<assetManager>5__1 == (Object)null) { Log.Error("[RadianceSceneManager] AssetManager 在等待预加载期间被销毁"); <>4__this._pendingCustomSceneName = null; <>4__this._targetSceneName = ""; <>4__this.EnablePlayerControl(); return false; } goto IL_0130; IL_0130: <>2__current = <assetManager>5__1.LoadRadianceSceneSingleAsync(); <>1__state = 2; return true; } } 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 <OnEnterTargetScene>d__46 : IEnumerator<object>, IEnumerator, IDisposable { private int <>1__state; private object <>2__current; public RadianceSceneManager <>4__this; private TransitionPoint <existingTP>5__1; private Exception <ex>5__2; private PlayerData <pd>5__3; private Exception <ex>5__4; object IEnumerator<object>.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public <OnEnterTargetScene>d__46(int <>1__state) { this.<>1__state = <>1__state; } [DebuggerHidden] void IDisposable.Dispose() { <existingTP>5__1 = null; <ex>5__2 = null; <pd>5__3 = null; <ex>5__4 = null; <>1__state = -2; } private bool MoveNext() { //IL_017b: Unknown result type (might be due to invalid IL or missing references) //IL_0185: Expected O, but got Unknown switch (<>1__state) { default: return false; case 0: <>1__state = -1; ShaderCompatibilityService.ResetSession(); SkinCompatibilityService.ResetSession(); <>4__this.CapSilkForRadianceScene(); <>4__this.HandleProblematicComponents(); <>4__this.RemapAudioMixerGroups(); <>4__this.CreateMinimalSceneManager(); <>4__this.RefreshCustomSceneVisualState(); <>4__this.SavePreMemoryState(); <existingTP>5__1 = Object.FindAnyObjectByType<TransitionPoint>(); if ((Object)(object)<existingTP>5__1 != (Object)null) { <existingTP>5__1.isInactive = true; ((InteractableBase)<existingTP>5__1).Deactivate(false); Log.Info("[RadianceSceneManager] 已禁用 TransitionPoint 交互: " + ((Object)((Component)<existingTP>5__1).gameObject).name); } <>4__this.DisableInterferingRenderers(); <>4__this.InitializeHeroAndCameraForCustomEntry(); <>2__current = null; <>1__state = 1; return true; case 1: <>1__state = -1; <>4__this.FixHK1LocalizationTexts(); <>4__this.RunCompatibilityPass("pass1"); <>4__this.RefreshCustomSceneVisualState(); <>2__current = <>4__this.EnsureCustomSceneAudioState(); <>1__state = 2; return true; case 2: <>1__state = -1; <>4__this.ForceApplyInitialCameraLocks(); <>4__this.FadeSceneIn(); <>2__current = (object)new WaitForSeconds(0.5f); <>1__state = 3; return true; case 3: <>1__state = -1; <>4__this.RunCompatibilityPass("pass2"); <>4__this.EnablePlayerControl(); ((MonoBehaviour)<>4__this).StartCoroutine(<>4__this.RunDeferredCompatibilityPass()); try { GameManager instance = GameManager._instance; if (instance != null) { instance.FinishedEnteringScene(); } } catch (Exception ex) { <ex>5__2 = ex; Log.Warn("[RadianceSceneManager] FinishedEnteringScene 失败: " + <ex>5__2.Message); } try { <pd>5__3 = PlayerData.instance; if (<pd>5__3 != null) { <pd>5__3.disablePause = false; <pd>5__3.isInvincible = false; } <pd>5__3 = null; } catch (Exception ex) { <ex>5__4 = ex; Log.Warn("[RadianceSceneManager] 重置 PlayerData 状态失败: " + <ex>5__4.Message); } Log.Info("[RadianceSceneManager] 自定义场景设置完成"); 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 <OnReturnToOriginalScene>d__58 : IEnumerator<object>, IEnumerator, IDisposable { private int <>1__state; private object <>2__current; public RadianceSceneManager <>4__this; private GameManager <gm>5__1; private float <timeout>5__2; private Exception <ex>5__3; object IEnumerator<object>.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public <OnReturnToOriginalScene>d__58(int <>1__state) { this.<>1__state = <>1__state; } [DebuggerHidden] void IDisposable.Dispose() { <gm>5__1 = null; <ex>5__3 = null; <>1__state = -2; } private bool MoveNext() { int num = <>1__state; if (num != 0) { if (num != 1) { return false; } <>1__state = -1; } else { <>1__state = -1; <gm>5__1 = GameManager._instance; if (!((Object)(object)<gm>5__1 != (Object)null)) { goto IL_0097; } <timeout>5__2 = 5f; } if (!<gm>5__1.hasFinishedEnteringScene && <timeout>5__2 > 0f) { <timeout>5__2 -= Time.deltaTime; <>2__current = null; <>1__state = 1; return true; } goto IL_0097; IL_0097: try { GameCameras instance = GameCameras.instance; if (instance != null) { instance.HUDIn(); } } catch (Exception ex) { <ex>5__3 = ex; Log.Warn("[RadianceSceneManager] HUDIn 失败: " + <ex>5__3.Message); } <>4__this._hasSavedReturnInfo = false; Log.Info("[RadianceSceneManager] 已返回原场景"); 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 <PlayEnterAnimation>d__65 : IEnumerator<object>, IEnumerator, IDisposable { private int <>1__state; private object <>2__current; public HeroController hero; public RadianceSceneManager <>4__this; private tk2dSpriteAnimator <tk2dAnimator>5__1; object IEnumerator<object>.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public <PlayEnterAnimation>d__65(int <>1__state) { this.<>1__state = <>1__state; } [DebuggerHidden] void IDisposable.Dispose() { <tk2dAnimator>5__1 = null; <>1__state = -2; } private bool MoveNext() { //IL_00a1: Unknown result type (might be due to invalid IL or missing references) //IL_00ab: Expected O, but got Unknown //IL_00c5: Unknown result type (might be due to invalid IL or missing references) //IL_00cf: Expected O, but got Unknown //IL_0070: Unknown result type (might be due to invalid IL or missing references) //IL_007a: Expected O, but got Unknown switch (<>1__state) { default: return false; case 0: <>1__state = -1; <tk2dAnimator>5__1 = ((Component)hero).GetComponent<tk2dSpriteAnimator>(); if ((Object)(object)<tk2dAnimator>5__1 != (Object)null) { <tk2dAnimator>5__1.Play("Abyss Kneel"); <>2__current = (object)new WaitForSeconds(0.8f); <>1__state = 1; return true; } <>2__current = (object)new WaitForSeconds(1.8f); <>1__state = 3; return true; case 1: <>1__state = -1; <tk2dAnimator>5__1.Play("Kneel To Prostrate"); <>2__current = (object)new WaitForSeconds(1f); <>1__state = 2; return true; case 2: <>1__state = -1; break; case 3: <>1__state = -1; break; } 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 <RunDeferredCompatibilityPass>d__47 : IEnumerator<object>, IEnumerator, IDisposable { private int <>1__state; private object <>2__current; public RadianceSceneManager <>4__this; object IEnumerator<object>.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public <RunDeferredCompatibilityPass>d__47(int <>1__state) { this.<>1__state = <>1__state; } [DebuggerHidden] void IDisposable.Dispose() { <>1__state = -2; } private bool MoveNext() { //IL_0026: Unknown result type (might be due to invalid IL or missing references) //IL_0030: Expected O, but got Unknown switch (<>1__state) { default: return false; case 0: <>1__state = -1; <>2__current = (object)new WaitForSeconds(2f); <>1__state = 1; return true; case 1: <>1__state = -1; if (!IsInCustomScene) { return false; } <>4__this.RunCompatibilityPass("pass_deferred"); 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 string _returnSceneName = ""; private Vector3 _returnPosition; private bool _hasSavedReturnInfo; private string _targetSceneName = ""; private string? _pendingCustomSceneName; private readonly List<TransitionPoint> _disabledTransitionPoints = new List<TransitionPoint>(); private static readonly string[] GlobalRenderersToDisable = new string[1] { "_GameCameras/CameraParent/tk2dCamera/Masker Blackout" }; private static readonly Dictionary<string, (string zh, string fallback)> HK1TextMapVanilla = new Dictionary<string, (string, string)> { { "!!Titles/ABSOLUTE_RADIANCE_MAIN!!", ("无上辐光", "Radiance") }, { "!!Titles/ABSOLUTE_RADIANCE_SUPER!!", ("", "Absolute") } }; private static readonly Dictionary<string, (string zh, string fallback)> HK1TextMapImmortalLight = new Dictionary<string, (string, string)> { { "!!Titles/ABSOLUTE_RADIANCE_MAIN!!", ("永恒之光", "ImmortalLight") }, { "!!Titles/ABSOLUTE_RADIANCE_SUPER!!", ("直面", "Confront") } }; private static readonly BindingFlags PrivateInstanceFlags = BindingFlags.Instance | BindingFlags.NonPublic; private static readonly FieldInfo? MusicCueField = typeof(CustomSceneManager).GetField("musicCue", PrivateInstanceFlags); private static readonly FieldInfo? AtmosCueField = typeof(CustomSceneManager).GetField("atmosCue", PrivateInstanceFlags); private static readonly FieldInfo? MusicSnapshotField = typeof(CustomSceneManager).GetField("musicSnapshot", PrivateInstanceFlags); private static readonly FieldInfo? OverrideColorSettingsField = typeof(CustomSceneManager).GetField("overrideColorSettings", PrivateInstanceFlags); private const int RadianceSilkCap = 9; private static readonly HashSet<string> BossLeftoverNames = new HashSet<string> { "Radiant Nail Comb(Clone)", "Radiant Beam R(Clone)", "Radiant Beam L(Clone)", "Radiant Nail(Clone)" }; public static RadianceSceneManager? Instance { get; private set; } public static bool IsInCustomScene { get; private set; } public static string? CurrentCustomSceneName { get; private set; } public string ReturnSceneName => _returnSceneName; public bool HasReturnInfo => _hasSavedReturnInfo; bool IWorldRumblePreventer.AllowRumble => false; private void Awake() { if ((Object)(object)Instance == (Object)null) { Instance = this; SceneManager.activeSceneChanged += OnSceneChanged; Log.Info("[RadianceSceneManager] 初始化完成"); } else { Object.Destroy((Object)(object)this); } } private void OnDestroy() { SceneManager.activeSceneChanged -= OnSceneChanged; Instance = null; } private void OnSceneChanged(Scene oldScene, Scene newScene) { if (((Scene)(ref newScene)).name == "Menu_Title" || ((Scene)(ref newScene)).name == "Quit_To_Menu") { ResetState(); return; } if (!string.IsNullOrEmpty(_pendingCustomSceneName) && !string.IsNullOrEmpty(_targetSceneName) && ((Scene)(ref newScene)).name == _targetSceneName) { IsInCustomScene = true; CurrentCustomSceneName = _pendingCustomSceneName; _pendingCustomSceneName = null; AddWorldRumblePreventer(); Log.Info("[RadianceSceneManager] 已进入目标场景: " + ((Scene)(ref newScene)).name); ((MonoBehaviour)this).StartCoroutine(OnEnterTargetScene()); return; } if (_hasSavedReturnInfo && ((Scene)(ref newScene)).name == _returnSceneName && !IsInCustomScene) { Log.Info("[RadianceSceneManager] 返回原场景: " + ((Scene)(ref newScene)).name); ((MonoBehaviour)this).StartCoroutine(OnReturnToOriginalScene()); } if (((Scene)(ref newScene)).name == "Belltown") { CreateBelltownTransitionPoint(); } } private void AddWorldRumblePreventer() { WorldRumbleManager val = GameCameras.SilentInstance?.worldRumbleManager; if ((Object)(object)val != (Object)null) { val.AddPreventer((IWorldRumblePreventer)(object)this); Log.Info("[RadianceSceneManager] 已添加 WorldRumble 阻止器(GG_Radiance 无怪叫)"); } } private void RemoveWorldRumblePreventer() { WorldRumbleManager val = GameCameras.SilentInstance?.worldRumbleManager; if ((Object)(object)val != (Object)null) { val.RemovePreventer((IWorldRumblePreventer)(object)this); } } private void ResetState() { RemoveWorldRumblePreventer(); ShaderCompatibilityService.ResetSession(); SkinCompatibilityService.ResetSession(); IsInCustomScene = false; CurrentCustomSceneName = null; _pendingCustomSceneName = null; _hasSavedReturnInfo = false; _disabledTransitionPoints.Clear(); Log.Info("[RadianceSceneManager] 状态已重置"); } private void CreateBelltownTransitionPoint() { //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_000c: Expected O, but got Unknown //IL_0029: Unknown result type (might be due to invalid IL or missing references) //IL_0046: Unknown result type (might be due to invalid IL or missing references) //IL_0085: Unknown result type (might be due to invalid IL or missing references) //IL_008f: Expected O, but got Unknown //IL_0091: Unknown result type (might be due to invalid IL or missing references) //IL_00c1: Unknown result type (might be due to invalid IL or missing references) //IL_00e1: Unknown result type (might be due to invalid IL or missing references) GameObject val = new GameObject("door_radiance"); val.SetActive(false); val.transform.position = new Vector3(50f, 40.7f, 0f); BoxCollider2D val2 = val.AddComponent<BoxCollider2D>(); val2.size = new Vector2(2.13f, 0.2258f); ((Collider2D)val2).isTrigger = true; TransitionPoint val3 = val.AddComponent<TransitionPoint>(); val3.isADoor = true; val3.targetScene = "GG_Radiance"; val3.entryPoint = "door_radiance"; val3.nonHazardGate = true; val3.OnDoorEnter = new UnityEvent(); ((InteractableBase)val3).interactLabel = (PromptLabels)8; typeof(TransitionPoint).GetField("skipSceneMapCheck", BindingFlags.Instance | BindingFlags.NonPublic)?.SetValue(val3, true); SceneManager.MoveGameObjectToScene(val, SceneManager.GetActiveScene()); val.SetActive(true); Log.Info("[RadianceSceneManager] 已在 Belltown 创建传送点 door_radiance"); ((InteractableBase)val3).interactLabel = (PromptLabels)8; SetupBelltownTransitionDecor(); } private void SetupBelltownTransitionDecor() { //IL_005d: Unknown res