コード例 #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
        public static void UpdateCollisionOptions(int femaleNum, CollisionOptions options)
        {
            if (femaleNum >= collisionAgents.Count || collisionAgents[femaleNum] == null)
            {
                return;
            }

            collisionAgents[femaleNum].UpdateCollisionOptions(options);
        }
コード例 #3
0
        internal void UpdateCollisionOptions(CollisionOptions options)
        {
            m_collisionOptions = options;

            if (m_collisionPoints == null)
            {
                return;
            }

            m_collisionPoints.UpdateCollisionOptions(options);
        }
コード例 #4
0
        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]);
            }
        }
コード例 #5
0
        internal void UpdateCollisionOptions(CollisionOptions options)
        {
            m_collisionOptions = options;

            if (m_collisionPoints == null)
            {
                return;
            }

            m_collisionPoints.UpdateCollisionOptions(options);
            UpdateBellyBones(options.bellyBulgeScale);
        }
コード例 #6
0
        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);
            }
        }
コード例 #7
0
 public CollisionAgent(ChaControl character, CollisionOptions options)
 {
     Initialize(character, options);
 }
コード例 #8
0
        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);
            }
        }
コード例 #9
0
 internal void UpdateCollisionOptions(CollisionOptions options)
 {
     m_collisionOptions = options;
 }
コード例 #10
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
        }
コード例 #11
0
        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);
        }