Applied-Energistics-2-tiler.../container/implementations/ContainerCraftConfirm.java

212 lines
4.9 KiB
Java
Raw Normal View History

package appeng.container.implementations;
2014-06-28 22:18:36 +02:00
import java.io.IOException;
import java.util.concurrent.Future;
import net.minecraft.entity.player.EntityPlayer;
2014-06-28 22:18:36 +02:00
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;
2014-06-28 22:18:36 +02:00
import appeng.api.AEApi;
2014-06-29 11:06:07 +02:00
import appeng.api.config.Actionable;
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;
2014-06-29 11:06:07 +02:00
import appeng.api.networking.storage.IStorageGrid;
import appeng.api.storage.IMEInventory;
import appeng.api.storage.ITerminalHost;
2014-06-28 22:18:36 +02:00
import appeng.api.storage.data.IAEItemStack;
import appeng.api.storage.data.IItemList;
import appeng.container.AEBaseContainer;
2014-06-28 22:18:36 +02:00
import appeng.container.guisync.GuiSync;
import appeng.core.AELog;
2014-06-28 22:18:36 +02:00
import appeng.core.sync.network.NetworkHandler;
import appeng.core.sync.packets.PacketMEInventoryUpdate;
import appeng.crafting.CraftingJob;
import appeng.crafting.ICraftingHost;
2014-06-29 11:06:07 +02:00
import appeng.me.cache.CraftingCache;
public class ContainerCraftConfirm extends AEBaseContainer implements ICraftingHost
{
ITerminalHost priHost;
public Future<CraftingJob> job;
public CraftingJob result;
2014-06-28 22:18:36 +02:00
@GuiSync(0)
public long bytesUsed;
@GuiSync(1)
public long cpuBytesAvail;
@GuiSync(2)
public int cpuCoProcessors;
2014-06-29 11:06:07 +02:00
@GuiSync(3)
public boolean autoStart = false;
@GuiSync(4)
public boolean simulation = true;
public ContainerCraftConfirm(InventoryPlayer ip, ITerminalHost te) {
super( ip, te );
priHost = te;
}
@Override
public void detectAndSendChanges()
{
super.detectAndSendChanges();
if ( job != null && job.isDone() )
{
try
{
result = job.get();
2014-06-29 11:06:07 +02:00
2014-06-22 09:00:38 +02:00
if ( !result.isSimulation() )
{
2014-06-29 11:06:07 +02:00
simulation = false;
if ( autoStart )
2014-06-28 22:18:36 +02:00
{
2014-06-29 11:06:07 +02:00
startJob();
return;
}
}
else
simulation = true;
2014-06-28 22:18:36 +02:00
2014-06-29 11:06:07 +02:00
try
{
PacketMEInventoryUpdate a = new PacketMEInventoryUpdate( (byte) 0 );
PacketMEInventoryUpdate b = new PacketMEInventoryUpdate( (byte) 1 );
PacketMEInventoryUpdate c = result.isSimulation() ? new PacketMEInventoryUpdate( (byte) 2 ) : null;
2014-06-28 22:18:36 +02:00
2014-06-29 11:06:07 +02:00
IItemList<IAEItemStack> plan = AEApi.instance().storage().createItemList();
result.tree.getPlan( plan );
2014-06-28 22:18:36 +02:00
2014-06-29 11:06:07 +02:00
bytesUsed = result.getByteTotal();
2014-06-28 22:18:36 +02:00
2014-06-29 11:06:07 +02:00
for (IAEItemStack out : plan)
{
IAEItemStack m = null;
2014-06-28 22:18:36 +02:00
2014-06-29 11:06:07 +02:00
IAEItemStack o = out.copy();
o.reset();
o.setStackSize( out.getStackSize() );
2014-06-28 22:18:36 +02:00
2014-06-29 11:06:07 +02:00
IAEItemStack p = out.copy();
p.reset();
p.setStackSize( out.getCountRequestable() );
IStorageGrid sg = getGrid().getCache( IStorageGrid.class );
IMEInventory<IAEItemStack> itemsg = sg.getItemInventory();
2014-06-28 22:18:36 +02:00
2014-06-29 11:06:07 +02:00
if ( c != null && result.isSimulation() )
2014-06-28 22:18:36 +02:00
{
2014-06-29 11:06:07 +02:00
m = o.copy();
o = itemsg.extractItems( o, Actionable.SIMULATE, mySrc );
if ( o == null )
2014-06-28 22:18:36 +02:00
{
2014-06-29 11:06:07 +02:00
o = m.copy();
o.setStackSize( 0 );
2014-06-28 22:18:36 +02:00
}
2014-06-29 11:06:07 +02:00
m.setStackSize( m.getStackSize() - o.getStackSize() );
2014-06-28 22:18:36 +02:00
}
2014-06-29 11:06:07 +02:00
if ( o.getStackSize() > 0 )
a.appendItem( o );
if ( p.getStackSize() > 0 )
b.appendItem( p );
if ( c != null && m != null && m.getStackSize() > 0 )
c.appendItem( m );
2014-06-28 22:18:36 +02:00
}
2014-06-29 11:06:07 +02:00
for (Object g : this.crafters)
2014-06-28 22:18:36 +02:00
{
2014-06-29 11:06:07 +02:00
if ( g instanceof EntityPlayer )
{
NetworkHandler.instance.sendTo( a, (EntityPlayerMP) g );
NetworkHandler.instance.sendTo( b, (EntityPlayerMP) g );
if ( c != null )
NetworkHandler.instance.sendTo( c, (EntityPlayerMP) g );
}
2014-06-28 22:18:36 +02:00
}
2014-06-29 11:06:07 +02:00
}
catch (IOException e)
{
// :P
2014-06-22 09:00:38 +02:00
}
}
catch (Throwable e)
{
getPlayerInv().player.addChatMessage( new ChatComponentText( "Error: " + e.toString() ) );
AELog.error( e );
this.isContainerValid = false;
result = null;
}
job = null;
}
verifyPermissions( SecurityPermissions.CRAFT, false );
}
2014-06-29 11:06:07 +02:00
public void startJob()
{
if ( result != null && simulation == false )
{
CraftingCache cc = getGrid().getCache( CraftingCache.class );
cc.submitJob( result, null, getActionSrc() );
this.isContainerValid = false;
}
}
@Override
public void onContainerClosed(EntityPlayer par1EntityPlayer)
{
super.onContainerClosed( par1EntityPlayer );
if ( job != null )
{
job.cancel( true );
job = null;
}
}
@Override
public void removeCraftingFromCrafters(ICrafting c)
{
super.removeCraftingFromCrafters( c );
if ( job != null )
{
job.cancel( true );
job = null;
}
}
@Override
public IGrid getGrid()
{
IActionHost h = ((IActionHost) this.getTarget());
return h.getActionableNode().getGrid();
}
public World getWorld()
{
return getPlayerInv().player.worldObj;
}
@Override
public BaseActionSource getActionSrc()
{
return new PlayerSource( getPlayerInv().player, (IActionHost) getTarget() );
}
}