MCMP occlusion
This commit is contained in:
@@ -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")
|
||||
|
||||
@@ -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)));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user