001/* 002 * This file is part of Baritone. 003 * 004 * Baritone is free software: you can redistribute it and/or modify 005 * it under the terms of the GNU Lesser General Public License as published by 006 * the Free Software Foundation, either version 3 of the License, or 007 * (at your option) any later version. 008 * 009 * Baritone is distributed in the hope that it will be useful, 010 * but WITHOUT ANY WARRANTY; without even the implied warranty of 011 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 012 * GNU Lesser General Public License for more details. 013 * 014 * You should have received a copy of the GNU Lesser General Public License 015 * along with Baritone. If not, see <https://www.gnu.org/licenses/>. 016 */ 017 018package baritone.api.command.datatypes; 019 020import baritone.api.command.argument.IArgConsumer; 021import baritone.api.command.exception.CommandException; 022import baritone.api.pathing.goals.Goal; 023import baritone.api.pathing.goals.GoalBlock; 024import baritone.api.pathing.goals.GoalXZ; 025import baritone.api.pathing.goals.GoalYLevel; 026import baritone.api.utils.BetterBlockPos; 027 028import java.util.stream.Stream; 029 030public enum RelativeGoal implements IDatatypePost<Goal, BetterBlockPos> { 031 INSTANCE; 032 033 @Override 034 public Goal apply(IDatatypeContext ctx, BetterBlockPos origin) throws CommandException { 035 if (origin == null) { 036 origin = BetterBlockPos.ORIGIN; 037 } 038 039 final IArgConsumer consumer = ctx.getConsumer(); 040 041 GoalBlock goalBlock = consumer.peekDatatypePostOrNull(RelativeGoalBlock.INSTANCE, origin); 042 if (goalBlock != null) { 043 return goalBlock; 044 } 045 046 GoalXZ goalXZ = consumer.peekDatatypePostOrNull(RelativeGoalXZ.INSTANCE, origin); 047 if (goalXZ != null) { 048 return goalXZ; 049 } 050 051 GoalYLevel goalYLevel = consumer.peekDatatypePostOrNull(RelativeGoalYLevel.INSTANCE, origin); 052 if (goalYLevel != null) { 053 return goalYLevel; 054 } 055 056 // when the user doesn't input anything, default to the origin 057 return new GoalBlock(origin); 058 } 059 060 @Override 061 public Stream<String> tabComplete(IDatatypeContext ctx) { 062 return ctx.getConsumer().tabCompleteDatatype(RelativeCoordinate.INSTANCE); 063 } 064}