Пример #1
0
        /// <summary>
        ///     Will open the character helmet if enough oxygen is around or close it if not.
        /// </summary>
        private void ToggleHelmetIfNeeded(Work.Data workData)
        {
            using (Log.BeginMethod(nameof(ToggleHelmetIfNeeded))) {
                var character = MyAPIGateway.Session.LocalHumanPlayer?.Character;
                if (character == null)
                {
                    Log.Warning("No character found for local player.");
                    return;
                }

                var oxygen   = GetOxygenLevel(character);
                var required = oxygen <= 0.5;
                if (character.EnabledHelmet != required)
                {
                    character.SwitchHelmet();
                }
            }
        }
Пример #2
0
        /// <summary>
        ///     Auto Align character to gravity.
        /// </summary>
        private void AutoAlign(Work.Data obj)
        {
            using (Log.BeginMethod(nameof(AutoAlign))) {
                var character = MyAPIGateway.Session.LocalHumanPlayer?.Character;
                if (character == null)
                {
                    Log.Warning("No character found for local player.");
                    return;
                }

                _isAutoAlignRunning = true;

                var physics = character.Physics;
                if (physics != null)
                {
                    var gravity = physics.Gravity;
                    if (gravity.Length() > 0)
                    {
                        gravity.Normalize();
                        var matrix  = character.WorldMatrix;
                        var up      = (Vector3)matrix.Up;
                        var forward = (Vector3)matrix.Forward;

                        CalculateAlignment(character, ref gravity, ref up, ref forward);
                        character.SetWorldMatrix(MatrixD.CreateWorld(matrix.Translation, forward, up));
                    }
                }
                else
                {
                    Log.Error("No physics found for character.");
                }

                if (!_stopAutoAlign && _isFlying)
                {
                    _workQueue.Enqueue(new Work(AutoAlign));
                }
                else
                {
                    _isAutoAlignRunning = false;
                    _stopAutoAlign      = false;
                    _autoAlignTicks     = 0;
                }
            }
        }
Пример #3
0
        /// <summary>
        /// </summary>
        /// <param name="workData"></param>
        private void ShowFuelLowWarningIfNeeded(Work.Data workData)
        {
            using (Log.BeginMethod(nameof(ShowFuelLowWarningIfNeeded))) {
                var character = MyAPIGateway.Session.LocalHumanPlayer?.Character;
                if (character == null)
                {
                    Log.Warning("No character found for local player.");
                    return;
                }

                var isFuelUnderThreshold = IsFuelUnderThreshold(character, Mod.Static.Settings.FuelThreshold);
                if (isFuelUnderThreshold && !_wasFuelUnderThresholdBefore)
                {
                    ShowFuelLowWarningNotification(character);
                }

                _wasFuelUnderThresholdBefore = isFuelUnderThreshold;
            }
        }
Пример #4
0
        private void Respawned(Work.Data workData)
        {
            using (Log.BeginMethod(nameof(Respawned))) {
                var character = MyAPIGateway.Session.LocalHumanPlayer?.Character;
                if (character == null)
                {
                    Log.Warning("No character found for local player.");
                    return;
                }

                var respawnLocation = GetRespawnLocation(character);
                if (respawnLocation != null)
                {
                    var lastEntity = respawnLocation.CubeGrid;
                    _workQueue.Enqueue(new Work(ToggleHelmetIfNeeded));
                    _workQueue.Enqueue(new Work(ToggleJetpackAndDampenersIfNeeded, new ThrusterWorkData(lastEntity, true)));
                }
            }
        }
Пример #5
0
        /// <summary>
        ///     Will open the character helmet if enough oxygen is around or close it if not.
        /// </summary>
        private void ToggleHelmetIfNeeded(Work.Data workData)
        {
            using (Log.BeginMethod(nameof(ToggleHelmetIfNeeded))) {
                var character = MyAPIGateway.Session.LocalHumanPlayer?.Character;
                if (character == null)
                {
                    Log.Warning("No character found for local player.");
                    return;
                }

                var underwater = false;
                if (Mod.Static.WaterModAvailable && Mod.Static.WaterModAPI.Registered)
                {
                    var waters = Mod.Static.WaterModAPI.Waters;
                    if (waters != null)
                    {
                        foreach (var water in Mod.Static.WaterModAPI.Waters)
                        {
                            var depth = water.GetDepth(character.GetHeadMatrix(true).Translation);
                            if (depth < 0)
                            {
                                underwater = true;
                            }
                        }
                    }
                    else
                    {
                        Log.Debug("Waters not registered.");
                    }
                }

                var oxygen   = GetOxygenLevel(character);
                var required = oxygen <= 0.5 || underwater;
                if (character.EnabledHelmet != required)
                {
                    character.SwitchHelmet();
                }
            }
        }
