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

69 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.stream.Stream;
import net.minecraft.commands.CommandSourceStack;
import net.minecraft.commands.arguments.coordinates.BlockPosArgument;
import net.minecraft.commands.arguments.coordinates.Coordinates;
import net.minecraft.core.BlockPos;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.server.level.ServerLevel;
import net.minecraft.world.level.block.entity.BlockEntity;
import org.jetbrains.annotations.Nullable;
public record BlockDataSource(String posPattern, @Nullable Coordinates compiledPos) implements DataSource {
public static final MapCodec<BlockDataSource> SUB_CODEC = RecordCodecBuilder.mapCodec(
instance -> instance.group(Codec.STRING.fieldOf("block").forGetter(BlockDataSource::posPattern)).apply(instance, BlockDataSource::new)
);
public static final DataSource.Type<BlockDataSource> TYPE = new DataSource.Type<>(SUB_CODEC, "block");
public BlockDataSource(String posPattern) {
this(posPattern, compilePos(posPattern));
}
@Nullable
private static Coordinates compilePos(String posPattern) {
try {
return BlockPosArgument.blockPos().parse(new StringReader(posPattern));
} catch (CommandSyntaxException var2) {
return null;
}
}
@Override
public Stream<CompoundTag> getData(CommandSourceStack source) {
if (this.compiledPos != null) {
ServerLevel serverLevel = source.getLevel();
BlockPos blockPos = this.compiledPos.getBlockPos(source);
if (serverLevel.isLoaded(blockPos)) {
BlockEntity blockEntity = serverLevel.getBlockEntity(blockPos);
if (blockEntity != null) {
return Stream.of(blockEntity.saveWithFullMetadata(source.registryAccess()));
}
}
}
return Stream.empty();
}
@Override
public DataSource.Type<?> type() {
return TYPE;
}
public String toString() {
return "block=" + this.posPattern;
}
public boolean equals(Object object) {
return this == object ? true : object instanceof BlockDataSource blockDataSource && this.posPattern.equals(blockDataSource.posPattern);
}
public int hashCode() {
return this.posPattern.hashCode();
}
}