====== Создание блока заполняемым водой ====== Чтобы сделать блоки заполняемыми водой, реализуйте интерфейс ''Waterloggable'' и переопределите некоторые методы. public class VerticalSlabBlock extends HorizontalFacingBlock implements Waterloggable { [...] } В этом случае мы сохраняем ''Properties.WATERLOGGED'' как статическое поле в этом классе, и вы можете использовать ''WATERLOGGED'' для доступа к полю. (Как бы ненужно это ни выглядело, большинство классов блоков ванильного Майнкрафта делают это, поэтому мы делаем то же самое. Конечно, вы можете отказаться от этого и использовать ''Properties.WATERLOGGED'' каждый раз, чтобы получить к нему доступ, или просто напрямую импортировать статическое поле.) Мы должны вручную заставить блок распознавать свойство, так как это не делается для вас с помощью интерфейса ''Waterloggable''. // Обратите внимание, что ''Properties'' - это net.minecraft.state.property.Properties. Не импортируйте неправильный файл. public static final BooleanProperty WATERLOGGED = Properties.WATERLOGGED; // Пусть значение свойства WATERLOGGED по умолчанию станет ``false`` public VerticalSlabBlock(Settings settings) { super(settings); setDefaultState(this.stateManager.getDefaultState() .with(Properties.HORIZONTAL_FACING, Direction.NORTH) .with(WATERLOGGED, false); } // Заставьте блок распознавать свойство, в противном случае установка свойства приведет к ошибкам. @Override protected void appendProperties(StateManager.Builder stateManager) { stateManager.add(Properties.HORIZONTAL_FACING, WATERLOGGED); } Мы также должны переопределить ''getPlacementState'', чтобы блок, помещенный в воду, изначально был заполненным. @Override public BlockState getPlacementState(ItemPlacementContext ctx) { return (BlockState)this.getDefaultState() .with(Properties.HORIZONTAL_FACING, ctx.getPlayerFacing().getOpposite()) .with(WATERLOGGED, ctx.getWorld().getFluidState(ctx.getBlockPos()).getFluid() == Fluids.WATER); } Переопределите ''getFluidState'', чтобы при затоплении блока отображалась вода. @Override public FluidState getFluidState(BlockState state) { return state.get(WATERLOGGED) ? Fluids.WATER.getStill(false) : super.getFluidState(state); } Переопределите ''getStateForNeighborUpdate'', чтобы он правильно обрабатывал поток воды. @Override public BlockState getStateForNeighborUpdate(BlockState state, Direction direction, BlockState neighborState, WorldAccess world, BlockPos pos, BlockPos neighborPos) { if (state.get(WATERLOGGED)) { // Это для 1.17 и ниже: world.getFluidTickScheduler().schedule(pos, Fluids.WATER, Fluids.WATER.getTickRate(world)); world.createAndScheduleFluidTick(pos, Fluids.WATER, Fluids.WATER.getTickRate(world)); } return super.getStateForNeighborUpdate(state, direction, neighborState, world, pos, neighborPos); } Теперь блок становится заполняемым и корректно работает с водой.