/* * 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.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 org.bukkit.ChatColor; import org.bukkit.Location; import org.bukkit.World; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; @ComponentInformation(friendlyName = "Homes", desc = "Home management system") public class HomesComponent extends LocationsComponent { public HomesComponent() { super("Home"); } public void enable() { super.enable(); registerCommands(Commands.class); } public class Commands { @Command(aliases = {"home"}, usage = "[world] [target] [owner]", desc = "Teleport to a home", min = 0, max = 3) @CommandPermissions({"commandbook.home.teleport"}) public void home(CommandContext args, CommandSender sender) throws CommandException { Iterable<Player> targets = null; NamedLocation home = null; Location loc; // Detect arguments based on the number of arguments provided if (args.argsLength() == 0) { Player player = PlayerUtil.checkPlayer(sender); targets = Lists.newArrayList(player); home = getManager().get(player.getWorld(), player.getName()); } else if (args.argsLength() == 1) { Player player = PlayerUtil.checkPlayer(sender); targets = Lists.newArrayList(player); home = 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); home = getManager().get(player.getWorld(), args.getString(1)); } else { home = getManager().get(null, args.getString(1)); } // Check permissions! for (Player target : targets) { if (target != sender) { CommandBook.inst().checkPermission(sender, "commandbook.home.teleport.other"); break; } } } else if (args.argsLength() == 3) { targets = InputUtil.PlayerParser.matchPlayers(sender, args.getString(1)); home = 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.home.teleport.other"); break; } } } if (home != null) { if (!home.getCreatorName().equals(sender.getName())) { CommandBook.inst().checkPermission(sender, "commandbook.home.other"); } loc = home.getLocation(); } else { throw new CommandException("A home for the given player does not exist."); } (new TeleportPlayerIterator(sender, loc)).iterate(targets); } @Command(aliases = {"sethome"}, usage = "[owner] [location]", desc = "Set a home", min = 0, max = 2) @CommandPermissions({"commandbook.home.set"}) public void setHome(CommandContext args, CommandSender sender) throws CommandException { String homeName; Location loc; Player player = null; // Detect arguments based on the number of arguments provided if (args.argsLength() == 0) { player = PlayerUtil.checkPlayer(sender); homeName = player.getName(); loc = player.getLocation(); } else if (args.argsLength() == 1) { homeName = args.getString(0); player = PlayerUtil.checkPlayer(sender); loc = player.getLocation(); // Check permissions! if (!homeName.equals(sender.getName())) { CommandBook.inst().checkPermission(sender, "commandbook.home.set.other"); } } else { homeName = args.getString(1); loc = InputUtil.LocationParser.matchLocation(sender, args.getString(0)); // Check permissions! if (!homeName.equals(sender.getName())) { CommandBook.inst().checkPermission(sender, "commandbook.home.set.other"); } } try { getManager().create(homeName, loc, player); } catch (IllegalArgumentException ex) { throw new CommandException("Invalid home name!"); } sender.sendMessage(ChatColor.YELLOW + "Home set."); } @Command(aliases = {"homes"}, desc = "Home management") @NestedCommand({ManagementCommands.class}) public void homes() throws CommandException { } } public class ManagementCommands { @Command(aliases = {"info", "inf"}, usage = "<name> [world]", desc = "Get information about a home", min = 1, max = 2 ) @CommandPermissions({"commandbook.home.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 = "[name] [world]", desc = "Remove a home", min = 0, max = 2 ) @CommandPermissions({"commandbook.home.remove"}) public void removeCmd(CommandContext args, CommandSender sender) throws CommandException { World world; String name = sender.getName(); if (args.argsLength() == 2) { world = InputUtil.LocationParser.matchWorld(sender, args.getString(1)); } else { world = PlayerUtil.checkPlayer(sender).getWorld(); } if (args.argsLength() > 0) name = args.getString(0); remove(name, world, sender); } @Command(aliases = {"list", "show"}, usage = "[-w world] [page]", desc = "List homes", flags = "w:", min = 0, max = 1 ) @CommandPermissions({"commandbook.home.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 + "Homes") { @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 + ")"; } }; } }