static QuestSource CreateWarningSource(TrackedEntity player, TrackedEntity grid, long playerId, bool doesPunish) { // note: there's a chance that `player` or `grid` is null var playerName = player?.Name ?? grid?.OwnerName; var playerLag = player?.LagNormal ?? 0; var playerPin = doesPunish ? player?.PinRemainingTime ?? TimeSpan.Zero : TimeSpan.Zero; var gridLag = grid?.LagNormal ?? 0; var gridPin = doesPunish ? grid?.PinRemainingTime ?? TimeSpan.Zero : TimeSpan.Zero; var src = new QuestSource(playerId, playerName, playerLag, playerPin, grid?.Id ?? 0, gridLag, gridPin); return(src); }
public void Update(IReadOnlyList <EntitySource> sources) { // find valid entities var validSources = sources .Where(s => s.LagMspf.IsValid()) .ToDictionary(p => p.EntityId); if (validSources.Count < sources.Count) { Log.Warn("invalid ms/f value(s) found; maybe: server freezing"); } validSources.RemoveWhere((_, v) => _config.IsIdentityExempt(v.OwnerId)); // make a new tracker foreach (var(entityId, _) in validSources) { if (!_entities.ContainsKey(entityId)) { _entities[entityId] = new TrackedEntity(_config, entityId); } } // update existing trackers foreach (var(entityId, entity) in _entities) { if (validSources.TryGetValue(entityId, out var src)) { entity.Update(src); } else { entity.Update(null); } } if (Log.IsDebugEnabled) { var allTrackedEntities = _entities.ToArray(); // including pins if (!allTrackedEntities.Any()) { Log.Debug("tracking 0 entities"); } else { foreach (var(_, entity) in allTrackedEntities) { Log.Debug($"tracking: {entity}"); } } } }
static PunishSource CreatePunishmentSource(TrackedEntity grid, TrackedEntity player) { // note: there's a chance that `player` or `grid` is null var playerId = player?.Id ?? grid?.OwnerId ?? 0; // shouldn't be 0 tho var lagNormal = Math.Max(grid?.LagNormal ?? 0, player?.LagNormal ?? 0); var playerName = player?.Name ?? grid?.OwnerName; var factionTag = player?.FactionTag ?? grid?.FactionTag; var gridId = grid?.Id ?? 0; var gridName = grid?.Name ?? "<none>"; var isPinned = (grid?.IsPinned ?? false) || (player?.IsPinned ?? false); var source = new PunishSource(playerId, playerName, factionTag, gridId, gridName, lagNormal, isPinned); return(source); }
public static bool TryFindEntityByName(this IReadOnlyDictionary <long, TrackedEntity> self, string name, out TrackedEntity entity) { return(self.Values.TryGetFirst(e => e.Name == name, out entity)); }
public bool TryGetLaggiestGridOwnedBy(long ownerId, out TrackedEntity grid) { grid = default; return(_ownersToLaggiestGrids.TryGetValue(ownerId, out var gridId) && Entities.TryGetValue(gridId, out grid)); }
public bool TryGetLaggiestGridOwnedBy(long ownerId, out TrackedEntity grid) { return(_grids.TryGetLaggiestGridOwnedBy(ownerId, out grid)); }
public bool TryFindEntityByName(string name, out TrackedEntity entity) { return(_grids.Entities.TryFindEntityByName(name, out entity) || _players.Entities.TryFindEntityByName(name, out entity)); }
public bool TryGetEntity(long entityId, out TrackedEntity entity) { return(_grids.Entities.TryGetValue(entityId, out entity) || _players.Entities.TryGetValue(entityId, out entity)); }