private static void SortByTech(HashSet <ThingDef> apparelToSort, ThingCategoryDef thingCategoryDef, NextSortOption nextSortOption = NextSortOption.None) { Log.Message($"Sorting by tech, then by {nextSortOption}"); foreach (TechLevel techLevel in Enum.GetValues(typeof(TechLevel))) { var apparelToCheck = (from apparelDef in apparelToSort where apparelDef.techLevel == techLevel select apparelDef).ToHashSet(); var techLevelDefName = $"{thingCategoryDef.defName}_{techLevel}"; if (thingCategoryDef == ThingCategoryDefOf.Apparel) { techLevelDefName = $"CS_{techLevel}"; } ThingCategoryDef techLevelThingCategory = DefDatabase <ThingCategoryDef> .GetNamedSilentFail(techLevelDefName); if (techLevelThingCategory == null) { techLevelThingCategory = new ThingCategoryDef { defName = techLevelDefName, label = techLevel.ToStringHuman() }; DefGenerator.AddImpliedDef(techLevelThingCategory); } if (nextSortOption == NextSortOption.None) { AddApparelToCategory(apparelToCheck, techLevelThingCategory); if (techLevelThingCategory.childThingDefs.Count > 0 || techLevelThingCategory.childCategories.Count > 0) { thingCategoryDef.childCategories.Add(techLevelThingCategory); techLevelThingCategory.parent = thingCategoryDef; } } else { switch (nextSortOption) { case NextSortOption.Layer: SortByLayer(apparelToCheck, techLevelThingCategory); break; case NextSortOption.Mod: SortByMod(apparelToCheck, techLevelThingCategory); break; } if (techLevelThingCategory.childCategories.Count > 0) { thingCategoryDef.childCategories.Add(techLevelThingCategory); techLevelThingCategory.parent = thingCategoryDef; } } //techLevelThingCategory.ResolveReferences(); } }
private static void SortByMod(HashSet <ThingDef> apparelToSort, ThingCategoryDef thingCategoryDef, NextSortOption nextSortOption = NextSortOption.None) { Log.Message($"Sorting by mod, then by {nextSortOption}"); foreach (ModMetaData modData in from modData in ModLister.AllInstalledMods where modData.Active select modData) { var apparelToCheck = (from apparelDef in apparelToSort where apparelDef.modContentPack.PackageId == modData.PackageId select apparelDef).ToHashSet(); var modDefName = $"{thingCategoryDef.defName}_{modData.PackageId}"; if (thingCategoryDef == ThingCategoryDefOf.Apparel) { modDefName = $"CS_{modData.PackageId}"; } ThingCategoryDef modThingCategory = DefDatabase <ThingCategoryDef> .GetNamedSilentFail(modDefName); if (modThingCategory == null) { modThingCategory = new ThingCategoryDef { defName = modDefName, label = modData.Name }; DefGenerator.AddImpliedDef(modThingCategory); } if (nextSortOption == NextSortOption.None) { AddApparelToCategory(apparelToCheck, modThingCategory); if (modThingCategory.childThingDefs.Count > 0 || modThingCategory.childCategories.Count > 0) { thingCategoryDef.childCategories.Add(modThingCategory); modThingCategory.parent = thingCategoryDef; } } else { switch (nextSortOption) { case NextSortOption.Layer: SortByLayer(apparelToCheck, modThingCategory); break; case NextSortOption.Tech: SortByTech(apparelToCheck, modThingCategory); break; } if (modThingCategory.childCategories.Count > 0) { thingCategoryDef.childCategories.Add(modThingCategory); modThingCategory.parent = thingCategoryDef; } } //techLevelThingCategory.ResolveReferences(); } }
private static void SortByLayer(HashSet <ThingDef> apparelToSort, ThingCategoryDef thingCategoryDef, NextSortOption nextSortOption = NextSortOption.None) { Log.Message($"Sorting by layer, then by {nextSortOption}"); var layerDefs = (from layerDef in DefDatabase <ApparelLayerDef> .AllDefsListForReading orderby layerDef.label select layerDef).ToList(); layerDefs.Add(new ApparelLayerDef { defName = "Layer_None", label = "NoLayer".Translate() }); var selectedLayers = new List <ApparelLayerDef>(); for (var layerInt = 0; layerInt < layerDefs.Count(); layerInt++) { if (ClothingSorterMod.instance.Settings.CombineLayers && layerDefs.Count() > layerInt + 1 && layerDefs[layerInt].label.ToLower() == layerDefs[layerInt + 1].label.ToLower()) { selectedLayers.Add(layerDefs[layerInt]); continue; } var layerDef = layerDefs[layerInt]; selectedLayers.Add(layerDef); var apparelToCheck = (from apparelDef in apparelToSort where apparelDef.apparel?.layers?.Count() > 0 && apparelDef.apparel.layers.SharesElementWith(selectedLayers) select apparelDef).ToHashSet(); if (layerDef.defName == "Layer_None") { apparelToCheck = (from apparelDef in apparelToSort where apparelDef.apparel == null || apparelDef.apparel.layers == null || apparelDef.apparel.layers.Count() == 0 select apparelDef).ToHashSet(); } selectedLayers.Clear(); var layerDefName = $"{thingCategoryDef.defName}_{layerDef}"; if (thingCategoryDef == ThingCategoryDefOf.Apparel) { layerDefName = $"CS_{layerDef}"; } ThingCategoryDef layerThingCategory = DefDatabase <ThingCategoryDef> .GetNamedSilentFail(layerDefName); if (layerThingCategory == null) { layerThingCategory = new ThingCategoryDef { defName = layerDefName, label = layerDef.label }; DefGenerator.AddImpliedDef(layerThingCategory); } if (nextSortOption == NextSortOption.None) { AddApparelToCategory(apparelToCheck, layerThingCategory); if (layerThingCategory.childThingDefs.Count > 0 || layerThingCategory.childCategories.Count > 0) { thingCategoryDef.childCategories.Add(layerThingCategory); layerThingCategory.parent = thingCategoryDef; } } else { switch (nextSortOption) { case NextSortOption.Tech: SortByTech(apparelToCheck, layerThingCategory); break; case NextSortOption.Mod: SortByMod(apparelToCheck, layerThingCategory); break; } if (layerThingCategory.childCategories.Count > 0) { thingCategoryDef.childCategories.Add(layerThingCategory); layerThingCategory.parent = thingCategoryDef; } } //layerThingCategory.ResolveReferences(); } }