package net.minecraft.commands.functions; import com.mojang.brigadier.CommandDispatcher; import com.mojang.brigadier.ParseResults; import com.mojang.brigadier.StringReader; import com.mojang.brigadier.context.ContextChain; import com.mojang.brigadier.exceptions.CommandSyntaxException; import java.util.List; import java.util.Optional; import net.minecraft.commands.Commands; import net.minecraft.commands.ExecutionCommandSource; import net.minecraft.commands.FunctionInstantiationException; import net.minecraft.commands.execution.UnboundEntryAction; import net.minecraft.commands.execution.tasks.BuildContexts; import net.minecraft.nbt.CompoundTag; import net.minecraft.resources.ResourceLocation; import org.jetbrains.annotations.Nullable; public interface CommandFunction { ResourceLocation id(); InstantiatedFunction instantiate(@Nullable CompoundTag arguments, CommandDispatcher dispatcher) throws FunctionInstantiationException; private static boolean shouldConcatenateNextLine(CharSequence line) { int i = line.length(); return i > 0 && line.charAt(i - 1) == '\\'; } static > CommandFunction fromLines(ResourceLocation id, CommandDispatcher dispatcher, T source, List lines) { FunctionBuilder functionBuilder = new FunctionBuilder<>(); for (int i = 0; i < lines.size(); i++) { int j = i + 1; String string = ((String)lines.get(i)).trim(); String string3; if (shouldConcatenateNextLine(string)) { StringBuilder stringBuilder = new StringBuilder(string); do { if (++i == lines.size()) { throw new IllegalArgumentException("Line continuation at end of file"); } stringBuilder.deleteCharAt(stringBuilder.length() - 1); String string2 = ((String)lines.get(i)).trim(); stringBuilder.append(string2); checkCommandLineLength(stringBuilder); } while (shouldConcatenateNextLine(stringBuilder)); string3 = stringBuilder.toString(); } else { string3 = string; } checkCommandLineLength(string3); StringReader stringReader = new StringReader(string3); if (stringReader.canRead() && stringReader.peek() != '#') { if (stringReader.peek() == '/') { stringReader.skip(); if (stringReader.peek() == '/') { throw new IllegalArgumentException("Unknown or invalid command '" + string3 + "' on line " + j + " (if you intended to make a comment, use '#' not '//')"); } String string2 = stringReader.readUnquotedString(); throw new IllegalArgumentException( "Unknown or invalid command '" + string3 + "' on line " + j + " (did you mean '" + string2 + "'? Do not use a preceding forwards slash.)" ); } if (stringReader.peek() == '$') { functionBuilder.addMacro(string3.substring(1), j, source); } else { try { functionBuilder.addCommand(parseCommand(dispatcher, source, stringReader)); } catch (CommandSyntaxException var11) { throw new IllegalArgumentException("Whilst parsing command on line " + j + ": " + var11.getMessage()); } } } } return functionBuilder.build(id); } static void checkCommandLineLength(CharSequence command) { if (command.length() > 2000000) { CharSequence charSequence = command.subSequence(0, Math.min(512, 2000000)); throw new IllegalStateException("Command too long: " + command.length() + " characters, contents: " + charSequence + "..."); } } static > UnboundEntryAction parseCommand(CommandDispatcher dispatcher, T source, StringReader command) throws CommandSyntaxException { ParseResults parseResults = dispatcher.parse(command, source); Commands.validateParseResults(parseResults); Optional> optional = ContextChain.tryFlatten(parseResults.getContext().build(command.getString())); if (optional.isEmpty()) { throw CommandSyntaxException.BUILT_IN_EXCEPTIONS.dispatcherUnknownCommand().createWithContext(parseResults.getReader()); } else { return new BuildContexts.Unbound<>(command.getString(), (ContextChain)optional.get()); } } }