diff --git a/src/bukkit/java/com/sk89q/worldedit/bukkit/selections/CuboidSelection.java b/src/bukkit/java/com/sk89q/worldedit/bukkit/selections/CuboidSelection.java index 52309fc28..5ecd74956 100644 --- a/src/bukkit/java/com/sk89q/worldedit/bukkit/selections/CuboidSelection.java +++ b/src/bukkit/java/com/sk89q/worldedit/bukkit/selections/CuboidSelection.java @@ -19,13 +19,14 @@ 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.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 { @@ -51,8 +52,8 @@ public class CuboidSelection extends RegionSelection { CuboidRegionSelector sel = new CuboidRegionSelector(BukkitUtil.getLocalWorld(world)); // set up selector - sel.selectPrimary(pt1); - sel.selectSecondary(pt2); + sel.selectPrimary(pt1, PermissiveSelectorLimits.getInstance()); + sel.selectSecondary(pt2, PermissiveSelectorLimits.getInstance()); // set up CuboidSelection cuboid = sel.getIncompleteRegion(); diff --git a/src/legacy/java/com/sk89q/worldedit/regions/AbstractLegacyRegionSelector.java b/src/legacy/java/com/sk89q/worldedit/regions/AbstractLegacyRegionSelector.java new file mode 100644 index 000000000..1930e3b9f --- /dev/null +++ b/src/legacy/java/com/sk89q/worldedit/regions/AbstractLegacyRegionSelector.java @@ -0,0 +1,44 @@ +/* + * 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.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); + } + +} diff --git a/src/legacy/java/com/sk89q/worldedit/regions/ConvexPolyhedralRegionSelector.java b/src/legacy/java/com/sk89q/worldedit/regions/ConvexPolyhedralRegionSelector.java index a7739a00d..f264546dd 100644 --- a/src/legacy/java/com/sk89q/worldedit/regions/ConvexPolyhedralRegionSelector.java +++ b/src/legacy/java/com/sk89q/worldedit/regions/ConvexPolyhedralRegionSelector.java @@ -25,5 +25,5 @@ import com.sk89q.worldedit.internal.cui.CUIRegion; * @deprecated This class only exists as to not break binary compatibility */ @Deprecated -public abstract class ConvexPolyhedralRegionSelector implements RegionSelector, CUIRegion { +public abstract class ConvexPolyhedralRegionSelector extends AbstractLegacyRegionSelector implements CUIRegion { } diff --git a/src/legacy/java/com/sk89q/worldedit/regions/CuboidRegionSelector.java b/src/legacy/java/com/sk89q/worldedit/regions/CuboidRegionSelector.java index 9c4234f7b..458d75cb3 100644 --- a/src/legacy/java/com/sk89q/worldedit/regions/CuboidRegionSelector.java +++ b/src/legacy/java/com/sk89q/worldedit/regions/CuboidRegionSelector.java @@ -25,5 +25,5 @@ import com.sk89q.worldedit.internal.cui.CUIRegion; * @deprecated This class only exists as to not break binary compatibility */ @Deprecated -public abstract class CuboidRegionSelector implements RegionSelector, CUIRegion { +public abstract class CuboidRegionSelector extends AbstractLegacyRegionSelector implements CUIRegion { } diff --git a/src/legacy/java/com/sk89q/worldedit/regions/CylinderRegionSelector.java b/src/legacy/java/com/sk89q/worldedit/regions/CylinderRegionSelector.java index 14e298d46..b54709e7d 100644 --- a/src/legacy/java/com/sk89q/worldedit/regions/CylinderRegionSelector.java +++ b/src/legacy/java/com/sk89q/worldedit/regions/CylinderRegionSelector.java @@ -25,5 +25,5 @@ import com.sk89q.worldedit.internal.cui.CUIRegion; * @deprecated This class only exists as to not break binary compatibility */ @Deprecated -public abstract class CylinderRegionSelector implements RegionSelector, CUIRegion { +public abstract class CylinderRegionSelector extends AbstractLegacyRegionSelector implements CUIRegion { } diff --git a/src/legacy/java/com/sk89q/worldedit/regions/EllipsoidRegionSelector.java b/src/legacy/java/com/sk89q/worldedit/regions/EllipsoidRegionSelector.java index 97b081e31..69bf5ba2b 100644 --- a/src/legacy/java/com/sk89q/worldedit/regions/EllipsoidRegionSelector.java +++ b/src/legacy/java/com/sk89q/worldedit/regions/EllipsoidRegionSelector.java @@ -25,5 +25,5 @@ import com.sk89q.worldedit.internal.cui.CUIRegion; * @deprecated This class only exists as to not break binary compatibility */ @Deprecated -public abstract class EllipsoidRegionSelector implements RegionSelector, CUIRegion { +public abstract class EllipsoidRegionSelector extends AbstractLegacyRegionSelector implements CUIRegion { } diff --git a/src/legacy/java/com/sk89q/worldedit/regions/ExtendingCuboidRegionSelector.java b/src/legacy/java/com/sk89q/worldedit/regions/ExtendingCuboidRegionSelector.java index a9aeb5948..d9888a447 100644 --- a/src/legacy/java/com/sk89q/worldedit/regions/ExtendingCuboidRegionSelector.java +++ b/src/legacy/java/com/sk89q/worldedit/regions/ExtendingCuboidRegionSelector.java @@ -19,9 +19,11 @@ package com.sk89q.worldedit.regions; +import com.sk89q.worldedit.internal.cui.CUIRegion; + /** * @deprecated This class only exists as to not break binary compatibility */ @Deprecated -public abstract class ExtendingCuboidRegionSelector extends CuboidRegionSelector { +public abstract class ExtendingCuboidRegionSelector extends AbstractLegacyRegionSelector implements CUIRegion { } diff --git a/src/legacy/java/com/sk89q/worldedit/regions/Polygonal2DRegionSelector.java b/src/legacy/java/com/sk89q/worldedit/regions/Polygonal2DRegionSelector.java index 9b6e28fd7..f3b8a9cbd 100644 --- a/src/legacy/java/com/sk89q/worldedit/regions/Polygonal2DRegionSelector.java +++ b/src/legacy/java/com/sk89q/worldedit/regions/Polygonal2DRegionSelector.java @@ -25,7 +25,7 @@ import com.sk89q.worldedit.internal.cui.CUIRegion; * @deprecated This class only exists as to not break binary compatibility */ @Deprecated -public abstract class Polygonal2DRegionSelector implements RegionSelector, CUIRegion { +public abstract class Polygonal2DRegionSelector extends AbstractLegacyRegionSelector implements CUIRegion { /** * Get the number of points. diff --git a/src/legacy/java/com/sk89q/worldedit/regions/SphereRegionSelector.java b/src/legacy/java/com/sk89q/worldedit/regions/SphereRegionSelector.java index d4227b59e..8a3057dc0 100644 --- a/src/legacy/java/com/sk89q/worldedit/regions/SphereRegionSelector.java +++ b/src/legacy/java/com/sk89q/worldedit/regions/SphereRegionSelector.java @@ -19,9 +19,11 @@ package com.sk89q.worldedit.regions; +import com.sk89q.worldedit.internal.cui.CUIRegion; + /** * @deprecated This class only exists as to not break binary compatibility */ @Deprecated -public abstract class SphereRegionSelector extends EllipsoidRegionSelector { +public abstract class SphereRegionSelector extends AbstractLegacyRegionSelector implements CUIRegion { } diff --git a/src/main/java/com/sk89q/worldedit/WorldEdit.java b/src/main/java/com/sk89q/worldedit/WorldEdit.java index 92623795a..dd87aa225 100644 --- a/src/main/java/com/sk89q/worldedit/WorldEdit.java +++ b/src/main/java/com/sk89q/worldedit/WorldEdit.java @@ -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. * diff --git a/src/main/java/com/sk89q/worldedit/command/SelectionCommands.java b/src/main/java/com/sk89q/worldedit/command/SelectionCommands.java index 4d8d165dc..bc9393455 100644 --- a/src/main/java/com/sk89q/worldedit/command/SelectionCommands.java +++ b/src/main/java/com/sk89q/worldedit/command/SelectionCommands.java @@ -19,6 +19,7 @@ package com.sk89q.worldedit.command; +import com.google.common.base.Optional; import com.sk89q.minecraft.util.commands.Command; import com.sk89q.minecraft.util.commands.CommandContext; 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.BlockType; 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.regions.Region; import com.sk89q.worldedit.regions.RegionOperationException; @@ -93,7 +95,7 @@ public class SelectionCommands { 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."); return; } @@ -128,7 +130,7 @@ public class SelectionCommands { 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."); return; } @@ -150,8 +152,7 @@ public class SelectionCommands { Vector pos = player.getBlockTrace(300); if (pos != null) { - if (!session.getRegionSelector(player.getWorld()) - .selectPrimary(pos)) { + if (!session.getRegionSelector(player.getWorld()).selectPrimary(pos, ActorSelectorLimits.forActor(player))) { player.printError("Position already set."); return; } @@ -176,8 +177,7 @@ public class SelectionCommands { Vector pos = player.getBlockTrace(300); if (pos != null) { - if (!session.getRegionSelector(player.getWorld()) - .selectSecondary(pos)) { + if (!session.getRegionSelector(player.getWorld()).selectSecondary(pos, ActorSelectorLimits.forActor(player))) { player.printError("Position already set."); return; } @@ -208,7 +208,6 @@ public class SelectionCommands { @Logging(POSITION) @CommandPermissions("worldedit.selection.chunk") public void chunk(Player player, LocalSession session, EditSession editSession, CommandContext args) throws WorldEditException { - final Vector min; final Vector max; final World world = player.getWorld(); @@ -254,8 +253,8 @@ public class SelectionCommands { } else { selector = new CuboidRegionSelector(world); } - selector.selectPrimary(min); - selector.selectSecondary(max); + selector.selectPrimary(min, ActorSelectorLimits.forActor(player)); + selector.selectSecondary(max, ActorSelectorLimits.forActor(player)); session.setRegionSelector(world, selector); session.dispatchCUISelection(player); @@ -732,11 +731,11 @@ public class SelectionCommands { selector = new ExtendingCuboidRegionSelector(oldSelector); player.print("Cuboid: left click for a starting point, right click to extend"); } else if (typeName.equalsIgnoreCase("poly")) { - int maxPoints = we.getMaximumPolygonalPoints(player); - selector = new Polygonal2DRegionSelector(oldSelector, maxPoints); + selector = new Polygonal2DRegionSelector(oldSelector); player.print("2D polygon selector: Left/right click to add a point."); - if (maxPoints > -1) { - player.print(maxPoints + " points maximum."); + Optional limit = ActorSelectorLimits.forActor(player).getPolygonVertexLimit(); + if (limit.isPresent()) { + player.print(limit.get() + " points maximum."); } } else if (typeName.equalsIgnoreCase("ellipsoid")) { selector = new EllipsoidRegionSelector(oldSelector); @@ -748,9 +747,12 @@ public class SelectionCommands { selector = new CylinderRegionSelector(oldSelector); player.print("Cylindrical selector: Left click=center, right click to extend."); } else if (typeName.equalsIgnoreCase("convex") || typeName.equalsIgnoreCase("hull") || typeName.equalsIgnoreCase("polyhedron")) { - int maxVertices = we.getMaximumPolyhedronPoints(player); - selector = new ConvexPolyhedralRegionSelector(oldSelector, maxVertices); + selector = new ConvexPolyhedralRegionSelector(oldSelector); player.print("Convex polyhedral selector: Left click=First vertex, right click to add more."); + Optional limit = ActorSelectorLimits.forActor(player).getPolyhedronVertexLimit(); + if (limit.isPresent()) { + player.print(limit.get() + " points maximum."); + } } else { player.printError("Only cuboid|extend|poly|ellipsoid|sphere|cyl|convex are accepted."); return; diff --git a/src/main/java/com/sk89q/worldedit/command/tool/DistanceWand.java b/src/main/java/com/sk89q/worldedit/command/tool/DistanceWand.java index ad609e508..a4cb1151f 100644 --- a/src/main/java/com/sk89q/worldedit/command/tool/DistanceWand.java +++ b/src/main/java/com/sk89q/worldedit/command/tool/DistanceWand.java @@ -23,6 +23,7 @@ import com.sk89q.worldedit.*; import com.sk89q.worldedit.entity.Player; import com.sk89q.worldedit.extension.platform.Actor; import com.sk89q.worldedit.extension.platform.Platform; +import com.sk89q.worldedit.extension.platform.permission.ActorSelectorLimits; import com.sk89q.worldedit.regions.RegionSelector; /** @@ -46,7 +47,7 @@ public class DistanceWand extends BrushTool implements DoubleActionTraceTool { if (target == null) return true; RegionSelector selector = session.getRegionSelector(player.getWorld()); - if (selector.selectPrimary(target)) { + if (selector.selectPrimary(target, ActorSelectorLimits.forActor(player))) { selector.explainPrimarySelection(player, session, target); } return true; @@ -63,7 +64,7 @@ public class DistanceWand extends BrushTool implements DoubleActionTraceTool { if (target == null) return true; RegionSelector selector = session.getRegionSelector(player.getWorld()); - if (selector.selectSecondary(target)) { + if (selector.selectSecondary(target, ActorSelectorLimits.forActor(player))) { selector.explainSecondarySelection(player, session, target); } return true; diff --git a/src/main/java/com/sk89q/worldedit/extension/platform/PlatformManager.java b/src/main/java/com/sk89q/worldedit/extension/platform/PlatformManager.java index 5c524c7ee..8f34ab6d1 100644 --- a/src/main/java/com/sk89q/worldedit/extension/platform/PlatformManager.java +++ b/src/main/java/com/sk89q/worldedit/extension/platform/PlatformManager.java @@ -37,6 +37,7 @@ import com.sk89q.worldedit.event.platform.Interaction; import com.sk89q.worldedit.event.platform.PlatformInitializeEvent; import com.sk89q.worldedit.event.platform.PlatformReadyEvent; 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.regions.RegionSelector; import com.sk89q.worldedit.util.Location; @@ -330,7 +331,7 @@ public class PlatformManager { RegionSelector selector = session.getRegionSelector(player.getWorld()); - if (selector.selectPrimary(location.toVector())) { + if (selector.selectPrimary(location.toVector(), ActorSelectorLimits.forActor(player))) { selector.explainPrimarySelection(actor, session, vector); } @@ -365,7 +366,7 @@ public class PlatformManager { } RegionSelector selector = session.getRegionSelector(player.getWorld()); - if (selector.selectSecondary(vector)) { + if (selector.selectSecondary(vector, ActorSelectorLimits.forActor(player))) { selector.explainSecondarySelection(actor, session, vector); } diff --git a/src/main/java/com/sk89q/worldedit/extension/platform/permission/ActorSelectorLimits.java b/src/main/java/com/sk89q/worldedit/extension/platform/permission/ActorSelectorLimits.java new file mode 100644 index 000000000..255dbb406 --- /dev/null +++ b/src/main/java/com/sk89q/worldedit/extension/platform/permission/ActorSelectorLimits.java @@ -0,0 +1,85 @@ +/* + * 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.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 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 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); + } + +} diff --git a/src/main/java/com/sk89q/worldedit/extension/platform/permission/OverridePermissions.java b/src/main/java/com/sk89q/worldedit/extension/platform/permission/OverridePermissions.java new file mode 100644 index 000000000..6266dcbe8 --- /dev/null +++ b/src/main/java/com/sk89q/worldedit/extension/platform/permission/OverridePermissions.java @@ -0,0 +1,32 @@ +/* + * 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.extension.platform.permission; + +/** + * Standard override permissions. + */ +public final class OverridePermissions { + + public static final String NO_LIMITS = "worldedit.limit.unrestricted"; + + private OverridePermissions() { + } + +} diff --git a/src/main/java/com/sk89q/worldedit/regions/RegionSelector.java b/src/main/java/com/sk89q/worldedit/regions/RegionSelector.java index 405f411d8..71a30f309 100644 --- a/src/main/java/com/sk89q/worldedit/regions/RegionSelector.java +++ b/src/main/java/com/sk89q/worldedit/regions/RegionSelector.java @@ -19,8 +19,12 @@ 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.regions.selector.limit.SelectorLimits; import java.util.List; @@ -37,7 +41,7 @@ public interface RegionSelector { * @param position the position * @return true if something changed */ - public boolean selectPrimary(Vector position); + public boolean selectPrimary(Vector position, SelectorLimits limits); /** * Called when the second point is selected. @@ -45,7 +49,7 @@ public interface RegionSelector { * @param position the position * @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. @@ -56,9 +60,6 @@ public interface RegionSelector { */ 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. * @@ -68,9 +69,6 @@ public interface RegionSelector { */ 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 * all the defining region information if needed. @@ -80,9 +78,6 @@ public interface RegionSelector { */ public void explainRegionAdjust(Actor actor, LocalSession session); - @Deprecated - public void explainRegionAdjust(LocalPlayer player, LocalSession session); - /** * Get the primary position. * diff --git a/src/main/java/com/sk89q/worldedit/regions/selector/ConvexPolyhedralRegionSelector.java b/src/main/java/com/sk89q/worldedit/regions/selector/ConvexPolyhedralRegionSelector.java index 32dbbd276..fdfb6fcb0 100644 --- a/src/main/java/com/sk89q/worldedit/regions/selector/ConvexPolyhedralRegionSelector.java +++ b/src/main/java/com/sk89q/worldedit/regions/selector/ConvexPolyhedralRegionSelector.java @@ -19,12 +19,11 @@ package com.sk89q.worldedit.regions.selector; +import com.google.common.base.Optional; import com.sk89q.worldedit.BlockVector; import com.sk89q.worldedit.BlockVector2D; import com.sk89q.worldedit.IncompleteRegionException; -import com.sk89q.worldedit.LocalPlayer; import com.sk89q.worldedit.LocalSession; -import com.sk89q.worldedit.LocalWorld; import com.sk89q.worldedit.Vector; import com.sk89q.worldedit.extension.platform.Actor; 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.RegionSelector; import com.sk89q.worldedit.regions.polyhedron.Triangle; +import com.sk89q.worldedit.regions.selector.limit.SelectorLimits; import com.sk89q.worldedit.world.World; import javax.annotation.Nullable; @@ -46,30 +46,26 @@ import java.util.Map; 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 { - private int maxVertices; private final ConvexPolyhedralRegion region; private BlockVector pos1; /** - * @deprecated cast {@code world} to {@link World} + * Create a new selector with a {@code null} world. */ - @Deprecated - public ConvexPolyhedralRegionSelector(@Nullable LocalWorld world, int maxVertices) { - this((World) world, maxVertices); + public ConvexPolyhedralRegionSelector() { + this((World) null); } /** * Create a new selector. * - * @param world the world - * @param maxVertices the maximum number of vertices, where a number below 0 means unbounded + * @param world the world, which may be {@code null} */ - public ConvexPolyhedralRegionSelector(@Nullable World world, int maxVertices) { - this.maxVertices = maxVertices; + public ConvexPolyhedralRegionSelector(@Nullable World world) { region = new ConvexPolyhedralRegion(world); } @@ -77,12 +73,10 @@ public class ConvexPolyhedralRegionSelector extends com.sk89q.worldedit.regions. * Create a new 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); - this.maxVertices = maxVertices; if (oldSelector instanceof ConvexPolyhedralRegionSelector) { final ConvexPolyhedralRegionSelector convexPolyhedralRegionSelector = (ConvexPolyhedralRegionSelector) oldSelector; @@ -102,7 +96,7 @@ public class ConvexPolyhedralRegionSelector extends com.sk89q.worldedit.regions. region = new ConvexPolyhedralRegion(oldRegion.getWorld()); - for (final BlockVector2D pt : new ArrayList(oldRegion.polygonize(maxVertices < 0 ? maxVertices : maxVertices / 2))) { + for (final BlockVector2D pt : new ArrayList(oldRegion.polygonize(Integer.MAX_VALUE))) { region.addVertex(pt.toVector(minY)); region.addVertex(pt.toVector(maxY)); } @@ -112,19 +106,24 @@ public class ConvexPolyhedralRegionSelector extends com.sk89q.worldedit.regions. } @Override - public boolean selectPrimary(Vector pos) { + public boolean selectPrimary(Vector position, SelectorLimits limits) { + checkNotNull(position); clear(); - pos1 = pos.toBlockVector(); - return region.addVertex(pos); + pos1 = position.toBlockVector(); + return region.addVertex(position); } @Override - public boolean selectSecondary(Vector pos) { - if (maxVertices >= 0 && region.getVertices().size() > maxVertices) { + public boolean selectSecondary(Vector position, SelectorLimits limits) { + checkNotNull(position); + + Optional vertexLimit = limits.getPolyhedronVertexLimit(); + + if (vertexLimit.isPresent() && region.getVertices().size() > vertexLimit.get()) { return false; } - return region.addVertex(pos); + return region.addVertex(position); } @Override @@ -184,6 +183,10 @@ public class ConvexPolyhedralRegionSelector extends com.sk89q.worldedit.regions. @Override public void explainPrimarySelection(Actor player, LocalSession session, Vector pos) { + checkNotNull(player); + checkNotNull(session); + checkNotNull(pos); + session.describeCUI(player); player.print("Started new selection with vertex "+pos+"."); @@ -191,17 +194,22 @@ public class ConvexPolyhedralRegionSelector extends com.sk89q.worldedit.regions. @Override public void explainSecondarySelection(Actor player, LocalSession session, Vector pos) { + checkNotNull(player); + checkNotNull(session); + checkNotNull(pos); + session.describeCUI(player); - player.print("Added vertex "+pos+" to the selection."); + player.print("Added vertex " + pos + " to the selection."); } @Override public void explainRegionAdjust(Actor player, LocalSession session) { + checkNotNull(player); + checkNotNull(session); session.describeCUI(player); } - @Override public int getProtocolVersion() { return 3; @@ -214,6 +222,9 @@ public class ConvexPolyhedralRegionSelector extends com.sk89q.worldedit.regions. @Override public void describeCUI(LocalSession session, Actor player) { + checkNotNull(player); + checkNotNull(session); + Collection vertices = region.getVertices(); Collection triangles = region.getTriangles(); @@ -240,25 +251,13 @@ public class ConvexPolyhedralRegionSelector extends com.sk89q.worldedit.regions. @Override public void describeLegacyCUI(LocalSession session, Actor player) { + checkNotNull(player); + checkNotNull(session); + if (isDefined()) { session.dispatchCUIEvent(player, new SelectionPointEvent(0, region.getMinimumPoint(), 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); - } - } diff --git a/src/main/java/com/sk89q/worldedit/regions/selector/CuboidRegionSelector.java b/src/main/java/com/sk89q/worldedit/regions/selector/CuboidRegionSelector.java index 43d274176..36d47fc69 100644 --- a/src/main/java/com/sk89q/worldedit/regions/selector/CuboidRegionSelector.java +++ b/src/main/java/com/sk89q/worldedit/regions/selector/CuboidRegionSelector.java @@ -26,6 +26,7 @@ import com.sk89q.worldedit.internal.cui.SelectionPointEvent; import com.sk89q.worldedit.regions.CuboidRegion; import com.sk89q.worldedit.regions.Region; import com.sk89q.worldedit.regions.RegionSelector; +import com.sk89q.worldedit.regions.selector.limit.SelectorLimits; import com.sk89q.worldedit.world.World; import javax.annotation.Nullable; @@ -35,33 +36,25 @@ import java.util.List; 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 { - protected BlockVector pos1; - protected BlockVector pos2; + protected BlockVector position1; + protected BlockVector position2; protected CuboidRegion region; /** - * Create a new region selector with no world. + * Create a new region selector with a {@code null} world. */ public CuboidRegionSelector() { this((World) null); } - /** - * @deprecated cast {@code world} to {@link World} - */ - @Deprecated - public CuboidRegionSelector(@Nullable LocalWorld world) { - this((World) world); - } - /** * Create a new region selector. * - * @param world the world + * @param world the world, which may be {@code null} */ public CuboidRegionSelector(@Nullable World world) { 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) { this(checkNotNull(oldSelector).getIncompleteRegion().getWorld()); + if (oldSelector instanceof CuboidRegionSelector) { final CuboidRegionSelector cuboidRegionSelector = (CuboidRegionSelector) oldSelector; - pos1 = cuboidRegionSelector.pos1; - pos2 = cuboidRegionSelector.pos2; + position1 = cuboidRegionSelector.position1; + position2 = cuboidRegionSelector.position2; } else { final Region oldRegion; try { @@ -87,67 +81,67 @@ public class CuboidRegionSelector extends com.sk89q.worldedit.regions.CuboidRegi return; } - pos1 = oldRegion.getMinimumPoint().toBlockVector(); - pos2 = oldRegion.getMaximumPoint().toBlockVector(); + position1 = oldRegion.getMinimumPoint().toBlockVector(); + position2 = oldRegion.getMaximumPoint().toBlockVector(); } - region.setPos1(pos1); - region.setPos2(pos2); - } - - /** - * @deprecated cast {@code world} to {@link World} - */ - @Deprecated - public CuboidRegionSelector(@Nullable LocalWorld world, Vector pos1, Vector pos2) { - this((World) world, pos1, pos2); + region.setPos1(position1); + region.setPos2(position2); } /** * Create a new region selector with the given two positions. * * @param world the world - * @param pos1 position 1 - * @param pos2 position 2 + * @param position1 position 1 + * @param position2 position 2 */ - public CuboidRegionSelector(@Nullable World world, Vector pos1, Vector pos2) { + public CuboidRegionSelector(@Nullable World world, Vector position1, Vector position2) { this(world); - checkNotNull(pos1); - checkNotNull(pos2); - this.pos1 = pos1.toBlockVector(); - this.pos2 = pos2.toBlockVector(); - region.setPos1(pos1); - region.setPos2(pos2); + checkNotNull(position1); + checkNotNull(position2); + this.position1 = position1.toBlockVector(); + this.position2 = position2.toBlockVector(); + region.setPos1(position1); + region.setPos2(position2); } @Override - public boolean selectPrimary(Vector pos) { - if (pos1 != null && (pos.compareTo(pos1) == 0)) { + public boolean selectPrimary(Vector position, SelectorLimits limits) { + checkNotNull(position); + + if (position1 != null && (position.compareTo(position1) == 0)) { return false; } - pos1 = pos.toBlockVector(); - region.setPos1(pos1); + position1 = position.toBlockVector(); + region.setPos1(position1); return true; } @Override - public boolean selectSecondary(Vector pos) { - if (pos2 != null && (pos.compareTo(pos2)) == 0) { + public boolean selectSecondary(Vector position, SelectorLimits limits) { + checkNotNull(position); + + if (position2 != null && (position.compareTo(position2)) == 0) { return false; } - pos2 = pos.toBlockVector(); - region.setPos2(pos2); + position2 = position.toBlockVector(); + region.setPos2(position2); return true; } @Override public void explainPrimarySelection(Actor player, LocalSession session, Vector pos) { - if (pos1 != null && pos2 != null) { - player.print("First position set to " + pos1 + " (" + region.getArea() + ")."); + checkNotNull(player); + checkNotNull(session); + checkNotNull(pos); + + if (position1 != null && position2 != null) { + player.print("First position set to " + position1 + " (" + region.getArea() + ")."); } else { - player.print("First position set to " + pos1 + "."); + player.print("First position set to " + position1 + "."); } session.dispatchCUIEvent(player, new SelectionPointEvent(0, pos, getArea())); @@ -155,10 +149,14 @@ public class CuboidRegionSelector extends com.sk89q.worldedit.regions.CuboidRegi @Override public void explainSecondarySelection(Actor player, LocalSession session, Vector pos) { - if (pos1 != null && pos2 != null) { - player.print("Second position set to " + pos2 + " (" + region.getArea() + ")."); + checkNotNull(player); + checkNotNull(session); + checkNotNull(pos); + + if (position1 != null && position2 != null) { + player.print("Second position set to " + position2 + " (" + region.getArea() + ")."); } else { - player.print("Second position set to " + pos2 + "."); + player.print("Second position set to " + position2 + "."); } session.dispatchCUIEvent(player, new SelectionPointEvent(1, pos, getArea())); @@ -166,32 +164,35 @@ public class CuboidRegionSelector extends com.sk89q.worldedit.regions.CuboidRegi @Override public void explainRegionAdjust(Actor player, LocalSession session) { - if (pos1 != null) { - session.dispatchCUIEvent(player, new SelectionPointEvent(0, pos1, getArea())); + checkNotNull(player); + checkNotNull(session); + + if (position1 != null) { + session.dispatchCUIEvent(player, new SelectionPointEvent(0, position1, getArea())); } - if (pos2 != null) { - session.dispatchCUIEvent(player, new SelectionPointEvent(1, pos2, getArea())); + if (position2 != null) { + session.dispatchCUIEvent(player, new SelectionPointEvent(1, position2, getArea())); } } @Override public BlockVector getPrimaryPosition() throws IncompleteRegionException { - if (pos1 == null) { + if (position1 == null) { throw new IncompleteRegionException(); } - return pos1; + return position1; } @Override public boolean isDefined() { - return pos1 != null && pos2 != null; + return position1 != null && position2 != null; } @Override public CuboidRegion getRegion() throws IncompleteRegionException { - if (pos1 == null || pos2 == null) { + if (position1 == null || position2 == null) { throw new IncompleteRegionException(); } @@ -205,14 +206,14 @@ public class CuboidRegionSelector extends com.sk89q.worldedit.regions.CuboidRegi @Override public void learnChanges() { - pos1 = region.getPos1().toBlockVector(); - pos2 = region.getPos2().toBlockVector(); + position1 = region.getPos1().toBlockVector(); + position2 = region.getPos2().toBlockVector(); } @Override public void clear() { - pos1 = null; - pos2 = null; + position1 = null; + position2 = null; } @Override @@ -224,12 +225,12 @@ public class CuboidRegionSelector extends com.sk89q.worldedit.regions.CuboidRegi public List getInformationLines() { final List lines = new ArrayList(); - if (pos1 != null) { - lines.add("Position 1: " + pos1); + if (position1 != null) { + lines.add("Position 1: " + position1); } - if (pos2 != null) { - lines.add("Position 2: " + pos2); + if (position2 != null) { + lines.add("Position 2: " + position2); } return lines; @@ -237,11 +238,11 @@ public class CuboidRegionSelector extends com.sk89q.worldedit.regions.CuboidRegi @Override public int getArea() { - if (pos1 == null) { + if (position1 == null) { return -1; } - if (pos2 == null) { + if (position2 == null) { return -1; } @@ -250,12 +251,12 @@ public class CuboidRegionSelector extends com.sk89q.worldedit.regions.CuboidRegi @Override public void describeCUI(LocalSession session, Actor player) { - if (pos1 != null) { - session.dispatchCUIEvent(player, new SelectionPointEvent(0, pos1, getArea())); + if (position1 != null) { + session.dispatchCUIEvent(player, new SelectionPointEvent(0, position1, getArea())); } - if (pos2 != null) { - session.dispatchCUIEvent(player, new SelectionPointEvent(1, pos2, getArea())); + if (position2 != null) { + session.dispatchCUIEvent(player, new SelectionPointEvent(1, position2, getArea())); } } @@ -278,20 +279,5 @@ public class CuboidRegionSelector extends com.sk89q.worldedit.regions.CuboidRegi public String getLegacyTypeID() { 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); - } } diff --git a/src/main/java/com/sk89q/worldedit/regions/selector/CylinderRegionSelector.java b/src/main/java/com/sk89q/worldedit/regions/selector/CylinderRegionSelector.java index 4d591510a..1a9297c76 100644 --- a/src/main/java/com/sk89q/worldedit/regions/selector/CylinderRegionSelector.java +++ b/src/main/java/com/sk89q/worldedit/regions/selector/CylinderRegionSelector.java @@ -25,6 +25,7 @@ import com.sk89q.worldedit.internal.cui.*; import com.sk89q.worldedit.regions.CylinderRegion; import com.sk89q.worldedit.regions.Region; import com.sk89q.worldedit.regions.RegionSelector; +import com.sk89q.worldedit.regions.selector.limit.SelectorLimits; import com.sk89q.worldedit.world.World; import javax.annotation.Nullable; @@ -35,7 +36,7 @@ import java.util.List; 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 { @@ -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(@Nullable LocalWorld world) { - this((World) world); + public CylinderRegionSelector() { + this((World) null); } /** * Create a new region selector. * - * @param world the world + * @param world the world, which may be {@code null} */ public CylinderRegionSelector(@Nullable World world) { region = new CylinderRegion(world); @@ -71,6 +71,7 @@ public class CylinderRegionSelector extends com.sk89q.worldedit.regions.Cylinder */ public CylinderRegionSelector(RegionSelector oldSelector) { this(checkNotNull(oldSelector).getIncompleteRegion().getWorld()); + if (oldSelector instanceof CylinderRegionSelector) { final CylinderRegionSelector cylSelector = (CylinderRegionSelector) oldSelector; @@ -104,7 +105,7 @@ public class CylinderRegionSelector extends com.sk89q.worldedit.regions.Cylinder * @param minY the minimum 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); region.setCenter(center); @@ -115,30 +116,30 @@ public class CylinderRegionSelector extends com.sk89q.worldedit.regions.Cylinder } @Override - public boolean selectPrimary(Vector pos) { - if (!region.getCenter().equals(Vector.ZERO) && pos.compareTo(region.getCenter()) == 0) { + public boolean selectPrimary(Vector position, SelectorLimits limits) { + if (!region.getCenter().equals(Vector.ZERO) && position.compareTo(region.getCenter()) == 0) { return false; } region = new CylinderRegion(region.getWorld()); - region.setCenter(pos.toVector2D()); - region.setY(pos.getBlockY()); + region.setCenter(position.toVector2D()); + region.setY(position.getBlockY()); return true; } @Override - public boolean selectSecondary(Vector pos) { + public boolean selectSecondary(Vector position, SelectorLimits limits) { Vector center = region.getCenter(); if ((center.compareTo(Vector.ZERO)) == 0) { 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)); region.extendRadius(minRadius); - region.setY(pos.getBlockY()); + region.setY(position.getBlockY()); return true; } @@ -153,6 +154,7 @@ public class CylinderRegionSelector extends com.sk89q.worldedit.regions.Cylinder @Override public void explainSecondarySelection(Actor player, LocalSession session, Vector pos) { Vector center = region.getCenter(); + if (!center.equals(Vector.ZERO)) { player.print("Radius set to " + format.format(region.getRadius().getX()) + "/" + format.format(region.getRadius().getZ()) + " blocks. (" + region.getArea() + ")."); } else { @@ -258,19 +260,4 @@ public class CylinderRegionSelector extends com.sk89q.worldedit.regions.Cylinder 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); - } - } diff --git a/src/main/java/com/sk89q/worldedit/regions/selector/EllipsoidRegionSelector.java b/src/main/java/com/sk89q/worldedit/regions/selector/EllipsoidRegionSelector.java index 1215d5a95..f2d2e6971 100644 --- a/src/main/java/com/sk89q/worldedit/regions/selector/EllipsoidRegionSelector.java +++ b/src/main/java/com/sk89q/worldedit/regions/selector/EllipsoidRegionSelector.java @@ -27,6 +27,7 @@ import com.sk89q.worldedit.internal.cui.SelectionPointEvent; import com.sk89q.worldedit.regions.EllipsoidRegion; import com.sk89q.worldedit.regions.Region; import com.sk89q.worldedit.regions.RegionSelector; +import com.sk89q.worldedit.regions.selector.limit.SelectorLimits; import com.sk89q.worldedit.world.World; import javax.annotation.Nullable; @@ -36,7 +37,7 @@ import java.util.List; 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 { @@ -44,24 +45,16 @@ public class EllipsoidRegionSelector extends com.sk89q.worldedit.regions.Ellipso protected boolean started = false; /** - * Create a new selector. + * Create a new selector with a {@code null} world. */ public EllipsoidRegionSelector() { this((World) null); } - /** - * @deprecated cast {@code world} to {@link World} - */ - @Deprecated - public EllipsoidRegionSelector(@Nullable LocalWorld world) { - this((World) world); - } - /** * Create a new selector. * - * @param world the world + * @param world the world, which may be {@code null} */ public EllipsoidRegionSelector(@Nullable World world) { 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 radius the radius */ - public EllipsoidRegionSelector(@Nullable LocalWorld world, Vector center, Vector radius) { + public EllipsoidRegionSelector(@Nullable World world, Vector center, Vector radius) { this(world); region.setCenter(center); @@ -110,12 +103,12 @@ public class EllipsoidRegionSelector extends com.sk89q.worldedit.regions.Ellipso } @Override - public boolean selectPrimary(Vector pos) { - if (pos.equals(region.getCenter()) && region.getRadius().lengthSq() == 0) { + public boolean selectPrimary(Vector position, SelectorLimits limits) { + if (position.equals(region.getCenter()) && region.getRadius().lengthSq() == 0) { return false; } - region.setCenter(pos.toBlockVector()); + region.setCenter(position.toBlockVector()); region.setRadius(new Vector()); started = true; @@ -123,12 +116,12 @@ public class EllipsoidRegionSelector extends com.sk89q.worldedit.regions.Ellipso } @Override - public boolean selectSecondary(Vector pos) { + public boolean selectSecondary(Vector position, SelectorLimits limits) { if (!started) { 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)); region.extendRadius(minRadius); return true; @@ -249,19 +242,4 @@ public class EllipsoidRegionSelector extends com.sk89q.worldedit.regions.Ellipso 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); - } - } diff --git a/src/main/java/com/sk89q/worldedit/regions/selector/ExtendingCuboidRegionSelector.java b/src/main/java/com/sk89q/worldedit/regions/selector/ExtendingCuboidRegionSelector.java index 518d1b707..0e239f0d3 100644 --- a/src/main/java/com/sk89q/worldedit/regions/selector/ExtendingCuboidRegionSelector.java +++ b/src/main/java/com/sk89q/worldedit/regions/selector/ExtendingCuboidRegionSelector.java @@ -19,29 +19,33 @@ 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.regions.CuboidRegion; import com.sk89q.worldedit.regions.RegionSelector; +import com.sk89q.worldedit.regions.selector.limit.SelectorLimits; import com.sk89q.worldedit.world.World; import javax.annotation.Nullable; /** - * A {@link RegionSelector} for {@link CuboidRegion}s that enlarges the - * region with every secondary selection. + * Creates a {@code CuboidRegion} from a user's selections by expanding + * the region on every right click. */ public class ExtendingCuboidRegionSelector extends CuboidRegionSelector { - @Deprecated - public ExtendingCuboidRegionSelector(@Nullable LocalWorld world) { - this((World) world); + /** + * Create a new selector with a {@code null} world. + */ + public ExtendingCuboidRegionSelector() { + super((World) null); } /** * Create a new selector. * - * @param world the world + * @param world the world, which may be {@code null} */ public ExtendingCuboidRegionSelector(@Nullable World world) { super(world); @@ -55,71 +59,71 @@ public class ExtendingCuboidRegionSelector extends CuboidRegionSelector { public ExtendingCuboidRegionSelector(RegionSelector oldSelector) { super(oldSelector); - if (pos1 == null || pos2 == null) { + if (position1 == null || position2 == null) { return; } - pos1 = region.getMinimumPoint().toBlockVector(); - pos2 = region.getMaximumPoint().toBlockVector(); - region.setPos1(pos1); - region.setPos2(pos2); + position1 = region.getMinimumPoint().toBlockVector(); + position2 = region.getMaximumPoint().toBlockVector(); + region.setPos1(position1); + region.setPos2(position2); } /** * Create a new selector. * * @param world the world - * @param pos1 the first position - * @param pos2 the second position + * @param position1 the first 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); - pos1 = Vector.getMinimum(pos1, pos2); - pos2 = Vector.getMaximum(pos1, pos2); - region.setPos1(pos1); - region.setPos2(pos2); + position1 = Vector.getMinimum(position1, position2); + position2 = Vector.getMaximum(position1, position2); + region.setPos1(position1); + region.setPos2(position2); } @Override - public boolean selectPrimary(Vector pos) { - if (pos1 != null && pos2 != null && pos.compareTo(pos1) == 0 && pos.compareTo(pos2) == 0) { + public boolean selectPrimary(Vector position, SelectorLimits limits) { + if (position1 != null && position2 != null && position.compareTo(position1) == 0 && position.compareTo(position2) == 0) { return false; } - pos1 = pos2 = pos.toBlockVector(); - region.setPos1(pos1); - region.setPos2(pos2); + position1 = position2 = position.toBlockVector(); + region.setPos1(position1); + region.setPos2(position2); return true; } @Override - public boolean selectSecondary(Vector pos) { - if (pos1 == null || pos2 == null) { - return selectPrimary(pos); + public boolean selectSecondary(Vector position, SelectorLimits limits) { + if (position1 == null || position2 == null) { + return selectPrimary(position, limits); } - if (region.contains(pos)) { + if (region.contains(position)) { return false; } - double x1 = Math.min(pos.getX(), pos1.getX()); - double y1 = Math.min(pos.getY(), pos1.getY()); - double z1 = Math.min(pos.getZ(), pos1.getZ()); + double x1 = Math.min(position.getX(), position1.getX()); + double y1 = Math.min(position.getY(), position1.getY()); + double z1 = Math.min(position.getZ(), position1.getZ()); - double x2 = Math.max(pos.getX(), pos2.getX()); - double y2 = Math.max(pos.getY(), pos2.getY()); - double z2 = Math.max(pos.getZ(), pos2.getZ()); + double x2 = Math.max(position.getX(), position2.getX()); + double y2 = Math.max(position.getY(), position2.getY()); + double z2 = Math.max(position.getZ(), position2.getZ()); - final BlockVector o1 = pos1; - final BlockVector o2 = pos2; - pos1 = new BlockVector(x1, y1, z1); - pos2 = new BlockVector(x2, y2, z2); - region.setPos1(pos1); - region.setPos2(pos2); + final BlockVector o1 = position1; + final BlockVector o2 = position2; + position1 = new BlockVector(x1, y1, z1); + position2 = new BlockVector(x2, y2, z2); + region.setPos1(position1); + region.setPos2(position2); assert(region.contains(o1)); assert(region.contains(o2)); - assert(region.contains(pos)); + assert(region.contains(position)); return true; } @@ -138,19 +142,4 @@ public class ExtendingCuboidRegionSelector extends CuboidRegionSelector { 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); - } - } diff --git a/src/main/java/com/sk89q/worldedit/regions/selector/Polygonal2DRegionSelector.java b/src/main/java/com/sk89q/worldedit/regions/selector/Polygonal2DRegionSelector.java index 1a36f5572..767f17e36 100644 --- a/src/main/java/com/sk89q/worldedit/regions/selector/Polygonal2DRegionSelector.java +++ b/src/main/java/com/sk89q/worldedit/regions/selector/Polygonal2DRegionSelector.java @@ -19,6 +19,7 @@ package com.sk89q.worldedit.regions.selector; +import com.google.common.base.Optional; import com.sk89q.worldedit.*; import com.sk89q.worldedit.extension.platform.Actor; 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.Region; import com.sk89q.worldedit.regions.RegionSelector; +import com.sk89q.worldedit.regions.selector.limit.SelectorLimits; import com.sk89q.worldedit.world.World; import javax.annotation.Nullable; @@ -37,57 +39,37 @@ import java.util.List; 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 { - private int maxPoints; private BlockVector pos1; private Polygonal2DRegion region; /** - * @deprecated Use {@link #Polygonal2DRegionSelector(LocalWorld, int)} + * Create a new selector with a {@code null} world. */ - @Deprecated - public Polygonal2DRegionSelector(@Nullable LocalWorld world) { - this(world, 50); + public Polygonal2DRegionSelector() { + this((World) null); } /** - * @deprecated cast {@code world} to {@link World} - */ - @Deprecated - public Polygonal2DRegionSelector(@Nullable LocalWorld world, int maxPoints) { - this((World) world, maxPoints); - } - - /** - * Create a new selector. + * Create a new selector with the given world. * * @param world the world - * @param maxPoints the maximum number of points */ - public Polygonal2DRegionSelector(@Nullable World world, int maxPoints) { - this.maxPoints = maxPoints; + public Polygonal2DRegionSelector(@Nullable World 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. * * @param oldSelector the old selector - * @param maxPoints the maximum number of points */ - public Polygonal2DRegionSelector(RegionSelector oldSelector, int maxPoints) { - this(checkNotNull(oldSelector).getIncompleteRegion().getWorld(), maxPoints); + public Polygonal2DRegionSelector(RegionSelector oldSelector) { + this(checkNotNull(oldSelector).getIncompleteRegion().getWorld()); + if (oldSelector instanceof Polygonal2DRegionSelector) { 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 maxY = oldRegion.getMaximumPoint().getBlockY(); - List points = oldRegion.polygonize(maxPoints); + List points = oldRegion.polygonize(Integer.MAX_VALUE); pos1 = points.get(0).toVector(minY).toBlockVector(); region = new Polygonal2DRegion(oldRegion.getWorld(), points, minY, maxY); @@ -136,36 +118,38 @@ public class Polygonal2DRegionSelector extends com.sk89q.worldedit.regions.Polyg } @Override - public boolean selectPrimary(Vector pos) { - if (pos.equals(pos1)) { + public boolean selectPrimary(Vector position, SelectorLimits limits) { + if (position.equals(pos1)) { return false; } - pos1 = pos.toBlockVector(); + pos1 = position.toBlockVector(); region = new Polygonal2DRegion(region.getWorld()); - region.addPoint(pos); - region.expandY(pos.getBlockY()); + region.addPoint(position); + region.expandY(position.getBlockY()); return true; } @Override - public boolean selectSecondary(Vector pos) { + public boolean selectSecondary(Vector position, SelectorLimits limits) { if (region.size() > 0) { final List points = region.getPoints(); 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; } - if (maxPoints >= 0 && points.size() > maxPoints) { + Optional vertexLimit = limits.getPolygonVertexLimit(); + + if (vertexLimit.isPresent() && points.size() > vertexLimit.get()) { return false; } } - region.addPoint(pos); - region.expandY(pos.getBlockY()); + region.addPoint(position); + region.expandY(position.getBlockY()); return true; } @@ -288,19 +272,4 @@ public class Polygonal2DRegionSelector extends com.sk89q.worldedit.regions.Polyg 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); - } - } diff --git a/src/main/java/com/sk89q/worldedit/regions/selector/SphereRegionSelector.java b/src/main/java/com/sk89q/worldedit/regions/selector/SphereRegionSelector.java index 002ba7577..8141748f3 100644 --- a/src/main/java/com/sk89q/worldedit/regions/selector/SphereRegionSelector.java +++ b/src/main/java/com/sk89q/worldedit/regions/selector/SphereRegionSelector.java @@ -19,42 +19,36 @@ package com.sk89q.worldedit.regions.selector; -import com.sk89q.worldedit.LocalPlayer; import com.sk89q.worldedit.LocalSession; -import com.sk89q.worldedit.LocalWorld; import com.sk89q.worldedit.Vector; import com.sk89q.worldedit.extension.platform.Actor; import com.sk89q.worldedit.regions.RegionSelector; +import com.sk89q.worldedit.regions.selector.limit.SelectorLimits; import com.sk89q.worldedit.world.World; 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 { - @Deprecated - public SphereRegionSelector(@Nullable LocalWorld world) { - this((World) world); + /** + * Create a new selector with a {@code null world}. + */ + public SphereRegionSelector() { + super(); } /** * Create a new selector. * - * @param world the world + * @param world the world, which may be {@code null} */ public SphereRegionSelector(@Nullable World world) { super(world); } - /** - * Create a new selector. - */ - public SphereRegionSelector() { - super(); - } - /** * Create a new selector from another one * @@ -74,17 +68,17 @@ public class SphereRegionSelector extends EllipsoidRegionSelector { * @param center the center position * @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)); } @Override - public boolean selectSecondary(Vector pos) { + public boolean selectSecondary(Vector position, SelectorLimits limits) { if (!started) { 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)); return true; @@ -106,19 +100,4 @@ public class SphereRegionSelector extends EllipsoidRegionSelector { 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); - } - } diff --git a/src/main/java/com/sk89q/worldedit/regions/selector/limit/PermissiveSelectorLimits.java b/src/main/java/com/sk89q/worldedit/regions/selector/limit/PermissiveSelectorLimits.java new file mode 100644 index 000000000..17d965840 --- /dev/null +++ b/src/main/java/com/sk89q/worldedit/regions/selector/limit/PermissiveSelectorLimits.java @@ -0,0 +1,53 @@ +/* + * 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.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 getPolygonVertexLimit() { + return Optional.absent(); + } + + @Override + public Optional getPolyhedronVertexLimit() { + return Optional.absent(); + } + + /** + * Get a static instance. + * + * @return an instance + */ + public static PermissiveSelectorLimits getInstance() { + return INSTANCE; + } + +} diff --git a/src/main/java/com/sk89q/worldedit/regions/selector/limit/SelectorLimits.java b/src/main/java/com/sk89q/worldedit/regions/selector/limit/SelectorLimits.java new file mode 100644 index 000000000..143efb49d --- /dev/null +++ b/src/main/java/com/sk89q/worldedit/regions/selector/limit/SelectorLimits.java @@ -0,0 +1,47 @@ +/* + * 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.regions.selector.limit; + +import com.google.common.base.Optional; + +/** + * Defines limits for selections. + */ +public interface SelectorLimits { + + /** + * Get the optionally defined vertex limit for polygons. + * + *

If one is not present, then there is no limitation.

+ * + * @return an optional vertex limit + */ + Optional getPolygonVertexLimit(); + + /** + * Get the optionally defined vertex limit for polyhedrons. + * + *

If one is not present, then there is no limitation.

+ * + * @return an optional vertex limit + */ + Optional getPolyhedronVertexLimit(); + +}