diff --git a/integration/IntegrationType.java b/integration/IntegrationType.java index 164efa3dc..f6fdbcd46 100644 --- a/integration/IntegrationType.java +++ b/integration/IntegrationType.java @@ -38,7 +38,9 @@ public enum IntegrationType CraftGuide(IntegrationSide.CLIENT, "Craft Guide", "craftguide"), - Mekanism(IntegrationSide.BOTH, "Mekanism", "Mekanism"); + Mekanism(IntegrationSide.BOTH, "Mekanism", "Mekanism"), + + ImmibisMicroblocks(IntegrationSide.BOTH, "ImmibisMicroblocks", "ImmibisMicroblocks"); public final IntegrationSide side; public final String dspName; diff --git a/integration/abstraction/IImmibisMicroblocks.java b/integration/abstraction/IImmibisMicroblocks.java new file mode 100644 index 000000000..5d6898dbd --- /dev/null +++ b/integration/abstraction/IImmibisMicroblocks.java @@ -0,0 +1,18 @@ +package appeng.integration.abstraction; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.tileentity.TileEntity; +import appeng.api.parts.IPartHost; + +public interface IImmibisMicroblocks +{ + + IPartHost getOrCreateHost(EntityPlayer player, int side, TileEntity te); + + /** + * @param te + * @return true if this worked.. + */ + boolean leaveParts(TileEntity te); + +} diff --git a/integration/modules/ImmibisMicroblocks.java b/integration/modules/ImmibisMicroblocks.java new file mode 100644 index 000000000..400f5e310 --- /dev/null +++ b/integration/modules/ImmibisMicroblocks.java @@ -0,0 +1,101 @@ +package appeng.integration.modules; + +import java.lang.reflect.Method; + +import mods.immibis.core.api.multipart.ICoverSystem; +import mods.immibis.core.api.multipart.IMultipartTile; +import mods.immibis.core.api.multipart.IPartContainer; +import net.minecraft.block.Block; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.World; +import appeng.api.AEApi; +import appeng.api.parts.IPartHost; +import appeng.core.AELog; +import appeng.integration.BaseModule; +import appeng.integration.abstraction.IImmibisMicroblocks; + +public class ImmibisMicroblocks extends BaseModule implements IImmibisMicroblocks +{ + + public static ImmibisMicroblocks instance; + + boolean canConvertTiles = false; + + private Class MicroblockAPIUtils; + private Method mergeIntoMicroblockContainer; + + @Override + public void Init() throws Throwable + { + TestClass( IMultipartTile.class ); + TestClass( ICoverSystem.class ); + TestClass( IPartContainer.class ); + + try + { + MicroblockAPIUtils = Class.forName( "mods.immibis.microblocks.api.MicroblockAPIUtils" ); + mergeIntoMicroblockContainer = MicroblockAPIUtils.getMethod( "mergeIntoMicroblockContainer", ItemStack.class, EntityPlayer.class, World.class, + int.class, int.class, int.class, int.class, Block.class, int.class ); + canConvertTiles = true; + } + catch (Throwable t) + { + AELog.error( t ); + } + } + + @Override + public void PostInit() throws Throwable + { + + } + + @Override + public boolean leaveParts(TileEntity te) + { + if ( te instanceof IMultipartTile ) + { + ICoverSystem ci = ((IMultipartTile) te).getCoverSystem(); + if ( ci != null ) + ci.convertToContainerBlock(); + + return true; + } + return false; + } + + @Override + public IPartHost getOrCreateHost(EntityPlayer player, int side, TileEntity te) + { + if ( te instanceof IMultipartTile && canConvertTiles ) + { + Block blk = AEApi.instance().blocks().blockMultiPart.block(); + ItemStack what = AEApi.instance().blocks().blockMultiPart.stack( 1 ); + + World w = te.getWorldObj(); + int x = te.xCoord; + int y = te.yCoord; + int z = te.zCoord; + + try + { + // ItemStack.class, EntityPlayer.class, World.class, + // int.class, int.class, int.class, int.class, Block.class, int.class ); + mergeIntoMicroblockContainer.invoke( null, what, player, w, x, y, z, side, blk, 0 ); + } + catch (Throwable e) + { + canConvertTiles = false; + return null; // nevermind.. + } + + TileEntity tx = w.getTileEntity( x, y, z ); + if ( tx instanceof IPartHost ) + return (IPartHost) tx; + } + + return null; + } +} diff --git a/parts/PartPlacement.java b/parts/PartPlacement.java index 2ddc8f9ea..0adf75c49 100644 --- a/parts/PartPlacement.java +++ b/parts/PartPlacement.java @@ -35,6 +35,7 @@ import appeng.facade.IFacadeItem; import appeng.integration.IntegrationType; import appeng.integration.abstraction.IBC; import appeng.integration.abstraction.IFMP; +import appeng.integration.abstraction.IImmibisMicroblocks; import appeng.util.LookDirection; import appeng.util.Platform; import cpw.mods.fml.common.eventhandler.SubscribeEvent; @@ -238,6 +239,9 @@ public class PartPlacement if ( host == null && tile != null && AppEng.instance.isIntegrationEnabled( IntegrationType.FMP ) ) host = ((IFMP) AppEng.instance.getIntegration( IntegrationType.FMP )).getOrCreateHost( tile ); + if ( host == null && tile != null && AppEng.instance.isIntegrationEnabled( IntegrationType.ImmibisMicroblocks ) ) + host = ((IImmibisMicroblocks) AppEng.instance.getIntegration( IntegrationType.ImmibisMicroblocks )).getOrCreateHost( player, face, tile ); + // if ( held == null ) { Block block = world.getBlock( x, y, z ); diff --git a/tile/networking/TileCableBus.java b/tile/networking/TileCableBus.java index a339884e4..fddda7da5 100644 --- a/tile/networking/TileCableBus.java +++ b/tile/networking/TileCableBus.java @@ -25,9 +25,12 @@ import appeng.api.util.AECableType; import appeng.api.util.AEColor; import appeng.api.util.DimensionalCoord; import appeng.block.networking.BlockCableBus; +import appeng.core.AppEng; import appeng.helpers.AEMultiTile; import appeng.helpers.ICustomCollision; import appeng.hooks.TickHandler; +import appeng.integration.IntegrationType; +import appeng.integration.abstraction.IImmibisMicroblocks; import appeng.parts.CableBusContainer; import appeng.tile.AEBaseTile; import appeng.tile.events.AETileEventHandler; @@ -326,6 +329,13 @@ public class TileCableBus extends AEBaseTile implements AEMultiTile, ICustomColl @Override public void cleanup() { + if ( AppEng.instance.isIntegrationEnabled( IntegrationType.ImmibisMicroblocks ) ) + { + IImmibisMicroblocks imb = (IImmibisMicroblocks) AppEng.instance.getIntegration( IntegrationType.ImmibisMicroblocks ); + if ( imb != null && imb.leaveParts( this ) ) + return; + } + getWorldObj().setBlock( xCoord, yCoord, zCoord, Platform.air ); }