/// <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(); } } }
/// <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; } } }
/// <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; } }
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))); } } }
/// <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(); } } }
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); } }
/// <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(); } } }