Пример #1
0
        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();
        }
Пример #2
0
        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);
            }
        }
Пример #3
0
        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);
                }
            }
        }
Пример #4
0
        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
        }
Пример #5
0
        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);
        }