Esempio n. 1
0
        public override void OnBuild(WorldEdit.WorldEdit worldEdit, int oldBlockId, BlockSelection blockSel, ItemStack withItemStack)
        {
            if (treeGenerators == null)
            {
                treeGenerators = new TreeGeneratorsUtil(worldEdit.sapi);
            }

            if (TreeVariant == null)
            {
                worldEdit.Bad("Please select a tree variant first.");
                return;
            }

            //blockAccessRev.SetBlock(oldBlockId, blockSel.Position, withItemStack);
            worldEdit.sapi.World.BlockAccessor.SetBlock(oldBlockId, blockSel.Position);
            blockSel.Position.Add(blockSel.Face.Opposite); // - prevented trees from growing o.O   - seems to work again and with this disabled trees float in the air 0.O

            blockAccessRev.ReadFromStagedByDefault = true;

            treeGenerators.ReloadTreeGenerators();
            treeGenerators.RunGenerator(new AssetLocation(TreeVariant), blockAccessRev, blockSel.Position, MinTreeSize + (float)rand.NextDouble() * (MaxTreeSize - MinTreeSize));

            blockAccessRev.SetHistoryStateBlock(blockSel.Position.X, blockSel.Position.Y, blockSel.Position.Z, oldBlockId, blockAccessRev.GetStagedBlockId(blockSel.Position));
            blockAccessRev.Commit();
        }
Esempio n. 2
0
        public override void OnBuild(WorldEdit worldEdit, int oldBlockId, BlockSelection blockSel, ItemStack withItemStack)
        {
            if (BrushRadius <= 0)
            {
                return;
            }

            Block blockToPlace = blockAccessRev.GetBlock(blockSel.Position);

            worldEdit.sapi.World.BlockAccessor.SetBlock(oldBlockId, blockSel.Position);

            int quantityBlocks = (int)((GameMath.PI * BrushRadius * BrushRadius) * (4 * KernelRadius * KernelRadius) * Iterations);

            quantityBlocks *= 4; // because erode is computationally extra expensive

            if (!worldEdit.MayPlace(blockToPlace, quantityBlocks))
            {
                return;
            }

            int q = Iterations;

            while (q-- > 0)
            {
                ApplyErode(worldEdit, blockAccessRev, blockSel.Position, blockToPlace, withItemStack);
            }

            blockAccessRev.SetHistoryStateBlock(blockSel.Position.X, blockSel.Position.Y, blockSel.Position.Z, oldBlockId, blockAccessRev.GetBlockId(blockSel.Position));
            blockAccessRev.Commit();
        }
Esempio n. 3
0
        public override void OnBuild(WorldEdit worldEdit, int oldBlockId, BlockSelection blockSel, ItemStack withItemStack)
        {
            if (blockDatas == null)
            {
                LoadBlockdatas(worldEdit.sapi);
            }
            if (blockDatas.Length == 0)
            {
                return;
            }

            worldEdit.sapi.World.BlockAccessor.SetBlock(oldBlockId, blockSel.Position);

            BlockSchematic blockData = blockDatas[nextRnd];

            nextRnd = rand.Next(blockDatas.Length);

            BlockPos originPos = blockData.GetStartPos(blockSel.Position, Origin);

            blockData.Init(blockAccessRev);
            blockData.Place(blockAccessRev, worldEdit.sapi.World, originPos, ReplaceMode, worldEdit.ReplaceMetaBlocks);

            blockAccessRev.SetHistoryStateBlock(blockSel.Position.X, blockSel.Position.Y, blockSel.Position.Z, oldBlockId, blockAccessRev.GetStagedBlockId(blockSel.Position));
            blockAccessRev.Commit();
            blockData.PlaceEntitiesAndBlockEntities(blockAccessRev, worldEdit.sapi.World, originPos);
            blockData.PlaceDecors(blockAccessRev, originPos, true);
            blockAccessRev.CommitBlockEntityData();


            if (RandomRotate)
            {
                SetRandomAngle(worldEdit.sapi.World);
            }
            workspace.ResendBlockHighlights(worldEdit);
        }
