SimpleContainer.java

net.minecraft.world.SimpleContainer

信息

  • 全限定名:net.minecraft.world.SimpleContainer
  • 类型:public class
  • 包:net.minecraft.world
  • 源码路径:src/main/java/net/minecraft/world/SimpleContainer.java
  • 起始行号:L14
  • 实现:Container, StackedContentsCompatible
  • 职责:

    TODO

字段/常量

  • size

    • 类型: int
    • 修饰符: private final
    • 源码定位: L15
    • 说明:

      TODO

  • items

    • 类型: NonNullList<ItemStack>
    • 修饰符: private final
    • 源码定位: L16
    • 说明:

      TODO

内部类/嵌套类型

构造器

public SimpleContainer(int size) @ L18

  • 构造器名:SimpleContainer
  • 源码定位:L18
  • 修饰符:public

参数:

  • size: int

说明:

TODO

public SimpleContainer(ItemStack... itemstacks) @ L23

  • 构造器名:SimpleContainer
  • 源码定位:L23
  • 修饰符:public

参数:

  • itemstacks: ItemStack…

说明:

TODO

方法

下面的方法块按源码顺序生成。

public ItemStack getItem(int slot) @ L28

  • 方法名:getItem
  • 源码定位:L28
  • 返回类型:ItemStack
  • 修饰符:public

参数:

  • slot: int

说明:

TODO

public List<ItemStack> removeAllItems() @ L33

  • 方法名:removeAllItems
  • 源码定位:L33
  • 返回类型:List
  • 修饰符:public

参数:

说明:

TODO

public ItemStack removeItem(int slot, int count) @ L39

  • 方法名:removeItem
  • 源码定位:L39
  • 返回类型:ItemStack
  • 修饰符:public

参数:

  • slot: int
  • count: int

说明:

TODO

public ItemStack removeItemType(Item itemType, int count) @ L49

  • 方法名:removeItemType
  • 源码定位:L49
  • 返回类型:ItemStack
  • 修饰符:public

参数:

  • itemType: Item
  • count: int

说明:

TODO

public ItemStack addItem(ItemStack itemStack) @ L71

  • 方法名:addItem
  • 源码定位:L71
  • 返回类型:ItemStack
  • 修饰符:public

参数:

  • itemStack: ItemStack

说明:

TODO

public boolean canAddItem(ItemStack itemStack) @ L86

  • 方法名:canAddItem
  • 源码定位:L86
  • 返回类型:boolean
  • 修饰符:public

参数:

  • itemStack: ItemStack

说明:

TODO

public ItemStack removeItemNoUpdate(int slot) @ L99

  • 方法名:removeItemNoUpdate
  • 源码定位:L99
  • 返回类型:ItemStack
  • 修饰符:public

参数:

  • slot: int

说明:

TODO

public void setItem(int slot, ItemStack itemStack) @ L110

  • 方法名:setItem
  • 源码定位:L110
  • 返回类型:void
  • 修饰符:public

参数:

  • slot: int
  • itemStack: ItemStack

说明:

TODO

public void setChanged() @ L117

  • 方法名:setChanged
  • 源码定位:L117
  • 返回类型:void
  • 修饰符:public

参数:

说明:

TODO

public int getContainerSize() @ L121

  • 方法名:getContainerSize
  • 源码定位:L121
  • 返回类型:int
  • 修饰符:public

参数:

说明:

TODO

public boolean isEmpty() @ L126

  • 方法名:isEmpty
  • 源码定位:L126
  • 返回类型:boolean
  • 修饰符:public

参数:

说明:

TODO

public boolean stillValid(Player player) @ L137

  • 方法名:stillValid
  • 源码定位:L137
  • 返回类型:boolean
  • 修饰符:public

参数:

  • player: Player

说明:

TODO

public void clearContent() @ L142

  • 方法名:clearContent
  • 源码定位:L142
  • 返回类型:void
  • 修饰符:public

参数:

说明:

TODO

