b8e685b1b6
* Fixes #3040: Cache recipe and revalidate it This caches the last used recipe instead of only the result. Which allows to revalidate the crafting grid against the recipe itself before hitting the CraftingManager again. Therefore avoiding a high performance hit for recipe lookups, just find the potential same recipe again. * Remove old recipe lookup as forge provides it now. * Further optimizations. These are a bit quick'n'dirty and need a better solution with a full container/gui refactoring. But for now they provide some great benefits in terms of performance.
140 lines
4.2 KiB
Java
140 lines
4.2 KiB
Java
/*
|
|
* This file is part of Applied Energistics 2.
|
|
* Copyright (c) 2013 - 2014, AlgorithmX2, All rights reserved.
|
|
*
|
|
* Applied Energistics 2 is free software: you can redistribute it and/or modify
|
|
* it under the terms of the GNU Lesser General Public License as published by
|
|
* the Free Software Foundation, either version 3 of the License, or
|
|
* (at your option) any later version.
|
|
*
|
|
* Applied Energistics 2 is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU Lesser General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU Lesser General Public License
|
|
* along with Applied Energistics 2. If not, see <http://www.gnu.org/licenses/lgpl>.
|
|
*/
|
|
|
|
package appeng.container.implementations;
|
|
|
|
|
|
import net.minecraft.entity.player.InventoryPlayer;
|
|
import net.minecraft.inventory.IInventory;
|
|
import net.minecraft.inventory.InventoryCrafting;
|
|
import net.minecraft.item.ItemStack;
|
|
import net.minecraft.item.crafting.CraftingManager;
|
|
import net.minecraft.item.crafting.IRecipe;
|
|
import net.minecraftforge.items.IItemHandler;
|
|
import net.minecraftforge.items.wrapper.PlayerInvWrapper;
|
|
|
|
import appeng.api.storage.ITerminalHost;
|
|
import appeng.container.ContainerNull;
|
|
import appeng.container.slot.SlotCraftingMatrix;
|
|
import appeng.container.slot.SlotCraftingTerm;
|
|
import appeng.helpers.IContainerCraftingPacket;
|
|
import appeng.parts.reporting.PartCraftingTerminal;
|
|
import appeng.tile.inventory.AppEngInternalInventory;
|
|
import appeng.util.inv.IAEAppEngInventory;
|
|
import appeng.util.inv.InvOperation;
|
|
import appeng.util.inv.WrapperInvItemHandler;
|
|
|
|
|
|
public class ContainerCraftingTerm extends ContainerMEMonitorable implements IAEAppEngInventory, IContainerCraftingPacket
|
|
{
|
|
|
|
private final PartCraftingTerminal ct;
|
|
private final AppEngInternalInventory output = new AppEngInternalInventory( this, 1 );
|
|
private final SlotCraftingMatrix[] craftingSlots = new SlotCraftingMatrix[9];
|
|
private final SlotCraftingTerm outputSlot;
|
|
private IRecipe currentRecipe;
|
|
|
|
public ContainerCraftingTerm( final InventoryPlayer ip, final ITerminalHost monitorable )
|
|
{
|
|
super( ip, monitorable, false );
|
|
this.ct = (PartCraftingTerminal) monitorable;
|
|
|
|
final IItemHandler crafting = this.ct.getInventoryByName( "crafting" );
|
|
|
|
for( int y = 0; y < 3; y++ )
|
|
{
|
|
for( int x = 0; x < 3; x++ )
|
|
{
|
|
this.addSlotToContainer( this.craftingSlots[x + y * 3] = new SlotCraftingMatrix( this, crafting, x + y * 3, 37 + x * 18, -72 + y * 18 ) );
|
|
}
|
|
}
|
|
|
|
this.addSlotToContainer( this.outputSlot = new SlotCraftingTerm( this.getPlayerInv().player, this.getActionSource(), this
|
|
.getPowerSource(), monitorable, crafting, crafting, this.output, 131, -72 + 18, this ) );
|
|
|
|
this.bindPlayerInventory( ip, 0, 0 );
|
|
|
|
this.onCraftMatrixChanged( new WrapperInvItemHandler( crafting ) );
|
|
}
|
|
|
|
/**
|
|
* Callback for when the crafting matrix is changed.
|
|
*/
|
|
|
|
@Override
|
|
public void onCraftMatrixChanged( IInventory inventory )
|
|
{
|
|
final ContainerNull cn = new ContainerNull();
|
|
final InventoryCrafting ic = new InventoryCrafting( cn, 3, 3 );
|
|
|
|
for( int x = 0; x < 9; x++ )
|
|
{
|
|
ic.setInventorySlotContents( x, this.craftingSlots[x].getStack() );
|
|
}
|
|
|
|
if( this.currentRecipe == null || !this.currentRecipe.matches( ic, this.getPlayerInv().player.world ) )
|
|
{
|
|
this.currentRecipe = CraftingManager.findMatchingRecipe( ic, this.getPlayerInv().player.world );
|
|
}
|
|
|
|
if( this.currentRecipe == null )
|
|
{
|
|
this.outputSlot.putStack( ItemStack.EMPTY );
|
|
}
|
|
else
|
|
{
|
|
final ItemStack craftingResult = this.currentRecipe.getCraftingResult( ic );
|
|
|
|
this.outputSlot.putStack( craftingResult );
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public void saveChanges()
|
|
{
|
|
|
|
}
|
|
|
|
@Override
|
|
public void onChangeInventory( final IItemHandler inv, final int slot, final InvOperation mc, final ItemStack removedStack, final ItemStack newStack )
|
|
{
|
|
|
|
}
|
|
|
|
@Override
|
|
public IItemHandler getInventoryByName( final String name )
|
|
{
|
|
if( name.equals( "player" ) )
|
|
{
|
|
return new PlayerInvWrapper( this.getInventoryPlayer() );
|
|
}
|
|
return this.ct.getInventoryByName( name );
|
|
}
|
|
|
|
@Override
|
|
public boolean useRealItems()
|
|
{
|
|
return true;
|
|
}
|
|
|
|
public IRecipe getCurrentRecipe()
|
|
{
|
|
return this.currentRecipe;
|
|
}
|
|
}
|