Esempio n. 1
0
        public bool IsWearingAtLeast(EBodyArea target, WEAR_SHOW min)
        {
            if (target == EBodyArea.BREASTS)
            {
                return((Actor.wears.IsEquiped(Actor.customParam, WEAR_SHOW_TYPE.BRA) && Actor.wears.GetShow(WEAR_SHOW_TYPE.BRA, false) <= min) ||
                       (Actor.wears.IsEquiped(Actor.customParam, WEAR_SHOW_TYPE.TOPUPPER) && Actor.wears.GetShow(WEAR_SHOW_TYPE.TOPUPPER, false) <= min) ||
                       (Actor.wears.IsEquiped(Actor.customParam, WEAR_SHOW_TYPE.TOPLOWER) && Actor.wears.GetShow(WEAR_SHOW_TYPE.TOPLOWER, false) <= min) ||
                       (Actor.wears.IsEquiped(Actor.customParam, WEAR_SHOW_TYPE.SWIM_TOPUPPER) && Actor.wears.GetShow(WEAR_SHOW_TYPE.SWIM_TOPUPPER, false) <= min) ||
                       (Actor.wears.IsEquiped(Actor.customParam, WEAR_SHOW_TYPE.SWIM_TOPLOWER) && Actor.wears.GetShow(WEAR_SHOW_TYPE.SWIM_TOPLOWER, false) <= min) ||
                       (Actor.wears.IsEquiped(Actor.customParam, WEAR_SHOW_TYPE.SWIMUPPER) && Actor.wears.GetShow(WEAR_SHOW_TYPE.SWIMUPPER, false) <= min));
            }
            else if (target == EBodyArea.CROTCH)
            {
                return((Actor.wears.IsEquiped(Actor.customParam, WEAR_SHOW_TYPE.BOTTOM) && Actor.wears.GetShow(WEAR_SHOW_TYPE.BOTTOM, false) <= min) ||
                       (Actor.wears.IsEquiped(Actor.customParam, WEAR_SHOW_TYPE.PANST) && Actor.wears.GetShow(WEAR_SHOW_TYPE.PANST, false) <= WEAR_SHOW.ALL) ||
                       (Actor.wears.IsEquiped(Actor.customParam, WEAR_SHOW_TYPE.SWIM_BOTTOM) && Actor.wears.GetShow(WEAR_SHOW_TYPE.SWIM_BOTTOM, false) <= min) ||
                       (Actor.wears.IsEquiped(Actor.customParam, WEAR_SHOW_TYPE.SWIMLOWER) && Actor.wears.GetShow(WEAR_SHOW_TYPE.SWIMLOWER, false) <= min) ||
                       (Actor.wears.IsEquiped(Actor.customParam, WEAR_SHOW_TYPE.SHORTS) && Actor.wears.GetShow(WEAR_SHOW_TYPE.SHORTS, false) <= min));
            }
            else if (target == EBodyArea.THIGHS)
            {
                return((Actor.wears.IsEquiped(Actor.customParam, WEAR_SHOW_TYPE.BOTTOM) && Actor.wears.GetShow(WEAR_SHOW_TYPE.BOTTOM, false) <= min) ||
                       (Actor.wears.IsEquiped(Actor.customParam, WEAR_SHOW_TYPE.PANST) && Actor.wears.GetShow(WEAR_SHOW_TYPE.PANST, false) <= min));
            }


            return(false);
        }
Esempio n. 2
0
        public void DoUndressStep(EBodyArea target, bool bShovePantiesAside = false)
        {
            if (bShovePantiesAside && CanShoveAsidePanties())
            {
                Actor.wears.ChangeShow(WEAR_SHOW_TYPE.SHORTS, UndressStep(WEAR_SHOW_TYPE.SHORTS, Actor));
                return;
            }

            if (!DoUndressStep(target, WEAR_SHOW.ALL, !bShovePantiesAside))
            {
                DoUndressStep(target, WEAR_SHOW.HALF, false);
            }
        }