Esempio n. 4
0
        public override bool OnWorldEditCommand(WorldEdit worldEdit, CmdArgs args)
        {
            switch (args.PopWord())
            {
            case "tr":
            {
                int rad = (int)args.PopInt(32);
                SearchRadius = rad;

                worldEdit.Good(workspace.ToolName + " search radius " + SearchRadius + " set.");
                return(true);
            }

            case "tce":
            {
                CheckEnclosure = (bool)args.PopBool(true);
                worldEdit.Good(workspace.ToolName + " check enclosure set to " + CheckEnclosure);
                return(true);
            }

            case "tm":
            {
                Mode = (int)args.PopInt(2);
                worldEdit.Good(workspace.ToolName + " mode set to " + Mode + "D");
                return(true);
            }
            }

            return(false);
        }
Esempio n. 5
0
        public override void OnAttackStart(WorldEdit worldEdit, BlockSelection blockSelection)
        {
            if (blockSelection == null)
            {
                return;
            }

            if (!MagicSelect)
            {
                BlockPos startPos = blockSelection.Position;

                if (workspace.EndMarker != null)
                {
                    if (workspace.EndMarker.X <= startPos.X)
                    {
                        startPos.X++;
                    }
                    if (workspace.EndMarker.Y <= startPos.Y)
                    {
                        startPos.Y++;
                    }
                    if (workspace.EndMarker.Z <= startPos.Z)
                    {
                        startPos.Z++;
                    }
                }

                worldEdit.SetStartPos(startPos);
            }
        }
Esempio n. 6
0
        public override bool OnWorldEditCommand(WorldEdit worldEdit, CmdArgs args)
        {
            switch (args[0])
            {
            case "tremove":
                PlaceMode = args.Length > 1 && (args[1] == "1" || args[1] == "on");
                worldEdit.Good(workspace.ToolName + " remove mode now " + (PlaceMode ? "on" : "off"));
                return(true);

            case "tm":
                EnumLineStartPoint startpoint = EnumLineStartPoint.LineStrip;

                if (args.Length > 1)
                {
                    int index;
                    int.TryParse(args[1], out index);
                    if (Enum.IsDefined(typeof(EnumLineStartPoint), index))
                    {
                        startpoint = (EnumLineStartPoint)index;
                    }
                }

                LineMode = startpoint;
                worldEdit.Good(workspace.ToolName + " mode " + startpoint + " set.");
                workspace.ResendBlockHighlights(worldEdit);

                return(true);
            }

            return(false);
        }
Esempio n. 7
0
        public override void OnBuild(WorldEdit.WorldEdit worldEdit, ushort oldBlockId, BlockSelection blockSel, ItemStack withItemStack)
        {
            if (treeGenerators == null)
            {
                treeGenerators = new TreeGeneratorsUtil(worldEdit.sapi);
            }

            if (TreeVariant == null)
            {
                worldEdit.Bad("Please select a tree variant first.");
                return;
            }

            //blockAccessRev.SetBlock(oldBlockId, blockSel.Position, withItemStack);
            worldEdit.sapi.World.BlockAccessor.SetBlock(oldBlockId, blockSel.Position);
            blockSel.Position.Add(blockSel.Face.GetOpposite());

            blockAccessRev.ReadFromStagedByDefault = true;

            treeGenerators.ReloadTreeGenerators();
            treeGenerators.RunGenerator(new AssetLocation(TreeVariant), blockAccessRev, blockSel.Position.DownCopy(), MinTreeSize + (float)rand.NextDouble() * (MaxTreeSize - MinTreeSize));

            blockAccessRev.SetHistoryStateBlock(blockSel.Position.X, blockSel.Position.Y, blockSel.Position.Z, oldBlockId, blockAccessRev.GetStagedBlockId(blockSel.Position));
            blockAccessRev.Commit();
        }
