Merge remote-tracking branch 'remotes/origin/commanding' into commanding

# Conflicts:
#	worldedit-core/src/main/java/com/sk89q/worldedit/command/ChunkCommands.java
#	worldedit-core/src/main/java/com/sk89q/worldedit/command/UtilityCommands.java
This commit is contained in:
MattBDev 2019-07-29 10:58:41 -04:00
commit 7f51791d6c
9 changed files with 74 additions and 51 deletions

View File

@ -80,7 +80,7 @@ public class AsyncSign extends AsyncBlockState implements Sign {
CompoundTag nbt = getNbtData(); CompoundTag nbt = getNbtData();
if (nbt != null) { if (nbt != null) {
String color = nbt.getString("Color").toUpperCase(); String color = nbt.getString("Color").toUpperCase();
return DyeColor.valueOf(color); if (!color.isEmpty()) return DyeColor.valueOf(color);
} }
return DyeColor.BLACK; return DyeColor.BLACK;
} }

View File

@ -96,8 +96,7 @@ public class ChunkCommands {
@ArgFlag(name = 'p', desc = "Page number.", def = "1") int page) throws WorldEditException { @ArgFlag(name = 'p', desc = "Page number.", def = "1") int page) throws WorldEditException {
Set<BlockVector2> chunks = session.getSelection(world).getChunks(); Set<BlockVector2> chunks = session.getSelection(world).getChunks();
PaginationBox paginationBox = PaginationBox.fromStrings("Selected Chunks", "/listchunks -p %page%", PaginationBox paginationBox = PaginationBox.fromStrings("Selected Chunks", "/listchunks -p %page%", chunks);
chunks.stream().map(BlockVector2::toString).collect(Collectors.toList()));
actor.print(paginationBox.create(page)); actor.print(paginationBox.create(page));
} }

View File

