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); }
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); }
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); }
public void FreeStaticCollision() { staticCollidingAtFront = StaticCollisionState.Free; staticCollidingAtRear = StaticCollisionState.Free; }