Esempio n. 8
0
        public override void OnBuild(WorldEdit worldEdit, int oldBlockId, BlockSelection blockSel, ItemStack withItemStack)
        {
            if (startPos == null)
            {
                return;
            }

            BlockPos destPos = blockSel.Position.AddCopy(blockSel.Face.Opposite);

            Block block = blockAccessRev.GetBlock(blockSel.Position);

            if (PlaceMode)
            {
                block = blockAccessRev.GetBlock(0);
            }
            worldEdit.sapi.World.BlockAccessor.SetBlock(oldBlockId, blockSel.Position);

            if (!worldEdit.MayPlace(block, startPos.ManhattenDistance(destPos)))
            {
                return;
            }

            GameMath.BresenHamPlotLine3d(startPos.X, startPos.Y, startPos.Z, destPos.X, destPos.Y, destPos.Z, (pos) => blockAccessRev.SetBlock(block.BlockId, pos, withItemStack));

            if (LineMode == EnumLineStartPoint.LineStrip)
            {
                startPos = destPos.Copy();
            }

            blockAccessRev.SetHistoryStateBlock(blockSel.Position.X, blockSel.Position.Y, blockSel.Position.Z, oldBlockId, blockAccessRev.GetBlockId(blockSel.Position));
            blockAccessRev.Commit();
        }
Esempio n. 9
0
        public void FloodFillAt(WorldEdit worldEdit, Block blockToPlace, ItemStack withItemStack, int posX, int posY, int posZ)
        {
            bfsQueue.Clear();
            fillablePositions.Clear();


            if (posY <= 0 || posY >= mapheight - 1)
            {
                return;
            }

            bfsQueue.Enqueue(new Vec4i(posX, posY, posZ, 0));
            fillablePositions.Add(new BlockPos(posX, posY, posZ));

            float radius = SearchRadius;

            BlockFacing[] faces  = Mode == 2 ? BlockFacing.HORIZONTALS : BlockFacing.ALLFACES;
            BlockPos      curPos = new BlockPos();

            while (bfsQueue.Count > 0)
            {
                Vec4i bpos = bfsQueue.Dequeue();

                foreach (BlockFacing facing in faces)
                {
                    curPos.Set(bpos.X + facing.Normali.X, bpos.Y + facing.Normali.Y, bpos.Z + facing.Normali.Z);

                    Block block    = blockAccessRev.GetBlock(curPos);
                    bool  inBounds = bpos.W < radius;

                    if (inBounds)
                    {
                        if (block.Replaceable >= 6000 && !fillablePositions.Contains(curPos))
                        {
                            bfsQueue.Enqueue(new Vec4i(curPos.X, curPos.Y, curPos.Z, bpos.W + 1));
                            fillablePositions.Add(curPos.Copy());
                        }
                    }
                    else
                    {
                        if (CheckEnclosure)
                        {
                            fillablePositions.Clear();
                            bfsQueue.Clear();
                            worldEdit.Bad("Cannot flood fill here, not enclosed area. Enforce enclosed area or disable enclosure check.");
                            break;
                        }
                    }
                }
            }

            foreach (BlockPos p in fillablePositions)
            {
                blockAccessRev.SetBlock(blockToPlace.BlockId, p, withItemStack);
            }

            worldEdit.Bad(fillablePositions.Count + " blocks placed");
        }
Esempio n. 10
0
        public override void OnBreak(WorldEdit worldEdit, BlockSelection blockSel, ref EnumHandling handling)
        {
            handling = EnumHandling.PreventDefault;
            startPos = blockSel.Position.Copy();
            worldEdit.Good("Line Tool start position set");

            //int blockId = blockAccessRev.GetBlockId(blockSel.Position);
            //worldEdit.sapi.World.BlockAccessor.SetBlock(oldBlockId, blockSel.Position);
            //blockAccessRev.SetHistoryStateBlock(blockSel.Position.X, blockSel.Position.Y, blockSel.Position.Z, oldBlockId, oldBlockId);
            //blockAccessRev.Commit();
        }
Esempio n. 11
0
        public override bool OnWorldEditCommand(WorldEdit worldEdit, CmdArgs args)
        {
            switch (args[0])
            {
            case "tm":
                EnumGrowShrinkMode mode = EnumGrowShrinkMode.Any;

                if (args.Length > 1)
                {
                    int index;
                    int.TryParse(args[1], out index);
                    if (Enum.IsDefined(typeof(EnumGrowShrinkMode), index))
                    {
                        mode = (EnumGrowShrinkMode)index;
                    }
                }

                GrowShrinkMode = mode;
                worldEdit.Good(workspace.ToolName + " mode " + mode + " set.");

                return(true);

            case "tr":
                BrushRadius = 0;

                if (args.Length > 1)
                {
                    float size;
                    float.TryParse(args[1], out size);
                    BrushRadius = size;
                }

                worldEdit.Good("Grow/Shrink radius " + BrushRadius + " set");

                return(true);

            case "tgr":
                BrushRadius++;
                worldEdit.Good("Grow/Shrink radius " + BrushRadius + " set");
                return(true);


            case "tsr":
                BrushRadius = Math.Max(0, BrushRadius - 1);
                worldEdit.Good("Grow/Shrink radius " + BrushRadius + " set");
                return(true);
            }

            return(false);
        }
