diff --git a/core/src/main/java/com/boydti/fawe/Fawe.java b/core/src/main/java/com/boydti/fawe/Fawe.java index c532c2fa..0d4c7068 100644 --- a/core/src/main/java/com/boydti/fawe/Fawe.java +++ b/core/src/main/java/com/boydti/fawe/Fawe.java @@ -27,6 +27,7 @@ import com.sk89q.worldedit.command.ClipboardCommands; import com.sk89q.worldedit.command.SchematicCommands; import com.sk89q.worldedit.command.ScriptingCommands; import com.sk89q.worldedit.command.composition.SelectionCommand; +import com.sk89q.worldedit.command.tool.brush.GravityBrush; import com.sk89q.worldedit.extension.platform.CommandManager; import com.sk89q.worldedit.extension.platform.PlatformManager; import com.sk89q.worldedit.extent.clipboard.BlockArrayClipboard; @@ -237,6 +238,8 @@ public class Fawe { SchematicCommands.inject(); ScriptingCommands.inject(); SelectionCommand.inject(); + // Brushes + GravityBrush.inject(); // Visitors BreadthFirstSearch.inject(); DownwardVisitor.inject(); diff --git a/core/src/main/java/com/sk89q/worldedit/command/tool/brush/GravityBrush.java b/core/src/main/java/com/sk89q/worldedit/command/tool/brush/GravityBrush.java new file mode 100644 index 00000000..00815fc6 --- /dev/null +++ b/core/src/main/java/com/sk89q/worldedit/command/tool/brush/GravityBrush.java @@ -0,0 +1,76 @@ +/* + * WorldEdit, a Minecraft world manipulation toolkit + * Copyright (C) sk89q + * Copyright (C) WorldEdit team and contributors + * + * This program is free software: you can redistribute it and/or modify it + * under the terms of the GNU Lesser General Public License as published by the + * Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License + * for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see . + */ + +package com.sk89q.worldedit.command.tool.brush; + +import com.sk89q.worldedit.EditSession; +import com.sk89q.worldedit.MaxChangedBlocksException; +import com.sk89q.worldedit.Vector; +import com.sk89q.worldedit.blocks.BaseBlock; +import com.sk89q.worldedit.blocks.BlockID; +import com.sk89q.worldedit.function.pattern.Pattern; + +public class GravityBrush implements Brush { + + private final boolean fullHeight; + + public GravityBrush(boolean fullHeight) { + this.fullHeight = fullHeight; + } + + @Override + public void build(EditSession editSession, Vector position, Pattern pattern, double sizeDouble) throws MaxChangedBlocksException { + int size = (int) sizeDouble; + BaseBlock air = new BaseBlock(BlockID.AIR, 0); + int endY = position.getBlockY() + size; + int startPerformY = Math.max(0, position.getBlockY() - size); + int startCheckY = fullHeight ? 0 : startPerformY; + Vector mutablePos = new Vector(0, 0, 0); + for (int x = position.getBlockX() + size; x > position.getBlockX() - size; --x) { + for (int z = position.getBlockZ() + size; z > position.getBlockZ() - size; --z) { + int freeSpot = startCheckY; + for (int y = startCheckY; y <= endY; y++) { + if (y < startPerformY) { + if (editSession.getLazyBlock(x, y, z) != EditSession.nullBlock) { + freeSpot = y + 1; + } + continue; + } + BaseBlock block = editSession.getLazyBlock(x, y, z); + if (block != EditSession.nullBlock) { + if (freeSpot != y) { + mutablePos.x = x; + mutablePos.y = freeSpot; + mutablePos.z = z; + editSession.setBlock(mutablePos, block); + mutablePos.y = y; + editSession.setBlock(mutablePos, EditSession.nullBlock); + } + freeSpot++; + } + } + } + } + } + + public static Class inject() { + return GravityBrush.class; + } + +}