/* * Decompiled with CFR 0.152. * * Could not load the following classes: * com.mojang.datafixers.kinds.App * com.mojang.datafixers.kinds.Applicative * com.mojang.serialization.MapCodec * com.mojang.serialization.codecs.RecordCodecBuilder */ package net.minecraft.world.level.block; import com.mojang.datafixers.kinds.App; import com.mojang.datafixers.kinds.Applicative; import com.mojang.serialization.MapCodec; import com.mojang.serialization.codecs.RecordCodecBuilder; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.cauldron.CauldronInteraction; import net.minecraft.server.level.ServerLevel; import net.minecraft.util.Util; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.InsideBlockEffectApplier; import net.minecraft.world.entity.InsideBlockEffectType; import net.minecraft.world.level.BlockGetter; import net.minecraft.world.level.Level; import net.minecraft.world.level.biome.Biome; import net.minecraft.world.level.block.AbstractCauldronBlock; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.CauldronBlock; import net.minecraft.world.level.block.state.BlockBehaviour; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.StateDefinition; import net.minecraft.world.level.block.state.properties.BlockStateProperties; import net.minecraft.world.level.block.state.properties.IntegerProperty; import net.minecraft.world.level.gameevent.GameEvent; import net.minecraft.world.level.material.Fluid; import net.minecraft.world.level.material.Fluids; import net.minecraft.world.phys.shapes.Shapes; import net.minecraft.world.phys.shapes.VoxelShape; public class LayeredCauldronBlock extends AbstractCauldronBlock { public static final MapCodec CODEC = RecordCodecBuilder.mapCodec(i -> i.group((App)Biome.Precipitation.CODEC.fieldOf("precipitation").forGetter(b -> b.precipitationType), (App)CauldronInteraction.CODEC.fieldOf("interactions").forGetter(b -> b.interactions), LayeredCauldronBlock.propertiesCodec()).apply((Applicative)i, LayeredCauldronBlock::new)); public static final int MIN_FILL_LEVEL = 1; public static final int MAX_FILL_LEVEL = 3; public static final IntegerProperty LEVEL = BlockStateProperties.LEVEL_CAULDRON; private static final int BASE_CONTENT_HEIGHT = 6; private static final double HEIGHT_PER_LEVEL = 3.0; private static final VoxelShape[] FILLED_SHAPES = Util.make(() -> Block.boxes(2, level -> Shapes.or(AbstractCauldronBlock.SHAPE, Block.column(12.0, 4.0, LayeredCauldronBlock.getPixelContentHeight(level + 1))))); private final Biome.Precipitation precipitationType; public MapCodec codec() { return CODEC; } public LayeredCauldronBlock(Biome.Precipitation precipitationType, CauldronInteraction.InteractionMap interactionMap, BlockBehaviour.Properties properties) { super(properties, interactionMap); this.precipitationType = precipitationType; this.registerDefaultState((BlockState)((BlockState)this.stateDefinition.any()).setValue(LEVEL, 1)); } @Override public boolean isFull(BlockState state) { return state.getValue(LEVEL) == 3; } @Override protected boolean canReceiveStalactiteDrip(Fluid fluid) { return fluid == Fluids.WATER && this.precipitationType == Biome.Precipitation.RAIN; } @Override protected double getContentHeight(BlockState state) { return LayeredCauldronBlock.getPixelContentHeight(state.getValue(LEVEL)) / 16.0; } private static double getPixelContentHeight(int level) { return 6.0 + (double)level * 3.0; } @Override protected VoxelShape getEntityInsideCollisionShape(BlockState state, BlockGetter level, BlockPos pos, Entity entity) { return FILLED_SHAPES[state.getValue(LEVEL) - 1]; } @Override protected void entityInside(BlockState state, Level level, BlockPos pos, Entity entity, InsideBlockEffectApplier effectApplier, boolean isPrecise) { if (level instanceof ServerLevel) { ServerLevel serverLevel = (ServerLevel)level; BlockPos blockPos = pos.immutable(); effectApplier.runBefore(InsideBlockEffectType.EXTINGUISH, e -> { if (e.isOnFire() && e.mayInteract(serverLevel, blockPos)) { this.handleEntityOnFireInside(state, level, blockPos); } }); } effectApplier.apply(InsideBlockEffectType.EXTINGUISH); } private void handleEntityOnFireInside(BlockState state, Level level, BlockPos pos) { if (this.precipitationType == Biome.Precipitation.SNOW) { LayeredCauldronBlock.lowerFillLevel((BlockState)Blocks.WATER_CAULDRON.defaultBlockState().setValue(LEVEL, state.getValue(LEVEL)), level, pos); } else { LayeredCauldronBlock.lowerFillLevel(state, level, pos); } } public static void lowerFillLevel(BlockState state, Level level, BlockPos pos) { int newLevel = state.getValue(LEVEL) - 1; BlockState newState = newLevel == 0 ? Blocks.CAULDRON.defaultBlockState() : (BlockState)state.setValue(LEVEL, newLevel); level.setBlockAndUpdate(pos, newState); level.gameEvent(GameEvent.BLOCK_CHANGE, pos, GameEvent.Context.of(newState)); } @Override public void handlePrecipitation(BlockState state, Level level, BlockPos pos, Biome.Precipitation precipitation) { if (!CauldronBlock.shouldHandlePrecipitation(level, precipitation) || state.getValue(LEVEL) == 3 || precipitation != this.precipitationType) { return; } BlockState newState = (BlockState)state.cycle(LEVEL); level.setBlockAndUpdate(pos, newState); level.gameEvent(GameEvent.BLOCK_CHANGE, pos, GameEvent.Context.of(newState)); } @Override protected int getAnalogOutputSignal(BlockState state, Level level, BlockPos pos, Direction direction) { return state.getValue(LEVEL); } @Override protected void createBlockStateDefinition(StateDefinition.Builder builder) { builder.add(LEVEL); } @Override protected void receiveStalactiteDrip(BlockState state, Level level, BlockPos pos, Fluid fluid) { if (this.isFull(state)) { return; } BlockState newState = (BlockState)state.setValue(LEVEL, state.getValue(LEVEL) + 1); level.setBlockAndUpdate(pos, newState); level.gameEvent(GameEvent.BLOCK_CHANGE, pos, GameEvent.Context.of(newState)); level.levelEvent(1047, pos, 0); } }