Refactor RegionSelectors so limits are passed in during selection.

This commit is contained in:
sk89q 2014-07-28 19:50:01 -07:00
parent 683bd670fe
commit c2a0f590b1
25 changed files with 528 additions and 400 deletions

View File

@ -19,13 +19,14 @@
package com.sk89q.worldedit.bukkit.selections; package com.sk89q.worldedit.bukkit.selections;
import com.sk89q.worldedit.regions.selector.CuboidRegionSelector;
import com.sk89q.worldedit.regions.RegionSelector;
import org.bukkit.Location;
import org.bukkit.World;
import com.sk89q.worldedit.Vector; import com.sk89q.worldedit.Vector;
import com.sk89q.worldedit.bukkit.BukkitUtil; import com.sk89q.worldedit.bukkit.BukkitUtil;
import com.sk89q.worldedit.regions.*; import com.sk89q.worldedit.regions.CuboidRegion;
import com.sk89q.worldedit.regions.RegionSelector;
import com.sk89q.worldedit.regions.selector.CuboidRegionSelector;
import com.sk89q.worldedit.regions.selector.limit.PermissiveSelectorLimits;
import org.bukkit.Location;
import org.bukkit.World;
public class CuboidSelection extends RegionSelection { public class CuboidSelection extends RegionSelection {
@ -51,8 +52,8 @@ public class CuboidSelection extends RegionSelection {
CuboidRegionSelector sel = new CuboidRegionSelector(BukkitUtil.getLocalWorld(world)); CuboidRegionSelector sel = new CuboidRegionSelector(BukkitUtil.getLocalWorld(world));
// set up selector // set up selector
sel.selectPrimary(pt1); sel.selectPrimary(pt1, PermissiveSelectorLimits.getInstance());
sel.selectSecondary(pt2); sel.selectSecondary(pt2, PermissiveSelectorLimits.getInstance());
// set up CuboidSelection // set up CuboidSelection
cuboid = sel.getIncompleteRegion(); cuboid = sel.getIncompleteRegion();

View File

@ -0,0 +1,44 @@
/*
* WorldEdit, a Minecraft world manipulation toolkit
* Copyright (C) sk89q <http://www.sk89q.com>
* 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 <http://www.gnu.org/licenses/>.
*/
package com.sk89q.worldedit.regions;
import com.sk89q.worldedit.LocalPlayer;
import com.sk89q.worldedit.LocalSession;
import com.sk89q.worldedit.Vector;
import com.sk89q.worldedit.extension.platform.Actor;
abstract class AbstractLegacyRegionSelector implements RegionSelector {
@Deprecated
public final void explainPrimarySelection(LocalPlayer player, LocalSession session, Vector position) {
explainPrimarySelection((Actor) player, session, position);
}
@Deprecated
public final void explainSecondarySelection(LocalPlayer player, LocalSession session, Vector position) {
explainSecondarySelection((Actor) player, session, position);
}
@Deprecated
public final void explainRegionAdjust(LocalPlayer player, LocalSession session) {
explainRegionAdjust((Actor) player, session);
}
}

View File

@ -25,5 +25,5 @@ import com.sk89q.worldedit.internal.cui.CUIRegion;
* @deprecated This class only exists as to not break binary compatibility * @deprecated This class only exists as to not break binary compatibility
*/ */
@Deprecated @Deprecated
public abstract class ConvexPolyhedralRegionSelector implements RegionSelector, CUIRegion { public abstract class ConvexPolyhedralRegionSelector extends AbstractLegacyRegionSelector implements CUIRegion {
} }

View File

@ -25,5 +25,5 @@ import com.sk89q.worldedit.internal.cui.CUIRegion;
* @deprecated This class only exists as to not break binary compatibility * @deprecated This class only exists as to not break binary compatibility
*/ */
@Deprecated @Deprecated
public abstract class CuboidRegionSelector implements RegionSelector, CUIRegion { public abstract class CuboidRegionSelector extends AbstractLegacyRegionSelector implements CUIRegion {
} }

View File

@ -25,5 +25,5 @@ import com.sk89q.worldedit.internal.cui.CUIRegion;
* @deprecated This class only exists as to not break binary compatibility * @deprecated This class only exists as to not break binary compatibility
*/ */
@Deprecated @Deprecated
public abstract class CylinderRegionSelector implements RegionSelector, CUIRegion { public abstract class CylinderRegionSelector extends AbstractLegacyRegionSelector implements CUIRegion {
} }

View File

@ -25,5 +25,5 @@ import com.sk89q.worldedit.internal.cui.CUIRegion;
* @deprecated This class only exists as to not break binary compatibility * @deprecated This class only exists as to not break binary compatibility
*/ */
@Deprecated @Deprecated
public abstract class EllipsoidRegionSelector implements RegionSelector, CUIRegion { public abstract class EllipsoidRegionSelector extends AbstractLegacyRegionSelector implements CUIRegion {
} }

View File

@ -19,9 +19,11 @@
package com.sk89q.worldedit.regions; package com.sk89q.worldedit.regions;
import com.sk89q.worldedit.internal.cui.CUIRegion;
/** /**
* @deprecated This class only exists as to not break binary compatibility * @deprecated This class only exists as to not break binary compatibility
*/ */
@Deprecated @Deprecated
public abstract class ExtendingCuboidRegionSelector extends CuboidRegionSelector { public abstract class ExtendingCuboidRegionSelector extends AbstractLegacyRegionSelector implements CUIRegion {
} }

View File

@ -25,7 +25,7 @@ import com.sk89q.worldedit.internal.cui.CUIRegion;
* @deprecated This class only exists as to not break binary compatibility * @deprecated This class only exists as to not break binary compatibility
*/ */
@Deprecated @Deprecated
public abstract class Polygonal2DRegionSelector implements RegionSelector, CUIRegion { public abstract class Polygonal2DRegionSelector extends AbstractLegacyRegionSelector implements CUIRegion {
/** /**
* Get the number of points. * Get the number of points.

View File

@ -19,9 +19,11 @@
package com.sk89q.worldedit.regions; package com.sk89q.worldedit.regions;
import com.sk89q.worldedit.internal.cui.CUIRegion;
/** /**
* @deprecated This class only exists as to not break binary compatibility * @deprecated This class only exists as to not break binary compatibility
*/ */
@Deprecated @Deprecated
public abstract class SphereRegionSelector extends EllipsoidRegionSelector { public abstract class SphereRegionSelector extends AbstractLegacyRegionSelector implements CUIRegion {
} }

View File

@ -412,30 +412,6 @@ public class WorldEdit {
} }
} }
public int getMaximumPolygonalPoints(Player player) {
if (player.hasPermission("worldedit.limit.unrestricted") || getConfiguration().maxPolygonalPoints < 0) {
return getConfiguration().defaultMaxPolygonalPoints;
}
if (getConfiguration().defaultMaxPolygonalPoints < 0) {
return getConfiguration().maxPolygonalPoints;
}
return Math.min(getConfiguration().defaultMaxPolygonalPoints, getConfiguration().maxPolygonalPoints);
}
public int getMaximumPolyhedronPoints(Player player) {
if (player.hasPermission("worldedit.limit.unrestricted") || getConfiguration().maxPolyhedronPoints < 0) {
return getConfiguration().defaultMaxPolyhedronPoints;
}
if (getConfiguration().defaultMaxPolyhedronPoints < 0) {
return getConfiguration().maxPolyhedronPoints;
}
return Math.min(getConfiguration().defaultMaxPolyhedronPoints, getConfiguration().maxPolyhedronPoints);
}
/** /**
* Checks to see if the specified radius is within bounds. * Checks to see if the specified radius is within bounds.
* *

View File

@ -19,6 +19,7 @@
package com.sk89q.worldedit.command; package com.sk89q.worldedit.command;
import com.google.common.base.Optional;
import com.sk89q.minecraft.util.commands.Command; import com.sk89q.minecraft.util.commands.Command;
import com.sk89q.minecraft.util.commands.CommandContext; import com.sk89q.minecraft.util.commands.CommandContext;
import com.sk89q.minecraft.util.commands.CommandException; import com.sk89q.minecraft.util.commands.CommandException;
@ -33,6 +34,7 @@ import com.sk89q.worldedit.WorldEditException;
import com.sk89q.worldedit.blocks.BaseBlock; import com.sk89q.worldedit.blocks.BaseBlock;
import com.sk89q.worldedit.blocks.BlockType; import com.sk89q.worldedit.blocks.BlockType;
import com.sk89q.worldedit.entity.Player; import com.sk89q.worldedit.entity.Player;
import com.sk89q.worldedit.extension.platform.permission.ActorSelectorLimits;
import com.sk89q.worldedit.extent.clipboard.Clipboard; import com.sk89q.worldedit.extent.clipboard.Clipboard;
import com.sk89q.worldedit.regions.Region; import com.sk89q.worldedit.regions.Region;
import com.sk89q.worldedit.regions.RegionOperationException; import com.sk89q.worldedit.regions.RegionOperationException;
@ -93,7 +95,7 @@ public class SelectionCommands {
pos = player.getBlockIn(); pos = player.getBlockIn();
} }
if (!session.getRegionSelector(player.getWorld()).selectPrimary(pos)) { if (!session.getRegionSelector(player.getWorld()).selectPrimary(pos, ActorSelectorLimits.forActor(player))) {
player.printError("Position already set."); player.printError("Position already set.");
return; return;
} }
@ -128,7 +130,7 @@ public class SelectionCommands {
pos = player.getBlockIn(); pos = player.getBlockIn();
} }
if (!session.getRegionSelector(player.getWorld()).selectSecondary(pos)) { if (!session.getRegionSelector(player.getWorld()).selectSecondary(pos, ActorSelectorLimits.forActor(player))) {
player.printError("Position already set."); player.printError("Position already set.");
return; return;
} }
@ -150,8 +152,7 @@ public class SelectionCommands {
Vector pos = player.getBlockTrace(300); Vector pos = player.getBlockTrace(300);
if (pos != null) { if (pos != null) {
if (!session.getRegionSelector(player.getWorld()) if (!session.getRegionSelector(player.getWorld()).selectPrimary(pos, ActorSelectorLimits.forActor(player))) {
.selectPrimary(pos)) {
player.printError("Position already set."); player.printError("Position already set.");
return; return;
} }
@ -176,8 +177,7 @@ public class SelectionCommands {
Vector pos = player.getBlockTrace(300); Vector pos = player.getBlockTrace(300);
if (pos != null) { if (pos != null) {
if (!session.getRegionSelector(player.getWorld()) if (!session.getRegionSelector(player.getWorld()).selectSecondary(pos, ActorSelectorLimits.forActor(player))) {
.selectSecondary(pos)) {
player.printError("Position already set."); player.printError("Position already set.");
return; return;
} }
@ -208,7 +208,6 @@ public class SelectionCommands {
@Logging(POSITION) @Logging(POSITION)
@CommandPermissions("worldedit.selection.chunk") @CommandPermissions("worldedit.selection.chunk")
public void chunk(Player player, LocalSession session, EditSession editSession, CommandContext args) throws WorldEditException { public void chunk(Player player, LocalSession session, EditSession editSession, CommandContext args) throws WorldEditException {
final Vector min; final Vector min;
final Vector max; final Vector max;
final World world = player.getWorld(); final World world = player.getWorld();
@ -254,8 +253,8 @@ public class SelectionCommands {
} else { } else {
selector = new CuboidRegionSelector(world); selector = new CuboidRegionSelector(world);
} }
selector.selectPrimary(min); selector.selectPrimary(min, ActorSelectorLimits.forActor(player));
selector.selectSecondary(max); selector.selectSecondary(max, ActorSelectorLimits.forActor(player));
session.setRegionSelector(world, selector); session.setRegionSelector(world, selector);
session.dispatchCUISelection(player); session.dispatchCUISelection(player);
@ -732,11 +731,11 @@ public class SelectionCommands {
selector = new ExtendingCuboidRegionSelector(oldSelector); selector = new ExtendingCuboidRegionSelector(oldSelector);
player.print("Cuboid: left click for a starting point, right click to extend"); player.print("Cuboid: left click for a starting point, right click to extend");
} else if (typeName.equalsIgnoreCase("poly")) { } else if (typeName.equalsIgnoreCase("poly")) {
int maxPoints = we.getMaximumPolygonalPoints(player); selector = new Polygonal2DRegionSelector(oldSelector);
selector = new Polygonal2DRegionSelector(oldSelector, maxPoints);
player.print("2D polygon selector: Left/right click to add a point."); player.print("2D polygon selector: Left/right click to add a point.");
if (maxPoints > -1) { Optional<Integer> limit = ActorSelectorLimits.forActor(player).getPolygonVertexLimit();
player.print(maxPoints + " points maximum."); if (limit.isPresent()) {
player.print(limit.get() + " points maximum.");
} }
} else if (typeName.equalsIgnoreCase("ellipsoid")) { } else if (typeName.equalsIgnoreCase("ellipsoid")) {
selector = new EllipsoidRegionSelector(oldSelector); selector = new EllipsoidRegionSelector(oldSelector);
@ -748,9 +747,12 @@ public class SelectionCommands {
selector = new CylinderRegionSelector(oldSelector); selector = new CylinderRegionSelector(oldSelector);
player.print("Cylindrical selector: Left click=center, right click to extend."); player.print("Cylindrical selector: Left click=center, right click to extend.");
} else if (typeName.equalsIgnoreCase("convex") || typeName.equalsIgnoreCase("hull") || typeName.equalsIgnoreCase("polyhedron")) { } else if (typeName.equalsIgnoreCase("convex") || typeName.equalsIgnoreCase("hull") || typeName.equalsIgnoreCase("polyhedron")) {
int maxVertices = we.getMaximumPolyhedronPoints(player); selector = new ConvexPolyhedralRegionSelector(oldSelector);
selector = new ConvexPolyhedralRegionSelector(oldSelector, maxVertices);
player.print("Convex polyhedral selector: Left click=First vertex, right click to add more."); player.print("Convex polyhedral selector: Left click=First vertex, right click to add more.");
Optional<Integer> limit = ActorSelectorLimits.forActor(player).getPolyhedronVertexLimit();
if (limit.isPresent()) {
player.print(limit.get() + " points maximum.");
}
} else { } else {
player.printError("Only cuboid|extend|poly|ellipsoid|sphere|cyl|convex are accepted."); player.printError("Only cuboid|extend|poly|ellipsoid|sphere|cyl|convex are accepted.");
return; return;

View File

@ -23,6 +23,7 @@ import com.sk89q.worldedit.*;
import com.sk89q.worldedit.entity.Player; import com.sk89q.worldedit.entity.Player;
import com.sk89q.worldedit.extension.platform.Actor; import com.sk89q.worldedit.extension.platform.Actor;
import com.sk89q.worldedit.extension.platform.Platform; import com.sk89q.worldedit.extension.platform.Platform;
import com.sk89q.worldedit.extension.platform.permission.ActorSelectorLimits;
import com.sk89q.worldedit.regions.RegionSelector; import com.sk89q.worldedit.regions.RegionSelector;
/** /**
@ -46,7 +47,7 @@ public class DistanceWand extends BrushTool implements DoubleActionTraceTool {
if (target == null) return true; if (target == null) return true;
RegionSelector selector = session.getRegionSelector(player.getWorld()); RegionSelector selector = session.getRegionSelector(player.getWorld());
if (selector.selectPrimary(target)) { if (selector.selectPrimary(target, ActorSelectorLimits.forActor(player))) {
selector.explainPrimarySelection(player, session, target); selector.explainPrimarySelection(player, session, target);
} }
return true; return true;
@ -63,7 +64,7 @@ public class DistanceWand extends BrushTool implements DoubleActionTraceTool {
if (target == null) return true; if (target == null) return true;
RegionSelector selector = session.getRegionSelector(player.getWorld()); RegionSelector selector = session.getRegionSelector(player.getWorld());
if (selector.selectSecondary(target)) { if (selector.selectSecondary(target, ActorSelectorLimits.forActor(player))) {
selector.explainSecondarySelection(player, session, target); selector.explainSecondarySelection(player, session, target);
} }
return true; return true;

View File

@ -37,6 +37,7 @@ import com.sk89q.worldedit.event.platform.Interaction;
import com.sk89q.worldedit.event.platform.PlatformInitializeEvent; import com.sk89q.worldedit.event.platform.PlatformInitializeEvent;
import com.sk89q.worldedit.event.platform.PlatformReadyEvent; import com.sk89q.worldedit.event.platform.PlatformReadyEvent;
import com.sk89q.worldedit.event.platform.PlayerInputEvent; import com.sk89q.worldedit.event.platform.PlayerInputEvent;
import com.sk89q.worldedit.extension.platform.permission.ActorSelectorLimits;
import com.sk89q.worldedit.internal.ServerInterfaceAdapter; import com.sk89q.worldedit.internal.ServerInterfaceAdapter;
import com.sk89q.worldedit.regions.RegionSelector; import com.sk89q.worldedit.regions.RegionSelector;
import com.sk89q.worldedit.util.Location; import com.sk89q.worldedit.util.Location;
@ -330,7 +331,7 @@ public class PlatformManager {
RegionSelector selector = session.getRegionSelector(player.getWorld()); RegionSelector selector = session.getRegionSelector(player.getWorld());
if (selector.selectPrimary(location.toVector())) { if (selector.selectPrimary(location.toVector(), ActorSelectorLimits.forActor(player))) {
selector.explainPrimarySelection(actor, session, vector); selector.explainPrimarySelection(actor, session, vector);
} }
@ -365,7 +366,7 @@ public class PlatformManager {
} }
RegionSelector selector = session.getRegionSelector(player.getWorld()); RegionSelector selector = session.getRegionSelector(player.getWorld());
if (selector.selectSecondary(vector)) { if (selector.selectSecondary(vector, ActorSelectorLimits.forActor(player))) {
selector.explainSecondarySelection(actor, session, vector); selector.explainSecondarySelection(actor, session, vector);
} }

View File

@ -0,0 +1,85 @@
/*
* WorldEdit, a Minecraft world manipulation toolkit
* Copyright (C) sk89q <http://www.sk89q.com>
* 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 <http://www.gnu.org/licenses/>.
*/
package com.sk89q.worldedit.extension.platform.permission;
import com.google.common.base.Optional;
import com.sk89q.worldedit.LocalConfiguration;
import com.sk89q.worldedit.WorldEdit;
import com.sk89q.worldedit.extension.platform.Actor;
import com.sk89q.worldedit.regions.selector.limit.SelectorLimits;
import static com.google.common.base.Preconditions.checkNotNull;
public class ActorSelectorLimits implements SelectorLimits {
private final LocalConfiguration configuration;
private final Actor actor;
public ActorSelectorLimits(LocalConfiguration configuration, Actor actor) {
checkNotNull(configuration);
checkNotNull(actor);
this.configuration = configuration;
this.actor = actor;
}
@Override
public Optional<Integer> getPolygonVertexLimit() {
int limit;
if (actor.hasPermission(OverridePermissions.NO_LIMITS) || configuration.maxPolygonalPoints < 0) {
limit = configuration.defaultMaxPolygonalPoints;
} else if (configuration.defaultMaxPolygonalPoints < 0) {
limit = configuration.maxPolygonalPoints;
} else {
limit = Math.min(configuration.defaultMaxPolygonalPoints, configuration.maxPolygonalPoints);
}
if (limit > 0) {
return Optional.of(limit);
} else {
return Optional.absent();
}
}
@Override
public Optional<Integer> getPolyhedronVertexLimit() {
int limit;
if (actor.hasPermission(OverridePermissions.NO_LIMITS) || configuration.maxPolyhedronPoints < 0) {
limit = configuration.defaultMaxPolyhedronPoints;
} else if (configuration.defaultMaxPolyhedronPoints < 0) {
limit = configuration.maxPolyhedronPoints;
} else {
limit = Math.min(configuration.defaultMaxPolyhedronPoints, configuration.maxPolyhedronPoints);
}
if (limit > 0) {
return Optional.of(limit);
} else {
return Optional.absent();
}
}
public static ActorSelectorLimits forActor(Actor actor) {
return new ActorSelectorLimits(WorldEdit.getInstance().getConfiguration(), actor);
}
}

View File

@ -0,0 +1,32 @@
/*
* WorldEdit, a Minecraft world manipulation toolkit
* Copyright (C) sk89q <http://www.sk89q.com>
* 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 <http://www.gnu.org/licenses/>.
*/
package com.sk89q.worldedit.extension.platform.permission;
/**
* Standard override permissions.
*/
public final class OverridePermissions {
public static final String NO_LIMITS = "worldedit.limit.unrestricted";
private OverridePermissions() {
}
}

View File

@ -19,8 +19,12 @@
package com.sk89q.worldedit.regions; package com.sk89q.worldedit.regions;
import com.sk89q.worldedit.*; import com.sk89q.worldedit.BlockVector;
import com.sk89q.worldedit.IncompleteRegionException;
import com.sk89q.worldedit.LocalSession;
import com.sk89q.worldedit.Vector;
import com.sk89q.worldedit.extension.platform.Actor; import com.sk89q.worldedit.extension.platform.Actor;
import com.sk89q.worldedit.regions.selector.limit.SelectorLimits;
import java.util.List; import java.util.List;
@ -37,7 +41,7 @@ public interface RegionSelector {
* @param position the position * @param position the position
* @return true if something changed * @return true if something changed
*/ */
public boolean selectPrimary(Vector position); public boolean selectPrimary(Vector position, SelectorLimits limits);
/** /**
* Called when the second point is selected. * Called when the second point is selected.
@ -45,7 +49,7 @@ public interface RegionSelector {
* @param position the position * @param position the position
* @return true if something changed * @return true if something changed
*/ */
public boolean selectSecondary(Vector position); public boolean selectSecondary(Vector position, SelectorLimits limits);
/** /**
* Tell the player information about his/her primary selection. * Tell the player information about his/her primary selection.
@ -56,9 +60,6 @@ public interface RegionSelector {
*/ */
public void explainPrimarySelection(Actor actor, LocalSession session, Vector position); public void explainPrimarySelection(Actor actor, LocalSession session, Vector position);
@Deprecated
public void explainPrimarySelection(LocalPlayer player, LocalSession session, Vector position);
/** /**
* Tell the player information about his/her secondary selection. * Tell the player information about his/her secondary selection.
* *
@ -68,9 +69,6 @@ public interface RegionSelector {
*/ */
public void explainSecondarySelection(Actor actor, LocalSession session, Vector position); public void explainSecondarySelection(Actor actor, LocalSession session, Vector position);
@Deprecated
public void explainSecondarySelection(LocalPlayer player, LocalSession session, Vector position);
/** /**
* The the player information about the region's changes. This may resend * The the player information about the region's changes. This may resend
* all the defining region information if needed. * all the defining region information if needed.
@ -80,9 +78,6 @@ public interface RegionSelector {
*/ */
public void explainRegionAdjust(Actor actor, LocalSession session); public void explainRegionAdjust(Actor actor, LocalSession session);
@Deprecated
public void explainRegionAdjust(LocalPlayer player, LocalSession session);
/** /**
* Get the primary position. * Get the primary position.
* *

View File

@ -19,12 +19,11 @@
package com.sk89q.worldedit.regions.selector; package com.sk89q.worldedit.regions.selector;
import com.google.common.base.Optional;
import com.sk89q.worldedit.BlockVector; import com.sk89q.worldedit.BlockVector;
import com.sk89q.worldedit.BlockVector2D; import com.sk89q.worldedit.BlockVector2D;
import com.sk89q.worldedit.IncompleteRegionException; import com.sk89q.worldedit.IncompleteRegionException;
import com.sk89q.worldedit.LocalPlayer;
import com.sk89q.worldedit.LocalSession; import com.sk89q.worldedit.LocalSession;
import com.sk89q.worldedit.LocalWorld;
import com.sk89q.worldedit.Vector; import com.sk89q.worldedit.Vector;
import com.sk89q.worldedit.extension.platform.Actor; import com.sk89q.worldedit.extension.platform.Actor;
import com.sk89q.worldedit.internal.cui.CUIRegion; import com.sk89q.worldedit.internal.cui.CUIRegion;
@ -34,6 +33,7 @@ import com.sk89q.worldedit.regions.ConvexPolyhedralRegion;
import com.sk89q.worldedit.regions.Region; import com.sk89q.worldedit.regions.Region;
import com.sk89q.worldedit.regions.RegionSelector; import com.sk89q.worldedit.regions.RegionSelector;
import com.sk89q.worldedit.regions.polyhedron.Triangle; import com.sk89q.worldedit.regions.polyhedron.Triangle;
import com.sk89q.worldedit.regions.selector.limit.SelectorLimits;
import com.sk89q.worldedit.world.World; import com.sk89q.worldedit.world.World;
import javax.annotation.Nullable; import javax.annotation.Nullable;
@ -46,30 +46,26 @@ import java.util.Map;
import static com.google.common.base.Preconditions.checkNotNull; import static com.google.common.base.Preconditions.checkNotNull;
/** /**
* A {@link RegionSelector} for {@link ConvexPolyhedralRegion}s. * Creates a {@code ConvexPolyhedralRegion} from a user's selections.
*/ */
public class ConvexPolyhedralRegionSelector extends com.sk89q.worldedit.regions.ConvexPolyhedralRegionSelector implements RegionSelector, CUIRegion { public class ConvexPolyhedralRegionSelector extends com.sk89q.worldedit.regions.ConvexPolyhedralRegionSelector implements RegionSelector, CUIRegion {
private int maxVertices;
private final ConvexPolyhedralRegion region; private final ConvexPolyhedralRegion region;
private BlockVector pos1; private BlockVector pos1;
/** /**
* @deprecated cast {@code world} to {@link World} * Create a new selector with a {@code null} world.
*/ */
@Deprecated public ConvexPolyhedralRegionSelector() {
public ConvexPolyhedralRegionSelector(@Nullable LocalWorld world, int maxVertices) { this((World) null);
this((World) world, maxVertices);
} }
/** /**
* Create a new selector. * Create a new selector.
* *
* @param world the world * @param world the world, which may be {@code null}
* @param maxVertices the maximum number of vertices, where a number below 0 means unbounded
*/ */
public ConvexPolyhedralRegionSelector(@Nullable World world, int maxVertices) { public ConvexPolyhedralRegionSelector(@Nullable World world) {
this.maxVertices = maxVertices;
region = new ConvexPolyhedralRegion(world); region = new ConvexPolyhedralRegion(world);
} }
@ -77,12 +73,10 @@ public class ConvexPolyhedralRegionSelector extends com.sk89q.worldedit.regions.
* Create a new selector. * Create a new selector.
* *
* @param oldSelector the old selector * @param oldSelector the old selector
* @param maxVertices the maximum number of vertices, where a number below 0 means unbounded
*/ */
public ConvexPolyhedralRegionSelector(RegionSelector oldSelector, int maxVertices) { public ConvexPolyhedralRegionSelector(RegionSelector oldSelector) {
checkNotNull(oldSelector); checkNotNull(oldSelector);
this.maxVertices = maxVertices;
if (oldSelector instanceof ConvexPolyhedralRegionSelector) { if (oldSelector instanceof ConvexPolyhedralRegionSelector) {
final ConvexPolyhedralRegionSelector convexPolyhedralRegionSelector = (ConvexPolyhedralRegionSelector) oldSelector; final ConvexPolyhedralRegionSelector convexPolyhedralRegionSelector = (ConvexPolyhedralRegionSelector) oldSelector;
@ -102,7 +96,7 @@ public class ConvexPolyhedralRegionSelector extends com.sk89q.worldedit.regions.
region = new ConvexPolyhedralRegion(oldRegion.getWorld()); region = new ConvexPolyhedralRegion(oldRegion.getWorld());
for (final BlockVector2D pt : new ArrayList<BlockVector2D>(oldRegion.polygonize(maxVertices < 0 ? maxVertices : maxVertices / 2))) { for (final BlockVector2D pt : new ArrayList<BlockVector2D>(oldRegion.polygonize(Integer.MAX_VALUE))) {
region.addVertex(pt.toVector(minY)); region.addVertex(pt.toVector(minY));
region.addVertex(pt.toVector(maxY)); region.addVertex(pt.toVector(maxY));
} }
@ -112,19 +106,24 @@ public class ConvexPolyhedralRegionSelector extends com.sk89q.worldedit.regions.
} }
@Override @Override
public boolean selectPrimary(Vector pos) { public boolean selectPrimary(Vector position, SelectorLimits limits) {
checkNotNull(position);
clear(); clear();
pos1 = pos.toBlockVector(); pos1 = position.toBlockVector();
return region.addVertex(pos); return region.addVertex(position);
} }
@Override @Override
public boolean selectSecondary(Vector pos) { public boolean selectSecondary(Vector position, SelectorLimits limits) {
if (maxVertices >= 0 && region.getVertices().size() > maxVertices) { checkNotNull(position);
Optional<Integer> vertexLimit = limits.getPolyhedronVertexLimit();
if (vertexLimit.isPresent() && region.getVertices().size() > vertexLimit.get()) {
return false; return false;
} }
return region.addVertex(pos); return region.addVertex(position);
} }
@Override @Override
@ -184,6 +183,10 @@ public class ConvexPolyhedralRegionSelector extends com.sk89q.worldedit.regions.
@Override @Override
public void explainPrimarySelection(Actor player, LocalSession session, Vector pos) { public void explainPrimarySelection(Actor player, LocalSession session, Vector pos) {
checkNotNull(player);
checkNotNull(session);
checkNotNull(pos);
session.describeCUI(player); session.describeCUI(player);
player.print("Started new selection with vertex "+pos+"."); player.print("Started new selection with vertex "+pos+".");
@ -191,17 +194,22 @@ public class ConvexPolyhedralRegionSelector extends com.sk89q.worldedit.regions.
@Override @Override
public void explainSecondarySelection(Actor player, LocalSession session, Vector pos) { public void explainSecondarySelection(Actor player, LocalSession session, Vector pos) {
checkNotNull(player);
checkNotNull(session);
checkNotNull(pos);
session.describeCUI(player); session.describeCUI(player);
player.print("Added vertex "+pos+" to the selection."); player.print("Added vertex " + pos + " to the selection.");
} }
@Override @Override
public void explainRegionAdjust(Actor player, LocalSession session) { public void explainRegionAdjust(Actor player, LocalSession session) {
checkNotNull(player);
checkNotNull(session);
session.describeCUI(player); session.describeCUI(player);
} }
@Override @Override
public int getProtocolVersion() { public int getProtocolVersion() {
return 3; return 3;
@ -214,6 +222,9 @@ public class ConvexPolyhedralRegionSelector extends com.sk89q.worldedit.regions.
@Override @Override
public void describeCUI(LocalSession session, Actor player) { public void describeCUI(LocalSession session, Actor player) {
checkNotNull(player);
checkNotNull(session);
Collection<Vector> vertices = region.getVertices(); Collection<Vector> vertices = region.getVertices();
Collection<Triangle> triangles = region.getTriangles(); Collection<Triangle> triangles = region.getTriangles();
@ -240,25 +251,13 @@ public class ConvexPolyhedralRegionSelector extends com.sk89q.worldedit.regions.
@Override @Override
public void describeLegacyCUI(LocalSession session, Actor player) { public void describeLegacyCUI(LocalSession session, Actor player) {
checkNotNull(player);
checkNotNull(session);
if (isDefined()) { if (isDefined()) {
session.dispatchCUIEvent(player, new SelectionPointEvent(0, region.getMinimumPoint(), getArea())); session.dispatchCUIEvent(player, new SelectionPointEvent(0, region.getMinimumPoint(), getArea()));
session.dispatchCUIEvent(player, new SelectionPointEvent(1, region.getMaximumPoint(), getArea())); session.dispatchCUIEvent(player, new SelectionPointEvent(1, region.getMaximumPoint(), getArea()));
} }
} }
@Override
public void explainPrimarySelection(LocalPlayer player, LocalSession session, Vector position) {
explainPrimarySelection((Actor) player, session, position);
}
@Override
public void explainSecondarySelection(LocalPlayer player, LocalSession session, Vector position) {
explainSecondarySelection((Actor) player, session, position);
}
@Override
public void explainRegionAdjust(LocalPlayer player, LocalSession session) {
explainRegionAdjust((Actor) player, session);
}
} }

View File

@ -26,6 +26,7 @@ import com.sk89q.worldedit.internal.cui.SelectionPointEvent;
import com.sk89q.worldedit.regions.CuboidRegion; import com.sk89q.worldedit.regions.CuboidRegion;
import com.sk89q.worldedit.regions.Region; import com.sk89q.worldedit.regions.Region;
import com.sk89q.worldedit.regions.RegionSelector; import com.sk89q.worldedit.regions.RegionSelector;
import com.sk89q.worldedit.regions.selector.limit.SelectorLimits;
import com.sk89q.worldedit.world.World; import com.sk89q.worldedit.world.World;
import javax.annotation.Nullable; import javax.annotation.Nullable;
@ -35,33 +36,25 @@ import java.util.List;
import static com.google.common.base.Preconditions.checkNotNull; import static com.google.common.base.Preconditions.checkNotNull;
/** /**
* A {@link RegionSelector} for {@link CuboidRegion}s. * Creates a {@code CuboidRegion} from a user's selections.
*/ */
public class CuboidRegionSelector extends com.sk89q.worldedit.regions.CuboidRegionSelector implements RegionSelector, CUIRegion { public class CuboidRegionSelector extends com.sk89q.worldedit.regions.CuboidRegionSelector implements RegionSelector, CUIRegion {
protected BlockVector pos1; protected BlockVector position1;
protected BlockVector pos2; protected BlockVector position2;
protected CuboidRegion region; protected CuboidRegion region;
/** /**
* Create a new region selector with no world. * Create a new region selector with a {@code null} world.
*/ */
public CuboidRegionSelector() { public CuboidRegionSelector() {
this((World) null); this((World) null);
} }
/**
* @deprecated cast {@code world} to {@link World}
*/
@Deprecated
public CuboidRegionSelector(@Nullable LocalWorld world) {
this((World) world);
}
/** /**
* Create a new region selector. * Create a new region selector.
* *
* @param world the world * @param world the world, which may be {@code null}
*/ */
public CuboidRegionSelector(@Nullable World world) { public CuboidRegionSelector(@Nullable World world) {
region = new CuboidRegion(world, new Vector(), new Vector()); region = new CuboidRegion(world, new Vector(), new Vector());
@ -74,11 +67,12 @@ public class CuboidRegionSelector extends com.sk89q.worldedit.regions.CuboidRegi
*/ */
public CuboidRegionSelector(RegionSelector oldSelector) { public CuboidRegionSelector(RegionSelector oldSelector) {
this(checkNotNull(oldSelector).getIncompleteRegion().getWorld()); this(checkNotNull(oldSelector).getIncompleteRegion().getWorld());
if (oldSelector instanceof CuboidRegionSelector) { if (oldSelector instanceof CuboidRegionSelector) {
final CuboidRegionSelector cuboidRegionSelector = (CuboidRegionSelector) oldSelector; final CuboidRegionSelector cuboidRegionSelector = (CuboidRegionSelector) oldSelector;
pos1 = cuboidRegionSelector.pos1; position1 = cuboidRegionSelector.position1;
pos2 = cuboidRegionSelector.pos2; position2 = cuboidRegionSelector.position2;
} else { } else {
final Region oldRegion; final Region oldRegion;
try { try {
@ -87,67 +81,67 @@ public class CuboidRegionSelector extends com.sk89q.worldedit.regions.CuboidRegi
return; return;
} }
pos1 = oldRegion.getMinimumPoint().toBlockVector(); position1 = oldRegion.getMinimumPoint().toBlockVector();
pos2 = oldRegion.getMaximumPoint().toBlockVector(); position2 = oldRegion.getMaximumPoint().toBlockVector();
} }
region.setPos1(pos1); region.setPos1(position1);
region.setPos2(pos2); region.setPos2(position2);
}
/**
* @deprecated cast {@code world} to {@link World}
*/
@Deprecated
public CuboidRegionSelector(@Nullable LocalWorld world, Vector pos1, Vector pos2) {
this((World) world, pos1, pos2);
} }
/** /**
* Create a new region selector with the given two positions. * Create a new region selector with the given two positions.
* *
* @param world the world * @param world the world
* @param pos1 position 1 * @param position1 position 1
* @param pos2 position 2 * @param position2 position 2
*/ */
public CuboidRegionSelector(@Nullable World world, Vector pos1, Vector pos2) { public CuboidRegionSelector(@Nullable World world, Vector position1, Vector position2) {
this(world); this(world);
checkNotNull(pos1); checkNotNull(position1);
checkNotNull(pos2); checkNotNull(position2);
this.pos1 = pos1.toBlockVector(); this.position1 = position1.toBlockVector();
this.pos2 = pos2.toBlockVector(); this.position2 = position2.toBlockVector();
region.setPos1(pos1); region.setPos1(position1);
region.setPos2(pos2); region.setPos2(position2);
} }
@Override @Override
public boolean selectPrimary(Vector pos) { public boolean selectPrimary(Vector position, SelectorLimits limits) {
if (pos1 != null && (pos.compareTo(pos1) == 0)) { checkNotNull(position);
if (position1 != null && (position.compareTo(position1) == 0)) {
return false; return false;
} }
pos1 = pos.toBlockVector(); position1 = position.toBlockVector();
region.setPos1(pos1); region.setPos1(position1);
return true; return true;
} }
@Override @Override
public boolean selectSecondary(Vector pos) { public boolean selectSecondary(Vector position, SelectorLimits limits) {
if (pos2 != null && (pos.compareTo(pos2)) == 0) { checkNotNull(position);
if (position2 != null && (position.compareTo(position2)) == 0) {
return false; return false;
} }
pos2 = pos.toBlockVector(); position2 = position.toBlockVector();
region.setPos2(pos2); region.setPos2(position2);
return true; return true;
} }
@Override @Override
public void explainPrimarySelection(Actor player, LocalSession session, Vector pos) { public void explainPrimarySelection(Actor player, LocalSession session, Vector pos) {
if (pos1 != null && pos2 != null) { checkNotNull(player);
player.print("First position set to " + pos1 + " (" + region.getArea() + ")."); checkNotNull(session);
checkNotNull(pos);
if (position1 != null && position2 != null) {
player.print("First position set to " + position1 + " (" + region.getArea() + ").");
} else { } else {
player.print("First position set to " + pos1 + "."); player.print("First position set to " + position1 + ".");
} }
session.dispatchCUIEvent(player, new SelectionPointEvent(0, pos, getArea())); session.dispatchCUIEvent(player, new SelectionPointEvent(0, pos, getArea()));
@ -155,10 +149,14 @@ public class CuboidRegionSelector extends com.sk89q.worldedit.regions.CuboidRegi
@Override @Override
public void explainSecondarySelection(Actor player, LocalSession session, Vector pos) { public void explainSecondarySelection(Actor player, LocalSession session, Vector pos) {
if (pos1 != null && pos2 != null) { checkNotNull(player);
player.print("Second position set to " + pos2 + " (" + region.getArea() + ")."); checkNotNull(session);
checkNotNull(pos);
if (position1 != null && position2 != null) {
player.print("Second position set to " + position2 + " (" + region.getArea() + ").");
} else { } else {
player.print("Second position set to " + pos2 + "."); player.print("Second position set to " + position2 + ".");
} }
session.dispatchCUIEvent(player, new SelectionPointEvent(1, pos, getArea())); session.dispatchCUIEvent(player, new SelectionPointEvent(1, pos, getArea()));
@ -166,32 +164,35 @@ public class CuboidRegionSelector extends com.sk89q.worldedit.regions.CuboidRegi
@Override @Override
public void explainRegionAdjust(Actor player, LocalSession session) { public void explainRegionAdjust(Actor player, LocalSession session) {
if (pos1 != null) { checkNotNull(player);
session.dispatchCUIEvent(player, new SelectionPointEvent(0, pos1, getArea())); checkNotNull(session);
if (position1 != null) {
session.dispatchCUIEvent(player, new SelectionPointEvent(0, position1, getArea()));
} }
if (pos2 != null) { if (position2 != null) {
session.dispatchCUIEvent(player, new SelectionPointEvent(1, pos2, getArea())); session.dispatchCUIEvent(player, new SelectionPointEvent(1, position2, getArea()));
} }
} }
@Override @Override
public BlockVector getPrimaryPosition() throws IncompleteRegionException { public BlockVector getPrimaryPosition() throws IncompleteRegionException {
if (pos1 == null) { if (position1 == null) {
throw new IncompleteRegionException(); throw new IncompleteRegionException();
} }
return pos1; return position1;
} }
@Override @Override
public boolean isDefined() { public boolean isDefined() {
return pos1 != null && pos2 != null; return position1 != null && position2 != null;
} }
@Override @Override
public CuboidRegion getRegion() throws IncompleteRegionException { public CuboidRegion getRegion() throws IncompleteRegionException {
if (pos1 == null || pos2 == null) { if (position1 == null || position2 == null) {
throw new IncompleteRegionException(); throw new IncompleteRegionException();
} }
@ -205,14 +206,14 @@ public class CuboidRegionSelector extends com.sk89q.worldedit.regions.CuboidRegi
@Override @Override
public void learnChanges() { public void learnChanges() {
pos1 = region.getPos1().toBlockVector(); position1 = region.getPos1().toBlockVector();
pos2 = region.getPos2().toBlockVector(); position2 = region.getPos2().toBlockVector();
} }
@Override @Override
public void clear() { public void clear() {
pos1 = null; position1 = null;
pos2 = null; position2 = null;
} }
@Override @Override
@ -224,12 +225,12 @@ public class CuboidRegionSelector extends com.sk89q.worldedit.regions.CuboidRegi
public List<String> getInformationLines() { public List<String> getInformationLines() {
final List<String> lines = new ArrayList<String>(); final List<String> lines = new ArrayList<String>();
if (pos1 != null) { if (position1 != null) {
lines.add("Position 1: " + pos1); lines.add("Position 1: " + position1);
} }
if (pos2 != null) { if (position2 != null) {
lines.add("Position 2: " + pos2); lines.add("Position 2: " + position2);
} }
return lines; return lines;
@ -237,11 +238,11 @@ public class CuboidRegionSelector extends com.sk89q.worldedit.regions.CuboidRegi
@Override @Override
public int getArea() { public int getArea() {
if (pos1 == null) { if (position1 == null) {
return -1; return -1;
} }
if (pos2 == null) { if (position2 == null) {
return -1; return -1;
} }
@ -250,12 +251,12 @@ public class CuboidRegionSelector extends com.sk89q.worldedit.regions.CuboidRegi
@Override @Override
public void describeCUI(LocalSession session, Actor player) { public void describeCUI(LocalSession session, Actor player) {
if (pos1 != null) { if (position1 != null) {
session.dispatchCUIEvent(player, new SelectionPointEvent(0, pos1, getArea())); session.dispatchCUIEvent(player, new SelectionPointEvent(0, position1, getArea()));
} }
if (pos2 != null) { if (position2 != null) {
session.dispatchCUIEvent(player, new SelectionPointEvent(1, pos2, getArea())); session.dispatchCUIEvent(player, new SelectionPointEvent(1, position2, getArea()));
} }
} }
@ -279,19 +280,4 @@ public class CuboidRegionSelector extends com.sk89q.worldedit.regions.CuboidRegi
return "cuboid"; return "cuboid";
} }
@Override
public void explainPrimarySelection(LocalPlayer player, LocalSession session, Vector position) {
explainPrimarySelection((Actor) player, session, position);
}
@Override
public void explainSecondarySelection(LocalPlayer player, LocalSession session, Vector position) {
explainSecondarySelection((Actor) player, session, position);
}
@Override
public void explainRegionAdjust(LocalPlayer player, LocalSession session) {
explainRegionAdjust((Actor) player, session);
}
} }

View File

@ -25,6 +25,7 @@ import com.sk89q.worldedit.internal.cui.*;
import com.sk89q.worldedit.regions.CylinderRegion; import com.sk89q.worldedit.regions.CylinderRegion;
import com.sk89q.worldedit.regions.Region; import com.sk89q.worldedit.regions.Region;
import com.sk89q.worldedit.regions.RegionSelector; import com.sk89q.worldedit.regions.RegionSelector;
import com.sk89q.worldedit.regions.selector.limit.SelectorLimits;
import com.sk89q.worldedit.world.World; import com.sk89q.worldedit.world.World;
import javax.annotation.Nullable; import javax.annotation.Nullable;
@ -35,7 +36,7 @@ import java.util.List;
import static com.google.common.base.Preconditions.checkNotNull; import static com.google.common.base.Preconditions.checkNotNull;
/** /**
* A {@link RegionSelector} for {@link CylinderRegion}s. * Creates a {@code CylinderRegionSelector} from a user's selections.
*/ */
public class CylinderRegionSelector extends com.sk89q.worldedit.regions.CylinderRegionSelector implements RegionSelector, CUIRegion { public class CylinderRegionSelector extends com.sk89q.worldedit.regions.CylinderRegionSelector implements RegionSelector, CUIRegion {
@ -48,17 +49,16 @@ public class CylinderRegionSelector extends com.sk89q.worldedit.regions.Cylinder
} }
/** /**
* @deprecated cast {@code world} to {@link World} * Create a new region selector with a {@code null} world.
*/ */
@Deprecated public CylinderRegionSelector() {
public CylinderRegionSelector(@Nullable LocalWorld world) { this((World) null);
this((World) world);
} }
/** /**
* Create a new region selector. * Create a new region selector.
* *
* @param world the world * @param world the world, which may be {@code null}
*/ */
public CylinderRegionSelector(@Nullable World world) { public CylinderRegionSelector(@Nullable World world) {
region = new CylinderRegion(world); region = new CylinderRegion(world);
@ -71,6 +71,7 @@ public class CylinderRegionSelector extends com.sk89q.worldedit.regions.Cylinder
*/ */
public CylinderRegionSelector(RegionSelector oldSelector) { public CylinderRegionSelector(RegionSelector oldSelector) {
this(checkNotNull(oldSelector).getIncompleteRegion().getWorld()); this(checkNotNull(oldSelector).getIncompleteRegion().getWorld());
if (oldSelector instanceof CylinderRegionSelector) { if (oldSelector instanceof CylinderRegionSelector) {
final CylinderRegionSelector cylSelector = (CylinderRegionSelector) oldSelector; final CylinderRegionSelector cylSelector = (CylinderRegionSelector) oldSelector;
@ -104,7 +105,7 @@ public class CylinderRegionSelector extends com.sk89q.worldedit.regions.Cylinder
* @param minY the minimum Y * @param minY the minimum Y
* @param maxY the maximum Y * @param maxY the maximum Y
*/ */
public CylinderRegionSelector(@Nullable LocalWorld world, Vector2D center, Vector2D radius, int minY, int maxY) { public CylinderRegionSelector(@Nullable World world, Vector2D center, Vector2D radius, int minY, int maxY) {
this(world); this(world);
region.setCenter(center); region.setCenter(center);
@ -115,30 +116,30 @@ public class CylinderRegionSelector extends com.sk89q.worldedit.regions.Cylinder
} }
@Override @Override
public boolean selectPrimary(Vector pos) { public boolean selectPrimary(Vector position, SelectorLimits limits) {
if (!region.getCenter().equals(Vector.ZERO) && pos.compareTo(region.getCenter()) == 0) { if (!region.getCenter().equals(Vector.ZERO) && position.compareTo(region.getCenter()) == 0) {
return false; return false;
} }
region = new CylinderRegion(region.getWorld()); region = new CylinderRegion(region.getWorld());
region.setCenter(pos.toVector2D()); region.setCenter(position.toVector2D());
region.setY(pos.getBlockY()); region.setY(position.getBlockY());
return true; return true;
} }
@Override @Override
public boolean selectSecondary(Vector pos) { public boolean selectSecondary(Vector position, SelectorLimits limits) {
Vector center = region.getCenter(); Vector center = region.getCenter();
if ((center.compareTo(Vector.ZERO)) == 0) { if ((center.compareTo(Vector.ZERO)) == 0) {
return true; return true;
} }
final Vector2D diff = pos.subtract(center).toVector2D(); final Vector2D diff = position.subtract(center).toVector2D();
final Vector2D minRadius = Vector2D.getMaximum(diff, diff.multiply(-1.0)); final Vector2D minRadius = Vector2D.getMaximum(diff, diff.multiply(-1.0));
region.extendRadius(minRadius); region.extendRadius(minRadius);
region.setY(pos.getBlockY()); region.setY(position.getBlockY());
return true; return true;
} }
@ -153,6 +154,7 @@ public class CylinderRegionSelector extends com.sk89q.worldedit.regions.Cylinder
@Override @Override
public void explainSecondarySelection(Actor player, LocalSession session, Vector pos) { public void explainSecondarySelection(Actor player, LocalSession session, Vector pos) {
Vector center = region.getCenter(); Vector center = region.getCenter();
if (!center.equals(Vector.ZERO)) { if (!center.equals(Vector.ZERO)) {
player.print("Radius set to " + format.format(region.getRadius().getX()) + "/" + format.format(region.getRadius().getZ()) + " blocks. (" + region.getArea() + ")."); player.print("Radius set to " + format.format(region.getRadius().getX()) + "/" + format.format(region.getRadius().getZ()) + " blocks. (" + region.getArea() + ").");
} else { } else {
@ -258,19 +260,4 @@ public class CylinderRegionSelector extends com.sk89q.worldedit.regions.Cylinder
return "cuboid"; return "cuboid";
} }
@Override
public void explainPrimarySelection(LocalPlayer player, LocalSession session, Vector position) {
explainPrimarySelection((Actor) player, session, position);
}
@Override
public void explainSecondarySelection(LocalPlayer player, LocalSession session, Vector position) {
explainSecondarySelection((Actor) player, session, position);
}
@Override
public void explainRegionAdjust(LocalPlayer player, LocalSession session) {
explainRegionAdjust((Actor) player, session);
}
} }

View File

@ -27,6 +27,7 @@ import com.sk89q.worldedit.internal.cui.SelectionPointEvent;
import com.sk89q.worldedit.regions.EllipsoidRegion; import com.sk89q.worldedit.regions.EllipsoidRegion;
import com.sk89q.worldedit.regions.Region; import com.sk89q.worldedit.regions.Region;
import com.sk89q.worldedit.regions.RegionSelector; import com.sk89q.worldedit.regions.RegionSelector;
import com.sk89q.worldedit.regions.selector.limit.SelectorLimits;
import com.sk89q.worldedit.world.World; import com.sk89q.worldedit.world.World;
import javax.annotation.Nullable; import javax.annotation.Nullable;
@ -36,7 +37,7 @@ import java.util.List;
import static com.google.common.base.Preconditions.checkNotNull; import static com.google.common.base.Preconditions.checkNotNull;
/** /**
* A {@link RegionSelector} for {@link EllipsoidRegion}s. * Creates a {@code EllipsoidRegionSelector} from a user's selections.
*/ */
public class EllipsoidRegionSelector extends com.sk89q.worldedit.regions.EllipsoidRegionSelector implements RegionSelector, CUIRegion { public class EllipsoidRegionSelector extends com.sk89q.worldedit.regions.EllipsoidRegionSelector implements RegionSelector, CUIRegion {
@ -44,24 +45,16 @@ public class EllipsoidRegionSelector extends com.sk89q.worldedit.regions.Ellipso
protected boolean started = false; protected boolean started = false;
/** /**
* Create a new selector. * Create a new selector with a {@code null} world.
*/ */
public EllipsoidRegionSelector() { public EllipsoidRegionSelector() {
this((World) null); this((World) null);
} }
/**
* @deprecated cast {@code world} to {@link World}
*/
@Deprecated
public EllipsoidRegionSelector(@Nullable LocalWorld world) {
this((World) world);
}
/** /**
* Create a new selector. * Create a new selector.
* *
* @param world the world * @param world the world, which may be {@code null}
*/ */
public EllipsoidRegionSelector(@Nullable World world) { public EllipsoidRegionSelector(@Nullable World world) {
region = new EllipsoidRegion(world, new Vector(), new Vector()); region = new EllipsoidRegion(world, new Vector(), new Vector());
@ -102,7 +95,7 @@ public class EllipsoidRegionSelector extends com.sk89q.worldedit.regions.Ellipso
* @param center the center * @param center the center
* @param radius the radius * @param radius the radius
*/ */
public EllipsoidRegionSelector(@Nullable LocalWorld world, Vector center, Vector radius) { public EllipsoidRegionSelector(@Nullable World world, Vector center, Vector radius) {
this(world); this(world);
region.setCenter(center); region.setCenter(center);
@ -110,12 +103,12 @@ public class EllipsoidRegionSelector extends com.sk89q.worldedit.regions.Ellipso
} }
@Override @Override
public boolean selectPrimary(Vector pos) { public boolean selectPrimary(Vector position, SelectorLimits limits) {
if (pos.equals(region.getCenter()) && region.getRadius().lengthSq() == 0) { if (position.equals(region.getCenter()) && region.getRadius().lengthSq() == 0) {
return false; return false;
} }
region.setCenter(pos.toBlockVector()); region.setCenter(position.toBlockVector());
region.setRadius(new Vector()); region.setRadius(new Vector());
started = true; started = true;
@ -123,12 +116,12 @@ public class EllipsoidRegionSelector extends com.sk89q.worldedit.regions.Ellipso
} }
@Override @Override
public boolean selectSecondary(Vector pos) { public boolean selectSecondary(Vector position, SelectorLimits limits) {
if (!started) { if (!started) {
return false; return false;
} }
final Vector diff = pos.subtract(region.getCenter()); final Vector diff = position.subtract(region.getCenter());
final Vector minRadius = Vector.getMaximum(diff, diff.multiply(-1.0)); final Vector minRadius = Vector.getMaximum(diff, diff.multiply(-1.0));
region.extendRadius(minRadius); region.extendRadius(minRadius);
return true; return true;
@ -249,19 +242,4 @@ public class EllipsoidRegionSelector extends com.sk89q.worldedit.regions.Ellipso
return region.getCenter().toBlockVector(); return region.getCenter().toBlockVector();
} }
@Override
public void explainPrimarySelection(LocalPlayer player, LocalSession session, Vector position) {
explainPrimarySelection((Actor) player, session, position);
}
@Override
public void explainSecondarySelection(LocalPlayer player, LocalSession session, Vector position) {
explainSecondarySelection((Actor) player, session, position);
}
@Override
public void explainRegionAdjust(LocalPlayer player, LocalSession session) {
explainRegionAdjust((Actor) player, session);
}
} }

View File

@ -19,29 +19,33 @@
package com.sk89q.worldedit.regions.selector; package com.sk89q.worldedit.regions.selector;
import com.sk89q.worldedit.*; import com.sk89q.worldedit.BlockVector;
import com.sk89q.worldedit.LocalSession;
import com.sk89q.worldedit.Vector;
import com.sk89q.worldedit.extension.platform.Actor; import com.sk89q.worldedit.extension.platform.Actor;
import com.sk89q.worldedit.regions.CuboidRegion;
import com.sk89q.worldedit.regions.RegionSelector; import com.sk89q.worldedit.regions.RegionSelector;
import com.sk89q.worldedit.regions.selector.limit.SelectorLimits;
import com.sk89q.worldedit.world.World; import com.sk89q.worldedit.world.World;
import javax.annotation.Nullable; import javax.annotation.Nullable;
/** /**
* A {@link RegionSelector} for {@link CuboidRegion}s that enlarges the * Creates a {@code CuboidRegion} from a user's selections by expanding
* region with every secondary selection. * the region on every right click.
*/ */
public class ExtendingCuboidRegionSelector extends CuboidRegionSelector { public class ExtendingCuboidRegionSelector extends CuboidRegionSelector {
@Deprecated /**
public ExtendingCuboidRegionSelector(@Nullable LocalWorld world) { * Create a new selector with a {@code null} world.
this((World) world); */
public ExtendingCuboidRegionSelector() {
super((World) null);
} }
/** /**
* Create a new selector. * Create a new selector.
* *
* @param world the world * @param world the world, which may be {@code null}
*/ */
public ExtendingCuboidRegionSelector(@Nullable World world) { public ExtendingCuboidRegionSelector(@Nullable World world) {
super(world); super(world);
@ -55,71 +59,71 @@ public class ExtendingCuboidRegionSelector extends CuboidRegionSelector {
public ExtendingCuboidRegionSelector(RegionSelector oldSelector) { public ExtendingCuboidRegionSelector(RegionSelector oldSelector) {
super(oldSelector); super(oldSelector);
if (pos1 == null || pos2 == null) { if (position1 == null || position2 == null) {
return; return;
} }
pos1 = region.getMinimumPoint().toBlockVector(); position1 = region.getMinimumPoint().toBlockVector();
pos2 = region.getMaximumPoint().toBlockVector(); position2 = region.getMaximumPoint().toBlockVector();
region.setPos1(pos1); region.setPos1(position1);
region.setPos2(pos2); region.setPos2(position2);
} }
/** /**
* Create a new selector. * Create a new selector.
* *
* @param world the world * @param world the world
* @param pos1 the first position * @param position1 the first position
* @param pos2 the second position * @param position2 the second position
*/ */
public ExtendingCuboidRegionSelector(@Nullable LocalWorld world, Vector pos1, Vector pos2) { public ExtendingCuboidRegionSelector(@Nullable World world, Vector position1, Vector position2) {
this(world); this(world);
pos1 = Vector.getMinimum(pos1, pos2); position1 = Vector.getMinimum(position1, position2);
pos2 = Vector.getMaximum(pos1, pos2); position2 = Vector.getMaximum(position1, position2);
region.setPos1(pos1); region.setPos1(position1);
region.setPos2(pos2); region.setPos2(position2);
} }
@Override @Override
public boolean selectPrimary(Vector pos) { public boolean selectPrimary(Vector position, SelectorLimits limits) {
if (pos1 != null && pos2 != null && pos.compareTo(pos1) == 0 && pos.compareTo(pos2) == 0) { if (position1 != null && position2 != null && position.compareTo(position1) == 0 && position.compareTo(position2) == 0) {
return false; return false;
} }
pos1 = pos2 = pos.toBlockVector(); position1 = position2 = position.toBlockVector();
region.setPos1(pos1); region.setPos1(position1);
region.setPos2(pos2); region.setPos2(position2);
return true; return true;
} }
@Override @Override
public boolean selectSecondary(Vector pos) { public boolean selectSecondary(Vector position, SelectorLimits limits) {
if (pos1 == null || pos2 == null) { if (position1 == null || position2 == null) {
return selectPrimary(pos); return selectPrimary(position, limits);
} }
if (region.contains(pos)) { if (region.contains(position)) {
return false; return false;
} }
double x1 = Math.min(pos.getX(), pos1.getX()); double x1 = Math.min(position.getX(), position1.getX());
double y1 = Math.min(pos.getY(), pos1.getY()); double y1 = Math.min(position.getY(), position1.getY());
double z1 = Math.min(pos.getZ(), pos1.getZ()); double z1 = Math.min(position.getZ(), position1.getZ());
double x2 = Math.max(pos.getX(), pos2.getX()); double x2 = Math.max(position.getX(), position2.getX());
double y2 = Math.max(pos.getY(), pos2.getY()); double y2 = Math.max(position.getY(), position2.getY());
double z2 = Math.max(pos.getZ(), pos2.getZ()); double z2 = Math.max(position.getZ(), position2.getZ());
final BlockVector o1 = pos1; final BlockVector o1 = position1;
final BlockVector o2 = pos2; final BlockVector o2 = position2;
pos1 = new BlockVector(x1, y1, z1); position1 = new BlockVector(x1, y1, z1);
pos2 = new BlockVector(x2, y2, z2); position2 = new BlockVector(x2, y2, z2);
region.setPos1(pos1); region.setPos1(position1);
region.setPos2(pos2); region.setPos2(position2);
assert(region.contains(o1)); assert(region.contains(o1));
assert(region.contains(o2)); assert(region.contains(o2));
assert(region.contains(pos)); assert(region.contains(position));
return true; return true;
} }
@ -138,19 +142,4 @@ public class ExtendingCuboidRegionSelector extends CuboidRegionSelector {
explainRegionAdjust(player, session); explainRegionAdjust(player, session);
} }
@Override
public void explainPrimarySelection(LocalPlayer player, LocalSession session, Vector position) {
explainPrimarySelection((Actor) player, session, position);
}
@Override
public void explainSecondarySelection(LocalPlayer player, LocalSession session, Vector position) {
explainSecondarySelection((Actor) player, session, position);
}
@Override
public void explainRegionAdjust(LocalPlayer player, LocalSession session) {
explainRegionAdjust((Actor) player, session);
}
} }

View File

@ -19,6 +19,7 @@
package com.sk89q.worldedit.regions.selector; package com.sk89q.worldedit.regions.selector;
import com.google.common.base.Optional;
import com.sk89q.worldedit.*; import com.sk89q.worldedit.*;
import com.sk89q.worldedit.extension.platform.Actor; import com.sk89q.worldedit.extension.platform.Actor;
import com.sk89q.worldedit.internal.cui.CUIRegion; import com.sk89q.worldedit.internal.cui.CUIRegion;
@ -28,6 +29,7 @@ import com.sk89q.worldedit.internal.cui.SelectionShapeEvent;
import com.sk89q.worldedit.regions.Polygonal2DRegion; import com.sk89q.worldedit.regions.Polygonal2DRegion;
import com.sk89q.worldedit.regions.Region; import com.sk89q.worldedit.regions.Region;
import com.sk89q.worldedit.regions.RegionSelector; import com.sk89q.worldedit.regions.RegionSelector;
import com.sk89q.worldedit.regions.selector.limit.SelectorLimits;
import com.sk89q.worldedit.world.World; import com.sk89q.worldedit.world.World;
import javax.annotation.Nullable; import javax.annotation.Nullable;
@ -37,57 +39,37 @@ import java.util.List;
import static com.google.common.base.Preconditions.checkNotNull; import static com.google.common.base.Preconditions.checkNotNull;
/** /**
* A {@link RegionSelector} for {@link Polygonal2DRegion}s. * Creates a {@code Polygonal2DRegion} from a user's selections.
*/ */
public class Polygonal2DRegionSelector extends com.sk89q.worldedit.regions.Polygonal2DRegionSelector implements RegionSelector, CUIRegion { public class Polygonal2DRegionSelector extends com.sk89q.worldedit.regions.Polygonal2DRegionSelector implements RegionSelector, CUIRegion {
private int maxPoints;
private BlockVector pos1; private BlockVector pos1;
private Polygonal2DRegion region; private Polygonal2DRegion region;
/** /**
* @deprecated Use {@link #Polygonal2DRegionSelector(LocalWorld, int)} * Create a new selector with a {@code null} world.
*/ */
@Deprecated public Polygonal2DRegionSelector() {
public Polygonal2DRegionSelector(@Nullable LocalWorld world) { this((World) null);
this(world, 50);
} }
/** /**
* @deprecated cast {@code world} to {@link World} * Create a new selector with the given world.
*/
@Deprecated
public Polygonal2DRegionSelector(@Nullable LocalWorld world, int maxPoints) {
this((World) world, maxPoints);
}
/**
* Create a new selector.
* *
* @param world the world * @param world the world
* @param maxPoints the maximum number of points
*/ */
public Polygonal2DRegionSelector(@Nullable World world, int maxPoints) { public Polygonal2DRegionSelector(@Nullable World world) {
this.maxPoints = maxPoints;
region = new Polygonal2DRegion(world); region = new Polygonal2DRegion(world);
} }
/**
* @deprecated Use {@link #Polygonal2DRegionSelector(RegionSelector, int)}
*/
@Deprecated
public Polygonal2DRegionSelector(RegionSelector oldSelector) {
this(oldSelector, 50);
}
/** /**
* Create a new selector from another one. * Create a new selector from another one.
* *
* @param oldSelector the old selector * @param oldSelector the old selector
* @param maxPoints the maximum number of points
*/ */
public Polygonal2DRegionSelector(RegionSelector oldSelector, int maxPoints) { public Polygonal2DRegionSelector(RegionSelector oldSelector) {
this(checkNotNull(oldSelector).getIncompleteRegion().getWorld(), maxPoints); this(checkNotNull(oldSelector).getIncompleteRegion().getWorld());
if (oldSelector instanceof Polygonal2DRegionSelector) { if (oldSelector instanceof Polygonal2DRegionSelector) {
final Polygonal2DRegionSelector polygonal2DRegionSelector = (Polygonal2DRegionSelector) oldSelector; final Polygonal2DRegionSelector polygonal2DRegionSelector = (Polygonal2DRegionSelector) oldSelector;
@ -104,7 +86,7 @@ public class Polygonal2DRegionSelector extends com.sk89q.worldedit.regions.Polyg
final int minY = oldRegion.getMinimumPoint().getBlockY(); final int minY = oldRegion.getMinimumPoint().getBlockY();
final int maxY = oldRegion.getMaximumPoint().getBlockY(); final int maxY = oldRegion.getMaximumPoint().getBlockY();
List<BlockVector2D> points = oldRegion.polygonize(maxPoints); List<BlockVector2D> points = oldRegion.polygonize(Integer.MAX_VALUE);
pos1 = points.get(0).toVector(minY).toBlockVector(); pos1 = points.get(0).toVector(minY).toBlockVector();
region = new Polygonal2DRegion(oldRegion.getWorld(), points, minY, maxY); region = new Polygonal2DRegion(oldRegion.getWorld(), points, minY, maxY);
@ -136,36 +118,38 @@ public class Polygonal2DRegionSelector extends com.sk89q.worldedit.regions.Polyg
} }
@Override @Override
public boolean selectPrimary(Vector pos) { public boolean selectPrimary(Vector position, SelectorLimits limits) {
if (pos.equals(pos1)) { if (position.equals(pos1)) {
return false; return false;
} }
pos1 = pos.toBlockVector(); pos1 = position.toBlockVector();
region = new Polygonal2DRegion(region.getWorld()); region = new Polygonal2DRegion(region.getWorld());
region.addPoint(pos); region.addPoint(position);
region.expandY(pos.getBlockY()); region.expandY(position.getBlockY());
return true; return true;
} }
@Override @Override
public boolean selectSecondary(Vector pos) { public boolean selectSecondary(Vector position, SelectorLimits limits) {
if (region.size() > 0) { if (region.size() > 0) {
final List<BlockVector2D> points = region.getPoints(); final List<BlockVector2D> points = region.getPoints();
final BlockVector2D lastPoint = points.get(region.size() - 1); final BlockVector2D lastPoint = points.get(region.size() - 1);
if (lastPoint.getBlockX() == pos.getBlockX() && lastPoint.getBlockZ() == pos.getBlockZ()) { if (lastPoint.getBlockX() == position.getBlockX() && lastPoint.getBlockZ() == position.getBlockZ()) {
return false; return false;
} }
if (maxPoints >= 0 && points.size() > maxPoints) { Optional<Integer> vertexLimit = limits.getPolygonVertexLimit();
if (vertexLimit.isPresent() && points.size() > vertexLimit.get()) {
return false; return false;
} }
} }
region.addPoint(pos); region.addPoint(position);
region.expandY(pos.getBlockY()); region.expandY(position.getBlockY());
return true; return true;
} }
@ -288,19 +272,4 @@ public class Polygonal2DRegionSelector extends com.sk89q.worldedit.regions.Polyg
return "polygon2d"; return "polygon2d";
} }
@Override
public void explainPrimarySelection(LocalPlayer player, LocalSession session, Vector position) {
explainPrimarySelection((Actor) player, session, position);
}
@Override
public void explainSecondarySelection(LocalPlayer player, LocalSession session, Vector position) {
explainSecondarySelection((Actor) player, session, position);
}
@Override
public void explainRegionAdjust(LocalPlayer player, LocalSession session) {
explainRegionAdjust((Actor) player, session);
}
} }

View File

@ -19,42 +19,36 @@
package com.sk89q.worldedit.regions.selector; package com.sk89q.worldedit.regions.selector;
import com.sk89q.worldedit.LocalPlayer;
import com.sk89q.worldedit.LocalSession; import com.sk89q.worldedit.LocalSession;
import com.sk89q.worldedit.LocalWorld;
import com.sk89q.worldedit.Vector; import com.sk89q.worldedit.Vector;
import com.sk89q.worldedit.extension.platform.Actor; import com.sk89q.worldedit.extension.platform.Actor;
import com.sk89q.worldedit.regions.RegionSelector; import com.sk89q.worldedit.regions.RegionSelector;
import com.sk89q.worldedit.regions.selector.limit.SelectorLimits;
import com.sk89q.worldedit.world.World; import com.sk89q.worldedit.world.World;
import javax.annotation.Nullable; import javax.annotation.Nullable;
/** /**
* A {@link RegionSelector} for {@link SphereRegionSelector}s. * Creates a {@code SphereRegion} from a user's selections.
*/ */
public class SphereRegionSelector extends EllipsoidRegionSelector { public class SphereRegionSelector extends EllipsoidRegionSelector {
@Deprecated /**
public SphereRegionSelector(@Nullable LocalWorld world) { * Create a new selector with a {@code null world}.
this((World) world); */
public SphereRegionSelector() {
super();
} }
/** /**
* Create a new selector. * Create a new selector.
* *
* @param world the world * @param world the world, which may be {@code null}
*/ */
public SphereRegionSelector(@Nullable World world) { public SphereRegionSelector(@Nullable World world) {
super(world); super(world);
} }
/**
* Create a new selector.
*/
public SphereRegionSelector() {
super();
}
/** /**
* Create a new selector from another one * Create a new selector from another one
* *
@ -74,17 +68,17 @@ public class SphereRegionSelector extends EllipsoidRegionSelector {
* @param center the center position * @param center the center position
* @param radius the radius * @param radius the radius
*/ */
public SphereRegionSelector(@Nullable LocalWorld world, Vector center, int radius) { public SphereRegionSelector(@Nullable World world, Vector center, int radius) {
super(world, center, new Vector(radius, radius, radius)); super(world, center, new Vector(radius, radius, radius));
} }
@Override @Override
public boolean selectSecondary(Vector pos) { public boolean selectSecondary(Vector position, SelectorLimits limits) {
if (!started) { if (!started) {
return false; return false;
} }
final double radiusScalar = Math.ceil(pos.distance(region.getCenter())); final double radiusScalar = Math.ceil(position.distance(region.getCenter()));
region.setRadius(new Vector(radiusScalar, radiusScalar, radiusScalar)); region.setRadius(new Vector(radiusScalar, radiusScalar, radiusScalar));
return true; return true;
@ -106,19 +100,4 @@ public class SphereRegionSelector extends EllipsoidRegionSelector {
return "sphere"; return "sphere";
} }
@Override
public void explainPrimarySelection(LocalPlayer player, LocalSession session, Vector position) {
explainPrimarySelection((Actor) player, session, position);
}
@Override
public void explainSecondarySelection(LocalPlayer player, LocalSession session, Vector position) {
explainSecondarySelection((Actor) player, session, position);
}
@Override
public void explainRegionAdjust(LocalPlayer player, LocalSession session) {
explainRegionAdjust((Actor) player, session);
}
} }

View File

@ -0,0 +1,53 @@
/*
* WorldEdit, a Minecraft world manipulation toolkit
* Copyright (C) sk89q <http://www.sk89q.com>
* 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 <http://www.gnu.org/licenses/>.
*/
package com.sk89q.worldedit.regions.selector.limit;
import com.google.common.base.Optional;
/**
* No limits at all.
*/
public class PermissiveSelectorLimits implements SelectorLimits {
private static final PermissiveSelectorLimits INSTANCE = new PermissiveSelectorLimits();
private PermissiveSelectorLimits() {
}
@Override
public Optional<Integer> getPolygonVertexLimit() {
return Optional.absent();
}
@Override
public Optional<Integer> getPolyhedronVertexLimit() {
return Optional.absent();
}
/**
* Get a static instance.
*
* @return an instance
*/
public static PermissiveSelectorLimits getInstance() {
return INSTANCE;
}
}

View File

@ -0,0 +1,47 @@
/*
* WorldEdit, a Minecraft world manipulation toolkit
* Copyright (C) sk89q <http://www.sk89q.com>
* 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 <http://www.gnu.org/licenses/>.
*/
package com.sk89q.worldedit.regions.selector.limit;
import com.google.common.base.Optional;
/**
* Defines limits for selections.
*/
public interface SelectorLimits {
/**
* Get the optionally defined vertex limit for polygons.
*
* <p>If one is not present, then there is no limitation.</p>
*
* @return an optional vertex limit
*/
Optional<Integer> getPolygonVertexLimit();
/**
* Get the optionally defined vertex limit for polyhedrons.
*
* <p>If one is not present, then there is no limitation.</p>
*
* @return an optional vertex limit
*/
Optional<Integer> getPolyhedronVertexLimit();
}