Esempio n. 12
0
        public override bool OnWorldEditCommand(WorldEdit worldEdit, CmdArgs args)
        {
            string cmd = args.PopWord();

            switch (cmd)
            {
            case "tm":
            {
                EnumMoveToolMode mode = EnumMoveToolMode.MoveBlocks;

                if (args.Length > 0)
                {
                    int index;
                    int.TryParse(args[0], out index);
                    if (Enum.IsDefined(typeof(EnumMoveToolMode), index))
                    {
                        mode = (EnumMoveToolMode)index;
                    }
                }

                MoveRepeatMode = mode;
                worldEdit.Good(Lang.Get("Tool mode now set to {0}", mode));
                return(true);
            }

            case "am":
            {
                Amount = (int)args.PopInt(1);
                worldEdit.Good(Lang.Get("Amount set to {0}", Amount));
                return(true);
            }

            case "north":
            case "east":
            case "west":
            case "south":
            case "up":
            case "down":
            {
                BlockFacing facing = BlockFacing.FromCode(cmd);
                Handle(worldEdit, facing.Normali);
                return(true);
            }
            }

            return(false);
        }
Esempio n. 13
0
        public override void OnInteractStart(WorldEdit worldEdit, BlockSelection blockSelection)
        {
            if (blockSelection == null)
            {
                return;
            }

            BlockPos center = (workspace.StartMarker + workspace.EndMarker) / 2;

            center.Y = Math.Min(workspace.StartMarker.Y, workspace.EndMarker.Y);

            Vec3i offset = (blockSelection.Position - center).ToVec3i();

            offset.Add(blockSelection.Face);

            Handle(worldEdit, offset);
        }
Esempio n. 14
0
        private void Handle(WorldEdit worldedit, BlockFacing blockFacing, int amount)
        {
            Vec3i vec           = blockFacing.Normali;
            bool  selectNewArea = SelectionMode == EnumRepeatSelectionMode.Move;
            bool  growToArea    = SelectionMode == EnumRepeatSelectionMode.Grow;

            switch (RepeatMode)
            {
            case EnumRepeatToolMode.Mirror:
                worldedit.MirrorArea(workspace.GetMarkedMinPos(), workspace.GetMarkedMaxPos(), blockFacing, selectNewArea, growToArea);
                break;

            case EnumRepeatToolMode.Repeat:
                worldedit.RepeatArea(workspace.GetMarkedMinPos(), workspace.GetMarkedMaxPos(), blockFacing, amount, selectNewArea, growToArea);
                break;
            }
        }
Esempio n. 15
0
        public override void OnInteractStart(WorldEdit worldEdit, BlockSelection blockSelection)
        {
            if (blockSelection == null)
            {
                return;
            }

            BlockPos center = (workspace.StartMarker + workspace.EndMarker) / 2;

            center.Y = Math.Min(workspace.StartMarker.Y, workspace.EndMarker.Y);

            Vec3i       offset = (blockSelection.Position - center).ToVec3i();
            BlockFacing facing = BlockFacing.NORTH;
            int         amount = 1;

            if (Math.Abs(offset.X) > Math.Abs(offset.Y))
            {
                if (Math.Abs(offset.X) > Math.Abs(offset.Z))
                {
                    facing = offset.X >= 0 ? BlockFacing.EAST : BlockFacing.WEST;
                    amount = Math.Abs(offset.X) / Math.Abs(workspace.StartMarker.X - workspace.EndMarker.X);
                }
                else
                {
                    facing = offset.Z >= 0 ? BlockFacing.SOUTH : BlockFacing.NORTH;
                    amount = Math.Abs(offset.Z) / Math.Abs(workspace.StartMarker.Z - workspace.EndMarker.Z);
                }
            }
            else
            {
                if (Math.Abs(offset.Y) > Math.Abs(offset.Z))
                {
                    facing = offset.Y >= 0 ? BlockFacing.UP : BlockFacing.DOWN;
                    amount = Math.Abs(offset.Y) / Math.Abs(workspace.StartMarker.Y - workspace.EndMarker.Y);
                }
                else
                {
                    facing = offset.Z >= 0 ? BlockFacing.SOUTH : BlockFacing.NORTH;
                    amount = Math.Abs(offset.Z) / Math.Abs(workspace.StartMarker.Z - workspace.EndMarker.Z);
                }
            }


            Handle(worldEdit, facing, amount);
        }
