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(); }
public static void UpdateCollisionOptions(int femaleNum, CollisionOptions options) { if (femaleNum >= collisionAgents.Count || collisionAgents[femaleNum] == null) { return; } collisionAgents[femaleNum].UpdateCollisionOptions(options); }
internal void UpdateCollisionOptions(CollisionOptions options) { m_collisionOptions = options; if (m_collisionPoints == null) { return; } m_collisionPoints.UpdateCollisionOptions(options); }
public void UpdateCollisionOptions(CollisionOptions options) { for (var point = 0; point < frontCollisionPoints.Count && point < options.frontCollisionInfo.Count; point++) { frontCollisionPoints[point].UpdateCollisionInfo(options.frontCollisionInfo[point]); } for (var point = 0; point < frontCollisionPoints.Count && point < options.frontCollisionInfo.Count; point++) { backCollisionPoints[point].UpdateCollisionInfo(options.backCollisonInfo[point]); } }
internal void UpdateCollisionOptions(CollisionOptions options) { m_collisionOptions = options; if (m_collisionPoints == null) { return; } m_collisionPoints.UpdateCollisionOptions(options); UpdateBellyBones(options.bellyBulgeScale); }
private void Initialize(ChaControl character, CollisionOptions options) { m_collisionOptions = options; List <CollisionPoint> frontCollisionPoints = new List <CollisionPoint>(); List <CollisionPoint> backCollisionPoints = new List <CollisionPoint>(); m_collisionPointsFound = false; if (character == null) { return; } m_collisionCharacter = character; m_kokanBone = m_collisionCharacter.GetComponentsInChildren <Transform>().FirstOrDefault(x => x.name != null && x.name.Contains(BoneNames.KokanBone)); if (m_kokanBone == null) { return; } for (int index = 0; index < options.frontCollisionInfo.Count; index++) { Transform frontCollisionPoint = m_collisionCharacter.GetComponentsInChildren <Transform>().FirstOrDefault(x => x.name != null && x.name.Contains(options.frontCollisionInfo[index].name)); frontCollisionPoints.Add(new CollisionPoint(frontCollisionPoint, options.frontCollisionInfo[index])); } for (int index = 0; index < options.backCollisonInfo.Count; index++) { Transform backCollisionPoint = m_collisionCharacter.GetComponentsInChildren <Transform>().FirstOrDefault(x => x.name != null && x.name.Contains(options.backCollisonInfo[index].name)); backCollisionPoints.Add(new CollisionPoint(backCollisionPoint, options.backCollisonInfo[index])); } m_bpKokanTarget = m_collisionCharacter.GetComponentsInChildren <Transform>().FirstOrDefault(x => x.name != null && x.name.Equals(LookTargets.BPKokanTarget)); if (m_bpKokanTarget != null) { frontCollisionPoints[0].transform = m_bpKokanTarget; frontCollisionPoints[0].info.name = LookTargets.BPKokanTarget; } m_innerTarget = m_collisionCharacter.GetComponentsInChildren <Transform>().FirstOrDefault(x => x.name != null && x.name.Equals(LookTargets.InnerTarget)); m_innerHeadTarget = m_collisionCharacter.GetComponentsInChildren <Transform>().FirstOrDefault(x => x.name != null && x.name.Contains(LookTargets.InnerHeadTarget)); 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); } 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 || !dynamicBone.name.Contains(BoneNames.BPBone)) { continue; } dynamicBone.m_Colliders.Clear(); m_kokanDynamicBones.Add(dynamicBone); } }
public CollisionAgent(ChaControl character, CollisionOptions options) { Initialize(character, options); }
private void Initialize(ChaControl character, CollisionOptions options) { m_collisionOptions = options; List <CollisionPoint> frontCollisionPoints = new List <CollisionPoint>(); List <CollisionPoint> backCollisionPoints = new List <CollisionPoint>(); m_collisionPointsFound = false; if (character == null) { return; } m_collisionCharacter = character; m_kokanBone = m_collisionCharacter.GetComponentsInChildren <Transform>().FirstOrDefault(x => x.name != null && x.name.Contains(BoneNames.KokanBone)); if (m_kokanBone == null) { return; } for (int index = 0; index < options.frontCollisionInfo.Count; index++) { Transform frontCollisionPoint = m_collisionCharacter.GetComponentsInChildren <Transform>().FirstOrDefault(x => x.name != null && x.name.Contains(options.frontCollisionInfo[index].name)); frontCollisionPoints.Add(new CollisionPoint(frontCollisionPoint, options.frontCollisionInfo[index])); } for (int index = 0; index < options.backCollisonInfo.Count; index++) { Transform backCollisionPoint = m_collisionCharacter.GetComponentsInChildren <Transform>().FirstOrDefault(x => x.name != null && x.name.Contains(options.backCollisonInfo[index].name)); backCollisionPoints.Add(new CollisionPoint(backCollisionPoint, options.backCollisonInfo[index])); } m_bpKokanTarget = m_collisionCharacter.GetComponentsInChildren <Transform>().FirstOrDefault(x => x.name != null && x.name.Equals(LookTargets.BPKokanTarget)); if (m_bpKokanTarget != null) { Console.WriteLine("BP Target Found " + m_bpKokanTarget.name); frontCollisionPoints[0].transform = m_bpKokanTarget; frontCollisionPoints[0].info.name = LookTargets.BPKokanTarget; } m_innerTarget = m_collisionCharacter.GetComponentsInChildren <Transform>().FirstOrDefault(x => x.name != null && x.name.Equals(LookTargets.InnerTarget)); m_innerHeadTarget = m_collisionCharacter.GetComponentsInChildren <Transform>().FirstOrDefault(x => x.name != null && x.name.Contains(LookTargets.InnerHeadTarget)); if (frontCollisionPoints.Count == options.frontCollisionInfo.Count && backCollisionPoints.Count == options.backCollisonInfo.Count) { m_collisionPointsFound = true; m_collisionPoints = new CollisionPoints(frontCollisionPoints, backCollisionPoints); } Console.WriteLine("constrainPointsFound " + m_collisionPointsFound); m_kokanDynamicBones = new List <DynamicBone>(); foreach (DynamicBone dynamicBone in m_collisionCharacter.GetComponentsInChildren <DynamicBone>()) { if (!dynamicBone.name.Contains(BoneNames.BPBone)) { continue; } dynamicBone.m_Colliders.Clear(); if (dynamicBone == null || dynamicBone.m_Root == null) { continue; } if (!BoneNames.uncensorBoneList.TryGetValue(dynamicBone.m_Root.name, out UncensorDynamicBone dynamicBoneValues)) { continue; } if (dynamicBoneValues.direction == UncensorDynamicBone.DynamicBoneDirection.Z) { dynamicBone.m_Radius *= m_kokanBone.lossyScale.z; } else if (dynamicBoneValues.direction == UncensorDynamicBone.DynamicBoneDirection.Z) { dynamicBone.m_Radius *= m_kokanBone.lossyScale.x; } else { dynamicBone.m_Radius *= (m_kokanBone.lossyScale.x + m_kokanBone.lossyScale.z) / 2; } #if HS2 || AIS dynamicBone.UpdateParameters(); #endif m_kokanDynamicBones.Add(dynamicBone); if (!m_collisionOptions.useBoundingColliders || dynamicBoneValues.selfColliderName == null) { continue; } DynamicBoneCollider selfCollider = m_collisionCharacter.GetComponentsInChildren <DynamicBoneCollider>().FirstOrDefault(x => x.name != null && x.name.Contains(dynamicBoneValues.selfColliderName)); if (selfCollider == null) { Transform colliderTransform = m_collisionCharacter.GetComponentsInChildren <Transform>().FirstOrDefault(x => x.name != null && x.name.Contains(dynamicBoneValues.selfColliderName)); if (colliderTransform == null) { continue; } selfCollider = colliderTransform.gameObject.AddComponent(typeof(DynamicBoneCollider)) as DynamicBoneCollider; selfCollider.m_Bound = DynamicBoneCollider.Bound.Inside; selfCollider.m_Direction = DynamicBoneCollider.Direction.Y; if (dynamicBoneValues.direction == UncensorDynamicBone.DynamicBoneDirection.Z) { selfCollider.m_Height = dynamicBoneValues.selfColliderHeight * m_kokanBone.lossyScale.z; selfCollider.m_Radius = dynamicBoneValues.selfColliderRadius * m_kokanBone.lossyScale.z; } else if (dynamicBoneValues.direction == UncensorDynamicBone.DynamicBoneDirection.X) { selfCollider.m_Height = dynamicBoneValues.selfColliderHeight * m_kokanBone.lossyScale.x; selfCollider.m_Radius = dynamicBoneValues.selfColliderRadius * m_kokanBone.lossyScale.x; } else { selfCollider.m_Height = dynamicBoneValues.selfColliderHeight * (m_kokanBone.lossyScale.x + m_kokanBone.lossyScale.z) / 2; selfCollider.m_Radius = dynamicBoneValues.selfColliderRadius * (m_kokanBone.lossyScale.x + m_kokanBone.lossyScale.z) / 2; } } dynamicBone.m_Colliders.Add(selfCollider); } }
internal void UpdateCollisionOptions(CollisionOptions options) { m_collisionOptions = options; }
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 }
protected override void OnReload(GameMode currentGameMode, bool maintainState) { danTargetsValid = false; PluginData data = GetExtendedData(); float lengthSquish = DefaultLengthSquish; float girthSquish = DefaultGirthSquish; float squishThreshold = DefaultSquishThreshold; float colliderRadiusScale = DefaultColliderRadiusScale; float colliderLengthScale = DefaultColliderLengthScale; ControllerOptions.AutoTarget autoTarget = DefaultDanAutoTarget; float maxPush = DefaultMaxOralPush; float maxPull = DefaultMaxOralPull; float pullRate = DefaultOralPullRate; float returnRate = DefaultReturnRate; bool enableBellyBulge = false; float bellyBulgeScale = 1.0f; if (data != null) { if (data.data.TryGetValue("Enabled", out var Enabled)) { enabled = (bool)Enabled; } if (data.data.TryGetValue("LengthSquish", out var LengthSquish)) { lengthSquish = (float)LengthSquish; } if (data.data.TryGetValue("GirthSquish", out var GirthSquish)) { girthSquish = (float)GirthSquish; } if (data.data.TryGetValue("SquishThreshold", out var SquishThreshold)) { squishThreshold = (float)SquishThreshold; } if (data.data.TryGetValue("ColliderRadiusScale", out var ColliderRadiusScale)) { colliderRadiusScale = (float)ColliderRadiusScale; } if (data.data.TryGetValue("ColliderLengthScale", out var ColliderLengthScale)) { colliderLengthScale = (float)ColliderLengthScale; } if (data.data.TryGetValue("DanAutoTarget", out var DanAutoTarget)) { autoTarget = (ControllerOptions.AutoTarget)DanAutoTarget; } if (data.data.TryGetValue("MaxPush", out var MaxPush)) { maxPush = (float)MaxPush; } if (data.data.TryGetValue("MaxPull", out var MaxPull)) { maxPull = (float)MaxPull; } if (data.data.TryGetValue("PullRate", out var PullRate)) { pullRate = (float)PullRate; } if (data.data.TryGetValue("ReturnRate", out var ReturnRate)) { returnRate = (float)ReturnRate; } if (data.data.TryGetValue("EnableBellyBulge", out var EnableBellyBulge)) { enableBellyBulge = (bool)EnableBellyBulge; } if (data.data.TryGetValue("BellyBulgeScale", out var BellyBulgeScale)) { bellyBulgeScale = (float)BellyBulgeScale; } } danOptions = new DanOptions(colliderRadiusScale, colliderLengthScale, lengthSquish, girthSquish, squishThreshold, false, 10.0f); collisionOptions = new CollisionOptions(maxPush, maxPull, pullRate, returnRate, enableBellyBulge, bellyBulgeScale); controllerOptions = new ControllerOptions(autoTarget); cardReloaded = true; base.OnReload(currentGameMode, maintainState); }