package net.minecraft.world.level.material; import com.mojang.serialization.Codec; import com.mojang.serialization.MapCodec; import it.unimi.dsi.fastutil.objects.Reference2ObjectArrayMap; import java.util.stream.Stream; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.Holder; import net.minecraft.core.HolderSet; import net.minecraft.core.particles.ParticleOptions; import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.server.level.ServerLevel; import net.minecraft.tags.TagKey; import net.minecraft.util.RandomSource; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.InsideBlockEffectApplier; import net.minecraft.world.level.BlockGetter; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.StateHolder; import net.minecraft.world.level.block.state.properties.Property; import net.minecraft.world.phys.AABB; import net.minecraft.world.phys.Vec3; import net.minecraft.world.phys.shapes.VoxelShape; import org.jetbrains.annotations.Nullable; public final class FluidState extends StateHolder { public static final Codec CODEC = codec(BuiltInRegistries.FLUID.byNameCodec(), Fluid::defaultFluidState).stable(); public static final int AMOUNT_MAX = 9; public static final int AMOUNT_FULL = 8; public FluidState(Fluid owner, Reference2ObjectArrayMap, Comparable> values, MapCodec propertiesCodec) { super(owner, values, propertiesCodec); } public Fluid getType() { return this.owner; } public boolean isSource() { return this.getType().isSource(this); } public boolean isSourceOfType(Fluid fluid) { return this.owner == fluid && this.owner.isSource(this); } public boolean isEmpty() { return this.getType().isEmpty(); } public float getHeight(BlockGetter level, BlockPos pos) { return this.getType().getHeight(this, level, pos); } public float getOwnHeight() { return this.getType().getOwnHeight(this); } public int getAmount() { return this.getType().getAmount(this); } public boolean shouldRenderBackwardUpFace(BlockGetter level, BlockPos pos) { for (int i = -1; i <= 1; i++) { for (int j = -1; j <= 1; j++) { BlockPos blockPos = pos.offset(i, 0, j); FluidState fluidState = level.getFluidState(blockPos); if (!fluidState.getType().isSame(this.getType()) && !level.getBlockState(blockPos).isSolidRender()) { return true; } } } return false; } public void tick(ServerLevel level, BlockPos pos, BlockState state) { this.getType().tick(level, pos, state, this); } public void animateTick(Level level, BlockPos pos, RandomSource random) { this.getType().animateTick(level, pos, this, random); } public boolean isRandomlyTicking() { return this.getType().isRandomlyTicking(); } public void randomTick(ServerLevel level, BlockPos pos, RandomSource random) { this.getType().randomTick(level, pos, this, random); } public Vec3 getFlow(BlockGetter level, BlockPos pos) { return this.getType().getFlow(level, pos, this); } public BlockState createLegacyBlock() { return this.getType().createLegacyBlock(this); } @Nullable public ParticleOptions getDripParticle() { return this.getType().getDripParticle(); } public boolean is(TagKey tag) { return this.getType().builtInRegistryHolder().is(tag); } public boolean is(HolderSet fluids) { return fluids.contains(this.getType().builtInRegistryHolder()); } public boolean is(Fluid fluid) { return this.getType() == fluid; } public float getExplosionResistance() { return this.getType().getExplosionResistance(); } public boolean canBeReplacedWith(BlockGetter level, BlockPos pos, Fluid fluid, Direction direction) { return this.getType().canBeReplacedWith(this, level, pos, fluid, direction); } public VoxelShape getShape(BlockGetter level, BlockPos pos) { return this.getType().getShape(this, level, pos); } @Nullable public AABB getAABB(BlockGetter level, BlockPos pos) { return this.getType().getAABB(this, level, pos); } public Holder holder() { return this.owner.builtInRegistryHolder(); } public Stream> getTags() { return this.owner.builtInRegistryHolder().tags(); } public void entityInside(Level level, BlockPos pos, Entity entity, InsideBlockEffectApplier effectApplier) { this.getType().entityInside(level, pos, entity, effectApplier); } }