private bool SteeringLogic() { Vector3 vector2; Color? nullable; if (!base.IsFunctional) { return(false); } MyGridPhysics physics = base.CubeGrid.Physics; if (physics == null) { return(false); } if ((base.Stator != null) && MyFixedGrids.IsRooted(base.Stator.CubeGrid)) { return(false); } if (this.m_slipCountdown > 0) { this.m_slipCountdown--; } if (this.m_staticHitCount == 0) { if (this.m_contactCountdown <= 0) { return(false); } this.m_contactCountdown--; if (this.m_contactCountdown == 0) { this.m_frictionCollector = 0f; this.m_contactNormals.Clear(); return(false); } } Vector3 linearVelocity = physics.LinearVelocity; if (MyUtils.IsZero(ref linearVelocity, 1E-05f) || !physics.IsActive) { return(false); } MatrixD worldMatrix = base.WorldMatrix; Vector3D centerOfMassWorld = physics.CenterOfMassWorld; if (!this.m_contactNormals.GetAvgNormal(out vector2)) { return(false); } this.LastUsedGroundNormal = vector2; Vector3 up = (Vector3)worldMatrix.Up; Vector3 guideVector = Vector3.Cross(vector2, up); linearVelocity = Vector3.ProjectOnPlane(ref linearVelocity, ref vector2); Vector3 direction = Vector3.ProjectOnVector(ref linearVelocity, ref guideVector); Vector3 vector6 = direction - linearVelocity; if (MyUtils.IsZero(ref vector6, 1E-05f)) { return(false); } bool flag = false; bool flag2 = false; float num = 6f * this.m_frictionCollector; Vector3 vec = Vector3.ProjectOnVector(ref vector6, ref up); float num2 = vec.Length(); bool flag3 = num2 > num; if (!flag3 && (this.m_slipCountdown == 0)) { if (num2 < 0.1) { flag2 = true; } } else { flag = true; vec = (vec * ((1f / num2) * num)) * (1f - MyPhysicsConfig.WheelSlipCutAwayRatio); if (flag3) { this.m_slipCountdown = MyPhysicsConfig.WheelSlipCountdown; } } if (!flag2) { vec *= 1f - ((1f - this.m_frictionCollector) * MyPhysicsConfig.WheelSurfaceMaterialSteerRatio); Vector3 vector9 = Vector3.ProjectOnPlane(ref vec, ref vector2); MyMechanicalConnectionBlockBase stator = base.Stator; MyPhysicsBody body = null; if (stator != null) { body = base.Stator.CubeGrid.Physics; } vector9 *= 0.1f; if (body == null) { physics.ApplyImpulse(vector9 * physics.Mass, centerOfMassWorld); } else { Vector3D zero = Vector3D.Zero; MyMotorSuspension suspension = stator as MyMotorSuspension; if (suspension != null) { Vector3 vector10; vector9 *= MyMath.Clamp(suspension.Friction * 2f, 0f, 1f); suspension.GetCoMVectors(out vector10); zero = Vector3D.TransformNormal(-vector10, stator.CubeGrid.WorldMatrix); } Vector3D pos = centerOfMassWorld + zero; float wheelImpulseBlending = MyPhysicsConfig.WheelImpulseBlending; vector9 = (this.m_lastFrameImpuse * wheelImpulseBlending) + (vector9 * (1f - wheelImpulseBlending)); this.m_lastFrameImpuse = vector9; body.ApplyImpulse(vector9 * body.Mass, pos); if (MyDebugDrawSettings.DEBUG_DRAW_WHEEL_PHYSICS) { nullable = null; MyRenderProxy.DebugDrawArrow3DDir(pos, -zero, Color.Red, nullable, false, 0.1, null, 0.5f, false); MyRenderProxy.DebugDrawSphere(pos, 0.1f, Color.Yellow, 1f, false, false, true, false); } } } if (MyDebugDrawSettings.DEBUG_DRAW_WHEEL_PHYSICS) { nullable = null; MyRenderProxy.DebugDrawArrow3DDir(centerOfMassWorld, linearVelocity, Color.Yellow, nullable, false, 0.1, null, 0.5f, false); nullable = null; MyRenderProxy.DebugDrawArrow3DDir(centerOfMassWorld, direction, Color.Blue, nullable, false, 0.1, null, 0.5f, false); nullable = null; MyRenderProxy.DebugDrawArrow3DDir(centerOfMassWorld, vec, Color.MediumPurple, nullable, false, 0.1, null, 0.5f, false); nullable = null; MyRenderProxy.DebugDrawArrow3DDir(centerOfMassWorld + linearVelocity, vector6, Color.Red, nullable, false, 0.1, null, 0.5f, false); nullable = null; MyRenderProxy.DebugDrawArrow3DDir(centerOfMassWorld + up, vector2, Color.AliceBlue, nullable, false, 0.1, null, 0.5f, false); nullable = null; MyRenderProxy.DebugDrawArrow3DDir(centerOfMassWorld, Vector3.ProjectOnPlane(ref vec, ref vector2), flag ? Color.DarkRed : Color.IndianRed, nullable, false, 0.1, null, 0.5f, false); if (this.m_slipCountdown > 0) { MyRenderProxy.DebugDrawText3D(centerOfMassWorld + (up * 2f), "Drift", Color.Red, 1f, false, MyGuiDrawAlignEnum.HORISONTAL_LEFT_AND_VERTICAL_TOP, -1, false); } MyRenderProxy.DebugDrawText3D(centerOfMassWorld + (up * 1.2f), this.m_staticHitCount.ToString(), Color.Red, 1f, false, MyGuiDrawAlignEnum.HORISONTAL_LEFT_AND_VERTICAL_TOP, -1, false); } return(!flag2); }