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);
 }
示例#2
0
        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);
        }
示例#3
0
 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;
         }
     }
 }
示例#4
0
        //[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}");
            }
        }
示例#6
0
        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();
                }
示例#7
0
        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;
        }
示例#8
0
 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;
            }
        }
示例#10
0
        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);
        }
示例#12
0
        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;
        }
示例#17
0
        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;
        }
示例#19
0
        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;
        }
示例#20
0
        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);
        }
示例#21
0
        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);
        }