Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -50,10 +50,12 @@
import com.sk89q.worldedit.internal.annotation.Direction;
import com.sk89q.worldedit.internal.annotation.MultiDirection;
import com.sk89q.worldedit.math.BlockVector3;
import com.sk89q.worldedit.regions.ConvexPolyhedralRegion;
import com.sk89q.worldedit.regions.CuboidRegion;
import com.sk89q.worldedit.regions.Region;
import com.sk89q.worldedit.regions.RegionOperationException;
import com.sk89q.worldedit.regions.RegionSelector;
import com.sk89q.worldedit.regions.selector.ConvexPolyhedralRegionSelector;
import com.sk89q.worldedit.regions.selector.CuboidRegionSelector;
import com.sk89q.worldedit.regions.selector.ExtendingCuboidRegionSelector;
import com.sk89q.worldedit.regions.selector.RegionSelectorType;
Expand Down Expand Up @@ -154,7 +156,27 @@ public void pos(Actor actor, World world, LocalSession session,
regionSelector.selectPrimary(pos1, ActorSelectorLimits.forActor(actor));

for (BlockVector3 vector : pos2) {
regionSelector.selectSecondary(vector, ActorSelectorLimits.forActor(actor));
boolean changed = regionSelector.selectSecondary(vector, ActorSelectorLimits.forActor(actor));
if (!changed && regionSelector instanceof ConvexPolyhedralRegionSelector) {
ConvexPolyhedralRegion convex = (ConvexPolyhedralRegion) regionSelector.getIncompleteRegion();
if (convex.getVertices().contains(vector)) {
actor.printInfo(TranslatableComponent.of(
"worldedit.selection.convex.error.duplicate",
TextComponent.of(vector.toString())
));
} else {
ActorSelectorLimits limits = ActorSelectorLimits.forActor(actor);
limits.getPolyhedronVertexLimit().ifPresent(limit -> {
int total = convex.getVertices().size();
if (total >= limit) {
actor.printInfo(TranslatableComponent.of(
"worldedit.select.convex.limit-message",
TextComponent.of(limit)
));
}
});
}
}
}

session.dispatchCUISelection(actor);
Expand Down Expand Up @@ -205,8 +227,30 @@ public void pos2(Actor actor, World world, LocalSession session,
}
}

