示例#1
0
        public List <Entity> GetRange(VectorRangeI range, Vector3I top)
        {
            var output = new List <Entity>();
            var cube   = new VectorCubeI(range.Start, top);

            for (var y = cube.Y.Start - 1; y <= cube.Y.End; y++)
            {
                for (var x = cube.X.Start; x <= cube.X.End; x++)
                {
                    for (var z = cube.Z.Start; z <= cube.Z.End; z++)
                    {
                        var render = z == cube.Z.Start || z == cube.Z.End ||
                                     x == cube.X.Start || x == cube.X.Start - 1 || x == cube.X.End || x == cube.X.End - 1;

                        if (render)
                        {
                            var entity = new Entity(CoreHook.Universe.AllocateNewEntityId(), false, ParticleHostEntityBuilder.KindCode, true);
                            entity.Physics.ForcedPosition(new Vector3D(x, y, z));
                            ((ParticleHostEntityLogic)entity.Logic).SetParticleCode(range.ParticleCode);
                            ((ParticleHostEntityLogic)entity.Logic).SetLocation(new Vector3D(x, y, z));
                            output.Add(entity);
                        }
                    }
                }
            }

            return(output);
        }
        internal static bool Wall(Entity entity, int width, int height, out long tileCount, string tile = "staxel.tile.dirt.dirt")
        {
            var parseWidth  = width <= 0 ? 0 : width;
            var parseHeight = height <= 0 ? 0 : height;

            tileCount = 0;

            if (!TileShortCodes.IsValidTile(tile))
            {
                return(false);
            }

            var newTile = TileShortCodes.GetTile(tile);

            var facing = entity.PlayerEntityLogic.Heading().GetDirection();

            Vector3I center;
            Vector3I start;
            Vector3I end;

            var position = entity.Physics.BottomPosition().From3Dto3I();

            if (facing == Compass.NORTH || facing == Compass.SOUTH)
            {
                center = facing == Compass.NORTH ? new Vector3I(position.X, position.Y, position.Z - 1) : new Vector3I(position.X, position.Y, position.Z + 1);
            }
            else
            {
                center = facing == Compass.EAST ? new Vector3I(position.X + 1, position.Y, position.Z) : new Vector3I(position.X - 1, position.Y, position.Z);
            }

            var div = (float)parseWidth / 2;

            var side1 = (int)Math.Floor(div);
            var side2 = (int)Math.Floor(div);

            if (facing == Compass.NORTH || facing == Compass.SOUTH)
            {
                start = new Vector3I(center.X - side1, center.Y, center.Z);
                end   = new Vector3I(center.X + side2, center.Y + parseHeight, center.Z);
            }
            else
            {
                start = new Vector3I(center.X, center.Y, center.Z - side1);
                end   = new Vector3I(center.X, center.Y + parseHeight, center.Z + side2);
            }

            var vc = new VectorCubeI(start, end);

            SaveUndo(entity, vc.Start, vc.End, true, tile);


            var count = 0;

            var list = new List <RenderItem>();

            tileCount = count;

            return(true);
        }
        internal static void Replace(Entity entity, string newKindCode, string oldKindCode, out long replacedTiles, out ReplaceResult result)
        {
            replacedTiles = 0;
            result        = ReplaceResult.Success;

            EntityCheck(entity);

            var target = PositionClone()[entity];

            if (target.Pos1 == default(Vector3D) || target.Pos2 == default(Vector3D))
            {
                result = ReplaceResult.InvalidPositions;
                return;
            }

            var newTileConfig = GameContext.TileDatabase.AllMaterials().FirstOrDefault(x =>
                                                                                       string.Equals(x.Code, newKindCode, StringComparison.CurrentCultureIgnoreCase));

            if (newTileConfig == null)
            {
                result = ReplaceResult.InvalidTile;
                return;
            }

            var newTile = newTileConfig.MakeTile();

            var vc = new VectorCubeI(target.Pos1.From3Dto3I(), target.Pos2.From3Dto3I());

            SaveUndo(entity, vc.Start, vc.End, true, newKindCode);

            var count = 0;

            replacedTiles = count;
        }
        internal static long Copy(Entity entity)
        {
            EntityCheck(entity);
            var target = PositionClone()[entity];

            if (target.Pos1 == default(Vector3D) || target.Pos2 == default(Vector3D))
            {
                return(0);
            }

            var region = new VectorCubeI(target.Pos1.From3Dto3I(), target.Pos2.From3Dto3I());

            target.ClipBoard.Clear();

            Helpers.VectorLoop(target.Pos1.From3Dto3I(), target.Pos2.From3Dto3I(), (x, y, z) => {
                Tile tile;
                if (FoxCore.WorldManager.Universe.World.ReadTile(new Vector3I(x, y, z), TileAccessFlags.SynchronousWait,
                                                                 out tile))
                {
                    target.ClipBoard.Add(new Vector3I(x - region.Start.X, y - region.Start.Y, z - region.Start.Z), tile);
                }
            });

            target.ClipBoardOffset = new Vector3D(region.Start.X - entity.Physics.Position.X,
                                                  region.Start.Y - entity.Physics.Position.Y, region.Start.Z - entity.Physics.Position.Z);

            return(region.GetTileCount());
        }
        public void SetRegion(VectorCubeI region)
        {
            Region = region;

            if (Entity.Physics.Position != region.Start.ToVector3D())
            {
                SetDestination(region.Start);
            }
        }
