合成台有输入输出两部分,都是可存放物品的格子,这里介绍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);
}
}