Exemple #1
0
        public void OnDisable()
        {
            if (IsKiss || kissing)
            {
                Kiss(false, immediateStop: true);

                if (bvs.Count() == 0)
                {
                    ReloadBlendValues();
                }

                voiceCtrl.isPrcoStop = false;

                if (origFinishFlag != HFlag.FinishKind.none)
                {
                    flags.finish   = origFinishFlag;
                    origFinishFlag = HFlag.FinishKind.none;
                }

                female.ChangeEyesBlinkFlag(true);
            }
        }
Exemple #2
0
        private void Update()
        {
            if (voiceCtrl == null)
            {
                voiceCtrl = FindObjectOfType <HVoiceCtrl>();
                if (voiceCtrl == null)
                {
                    return;
                }
            }

            if (bvs.Count() == 0)
            {
                ReloadBlendValues();
            }

            float curDistance = Vector3.Distance(myMouth.transform.position, tang.transform.position);
            float threshold;

            if (flags.mode == HFlag.EMode.aibu)
            {
                threshold = CyuLoaderVR.KissDistanceAibu.Value;

                if (((VRHandCtrl[])hands).Any((VRHandCtrl h) => h.IsAction()))
                {
                    isAibuTouching = true;
                }
                else
                {
                    isAibuTouching = false;
                }
            }
            else
            {
                threshold = CyuLoaderVR.KissDistance.Value;
            }


            if (flags.click == HFlag.ClickKind.inside || flags.click == HFlag.ClickKind.outside)
            {
                isInOrgasm = true;
            }

            //If currently in o****m, stop kissing immediately without disengaging transition to prevent interferring with o****m animation or voice
            if (isInOrgasm)
            {
                Kiss(false, immediateStop: true);
            }
            else if (curDistance < threshold)
            {
                if (flags.mode != HFlag.EMode.aibu || (!kissing && !IsSiruActive()))
                {
                    Kiss(true);
                }
                //Continue kissing if currently transitioning into kiss, or if within distance threshold
                //The distance threshold is larger when groping to allow some eye candy
                else if (curDistance < (isAibuTouching ? (ExitKissDistance + 0.04f) : ExitKissDistance) || kissPhase == Phase.Engaging)
                {
                    Kiss(true);
                }
                else
                {
                    Kiss(false);
                }
            }
            else
            {
                Kiss(false);
            }

            //Stop girl from speaking lines and manually proc breath/moan sounds
            //when she is not in o****m and is still kissing or saliva string still visible
            if (!isInOrgasm && (kissing || IsSiruActive()))
            {
                voiceCtrl.isPrcoStop = true;

                //Manually proc breath sound every frame causes eyes flickering when initiating kissing during transition of releasing a body part in caress mode
                //This makes sure breath proc is not run when approaching to kiss in caress mode
                if (flags.mode == HFlag.EMode.aibu ? kissPhase > Phase.Engaging : true)
                {
                    breathProcDelegate.Invoke(voiceCtrl, female.animBody.GetCurrentAnimatorStateInfo(0), female, 0);
                }
            }
            else
            {
                voiceCtrl.isPrcoStop = false;
            }

            if (kissing)
            {
                if (flags.mode == HFlag.EMode.aibu)
                {
                    //Use configured value (KissMotionSpeed) to control animation speed during kissing in caress mode
                    //Increase animation speed further if GropeOverride is set to true and groping motion is larger than KissMotionSpeed
                    if (CyuLoaderVR.GropeOverride.Value && kissPhase == Phase.InAction && isAibuTouching)
                    {
                        //Use the higher value between dragSpeed(value based on controller movement) and speedItem(game calculated value) to set kissing animation speed
                        //Then make sure the speed value used for calculating animation speed is reset to a minimum
                        //so that it doesn't get stuck at a high value, causing kissing animation speed to also be stuck at a high value.
                        flags.SpeedUpClickAibu(flags.rateDragSpeedUp, Mathf.Clamp(Mathf.Max(dragSpeed, flags.speedItem), CyuLoaderVR.KissMotionSpeed.Value, 1.5f), true);

                        dragSpeed = 0.0001f;
                    }
                    else
                    {
                        flags.SpeedUpClickAibu(flags.rateDragSpeedUp, CyuLoaderVR.KissMotionSpeed.Value, true);
                    }
                }

                //While kissing, assigns HFlag.finish to none to prevent o****m, while storing the finish flag in origFinishFlag to be assigned back to the game after kissing
                if (flags.finish != HFlag.FinishKind.none)
                {
                    origFinishFlag = flags.finish;
                    flags.finish   = HFlag.FinishKind.none;
                }

                flags.DragStart();
            }
            else
            {
                //Outside of kissing, restore finish flag from origFinishFlag to resume o****m
                if (origFinishFlag != HFlag.FinishKind.none)
                {
                    flags.finish   = origFinishFlag;
                    origFinishFlag = HFlag.FinishKind.none;
                }

                female.ChangeEyesBlinkFlag(true);
            }
        }