private bool CheckRangeAndSetFacing(EntityCoordinates target, IEntity player)
        {
            // ensure it's within their clickable range
            var targetWorldPos = target.ToMapPos(EntityManager);
            var rangeBox       = new Box2(player.Transform.WorldPosition, player.Transform.WorldPosition)
                                 .Enlarged(_entityManager.MaxUpdateRange);

            if (!rangeBox.Contains(targetWorldPos))
            {
                Logger.DebugS("action", "user {0} attempted to" +
                              " perform target action further than allowed range",
                              player.Name);
                return(false);
            }

            if (!ActionBlockerSystem.CanChangeDirection(player))
            {
                return(true);
            }

            // don't set facing unless they clicked far enough away
            var diff = targetWorldPos - player.Transform.WorldPosition;

            if (diff.LengthSquared > 0.01f)
            {
                player.Transform.LocalRotation = new Angle(diff);
            }

            return(true);
        }
        public bool AnyEntitiesIntersecting(MapId mapId, Box2 box)
        {
            foreach (var entity in GetEntities())
            {
                var transform = entity.Transform;
                if (transform.MapID != mapId)
                {
                    continue;
                }

                if (entity.TryGetComponent <BoundingBoxComponent>(out var component))
                {
                    if (box.Intersects(component.WorldAABB))
                    {
                        return(true);
                    }
                }
                else
                {
                    if (box.Contains(transform.WorldPosition))
                    {
                        return(true);
                    }
                }
            }

            return(false);
        }
Esempio n. 3
0
        private void DrawJpsNodes(DrawingHandleScreen screenHandle, Box2 viewport)
        {
            foreach (var route in JpsRoutes)
            {
                foreach (var tile in route.JumpNodes)
                {
                    if ((route.Route.Contains(tile) && (Modes & PathfindingDebugMode.Route) != 0) ||
                        !viewport.Contains(tile))
                    {
                        continue;
                    }

                    var screenTile = _eyeManager.WorldToScreen(tile);
                    var box        = new UIBox2(
                        screenTile.X - 15.0f,
                        screenTile.Y - 15.0f,
                        screenTile.X + 15.0f,
                        screenTile.Y + 15.0f);

                    screenHandle.DrawRect(box, new Color(
                                              0.0f,
                                              1.0f,
                                              0.0f,
                                              0.2f));
                }
            }
        }
Esempio n. 4
0
        private void DrawAStarNodes(DrawingHandleScreen screenHandle, Box2 viewport)
        {
            foreach (var route in AStarRoutes)
            {
                var highestgScore = route.GScores.Values.Max();

                foreach (var(tile, score) in route.GScores)
                {
                    if ((route.Route.Contains(tile) && (Modes & PathfindingDebugMode.Route) != 0) ||
                        !viewport.Contains(tile))
                    {
                        continue;
                    }

                    var screenTile = _eyeManager.WorldToScreen(tile);
                    var box        = new UIBox2(
                        screenTile.X - 15.0f,
                        screenTile.Y - 15.0f,
                        screenTile.X + 15.0f,
                        screenTile.Y + 15.0f);

                    screenHandle.DrawRect(box, new Color(
                                              0.0f,
                                              score / highestgScore,
                                              1.0f - (score / highestgScore),
                                              0.1f));
                }
            }
        }
Esempio n. 5
0
        public bool CheckClickScreen(Vector2 screenPos, Vector2 mousePos)
        {
            if (!IsVisible(checkWorld: false))
            {
                return(false);
            }
            if (Icon.Appearance.MouseOpacity == MouseOpacity.Transparent)
            {
                return(false);
            }

            Vector2 size    = Icon.DMI.IconSize / (float)EyeManager.PixelsPerMeter * (ScreenLocation.RepeatX, ScreenLocation.RepeatY);
            Box2    iconBox = Box2.FromDimensions(screenPos, size);

            if (!iconBox.Contains(mousePos))
            {
                return(false);
            }

            switch (Icon.Appearance.MouseOpacity)
            {
            case MouseOpacity.Opaque: return(true);

            case MouseOpacity.PixelOpaque: return(Icon.CheckClickScreen(screenPos, mousePos));

            default: throw new InvalidOperationException("Invalid mouse_opacity");
            }
        }
        public IEnumerable <IEntity> GetEntitiesIntersecting(MapId mapId, Box2 position)
        {
            foreach (var entity in GetEntities())
            {
                var transform = entity.Transform;
                if (transform.MapID != mapId)
                {
                    continue;
                }

                if (entity.TryGetComponent <BoundingBoxComponent>(out var component))
                {
                    if (position.Intersects(component.WorldAABB))
                    {
                        yield return(entity);
                    }
                }
                else
                {
                    if (position.Contains(transform.WorldPosition))
                    {
                        yield return(entity);
                    }
                }
            }
        }
