diff --git a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeCable.java b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeCable.java index 4c0eca57b..923e60310 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeCable.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeCable.java @@ -3,6 +3,7 @@ package com.raoulvdberge.refinedstorage.apiimpl.network.node; import com.raoulvdberge.refinedstorage.RS; import com.raoulvdberge.refinedstorage.block.BlockCable; import com.raoulvdberge.refinedstorage.integration.mcmp.IntegrationMCMP; +import com.raoulvdberge.refinedstorage.integration.mcmp.RSMCMPAddon; import net.minecraft.util.EnumFacing; import javax.annotation.Nullable; @@ -27,6 +28,11 @@ public class NetworkNodeCable extends NetworkNode { @Override public boolean canConduct(@Nullable EnumFacing direction) { - return !IntegrationMCMP.isLoaded() || IntegrationMCMP.hasConnectionWith(holder.world(), holder.pos(), Collections.singletonList(BlockCable.directionToAABB(direction))); + if (IntegrationMCMP.isLoaded() && direction != null) { + return RSMCMPAddon.hasConnectionWith(holder.world(), holder.pos(), Collections.singletonList(BlockCable.directionToAABB(direction))) + && RSMCMPAddon.hasConnectionWith(holder.world(), holder.pos().offset(direction), Collections.singletonList(BlockCable.directionToAABB(direction.getOpposite()))); + } + + return true; } } diff --git a/src/main/java/com/raoulvdberge/refinedstorage/block/BlockCable.java b/src/main/java/com/raoulvdberge/refinedstorage/block/BlockCable.java index 8d5e5068a..5a87871e4 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/block/BlockCable.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/block/BlockCable.java @@ -2,6 +2,7 @@ package com.raoulvdberge.refinedstorage.block; import com.raoulvdberge.refinedstorage.RSUtils; import com.raoulvdberge.refinedstorage.integration.mcmp.IntegrationMCMP; +import com.raoulvdberge.refinedstorage.integration.mcmp.RSMCMPAddon; import com.raoulvdberge.refinedstorage.proxy.CapabilityNetworkNodeProxy; import com.raoulvdberge.refinedstorage.tile.TileCable; import net.minecraft.block.properties.PropertyBool; @@ -95,7 +96,12 @@ public class BlockCable extends BlockNode { EnumFacing otherTileSide = direction.getOpposite(); if (otherTile != null && otherTile.hasCapability(CapabilityNetworkNodeProxy.NETWORK_NODE_PROXY_CAPABILITY, otherTileSide)) { - return !IntegrationMCMP.isLoaded() || IntegrationMCMP.hasConnectionWith(world, pos, Collections.singletonList(directionToAABB(direction))); + if (IntegrationMCMP.isLoaded()) { + return RSMCMPAddon.hasConnectionWith(world, pos, Collections.singletonList(BlockCable.directionToAABB(direction))) + && RSMCMPAddon.hasConnectionWith(world, pos.offset(direction), Collections.singletonList(BlockCable.directionToAABB(direction.getOpposite()))); + } + + return true; } return false; diff --git a/src/main/java/com/raoulvdberge/refinedstorage/integration/mcmp/IntegrationMCMP.java b/src/main/java/com/raoulvdberge/refinedstorage/integration/mcmp/IntegrationMCMP.java index f23e98f40..505813de1 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/integration/mcmp/IntegrationMCMP.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/integration/mcmp/IntegrationMCMP.java @@ -1,88 +1,8 @@ package com.raoulvdberge.refinedstorage.integration.mcmp; -import com.raoulvdberge.refinedstorage.RSBlocks; -import mcmultipart.api.addon.IMCMPAddon; -import mcmultipart.api.addon.MCMPAddon; -import mcmultipart.api.container.IPartInfo; -import mcmultipart.api.multipart.IMultipart; -import mcmultipart.api.multipart.IMultipartRegistry; -import mcmultipart.api.multipart.IMultipartTile; -import mcmultipart.api.multipart.MultipartOcclusionHelper; -import mcmultipart.api.ref.MCMPCapabilities; -import net.minecraft.item.Item; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.EnumFacing; -import net.minecraft.util.ResourceLocation; -import net.minecraft.util.math.AxisAlignedBB; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.IBlockAccess; -import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.common.capabilities.Capability; -import net.minecraftforge.common.capabilities.ICapabilityProvider; -import net.minecraftforge.event.AttachCapabilitiesEvent; import net.minecraftforge.fml.common.Loader; -import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; - -import javax.annotation.Nonnull; -import javax.annotation.Nullable; -import java.util.List; - -@MCMPAddon -public class IntegrationMCMP implements IMCMPAddon { - @Override - public void registerParts(IMultipartRegistry registry) { - MinecraftForge.EVENT_BUS.register(this); - - registry.registerPartWrapper(RSBlocks.CABLE, new PartCable()); - registry.registerStackWrapper(Item.getItemFromBlock(RSBlocks.CABLE), s -> true, RSBlocks.CABLE); - } - - @SubscribeEvent - public void onAttachCapability(AttachCapabilitiesEvent e) { - e.addCapability(new ResourceLocation("refinedstorage:cable"), new ICapabilityProvider() { - private PartCableTile tile; - - @Override - public boolean hasCapability(@Nonnull Capability capability, @Nullable EnumFacing facing) { - return capability == MCMPCapabilities.MULTIPART_TILE; - } - - @Nullable - @Override - public T getCapability(@Nonnull Capability capability, @Nullable EnumFacing facing) { - if (capability == MCMPCapabilities.MULTIPART_TILE) { - if (tile == null) { - tile = new PartCableTile(e.getObject()); - } - - return MCMPCapabilities.MULTIPART_TILE.cast(tile); - } - - return null; - } - }); - } - - public static boolean hasConnectionWith(IBlockAccess world, BlockPos pos, List aabbs) { - TileEntity tile = world.getTileEntity(pos); - - if (tile != null && tile.hasCapability(MCMPCapabilities.MULTIPART_TILE, null)) { - IMultipartTile multipartTile = tile.getCapability(MCMPCapabilities.MULTIPART_TILE, null); - - if (multipartTile instanceof PartCableTile && ((PartCableTile) multipartTile).getInfo() != null) { - for (IPartInfo info : ((PartCableTile) multipartTile).getInfo().getContainer().getParts().values()) { - IMultipart multipart = info.getPart(); - - if (MultipartOcclusionHelper.testBoxIntersection(aabbs, multipart.getOcclusionBoxes(info))) { - return false; - } - } - } - } - - return true; - } +public final class IntegrationMCMP { public static boolean isLoaded() { return Loader.isModLoaded("mcmultipart"); } diff --git a/src/main/java/com/raoulvdberge/refinedstorage/integration/mcmp/RSMCMPAddon.java b/src/main/java/com/raoulvdberge/refinedstorage/integration/mcmp/RSMCMPAddon.java new file mode 100644 index 000000000..0f3e01071 --- /dev/null +++ b/src/main/java/com/raoulvdberge/refinedstorage/integration/mcmp/RSMCMPAddon.java @@ -0,0 +1,84 @@ +package com.raoulvdberge.refinedstorage.integration.mcmp; + +import com.raoulvdberge.refinedstorage.RSBlocks; +import mcmultipart.api.addon.IMCMPAddon; +import mcmultipart.api.addon.MCMPAddon; +import mcmultipart.api.container.IPartInfo; +import mcmultipart.api.multipart.IMultipart; +import mcmultipart.api.multipart.IMultipartRegistry; +import mcmultipart.api.multipart.IMultipartTile; +import mcmultipart.api.multipart.MultipartOcclusionHelper; +import mcmultipart.api.ref.MCMPCapabilities; +import net.minecraft.item.Item; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.EnumFacing; +import net.minecraft.util.ResourceLocation; +import net.minecraft.util.math.AxisAlignedBB; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.IBlockAccess; +import net.minecraftforge.common.MinecraftForge; +import net.minecraftforge.common.capabilities.Capability; +import net.minecraftforge.common.capabilities.ICapabilityProvider; +import net.minecraftforge.event.AttachCapabilitiesEvent; +import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; + +import javax.annotation.Nonnull; +import javax.annotation.Nullable; +import java.util.List; + +@MCMPAddon +public class RSMCMPAddon implements IMCMPAddon { + @Override + public void registerParts(IMultipartRegistry registry) { + MinecraftForge.EVENT_BUS.register(this); + + registry.registerPartWrapper(RSBlocks.CABLE, new PartCable()); + registry.registerStackWrapper(Item.getItemFromBlock(RSBlocks.CABLE), s -> true, RSBlocks.CABLE); + } + + @SubscribeEvent + public void onAttachCapability(AttachCapabilitiesEvent e) { + e.addCapability(new ResourceLocation("refinedstorage:cable"), new ICapabilityProvider() { + private PartCableTile tile; + + @Override + public boolean hasCapability(@Nonnull Capability capability, @Nullable EnumFacing facing) { + return capability == MCMPCapabilities.MULTIPART_TILE; + } + + @Nullable + @Override + public T getCapability(@Nonnull Capability capability, @Nullable EnumFacing facing) { + if (capability == MCMPCapabilities.MULTIPART_TILE) { + if (tile == null) { + tile = new PartCableTile(e.getObject()); + } + + return MCMPCapabilities.MULTIPART_TILE.cast(tile); + } + + return null; + } + }); + } + + public static boolean hasConnectionWith(IBlockAccess world, BlockPos pos, List aabbs) { + TileEntity tile = world.getTileEntity(pos); + + if (tile != null && tile.hasCapability(MCMPCapabilities.MULTIPART_TILE, null)) { + IMultipartTile multipartTile = tile.getCapability(MCMPCapabilities.MULTIPART_TILE, null); + + if (multipartTile instanceof PartCableTile && ((PartCableTile) multipartTile).getInfo() != null) { + for (IPartInfo info : ((PartCableTile) multipartTile).getInfo().getContainer().getParts().values()) { + IMultipart multipart = info.getPart(); + + if (MultipartOcclusionHelper.testBoxIntersection(aabbs, multipart.getOcclusionBoxes(info))) { + return false; + } + } + } + } + + return true; + } +}