public bool PerformBrushAction(WorldEdit worldEdit, Block placedBlock, int oldBlockId, BlockSelection blockSel, BlockPos targetPos, ItemStack withItemStack)
        {
            if (BrushDim1 <= 0)
            {
                return(false);
            }

            Block selectedBlock = blockSel.DidOffset ? blockAccessRev.GetBlock(blockSel.Position.AddCopy(blockSel.Face.Opposite)) : blockAccessRev.GetBlock(blockSel.Position);

            int selectedBlockId = selectedBlock.BlockId;

            if (oldBlockId >= 0)
            {
                worldEdit.sapi.World.BlockAccessor.SetBlock(oldBlockId, blockSel.Position);
            }



            EnumBrushMode brushMode = BrushMode;

            int blockId = placedBlock.BlockId;

            if (!worldEdit.MayPlace(blockAccessRev.GetBlock(blockId), brushPositions.Length))
            {
                return(false);
            }

            EnumDepthLimit depthLimit = DepthLimit;

            for (int i = 0; i < brushPositions.Length; i++)
            {
                BlockPos dpos = targetPos.AddCopy(brushPositions[i].X, brushPositions[i].Y, brushPositions[i].Z);

                bool skip = false;
                switch (depthLimit)
                {
                case EnumDepthLimit.Top1:
                    skip = blockAccessRev.GetBlockId(dpos) == 0 || blockAccessRev.GetBlockId(dpos.X, dpos.Y + 1, dpos.Z) != 0;
                    break;

                case EnumDepthLimit.Top2:
                    skip = blockAccessRev.GetBlockId(dpos) == 0 || (blockAccessRev.GetBlockId(dpos.X, dpos.Y + 1, dpos.Z) != 0 && blockAccessRev.GetBlockId(dpos.X, dpos.Y + 2, dpos.Z) != 0);
                    break;

                case EnumDepthLimit.Top3:
                    skip = blockAccessRev.GetBlockId(dpos) == 0 || (blockAccessRev.GetBlockId(dpos.X, dpos.Y + 1, dpos.Z) != 0 && blockAccessRev.GetBlockId(dpos.X, dpos.Y + 2, dpos.Z) != 0 && blockAccessRev.GetBlockId(dpos.X, dpos.Y + 3, dpos.Z) != 0);
                    break;

                case EnumDepthLimit.Top4:
                    skip = blockAccessRev.GetBlockId(dpos) == 0 || (blockAccessRev.GetBlockId(dpos.X, dpos.Y + 1, dpos.Z) != 0 && blockAccessRev.GetBlockId(dpos.X, dpos.Y + 2, dpos.Z) != 0 && blockAccessRev.GetBlockId(dpos.X, dpos.Y + 3, dpos.Z) != 0 && blockAccessRev.GetBlockId(dpos.X, dpos.Y + 4, dpos.Z) != 0);
                    break;
                }
                if (skip)
                {
                    continue;
                }


                switch (brushMode)
                {
                case EnumBrushMode.ReplaceAir:
                    if (blockAccessRev.GetBlockId(dpos) == 0)
                    {
                        blockAccessRev.SetBlock(blockId, dpos, withItemStack);
                    }
                    break;

                case EnumBrushMode.ReplaceNonAir:
                    if (blockAccessRev.GetBlockId(dpos) != 0)
                    {
                        blockAccessRev.SetBlock(blockId, dpos, withItemStack);
                    }
                    break;

                case EnumBrushMode.ReplaceSelected:
                    if (blockAccessRev.GetBlockId(dpos) == selectedBlockId)
                    {
                        blockAccessRev.SetBlock(blockId, dpos, withItemStack);
                    }

                    break;

                default:
                    blockAccessRev.SetBlock(blockId, dpos, withItemStack);
                    break;
                }
            }

            return(true);
        }
        public override bool OnWorldEditCommand(WorldEdit worldEdit, CmdArgs args)
        {
            switch (args[0])
            {
            case "tm":
                EnumBrushMode brushMode = EnumBrushMode.Fill;

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

                BrushMode = brushMode;
                worldEdit.Good(workspace.ToolName + " mode " + brushMode + " set.");
                workspace.ResendBlockHighlights(worldEdit);

                return(true);

            case "tdl":
                EnumDepthLimit depthLimit = EnumDepthLimit.NoLimit;

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

                DepthLimit = depthLimit;
                worldEdit.Good(workspace.ToolName + " depth limit set to " + depthLimit);
                workspace.ResendBlockHighlights(worldEdit);
                return(true);

            case "ts":
                EnumBrushShape shape = EnumBrushShape.Ball;

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

                BrushShape = shape;

                worldEdit.Good(workspace.ToolName + " shape " + BrushShape + " set.");
                GenBrush();
                workspace.ResendBlockHighlights(worldEdit);
                return(true);

            case "tsx":
            case "tsy":
            case "tsz":
            {
                float size = 0;
                if (args.Length > 1)
                {
                    float.TryParse(args[1], out size);
                }

                if (args[0] == "tsx")
                {
                    BrushDim1 = size;
                }
                if (args[0] == "tsy")
                {
                    BrushDim2 = size;
                }
                if (args[0] == "tsz")
                {
                    BrushDim3 = size;
                }

                string text = dimensionNames[(int)BrushShape][0] + "=" + BrushDim1;
                text += ", " + dimensionNames[(int)BrushShape][1] + "=" + BrushDim2;
                text += ", " + dimensionNames[(int)BrushShape][2] + "=" + BrushDim3;

                worldEdit.Good(workspace.ToolName + " dimensions " + text + " set.");

                GenBrush();
                workspace.ResendBlockHighlights(worldEdit);

                return(true);
            }


            case "tr":
            {
                BrushDim1 = 0;
                float size;

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

                if (args.Length > 2 && float.TryParse(args[2], out size))
                {
                    BrushDim2 = size;
                }
                else
                {
                    BrushDim2 = BrushDim1;
                }

                if (args.Length > 3 && float.TryParse(args[3], out size))
                {
                    BrushDim3 = size;
                }
                else
                {
                    BrushDim3 = BrushDim2;
                }

                string text = dimensionNames[(int)BrushShape][0] + "=" + BrushDim1;
                text += ", " + dimensionNames[(int)BrushShape][1] + "=" + BrushDim2;
                text += ", " + dimensionNames[(int)BrushShape][2] + "=" + BrushDim3;

                worldEdit.Good(workspace.ToolName + " dimensions " + text + " set.");

                GenBrush();
                workspace.ResendBlockHighlights(worldEdit);
            }
                return(true);



            case "tcx":
            case "tcy":
            case "tcz":
            {
                float size = 0;
                if (args.Length > 1)
                {
                    float.TryParse(args[1], out size);
                }

                if (args[0] == "tcx")
                {
                    CutoutDim1 = size;
                }
                if (args[0] == "tcy")
                {
                    CutoutDim2 = size;
                }
                if (args[0] == "tcz")
                {
                    CutoutDim3 = size;
                }

                string text = dimensionNames[(int)BrushShape][0] + "=" + CutoutDim1;
                text += ", " + dimensionNames[(int)BrushShape][1] + "=" + CutoutDim2;
                text += ", " + dimensionNames[(int)BrushShape][2] + "=" + CutoutDim3;

                worldEdit.Good(workspace.ToolName + " cutout dimensions " + text + " set.");

                GenBrush();
                workspace.ResendBlockHighlights(worldEdit);

                return(true);
            }


            case "tcr":
            {
                CutoutDim1 = 0;
                float size;

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

                if (args.Length > 2 && float.TryParse(args[2], out size))
                {
                    CutoutDim2 = size;
                }
                else
                {
                    CutoutDim2 = CutoutDim1;
                }

                if (args.Length > 3 && float.TryParse(args[3], out size))
                {
                    CutoutDim3 = size;
                }
                else
                {
                    CutoutDim3 = CutoutDim2;
                }

                string text = dimensionNames[(int)BrushShape][0] + "=" + CutoutDim1;
                text += ", " + dimensionNames[(int)BrushShape][1] + "=" + CutoutDim2;
                text += ", " + dimensionNames[(int)BrushShape][2] + "=" + CutoutDim3;

                worldEdit.Good("Cutout " + workspace.ToolName + " dimensions " + text + " set.");

                GenBrush();
                workspace.ResendBlockHighlights(worldEdit);
            }
                return(true);

            case "tgr":
            {
                BrushDim1++;
                BrushDim2++;
                BrushDim3++;

                string text = dimensionNames[(int)BrushShape][0] + "=" + BrushDim1;
                text += ", " + dimensionNames[(int)BrushShape][1] + "=" + BrushDim2;
                text += ", " + dimensionNames[(int)BrushShape][2] + "=" + BrushDim3;
                worldEdit.Good(workspace.ToolName + " dimensions " + text + " set.");
                GenBrush();
                workspace.ResendBlockHighlights(worldEdit);
            }
                return(true);

            case "tsr":
            {
                BrushDim1 = Math.Max(0, BrushDim1 - 1);
                BrushDim2 = Math.Max(0, BrushDim2 - 1);
                BrushDim3 = Math.Max(0, BrushDim3 - 1);

                string text = dimensionNames[(int)BrushShape][0] + "=" + BrushDim1;
                text += ", " + dimensionNames[(int)BrushShape][1] + "=" + BrushDim2;
                text += ", " + dimensionNames[(int)BrushShape][2] + "=" + BrushDim3;
                worldEdit.Good(workspace.ToolName + " dimensions " + text + " set.");
                GenBrush();
                workspace.ResendBlockHighlights(worldEdit);
            }
                return(true);
            }

            return(false);
        }