public List <RayCastResult> CastRaysAroundPlayer(IMyCharacter character, double distance, int raysCount) { var position = character.GetPosition(); var orientation = character.PositionComp.GetOrientation(); var forward = orientation.Forward; return(CastRaysAroundPosition(position + orientation.Up, forward, distance, raysCount)); }
/// <summary> /// Called on <see cref="IMyCharacter.MovementStateChanged" /> event. Used to check if we leave a cockpit. /// </summary> /// <param name="character">The character who triggered this event.</param> /// <param name="oldState">The old movement state.</param> /// <param name="newState">The new movement state.</param> private void OnMovementStateChanged(IMyCharacter character, MyCharacterMovementEnum oldState, MyCharacterMovementEnum newState) { if (Mod.Static.Settings.DisableAutoDampener == DisableAutoDampenerOption.All && (newState == MyCharacterMovementEnum.Sitting || newState == MyCharacterMovementEnum.Died)) { _lastDampenerState = character.EnabledDamping; } _isFlying = newState == MyCharacterMovementEnum.Flying; switch (oldState) { case MyCharacterMovementEnum.Ladder: case MyCharacterMovementEnum.LadderOut: case MyCharacterMovementEnum.LadderDown: case MyCharacterMovementEnum.LadderUp: switch (newState) { case MyCharacterMovementEnum.Ladder: case MyCharacterMovementEnum.LadderOut: case MyCharacterMovementEnum.LadderDown: case MyCharacterMovementEnum.LadderUp: break; default: var position = character.GetPosition(); var sphere = character.PositionComp.WorldVolume; var entities = MyAPIGateway.Entities.GetTopMostEntitiesInSphere(ref sphere).OfType <IMyCubeGrid>().ToList(); var cubeGrid = entities.OrderBy(x => Vector3.Distance(x.GetPosition(), position)).FirstOrDefault(); _workQueue.Enqueue(new Work(ToggleJetpackAndDampenersIfNeeded, new ThrusterWorkData(cubeGrid, leavedLadder: oldState == MyCharacterMovementEnum.LadderOut))); break; } break; case MyCharacterMovementEnum.Sitting: _workQueue.Enqueue(new Work(ToggleHelmetIfNeeded)); if (!Mod.Static.RemoveAutomaticJetpackActivation) { var cockpit = MyAPIGateway.Session.ControlledObject as IMyCockpit; if (cockpit == null) { return; } _workQueue.Enqueue(new Work(ToggleJetpackAndDampenersIfNeeded, new ThrusterWorkData(cockpit))); } break; } }
public void BroadcastFromPlayer(IMyCharacter character, IMyPlayer player, int channel, string message) { var antennas = GetValidReceivers(character.GetPosition(), 200); var excludeList = new HashSet <IMyTerminalBlock>(); foreach (var ant in antennas) { if ((Config.GetProperties(ant.EntityId).Channel != channel) || !ant.HasPlayerAccess(player.PlayerID)) { continue; } BroadcastRecursive(ant, message, int.MaxValue, excludeList); } }
/// <summary> /// Check oxygen available around given character. /// </summary> /// <param name="character">Character used to check oxygen level around him.</param> /// <returns>Return the oxygen level around the given character.</returns> private static float GetOxygenLevel(IMyCharacter character) { float oxygen; if (!MyAPIGateway.Session.SessionSettings.EnableOxygenPressurization) { var position = character.GetPosition(); oxygen = MyAPIGateway.Session.OxygenProviderSystem.GetOxygenInPoint(position); } else { oxygen = character.OxygenLevel; } return(oxygen); }
/// <summary> /// Checks if the ground is close by. /// </summary> /// <param name="character">The character used to check distance.</param> /// <param name="gravity">The gravity direction used to determine in which direction we check.</param> /// <returns>Return true if there is ground in 5m distance.</returns> private static bool IsGroundInRange(IMyCharacter character, Vector3 gravity) { var results = new List <IHitInfo>(); var position = character.WorldAABB.Center; var matrix = character.WorldMatrix; var from = Mod.Static.Network == null ? position : position + matrix.Forward * .5; var to = from + matrix.Down * 2; if (gravity.Length() > 0) { var offset = Vector3D.Distance(character.GetPosition(), from); var strength = gravity.Length() / GRAVITY; var length = (float)offset + 5 / (strength > 1 ? strength : 1); gravity.Normalize(); to = from + gravity * length; } MyAPIGateway.Physics.CastRay(from, to, results); return(results.Any()); }
public static int CalculatePlayerThreat(IMyCharacter character, Vector3D requesterPosition) { if (character.IsDead) { return(0); } float threat = 0; float distance = (float)Vector3D.Distance(requesterPosition, character.GetPosition()); threat += distance < 175 ? distance < 125 ? distance < 75 ? 5000 : 2500 : 1500 : 500; if (character.EquippedTool is IMyAngleGrinder) { threat *= 5; } IMyInventory myInventory = character.GetInventory(); List <MyInventoryItem> items = new List <MyInventoryItem>(); myInventory.GetItems(items); foreach (MyInventoryItem item in items) { if (item.Type == MyItemType.MakeTool("AngleGrinder4Item")) { threat += 1000; continue; } if (item.Type == MyItemType.MakeTool("AngleGrinder3Item")) { threat += 750; continue; } if (item.Type == MyItemType.MakeTool("AngleGrinder2Item")) { threat += 500; continue; } if (item.Type == MyItemType.MakeTool("AngleGrinderItem")) { threat += 250; continue; } if (item.Type == MyItemType.MakeTool("UltimateAutomaticRifleItem")) { threat += 100; continue; } if (item.Type == MyItemType.MakeTool("RapidFireAutomaticRifleItem")) { threat += 80; continue; } if (item.Type == MyItemType.MakeTool("PreciseAutomaticRifleItem")) { threat += 60; continue; } if (item.Type == MyItemType.MakeTool("AutomaticRifleItem")) { threat += 40; continue; } if (item.Type == MyItemType.MakeAmmo("NATO_5p56x45mm")) { threat += 20; continue; } } return((int)threat); }