diff --git a/build.gradle b/build.gradle index a458726..b4b8889 100644 --- a/build.gradle +++ b/build.gradle @@ -84,14 +84,18 @@ repositories { dependencies { deobfCompile 'net.industrial-craft:industrialcraft-2:2.8.+' deobfCompile "blusunrize:ImmersiveEngineering:0.12-+" - deobfCompile "project-red-base:ProjectRed-1.12.2:4.9.1.92:Base" - runtime "project-red-integration:ProjectRed-1.12.2:4.9.1.92:integration" - runtime "forge-multipart-cbe:ForgeMultipart-1.12.2:2.5.0.69:universal" - runtime "codechicken:CodeChickenLib:1.12.2-3.2.1.349:universal" - runtime "codechicken:ChickenASM:1.12-1.0.2.7" - runtime "mrtjpcore:MrTJPCore-1.12.2:2.1.3.35:universal" + compileOnly "pl.asie.charset:charset:0.5.4.2.3:full" + //Project red and runtime dependencies + compileOnly "project-red-base:ProjectRed-1.12.2:4.9.1.92:Base" + //runtime "project-red-integration:ProjectRed-1.12.2:4.9.1.92:integration" + //runtime "forge-multipart-cbe:ForgeMultipart-1.12.2:2.5.0.69:universal" + //runtime "codechicken:CodeChickenLib:1.12.2-3.2.1.349:universal" + //runtime "codechicken:ChickenASM:1.12-1.0.2.7" + //runtime "mrtjpcore:MrTJPCore-1.12.2:2.1.3.35:universal" + //Tech Reborn compileOnly "TechReborn:TechReborn-1.12:2.6.+:dev" compileOnly "RebornCore:RebornCore-1.12:3.2.+:dev" + //Others compileOnly 'com.elytradev:mirage:2.0.1-SNAPSHOT' compileOnly "mezz.jei:jei_1.12:4.+" compileOnly "CraftTweaker2:CraftTweaker2-MC1120-Main:1.12-4.1.8.460" diff --git a/src/main/java/malte0811/industrialWires/blocks/controlpanel/TileEntityRSPanelOthers.java b/src/main/java/malte0811/industrialWires/blocks/controlpanel/TileEntityRSPanelOthers.java index 3f05083..0f55105 100644 --- a/src/main/java/malte0811/industrialWires/blocks/controlpanel/TileEntityRSPanelOthers.java +++ b/src/main/java/malte0811/industrialWires/blocks/controlpanel/TileEntityRSPanelOthers.java @@ -16,11 +16,17 @@ package malte0811.industrialWires.blocks.controlpanel; import malte0811.industrialWires.compat.Compat; +import malte0811.industrialWires.compat.CompatCapabilities.Charset; import mrtjp.projectred.api.IBundledTile; import mrtjp.projectred.api.ProjectRedAPI; import net.minecraft.util.EnumFacing; +import net.minecraftforge.common.capabilities.Capability; import net.minecraftforge.fml.common.Optional; +import javax.annotation.Nonnull; +import javax.annotation.Nullable; +import java.util.Arrays; + @Optional.Interface(iface = "mrtjp.projectred.api.IBundledTile", modid = ProjectRedAPI.modIDCore) public class TileEntityRSPanelOthers extends TileEntityRSPanel implements IBundledTile { @@ -41,7 +47,7 @@ public class TileEntityRSPanelOthers extends TileEntityRSPanel implements IBundl public void updateInput() { byte[] data = new byte[16]; for (EnumFacing f:EnumFacing.VALUES) { - byte[] tmp = Compat.getBundledRS.getBundledInput(world, pos, f); + byte[] tmp = Compat.getBundledRS.run(world, pos, f); if (tmp!=null) { for (int i = 0;i<16;i++) { if (tmp[i]>data[i]) { @@ -55,6 +61,22 @@ public class TileEntityRSPanelOthers extends TileEntityRSPanel implements IBundl @Override protected void updateOutput() { - world.notifyNeighborsOfStateChange(pos, getBlockType(), true); + Compat.updateBundledRS.run(world, pos, null); + } + + @Nullable + @Override + public T getCapability(@Nonnull Capability capability, @Nullable EnumFacing facing) { + if (capability==Charset.EMITTER_CAP) { + return Charset.EMITTER_CAP.cast(()->Arrays.copyOf(out, 16)); + } else if (capability==Charset.RECEIVER_CAP) { + return Charset.RECEIVER_CAP.cast(this::updateInput); + } + return null; + } + + @Override + public boolean hasCapability(@Nonnull Capability capability, @Nullable EnumFacing facing) { + return capability==Charset.EMITTER_CAP||capability==Charset.RECEIVER_CAP; } } diff --git a/src/main/java/malte0811/industrialWires/compat/Compat.java b/src/main/java/malte0811/industrialWires/compat/Compat.java index f1497f0..7833e9c 100644 --- a/src/main/java/malte0811/industrialWires/compat/Compat.java +++ b/src/main/java/malte0811/industrialWires/compat/Compat.java @@ -25,6 +25,7 @@ import ic2.api.energy.tile.IEnergyTile; import ic2.api.item.IBoxable; import ic2.api.item.IC2Items; import ic2.core.block.TileEntityBlock; +import malte0811.industrialWires.compat.CompatCapabilities.Charset; import malte0811.industrialWires.hv.MarxOreHandler; import malte0811.industrialWires.mech_mb.MechPartCommutator; import mrtjp.projectred.api.ProjectRedAPI; @@ -32,11 +33,14 @@ import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.EnumFacing; import net.minecraft.util.ResourceLocation; import net.minecraft.util.math.RayTraceResult; import net.minecraft.world.gen.structure.template.Template; import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.fml.common.Loader; +import pl.asie.charset.api.wires.IBundledEmitter; +import pl.asie.charset.api.wires.IBundledReceiver; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; @@ -45,6 +49,9 @@ import java.util.function.BiFunction; import java.util.function.Consumer; public class Compat { + public static final String IC2_ID = "ic2"; + public static final String CRAFTTWEAKER_ID = "crafttweaker"; + public static final String CHARSET_ID = "charset"; public static BiFunction stackFromInfo = (s, i)->s; static Consumer addMarx = (o) -> { }; @@ -54,10 +61,12 @@ public class Compat { }; public static Consumer unloadIC2Tile = te -> { }; - public static IBundledRSGetter getBundledRS = (w, p, f) -> new byte[16]; + public static IBlockAction getBundledRS = (w, p, f) -> new byte[16]; + public static IBlockAction updateBundledRS = (w, p, f) -> null; public static boolean enableOtherRS = false; - private static Map> modules = ImmutableMap.of("ic2", CompatIC2.class, - "crafttweaker", CompatCT.class, ProjectRedAPI.modIDCore, CompatProjectRed.class); + private static Map> modules = ImmutableMap.of(IC2_ID, CompatIC2.class, + CRAFTTWEAKER_ID, CompatCT.class, ProjectRedAPI.modIDCore, CompatProjectRed.class, + CHARSET_ID, CompatCharset.class); private static Method preInit; private static Method init; @@ -162,10 +171,10 @@ public class Compat { @Override public void init() { super.init(); - IBundledRSGetter old = getBundledRS; + IBlockAction oldGet = getBundledRS; enableOtherRS = true; getBundledRS = (w, p, f) -> { - byte[] oldIn = old.getBundledInput(w, p, f); + byte[] oldIn = oldGet.run(w, p, f); byte[] prIn = ProjectRedAPI.transmissionAPI.getBundledInput(w, p, f); if (prIn!=null) { for (int i = 0; i < 16; i++) { @@ -174,6 +183,51 @@ public class Compat { } return oldIn; }; + IBlockAction oldUpdate = updateBundledRS; + updateBundledRS = (w, p, f)-> { + oldUpdate.run(w, p, f); + w.notifyNeighborsOfStateChange(p, w.getBlockState(p).getBlock(), true); + return null; + }; + } + } + + public static class CompatCharset extends CompatModule { + @Override + public void init() { + super.init(); + IBlockAction old = getBundledRS; + enableOtherRS = true; + getBundledRS = (w, p, f) -> { + byte[] oldIn = old.run(w, p, f); + TileEntity te = w.getTileEntity(p.offset(f)); + if (te!=null && te.hasCapability(Charset.EMITTER_CAP, f.getOpposite())) { + IBundledEmitter emitter = te.getCapability(Charset.EMITTER_CAP, f.getOpposite()); + assert emitter!=null; + byte[] charIn = emitter.getBundledSignal(); + if (charIn!=null) { + for (int i = 0;i<16;i++) { + if (charIn[i]>oldIn[i]) { + oldIn[i] = charIn[i]; + } + } + } + } + return oldIn; + }; + IBlockAction oldUpdate = updateBundledRS; + updateBundledRS = (w, p, __)-> { + oldUpdate.run(w, p, __); + for (EnumFacing face : EnumFacing.VALUES) { + TileEntity te = w.getTileEntity(p.offset(face.getOpposite())); + if (te != null && te.hasCapability(Charset.RECEIVER_CAP, face)) { + IBundledReceiver receiver = te.getCapability(Charset.RECEIVER_CAP, face); + assert receiver != null; + receiver.onBundledInputChange(); + } + } + return null; + }; } } } \ No newline at end of file diff --git a/src/main/java/malte0811/industrialWires/compat/CompatCapabilities.java b/src/main/java/malte0811/industrialWires/compat/CompatCapabilities.java new file mode 100644 index 0000000..f9512d5 --- /dev/null +++ b/src/main/java/malte0811/industrialWires/compat/CompatCapabilities.java @@ -0,0 +1,30 @@ +/* + * This file is part of Industrial Wires. + * Copyright (C) 2016-2018 malte0811 + * Industrial Wires is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * Industrial Wires is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * You should have received a copy of the GNU General Public License + * along with Industrial Wires. If not, see . + */ + +package malte0811.industrialWires.compat; + +import net.minecraftforge.common.capabilities.Capability; +import net.minecraftforge.common.capabilities.CapabilityInject; +import pl.asie.charset.api.wires.IBundledEmitter; +import pl.asie.charset.api.wires.IBundledReceiver; + +public class CompatCapabilities { + public static class Charset { + @CapabilityInject(IBundledEmitter.class) + public static Capability EMITTER_CAP; + @CapabilityInject(IBundledReceiver.class) + public static Capability RECEIVER_CAP; + } +} diff --git a/src/main/java/malte0811/industrialWires/compat/IBundledRSGetter.java b/src/main/java/malte0811/industrialWires/compat/IBlockAction.java similarity index 86% rename from src/main/java/malte0811/industrialWires/compat/IBundledRSGetter.java rename to src/main/java/malte0811/industrialWires/compat/IBlockAction.java index 54f4b9f..1221aa4 100644 --- a/src/main/java/malte0811/industrialWires/compat/IBundledRSGetter.java +++ b/src/main/java/malte0811/industrialWires/compat/IBlockAction.java @@ -15,10 +15,9 @@ package malte0811.industrialWires.compat; -import net.minecraft.util.EnumFacing; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; -public interface IBundledRSGetter { - byte[] getBundledInput(World w, BlockPos pos, EnumFacing f); +public interface IBlockAction { + R run(World w, BlockPos pos, P f); } diff --git a/src/main/java/malte0811/industrialWires/crafting/RecipeCoilLength.java b/src/main/java/malte0811/industrialWires/crafting/RecipeCoilLength.java index cc2015f..7a94207 100644 --- a/src/main/java/malte0811/industrialWires/crafting/RecipeCoilLength.java +++ b/src/main/java/malte0811/industrialWires/crafting/RecipeCoilLength.java @@ -43,7 +43,7 @@ public class RecipeCoilLength extends IForgeRegistryEntry.Impl implemen } @Override - public boolean matches(@Nonnull InventoryCrafting inv, @Nonnull World worldIn) { + public boolean matches(@Nonnull InventoryCrafting inv, @Nullable World worldIn) { int l = getLength(inv); return l > 0; } diff --git a/src/main/java/malte0811/industrialWires/crafting/RecipeComponentCopy.java b/src/main/java/malte0811/industrialWires/crafting/RecipeComponentCopy.java index b081e64..9c58755 100644 --- a/src/main/java/malte0811/industrialWires/crafting/RecipeComponentCopy.java +++ b/src/main/java/malte0811/industrialWires/crafting/RecipeComponentCopy.java @@ -31,7 +31,7 @@ import javax.annotation.Nullable; public class RecipeComponentCopy extends IForgeRegistryEntry.Impl implements IRecipe { @Override - public boolean matches(@Nonnull InventoryCrafting inv, World worldIn) { + public boolean matches(@Nonnull InventoryCrafting inv, @Nullable World worldIn) { boolean found = false; int foundX = -1; int foundY = -1; diff --git a/src/main/java/malte0811/industrialWires/crafting/RecipeKeyLock.java b/src/main/java/malte0811/industrialWires/crafting/RecipeKeyLock.java index 3c458a5..dfc755b 100644 --- a/src/main/java/malte0811/industrialWires/crafting/RecipeKeyLock.java +++ b/src/main/java/malte0811/industrialWires/crafting/RecipeKeyLock.java @@ -29,11 +29,12 @@ import net.minecraft.world.World; import net.minecraftforge.registries.IForgeRegistryEntry; import javax.annotation.Nonnull; +import javax.annotation.Nullable; public class RecipeKeyLock extends IForgeRegistryEntry.Impl implements IRecipe { @Override - public boolean matches(@Nonnull InventoryCrafting inv, World worldIn) { + public boolean matches(@Nonnull InventoryCrafting inv, @Nullable World worldIn) { return getLockId(inv) != 0; } diff --git a/src/main/java/malte0811/industrialWires/crafting/RecipeKeyRing.java b/src/main/java/malte0811/industrialWires/crafting/RecipeKeyRing.java index ac768f6..51466fd 100644 --- a/src/main/java/malte0811/industrialWires/crafting/RecipeKeyRing.java +++ b/src/main/java/malte0811/industrialWires/crafting/RecipeKeyRing.java @@ -27,6 +27,7 @@ import net.minecraft.world.World; import net.minecraftforge.registries.IForgeRegistryEntry; import javax.annotation.Nonnull; +import javax.annotation.Nullable; import static malte0811.industrialWires.util.NBTKeys.*; @@ -38,7 +39,7 @@ public class RecipeKeyRing extends IForgeRegistryEntry.Impl implements } @Override - public boolean matches(@Nonnull InventoryCrafting inv, World worldIn) { + public boolean matches(@Nonnull InventoryCrafting inv, @Nullable World worldIn) { return isValid(inv); } diff --git a/src/main/resources/assets/industrialwires/blockstates/control_panel.json b/src/main/resources/assets/industrialwires/blockstates/control_panel.json index 2b23687..3ff974c 100644 --- a/src/main/resources/assets/industrialwires/blockstates/control_panel.json +++ b/src/main/resources/assets/industrialwires/blockstates/control_panel.json @@ -112,7 +112,7 @@ "model": "industrialwires:block/panel_creator.obj" //Doesn't matter, this will be overridden in code }, - "other_rs_wires": { + "inventory,type=other_rs_wires": { "model": "cube_all", "textures": {"all": "industrialwires:blocks/rs_panel_others"} }