public static IEnumerable <TreeNodeObject> EnumerateTreeNodeObjects(TreeNodeObject root = null) { var roots = ListPool <TreeNodeObject> .Get(); if (root != null) { roots.Add(root); } else { root = StudioAPI.GetSelectedObjects().FirstOrDefault()?.treeNodeObject; if (root != null) { roots.AddRange(root.GetTreeNodeCtrl().GetTreeNodeObjects()); } } foreach (var entry in roots) { yield return(entry); foreach (var tnObj in entry.child.SelectMany(EnumerateTreeNodeObjects)) { yield return(tnObj); } } ListPool <TreeNodeObject> .Release(roots); }
private static void RegisterStudioControls() { CurrentStateCategoryToggle CreateToggle(string name, int textureCount, Action <SkinEffectsController, int> set, Func <SkinEffectsController, int> get) { var tgl = new CurrentStateCategoryToggle(name, Mathf.Min(4, textureCount + 1), c => RescaleStudioLevel(get(c.charInfo.GetComponent <SkinEffectsController>()), textureCount, 3)); tgl.Value.Subscribe(Observer.Create((int x) => { foreach (var controller in StudioAPI.GetSelectedControllers <SkinEffectsController>()) { set(controller, RescaleStudioLevel(x, tgl.ToggleCount - 1, textureCount)); } })); return(tgl); } var sweatTgl = CreateToggle("Sweat", TextureLoader.WetTexturesFaceCount, (controller, i) => controller.SweatLevel = i, controller => controller.SweatLevel); var tearsTgl = CreateToggle("Tears", TextureLoader.TearTexturesCount, (controller, i) => controller.TearLevel = i, controller => controller.TearLevel); var droolTgl = CreateToggle("Drool", TextureLoader.DroolTexturesCount, (controller, i) => controller.DroolLevel = i, controller => controller.DroolLevel); var cumTgl = CreateToggle("Bukkake", TextureLoader.CumTexturesCount, (controller, i) => controller.BukkakeLevel = i, controller => controller.BukkakeLevel); var bldTgl = CreateToggle("Virgin blood", TextureLoader.BldTexturesCount, (controller, i) => controller.BloodLevel = i, controller => controller.BloodLevel); StudioAPI.GetOrCreateCurrentStateCategory("Additional skin effects").AddControls(sweatTgl, tearsTgl, droolTgl, cumTgl, bldTgl); }
private void Start() { #if !EC if (StudioAPI.InsideStudio) { enabled = false; var cat = StudioAPI.GetOrCreateCurrentStateCategory("Overlays"); cat.AddControl(new CurrentStateCategorySwitch("Skin overlays", c => c.charInfo.GetComponent <KoiSkinOverlayController>().EnableInStudioSkin)).Value.Subscribe( v => StudioAPI.GetSelectedControllers <KoiSkinOverlayController>().Do(c => { if (c.EnableInStudioSkin != v) { c.EnableInStudioSkin = v; c.UpdateTexture(TexType.Unknown); } })); cat.AddControl(new CurrentStateCategorySwitch("Eye overlays", c => c.charInfo.GetComponent <KoiSkinOverlayController>().EnableInStudioIris)).Value.Subscribe( v => StudioAPI.GetSelectedControllers <KoiSkinOverlayController>().Do(c => { if (c.EnableInStudioIris != v) { c.EnableInStudioIris = v; c.UpdateTexture(TexType.EyeUnder); } })); return; } #endif MakerAPI.RegisterCustomSubCategories += RegisterCustomSubCategories; MakerAPI.MakerExiting += MakerExiting; CharacterApi.CharacterReloaded += (sender, args) => OnChaFileLoaded(); }
private IEnumerable <TreeNodeObject> EnumerateTreeNodeObjects(TreeNodeObject root = null) { var roots = new List <TreeNodeObject>(); if (root != null) { roots.Add(root); } else { root = StudioAPI.GetSelectedObjects().FirstOrDefault()?.treeNodeObject; if (root != null) { roots.AddRange(root.GetTreeNodeCtrl().GetTreeNodeObjects()); } } foreach (var entry in roots) { yield return(entry); foreach (var tnObj in entry.child.SelectMany(EnumerateTreeNodeObjects)) { yield return(tnObj); } } roots.Clear(); }
private void SelectCharasById(CharaId matchId) { var selected = 0; var origCharCount = StudioAPI.GetSelectedCharacters().Count(); var origObjCount = StudioAPI.GetSelectedObjects().Count() - origCharCount; foreach (var objectCtrlInfo in EnumerateObjects()) { Logger.DebugLogDebug($"SelectCharasById: {objectCtrlInfo}"); if (objectCtrlInfo is OCIChar ociChar) { if (DoesCharaMatch(matchId, ociChar)) { ociChar.MultiSelectInWorkarea(); selected++; } else { if (ociChar.IsSelectedInWorkarea()) { ociChar.UnselectInWorkarea(); } } } else { objectCtrlInfo.UnselectInWorkarea(); } } Logger.Log(BepInLogLevel.Info | BepInLogLevel.Message, $"characters selected: {selected} ({selected - origCharCount} new selections, {origObjCount} non-characters unselected)"); GeBoAPI.Instance.PlayNotificationSound(NotificationSound.Success); }
private static void CreateStudioControls() { var currentStateCategory = StudioAPI.GetOrCreateCurrentStateCategory(null); var list = CrestInterfaceList.Create(false, false); int ReadValue(OCIChar c) { var crest = c.GetChaControl().GetComponent <LewdCrestXController>().CurrentCrest; return(list.GetIndex(crest)); } void SetValue(int i) { var crest = list.GetType(i); foreach (var controller in StudioAPI.GetSelectedControllers <LewdCrestXController>()) { controller.CurrentCrest = crest; } } currentStateCategory.AddControl(new CurrentStateCategoryDropdown("Lewd Crest", list.GetInterfaceNames(), ReadValue)).Value.Subscribe(SetValue); currentStateCategory.AddControl(new CurrentStateCategorySwitch("Lewd Crest visible", c => c.GetChaControl().GetComponent <LewdCrestXController>().HideCrestGraphic)).Value.Subscribe( b => StudioAPI.GetSelectedControllers <LewdCrestXController>().Do(ctrl => ctrl.HideCrestGraphic = b)); }
private void InitStudioUI(Scene scene, LoadSceneMode loadSceneMode) { if (scene.name != "Studio") { return; } SceneManager.sceneLoaded -= InitStudioUI; var dropdownForegroundEyebrow = GameObject.Find("StudioScene").transform.Find("Canvas Main Menu/02_Manipulate/00_Chara/02_Kinematic/05_Etc/Eyebrows Draw/Dropdown").GetComponent <Dropdown>(); dropdownForegroundEyebrow.onValueChanged.AddListener(value => { var characters = StudioAPI.GetSelectedCharacters(); foreach (var character in characters) { SetEyebrows(character.charInfo, (byte)value); } }); var dropdownForegroundEyes = GameObject.Find("StudioScene").transform.Find("Canvas Main Menu/02_Manipulate/00_Chara/02_Kinematic/05_Etc/Eyes Draw/Dropdown").GetComponent <Dropdown>(); dropdownForegroundEyes.onValueChanged.AddListener(value => { var characters = StudioAPI.GetSelectedCharacters(); foreach (var character in characters) { SetEyeliners(character.charInfo, (byte)value); } }); }
private void Awake() { var insideStudio = Application.productName == "StudioNEOV2"; MakerAPI.Init(insideStudio); StudioAPI.Init(insideStudio); CharacterApi.Init(); }
private static void CreateMenuEntry() { GameObject listmenu = GameObject.Find("StudioScene/Canvas Main Menu/02_Manipulate/00_Chara/02_Kinematic/Viewport/Content"); GameObject fkButton = GameObject.Find("StudioScene/Canvas Main Menu/02_Manipulate/00_Chara/02_Kinematic/Viewport/Content/FK"); var newSelect = Instantiate(fkButton, listmenu.transform, true); newSelect.name = "FK & IK"; TextMeshProUGUI tmp = newSelect.transform.GetChild(0).GetComponentInChildren(typeof(TextMeshProUGUI)) as TextMeshProUGUI; tmp.text = "FK & IK"; Button[] buttons = listmenu.GetComponentsInChildren <Button>(); GameObject originalPanel = GameObject.Find("StudioScene/Canvas Main Menu/02_Manipulate/00_Chara/02_Kinematic/00_FK"); GameObject kineMenu = GameObject.Find("StudioScene/Canvas Main Menu/02_Manipulate/00_Chara/02_Kinematic"); FKIKPanel = Instantiate(originalPanel, kineMenu.transform, true); RectTransform rect = FKIKPanel.GetComponent <RectTransform>(); rect.sizeDelta = new Vector2(rect.sizeDelta.x, 395); Button fkikSelectButton = newSelect.GetComponent <Button>(); foreach (Button button in buttons) { button.onClick.AddListener(delegate() { FKIKPanel.SetActive(false); fkikSelectButton.image.color = Color.white; }); } fkikSelectButton.onClick.RemoveAllListeners(); fkikSelectButton.onClick.AddListener(delegate() { foreach (Transform child in kineMenu.transform) { if (child.name != "Viewport" && child.name != "Scrollbar Vertical") { child.gameObject.SetActive(false); } } foreach (Button button in buttons) { button.image.color = Color.white; } FKIKPanel.SetActive(true); fkikSelectButton.image.color = Color.green; Traverse.Create(FindObjectOfType <MPCharCtrl>()).Field("kinematic").SetValue(-1); foreach (OCIChar ociChar in StudioAPI.GetSelectedCharacters()) { OverrideEvents = true; ActiveButton.isOn = ociChar.oiCharInfo.enableIK && ociChar.oiCharInfo.enableFK; break; } }); }
private void Awake() { var insideStudio = Application.productName.StartsWith("PlayHomeStudio"); //todo implement MakerAPI.Init(insideStudio); StudioAPI.Init(insideStudio); CharacterApi.Init(); }
private void Awake() { var insideStudio = Application.productName.StartsWith("PlayHomeStudio"); MakerAPI.Init(insideStudio); StudioAPI.Init(insideStudio); CharacterApi.Init(); AccessoriesApi.Init(); }
private void Awake() { BaseAwake(); var insideStudio = Application.productName == "CharaStudio"; MakerAPI.Init(insideStudio); StudioAPI.Init(insideStudio); CharacterApi.Init(); GameAPI.Init(insideStudio); }
internal static void RegisterStudioControls() { if (!Running) { return; } Loaded = true; CurrentStateCategorySwitch StudioToggleEnable = new CurrentStateCategorySwitch("Enable", OCIChar => (bool)GetController(OCIChar)?.FunctionEnable); StudioToggleEnable.Value.Subscribe(_value => { CharacterAccessoryController _pluginCtrl = StudioAPI.GetSelectedControllers <CharacterAccessoryController>().FirstOrDefault(); if (_pluginCtrl == null) { return; } _pluginCtrl.FunctionEnable = _value; }); StudioAPI.GetOrCreateCurrentStateCategory("CharaAcc").AddControl(StudioToggleEnable); CurrentStateCategorySwitch StudioToggleAutoCopyToBlank = new CurrentStateCategorySwitch("Auto Copy To Blank", OCIChar => (bool)GetController(OCIChar)?.AutoCopyToBlank); StudioToggleAutoCopyToBlank.Value.Subscribe(_value => { CharacterAccessoryController _pluginCtrl = StudioAPI.GetSelectedControllers <CharacterAccessoryController>().FirstOrDefault(); if (_pluginCtrl == null) { return; } _pluginCtrl.AutoCopyToBlank = _value; }); StudioAPI.GetOrCreateCurrentStateCategory("CharaAcc").AddControl(StudioToggleAutoCopyToBlank); List <string> coordinateList = Enum.GetNames(typeof(ChaFileDefine.CoordinateType)).ToList(); coordinateList.Add("CharaAcc"); CurrentStateCategoryDropdown StudioDropdownRef = new CurrentStateCategoryDropdown("Referral", coordinateList.ToArray(), OCIChar => (int)GetController(OCIChar)?.ReferralIndex); StudioDropdownRef.Value.Subscribe(_value => { CharacterAccessoryController _pluginCtrl = StudioAPI.GetSelectedControllers <CharacterAccessoryController>().FirstOrDefault(); if (_pluginCtrl == null) { return; } _pluginCtrl.SetReferralIndex(_value); }); StudioAPI.GetOrCreateCurrentStateCategory("CharaAcc").AddControl(StudioDropdownRef); }
private static void RegisterStudioControls() { var invisibleSwitch = new CurrentStateCategorySwitch("Invisible Body", controller => controller.charInfo.GetComponent <InvisibleBodyCharaController>().Invisible); invisibleSwitch.Value.Subscribe(Observer.Create((bool value) => { var controller = GetSelectedStudioController(); if (controller != null) { controller.Invisible = value; } })); StudioAPI.GetOrCreateCurrentStateCategory("").AddControl(invisibleSwitch); }
private static void RegisterStudioControls() { var invisibleSwitch = new CurrentStateCategorySwitch("Shaking Eye Highlights", controller => controller.charInfo.GetComponent <EyeShakingController>().EyeShaking); invisibleSwitch.Value.Subscribe(Observer.Create((bool value) => { var controller = GetSelectedStudioController(); if (controller != null) { controller.EyeShaking = value; } })); StudioAPI.GetOrCreateCurrentStateCategory("").AddControl(invisibleSwitch); }
private void Start() { if (!CheckIncompatibilities()) { return; } var insideStudio = Application.productName == "CharaStudio"; MakerAPI.Init(insideStudio); StudioAPI.Init(insideStudio); StudioSaveLoadApi.Init(insideStudio); CharacterApi.Init(); GameAPI.Init(insideStudio); }
public static void RegisterStudioControls() { if (!StudioAPI.InsideStudio) { return; } StudioCoordinateCurrentStateCategoryDropdown = new CurrentStateCategoryDropdown("Coordinate", CoordinateNames.ToArray(), c => CoordinateIndex()); StudioCoordinateCurrentStateCategoryDropdown.Value.Subscribe(value => { var mpCharCtrol = Object.FindObjectOfType <MPCharCtrl>(); if (StudioCoordinateDropdown != null) { var character = StudioAPI.GetSelectedCharacters().First(); //Remove extras if (StudioCoordinateDropdown.options.Count > OriginalCoordinateLength) { StudioCoordinateDropdown.options.RemoveRange(OriginalCoordinateLength, StudioCoordinateDropdown.options.Count - OriginalCoordinateLength); } //Add dropdown options for each additional coodinate if (StudioCoordinateDropdown.options.Count < character.charInfo.chaFile.coordinate.Length) { for (int i = 0; i < (character.charInfo.chaFile.coordinate.Length - OriginalCoordinateLength); i++) { StudioCoordinateDropdown.options.Add(new Dropdown.OptionData(GetCoodinateName(character.charInfo, OriginalCoordinateLength + i))); } StudioCoordinateDropdown.captionText.text = StudioCoordinateDropdown.options[value].text; } } if (mpCharCtrol != null) { mpCharCtrol.stateInfo.OnClickCosType(value); } }); int CoordinateIndex() { var character = StudioAPI.GetSelectedCharacters().First(); return(character.charInfo.fileStatus.coordinateType); } StudioAPI.GetOrCreateCurrentStateCategory("").AddControl(StudioCoordinateCurrentStateCategoryDropdown); }
private void Awake() { EnableDebugLoggingSetting = new ConfigWrapper <bool>("EnableDebugLogging", GUID, false); if (!CheckIncompatibilities()) { return; } var insideStudio = Application.productName == "CharaStudio"; MakerAPI.Init(insideStudio); StudioAPI.Init(insideStudio); StudioSaveLoadApi.Init(insideStudio); CharacterApi.Init(); GameAPI.Init(insideStudio); }
//No studio for EC private static void RegisterStudioControls() { if (!StudioAPI.InsideStudio) { return; } var pushupBraToggle = new CurrentStateCategorySwitch("Pushup Bra", ocichar => ocichar.charInfo.GetComponent <PushupController>().CurrentBraData.EnablePushup); StudioAPI.GetOrCreateCurrentStateCategory("Pushup").AddControl(pushupBraToggle); pushupBraToggle.Value.Subscribe(value => { bool first = true; foreach (var controller in StudioAPI.GetSelectedControllers <PushupController>()) { if (first && controller.CurrentBraData.EnablePushup == value) { break; } first = false; controller.CurrentBraData.EnablePushup = value; controller.RecalculateBody(); } }); var pushupTopToggle = new CurrentStateCategorySwitch("Pushup Top", ocichar => ocichar.charInfo.GetComponent <PushupController>().CurrentTopData.EnablePushup); StudioAPI.GetOrCreateCurrentStateCategory("Pushup").AddControl(pushupTopToggle); pushupTopToggle.Value.Subscribe(value => { bool first = true; foreach (var controller in StudioAPI.GetSelectedControllers <PushupController>()) { if (first && controller.CurrentTopData.EnablePushup == value) { break; } first = false; controller.CurrentTopData.EnablePushup = value; controller.RecalculateBody(); } }); }
private void CreateInterface() { if (!StudioAPI.InsideStudio) { MakerAPI.MakerBaseLoaded += (sender, e) => { #if KK || KKS var cat = KKABMX.GUI.InterfaceData.BodyGenitals; #elif AI var cat = MakerConstants.Body.Lower; #endif e.AddControl(new MakerRadioButtons(cat, this, "Enable crotch bulge", (int)DefaultBulgeState.Value, "Auto", "Always", "Never")) .BindToFunctionController <BulgeController, int>(controller => (int)controller.EnableBulge, (controller, value) => controller.EnableBulge = (BulgeEnableLevel)value); e.AddControl(new MakerText("Auto will enable the bulge only if the character has a shlong (either male or added with UncensorSelector).\nThe effect is applied only when wearing clothes.", cat, this) { TextColor = MakerText.ExplanationGray }); e.AddControl(new MakerSlider(cat, "Bulge size", 0, 1, DefaultBulgeSize.Value, this)) .BindToFunctionController <BulgeController, float>(controller => controller.BulgeSize, (controller, value) => controller.BulgeSize = value); }; } else { var category = StudioAPI.GetOrCreateCurrentStateCategory(null); category.AddControl(new CurrentStateCategoryDropdown( "Enable crotch bulge", new[] { "Auto", "Always", "Never" }, c => (int)c.charInfo.GetComponent <BulgeController>().EnableBulge)).Value.Subscribe(val => { foreach (var controller in StudioAPI.GetSelectedControllers <BulgeController>()) { controller.EnableBulge = (BulgeEnableLevel)val; } }); category.AddControl(new CurrentStateCategorySlider("Bulge size", c => c.charInfo.GetComponent <BulgeController>().BulgeSize)).Value.Subscribe(val => { foreach (var controller in StudioAPI.GetSelectedControllers <BulgeController>()) { controller.BulgeSize = val; } }); } }
private void Update() { if (SwapShadersHotkey.Value.IsDown()) { if (MakerAPI.InsideAndLoaded) { var chaControl = MakerAPI.GetCharacterControl(); UpdateCharShaders(chaControl); } else if (StudioAPI.InsideStudio) { var ociChars = StudioAPI.GetSelectedCharacters(); foreach (var ociChar in ociChars) { UpdateCharShaders(ociChar.GetChaControl()); } } } }
//No studio for EC private static void RegisterStudioControls() { if (!StudioAPI.InsideStudio) { return; } var pushupBraToggle = new CurrentStateCategorySwitch("Pushup Bra", ocichar => ocichar.charInfo.GetComponent <PushupController>().CurrentBraData.EnablePushup); StudioAPI.GetOrCreateCurrentStateCategory("Pushup").AddControl(pushupBraToggle); pushupBraToggle.Value.Subscribe(value => { var controller = GetSelectedController(); if (controller == null) { return; } if (controller.CurrentBraData.EnablePushup != value) { controller.CurrentBraData.EnablePushup = value; controller.RecalculateBody(); } }); var pushupTopToggle = new CurrentStateCategorySwitch("Pushup Top", ocichar => ocichar.charInfo.GetComponent <PushupController>().CurrentTopData.EnablePushup); StudioAPI.GetOrCreateCurrentStateCategory("Pushup").AddControl(pushupTopToggle); pushupTopToggle.Value.Subscribe(value => { var controller = GetSelectedController(); if (controller == null) { return; } if (controller.CurrentTopData.EnablePushup != value) { controller.CurrentTopData.EnablePushup = value; controller.RecalculateBody(); } }); }
private static void RegisterStudioControls() { var invisibleSwitch = new CurrentStateCategorySwitch("Shaking Eye Highlights", controller => controller.charInfo.GetComponent <EyeShakingController>().EyeShaking); invisibleSwitch.Value.Subscribe(Observer.Create((bool value) => { bool first = true; foreach (var controller in StudioAPI.GetSelectedControllers <EyeShakingController>()) { //Prevent changing other characters when the value did not actually change if (first && controller.EyeShaking == value) { break; } first = false; controller.EyeShaking = value; } })); StudioAPI.GetOrCreateCurrentStateCategory("").AddControl(invisibleSwitch); }
private void RegisterStudioControls() { var slider_AngleAnkle = CreateSlider(displaySettings.Ankle_Angle, ctrl => ctrl.AnkleAngle, (ctrl, f) => ctrl.AnkleAngle = f, 0f, 60f); var slider_AngleLeg = CreateSlider(displaySettings.Leg_Angle, ctrl => ctrl.LegAngle, (ctrl, f) => ctrl.LegAngle = f, 0f, 60f); var slider_Height = CreateSlider(displaySettings.Height, ctrl => ctrl.Height, (ctrl, f) => ctrl.Height = f, 0f, 0.5f); StudioAPI.GetOrCreateCurrentStateCategory(displaySettings.Stiletto).AddControls(slider_AngleAnkle, slider_AngleLeg, slider_Height); CurrentStateCategorySlider CreateSlider(string name, Func <HeelInfo, float> get, Action <HeelInfo, float> set, float minValue, float maxValue) { var slider = new CurrentStateCategorySlider(name, (chara) => get(chara.charInfo.GetComponent <HeelInfo>()), minValue, maxValue); slider.Value.Subscribe(x => { foreach (var heelInfo in StudioAPI.GetSelectedCharacters().Select(y => y.charInfo.gameObject.GetComponent <HeelInfo>())) { set(heelInfo, x); } }); return(slider); } }
private static Human GetCurrentVisibleGirl() { if (MakerAPI.InsideMaker) { return(MakerAPI.GetCharacterControl()); } var m = GameObject.Find("CharaPosition/MainFemale"); var f = m?.GetComponentInChildren <Female>(); if (f != null) { return(f); } if (StudioAPI.InsideStudio) { var c = StudioAPI.GetSelectedControllers <BoneController>().FirstOrDefault(); return(c?.ChaControl); } return((Human)FindObjectOfType <Female>() ?? FindObjectOfType <Male>()); }
private static void RegisterStudioControls() { var cat = StudioAPI.GetOrCreateCurrentStateCategory(null); cat.AddControl(new CurrentStateCategorySlider("Pregnancy", c => { if (c.charInfo == null) { return(0); } var controller = c.charInfo.GetComponent <PregnancyCharaController>(); if (controller == null) { return(0); } return(controller.Data.Week); }, 0, 40)) .Value.Subscribe(f => { foreach (var ctrl in StudioAPI.GetSelectedControllers <PregnancyCharaController>()) { ctrl.Data.Week = Mathf.RoundToInt(f); } }); }
public static void RegisterStudioControllerBasic() { if (!StudioAPI.InsideStudio) { return; } var bpEnable = new CurrentStateCategorySwitch("Enable BP Controller", c => StudioAPI.GetSelectedControllers <BetterPenetrationController>().First().enabled); bpEnable.Value.Subscribe(value => { foreach (var controller in StudioAPI.GetSelectedControllers <BetterPenetrationController>()) { if (value == false) { controller.ClearDanAgent(); controller.enabled = false; } else { controller.enabled = true; controller.InitializeDanAgent(); controller.AddDanConstraints(nodeConstraintPlugin); } } }); StudioAPI.GetOrCreateCurrentStateCategory(StudioCategoryName).AddControl(bpEnable); var colliderRadiusScale = new CurrentStateCategorySlider("Collilder Radius Scale", c => StudioAPI.GetSelectedControllers <BetterPenetrationController>().First().DanColliderRadiusScale, 0.5f, 1.5f); colliderRadiusScale.Value.Subscribe(value => { foreach (var controller in StudioAPI.GetSelectedControllers <BetterPenetrationController>()) { controller.DanColliderRadiusScale = value; } }); StudioAPI.GetOrCreateCurrentStateCategory(StudioCategoryName).AddControl(colliderRadiusScale); var colliderLengthScale = new CurrentStateCategorySlider("Collilder Length Scale", c => StudioAPI.GetSelectedControllers <BetterPenetrationController>().First().DanColliderLengthScale, 0.5f, 1.5f); colliderLengthScale.Value.Subscribe(value => { foreach (var controller in StudioAPI.GetSelectedControllers <BetterPenetrationController>()) { controller.DanColliderLengthScale = value; } }); StudioAPI.GetOrCreateCurrentStateCategory(StudioCategoryName).AddControl(colliderLengthScale); var lengthSlider = new CurrentStateCategorySlider("Length Squish", c => StudioAPI.GetSelectedControllers <BetterPenetrationController>().First().DanLengthSquish, 0f, 1f); lengthSlider.Value.Subscribe(value => { foreach (var controller in StudioAPI.GetSelectedControllers <BetterPenetrationController>()) { controller.DanLengthSquish = value; } }); StudioAPI.GetOrCreateCurrentStateCategory(StudioCategoryName).AddControl(lengthSlider); var girthSlider = new CurrentStateCategorySlider("Girth Squish", c => StudioAPI.GetSelectedControllers <BetterPenetrationController>().First().DanGirthSquish, 0f, 2f); girthSlider.Value.Subscribe(value => { foreach (var controller in StudioAPI.GetSelectedControllers <BetterPenetrationController>()) { controller.DanGirthSquish = value; } }); StudioAPI.GetOrCreateCurrentStateCategory(StudioCategoryName).AddControl(girthSlider); var thresholdSlider = new CurrentStateCategorySlider("Squish Threshold", c => StudioAPI.GetSelectedControllers <BetterPenetrationController>().First().DanSquishThreshold, 0f, 1f); thresholdSlider.Value.Subscribe(value => { foreach (var controller in StudioAPI.GetSelectedControllers <BetterPenetrationController>()) { controller.DanSquishThreshold = value; } }); StudioAPI.GetOrCreateCurrentStateCategory(StudioCategoryName).AddControl(thresholdSlider); var autoTargeter = new CurrentStateCategoryDropdown("Auto-Target", new string[] { "Off", "Vaginal", "Anal", "Oral" }, c => StudioAPI.GetSelectedControllers <BetterPenetrationController>().First().DanAutoTarget); autoTargeter.Value.Subscribe(value => { foreach (var controller in StudioAPI.GetSelectedControllers <BetterPenetrationController>()) { controller.DanAutoTarget = value; } }); StudioAPI.GetOrCreateCurrentStateCategory(StudioCategoryName).AddControl(autoTargeter); var maxPush = new CurrentStateCategorySlider("Max Push", c => StudioAPI.GetSelectedControllers <BetterPenetrationController>().First().MaxPush, 0f, 0.3f); maxPush.Value.Subscribe(value => { foreach (var controller in StudioAPI.GetSelectedControllers <BetterPenetrationController>()) { controller.MaxPush = value; } }); StudioAPI.GetOrCreateCurrentStateCategory(StudioCategoryName).AddControl(maxPush); var maxPull = new CurrentStateCategorySlider("Max Pull", c => StudioAPI.GetSelectedControllers <BetterPenetrationController>().First().MaxPull, 0f, 0.3f); maxPull.Value.Subscribe(value => { foreach (var controller in StudioAPI.GetSelectedControllers <BetterPenetrationController>()) { controller.MaxPull = value; } }); StudioAPI.GetOrCreateCurrentStateCategory(StudioCategoryName).AddControl(maxPull); var pullRate = new CurrentStateCategorySlider("Pull Rate", c => StudioAPI.GetSelectedControllers <BetterPenetrationController>().First().PullRate, 0f, 50f); pullRate.Value.Subscribe(value => { foreach (var controller in StudioAPI.GetSelectedControllers <BetterPenetrationController>()) { controller.PullRate = value; } }); StudioAPI.GetOrCreateCurrentStateCategory(StudioCategoryName).AddControl(pullRate); var returnRate = new CurrentStateCategorySlider("Return Rate", c => StudioAPI.GetSelectedControllers <BetterPenetrationController>().First().ReturnRate, 0f, 1f); returnRate.Value.Subscribe(value => { foreach (var controller in StudioAPI.GetSelectedControllers <BetterPenetrationController>()) { controller.ReturnRate = value; } }); StudioAPI.GetOrCreateCurrentStateCategory(StudioCategoryName).AddControl(returnRate); var bellyBulgeEnable = new CurrentStateCategorySwitch("Enable Belly Bulge", c => StudioAPI.GetSelectedControllers <BetterPenetrationController>().First().EnableBellyBulge); bellyBulgeEnable.Value.Subscribe(value => { foreach (var controller in StudioAPI.GetSelectedControllers <BetterPenetrationController>()) { controller.EnableBellyBulge = value; } }); StudioAPI.GetOrCreateCurrentStateCategory(StudioCategoryName).AddControl(bellyBulgeEnable); var bellyBulgeScale = new CurrentStateCategorySlider("Belly Bulge Scale", c => StudioAPI.GetSelectedControllers <BetterPenetrationController>().First().BellyBulgeScale, 0.0f, 3.0f); bellyBulgeScale.Value.Subscribe(value => { foreach (var controller in StudioAPI.GetSelectedControllers <BetterPenetrationController>()) { controller.BellyBulgeScale = value; } }); StudioAPI.GetOrCreateCurrentStateCategory(StudioCategoryName).AddControl(bellyBulgeScale); }
private static void RegisterStudioControls() { if (!StudioAPI.InsideStudio) { return; } var breast = new CurrentStateCategorySwitch("Breast", ocichar => ocichar.charInfo.GetComponent <ColliderController>().BreastCollidersEnabled); breast.Value.Subscribe(value => { var controller = GetSelectedController(); if (controller == null) { return; } if (controller.BreastCollidersEnabled != value) { controller.BreastCollidersEnabled = value; controller.ApplyBreastColliders(); } }); #if KK var skirt = new CurrentStateCategorySwitch("Skirt", ocichar => ocichar.charInfo.GetComponent <ColliderController>().SkirtCollidersEnabled); skirt.Value.Subscribe(value => { var controller = GetSelectedController(); if (controller == null) { return; } if (controller.SkirtCollidersEnabled != value) { controller.SkirtCollidersEnabled = value; controller.ApplySkirtColliders(); } }); #endif var floor = new CurrentStateCategorySwitch("Floor", ocichar => ocichar.charInfo.GetComponent <ColliderController>().FloorColliderEnabled); floor.Value.Subscribe(value => { var controller = GetSelectedController(); if (controller == null) { return; } if (controller.FloorColliderEnabled != value) { controller.FloorColliderEnabled = value; controller.ApplyFloorCollider(); } }); StudioAPI.GetOrCreateCurrentStateCategory("Colliders").AddControl(breast); #if KK StudioAPI.GetOrCreateCurrentStateCategory("Colliders").AddControl(skirt); #endif StudioAPI.GetOrCreateCurrentStateCategory("Colliders").AddControl(floor); }
private static void RegisterStudioControls() { if (!StudioAPI.InsideStudio) { return; } List <string> bodyList = new List <string>(); List <string> bodyListDisplay = new List <string>(); foreach (var x in BodyDictionary) { bodyList.Add(x.Value.BodyGUID); bodyListDisplay.Add(x.Value.DisplayName); } var bodyDropdown = new CurrentStateCategoryDropdown("Uncensor", bodyListDisplay.ToArray(), c => BodyIndex()); bodyDropdown.Value.Subscribe(value => { var controller = GetSelectedStudioController(); if (controller != null) { #if AI if (controller.ChaControl.sex == 0) { bodyDropdown.Visible.OnNext(false); return; } else { bodyDropdown.Visible.OnNext(true); } #endif var guid = bodyList[value]; if (controller.BodyData?.BodyGUID != guid) { controller.BodyGUID = guid; controller.UpdateUncensor(); } } }); int BodyIndex() { var controller = GetSelectedStudioController(); return(bodyList.IndexOf(controller.BodyData?.BodyGUID)); } StudioAPI.GetOrCreateCurrentStateCategory(StudioCategoryName).AddControl(bodyDropdown); List <string> penisList = new List <string>(); List <string> penisListDisplay = new List <string>(); foreach (var x in PenisDictionary) { penisList.Add(x.Value.PenisGUID); penisListDisplay.Add(x.Value.DisplayName); } var penisDropdown = new CurrentStateCategoryDropdown("Penis", penisListDisplay.ToArray(), c => PenisIndex()); penisDropdown.Value.Subscribe(value => { var controller = GetSelectedStudioController(); if (controller != null) { var guid = penisList[value]; if (controller.PenisData?.PenisGUID != guid) { controller.PenisGUID = guid; controller.UpdateUncensor(); } } }); int PenisIndex() { var controller = GetSelectedStudioController(); if (controller.PenisData?.PenisGUID == null) { return(penisList.IndexOf(DefaultPenisGUID)); } return(penisList.IndexOf(controller.PenisData.PenisGUID)); } StudioAPI.GetOrCreateCurrentStateCategory(StudioCategoryName).AddControl(penisDropdown); List <string> ballsList = new List <string>(); List <string> ballsListDisplay = new List <string>(); ballsList.Add("None"); ballsListDisplay.Add("None"); foreach (var x in BallsDictionary) { ballsList.Add(x.Value.BallsGUID); ballsListDisplay.Add(x.Value.DisplayName); } var ballsDropdown = new CurrentStateCategoryDropdown("Balls", ballsListDisplay.ToArray(), c => BallsIndex()); ballsDropdown.Value.Subscribe(value => { var controller = GetSelectedStudioController(); if (controller != null) { if (value == 0)//"None" { if (controller.BallsGUID != null) { controller.BallsGUID = null; controller.DisplayBalls = false; controller.UpdateUncensor(); } } else { var guid = ballsList[value]; if (controller.BallsData?.BallsGUID != guid) { controller.BallsGUID = guid; controller.DisplayBalls = true; controller.UpdateUncensor(); } } } }); int BallsIndex() { var controller = GetSelectedStudioController(); if (controller.DisplayBalls == false) { return(ballsList.IndexOf("None")); } if (controller.BallsData?.BallsGUID == null) { return(ballsList.IndexOf(DefaultBallsGUID)); } return(ballsList.IndexOf(controller.BallsData?.BallsGUID)); } StudioAPI.GetOrCreateCurrentStateCategory(StudioCategoryName).AddControl(ballsDropdown); }
private static void RegisterStudioControls() { cat = StudioAPI.GetOrCreateCurrentStateCategory("Pregnancy +"); cat.AddControl(new CurrentStateCategorySwitch("Reset P+ Shape", c => { return(false); })) .Value.Subscribe(f => { if (f == false) { return; } ResetAllSliders(); }); cat.AddControl(new CurrentStateCategorySwitch("Restore Last P+ Shape", c => { return(false); })) .Value.Subscribe(f => { if (f == false) { return; } if (PregnancyPlusPlugin.lastBellyState.HasAnyValue()) { RestoreSliders(PregnancyPlusPlugin.lastBellyState); } }); cat.AddControl(new CurrentStateCategorySwitch(blendshapeText, c => { return(false); })) .Value.Subscribe(f => { if (f == false) { return; } //Open blendshape GUI on click foreach (var ctrl in StudioAPI.GetSelectedControllers <PregnancyPlusCharaController>()) { ctrl.OnOpenBlendShapeSelected(); } }); cat.AddControl(new CurrentStateCategorySlider(inflationSize, c => { var ctrl = GetCharCtrl(c); return(ctrl != null ? ctrl.infConfig.inflationSize : 0); }, SliderRange.inflationSize[0], SliderRange.inflationSize[1] )) .Value.Subscribe(f => { foreach (var ctrl in StudioAPI.GetSelectedControllers <PregnancyPlusCharaController>()) { if (ctrl.infConfig.inflationSize == f) { continue; } ctrl.infConfig.inflationSize = f; ctrl.MeshInflate(); } }); cat.AddControl(new CurrentStateCategorySlider(inflationMultiplier, c => { var ctrl = GetCharCtrl(c); return(ctrl != null ? ctrl.infConfig.inflationMultiplier: 0); }, SliderRange.inflationMultiplier[0], SliderRange.inflationMultiplier[1] )) .Value.Subscribe(f => { foreach (var ctrl in StudioAPI.GetSelectedControllers <PregnancyPlusCharaController>()) { if (ctrl.infConfig.inflationMultiplier == f) { continue; } ctrl.infConfig.inflationMultiplier = f; ctrl.MeshInflate(); } }); cat.AddControl(new CurrentStateCategorySlider(inflationRoundness, c => { var ctrl = GetCharCtrl(c); return(ctrl != null ? ctrl.infConfig.inflationRoundness: 0); }, SliderRange.inflationRoundness[0] * scaleLimits, SliderRange.inflationRoundness[1] * scaleLimits )) .Value.Subscribe(f => { foreach (var ctrl in StudioAPI.GetSelectedControllers <PregnancyPlusCharaController>()) { if (ctrl.infConfig.inflationRoundness == f) { continue; } ctrl.infConfig.inflationRoundness = f; ctrl.MeshInflate(); } }); cat.AddControl(new CurrentStateCategorySlider(inflationMoveY, c => { var ctrl = GetCharCtrl(c); return(ctrl != null ? ctrl.infConfig.inflationMoveY: 0); }, SliderRange.inflationMoveY[0] * scaleLimits, SliderRange.inflationMoveY[1] * scaleLimits )) .Value.Subscribe(f => { foreach (var ctrl in StudioAPI.GetSelectedControllers <PregnancyPlusCharaController>()) { if (ctrl.infConfig.inflationMoveY == f) { continue; } ctrl.infConfig.inflationMoveY = f; ctrl.MeshInflate(); } }); cat.AddControl(new CurrentStateCategorySlider(inflationMoveZ, c => { var ctrl = GetCharCtrl(c); return(ctrl != null ? ctrl.infConfig.inflationMoveZ: 0); }, SliderRange.inflationMoveZ[0] * scaleLimits, SliderRange.inflationMoveZ[1] * scaleLimits )) .Value.Subscribe(f => { foreach (var ctrl in StudioAPI.GetSelectedControllers <PregnancyPlusCharaController>()) { if (ctrl.infConfig.inflationMoveZ == f) { continue; } ctrl.infConfig.inflationMoveZ = f; ctrl.MeshInflate(); } }); cat.AddControl(new CurrentStateCategorySlider(inflationStretchX, c => { var ctrl = GetCharCtrl(c); return(ctrl != null ? ctrl.infConfig.inflationStretchX: 0); }, SliderRange.inflationStretchX[0] * scaleLimits, SliderRange.inflationStretchX[1] * scaleLimits )) .Value.Subscribe(f => { foreach (var ctrl in StudioAPI.GetSelectedControllers <PregnancyPlusCharaController>()) { if (ctrl.infConfig.inflationStretchX == f) { continue; } ctrl.infConfig.inflationStretchX = f; ctrl.MeshInflate(); } }); cat.AddControl(new CurrentStateCategorySlider(inflationStretchY, c => { var ctrl = GetCharCtrl(c); return(ctrl != null ? ctrl.infConfig.inflationStretchY: 0); }, SliderRange.inflationStretchY[0] * scaleLimits, SliderRange.inflationStretchY[1] * scaleLimits )) .Value.Subscribe(f => { foreach (var ctrl in StudioAPI.GetSelectedControllers <PregnancyPlusCharaController>()) { if (ctrl.infConfig.inflationStretchY == f) { continue; } ctrl.infConfig.inflationStretchY = f; ctrl.MeshInflate(); } }); cat.AddControl(new CurrentStateCategorySlider(inflationShiftY, c => { var ctrl = GetCharCtrl(c); return(ctrl != null ? ctrl.infConfig.inflationShiftY: 0); }, SliderRange.inflationShiftY[0] * scaleLimits, SliderRange.inflationShiftY[1] * scaleLimits )) .Value.Subscribe(f => { foreach (var ctrl in StudioAPI.GetSelectedControllers <PregnancyPlusCharaController>()) { if (ctrl.infConfig.inflationShiftY == f) { continue; } ctrl.infConfig.inflationShiftY = f; ctrl.MeshInflate(); } }); cat.AddControl(new CurrentStateCategorySlider(inflationShiftZ, c => { var ctrl = GetCharCtrl(c); return(ctrl != null ? ctrl.infConfig.inflationShiftZ: 0); }, SliderRange.inflationShiftZ[0] * scaleLimits, SliderRange.inflationShiftZ[1] * scaleLimits )) .Value.Subscribe(f => { foreach (var ctrl in StudioAPI.GetSelectedControllers <PregnancyPlusCharaController>()) { if (ctrl.infConfig.inflationShiftZ == f) { continue; } ctrl.infConfig.inflationShiftZ = f; ctrl.MeshInflate(); } }); cat.AddControl(new CurrentStateCategorySlider(inflationTaperY, c => { var ctrl = GetCharCtrl(c); return(ctrl != null ? ctrl.infConfig.inflationTaperY: 0); }, SliderRange.inflationTaperY[0] * scaleLimits, SliderRange.inflationTaperY[1] * scaleLimits )) .Value.Subscribe(f => { foreach (var ctrl in StudioAPI.GetSelectedControllers <PregnancyPlusCharaController>()) { if (ctrl.infConfig.inflationTaperY == f) { continue; } ctrl.infConfig.inflationTaperY = f; ctrl.MeshInflate(); } }); cat.AddControl(new CurrentStateCategorySlider(inflationTaperZ, c => { var ctrl = GetCharCtrl(c); return(ctrl != null ? ctrl.infConfig.inflationTaperZ: 0); }, SliderRange.inflationTaperZ[0] * scaleLimits, SliderRange.inflationTaperZ[1] * scaleLimits )) .Value.Subscribe(f => { foreach (var ctrl in StudioAPI.GetSelectedControllers <PregnancyPlusCharaController>()) { if (ctrl.infConfig.inflationTaperZ == f) { continue; } ctrl.infConfig.inflationTaperZ = f; ctrl.MeshInflate(); } }); cat.AddControl(new CurrentStateCategorySlider(inflationClothOffset, c => { var ctrl = GetCharCtrl(c); return(ctrl != null ? ctrl.infConfig.inflationClothOffset: 0); }, SliderRange.inflationClothOffset[0] * scaleLimits, SliderRange.inflationClothOffset[1] * scaleLimits )) .Value.Subscribe(f => { foreach (var ctrl in StudioAPI.GetSelectedControllers <PregnancyPlusCharaController>()) { if (ctrl.infConfig.inflationClothOffset == f) { continue; } ctrl.infConfig.inflationClothOffset = f; ctrl.MeshInflate(); } }); cat.AddControl(new CurrentStateCategorySlider(inflationFatFold, c => { var ctrl = GetCharCtrl(c); return(ctrl != null ? ctrl.infConfig.inflationFatFold: 0); }, SliderRange.inflationFatFold[0], SliderRange.inflationFatFold[1] )) .Value.Subscribe(f => { foreach (var ctrl in StudioAPI.GetSelectedControllers <PregnancyPlusCharaController>()) { if (ctrl.infConfig.inflationFatFold == f) { continue; } ctrl.infConfig.inflationFatFold = f; ctrl.MeshInflate(); } }); }