Fixed occlusion not working on other side, should fix dependency issue as well

This commit is contained in:
raoulvdberge
2017-02-25 11:47:41 +01:00
parent 665be14de4
commit 80b5da6aad
4 changed files with 99 additions and 83 deletions

View File

@@ -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;
}
}

View File

@@ -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;

View File

@@ -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<TileEntity> 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> T getCapability(@Nonnull Capability<T> 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<AxisAlignedBB> 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");
}

View File

@@ -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<TileEntity> 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> T getCapability(@Nonnull Capability<T> 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<AxisAlignedBB> 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;
}
}