static bool IsEnemyGrid(MyCubeGrid offenderGrid, DefenderGridInfo defender)
        {
            var offenderFactions =
                offenderGrid
                .BigOwners.Concat(offenderGrid.SmallOwners)
                .Select(i => MySession.Static.Factions.GetPlayerFaction(i))
                .Where(f => f != null)
                .ToSet();

            var defenderPlayerIds =
                defender
                .SteamIds
                .Select(s => MySession.Static.Players.TryGetIdentityId(s))
                .ToSet();

            foreach (var offenderFaction in offenderFactions)
            {
                foreach (var defenderPlayerId in defenderPlayerIds)
                {
                    if (!offenderFaction.Members.ContainsKey(defenderPlayerId) &&
                        !offenderFaction.IsFriendly(defenderPlayerId))
                    {
                        Log.Trace($"enemy: <{defenderPlayerId}> to [{offenderFaction.Tag}] \"{offenderFaction.Name}\"");
                        return(true);
                    }

                    Log.Trace($"friendly: <{defenderPlayerId}> to [{offenderFaction.Tag}] \"{offenderFaction.Name}\"");
                }
            }

            return(false);
        }
Exemple #2
0
        public IEnumerable <DefenderGridInfo> CollectDefenderGrids()
        {
            _steamIdExtractor.Update();

            var groups = MyCubeGridGroups.Static.Logical.Groups;

            foreach (var group in groups)
            {
                var grid = group.GroupData.Root;
                Log.Trace($"\"{grid.DisplayName}\"");

                if (!grid.IsStatic)
                {
                    continue;
                }
                Log.Trace("grid is static");

                var gridOwnerIds = grid.BigOwners;
                if (!gridOwnerIds.TryGetFirst(out var ownerId))
                {
                    continue;
                }
                Log.Trace("grid has owner");

                var steamIds = _steamIdExtractor.GetAlertableSteamIds(ownerId);
                if (!steamIds.Any())
                {
                    continue;
                }
                Log.Trace("owner is player");

                var faction     = MySession.Static.Factions.GetPlayerFaction(ownerId);
                var factionId   = faction?.FactionId ?? 0;
                var factionName = faction?.Name;
                var position    = grid.PositionComp.GetPosition();
                var gridInfo    = new DefenderGridInfo(grid.EntityId, grid.DisplayName, factionId, factionName, position, steamIds);
                Log.Trace($"defender: {gridInfo}");

                yield return(gridInfo);
            }
        }
        bool TryGetOffender(IMyEntity entity, DefenderGridInfo defender, out OffenderProximityInfo proximity)
        {
            proximity = default;

            if (!(entity is MyCubeGrid offenderGrid))
            {
                return(false);
            }
            if (offenderGrid.EntityId == defender.GridId)
            {
                return(false);
            }
            if (!offenderGrid.IsTopMostParent())
            {
                return(false);
            }
            if (!IsEnemyGrid(offenderGrid, defender))
            {
                return(false);
            }

            var position = offenderGrid.PositionComp.GetPosition();
            var distance = Vector3D.Distance(defender.Position, position);

            if (distance > _config.MaxProximity)
            {
                return(false);
            }

            var offenderInfo = MakeOffenderGridInfo(offenderGrid);

            proximity = new OffenderProximityInfo(defender, offenderInfo, distance);
            Log.Trace($"offender: {proximity}");

            return(true);
        }