/// <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); }