Esempio n. 16
0
        public virtual void OnBuild(WorldEdit worldEdit, int oldBlockId, BlockSelection blockSel, ItemStack withItemStack)
        {
            Block    placedBlock = blockAccessRev.GetBlock(blockSel.Position);
            BlockPos targetPos   = blockSel.Position.Copy();

            if (workspace.ToolOffsetMode == EnumToolOffsetMode.Attach)
            {
                targetPos.X += (workspace.ToolInstance.Size.X / 2) * blockSel.Face.Normali.X;
                targetPos.Y += (workspace.ToolInstance.Size.Y / 2) * blockSel.Face.Normali.Y;
                targetPos.Z += (workspace.ToolInstance.Size.Z / 2) * blockSel.Face.Normali.Z;
            }

            if (ApplyToolBuild(worldEdit, placedBlock, oldBlockId, blockSel, targetPos, withItemStack))
            {
                blockAccessRev.SetHistoryStateBlock(blockSel.Position.X, blockSel.Position.Y, blockSel.Position.Z, oldBlockId, blockAccessRev.GetStagedBlockId(blockSel.Position.X, blockSel.Position.Y, blockSel.Position.Z));
                blockAccessRev.Commit();
            }
        }
Esempio n. 17
0
        public override List <BlockPos> GetBlockHighlights(WorldEdit worldEdit)
        {
            if (blockDatas == null)
            {
                LoadBlockdatas(worldEdit.sapi, worldEdit);
            }
            if (blockDatas.Length == 0)
            {
                return(new List <BlockPos>());
            }

            BlockSchematic blockData = blockDatas[nextRnd];

            BlockPos origin = blockData.GetStartPos(new BlockPos(), Origin);

            BlockPos[] pos = blockData.GetJustPositions(origin);

            return(new List <BlockPos>(pos));
        }
Esempio n. 18
0
        private void ApplyTool(WorldEdit worldEdit, BlockPos pos, int oldBlockId, BlockFacing onBlockFace, ItemStack withItemstack, bool remove = false)
        {
            mapheight = worldEdit.sapi.WorldManager.MapSizeY;

            Block block = blockAccessRev.GetBlock(pos);

            if (oldBlockId >= 0)
            {
                worldEdit.sapi.World.BlockAccessor.SetBlock(oldBlockId, pos);
            }
            else
            {
                block = worldEdit.sapi.World.GetBlock(0);
            }

            FloodFillAt(worldEdit, block, withItemstack, pos.X, pos.Y, pos.Z);

            blockAccessRev.Commit();
        }
Esempio n. 19
0
        public override void OnInteractStart(WorldEdit worldEdit, BlockSelection blockSelection)
        {
            if (blockSelection == null)
            {
                return;
            }

            blockAccess = worldEdit.sapi.World.BlockAccessor;

            if (MagicSelect)
            {
                Cuboidi sele = MagiSelect(blockSelection);
                worldEdit.SetStartPos(sele.Start.AsBlockPos);
                worldEdit.SetEndPos(sele.End.AsBlockPos);

                workspace.revertableBlockAccess.StoreHistoryState(new List <BlockUpdate>());
            }
            else
            {
                BlockPos endpos = blockSelection.Position.AddCopy(blockSelection.Face);
                if (workspace.StartMarker != null)
                {
                    if (workspace.StartMarker.X <= endpos.X)
                    {
                        endpos.X++;
                    }
                    if (workspace.StartMarker.Y <= endpos.Y)
                    {
                        endpos.Y++;
                    }
                    if (workspace.StartMarker.Z <= endpos.Z)
                    {
                        endpos.Z++;
                    }
                }
                worldEdit.SetEndPos(endpos);

                workspace.revertableBlockAccess.StoreHistoryState(new List <BlockUpdate>());
            }

            base.OnInteractStart(worldEdit, blockSelection);
        }
