public void InitializeDanAgent() { ClearDanAgent(); danEntryChild = Tools.GetTransformOfChaControl(ChaControl, BoneNames.BPDanEntryTarget); danEndChild = Tools.GetTransformOfChaControl(ChaControl, BoneNames.BPDanEndTarget); if (danEntryChild == null || danEndChild == null) { return; } if (controllerOptions == null) { controllerOptions = new ControllerOptions(DefaultDanAutoTarget); } if (danOptions == null) { danOptions = new DanOptions(DefaultColliderRadiusScale, DefaultColliderLengthScale, DefaultLengthSquish, DefaultGirthSquish, DefaultSquishThreshold, false, 2.0f); } if (collisionOptions == null) { collisionOptions = new CollisionOptions(DefaultMaxOralPush, DefaultMaxOralPull, DefaultOralPullRate, DefaultReturnRate, false, 1.0f); } danAgent = new DanAgent(ChaControl, danOptions); danTargetsValid = true; InitializeTama(); }
internal void InitializeFingerColliders(float fingerRadius, float fingerLength) { m_fingerColliders = new List <DynamicBoneCollider>(); foreach (var bone in BoneNames.FingerColliders) { var fingerTransform = Tools.GetTransformOfChaControl(m_collisionCharacter, bone); if (fingerTransform == null) { continue; } var fingerCollider = Tools.InitializeCollider(fingerTransform, fingerRadius * (fingerTransform.lossyScale.y + fingerTransform.lossyScale.z) / 2, fingerLength * fingerTransform.lossyScale.x, Vector3.zero); m_fingerColliders.Add(fingerCollider); } }
public void AddDanConstraints(BaseUnityPlugin plugin, Transform danEntryParent = null, Transform danEndParent = null) { if (!danTargetsValid || collisionAgent == null || collisionAgent.m_collisionCharacter == null) { return; } if (danEntryConstraint != null) { var parentTransform = danEntryParent; if (parentTransform == null && !danEntryParentName.IsNullOrEmpty()) { parentTransform = Tools.GetTransformOfChaControl(collisionAgent.m_collisionCharacter, danEntryParentName); } if (parentTransform == null && danEntryConstraint.GetValue(1) != null) { parentTransform = Tools.GetTransformOfChaControl(collisionAgent.m_collisionCharacter, danEntryConstraint.GetValue(1) as string); } if (parentTransform != null) { danEntryConstraint.SetValue(parentTransform, 1); danEntryConstraint.SetValue(danEntryChild, 2); plugin.GetType().GetMethod("AddConstraint", BindingFlags.NonPublic | BindingFlags.Instance).Invoke(plugin, danEntryConstraint); } } if (danEndConstraint != null) { var parentTransform = danEndParent; if (parentTransform == null && !danEndParentName.IsNullOrEmpty()) { parentTransform = Tools.GetTransformOfChaControl(collisionAgent.m_collisionCharacter, danEndParentName); } if (parentTransform == null && danEndConstraint.GetValue(1) != null) { parentTransform = Tools.GetTransformOfChaControl(collisionAgent.m_collisionCharacter, danEndConstraint.GetValue(1) as string); } if (parentTransform != null) { danEndConstraint.SetValue(parentTransform, 1); danEndConstraint.SetValue(danEndChild, 2); plugin.GetType().GetMethod("AddConstraint", BindingFlags.NonPublic | BindingFlags.Instance).Invoke(plugin, danEndConstraint); } } }
internal void Initialize(ChaControl character, CollisionOptions options) { m_collisionOptions = options; currentKokanPull = 0f; currentOralPull = 0f; currentAnaPull = 0f; currentKokanDanDirection = Vector3.up; currentOralDanDirection = Vector3.Normalize(Vector3.up + Vector3.back); currentAnaDanDirection = Vector3.up; List <CollisionPoint> frontCollisionPoints = new List <CollisionPoint>(); List <CollisionPoint> backCollisionPoints = new List <CollisionPoint>(); m_collisionPointsFound = false; if (character == null) { return; } m_collisionCharacter = character; m_kokanBone = Tools.GetTransformOfChaControl(m_collisionCharacter, BoneNames.KokanBone); if (m_kokanBone == null) { return; } m_bpKokanTarget = Tools.GetTransformOfChaControl(m_collisionCharacter, LookTargets.BPKokanTarget); m_bpAnaTarget = Tools.GetTransformOfChaControl(m_collisionCharacter, LookTargets.BPAnaTarget); m_innerTarget = Tools.GetTransformOfChaControl(m_collisionCharacter, LookTargets.InnerTarget); m_innerHeadTarget = Tools.GetTransformOfChaControl(m_collisionCharacter, LookTargets.InnerHeadTarget); m_siriBoneL = Tools.GetTransformOfChaControl(m_collisionCharacter, BoneNames.ButtBoneL); m_siriBoneR = Tools.GetTransformOfChaControl(m_collisionCharacter, BoneNames.ButtBoneR); m_innerKokan = Tools.GetTransformOfChaControl(m_collisionCharacter, "cf_J_Vagina_Inner"); #if !STUDIO for (int index = 0; index < options.frontCollisionInfo.Count; index++) { Transform frontCollisionPoint = Tools.GetTransformOfChaControl(m_collisionCharacter, options.frontCollisionInfo[index].name); frontCollisionPoints.Add(new CollisionPoint(frontCollisionPoint, options.frontCollisionInfo[index])); } for (int index = 0; index < options.backCollisonInfo.Count; index++) { Transform backCollisionPoint = Tools.GetTransformOfChaControl(m_collisionCharacter, options.backCollisonInfo[index].name); backCollisionPoints.Add(new CollisionPoint(backCollisionPoint, options.backCollisonInfo[index])); } if (frontCollisionPoints.Count == options.frontCollisionInfo.Count && backCollisionPoints.Count == options.backCollisonInfo.Count && m_innerTarget != null && m_innerHeadTarget != null) { m_collisionPointsFound = true; m_collisionPoints = new CollisionPoints(frontCollisionPoints, backCollisionPoints); } #else m_collisionPoints = null; #endif UnityEngine.Debug.Log($"constrainPointsFound {m_collisionPointsFound}"); m_kokanDynamicBones = new List <DynamicBone>(); foreach (DynamicBone dynamicBone in m_collisionCharacter.GetComponentsInChildren <DynamicBone>()) { if (dynamicBone == null || dynamicBone.m_Root == null || dynamicBone.name == null || m_collisionCharacter != dynamicBone.GetComponentInParent <ChaControl>()) { continue; } if (dynamicBone.name.Contains(BoneNames.BPBone)) { dynamicBone.m_Colliders.Clear(); m_kokanDynamicBones.Add(dynamicBone); } else if (dynamicBone.name.Contains(BoneNames.BellyBone)) { dynamicBone.m_Colliders.Clear(); m_bellyDynamicBone = dynamicBone; m_bellyColliderRadius = dynamicBone.m_Radius; UpdateBellyBones(options.bellyBulgeScale); } else if (dynamicBone.name.Contains(BoneNames.AnaTarget)) { dynamicBone.m_Colliders.Clear(); m_anaDynamicBones = dynamicBone; } } m_kokanPullBones = new List <Transform>(); foreach (var boneName in BoneNames.KokanPullBones) { var kokanTransform = Tools.GetTransformOfChaControl(m_collisionCharacter, boneName); if (kokanTransform == null) { continue; } m_kokanPullBones.Add(kokanTransform); } m_oralPullBone = Tools.GetTransformOfChaControl(m_collisionCharacter, BoneNames.MouthPullBone); foreach (var boneName in BoneNames.AnaPullBones) { var anaTransform = Tools.GetTransformOfChaControl(m_collisionCharacter, boneName); if (anaTransform == null) { continue; } m_anaPullBones.Add(anaTransform); } #if !STUDIO #if AI || HS2 InitializeFingerColliders(0.055f, 0.18f); #else InitializeFingerColliders(0.0055f, 0.018f); #endif #endif }
internal void CheckAutoTarget(BaseUnityPlugin plugin) { if (controllerOptions.danAutoTarget == ControllerOptions.AutoTarget.Off || !danTargetsValid) { return; } string targetTransform = BoneNames.BPKokanTarget; if (controllerOptions.danAutoTarget == ControllerOptions.AutoTarget.Oral) { targetTransform = BoneNames.HeadTarget; } else if (controllerOptions.danAutoTarget == ControllerOptions.AutoTarget.Anal) { targetTransform = BoneNames.AnaTarget; } var potentialTargets = FindObjectsOfType <Transform>().Where(x => x.name.Equals(targetTransform)); if (potentialTargets == null) { return; } Transform autoTarget = null; float currentTargetDistance = danAgent.m_baseDanLength * 2.0f; foreach (var potentialTarget in potentialTargets) { if (potentialTarget.GetComponentInParent <ChaControl>() == danAgent.m_danCharacter) { continue; } var potentialTargetDistance = Vector3.Distance(danAgent.m_danPoints.GetDanEndPosition(), potentialTarget.position); if (potentialTargetDistance >= currentTargetDistance) { continue; } autoTarget = potentialTarget; currentTargetDistance = potentialTargetDistance; } if (autoTarget == null) { return; } var collisionAgent = autoTarget.GetComponentInParent <ChaControl>(); if (danEntryConstraint != null && danEntryConstraint.GetValue(1) != null && danEntryConstraint.GetValue(1).ToString() == autoTarget.name && collisionAgent == this.collisionAgent?.m_collisionCharacter) { return; } RemoveDanConstraints(plugin); RemoveCollisionAgent(isKokan, isAna); Transform danEntryParent = autoTarget; danEntryParentName = autoTarget.name; isKokan = danEntryParentName.Contains("V****a"); isAna = danEntryParentName.Contains("Ana"); isOral = danEntryParentName.Contains("Mouth"); SetCollisionAgent(collisionAgent, isKokan, isAna, isOral); #if AI || HS2 Vector3 headOffset = new Vector3(0f, -0.05f, 0.02f); #else Vector3 headOffset = new Vector3(0f, -0.01f, 0f); #endif danEntryConstraint = new object[] { true, danEntryParent, danEntryChild, true, (danEntryParentName == BoneNames.HeadTarget)? headOffset: Vector3.zero, false, Quaternion.identity, false, Vector3.zero, $"{danAgent.m_danCharacter.fileParam.fullname} Penis First Target" }; Transform danEndParent; if (danEntryParentName == BoneNames.HeadTarget) { danEndParent = Tools.GetTransformOfChaControl(collisionAgent, BoneNames.InnerHeadTarget); } else { danEndParent = Tools.GetTransformOfChaControl(collisionAgent, BoneNames.InnerTarget); } danEndParentName = danEndParent.name; danEndConstraint = new object[] { true, danEndParent, danEndChild, true, Vector3.zero, false, Quaternion.identity, false, Vector3.zero, $"{danAgent.m_danCharacter.fileParam.fullname} Penis Second Target" }; AddDanConstraints(plugin, danEntryParent, danEndParent); }