MC Fabric 1.20.1 学习笔记 —— 制作一个独立配方的工作台 04 InputInventory

78 阅读1分钟

合成台有输入输出两部分,都是可存放物品的格子,这里介绍WorkBlockInputInventory,主要是实现了RecipeInputInventory接口。

public class WorkBlockInputInventory implements RecipeInputInventory, EasyInventory {
    // 来自EasyInventory
    private final DefaultedList<ItemStack> stacks;
    // 来自RecipeInputInventory
    private final int width;
    // 来自RecipeInputInventory
    private final int height;
    // 其实就是WorkBlockScreenHandler
    private final ScreenHandler handler;

    public WorkBlockInputInventory(ScreenHandler handler, int width, int height){
        this(DefaultedList.ofSize(width*height, ItemStack.EMPTY), width, height, handler);
    }

    public WorkBlockInputInventory(DefaultedList<ItemStack> stacks, int width, int height, ScreenHandler handler) {
        this.stacks = stacks;
        this.width = width;
        this.height = height;
        this.handler = handler;
    }

    @Override
    public int getWidth() {
        return width;
    }

    @Override
    public int getHeight() {
        return height;
    }

    @Override
    public List<ItemStack> getInputStacks() {
        return List.copyOf(this.stacks);
    }

    // 供fabric调用,通过将所有物品顺序以未附魔状态加入合成搜索器,以达到搜索对应合成表产物的目的
    @Override
    public void provideRecipeInputs(RecipeMatcher finder) {
        for (ItemStack itemStack : this.stacks) {
            finder.addUnenchantedInput(itemStack);
        }
    }

    @Override
    public DefaultedList<ItemStack> getItems() {
        return stacks;
    }

    // 从本栏中移除物品时主动触发合成搜索
    @Override
    public ItemStack removeStack(int slot, int amount) {
        ItemStack itemStack = Inventories.splitStack(this.stacks, slot, amount);
        if (!itemStack.isEmpty()) {
            this.handler.onContentChanged(this);
        }
        return itemStack;
    }

    // 保险起见把这个方法也给覆盖添加触发
    @Override
    public ItemStack removeStack(int slot) {
        ItemStack itemStack = Inventories.removeStack(this.stacks, slot);
        if(!itemStack.isEmpty()) {
            this.handler.onContentChanged(this);
        }
        return itemStack;
    }

    // 从本栏中添加物品时主动触发合成搜索
    @Override
    public void setStack(int slot, ItemStack stack) {
        this.stacks.set(slot, stack);
        this.handler.onContentChanged(this);
    }
}