internal void Backup() { Reset(); CharacterAccessoryController _controller = CharacterAccessory.GetController(_chaCtrl); int _coordinateIndex = _chaCtrl.fileStatus.coordinateType; List <int> _slots = _controller.PartsInfo.Keys.ToList(); foreach (string _key in _containerKeys) { int n = Traverse.Create(_extdataLink[_key]).Property("Count").GetValue <int>(); DebugMsg(LogLevel.Warning, $"[MaterialEditor][Backup][{_chaCtrl.GetFullname()}][_extdataLink[{_key}] count: {n}]"); for (int i = 0; i < n; i++) { object x = _extdataLink[_key].RefElementAt(i).JsonClone(); // should I null cheack this? //if (Traverse.Create(x).Field("ObjectType").GetValue<int>() != (int) ObjectType.Accessory) continue; if (Traverse.Create(x).Field("ObjectType").Method("ToString").GetValue <string>() != "Accessory") { continue; } if (Traverse.Create(x).Field("CoordinateIndex").GetValue <int>() != _coordinateIndex) { continue; } if (_slots.IndexOf(Traverse.Create(x).Field("Slot").GetValue <int>()) < 0) { continue; } Traverse.Create(x).Field("CoordinateIndex").SetValue(-1); Traverse.Create(_charaAccData[_key]).Method("Add", new object[] { x }).GetValue(); } DebugMsg(LogLevel.Warning, $"[MaterialEditor][Backup][{_chaCtrl.GetFullname()}][_charaAccData[{_key}] count: {Traverse.Create(_charaAccData[_key]).Property("Count").GetValue<int>()}]"); //string json = JSONSerializer.Serialize(_charaAccData[_key].GetType(), _charaAccData[_key], true); //DebugMsg(LogLevel.Warning, $"{_charaAccData[_key].GetType()}\n" + json); } object TextureDictionary = Traverse.Create(_pluginCtrl).Field("TextureDictionary").GetValue(); foreach (object x in _charaAccData["MaterialTexturePropertyList"] as IList) { int?TexID = Traverse.Create(x).Field("TexID").GetValue <int?>(); if (TexID != null) { if (_texData.ContainsKey((int)TexID)) { continue; } object _tex = TextureDictionary.RefTryGetValue(TexID); if (_tex != null) { _texData[(int)TexID] = Traverse.Create(_tex).Property("Data").GetValue <byte[]>(); DebugMsg(LogLevel.Warning, $"[TexID: {TexID}][Length: {_texData[(int) TexID].Length}]"); } } } }
internal static void RegisterStudioControls() { if (!Running) { return; } Loaded = true; CurrentStateCategorySwitch StudioToggleEnable = new CurrentStateCategorySwitch("Enable", OCIChar => (bool)GetController(OCIChar)?.FunctionEnable); StudioToggleEnable.Value.Subscribe(_value => { CharacterAccessoryController _pluginCtrl = StudioAPI.GetSelectedControllers <CharacterAccessoryController>().FirstOrDefault(); if (_pluginCtrl == null) { return; } _pluginCtrl.FunctionEnable = _value; }); StudioAPI.GetOrCreateCurrentStateCategory("CharaAcc").AddControl(StudioToggleEnable); CurrentStateCategorySwitch StudioToggleAutoCopyToBlank = new CurrentStateCategorySwitch("Auto Copy To Blank", OCIChar => (bool)GetController(OCIChar)?.AutoCopyToBlank); StudioToggleAutoCopyToBlank.Value.Subscribe(_value => { CharacterAccessoryController _pluginCtrl = StudioAPI.GetSelectedControllers <CharacterAccessoryController>().FirstOrDefault(); if (_pluginCtrl == null) { return; } _pluginCtrl.AutoCopyToBlank = _value; }); StudioAPI.GetOrCreateCurrentStateCategory("CharaAcc").AddControl(StudioToggleAutoCopyToBlank); List <string> coordinateList = Enum.GetNames(typeof(ChaFileDefine.CoordinateType)).ToList(); coordinateList.Add("CharaAcc"); CurrentStateCategoryDropdown StudioDropdownRef = new CurrentStateCategoryDropdown("Referral", coordinateList.ToArray(), OCIChar => (int)GetController(OCIChar)?.ReferralIndex); StudioDropdownRef.Value.Subscribe(_value => { CharacterAccessoryController _pluginCtrl = StudioAPI.GetSelectedControllers <CharacterAccessoryController>().FirstOrDefault(); if (_pluginCtrl == null) { return; } _pluginCtrl.SetReferralIndex(_value); }); StudioAPI.GetOrCreateCurrentStateCategory("CharaAcc").AddControl(StudioDropdownRef); }
internal static bool DuringLoading_Prefix(CharaCustomFunctionController __instance) { ChaControl _chaCtrl = __instance.ChaControl; CharacterAccessoryController _pluginCtrl = GetController(_chaCtrl); if (_pluginCtrl.DuringLoading) { #if DEBUG DebugMsg(LogLevel.Warning, $"[DuringLoading_Prefix][{_chaCtrl.GetFullname()}] await loading"); #endif return(false); } return(true); }
internal static bool ChaControl_UpdateVisible_Patches_Prefix(ChaControl __0) { CharacterAccessoryController _pluginCtrl = GetController(__0); if (_pluginCtrl == null) { return(true); } if (_pluginCtrl.DuringLoading) { #if DEBUG DebugMsg(LogLevel.Warning, $"[ChaControl_UpdateVisible_Patches_Prefix][{__0.GetFullname()}] await loading"); #endif return(false); } return(true); }
internal void Backup() { if (!_installed) { return; } Reset(); RefreshCache(); object TriggerPropertyList = Traverse.Create(_pluginCtrl).Field("_cachedCoordinatePropertyList").GetValue(); object TriggerGroupList = Traverse.Create(_pluginCtrl).Field("_cachedCoordinateGroupList").GetValue(); if (TriggerPropertyList == null) { return; } CharacterAccessoryController _controller = CharacterAccessory.GetController(_chaCtrl); HashSet <int> _slots = new HashSet <int>(_controller.PartsInfo?.Keys); for (int i = 0; i < (TriggerPropertyList as IList).Count; i++) { object x = TriggerPropertyList.RefElementAt(i).JsonClone(); if (!_slots.Contains(Traverse.Create(x).Property("Slot").GetValue <int>())) { continue; } Traverse.Create(x).Property("Coordinate").SetValue(-1); (_charaAccData["TriggerPropertyList"] as IList).Add(x); } for (int i = 0; i < (TriggerGroupList as IList).Count; i++) { object x = TriggerGroupList.RefElementAt(i).JsonClone(); Traverse.Create(x).Property("Coordinate").SetValue(-1); (_charaAccData["TriggerGroupList"] as IList).Add(x); int _kind = Traverse.Create(x).Property("Kind").GetValue <int>(); string _guid = Traverse.Create(x).Property("GUID").GetValue <string>(); _guidMapping[_guid] = _kind; } }
internal void Backup() { if (!_installed) { return; } _charaAccData.Clear(); CharacterAccessoryController _controller = CharacterAccessory.GetController(_chaCtrl); int _coordinateIndex = _chaCtrl.fileStatus.coordinateType; List <int> _slots = _controller.PartsInfo?.Keys?.ToList(); object _extdataLink = GetExtDataLink(_coordinateIndex); if (_extdataLink == null) { return; } int n = (_extdataLink as IList).Count; for (int i = 0; i < n; i++) { object _rule = _extdataLink.RefElementAt(i); string _path = Traverse.Create(_rule).Property("GameObjectPath").GetValue <string>(); if (!_path.Contains($"/ca_slot")) { continue; } //DebugMsg(LogLevel.Warning, $"[MaterialRouter][Backup][{_chaCtrl.GetFullname()}][{_path}]"); foreach (int _slotIndex in _slots) { if (!_path.Contains($"/ca_slot{_slotIndex:00}/")) { continue; } DebugMsg(LogLevel.Warning, $"[MaterialRouter][Backup][{_slotIndex}]"); _charaAccData.Add(_rule.JsonClone()); } } //DebugMsg(LogLevel.Warning, $"[MaterialRouter][Backup][{_chaCtrl.GetFullname()}][{_charaAccData.Count}]"); }
internal void Backup() { if (!_installed) { return; } _charaAccData.Clear(); object _extdataLink = GetExtDataLink(); if (_extdataLink == null) { return; } int _coordinateIndex = _chaCtrl.fileStatus.coordinateType; CharacterAccessoryController _controller = CharacterAccessory.GetController(_chaCtrl); List <int> _slots = _controller.PartsInfo?.Keys?.ToList(); int n = (_extdataLink as IList).Count; for (int i = 0; i < n; i++) { object x = _extdataLink.RefElementAt(i).JsonClone(); // should I null cheack this? if (Traverse.Create(x).Field("CoordinateIndex").GetValue <int>() != _coordinateIndex) { continue; } if (_slots.IndexOf(Traverse.Create(x).Field("Slot").GetValue <int>()) < 0) { continue; } Traverse.Create(x).Field("CoordinateIndex").SetValue(-1); Traverse.Create(_charaAccData).Method("Add", new object[] { x }).GetValue(); #if DEBUG DebugMsg(LogLevel.Warning, $"[DynamicBoneEditor][Backup][Slot: {_chaCtrl.GetFullname()}][{Traverse.Create(x).Field("Slot").GetValue<int>()}]"); #endif } DebugMsg(LogLevel.Warning, $"[DynamicBoneEditor][Backup][Count: {_chaCtrl.GetFullname()}][{_charaAccData.Count}]"); }
private void RegisterCustomSubCategories(object sender, RegisterSubCategoriesEvent args) { ChaControl _chaCtrl = CustomBase.Instance.chaCtrl; CharacterAccessoryController _pluginCtrl = GetController(_chaCtrl); SidebarToggleEnable = args.AddSidebarControl(new SidebarToggle("CharaAcc", CfgMakerMasterSwitch.Value, this)); SidebarToggleEnable.ValueChanged.Subscribe(value => CfgMakerMasterSwitch.Value = value); MakerCategory category = new MakerCategory("03_ClothesTop", "tglCharaAcc", MakerConstants.Clothes.Copy.Position + 1, "CharaAcc"); args.AddSubCategory(category); args.AddControl(new MakerText("The set to be used as a template to clone on load", category, this)); List <string> coordinateList = Enum.GetNames(typeof(ChaFileDefine.CoordinateType)).ToList(); coordinateList.Add("CharaAcc"); MakerDropdownRef = new MakerDropdown("Referral", coordinateList.ToArray(), category, 0, this); MakerDropdownRef.ValueChanged.Subscribe(value => { _pluginCtrl.SetReferralIndex(value); }); args.AddControl(MakerDropdownRef); MakerToggleEnable = args.AddControl(new MakerToggle(category, "Enable", false, this)); MakerToggleEnable.ValueChanged.Subscribe(value => { _pluginCtrl.FunctionEnable = value; }); MakerToggleAutoCopyToBlank = args.AddControl(new MakerToggle(category, "Auto Copy To Blank", false, this)); MakerToggleAutoCopyToBlank.ValueChanged.Subscribe(value => { _pluginCtrl.AutoCopyToBlank = value; }); args.AddControl(new MakerButton("Backup", category, this)).OnClick.AddListener(delegate { if (_pluginCtrl.DuringLoading) { return; } _pluginCtrl.Backup(); }); args.AddControl(new MakerButton("Restore", category, this)).OnClick.AddListener(delegate { if (_pluginCtrl.DuringLoading) { return; } if (MoreAccessoriesSupport.ListUsedPartsInfo(_chaCtrl, _chaCtrl.fileStatus.coordinateType).Count > 0) { Logger.LogMessage("Please clear the accessories on current coordinate before using this function"); return; } _pluginCtrl.TaskLock(); _pluginCtrl.RestorePartsInfo(); }); args.AddControl(new MakerButton("Reset", category, this)).OnClick.AddListener(delegate { if (_pluginCtrl.DuringLoading) { return; } _pluginCtrl.Reset(); MakerDropdownRef.Value = _pluginCtrl.ReferralIndex; MakerToggleEnable.Value = _pluginCtrl.FunctionEnable; MakerToggleAutoCopyToBlank.Value = _pluginCtrl.AutoCopyToBlank; }); #if DEBUG args.AddControl(new MakerButton("Transfer", category, this)).OnClick.AddListener(delegate { if (_pluginCtrl.DuringLoading) { return; } if (_pluginCtrl.ReferralIndex > 6) { Logger.LogMessage("Please choose a coordinate other than CharaAcc as referral"); return; } _pluginCtrl.TaskLock(); _pluginCtrl.PrepareQueue(); }); args.AddControl(new MakerButton("Hair info (local)", category, this)).OnClick.AddListener(delegate { _pluginCtrl.HairAccessoryCustomizer.DumpInfo(true); }); args.AddControl(new MakerButton("Hair info", category, this)).OnClick.AddListener(delegate { _pluginCtrl.HairAccessoryCustomizer.DumpInfo(false); }); #endif }