Esempio n. 3
0
        private void UpdateHand()
        {
            var tTrigger = Controller.GetPress(EVRButtonId.k_EButton_SteamVR_Trigger);

            if (m_eHandMode != EHandMode.NONE)
            {
                m_handCanvas.transform.LookAt(VRCamera.Instance.SteamCam.head);
            }

            if (m_eHandMode == EHandMode.NONE || m_eHandMode == EHandMode.SHOW)
            {
                // pointing and near anything?
                float fRange = Mathf.Clamp(transform.localScale.magnitude * GRABRANGE, GRABRANGE, GRABRANGE * 5) * VR.Settings.IPDScale;
                if (Physics.Raycast(m_raycastTransform.position, m_raycastTransform.forward, out var hit, fRange))
                {
                    // is it a girl?
                    if (hit.collider.GetComponentInParent <Female>() is Female female && VR.Interpreter.Actors.FirstOrDefault(x => ((PlayHomeActor)x).Actor == female) is PlayHomeActor actor)
                    {
                        Vector3   bestHitPoint = hit.point;
                        Transform newParent    = null;

                        if (hit.collider.name.Contains("Spine03") && actor.IsWearingAtLeast(EBodyArea.BREASTS, WEAR_SHOW.HALF))
                        {
                            bestHitPoint = GetBreastCollision(female, hit, fRange);
                            EnterHandMode(EHandMode.SHOW);

                            newParent           = female.BrestPosTrans;
                            m_eGrabTarget       = EBodyArea.BREASTS;
                            m_grabStartGravityL = female.body.bustDynamicBone_L.Gravity;
                            m_grabStartGravityR = female.body.bustDynamicBone_R.Gravity;
                            m_bGravityChanged   = false;
                        }
                        else if (hit.collider.name.Contains("kosi") && actor.IsWearingAtLeast(EBodyArea.CROTCH, WEAR_SHOW.HALF))
                        {
                            bestHitPoint = GetBreastCollision(female, hit, fRange);
                            EnterHandMode(EHandMode.SHOW);

                            newParent     = female.CrotchTrans;
                            m_eGrabTarget = EBodyArea.CROTCH;
                        }
                        else if (hit.collider.name.Contains("LegUp") && actor.IsWearingAtLeast(EBodyArea.THIGHS, WEAR_SHOW.HALF))
                        {
                            bestHitPoint = GetBreastCollision(female, hit, fRange);
                            EnterHandMode(EHandMode.SHOW);

                            newParent     = female.CrotchTrans;
                            m_eGrabTarget = EBodyArea.THIGHS;
                        }
                        else
                        {
                            EnterHandMode(EHandMode.NONE);
                            return;
                        }

                        m_handCanvas.transform.position = Vector3.MoveTowards(bestHitPoint, m_raycastTransform.position, GRABCURSOR_DISTANCE * VR.Settings.IPDScale);

                        if (m_eHandMode == EHandMode.SHOW && tTrigger)
                        {
                            VRLog.Debug("Grabbing " + m_eGrabTarget);
                            EnterHandMode(EHandMode.GRABBING);
                            m_grabbedActor = actor;
                            m_handCanvas.transform.SetParent(newParent);
                            m_grabStartHitPos = m_handCanvas.transform.position;
                        }
                        return;
                    }
                }
                EnterHandMode(EHandMode.NONE);
            }
            else if (m_eHandMode == EHandMode.GRABBING)
            {
                if (!tTrigger)
                {
                    EnterHandMode(EHandMode.NONE);
                    return;
                }

                bool  bShovePanties = false;
                float fDist         = 0;
                if (m_eGrabTarget == EBodyArea.BREASTS)
                {
                    fDist = m_handCanvas.transform.parent.InverseTransformDirection(m_raycastTransform.position).y - m_handCanvas.transform.parent.InverseTransformDirection(m_grabStartControllerPos).y;
                    m_handCanvas.transform.position = m_grabStartHitPos + (m_handCanvas.transform.parent.up * Math.Max(fDist, 0));

                    // Are the breasts covered with clothes which "pull" on them while we grab?
                    if (m_grabbedActor.IsWearingAtLeast(EBodyArea.BREASTS, WEAR_SHOW.ALL))
                    {
                        m_bGravityChanged = true;
                        m_grabbedActor.Actor.body.bustDynamicBone_L.setGravity(0, m_grabStartGravityL + (m_handCanvas.transform.parent.up * Mathf.Clamp(fDist * 0.03f, 0, GRABCOMPLETEMOVE * 0.03f)));
                        m_grabbedActor.Actor.body.bustDynamicBone_R.setGravity(0, m_grabStartGravityR + (m_handCanvas.transform.parent.up * Mathf.Clamp(fDist * 0.03f, 0, GRABCOMPLETEMOVE * 0.03f)));
                    }
                }
                else if (m_eGrabTarget == EBodyArea.THIGHS)
                {
                    fDist = m_handCanvas.transform.parent.InverseTransformDirection(m_grabStartControllerPos).y - m_handCanvas.transform.parent.InverseTransformDirection(m_raycastTransform.position).y;
                    m_handCanvas.transform.position = m_grabStartHitPos - (m_handCanvas.transform.parent.up * Math.Max(fDist, 0));
                }
                else if (m_eGrabTarget == EBodyArea.CROTCH)
                {
                    // Two Options: Right for panties, down for other things
                    fDist = m_grabbedActor.IsAnythingButShovingPantiesForCrotch() ? m_handCanvas.transform.parent.InverseTransformDirection(m_grabStartControllerPos).y - m_handCanvas.transform.parent.InverseTransformDirection(m_raycastTransform.position).y : 0;
                    float fDistAlt = m_grabbedActor.CanShoveAsidePanties() ? m_handCanvas.transform.parent.InverseTransformDirection(m_grabStartControllerPos).x - m_handCanvas.transform.parent.InverseTransformDirection(m_raycastTransform.position).x : 0;

                    if (fDistAlt > fDist)
                    {
                        fDist         = fDistAlt;
                        bShovePanties = true;
                        m_handCanvas.transform.position = m_grabStartHitPos - (m_handCanvas.transform.parent.right * Math.Max(fDist, 0));
                    }
                    else
                    {
                        m_handCanvas.transform.position = m_grabStartHitPos - (m_handCanvas.transform.parent.up * Math.Max(fDist, 0));
                    }
                }

                if (fDist >= GRABCOMPLETEMOVE * VR.Settings.IPDScale)
                {
                    VRLog.Debug("Grab complete for" + m_grabbedActor.Actor.name + " Area " + m_eGrabTarget);
                    m_grabbedActor.DoUndressStep(m_eGrabTarget, bShovePanties);
                    EnterHandMode(EHandMode.NONE);
                }
            }
        }
