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); }
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; }