diff --git a/Bukkit/build.gradle b/Bukkit/build.gradle index 3bc057a45..e6a9117bb 100644 --- a/Bukkit/build.gradle +++ b/Bukkit/build.gradle @@ -3,6 +3,10 @@ repositories { maven { url = "https://oss.sonatype.org/content/repositories/snapshots/" } maven { url "http://nexus.hc.to/content/repositories/pub_releases" } maven { url = "https://repo.codemc.org/repository/maven-public" } + maven { + name 'papermc' + url 'https://papermc.io/repo/repository/maven-public/' + } mavenLocal() } @@ -12,6 +16,7 @@ dependencies { compile 'org.spigotmc:spigot-api:1.13.2-R0.1-SNAPSHOT' compile(group: 'com.sk89q.worldedit', name: 'worldedit-bukkit', version: '7.0.0-SNAPSHOT') compile(group: 'org.bstats', name: 'bstats-bukkit', version: '1.4') + compile "io.papermc:paperlib:1.0.1" compile("net.milkbowl.vault:VaultAPI:1.7") { exclude module: 'bukkit' } @@ -37,7 +42,9 @@ shadowJar { dependencies { include(dependency(':Core')) include(dependency('org.bstats:bstats-bukkit:1.4')) + include(dependency("io.papermc:paperlib:1.0.1")) } + relocate 'io.papermc.lib', 'com.github.intellectualsites.plotsquared.bukkit.paperlib' // relocate('org.mcstats', 'com.plotsquared.stats') archiveName = "${parent.name}-${project.name}-${parent.version}.jar" destinationDir = file '../target' diff --git a/Bukkit/src/main/java/com/github/intellectualsites/plotsquared/bukkit/BukkitMain.java b/Bukkit/src/main/java/com/github/intellectualsites/plotsquared/bukkit/BukkitMain.java index ae95bd371..bc8fb225e 100644 --- a/Bukkit/src/main/java/com/github/intellectualsites/plotsquared/bukkit/BukkitMain.java +++ b/Bukkit/src/main/java/com/github/intellectualsites/plotsquared/bukkit/BukkitMain.java @@ -1,36 +1,11 @@ package com.github.intellectualsites.plotsquared.bukkit; -import static com.github.intellectualsites.plotsquared.plot.util.ReflectionUtils.getRefClass; - import com.github.intellectualsites.plotsquared.bukkit.generator.BukkitPlotGenerator; -import com.github.intellectualsites.plotsquared.bukkit.listeners.ChunkListener; -import com.github.intellectualsites.plotsquared.bukkit.listeners.EntitySpawnListener; -import com.github.intellectualsites.plotsquared.bukkit.listeners.PlayerEvents; -import com.github.intellectualsites.plotsquared.bukkit.listeners.PlotPlusListener; -import com.github.intellectualsites.plotsquared.bukkit.listeners.SingleWorldListener; -import com.github.intellectualsites.plotsquared.bukkit.listeners.WorldEvents; +import com.github.intellectualsites.plotsquared.bukkit.listeners.*; import com.github.intellectualsites.plotsquared.bukkit.titles.DefaultTitle_111; -import com.github.intellectualsites.plotsquared.bukkit.util.BukkitBlockRegistry; -import com.github.intellectualsites.plotsquared.bukkit.util.BukkitChatManager; -import com.github.intellectualsites.plotsquared.bukkit.util.BukkitChunkManager; -import com.github.intellectualsites.plotsquared.bukkit.util.BukkitCommand; -import com.github.intellectualsites.plotsquared.bukkit.util.BukkitEconHandler; -import com.github.intellectualsites.plotsquared.bukkit.util.BukkitEventUtil; -import com.github.intellectualsites.plotsquared.bukkit.util.BukkitHybridUtils; -import com.github.intellectualsites.plotsquared.bukkit.util.BukkitInventoryUtil; -import com.github.intellectualsites.plotsquared.bukkit.util.BukkitLegacyMappings; -import com.github.intellectualsites.plotsquared.bukkit.util.BukkitSchematicHandler; -import com.github.intellectualsites.plotsquared.bukkit.util.BukkitSetupUtils; -import com.github.intellectualsites.plotsquared.bukkit.util.BukkitTaskManager; -import com.github.intellectualsites.plotsquared.bukkit.util.BukkitUtil; -import com.github.intellectualsites.plotsquared.bukkit.util.SendChunk; -import com.github.intellectualsites.plotsquared.bukkit.util.SetGenCB; +import com.github.intellectualsites.plotsquared.bukkit.util.*; import com.github.intellectualsites.plotsquared.bukkit.util.block.BukkitLocalQueue; -import com.github.intellectualsites.plotsquared.bukkit.uuid.DefaultUUIDWrapper; -import com.github.intellectualsites.plotsquared.bukkit.uuid.FileUUIDHandler; -import com.github.intellectualsites.plotsquared.bukkit.uuid.LowerOfflineUUIDWrapper; -import com.github.intellectualsites.plotsquared.bukkit.uuid.OfflineUUIDWrapper; -import com.github.intellectualsites.plotsquared.bukkit.uuid.SQLUUIDHandler; +import com.github.intellectualsites.plotsquared.bukkit.uuid.*; import com.github.intellectualsites.plotsquared.configuration.ConfigurationSection; import com.github.intellectualsites.plotsquared.plot.IPlotMain; import com.github.intellectualsites.plotsquared.plot.PlotSquared; @@ -41,57 +16,23 @@ import com.github.intellectualsites.plotsquared.plot.generator.GeneratorWrapper; import com.github.intellectualsites.plotsquared.plot.generator.HybridGen; import com.github.intellectualsites.plotsquared.plot.generator.HybridUtils; import com.github.intellectualsites.plotsquared.plot.generator.IndependentPlotGenerator; -import com.github.intellectualsites.plotsquared.plot.object.BlockRegistry; -import com.github.intellectualsites.plotsquared.plot.object.Plot; -import com.github.intellectualsites.plotsquared.plot.object.PlotArea; -import com.github.intellectualsites.plotsquared.plot.object.PlotId; -import com.github.intellectualsites.plotsquared.plot.object.PlotPlayer; -import com.github.intellectualsites.plotsquared.plot.object.RunnableVal; -import com.github.intellectualsites.plotsquared.plot.object.SetupObject; +import com.github.intellectualsites.plotsquared.plot.object.*; import com.github.intellectualsites.plotsquared.plot.object.chat.PlainChatManager; import com.github.intellectualsites.plotsquared.plot.object.worlds.PlotAreaManager; import com.github.intellectualsites.plotsquared.plot.object.worlds.SinglePlotArea; import com.github.intellectualsites.plotsquared.plot.object.worlds.SinglePlotAreaManager; import com.github.intellectualsites.plotsquared.plot.object.worlds.SingleWorldGenerator; -import com.github.intellectualsites.plotsquared.plot.util.AbstractTitle; -import com.github.intellectualsites.plotsquared.plot.util.ChatManager; -import com.github.intellectualsites.plotsquared.plot.util.ChunkManager; -import com.github.intellectualsites.plotsquared.plot.util.ConsoleColors; -import com.github.intellectualsites.plotsquared.plot.util.EconHandler; -import com.github.intellectualsites.plotsquared.plot.util.EventUtil; -import com.github.intellectualsites.plotsquared.plot.util.InventoryUtil; -import com.github.intellectualsites.plotsquared.plot.util.LegacyMappings; -import com.github.intellectualsites.plotsquared.plot.util.MainUtil; -import com.github.intellectualsites.plotsquared.plot.util.ReflectionUtils; -import com.github.intellectualsites.plotsquared.plot.util.SchematicHandler; -import com.github.intellectualsites.plotsquared.plot.util.SetupUtils; -import com.github.intellectualsites.plotsquared.plot.util.StringMan; -import com.github.intellectualsites.plotsquared.plot.util.TaskManager; -import com.github.intellectualsites.plotsquared.plot.util.UUIDHandler; -import com.github.intellectualsites.plotsquared.plot.util.UUIDHandlerImplementation; -import com.github.intellectualsites.plotsquared.plot.util.WorldUtil; +import com.github.intellectualsites.plotsquared.plot.util.*; import com.github.intellectualsites.plotsquared.plot.util.block.QueueProvider; import com.github.intellectualsites.plotsquared.plot.uuid.UUIDWrapper; import com.sk89q.worldedit.WorldEdit; import com.sk89q.worldedit.bukkit.WorldEditPlugin; import com.sk89q.worldedit.extension.platform.Capability; -import java.io.File; -import java.lang.reflect.Method; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Iterator; -import java.util.List; -import java.util.UUID; -import javax.annotation.Nullable; +import io.papermc.lib.PaperLib; import lombok.Getter; import lombok.NonNull; -import org.bukkit.Bukkit; -import org.bukkit.ChatColor; -import org.bukkit.Chunk; import org.bukkit.Location; -import org.bukkit.Material; -import org.bukkit.OfflinePlayer; -import org.bukkit.World; +import org.bukkit.*; import org.bukkit.command.PluginCommand; import org.bukkit.entity.Entity; import org.bukkit.entity.LivingEntity; @@ -104,6 +45,13 @@ import org.bukkit.plugin.Plugin; import org.bukkit.plugin.PluginManager; import org.bukkit.plugin.java.JavaPlugin; +import javax.annotation.Nullable; +import java.io.File; +import java.lang.reflect.Method; +import java.util.*; + +import static com.github.intellectualsites.plotsquared.plot.util.ReflectionUtils.getRefClass; + public final class BukkitMain extends JavaPlugin implements Listener, IPlotMain { @Getter private static WorldEdit worldEdit; @@ -170,23 +118,7 @@ public final class BukkitMain extends JavaPlugin implements Listener, IPlotMain getServer().getName(); PlotPlayer.registerConverter(Player.class, BukkitUtil::getPlayer); - - if (Bukkit.getVersion().contains("git-Spigot")) { - // Uses System.out.println because the logger isn't initialized yet - System.out - .println("[P2] ========================== USE PAPER =========================="); - System.out.println("[P2] Paper offers a more complete API for us to work with"); - System.out.println("[P2] and we may come to rely on it in the future."); - System.out.println("[P2] It is also recommended out of a performance standpoint as"); - System.out - .println("[P2] it contains many improvements missing from Spigot and Bukkit."); - System.out.println("[P2] DOWNLOAD: https://papermc.io/downloads"); - System.out.println("[P2] GUIDE: https://www.spigotmc.org/threads/21726/"); - System.out.println("[P2] NOTE: This is only a recommendation"); - System.out.println("[P2] both Spigot and CraftBukkit are still supported."); - System.out - .println("[P2] ==============================================================="); - } + PaperLib.suggestPaper(this); new PlotSquared(this, "Bukkit"); if (Settings.Enabled_Components.METRICS) { diff --git a/Bukkit/src/main/java/com/github/intellectualsites/plotsquared/bukkit/events/PlayerPlotTrustedEvent.java b/Bukkit/src/main/java/com/github/intellectualsites/plotsquared/bukkit/events/PlayerPlotTrustedEvent.java index 95440056f..f2f9efe71 100644 --- a/Bukkit/src/main/java/com/github/intellectualsites/plotsquared/bukkit/events/PlayerPlotTrustedEvent.java +++ b/Bukkit/src/main/java/com/github/intellectualsites/plotsquared/bukkit/events/PlayerPlotTrustedEvent.java @@ -6,10 +6,6 @@ import org.bukkit.event.HandlerList; import java.util.UUID; -/** - - - */ public class PlayerPlotTrustedEvent extends PlotEvent { private static final HandlerList handlers = new HandlerList(); diff --git a/Bukkit/src/main/java/com/github/intellectualsites/plotsquared/bukkit/object/BukkitPlayer.java b/Bukkit/src/main/java/com/github/intellectualsites/plotsquared/bukkit/object/BukkitPlayer.java index 7aecb854c..1255c0fc4 100644 --- a/Bukkit/src/main/java/com/github/intellectualsites/plotsquared/bukkit/object/BukkitPlayer.java +++ b/Bukkit/src/main/java/com/github/intellectualsites/plotsquared/bukkit/object/BukkitPlayer.java @@ -7,15 +7,20 @@ import com.github.intellectualsites.plotsquared.plot.object.Location; import com.github.intellectualsites.plotsquared.plot.object.PlotBlock; import com.github.intellectualsites.plotsquared.plot.object.PlotPlayer; import com.github.intellectualsites.plotsquared.plot.util.*; -import org.bukkit.*; +import com.google.common.base.Preconditions; +import io.papermc.lib.PaperLib; +import org.bukkit.GameMode; +import org.bukkit.Material; +import org.bukkit.Sound; +import org.bukkit.WeatherType; import org.bukkit.entity.Player; import org.bukkit.event.Event; import org.bukkit.event.EventException; import org.bukkit.event.player.PlayerTeleportEvent; -import org.bukkit.event.player.PlayerTeleportEvent.TeleportCause; import org.bukkit.permissions.PermissionAttachmentInfo; import org.bukkit.plugin.RegisteredListener; +import javax.annotation.Nonnull; import java.util.Arrays; import java.util.Set; import java.util.UUID; @@ -24,7 +29,7 @@ import java.util.stream.Collectors; public class BukkitPlayer extends PlotPlayer { public final Player player; - public boolean offline; + private boolean offline; private UUID uuid; private String name; @@ -32,21 +37,23 @@ public class BukkitPlayer extends PlotPlayer { *

Please do not use this method. Instead use * BukkitUtil.getPlayer(Player), as it caches player objects.

* - * @param player + * @param player Bukkit player instance */ - public BukkitPlayer(Player player) { + public BukkitPlayer(@Nonnull final Player player) { + Preconditions.checkNotNull(player, "Bukkit player instance cannot be null"); this.player = player; super.populatePersistentMetaMap(); } - public BukkitPlayer(Player player, boolean offline) { + public BukkitPlayer(@Nonnull final Player player, final boolean offline) { + Preconditions.checkNotNull(player, "Bukkit player instance cannot be null"); this.player = player; this.offline = offline; super.populatePersistentMetaMap(); } @Override public Location getLocation() { - Location location = super.getLocation(); + final Location location = super.getLocation(); return location == null ? BukkitUtil.getLocation(this.player) : location; } @@ -61,9 +68,10 @@ public class BukkitPlayer extends PlotPlayer { return this.player.getLastPlayed(); } - @Override public boolean canTeleport(Location loc) { - org.bukkit.Location to = BukkitUtil.getLocation(loc); - org.bukkit.Location from = player.getLocation(); + @Override public boolean canTeleport(@Nonnull final Location loc) { + Preconditions.checkNotNull(loc, "Bukkit location cannot be null"); + final org.bukkit.Location to = BukkitUtil.getLocation(loc); + final org.bukkit.Location from = player.getLocation(); PlayerTeleportEvent event = new PlayerTeleportEvent(player, from, to); callEvent(event); if (event.isCancelled() || !event.getTo().equals(to)) { @@ -75,32 +83,34 @@ public class BukkitPlayer extends PlotPlayer { } private void callEvent(final Event event) { - RegisteredListener[] listeners = event.getHandlers().getRegisteredListeners(); - for (RegisteredListener listener : listeners) { + Preconditions.checkNotNull(event, "Event cannot be null"); + + final RegisteredListener[] listeners = event.getHandlers().getRegisteredListeners(); + for (final RegisteredListener listener : listeners) { if (listener.getPlugin().getName().equals(PlotSquared.imp().getPluginName())) { continue; } try { listener.callEvent(event); - } catch (EventException e) { + } catch (final EventException e) { e.printStackTrace(); } } } - @Override public boolean hasPermission(String permission) { + @Override public boolean hasPermission(final String permission) { if (this.offline && EconHandler.manager != null) { return EconHandler.manager.hasPermission(getName(), permission); } return this.player.hasPermission(permission); } - @Override public int hasPermissionRange(String stub, int range) { + @Override public int hasPermissionRange(final String stub, final int range) { if (hasPermission(C.PERMISSION_ADMIN.s())) { return Integer.MAX_VALUE; } - String[] nodes = stub.split("\\."); - StringBuilder n = new StringBuilder(); + final String[] nodes = stub.split("\\."); + final StringBuilder n = new StringBuilder(); for (int i = 0; i < (nodes.length - 1); i++) { n.append(nodes[i]).append("."); if (!stub.equals(n + C.PERMISSION_STAR.s())) { @@ -114,7 +124,7 @@ public class BukkitPlayer extends PlotPlayer { } int max = 0; String stubPlus = stub + "."; - Set effective = player.getEffectivePermissions(); + final Set effective = player.getEffectivePermissions(); if (!effective.isEmpty()) { for (PermissionAttachmentInfo attach : effective) { String perm = attach.getPermission(); @@ -139,12 +149,12 @@ public class BukkitPlayer extends PlotPlayer { return max; } - @Override public boolean isPermissionSet(String permission) { + @Override public boolean isPermissionSet(final String permission) { return this.player.isPermissionSet(permission); } - @Override public void sendMessage(String message) { - if (!StringMan.isEqual(this.getMeta("lastMessage"), message) || ( + @Override public void sendMessage(final String message) { + if (!StringMan.isEqual(this.getMeta("lastMessage"), message) || ( System.currentTimeMillis() - this.getMeta("lastMessageTime") > 5000)) { setMeta("lastMessage", message); setMeta("lastMessageTime", System.currentTimeMillis()); @@ -152,14 +162,13 @@ public class BukkitPlayer extends PlotPlayer { } } - @Override public void teleport(Location location) { + @Override public void teleport(@Nonnull final Location location) { if (Math.abs(location.getX()) >= 30000000 || Math.abs(location.getZ()) >= 30000000) { return; } - this.player.teleport( - new org.bukkit.Location(BukkitUtil.getWorld(location.getWorld()), location.getX() + 0.5, - location.getY(), location.getZ() + 0.5, location.getYaw(), location.getPitch()), - TeleportCause.COMMAND); + final org.bukkit.Location bukkitLocation = new org.bukkit.Location(BukkitUtil.getWorld(location.getWorld()), location.getX() + 0.5, + location.getY(), location.getZ() + 0.5, location.getYaw(), location.getPitch()); + PaperLib.teleportAsync(player, bukkitLocation); } @Override public String getName() { @@ -177,14 +186,14 @@ public class BukkitPlayer extends PlotPlayer { this.player.setCompassTarget( new org.bukkit.Location(BukkitUtil.getWorld(location.getWorld()), location.getX(), location.getY(), location.getZ())); - } @Override public Location getLocationFull() { return BukkitUtil.getLocationFull(this.player); } - @Override public void setWeather(PlotWeather weather) { + @Override public void setWeather(@Nonnull final PlotWeather weather) { + Preconditions.checkNotNull(weather, "Specified weather cannot be null"); switch (weather) { case CLEAR: this.player.setPlayerWeather(WeatherType.CLEAR); @@ -201,7 +210,7 @@ public class BukkitPlayer extends PlotPlayer { } } - @Override public PlotGameMode getGameMode() { + @Nonnull @Override public PlotGameMode getGameMode() { switch (this.player.getGameMode()) { case ADVENTURE: return PlotGameMode.ADVENTURE; @@ -216,7 +225,8 @@ public class BukkitPlayer extends PlotPlayer { } } - @Override public void setGameMode(PlotGameMode gameMode) { + @Override public void setGameMode(@Nonnull final PlotGameMode gameMode) { + Preconditions.checkNotNull(gameMode, "Specified gamemode cannot be null"); switch (gameMode) { case ADVENTURE: this.player.setGameMode(GameMode.ADVENTURE); @@ -236,7 +246,7 @@ public class BukkitPlayer extends PlotPlayer { } } - @Override public void setTime(long time) { + @Override public void setTime(final long time) { if (time != Long.MAX_VALUE) { this.player.setPlayerTime(time, false); } else { @@ -252,7 +262,9 @@ public class BukkitPlayer extends PlotPlayer { this.player.setAllowFlight(fly); } - @Override public void playMusic(Location location, PlotBlock id) { + @Override public void playMusic(@Nonnull final Location location, @Nonnull final PlotBlock id) { + Preconditions.checkNotNull(location, "Specified location cannot be null"); + Preconditions.checkNotNull(id, "Specified block cannot be null"); if (PlotBlock.isEverything(id) || id.isAir()) { // Let's just stop all the discs because why not? for (final Sound sound : Arrays.stream(Sound.values()).filter(sound -> sound.name().contains("DISC")).collect( @@ -266,7 +278,7 @@ public class BukkitPlayer extends PlotPlayer { } } - @Override public void kick(String message) { + @Override public void kick(final String message) { this.player.kickPlayer(message); } diff --git a/Core/src/main/java/com/github/intellectualsites/plotsquared/commands/Command.java b/Core/src/main/java/com/github/intellectualsites/plotsquared/commands/Command.java index 6bac09a26..a581b8585 100644 --- a/Core/src/main/java/com/github/intellectualsites/plotsquared/commands/Command.java +++ b/Core/src/main/java/com/github/intellectualsites/plotsquared/commands/Command.java @@ -13,10 +13,10 @@ import com.github.intellectualsites.plotsquared.plot.object.RunnableVal3; import com.github.intellectualsites.plotsquared.plot.util.*; import java.io.IOException; -import java.lang.annotation.Annotation; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.*; +import java.util.concurrent.CompletableFuture; public abstract class Command { @@ -56,10 +56,9 @@ public abstract class Command { public Command(Command parent, boolean isStatic) { this.parent = parent; this.isStatic = isStatic; - Annotation cdAnnotation = getClass().getAnnotation(CommandDeclaration.class); + CommandDeclaration cdAnnotation = getClass().getAnnotation(CommandDeclaration.class); if (cdAnnotation != null) { - CommandDeclaration declaration = (CommandDeclaration) cdAnnotation; - init(declaration); + init(cdAnnotation); } for (final Method method : getClass().getDeclaredMethods()) { if (method.isAnnotationPresent(CommandDeclaration.class)) { @@ -70,14 +69,16 @@ public abstract class Command { && types[2] == String[].class && types[3] == RunnableVal3.class && types[4] == RunnableVal2.class) { Command tmp = new Command(this, true) { - @Override public void execute(PlotPlayer player, String[] args, + @Override public CompletableFuture execute(PlotPlayer player, String[] args, RunnableVal3 confirm, RunnableVal2 whenDone) { try { method.invoke(Command.this, this, player, args, confirm, whenDone); + return CompletableFuture.completedFuture(true); } catch (IllegalAccessException | InvocationTargetException e) { e.printStackTrace(); } + return CompletableFuture.completedFuture(false); } }; tmp.init(method.getAnnotation(CommandDeclaration.class)); @@ -263,9 +264,10 @@ public abstract class Command { * @param player Caller * @param args Arguments * @param confirm Instance, Success, Failure - * @return + * @return CompletableFuture true if the command executed fully, false in + * any other case */ - public void execute(PlotPlayer player, String[] args, + public CompletableFuture execute(PlotPlayer player, String[] args, RunnableVal3 confirm, RunnableVal2 whenDone) throws CommandException { if (args.length == 0 || args[0] == null) { @@ -274,28 +276,28 @@ public abstract class Command { } else { C.COMMAND_SYNTAX.send(player, getUsage()); } - return; + return CompletableFuture.completedFuture(false); } - if (this.allCommands == null || this.allCommands.isEmpty()) { + if (this.allCommands.isEmpty()) { player.sendMessage( "Not Implemented: https://github.com/IntellectualSites/PlotSquared/issues/new"); - return; + return CompletableFuture.completedFuture(false); } Command cmd = getCommand(args[0]); if (cmd == null) { if (this.parent != null) { C.COMMAND_SYNTAX.send(player, getUsage()); - return; + return CompletableFuture.completedFuture(false); } // Help command try { - if (args.length == 0 || MathMan.isInteger(args[0]) - || CommandCategory.valueOf(args[0].toUpperCase()) != null) { - // This will default certain syntax to the help command - // e.g. /plot, /plot 1, /plot claiming - MainCommand.getInstance().help.execute(player, args, null, null); - return; + if (!MathMan.isInteger(args[0])) { + CommandCategory.valueOf(args[0].toUpperCase()); } + // This will default certain syntax to the help command + // e.g. /plot, /plot 1, /plot claiming + MainCommand.getInstance().help.execute(player, args, null, null); + return CompletableFuture.completedFuture(false); } catch (IllegalArgumentException ignored) { } // Command recommendation @@ -304,16 +306,16 @@ public abstract class Command { if (commands.isEmpty()) { MainUtil .sendMessage(player, C.DID_YOU_MEAN, MainCommand.getInstance().help.getUsage()); - return; + return CompletableFuture.completedFuture(false); } - HashSet setargs = new HashSet<>(args.length); + HashSet setArgs = new HashSet<>(args.length); for (String arg : args) { - setargs.add(arg.toLowerCase()); + setArgs.add(arg.toLowerCase()); } - String[] allargs = setargs.toArray(new String[setargs.size()]); + String[] allArgs = setArgs.toArray(new String[0]); int best = 0; for (Command current : commands) { - int match = getMatch(allargs, current); + int match = getMatch(allArgs, current); if (match > best) { cmd = current; } @@ -322,17 +324,18 @@ public abstract class Command { cmd = new StringComparison<>(args[0], this.allCommands).getMatchObject(); } MainUtil.sendMessage(player, C.DID_YOU_MEAN, cmd.getUsage()); - return; + return CompletableFuture.completedFuture(false); } String[] newArgs = Arrays.copyOfRange(args, 1, args.length); if (!cmd.checkArgs(player, newArgs) || !cmd.canExecute(player, true)) { - return; + return CompletableFuture.completedFuture(false); } try { cmd.execute(player, newArgs, confirm, whenDone); } catch (CommandException e) { e.perform(player); } + return CompletableFuture.completedFuture(true); } public boolean checkArgs(PlotPlayer player, String[] args) { diff --git a/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/commands/Add.java b/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/commands/Add.java index 03d27555a..ed70d96d6 100644 --- a/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/commands/Add.java +++ b/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/commands/Add.java @@ -15,6 +15,7 @@ import com.github.intellectualsites.plotsquared.plot.util.Permissions; import java.util.Iterator; import java.util.Set; import java.util.UUID; +import java.util.concurrent.CompletableFuture; @CommandDeclaration(command = "add", description = "Allow a user to build in a plot while you are online", @@ -25,7 +26,7 @@ import java.util.UUID; super(MainCommand.getInstance(), true); } - @Override public void execute(final PlotPlayer player, String[] args, + @Override public CompletableFuture execute(final PlotPlayer player, String[] args, RunnableVal3 confirm, RunnableVal2 whenDone) throws CommandException { final Plot plot = check(player.getCurrentPlot(), C.NOT_IN_PLOT); @@ -61,22 +62,22 @@ import java.util.UUID; checkTrue(!uuids.isEmpty(), null); checkTrue(size <= plot.getArea().MAX_PLOT_MEMBERS || Permissions .hasPermission(player, C.PERMISSION_ADMIN_COMMAND_TRUST), C.PLOT_MAX_MEMBERS); - confirm.run(this, new Runnable() { - @Override // Success - public void run() { - for (UUID uuid : uuids) { - if (uuid != DBFunc.EVERYONE) { - if (!plot.removeTrusted(uuid)) { - if (plot.getDenied().contains(uuid)) { - plot.removeDenied(uuid); - } + // Success + confirm.run(this, () -> { + for (UUID uuid : uuids) { + if (uuid != DBFunc.EVERYONE) { + if (!plot.removeTrusted(uuid)) { + if (plot.getDenied().contains(uuid)) { + plot.removeDenied(uuid); } } - plot.addMember(uuid); - EventUtil.manager.callMember(player, plot, uuid, true); - MainUtil.sendMessage(player, C.MEMBER_ADDED); } + plot.addMember(uuid); + EventUtil.manager.callMember(player, plot, uuid, true); + MainUtil.sendMessage(player, C.MEMBER_ADDED); } }, null); + + return CompletableFuture.completedFuture(true); } } diff --git a/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/commands/Buy.java b/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/commands/Buy.java index 25f9484b1..5c6a88b93 100644 --- a/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/commands/Buy.java +++ b/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/commands/Buy.java @@ -14,6 +14,7 @@ import com.github.intellectualsites.plotsquared.plot.util.UUIDHandler; import java.util.Optional; import java.util.Set; +import java.util.concurrent.CompletableFuture; @CommandDeclaration(command = "buy", description = "Buy the plot you are standing on", usage = "/plot buy", permission = "plots.buy", category = CommandCategory.CLAIMING, @@ -23,7 +24,7 @@ import java.util.Set; super(MainCommand.getInstance(), true); } - @Override public void execute(final PlotPlayer player, String[] args, + @Override public CompletableFuture execute(final PlotPlayer player, String[] args, RunnableVal3 confirm, final RunnableVal2 whenDone) { check(EconHandler.manager, C.ECON_DISABLED); @@ -46,27 +47,24 @@ import java.util.Set; final double price = flag.get(); checkTrue(player.getMoney() >= price, C.CANNOT_AFFORD_PLOT); player.withdraw(price); - confirm.run(this, new Runnable() { - @Override // Success - public void run() { - C.REMOVED_BALANCE.send(player, price); - EconHandler.manager - .depositMoney(UUIDHandler.getUUIDWrapper().getOfflinePlayer(plot.owner), price); - PlotPlayer owner = UUIDHandler.getPlayer(plot.owner); - if (owner != null) { - C.PLOT_SOLD.send(owner, plot.getId(), player.getName(), price); - } - plot.removeFlag(Flags.PRICE); - plot.setOwner(player.getUUID()); - C.CLAIMED.send(player); - whenDone.run(Buy.this, CommandResult.SUCCESS); - } - }, new Runnable() { - @Override // Failure - public void run() { - player.deposit(price); - whenDone.run(Buy.this, CommandResult.FAILURE); + // Failure + // Success + confirm.run(this, () -> { + C.REMOVED_BALANCE.send(player, price); + EconHandler.manager + .depositMoney(UUIDHandler.getUUIDWrapper().getOfflinePlayer(plot.owner), price); + PlotPlayer owner = UUIDHandler.getPlayer(plot.owner); + if (owner != null) { + C.PLOT_SOLD.send(owner, plot.getId(), player.getName(), price); } + plot.removeFlag(Flags.PRICE); + plot.setOwner(player.getUUID()); + C.CLAIMED.send(player); + whenDone.run(Buy.this, CommandResult.SUCCESS); + }, () -> { + player.deposit(price); + whenDone.run(Buy.this, CommandResult.FAILURE); }); + return CompletableFuture.completedFuture(true); } } diff --git a/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/commands/Clear.java b/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/commands/Clear.java index efd6b1525..b4de09259 100644 --- a/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/commands/Clear.java +++ b/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/commands/Clear.java @@ -14,6 +14,8 @@ import com.github.intellectualsites.plotsquared.plot.util.MainUtil; import com.github.intellectualsites.plotsquared.plot.util.Permissions; import com.github.intellectualsites.plotsquared.plot.util.block.GlobalBlockQueue; +import java.util.concurrent.CompletableFuture; + @CommandDeclaration(command = "clear", description = "Clear the plot you stand on", permission = "plots.clear", category = CommandCategory.APPEARANCE, usage = "/plot clear", aliases = "reset", confirmation = true) public class Clear extends Command { @@ -25,7 +27,7 @@ import com.github.intellectualsites.plotsquared.plot.util.block.GlobalBlockQueue super(MainCommand.getInstance(), true); } - @Override public void execute(final PlotPlayer player, String[] args, + @Override public CompletableFuture execute(final PlotPlayer player, String[] args, RunnableVal3 confirm, RunnableVal2 whenDone) throws CommandException { checkTrue(args.length == 0, C.COMMAND_SYNTAX, getUsage()); @@ -35,34 +37,29 @@ import com.github.intellectualsites.plotsquared.plot.util.block.GlobalBlockQueue checkTrue(plot.getRunning() == 0, C.WAIT_FOR_TIMER); checkTrue(!Settings.Done.RESTRICT_BUILDING || !Flags.DONE.isSet(plot) || Permissions .hasPermission(player, C.PERMISSION_CONTINUE), C.DONE_ALREADY_DONE); - confirm.run(this, new Runnable() { - @Override public void run() { - final long start = System.currentTimeMillis(); - boolean result = plot.clear(true, false, new Runnable() { - @Override public void run() { - plot.unlink(); - GlobalBlockQueue.IMP.addTask(new Runnable() { - @Override public void run() { - plot.removeRunning(); - // If the state changes, then mark it as no longer done - if (plot.getFlag(Flags.DONE).isPresent()) { - FlagManager.removePlotFlag(plot, Flags.DONE); - } - if (plot.getFlag(Flags.ANALYSIS).isPresent()) { - FlagManager.removePlotFlag(plot, Flags.ANALYSIS); - } - MainUtil.sendMessage(player, C.CLEARING_DONE, - "" + (System.currentTimeMillis() - start)); - } - }); + confirm.run(this, () -> { + final long start = System.currentTimeMillis(); + boolean result = plot.clear(true, false, () -> { + plot.unlink(); + GlobalBlockQueue.IMP.addTask(() -> { + plot.removeRunning(); + // If the state changes, then mark it as no longer done + if (plot.getFlag(Flags.DONE).isPresent()) { + FlagManager.removePlotFlag(plot, Flags.DONE); } + if (plot.getFlag(Flags.ANALYSIS).isPresent()) { + FlagManager.removePlotFlag(plot, Flags.ANALYSIS); + } + MainUtil.sendMessage(player, C.CLEARING_DONE, + "" + (System.currentTimeMillis() - start)); }); - if (!result) { - MainUtil.sendMessage(player, C.WAIT_FOR_TIMER); - } else { - plot.addRunning(); - } + }); + if (!result) { + MainUtil.sendMessage(player, C.WAIT_FOR_TIMER); + } else { + plot.addRunning(); } }, null); + return CompletableFuture.completedFuture(true); } } diff --git a/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/commands/DebugExec.java b/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/commands/DebugExec.java index dfcda68ae..f0f4e148a 100644 --- a/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/commands/DebugExec.java +++ b/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/commands/DebugExec.java @@ -23,6 +23,7 @@ import java.io.IOException; import java.nio.charset.StandardCharsets; import java.sql.Timestamp; import java.util.*; +import java.util.concurrent.CompletableFuture; @CommandDeclaration(command = "debugexec", permission = "plots.admin", description = "Mutli-purpose debug command", aliases = {"exec", "$"}, @@ -265,7 +266,7 @@ import java.util.*; System.getProperty("line.separator")); new Command(MainCommand.getInstance(), true, args[1].split("\\.")[0], null, RequiredType.NONE, CommandCategory.DEBUG) { - @Override public void execute(PlotPlayer player, String[] args, + @Override public CompletableFuture execute(PlotPlayer player, String[] args, RunnableVal3 confirm, RunnableVal2 whenDone) { try { @@ -276,6 +277,7 @@ import java.util.*; e.printStackTrace(); MainUtil.sendMessage(player, C.COMMAND_WENT_WRONG); } + return CompletableFuture.completedFuture(true); } }; return true; diff --git a/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/commands/DebugImportWorlds.java b/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/commands/DebugImportWorlds.java index ddffaf744..8a4cfe613 100644 --- a/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/commands/DebugImportWorlds.java +++ b/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/commands/DebugImportWorlds.java @@ -16,6 +16,7 @@ import com.google.common.base.Charsets; import java.io.File; import java.util.UUID; +import java.util.concurrent.CompletableFuture; @CommandDeclaration(command = "debugimportworlds", permission = "plots.admin", description = "Import worlds by player name", requiredType = RequiredType.CONSOLE, @@ -24,14 +25,14 @@ import java.util.UUID; super(MainCommand.getInstance(), true); } - @Override public void execute(PlotPlayer player, String[] args, + @Override public CompletableFuture execute(PlotPlayer player, String[] args, RunnableVal3 confirm, RunnableVal2 whenDone) throws CommandException { // UUID.nameUUIDFromBytes(("OfflinePlayer:" + player.getName()).getBytes(Charsets.UTF_8)) PlotAreaManager pam = PlotSquared.get().getPlotAreaManager(); if (!(pam instanceof SinglePlotAreaManager)) { player.sendMessage("Must be a single plot area!"); - return; + return CompletableFuture.completedFuture(false); } SinglePlotArea area = ((SinglePlotAreaManager) pam).getArea(); PlotId id = new PlotId(0, 0); @@ -54,5 +55,6 @@ import java.util.UUID; } } player.sendMessage("Done!"); + return CompletableFuture.completedFuture(true); } } diff --git a/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/commands/Grant.java b/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/commands/Grant.java index d29bd76bb..18938f2ee 100644 --- a/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/commands/Grant.java +++ b/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/commands/Grant.java @@ -14,6 +14,7 @@ import com.github.intellectualsites.plotsquared.plot.util.Permissions; import com.github.intellectualsites.plotsquared.plot.util.UUIDHandler; import java.util.UUID; +import java.util.concurrent.CompletableFuture; @CommandDeclaration(command = "grant", category = CommandCategory.CLAIMING, usage = "/plot grant [player]", permission = "plots.grant", @@ -23,7 +24,7 @@ import java.util.UUID; super(MainCommand.getInstance(), true); } - @Override public void execute(final PlotPlayer player, String[] args, + @Override public CompletableFuture execute(final PlotPlayer player, String[] args, RunnableVal3 confirm, RunnableVal2 whenDone) throws CommandException { checkTrue(args.length >= 1 && args.length <= 2, C.COMMAND_SYNTAX, getUsage()); @@ -33,7 +34,7 @@ import java.util.UUID; case "check": if (!Permissions.hasPermission(player, C.PERMISSION_GRANT.f(arg0))) { C.NO_PERMISSION.send(player, C.PERMISSION_GRANT.f(arg0)); - return; + return CompletableFuture.completedFuture(false); } if (args.length > 2) { break; @@ -42,7 +43,7 @@ import java.util.UUID; args.length == 2 ? UUIDHandler.getUUIDFromString(args[1]) : player.getUUID(); if (uuid == null) { C.INVALID_PLAYER.send(player, args[1]); - return; + return CompletableFuture.completedFuture(false); } MainUtil.getPersistentMeta(uuid, "grantedPlots", new RunnableVal() { @Override public void run(byte[] array) { @@ -65,7 +66,9 @@ import java.util.UUID; } } }); + return CompletableFuture.completedFuture(true); } C.COMMAND_SYNTAX.send(player, getUsage()); + return CompletableFuture.completedFuture(true); } } diff --git a/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/commands/Help.java b/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/commands/Help.java index f0ff64af1..a62d1ab6f 100644 --- a/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/commands/Help.java +++ b/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/commands/Help.java @@ -11,6 +11,8 @@ import com.github.intellectualsites.plotsquared.plot.util.MathMan; import com.github.intellectualsites.plotsquared.plot.util.StringMan; import com.github.intellectualsites.plotsquared.plot.util.helpmenu.HelpMenu; +import java.util.concurrent.CompletableFuture; + @CommandDeclaration(command = "help", description = "Get this help menu", aliases = {"he", "?"}, category = CommandCategory.INFO, usage = "help [category|#]", permission = "plots.use") public class Help extends Command { @@ -22,72 +24,73 @@ public class Help extends Command { return true; } - @Override public void execute(PlotPlayer player, String[] args, + @Override public CompletableFuture execute(PlotPlayer player, String[] args, RunnableVal3 confirm, RunnableVal2 whenDone) { switch (args.length) { case 0: - displayHelp(player, null, 0); - return; + return displayHelp(player, null, 0); case 1: if (MathMan.isInteger(args[0])) { try { - displayHelp(player, null, Integer.parseInt(args[0])); + return displayHelp(player, null, Integer.parseInt(args[0])); } catch (NumberFormatException ignored) { - displayHelp(player, null, 1); + return displayHelp(player, null, 1); } } else { - displayHelp(player, args[0], 1); + return displayHelp(player, args[0], 1); } - return; case 2: if (MathMan.isInteger(args[1])) { try { - displayHelp(player, args[0], Integer.parseInt(args[1])); + return displayHelp(player, args[0], Integer.parseInt(args[1])); } catch (NumberFormatException ignored) { - displayHelp(player, args[0], 1); + return displayHelp(player, args[0], 1); } } - return; + return CompletableFuture.completedFuture(false); default: C.COMMAND_SYNTAX.send(player, getUsage()); } + return CompletableFuture.completedFuture(true); } - public void displayHelp(PlotPlayer player, String cat, int page) { - CommandCategory catEnum = null; - if (cat != null) { - if (StringMan.isEqualIgnoreCase(cat, "all")) { - catEnum = null; - } else { - for (CommandCategory c : CommandCategory.values()) { - if (StringMan.isEqualIgnoreCaseToAny(cat, c.name(), c.toString())) { - catEnum = c; - cat = c.name(); - break; + public CompletableFuture displayHelp(final PlotPlayer player, final String catRaw, final int page) { + return CompletableFuture.supplyAsync(() -> { + String cat = catRaw; + + CommandCategory catEnum = null; + if (cat != null) { + if (!StringMan.isEqualIgnoreCase(cat, "all")) { + for (CommandCategory c : CommandCategory.values()) { + if (StringMan.isEqualIgnoreCaseToAny(cat, c.name(), c.toString())) { + catEnum = c; + cat = c.name(); + break; + } + } + if (catEnum == null) { + cat = null; } } - if (catEnum == null) { - cat = null; + } + if (cat == null && page == 0) { + StringBuilder builder = new StringBuilder(); + builder.append(C.HELP_HEADER.s()); + for (CommandCategory c : CommandCategory.values()) { + builder.append("\n").append(StringMan + .replaceAll(C.HELP_INFO_ITEM.s(), "%category%", c.toString().toLowerCase(), + "%category_desc%", c.toString())); } + builder.append("\n").append(C.HELP_INFO_ITEM.s().replaceAll("%category%", "all") + .replaceAll("%category_desc%", "Display all commands")); + builder.append("\n").append(C.HELP_FOOTER.s()); + MainUtil.sendMessage(player, builder.toString(), false); + return true; } - } - if (cat == null && page == 0) { - StringBuilder builder = new StringBuilder(); - builder.append(C.HELP_HEADER.s()); - for (CommandCategory c : CommandCategory.values()) { - builder.append("\n" + StringMan - .replaceAll(C.HELP_INFO_ITEM.s(), "%category%", c.toString().toLowerCase(), - "%category_desc%", c.toString())); - } - builder.append("\n").append(C.HELP_INFO_ITEM.s().replaceAll("%category%", "all") - .replaceAll("%category_desc%", "Display all commands")); - builder.append("\n" + C.HELP_FOOTER.s()); - MainUtil.sendMessage(player, builder.toString(), false); - return; - } - page--; - new HelpMenu(player).setCategory(catEnum).getCommands().generateMaxPages() - .generatePage(page, getParent().toString()).render(); + new HelpMenu(player).setCategory(catEnum).getCommands().generateMaxPages() + .generatePage(page - 1, getParent().toString()).render(); + return true; + }); } } diff --git a/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/commands/Leave.java b/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/commands/Leave.java index 5504ce777..cf49be592 100644 --- a/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/commands/Leave.java +++ b/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/commands/Leave.java @@ -11,6 +11,7 @@ import com.github.intellectualsites.plotsquared.plot.util.EventUtil; import com.github.intellectualsites.plotsquared.plot.util.MainUtil; import java.util.UUID; +import java.util.concurrent.CompletableFuture; @CommandDeclaration(command = "leave", description = "Removes self from being trusted or a member of the plot", @@ -20,7 +21,7 @@ import java.util.UUID; super(MainCommand.getInstance(), true); } - @Override public void execute(PlotPlayer player, String[] args, + @Override public CompletableFuture execute(PlotPlayer player, String[] args, RunnableVal3 confirm, RunnableVal2 whenDone) throws CommandException { final Plot plot = check(player.getCurrentPlot(), C.NOT_IN_PLOT); @@ -44,5 +45,6 @@ import java.util.UUID; MainUtil.sendMessage(player, C.REMOVED_PLAYERS, 1); } } + return CompletableFuture.completedFuture(true); } } diff --git a/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/commands/MainCommand.java b/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/commands/MainCommand.java index 0e1630e76..c50c5a221 100644 --- a/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/commands/MainCommand.java +++ b/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/commands/MainCommand.java @@ -10,6 +10,7 @@ import com.github.intellectualsites.plotsquared.plot.util.EconHandler; import com.github.intellectualsites.plotsquared.plot.util.Permissions; import java.util.Arrays; +import java.util.concurrent.CompletableFuture; /** * PlotSquared command class. @@ -126,27 +127,25 @@ public class MainCommand extends Command { @Override public void run(final Command cmd, final Runnable success, final Runnable failure) { if (cmd.hasConfirmation(player)) { - CmdConfirm.addPending(player, cmd.getUsage(), new Runnable() { - @Override public void run() { - if (EconHandler.manager != null) { - PlotArea area = player.getApplicablePlotArea(); - if (area != null) { - Expression priceEval = - area.PRICES.get(cmd.getFullId()); - Double price = - priceEval != null ? priceEval.evaluate(0d) : 0d; - if (price != null - && EconHandler.manager.getMoney(player) < price) { - if (failure != null) { - failure.run(); - } - return; + CmdConfirm.addPending(player, cmd.getUsage(), () -> { + if (EconHandler.manager != null) { + PlotArea area = player.getApplicablePlotArea(); + if (area != null) { + Expression priceEval = + area.PRICES.get(cmd.getFullId()); + Double price = + priceEval != null ? priceEval.evaluate(0d) : 0d; + if (price != null + && EconHandler.manager.getMoney(player) < price) { + if (failure != null) { + failure.run(); } + return; } } - if (success != null) { - success.run(); - } + } + if (success != null) { + success.run(); } }); return; @@ -172,6 +171,8 @@ public class MainCommand extends Command { @Override public void run(Command cmd, CommandResult result) { // Post command stuff!? } + }).thenAccept(result -> { + // TODO: Something with the command result }); } catch (CommandException e) { e.perform(player); @@ -187,7 +188,7 @@ public class MainCommand extends Command { PlotSquared.debug("Command registration is now done during instantiation"); } - @Override public void execute(final PlotPlayer player, String[] args, + @Override public CompletableFuture execute(final PlotPlayer player, String[] args, RunnableVal3 confirm, RunnableVal2 whenDone) { // Clear perm caching // @@ -218,37 +219,32 @@ public class MainCommand extends Command { args = Arrays.copyOfRange(args, 1, args.length); } if (args.length >= 2 && !args[0].isEmpty() && args[0].charAt(0) == '-') { - switch (args[0].substring(1)) { - case "f": - confirm = new RunnableVal3() { - @Override - public void run(Command cmd, Runnable success, Runnable failure) { - if (EconHandler.manager != null) { - PlotArea area = player.getApplicablePlotArea(); - if (area != null) { - Expression priceEval = - area.PRICES.get(cmd.getFullId()); - Double price = - priceEval != null ? priceEval.evaluate(0d) : 0d; - if (price != 0d - && EconHandler.manager.getMoney(player) < price) { - if (failure != null) { - failure.run(); - } - return; + if ("f".equals(args[0].substring(1))) { + confirm = new RunnableVal3() { + @Override public void run(Command cmd, Runnable success, Runnable failure) { + if (EconHandler.manager != null) { + PlotArea area = player.getApplicablePlotArea(); + if (area != null) { + Expression priceEval = area.PRICES.get(cmd.getFullId()); + Double price = priceEval != null ? priceEval.evaluate(0d) : 0d; + if (price != 0d + && EconHandler.manager.getMoney(player) < price) { + if (failure != null) { + failure.run(); } + return; } } - if (success != null) { - success.run(); - } } - }; - args = Arrays.copyOfRange(args, 1, args.length); - break; - default: - C.INVALID_COMMAND_FLAG.send(player); - return; + if (success != null) { + success.run(); + } + } + }; + args = Arrays.copyOfRange(args, 1, args.length); + } else { + C.INVALID_COMMAND_FLAG.send(player); + return CompletableFuture.completedFuture(false); } } } @@ -278,6 +274,7 @@ public class MainCommand extends Command { player.setMeta(PlotPlayer.META_LAST_PLOT, plot); } } + return CompletableFuture.completedFuture(true); } @Override public boolean canExecute(PlotPlayer player, boolean message) { diff --git a/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/commands/Near.java b/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/commands/Near.java index c3e9c5f9e..e2278c4e2 100644 --- a/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/commands/Near.java +++ b/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/commands/Near.java @@ -9,16 +9,19 @@ import com.github.intellectualsites.plotsquared.plot.object.RunnableVal2; import com.github.intellectualsites.plotsquared.plot.object.RunnableVal3; import com.github.intellectualsites.plotsquared.plot.util.StringMan; +import java.util.concurrent.CompletableFuture; + @CommandDeclaration(command = "near", aliases = "n", description = "Display nearby players", usage = "/plot near", category = CommandCategory.INFO) public class Near extends Command { public Near() { super(MainCommand.getInstance(), true); } - @Override public void execute(PlotPlayer player, String[] args, + @Override public CompletableFuture execute(PlotPlayer player, String[] args, RunnableVal3 confirm, RunnableVal2 whenDone) throws CommandException { final Plot plot = check(player.getCurrentPlot(), C.NOT_IN_PLOT); C.PLOT_NEAR.send(player, StringMan.join(plot.getPlayersInPlot(), ", ")); + return CompletableFuture.completedFuture(true); } } diff --git a/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/commands/Relight.java b/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/commands/Relight.java index 79a87b887..0d3638fe3 100644 --- a/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/commands/Relight.java +++ b/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/commands/Relight.java @@ -7,7 +7,7 @@ import com.github.intellectualsites.plotsquared.plot.object.*; import com.github.intellectualsites.plotsquared.plot.util.ChunkManager; import com.github.intellectualsites.plotsquared.plot.util.block.LocalBlockQueue; -import java.util.HashSet; +import java.util.concurrent.CompletableFuture; @CommandDeclaration(command = "relight", description = "Relight your plot", usage = "/plot relight", category = CommandCategory.DEBUG) public class Relight extends Command { @@ -15,25 +15,24 @@ import java.util.HashSet; super(MainCommand.getInstance(), true); } - @Override public void execute(final PlotPlayer player, String[] args, + @Override public CompletableFuture execute(final PlotPlayer player, String[] args, RunnableVal3 confirm, RunnableVal2 whenDone) { final Plot plot = player.getCurrentPlot(); if (plot == null) { C.NOT_IN_PLOT.send(player); - return; + return CompletableFuture.completedFuture(false); } - HashSet regions = plot.getRegions(); final LocalBlockQueue queue = plot.getArea().getQueue(false); ChunkManager.chunkTask(plot, new RunnableVal() { @Override public void run(int[] value) { queue.fixChunkLighting(value[0], value[1]); } - }, new Runnable() { - @Override public void run() { - plot.refreshChunks(); - C.SET_BLOCK_ACTION_FINISHED.send(player); - } + }, () -> { + plot.refreshChunks(); + C.SET_BLOCK_ACTION_FINISHED.send(player); }, 5); + + return CompletableFuture.completedFuture(true); } } diff --git a/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/commands/SubCommand.java b/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/commands/SubCommand.java index 396185e29..f0055829d 100644 --- a/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/commands/SubCommand.java +++ b/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/commands/SubCommand.java @@ -7,6 +7,8 @@ import com.github.intellectualsites.plotsquared.plot.object.PlotPlayer; import com.github.intellectualsites.plotsquared.plot.object.RunnableVal2; import com.github.intellectualsites.plotsquared.plot.object.RunnableVal3; +import java.util.concurrent.CompletableFuture; + /** * SubCommand class * @@ -23,13 +25,12 @@ public abstract class SubCommand extends Command { setRequiredArguments(arguments); } - @Override public void execute(PlotPlayer player, String[] args, + @Override public CompletableFuture execute(PlotPlayer player, String[] args, RunnableVal3 confirm, RunnableVal2 whenDone) { - onCommand(player, args); + return CompletableFuture.completedFuture(onCommand(player, args)); } - public abstract boolean onCommand(PlotPlayer player, String[] args); public boolean sendMessage(PlotPlayer player, C message, Object... args) { diff --git a/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/commands/Trust.java b/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/commands/Trust.java index 6e6f0c5ab..7b6dfb761 100644 --- a/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/commands/Trust.java +++ b/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/commands/Trust.java @@ -15,6 +15,7 @@ import com.github.intellectualsites.plotsquared.plot.util.Permissions; import java.util.Iterator; import java.util.Set; import java.util.UUID; +import java.util.concurrent.CompletableFuture; @CommandDeclaration(command = "trust", aliases = {"t"}, requiredType = RequiredType.NONE, usage = "/plot trust ", @@ -25,7 +26,7 @@ import java.util.UUID; super(MainCommand.getInstance(), true); } - @Override public void execute(final PlotPlayer player, String[] args, + @Override public CompletableFuture execute(final PlotPlayer player, String[] args, RunnableVal3 confirm, RunnableVal2 whenDone) throws CommandException { final Plot plot = check(player.getCurrentPlot(), C.NOT_IN_PLOT); @@ -61,22 +62,22 @@ import java.util.UUID; checkTrue(!uuids.isEmpty(), null); checkTrue(size <= plot.getArea().MAX_PLOT_MEMBERS || Permissions .hasPermission(player, C.PERMISSION_ADMIN_COMMAND_TRUST), C.PLOT_MAX_MEMBERS); - confirm.run(this, new Runnable() { - @Override // Success - public void run() { - for (UUID uuid : uuids) { - if (uuid != DBFunc.EVERYONE) { - if (!plot.removeMember(uuid)) { - if (plot.getDenied().contains(uuid)) { - plot.removeDenied(uuid); - } + // Success + confirm.run(this, () -> { + for (UUID uuid : uuids) { + if (uuid != DBFunc.EVERYONE) { + if (!plot.removeMember(uuid)) { + if (plot.getDenied().contains(uuid)) { + plot.removeDenied(uuid); } } - plot.addTrusted(uuid); - EventUtil.manager.callTrusted(player, plot, uuid, true); - MainUtil.sendMessage(player, C.TRUSTED_ADDED); } + plot.addTrusted(uuid); + EventUtil.manager.callTrusted(player, plot, uuid, true); + MainUtil.sendMessage(player, C.TRUSTED_ADDED); } }, null); + + return CompletableFuture.completedFuture(true); } } diff --git a/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/commands/Visit.java b/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/commands/Visit.java index 8f1e50f16..6bd269968 100644 --- a/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/commands/Visit.java +++ b/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/commands/Visit.java @@ -12,6 +12,7 @@ import com.github.intellectualsites.plotsquared.plot.util.Permissions; import com.github.intellectualsites.plotsquared.plot.util.UUIDHandler; import java.util.*; +import java.util.concurrent.CompletableFuture; @CommandDeclaration(command = "visit", permission = "plots.visit", description = "Visit someones plot", usage = "/plot visit [|||] [#]", @@ -26,7 +27,7 @@ import java.util.*; return tabOf(player, args, space, getUsage()); } - @Override public void execute(final PlotPlayer player, String[] args, + @Override public CompletableFuture execute(final PlotPlayer player, String[] args, RunnableVal3 confirm, final RunnableVal2 whenDone) throws CommandException { if (args.length == 1 && args[0].contains(":")) { @@ -41,7 +42,7 @@ import java.util.*; if (!MathMan.isInteger(args[1])) { C.NOT_VALID_NUMBER.send(player, "(1, ∞)"); C.COMMAND_SYNTAX.send(player, getUsage()); - return; + return CompletableFuture.completedFuture(false); } page = Integer.parseInt(args[2]); case 2: @@ -50,12 +51,12 @@ import java.util.*; if (sortByArea == null) { C.NOT_VALID_NUMBER.send(player, "(1, ∞)"); C.COMMAND_SYNTAX.send(player, getUsage()); - return; + return CompletableFuture.completedFuture(false); } UUID user = UUIDHandler.getUUIDFromString(args[0]); if (user == null) { C.COMMAND_SYNTAX.send(player, getUsage()); - return; + return CompletableFuture.completedFuture(false); } unsorted = PlotSquared.get().getBasePlots(user); shouldSortByArea = true; @@ -92,13 +93,13 @@ import java.util.*; } if (unsorted == null || unsorted.isEmpty()) { C.FOUND_NO_PLOTS.send(player); - return; + return CompletableFuture.completedFuture(false); } unsorted = new ArrayList<>(unsorted); unsorted.removeIf(plot -> !plot.isBasePlot()); if (page < 1 || page > unsorted.size()) { C.NOT_VALID_NUMBER.send(player, "(1, " + unsorted.size() + ")"); - return; + return CompletableFuture.completedFuture(false); } List plots; if (shouldSortByArea) { @@ -111,23 +112,23 @@ import java.util.*; if (!plot.hasOwner()) { if (!Permissions.hasPermission(player, C.PERMISSION_VISIT_UNOWNED)) { C.NO_PERMISSION.send(player, C.PERMISSION_VISIT_UNOWNED); - return; + return CompletableFuture.completedFuture(false); } } else if (plot.isOwner(player.getUUID())) { if (!Permissions.hasPermission(player, C.PERMISSION_VISIT_OWNED) && !Permissions .hasPermission(player, C.PERMISSION_HOME)) { C.NO_PERMISSION.send(player, C.PERMISSION_VISIT_OWNED); - return; + return CompletableFuture.completedFuture(false); } } else if (plot.isAdded(player.getUUID())) { if (!Permissions.hasPermission(player, C.PERMISSION_SHARED)) { C.NO_PERMISSION.send(player, C.PERMISSION_SHARED); - return; + return CompletableFuture.completedFuture(false); } } else { if (!Permissions.hasPermission(player, C.PERMISSION_VISIT_OTHER)) { C.NO_PERMISSION.send(player, C.PERMISSION_VISIT_OTHER); - return; + return CompletableFuture.completedFuture(false); } } confirm.run(this, () -> { @@ -137,6 +138,8 @@ import java.util.*; whenDone.run(Visit.this, CommandResult.FAILURE); } }, () -> whenDone.run(Visit.this, CommandResult.FAILURE)); + + return CompletableFuture.completedFuture(true); } } diff --git a/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/object/ConsolePlayer.java b/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/object/ConsolePlayer.java index 18a0ce7bc..62b7f2544 100644 --- a/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/object/ConsolePlayer.java +++ b/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/object/ConsolePlayer.java @@ -6,6 +6,7 @@ import com.github.intellectualsites.plotsquared.plot.database.DBFunc; import com.github.intellectualsites.plotsquared.plot.util.PlotGameMode; import com.github.intellectualsites.plotsquared.plot.util.PlotWeather; +import javax.annotation.Nonnull; import java.util.UUID; public class ConsolePlayer extends PlotPlayer { @@ -33,7 +34,7 @@ public class ConsolePlayer extends PlotPlayer { return instance; } - @Override public boolean canTeleport(Location loc) { + @Override public boolean canTeleport(@Nonnull Location loc) { return true; } @@ -95,14 +96,14 @@ public class ConsolePlayer extends PlotPlayer { return RequiredType.CONSOLE; } - @Override public void setWeather(PlotWeather weather) { + @Override public void setWeather(@Nonnull PlotWeather weather) { } - @Override public PlotGameMode getGameMode() { + @Nonnull @Override public PlotGameMode getGameMode() { return PlotGameMode.NOT_SET; } - @Override public void setGameMode(PlotGameMode gameMode) { + @Override public void setGameMode(@Nonnull PlotGameMode gameMode) { } @Override public void setTime(long time) { @@ -115,7 +116,7 @@ public class ConsolePlayer extends PlotPlayer { @Override public void setFlight(boolean fly) { } - @Override public void playMusic(Location location, PlotBlock id) { + @Override public void playMusic(@Nonnull Location location, @Nonnull PlotBlock id) { } @Override public void kick(String message) { diff --git a/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/object/PlotPlayer.java b/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/object/PlotPlayer.java index d535c625e..4c3a2f6de 100644 --- a/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/object/PlotPlayer.java +++ b/Core/src/main/java/com/github/intellectualsites/plotsquared/plot/object/PlotPlayer.java @@ -12,8 +12,10 @@ import com.github.intellectualsites.plotsquared.plot.object.worlds.SinglePlotAre import com.github.intellectualsites.plotsquared.plot.object.worlds.SinglePlotAreaManager; import com.github.intellectualsites.plotsquared.plot.util.*; import com.github.intellectualsites.plotsquared.plot.util.expiry.ExpireManager; +import com.google.common.base.Preconditions; import lombok.NonNull; +import javax.annotation.Nonnull; import java.nio.ByteBuffer; import java.util.*; import java.util.concurrent.ConcurrentHashMap; @@ -335,8 +337,9 @@ public abstract class PlotPlayer implements CommandCaller, OfflinePlotPlayer { */ @Override public abstract UUID getUUID(); - public boolean canTeleport(Location loc) { - Location current = getLocationFull(); + public boolean canTeleport(@Nonnull final Location loc) { + Preconditions.checkNotNull(loc, "Specified location cannot be null"); + final Location current = getLocationFull(); teleport(loc); boolean result = true; if (!getLocation().equals(loc)) { @@ -409,21 +412,21 @@ public abstract class PlotPlayer implements CommandCaller, OfflinePlotPlayer { * * @param weather the weather visible to the player */ - public abstract void setWeather(PlotWeather weather); + public abstract void setWeather(@Nonnull PlotWeather weather); /** * Get this player's gamemode. * * @return the gamemode of the player. */ - public abstract PlotGameMode getGameMode(); + @Nonnull public abstract PlotGameMode getGameMode(); /** * Set this player's gameMode. * * @param gameMode the gamemode to set */ - public abstract void setGameMode(PlotGameMode gameMode); + public abstract void setGameMode(@Nonnull PlotGameMode gameMode); /** * Set this player's local time (ticks). @@ -447,7 +450,7 @@ public abstract class PlotPlayer implements CommandCaller, OfflinePlotPlayer { * @param location where to play the music * @param id the record item id */ - public abstract void playMusic(Location location, PlotBlock id); + public abstract void playMusic(@Nonnull Location location, @Nonnull PlotBlock id); /** * Check if this player is banned.