/* * This file is part of Applied Energistics 2. * Copyright (c) 2017, tyra314, 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 . */ package appeng.helpers; import appeng.util.Platform; import net.minecraft.item.ItemStack; import net.minecraft.nbt.CompoundNBT; import net.minecraft.nbt.ListNBT; import net.minecraft.util.text.ITextComponent; import net.minecraft.util.text.StringTextComponent; import net.minecraft.util.text.TextFormatting; import java.util.ArrayList; import java.util.List; public class InvalidPatternHelper { private final List outputs = new ArrayList<>(); private final List inputs = new ArrayList<>(); private final boolean isCrafting; private final boolean canSubstitute; public InvalidPatternHelper( final ItemStack is ) { final CompoundNBT encodedValue = is.getTag(); if( encodedValue == null ) { throw new IllegalArgumentException( "No pattern here!" ); } final ListNBT inTag = encodedValue.getList( "in", 10 ); final ListNBT outTag = encodedValue.getList( "out", 10 ); this.isCrafting = encodedValue.getBoolean( "crafting" ); this.canSubstitute = this.isCrafting && encodedValue.getBoolean( "substitute" ); for( int i = 0; i < outTag.size(); i++ ) { this.outputs.add( new PatternIngredient( outTag.getCompound( i ) ) ); } for( int i = 0; i < inTag.size(); i++ ) { CompoundNBT in = inTag.getCompound( i ); // skip empty slots in the crafting grid if( in.isEmpty() ) { continue; } this.inputs.add( new PatternIngredient( in ) ); } } public List getOutputs() { return this.outputs; } public List getInputs() { return this.inputs; } public boolean isCraftable() { return this.isCrafting; } public boolean canSubstitute() { return this.canSubstitute; } public class PatternIngredient { private String id; private int count; private int damage; private ItemStack stack; public PatternIngredient( CompoundNBT tag ) { this.stack = ItemStack.read( tag ); if( this.stack.isEmpty() ) { this.id = tag.getString( "id" ); this.count = tag.getByte( "Count" ); this.damage = Math.max( 0, tag.getShort( "Damage" ) ); } } public boolean isValid() { return !this.stack.isEmpty(); } public ITextComponent getName() { return this.isValid() ? Platform.getItemDisplayName( this.stack ) : new StringTextComponent(this.id + '@' + this.getDamage()); } public int getDamage() { return this.isValid() ? this.stack.getDamage() : this.damage; } public int getCount() { return this.isValid() ? this.stack.getCount() : this.count; } public ItemStack getItem() { if( !this.isValid() ) { throw new IllegalArgumentException( "There is no valid ItemStack for this PatternIngredient" ); } return this.stack; } public ITextComponent getFormattedToolTip() { ITextComponent result = new StringTextComponent( this.getCount() + " " ).appendSibling( this.getName() ); if( !this.isValid() ) { result.applyTextStyle(TextFormatting.RED); } return result; } } }