172 lines
7.3 KiB
Java
172 lines
7.3 KiB
Java
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 <T extends BlockEntity> BlockEntityTicker<T> getTicker(Level pLevel, BlockState pState, BlockEntityType<T> 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<SuperbItemInterfaceBlock> CODEC = BlockBehaviour.simpleCodec(prop -> new SuperbItemInterfaceBlock());
|
|
|
|
@Override
|
|
protected @NotNull MapCodec<? extends BaseEntityBlock> 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<Block, BlockState> 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<Component> tooltipComponents, TooltipFlag tooltipFlag) {
|
|
tooltipComponents.add(Component.translatable("des.superbwarfare.superb_item_interface").withStyle(ChatFormatting.GRAY));
|
|
}
|
|
}
|