Beispiel #1
0
        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);
            }
        }
Beispiel #2
0
        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);
        }
Beispiel #3
0
        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);
        }
Beispiel #4
0
        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());
                }
            };
        }
Beispiel #5
0
 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");
     }
 }
Beispiel #6
0
 internal static void SheduleVRCToolsUpdate()
 {
     if (!errored)
     {
         VRCModLogger.Log("[VRCToolsUpdater] Sheduling update");
         needUpdate = true;
     }
 }
Beispiel #7
0
 void OnDestroy()
 {
     VRCModLogger.Log("[ModComponent] Component destroyed");
     if (!quitting)
     {
         Create();
     }
 }
Beispiel #8
0
        void OnApplicationQuit()
        {
            VRCModLogger.Log("[ModComponent] OnApplicationQuit called");
            if (mods != null)
            {
                mods.OnApplicationQuit();
            }

            quitting = true;
        }
Beispiel #9
0
 void OnLevelWasLoaded(int level)
 {
     VRCModLogger.Log("[ModComponent] OnLevelWasLoaded called (" + level + ")");
     transform.SetAsLastSibling();
     if (mods != null)
     {
         mods.OnLevelWasLoaded(level);
     }
     freshlyLoaded = true;
 }
Beispiel #10
0
        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);
            }
        }
Beispiel #11
0
 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;
         }
     }));
 }
Beispiel #12
0
 void OnLevelWasLoaded(int level)
 {
     VRCModLogger.Log("[ModComponent] OnLevelWasLoaded called (" + level + ")");
     if (level == 0)
     {
         StartCoroutine(VRCToolsUpdater.UpdateAndRebootIfRequired());
     }
     if (mods != null)
     {
         mods.OnLevelWasLoaded(level);
     }
     freshlyLoaded = true;
 }
Beispiel #13
0
        void Awake()
        {
            VRCModLogger.Log("[ModComponent] Awake called");
            DontDestroyOnLoad(gameObject);
            Instance = this;

            if (VRCToolsUpdater.CheckForVRCToolsUpdate())
            {
                VRCToolsUpdater.SheduleVRCToolsUpdate();
            }
            else
            {
                mods = new CompositeModCaller(ModManager.ModControllers);
                mods.OnApplicationStart();
            }
        }
Beispiel #14
0
        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;
            }
        }
Beispiel #15
0
        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("-----------------------------");
        }
Beispiel #16
0
 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;
         }
     }));
 }
Beispiel #17
0
        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);
            }
        }
Beispiel #18
0
        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;
            }
        }
Beispiel #19
0
        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));
                }
            }
        }
Beispiel #20
0
        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("-----------------------------");
        }
Beispiel #21
0
 public static ModComponent Create()
 {
     VRCModLogger.Log("[ModComponent] Creating component");
     return(new GameObject("IPA_ModManager").AddComponent <ModComponent>());
 }
Beispiel #22
0
 void Start()
 {
     VRCModLogger.Log("[ModComponent] Start called");
     OnLevelWasLoaded(Application.loadedLevel);
 }