/* * Decompiled with CFR 0.152. * * Could not load the following classes: * com.mojang.brigadier.CommandDispatcher * com.mojang.brigadier.ParseResults * com.mojang.brigadier.StringReader * com.mojang.brigadier.arguments.ArgumentType * com.mojang.brigadier.builder.ArgumentBuilder * com.mojang.brigadier.builder.LiteralArgumentBuilder * com.mojang.brigadier.builder.RequiredArgumentBuilder * com.mojang.brigadier.context.CommandContext * com.mojang.brigadier.context.CommandContextBuilder * com.mojang.brigadier.context.ContextChain * com.mojang.brigadier.exceptions.CommandSyntaxException * com.mojang.brigadier.suggestion.SuggestionProvider * com.mojang.brigadier.tree.ArgumentCommandNode * com.mojang.brigadier.tree.CommandNode * com.mojang.brigadier.tree.RootCommandNode * com.mojang.logging.LogUtils * org.jspecify.annotations.Nullable * org.slf4j.Logger */ package net.minecraft.commands; import com.mojang.brigadier.CommandDispatcher; import com.mojang.brigadier.ParseResults; import com.mojang.brigadier.StringReader; import com.mojang.brigadier.arguments.ArgumentType; import com.mojang.brigadier.builder.ArgumentBuilder; import com.mojang.brigadier.builder.LiteralArgumentBuilder; import com.mojang.brigadier.builder.RequiredArgumentBuilder; import com.mojang.brigadier.context.CommandContext; import com.mojang.brigadier.context.CommandContextBuilder; import com.mojang.brigadier.context.ContextChain; import com.mojang.brigadier.exceptions.CommandSyntaxException; import com.mojang.brigadier.suggestion.SuggestionProvider; import com.mojang.brigadier.tree.ArgumentCommandNode; import com.mojang.brigadier.tree.CommandNode; import com.mojang.brigadier.tree.RootCommandNode; import com.mojang.logging.LogUtils; import java.util.HashMap; import java.util.Map; import java.util.Optional; import java.util.Set; import java.util.function.Consumer; import java.util.function.Predicate; import java.util.function.UnaryOperator; import java.util.stream.Collectors; import java.util.stream.Stream; import net.minecraft.ChatFormatting; import net.minecraft.SharedConstants; import net.minecraft.commands.CommandBuildContext; import net.minecraft.commands.CommandResultCallback; import net.minecraft.commands.CommandSource; import net.minecraft.commands.CommandSourceStack; import net.minecraft.commands.ExecutionCommandSource; import net.minecraft.commands.execution.ExecutionContext; import net.minecraft.commands.synchronization.ArgumentTypeInfos; import net.minecraft.commands.synchronization.ArgumentUtils; import net.minecraft.commands.synchronization.SuggestionProviders; import net.minecraft.core.HolderLookup; import net.minecraft.core.HolderSet; import net.minecraft.core.Registry; import net.minecraft.data.registries.VanillaRegistries; import net.minecraft.gametest.framework.TestCommand; import net.minecraft.network.chat.ClickEvent; import net.minecraft.network.chat.CommonComponents; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.ComponentUtils; import net.minecraft.network.chat.HoverEvent; import net.minecraft.network.chat.MutableComponent; import net.minecraft.network.protocol.game.ClientboundCommandsPacket; import net.minecraft.resources.Identifier; import net.minecraft.resources.ResourceKey; import net.minecraft.server.commands.AdvancementCommands; import net.minecraft.server.commands.AttributeCommand; import net.minecraft.server.commands.BanIpCommands; import net.minecraft.server.commands.BanListCommands; import net.minecraft.server.commands.BanPlayerCommands; import net.minecraft.server.commands.BossBarCommands; import net.minecraft.server.commands.ChaseCommand; import net.minecraft.server.commands.ClearInventoryCommands; import net.minecraft.server.commands.CloneCommands; import net.minecraft.server.commands.DamageCommand; import net.minecraft.server.commands.DataPackCommand; import net.minecraft.server.commands.DeOpCommands; import net.minecraft.server.commands.DebugCommand; import net.minecraft.server.commands.DebugConfigCommand; import net.minecraft.server.commands.DebugMobSpawningCommand; import net.minecraft.server.commands.DebugPathCommand; import net.minecraft.server.commands.DefaultGameModeCommands; import net.minecraft.server.commands.DialogCommand; import net.minecraft.server.commands.DifficultyCommand; import net.minecraft.server.commands.EffectCommands; import net.minecraft.server.commands.EmoteCommands; import net.minecraft.server.commands.EnchantCommand; import net.minecraft.server.commands.ExecuteCommand; import net.minecraft.server.commands.ExperienceCommand; import net.minecraft.server.commands.FetchProfileCommand; import net.minecraft.server.commands.FillBiomeCommand; import net.minecraft.server.commands.FillCommand; import net.minecraft.server.commands.ForceLoadCommand; import net.minecraft.server.commands.FunctionCommand; import net.minecraft.server.commands.GameModeCommand; import net.minecraft.server.commands.GameRuleCommand; import net.minecraft.server.commands.GiveCommand; import net.minecraft.server.commands.HelpCommand; import net.minecraft.server.commands.ItemCommands; import net.minecraft.server.commands.JfrCommand; import net.minecraft.server.commands.KickCommand; import net.minecraft.server.commands.KillCommand; import net.minecraft.server.commands.ListPlayersCommand; import net.minecraft.server.commands.LocateCommand; import net.minecraft.server.commands.LootCommand; import net.minecraft.server.commands.MsgCommand; import net.minecraft.server.commands.OpCommand; import net.minecraft.server.commands.PardonCommand; import net.minecraft.server.commands.PardonIpCommand; import net.minecraft.server.commands.ParticleCommand; import net.minecraft.server.commands.PerfCommand; import net.minecraft.server.commands.PlaceCommand; import net.minecraft.server.commands.PlaySoundCommand; import net.minecraft.server.commands.PublishCommand; import net.minecraft.server.commands.RaidCommand; import net.minecraft.server.commands.RandomCommand; import net.minecraft.server.commands.RecipeCommand; import net.minecraft.server.commands.ReloadCommand; import net.minecraft.server.commands.ReturnCommand; import net.minecraft.server.commands.RideCommand; import net.minecraft.server.commands.RotateCommand; import net.minecraft.server.commands.SaveAllCommand; import net.minecraft.server.commands.SaveOffCommand; import net.minecraft.server.commands.SaveOnCommand; import net.minecraft.server.commands.SayCommand; import net.minecraft.server.commands.ScheduleCommand; import net.minecraft.server.commands.ScoreboardCommand; import net.minecraft.server.commands.SeedCommand; import net.minecraft.server.commands.ServerPackCommand; import net.minecraft.server.commands.SetBlockCommand; import net.minecraft.server.commands.SetPlayerIdleTimeoutCommand; import net.minecraft.server.commands.SetSpawnCommand; import net.minecraft.server.commands.SetWorldSpawnCommand; import net.minecraft.server.commands.SpawnArmorTrimsCommand; import net.minecraft.server.commands.SpectateCommand; import net.minecraft.server.commands.SpreadPlayersCommand; import net.minecraft.server.commands.StopCommand; import net.minecraft.server.commands.StopSoundCommand; import net.minecraft.server.commands.StopwatchCommand; import net.minecraft.server.commands.SummonCommand; import net.minecraft.server.commands.TagCommand; import net.minecraft.server.commands.TeamCommand; import net.minecraft.server.commands.TeamMsgCommand; import net.minecraft.server.commands.TeleportCommand; import net.minecraft.server.commands.TellRawCommand; import net.minecraft.server.commands.TickCommand; import net.minecraft.server.commands.TimeCommand; import net.minecraft.server.commands.TitleCommand; import net.minecraft.server.commands.TransferCommand; import net.minecraft.server.commands.TriggerCommand; import net.minecraft.server.commands.VersionCommand; import net.minecraft.server.commands.WardenSpawnTrackerCommand; import net.minecraft.server.commands.WaypointCommand; import net.minecraft.server.commands.WeatherCommand; import net.minecraft.server.commands.WhitelistCommand; import net.minecraft.server.commands.WorldBorderCommand; import net.minecraft.server.commands.data.DataCommands; import net.minecraft.server.level.ServerPlayer; import net.minecraft.server.permissions.PermissionCheck; import net.minecraft.server.permissions.PermissionProviderCheck; import net.minecraft.server.permissions.PermissionSet; import net.minecraft.server.permissions.PermissionSetSupplier; import net.minecraft.server.permissions.Permissions; import net.minecraft.tags.TagKey; import net.minecraft.util.Util; import net.minecraft.util.profiling.Profiler; import net.minecraft.util.profiling.jfr.JvmProfiler; import net.minecraft.world.flag.FeatureFlagSet; import net.minecraft.world.flag.FeatureFlags; import net.minecraft.world.level.gamerules.GameRules; import net.minecraft.world.phys.Vec2; import net.minecraft.world.phys.Vec3; import org.jspecify.annotations.Nullable; import org.slf4j.Logger; public class Commands { public static final String COMMAND_PREFIX = "/"; private static final ThreadLocal<@Nullable ExecutionContext> CURRENT_EXECUTION_CONTEXT = new ThreadLocal(); private static final Logger LOGGER = LogUtils.getLogger(); public static final PermissionCheck LEVEL_ALL = PermissionCheck.AlwaysPass.INSTANCE; public static final PermissionCheck LEVEL_MODERATORS = new PermissionCheck.Require(Permissions.COMMANDS_MODERATOR); public static final PermissionCheck LEVEL_GAMEMASTERS = new PermissionCheck.Require(Permissions.COMMANDS_GAMEMASTER); public static final PermissionCheck LEVEL_ADMINS = new PermissionCheck.Require(Permissions.COMMANDS_ADMIN); public static final PermissionCheck LEVEL_OWNERS = new PermissionCheck.Require(Permissions.COMMANDS_OWNER); private static final ClientboundCommandsPacket.NodeInspector COMMAND_NODE_INSPECTOR = new ClientboundCommandsPacket.NodeInspector(){ private final CommandSourceStack noPermissionSource = Commands.createCompilationContext(PermissionSet.NO_PERMISSIONS); @Override public @Nullable Identifier suggestionId(ArgumentCommandNode node) { SuggestionProvider suggestionProvider = node.getCustomSuggestions(); return suggestionProvider != null ? SuggestionProviders.getName(suggestionProvider) : null; } @Override public boolean isExecutable(CommandNode node) { return node.getCommand() != null; } @Override public boolean isRestricted(CommandNode node) { Predicate requirement = node.getRequirement(); return !requirement.test(this.noPermissionSource); } }; private final CommandDispatcher dispatcher = new CommandDispatcher(); public Commands(CommandSelection commandSelection, CommandBuildContext context) { AdvancementCommands.register(this.dispatcher); AttributeCommand.register(this.dispatcher, context); ExecuteCommand.register(this.dispatcher, context); BossBarCommands.register(this.dispatcher, context); ClearInventoryCommands.register(this.dispatcher, context); CloneCommands.register(this.dispatcher, context); DamageCommand.register(this.dispatcher, context); DataCommands.register(this.dispatcher); DataPackCommand.register(this.dispatcher, context); DebugCommand.register(this.dispatcher); DefaultGameModeCommands.register(this.dispatcher); DialogCommand.register(this.dispatcher, context); DifficultyCommand.register(this.dispatcher); EffectCommands.register(this.dispatcher, context); EmoteCommands.register(this.dispatcher); EnchantCommand.register(this.dispatcher, context); ExperienceCommand.register(this.dispatcher); FillCommand.register(this.dispatcher, context); FillBiomeCommand.register(this.dispatcher, context); ForceLoadCommand.register(this.dispatcher); FunctionCommand.register(this.dispatcher); GameModeCommand.register(this.dispatcher); GameRuleCommand.register(this.dispatcher, context); GiveCommand.register(this.dispatcher, context); HelpCommand.register(this.dispatcher); ItemCommands.register(this.dispatcher, context); KickCommand.register(this.dispatcher); KillCommand.register(this.dispatcher); ListPlayersCommand.register(this.dispatcher); LocateCommand.register(this.dispatcher, context); LootCommand.register(this.dispatcher, context); MsgCommand.register(this.dispatcher); ParticleCommand.register(this.dispatcher, context); PlaceCommand.register(this.dispatcher); PlaySoundCommand.register(this.dispatcher); RandomCommand.register(this.dispatcher); ReloadCommand.register(this.dispatcher); RecipeCommand.register(this.dispatcher); FetchProfileCommand.register(this.dispatcher); ReturnCommand.register(this.dispatcher); RideCommand.register(this.dispatcher); RotateCommand.register(this.dispatcher); SayCommand.register(this.dispatcher); ScheduleCommand.register(this.dispatcher); ScoreboardCommand.register(this.dispatcher, context); SeedCommand.register(this.dispatcher, commandSelection != CommandSelection.INTEGRATED); VersionCommand.register(this.dispatcher, commandSelection != CommandSelection.INTEGRATED); SetBlockCommand.register(this.dispatcher, context); SetSpawnCommand.register(this.dispatcher); SetWorldSpawnCommand.register(this.dispatcher); SpectateCommand.register(this.dispatcher); SpreadPlayersCommand.register(this.dispatcher); StopSoundCommand.register(this.dispatcher); StopwatchCommand.register(this.dispatcher); SummonCommand.register(this.dispatcher, context); TagCommand.register(this.dispatcher); TeamCommand.register(this.dispatcher, context); TeamMsgCommand.register(this.dispatcher); TeleportCommand.register(this.dispatcher); TellRawCommand.register(this.dispatcher, context); TestCommand.register(this.dispatcher, context); TickCommand.register(this.dispatcher); TimeCommand.register(this.dispatcher); TitleCommand.register(this.dispatcher, context); TriggerCommand.register(this.dispatcher); WaypointCommand.register(this.dispatcher, context); WeatherCommand.register(this.dispatcher); WorldBorderCommand.register(this.dispatcher); if (JvmProfiler.INSTANCE.isAvailable()) { JfrCommand.register(this.dispatcher); } if (SharedConstants.DEBUG_CHASE_COMMAND) { ChaseCommand.register(this.dispatcher); } if (SharedConstants.DEBUG_DEV_COMMANDS || SharedConstants.IS_RUNNING_IN_IDE) { RaidCommand.register(this.dispatcher, context); DebugPathCommand.register(this.dispatcher); DebugMobSpawningCommand.register(this.dispatcher); WardenSpawnTrackerCommand.register(this.dispatcher); SpawnArmorTrimsCommand.register(this.dispatcher); ServerPackCommand.register(this.dispatcher); if (commandSelection.includeDedicated) { DebugConfigCommand.register(this.dispatcher, context); } } if (commandSelection.includeDedicated) { BanIpCommands.register(this.dispatcher); BanListCommands.register(this.dispatcher); BanPlayerCommands.register(this.dispatcher); DeOpCommands.register(this.dispatcher); OpCommand.register(this.dispatcher); PardonCommand.register(this.dispatcher); PardonIpCommand.register(this.dispatcher); PerfCommand.register(this.dispatcher); SaveAllCommand.register(this.dispatcher); SaveOffCommand.register(this.dispatcher); SaveOnCommand.register(this.dispatcher); SetPlayerIdleTimeoutCommand.register(this.dispatcher); StopCommand.register(this.dispatcher); TransferCommand.register(this.dispatcher); WhitelistCommand.register(this.dispatcher); } if (commandSelection.includeIntegrated) { PublishCommand.register(this.dispatcher); } this.dispatcher.setConsumer(ExecutionCommandSource.resultConsumer()); } public static ParseResults mapSource(ParseResults parse, UnaryOperator sourceOperator) { CommandContextBuilder context = parse.getContext(); CommandContextBuilder source = context.withSource(sourceOperator.apply(context.getSource())); return new ParseResults(source, parse.getReader(), parse.getExceptions()); } public void performPrefixedCommand(CommandSourceStack sender, String command) { command = Commands.trimOptionalPrefix(command); this.performCommand((ParseResults)this.dispatcher.parse(command, (Object)sender), command); } public static String trimOptionalPrefix(String command) { return command.startsWith(COMMAND_PREFIX) ? command.substring(1) : command; } /* * WARNING - Removed try catching itself - possible behaviour change. */ public void performCommand(ParseResults command, String commandString) { CommandSourceStack sender = (CommandSourceStack)command.getContext().getSource(); Profiler.get().push(() -> COMMAND_PREFIX + commandString); ContextChain commandChain = Commands.finishParsing(command, commandString, sender); try { if (commandChain != null) { Commands.executeCommandInContext(sender, executionContext -> ExecutionContext.queueInitialCommandExecution(executionContext, commandString, commandChain, sender, CommandResultCallback.EMPTY)); } } catch (Exception e) { MutableComponent hover = Component.literal(e.getMessage() == null ? e.getClass().getName() : e.getMessage()); if (LOGGER.isDebugEnabled()) { LOGGER.error("Command exception: /{}", (Object)commandString, (Object)e); StackTraceElement[] stackTrace = e.getStackTrace(); for (int i = 0; i < Math.min(stackTrace.length, 3); ++i) { hover.append("\n\n").append(stackTrace[i].getMethodName()).append("\n ").append(stackTrace[i].getFileName()).append(":").append(String.valueOf(stackTrace[i].getLineNumber())); } } sender.sendFailure(Component.translatable("command.failed").withStyle(s -> s.withHoverEvent(new HoverEvent.ShowText(hover)))); if (SharedConstants.DEBUG_VERBOSE_COMMAND_ERRORS || SharedConstants.IS_RUNNING_IN_IDE) { sender.sendFailure(Component.literal(Util.describeError(e))); LOGGER.error("'/{}' threw an exception", (Object)commandString, (Object)e); } } finally { Profiler.get().pop(); } } private static @Nullable ContextChain finishParsing(ParseResults command, String commandString, CommandSourceStack sender) { try { Commands.validateParseResults(command); return (ContextChain)ContextChain.tryFlatten((CommandContext)command.getContext().build(commandString)).orElseThrow(() -> CommandSyntaxException.BUILT_IN_EXCEPTIONS.dispatcherUnknownCommand().createWithContext(command.getReader())); } catch (CommandSyntaxException e) { sender.sendFailure(ComponentUtils.fromMessage(e.getRawMessage())); if (e.getInput() != null && e.getCursor() >= 0) { int cursor = Math.min(e.getInput().length(), e.getCursor()); MutableComponent context = Component.empty().withStyle(ChatFormatting.GRAY).withStyle(s -> s.withClickEvent(new ClickEvent.SuggestCommand(COMMAND_PREFIX + commandString))); if (cursor > 10) { context.append(CommonComponents.ELLIPSIS); } context.append(e.getInput().substring(Math.max(0, cursor - 10), cursor)); if (cursor < e.getInput().length()) { MutableComponent remaining = Component.literal(e.getInput().substring(cursor)).withStyle(ChatFormatting.RED, ChatFormatting.UNDERLINE); context.append(remaining); } context.append(Component.translatable("command.context.here").withStyle(ChatFormatting.RED, ChatFormatting.ITALIC)); sender.sendFailure(context); } return null; } } /* * WARNING - Removed try catching itself - possible behaviour change. */ public static void executeCommandInContext(CommandSourceStack context, Consumer> config) { block9: { boolean isTopContext; ExecutionContext currentContext = CURRENT_EXECUTION_CONTEXT.get(); boolean bl = isTopContext = currentContext == null; if (isTopContext) { GameRules gameRules = context.getLevel().getGameRules(); int chainLimit = Math.max(1, gameRules.get(GameRules.MAX_COMMAND_SEQUENCE_LENGTH)); int forkLimit = gameRules.get(GameRules.MAX_COMMAND_FORKS); try (ExecutionContext executionContext = new ExecutionContext(chainLimit, forkLimit, Profiler.get());){ CURRENT_EXECUTION_CONTEXT.set(executionContext); config.accept(executionContext); executionContext.runCommandQueue(); break block9; } finally { CURRENT_EXECUTION_CONTEXT.set(null); } } config.accept(currentContext); } } public void sendCommands(ServerPlayer player) { HashMap playerCommands = new HashMap(); RootCommandNode root = new RootCommandNode(); playerCommands.put((CommandNode)this.dispatcher.getRoot(), (CommandNode)root); Commands.fillUsableCommands(this.dispatcher.getRoot(), root, player.createCommandSourceStack(), playerCommands); player.connection.send(new ClientboundCommandsPacket(root, COMMAND_NODE_INSPECTOR)); } private static void fillUsableCommands(CommandNode source, CommandNode target, S commandFilter, Map, CommandNode> converted) { for (CommandNode child : source.getChildren()) { if (!child.canUse(commandFilter)) continue; ArgumentBuilder builder = child.createBuilder(); if (builder.getRedirect() != null) { builder.redirect(converted.get(builder.getRedirect())); } CommandNode node = builder.build(); converted.put(child, node); target.addChild(node); if (child.getChildren().isEmpty()) continue; Commands.fillUsableCommands(child, node, commandFilter, converted); } } public static LiteralArgumentBuilder literal(String literal) { return LiteralArgumentBuilder.literal((String)literal); } public static RequiredArgumentBuilder argument(String name, ArgumentType type) { return RequiredArgumentBuilder.argument((String)name, type); } public static Predicate createValidator(ParseFunction parser) { return value -> { try { parser.parse(new StringReader(value)); return true; } catch (CommandSyntaxException ignored) { return false; } }; } public CommandDispatcher getDispatcher() { return this.dispatcher; } public static void validateParseResults(ParseResults command) throws CommandSyntaxException { CommandSyntaxException parseException = Commands.getParseException(command); if (parseException != null) { throw parseException; } } public static @Nullable CommandSyntaxException getParseException(ParseResults parse) { if (!parse.getReader().canRead()) { return null; } if (parse.getExceptions().size() == 1) { return (CommandSyntaxException)((Object)parse.getExceptions().values().iterator().next()); } if (parse.getContext().getRange().isEmpty()) { return CommandSyntaxException.BUILT_IN_EXCEPTIONS.dispatcherUnknownCommand().createWithContext(parse.getReader()); } return CommandSyntaxException.BUILT_IN_EXCEPTIONS.dispatcherUnknownArgument().createWithContext(parse.getReader()); } public static CommandBuildContext createValidationContext(final HolderLookup.Provider registries) { return new CommandBuildContext(){ @Override public FeatureFlagSet enabledFeatures() { return FeatureFlags.REGISTRY.allFlags(); } @Override public Stream>> listRegistryKeys() { return registries.listRegistryKeys(); } public Optional> lookup(ResourceKey> key) { return registries.lookup(key).map(this::createLookup); } private HolderLookup.RegistryLookup.Delegate createLookup(final HolderLookup.RegistryLookup original) { return new HolderLookup.RegistryLookup.Delegate(this){ @Override public HolderLookup.RegistryLookup parent() { return original; } @Override public Optional> get(TagKey id) { return Optional.of(this.getOrThrow(id)); } @Override public HolderSet.Named getOrThrow(TagKey id) { Optional> tag = this.parent().get(id); return tag.orElseGet(() -> HolderSet.emptyNamed(this.parent(), id)); } }; } }; } public static void validate() { CommandBuildContext context = Commands.createValidationContext(VanillaRegistries.createLookup()); CommandDispatcher dispatcher = new Commands(CommandSelection.ALL, context).getDispatcher(); RootCommandNode root = dispatcher.getRoot(); dispatcher.findAmbiguities((parent, child, sibling, ambiguities) -> LOGGER.warn("Ambiguity between arguments {} and {} with inputs: {}", new Object[]{dispatcher.getPath(child), dispatcher.getPath(sibling), ambiguities})); Set> usedArgumentTypes = ArgumentUtils.findUsedArgumentTypes(root); Set unregisteredTypes = usedArgumentTypes.stream().filter(arg -> !ArgumentTypeInfos.isClassRecognized(arg.getClass())).collect(Collectors.toSet()); if (!unregisteredTypes.isEmpty()) { LOGGER.warn("Missing type registration for following arguments:\n {}", (Object)unregisteredTypes.stream().map(arg -> "\t" + String.valueOf(arg)).collect(Collectors.joining(",\n"))); throw new IllegalStateException("Unregistered argument types"); } } public static PermissionProviderCheck hasPermission(PermissionCheck permission) { return new PermissionProviderCheck(permission); } public static CommandSourceStack createCompilationContext(PermissionSet compilationPermissions) { return new CommandSourceStack(CommandSource.NULL, Vec3.ZERO, Vec2.ZERO, null, compilationPermissions, "", CommonComponents.EMPTY, null, null); } public static enum CommandSelection { ALL(true, true), DEDICATED(false, true), INTEGRATED(true, false); private final boolean includeIntegrated; private final boolean includeDedicated; private CommandSelection(boolean includeIntegrated, boolean includeDedicated) { this.includeIntegrated = includeIntegrated; this.includeDedicated = includeDedicated; } } @FunctionalInterface public static interface ParseFunction { public void parse(StringReader var1) throws CommandSyntaxException; } }