200 lines
6.9 KiB
Java

package com.hbm.inventory.container;
import com.hbm.inventory.inv.InventoryLeadBox;
import com.hbm.items.ModItems;
import com.hbm.items.tool.ItemLeadBox;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.entity.player.InventoryPlayer;
import net.minecraft.inventory.Container;
import net.minecraft.inventory.IInventory;
import net.minecraft.inventory.Slot;
import net.minecraft.item.ItemStack;
public class ContainerLeadBox extends Container {
/**
* The Item Inventory for this Container, only needed if you want to
* reference isUseableByPlayer
*/
public final InventoryLeadBox inventory;
/**
* Using these will make transferStackInSlot easier to understand and
* implement INV_START is the index of the first slot in the Player's
* Inventory, so our InventoryItem's number of slots (e.g. 5 slots is array
* indices 0-4, so start at 5) Notice how we don't have to remember how many
* slots we made? We can just use InventoryItem.INV_SIZE and if we ever
* change it, the Container updates automatically.
*/
private static final int INV_START = InventoryLeadBox.INV_SIZE, INV_END = INV_START + 26,
HOTBAR_START = INV_END + 1, HOTBAR_END = HOTBAR_START + 8;
// If you're planning to add armor slots, put those first like this:
// ARMOR_START = InventoryItem.INV_SIZE, ARMOR_END = ARMOR_START+3,
// INV_START = ARMOR_END+1, and then carry on like above.
public ContainerLeadBox(EntityPlayer par1Player, InventoryPlayer inventoryPlayer, InventoryLeadBox inventoryItem) {
this.inventory = inventoryItem;
int i;
// ITEM INVENTORY - you'll need to adjust the slot locations to match
// your texture file
// I have them set vertically in columns of 4 to the right of the player
// model
for (i = 0; i < InventoryLeadBox.INV_SIZE; ++i) {
// You can make a custom Slot if you need different behavior,
// such as only certain item types can be put into this slot
// We made a custom slot to prevent our inventory-storing item
// from being stored within itself, but if you want to allow that
// and
// you followed my advice at the end of the above step, then you
// could get away with using the vanilla Slot class
this.addSlotToContainer(new Slot(this.inventory, i, 80 + (18 * (int) (i / 4)), 8 + (18 * (i % 4))));
}
// If you want, you can add ARMOR SLOTS here as well, but you need to
// make a public version of SlotArmor. I won't be doing that in this
// tutorial.
/*
* for (i = 0; i < 4; ++i) { // These are the standard positions for
* survival inventory layout this.addSlotToContainer(new
* SlotArmor(this.player, inventoryPlayer,
* inventoryPlayer.getSizeInventory() - 1 - i, 8, 8 + i * 18, i)); }
*/
// PLAYER INVENTORY - uses default locations for standard inventory
// texture file
for (i = 0; i < 3; ++i) {
for (int j = 0; j < 9; ++j) {
this.addSlotToContainer(new Slot(inventoryPlayer, j + i * 9 + 9, 8 + j * 18, 84 + i * 18));
}
}
// PLAYER ACTION BAR - uses default locations for standard action bar
// texture file
for (i = 0; i < 9; ++i) {
this.addSlotToContainer(new Slot(inventoryPlayer, i, 8 + i * 18, 142));
}
}
@Override
public boolean canInteractWith(EntityPlayer player) {
// be sure to return the inventory's isUseableByPlayer method
// if you defined special behavior there:
return inventory.isUseableByPlayer(player);
}
/**
* Called when a player shift-clicks on a slot. You must override this or
* you will crash when someone does that.
*/
public ItemStack transferStackInSlot(EntityPlayer player, int index) {
ItemStack itemstack = null;
Slot slot = (Slot) this.inventorySlots.get(index);
if (slot != null && slot.getHasStack()) {
ItemStack itemstack1 = slot.getStack();
itemstack = itemstack1.copy();
// If item is in our custom Inventory or armor slot
if (index < INV_START) {
// try to place in player inventory / action bar
if (!this.mergeItemStack(itemstack1, INV_START, HOTBAR_END + 1, true)) {
return null;
}
slot.onSlotChange(itemstack1, itemstack);
}
// Item is in inventory / hotbar, try to place in custom inventory
// or armor slots
else {
/*
* If your inventory only stores certain instances of Items, you
* can implement shift-clicking to your inventory like this:
*
* // Check that the item is the right type if
* (itemstack1.getItem() instanceof ItemCustom) { // Try to
* merge into your custom inventory slots // We use
* 'InventoryItem.INV_SIZE' instead of INV_START just in case //
* you also add armor or other custom slots if
* (!this.mergeItemStack(itemstack1, 0, InventoryItem.INV_SIZE,
* false)) { return null; } } // If you added armor slots, check
* them here as well: // Item being shift-clicked is armor - try
* to put in armor slot if (itemstack1.getItem() instanceof
* ItemArmor) { int type = ((ItemArmor)
* itemstack1.getItem()).armorType; if
* (!this.mergeItemStack(itemstack1, ARMOR_START + type,
* ARMOR_START + type + 1, false)) { return null; } } Otherwise,
* you have basically 2 choices: 1. shift-clicking between
* player inventory and custom inventory 2. shift-clicking
* between action bar and inventory
*
* Be sure to choose only ONE of the following
* implementations!!!
*/
/**
* Implementation number 1: Shift-click into your custom
* inventory
*/
if (index >= INV_START) {
// place in custom inventory
if (!this.mergeItemStack(itemstack1, 0, INV_START, false)) {
return null;
}
}
/**
* Implementation number 2: Shift-click items between action bar
* and inventory
*/
// item is in player's inventory, but not in action bar
if (index >= INV_START && index < HOTBAR_START) {
// place in action bar
if (!this.mergeItemStack(itemstack1, HOTBAR_START, HOTBAR_END + 1, false)) {
return null;
}
}
// item in action bar - place in player inventory
else if (index >= HOTBAR_START && index < HOTBAR_END + 1) {
if (!this.mergeItemStack(itemstack1, INV_START, INV_END + 1, false)) {
return null;
}
}
}
if (itemstack1.stackSize == 0) {
slot.putStack((ItemStack) null);
} else {
slot.onSlotChanged();
}
if (itemstack1.stackSize == itemstack.stackSize) {
return null;
}
slot.onPickupFromSlot(player, itemstack1);
}
return itemstack;
}
/**
* You should override this method to prevent the player from moving the
* stack that opened the inventory, otherwise if the player moves it, the
* inventory will not be able to save properly
*/
@Override
public ItemStack slotClick(int slot, int button, int flag, EntityPlayer player) {
// this will prevent the player from interacting with the item that
// opened the inventory:
if (slot >= 0 && getSlot(slot) != null && getSlot(slot).getStack() == player.getHeldItem()) {
return null;
}
return super.slotClick(slot, button, flag, player);
}
}