minecraft-src/net/minecraft/network/chat/contents/SelectorContents.java
2025-07-04 02:00:41 +03:00

58 lines
2.4 KiB
Java

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<Component> separator) implements ComponentContents {
public static final MapCodec<SelectorContents> 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<SelectorContents> 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<? extends Component> optional = ComponentUtils.updateForEntity(nbtPathPattern, this.separator, entity, recursionDepth);
return ComponentUtils.formatList(this.selector.resolved().findEntities(nbtPathPattern), optional, Entity::getDisplayName);
}
}
@Override
public <T> Optional<T> visit(StyledContentConsumer<T> styledContentConsumer, Style style) {
return styledContentConsumer.accept(style, this.selector.pattern());
}
@Override
public <T> Optional<T> visit(ContentConsumer<T> contentConsumer) {
return contentConsumer.accept(this.selector.pattern());
}
public String toString() {
return "pattern{" + this.selector + "}";
}
}