public void fillStackedContents(StackedItemContents contents) @ L148

  • 方法名:fillStackedContents
  • 源码定位:L148
  • 返回类型:void
  • 修饰符:public

参数:

  • contents: StackedItemContents

说明:

TODO

public String toString() @ L155

  • 方法名:toString
  • 源码定位:L155
  • 返回类型:String
  • 修饰符:public

参数:

说明:

TODO

private void moveItemToEmptySlots(ItemStack sourceStack) @ L160

  • 方法名:moveItemToEmptySlots
  • 源码定位:L160
  • 返回类型:void
  • 修饰符:private

参数:

  • sourceStack: ItemStack

说明:

TODO

private void moveItemToOccupiedSlotsWithSameType(ItemStack sourceStack) @ L170

  • 方法名:moveItemToOccupiedSlotsWithSameType
  • 源码定位:L170
  • 返回类型:void
  • 修饰符:private

参数:

  • sourceStack: ItemStack

说明:

TODO

private void moveItemsBetweenStacks(ItemStack sourceStack, ItemStack targetStack) @ L182

  • 方法名:moveItemsBetweenStacks
  • 源码定位:L182
  • 返回类型:void
  • 修饰符:private

参数:

  • sourceStack: ItemStack
  • targetStack: ItemStack

说明:

TODO

public void fromItemList(ValueInput.TypedInputList<ItemStack> items) @ L192

  • 方法名:fromItemList
  • 源码定位:L192
  • 返回类型:void
  • 修饰符:public

参数:

  • items: ValueInput.TypedInputList

说明:

TODO

public void storeAsItemList(ValueOutput.TypedOutputList<ItemStack> output) @ L200

  • 方法名:storeAsItemList
  • 源码定位:L200
  • 返回类型:void
  • 修饰符:public

参数:

  • output: ValueOutput.TypedOutputList

说明:

TODO

public NonNullList<ItemStack> getItems() @ L209

  • 方法名:getItems
  • 源码定位:L209
  • 返回类型:NonNullList
  • 修饰符:public

参数:

说明:

TODO

代码

public class SimpleContainer implements Container, StackedContentsCompatible {
    private final int size;
    private final NonNullList<ItemStack> items;
 
    public SimpleContainer(int size) {
        this.size = size;
        this.items = NonNullList.withSize(size, ItemStack.EMPTY);
    }
 
    public SimpleContainer(ItemStack... itemstacks) {
        this.size = itemstacks.length;
        this.items = NonNullList.of(ItemStack.EMPTY, itemstacks);
    }
 
    @Override
    public ItemStack getItem(int slot) {
        return slot >= 0 && slot < this.items.size() ? this.items.get(slot) : ItemStack.EMPTY;
    }
 
    public List<ItemStack> removeAllItems() {
        List<ItemStack> itemsRemoved = this.items.stream().filter(item -> !item.isEmpty()).collect(Collectors.toList());
        this.clearContent();
        return itemsRemoved;
    }
 
    @Override
    public ItemStack removeItem(int slot, int count) {
        ItemStack result = ContainerHelper.removeItem(this.items, slot, count);
        if (!result.isEmpty()) {
            this.setChanged();
        }
 
        return result;
    }
 
    public ItemStack removeItemType(Item itemType, int count) {
        ItemStack removed = new ItemStack(itemType, 0);
 
        for (int slot = this.size - 1; slot >= 0; slot--) {
            ItemStack current = this.getItem(slot);
            if (current.getItem().equals(itemType)) {
                int stillNeeded = count - removed.getCount();
                ItemStack removedFromThisSlot = current.split(stillNeeded);
                removed.grow(removedFromThisSlot.getCount());
                if (removed.getCount() == count) {
                    break;
                }
            }
        }
 
        if (!removed.isEmpty()) {
            this.setChanged();
        }
 
        return removed;
    }
 
