diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandessentials.java b/Essentials/src/com/earth2me/essentials/commands/Commandessentials.java index a680e3900..915f8a6da 100644 --- a/Essentials/src/com/earth2me/essentials/commands/Commandessentials.java +++ b/Essentials/src/com/earth2me/essentials/commands/Commandessentials.java @@ -6,96 +6,144 @@ import com.earth2me.essentials.User; import com.earth2me.essentials.UserMap; import com.earth2me.essentials.utils.*; import com.google.common.base.Charsets; +import com.google.common.collect.ImmutableMap; import com.google.common.collect.Lists; -import org.bukkit.Material; import org.bukkit.Server; import org.bukkit.Sound; -import org.bukkit.block.Block; import org.bukkit.entity.Player; import org.bukkit.plugin.Plugin; import org.bukkit.plugin.PluginDescriptionFile; import org.bukkit.plugin.PluginManager; +import org.bukkit.scheduler.BukkitRunnable; import java.util.*; +import java.util.function.Supplier; import static com.earth2me.essentials.I18n.tl; // This command has 4 undocumented behaviours #EasterEgg public class Commandessentials extends EssentialsCommand { - private final Sound NOTE_HARP = EnumUtil.valueOf(Sound.class, "BLOCK_NOTE_BLOCK_HARP", "BLOCK_NOTE_HARP", "NOTE_PIANO"); + private static final Sound NOTE_HARP = EnumUtil.valueOf(Sound.class, "BLOCK_NOTE_BLOCK_HARP", "BLOCK_NOTE_HARP", "NOTE_PIANO"); + private static final Sound MOO_SOUND = EnumUtil.valueOf(Sound.class, "COW_IDLE", "ENTITY_COW_MILK"); + + private static final String NYAN_TUNE = "1D#,1E,2F#,,2A#,1E,1D#,1E,2F#,2B,2D#,2E,2D#,2A#,2B,,2F#,,1D#,1E,2F#,2B,2C#,2A#,2B,2C#,2E,2D#,2E,2C#,,2F#,,2G#,,1D,1D#,,1C#,1D,1C#,1B,,1B,,1C#,,1D,,1D,1C#,1B,1C#,1D#,2F#,2G#,1D#,2F#,1C#,1D#,1B,1C#,1B,1D#,,2F#,,2G#,1D#,2F#,1C#,1D#,1B,1D,1D#,1D,1C#,1B,1C#,1D,,1B,1C#,1D#,2F#,1C#,1D,1C#,1B,1C#,,1B,,1C#,,2F#,,2G#,,1D,1D#,,1C#,1D,1C#,1B,,1B,,1C#,,1D,,1D,1C#,1B,1C#,1D#,2F#,2G#,1D#,2F#,1C#,1D#,1B,1C#,1B,1D#,,2F#,,2G#,1D#,2F#,1C#,1D#,1B,1D,1D#,1D,1C#,1B,1C#,1D,,1B,1C#,1D#,2F#,1C#,1D,1C#,1B,1C#,,1B,,1B,,1B,,1F#,1G#,1B,,1F#,1G#,1B,1C#,1D#,1B,1E,1D#,1E,2F#,1B,,1B,,1F#,1G#,1B,1E,1D#,1C#,1B,,,,1F#,1B,,1F#,1G#,1B,,1F#,1G#,1B,1B,1C#,1D#,1B,1F#,1G#,1F#,1B,,1B,1A#,1B,1F#,1G#,1B,1E,1D#,1E,2F#,1B,,1A#,,1B,,1F#,1G#,1B,,1F#,1G#,1B,1C#,1D#,1B,1E,1D#,1E,2F#,1B,,1B,,1F#,1G#,1B,1F#,1E,1D#,1C#,1B,,,,1F#,1B,,1F#,1G#,1B,,1F#,1G#,1B,1B,1C#,1D#,1B,1F#,1G#,1F#,1B,,1B,1A#,1B,1F#,1G#,1B,1E,1D#,1E,2F#,1B,,1A#,,1B,,1F#,1G#,1B,,1F#,1G#,1B,1C#,1D#,1B,1E,1D#,1E,2F#,1B,,1B,,1F#,1G#,1B,1F#,1E,1D#,1C#,1B,,,,1F#,1B,,1F#,1G#,1B,,1F#,1G#,1B,1B,1C#,1D#,1B,1F#,1G#,1F#,1B,,1B,1A#,1B,1F#,1G#,1B,1E,1D#,1E,2F#,1B,,1A#,,1B,,1F#,1G#,1B,,1F#,1G#,1B,1C#,1D#,1B,1E,1D#,1E,2F#,1B,,1B,,1F#,1G#,1B,1F#,1E,1D#,1C#,1B,,,,1F#,1B,,1F#,1G#,1B,,1F#,1G#,1B,1B,1C#,1D#,1B,1F#,1G#,1F#,1B,,1B,1A#,1B,1F#,1G#,1B,1E,1D#,1E,2F#,1B,,1A#,,1B,,1F#,1G#,1B,,1F#,1G#,1B,1C#,1D#,1B,1E,1D#,1E,2F#,1B,,1B,,1F#,1G#,1B,1F#,1E,1D#,1C#,1B,,,,1F#,1B,,1F#,1G#,1B,,1F#,1G#,1B,1B,1C#,1D#,1B,1F#,1G#,1F#,1B,,1B,1A#,1B,1F#,1G#,1B,1E,1D#,1E,2F#,1B,,1B,,"; + private static final String[] CONSOLE_MOO = new String[]{" (__)", " (oo)", " /------\\/", " / | ||", " * /\\---/\\", " ~~ ~~", "....\"Have you mooed today?\"..."}; + private static final String[] PLAYER_MOO = new String[]{" (__)", " (oo)", " /------\\/", " / | | |", " * /\\---/\\", " ~~ ~~", "....\"Have you mooed today?\"..."}; public Commandessentials() { super("essentials"); } - private transient int taskid; - private final transient Map noteBlocks = new HashMap(); + private transient TuneRunnable currentTune = null; - private final List versionPlugins = Arrays.asList( - "Vault", - "LuckPerms", - "PermissionsEx", - "GroupManager" + private static final List versionPlugins = Arrays.asList( + "Vault", // API + "Reserve", // API + "PlaceholderAPI", // API + "CMI", // potential for issues + "Towny", // past issues; admins should ensure latest + "ChestShop", // past issues; admins should ensure latest + "Citizens", // fires player events + "LuckPerms", // permissions (recommended) + "UltraPermissions", + "PermissionsEx", // permissions (unsupported) + "GroupManager", // permissions (unsupported) + "bPermissions" // permissions (unsupported) ); - private final List officialPlugins = Arrays.asList( - "EssentialsAntiBuild", - "EssentialsChat", - "EssentialsGeoIP", - "EssentialsProtect", - "EssentialsSpawn", - "EssentialsXMPP" + private static final List officialPlugins = Arrays.asList( + "EssentialsAntiBuild", + "EssentialsChat", + "EssentialsGeoIP", + "EssentialsProtect", + "EssentialsSpawn", + "EssentialsXMPP" ); - private final List warnPlugins = Arrays.asList( - "PermissionsEx", - "GroupManager" + private static final List warnPlugins = Arrays.asList( + "PermissionsEx", + "GroupManager", + "bPremissions" ); @Override public void run(final Server server, final CommandSource sender, final String commandLabel, final String[] args) throws Exception { if (args.length == 0) { - run_disabled(server, sender, commandLabel, args); - } else if (args[0].equalsIgnoreCase("debug")) { - run_debug(server, sender, commandLabel, args); - } else if (args[0].equalsIgnoreCase("nya")) { - run_nya(server, sender, commandLabel, args); - } else if (args[0].equalsIgnoreCase("moo")) { - run_moo(server, sender, commandLabel, args); - } else if (args[0].equalsIgnoreCase("reset")) { - run_reset(server, sender, commandLabel, args); - } else if (args[0].equalsIgnoreCase("cleanup")) { - run_cleanup(server, sender, commandLabel, args); - } else if (args[0].equalsIgnoreCase("uuidconvert")) { - run_uuidconvert(server, sender, commandLabel, args); - } else if (args[0].equalsIgnoreCase("uuidtest")) { - run_uuidtest(server, sender, commandLabel, args); - } else if (args[0].equalsIgnoreCase("version")) { - run_version(server, sender, commandLabel, args); - } else { - run_reload(server, sender, commandLabel, args); + showUsage(sender); + } + + switch(args[0]) { + // Info commands + case "debug": + case "verbose": + runDebug(server, sender, commandLabel, args); + break; + + case "ver": + case "version": + runVersion(server, sender, commandLabel, args); + break; + + case "cmd": + case "commands": + runCommands(server, sender, commandLabel, args); + break; + + // Data commands + case "reload": + runReload(server, sender, commandLabel, args); + break; + case "reset": + runReset(server, sender, commandLabel, args); + break; + case "cleanup": + runCleanup(server, sender, commandLabel, args); + break; + case "uuidconvert": + runUUIDConvert(server, sender, commandLabel, args); + break; + case "uuidtest": + runUUIDTest(server, sender, commandLabel, args); + break; + + // "#EasterEgg" + case "nya": + case "nyan": + runNya(server, sender, commandLabel, args); + break; + case "moo": + runMoo(server, sender, commandLabel, args); + break; + default: + showUsage(sender); } } - //If you do not supply an argument this command will list 'overridden' commands. - private void run_disabled(final Server server, final CommandSource sender, final String commandLabel, final String[] args) throws Exception { - sender.sendMessage("/ "); + // Displays the command's usage. + private void showUsage(final CommandSource sender) throws Exception { + throw new NotEnoughArgumentsException("/ "); + } + // Lists commands that are being handed over to other plugins. + private void runCommands(final Server server, final CommandSource sender, final String commandLabel, final String[] args) { final StringBuilder disabledCommands = new StringBuilder(); for (Map.Entry entry : ess.getAlternativeCommandsHandler().disabledCommands().entrySet()) { if (disabledCommands.length() > 0) { - disabledCommands.append(", "); + disabledCommands.append("\n"); } disabledCommands.append(entry.getKey()).append(" => ").append(entry.getValue()); } if (disabledCommands.length() > 0) { sender.sendMessage(tl("blockList")); sender.sendMessage(disabledCommands.toString()); + } else { + sender.sendMessage(tl("blockListEmpty")); } } - private void run_reset(final Server server, final CommandSource sender, final String commandLabel, final String[] args) throws Exception { + // Resets the given player's user data. + private void runReset(final Server server, final CommandSource sender, final String commandLabel, final String[] args) throws Exception { if (args.length < 2) { throw new Exception("/ reset "); } @@ -104,108 +152,59 @@ public class Commandessentials extends EssentialsCommand { sender.sendMessage("Reset Essentials userdata for player: " + user.getDisplayName()); } - private void run_debug(final Server server, final CommandSource sender, final String commandLabel, final String[] args) throws Exception { + // Toggles debug mode. + private void runDebug(final Server server, final CommandSource sender, final String commandLabel, final String[] args) throws Exception { ess.getSettings().setDebug(!ess.getSettings().isDebug()); sender.sendMessage("Essentials " + ess.getDescription().getVersion() + " debug mode " + (ess.getSettings().isDebug() ? "enabled" : "disabled")); } - private void run_reload(final Server server, final CommandSource sender, final String commandLabel, final String[] args) throws Exception { + // Reloads all reloadable configs. + private void runReload(final Server server, final CommandSource sender, final String commandLabel, final String[] args) throws Exception { ess.reload(); sender.sendMessage(tl("essentialsReload", ess.getDescription().getVersion())); } - private void run_nya(final Server server, final CommandSource sender, final String commandLabel, final String[] args) throws Exception { - final Map noteMap = new HashMap(); - noteMap.put("1F#", 0.5f); - noteMap.put("1G", 0.53f); - noteMap.put("1G#", 0.56f); - noteMap.put("1A", 0.6f); - noteMap.put("1A#", 0.63f); - noteMap.put("1B", 0.67f); - noteMap.put("1C", 0.7f); - noteMap.put("1C#", 0.76f); - noteMap.put("1D", 0.8f); - noteMap.put("1D#", 0.84f); - noteMap.put("1E", 0.9f); - noteMap.put("1F", 0.94f); - noteMap.put("2F#", 1.0f); - noteMap.put("2G", 1.06f); - noteMap.put("2G#", 1.12f); - noteMap.put("2A", 1.18f); - noteMap.put("2A#", 1.26f); - noteMap.put("2B", 1.34f); - noteMap.put("2C", 1.42f); - noteMap.put("2C#", 1.5f); - noteMap.put("2D", 1.6f); - noteMap.put("2D#", 1.68f); - noteMap.put("2E", 1.78f); - noteMap.put("2F", 1.88f); - final String tuneStr = "1D#,1E,2F#,,2A#,1E,1D#,1E,2F#,2B,2D#,2E,2D#,2A#,2B,,2F#,,1D#,1E,2F#,2B,2C#,2A#,2B,2C#,2E,2D#,2E,2C#,,2F#,,2G#,,1D,1D#,,1C#,1D,1C#,1B,,1B,,1C#,,1D,,1D,1C#,1B,1C#,1D#,2F#,2G#,1D#,2F#,1C#,1D#,1B,1C#,1B,1D#,,2F#,,2G#,1D#,2F#,1C#,1D#,1B,1D,1D#,1D,1C#,1B,1C#,1D,,1B,1C#,1D#,2F#,1C#,1D,1C#,1B,1C#,,1B,,1C#,,2F#,,2G#,,1D,1D#,,1C#,1D,1C#,1B,,1B,,1C#,,1D,,1D,1C#,1B,1C#,1D#,2F#,2G#,1D#,2F#,1C#,1D#,1B,1C#,1B,1D#,,2F#,,2G#,1D#,2F#,1C#,1D#,1B,1D,1D#,1D,1C#,1B,1C#,1D,,1B,1C#,1D#,2F#,1C#,1D,1C#,1B,1C#,,1B,,1B,,1B,,1F#,1G#,1B,,1F#,1G#,1B,1C#,1D#,1B,1E,1D#,1E,2F#,1B,,1B,,1F#,1G#,1B,1E,1D#,1C#,1B,,,,1F#,1B,,1F#,1G#,1B,,1F#,1G#,1B,1B,1C#,1D#,1B,1F#,1G#,1F#,1B,,1B,1A#,1B,1F#,1G#,1B,1E,1D#,1E,2F#,1B,,1A#,,1B,,1F#,1G#,1B,,1F#,1G#,1B,1C#,1D#,1B,1E,1D#,1E,2F#,1B,,1B,,1F#,1G#,1B,1F#,1E,1D#,1C#,1B,,,,1F#,1B,,1F#,1G#,1B,,1F#,1G#,1B,1B,1C#,1D#,1B,1F#,1G#,1F#,1B,,1B,1A#,1B,1F#,1G#,1B,1E,1D#,1E,2F#,1B,,1A#,,1B,,1F#,1G#,1B,,1F#,1G#,1B,1C#,1D#,1B,1E,1D#,1E,2F#,1B,,1B,,1F#,1G#,1B,1F#,1E,1D#,1C#,1B,,,,1F#,1B,,1F#,1G#,1B,,1F#,1G#,1B,1B,1C#,1D#,1B,1F#,1G#,1F#,1B,,1B,1A#,1B,1F#,1G#,1B,1E,1D#,1E,2F#,1B,,1A#,,1B,,1F#,1G#,1B,,1F#,1G#,1B,1C#,1D#,1B,1E,1D#,1E,2F#,1B,,1B,,1F#,1G#,1B,1F#,1E,1D#,1C#,1B,,,,1F#,1B,,1F#,1G#,1B,,1F#,1G#,1B,1B,1C#,1D#,1B,1F#,1G#,1F#,1B,,1B,1A#,1B,1F#,1G#,1B,1E,1D#,1E,2F#,1B,,1A#,,1B,,1F#,1G#,1B,,1F#,1G#,1B,1C#,1D#,1B,1E,1D#,1E,2F#,1B,,1B,,1F#,1G#,1B,1F#,1E,1D#,1C#,1B,,,,1F#,1B,,1F#,1G#,1B,,1F#,1G#,1B,1B,1C#,1D#,1B,1F#,1G#,1F#,1B,,1B,1A#,1B,1F#,1G#,1B,1E,1D#,1E,2F#,1B,,1B,,"; - final String[] tune = tuneStr.split(","); - taskid = ess.scheduleSyncRepeatingTask(new Runnable() { - int i = 0; - - @Override - public void run() { - final String note = tune[i]; - i++; - if (i >= tune.length) { - Commandessentials.this.stopTune(); - } - if (note == null || note.isEmpty()) { - return; - } - - for (Player onlinePlayer : ess.getOnlinePlayers()) { - onlinePlayer.playSound(onlinePlayer.getLocation(), NOTE_HARP, 1, noteMap.get(note)); - } - } - }, 20, 2); - } - - private void stopTune() { - ess.getScheduler().cancelTask(taskid); - for (Block block : noteBlocks.values()) { - if (block.getType() == Material.NOTE_BLOCK) { - block.setType(Material.AIR); - } + // Pop tarts. + private void runNya(final Server server, final CommandSource sender, final String commandLabel, final String[] args) throws Exception { + if (currentTune != null) { + currentTune.cancel(); } - noteBlocks.clear(); + + currentTune = new TuneRunnable(NYAN_TUNE, NOTE_HARP, ess::getOnlinePlayers); + currentTune.runTaskTimer(ess, 20, 2); } - private final String[] consoleMoo = new String[]{" (__)", " (oo)", " /------\\/", " / | ||", " * /\\---/\\", " ~~ ~~", "....\"Have you mooed today?\"..."}; - private final String[] playerMoo = new String[]{" (__)", " (oo)", " /------\\/", " / | | |", " * /\\---/\\", " ~~ ~~", "....\"Have you mooed today?\"..."}; - - private void run_moo(final Server server, final CommandSource sender, final String command, final String args[]) { - Sound moo = EnumUtil.valueOf(Sound.class, "COW_IDLE", "ENTITY_COW_MILK"); - + // Cow farts. + private void runMoo(final Server server, final CommandSource sender, final String command, final String args[]) { if (args.length == 2 && args[1].equals("moo")) { - for (String s : consoleMoo) { + for (String s : CONSOLE_MOO) { logger.info(s); } for (Player player : ess.getOnlinePlayers()) { - player.sendMessage(playerMoo); - player.playSound(player.getLocation(), moo, 1, 1.0f); + player.sendMessage(PLAYER_MOO); + player.playSound(player.getLocation(), MOO_SOUND, 1, 1.0f); } } else { if (sender.isPlayer()) { - sender.getSender().sendMessage(playerMoo); + sender.getSender().sendMessage(PLAYER_MOO); final Player player = sender.getPlayer(); - player.playSound(player.getLocation(), moo, 1, 1.0f); + player.playSound(player.getLocation(), MOO_SOUND, 1, 1.0f); } else { - sender.getSender().sendMessage(consoleMoo); + sender.getSender().sendMessage(CONSOLE_MOO); } } } - private void run_cleanup(final Server server, final CommandSource sender, final String command, final String args[]) throws Exception { + // Cleans up inactive users. + private void runCleanup(final Server server, final CommandSource sender, final String command, final String args[]) throws Exception { if (args.length < 2 || !NumberUtil.isInt(args[1])) { - sender.sendMessage("This sub-command will delete users who havent logged in in the last days."); - sender.sendMessage("Optional parameters define the minium amount required to prevent deletion."); - sender.sendMessage("Unless you define larger default values, this command wil ignore people who have more than 0 money/homes."); + sender.sendMessage("This sub-command will delete users who haven't logged in in the last days."); + sender.sendMessage("Optional parameters define the minimum amount required to prevent deletion."); + sender.sendMessage("Unless you define larger default values, this command will ignore people who have more than 0 money/homes."); throw new Exception("/ cleanup [money] [homes]"); } + sender.sendMessage(tl("cleaning")); final long daysArg = Long.parseLong(args[1]); @@ -213,59 +212,58 @@ public class Commandessentials extends EssentialsCommand { final int homesArg = args.length >= 4 && NumberUtil.isInt(args[3]) ? Integer.parseInt(args[3]) : 0; final UserMap userMap = ess.getUserMap(); - ess.runTaskAsynchronously(new Runnable() { - @Override - public void run() { - Long currTime = System.currentTimeMillis(); - for (UUID u : userMap.getAllUniqueUsers()) { - final User user = ess.getUserMap().getUser(u); - if (user == null) { - continue; - } - - long lastLog = user.getLastLogout(); - if (lastLog == 0) { - lastLog = user.getLastLogin(); - } - if (lastLog == 0) { - user.setLastLogin(currTime); - } - - if (user.isNPC()) { - continue; - } - - long timeDiff = currTime - lastLog; - long milliDays = daysArg * 24L * 60L * 60L * 1000L; - int homeCount = user.getHomes().size(); - double moneyCount = user.getMoney().doubleValue(); - - if ((lastLog == 0) || (timeDiff < milliDays) || (homeCount > homesArg) || (moneyCount > moneyArg)) { - continue; - } - - if (ess.getSettings().isDebug()) { - ess.getLogger().info("Deleting user: " + user.getName() + " Money: " + moneyCount + " Homes: " + homeCount + " Last seen: " + DateUtil.formatDateDiff(lastLog)); - } - - user.reset(); + ess.runTaskAsynchronously(() -> { + Long currTime = System.currentTimeMillis(); + for (UUID u : userMap.getAllUniqueUsers()) { + final User user = ess.getUserMap().getUser(u); + if (user == null) { + continue; } - sender.sendMessage(tl("cleaned")); + + long lastLog = user.getLastLogout(); + if (lastLog == 0) { + lastLog = user.getLastLogin(); + } + if (lastLog == 0) { + user.setLastLogin(currTime); + } + + if (user.isNPC()) { + continue; + } + + long timeDiff = currTime - lastLog; + long milliDays = daysArg * 24L * 60L * 60L * 1000L; + int homeCount = user.getHomes().size(); + double moneyCount = user.getMoney().doubleValue(); + + if ((lastLog == 0) || (timeDiff < milliDays) || (homeCount > homesArg) || (moneyCount > moneyArg)) { + continue; + } + + if (ess.getSettings().isDebug()) { + ess.getLogger().info("Deleting user: " + user.getName() + " Money: " + moneyCount + " Homes: " + homeCount + " Last seen: " + DateUtil.formatDateDiff(lastLog)); + } + + user.reset(); } + sender.sendMessage(tl("cleaned")); }); } - private void run_uuidconvert(final Server server, final CommandSource sender, final String commandLabel, final String[] args) throws Exception { - sender.sendMessage("Starting Essentials UUID userdata conversion, this may lag the server."); + // Forces a rerun of userdata UUID conversion. + private void runUUIDConvert(final Server server, final CommandSource sender, final String commandLabel, final String[] args) throws Exception { + sender.sendMessage("Starting Essentials UUID userdata conversion; this may lag the server."); Boolean ignoreUFCache = (args.length > 2 && args[1].toLowerCase(Locale.ENGLISH).contains("ignore")); EssentialsUpgrade.uuidFileConvert(ess, ignoreUFCache); - sender.sendMessage("UUID conversion complete, check your server log for more information."); + sender.sendMessage("UUID conversion complete. Check your server log for more information."); } - private void run_uuidtest(final Server server, final CommandSource sender, final String commandLabel, final String[] args) throws Exception { + // Looks up various UUIDs for a user. + private void runUUIDTest(final Server server, final CommandSource sender, final String commandLabel, final String[] args) throws Exception { if (args.length < 2) { throw new Exception("/ uuidtest "); } @@ -302,7 +300,8 @@ public class Commandessentials extends EssentialsCommand { sender.sendMessage("Offline Mode UUID: " + offlineuuid.toString()); } - private void run_version(final Server server, final CommandSource sender, final String commandLabel, final String[] args) throws Exception { + // Displays versions of EssentialsX and related plugins. + private void runVersion(final Server server, final CommandSource sender, final String commandLabel, final String[] args) throws Exception { if (sender.isPlayer() && !ess.getUser(sender.getPlayer()).isAuthorized("essentials.version")) return; boolean isMismatched = false; @@ -369,47 +368,101 @@ public class Commandessentials extends EssentialsCommand { protected List getTabCompleteOptions(final Server server, final CommandSource sender, final String commandLabel, final String[] args) { if (args.length == 1) { List options = Lists.newArrayList(); - options.add("reload"); options.add("debug"); - //options.add("nya"); - //options.add("moo"); + options.add("commands"); + options.add("version"); + options.add("reload"); options.add("reset"); options.add("cleanup"); //options.add("uuidconvert"); //options.add("uuidtest"); - options.add("version"); + //options.add("nya"); + //options.add("moo"); return options; - } else if (args[0].equalsIgnoreCase("debug")) { - // No args - } else if (args[0].equalsIgnoreCase("nya")) { - // No args - } else if (args[0].equalsIgnoreCase("moo")) { - if (args.length == 2) { - return Lists.newArrayList("moo"); - } - } else if (args[0].equalsIgnoreCase("reset")) { - if (args.length == 2) { - return getPlayers(server, sender); - } - } else if (args[0].equalsIgnoreCase("cleanup")) { - if (args.length == 2) { - return COMMON_DURATIONS; - } else if (args.length == 3 || args.length == 4) { - return Lists.newArrayList("-1", "0"); - } - } else if (args[0].equalsIgnoreCase("uuidconvert")) { - if (args.length == 2) { - return Lists.newArrayList("ignoreUFCache"); - } - } else if (args[0].equalsIgnoreCase("uuidtest")) { - if (args.length == 2) { - return getPlayers(server, sender); - } - } else if (args[0].equalsIgnoreCase("version")) { - // No args - } else { - // No args } + + switch (args[0]) { + case "moo": + if (args.length == 2) { + return Lists.newArrayList("moo"); + } + break; + case "reset": + case "uuidtest": + if (args.length == 2) { + return getPlayers(server, sender); + } + break; + case "cleanup": + if (args.length == 2) { + return COMMON_DURATIONS; + } else if (args.length == 3 || args.length == 4) { + return Lists.newArrayList("-1", "0"); + } + break; + case "uuidconvert": + if (args.length == 2) { + return Lists.newArrayList("ignoreUFCache"); + } + break; + } + return Collections.emptyList(); } + + private static class TuneRunnable extends BukkitRunnable { + private static final Map noteMap = ImmutableMap.builder() + .put("1F#", 0.5f) + .put("1G", 0.53f) + .put("1G#", 0.56f) + .put("1A", 0.6f) + .put("1A#", 0.63f) + .put("1B", 0.67f) + .put("1C", 0.7f) + .put("1C#", 0.76f) + .put("1D", 0.8f) + .put("1D#", 0.84f) + .put("1E", 0.9f) + .put("1F", 0.94f) + .put("2F#", 1.0f) + .put("2G", 1.06f) + .put("2G#", 1.12f) + .put("2A", 1.18f) + .put("2A#", 1.26f) + .put("2B", 1.34f) + .put("2C", 1.42f) + .put("2C#", 1.5f) + .put("2D", 1.6f) + .put("2D#", 1.68f) + .put("2E", 1.78f) + .put("2F", 1.88f) + .build(); + + private final String[] tune; + private final Sound sound; + private final Supplier> players; + private int i = 0; + + TuneRunnable(final String tuneStr, final Sound sound, final Supplier> players) { + this.tune = tuneStr.split(","); + this.sound = sound; + this.players = players; + } + + @Override + public void run() { + final String note = tune[i]; + i++; + if (i >= tune.length) { + cancel(); + } + if (note == null || note.isEmpty()) { + return; + } + + for (Player onlinePlayer : players.get()) { + onlinePlayer.playSound(onlinePlayer.getLocation(), sound, 1, noteMap.get(note)); + } + } + } } diff --git a/Essentials/src/messages.properties b/Essentials/src/messages.properties index 025bbac02..84f3207f0 100644 --- a/Essentials/src/messages.properties +++ b/Essentials/src/messages.properties @@ -42,7 +42,8 @@ bedNull=\u00a7mbed\u00a7r bedSet=\u00a76Bed spawn set\! bigTreeFailure=\u00a74Big tree generation failure. Try again on grass or dirt. bigTreeSuccess=\u00a76Big tree spawned. -blockList=\u00a76Essentials relayed the following commands to another plugin\: +blockList=\u00a76EssentialsX is relaying the following commands to other plugins\: +blockListEmpty=\u00a76EssentialsX is not relaying any commands to other plugins. bookAuthorSet=\u00a76Author of the book set to {0}. bookLocked=\u00a76This book is now locked. bookTitleSet=\u00a76Title of the book set to {0}.