package me.totalfreedom.totalfreedommod.command; import io.papermc.lib.PaperLib; import java.util.Arrays; import java.util.Collections; import java.util.List; import me.totalfreedom.totalfreedommod.rank.Rank; import me.totalfreedom.totalfreedommod.world.WorldTime; import me.totalfreedom.totalfreedommod.world.WorldWeather; import org.bukkit.World; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; @CommandPermissions(level = Rank.OP, source = SourceType.BOTH) @CommandParameters(description = "Allows for master builders to configure the time, the weather of the MasterBuilder, and allows for players to go to the MasterBuilderWorld.", usage = "/ [time | weather ]", aliases = "mbw,mbworld") public class Command_masterbuilderworld extends FreedomCommand { @Override public boolean run(CommandSender sender, Player playerSender, Command cmd, String commandLabel, String[] args, boolean senderIsConsole) { CommandMode commandMode = null; if (args.length == 0) { commandMode = CommandMode.TELEPORT; } else if (args.length >= 2) { if ("time".equalsIgnoreCase(args[0])) { commandMode = CommandMode.TIME; } else if ("weather".equalsIgnoreCase(args[0])) { commandMode = CommandMode.WEATHER; } } if (commandMode == null) { return false; } try { switch (commandMode) { case TELEPORT: { if (!(sender instanceof Player) || playerSender == null) { return false; } World masterBuilderWorld = null; try { masterBuilderWorld = plugin.wm.masterBuilderWorld.getWorld(); } catch (Exception ignored) { } if (masterBuilderWorld == null || playerSender.getWorld() == masterBuilderWorld) { msg("Going to the main world."); PaperLib.teleportAsync(playerSender, server.getWorlds().get(0).getSpawnLocation()); } else { msg("Going to the Master Builder world"); plugin.wm.masterBuilderWorld.sendToWorld(playerSender); } break; } case TIME: { assertCommandPerms(sender, playerSender); if (args.length == 2) { WorldTime timeOfDay = WorldTime.getByAlias(args[1]); if (timeOfDay != null) { plugin.wm.masterBuilderWorld.setTimeOfDay(timeOfDay); msg("MasterBuilder world time set to: " + timeOfDay.name()); } else { msg("Invalid time of day. Can be: sunrise, noon, sunset, midnight"); } } else { return false; } break; } case WEATHER: { assertCommandPerms(sender, playerSender); if (args.length == 2) { WorldWeather weatherMode = WorldWeather.getByAlias(args[1]); if (weatherMode != null) { plugin.wm.masterBuilderWorld.setWeatherMode(weatherMode); msg("MasterBuilder world weather set to: " + weatherMode.name()); } else { msg("Invalid weather mode. Can be: off, rain, storm"); } } else { return false; } break; } default: { return false; } } } catch (PermissionDeniedException ex) { if (ex.getMessage().isEmpty()) { return noPerms(); } msg(ex.getMessage()); return true; } return true; } @Override public List getTabCompleteOptions(CommandSender sender, Command command, String alias, String[] args) { if (!plugin.al.isAdmin(sender)) { return Collections.emptyList(); } if (args.length == 1) { return Arrays.asList("time", "weather"); } else if (args.length == 2) { if (args[0].equals("time")) { return Arrays.asList("morning", "noon", "evening", "night"); } else if (args[0].equals("weather")) { return Arrays.asList("off", "rain", "storm"); } } return Collections.emptyList(); } // TODO: Redo this properly private void assertCommandPerms(CommandSender sender, Player playerSender) throws PermissionDeniedException { if (!(sender instanceof Player) || playerSender == null || !plugin.al.isAdmin(playerSender)) { throw new PermissionDeniedException(); } } private enum CommandMode { TELEPORT, TIME, WEATHER } private static class PermissionDeniedException extends Exception { private static final long serialVersionUID = 1L; private PermissionDeniedException() { super(""); } private PermissionDeniedException(String string) { super(string); } } }