001package fr.aumgn.bukkitutils.command.arg.basic;
002
003import org.bukkit.command.CommandSender;
004import org.bukkit.entity.Player;
005
006import fr.aumgn.bukkitutils.command.CommandsMessages;
007import fr.aumgn.bukkitutils.command.arg.impl.AsbtractSenderArg;
008import fr.aumgn.bukkitutils.command.exception.CommandUsageError;
009import fr.aumgn.bukkitutils.geom.Vector;
010
011public class VectorArg extends AsbtractSenderArg<Vector> {
012
013    static double parseVectorComponent(CommandsMessages messages, String component) {
014        try {
015            return Double.parseDouble(component);
016        } catch (NumberFormatException exc) {
017            throw new CommandUsageError(
018                    messages.notAValidVectorComponent(component));
019        }
020    }
021
022    private final CommandsMessages messages;
023
024    public VectorArg(CommandsMessages messages, String string) {
025        super(string);
026        this.messages = messages;
027    }
028
029    @Override
030    public Vector value() {
031        String[] splitted = string.split(",");
032
033        if (splitted.length > 3) {
034            throw new CommandUsageError();
035        }
036
037        double x = parseVectorComponent(messages, splitted[0]);
038        double y = 0.0;
039        double z = 0.0;
040        if (splitted.length > 1) {
041            y = parseVectorComponent(messages, splitted[1]);
042            if (splitted.length > 2) {
043                z = parseVectorComponent(messages, splitted[2]);
044            }
045        }
046
047        return new Vector(x, y, z);
048    }
049
050    @Override
051    protected Vector defaultFor(CommandSender sender) {
052        if (!(sender instanceof Player)) {
053            throw new CommandUsageError(messages.positionNeeded());
054        }
055
056        return new Vector((Player) sender);
057    }
058
059    @Override
060    protected String missingPermOtherMessage(String permission) {
061        return messages.missingPermissionForOther(permission);
062    }
063}