예제 #1
0
        internal void CatBatchRemove(RegisterSubCategoriesEvent ev, MakerCategory category)
        {
            ev.AddControl(new MakerText("Batch remove accessory slots", category, this));

            MakerTextbox StartTextbox = ev.AddControl(new MakerTextbox(category, "Start", "", this));
            MakerTextbox EndTextbox   = ev.AddControl(new MakerTextbox(category, "End", "", this));

            MakerRadioButtons tglMode = ev.AddControl(new MakerRadioButtons(category, this, "Mode", "All", "Hair", "Item"));

            MakerButton btnRmApply = ev.AddControl(new MakerButton("Go", category, this));

            btnRmApply.OnClick.AddListener(delegate
            {
                if (!int.TryParse(StartTextbox.Value, out int start))
                {
                    StartTextbox.Value = "";
                    start = 0;
                }
                if (!int.TryParse(EndTextbox.Value, out int end))
                {
                    EndTextbox.Value = "";
                    end = 0;
                }
                ActBatchRemove(start - 1, end - 1, tglMode.Value);
            });
예제 #2
0
        /// <summary>
        /// Create a new custom control. Create and register it in <see cref="MakerAPI.RegisterCustomSubCategories"/>.
        /// </summary>
        /// <param name="text">Text displayed on the button</param>
        /// <param name="category">Category the control will be created under</param>
        /// <param name="owner">Plugin that owns the control</param>
        public MakerButton(string text, MakerCategory category, BaseUnityPlugin owner) : base(category, owner)
        {
            Text    = text;
            OnClick = new Button.ButtonClickedEvent();

            TextColor = new Color(0.090f, 0.118f, 0.141f);
        }
예제 #3
0
        private void SetupBodyInterface(RegisterSubCategoriesEvent e, KoiSkinOverlayMgr owner)
        {
            var makerCategory = new MakerCategory(MakerConstants.Body.CategoryName, "overlayMod", 11111, "Skin Overlays");

            e.AddSubCategory(makerCategory);

            e.AddControl(new MakerButton("Get face overlay template", makerCategory, owner))
            .OnClick.AddListener(() => WriteAndOpenPng(ResourceUtils.GetEmbeddedResource("face.png"), "Face template"));
            e.AddControl(new MakerButton("Get body overlay template", makerCategory, owner))
            .OnClick.AddListener(() => WriteAndOpenPng(ResourceUtils.GetEmbeddedResource("body.png"), "Body template"));

            AddConfigSettings(e, owner, makerCategory);

            e.AddControl(new MakerSeparator(makerCategory, owner));

            SetupTexControls(e, makerCategory, owner, TexType.FaceOver, "Face overlay texture (On top of almost everything)");

            e.AddControl(new MakerSeparator(makerCategory, owner));

            SetupTexControls(e, makerCategory, owner, TexType.BodyOver, "Body overlay texture (On top of almost everything)");

            e.AddControl(new MakerSeparator(makerCategory, owner));

            SetupTexControls(e, makerCategory, owner, TexType.FaceUnder, "Face underlay texture (Under tattoos, blushes, etc.)");

            e.AddControl(new MakerSeparator(makerCategory, owner));

            SetupTexControls(e, makerCategory, owner, TexType.BodyUnder, "Body underlay texture (Under tattoos, blushes, etc.)");
        }
예제 #4
0
        private static void RegisterMakerControls(Stiletto plugin, RegisterSubCategoriesEvent e)
        {
            // Doesn't apply to male characters
            if (MakerAPI.GetMakerSex() == 0)
            {
                return;
            }

            var shoesCategory = MakerConstants.Clothes.OuterShoes;
            var category      = new MakerCategory(shoesCategory.CategoryName, "stiletto", shoesCategory.Position + 1, "Stiletto");

            e.AddSubCategory(category);

            slider_AngleAnkle = e.AddControl(new MakerSlider(category, "AngleAnkle", 0f, 60f, 0f, plugin)
            {
                StringToValue = CreateStringToValueFunc(10f), ValueToString = CreateValueToStringFunc(10f),
            });
            slider_AngleLeg = e.AddControl(new MakerSlider(category, "AngleLeg", 0f, 60f, 0f, plugin)
            {
                StringToValue = CreateStringToValueFunc(10f), ValueToString = CreateValueToStringFunc(10f)
            });
            slider_Height = e.AddControl(new MakerSlider(category, "Height", 0f, 0.5f, 0f, plugin)
            {
                StringToValue = CreateStringToValueFunc(1000f), ValueToString = CreateValueToStringFunc(1000f)
            });

            slider_AngleAnkle.ValueChanged.Subscribe(x => MakerAPI.GetCharacterControl().GetComponent <HeelInfo>().SafeProc(y => y.AnkleAnglef = x));
            slider_AngleLeg.ValueChanged.Subscribe(x => MakerAPI.GetCharacterControl().GetComponent <HeelInfo>().SafeProc(y => y.LegAnglef     = x));
            slider_Height.ValueChanged.Subscribe(x => MakerAPI.GetCharacterControl().GetComponent <HeelInfo>().SafeProc(y => y.Heightf         = x));
        }
        private void SetupEyeInterface(RegisterSubCategoriesEvent e, KoiSkinOverlayMgr owner)
        {
#if KK || EC
            var irisCategory     = MakerConstants.Face.Iris;
            var eyeCategory      = new MakerCategory(irisCategory.CategoryName, "tglEyeOverlayKSOX", irisCategory.Position + 5, "Iris Overlays");
            var irisTemplateName = "Get iris overlay template";
#else
            var eyeCategory      = new MakerCategory(MakerConstants.Face.CategoryName, "overlayModIris", 11111, "Iris Overlays");
            var irisTemplateName = "Get iris underlay template";
#endif
            e.AddSubCategory(eyeCategory);

            e.AddControl(new MakerButton(irisTemplateName, eyeCategory, owner))
            .OnClick.AddListener(() => WriteAndOpenPng(ResourceUtils.GetEmbeddedResource("eye.png"), "Iris template"));

            AddConfigSettings(e, owner, eyeCategory);

            e.AddControl(new MakerSeparator(eyeCategory, owner));

            SetupTexControls(e, eyeCategory, owner, TexType.EyeOver, "Iris overlay texture (On top of original iris)");

            e.AddControl(new MakerSeparator(eyeCategory, owner));

            SetupTexControls(e, eyeCategory, owner, TexType.EyeUnder, "Iris underlay texture (Before coloring and effects)");
        }
        public static Transform AddNewSubCategory(UI_ToggleGroupCtrl mainCategory, MakerCategory subCategory)
        {
            KoikatuAPI.Logger.LogDebug($"Adding custom subcategory {subCategory.SubCategoryName} to {mainCategory.transform.name}");

            var tr = Object.Instantiate(SubCategoryCopy.gameObject, mainCategory.transform, true).transform;

            tr.name = subCategory.SubCategoryName;
            var trTop = tr.Find("CustomSubcategoryTop");

            trTop.name = subCategory.SubCategoryName + "Top";

            foreach (Transform oldObj in trTop.transform)
            {
                Object.Destroy(oldObj.gameObject);
            }

            tr.GetComponentInChildren <TextMeshProUGUI>().text = GetSubcategoryDisplayName(subCategory);

            var tgl = tr.GetComponent <Toggle>();

            tgl.group = mainCategory.transform.GetComponent <ToggleGroup>();

            var cgroup = trTop.GetComponent <CanvasGroup>();

            mainCategory.items = mainCategory.items.AddToArray(new UI_ToggleGroupCtrl.ItemInfo {
                tglItem = tgl, cgItem = cgroup
            });

            KoikatuAPI.Instance.StartCoroutine(FinishInit(trTop));

            tr.gameObject.SetActive(true);

            return(tr);
        }
        private void SetupBodyInterface(RegisterSubCategoriesEvent e, KoiSkinOverlayMgr owner)
        {
            var paintCategory = MakerConstants.Body.Paint;
            var makerCategory = new MakerCategory(paintCategory.CategoryName, "tglOverlayKSOX", paintCategory.Position + 5, "Skin Overlays");

            e.AddSubCategory(makerCategory);

            e.AddControl(new MakerButton("Get face overlay template", makerCategory, owner))
            .OnClick.AddListener(() => WriteAndOpenPng(Resources.face));
            e.AddControl(new MakerButton("Get body overlay template", makerCategory, owner))
            .OnClick.AddListener(() => WriteAndOpenPng(Resources.body));

            AddConfigSettings(e, owner, makerCategory);

            e.AddControl(new MakerSeparator(makerCategory, owner));

            SetupTexControls(e, makerCategory, owner, TexType.FaceOver, "Face overlay texture (On top of almost everything)");

            e.AddControl(new MakerSeparator(makerCategory, owner));

            SetupTexControls(e, makerCategory, owner, TexType.BodyOver, "Body overlay texture (On top of almost everything)");

            e.AddControl(new MakerSeparator(makerCategory, owner));

            SetupTexControls(e, makerCategory, owner, TexType.FaceUnder, "Face underlay texture (Under tattoos, blushes, etc.)");

            e.AddControl(new MakerSeparator(makerCategory, owner));

            SetupTexControls(e, makerCategory, owner, TexType.BodyUnder, "Body underlay texture (Under tattoos, blushes, etc.)");
        }
예제 #8
0
        private void MakerAPI_RegisterCustomSubCategories(object sender, RegisterSubCategoriesEvent ev)
        {
            MakerCategory category = new MakerCategory("03_ClothesTop", "tglSettings", MakerConstants.Clothes.Copy.Position + 1, "Settings");

            var label = new MakerText("Unlock bras with all tops, bottoms with all tops, and underwear with all bras", category, this);

            ev.AddControl(label);

            ClothingUnlockToggle = new MakerToggle(category, "Clothing Unlock", this);
            ev.AddControl(ClothingUnlockToggle);

            var observer = Observer.Create <bool>(value =>
            {
                if (MakerAPI.InsideAndLoaded)
                {
                    var chaControl        = MakerAPI.GetCharacterControl();
                    var controller        = GetController(chaControl);
                    bool clothingUnlocked = controller.GetClothingUnlocked();
                    if (clothingUnlocked != value)
                    {
                        controller.SetClothingUnlocked(value);
                        chaControl.Reload();
                    }
                }
            });

            ClothingUnlockToggle.ValueChanged.Subscribe(observer);

            ev.AddSubCategory(category);
        }
예제 #9
0
        private void SetupEyeInterface(RegisterSubCategoriesEvent e, KK_CharaOverlaysBasedOnCoordinate owner)
        {
            CharaOverlaysBasedOnCoordinateController controller = MakerAPI.GetCharacterControl().gameObject.GetComponent <CharaOverlaysBasedOnCoordinateController>();
            KoiSkinOverlayController KSOXController             = MakerAPI.GetCharacterControl().gameObject.GetComponent <KoiSkinOverlayController>();

            MakerCategory irisCategory = MakerConstants.Face.Iris;
            MakerCategory eyeCategory  = new MakerCategory(irisCategory.CategoryName, "tglEyeOverlayKSOX", irisCategory.Position + 5, "Iris Overlays");

            e.AddSubCategory(eyeCategory);

            e.AddControl(new MakerButton("Copy iris overlay to all outfits", eyeCategory, owner))
            .OnClick.AddListener(delegate() {
                controller.CopyOverlayToAllOutfits(TexType.EyeOver);
                controller.CopyOverlayToAllOutfits(TexType.EyeUnder);
                Logger.LogMessage("[Chara Overlays Based On Coordinate] Successfully copied iris overlay");
            }
                                 );
            IrisSideRadioBtn = new MakerRadioButtons(eyeCategory, owner, "Side to display", "Both", "Left", "Right");
            e.AddControl(IrisSideRadioBtn)
            .ValueChanged.Subscribe(side => {
                controller.ChangeIrisDisplayside(side);
                //Logger.LogDebug("Changed RadioBtn: " + side);
            }
                                    );
        }
예제 #10
0
            private static void RegisterCustomSubCategories(object sender, RegisterSubCategoriesEvent e)
            {
                MakerCategory category = MakerConstants.Body.All;

                Color[] textColors = { new Color(0.27843f, 1f, 1f), new Color(0.45f, 0.7f, 0.7f) };

                MakerToggle vrHeadSizeToggle = e.AddControl(new KKAPI.Maker.UI.MakerToggle(category, "Enable VR Head Size", Instance)
                {
                    TextColor = textColors[0]
                });

                vrHeadSizeToggle.BindToFunctionController <KK_VRHeadSizeAdjustController, bool>(
                    (controller) => controller._vrHeadSizeEnabled,
                    (controller, value) => controller._vrHeadSizeEnabled = value

                    );

                MakerText explanation = e.AddControl(new MakerText("Enable for different head size in VR. Can improve experience for characters with large heads, which tend to look like sports mascots.", category, Instance)
                {
                    TextColor = textColors[1]
                });


                MakerSlider vrHeadSizeSlider = e.AddControl(new MakerSlider(category, "VR Head Size", SliderUnlocker.SliderUnlocker.Minimum.Value / 100, SliderUnlocker.SliderUnlocker.Maximum.Value / 100, 0.6f, Instance)
                {
                    TextColor = textColors[0]
                });

                vrHeadSizeSlider.BindToFunctionController <KK_VRHeadSizeAdjustController, float>(
                    (controller) => controller._vrHeadSize,
                    (controller, value) => controller._vrHeadSize = value
                    );
            }
예제 #11
0
        private void MakerAPI_RegisterCustomSubCategories(object sender, RegisterSubCategoriesEvent e)
        {
#if AI || HS2
            var window = MakerAPI.AddAccessoryWindowControl(new MakerButton("Material Editor", null, this));
            window.GroupingID = "Buttons";
            window.OnClick.AddListener(UpdateUIAccessory);
            e.AddControl(new MakerButton("Material Editor (Body)", MakerConstants.Body.All, this)).OnClick.AddListener(() => UpdateUICharacter("body"));
            e.AddControl(new MakerButton("Material Editor (Head)", MakerConstants.Body.All, this)).OnClick.AddListener(() => UpdateUICharacter("head"));
            e.AddControl(new MakerButton("Material Editor (All)", MakerConstants.Body.All, this)).OnClick.AddListener(() => UpdateUICharacter());

            MakerCategory hairCategory = new MakerCategory(MakerConstants.Hair.CategoryName, "ME", 0, "Material Editor");
            e.AddControl(new MakerButton("Material Editor (Back)", hairCategory, this)).OnClick.AddListener(() => UpdateUIHair(0));
            e.AddControl(new MakerButton("Material Editor (Front)", hairCategory, this)).OnClick.AddListener(() => UpdateUIHair(1));
            e.AddControl(new MakerButton("Material Editor (Side)", hairCategory, this)).OnClick.AddListener(() => UpdateUIHair(2));
            e.AddControl(new MakerButton("Material Editor (Extension)", hairCategory, this)).OnClick.AddListener(() => UpdateUIHair(3));
            e.AddSubCategory(hairCategory);

            MakerCategory clothesCategory = new MakerCategory(MakerConstants.Clothes.CategoryName, "ME", 0, "Material Editor");
            e.AddControl(new MakerButton("Material Editor (Top)", clothesCategory, this)).OnClick.AddListener(() => UpdateUIClothes(0));
            e.AddControl(new MakerButton("Material Editor (Bottom)", clothesCategory, this)).OnClick.AddListener(() => UpdateUIClothes(1));
            e.AddControl(new MakerButton("Material Editor (Bra)", clothesCategory, this)).OnClick.AddListener(() => UpdateUIClothes(2));
            e.AddControl(new MakerButton("Material Editor (Underwear)", clothesCategory, this)).OnClick.AddListener(() => UpdateUIClothes(3));
            e.AddControl(new MakerButton("Material Editor (Gloves)", clothesCategory, this)).OnClick.AddListener(() => UpdateUIClothes(4));
            e.AddControl(new MakerButton("Material Editor (Pantyhose)", clothesCategory, this)).OnClick.AddListener(() => UpdateUIClothes(5));
            e.AddControl(new MakerButton("Material Editor (Socks)", clothesCategory, this)).OnClick.AddListener(() => UpdateUIClothes(6));
            e.AddControl(new MakerButton("Material Editor (Shoes)", clothesCategory, this)).OnClick.AddListener(() => UpdateUIClothes(7));
            e.AddSubCategory(clothesCategory);

            e.AddControl(new MakerButton("Material Editor", MakerConstants.Face.Mouth, this)).OnClick.AddListener(() => UpdateUICharacter("tang,tooth"));
            e.AddControl(new MakerButton("Material Editor", MakerConstants.Face.Eyes, this)).OnClick.AddListener(() => UpdateUICharacter("eyebase,eyeshadow"));
            e.AddControl(new MakerButton("Material Editor", MakerConstants.Face.HL, this)).OnClick.AddListener(() => UpdateUICharacter("eyebase,eyeshadow"));
            e.AddControl(new MakerButton("Material Editor", MakerConstants.Face.Eyelashes, this)).OnClick.AddListener(() => UpdateUICharacter("eyelashes"));
#endif
        }
 private static string GetSubcategoryDisplayName(MakerCategory subCategory)
 {
     if (subCategory.DisplayName != null)
     {
         return(subCategory.DisplayName);
     }
     return(subCategory.SubCategoryName);
 }
예제 #13
0
        /// <summary>
        /// Create a new custom control. Create and register it in <see cref="MakerAPI.RegisterCustomSubCategories"/>.
        /// </summary>
        /// <param name="settingName">Text displayed next to the slider</param>
        /// <param name="category">Category the control will be created under</param>
        /// <param name="owner">Plugin that owns the control</param>
        /// <param name="minValue">Lowest allowed value (inclusive)</param>
        /// <param name="maxValue">Highest allowed value (inclusive)</param>
        /// <param name="defaultValue">Value the slider will be set to after creation</param>
        public MakerSlider(MakerCategory category, string settingName, float minValue, float maxValue, float defaultValue, BaseUnityPlugin owner) : base(category, defaultValue, owner)
        {
            _settingName = settingName;

            _minValue     = minValue;
            _maxValue     = maxValue;
            _defaultValue = defaultValue;
        }
 private static string GetSubcategoryDisplayName(MakerCategory subCategory)
 {
     if (subCategory.DisplayName != null)
     {
         return(subCategory.DisplayName);
     }
     return(subCategory.SubCategoryName.StartsWith("tgl") ? subCategory.SubCategoryName.Substring(3) : subCategory.SubCategoryName);
 }
예제 #15
0
        private static void MakerAPI_MakerBaseLoaded(object sender, RegisterSubCategoriesEvent e)
        {
            var female = MakerAPI.GetMakerSex() != 0;

            // This category is inaccessible from class maker
            var cat = new MakerCategory(MakerConstants.Body.CategoryName, "Pregnancy");

            e.AddSubCategory(cat);

            var hintColor = new Color(0.7f, 0.7f, 0.7f);

            var gameplayToggle = e.AddControl(new MakerToggle(cat, "Enable pregnancy progression", true, _pluginInstance));

            gameplayToggle.BindToFunctionController <PregnancyCharaController, bool>(controller => controller.Data.GameplayEnabled, (controller, value) => controller.Data.GameplayEnabled = value);
            e.AddControl(new MakerText(female ?
                                       "If off, the character can't get pregnant and current pregnancy will stop progressing." :
                                       "If on, belly will progressively get bigger. No other effects.",
                                       cat, _pluginInstance)
            {
                TextColor = hintColor
            });

            if (female)
            {
                var fertilityToggle = e.AddControl(new MakerSlider(cat, "Fertility", 0f, 1f, PregnancyData.DefaultFertility, _pluginInstance));
                fertilityToggle.BindToFunctionController <PregnancyCharaController, float>(controller => controller.Data.Fertility, (controller, value) => controller.Data.Fertility = value);

                e.AddControl(new MakerText("How likely this character is to get pregnant.", cat, _pluginInstance)
                {
                    TextColor = hintColor
                });
            }

            var weeksSlider = e.AddControl(new MakerSlider(cat, "Week of pregnancy", 0f, PregnancyData.LeaveSchoolWeek - 1f, 0f, _pluginInstance));

            weeksSlider.ValueToString = f => Mathf.RoundToInt(f).ToString();
            weeksSlider.StringToValue = s => int.Parse(s);
            weeksSlider.BindToFunctionController <PregnancyCharaController, float>(controller => controller.Data.Week, (controller, value) => controller.Data.Week = Mathf.RoundToInt(value));

            e.AddControl(new MakerText(female ?
                                       "If the character is pregnant when added to the game, the pregnancy will continue from this point." :
                                       "The only way for male characters to get pregnant is to manually set this slider above 0.",
                                       cat, _pluginInstance)
            {
                TextColor = hintColor
            });

            if (female)
            {
                var scheduleToggle = e.AddControl(new MakerRadioButtons(cat, _pluginInstance, "Menstruation schedule", "Default", "More risky", "Always safe", "Always risky"));
                scheduleToggle.BindToFunctionController <PregnancyCharaController, int>(controller => (int)controller.Data.MenstruationSchedule, (controller, value) => controller.Data.MenstruationSchedule = (MenstruationSchedule)value);

                e.AddControl(new MakerText("Changes how many risky days the character has in a cycle. Default is more safe days than risky days.", cat, _pluginInstance)
                {
                    TextColor = hintColor
                });
            }
        }
예제 #16
0
파일: BoneMeta.cs 프로젝트: AxSaber/KKABMX
 public BoneMeta(string boneName, string displayName, float min, float max, MakerCategory category, string rightBoneName = null)
 {
     BoneName      = boneName;
     DisplayName   = displayName;
     Min           = min;
     Max           = max;
     Category      = category;
     RightBoneName = rightBoneName;
 }
        /// <summary>
        /// Create a new custom control. Create and register it in <see cref="MakerAPI.RegisterCustomSubCategories"/>.
        /// </summary>
        /// <param name="settingName">Text displayed next to the buttons</param>
        /// <param name="category">Category the control will be created under</param>
        /// <param name="owner">Plugin that owns the control</param>
        /// <param name="initialValue">Initial value of the control</param>
        /// <param name="buttons">Names of the radio buttons. Need at least 2 buttons.</param>
        public MakerRadioButtons(MakerCategory category, BaseUnityPlugin owner, string settingName, int initialValue, params string[] buttons) : base(category, initialValue, owner)
        {
            if (buttons.Length < 2)
            {
                throw new ArgumentException("Need at least two buttons.", nameof(buttons));
            }

            _settingName = settingName;
            _buttons     = buttons;
        }
예제 #18
0
        internal void CatTrimMoreacc(RegisterSubCategoriesEvent ev, MakerCategory category)
        {
            ev.AddControl(new MakerText("Trim down unused MoreAccessories slots", category, this));

            MakerButton btnMoreAccApply = ev.AddControl(new MakerButton("Go", category, this));

            btnMoreAccApply.OnClick.AddListener(delegate
            {
                MoreAccessories.TrimUnusedSlots();
            });
        }
예제 #19
0
        internal void CatParentSort(RegisterSubCategoriesEvent ev, MakerCategory category)
        {
            ev.AddControl(new MakerText("Sort by accessory parents", category, this));

            MakerButton btnApply = ev.AddControl(new MakerButton("Go", category, this));

            btnApply.OnClick.AddListener(delegate
            {
                ActParentSort();
            });
        }
예제 #20
0
        internal void CatPacking(RegisterSubCategoriesEvent ev, MakerCategory category)
        {
            ev.AddControl(new MakerText("Pack acc list by removing unused slots", category, this));

            MakerButton btnPackSlots = ev.AddControl(new MakerButton("Go", category, this));

            btnPackSlots.OnClick.AddListener(delegate
            {
                ActPacking();
            });
        }
예제 #21
0
        private void MakerAPI_RegisterCustomSubCategories(object sender, RegisterSubCategoriesEvent e)
        {
            MakerCategory category = new MakerCategory(MakerConstants.Parameter.ADK.CategoryName, "Profile");

            e.AddSubCategory(category);
            e.AddControl(new MakerText("Character Description", category, this));
            ProfileTextbox = e.AddControl(new MakerTextbox(category, "", "", this));

            //Starts throwing errors at some point after 30,000 characters
            ProfileTextbox.CharacterLimit = 30000;
        }
예제 #22
0
        private void MakerAPI_RegisterCustomSubCategories(object sender, RegisterSubCategoriesEvent e)
        {
            var category = new MakerCategory(MakerConstants.Parameter.ADK.CategoryName, "Crest");

            e.AddSubCategory(category);

            if (!_confUnlockStoryMaker.Value && MakerAPI.IsInsideClassMaker())
            {
                _descTxtControl = e.AddControl(new MakerText(
                                                   "To change crests inside story mode you have to invite the character to the club and use the crest icon in clubroom. You can also disable this limitation in plugin settings.",
                                                   category, this));
            }
            else
            {
                e.AddControl(new MakerText("Crests with the [+] tag will change gameplay in story mode.", category, this)
                {
                    TextColor = MakerText.ExplanationGray
                });

                var list = CrestInterfaceList.Create(false, true);

                var dropdownControl = e.AddControl(new MakerDropdown("Crest type", list.GetInterfaceNames(), category, 0, this));
                dropdownControl.BindToFunctionController <LewdCrestXController, int>(
                    controller => list.GetIndex(controller.CurrentCrest),
                    (controller, value) => controller.CurrentCrest = list.GetType(value));

                e.AddControl(new MakerToggle(category, "Hide crest graphic", this))
                .BindToFunctionController <LewdCrestXController, bool>(controller => controller.HideCrestGraphic, (controller, value) => controller.HideCrestGraphic = value);

                _descTxtControl = e.AddControl(new MakerText("Description", category, this));
                var implementedTxtControl = e.AddControl(new MakerText("", category, this));
                e.AddControl(new MakerText("The crests were created by novaksus on pixiv", category, this)
                {
                    TextColor = MakerText.ExplanationGray
                });
                dropdownControl.ValueChanged.Subscribe(value =>
                {
                    if (value <= 0)
                    {
                        _descTxtControl.Text       = "No crest selected, no effects applied";
                        implementedTxtControl.Text = "";
                    }
                    else
                    {
                        var crestInfo              = list.GetInfo(value);
                        _descTxtControl.Text       = crestInfo.Description;
                        implementedTxtControl.Text = crestInfo.Implemented
                            ? "This crest will affect gameplay in story mode as described"
                            : "This crest is only for looks (it might be implemented in the future with modified lore)";
                    }
                });
            }
        }
예제 #23
0
        /// <summary>
        /// Create a new custom control
        /// </summary>
        /// <param name="category">Category the control will be created under</param>
        /// <param name="owner">Plugin that owns the control</param>
        protected BaseGuiEntry(MakerCategory category, BaseUnityPlugin owner)
        {
            Category = category;
            Owner    = owner;

            Visible = new BehaviorSubject <bool>(true);
            Visible.Subscribe(b =>
            {
                foreach (var controlObject in ControlObjects)
                {
                    controlObject.SetActive(b);
                }
            });
        }
예제 #24
0
        private void Start()
        {
            Instance = this;
            Logger   = base.Logger;

            IsDark = typeof(ChaControl).GetProperties(AccessTools.all).Any(x => x.Name == "exType");

            MoreAccessories.InitSupport();
            MaterialEditor.InitSupport();
            HairAccessoryCustomizer.InitSupport();
            AccStateSync.InitSupport();
            MaterialRouter.InitSupport();
            DynamicBoneEditor.InitSupport();
            AAAPK.InitSupport();

            MakerAPI.RegisterCustomSubCategories += (sender, ev) =>
            {
                HooksInstance = Harmony.CreateAndPatchAll(typeof(Hooks));
                MaterialEditor.HookInit();

                MakerCategory category = new MakerCategory("05_ParameterTop", "tglMovUrAcc", MakerConstants.Parameter.Attribute.Position + 1, "MovUrAcc");

                CatBatchTransfer(ev, category);
                ev.AddControl(new MakerSeparator(category, this));

                CatBatchRemove(ev, category);
                ev.AddControl(new MakerSeparator(category, this));

                CatParentSort(ev, category);
                ev.AddControl(new MakerSeparator(category, this));

                CatPacking(ev, category);
                ev.AddControl(new MakerSeparator(category, this));

                CatTrimMoreacc(ev, category);

                ev.AddSubCategory(category);

                btnLock = false;
            };

            MakerAPI.MakerExiting += (sender, ev) =>
            {
                HooksInstance.UnpatchAll(HooksInstance.Id);
                HooksInstance = null;
            };
        }
예제 #25
0
        internal static void MakerAPI_RegisterCustomSubCategories(object sender, RegisterSubCategoriesEvent ev)
        {
            MakerCategory category = new MakerCategory("03_ClothesTop", "tglSettings", MakerConstants.Clothes.Copy.Position + 1, "Settings");

            var addRemoveText = new MakerText("Add or remove outfit slots", category, Instance);

            ev.AddControl(addRemoveText);

            var coordinateNameTextbox = new MakerTextbox(category, "Outfit Name", TextboxDefault, Instance);

            ev.AddControl(coordinateNameTextbox);

            var addCoordinateButton = new MakerButton("Add additional clothing slot", category, Instance);

            ev.AddControl(addCoordinateButton);
            addCoordinateButton.OnClick.AddListener(() =>
            {
                var chaControl = MakerAPI.GetCharacterControl();
                SetCoordinateName(chaControl, chaControl.chaFile.coordinate.Length, coordinateNameTextbox.Value);
                AddCoordinateSlot(chaControl);
            });

            var removeCoordinateButton = new MakerButton("Remove last additional clothing slot", category, Instance);

            ev.AddControl(removeCoordinateButton);
            removeCoordinateButton.OnClick.AddListener(() => { RemoveCoordinateSlot(MakerAPI.GetCharacterControl()); });

            RenameCoordinateText = new MakerText("Rename outfit slots", category, Instance);
            ev.AddControl(RenameCoordinateText);

            RenameCoordinateDropdown = new MakerDropdown("Outfit", new string[] { "none" }, category, 0, Instance);
            ev.AddControl(RenameCoordinateDropdown);

            RenameCoordinateTextbox = new MakerTextbox(category, "New Name", TextboxDefault, Instance);
            RenameCoordinateTextbox.ValueChanged.Subscribe(value =>
            {
                if (value != TextboxDefault)
                {
                    var chaControl = MakerAPI.GetCharacterControl();
                    SetCoordinateName(chaControl, OriginalCoordinateLength + RenameCoordinateDropdown.Value, RenameCoordinateTextbox.Value);
                    UpdateMakerUI();
                }
            });
            ev.AddControl(RenameCoordinateTextbox);

            ev.AddSubCategory(category);
        }
예제 #26
0
        private void RegisterMakerControls(Stiletto plugin, RegisterSubCategoriesEvent e)
        {
            displaySettings = StilettoContext._displaySettingsProvider.Value;

            var shoesCategory = MakerConstants.Clothes.OuterShoes;
            var category      = new MakerCategory(shoesCategory.CategoryName, "stiletto", shoesCategory.Position + 1, displaySettings.Stiletto);

            e.AddSubCategory(category);

            text_heelName     = e.AddControl(new MakerText(displaySettings.Default_Heel_Name, category, plugin));
            slider_AnkleAngle = e.AddControl(new MakerSlider(category, displaySettings.Ankle_Angle, -60f, 60f, 0f, plugin)
            {
                StringToValue = CreateStringToValueFunc(10f),
                ValueToString = CreateValueToStringFunc(10f),
            });
            slider_LegAngle = e.AddControl(new MakerSlider(category, displaySettings.Leg_Angle, -60f, 60f, 0f, plugin)
            {
                StringToValue = CreateStringToValueFunc(10f),
                ValueToString = CreateValueToStringFunc(10f)
            });
            slider_Height = e.AddControl(new MakerSlider(category, displaySettings.Height, -0.5f, 0.5f, 0f, plugin)
            {
                StringToValue = CreateStringToValueFunc(1000f),
                ValueToString = CreateValueToStringFunc(1000f)
            });
            button_HeelSave = e.AddControl(new MakerButton(displaySettings.Save_Heel_Settings, category, plugin));
            button_Reload   = e.AddControl(new MakerButton(displaySettings.Reload_Configurations, category, plugin));

            slider_AnkleAngle.ValueChanged.Subscribe(value =>
                                                     MakerHeelInfoProcess(heel => heel.SafeProc(x => x.AnkleAngle = value))
                                                     );

            slider_LegAngle.ValueChanged.Subscribe(value =>
                                                   MakerHeelInfoProcess(heel => heel.SafeProc(x => x.LegAngle = value))
                                                   );

            slider_Height.ValueChanged.Subscribe(value =>
                                                 MakerHeelInfoProcess(heel => heel.SafeProc(x => x.Height = value))
                                                 );

            button_HeelSave.OnClick.AddListener(() =>
                                                MakerHeelInfoProcess(heel => StilettoContext.CustomHeelProvider.Save(heel.heelName, new CustomHeel(heel))
                                                                     ));

            button_Reload.OnClick.AddListener(StilettoContext.ReloadConfigurations);
        }
        private void SetupTexControls(RegisterCustomControlsEvent e, MakerCategory makerCategory, BaseUnityPlugin owner, TexType texType, string title)
        {
            e.AddControl(new MakerText(title, makerCategory, owner));

            var bi = e.AddControl(new MakerImage(null, makerCategory, owner)
            {
                Height = 150, Width = 150
            });

            _textureChanged.Subscribe(
                d =>
            {
                if (d.Key == texType)
                {
                    bi.Texture = d.Value;
                }
            });

            e.AddControl(new MakerButton("Load new texture", makerCategory, owner))
            .OnClick.AddListener(
                () => OpenFileDialog.Show(strings => OnFileAccept(strings, texType), "Open overlay image", GetDefaultLoadDir(), FileFilter, FileExt));

            e.AddControl(new MakerButton("Clear texture", makerCategory, owner))
            .OnClick.AddListener(() => SetTexAndUpdate(null, texType));

            e.AddControl(new MakerButton("Export current texture", makerCategory, owner))
            .OnClick.AddListener(
                () =>
            {
                try
                {
                    var ctrl = GetOverlayController();
                    var tex  = ctrl.Overlays.FirstOrDefault(x => x.Key == texType).Value;
                    if (tex == null)
                    {
                        return;
                    }
                    WriteAndOpenPng(tex.Data);
                }
                catch (Exception ex)
                {
                    Logger.Log(LogLevel.Error | LogLevel.Message, "[KSOX] Failed to export texture - " + ex.Message);
                }
            });
        }
        private void SetupEyeInterface(RegisterSubCategoriesEvent e, KoiSkinOverlayMgr owner)
        {
            var irisCategory = MakerConstants.Face.Iris;
            var eyeCategory  = new MakerCategory(irisCategory.CategoryName, "tglEyeOverlayKSOX", irisCategory.Position + 5, "Iris Overlays");

            e.AddSubCategory(eyeCategory);

            e.AddControl(new MakerButton("Get iris overlay template", eyeCategory, owner))
            .OnClick.AddListener(() => WriteAndOpenPng(Resources.eye));

            AddConfigSettings(e, owner, eyeCategory);

            e.AddControl(new MakerSeparator(eyeCategory, owner));

            SetupTexControls(e, eyeCategory, owner, TexType.EyeOver, "Iris overlay texture (On top of original iris)");

            e.AddControl(new MakerSeparator(eyeCategory, owner));

            SetupTexControls(e, eyeCategory, owner, TexType.EyeUnder, "Iris underlay texture (Before coloring and effects)");
        }
예제 #29
0
        private PushupSlider MakeSlider(MakerCategory category, string sliderName, RegisterSubCategoriesEvent e, float defaultValue, bool useConfigMinMax = false)
        {
            float min = 0f;
            float max = 1f;

            if (useConfigMinMax)
            {
                min = (float)ConfigSliderMin.Value / 100;
                max = (float)ConfigSliderMax.Value / 100;
            }

            var slider = new MakerSlider(category, sliderName, min, max, defaultValue, this);

            e.AddControl(slider);
            var pushUpSlider = new PushupSlider();

            pushUpSlider.MakerSlider = slider;

            return(pushUpSlider);
        }
예제 #30
0
파일: UI.cs 프로젝트: sidfu/KK_Archetypes
        /// <summary>
        /// Initializer for Favorites UI.
        /// </summary>
        internal UI()
        {
            KKAT_instance   = Singleton <KK_Archetypes> .Instance;
            showAdvancedGUI = false;
            showLoadGUI     = true;

            _selectStyle.normal.background = new Texture2D(1, 1);
            _selectStyle.normal.background.SetPixel(1, 1, new Color(1, 1, 1, .4f));
            _selectStyle.normal.background.Apply();
            _selectStyle.active.background  = _selectStyle.normal.background;
            _selectStyle.focused.background = _selectStyle.normal.background;
            _selectStyle.hover.background   = _selectStyle.normal.background;

            _normalStyle.normal.textColor  = Color.white;
            _normalStyle.active.textColor  = Color.white;
            _normalStyle.hover.textColor   = Color.white;
            _normalStyle.focused.textColor = Color.white;

            FavoritesSubCat = new MakerCategory(MakerConstants.Parameter.Character.CategoryName, "Archetypes");
            AllToggle       = new MakerToggle(FavoritesSubCat, "Select/Deselect All", KKAT_instance);
        }