예제 #1
0
                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}]");
                            }
                        }
                    }
                }
예제 #2
0
            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);
            }
예제 #3
0
            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);
            }
예제 #4
0
                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);
                }
예제 #5
0
                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;
                    }
                }
예제 #6
0
                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}]");
                }
예제 #7
0
                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}]");
                }
예제 #8
0
        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
        }