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();
        }