// Do Work on Entering/Leaving Maker public void SetupMakerControls(object sender, RegisterCustomControlsEvent eventData) { CharacterAccessoryControlWrapper = MakerAPI.AddEditableAccessoryWindowControl <MakerToggle, bool>(new MakerToggle(new MakerCategory("Accessory", ""), "Character Accessory", this)); AutoMatchHairColorWrapper = MakerAPI.AddEditableAccessoryWindowControl <MakerToggle, bool>(new MakerToggle(new MakerCategory("Accessory", ""), "Match Hair Color on Coord Load", this)); MakerAPI.AddAccessoryWindowControl(new MakerButton("Visibility Rules", null, this)).OnClick.AddListener(VisibilityRulesListener); AccessoriesApi.SelectedMakerAccSlotChanged += UpdateUI; AccessoriesApi.SelectedMakerAccSlotChanged += RefreshAdvancedParents; MakerAPI.ReloadCustomInterface += ReloadCustomInterface; MakerAPI.AddAccessoryWindowControl(new MakerButton("Show", null, this)).OnClick.AddListener(ShowAccessory); MakerAPI.AddAccessoryWindowControl(new MakerButton("Hide", null, this)).OnClick.AddListener(HideAccessory); advancedParentLabel = new MakerText("Adv Parent: None", null, this); MakerAPI.AddAccessoryWindowControl(advancedParentLabel); MakerAPI.AddAccessoryWindowControl(new MakerButton("Advanced Parent", null, this)).OnClick.AddListener(AdvancedParent); if (ShowSlotSettingResyncButton.Value) { MakerAPI.AddAccessoryWindowControl(new MakerButton("Clear and Resync Slot", null, this)).OnClick.AddListener(ClearAndResyncSlot); } CoordinateRulesToggle = MakerAPI.AddSidebarControl(new SidebarToggle("Coordinate Visibility Rules", false, this)); CoordinateRulesToggle.ValueChanged.Subscribe(b => { ShowCoordinateRulesGUI(b); }); MakerControlsRegistered = true; }
private void MakerAPI_MakerBaseLoaded(object s, RegisterCustomControlsEvent e) { InitUI(); #if KK || EC MakerAPI.AddAccessoryWindowControl(new MakerButton("Open Material Editor", null, this)).OnClick.AddListener(delegate { PopulateListAccessory(); }); e.AddControl(new MakerButton("Open Material Editor (Body)", MakerConstants.Face.All, this)).OnClick.AddListener(delegate { PopulateListCharacter("body"); }); e.AddControl(new MakerButton("Open Material Editor (Face)", MakerConstants.Face.All, this)).OnClick.AddListener(delegate { PopulateListCharacter("face"); }); e.AddControl(new MakerButton("Open Material Editor (All)", MakerConstants.Face.All, this)).OnClick.AddListener(delegate { PopulateListCharacter(); }); e.AddControl(new MakerButton("Open Material Editor", MakerConstants.Clothes.Top, this)).OnClick.AddListener(delegate { PopulateListClothes(0); }); e.AddControl(new MakerButton("Open Material Editor", MakerConstants.Clothes.Bottom, this)).OnClick.AddListener(delegate { PopulateListClothes(1); }); e.AddControl(new MakerButton("Open Material Editor", MakerConstants.Clothes.Bra, this)).OnClick.AddListener(delegate { PopulateListClothes(2); }); e.AddControl(new MakerButton("Open Material Editor", MakerConstants.Clothes.Shorts, this)).OnClick.AddListener(delegate { PopulateListClothes(3); }); e.AddControl(new MakerButton("Open Material Editor", MakerConstants.Clothes.Gloves, this)).OnClick.AddListener(delegate { PopulateListClothes(4); }); e.AddControl(new MakerButton("Open Material Editor", MakerConstants.Clothes.Panst, this)).OnClick.AddListener(delegate { PopulateListClothes(5); }); e.AddControl(new MakerButton("Open Material Editor", MakerConstants.Clothes.Socks, this)).OnClick.AddListener(delegate { PopulateListClothes(6); }); #if KK e.AddControl(new MakerButton("Open Material Editor", MakerConstants.Clothes.InnerShoes, this)).OnClick.AddListener(delegate { PopulateListClothes(7); }); e.AddControl(new MakerButton("Open Material Editor", MakerConstants.Clothes.OuterShoes, this)).OnClick.AddListener(delegate { PopulateListClothes(8); }); #else e.AddControl(new MakerButton("Open Material Editor", MakerConstants.Clothes.Shoes, this)).OnClick.AddListener(delegate { PopulateListClothes(7); }); #endif e.AddControl(new MakerButton("Open Material Editor", MakerConstants.Hair.Back, this)).OnClick.AddListener(delegate { PopulateListHair(0); }); e.AddControl(new MakerButton("Open Material Editor", MakerConstants.Hair.Front, this)).OnClick.AddListener(delegate { PopulateListHair(1); }); e.AddControl(new MakerButton("Open Material Editor", MakerConstants.Hair.Side, this)).OnClick.AddListener(delegate { PopulateListHair(2); }); e.AddControl(new MakerButton("Open Material Editor", MakerConstants.Hair.Extension, this)).OnClick.AddListener(delegate { PopulateListHair(3); }); e.AddControl(new MakerButton("Open Material Editor", MakerConstants.Face.Eyebrow, this)).OnClick.AddListener(delegate { PopulateListCharacter("mayuge"); }); e.AddControl(new MakerButton("Open Material Editor", MakerConstants.Face.Eye, this)).OnClick.AddListener(delegate { PopulateListCharacter("eyeline,hitomi"); }); e.AddControl(new MakerButton("Open Material Editor", MakerConstants.Face.Nose, this)).OnClick.AddListener(delegate { PopulateListCharacter("nose"); }); e.AddControl(new MakerButton("Open Material Editor", MakerConstants.Face.Mouth, this)).OnClick.AddListener(delegate { PopulateListCharacter("tang,tooth,canine"); }); #endif }
private void RegisterCustomControls(object sender, RegisterCustomControlsEvent e) { var owner = this; _textureChanged = new Subject <KeyValuePair <string, Texture2D> >(); _refreshInterface = new Subject <string>(); var loadToggle = e.AddLoadToggle(new MakerLoadToggle("Clothes overlays")); loadToggle.ValueChanged.Subscribe(newValue => GetControllerRegistration().MaintainState = !newValue); var coordLoadToggle = e.AddCoordinateLoadToggle(new MakerCoordinateLoadToggle("Clothes overlays")); coordLoadToggle.ValueChanged.Subscribe(newValue => GetControllerRegistration().MaintainCoordinateState = !newValue); var makerCategory = MakerConstants.GetBuiltInCategory("03_ClothesTop", "tglTop"); // Either the 3 subs will be visible or the one main. 1st separator is made by the API SetupTexControls(e, makerCategory, owner, KoiClothesOverlayMgr.SubClothesNames[0], "Overlay textures (Piece 1)"); SetupTexControls(e, makerCategory, owner, KoiClothesOverlayMgr.SubClothesNames[1], "Overlay textures (Piece 2)", true); SetupTexControls(e, makerCategory, owner, KoiClothesOverlayMgr.SubClothesNames[2], "Overlay textures (Piece 3)", true); SetupTexControls(e, makerCategory, owner, KoiClothesOverlayMgr.MainClothesNames[0]); SetupTexControls(e, makerCategory, owner, MaskKind.BodyMask.ToString(), "Body alpha mask", true); SetupTexControls(e, makerCategory, owner, MaskKind.InnerMask.ToString(), "Inner clothes alpha mask", true); SetupTexControls(e, makerCategory, owner, MaskKind.BraMask.ToString(), "Bra alpha mask", true); var cats = new[]
private void MakerAPI_MakerBaseLoaded(object s, RegisterCustomControlsEvent e) { InitUI(); #if AI var ButtonAllLocation = MakerConstants.Body.All; #else var ButtonAllLocation = MakerConstants.Face.All; #endif MakerAPI.AddAccessoryWindowControl(new MakerButton("Open Material Editor", null, this)).OnClick.AddListener(delegate { PopulateListAccessory(); }); e.AddControl(new MakerButton("Open Material Editor (Body)", ButtonAllLocation, this)).OnClick.AddListener(delegate { PopulateListBody(); }); e.AddControl(new MakerButton("Open Material Editor (Face)", ButtonAllLocation, this)).OnClick.AddListener(delegate { PopulateListFace(); }); e.AddControl(new MakerButton("Open Material Editor (All)", ButtonAllLocation, this)).OnClick.AddListener(delegate { PopulateListCharacter(); }); #if !AI e.AddControl(new MakerButton("Open Material Editor", MakerConstants.Clothes.Top, this)).OnClick.AddListener(delegate { PopulateListClothes(0); }); e.AddControl(new MakerButton("Open Material Editor", MakerConstants.Clothes.Bottom, this)).OnClick.AddListener(delegate { PopulateListClothes(1); }); e.AddControl(new MakerButton("Open Material Editor", MakerConstants.Clothes.Bra, this)).OnClick.AddListener(delegate { PopulateListClothes(2); }); e.AddControl(new MakerButton("Open Material Editor", MakerConstants.Clothes.Shorts, this)).OnClick.AddListener(delegate { PopulateListClothes(3); }); e.AddControl(new MakerButton("Open Material Editor", MakerConstants.Clothes.Gloves, this)).OnClick.AddListener(delegate { PopulateListClothes(4); }); e.AddControl(new MakerButton("Open Material Editor", MakerConstants.Clothes.Panst, this)).OnClick.AddListener(delegate { PopulateListClothes(5); }); e.AddControl(new MakerButton("Open Material Editor", MakerConstants.Clothes.Socks, this)).OnClick.AddListener(delegate { PopulateListClothes(6); }); #if KK e.AddControl(new MakerButton("Open Material Editor", MakerConstants.Clothes.InnerShoes, this)).OnClick.AddListener(delegate { PopulateListClothes(7); }); e.AddControl(new MakerButton("Open Material Editor", MakerConstants.Clothes.OuterShoes, this)).OnClick.AddListener(delegate { PopulateListClothes(8); }); #else e.AddControl(new MakerButton("Open Material Editor", MakerConstants.Clothes.Shoes, this)).OnClick.AddListener(delegate { PopulateListClothes(7); }); #endif e.AddControl(new MakerButton("Open Material Editor", MakerConstants.Hair.Back, this)).OnClick.AddListener(delegate { PopulateListHair(0); }); e.AddControl(new MakerButton("Open Material Editor", MakerConstants.Hair.Front, this)).OnClick.AddListener(delegate { PopulateListHair(1); }); e.AddControl(new MakerButton("Open Material Editor", MakerConstants.Hair.Side, this)).OnClick.AddListener(delegate { PopulateListHair(2); }); e.AddControl(new MakerButton("Open Material Editor", MakerConstants.Hair.Extension, this)).OnClick.AddListener(delegate { PopulateListHair(3); }); #endif }
private void MakerAPI_Enter(object sender, RegisterCustomControlsEvent e) { var camLight = GameObject.Find("CustomScene/CamBase/Camera/Directional Light").transform; lockCamlightToggle = e.AddSidebarControl(new SidebarToggle("Lock Cameralight", false, this)); lockCamlightToggle.Value = false; lockCamlightToggle.ValueChanged.Subscribe(x => { if (camLight == null) { return; } if (x) { oldParent = camLight.parent.gameObject; newParent = new GameObject("CamLightLock"); newParent.transform.position = oldParent.transform.position; newParent.transform.eulerAngles = oldParent.transform.eulerAngles; camLight.parent = newParent.transform; } else if (oldParent != null) { camLight.parent = oldParent.transform; camLight.transform.localEulerAngles = new Vector3(0, 3, 0); Destroy(newParent); newParent = null; } }); }
private void MakerAPI_Enter(object sender, RegisterCustomControlsEvent e) { cc = MakerAPI.GetCharacterControl(); blinkFlag = cc.GetEyesBlinkFlag(); //Logger.LogDebug("on enter: " + blinkFlag); sidebarToggle = e.AddSidebarControl(new SidebarToggle("Disable eye blink", true, this)); sidebarToggle.Value = blinkFlag; sidebarToggle.ValueChanged.Subscribe(b => BlinkToggle()); //need to fix so BlinkToggle doesn't get called when control is created }
/// <summary> /// Register the custom controls /// </summary> /// <param name="s"></param> /// <param name="e"></param> private void MakerAPI_MakerBaseLoaded(object s, RegisterCustomControlsEvent e) { #if KK || EC || KKS var category = MakerConstants.Face.Eye; #else var category = MakerConstants.Face.Eyes; #endif EyeOpenMaxSlider = e.AddControl(new MakerSlider(category, "Eye Open Max", 0, 1, 1, this)); EyeOpenMaxSlider.ValueChanged.Subscribe(value => GetCharaController(MakerAPI.GetCharacterControl()).EyeOpenMax = value); DisableBlinkingToggle = e.AddControl(new MakerToggle(category, "Disable Character Blinking", this)); DisableBlinkingToggle.ValueChanged.Subscribe(value => GetCharaController(MakerAPI.GetCharacterControl()).DisableBlinking = value); }
private void MakerAPI_Enter(object sender, RegisterCustomControlsEvent e) { var cha = Singleton <ChaControl> .Instance; var cbase = Singleton <CustomBase> .Instance; var camLight = GameObject.Find("CharaCustom/CustomControl/CharaCamera/Main Camera/Lights Custom/Directional Light Key").transform; var backLight = GameObject.Find("CharaCustom/CustomControl/CharaCamera/Main Camera/Lights Custom/Directional Light Back").transform; lockCamlightToggle = e.AddSidebarControl(new SidebarToggle("Lock Cameralight", false, this)); lockCamlightToggle.Value = false; lockCamlightToggle.ValueChanged.Subscribe(x => { if (camLight == null) { return; } if (x) { oldParent = camLight.parent.gameObject; newParent = new GameObject("CamLightLock"); newParent.transform.position = oldParent.transform.position; newParent.transform.eulerAngles = oldParent.transform.eulerAngles; camLight.parent = newParent.transform; } else if (oldParent != null) { camLight.parent = oldParent.transform; cbase.ResetLightSetting(); Destroy(newParent); newParent = null; } }); backlightToggle = e.AddSidebarControl(new SidebarToggle("Toggle Backlight", true, this)); backlightToggle.Value = true; backlightToggle.ValueChanged.Subscribe(b => { backLight.gameObject.SetActive(b); }); blinkingToggle = e.AddSidebarControl(new SidebarToggle("Toggle Blinking", true, this)); blinkingToggle.Value = true; blinkingToggle.ValueChanged.Subscribe(b => { cha.ChangeEyesBlinkFlag(b); }); }
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 RegisterCustomControls(RegisterCustomControlsEvent callback) { foreach (var categoryBones in InterfaceData.BoneControls.GroupBy(x => x.Category)) { var category = categoryBones.Key; var first = true; foreach (var boneMeta in categoryBones) { if (boneMeta.IsSeparator || !first) { callback.AddControl(new MakerSeparator(category, this) { TextColor = _settingColor }); } RegisterSingleControl(category, boneMeta, callback); first = false; } if (ReferenceEquals(category, InterfaceData.BodyHands)) { if (!first) { callback.AddControl(new MakerSeparator(category, this) { TextColor = _settingColor }); } RegisterFingerControl(category, callback); } } callback.AddLoadToggle(new MakerLoadToggle("Bonemod")) .ValueChanged.Subscribe(b => GetRegistration().MaintainState = !b); callback.AddCoordinateLoadToggle(new MakerCoordinateLoadToggle("Bonemod")) .ValueChanged.Subscribe(b => GetRegistration().MaintainCoordinateState = !b); callback.AddSidebarControl(new SidebarToggle("Show advanced bonemod controls", false, this)) .ValueChanged.Subscribe(b => gameObject.GetComponent <KKABMX_AdvancedGUI>().enabled = b); }
private IEnumerator LoadPlugin(RegisterCustomControlsEvent e) { var sw = Stopwatch.StartNew(); try { _boneSliderLookup = new Dictionary <Slider, Func <IEnumerable <Transform> > >(); LoadShaders(); LoadHighlightBody(MakerAPI.GetCharacterControl()); _hi = Harmony.CreateAndPatchAll(typeof(Hooks)); InitializeBodySliders(); InitializeFaceSliders(); // todo waste of space on sidebar? // var toggle = e.AddSidebarControl(new SidebarToggle("Highlight on hover", _enabled.Value, this)); // toggle.ValueChanged.Subscribe(b => _enabled.Value = b); // _enabled.SettingChanged += (sender, args) => // { // if (!toggle.IsDisposed) toggle.Value = _enabled.Value; // }; } catch (Exception) { Dispose(); throw; } sw.Stop(); // Need to wait for ABMX sliders to get instantiated yield return(new WaitUntil(() => MakerAPI.InsideAndLoaded)); sw.Start(); InitializeAbmxSliders(); ScreenshotManager.OnPreCapture += OnScreenshotPreCapture; ScreenshotManager.OnPostCapture += OnScreenshotPostCapture; Logger.LogDebug($"Initialized in {sw.ElapsedMilliseconds}ms"); }
private void RegisterCustomControls(object sender, RegisterCustomControlsEvent e) { var owner = this; _textureChanged = new Subject <KeyValuePair <string, ClothesTexData> >(); _refreshInterface = new Subject <int>(); var loadToggle = e.AddLoadToggle(new MakerLoadToggle("Clothes overlays")); loadToggle.ValueChanged.Subscribe(newValue => GetControllerRegistration().MaintainState = !newValue); var coordLoadToggle = e.AddCoordinateLoadToggle(new MakerCoordinateLoadToggle("Clothes overlays")); coordLoadToggle.ValueChanged.Subscribe(newValue => GetControllerRegistration().MaintainCoordinateState = !newValue); var makerCategory = MakerConstants.GetBuiltInCategory("03_ClothesTop", "tglTop"); SetupTexControls(e, makerCategory, owner, KoiClothesOverlayMgr.SubClothesNames[0], 0, "Overlay textures (Piece 1)"); SetupTexControls(e, makerCategory, owner, KoiClothesOverlayMgr.SubClothesNames[1], 0, "Overlay textures (Piece 2)", true); SetupTexControls(e, makerCategory, owner, KoiClothesOverlayMgr.SubClothesNames[2], 0, "Overlay textures (Piece 3)", true); SetupTexControls(e, makerCategory, owner, KoiClothesOverlayMgr.MainClothesNames[0], 0); var cats = new[] { new KeyValuePair <string, string>("tglBot", "ct_clothesBot"), new KeyValuePair <string, string>("tglBra", "ct_bra"), new KeyValuePair <string, string>("tglShorts", "ct_shorts"), new KeyValuePair <string, string>("tglGloves", "ct_gloves"), new KeyValuePair <string, string>("tglPanst", "ct_panst"), new KeyValuePair <string, string>("tglSocks", "ct_socks"), new KeyValuePair <string, string>("tglInnerShoes", "ct_shoes_inner"), new KeyValuePair <string, string>("tglOuterShoes", "ct_shoes_outer") }; for (var index = 0; index < cats.Length; index++) { var pair = cats[index]; SetupTexControls(e, MakerConstants.GetBuiltInCategory("03_ClothesTop", pair.Key), owner, pair.Value, index + 1); } GetOverlayController().CurrentCoordinate.Subscribe(type => RefreshInterface(-1)); }
private void OnEarlyMakerFinishedLoading(object sender, RegisterCustomControlsEvent e) { _boneController = FindObjectOfType <BoneController>(); if (_boneController == null) { Logger.Log(LogLevel.Error, "[KKABMX_GUI] Failed to find a BoneController or there are no bone modifiers"); return; } _boneController.NewDataLoaded += (s, args) => { foreach (var action in _updateActionList) { action(); } }; gameObject.AddComponent <KKABMX_AdvancedGUI>().enabled = false; RegisterCustomControls(e); }
private static void RegisterMakerControls(BaseUnityPlugin skinEffectsPlugin, RegisterCustomControlsEvent e) { // Doesn't apply to male characters if (MakerAPI.GetMakerSex() == 0) { return; } var cat = MakerConstants.GetBuiltInCategory("05_ParameterTop", "tglH"); e.AddControl(new MakerToggle(cat, "Stretched hymen", false, skinEffectsPlugin)) .BindToFunctionController <SkinEffectsController, bool>(controller => controller.StretchedHymen, (controller, value) => controller.StretchedHymen = value); e.AddControl(new MakerText("Makes it much less likely that she will bleed during the first time.", cat, skinEffectsPlugin)).TextColor = new Color(0.7f, 0.7f, 0.7f); e.AddControl(new MakerToggle(cat, "Hymen regenerates", false, skinEffectsPlugin)) .BindToFunctionController <SkinEffectsController, bool>(controller => controller.HymenRegen, (controller, value) => controller.HymenRegen = value); e.AddControl(new MakerText("The hymen grows back after a good night's sleep (to the state before sex).", cat, skinEffectsPlugin)).TextColor = new Color(0.7f, 0.7f, 0.7f); e.AddControl(new MakerToggle(cat, "Fragile v****a", false, skinEffectsPlugin)) .BindToFunctionController <SkinEffectsController, bool>(controller => controller.FragileVag, (controller, value) => controller.FragileVag = value); e.AddControl(new MakerText("When going at it very roughly has a chance to bleed, be gentle!", cat, skinEffectsPlugin)).TextColor = new Color(0.7f, 0.7f, 0.7f); }
private static void MakerAPI_MakerBaseLoaded(object sender, RegisterCustomControlsEvent e) { // Replace the stock skin type selection window with a dropdown // This is because the dropdown icons are all NSFW // This part creates the new control var chaListCtrl = Singleton <Character> .Instance.chaListCtrl; var categoryInfo = chaListCtrl.GetCategoryInfo(ChaListDefine.CategoryNo.mt_body_detail); var headValues = categoryInfo.Values.ToList(); _skinTypeReplacementControl = e.AddControl(new MakerDropdown("Skin type", headValues.Select(x => x.Name).ToArray(), MakerConstants.Body.All, 0, null)); MakerAPI.ReloadCustomInterface += (o, args) => _skinTypeReplacementControl.Value = headValues.FindIndex(i => i.Id == MakerAPI.GetCharacterControl().chaFile.custom.body.detailId); _skinTypeReplacementControl.ValueChanged.Subscribe(x => { var newId = headValues[x].Id; var chaControl = MakerAPI.GetCharacterControl(); var body = chaControl.chaFile.custom.body; if (body.detailId != newId) { body.detailId = newId; chaControl.ChangeSettingBodyDetail(); } }); }
private void MakerAPI_Enter(object sender, RegisterCustomControlsEvent e) { GameObject.Find("CanvasSub/SettingWindow/WinBody/B_ShapeBreast/Scroll View/Viewport/Content/SliderSet/Slider").GetComponent <Slider>().maxValue = 0.5f; }
private static void MakerStartedLoading(object sender, RegisterCustomControlsEvent e) { CardNameTranslationManager.ClearCaches(); }
private void RegisterFingerControl(MakerCategory category, RegisterCustomControlsEvent callback) { var rbSide = callback.AddControl(new MakerRadioButtons(category, this, "Hand to edit", "Both", "Left", "Right") { TextColor = _settingColor }); var rbFing = callback.AddControl(new MakerRadioButtons(category, this, "Finger to edit", "All", "1", "2", "3", "4", "5") { TextColor = _settingColor }); var rbSegm = callback.AddControl(new MakerRadioButtons(category, this, "Segment to edit", "Base", "Center", "Tip") { TextColor = _settingColor }); IEnumerable <string> GetFingerBoneNames() { var fingers = rbFing.Value == 0 ? InterfaceData.FingerNamePrefixes : new[] { InterfaceData.FingerNamePrefixes[rbFing.Value - 1] }; var segmented = fingers.Select(fName => $"{fName}0{rbSegm.Value + 1}").ToList(); var sided = Enumerable.Empty <string>(); if (rbSide.Value <= 1) { sided = segmented.Select(s => s + "_L"); } if (rbSide.Value == 0 || rbSide.Value == 2) { sided = sided.Concat(segmented.Select(s => s + "_R")); } return(sided); } var maxFingerValue = RaiseLimits.Value ? 3 * LimitRaiseAmount : 3; var x = callback.AddControl(new MakerSlider(category, "Scale X", 0, maxFingerValue, 1, this) { TextColor = _settingColor }); var y = callback.AddControl(new MakerSlider(category, "Scale Y", 0, maxFingerValue, 1, this) { TextColor = _settingColor }); var z = callback.AddControl(new MakerSlider(category, "Scale Z", 0, maxFingerValue, 1, this) { TextColor = _settingColor }); void UpdateDisplay(int _) { var boneMod = _boneController.GetModifier(GetFingerBoneNames().First()); var mod = boneMod?.GetModifier(_boneController.CurrentCoordinate.Value); SetSliders(mod?.ScaleModifier ?? Vector3.one); } var isUpdatingValue = false; void SetSliders(Vector3 mod) { isUpdatingValue = true; if (x != null) { x.Value = mod.x; } if (y != null) { y.Value = mod.y; } if (z != null) { z.Value = mod.z; } isUpdatingValue = false; } void PushValueToControls() { UpdateDisplay(0); } _updateActionList.Add(PushValueToControls); PushValueToControls(); rbSide.ValueChanged.Subscribe(UpdateDisplay); rbFing.ValueChanged.Subscribe(UpdateDisplay); rbSegm.ValueChanged.Subscribe(UpdateDisplay); void PullValuesToBone(float _) { if (isUpdatingValue) { return; } foreach (var boneName in GetFingerBoneNames()) { var bone = _boneController.GetModifier(boneName); var newValue = new Vector3(x.Value, y.Value, z.Value); if (bone == null) { if (newValue == Vector3.one) { return; } bone = new BoneModifier(boneName); _boneController.AddModifier(bone); } var mod = bone.GetModifier(_boneController.CurrentCoordinate.Value); mod.ScaleModifier = newValue; } } var obs = Observer.Create <float>(PullValuesToBone); x?.ValueChanged.Subscribe(obs); y?.ValueChanged.Subscribe(obs); z?.ValueChanged.Subscribe(obs); }
private static void MakerStartupTimerStart(object sender, RegisterCustomControlsEvent e) { _makerStartupStart = Time.realtimeSinceStartup; MakerAPI.MakerFinishedLoading += MakerStartupTimer; }
private void SetupTexControls(RegisterCustomControlsEvent e, MakerCategory makerCategory, BaseUnityPlugin owner, TexType texType, string title) { var radButtons = texType == TexType.EyeOver || texType == TexType.EyeUnder ? e.AddControl(new MakerRadioButtons(makerCategory, owner, "Eye to edit", "Both", "Left", "Right")) : null; TexType GetTexType(bool cantBeBoth) { if (radButtons != null) { if (radButtons.Value == 0) { return(cantBeBoth ? texType + 2 : texType); // left or both } if (radButtons.Value == 1) { return(texType + 2); // left } if (radButtons.Value == 2) { return(texType + 4); // right } } return(texType); } e.AddControl(new MakerText(title, makerCategory, owner)); var forceAllowBoth = false; var bi = e.AddControl(new MakerImage(null, makerCategory, owner) { Height = 150, Width = 150 }); _textureChanged.Subscribe( d => { var incomingType = d.Key; if (!forceAllowBoth) { // If left and right images are different, and we have Both selected, change selection to Left instead var currentType = GetTexType(false); if (radButtons != null && (currentType == TexType.EyeOver && incomingType == TexType.EyeOverR || currentType == TexType.EyeUnder && incomingType == TexType.EyeUnderR)) { var leftTex = GetTex(GetTexType(true)); if (d.Value != leftTex) { radButtons.Value = 1; } else { radButtons.Value = 0; } } } if (incomingType == GetTexType(true) || incomingType == GetTexType(false)) { bi.Texture = d.Value; } }); e.AddControl(new MakerButton("Load new texture", makerCategory, owner)) .OnClick.AddListener( () => OpenFileDialog.Show(strings => OnFileAccept(strings, GetTexType(false)), "Open overlay image", GetDefaultLoadDir(), FileFilter, FileExt)); e.AddControl(new MakerButton("Clear texture", makerCategory, owner)) .OnClick.AddListener(() => SetTexAndUpdate(null, GetTexType(false))); e.AddControl(new MakerButton("Export current texture", makerCategory, owner)) .OnClick.AddListener( () => { try { var tex = GetTex(GetTexType(true)); if (tex == null) { return; } WriteAndOpenPng(tex.EncodeToPNG(), GetTexType(false).ToString()); } catch (Exception ex) { Logger.LogMessage("Failed to export texture - " + ex.Message); } }); radButtons?.ValueChanged.Subscribe(i => { forceAllowBoth = true; var safeType = GetTexType(true); _textureChanged.OnNext(new KeyValuePair <TexType, Texture2D>(safeType, GetTex(safeType))); forceAllowBoth = false; }); Texture2D GetTex(TexType type) { var ctrl = GetOverlayController(); var overlayTexture = ctrl.OverlayStorage.GetTexture(type); return(overlayTexture); } }
private static void MakerStartedLoading(object sender, RegisterCustomControlsEvent e) { TranslationHelper.NotifyBehaviorChanged(e); }
private void RegisterSingleControl(MakerCategory category, BoneMeta boneMeta, RegisterCustomControlsEvent callback) { MakerRadioButtons rb = null; if (!string.IsNullOrEmpty(boneMeta.RightBoneName)) { rb = callback.AddControl(new MakerRadioButtons(category, this, "Side to edit", "Both", "Left", "Right") { TextColor = _settingColor }); } var max = RaiseLimits.Value ? boneMeta.Max * LimitRaiseAmount : boneMeta.Max; var lMax = RaiseLimits.Value ? boneMeta.LMax * LimitRaiseAmount : boneMeta.LMax; var x = boneMeta.X ? callback.AddControl(new MakerSlider(category, boneMeta.XDisplayName, boneMeta.Min, max, 1, this) { TextColor = _settingColor }) : null; var y = boneMeta.Y ? callback.AddControl(new MakerSlider(category, boneMeta.YDisplayName, boneMeta.Min, max, 1, this) { TextColor = _settingColor }) : null; var z = boneMeta.Z ? callback.AddControl(new MakerSlider(category, boneMeta.ZDisplayName, boneMeta.Min, max, 1, this) { TextColor = _settingColor }) : null; var l = boneMeta.L ? callback.AddControl(new MakerSlider(category, boneMeta.LDisplayName, boneMeta.LMin, lMax, 1, this) { TextColor = _settingColor }) : null; var isUpdatingValue = false; void SetSliders(Vector3 mod, float lenMod) { isUpdatingValue = true; if (x != null) { x.Value = mod.x; } if (y != null) { y.Value = mod.y; } if (z != null) { z.Value = mod.z; } if (l != null) { l.Value = lenMod; } isUpdatingValue = false; } void PushValueToControls() { var bone = GetBoneModifier(boneMeta.BoneName, boneMeta.UniquePerCoordinate); if (bone == null) { SetSliders(Vector3.one, 1f); return; } if (rb != null) { var bone2 = GetBoneModifier(boneMeta.RightBoneName, boneMeta.UniquePerCoordinate); if (bone.ScaleModifier != bone2.ScaleModifier) { if (rb.Value == 0) { rb.Value = 1; } else if (rb.Value == 2) { bone = bone2; } } else { rb.Value = 0; } } SetSliders(bone.ScaleModifier, bone.LengthModifier); } _updateActionList.Add(PushValueToControls); PushValueToControls(); rb?.ValueChanged.Subscribe( i => { if (i == 1) { var modifierData = GetBoneModifier(boneMeta.BoneName, boneMeta.UniquePerCoordinate); if (modifierData != null) { SetSliders(modifierData.ScaleModifier, modifierData.LengthModifier); } } else if (i == 2) { var modifierData = GetBoneModifier(boneMeta.RightBoneName, boneMeta.UniquePerCoordinate); if (modifierData != null) { SetSliders(modifierData.ScaleModifier, modifierData.LengthModifier); } } }); void PullValuesToBone(float _) { if (isUpdatingValue) { return; } var bone = GetBoneModifier(boneMeta.BoneName, boneMeta.UniquePerCoordinate); var prevValue = bone?.ScaleModifier ?? Vector3.one; var newValue = new Vector3(x?.Value ?? prevValue.x, y?.Value ?? prevValue.y, z?.Value ?? prevValue.y); if (bone == null) { var hasLen = l != null && Math.Abs(l.Value - 1f) > 0.001; if (newValue == Vector3.one && !hasLen) { return; } _boneController.AddModifier(new BoneModifier(boneMeta.BoneName)); bone = GetBoneModifier(boneMeta.BoneName, boneMeta.UniquePerCoordinate); } if (rb != null) { if (rb.Value != 1) { var bone2 = GetBoneModifier(boneMeta.RightBoneName, boneMeta.UniquePerCoordinate); if (bone2 == null) { _boneController.AddModifier(new BoneModifier(boneMeta.RightBoneName)); bone2 = GetBoneModifier(boneMeta.RightBoneName, boneMeta.UniquePerCoordinate); } if (rb.Value == 0) { bone2.ScaleModifier = newValue; if (l != null) { bone2.LengthModifier = l.Value; } } else if (rb.Value == 2) { bone2.ScaleModifier = newValue; if (l != null) { bone2.LengthModifier = l.Value; } return; } } } bone.ScaleModifier = newValue; if (l != null) { bone.LengthModifier = l.Value; } } var obs = Observer.Create <float>(PullValuesToBone); x?.ValueChanged.Subscribe(obs); y?.ValueChanged.Subscribe(obs); z?.ValueChanged.Subscribe(obs); l?.ValueChanged.Subscribe(obs); }
private static void MakerStartedLoading(object sender, RegisterCustomControlsEvent e) { ChaFileControlPaths.Clear(); }
private void MakerAPI_MakerBaseLoaded(object s, RegisterCustomControlsEvent e) { UI.InitUI(); }
private void MakerAPI_MakerBaseLoaded(object s, RegisterCustomControlsEvent e) { InitUI(); #if KK || EC var window = MakerAPI.AddAccessoryWindowControl(new MakerButton("Material Editor", null, this)); window.GroupingID = "Buttons"; window.OnClick.AddListener(UpdateUIAccessory); e.AddControl(new MakerButton("Material Editor", MakerConstants.Body.All, this)).OnClick.AddListener(() => UpdateUICharacter("body")); e.AddControl(new MakerButton("Material Editor (Body)", MakerConstants.Face.All, this)).OnClick.AddListener(() => UpdateUICharacter("body")); e.AddControl(new MakerButton("Material Editor (Face)", MakerConstants.Face.All, this)).OnClick.AddListener(() => UpdateUICharacter("face")); e.AddControl(new MakerButton("Material Editor (All)", MakerConstants.Face.All, this)).OnClick.AddListener(() => UpdateUICharacter()); e.AddControl(new MakerButton("Material Editor", MakerConstants.Clothes.Top, this)).OnClick.AddListener(() => UpdateUIClothes(0)); e.AddControl(new MakerButton("Material Editor", MakerConstants.Clothes.Bottom, this)).OnClick.AddListener(() => UpdateUIClothes(1)); e.AddControl(new MakerButton("Material Editor", MakerConstants.Clothes.Bra, this)).OnClick.AddListener(() => UpdateUIClothes(2)); e.AddControl(new MakerButton("Material Editor", MakerConstants.Clothes.Shorts, this)).OnClick.AddListener(() => UpdateUIClothes(3)); e.AddControl(new MakerButton("Material Editor", MakerConstants.Clothes.Gloves, this)).OnClick.AddListener(() => UpdateUIClothes(4)); e.AddControl(new MakerButton("Material Editor", MakerConstants.Clothes.Panst, this)).OnClick.AddListener(() => UpdateUIClothes(5)); e.AddControl(new MakerButton("Material Editor", MakerConstants.Clothes.Socks, this)).OnClick.AddListener(() => UpdateUIClothes(6)); #if KK e.AddControl(new MakerButton("Material Editor", MakerConstants.Clothes.InnerShoes, this)).OnClick.AddListener(() => UpdateUIClothes(7)); e.AddControl(new MakerButton("Material Editor", MakerConstants.Clothes.OuterShoes, this)).OnClick.AddListener(() => UpdateUIClothes(8)); #else e.AddControl(new MakerButton("Material Editor", MakerConstants.Clothes.Shoes, this)).OnClick.AddListener(() => UpdateUIClothes(7)); #endif e.AddControl(new MakerButton("Material Editor", MakerConstants.Hair.Back, this)).OnClick.AddListener(() => UpdateUIHair(0)); e.AddControl(new MakerButton("Material Editor", MakerConstants.Hair.Front, this)).OnClick.AddListener(() => UpdateUIHair(1)); e.AddControl(new MakerButton("Material Editor", MakerConstants.Hair.Side, this)).OnClick.AddListener(() => UpdateUIHair(2)); e.AddControl(new MakerButton("Material Editor", MakerConstants.Hair.Extension, this)).OnClick.AddListener(() => UpdateUIHair(3)); e.AddControl(new MakerButton("Material Editor", MakerConstants.Face.Eyebrow, this)).OnClick.AddListener(() => UpdateUICharacter("mayuge")); e.AddControl(new MakerButton("Material Editor", MakerConstants.Face.Eye, this)).OnClick.AddListener(() => UpdateUICharacter("eyeline,hitomi")); e.AddControl(new MakerButton("Material Editor", MakerConstants.Face.Nose, this)).OnClick.AddListener(() => UpdateUICharacter("nose")); e.AddControl(new MakerButton("Material Editor", MakerConstants.Face.Mouth, this)).OnClick.AddListener(() => UpdateUICharacter("tang,tooth,canine")); #endif #if PH MakerAPI.AddAccessoryWindowControl(new MakerButton("Material Editor", null, this)).OnClick.AddListener(UpdateUIAccessory); e.AddControl(new MakerButton("Material Editor (Body)", MakerConstants.Body.General, this)).OnClick.AddListener(() => UpdateUICharacter("body")); e.AddControl(new MakerButton("Material Editor (All)", MakerConstants.Body.General, this)).OnClick.AddListener(() => UpdateUICharacter()); e.AddControl(new MakerButton("Material Editor", MakerConstants.Body.Nail, this)).OnClick.AddListener(() => UpdateUICharacter("nail")); e.AddControl(new MakerButton("Material Editor", MakerConstants.Body.Lower, this)).OnClick.AddListener(() => UpdateUICharacter("mnpk")); e.AddControl(new MakerButton("Material Editor (Face)", MakerConstants.Face.General, this)).OnClick.AddListener(() => UpdateUICharacter("head,face")); e.AddControl(new MakerButton("Material Editor (All)", MakerConstants.Face.General, this)).OnClick.AddListener(() => UpdateUICharacter()); e.AddControl(new MakerButton("Material Editor", MakerConstants.Face.Eye, this)).OnClick.AddListener(() => UpdateUICharacter("eye")); e.AddControl(new MakerButton("Material Editor", MakerConstants.Face.Eyebrow, this)).OnClick.AddListener(() => UpdateUICharacter("mayuge")); e.AddControl(new MakerButton("Material Editor", MakerConstants.Face.Eyelash, this)).OnClick.AddListener(() => UpdateUICharacter("matuge")); e.AddControl(new MakerButton("Material Editor", MakerConstants.Face.Mouth, this)).OnClick.AddListener(() => UpdateUICharacter("ha,sita")); e.AddControl(new MakerButton("Material Editor", MakerConstants.Wear.Tops, this)).OnClick.AddListener(() => UpdateUIClothes(0)); e.AddControl(new MakerButton("Material Editor", MakerConstants.Wear.Bottoms, this)).OnClick.AddListener(() => UpdateUIClothes(1)); e.AddControl(new MakerButton("Material Editor", MakerConstants.Wear.Bra, this)).OnClick.AddListener(() => UpdateUIClothes(2)); e.AddControl(new MakerButton("Material Editor", MakerConstants.Wear.Shorts, this)).OnClick.AddListener(() => UpdateUIClothes(3)); e.AddControl(new MakerButton("Material Editor", MakerConstants.Wear.SwimWear, this)).OnClick.AddListener(() => UpdateUIClothes(4)); e.AddControl(new MakerButton("Material Editor", MakerConstants.Wear.SwimTops, this)).OnClick.AddListener(() => UpdateUIClothes(5)); e.AddControl(new MakerButton("Material Editor", MakerConstants.Wear.SwimWear, this)).OnClick.AddListener(() => UpdateUIClothes(6)); e.AddControl(new MakerButton("Material Editor", MakerConstants.Wear.Glove, this)).OnClick.AddListener(() => UpdateUIClothes(7)); e.AddControl(new MakerButton("Material Editor", MakerConstants.Wear.Panst, this)).OnClick.AddListener(() => UpdateUIClothes(8)); e.AddControl(new MakerButton("Material Editor", MakerConstants.Wear.Socks, this)).OnClick.AddListener(() => UpdateUIClothes(9)); e.AddControl(new MakerButton("Material Editor", MakerConstants.Wear.Shoes, this)).OnClick.AddListener(() => UpdateUIClothes(10)); e.AddControl(new MakerButton("Material Editor", MakerConstants.Hair.Back, this)).OnClick.AddListener(() => UpdateUIHair(0)); e.AddControl(new MakerButton("Material Editor", MakerConstants.Hair.Front, this)).OnClick.AddListener(() => UpdateUIHair(1)); e.AddControl(new MakerButton("Material Editor", MakerConstants.Hair.Side, this)).OnClick.AddListener(() => UpdateUIHair(2)); #endif currentHairIndex = 0; currentClothesIndex = 0; }
private void MakerAPI_MakerBaseLoaded(object s, RegisterCustomControlsEvent e) { var controller = GetController(MakerAPI.GetCharacterControl()); ColorMatchToggle = new AccessoryControlWrapper <MakerToggle, bool>(MakerAPI.AddAccessoryWindowControl(new MakerToggle(null, "Match Color With Hair", ColorMatchDefault, this))); HairGlossToggle = new AccessoryControlWrapper <MakerToggle, bool>(MakerAPI.AddAccessoryWindowControl(new MakerToggle(null, "Use Hair Gloss", ColorMatchDefault, this))); OutlineColorPicker = new AccessoryControlWrapper <MakerColor, Color>(MakerAPI.AddAccessoryWindowControl(new MakerColor("Outline Color", false, null, OutlineColorDefault, this))); AccessoryColorPicker = new AccessoryControlWrapper <MakerColor, Color>(MakerAPI.AddAccessoryWindowControl(new MakerColor("Accessory Color", false, null, OutlineColorDefault, this))); HairLengthSlider = new AccessoryControlWrapper <MakerSlider, float>(MakerAPI.AddAccessoryWindowControl(new MakerSlider(null, "Length", 0, 1, HairLengthDefault, this))); //Color Match ColorMatchToggle.Control.Visible.OnNext(false); ColorMatchToggle.ValueChanged += ColorMatchToggle_ValueChanged; void ColorMatchToggle_ValueChanged(object sender, AccessoryWindowControlValueChangedEventArgs <bool> eventArgs) { controller.SetColorMatch(eventArgs.NewValue, eventArgs.SlotIndex); OutlineColorPicker.Control.Visible.OnNext(!eventArgs.NewValue); if (eventArgs.NewValue) { HideAccColors(); } else { ShowAccColors(true); } controller.UpdateAccessory(eventArgs.SlotIndex); } //Hair Gloss HairGlossToggle.Control.Visible.OnNext(false); HairGlossToggle.ValueChanged += HairGlossToggle_ValueChanged; void HairGlossToggle_ValueChanged(object sender, AccessoryWindowControlValueChangedEventArgs <bool> eventArgs) { controller.SetHairGloss(eventArgs.NewValue, eventArgs.SlotIndex); controller.UpdateAccessory(eventArgs.SlotIndex); } //Outline Color OutlineColorPicker.Control.ColorBoxWidth = 230; OutlineColorPicker.Control.Visible.OnNext(false); OutlineColorPicker.ValueChanged += OutlineColorPicker_ValueChanged; void OutlineColorPicker_ValueChanged(object sender, AccessoryWindowControlValueChangedEventArgs <Color> eventArgs) { controller.SetOutlineColor(eventArgs.NewValue, eventArgs.SlotIndex); controller.UpdateAccessory(eventArgs.SlotIndex); } //AccessoryColor AccessoryColorPicker.Control.ColorBoxWidth = 230; AccessoryColorPicker.Control.Visible.OnNext(false); AccessoryColorPicker.ValueChanged += AccessoryColorPicker_ValueChanged; void AccessoryColorPicker_ValueChanged(object sender, AccessoryWindowControlValueChangedEventArgs <Color> eventArgs) { controller.SetAccessoryColor(eventArgs.NewValue, eventArgs.SlotIndex); controller.UpdateAccessory(eventArgs.SlotIndex); } //HairLength HairLengthSlider.Control.Visible.OnNext(false); HairLengthSlider.ValueChanged += HairLengthSlider_ValueChanged; void HairLengthSlider_ValueChanged(object sender, AccessoryWindowControlValueChangedEventArgs <float> eventArgs) { controller.SetHairLength(eventArgs.NewValue, eventArgs.SlotIndex); controller.UpdateAccessory(eventArgs.SlotIndex); } }
private void SetupTexControls(RegisterCustomControlsEvent e, MakerCategory makerCategory, BaseUnityPlugin owner, string clothesId, string title = "Overlay textures", bool addSeparator = false) { var texType = "overlay texture"; var controlSeparator = addSeparator ? e.AddControl(new MakerSeparator(makerCategory, owner)) : null; var controlTitle = e.AddControl(new MakerText(title, makerCategory, owner)); var controlGen = e.AddControl(new MakerButton("Dump original texture", makerCategory, owner)); controlGen.OnClick.AddListener(() => GetOverlayController().DumpBaseTexture(clothesId, KoiSkinOverlayGui.WriteAndOpenPng)); var controlImage = e.AddControl(new MakerImage(null, makerCategory, owner) { Height = 150, Width = 150 }); var controlOverride = e.AddControl(new MakerToggle(makerCategory, "Hide base texture", owner)); controlOverride.ValueChanged.Subscribe( b => { var c = GetOverlayController(); if (c != null) { var tex = c.GetOverlayTex(clothesId, true); if (tex.Override != b) { tex.Override = b; c.RefreshTexture(clothesId); } } }); var controlLoad = e.AddControl(new MakerButton("Load new " + texType, makerCategory, owner)); controlLoad.OnClick.AddListener( () => OpenFileDialog.Show( strings => OnFileAccept(strings, clothesId), "Open overlay image", KoiSkinOverlayGui.GetDefaultLoadDir(), KoiSkinOverlayGui.FileFilter, KoiSkinOverlayGui.FileExt)); var controlClear = e.AddControl(new MakerButton("Clear " + texType, makerCategory, owner)); controlClear.OnClick.AddListener(() => SetTexAndUpdate(null, clothesId)); var controlExport = e.AddControl(new MakerButton("Export " + texType, makerCategory, owner)); controlExport.OnClick.AddListener( () => { try { var tex = GetOverlayController().GetOverlayTex(clothesId, false)?.TextureBytes; if (tex == null) { Logger.LogMessage("Nothing to export"); return; } KoiSkinOverlayGui.WriteAndOpenPng(tex); } catch (Exception ex) { Logger.LogMessage("Failed to export texture - " + ex.Message); } }); // Refresh logic ----------------------- _textureChanged.Subscribe( d => { if (Equals(clothesId, d.Key)) { controlImage.Texture = d.Value; if (controlOverride != null) { controlOverride.Value = GetOverlayController().GetOverlayTex(d.Key, false)?.Override ?? false; } } }); _refreshInterface.Subscribe( cat => { if (cat != null && cat != clothesId) { return; } if (!controlImage.Exists) { return; } var ctrl = GetOverlayController(); var renderer = ctrl?.GetApplicableRenderers(clothesId)?.FirstOrDefault(); var visible = renderer?.material?.mainTexture != null; controlTitle.Visible.OnNext(visible); controlGen.Visible.OnNext(visible); controlImage.Visible.OnNext(visible); controlOverride?.Visible.OnNext(visible); controlLoad.Visible.OnNext(visible); controlClear.Visible.OnNext(visible); controlExport.Visible.OnNext(visible); controlSeparator?.Visible.OnNext(visible); _textureChanged.OnNext(new KeyValuePair <string, Texture2D>(clothesId, ctrl?.GetOverlayTex(clothesId, false)?.Texture)); } ); }
private void MakerStartupTimerStart(object sender, RegisterCustomControlsEvent e) { var startTime = Time.realtimeSinceStartup; MakerAPI.MakerFinishedLoading += MakerAPI_MakerFinishedLoading; }