Example #1
0
    public float ApplyCollisions(float trackSpeed, bool atOurFront, TriggerTrainCollisions trigger, ref StaticCollisionState wasStaticColliding, float deltaTime)
    {
        bool  hasAnyStaticContents = trigger.HasAnyStaticContents;
        float num = (hasAnyStaticContents ? (rigidBody.velocity.magnitude * rigidBody.mass) : 0f);

        trackSpeed = HandleStaticCollisions(hasAnyStaticContents, atOurFront, trackSpeed, ref wasStaticColliding);
        if (!hasAnyStaticContents)
        {
            foreach (BaseTrain trainContent in trigger.trainContents)
            {
                trackSpeed = HandleTrainCollision(atOurFront, trackSpeed, trainContent, deltaTime, ref wasStaticColliding);
                num       += Vector3.Magnitude(trainContent.rigidBody.velocity - rigidBody.velocity) * trainContent.rigidBody.mass;
            }
            foreach (Rigidbody otherRigidbodyContent in trigger.otherRigidbodyContents)
            {
                trackSpeed = HandleRigidbodyCollision(atOurFront, trackSpeed, otherRigidbodyContent, otherRigidbodyContent.mass, deltaTime, true);
                num       += Vector3.Magnitude(otherRigidbodyContent.velocity - rigidBody.velocity) * otherRigidbodyContent.mass;
            }
        }
        if (ApplyCollisionDamage(num) > 5f && collisionEffect.isValid && UnityEngine.Time.time > nextCollisionFXTime)
        {
            foreach (Collider colliderContent in trigger.colliderContents)
            {
                Effect.server.Run(collisionEffect.resourcePath, colliderContent.ClosestPointOnBounds(base.transform.position), base.transform.up);
            }
            nextCollisionFXTime = UnityEngine.Time.time + 0.5f;
        }
        return(trackSpeed);
    }
Example #2
0
    public float GetTotalPushingForces(Vector3 pushDirection, List <BaseTrain> prevTrains = null)
    {
        if (prevTrains == null)
        {
            prevTrains = Facepunch.Pool.GetList <BaseTrain>();
        }
        else if (prevTrains.Contains(this))
        {
            Debug.LogWarning("GetTotalPushingForces: Recursive loop detected. Bailing out.");
            Facepunch.Pool.FreeList(ref prevTrains);
            return(0f);
        }
        prevTrains.Add(this);
        bool num = Vector3.Dot(base.transform.forward, pushDirection) >= 0f;
        TriggerTrainCollisions triggerTrainCollisions = (num ? frontCollisionTrigger : rearCollisionTrigger);
        float num2 = GetEngineForces();

        if (!num)
        {
            num2 *= -1f;
        }
        foreach (BaseTrain trainContent in triggerTrainCollisions.trainContents)
        {
            if (!(trainContent == this))
            {
                num2 += trainContent.GetTotalPushingForces(pushDirection, prevTrains);
            }
        }
        Facepunch.Pool.FreeList(ref prevTrains);
        return(num2);
    }
Example #3
0
    public float GetTotalPushingMass(Vector3 pushDirection, List <BaseTrain> prevTrains = null)
    {
        if (prevTrains == null)
        {
            prevTrains = Facepunch.Pool.GetList <BaseTrain>();
        }
        else if (prevTrains.Contains(this))
        {
            Debug.LogWarning("GetTotalPushingMass: Recursive loop detected. Bailing out.");
            Facepunch.Pool.FreeList(ref prevTrains);
            return(0f);
        }
        prevTrains.Add(this);
        bool flag = Vector3.Dot(base.transform.forward, pushDirection) >= 0f;

        if ((flag ? staticCollidingAtFront : staticCollidingAtRear) != 0)
        {
            Facepunch.Pool.FreeList(ref prevTrains);
            return(-1f);
        }
        TriggerTrainCollisions triggerTrainCollisions = (flag ? frontCollisionTrigger : rearCollisionTrigger);
        float num = rigidBody.mass;

        foreach (BaseTrain trainContent in triggerTrainCollisions.trainContents)
        {
            if (!(trainContent == this))
            {
                float totalPushingMass = trainContent.GetTotalPushingMass(pushDirection, prevTrains);
                if (totalPushingMass < 0f)
                {
                    Facepunch.Pool.FreeList(ref prevTrains);
                    return(-1f);
                }
                num += totalPushingMass;
            }
        }
        foreach (Rigidbody otherRigidbodyContent in triggerTrainCollisions.otherRigidbodyContents)
        {
            num += otherRigidbodyContent.mass;
        }
        Facepunch.Pool.FreeList(ref prevTrains);
        return(num);
    }
Example #4
0
 public bool CustomCollision(BaseTrain train, TriggerTrainCollisions trainTrigger)
 {
     return(false);
 }