internal static void LoadAllMods() { try { BatchLoading = true; Logger.Log("Loading mod files..."); foreach (string modDir in Directory.GetDirectories(GadgetPaths.ModsPath)) { LoadModDir(modDir); } foreach (string modFile in Directory.GetFiles(GadgetPaths.ModsPath)) { LoadModFile(modFile); } Logger.Log("Done loading mod files."); Logger.Log("Loading mods..."); foreach (GadgetMod mod in GadgetMods.ListAllMods(true)) { LoadGadgetMod(mod); } Logger.Log("Done loading mods."); if (GadgetCoreAPI.GetUMFAPI() != null) { Logger.Log("Loading Gadgets inside UMF mods..."); foreach (string mod in GadgetCoreAPI.GetUMFAPI().GetModNamesEnabled()) { ProcessUMFMod(mod); } Logger.Log("Done loading Gadgets inside UMF mods."); } Logger.Log("Sorting Gadgets..."); Gadgets.SortGadgets(); Logger.Log("Done sorting Gadgets."); Logger.Log("Queueing Gadgets for initialization..."); foreach (GadgetInfo gadget in Gadgets.ListAllEnabledGadgetInfos()) { QueuedGadgets.Add(gadget); } Logger.Log("Done queueing Gadgets."); EnableQueuedGadgets(); BatchLoading = false; Logger.Log("Initial load complete."); } catch (Exception e) { Logger.LogError("Uncaught exception during mod load: " + e); } }
private static void BuildModMenu() { GadgetCore.CoreLogger.Log("Injecting Mod Menu into Main Menu"); ModMenu = new GameObject("MODMENU"); ModMenu.SetActive(false); ModMenuBackButtonBeam = UnityEngine.Object.Instantiate(InstanceTracker.Menuu.menuOptions.transform.Find("beamm").gameObject, ModMenu.transform); ModMenuBackButtonBeam.name = "beamm"; ModMenuBackButtonBeam.transform.localScale = new Vector3(30, 0, 1); ModMenuBackButtonBeam.transform.position = new Vector3(0, -13.5f, 1); ModMenuBackButtonHolder = UnityEngine.Object.Instantiate(InstanceTracker.Menuu.menuOptions.transform.Find("BUTTONHOLDER").gameObject, ModMenu.transform); ModMenuBackButtonHolder.name = "BUTTONHOLDER"; ModMenuBackButtonHolder.transform.position = new Vector3(0, -13.5f, 0); ModMenuBackButtonHolder.GetComponent <Animation>().RemoveClip("bbbac2"); ModMenuBackButtonHolder.GetComponent <Animation>().AddClip(BuildModMenuButtonAnimClip(true), "bbbac2"); ModMenuBackButtonHolder.GetComponent <Animation>().clip = ModMenuBackButtonHolder.GetComponent <Animation>().GetClip("bbbac2"); ModMenuCanvas = new GameObject("Mod Menu Canvas", typeof(RectTransform), typeof(Canvas), typeof(CanvasScaler), typeof(GraphicRaycaster), typeof(CanvasGroup)).GetComponent <Canvas>(); ModMenuCanvas.GetComponent <CanvasGroup>().alpha = 0; ModMenuCanvas.GetComponent <CanvasGroup>().interactable = false; ModMenuCanvas.GetComponent <CanvasGroup>().blocksRaycasts = false; ModMenuCanvas.GetComponent <RectTransform>().pivot = new Vector2(0.5f, 0.5f); ModMenuCanvas.renderMode = RenderMode.ScreenSpaceOverlay; ModMenuCanvas.pixelPerfect = true; CanvasScaler scaler = ModMenuCanvas.GetComponent <CanvasScaler>(); scaler.scaleFactor = 2; scaler.referencePixelsPerUnit = 100; ModConfigMenuText = UnityEngine.Object.Instantiate(InstanceTracker.Menuu.menuOptions.transform.Find("txt0").gameObject, ModMenu.transform); ModConfigMenuText.name = "txt0"; ModConfigMenuText.transform.localPosition = new Vector3(0, 14, -1); Array.ForEach(ModConfigMenuText.GetComponentsInChildren <TextMesh>(), x => { x.text = "MOD CONFIG MENU"; x.anchor = TextAnchor.UpperCenter; }); GameObject restartRequiredText = UnityEngine.Object.Instantiate(ModConfigMenuText, ModMenu.transform); restartRequiredText.SetActive(false); restartRequiredText.name = "Restart Required Text"; restartRequiredText.transform.localPosition = new Vector3(0, -10.5f, -1); restartRequiredText.transform.localScale *= 0.75f; Array.ForEach(restartRequiredText.GetComponentsInChildren <TextMesh>(), x => { x.text = "Restart Required!"; x.anchor = TextAnchor.UpperCenter; }); ModMenuPanel = new GameObject("Panel", typeof(RectTransform), typeof(ModMenuController)).GetComponent <ModMenuController>(); ModMenuPanel.GetComponent <RectTransform>().SetParent(ModMenuCanvas.transform); ModMenuPanel.GetComponent <RectTransform>().anchorMin = new Vector2(0.15f, 0.15f); ModMenuPanel.GetComponent <RectTransform>().anchorMax = new Vector2(0.85f, 0.85f); ModMenuPanel.GetComponent <RectTransform>().offsetMin = Vector2.zero; ModMenuPanel.GetComponent <RectTransform>().offsetMax = Vector2.zero; ModConfigMenus = new GameObject("Mod Config Menus", typeof(RectTransform)).GetComponent <RectTransform>(); ModConfigMenus.SetParent(ModMenuCanvas.transform); ModConfigMenus.anchorMin = new Vector2(0.15f, 0.15f); ModConfigMenus.anchorMax = new Vector2(0.85f, 0.85f); ModConfigMenus.offsetMin = Vector2.zero; ModConfigMenus.offsetMax = Vector2.zero; Image background = new GameObject("Background", typeof(RectTransform), typeof(CanvasRenderer), typeof(Image)).GetComponent <Image>(); background.transform.SetParent(ModMenuPanel.transform); background.rectTransform.anchorMin = new Vector2(0f, 0f); background.rectTransform.anchorMax = new Vector2(01f, 1f); background.rectTransform.offsetMin = Vector2.zero; background.rectTransform.offsetMax = Vector2.zero; background.type = Image.Type.Sliced; background.fillCenter = true; background.sprite = BoxSprite; ModMenuDescPanel = new GameObject("Mod Desc Panel", typeof(RectTransform), typeof(CanvasRenderer), typeof(Image), typeof(ScrollRect)).GetComponent <ScrollRect>(); ModMenuDescPanel.GetComponent <RectTransform>().SetParent(ModMenuPanel.transform); ModMenuDescPanel.GetComponent <RectTransform>().anchorMin = new Vector2(0.4f, 0.25f); ModMenuDescPanel.GetComponent <RectTransform>().anchorMax = new Vector2(1f, 1f); ModMenuDescPanel.GetComponent <RectTransform>().offsetMin = new Vector2(0, 5); ModMenuDescPanel.GetComponent <RectTransform>().offsetMax = new Vector2(-10, -10); ModMenuDescPanel.GetComponent <Image>().sprite = BoxSprite; ModMenuDescPanel.GetComponent <Image>().type = Image.Type.Sliced; ModMenuDescPanel.GetComponent <Image>().fillCenter = true; Mask modMenuDescPanelMask = new GameObject("Mask", typeof(RectTransform), typeof(CanvasRenderer), typeof(Image), typeof(Mask)).GetComponent <Mask>(); modMenuDescPanelMask.GetComponent <RectTransform>().SetParent(ModMenuDescPanel.transform); modMenuDescPanelMask.GetComponent <RectTransform>().anchorMin = new Vector2(0f, 0f); modMenuDescPanelMask.GetComponent <RectTransform>().anchorMax = new Vector2(1f, 1f); modMenuDescPanelMask.GetComponent <RectTransform>().offsetMin = Vector2.zero; modMenuDescPanelMask.GetComponent <RectTransform>().offsetMax = Vector2.zero; modMenuDescPanelMask.GetComponent <Image>().sprite = BoxMask; modMenuDescPanelMask.GetComponent <Image>().type = Image.Type.Sliced; modMenuDescPanelMask.GetComponent <Image>().fillCenter = true; modMenuDescPanelMask.showMaskGraphic = false; RectTransform modMenuDescViewport = new GameObject("Viewport", typeof(RectTransform)).GetComponent <RectTransform>(); modMenuDescViewport.SetParent(modMenuDescPanelMask.transform); modMenuDescViewport.anchorMin = new Vector2(0f, 0f); modMenuDescViewport.anchorMax = new Vector2(1f, 1f); modMenuDescViewport.offsetMin = new Vector2(10, 10); modMenuDescViewport.offsetMax = new Vector2(-10, -10); Text modMenuDescText = new GameObject("Description", typeof(RectTransform), typeof(CanvasRenderer), typeof(Text), typeof(ContentSizeFitter)).GetComponent <Text>(); modMenuDescText.rectTransform.SetParent(modMenuDescViewport); modMenuDescText.rectTransform.anchorMin = new Vector2(0f, 0f); modMenuDescText.rectTransform.anchorMax = new Vector2(1f, 1f); modMenuDescText.rectTransform.offsetMin = Vector2.zero; modMenuDescText.rectTransform.offsetMax = Vector2.zero; modMenuDescText.rectTransform.pivot = new Vector2(0.5f, 1f); modMenuDescText.font = ModConfigMenuText.GetComponent <TextMesh>().font; modMenuDescText.fontSize = 12; modMenuDescText.horizontalOverflow = HorizontalWrapMode.Wrap; modMenuDescText.GetComponent <ContentSizeFitter>().verticalFit = ContentSizeFitter.FitMode.PreferredSize; ModMenuDescPanel.GetComponent <ScrollRect>().content = modMenuDescText.rectTransform; ModMenuDescPanel.GetComponent <ScrollRect>().horizontal = false; ModMenuDescPanel.GetComponent <ScrollRect>().scrollSensitivity = 5; ModMenuDescPanel.GetComponent <ScrollRect>().viewport = modMenuDescViewport; ModMenuPanel.descText = modMenuDescText; ModMenuPanel.restartRequiredText = restartRequiredText; Image modMenuButtonPanel = new GameObject("Button Panel", typeof(RectTransform), typeof(CanvasRenderer), typeof(Image)).GetComponent <Image>(); modMenuButtonPanel.GetComponent <RectTransform>().SetParent(ModMenuPanel.transform); modMenuButtonPanel.GetComponent <RectTransform>().anchorMin = new Vector2(0.4f, 0f); modMenuButtonPanel.GetComponent <RectTransform>().anchorMax = new Vector2(1f, 0.25f); modMenuButtonPanel.GetComponent <RectTransform>().offsetMin = new Vector2(0, 10); modMenuButtonPanel.GetComponent <RectTransform>().offsetMax = new Vector2(-10, -5); modMenuButtonPanel.GetComponent <Image>().sprite = BoxSprite; modMenuButtonPanel.GetComponent <Image>().type = Image.Type.Sliced; modMenuButtonPanel.GetComponent <Image>().fillCenter = true; ModMenuPanel.enableButton = new GameObject("Enable Button", typeof(RectTransform), typeof(CanvasRenderer), typeof(Image), typeof(Button)).GetComponent <Button>(); ModMenuPanel.enableButton.GetComponent <RectTransform>().SetParent(modMenuButtonPanel.transform); ModMenuPanel.enableButton.GetComponent <RectTransform>().anchorMin = new Vector2(0f, 0f); ModMenuPanel.enableButton.GetComponent <RectTransform>().anchorMax = new Vector2(1f / 3f, 1f); ModMenuPanel.enableButton.GetComponent <RectTransform>().offsetMin = new Vector2(10, 10); ModMenuPanel.enableButton.GetComponent <RectTransform>().offsetMax = new Vector2(-10, -10); ModMenuPanel.enableButton.GetComponent <Image>().sprite = BoxSprite; ModMenuPanel.enableButton.GetComponent <Image>().type = Image.Type.Sliced; ModMenuPanel.enableButton.GetComponent <Image>().fillCenter = true; ModMenuPanel.enableButton.targetGraphic = ModMenuPanel.enableButton.GetComponent <Image>(); ModMenuPanel.enableButton.onClick.AddListener(ModMenuPanel.EnableButton); Text enableButtonText = new GameObject("Text", typeof(RectTransform), typeof(CanvasRenderer), typeof(Text)).GetComponent <Text>(); enableButtonText.rectTransform.SetParent(ModMenuPanel.enableButton.transform); enableButtonText.rectTransform.anchorMin = new Vector2(0f, 0f); enableButtonText.rectTransform.anchorMax = new Vector2(1f, 1f); enableButtonText.rectTransform.offsetMin = Vector2.zero; enableButtonText.rectTransform.offsetMax = Vector2.zero; enableButtonText.alignment = TextAnchor.MiddleCenter; enableButtonText.font = modMenuDescText.font; enableButtonText.fontSize = 12; enableButtonText.text = "Enable"; ModMenuPanel.reloadButton = new GameObject("Reload Button", typeof(RectTransform), typeof(CanvasRenderer), typeof(Image), typeof(Button)).GetComponent <Button>(); ModMenuPanel.reloadButton.GetComponent <RectTransform>().SetParent(modMenuButtonPanel.transform); ModMenuPanel.reloadButton.GetComponent <RectTransform>().anchorMin = new Vector2(1f / 3f, 0f); ModMenuPanel.reloadButton.GetComponent <RectTransform>().anchorMax = new Vector2(2f / 3f, 1f); ModMenuPanel.reloadButton.GetComponent <RectTransform>().offsetMin = new Vector2(10, 10); ModMenuPanel.reloadButton.GetComponent <RectTransform>().offsetMax = new Vector2(-10, -10); ModMenuPanel.reloadButton.GetComponent <Image>().sprite = BoxSprite; ModMenuPanel.reloadButton.GetComponent <Image>().type = Image.Type.Sliced; ModMenuPanel.reloadButton.GetComponent <Image>().fillCenter = true; ModMenuPanel.reloadButton.targetGraphic = ModMenuPanel.reloadButton.GetComponent <Image>(); ModMenuPanel.reloadButton.onClick.AddListener(ModMenuPanel.ReloadButton); Text reloadButtonText = new GameObject("Text", typeof(RectTransform), typeof(CanvasRenderer), typeof(Text)).GetComponent <Text>(); reloadButtonText.rectTransform.SetParent(ModMenuPanel.reloadButton.transform); reloadButtonText.rectTransform.anchorMin = new Vector2(0f, 0f); reloadButtonText.rectTransform.anchorMax = new Vector2(1f, 1f); reloadButtonText.rectTransform.offsetMin = Vector2.zero; reloadButtonText.rectTransform.offsetMax = Vector2.zero; reloadButtonText.alignment = TextAnchor.MiddleCenter; reloadButtonText.font = modMenuDescText.font; reloadButtonText.fontSize = 12; reloadButtonText.text = "Reload"; ModMenuPanel.configButton = new GameObject("Config Button", typeof(RectTransform), typeof(CanvasRenderer), typeof(Image), typeof(Button)).GetComponent <Button>(); ModMenuPanel.configButton.GetComponent <RectTransform>().SetParent(modMenuButtonPanel.transform); ModMenuPanel.configButton.GetComponent <RectTransform>().anchorMin = new Vector2(2f / 3f, 0f); ModMenuPanel.configButton.GetComponent <RectTransform>().anchorMax = new Vector2(1f, 1f); ModMenuPanel.configButton.GetComponent <RectTransform>().offsetMin = new Vector2(10, 10); ModMenuPanel.configButton.GetComponent <RectTransform>().offsetMax = new Vector2(-10, -10); ModMenuPanel.configButton.GetComponent <Image>().sprite = BoxSprite; ModMenuPanel.configButton.GetComponent <Image>().type = Image.Type.Sliced; ModMenuPanel.configButton.GetComponent <Image>().fillCenter = true; ModMenuPanel.configButton.targetGraphic = ModMenuPanel.configButton.GetComponent <Image>(); ModMenuPanel.configButton.onClick.AddListener(ModMenuPanel.ConfigButton); Text configButtonText = new GameObject("Text", typeof(RectTransform), typeof(CanvasRenderer), typeof(Text)).GetComponent <Text>(); configButtonText.rectTransform.SetParent(ModMenuPanel.configButton.transform); configButtonText.rectTransform.anchorMin = new Vector2(0f, 0f); configButtonText.rectTransform.anchorMax = new Vector2(1f, 1f); configButtonText.rectTransform.offsetMin = Vector2.zero; configButtonText.rectTransform.offsetMax = Vector2.zero; configButtonText.alignment = TextAnchor.MiddleCenter; configButtonText.font = modMenuDescText.font; configButtonText.fontSize = 12; configButtonText.text = "Configure"; if (GadgetCoreAPI.GetUMFAPI() != null) { ModMenuPanel.umfConfigButton = new GameObject("UMF Config Button", typeof(RectTransform), typeof(CanvasRenderer), typeof(Image), typeof(Button)).GetComponent <Button>(); ModMenuPanel.umfConfigButton.GetComponent <RectTransform>().SetParent(ModMenuCanvas.transform); ModMenuPanel.umfConfigButton.GetComponent <RectTransform>().anchorMin = new Vector2(0.025f, 0.4f); ModMenuPanel.umfConfigButton.GetComponent <RectTransform>().anchorMax = new Vector2(0.125f, 0.6f); ModMenuPanel.umfConfigButton.GetComponent <RectTransform>().offsetMin = new Vector2(0, 0); ModMenuPanel.umfConfigButton.GetComponent <RectTransform>().offsetMax = new Vector2(0, 0); ModMenuPanel.umfConfigButton.GetComponent <Image>().sprite = BoxSprite; ModMenuPanel.umfConfigButton.GetComponent <Image>().type = Image.Type.Sliced; ModMenuPanel.umfConfigButton.GetComponent <Image>().fillCenter = true; ModMenuPanel.umfConfigButton.targetGraphic = ModMenuPanel.umfConfigButton.GetComponent <Image>(); ModMenuPanel.umfConfigButton.onClick.AddListener(ModMenuPanel.UMFConfigButton); Text umfConfigButtonText = new GameObject("Text", typeof(RectTransform), typeof(CanvasRenderer), typeof(Text)).GetComponent <Text>(); umfConfigButtonText.rectTransform.SetParent(ModMenuPanel.umfConfigButton.transform); umfConfigButtonText.rectTransform.anchorMin = new Vector2(0f, 0f); umfConfigButtonText.rectTransform.anchorMax = new Vector2(1f, 1f); umfConfigButtonText.rectTransform.offsetMin = Vector2.zero; umfConfigButtonText.rectTransform.offsetMax = Vector2.zero; umfConfigButtonText.alignment = TextAnchor.MiddleCenter; umfConfigButtonText.font = modMenuDescText.font; umfConfigButtonText.fontSize = 12; umfConfigButtonText.text = "Configure UMF"; } Button configReloadButton = new GameObject("Config Reload Button", typeof(RectTransform), typeof(CanvasRenderer), typeof(Image), typeof(Button)).GetComponent <Button>(); configReloadButton.GetComponent <RectTransform>().SetParent(ModMenuCanvas.transform); configReloadButton.GetComponent <RectTransform>().anchorMin = new Vector2(0.875f, 0.4f); configReloadButton.GetComponent <RectTransform>().anchorMax = new Vector2(0.975f, 0.6f); configReloadButton.GetComponent <RectTransform>().offsetMin = new Vector2(0, 0); configReloadButton.GetComponent <RectTransform>().offsetMax = new Vector2(0, 0); configReloadButton.GetComponent <Image>().sprite = BoxSprite; configReloadButton.GetComponent <Image>().type = Image.Type.Sliced; configReloadButton.GetComponent <Image>().fillCenter = true; configReloadButton.targetGraphic = configReloadButton.GetComponent <Image>(); configReloadButton.onClick.AddListener(() => { foreach (GadgetInfo gadget in Gadgets.ListAllEnabledGadgetInfos()) { if (gadget.Attribute.AllowConfigReloading) { gadget.Gadget.ReloadConfig(); } } if (GadgetCore.UMFAPI != null) { foreach (string mod in GadgetCore.UMFAPI.GetModNames()) { GadgetCore.UMFAPI.SendCommand("cfgReload " + mod); } } GadgetModConfigs.ResetAllConfigMenus(); }); Text configReloadButtonText = new GameObject("Text", typeof(RectTransform), typeof(CanvasRenderer), typeof(Text)).GetComponent <Text>(); configReloadButtonText.rectTransform.SetParent(configReloadButton.transform); configReloadButtonText.rectTransform.anchorMin = new Vector2(0f, 0f); configReloadButtonText.rectTransform.anchorMax = new Vector2(1f, 1f); configReloadButtonText.rectTransform.offsetMin = Vector2.zero; configReloadButtonText.rectTransform.offsetMax = Vector2.zero; configReloadButtonText.alignment = TextAnchor.MiddleCenter; configReloadButtonText.font = modMenuDescText.font; configReloadButtonText.fontSize = 12; configReloadButtonText.text = "Reload Configs"; GadgetModConfigs.ConfigMenus.Clear(); }