From be3554bf8cd6a11203fc74a20d114dbe2e68d793 Mon Sep 17 00:00:00 2001 From: BONNe Date: Mon, 28 Mar 2022 19:04:15 +0300 Subject: [PATCH] Implement Limits "offset" command. Offset command have: - set - sets the specific limit offset for material or entity. - add - adds the specific limit offset for material or entity. - remove - removes the specific limit offset for material or entity. - reset - resets limit offset for material or entity. - view - views the specific limit offset for material or entity. Relates to the #149 --- .../java/world/bentobox/limits/Limits.java | 4 +- .../commands/{ => admin}/AdminCommand.java | 8 +- .../commands/{ => admin}/CalcCommand.java | 2 +- .../limits/commands/admin/OffsetCommand.java | 689 ++++++++++++++++++ .../commands/{ => player}/LimitPanel.java | 2 +- .../commands/{ => player}/LimitTab.java | 2 +- .../commands/{ => player}/PlayerCommand.java | 2 +- .../commands/{ => player}/RecountCommand.java | 2 +- src/main/resources/locales/en-US.yml | 27 +- .../commands/{ => player}/LimitTabTest.java | 2 +- 10 files changed, 729 insertions(+), 11 deletions(-) rename src/main/java/world/bentobox/limits/commands/{ => admin}/AdminCommand.java (92%) rename src/main/java/world/bentobox/limits/commands/{ => admin}/CalcCommand.java (98%) create mode 100644 src/main/java/world/bentobox/limits/commands/admin/OffsetCommand.java rename src/main/java/world/bentobox/limits/commands/{ => player}/LimitPanel.java (98%) rename src/main/java/world/bentobox/limits/commands/{ => player}/LimitTab.java (99%) rename src/main/java/world/bentobox/limits/commands/{ => player}/PlayerCommand.java (96%) rename src/main/java/world/bentobox/limits/commands/{ => player}/RecountCommand.java (98%) rename src/test/java/world/bentobox/limits/commands/{ => player}/LimitTabTest.java (98%) diff --git a/src/main/java/world/bentobox/limits/Limits.java b/src/main/java/world/bentobox/limits/Limits.java index c54a306..f75ecc9 100644 --- a/src/main/java/world/bentobox/limits/Limits.java +++ b/src/main/java/world/bentobox/limits/Limits.java @@ -12,8 +12,8 @@ import world.bentobox.bentobox.api.addons.Addon; import world.bentobox.bentobox.api.addons.GameModeAddon; import world.bentobox.bentobox.api.user.User; import world.bentobox.bentobox.database.objects.Island; -import world.bentobox.limits.commands.AdminCommand; -import world.bentobox.limits.commands.PlayerCommand; +import world.bentobox.limits.commands.admin.AdminCommand; +import world.bentobox.limits.commands.player.PlayerCommand; import world.bentobox.limits.listeners.BlockLimitsListener; import world.bentobox.limits.listeners.EntityLimitListener; import world.bentobox.limits.listeners.JoinListener; diff --git a/src/main/java/world/bentobox/limits/commands/AdminCommand.java b/src/main/java/world/bentobox/limits/commands/admin/AdminCommand.java similarity index 92% rename from src/main/java/world/bentobox/limits/commands/AdminCommand.java rename to src/main/java/world/bentobox/limits/commands/admin/AdminCommand.java index bf9bf3e..263b24e 100644 --- a/src/main/java/world/bentobox/limits/commands/AdminCommand.java +++ b/src/main/java/world/bentobox/limits/commands/admin/AdminCommand.java @@ -1,4 +1,4 @@ -package world.bentobox.limits.commands; +package world.bentobox.limits.commands.admin; import java.util.ArrayList; import java.util.List; @@ -10,6 +10,8 @@ import world.bentobox.bentobox.api.commands.CompositeCommand; import world.bentobox.bentobox.api.user.User; import world.bentobox.bentobox.util.Util; import world.bentobox.limits.Limits; +import world.bentobox.limits.commands.player.LimitPanel; + /** * Admin command for limits @@ -27,7 +29,9 @@ public class AdminCommand extends CompositeCommand { public AdminCommand(Limits addon, CompositeCommand parent) { super(parent, "limits"); this.addon = addon; - new CalcCommand(addon, this); + + new CalcCommand(this.addon, this); + new OffsetCommand(this.addon, this); } /* (non-Javadoc) diff --git a/src/main/java/world/bentobox/limits/commands/CalcCommand.java b/src/main/java/world/bentobox/limits/commands/admin/CalcCommand.java similarity index 98% rename from src/main/java/world/bentobox/limits/commands/CalcCommand.java rename to src/main/java/world/bentobox/limits/commands/admin/CalcCommand.java index c4cb0ee..f7e7303 100644 --- a/src/main/java/world/bentobox/limits/commands/CalcCommand.java +++ b/src/main/java/world/bentobox/limits/commands/admin/CalcCommand.java @@ -1,4 +1,4 @@ -package world.bentobox.limits.commands; +package world.bentobox.limits.commands.admin; import java.util.ArrayList; import java.util.List; diff --git a/src/main/java/world/bentobox/limits/commands/admin/OffsetCommand.java b/src/main/java/world/bentobox/limits/commands/admin/OffsetCommand.java new file mode 100644 index 0000000..b04b206 --- /dev/null +++ b/src/main/java/world/bentobox/limits/commands/admin/OffsetCommand.java @@ -0,0 +1,689 @@ +// +// Created by BONNe +// Copyright - 2022 +// + + +package world.bentobox.limits.commands.admin; + + +import com.google.common.base.Enums; +import org.bukkit.Material; +import org.bukkit.NamespacedKey; +import org.bukkit.entity.EntityType; +import org.eclipse.jdt.annotation.Nullable; +import java.util.*; +import java.util.stream.Collectors; + +import world.bentobox.bentobox.api.commands.CompositeCommand; +import world.bentobox.bentobox.api.localization.TextVariables; +import world.bentobox.bentobox.api.user.User; +import world.bentobox.bentobox.database.objects.Island; +import world.bentobox.bentobox.util.Util; +import world.bentobox.limits.Limits; +import world.bentobox.limits.objects.IslandBlockCount; + + +/** + * This command manages offsets to the player island limits. + */ +public class OffsetCommand extends CompositeCommand +{ + /** + * Instantiates a new Offset command. + * + * @param addon the addon + * @param parent the parent + */ + public OffsetCommand(Limits addon, CompositeCommand parent) + { + super(parent, "offset"); + + new OffsetSetCommand(addon, this); + new OffsetAddCommand(addon, this); + new OffsetRemoveCommand(addon, this); + new OffsetResetCommand(addon, this); + new OffsetDisplayCommand(addon, this); + } + + + @Override + public void setup() + { + this.setOnlyPlayer(false); + + this.setPermission("admin.limits.offset"); + this.setParametersHelp("admin.limits.offset.parameters"); + this.setDescription("admin.limits.offset.description"); + } + + + @Override + public boolean execute(User user, String s, List list) + { + this.showHelp(this, user); + return true; + } + + + /** + * This command allows setting limit offset for material or entity. + */ + private static class OffsetSetCommand extends CompositeCommand + { + /** + * Instantiates a new Offset set command. + * + * @param addon the addon + * @param parent the parent + */ + public OffsetSetCommand(Limits addon, CompositeCommand parent) + { + super(parent, "set"); + this.addon = addon; + } + + + @Override + public void setup() + { + this.setOnlyPlayer(false); + + this.setPermission("admin.limits.offset.set"); + this.setParametersHelp("admin.limits.offset.set.parameters"); + this.setDescription("admin.limits.offset.set.description"); + } + + + @Override + public boolean execute(User user, String label, List args) + { + if (args.size() != 3) + { + // Show help + this.showHelp(this, user); + return false; + } + + // Get target player + UUID targetUUID = Util.getUUID(args.get(0)); + + if (targetUUID == null) + { + user.sendMessage("general.errors.unknown-player", TextVariables.NAME, args.get(0)); + return false; + } + + Island island = this.getIslands().getIsland(this.getWorld(), targetUUID); + + if (island == null) + { + user.sendMessage("general.errors.player-has-no-island"); + return false; + } + + IslandBlockCount islandData = this.addon.getBlockLimitListener().getIsland(island); + + // Get new offset + if (!Util.isInteger(args.get(2), true)) + { + user.sendMessage("general.errors.must-be-a-number", TextVariables.NUMBER, args.get(2)); + return false; + } + + Material material = Material.matchMaterial(args.get(1)); + EntityType entityType = matchEntity(args.get(1)); + + if (material == null && entityType == null) + { + user.sendMessage("admin.limits.offset.unknown", TextVariables.NAME, args.get(1)); + return false; + } + + int offset = Integer.parseInt(args.get(2)); + + if (material != null && offset == islandData.getBlockLimitOffset(material) || + entityType != null && offset == islandData.getEntityLimitOffset(entityType)) + { + user.sendMessage("admin.limits.offset.set.same", + TextVariables.NAME, + args.get(1), + TextVariables.NUMBER, + args.get(2)); + return false; + } + + if (material != null) + { + islandData.setBlockLimitsOffset(material, offset); + islandData.setChanged(); + + user.sendMessage("admin.limits.offset.set.success", + TextVariables.NUMBER, String.valueOf(offset), + TextVariables.NAME, material.name()); + } + else + { + islandData.setEntityLimitsOffset(entityType, offset); + islandData.setChanged(); + + user.sendMessage("admin.limits.offset.set.success", + TextVariables.NUMBER, String.valueOf(offset), + TextVariables.NAME, entityType.name()); + } + + return true; + } + + + @Override + public Optional> tabComplete(User user, String alias, List args) + { + return OffsetCommand.craftTabComplete(user, alias, args); + } + + + /** + * Instance of limits addon. + */ + private final Limits addon; + } + + + /** + * This command allows increasing limit offset for material or entity. + */ + private static class OffsetAddCommand extends CompositeCommand + { + /** + * Instantiates a new Offset add command. + * + * @param addon the addon + * @param parent the parent + */ + public OffsetAddCommand(Limits addon, CompositeCommand parent) + { + super(parent, "add"); + this.addon = addon; + } + + + @Override + public void setup() + { + this.setOnlyPlayer(false); + + this.setPermission("admin.limits.offset.add"); + this.setParametersHelp("admin.limits.offset.add.parameters"); + this.setDescription("admin.limits.offset.add.description"); + } + + + @Override + public boolean execute(User user, String label, List args) + { + if (args.size() != 3) + { + // Show help + this.showHelp(this, user); + return false; + } + + // Get target player + UUID targetUUID = Util.getUUID(args.get(0)); + + if (targetUUID == null) + { + user.sendMessage("general.errors.unknown-player", TextVariables.NAME, args.get(0)); + return false; + } + + Island island = this.getIslands().getIsland(this.getWorld(), targetUUID); + + if (island == null) + { + user.sendMessage("general.errors.player-has-no-island"); + return false; + } + + IslandBlockCount islandData = this.addon.getBlockLimitListener().getIsland(island); + + // Get new offset + if (!Util.isInteger(args.get(2), true) || Integer.parseInt(args.get(2)) < 0) + { + user.sendMessage("general.errors.must-be-positive-number", TextVariables.NUMBER, args.get(2)); + return false; + } + + Material material = Material.matchMaterial(args.get(1)); + EntityType entityType = matchEntity(args.get(1)); + + if (material == null && entityType == null) + { + user.sendMessage("admin.limits.offset.unknown", TextVariables.NAME, args.get(1)); + return false; + } + + int offset = Integer.parseInt(args.get(2)); + + if (material != null) + { + offset += islandData.getBlockLimitOffset(material); + + islandData.setBlockLimitsOffset(material, offset); + islandData.setChanged(); + + user.sendMessage("admin.limits.offset.add.success", + TextVariables.NUMBER, String.valueOf(offset), + TextVariables.NAME, material.name()); + } + else + { + offset += islandData.getEntityLimitOffset(entityType); + + islandData.setEntityLimitsOffset(entityType, offset); + islandData.setChanged(); + + user.sendMessage("admin.limits.offset.add.success", + TextVariables.NUMBER, String.valueOf(offset), + TextVariables.NAME, entityType.name()); + } + + return true; + } + + + @Override + public Optional> tabComplete(User user, String alias, List args) + { + return OffsetCommand.craftTabComplete(user, alias, args); + } + + + /** + * Instance of limits addon. + */ + private final Limits addon; + } + + + /** + * This command allows reducing limit offset for material or entity. + */ + private static class OffsetRemoveCommand extends CompositeCommand + { + /** + * Instantiates a new Offset remove command. + * + * @param addon the addon + * @param parent the parent + */ + public OffsetRemoveCommand(Limits addon, CompositeCommand parent) + { + super(parent, "remove"); + this.addon = addon; + } + + + @Override + public void setup() + { + this.setOnlyPlayer(false); + + this.setPermission("admin.limits.offset.remove"); + this.setParametersHelp("admin.limits.offset.remove.parameters"); + this.setDescription("admin.limits.offset.remove.description"); + } + + + @Override + public boolean execute(User user, String label, List args) + { + if (args.size() != 3) + { + // Show help + this.showHelp(this, user); + return false; + } + + // Get target player + UUID targetUUID = Util.getUUID(args.get(0)); + + if (targetUUID == null) + { + user.sendMessage("general.errors.unknown-player", TextVariables.NAME, args.get(0)); + return false; + } + + Island island = this.getIslands().getIsland(this.getWorld(), targetUUID); + + if (island == null) + { + user.sendMessage("general.errors.player-has-no-island"); + return false; + } + + IslandBlockCount islandData = this.addon.getBlockLimitListener().getIsland(island); + + // Get new offset + if (!Util.isInteger(args.get(2), true) || Integer.parseInt(args.get(2)) < 0) + { + user.sendMessage("general.errors.must-be-positive-number", TextVariables.NUMBER, args.get(2)); + return false; + } + + Material material = Material.matchMaterial(args.get(1)); + EntityType entityType = matchEntity(args.get(1)); + + if (material == null && entityType == null) + { + user.sendMessage("admin.limits.offset.unknown", TextVariables.NAME, args.get(1)); + return false; + } + + int offset = Integer.parseInt(args.get(2)); + + if (material != null) + { + offset = islandData.getBlockLimitOffset(material) - offset; + + islandData.setBlockLimitsOffset(material, offset); + islandData.setChanged(); + + user.sendMessage("admin.limits.offset.remove.success", + TextVariables.NUMBER, String.valueOf(offset), + TextVariables.NAME, material.name()); + } + else + { + offset = islandData.getEntityLimitOffset(entityType) - offset; + + islandData.setEntityLimitsOffset(entityType, offset); + islandData.setChanged(); + + user.sendMessage("admin.limits.offset.remove.success", + TextVariables.NUMBER, String.valueOf(offset), + TextVariables.NAME, entityType.name()); + } + + return true; + } + + + @Override + public Optional> tabComplete(User user, String alias, List args) + { + return OffsetCommand.craftTabComplete(user, alias, args); + } + + + /** + * Instance of limits addon. + */ + private final Limits addon; + } + + + /** + * This command allows resetting limit offset for material or entity. + */ + private static class OffsetResetCommand extends CompositeCommand + { + /** + * Instantiates a new Offset reset command. + * + * @param addon the addon + * @param parent the parent + */ + public OffsetResetCommand(Limits addon, CompositeCommand parent) + { + super(parent, "reset"); + this.addon = addon; + } + + + @Override + public void setup() + { + this.setOnlyPlayer(false); + + this.setPermission("admin.limits.offset.reset"); + this.setParametersHelp("admin.limits.offset.reset.parameters"); + this.setDescription("admin.limits.offset.reset.description"); + } + + + @Override + public boolean execute(User user, String label, List args) + { + if (args.size() != 2) + { + // Show help + this.showHelp(this, user); + return false; + } + + // Get target player + UUID targetUUID = Util.getUUID(args.get(0)); + + if (targetUUID == null) + { + user.sendMessage("general.errors.unknown-player", TextVariables.NAME, args.get(0)); + return false; + } + + Island island = this.getIslands().getIsland(this.getWorld(), targetUUID); + + if (island == null) + { + user.sendMessage("general.errors.player-has-no-island"); + return false; + } + + IslandBlockCount islandData = this.addon.getBlockLimitListener().getIsland(island); + + Material material = Material.matchMaterial(args.get(1)); + EntityType entityType = matchEntity(args.get(1)); + + if (material == null && entityType == null) + { + user.sendMessage("admin.limits.offset.unknown", TextVariables.NAME, args.get(1)); + return false; + } + + if (material != null) + { + islandData.setBlockLimitsOffset(material, 0); + islandData.setChanged(); + + user.sendMessage("admin.limits.offset.reset.success", + TextVariables.NAME, material.name()); + } + else + { + islandData.setEntityLimitsOffset(entityType, 0); + islandData.setChanged(); + + user.sendMessage("admin.limits.offset.reset.success", + TextVariables.NAME, entityType.name()); + } + + return true; + } + + + @Override + public Optional> tabComplete(User user, String alias, List args) + { + return OffsetCommand.craftTabComplete(user, alias, args); + } + + + /** + * Instance of limits addon. + */ + private final Limits addon; + } + + + /** + * This command allows viewing limit offset for material or entity. + */ + private static class OffsetDisplayCommand extends CompositeCommand + { + /** + * Instantiates a new Offset display command. + * + * @param addon the addon + * @param parent the parent + */ + public OffsetDisplayCommand(Limits addon, CompositeCommand parent) + { + super(parent, "view", "display"); + this.addon = addon; + } + + + @Override + public void setup() + { + this.setOnlyPlayer(false); + + this.setPermission("admin.limits.offset.view"); + this.setParametersHelp("admin.limits.offset.view.parameters"); + this.setDescription("admin.limits.offset.view.description"); + } + + + @Override + public boolean execute(User user, String label, List args) + { + if (args.size() != 2) + { + // Show help + this.showHelp(this, user); + return false; + } + + // Get target player + UUID targetUUID = Util.getUUID(args.get(0)); + + if (targetUUID == null) + { + user.sendMessage("general.errors.unknown-player", TextVariables.NAME, args.get(0)); + return false; + } + + Island island = this.getIslands().getIsland(this.getWorld(), targetUUID); + + if (island == null) + { + user.sendMessage("general.errors.player-has-no-island"); + return false; + } + + IslandBlockCount islandData = this.addon.getBlockLimitListener().getIsland(island); + + Material material = Material.matchMaterial(args.get(1)); + EntityType entityType = matchEntity(args.get(1)); + + if (material == null && entityType == null) + { + user.sendMessage("admin.limits.offset.unknown", TextVariables.NAME, args.get(1)); + return false; + } + + if (material != null) + { + int offset = islandData.getBlockLimitOffset(material); + user.sendMessage("admin.limits.offset.view.message", + TextVariables.NAME, material.name(), + TextVariables.NUMBER, String.valueOf(offset)); + } + else + { + int offset = islandData.getEntityLimitOffset(entityType); + user.sendMessage("admin.limits.offset.view.message", + TextVariables.NAME, entityType.name(), + TextVariables.NUMBER, String.valueOf(offset)); + } + + return true; + } + + + @Override + public Optional> tabComplete(User user, String alias, List args) + { + return OffsetCommand.craftTabComplete(user, alias, args); + } + + + /** + * Instance of limits addon. + */ + private final Limits addon; + } + + + /** + * This material matches name to an entity type. + * @param name Name that must be matched. + * @return EntityType or null. + */ + @Nullable + private static EntityType matchEntity(String name) + { + String filtered = name; + + if (filtered.startsWith(NamespacedKey.MINECRAFT + ":")) + { + filtered = filtered.substring((NamespacedKey.MINECRAFT + ":").length()); + } + + filtered = filtered.toUpperCase(java.util.Locale.ENGLISH); + filtered = filtered.replaceAll("\\s+", "_").replaceAll("\\W", ""); + + return Enums.getIfPresent(EntityType.class, filtered).orNull(); + } + + + /** + * This method crafts tab complete for all subcommands + * @param user User who runs command. + * @param alias Command alias. + * @param args List of args. + * @return Optional list of strings. + */ + private static Optional> craftTabComplete(User user, String alias, List args) + { + String lastArg = !args.isEmpty() ? args.get(args.size() - 1) : ""; + + if (args.isEmpty()) + { + // Don't show every player on the server. Require at least the first letter + return Optional.empty(); + } + else if (args.size() == 4) + { + List options = new ArrayList<>(Util.getOnlinePlayerList(user)); + return Optional.of(Util.tabLimit(options, lastArg)); + } + else if (args.size() == 5) + { + List options = Arrays.stream(Material.values()). + map(Enum::name). + collect(Collectors.toList()); + + options.addAll(Arrays.stream(EntityType.values()). + map(Enum::name). + collect(Collectors.toList())); + + return Optional.of(Util.tabLimit(options, lastArg)); + } + else + { + return Optional.empty(); + } + } +} diff --git a/src/main/java/world/bentobox/limits/commands/LimitPanel.java b/src/main/java/world/bentobox/limits/commands/player/LimitPanel.java similarity index 98% rename from src/main/java/world/bentobox/limits/commands/LimitPanel.java rename to src/main/java/world/bentobox/limits/commands/player/LimitPanel.java index e24d78d..bb2d6e2 100644 --- a/src/main/java/world/bentobox/limits/commands/LimitPanel.java +++ b/src/main/java/world/bentobox/limits/commands/player/LimitPanel.java @@ -1,4 +1,4 @@ -package world.bentobox.limits.commands; +package world.bentobox.limits.commands.player; import java.util.Map; import java.util.UUID; diff --git a/src/main/java/world/bentobox/limits/commands/LimitTab.java b/src/main/java/world/bentobox/limits/commands/player/LimitTab.java similarity index 99% rename from src/main/java/world/bentobox/limits/commands/LimitTab.java rename to src/main/java/world/bentobox/limits/commands/player/LimitTab.java index 4e7fa74..36267fc 100644 --- a/src/main/java/world/bentobox/limits/commands/LimitTab.java +++ b/src/main/java/world/bentobox/limits/commands/player/LimitTab.java @@ -1,4 +1,4 @@ -package world.bentobox.limits.commands; +package world.bentobox.limits.commands.player; import java.util.*; import java.util.Map.Entry; diff --git a/src/main/java/world/bentobox/limits/commands/PlayerCommand.java b/src/main/java/world/bentobox/limits/commands/player/PlayerCommand.java similarity index 96% rename from src/main/java/world/bentobox/limits/commands/PlayerCommand.java rename to src/main/java/world/bentobox/limits/commands/player/PlayerCommand.java index 7f070f2..590b9e2 100644 --- a/src/main/java/world/bentobox/limits/commands/PlayerCommand.java +++ b/src/main/java/world/bentobox/limits/commands/player/PlayerCommand.java @@ -1,4 +1,4 @@ -package world.bentobox.limits.commands; +package world.bentobox.limits.commands.player; import java.util.List; diff --git a/src/main/java/world/bentobox/limits/commands/RecountCommand.java b/src/main/java/world/bentobox/limits/commands/player/RecountCommand.java similarity index 98% rename from src/main/java/world/bentobox/limits/commands/RecountCommand.java rename to src/main/java/world/bentobox/limits/commands/player/RecountCommand.java index 5f31c8b..9f330b5 100644 --- a/src/main/java/world/bentobox/limits/commands/RecountCommand.java +++ b/src/main/java/world/bentobox/limits/commands/player/RecountCommand.java @@ -1,4 +1,4 @@ -package world.bentobox.limits.commands; +package world.bentobox.limits.commands.player; import java.util.List; diff --git a/src/main/resources/locales/en-US.yml b/src/main/resources/locales/en-US.yml index e1b9488..ba6a9da 100755 --- a/src/main/resources/locales/en-US.yml +++ b/src/main/resources/locales/en-US.yml @@ -20,7 +20,32 @@ admin: parameters: "" description: "recalculate the island limits for player" finished: "&a Island recalc finished successfully!" - + offset: + unknown: "&c Unknown material or entity [name]." + main: + parameters: "" + description: "allows to manage limits offsets for materials and entities" + set: + parameters: " " + description: "sets new offset for material or entity limit" + success: "&a Limit offset for [name] is set to [number]." + same: "&c Limit offset for [name] is already [number]." + add: + parameters: " " + description: "adds offset for material or entity limit" + success: "&a Limit offset for [name] is increased till [number]." + remove: + parameters: " " + description: "reduces offset for material or entity limit" + success: "&a Limit offset for [name] is reduced till [number]." + reset: + parameters: " " + description: "removes offset for material or entity" + success: "&a Limit offset for [name] is set to 0." + view: + parameters: " " + description: "displays offset for material or entity" + message: "&a [name] offset is set to [number]." island: limits: description: "show your island limits" diff --git a/src/test/java/world/bentobox/limits/commands/LimitTabTest.java b/src/test/java/world/bentobox/limits/commands/player/LimitTabTest.java similarity index 98% rename from src/test/java/world/bentobox/limits/commands/LimitTabTest.java rename to src/test/java/world/bentobox/limits/commands/player/LimitTabTest.java index 403a7d9..ab92735 100644 --- a/src/test/java/world/bentobox/limits/commands/LimitTabTest.java +++ b/src/test/java/world/bentobox/limits/commands/player/LimitTabTest.java @@ -1,4 +1,4 @@ -package world.bentobox.limits.commands; +package world.bentobox.limits.commands.player; import static org.junit.Assert.assertEquals; import static org.junit.Assert.fail;