public static void InitAllMetadata() { foreach (ModContentPack runningMod in LoadedModManager.RunningMods) { HashSet <string> hashSet = new HashSet <string>(); foreach (string item2 in runningMod.foldersToLoadDescendingOrder) { string text = Path.Combine(item2, "Languages"); if (new DirectoryInfo(text).Exists) { foreach (VirtualDirectory directory in AbstractFilesystem.GetDirectories(text, "*", SearchOption.TopDirectoryOnly)) { if (!directory.FullPath.StartsWith(text)) { Log.Error("Failed to get a relative path for a file: " + directory.FullPath + ", located in " + text); } else { string item = directory.FullPath.Substring(text.Length); if (!hashSet.Contains(item)) { InitLanguageMetadataFrom(directory); hashSet.Add(item); } } } } } } languages.SortBy((LoadedLanguage l) => l.folderName); defaultLanguage = languages.FirstOrDefault((LoadedLanguage la) => la.folderName == DefaultLangFolderName); activeLanguage = languages.FirstOrDefault((LoadedLanguage la) => la.folderName == Prefs.LangFolderName); if (activeLanguage == null) { Prefs.LangFolderName = DefaultLangFolderName; activeLanguage = languages.FirstOrDefault((LoadedLanguage la) => la.folderName == Prefs.LangFolderName); } if (activeLanguage == null || defaultLanguage == null) { Log.Error("No default language found!"); defaultLanguage = languages[0]; activeLanguage = languages[0]; } activeLanguage.LoadMetadata(); }
public void LoadMetadata() { if (info != null && infoIsRealMetadata) { return; } infoIsRealMetadata = true; foreach (ModContentPack runningMod in LoadedModManager.RunningMods) { foreach (string item in runningMod.foldersToLoadDescendingOrder) { string text = Path.Combine(item, "Languages"); if (!new DirectoryInfo(text).Exists) { continue; } foreach (VirtualDirectory directory in AbstractFilesystem.GetDirectories(text, "*", SearchOption.TopDirectoryOnly)) { if (directory.Name == folderName || directory.Name == legacyFolderName) { info = DirectXmlLoader.ItemFromXmlFile <LanguageInfo>(directory, "LanguageInfo.xml", resolveCrossRefs: false); if (info.friendlyNameNative.NullOrEmpty() && directory.FileExists("FriendlyName.txt")) { info.friendlyNameNative = directory.ReadAllText("FriendlyName.txt"); } if (info.friendlyNameNative.NullOrEmpty()) { info.friendlyNameNative = folderName; } if (info.friendlyNameEnglish.NullOrEmpty()) { info.friendlyNameEnglish = folderName; } return; } } } } }
public static bool LoadUserShow(UserShowDef userShow, bool addToDefDatabase = true) { // Get images in path IEnumerable <string> filePaths = Enumerable.Empty <string>(); if (!Directory.Exists(userShow.path)) { Log.Message($"RimFlix {userShow.defName} : {userShow.label}: Path <{userShow.path}> does not exist."); return(false); } try { DirectoryInfo dirInfo = new DirectoryInfo(userShow.path); filePaths = from file in dirInfo.GetFiles() where file.Name.ToLower().EndsWith(".jpg") || file.Name.ToLower().EndsWith(".png") where (file.Attributes & FileAttributes.Hidden) != FileAttributes.Hidden select file.FullName; } catch { Log.Message($"RimFlix {userShow.defName} : {userShow.label}: Error trying to load files from <{userShow.path}>."); return(false); } if (!filePaths.Any()) { Log.Message($"RimFlix {userShow.defName} : {userShow.label}: No images found in <{userShow.path}>."); // User may want to keep a show with an empty directory for future use. //return false; } // Load textures for images userShow.frames = new List <GraphicData>(); foreach (string filePath in filePaths) { // RimWorld sets internalPath to filePath without extension // This causes problems with files that have same name but different extension (file.jpg, file.png) string internalPath = filePath.Replace('\\', '/'); if (!RimFlixContent.contentList.ContainsKey(internalPath)) { string path = Path.GetDirectoryName(filePath); string file = Path.GetFileName(filePath); VirtualFile virtualFile = AbstractFilesystem.GetDirectory(path).GetFile(file); LoadedContentItem <Texture2D> loadedContentItem = ModContentLoader <Texture2D> .LoadItem(virtualFile); RimFlixContent.contentList.Add(internalPath, loadedContentItem.contentItem); } userShow.frames.Add(new GraphicData { texPath = internalPath, graphicClass = typeof(Graphic_Single) }); } // Create televisionDefs list userShow.televisionDefs = new List <ThingDef>(); foreach (string televisionDefString in userShow.televisionDefStrings) { userShow.televisionDefs.Add(ThingDef.Named(televisionDefString)); } // Add user show to def database if (!DefDatabase <ShowDef> .AllDefs.Contains(userShow)) { DefDatabase <ShowDef> .Add(userShow); } return(true); }
private static void DoPlayLoad() { DeepProfiler.Start("GraphicDatabase.Clear()"); try { GraphicDatabase.Clear(); } finally { DeepProfiler.End(); } DeepProfiler.Start("Load all active mods."); try { LoadedModManager.LoadAllActiveMods(); } finally { DeepProfiler.End(); } DeepProfiler.Start("Load language metadata."); try { LanguageDatabase.InitAllMetadata(); } finally { DeepProfiler.End(); } LongEventHandler.SetCurrentEventText("LoadingDefs".Translate()); DeepProfiler.Start("Copy all Defs from mods to global databases."); try { foreach (Type item in typeof(Def).AllSubclasses()) { GenGeneric.InvokeStaticMethodOnGenericType(typeof(DefDatabase <>), item, "AddAllInMods"); } } finally { DeepProfiler.End(); } DeepProfiler.Start("Resolve cross-references between non-implied Defs."); try { DirectXmlCrossRefLoader.ResolveAllWantedCrossReferences(FailMode.Silent); } finally { DeepProfiler.End(); } DeepProfiler.Start("Rebind defs (early)."); try { DefOfHelper.RebindAllDefOfs(earlyTryMode: true); } finally { DeepProfiler.End(); } DeepProfiler.Start("TKeySystem.BuildMappings()"); try { TKeySystem.BuildMappings(); } finally { DeepProfiler.End(); } DeepProfiler.Start("Inject selected language data into game data (early pass)."); try { LanguageDatabase.activeLanguage.InjectIntoData_BeforeImpliedDefs(); } finally { DeepProfiler.End(); } DeepProfiler.Start("Generate implied Defs (pre-resolve)."); try { DefGenerator.GenerateImpliedDefs_PreResolve(); } finally { DeepProfiler.End(); } DeepProfiler.Start("Resolve cross-references between Defs made by the implied defs."); try { DirectXmlCrossRefLoader.ResolveAllWantedCrossReferences(FailMode.LogErrors); } finally { DirectXmlCrossRefLoader.Clear(); DeepProfiler.End(); } DeepProfiler.Start("Rebind DefOfs (final)."); try { DefOfHelper.RebindAllDefOfs(earlyTryMode: false); } finally { DeepProfiler.End(); } DeepProfiler.Start("Other def binding, resetting and global operations (pre-resolve)."); try { PlayerKnowledgeDatabase.ReloadAndRebind(); LessonAutoActivator.Reset(); CostListCalculator.Reset(); Pawn.ResetStaticData(); PawnApparelGenerator.Reset(); RestUtility.Reset(); ThoughtUtility.Reset(); ThinkTreeKeyAssigner.Reset(); ThingCategoryNodeDatabase.FinalizeInit(); TrainableUtility.Reset(); HaulAIUtility.Reset(); GenConstruct.Reset(); MedicalCareUtility.Reset(); InspectPaneUtility.Reset(); GraphicDatabaseHeadRecords.Reset(); DateReadout.Reset(); ResearchProjectDef.GenerateNonOverlappingCoordinates(); BaseGen.Reset(); ResourceCounter.ResetDefs(); ApparelProperties.ResetStaticData(); WildPlantSpawner.ResetStaticData(); PawnGenerator.Reset(); TunnelHiveSpawner.ResetStaticData(); Hive.ResetStaticData(); ExpectationsUtility.Reset(); WealthWatcher.ResetStaticData(); SkillUI.Reset(); QuestNode_GetThingPlayerCanProduce.ResetStaticData(); Pawn_PsychicEntropyTracker.ResetStaticData(); ColoredText.ResetStaticData(); QuestNode_GetRandomNegativeGameCondition.ResetStaticData(); RoyalTitleUtility.ResetStaticData(); RewardsGenerator.ResetStaticData(); WorkGiver_FillFermentingBarrel.ResetStaticData(); WorkGiver_DoBill.ResetStaticData(); WorkGiver_InteractAnimal.ResetStaticData(); WorkGiver_Warden_DoExecution.ResetStaticData(); WorkGiver_GrowerSow.ResetStaticData(); WorkGiver_Miner.ResetStaticData(); WorkGiver_FixBrokenDownBuilding.ResetStaticData(); WorkGiver_ConstructDeliverResources.ResetStaticData(); } finally { DeepProfiler.End(); } DeepProfiler.Start("Resolve references."); try { DeepProfiler.Start("ThingCategoryDef resolver"); try { DefDatabase <ThingCategoryDef> .ResolveAllReferences(); } finally { DeepProfiler.End(); } DeepProfiler.Start("RecipeDef resolver"); try { DeepProfiler.enabled = false; DefDatabase <RecipeDef> .ResolveAllReferences(onlyExactlyMyType : true, parallel : true); DeepProfiler.enabled = true; } finally { DeepProfiler.End(); } DeepProfiler.Start("Static resolver calls"); try { foreach (Type item2 in typeof(Def).AllSubclasses()) { if (!(item2 == typeof(ThingDef)) && !(item2 == typeof(ThingCategoryDef)) && !(item2 == typeof(RecipeDef))) { GenGeneric.InvokeStaticMethodOnGenericType(typeof(DefDatabase <>), item2, "ResolveAllReferences", true, false); } } } finally { DeepProfiler.End(); } DeepProfiler.Start("ThingDef resolver"); try { DefDatabase <ThingDef> .ResolveAllReferences(); } finally { DeepProfiler.End(); } } finally { DeepProfiler.End(); } DeepProfiler.Start("Generate implied Defs (post-resolve)."); try { DefGenerator.GenerateImpliedDefs_PostResolve(); } finally { DeepProfiler.End(); } DeepProfiler.Start("Other def binding, resetting and global operations (post-resolve)."); try { PawnWeaponGenerator.Reset(); BuildingProperties.FinalizeInit(); ThingSetMakerUtility.Reset(); } finally { DeepProfiler.End(); } if (Prefs.DevMode) { DeepProfiler.Start("Error check all defs."); try { foreach (Type item3 in typeof(Def).AllSubclasses()) { GenGeneric.InvokeStaticMethodOnGenericType(typeof(DefDatabase <>), item3, "ErrorCheckAllDefs"); } } finally { DeepProfiler.End(); } } LongEventHandler.SetCurrentEventText("Initializing".Translate()); DeepProfiler.Start("Load keyboard preferences."); try { KeyPrefs.Init(); } finally { DeepProfiler.End(); } DeepProfiler.Start("Short hash giving."); try { ShortHashGiver.GiveAllShortHashes(); } finally { DeepProfiler.End(); } LongEventHandler.ExecuteWhenFinished(delegate { DeepProfiler.Start("Load backstories."); try { BackstoryDatabase.ReloadAllBackstories(); } finally { DeepProfiler.End(); } }); LongEventHandler.ExecuteWhenFinished(delegate { DeepProfiler.Start("Inject selected language data into game data."); try { LanguageDatabase.activeLanguage.InjectIntoData_AfterImpliedDefs(); GenLabel.ClearCache(); } finally { DeepProfiler.End(); } }); LongEventHandler.ExecuteWhenFinished(delegate { DeepProfiler.Start("Static constructor calls"); try { StaticConstructorOnStartupUtility.CallAll(); if (Prefs.DevMode) { StaticConstructorOnStartupUtility.ReportProbablyMissingAttributes(); } } finally { DeepProfiler.End(); } DeepProfiler.Start("Garbage Collection"); try { AbstractFilesystem.ClearAllCache(); GC.Collect(int.MaxValue, GCCollectionMode.Forced); } finally { DeepProfiler.End(); } }); }