public bool ReportCollision(CollisionAudioSensor sensor, SurfaceType surf1, SurfaceType surf2, Vector3 pos, float impulse, float normalVelocity, float tangentVelocity, float volume, float pitch)
    {
        if (surf1 == SurfaceType.RagdollBall || surf2 == SurfaceType.RagdollBall)
        {
            return(false);
        }
        if (soloSurface != 0 && surf1 != soloSurface && surf2 != soloSurface)
        {
            return(false);
        }
        CollisionAudioSurfSurfConfig collisionAudioSurfSurfConfig = Resolve(surf1, surf2);

        if (collisionAudioSurfSurfConfig != null)
        {
            AudioChannel channel = AudioChannel.Physics;
            if (surf1 == SurfaceType.RagdollBody || surf2 == SurfaceType.RagdollBody)
            {
                channel = AudioChannel.Body;
            }
            else if (surf1 == SurfaceType.RagdollFeet || surf2 == SurfaceType.RagdollFeet)
            {
                channel = AudioChannel.Footsteps;
            }
            return(collisionAudioSurfSurfConfig.PlayImpact(sensor, channel, pos, impulse, normalVelocity, tangentVelocity, volume, pitch));
        }
        return(false);
    }
Пример #2
0
    public bool PlayImpact(CollisionAudioSensor sensor, AudioChannel channel, Vector3 pos, float impulse, float normalVelocity, float tangentVelocity, float volume, float pitch)
    {
        float num = 0f;

        if (controlConfig.slide != null && controlConfig.slide.sampleLib != null && tangentVelocity != 0f)
        {
            Vector2 normalized = new Vector2(normalVelocity, tangentVelocity).normalized;
            num = normalized.y;
        }
        monitorConfig.lastSlideAmount = num;
        if (num > controlConfig.slideTreshold)
        {
            return(controlConfig.slide.Play(sensor, channel, monitorConfig.slideMonitor, pos, impulse, tangentVelocity, volume, pitch));
        }
        return(controlConfig.hit.Play(sensor, channel, monitorConfig.hitMonitor, pos, impulse, normalVelocity, volume, pitch));
    }
    public static void Analyze(this Collision collision, out Vector3 pos, out float impulse, out float normalVelocity, out float tangentVelocity, out PhysicMaterial mat1, out PhysicMaterial mat2, out int id2, out float volume2, out float pitch2)
    {
        ContactPoint[] contacts = collision.contacts;
        id2             = int.MaxValue;
        volume2         = 1f;
        pitch2          = 1f;
        mat1            = (mat2 = null);
        normalVelocity  = 0f;
        tangentVelocity = 0f;
        pos             = collision.contacts[0].point;
        Collider collider         = null;
        int      num              = 0;
        Vector3  relativeVelocity = collision.relativeVelocity;

        for (int i = 0; i < contacts.Length; i++)
        {
            ContactPoint contactPoint = contacts[i];
            float        num2         = Vector3.Dot(contactPoint.normal, relativeVelocity);
            float        magnitude    = (relativeVelocity - contactPoint.normal * num2).magnitude;
            if (num2 > normalVelocity)
            {
                normalVelocity  = num2;
                tangentVelocity = magnitude;
                pos             = contactPoint.point;
                mat1            = contactPoint.thisCollider.sharedMaterial;
                mat2            = contactPoint.otherCollider.sharedMaterial;
                collider        = contactPoint.otherCollider;
            }
            num++;
        }
        impulse = collision.impulse.magnitude;
        if (collider != null)
        {
            CollisionAudioSensor componentInParent = collider.GetComponentInParent <CollisionAudioSensor>();
            if (componentInParent != null)
            {
                id2     = componentInParent.id;
                volume2 = componentInParent.volume;
                pitch2  = componentInParent.pitch;
            }
        }
    }
