/* * 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.util.item; import java.io.IOException; import io.netty.buffer.ByteBuf; import appeng.api.storage.data.IAEStack; public abstract class AEStack<StackType extends IAEStack> implements IAEStack<StackType> { private boolean isCraftable; private long stackSize; private long countRequestable; static long getPacketValue( final byte type, final ByteBuf tag ) { if( type == 0 ) { long l = tag.readByte(); l -= Byte.MIN_VALUE; return l; } else if( type == 1 ) { long l = tag.readShort(); l -= Short.MIN_VALUE; return l; } else if( type == 2 ) { long l = tag.readInt(); l -= Integer.MIN_VALUE; return l; } return tag.readLong(); } @Override public long getStackSize() { return this.stackSize; } @Override public StackType setStackSize( final long ss ) { this.stackSize = ss; return (StackType) this; } @Override public long getCountRequestable() { return this.countRequestable; } @Override public StackType setCountRequestable( final long countRequestable ) { this.countRequestable = countRequestable; return (StackType) this; } @Override public boolean isCraftable() { return this.isCraftable; } @Override public StackType setCraftable( final boolean isCraftable ) { this.isCraftable = isCraftable; return (StackType) this; } @Override public StackType reset() { this.stackSize = 0; // priority = Integer.MIN_VALUE; this.setCountRequestable( 0 ); this.setCraftable( false ); return (StackType) this; } @Override public boolean isMeaningful() { return this.stackSize != 0 || this.countRequestable > 0 || this.isCraftable; } @Override public void incStackSize( final long i ) { this.stackSize += i; } @Override public void decStackSize( final long i ) { this.stackSize -= i; } @Override public void incCountRequestable( final long i ) { this.countRequestable += i; } @Override public void decCountRequestable( final long i ) { this.countRequestable -= i; } @Override public void writeToPacket( final ByteBuf i ) throws IOException { final byte mask = (byte) ( this.getType( 0 ) | ( this.getType( this.stackSize ) << 2 ) | ( this.getType( this.countRequestable ) << 4 ) | ( (byte) ( this.isCraftable ? 1 : 0 ) << 6 ) | ( this.hasTagCompound() ? 1 : 0 ) << 7 ); i.writeByte( mask ); this.writeIdentity( i ); this.readNBT( i ); // putPacketValue( i, priority ); this.putPacketValue( i, this.stackSize ); this.putPacketValue( i, this.countRequestable ); } private byte getType( final long num ) { if( num <= 255 ) { return 0; } else if( num <= 65535 ) { return 1; } else if( num <= 4294967295L ) { return 2; } else { return 3; } } abstract boolean hasTagCompound(); abstract void writeIdentity( ByteBuf i ) throws IOException; abstract void readNBT( ByteBuf i ) throws IOException; private void putPacketValue( final ByteBuf tag, final long num ) { if( num <= 255 ) { tag.writeByte( (byte) ( num + Byte.MIN_VALUE ) ); } else if( num <= 65535 ) { tag.writeShort( (short) ( num + Short.MIN_VALUE ) ); } else if( num <= 4294967295L ) { tag.writeInt( (int) ( num + Integer.MIN_VALUE ) ); } else { tag.writeLong( num ); } } }