private static bool SpawnableThingDefsPredicate(ThingDef thingDef) { return( (thingDef.tradeability.TraderCanSell() || ThingSetMakerUtility.CanGenerate(thingDef)) && (thingDef.building == null || thingDef.Minifiable) && thingDef.BaseMarketValue > 0 && thingDef.race != null ); }
public static IEnumerable <ThingDef> GetDefaultItems() { return(from t in DefDatabase <ThingDef> .AllDefs where (t.tradeability.TraderCanSell() || ThingSetMakerUtility.CanGenerate(t)) && (t.building == null || t.Minifiable || ToolkitSettings.MinifiableBuildings) && (t.BaseMarketValue > 0) orderby t.LabelCap select t); }
private static ThingDef RandomRequiredDef() { int numMeats = (from x in PossibleСontentsDefs() where x.IsMeat select x).Count(); int numLeathers = (from x in PossibleСontentsDefs() where x.IsLeather select x).Count(); return(PossibleСontentsDefs().RandomElementByWeight((ThingDef d) => ThingSetMakerUtility.AdjustedBigCategoriesSelectionWeight(d, numMeats, numLeathers))); }
private const string enableCraftingTag = "CE_AutoEnableCrafting"; // The trade tag which designates ammo defs for having their crafting recipes automatically added to the crafting table /* * private static ThingDef ammoCraftingStationInt; // The crafting station to which ammo will be automatically added * private static ThingDef AmmoCraftingStation * { * get * { * if (ammoCraftingStationInt == null) * ammoCraftingStationInt = ThingDef.Named("AmmoBench"); * return ammoCraftingStationInt; * } * } */ public static void Inject() { if (InjectAmmos()) { Log.Message("Combat Extended :: Ammo " + (Controller.settings.EnableAmmoSystem ? "injected" : "removed")); } else { Log.Error("Combat Extended :: Ammo injector failed to get injected"); } ThingSetMakerUtility.Reset(); // Reset pool of spawnable ammos for quests, etc. }
public static IEnumerable <ThingDef> GetDefaultItems() { return(from t in DefDatabase <ThingDef> .AllDefs where (t.tradeability.TraderCanSell() || ThingSetMakerUtility.CanGenerate(t)) && (t.building == null || t.Minifiable || ToolkitSettings.MinifiableBuildings) && (t.FirstThingCategory != null || t.race != null) && (t.BaseMarketValue > 0) orderby t.LabelCap.RawText select t); //return from t in DefDatabase<ThingDef>.AllDefs // where (t.tradeability.TraderCanSell() || ThingSetMakerUtility.CanGenerate(t)) && // (t.building == null || t.Minifiable || ToolkitSettings.MinifiableBuildings) && // (t.BaseMarketValue > 0) // orderby t.LabelCap // select t; }
public static ThingDef RandomPodContentsDef(bool mustBeResource = false) { IEnumerable <ThingDef> source = ThingSetMaker_BeeResourcePod.PossiblePodContentsDefs(); if (mustBeResource) { source = from x in source where x.stackLimit > 1 select x; } int numMeats = (from x in source where x.IsMeat select x).Count <ThingDef>(); int numLeathers = (from x in source where x.IsLeather select x).Count <ThingDef>(); return(source.RandomElementByWeight((ThingDef d) => ThingSetMakerUtility.AdjustedBigCategoriesSelectionWeight(d, numMeats, numLeathers))); }
private static ThingDef RandomPodContentsDef() { int numMeats = (from x in ThingSetMaker_Treasure.PossiblePodContentsDefs() where x.IsMeat select x).Count <ThingDef>(); int numLeathers = (from x in ThingSetMaker_Treasure.PossiblePodContentsDefs() where x.IsLeather select x).Count <ThingDef>(); return(ThingSetMaker_Treasure.PossiblePodContentsDefs().RandomElementByWeight((ThingDef d) => ThingSetMakerUtility.AdjustedBigCategoriesSelectionWeight(d, numMeats, numLeathers))); }
private void GetTradeables() { if (cachedTradeables.Count > 0) { Store_ItemEditor.UpdateStoreItems(cachedTradeables, tradeablesPrices); } lastSearch = searchQuery; cachedTradeables = new List <ThingDef>(); string searchShort = string.Join("", searchQuery.Split(' ')).ToLower(); Log.Warning("Search " + searchShort); IEnumerable <ThingDef> tradeableitems = from t in DefDatabase <ThingDef> .AllDefs where (t.tradeability.TraderCanSell() || ThingSetMakerUtility.CanGenerate(t)) && (t.building == null || t.Minifiable || ToolkitSettings.MinifiableBuildings) && (t.FirstThingCategory != null) && (t.BaseMarketValue > 0) && (searchQuery == "" || (t.defName.ToLower().Contains(searchShort) || string.Join("", t.label.Split(' ')).ToLower().Contains(searchShort) || t.defName.ToLower() == searchShort || string.Join("", t.label.Split(' ')).ToLower() == searchShort || string.Join("", t.FirstThingCategory.LabelCap.Split(' ')).ToLower().Contains(searchShort) || t.FirstThingCategory.LabelCap.ToLower() == searchShort) ) orderby t.LabelCap select t; Helper.Log("Found " + tradeableitems.Count() + " items"); foreach (ThingDef item in tradeableitems) { // item needs to be worth money, also not an animal if (item.BaseMarketValue > 0f && item.race == null) { cachedTradeables.Add(item); } } GetTradeablesPrices(); }
public static void TryMakeAllItems() { IEnumerable <ThingDef> tradeableitems = from t in DefDatabase <ThingDef> .AllDefs where (t.tradeability.TraderCanSell() || ThingSetMakerUtility.CanGenerate(t)) && (t.building == null || t.Minifiable || ToolkitSettings.MinifiableBuildings) select t; Helper.Log("Found " + tradeableitems.Count() + " items"); foreach (ThingDef item in tradeableitems) { string label = string.Join("", item.label.Split(' ')).ToLower(); Item checkforexistingitembydefname = Item.GetItemFromDefName(item.defName); Item checkforexistingitembylabel = Item.GetItemFromAbr(label); if (checkforexistingitembydefname == null && checkforexistingitembylabel == null) { try { // item needs to be worth money, also not an animal if (item.BaseMarketValue > 0f && item.race == null) { int id = StoreInventory.items.Count(); StoreInventory.items.Add(new Item(Convert.ToInt32(item.BaseMarketValue * 10 / 6), label, item.defName)); } } catch (InvalidCastException e) { Helper.Log("Existing item exception " + e.Message); } } } }
static RemoveModernStuff() { DebugString.AppendLine("Lord of the Rings - The Third Age - Start Removal Log"); DebugString.AppendLine("Tech Limiter Active: Max Level = " + MAX_TECHLEVEL.ToString()); giveApproppriateTechLevels(); removedDefs = 0; IEnumerable <ResearchProjectDef> projects = DefDatabase <ResearchProjectDef> .AllDefs.Where(rpd => rpd.techLevel > MAX_TECHLEVEL); things = new HashSet <ThingDef>(DefDatabase <ThingDef> .AllDefs.Where(td => td.techLevel > MAX_TECHLEVEL || (td.researchPrerequisites?.Any(rpd => projects.Contains(rpd)) ?? false) || new[] { "Gun_Revolver", "VanometricPowerCell", "PsychicEmanator", "InfiniteChemreactor", "Joywire", "Painstopper" }.Contains(td.defName))); DebugString.AppendLine("RecipeDef Removal List"); var recipeDefsToRemove = DefDatabase <RecipeDef> .AllDefs.Where(rd => rd.products.Any(tcc => things.Contains(tcc.thingDef)) || rd.AllRecipeUsers.All(td => things.Contains(td)) || projects.Contains(rd.researchPrerequisite)).Cast <Def>().ToList(); recipeDefsToRemove?.RemoveAll(x => x.defName == "ExtractMetalFromSlag" || x.defName == "SmeltWeapon" || x.defName == "DestroyWeapon" || x.defName == "OfferingOfPlants_Meagre" || x.defName == "OfferingOfPlants_Decent" || x.defName == "OfferingOfPlants_Sizable" || x.defName == "OfferingOfPlants_Worthy" || x.defName == "OfferingOfPlants_Impressive" || x.defName == "OfferingOfMeat_Meagre" || x.defName == "OfferingOfMeat_Decent" || x.defName == "OfferingOfMeat_Sizable" || x.defName == "OfferingOfMeat_Worthy" || x.defName == "OfferingOfMeat_Impressive" || x.defName == "OfferingOfMeals_Meagre" || x.defName == "OfferingOfMeals_Decent" || x.defName == "OfferingOfMeals_Sizable" || x.defName == "OfferingOfMeals_Worthy" || x.defName == "OfferingOfMeals_Impressive" || x.defName == "ROMV_ExtractBloodVial" || x.defName == "ROMV_ExtractBloodPack" ); RemoveStuffFromDatabase(typeof(DefDatabase <RecipeDef>), recipeDefsToRemove); DebugString.AppendLine("ResearchProjectDef Removal List"); RemoveStuffFromDatabase(typeof(DefDatabase <ResearchProjectDef>), projects.Cast <Def>()); DebugString.AppendLine("Scenario Part Removal List"); FieldInfo getThingInfo = typeof(ScenPart_ThingCount).GetField("thingDef", BindingFlags.NonPublic | BindingFlags.Instance); foreach (ScenarioDef def in DefDatabase <ScenarioDef> .AllDefs) { foreach (ScenPart sp in def.scenario.AllParts) { if (sp is ScenPart_ThingCount && things.Contains((ThingDef)getThingInfo?.GetValue(sp))) { def.scenario.RemovePart(sp); DebugString.AppendLine("- " + sp.Label + " " + ((ThingDef)getThingInfo?.GetValue(sp)).label + " from " + def.label); } } } foreach (ThingCategoryDef thingCategoryDef in DefDatabase <ThingCategoryDef> .AllDefs) { thingCategoryDef.childThingDefs.RemoveAll(things.Contains); } DebugString.AppendLine("Stock Generator Part Cleanup"); foreach (TraderKindDef tkd in DefDatabase <TraderKindDef> .AllDefs) { for (int i = tkd.stockGenerators.Count - 1; i >= 0; i--) { StockGenerator stockGenerator = tkd.stockGenerators[i]; switch (stockGenerator) { case StockGenerator_SingleDef sd when things.Contains(Traverse.Create(sd).Field("thingDef") .GetValue <ThingDef>()): ThingDef def = Traverse.Create(sd).Field("thingDef") .GetValue <ThingDef>(); tkd.stockGenerators.Remove(stockGenerator); DebugString.AppendLine("- " + def.label + " from " + tkd.label + "'s StockGenerator_SingleDef"); break; case StockGenerator_MultiDef md: Traverse thingListTraverse = Traverse.Create(md).Field("thingDefs"); List <ThingDef> thingList = thingListTraverse.GetValue <List <ThingDef> >(); var removeList = thingList.FindAll(things.Contains); removeList?.ForEach(x => DebugString.AppendLine("- " + x.label + " from " + tkd.label + "'s StockGenerator_MultiDef")); thingList.RemoveAll(things.Contains); if (thingList.NullOrEmpty()) { tkd.stockGenerators.Remove(stockGenerator); } else { thingListTraverse.SetValue(thingList); } break; } } } DebugString.AppendLine("IncidentDef Removal List"); IEnumerable <IncidentDef> incidents = DefDatabase <IncidentDef> .AllDefs .Where(id => new[] { typeof (IncidentWorker_ShipChunkDrop ), AccessTools .TypeByName( "IncidentWorker_ShipPartCrash"), typeof (IncidentWorker_QuestJourneyOffer ), typeof (IncidentWorker_ResourcePodCrash ), //typeof(IncidentWorker_RefugeePodCrash), typeof(IncidentWorker_TransportPodCrash), typeof (IncidentWorker_PsychicDrone ), typeof (IncidentWorker_RansomDemand ), typeof (IncidentWorker_ShortCircuit ), typeof (IncidentWorker_OrbitalTraderArrival ), typeof (IncidentWorker_PsychicSoothe ) }.SelectMany( it => it .AllSubclassesNonAbstract() .Concat( it)) .ToArray() .Contains( id .workerClass) || new[] { "Disease_FibrousMechanites", "Disease_SensoryMechanites", "RaidEnemyEscapeShip", "StrangerInBlackJoin" }.Contains( id .defName)).ToList(); foreach (IncidentDef incident in incidents) { incident.targetTags?.Clear(); incident.baseChance = 0f; incident.allowedBiomes?.Clear(); incident.earliestDay = int.MaxValue; } RemoveStuffFromDatabase(typeof(DefDatabase <IncidentDef>), incidents.Cast <Def>()); DebugString.AppendLine("Replaced Ancient Asphalt Road / Ancient Asphalt Highway with Stone Road"); RoadDef[] targetRoads = { RoadDefOf.AncientAsphaltRoad, RoadDefOf.AncientAsphaltHighway }; RoadDef originalRoad = DefDatabase <RoadDef> .GetNamed("StoneRoad"); List <string> fieldNames = AccessTools.GetFieldNames(typeof(RoadDef)); fieldNames.Remove("defName"); foreach (FieldInfo fi in fieldNames.Select(name => AccessTools.Field(typeof(RoadDef), name))) { object fieldValue = fi.GetValue(originalRoad); foreach (RoadDef targetRoad in targetRoads) { fi.SetValue(targetRoad, fieldValue); } } DebugString.AppendLine("Special Hediff Removal List"); RemoveStuffFromDatabase(typeof(DefDatabase <HediffDef>), (hediffs = new[] { HediffDefOf.Gunshot }).Cast <Def>()); DebugString.AppendLine("RaidStrategyDef Removal List"); RemoveStuffFromDatabase(typeof(DefDatabase <RaidStrategyDef>), DefDatabase <RaidStrategyDef> .AllDefs .Where(rs => typeof(ScenPart_ThingCount).IsAssignableFrom(rs.workerClass)).Cast <Def>()); // ItemCollectionGeneratorUtility.allGeneratableItems.RemoveAll(match: things.Contains); // // foreach (Type type in typeof(ItemCollectionGenerator_Standard).AllSubclassesNonAbstract()) // type.GetMethod(name: "Reset")?.Invoke(obj: null, parameters: null); DebugString.AppendLine("ThingDef Removal List"); RemoveStuffFromDatabase(typeof(DefDatabase <ThingDef>), things.ToArray()); DebugString.AppendLine("ThingSetMaker Reset"); ThingSetMakerUtility.Reset(); DebugString.AppendLine("TraitDef Removal List"); RemoveStuffFromDatabase(typeof(DefDatabase <TraitDef>), // { nameof(TraitDefOf.Prosthophobe), "Prosthophile" } ? DefDatabase <TraitDef> .AllDefs .Where(td => new[] { nameof(TraitDefOf.BodyPurist), "Transhumanist" }.Contains(td.defName)) .Cast <Def>()); DebugString.AppendLine("Designators Resolved Again"); MethodInfo resolveDesignatorsAgain = typeof(DesignationCategoryDef).GetMethod("ResolveDesignators", BindingFlags.NonPublic | BindingFlags.Instance); foreach (DesignationCategoryDef dcd in DefDatabase <DesignationCategoryDef> .AllDefs) { resolveDesignatorsAgain?.Invoke(dcd, null); } DebugString.AppendLine("PawnKindDef Removal List"); RemoveStuffFromDatabase(typeof(DefDatabase <PawnKindDef>), DefDatabase <PawnKindDef> .AllDefs .Where(pkd => (!pkd.defaultFactionType?.isPlayer ?? false) && (pkd.race.techLevel > MAX_TECHLEVEL || pkd.defaultFactionType?.techLevel > MAX_TECHLEVEL) && !pkd.defName.EqualsIgnoreCase("Villager") && !pkd.defName.EqualsIgnoreCase("SpaceRefugee")) .Cast <Def>()); DebugString.AppendLine("FactionDef Removal List"); RemoveStuffFromDatabase(typeof(DefDatabase <FactionDef>), DefDatabase <FactionDef> .AllDefs.Where(fd => !fd.isPlayer && fd.techLevel > MAX_TECHLEVEL).Cast <Def>()); DebugString.AppendLine("BackstoryDef Removal List"); BackstoryHandler.RemoveIncompatibleBackstories(DebugString); DebugString.AppendLine("MapGeneratorDef Removal List"); DebugString.AppendLine("- GenStep_SleepingMechanoids"); DebugString.AppendLine("- GenStep_Turrets"); DebugString.AppendLine("- GenStep_Power"); foreach (MapGeneratorDef mgd in DefDatabase <MapGeneratorDef> .AllDefs) { mgd.genSteps.RemoveAll(gs => gs.genStep is GenStep_SleepingMechanoids || gs.genStep is GenStep_Turrets || gs.genStep is GenStep_Power); } DebugString.AppendLine("RuleDef Removal List"); DebugString.AppendLine("- SymbolResolver_AncientCryptosleepCasket"); DebugString.AppendLine("- SymbolResolver_ChargeBatteries"); DebugString.AppendLine("- SymbolResolver_EdgeMannedMortor"); DebugString.AppendLine("- SymbolResolver_FirefoamPopper"); DebugString.AppendLine("- SymbolResolver_MannedMortar"); DebugString.AppendLine("- SymbolResolver_"); foreach (RuleDef rd in DefDatabase <RuleDef> .AllDefs) { rd.resolvers.RemoveAll(sr => sr is SymbolResolver_AncientCryptosleepCasket || sr is SymbolResolver_ChargeBatteries || sr is SymbolResolver_EdgeMannedMortar || sr is SymbolResolver_FirefoamPopper || sr is SymbolResolver_MannedMortar || sr is SymbolResolver_OutdoorLighting); if (rd.resolvers.Count == 0) { rd.resolvers.Add(new SymbolResolver_AddWortToFermentingBarrels()); } } Log.Message("Removed " + removedDefs + " modern defs"); PawnWeaponGenerator.Reset(); PawnApparelGenerator.Reset(); Debug.Log(DebugString.ToString()); DebugString = new StringBuilder(); }
private static void DoPlayLoad() { GraphicDatabase.Clear(); DeepProfiler.Start("Load all active mods."); try { LoadedModManager.LoadAllActiveMods(); } finally { DeepProfiler.End(); } DeepProfiler.Start("Load language metadata."); try { LanguageDatabase.LoadAllMetadata(); } 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("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 { 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(); PawnWeaponGenerator.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(); 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 { foreach (Type item2 in typeof(Def).AllSubclasses()) { if (item2 != typeof(ThingDef)) { GenGeneric.InvokeStaticMethodOnGenericType(typeof(DefDatabase <>), item2, "ResolveAllReferences", true); } } DefDatabase <ThingDef> .ResolveAllReferences(); } 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 { 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 { StaticConstructorOnStartupUtility.CallAll(); if (Prefs.DevMode) { StaticConstructorOnStartupUtility.ReportProbablyMissingAttributes(); } }); }
static RemoveMedievalStuff() { DebugString.AppendLine("RemoveMedievalStuff - Start Removal Log"); DebugString.AppendLine("Tech Max Level = " + MAX_TECHLEVEL); removedDefs = 0; IEnumerable <ResearchProjectDef> projects = new List <ResearchProjectDef>(); if (ModStuff.Settings.LimitResearch) { projects = DefDatabase <ResearchProjectDef> .AllDefs.Where(rpd => rpd.techLevel > MAX_TECHLEVEL); } if (ModStuff.Settings.LimitItems) { things = new HashSet <ThingDef>(DefDatabase <ThingDef> .AllDefs.Where(td => td.techLevel > MAX_TECHLEVEL || (td.researchPrerequisites?.Any(rpd => projects.Contains(rpd)) ?? false))); } DebugString.AppendLine("RecipeDef Removal List"); foreach (var thing in from thing in things where thing.tradeTags != null select thing) { var tags = thing.tradeTags.ToArray(); foreach (var tag in tags) { if (tag.StartsWith("CE_AutoEnableCrafting")) { thing.tradeTags.Remove(tag); } } } DebugString.AppendLine("ResearchProjectDef Removal List"); RemoveStuffFromDatabase(typeof(DefDatabase <ResearchProjectDef>), projects); DebugString.AppendLine("Scenario Part Removal List"); var getThingInfo = typeof(ScenPart_ThingCount).GetField("thingDef", BindingFlags.NonPublic | BindingFlags.Instance); foreach (var def in DefDatabase <ScenarioDef> .AllDefs) { foreach (var sp in def.scenario.AllParts) { if (!(sp is ScenPart_ThingCount) || !things.Contains((ThingDef)getThingInfo?.GetValue(sp))) { continue; } def.scenario.RemovePart(sp); DebugString.AppendLine("- " + sp.Label + " " + ((ThingDef)getThingInfo?.GetValue(sp))?.label + " from " + def.label); } } foreach (var thingCategoryDef in DefDatabase <ThingCategoryDef> .AllDefs) { thingCategoryDef.childThingDefs.RemoveAll(things.Contains); } DebugString.AppendLine("Stock Generator Part Cleanup"); foreach (var tkd in DefDatabase <TraderKindDef> .AllDefs) { for (var i = tkd.stockGenerators.Count - 1; i >= 0; i--) { var stockGenerator = tkd.stockGenerators[i]; switch (stockGenerator) { case StockGenerator_SingleDef sd when things.Contains(Traverse.Create(sd).Field("thingDef").GetValue <ThingDef>()): var def = Traverse.Create(sd).Field("thingDef").GetValue <ThingDef>(); tkd.stockGenerators.Remove(stockGenerator); DebugString.AppendLine("- " + def.label + " from " + tkd.label + "'s StockGenerator_SingleDef"); break; case StockGenerator_MultiDef md: var thingListTraverse = Traverse.Create(md).Field("thingDefs"); var thingList = thingListTraverse.GetValue <List <ThingDef> >(); var removeList = thingList.FindAll(things.Contains); removeList.ForEach(x => DebugString.AppendLine("- " + x.label + " from " + tkd.label + "'s StockGenerator_MultiDef")); thingList.RemoveAll(things.Contains); if (thingList.NullOrEmpty()) { tkd.stockGenerators.Remove(stockGenerator); } else { thingListTraverse.SetValue(thingList); } break; } } } DebugString.AppendLine("ThingDef Removal List"); RemoveStuffFromDatabase(typeof(DefDatabase <ThingDef>), things.ToArray()); DebugString.AppendLine("ThingSetMaker Reset"); ThingSetMakerUtility.Reset(); DebugString.AppendLine("Designators Resolved Again"); var resolveDesignatorsAgain = typeof(DesignationCategoryDef).GetMethod("ResolveDesignators", BindingFlags.NonPublic | BindingFlags.Instance); foreach (var dcd in DefDatabase <DesignationCategoryDef> .AllDefs) { resolveDesignatorsAgain?.Invoke(dcd, null); } if (ModStuff.Settings.LimitPawns) { DebugString.AppendLine("PawnKindDef Removal List"); RemoveStuffFromDatabase(typeof(DefDatabase <PawnKindDef>), DefDatabase <PawnKindDef> .AllDefs.Where(pkd => (!pkd.defaultFactionType?.isPlayer ?? false) && pkd.race.techLevel > MAX_TECHLEVEL)); } if (ModStuff.Settings.LimitFactions) { DebugString.AppendLine("FactionDef Removal List"); RemoveStuffFromDatabase(typeof(DefDatabase <FactionDef>), DefDatabase <FactionDef> .AllDefs.Where(fd => !fd.isPlayer && fd.techLevel > MAX_TECHLEVEL)); if (ModLister.RoyaltyInstalled) { var incident = DefDatabase <IncidentDef> .GetNamedSilentFail("CaravanArrivalTributeCollector"); if (incident != null) { RemoveStuffFromDatabase(typeof(DefDatabase <IncidentDef>), new List <Def> { incident }); } } // foreach (var factionDef in DefDatabase<FactionDef>.AllDefs.Where(fd => !fd.isPlayer && fd.techLevel > MAX_TECHLEVEL)) // { // factionDef.hidden = true; // factionDef.canMakeRandomly = false; // factionDef.maxCountAtGameStart = 0; // } } if (ModStuff.Settings.LogRemovals) { Log.Message(DebugString.ToString()); } else { Log.Message("Removed " + removedDefs + " industrial defs"); } PawnWeaponGenerator.Reset(); PawnApparelGenerator.Reset(); Debug.Log(DebugString.ToString()); DebugString = new StringBuilder(); }
static RemoveSpacerStuff() { DebugString.AppendLine("RemoveSpacerStuff - Start Removal Log"); DebugString.AppendLine("Tech Max Level = " + MAX_TECHLEVEL); removedDefs = 0; IEnumerable <ResearchProjectDef> projects = new List <ResearchProjectDef>(); if (ModStuff.Settings.LimitResearch) { projects = DefDatabase <ResearchProjectDef> .AllDefs.Where(rpd => rpd.techLevel > MAX_TECHLEVEL); } if (ModStuff.Settings.LimitItems) { things = new HashSet <ThingDef>(DefDatabase <ThingDef> .AllDefs.Where(td => td.techLevel > MAX_TECHLEVEL || (td.researchPrerequisites?.Any(rpd => projects.Contains(rpd)) ?? false))); } DebugString.AppendLine("RecipeDef Removal List"); foreach (var thing in from thing in things where thing.tradeTags != null select thing) { var tags = thing.tradeTags.ToArray(); foreach (var tag in tags) { if (tag.StartsWith("CE_AutoEnableCrafting")) { thing.tradeTags.Remove(tag); } } } //var recipeDefsToRemove = DefDatabase<RecipeDef>.AllDefs.Where(rd => // rd.products.Any(tcc => things.Contains(tcc.thingDef)) || // rd.AllRecipeUsers.All(td => things.Contains(td)) || // projects.Contains(rd.researchPrerequisite)).Cast<Def>().ToList(); //recipeDefsToRemove?.RemoveAll(x => // x.defName == "ExtractMetalFromSlag" || // x.defName == "SmeltWeapon" || // x.defName == "DestroyWeapon" || // x.defName == "OfferingOfPlants_Meagre" || // x.defName == "OfferingOfPlants_Decent" || // x.defName == "OfferingOfPlants_Sizable" || // x.defName == "OfferingOfPlants_Worthy" || // x.defName == "OfferingOfPlants_Impressive" || // x.defName == "OfferingOfMeat_Meagre" || // x.defName == "OfferingOfMeat_Decent" || // x.defName == "OfferingOfMeat_Sizable" || // x.defName == "OfferingOfMeat_Worthy" || // x.defName == "OfferingOfMeat_Impressive" || // x.defName == "OfferingOfMeals_Meagre" || // x.defName == "OfferingOfMeals_Decent" || // x.defName == "OfferingOfMeals_Sizable" || // x.defName == "OfferingOfMeals_Worthy" || // x.defName == "OfferingOfMeals_Impressive" || // x.defName == "ROMV_ExtractBloodVial" || // x.defName == "ROMV_ExtractBloodPack" // ); //RemoveStuffFromDatabase(typeof(DefDatabase<RecipeDef>), recipeDefsToRemove); DebugString.AppendLine("ResearchProjectDef Removal List"); RemoveStuffFromDatabase(typeof(DefDatabase <ResearchProjectDef>), projects); DebugString.AppendLine("Scenario Part Removal List"); var getThingInfo = typeof(ScenPart_ThingCount).GetField("thingDef", BindingFlags.NonPublic | BindingFlags.Instance); foreach (var def in DefDatabase <ScenarioDef> .AllDefs) { foreach (var sp in def.scenario.AllParts) { if (!(sp is ScenPart_ThingCount) || !things.Contains((ThingDef)getThingInfo?.GetValue(sp))) { continue; } def.scenario.RemovePart(sp); DebugString.AppendLine("- " + sp.Label + " " + ((ThingDef)getThingInfo?.GetValue(sp))?.label + " from " + def.label); } } foreach (var thingCategoryDef in DefDatabase <ThingCategoryDef> .AllDefs) { thingCategoryDef.childThingDefs.RemoveAll(things.Contains); } DebugString.AppendLine("Stock Generator Part Cleanup"); foreach (var tkd in DefDatabase <TraderKindDef> .AllDefs) { for (var i = tkd.stockGenerators.Count - 1; i >= 0; i--) { var stockGenerator = tkd.stockGenerators[i]; switch (stockGenerator) { case StockGenerator_SingleDef sd when things.Contains(Traverse.Create(sd).Field("thingDef") .GetValue <ThingDef>()): var def = Traverse.Create(sd).Field("thingDef") .GetValue <ThingDef>(); tkd.stockGenerators.Remove(stockGenerator); DebugString.AppendLine("- " + def.label + " from " + tkd.label + "'s StockGenerator_SingleDef"); break; case StockGenerator_MultiDef md: var thingListTraverse = Traverse.Create(md).Field("thingDefs"); var thingList = thingListTraverse.GetValue <List <ThingDef> >(); var removeList = thingList.FindAll(things.Contains); removeList.ForEach(x => DebugString.AppendLine("- " + x.label + " from " + tkd.label + "'s StockGenerator_MultiDef")); thingList.RemoveAll(things.Contains); if (thingList.NullOrEmpty()) { tkd.stockGenerators.Remove(stockGenerator); } else { thingListTraverse.SetValue(thingList); } break; } } } //DebugString.AppendLine("IncidentDef Removal List"); //var removedDefNames = new List<string> //{ // "Disease_FibrousMechanites", // "Disease_SensoryMechanites", // "ResourcePodCrash", // "PsychicSoothe", // "RefugeePodCrash", // "RansomDemand", // "MeteoriteImpact", // "PsychicDrone", // "ShortCircuit", // "ShipChunkDrop", // "OrbitalTraderArrival", // "StrangerInBlackJoin", // "DefoliatorShipPartCrash", // "PsychicEmanatorShipPartCrash", // "MechCluster", // "AnimalInsanityMass" //}; //IEnumerable<IncidentDef> incidents = from IncidentDef incident in DefDatabase<IncidentDef>.AllDefs // where removedDefNames.Contains(incident.defName) // select incident; //foreach (IncidentDef incident in incidents) //{ // incident.targetTags?.Clear(); // incident.baseChance = 0f; // incident.allowedBiomes?.Clear(); // incident.earliestDay = int.MaxValue; //} //RemoveStuffFromDatabase(typeof(DefDatabase<IncidentDef>), incidents.Cast<Def>()); //DebugString.AppendLine("Replaced Ancient Asphalt Road / Ancient Asphalt Highway with Stone Road"); //RoadDef[] targetRoads = { RoadDefOf.AncientAsphaltRoad, RoadDefOf.AncientAsphaltHighway }; //RoadDef originalRoad = DefDatabase<RoadDef>.GetNamed("StoneRoad"); //List<string> fieldNames = AccessTools.GetFieldNames(typeof(RoadDef)); //fieldNames.Remove("defName"); //foreach (FieldInfo fi in fieldNames.Select(name => AccessTools.Field(typeof(RoadDef), name))) //{ // object fieldValue = fi.GetValue(originalRoad); // foreach (RoadDef targetRoad in targetRoads) fi.SetValue(targetRoad, fieldValue); //} //DebugString.AppendLine("Special Hediff Removal List"); //RemoveStuffFromDatabase(typeof(DefDatabase<HediffDef>), (hediffs = new[] { HediffDefOf.Gunshot }).Cast<Def>()); //DebugString.AppendLine("RaidStrategyDef Removal List"); //RemoveStuffFromDatabase(typeof(DefDatabase<RaidStrategyDef>), // DefDatabase<RaidStrategyDef>.AllDefs // .Where(rs => typeof(ScenPart_ThingCount).IsAssignableFrom(rs.workerClass)).Cast<Def>()); //// ItemCollectionGeneratorUtility.allGeneratableItems.RemoveAll(match: things.Contains); //// //// foreach (Type type in typeof(ItemCollectionGenerator_Standard).AllSubclassesNonAbstract()) //// type.GetMethod(name: "Reset")?.Invoke(obj: null, parameters: null); DebugString.AppendLine("ThingDef Removal List"); RemoveStuffFromDatabase(typeof(DefDatabase <ThingDef>), things.ToArray()); DebugString.AppendLine("ThingSetMaker Reset"); ThingSetMakerUtility.Reset(); //DebugString.AppendLine("TraitDef Removal List"); //RemoveStuffFromDatabase(typeof(DefDatabase<TraitDef>), // // { nameof(TraitDefOf.Prosthophobe), "Prosthophile" } ? // DefDatabase<TraitDef>.AllDefs // .Where(td => new[] { nameof(TraitDefOf.BodyPurist), "Transhumanist" }.Contains(td.defName)) // .Cast<Def>()); DebugString.AppendLine("Designators Resolved Again"); var resolveDesignatorsAgain = typeof(DesignationCategoryDef).GetMethod("ResolveDesignators", BindingFlags.NonPublic | BindingFlags.Instance); foreach (var dcd in DefDatabase <DesignationCategoryDef> .AllDefs) { resolveDesignatorsAgain?.Invoke(dcd, null); } if (ModStuff.Settings.LimitPawns) { DebugString.AppendLine("PawnKindDef Removal List"); RemoveStuffFromDatabase(typeof(DefDatabase <PawnKindDef>), DefDatabase <PawnKindDef> .AllDefs .Where(pkd => (!pkd.defaultFactionType?.isPlayer ?? false) && (pkd.race.techLevel > MAX_TECHLEVEL || pkd.defaultFactionType?.techLevel > MAX_TECHLEVEL))); } if (ModStuff.Settings.LimitFactions) { DebugString.AppendLine("FactionDef Removal List"); RemoveStuffFromDatabase(typeof(DefDatabase <FactionDef>), DefDatabase <FactionDef> .AllDefs.Where(fd => !fd.isPlayer && fd.techLevel > MAX_TECHLEVEL)); if (ModLister.RoyaltyInstalled) { var incident = DefDatabase <IncidentDef> .GetNamedSilentFail("CaravanArrivalTributeCollector"); if (incident != null) { RemoveStuffFromDatabase(typeof(DefDatabase <IncidentDef>), new List <Def> { incident }); } } } if (ModStuff.Settings.LogRemovals) { Log.Message(DebugString.ToString()); } else { Log.Message("Removed " + removedDefs + " spacer defs"); } PawnWeaponGenerator.Reset(); PawnApparelGenerator.Reset(); Debug.Log(DebugString.ToString()); DebugString = new StringBuilder(); }
private void GetTradeables(bool save = true) { if (save && cachedTradeables.Count > 0) { Store_ItemEditor.UpdateStoreItems(cachedTradeables, tradeablesPrices); } lastSearch = searchQuery; cachedTradeables = new List <ThingDef>(); string searchShort = string.Join("", searchQuery.Split(' ')).ToLower(); IEnumerable <ThingDef> tradeableitems = from t in DefDatabase <ThingDef> .AllDefs where (t.tradeability.TraderCanSell() || ThingSetMakerUtility.CanGenerate(t)) && (t.building == null || t.Minifiable || ToolkitSettings.MinifiableBuildings) && (t.FirstThingCategory != null || t.race != null) && (t.BaseMarketValue > 0) && (searchQuery == "" || ( t.defName.ToLower().Contains(searchShort) || string.Join("", t.label.Split(' ')).ToLower().Contains(searchShort) || t.defName.ToLower() == searchShort || string.Join("", t.label.Split(' ')).ToLower() == searchShort || ( (t.race != null && t.race.Animal && (t.race.ToString().ToLower().Contains(searchQuery) || t.race.ToString().ToLower() == searchQuery || "animal".Contains(searchQuery) || searchQuery == "animal") ) || (t.race == null && (t.FirstThingCategory == null || string.Join("", t.FirstThingCategory.LabelCap.Split(' ')).ToLower().Contains(searchShort) || t.FirstThingCategory.LabelCap.ToLower() == searchShort) ) ) ) ) orderby t.LabelCap select t; foreach (ThingDef item in tradeableitems) { if (item.BaseMarketValue > 0f) { cachedTradeables.Add(item); } } GetTradeablesPrices(); }