diff --git a/build.gradle b/build.gradle index 5317b7d9c..591b20204 100644 --- a/build.gradle +++ b/build.gradle @@ -28,7 +28,7 @@ group = "org.squiddev" archivesBaseName = "cc-tweaked" minecraft { - version = "1.12.2-14.23.2.2634" + version = "1.12.2-14.23.4.2749" runDir = "run" replace '${version}', project.version @@ -50,6 +50,8 @@ repositories { name = "squiddev" url = "https://dl.bintray.com/squiddev/maven" } + + ivy { artifactPattern "https://asie.pl/files/mods/Charset/LibOnly/[module]-[revision](-[classifier]).[ext]" } } configurations { @@ -60,7 +62,10 @@ configurations { dependencies { deobfProvided "mezz.jei:jei_1.12.2:4.8.5.159:api" + deobfProvided "pl.asie:Charset-Lib:0.5.4.6" + runtime "mezz.jei:jei_1.12.2:4.8.5.159" + shade 'org.squiddev:Cobalt:0.3.2' testCompile 'junit:junit:4.11' diff --git a/src/main/java/dan200/computercraft/shared/integration/charset/BundledCapabilityProvider.java b/src/main/java/dan200/computercraft/shared/integration/charset/BundledCapabilityProvider.java new file mode 100644 index 000000000..161bc910d --- /dev/null +++ b/src/main/java/dan200/computercraft/shared/integration/charset/BundledCapabilityProvider.java @@ -0,0 +1,88 @@ +/* + * This file is part of ComputerCraft - http://www.computercraft.info + * Copyright Daniel Ratcliffe, 2011-2018. Do not distribute without permission. + * Send enquiries to dratcliffe@gmail.com + */ + +package dan200.computercraft.shared.integration.charset; + +import dan200.computercraft.shared.common.TileGeneric; +import net.minecraft.util.EnumFacing; +import net.minecraftforge.common.capabilities.Capability; +import net.minecraftforge.common.capabilities.ICapabilityProvider; +import pl.asie.charset.api.wires.IBundledEmitter; +import pl.asie.charset.api.wires.IBundledReceiver; + +import javax.annotation.Nonnull; +import javax.annotation.Nullable; + +import static dan200.computercraft.shared.integration.charset.IntegrationCharset.CAPABILITY_EMITTER; +import static dan200.computercraft.shared.integration.charset.IntegrationCharset.CAPABILITY_RECEIVER; + +final class BundledCapabilityProvider implements ICapabilityProvider +{ + private final TileGeneric tile; + private IBundledReceiver receiver; + private IBundledEmitter[] emitters; + + BundledCapabilityProvider( TileGeneric tile ) + { + this.tile = tile; + } + + @Override + public boolean hasCapability( @Nonnull Capability capability, @Nullable EnumFacing side ) + { + return capability == CAPABILITY_EMITTER || capability == CAPABILITY_RECEIVER; + } + + @Nullable + @Override + public T getCapability( @Nonnull Capability capability, @Nullable EnumFacing side ) + { + if( capability == CAPABILITY_RECEIVER ) + { + IBundledReceiver receiver = this.receiver; + if( receiver == null ) receiver = this.receiver = tile::onNeighbourChange; + + return CAPABILITY_RECEIVER.cast( receiver ); + } + else if( capability == CAPABILITY_EMITTER ) + { + IBundledEmitter[] emitters = this.emitters; + if( emitters == null ) emitters = this.emitters = new IBundledEmitter[7]; + + int index = side == null ? 6 : side.getIndex(); + IBundledEmitter emitter = emitters[index]; + if( emitter == null ) + { + if( side == null ) + { + emitter = emitters[index] = () -> { + int flags = 0; + for( EnumFacing facing : EnumFacing.VALUES ) flags |= tile.getBundledRedstoneOutput( facing ); + return toBytes( flags ); + }; + } + else + { + emitter = emitters[index] = () -> toBytes( tile.getBundledRedstoneOutput( side ) ); + } + } + ; + + return CAPABILITY_EMITTER.cast( emitter ); + } + else + { + return null; + } + } + + private static byte[] toBytes( int flag ) + { + byte[] channels = new byte[16]; + for( int i = 0; i < 16; i++ ) channels[i] = (flag & (1 << i)) == 0 ? (byte) 0 : 15; + return channels; + } +} diff --git a/src/main/java/dan200/computercraft/shared/integration/charset/BundledRedstoneProvider.java b/src/main/java/dan200/computercraft/shared/integration/charset/BundledRedstoneProvider.java new file mode 100644 index 000000000..080d8aa33 --- /dev/null +++ b/src/main/java/dan200/computercraft/shared/integration/charset/BundledRedstoneProvider.java @@ -0,0 +1,34 @@ +/* + * This file is part of ComputerCraft - http://www.computercraft.info + * Copyright Daniel Ratcliffe, 2011-2018. Do not distribute without permission. + * Send enquiries to dratcliffe@gmail.com + */ + +package dan200.computercraft.shared.integration.charset; + +import dan200.computercraft.api.redstone.IBundledRedstoneProvider; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.EnumFacing; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.World; + +import javax.annotation.Nonnull; + +import static dan200.computercraft.shared.integration.charset.IntegrationCharset.CAPABILITY_EMITTER; + +public class BundledRedstoneProvider implements IBundledRedstoneProvider +{ + @Override + public int getBundledRedstoneOutput( @Nonnull World world, @Nonnull BlockPos pos, @Nonnull EnumFacing side ) + { + TileEntity tile = world.getTileEntity( pos ); + if( tile == null || !tile.hasCapability( CAPABILITY_EMITTER, side ) ) return -1; + + byte[] signal = tile.getCapability( CAPABILITY_EMITTER, side ).getBundledSignal(); + if( signal == null ) return -1; + + int flag = 0; + for( int i = 0; i < signal.length; i++ ) flag |= signal[i] > 0 ? (1 << i) : 0; + return flag; + } +} diff --git a/src/main/java/dan200/computercraft/shared/integration/charset/IntegrationCharset.java b/src/main/java/dan200/computercraft/shared/integration/charset/IntegrationCharset.java new file mode 100644 index 000000000..c29771280 --- /dev/null +++ b/src/main/java/dan200/computercraft/shared/integration/charset/IntegrationCharset.java @@ -0,0 +1,53 @@ +/* + * This file is part of ComputerCraft - http://www.computercraft.info + * Copyright Daniel Ratcliffe, 2011-2018. Do not distribute without permission. + * Send enquiries to dratcliffe@gmail.com + */ + +package dan200.computercraft.shared.integration.charset; + +import dan200.computercraft.ComputerCraft; +import dan200.computercraft.api.ComputerCraftAPI; +import dan200.computercraft.shared.common.TileGeneric; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.common.MinecraftForge; +import net.minecraftforge.common.capabilities.Capability; +import net.minecraftforge.common.capabilities.CapabilityInject; +import net.minecraftforge.event.AttachCapabilitiesEvent; +import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; +import pl.asie.charset.api.wires.IBundledEmitter; +import pl.asie.charset.api.wires.IBundledReceiver; + +public final class IntegrationCharset +{ + private static final ResourceLocation CAPABILITY_KEY = new ResourceLocation( ComputerCraft.MOD_ID, "charset" ); + + @CapabilityInject( IBundledEmitter.class ) + public static final Capability CAPABILITY_EMITTER = null; + + @CapabilityInject( IBundledReceiver.class ) + public static final Capability CAPABILITY_RECEIVER = null; + + private IntegrationCharset() + { + } + + public static void register() + { + if( CAPABILITY_EMITTER == null || CAPABILITY_RECEIVER == null ) return; + + MinecraftForge.EVENT_BUS.register( new IntegrationCharset() ); + ComputerCraftAPI.registerBundledRedstoneProvider( new BundledRedstoneProvider() ); + } + + @SubscribeEvent + public void attachGenericCapabilities( AttachCapabilitiesEvent event) + { + TileEntity tile = event.getObject(); + if(tile instanceof TileGeneric) + { + event.addCapability( CAPABILITY_KEY, new BundledCapabilityProvider( (TileGeneric) tile ) ); + } + } +} diff --git a/src/main/java/dan200/computercraft/shared/proxy/ComputerCraftProxyCommon.java b/src/main/java/dan200/computercraft/shared/proxy/ComputerCraftProxyCommon.java index dec8466e0..108cbb2d5 100644 --- a/src/main/java/dan200/computercraft/shared/proxy/ComputerCraftProxyCommon.java +++ b/src/main/java/dan200/computercraft/shared/proxy/ComputerCraftProxyCommon.java @@ -24,6 +24,7 @@ import dan200.computercraft.shared.computer.core.*; import dan200.computercraft.shared.computer.inventory.ContainerComputer; import dan200.computercraft.shared.computer.items.ItemCommandComputer; import dan200.computercraft.shared.computer.items.ItemComputer; +import dan200.computercraft.shared.integration.charset.IntegrationCharset; import dan200.computercraft.shared.media.common.DefaultMediaProvider; import dan200.computercraft.shared.media.inventory.ContainerHeldItem; import dan200.computercraft.shared.media.items.ItemDiskExpanded; @@ -76,6 +77,7 @@ import net.minecraftforge.event.RegistryEvent; import net.minecraftforge.event.entity.player.PlayerContainerEvent; import net.minecraftforge.event.world.WorldEvent; import net.minecraftforge.fml.client.event.ConfigChangedEvent; +import net.minecraftforge.fml.common.Loader; import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; import net.minecraftforge.fml.common.gameevent.TickEvent; import net.minecraftforge.fml.common.network.FMLNetworkEvent; @@ -83,6 +85,7 @@ import net.minecraftforge.fml.common.network.IGuiHandler; import net.minecraftforge.fml.common.network.NetworkRegistry; import net.minecraftforge.fml.common.registry.GameRegistry; import net.minecraftforge.registries.IForgeRegistry; +import pl.asie.charset.ModCharset; import javax.annotation.Nonnull; import java.io.File; @@ -117,6 +120,8 @@ public abstract class ComputerCraftProxyCommon implements IComputerCraftProxy { registerTileEntities(); registerForgeHandlers(); + + if( Loader.isModLoaded( ModCharset.MODID ) ) IntegrationCharset.register(); } @Override