예제 #1
0
        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);
        }
예제 #2
0
        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}");
                    }
                }
            }
        }
예제 #3
0
        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);
        }
예제 #4
0
 public static bool TryFindEntityByName(this IReadOnlyDictionary <long, TrackedEntity> self, string name, out TrackedEntity entity)
 {
     return(self.Values.TryGetFirst(e => e.Name == name, out entity));
 }
예제 #5
0
 public bool TryGetLaggiestGridOwnedBy(long ownerId, out TrackedEntity grid)
 {
     grid = default;
     return(_ownersToLaggiestGrids.TryGetValue(ownerId, out var gridId) &&
            Entities.TryGetValue(gridId, out grid));
 }
예제 #6
0
 public bool TryGetLaggiestGridOwnedBy(long ownerId, out TrackedEntity grid)
 {
     return(_grids.TryGetLaggiestGridOwnedBy(ownerId, out grid));
 }
예제 #7
0
 public bool TryFindEntityByName(string name, out TrackedEntity entity)
 {
     return(_grids.Entities.TryFindEntityByName(name, out entity) ||
            _players.Entities.TryFindEntityByName(name, out entity));
 }
예제 #8
0
 public bool TryGetEntity(long entityId, out TrackedEntity entity)
 {
     return(_grids.Entities.TryGetValue(entityId, out entity) ||
            _players.Entities.TryGetValue(entityId, out entity));
 }