static void ChooseCompanionColor(CharacterSettings characterSettings, UnitEntityData unitEntityData)
 {
     if (GUILayout.Button("Create Doll", GUILayout.Width(DefaultLabelWidth)))
     {
         var race      = unitEntityData.Descriptor.Progression.Race;
         var options   = unitEntityData.Descriptor.Gender == Gender.Male ? race.MaleOptions : race.FemaleOptions;
         var dollState = new DollState();
         dollState.SetRace(unitEntityData.Descriptor.Progression.Race); //Race must be set before class
                                                                        //This is a hack to work around harmony not allowing calls to the unpatched method
         CharacterManager.disableEquipmentClassPatch = true;
         dollState.SetClass(unitEntityData.Descriptor.Progression.GetEquipmentClass());
         CharacterManager.disableEquipmentClassPatch = false;
         dollState.SetGender(unitEntityData.Descriptor.Gender);
         dollState.SetRacePreset(race.Presets[0]);
         unitEntityData.Descriptor.LeftHandedOverride = false;
         if (options.Hair.Length > 0)
         {
             dollState.SetHair(options.Hair[0]);
         }
         if (options.Heads.Length > 0)
         {
             dollState.SetHead(options.Hair[0]);
         }
         if (options.Beards.Length > 0)
         {
             dollState.SetBeard(options.Hair[0]);
         }
         dollState.Validate();
         unitEntityData.Descriptor.Doll = dollState.CreateData();
         unitEntityData.Descriptor.ForcceUseClassEquipment = true;
         CharacterManager.RebuildCharacter(unitEntityData);
     }
     GUILayout.Label("Note: Colors only applies to non-default outfits, the default companion custom voice is None");
     {
         GUILayout.BeginHorizontal();
         GUILayout.Label("Primary Outfit Color ", GUILayout.Width(DefaultLabelWidth));
         var newIndex = (int)Math.Round(GUILayout.HorizontalSlider(characterSettings.companionPrimary, -1, 35, GUILayout.Width(DefaultSliderWidth)), 0);
         GUILayout.Label(" " + newIndex, GUILayout.ExpandWidth(false));
         GUILayout.EndHorizontal();
         if (newIndex != characterSettings.companionPrimary)
         {
             characterSettings.companionPrimary = newIndex;
             CharacterManager.UpdateModel(unitEntityData.View);
         }
     }
     {
         GUILayout.BeginHorizontal();
         GUILayout.Label("Secondary Outfit Color ", GUILayout.Width(DefaultLabelWidth));
         var newIndex = (int)Math.Round(GUILayout.HorizontalSlider(characterSettings.companionSecondary, -1, 35, GUILayout.Width(DefaultSliderWidth)), 0);
         GUILayout.Label(" " + newIndex, GUILayout.ExpandWidth(false));
         GUILayout.EndHorizontal();
         if (newIndex != characterSettings.companionSecondary)
         {
             characterSettings.companionSecondary = newIndex;
             CharacterManager.UpdateModel(unitEntityData.View);
         }
     }
     ChoosePortrait(unitEntityData);
     ChooseAsks(unitEntityData);
 }
        static void ChooseEquipment(UnitEntityData unitEntityData, CharacterSettings characterSettings)
        {
            void onHideEquipment()
            {
                CharacterManager.RebuildCharacter(unitEntityData);
                CharacterManager.UpdateModel(unitEntityData.View);
            }

            void onHideBuff()
            {
                foreach (var buff in unitEntityData.Buffs)
                {
                    buff.ClearParticleEffect();
                }
                unitEntityData.SpawnBuffsFxs();
            }

            void onWeaponChanged()
            {
                /// if(unitEntityData.View.HandsEquipment.GetWeaponModel(false). != characterSettings.overrideWeapons)
                unitEntityData.View.HandsEquipment.UpdateAll();
            }

            ChooseToggle("Hide Cap", ref characterSettings.hideCap, onHideEquipment);
            ChooseToggle("Hide Helmet", ref characterSettings.hideHelmet, onHideEquipment);
            ChooseToggle("Hide Glasses", ref characterSettings.hideGlasses, onHideEquipment);
            ChooseToggle("Hide Shirt", ref characterSettings.hideShirt, onHideEquipment);
            ChooseToggle("Hide Class Backpack", ref characterSettings.hideClassCloak, onHideEquipment);
            ///ChooseToggle("Hide Item Cloak", ref characterSettings.hideItemCloak, onHideEquipment);
            ChooseToggle("Hide Armor", ref characterSettings.hideArmor, onHideEquipment);
            ChooseToggle("Hide Bracers", ref characterSettings.hideBracers, onHideEquipment);
            ChooseToggle("Hide Gloves", ref characterSettings.hideGloves, onHideEquipment);
            ChooseToggle("Hide Boots", ref characterSettings.hideBoots, onHideEquipment);
            ChooseToggle("Hide Inactive Weapons", ref characterSettings.hideWeapons, onWeaponChanged);
            ChooseToggle("Hide Belt Slots", ref characterSettings.hideBeltSlots, onWeaponChanged);
            ChooseToggle("Hide Quiver", ref characterSettings.hideQuiver, onWeaponChanged);
            ChooseToggle("Hide Weapon Enchantments", ref characterSettings.hideWeaponEnchantments, onWeaponChanged);
            ChooseToggle("Hide Wings", ref characterSettings.hideWings, onHideBuff);
            ChooseToggle("Hide Horns", ref characterSettings.hideHorns, onHideEquipment);
            ChooseToggle("Hide Tail", ref characterSettings.hideTail, onHideEquipment);
        }
        static void ChooseEquipment(UnitEntityData unitEntityData, CharacterSettings characterSettings)
        {
            void onHideEquipment()
            {
                CharacterManager.RebuildCharacter(unitEntityData);
                CharacterManager.UpdateModel(unitEntityData.View);
            }

            void onHideBuff()
            {
                foreach (var buff in unitEntityData.Buffs)
                {
                    buff.ClearParticleEffect();
                }
                unitEntityData.SpawnBuffsFxs();
            }

            void onWeaponChanged()
            {
                unitEntityData.View.HandsEquipment.UpdateAll();
            }

            ChooseToggle("Hide Cap", ref characterSettings.hideCap, onHideEquipment);
            ChooseToggle("Hide Backpack", ref characterSettings.hideBackpack, onHideEquipment);
            ChooseToggle("Hide Class Cloak", ref characterSettings.hideClassCloak, onHideEquipment);
            ChooseToggle("Hide Helmet", ref characterSettings.hideHelmet, onHideEquipment);
            ChooseToggle("Hide Item Cloak", ref characterSettings.hideItemCloak, onHideEquipment);
            ChooseToggle("Hide Armor", ref characterSettings.hideArmor, onHideEquipment);
            ChooseToggle("Hide Bracers", ref characterSettings.hideBracers, onHideEquipment);
            ChooseToggle("Hide Gloves", ref characterSettings.hideGloves, onHideEquipment);
            ChooseToggle("Hide Boots", ref characterSettings.hideBoots, onHideEquipment);
            ChooseToggle("Hide Inactive Weapons", ref characterSettings.hideWeapons, onWeaponChanged);
            ChooseToggle("Hide Belt Slots", ref characterSettings.hideBeltSlots, onWeaponChanged);
            ChooseToggle("Hide Weapon Enchantments", ref characterSettings.hideWeaponEnchantments, onWeaponChanged);
            ChooseToggle("Hide Wings", ref characterSettings.hideWings, onHideBuff);
            if (BlueprintRoot.Instance.DlcSettings.Tieflings.Enabled)
            {
                ChooseToggle("Hide Horns", ref characterSettings.hideHorns, onHideEquipment);
                ChooseToggle("Hide Tail", ref characterSettings.hideTail, onHideEquipment);
            }
        }
        public static void ShowInfo(UnitEntityData unitEntityData)
        {
            ;
            GUILayout.BeginHorizontal();
            if (GUILayout.Button("Rebuild Character", GUILayout.Width(175f)))
            {
                CharacterManager.RebuildCharacter(unitEntityData);
            }
            if (GUILayout.Button("Rebuild Outfit", GUILayout.Width(175f)))
            {
                var bakedCharacter = unitEntityData.View.CharacterAvatar.BakedCharacter;
                unitEntityData.View.CharacterAvatar.BakedCharacter = null;
                unitEntityData.View.CharacterAvatar.RebuildOutfit();
                unitEntityData.View.CharacterAvatar.BakedCharacter = bakedCharacter;
            }
            if (GUILayout.Button("Update Class Equipment", GUILayout.Width(175f)))
            {
                var bakedCharacter = unitEntityData.View.CharacterAvatar.BakedCharacter;
                unitEntityData.View.CharacterAvatar.BakedCharacter = null;
                bool useClassEquipment = unitEntityData.Descriptor.ForcceUseClassEquipment;
                unitEntityData.Descriptor.ForcceUseClassEquipment = true;
                unitEntityData.View.UpdateClassEquipment();
                unitEntityData.Descriptor.ForcceUseClassEquipment  = useClassEquipment;
                unitEntityData.View.CharacterAvatar.BakedCharacter = bakedCharacter;
            }
            if (GUILayout.Button("Update Body Equipment", GUILayout.Width(175f)))
            {
                var bakedCharacter = unitEntityData.View.CharacterAvatar.BakedCharacter;
                unitEntityData.View.CharacterAvatar.BakedCharacter = null;
                unitEntityData.View.UpdateBodyEquipmentModel();
                unitEntityData.View.CharacterAvatar.BakedCharacter = bakedCharacter;
            }
            if (GUILayout.Button("Update Model", GUILayout.Width(175f)))
            {
                CharacterManager.UpdateModel(unitEntityData.View);
            }
            if (GUILayout.Button("Update HandsEquipment", GUILayout.Width(175f)))
            {
                unitEntityData.View.HandsEquipment.UpdateAll();
            }
            GUILayout.EndHorizontal();
            GUILayout.BeginHorizontal();
            if (GUILayout.Button("Toggle Stance", GUILayout.Width(175f)))
            {
                unitEntityData.View.HandsEquipment.ForceSwitch(!unitEntityData.View.HandsEquipment.InCombat);
            }
            GUILayout.EndHorizontal();
            GUILayout.BeginHorizontal();
            GUILayout.Label($"Original size {unitEntityData.Descriptor.OriginalSize}", GUILayout.Width(200f));
            GUILayout.Label($"Current size {unitEntityData.Descriptor.State.Size}", GUILayout.Width(200f));
            var m_OriginalScale = Traverse.Create(unitEntityData.View).Field("m_OriginalScale").GetValue <Vector3>();
            var m_Scale         = Traverse.Create(unitEntityData.View).Field("m_Scale").GetValue <float>();
            var realScale       = unitEntityData.View.transform.localScale;

            GUILayout.Label($"View Original {m_OriginalScale.x:0.#}", GUILayout.Width(200f));
            GUILayout.Label($"View Current {m_Scale:0.#}", GUILayout.Width(200f));
            GUILayout.Label($"View Real {realScale.x:0.#}", GUILayout.Width(200f));
            GUILayout.Label($"Disabled Scaling {unitEntityData.View.DisableSizeScaling}", GUILayout.Width(200f));
            GUILayout.EndHorizontal();
            var message =
                unitEntityData.View == null ? "No View" :
                unitEntityData.View.CharacterAvatar == null ? "No Character Avatar" :
                null;

            if (message != null)
            {
                GUILayout.Label(message, GUILayout.Width(200f));
            }
            GUILayout.BeginHorizontal();
            showCharacter = GUILayout.Toggle(showCharacter, "Show Character", GUILayout.Width(175f));
            showWeapons   = GUILayout.Toggle(showWeapons, "Show Weapons", GUILayout.Width(175f));
            showDoll      = GUILayout.Toggle(showDoll, "Show Doll", GUILayout.Width(175f));
            showBuffs     = GUILayout.Toggle(showBuffs, "Show Buffs", GUILayout.Width(175f));
            showFx        = GUILayout.Toggle(showFx, "Show FX", GUILayout.Width(175f));
            showPortrait  = GUILayout.Toggle(showPortrait, "Show Portrait", GUILayout.Width(175f));
            showAsks      = GUILayout.Toggle(showAsks, "Show Asks", GUILayout.Width(175f));

            GUILayout.EndHorizontal();
            if (showCharacter)
            {
                ShowCharacterInfo(unitEntityData);
            }
            if (showWeapons)
            {
                ShowWeaponInfo(unitEntityData);
            }
            if (showDoll)
            {
                ShowDollInfo(unitEntityData);
            }
            if (showBuffs)
            {
                ShowBuffInfo(unitEntityData);
            }
            if (showFx)
            {
                ShowFxInfo(unitEntityData);
            }
            if (showPortrait)
            {
                ShowPortraitInfo(unitEntityData);
            }
            if (showAsks)
            {
                ShowAsksInfo(unitEntityData);
            }
        }
        static void ChooseEquipmentOverride(UnitEntityData unitEntityData, CharacterSettings characterSettings)
        {
            void onEquipment()
            {
                CharacterManager.RebuildCharacter(unitEntityData);
                CharacterManager.UpdateModel(unitEntityData.View);
            }

            GUILayout.Label("Equipment", "box", GUILayout.Width(DefaultLabelWidth));
            void onView() => ViewManager.ReplaceView(unitEntityData, characterSettings.overrideView);

            Util.ChooseSlider("Override Helm", EquipmentResourcesManager.Helm, ref characterSettings.overrideHelm, onEquipment);
            Util.ChooseSlider("Override Shirt", EquipmentResourcesManager.Shirt, ref characterSettings.overrideShirt, onEquipment);
            Util.ChooseSlider("Override Glasses", EquipmentResourcesManager.Glasses, ref characterSettings.overrideGlasses, onEquipment);
            Util.ChooseSlider("Override Armor", EquipmentResourcesManager.Armor, ref characterSettings.overrideArmor, onEquipment);
            Util.ChooseSlider("Override Bracers", EquipmentResourcesManager.Bracers, ref characterSettings.overrideBracers, onEquipment);
            Util.ChooseSlider("Override Gloves", EquipmentResourcesManager.Gloves, ref characterSettings.overrideGloves, onEquipment);
            Util.ChooseSlider("Override Boots", EquipmentResourcesManager.Boots, ref characterSettings.overrideBoots, onEquipment);
            Util.ChooseSlider("Override Tattoos", EquipmentResourcesManager.Tattoos, ref characterSettings.overrideTattoo, onEquipment);
            GUILayout.Label("Weapons", "box", GUILayout.Width(DefaultLabelWidth));
            foreach (var kv in EquipmentResourcesManager.Weapons)
            {
                var animationStyle = kv.Key;
                var weaponLookup   = kv.Value;
                characterSettings.overrideWeapons.TryGetValue(animationStyle, out BlueprintRef currentValue);
                void onWeapon()
                {
                    characterSettings.overrideWeapons[animationStyle] = currentValue;
                    unitEntityData.View.HandsEquipment.UpdateAll();
                }

                Util.ChooseSlider($"Override {animationStyle} ", weaponLookup, ref currentValue, onWeapon);
            }
            GUILayout.BeginHorizontal();
            GUILayout.Label("Main Weapon Enchantments", "box", GUILayout.Width(DefaultLabelWidth));
            if (GUILayout.Button("Add Enchantment", GUILayout.ExpandWidth(false)))
            {
                characterSettings.overrideMainWeaponEnchantments.Add(null);
            }
            GUILayout.EndHorizontal();
            void onWeaponEnchantment()
            {
                unitEntityData.View.HandsEquipment.UpdateAll();
            }

            for (int i = 0; i < characterSettings.overrideMainWeaponEnchantments.Count; i++)
            {
                Util.ChooseSliderList($"Override Main Hand", EquipmentResourcesManager.WeaponEnchantments,
                                      characterSettings.overrideMainWeaponEnchantments, i, onWeaponEnchantment);
            }
            GUILayout.BeginHorizontal();
            GUILayout.Label("Offhand Weapon Enchantments", "box", GUILayout.Width(DefaultLabelWidth));
            if (GUILayout.Button("Add Enchantment", GUILayout.ExpandWidth(false)))
            {
                characterSettings.overrideOffhandWeaponEnchantments.Add("");
            }
            GUILayout.EndHorizontal();
            for (int i = 0; i < characterSettings.overrideOffhandWeaponEnchantments.Count; i++)
            {
                Util.ChooseSliderList($"Override Off Hand", EquipmentResourcesManager.WeaponEnchantments,
                                      characterSettings.overrideOffhandWeaponEnchantments, i, onWeaponEnchantment);
            }
            GUILayout.Label("View", "box", GUILayout.Width(DefaultLabelWidth));
            Util.ChooseSlider("Override View", EquipmentResourcesManager.Units, ref characterSettings.overrideView, onView);
            void onChooseScale()
            {
                HarmonyLib.Traverse.Create(unitEntityData.View).Field("m_Scale").SetValue(unitEntityData.View.GetSizeScale() + 0.01f);
            }

            GUILayout.Label("Scale", "box", GUILayout.Width(DefaultLabelWidth));
            GUILayout.BeginHorizontal();
            ChooseToggle("Enable Override Scale", ref characterSettings.overrideScale, onChooseScale);
            ChooseToggle("Restrict to polymorph", ref characterSettings.overrideScaleShapeshiftOnly, onChooseScale);
            ChooseToggle("Use Additive Factor", ref characterSettings.overrideScaleAdditive, onChooseScale);
            ChooseToggle("Use Cheat Mode", ref characterSettings.overrideScaleCheatMode, onChooseScale);
            ChooseToggle("Use Continuous Factor", ref characterSettings.overrideScaleFloatMode, onChooseScale);
            GUILayout.Space(10f);
            GUILayout.EndHorizontal();
            if (characterSettings.overrideScale && characterSettings.overrideScaleAdditive)
            {
                ChooseSizeAdditive(unitEntityData, characterSettings);
            }
            if (characterSettings.overrideScale && !characterSettings.overrideScaleAdditive)
            {
                ChooseSizeOverride(unitEntityData, characterSettings);
            }
        }