Skip to content

Commit 0931325

Browse files
committed
Add charset bundled cable integration
- Bump MinecraftForge version so we don't crash on load. Oh boy, all the deprecation warnings. - Inject IBundledEmitter and IBundledReceiver capabilities onto all TileGenerics. - Register a IBundledRedstoneProvider instance for IBundledEmitter.
1 parent 0685be6 commit 0931325

File tree

5 files changed

+186
-1
lines changed

5 files changed

+186
-1
lines changed

build.gradle

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ group = "org.squiddev"
2828
archivesBaseName = "cc-tweaked"
2929

3030
minecraft {
31-
version = "1.12.2-14.23.2.2634"
31+
version = "1.12.2-14.23.4.2749"
3232
runDir = "run"
3333
replace '${version}', project.version
3434

@@ -50,6 +50,8 @@ repositories {
5050
name = "squiddev"
5151
url = "https://dl.bintray.com/squiddev/maven"
5252
}
53+
54+
ivy { artifactPattern "https://asie.pl/files/mods/Charset/LibOnly/[module]-[revision](-[classifier]).[ext]" }
5355
}
5456

5557
configurations {
@@ -60,7 +62,10 @@ configurations {
6062

6163
dependencies {
6264
deobfProvided "mezz.jei:jei_1.12.2:4.8.5.159:api"
65+
deobfProvided "pl.asie:Charset-Lib:0.5.4.6"
66+
6367
runtime "mezz.jei:jei_1.12.2:4.8.5.159"
68+
6469
shade 'org.squiddev:Cobalt:0.3.2'
6570

6671
testCompile 'junit:junit:4.11'
Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
/*
2+
* This file is part of ComputerCraft - http://www.computercraft.info
3+
* Copyright Daniel Ratcliffe, 2011-2018. Do not distribute without permission.
4+
* Send enquiries to [email protected]
5+
*/
6+
7+
package dan200.computercraft.shared.integration.charset;
8+
9+
import dan200.computercraft.shared.common.TileGeneric;
10+
import net.minecraft.util.EnumFacing;
11+
import net.minecraftforge.common.capabilities.Capability;
12+
import net.minecraftforge.common.capabilities.ICapabilityProvider;
13+
import pl.asie.charset.api.wires.IBundledEmitter;
14+
import pl.asie.charset.api.wires.IBundledReceiver;
15+
16+
import javax.annotation.Nonnull;
17+
import javax.annotation.Nullable;
18+
19+
import static dan200.computercraft.shared.integration.charset.IntegrationCharset.CAPABILITY_EMITTER;
20+
import static dan200.computercraft.shared.integration.charset.IntegrationCharset.CAPABILITY_RECEIVER;
21+
22+
final class BundledCapabilityProvider implements ICapabilityProvider
23+
{
24+
private final TileGeneric tile;
25+
private IBundledReceiver receiver;
26+
private IBundledEmitter[] emitters;
27+
28+
BundledCapabilityProvider( TileGeneric tile )
29+
{
30+
this.tile = tile;
31+
}
32+
33+
@Override
34+
public boolean hasCapability( @Nonnull Capability<?> capability, @Nullable EnumFacing side )
35+
{
36+
return capability == CAPABILITY_EMITTER || capability == CAPABILITY_RECEIVER;
37+
}
38+
39+
@Nullable
40+
@Override
41+
public <T> T getCapability( @Nonnull Capability<T> capability, @Nullable EnumFacing side )
42+
{
43+
if( capability == CAPABILITY_RECEIVER )
44+
{
45+
IBundledReceiver receiver = this.receiver;
46+
if( receiver == null ) receiver = this.receiver = tile::onNeighbourChange;
47+
48+
return CAPABILITY_RECEIVER.cast( receiver );
49+
}
50+
else if( capability == CAPABILITY_EMITTER )
51+
{
52+
IBundledEmitter[] emitters = this.emitters;
53+
if( emitters == null ) emitters = this.emitters = new IBundledEmitter[7];
54+
55+
int index = side == null ? 6 : side.getIndex();
56+
IBundledEmitter emitter = emitters[index];
57+
if( emitter == null )
58+
{
59+
if( side == null )
60+
{
61+
emitter = emitters[index] = () -> {
62+
int flags = 0;
63+
for( EnumFacing facing : EnumFacing.VALUES ) flags |= tile.getBundledRedstoneOutput( facing );
64+
return toBytes( flags );
65+
};
66+
}
67+
else
68+
{
69+
emitter = emitters[index] = () -> toBytes( tile.getBundledRedstoneOutput( side ) );
70+
}
71+
}
72+
;
73+
74+
return CAPABILITY_EMITTER.cast( emitter );
75+
}
76+
else
77+
{
78+
return null;
79+
}
80+
}
81+
82+
private static byte[] toBytes( int flag )
83+
{
84+
byte[] channels = new byte[16];
85+
for( int i = 0; i < 16; i++ ) channels[i] = (flag & (1 << i)) == 0 ? (byte) 0 : 15;
86+
return channels;
87+
}
88+
}
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
/*
2+
* This file is part of ComputerCraft - http://www.computercraft.info
3+
* Copyright Daniel Ratcliffe, 2011-2018. Do not distribute without permission.
4+
* Send enquiries to [email protected]
5+
*/
6+
7+
package dan200.computercraft.shared.integration.charset;
8+
9+
import dan200.computercraft.api.redstone.IBundledRedstoneProvider;
10+
import net.minecraft.tileentity.TileEntity;
11+
import net.minecraft.util.EnumFacing;
12+
import net.minecraft.util.math.BlockPos;
13+
import net.minecraft.world.World;
14+
15+
import javax.annotation.Nonnull;
16+
17+
import static dan200.computercraft.shared.integration.charset.IntegrationCharset.CAPABILITY_EMITTER;
18+
19+
public class BundledRedstoneProvider implements IBundledRedstoneProvider
20+
{
21+
@Override
22+
public int getBundledRedstoneOutput( @Nonnull World world, @Nonnull BlockPos pos, @Nonnull EnumFacing side )
23+
{
24+
TileEntity tile = world.getTileEntity( pos );
25+
if( tile == null || !tile.hasCapability( CAPABILITY_EMITTER, side ) ) return -1;
26+
27+
byte[] signal = tile.getCapability( CAPABILITY_EMITTER, side ).getBundledSignal();
28+
if( signal == null ) return -1;
29+
30+
int flag = 0;
31+
for( int i = 0; i < signal.length; i++ ) flag |= signal[i] > 0 ? (1 << i) : 0;
32+
return flag;
33+
}
34+
}
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
/*
2+
* This file is part of ComputerCraft - http://www.computercraft.info
3+
* Copyright Daniel Ratcliffe, 2011-2018. Do not distribute without permission.
4+
* Send enquiries to [email protected]
5+
*/
6+
7+
package dan200.computercraft.shared.integration.charset;
8+
9+
import dan200.computercraft.ComputerCraft;
10+
import dan200.computercraft.api.ComputerCraftAPI;
11+
import dan200.computercraft.shared.common.TileGeneric;
12+
import net.minecraft.tileentity.TileEntity;
13+
import net.minecraft.util.ResourceLocation;
14+
import net.minecraftforge.common.MinecraftForge;
15+
import net.minecraftforge.common.capabilities.Capability;
16+
import net.minecraftforge.common.capabilities.CapabilityInject;
17+
import net.minecraftforge.event.AttachCapabilitiesEvent;
18+
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
19+
import pl.asie.charset.api.wires.IBundledEmitter;
20+
import pl.asie.charset.api.wires.IBundledReceiver;
21+
22+
public final class IntegrationCharset
23+
{
24+
private static final ResourceLocation CAPABILITY_KEY = new ResourceLocation( ComputerCraft.MOD_ID, "charset" );
25+
26+
@CapabilityInject( IBundledEmitter.class )
27+
public static final Capability<IBundledEmitter> CAPABILITY_EMITTER = null;
28+
29+
@CapabilityInject( IBundledReceiver.class )
30+
public static final Capability<IBundledReceiver> CAPABILITY_RECEIVER = null;
31+
32+
private IntegrationCharset()
33+
{
34+
}
35+
36+
public static void register()
37+
{
38+
if( CAPABILITY_EMITTER == null || CAPABILITY_RECEIVER == null ) return;
39+
40+
MinecraftForge.EVENT_BUS.register( new IntegrationCharset() );
41+
ComputerCraftAPI.registerBundledRedstoneProvider( new BundledRedstoneProvider() );
42+
}
43+
44+
@SubscribeEvent
45+
public void attachGenericCapabilities( AttachCapabilitiesEvent<TileEntity> event)
46+
{
47+
TileEntity tile = event.getObject();
48+
if(tile instanceof TileGeneric)
49+
{
50+
event.addCapability( CAPABILITY_KEY, new BundledCapabilityProvider( (TileGeneric) tile ) );
51+
}
52+
}
53+
}

src/main/java/dan200/computercraft/shared/proxy/ComputerCraftProxyCommon.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
import dan200.computercraft.shared.computer.inventory.ContainerComputer;
2525
import dan200.computercraft.shared.computer.items.ItemCommandComputer;
2626
import dan200.computercraft.shared.computer.items.ItemComputer;
27+
import dan200.computercraft.shared.integration.charset.IntegrationCharset;
2728
import dan200.computercraft.shared.media.common.DefaultMediaProvider;
2829
import dan200.computercraft.shared.media.inventory.ContainerHeldItem;
2930
import dan200.computercraft.shared.media.items.ItemDiskExpanded;
@@ -76,13 +77,15 @@
7677
import net.minecraftforge.event.entity.player.PlayerContainerEvent;
7778
import net.minecraftforge.event.world.WorldEvent;
7879
import net.minecraftforge.fml.client.event.ConfigChangedEvent;
80+
import net.minecraftforge.fml.common.Loader;
7981
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
8082
import net.minecraftforge.fml.common.gameevent.TickEvent;
8183
import net.minecraftforge.fml.common.network.FMLNetworkEvent;
8284
import net.minecraftforge.fml.common.network.IGuiHandler;
8385
import net.minecraftforge.fml.common.network.NetworkRegistry;
8486
import net.minecraftforge.fml.common.registry.GameRegistry;
8587
import net.minecraftforge.registries.IForgeRegistry;
88+
import pl.asie.charset.ModCharset;
8689

8790
import javax.annotation.Nonnull;
8891
import java.io.File;
@@ -117,6 +120,8 @@ public void init()
117120
{
118121
registerTileEntities();
119122
registerForgeHandlers();
123+
124+
if( Loader.isModLoaded( ModCharset.MODID ) ) IntegrationCharset.register();
120125
}
121126

122127
@Override

0 commit comments

Comments
 (0)