package net.minecraft.command.collections; import java.util.Collection; import java.util.HashSet; import java.util.Set; import java.util.regex.Matcher; import java.util.regex.Pattern; import net.minecraft.command.completion.DataRequest; import net.minecraft.command.completion.ITabCompletion; import net.minecraft.command.completion.ProviderCompleter; import net.minecraft.command.completion.TCDSet; import net.minecraft.command.completion.TabCompletion; import net.minecraft.command.completion.TabCompletionData; import net.minecraft.command.completion.TabCompletionData.Weighted; import net.minecraft.command.parser.CompletionParser.CompletionData; import net.minecraft.command.parser.Parser; import net.minecraft.command.type.CListProvider; import net.minecraft.command.type.IComplete; import net.minecraft.command.type.custom.CompleterResourcePath; import net.minecraft.entity.EntityList; import net.minecraft.server.MinecraftServer; import net.minecraft.util.EnumChatFormatting; public final class Completers { private Completers() { } public static final IComplete bool = new ProviderCompleter("true", "false"); public static final IComplete userCompleter = new ProviderCompleter(new CListProvider() { @Override public Set<ITabCompletion> getList(final Parser parser) { return MinecraftServer.getServer().getConfigurationManager().playerCompletions; } }); public static final IComplete scoreHolder = new IComplete() { @Override public void complete(final TCDSet tcDataSet, final Parser parser, final int startIndex, final CompletionData cData) { userCompleter.complete(tcDataSet, parser, startIndex, cData); // TODO: One version without all players tcDataSet.add(new DataRequest.SimpleAdd(startIndex, cData) { @Override public void process() { final Collection<?> scoreHolders = MinecraftServer.getServer().worldServerForDimension(0).getScoreboard().getObjectiveNames(); this.tcSet = new HashSet<>(scoreHolders.size()); for (final Object scoreHolder : scoreHolders) this.tcSet.add((String) scoreHolder); } }); } }; public static final ITabCompletion wildcardCompletion = new TabCompletion.SingleChar('*'); public static final IComplete wildcardCompleter = new ProviderCompleter(wildcardCompletion); public static final IComplete scoreHolderWC = new IComplete() { @Override public void complete(final TCDSet tcDataSet, final Parser parser, final int startIndex, final CompletionData cData) { scoreHolder.complete(tcDataSet, parser, startIndex, cData); TabCompletionData.addToSet(tcDataSet, startIndex, cData, wildcardCompletion); } }; public static final IComplete nonOppedOnline = new IComplete() { @Override public void complete(final TCDSet tcDataSet, final Parser parser, final int startIndex, final CompletionData cData) { tcDataSet.add(new DataRequest() { String[] ops = null; @Override public void process() { this.ops = MinecraftServer.getServer().getConfigurationManager().getOppedPlayerNames(); } @Override public void createCompletions(final Set<Weighted> tcDataSet) { final Set<String> opSet = new HashSet<>(this.ops.length); for (final String op : this.ops) opSet.add(op); for (final ITabCompletion tc : MinecraftServer.getServer().getConfigurationManager().playerCompletions) if (!opSet.contains(tc.name)) TabCompletionData.addToSet(tcDataSet, startIndex, cData, tc); } }); } }; public static final IComplete opName = new IComplete() { @Override public void complete(final TCDSet tcDataSet, final Parser parser, final int startIndex, final CompletionData cData) { tcDataSet.add(new DataRequest() { String[] ops = null; @Override public void process() { this.ops = MinecraftServer.getServer().getConfigurationManager().getOppedPlayerNames(); } @Override public void createCompletions(final Set<Weighted> tcDataSet) { for (final String op : this.ops) TabCompletionData.addToSet(tcDataSet, startIndex, cData, new TabCompletion(op)); } }); } }; public static final IComplete teamName = new IComplete() { @Override public void complete(final TCDSet tcDataSet, final Parser parser, final int startIndex, final CompletionData cData) { tcDataSet.add(new DataRequest.SimpleAdd(startIndex, cData) { @Override public void process() { final Collection<?> teamNames = MinecraftServer.getServer().worldServerForDimension(0).getScoreboard().getTeamNames(); this.tcSet = new HashSet<>(teamNames.size()); for (final Object team : teamNames) this.tcSet.add((String) team); } }); } }; public static final IComplete entityID = new IComplete() { @Override public void complete(final TCDSet tcDataSet, final Parser parser, final int startIndex, final CompletionData cData) { TabCompletionData.addToSet(tcDataSet, startIndex, cData, EntityList.completions); } }; public static final IComplete entityIDWPlayer = new IComplete() { private final ITabCompletion playerCompletion = new TabCompletion("Player"); @Override public void complete(final TCDSet tcDataSet, final Parser parser, final int startIndex, final CompletionData cData) { entityID.complete(tcDataSet, parser, startIndex, cData); TabCompletionData.addToSet(tcDataSet, startIndex, cData, this.playerCompletion); } }; public static final CompleterResourcePath blockCompleter = new CompleterResourcePath("minecraft"); public static final CompleterResourcePath itemCompleter = new CompleterResourcePath("minecraft"); public static final ITabCompletion braceCompletion = new TabCompletion(Pattern.compile("\\A(\\s*+)\\{?+\\z"), "{}", "{}") { @Override public boolean complexFit() { return false; } @Override public int getCursorOffset(final Matcher m, final CompletionData cData) { return -1; }; @Override public double weightOffset(final Matcher m, final CompletionData cData) { return 1.0; } @Override public boolean fullMatch(final Matcher m, final CompletionData cData, final String replacement) { return false; } }; public static final IComplete braceCompleter = new IComplete() { @Override public void complete(final TCDSet tcDataSet, final Parser parser, final int startIndex, final CompletionData cData) { TabCompletionData.addToSet(tcDataSet, startIndex, cData, Completers.braceCompletion); } }; public static final ITabCompletion bracketCompletion = new TabCompletion(Pattern.compile("\\A(\\s*+)\\[?+\\z"), "[]", "[]") { @Override public boolean complexFit() { return false; } @Override public int getCursorOffset(final Matcher m, final CompletionData cData) { return -1; }; @Override public double weightOffset(final Matcher m, final CompletionData cData) { return 1.0; } @Override public boolean fullMatch(final Matcher m, final CompletionData cData, final String replacement) { return false; } }; public static final IComplete bracketCompleter = new IComplete() { @Override public void complete(final TCDSet tcDataSet, final Parser parser, final int startIndex, final CompletionData cData) { TabCompletionData.addToSet(tcDataSet, startIndex, cData, bracketCompletion); } }; public static final Collection<String> chatColors = initColors(); @SuppressWarnings("unchecked") public static Collection<String> initColors() { return EnumChatFormatting.getValidValues(true, false); } public static final IComplete braceBracketCompleter = new ProviderCompleter(Completers.braceCompletion, Completers.bracketCompletion); }