Code/net/minecraft/network/chat/contents/BlockDataSource.java

73 lines
2.7 KiB
Java
Raw Permalink Normal View History

2025-07-01 06:20:03 +00:00
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 com.mojang.serialization.codecs.RecordCodecBuilder.Instance;
import java.util.stream.Stream;
import javax.annotation.Nullable;
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;
public record BlockDataSource(String posPattern, @Nullable Coordinates compiledPos) implements DataSource {
public static final MapCodec<BlockDataSource> SUB_CODEC = RecordCodecBuilder.mapCodec(
p_309816_ -> p_309816_.group(Codec.STRING.fieldOf("block").forGetter(BlockDataSource::posPattern)).apply(p_309816_, BlockDataSource::new)
);
public static final DataSource.Type<BlockDataSource> TYPE = new DataSource.Type<>(SUB_CODEC, "block");
public BlockDataSource(String p_237312_) {
this(p_237312_, compilePos(p_237312_));
}
@Nullable
private static Coordinates compilePos(String p_237318_) {
try {
return BlockPosArgument.blockPos().parse(new StringReader(p_237318_));
} catch (CommandSyntaxException commandsyntaxexception) {
return null;
}
}
@Override
public Stream<CompoundTag> getData(CommandSourceStack p_237323_) {
if (this.compiledPos != null) {
ServerLevel serverlevel = p_237323_.getLevel();
BlockPos blockpos = this.compiledPos.getBlockPos(p_237323_);
if (serverlevel.isLoaded(blockpos)) {
BlockEntity blockentity = serverlevel.getBlockEntity(blockpos);
if (blockentity != null) {
return Stream.of(blockentity.saveWithFullMetadata(p_237323_.registryAccess()));
}
}
}
return Stream.empty();
}
@Override
public DataSource.Type<?> type() {
return TYPE;
}
@Override
public String toString() {
return "block=" + this.posPattern;
}
@Override
public boolean equals(Object p_237321_) {
return this == p_237321_ ? true : p_237321_ instanceof BlockDataSource blockdatasource && this.posPattern.equals(blockdatasource.posPattern);
}
@Override
public int hashCode() {
return this.posPattern.hashCode();
}
}