/* * CommandBook * Copyright (C) 2011 sk89q <http://www.sk89q.com> * * 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 com.sk89q.commandbook.locations; import com.google.common.collect.Lists; import com.sk89q.commandbook.CommandBook; import com.sk89q.commandbook.commands.PaginatedResult; import com.sk89q.commandbook.session.SessionComponent; import com.sk89q.commandbook.session.UserSession; import com.sk89q.commandbook.util.InputUtil; import com.sk89q.commandbook.util.entity.player.PlayerUtil; import com.sk89q.commandbook.util.entity.player.iterators.TeleportPlayerIterator; import com.sk89q.minecraft.util.commands.*; import com.zachsthings.libcomponents.ComponentInformation; import com.zachsthings.libcomponents.InjectComponent; import org.bukkit.ChatColor; import org.bukkit.Location; import org.bukkit.World; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; @ComponentInformation(friendlyName = "Warps", desc = "Provides warps functionality") public class WarpsComponent extends LocationsComponent { @InjectComponent private SessionComponent sessions; public WarpsComponent() { super("Warp"); } public void enable() { super.enable(); registerCommands(Commands.class); } public class Commands { @Command(aliases = {"warp"}, usage = "[world] [target] <warp>", desc = "Teleport to a warp", flags = "s", min = 1, max = 3) public void warp(CommandContext args, CommandSender sender) throws CommandException { Iterable<Player> targets = null; NamedLocation warp = null; Location loc; // Detect arguments based on the number of arguments provided if (args.argsLength() == 1) { Player player = PlayerUtil.checkPlayer(sender); targets = Lists.newArrayList(player); warp = getManager().get(player.getWorld(), args.getString(0)); } else if (args.argsLength() == 2) { targets = InputUtil.PlayerParser.matchPlayers(sender, args.getString(0)); if (getManager().isPerWorld()) { Player player = PlayerUtil.checkPlayer(sender); warp = getManager().get(player.getWorld(), args.getString(1)); } else { warp = getManager().get(null, args.getString(1)); } } else if (args.argsLength() == 3) { targets = InputUtil.PlayerParser.matchPlayers(sender, args.getString(1)); warp = getManager().get( InputUtil.LocationParser.matchWorld(sender, args.getString(0)), args.getString(2)); } // Check permissions! for (Player target : targets) { if (target != sender) { CommandBook.inst().checkPermission(sender, "commandbook.warp.teleport.other"); break; } } if (warp != null) { try { CommandBook.inst().checkPermission(sender, "commandbook.warp.teleport"); } catch (CommandPermissionsException e) { CommandBook.inst().checkPermission(sender, "commandbook.warp.warp." + warp.getName()); } loc = warp.getLocation(); } else { throw new CommandException("A warp by the given name does not exist."); } (new TeleportPlayerIterator(sender, loc, args.hasFlag('s'))).iterate(targets); } @Command(aliases = {"setwarp"}, usage = "<warp> [location]", desc = "Set a warp", min = 1, max = 2) @CommandPermissions({"commandbook.warp.set"}) public void setWarp(CommandContext args, CommandSender sender) throws CommandException { String warpName = args.getString(0); Location loc; Player player = null; // Detect arguments based on the number of arguments provided if (args.argsLength() == 1) { player = PlayerUtil.checkPlayer(sender); loc = player.getLocation(); } else { loc = InputUtil.LocationParser.matchLocation(sender, args.getString(1)); if (sender instanceof Player) { player = (Player) sender; } } NamedLocation existing = getManager().get(loc.getWorld(), warpName); if (existing != null) { if (!existing.getCreatorName().equals(sender.getName())) { CommandBook.inst().checkPermission(sender, "commandbook.warp.set.override"); } if (!sessions.getSession(UserSession.class, sender).checkOrQueueConfirmed(args.getCommand() + " " + args.getJoinedStrings(0))) { throw new CommandException("Warp already exists! Type /confirm to confirm overwriting"); } } try { getManager().create(warpName, loc, player); } catch (IllegalArgumentException ex) { throw new CommandException("Invalid warp name!"); } sender.sendMessage(ChatColor.YELLOW + "Warp '" + warpName + "' created."); } @Command(aliases = {"warps"}, desc = "Warp management") @NestedCommand({ManagementCommands.class}) public void warps(CommandContext args, CommandSender sender) throws CommandException { } } public class ManagementCommands { @Command(aliases = {"info", "inf"}, usage = "<warpname> [world]", desc = "Get information about a warp", min = 1, max = 2 ) @CommandPermissions({"commandbook.warp.info"}) public void infoCmd(CommandContext args, CommandSender sender) throws CommandException { World world; String warpName = args.getString(0); if (args.argsLength() == 2) { world = InputUtil.LocationParser.matchWorld(sender, args.getString(1)); } else { world = PlayerUtil.checkPlayer(sender).getWorld(); } info(warpName, world, sender); } @Command(aliases = {"del", "delete", "remove", "rem"}, usage = "<warpname> [world]", desc = "Remove a warp", min = 1, max = 2 ) @CommandPermissions({"commandbook.warp.remove"}) public void removeCmd(CommandContext args, CommandSender sender) throws CommandException { World world; String warpName = args.getString(0); if (args.argsLength() == 2) { world = InputUtil.LocationParser.matchWorld(sender, args.getString(1)); } else { world = PlayerUtil.checkPlayer(sender).getWorld(); } remove(warpName, world, sender); } @Command(aliases = {"list", "show"}, usage = "[ -p owner] [-w world] [page]", desc = "List warps", flags = "p:w:", min = 0, max = 1 ) @CommandPermissions({"commandbook.warp.list"}) public void listCmd(CommandContext args, CommandSender sender) throws CommandException { list(args, sender); } } @Override public PaginatedResult<NamedLocation> getListResult() { final String defaultWorld = CommandBook.server().getWorlds().get(0).getName(); return new PaginatedResult<NamedLocation>(ChatColor.GOLD + "Warps") { @Override public String format(NamedLocation entry) { return ChatColor.BLUE + entry.getName().toUpperCase() + ChatColor.YELLOW + " (Owner: " + ChatColor.WHITE + entry.getCreatorName() + ChatColor.YELLOW + ", World: " + ChatColor.WHITE + (entry.getWorldName() == null ? defaultWorld : entry.getWorldName()) + ChatColor.YELLOW + ")"; } }; } }