if (!session.getRegionSelector(world).selectSecondary(coordinates, ActorSelectorLimits.forActor(actor))) {
actor.printError(TranslatableComponent.of("worldedit.pos.already-set"));
RegionSelector selector = session.getRegionSelector(world);
if (!selector.selectSecondary(coordinates, ActorSelectorLimits.forActor(actor))) {
if (selector instanceof ConvexPolyhedralRegionSelector) {
ConvexPolyhedralRegion convex = (ConvexPolyhedralRegion) selector.getIncompleteRegion();
if (convex.getVertices().contains(coordinates)) {
actor.printInfo(TranslatableComponent.of(
"worldedit.selection.convex.error.duplicate",
TextComponent.of(coordinates.toString())
));
} else {
ActorSelectorLimits limits = ActorSelectorLimits.forActor(actor);
limits.getPolyhedronVertexLimit().ifPresent(limit -> {
int total = convex.getVertices().size();
if (total >= limit) {
actor.printInfo(TranslatableComponent.of(
"worldedit.select.convex.limit-message",
TextComponent.of(limit)
));
}
});
}
} else {
actor.printError(TranslatableComponent.of("worldedit.pos.already-set"));
}
return;
}

Expand Down Expand Up @@ -245,8 +289,31 @@ public void hpos2(Player player, LocalSession session) {
Location pos = player.getBlockTrace(300);

if (pos != null) {
if (!session.getRegionSelector(player.getWorld()).selectSecondary(pos.toVector().toBlockPoint(), ActorSelectorLimits.forActor(player))) {
player.printError(TranslatableComponent.of("worldedit.hpos.already-set"));
RegionSelector selector = session.getRegionSelector(player.getWorld());
BlockVector3 bp = pos.toVector().toBlockPoint();
if (!selector.selectSecondary(bp, ActorSelectorLimits.forActor(player))) {
if (selector instanceof ConvexPolyhedralRegionSelector) {
ConvexPolyhedralRegion convex = (ConvexPolyhedralRegion) selector.getIncompleteRegion();
if (convex.getVertices().contains(bp)) {
player.printInfo(TranslatableComponent.of(
"worldedit.selection.convex.error.duplicate",
TextComponent.of(bp.toString())
));
} else {
ActorSelectorLimits limits = ActorSelectorLimits.forActor(player);
limits.getPolyhedronVertexLimit().ifPresent(limit -> {
int total = convex.getVertices().size();
if (total >= limit) {
player.printInfo(TranslatableComponent.of(
"worldedit.select.convex.limit-message",
TextComponent.of(limit)
));
}
});
}
} else {
player.printError(TranslatableComponent.of("worldedit.hpos.already-set"));
}
return;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,8 +26,11 @@
import com.sk89q.worldedit.extension.platform.permission.ActorSelectorLimits;
import com.sk89q.worldedit.function.mask.Mask;
import com.sk89q.worldedit.math.BlockVector3;
import com.sk89q.worldedit.regions.ConvexPolyhedralRegion;
import com.sk89q.worldedit.regions.RegionSelector;
import com.sk89q.worldedit.regions.selector.ConvexPolyhedralRegionSelector;
import com.sk89q.worldedit.util.Location;
import com.sk89q.worldedit.util.formatting.text.TextComponent;
import com.sk89q.worldedit.util.formatting.text.TranslatableComponent;

/**
Expand Down Expand Up @@ -65,6 +68,27 @@ public boolean actPrimary(Platform server, LocalConfiguration config, Player pla
BlockVector3 blockPoint = target.toVector().toBlockPoint();
if (selector.selectSecondary(blockPoint, ActorSelectorLimits.forActor(player))) {
selector.explainSecondarySelection(player, session, blockPoint);
} else if (selector instanceof ConvexPolyhedralRegionSelector) {
ConvexPolyhedralRegion convex = (ConvexPolyhedralRegion) selector.getIncompleteRegion();

if (convex.getVertices().contains(blockPoint)) {
player.printInfo(TranslatableComponent.of(
"worldedit.selection.convex.error.duplicate",
TextComponent.of(blockPoint.toString())
));
return true;
}

ActorSelectorLimits limits = ActorSelectorLimits.forActor(player);
limits.getPolyhedronVertexLimit().ifPresent(limit -> {
int total = convex.getVertices().size();
if (total >= limit) {
player.printInfo(TranslatableComponent.of(
"worldedit.select.convex.limit-message",
TextComponent.of(limit)
));
}
});
}
return true;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,9 +26,13 @@
import com.sk89q.worldedit.extension.platform.Platform;
import com.sk89q.worldedit.extension.platform.permission.ActorSelectorLimits;
import com.sk89q.worldedit.math.BlockVector3;
import com.sk89q.worldedit.regions.ConvexPolyhedralRegion;
import com.sk89q.worldedit.regions.RegionSelector;
import com.sk89q.worldedit.regions.selector.ConvexPolyhedralRegionSelector;
import com.sk89q.worldedit.util.Direction;
import com.sk89q.worldedit.util.Location;
import com.sk89q.worldedit.util.formatting.text.TextComponent;
import com.sk89q.worldedit.util.formatting.text.TranslatableComponent;

import javax.annotation.Nullable;

Expand All @@ -52,6 +56,27 @@ public boolean actPrimary(Platform server, LocalConfiguration config, Player pla

if (selector.selectSecondary(blockPoint, ActorSelectorLimits.forActor(player))) {
selector.explainSecondarySelection(player, session, blockPoint);
} else if (selector instanceof ConvexPolyhedralRegionSelector) {
ConvexPolyhedralRegion convex = (ConvexPolyhedralRegion) selector.getIncompleteRegion();

if (convex.getVertices().contains(blockPoint)) {
player.printInfo(TranslatableComponent.of(
"worldedit.selection.convex.error.duplicate",
TextComponent.of(blockPoint.toString())
));
return true;
}

ActorSelectorLimits limits = ActorSelectorLimits.forActor(player);
limits.getPolyhedronVertexLimit().ifPresent(limit -> {
int total = convex.getVertices().size();
if (total >= limit) {
player.printInfo(TranslatableComponent.of(
"worldedit.select.convex.limit-message",
TextComponent.of(limit)
));
}
});
}
return true;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -338,6 +338,14 @@ public Collection<BlockVector3> getVertices() {
return ret;
}

public boolean isBacklogVertex(BlockVector3 vertex) {
return vertexBacklog.contains(vertex);
}

public Collection<BlockVector3> getBacklogVertices() {
return new ArrayList<>(vertexBacklog);
}

public Collection<Triangle> getTriangles() {
return triangles;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -131,7 +131,7 @@ public boolean selectSecondary(BlockVector3 position, SelectorLimits limits) {

Optional<Integer> vertexLimit = limits.getPolyhedronVertexLimit();

if (vertexLimit.isPresent() && region.getVertices().size() > vertexLimit.get()) {
if (vertexLimit.isPresent() && region.getVertices().size() >= vertexLimit.get()) {
return false;
}

Expand Down Expand Up @@ -169,7 +169,12 @@ public long getVolume() {

@Override
public void learnChanges() {
pos1 = region.getVertices().iterator().next();
if (!region.getTriangles().isEmpty()) {
Triangle t = region.getTriangles().iterator().next();
pos1 = t.getVertex(0).toBlockPoint();
} else {
pos1 = region.getVertices().iterator().next();
}
}

@Override
Expand All @@ -186,8 +191,20 @@ public String getTypeName() {
public List<Component> getSelectionInfoLines() {
List<Component> ret = new ArrayList<>();

ret.add(TranslatableComponent.of("worldedit.selection.convex.info.vertices", TextComponent.of(region.getVertices().size())));
ret.add(TranslatableComponent.of("worldedit.selection.convex.info.triangles", TextComponent.of(region.getTriangles().size())));
int vertexCount = region.getVertices().size();
int triangleCount = region.getTriangles().size();
ret.add(TranslatableComponent.of("worldedit.selection.convex.info.vertices", TextComponent.of(vertexCount)));
ret.add(TranslatableComponent.of("worldedit.selection.convex.info.triangles", TextComponent.of(triangleCount)));

if (triangleCount == 0) {
if (vertexCount < 3) {
ret.add(TranslatableComponent.of("worldedit.selection.convex.error.too-few"));
} else {
ret.add(TranslatableComponent.of("worldedit.selection.convex.error.all-collinear"));
}
} else if (triangleCount == 2) {
ret.add(TranslatableComponent.of("worldedit.selection.convex.info.planar"));
}

return ret;
}
Expand All @@ -212,7 +229,25 @@ public void explainSecondarySelection(Actor player, LocalSession session, BlockV

session.describeCUI(player);

player.printInfo(TranslatableComponent.of("worldedit.selection.convex.explain.secondary", TextComponent.of(pos.toString())));
if (region.isBacklogVertex(pos)) {
if (region.getTriangles().isEmpty()) {
player.printInfo(TranslatableComponent.of(
"worldedit.selection.convex.info.backlog.collinear",
TextComponent.of(pos.toString())
));
} else {
player.printInfo(TranslatableComponent.of(
"worldedit.selection.convex.info.backlog.coplanar",
TextComponent.of(pos.toString())
));
}
} else {
player.printInfo(TranslatableComponent.of("worldedit.selection.convex.explain.secondary", TextComponent.of(pos.toString())));
}

if (!region.isDefined() && region.getVertices().size() >= 3) {
player.printInfo(TranslatableComponent.of("worldedit.selection.convex.error.all-collinear"));
}
}

@Override
Expand Down
6 changes: 6 additions & 0 deletions worldedit-core/src/main/resources/lang/strings.json
Original file line number Diff line number Diff line change
Expand Up @@ -419,6 +419,12 @@
"worldedit.selection.convex.info.triangles": "Triangles: {0}",
"worldedit.selection.convex.explain.primary": "Started new selection with vertex {0}.",
"worldedit.selection.convex.explain.secondary": "Added vertex {0} to the selection.",
"worldedit.selection.convex.info.backlog.collinear": "Point is collinear with existing vertices, added to backlog ({0}).",
"worldedit.selection.convex.info.backlog.coplanar": "Point is coplanar with existing vertices, added to backlog ({0}).",
"worldedit.selection.convex.error.duplicate": "Vertex already exists at {0}.",
"worldedit.selection.convex.error.all-collinear": "Cannot form a region with only collinear points.",
"worldedit.selection.convex.info.planar": "Selection is planar (2D), add a non-coplanar point for 3D volume.",
"worldedit.selection.convex.error.too-few": "Need at least 3 non-collinear vertices to define a region.",
"worldedit.selection.cuboid.info.pos1": "Position 1: {0}",
"worldedit.selection.cuboid.info.pos2": "Position 2: {0}",
"worldedit.selection.cuboid.explain.primary": "First position set to {0}.",
Expand Down
Loading
Loading