package net.minecraft.network.chat.contents; import com.mojang.brigadier.StringReader; import com.mojang.brigadier.exceptions.CommandSyntaxException; import com.mojang.serialization.Codec; import com.mojang.serialization.MapCodec; import com.mojang.serialization.codecs.RecordCodecBuilder; import java.util.List; import java.util.stream.Stream; import net.minecraft.advancements.critereon.NbtPredicate; import net.minecraft.commands.CommandSourceStack; import net.minecraft.commands.arguments.selector.EntitySelector; import net.minecraft.commands.arguments.selector.EntitySelectorParser; import net.minecraft.nbt.CompoundTag; import net.minecraft.world.entity.Entity; import org.jetbrains.annotations.Nullable; public record EntityDataSource(String selectorPattern, @Nullable EntitySelector compiledSelector) implements DataSource { public static final MapCodec SUB_CODEC = RecordCodecBuilder.mapCodec( instance -> instance.group(Codec.STRING.fieldOf("entity").forGetter(EntityDataSource::selectorPattern)).apply(instance, EntityDataSource::new) ); public static final DataSource.Type TYPE = new DataSource.Type<>(SUB_CODEC, "entity"); public EntityDataSource(String selectorPattern) { this(selectorPattern, compileSelector(selectorPattern)); } @Nullable private static EntitySelector compileSelector(String selectorPattern) { try { EntitySelectorParser entitySelectorParser = new EntitySelectorParser(new StringReader(selectorPattern), true); return entitySelectorParser.parse(); } catch (CommandSyntaxException var2) { return null; } } @Override public Stream getData(CommandSourceStack source) throws CommandSyntaxException { if (this.compiledSelector != null) { List list = this.compiledSelector.findEntities(source); return list.stream().map(NbtPredicate::getEntityTagToCompare); } else { return Stream.empty(); } } @Override public DataSource.Type type() { return TYPE; } public String toString() { return "entity=" + this.selectorPattern; } public boolean equals(Object object) { return this == object ? true : object instanceof EntityDataSource entityDataSource && this.selectorPattern.equals(entityDataSource.selectorPattern); } public int hashCode() { return this.selectorPattern.hashCode(); } }