diff options
Diffstat (limited to 'src/main/java/moe/nea/funnyteleporters/ColouredChestBlock.java')
-rw-r--r-- | src/main/java/moe/nea/funnyteleporters/ColouredChestBlock.java | 113 |
1 files changed, 113 insertions, 0 deletions
diff --git a/src/main/java/moe/nea/funnyteleporters/ColouredChestBlock.java b/src/main/java/moe/nea/funnyteleporters/ColouredChestBlock.java new file mode 100644 index 0000000..eb68f95 --- /dev/null +++ b/src/main/java/moe/nea/funnyteleporters/ColouredChestBlock.java @@ -0,0 +1,113 @@ +package moe.nea.funnyteleporters; + +import com.mojang.serialization.MapCodec; +import eu.pb4.polymer.core.api.block.PolymerBlock; +import net.minecraft.block.AbstractBlock; +import net.minecraft.block.AbstractChestBlock; +import net.minecraft.block.Block; +import net.minecraft.block.BlockState; +import net.minecraft.block.Blocks; +import net.minecraft.block.ChestBlock; +import net.minecraft.block.DoubleBlockProperties; +import net.minecraft.block.EnderChestBlock; +import net.minecraft.block.FacingBlock; +import net.minecraft.block.HorizontalFacingBlock; +import net.minecraft.block.Waterloggable; +import net.minecraft.block.entity.BlockEntity; +import net.minecraft.block.entity.ChestBlockEntity; +import net.minecraft.entity.ai.pathing.NavigationType; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.fluid.FluidState; +import net.minecraft.fluid.Fluids; +import net.minecraft.item.ItemPlacementContext; +import net.minecraft.state.StateManager; +import net.minecraft.state.property.Properties; +import net.minecraft.state.property.Property; +import net.minecraft.text.Text; +import net.minecraft.util.ActionResult; +import net.minecraft.util.BlockMirror; +import net.minecraft.util.BlockRotation; +import net.minecraft.util.hit.BlockHitResult; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.Direction; +import net.minecraft.world.World; +import net.minecraft.world.WorldAccess; + +public class ColouredChestBlock extends AbstractChestBlock<ColouredChestBlockEntity> implements PolymerBlock, Waterloggable { + static Property<Direction> FACING = HorizontalFacingBlock.FACING; + static Property<Boolean> WATERLOGGED = Properties.WATERLOGGED; + + public ColouredChestBlock(Settings settings) { + super(settings, () -> FunnyRegistry.COLOURED_CHEST_ENTITY); + setDefaultState(getStateManager() + .getDefaultState() + .with(FACING, Direction.NORTH) + .with(WATERLOGGED, false)); + } + + @Override + public BlockState getPolymerBlockState(BlockState blockState) { + return Blocks.CHEST.getStateWithProperties(blockState); + } + + @Override + public BlockEntity createBlockEntity(BlockPos pos, BlockState state) { + return new ColouredChestBlockEntity(pos, state); + } + + @Override + public BlockState getPlacementState(ItemPlacementContext ctx) { + return getDefaultState().with(FACING, ctx.getHorizontalPlayerFacing().getOpposite()).with(WATERLOGGED, ctx.getWorld().getFluidState(ctx.getBlockPos()).getFluid() == Fluids.WATER); + } + + @Override + protected ActionResult onUse(BlockState state, World world, BlockPos pos, PlayerEntity player, BlockHitResult hit) { + // TODO: create a ui or something to configure frequency + player.sendMessage(Text.literal("Ender Chest geƶffnet" + player)); + return super.onUse(state, world, pos, player, hit); + } + + @Override + protected BlockState rotate(BlockState state, BlockRotation rotation) { + return state.with(FACING, rotation.rotate(state.get(FACING))); + } + + @Override + protected BlockState mirror(BlockState state, BlockMirror mirror) { + return state.rotate(mirror.getRotation(state.get(FACING))); + } + + @Override + protected void appendProperties(StateManager.Builder<Block, BlockState> builder) { + builder.add(FACING, WATERLOGGED); + } + + @Override + protected FluidState getFluidState(BlockState state) { + return state.get(WATERLOGGED) ? Fluids.WATER.getStill(false) : super.getFluidState(state); + } + + @Override + protected BlockState getStateForNeighborUpdate(BlockState state, Direction direction, BlockState neighborState, WorldAccess world, BlockPos pos, BlockPos neighborPos) { + if (state.get(WATERLOGGED)) + world.scheduleFluidTick(pos, Fluids.WATER, Fluids.WATER.getTickRate(world)); + return super.getStateForNeighborUpdate(state, direction, neighborState, world, pos, neighborPos); + } + + @Override + protected boolean canPathfindThrough(BlockState state, NavigationType type) { + return false; + } + + static final MapCodec<ColouredChestBlock> CODEC = createCodec(ColouredChestBlock::new); + + @Override + protected MapCodec<? extends AbstractChestBlock<ColouredChestBlockEntity>> getCodec() { + return CODEC; + } + + @Override + public DoubleBlockProperties.PropertySource<? extends ChestBlockEntity> getBlockEntitySource(BlockState state, World world, BlockPos pos, boolean ignoreBlocked) { + return DoubleBlockProperties.PropertyRetriever::getFallback; + } +} |