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); }
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); } }
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); } } }
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); }