package net.minecraft.commands.arguments; import com.google.common.collect.Iterables; import com.google.gson.JsonObject; import com.mojang.brigadier.StringReader; import com.mojang.brigadier.arguments.ArgumentType; import com.mojang.brigadier.context.CommandContext; import com.mojang.brigadier.exceptions.CommandSyntaxException; import com.mojang.brigadier.exceptions.SimpleCommandExceptionType; import com.mojang.brigadier.suggestion.Suggestions; import com.mojang.brigadier.suggestion.SuggestionsBuilder; import java.util.Arrays; import java.util.Collection; import java.util.List; import java.util.concurrent.CompletableFuture; import net.minecraft.commands.CommandSourceStack; import net.minecraft.commands.SharedSuggestionProvider; import net.minecraft.commands.arguments.selector.EntitySelector; import net.minecraft.commands.arguments.selector.EntitySelectorParser; import net.minecraft.commands.synchronization.ArgumentTypeInfo; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.network.chat.Component; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.entity.Entity; public class EntityArgument implements ArgumentType { private static final Collection EXAMPLES = Arrays.asList("Player", "0123", "@e", "@e[type=foo]", "dd12be42-52a9-4a91-a8a1-11c01849e498"); public static final SimpleCommandExceptionType ERROR_NOT_SINGLE_ENTITY = new SimpleCommandExceptionType(Component.translatable("argument.entity.toomany")); public static final SimpleCommandExceptionType ERROR_NOT_SINGLE_PLAYER = new SimpleCommandExceptionType(Component.translatable("argument.player.toomany")); public static final SimpleCommandExceptionType ERROR_ONLY_PLAYERS_ALLOWED = new SimpleCommandExceptionType(Component.translatable("argument.player.entities")); public static final SimpleCommandExceptionType NO_ENTITIES_FOUND = new SimpleCommandExceptionType(Component.translatable("argument.entity.notfound.entity")); public static final SimpleCommandExceptionType NO_PLAYERS_FOUND = new SimpleCommandExceptionType(Component.translatable("argument.entity.notfound.player")); public static final SimpleCommandExceptionType ERROR_SELECTORS_NOT_ALLOWED = new SimpleCommandExceptionType( Component.translatable("argument.entity.selector.not_allowed") ); final boolean single; final boolean playersOnly; protected EntityArgument(boolean single, boolean playersOnly) { this.single = single; this.playersOnly = playersOnly; } public static EntityArgument entity() { return new EntityArgument(true, false); } public static Entity getEntity(CommandContext context, String name) throws CommandSyntaxException { return context.getArgument(name, EntitySelector.class).findSingleEntity(context.getSource()); } public static EntityArgument entities() { return new EntityArgument(false, false); } public static Collection getEntities(CommandContext context, String name) throws CommandSyntaxException { Collection collection = getOptionalEntities(context, name); if (collection.isEmpty()) { throw NO_ENTITIES_FOUND.create(); } else { return collection; } } public static Collection getOptionalEntities(CommandContext context, String name) throws CommandSyntaxException { return context.getArgument(name, EntitySelector.class).findEntities(context.getSource()); } public static Collection getOptionalPlayers(CommandContext context, String name) throws CommandSyntaxException { return context.getArgument(name, EntitySelector.class).findPlayers(context.getSource()); } public static EntityArgument player() { return new EntityArgument(true, true); } public static ServerPlayer getPlayer(CommandContext context, String name) throws CommandSyntaxException { return context.getArgument(name, EntitySelector.class).findSinglePlayer(context.getSource()); } public static EntityArgument players() { return new EntityArgument(false, true); } public static Collection getPlayers(CommandContext context, String name) throws CommandSyntaxException { List list = context.getArgument(name, EntitySelector.class).findPlayers(context.getSource()); if (list.isEmpty()) { throw NO_PLAYERS_FOUND.create(); } else { return list; } } public EntitySelector parse(StringReader reader) throws CommandSyntaxException { return this.parse(reader, true); } public EntitySelector parse(StringReader stringReader, S object) throws CommandSyntaxException { return this.parse(stringReader, EntitySelectorParser.allowSelectors(object)); } private EntitySelector parse(StringReader reader, boolean allowSelectors) throws CommandSyntaxException { int i = 0; EntitySelectorParser entitySelectorParser = new EntitySelectorParser(reader, allowSelectors); EntitySelector entitySelector = entitySelectorParser.parse(); if (entitySelector.getMaxResults() > 1 && this.single) { if (this.playersOnly) { reader.setCursor(0); throw ERROR_NOT_SINGLE_PLAYER.createWithContext(reader); } else { reader.setCursor(0); throw ERROR_NOT_SINGLE_ENTITY.createWithContext(reader); } } else if (entitySelector.includesEntities() && this.playersOnly && !entitySelector.isSelfSelector()) { reader.setCursor(0); throw ERROR_ONLY_PLAYERS_ALLOWED.createWithContext(reader); } else { return entitySelector; } } @Override public CompletableFuture listSuggestions(CommandContext commandContext, SuggestionsBuilder suggestionsBuilder) { if (commandContext.getSource() instanceof SharedSuggestionProvider sharedSuggestionProvider) { StringReader stringReader = new StringReader(suggestionsBuilder.getInput()); stringReader.setCursor(suggestionsBuilder.getStart()); EntitySelectorParser entitySelectorParser = new EntitySelectorParser(stringReader, EntitySelectorParser.allowSelectors(sharedSuggestionProvider)); try { entitySelectorParser.parse(); } catch (CommandSyntaxException var7) { } return entitySelectorParser.fillSuggestions( suggestionsBuilder, suggestionsBuilderx -> { Collection collection = sharedSuggestionProvider.getOnlinePlayerNames(); Iterable iterable = (Iterable)(this.playersOnly ? collection : Iterables.concat(collection, sharedSuggestionProvider.getSelectedEntities())); SharedSuggestionProvider.suggest(iterable, suggestionsBuilderx); } ); } else { return Suggestions.empty(); } } @Override public Collection getExamples() { return EXAMPLES; } public static class Info implements ArgumentTypeInfo { private static final byte FLAG_SINGLE = 1; private static final byte FLAG_PLAYERS_ONLY = 2; public void serializeToNetwork(net.minecraft.commands.arguments.EntityArgument.Info.Template template, FriendlyByteBuf friendlyByteBuf) { int i = 0; if (template.single) { i |= 1; } if (template.playersOnly) { i |= 2; } friendlyByteBuf.writeByte(i); } public net.minecraft.commands.arguments.EntityArgument.Info.Template deserializeFromNetwork(FriendlyByteBuf friendlyByteBuf) { byte b = friendlyByteBuf.readByte(); return new net.minecraft.commands.arguments.EntityArgument.Info.Template(this, (b & 1) != 0, (b & 2) != 0); } public void serializeToJson(net.minecraft.commands.arguments.EntityArgument.Info.Template template, JsonObject jsonObject) { jsonObject.addProperty("amount", template.single ? "single" : "multiple"); jsonObject.addProperty("type", template.playersOnly ? "players" : "entities"); } public net.minecraft.commands.arguments.EntityArgument.Info.Template unpack(EntityArgument entityArgument) { return new net.minecraft.commands.arguments.EntityArgument.Info.Template(this, entityArgument.single, entityArgument.playersOnly); } } }