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); }
public void FireEntitiesUpdate() { EntitiesUpdate?.Invoke(); }