diff --git a/client/gui/implementations/GuiCraftConfirm.java b/client/gui/implementations/GuiCraftConfirm.java index 7cbe5492..b9be8dde 100644 --- a/client/gui/implementations/GuiCraftConfirm.java +++ b/client/gui/implementations/GuiCraftConfirm.java @@ -1,23 +1,64 @@ package appeng.client.gui.implementations; +import java.text.NumberFormat; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.LinkedList; +import java.util.List; + import net.minecraft.client.gui.GuiButton; import net.minecraft.entity.player.InventoryPlayer; +import net.minecraft.item.ItemStack; + +import org.lwjgl.opengl.GL11; + +import appeng.api.AEApi; import appeng.api.storage.ITerminalHost; +import appeng.api.storage.data.IAEItemStack; +import appeng.api.storage.data.IItemList; import appeng.client.gui.AEBaseGui; +import appeng.client.gui.widgets.GuiScrollbar; import appeng.container.implementations.ContainerCraftConfirm; import appeng.core.localization.GuiText; +import appeng.util.Platform; + +import com.google.common.base.Joiner; public class GuiCraftConfirm extends AEBaseGui { + int rows = 5; + + IItemList storage = AEApi.instance().storage().createItemList(); + IItemList pending = AEApi.instance().storage().createItemList(); + + List visual = new ArrayList(); + public GuiCraftConfirm(InventoryPlayer inventoryPlayer, ITerminalHost te) { super( new ContainerCraftConfirm( inventoryPlayer, te ) ); + xSize = 238; + ySize = 206; + myScrollBar = new GuiScrollbar(); } + GuiButton cancel; + GuiButton start; + GuiButton selectcpu; + @Override public void initGui() { super.initGui(); + + start = new GuiButton( 0, this.guiLeft + 162, this.guiTop + ySize - 25, 50, 20, GuiText.Start.getLocal() ); + buttonList.add( start ); + + selectcpu = new GuiButton( 0, this.guiLeft + (219 - 150) / 2, this.guiTop + ySize - 68, 150, 20, GuiText.CraftingCPU.getLocal() + ": " + + GuiText.Automatic ); + buttonList.add( selectcpu ); + + cancel = new GuiButton( 0, this.guiLeft + 6, this.guiTop + ySize - 25, 50, 20, GuiText.Cancel.getLocal() ); + buttonList.add( cancel ); } @Override @@ -26,21 +67,287 @@ public class GuiCraftConfirm extends AEBaseGui super.actionPerformed( btn ); } + private long getTotal(IAEItemStack is) + { + IAEItemStack a = storage.findPrecise( is ); + IAEItemStack c = pending.findPrecise( is ); + + long total = 0; + + if ( a != null ) + total += a.getStackSize(); + + if ( c != null ) + total += c.getStackSize(); + + return total; + } + + public void postUpdate(List list, byte ref) + { + switch (ref) + { + case 0: + for (IAEItemStack l : list) + handleInput( storage, l ); + break; + + case 1: + for (IAEItemStack l : list) + handleInput( pending, l ); + break; + } + + for (IAEItemStack l : list) + { + long amt = getTotal( l ); + + if ( amt <= 0 ) + deleteVisualStack( l ); + else + { + IAEItemStack is = findVisualStack( l ); + is.setStackSize( amt ); + } + } + + setScrollBar(); + } + + private void handleInput(IItemList s, IAEItemStack l) + { + IAEItemStack a = s.findPrecise( l ); + + if ( l.getStackSize() <= 0 ) + { + if ( a != null ) + a.reset(); + } + else + { + if ( a == null ) + { + s.add( l.copy() ); + a = s.findPrecise( l ); + } + + if ( a != null ) + a.setStackSize( l.getStackSize() ); + } + } + + private IAEItemStack findVisualStack(IAEItemStack l) + { + Iterator i = visual.iterator(); + while (i.hasNext()) + { + IAEItemStack o = i.next(); + if ( o.equals( l ) ) + return o; + } + + IAEItemStack stack = l.copy(); + visual.add( stack ); + return stack; + } + + private void deleteVisualStack(IAEItemStack l) + { + Iterator i = visual.iterator(); + while (i.hasNext()) + { + IAEItemStack o = i.next(); + if ( o.equals( l ) ) + { + i.remove(); + return; + } + } + } + + private void setScrollBar() + { + int size = visual.size(); + + myScrollBar.setTop( 19 ).setLeft( 218 ).setHeight( 114 ); + myScrollBar.setRange( 0, (size + 2) / 3 - rows, 1 ); + } + @Override public void drawBG(int offsetX, int offsetY, int mouseX, int mouseY) { + setScrollBar(); bindTexture( "guis/craftingreport.png" ); this.drawTexturedModalRect( offsetX, offsetY, 0, 0, xSize, ySize ); } - protected String getBackground() + int tooltip = -1; + + @Override + public void drawScreen(int mouse_x, int mouse_y, float btn) { - return "guis/craftingreport.png"; + int x = 0; + int y = 0; + + int gx = (width - xSize) / 2; + int gy = (height - ySize) / 2; + int yoff = 23; + + tooltip = -1; + + for (int z = 0; z <= 4 * 5; z++) + { + int minX = gx + 9 + x * 67; + int minY = gy + 22 + y * yoff; + + if ( minX < mouse_x && minX + 67 > mouse_x ) + { + if ( minY < mouse_y && minY + yoff - 2 > mouse_y ) + { + tooltip = z; + break; + } + + } + + x++; + + if ( x > 2 ) + { + y++; + x = 0; + } + } + + super.drawScreen( mouse_x, mouse_y, btn ); } @Override public void drawFG(int offsetX, int offsetY, int mouseX, int mouseY) { - fontRendererObj.drawString( GuiText.ConfirmCrafting.getLocal(), 8, 6, 4210752 ); + ContainerCraftConfirm c = (ContainerCraftConfirm) inventorySlots; + + long BytesUsed = c.bytesUsed; + String byteUsed = NumberFormat.getInstance().format( BytesUsed ); + String Add = BytesUsed > 0 ? (byteUsed + " " + GuiText.BytesUsed.getLocal()) : GuiText.CalculatingWait.getLocal(); + fontRendererObj.drawString( GuiText.CraftingPlan.getLocal() + " - " + Add, 8, 7, 4210752 ); + + String dsp = c.cpuBytesAvail > 0 ? (GuiText.Bytes.getLocal() + ": " + c.cpuBytesAvail + " : " + GuiText.CoProcessors.getLocal() + ": " + c.cpuCoProcessors) + : GuiText.Bytes.getLocal() + ": N/A : " + GuiText.CoProcessors.getLocal() + ": N/A"; + int offset = (219 - fontRendererObj.getStringWidth( dsp )) / 2; + fontRendererObj.drawString( dsp, offset, 165, 4210752 ); + + int sectionLength = 67; + + int x = 0; + int y = 0; + int xo = 0 + 9; + int yo = 0 + 22; + int viewStart = myScrollBar.getCurrentScroll() * 3; + int viewEnd = viewStart + 3 * rows; + + String dspToolTip = ""; + List lineList = new LinkedList(); + int toolPosX = 0; + int toolPosY = 0; + + int offY = 23; + + for (int z = viewStart; z < Math.min( viewEnd, visual.size() ); z++) + { + IAEItemStack refStack = visual.get( z );// repo.getRefrenceItem( z ); + if ( refStack != null ) + { + GL11.glPushMatrix(); + GL11.glScaled( 0.5, 0.5, 0.5 ); + + IAEItemStack stored = storage.findPrecise( refStack ); + IAEItemStack pendingStack = pending.findPrecise( refStack ); + + int lines = 0; + + if ( stored != null && stored.getStackSize() > 0 ) + lines++; + if ( pendingStack != null && pendingStack.getStackSize() > 0 ) + lines++; + + int negY = ((lines - 1) * 5) / 2; + int downY = 0; + + if ( stored != null && stored.getStackSize() > 0 ) + { + String str = Long.toString( stored.getStackSize() ); + if ( stored.getStackSize() >= 10000 ) + str = Long.toString( stored.getStackSize() / 1000 ) + "k"; + if ( stored.getStackSize() >= 10000000 ) + str = Long.toString( stored.getStackSize() / 1000000 ) + "m"; + + str = GuiText.FromStorage.getLocal() + ": " + str; + int w = 4 + fontRendererObj.getStringWidth( str ); + fontRendererObj.drawString( str, (int) ((x * (1 + sectionLength) + xo + sectionLength - 19 - ((float) w * 0.5)) * 2), (int) ((y * offY + yo + + 6 - negY + downY) * 2), 4210752 ); + + if ( tooltip == z - viewStart ) + lineList.add( GuiText.FromStorage.getLocal() + ": " + Long.toString( stored.getStackSize() ) ); + + downY += 5; + } + + if ( pendingStack != null && pendingStack.getStackSize() > 0 ) + { + String str = Long.toString( pendingStack.getStackSize() ); + if ( pendingStack.getStackSize() >= 10000 ) + str = Long.toString( pendingStack.getStackSize() / 1000 ) + "k"; + if ( pendingStack.getStackSize() >= 10000000 ) + str = Long.toString( pendingStack.getStackSize() / 1000000 ) + "m"; + + str = GuiText.ToCraft.getLocal() + ": " + str; + int w = 4 + fontRendererObj.getStringWidth( str ); + fontRendererObj.drawString( str, (int) ((x * (1 + sectionLength) + xo + sectionLength - 19 - ((float) w * 0.5)) * 2), (int) ((y * offY + yo + + 6 - negY + downY) * 2), 4210752 ); + + if ( tooltip == z - viewStart ) + lineList.add( GuiText.ToCraft.getLocal() + ": " + Long.toString( pendingStack.getStackSize() ) ); + + } + + GL11.glPopMatrix(); + int posX = x * (1 + sectionLength) + xo + sectionLength - 19; + int posY = y * offY + yo; + + ItemStack is = refStack.copy().getItemStack(); + + if ( tooltip == z - viewStart ) + { + dspToolTip = Platform.getItemDisplayName( is ); + + if ( lineList.size() > 0 ) + dspToolTip = dspToolTip + "\n" + Joiner.on( "\n" ).join( lineList ); + + toolPosX = x * (1 + sectionLength) + xo + sectionLength - 8; + toolPosY = y * offY + yo; + } + + drawItem( posX, posY, is ); + + x++; + + if ( x > 2 ) + { + y++; + x = 0; + } + } + + } + + if ( tooltip >= 0 && dspToolTip.length() > 0 ) + { + GL11.glPushAttrib( GL11.GL_ALL_ATTRIB_BITS ); + drawTooltip( toolPosX, toolPosY + 10, 0, dspToolTip ); + GL11.glPopAttrib(); + } + } + } diff --git a/client/gui/implementations/GuiCraftingCPU.java b/client/gui/implementations/GuiCraftingCPU.java index 5b78732b..2a918faf 100644 --- a/client/gui/implementations/GuiCraftingCPU.java +++ b/client/gui/implementations/GuiCraftingCPU.java @@ -187,9 +187,7 @@ public class GuiCraftingCPU extends AEBaseGui implements ISortSource private void setScrollBar() { - int size = 0; - for (IAEItemStack l : visual) - size++; + int size = visual.size(); myScrollBar.setTop( 19 ).setLeft( 218 ).setHeight( 137 ); myScrollBar.setRange( 0, (size + 2) / 3 - rows, 1 ); @@ -198,7 +196,6 @@ public class GuiCraftingCPU extends AEBaseGui implements ISortSource @Override public void drawBG(int offsetX, int offsetY, int mouseX, int mouseY) { - setScrollBar(); bindTexture( "guis/craftingcpu.png" ); this.drawTexturedModalRect( offsetX, offsetY, 0, 0, xSize, ySize ); } diff --git a/container/implementations/ContainerCraftConfirm.java b/container/implementations/ContainerCraftConfirm.java index 9c42ff42..5472d00b 100644 --- a/container/implementations/ContainerCraftConfirm.java +++ b/container/implementations/ContainerCraftConfirm.java @@ -1,23 +1,30 @@ package appeng.container.implementations; +import java.io.IOException; import java.util.concurrent.Future; import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.entity.player.InventoryPlayer; import net.minecraft.inventory.ICrafting; import net.minecraft.util.ChatComponentText; import net.minecraft.world.World; +import appeng.api.AEApi; import appeng.api.config.SecurityPermissions; import appeng.api.networking.IGrid; import appeng.api.networking.security.BaseActionSource; import appeng.api.networking.security.IActionHost; import appeng.api.networking.security.PlayerSource; import appeng.api.storage.ITerminalHost; +import appeng.api.storage.data.IAEItemStack; +import appeng.api.storage.data.IItemList; import appeng.container.AEBaseContainer; +import appeng.container.guisync.GuiSync; import appeng.core.AELog; +import appeng.core.sync.network.NetworkHandler; +import appeng.core.sync.packets.PacketMEInventoryUpdate; import appeng.crafting.CraftingJob; import appeng.crafting.ICraftingHost; -import appeng.me.cache.CraftingCache; public class ContainerCraftConfirm extends AEBaseContainer implements ICraftingHost { @@ -26,6 +33,15 @@ public class ContainerCraftConfirm extends AEBaseContainer implements ICraftingH public Future job; public CraftingJob result; + @GuiSync(0) + public long bytesUsed; + + @GuiSync(1) + public long cpuBytesAvail; + + @GuiSync(2) + public int cpuCoProcessors; + public ContainerCraftConfirm(InventoryPlayer ip, ITerminalHost te) { super( ip, te ); priHost = te; @@ -42,10 +58,51 @@ public class ContainerCraftConfirm extends AEBaseContainer implements ICraftingH result = job.get(); if ( !result.isSimulation() ) { - CraftingCache cc = getGrid().getCache( CraftingCache.class ); - cc.submitJob( result, null, getActionSrc() ); - AELog.info( "Job info is ready!" ); - this.isContainerValid = false; + try + { + PacketMEInventoryUpdate a = new PacketMEInventoryUpdate( (byte) 0 ); + PacketMEInventoryUpdate b = new PacketMEInventoryUpdate( (byte) 1 ); + + IItemList plan = AEApi.instance().storage().createItemList(); + result.tree.getPlan( plan ); + + bytesUsed = result.getByteTotal(); + + for (IAEItemStack out : plan) + { + IAEItemStack o = out.copy(); + o.reset(); + o.setStackSize( out.getStackSize() ); + + IAEItemStack p = out.copy(); + p.reset(); + p.setStackSize( out.getCountRequestable() ); + + if ( o.getStackSize() > 0 ) + a.appendItem( o ); + + if ( p.getStackSize() > 0 ) + b.appendItem( p ); + } + + for (Object g : this.crafters) + { + if ( g instanceof EntityPlayer ) + { + NetworkHandler.instance.sendTo( a, (EntityPlayerMP) g ); + NetworkHandler.instance.sendTo( b, (EntityPlayerMP) g ); + } + } + } + catch (IOException e) + { + // :P + } + + // CraftingCache cc = getGrid().getCache( CraftingCache.class ); + // cc.submitJob( result, null, getActionSrc() ); + // AELog.info( "Job info is ready!" ); + // this.isContainerValid = false; } } catch (Throwable e) diff --git a/core/localization/GuiText.java b/core/localization/GuiText.java index 366924e9..31874f5c 100644 --- a/core/localization/GuiText.java +++ b/core/localization/GuiText.java @@ -32,7 +32,7 @@ public enum GuiText OfSecondOutput, NoSecondOutput, RFTunnel, Stores, Next, SelectAmount, Lumen, Empty, ConfirmCrafting, - Stored, Crafting, Scheduled, CraftingStatus, Cancel; + Stored, Crafting, Scheduled, CraftingStatus, Cancel, FromStorage, ToCraft, CraftingPlan, CalculatingWait, Start, Bytes, CraftingCPU, Automatic, CoProcessors; String root; diff --git a/core/sync/packets/PacketMEInventoryUpdate.java b/core/sync/packets/PacketMEInventoryUpdate.java index 07c2d2f3..435fc3dc 100644 --- a/core/sync/packets/PacketMEInventoryUpdate.java +++ b/core/sync/packets/PacketMEInventoryUpdate.java @@ -16,6 +16,7 @@ import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiScreen; import net.minecraft.entity.player.EntityPlayer; import appeng.api.storage.data.IAEItemStack; +import appeng.client.gui.implementations.GuiCraftConfirm; import appeng.client.gui.implementations.GuiCraftingCPU; import appeng.client.gui.implementations.GuiMEMonitorable; import appeng.client.gui.implementations.GuiNetworkStatus; @@ -89,6 +90,9 @@ public class PacketMEInventoryUpdate extends AppEngPacket { GuiScreen gs = Minecraft.getMinecraft().currentScreen; + if ( gs instanceof GuiCraftConfirm ) + ((GuiCraftConfirm) gs).postUpdate( list, ref ); + if ( gs instanceof GuiCraftingCPU ) ((GuiCraftingCPU) gs).postUpdate( list, ref ); diff --git a/crafting/CraftingTreeNode.java b/crafting/CraftingTreeNode.java index 668e48bd..8d200e74 100644 --- a/crafting/CraftingTreeNode.java +++ b/crafting/CraftingTreeNode.java @@ -228,4 +228,13 @@ public class CraftingTreeNode for (CraftingTreeProcess pro : nodes) pro.setJob( storage, craftingCPUCluster, src ); } + + public void getPlan(IItemList plan) + { + for (IAEItemStack i : used) + plan.add( i.copy() ); + + for (CraftingTreeProcess pro : nodes) + pro.getPlan( plan ); + } } diff --git a/crafting/CraftingTreeProcess.java b/crafting/CraftingTreeProcess.java index 26b9f3d4..2b6a39f5 100644 --- a/crafting/CraftingTreeProcess.java +++ b/crafting/CraftingTreeProcess.java @@ -13,6 +13,7 @@ import appeng.api.config.Actionable; import appeng.api.networking.crafting.ICraftingPatternDetails; import appeng.api.networking.security.BaseActionSource; import appeng.api.storage.data.IAEItemStack; +import appeng.api.storage.data.IItemList; import appeng.container.ContainerNull; import appeng.me.cache.CraftingCache; import appeng.me.cluster.implementations.CraftingCPUCluster; @@ -202,4 +203,17 @@ public class CraftingTreeProcess for (CraftingTreeNode pro : nodes.keySet()) pro.setJob( storage, craftingCPUCluster, src ); } + + public void getPlan(IItemList plan) + { + for (IAEItemStack i : details.getOutputs()) + { + i = i.copy(); + i.setCountRequestable( i.getStackSize() * crafts ); + plan.addRequestable( i ); + } + + for (CraftingTreeNode pro : nodes.keySet()) + pro.getPlan( plan ); + } } diff --git a/me/cluster/implementations/CraftingCPUCluster.java b/me/cluster/implementations/CraftingCPUCluster.java index b218613c..56475fde 100644 --- a/me/cluster/implementations/CraftingCPUCluster.java +++ b/me/cluster/implementations/CraftingCPUCluster.java @@ -301,14 +301,6 @@ public class CraftingCPUCluster implements IAECluster, IBaseMonitor tp : tasks.entrySet()) - o += tp.getValue().value * tp.getKey().getCondencedOutputs()[0].getStackSize(); - return o; - } - private boolean canCraft(ICraftingPatternDetails details, IAEItemStack[] condencedInputs) { for (IAEItemStack g : condencedInputs)