Beispiel #1
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);
        }
Beispiel #2
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;
        }