Пример #4
0
    public void Start()
    {
        Human   componentInParent       = GetComponentInParent <Human>();
        Ragdoll ragdoll                 = componentInParent.ragdoll;
        CollisionAudioSensor component  = ragdoll.partLeftFoot.transform.GetComponent <CollisionAudioSensor>();
        CollisionAudioSensor component2 = ragdoll.partRightFoot.transform.GetComponent <CollisionAudioSensor>();

        leftHand  = ragdoll.partLeftHand.transform;
        rightHand = ragdoll.partRightHand.transform;
        ragdoll.partLeftHand.sensor.onGrabTap  = HandGrabLeft;
        ragdoll.partRightHand.sensor.onGrabTap = HandGrabRight;
        CollisionAudioSensor[] componentsInChildren = GetComponentsInChildren <CollisionAudioSensor>();
        for (int i = 0; i < componentsInChildren.Length; i++)
        {
            componentsInChildren[i].id = -i;
        }
        identity = GetComponentInParent <NetIdentity>();
        if (identity != null)
        {
            evtHandGrab = identity.RegisterEvent(OnHandGrab);
        }
    }
    public bool Play(CollisionAudioSensor sensor, AudioChannel channel, CollisionAudioHitMonitor monitor, Vector3 pos, float impulse, float velocity, float volume, float pitch)
    {
        float num  = impulse / CollisionAudioEngine.instance.unitImpulse;
        float num2 = velocity / CollisionAudioEngine.instance.unitVelocity;

        if (num > 1f)
        {
            num = (num - 1f) / impulseComp + 1f;
        }
        if (num2 > 1f)
        {
            num2 = (num2 - 1f) / velocityComp + 1f;
        }
        float t = Mathf.InverseLerp(pitch0velocity, pitch1velocity, velocity);

        pitch *= Mathf.Lerp(pitch0, pitch1, t);
        float num3 = num * num2 * volume;

        if (NetGame.isServer || ReplayRecorder.isRecording)
        {
            sensor.BroadcastCollisionAudio(this, channel, pos, num3, pitch);
        }
        return(PlayWithKnownEmit(channel, monitor, pos, num3, pitch));
    }
