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); } }
private void ExtendedSave_PoseBeingSaved(string poseName, PauseCtrl.FileInfo fileInfo, OCIChar ociChar, ExtendedSave.GameNames gameName) { var data = new PluginData(); //Facial expression #if PH data.data.Add(EyesPatternData, ociChar.charStatus.eyesPtn); data.data.Add(MouthPatternData, ociChar.charStatus.mouthPtn); data.data.Add(EyeOpenData, ociChar.charStatus.eyesOpenMax); data.data.Add(MouthOpenData, ociChar.oiCharInfo.mouthOpen); #else data.data.Add(EyebrowPatternData, ociChar.charFileStatus.eyebrowPtn); data.data.Add(EyesPatternData, ociChar.charFileStatus.eyesPtn); data.data.Add(MouthPatternData, ociChar.charFileStatus.mouthPtn); data.data.Add(EyeOpenData, ociChar.charFileStatus.eyesOpenMax); data.data.Add(MouthOpenData, ociChar.oiCharInfo.mouthOpen); #endif //Only save skirt FK if enabled if (ociChar.oiCharInfo.activeFK[SkirtFKIndex]) { Dictionary <int, Vector3> skirtFK = new Dictionary <int, Vector3>(); foreach (KeyValuePair <int, OIBoneInfo> item2 in ociChar.oiCharInfo.bones.Where(b => (OIBoneInfo.BoneGroup.Skirt & b.Value.group) != 0)) { skirtFK.Add(item2.Key, item2.Value.changeAmount.rot); } data.data.Add(SkirtFKData, MessagePackSerializer.Serialize(skirtFK)); } //Joint correction data.data.Add(JointCorrectionData, MessagePackSerializer.Serialize(ociChar.oiCharInfo.expression)); ExtendedSave.SetPoseExtendedDataById(PoseToolsData, data); }