Code/net/minecraft/commands/arguments/ScoreHolderArgument.java

233 lines
10 KiB
Java
Raw Normal View History

2025-07-01 06:20:03 +00:00
package net.minecraft.commands.arguments;
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.SuggestionProvider;
import com.mojang.brigadier.suggestion.SuggestionsBuilder;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.UUID;
import java.util.function.Supplier;
import net.minecraft.commands.CommandBuildContext;
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.MinecraftServer;
import net.minecraft.server.level.ServerLevel;
import net.minecraft.server.level.ServerPlayer;
import net.minecraft.world.entity.Entity;
import net.minecraft.world.scores.ScoreHolder;
public class ScoreHolderArgument implements ArgumentType<ScoreHolderArgument.Result> {
public static final SuggestionProvider<CommandSourceStack> SUGGEST_SCORE_HOLDERS = (p_108221_, p_108222_) -> {
StringReader stringreader = new StringReader(p_108222_.getInput());
stringreader.setCursor(p_108222_.getStart());
EntitySelectorParser entityselectorparser = new EntitySelectorParser(stringreader, EntitySelectorParser.allowSelectors(p_108221_.getSource()));
try {
entityselectorparser.parse();
} catch (CommandSyntaxException commandsyntaxexception) {
}
return entityselectorparser.fillSuggestions(p_108222_, p_171606_ -> SharedSuggestionProvider.suggest(p_108221_.getSource().getOnlinePlayerNames(), p_171606_));
};
private static final Collection<String> EXAMPLES = Arrays.asList("Player", "0123", "*", "@e");
private static final SimpleCommandExceptionType ERROR_NO_RESULTS = new SimpleCommandExceptionType(Component.translatable("argument.scoreHolder.empty"));
final boolean multiple;
public ScoreHolderArgument(boolean p_108216_) {
this.multiple = p_108216_;
}
public static ScoreHolder getName(CommandContext<CommandSourceStack> p_108224_, String p_108225_) throws CommandSyntaxException {
return getNames(p_108224_, p_108225_).iterator().next();
}
public static Collection<ScoreHolder> getNames(CommandContext<CommandSourceStack> p_108244_, String p_108245_) throws CommandSyntaxException {
return getNames(p_108244_, p_108245_, Collections::emptyList);
}
public static Collection<ScoreHolder> getNamesWithDefaultWildcard(CommandContext<CommandSourceStack> p_108247_, String p_108248_) throws CommandSyntaxException {
return getNames(p_108247_, p_108248_, p_108247_.getSource().getServer().getScoreboard()::getTrackedPlayers);
}
public static Collection<ScoreHolder> getNames(CommandContext<CommandSourceStack> p_108227_, String p_108228_, Supplier<Collection<ScoreHolder>> p_108229_) throws CommandSyntaxException {
Collection<ScoreHolder> collection = p_108227_.getArgument(p_108228_, ScoreHolderArgument.Result.class).getNames(p_108227_.getSource(), p_108229_);
if (collection.isEmpty()) {
throw EntityArgument.NO_ENTITIES_FOUND.create();
} else {
return collection;
}
}
public static ScoreHolderArgument scoreHolder() {
return new ScoreHolderArgument(false);
}
public static ScoreHolderArgument scoreHolders() {
return new ScoreHolderArgument(true);
}
public ScoreHolderArgument.Result parse(StringReader p_108219_) throws CommandSyntaxException {
return this.parse(p_108219_, true);
}
public <S> ScoreHolderArgument.Result parse(StringReader p_345560_, S p_345549_) throws CommandSyntaxException {
return this.parse(p_345560_, EntitySelectorParser.allowSelectors(p_345549_));
}
private ScoreHolderArgument.Result parse(StringReader p_345561_, boolean p_345551_) throws CommandSyntaxException {
if (p_345561_.canRead() && p_345561_.peek() == '@') {
EntitySelectorParser entityselectorparser = new EntitySelectorParser(p_345561_, p_345551_);
EntitySelector entityselector = entityselectorparser.parse();
if (!this.multiple && entityselector.getMaxResults() > 1) {
throw EntityArgument.ERROR_NOT_SINGLE_ENTITY.createWithContext(p_345561_);
} else {
return new ScoreHolderArgument.SelectorResult(entityselector);
}
} else {
int i = p_345561_.getCursor();
while (p_345561_.canRead() && p_345561_.peek() != ' ') {
p_345561_.skip();
}
String s = p_345561_.getString().substring(i, p_345561_.getCursor());
if (s.equals("*")) {
return (p_108231_, p_108232_) -> {
Collection<ScoreHolder> collection = p_108232_.get();
if (collection.isEmpty()) {
throw ERROR_NO_RESULTS.create();
} else {
return collection;
}
};
} else {
List<ScoreHolder> list = List.of(ScoreHolder.forNameOnly(s));
if (s.startsWith("#")) {
return (p_108237_, p_108238_) -> list;
} else {
try {
UUID uuid = UUID.fromString(s);
return (p_308383_, p_308384_) -> {
MinecraftServer minecraftserver = p_308383_.getServer();
ScoreHolder scoreholder = null;
List<ScoreHolder> list1 = null;
for (ServerLevel serverlevel : minecraftserver.getAllLevels()) {
Entity entity = serverlevel.getEntity(uuid);
if (entity != null) {
if (scoreholder == null) {
scoreholder = entity;
} else {
if (list1 == null) {
list1 = new ArrayList<>();
list1.add(scoreholder);
}
list1.add(entity);
}
}
}
if (list1 != null) {
return list1;
} else {
return scoreholder != null ? List.of(scoreholder) : list;
}
};
} catch (IllegalArgumentException illegalargumentexception) {
return (p_308379_, p_308380_) -> {
MinecraftServer minecraftserver = p_308379_.getServer();
ServerPlayer serverplayer = minecraftserver.getPlayerList().getPlayerByName(s);
return serverplayer != null ? List.of(serverplayer) : list;
};
}
}
}
}
}
@Override
public Collection<String> getExamples() {
return EXAMPLES;
}
public static class Info implements ArgumentTypeInfo<ScoreHolderArgument, ScoreHolderArgument.Info.Template> {
private static final byte FLAG_MULTIPLE = 1;
public void serializeToNetwork(ScoreHolderArgument.Info.Template p_233469_, FriendlyByteBuf p_233470_) {
int i = 0;
if (p_233469_.multiple) {
i |= 1;
}
p_233470_.writeByte(i);
}
public ScoreHolderArgument.Info.Template deserializeFromNetwork(FriendlyByteBuf p_233480_) {
byte b0 = p_233480_.readByte();
boolean flag = (b0 & 1) != 0;
return new ScoreHolderArgument.Info.Template(flag);
}
public void serializeToJson(ScoreHolderArgument.Info.Template p_233466_, JsonObject p_233467_) {
p_233467_.addProperty("amount", p_233466_.multiple ? "multiple" : "single");
}
public ScoreHolderArgument.Info.Template unpack(ScoreHolderArgument p_233472_) {
return new ScoreHolderArgument.Info.Template(p_233472_.multiple);
}
public final class Template implements ArgumentTypeInfo.Template<ScoreHolderArgument> {
final boolean multiple;
Template(final boolean p_233487_) {
this.multiple = p_233487_;
}
public ScoreHolderArgument instantiate(CommandBuildContext p_233490_) {
return new ScoreHolderArgument(this.multiple);
}
@Override
public ArgumentTypeInfo<ScoreHolderArgument, ?> type() {
return Info.this;
}
}
}
@FunctionalInterface
public interface Result {
Collection<ScoreHolder> getNames(CommandSourceStack p_108252_, Supplier<Collection<ScoreHolder>> p_108253_) throws CommandSyntaxException;
}
public static class SelectorResult implements ScoreHolderArgument.Result {
private final EntitySelector selector;
public SelectorResult(EntitySelector p_108256_) {
this.selector = p_108256_;
}
@Override
public Collection<ScoreHolder> getNames(CommandSourceStack p_108258_, Supplier<Collection<ScoreHolder>> p_108259_) throws CommandSyntaxException {
List<? extends Entity> list = this.selector.findEntities(p_108258_);
if (list.isEmpty()) {
throw EntityArgument.NO_ENTITIES_FOUND.create();
} else {
return List.copyOf(list);
}
}
}
}