    public ItemStack addItem(ItemStack itemStack) {
        if (itemStack.isEmpty()) {
            return ItemStack.EMPTY;
        } else {
            ItemStack remainingItems = itemStack.copy();
            this.moveItemToOccupiedSlotsWithSameType(remainingItems);
            if (remainingItems.isEmpty()) {
                return ItemStack.EMPTY;
            } else {
                this.moveItemToEmptySlots(remainingItems);
                return remainingItems.isEmpty() ? ItemStack.EMPTY : remainingItems;
            }
        }
    }
 
    public boolean canAddItem(ItemStack itemStack) {
        boolean hasSpace = false;
 
        for (ItemStack targetStack : this.items) {
            if (targetStack.isEmpty() || ItemStack.isSameItemSameComponents(targetStack, itemStack) && targetStack.getCount() < targetStack.getMaxStackSize()) {
                hasSpace = true;
                break;
            }
        }
 
        return hasSpace;
    }
 
    @Override
    public ItemStack removeItemNoUpdate(int slot) {
        ItemStack itemStack = this.items.get(slot);
        if (itemStack.isEmpty()) {
            return ItemStack.EMPTY;
        } else {
            this.items.set(slot, ItemStack.EMPTY);
            return itemStack;
        }
    }
 
    @Override
    public void setItem(int slot, ItemStack itemStack) {
        this.items.set(slot, itemStack);
        itemStack.limitSize(this.getMaxStackSize(itemStack));
        this.setChanged();
    }
 
    @Override
    public void setChanged() {
    }
 
    @Override
    public int getContainerSize() {
        return this.size;
    }
 
    @Override
    public boolean isEmpty() {
        for (ItemStack itemStack : this.items) {
            if (!itemStack.isEmpty()) {
                return false;
            }
        }
 
        return true;
    }
 
    @Override
    public boolean stillValid(Player player) {
        return true;
    }
 
    @Override
    public void clearContent() {
        this.items.clear();
        this.setChanged();
    }
 
    @Override
    public void fillStackedContents(StackedItemContents contents) {
        for (ItemStack itemStack : this.items) {
            contents.accountStack(itemStack);
        }
    }
 
    @Override
    public String toString() {
        return this.items.stream().filter(item -> !item.isEmpty()).toList().toString();
    }
 
    private void moveItemToEmptySlots(ItemStack sourceStack) {
        for (int slot = 0; slot < this.size; slot++) {
            ItemStack targetStack = this.getItem(slot);
            if (targetStack.isEmpty()) {
                this.setItem(slot, sourceStack.copyAndClear());
                return;
            }
        }
    }
 
    private void moveItemToOccupiedSlotsWithSameType(ItemStack sourceStack) {
        for (int slot = 0; slot < this.size; slot++) {
            ItemStack targetStack = this.getItem(slot);
            if (ItemStack.isSameItemSameComponents(targetStack, sourceStack)) {
                this.moveItemsBetweenStacks(sourceStack, targetStack);
                if (sourceStack.isEmpty()) {
                    return;
                }
            }
        }
    }
 
    private void moveItemsBetweenStacks(ItemStack sourceStack, ItemStack targetStack) {
        int maxCount = this.getMaxStackSize(targetStack);
        int diff = Math.min(sourceStack.getCount(), maxCount - targetStack.getCount());
        if (diff > 0) {
            targetStack.grow(diff);
            sourceStack.shrink(diff);
            this.setChanged();
        }
    }
 
    public void fromItemList(ValueInput.TypedInputList<ItemStack> items) {
        this.clearContent();
 
        for (ItemStack stack : items) {
            this.addItem(stack);
        }
    }
 
    public void storeAsItemList(ValueOutput.TypedOutputList<ItemStack> output) {
        for (int i = 0; i < this.getContainerSize(); i++) {
            ItemStack itemStack = this.getItem(i);
            if (!itemStack.isEmpty()) {
                output.add(itemStack);
            }
        }
    }
 
    public NonNullList<ItemStack> getItems() {
        return this.items;
    }
}

引用的其他类