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