public static void Postfix(Pawn pawn) { // Change the colour of appropriate apparel items to match the pawn's faction's colour if (pawn.apparel != null && pawn.Faction != null && pawn.kindDef.apparelColor == Color.white) { var pawnKindDefExtension = PawnKindDefExtension.Get(pawn.kindDef); var wornApparel = pawn.apparel.WornApparel; for (int i = 0; i < wornApparel.Count; i++) { var apparel = wornApparel[i]; // Check from ThingDefExtension var thingDefExtension = ThingDefExtension.Get(apparel.def); if (!thingDefExtension.useFactionColourForPawnKinds.NullOrEmpty() && thingDefExtension.useFactionColourForPawnKinds.Contains(pawn.kindDef)) { apparel.SetColor(pawn.Faction.Color); continue; } // Check from PawnKindDefExtension var apparelProps = apparel.def.apparel; var partGroupAndLayerPairs = pawnKindDefExtension.FactionColourApparelWithPartAndLayersList; for (int j = 0; j < partGroupAndLayerPairs.Count; j++) { var partGroupAndLayerPair = partGroupAndLayerPairs[j]; if (apparelProps.bodyPartGroups.Contains(partGroupAndLayerPair.First) && apparelProps.layers.Contains(partGroupAndLayerPair.Second)) { apparel.SetColor(pawn.Faction.Color); break; } } } } }
public static void Postfix(Pawn p, ref TraderCaravanRole __result) { if (PawnKindDefExtension.Get(p.kindDef).countAsSlave) { __result = TraderCaravanRole.Chattel; } }
public static void TryGenerateShieldFor(Pawn pawn) { workingShields.Clear(); var kindDefExtension = PawnKindDefExtension.Get(pawn.kindDef); // No shieldTags if (kindDefExtension.shieldTags.NullOrEmpty()) { return; } // Not a tool user if (!pawn.RaceProps.ToolUser) { return; } // Primary unusable with shields if (pawn.equipment.Primary is ThingWithComps primary && !primary.def.UsableWithShields()) { return; } // Has multiple weapons if (pawn.equipment.AllEquipmentListForReading.Count(t => t.def.equipmentType == EquipmentType.Primary) > 1) { return; } // Not enough manipulation if (!pawn.health.capacities.CapableOf(PawnCapacityDefOf.Manipulation) || !pawn.CanUseShields()) { return; } // Pacifist if (pawn.story != null && pawn.WorkTagIsDisabled(WorkTags.Violent)) { return; } float randomInRange = kindDefExtension.shieldMoney.RandomInRange; for (int i = 0; i < allShieldPairs.Count; i++) { ThingStuffPair w = allShieldPairs[i]; if (w.Price <= randomInRange) { var shieldProps = w.thing.GetCompProperties <CompProperties_Shield>(); if (kindDefExtension.shieldTags == null || kindDefExtension.shieldTags.Any((string tag) => shieldProps.shieldTags.Contains(tag))) { if (w.thing.generateAllowChance >= 1f || Rand.ChanceSeeded(w.thing.generateAllowChance, pawn.thingIDNumber ^ (int)w.thing.shortHash ^ 28554824)) { workingShields.Add(w); } } } } if (workingShields.Count == 0) { return; } //pawn.equipment.DestroyAllEquipment(DestroyMode.Vanish); ThingStuffPair thingStuffPair; if (workingShields.TryRandomElementByWeight((ThingStuffPair w) => w.Commonality * w.Price, out thingStuffPair)) { var shield = (Apparel)ThingMaker.MakeThing(thingStuffPair.thing, thingStuffPair.stuff); PawnGenerator.PostProcessGeneratedGear(shield, pawn); // Colour the shield if (pawn.Faction != null) { var thingDefExtension = ThingDefExtension.Get(thingStuffPair.thing); if (!thingDefExtension.useFactionColourForPawnKinds.NullOrEmpty() && thingDefExtension.useFactionColourForPawnKinds.Contains(pawn.kindDef)) { shield.SetColor(pawn.Faction.Color); } } pawn.AddShield(shield); } workingShields.Clear(); }