Fix matter manager recipe finder creating item stacks with infinite cost
This commit is contained in:
parent
9efad96aff
commit
1c7abed6e9
@ -546,69 +546,76 @@ object MatterManager {
|
|||||||
}
|
}
|
||||||
|
|
||||||
stream.map {
|
stream.map {
|
||||||
val width: Int
|
// avoid reality snap when recipe has no output
|
||||||
val height: Int
|
val resultItem = it.getResultItem(server.registryAccess())
|
||||||
|
|
||||||
if (it is IShapedRecipe<*>) {
|
if (resultItem.isEmpty) {
|
||||||
width = it.recipeWidth
|
null
|
||||||
height = it.recipeHeight
|
|
||||||
} else {
|
} else {
|
||||||
width = it.ingredients.size
|
val width: Int
|
||||||
height = 1
|
val height: Int
|
||||||
}
|
|
||||||
|
|
||||||
val container = TransientCraftingContainer(object : AbstractContainerMenu(null, 0) {
|
if (it is IShapedRecipe<*>) {
|
||||||
override fun quickMoveStack(pPlayer: Player, pIndex: Int): ItemStack {
|
width = it.recipeWidth
|
||||||
return ItemStack.EMPTY
|
height = it.recipeHeight
|
||||||
|
} else {
|
||||||
|
width = it.ingredients.size
|
||||||
|
height = 1
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun stillValid(pPlayer: Player): Boolean {
|
val container = TransientCraftingContainer(object : AbstractContainerMenu(null, 0) {
|
||||||
return false
|
override fun quickMoveStack(pPlayer: Player, pIndex: Int): ItemStack {
|
||||||
}
|
return ItemStack.EMPTY
|
||||||
}, width, height)
|
|
||||||
|
|
||||||
val realIngredients = ArrayList<ArrayList<RecipeEntry>>()
|
|
||||||
|
|
||||||
for (c in it.ingredients.indices) {
|
|
||||||
if (it.ingredients[c].isActuallyEmpty) {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
for ((i, ingredient) in it.ingredients.withIndex()) {
|
|
||||||
if (i != c) {
|
|
||||||
container[i] = if (ingredient.isActuallyEmpty) ItemStack.EMPTY else ingredient.items.firstOrNull() ?: ItemStack.EMPTY
|
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
val result = ArrayList<RecipeEntry>()
|
override fun stillValid(pPlayer: Player): Boolean {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
}, width, height)
|
||||||
|
|
||||||
for (item in it.ingredients[c].items) {
|
val realIngredients = ArrayList<ArrayList<RecipeEntry>>()
|
||||||
container[c] = item
|
|
||||||
|
|
||||||
if (!it.assemble(container, server.registryAccess()).isEmpty) {
|
for (c in it.ingredients.indices) {
|
||||||
val residue = it.getRemainingItems(container)
|
if (it.ingredients[c].isActuallyEmpty) {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
val thisResidue = residue[c]
|
for ((i, ingredient) in it.ingredients.withIndex()) {
|
||||||
|
if (i != c) {
|
||||||
if (thisResidue.isEmpty) {
|
container[i] = if (ingredient.isActuallyEmpty) ItemStack.EMPTY else ingredient.items.firstOrNull() ?: ItemStack.EMPTY
|
||||||
result.add(RecipeEntry(item))
|
|
||||||
} else {
|
|
||||||
result.add(RecipeEntry(ImmutableStack(item), ImmutableStack(thisResidue)))
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
val result = ArrayList<RecipeEntry>()
|
||||||
|
|
||||||
|
for (item in it.ingredients[c].items) {
|
||||||
|
container[c] = item
|
||||||
|
|
||||||
|
if (!it.assemble(container, server.registryAccess()).isEmpty) {
|
||||||
|
val residue = it.getRemainingItems(container)
|
||||||
|
|
||||||
|
val thisResidue = residue[c]
|
||||||
|
|
||||||
|
if (thisResidue.isEmpty) {
|
||||||
|
result.add(RecipeEntry(item))
|
||||||
|
} else {
|
||||||
|
result.add(RecipeEntry(ImmutableStack(item), ImmutableStack(thisResidue)))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
realIngredients.add(result)
|
||||||
}
|
}
|
||||||
|
|
||||||
realIngredients.add(result)
|
ResolvedRecipe(
|
||||||
|
realIngredients.stream().map { it.stream() },
|
||||||
|
ImmutableStack(resultItem),
|
||||||
|
isCritical = isCritical,
|
||||||
|
name = it.id,
|
||||||
|
allowBacktrack = allowBacktrack
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
}.filterNotNull().filter {
|
||||||
ResolvedRecipe(
|
|
||||||
realIngredients.stream().map { it.stream() },
|
|
||||||
ImmutableStack(it.getResultItem(server.registryAccess())),
|
|
||||||
isCritical = isCritical,
|
|
||||||
name = it.id,
|
|
||||||
allowBacktrack = allowBacktrack
|
|
||||||
)
|
|
||||||
}.filter {
|
|
||||||
if (it.inputs.isEmpty()) {
|
if (it.inputs.isEmpty()) {
|
||||||
LOGGER.warn("${it.formattedName} with output '${it.output.item.registryName}' ended up with no inputs!")
|
LOGGER.warn("${it.formattedName} with output '${it.output.item.registryName}' ended up with no inputs!")
|
||||||
false
|
false
|
||||||
@ -1388,6 +1395,11 @@ object MatterManager {
|
|||||||
val item: Item,
|
val item: Item,
|
||||||
val multiplier: Double = 1.0
|
val multiplier: Double = 1.0
|
||||||
) {
|
) {
|
||||||
|
init {
|
||||||
|
require(!multiplier.isNaN()) { "Provided stack cost multiplier is NaN" }
|
||||||
|
require(!multiplier.isInfinite()) { "Provided stack cost multiplier is infinite" }
|
||||||
|
}
|
||||||
|
|
||||||
constructor(item: Item, count: Int) : this(item, 1.0 / count.toDouble())
|
constructor(item: Item, count: Int) : this(item, 1.0 / count.toDouble())
|
||||||
constructor(item: ItemStack) : this(item.item, item.count)
|
constructor(item: ItemStack) : this(item.item, item.count)
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user