diff --git a/core/src/main/java/com/boydti/fawe/config/BBC.java b/core/src/main/java/com/boydti/fawe/config/BBC.java index b244cd15..36f87bb7 100644 --- a/core/src/main/java/com/boydti/fawe/config/BBC.java +++ b/core/src/main/java/com/boydti/fawe/config/BBC.java @@ -131,6 +131,7 @@ public enum BBC { BRUSH_SMOOTH("Note: Use the blend brush if you want to smooth overhangs or caves.", "WorldEdit.Brush"), BRUSH_SPLINE("Click to add a point, click the same spot to finish", "WorldEdit.Brush"), BRUSH_LINE_PRIMARY("Added point %s0, click another position to create the line", "WorldEdit.Brush"), + BRUSH_CATENARY_DIRECTION("Added point %s0, click the direction you want to create the spline", "WorldEdit.Brush"), BRUSH_LINE_SECONDARY("Created spline", "WorldEdit.Brush"), BRUSH_SPLINE_PRIMARY_2("Added position, Click the same spot to join!", "WorldEdit.Brush"), BRUSH_SPLINE_SECONDARY_ERROR("Not enough positions set!", "WorldEdit.Brush"), diff --git a/core/src/main/java/com/boydti/fawe/object/brush/CatenaryBrush.java b/core/src/main/java/com/boydti/fawe/object/brush/CatenaryBrush.java index db2a144f..350a1d53 100644 --- a/core/src/main/java/com/boydti/fawe/object/brush/CatenaryBrush.java +++ b/core/src/main/java/com/boydti/fawe/object/brush/CatenaryBrush.java @@ -7,18 +7,24 @@ import com.sk89q.worldedit.MaxChangedBlocksException; import com.sk89q.worldedit.Vector; import com.sk89q.worldedit.command.tool.brush.Brush; import com.sk89q.worldedit.function.pattern.Pattern; +import com.sk89q.worldedit.util.Location; + import java.util.Arrays; import java.util.List; public class CatenaryBrush implements Brush, ResettableTool { - private final boolean shell, select; + private final boolean shell, select, direction; private final double slack; - private Vector pos1; - public CatenaryBrush(boolean shell, boolean select, double lengthFactor) { + private Vector pos1; + private Vector pos2; + private Vector vertex; + + public CatenaryBrush(boolean shell, boolean select, boolean direction, double lengthFactor) { this.shell = shell; this.select = select; + this.direction = direction; this.slack = lengthFactor; } @@ -32,8 +38,21 @@ public class CatenaryBrush implements Brush, ResettableTool { } return; } - Vector vertex = getVertex(pos1, pos2, slack); + if (this.vertex == null) { + vertex = getVertex(pos1, pos2, slack); + if (this.direction) { + BBC.BRUSH_CATENARY_DIRECTION.send(editSession.getPlayer(), 2); + return; + } + } else if (this.direction) { + Location loc = editSession.getPlayer().getPlayer().getLocation(); + Vector facing = loc.getDirection().normalize(); + Vector midpoint = pos1.add(pos2).divide(2); + Vector offset = midpoint.subtract(vertex); + vertex = midpoint.add(facing.multiply(offset.length())); + } List nodes = Arrays.asList(pos1, vertex, pos2); + vertex = null; editSession.drawSpline(pattern, nodes, 0, 0, 0, 10, size, !shell); if (!visual) { BBC.BRUSH_LINE_SECONDARY.send(editSession.getPlayer()); diff --git a/core/src/main/java/com/sk89q/worldedit/command/BrushCommands.java b/core/src/main/java/com/sk89q/worldedit/command/BrushCommands.java index 3e832772..5a829d0f 100644 --- a/core/src/main/java/com/sk89q/worldedit/command/BrushCommands.java +++ b/core/src/main/java/com/sk89q/worldedit/command/BrushCommands.java @@ -221,15 +221,16 @@ public class BrushCommands extends BrushProcessor { help = "Create a hanging line between two points.\n" + "The lengthFactor controls how long the line is\n" + "The -h flag creates only a shell\n" + - "The -s flag selects the clicked point after drawing\n", + "The -s flag selects the clicked point after drawing\n" + + "The -d flag sags the catenary toward the facing direction\n", min = 1, max = 3 ) @CommandPermissions("worldedit.brush.spline") - public BrushSettings catenaryBrush(Player player, EditSession editSession, LocalSession session, Pattern fill, @Optional("1.2") @Range(min=1) double lengthFactor, @Optional("0") double radius, @Switch('h') boolean shell, @Switch('s') boolean select, CommandContext context) throws WorldEditException { + public BrushSettings catenaryBrush(Player player, EditSession editSession, LocalSession session, Pattern fill, @Optional("1.2") @Range(min=1) double lengthFactor, @Optional("0") double radius, @Switch('h') boolean shell, @Switch('s') boolean select, @Switch('d') boolean facingDirection, CommandContext context) throws WorldEditException { getWorldEdit().checkMaxBrushRadius(radius); return set(session, context, - new CatenaryBrush(shell, select, lengthFactor)) + new CatenaryBrush(shell, select, facingDirection, lengthFactor)) .setSize(radius) .setFill(fill); }