Пример #6
0
    protected override void Shatter(Vector3 contactPoint, Vector3 adjustedImpulse, float impactMagnitude, uint seed, uint netId)
    {
        base.Shatter(contactPoint, adjustedImpulse, impactMagnitude, seed, netId);
        GameObject gameObject = new GameObject(base.name + "shards");

        gameObject.transform.SetParent(base.transform, worldPositionStays: false);
        shardParent = gameObject.AddComponent <NetScope>();
        shardParent.AssignNetId(netId);
        shardParent.suppressThrottling = 3f;
        BoxCollider boxCollider = collider as BoxCollider;
        Vector2     b           = To2D(base.transform.InverseTransformPoint(contactPoint) - boxCollider.center);
        Vector3     vector      = To2D(boxCollider.center);
        Vector3     vector2     = To2D(boxCollider.size + adjustColliderSize);
        float       x           = vector2.x;
        float       y           = vector2.y;
        float       z           = vector2.z;
        float       num         = (0f - vector2.x) / 2f;
        float       num2        = vector2.x / 2f;
        float       num3        = (0f - vector2.y) / 2f;
        float       num4        = vector2.y / 2f;
        float       z2          = (0f - vector2.z) / 2f;
        float       z3          = vector2.z / 2f;
        float       num5        = x * y;

        if (densityPerSqMeter == 0f)
        {
            densityPerSqMeter = totalMass / num5;
        }
        float d = Mathf.Min(x, y) / 4f;
        float realtimeSinceStartup = Time.realtimeSinceStartup;

        UnityEngine.Random.State state = UnityEngine.Random.state;
        UnityEngine.Random.InitState((int)seed);
        int num6 = (int)Mathf.Clamp(num5 * 10f, 5f, 50f);

        if (NetGame.isNetStarted)
        {
            num6 /= 2;
        }
        int     num7    = num6 / 2;
        Voronoi voronoi = new Voronoi(0.1f);

        float[] array  = new float[num6];
        float[] array2 = new float[num6];
        for (int i = 0; i < num7; i++)
        {
            array[i]  = UnityEngine.Random.Range(num, num2);
            array2[i] = UnityEngine.Random.Range(num3, num4);
        }
        for (int j = num7; j < num6; j++)
        {
            int     num8 = 0;
            Vector2 vector3;
            do
            {
                if (num8++ > 1000)
                {
                    return;
                }
                vector3 = UnityEngine.Random.insideUnitCircle * d + b;
            }while (vector3.x < num || vector3.y < num3 || vector3.x > num2 || vector3.y > num4);
            array[j]  = vector3.x;
            array2[j] = vector3.y;
        }
        UnityEngine.Random.state = state;
        List <GraphEdge> list = voronoi.generateVoronoi(array, array2, num, num2, num3, num4);

        List <Vector2>[] array3 = new List <Vector2> [num6];
        for (int k = 0; k < num6; k++)
        {
            array3[k] = new List <Vector2>();
        }
        int count = list.Count;

        for (int l = 0; l < count; l++)
        {
            GraphEdge graphEdge = list[l];
            Vector2   vector4   = new Vector2(graphEdge.x1, graphEdge.y1);
            Vector2   vector5   = new Vector2(graphEdge.x2, graphEdge.y2);
            if (!(vector4 == vector5))
            {
                if (!array3[graphEdge.site1].Contains(vector4))
                {
                    array3[graphEdge.site1].Add(vector4);
                }
                if (!array3[graphEdge.site2].Contains(vector4))
                {
                    array3[graphEdge.site2].Add(vector4);
                }
                if (!array3[graphEdge.site1].Contains(vector5))
                {
                    array3[graphEdge.site1].Add(vector5);
                }
                if (!array3[graphEdge.site2].Contains(vector5))
                {
                    array3[graphEdge.site2].Add(vector5);
                }
            }
        }
        float   num9    = float.MaxValue;
        int     num10   = 0;
        Vector2 vector6 = new Vector2(num, num3);
        float   num11   = float.MaxValue;
        int     num12   = 0;
        Vector2 vector7 = new Vector2(num, num4);
        float   num13   = float.MaxValue;
        int     num14   = 0;
        Vector2 vector8 = new Vector2(num2, num3);
        float   num15   = float.MaxValue;
        int     num16   = 0;
        Vector2 vector9 = new Vector2(num2, num4);

        for (int m = 0; m < num6; m++)
        {
            Vector2 b2           = new Vector2(array[m], array2[m]);
            float   sqrMagnitude = (vector6 - b2).sqrMagnitude;
            if (sqrMagnitude < num9)
            {
                num9  = sqrMagnitude;
                num10 = m;
            }
            float sqrMagnitude2 = (vector7 - b2).sqrMagnitude;
            if (sqrMagnitude2 < num11)
            {
                num11 = sqrMagnitude2;
                num12 = m;
            }
            float sqrMagnitude3 = (vector8 - b2).sqrMagnitude;
            if (sqrMagnitude3 < num13)
            {
                num13 = sqrMagnitude3;
                num14 = m;
            }
            float sqrMagnitude4 = (vector9 - b2).sqrMagnitude;
            if (sqrMagnitude4 < num15)
            {
                num15 = sqrMagnitude4;
                num16 = m;
            }
        }
        array3[num10].Add(vector6);
        array3[num12].Add(vector7);
        array3[num14].Add(vector8);
        array3[num16].Add(vector9);
        Vector3        normalized = adjustedImpulse.normalized;
        float          value      = Mathf.Clamp(adjustedImpulse.magnitude, minExplodeImpulse, maxExplodeImpulse) * perShardImpulseFraction;
        List <Vector2> list2      = new List <Vector2>();
        List <Vector2> list3      = new List <Vector2>();
        List <float>   list4      = new List <float>();

        for (int n = 0; n < num6; n++)
        {
            Vector2        vector10 = new Vector2(array[n], array2[n]);
            List <Vector2> list5    = array3[n];
            if (list5.Count < 3)
            {
                continue;
            }
            list4.Clear();
            list3.Clear();
            list2.Clear();
            int     count2 = list5.Count;
            Vector2 zero   = Vector2.zero;
            for (int num17 = 0; num17 < count2; num17++)
            {
                zero += list5[num17];
            }
            zero /= (float)list5.Count;
            for (int num18 = 0; num18 < count2; num18++)
            {
                Vector2 item  = list5[num18] - zero;
                float   num19 = Mathf.Atan2(item.x, item.y);
                int     num20;
                for (num20 = 0; num20 < list4.Count && num19 < list4[num20]; num20++)
                {
                }
                list3.Insert(num20, item);
                list4.Insert(num20, num19);
            }
            if (cellInset > 0f)
            {
                for (int num21 = 0; num21 < count2; num21++)
                {
                    Vector2 b3          = list3[num21];
                    Vector2 a           = list3[(num21 + count2 - 1) % count2];
                    Vector2 b4          = list3[(num21 + count2 - 1) % count2];
                    Vector2 normalized2 = (a - b3 + b4 - b3).normalized;
                    list2.Add(normalized2);
                }
                for (int num22 = 0; num22 < count2; num22++)
                {
                    list3[num22] += list2[num22] * cellInset;
                }
            }
            Vector3[] array4 = new Vector3[count2 * 6];
            int[]     array5 = new int[(count2 * 2 + (count2 - 2) * 2) * 3];
            int       num23  = count2 * 2 * 3;
            int       num24  = num23 + (count2 - 2) * 3;
            Vector3   zero2  = Vector3.zero;
            for (int num25 = 0; num25 < count2; num25++)
            {
                Vector2 vector11 = list3[num25];
                array4[num25 * 6]     = (array4[num25 * 6 + 1] = (array4[num25 * 6 + 2] = To3D(new Vector3(vector11.x, vector11.y, z2) - zero2)));
                array4[num25 * 6 + 3] = (array4[num25 * 6 + 4] = (array4[num25 * 6 + 5] = To3D(new Vector3(vector11.x, vector11.y, z3) - zero2)));
                int num26 = (num25 + 1) % count2;
                int num27 = num25 * 6 + 3;
                int num28 = num25 * 6;
                int num29 = num26 * 6 + 4;
                int num30 = num26 * 6 + 1;
                array5[num25 * 6]     = num27;
                array5[num25 * 6 + 1] = num28;
                array5[num25 * 6 + 2] = num29;
                array5[num25 * 6 + 3] = num29;
                array5[num25 * 6 + 4] = num28;
                array5[num25 * 6 + 5] = num30;
                if (num25 >= 2)
                {
                    array5[num23 + (num25 - 2) * 3]     = 2;
                    array5[num23 + (num25 - 2) * 3 + 1] = num25 * 6 + 2;
                    array5[num23 + (num25 - 2) * 3 + 2] = (num25 - 1) * 6 + 2;
                    array5[num24 + (num25 - 2) * 3]     = 5;
                    array5[num24 + (num25 - 2) * 3 + 1] = (num25 - 1) * 6 + 5;
                    array5[num24 + (num25 - 2) * 3 + 2] = num25 * 6 + 5;
                }
            }
            Mesh mesh = new Mesh();
            mesh.name      = "cell" + n;
            mesh.vertices  = array4;
            mesh.triangles = array5;
            mesh.RecalculateNormals();
            float num31 = 0f;
            for (int num32 = 0; num32 < count2; num32++)
            {
                Vector2 vector12 = list3[num32];
                Vector2 vector13 = list3[(num32 + 1) % count2];
                num31 += vector12.x * vector13.y - vector12.y * vector13.x;
            }
            num31 /= 2f;
            MeshFilter           meshFilter           = null;
            MeshRenderer         x2                   = null;
            MeshCollider         meshCollider         = null;
            CollisionAudioSensor collisionAudioSensor = null;
            GameObject           gameObject2;
            if (shardPrefab == null)
            {
                gameObject2       = new GameObject();
                gameObject2.layer = shardLayer;
            }
            else
            {
                gameObject2          = UnityEngine.Object.Instantiate(shardPrefab);
                meshFilter           = gameObject2.GetComponent <MeshFilter>();
                x2                   = gameObject2.GetComponent <MeshRenderer>();
                meshCollider         = gameObject2.GetComponent <MeshCollider>();
                collisionAudioSensor = gameObject2.GetComponent <CollisionAudioSensor>();
            }
            gameObject2.SetActive(value: false);
            gameObject2.name = "cell" + n;
            if (meshFilter == null)
            {
                meshFilter = gameObject2.AddComponent <MeshFilter>();
            }
            meshFilter.mesh = mesh;
            if (x2 == null)
            {
                x2 = gameObject2.AddComponent <MeshRenderer>();
                x2.sharedMaterial = material;
            }
            if (meshCollider == null)
            {
                meshCollider = gameObject2.AddComponent <MeshCollider>();
            }
            Rigidbody rigidbody = gameObject2.AddComponent <Rigidbody>();
            rigidbody.mass              = Mathf.Max(4f, ((!NetGame.isNetStarted) ? 1f : 0.6f) * num31 * densityPerSqMeter);
            meshCollider.convex         = true;
            meshCollider.sharedMesh     = mesh;
            meshCollider.sharedMaterial = physicsMaterial;
            if (collisionAudioSensor == null)
            {
                collisionAudioSensor = gameObject2.AddComponent <CollisionAudioSensor>();
            }
            collisionAudioSensor.pitch = Mathf.Clamp(10f / rigidbody.mass, 0.9f, 1.1f);
            Vector3 vector14 = (vector10 - b) * 10f;
            vector14.z = Mathf.Lerp((vector10 - b).sqrMagnitude, 100f, 0f);
            float d2 = Mathf.Clamp(value, 0f, maxShardVelocity * rigidbody.mass);
            gameObject2.transform.SetParent(shardParent.transform, worldPositionStays: false);
            gameObject2.transform.localPosition = To3D(zero) + boxCollider.center;
            gameObject2.SetActive(value: true);
            gameObject2.GetComponent <Rigidbody>().SafeAddForceAtPosition(-normalized * d2, (3f * contactPoint + To3D(vector10)) / 4f, ForceMode.Impulse);
            NetIdentity netIdentity = gameObject2.AddComponent <NetIdentity>();
            netIdentity.sceneId = (uint)n;
            gameObject2.AddComponent <NetBody>().Start();
            shardParent.AddIdentity(netIdentity);
            cells.Add(gameObject2);
        }
        shardParent.StartNetwork(repopulate: false);
    }