package net.minecraft.world.level.gameevent; import com.mojang.serialization.MapCodec; import com.mojang.serialization.codecs.RecordCodecBuilder; import io.netty.buffer.ByteBuf; import java.util.Optional; import net.minecraft.core.BlockPos; import net.minecraft.network.codec.StreamCodec; import net.minecraft.world.level.Level; import net.minecraft.world.phys.Vec3; public class BlockPositionSource implements PositionSource { public static final MapCodec CODEC = RecordCodecBuilder.mapCodec( instance -> instance.group(BlockPos.CODEC.fieldOf("pos").forGetter(blockPositionSource -> blockPositionSource.pos)).apply(instance, BlockPositionSource::new) ); public static final StreamCodec STREAM_CODEC = StreamCodec.composite( BlockPos.STREAM_CODEC, blockPositionSource -> blockPositionSource.pos, BlockPositionSource::new ); private final BlockPos pos; public BlockPositionSource(BlockPos pos) { this.pos = pos; } @Override public Optional getPosition(Level level) { return Optional.of(Vec3.atCenterOf(this.pos)); } @Override public PositionSourceType getType() { return PositionSourceType.BLOCK; } public static class Type implements PositionSourceType { @Override public MapCodec codec() { return BlockPositionSource.CODEC; } @Override public StreamCodec streamCodec() { return BlockPositionSource.STREAM_CODEC; } } }