From c4d9fd74afdb54a44b88d96c60098c35673fdc9b Mon Sep 17 00:00:00 2001 From: Phoenix616 Date: Fri, 12 Apr 2019 16:07:06 +0100 Subject: [PATCH] Don't start multiple searches at once This only applies to sign interactions and when a player uses a preset himself --- .../randomteleport/RandomTeleport.java | 13 +++++++++++- .../randomteleport/RandomTeleportCommand.java | 10 ++++++++++ .../listeners/SignListener.java | 8 ++++++++ .../searcher/RandomSearcher.java | 20 +++++++++++++++---- .../src/main/resources/languages/lang.en.yml | 1 + 5 files changed, 47 insertions(+), 5 deletions(-) diff --git a/randomteleport-plugin/src/main/java/de/themoep/randomteleport/RandomTeleport.java b/randomteleport-plugin/src/main/java/de/themoep/randomteleport/RandomTeleport.java index 6a592dc..eb6e909 100644 --- a/randomteleport-plugin/src/main/java/de/themoep/randomteleport/RandomTeleport.java +++ b/randomteleport-plugin/src/main/java/de/themoep/randomteleport/RandomTeleport.java @@ -47,6 +47,8 @@ import org.bukkit.plugin.java.JavaPlugin; import java.util.AbstractMap; import java.util.ArrayList; import java.util.Arrays; +import java.util.Collection; +import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Objects; @@ -62,6 +64,7 @@ public class RandomTeleport extends JavaPlugin { private HookManager hookManager; private LanguageManager lang; private Table> cooldowns = HashBasedTable.create(); + private Map runningSearchers = new HashMap<>(); private ValidatorRegistry locationValidators = new ValidatorRegistry(); private List optionParsers = new ArrayList<>(); @@ -210,6 +213,14 @@ public class RandomTeleport extends JavaPlugin { locationValidators.add(new BlockValidator(saveBlocks)); } + /** + * Get the map of all running searchers + * @return The map of running searchers + */ + public Map getRunningSearchers() { + return runningSearchers; + } + /** * Utility method to create arrays with a nicer syntax. Seriously, why does Java not just accept {"string"} as parameters?!? * @param array The array values @@ -219,7 +230,7 @@ public class RandomTeleport extends JavaPlugin { return array; } - public boolean sendMessage(List senders, String key, String... replacements) { + public boolean sendMessage(Collection senders, String key, String... replacements) { boolean r = false; for (CommandSender sender : senders) { r |= sendMessage(sender, key, replacements); diff --git a/randomteleport-plugin/src/main/java/de/themoep/randomteleport/RandomTeleportCommand.java b/randomteleport-plugin/src/main/java/de/themoep/randomteleport/RandomTeleportCommand.java index 96d6caf..f725663 100644 --- a/randomteleport-plugin/src/main/java/de/themoep/randomteleport/RandomTeleportCommand.java +++ b/randomteleport-plugin/src/main/java/de/themoep/randomteleport/RandomTeleportCommand.java @@ -18,6 +18,7 @@ package de.themoep.randomteleport; * along with this program. If not, see . */ +import de.themoep.randomteleport.searcher.RandomSearcher; import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.command.BlockCommandSender; @@ -85,6 +86,15 @@ public class RandomTeleportCommand implements CommandExecutor { } else if (plugin.getConfig().getString("presets." + preset) == null) { plugin.sendMessage(sender, "error.preset-doesnt-exist", "preset", preset); } else { + if (sender == target) { + for (RandomSearcher searcher : plugin.getRunningSearchers().values()) { + if (searcher.getTargets().contains(target)) { + plugin.sendMessage(sender, "error.already-searching", "preset", preset); + return; + } + } + } + try { plugin.runPreset(plugin.getServer().getConsoleSender(), preset, target, center); } catch (IllegalArgumentException e) { diff --git a/randomteleport-plugin/src/main/java/de/themoep/randomteleport/listeners/SignListener.java b/randomteleport-plugin/src/main/java/de/themoep/randomteleport/listeners/SignListener.java index e1492fe..129865b 100644 --- a/randomteleport-plugin/src/main/java/de/themoep/randomteleport/listeners/SignListener.java +++ b/randomteleport-plugin/src/main/java/de/themoep/randomteleport/listeners/SignListener.java @@ -19,6 +19,7 @@ package de.themoep.randomteleport.listeners; */ import de.themoep.randomteleport.RandomTeleport; +import de.themoep.randomteleport.searcher.RandomSearcher; import org.bukkit.block.Sign; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; @@ -79,6 +80,13 @@ public class SignListener implements Listener { if (plugin.getConfig().getString("presets." + preset) == null) { plugin.sendMessage(event.getPlayer(), "error.preset-doesnt-exist", "preset", preset); } else { + for (RandomSearcher searcher : plugin.getRunningSearchers().values()) { + if (searcher.getTargets().contains(event.getPlayer())) { + plugin.sendMessage(event.getPlayer(), "error.already-searching", "preset", preset); + return; + } + } + try { plugin.runPreset(plugin.getServer().getConsoleSender(), preset, event.getPlayer(), event.getClickedBlock().getLocation()); } catch (IllegalArgumentException e) { diff --git a/randomteleport-plugin/src/main/java/de/themoep/randomteleport/searcher/RandomSearcher.java b/randomteleport-plugin/src/main/java/de/themoep/randomteleport/searcher/RandomSearcher.java index 134e299..4ee332a 100644 --- a/randomteleport-plugin/src/main/java/de/themoep/randomteleport/searcher/RandomSearcher.java +++ b/randomteleport-plugin/src/main/java/de/themoep/randomteleport/searcher/RandomSearcher.java @@ -28,22 +28,24 @@ import org.bukkit.Location; import org.bukkit.command.CommandSender; import org.bukkit.entity.Entity; -import java.util.ArrayList; +import java.util.Collections; import java.util.LinkedHashMap; -import java.util.List; import java.util.Map; import java.util.Random; +import java.util.Set; +import java.util.UUID; import java.util.concurrent.CompletableFuture; public class RandomSearcher { private final RandomTeleport plugin; private final CommandSender initiator; + private final UUID uniqueId = UUID.randomUUID(); private ValidatorRegistry validators = new ValidatorRegistry(); private Random random = RandomTeleport.RANDOM; - private List targets = new ArrayList<>(); + private Set targets = Collections.newSetFromMap(new LinkedHashMap<>()); private String id = null; private long seed = -1; @@ -72,7 +74,7 @@ public class RandomSearcher { * Get all entities targeted by this searcher * @return The entitiy to target */ - public List getTargets() { + public Set getTargets() { return targets; } @@ -80,6 +82,14 @@ public class RandomSearcher { return validators; } + /** + * Get a ID unique to each searcher + * @return The searcher's version 4 UUID + */ + public UUID getUniqueId() { + return uniqueId; + } + /** * Set the ID of this searcher used for cooldowns. Set to null to use an automatically generated one! * @param id The ID of the searcher @@ -235,8 +245,10 @@ public class RandomSearcher { * @return A CompletableFuture for when the search task is complete */ public CompletableFuture search() { + plugin.getRunningSearchers().put(uniqueId, this); future = new CompletableFuture<>(); plugin.getServer().getScheduler().runTask(plugin, () -> checkRandom(future)); + future.whenComplete((l, e) -> plugin.getRunningSearchers().remove(uniqueId)); return future; } diff --git a/randomteleport-plugin/src/main/resources/languages/lang.en.yml b/randomteleport-plugin/src/main/resources/languages/lang.en.yml index cd48efc..34ddc53 100644 --- a/randomteleport-plugin/src/main/resources/languages/lang.en.yml +++ b/randomteleport-plugin/src/main/resources/languages/lang.en.yml @@ -18,6 +18,7 @@ error: world-not-found: "&cCould not find a world with the name &f{what}&c!" preset-doesnt-exist: "&cThe RandomTeleport preset &6{preset}&c does not exist!" preset-invalid: "&cThe preset &6{preset}&c is not setup correctly! Please contact an admin." + already-searching: "&cA search is already in progress&c!" no-permission: general: "&cYou don't have permission to do that! &o({perm})" preset: "&cYou don't have permission to use the preset &6{preset}&c! &o({perm})"