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(); }
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(); }
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); }
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); }
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); } }
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); }
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(); }
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(); }
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"); }
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(); }
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); }
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); }
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); }
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; } }
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); }
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(); } }
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)); }
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(); }
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); }
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; } }
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(); } }
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(); }
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>()); } }
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); }
public override void OnSelected(WorldEdit worldEdit) { worldEdit.SelectionMode(true); }
public override void OnDeselected(WorldEdit worldEdit) { worldEdit.SelectionMode(false); }
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); }
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; }
public override void OnBuild(WorldEdit worldEdit, int oldBlockId, BlockSelection blockSel, ItemStack withItemStack) { OnApply(worldEdit, oldBlockId, blockSel, withItemStack, false); }
public override void OnBreak(WorldEdit worldEdit, BlockSelection blockSel, ref EnumHandling handling) { handling = EnumHandling.PreventDefault; OnApply(worldEdit, -1, blockSel, null, true); }