Пример #6
0
        private void MoveAndRotate(Work.Data workData)
        {
            using (Log.BeginMethod(nameof(MoveAndRotate))) {
                var data = workData as MoveAnRotateData;
                if (data == null)
                {
                    Log.Warning("Invalid workData.");
                    return;
                }

                var character = MyAPIGateway.Session.LocalHumanPlayer?.Character;
                if (character == null)
                {
                    Log.Warning("No character found for local player.");
                    return;
                }

                var movementIndicator = data.MoveIndicator;
                var rotationIndicator = data.RotationIndicator;
                var rollIndicator     = data.RollIndicator;

                character.MoveAndRotate(movementIndicator, rotationIndicator, rollIndicator);
            }
        }
Пример #7
0
        /// <summary>
        ///     Will enable jetpack when no gravity is present and no ground is in range.
        ///     Will enable dampeners when allowed and grid is not moving or planetary gravity is detected and no ground is in
        ///     range.
        /// </summary>
        private void ToggleJetpackAndDampenersIfNeeded(Work.Data workData)
        {
            using (Log.BeginMethod(nameof(ToggleJetpackAndDampenersIfNeeded))) {
                var data = workData as ThrusterWorkData;
                if (data == null)
                {
                    Log.Warning("Invalid workData.");
                    return;
                }

                var character = MyAPIGateway.Session.LocalHumanPlayer?.Character;
                if (character == null)
                {
                    Log.Warning("No character found for local player.");
                    return;
                }

                var lastEntity = data.LastEntity;
                var allowSwitchingDampeners = data.AllowSwitchingDampeners;
                var leavedLadder            = data.LeavedLadder;

                var gravity         = Vector3D.Zero;
                var linearVelocity  = Vector3D.Zero;
                var angularVelocity = Vector3D.Zero;
                if (lastEntity != null && !lastEntity.Closed)
                {
                    var cockpit = lastEntity as IMyCockpit;
                    if (cockpit != null)
                    {
                        gravity = cockpit.GetTotalGravity();
                        var velocities = cockpit.GetShipVelocities();
                        linearVelocity  = velocities.LinearVelocity;
                        angularVelocity = velocities.AngularVelocity;
                    }
                    else
                    {
                        var physics = lastEntity.Physics;
                        if (physics == null)
                        {
                            Log.Warning("No physics found for entity.");
                        }
                        else
                        {
                            gravity         = physics.Gravity;
                            linearVelocity  = physics.LinearVelocity;
                            angularVelocity = physics.AngularVelocity;
                        }
                    }
                }
                else
                {
                    var physics = character.Physics;
                    if (physics == null)
                    {
                        Log.Warning("No physics found for local player character.");
                        return;
                    }

                    gravity = physics.Gravity;
                }

                var hasGravity      = gravity.Length() > 0;
                var isGroundInRange = hasGravity ? IsGroundInRange(character, gravity) : IsGroundInRange(character);
                var isNotMoving     = Math.Abs(linearVelocity.Length()) < Mod.Static.Settings.HaltedSpeedTolerance && Math.Abs(angularVelocity.Length()) < Mod.Static.Settings.HaltedSpeedTolerance;
                var thrustRequired  = !isGroundInRange;
                if (!thrustRequired && !hasGravity)
                {
                    linearVelocity += character.WorldMatrix.Down * 2;
                }

                if (leavedLadder)
                {
                    var moveAnRotateData = new MoveAnRotateData(new Vector3(0, 0, -1), Vector2.Zero, 0);
                    MoveAndRotate(moveAnRotateData);
                    for (var i = 0; i < 10; i++)
                    {
                        _delayedWorkQueue.Add(new DelayedWork(MoveAndRotate, 1 + i, moveAnRotateData));
                    }
                }

                character.Physics.SetSpeeds(linearVelocity, angularVelocity);

                if (allowSwitchingDampeners)
                {
                    ToggleDampenersIfNeeded(character, isNotMoving, hasGravity, isGroundInRange, _lastDampenerState);
                }

                if (character.EnabledThrusts != thrustRequired)
                {
                    character.SwitchThrusts();
                }
            }
        }