public IList <IEntity> GetEntitiesUnderPosition(MapCoordinates coordinates) { // Find all the entities intersecting our click var entities = EntityManager.GetEntitiesIntersecting(coordinates.MapId, Box2.CenteredAround(coordinates.Position, (1, 1))); // Check the entities against whether or not we can click them var foundEntities = new List <(IEntity clicked, int drawDepth, uint renderOrder)>(); foreach (var entity in entities) { if (entity.TryGetComponent <ClickableComponent>(out var component) && entity.Transform.IsMapTransform && component.CheckClick(coordinates.Position, out var drawDepthClicked, out var renderOrder)) { foundEntities.Add((entity, drawDepthClicked, renderOrder)); } } if (foundEntities.Count == 0) { return(new List <IEntity>()); } foundEntities.Sort(new ClickableEntityComparer()); // 0 is the top element. foundEntities.Reverse(); return(foundEntities.Select(a => a.clicked).ToList()); }
private static IEntity GetEntityUnderPosition(IClientEntityManager entityMan, GridLocalCoordinates coordinates) { // Find all the entities intersecting our click var entities = entityMan.GetEntitiesIntersecting(coordinates.MapID, coordinates.Position); // Check the entities against whether or not we can click them var foundEntities = new List <(IEntity clicked, int drawDepth)>(); foreach (var entity in entities) { if (entity.TryGetComponent <IClientClickableComponent>(out var component) && entity.GetComponent <ITransformComponent>().IsMapTransform && component.CheckClick(coordinates, out var drawDepthClicked)) { foundEntities.Add((entity, drawDepthClicked)); } } if (foundEntities.Count == 0) { return(null); } foundEntities.Sort(new ClickableEntityComparer()); return(foundEntities[foundEntities.Count - 1].clicked); }
public IList <IEntity> GetEntitiesUnderPosition(GridCoordinates coordinates) { // Find all the entities intersecting our click var entities = _entityManager.GetEntitiesIntersecting(_mapManager.GetGrid(coordinates.GridID).ParentMapId, coordinates.ToWorld(_mapManager).Position); // Check the entities against whether or not we can click them var foundEntities = new List <(IEntity clicked, int drawDepth)>(); foreach (var entity in entities) { if (entity.TryGetComponent <IClientClickableComponent>(out var component) && entity.Transform.IsMapTransform && component.CheckClick(coordinates, out var drawDepthClicked)) { foundEntities.Add((entity, drawDepthClicked)); } } if (foundEntities.Count == 0) { return(new List <IEntity>()); } foundEntities.Sort(new ClickableEntityComparer()); // 0 is the top element. foundEntities.Reverse(); return(foundEntities.Select(a => a.clicked).ToList()); }
public override void MouseDown(MouseButtonEventArgs eventargs) { if (playerManager.LocalPlayer == null || placementManager.MouseDown(eventargs)) { return; } var map = playerManager.LocalPlayer.ControlledEntity.GetComponent <ITransformComponent>().MapID; var mousePosWorld = eyeManager.ScreenToWorld(new ScreenCoordinates(eventargs.Position, map)); // Find all the entities intersecting our click var entities = _entityManager.GetEntitiesIntersecting(mousePosWorld.MapID, mousePosWorld.Position); // Check the entities against whether or not we can click them var clickedEntities = new List <(IEntity clicked, int drawDepth)>(); foreach (IEntity entity in entities) { if (entity.TryGetComponent <IClientClickableComponent>(out var component) && entity.GetComponent <ITransformComponent>().IsMapTransform && component.CheckClick(mousePosWorld, out int drawdepthofclicked)) { clickedEntities.Add((entity, drawdepthofclicked)); } } IEntity entityToClick; if (clickedEntities.Any()) { entityToClick = (from cd in clickedEntities orderby cd.drawDepth ascending, cd.clicked.GetComponent <ITransformComponent>().LocalPosition .Y ascending select cd.clicked).Last(); } else { entityToClick = null; } //First possible exit point for click, acceptable due to being clientside if (entityToClick != null && placementManager.Eraser && placementManager.IsActive) { placementManager.HandleDeletion(entityToClick); return; } ClickType clicktype = eventargs.ClickType; //Dispatches clicks to relevant clickable components, another single exit point for UI if (entityToClick != null) { var clickable = entityToClick.GetComponent <IClientClickableComponent>(); switch (eventargs.ClickType) { case ClickType.Left: clickable.DispatchClick(playerManager.LocalPlayer.ControlledEntity, ClickType.Left); break; case ClickType.Right: clickable.DispatchClick(playerManager.LocalPlayer.ControlledEntity, ClickType.Right); break; /* * //Acceptable click exit due to being a UI behavior * case Mouse.Button.Middle: * OpenEntityEditWindow(entToClick); * return; */ } } //Assemble information to send to server about click if (clicktype != ClickType.None) { var UID = EntityUid.Invalid; if (entityToClick != null) { UID = entityToClick.Uid; } ClickEventMessage message = new ClickEventMessage(UID, clicktype, mousePosWorld); IoCManager.Resolve <IEntityNetworkManager>().SendSystemNetworkMessage(message); } }