1
0
mirror of https://github.com/SquidDev-CC/CC-Tweaked synced 2025-01-15 19:55:42 +00:00

Create an IMultipartTile for all BlockPeripheral tiles

Fixes #176
This commit is contained in:
SquidDev 2019-04-15 09:21:10 +01:00
parent b195cab6a7
commit 48ba247ab4
2 changed files with 26 additions and 10 deletions

View File

@ -10,8 +10,10 @@ import dan200.computercraft.ComputerCraft;
import dan200.computercraft.api.ComputerCraftAPI; import dan200.computercraft.api.ComputerCraftAPI;
import dan200.computercraft.api.peripheral.IPeripheral; import dan200.computercraft.api.peripheral.IPeripheral;
import dan200.computercraft.api.peripheral.IPeripheralTile; import dan200.computercraft.api.peripheral.IPeripheralTile;
import dan200.computercraft.shared.peripheral.common.TilePeripheralBase;
import dan200.computercraft.shared.peripheral.modem.wireless.TileAdvancedModem; import dan200.computercraft.shared.peripheral.modem.wireless.TileAdvancedModem;
import dan200.computercraft.shared.peripheral.modem.wireless.TileWirelessModem; import dan200.computercraft.shared.peripheral.modem.wireless.TileWirelessModem;
import dan200.computercraft.shared.peripheral.monitor.TileMonitor;
import mcmultipart.api.addon.IMCMPAddon; import mcmultipart.api.addon.IMCMPAddon;
import mcmultipart.api.addon.MCMPAddon; import mcmultipart.api.addon.MCMPAddon;
import mcmultipart.api.container.IMultipartContainer; import mcmultipart.api.container.IMultipartContainer;
@ -52,7 +54,7 @@ public class MCMPIntegration implements IMCMPAddon
public void registerParts( IMultipartRegistry registry ) public void registerParts( IMultipartRegistry registry )
{ {
// Setup all parts // Setup all parts
register( registry, ComputerCraft.Blocks.peripheral, new PartNormalModem() ); register( registry, ComputerCraft.Blocks.peripheral, new PartPeripheral() );
register( registry, ComputerCraft.Blocks.advancedModem, new PartAdvancedModem() ); register( registry, ComputerCraft.Blocks.advancedModem, new PartAdvancedModem() );
// Subscribe to capability events // Subscribe to capability events
@ -83,8 +85,11 @@ public class MCMPIntegration implements IMCMPAddon
public static void attach( AttachCapabilitiesEvent<TileEntity> event ) public static void attach( AttachCapabilitiesEvent<TileEntity> event )
{ {
TileEntity tile = event.getObject(); TileEntity tile = event.getObject();
if( tile instanceof TileAdvancedModem || tile instanceof TileWirelessModem ) if( tile instanceof TileAdvancedModem || tile instanceof TileWirelessModem
|| tile instanceof TilePeripheralBase || tile instanceof TileMonitor )
{ {
// We need to attach to modems (obviously), but also any other tile created by BlockPeripheral. Otherwise
// IMultipart.convertToMultipartTile will error.
event.addCapability( CAPABILITY_KEY, new BasicMultipart( tile ) ); event.addCapability( CAPABILITY_KEY, new BasicMultipart( tile ) );
} }
} }
@ -94,7 +99,10 @@ public class MCMPIntegration implements IMCMPAddon
private final TileEntity tile; private final TileEntity tile;
private IMultipartTile wrapped; private IMultipartTile wrapped;
private BasicMultipart( TileEntity tile ) {this.tile = tile;} private BasicMultipart( TileEntity tile )
{
this.tile = tile;
}
@Override @Override
public boolean hasCapability( @Nonnull Capability<?> capability, @Nullable EnumFacing facing ) public boolean hasCapability( @Nonnull Capability<?> capability, @Nullable EnumFacing facing )

View File

@ -10,6 +10,7 @@ import dan200.computercraft.ComputerCraft;
import dan200.computercraft.shared.peripheral.common.BlockPeripheral; import dan200.computercraft.shared.peripheral.common.BlockPeripheral;
import dan200.computercraft.shared.peripheral.common.BlockPeripheralVariant; import dan200.computercraft.shared.peripheral.common.BlockPeripheralVariant;
import mcmultipart.api.multipart.IMultipart; import mcmultipart.api.multipart.IMultipart;
import mcmultipart.api.slot.EnumCenterSlot;
import mcmultipart.api.slot.EnumFaceSlot; import mcmultipart.api.slot.EnumFaceSlot;
import mcmultipart.api.slot.IPartSlot; import mcmultipart.api.slot.IPartSlot;
import net.minecraft.block.Block; import net.minecraft.block.Block;
@ -20,34 +21,41 @@ import net.minecraft.util.math.BlockPos;
import net.minecraft.world.IBlockAccess; import net.minecraft.world.IBlockAccess;
import net.minecraft.world.World; import net.minecraft.world.World;
public class PartNormalModem implements IMultipart import javax.annotation.Nonnull;
public class PartPeripheral implements IMultipart
{ {
@Override @Override
public IPartSlot getSlotForPlacement( World world, BlockPos pos, IBlockState state, EnumFacing facing, float hitX, float hitY, float hitZ, EntityLivingBase placer ) public IPartSlot getSlotForPlacement( World world, BlockPos pos, IBlockState state, EnumFacing facing, float hitX, float hitY, float hitZ, EntityLivingBase placer )
{ {
return EnumFaceSlot.fromFace( getFacing( state ) ); return getSlot( state );
} }
@Override @Override
public IPartSlot getSlotFromWorld( IBlockAccess world, BlockPos pos, IBlockState state ) public IPartSlot getSlotFromWorld( IBlockAccess world, BlockPos pos, IBlockState state )
{ {
return EnumFaceSlot.fromFace( getFacing( state ) ); return getSlot( state );
} }
private EnumFacing getFacing( IBlockState state ) @Nonnull
private static IPartSlot getSlot( IBlockState state )
{ {
BlockPeripheralVariant type = state.getValue( BlockPeripheral.VARIANT ); BlockPeripheralVariant type = state.getValue( BlockPeripheral.VARIANT );
if( type == BlockPeripheralVariant.WirelessModemUpOn || type == BlockPeripheralVariant.WirelessModemUpOff ) if( type == BlockPeripheralVariant.WirelessModemUpOn || type == BlockPeripheralVariant.WirelessModemUpOff )
{ {
return EnumFacing.UP; return EnumFaceSlot.UP;
} }
else if( type == BlockPeripheralVariant.WirelessModemDownOn || type == BlockPeripheralVariant.WirelessModemDownOff ) else if( type == BlockPeripheralVariant.WirelessModemDownOn || type == BlockPeripheralVariant.WirelessModemDownOff )
{ {
return EnumFacing.UP; return EnumFaceSlot.DOWN;
}
else if( type == BlockPeripheralVariant.WirelessModemOff || type == BlockPeripheralVariant.WirelessModemOn )
{
return EnumFaceSlot.fromFace( state.getValue( BlockPeripheral.FACING ) );
} }
else else
{ {
return state.getValue( BlockPeripheral.FACING ); return EnumCenterSlot.CENTER;
} }
} }