package net.minecraft.network.chat.contents; import com.mojang.brigadier.exceptions.CommandSyntaxException; import com.mojang.serialization.MapCodec; import com.mojang.serialization.codecs.RecordCodecBuilder; import java.util.Optional; import net.minecraft.commands.CommandSourceStack; import net.minecraft.commands.arguments.selector.SelectorPattern; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.ComponentContents; import net.minecraft.network.chat.ComponentSerialization; import net.minecraft.network.chat.ComponentUtils; import net.minecraft.network.chat.MutableComponent; import net.minecraft.network.chat.Style; import net.minecraft.network.chat.FormattedText.ContentConsumer; import net.minecraft.network.chat.FormattedText.StyledContentConsumer; import net.minecraft.world.entity.Entity; import org.jetbrains.annotations.Nullable; public record SelectorContents(SelectorPattern selector, Optional separator) implements ComponentContents { public static final MapCodec CODEC = RecordCodecBuilder.mapCodec( instance -> instance.group( SelectorPattern.CODEC.fieldOf("selector").forGetter(SelectorContents::selector), ComponentSerialization.CODEC.optionalFieldOf("separator").forGetter(SelectorContents::separator) ) .apply(instance, SelectorContents::new) ); public static final ComponentContents.Type TYPE = new ComponentContents.Type<>(CODEC, "selector"); @Override public ComponentContents.Type type() { return TYPE; } @Override public MutableComponent resolve(@Nullable CommandSourceStack nbtPathPattern, @Nullable Entity entity, int recursionDepth) throws CommandSyntaxException { if (nbtPathPattern == null) { return Component.empty(); } else { Optional optional = ComponentUtils.updateForEntity(nbtPathPattern, this.separator, entity, recursionDepth); return ComponentUtils.formatList(this.selector.resolved().findEntities(nbtPathPattern), optional, Entity::getDisplayName); } } @Override public Optional visit(StyledContentConsumer styledContentConsumer, Style style) { return styledContentConsumer.accept(style, this.selector.pattern()); } @Override public Optional visit(ContentConsumer contentConsumer) { return contentConsumer.accept(this.selector.pattern()); } public String toString() { return "pattern{" + this.selector + "}"; } }