private void SceneLoaded(Scene scene, LoadSceneMode lsm) { try { if (_uim != null || ModLoader.LoadedMods == null || UIManager.instance == null) { return; } } catch (NullReferenceException) { //Do Nothing. Something inside of UIManager.instance breaks even if you try to check for null on it. return; } _uim = UIManager.instance; //ADD MODS TO OPTIONS MENU MenuButton defButton = (MenuButton)_uim.optionsMenuScreen.defaultHighlight; MenuButton modButton = Object.Instantiate(defButton.gameObject).GetComponent <MenuButton>(); _uim.optionsMenuScreen.GetComponent <Patches.MenuButtonList>().AddSelectable(modButton, 5); modButton.name = "Mods"; modButton.transform.SetParent(defButton.FindSelectableOnDown().FindSelectableOnDown().FindSelectableOnDown() .FindSelectableOnDown().transform.parent); modButton.transform.localPosition = new Vector2(0, -120); modButton.transform.localScale = defButton.FindSelectableOnDown().FindSelectableOnDown().FindSelectableOnDown() .FindSelectableOnDown().transform.localScale; Object.Destroy(modButton.gameObject.GetComponent <AutoLocalizeTextUI>()); modButton.gameObject.transform.Find("Text").GetComponent <Text>().text = "Mods"; //ADD MODS TO OPTIONS MENU //SETUP MOD MENU GameObject go = Object.Instantiate(_uim.optionsMenuScreen.gameObject); ModMenuScreen = go.GetComponent <MenuScreen>(); ModMenuScreen.title = ModMenuScreen.gameObject.transform.Find("Title").GetComponent <CanvasGroup>(); ModMenuScreen.topFleur = ModMenuScreen.gameObject.transform.Find("TopFleur").GetComponent <Animator>(); ModMenuScreen.content = ModMenuScreen.gameObject.transform.Find("Content").GetComponent <CanvasGroup>(); Patches.MenuButtonList modButtons = go.GetComponent <Patches.MenuButtonList>(); modButtons.ClearSelectables(); ModMenuScreen.title.gameObject.GetComponent <Text>().text = "Mods"; Object.Destroy(ModMenuScreen.title.gameObject.GetComponent <AutoLocalizeTextUI>()); ModMenuScreen.transform.SetParent(_uim.optionsMenuScreen.gameObject.transform.parent); ModMenuScreen.transform.localPosition = _uim.optionsMenuScreen.gameObject.transform.localPosition; ModMenuScreen.transform.localScale = _uim.optionsMenuScreen.gameObject.transform.localScale; List <ITogglableMod> managableMods = ModLoader.LoadedMods.Where(x => x is ITogglableMod).Select(x => x) .Cast <ITogglableMod>() .ToList(); ModMenuScreen.defaultHighlight = ModMenuScreen.content.gameObject.transform.GetChild(0).GetChild(0) .GetComponent <MenuButton>(); Object.Destroy(ModMenuScreen.defaultHighlight.FindSelectableOnDown().FindSelectableOnDown() .FindSelectableOnDown().FindSelectableOnDown().gameObject.transform.parent.gameObject); Object.Destroy(ModMenuScreen.defaultHighlight.FindSelectableOnDown().FindSelectableOnDown() .FindSelectableOnDown().gameObject.transform.parent.gameObject); Object.Destroy(ModMenuScreen.defaultHighlight.FindSelectableOnDown().FindSelectableOnDown().gameObject .transform.parent.gameObject); Object.Destroy(ModMenuScreen.defaultHighlight.FindSelectableOnDown().gameObject.transform.parent .gameObject); _back = ModMenuScreen.defaultHighlight.FindSelectableOnUp(); GameObject item = _uim.videoMenuScreen.defaultHighlight.FindSelectableOnDown().gameObject; Object.DestroyImmediate(item.GetComponent <MenuOptionHorizontal>()); Object.DestroyImmediate(item.GetComponent <MenuSetting>()); Object.DestroyImmediate(ModMenuScreen.content.GetComponent <VerticalLayoutGroup>()); Object.Destroy(ModMenuScreen.defaultHighlight.gameObject.transform.parent.gameObject); try { if (managableMods.Count > 0) { _modArray = new Selectable[managableMods.Count]; for (int i = 0; i < managableMods.Count; i++) { GameObject menuItemParent = Object.Instantiate(item.gameObject); FauxMenuOptionHorizontal menuItem = menuItemParent.AddComponent <FauxMenuOptionHorizontal>(); menuItem.navigation = new Navigation { mode = Navigation.Mode.Explicit }; modButtons.AddSelectable(menuItem); int modIndex = i; //Manages what should happen when the menu option changes (the user clicks and the mod is toggled On/Off) menuItem.OnUpdate += optionIndex => { ITogglableMod mod = managableMods[modIndex]; string name = mod.GetName(); if (!ModHooks.Instance.GlobalSettings.ModEnabledSettings.ContainsKey(name)) { ModHooks.Instance.GlobalSettings.ModEnabledSettings.Add(name, true); } try { if (optionIndex == 1) { ModLoader.UnloadMod(mod); } else { ModLoader.LoadMod(mod, true); } } catch (Exception e) { LogError($"Could not load/unload mod \"{name}\":\n{e}"); } }; menuItem.OptionList = new[] { "On", "Off" }; menuItem.OptionText = menuItem.gameObject.transform.GetChild(1).GetComponent <Text>(); menuItem.SelectedOptionIndex = ModHooks.Instance.GlobalSettings.ModEnabledSettings[managableMods[i].GetName()] ? 0 : 1; menuItem.LocalizeText = false; menuItem.SheetTitle = managableMods[i].GetName(); Object.DestroyImmediate(menuItem.transform.Find("Label") .GetComponent <AutoLocalizeTextUI>()); menuItem.transform.Find("Label").GetComponent <Text>().text = managableMods[i].GetName(); menuItem.leftCursor = menuItem.transform.Find("CursorLeft").GetComponent <Animator>(); menuItem.rightCursor = menuItem.transform.Find("CursorRight").GetComponent <Animator>(); menuItem.gameObject.name = managableMods[i].GetName(); RectTransform rt = menuItemParent.GetComponent <RectTransform>(); rt.SetParent(ModMenuScreen.content.transform); rt.localScale = new Vector3(2, 2, 2); rt.sizeDelta = new Vector2(960, 120); rt.anchoredPosition = new Vector2(0, 766 / 2 - 90 - 150 * i); rt.anchorMin = new Vector2(0.5f, 1.0f); rt.anchorMax = new Vector2(0.5f, 1.0f); menuItem.cancelAction = CancelAction.QuitModMenu; _modArray[i] = menuItem; } } } catch (Exception ex) { LogError(ex); } _back.navigation = new Navigation { mode = Navigation.Mode.Explicit }; modButtons.AddSelectable(_back); modButtons.RecalculateNavigation(); ((MenuSelectable)_back).cancelAction = CancelAction.QuitModMenu; EventTrigger backEvents = _back.gameObject.GetComponent <EventTrigger>(); backEvents.triggers = new List <EventTrigger.Entry>(); EventTrigger.Entry backSubmit = new EventTrigger.Entry { eventID = EventTriggerType.Submit }; backSubmit.callback.AddListener(data => { _fauxUim.UIquitModMenu(); }); backEvents.triggers.Add(backSubmit); EventTrigger.Entry backClick = new EventTrigger.Entry { eventID = EventTriggerType.PointerClick }; backClick.callback.AddListener(data => { _fauxUim.UIquitModMenu(); }); backEvents.triggers.Add(backClick); //SETUP MOD MENU LogDebug("About to add the events to the menu option"); //SETUP MOD BUTTON TO RESPOND TO SUBMIT AND CANCEL EVENTS CORRECTLY EventTrigger events = modButton.gameObject.GetComponent <EventTrigger>(); events.triggers = new List <EventTrigger.Entry>(); EventTrigger.Entry submit = new EventTrigger.Entry { eventID = EventTriggerType.Submit }; submit.callback.AddListener(data => { _fauxUim.UIloadModMenu(); }); events.triggers.Add(submit); EventTrigger.Entry click = new EventTrigger.Entry { eventID = EventTriggerType.PointerClick }; click.callback.AddListener(data => { _fauxUim.UIloadModMenu(); }); events.triggers.Add(click); //SETUP MOD BUTTON TO RESPOND TO SUBMIT AND CANCEL EVENTS CORRECTLY }
private void SceneLoaded(Scene scene, LoadSceneMode lsm) { if ( _uim != null || ModLoader.LoadedMods == null || UIManager.instance == null || scene.name != Constants.MENU_SCENE ) { return; } _uim = UIManager.instance; var defButton = (MenuButton)_uim.optionsMenuScreen.defaultHighlight; var modButton = UObject.Instantiate(defButton.gameObject).GetComponent <MenuButton>(); modButton.name = "Mods"; _uim.optionsMenuScreen.GetComponent <Patches.MenuButtonList>().AddSelectable(modButton, 5); Selectable sel = FindSelectable(defButton, 4, FindSelectableOnDown); modButton.transform.parent = sel.transform.parent; modButton.transform.localPosition = new Vector2(0, -120); modButton.transform.localScale = sel.transform.localScale; UObject.Destroy(modButton.gameObject.GetComponent <AutoLocalizeTextUI>()); modButton.GetComponentInChildren <Text>().text = "Mods"; GameObject go = UObject.Instantiate(_uim.optionsMenuScreen.gameObject); ModMenuScreen = go.GetComponent <MenuScreen>(); ModMenuScreen.title = ModMenuScreen.transform.Find("Title").GetComponent <CanvasGroup>(); ModMenuScreen.topFleur = ModMenuScreen.transform.Find("TopFleur").GetComponent <Animator>(); ModMenuScreen.content = ModMenuScreen.transform.Find("Content").GetComponent <CanvasGroup>(); Patches.MenuButtonList modButtons = go.GetComponent <Patches.MenuButtonList>(); modButtons.ClearSelectables(); ModMenuScreen.title.gameObject.GetComponent <Text>().text = "Mods"; UObject.Destroy(ModMenuScreen.title.gameObject.GetComponent <AutoLocalizeTextUI>()); ModMenuScreen.transform.parent = _uim.optionsMenuScreen.transform.parent; ModMenuScreen.transform.localPosition = _uim.optionsMenuScreen.transform.localPosition; ModMenuScreen.transform.localScale = _uim.optionsMenuScreen.transform.localScale; List <ITogglableMod> managableMods = ModLoader.LoadedMods.OfType <ITogglableMod>().ToList(); ModMenuScreen.defaultHighlight = ModMenuScreen.content.gameObject.transform.GetChild(0) .GetChild(0) .GetComponent <MenuButton>(); for (int i = 4; i >= 1; i--) { DestroyParent ( FindSelectable(ModMenuScreen.defaultHighlight, i, FindSelectableOnDown) ); } _back = ModMenuScreen.defaultHighlight.FindSelectableOnUp(); GameObject item = _uim.videoMenuScreen.defaultHighlight.FindSelectableOnDown().gameObject; UObject.DestroyImmediate(item.GetComponent <MenuOptionHorizontal>()); UObject.DestroyImmediate(item.GetComponent <MenuSetting>()); UObject.DestroyImmediate(ModMenuScreen.content.GetComponent <VerticalLayoutGroup>()); DestroyParent(ModMenuScreen.defaultHighlight); try { SetupMods(managableMods, item); } catch (Exception ex) { LogError(ex); } _back.navigation = new Navigation { mode = Navigation.Mode.Explicit }; modButtons.AddSelectable(_back); modButtons.RecalculateNavigation(); ((MenuSelectable)_back).cancelAction = CancelAction.QuitModMenu; void Quit(BaseEventData data) => _fauxUim.UIquitModMenu(); void Load(BaseEventData data) => _fauxUim.UIloadModMenu(); EventTrigger[] ets = { _back.GetComponent <EventTrigger>(), modButton.GetComponent <EventTrigger>() }; for (int i = 0; i < ets.Length; i++) { EventTrigger et = ets[i]; et.triggers = new List <EventTrigger.Entry>(); foreach (EventTriggerType type in new EventTriggerType[] { EventTriggerType.Submit, EventTriggerType.PointerClick }) { var trigger = new EventTrigger.Entry { eventID = type }; trigger.callback.AddListener ( i == 0 ? (UnityAction <BaseEventData>)Quit : Load ); et.triggers.Add(trigger); } } }