Esempio n. 1
0
    public float HandleTrainCollision(bool front, float trackSpeed, BaseTrain theirTrain, float deltaTime, ref StaticCollisionState wasStaticColliding)
    {
        Vector3 pushDirection = (front ? base.transform.forward : (-base.transform.forward));
        float   num           = Vector3.Angle(base.transform.forward, theirTrain.transform.forward);
        float   f             = Vector3.Dot(rhs: (theirTrain.transform.position - base.transform.position).normalized, lhs: base.transform.forward);

        if ((num > 30f && num < 150f) || Mathf.Abs(f) < 0.975f)
        {
            trackSpeed = (front ? (-0.5f) : 0.5f);
        }
        else
        {
            float totalPushingMass = theirTrain.GetTotalPushingMass(pushDirection);
            trackSpeed = ((!(totalPushingMass < 0f)) ? HandleRigidbodyCollision(front, trackSpeed, theirTrain.rigidBody, totalPushingMass, deltaTime, false) : HandleStaticCollisions(true, front, trackSpeed, ref wasStaticColliding));
            float num2 = theirTrain.GetTotalPushingForces(pushDirection);
            if (!front)
            {
                num2 *= -1f;
            }
            trackSpeed += num2 / rigidBody.mass * deltaTime;
        }
        return(trackSpeed);
    }
Esempio n. 2
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);
    }
Esempio n. 3
0
    public float HandleStaticCollisions(bool staticColliding, bool front, float trackSpeed, ref StaticCollisionState wasStaticColliding)
    {
        float num = (front ? (-5f) : 5f);

        if (staticColliding && (front ? (trackSpeed > num) : (trackSpeed < num)))
        {
            trackSpeed         = num;
            wasStaticColliding = StaticCollisionState.StaticColliding;
        }
        else if (wasStaticColliding == StaticCollisionState.StaticColliding)
        {
            trackSpeed         = 0f;
            wasStaticColliding = StaticCollisionState.StayingStill;
        }
        else if (wasStaticColliding == StaticCollisionState.StayingStill)
        {
            if (front ? (trackSpeed > 0.01f) : (trackSpeed < -0.01f))
            {
                trackSpeed = 0f;
            }
            else
            {
                wasStaticColliding = StaticCollisionState.Free;
            }
        }
        return(trackSpeed);
    }
Esempio n. 4
0
 public void FreeStaticCollision()
 {
     staticCollidingAtFront = StaticCollisionState.Free;
     staticCollidingAtRear  = StaticCollisionState.Free;
 }