236 lines
5.8 KiB
Java
236 lines
5.8 KiB
Java
package net.minecraft.server;
|
|
|
|
import com.google.common.collect.Lists;
|
|
import java.util.Iterator;
|
|
import java.util.List;
|
|
import javax.annotation.Nullable;
|
|
|
|
// CraftBukkit start
|
|
import java.util.List;
|
|
import org.bukkit.Location;
|
|
import org.bukkit.craftbukkit.entity.CraftHumanEntity;
|
|
import org.bukkit.entity.HumanEntity;
|
|
// CraftBukkit end
|
|
|
|
public class InventorySubcontainer implements IInventory, AutoRecipeOutput {
|
|
|
|
private final IChatBaseComponent a;
|
|
private final int b;
|
|
public final NonNullList<ItemStack> items;
|
|
private List<IInventoryListener> d;
|
|
private IChatBaseComponent e;
|
|
|
|
// CraftBukkit start - add fields and methods
|
|
public List<HumanEntity> transaction = new java.util.ArrayList<HumanEntity>();
|
|
private int maxStack = MAX_STACK;
|
|
protected org.bukkit.inventory.InventoryHolder bukkitOwner;
|
|
|
|
public List<ItemStack> getContents() {
|
|
return this.items;
|
|
}
|
|
|
|
public void onOpen(CraftHumanEntity who) {
|
|
transaction.add(who);
|
|
}
|
|
|
|
public void onClose(CraftHumanEntity who) {
|
|
transaction.remove(who);
|
|
}
|
|
|
|
public List<HumanEntity> getViewers() {
|
|
return transaction;
|
|
}
|
|
|
|
public void setMaxStackSize(int i) {
|
|
maxStack = i;
|
|
}
|
|
|
|
public org.bukkit.inventory.InventoryHolder getOwner() {
|
|
return bukkitOwner;
|
|
}
|
|
|
|
@Override
|
|
public Location getLocation() {
|
|
return null;
|
|
}
|
|
|
|
public InventorySubcontainer(IChatBaseComponent ichatbasecomponent, int i) {
|
|
this(ichatbasecomponent, i, null);
|
|
}
|
|
|
|
public InventorySubcontainer(IChatBaseComponent ichatbasecomponent, int i, org.bukkit.inventory.InventoryHolder owner) {
|
|
this.bukkitOwner = owner;
|
|
// CraftBukkit end
|
|
this.a = ichatbasecomponent;
|
|
this.b = i;
|
|
this.items = NonNullList.a(i, ItemStack.a);
|
|
}
|
|
|
|
public void a(IInventoryListener iinventorylistener) {
|
|
if (this.d == null) {
|
|
this.d = Lists.newArrayList();
|
|
}
|
|
|
|
this.d.add(iinventorylistener);
|
|
}
|
|
|
|
public void b(IInventoryListener iinventorylistener) {
|
|
this.d.remove(iinventorylistener);
|
|
}
|
|
|
|
public ItemStack getItem(int i) {
|
|
return i >= 0 && i < this.items.size() ? (ItemStack) this.items.get(i) : ItemStack.a;
|
|
}
|
|
|
|
public ItemStack splitStack(int i, int j) {
|
|
ItemStack itemstack = ContainerUtil.a(this.items, i, j);
|
|
|
|
if (!itemstack.isEmpty()) {
|
|
this.update();
|
|
}
|
|
|
|
return itemstack;
|
|
}
|
|
|
|
public ItemStack a(ItemStack itemstack) {
|
|
ItemStack itemstack1 = itemstack.cloneItemStack();
|
|
|
|
for (int i = 0; i < this.b; ++i) {
|
|
ItemStack itemstack2 = this.getItem(i);
|
|
|
|
if (itemstack2.isEmpty()) {
|
|
this.setItem(i, itemstack1);
|
|
this.update();
|
|
return ItemStack.a;
|
|
}
|
|
|
|
if (ItemStack.c(itemstack2, itemstack1)) {
|
|
int j = Math.min(this.getMaxStackSize(), itemstack2.getMaxStackSize());
|
|
int k = Math.min(itemstack1.getCount(), j - itemstack2.getCount());
|
|
|
|
if (k > 0) {
|
|
itemstack2.add(k);
|
|
itemstack1.subtract(k);
|
|
if (itemstack1.isEmpty()) {
|
|
this.update();
|
|
return ItemStack.a;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
if (itemstack1.getCount() != itemstack.getCount()) {
|
|
this.update();
|
|
}
|
|
|
|
return itemstack1;
|
|
}
|
|
|
|
public ItemStack splitWithoutUpdate(int i) {
|
|
ItemStack itemstack = (ItemStack) this.items.get(i);
|
|
|
|
if (itemstack.isEmpty()) {
|
|
return ItemStack.a;
|
|
} else {
|
|
this.items.set(i, ItemStack.a);
|
|
return itemstack;
|
|
}
|
|
}
|
|
|
|
public void setItem(int i, ItemStack itemstack) {
|
|
this.items.set(i, itemstack);
|
|
if (!itemstack.isEmpty() && itemstack.getCount() > this.getMaxStackSize()) {
|
|
itemstack.setCount(this.getMaxStackSize());
|
|
}
|
|
|
|
this.update();
|
|
}
|
|
|
|
public int getSize() {
|
|
return this.b;
|
|
}
|
|
|
|
public boolean P_() {
|
|
Iterator iterator = this.items.iterator();
|
|
|
|
ItemStack itemstack;
|
|
|
|
do {
|
|
if (!iterator.hasNext()) {
|
|
return true;
|
|
}
|
|
|
|
itemstack = (ItemStack) iterator.next();
|
|
} while (itemstack.isEmpty());
|
|
|
|
return false;
|
|
}
|
|
|
|
public IChatBaseComponent getDisplayName() {
|
|
return this.e != null ? this.e : this.a;
|
|
}
|
|
|
|
@Nullable
|
|
public IChatBaseComponent getCustomName() {
|
|
return this.e;
|
|
}
|
|
|
|
public boolean hasCustomName() {
|
|
return this.e != null;
|
|
}
|
|
|
|
public void a(@Nullable IChatBaseComponent ichatbasecomponent) {
|
|
this.e = ichatbasecomponent;
|
|
}
|
|
|
|
public int getMaxStackSize() {
|
|
return 64;
|
|
}
|
|
|
|
public void update() {
|
|
if (this.d != null) {
|
|
for (int i = 0; i < this.d.size(); ++i) {
|
|
((IInventoryListener) this.d.get(i)).a(this);
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
public boolean a(EntityHuman entityhuman) {
|
|
return true;
|
|
}
|
|
|
|
public void startOpen(EntityHuman entityhuman) {}
|
|
|
|
public void closeContainer(EntityHuman entityhuman) {}
|
|
|
|
public boolean b(int i, ItemStack itemstack) {
|
|
return true;
|
|
}
|
|
|
|
public int getProperty(int i) {
|
|
return 0;
|
|
}
|
|
|
|
public void setProperty(int i, int j) {}
|
|
|
|
public int h() {
|
|
return 0;
|
|
}
|
|
|
|
public void clear() {
|
|
this.items.clear();
|
|
}
|
|
|
|
public void a(AutoRecipeStackManager autorecipestackmanager) {
|
|
Iterator iterator = this.items.iterator();
|
|
|
|
while (iterator.hasNext()) {
|
|
ItemStack itemstack = (ItemStack) iterator.next();
|
|
|
|
autorecipestackmanager.b(itemstack);
|
|
}
|
|
|
|
}
|
|
}
|