package net.minecraft.command.type.custom.coordinate;
import java.util.regex.Matcher;
import net.minecraft.command.ParsingUtilities;
import net.minecraft.command.SyntaxErrorException;
import net.minecraft.command.completion.ITabCompletion;
import net.minecraft.command.completion.TCDSet;
import net.minecraft.command.completion.TabCompletion.SingleChar;
import net.minecraft.command.completion.TabCompletionData;
import net.minecraft.command.parser.CompletionParser.CompletionData;
import net.minecraft.command.parser.Context;
import net.minecraft.command.parser.MatcherRegistry;
import net.minecraft.command.parser.Parser;
import net.minecraft.command.type.base.CustomCompletable;
import net.minecraft.command.type.custom.coordinate.Coordinate.CoordValue;
public abstract class TypeCoordinateBase extends CustomCompletable<Coordinate>
{
public static final MatcherRegistry coordMatcher = new MatcherRegistry("\\G\\s*+(~)?+(?:([@\\$]|[+-]?+(?=\\.?+\\d)\\d*+(\\.)?+\\d*+))?+");
public static final ITabCompletion tildeCompletion = new SingleChar('~')
{
@Override
public double weight()
{
return 1.0;
};
};
@Override
public Coordinate iParse(final Parser parser, final Context context) throws SyntaxErrorException
{
final Matcher m = parser.getMatcher(coordMatcher);
parser.findInc(m);
final boolean relative = m.group(1) != null;
final String s = m.group(2);
if (relative)
ParsingUtilities.terminateCompletion(parser);
else if (s == null)
throw parser.SEE("'~' or coordinate expected ");
if (s == null)
return this.coord();
if ("@".equals(s))
return this.coord(Coordinate.typeCoord.selectorParser.parse(parser), relative);
if ("$".equals(s))
return this.coord(Coordinate.typeCoord.labelParser.parse(parser), relative);
if (m.group(3) == null)
return this.coord(new CoordValue.Constant(Double.parseDouble(s), false), relative);
return this.coord(new CoordValue.Constant(Double.parseDouble(s), true), relative);
}
public final boolean center;
public final Coordinate tildeCoord;
public TypeCoordinateBase(final boolean center, final Coordinate tildeCoord)
{
this.center = center;
this.tildeCoord = tildeCoord;
}
public Coordinate coord()
{
return this.tildeCoord;
}
public abstract Coordinate coord(CoordValue param, boolean relative);
@Override
public void complete(final TCDSet tcDataSet, final Parser parser, final int startIndex, final CompletionData cData)
{
TabCompletionData.addToSet(tcDataSet, startIndex, cData, tildeCompletion);
}
}