public static bool GetParentMenuFileNamEext(out string result, SceneEdit.SMenuItem mi) { if ((mi.m_mpn == (MPN)MPN_string_int["accnail"]) || mi.m_mpn > (MPN)MPN_string_int["skintoon"] || mi.m_mpn == (MPN)MPN_string_int["acctoenail"]) { string text = mi.m_strMenuFileName; result = string.Empty; text = text.ToLower(); int num = text.IndexOf("_z"); if (0 < num) { int num2 = text.IndexOf('_', num + 1); if (num2 == -1) { num2 = text.IndexOf('.', num + 1); } if (0 < num2 - num && 0 < text.Length - num2) { result = text.Substring(0, num) + text.Substring(num2, text.Length - num2); } } } else { result = null; } return(result != null); }
public static void ManMenuAdd(PhotoManEditManager self) { if (ManMenuAdd_run) { return; } ManMenuAdd_run = true; FieldInfo menu_file_name_list_ = typeof(PhotoManEditManager).GetField("menu_file_name_list_", BindingFlags.Static | BindingFlags.NonPublic); HashSet <string> menu_filename_list_val = (HashSet <string>)menu_file_name_list_.GetValue(null); FieldInfo man_body_menu_list_self = self.GetType().GetField("man_body_menu_list_", BindingFlags.NonPublic | BindingFlags.Instance); FieldInfo man_head_menu_list_self = self.GetType().GetField("man_head_menu_list_", BindingFlags.NonPublic | BindingFlags.Instance); HashSet <string> menu_list = new HashSet <string>(); List <SceneEdit.SMenuItem> head_list = new List <SceneEdit.SMenuItem>(); List <SceneEdit.SMenuItem> body_list = new List <SceneEdit.SMenuItem>(); MPN body = (MPN)Enum.Parse(typeof(MPN), "body"); foreach (string filename in GameUty.ModOnlysMenuFiles) { if (filename.Contains("mhead") || filename.Contains("mbody")) { menu_list.Add(filename); } } Debug.Log($"menu list pre union{ menu_list}"); if (menu_filename_list_val != null) { menu_list.UnionWith(menu_filename_list_val); } Debug.Log($"menu list post union{ menu_list}"); foreach (string filename in menu_list) { SceneEdit.SMenuItem smenuItem = new SceneEdit.SMenuItem(); if (SceneEdit.GetMenuItemSetUP(smenuItem, filename, true)) { if (smenuItem.m_mpn == body) { body_list.Add(smenuItem); } else { head_list.Add(smenuItem); } } } menu_file_name_list_.SetValue(null, menu_list); man_body_menu_list_self.SetValue(self, body_list); man_head_menu_list_self.SetValue(self, head_list); }
public static void GetTextureByRid(ref int __2) { if (idItemDic.ContainsKey(__2)) { SceneEdit.SMenuItem tempItem = idItemDic[__2]; if (tempItem.m_texIcon == null || tempItem.m_texIcon == Texture2D.whiteTexture) { tempItem.m_texIcon = GetTexture(tempItem.m_nMenuFileRID); tempItem.m_texIconRandomColor = tempItem.m_texIcon; } } }
//[HarmonyPatch(typeof(SceneEdit), "InitMenuItemScript")] //[HarmonyPrefix] public static void InitMenuItemScriptPre(SceneEdit.SMenuItem mi) { if (!editSceneFlg) { return; } nowMenuFlg = true; nowStrMenuFileID = mi.m_nMenuFileRID; idItemDic[nowStrMenuFileID] = mi; }
public static void ContinueSetup(SceneEdit.SMenuItem mi2) { Stopwatch test2 = new Stopwatch(); if (!mi2.m_bMan && !(mi2.m_texIconRef == null)) { test2.Start(); Main.logger.LogError("Invoking addmenuitemtolist"); AccessTools.Method(typeof(SceneEdit), "AddMenuItemToList").Invoke(@this, new object[] { mi2 }); //@this.AddMenuItemToList(mi2); test2.Stop(); Main.logger.LogError($"Done invoking AddMenuItemToList at: {test2.Elapsed}"); if ([email protected]_menuRidDic.ContainsKey(mi2.m_nMenuFileRID)) { @this.m_menuRidDic.Add(mi2.m_nMenuFileRID, mi2); } test2.Start(); Main.logger.LogError("Invoking GetParentMenuFileName"); string parentMenuName2 = AccessTools.Method(typeof(SceneEdit), "GetParentMenuFileName").Invoke(@this, new object[] { mi2 }) as string; //string parentMenuName2 = SceneEdit.GetParentMenuFileName(mi2); test2.Stop(); Main.logger.LogError($"Done Invoking GetParentMenuFileName at: {test2.Elapsed}"); test2.Start(); if (!string.IsNullOrEmpty(parentMenuName2)) { int hashCode2 = parentMenuName2.GetHashCode(); if (!SavedmenuGroupMemberDic.ContainsKey(hashCode2)) { SavedmenuGroupMemberDic.Add(hashCode2, new List <int>()); } SavedmenuGroupMemberDic[hashCode2].Add(mi2.m_strMenuFileName.ToLower().GetHashCode()); } else if (mi2.m_strCateName.IndexOf("set_") != -1 && mi2.m_strMenuFileName.IndexOf("_del") == -1) { mi2.m_bGroupLeader = true; mi2.m_listMember = new List <SceneEdit.SMenuItem>(); mi2.m_listMember.Add(mi2); } /* * if (true || 0.5f < Time.realtimeSinceStartup - time) * { * //yield return null; * Main.logger.LogError($"Sleeping thread, 100ms..."); * //Thread.Sleep(20); * time = Time.realtimeSinceStartup; * }*/ test2.Stop(); Main.logger.LogError($"Finished processing one menu file in {test2.Elapsed}"); } }
public static IEnumerator ModMenuLoadStart(List <SceneEdit.SMenuItem> menuList, Dictionary <int, List <int> > menuGroupMemberDic) { Dictionary <SceneEdit.SMenuItem, byte[]> modIconLoads = new Dictionary <SceneEdit.SMenuItem, byte[]>(); modFiles.Clear(); Task loaderWorker = Task.Factory.StartNew(new Action(() => { Mutex dicLock = new Mutex(); Task servantWorker = Task.Factory.StartNew(new Action(() => { foreach (string mod in Menu.GetModFiles()) { try { dicLock.WaitOne(); modFiles[mod] = new MemoryStream(File.ReadAllBytes(mod)); dicLock.ReleaseMutex(); } catch { Debug.LogError("Couldn't read .mod file at: " + mod); } } })); while (!servantWorker.IsCompleted || modFiles.Count > 0) { if (modFiles.Count == 0) { Thread.Sleep(1); continue; } string strFileName = modFiles.First().Key; SceneEdit.SMenuItem mi2 = new SceneEdit.SMenuItem(); if (ModMenuLoad.InitModMenuItemScript(mi2, strFileName, out byte[] icon)) { modIconLoads[mi2] = icon; } dicLock.WaitOne(); modFiles.Remove(strFileName); dicLock.ReleaseMutex(); }
public static void UpdateIcon(ref SceneEditWindow.CustomViewItem __instance, ref Maid __0) { if (__0 == null) { __0 = GameMain.Instance.CharacterMgr.GetMaid(0); if (__0 == null) { return; } } if (__instance.mpn == MPN.chikubi) { __instance.mpn = MPN.chikubicolor; } SceneEdit.SMenuItem menuItem = __instance.GetMenuItem(__0, __instance.mpn); if (menuItem == null || menuItem.m_boDelOnly && __instance.defaultIconTexture != null || menuItem.m_texIcon == null && __instance.defaultIconTexture != null) { //Do Nothing } else if (menuItem.m_texIcon != null) { int rid = menuItem.m_nMenuFileRID; if (idItemDic.ContainsKey(rid)) { SceneEdit.SMenuItem tempItem = idItemDic[rid]; if (tempItem.m_texIcon == null || tempItem.m_texIcon == Texture2D.whiteTexture) { tempItem.m_texIcon = GetTexture(tempItem.m_nMenuFileRID); tempItem.m_texIconRandomColor = tempItem.m_texIcon; } } } if (__instance.mpn == MPN.chikubicolor) { __instance.mpn = MPN.chikubi; } return; }
public static void MenuItemSet(ref SceneEdit.SMenuItem __1) { if (!texFileIDDic.ContainsKey(__1.m_nMenuFileRID)) { return; } if (__1.m_texIcon == null || __1.m_texIcon == Texture2D.whiteTexture) { try { __1.m_texIcon = GetTexture(__1.m_nMenuFileRID); __1.m_texIconRandomColor = __1.m_texIcon; } catch { __1.m_texIcon = Texture2D.whiteTexture; __1.m_texIconRandomColor = __1.m_texIcon; } } }
public static void ReadMenuItemDataFromNative(SceneEdit.SMenuItem mi, int menuDataBaseIndex, out string iconStr) { MenuDataBase menuDataBase = GameMain.Instance.MenuDataBase; menuDataBase.SetIndex(menuDataBaseIndex); mi.m_strMenuName = menuDataBase.GetMenuName(); mi.m_strInfo = menuDataBase.GetItemInfoText(); mi.m_mpn = (MPN)menuDataBase.GetCategoryMpn(); mi.m_strCateName = menuDataBase.GetCategoryMpnText(); mi.m_eColorSetMPN = (MPN)menuDataBase.GetColorSetMpn(); mi.m_strMenuNameInColorSet = menuDataBase.GetMenuNameInColorSet(); mi.m_pcMultiColorID = (MaidParts.PARTS_COLOR)menuDataBase.GetMultiColorId(); mi.m_boDelOnly = menuDataBase.GetBoDelOnly(); mi.m_fPriority = menuDataBase.GetPriority(); mi.m_bMan = menuDataBase.GetIsMan(); mi.m_bOld = (menuDataBase.GetVersion() < 2000); iconStr = menuDataBase.GetIconS(); if (Main.UseVanillaCache.Value) { MenuStub newStub = new MenuStub() { Name = mi.m_strMenuName, Description = mi.m_strInfo, Category = mi.m_mpn.ToString(), ColorSetMPN = mi.m_eColorSetMPN.ToString(), ColorSetMenu = mi.m_strMenuNameInColorSet, MultiColorID = mi.m_pcMultiColorID.ToString(), DelMenu = mi.m_boDelOnly, Priority = mi.m_fPriority, ManMenu = mi.m_bMan, LegacyMenu = mi.m_bOld, Icon = iconStr, DateModified = File.GetLastWriteTimeUtc(BepInEx.Paths.GameRootPath + "\\GameData\\paths.dat") }; MenuCache[mi.m_strMenuFileName] = newStub; } }
public static bool GetMenuItemSetUP(SceneEdit.SMenuItem mi, string f_strMenuFileName, out string IconTex) { IconTex = null; if (f_strMenuFileName.Contains("_zurashi")) { return(false); } if (f_strMenuFileName.Contains("_mekure")) { return(false); } f_strMenuFileName = Path.GetFileName(f_strMenuFileName); mi.m_strMenuFileName = f_strMenuFileName; mi.m_nMenuFileRID = f_strMenuFileName.ToLower().GetHashCode(); try { if (!GSModMenuLoad.InitMenuItemScript(mi, f_strMenuFileName, out IconTex)) { Main.logger.LogError("(メニュースクリプトが読めませんでした。) The following menu file could not be read and will be skipped: " + f_strMenuFileName); } } catch (Exception ex) { Main.logger.LogError(string.Concat(new string[] { "GetMenuItemSetUP tossed an exception while reading: ", f_strMenuFileName, "\n\n", ex.Message, "\n", ex.StackTrace })); return(false); } return(true); }
public static bool GetMenuItemSetUP(SceneEdit.SMenuItem mi, string f_strMenuFileName, out string IconTex, bool f_bMan = false) { IconTex = null; if (f_strMenuFileName.Contains("_zurashi")) { return(false); } if (f_strMenuFileName.Contains("_mekure")) { return(false); } f_strMenuFileName = Path.GetFileName(f_strMenuFileName); mi.m_strMenuFileName = f_strMenuFileName; mi.m_nMenuFileRID = f_strMenuFileName.ToLower().GetHashCode(); try { if (!Main.InitMenuItemScript(mi, f_strMenuFileName, f_bMan, out IconTex)) { NDebug.Assert(false, "メニュースクリプトが読めませんでした。" + f_strMenuFileName); } } catch (Exception ex) { Main.logger.LogError(string.Concat(new string[] { "GetMenuItemSetUP 例外/", f_strMenuFileName, "/", ex.Message, " StackTrace/", ex.StackTrace })); return(false); } return(true); }
public static IEnumerator GSMenuLoadStart(List <SceneEdit.SMenuItem> menuList, Dictionary <int, List <int> > menuGroupMemberDic) { HashSet <SceneEdit.SMenuItem> listOfLoads = new HashSet <SceneEdit.SMenuItem>(); List <string> listOfDuplicates = new List <string>(); string path = BepInEx.Paths.GameRootPath; FilesToRead.Clear(); FilesDictionary.Clear(); DictionaryBuilt = false; Main.logger.LogDebug("Started worker..."); Task loaderWorker = Task.Factory.StartNew(new Action(() => { foreach (string s in Directory.GetFiles(path + "\\Mod", "*.menu", SearchOption.AllDirectories)) { if (!FilesDictionary.ContainsKey(Path.GetFileName(s).ToLower())) { FilesDictionary[Path.GetFileName(s).ToLower()] = s; } else { listOfDuplicates.Add(s); } } Main.logger.LogDebug("Worker done fetching files..."); DictionaryBuilt = true; while (CacheLoadDone != true) { Thread.Sleep(1); } Mutex dicLock = new Mutex(); Main.logger.LogDebug("Worker started loading menus into memory..."); Task servant = Task.Factory.StartNew(new Action(() => { foreach (string s in FilesDictionary.Keys) { try { if (MenuCache.ContainsKey(s.ToLower())) { dicLock.WaitOne(); FilesToRead[s.ToLower()] = null; dicLock.ReleaseMutex(); } else { dicLock.WaitOne(); FilesToRead[s.ToLower()] = new MemoryStream(File.ReadAllBytes(FilesDictionary[s])); dicLock.ReleaseMutex(); } } catch { dicLock.WaitOne(); FilesToRead[s.ToLower()] = null; dicLock.ReleaseMutex(); } } })); Main.logger.LogDebug("Menu load worker started operating..."); while (servant.IsCompleted == false || FilesToRead.Count > 0) { if (FilesToRead.Count == 0) { Thread.Sleep(1); continue; } dicLock.WaitOne(); string strFileName = FilesToRead.FirstOrDefault().Key; dicLock.ReleaseMutex(); SceneEdit.SMenuItem mi2 = new SceneEdit.SMenuItem(); //SceneEdit.GetMenuItemSetUP causes crash if parallel threaded. Our implementation is thread safe-ish. if (GSModMenuLoad.GetMenuItemSetUP(mi2, strFileName, out string iconLoad)) { if (iconLoad != null) { listOfLoads.Add(mi2); QuickEdit.idItemDic[mi2.m_nMenuFileRID] = mi2; QuickEdit.texFileIDDic[mi2.m_nMenuFileRID] = iconLoad; mi2.m_texIcon = Texture2D.whiteTexture; } } dicLock.WaitOne(); FilesToRead.Remove(strFileName); dicLock.ReleaseMutex(); } if (servant.IsFaulted) { Main.logger.LogError($"Servant task failed due to an unexpected error!"); throw servant.Exception; } })); //We wait until the manager is not busy because starting work while the manager is busy causes egregious bugs. while (!loaderWorker.IsCompleted || GameMain.Instance.CharacterMgr.IsBusy()) { yield return(null); } if (loaderWorker.IsFaulted) { Main.logger.LogError($"Worker task failed due to an unexpected error! This is considered a full failure: {loaderWorker.Exception.InnerException.Message}\n{loaderWorker.Exception.InnerException.StackTrace}\n\nwe will try restarting the load task..."); yield return(new WaitForSecondsRealtime(2)); [email protected](GSModMenuLoad.GSMenuLoadStart(menuList, menuGroupMemberDic)); yield break; } Main.logger.LogDebug("Worker finished! Now continuing foreach..."); foreach (SceneEdit.SMenuItem mi2 in listOfLoads) { try { if (Main.ChangeModPriority.Value) { if (mi2.m_fPriority <= 0) { mi2.m_fPriority = 1f; } mi2.m_fPriority += 10000; } if (!mi2.m_bMan) { AccessTools.Method(typeof(SceneEdit), "AddMenuItemToList").Invoke(Main.@this, new object[] { mi2 }); menuList.Add(mi2); [email protected]_menuRidDic[mi2.m_nMenuFileRID] = mi2; string parentMenuName2 = AccessTools.Method(typeof(SceneEdit), "GetParentMenuFileName").Invoke(Main.@this, new object[] { mi2 }) as string; if (!string.IsNullOrEmpty(parentMenuName2)) { int hashCode2 = parentMenuName2.GetHashCode(); if (!menuGroupMemberDic.ContainsKey(hashCode2)) { menuGroupMemberDic.Add(hashCode2, new List <int>()); } menuGroupMemberDic[hashCode2].Add(mi2.m_strMenuFileName.ToLower().GetHashCode()); } else if (mi2.m_strCateName.IndexOf("set_") != -1 && mi2.m_strMenuFileName.IndexOf("_del") == -1) { mi2.m_bGroupLeader = true; mi2.m_listMember = new List <SceneEdit.SMenuItem> { mi2 }; } } } catch (Exception e) { Main.logger.LogError($"We caught the following exception while processing {mi2.m_strMenuFileName}:\n {e.StackTrace}"); } if (Main.BreakInterval.Value < Time.realtimeSinceStartup - Main.time) { yield return(null); Main.time = Time.realtimeSinceStartup; } } Main.ThreadsDone++; Main.logger.LogInfo($"Standard mods finished loading at: {Main.WatchOverall.Elapsed}"); [email protected](SaveCache()); if (listOfDuplicates.Count > 0) { Main.logger.LogWarning($"There are {listOfDuplicates.Count} duplicate menus in your mod folder!"); foreach (string s in listOfDuplicates) { Main.logger.LogWarning("We found a duplicate that should be corrected immediately in your mod folder at: " + s); } } }
public static bool InitMenuItemScript(SceneEdit.SMenuItem mi, string f_strMenuFileName, bool f_bMan, out string IconTex) { var fetchedField = AccessTools.DeclaredField(typeof(SceneEdit), "m_byItemFileBuffer"); var fetchedVal = fetchedField.GetValue(@this) as byte[]; IconTex = null; if (f_strMenuFileName.IndexOf("mod_") == 0) { string modPathFileName = Menu.GetModPathFileName(f_strMenuFileName); return(!string.IsNullOrEmpty(modPathFileName) && SceneEdit.InitModMenuItemScript(mi, modPathFileName)); } try { using (AFileBase afileBase = GameUty.FileOpen(f_strMenuFileName, null)) { NDebug.Assert(afileBase.IsValid(), "メニューファイルが存在しません。 :" + f_strMenuFileName); if (fetchedVal == null) { fetchedVal = new byte[System.Math.Max(500000, afileBase.GetSize())]; } else if (fetchedVal.Length < afileBase.GetSize()) { fetchedVal = new byte[afileBase.GetSize()]; } afileBase.Read(ref fetchedVal, afileBase.GetSize()); } } catch (Exception ex) { Main.logger.LogError(string.Concat(new string[] { "メニューファイルがが読み込めませんでした。 : ", f_strMenuFileName, " : ", ex.Message, " : StackTrace :\n", ex.StackTrace })); throw ex; } BinaryReader binaryReader = new BinaryReader(new MemoryStream(fetchedVal), Encoding.UTF8); string text = binaryReader.ReadString(); NDebug.Assert(text == "CM3D2_MENU", "ProcScriptBin 例外 : ヘッダーファイルが不正です。" + text); int num = binaryReader.ReadInt32(); string path = binaryReader.ReadString(); string text2 = binaryReader.ReadString(); string text3 = binaryReader.ReadString(); string text4 = binaryReader.ReadString(); long num2 = (long)binaryReader.ReadInt32(); int num3 = 0; string text5 = null; string text6 = string.Empty; string text7 = string.Empty; try { for (; ;) { int num4 = (int)binaryReader.ReadByte(); text7 = text6; text6 = string.Empty; if (num4 == 0) { break; } for (int i = 0; i < num4; i++) { text6 = text6 + "\"" + binaryReader.ReadString() + "\" "; } if (!(text6 == string.Empty)) { string stringCom = UTY.GetStringCom(text6); string[] stringList = UTY.GetStringList(text6); if (stringCom == "name") { string text8 = stringList[1]; string text9 = string.Empty; string arg = string.Empty; int j = 0; while (j < text8.Length && text8[j] != '\u3000' && text8[j] != ' ') { text9 += text8[j]; j++; } while (j < text8.Length) { arg += text8[j]; j++; } mi.m_strMenuName = text9; } else if (stringCom == "setumei") { mi.m_strInfo = stringList[1]; mi.m_strInfo = mi.m_strInfo.Replace("《改行》", "\n"); } else if (stringCom == "category") { string strCateName = stringList[1].ToLower(); mi.m_strCateName = strCateName; try { mi.m_mpn = (MPN)Enum.Parse(typeof(MPN), mi.m_strCateName); } catch { Main.logger.LogWarning("カテゴリがありません。" + mi.m_strCateName); mi.m_mpn = MPN.null_mpn; } } else if (stringCom == "color_set") { try { mi.m_eColorSetMPN = (MPN)Enum.Parse(typeof(MPN), stringList[1].ToLower()); } catch { Main.logger.LogWarning("カテゴリがありません。" + mi.m_strCateName); } if (stringList.Length >= 3) { mi.m_strMenuNameInColorSet = stringList[2].ToLower(); } } else if (stringCom == "tex" || stringCom == "テクスチャ変更") { MaidParts.PARTS_COLOR pcMultiColorID = MaidParts.PARTS_COLOR.NONE; if (stringList.Length == 6) { string text10 = stringList[5]; try { pcMultiColorID = (MaidParts.PARTS_COLOR)Enum.Parse(typeof(MaidParts.PARTS_COLOR), text10.ToUpper()); } catch { NDebug.Assert("無限色IDがありません。" + text10, false); } mi.m_pcMultiColorID = pcMultiColorID; } } else if (stringCom == "icon" || stringCom == "icons") { text5 = stringList[1]; } else if (!(stringCom == "iconl")) { if (!(stringCom == "setstr")) { if (!(stringCom == "アイテムパラメータ")) { if (stringCom == "saveitem") { string text11 = stringList[1]; if (text11 == string.Empty) { Main.logger.LogError("err SaveItem \"" + text11); } if (text11 == null) { Main.logger.LogError("err SaveItem null=\"" + text11); } if (text11 != string.Empty) { } } else if (!(stringCom == "catno")) { if (stringCom == "additem") { num3++; } else if (stringCom == "unsetitem") { mi.m_boDelOnly = true; } else if (stringCom == "priority") { mi.m_fPriority = float.Parse(stringList[1]); } else if (stringCom == "メニューフォルダ" && stringList[1].ToLower() == "man") { mi.m_bMan = true; } } } } } } } } catch (Exception ex2) { Main.logger.LogError(string.Concat(new string[] { "Exception ", Path.GetFileName(path), " 現在処理中だった行 = ", text6, " 以前の行 = ", text7, " ", ex2.Message, "StackTrace:\n", ex2.StackTrace })); throw ex2; } if (text5 != null && text5 != string.Empty) { try { IconTex = text5; //mi.m_texIcon = ImportCM.CreateTexture(text5); } catch (Exception) { Main.logger.LogError("Error:"); } } binaryReader.Close(); return(true); }
public static IEnumerator VanillaMenuLoadStart(List <SceneEdit.SMenuItem> menuList, Dictionary <int, List <int> > menuGroupMemberDic) { Dictionary <SceneEdit.SMenuItem, int> filesToLoadFromDatabase = new Dictionary <SceneEdit.SMenuItem, int>(); Dictionary <SceneEdit.SMenuItem, string> filesToLoad = new Dictionary <SceneEdit.SMenuItem, string>(); //We wait until the manager is not busy because starting work while the manager is busy causes egregious bugs. while (GameMain.Instance.CharacterMgr.IsBusy()) { yield return(null); } MenuDataBase menuDataBase = GameMain.Instance.MenuDataBase; Stopwatch waitOnKiss = new Stopwatch(); waitOnKiss.Start(); while (!menuDataBase.JobFinished()) { yield return(null); } waitOnKiss.Stop(); int fileCount = menuDataBase.GetDataSize(); //This entire for loop is what loads in normal game menus. It's been left relatively untouched. for (int i = 0; i < fileCount; i++) { menuDataBase.SetIndex(i); string fileName = menuDataBase.GetMenuFileName(); if (GameMain.Instance.CharacterMgr.status.IsHavePartsItem(fileName)) { SceneEdit.SMenuItem mi = new SceneEdit.SMenuItem { m_strMenuFileName = fileName, m_nMenuFileRID = fileName.GetHashCode() }; filesToLoadFromDatabase[mi] = i; } } while (CacheLoadDone != true && Main.UseVanillaCache.Value) { yield return(null); } foreach (SceneEdit.SMenuItem mi in filesToLoadFromDatabase.Keys) { try { string iconFileName = null; if (MenuCache.ContainsKey(mi.m_strMenuFileName) && Main.UseVanillaCache.Value) { MenuStub tempStub = MenuCache[mi.m_strMenuFileName]; if (tempStub.DateModified == File.GetLastWriteTimeUtc(BepInEx.Paths.GameRootPath + "\\GameData\\paths.dat")) { mi.m_strMenuName = tempStub.Name; mi.m_strInfo = tempStub.Description; mi.m_mpn = (MPN)Enum.Parse(typeof(MPN), tempStub.Category); mi.m_strCateName = tempStub.Category; mi.m_eColorSetMPN = (MPN)Enum.Parse(typeof(MPN), tempStub.ColorSetMPN); mi.m_strMenuNameInColorSet = tempStub.ColorSetMenu; mi.m_pcMultiColorID = (MaidParts.PARTS_COLOR)Enum.Parse(typeof(MaidParts.PARTS_COLOR), tempStub.MultiColorID); mi.m_boDelOnly = tempStub.DelMenu; mi.m_fPriority = tempStub.Priority; mi.m_bMan = tempStub.ManMenu; mi.m_bOld = tempStub.LegacyMenu; iconFileName = tempStub.Icon; } else { Debug.LogWarning("GameData folder was changed! We'll be wiping the vanilla cache clean and rebuilding it now."); MenuCache = new Dictionary <string, MenuStub>(); } } if (string.IsNullOrEmpty(mi.m_strMenuName)) { //Debug.Log($"Loading {mi.m_strMenuFileName} from the database as it wasn't in cache..."); VanillaMenuLoad.ReadMenuItemDataFromNative(mi, filesToLoadFromDatabase[mi], out iconFileName); } filesToLoad[mi] = null; if (!string.IsNullOrEmpty(iconFileName) && GameUty.FileSystem.IsExistentFile(iconFileName)) { if (SceneEdit.Instance != null) { SceneEdit.Instance.editItemTextureCache.PreLoadRegister(mi.m_nMenuFileRID, iconFileName); } else { mi.m_texIcon = ImportCM.CreateTexture(iconFileName); } } } catch (Exception ex) { Debug.LogError(string.Concat(new string[] { "ReadMenuItemDataFromNative 例外/", mi.m_strMenuFileName, "/", ex.Message, " StackTrace/", ex.StackTrace })); } } while (GSModMenuLoad.DictionaryBuilt == false) { yield return(null); } foreach (SceneEdit.SMenuItem mi in filesToLoad.Keys) { if (!mi.m_bMan && !GSModMenuLoad.FilesDictionary.ContainsKey(mi.m_strMenuFileName) && [email protected](mi.m_nMenuFileRID)) { AccessTools.Method(typeof(SceneEdit), "AddMenuItemToList").Invoke(Main.@this, new object[] { mi }); menuList.Add(mi); [email protected]_menuRidDic[mi.m_nMenuFileRID] = mi; string parentMenuName = AccessTools.Method(typeof(SceneEdit), "GetParentMenuFileName").Invoke(Main.@this, new object[] { mi }) as string; if (!string.IsNullOrEmpty(parentMenuName)) { int hashCode = parentMenuName.GetHashCode(); if (!menuGroupMemberDic.ContainsKey(hashCode)) { menuGroupMemberDic.Add(hashCode, new List <int>()); } menuGroupMemberDic[hashCode].Add(mi.m_strMenuFileName.ToLower().GetHashCode()); } else if (mi.m_strCateName.IndexOf("set_") != -1 && mi.m_strMenuFileName.IndexOf("_del") == -1) { mi.m_bGroupLeader = true; mi.m_listMember = new List <SceneEdit.SMenuItem> { mi }; } if (0.5f < Time.realtimeSinceStartup - Main.time) { yield return(null); Main.time = Time.realtimeSinceStartup; } } } Main.ThreadsDone++; Debug.Log($"Vanilla menus finished loading at: {Main.WatchOverall.Elapsed}. We also spent {waitOnKiss.Elapsed} waiting for an unmodified database to finish loading..."); [email protected](SaveCache(filesToLoad)); }
public static void test2() { Main.logger.LogError("Coroutine was successfully engaged!"); while (GameMain.Instance.CharacterMgr.IsBusy()) { Thread.Sleep(20); //yield return null; } MenuDataBase menuDataBase = GameMain.Instance.MenuDataBase; while (!menuDataBase.JobFinished()) { Thread.Sleep(20); //yield return null; } test.Start(); Main.logger.LogError("Reaching first access method."); AccessTools.Method(typeof(SceneEdit), "InitCategoryList").Invoke(@this, null); //@this.InitCategoryList(); int fileCount = menuDataBase.GetDataSize(); List <SceneEdit.SMenuItem> menuList = new List <SceneEdit.SMenuItem>(); @this.m_menuRidDic = new Dictionary <int, SceneEdit.SMenuItem>(fileCount); Dictionary <int, List <int> > menuGroupMemberDic = new Dictionary <int, List <int> >(); float time = Time.realtimeSinceStartup; for (int i = 0; i < fileCount; i++) { menuDataBase.SetIndex(i); string fileName = menuDataBase.GetMenuFileName(); string parent_filename = menuDataBase.GetParentMenuFileName(); if (GameMain.Instance.CharacterMgr.status.IsHavePartsItem(fileName)) { SceneEdit.SMenuItem mi = new SceneEdit.SMenuItem(); mi.m_strMenuFileName = fileName; mi.m_nMenuFileRID = fileName.GetHashCode(); try { SceneEdit.ReadMenuItemDataFromNative(mi, i); } catch (Exception ex) { Main.logger.LogError(string.Concat(new string[] { "ReadMenuItemDataFromNative 例外/", fileName, "/", ex.Message, " StackTrace/", ex.StackTrace })); } if (!mi.m_bMan && @this.editItemTextureCache.IsRegister(mi.m_nMenuFileRID)) { AccessTools.Method(typeof(SceneEdit), "AddMenuItemToList").Invoke(@this, new object[] { mi }); //@this.AddMenuItemToList(mi); menuList.Add(mi); if ([email protected]_menuRidDic.ContainsKey(mi.m_nMenuFileRID)) { @this.m_menuRidDic.Add(mi.m_nMenuFileRID, mi); } string parentMenuName = AccessTools.Method(typeof(SceneEdit), "GetParentMenuFileName").Invoke(@this, new object[] { mi }) as string; //string parentMenuName = SceneEdit.GetParentMenuFileName(mi); if (!string.IsNullOrEmpty(parentMenuName)) { int hashCode = parentMenuName.GetHashCode(); if (!menuGroupMemberDic.ContainsKey(hashCode)) { menuGroupMemberDic.Add(hashCode, new List <int>()); } menuGroupMemberDic[hashCode].Add(mi.m_strMenuFileName.ToLower().GetHashCode()); } else if (mi.m_strCateName.IndexOf("set_") != -1 && mi.m_strMenuFileName.IndexOf("_del") == -1) { mi.m_bGroupLeader = true; mi.m_listMember = new List <SceneEdit.SMenuItem>(); mi.m_listMember.Add(mi); } if (0.5f < Time.realtimeSinceStartup - time) { //yield return null; time = Time.realtimeSinceStartup; } } } } //Parallel.ForEach(GameUty.ModOnlysMenuFiles, (strFileName) => foreach (string strFileName in GameUty.ModOnlysMenuFiles) { Stopwatch test2 = new Stopwatch(); test2.Start(); Main.logger.LogError("Invoking GetMenuItemSetUP"); SceneEdit.SMenuItem mi2 = new SceneEdit.SMenuItem(); if (Main.GetMenuItemSetUP(mi2, strFileName, out string IconTex, false)) { Main.logger.LogError("Managed to setup menu item correctly. Adding to list to continue processing..."); ListOfContinues[mi2] = IconTex; } //Thread.Sleep(100); Main.logger.LogError("Finished GetMenuItemSetUP: " + test2.Elapsed); } //); //@this2.StartCoroutine(SetupTexturesCoRoutine(menuList, menuGroupMemberDic)); SavedmenuList = menuList; SavedmenuGroupMemberDic = menuGroupMemberDic; Test2Done = true; }
public static IEnumerator test2() { Stopwatch test = new Stopwatch(); Debug.LogError("Coroutine was successfully engaged!"); while (GameMain.Instance.CharacterMgr.IsBusy()) { yield return(null); } MenuDataBase menuDataBase = GameMain.Instance.MenuDataBase; while (!menuDataBase.JobFinished()) { yield return(null); } test.Start(); Debug.LogError("Reaching first access method."); AccessTools.Method(typeof(SceneEdit), "InitCategoryList").Invoke(@this, null); //@this.InitCategoryList(); int fileCount = menuDataBase.GetDataSize(); ConcurrentQueue <SceneEdit.SMenuItem> menuList = new ConcurrentQueue <SceneEdit.SMenuItem>(); @this.m_menuRidDic = new Dictionary <int, SceneEdit.SMenuItem>(fileCount); var menuRidDicThreadSafe = new ConcurrentDictionary <int, SceneEdit.SMenuItem>(@this.m_menuRidDic); ConcurrentDictionary <int, ConcurrentQueue <int> > menuGroupMemberDic = new ConcurrentDictionary <int, ConcurrentQueue <int> >(); float time = Time.realtimeSinceStartup; for (int i = 0; i < fileCount; i++) { menuDataBase.SetIndex(i); string fileName = menuDataBase.GetMenuFileName(); string parent_filename = menuDataBase.GetParentMenuFileName(); if (GameMain.Instance.CharacterMgr.status.IsHavePartsItem(fileName)) { SceneEdit.SMenuItem mi = new SceneEdit.SMenuItem(); mi.m_strMenuFileName = fileName; mi.m_nMenuFileRID = fileName.GetHashCode(); try { SceneEdit.ReadMenuItemDataFromNative(mi, i); } catch (Exception ex) { Debug.LogError(string.Concat(new string[] { "ReadMenuItemDataFromNative 例外/", fileName, "/", ex.Message, " StackTrace/", ex.StackTrace })); } if (!mi.m_bMan && @this.editItemTextureCache.IsRegister(mi.m_nMenuFileRID)) { AccessTools.Method(typeof(SceneEdit), "AddMenuItemToList").Invoke(@this, new object[] { mi }); //@this.AddMenuItemToList(mi); menuList.Enqueue(mi); if (!menuRidDicThreadSafe.ContainsKey(mi.m_nMenuFileRID)) { menuRidDicThreadSafe[mi.m_nMenuFileRID] = mi; } string parentMenuName = AccessTools.Method(typeof(SceneEdit), "GetParentMenuFileName").Invoke(@this, new object[] { mi }) as string; //string parentMenuName = SceneEdit.GetParentMenuFileName(mi); if (!string.IsNullOrEmpty(parentMenuName)) { int hashCode = parentMenuName.GetHashCode(); if (!menuGroupMemberDic.ContainsKey(hashCode)) { menuGroupMemberDic[hashCode] = new ConcurrentQueue <int>(); } menuGroupMemberDic[hashCode].Enqueue(mi.m_strMenuFileName.ToLower().GetHashCode()); } else if (mi.m_strCateName.IndexOf("set_") != -1 && mi.m_strMenuFileName.IndexOf("_del") == -1) { mi.m_bGroupLeader = true; mi.m_listMember = new List <SceneEdit.SMenuItem>(); mi.m_listMember.Add(mi); } if (0.5f < Time.realtimeSinceStartup - time) { yield return(null); time = Time.realtimeSinceStartup; } } } } Debug.LogError($"Reaching the load ForEach at {test.Elapsed}."); //Parallel.ForEach(GameUty.ModOnlysMenuFiles, (strFileName) => Task.Factory.StartNew(new Action(() => { foreach (string strFileName in GameUty.ModOnlysMenuFiles) { Stopwatch test2 = new Stopwatch(); test2.Start(); //Debug.LogError("Invoking GetMenuItemSetUP"); SceneEdit.SMenuItem mi2 = new SceneEdit.SMenuItem(); if (Main.GetMenuItemSetUP(mi2, strFileName, out string IconTex, false)) { //Debug.LogError("Managed to setup menu item correctly. Adding to list to continue processing..."); ListOfIconLoads[mi2] = IconTex; } //Thread.Sleep(100); Debug.LogError("Finished One GetMenuItemSetUP in " + test2.Elapsed); } } //); )).Wait(); Debug.LogError($"We've finished SceneEdit.SMenuItem {test.Elapsed}"); SetupDone = true; while (IconLoadDone != true) { yield return(null); } Debug.LogError($"Now we've finished loading icons into each menu at {test.Elapsed}."); //Parallel.ForEach(ListOfContinues, (mi2) => foreach (SceneEdit.SMenuItem mi2 in ListOfContinues) { Stopwatch test2 = new Stopwatch(); if (!mi2.m_bMan && !(mi2.m_texIconRef == null)) { test2.Start(); //Debug.LogError("Invoking addmenuitemtolist"); AccessTools.Method(typeof(SceneEdit), "AddMenuItemToList").Invoke(@this, new object[] { mi2 }); //@this.AddMenuItemToList(mi2); //Debug.LogError($"Done invoking AddMenuItemToList at: {test2.Elapsed}"); if (!menuRidDicThreadSafe.ContainsKey(mi2.m_nMenuFileRID)) { menuRidDicThreadSafe[mi2.m_nMenuFileRID] = mi2; } //Debug.LogError("Invoking GetParentMenuFileName"); string parentMenuName2 = AccessTools.Method(typeof(SceneEdit), "GetParentMenuFileName").Invoke(@this, new object[] { mi2 }) as string; //string parentMenuName2 = SceneEdit.GetParentMenuFileName(mi2); //Debug.LogError($"Done Invoking GetParentMenuFileName at: {test2.Elapsed}"); if (!string.IsNullOrEmpty(parentMenuName2)) { int hashCode2 = parentMenuName2.GetHashCode(); if (!menuGroupMemberDic.ContainsKey(hashCode2)) { menuGroupMemberDic[hashCode2] = new ConcurrentQueue <int>(); } menuGroupMemberDic[hashCode2].Enqueue(mi2.m_strMenuFileName.ToLower().GetHashCode()); } else if (mi2.m_strCateName.IndexOf("set_") != -1 && mi2.m_strMenuFileName.IndexOf("_del") == -1) { mi2.m_bGroupLeader = true; mi2.m_listMember = new List <SceneEdit.SMenuItem>(); mi2.m_listMember.Add(mi2); } /* * if (true || 0.5f < Time.realtimeSinceStartup - time) * { * //yield return null; * Debug.LogError($"Sleeping thread, 100ms..."); * //Thread.Sleep(20); * time = Time.realtimeSinceStartup; * }*/ Debug.LogError($"Finished processing one menu file in {test2.Elapsed}"); } } //); Debug.LogError($"Finished previous foreach at {test.Elapsed}\nInvoking coroutines..."); SetupDone = true; //@this.m_menuRidDic = menuRidDicThreadSafe //.ToDictionary(t => t.Key, t => t.Value); Debug.LogError($"Converted Dictionary back..."); //yield return @this.StartCoroutine(@this.CoLoadWait()); yield return(@this.StartCoroutine(AccessTools.Method(typeof(SceneEdit), "CoLoadWait").Invoke(@this, null) as IEnumerator)); Debug.LogError($"Starting problematic coroutine."); //yield return @this.StartCoroutine(@this.FixedInitMenu(menuList, @this.m_menuRidDic, menuGroupMemberDic)); yield return(@this.StartCoroutine(AccessTools.Method(typeof(SceneEdit), "FixedInitMenu").Invoke(@this, new object[] { menuList, menuRidDicThreadSafe, menuGroupMemberDic }) as IEnumerator)); test.Stop(); Debug.LogError($"Done {test.Elapsed}"); yield break; }
public static IEnumerator InitialBackgroundWorker() { Debug.LogError("Coroutine was successfully engaged!"); while (GameMain.Instance.CharacterMgr.IsBusy()) { yield return(null); //Thread.Sleep(20); } MenuDataBase menuDataBase = GameMain.Instance.MenuDataBase; while (!menuDataBase.JobFinished()) { //Thread.Sleep(20); yield return(null); } test.Start(); Debug.LogError("Reaching first access method."); AccessTools.Method(typeof(SceneEdit), "InitCategoryList").Invoke(@this, null); //@this.InitCategoryList(); int fileCount = menuDataBase.GetDataSize(); var menuList = new HashSet <SceneEdit.SMenuItem>(); @this.m_menuRidDic = new Dictionary <int, SceneEdit.SMenuItem>(fileCount); var menuRidDicThreadSafe = @this.m_menuRidDic; var menuGroupMemberDic = new Dictionary <int, HashSet <int> >(); float time = Time.realtimeSinceStartup; for (int i = 0; i < fileCount; i++) { menuDataBase.SetIndex(i); string fileName = menuDataBase.GetMenuFileName(); string parent_filename = menuDataBase.GetParentMenuFileName(); if (GameMain.Instance.CharacterMgr.status.IsHavePartsItem(fileName)) { SceneEdit.SMenuItem mi = new SceneEdit.SMenuItem(); mi.m_strMenuFileName = fileName; mi.m_nMenuFileRID = fileName.GetHashCode(); try { SceneEdit.ReadMenuItemDataFromNative(mi, i); } catch (Exception ex) { Debug.LogError(string.Concat(new string[] { "ReadMenuItemDataFromNative 例外/", fileName, "/", ex.Message, " StackTrace/", ex.StackTrace })); } if (!mi.m_bMan && @this.editItemTextureCache.IsRegister(mi.m_nMenuFileRID)) { AccessTools.Method(typeof(SceneEdit), "AddMenuItemToList").Invoke(@this, new object[] { mi }); //@this.AddMenuItemToList(mi); menuList.Add(mi); menuRidDicThreadSafe[mi.m_nMenuFileRID] = mi; string parentMenuName = AccessTools.Method(typeof(SceneEdit), "GetParentMenuFileName").Invoke(@this, new object[] { mi }) as string; //string parentMenuName = SceneEdit.GetParentMenuFileName(mi); if (!string.IsNullOrEmpty(parentMenuName)) { int hashCode = parentMenuName.GetHashCode(); if (!menuGroupMemberDic.ContainsKey(hashCode)) { menuGroupMemberDic[hashCode] = new HashSet <int>(); } menuGroupMemberDic[hashCode].Add(mi.m_strMenuFileName.ToLower().GetHashCode()); } else if (mi.m_strCateName.IndexOf("set_") != -1 && mi.m_strMenuFileName.IndexOf("_del") == -1) { mi.m_bGroupLeader = true; mi.m_listMember = new List <SceneEdit.SMenuItem>(); mi.m_listMember.Add(mi); } if (0.5f < Time.realtimeSinceStartup - time) { //Thread.Sleep(20); yield return(null); time = Time.realtimeSinceStartup; } } } } Debug.LogError($"Reaching the load ForEach at {test.Elapsed}."); Stopwatch test2 = new Stopwatch(); foreach (string strFileName in GameUty.ModOnlysMenuFiles) { test2.Reset(); test2.Start(); SceneEdit.SMenuItem mi2 = new SceneEdit.SMenuItem(); if (Main.GetMenuItemSetUP(mi2, strFileName, out string iconTex, false)) { ListOfIconLoads[mi2] = iconTex; } Debug.LogError("Finished One GetMenuItemSetUP in " + test2.Elapsed); } Debug.LogError($"We've finished SceneEdit.SMenuItem {test.Elapsed}"); /* * SetupDone = true; * * while (IconLoadDone == false) * { * yield return null; * }*/ //foreach (KeyValuePair<SceneEdit.SMenuItem, string> keyPair in ListOfIconLoads) while (ListOfIconLoads.Count > 0) { var keyPair = ListOfIconLoads.FirstOrDefault(); if (keyPair.Key == null || keyPair.Value == null) { ListOfIconLoads.Remove(keyPair.Key); continue; } //Debug.LogError("Icon Coroutine is loading an icon..."); try { keyPair.Key.m_texIcon = ImportCM.CreateTexture(keyPair.Value); } catch { //ListOfIconLoads.Remove(keyPair.Key); continue; } if (!(keyPair.Key.m_texIconRef == null)) { ListOfContinues.Add(keyPair.Key); } ListOfIconLoads.Remove(keyPair.Key); } Debug.LogError($"Now we've finished loading icons into each menu at {test.Elapsed}."); //Parallel.ForEach(ListOfContinues, (mi2) => //foreach (SceneEdit.SMenuItem mi2 in ListOfContinues) while (ListOfContinues.Count > 0) { var mi2 = ListOfContinues.FirstOrDefault(); if (mi2 == null) { continue; } test2.Reset(); if (!mi2.m_bMan) { test2.Start(); //Debug.LogError("Invoking addmenuitemtolist"); AccessTools.Method(typeof(SceneEdit), "AddMenuItemToList").Invoke(@this, new object[] { mi2 }); //@this.AddMenuItemToList(mi2); //Debug.LogError($"Done invoking AddMenuItemToList at: {test2.Elapsed}"); menuRidDicThreadSafe[mi2.m_nMenuFileRID] = mi2; //Debug.LogError("Invoking GetParentMenuFileName"); string parentMenuName2 = AccessTools.Method(typeof(SceneEdit), "GetParentMenuFileName").Invoke(@this, new object[] { mi2 }) as string; //string parentMenuName2 = SceneEdit.GetParentMenuFileName(mi2); //Debug.LogError($"Done Invoking GetParentMenuFileName at: {test2.Elapsed}"); if (!string.IsNullOrEmpty(parentMenuName2)) { int hashCode2 = parentMenuName2.GetHashCode(); if (!menuGroupMemberDic.ContainsKey(hashCode2)) { menuGroupMemberDic[hashCode2] = new HashSet <int>(); } menuGroupMemberDic[hashCode2].Add(mi2.m_strMenuFileName.ToLower().GetHashCode()); } else if (mi2.m_strCateName.IndexOf("set_") != -1 && mi2.m_strMenuFileName.IndexOf("_del") == -1) { mi2.m_bGroupLeader = true; mi2.m_listMember = new List <SceneEdit.SMenuItem>(); mi2.m_listMember.Add(mi2); } if (0.5f < Time.realtimeSinceStartup - time) { yield return(null); Debug.LogError($"Sleeping thread, 100ms..."); time = Time.realtimeSinceStartup; } Debug.LogError($"Finished processing one menu file in {test2.Elapsed}"); } ListOfContinues.Remove(mi2); } //); Debug.LogError($"Finished previous foreach at {test.Elapsed}\nInvoking coroutines..."); @this.m_menuRidDic = menuRidDicThreadSafe; //var localmenuRidDic = @this.m_menuRidDic; //var tempMenuList = menuList.ToList(); var tempGroupMemberDic = menuGroupMemberDic.ToDictionary(t => t.Key, t => t.Value.ToList()); Debug.LogError($"Converted Dictionary back..."); //yield return @this.StartCoroutine(@this.CoLoadWait()); yield return(@this.StartCoroutine(AccessTools.Method(typeof(SceneEdit), "CoLoadWait").Invoke(@this, null) as IEnumerator)); Debug.LogError($"Starting problematic coroutine."); //yield return @this.StartCoroutine(@this.FixedInitMenu(menuList, @this.m_menuRidDic, menuGroupMemberDic)); yield return(@this.StartCoroutine(AccessTools.Method(typeof(SceneEdit), "FixedInitMenu").Invoke(@this, new object[] { menuList.ToList(), @this.m_menuRidDic, tempGroupMemberDic }) as IEnumerator)); test.Stop(); Debug.LogError($"Done, loaded {ListOfContinues.Count} menus in {test.Elapsed}"); ListOfContinues.Clear(); test.Reset(); yield break; } /*
private static IEnumerator FixedInitMenu(List <SceneEdit.SMenuItem> menuList, Dictionary <int, SceneEdit.SMenuItem> menuRidDic, Dictionary <int, List <int> > menuGroupMemberDic) { float time = Time.realtimeSinceStartup; List <SceneEdit.SCategory> listCategory = (List <SceneEdit.SCategory>)AccessTools.Field(typeof(SceneEdit), "m_listCategory").GetValue(@this); foreach (KeyValuePair <int, List <int> > keyValuePair in menuGroupMemberDic) { if (menuRidDic.ContainsKey(keyValuePair.Key) && keyValuePair.Value.Count >= 1 && keyValuePair.Value != null) { SceneEdit.SMenuItem smenuItem = menuRidDic[keyValuePair.Key]; smenuItem.m_bGroupLeader = true; smenuItem.m_listMember = new List <SceneEdit.SMenuItem>(); smenuItem.m_listMember.Add(smenuItem); for (int n = 0; n < keyValuePair.Value.Count; n++) { smenuItem.m_listMember.Add(menuRidDic[keyValuePair.Value[n]]); smenuItem.m_listMember[smenuItem.m_listMember.Count - 1].m_bMember = true; smenuItem.m_listMember[smenuItem.m_listMember.Count - 1].m_leaderMenu = smenuItem; } smenuItem.m_listMember.Sort(delegate(SceneEdit.SMenuItem x, SceneEdit.SMenuItem y) { if (x.m_fPriority == y.m_fPriority) { return(0); } if (x.m_fPriority < y.m_fPriority) { return(-1); } if (x.m_fPriority > y.m_fPriority) { return(1); } return(0); }); smenuItem.m_listMember.Sort((SceneEdit.SMenuItem x, SceneEdit.SMenuItem y) => x.m_strMenuFileName.CompareTo(y.m_strMenuFileName)); } else if (keyValuePair.Value == null) { Main.logger.LogError("A key value in menuGroupMemberDic was nulled. This value was skipped for processing as a result."); } } foreach (KeyValuePair <MPN, SceneEditInfo.CCateNameType> keyValuePair2 in SceneEditInfo.m_dicPartsTypePair) { if (keyValuePair2.Value.m_eType == SceneEditInfo.CCateNameType.EType.Slider) { AccessTools.Method(typeof(SceneEdit), "AddMenuItemToList").Invoke(@this, new object[] { new SceneEdit.SMenuItem { m_mpn = keyValuePair2.Key, m_nSliderValue = 500, m_strCateName = keyValuePair2.Key.ToString(), m_strMenuName = keyValuePair2.Value.m_strBtnPartsTypeName, m_requestNewFace = keyValuePair2.Value.m_requestNewFace, m_requestFBFace = keyValuePair2.Value.m_requestFBFace } }); /* * this.AddMenuItemToList(new SceneEdit.SMenuItem * { * m_mpn = keyValuePair2.Key, * m_nSliderValue = 500, * m_strCateName = keyValuePair2.Key.ToString(), * m_strMenuName = keyValuePair2.Value.m_strBtnPartsTypeName, * m_requestNewFace = keyValuePair2.Value.m_requestNewFace, * m_requestFBFace = keyValuePair2.Value.m_requestFBFace * });*/ } } for (int nM = 0; nM < menuList.Count; nM++) { SceneEdit.SMenuItem mi = menuList[nM]; if (SceneEditInfo.m_dicPartsTypePair.ContainsKey(mi.m_eColorSetMPN)) { if (mi.m_eColorSetMPN != MPN.null_mpn) { if (mi.m_strMenuNameInColorSet != null) { mi.m_strMenuNameInColorSet = mi.m_strMenuNameInColorSet.Replace("*", ".*"); mi.m_listColorSet = @this.m_dicColor[mi.m_eColorSetMPN].FindAll((SceneEdit.SMenuItem i) => new Regex(mi.m_strMenuNameInColorSet).IsMatch(i.m_strMenuFileName)); } else { mi.m_listColorSet = @this.m_dicColor[mi.m_eColorSetMPN]; } } if (0.5f < Time.realtimeSinceStartup - time) { yield return(null); time = Time.realtimeSinceStartup; } } } for (int j = 0; j < listCategory.Count; j++) { listCategory[j].SortPartsType(); } for (int k = 0; k < listCategory.Count; k++) { listCategory[k].SortItem(); } foreach (SceneEdit.SCategory scategory in listCategory) { if (scategory.m_eCategory == SceneEditInfo.EMenuCategory.プリセット || scategory.m_eCategory == SceneEditInfo.EMenuCategory.ランダム || scategory.m_eCategory == SceneEditInfo.EMenuCategory.プロフィ\u30FCル || scategory.m_eCategory == SceneEditInfo.EMenuCategory.着衣設定) { scategory.m_isEnabled = true; } else { scategory.m_isEnabled = false; foreach (SceneEdit.SPartsType spartsType in scategory.m_listPartsType) { if (spartsType.m_isEnabled) { scategory.m_isEnabled = true; break; } } } } if (@this.modeType == SceneEdit.ModeType.CostumeEdit) { SceneEditInfo.EMenuCategory[] array = new SceneEditInfo.EMenuCategory[] { SceneEditInfo.EMenuCategory.セット, SceneEditInfo.EMenuCategory.プリセット, SceneEditInfo.EMenuCategory.ランダム, SceneEditInfo.EMenuCategory.プロフィ\u30FCル }; SceneEditInfo.EMenuCategory[] array2 = array; for (int l = 0; l < array2.Length; l++) { SceneEditInfo.EMenuCategory cate = array2[l]; listCategory.Find((SceneEdit.SCategory c) => c.m_eCategory == cate).m_isEnabled = false; } } else if (@this.maid.status.heroineType == HeroineType.Sub || @this.maid.boNPC) { SceneEditInfo.EMenuCategory[] array3 = new SceneEditInfo.EMenuCategory[] { SceneEditInfo.EMenuCategory.プロフィ\u30FCル }; SceneEditInfo.EMenuCategory[] array4 = array3; for (int m = 0; m < array4.Length; m++) { SceneEditInfo.EMenuCategory cate = array4[m]; listCategory.Find((SceneEdit.SCategory c) => c.m_eCategory == cate).m_isEnabled = false; } } //@this.UpdatePanel_Category(); AccessTools.Method(typeof(SceneEdit), "UpdatePanel_Category").Invoke(@this, null); yield break; }
private static IEnumerator InitMenuNative() { while (GameMain.Instance.CharacterMgr.IsBusy()) { yield return(null); } MenuDataBase menuDataBase = GameMain.Instance.MenuDataBase; while (!menuDataBase.JobFinished()) { yield return(null); } Stopwatch watch1 = new Stopwatch(); Debug.Log("Vanilla menu file load has now begun."); watch1.Start(); AccessTools.Method(typeof(SceneEdit), "InitCategoryList").Invoke(@this, null); int fileCount = menuDataBase.GetDataSize(); List <SceneEdit.SMenuItem> menuList = new List <SceneEdit.SMenuItem>(fileCount); @this.m_menuRidDic = new Dictionary <int, SceneEdit.SMenuItem>(fileCount); Dictionary <int, List <int> > menuGroupMemberDic = new Dictionary <int, List <int> >(); float time = Time.realtimeSinceStartup; for (int i = 0; i < fileCount; i++) { menuDataBase.SetIndex(i); string fileName = menuDataBase.GetMenuFileName(); string parent_filename = menuDataBase.GetParentMenuFileName(); if (GameMain.Instance.CharacterMgr.status.IsHavePartsItem(fileName)) { SceneEdit.SMenuItem mi = new SceneEdit.SMenuItem(); mi.m_strMenuFileName = fileName; mi.m_nMenuFileRID = fileName.GetHashCode(); try { SceneEdit.ReadMenuItemDataFromNative(mi, i); } catch (Exception ex) { Debug.LogError(string.Concat(new string[] { "ReadMenuItemDataFromNative 例外/", fileName, "/", ex.Message, " StackTrace/", ex.StackTrace })); } if (!mi.m_bMan && @this.editItemTextureCache.IsRegister(mi.m_nMenuFileRID)) { AccessTools.Method(typeof(SceneEdit), "AddMenuItemToList").Invoke(@this, new object[] { mi }); menuList.Add(mi); if ([email protected]_menuRidDic.ContainsKey(mi.m_nMenuFileRID)) { @this.m_menuRidDic.Add(mi.m_nMenuFileRID, mi); } string parentMenuName = AccessTools.Method(typeof(SceneEdit), "GetParentMenuFileName").Invoke(@this, new object[] { mi }) as string; if (!string.IsNullOrEmpty(parentMenuName)) { int hashCode = parentMenuName.GetHashCode(); if (!menuGroupMemberDic.ContainsKey(hashCode)) { menuGroupMemberDic.Add(hashCode, new List <int>()); } menuGroupMemberDic[hashCode].Add(mi.m_strMenuFileName.ToLower().GetHashCode()); } else if (mi.m_strCateName.IndexOf("set_") != -1 && mi.m_strMenuFileName.IndexOf("_del") == -1) { mi.m_bGroupLeader = true; mi.m_listMember = new List <SceneEdit.SMenuItem>(); mi.m_listMember.Add(mi); } if (0.5f < Time.realtimeSinceStartup - time) { yield return(null); time = Time.realtimeSinceStartup; } } } } foreach (string strFileName in GameUty.ModOnlysMenuFiles) { SceneEdit.SMenuItem mi2 = new SceneEdit.SMenuItem(); if (SceneEdit.GetMenuItemSetUP(mi2, strFileName, false)) { if (!mi2.m_bMan && !(mi2.m_texIconRef == null)) { AccessTools.Method(typeof(SceneEdit), "AddMenuItemToList").Invoke(@this, new object[] { mi2 }); menuList.Add(mi2); if ([email protected]_menuRidDic.ContainsKey(mi2.m_nMenuFileRID)) { @this.m_menuRidDic.Add(mi2.m_nMenuFileRID, mi2); } string parentMenuName2 = AccessTools.Method(typeof(SceneEdit), "GetParentMenuFileName").Invoke(@this, new object[] { mi2 }) as string; if (!string.IsNullOrEmpty(parentMenuName2)) { int hashCode2 = parentMenuName2.GetHashCode(); if (!menuGroupMemberDic.ContainsKey(hashCode2)) { menuGroupMemberDic.Add(hashCode2, new List <int>()); } menuGroupMemberDic[hashCode2].Add(mi2.m_strMenuFileName.ToLower().GetHashCode()); } else if (mi2.m_strCateName.IndexOf("set_") != -1 && mi2.m_strMenuFileName.IndexOf("_del") == -1) { mi2.m_bGroupLeader = true; mi2.m_listMember = new List <SceneEdit.SMenuItem>(); mi2.m_listMember.Add(mi2); } if (0.5f < Time.realtimeSinceStartup - time) { yield return(null); time = Time.realtimeSinceStartup; } } } } yield return(@this.StartCoroutine(AccessTools.Method(typeof(SceneEdit), "FixedInitMenu").Invoke(@this, new object[] { menuList, @this.m_menuRidDic, menuGroupMemberDic }) as IEnumerator)); yield return(@this.StartCoroutine(AccessTools.Method(typeof(SceneEdit), "CoLoadWait").Invoke(@this, null) as IEnumerator)); watch1.Stop(); Debug.LogError($"Vanilla menu file load finished in: {watch1.Elapsed}"); yield break; }
public static bool InitMenuItemScript(SceneEdit.SMenuItem mi, string f_strMenuFileName, out string IconTex) { IconTex = null; if (f_strMenuFileName.IndexOf("mod_") == 0) { string modPathFileName = Menu.GetModPathFileName(f_strMenuFileName); return(!string.IsNullOrEmpty(modPathFileName) && SceneEdit.InitModMenuItemScript(mi, modPathFileName)); } if (MenuCache.ContainsKey(f_strMenuFileName)) { try { MenuStub tempStub = MenuCache[f_strMenuFileName]; if (tempStub.DateModified == File.GetLastWriteTimeUtc(FilesDictionary[f_strMenuFileName])) { if (tempStub.Name != null) { mi.m_strMenuName = tempStub.Name; } if (tempStub.Description != null) { mi.m_strInfo = tempStub.Description; } if (tempStub.Category != null) { mi.m_strCateName = tempStub.Category; mi.m_mpn = (MPN)Enum.Parse(typeof(MPN), tempStub.Category); } else { mi.m_mpn = MPN.null_mpn; } if (tempStub.ColorSetMPN != null) { mi.m_eColorSetMPN = (MPN)Enum.Parse(typeof(MPN), tempStub.ColorSetMPN); } if (tempStub.ColorSetMenu != null) { mi.m_strMenuNameInColorSet = tempStub.ColorSetMenu; } if (tempStub.MultiColorID == null) { mi.m_pcMultiColorID = MaidParts.PARTS_COLOR.NONE; } else if (tempStub.MultiColorID != null) { mi.m_pcMultiColorID = (MaidParts.PARTS_COLOR)Enum.Parse(typeof(MaidParts.PARTS_COLOR), tempStub.MultiColorID); } mi.m_boDelOnly = tempStub.DelMenu; mi.m_fPriority = tempStub.Priority; mi.m_bMan = tempStub.ManMenu; IconTex = tempStub.Icon; return(true); } else { Main.logger.LogWarning($"A cache entry was found outdated. This should be automatically fixed and the cache reloaded."); } } catch (Exception ex) { Main.logger.LogError(string.Concat(new string[] { $"Encountered an issue while trying to load menu {f_strMenuFileName} from cache. This should be automatically fixed and the cache reloaded.", "\n\n", ex.Message, "\n", ex.StackTrace })); } } try { if (FilesToRead[f_strMenuFileName] == null) { FilesToRead[f_strMenuFileName] = new MemoryStream(File.ReadAllBytes(FilesDictionary[f_strMenuFileName])); } } catch (Exception ex) { Main.logger.LogError(string.Concat(new string[] { "The following menu file could not be read! (メニューファイルがが読み込めませんでした。): ", f_strMenuFileName, "\n\n", ex.Message, "\n", ex.StackTrace })); return(false); } string text6 = string.Empty; string text7 = string.Empty; string path = ""; MenuStub cacheEntry = new MenuStub(); try { cacheEntry.DateModified = File.GetLastWriteTimeUtc(FilesDictionary[f_strMenuFileName]); BinaryReader binaryReader = new BinaryReader(FilesToRead[f_strMenuFileName], Encoding.UTF8); string text = binaryReader.ReadString(); if (text != "CM3D2_MENU") { Main.logger.LogError("ProcScriptBin (例外 : ヘッダーファイルが不正です。) The header indicates a file type that is not a menu file!" + text + " @ " + f_strMenuFileName); return(false); } binaryReader.ReadInt32(); path = binaryReader.ReadString(); binaryReader.ReadString(); binaryReader.ReadString(); binaryReader.ReadString(); binaryReader.ReadInt32(); string text5 = null; while (true) { int num4 = binaryReader.ReadByte(); text7 = text6; text6 = string.Empty; if (num4 == 0) { break; } for (int i = 0; i < num4; i++) { text6 = text6 + "\"" + binaryReader.ReadString() + "\" "; } if (!(text6 == string.Empty)) { string stringCom = UTY.GetStringCom(text6); string[] stringList = UTY.GetStringList(text6); if (stringCom == "name") { if (stringList.Length > 1) { string text8 = stringList[1]; string text9 = string.Empty; string arg = string.Empty; int j = 0; while (j < text8.Length && text8[j] != '\u3000' && text8[j] != ' ') { text9 += text8[j]; j++; } while (j < text8.Length) { arg += text8[j]; j++; } mi.m_strMenuName = text9; cacheEntry.Name = mi.m_strMenuName; } else { Main.logger.LogWarning("Menu file has no name and an empty description will be used instead." + " @ " + f_strMenuFileName); mi.m_strMenuName = ""; cacheEntry.Name = mi.m_strMenuName; } } else if (stringCom == "setumei") { if (stringList.Length > 1) { mi.m_strInfo = stringList[1]; mi.m_strInfo = mi.m_strInfo.Replace("《改行》", "\n"); cacheEntry.Description = mi.m_strInfo; } else { Main.logger.LogWarning("Menu file has no description (setumei) and an empty description will be used instead." + " @ " + f_strMenuFileName); mi.m_strInfo = ""; cacheEntry.Description = mi.m_strInfo; } } else if (stringCom == "category") { if (stringList.Length > 1) { string strCateName = stringList[1].ToLower(); mi.m_strCateName = strCateName; cacheEntry.Category = mi.m_strCateName; try { mi.m_mpn = (MPN)Enum.Parse(typeof(MPN), mi.m_strCateName); cacheEntry.Category = mi.m_mpn.ToString(); } catch { Main.logger.LogWarning("There is no category called (カテゴリがありません。): " + mi.m_strCateName + " @ " + f_strMenuFileName); return(false); } } else { Main.logger.LogWarning("The following menu file has a category parent with no category: " + f_strMenuFileName); return(false); } } else if (stringCom == "color_set") { if (stringList.Length > 1) { try { mi.m_eColorSetMPN = (MPN)Enum.Parse(typeof(MPN), stringList[1].ToLower()); cacheEntry.ColorSetMPN = mi.m_eColorSetMPN.ToString(); } catch { Main.logger.LogWarning("There is no category called(カテゴリがありません。): " + mi.m_strCateName + " @ " + f_strMenuFileName); return(false); } if (stringList.Length >= 3) { mi.m_strMenuNameInColorSet = stringList[2].ToLower(); cacheEntry.ColorSetMenu = mi.m_strMenuNameInColorSet; } } else { Main.logger.LogWarning("A color_set entry exists but is otherwise empty" + " @ " + f_strMenuFileName); } } else if (stringCom == "tex" || stringCom == "テクスチャ変更") { MaidParts.PARTS_COLOR pcMultiColorID = MaidParts.PARTS_COLOR.NONE; if (stringList.Length == 6) { string text10 = stringList[5]; try { pcMultiColorID = (MaidParts.PARTS_COLOR)Enum.Parse(typeof(MaidParts.PARTS_COLOR), text10.ToUpper()); } catch { Main.logger.LogError("無限色IDがありません。(The following free color ID does not exist: )" + text10 + " @ " + f_strMenuFileName); return(false); } mi.m_pcMultiColorID = pcMultiColorID; cacheEntry.MultiColorID = mi.m_pcMultiColorID.ToString(); } } else if (stringCom == "icon" || stringCom == "icons") { if (stringList.Length > 1) { text5 = stringList[1]; } else { Main.logger.LogError("The following menu file has an icon entry but no field set: " + f_strMenuFileName); return(false); } } else if (stringCom == "saveitem") { if (stringList.Length > 1) { string text11 = stringList[1]; if (String.IsNullOrEmpty(text11)) { Main.logger.LogWarning("SaveItem is either null or empty." + " @ " + f_strMenuFileName); } } else { Main.logger.LogWarning("A saveitem entry exists with nothing set in the field @ " + f_strMenuFileName); } } else if (stringCom == "unsetitem") { mi.m_boDelOnly = true; cacheEntry.DelMenu = mi.m_boDelOnly; } else if (stringCom == "priority") { if (stringList.Length > 1) { mi.m_fPriority = float.Parse(stringList[1]); cacheEntry.Priority = mi.m_fPriority; } else { Main.logger.LogError("The following menu file has a priority entry but no field set. A default value of 10000 will be used: " + f_strMenuFileName); mi.m_fPriority = 10000f; cacheEntry.Priority = mi.m_fPriority; } } else if (stringCom == "メニューフォルダ") { if (stringList.Length > 1) { if (stringList[1].ToLower() == "man") { mi.m_bMan = true; cacheEntry.ManMenu = mi.m_bMan; } } else { Main.logger.LogError("A a menu with a menu folder setting (メニューフォルダ) has an entry but no field set: " + f_strMenuFileName); return(false); } } } } if (!String.IsNullOrEmpty(text5)) { try { IconTex = text5; cacheEntry.Icon = text5; //mi.m_texIcon = ImportCM.CreateTexture(text5); } catch (Exception) { Main.logger.LogError("Error setting some icon tex from a normal mod." + " @ " + f_strMenuFileName); return(false); } } binaryReader.Close(); } catch (Exception ex2) { Main.logger.LogError(string.Concat(new string[] { "Exception when reading: ", f_strMenuFileName, "\nThe line currently being processed, likely the issue (現在処理中だった行): ", text6, "\nPrevious line (以前の行): ", text7, "\n\n", ex2.Message, "\n", ex2.StackTrace })); return(false); } MenuCache[f_strMenuFileName] = cacheEntry; return(true); }
public static bool InitMenuItemScript(SceneEdit.SMenuItem mi, string f_strMenuFileName, out string IconTex) { IconTex = null; if (f_strMenuFileName.IndexOf("mod_") == 0) { string modPathFileName = Menu.GetModPathFileName(f_strMenuFileName); return(!string.IsNullOrEmpty(modPathFileName) && SceneEdit.InitModMenuItemScript(mi, modPathFileName)); } try { if (MenuCache.ContainsKey(f_strMenuFileName)) { MenuStub tempStub = MenuCache[f_strMenuFileName]; if (tempStub.DateModified == File.GetLastWriteTimeUtc(FilesDictionary[f_strMenuFileName])) { if (tempStub.Name != null) { mi.m_strMenuName = tempStub.Name; } if (tempStub.Description != null) { mi.m_strInfo = tempStub.Description; } if (tempStub.Category != null) { mi.m_strCateName = tempStub.Category; mi.m_mpn = (MPN)Enum.Parse(typeof(MPN), tempStub.Category); } else { mi.m_mpn = MPN.null_mpn; } if (tempStub.ColorSetMPN != null) { mi.m_eColorSetMPN = (MPN)Enum.Parse(typeof(MPN), tempStub.ColorSetMPN); } if (tempStub.ColorSetMenu != null) { mi.m_strMenuNameInColorSet = tempStub.ColorSetMenu; } if (tempStub.MultiColorID == "null") { mi.m_pcMultiColorID = MaidParts.PARTS_COLOR.NONE; } else if (tempStub.MultiColorID != null) { mi.m_pcMultiColorID = (MaidParts.PARTS_COLOR)Enum.Parse(typeof(MaidParts.PARTS_COLOR), tempStub.MultiColorID); } mi.m_boDelOnly = tempStub.DelMenu; mi.m_fPriority = tempStub.Priority; mi.m_bMan = tempStub.ManMenu; IconTex = tempStub.Icon; return(true); } else { Debug.Log($"A cache entry was found outdated. This should be automatically fixed and the cache reloaded."); } } if (FilesToRead[f_strMenuFileName] == null) { FilesToRead[f_strMenuFileName] = new MemoryStream(File.ReadAllBytes(FilesDictionary[f_strMenuFileName])); } } catch (Exception ex) { Debug.LogError(string.Concat(new string[] { "メニューファイルがが読み込めませんでした。 : ", f_strMenuFileName, " : ", ex.Message, " : StackTrace :\n", ex.StackTrace })); throw ex; } string text6 = string.Empty; string text7 = string.Empty; string path = ""; MenuStub cacheEntry = new MenuStub(); try { cacheEntry.DateModified = File.GetLastWriteTimeUtc(FilesDictionary[f_strMenuFileName]); BinaryReader binaryReader = new BinaryReader(FilesToRead[f_strMenuFileName], Encoding.UTF8); string text = binaryReader.ReadString(); NDebug.Assert(text == "CM3D2_MENU", "ProcScriptBin 例外 : ヘッダーファイルが不正です。" + text); binaryReader.ReadInt32(); path = binaryReader.ReadString(); binaryReader.ReadString(); binaryReader.ReadString(); binaryReader.ReadString(); binaryReader.ReadInt32(); string text5 = null; while (true) { int num4 = binaryReader.ReadByte(); text7 = text6; text6 = string.Empty; if (num4 == 0) { break; } for (int i = 0; i < num4; i++) { text6 = text6 + "\"" + binaryReader.ReadString() + "\" "; } if (!(text6 == string.Empty)) { string stringCom = UTY.GetStringCom(text6); string[] stringList = UTY.GetStringList(text6); if (stringCom == "name") { string text8 = stringList[1]; string text9 = string.Empty; string arg = string.Empty; int j = 0; while (j < text8.Length && text8[j] != '\u3000' && text8[j] != ' ') { text9 += text8[j]; j++; } while (j < text8.Length) { arg += text8[j]; j++; } mi.m_strMenuName = text9; cacheEntry.Name = mi.m_strMenuName; } else if (stringCom == "setumei") { mi.m_strInfo = stringList[1]; mi.m_strInfo = mi.m_strInfo.Replace("《改行》", "\n"); cacheEntry.Description = mi.m_strInfo; } else if (stringCom == "category") { string strCateName = stringList[1].ToLower(); mi.m_strCateName = strCateName; cacheEntry.Category = mi.m_strCateName; try { mi.m_mpn = (MPN)Enum.Parse(typeof(MPN), mi.m_strCateName); cacheEntry.Category = mi.m_mpn.ToString(); } catch { Debug.LogWarning("カテゴリがありません。" + mi.m_strCateName); mi.m_mpn = MPN.null_mpn; } } else if (stringCom == "color_set") { try { mi.m_eColorSetMPN = (MPN)Enum.Parse(typeof(MPN), stringList[1].ToLower()); cacheEntry.ColorSetMPN = mi.m_eColorSetMPN.ToString(); } catch { Debug.LogWarning("カテゴリがありません。" + mi.m_strCateName); } if (stringList.Length >= 3) { mi.m_strMenuNameInColorSet = stringList[2].ToLower(); cacheEntry.ColorSetMenu = mi.m_strMenuNameInColorSet; } } else if (stringCom == "tex" || stringCom == "テクスチャ変更") { MaidParts.PARTS_COLOR pcMultiColorID = MaidParts.PARTS_COLOR.NONE; cacheEntry.MultiColorID = "null"; if (stringList.Length == 6) { string text10 = stringList[5]; try { pcMultiColorID = (MaidParts.PARTS_COLOR)Enum.Parse(typeof(MaidParts.PARTS_COLOR), text10.ToUpper()); } catch { NDebug.Assert("無限色IDがありません。" + text10, false); } mi.m_pcMultiColorID = pcMultiColorID; cacheEntry.MultiColorID = mi.m_pcMultiColorID.ToString(); } } else if (stringCom == "icon" || stringCom == "icons") { text5 = stringList[1]; } else if (!(stringCom == "iconl")) { if (!(stringCom == "setstr")) { if (!(stringCom == "アイテムパラメータ")) { if (stringCom == "saveitem") { string text11 = stringList[1]; if (text11 == string.Empty) { Debug.LogError("err SaveItem \"" + text11); } if (text11 == null) { Debug.LogError("err SaveItem null=\"" + text11); } } else if (!(stringCom == "catno")) { if (stringCom == "unsetitem") { mi.m_boDelOnly = true; cacheEntry.DelMenu = mi.m_boDelOnly; } else if (stringCom == "priority") { mi.m_fPriority = float.Parse(stringList[1]); cacheEntry.Priority = mi.m_fPriority; } else if (stringCom == "メニューフォルダ" && stringList[1].ToLower() == "man") { mi.m_bMan = true; cacheEntry.ManMenu = mi.m_bMan; } } } } } } } if (text5 != null && text5 != string.Empty) { try { IconTex = text5; cacheEntry.Icon = text5; //mi.m_texIcon = ImportCM.CreateTexture(text5); } catch (Exception) { Debug.LogError("Error:"); } } binaryReader.Close(); } catch (Exception ex2) { Debug.LogError(string.Concat(new string[] { "Exception ", Path.GetFileName(path), " 現在処理中だった行 = ", text6, " 以前の行 = ", text7, " ", ex2.Message, "StackTrace:\n", ex2.StackTrace })); throw ex2; } MenuCache[f_strMenuFileName] = cacheEntry; return(true); }