Esempio n. 7
0
        private void DrawRegions(DrawingHandleScreen screenHandle, Box2 viewport)
        {
            var attachedEntity = _playerManager.LocalPlayer?.ControlledEntity;

            if (attachedEntity == null || !Regions.TryGetValue(attachedEntity.Transform.GridID, out var entityRegions))
            {
                return;
            }

            foreach (var(chunk, regions) in entityRegions)
            {
                foreach (var(region, nodes) in regions)
                {
                    foreach (var tile in nodes)
                    {
                        if (!viewport.Contains(tile))
                        {
                            continue;
                        }

                        var screenTile = _eyeManager.WorldToScreen(tile);
                        var box        = new UIBox2(
                            screenTile.X - 15.0f,
                            screenTile.Y - 15.0f,
                            screenTile.X + 15.0f,
                            screenTile.Y + 15.0f);

                        screenHandle.DrawRect(box, _regionColors[attachedEntity.Transform.GridID][chunk][region]);
                    }
                }
            }
        }
        private void RunUpdatesRecurse(float frameTime, Box2 bounds, IEntity entity, ref Matrix3 parentMatrix)
        {
            var localMatrix = entity.Transform.GetLocalMatrix();

            Matrix3.Multiply(ref localMatrix, ref parentMatrix, out var matrix);

            foreach (var childUid in entity.Transform.ChildEntityUids)
            {
                var child = EntityManager.GetEntity(childUid);
                if (child.TryGetComponent(out ISpriteComponent sprite))
                {
                    var worldPosition = Matrix3.Transform(matrix, child.Transform.LocalPosition);

                    if (!sprite.IsInert && bounds.Contains(worldPosition))
                    {
                        sprite.FrameUpdate(frameTime);
                    }
                }

                if (child.Transform.ChildCount != 0)
                {
                    RunUpdatesRecurse(frameTime, bounds, child, ref matrix);
                }
            }
        }
Esempio n. 9
0
        private void CheckIfClicked(Vector2 mousePos, UIElement element)
        {
            Box2 bounds = element.GetBounds();

            if (bounds.Contains(mousePos))
            {
                element.action.Execute();
            }
        }
Esempio n. 10
0
 public bool Contains(Vector2 point)
 {
     if (!_boundingBox.Contains(point))
     {
         return(false);
     }
     else
     {
         return(Contours.Select(c => c.WindingNumber(point)).Sum() > 0);
     }
 }
Esempio n. 11
0
            public bool IsVisible(int width, int height, OsbOrigin origin, Box2 bounds)
            {
                if (Opacity <= 0)
                {
                    return(false);
                }

                if (Scale.X == 0 || Scale.Y == 0)
                {
                    return(false);
                }

                if (Additive && Color.R == 0 && Color.G == 0 && Color.B == 0)
                {
                    return(false);
                }

                if (!bounds.Contains(Position))
                {
                    var     w = width * Scale.X;
                    var     h = height * Scale.Y;
                    Vector2 originVector;
                    switch (origin)
                    {
                    default:
                    case OsbOrigin.TopLeft: originVector = Vector2.Zero; break;

                    case OsbOrigin.TopCentre: originVector = new Vector2(w * 0.5f, 0); break;

                    case OsbOrigin.TopRight: originVector = new Vector2(w, 0); break;

                    case OsbOrigin.CentreLeft: originVector = new Vector2(0, h * 0.5f); break;

                    case OsbOrigin.Centre: originVector = new Vector2(w * 0.5f, h * 0.5f); break;

                    case OsbOrigin.CentreRight: originVector = new Vector2(w, h * 0.5f); break;

                    case OsbOrigin.BottomLeft: originVector = new Vector2(0, h); break;

                    case OsbOrigin.BottomCentre: originVector = new Vector2(w * 0.5f, h); break;

                    case OsbOrigin.BottomRight: originVector = new Vector2(w, h); break;
                    }
                    var obb = new OrientedBoundingBox(Position, originVector, w, h, Rotation);
                    if (!obb.Intersects(bounds))
                    {
                        return(false);
                    }
                }

                return(true);
            }
Esempio n. 12
0
        public Cell GetCellAt(Vector2 position)
        {
            if (!Bounds.Contains(position))
            {
                return(null);
            }

            foreach (var cell in Cells)
            {
                if (cell.Contains(position))
                {
                    return(cell);
                }
            }

            return(null);
        }
Esempio n. 13
0
        private void OnDrawGizmos()
        {
            Vector2 point = Point.position;
            Box2    box   = CreateBox2(Box);

            bool cont = box.Contains(point);

            FiguresColor();
            DrawBox(ref box);
            if (cont)
            {
                ResultsColor();
            }
            DrawPoint(point);

            LogInfo(cont);
        }
Esempio n. 14
0
        private bool CheckRangeAndSetFacing(EntityCoordinates target, EntityUid player)
        {
            // ensure it's within their clickable range
            var targetWorldPos = target.ToMapPos(EntityManager);
            var rangeBox       = new Box2(_entities.GetComponent <TransformComponent>(player).WorldPosition, _entities.GetComponent <TransformComponent>(player).WorldPosition)
                                 .Enlarged(MaxUpdateRange);

            if (!rangeBox.Contains(targetWorldPos))
            {
                Logger.DebugS("action", "user {0} attempted to" +
                              " perform target action further than allowed range",
                              _entities.GetComponent <MetaDataComponent>(player).EntityName);
                return(false);
            }

            EntitySystem.Get <RotateToFaceSystem>().TryFaceCoordinates(player, targetWorldPos);
            return(true);
        }