@ -324,7 +324,7 @@ public class GeneralCommands {
checkRandomization = false; checkRandomization = false;
} else { } else {
if (argLower.equals("#copy") || argLower.equals("#clipboard")) { if (argLower.equals("#copy") || argLower.equals("#clipboard")) {
Clipboard clipboard = worldEdit.getSessionManager().get(player).getClipboard().getClipboard(); Clipboard clipboard = session.getClipboard().getClipboard();
util = TextureUtil.fromClipboard(clipboard); util = TextureUtil.fromClipboard(clipboard);
} else if (argLower.equals("*") || argLower.equals("true")) { } else if (argLower.equals("*") || argLower.equals("true")) {
util = Fawe.get().getTextureUtil(); util = Fawe.get().getTextureUtil();

View File

@ -20,6 +20,7 @@
package com.sk89q.worldedit.command; package com.sk89q.worldedit.command;
import static com.google.common.base.Preconditions.checkNotNull; import static com.google.common.base.Preconditions.checkNotNull;
import static com.sk89q.worldedit.command.MethodCommands.getArguments;
import static com.sk89q.worldedit.command.util.Logging.LogMode.ALL; import static com.sk89q.worldedit.command.util.Logging.LogMode.ALL;
import static com.sk89q.worldedit.command.util.Logging.LogMode.PLACEMENT; import static com.sk89q.worldedit.command.util.Logging.LogMode.PLACEMENT;
import static com.sk89q.worldedit.command.util.Logging.LogMode.POSITION; import static com.sk89q.worldedit.command.util.Logging.LogMode.POSITION;
@ -275,7 +276,7 @@ public class GenerationCommands {
int size, int size,
@Arg(desc = "The type of forest", def = "tree") @Arg(desc = "The type of forest", def = "tree")
TreeType type, TreeType type,
@Arg(desc = "The density of the forest, between 0 and 100", def = "5") @Range(min = 0, max = 100) @Arg(desc = "The density of the forest, between 0 and 100", def = "5")
double density) throws WorldEditException { double density) throws WorldEditException {
checkCommandArgument(0 <= density && density <= 100, "Density must be between 0 and 100"); checkCommandArgument(0 <= density && density <= 100, "Density must be between 0 and 100");
density /= 100; density /= 100;

View File

@ -20,6 +20,7 @@
package com.sk89q.worldedit.command; package com.sk89q.worldedit.command;
import static com.google.common.base.Preconditions.checkNotNull; import static com.google.common.base.Preconditions.checkNotNull;
import static com.sk89q.worldedit.command.MethodCommands.getArguments;
import com.boydti.fawe.Fawe; import com.boydti.fawe.Fawe;
import com.boydti.fawe.FaweAPI; import com.boydti.fawe.FaweAPI;
@ -219,7 +220,7 @@ public class HistoryCommands {
) )
@CommandPermissions({"worldedit.history.undo", "worldedit.history.undo.self"}) @CommandPermissions({"worldedit.history.undo", "worldedit.history.undo.self"})
public void undo(Player player, LocalSession session, public void undo(Player player, LocalSession session,
@Arg(desc = "Number of undoes to perform", def = "1") @Range(min = 1) @Arg(desc = "Number of undoes to perform", def = "1")
int times, int times,
@Arg(name = "player", desc = "Undo this player's operations", def = "") @Arg(name = "player", desc = "Undo this player's operations", def = "")
String playerName, String playerName,
@ -266,7 +267,7 @@ public class HistoryCommands {
) )
@CommandPermissions({"worldedit.history.redo", "worldedit.history.redo.self"}) @CommandPermissions({"worldedit.history.redo", "worldedit.history.redo.self"})
public void redo(Player player, LocalSession session, public void redo(Player player, LocalSession session,
@Arg(desc = "Number of redoes to perform", def = "1") @Range(min = 1) @Arg(desc = "Number of redoes to perform", def = "1")
int times, int times,
@Arg(name = "player", desc = "Redo this player's operations", def = "") @Arg(name = "player", desc = "Redo this player's operations", def = "")
String playerName) throws WorldEditException { String playerName) throws WorldEditException {

View File

@ -20,6 +20,7 @@
package com.sk89q.worldedit.command; package com.sk89q.worldedit.command;
import static com.google.common.base.Preconditions.checkNotNull; import static com.google.common.base.Preconditions.checkNotNull;
import static com.sk89q.worldedit.command.MethodCommands.getArguments;
import static com.sk89q.worldedit.command.util.Logging.LogMode.ALL; import static com.sk89q.worldedit.command.util.Logging.LogMode.ALL;
import static com.sk89q.worldedit.command.util.Logging.LogMode.ORIENTATION_REGION; import static com.sk89q.worldedit.command.util.Logging.LogMode.ORIENTATION_REGION;
import static com.sk89q.worldedit.command.util.Logging.LogMode.REGION; import static com.sk89q.worldedit.command.util.Logging.LogMode.REGION;
@ -216,7 +217,7 @@ public class RegionCommands {
@Selection Region region, @Selection Region region,
@Arg(desc = "The pattern of blocks to place") @Arg(desc = "The pattern of blocks to place")
Pattern pattern, Pattern pattern,
@Arg(desc = "The thickness of the line", def = "0") @Range(min = 1) @Arg(desc = "The thickness of the line", def = "0")
int thickness, int thickness,
@Switch(name = 'h', desc = "Generate only a shell") @Switch(name = 'h', desc = "Generate only a shell")
boolean shell) throws WorldEditException { boolean shell) throws WorldEditException {
@ -546,7 +547,7 @@ public class RegionCommands {
boolean skipEntities, boolean skipEntities,
@Switch(name = 'a', desc = "Ignore air blocks") @Switch(name = 'a', desc = "Ignore air blocks")
boolean ignoreAirBlocks, boolean ignoreAirBlocks,
@Switch(name = 'm', desc = "TODO") @Switch(name = 'm', desc = "Source mask")
Mask sourceMask, Mask sourceMask,
InjectedValueAccess context) throws WorldEditException { InjectedValueAccess context) throws WorldEditException {
player.checkConfirmationStack(() -> { player.checkConfirmationStack(() -> {
@ -672,7 +673,7 @@ public class RegionCommands {
@Logging(REGION) @Logging(REGION)
public void hollow(FawePlayer player, EditSession editSession, public void hollow(FawePlayer player, EditSession editSession,
@Selection Region region, @Selection Region region,
@Arg(desc = "Thickness of the shell to leave", def = "0") @Range(min = 0) @Arg(desc = "Thickness of the shell to leave", def = "0")
int thickness, int thickness,
@Arg(desc = "The pattern of blocks to replace the hollowed area with", def = "air") @Arg(desc = "The pattern of blocks to replace the hollowed area with", def = "air")
Pattern pattern, Pattern pattern,

View File

@ -91,13 +91,13 @@ import java.util.UUID;
import java.util.function.Consumer; import java.util.function.Consumer;
import java.util.function.Supplier; import java.util.function.Supplier;
import javax.imageio.ImageIO; import javax.imageio.ImageIO;
import org.checkerframework.checker.nullness.qual.NonNull;
import org.enginehub.piston.annotation.Command; import org.enginehub.piston.annotation.Command;
import org.enginehub.piston.annotation.CommandContainer; 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.inject.InjectedValueAccess; import org.jetbrains.annotations.NotNull;
/** /**
* Utility commands. * Utility commands.
@ -190,9 +190,9 @@ public class UtilityCommands {
public int fill(Player player, LocalSession session, EditSession editSession, public int fill(Player player, LocalSession session, EditSession editSession,
@Arg(desc = "The blocks to fill with") @Arg(desc = "The blocks to fill with")
Pattern pattern, Pattern pattern,
@Arg(desc = "The radius to fill in") @Range(min=1) @Arg(desc = "The radius to fill in")
double radius, double radius,
@Arg(desc = "The depth to fill", def = "1") @Range(min=1) @Arg(desc = "The depth to fill", def = "1")
int depth, int depth,
@Arg(desc = "Direction to fill", def = "down") BlockVector3 direction) throws WorldEditException { @Arg(desc = "Direction to fill", def = "down") BlockVector3 direction) throws WorldEditException {
radius = Math.max(1, radius); radius = Math.max(1, radius);
@ -285,7 +285,7 @@ public class UtilityCommands {
public int fillr(Player player, LocalSession session, EditSession editSession, public int fillr(Player player, LocalSession session, EditSession editSession,
@Arg(desc = "The blocks to fill with") @Arg(desc = "The blocks to fill with")
Pattern pattern, Pattern pattern,
@Arg(desc = "The radius to fill in") @Range(min=1) @Arg(desc = "The radius to fill in")
double radius, double radius,
@Arg(desc = "The depth to fill", def = "") @Arg(desc = "The depth to fill", def = "")
Integer depth) throws WorldEditException { Integer depth) throws WorldEditException {
@ -307,7 +307,7 @@ public class UtilityCommands {
@CommandPermissions("worldedit.drain") @CommandPermissions("worldedit.drain")
@Logging(PLACEMENT) @Logging(PLACEMENT)
public int drain(Player player, LocalSession session, EditSession editSession, public int drain(Player player, LocalSession session, EditSession editSession,
@Arg(desc = "The radius to drain") @Range(min=0) @Arg(desc = "The radius to drain")
double radius, double radius,
@Switch(name = 'w', desc = "Also un-waterlog blocks") @Switch(name = 'w', desc = "Also un-waterlog blocks")
boolean waterlogged) throws WorldEditException { boolean waterlogged) throws WorldEditException {
@ -327,7 +327,7 @@ public class UtilityCommands {
@CommandPermissions("worldedit.fixlava") @CommandPermissions("worldedit.fixlava")
@Logging(PLACEMENT) @Logging(PLACEMENT)
public int fixLava(Player player, LocalSession session, EditSession editSession, public int fixLava(Player player, LocalSession session, EditSession editSession,
@Arg(desc = "The radius to fix in") @Range(min=0) @Arg(desc = "The radius to fix in")
double radius) throws WorldEditException { double radius) throws WorldEditException {
radius = Math.max(0, radius); radius = Math.max(0, radius);
we.checkMaxRadius(radius); we.checkMaxRadius(radius);
@ -344,7 +344,7 @@ public class UtilityCommands {
@CommandPermissions("worldedit.fixwater") @CommandPermissions("worldedit.fixwater")
@Logging(PLACEMENT) @Logging(PLACEMENT)
public int fixWater(Player player, LocalSession session, EditSession editSession, public int fixWater(Player player, LocalSession session, EditSession editSession,
@Arg(desc = "The radius to fix in") @Range(min=0) @Arg(desc = "The radius to fix in")
double radius) throws WorldEditException { double radius) throws WorldEditException {
radius = Math.max(0, radius); radius = Math.max(0, radius);
we.checkMaxRadius(radius); we.checkMaxRadius(radius);
@ -361,7 +361,7 @@ public class UtilityCommands {
@CommandPermissions("worldedit.removeabove") @CommandPermissions("worldedit.removeabove")
@Logging(PLACEMENT) @Logging(PLACEMENT)
public int removeAbove(Player player, LocalSession session, EditSession editSession, public int removeAbove(Player player, LocalSession session, EditSession editSession,
@Arg(desc = "The apothem of the square to remove from", def = "1") @Range(min=1) @Arg(desc = "The apothem of the square to remove from", def = "1")
int size, int size,
@Arg(desc = "The maximum height above you to remove from", def = "") @Arg(desc = "The maximum height above you to remove from", def = "")
Integer height) throws WorldEditException { Integer height) throws WorldEditException {
@ -406,7 +406,7 @@ public class UtilityCommands {
public int removeNear(Player player, LocalSession session, EditSession editSession, public int removeNear(Player player, LocalSession session, EditSession editSession,
@Arg(desc = "The mask of blocks to remove") @Arg(desc = "The mask of blocks to remove")
Mask mask, Mask mask,
@Arg(desc = "The radius of the square to remove from", def = "50") @Range(min=1) @Arg(desc = "The radius of the square to remove from", def = "50")
int radius) throws WorldEditException { int radius) throws WorldEditException {
radius = Math.max(1, radius); radius = Math.max(1, radius);
we.checkMaxRadius(radius); we.checkMaxRadius(radius);
@ -424,7 +424,7 @@ public class UtilityCommands {
@CommandPermissions("worldedit.replacenear") @CommandPermissions("worldedit.replacenear")
@Logging(PLACEMENT) @Logging(PLACEMENT)
public int replaceNear(Player player, LocalSession session, EditSession editSession, public int replaceNear(Player player, LocalSession session, EditSession editSession,
@Arg(desc = "The radius of the square to remove in") @Range(min=1) @Arg(desc = "The radius of the square to remove in")
int radius, int radius,
@Arg(desc = "The mask matching blocks to remove", def = "") @Arg(desc = "The mask matching blocks to remove", def = "")
Mask from, Mask from,
@ -455,7 +455,7 @@ public class UtilityCommands {
@CommandPermissions("worldedit.snow") @CommandPermissions("worldedit.snow")
@Logging(PLACEMENT) @Logging(PLACEMENT)
public int snow(Player player, LocalSession session, EditSession editSession, public int snow(Player player, LocalSession session, EditSession editSession,
@Arg(desc = "The radius of the circle to snow in", def = "10") @Range(min=1) @Arg(desc = "The radius of the circle to snow in", def = "10")
double size) throws WorldEditException { double size) throws WorldEditException {
size = Math.max(1, size); size = Math.max(1, size);
we.checkMaxRadius(size); we.checkMaxRadius(size);
@ -473,7 +473,7 @@ public class UtilityCommands {
@CommandPermissions("worldedit.thaw") @CommandPermissions("worldedit.thaw")
@Logging(PLACEMENT) @Logging(PLACEMENT)
public int thaw(Player player, LocalSession session, EditSession editSession, public int thaw(Player player, LocalSession session, EditSession editSession,
@Arg(desc = "The radius of the circle to thaw in", def = "10") @Range(min=1) @Arg(desc = "The radius of the circle to thaw in", def = "10")
double size) throws WorldEditException { double size) throws WorldEditException {
size = Math.max(1, size); size = Math.max(1, size);
we.checkMaxRadius(size); we.checkMaxRadius(size);
@ -491,7 +491,7 @@ public class UtilityCommands {
@CommandPermissions("worldedit.green") @CommandPermissions("worldedit.green")
@Logging(PLACEMENT) @Logging(PLACEMENT)
public int green(Player player, LocalSession session, EditSession editSession, public int green(Player player, LocalSession session, EditSession editSession,
@Arg(desc = "The radius of the circle to convert in", def = "10") @Range(min=1) @Arg(desc = "The radius of the circle to convert in", def = "10")
double size, double size,
@Switch(name = 'f', desc = "Also convert coarse dirt") @Switch(name = 'f', desc = "Also convert coarse dirt")
boolean convertCoarse) throws WorldEditException { boolean convertCoarse) throws WorldEditException {
@ -512,7 +512,7 @@ public class UtilityCommands {
@CommandPermissions("worldedit.extinguish") @CommandPermissions("worldedit.extinguish")
@Logging(PLACEMENT) @Logging(PLACEMENT)
public void extinguish(Player player, LocalSession session, EditSession editSession, public void extinguish(Player player, LocalSession session, EditSession editSession,
@Arg(desc = "The radius of the square to remove in", def = "") @Range(min=1) @Arg(desc = "The radius of the square to remove in", def = "")
Integer radius) throws WorldEditException { Integer radius) throws WorldEditException {
LocalConfiguration config = we.getConfiguration(); LocalConfiguration config = we.getConfiguration();
@ -595,7 +595,7 @@ public class UtilityCommands {
public int remove(Actor actor, public int remove(Actor actor,
@Arg(desc = "The type of entity to remove") @Arg(desc = "The type of entity to remove")
EntityRemover remover, EntityRemover remover,
@Arg(desc = "The radius of the cuboid to remove from") @Range(min=-1) @Arg(desc = "The radius of the cuboid to remove from")
int radius) throws WorldEditException { int radius) throws WorldEditException {
Player player = actor instanceof Player ? (Player) actor : null; Player player = actor instanceof Player ? (Player) actor : null;
@ -707,8 +707,8 @@ public class UtilityCommands {
PrintCommandHelp.help(command, page, listSubCommands, we, actor); PrintCommandHelp.help(command, page, listSubCommands, we, actor);
} }
public static void list(File dir, Actor actor, InjectedValueAccess args, @Range(min = 0) int page, String formatName, boolean playerFolder, String onClickCmd) { public static void list(File dir, Actor actor, List<String> args, @Range(min = 0) int page, String formatName, boolean playerFolder, String onClickCmd) {
list(dir, actor, args, page, -1, formatName, playerFolder, new RunnableVal3<Builder, URI, String>() { list(dir, actor, args, page, -1, formatName, playerFolder, false, false, new RunnableVal3<Builder, URI, String>() {
@Override @Override
public void run(Builder m, URI uri, String fileName) { public void run(Builder m, URI uri, String fileName) {
m.append(BBC.SCHEMATIC_LIST_ELEM.format(fileName, "")); m.append(BBC.SCHEMATIC_LIST_ELEM.format(fileName, ""));
@ -719,7 +719,7 @@ public class UtilityCommands {
}); });
} }
public static void list(File dir, Actor actor, InjectedValueAccess args, @Range(min = 0) int page, int perPage, String formatName, boolean playerFolder, RunnableVal3<Builder, URI, String> eachMsg) { public static void list(File dir, Actor actor, List<String> args, @Range(min = 0) int page, int perPage, String formatName, boolean playerFolder, boolean oldFirst, boolean newFirst, RunnableVal3<Builder, URI, String> eachMsg) {
List<File> fileList = new ArrayList<>(); List<File> fileList = new ArrayList<>();
if (perPage == -1) perPage = actor instanceof Player ? 12 : 20; // More pages for console if (perPage == -1) perPage = actor instanceof Player ? 12 : 20; // More pages for console
page = getFiles(dir, actor, args, page, perPage, formatName, playerFolder, fileList::add); page = getFiles(dir, actor, args, page, perPage, formatName, playerFolder, fileList::add);
@ -739,7 +739,7 @@ public class UtilityCommands {
return; return;
} }
final int sortType = 0; //args.hasFlag('d') ? -1 : args.hasFlag('n') ? 1 : 0; final int sortType = oldFirst ? -1 : newFirst ? 1 : 0;
// cleanup file list // cleanup file list
fileList.sort((f1, f2) -> { fileList.sort((f1, f2) -> {
boolean dir1 = f1.isDirectory(); boolean dir1 = f1.isDirectory();
@ -766,12 +766,12 @@ public class UtilityCommands {
int limit = Math.min(offset + perPage, fileList.size()); int limit = Math.min(offset + perPage, fileList.size());
String fullArgs = (String) args.getLocals().get("arguments"); // String fullArgs = (String) args.getLocals().get("arguments");
String baseCmd = null; // String baseCmd = null;
if (fullArgs != null) { // if (fullArgs != null) {
baseCmd = fullArgs.endsWith(" " + page) ? fullArgs.substring(0, fullArgs.length() - (" " + page).length()) : fullArgs; // baseCmd = fullArgs.endsWith(" " + page) ? fullArgs.substring(0, fullArgs.length() - (" " + page).length()) : fullArgs;
} // }
@NonNull Builder m = TextComponent.builder(BBC.SCHEMATIC_LIST.format(page, pageCount)); @NotNull Builder m = TextComponent.builder(BBC.SCHEMATIC_LIST.format(page, pageCount));
UUID uuid = playerFolder ? actor.getUniqueId() : null; UUID uuid = playerFolder ? actor.getUniqueId() : null;
for (int i = offset; i < limit; i++) { for (int i = offset; i < limit; i++) {
@ -779,22 +779,17 @@ public class UtilityCommands {
File file = fileList.get(i); File file = fileList.get(i);
eachMsg.run(m, file.toURI(), getPath(dir, file, uuid)); eachMsg.run(m, file.toURI(), getPath(dir, file, uuid));
} }
if (baseCmd != null) { // if (baseCmd != null) {
//TODO m.newline().paginate(baseCmd, page, pageCount); // //TODO m.newline().paginate(baseCmd, page, pageCount);
} // }
actor.print(m.build()); actor.print(m.build());
} }
// public static int getFiles(File root, Actor actor, InjectedValueAccess args, int page, int perPage, String formatName, boolean playerFolder, Consumer<File> forEachFile, ListFilters... filters) { public static int getFiles(File dir, Actor actor, List<String> args, @Range(min = 0) int page, int perPage, String formatName, boolean playerFolder, Consumer<File> forEachFile) {
// // TODO NOT IMPLEMENTED replace getFiles
// return page;
// }
public static int getFiles(File dir, Actor actor, InjectedValueAccess args, @Range(min = 0) int page, int perPage, String formatName, boolean playerFolder, Consumer<File> forEachFile) {
Consumer<File> rootFunction = forEachFile; Consumer<File> rootFunction = forEachFile;
//schem list all <path> //schem list all <path>
int len = args.argsLength(); int len = args.size();
List<String> filters = new ArrayList<>(); List<String> filters = new ArrayList<>();
String dirFilter = File.separator; String dirFilter = File.separator;
@ -803,8 +798,8 @@ public class UtilityCommands {
boolean listGlobal = !Settings.IMP.PATHS.PER_PLAYER_SCHEMATICS; boolean listGlobal = !Settings.IMP.PATHS.PER_PLAYER_SCHEMATICS;
if (len > 0) { if (len > 0) {
int max = len; int max = len;
if (MathMan.isInteger(args.getString(len - 1))) { if (MathMan.isInteger(args.get(len - 1))) {
page = args.getInteger(--len); page = Integer.parseInt(args.get(--len));
} }
for (int i = 0; i < len; i++) { for (int i = 0; i < len; i++) {
String arg = ""; String arg = "";

View File

@ -333,7 +333,7 @@ public class PlatformManager {
case HIT: { case HIT: {
// superpickaxe is special because its primary interaction is a left click, not a right click // superpickaxe is special because its primary interaction is a left click, not a right click
// in addition, it is implicitly bound to all pickaxe items, not just a single tool item // in addition, it is implicitly bound to all pickaxe items, not just a single tool item
if (session.hasSuperPickAxe() && player.isHoldingPickAxe()) { if (session.hasSuperPickAxe()) {
final BlockTool superPickaxe = session.getSuperPickaxe(); final BlockTool superPickaxe = session.getSuperPickaxe();
if (superPickaxe != null && superPickaxe.canUse(player) && player.isHoldingPickAxe()) { if (superPickaxe != null && superPickaxe.canUse(player) && player.isHoldingPickAxe()) {
FawePlayer<?> fp = FawePlayer.wrap(player); FawePlayer<?> fp = FawePlayer.wrap(player);

View File

@ -26,6 +26,9 @@ import com.sk89q.worldedit.util.formatting.text.event.HoverEvent;
import com.sk89q.worldedit.util.formatting.text.format.TextColor; import com.sk89q.worldedit.util.formatting.text.format.TextColor;
import javax.annotation.Nullable; import javax.annotation.Nullable;
import java.util.Collection;
import java.util.Iterator;
import java.util.LinkedHashSet;
import java.util.List; import java.util.List;
public abstract class PaginationBox extends MessageBox { public abstract class PaginationBox extends MessageBox {
@ -128,21 +131,44 @@ public abstract class PaginationBox extends MessageBox {
throw new IllegalStateException("Pagination components must be created with a page"); throw new IllegalStateException("Pagination components must be created with a page");
} }
public static PaginationBox fromStrings(String header, @Nullable String pageCommand, Collection lines) {
return new ListPaginationBox(header, pageCommand, lines);
}
public static PaginationBox fromStrings(String header, @Nullable String pageCommand, List<String> lines) { public static PaginationBox fromStrings(String header, @Nullable String pageCommand, List<String> lines) {
return new ListPaginationBox(header, pageCommand, lines); return new ListPaginationBox(header, pageCommand, lines);
} }
private static class ListPaginationBox extends PaginationBox { private static class ListPaginationBox extends PaginationBox {
private final List<String> lines; private final Collection lines;
private int iterIndex;
private Iterator iterator;
ListPaginationBox(String header, String pageCommand, List<String> lines) { ListPaginationBox(String header, String pageCommand, List<String> lines) {
this(header, pageCommand, (Collection) lines);
}
ListPaginationBox(String header, String pageCommand, Collection lines) {
super(header, pageCommand); super(header, pageCommand);
this.lines = lines; this.lines = lines;
} }
@Override @Override
public Component getComponent(int number) { public Component getComponent(int number) {
return TextComponent.of(lines.get(number)); Object obj;
if (lines instanceof List) {
obj = ((List) lines).get(number);
} else {
if (iterator == null || iterIndex > number) {
iterator = lines.iterator();
iterIndex = 0;
}
do {
obj = iterator.next();
iterIndex++;
} while (iterIndex < number);
}
return TextComponent.of(obj.toString());
} }
@Override @Override