diff --git a/src/api/java/appeng/api/networking/IAssemblerCache.java b/src/api/java/appeng/api/networking/IAssemblerCache.java new file mode 100644 index 00000000..5b4181c8 --- /dev/null +++ b/src/api/java/appeng/api/networking/IAssemblerCache.java @@ -0,0 +1,3 @@ +package appeng.api.networking; + +public interface IAssemblerCache extends IGridCache {} diff --git a/src/main/java/appeng/block/legacy/BlockAssembler.java b/src/main/java/appeng/block/legacy/BlockAssembler.java new file mode 100644 index 00000000..ac826c36 --- /dev/null +++ b/src/main/java/appeng/block/legacy/BlockAssembler.java @@ -0,0 +1,42 @@ +package appeng.block.legacy; + +import appeng.core.sync.GuiBridge; +import appeng.tile.legacy.TileAssembler; +import appeng.util.Platform; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; + +public class BlockAssembler extends BlockAssemblerBase { + public BlockAssembler() { + super(TileAssembler.class); + } + + @Override + public boolean onBlockActivated( + World w, + int x, + int y, + int z, + EntityPlayer p, + int side, + // useless parameters + float alec1, + float alec2, + float alec3 + ) { + TileEntity tileEntity = w.getTileEntity(x, y, z); + if (tileEntity != null) { + Platform.openGUI( + p, + tileEntity, + ForgeDirection.getOrientation(side), + GuiBridge.GUI_ASSEMBLER + ); + return true; + } else { + return false; + } + } +} diff --git a/src/main/java/appeng/block/legacy/BlockAssemblerBase.java b/src/main/java/appeng/block/legacy/BlockAssemblerBase.java new file mode 100644 index 00000000..69a48098 --- /dev/null +++ b/src/main/java/appeng/block/legacy/BlockAssemblerBase.java @@ -0,0 +1,30 @@ +package appeng.block.legacy; + +import java.util.EnumSet; + +import appeng.block.AEBaseTileBlock; +import appeng.core.features.AEFeature; +import appeng.me.cluster.IAssemblerMB; +import net.minecraft.block.material.Material; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.IBlockAccess; + +public abstract class BlockAssemblerBase extends AEBaseTileBlock { + public BlockAssemblerBase(Class tile) { + super(Material.iron); + this.setTileEntity(tile); + this.setFeature(EnumSet.of(AEFeature.Legacy)); + } + + @Override + public void onNeighborChange( + IBlockAccess world, int x, int y, int z, int tileX, int tileY, int tileZ + ) { + super.onNeighborChange(world, x, y, z, tileX, tileY, tileZ); + TileEntity te = world.getTileEntity(x, y, z); + if (!(te instanceof IAssemblerMB)) + return; + + ((IAssemblerMB) te).calculateMultiblock(); + } +} diff --git a/src/main/java/appeng/block/legacy/BlockAssemblerCraftingAccelerator.java b/src/main/java/appeng/block/legacy/BlockAssemblerCraftingAccelerator.java new file mode 100644 index 00000000..73fa4a21 --- /dev/null +++ b/src/main/java/appeng/block/legacy/BlockAssemblerCraftingAccelerator.java @@ -0,0 +1,9 @@ +package appeng.block.legacy; + +import appeng.tile.legacy.TileAssemblerCraftingAccelerator; + +public class BlockAssemblerCraftingAccelerator extends BlockAssemblerMB { + public BlockAssemblerCraftingAccelerator() { + super(TileAssemblerCraftingAccelerator.class); + } +} diff --git a/src/main/java/appeng/block/legacy/BlockAssemblerHeatVent.java b/src/main/java/appeng/block/legacy/BlockAssemblerHeatVent.java new file mode 100644 index 00000000..4e450305 --- /dev/null +++ b/src/main/java/appeng/block/legacy/BlockAssemblerHeatVent.java @@ -0,0 +1,13 @@ +package appeng.block.legacy; + +import appeng.block.AEBaseBlock; +import appeng.client.render.BaseBlockRender; +import appeng.client.render.blocks.RenderBlockAssemblerHeatVent; +import appeng.tile.AEBaseTile; + +public class BlockAssemblerHeatVent extends BlockAssemblerMB { + @Override + protected BaseBlockRender getRenderer() { + return new RenderBlockAssemblerHeatVent(); + } +} diff --git a/src/main/java/appeng/block/legacy/BlockAssemblerMB.java b/src/main/java/appeng/block/legacy/BlockAssemblerMB.java new file mode 100644 index 00000000..42c1b030 --- /dev/null +++ b/src/main/java/appeng/block/legacy/BlockAssemblerMB.java @@ -0,0 +1,53 @@ +package appeng.block.legacy; + +import appeng.core.sync.GuiBridge; +import appeng.tile.legacy.TileAssemblerMB; +import appeng.util.Platform; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; + +/** + * A base class that all assembler wall blocks inherit from + */ +public abstract class BlockAssemblerMB extends BlockAssemblerBase { + public BlockAssemblerMB() { + this(TileAssemblerMB.class); + } + + public BlockAssemblerMB(Class te) { + super(te); + } + + @Override + public boolean onBlockActivated( + World w, + int x, + int y, + int z, + EntityPlayer p, + int side, + // useless parameters + float alec1, + float alec2, + float alec3 + ) { + TileEntity tileEntity = w.getTileEntity(x, y, z); + if (tileEntity != null) { + TileAssemblerMB tamb = (TileAssemblerMB) tileEntity; + if (tamb.isComplete()) { + if (Platform.isServer()) { + Platform.openGUI( + p, + tamb.ac.assemblers.get(0), + ForgeDirection.getOrientation(side), + GuiBridge.GUI_ASSEMBLER_MB + ); + } + return true; + } + } + return false; + } +} diff --git a/src/main/java/appeng/block/legacy/BlockAssemblerWall.java b/src/main/java/appeng/block/legacy/BlockAssemblerWall.java new file mode 100644 index 00000000..9c5264a2 --- /dev/null +++ b/src/main/java/appeng/block/legacy/BlockAssemblerWall.java @@ -0,0 +1,13 @@ +package appeng.block.legacy; + +import appeng.block.AEBaseBlock; +import appeng.client.render.BaseBlockRender; +import appeng.client.render.blocks.RenderBlockAssemblerWall; +import appeng.tile.AEBaseTile; + +public class BlockAssemblerWall extends BlockAssemblerMB { + @Override + protected BaseBlockRender getRenderer() { + return new RenderBlockAssemblerWall(); + } +} diff --git a/src/main/java/appeng/client/gui/implementations/GuiAssembler.java b/src/main/java/appeng/client/gui/implementations/GuiAssembler.java new file mode 100644 index 00000000..c1a4a90a --- /dev/null +++ b/src/main/java/appeng/client/gui/implementations/GuiAssembler.java @@ -0,0 +1,40 @@ +package appeng.client.gui.implementations; + +import appeng.client.gui.AEBaseGui; +import appeng.container.implementations.ContainerAssembler; +import appeng.tile.legacy.TileAssembler; +import net.minecraft.entity.player.InventoryPlayer; +import net.minecraft.util.StatCollector; +import org.lwjgl.opengl.GL11; + +public class GuiAssembler extends AEBaseGui { + public GuiAssembler(InventoryPlayer inventoryPlayer, TileAssembler tileEntity) { + super(new ContainerAssembler(inventoryPlayer, tileEntity)); + this.ySize = 222; + } + + @Override + public void drawFG(int offsetX, int offsetY, int mouseX, int mouseY) { + this.fontRendererObj.drawString( + StatCollector.translateToLocal("gui.appliedenergistics2.Assembler"), + 8, + 6, + 4210752 + ); + this.fontRendererObj.drawString( + StatCollector.translateToLocal("container.inventory"), + 8, + this.ySize - 96 + 3, + 4210752 + ); + } + + @Override + public void drawBG(int offsetX, int offsetY, int mouseX, int mouseY) { + this.bindTexture("guis/assembler.png"); + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + int x = (this.width - this.xSize) / 2; + int y = (this.height - this.ySize) / 2; + this.drawTexturedModalRect(x, y, 0, 0, this.xSize, this.ySize); + } +} diff --git a/src/main/java/appeng/client/gui/implementations/GuiAssemblerMB.java b/src/main/java/appeng/client/gui/implementations/GuiAssemblerMB.java new file mode 100644 index 00000000..baff0fa1 --- /dev/null +++ b/src/main/java/appeng/client/gui/implementations/GuiAssemblerMB.java @@ -0,0 +1,93 @@ +package appeng.client.gui.implementations; + +import appeng.client.gui.AEBaseGui; +import appeng.container.implementations.ContainerAssemblerMB; +import appeng.core.sync.network.NetworkHandler; +import appeng.core.sync.packets.PacketChangeAssemblerGuiPage; +import appeng.core.sync.packets.PacketUpdateAssemblerGuiPageNum; +import appeng.tile.legacy.TileAssembler; +import net.minecraft.client.gui.GuiButton; +import net.minecraft.entity.player.InventoryPlayer; +import net.minecraft.util.StatCollector; +import org.lwjgl.opengl.GL11; + +public class GuiAssemblerMB extends AEBaseGui { + public int pageNumber = 0; + public int maxPages = 0; + public GuiButton next; + public GuiButton prev; + + public GuiAssemblerMB(InventoryPlayer inventoryPlayer, TileAssembler tileEntity) { + super(new ContainerAssemblerMB(inventoryPlayer, tileEntity)); + this.ySize = 222; + this.xSize = 223; + } + + @Override + public void drawFG(int offsetX, int offsetY, int mouseX, int mouseY) { + this.fontRendererObj.drawString( + StatCollector.translateToLocal("gui.appliedenergistics2.MAC"), 8, 6, 4210752 + ); + this.fontRendererObj.drawString( + StatCollector.translateToLocal("container.inventory"), + 8, + this.ySize - 96 + 3, + 4210752 + ); + if (this.maxPages == 0) { + this.fontRendererObj.drawString("WTF", 178, 56, 4210752); + } else { + this.fontRendererObj.drawString( + 1 + this.pageNumber + " / " + this.maxPages, 178, 56, 4210752 + ); + } + } + + @Override + public void drawBG(int offsetX, int offsetY, int mouseX, int mouseY) { + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + this.bindTexture("guis/mulitiassembler.png"); + int x = (this.width - this.xSize) / 2; + int y = (this.height - this.ySize) / 2; + this.next.xPosition = x + this.xSize - 48; + this.next.yPosition = y + 6; + this.prev.xPosition = x + this.xSize - 48; + this.prev.yPosition = y + 29; + this.drawTexturedModalRect(x, y, 0, 0, this.xSize, this.ySize); + } + + @Override + public void initGui() { + super.initGui(); + this.buttonList.add( + this.next = new GuiButton( + 1, + 238, + 94, + 42, + 20, + StatCollector.translateToLocal("gui.appliedenergistics2.Next") + ) + ); + this.buttonList.add( + this.prev = new GuiButton( + 1, + 238, + 94, + 42, + 20, + StatCollector.translateToLocal("gui.appliedenergistics2.Prev") + ) + ); + NetworkHandler.instance.sendToServer(new PacketUpdateAssemblerGuiPageNum(0, 0)); + } + + @Override + protected void actionPerformed(GuiButton button) { + if (button == this.next) { + NetworkHandler.instance.sendToServer(new PacketChangeAssemblerGuiPage(1)); + } else if (button == this.prev) { + NetworkHandler.instance.sendToServer(new PacketChangeAssemblerGuiPage(-1)); + } + } +} diff --git a/src/main/java/appeng/client/render/blocks/RenderBlockAssemblerHeatVent.java b/src/main/java/appeng/client/render/blocks/RenderBlockAssemblerHeatVent.java new file mode 100644 index 00000000..ebda000a --- /dev/null +++ b/src/main/java/appeng/client/render/blocks/RenderBlockAssemblerHeatVent.java @@ -0,0 +1,33 @@ +package appeng.client.render.blocks; + +import appeng.block.legacy.BlockAssemblerHeatVent; +import appeng.client.render.BaseBlockRender; +import appeng.client.texture.ExtraBlockTextures; +import appeng.tile.legacy.TileAssemblerMB; +import net.minecraft.client.renderer.RenderBlocks; +import net.minecraft.world.IBlockAccess; + +public class RenderBlockAssemblerHeatVent + extends BaseBlockRender { + @Override + public boolean renderInWorld( + BlockAssemblerHeatVent block, + IBlockAccess world, + int x, + int y, + int z, + RenderBlocks renderer + ) { + TileAssemblerMB tile = (TileAssemblerMB) world.getTileEntity(x, y, z); + if (tile != null && tile.complete) { + block.getRendererInstance().setTemporaryRenderIcon( + ExtraBlockTextures.BlockAssemblerHeatVentMerged.getIcon() + ); + renderer.setRenderBoundsFromBlock(block); + renderer.renderStandardBlock(block, x, y, z); + block.getRendererInstance().setTemporaryRenderIcon(null); + return true; + } + return super.renderInWorld(block, world, x, y, z, renderer); + } +} diff --git a/src/main/java/appeng/client/render/blocks/RenderBlockAssemblerWall.java b/src/main/java/appeng/client/render/blocks/RenderBlockAssemblerWall.java new file mode 100644 index 00000000..8b066c7e --- /dev/null +++ b/src/main/java/appeng/client/render/blocks/RenderBlockAssemblerWall.java @@ -0,0 +1,77 @@ +package appeng.client.render.blocks; + +import appeng.block.legacy.BlockAssemblerWall; +import appeng.client.render.BaseBlockRender; +import appeng.client.texture.ExtraBlockTextures; +import appeng.tile.legacy.TileAssemblerMB; +import net.minecraft.client.renderer.RenderBlocks; +import net.minecraft.world.IBlockAccess; + +public class RenderBlockAssemblerWall + extends BaseBlockRender { + @Override + public boolean renderInWorld( + BlockAssemblerWall block, + IBlockAccess world, + int x, + int y, + int z, + RenderBlocks renderer + ) { + TileAssemblerMB tile = (TileAssemblerMB) world.getTileEntity(x, y, z); + if (tile != null && tile.complete) { + boolean XAxis = world.getTileEntity(x + 1, y, z) instanceof TileAssemblerMB + && world.getTileEntity(x - 1, y, z) instanceof TileAssemblerMB; + boolean YAxis = world.getTileEntity(x, y + 1, z) instanceof TileAssemblerMB + && world.getTileEntity(x, y - 1, z) instanceof TileAssemblerMB; + boolean ZAxis = world.getTileEntity(x, y, z + 1) instanceof TileAssemblerMB + && world.getTileEntity(x, y, z - 1) instanceof TileAssemblerMB; + if (XAxis) { + renderer.setRenderBounds(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F); + block.getRendererInstance().setTemporaryRenderIcon( + ExtraBlockTextures.BlockAssemblerWallMerged.getIcon() + ); + renderer.setRenderBoundsFromBlock(block); + renderer.renderStandardBlock(block, x, y, z); + block.getRendererInstance().setTemporaryRenderIcon(null); + return true; + } + + if (YAxis) { + renderer.uvRotateWest = 1; + renderer.uvRotateEast = 1; + renderer.uvRotateNorth = 1; + renderer.uvRotateSouth = 1; + renderer.setRenderBounds(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F); + block.getRendererInstance().setTemporaryRenderIcon( + ExtraBlockTextures.BlockAssemblerWallMerged.getIcon() + ); + renderer.setRenderBoundsFromBlock(block); + renderer.renderStandardBlock(block, x, y, z); + block.getRendererInstance().setTemporaryRenderIcon(null); + renderer.uvRotateWest = 0; + renderer.uvRotateEast = 0; + renderer.uvRotateNorth = 0; + renderer.uvRotateSouth = 0; + return true; + } + + if (ZAxis) { + renderer.uvRotateTop = 1; + renderer.uvRotateBottom = 1; + renderer.setRenderBounds(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F); + block.getRendererInstance().setTemporaryRenderIcon( + ExtraBlockTextures.BlockAssemblerWallMerged.getIcon() + ); + renderer.setRenderBoundsFromBlock(block); + renderer.renderStandardBlock(block, x, y, z); + block.getRendererInstance().setTemporaryRenderIcon(null); + renderer.uvRotateTop = 0; + renderer.uvRotateBottom = 0; + return true; + } + } + + return super.renderInWorld(block, world, x, y, z, renderer); + } +} diff --git a/src/main/java/appeng/client/texture/ExtraBlockTextures.java b/src/main/java/appeng/client/texture/ExtraBlockTextures.java index d8445804..e25b9af0 100644 --- a/src/main/java/appeng/client/texture/ExtraBlockTextures.java +++ b/src/main/java/appeng/client/texture/ExtraBlockTextures.java @@ -127,7 +127,10 @@ public enum ExtraBlockTextures { Controller5("BlockLegacyControllerFront"), ControllerLinked("ControllerLinked"), - BlockStorageMonitorFrontMatrix("BlockStorageMonitorFront_Matrix"); + BlockStorageMonitorFrontMatrix("BlockStorageMonitorFront_Matrix"), + + BlockAssemblerWallMerged("BlockAssemblerWallMerged"), + BlockAssemblerHeatVentMerged("BlockAssemblerHeatVentMerged"); private final String name; private IIcon IIcon; diff --git a/src/main/java/appeng/container/AEBaseContainer.java b/src/main/java/appeng/container/AEBaseContainer.java index 13d7d31b..2ba466c0 100644 --- a/src/main/java/appeng/container/AEBaseContainer.java +++ b/src/main/java/appeng/container/AEBaseContainer.java @@ -72,7 +72,7 @@ public abstract class AEBaseContainer extends Container { private final InventoryPlayer invPlayer; private final BaseActionSource mySrc; private final HashSet locked = new HashSet(); - private final TileEntity tileEntity; + private TileEntity tileEntity; private final IPart part; private final IGuiItemObject obj; private final List dataChunks @@ -325,6 +325,10 @@ public abstract class AEBaseContainer extends Container { return this.tileEntity; } + public void setTileEntity(TileEntity te) { + this.tileEntity = te; + } + public final void updateFullProgressBar(final int idx, final long value) { if (this.syncData.containsKey(idx)) { this.syncData.get(idx).update(value); diff --git a/src/main/java/appeng/container/implementations/ContainerAssembler.java b/src/main/java/appeng/container/implementations/ContainerAssembler.java new file mode 100644 index 00000000..5230c297 --- /dev/null +++ b/src/main/java/appeng/container/implementations/ContainerAssembler.java @@ -0,0 +1,70 @@ +package appeng.container.implementations; + +import appeng.container.AEBaseContainer; +import appeng.container.slot.SlotPlayerHotBar; +import appeng.container.slot.SlotPlayerInv; +import appeng.container.slot.SlotRestrictedInput; +import appeng.container.slot.SlotRestrictedInput.PlacableItemType; +import appeng.tile.legacy.TileAssembler; +import appeng.util.inv.WrapperChainedInventory; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.InventoryPlayer; +import net.minecraft.inventory.IInventory; +import net.minecraft.tileentity.TileEntity; + +public class ContainerAssembler extends AEBaseContainer { + public WrapperChainedInventory myinv; + + public ContainerAssembler(InventoryPlayer ip, TileAssembler te) { + this(ip, te.xCoord, te.yCoord, te.zCoord, te, te); + } + + public ContainerAssembler( + InventoryPlayer pi, int x, int y, int z, TileEntity te, IInventory inv + ) { + super(pi, te, null); + int off = 0; + this.myinv = new WrapperChainedInventory(inv); + + for (int i = 0; i < 6; ++i) { + for (int j = 0; j < 9; ++j) { + this.addSlotToContainer(new SlotRestrictedInput( + PlacableItemType.ENCODED_CRAFTING_PATTERN, + this.myinv, + off++, + 8 + j * 18, + i * 18 + 18, + pi + )); + } + } + + this.bindPlayerInventory(pi); + } + + protected void bindPlayerInventory(InventoryPlayer inventoryPlayer) { + int i; + for (i = 0; i < 3; ++i) { + for (int j = 0; j < 9; ++j) { + this.addSlotToContainer(new SlotPlayerInv( + inventoryPlayer, j + i * 9 + 9, 8 + j * 18, 140 + i * 18 + )); + } + } + + for (i = 0; i < 9; ++i) { + this.addSlotToContainer( + new SlotPlayerHotBar(inventoryPlayer, i, 8 + i * 18, 198) + ); + } + } + + public boolean canInteractWith(EntityPlayer p) { + return p.getDistanceSq( + (double) this.getTileEntity().xCoord + 0.5, + (double) this.getTileEntity().yCoord + 0.5, + (double) this.getTileEntity().zCoord + 0.5 + ) + <= 32.0; + } +} diff --git a/src/main/java/appeng/container/implementations/ContainerAssemblerMB.java b/src/main/java/appeng/container/implementations/ContainerAssemblerMB.java new file mode 100644 index 00000000..f9afa816 --- /dev/null +++ b/src/main/java/appeng/container/implementations/ContainerAssemblerMB.java @@ -0,0 +1,10 @@ +package appeng.container.implementations; + +import appeng.tile.legacy.TileAssembler; +import net.minecraft.entity.player.InventoryPlayer; + +public class ContainerAssemblerMB extends ContainerAssembler { + public ContainerAssemblerMB(InventoryPlayer ip, TileAssembler te) { + super(ip, te); + } +} diff --git a/src/main/java/appeng/core/Registration.java b/src/main/java/appeng/core/Registration.java index e1a10d83..b42e63ab 100644 --- a/src/main/java/appeng/core/Registration.java +++ b/src/main/java/appeng/core/Registration.java @@ -30,6 +30,7 @@ import appeng.api.features.IRegistryContainer; import appeng.api.features.IWirelessTermHandler; import appeng.api.features.IWorldGen.WorldGenType; import appeng.api.movable.IMovableRegistry; +import appeng.api.networking.IAssemblerCache; import appeng.api.networking.IControllerCache; import appeng.api.networking.IGridCacheRegistry; import appeng.api.networking.IWirelessCache; @@ -532,6 +533,7 @@ public final class Registration { gcr.registerGridCache(ICraftingGrid.class, CraftingGridCache.class); gcr.registerGridCache(IWirelessCache.class, WirelessGridCache.class); gcr.registerGridCache(IControllerCache.class, ControllerGridCache.class); + gcr.registerGridCache(IAssemblerCache.class, AssemblerGridCache.class); registries.externalStorage().addExternalStorageInterface(new AEExternalHandler()); diff --git a/src/main/java/appeng/core/api/definitions/ApiBlocks.java b/src/main/java/appeng/core/api/definitions/ApiBlocks.java index a770ec5d..0f21c0a2 100644 --- a/src/main/java/appeng/core/api/definitions/ApiBlocks.java +++ b/src/main/java/appeng/core/api/definitions/ApiBlocks.java @@ -29,6 +29,10 @@ import appeng.block.AEBaseSlabBlock; import appeng.block.crafting.*; import appeng.block.grindstone.BlockCrank; import appeng.block.grindstone.BlockGrinder; +import appeng.block.legacy.BlockAssembler; +import appeng.block.legacy.BlockAssemblerCraftingAccelerator; +import appeng.block.legacy.BlockAssemblerHeatVent; +import appeng.block.legacy.BlockAssemblerWall; import appeng.block.legacy.BlockCraftMonitor; import appeng.block.legacy.BlockCraftTerminal; import appeng.block.legacy.BlockLegacyController; @@ -143,6 +147,10 @@ public final class ApiBlocks implements IBlocks { private final ITileDefinition transitionPlane; private final ITileDefinition storageMonitor; private final ITileDefinition patternEncoder; + private final ITileDefinition assembler; + private final ITileDefinition assemblerWall; + private final ITileDefinition assemblerHeatVent; + private final ITileDefinition assemblerCraftingAccelerator; public ApiBlocks(final DefinitionConstructor constructor) { final BlockLightDetector lightDetector = new BlockLightDetector(); @@ -324,6 +332,12 @@ public final class ApiBlocks implements IBlocks { = constructor.registerTileDefinition(new BlockStorageMonitor()); this.patternEncoder = constructor.registerTileDefinition(new BlockPatternEncoder()); + this.assembler = constructor.registerTileDefinition(new BlockAssembler()); + this.assemblerWall = constructor.registerTileDefinition(new BlockAssemblerWall()); + this.assemblerHeatVent + = constructor.registerTileDefinition(new BlockAssemblerHeatVent()); + this.assemblerCraftingAccelerator + = constructor.registerTileDefinition(new BlockAssemblerCraftingAccelerator()); } @Override diff --git a/src/main/java/appeng/core/sync/AppEngPacketHandlerBase.java b/src/main/java/appeng/core/sync/AppEngPacketHandlerBase.java index a35d0f2d..4f9f0e0f 100644 --- a/src/main/java/appeng/core/sync/AppEngPacketHandlerBase.java +++ b/src/main/java/appeng/core/sync/AppEngPacketHandlerBase.java @@ -78,7 +78,11 @@ public class AppEngPacketHandlerBase { PACKET_COMPRESSED_NBT(PacketCompressedNBT.class), - PACKET_PAINTED_ENTITY(PacketPaintedEntity.class); + PACKET_PAINTED_ENTITY(PacketPaintedEntity.class), + + PACKET_CHANGE_ASSEMBLER_GUI_PAGE(PacketChangeAssemblerGuiPage.class), + + PACKET_UPDATE_ASSEMBLER_GUI_PAGE_NUM(PacketUpdateAssemblerGuiPageNum.class); private final Class packetClass; private final Constructor packetConstructor; diff --git a/src/main/java/appeng/core/sync/GuiBridge.java b/src/main/java/appeng/core/sync/GuiBridge.java index 001048d4..f8f2c211 100644 --- a/src/main/java/appeng/core/sync/GuiBridge.java +++ b/src/main/java/appeng/core/sync/GuiBridge.java @@ -59,6 +59,7 @@ import appeng.parts.reporting.PartPatternTerminal; import appeng.tile.crafting.TileCraftingTile; import appeng.tile.crafting.TileMolecularAssembler; import appeng.tile.grindstone.TileGrinder; +import appeng.tile.legacy.TileAssembler; import appeng.tile.legacy.TileLegacyController; import appeng.tile.legacy.TilePatternEncoder; import appeng.tile.misc.*; @@ -75,6 +76,7 @@ import cpw.mods.fml.common.network.IGuiHandler; import cpw.mods.fml.relauncher.ReflectionHelper; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.InventoryPlayer; +import net.minecraft.inventory.IInventory; import net.minecraft.inventory.Slot; import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; @@ -280,6 +282,20 @@ public enum GuiBridge implements IGuiHandler { TilePatternEncoder.class, GuiHostType.WORLD, SecurityPermissions.CRAFT + ), + + GUI_ASSEMBLER( + ContainerAssembler.class, + TileAssembler.class, + GuiHostType.WORLD, + SecurityPermissions.BUILD + ), + + GUI_ASSEMBLER_MB( + ContainerAssemblerMB.class, + TileAssembler.class, + GuiHostType.WORLD, + SecurityPermissions.BUILD ); private final Class tileClass; diff --git a/src/main/java/appeng/core/sync/packets/PacketChangeAssemblerGuiPage.java b/src/main/java/appeng/core/sync/packets/PacketChangeAssemblerGuiPage.java new file mode 100644 index 00000000..90843ffe --- /dev/null +++ b/src/main/java/appeng/core/sync/packets/PacketChangeAssemblerGuiPage.java @@ -0,0 +1,81 @@ +package appeng.core.sync.packets; + +import appeng.container.implementations.ContainerAssembler; +import appeng.core.sync.AppEngPacket; +import appeng.core.sync.network.INetworkInfo; +import appeng.core.sync.network.NetworkHandler; +import appeng.me.cluster.implementations.AssemblerCluster; +import appeng.tile.legacy.TileAssembler; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.Unpooled; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.inventory.Container; + +public class PacketChangeAssemblerGuiPage extends AppEngPacket { + int direction; + + // automatic. + public PacketChangeAssemblerGuiPage(ByteBuf buf) { + this.direction = buf.readInt(); + } + + // api + public PacketChangeAssemblerGuiPage(int direction) { + ByteBuf buf = Unpooled.buffer(); + + buf.writeInt(this.getPacketID()); + buf.writeInt(this.direction = direction); + + this.configureWrite(buf); + } + + @Override + public void + serverPacketData(INetworkInfo manager, AppEngPacket packet, EntityPlayer player) { + EntityPlayerMP pmp = (EntityPlayerMP) player; + Container c = pmp.openContainer; + int offset; + if (c != null && c instanceof ContainerAssembler) { + ContainerAssembler ca = (ContainerAssembler) c; + TileAssembler ta = (TileAssembler) ca.getTileEntity(); + if (ta != null) { + AssemblerCluster ac = (AssemblerCluster) ta.getCluster(); + if (ac == null) { + return; + } + + if (ac.assemblers == null) { + return; + } + + offset = -1; + + for (int i = 0; i < ac.assemblers.size(); i++) { + if (ac.assemblers.get(i) == ta) { + offset = i; + } + } + + offset += this.direction; + if (offset < 0) { + offset = ac.assemblers.size() - 1; + } + + if (offset >= ac.assemblers.size()) { + offset = 0; + } + + ac.setLastOffset(offset); + TileAssembler nta = ac.getAssembler(offset); + ca.myinv.setInventory(nta); + ca.setTileEntity(nta); + + NetworkHandler.instance.sendTo( + new PacketUpdateAssemblerGuiPageNum(offset, ac.assemblers.size()), + (EntityPlayerMP) player + ); + } + } + } +} diff --git a/src/main/java/appeng/core/sync/packets/PacketUpdateAssemblerGuiPageNum.java b/src/main/java/appeng/core/sync/packets/PacketUpdateAssemblerGuiPageNum.java new file mode 100644 index 00000000..ab395e7f --- /dev/null +++ b/src/main/java/appeng/core/sync/packets/PacketUpdateAssemblerGuiPageNum.java @@ -0,0 +1,76 @@ +package appeng.core.sync.packets; + +import appeng.client.gui.implementations.GuiAssemblerMB; +import appeng.container.implementations.ContainerAssembler; +import appeng.core.sync.AppEngPacket; +import appeng.core.sync.network.INetworkInfo; +import appeng.core.sync.network.NetworkHandler; +import appeng.me.cluster.implementations.AssemblerCluster; +import appeng.tile.legacy.TileAssembler; +import cpw.mods.fml.client.FMLClientHandler; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.Unpooled; +import net.minecraft.client.gui.GuiScreen; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.EntityPlayerMP; + +public class PacketUpdateAssemblerGuiPageNum extends AppEngPacket { + int offset; + int size; + + // automatic. + public PacketUpdateAssemblerGuiPageNum(ByteBuf buf) { + this.offset = buf.readInt(); + this.size = buf.readInt(); + } + + // api + public PacketUpdateAssemblerGuiPageNum(int offset, int size) { + ByteBuf buf = Unpooled.buffer(); + + buf.writeInt(this.getPacketID()); + buf.writeInt(this.offset = offset); + buf.writeInt(this.size = size); + + this.configureWrite(buf); + } + + @Override + @SideOnly(Side.CLIENT) + public void + clientPacketData(INetworkInfo network, AppEngPacket packet, EntityPlayer player) { + GuiScreen cs = FMLClientHandler.instance().getClient().currentScreen; + + if (cs instanceof GuiAssemblerMB) { + GuiAssemblerMB ga = (GuiAssemblerMB) cs; + + ga.pageNumber = this.offset; + ga.maxPages = this.size; + } + } + + @Override + public void + serverPacketData(INetworkInfo manager, AppEngPacket packet, EntityPlayer player) { + if (player.openContainer instanceof ContainerAssembler) { + ContainerAssembler ca = (ContainerAssembler) player.openContainer; + TileAssembler ta = (TileAssembler) ca.getTileEntity(); + AssemblerCluster ac = (AssemblerCluster) ta.getCluster(); + + int offset = -1; + for (int i = 0; i < ac.assemblers.size(); i++) { + if (ac.assemblers.get(i) == ta) { + offset = i; + break; + } + } + + NetworkHandler.instance.sendTo( + new PacketUpdateAssemblerGuiPageNum(offset, ac.assemblers.size()), + (EntityPlayerMP) player + ); + } + } +} diff --git a/src/main/java/appeng/me/cache/AssemblerGridCache.java b/src/main/java/appeng/me/cache/AssemblerGridCache.java new file mode 100644 index 00000000..0a689678 --- /dev/null +++ b/src/main/java/appeng/me/cache/AssemblerGridCache.java @@ -0,0 +1,56 @@ +package appeng.me.cache; + +import java.util.HashSet; +import java.util.Iterator; +import java.util.Set; + +import appeng.api.networking.IAssemblerCache; +import appeng.api.networking.IGrid; +import appeng.api.networking.IGridHost; +import appeng.api.networking.IGridNode; +import appeng.api.networking.IGridStorage; +import appeng.me.cluster.implementations.AssemblerCluster; + +public class AssemblerGridCache implements IAssemblerCache { + Set assemblers = new HashSet<>(); + int cooldown = 0; + + public AssemblerGridCache(IGrid grid) {} + + @Override + public void onUpdateTick() { + if (--this.cooldown > 0) + return; + this.cooldown = 20; + + + Iterator it = this.assemblers.iterator(); + while (it.hasNext()) { + AssemblerCluster ac = it.next(); + if (ac.isDestroyed) { + it.remove(); + continue; + } + ac.onOperation(); + } + } + + @Override + public void removeNode(IGridNode gridNode, IGridHost machine) {} + + @Override + public void addNode(IGridNode gridNode, IGridHost machine) {} + + @Override + public void onSplit(IGridStorage destinationStorage) {} + + @Override + public void onJoin(IGridStorage sourceStorage) {} + + @Override + public void populateGridStorage(IGridStorage destinationStorage) {} + + public void addCluster(AssemblerCluster cluster) { + this.assemblers.add(cluster); + } +} diff --git a/src/main/java/appeng/me/cluster/IAssemblerCluster.java b/src/main/java/appeng/me/cluster/IAssemblerCluster.java new file mode 100644 index 00000000..bf593d3e --- /dev/null +++ b/src/main/java/appeng/me/cluster/IAssemblerCluster.java @@ -0,0 +1,13 @@ +package appeng.me.cluster; + +import net.minecraft.tileentity.TileEntity; + +public interface IAssemblerCluster extends IAECluster { + boolean canCraft(); + + TileEntity getAssembler(int var1); + + int getLastOffset(); + + void setLastOffset(int var1); +} diff --git a/src/main/java/appeng/me/cluster/IAssemblerMB.java b/src/main/java/appeng/me/cluster/IAssemblerMB.java new file mode 100644 index 00000000..5fd31080 --- /dev/null +++ b/src/main/java/appeng/me/cluster/IAssemblerMB.java @@ -0,0 +1,15 @@ +package appeng.me.cluster; + +import appeng.api.util.WorldCoord; + +public interface IAssemblerMB { + WorldCoord getLocation(); + + IAssemblerCluster getCluster(); + + void updateStatus(IAssemblerCluster var1); + + boolean isComplete(); + + void calculateMultiblock(); +} diff --git a/src/main/java/appeng/me/cluster/implementations/AssemblerCluster.java b/src/main/java/appeng/me/cluster/implementations/AssemblerCluster.java new file mode 100644 index 00000000..bd9f446a --- /dev/null +++ b/src/main/java/appeng/me/cluster/implementations/AssemblerCluster.java @@ -0,0 +1,148 @@ +package appeng.me.cluster.implementations; + +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; + +import appeng.api.config.Actionable; +import appeng.api.networking.IGridHost; +import appeng.api.networking.crafting.ICraftingPatternDetails; +import appeng.api.networking.security.MachineSource; +import appeng.api.storage.IMEMonitor; +import appeng.api.storage.data.IAEItemStack; +import appeng.api.util.WorldCoord; +import appeng.me.GridAccessException; +import appeng.me.cluster.IAssemblerCluster; +import appeng.tile.legacy.TileAssembler; +import appeng.tile.legacy.TileAssemblerMB; +import appeng.util.item.AEItemStack; +import com.google.common.collect.Iterators; +import net.minecraft.inventory.IInventory; +import net.minecraft.inventory.InventoryCrafting; +import net.minecraft.item.ItemStack; + +public class AssemblerCluster implements IAssemblerCluster { + public WorldCoord min; + public WorldCoord max; + public boolean isDestroyed = false; + public int lastPage; + public int accelerators; + public IInventory inv; + public List mb = new ArrayList<>(); + public List assemblers = new ArrayList<>(); + public long inst; + public Job[] jobs; + + public AssemblerCluster(WorldCoord _min, WorldCoord _max) { + this.min = _min; + this.max = _max; + } + + public void onOperation() { + for (int i = 0; i < this.jobs.length; i++) { + if (this.jobs[i] == null) + continue; + + ItemStack out = this.jobs[i].det.getOutput( + this.jobs[i].inv, this.assemblers.get(0).getWorldObj() + ); + + if (out != null) { + try { + IMEMonitor inv + = this.assemblers.get(0).getProxy().getStorage().getItemInventory( + ); + + inv.injectItems( + AEItemStack.create(out), + Actionable.MODULATE, + new MachineSource(this.assemblers.get(0)) + ); + + } catch (GridAccessException kek) {} + } + + this.jobs[i] = null; + } + } + + public TileAssembler getAssembler(int i) { + return this.assemblers.get(i); + } + + public boolean addCraft(Job job) { + for (int i = 0; i < this.jobs.length; i++) { + if (this.jobs[i] == null) { + this.jobs[i] = job; + return true; + } + } + + return false; + } + + public boolean canCraft() { + for (Job j : this.jobs) + if (j == null) + return true; + + return false; + } + + public void destroy() { + if (!this.isDestroyed) { + this.isDestroyed = true; + if (!this.mb.isEmpty()) { + // TODO: WTF + //TileAssemblerMB mb = this.mb.get(0); + //mb.sendUpdate(false, (Player) null); + } + + for (TileAssembler as : this.assemblers) { + as.updateStatus(null); + } + + for (TileAssemblerMB r : this.mb) { + r.updateStatus(null); + // TODO: WTF + //MinecraftForge.EVENT_BUS.post(new GridTileConnectivityEvent( + // (IGridTileEntity) r.getTile(), + // ((TileAssemblerMB) r.getTile()).getWorld(), + // ((TileAssemblerMB) r.getTile()).getLocation() + //)); + } + } + } + + public int getLastOffset() { + return this.lastPage <= 0 + ? 0 + : (this.lastPage >= this.assemblers.size() ? 0 : this.lastPage); + } + + public void setLastOffset(int x) { + this.lastPage = x; + } + + @Override + public void updateStatus(boolean updateGrid) { + // TODO: WTF + } + + @Override + public Iterator getTiles() { + return Iterators.concat( + this.mb.iterator(), this.assemblers.iterator() + ); + } + + public static class Job { + public ICraftingPatternDetails det; + public InventoryCrafting inv; + + public Job(ICraftingPatternDetails det, InventoryCrafting inv) { + this.det = det; + this.inv = inv; + } + } +} diff --git a/src/main/java/appeng/tile/legacy/TileAssembler.java b/src/main/java/appeng/tile/legacy/TileAssembler.java new file mode 100644 index 00000000..cf9b0aaf --- /dev/null +++ b/src/main/java/appeng/tile/legacy/TileAssembler.java @@ -0,0 +1,530 @@ +package appeng.tile.legacy; + +import java.util.ArrayList; + +import appeng.api.implementations.ICraftingPatternItem; +import appeng.api.networking.IAssemblerCache; +import appeng.api.networking.crafting.ICraftingPatternDetails; +import appeng.api.networking.crafting.ICraftingProvider; +import appeng.api.networking.crafting.ICraftingProviderHelper; +import appeng.api.networking.events.MENetworkCraftingPatternChange; +import appeng.api.util.WorldCoord; +import appeng.block.legacy.BlockAssemblerHeatVent; +import appeng.block.legacy.BlockAssemblerWall; +import appeng.me.GridAccessException; +import appeng.me.cache.AssemblerGridCache; +import appeng.me.cluster.IAssemblerCluster; +import appeng.me.cluster.IAssemblerMB; +import appeng.me.cluster.implementations.AssemblerCluster; +import appeng.tile.TileEvent; +import appeng.tile.events.TileEventType; +import appeng.tile.grid.AENetworkTile; +import appeng.tile.inventory.AppEngInternalInventory; +import appeng.tile.inventory.IAEAppEngInventory; +import appeng.tile.inventory.InvOperation; +import appeng.util.InventoryAdaptor; +import appeng.util.Platform; +import appeng.util.inv.AdaptorIInventory; +import appeng.util.inv.IInventoryDestination; +import net.minecraft.block.Block; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.inventory.IInventory; +import net.minecraft.inventory.InventoryCrafting; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.IBlockAccess; +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; + +public class TileAssembler extends AENetworkTile + implements IAssemblerMB, IAEAppEngInventory, IInventory, ICraftingProvider { + AssemblerCluster ac = null; + AppEngInternalInventory inv = new AppEngInternalInventory(this, 54); + + public TileAssembler() { + super(); + // TODO: WTF + //super.updatesOnPower = false; + } + + @Override + public boolean canBeRotated() { + return false; + } + + // TODO: WTF + //protected void terminate() { + // super.terminate(); + // if (this.ac != null) { + // this.ac.destroy(); + // } + + // this.ac = null; + //} + + @Override + public void setInventorySlotContents(int var1, ItemStack var2) { + this.inv.setInventorySlotContents(var1, var2); + try { + this.getProxy().getGrid().postEvent( + new MENetworkCraftingPatternChange(this, this.getProxy().getNode()) + ); + } catch (GridAccessException kek) {} + } + + public ItemStack decrStackSize(int var1, int var2) { + ItemStack is = this.inv.decrStackSize(var1, var2); + try { + this.getProxy().getGrid().postEvent( + new MENetworkCraftingPatternChange(this, this.getProxy().getNode()) + ); + } catch (GridAccessException kek) {} + return is; + } + + public IAssemblerCluster getCluster() { + return this.ac; + } + + // TODO: WTF + //@Override + public boolean isComplete() { + return this.ac != null; + } + + public static void + completeRegion(IBlockAccess w, WorldCoord min, WorldCoord max, AssemblerCluster ac) { + TileAssemblerMB lastMB = null; + + for (int x = min.x; x <= max.x; ++x) { + for (int y = min.y; y <= max.y; ++y) { + for (int z = min.z; z <= max.z; ++z) { + TileEntity te = w.getTileEntity(x, y, z); + AssemblerCluster acc; + if (te instanceof TileAssembler) { + if (ac == null) { + acc = ((TileAssembler) te).ac; + if (acc != null) { + acc.destroy(); + } + } + + ((TileAssembler) te).updateStatus(ac); + } else if (te instanceof TileAssemblerMB) { + if (ac == null) { + acc = ((TileAssemblerMB) te).ac; + if (acc != null) { + acc.destroy(); + } + } + + lastMB = (TileAssemblerMB) te; + ((TileAssemblerMB) te).updateStatus(ac); + } + } + } + } + + if (ac != null && lastMB != null) { + lastMB.sendUpdate(true, null); + try { + IAssemblerCache cache + = lastMB.getProxy().getGrid().getCache(IAssemblerCache.class); + ((AssemblerGridCache) cache).addCluster(ac); + } catch (GridAccessException kek) {} + // TODO: WTF + //MinecraftForge.EVENT_BUS.post(new GridTileConnectivityEvent( + // lastMB, lastMB.field_70331_k, lastMB.getLocation() + //)); + } + } + + public boolean requiresTickingUpdates() { + return false; + } + + public static AssemblerCluster + verifyOwnedRegion(IBlockAccess w, WorldCoord min, WorldCoord max) { + AssemblerCluster ac = new AssemblerCluster(min, max); + ac.assemblers = new ArrayList<>(); + ac.mb = new ArrayList<>(); + ac.accelerators = 1; + + for (int x = min.x; x <= max.x; ++x) { + for (int y = min.y; y <= max.y; ++y) { + for (int z = min.z; z <= max.z; ++z) { + TileEntity te = w.getTileEntity(x, y, z); + if (x != min.x && x != max.x && y != min.y && y != max.y && z != min.z + && z != max.z && te instanceof TileAssembler) { + ac.assemblers.add((TileAssembler) te); + } else { + if (!(te instanceof TileAssemblerMB)) { + return null; + } + + Block mb = te.getBlockType(); + if (mb == null) { + return null; + } + + ac.mb.add((TileAssemblerMB) te); + if (te instanceof TileAssemblerCraftingAccelerator) { + ++ac.accelerators; + } else if (x != min.x && x != max.x && y != min.y && y != max.y && z != min.z && z != max.z) { + return null; + } + + if (x == min.x && z == min.z || x == min.x && z == max.z + || x == max.x && z == min.z || x == max.x && z == max.z + || x == min.x && y == min.y || x == min.x && y == max.y + || x == max.x && y == min.y || x == max.x && y == max.y + || z == min.z && y == min.y || z == min.z && y == max.y + || z == max.z && y == min.y || z == max.z && y == max.y + || y == min.y && x == min.x || y == min.y && x == max.x + || y == max.y && z == min.z || y == max.y && z == max.z) { + if (!(mb instanceof BlockAssemblerWall)) { + return null; + } + } else if ((x == max.x || x == min.x || y == min.y || y == max.y || z == min.z || z == max.z) && !(mb instanceof BlockAssemblerHeatVent)) { + return null; + } + } + } + } + } + + ac.jobs = new AssemblerCluster.Job[ac.accelerators]; + + if (ac.assemblers.size() > 0) { + return ac; + } else { + return null; + } + } + + public static boolean verifyUnownedRegionInner( + IBlockAccess w, + int minx, + int miny, + int minz, + int maxx, + int maxy, + int maxz, + ForgeDirection side + ) { + switch (side) { + case WEST: + --minx; + maxx = minx; + break; + case EAST: + ++maxx; + minx = maxx; + break; + case DOWN: + --miny; + maxy = miny; + break; + case NORTH: + ++maxz; + minz = maxz; + break; + case SOUTH: + --minz; + maxz = minz; + break; + case UP: + ++maxy; + miny = maxy; + break; + case UNKNOWN: + return false; + } + + for (int x = minx; x <= maxx; ++x) { + for (int y = miny; y <= maxy; ++y) { + for (int z = minz; z <= maxz; ++z) { + TileEntity te = w.getTileEntity(x, y, z); + if (te instanceof TileAssemblerMB) { + return true; + } + } + } + } + + return false; + } + + public static boolean + verifyUnownedRegion(IBlockAccess w, WorldCoord min, WorldCoord max) { + ForgeDirection[] arr$ = ForgeDirection.VALID_DIRECTIONS; + int len$ = arr$.length; + + for (int i$ = 0; i$ < len$; ++i$) { + ForgeDirection side = arr$[i$]; + if (verifyUnownedRegionInner( + w, min.x, min.y, min.z, max.x, max.y, max.z, side + )) { + return false; + } + } + + return true; + } + + @Override + public void calculateMultiblock() { + calculateMultiblockR(this); + } + + public static boolean isAnAssembler(IBlockAccess w, int x, int y, int z) { + TileEntity TE = w.getTileEntity(x, y, z); + return TE instanceof IAssemblerMB; + } + + public static void calculateMultiblockR(IAssemblerMB start) { + if (!Platform.isClient()) { + try { + WorldCoord min = start.getLocation(); + WorldCoord max = start.getLocation(); + + World w; + for (w = ((TileEntity) start).getWorldObj(); + isAnAssembler(w, min.x - 1, min.y, min.z); + --min.x) {} + + while (isAnAssembler(w, min.x, min.y - 1, min.z)) { + --min.y; + } + + while (isAnAssembler(w, min.x, min.y, min.z - 1)) { + --min.z; + } + + while (isAnAssembler(w, max.x + 1, max.y, max.z)) { + ++max.x; + } + + while (isAnAssembler(w, max.x, max.y + 1, max.z)) { + ++max.y; + } + + while (isAnAssembler(w, max.x, max.y, max.z + 1)) { + ++max.z; + } + + if (max.x - min.x >= 2 && max.y - min.y >= 2 && max.z - min.z >= 2) { + AssemblerCluster ac = verifyOwnedRegion(w, min, max); + if (ac != null && verifyUnownedRegion(w, min, max)) { + completeRegion(w, min, max, ac); + return; + } + } + + WorldCoord pos = start.getLocation(); + ForgeDirection[] arr$ = ForgeDirection.values(); + int len$ = arr$.length; + + for (int i$ = 0; i$ < len$; ++i$) { + ForgeDirection d = arr$[i$]; + TileEntity TE = w.getTileEntity( + pos.x + d.offsetX, pos.y + d.offsetY, pos.z + d.offsetZ + ); + if (TE instanceof IAssemblerMB) { + AssemblerCluster ac + = (AssemblerCluster) ((IAssemblerMB) TE).getCluster(); + if (ac != null) { + ac.destroy(); + } + } + } + } catch (Throwable var18) {} + } + } + + public String getInventoryName() { + return "ME Pattern Provider"; + } + + public float getPowerDrainPerTick() { + return this.ac != null ? 1.0F : 0.0F; + } + + public void updateStatus(IAssemblerCluster _ac) { + boolean wasComplete = this.ac != null; + this.ac = (AssemblerCluster) _ac; + if (wasComplete != (this.ac != null)) { + this.markForUpdate(); + } + } + + public boolean isEnabled() { + return this.ac != null; + } + + public int addItem(ItemStack stack, boolean doAdd, ForgeDirection from) { + if (stack.getItem() instanceof ICraftingPatternItem) { + InventoryAdaptor ia = new AdaptorIInventory(this); + ItemStack used = null; + int originalStackSize = stack.stackSize; + if (doAdd) { + used = ia.addItems(stack); + } else { + used = ia.simulateAdd(stack); + } + + return used == null ? originalStackSize : originalStackSize - used.stackSize; + } else { + return 0; + } + } + + public ItemStack[] extractItem( + boolean doRemove, ForgeDirection from, int maxItemCount + ) { + ItemStack[] output = new ItemStack[1]; + InventoryAdaptor ia = new AdaptorIInventory(this); + if (doRemove) { + output[0] = ia.removeItems( + maxItemCount, (ItemStack) null, (IInventoryDestination) null + ); + } else { + output[0] = ia.simulateRemove( + maxItemCount, (ItemStack) null, (IInventoryDestination) null + ); + } + + return output[0] == null ? new ItemStack[0] : output; + } + + public boolean hasCustomInventoryName() { + return true; + } + + @Override + public boolean isItemValidForSlot(int i, ItemStack itemstack) { + if (itemstack.getItem() instanceof ICraftingPatternItem) { + ICraftingPatternDetails pat + = ((ICraftingPatternItem) itemstack.getItem()) + .getPatternForItem(itemstack, this.worldObj); + + return pat != null; + } + return false; + } + + public boolean isSeperated() { + return !this.isEnabled(); + } + + @Override + public boolean isUseableByPlayer(EntityPlayer entityplayer) { + return this.worldObj.getTileEntity(this.xCoord, this.yCoord, this.zCoord) != this + ? false + : entityplayer.getDistanceSq( + (double) this.xCoord + 0.5, + (double) this.yCoord + 0.5, + (double) this.zCoord + 0.5 + ) <= 32.0; + } + + @Override + public void onChangeInventory( + IInventory inv, int slot, InvOperation mc, ItemStack removed, ItemStack added + ) {} + + @Override + public int getSizeInventory() { + return this.inv.getSizeInventory(); + } + + @Override + public ItemStack getStackInSlot(int idx) { + return this.inv.getStackInSlot(idx); + } + + @Override + public ItemStack getStackInSlotOnClosing(int idx) { + return this.inv.getStackInSlotOnClosing(idx); + } + + @Override + public int getInventoryStackLimit() { + return this.inv.getInventoryStackLimit(); + } + + @Override + public void openInventory() { + this.inv.openInventory(); + } + + @Override + public void closeInventory() { + this.inv.closeInventory(); + } + + @Override + public void onChunkLoad() { + super.onChunkLoad(); + if (this.ac != null) + return; + + this.calculateMultiblock(); + } + + @Override + public boolean + pushPattern(ICraftingPatternDetails patternDetails, InventoryCrafting table) { + if (this.ac == null) + return false; + + for (int i = 0; i < this.getSizeInventory(); i++) { + ItemStack is = this.getStackInSlot(i); + if (is == null || !(is.getItem() instanceof ICraftingPatternItem)) + continue; + + if (((ICraftingPatternItem) is.getItem()) + .getPatternForItem(is, this.worldObj) + .equals(patternDetails)) { + return this.ac.addCraft(new AssemblerCluster.Job(patternDetails, table)); + } + } + return false; + } + + @Override + public boolean isBusy() { + if (this.ac == null) + return true; + + return !this.ac.canCraft(); + } + + @Override + public void provideCrafting(ICraftingProviderHelper craftingTracker) { + if (this.ac == null) + return; + + for (int i = 0; i < this.getSizeInventory(); i++) { + ItemStack is = this.getStackInSlot(i); + if (is == null || !(is.getItem() instanceof ICraftingPatternItem)) + continue; + + ICraftingPatternDetails det = ((ICraftingPatternItem) is.getItem()) + .getPatternForItem(is, this.worldObj); + + craftingTracker.addCraftingOption(this, det); + } + } + + @TileEvent(TileEventType.WORLD_NBT_WRITE) + public void writeToNbtTileAssembler(NBTTagCompound nbt) { + this.inv.writeToNBT(nbt, "inv"); + } + + @TileEvent(TileEventType.WORLD_NBT_READ) + public void readFromNbtTileAssembler(NBTTagCompound nbt) { + this.inv.readFromNBT(nbt, "inv"); + } +} diff --git a/src/main/java/appeng/tile/legacy/TileAssemblerCraftingAccelerator.java b/src/main/java/appeng/tile/legacy/TileAssemblerCraftingAccelerator.java new file mode 100644 index 00000000..cbde3a19 --- /dev/null +++ b/src/main/java/appeng/tile/legacy/TileAssemblerCraftingAccelerator.java @@ -0,0 +1,8 @@ +package appeng.tile.legacy; + +public class TileAssemblerCraftingAccelerator extends TileAssemblerMB { + public TileAssemblerCraftingAccelerator() { + super(); + this.getProxy().setIdlePowerUsage(1.0); + } +} diff --git a/src/main/java/appeng/tile/legacy/TileAssemblerMB.java b/src/main/java/appeng/tile/legacy/TileAssemblerMB.java new file mode 100644 index 00000000..43428beb --- /dev/null +++ b/src/main/java/appeng/tile/legacy/TileAssemblerMB.java @@ -0,0 +1,406 @@ +package appeng.tile.legacy; + +import java.util.List; + +import appeng.api.implementations.ICraftingPatternItem; +import appeng.api.networking.crafting.ICraftingPatternDetails; +import appeng.me.cluster.IAssemblerCluster; +import appeng.me.cluster.IAssemblerMB; +import appeng.me.cluster.implementations.AssemblerCluster; +import appeng.tile.TileEvent; +import appeng.tile.events.TileEventType; +import appeng.tile.grid.AENetworkTile; +import appeng.util.Platform; +import appeng.util.inv.WrapperChainedInventory; +import io.netty.buffer.ByteBuf; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.inventory.IInventory; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.world.World; + +public class TileAssemblerMB extends AENetworkTile implements IAssemblerMB, IInventory { + public boolean complete; + public AssemblerCluster ac; + private boolean isEdge; + int state = -1; + + public TileAssemblerMB() { + // TODO: WTF + //super.updatesOnPower = false; + this.getProxy().setIdlePowerUsage(0.0); + } + + @Override + public boolean canBeRotated() { + return false; + } + + // TODO: WTF + //protected void terminate() { + // super.terminate(); + // if (this.ac != null) { + // this.ac.destroy(); + // } + + // this.ac = null; + //} + + public IAssemblerCluster getCluster() { + return this.ac; + } + + public boolean isComplete() { + return this.complete || this.ac != null; + } + + @Override + public void calculateMultiblock() { + TileAssembler.calculateMultiblockR(this); + } + + @Override + public void onReady() { + super.onReady(); + // TODO: crafting accelerator + //this.isEdge + // = this.worldObj.getBlockMetadata(this.xCoord, this.yCoord, this.zCoord) + // != AppEng.getInstance().registration.blkCraftingAccelerator.getMetaData(); + this.onNeighborBlockChange(); + } + + public int getState() { + int o = 0; + // TODO: WTF + //if (AppEng.getInstance().GridManager.getEntityFromCoord(new DimentionalCoord( + // this.worldObj, this.xCoord - 1, this.yCoord, this.zCoord + // )) + // != null) { + // o |= 1; + //} + + //if (AppEng.getInstance().GridManager.getEntityFromCoord(new DimentionalCoord( + // this.field_70331_k, + // this.field_70329_l + 1, + // this.field_70330_m, + // this.field_70327_n + // )) + // != null) { + // o |= 2; + //} + + //if (AppEng.getInstance().GridManager.getEntityFromCoord(new DimentionalCoord( + // this.field_70331_k, + // this.field_70329_l, + // this.field_70330_m - 1, + // this.field_70327_n + // )) + // != null) { + // o |= 4; + //} + + //if (AppEng.getInstance().GridManager.getEntityFromCoord(new DimentionalCoord( + // this.field_70331_k, + // this.field_70329_l, + // this.field_70330_m + 1, + // this.field_70327_n + // )) + // != null) { + // o |= 8; + //} + + //if (AppEng.getInstance().GridManager.getEntityFromCoord(new DimentionalCoord( + // this.field_70331_k, + // this.field_70329_l, + // this.field_70330_m, + // this.field_70327_n - 1 + // )) + // != null) { + // o |= 16; + //} + + //if (AppEng.getInstance().GridManager.getEntityFromCoord(new DimentionalCoord( + // this.field_70331_k, + // this.field_70329_l, + // this.field_70330_m, + // this.field_70327_n + 1 + // )) + // != null) { + // o |= 32; + //} + + return o; + } + + public void onNeighborBlockChange() { + if (this.isEdge) { + int newState = this.getState(); + int oldState = this.state; + if (this.state != newState) { + this.state = newState; + // TODO: WTF + //MinecraftForge.EVENT_BUS.post(new MultiBlockUpdateEvent( + // this, this.worldObj, this.getLocation() + //)); + } + } + } + + // TODO: renderer + //@SideOnly(Side.CLIENT) + //public boolean renderWorldBlock( + // IBlockAccess world, + // int x, + // int y, + // int z, + // Block block, + // int modelId, + // RenderBlocks renderer + //) { + // AppEngBlockRenderer appEngRenderer = AppEngBlockRenderer.instance; + // AppEngSubBlock sb = ((AppEngMultiBlock) block).getSubBlock(this.func_70322_n()); + // if (this.complete) { + // if (sb == AppEng.getInstance().registration.blkHeatVent) { + // block.func_71905_a(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F); + // appEngRenderer.setOverrideBlockTexture( + // block, AppEngTextureRegistry.Blocks.BlockHeatVentMerged.get() + // ); + // renderer.func_83018_a(block); + // renderer.func_78570_q(block, x, y, z); + // appEngRenderer.setOverrideBlockTexture(block, (Icon) null); + // return true; + // } + + // if (sb == AppEng.getInstance().registration.blkAssemblerFieldWall) { + // boolean XAxis = world.func_72796_p(x + 1, y, z) instanceof + // TileAssemblerMB + // && world.func_72796_p(x - 1, y, z) instanceof TileAssemblerMB; + // boolean YAxis = world.func_72796_p(x, y + 1, z) instanceof + // TileAssemblerMB + // && world.func_72796_p(x, y - 1, z) instanceof TileAssemblerMB; + // boolean ZAxis = world.func_72796_p(x, y, z + 1) instanceof + // TileAssemblerMB + // && world.func_72796_p(x, y, z - 1) instanceof TileAssemblerMB; + // if (XAxis) { + // block.func_71905_a(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F); + // appEngRenderer.setOverrideBlockTexture( + // block, + // AppEngTextureRegistry.Blocks.BlockContainmentWallMerged.get() + // ); + // renderer.func_83018_a(block); + // renderer.func_78570_q(block, x, y, z); + // appEngRenderer.setOverrideBlockTexture(block, (Icon) null); + // return true; + // } + + // if (YAxis) { + // renderer.field_78683_h = 1; + // renderer.field_78662_g = 1; + // renderer.field_78679_j = 1; + // renderer.field_78685_i = 1; + // block.func_71905_a(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F); + // appEngRenderer.setOverrideBlockTexture( + // block, + // AppEngTextureRegistry.Blocks.BlockContainmentWallMerged.get() + // ); + // renderer.func_83018_a(block); + // renderer.func_78570_q(block, x, y, z); + // appEngRenderer.setOverrideBlockTexture(block, (Icon) null); + // renderer.field_78683_h = 0; + // renderer.field_78662_g = 0; + // renderer.field_78679_j = 0; + // renderer.field_78685_i = 0; + // return true; + // } + + // if (ZAxis) { + // renderer.field_78681_k = 1; + // renderer.field_78675_l = 1; + // block.func_71905_a(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F); + // appEngRenderer.setOverrideBlockTexture( + // block, + // AppEngTextureRegistry.Blocks.BlockContainmentWallMerged.get() + // ); + // renderer.func_83018_a(block); + // renderer.func_78570_q(block, x, y, z); + // appEngRenderer.setOverrideBlockTexture(block, (Icon) null); + // renderer.field_78681_k = 0; + // renderer.field_78675_l = 0; + // return true; + // } + // } + // } + + // return super.renderWorldBlock(world, x, y, z, block, modelId, renderer); + //} + + public void updateStatus(IAssemblerCluster _ac) { + this.ac = (AssemblerCluster) _ac; + if (!Platform.isClient()) { + this.markForUpdate(); + } + } + + public boolean isEnabled() { + if (Platform.isClient()) { + return this.complete; + } else { + return this.ac != null; + } + } + + public IInventory getInventory() { + if (this.ac == null) { + return null; + } else { + if (this.ac.inv == null) { + this.ac.inv = new WrapperChainedInventory( + this.ac.assemblers.toArray(new IInventory[0]) + ); + } + + return this.ac.inv; + } + } + + public int getSizeInventory() { + IInventory inv = this.getInventory(); + return inv == null ? 0 : inv.getSizeInventory(); + } + + public ItemStack getStackInSlot(int var1) { + IInventory inv = this.getInventory(); + return inv == null ? null : inv.getStackInSlot(var1); + } + + public ItemStack decrStackSize(int var1, int var2) { + IInventory inv = this.getInventory(); + return inv == null ? null : inv.decrStackSize(var1, var2); + } + + public ItemStack getStackInSlotOnClosing(int var1) { + return null; + } + + public void setInventorySlotContents(int var1, ItemStack var2) { + IInventory inv = this.getInventory(); + if (inv != null) { + inv.setInventorySlotContents(var1, var2); + } + } + + @Override + public String getInventoryName() { + return "ME Assembler Chamber"; + } + + @Override + public int getInventoryStackLimit() { + IInventory inv = this.getInventory(); + return inv == null ? 0 : inv.getInventoryStackLimit(); + } + + @Override + public void openInventory() {} + + @Override + public void closeInventory() {} + + @Override + public boolean hasCustomInventoryName() { + return true; + } + + @Override + public boolean isItemValidForSlot(int i, ItemStack itemstack) { + if (itemstack.getItem() instanceof ICraftingPatternItem) { + ICraftingPatternDetails pat + = ((ICraftingPatternItem) itemstack.getItem()) + .getPatternForItem(itemstack, this.worldObj); + + return pat != null; + } + return false; + } + + // TODO: WTF + //public void bulkUpdate(long inst, Player player) { + // if (this.ac != null && this.ac.inst != inst) { + // this.ac.inst = inst; + // this.sendUpdate(true, player); + // } + //} + + public boolean requiresTickingUpdates() { + return false; + } + + public void sendUpdate(boolean newState, EntityPlayer player) { + if (this.ac != null) { + NBTTagCompound tc = new NBTTagCompound(); + tc.setBoolean("formed", newState); + + // TODO: WTF + //try { + // Packet250CustomPayload p + // = (new PacketBulkMAC( + // Platform.createBulkUpdate(tc, this.ac.min, this.ac.max) + // )) + // .getPacket(); + // if (p != null) { + // if (player == null) { + // double var10002 = (double) this.field_70329_l; + // double var10003 = (double) this.field_70330_m; + // double var10004 = (double) this.field_70327_n; + // AppEng.getInstance().SideProxy.sendToAllNearExcept( + // (EntityPlayer) null, + // var10002, + // var10003, + // var10004, + // 512.0, + // this.field_70331_k, + // p + // ); + // } else { + // PacketDispatcher.sendPacketToPlayer(p, player); + // } + // } + //} catch (IOException var6) { + // var6.printStackTrace(); + //} + } + } + + public boolean isSeperated() { + return !this.isEnabled(); + } + + public boolean isUseableByPlayer(EntityPlayer entityplayer) { + return this.worldObj.getTileEntity(this.xCoord, this.yCoord, this.zCoord) != this + ? false + : entityplayer.getDistanceSq( + (double) this.xCoord + 0.5, + (double) this.yCoord + 0.5, + (double) this.zCoord + 0.5 + ) <= 32.0; + } + + @TileEvent(TileEventType.NETWORK_WRITE) + public boolean writeToStreamTileAssemblerMB(ByteBuf buf) { + buf.writeBoolean(this.ac != null); + return true; + } + + @TileEvent(TileEventType.NETWORK_READ) + public boolean readFromStreamTileAssemblerMB(ByteBuf buf) { + this.complete = buf.readBoolean(); + this.worldObj.markBlockRangeForRenderUpdate( + this.xCoord, this.yCoord, this.zCoord, this.xCoord, this.yCoord, this.zCoord + ); + System.out.println("ALEC: " + this.complete); + return true; + } + + @Override + public void getDrops(World w, int x, int y, int z, List drops) {} +} diff --git a/src/main/java/appeng/util/inv/WrapperChainedInventory.java b/src/main/java/appeng/util/inv/WrapperChainedInventory.java index 0ec6b783..3f18954c 100644 --- a/src/main/java/appeng/util/inv/WrapperChainedInventory.java +++ b/src/main/java/appeng/util/inv/WrapperChainedInventory.java @@ -37,7 +37,7 @@ public class WrapperChainedInventory implements IInventory { this.setInventory(inventories); } - private void setInventory(final IInventory... a) { + public void setInventory(final IInventory... a) { this.l = ImmutableList.copyOf(a); this.calculateSizes(); } @@ -66,7 +66,7 @@ public class WrapperChainedInventory implements IInventory { this.setInventory(inventories); } - private void setInventory(final List a) { + public void setInventory(final List a) { this.l = a; this.calculateSizes(); } diff --git a/src/main/resources/assets/appliedenergistics2/lang/en_US.lang b/src/main/resources/assets/appliedenergistics2/lang/en_US.lang index fdb07546..72252fbb 100644 --- a/src/main/resources/assets/appliedenergistics2/lang/en_US.lang +++ b/src/main/resources/assets/appliedenergistics2/lang/en_US.lang @@ -56,16 +56,23 @@ tile.appliedenergistics2.BlockCraftMonitor.name=ME Crafting Monitor tile.appliedenergistics2.BlockCraftTerminal.name=ME Crafting Terminal tile.appliedenergistics2.BlockLegacyController.name=ME Controller tile.appliedenergistics2.BlockPatternEncoder.name=Pattern Encoder -tile.appliedenergistics2.BlockStorageMonitor.name=Storage Monitor +tile.appliedenergistics2.BlockStorageMonitor.name=ME Storage Monitor tile.appliedenergistics2.BlockTerminal.name=ME Access Terminal tile.appliedenergistics2.BlockWirelessAccessPoint.name=Wireless Access Point item.appliedenergistics2.ItemMaterial.ConversionMatrix.name=Conversion Matrix +tile.appliedenergistics2.BlockAssembler.name=ME Assembler Pattern Provider +tile.appliedenergistics2.BlockAssemblerCraftingAccelerator.name=ME Assembler Crafting CPU +tile.appliedenergistics2.BlockAssemblerHeatVent.name=ME Assembler Heat Vent +tile.appliedenergistics2.BlockAssemblerWall.name=ME Assembler Containment Wall + # Legacy GUI gui.appliedenergistics2.PatternEncoder.clear=Clear gui.appliedenergistics2.PatternEncoder.encode=Encode gui.appliedenergistics2.PatternEncoder=Pattern Encoder +gui.appliedenergistics2.Assembler=ME Pattern Provider +gui.appliedenergistics2.MAC=ME Molecular Assembler Chamber # Stairs tile.appliedenergistics2.ChiseledQuartzStairBlock.name=Chiseled Certus Quartz Stairs @@ -211,6 +218,7 @@ gui.appliedenergistics2.SelectAmount=Select Amount gui.appliedenergistics2.CopyMode=Copy Mode gui.appliedenergistics2.CopyModeDesc=Controls if the contents of the configuration pane are cleared when you remove the cell. gui.appliedenergistics2.Next=Next +gui.appliedenergistics2.Prev=Prev gui.appliedenergistics2.Lumen=Lumen gui.appliedenergistics2.Empty=Empty gui.appliedenergistics2.Stored=Stored diff --git a/src/main/resources/assets/appliedenergistics2/recipes/legacy/assembler.recipe b/src/main/resources/assets/appliedenergistics2/recipes/legacy/assembler.recipe new file mode 100644 index 00000000..231f48c8 --- /dev/null +++ b/src/main/resources/assets/appliedenergistics2/recipes/legacy/assembler.recipe @@ -0,0 +1,23 @@ +shaped= + oredictionary:ingotIron oredictionary:craftingTableWood oredictionary:ingotIron, + ae2:ItemMaterial.ConversionMatrix ae2:ItemMaterial.EngProcessor ae2:ItemMaterial.ConversionMatrix, + oredictionary:ingotIron ae2:ItemMaterial.Cell1kPart oredictionary:ingotIron, + -> ae2:BlockAssembler + +shaped= + oredictionary:ingotIron certusCrystal oredictionary:ingotIron, + oredictionary:dustGlowstone ae2:ItemMaterial.EngProcessor oredictionary:dustGlowstone, + oredictionary:ingotIron certusCrystal oredictionary:ingotIron, + -> ae2:BlockAssemblerCraftingAccelerator + +shaped= + oredictionary:ingotIron mc:iron_bars oredictionary:ingotIron, + mc:iron_bars ae2:CableGlass.Fluix mc:iron_bars, + oredictionary:ingotIron mc:iron_bars oredictionary:ingotIron, + -> ae2:BlockAssemblerHeatVent + +shaped= + oredictionary:ingotIron oredictionary:ingotGold oredictionary:ingotIron, + oredictionary:ingotGold certusCrystal oredictionary:ingotGold, + oredictionary:ingotIron oredictionary:ingotGold oredictionary:ingotIron, + -> ae2:BlockAssemblerWall diff --git a/src/main/resources/assets/appliedenergistics2/recipes/legacy/index.recipe b/src/main/resources/assets/appliedenergistics2/recipes/legacy/index.recipe index e6f7e1a2..05a48af2 100644 --- a/src/main/resources/assets/appliedenergistics2/recipes/legacy/index.recipe +++ b/src/main/resources/assets/appliedenergistics2/recipes/legacy/index.recipe @@ -1,3 +1,5 @@ +import=legacy/assembler.recipe + shaped= oredictionary:ingotIron netherCrystal oredictionary:ingotIron, oreDictionary:dustFluix ae2:ItemMaterial.LogicProcessor oreDictionary:dustFluix, @@ -39,3 +41,9 @@ shaped= ae2:CableGlass.Fluix ae2:ItemMaterial.Wireless glass, oredictionary:ingotIron glass oredictionary:ingotIron, -> ae2:BlockWirelessAccessPoint + +shaped= + oredictionary:ingotIron ae2:ItemMaterial.ConversionMatrix oredictionary:ingotIron, + oredictionary:ingotIron oredictionary:craftingTableWood oredictionary:ingotIron, + oredictionary:ingotIron oredictionary:ingotIron oredictionary:ingotIron, + -> ae2:BlockPatternEncoder diff --git a/src/main/resources/assets/appliedenergistics2/textures/blocks/BlockAssembler.png b/src/main/resources/assets/appliedenergistics2/textures/blocks/BlockAssembler.png new file mode 100644 index 00000000..adff7537 Binary files /dev/null and b/src/main/resources/assets/appliedenergistics2/textures/blocks/BlockAssembler.png differ diff --git a/src/main/resources/assets/appliedenergistics2/textures/blocks/BlockAssemblerCraftingAccelerator.png b/src/main/resources/assets/appliedenergistics2/textures/blocks/BlockAssemblerCraftingAccelerator.png new file mode 100644 index 00000000..d1a6898a Binary files /dev/null and b/src/main/resources/assets/appliedenergistics2/textures/blocks/BlockAssemblerCraftingAccelerator.png differ diff --git a/src/main/resources/assets/appliedenergistics2/textures/blocks/BlockAssemblerHeatVent.png b/src/main/resources/assets/appliedenergistics2/textures/blocks/BlockAssemblerHeatVent.png new file mode 100644 index 00000000..7649f0bb Binary files /dev/null and b/src/main/resources/assets/appliedenergistics2/textures/blocks/BlockAssemblerHeatVent.png differ diff --git a/src/main/resources/assets/appliedenergistics2/textures/blocks/BlockAssemblerHeatVentMerged.png b/src/main/resources/assets/appliedenergistics2/textures/blocks/BlockAssemblerHeatVentMerged.png new file mode 100644 index 00000000..4fa42b94 Binary files /dev/null and b/src/main/resources/assets/appliedenergistics2/textures/blocks/BlockAssemblerHeatVentMerged.png differ diff --git a/src/main/resources/assets/appliedenergistics2/textures/blocks/BlockAssemblerWall.png b/src/main/resources/assets/appliedenergistics2/textures/blocks/BlockAssemblerWall.png new file mode 100644 index 00000000..fa4028eb Binary files /dev/null and b/src/main/resources/assets/appliedenergistics2/textures/blocks/BlockAssemblerWall.png differ diff --git a/src/main/resources/assets/appliedenergistics2/textures/blocks/BlockAssemblerWallMerged.png b/src/main/resources/assets/appliedenergistics2/textures/blocks/BlockAssemblerWallMerged.png new file mode 100644 index 00000000..2b297281 Binary files /dev/null and b/src/main/resources/assets/appliedenergistics2/textures/blocks/BlockAssemblerWallMerged.png differ diff --git a/src/main/resources/assets/appliedenergistics2/textures/guis/assembler.png b/src/main/resources/assets/appliedenergistics2/textures/guis/assembler.png new file mode 100644 index 00000000..41b54a61 Binary files /dev/null and b/src/main/resources/assets/appliedenergistics2/textures/guis/assembler.png differ diff --git a/src/main/resources/assets/appliedenergistics2/textures/guis/mulitiassembler.png b/src/main/resources/assets/appliedenergistics2/textures/guis/mulitiassembler.png new file mode 100644 index 00000000..58e65a04 Binary files /dev/null and b/src/main/resources/assets/appliedenergistics2/textures/guis/mulitiassembler.png differ