public static void Create() { VRCModLogger.Log("[ModComponent] Loading VRLoader.dll"); LoadVRLoader(); VRCModLogger.Log("[ModComponent] VRLoader.dll loaded"); if (!Bootstrapper.loadmods) { return; } try { VRCModLogger.Log("[ModComponent] Creating components"); //First create the mod manager GO, so it gets updated before the modules. GameObject modManagerGO = new GameObject("IPA_ModManager"); modulesGameObject = new GameObject("IPA_VRModules"); modulesGameObject.SetActive(false); // We will enable it when the Ui scene will be loaded. modManagerGO.AddComponent <ModComponent>(); } catch (Exception e) { VRCModLogger.LogError("[ModComponent] Error while creating instance: " + e); } }
internal static bool CheckForVRCToolsUpdate() { vrctoolsPath = Path.GetDirectoryName(Path.GetDirectoryName(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location))) + "\\Mods\\VRCTools.dll"; Directory.CreateDirectory(Path.GetDirectoryName(vrctoolsPath)); VRCModLogger.Log("[VRCToolsUpdater] Supposed VRCToolsPath path: " + vrctoolsPath); foreach (string arg in Environment.GetCommandLineArgs()) { if (arg.ToLower().Equals("--vrctools.forceupdate")) { return(true); } if (arg.ToLower().Equals("--vrctools.noupdate")) { return(false); } } //hash check string fileHash = ""; if (File.Exists(vrctoolsPath)) { using (var md5 = MD5.Create()) { using (var stream = File.OpenRead(vrctoolsPath)) { var hash = md5.ComputeHash(stream); fileHash = BitConverter.ToString(hash).Replace("-", "").ToLowerInvariant(); } } VRCModLogger.Log("[VRCToolsUpdater] Local VRCToolsPath file hash: " + fileHash); WWW hashCheckWWW = new WWW("https://vrchat.survival-machines.fr/vrcmod/VRCToolsHashCheck.php?localhash=" + fileHash); while (!hashCheckWWW.isDone) { ; } int responseCode = getResponseCode(hashCheckWWW); VRCModLogger.Log("[VRCToolsUpdater] hash check webpage returned [" + responseCode + " / " + hashCheckWWW.error + "] \"" + hashCheckWWW.text + "\""); if (responseCode != 200) { errored = true; errorCode = responseCode; return(true); } else if (hashCheckWWW.text.Equals("OUTOFDATE")) { VRCModLogger.Log("[VRCToolsUpdater] Update of VRCTools available"); return(true); } } else { VRCModLogger.Log("[VRCToolsUpdater] Download of VRCTools required"); return(true); } return(false); }
private static IEnumerator ShowPopup(string title, string body, Action <VRCUiPopup> additionnalSetup = null) { VRCModLogger.Log("ShowPopup"); yield return(WaitForUIManager()); if (uiPopupManagerInstance == null) { FieldInfo[] nonpublicStaticPopupFields = typeof(VRCUiPopupManager).GetFields(BindingFlags.NonPublic | BindingFlags.Static); if (nonpublicStaticPopupFields.Length == 0) { VRCModLogger.Log("[VRCToolsUpdater] nonpublicStaticPopupFields.Length == 0"); yield break; } FieldInfo uiPopupManagerInstanceField = nonpublicStaticPopupFields.First(field => field.FieldType == typeof(VRCUiPopupManager)); if (uiPopupManagerInstanceField == null) { VRCModLogger.Log("[VRCToolsUpdater] uiPopupManagerInstanceField == null"); yield break; } uiPopupManagerInstance = uiPopupManagerInstanceField.GetValue(null) as VRCUiPopupManager; } if (uiPopupManagerInstance == null) { VRCModLogger.Log("[VRCToolsUpdater] uiPopupManagerInstance == null"); yield break; } uiPopupManagerInstance.ShowStandardPopup(title, body, additionnalSetup); }
void Awake() { VRCModLogger.Log("[ModComponent] Awake called"); DontDestroyOnLoad(gameObject); Instance = this; try { ModManager.LoadMods(); } catch (Exception e) { VRCModLogger.Log("An error occured while loading mods: " + e); } mods = new CompositeModCaller(ModManager.ModControllers); mods.OnApplicationStart(); SceneManager.sceneLoaded += (scene, method) => { VRCModLogger.Log("[ModComponent] Scene Loaded: " + scene.name); if (scene.name == "ui") { StartCoroutine(StartVRModules()); } }; }
private static IEnumerator WaitForUIManager() { VRCModLogger.Log("WaitForUIManager"); if (uiManagerInstance == null) { FieldInfo[] nonpublicStaticFields = typeof(VRCUiManager).GetFields(BindingFlags.NonPublic | BindingFlags.Static); if (nonpublicStaticFields.Length == 0) { VRCModLogger.Log("[VRCToolsUpdater] nonpublicStaticFields.Length == 0"); yield break; } FieldInfo uiManagerInstanceField = nonpublicStaticFields.First(field => field.FieldType == typeof(VRCUiManager)); if (uiManagerInstanceField == null) { VRCModLogger.Log("[VRCToolsUpdater] uiManagerInstanceField == null"); yield break; } uiManagerInstance = uiManagerInstanceField.GetValue(null) as VRCUiManager; VRCModLogger.Log("[VRCToolsUpdater] Waiting for UI Manager..."); while (uiManagerInstance == null) { uiManagerInstance = uiManagerInstanceField.GetValue(null) as VRCUiManager; yield return(null); } VRCModLogger.Log("[VRCToolsUpdater] UI Manager loaded"); } }
internal static void SheduleVRCToolsUpdate() { if (!errored) { VRCModLogger.Log("[VRCToolsUpdater] Sheduling update"); needUpdate = true; } }
void OnDestroy() { VRCModLogger.Log("[ModComponent] Component destroyed"); if (!quitting) { Create(); } }
void OnApplicationQuit() { VRCModLogger.Log("[ModComponent] OnApplicationQuit called"); if (mods != null) { mods.OnApplicationQuit(); } quitting = true; }
void OnLevelWasLoaded(int level) { VRCModLogger.Log("[ModComponent] OnLevelWasLoaded called (" + level + ")"); transform.SetAsLastSibling(); if (mods != null) { mods.OnLevelWasLoaded(level); } freshlyLoaded = true; }
private static void LoadModsFromAssembly(Assembly assembly) { try { foreach (Type t in assembly.GetLoadableTypes()) { if (t.IsSubclassOf(typeof(VRCMod))) { try { VRCMod modInstance = Activator.CreateInstance(t) as VRCMod; Mods.Add(modInstance); ModControllers.Add(new VRCModController(modInstance)); VRCModInfoAttribute modInfoAttribute = modInstance.GetType().GetCustomAttributes(typeof(VRCModInfoAttribute), true).FirstOrDefault() as VRCModInfoAttribute; if (modInfoAttribute != null) { modInstance.Name = modInfoAttribute.Name; modInstance.Version = modInfoAttribute.Version; modInstance.Author = modInfoAttribute.Author; modInstance.DownloadLink = modInfoAttribute.DownloadLink; } } catch (Exception e) { VRCModLogger.Log("[WARN] [ModManager] Could not load mod " + t.FullName + " in " + assembly.GetName() + "! " + e); } } if (t.IsSubclassOf(typeof(VRModule))) { try { ModuleInfoAttribute moduleInfo; if ((moduleInfo = (t.GetCustomAttributes(typeof(ModuleInfoAttribute), true).FirstOrDefault() as ModuleInfoAttribute)) != null) { VRCModLogger.Log("Adding component " + t); VRModule vrmodule = ModComponent.modulesGameObject.gameObject.AddComponent(t) as VRModule; Modules.Add(vrmodule); vrmodule.Initialize(moduleInfo, moduleManager); } } catch (Exception e) { VRCModLogger.Log("[WARN] [ModManager] Could not load module " + t.FullName + " in " + assembly.GetName() + "! " + e); } } } } catch (Exception e) { VRCModLogger.LogError("[ModManager] Could not load " + assembly.GetName() + "! " + e); } }
private static IEnumerator ShowErrorPopup(string error) { VRCModLogger.Log("[VRCToolsUpdater] Showing error popup"); yield return(ShowPopup("VRCTools Updater", error, "Quit", () => Application.Quit(), (popup) => { if (popup.popupProgressFillImage != null) { popup.popupProgressFillImage.enabled = true; popup.popupProgressFillImage.fillAmount = 0f; downloadProgressFillImage = popup.popupProgressFillImage; } })); }
void OnLevelWasLoaded(int level) { VRCModLogger.Log("[ModComponent] OnLevelWasLoaded called (" + level + ")"); if (level == 0) { StartCoroutine(VRCToolsUpdater.UpdateAndRebootIfRequired()); } if (mods != null) { mods.OnLevelWasLoaded(level); } freshlyLoaded = true; }
void Awake() { VRCModLogger.Log("[ModComponent] Awake called"); DontDestroyOnLoad(gameObject); Instance = this; if (VRCToolsUpdater.CheckForVRCToolsUpdate()) { VRCToolsUpdater.SheduleVRCToolsUpdate(); } else { mods = new CompositeModCaller(ModManager.ModControllers); mods.OnApplicationStart(); } }
void Awake() { VRCModLogger.Init(); VRCModLogger.Log("[VRCModLoader] Logger Initialised"); if (Environment.CommandLine.Contains("--verbose") || ModPrefs.GetBool("vrctools", "enabledebugconsole", false)) { VRCModLogger.consoleEnabled = true; GuiConsole.CreateConsole(); VRCModLogger.Log("[VRCModLoader] Bootstrapper created"); } if (Environment.CommandLine.Contains("--nomodloader")) { loadmods = false; } }
private static void LoadMods() { string tmpmodDirectory = Path.Combine(Path.GetTempPath(), "VRCModLoaderMods"); string modDirectory = Path.Combine(Environment.CurrentDirectory, "Mods"); if (Directory.Exists(tmpmodDirectory)) { Directory.Delete(tmpmodDirectory, true); // delete the temp directory if existing } // Process.GetCurrentProcess().MainModule crashes the game and Assembly.GetEntryAssembly() is NULL, // so we need to resort to P/Invoke string exeName = Path.GetFileNameWithoutExtension(AppInfo.StartupPath); VRCModLogger.Log(exeName); _Mods = new List <VRCMod>(); _ModControllers = new List <VRCModController>(); if (!Directory.Exists(modDirectory)) { return; } Directory.CreateDirectory(tmpmodDirectory); String[] files = Directory.GetFiles(modDirectory, "*.dll"); foreach (var s in files) { string newPath = tmpmodDirectory + s.Substring(modDirectory.Length); VRCModLogger.Log("Copying " + s + " to " + newPath); File.Copy(s, newPath); LoadModsFromFile(newPath, exeName); } // DEBUG VRCModLogger.Log("Running on Unity " + UnityEngine.Application.unityVersion); VRCModLogger.Log("-----------------------------"); VRCModLogger.Log("Loading mods from " + tmpmodDirectory + " and found " + _Mods.Count); VRCModLogger.Log("-----------------------------"); foreach (var mod in _Mods) { VRCModLogger.Log(" " + mod.Name + " (" + mod.Version + ") by " + mod.Author + (mod.DownloadLink != null ? " (" + mod.DownloadLink + ")" : "")); } VRCModLogger.Log("-----------------------------"); }
private static IEnumerator ShowUpdatePopup() { /* * uiManagerInstance.HideScreen("SCREEN"); * //uiManagerInstance.ShowScreen("UserInterface/MenuContent/Screens/UpdateRequired"); * //uiManagerInstance.ShowScreen("UserInterface/MenuContent/Screens/Title"); * //uiManagerInstance.ShowScreen("UserInterface/MenuContent/Popups/LoadingPopup"); * //uiManagerInstance.ShowScreen("UserInterface/MenuContent/Backdrop/Backdrop"); */ VRCModLogger.Log("[VRCToolsUpdater] Showing update popup"); yield return(ShowPopup("VRCTools Updater", "Updating VRCTools", "Quit", () => Application.Quit(), (popup) => { if (popup.popupProgressFillImage != null) { popup.popupProgressFillImage.enabled = true; popup.popupProgressFillImage.fillAmount = 0f; downloadProgressFillImage = popup.popupProgressFillImage; } })); }
private static void LoadModsFromFile(string file, string exeName) { List <VRCMod> mods = new List <VRCMod>(); if (!File.Exists(file) || !file.EndsWith(".dll", true, null)) { return; } try { Assembly assembly = Assembly.LoadFrom(file); foreach (Type t in assembly.GetLoadableTypes()) { if (t.IsSubclassOf(typeof(VRCMod))) { try { VRCMod modInstance = Activator.CreateInstance(t) as VRCMod; _Mods.Add(modInstance); _ModControllers.Add(new VRCModController(modInstance)); VRCModInfoAttribute modInfoAttribute = modInstance.GetType().GetCustomAttributes(typeof(VRCModInfoAttribute), true).FirstOrDefault() as VRCModInfoAttribute; if (modInfoAttribute != null) { modInstance.Name = modInfoAttribute.Name; modInstance.Version = modInfoAttribute.Version; modInstance.Author = modInfoAttribute.Author; modInstance.DownloadLink = modInfoAttribute.DownloadLink; } } catch (Exception e) { VRCModLogger.Log("[WARN] [ModManager] Could not load mod " + t.FullName + " in " + Path.GetFileName(file) + "! " + e); } } } } catch (Exception e) { VRCModLogger.LogError("[ModManager] Could not load " + Path.GetFileName(file) + "! " + e); } }
void Awake() { VRCModLogger.Init(); VRCModLogger.Log("[VRCModLoader] Logger Initialised"); if (Environment.CommandLine.Contains("--verbose") || ModPrefs.GetBool("vrctools", "enabledebugconsole", false)) { VRCModLogger.consoleEnabled = true; if (Application.platform == RuntimePlatform.WindowsPlayer) { CreateConsole(); } VRCModLogger.Log("[VRCModLoader] Bootstrapper created"); } if (Environment.CommandLine.Contains("--nomodloader")) { loadmods = false; } }
internal static IEnumerator UpdateAndRebootIfRequired() { if (needUpdate || errored) { bool goForUpdate = needUpdate; needUpdate = false; VRCModLogger.Log("[VRCToolsUpdater] Looking for VRCFlowManager"); VRCFlowManager[] flowManagers = Resources.FindObjectsOfTypeAll <VRCFlowManager>(); foreach (VRCFlowManager flowManager in flowManagers) { flowManager.enabled = false; } VRCModLogger.Log("[VRCToolsUpdater] Disabled " + flowManagers.Length + " VRCFlowManager"); if (GameObject.Find("UserInterface") == null) { VRCModLogger.Log("[VRCToolsUpdater] Loading additive scene \"ui\""); AssetManagement.LoadLevelAdditive("ui"); } if (goForUpdate) { needUpdate = false; bool choiceDone = false; bool update = false; yield return(ShowPopup("VRCTools Updater", "A VRCTools update is available", "Update", () => { choiceDone = true; update = true; }, "Ignore", () => { choiceDone = true; })); yield return(new WaitUntil(() => choiceDone)); if (update) { yield return(ShowUpdatePopup()); VRCModLogger.Log("[VRCToolsUpdater] Update popup shown"); WWW vrctoolsDownload = new WWW("https://vrchat.survival-machines.fr/vrcmod/VRCTools.dll"); yield return(vrctoolsDownload); while (!vrctoolsDownload.isDone) { VRCModLogger.Log("[VRCToolsUpdater] Download progress: " + vrctoolsDownload.progress); downloadProgressFillImage.fillAmount = vrctoolsDownload.progress; yield return(null); } int responseCode = getResponseCode(vrctoolsDownload); VRCModLogger.Log("[VRCToolsUpdater] Download done ! response code: " + responseCode); VRCModLogger.Log("[VRCToolsUpdater] File size: " + vrctoolsDownload.bytes.Length); if (responseCode == 200) { yield return(ShowPopup("VRCTools Updater", "Saving VRCTools")); VRCModLogger.Log("[VRCToolsUpdater] Saving file"); File.WriteAllBytes(vrctoolsPath, vrctoolsDownload.bytes); VRCModLogger.Log("[VRCToolsUpdater] Showing restart dialog"); choiceDone = false; yield return(ShowPopup("VRCTools Updater", "Update downloaded", "Restart", () => { choiceDone = true; })); yield return(new WaitUntil(() => choiceDone)); yield return(ShowPopup("VRCTools Updater", "Restarting game")); VRCModLogger.Log("[VRCToolsUpdater] Rebooting game"); string args = ""; bool first = true; foreach (string arg in Environment.GetCommandLineArgs()) { if (first) { first = false; } else { args = args + arg + " "; } } Thread t = new Thread(() => { Thread.Sleep(1000); System.Diagnostics.Process.Start(Path.GetDirectoryName(Path.GetDirectoryName(vrctoolsPath)) + "\\VRChat.exe", args); Thread.Sleep(100); }); t.Start(); Application.Quit(); } else { yield return(ShowErrorPopup("Unable to update VRCTools: Server returned code " + responseCode)); } } else { uiPopupManagerInstance.HideCurrentPopup(); foreach (VRCFlowManager flowManager in flowManagers) { flowManager.enabled = true; } VRCModLogger.Log("[VRCToolsUpdater] Enabled " + flowManagers.Length + " VRCFlowManager"); } } else if (errored) { yield return(ShowErrorPopup("Unable to check VRCTools validity: Server returned code " + errorCode)); } } }
internal static void LoadMods() { VRCModLogger.Log("Looking for mods"); string modDirectory = Path.Combine(Environment.CurrentDirectory, "Mods"); string exeName = Path.GetFileNameWithoutExtension(AppInfo.StartupPath); VRCModLogger.Log(exeName); Mods = new List <VRCMod>(); ModControllers = new List <VRCModController>(); Modules = new List <VRModule>(); if (moduleManager == null) { moduleManager = new ModuleManager(); ModComponent.Instance.gameObject.AddComponent <VRLoader.VRLoader>(); } if (!Directory.Exists(modDirectory)) { return; } string[] files = Directory.GetFiles(modDirectory, "*.dll"); foreach (string s in files) { if (!File.Exists(s) || !s.EndsWith(".dll", true, null)) { return; } VRCModLogger.Log("Loading " + s); try { byte[] data = File.ReadAllBytes(s); Assembly a = Assembly.Load(data); loadedAssemblies.Add(a); } catch (Exception e) { VRCModLogger.LogError("Unable to load assembly " + s + ":\n" + e); } } foreach (Assembly a in loadedAssemblies) { VRCModLogger.Log("Loading mods from " + a.GetName()); LoadModsFromAssembly(a); } // DEBUG VRCModLogger.Log("Running on Unity " + Application.unityVersion + ", using VRCModLoader " + VERSION); VRCModLogger.Log("-----------------------------"); VRCModLogger.Log("Loading mods from " + modDirectory + " and found " + Mods.Count + " VRCMods and " + Modules.Count + " VRModules."); VRCModLogger.Log("-----------------------------"); foreach (var mod in Mods) { VRCModLogger.Log(" " + mod.Name + " (" + mod.Version + ") by " + mod.Author + (mod.DownloadLink != null ? " (" + mod.DownloadLink + ")" : "")); } VRCModLogger.Log("-----------------------------"); foreach (var mod in Modules) { VRCModLogger.Log(" " + mod.Name + " (" + mod.Version + ") by " + mod.Author); } VRCModLogger.Log("-----------------------------"); }
public static ModComponent Create() { VRCModLogger.Log("[ModComponent] Creating component"); return(new GameObject("IPA_ModManager").AddComponent <ModComponent>()); }
void Start() { VRCModLogger.Log("[ModComponent] Start called"); OnLevelWasLoaded(Application.loadedLevel); }