Пример #1
0
        public static IEnumerable <uint> EnumerateForwardNetworkConnections(RailEntity Leaving, RailEntity Entering)
        {
            if (Leaving == null)
            {
                foreach (var neighbor in Entering.NeighborRails)
                {
                    yield return(neighbor.NeighborID);
                }
                yield break;
            }

            var connectionPoint = FindConnectionPoint(Leaving, Entering);

            if (connectionPoint != null)
            {
                if (Library.GetRailPiece(Entering.GetPiece().RailPiece).HasValue(out var enteringPiece))
                {
                    var transformToEntitySpace = Matrix.CreateRotationY((float)Math.PI * 0.5f * (float)Entering.GetPiece().Orientation) * Entering.GlobalTransform;
                    var backConnection         = FindConnectionPoint(Entering, Leaving);

                    var connection = FindConnectionFromTransformedEntrancePoint(enteringPiece, transformToEntitySpace,
                                                                                backConnection.Raised ? (connectionPoint.Position - Vector3.UnitY) : connectionPoint.Position);

                    if (connection != null)
                    {
                        foreach (var exit in connection.Exits)
                        {
                            var transformedExit = Vector3.Transform(exit, transformToEntitySpace);
                            foreach (var neighbor in Entering.NeighborRails)
                            {
                                if (neighbor.Raised)
                                {
                                    transformedExit += Vector3.UnitY;
                                }

                                if ((neighbor.Position - transformedExit).LengthSquared() < 0.01f)
                                {
                                    yield return(neighbor.NeighborID);
                                }
                            }
                        }
                    }
                }
            }
        }
Пример #2
0
        public static bool CanPlace(WorldManager World, RailEntity PreviewEntity)
        {
            // Todo: Make sure this uses BuildObjectTool.IsValidPlacement to enforce building rules.

            var junctionPiece  = PreviewEntity.GetPiece();
            var actualPosition = PreviewEntity.GetContainingVoxel();

            if (!actualPosition.IsValid)
            {
                return(false);
            }
            if (!actualPosition.IsEmpty)
            {
                return(false);
            }

            if (actualPosition.Coordinate.Y == 0)
            {
                return(false);                                  // ???
            }
            var voxelUnder = VoxelHelpers.GetVoxelBelow(actualPosition);

            if (voxelUnder.IsEmpty)
            {
                return(false);
            }
            var box = actualPosition.GetBoundingBox().Expand(-0.2f);

            foreach (var entity in World.EnumerateIntersectingObjects(box, CollisionType.Static))
            {
                if ((entity as GameComponent).IsDead)
                {
                    continue;
                }

                if (Object.ReferenceEquals(entity, PreviewEntity))
                {
                    continue;
                }
                if (Object.ReferenceEquals(entity.GetRoot(), PreviewEntity.GetRoot()))
                {
                    continue;
                }
                if (entity is GenericVoxelListener)
                {
                    continue;
                }
                if (entity is WorkPile)
                {
                    continue;
                }
                if (entity is Health)
                {
                    continue;
                }
                if (entity is CraftDetails)
                {
                    continue;
                }
                if (entity is SimpleSprite)
                {
                    continue;
                }

                if (FindPossibleCombination(junctionPiece, entity).HasValue(out var possibleCombination))
                {
                    var combinedPiece = new Rail.JunctionPiece
                    {
                        RailPiece   = possibleCombination.Result,
                        Orientation = Rail.OrientationHelper.Rotate((entity as RailEntity).GetPiece().Orientation, (int)possibleCombination.ResultRelativeOrientation),
                    };

                    PreviewEntity.UpdatePiece(combinedPiece, PreviewEntity.GetContainingVoxel());
                    return(true);
                }

                if (Debugger.Switches.DrawToolDebugInfo)
                {
                    Drawer3D.DrawBox(box, Color.Yellow, 0.2f, false);
                }

                World.UserInterface.ShowTooltip(String.Format("Can't place {0}. Entity in the way: {1}", junctionPiece.RailPiece, entity.ToString()));
                return(false);
            }

            return(true);
        }
Пример #3
0
        public static bool CanPlace(GameMaster Player, RailEntity PreviewEntity)
        {
            // Todo: Make sure this uses BuildObjectTool.IsValidPlacement to enforce building rules.

            var junctionPiece  = PreviewEntity.GetPiece();
            var actualPosition = PreviewEntity.GetContainingVoxel();

            if (!actualPosition.IsValid)
            {
                return(false);
            }
            if (!actualPosition.IsEmpty)
            {
                return(false);
            }

            if (actualPosition.Coordinate.Y == 0)
            {
                return(false);                                  // ???
            }
            var local      = actualPosition.Coordinate.GetLocalVoxelCoordinate();
            var voxelUnder = new VoxelHandle(actualPosition.Chunk, new LocalVoxelCoordinate(local.X, local.Y - 1, local.Z));

            if (voxelUnder.IsEmpty)
            {
                return(false);
            }

            foreach (var entity in Player.World.EnumerateIntersectingObjects(actualPosition.GetBoundingBox().Expand(-0.2f), CollisionType.Static))
            {
                if ((entity as GameComponent).IsDead)
                {
                    continue;
                }

                if (Object.ReferenceEquals(entity, PreviewEntity))
                {
                    continue;
                }
                if (entity is GenericVoxelListener)
                {
                    continue;
                }
                if (entity is WorkPile)
                {
                    continue;
                }

                var possibleCombination = FindPossibleCombination(junctionPiece, entity);
                if (possibleCombination != null)
                {
                    var combinedPiece = new Rail.JunctionPiece
                    {
                        RailPiece   = possibleCombination.Result,
                        Orientation = Rail.OrientationHelper.Rotate((entity as RailEntity).GetPiece().Orientation, (int)possibleCombination.ResultRelativeOrientation),
                    };

                    PreviewEntity.UpdatePiece(combinedPiece, PreviewEntity.GetContainingVoxel());
                    return(true);
                }

                if (Debugger.Switches.DrawBoundingBoxes)
                {
                    Drawer3D.DrawBox(entity.GetBoundingBox(), Color.Yellow, 0.1f, false);
                    Player.World.ShowTooltip(String.Format("Can't place {0}. Entity in the way: {1}", junctionPiece.RailPiece, entity.ToString()));
                }

                return(false);
            }

            return(true);
        }