69 lines
		
	
	
	
		
			2.3 KiB
		
	
	
	
		
			Java
		
	
	
	
	
	
			
		
		
	
	
			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();
 | |
| 	}
 | |
| }
 |