minecraft-src/net/minecraft/world/item/crafting/CraftingInput.java
2025-07-04 02:00:41 +03:00

145 lines
3.5 KiB
Java

package net.minecraft.world.item.crafting;
import java.util.ArrayList;
import java.util.List;
import net.minecraft.world.entity.player.StackedItemContents;
import net.minecraft.world.item.ItemStack;
public class CraftingInput implements RecipeInput {
public static final CraftingInput EMPTY = new CraftingInput(0, 0, List.of());
private final int width;
private final int height;
private final List<ItemStack> items;
private final StackedItemContents stackedContents = new StackedItemContents();
private final int ingredientCount;
private CraftingInput(int width, int height, List<ItemStack> item) {
this.width = width;
this.height = height;
this.items = item;
int i = 0;
for (ItemStack itemStack : item) {
if (!itemStack.isEmpty()) {
i++;
this.stackedContents.accountStack(itemStack, 1);
}
}
this.ingredientCount = i;
}
public static CraftingInput of(int width, int height, List<ItemStack> items) {
return ofPositioned(width, height, items).input();
}
public static CraftingInput.Positioned ofPositioned(int width, int height, List<ItemStack> items) {
if (width != 0 && height != 0) {
int i = width - 1;
int j = 0;
int k = height - 1;
int l = 0;
for (int m = 0; m < height; m++) {
boolean bl = true;
for (int n = 0; n < width; n++) {
ItemStack itemStack = (ItemStack)items.get(n + m * width);
if (!itemStack.isEmpty()) {
i = Math.min(i, n);
j = Math.max(j, n);
bl = false;
}
}
if (!bl) {
k = Math.min(k, m);
l = Math.max(l, m);
}
}
int m = j - i + 1;
int o = l - k + 1;
if (m <= 0 || o <= 0) {
return CraftingInput.Positioned.EMPTY;
} else if (m == width && o == height) {
return new CraftingInput.Positioned(new CraftingInput(width, height, items), i, k);
} else {
List<ItemStack> list = new ArrayList(m * o);
for (int p = 0; p < o; p++) {
for (int q = 0; q < m; q++) {
int r = q + i + (p + k) * width;
list.add((ItemStack)items.get(r));
}
}
return new CraftingInput.Positioned(new CraftingInput(m, o, list), i, k);
}
} else {
return CraftingInput.Positioned.EMPTY;
}
}
@Override
public ItemStack getItem(int index) {
return (ItemStack)this.items.get(index);
}
public ItemStack getItem(int row, int column) {
return (ItemStack)this.items.get(row + column * this.width);
}
@Override
public int size() {
return this.items.size();
}
@Override
public boolean isEmpty() {
return this.ingredientCount == 0;
}
public StackedItemContents stackedContents() {
return this.stackedContents;
}
public List<ItemStack> items() {
return this.items;
}
public int ingredientCount() {
return this.ingredientCount;
}
public int width() {
return this.width;
}
public int height() {
return this.height;
}
public boolean equals(Object object) {
if (object == this) {
return true;
} else {
return !(object instanceof CraftingInput craftingInput)
? false
: this.width == craftingInput.width
&& this.height == craftingInput.height
&& this.ingredientCount == craftingInput.ingredientCount
&& ItemStack.listMatches(this.items, craftingInput.items);
}
}
public int hashCode() {
int i = ItemStack.hashStackList(this.items);
i = 31 * i + this.width;
return 31 * i + this.height;
}
public record Positioned(CraftingInput input, int left, int top) {
public static final CraftingInput.Positioned EMPTY = new CraftingInput.Positioned(CraftingInput.EMPTY, 0, 0);
}
}