package com.forgeessentials.teleport; import net.minecraft.command.ICommandSender; import net.minecraft.world.WorldServer; import net.minecraftforge.permission.PermissionLevel; import com.forgeessentials.api.APIRegistry; import com.forgeessentials.api.UserIdent; import com.forgeessentials.commons.selections.WarpPoint; import com.forgeessentials.core.commands.ParserCommandBase; import com.forgeessentials.core.misc.TeleportHelper; import com.forgeessentials.core.misc.Translator; import com.forgeessentials.util.CommandParserArgs; import com.forgeessentials.util.questioner.Questioner; import com.forgeessentials.util.questioner.QuestionerCallback; import com.forgeessentials.util.questioner.QuestionerStillActiveException; public class CommandTPA extends ParserCommandBase { public static final String PERM_HERE = TeleportModule.PERM_TPA + ".here"; public static final String PERM_LOCATION = TeleportModule.PERM_TPA + ".loc"; @Override public String getCommandName() { return "tpa"; } @Override public String getCommandUsage(ICommandSender sender) { return "/tpa [player] <player|<x> <y> <z>|accept|decline> Request to teleport yourself or another player."; } @Override public String getPermissionNode() { return TeleportModule.PERM_TPA; } @Override public PermissionLevel getPermissionLevel() { return PermissionLevel.TRUE; } @Override public void registerExtraPermissions() { APIRegistry.perms.registerPermission(PERM_HERE, PermissionLevel.TRUE, "Allow teleporting other players to your own location (inversed TPA)"); APIRegistry.perms.registerPermission(PERM_LOCATION, PermissionLevel.OP, "Allow teleporting other players to any location"); } @Override public boolean canConsoleUseCommand() { return false; } @Override public void parse(final CommandParserArgs arguments) { if (arguments.isEmpty()) { arguments.confirm("/tpa <player>: Request being teleported to another player"); arguments.confirm("/tpa <player> <here|x y z>: Propose another player to be teleported"); return; } final UserIdent player = arguments.parsePlayer(true); if (arguments.isEmpty()) { if (arguments.isTabCompletion) return; try { arguments.confirm(Translator.format("Waiting for response by %s", player.getUsernameOrUuid())); Questioner.add(player.getPlayer(), Translator.format("Allow teleporting %s to your location?", arguments.sender.getCommandSenderName()), new QuestionerCallback() { @Override public void respond(Boolean response) { if (response == null) arguments.error("TPA request timed out"); else if (response == false) arguments.error("TPA declined"); else TeleportHelper.teleport(arguments.senderPlayer, new WarpPoint(player.getPlayer())); } }, 20); } catch (QuestionerStillActiveException e) { throw new QuestionerStillActiveException.CommandException(); } return; } arguments.tabComplete("here"); final WarpPoint point; final String locationName; if (arguments.peek().equalsIgnoreCase("here")) { arguments.checkPermission(PERM_HERE); point = new WarpPoint(arguments.senderPlayer); locationName = arguments.sender.getCommandSenderName(); arguments.remove(); } else { arguments.checkPermission(PERM_LOCATION); point = new WarpPoint((WorldServer) arguments.senderPlayer.worldObj, // arguments.parseDouble(), arguments.parseDouble(), arguments.parseDouble(), // player.getPlayer().rotationPitch, player.getPlayer().rotationYaw); locationName = point.toReadableString(); } if (arguments.isTabCompletion) return; try { Questioner.add(player.getPlayer(), Translator.format("Do you want to be teleported to %s?", locationName), new QuestionerCallback() { @Override public void respond(Boolean response) { if (response == null) arguments.error("TPA request timed out"); else if (response == false) arguments.error("TPA declined"); else TeleportHelper.teleport(player.getPlayerMP(), point); } }, 20); } catch (QuestionerStillActiveException e) { throw new QuestionerStillActiveException.CommandException(); } } }