148 lines
6.6 KiB
Java
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);
|
|
}
|
|
}
|
|
|