示例#6
0
 public static void VectorLoop(VectorCubeI region, Action <int, int, int> coordFunction)
 {
     for (var y = region.Start.Y; y <= region.End.Y; y++)
     {
         for (var z = region.Start.Z; z <= region.End.Z; z++)
         {
             for (var x = region.Start.X; x <= region.End.X; x++)
             {
                 coordFunction(x, y, z);
             }
         }
     }
 }
        internal static void Export(Entity entity, string schematic)
        {
            EntityCheck(entity);

            var target = PositionClone()[entity];

            var cube  = new VectorCubeI(target.Pos1.From3Dto3I(), target.Pos2.From3Dto3I());
            var cube0 = Vector3I.Min(new Vector3I(cube.Start.X, cube.Start.Y, cube.Start.Z), new Vector3I(cube.End.X, cube.End.Y, cube.End.Z));
            var cube1 = Vector3I.Max(new Vector3I(cube.Start.X, cube.Start.Y, cube.Start.Z),
                                     new Vector3I(cube.End.X, cube.End.Y, cube.End.Z)) - cube0 + Vector3I.One;

            FoxCore.SaveDirectory.FetchDirectory("Exports").ExportCube(cube1, cube0, schematic);
        }
        internal static bool Platform(Entity entity, int size, out long tileCount, string tile = "staxel.tile.dirt.dirt")
        {
            var parseSize = size <= 0 ? 0 : size;

            tileCount = 0;

            if (!TileShortCodes.IsValidTile(tile))
            {
                return(false);
            }

            var newTile = TileShortCodes.GetTile(tile);

            var current = entity.Physics.BottomPosition().From3Dto3I();

            var start = new Vector3I(current.X - parseSize, current.Y - 1, current.Z - parseSize);
            var end   = new Vector3I(current.X + parseSize, current.Y - 1, current.Z + parseSize);

            var count = 0;

            var vc = new VectorCubeI(start, end);

            SaveUndo(entity, vc.Start, vc.End, true, tile);

            Helpers.VectorLoop(start, end, (x, y, z) => {
                Tile currentTile;
                if (FoxCore.WorldManager.World.ReadTile(new Vector3I(x, y, z), TileAccessFlags.SynchronousWait,
                                                        out currentTile))
                {
                    if (string.Equals(currentTile.Configuration.Code, "staxel.tile.Sky",
                                      StringComparison.CurrentCultureIgnoreCase))
                    {
                        if (FoxCore.WorldManager.World.PlaceTile(new Vector3I(x, y, z), newTile,
                                                                 TileAccessFlags.SynchronousWait))
                        {
                            count++;
                        }
                    }
                }
            });

            tileCount = count;

            return(true);
        }
        internal static long Paste(Entity entity, bool vectorOverride = false, Vector3I vectorO = default(Vector3I))
        {
            EntityCheck(entity);

            var target = PositionClone()[entity];

            if (target.ClipBoard.Any())
            {
                var entityVector = entity.Physics.BottomPosition().From3Dto3I();

                if (vectorOverride)
                {
                    entityVector = vectorO;
                }

                var clipboardVector = target.ClipBoardOffset.From3Dto3I();

                var first = target.ClipBoard.First();
                var last  = target.ClipBoard.Last();

                var min = new Vector3I(first.Key.X + clipboardVector.X + entityVector.X,
                                       first.Key.Y + clipboardVector.Y + entityVector.Y,
                                       first.Key.Z + clipboardVector.Z + entityVector.Z);
                var max = new Vector3I(last.Key.X + clipboardVector.X + entityVector.X,
                                       last.Key.Y + clipboardVector.Y + entityVector.Y,
                                       last.Key.Z + clipboardVector.Z + entityVector.Z);

                var vc = new VectorCubeI(min, max);

                SaveUndo(entity, vc.Start, vc.End);


                return(target.ClipBoard.Count);
            }

            return(0);
        }
        internal static void Stack(Entity entity, int repeat, string direction = "forwards")
        {
            EntityCheck(entity);

            var target = PositionClone()[entity];

            if (target.Pos1 == default(Vector3D) || target.Pos2 == default(Vector3D))
            {
                return;
            }

            var targetcube = new VectorCubeI(target.Pos1.From3Dto3I(), target.Pos2.From3Dto3I());

            var facing = entity.Logic.Heading().GetDirection();

            switch (direction.ToLower())
            {
            case "forwards":
                break;

            case "left":
                if (facing == Compass.EAST)
                {
                    facing = Compass.NORTH;
                }
                else if (facing == Compass.NORTH)
                {
                    facing = Compass.WEST;
                }
                else if (facing == Compass.WEST)
                {
                    facing = Compass.SOUTH;
                }
                else if (facing == Compass.SOUTH)
                {
                    facing = Compass.EAST;
                }

                break;

            case "right":
                if (facing == Compass.EAST)
                {
                    facing = Compass.SOUTH;
                }
                else if (facing == Compass.SOUTH)
                {
                    facing = Compass.WEST;
                }
                else if (facing == Compass.WEST)
                {
                    facing = Compass.NORTH;
                }
                else if (facing == Compass.NORTH)
                {
                    facing = Compass.EAST;
                }

                break;

            case "backwards":
                if (facing == Compass.EAST)
                {
                    facing = Compass.WEST;
                }
                else if (facing == Compass.WEST)
                {
                    facing = Compass.EAST;
                }
                else if (facing == Compass.NORTH)
                {
                    facing = Compass.SOUTH;
                }
                else if (facing == Compass.SOUTH)
                {
                    facing = Compass.NORTH;
                }

                break;

            case "up":
                facing = Compass.UP;
                break;

            case "down":
                facing = Compass.DOWN;
                break;

            default:
                return;
            }

            var oldClipboard = target.ClipBoard;

            Copy(entity);

            var cube = new VectorCubeI(target.ClipBoard.Keys.First(), target.ClipBoard.Keys.Last());

            var oldOffset = target.ClipBoardOffset;

            var x = cube.End.X - cube.Start.X;
            var y = cube.End.Y - cube.Start.Y;
            var z = cube.End.Z - cube.Start.Z;

            for (var i = 1; i <= repeat; i++)
            {
                if (facing == Compass.NORTH)
                {
                    target.ClipBoardOffset = new Vector3D(0, 0, -z * i);
                }
                else if (facing == Compass.EAST)
                {
                    target.ClipBoardOffset = new Vector3D(x * i, 0, 0);
                }
                else if (facing == Compass.SOUTH)
                {
                    target.ClipBoardOffset = new Vector3D(0, 0, z * i);
                }
                else if (facing == Compass.WEST)
                {
                    target.ClipBoardOffset = new Vector3D(-x * i, 0, 0);
                }
                else if (facing == Compass.UP)
                {
                    target.ClipBoardOffset = new Vector3D(0, y * i, 0);
                }
                else if (facing == Compass.DOWN)
                {
                    target.ClipBoardOffset = new Vector3D(0, -y * i, 0);
                }

                Paste(entity, true, targetcube.Start);
            }

            target.ClipBoardOffset = oldOffset;
            target.ClipBoard       = oldClipboard;
        }
