Example #1
0
            protected override void OnReload(GameMode currentGameMode)
            {
                TaskUnlock();

                PluginData ExtendedData = GetExtendedData();

                PartsInfo.Clear();
                PartsResolveInfo.Clear();
                FunctionEnable  = false;
                AutoCopyToBlank = false;
                ReferralIndex   = RefMax;
                MaterialEditor.Reset();

                if (ExtendedData != null)
                {
                    if (ExtendedData.data.TryGetValue("MoreAccessoriesExtdata", out object loadedMoreAccessoriesExtdata) && loadedMoreAccessoriesExtdata != null)
                    {
                        PartsInfo = MessagePackSerializer.Deserialize <Dictionary <int, ChaFileAccessory.PartsInfo> >((byte[])loadedMoreAccessoriesExtdata);
                    }
                    if (ExtendedData.data.TryGetValue("ResolutionInfoExtdata", out object loadedResolutionInfoExtdata) && loadedResolutionInfoExtdata != null)
                    {
                        PartsResolveInfo = MessagePackSerializer.Deserialize <Dictionary <int, ResolveInfo> >((byte[])loadedResolutionInfoExtdata);
                    }

                    foreach (string _name in SupportList)
                    {
                        if (ExtendedData.data.TryGetValue($"{_name}Extdata", out object loadedExtdata) && loadedExtdata != null)
                        {
                            if (_name == "HairAccessoryCustomizer")
                            {
                                Traverse.Create(this).Field(_name).Method("Load", new object[] { MessagePackSerializer.Deserialize <Dictionary <int, string> >((byte[])loadedExtdata) }).GetValue();
                            }
                            else if (_name == "AccStateSync")
                            {
                                if (ExtendedData.version < 2)
                                {
                                    Traverse.Create(this).Field(_name).Method("Migrate", new object[] { MessagePackSerializer.Deserialize <Dictionary <int, string> >((byte[])loadedExtdata) }).GetValue();
                                }
                                else
                                {
                                    Traverse.Create(this).Field(_name).Method("Load", new object[] { MessagePackSerializer.Deserialize <Dictionary <string, string> >((byte[])loadedExtdata) }).GetValue();
                                }
                            }
                            else if (_name == "MaterialEditor")
                            {
                                Traverse.Create(this).Field(_name).Method("Load", new object[] { MessagePackSerializer.Deserialize <Dictionary <string, string> >((byte[])loadedExtdata) }).GetValue();
                            }
                            else if ((_name == "MaterialRouter") || (_name == "DynamicBoneEditor"))
                            {
                                Traverse.Create(this).Field(_name).Method("Load", new object[] { MessagePackSerializer.Deserialize <List <string> >((byte[])loadedExtdata) }).GetValue();
                            }
                        }
                    }

                    if (ExtendedData.data.TryGetValue("FunctionEnable", out object loadedFunctionEnable) && loadedFunctionEnable != null)
                    {
                        FunctionEnable = (bool)loadedFunctionEnable;
                    }
                    if (ExtendedData.data.TryGetValue("AutoCopyToBlank", out object loadedAutoCopyToBlank) && loadedAutoCopyToBlank != null)
                    {
                        AutoCopyToBlank = (bool)loadedAutoCopyToBlank;
                    }

                    if (ExtendedData.data.TryGetValue("ReferralIndex", out object loadedReferralIndex) && loadedReferralIndex != null)
                    {
                        SetReferralIndex((int)loadedReferralIndex);
                    }
                    if (ExtendedData.data.TryGetValue("TextureContainer", out object loadedTextureContainer) && loadedTextureContainer != null)
                    {
                        MaterialEditor.TexContainer = MessagePackSerializer.Deserialize <Dictionary <int, byte[]> >((byte[])loadedTextureContainer);
                    }

                    foreach (KeyValuePair <int, ChaFileAccessory.PartsInfo> _part in PartsInfo)
                    {
                        if (!PartsResolveInfo.ContainsKey(_part.Key))
                        {
                            continue;
                        }
                        if (PartsResolveInfo[_part.Key] == null)
                        {
                            continue;
                        }

                        ResolveInfo _info = PartsResolveInfo[_part.Key];
                        MigrateData(ref _info);

                        if (_info != null)
                        {
                            if (!_info.GUID.IsNullOrEmpty())
                            {
                                _info = UniversalAutoResolver.TryGetResolutionInfo(PartsResolveInfo[_part.Key].Slot, PartsResolveInfo[_part.Key].CategoryNo, PartsResolveInfo[_part.Key].GUID);
                            }
                            PartsResolveInfo[_part.Key] = _info.JsonClone() as ResolveInfo;
                            _part.Value.id = _info.LocalSlot;
                        }
                        else
                        {
                            PartsResolveInfo[_part.Key] = null;
                        }
                    }
                }

                if (MakerAPI.InsideAndLoaded)
                {
                    MakerToggleEnable.Value          = FunctionEnable;
                    MakerToggleAutoCopyToBlank.Value = AutoCopyToBlank;
                    MakerDropdownRef.Value           = ReferralIndex;
                }

                IEnumerator OnReloadCoroutine()
                {
                    DebugMsg(LogLevel.Warning, $"[OnReloadCoroutine][{ChaControl.GetFullname()}] fired");

                    yield return(new WaitForEndOfFrame());

                    yield return(new WaitForEndOfFrame());

                    AutoCopyCheck();
                }

                ChaControl.StartCoroutine(OnReloadCoroutine());

                base.OnReload(currentGameMode);
            }