Ejemplo n.º 1
0
        public EntitiesUpdate GetWorldUpdate(string playerId, double updateTime)
        {
            if (_toAdd.Any() || _toRemove.Any())
            {
                return(null);
            }

            var player = _entities[playerId];

            var visible = FindVisible(player).ToDictionary(e => e.Id);

            var prevVisible = _visible.GetOrAdd(playerId, id => new HashSet <string>());

            var removed    = prevVisible.Except(visible.Keys).ToList();
            var added      = visible.Keys.Except(prevVisible).ToList();
            var notChanged = visible.Keys.Intersect(prevVisible);

            if (removed.Any() || added.Any())
            {
                _visible[playerId] = new HashSet <string>(visible.Keys);
            }

            var updated = notChanged
                          .Select(id => _entities[id]).Where(e => e.Updated > updateTime)
                          .Concat(added.Select(id => _entities[id]))
                          .ToList();

            if (!updated.Any() && !removed.Any())
            {
                return(null);
            }

            var update = new EntitiesUpdate
            {
                Updated = updated,
                Removed = removed
            };

            return(update);
        }
Ejemplo n.º 2
0
 public void FireEntitiesUpdate()
 {
     EntitiesUpdate?.Invoke();
 }