示例#11
0
        //internal void RenderRegions() {
        //    foreach (var toRender in CloneRegions().Where(x => !x.Value.Rendered || x.Value.Remove)) {
        //        foreach (var item in toRender.Value.Info.Where(x => !x.Rendered || (toRender.Value.Remove && !x.Removed)).Take(25)) {
        //            if (!item.Rendered) {
        //                toRender.Value.Rendered =
        //                    WorldEditManager.FoxCore.WorldManager.World.PlaceTile(item.Location, item.Tile,
        //                        TileAccessFlags.None);
        //            } else {
        //                if (toRender.Value.Remove) {
        //                    if (WorldEditManager.FoxCore.WorldManager.World.PlaceTile(item.Location,
        //                        TileShortCodes.GetTile("staxel.tile.Sky"), TileAccessFlags.SynchronousWait)) {
        //                        item.Removed = true;
        //                    }
        //                }
        //            }
        //        }

        //        if (!toRender.Value.Info.Any(x => !x.Rendered)) {
        //            toRender.Value.Rendered = true;
        //        }

        //        if (!toRender.Value.Info.Any(x => !x.Removed)) {
        //            Regions.Remove(toRender.Key);
        //        }
        //    }
        //}

        internal Guid AddCube(Vector3I start, Vector3I end, FrameTiles tiles)
        {
            var guid = Guid.NewGuid();

            var cube = new VectorCubeI(start, end).GetOuterRegions();

            Helpers.VectorLoop(cube.Start, cube.End, (x, y, z) => {
                var renderCount = 0;

                renderCount += y == cube.Start.Y || y == cube.End.Y ? 1 : 0;

                renderCount += z == cube.Start.Z || z == cube.End.Z ? 1 : 0;

                renderCount += x == cube.Start.X || x == cube.End.X ? 1 : 0;

                if (renderCount > 1)
                {
                    Tile tile;
                    var current = new Vector3I(x, y, z);
                    loop:
                    if (WorldEditManager.FoxCore.WorldManager.Universe.ReadTile(current, TileAccessFlags.SynchronousWait, out tile))
                    {
                        if (tile.Configuration.Code.ToLower() == "staxel.tile.sky")
                        {
                            Tile?cT = null;

                            if ((x == cube.Start.X || x == cube.End.X) && (z == cube.Start.Z || z == cube.End.Z))
                            {
                                cT = tiles.Line.Y;
                            }

                            if (z == cube.Start.Z || z == cube.End.Z)
                            {
                                if (cT == null)
                                {
                                    cT = tiles.Line.Z;
                                }
                                else
                                {
                                    if (z == cube.Start.Z)
                                    {
                                        if (y == cube.Start.Y)
                                        {
                                            cT = tiles.L.Up.Z;
                                        }
                                        else if (y == cube.End.Y)
                                        {
                                            cT = tiles.L.Down.Z;
                                        }
                                    }
                                    else if (z == cube.End.Z)
                                    {
                                        if (y == cube.Start.Y)
                                        {
                                            cT = tiles.L.Up.NZ;
                                        }
                                        else if (y == cube.End.Y)
                                        {
                                            cT = tiles.L.Down.NZ;
                                        }
                                    }
                                }
                            }

                            if (x == cube.Start.X || x == cube.End.X)
                            {
                                if (cT == null)
                                {
                                    cT = tiles.Line.X;
                                }
                                else
                                {
                                    if (x == cube.Start.X)
                                    {
                                        if (cT == tiles.Line.Y)
                                        {
                                            if (y == cube.Start.Y)
                                            {
                                                cT = tiles.L.Up.X;
                                            }
                                            else if (y == cube.End.Y)
                                            {
                                                cT = tiles.L.Down.X;
                                            }
                                        }
                                        else if (cT == tiles.Line.Z)
                                        {
                                            if (z == cube.Start.Z)
                                            {
                                                cT = tiles.L.Side.NE;
                                            }
                                            else if (z == cube.End.Z)
                                            {
                                                cT = tiles.L.Side.SW;
                                            }
                                        }
                                        else if (cT == tiles.L.Up.Z)
                                        {
                                            cT = tiles.Corner.Up.NE;
                                        }
                                        else if (cT == tiles.L.Down.Z)
                                        {
                                            cT = tiles.Corner.Down.NE;
                                        }
                                        else if (cT == tiles.L.Up.NZ)
                                        {
                                            cT = tiles.Corner.Up.WN;
                                        }
                                        else if (cT == tiles.L.Down.NZ)
                                        {
                                            cT = tiles.Corner.Down.WN;
                                        }
                                    }
                                    else if (x == cube.End.X)
                                    {
                                        if (cT == tiles.Line.Y)
                                        {
                                            if (y == cube.Start.Y)
                                            {
                                                cT = tiles.L.Up.NX;
                                            }
                                            else if (y == cube.End.Y)
                                            {
                                                cT = tiles.L.Down.NX;
                                            }
                                        }
                                        else if (cT == tiles.Line.Z)
                                        {
                                            if (z == cube.Start.Z)
                                            {
                                                cT = tiles.L.Side.ES;
                                            }
                                            else if (z == cube.End.Z)
                                            {
                                                cT = tiles.L.Side.WN;
                                            }
                                        }
                                        else if (cT == tiles.L.Up.Z)
                                        {
                                            cT = tiles.Corner.Up.ES;
                                        }
                                        else if (cT == tiles.L.Down.Z)
                                        {
                                            cT = tiles.Corner.Down.ES;
                                        }
                                        else if (cT == tiles.L.Up.NZ)
                                        {
                                            cT = tiles.Corner.Up.SW;
                                        }
                                        else if (cT == tiles.L.Down.NZ)
                                        {
                                            cT = tiles.Corner.Down.SW;
                                        }
                                    }
                                }
                            }

                            if (cT != null)
                            {
                                Add(guid, new FrameRegion.FrameRegionInfo {
                                    Tile     = cT.Value,
                                    Location = current
                                });
                            }
                        }
                    }
                    else
                    {
                        goto loop;
                    }
                }
            });

            return(guid);
        }