From 7ecc8d594ab66c352a25a117e5c085ddf15909a8 Mon Sep 17 00:00:00 2001 From: raoulvdberge Date: Mon, 20 Feb 2017 01:33:56 +0100 Subject: [PATCH] MCMP occlusion --- .../com/raoulvdberge/refinedstorage/RS.java | 2 +- .../network/node/NetworkNodeCable.java | 11 +++++ .../refinedstorage/block/BlockCable.java | 25 ++++++++++- .../integration/mcmp/IntegrationMCMP.java | 41 ++++++++++++++++++- .../integration/mcmp/PartCable.java | 7 ++++ .../integration/mcmp/PartCableTile.java | 11 +++++ 6 files changed, 94 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/raoulvdberge/refinedstorage/RS.java b/src/main/java/com/raoulvdberge/refinedstorage/RS.java index d81952d4d..f91f67916 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/RS.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/RS.java @@ -23,7 +23,7 @@ public final class RS { public static final String ID = "refinedstorage"; public static final String VERSION = "1.4.1"; - public static final String DEPENDENCIES = "required-after:forge@[13.19.1.2188,);after:commoncapabilities@[1.3.1,);before:mcmultipart;"; + public static final String DEPENDENCIES = "required-after:forge@[13.19.1.2188,);after:commoncapabilities@[1.3.1,);"; public static final String GUI_FACTORY = "com.raoulvdberge.refinedstorage.gui.config.ModGuiFactory"; @SidedProxy(clientSide = "com.raoulvdberge.refinedstorage.proxy.ProxyClient", serverSide = "com.raoulvdberge.refinedstorage.proxy.ProxyCommon") 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 1053d752e..4c0eca57b 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 @@ -1,6 +1,12 @@ 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 net.minecraft.util.EnumFacing; + +import javax.annotation.Nullable; +import java.util.Collections; public class NetworkNodeCable extends NetworkNode { public static final String ID = "cable"; @@ -18,4 +24,9 @@ public class NetworkNodeCable extends NetworkNode { public String getId() { return ID; } + + @Override + public boolean canConduct(@Nullable EnumFacing direction) { + return !IntegrationMCMP.isLoaded() || IntegrationMCMP.hasConnectionWith(holder.world(), holder.pos(), Collections.singletonList(BlockCable.directionToAABB(direction))); + } } diff --git a/src/main/java/com/raoulvdberge/refinedstorage/block/BlockCable.java b/src/main/java/com/raoulvdberge/refinedstorage/block/BlockCable.java index 562352143..8d5e5068a 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/block/BlockCable.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/block/BlockCable.java @@ -1,6 +1,7 @@ package com.raoulvdberge.refinedstorage.block; import com.raoulvdberge.refinedstorage.RSUtils; +import com.raoulvdberge.refinedstorage.integration.mcmp.IntegrationMCMP; import com.raoulvdberge.refinedstorage.proxy.CapabilityNetworkNodeProxy; import com.raoulvdberge.refinedstorage.tile.TileCable; import net.minecraft.block.properties.PropertyBool; @@ -93,7 +94,29 @@ public class BlockCable extends BlockNode { TileEntity otherTile = world.getTileEntity(pos.offset(direction)); EnumFacing otherTileSide = direction.getOpposite(); - return otherTile != null && otherTile.hasCapability(CapabilityNetworkNodeProxy.NETWORK_NODE_PROXY_CAPABILITY, otherTileSide); + if (otherTile != null && otherTile.hasCapability(CapabilityNetworkNodeProxy.NETWORK_NODE_PROXY_CAPABILITY, otherTileSide)) { + return !IntegrationMCMP.isLoaded() || IntegrationMCMP.hasConnectionWith(world, pos, Collections.singletonList(directionToAABB(direction))); + } + + return false; + } + + public static AxisAlignedBB directionToAABB(EnumFacing facing) { + if (facing == EnumFacing.NORTH) { + return NORTH_AABB; + } else if (facing == EnumFacing.EAST) { + return EAST_AABB; + } else if (facing == EnumFacing.SOUTH) { + return SOUTH_AABB; + } else if (facing == EnumFacing.WEST) { + return WEST_AABB; + } else if (facing == EnumFacing.UP) { + return UP_AABB; + } else if (facing == EnumFacing.DOWN) { + return DOWN_AABB; + } + + return NORTH_AABB; } private boolean isInAABB(AxisAlignedBB aabb, float hitX, float hitY, float hitZ) { 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 14e08f2a2..f23e98f40 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/integration/mcmp/IntegrationMCMP.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/integration/mcmp/IntegrationMCMP.java @@ -3,20 +3,29 @@ 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 { @@ -31,6 +40,8 @@ public class IntegrationMCMP implements IMCMPAddon { @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; @@ -40,11 +51,39 @@ public class IntegrationMCMP implements IMCMPAddon { @Override public T getCapability(@Nonnull Capability capability, @Nullable EnumFacing facing) { if (capability == MCMPCapabilities.MULTIPART_TILE) { - return MCMPCapabilities.MULTIPART_TILE.cast(new PartCableTile(e.getObject())); + 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 static boolean isLoaded() { + return Loader.isModLoaded("mcmultipart"); + } } diff --git a/src/main/java/com/raoulvdberge/refinedstorage/integration/mcmp/PartCable.java b/src/main/java/com/raoulvdberge/refinedstorage/integration/mcmp/PartCable.java index 0ba271a66..236aa08a7 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/integration/mcmp/PartCable.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/integration/mcmp/PartCable.java @@ -1,6 +1,8 @@ package com.raoulvdberge.refinedstorage.integration.mcmp; import com.raoulvdberge.refinedstorage.RSBlocks; +import com.raoulvdberge.refinedstorage.apiimpl.API; +import mcmultipart.api.container.IPartInfo; import mcmultipart.api.multipart.IMultipart; import mcmultipart.api.slot.EnumCenterSlot; import mcmultipart.api.slot.IPartSlot; @@ -27,4 +29,9 @@ public class PartCable implements IMultipart { public Block getBlock() { return RSBlocks.CABLE; } + + @Override + public void onPartChanged(IPartInfo part, IPartInfo otherPart) { + API.instance().discoverNode(part.getWorld(), part.getContainer().getPos()); + } } diff --git a/src/main/java/com/raoulvdberge/refinedstorage/integration/mcmp/PartCableTile.java b/src/main/java/com/raoulvdberge/refinedstorage/integration/mcmp/PartCableTile.java index 829660e5f..601979f71 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/integration/mcmp/PartCableTile.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/integration/mcmp/PartCableTile.java @@ -1,17 +1,28 @@ package com.raoulvdberge.refinedstorage.integration.mcmp; +import mcmultipart.api.container.IPartInfo; import mcmultipart.api.multipart.IMultipartTile; import net.minecraft.tileentity.TileEntity; public class PartCableTile implements IMultipartTile { private TileEntity tile; + private IPartInfo info; public PartCableTile(TileEntity tile) { this.tile = tile; } + @Override + public void setPartInfo(IPartInfo info) { + this.info = info; + } + @Override public TileEntity getTileEntity() { return tile; } + + public IPartInfo getInfo() { + return info; + } }