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.Configuration; using Microsoft.CodeAnalysis; using UnityEngine; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")] [assembly: AssemblyCompany("RemoteBoard")] [assembly: AssemblyConfiguration("Release")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyInformationalVersion("1.0.0")] [assembly: AssemblyProduct("RemoteBoard")] [assembly: AssemblyTitle("RemoteBoard")] [assembly: AssemblyVersion("1.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; } } } [BepInPlugin("aces.remote.managementboard", "Remote Management Board", "1.0.0")] public class Plugin : BaseUnityPlugin { private ConfigEntry OpenKey; private ConfigEntry DumpKey; private ConfigEntry EnableDumpKey; private ConfigEntry PreventOpenIfAlreadyOpen; private ConfigEntry ForceCursorVisible; private ConfigEntry FixOverlappingTabs; private void Awake() { //IL_001b: Unknown result type (might be due to invalid IL or missing references) //IL_006b: Unknown result type (might be due to invalid IL or missing references) //IL_0158: Unknown result type (might be due to invalid IL or missing references) //IL_015d: Unknown result type (might be due to invalid IL or missing references) OpenKey = ((BaseUnityPlugin)this).Config.Bind("Hotkeys", "OpenBoard", new KeyboardShortcut((KeyCode)290, Array.Empty()), "Hotkey used to remotely open the management board. Editable with BepInEx Configuration Manager."); EnableDumpKey = ((BaseUnityPlugin)this).Config.Bind("Debug", "EnableDumpKey", false, "Enable the debug dump hotkey. Leave this off for normal use."); DumpKey = ((BaseUnityPlugin)this).Config.Bind("Debug", "DumpInfoKey", new KeyboardShortcut((KeyCode)291, Array.Empty()), "Debug only: dumps management board object information to BepInEx/LogOutput.log."); PreventOpenIfAlreadyOpen = ((BaseUnityPlugin)this).Config.Bind("Behaviour", "PreventOpenIfAlreadyOpen", true, "If true, pressing the hotkey while the board tabs are already active will do nothing."); ForceCursorVisible = ((BaseUnityPlugin)this).Config.Bind("Behaviour", "ForceCursorVisible", true, "If true, the mod will force the mouse cursor visible after opening the board."); FixOverlappingTabs = ((BaseUnityPlugin)this).Config.Bind("Behaviour", "FixOverlappingTabs", true, "If true, the mod will hide Products Order when the game restores another tab over it."); ((BaseUnityPlugin)this).Logger.LogWarning((object)"============================================="); ((BaseUnityPlugin)this).Logger.LogMessage((object)$"Remote Management Board v{((BaseUnityPlugin)this).Info.Metadata.Version} Initializing..."); ((BaseUnityPlugin)this).Logger.LogWarning((object)"============================================="); ((BaseUnityPlugin)this).Logger.LogMessage((object)"Author: AcesGamingUK"); ((BaseUnityPlugin)this).Logger.LogMessage((object)"GitHub: https://github.com/AcesGamingUK"); ((BaseUnityPlugin)this).Logger.LogMessage((object)("Open hotkey: " + ((object)OpenKey.Value/*cast due to .constrained prefix*/).ToString())); ((BaseUnityPlugin)this).Logger.LogWarning((object)"============================================="); ((BaseUnityPlugin)this).Logger.LogMessage((object)"Remote Management Board Initialized successfully!"); ((BaseUnityPlugin)this).Logger.LogWarning((object)"============================================="); } private void Update() { //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_000b: Unknown result type (might be due to invalid IL or missing references) //IL_002e: Unknown result type (might be due to invalid IL or missing references) //IL_0033: Unknown result type (might be due to invalid IL or missing references) KeyboardShortcut value = OpenKey.Value; if (((KeyboardShortcut)(ref value)).IsDown()) { OpenBoardRemote(); } if (EnableDumpKey.Value) { value = DumpKey.Value; if (((KeyboardShortcut)(ref value)).IsDown()) { DumpBoardInfo(); } } } private void OpenBoardRemote() { if (PreventOpenIfAlreadyOpen.Value && IsBoardAlreadyOpen()) { ((BaseUnityPlugin)this).Logger.LogInfo((object)"Open requested, but management board already appears to be open."); return; } ((BaseUnityPlugin)this).Logger.LogInfo((object)"Remote open requested."); GameObject val = GameObject.Find("Shared_Interactables/ManagerContainer/Interactable_Camera_Manager"); if ((Object)(object)val == (Object)null) { ((BaseUnityPlugin)this).Logger.LogWarning((object)"Interactable_Camera_Manager not found. Falling back to direct board UI open."); ForceShowBoardUI(); return; } ((BaseUnityPlugin)this).Logger.LogInfo((object)("Found interactable: " + GetPath(val.transform))); int num = TrySendPlayMakerEvent(val, "Behaviour", "Send_Data"); ((BaseUnityPlugin)this).Logger.LogInfo((object)("PlayMaker open events attempted on interactable: " + num)); ForceShowBoardUI(); if (ForceCursorVisible.Value) { Cursor.visible = true; Cursor.lockState = (CursorLockMode)0; } ((MonoBehaviour)this).StartCoroutine(DelayedRefresh()); } private bool IsBoardAlreadyOpen() { GameObject val = GameObject.Find("Shared_Interactables/ManagerContainer/Canvas_Manager/Tabs"); if ((Object)(object)val != (Object)null) { return val.activeInHierarchy; } return false; } private IEnumerator DelayedRefresh() { yield return null; yield return null; ForceShowBoardUI(); yield return null; if (FixOverlappingTabs.Value) { FixProductOrderOverlap(); } } private void ForceShowBoardUI() { ManagerBlackboard val = Object.FindObjectOfType(true); if ((Object)(object)val == (Object)null) { ((BaseUnityPlugin)this).Logger.LogWarning((object)"ManagerBlackboard not found."); return; } ((BaseUnityPlugin)this).Logger.LogInfo((object)("ManagerBlackboard found: " + GetPath(((Component)val).transform))); try { ((Component)val).gameObject.SetActive(true); } catch (Exception ex) { ((BaseUnityPlugin)this).Logger.LogWarning((object)("Could not activate board GameObject: " + ex.Message)); } GameObject val2 = GameObject.Find("Shared_Interactables/ManagerContainer/Canvas_Manager"); GameObject val3 = (((Object)(object)val.tabsOBJ != (Object)null) ? val.tabsOBJ : GameObject.Find("Shared_Interactables/ManagerContainer/Canvas_Manager/Tabs")); if ((Object)(object)val2 != (Object)null) { val2.SetActive(true); ((BaseUnityPlugin)this).Logger.LogInfo((object)"Canvas_Manager active."); } if ((Object)(object)val3 != (Object)null) { val3.SetActive(true); ((BaseUnityPlugin)this).Logger.LogInfo((object)("Tabs active: " + GetPath(val3.transform))); } else { ((BaseUnityPlugin)this).Logger.LogWarning((object)"Tabs object not found."); } if (FixOverlappingTabs.Value) { FixProductOrderOverlap(); } try { val.UpdateUnlockedFranchises(); val.ReupdateVisibleProducts(); ((BaseUnityPlugin)this).Logger.LogInfo((object)"ManagerBlackboard refreshed."); } catch (Exception ex2) { ((BaseUnityPlugin)this).Logger.LogError((object)("ManagerBlackboard refresh failed: " + ex2)); } } private void FixProductOrderOverlap() { GameObject val = GameObject.Find("Shared_Interactables/ManagerContainer/Canvas_Manager/Tabs"); if ((Object)(object)val == (Object)null) { return; } Transform val2 = val.transform.Find("ProductsOrder_Tab"); if ((Object)(object)val2 == (Object)null || !((Component)val2).gameObject.activeSelf) { return; } for (int i = 0; i < val.transform.childCount; i++) { Transform child = val.transform.GetChild(i); if (!((Object)(object)child == (Object)null) && !((Object)(object)child == (Object)(object)val2) && ((Component)child).gameObject.activeSelf) { ((Component)val2).gameObject.SetActive(false); ((BaseUnityPlugin)this).Logger.LogInfo((object)("Fixed overlapping tabs: hid ProductsOrder_Tab because " + ((Object)child).name + " is active.")); break; } } } private int TrySendPlayMakerEvent(GameObject obj, string fsmName, string eventName) { if ((Object)(object)obj == (Object)null) { return 0; } int num = 0; Component[] components = obj.GetComponents(); foreach (Component val in components) { if ((Object)(object)val == (Object)null) { continue; } Type type = ((object)val).GetType(); if (type.Name != "PlayMakerFSM") { continue; } string propertyString = GetPropertyString(val, "FsmName"); if (!string.IsNullOrEmpty(fsmName) && propertyString != fsmName) { continue; } MethodInfo method = type.GetMethod("SendEvent", new Type[1] { typeof(string) }); if (method != null) { try { method.Invoke(val, new object[1] { eventName }); ((BaseUnityPlugin)this).Logger.LogInfo((object)("Sent FSM event '" + eventName + "' to " + GetPath(obj.transform) + " / " + propertyString)); num++; } catch (Exception ex) { ((BaseUnityPlugin)this).Logger.LogWarning((object)("Failed sending FSM event '" + eventName + "' to " + propertyString + ": " + ex.Message)); } } else { ((BaseUnityPlugin)this).Logger.LogWarning((object)("PlayMakerFSM.SendEvent(string) not found on " + propertyString)); } } return num; } private string GetPropertyString(object obj, string propertyName) { if (obj == null) { return string.Empty; } try { PropertyInfo property = obj.GetType().GetProperty(propertyName, BindingFlags.Instance | BindingFlags.Public); if (property == null) { return string.Empty; } object value = property.GetValue(obj, null); return (value != null) ? value.ToString() : string.Empty; } catch { return string.Empty; } } private void DumpBoardInfo() { ((BaseUnityPlugin)this).Logger.LogInfo((object)"================ RemoteBoard F10 dump start ================"); ManagerBlackboard val = Object.FindObjectOfType(true); if ((Object)(object)val == (Object)null) { ((BaseUnityPlugin)this).Logger.LogWarning((object)"ManagerBlackboard not found."); } else { ((BaseUnityPlugin)this).Logger.LogInfo((object)("Board path: " + GetPath(((Component)val).transform))); ((BaseUnityPlugin)this).Logger.LogInfo((object)("Board activeSelf/activeInHierarchy: " + ((Component)val).gameObject.activeSelf + "/" + ((Component)val).gameObject.activeInHierarchy)); DumpObj("tabsOBJ", val.tabsOBJ); DumpObj("shortcutsParent", val.shortcutsParent); DumpObj("shopItemsParent", val.shopItemsParent); DumpObj("shoppingListParent", val.shoppingListParent); } DumpSpecific("Shared_Interactables/ManagerContainer/Interactable_Camera_Manager"); DumpSpecific("Shared_Interactables/ManagerContainer/Interactable_Camera_Manager/CameraPoint"); DumpSpecific("Shared_Interactables/ManagerContainer/Canvas_Manager"); DumpSpecific("Shared_Interactables/ManagerContainer/Canvas_Manager/Tabs"); DumpSpecific("Shared_Interactables/ManagerContainer/Canvas_Manager/Buttons_Bar/CloseButton"); ((BaseUnityPlugin)this).Logger.LogInfo((object)"================ RemoteBoard F10 dump end =================="); } private void DumpSpecific(string path) { GameObject val = GameObject.Find(path); if ((Object)(object)val == (Object)null) { ((BaseUnityPlugin)this).Logger.LogWarning((object)("Missing: " + path)); } else { DumpGameObject(val); } } private void DumpObj(string label, GameObject obj) { if ((Object)(object)obj == (Object)null) { ((BaseUnityPlugin)this).Logger.LogWarning((object)(label + ": null")); return; } ((BaseUnityPlugin)this).Logger.LogInfo((object)(label + ": " + GetPath(obj.transform) + " | active " + obj.activeSelf + "/" + obj.activeInHierarchy)); } private void DumpGameObject(GameObject obj) { if ((Object)(object)obj == (Object)null) { return; } Component[] components = obj.GetComponents(); ((BaseUnityPlugin)this).Logger.LogInfo((object)("GameObject: " + GetPath(obj.transform) + " | active " + obj.activeSelf + "/" + obj.activeInHierarchy + " | components: " + components.Length)); Component[] array = components; foreach (Component val in array) { if ((Object)(object)val == (Object)null) { ((BaseUnityPlugin)this).Logger.LogInfo((object)" - "); continue; } ((BaseUnityPlugin)this).Logger.LogInfo((object)(" - " + ((object)val).GetType().FullName)); if (((object)val).GetType().Name == "PlayMakerFSM") { DumpPlayMakerFsm(val); } } } private void DumpPlayMakerFsm(Component fsm) { try { string propertyString = GetPropertyString(fsm, "FsmName"); ((BaseUnityPlugin)this).Logger.LogInfo((object)(" FSM label: FsmName=" + propertyString)); PropertyInfo property = ((object)fsm).GetType().GetProperty("FsmEvents", BindingFlags.Instance | BindingFlags.Public); Array array = ((property != null) ? property.GetValue(fsm, null) : null) as Array; List list = new List(); if (array != null) { foreach (object item in array) { if (item != null) { string propertyString2 = GetPropertyString(item, "Name"); if (!string.IsNullOrEmpty(propertyString2)) { list.Add(propertyString2); } } } } ((BaseUnityPlugin)this).Logger.LogInfo((object)(" FSM events: " + string.Join(", ", list.ToArray()))); } catch (Exception ex) { ((BaseUnityPlugin)this).Logger.LogWarning((object)(" FSM dump failed: " + ex.Message)); } } private string GetPath(Transform transform) { if ((Object)(object)transform == (Object)null) { return ""; } string text = ((Object)transform).name; while ((Object)(object)transform.parent != (Object)null) { transform = transform.parent; text = ((Object)transform).name + "/" + text; } return text; } }