Esempio n. 4
0
        private bool DoUndressStep(EBodyArea target, WEAR_SHOW currentStep, bool bNoPanties)
        {
            // Order matters to get the proper undress sequence
            if (target == EBodyArea.BREASTS)
            {
                if ((Actor.wears.IsEquiped(Actor.customParam, WEAR_SHOW_TYPE.TOPUPPER) && Actor.wears.GetShow(WEAR_SHOW_TYPE.TOPUPPER, false) == currentStep) ||
                    (Actor.wears.IsEquiped(Actor.customParam, WEAR_SHOW_TYPE.TOPLOWER) && Actor.wears.GetShow(WEAR_SHOW_TYPE.TOPLOWER, false) == currentStep))
                {
                    Actor.wears.ChangeShow(WEAR_SHOW_TYPE.TOPUPPER, UndressStep(WEAR_SHOW_TYPE.TOPUPPER, Actor));
                    Actor.wears.ChangeShow(WEAR_SHOW_TYPE.TOPLOWER, UndressStep(WEAR_SHOW_TYPE.TOPLOWER, Actor));
                }
                else if ((Actor.wears.IsEquiped(Actor.customParam, WEAR_SHOW_TYPE.SWIM_TOPUPPER) && Actor.wears.GetShow(WEAR_SHOW_TYPE.SWIM_TOPUPPER, false) == currentStep) ||
                         (Actor.wears.IsEquiped(Actor.customParam, WEAR_SHOW_TYPE.SWIM_TOPLOWER) && Actor.wears.GetShow(WEAR_SHOW_TYPE.SWIM_TOPLOWER, false) == currentStep))
                {
                    Actor.wears.ChangeShow(WEAR_SHOW_TYPE.SWIM_TOPUPPER, UndressStep(WEAR_SHOW_TYPE.SWIM_TOPUPPER, Actor));
                    Actor.wears.ChangeShow(WEAR_SHOW_TYPE.SWIM_TOPLOWER, UndressStep(WEAR_SHOW_TYPE.SWIM_TOPLOWER, Actor));
                }
                else if (Actor.wears.IsEquiped(Actor.customParam, WEAR_SHOW_TYPE.SWIMUPPER) && Actor.wears.GetShow(WEAR_SHOW_TYPE.SWIMUPPER, false) == currentStep)
                {
                    Actor.wears.ChangeShow(WEAR_SHOW_TYPE.SWIMUPPER, UndressStep(WEAR_SHOW_TYPE.SWIMUPPER, Actor));
                }
                else if (Actor.wears.IsEquiped(Actor.customParam, WEAR_SHOW_TYPE.BRA) && Actor.wears.GetShow(WEAR_SHOW_TYPE.BRA, false) == currentStep)
                {
                    Actor.wears.ChangeShow(WEAR_SHOW_TYPE.BRA, UndressStep(WEAR_SHOW_TYPE.BRA, Actor));
                }
                else
                {
                    return(false);
                }
                Actor.CheckShow();
                return(true);
            }
            else if (target == EBodyArea.CROTCH)
            {
                if (Actor.wears.IsEquiped(Actor.customParam, WEAR_SHOW_TYPE.BOTTOM) && Actor.wears.GetShow(WEAR_SHOW_TYPE.BOTTOM, false) == currentStep)
                {
                    Actor.wears.ChangeShow(WEAR_SHOW_TYPE.BOTTOM, UndressStep(WEAR_SHOW_TYPE.BOTTOM, Actor));
                }
                else if (Actor.wears.IsEquiped(Actor.customParam, WEAR_SHOW_TYPE.PANST) && Actor.wears.GetShow(WEAR_SHOW_TYPE.PANST, false) == WEAR_SHOW.ALL)
                {
                    Actor.wears.ChangeShow(WEAR_SHOW_TYPE.PANST, UndressStep(WEAR_SHOW_TYPE.PANST, Actor));
                }
                else if (Actor.wears.IsEquiped(Actor.customParam, WEAR_SHOW_TYPE.SWIM_BOTTOM) && Actor.wears.GetShow(WEAR_SHOW_TYPE.SWIM_BOTTOM, false) == currentStep)
                {
                    Actor.wears.ChangeShow(WEAR_SHOW_TYPE.SWIM_BOTTOM, UndressStep(WEAR_SHOW_TYPE.SWIM_BOTTOM, Actor));
                }
                else if (Actor.wears.IsEquiped(Actor.customParam, WEAR_SHOW_TYPE.SWIMLOWER) && Actor.wears.GetShow(WEAR_SHOW_TYPE.SWIMLOWER, false) == currentStep)
                {
                    Actor.wears.ChangeShow(WEAR_SHOW_TYPE.SWIMLOWER, UndressStep(WEAR_SHOW_TYPE.SWIMLOWER, Actor));
                }
                else if (!bNoPanties && Actor.wears.IsEquiped(Actor.customParam, WEAR_SHOW_TYPE.SHORTS) && Actor.wears.GetShow(WEAR_SHOW_TYPE.SHORTS, false) == currentStep)
                {
                    Actor.wears.ChangeShow(WEAR_SHOW_TYPE.SHORTS, UndressStep(WEAR_SHOW_TYPE.SHORTS, Actor));
                }
                else
                {
                    return(false);
                }
                Actor.CheckShow();
                return(true);
            }
            else if (target == EBodyArea.THIGHS)
            {
                if (Actor.wears.IsEquiped(Actor.customParam, WEAR_SHOW_TYPE.BOTTOM) && Actor.wears.GetShow(WEAR_SHOW_TYPE.BOTTOM, false) == currentStep)
                {
                    Actor.wears.ChangeShow(WEAR_SHOW_TYPE.BOTTOM, UndressStep(WEAR_SHOW_TYPE.BOTTOM, Actor));
                }
                else if (Actor.wears.IsEquiped(Actor.customParam, WEAR_SHOW_TYPE.PANST) && Actor.wears.GetShow(WEAR_SHOW_TYPE.PANST, false) == currentStep)
                {
                    Actor.wears.ChangeShow(WEAR_SHOW_TYPE.PANST, UndressStep(WEAR_SHOW_TYPE.PANST, Actor));
                }
                else
                {
                    return(false);
                }
                Actor.CheckShow();
                return(true);
            }

            return(false);
        }