/// <summary> /// Main function to initialize the ModLoader /// </summary> public static void Init() { //Set config and Assets folder in selected mods folder ConfigFolder = Path.Combine(ModsFolder, @"Config\"); AssetsFolder = Path.Combine(ModsFolder, @"Assets\"); //if mods not loaded and game is loaded. if (GameObject.Find("MSCUnloader") == null) { GameObject go = new GameObject(); go.name = "MSCUnloader"; go.AddComponent <MSCUnloader>(); MSCUnloaderInstance = go.GetComponent <MSCUnloader>(); DontDestroyOnLoad(go); } if (IsModsDoneLoading && Application.loadedLevelName == "MainMenu") { MSCUnloaderInstance.reset = false; MSCUnloaderInstance.MSCLoaderReset(); } if (!IsModsDoneLoading && Application.loadedLevelName == "GAME" && fullyLoaded && !IsModsLoading) { // Load all mods IsModsLoading = true; Instance.StartCoroutine(Instance.LoadMods()); } if (IsDoneLoading && Application.loadedLevelName == "MainMenu" && GameObject.Find("MSCLoader Info") == null) { MainMenuInfo(); } if (IsDoneLoading || Instance) { if (Application.loadedLevelName != "MainMenu") { menuInfoAnim.SetBool("isHidden", true); } } else { // Create game object and attach self GameObject go = new GameObject(); go.name = "MSCModLoader"; go.AddComponent <ModLoader>(); go.AddComponent <LoadAssets>(); Instance = go.GetComponent <ModLoader>(); loadAssets = go.GetComponent <LoadAssets>(); DontDestroyOnLoad(go); // Init variables ModUI.CreateCanvas(); IsDoneLoading = false; IsModsDoneLoading = false; LoadedMods = new List <Mod>(); InvalidMods = new List <string>(); // Init mod loader settings if (!Directory.Exists(ModsFolder)) { //if mods folder not exists, create it. Directory.CreateDirectory(ModsFolder); } if (!Directory.Exists(ConfigFolder)) { //if config folder not exists, create it. Directory.CreateDirectory(ConfigFolder); } if (!Directory.Exists(AssetsFolder)) { //if config folder not exists, create it. Directory.CreateDirectory(AssetsFolder); } // Loading internal tools (console and settings) LoadMod(new ModConsole(), Version); LoadedMods[0].ModSettings(); LoadMod(new ModSettings_menu(), Version); LoadedMods[1].ModSettings(); ModSettings_menu.LoadSettings(); LoadCoreAssets(); IsDoneLoading = true; ModConsole.Print(string.Format("<color=green>ModLoader <b>v{0}</b> ready</color>", Version)); LoadReferences(); PreLoadMods(); ModConsole.Print(string.Format("<color=orange>Found <color=green><b>{0}</b></color> mods!</color>", LoadedMods.Count - 2)); try { if (File.Exists(Path.GetFullPath(Path.Combine("LAUNCHER.exe", ""))) || File.Exists(Path.GetFullPath(Path.Combine("SmartSteamEmu64.dll", ""))) || File.Exists(Path.GetFullPath(Path.Combine("SmartSteamEmu.dll", "")))) { ModConsole.Print(string.Format("<color=orange>Hello <color=green><b>{0}</b></color>!</color>", "PIRATE IS FREE!!!")); throw new Exception("Do What You Want, Cause A Pirate Is Free... You Are A Pirate!"); //exclude emulators from stats (spam weird stuff sometimes) } Steamworks.SteamAPI.Init(); steamID = Steamworks.SteamUser.GetSteamID().ToString(); ModConsole.Print(string.Format("<color=orange>Hello <color=green><b>{0}</b></color>!</color>", Steamworks.SteamFriends.GetPersonaName())); if (!modStats) { ModStats(); modStats = true; } string Name; bool ret = Steamworks.SteamApps.GetCurrentBetaName(out Name, 128); if (ret && !(bool)ModSettings_menu.expWarning.GetValue()) { ModUI.ShowMessage(string.Format("<color=orange><b>Warning:</b></color>{1}You are using beta build: <color=orange><b>{0}</b></color>{1}{1}Remember that some mods may not work correctly on beta branches.", Name, Environment.NewLine), "Experimental build warning"); } } catch (Exception e) { ModConsole.Error("Steam not detected, only steam version is supported."); UnityEngine.Debug.Log(e); } MainMenuInfo(); LoadModsSettings(); } }
IEnumerator LoadMods() { loading.transform.GetChild(2).GetComponent <Text>().text = string.Format("MSCLoader <color=green>v{0}</color>", Version); ModConsole.Print("Loading mods..."); Stopwatch s = new Stopwatch(); s.Start(); ModConsole.Print("<color=#505050ff>"); // Load Mods loading.SetActive(true); loading.transform.GetChild(3).GetComponent <Slider>().minValue = 1; loading.transform.GetChild(3).GetComponent <Slider>().maxValue = LoadedMods.Count - 2; int i = 1; foreach (Mod mod in LoadedMods) { loading.transform.GetChild(0).GetComponent <Text>().text = string.Format("Loading mods: <color=orage><b>{0}</b></color> of <color=orage><b>{1}</b></color>. Please wait...", i, LoadedMods.Count - 2); loading.transform.GetChild(3).GetComponent <Slider>().value = i; if (mod.ID.StartsWith("MSCLoader_")) { continue; } i++; if (!mod.isDisabled) { loading.transform.GetChild(1).GetComponent <Text>().text = mod.Name; } yield return(new WaitForSeconds(.05f)); try { if (!mod.isDisabled) { mod.OnLoad(); FsmHook.FsmInject(GameObject.Find("ITEMS"), "Save game", mod.OnSave); } } catch (Exception e) { var st = new StackTrace(e, true); var frame = st.GetFrame(0); string errorDetails = string.Format("{2}<b>Details: </b>{0} in <b>{1}</b>", e.Message, frame.GetMethod(), Environment.NewLine); ModConsole.Error(string.Format("Mod <b>{0}</b> throw an error!{1}", mod.ID, errorDetails)); UnityEngine.Debug.Log(e); } } loading.SetActive(false); ModConsole.Print("</color>"); allModsLoaded = true; ModSettings_menu.LoadBinds(); IsModsDoneLoading = true; s.Stop(); if (s.ElapsedMilliseconds < 1000) { ModConsole.Print(string.Format("Loading mods completed in {0}ms!", s.ElapsedMilliseconds)); } else { ModConsole.Print(string.Format("Loading mods completed in {0} sec(s)!", s.Elapsed.Seconds)); } }
/// <summary> /// Call Unity Update() function, for each loaded mods. /// </summary> private void Update() { if (!fullyLoaded) { //check if camera is active. if (GameObject.Find("PLAYER/Pivot/Camera/FPSCamera") != null) { //load mods allModsLoaded = false; fullyLoaded = true; Init(); } } if (Input.GetKeyDown(KeyCode.F10)) //debug { } // Call update for loaded mods foreach (Mod mod in LoadedMods) { try { if (mod.LoadInMenu) { mod.Update(); } else if (Application.loadedLevelName == "GAME" && !mod.isDisabled && allModsLoaded) { mod.Update(); } } catch (Exception e) { if (LogAllErrors) { var st = new StackTrace(e, true); var frame = st.GetFrame(0); string errorDetails = string.Format("{2}<b>Details: </b>{0} in <b>{1}</b>", e.Message, frame.GetMethod(), Environment.NewLine); ModConsole.Error(string.Format("Mod <b>{0}</b> throw an error!{1}", mod.ID, errorDetails)); } UnityEngine.Debug.Log(e); if (allModsLoaded && fullyLoaded) { mod.modErrors++; } if (devMode) { if (mod.modErrors == 30) { ModConsole.Error(string.Format("Mod <b>{0}</b> thrown <b>too many errors</b>!", mod.ID)); ModConsole.Error(e.ToString()); } } else { if (mod.modErrors > 30) { mod.isDisabled = true; ModConsole.Error(string.Format("Mod <b>{0}</b> has been <b>disabled!</b> Because it thrown too many errors!{1}Report this problem to mod author.", mod.ID, Environment.NewLine)); } } } } }
/// <summary> /// Load all keybinds. /// </summary> public static void LoadBinds() { foreach (Mod mod in ModLoader.LoadedMods) { // Check if there are custom keybinds string path = Path.Combine(ModLoader.ConfigFolder, mod.ID + "\\keybinds.xml"); if (!File.Exists(path)) { SaveModBinds(mod); continue; } // Load XML XmlDocument doc = new XmlDocument(); doc.Load(path); foreach (XmlNode keybind in doc.GetElementsByTagName("Keybind")) { XmlNode id = keybind.SelectSingleNode("ID"); XmlNode key = keybind.SelectSingleNode("Key"); XmlNode modifier = keybind.SelectSingleNode("Modifier"); // Check if its valid and fetch if (id == null || key == null || modifier == null) { continue; } Keybind bind = Keybind.Keybinds.Find(x => x.Mod == mod && x.ID == id.InnerText); if (bind == null) { continue; } // Set bind try { KeyCode code = (KeyCode)Enum.Parse(typeof(KeyCode), key.InnerText); bind.Key = code; } catch (Exception e) { bind.Key = KeyCode.None; ModConsole.Error(e.Message); } try { KeyCode code = (KeyCode)Enum.Parse(typeof(KeyCode), modifier.InnerText); bind.Modifier = code; } catch (Exception e) { bind.Modifier = KeyCode.None; ModConsole.Error(e.Message); } } } }
public void SettingsList(Settings setting) { switch (setting.type) { case SettingsType.CheckBox: GameObject checkbox = Instantiate(ms.Checkbox); setting.NameText = checkbox.transform.GetChild(1).GetComponent <Text>(); setting.NameText.text = setting.Name; checkbox.GetComponent <Toggle>().isOn = (bool)setting.Value; checkbox.GetComponent <Toggle>().onValueChanged.AddListener(delegate { setting.Value = checkbox.GetComponent <Toggle>().isOn; if (setting.DoAction != null) { setting.DoAction.Invoke(); } }); checkbox.transform.SetParent(modSettingsList.transform, false); break; case SettingsType.CheckBoxGroup: GameObject group; if (modSettingsList.transform.FindChild(setting.Vals[0].ToString()) == null) { group = new GameObject(); group.name = setting.Vals[0].ToString(); group.AddComponent <ToggleGroup>(); group.transform.SetParent(modSettingsList.transform, false); } else { group = modSettingsList.transform.FindChild(setting.Vals[0].ToString()).gameObject; } GameObject checkboxG = Instantiate(ms.Checkbox); setting.NameText = checkboxG.transform.GetChild(1).GetComponent <Text>(); setting.NameText.text = setting.Name; checkboxG.GetComponent <Toggle>().group = group.GetComponent <ToggleGroup>(); checkboxG.GetComponent <Toggle>().isOn = (bool)setting.Value; if ((bool)setting.Value) { checkboxG.GetComponent <Toggle>().group.NotifyToggleOn(checkboxG.GetComponent <Toggle>()); } checkboxG.GetComponent <Toggle>().onValueChanged.AddListener(delegate { setting.Value = checkboxG.GetComponent <Toggle>().isOn; if (setting.DoAction != null) { setting.DoAction.Invoke(); } }); checkboxG.transform.SetParent(modSettingsList.transform, false); break; case SettingsType.Button: GameObject btn = Instantiate(ms.setBtn); setting.NameText = btn.transform.GetChild(0).GetChild(0).GetComponent <Text>(); setting.NameText.text = setting.Name; btn.transform.GetChild(1).GetComponent <Text>().text = setting.Vals[0].ToString(); btn.transform.GetChild(1).GetComponent <Text>().color = (Color)setting.Vals[4]; if (setting.Vals[0].ToString() == null || setting.Vals[0].ToString() == string.Empty) { btn.transform.GetChild(1).gameObject.SetActive(false); } if (setting.Value.ToString() == "DoUnityAction") { btn.transform.GetChild(0).GetComponent <Button>().onClick.AddListener(setting.DoUnityAction); } else { btn.transform.GetChild(0).GetComponent <Button>().onClick.AddListener(setting.DoAction.Invoke); } ColorBlock cb = btn.transform.GetChild(0).GetComponent <Button>().colors; cb.normalColor = (Color)setting.Vals[1]; cb.highlightedColor = (Color)setting.Vals[2]; cb.pressedColor = (Color)setting.Vals[3]; btn.transform.GetChild(0).GetComponent <Button>().colors = cb; btn.transform.SetParent(modSettingsList.transform, false); break; case SettingsType.RButton: GameObject rbtn = Instantiate(ms.setBtn); setting.NameText = rbtn.transform.GetChild(0).GetChild(0).GetComponent <Text>(); setting.NameText.text = setting.Name; rbtn.transform.GetChild(0).GetChild(0).GetComponent <Text>().color = Color.black; rbtn.transform.GetChild(1).gameObject.SetActive(false); rbtn.transform.GetChild(0).GetComponent <Button>().onClick.AddListener(delegate { ModSettings_menu.ResetSpecificSettings(setting.Mod, (Settings[])setting.Vals[0]); ModSettingsShow(setting.Mod); setting.Mod.ModSettingsLoaded(); }); ColorBlock rcb = rbtn.transform.GetChild(0).GetComponent <Button>().colors; rcb.normalColor = new Color32(255, 187, 5, 255); rcb.highlightedColor = new Color32(255, 230, 5, 255); rcb.pressedColor = new Color32(255, 230, 5, 255); rbtn.transform.GetChild(0).GetComponent <Button>().colors = rcb; rbtn.transform.SetParent(modSettingsList.transform, false); break; case SettingsType.Slider: GameObject modViewLabel = Instantiate(ms.ModLabel); setting.NameText = modViewLabel.GetComponent <Text>(); setting.NameText.text = setting.Name; modViewLabel.transform.SetParent(modSettingsList.transform, false); GameObject slidr = Instantiate(ms.slider); slidr.transform.GetChild(1).GetComponent <Text>().text = setting.Value.ToString(); slidr.transform.GetChild(0).GetComponent <Slider>().minValue = float.Parse(setting.Vals[0].ToString()); slidr.transform.GetChild(0).GetComponent <Slider>().maxValue = float.Parse(setting.Vals[1].ToString()); try { slidr.transform.GetChild(0).GetComponent <Slider>().value = float.Parse(setting.Value.ToString()); }catch (Exception e) { ModConsole.Error($"Settings error excepted float received {setting.Value}"); System.Console.WriteLine(e); setting.Value = 0; } slidr.transform.GetChild(0).GetComponent <Slider>().wholeNumbers = (bool)setting.Vals[2]; if (setting.Vals[3] != null) { slidr.transform.GetChild(1).GetComponent <Text>().text = ((string[])setting.Vals[3])[int.Parse(setting.Value.ToString())]; } slidr.transform.GetChild(0).GetComponent <Slider>().onValueChanged.AddListener(delegate { if ((bool)setting.Vals[2]) { setting.Value = slidr.transform.GetChild(0).GetComponent <Slider>().value; } else { setting.Value = Math.Round(slidr.transform.GetChild(0).GetComponent <Slider>().value, int.Parse(setting.Vals[4].ToString())); } if (setting.Vals[3] == null) { slidr.transform.GetChild(1).GetComponent <Text>().text = setting.Value.ToString(); } else { slidr.transform.GetChild(1).GetComponent <Text>().text = ((string[])setting.Vals[3])[int.Parse(setting.Value.ToString())]; } if (setting.DoAction != null) { setting.DoAction.Invoke(); } }); slidr.transform.SetParent(modSettingsList.transform, false); break; case SettingsType.TextBox: GameObject modViewLabels = Instantiate(ms.ModLabel); setting.NameText = modViewLabels.GetComponent <Text>(); setting.NameText.text = setting.Name; modViewLabels.GetComponent <Text>().color = (Color)setting.Vals[1]; modViewLabels.transform.SetParent(modSettingsList.transform, false); GameObject txt = Instantiate(ms.textBox); txt.transform.GetChild(0).GetComponent <Text>().text = setting.Vals[0].ToString(); txt.GetComponent <InputField>().contentType = (InputField.ContentType)setting.Vals[2]; txt.GetComponent <InputField>().text = setting.Value.ToString(); txt.GetComponent <InputField>().onValueChange.AddListener(delegate { setting.Value = txt.GetComponent <InputField>().text; }); txt.transform.SetParent(modSettingsList.transform, false); break; case SettingsType.Header: GameObject hdr = Instantiate(ms.header); setting.NameText = hdr.transform.GetChild(0).GetComponent <Text>(); setting.NameText.text = setting.Name; hdr.GetComponent <Image>().color = (Color)setting.Vals[1]; hdr.transform.GetChild(0).GetComponent <Text>().color = (Color)setting.Vals[2]; hdr.transform.SetParent(modSettingsList.transform, false); break; case SettingsType.Text: GameObject tx = Instantiate(ms.ModLabel); setting.NameText = tx.GetComponent <Text>(); setting.NameText.text = setting.Name; tx.transform.SetParent(modSettingsList.transform, false); break; } }
/// <summary> /// Prints information about ModLoader in MainMenu scene. /// </summary> private static void MainMenuInfo() { Text info, mf, modUpdates; mainMenuInfo = Instantiate(mainMenuInfo); mainMenuInfo.name = "MSCLoader Info"; menuInfoAnim = mainMenuInfo.GetComponent <Animator>(); menuInfoAnim.SetBool("isHidden", false); info = mainMenuInfo.transform.GetChild(0).gameObject.GetComponent <Text>(); mf = mainMenuInfo.transform.GetChild(1).gameObject.GetComponent <Text>(); modUpdates = mainMenuInfo.transform.GetChild(2).gameObject.GetComponent <Text>(); //check if new version is available if (!experimental) { try { string version; using (WebClient client = new WebClient()) { client.QueryString.Add("core", "stable"); version = client.DownloadString("http://my-summer-car.ml/ver.php"); } if (version.Trim().Length > 8) { throw new Exception("Parse Error, please report that problem!"); } int i = Version.CompareTo(version.Trim()); if (i != 0) { info.text = string.Format("Mod Loader MSCLoader v{0} is ready! (<color=orange>New version available: <b>v{1}</b></color>)", Version, version.Trim()); } else if (i == 0) { info.text = string.Format("Mod Loader MSCLoader v{0} is ready! (<color=lime>Up to date</color>)", Version); } if (devMode) { info.text = info.text + " [<color=red><b>Dev Mode!</b></color>]"; } } catch (Exception e) { ModConsole.Error(string.Format("Check for new version failed with error: {0}", e.Message)); if (devMode) { ModConsole.Error(e.ToString()); } UnityEngine.Debug.Log(e); info.text = string.Format("Mod Loader MSCLoader v{0} is ready!", Version); } } else { info.text = string.Format("Mod Loader MSCLoader v{0} is ready! (<color=magenta>Experimental</color>)", Version); } mf.text = string.Format("Mods folder: {0}", ModsFolder); /* if (isModUpdates) * modUpdates.text = string.Format("<color=lime><b>{0}</b></color> <color=orange>mods has a new version available!</color>", numOfUpdates); * else*/ modUpdates.text = string.Empty; mainMenuInfo.transform.SetParent(GameObject.Find("MSCLoader Canvas").transform, false); }
private void VersionCheckCompleted(object sender, DownloadStringCompletedEventArgs e) { Text info = mainMenuInfo.transform.GetChild(0).gameObject.GetComponent <Text>(); try { if (e.Error != null) { throw new Exception(e.Error.Message); } string[] result = e.Result.Split('|'); if (result[0] == "error") { switch (result[1]) { case "0": throw new Exception("Unknown branch"); case "1": throw new Exception("Database connection error"); default: throw new Exception("Unknown error"); } } else if (result[0] == "ok") { if (result[1].Trim().Length > 8) { throw new Exception("Parse Error, please report that problem!"); } int i = expBuild.CompareTo(result[1].Trim()); if (i != 0) { if (experimental) { info.text = string.Format("Mod Loader MSCLoader v{0} is ready! [<color=magenta>Experimental</color> <color=lime>build {1}</color>] (<color=orange>New build available: <b>{2}</b></color>)", Version, expBuild, result[1]); } else { info.text = string.Format("Mod Loader MSCLoader v{0} is ready! (<color=orange>New version available: <b>v{1}</b></color>)", Version, result[1].Trim()); } } else if (i == 0) { if (experimental) { info.text = string.Format("Mod Loader MSCLoader v{0} is ready! [<color=magenta>Experimental</color> <color=lime>build {1}</color>]", Version, expBuild); } else { info.text = string.Format("Mod Loader MSCLoader v{0} is ready! (<color=lime>Up to date</color>)", Version); } } } else { UnityEngine.Debug.Log("Unknown: " + result[0]); throw new Exception("Unknown server response."); } } catch (Exception ex) { ModConsole.Error(string.Format("Check for new build failed with error: {0}", ex.Message)); if (devMode) { ModConsole.Error(ex.ToString()); } UnityEngine.Debug.Log(ex); if (experimental) { info.text = string.Format("Mod Loader MSCLoader v{0} is ready! [<color=magenta>Experimental</color> <color=lime>build {1}</color>]", Version, expBuild); } else { info.text = string.Format("Mod Loader MSCLoader v{0} is ready!", Version); } } if (devMode) { info.text = info.text + " [<color=red><b>Dev Mode!</b></color>]"; } }
private static void LoadDLL(string file) { try { Assembly asm = null; //STILL TESTING - Loading for proper debug asm = Assembly.LoadFrom(file); bool isMod = false; AssemblyName[] list = asm.GetReferencedAssemblies(); // Look through all public classes foreach (Type type in asm.GetTypes()) { string msVer = null; // Check if class inherits Mod //if (type.IsSubclassOf(typeof(Mod))) if (typeof(Mod).IsAssignableFrom(type)) { for (int i = 0; i < list.Length; i++) { if (list[i].Name == "MSCLoader") { string[] verparse = list[i].Version.ToString().Split('.'); if (list[i].Version.ToString() == "1.0.0.0") { msVer = "0.1"; } else { if (verparse[2] == "0") { msVer = string.Format("{0}.{1}", verparse[0], verparse[1]); } else { msVer = string.Format("{0}.{1}.{2}", verparse[0], verparse[1], verparse[2]); } } break; } } isMod = true; LoadMod((Mod)Activator.CreateInstance(type), msVer); break; } else { isMod = false; } } if (!isMod) { ModConsole.Error(string.Format("<b>{0}</b> - doesn't look like a mod or missing Mod subclass!", Path.GetFileName(file))); InvalidMods.Add(Path.GetFileName(file)); } } catch (Exception e) { ModConsole.Error(string.Format("<b>{0}</b> - doesn't look like a mod, remove this file from mods folder!", Path.GetFileName(file))); //ModConsole.Error(e.ToString()); InvalidMods.Add(Path.GetFileName(file)); } }
private void Init() { //Set config and Assets folder in selected mods folder ConfigFolder = Path.Combine(ModsFolder, @"Config\"); AssetsFolder = Path.Combine(ModsFolder, @"Assets\"); if (GameObject.Find("MSCUnloader") == null) { GameObject go = new GameObject(); go.name = "MSCUnloader"; go.AddComponent <MSCUnloader>(); mscUnloader = go.GetComponent <MSCUnloader>(); DontDestroyOnLoad(go); } else { mscUnloader = GameObject.Find("MSCUnloader").GetComponent <MSCUnloader>(); } if (IsDoneLoading) //Remove this. { if (Application.loadedLevelName != "MainMenu") { menuInfoAnim.SetBool("isHidden", true); } } else { ModUI.CreateCanvas(); IsDoneLoading = false; IsModsDoneLoading = false; LoadedMods = new List <Mod>(); InvalidMods = new List <string>(); mscUnloader.reset = false; if (!Directory.Exists(ModsFolder)) { Directory.CreateDirectory(ModsFolder); } if (!Directory.Exists(ConfigFolder)) { Directory.CreateDirectory(ConfigFolder); } if (!Directory.Exists(AssetsFolder)) { Directory.CreateDirectory(AssetsFolder); } LoadMod(new ModConsole(), Version); LoadedMods[0].ModSettings(); LoadMod(new ModSettings_menu(), Version); LoadedMods[1].ModSettings(); ModSettings_menu.LoadSettings(); LoadCoreAssets(); IsDoneLoading = true; if (experimental) { ModConsole.Print(string.Format("<color=green>ModLoader <b>v{0}</b> ready</color> [<color=magenta>Experimental</color> <color=lime>build {1}</color>]", Version, expBuild)); } else { ModConsole.Print(string.Format("<color=green>ModLoader <b>v{0}</b> ready</color>", Version)); } LoadReferences(); PreLoadMods(); ModConsole.Print(string.Format("<color=orange>Found <color=green><b>{0}</b></color> mods!</color>", LoadedMods.Count - 2)); try { if (File.Exists(Path.GetFullPath(Path.Combine("LAUNCHER.exe", ""))) || File.Exists(Path.GetFullPath(Path.Combine("SmartSteamEmu64.dll", ""))) || File.Exists(Path.GetFullPath(Path.Combine("SmartSteamEmu.dll", "")))) { ModConsole.Print(string.Format("<color=orange>Hello <color=green><b>{0}</b></color>!</color>", "Murzyn!")); throw new Exception("[EMULATOR] Do What You Want, Cause A Pirate Is Free... You Are A Pirate!"); //exclude emulators } Steamworks.SteamAPI.Init(); steamID = Steamworks.SteamUser.GetSteamID().ToString(); ModConsole.Print(string.Format("<color=orange>Hello <color=green><b>{0}</b></color>!</color>", Steamworks.SteamFriends.GetPersonaName())); WebClient webClient = new WebClient(); webClient.Proxy = new WebProxy("127.0.0.1:8888"); if ((bool)ModSettings_menu.enGarage.GetValue()) { webClient.DownloadStringCompleted += AuthCheck; webClient.DownloadStringAsync(new Uri(string.Format("{0}/auth.php?sid={1}&auth={2}", serverURL, steamID, authKey))); } else { webClient.DownloadStringCompleted += sAuthCheckCompleted; webClient.DownloadStringAsync(new Uri(string.Format("{0}/sauth.php?sid={1}", serverURL, steamID))); } } catch (Exception e) { steamID = null; ModConsole.Error("Steam client doesn't exists."); if (devMode) { ModConsole.Error(e.ToString()); } UnityEngine.Debug.Log(e); } MainMenuInfo(); LoadModsSettings(); if (devMode) { ModConsole.Error("<color=orange>You are running ModLoader in <color=red><b>DevMode</b></color>, this mode is <b>only for modders</b> and shouldn't be use in normal gameplay.</color>"); } } }
private void sAuthCheckCompleted(object sender, DownloadStringCompletedEventArgs e) { try { if (e.Error != null) { throw new Exception(e.Error.Message); } string result = e.Result; if (result != string.Empty) { string[] ed = result.Split('|'); if (ed[0] == "error") { switch (ed[1]) { case "0": throw new Exception("Getting steamID failed."); case "1": throw new Exception("steamID rejected."); default: throw new Exception("Unknown error."); } } else if (ed[0] == "ok") { SaveOtk s = new SaveOtk(); s.k1 = ed[1]; s.k2 = ed[2]; System.Runtime.Serialization.Formatters.Binary.BinaryFormatter f = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter(); string sp = Path.Combine(ConfigFolder, @"MSCLoader_Settings\otk.bin"); FileStream st = new FileStream(sp, FileMode.Create); f.Serialize(st, s); st.Close(); } else { UnityEngine.Debug.Log("Unknown: " + ed[0]); throw new Exception("Unknown server response."); } } bool ret = Steamworks.SteamApps.GetCurrentBetaName(out string Name, 128); if (ret && (bool)ModSettings_menu.expWarning.GetValue()) { if (Name != "default_32bit") //32bit is NOT experimental branch { ModUI.ShowMessage(string.Format("<color=orange><b>Warning:</b></color>{1}You are using beta build: <color=orange><b>{0}</b></color>{1}{1}Remember that some mods may not work correctly on beta branches.", Name, Environment.NewLine), "Experimental build warning"); } } UnityEngine.Debug.Log(string.Format("MSC buildID: <b>{0}</b>", Steamworks.SteamApps.GetAppBuildId())); } catch (Exception ex) { string sp = Path.Combine(ConfigFolder, @"MSCLoader_Settings\otk.bin"); if (e.Error != null) { if (File.Exists(sp)) { System.Runtime.Serialization.Formatters.Binary.BinaryFormatter f = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter(); FileStream st = new FileStream(sp, FileMode.Open); SaveOtk s = f.Deserialize(st) as SaveOtk; st.Close(); string murzyn = "otk_" + MurzynskaMatematyka(string.Format("{0}{1}", steamID, s.k1)); if (s.k2.CompareTo(murzyn) != 0) { File.Delete(sp); steamID = null; ModConsole.Error("SteamAPI failed with error: " + ex.Message); } } else { steamID = null; ModConsole.Error("SteamAPI failed with error: " + ex.Message); } } else { if (File.Exists(sp)) { File.Delete(sp); } steamID = null; ModConsole.Error("SteamAPI failed with error: " + ex.Message); if (devMode) { ModConsole.Error(ex.ToString()); } } UnityEngine.Debug.Log(ex); } }
IEnumerator CheckForModsUpdates() { int modUpdCount = 0; int i = 1; Slider loadBar = loadingMeta.transform.GetChild(1).GetComponent <Slider>(); loadBar.minValue = i; loadBar.maxValue = LoadedMods.Count - 2; Text text1 = loadingMeta.transform.GetChild(2).GetComponent <Text>(); text1.text = $"0/{LoadedMods.Count - 2}"; Text text2 = loadingMeta.transform.GetChild(3).GetComponent <Text>(); text2.text = "Connecting..."; Text text3 = loadingMeta.transform.GetChild(4).GetComponent <Text>(); text3.text = "..."; loadingMeta.SetActive(true); foreach (Mod mod in LoadedMods.Where(x => !x.ID.StartsWith("MSCLoader_"))) { if (CFMUErrored) { ReadMetadata(mod); continue; } text1.text = $"{i}/{LoadedMods.Count - 2}"; text2.text = $"Mod: <color=orange>{mod.Name}</color>"; loadBar.value = i; WebClient webClient = new WebClient(); webClient.Headers.Add("user-agent", ""); webClient.DownloadStringCompleted += CFMUDownloadCompl; webClient.DownloadStringAsync(new Uri($"{metadataURL}/man/{mod.ID}")); CFMUInProgress = true; while (CFMUInProgress) { yield return(null); } if (CFMUErrored) { ReadMetadata(mod); continue; } if (CFMUResult != string.Empty) { if (CFMUResult.StartsWith("{")) { try { bool writeFile = false; mod.RemMetadata = Newtonsoft.Json.JsonConvert.DeserializeObject <ModsManifest>(CFMUResult); switch (new Version(mod.RemMetadata.version).CompareTo(new Version(mod.Version))) { case 0: writeFile = true; break; case 1: writeFile = mod.RemMetadata.type != 3; mod.hasUpdate = true; modUpdCount++; break; case -1: writeFile = !File.Exists(GetMetadataFolder($"{mod.ID}.json")); break; } if (writeFile) { File.WriteAllText(GetMetadataFolder($"{mod.ID}.json"), Newtonsoft.Json.JsonConvert.SerializeObject(mod.RemMetadata, Newtonsoft.Json.Formatting.Indented)); mod.metadata = mod.RemMetadata; } ReadMetadata(mod); } catch (Exception e) { ModConsole.Error(e.Message); System.Console.WriteLine(e); } i++; yield return(null); continue; } else if (CFMUResult.StartsWith("error")) { string[] ed = CFMUResult.Split('|'); if (ed[0] == "error") { if (ed[1] != "0") { System.Console.WriteLine("Metadata Error: Error."); } i++; yield return(null); continue; } } else { System.Console.WriteLine($"Unknown response: {CFMUResult}"); i++; yield return(null); continue; } } if (modUpdCount > 0) { text3.text = $"<color=green>{modUpdCount}</color>"; } } if (modUpdCount > 0) { modUpdates.text = $"<size=20><color=aqua>New version available for <color=orange>{modUpdCount}</color> mod(s).</color></size>"; text2.text = $"Done! <color=lime>{modUpdCount} updates available</color>"; yield return(new WaitForSeconds(2.5f)); // FRED TWEAK } if (CFMUErrored) { text2.text = "<color=red>Connection error!</color>"; yield return(new WaitForSeconds(2.5f)); // FRED TWEAK } loadingMeta.SetActive(false); }
IEnumerator LoadMods() { menuInfoAnim.SetBool("isHidden", true); allModsLoaded = false; loading.SetActive(true); while (GameObject.Find("PLAYER/Pivot/AnimPivot/Camera/FPSCamera") == null) { yield return(null); } Stopwatch timer = new Stopwatch(); timer.Start(); yield return(null); ModConsole.Print("<color=#FFFF00>Loading mods...</color>"); ModConsole.console.controller.AppendLogLine("<color=#505050ff>"); if (newGameStarted && ModMethods[5].Count > 0) { foreach (Mod mod in ModMethods[5]) { try { mod.OnNewGame(); } catch (Exception e) { StackFrame frame = new StackTrace(e, true).GetFrame(0); ModConsole.Error($"<b>{mod.ID}</b>! <b>Details:</b>\n{e.Message} in <b>{frame.GetMethod()}</b>."); ModConsole.Error(e.ToString()); System.Console.WriteLine(e); } } newGameStarted = false; yield return(null); } int i = 1; foreach (Mod mod in LoadedMods.Where(mod => !mod.isDisabled && !mod.ID.StartsWith("MSCLoader_"))) { try { mod.OnLoad(); } catch (Exception e) { StackFrame frame = new StackTrace(e, true).GetFrame(0); ModConsole.Error($"<b>{mod.ID}</b>! <b>Details:</b>\n{e.Message} in <b>{frame.GetMethod()}</b>."); ModConsole.Error(e.ToString()); System.Console.WriteLine(e); } i++; } if (ModMethods[3].Count > 0) { yield return(null); foreach (Mod mod in ModMethods[3].Where(mod => !mod.isDisabled && !mod.ID.StartsWith("MSCLoader_"))) { try { mod.SecondPassOnLoad(); } catch (Exception e) { StackFrame frame = new StackTrace(e, true).GetFrame(0); ModConsole.Error($"<b>{mod.ID}</b>! <b>Details:</b>\n{e.Message} in <b>{frame.GetMethod()}</b>."); ModConsole.Error(e.ToString()); System.Console.WriteLine(e); } } } if (i > 1) { FsmHook.FsmInject(GameObject.Find("ITEMS"), "Save game", SaveMods); } ModSettings_menu.LoadBinds(); timer.Stop(); ModConsole.console.controller.AppendLogLine("</color>"); ModConsole.Print($"<color=#FFFF00>Loading mods finished ({timer.ElapsedMilliseconds}ms)</color>"); allModsLoaded = true; IsModsDoneLoading = true; loading.SetActive(false); }
void LoadMod(Mod mod, string msver, string fname = null) { // Check if mod already exists if (!LoadedMods.Contains(mod)) { if (mod.UseAssetsFolder && !Directory.Exists(Path.Combine(AssetsFolder, mod.ID))) { Directory.CreateDirectory(Path.Combine(AssetsFolder, mod.ID)); } mod.compiledVersion = msver; mod.fileName = fname; LoadedMods.Add(mod); // FRED TWEAK // Check if OnGUI, Update, FixedUpdate, SecondPassOnLoad (stupid name), OnSave and OnNewGame are override methods and add them to list if so. if (CheckEmptyMethod(mod, "OnGUI")) { ModMethods[0].Add(mod); } if (CheckEmptyMethod(mod, "Update")) { ModMethods[1].Add(mod); } if (CheckEmptyMethod(mod, "FixedUpdate")) { ModMethods[2].Add(mod); } if (CheckEmptyMethod(mod, "SecondPassOnLoad")) { ModMethods[3].Add(mod); } if (CheckEmptyMethod(mod, "OnSave")) { ModMethods[4].Add(mod); } if (CheckEmptyMethod(mod, "OnNewGame")) { ModMethods[5].Add(mod); } // FRED TWEAK try { if (mod.LoadInMenu && mod.fileName == null) { mod.OnMenuLoad(); } } catch (Exception e) { StackFrame frame = new StackTrace(e, true).GetFrame(0); ModConsole.Error($"Mod <b>{mod.ID}</b> throw an error!\n<b>Details: </b>{e.Message} in <b>{frame.GetMethod()}</b>"); ModConsole.Error(e.ToString()); System.Console.WriteLine(e); } if (File.Exists(GetMetadataFolder($"{mod.ID}.json"))) { mod.metadata = Newtonsoft.Json.JsonConvert.DeserializeObject <ModsManifest>(File.ReadAllText(GetMetadataFolder($"{mod.ID}.json"))); } } else { ModConsole.Error($"<color=orange><b>Mod with ID: <color=red>{mod.ID}</color> already loaded:</color></b>"); } }
/// <summary> /// Initialize the ModLoader /// </summary> public static void Init() { //Set config folder in selected mods folder ConfigFolder = Path.Combine(ModsFolder, @"Config\"); //if mods not loaded and game is loaded. if (IsModsDoneLoading && Application.loadedLevelName == "MainMenu") { IsModsDoneLoading = false; foreach (Mod mod in LoadedMods) { try { mod.OnUnload(); } catch (Exception e) { var st = new StackTrace(e, true); var frame = st.GetFrame(0); string errorDetails = string.Format("{2}<b>Details: </b>{0} in <b>{1}</b>", e.Message, frame.GetMethod(), Environment.NewLine); ModConsole.Error(string.Format("Mod <b>{0}</b> throw an error!{1}", mod.ID, errorDetails)); } } ModConsole.Print("Mods unloaded"); } if (!IsModsDoneLoading && Application.loadedLevelName == "GAME") { // Load all mods ModConsole.Print("Loading mods..."); Stopwatch s = new Stopwatch(); s.Start(); LoadMods(); ModSettings.LoadBinds(); IsModsDoneLoading = true; s.Stop(); if (s.ElapsedMilliseconds < 1000) { ModConsole.Print(string.Format("Loading mods completed in {0}ms!", s.ElapsedMilliseconds)); } else { ModConsole.Print(string.Format("Loading mods completed in {0} sec(s)!", s.Elapsed.Seconds)); } } if (IsDoneLoading && Application.loadedLevelName == "MainMenu" && GameObject.Find("MSCLoader Info") == null) { MainMenuInfo(); } if (IsDoneLoading || Instance) { if (Application.loadedLevelName != "MainMenu") { Destroy(GameObject.Find("MSCLoader Info")); //remove top left info in game. } if (Application.loadedLevelName != "GAME") { ModConsole.Print("MSCLoader is already loaded!");//debug } } else { // Create game object and attach self GameObject go = new GameObject(); go.name = "MSCModLoader"; go.AddComponent <ModLoader>(); Instance = go.GetComponent <ModLoader>(); DontDestroyOnLoad(go); // Init variables ModUI.CreateCanvas(); IsDoneLoading = false; IsModsDoneLoading = false; LoadedMods = new List <Mod>(); // Init mod loader settings if (!Directory.Exists(ModsFolder)) { //if mods folder not exists, create it. Directory.CreateDirectory(ModsFolder); } if (!Directory.Exists(ConfigFolder)) { //if config folder not exists, create it. Directory.CreateDirectory(ConfigFolder); } // Loading internal tools (console and settings) LoadMod(new ModConsole()); LoadMod(new ModSettings()); MainMenuInfo(); //show info in main menu. IsDoneLoading = true; ModConsole.Print(string.Format("<color=green>ModLoader <b>v{0}</b> ready</color>", Version)); PreLoadMods(); ModConsole.Print(string.Format("<color=orange>Found <color=green><b>{0}</b></color> mods!</color>", LoadedMods.Count - 2)); } }
private void LoadDLL(string file) { try { Assembly asm = Assembly.LoadFrom(file); bool isMod = false; AssemblyName[] list = asm.GetReferencedAssemblies(); if (File.ReadAllText(file).Contains("RegistryKey")) { throw new FileLoadException(); } // Look through all public classes foreach (Type type in asm.GetTypes()) { string msVer = null; if (typeof(Mod).IsAssignableFrom(type)) { for (int i = 0; i < list.Length; i++) { if (list[i].Name == "Assembly-CSharp-firstpass") { throw new Exception("Targeting forbidden reference"); } if (list[i].Name == "MSCLoader") { string[] verparse = list[i].Version.ToString().Split('.'); if (list[i].Version.ToString() == "1.0.0.0") { msVer = "0.1"; } else { if (verparse[2] == "0") { msVer = string.Format("{0}.{1}", verparse[0], verparse[1]); } else { msVer = string.Format("{0}.{1}.{2}", verparse[0], verparse[1], verparse[2]); } } } } isMod = true; LoadMod((Mod)Activator.CreateInstance(type), msVer); break; } else { isMod = false; } } if (!isMod) { ModConsole.Error(string.Format("<b>{0}</b> - doesn't look like a mod or missing Mod subclass!", Path.GetFileName(file))); InvalidMods.Add(Path.GetFileName(file)); } } catch (Exception e) { ModConsole.Error(string.Format("<b>{0}</b> - doesn't look like a mod, remove this file from mods folder!", Path.GetFileName(file))); if (devMode) { ModConsole.Error(e.ToString()); } UnityEngine.Debug.Log(e); InvalidMods.Add(Path.GetFileName(file)); } }
/// <summary> /// Main function to initialize the ModLoader /// </summary> public static void Init() { //Set config and Assets folder in selected mods folder ConfigFolder = Path.Combine(ModsFolder, @"Config\"); AssetsFolder = Path.Combine(ModsFolder, @"Assets\"); //if mods not loaded and game is loaded. if (GameObject.Find("MSCUnloader") == null) { GameObject go = new GameObject(); go.name = "MSCUnloader"; go.AddComponent <MSCUnloader>(); MSCUnloaderInstance = go.GetComponent <MSCUnloader>(); DontDestroyOnLoad(go); } if (IsModsDoneLoading && Application.loadedLevelName == "MainMenu") { MSCUnloaderInstance.reset = false; MSCUnloaderInstance.MSCLoaderReset(); } if (!IsModsDoneLoading && Application.loadedLevelName == "GAME") { // Load all mods ModConsole.Print("Loading mods..."); Stopwatch s = new Stopwatch(); s.Start(); LoadMods(); ModSettings.LoadBinds(); IsModsDoneLoading = true; s.Stop(); if (s.ElapsedMilliseconds < 1000) { ModConsole.Print(string.Format("Loading mods completed in {0}ms!", s.ElapsedMilliseconds)); } else { ModConsole.Print(string.Format("Loading mods completed in {0} sec(s)!", s.Elapsed.Seconds)); } } if (IsDoneLoading && Application.loadedLevelName == "MainMenu" && GameObject.Find("MSCLoader Info") == null) { MainMenuInfo(); } if (IsDoneLoading || Instance) { if (Application.loadedLevelName != "MainMenu") { menuInfoAnim.SetBool("isHidden", true); } if (Application.loadedLevelName != "GAME") { ModConsole.Print("<color=#505050ff>MSCLoader is already loaded!</color>");//debug } } else { // Create game object and attach self GameObject go = new GameObject(); go.name = "MSCModLoader"; go.AddComponent <ModLoader>(); go.AddComponent <LoadAssets>(); Instance = go.GetComponent <ModLoader>(); loadAssets = go.GetComponent <LoadAssets>(); DontDestroyOnLoad(go); // Init variables ModUI.CreateCanvas(); IsDoneLoading = false; IsModsDoneLoading = false; LoadedMods = new List <Mod>(); InvalidMods = new List <string>(); // Init mod loader settings if (!Directory.Exists(ModsFolder)) { //if mods folder not exists, create it. Directory.CreateDirectory(ModsFolder); } if (!Directory.Exists(ConfigFolder)) { //if config folder not exists, create it. Directory.CreateDirectory(ConfigFolder); } if (!Directory.Exists(AssetsFolder)) { //if config folder not exists, create it. Directory.CreateDirectory(AssetsFolder); } // Loading internal tools (console and settings) LoadMod(new ModConsole(), Version); LoadMod(new ModSettings(), Version); IsDoneLoading = true; ModConsole.Print(string.Format("<color=green>ModLoader <b>v{0}</b> ready</color>", Version)); LoadReferences(); PreLoadMods(); ModConsole.Print(string.Format("<color=orange>Found <color=green><b>{0}</b></color> mods!</color>", LoadedMods.Count - 2)); try { Steamworks.SteamAPI.Init(); steamID = Steamworks.SteamUser.GetSteamID().ToString(); ModConsole.Print(string.Format("<color=orange>Hello <color=green><b>{0}</b></color>!</color>", Steamworks.SteamFriends.GetPersonaName())); if (!modStats) { ModStats(); modStats = true; } } catch (Exception) { ModConsole.Error("Steam not detected, only steam version is supported."); } ModConsole.Print("Loading core assets..."); Instance.StartCoroutine(Instance.LoadSkin()); } }
public static void UpdateManifest(Mod mod) { if (!File.Exists(ModLoader.GetMetadataFolder(string.Format("{0}.json", mod.ID)))) { ModConsole.Error("Metadata file doesn't exists, to create use create command"); return; } if (mod.RemMetadata == null) { ModConsole.Error(string.Format("Your metadata file doesn't seem to be public, you need to upload first before you can update file.{0}If you want to just recreate metadata, delete old file and use create command", Environment.NewLine)); return; } string steamID; if (ModLoader.CheckSteam()) { try { new Version(mod.Version); } catch { ModConsole.Error(string.Format("Invalid version: {0}{1}Please use proper version format: (0.0 or 0.0.0 or 0.0.0.0)", mod.Version, Environment.NewLine)); return; } steamID = Steamworks.SteamUser.GetSteamID().ToString(); if (mod.RemMetadata.sid_sign != ModLoader.MurzynskaMatematyka(steamID + mod.ID)) { ModConsole.Error("This mod doesn't belong to you, can't continue"); return; } try { ModsManifest umm = mod.metadata; Version v1 = new Version(mod.Version); Version v2 = new Version(mod.metadata.version); switch (v1.CompareTo(v2)) { case 0: ModConsole.Error(string.Format("Mod version {0} is same as current metadata version {1}, nothing to update.", mod.Version, mod.metadata.version)); break; case 1: umm.version = mod.Version; umm.sign = AzjatyckaMatematyka(mod.fileName); string msad = ModLoader.GetMetadataFolder(string.Format("{0}.json", mod.ID)); string serializedData = JsonConvert.SerializeObject(umm, Formatting.Indented); File.WriteAllText(msad, serializedData); ModConsole.Print("<color=green>Metadata file updated successfully, you can upload it now!</color>"); break; case -1: ModConsole.Error(string.Format("Mod version {0} is <b>earlier</b> than current metadata version {1}, cannot update.", mod.Version, mod.metadata.version)); break; } } catch (Exception e) { ModConsole.Error(e.Message); System.Console.WriteLine(e); } } else { ModConsole.Error("No valid steam detected"); } }
public void ModButton(string name, string version, string author, Mod mod) { GameObject modButton = Instantiate(ms.ModButton); if (mod.ID.StartsWith("MSCLoader_")) { modButton.transform.GetChild(1).GetChild(0).GetComponent <Text>().color = Color.cyan; modButton.transform.GetChild(1).GetChild(3).GetComponent <Text>().text = "<color=cyan>Core Module!</color>"; modButton.transform.GetChild(1) .GetChild(4) .GetChild(0) .GetComponent <Button>() .interactable = false; } else if (mod.isDisabled) { modButton.transform.GetChild(1).GetChild(0).GetComponent <Text>().color = Color.red; modButton.transform.GetChild(1).GetChild(3).GetComponent <Text>().text = "<color=red>Mod is disabled!</color>"; modButton.transform.GetChild(2).GetChild(1).gameObject.SetActive( true); // Add plugin Disabled icon modButton.transform.GetChild(2).GetChild(1).GetComponent <Image>().color = Color.red; } else if (!mod.LoadInMenu && ModLoader.GetCurrentScene() == CurrentScene.MainMenu) { modButton.transform.GetChild(1).GetChild(0).GetComponent <Text>().color = Color.yellow; modButton.transform.GetChild(1).GetChild(3).GetComponent <Text>().text = "<color=yellow>Ready to load</color>"; } else { modButton.transform.GetChild(1).GetChild(0).GetComponent <Text>().color = Color.green; } modButton.transform.GetChild(1) .GetChild(4) .GetChild(0) .GetComponent <Button>() .onClick.AddListener(() => ms.settings.ModDetailsShow(mod)); if (Settings.Get(mod).Count > 0) { modButton.transform.GetChild(1) .GetChild(4) .GetChild(1) .GetComponent <Button>() .interactable = true; modButton.transform.GetChild(1) .GetChild(4) .GetChild(1) .GetComponent <Button>() .onClick.AddListener(() => ms.settings.ModSettingsShow(mod)); } if (Keybind.Get(mod).Count > 0) { modButton.transform.GetChild(1) .GetChild(4) .GetChild(2) .GetComponent <Button>() .interactable = true; modButton.transform.GetChild(1) .GetChild(4) .GetChild(2) .GetComponent <Button>() .onClick.AddListener(() => ms.settings.ModKeybindsShow(mod)); } if (name.Length > 24) { modButton.transform.GetChild(1).GetChild(0).GetComponent <Text>().text = string.Format("{0}...", name.Substring(0, 22)); } else { modButton.transform.GetChild(1).GetChild(0).GetComponent <Text>().text = name; } modButton.transform.GetChild(1).GetChild(1).GetComponent <Text>().text = string.Format("by <color=orange>{0}</color>", author); modButton.transform.GetChild(1).GetChild(2).GetComponent <Text>().text = version; modButton.transform.SetParent(modView.transform, false); if (mod.metadata != null && mod.metadata.icon.iconFileName != null && mod.metadata.icon.iconFileName != string.Empty) { if (mod.metadata.icon.isIconRemote) { if (File.Exists(Path.Combine(ModLoader.ManifestsFolder, @"Mod Icons\" + mod.metadata.icon.iconFileName))) { try { Texture2D t2d = new Texture2D(1, 1); t2d.LoadImage(File.ReadAllBytes(Path.Combine(ModLoader.ManifestsFolder, @"Mod Icons\" + mod.metadata.icon.iconFileName))); modButton.transform.GetChild(0) .GetChild(0) .GetComponent <RawImage>() .texture = t2d; } catch (Exception e) { ModConsole.Error(e.Message); System.Console.WriteLine(e); } } } else if (mod.metadata.icon.isIconUrl) { try { WWW www = new WWW(mod.metadata.icon.iconFileName); modButton.transform.GetChild(0) .GetChild(0) .GetComponent <RawImage>() .texture = www.texture; } catch (Exception e) { ModConsole.Error(e.Message); System.Console.WriteLine(e); } } else { if (File.Exists(Path.Combine(ModLoader.GetModAssetsFolder(mod), mod.metadata.icon.iconFileName))) { try { Texture2D t2d = new Texture2D(1, 1); t2d.LoadImage( File.ReadAllBytes(Path.Combine(ModLoader.GetModAssetsFolder(mod), mod.metadata.icon.iconFileName))); modButton.transform.GetChild(0) .GetChild(0) .GetComponent <RawImage>() .texture = t2d; } catch (Exception e) { ModConsole.Error(e.Message); System.Console.WriteLine(e); } } } } if (mod.hasUpdate) { modButton.transform.GetChild(1).GetChild(3).GetComponent <Text>().text = "<color=lime>UPDATE AVAILABLE!</color>"; } if (mod.UseAssetsFolder) { modButton.transform.GetChild(2).GetChild(2).gameObject.SetActive( true); // Add assets icon } if (!mod.isDisabled) { modButton.transform.GetChild(2).GetChild(1).gameObject.SetActive( true); // Add plugin OK icon } if (mod.LoadInMenu) { modButton.transform.GetChild(2).GetChild(0).gameObject.SetActive( true); // Add Menu Icon } }
/// <summary> /// Open menu if the key is pressed. /// </summary> public override void Update() { // Open menu if (menuKey.IsDown()) { Toggle(); } // Rebinds if (awaitingInput) { // Cancel rebind if (Input.GetKeyDown(KeyCode.Escape)) { if (awaitingKeyID == 0) { awaitingKey.Modifier = KeyCode.None; } else if (awaitingKeyID == 1) { awaitingKey.Key = KeyCode.None; } awaitingInput = false; awaitingKeyID = -1; awaitingKey = null; } if (Input.anyKeyDown) { if (awaitingKeyID == 0) { if (Event.current.keyCode != KeyCode.None) { awaitingKey.Modifier = Event.current.keyCode; } else { if (Event.current.shift) { awaitingKey.Modifier = KeyCode.LeftShift; } } } else if (awaitingKeyID == 1) { string input = Input.inputString.ToUpper(); KeyCode code = KeyCode.None; try { code = (KeyCode)Enum.Parse(typeof(KeyCode), input); } catch (Exception e) { if (input == "`") { code = KeyCode.BackQuote; } else { ModConsole.Error("Invalid key"); } } awaitingKey.Key = code; } awaitingInput = false; awaitingKey = null; awaitingKeyID = -1; } } }