Esempio n. 15
0
 public IEnumerable <IEntity> GetEntitiesIntersecting(Box2 position)
 {
     foreach (var entity in GetEntities())
     {
         if (entity.TryGetComponent <BoundingBoxComponent>(out var component))
         {
             if (position.Intersects(component.WorldAABB))
             {
                 yield return(entity);
             }
         }
         else
         {
             var transform = entity.GetComponent <ITransformComponent>();
             if (position.Contains(transform.Position))
             {
                 yield return(entity);
             }
         }
     }
 }
 public bool AnyEntitiesIntersecting(Box2 position)
 {
     foreach (var entity in GetEntities())
     {
         if (entity.TryGetComponent <BoundingBoxComponent>(out var component))
         {
             if (position.Intersects(component.WorldAABB))
             {
                 return(true);
             }
         }
         else
         {
             var transform = entity.GetComponent <ITransformComponent>();
             if (position.Contains(transform.WorldPosition))
             {
                 return(true);
             }
         }
     }
     return(false);
 }
Esempio n. 17
0
 private void DrawJpsRoutes(DrawingHandleScreen screenHandle, Box2 viewport)
 {
     foreach (var route in JpsRoutes)
     {
         // Draw box on each tile of route
         foreach (var position in route.Route)
         {
             if (!viewport.Contains(position))
             {
                 continue;
             }
             var screenTile = _eyeManager.WorldToScreen(position);
             // worldHandle.DrawLine(position, nextWorld.Value, Color.Blue);
             var box = new UIBox2(
                 screenTile.X - 15.0f,
                 screenTile.Y - 15.0f,
                 screenTile.X + 15.0f,
                 screenTile.Y + 15.0f);
             screenHandle.DrawRect(box, Color.Orange.WithAlpha(0.25f));
         }
     }
 }
Esempio n. 18
0
        private void DrawGraph(DrawingHandleScreen screenHandle, Box2 viewport)
        {
            foreach (var(chunk, nodes) in Graph)
            {
                foreach (var tile in nodes)
                {
                    if (!viewport.Contains(tile))
                    {
                        continue;
                    }

                    var screenTile = _eyeManager.WorldToScreen(tile);
                    var box        = new UIBox2(
                        screenTile.X - 15.0f,
                        screenTile.Y - 15.0f,
                        screenTile.X + 15.0f,
                        screenTile.Y + 15.0f);

                    screenHandle.DrawRect(box, _graphColors[chunk]);
                }
            }
        }
Esempio n. 19
0
 /// <summary>
 /// Checks if the position is in the box.
 /// </summary>
 /// <param name="box">The box</param>
 /// <param name="pos">The position</param>
 /// <returns>True if pos is in box.</returns>
 public static bool Contains(this Box2 box, Vector2 pos)
 {
     return(box.Contains(pos.X, pos.Y));
 }
        public bool MoveNext([NotNullWhen(true)] out IMapGrid?grid)
        {
            while (true)
            {
                if (!_enumerator.MoveNext())
                {
                    grid = null;
                    return(false);
                }

                var(_, nextGrid) = _enumerator.Current;

                if (nextGrid.ParentMapId != _mapId)
                {
                    continue;
                }

                var xformComp  = _entityManager.GetComponent <TransformComponent>(nextGrid.GridEntityId);
                var invMatrix3 = xformComp.InvWorldMatrix;
                var localAABB  = invMatrix3.TransformBox(_worldAABB);

                if (!localAABB.Intersects(nextGrid.LocalBounds))
                {
                    continue;
                }

                var intersects = false;

                if (_entityManager.HasComponent <PhysicsComponent>(nextGrid.GridEntityId))
                {
                    nextGrid.GetLocalMapChunks(localAABB, out var enumerator);

                    if (!_approx)
                    {
                        var(worldPos, worldRot) = xformComp.GetWorldPositionRotation();

                        var transform = new Transform(worldPos, worldRot);

                        while (!intersects && enumerator.MoveNext(out var chunk))
                        {
                            foreach (var fixture in chunk.Fixtures)
                            {
                                for (var i = 0; i < fixture.Shape.ChildCount; i++)
                                {
                                    if (!fixture.Shape.ComputeAABB(transform, i).Intersects(_worldAABB))
                                    {
                                        continue;
                                    }

                                    intersects = true;
                                    break;
                                }

                                if (intersects)
                                {
                                    break;
                                }
                            }
                        }
                    }
                    else
                    {
                        intersects = enumerator.MoveNext(out _);
                    }
                }

                if (!intersects && nextGrid.ChunkCount == 0 && !_worldAABB.Contains(xformComp.WorldPosition))
                {
                    continue;
                }

                grid = nextGrid;
                return(true);
            }
        }