Esempio n. 20
0
        private void Handle(WorldEdit worldedit, Vec3i dir)
        {
            Vec3i vec = dir * Amount;

            switch (MoveRepeatMode)
            {
            case EnumMoveToolMode.MoveBlocks:
                worldedit.MoveArea(vec.X, vec.Y, vec.Z, workspace.StartMarker, workspace.EndMarker);
                workspace.StartMarker.Add(vec);
                workspace.EndMarker.Add(vec);
                workspace.ResendBlockHighlights(worldedit);
                break;

            case EnumMoveToolMode.MoveSelection:
                workspace.StartMarker.Add(vec);
                workspace.EndMarker.Add(vec);
                workspace.ResendBlockHighlights(worldedit);
                break;
            }
        }
Esempio n. 21
0
        public virtual void OnBreak(WorldEdit worldEdit, BlockSelection blockSel, ref EnumHandling handling)
        {
            Block    oldblock  = blockAccessRev.GetBlock(blockSel.Position);
            BlockPos targetPos = blockSel.Position.Copy();

            if (workspace.ToolOffsetMode == EnumToolOffsetMode.Attach)
            {
                targetPos.X += workspace.ToolInstance.Size.X / 2 * blockSel.Face.Normali.X;
                targetPos.Y += workspace.ToolInstance.Size.Y / 2 * blockSel.Face.Normali.Y;
                targetPos.Z += workspace.ToolInstance.Size.Z / 2 * blockSel.Face.Normali.Z;
            }

            if (ApplyToolBreak(worldEdit, oldblock, blockSel, targetPos, ref handling))
            {
                if (handling == EnumHandling.PassThrough)
                {
                    blockAccessRev.SetHistoryStateBlock(blockSel.Position.X, blockSel.Position.Y, blockSel.Position.Z, oldblock.Id, blockAccessRev.GetStagedBlockId(blockSel.Position.X, blockSel.Position.Y, blockSel.Position.Z));
                }
                blockAccessRev.Commit();
            }
        }
Esempio n. 22
0
        public void LoadBlockdatas(ICoreServerAPI api, WorldEdit worldEdit = null)
        {
            this.blockDatas = new BlockSchematic[0];

            if (BlockDataFilenames == null)
            {
                return;
            }
            string[] filenames = BlockDataFilenames.Split(',');

            List <BlockSchematic> blockDatas = new List <BlockSchematic>();
            string exportFolderPath          = api.GetOrCreateDataPath("WorldEdit");

            int failed = 0;

            for (int i = 0; i < filenames.Length; i++)
            {
                string infilepath = Path.Combine(exportFolderPath, filenames[i]);

                string         error     = "";
                BlockSchematic blockData = BlockSchematic.LoadFromFile(infilepath, ref error);
                if (blockData == null)
                {
                    worldEdit?.Bad(error);
                    failed++;
                }
                else
                {
                    blockDatas.Add(blockData);
                }
            }

            if (failed > 0)
            {
                worldEdit?.Bad(failed + " schematics couldn't be loaded.");
            }

            this.blockDatas = blockDatas.ToArray();
        }
Esempio n. 23
0
        public void ResendBlockHighlights(WorldEdit we)
        {
            var player = world.PlayerByUid(PlayerUID);

            HighlightSelectedArea();

            if (ToolsEnabled)
            {
                EnumHighlightBlocksMode mode = EnumHighlightBlocksMode.CenteredToSelectedBlock;
                if (ToolOffsetMode == EnumToolOffsetMode.Attach)
                {
                    mode = EnumHighlightBlocksMode.AttachedToSelectedBlock;
                }
                if (ToolInstance != null)
                {
                    world.HighlightBlocks(player, (int)EnumHighlightSlot.Brush, ToolInstance.GetBlockHighlights(we), ToolInstance.GetBlockHighlightColors(we), mode, EnumHighlightShape.Arbitrary);
                }
            }
            else
            {
                world.HighlightBlocks(player, (int)EnumHighlightSlot.Brush, new List <BlockPos>(), new List <int>());
            }
        }
