Make a few more selection commands usable from console.

This commit is contained in:
wizjany 2019-11-09 11:31:51 -05:00
parent 1fbb7a70f9
commit 575463a8e9

View File

@ -80,6 +80,7 @@ import org.enginehub.piston.annotation.CommandContainer;
import org.enginehub.piston.annotation.param.Arg; import org.enginehub.piston.annotation.param.Arg;
import org.enginehub.piston.annotation.param.ArgFlag; import org.enginehub.piston.annotation.param.ArgFlag;
import org.enginehub.piston.annotation.param.Switch; import org.enginehub.piston.annotation.param.Switch;
import org.enginehub.piston.exception.StopExecutionException;
import java.util.List; import java.util.List;
import java.util.Optional; import java.util.Optional;
@ -206,7 +207,7 @@ public class SelectionCommands {
) )
@Logging(POSITION) @Logging(POSITION)
@CommandPermissions("worldedit.selection.chunk") @CommandPermissions("worldedit.selection.chunk")
public void chunk(Player player, LocalSession session, public void chunk(Actor actor, World world, LocalSession session,
@Arg(desc = "The chunk to select", def = "") @Arg(desc = "The chunk to select", def = "")
BlockVector2 coordinates, BlockVector2 coordinates,
@Switch(name = 's', desc = "Expand your selection to encompass all chunks that are part of it") @Switch(name = 's', desc = "Expand your selection to encompass all chunks that are part of it")
@ -215,7 +216,6 @@ public class SelectionCommands {
boolean useChunkCoordinates) throws WorldEditException { boolean useChunkCoordinates) throws WorldEditException {
final BlockVector3 min; final BlockVector3 min;
final BlockVector3 max; final BlockVector3 max;
final World world = player.getWorld();
if (expandSelection) { if (expandSelection) {
Region region = session.getSelection(world); Region region = session.getSelection(world);
@ -225,7 +225,7 @@ public class SelectionCommands {
min = BlockVector3.at(min2D.getBlockX() * 16, 0, min2D.getBlockZ() * 16); min = BlockVector3.at(min2D.getBlockX() * 16, 0, min2D.getBlockZ() * 16);
max = BlockVector3.at(max2D.getBlockX() * 16 + 15, world.getMaxY(), max2D.getBlockZ() * 16 + 15); max = BlockVector3.at(max2D.getBlockX() * 16 + 15, world.getMaxY(), max2D.getBlockZ() * 16 + 15);
player.print("Chunks selected: (" actor.print("Chunks selected: ("
+ min2D.getBlockX() + ", " + min2D.getBlockZ() + ") - (" + min2D.getBlockX() + ", " + min2D.getBlockZ() + ") - ("
+ max2D.getBlockX() + ", " + max2D.getBlockZ() + ")"); + max2D.getBlockX() + ", " + max2D.getBlockZ() + ")");
} else { } else {
@ -237,13 +237,17 @@ public class SelectionCommands {
: ChunkStore.toChunk(coordinates.toBlockVector3()); : ChunkStore.toChunk(coordinates.toBlockVector3());
} else { } else {
// use player loc // use player loc
min2D = ChunkStore.toChunk(player.getBlockLocation().toVector().toBlockPoint()); if (actor instanceof Locatable) {
min2D = ChunkStore.toChunk(((Locatable) actor).getBlockLocation().toVector().toBlockPoint());
} else {
throw new StopExecutionException(TextComponent.of("A player or coordinates are required."));
}
} }
min = BlockVector3.at(min2D.getBlockX() * 16, 0, min2D.getBlockZ() * 16); min = BlockVector3.at(min2D.getBlockX() * 16, 0, min2D.getBlockZ() * 16);
max = min.add(15, world.getMaxY(), 15); max = min.add(15, world.getMaxY(), 15);
player.print("Chunk selected: " actor.print("Chunk selected: "
+ min2D.getBlockX() + ", " + min2D.getBlockZ()); + min2D.getBlockX() + ", " + min2D.getBlockZ());
} }
@ -253,11 +257,11 @@ public class SelectionCommands {
} else { } else {
selector = new CuboidRegionSelector(world); selector = new CuboidRegionSelector(world);
} }
selector.selectPrimary(min, ActorSelectorLimits.forActor(player)); selector.selectPrimary(min, ActorSelectorLimits.forActor(actor));
selector.selectSecondary(max, ActorSelectorLimits.forActor(player)); selector.selectSecondary(max, ActorSelectorLimits.forActor(actor));
session.setRegionSelector(world, selector); session.setRegionSelector(world, selector);
session.dispatchCUISelection(player); session.dispatchCUISelection(actor);
} }
@ -433,7 +437,7 @@ public class SelectionCommands {
desc = "Get information about the selection" desc = "Get information about the selection"
) )
@CommandPermissions("worldedit.selection.size") @CommandPermissions("worldedit.selection.size")
public void size(Player player, LocalSession session, public void size(Actor actor, World world, LocalSession session,
@Switch(name = 'c', desc = "Get clipboard info instead") @Switch(name = 'c', desc = "Get clipboard info instead")
boolean clipboardInfo) throws WorldEditException { boolean clipboardInfo) throws WorldEditException {
Region region; Region region;
@ -443,23 +447,23 @@ public class SelectionCommands {
region = clipboard.getRegion(); region = clipboard.getRegion();
BlockVector3 origin = clipboard.getOrigin(); BlockVector3 origin = clipboard.getOrigin();
player.print("Offset: " + origin); actor.print("Offset: " + origin);
} else { } else {
region = session.getSelection(player.getWorld()); region = session.getSelection(world);
player.print("Type: " + session.getRegionSelector(player.getWorld()).getTypeName()); actor.print("Type: " + session.getRegionSelector(world).getTypeName());
for (String line : session.getRegionSelector(player.getWorld()).getInformationLines()) { for (String line : session.getRegionSelector(world).getInformationLines()) {
player.print(line); actor.print(line);
} }
} }
BlockVector3 size = region.getMaximumPoint() BlockVector3 size = region.getMaximumPoint()
.subtract(region.getMinimumPoint()) .subtract(region.getMinimumPoint())
.add(1, 1, 1); .add(1, 1, 1);
player.print("Size: " + size); actor.print("Size: " + size);
player.print("Cuboid distance: " + region.getMaximumPoint().distance(region.getMinimumPoint())); actor.print("Cuboid distance: " + region.getMaximumPoint().distance(region.getMinimumPoint()));
player.print("# of blocks: " + region.getArea()); actor.print("# of blocks: " + region.getArea());
} }
@ -468,11 +472,11 @@ public class SelectionCommands {
desc = "Counts the number of blocks matching a mask" desc = "Counts the number of blocks matching a mask"
) )
@CommandPermissions("worldedit.analysis.count") @CommandPermissions("worldedit.analysis.count")
public void count(Player player, LocalSession session, EditSession editSession, public void count(Actor actor, World world, LocalSession session, EditSession editSession,
@Arg(desc = "The mask of blocks to match") @Arg(desc = "The mask of blocks to match")
Mask mask) throws WorldEditException { Mask mask) throws WorldEditException {
int count = editSession.countBlocks(session.getSelection(player.getWorld()), mask); int count = editSession.countBlocks(session.getSelection(world), mask);
player.print("Counted: " + count); actor.print("Counted: " + count);
} }
@Command( @Command(
@ -480,7 +484,7 @@ public class SelectionCommands {
desc = "Get the distribution of blocks in the selection" desc = "Get the distribution of blocks in the selection"
) )
@CommandPermissions("worldedit.analysis.distr") @CommandPermissions("worldedit.analysis.distr")
public void distr(Player player, LocalSession session, public void distr(Actor actor, World world, LocalSession session,
@Switch(name = 'c', desc = "Get the distribution of the clipboard instead") @Switch(name = 'c', desc = "Get the distribution of the clipboard instead")
boolean clipboardDistr, boolean clipboardDistr,
@Switch(name = 'd', desc = "Separate blocks by state") @Switch(name = 'd', desc = "Separate blocks by state")
@ -497,8 +501,8 @@ public class SelectionCommands {
Operations.completeBlindly(visitor); Operations.completeBlindly(visitor);
distribution = count.getDistribution(); distribution = count.getDistribution();
} else { } else {
try (EditSession editSession = session.createEditSession(player)) { try (EditSession editSession = session.createEditSession(actor)) {
distribution = editSession.getBlockDistribution(session.getSelection(player.getWorld()), separateStates); distribution = editSession.getBlockDistribution(session.getSelection(world), separateStates);
} }
} }
session.setLastDistribution(distribution); session.setLastDistribution(distribution);
@ -506,19 +510,23 @@ public class SelectionCommands {
} else { } else {
distribution = session.getLastDistribution(); distribution = session.getLastDistribution();
if (distribution == null) { if (distribution == null) {
player.printError("No previous distribution."); actor.printError("No previous distribution.");
return; return;
} }
} }
if (distribution.isEmpty()) { // *Should* always be false if (distribution.isEmpty()) { // *Should* always be false
player.printError("No blocks counted."); actor.printError("No blocks counted.");
return; return;
} }
final int finalPage = page; final int finalPage = page;
WorldEditAsyncCommandBuilder.createAndSendMessage(player, WorldEditAsyncCommandBuilder.createAndSendMessage(actor,
() -> new BlockDistributionResult(distribution, separateStates).create(finalPage), null); () -> {
BlockDistributionResult res = new BlockDistributionResult(distribution, separateStates);
if (!actor.isPlayer()) res.formatForConsole();
return res.create(finalPage);
}, null);
} }
@Command( @Command(