Exemplo n.º 1
0
        private void ExtendedSave_PoseBeingLoaded(string poseName, PauseCtrl.FileInfo fileInfo, OCIChar ociChar, ExtendedSave.GameNames gameName)
        {
            bool       loadSkirtFK = false;
            PluginData data        = ExtendedSave.GetPoseExtendedDataById(PoseToolsData);

            if (data != null)
            {
                bool sameGame = false;

                //Only load expression data for the game this pose was created on, eye etc. patterns wouldn't match otherwise
#if KK || KKS
                if (gameName == ExtendedSave.GameNames.Koikatsu || gameName == ExtendedSave.GameNames.KoikatsuSunshine)
                {
                    sameGame = true;
                }
#elif AI || HS2
                if (gameName == ExtendedSave.GameNames.AIGirl || gameName == ExtendedSave.GameNames.HoneySelect2)
                {
                    sameGame = true;
                }
#elif PH
                if (gameName == ExtendedSave.GameNames.PlayHome)
                {
                    sameGame = true;
                }
#endif

                //Facial expression
                if (sameGame && ConfigLoadExpression.Value)
                {
#if !PH
                    if (data.data.TryGetValue(EyebrowPatternData, out var eyebrowPatternData))
                    {
                        ociChar.charInfo.ChangeEyebrowPtn((int)eyebrowPatternData);
                    }
#endif
                    if (data.data.TryGetValue(EyesPatternData, out var eyesPatternData))
                    {
                        ociChar.charInfo.ChangeEyesPtn((int)eyesPatternData);
                    }
                    if (data.data.TryGetValue(MouthPatternData, out var mouthPatternData))
                    {
                        ociChar.charInfo.ChangeMouthPtn((int)mouthPatternData);
                    }
                    if (data.data.TryGetValue(EyeOpenData, out var eyeOpenData))
                    {
                        ociChar.ChangeEyesOpen((float)eyeOpenData);
                    }
                    if (data.data.TryGetValue(MouthOpenData, out var mouthOpenData))
                    {
                        ociChar.ChangeMouthOpen((float)mouthOpenData);
                    }
                }

                //Skirt FK
                if (sameGame && ConfigLoadSkirtFK.Value && data.data.TryGetValue(SkirtFKData, out var skirtFKData) && skirtFKData != null)
                {
                    loadSkirtFK = true;
                    Dictionary <int, Vector3> skirtFK = MessagePackSerializer.Deserialize <Dictionary <int, Vector3> >((byte[])skirtFKData);
                    foreach (KeyValuePair <int, Vector3> item in skirtFK)
                    {
                        ociChar.oiCharInfo.bones[item.Key].changeAmount.rot = item.Value;
                    }
                }

                //Joint correction
                if (data.data.TryGetValue(JointCorrectionData, out var jointCorrectionData) && jointCorrectionData != null)
                {
                    bool[] expression = MessagePackSerializer.Deserialize <bool[]>((byte[])jointCorrectionData);
                    //Skip the first 4 since those are handled by vanilla code
                    for (int i = 4; i < expression.Length; i++)
                    {
                        ociChar.EnableExpressionCategory(i, expression[i]);
                    }
                }
            }

            if (!loadSkirtFK)
            {
                //Disable skirt FK if there was none to load since it's worthless to have enabled
                StartCoroutine(DisableSkirtFK(ociChar));
                ociChar.ActiveFK(OIBoneInfo.BoneGroup.Skirt, false);
            }
        }