minecraft-src/net/minecraft/network/chat/contents/EntityDataSource.java
2025-07-04 01:41:11 +03:00

64 lines
2.3 KiB
Java

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<EntityDataSource> SUB_CODEC = RecordCodecBuilder.mapCodec(
instance -> instance.group(Codec.STRING.fieldOf("entity").forGetter(EntityDataSource::selectorPattern)).apply(instance, EntityDataSource::new)
);
public static final DataSource.Type<EntityDataSource> 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<CompoundTag> getData(CommandSourceStack source) throws CommandSyntaxException {
if (this.compiledSelector != null) {
List<? extends Entity> 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();
}
}