Esempio n. 24
0
        public override bool OnWorldEditCommand(WorldEdit worldEdit, CmdArgs args)
        {
            switch (args.PopWord())
            {
            case "magic":
            {
                MagicSelect = (bool)args.PopBool(false);

                worldEdit.Good("Magic select now " + (MagicSelect ? "on" : "off"));
                return(true);
            }

            case "edgeblocks":
            {
                string arg = args.PopWord("list");

                switch (arg)
                {
                case "list":
                    worldEdit.Good("Edge blocks: " + string.Join(", ", EdgeBlocks));
                    break;

                case "add":
                    string blockcode = args.PopAll();

                    if (matchesAnyBlock(worldEdit.sapi, blockcode))
                    {
                        EdgeBlocks = EdgeBlocks.Append(args.PopAll());
                        worldEdit.Good("Ok, edge block '" + blockcode + "' added.");
                        SetEdgeBlocks(worldEdit.sapi.World, EdgeBlocks);
                    }
                    else
                    {
                        worldEdit.Good("Error, block code/wildcard '" + blockcode + "' does not match any known blocks.");
                    }


                    break;

                case "remove":

                    List <string> elems = new List <string>(EdgeBlocks);
                    if (elems.Remove(args.PopAll()))
                    {
                        worldEdit.Good("Ok, edge block removed.");
                        SetEdgeBlocks(worldEdit.sapi.World, elems.ToArray());
                    }
                    else
                    {
                        worldEdit.Good("No such edge block in list.");
                    }

                    break;

                default:
                    worldEdit.Bad("Invalid arg. Syntax: /we edgeblocks or /we edgeblocks [list|add|remove] [blockcode]");
                    break;
                }
            }
                return(true);
            }

            return(false);
        }
Esempio n. 25
0
 public override void OnSelected(WorldEdit worldEdit)
 {
     worldEdit.SelectionMode(true);
 }
Esempio n. 26
0
 public override void OnDeselected(WorldEdit worldEdit)
 {
     worldEdit.SelectionMode(false);
 }
Esempio n. 27
0
        public override bool OnWorldEditCommand(WorldEdit worldEdit, CmdArgs args)
        {
            switch (args[0])
            {
            case "tr":
                Radius = 0;

                if (args.Length > 1)
                {
                    float size;
                    float.TryParse(args[1], NumberStyles.Any, GlobalConstants.DefaultCultureInfo, out size);
                    Radius = size;
                }

                worldEdit.Good("Air Brush Radius " + Radius + " set.");

                return(true);


            case "tgr":
                Radius++;
                worldEdit.Good("Air Brush Radius " + Radius + " set");
                return(true);

            case "tsr":
                Radius = Math.Max(0, Radius - 1);
                worldEdit.Good("Air Brush Radius " + Radius + " set");
                return(true);

            case "tq":
                Quantity = 0;

                if (args.Length > 1)
                {
                    float quant;
                    float.TryParse(args[1], NumberStyles.Any, GlobalConstants.DefaultCultureInfo, out quant);
                    Quantity = quant;
                }

                worldEdit.Good("Quantity " + Quantity + " set.");

                return(true);


            case "tm":
                EnumAirBrushMode mode = EnumAirBrushMode.Add;

                if (args.Length > 1)
                {
                    int index;
                    int.TryParse(args[1], out index);
                    if (Enum.IsDefined(typeof(EnumAirBrushMode), index))
                    {
                        mode = (EnumAirBrushMode)index;
                    }
                }

                Mode = mode;
                worldEdit.Good(workspace.ToolName + " mode " + mode + " set.");
                worldEdit.ResendBlockHighlights();
                return(true);



            case "ta":
                EnumAirBrushApply apply = EnumAirBrushApply.AnyFace;

                if (args.Length > 1)
                {
                    int index;
                    int.TryParse(args[1], out index);
                    if (Enum.IsDefined(typeof(EnumAirBrushApply), index))
                    {
                        apply = (EnumAirBrushApply)index;
                    }
                }

                Apply = apply;
                worldEdit.Good(workspace.ToolName + " apply " + apply + " set.");
                worldEdit.ResendBlockHighlights();
                return(true);
            }

            return(false);
        }
