diff --git a/Common/src/main/java/me/hypherionmc/hyperlighting/common/blocks/AdvancedCandleBlock.java b/Common/src/main/java/me/hypherionmc/hyperlighting/common/blocks/AdvancedCandleBlock.java index 7dd1a23..e09f054 100644 --- a/Common/src/main/java/me/hypherionmc/hyperlighting/common/blocks/AdvancedCandleBlock.java +++ b/Common/src/main/java/me/hypherionmc/hyperlighting/common/blocks/AdvancedCandleBlock.java @@ -1,7 +1,5 @@ package me.hypherionmc.hyperlighting.common.blocks; -import com.google.common.collect.ImmutableMap; -import com.google.common.collect.Maps; import me.hypherionmc.craterlib.api.inventory.CraterCreativeModeTab; import me.hypherionmc.craterlib.api.rendering.DyableBlock; import me.hypherionmc.craterlib.common.item.BlockItemDyable; @@ -33,10 +31,8 @@ import net.minecraft.world.level.Level; import net.minecraft.world.level.LevelAccessor; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.Blocks; -import net.minecraft.world.level.block.HorizontalDirectionalBlock; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.StateDefinition; -import net.minecraft.world.level.block.state.properties.AttachFace; import net.minecraft.world.level.block.state.properties.BlockStateProperties; import net.minecraft.world.level.block.state.properties.BooleanProperty; import net.minecraft.world.level.block.state.properties.EnumProperty; @@ -48,173 +44,144 @@ import net.minecraft.world.phys.shapes.VoxelShape; import org.jetbrains.annotations.NotNull; import java.util.List; -import java.util.Map; +import java.util.stream.Stream; -public class AdvancedCandleBlock extends HorizontalDirectionalBlock implements DyableBlock, LightableBlock { +public class AdvancedCandleBlock extends Block implements DyableBlock, LightableBlock { - //region Properties - public static final BooleanProperty LIT = BlockStateProperties.LIT; - public static final EnumProperty COLOR = EnumProperty.create("color", DyeColor.class); - public static final EnumProperty ATTACH_FACE = EnumProperty.create("face", AttachFace.class, AttachFace.FLOOR, AttachFace.WALL); - //endregion + //region Properties + public static final BooleanProperty LIT = BlockStateProperties.LIT; + public static final EnumProperty COLOR = EnumProperty.create("color", DyeColor.class); + //endregion - //region Bounding Boxes - private static final Map SHAPES = Maps.newEnumMap( - ImmutableMap.of( - Direction.NORTH, Block.box(5.5D, 2.0D, 11.0D, 10.5D, 12.0D, 16.0D), - Direction.SOUTH, Block.box(5.5D, 2.0D, 0.0D, 10.5D, 12.0D, 5.0D), - Direction.WEST, Block.box(11.0D, 2.0D, 5.5D, 16.0D, 12.0D, 10.5D), - Direction.EAST, Block.box(0.0D, 2.0D, 5.5D, 5.0D, 12.0D, 10.5D), - Direction.UP, Block.box(6.0D, 0.0D, 6.0D, 10.0D, 10.0D, 10.0D) - ) - ); - //endregion + //region Bounding Boxes + VoxelShape BOUNDING_BOX = Block.box(4, 0, 4, 11, 10, 11); + //endregion - private DyeColor color; + private DyeColor color; - public AdvancedCandleBlock(String name, DyeColor color, CraterCreativeModeTab tab) { - super(Properties.of(Material.WOOD).noCollission().instabreak().lightLevel(BlockStateUtils.createLightLevelFromLitBlockState(15))); - this.registerDefaultState(this.defaultBlockState().setValue(FACING, Direction.NORTH).setValue(LIT, CommonRegistration.config.candleConfig.litByDefault).setValue(COLOR, color)); - this.color = color; + public AdvancedCandleBlock(String name, DyeColor color, CraterCreativeModeTab tab) { + super(Properties.of(Material.WOOD).noCollission().instabreak().lightLevel(BlockStateUtils.createLightLevelFromLitBlockState(15))); + this.registerDefaultState(this.defaultBlockState().setValue(LIT, CommonRegistration.config.candleConfig.litByDefault).setValue(COLOR, color)); + this.color = color; - CreativeTabRegistry.setCreativeTab(tab, HLItems.register(name, () -> new BlockItemDyable(this, new Item.Properties()))); + CreativeTabRegistry.setCreativeTab(tab, HLItems.register(name, () -> new BlockItemDyable(this, new Item.Properties()))); + } + + @Override + public VoxelShape getShape(BlockState blockState, BlockGetter level, BlockPos pos, CollisionContext context) { + return BOUNDING_BOX; + } + + @Override + protected void createBlockStateDefinition(StateDefinition.Builder builder) { + builder.add(LIT, COLOR); + super.createBlockStateDefinition(builder); + } + + @Override + public BlockState getStateForPlacement(BlockPlaceContext context) { + BlockState state = this.defaultBlockState(); + return state.setValue(LIT, CommonRegistration.config.candleConfig.litByDefault); + } + + @Override + public BlockState updateShape(BlockState stateIn, Direction facing, BlockState neighbourState, LevelAccessor levelIn, BlockPos currentPos, BlockPos newPos) { + if (facing == Direction.DOWN && !this.isValidPosition(stateIn, levelIn, currentPos, facing)) { + return Blocks.AIR.defaultBlockState(); } + return super.updateShape(stateIn, facing, neighbourState, levelIn, currentPos, newPos); + } - @Override - public VoxelShape getShape(BlockState blockState, BlockGetter level, BlockPos pos, CollisionContext context) { - return switch (blockState.getValue(ATTACH_FACE)) { - case FLOOR -> SHAPES.get(Direction.UP); - case WALL -> SHAPES.get(blockState.getValue(FACING)); - case CEILING -> null; - }; + public boolean isValidPosition(BlockState state, LevelAccessor levelAccessor, BlockPos pos, Direction direction) { + return canSupportCenter(levelAccessor, pos, direction); + } + + @Override + public void toggleLight(Level worldIn, BlockState state, BlockPos pos) { + state = state.setValue(LIT, !state.getValue(LIT)); + worldIn.setBlock(pos, state, 2); + if (!state.getValue(LIT)) { + worldIn.playSound(null, pos, SoundEvents.FIRE_EXTINGUISH, SoundSource.BLOCKS, 0.3f, 1.0f); + } else { + worldIn.playSound(null, pos, HLSounds.TORCH_IGNITE.get(), SoundSource.BLOCKS, 0.3f, 1.0f); } + worldIn.blockUpdated(pos, this); + } - @Override - protected void createBlockStateDefinition(StateDefinition.Builder builder) { - builder.add(LIT, ATTACH_FACE, FACING, COLOR); - super.createBlockStateDefinition(builder); - } - - @Override - public BlockState getStateForPlacement(BlockPlaceContext context) { - Direction direction = context.getClickedFace(); - BlockState state = this.defaultBlockState(); - if (direction == Direction.UP) { - state = state.setValue(ATTACH_FACE, AttachFace.FLOOR); + @Override + public BlockColor dyeHandler() { + return ((blockState, blockAndTintGetter, blockPos, i) -> { + if (blockState.getValue(LIT)) { + return RenderUtils.renderColorFromDye(blockState.getValue(COLOR)); } else { - state = state.setValue(ATTACH_FACE, AttachFace.WALL).setValue(FACING, direction); + return RenderUtils.renderColorFromDye(DyeColor.BLACK); } - return state.setValue(LIT, CommonRegistration.config.candleConfig.litByDefault); - } + }); + } - @Override - public BlockState updateShape(BlockState stateIn, Direction facing, BlockState neighbourState, LevelAccessor levelIn, BlockPos currentPos, BlockPos newPos) { - if (facing == Direction.DOWN && !this.isValidPosition(stateIn, levelIn, currentPos, facing)) { - return Blocks.AIR.defaultBlockState(); - } - return super.updateShape(stateIn, facing, neighbourState, levelIn, currentPos, newPos); - } + @Override + public DyeColor defaultDyeColor() { + return this.defaultBlockState().getValue(COLOR); + } - public boolean isValidPosition(BlockState state, LevelAccessor levelAccessor, BlockPos pos, Direction direction) { - return canSupportCenter(levelAccessor, pos, direction); - } + /** Check if player clicked the block with DYE and apply Color Tint **/ + @Override + public InteractionResult use(BlockState state, Level level, BlockPos pos, Player player, InteractionHand handIn, BlockHitResult hit) { + if (!level.isClientSide()) { + if (!player.getItemInHand(handIn).isEmpty() && player.getItemInHand(handIn).getItem() instanceof DyeItem dyeItem) { + state = state.setValue(COLOR, dyeItem.getDyeColor()); + this.color = dyeItem.getDyeColor(); + level.setBlock(pos, state, 3); + level.sendBlockUpdated(pos, state, state, 3); - @Override - public void toggleLight(Level worldIn, BlockState state, BlockPos pos) { - state = state.setValue(LIT, !state.getValue(LIT)); - worldIn.setBlock(pos, state, 2); - if (!state.getValue(LIT)) { - worldIn.playSound(null, pos, SoundEvents.FIRE_EXTINGUISH, SoundSource.BLOCKS, 0.3f, 1.0f); - } else { - worldIn.playSound(null, pos, HLSounds.TORCH_IGNITE.get(), SoundSource.BLOCKS, 0.3f, 1.0f); - } - worldIn.blockUpdated(pos, this); - } - - @Override - public BlockColor dyeHandler() { - return ((blockState, blockAndTintGetter, blockPos, i) -> { - if (blockState.getValue(LIT)) { - return RenderUtils.renderColorFromDye(blockState.getValue(COLOR)); + if (!player.isCreative()) { + ItemStack stack = player.getItemInHand(handIn); + stack.shrink(1); + player.setItemInHand(handIn, stack); + } + return InteractionResult.CONSUME; + } else if (!CommonRegistration.config.candleConfig.requiresTool) { + state = state.cycle(LIT); + level.setBlock(pos, state, 3); + level.sendBlockUpdated(pos, state, state, 3); + if (!state.getValue(LIT)) { + level.playSound(null, pos, SoundEvents.FIRE_EXTINGUISH, SoundSource.BLOCKS, 0.3f, 1.0f); } else { - return RenderUtils.renderColorFromDye(DyeColor.BLACK); - } - }); - } - - @Override - public DyeColor defaultDyeColor() { - return this.defaultBlockState().getValue(COLOR); - } - - /** Check if player clicked the block with DYE and apply Color Tint **/ - @Override - public InteractionResult use(BlockState state, Level level, BlockPos pos, Player player, InteractionHand handIn, BlockHitResult hit) { - if (!level.isClientSide()) { - if (!player.getItemInHand(handIn).isEmpty() && player.getItemInHand(handIn).getItem() instanceof DyeItem dyeItem) { - state = state.setValue(COLOR, dyeItem.getDyeColor()); - this.color = dyeItem.getDyeColor(); - level.setBlock(pos, state, 3); - level.sendBlockUpdated(pos, state, state, 3); - - if (!player.isCreative()) { - ItemStack stack = player.getItemInHand(handIn); - stack.shrink(1); - player.setItemInHand(handIn, stack); - } - return InteractionResult.CONSUME; - } else if (!CommonRegistration.config.candleConfig.requiresTool) { - state = state.cycle(LIT); - level.setBlock(pos, state, 3); - level.sendBlockUpdated(pos, state, state, 3); - if (!state.getValue(LIT)) { - level.playSound(null, pos, SoundEvents.FIRE_EXTINGUISH, SoundSource.BLOCKS, 0.3f, 1.0f); - } else { - level.playSound(null, pos, HLSounds.TORCH_IGNITE.get(), SoundSource.BLOCKS, 0.3f, 1.0f); - } - return InteractionResult.CONSUME; - } - } - return InteractionResult.PASS; - } - - @Override - public void appendHoverText(ItemStack stack, BlockGetter level, List tooltip, TooltipFlag options) { - tooltip.add(Component.literal(ChatFormatting.YELLOW + "Dyable")); - tooltip.add(Component.literal(ChatFormatting.GREEN + "Color: " + color.getName())); - super.appendHoverText(stack, level, tooltip, options); - } - - @Override - public void animateTick(BlockState stateIn, Level levelIn, BlockPos pos, RandomSource random) { - if (stateIn.getValue(LIT)) { - DyeColor color = stateIn.getValue(COLOR); - - if (stateIn.getValue(ATTACH_FACE) == AttachFace.FLOOR) { - double d0 = (double) pos.getX() + 0.5D; - double d1 = (double) pos.getY() + 0.7D; - double d2 = (double) pos.getZ() + 0.5D; - levelIn.addParticle(ParticleTypes.SMOKE, d0, d1, d2, 0.0D, 0.0D, 0.0D); - levelIn.addParticle(FlameParticles.getParticleByColor(color).get(), d0, d1, d2, 0D, 0D, 0D); - } else { - Direction direction = stateIn.getValue(FACING); - double d0 = (double) pos.getX() + 0.5D; - double d1 = (double) pos.getY() + 0.7D; - double d2 = (double) pos.getZ() + 0.5D; - Direction direction1 = direction.getOpposite(); - levelIn.addParticle(ParticleTypes.SMOKE, d0 + 0.37D * (double) direction1.getStepX(), d1 + 0.15D, d2 + 0.37D * (double) direction1.getStepZ(), 0.0D, 0.0D, 0.0D); - levelIn.addParticle(FlameParticles.getParticleByColor(color).get(), d0 + 0.37D * (double) direction1.getStepX(), d1 + 0.15D, d2 + 0.37D * (double) direction1.getStepZ(), 0D, 0D, 0D); + level.playSound(null, pos, HLSounds.TORCH_IGNITE.get(), SoundSource.BLOCKS, 0.3f, 1.0f); } + return InteractionResult.CONSUME; } } + return InteractionResult.PASS; + } - @Override - public @NotNull ItemStack getCloneItemStack(@NotNull BlockGetter level, @NotNull BlockPos pos, @NotNull BlockState state) { - return StackUtil.getColorStack(this, state.getValue(COLOR)); - } + @Override + public void appendHoverText(ItemStack stack, BlockGetter level, List tooltip, TooltipFlag options) { + tooltip.add(Component.literal(ChatFormatting.YELLOW + "Dyable")); + tooltip.add(Component.literal(ChatFormatting.GREEN + "Color: " + color.getName())); + super.appendHoverText(stack, level, tooltip, options); + } - @Override - public List getDrops(BlockState blockState, LootContext.Builder lootBuilder) { - return List.of(StackUtil.getColorStack(this, blockState.getValue(COLOR))); + @Override + public void animateTick(BlockState stateIn, Level levelIn, BlockPos pos, RandomSource random) { + if (stateIn.getValue(LIT)) { + DyeColor color = stateIn.getValue(COLOR); + + double d0 = (double) pos.getX() + 0.48D; + double d1 = (double) pos.getY() + 0.79D; + double d2 = (double) pos.getZ() + 0.45D; + levelIn.addParticle(ParticleTypes.SMOKE, d0, d1, d2, 0.0D, 0.0D, 0.0D); + levelIn.addParticle(FlameParticles.getParticleByColor(color).get(), d0, d1, d2, 0D, 0D, 0D); } + } + + @Override + public @NotNull ItemStack getCloneItemStack(@NotNull BlockGetter level, @NotNull BlockPos pos, @NotNull BlockState state) { + return StackUtil.getColorStack(this, state.getValue(COLOR)); + } + + @Override + public List getDrops(BlockState blockState, LootContext.Builder lootBuilder) { + return List.of(StackUtil.getColorStack(this, blockState.getValue(COLOR))); + } }