public void Update() { if (Globals.UpdateCount < m_nextUpdate) return; m_nextUpdate = Globals.UpdateCount + ShipAutopilot.UpdateFrequency; m_totalThrustForce.Clear(); Vector3D position = myGrid.GetPosition(); bool first = true; Vector3 worldGravity = Vector3.Zero; m_planetAtmos = null; m_airDensity = 0f; List<IMyVoxelBase> allPlanets = ResourcePool<List<IMyVoxelBase>>.Pool.Get(); MyAPIGateway.Session.VoxelMaps.GetInstances_Safe(allPlanets, voxel => voxel is MyPlanet); foreach (MyPlanet planet in allPlanets) if (planet.IsPositionInGravityWell(position)) { if (first) { first = false; m_gravStrength = planet.GetGravityMultiplier(position) * 9.81f; Vector3 direction = planet.GetWorldGravityNormalized(ref position); worldGravity = m_gravStrength.Value * direction; } else { worldGravity += planet.GetWorldGravity(position); m_gravStrength = null; } if (planet.HasAtmosphere) { m_airDensity += planet.GetAirDensity(position); m_planetAtmos = planet; } } allPlanets.Clear(); ResourcePool<List<IMyVoxelBase>>.Pool.Return(allPlanets); if (m_primaryDirty) { m_primaryDirty = false; CalcForceInDirection(Base6Directions.Direction.Forward); CalcForceInDirection(Base6Directions.Direction.Backward); CalcForceInDirection(Base6Directions.Direction.Up); CalcForceInDirection(Base6Directions.Direction.Down); CalcForceInDirection(Base6Directions.Direction.Left); CalcForceInDirection(Base6Directions.Direction.Right); if (m_primaryForce.Force < 1f) throw new Exception("Ship has no thrusters"); } if (worldGravity.LengthSquared() < 0.01f) { //myLogger.debugLog("Not in gravity well", "Update()"); WorldGravity = Vector3.Zero; LocalGravity = Vector3.Zero; m_gravStrength = 0f; return; } WorldGravity = worldGravity; LocalGravity = new DirectionGrid() { vector = Vector3.Transform(worldGravity, myGrid.WorldMatrixNormalizedInv.GetOrientation()) }; Vector3 gravityReactRatio = Vector3.Zero; if (LocalGravity.vector.X > 0) gravityReactRatio.X = -LocalGravity.vector.X * myGrid.Physics.Mass / GetForceInDirection(Base6Directions.Direction.Left); else gravityReactRatio.X = -LocalGravity.vector.X * myGrid.Physics.Mass / GetForceInDirection(Base6Directions.Direction.Right); if (LocalGravity.vector.Y > 0) gravityReactRatio.Y = -LocalGravity.vector.Y * myGrid.Physics.Mass / GetForceInDirection(Base6Directions.Direction.Down); else gravityReactRatio.Y = -LocalGravity.vector.Y * myGrid.Physics.Mass / GetForceInDirection(Base6Directions.Direction.Up); if (LocalGravity.vector.Z > 0) gravityReactRatio.Z = -LocalGravity.vector.Z * myGrid.Physics.Mass / GetForceInDirection(Base6Directions.Direction.Forward); else gravityReactRatio.Z = -LocalGravity.vector.Z * myGrid.Physics.Mass / GetForceInDirection(Base6Directions.Direction.Backward); GravityReactRatio = gravityReactRatio; myLogger.debugLog("Gravity: " + WorldGravity + ", local: " + LocalGravity + ", react: " + gravityReactRatio + ", air density: " + m_airDensity); }
/// <summary> /// Set the overrides of thrusters to match MoveForceRatio. Should be called on game thread. /// </summary> public void SetOverrides(ref DirectionGrid MoveForceRatio) { if (MoveForceRatio.vector.X >= 0f) { SetOverrides(Base6Directions.Direction.Right, MoveForceRatio.vector.X); ClearOverrides(Base6Directions.Direction.Left); } else { ClearOverrides(Base6Directions.Direction.Right); SetOverrides(Base6Directions.Direction.Left, -MoveForceRatio.vector.X); } if (MoveForceRatio.vector.Y >= 0f) { SetOverrides(Base6Directions.Direction.Up, MoveForceRatio.vector.Y); ClearOverrides(Base6Directions.Direction.Down); } else { ClearOverrides(Base6Directions.Direction.Up); SetOverrides(Base6Directions.Direction.Down, -MoveForceRatio.vector.Y); } if (MoveForceRatio.vector.Z >= 0f) { SetOverrides(Base6Directions.Direction.Backward, MoveForceRatio.vector.Z); ClearOverrides(Base6Directions.Direction.Forward); } else { ClearOverrides(Base6Directions.Direction.Backward); SetOverrides(Base6Directions.Direction.Forward, -MoveForceRatio.vector.Z); } }