public void UpdateTankFalling(FixedUpdateEvent evt, FallingTankNode tank) { TankFallingComponent tankFalling = tank.tankFalling; TrackComponent track = tank.track; RigidbodyComponent rigidbody = tank.rigidbody; TankCollisionComponent tankCollision = tank.tankCollision; ChassisConfigComponent chassisConfig = tank.chassisConfig; Entity tankEntity = tank.Entity; int trackContacts = this.GetTrackContacts(track); int collisionContacts = this.GetCollisionContacts(tankCollision); int num5 = collisionContacts - tankFalling.PreviousCollisionContactsCount; int deltaTrackContacts = trackContacts - tankFalling.PreviousTrackContactsCount; Vector3 previousVelocity = tankFalling.PreviousVelocity; tankFalling.PreviousCollisionContactsCount = collisionContacts; tankFalling.PreviousTrackContactsCount = trackContacts; tankFalling.PreviousVelocity = rigidbody.Rigidbody.velocity; if (deltaTrackContacts > 0) { this.ApplyFall(tankEntity, previousVelocity, tankFalling, track, chassisConfig, tankCollision, rigidbody, true); } else if ((num5 > 0) && (trackContacts == 0)) { this.ApplyFall(tankEntity, previousVelocity, tankFalling, track, chassisConfig, tankCollision, rigidbody, false); } else { this.UpdateGroundedStatus(tankFalling, deltaTrackContacts, collisionContacts, trackContacts); } }
public void InitTankFalling(NodeAddedEvent evt, ActivatedTankNode tank) { Entity entity = tank.Entity; TankFallingComponent component = new TankFallingComponent(); TrackComponent track = tank.track; TankCollisionComponent tankCollision = tank.tankCollision; component.PreviousCollisionContactsCount = this.GetCollisionContacts(tankCollision); component.PreviousTrackContactsCount = this.GetTrackContacts(track); component.IsGrounded = true; component.PreviousVelocity = Vector3.zero; entity.AddComponent(component); }
private Vector3 GetFallingNrm(bool fallingByTrack, TrackComponent track, ChassisConfigComponent chassisConfig, TankCollisionComponent tankCollision, out bool isFallingOnTank) { Vector3 zero = Vector3.zero; isFallingOnTank = false; if (!fallingByTrack) { Collision collision = tankCollision.Collision; if (!this.CheckTankCollisionNotNull(tankCollision)) { return(zero.normalized); } ContactPoint[] contacts = collision.contacts; if (contacts == null) { return(zero.normalized); } int length = contacts.Length; for (int i = 0; i < length; i++) { ContactPoint point = contacts[i]; zero += point.normal; if (!isFallingOnTank) { Collider otherCollider = point.otherCollider; if (this.ValidateCollider(otherCollider)) { int layer = otherCollider.gameObject.layer; isFallingOnTank |= this.CheckTankLayer(layer); } } } } else { int numRaysPerTrack = chassisConfig.NumRaysPerTrack; SuspensionRay[] rays = track.LeftTrack.rays; SuspensionRay[] rayArray2 = track.RightTrack.rays; for (int i = 0; i < numRaysPerTrack; i++) { SuspensionRay ray = rays[i]; SuspensionRay ray2 = rayArray2[i]; this.ApplyTrackRayNormal(ref zero, ray); this.ApplyTrackRayNormal(ref zero, ray2); if (!isFallingOnTank) { if (ray.hasCollision) { if ((ray.rayHit.collider == null) || (ray.rayHit.collider.gameObject == null)) { return(zero.normalized); } if (this.ValidateCollider(ray.rayHit.collider)) { int layer = ray.rayHit.collider.gameObject.layer; isFallingOnTank |= this.CheckTankLayer(layer); } } if (ray2.hasCollision) { if ((ray2.rayHit.collider == null) || (ray2.rayHit.collider.gameObject == null)) { return(zero.normalized); } if (this.ValidateCollider(ray2.rayHit.collider)) { int layer = ray2.rayHit.collider.gameObject.layer; isFallingOnTank |= this.CheckTankLayer(layer); } } } } } return(zero.normalized); }
private int GetCollisionContacts(TankCollisionComponent tankCollision) { Collision collision = tankCollision.Collision; return((collision != null) ? ((collision.contacts != null) ? collision.contacts.Length : 0) : 0); }
private bool CheckTankCollisionNotNull(TankCollisionComponent tankCollision) => (tankCollision.HasCollision && (tankCollision.Collision != null)) && (tankCollision.Collision.rigidbody != null);
private void ApplyFall(Entity tankEntity, Vector3 previousVelocity, TankFallingComponent tankFalling, TrackComponent track, ChassisConfigComponent chassisConfig, TankCollisionComponent tankCollision, RigidbodyComponent rigidbody, bool fallingByTrack) { if ((tankFalling != null) && (!tankFalling.IsGrounded && rigidbody.Rigidbody)) { bool flag; Vector3 planeNormal = this.GetFallingNrm(fallingByTrack, track, chassisConfig, tankCollision, out flag); Vector3 vector2 = Vector3.ProjectOnPlane(previousVelocity, planeNormal); Vector3 position = rigidbody.Rigidbody.transform.position; TankFallingType type = this.DefineFallingCollisionMode(flag, fallingByTrack, planeNormal); TankFallEvent eventInstance = new TankFallEvent { FallingPower = (previousVelocity - vector2).sqrMagnitude, FallingType = type, Velocity = previousVelocity }; if ((type == TankFallingType.SLOPED_STATIC_WITH_COLLISION) && this.CheckTankCollisionNotNull(tankCollision)) { eventInstance.FallingTransform = tankCollision.Collision.transform; } base.ScheduleEvent(eventInstance, tankEntity); tankFalling.IsGrounded = true; } }