/* * This file is part of ComputerCraft - http://www.computercraft.info * Copyright Daniel Ratcliffe, 2011-2019. Do not distribute without permission. * Send enquiries to dratcliffe@gmail.com */ package dan200.computercraft.shared.computer.blocks; import dan200.computercraft.ComputerCraft; import dan200.computercraft.core.computer.ComputerSide; import dan200.computercraft.shared.common.BlockGeneric; import dan200.computercraft.shared.common.IBundledRedstoneBlock; import dan200.computercraft.shared.computer.core.ComputerFamily; import dan200.computercraft.shared.computer.core.ServerComputer; import dan200.computercraft.shared.computer.items.IComputerItem; import net.minecraft.block.BlockState; import net.minecraft.block.entity.BlockEntity; import net.minecraft.block.entity.BlockEntityType; import net.minecraft.entity.LivingEntity; import net.minecraft.item.ItemStack; import net.minecraft.util.Identifier; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Direction; import net.minecraft.world.BlockView; import net.minecraft.world.World; import net.minecraft.world.loot.context.LootContext; import net.minecraft.world.loot.context.LootContextParameters; import javax.annotation.Nonnull; import java.util.List; public abstract class BlockComputerBase extends BlockGeneric implements IBundledRedstoneBlock { private static final Identifier COMPUTER_DROP = new Identifier( ComputerCraft.MOD_ID, "computer" ); private final ComputerFamily family; protected BlockComputerBase( Settings settings, ComputerFamily family, BlockEntityType type ) { super( settings, type ); this.family = family; } @Override @Deprecated public void onBlockAdded( BlockState state, World world, BlockPos pos, BlockState oldState, boolean flag ) { super.onBlockAdded( state, world, pos, oldState, flag ); BlockEntity tile = world.getBlockEntity( pos ); if( tile instanceof TileComputerBase ) ((TileComputerBase) tile).updateInput(); } @Override @Deprecated public boolean emitsRedstonePower( BlockState state ) { return true; } @Override @Deprecated public int getStrongRedstonePower( BlockState state, BlockView world, BlockPos pos, Direction incomingSide ) { BlockEntity entity = world.getBlockEntity( pos ); if( !(entity instanceof TileComputerBase) ) return 0; TileComputerBase computerEntity = (TileComputerBase) entity; ServerComputer computer = computerEntity.getServerComputer(); if( computer == null ) return 0; ComputerSide localSide = computerEntity.remapToLocalSide( incomingSide.getOpposite() ); return computer.getRedstoneOutput( localSide ); } @Nonnull protected abstract ItemStack getItem( TileComputerBase tile ); public ComputerFamily getFamily() { return family; } @Override @Deprecated public int getWeakRedstonePower( BlockState state, BlockView world, BlockPos pos, Direction incomingSide ) { return getStrongRedstonePower( state, world, pos, incomingSide ); } @Override public boolean getBundledRedstoneConnectivity( World world, BlockPos pos, Direction side ) { return true; } @Override public int getBundledRedstoneOutput( World world, BlockPos pos, Direction side ) { BlockEntity entity = world.getBlockEntity( pos ); if( !(entity instanceof TileComputerBase) ) return 0; TileComputerBase computerEntity = (TileComputerBase) entity; ServerComputer computer = computerEntity.getServerComputer(); if( computer == null ) return 0; ComputerSide localSide = computerEntity.remapToLocalSide( side ); return computer.getBundledRedstoneOutput( localSide ); } @Nonnull @Override public ItemStack getPickStack( BlockView world, BlockPos pos, BlockState state ) { BlockEntity tile = world.getBlockEntity( pos ); if( tile instanceof TileComputerBase ) { ItemStack result = getItem( (TileComputerBase) tile ); if( !result.isEmpty() ) return result; } return super.getPickStack( world, pos, state ); } @Override @Deprecated public List getDroppedStacks( BlockState state, LootContext.Builder builder ) { // TODO: Find a way of doing creative block drops builder.putDrop( COMPUTER_DROP, ( context, consumer ) -> { BlockEntity tile = context.get( LootContextParameters.BLOCK_ENTITY ); if( tile instanceof TileComputerBase ) consumer.accept( getItem( (TileComputerBase) tile ) ); } ); return super.getDroppedStacks( state, builder ); } @Override public void onPlaced( World world, BlockPos pos, BlockState state, LivingEntity placer, ItemStack stack ) { super.onPlaced( world, pos, state, placer, stack ); BlockEntity tile = world.getBlockEntity( pos ); if( !world.isClient && tile instanceof IComputerTile && stack.getItem() instanceof IComputerItem ) { IComputerTile computer = (IComputerTile) tile; IComputerItem item = (IComputerItem) stack.getItem(); int id = item.getComputerID( stack ); if( id != -1 ) computer.setComputerID( id ); String label = item.getLabel( stack ); if( label != null ) computer.setLabel( label ); } } }