Exemplo n.º 1
0
        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);
        }
Exemplo n.º 2
0
        /// <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);
            }
        }