package com.atsuishio.superbwarfare.block; import com.atsuishio.superbwarfare.block.entity.SuperbItemInterfaceBlockEntity; import com.atsuishio.superbwarfare.init.ModBlockEntities; import com.atsuishio.superbwarfare.init.ModItems; import com.atsuishio.superbwarfare.init.ModTags; import com.mojang.serialization.MapCodec; import net.minecraft.ChatFormatting; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.network.chat.Component; import net.minecraft.world.Containers; import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; import net.minecraft.world.ItemInteractionResult; import net.minecraft.world.entity.player.Player; import net.minecraft.world.inventory.AbstractContainerMenu; import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.TooltipFlag; import net.minecraft.world.item.context.BlockPlaceContext; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.BaseEntityBlock; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.RenderShape; import net.minecraft.world.level.block.SoundType; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.entity.BlockEntityTicker; import net.minecraft.world.level.block.entity.BlockEntityType; 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.BooleanProperty; import net.minecraft.world.level.block.state.properties.DirectionProperty; import net.minecraft.world.level.material.MapColor; import net.minecraft.world.level.pathfinder.PathComputationType; import net.minecraft.world.phys.BlockHitResult; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import javax.annotation.ParametersAreNonnullByDefault; import java.util.List; public class SuperbItemInterfaceBlock extends BaseEntityBlock { public static final BooleanProperty ENABLED = BlockStateProperties.ENABLED; public static final DirectionProperty FACING = BlockStateProperties.FACING; public SuperbItemInterfaceBlock() { super(BlockBehaviour.Properties.of().mapColor(MapColor.STONE).requiresCorrectToolForDrops().strength(3.0F, 4.8F).sound(SoundType.METAL)); this.registerDefaultState(this.stateDefinition.any().setValue(ENABLED, true).setValue(FACING, Direction.DOWN)); } @Nullable @Override @ParametersAreNonnullByDefault public BlockEntity newBlockEntity(BlockPos pPos, BlockState pState) { return new SuperbItemInterfaceBlockEntity(pPos, pState); } @Nullable @ParametersAreNonnullByDefault public BlockEntityTicker getTicker(Level pLevel, BlockState pState, BlockEntityType pBlockEntityType) { return pLevel.isClientSide ? null : createTickerHelper(pBlockEntityType, ModBlockEntities.SUPERB_ITEM_INTERFACE.get(), SuperbItemInterfaceBlockEntity::serverTick); } @Nullable @Override public BlockState getStateForPlacement(@NotNull BlockPlaceContext context) { Direction direction = context.getClickedFace().getOpposite(); return this.defaultBlockState().setValue(FACING, direction).setValue(ENABLED, true); } @Override public void onPlace(BlockState pState, @NotNull Level pLevel, @NotNull BlockPos pPos, BlockState pOldState, boolean pIsMoving) { if (!pOldState.is(pState.getBlock())) { this.checkPoweredState(pLevel, pPos, pState, 2); } } @Override @ParametersAreNonnullByDefault protected @NotNull ItemInteractionResult useItemOn(ItemStack stack, BlockState state, Level level, BlockPos pos, Player player, InteractionHand hand, BlockHitResult hitResult) { if (stack.is(ModItems.CROWBAR.get()) || stack.is(ModTags.Items.WRENCHES_TAG) || stack.is(ModTags.Items.WRENCH_TAG)) { var facing = hitResult.getDirection(); level.setBlockAndUpdate(pos, state.setValue(FACING, facing)); return ItemInteractionResult.SUCCESS; } return super.useItemOn(stack, state, level, pos, player, hand, hitResult); } @Override @ParametersAreNonnullByDefault protected @NotNull InteractionResult useWithoutItem(BlockState state, Level level, BlockPos pos, Player player, BlockHitResult hitResult) { if (level.isClientSide) { return InteractionResult.SUCCESS; } else { BlockEntity blockentity = level.getBlockEntity(pos); if (blockentity instanceof SuperbItemInterfaceBlockEntity entity) { player.openMenu(entity); } return InteractionResult.CONSUME; } } @Override @ParametersAreNonnullByDefault public void neighborChanged(BlockState pState, Level pLevel, BlockPos pPos, Block pBlock, BlockPos pFromPos, boolean pIsMoving) { this.checkPoweredState(pLevel, pPos, pState, 4); } private void checkPoweredState(Level pLevel, BlockPos pPos, BlockState pState, int pFlags) { boolean flag = !pLevel.hasNeighborSignal(pPos); if (flag != pState.getValue(ENABLED)) { pLevel.setBlock(pPos, pState.setValue(ENABLED, flag), pFlags); } } @Override public void onRemove(BlockState pState, @NotNull Level pLevel, @NotNull BlockPos pPos, BlockState pNewState, boolean pIsMoving) { if (!pState.is(pNewState.getBlock())) { BlockEntity blockentity = pLevel.getBlockEntity(pPos); if (blockentity instanceof SuperbItemInterfaceBlockEntity entity) { Containers.dropContents(pLevel, pPos, entity); pLevel.updateNeighbourForOutputSignal(pPos, this); } super.onRemove(pState, pLevel, pPos, pNewState, pIsMoving); } } private static final MapCodec CODEC = BlockBehaviour.simpleCodec(prop -> new SuperbItemInterfaceBlock()); @Override protected @NotNull MapCodec codec() { return CODEC; } @Override public @NotNull RenderShape getRenderShape(@NotNull BlockState pState) { return RenderShape.MODEL; } @Override public boolean hasAnalogOutputSignal(@NotNull BlockState pState) { return true; } @Override public int getAnalogOutputSignal(@NotNull BlockState pBlockState, Level pLevel, @NotNull BlockPos pPos) { return AbstractContainerMenu.getRedstoneSignalFromBlockEntity(pLevel.getBlockEntity(pPos)); } @Override protected void createBlockStateDefinition(StateDefinition.Builder pBuilder) { pBuilder.add(ENABLED).add(FACING); } @Override @ParametersAreNonnullByDefault protected boolean isPathfindable(BlockState state, PathComputationType pathComputationType) { return false; } @Override @ParametersAreNonnullByDefault public void appendHoverText(ItemStack stack, Item.TooltipContext context, List tooltipComponents, TooltipFlag tooltipFlag) { tooltipComponents.add(Component.translatable("des.superbwarfare.superb_item_interface").withStyle(ChatFormatting.GRAY)); } }