/* * Copyright (C) 2016 eccentric_nz * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package me.eccentric_nz.TARDIS.commands.remote; import java.util.HashMap; import java.util.UUID; import me.eccentric_nz.TARDIS.TARDIS; import me.eccentric_nz.TARDIS.advanced.TARDISCircuitChecker; import me.eccentric_nz.TARDIS.api.Parameters; import me.eccentric_nz.TARDIS.commands.TARDISCommandHelper; import me.eccentric_nz.TARDIS.commands.tardis.TARDISHideCommand; import me.eccentric_nz.TARDIS.commands.tardis.TARDISRebuildCommand; import me.eccentric_nz.TARDIS.database.QueryFactory; import me.eccentric_nz.TARDIS.database.ResultSetAreas; import me.eccentric_nz.TARDIS.database.ResultSetCurrentLocation; import me.eccentric_nz.TARDIS.database.ResultSetHomeLocation; import me.eccentric_nz.TARDIS.database.ResultSetTardis; import me.eccentric_nz.TARDIS.database.data.Tardis; import me.eccentric_nz.TARDIS.enumeration.DIFFICULTY; import me.eccentric_nz.TARDIS.enumeration.FLAG; import me.eccentric_nz.TARDIS.enumeration.REMOTE; import me.eccentric_nz.TARDIS.travel.TARDISTimeTravel; import me.eccentric_nz.TARDIS.utility.TARDISMessage; import me.eccentric_nz.TARDIS.utility.TARDISNumberParsers; import org.bukkit.ChatColor; import org.bukkit.Location; import org.bukkit.OfflinePlayer; import org.bukkit.World; import org.bukkit.command.BlockCommandSender; import org.bukkit.command.Command; import org.bukkit.command.CommandExecutor; import org.bukkit.command.CommandSender; import org.bukkit.command.ConsoleCommandSender; import org.bukkit.entity.Player; /** * * @author eccentric_nz */ public class TARDISRemoteCommands implements CommandExecutor { private final TARDIS plugin; public TARDISRemoteCommands(TARDIS plugin) { this.plugin = plugin; } @Override @SuppressWarnings("deprecation") public boolean onCommand(final CommandSender sender, Command cmd, String label, String[] args) { // If the player/console typed /tardisremote then do the following... if (cmd.getName().equalsIgnoreCase("tardisremote") && sender.hasPermission("tardis.remote")) { if (args.length < 2) { new TARDISCommandHelper(plugin).getCommand("tardisremote", sender); return true; } UUID oluuid = plugin.getServer().getOfflinePlayer(args[0]).getUniqueId(); if (oluuid != null) { final UUID uuid = oluuid; // check the player has a TARDIS HashMap<String, Object> where = new HashMap<String, Object>(); where.put("uuid", uuid.toString()); ResultSetTardis rs = new ResultSetTardis(plugin, where, "", false, 0); if (rs.resultSet()) { Tardis tardis = rs.getTardis(); // not in siege mode if (plugin.getTrackerKeeper().getInSiegeMode().contains(tardis.getTardis_id())) { TARDISMessage.send(sender, "SIEGE_NO_CMD"); return true; } // we're good to go final int id = tardis.getTardis_id(); boolean chameleon = tardis.isChamele_on(); boolean hidden = tardis.isHidden(); boolean handbrake = tardis.isHandbrake_on(); int level = tardis.getArtron_level(); if (sender instanceof Player && !sender.hasPermission("tardis.admin")) { HashMap<String, Object> wheret = new HashMap<String, Object>(); wheret.put("uuid", ((Player) sender).getUniqueId().toString()); ResultSetTardis rst = new ResultSetTardis(plugin, wheret, "", false, 0); if (!rst.resultSet()) { TARDISMessage.send(sender, "NOT_A_TIMELORD"); return true; } Tardis t = rst.getTardis(); int tardis_id = t.getTardis_id(); if (tardis_id != id) { TARDISMessage.send(sender, "CMD_ONLY_TL_REMOTE"); return true; } if (plugin.getConfig().getBoolean("allow.power_down") && !t.isPowered_on()) { TARDISMessage.send(sender, "POWER_DOWN"); return true; } // must have circuits TARDISCircuitChecker tcc = null; if (!plugin.getDifficulty().equals(DIFFICULTY.EASY)) { tcc = new TARDISCircuitChecker(plugin, id); tcc.getCircuits(); } if (tcc != null && !tcc.hasMaterialisation()) { TARDISMessage.send(sender, "NO_MAT_CIRCUIT"); return true; } } // what are we going to do? try { REMOTE remote = REMOTE.valueOf(args[1].toUpperCase()); OfflinePlayer p = plugin.getServer().getOfflinePlayer(uuid); // we can't get permissions for offline players! if (sender instanceof BlockCommandSender && p.getPlayer() == null) { return true; } switch (remote) { case CHAMELEON: // toggle the chameleon circuit on/off int cham = (chameleon) ? 0 : 1; String onoff = (chameleon) ? plugin.getLanguage().getString("SET_OFF") : plugin.getLanguage().getString("SET_ON"); HashMap<String, Object> setc = new HashMap<String, Object>(); setc.put("chamele_on", cham); HashMap<String, Object> wherec = new HashMap<String, Object>(); wherec.put("tardis_id", id); new QueryFactory(plugin).doUpdate("tardis", setc, wherec); TARDISMessage.send(sender, "CHAM_SET_ON_OFF", onoff); return true; case HIDE: // if it's a non-admin player or command block running the command // check the usual requirements (circuits/energy) - else just do it if ((sender instanceof Player && !sender.hasPermission("tardis.admin")) || sender instanceof BlockCommandSender) { return new TARDISHideCommand(plugin).hide(p); } else { return new TARDISRemoteHideCommand(plugin).doRemoteHide(sender, id); } case REBUILD: // if it's a non-admin player or command block running the command // check the usual requirements (circuits/energy) - else just do it if ((sender instanceof Player && !sender.hasPermission("tardis.admin")) || sender instanceof BlockCommandSender) { return new TARDISRebuildCommand(plugin).rebuildPreset(p); } else { return new TARDISRemoteRebuildCommand(plugin).doRemoteRebuild(sender, id, p, chameleon, hidden); } case COMEHERE: // NOT non-admin players, command blocks or the console if (sender instanceof Player && sender.hasPermission("tardis.admin")) { return new TARDISRemoteComehereCommand(plugin).doRemoteComeHere((Player) sender, uuid); } else { TARDISMessage.send(sender, "NO_PERMS"); return true; } case BACK: // NOT non-admin players or command blocks if ((sender instanceof Player && sender.hasPermission("tardis.admin")) || sender instanceof ConsoleCommandSender) { if (!handbrake) { TARDISMessage.send(sender, "NOT_WHILE_TRAVELLING"); return true; } return new TARDISRemoteBackCommand(plugin).sendBack(sender, id, p); } else { TARDISMessage.send(sender, "NO_PERMS"); return true; } default: // TRAVEL if (args.length < 3) { TARDISMessage.send(sender, "ARG_REMOTE"); return false; } // already travelling if (!handbrake) { TARDISMessage.send(sender, "NOT_WHILE_TRAVELLING"); return true; } // check artron energy if not admin if ((sender instanceof Player && !sender.hasPermission("tardis.admin")) || sender instanceof BlockCommandSender) { int travel = plugin.getArtronConfig().getInt("travel"); if (level < travel) { TARDISMessage.send(sender, "NOT_ENOUGH_ENERGY"); return true; } } // home, area or coords? HashMap<String, Object> set = new HashMap<String, Object>(); if (args[2].toLowerCase().equals("home")) { // get home location HashMap<String, Object> wherehl = new HashMap<String, Object>(); wherehl.put("tardis_id", id); ResultSetHomeLocation rsh = new ResultSetHomeLocation(plugin, wherehl); if (!rsh.resultSet()) { TARDISMessage.send(sender, "HOME_NOT_FOUND"); return true; } set.put("world", rsh.getWorld().getName()); set.put("x", rsh.getX()); set.put("y", rsh.getY()); set.put("z", rsh.getZ()); set.put("direction", rsh.getDirection().toString()); set.put("submarine", (rsh.isSubmarine()) ? 1 : 0); } else if (args[2].toLowerCase().equals("area")) { // check area name HashMap<String, Object> wherea = new HashMap<String, Object>(); wherea.put("area_name", args[3]); ResultSetAreas rsa = new ResultSetAreas(plugin, wherea, false, false); if (!rsa.resultSet()) { TARDISMessage.send(sender, "AREA_NOT_FOUND", ChatColor.GREEN + "/tardis list areas" + ChatColor.RESET); return true; } if ((sender instanceof Player && !sender.hasPermission("tardis.admin")) || sender instanceof BlockCommandSender) { // must use advanced console if difficulty hard if (plugin.getDifficulty().equals(DIFFICULTY.HARD)) { TARDISMessage.send(sender, "ADV_AREA"); return true; } // check permission String perm = "tardis.area." + args[3]; if ((!p.getPlayer().hasPermission(perm) && !p.getPlayer().hasPermission("tardis.area.*"))) { TARDISMessage.send(sender, "TRAVEL_NO_AREA_PERM", args[3]); return true; } } // get a landing spot Location l = plugin.getTardisArea().getNextSpot(rsa.getArea().getAreaName()); // returns null if full! if (l == null) { TARDISMessage.send(sender, "NO_MORE_SPOTS"); return true; } set.put("world", l.getWorld().getName()); set.put("x", l.getBlockX()); set.put("y", l.getBlockY()); set.put("z", l.getBlockZ()); set.put("submarine", 0); } else { // coords if (args.length < 6) { TARDISMessage.send(sender, "ARG_COORDS"); return true; } if ((sender instanceof Player && !sender.hasPermission("tardis.admin")) || sender instanceof BlockCommandSender) { if (!p.getPlayer().hasPermission("tardis.timetravel.location")) { TARDISMessage.send(sender, "NO_PERMS"); return true; } } int x, y, z; World w = plugin.getServer().getWorld(args[2]); if (w == null) { TARDISMessage.send(sender, "WORLD_NOT_FOUND"); return true; } if (!plugin.getConfig().getBoolean("worlds." + w.getName())) { TARDISMessage.send(sender, "NO_WORLD_TRAVEL"); return true; } if (!plugin.getConfig().getBoolean("travel.include_default_world") && plugin.getConfig().getBoolean("creation.default_world") && args[2].equals(plugin.getConfig().getString("creation.default_world_name"))) { TARDISMessage.send(sender, "NO_WORLD_TRAVEL"); return true; } x = TARDISNumberParsers.parseInt(args[args.length - 3]); y = TARDISNumberParsers.parseInt(args[args.length - 2]); if (y == 0) { TARDISMessage.send(sender, "Y_NOT_VALID"); return true; } z = TARDISNumberParsers.parseInt(args[args.length - 1]); Location location = new Location(w, x, y, z); // check location if (!plugin.getTardisArea().areaCheckInExisting(location)) { TARDISMessage.send(sender, "TRAVEL_IN_AREA", ChatColor.AQUA + "/tardisremote [player] travel area [area name]"); return true; } // check respect if not admin if ((sender instanceof Player && !sender.hasPermission("tardis.admin")) || sender instanceof BlockCommandSender) { if (!plugin.getPluginRespect().getRespect(location, new Parameters(p.getPlayer(), FLAG.getDefaultFlags()))) { return true; } } HashMap<String, Object> wherecl = new HashMap<String, Object>(); wherecl.put("tardis_id", id); ResultSetCurrentLocation rsc = new ResultSetCurrentLocation(plugin, wherecl); if (!rsc.resultSet()) { TARDISMessage.send(sender, "CURRENT_NOT_FOUND"); return true; } // check location int[] start_loc = TARDISTimeTravel.getStartLocation(location, rsc.getDirection()); int count = TARDISTimeTravel.safeLocation(start_loc[0], location.getBlockY(), start_loc[2], start_loc[1], start_loc[3], location.getWorld(), rsc.getDirection()); if (count > 0) { TARDISMessage.send(sender, "NOT_SAFE"); return true; } else { set.put("world", location.getWorld().getName()); set.put("x", location.getBlockX()); set.put("y", location.getBlockY()); set.put("z", location.getBlockZ()); set.put("submarine", 0); } } HashMap<String, Object> wheret = new HashMap<String, Object>(); wheret.put("tardis_id", id); new QueryFactory(plugin).doUpdate("next", set, wheret); plugin.getServer().getScheduler().scheduleSyncDelayedTask(plugin, new Runnable() { @Override public void run() { OfflinePlayer player = plugin.getServer().getOfflinePlayer(uuid); String success = (new TARDISRemoteTravelCommand(plugin).doTravel(id, player, sender)) ? plugin.getLanguage().getString("SUCCESS_Y") : plugin.getLanguage().getString("SUCCESS_N"); TARDISMessage.send(sender, "REMOTE_SUCCESS", success); } }, 5L); return true; } } catch (IllegalArgumentException e) { TARDISMessage.send(sender, "CMD_NOT_VALID"); return false; } } } else { TARDISMessage.send(sender, "UUID"); return true; } } return false; } private void sendMessage(CommandSender sender, String message) { if (sender instanceof BlockCommandSender) { return; } sender.sendMessage(message); } }