2025-11-24 22:52:51 +03:00

148 lines
6.6 KiB
Java

/*
* 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<LayeredCauldronBlock> 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<LayeredCauldronBlock> 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<Block, BlockState> 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);
}
}