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 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); }
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); }
public bool CustomCollision(BaseTrain train, TriggerTrainCollisions trainTrigger) { return(false); }