Package xk.xact.inventory

Source Code of xk.xact.inventory.JointInventory

package xk.xact.inventory;

import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.inventory.IInventory;
import net.minecraft.item.ItemStack;

/**
* Used to access multiple inventories as if they were one.
*
* @author Xhamolk_
*/
public class JointInventory implements IInventory {

  private String name;
  private IInventory[] inventories;
  private int[] inventorySizes;
  private final int totalSize;

  /**
   * Creates a new JointInventory.
   * <p/>
   * The order of the arguments matter.
   *
   * @param name the name for this compound inventory.
   * @param inventories all the inventories that will take part of this inventory.
   */
  public JointInventory(String name, IInventory... inventories) {
    this.name = name;
    this.inventories = inventories;
    this.inventorySizes = new int[inventories.length];
    int sum = 0;
    for( int i = 0; i < inventories.length; i++ ) {
      if( inventories[i] != null ) {
        inventorySizes[i] = inventories[i].getSizeInventory();
        sum += inventorySizes[i];
      } else {
        inventorySizes[i] = 0;
      }
    }
    this.totalSize = sum;
  }

  private int findIndex(int index) {
    if( index < 0 || index >= totalSize )
      return -1;

    int i = 0; // array index
    int sum = 0; // sum of slots.
    for( int s : inventorySizes ) {
      if( sum + s > index )
        return i;
      sum += s;
      i++;
    }
    return -1;
  }

  private IInventory getInventoryFromIndex(int index) {
    int find = findIndex( index );
    if( find == -1 ) {
      return null;
    } else {
      return inventories[find];
    }
  }

  private int getSlotFromIndex(int index) {
    int find = findIndex( index );
    if( find == -1 )
      return -1;

    int sum = 0;
    for( int i = 0; i < find; i++ ) {
      sum += inventorySizes[i];
    }
    return index - sum;
  }

  private boolean validIndex(int index) {
    return index >= 0 && index < totalSize;
  }

  @Override
  public int getSizeInventory() {
    return totalSize;
  }

  @Override
  public ItemStack getStackInSlot(int i) {
    if( !validIndex( i ))
      return null;
    IInventory inv = getInventoryFromIndex( i );
    int slot = getSlotFromIndex( i );
    return inv.getStackInSlot( slot );
  }

  @Override
  public ItemStack decrStackSize(int i, int j) {
    if( !validIndex( i ))
      return null;
    IInventory inv = getInventoryFromIndex( i );
    int slot = getSlotFromIndex( i );
    return inv.decrStackSize( slot, j );
  }

  @Override
  public ItemStack getStackInSlotOnClosing(int i) {
    if( !validIndex( i ))
      return null;
    IInventory inv = getInventoryFromIndex( i );
    int slot = getSlotFromIndex( i );
    return inv.getStackInSlotOnClosing( slot );
  }

  @Override
  public void setInventorySlotContents(int i, ItemStack itemstack) {
    if( !validIndex( i ))
      return;
    IInventory inv = getInventoryFromIndex( i );
    int slot = getSlotFromIndex( i );
    inv.setInventorySlotContents( slot, itemstack );
  }

  @Override
  public String getInvName() {
    return name;
  }

  @Override
  public boolean isInvNameLocalized() {
    return false;
  }

  @Override
  public int getInventoryStackLimit() {
    return 64;
  }

  @Override
  public void onInventoryChanged() {
    for(IInventory inv : inventories) {
      inv.onInventoryChanged();
    }
  }

  @Override
  public boolean isUseableByPlayer(EntityPlayer entityplayer) {
    return true;
  }

  @Override
  public void openChest() { }

  @Override
  public void closeChest() { }

  @Override
  public boolean isItemValidForSlot(int i, ItemStack itemstack) {
    if( !validIndex( i ))
      return false;
    IInventory inv = getInventoryFromIndex( i );
    int slot = getSlotFromIndex( i );
    return inv.isItemValidForSlot( slot, itemstack );
  }

}
TOP

Related Classes of xk.xact.inventory.JointInventory

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.