1
0
mirror of https://github.com/SquidDev-CC/CC-Tweaked synced 2024-06-17 02:40:06 +00:00
CC-Tweaked/src/main/java/dan200/computercraft/shared/computer/blocks/BlockComputerBase.java

156 lines
5.4 KiB
Java

/*
* 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<T extends TileComputerBase> 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<? extends T> 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<ItemStack> 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 );
}
}
}