Esempio n. 28
0
        public void OnApply(WorldEdit worldEdit, int oldBlockId, BlockSelection blockSel, ItemStack withItemStack, bool isbreak = false)
        {
            if (Quantity == 0 || Radius == 0)
            {
                return;
            }

            float radSq = Radius * Radius;
            float q     = Quantity;

            Block block = blockAccessRev.GetBlock(blockSel.Position);

            if (isbreak)
            {
                block = blockAccessRev.GetBlock(0);
            }

            int quantityBlocks = (int)(GameMath.PI * radSq);

            if (!worldEdit.MayPlace(block, (int)q))
            {
                return;
            }

            if (oldBlockId >= 0)
            {
                worldEdit.sapi.World.BlockAccessor.SetBlock(oldBlockId, blockSel.Position);
            }
            lcgRand.SetWorldSeed(rand.Next());
            lcgRand.InitPositionSeed(blockSel.Position.X / blockAccessRev.ChunkSize, blockSel.Position.Z / blockAccessRev.ChunkSize);

            int xRadInt = (int)Math.Ceiling(Radius);
            int yRadInt = (int)Math.Ceiling(Radius);
            int zRadInt = (int)Math.Ceiling(Radius);

            HashSet <BlockPos> viablePositions = new HashSet <BlockPos>();
            BlockPos           dpos, ddpos;
            Block            testblock;
            EnumAirBrushMode mode = Mode;

            for (int dx = -xRadInt; dx <= xRadInt; dx++)
            {
                for (int dy = -yRadInt; dy <= yRadInt; dy++)
                {
                    for (int dz = -zRadInt; dz <= zRadInt; dz++)
                    {
                        if (dx * dx + dy * dy + dz * dz > radSq)
                        {
                            continue;
                        }

                        dpos      = blockSel.Position.AddCopy(dx, dy, dz);
                        testblock = blockAccessRev.GetBlock(dpos);
                        if (testblock.Replaceable >= 6000)
                        {
                            continue;
                        }

                        for (int i = 0; i < BlockFacing.NumberOfFaces; i++)
                        {
                            if (Apply == EnumAirBrushApply.SelectedFace && BlockFacing.ALLFACES[i] != blockSel.Face)
                            {
                                continue;
                            }

                            ddpos = dpos.AddCopy(BlockFacing.ALLFACES[i]);
                            Block dblock = blockAccessRev.GetBlock(ddpos);
                            if (dblock.Replaceable >= 6000 && (dblock.IsLiquid() == block.IsLiquid()))
                            {
                                // We found an air block beside a solid block -> let's remember that air block and keep looking
                                if (mode == EnumAirBrushMode.Add)
                                {
                                    viablePositions.Add(ddpos);
                                }
                                else
                                // We found an air block beside a solid block -> let's remember that solid block for removal and we can stop here
                                {
                                    viablePositions.Add(dpos);
                                }
                            }
                        }
                    }
                }
            }

            List <BlockPos> viablePositionsList = new List <BlockPos>(viablePositions);

            while (q-- > 0)
            {
                if (viablePositionsList.Count == 0)
                {
                    break;
                }

                if (q < 1 && rand.NextDouble() > q)
                {
                    break;
                }

                int index = rand.Next(viablePositionsList.Count);
                dpos = viablePositionsList[index];
                viablePositionsList.RemoveAt(index);

                if (mode == EnumAirBrushMode.Add)
                {
                    block.TryPlaceBlockForWorldGen(blockAccessRev, dpos, BlockFacing.UP, lcgRand);
                }
                else
                {
                    blockAccessRev.SetBlock(block.BlockId, dpos, withItemStack);
                }
            }

            if (oldBlockId >= 0)
            {
                blockAccessRev.SetHistoryStateBlock(blockSel.Position.X, blockSel.Position.Y, blockSel.Position.Z, oldBlockId, blockAccessRev.GetBlockId(blockSel.Position));
            }

            blockAccessRev.Commit();


            return;
        }
Esempio n. 29
0
 public override void OnBuild(WorldEdit worldEdit, int oldBlockId, BlockSelection blockSel, ItemStack withItemStack)
 {
     OnApply(worldEdit, oldBlockId, blockSel, withItemStack, false);
 }
Esempio n. 30
0
 public override void OnBreak(WorldEdit worldEdit, BlockSelection blockSel, ref EnumHandling handling)
 {
     handling = EnumHandling.PreventDefault;
     OnApply(worldEdit, -1, blockSel, null, true);
 }