MCMP occlusion

This commit is contained in:
raoulvdberge
2017-02-20 01:33:56 +01:00
parent 5041d69716
commit 7ecc8d594a
6 changed files with 94 additions and 3 deletions

View File

@@ -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")

View File

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

View File

@@ -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) {

View File

@@ -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<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;
@@ -40,11 +51,39 @@ public class IntegrationMCMP implements IMCMPAddon {
@Override
public <T> T getCapability(@Nonnull Capability<T> 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<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 static boolean isLoaded() {
return Loader.isModLoaded("mcmultipart");
}
}

View File

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

View File

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