public static void HideHats(ref bool hideHair, ref bool hideBeard, ref bool showHat, Rot4 bodyFacing)
        {
            try
            {
                //Log.Error($"Start {pawn.Name.ToStringShort} hideHair:{hideHair}  hideBeard:{hideBeard}  showHat:{showHat}");
                // Determine if hat should be shown
                if (flags.FlagSet(PawnRenderFlags.Portrait) && Prefs.HatsOnlyOnMap)
                {
                    showHat   = false;
                    hideHair  = false;
                    hideBeard = false;
                    //Log.Error($"0 {pawn.Name.ToStringShort} hideHair:{hideHair}  hideBeard:{hideBeard}  showHat:{showHat}");
                    return;
                }

                if (showHat == false ||
                    Settings.OnlyApplyToColonists && FactionUtility.IsPlayerSafe(pawn.Faction) == false && !Settings.OptionsOpen)
                {
                    //Log.Error($"1 {pawn.Name.ToStringShort} hideHair:{hideHair}  hideBeard:{hideBeard}  showHat:{showHat}");
                    return;
                }

                if (hideHair == false && showHat == false)
                {
                    CheckHideHat(ref hideHair, ref hideBeard, ref showHat, false);
                    //Log.Error($"2 {pawn.Name.ToStringShort} hideHair:{hideHair}  hideBeard:{hideBeard}  showHat:{showHat}");
                    return;
                }

                hideHair  = false;
                hideBeard = false;

                if (Settings.HideAllHats)
                {
                    showHat = false;
                    //Log.Error($"3 {pawn.Name.ToStringShort} hideHair:{hideHair}  hideBeard:{hideBeard}  showHat:{showHat}");
                    return;
                }

                if (Settings.ShowHatsOnlyWhenDrafted)
                {
                    showHat = isDrafted;
                    //Log.Error($"4.a {pawn.Name.ToStringShort} hideHair:{hideHair}  hideBeard:{hideBeard}  showHat:{showHat}");
                }
                else if (showHat &&
                         (Settings.Indoors == Indoors.HideHats ||
                          (Settings.Indoors == Indoors.ShowHatsWhenDrafted && !isDrafted)))
                {
                    CompCeilingDetect comp = pawn.GetComp <CompCeilingDetect>();
                    if (comp != null && comp.IsIndoors)
                    {
                        showHat   = false;
                        hideHair  = false;
                        hideBeard = false;
                        return;
                        //Log.Error($"4.b {pawn.Name.ToStringShort} hideHair:{hideHair}  hideBeard:{hideBeard}  showHat:{showHat}");
                    }
                }

                if (pawn.story?.hairDef != null && Settings.HairToHide.TryGetValue(pawn.story.hairDef, out bool hide) && hide)
                {
                    hideHair  = true;
                    hideBeard = true;
                    showHat   = true;
                    //Log.Error($"5 {pawn.Name.ToStringShort} hideHair:{hideHair}  hideBeard:{hideBeard}  showHat:{showHat}");
                    return;
                }

                CheckHideHat(ref hideHair, ref hideBeard, ref showHat, false);
            }
            finally
            {
                if (!hideBeard)
                {
                    hideBeard = bodyFacing == Rot4.North;
                }
                skipDontShaveHead = !showHat;
            }
            //Log.Error($"Final {pawn.Name.ToStringShort} hideHair:{hideHair}  hideBeard:{hideBeard}  showHat:{showHat}");
        }