Пример #1
0
        /// <summary>
        ///     Try to find the closest entity from whitelist on a current map
        ///     Will return null if can't find anything
        /// </summary>
        private EntityUid?FindTargetFromComponent(EntityUid uid, Type whitelist, TransformComponent?transform = null)
        {
            var xformQuery = GetEntityQuery <TransformComponent>();

            if (transform == null)
            {
                xformQuery.TryGetComponent(uid, out transform);
            }

            if (transform == null)
            {
                return(null);
            }

            // sort all entities in distance increasing order
            var mapId    = transform.MapID;
            var l        = new SortedList <float, EntityUid>();
            var worldPos = _transform.GetWorldPosition(transform, xformQuery);

            foreach (var comp in EntityManager.GetAllComponents(whitelist))
            {
                if (!xformQuery.TryGetComponent(comp.Owner, out var compXform) ||
                    compXform.MapID != mapId)
                {
                    continue;
                }

                var dist = (_transform.GetWorldPosition(compXform, xformQuery) - worldPos).LengthSquared;
                l.TryAdd(dist, comp.Owner);
            }

            // return uid with a smallest distacne
            return(l.Count > 0 ? l.First().Value : null);
        }
    private Dictionary <EntityUid, HashSet <Vector2i> > GetChunksForViewers(
        HashSet <EntityUid> viewers,
        int chunkSize,
        ObjectPool <HashSet <Vector2i> > indexPool,
        ObjectPool <Dictionary <EntityUid, HashSet <Vector2i> > > viewerPool,
        float viewEnlargement,
        EntityQuery <TransformComponent> xformQuery)
    {
        Dictionary <EntityUid, HashSet <Vector2i> > chunks = viewerPool.Get();

        DebugTools.Assert(chunks.Count == 0);

        foreach (var viewerUid in viewers)
        {
            var xform  = xformQuery.GetComponent(viewerUid);
            var pos    = _transform.GetWorldPosition(xform, xformQuery);
            var bounds = _baseViewBounds.Translated(pos).Enlarged(viewEnlargement);

            foreach (var grid in _mapManager.FindGridsIntersecting(xform.MapID, bounds, true))
            {
                if (!chunks.TryGetValue(grid.GridEntityId, out var set))
                {
                    chunks[grid.GridEntityId] = set = indexPool.Get();
                    DebugTools.Assert(set.Count == 0);
                }

                var enumerator = new ChunkIndicesEnumerator(_transform.GetInvWorldMatrix(grid.GridEntityId, xformQuery).TransformBox(bounds), chunkSize);

                while (enumerator.MoveNext(out var indices))
                {
                    set.Add(indices.Value);
                }
            }
        }

        return(chunks);
    }