package net.minecraft.command.type.custom.coordinate; import net.minecraft.command.CommandException; import net.minecraft.command.ICommandSender; import net.minecraft.command.SyntaxErrorException; import net.minecraft.command.arg.ArgWrapper; import net.minecraft.command.arg.CommandArg; import net.minecraft.command.arg.PrimitiveParameter; import net.minecraft.command.collections.TypeIDs; import net.minecraft.command.completion.TCDSet; import net.minecraft.command.completion.TabCompletion; import net.minecraft.command.completion.TabCompletionData; import net.minecraft.command.parser.CompletionParser.CompletionData; import net.minecraft.command.parser.Context; import net.minecraft.command.parser.Parser; import net.minecraft.command.type.CDataType; import net.minecraft.command.type.CTypeParse; import net.minecraft.command.type.IComplete; import net.minecraft.command.type.IParse; import net.minecraft.command.type.custom.coordinate.Coordinate.CoordValue; public class TypeCoordinate { public static final IParse<Coordinate> xC = new TypeCoordinate.x(true); public static final IParse<Coordinate> xNC = new TypeCoordinate.x(false); public static final IParse<Coordinate> yC = new TypeCoordinate.y(true); public static final IParse<Coordinate> yNC = new TypeCoordinate.y(false); public static final IParse<Coordinate> zC = new TypeCoordinate.z(true); public static final IParse<Coordinate> zNC = new TypeCoordinate.z(false); public static final IComplete xCompletion = new IComplete() { @Override public void complete(final TCDSet tcDataSet, final Parser parser, final int startIndex, final CompletionData cData) { if (cData.hovered != null) TabCompletionData.addToSet(tcDataSet, startIndex, cData, new TabCompletion(String.valueOf(cData.hovered.getX()))); } }; public static final IComplete yCompletion = new IComplete() { @Override public void complete(final TCDSet tcDataSet, final Parser parser, final int startIndex, final CompletionData cData) { if (cData.hovered != null) TabCompletionData.addToSet(tcDataSet, startIndex, cData, new TabCompletion(String.valueOf(cData.hovered.getY()))); } }; public static final IComplete zCompletion = new IComplete() { @Override public void complete(final TCDSet tcDataSet, final Parser parser, final int startIndex, final CompletionData cData) { if (cData.hovered != null) TabCompletionData.addToSet(tcDataSet, startIndex, cData, new TabCompletion(String.valueOf(cData.hovered.getZ()))); } }; public static final IParse<Coordinate> shiftXC = new TypeCoordinate.shift(true, TypeCoordinate.xCompletion); public static final IParse<Coordinate> shiftXNC = new TypeCoordinate.shift(false, TypeCoordinate.xCompletion); public static final IParse<Coordinate> shiftYC = new TypeCoordinate.shift(true, TypeCoordinate.yCompletion); public static final IParse<Coordinate> shiftYNC = new TypeCoordinate.shift(false, TypeCoordinate.yCompletion); public static final IParse<Coordinate> shiftZC = new TypeCoordinate.shift(true, TypeCoordinate.zCompletion); public static final IParse<Coordinate> shiftZNC = new TypeCoordinate.shift(false, TypeCoordinate.zCompletion); public static final IParse<Coordinate> shiftC = new TypeCoordinate.shift(true, null); public static final IParse<Coordinate> shiftNC = new TypeCoordinate.shift(false, null); public static final CDataType<Double> typeXC = TypeIDs.Double.wrap(xC); public static final CDataType<Double> typeXNC = TypeIDs.Double.wrap(xNC); public static final CDataType<Double> typeYC = TypeIDs.Double.wrap(yC); public static final CDataType<Double> typeYNC = TypeIDs.Double.wrap(yNC); public static final CDataType<Double> typeZC = TypeIDs.Double.wrap(zC); public static final CDataType<Double> typeZNC = TypeIDs.Double.wrap(zNC); public static final CDataType<SingleShift> typeShiftXC = new TypeShift(shiftXC); public static final CDataType<SingleShift> typeShiftXNC = new TypeShift(shiftXNC); public static final CDataType<SingleShift> typeShiftYC = new TypeShift(shiftYC); public static final CDataType<SingleShift> typeShiftYNC = new TypeShift(shiftYNC); public static final CDataType<SingleShift> typeShiftZC = new TypeShift(shiftZC); public static final CDataType<SingleShift> typeShiftZNC = new TypeShift(shiftZNC); public static final CDataType<SingleShift> typeShiftC = new TypeShift(shiftC); public static final CDataType<SingleShift> typeShiftNC = new TypeShift(shiftNC); private TypeCoordinate() { } public static class x extends TypeCoordinateBase { public x(final boolean centerBlock) { super(centerBlock, centerBlock ? SingleCoordinate.tildexC : SingleCoordinate.tildexNC); } @Override public Coordinate coord() { return this.tildeCoord; } @Override public Coordinate coord(final CoordValue param, final boolean relative) { return new SingleCoordinate.x(param, relative, this.center); } @Override public void complete(final TCDSet tcDataSet, final Parser parser, final int startIndex, final CompletionData cData) { super.complete(tcDataSet, parser, startIndex, cData); xCompletion.complete(tcDataSet, parser, startIndex, cData); } } public static class y extends TypeCoordinateBase { public y(final boolean centerBlock) { super(centerBlock, centerBlock ? SingleCoordinate.tildeyC : SingleCoordinate.tildeyNC); } @Override public Coordinate coord() { return this.tildeCoord; } @Override public Coordinate coord(final CoordValue param, final boolean relative) { return new SingleCoordinate.y(param, relative, this.center); } @Override public void complete(final TCDSet tcDataSet, final Parser parser, final int startIndex, final CompletionData cData) { super.complete(tcDataSet, parser, startIndex, cData); yCompletion.complete(tcDataSet, parser, startIndex, cData); } } public static class z extends TypeCoordinateBase { public z(final boolean centerBlock) { super(centerBlock, centerBlock ? SingleCoordinate.tildezC : SingleCoordinate.tildezNC); } @Override public Coordinate coord() { return this.tildeCoord; } @Override public Coordinate coord(final CoordValue param, final boolean relative) { return new SingleCoordinate.z(param, relative, this.center); } @Override public void complete(final TCDSet tcDataSet, final Parser parser, final int startIndex, final CompletionData cData) { super.complete(tcDataSet, parser, startIndex, cData); zCompletion.complete(tcDataSet, parser, startIndex, cData); } } public static class shift extends TypeCoordinateBase { private final IComplete completion; public shift(final boolean centerBlock, final IComplete completion) { super(centerBlock, new SingleCoordinate.shift(SingleCoordinate.tildeCoord, true, centerBlock)); this.completion = completion; } @Override public Coordinate coord(final CoordValue param, final boolean relative) { return new SingleCoordinate.shift(param, relative, this.center); } @Override public void complete(final TCDSet tcDataSet, final Parser parser, final int startIndex, final CompletionData cData) { super.complete(tcDataSet, parser, startIndex, cData); if (this.completion != null) this.completion.complete(tcDataSet, parser, startIndex, cData); } } public static class TypeShift extends CTypeParse<SingleShift> { private final IParse<Coordinate> parser; public TypeShift(final IParse<Coordinate> parser) { this.parser = parser; } private static SingleShift getShift(final Coordinate coord, final double shift) { return new SingleShift() { @Override public boolean relative() { return coord.isRelative(); } @Override public double getShiftValue() { return shift; } @Override public double addBase(final double base) throws CommandException { return coord.addBase(shift, base); } }; } @Override public ArgWrapper<SingleShift> iParse(final Parser parser, final Context parserData) throws SyntaxErrorException { final Coordinate coord = TypeShift.this.parser.parse(parser, parserData); return TypeIDs.SingleShift.wrap( coord.getValue().isConstant() ? new PrimitiveParameter<>(getShift(coord, coord.getValue().getConstant())) : new CommandArg<SingleShift>() { @Override public SingleShift eval(final ICommandSender sender) throws CommandException { return getShift(coord, coord.eval(sender)); } }); } } public static final CommandArg<SingleShift> trivialShift = new PrimitiveParameter<SingleShift>(new SingleShift() { @Override public boolean relative() { return true; } @Override public double getShiftValue() { return 0; } @Override public double addBase(final double base) { return base; } }); public static interface SingleShift { public boolean relative(); public double getShiftValue(); public double addBase(final double base) throws CommandException; } }