package appeng.parts.reporting; import appeng.api.implementations.ICraftingPatternItem; import appeng.api.networking.crafting.ICraftingPatternDetails; import appeng.api.parts.IPartModel; import appeng.api.storage.data.IAEItemStack; import appeng.core.AppEng; import appeng.core.sync.GuiBridge; import appeng.helpers.Reflected; import appeng.items.parts.PartModels; import appeng.parts.PartModel; import appeng.tile.inventory.AppEngInternalInventory; import appeng.util.inv.InvOperation; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.ResourceLocation; import net.minecraftforge.items.IItemHandler; import java.util.List; import static appeng.helpers.PatternHelper.PROCESSING_INPUT_LIMIT; import static appeng.helpers.PatternHelper.PROCESSING_OUTPUT_LIMIT; public class PartExpandedProcessingPatternTerminal extends AbstractPartTerminal { @PartModels public static final ResourceLocation MODEL_OFF = new ResourceLocation( AppEng.MOD_ID, "part/expanded_processing_pattern_terminal_off" ); @PartModels public static final ResourceLocation MODEL_ON = new ResourceLocation( AppEng.MOD_ID, "part/expanded_processing_pattern_terminal_on" ); public static final IPartModel MODELS_OFF = new PartModel( MODEL_BASE, MODEL_OFF, MODEL_STATUS_OFF ); public static final IPartModel MODELS_ON = new PartModel( MODEL_BASE, MODEL_ON, MODEL_STATUS_ON ); public static final IPartModel MODELS_HAS_CHANNEL = new PartModel( MODEL_BASE, MODEL_ON, MODEL_STATUS_HAS_CHANNEL ); private final AppEngInternalInventory crafting = new AppEngInternalInventory( this, PROCESSING_INPUT_LIMIT ); private final AppEngInternalInventory output = new AppEngInternalInventory( this, PROCESSING_OUTPUT_LIMIT ); private final AppEngInternalInventory pattern = new AppEngInternalInventory( this, 2 ); @Reflected public PartExpandedProcessingPatternTerminal( final ItemStack is ) { super( is ); } @Override public void getDrops( final List drops, final boolean wrenched ) { for( final ItemStack is : this.pattern ) { if( !is.isEmpty() ) { drops.add( is ); } } } @Override public void readFromNBT( NBTTagCompound data ) { super.readFromNBT( data ); this.crafting.readFromNBT( data, "processingGrid" ); this.pattern.readFromNBT( data, "pattern" ); this.output.readFromNBT( data, "outputList" ); } @Override public void writeToNBT( NBTTagCompound data ) { super.writeToNBT( data ); this.crafting.writeToNBT( data, "processingGrid" ); this.pattern.writeToNBT( data, "pattern" ); this.output.writeToNBT( data, "outputList" ); } @Override public GuiBridge getGui( final EntityPlayer p ) { int x = (int) p.posX; int y = (int) p.posY; int z = (int) p.posZ; if( this.getHost().getTile() != null ) { x = this.getTile().getPos().getX(); y = this.getTile().getPos().getY(); z = this.getTile().getPos().getZ(); } if( GuiBridge.GUI_EXPANDED_PROCESSING_PATTERN_TERMINAL.hasPermissions( this.getHost().getTile(), x, y, z, this.getSide(), p ) ) { return GuiBridge.GUI_EXPANDED_PROCESSING_PATTERN_TERMINAL; } return GuiBridge.GUI_ME; } @Override public void onChangeInventory( final IItemHandler inv, final int slot, final InvOperation mc, final ItemStack removedStack, final ItemStack newStack ) { if( inv == this.pattern && slot == 1 ) { final ItemStack is = this.pattern.getStackInSlot( 1 ); if( !is.isEmpty() && is.getItem() instanceof ICraftingPatternItem ) { final ICraftingPatternItem pattern = (ICraftingPatternItem) is.getItem(); final ICraftingPatternDetails details = pattern.getPatternForItem( is, this.getHost().getTile().getWorld() ); if( details != null ) { for( int x = 0; x < this.crafting.getSlots() && x < details.getInputs().length; x++ ) { final IAEItemStack item = details.getInputs()[x]; this.crafting.setStackInSlot( x, item == null ? ItemStack.EMPTY : item.createItemStack() ); } for( int x = 0; x < this.output.getSlots() && x < details.getOutputs().length; x++ ) { final IAEItemStack item = details.getOutputs()[x]; this.output.setStackInSlot( x, item == null ? ItemStack.EMPTY : item.createItemStack() ); } } } } this.getHost().markForSave(); } @Override public IItemHandler getInventoryByName( final String name ) { if( name.equals( "crafting" ) ) { return this.crafting; } if( name.equals( "output" ) ) { return this.output; } if( name.equals( "pattern" ) ) { return this.pattern; } return super.getInventoryByName( name ); } @Override public IPartModel getStaticModels() { return this.selectModel( MODELS_OFF, MODELS_ON, MODELS_HAS_CHANNEL ); } }