using System; using MVR.FileManagementSecure; using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; using UnityEngine.Events; using SimpleJSON; namespace ky1001 { public class PresetLoader : MVRScript { #region PluginInfo public string pluginAuthor = "ky1001"; public string pluginName = "PresetLoader"; public string pluginVersion = "18.1"; public string pluginDate = "2022-12-30"; public string pluginDescription = ""; #endregion private Atom _targetAtom; private const string _atomPersonPath = "Custom/Atom/Person/"; private const string _pluginsPresetPath = "Custom/Atom/Person/Plugins"; private const string _addonPackagesPath = "AddonPackages"; private const string _filePrefs = "AddonPackagesFilePrefs/"; private const string _pluginDataPath = "Saves/PluginData/ky1001/PresetLoader"; private const string _clothing = "Clothing"; private const string _hair = "Hair"; private const string _pose = "Pose"; private const string _skin = "Skin"; private const string _appearance = "Appearance"; private const string _plugins = "Plugins"; private const string _morphs = "Morphs"; private const string _breastPath = "Custom/Atom/Person/BreastPhysics/"; private const string _glutePath = "Custom/Atom/Person/GlutePhysics/"; private const string _clothingPresetsTempFile = "ky1001/PresetLoader_PluginPresets_tempfile"; private const string _hairPresetsTempFile = "ky1001/PresetLoader_PluginPresets_tempfile"; private const int _jsonstringLimit = 15000; private const float _currentPathHeight = 10f; private const float _presetPathHeight = 165f; private JSONStorableBool _enableRnd; private JSONStorableBool _enableAutoLoad; private JSONStorableBool _enableSubfolder; private JSONStorableBool _enablePositionAdjust; private Dictionary _enablePresetDic = new Dictionary(); private Dictionary _onlyFavDic = new Dictionary(); private Dictionary _savedPathDic = new Dictionary(); private Dictionary _setPresetPathButton = new Dictionary(); private Dictionary _enablePresetToggle = new Dictionary(); private Dictionary _onlyFavToggle = new Dictionary(); private Dictionary _currentText = new Dictionary(); private Dictionary _pathText = new Dictionary(); private Dictionary _presetSystemPath = new Dictionary(); private Dictionary _filesInFolder = new Dictionary(); private Dictionary _current = new Dictionary(); private Dictionary _presetPathDic = new Dictionary(); private Dictionary _presetNumber = new Dictionary(); private JSONStorableStringChooser _selectCount; private UIDynamicButton _loadSettingButton; private UIDynamicButton _saveSettingButton; private UIDynamicButton _setPluginPresetButton; private UIDynamicButton _saveCurrentPresetsButton; private UIDynamicToggle _keepClothingToggle; private UIDynamicToggle _keepHairToggle; private UIDynamicToggle _enableDisappearToggle; private UIDynamicToggle _keepScaleToggle; private UIDynamicToggle _nudeToggle; private UIDynamicToggle _autoScreenshotToggle; private JSONStorableBool _isKeepClothing; private JSONStorableBool _isKeepHair; private JSONStorableBool _isEnableDisappear; private JSONStorableBool _isKeepScale; private JSONStorableBool _isNude; private JSONStorableBool _isAutoScreenshot; private UIDynamic _spLeft; private UIDynamic _spRight; private UIDynamic _spLeftBottom; private UIDynamic _spRightBottom; private Dictionary _favPathDic = new Dictionary(); private Dictionary> _listDic = new Dictionary>(); private Dictionary> _presetListDic = new Dictionary>(); private Dictionary> _favListDic = new Dictionary>(); private List _presetList = new List(); private List _favList = new List(); private List _femaleList = new List(); private List _activeClothingList = new List(); private string _presetName; private string _presetPath; private string _varFileName; private Dictionary _previousNumber = new Dictionary(); private string _previousSelectCount; private bool _isTopMenu = true; private bool _loopStart = false; private float _waitCount; private bool _isFemale; private string _appPreset; private string _posePresetFile; private string _skinPresetFile; private string _loadData; private JSONNode _jSONNode; private JSONArray _asArray; private JSONClass _asObject; private int _startTime; private int _currentTime; private int _selectTime; private string _id; private Vector3 _personPosi; private Quaternion _personRota; private Vector3 _loadedPosi; private bool _isPosition; private bool _isHip; private float _min; private Vector3 _control; private Vector3 _hipControl; private Vector3 _posi; private Vector3 _rota; private Dictionary _rigidbodyPosiLocal = new Dictionary(); private Dictionary _rigidbodyRotaLocal = new Dictionary(); private Dictionary _rigidbodyPosiWorld = new Dictionary(); private Dictionary _rigidbodyRotaWorld = new Dictionary(); private Vector3 _rootPosi; private Vector3 _rootRota; private int _poseWaitStart; private string _nextPreset = "Start"; private Dictionary> _randomOrder = new Dictionary>(); private Dictionary _setPath = new Dictionary(); private string _presetTypePath; private string _saveName; private bool _isSavePresets = false; private int _savePresetTime; private float _characterScale = 1; private List _pluginList = new List(); private string _currentPlugin; private MVRPluginManager _manager; private Button _removeButton; private bool _stopPlugin = false; private string _currentMode; private string _sceneVar; private JSONStorableBool _enablePathInSceneVar; private JSONStorableBool _isIgnoreRootControl; private UIDynamicToggle _IgnoreRootControlToggle; private JSONStorableBool _isIncludePose; private JSONStorableBool _isIncludeAppearance; private JSONStorableBool _enablePhysicsPresets; private UIDynamicToggle _includePoseToggle; private UIDynamicToggle _includeAppearanceToggle; private UIDynamicToggle _enablePhysicsPresetsToggle; private UIDynamic _spLeftMiddle; private UIDynamic _spRightMiddle; public bool waitingForUIOpened { get; private set; } private readonly string[] _female = new string[] { "Candy", "Evey", "Janie", "Kayla", "Lexi", "Maria", "Mia", "Simone", "Tara", "Tina" }; private readonly string[] _rigidbodyNames = new string[] { "hip", "pelvis", "rThigh", "rShin", "rFoot", "rToe", "lThigh", "lShin", "lFoot", "lToe", "abdomen", "abdomen2", "chest", "lPectoral", "rPectoral", "rCollar", "rShldr", "rForeArm", "rHand", "lCollar", "lShldr", "lForeArm", "lHand", "neck", "head" }; private readonly string[] _presets = new string[] { "Clothing", "Hair", "Pose", "Skin", "Appearance", "Morphs" }; public override void Init() { try { var sceneDir = SuperController.singleton.currentLoadDir; if (sceneDir.Contains(":")) { var sceneDirSplit = sceneDir.Split(':'); _sceneVar = sceneDirSplit[0]; } else { _sceneVar = ""; } _targetAtom = containingAtom; _manager = _targetAtom.GetStorableByID("PluginManager") as MVRPluginManager; _currentMode = SuperController.singleton.gameMode.ToString(); /* SuperController.singleton.gameMode = SuperController.GameMode.Edit; SuperController.singleton.SelectController(_targetAtom.mainController); SuperController.singleton.ShowMainHUDAuto(); if (_currentMode == "Play") { SuperController.singleton.gameMode = SuperController.GameMode.Play; SuperController.singleton.HideMainHUD(); } */ if (_targetAtom.type != "Person") { SuperController.LogError("Please attach this plugin to Person"); _stopPlugin = true; return; } if (!FileManagerSecure.DirectoryExists(_pluginDataPath)) { FileManagerSecure.CreateDirectory(_pluginDataPath); } var loadPresetButton = CreateButton("Load Presets"); loadPresetButton.button.onClick.AddListener(LoadPreset); JSONStorableAction LoadPresetAct = new JSONStorableAction("Load Presets", LoadPreset); var changeManuButton = CreateButton("Change Menu", true); changeManuButton.button.onClick.AddListener(ChangeMenu); changeManuButton.buttonColor = Color.yellow; JSONStorableAction ChangeMenuAct = new JSONStorableAction("Change Menu", ChangeMenu); _isTopMenu = true; _enablePathInSceneVar = new JSONStorableBool("Enable Path in Scene var", true); var isUseIncludedDataToggle = CreateToggle(_enablePathInSceneVar, true); isUseIncludedDataToggle.toggle.onValueChanged.AddListener(delegate { RefreshList(); }); _enableAutoLoad = new JSONStorableBool("Enable Auto Load", false); CreateToggle(_enableAutoLoad, true); _enableRnd = new JSONStorableBool("Enable Random Load", true); var enableRnd = CreateToggle(_enableRnd); enableRnd.toggle.onValueChanged.AddListener(delegate { ResetCount(); }); _enablePositionAdjust = new JSONStorableBool("Enable Position Adjustment", true); CreateToggle(_enablePositionAdjust, false); _enableSubfolder = new JSONStorableBool("Include Subfolder", true); var enableSubfolderToggle = CreateToggle(_enableSubfolder); enableSubfolderToggle.toggle.onValueChanged.AddListener(delegate { RefreshList(); }); List waitCount = new List(); waitCount.Add("5"); waitCount.Add("15"); waitCount.Add("30"); waitCount.Add("60"); waitCount.Add("120"); waitCount.Add("180"); _selectCount = new JSONStorableStringChooser("Interval", waitCount, "30", "Interval [sec]"); var sc = CreatePopup(_selectCount, true); var sp1 = CreateSpacer(false); sp1.height = 14f; JSONStorableAction SetClothingPresetPathAct = new JSONStorableAction("Set " + _clothing + " Presets Path", SetClothingPathAct); JSONStorableAction SetHairPresetPathAct = new JSONStorableAction("Set " + _hair + " Presets Path", SetHairPathAct); JSONStorableAction SetPosePresetPathAct = new JSONStorableAction("Set " + _pose + " Presets Path", SetPosePathAct); JSONStorableAction SetSkinPresetPathAct = new JSONStorableAction("Set " + _skin + " Presets Path", SetSkinPathAct); JSONStorableAction SetAppearancePresetPathAct = new JSONStorableAction("Set " + _appearance + " Presets Path", SetAppearancePathAct); JSONStorableAction SetMorphsPresetPathAct = new JSONStorableAction("Set " + _morphs + " Presets Path", SetMorphsPathAct); _setPath[_clothing] = SetClothingPath; _setPath[_hair] = SetHairPath; _setPath[_pose] = SetPosePath; _setPath[_skin] = SetSkinPath; _setPath[_appearance] = SetAppearancePath; _setPath[_morphs] = SetMorphsPath; _savedPathDic[_clothing] = new JSONStorableString("Clothing Presets Path", ""); _savedPathDic[_hair] = new JSONStorableString("Hair Presets Path", ""); _savedPathDic[_pose] = new JSONStorableString("Pose Preset Path", ""); _savedPathDic[_skin] = new JSONStorableString("Skin Preset Path", ""); _savedPathDic[_appearance] = new JSONStorableString("Appearance Preset Path", ""); _savedPathDic[_morphs] = new JSONStorableString("Morphs Preset Path", ""); foreach (var item in _presets) { _presetSystemPath[item] = _atomPersonPath + item; _favPathDic[item] = ""; _favListDic[item] = new List(); _randomOrder[item] = new List(); _listDic[item] = new List(); _previousNumber[item] = 0; _presetNumber[item] = new JSONStorableString(item + " Current Number", "0"); _enablePresetDic[item] = new JSONStorableBool("Enable " + item + " Presets", false); _onlyFavDic[item] = new JSONStorableBool("Favorite " + item + " Only", false); _current[item] = new JSONStorableString("", ""); _filesInFolder[item] = new JSONStorableString("", ""); MakeUi(item, _setPath[item]); } _isKeepClothing = new JSONStorableBool("Keep Appearance Clothing", false); _isKeepHair = new JSONStorableBool("Keep Appearance Hair", false); _isEnableDisappear = new JSONStorableBool("Enable Disappear when moving", true); _isKeepScale = new JSONStorableBool("Keep Appearance Scale", false); _isNude = new JSONStorableBool("No Clothing", false); _isAutoScreenshot = new JSONStorableBool("Auto Screenshot for Presets", false); _isIgnoreRootControl = new JSONStorableBool("Ignore Root Control", true); _isIncludePose = new JSONStorableBool("Include Physical (Pose)", false); _isIncludeAppearance = new JSONStorableBool("Include Appearance", true); _enablePhysicsPresets = new JSONStorableBool("Enable Physics Presets", true); var presetName = _plugins; _enablePresetDic[presetName] = new JSONStorableBool("Enable " + presetName + " Presets", false); _enablePresetToggle[presetName] = CreateToggle(_enablePresetDic[presetName]); RemoveToggle(_enablePresetToggle[presetName]); presetName = _appearance; RemoveButton(_setPresetPathButton[presetName]); RemoveToggle(_enablePresetToggle[presetName]); RemoveToggle(_onlyFavToggle[presetName]); RemoveTextField(_currentText[presetName]); RemoveTextField(_pathText[presetName]); presetName = _morphs; RemoveButton(_setPresetPathButton[presetName]); RemoveToggle(_enablePresetToggle[presetName]); RemoveToggle(_onlyFavToggle[presetName]); RemoveTextField(_currentText[presetName]); RemoveTextField(_pathText[presetName]); _femaleList = new List(_female); _selectTime = int.Parse(_selectCount.val); JSONStorableAction SetCurrentPluginAct = new JSONStorableAction("Set Current Plugin Preset", SetCurrentPlugin); JSONStorableAction SaveCurrentPresetsAct = new JSONStorableAction("Save Current Presets", SaveCurrentPresets); RegisterAction(LoadPresetAct); RegisterBool(_enableRnd); RegisterBool(_enablePositionAdjust); RegisterBool(_enableSubfolder); RegisterBool(_enablePathInSceneVar); RegisterBool(_enableAutoLoad); RegisterStringChooser(_selectCount); RegisterAction(SetClothingPresetPathAct); RegisterAction(SetHairPresetPathAct); RegisterAction(SetPosePresetPathAct); RegisterAction(SetSkinPresetPathAct); RegisterAction(SetAppearancePresetPathAct); RegisterAction(SetMorphsPresetPathAct); RegisterAction(SetCurrentPluginAct); RegisterAction(SaveCurrentPresetsAct); RegisterBool(_enablePresetDic[_clothing]); RegisterBool(_enablePresetDic[_hair]); RegisterBool(_enablePresetDic[_pose]); RegisterBool(_enablePresetDic[_skin]); RegisterBool(_enablePresetDic[_appearance]); RegisterBool(_enablePresetDic[_plugins]); RegisterBool(_enablePresetDic[_morphs]); RegisterBool(_onlyFavDic[_clothing]); RegisterBool(_onlyFavDic[_hair]); RegisterBool(_onlyFavDic[_pose]); RegisterBool(_onlyFavDic[_skin]); RegisterBool(_onlyFavDic[_appearance]); RegisterBool(_onlyFavDic[_morphs]); RegisterString(_savedPathDic[_clothing]); RegisterString(_savedPathDic[_hair]); RegisterString(_savedPathDic[_pose]); RegisterString(_savedPathDic[_skin]); RegisterString(_savedPathDic[_appearance]); RegisterString(_savedPathDic[_morphs]); RegisterString(_presetNumber[_clothing]); RegisterString(_presetNumber[_hair]); RegisterString(_presetNumber[_pose]); RegisterString(_presetNumber[_skin]); RegisterString(_presetNumber[_appearance]); RegisterString(_presetNumber[_morphs]); RegisterBool(_isKeepClothing); RegisterBool(_isKeepHair); RegisterBool(_isEnableDisappear); RegisterBool(_isKeepScale); RegisterBool(_isNude); RegisterBool(_isAutoScreenshot); RegisterBool(_isIgnoreRootControl); RegisterBool(_isIncludePose); RegisterBool(_isIncludeAppearance); RegisterBool(_enablePhysicsPresets); } catch (Exception e) { SuperController.LogError("Exception caught: " + e); } } private void ChangeMenu() { foreach (var item in _presets) { RemoveItems(item); } if (_loadSettingButton != null) { RemoveButton(_loadSettingButton); } if (_saveSettingButton != null) { RemoveButton(_saveSettingButton); } if (_enablePresetToggle[_plugins] != null) { RemoveToggle(_enablePresetToggle[_plugins]); } if (_setPluginPresetButton != null) { RemoveButton(_setPluginPresetButton); } if (_spLeft != null) { RemoveSpacer(_spLeft); } if (_spRight != null) { RemoveSpacer(_spRight); } if (_spLeftBottom != null) { RemoveSpacer(_spLeftBottom); } if (_spRightBottom != null) { RemoveSpacer(_spRightBottom); } if (_keepClothingToggle != null) { RemoveToggle(_keepClothingToggle); } if (_keepHairToggle != null) { RemoveToggle(_keepHairToggle); } if (_enableDisappearToggle != null) { RemoveToggle(_enableDisappearToggle); } if (_saveCurrentPresetsButton != null) { RemoveButton(_saveCurrentPresetsButton); } if (_keepScaleToggle != null) { RemoveToggle(_keepScaleToggle); } if (_nudeToggle != null) { RemoveToggle(_nudeToggle); } if (_autoScreenshotToggle != null) { RemoveToggle(_autoScreenshotToggle); } if (_IgnoreRootControlToggle != null) { RemoveToggle(_IgnoreRootControlToggle); } if (_includePoseToggle != null) { RemoveToggle(_includePoseToggle); RemoveToggle(_includeAppearanceToggle); RemoveToggle(_enablePhysicsPresetsToggle); RemoveSpacer(_spLeftMiddle); RemoveSpacer(_spRightMiddle); } if (_isTopMenu) { _loadSettingButton = CreateButton("Load Setting", false); _loadSettingButton.buttonColor = Color.cyan; _saveSettingButton = CreateButton("Save Setting", true); _saveSettingButton.buttonColor = Color.cyan; //_spLeft = CreateSpacer(); //_spLeft.height = 10; //_spRight = CreateSpacer(true); //_spRight.height = 10; _isTopMenu = false; _presetName = _morphs; MakeUi(_presetName, SetMorphsPath); _includePoseToggle = CreateToggle(_isIncludePose); _includeAppearanceToggle = CreateToggle(_isIncludeAppearance, true); _enablePhysicsPresetsToggle = CreateToggle(_enablePhysicsPresets); _spLeftMiddle = CreateSpacer(); _spLeftMiddle.height = 0f; _spRightMiddle = CreateSpacer(true); _spRightMiddle.height = 65f; _presetName = _appearance; MakeUi(_presetName, SetAppearancePath); _loadSettingButton.button.onClick.AddListener(() => { _loopStart = false; if (!FileManagerSecure.DirectoryExists(_pluginDataPath)) { FileManagerSecure.CreateDirectory(_pluginDataPath); } var shortcuts = FileManagerSecure.GetShortCutsForDirectory(_pluginDataPath, false, false, true, true); SuperController.singleton.GetMediaPathDialog(LoadSetting, "json", _pluginDataPath, true, true, false, null, false, shortcuts); }); _saveSettingButton.button.onClick.AddListener(() => { _loopStart = false; if (!FileManagerSecure.DirectoryExists(_pluginDataPath)) { FileManagerSecure.CreateDirectory(_pluginDataPath); } var fileBrowserUI = SuperController.singleton.fileBrowserUI; fileBrowserUI.SetTitle("Save PresetLoader Setting"); fileBrowserUI.fileRemovePrefix = null; fileBrowserUI.hideExtension = false; fileBrowserUI.keepOpen = false; fileBrowserUI.fileFormat = "json"; fileBrowserUI.defaultPath = _pluginDataPath; fileBrowserUI.showDirs = true; fileBrowserUI.shortCuts = null; fileBrowserUI.browseVarFilesAsDirectories = true; fileBrowserUI.SetTextEntry(true); fileBrowserUI.Show(SaveSetting); fileBrowserUI.fileEntryField.text = (int)(DateTime.UtcNow - new DateTime(1970, 1, 1)).TotalSeconds + ".json"; fileBrowserUI.ActivateFileNameField(); fileBrowserUI.showInstallFolderInDirectoryList = true; }); _keepClothingToggle = CreateToggle(_isKeepClothing); _keepClothingToggle.toggle.onValueChanged.AddListener(delegate { MakeClothingPreset(); }); _keepHairToggle = CreateToggle(_isKeepHair, true); _keepHairToggle.toggle.onValueChanged.AddListener(delegate { MakeHairPreset(); }); _keepScaleToggle = CreateToggle(_isKeepScale); _keepScaleToggle.toggle.onValueChanged.AddListener(delegate { KeepScale(); }); _nudeToggle = CreateToggle(_isNude, true); _spLeftBottom = CreateSpacer(); _spLeftBottom.height = 0f; _spRightBottom = CreateSpacer(true); _spRightBottom.height = 0f; _enablePresetToggle[_plugins] = CreateToggle(_enablePresetDic[_plugins]); _setPluginPresetButton = CreateButton("Set Current Plugin Preset", true); _setPluginPresetButton.buttonColor = Color.green; _setPluginPresetButton.button.onClick.AddListener(() => { _loopStart = false; SetCurrentPlugin(); }); _enableDisappearToggle = CreateToggle(_isEnableDisappear); _saveCurrentPresetsButton = CreateButton("Save Current Presets", true); _saveCurrentPresetsButton.buttonColor = new Color(1.0f, 0.7f, 0.7f); _saveCurrentPresetsButton.button.onClick.AddListener(SaveCurrentPresets); _autoScreenshotToggle = CreateToggle(_isAutoScreenshot, true); _IgnoreRootControlToggle = CreateToggle(_isIgnoreRootControl); } else { _isTopMenu = true; _presetName = _clothing; MakeUi(_presetName, SetClothingPath); _presetName = _hair; MakeUi(_presetName, SetHairPath); _presetName = _pose; MakeUi(_presetName, SetPosePath); _presetName = _skin; MakeUi(_presetName, SetSkinPath); } } private void RemoveItems(string item) { if (_setPresetPathButton[item] != null) { RemoveButton(_setPresetPathButton[item]); } if (_enablePresetToggle[item] != null) { RemoveToggle(_enablePresetToggle[item]); } if (_onlyFavToggle[item] != null) { RemoveToggle(_onlyFavToggle[item]); } if (_currentText[item] != null) { RemoveTextField(_currentText[item]); } if (_pathText[item] != null) { RemoveTextField(_pathText[item]); } } public void MakeUi(string presetName, UnityAction action) { _setPresetPathButton[presetName] = CreateButton("Set " + presetName + " Presets Path"); _setPresetPathButton[presetName].button.onClick.AddListener(action); _enablePresetToggle[presetName] = CreateToggle(_enablePresetDic[presetName]); _onlyFavToggle[presetName] = CreateToggle(_onlyFavDic[presetName], true); _onlyFavToggle[presetName].toggle.onValueChanged.AddListener(delegate { ChangePath(presetName); }); _currentText[presetName] = CreateTextField(_current[presetName]); _currentText[presetName].height = _currentPathHeight; _pathText[presetName] = CreateTextField(_filesInFolder[presetName], true); _pathText[presetName].height = _presetPathHeight; } public void MakeClothingPreset() { if (_isKeepClothing.val) { _targetAtom.GetStorableByID("ClothingPresets").GetStringJSONParam("presetName").val = _clothingPresetsTempFile; _targetAtom.GetStorableByID("ClothingPresets").CallAction("StorePreset"); } } public void MakeHairPreset() { if (_isKeepHair.val) { _targetAtom.GetStorableByID("HairPresets").GetStringJSONParam("presetName").val = _hairPresetsTempFile; _targetAtom.GetStorableByID("HairPresets").CallAction("StorePreset"); } } public void KeepScale() { if (_isKeepScale.val) { _characterScale = _targetAtom.GetStorableByID("rescaleObject").GetFloatJSONParam("scale").val; } } public void LoadSetting(string path) { if (path != null && path != "") { var loadData = SuperController.singleton.ReadFileIntoString(path); JSONNode jSONNode = JSON.Parse(loadData); _enableRnd.val = bool.Parse(jSONNode["Enable Random Load"]); _enablePositionAdjust.val = bool.Parse(jSONNode["Enable Position Adjustment"]); _enableSubfolder.val = bool.Parse(jSONNode["Include Subfolder"]); _enableAutoLoad.val = bool.Parse(jSONNode["Enable Auto Load"]); _selectCount.val = jSONNode["Interval"]; if (jSONNode["Enable Path in Scene var"] != null) { _enablePathInSceneVar.val = bool.Parse(jSONNode["Enable Path in Scene var"]); } foreach (var item in _presets) { _onlyFavDic[item].val = bool.Parse(jSONNode[item][1]); _savedPathDic[item].val = jSONNode[item][2]; _presetPath = _presetSystemPath[item]; _presetName = item; LoadPresetsList(_savedPathDic[item].val); _enablePresetDic[item].val = bool.Parse(jSONNode[item][0]); if (_savedPathDic[item].val == "") { _favPathDic[item] = ""; _favListDic[item] = new List(); _presetPathDic[item] = ""; _presetListDic[item] = new List(); _enablePresetDic[item].val = false; } ChangePath(item); } if (jSONNode[_appearance][3] != null) { _isKeepClothing.val = bool.Parse(jSONNode[_appearance][3]); _isKeepHair.val = bool.Parse(jSONNode[_appearance][4]); _isKeepScale.val = bool.Parse(jSONNode[_appearance][5]); _isNude.val = bool.Parse(jSONNode[_appearance][6]); _isEnableDisappear.val = bool.Parse(jSONNode["Enable Disappear when moving"]); _isAutoScreenshot.val = bool.Parse(jSONNode["Auto Screenshot for Presets"]); } if (jSONNode[_morphs][3] != null) { _isIncludePose.val = bool.Parse(jSONNode[_morphs][3]); _isIncludeAppearance.val = bool.Parse(jSONNode[_morphs][4]); _enablePhysicsPresets.val = bool.Parse(jSONNode[_morphs][5]); } var presetName = _plugins; if (jSONNode[presetName][0] != null) { _enablePresetDic[presetName].val = bool.Parse(jSONNode[presetName][0]); } } } public void SaveSetting(string path) { if (path != null && path != "") { JSONClass saveData = new JSONClass(); saveData["Enable Random Load"] = _enableRnd.val.ToString(); saveData["Enable Position Adjustment"] = _enablePositionAdjust.val.ToString(); saveData["Include Subfolder"] = _enableSubfolder.val.ToString(); saveData["Enable Path in Scene var"] = _enablePathInSceneVar.val.ToString(); saveData["Enable Auto Load"] = _enableAutoLoad.val.ToString(); saveData["Interval"] = _selectCount.val; foreach (var item in _presets) { saveData[item]["Enable Preset"] = _enablePresetDic[item].val.ToString(); saveData[item]["Favorite Only"] = _onlyFavDic[item].val.ToString(); saveData[item]["Preset Path"] = _savedPathDic[item].val.ToString(); } saveData[_appearance]["Keep Appearance Clothing"] = _isKeepClothing.val.ToString(); saveData[_appearance]["Keep Appearance Hair"] = _isKeepHair.val.ToString(); saveData[_appearance]["Keep Appearance Scale"] = _isKeepScale.val.ToString(); saveData[_appearance]["No Clothing"] = _isNude.val.ToString(); saveData[_morphs]["Include Physical (Pose)"] = _isIncludePose.val.ToString(); saveData[_morphs]["Include Appearance"] = _isIncludeAppearance.val.ToString(); saveData[_morphs]["Enable Physics Presets"] = _enablePhysicsPresets.val.ToString(); var presetName = _plugins; saveData[presetName]["Enable Preset"] = _enablePresetDic[presetName].val.ToString(); saveData["Enable Disappear when moving"] = _isEnableDisappear.val.ToString(); saveData["Auto Screenshot for Presets"] = _isAutoScreenshot.val.ToString(); if (path.Length < 5 || path.Substring(path.Length - 5) != ".json") { path = path + ".json"; } SaveJSON(saveData, path); } } public void ChangePath(string presetName) { if (_onlyFavDic[presetName].val) { _filesInFolder[presetName].val = _favPathDic[presetName]; _listDic[presetName] = new List(_favListDic[presetName]); } else { _filesInFolder[presetName].val = _presetPathDic[presetName]; _listDic[presetName] = new List(_presetListDic[presetName]); } _previousNumber[presetName] = 0; _presetNumber[presetName].val = _previousNumber[presetName].ToString(); _randomOrder[presetName] = MakeRandomOrder(_listDic[presetName].Count, 0); } public void ResetCount() { if (_enableRnd.val) { foreach (var presetName in _presets) { _previousNumber[presetName] = 0; _presetNumber[presetName].val = _previousNumber[presetName].ToString(); _randomOrder[presetName] = MakeRandomOrder(_listDic[presetName].Count, 0); } } else { foreach (var presetName in _presets) { _previousNumber[presetName] = 0; _presetNumber[presetName].val = _previousNumber[presetName].ToString(); } } } public void LoadPreset() { if (_pluginList == null || _pluginList.Count == 0) { SetCurrentPlugin(); } if (_enableAutoLoad.val) { if (_loopStart) { _waitCount = _selectTime; } else { _loopStart = true; return; } } else { _loopStart = false; _waitCount = 0; } ClearPlugins(); int number; var presetName = _appearance; if (_enablePresetDic[presetName].val) { if (_listDic[presetName].Count != 0) { if (_listDic[presetName].Count == 1) { number = 0; } else { if (_previousNumber[presetName] >= _listDic[presetName].Count) { _previousNumber[presetName] = 0; } if (_enableRnd.val) { number = _randomOrder[presetName][_previousNumber[presetName]]; _previousNumber[presetName] = _previousNumber[presetName] + 1; _presetNumber[presetName].val = _previousNumber[presetName].ToString(); if (_previousNumber[presetName] >= _listDic[presetName].Count) { _randomOrder[presetName] = MakeRandomOrder(_listDic[presetName].Count, number); _previousNumber[presetName] = 0; _presetNumber[presetName].val = _previousNumber[presetName].ToString(); } } else { number = _previousNumber[presetName]; _previousNumber[presetName] = number + 1; _presetNumber[presetName].val = _previousNumber[presetName].ToString(); if (_previousNumber[presetName] >= _listDic[presetName].Count) { _previousNumber[presetName] = 0; _presetNumber[presetName].val = _previousNumber[presetName].ToString(); } } } var allGeometry = _targetAtom.GetStorableByID("geometry").GetBoolParamNames(); foreach (var item in allGeometry) { if (item.Contains("clothing:")) { if (_targetAtom.GetStorableByID("geometry").GetBoolJSONParam(item).val) { _targetAtom.GetStorableByID("geometry").GetBoolJSONParam(item).val = false; } } } _current[presetName].val = _listDic[presetName][number]; _targetAtom.GetStorableByID("AppearancePresets").GetStringJSONParam("presetName").val = _listDic[presetName][number]; var setStartTime = DateTime.Now.Second * 1000 + DateTime.Now.Millisecond; var currentTime = setStartTime; do { currentTime = DateTime.Now.Second * 1000 + DateTime.Now.Millisecond; if (setStartTime > currentTime) { currentTime += 60000; } } while (currentTime - setStartTime < 200); _targetAtom.GetStorableByID("AppearancePresets").CallAction("LoadPreset"); } else { _current[presetName].val = ""; } } else { _current[presetName].val = ""; } if (_isNude.val) { var allGeometry = _targetAtom.GetStorableByID("geometry").GetBoolParamNames(); foreach (var item in allGeometry) { if (item.Contains("clothing:")) { if (_targetAtom.GetStorableByID("geometry").GetBoolJSONParam(item).val) { _targetAtom.GetStorableByID("geometry").GetBoolJSONParam(item).val = false; } } } } if (_isKeepScale.val) { _targetAtom.GetStorableByID("rescaleObject").GetFloatJSONParam("scale").val = _characterScale; } _poseWaitStart = DateTime.Now.Second * 1000 + DateTime.Now.Millisecond; _nextPreset = _hair; } public void ChangeHair() { int number; var presetName = _hair; if (_enablePresetDic[presetName].val) { if (_listDic[presetName].Count != 0) { if (_listDic[presetName].Count == 1) { number = 0; } else { if (_previousNumber[presetName] >= _listDic[presetName].Count) { _previousNumber[presetName] = 0; } if (_enableRnd.val) { number = _randomOrder[presetName][_previousNumber[presetName]]; _previousNumber[presetName] = _previousNumber[presetName] + 1; _presetNumber[presetName].val = _previousNumber[presetName].ToString(); if (_previousNumber[presetName] >= _listDic[presetName].Count) { _randomOrder[presetName] = MakeRandomOrder(_listDic[presetName].Count, number); _previousNumber[presetName] = 0; _presetNumber[presetName].val = _previousNumber[presetName].ToString(); } } else { number = _previousNumber[presetName]; _previousNumber[presetName] = number + 1; _presetNumber[presetName].val = _previousNumber[presetName].ToString(); if (_previousNumber[presetName] >= _listDic[presetName].Count) { _previousNumber[presetName] = 0; _presetNumber[presetName].val = _previousNumber[presetName].ToString(); } } } _current[presetName].val = _listDic[presetName][number]; _targetAtom.GetStorableByID("HairPresets").GetStringJSONParam("presetName").val = _listDic[presetName][number]; var setStartTime = DateTime.Now.Second * 1000 + DateTime.Now.Millisecond; var currentTime = setStartTime; do { currentTime = DateTime.Now.Second * 1000 + DateTime.Now.Millisecond; if (setStartTime > currentTime) { currentTime += 60000; } } while (currentTime - setStartTime < 200); _targetAtom.GetStorableByID("HairPresets").CallAction("LoadPreset"); } else { _current[presetName].val = ""; } } else { _current[presetName].val = ""; } _poseWaitStart = DateTime.Now.Second * 1000 + DateTime.Now.Millisecond; } public void ChangeSkin() { int number; var presetName = _skin; if (_enablePresetDic[presetName].val) { if (_listDic[presetName].Count != 0) { if (_listDic[presetName].Count == 1) { number = 0; } else { if (_previousNumber[presetName] >= _listDic[presetName].Count) { _previousNumber[presetName] = 0; } if (_enableRnd.val) { number = _randomOrder[presetName][_previousNumber[presetName]]; _previousNumber[presetName] = _previousNumber[presetName] + 1; _presetNumber[presetName].val = _previousNumber[presetName].ToString(); if (_previousNumber[presetName] >= _listDic[presetName].Count) { _randomOrder[presetName] = MakeRandomOrder(_listDic[presetName].Count, number); _previousNumber[presetName] = 0; _presetNumber[presetName].val = _previousNumber[presetName].ToString(); } } else { number = _previousNumber[presetName]; _previousNumber[presetName] = number + 1; _presetNumber[presetName].val = _previousNumber[presetName].ToString(); if (_previousNumber[presetName] >= _listDic[presetName].Count) { _previousNumber[presetName] = 0; _presetNumber[presetName].val = _previousNumber[presetName].ToString(); } } } var characterName = _targetAtom.GetStorableByID("geometry").GetStringChooserJSONParam("characterSelection").val; if (_femaleList.Contains(characterName) || characterName.Contains("Female")) { _isFemale = true; } else { _isFemale = false; } if (_listDic[presetName][number].Contains(":")) { var skinPresetSplit = _listDic[presetName][number].Split(':'); _skinPresetFile = skinPresetSplit[0] + ":/" + _presetSystemPath[presetName] + "/" + skinPresetSplit[1] + ".vap"; } else { _skinPresetFile = _presetSystemPath[presetName] + "/" + _listDic[presetName][number] + ".vap"; } int posi = _skinPresetFile.LastIndexOf("/"); _skinPresetFile = _skinPresetFile.Insert(posi + 1, "Preset_"); _loadData = SuperController.singleton.ReadFileIntoString(_skinPresetFile); _jSONNode = JSON.Parse(_loadData); _asArray = _jSONNode["storables"].AsArray; for (int i = 0; i < _asArray.Count; i++) { _asObject = _asArray[i].AsObject; _id = _asObject["id"]; if (_id == "geometry" && _asObject["character"] != null) { characterName = _asObject["character"]; } } bool _isFemaleInVap = _femaleList.Contains(characterName) || characterName.Contains("Female"); if (_isFemale == _isFemaleInVap) { _current[presetName].val = _listDic[presetName][number]; _targetAtom.GetStorableByID("SkinPresets").GetStringJSONParam("presetName").val = _listDic[presetName][number]; var setStartTime = DateTime.Now.Second * 1000 + DateTime.Now.Millisecond; var currentTime = setStartTime; do { currentTime = DateTime.Now.Second * 1000 + DateTime.Now.Millisecond; if (setStartTime > currentTime) { currentTime += 60000; } } while (currentTime - setStartTime < 200); _targetAtom.GetStorableByID("SkinPresets").CallAction("LoadPreset"); } else { _current[presetName].val = ""; } } else { _current[presetName].val = ""; } } else { _current[presetName].val = ""; } _poseWaitStart = DateTime.Now.Second * 1000 + DateTime.Now.Millisecond; } public void ChangeClothing() { int number; var presetName = _clothing; if (_enablePresetDic[presetName].val) { if (_listDic[presetName].Count != 0) { if (_listDic[presetName].Count == 1) { number = 0; } else { if (_previousNumber[presetName] >= _listDic[presetName].Count) { _previousNumber[presetName] = 0; } if (_enableRnd.val) { number = _randomOrder[presetName][_previousNumber[presetName]]; _previousNumber[presetName] = _previousNumber[presetName] + 1; _presetNumber[presetName].val = _previousNumber[presetName].ToString(); if (_previousNumber[presetName] >= _listDic[presetName].Count) { _randomOrder[presetName] = MakeRandomOrder(_listDic[presetName].Count, number); _previousNumber[presetName] = 0; _presetNumber[presetName].val = _previousNumber[presetName].ToString(); } } else { number = _previousNumber[presetName]; _previousNumber[presetName] = number + 1; _presetNumber[presetName].val = _previousNumber[presetName].ToString(); if (_previousNumber[presetName] >= _listDic[presetName].Count) { _previousNumber[presetName] = 0; _presetNumber[presetName].val = _previousNumber[presetName].ToString(); } } } var allGeometry = _targetAtom.GetStorableByID("geometry").GetBoolParamNames(); foreach (var item in allGeometry) { if (item.Contains("clothing:")) { if (_targetAtom.GetStorableByID("geometry").GetBoolJSONParam(item).val) { _targetAtom.GetStorableByID("geometry").GetBoolJSONParam(item).val = false; } } } _current[presetName].val = _listDic[presetName][number]; _targetAtom.GetStorableByID("ClothingPresets").GetStringJSONParam("presetName").val = _listDic[presetName][number]; var setStartTime = DateTime.Now.Second * 1000 + DateTime.Now.Millisecond; var currentTime = setStartTime; do { currentTime = DateTime.Now.Second * 1000 + DateTime.Now.Millisecond; if (setStartTime > currentTime) { currentTime += 60000; } } while (currentTime - setStartTime < 200); _targetAtom.GetStorableByID("ClothingPresets").CallAction("LoadPreset"); //_targetAtom.GetStorableByID("ClothingPresets").CallAction("MergeLoadPreset"); } else { _current[presetName].val = ""; } } else { _current[presetName].val = ""; } _poseWaitStart = DateTime.Now.Second * 1000 + DateTime.Now.Millisecond; } public void ChangePose() { int number; var presetName = _pose; if (_enablePresetDic[presetName].val) { if (_listDic[presetName].Count != 0) { if (_listDic[presetName].Count == 1) { number = 0; } else { if (_previousNumber[presetName] >= _listDic[presetName].Count) { _previousNumber[presetName] = 0; } if (_enableRnd.val) { number = _randomOrder[presetName][_previousNumber[presetName]]; _previousNumber[presetName] = _previousNumber[presetName] + 1; _presetNumber[presetName].val = _previousNumber[presetName].ToString(); if (_previousNumber[presetName] >= _listDic[presetName].Count) { _randomOrder[presetName] = MakeRandomOrder(_listDic[presetName].Count, number); _previousNumber[presetName] = 0; _presetNumber[presetName].val = _previousNumber[presetName].ToString(); } } else { number = _previousNumber[presetName]; _previousNumber[presetName] = number + 1; _presetNumber[presetName].val = _previousNumber[presetName].ToString(); if (_previousNumber[presetName] >= _listDic[presetName].Count) { _previousNumber[presetName] = 0; _presetNumber[presetName].val = _previousNumber[presetName].ToString(); } } } if (_listDic[presetName][number].Contains(":")) { var posePresetSplit = _listDic[presetName][number].Split(':'); _posePresetFile = posePresetSplit[0] + ":/" + _presetSystemPath[presetName] + "/" + posePresetSplit[1] + ".vap"; } else { _posePresetFile = _presetSystemPath[presetName] + "/" + _listDic[presetName][number] + ".vap"; } int iPosi = _posePresetFile.LastIndexOf("/"); _posePresetFile = _posePresetFile.Insert(iPosi + 1, "Preset_"); _loadData = SuperController.singleton.ReadFileIntoString(_posePresetFile); _jSONNode = JSON.Parse(_loadData); _asArray = _jSONNode["storables"].AsArray; _isPosition = false; _isHip = false; _control = Vector3.zero; _rigidbodyPosiLocal = new Dictionary(); _rigidbodyRotaLocal = new Dictionary(); _rigidbodyPosiWorld = new Dictionary(); _rigidbodyRotaWorld = new Dictionary(); for (int i = 0; i < _asArray.Count; i++) { _asObject = _asArray[i].AsObject; _id = _asObject["id"]; if (_id == "control" && _asObject["position"] != null) { _isPosition = true; _posi.x = float.Parse(_asObject["position"][0]); _posi.y = float.Parse(_asObject["position"][1]); _posi.z = float.Parse(_asObject["position"][2]); _control = _posi; } else if (_id == "hipControl" && _asObject["localPosition"] != null) { _posi.x = float.Parse(_asObject["localPosition"][0]); _posi.y = float.Parse(_asObject["localPosition"][1]); _posi.z = float.Parse(_asObject["localPosition"][2]); _hipControl = _posi; } else if (_id == "hip" && _asObject["rootPosition"] != null) { _posi.x = float.Parse(_asObject["rootPosition"][0]); _posi.y = float.Parse(_asObject["rootPosition"][1]); _posi.z = float.Parse(_asObject["rootPosition"][2]); _rota.x = float.Parse(_asObject["rootRotation"][0]); _rota.y = float.Parse(_asObject["rootRotation"][1]); _rota.z = float.Parse(_asObject["rootRotation"][2]); _rigidbodyPosiLocal[_id] = _posi; _rigidbodyRotaLocal[_id] = Quaternion.Euler(_rota); _rigidbodyPosiWorld[_id] = _posi; _rigidbodyRotaWorld[_id] = Quaternion.Euler(_rota); _rootPosi = _posi; _rootRota = _rota; _isHip = true; } else if (Array.IndexOf(_rigidbodyNames, _id) >= 0 && _asObject["position"] != null) { _posi.x = float.Parse(_asObject["position"][0]); _posi.y = float.Parse(_asObject["position"][1]); _posi.z = float.Parse(_asObject["position"][2]); _rota.x = float.Parse(_asObject["rotation"][0]); _rota.y = float.Parse(_asObject["rotation"][1]); _rota.z = float.Parse(_asObject["rotation"][2]); _rigidbodyPosiLocal[_id] = _posi; _rigidbodyRotaLocal[_id] = Quaternion.Euler(_rota); GameObject parent = _targetAtom.GetStorableByID(_id).transform.parent.gameObject; GameObject parentRigid = new GameObject(); GameObject currentRigid = new GameObject(); parentRigid.transform.position = _rigidbodyPosiWorld[parent.name]; parentRigid.transform.rotation = _rigidbodyRotaWorld[parent.name]; currentRigid.transform.position = parentRigid.transform.TransformPoint(_posi); currentRigid.transform.rotation = _rigidbodyRotaWorld[parent.name] * _rigidbodyRotaLocal[_id]; _rigidbodyPosiWorld[_id] = currentRigid.transform.position; _rigidbodyRotaWorld[_id] = currentRigid.transform.rotation; } } if (_isHip) { float minY = 2f; string minName = "hip"; foreach (var item in _rigidbodyNames) { if (_rigidbodyPosiWorld[item] != null) { float thisY = _rigidbodyPosiWorld[item].y; if (minY > thisY) { minY = thisY; minName = item; } } } _min = -_rootPosi.y + minY + _hipControl.y; } else { _min = 1f; } _personPosi = _targetAtom.GetStorableByID("control").transform.position; _personRota = _targetAtom.GetStorableByID("control").transform.rotation; if (((_min < 0 && _enablePositionAdjust.val) || _isPosition) && _isIgnoreRootControl.val) { if (_isEnableDisappear.val) { _targetAtom.tempDisableRender = true; } _activeClothingList = new List(); var allGeometry = _targetAtom.GetStorableByID("geometry").GetBoolParamNames(); foreach (var item in allGeometry) { if (item.Contains("clothing:")) { if (_targetAtom.GetStorableByID("geometry").GetBoolJSONParam(item).val) { _targetAtom.GetStorableByID("geometry").GetBoolJSONParam(item).val = false; _activeClothingList.Add(item); } } } } _targetAtom.GetStorableByID("PosePresets").GetStringJSONParam("presetName").val = _listDic[presetName][number]; var setStartTime = DateTime.Now.Second * 1000 + DateTime.Now.Millisecond; var currentTime = setStartTime; do { currentTime = DateTime.Now.Second * 1000 + DateTime.Now.Millisecond; if (setStartTime > currentTime) { currentTime += 60000; } } while (currentTime - setStartTime < 200); _targetAtom.GetStorableByID("PosePresets").CallAction("LoadPreset"); _loadedPosi = _targetAtom.GetStorableByID("control").transform.position; _current[presetName].val = _listDic[presetName][number]; if (((_min < 0 && _enablePositionAdjust.val) || _isPosition) && _isIgnoreRootControl.val) { if (_min >= 0) { _min = 0; } else { if (_enablePositionAdjust.val) { _min -= 0.1f; } else { _min = 0; } } _targetAtom.GetStorableByID("control").transform.position = _personPosi - new Vector3(0, _min, 0); } } else { _current[presetName].val = ""; } } else { _current[presetName].val = ""; } _poseWaitStart = DateTime.Now.Second * 1000 + DateTime.Now.Millisecond; } public void MoveRoot() { if (((_min < 0 && _enablePositionAdjust.val) || _isPosition) && _isIgnoreRootControl.val) { foreach (var item in _activeClothingList) { _targetAtom.GetStorableByID("geometry").GetBoolJSONParam(item).val = true; } } _targetAtom.GetStorableByID("control").GetBoolJSONParam("detachControl").val = true; _targetAtom.GetStorableByID("control").transform.position = _personPosi; _targetAtom.GetStorableByID("control").transform.rotation = _personRota; _targetAtom.GetStorableByID("control").GetBoolJSONParam("detachControl").val = false; _poseWaitStart = DateTime.Now.Second * 1000 + DateTime.Now.Millisecond; } public void ChangeMorphs() { int number; var presetName = _morphs; if (_enablePresetDic[presetName].val) { if (_listDic[presetName].Count != 0) { if (_listDic[presetName].Count == 1) { number = 0; } else { if (_previousNumber[presetName] >= _listDic[presetName].Count) { _previousNumber[presetName] = 0; } if (_enableRnd.val) { number = _randomOrder[presetName][_previousNumber[presetName]]; _previousNumber[presetName] = _previousNumber[presetName] + 1; _presetNumber[presetName].val = _previousNumber[presetName].ToString(); if (_previousNumber[presetName] >= _listDic[presetName].Count) { _randomOrder[presetName] = MakeRandomOrder(_listDic[presetName].Count, number); _previousNumber[presetName] = 0; _presetNumber[presetName].val = _previousNumber[presetName].ToString(); } } else { number = _previousNumber[presetName]; _previousNumber[presetName] = number + 1; _presetNumber[presetName].val = _previousNumber[presetName].ToString(); if (_previousNumber[presetName] >= _listDic[presetName].Count) { _previousNumber[presetName] = 0; _presetNumber[presetName].val = _previousNumber[presetName].ToString(); } } } _current[presetName].val = _listDic[presetName][number]; _targetAtom.GetStorableByID("MorphPresets").GetStringJSONParam("presetName").val = _listDic[presetName][number]; _targetAtom.GetStorableByID("MorphPresets").GetBoolJSONParam("includePhysical").val = _isIncludePose.val; _targetAtom.GetStorableByID("MorphPresets").GetBoolJSONParam("includeAppearance").val = _isIncludeAppearance.val; string gluteFile; string breastFile; bool gluteTest = false; bool breastTest = false; if (_enablePhysicsPresets.val) { if (_listDic[presetName][number].Contains(":")) { var varSplit = _listDic[presetName][number].Split(':'); if (varSplit[1].Contains("/")) { varSplit[1] = varSplit[1].Insert(varSplit[1].LastIndexOf("/") + 1, "Preset_") + ".vap"; } else { varSplit[1] = "Preset_" + varSplit[1] + ".vap"; } gluteFile = varSplit[0] + ":/" + _glutePath + varSplit[1]; breastFile = varSplit[0] + ":/" + _breastPath + varSplit[1]; } else { var vapFile = _listDic[presetName][number]; if (vapFile.Contains("/")) { vapFile = vapFile.Insert(vapFile.LastIndexOf("/") + 1, "Preset_") + ".vap"; } else { vapFile = "Preset_" + vapFile + ".vap"; } gluteFile = _glutePath + vapFile; breastFile = _breastPath + vapFile; } gluteTest = FileManagerSecure.FileExists(gluteFile); if (gluteTest) { _targetAtom.GetStorableByID("FemaleGlutePhysicsPresets").GetStringJSONParam("presetName").val = _listDic[presetName][number]; } breastTest = FileManagerSecure.FileExists(breastFile); if (breastTest) { _targetAtom.GetStorableByID("FemaleBreastPhysicsPresets").GetStringJSONParam("presetName").val = _listDic[presetName][number]; } } var setStartTime = DateTime.Now.Second * 1000 + DateTime.Now.Millisecond; var currentTime = setStartTime; do { currentTime = DateTime.Now.Second * 1000 + DateTime.Now.Millisecond; if (setStartTime > currentTime) { currentTime += 60000; } } while (currentTime - setStartTime < 200); _targetAtom.GetStorableByID("MorphPresets").CallAction("LoadPreset"); if (gluteTest) { _targetAtom.GetStorableByID("FemaleGlutePhysicsPresets").CallAction("LoadPreset"); } if (breastTest) { _targetAtom.GetStorableByID("FemaleBreastPhysicsPresets").CallAction("LoadPreset"); } } else { _current[presetName].val = ""; } } else { _current[presetName].val = ""; } _poseWaitStart = DateTime.Now.Second * 1000 + DateTime.Now.Millisecond; } public void SetCurrentPlugin() { _pluginList = new List(); foreach (Transform transform in _manager.pluginListPanel) { var urlTransform = transform.Find("Panel").Find("URL").GetComponent().text; var uidTransform = transform.Find("UID").GetComponent().text; var initPlugin = uidTransform + "_" + urlTransform; _pluginList.Add(initPlugin.ToString()); } } public void ClearPlugins() { if (_enablePresetDic[_plugins].val && (_enablePresetDic[_clothing].val || _enablePresetDic[_appearance].val)) { TryFindRemoveButton(); foreach (Transform transform in _manager.pluginListPanel) { var urlTransform = transform.Find("Panel").Find("URL").GetComponent().text; var uidTransform = transform.Find("UID").GetComponent().text; _currentPlugin = uidTransform + "_" + urlTransform; if (!_pluginList.Contains(_currentPlugin)) { RemovePlugin(); } } } _poseWaitStart = DateTime.Now.Second * 1000 + DateTime.Now.Millisecond; _nextPreset = _plugins; } private void RemovePlugin() { try { _removeButton = FindRemoveButton(); _removeButton.onClick.Invoke(); } catch (Exception e) { SuperController.LogError($"Error removeing plugin : {e}"); } } public void TryFindRemoveButton() { try { _removeButton = FindRemoveButton(); if (_removeButton != null && waitingForUIOpened) { waitingForUIOpened = false; } } catch (Exception e) { SuperController.LogError($"Error trying to find remove button for {_currentPlugin} : {e}"); } } private Button FindRemoveButton() { if (_manager.pluginListPanel == null) { if (!waitingForUIOpened) { waitingForUIOpened = true; } return null; } foreach (Transform transform in _manager.pluginListPanel) { var urlTransform = transform.Find("Panel").Find("URL").GetComponent().text; var uidTransform = transform.Find("UID").GetComponent().text; var currentPlugin = uidTransform + "_" + urlTransform; if (currentPlugin == _currentPlugin) { var buttonTransform = transform.Find("RemoveButton"); return buttonTransform.GetComponent