Ejemplo n.º 1
0
        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));
        }
Ejemplo n.º 2
0
        /// <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;
            }
        }
Ejemplo n.º 3
0
        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);
            }
        }
Ejemplo n.º 4
0
        /// <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);
        }
Ejemplo n.º 5
0
        /// <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());
        }
Ejemplo n.º 6
0
        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);
        }